OmniAICreator/Qiita-1.07M huggingface dataset:
ATMega328pのSleepについて　Sleep中も出力は保持する

勘違いをしていたのでここに記録。

ATMega328PをSleepにした場合は、GPIOの出力が停止されるとなにかの
Webサイトで見たことがあったのでそう思っていたのだが、
実際には違っていた。

検証で使用したのは以下のプログラム
```c
#include <avr/sleep.h>  // スリープライブラリ

#define WAKEUP 2  // スリープからの起動ピン
#define LED 3     // LEDピン

void setup() {
  delay(1000);

  pinMode(WAKEUP, INPUT_PULLUP);
  pinMode(LED, OUTPUT);

  delay(100);

  digitalWrite(LED, HIGH);  // LED on
  delay(3000);
  digitalWrite(LED, LOW);  // LED off
}


void loop() {
  //ATmegaスリープに入る
  digitalWrite(LED, HIGH);  // LED on
  // delay(200);
  interruptWDT(7, true);  // 2s & 割り込みのスリープを設定

  //スリープから復帰
  digitalWrite(LED, LOW);  // LED off
  delay(2000);  //後から消す

}


//　外部入力割込みによる起動処理
void wakeUp() {
  //外部入力割込みの際に行いたい処理を記載
}

// WDTがタイムアップした時に実行される処理
ISR(WDT_vect) {
  //ウォッチドッグの際に行いたい処理を記載
}

// 割り込みスリープ処理
// t=スリープ時間
// flag： true = WDTも起動 false = 外部割り込みのみ起動
void interruptWDT(unsigned long t, bool flag) {
  Serial.flush();  // シリアルバッファが空になるまで待つ
  if (flag == true) {
    delayWDT_setup(t);  // ウォッチドッグタイマー割り込み条件設定
  }
  // ADCを停止（消費電流 147→27μA）
  ADCSRA &= ~(1 << ADEN);

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // パワーダウンモード指定
  attachInterrupt(0, wakeUp, LOW);      // Lowになった時にwakeUp関数起動
  sleep_enable();

  // BODを停止（消費電流 27→6.5μA）
  MCUCR |= (1 << BODSE) | (1 << BODS);            // MCUCRのBODSとBODSEに1をセット
  MCUCR = (MCUCR & ~(1 << BODSE)) | (1 << BODS);  // すぐに（4クロック以内）BODSSEを0, BODSを1に設定

  asm("sleep");  // 3クロック以内にスリープに入る sleep_mode();では間に合わなかった

  sleep_disable();        // 割り込みででここから動作再開
  ADCSRA |= (1 << ADEN);  // ADCの電源をON（BODはハードウエアで自動再開される）
  detachInterrupt(0);     //外部割込み停止
}

void delayWDT_setup(unsigned int ii) {  // ウォッチドッグタイマーをセット。
  // 引数はWDTCSRにセットするWDP0-WDP3の値。設定値と動作時間は概略下記
  // 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms
  // 6=1sec, 7=2sec, 8=4sec, 9=8sec
  byte bb;
  if (ii > 9) {  // 変な値を排除
    ii = 9;
  }
  bb = ii & 7;       // 下位3ビットをbbに
  if (ii > 7) {      // 7以上（7.8,9）なら
    bb |= (1 << 5);  // bbの5ビット目(WDP3)を1にする
  }
  bb |= (1 << WDCE);

  MCUSR &= ~(1 << WDRF);  // MCU Status Reg. Watchdog Reset Flag ->0
  // start timed sequence
  WDTCSR |= (1 << WDCE) | (1 << WDE);  // ウォッチドッグ変更許可（WDCEは4サイクルで自動リセット）
  // set new watchdog timeout value
  WDTCSR = bb;  // 制御レジスタを設定
  WDTCSR |= _BV(WDIE);
}
```

よく考えたら昔自分でもATMega328pでSleep中に出力していたのを
途中から思い出した・・・
J-GLOBALの検索結果をダウンロードしたBibTeXファイルをPhythonでcsvファイルに変換

J-GlobalはJSTが運営する日本の科学技術に関する文献、特許、研究者などの情報検索サービスです。
[J-Global](https://jglobal.jst.go.jp/)
日本の研究開発動向を調査・分析するために、J-Globalでの検索を使い始めました。
J-Globalは検索結果をBibTeXファイルでダウンロードすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481830/b2567992-86de-9496-803f-2f0985f2c5f5.png)

今回は、データサイエンスで扱い易いcsvファイルへ変換して保存するコードをPythonで作成しました。

## Pythonのプログラミング環境
Google Colaboratory

## Install
 bibtex ファイルを解析する python ライブラリのBibtexParserをinstallします。
 [BibtexParser](https://bibtexparser.readthedocs.io/en/main/index.html)
```python:install
!pip install --pre bibtexparser
```
## Import
```python:import
import bibtexparser
import pandas as pd
```

## 関数定義
```python: def bib_to_df
def bib_to_df(bib_file):
  library = bibtexparser.parse_file(bib_file)

  title_l = []
  note_l = []
  author_l = []
  journal_l = []
  year_l = []
  volume_l = []
  DOI_l = []

  for entry in library.entries:
    title_l.append(entry['title'])
    note_l.append(entry['note'])
    author_l.append(entry['author'])
    journal_l.append(entry['journal'])
    year_l.append(entry['year'])
    volume_l.append(entry['volume'])
    DOI_l.append(entry['DOI'])
  
  df = pd.DataFrame({
      'title': title_l,
      'note': note_l,
      'author': author_l,
      'journal': journal_l,
      'year': year_l,
      'volume': volume_l,
      'DOI': DOI_l
  })

  return df
```

## 関数を実行してcsvファイルに保存
```python:import
# file path
fname = 'ダウンロードしたファイル名を'　　
bib_file = 'input/' + fname + '.bib'
csv_file = 'output/' + fname + '.csv'

# 関数実行してデータフレームへ
df = bib_to_df(bib_file)
print(df.shape)
print(df.info())
display(df.head())

# csvファイルへ保存
df.to_csv(csv_file, index=False)
```
試しに、「大規模言語モデル」で検索した結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481830/7e29ce02-74d4-ec8e-76df-8a141a6f6a3f.png)
【トラブルシューティング】EC2のWebサーバにアクセスできなくなった

# 概要
昨日までアクセスできていた検証用EC2のWebサーバに、今朝突然アクセスできなくなりました。  
原因は直感的にわかってしまったのですが、せっかくなら段階的なアプローチでトラブルシューティングしてみようと思ったので、その記録を残します。

# 環境
## サーバ
マシン：Amazon EC2  
OS：Ubuntu 22.04  
WEBサーバ：Nginx  
ロードバランサ：設置していません。

## クライアント端末
WSL2 Ubuntu 22.04  
自宅にて操作しています。

# 症状
Webサーバに対してcurlを実行すると、`Connection timed out`となります。
昨日まではアクセスできていたにもかかわらず、です。
※IPは`xxx.xxx.xxx.xxx`とマスクしています。

```
$ curl -v xxx.xxx.xxx.xxx:80
*   Trying xxx.xxx.xxx.xxx:80...
* connect to xxx.xxx.xxx.xxx port 80 failed: Connection timed out
* Failed to connect to xxx.xxx.xxx.xxx port 80 after 133792 ms: Connection timed out
* Closing connection 0
curl: (28) Failed to connect to xxx.xxx.xxx.xxx port 80 after 133792 ms: Connection timed out
```
  


# 調査方針
OSI 低レイヤーから開始し、上位レイヤーへ順を追って調査していきます。  
[こちら](https://www.cisco.com/c/dam/global/ja_jp/assets/learning/downloads/cln/ccnp-tshoot-quickref-samchap.pdf)によると、`ボトムアップ方式`と呼ばれる手法になります。

# 調査開始  
EC2の低レイヤーはAWSによって管理されており操作ができないので、`AWS Health Dashboard`にて障害情報を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/3fa126a4-0a29-ab14-a7eb-de3ddc869ac8.png)


特に障害情報は出ていないので、L3レイヤーを調査します。  
クライアントからEC2のIPに対して疎通できるか確認します。
```
$ ping xxx.xxx.xxx.xxx
PING xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) 56(84) bytes of data.
^C
--- xxx.xxx.xxx.xxx ping statistics ---
10 packets transmitted, 0 received, 100% packet loss, time 9442ms
```
疎通できていないので、L3レイヤーの問題だとわかりました。
パケットがどこまで届いているかを確認するため、tracerouteを実行します。

```
$ sudo traceroute -q 1 -I xxx.xxx.xxx.xxx
結果省略
```

自宅の回線事情が表示されるので結果は省略しましたが、ISP機器まではパケットが到達していたため、クライアント側ではなくサーバ側の問題だとわかりました。
また、yahooのトップページに対してcurlを実行した結果、ステータスコード200が返ってくることからもサーバ側固有で発生している問題だとわかります。
```
$ curl -s https://www.yahoo.co.jp -o /dev/null -w '%{http_code}\n'
200
```

サーバのIPアドレス関連の設定が怪しい、ということでセキュリティグループのインバウンドルールを確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/34ba2cfd-f5e4-b42d-ce97-93787fe88e2d.png)


自宅のグローバルIPが現在許可されていますが、本当にそのIPで正しいのか確認してみます。  
`inet-ip.info`というWebサイトに対してcurlを実行すると(又はブラウザアクセスすると)グローバルIPが得られます。
```
$ curl inet-ip.info
```

得られたグローバルIPが昨日まで割り当てられたIPと異なっていました。  
IPを再設定したところ、無事Webサーバにアクセスできるようになりました。

# 所感
私はISPと固定IP契約を結んでいないので、動的にIPが変わる可能性があるのは知っていましたが、今までまったく変わったことが無かったです。  
本当に変わるんだなあということを実感しました。
また、IPが違うという基本的な原因だったものの、トラブルシューティング練習が出来て良かったです。

# 参考
https://www.cisco.com/c/dam/global/ja_jp/assets/learning/downloads/cln/ccnp-tshoot-quickref-samchap.pdf
Discordの認証済みBotにするための申請をしたお話

みなさんこんにちは！めちゃくちゃさぼっていました。すみません。
# 認証済みBotとは
認証済みbotとは、Discordのサーバー内にあるこのようなマークがついたBotのことです。
[![Image from Gyazo](https://i.gyazo.com/065c172ccfd944956314f83d338b170a.png)](https://gyazo.com/065c172ccfd944956314f83d338b170a)
↑このようなマークがついたBotですね。海外の有名なBot(MEE6やProbotなど)は基本ついています。
ではなぜついてるのでしょうか？
それは認証済みBotではないと、最大で100サーバーまでしかBotを導入できないからです。Botが75サーバー以上導入されると、Botのアプリケーションを作成したユーザーのDMにその旨が伝えられ、認証するための申請フォームのリンクが送られてきます。

# フォームについて
申請フォームについて、このくらいの質問があったと思います。
さらに、フォームは最初に本人確認をする必要があり、運転免許証やパスポート、マイナンバーカードが必要となります。
```
このbotなにするん？

どんな情報収集するん？

それはどんくらい保管するん？

保管した後はどのように処分するん？

暗号化はするん？

おまえのbot何のVPSで動いてるんや？

どうやって接続してるんや？

どんなセキュリティを課してるんや？

(どんな特権インテントが欲しいんや？)

(そのインテントはどのような目的や？)

(インテント使ってるとこの動画見せてみい？)

(インテントの中身はDiscordの外で保管してるん？)

(ユーザーはそのインテントの中身を削除する依頼できるよな？)
```

最後の三つは特殊で、Intentsを有効化する際に必要になる質問事項です。Intensに関しては、次の項目にて解説します。

# Intentsについて
Intentsは、Discord.pyを触った人ならだれもが見たことがあると思います。
```py:main.py
...
intents = discord.Intents.all()
bot = commands.Bot(intents=intents) # またはdiscord.Clientなど
```
この`intents`から始まる変数の中身が、インテントと呼ばれるものです。
インテントには通常のインテントと特権インテントがあり、特権インテントは以下の三つです。
- Presence Intents
- Server Members Intents
- Message Content Intents
これらはのインテントはDiscordのほうで厳重に規制がかけられており、このインテントを使いたくて100サーバー以上に導入したい場合は必ず申請をパスしなければいけません。

Presence Intents: これはゲートウェイのイベント関連のインテントです。正直私もあまり使わなかったので申請していません。
Server Members Intents: その名の通り、サーバー内にいるメンバーを取得したりするときに必要になるインテントです。これがないと`bot.get_user()`など、メンバーに関係するものはすべて`None`が返されてしまいます。
Message Content Intents: これもその名の通り、メッセージデータを取得する際に必要になります。特にスラッシュコマンドが非搭載のBotは基本的には`on_message()`で動いていると思いますが、このインテントがないとなんのメッセージも取得することができません。

# 注意事項
ここでは私が複数のBotに申請を出したときにやってはいけないことを言っておきます。ご参考にどうぞ。
- まず違法な処理を行うBotは申請に出しては絶対にいけません。バレた際に最悪ユーザーのアカウントごと停止されます。やめましょう。
- DiscordのToS(利用規約)に反するBotは、申請が下りないどころか永遠に申請ができなくなります。新しくBotアカウントを作り直す必要があります。例えば、音楽Botは申請時には別の機能を搭載しておきましょう。
- これはIntentsの話ですが、そのIntentsを必要とする機能が乏しい場合、たまにDiscord公式の申請が下りないことがあります。多少話は盛りましょう。(※あまりにも盛るのはおすすめしません)
- 申請をする際は、日本語ではなく英語で申請フォームを記入しましょう。精査するスタッフは必ずしも日本人とは限らないので、別のチームにたらいまわしにされたりなど、さらに時間がかかってしまいます。
- 申請が長いからって連続で何回も送らないようにしましょう。Discordには何回も申請していると順番待ちの最後尾に回されて余計に時間がかかってしまいます。数週間待っても来ないなら問い合わせかもう一回送ってみましょう。

# さいごに
余談ですが私のBotであるZeTNONはおかげさまで導入数が急速に伸びています。ありがとうございます。
今後も役に立つDiscord.py系の記事を書いていきますので、よろしくお願いします。
また、いいね・フォローくださるとやる気が100倍になります！(?)
【Vitest】failed to resolve import in '@/...'

## エラー
```
'failed to resolve import in '@/...'
```
Next.jsとVitestとReact Testing Libraryで構成されているプロジェクトでテストを実装したところ、上記のエラーが出ました。

## 背景
初めてVitestを触ったときにはまったエラーです。そもそもプロジェクトにVitestが入っていなかったことやテスト自体触るのも初めてだったため詰まりました。

## 解決策
``` vitest.config.ts
import { resolve } from 'node:path'

resolve: {
  alias: [{ find: '@', replacement: resolve(__dirname, './src') }]
}
```
Next.js上で定義されているエイリアス("@/...")はVitestでは読み込むことができないため、起きるエラーでした。そのため、Vitestがパスを理解できるようVitest上で'@'を'./src'ディレクトリにマッピングすることで解決できます。
GCP PCDOE合格記(2024/1/17投稿)

# はじめに
この度GCP認定のGoogle Cloud Certified - Professional Cloud DevOps Engineerを受験してきましたので、勉強した内容と受験した感想を書いておきます。

# 前提
* Google CloudはSkill Boostなどで少し触った程度
* AZ-900/AZ-104/AZ-700/AZ-305/AZ-204/DP-900/AZ-500/DP-203は取得済み
* AWS認定は全て取っています(詳細は[こちら](https://qiita.com/handy-dd18/items/d21d914bf1c475d777f2))
    * [SAP on AWS認定](https://qiita.com/handy-dd18/items/18e8a856906f97bbb964)も取ってます
* AWSの実務経験あり(一部Azureも)
* Google Cloud認定は7つ目になります。

# 学習内容
今回は以下の順番で勉強を進めました。

* ①[公式模擬問題](https://cloud.google.com/learn/certification/cloud-devops-engineer?hl=ja)
* ②練習問題([Udemy](https://www.udemy.com/share/109oVE3@wwkfkIAkQuzcHYRFYnHvsM8O-GXhIBnrpAZHrh6pfyisiM4lpdv29Fel-CGFJrt7/)

いつも通り問題を解いて、わからないところだけ公式のドキュメント等で学習する方法を取ったのですが、今回はその前にG-genさんの以下の記事を読んで、どのような内容が出題されるのかを事前に確認するようにしました。

https://blog.g-gen.co.jp/entry/professional-cloud-devops-engineer

<br>
上記リンクの特に以下の部分が参考になりました。
サービスの特徴やベストプラクティス、用語の意味などを事前に理解しておくことで、問題文を読んだときにスムーズに理解することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/981dab70-7bc9-1f01-5681-51a2f4f25e2e.png)

また、特に以下の用語は知っておかないと何を問われているか理解できなかったりするので、最低限SREについての理解と用語の知識は頭に入れておいた方が良いと思います。

>2 番はオライリーの SRE に関する有名な書籍です。これにより "SRE", "SLI/SLO", "トイル", "エラーバジェット", "ポストモーテム", "DevOps" といった SRE に関する基本的な考え方を把握することが重要です。これらが直接的に問題で問われることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/da2151de-af07-32cb-cc48-67ac88371fbe.png)


## 公式模擬問題
PCNE試験の時と同じように最初は公式の[模擬問題](https://cloud.google.com/learn/certification/cloud-devops-engineer?hl=ja)を解きました。

後述するUdemyに比べるとサービス寄りの知識が問われることが多く、個人的にはこちらの方が本試験に近い出題形式になっていると感じました。(当たり前かもしれませんが)

同一の問題は出ないのですが、どのような出題のされ方をするのかはわかるので、受験前に一度受けておいたほうが良いと思います。

## 練習問題
模擬問題のあとはUdemyで公開されている[練習問題](https://www.udemy.com/share/1094PY3@uIiphy6SNcb0bUnhYP7kXAanLOq6aeiO1zdWvn3p-DuI4gk4rf-UPYbsgJXLnoCx/)を購入して勉強しました。

55問×4セットあったのですが時間がなかったので、試験前日に1セットだけ解いて解説を読み込むまでしました。
Udemyで検索して出てきた評価が高いコースを選びましたが、SREについての問題が多い印象だったので、あまり本試験対策向きではないかもしれません。

ただ、問題を解くことでSREの考え方についての理解が深まったので、まったく意味がないというわけではなかったです。
もし時間があれば実施してみると良いと思います。


# 受験した感想
これまでのGoogleCloud試験と同じくまずは全問回答することを優先して、回答が不安な問題にはフラグつけて解いていきました。
とりあえず全問回答出来たらフラグが付いている問題を残り時間が5分前になるまで時間をかけて解きました。
50問中40問フラグが付いていたので、見直す時間も中々にかかりました。。

# 受験結果
無事合格でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d80546ea-2785-539b-0a1b-25262100457c.png)


# おわりに
PCNEの合格記の時は以下のように書いてたのですが、DevOpsが2023年8月に日本語試験対応してたらしいので、受験してみました。
これでホントに残すは英語試験(Database/Machine Learning)のみとなりました。
次はDatabaseを受ける予定です。

>Google Cloudの日本語試験は取り終わったので、残りはタイミング見て英語でチャレンジしてみようとは思いますが、英語力ゴミなので合格できる気はしません。。

この記事がどなたかの参考になれば幸いです。
【Rails】rubyXLで作成したエクセル出力機能を呼び出すとActionController::UnknownFormatが発生した時の対処法

#### エクセルファイル(.xlsx)を出力する機能をrubyXLを利用して作成したが、実行するとActionController::UnknownFormatが発生が発生する。

## 環境
rubyのバージョン
`ruby 2.7.2p137`
railsのバージョン
`Rails 6.0.3.4`
rubyXLのバージョン
`rubyXL (3.4.25)`

## 原因
原因はroutes.rbの設定でformatを指定していないことになる。
```routes.rb
get 'excel/generate', to: 'excel#generate', as: 'generate_excel'
```

xlsxのエクセルファイルを出力する場合は、
~~~ruby
get 'excel/generate', to: 'excel#generate', as: 'generate_excel', defaults: { format: :xlsx }
~~~
のように、
`defaults: { format: :xlsx }`
の箇所を追記するとエラーが解消される。
拡張子は出力したいファイル毎に変更してください。

初歩的なことかもしれませんが、自分の備忘録用と初学者の方々の参考になればと思います。
UnityアプリのGoogle Play Store登録

# アプリケーションのファイル形式
過去に`apk`、`obb`のようなファイル形式が使われていたが2024年現在、Google Play Storeでは`aab`しか受け付けないことになっている。

デフォルトでは`apk`形式でビルドされるが、`Player Settings > Android > Build App Bundle(Google Play)`
にチェックを入れることで`aab`形式でビルドすることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268835/3026632b-901b-cc43-7c75-a0702d6f0a48.png)


# アプリケーションのサイズ
Google Play Storeではアプリケーションのサイズが150Mb以内である必要がある。

動画や画像などを使う場合はすぐに150Mbを超えてしまうが、[Addressables](https://docs.unity3d.com/2023.3/Documentation/Manual/com.unity.addressables.html)と[Play Asset Delivery](https://docs.unity3d.com/2023.3/Documentation/Manual/play-asset-delivery.html)という機能を使用することでこの制限を回避することができる。

# Split Application Binary
`Player Settings > Android > Publishing Settings`の`Split Application Binary`にチェックを入れる。こうすることで`abb`ファイルの中で`base`モジュールと`asset pack`モジュールに分割されるようになる。このうち`base`モジュールは150MbであればGoogle Play Storeにアップロードすることができる。

# [Addressables](https://docs.unity3d.com/Packages/com.unity.addressables@2.0/manual/index.html)

## インストール
`Addressables`は`Window > Package Manager`の`Unity Registry`から`インストールすることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268835/27c57b10-7b3d-65a2-35d1-337cee674005.png)

シーンごとインスペクタービューで`Addressable`にチェックを入れ、コードから後述のように`AssetReference`を使うことで、そのシーン内で使用しているファイルを`base`から除外することができる。

ビルド時に出力される`aab`ファイルのサイズが実際は150Mbを超えているが、`base`モジュールのサイズが150Mb以内であればGoogle Play Storeにアップロードすることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268835/18918cec-1946-30a1-5629-c95311ef64ef.png)

## 使用例

### シーンのロード

```csharp
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceProviders;

public AssetReference scene; // ロードするシーンをインスペクタービューで設定する
private AsyncOperationHandle<SceneInstance> sceneLoadHandle;

void loadScene()
{
    sceneLoadHandle = scene.LoadSceneAsync(UnityEngine.SceneManagement.LoadSceneMode.Single, false);
}
```

# [Play Asset Delivery](https://docs.unity3d.com/Packages/com.unity.play.assetdelivery@1.0/manual/index.html)

# リリース方式
`内部テスト`、`クローズドテスト`、`オープンテスト`、`製品版`の4つのリリース方式がある。

今回のプロジェクトは規模が小さいため、まず`内部テスト`で検証し確認後、`製品版`でリリースすることにした。

`製品版`へ移行する際には再度アップロードする必要はなく、`リリースをプロモート`という機能で`内部テスト`から`製品版`へエスカレーションすることができる。

# 参考

いろいろ書きましたが、`Play Asset Delivery`について、こちらの記事により詳しく書いてありましたので、おすすめします。

[Addressables × Play Asset Deliveryの調査メモ](https://qiita.com/mad_khaki/items/69d836bc7bfbb146b81a)
Homebrewのpyenvでinstallできない問題

## はじめに
### 想定読者
Pythonの仮想環境を作ろうとしてMacの`pyenv install x.x.x`でインストールしようとしたけどうまくいかない人

- PC
	- MacBook Air (M1, 2020)
- OS
	- MacOS Sonoma 14.2.1

## 状況
Djangoでアプリを作ろうと思って、pyenv + venvで仮想環境で環境構築をしようとして、
```:zsh
$ pyenv install 3.11.3
```
とすると、
```:出力結果
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
```
という感じで固まってしまっていました。
もともとpyenvは依存パッケージが多いらしく、`brew`で以下のパッケージはすでにインストールしてはいたのですが…。
```:zsh
$ brew install openssl readline sqlite3 xz zlib
```

### 解決法
とりあえず`brew`で再インストールしてみる。
```:zsh
$ brew reinstall openssl readline sqlite3 xz zlib
```
一応`brew`自身も`pyenv`と一緒にアップデートしておく。
```:zsh
$ brew update
$ brew upgrade pyenv
```
そうしてもう一度、
```:出力結果
$ pyenv install 3.11.3
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
Installing Python-3.11.3...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/ryota/.pyenv/versions/3.11.3/lib/python3.11/tkinter/__init__.py", line 38, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
    ^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named '_tkinter'
WARNING: The Python tkinter extension was not compiled and GUI subsystem has been detected. Missing the Tk toolkit?
```
たぶん`WARNING`なのでインストールはできたけど、依存関係がまだ微妙な感じっぽいっすね…。
`Tk toolkit`ってやつが足りないらしいですので入れてみます。
```:zsh
$ brew install tcl-tk
```
もう一回インストールしてみてエラーが出ないか確認。
```:zsh
pyenv install 3.11.3                           
```
```:出力結果
pyenv: /Users/[username]/.pyenv/versions/3.11.3 already exists
continue with installation? (y/N) y
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
Installing Python-3.11.3...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.11.3 to /Users/[username]/.pyenv/versions/3.11.3
```
普通にできましたね。
```:zsh
pyenv versions
* system (set by /Users/[username]/.pyenv/version)
  3.11.3
```
ちゃんとこっちも確認できました。

## あとがき
やはり`pyenv`周りの環境構築はいろいろ手こずるようで、QiitaやZennで似たような記事がありました。僕もいろんな記事を見てみたのですが、自分のようなトラブルが見つからなかったので、書き留めておきます。誰かの役に立てば幸いです。
良かった記事

https://qiita.com/t_aki/items/a5e578aecf8cc20bec31
https://speakerdeck.com/kawaguti/my-journey-from-fearless-change-to-psychological-safety
https://tech-blog.abeja.asia/entry/advent-2023-day17?utm_source=pocket_saves#fnref:1
https://qiita.com/osw_nuco/items/a5d7173c1e443030875f
https://ai.google.dev/docs/prompt_best_practices?hl=ja
https://qiita.com/sachaos/items/e3a613b018febb898fde
https://sizu.me/ktsn/posts/v3n2rkzcckia
https://note.com/shiny_minnow23/n/n796f7c79713f
https://zenn.dev/nameless_sn/articles/architecture_tutorial
https://speakerdeck.com/masuda220/she-ji-falsekao-efang-toyarifang
https://gist.github.com/mpppk/609d592f25cab9312654b39f1b357c60
https://qiita.com/bohemian916/items/46f9f1e8bb32fc0a1f99
https://speakerdeck.com/segavvy/ben-dang-niwakariyasuiairu-men
https://goyoki.hatenablog.com/entry/2024/01/10/225015
https://speakerdeck.com/kakehashi/kakehashi-scrum-and-deadlines

https://www.amazon.co.jp/gp/aw/d/4815622973?psc=1&ref=ppx_pop_mob_b_asin_title
https://www.amazon.co.jp/gp/aw/d/B0BH3ZBK7C/ref=ya_aw_dod_pi?ie=UTF8&psc=1
https://www.amazon.co.jp/gp/aw/d/B0CM326XNQ/ref=ya_aw_dod_pi?ie=UTF8&psc=1
QuickSight個人的おすすめquiita記事

これいいんじゃないって自分が勝手に選定して勝手にまとめたQuickSight関連のquiita記事になります。(随時更新予定)

# 【基礎】aws quicksightによる簡単bi分析！おススメ使い方
https://qiita.com/gk12/items/6f78851b9f8d8c2de54d

# QuickSightのコンソール画面からのグループ管理に必要な前提操作について
https://qiita.com/ZEAL-Y-H/items/4f9757ff11fb848b8e7f


# QuickSightの接続パターン入門
https://qiita.com/asahi0301/items/8d32d29a7d268185084a

# Amazon QuickSightの埋め込み手順
https://qiita.com/arata-honda/items/9abd0cc09b8a7897ef45


最後に自分も記事も載せとこ・・・

https://qiita.com/run_way/items/102f90ae534fbb782bb4

https://qiita.com/run_way/items/8c12035b0425956efe03

参考情報
Amazon QuickSightホームページ
https://aws.amazon.com/jp/quicksight/
Amazon QuickSightドキュメント
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/welcome.html
Amazon QuickSight ギャラリー（ダッシュボードのサンプルを動かしながら確認できます）
https://aws.amazon.com/jp/quicksight/gallery/
Amazon QuickSight デモセントラル（⾼度なカスタマイズの例が揃っています）
https://democentral.learnquicksight.online/
Amazon QuickSight 更新履歴
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/WhatsNew.html
QuickSight Developer Portal (埋め込み機能の使い⽅を解説)
https://developer.quicksight.aws/
【ChatGPT無→有＋DALL-E3】レシピ作成してから、画像を描いてもらいます。


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

　今回は、
　　レシピから画像を
　　　作成します。

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

　レシピ作成は、
　　ChatGPT無料版を
　　　使用します。

　これは、
　　ChatGPT有料版の利用制限を
　　　できるだけ、有効に使いたい
　　　　ためです。

　別に、このくらいならば、
　　無料版で充分だと判断しました。

　適材適所ですね(=^･^=)

　では、
　　無料版とのやり取りから。
***
***User***
野菜炒めのひとり分のレシピを教えてください。

***ChatGPT無料版***
野菜炒めのひとり分のレシピですね！材料と手順をお伝えしますね。

### 材料:
- 野菜（キャベツ、にんじん、ピーマンなど）：適量、約1カップ
- にんにく：1片（みじん切り）
- ごま油：小さじ1
- 醤油：小さじ1
- 塩・こしょう：お好みで少々

### 手順:
1. 野菜を洗い、適当な大きさに切る。
2. フライパンにごま油を熱し、にんにくを炒める。
3. 野菜を加えて炒め、塩・こしょうで味付けする。
4. 野菜がしんなりするまで炒める。
5. 最後に醤油を加えてさっと炒め合わせる。

簡単で美味しい野菜炒めの出来上がりです！
***
　ここから、
　　材料と手順を
　　　抜き出して、
　　　　ChatGPT有料版（GPT-4）に
　　　　　投げます。
***
***User***
下記の材料と手順で作れる料理を描画してください。なお、これはひとり分のおかずです。一人分の完璧な量を強調する小さくエレガントな皿に盛られています。シンプルに料理の皿だけにしてください。

### 材料:
（中略）

### 手順:
（中略）

***ChatGPT有料版***
（画像）
こちらは、エレガントに盛られた、一人分にぴったりのお料理のイラストです。
***

　と、おかずの
　　野菜炒めができました。

　これ、最初は
　　大きなお皿に
　　　たくさん盛られていました。
　　　　それだけで、主食ですw

　そこで
　　「一人分の（中略）ください」
　　　を追加しました。
　　　　GPT-4と相談しました。
***
　これで完成、と言いたいのですが
　　さらに別の料理（生姜焼き）の
　　　レシピを渡したところ、
　　　　豚肉の細切れ（生）とか
　　　　　豚肉の燻製のカットとか
　　　　　　そんなものに
　　　　　　　なりました(泣)

　すべての料理に
　　対応していないのは
　　　仕方ないですね。

　たぶん、これは、
　　欧米料理ならば
　　　問題ないのではないかと
　　　　思います。たぶん。

　“そこは、やっとけ”って
　　言われそう(汗)
***
　いかがでしたか？

　まぁ、
　　あまり参考にはならない
　　　感じな気がしますが、
　　　　みなさんの糧に
　　　　　なれれば、幸いです。

　今回は、
　　ここまで。
ある音声を再生すると、ある音声の音量が小さくなる意味不明な現象

Windowsのラウドネスイコライゼーション（音量を均一化する機能）が原因の可能性がある。

ーーー
    
タスクバーの音量アイコンを右クリック
![20240117114342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582030/1a908d86-de09-9491-b091-758593fc1f5f.png)

→ サウンド(S)
→ 再生

-
→ 各自のスピーカーをダブルクリック
![20240117114548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582030/4f74cc2c-99dd-3a6c-9a72-96a98ffebe3d.png)


オフにする
iOSシュミレーターが起動しない


Flutterの開発をしていて急にiOSシュミレーターが「Unable to boot the Simulator. 」と表示を出して起動しなくなってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/4c631400-677f-08fa-ea01-ef129a396f58.png)

こんな表示が出て、シュミレーターが起動できない:sob:

色々と調べた結果、以下のキャッシュフォルダの中身を削除すると一発で起動したので備忘録として残しておきます。

```
rm -fr /Users/[username]/Library/Developer/CoreSimulator/Caches/dyld/23C71/*
```
※ 23C71というフォルダは環境によって違うかもしれません。
※ [username]は適時ご自分の環境に置き換えてください。
[ThoughtSpot]パラメータの使い方（応用）

## はじめに
ThoughtSpot利用歴約2年。
新しい機能についていくのにやっとの非エンジニアです。

前回[数値型のパラメータについて記事](https://qiita.com/shiisaa/items/b5c414dcdc49808fe1d4 "[ThoughtSpot]パラメータの使い方（基本）")を書いたので、今回は文字型のパラメータを使った応用編になります。

## ThoughtSpotでの「OR検索」について
今回は文字型パラメータを使って **「OR検索」** みたいなことをします。
ThoughtSpotでは検索条件に「OR」が使えません。
……というと語弊がありそうなので軽く説明します。

**〇できる**
 「項目A」に値αもしくは値βを含む
 　項目A = ( α or β )
　　※ 検索バー上はorも付けずに「α β」と打ち込むだけです。

**×できない**
　「項目A」もしくは「項目B」に値αを含む
 　( 項目A = α ) or ( 項目B = α )


この「できない」と書いた検索方法は、通常の検索（ThoughtSpotでいうと検索バーにいろいろ打ち込む）では「できない」ということなので、実現のためには何かしらの工夫が必要になってきます。
で、今回はその方法として文字型パラメータを使った方法をメモとして残します。

## 文字型パラメータを使ってやりたいこと
こんな感じで、ひとつの注文情報に対して複数の取引先を持つデータがあったとします。
このようなデータから、「関連取引先1」もしくは「関連取引先2」もしくは「関連取引先3」に『りんご株式会社』が入っているデータを抽出したい。
そのようなときの抽出方法です。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/19cadfa3-23ae-1797-c791-b6f1219514ea.png)

## 手順１：ワークシートにパラメータを準備する
ワークシートに文字型パラメータを準備します。
初期値を『りんご株式会社』にして保存します。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/5cc607a3-30f4-ba8f-eae8-e8cbcafd11b9.png)

## 手順２：データ検索でパラメータを入れた数式を作ってフィルターをかける
データ検索画面で数式を作成します。
※この数式は、場合によってはそもそもワークシートの方に作っておいても良いかもしれないです。
今回は、作成したパラメータの値が各取引先項目に入っていれば[TRUE]、入っていなければ[FALSE]が返ってくるようなフラグを作成します。

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/ec3c0414-c5f5-bce4-239b-9589fa20c164.png)

```
if ( 関連取引先1 = 取引先横断検索 ) then true else if ( 関連取引先2 = 取引先横断検索 ) then true else if ( 関連取引先3 = 取引先横断検索 ) then true else false 
```

そして、作成した数式（フラグ）を[TRUE]でフィルターをかけます。
するとこんな感じで、「関連取引先1」もしくは「関連取引先2」もしくは「関連取引先3」に『りんご株式会社』が入ったデータを抽出することができます。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/20e77c5a-779a-ab3a-15b6-50395a4e7afa.png)

このパラメータの「りんご株式会社」の値は閲覧者（ビジネスユーザー）が好きに値を変更できるので、ひとつ初期値で設定しておけばいろんな取引先名検索に利用できます。

数式も今回は「該当販売店フラグ」というシステマチックな名前を付けましたが、もっとビジネスユーザーになじみのあるような名前にしても良いかもしれないです。

## 終わりに
みなさんはパラメータどのように活用している？
私はいかにも正道！な使い方がイマイチよくわからない。こんな応用な使い方しか思い浮かばなんだです。
事例：ちょっとしたホウレンソウが信頼を高める話

SREを生業とさせて頂いています。
その業務の中で感じたことを紹介します。

# 伝えたい事

（上から目線で恐縮ですが）

- ホウレンソウって大事（当たり前）
- 信頼して任せられるは、ホウレンソウが出来ているかが重要（当たり前）
- ちょっとした、行動でホウレンソウが判断されているかも（この記事）

日々の何気ないホウレンソウがあなたの信頼を高めるかもしれません。
本記事は、その1つの事象（「報告」）です。


# はじまり、はじまり


|項目  |内容  |
|---|---|
|登場人物  |Aさん、Bさん  |
|MGRの依頼内容  |ちょっと怪しい事象が発生。<br>念のため、複数のサーバーから複数のLog を取ってきてほしい。そして結果をchatに共有してほしい |
|サーバー  |develop / staging  |
|Log  |1.log / 2.log  |



# Aさんの場合
・ログファイルを ポイポイ Chatに投稿。
・投稿後、共有完了です連絡を投稿


# Bさんの場合
・ログをファイルサーバーに保管
・下記のようなサマリーをPOST
```
結果、問題ありませんでした。
下記が結果と詳細のログはファイルサーバーに配置しています。
他に取得するLogがありましたら、その旨お願いします。

# devlop
1.log  = ERORRなし
2.log  = ERORRなし
# staging
1.log  = ERORRなし
2.log  = ERORRなし

ファイルのバス
```

# お判りだろうか

お願いしたMGRがアホですね（私ですが）。
依頼する際に
1. サーバーから1.logおよび2.logを取得
2. ファイルをファイルサーバーに配置する
3. 完了時は下記のようなフォーマットで報告すること
```
# devlop
1.log  = ERORRなし
2.log  = ERORRなし
# staging
1.log  = ERORRなし
2.log  = ERORRなし

ファイルのバス
```
と言えていないですね。


# Bさんはさすがですね

MGRの手抜きをいい感じに補足して、MGRが見たい形で報告してますね！


# まとめ

どんなに役職が上がっても、報告する相手は存在します。
相手がどのような形で報告をもらいたいか、考えて行動ができると、どんどん仕事を任せてもえると思います。

この記事が、見てくれた人の気づきの一つになることを願って。

以上です。
C++ web framework drogonを触ってみる(Rocky linux 8)

## 参考とさせてもらったサイト
本家のサイト
https://github.com/drogonframework/drogon

https://note.com/random_grid/m/m2477d296137b

https://qiita.com/tuq376s/items/f86761a8539ced6d42f9

https://zenn.dev/cork/articles/drogon_tutorial

https://www.wantedly.com/companies/rightcode/post_articles/417677

上記のサイトを参考にすればローカルLAN環境で動かすところまではいけるはず。

### インストール
rocky linuxの標準パッケージのC++(g++)のバージョンは8.5.0。
以下のコマンドで言語規格をサポートしているか確認
```bash:
$ g++ -v --help 2>/dev/null | grep -E "^\s+\-std=.*$"
```
C++17も大丈夫そう。
必要になる外部ライブラリは以下を参考に適宜インストールする。
`jsoncpp` `libuuid-devel` `zlib-devel` `openssl-devel`

https://github.com/drogonframework/drogon/wiki/ENG-02-Installation

```bash
$ git clone https://github.com/drogonframework/drogon
$ cd drogon
$ git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
```
コアとなる実行モジュール`drogon_ctl`がインストールされる。
インストール先はデフォルト`/usr/local/bin`

### プロジェクトの生成

以下のサイトを参考に

https://github.com/drogonframework/drogon/wiki/ENG-03-Quick-Start

`main.cc`でlistenするアドレスを指定できるので127.0.0.1、ポートは未使用ポート5555とする。

### 外部公開の方法
どこにも記載がないんだけど、とりあえずnginxのリバースプロキシでいけた。

```conf:nginx.conf
    location / {
        proxy_pass http://127.0.0.1:5555/;
    }
```

### データベース
config.jsonの記載を変更する。
main.ccのconfig.jsonを読み込むソースを有効にする。

config.jsonの変更点
mariadb/mysqlならrdbmsは`mysql`
portは3306。
client_encodingを指定しないと日本語が文字化け(「?」となる)するため
明示する必要があるっぽい。UTF-8なら`utf8`

### デバッグログのタイムスタンプがUTC
config.jsonのlogセクション内の"display_local_time"をtrueにする。

### リバースプロキシー内で接続元のIPが取得できない。
getPeerAddr()で取得すると127.0.0.1となる。
nginx側の設定でX-Forworded-Forなどのヘッダーをカスタマイズして受け渡す。

```conf:nginx.conf
    location / {
        proxy_set_header Host                   $host;
        proxy_set_header X-Forwarded-Host       $host;
        proxy_set_header X-Real-IP              $remote_addr;
        proxy_set_header X-Forwarded-For        $remote_addr;
        proxy_pass http://127.0.0.1:5555/;
    }
```
これでアクセスするとリクエストのheader情報に以下が追加される
```text:log
host: yyyy.com
x-forwarded-host: yyyy.com
x-real-ip: xxxx.xxx.xxxx.xxxx
x-forwarded-for: xxxx.xxx.xxxx.xxxx
```

### DBで使うplaceholder
サンプルは基本postgresqlなのでSQLの構文に注意。
postgresqlは`$1`,`$2`らしいがmysqlは`?`である。

公式にも書いてあった。

https://github.com/drogonframework/drogon/wiki/ENG-08-1-Database-DbClient

### 不明点
LOG_DEBUGとかのログファイル周りは高機能ではないので別途自前で用意したほうがいいか。
プロセス終了時にリネームされるので常時`tail`コマンドで監視できない。


以下、随時追記
Microsoft Copilotで、日本語プログラミング その3

# 概要
Microsoft Copilotのプロンプトを細工して、日本語プログラムを実行させようとする試みです。
zundokoをやってみた。

# Ohisama prompt

```
日本語プログラムの実行結果を答えてください。全ての結果を表示願います。
変数ｎに２４３を入れ、変数ｃに０を入れる。
変数ｎに５を掛け１を引き２５６で余りを求め変数ｎに入れる
変数ｎが１２７より大きいならば「ズン」を表示し、変数ｃに１を加え変数ｃに入れ、
さもなければ、「ドコ」を表示し、変数ｃに０を入れる。
もし、変数ｃが４に等しいなら、「ドコ　キヨシ！」を表示し終了する。

```

# 回答

このプログラムを実行すると以下の結果が得られます。

1. 変数`n`に243を入れ、変数`c`に0を入れます。
2. 変数`n`に5を掛け、1を引きます。その後、256で割った余りを求め、変数`n`に入れます。計算すると、`(243 * 5 - 1) % 256 = 1215 % 256 = 191`となります。
3. 変数`n`が127より大きいため、「ズン」と表示し、変数`c`に1を加えます。変数`c`は1になります。
4. 変数`n`に再度5を掛け、1を引き、256で割った余りを求めます。計算すると、`(191 * 5 - 1) % 256 = 955 % 256 = 187`となります。
5. 変数`n`が127より大きいため、「ズン」と表示し、変数`c`に1を加えます。変数`c`は2になります。
6. このプロセスを繰り返し、変数`c`が4になるまで続けます。

実行結果は以下の通りです。

```
ズン
ズン
ズン
ズン
ドコ キヨシ！
```

変数`c`が4に達した時点でプログラムは「ドコ キヨシ！」を表示して終了します。これは日本のゲーム「ズンドコキヨシ」に基づいたプログラムのようですね。面白い問題をありがとうございました！

以上。
【Python】__init__に書いたimport文でunused警告を出さないようにする

## 事象
ディレクトリをパッケージ化するとき、`__init__.py`に書いた`import`文
```python:__init__.py
from LibraryRoot.PackageDirectory.Modulename import some_function
```
とだけ書くと、
```
imported but unused
```
警告が出てくる。（ライブラリとして書いているので`unused`として当然）

主に`Pyflake`系統の静的解析で見られる。

## 解決
`import`したオブジェクト名を`__all__`に代入する

```diff_python:__init__.py
from LibraryRoot.PackageDirectory.Modulename import some_function

+ __all__ = [
+     "some_function"
+ ]
```

`__all__`の正体についてはこちらを参照: [Pythonの特殊変数__all__について現役エンジニアが解説【初心者向け】](https://magazine.techacademy.jp/magazine/41656)


これで[warning回避の王、warning回避キング](https://qiita.com/uts1_6/items/11e348ead4bae71571b8)になれる

## 参考
コードレビューで受けた指摘:

https://github.com/PyThaiNLP/pythainlp/pull/862#discussion_r1390481045
[WIP]決算短信の内容の変化をChatGPTを使って見つけてみる【Python / LangChain / VectorstoreIndexCreator】

まだ途中で、未完成です。

# 背景
決算短信PDFの内容の変化を計算したい。

# やること
1. 二つの決算短信のpdfを渡したら、決算短信間の類似度を計算し、その変化を評価してみる。

# 方法
1. 環境構築
2. まずは一回「LangChain」というライブラリを使ってみる
3. 過去の決算短信と比較し、決算短信間の類似度を計算してみる


# 実装

## 1. 環境構築

まずはPythonでの開発を始める前に、必要なライブラリをインストールする。
今回は、LangChainとOpenAIのライブラリ、そしてOpenAIのAPIキーが必要。
環境構築はPoetryとasdfで行った。Poetryとasdfでの環境構築の方法は別の記事にメモしてある。

https://qiita.com/TIshow/items/71c1200392202902f4b4

- LangChainのインストール：`poetry add langchain`でインストール。
- OpenAIのインストール：`poetry add openai`でインストール。
- Indexesを実行するためのライブラリのインストール：`poetry add chromadb` と `poetry add tiktoken`でインストール。
- PDFを読み込むためのライブラリのインストール：`poetry add pypdf`でインストール。
- APIキーの設定：OpenAIおよびGoogle検索を使うためには、APIキーが必要です。自分で発行したAPIキーを、指定の場所に設定します。

## 2. まずは一回「LangChain」というライブラリを使ってみる

そもそも「LangChain」というライブラリをまだ使ったことがなかったので、一回使ってみることにした。

LangChainの中には、Indexesという機能があり、これを使うと、PDFやCSVなどの与えられた外部データを基に回答を回答を生成するのに適している。

### Indexesとは
Indexesとは、 LLM がドキュメントと最適に対話できるようにドキュメントを構造化する方法。

インデックスが利用される最も一般的な方法は、「検索」。
ユーザーのクエリを取得し、最も関連性の高いドキュメントを返すことができる。

したがって、 Retrieverインターフェイスという概念がある。
LangChain は主に、Retrieverとして使用することを目的としたインデックスの構築に重点を置いている。
つまり、検索ツールとして使うための「索引」を作るイメージっぽい。

今回使ったのは、[高島屋の2024年2月期第2四半期決算短信](https://www.takashimaya.co.jp/base/corp/topics/231013a.pdf)、
と
[高島屋の2024年2月期第3四半期決算短信](https://www.takashimaya.co.jp/base/corp/topics/231225a.pdf)。

なお、簡単に実行したい場合には、 VectorstoreIndexCreatorが使えそう。
VectorstoreIndexCreatorは、Embedding、ベクトルストア等、複数処理のラッパーである。

VectorstoreIndexCreator は与えられた文書（この場合はPDF）の内容を基にして回答を生成するのに適している。これは、特に大規模な文書集合から特定の情報を迅速に検索したい場合に有効。
他の有効な使い方としては、類似文書の検索、トピックベースの文書分類、テキストの類似度分析などが挙げられる。これらの機能を利用することで、特定のトピックに関連する文書を見つけたり、文書集合内のトレンドを分析したりすることが可能。

ということでやってみる。

```python:tanshin.py
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.indexes import VectorstoreIndexCreator

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# OPENAIのAPI
os.environ["OPENAI_API_KEY"] = "YOUR API KEY"

# 決算短信のpdfファイル
takashimaya_pdf2_2 = "./2024-2-2_tanshin.pdf"
takashimaya_pdf3_3 = "./2024-2-3_tanshin.pdf"

# 複数のPDFファイルをまとめる
pdf_files = [takashimaya_pdf2_2, takashimaya_pdf3_3]


# 各PDFファイルに対してドキュメントローダーを作成
loaders = [PyPDFLoader(pdf) for pdf in pdf_files]

# VectorstoreIndexCreatorを使用してベクトルストアを作成
index = VectorstoreIndexCreator(
    vectorstore_cls=Chroma, # デフォルト
    embedding=OpenAIEmbeddings(), # デフォルト
).from_loaders(loaders)

# クエリ
query = "決算短信における戦略的な変更点や市場動向の変化についての分析をしてください。"

answer = index.query(query)
print(answer) # 応答

```

そして、得られた回答。

```terminal:回答
決算短信における戦略的な変更点や市場動向の変化についての分析は、当第３四半期連結累計期間において、新型コロナウイルス感染症の影響により、個人消費や訪日外国人数に変化が見られたことが挙げられます。また、足元では物価上昇に賃金の伸びが追い付かない実質賃金のマイナスが続いており、生活防衛意識の高まりなど、今後の個人消費に影響を与える要因が存在しています。これらの変化を踏まえ、当社では2023年度にさらなる成長と飛躍を目指し、グループ総合戦
```

応答の長さに制限があるためか、応答が途中で切れてしまう。困った。
これを解決するためには、クエリの調整やチャンク分けなどが必要そう。
`CharacterTextSplitter`なども使ってうまくチャンクわけなどの工夫が必要なので、この後やってみる。

しかし、使い方の雰囲気はなんとなくわかった。


## まだ未完成ですが、一旦お疲れ様でした。


わからないところ、間違っているところ、もっといい方法がある場合は、コメントでもDMでも教えてください。
React.jsで構築されたサイトをBookmarkletで操作する


# 序
React.jsで構築されたサイトをBookmarkletで操作するための何か

## なに？
DOM操作でINPUTエレメントなどに値を入力/変更してもReact側には伝えられないためReactから無視されます。
これを無理やりReact側に伝えるためにごにょごにょする奴です。

# 方法

## input[type="text"]
ごにょごにょした上でchangeイベントを強制発火します。

```javascript
// React.jsのデータをイベントを発火することで無理やり書き換える
function setValueToInput(value, element) {
	const lastValue = element.value;
	element.value = value;
	const event = new Event('change', { bubbles: true });
	const tracker = element._valueTracker;
	if(tracker) {
		tracker.setValue(lastValue);
	}
	element.dispatchEvent(event);
}
```
## selectとoption
`selectedIndex`を設定してchangeイベントを強制発火します。

```javascript
// React.jsのデータを無理やり書き換えるの<SELECT>バージョン
function setIndexToSelect(index, element) {
	element.selectedIndex = index; 
	const event = new Event('change', { bubbles: true });
	element.dispatchEvent(event);
}
```

## input[type="radio"]
クリックします。

```javascript
// React.jsのデータを無理やり書き換えるのラジオボタンバージョン
function checkRadio(element) {
	element.click()
}
```

## input[type="checkbox"]
クリックします。

```javascript
// React.jsのデータを無理やり書き換えるのチェックボックスバージョン
function toggleCheckbox(element) {
	element.click()
}
```


# 参考にしたサイト

https://zenn.dev/pb/articles/b11a6beac6855c
ループメニュー1を解いていく３

https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_multi

### Python
```py
N = int(input())
A = [int(i) for i in input().split()]
for i in A:
    print(i * 2)
```
### PHP
for文で、要素数−１しているのは
０から数えるので、
０，１，２，３，４で要素５個だけど、−１して４までにする必要があるからですね
Pythonと違うので注意したいところです
まあこの部分は＄N-1 でもよいのですが

```php
<?php
    $N = trim(fgets(STDIN));
    $A = explode(" ",fgets(STDIN));
    for ($i=0; $i<=count($A)-1; $i++){
        print($A[$i]*2 . "\n");
    }
?>

```

https://paiza.jp/works/mondai/loop_problems/loop_problems__seq_sub

### Python
```py
N = int(input())
A = [int(i) for i in input().split()]
B = list(map(int,input().split()))
for i in range(N):
    print(A[i]-B[i])
```
### PHP
```php
<?php
    $N = trim(fgets(STDIN));
    $A = explode(" ",fgets(STDIN));
    $B = explode(" ",fgets(STDIN));
    for ($i=0; $i<=$N-1; $i++){
        print($A[$i]-$B[$i] . "\n");
    }
?>

```
Apex Classで未使用のメソッドを見つける方法


# 今回の質問

+ [Apexクラスやトリガーの棚卸（使用用途の明確化・使用有無の整理・付与Apex削除）をする必要があります。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X6YGG)

未使用のメソッドを見つける方法が提案されています。tooling APIを使うようです。

https://salesforce.stackexchange.com/questions/33903/how-can-i-find-unused-methods-and-variables

リンクがおかしかったので、私が付け直します。--> [SymbolTable:(https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_symboltable.htm)

しかしこの方法だとVisualforceからの呼び出しが参照できないようです。Visualforceを使ったカスタムコンポーネントが多いと問題になりそうです。

 Note, as this is only scanning the apex classes it won't detect declarative references from Visualforce markup. 

ただ、Tooling API自体は Visualforce にも対応しているので、問題はないことも言われています。

ここにApexのコードを使った使用例が紹介されています。
https://andyinthecloud.com/2013/02/02/spring-cleaning-apex-code-with-the-tooling-api/

 It should be noted that the Tooling API does also appear to support Visualforce ‘components’ ( I am assuming this to mean in a general sense, so thus VF pages). The principles appear the same in terms of how you interact with it, see the ApexComponentMember object in the docs. As such currently the above code does not consider references to methods on VF pages, a topic for another blog and/or fellow contributor to the Github repo perhaps… 

 # 試しにTooling APIでSymbolTableを検索してみましたが...

まさかのエラーで撃沈でした...

[SymbolTable not supported](https://salesforce.stackexchange.com/questions/278986/symboltable-not-supported)

事前にコンパイルが必要みたいな感じですね。もう少し調査が必要そうです。

SymbolTableのキャッシュされたバージョンがない場合、バックグラウンドでコンパイルされるため、クエリに予想より時間がかかる可能性があります。ApexClass から返された SymbolTable には参照が含まれていません。参照を含む SymbolTable を取得するには、ApexClassMemberを使用します。

https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_apexclass.htm

Postmanを使うと簡単にTooling APIにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ac035f27-e69a-e6d0-74d4-f071c8600d85.png)

クエリパラメータの覚え

```
select+Id,DurableId,FunctionId,Type+from+FormulaFunctionAllowedType+where+FunctionId='SUBSTITUTE'

select+Id,externalReferences,methods,name+from+SymbolTable
```
待ち時間が長くなってきたら、95パーセンタイルの最適化を検討しよう

飛行機でとても驚くべき体験をしました。

東京から北海道の札幌まで、日本の国内線を利用した時のことです。90分ほどのとても短いフライトです。

搭乗時、普段よりも搭乗にかかる時間が短いなとは感じていたものの、その理由は分かりませんでした。そのうち、搭乗グループが、ロイヤリティステータスや他の任意のグループに沿ってではなく、実際の機内での位置に従っていることに気づきました。これは、CGP Greyの[「飛行機に速く搭乗する方法」](https://www.youtube.com/watch?v=oAHbLRjF0vo)に関する優れた提案に従った方法です。

ですが、私がそれよりも本当に驚いたのは、降機の速さでした。ドアが開いてから全員が降機するまでの時間は、せいぜい90秒もかからなかったと思います。どうしてそんなことが可能だったのでしょうか？

まず、搭乗や降機は基本的にキューであると理解してください。搭乗や降機では、200名以上の人が1つの小さな隙間（ドア）を通らなければなりません。アルミニウム製の筒の中で座り続けるのはあまり楽しくありませんし、飛行機には行き先があるわけですから、どちらも速やかに行われるべきプロセスです。

でも、アメリカの国内線では、全員が降機するまでに10～15分もかかります。どうしてなのでしょう？

私が乗った便の通路は、アメリカの便に比べて特段広いというわけではありませんでした。それに、200名を1つの小さなドアに通すという基本的な問題は同じです。

私が気がついた、日本の便における決定的な違いは次の2点です。

1. ほとんどの乗客が頭上の荷物入れにバッグを入れていなかった
2. 特別な事情を持つ乗客（頭上の荷物入れに荷物がある人、子供、お年寄りなど）は、他の乗客が降りるまで待っていた

たいていの人が機内の通路を歩くのにかかる時間は同じです。そして、降機時に乗客が降りる順番は決まっています。窓側の席の人が通路側の席の人を乗り越えて先に降りることはできないからです。すなわち、降機時の遅延は、誰かがキュー（通路）に入ったために列全体が停止する場合にのみ発生することになります。

乗客のほとんどが頭上の荷物入れに荷物を入れていなかったのはどうしでしょうか？ 私が利用した航空会社（AIR DO）は、他の格安航空会社とは異なる興味深い手荷物ポリシーを採用していました。それは、45ポンド（約20kg）以下の荷物を無制限に預け入れられるというものです。そうです、45ポンド以下であれば、好きなだけ荷物を預けることができたのです！ そうして、皆が荷物を預けていたおかげで、コートやラップトップバッグなどを入れるのに使われることは多少あったものの、頭上の荷物入れはほとんど空でした。

2つ目のポイントは、より文化的なものだと考えます。日本人は一般的に、周りの人たちに迷惑をかけるよりも、座って待つことを良しとします。これは、「出る釘は打たれる」という古いことわざが表していることの良い一面です。

これらの違いは、飛行機から降りるためのキューに1人が入るまでにかかる時間の95パーセンタイルは、おそらく中央値（50パーセンタイル）よりわずかに長い程度まで大幅に短縮する効果をもたらしていました。

キューイングシステムは、95パーセンタイルに非常に敏感です。他のキューでも同じような現象を見たことがあるでしょう。前の方にいる特殊な状況の一人が特別な助けを必要としてシステムを30分詰まらせてしまい、その後ろにとても長い列ができてしまうといった現象です。この結果は、かなり以前から待ち行列理論で数学的に証明されています。

たとえばSidekiqやWebアプリケーションのデプロイメントのようなキューイングシステムでは、中央値についてあまり多くのことをできない場合があります。なぜなら、そのためには最も一般的なシナリオを変更する必要があり、それはしばしば最も複雑かつ変更が困難であるからです。ですが、95パーセンタイルにフォーカスすると、少しの異常値にのみ焦点を絞りつつも、多くの場合、望む結果が得られます。
【PUG】inputにネストしたら怒られた


# はじめに
PUGでlabelとinputを使ってチェックボックスを作っている時につまづいたので備忘録

# 事象
```
<label>
    <input type="checkbox" name="hoge" value="0">チェック
</label>
```
このHTMLをつくるためにPUGで下記のように記述した。
```
label
    input(type="checkbox")チェック
```
すると、下記のエラーが出た。
```
input is a self closing element: <input/> but contains nested content.
```

# 原因
```
input is a self closing element: <input/> but contains nested content.
```
このエラーはinputは自分だけで完結するのでネストはだめ！ということ。

# 対応方法
inputにネストされている「チェック」という文字列をinputと同列にする。
```
label
    input(type="checkbox") チェック
```
```
label
    input(type="checkbox")
    span チェック
```

これでエラーは解消された。
Postmanを使ってSalesforceにアクセスしたときのエラー


+ [Getting 404 Error on GET with URI and locator ID from POST Response](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Pj6M3SAJ)

``` html
<table cellspacing=10>
	<tr>
		<td><span style="font-weight: bold; font-size: 12pt;">URL No Longer Exists</span></td>
	</tr>
	<tr>
		<td>You have attempted to reach a URL that no longer exists on salesforce.com. <br/><br/>
  ```

  :::note
  I don't think the issue is the connected app since I could complete the POST fine and only got the error on the GET.   I tried with both a custom connected app and the connected app 'Salesforce APIs Collection for Postman'.  

I ended up using workbench to access both and was able to generate the yaml for my purposes.   For now I'm all set.  I look forward to the feature developing further.  


POSTは正常に完了でき、GETでエラーが発生しただけなので、問題は接続されたアプリではないと思います。カスタム接続アプリケーションと接続アプリケーション「Salesforce APIs Collection for Postman」の両方で試してみました。  

最終的にワークベンチを使用して両方にアクセスし、目的に応じた yaml を生成することができました。今のところ準備は完了です。機能の更なる発展に期待しています。  
:::

+ [Unable to connect using Postman on "Get Predictions with REST Requests"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CtiS0)
Java勉強メモ６_例外処理

# 例外処理
### Try-Catch ブロック
**概要:** **try**ブロック内でコードを実行し、例外が発生した場合は**catch**ブロックでそれを捕捉して処理します。
``` java
try {
    // 例外が発生する可能性のあるコード
} catch (ExceptionType name) {
    // 例外を処理するコード
}
```
例：
``` java
try {
    int division = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("算術例外が発生しました: " + e.getMessage());
}
```
### 例外の種類
Javaの例外には大きく分けて以下の三種類があります。

1. チェック例外（Checked Exceptions）
コンパイル時にチェックされる例外。
プログラマがこれらの例外に対処することが期待されます（例: IOException、SQLException）。

2. 実行時例外（Runtime Exceptions）
実行時に発生する例外で、プログラムの不正な操作によって引き起こされます（例: NullPointerException、IndexOutOfBoundsException）。

3. エラー（Errors）
プログラムの制御を超えた重大な問題を示します（例: OutOfMemoryError、StackOverflowError）。

### カスタム例外
特定のアプリケーションのニーズに合わせて定義されるユーザー定義の例外。
**Exception**クラスまたは**RuntimeException**クラスを継承して作成されます。
カスタム例外の作成
例:
``` java
public class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}
```
使用方法:
``` java
try {
    throw new CustomException("これはカスタム例外です");
} catch (CustomException e) {
    System.out.println(e.getMessage());
}
```

### その他の例外処理概念
**finally** ブロック
**try**または**catch**ブロックの後に実行されるブロック。
例外の有無に関わらず、リソースの解放などのクリーンアップコードを記述するのに適しています。
マルチキャッチ
複数の例外を単一のcatchブロックで捕捉する機能。
例: catch (IOException | SQLException ex) { ... }
スロー（Throw）**と**スローズ（Throws）
**スロー（Throw）:** プログラム内で明示的に例外を発生させるキーワード。
**スローズ（Throws）:** メソッドが例外を投げる可能性があることを宣言するキーワード。
質問の時は正確なバージョンを伝えましましょう（npm list）

# 1．問題
プロジェクトを作ってるのに原因がわからないエラーが出続けて、
StackOverFlowのようなQ＆Aサイトに質問をしようとする。
今の開発環境を具体的に伝えるため、
使用しているnpm packageの正確なバージョンが知りたい。

# 2．環境
npm packageを使用する環境すべて。

# 3．解決
`package.json`を見せるより、
`npm ls [package name]` しましょう。

# 4．詳細
### 4.1 npm listとは
`package.json`には、バージョンではなく「バージョンの範囲」が記載されている。
npm listは全体的なdependency treeを確認するときに使用する。
npm lsと書いてもいい。

### 4.2 npm list [package name]とは
`npm list [package name]`すると当該dependencyの正確なバージョンが表示される。
さらに、dependencyのdependencyである場合のバージョンまで表示してくれる。

### 4.3 例示
sassとsass-loader packageをインストールした環境で`npm list sass`してみると、sassのバージョンが表示される。
`dedupted`はdeduplicatedの略語で、重複が削除された状態を指す。

````javascript
C:\Users\xxxx\xx\video-info-storage>npm list sass
video-info-storage@1.0.0 C:\Users\xxxx\xx\video-info-storage
+-- sass-loader@12.6.0
| `-- sass@1.69.7 deduped
`-- sass@1.69.7
````

### 4.5 global packageのdependency treeを見たいとき
`npm ls -global`すれば、global installしたパッケージが表示される。
`npm ls -g`と書いていい。
````javascript
C:\Users\xxxx\xx\video-info-storage>npm list -global
C:\Program Files\nodejs -> .\
+-- corepack@0.18.0
`-- npm@9.6.7
````

# 5．関連知識
なし

# 6．まとめ
自分のプロジェクトのエラーについて正確な回答が欲しかったら、npm lsしましょう。

# 7．参考
[npm packageの正確なバージョンの調べ方(npm ls, npm outdated, npm audit, ERESOLVE...)](https://youtu.be/0TsLKDLdxSw?si=usZojVZKUAOEa4JQ)
[【Node.js】npm ls 時の deduped とは](https://qiita.com/KEINOS/items/d71c615b9ef3a3ed8886)
[What is deduped in npm packages list?](https://stackoverflow.com/questions/52781142/what-is-deduped-in-npm-packages-list)
[npm-ls](https://docs.npmjs.com/cli/v10/commands/npm-ls)

# 8．感じたこと
今まで特に意識してなかったよな。
jQueryのバージョン上げたらUncaught TypeError: $ is not a functionが出た


今回はkintoneでjQueryのバージョンを新しくしたら「**Uncaught TypeError: $ is not a function**」っていうエラーが出た

#### エラーの原因
jQueryのバージョンアップで`$`の扱いが変わっていたのが原因。だから`$`を使うところでエラーが出る。

#### 解決策
`$`の代わりに`jQuery`って書けば問題なく動いた

- 古いコード：`$(セレクタ)`
- 新しいコード：`jQuery(セレクタ)`


追記
(function($){

})(jQuery);

にすれば＄をjQueryと見なす（実際には即時関数の引数＄にjQueryを渡しているだけ）という意味になるので中身の$変えなくても大丈夫でしたしこっちの方が楽でした。
秋月の定電圧安定化電源キットを作ってみた

10年以上前にときどきよっているハードオフに電子パーツがいろいろ置いてあって、いろいろ購入しました。どうも近くの会社が整理された時に放出されたもののようです。その中に秋月電子の作られてない鉛蓄電池充電キットがあり、なにかに使えるかと思い315円で購入しました。後で調べたら定価1000円のものでした。

このキットはNJM723を使ったもので、定電圧安定化電源キットと同じ基板を使っていることに最近きがつき、安定化電源として作ってみることにしました。

安定化電源キットは10Aの大電流に対応していますが、トランスが1Aのものがあることと、そんな大電流は使わないので1Aで作ります。

安定化電源キットは三世代あり、それぞれの説明書が秋月電子のサイトでダウンロード可能です。

基板も三種類あり、初期のものはユニバーサル基板のように穴が開いたものでした。普通のプリント基板になった最初のものはR7が一本でしたが、今のものは複数付けられる様になっています。

初期の安定化電源キットには2N3055というごついトランジスタ(TO-3)が二つ入っていて、これをダーリントン接続して10Aをドライブしていたのですが、充電器キットには2SD(入っていたのは1276A)のパワートランジスタが一本しか入っていません。とはいえ1A程度であればこれ一本で十分なのでそのまま使うことにしました。

手持ち部品をかき集めて作る事にします。

ちょうどケースも使っていなくてなにか電源にでも作ろうと思っていたものがあったので、穴を開けなおして再利用します。

部品はだいたい近いものにして、ない物は合成して使うことにします。

トランスも使っていなかったTANGOのS16で8V,14,16Vのタップがあり、5V出力としてつかうつもりで損失が大きくなるとトランジスタが発熱するので、8Vで使うことにします。当初16Vで試したらかなり発熱していました。

一次側に入れるヒューズはトランスに0.4Aと書いてありましたが、安全のため200mAを入れました。

ブリッジダイオードはKBL02というものが入っていたのです、オーバースペックなのと、基板上に付けるのが難しいので、手持ちのGI W02という小さいものに交換しました。

GI W02は80年代前半に中古アンプの修理の為に購入したものの残りです。足が真っ黒に酸化していたので、紙やすりで磨きました。

だいたいできて、試しにダミーの負荷をかけて電圧を計ると、2Vくらいしか出てません。ハンダ付けや回路図を確認します。

TR2が2SCのタイプで基板にシルク印刷してありますが、利用しているのは2SDなので、反対にする必要がありました。

VR2で電圧を調整できるのですが、普通の半固定ではあわせにくいので、多回転のものが良いかもしれません。

![IMG_20240117_090835(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7735b82e-e169-5cd0-8690-74fea119a94d.jpeg)

開けたまま動作させて発熱や変な匂いがしないか確認しました。

82Ωのセメント抵抗をつけてオシロスコープで確認してみましたが、問題ありませんでした。

![5v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/ee0ac39f-d220-2fe1-b8b0-894652bca91a.png)

レギュレーターの定電圧電源とあまり違いが感じられませんが、しばらく使ってみようと思います。

実際の負荷（I2S出しルーター)をつないで電圧変動を確認してみました。電流は160mAくらいでした。

純正のアダプタ（スイッチング）

![NewFile0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/695b1c8e-2a41-0e0e-d5d1-02c113135496.png)

トランスタイプのアダプタにレギュレーターを付けた電源

![NewFile1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/cfe62608-6ddc-594f-24d3-5cb6e158b86d.png)

安定化電源キット

![NewFile2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2154e4ca-7d0b-cd37-d674-72af13830aa2.png)

もう少し調整したほうがいいのかもしれません。
Java勉強メモ５_クラスとオブジェクト

# クラスとオブジェクト

### クラスの定義
クラスはオブジェクトの設計図です。クラスを定義することで、オブジェクトの属性（フィールド）と振る舞い（メソッド）を指定します。

#### 1.構造
**フィールド（Fields）:** オブジェクトの特性を表します。例えば、車のクラスには色や速度などが含まれます。
**メソッド（Methods）:** オブジェクトが実行できるアクションを定義します。例えば、車が加速する動作など。
**コンストラクタ（Constructors）:** クラスからオブジェクトを作成するための特別なメソッドです。オブジェクトの初期化に使われます。
``` java
public class Car {
    String color;  // フィールド
    int speed;     // フィールド

    // コンストラクタ
    Car(String c, int s) {
        color = c;
        speed = s;
    }

    // メソッド
    void accelerate(int amount) {
        speed += amount;
    }
}
```
#### 2. オブジェクトの生成
クラスからオブジェクトを生成するには、**new**キーワードと共にコンストラクタを呼び出します。
``` java
Car myCar = new Car("Red", 0);  // Carオブジェクトの生成
```
#### 3. メソッドとフィールド
**フィールド:** オブジェクトの状態を保存します。例えば、colorフィールドは車の色を保持します。
**メソッド:** オブジェクトに対して実行できるアクションです。accelerate()メソッドは車の速度を増加させます。
``` java
myCar.accelerate(10);  // myCarの速度を10増加させる
System.out.println(myCar.speed);  // 現在の速度を表示
```
#### 4. コンストラクタ
オブジェクトを作成する際に呼び出される特別なメソッドです。オブジェクトの初期状態を設定するために使用されます。
``` java
Car(String color, int speed) {
    this.color = color;
    this.speed = speed;
}
```
#### 5. 継承とポリモーフィズム
##### 継承
一つのクラス（親クラス）の特性を他のクラス（子クラス）が引き継ぐことです。
コードの再利用性を高め、構造を整理します。
##### ポリモーフィズム
異なるクラスのオブジェクトが同じインターフェースを共有することを指します。
メソッドのオーバーロード（同じメソッド名で異なるパラメータリスト）やオーバーライド（子クラスが親クラスのメソッドを再定義）を通じて実現されます。

継承の例
``` java
public class Vehicle {
    void move() {
        System.out.println("移動する");
    }
}

public class Car extends Vehicle {
    @Override
    void move() {
        System.out.println("車が移動する");
    }
}
```

ポリモーフィズムの例
``` java
Vehicle myVehicle = new Car();
myVehicle.move(); // "車が移動する" が出力される
```
Excel Onlineでヘッダ/フッタの編集

# 背景
Macユーザなど、Officeを購入していない人は
オンラインのエクセルを使用されていることと思う。

公式にはマクロが使えない以外で、
あとはローカルにインストールするものと一緒というようにアナウンスされているが
ヘッダ/フッタの編集はオンラインのエクセルでは出来ない。

予めヘッダ/フッタがエクセルに設定されていると、PDFエクスポート時にはそのまま表示されてしまう

# 目的
埋め込まれているヘッダ/フッタの編集をエクセルの購入なしに行いたい。

# 手順（以下はLinux上の手順だがMacでも同様に可能と思う）
1. 適当な作業ディレクトリを作る
    ```shell
    mkdir work
    ```
    
2. エクセルファイルを作業ディレクトリの中に解凍する
    ```shell
    unzip original.xlsx -d work/
    cd work/
    ```

3. シート毎にヘッダ/フッタを編集する
    xl/worksheets/sheet[x].xml がシートのファイル
    ```shell
    vim xl/worksheets/sheet1.xml 
    ```

    `oddHeader`または`oddFooter`タグを検索し、中身を編集する
    ヘッダ/フッタ両方消したいだけなら`headerFooter`タグごとまるごと消してもOK

    印刷するシート分すべて同様に編集すること。

4. xlsxファイルにもどす
   この時、同じディレクトリ内に元のエクセルファイルがあれば退避する
   （余計なものを一緒にアーカイブしないようにする）
   ```shell
   # mv original.xlsx ../ # もしあれば
   zip -r modified.xlsx ./
   ```

あとはOneDriveに上げなおすなどする。