OmniAICreator/Qiita-1.07M huggingface dataset:
【WordPress】マクロ有効のエクセルファイルがアップロードできない

### 経緯
WordPressを触るようになって約4ヶ月。
WordPressをいじっている最中、
無効なファイルダウンロードURLがあったので新しいものに変えようと、
いつものように「メディア」に新規追加しようとしても、
「このファイルをアップロードする権限がありません」と拒否されました。

え？？なんで？？と戸惑い調べていると、WordPress がサポートしていないファイル形式を
アップロードしているときに発生する一般的なエラーということがわかりました。
私がアップロードしようとしていたのがマクロが有効になっている「.xlsm」ファイルで、
なんとWordPressの「メディア」に登録可能なデフォルトのリストにありませんでした。
ハッカーが自身のウェブサイト上のファイルを悪用するのを防ぐためにある制限が関係しているようです。

**デフォルトでアップロード可能なもの**（参照：https://toumaswitch.com/a7oklhivv0/#toc1）
・文書: .pdf, .doc, .docx, .ppt, .pptx, .pps, .ppsx, .odt, .xls, .xlsx, .psd
・画像: .jpg、.jpeg、.png、.gif、.webp、.ico
・ビデオ .mp4, .m4v, .mov, .wmv, .avi, .mpg, .ogv, .3gp, .3g2
・オーディオ .mp3、.m4a、.ogg、.wav

### 解決方法、行った施策
調べた結果、プラグインを入れるかコードを入力するこで解決できることがわかりました。
業界未経験で今年4月にエンジニアなったばかりの私には、コードを正確に理解し、
解決させる能力がない（コードはまだ全然勉強していない）ため、
上長許可を取得後、プラグインを入れる方を選択しました。

**プラグイン名：WP Add Mime Types**

### マクロ有効のエクセルファイルをアップロードする方法
① WordPressの画面を開き、「プラグイン」を選択
② 「新規プラグインを追加」をクリックし、検索バーで「WP Add Mime Types」と検索

![スクリーンショット 2023-12-22 134608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631802/c3d4a8a5-165f-06c1-9f0a-a20569cbb412.png)

③ 「今すぐインストール」をクリックし、プラグインを「有効化」する
④ 「設定」の中にある「Mime Type設定」を開く
⑤ 以下の表から追加したい拡張子を1行すべてコピーする
　※今回であればマクロ有効ブック(.xlsm)を追加したいので、拡張子を探してコピー
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631802/3c249d96-74ab-342c-9e90-bb41ba2cdedc.png)

⑥「追加の項目」の空白スペースにペースト（※以下参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631802/81e190db-0020-ef24-4025-df5bc464bde2.png)

⑦「設定を保存」をクリックして完了

### 最後に
今回、プラグインを導入したり、解決策を探すにあたって以下サイトを参考にしました。
もしよろしければこちらも併せてご確認ください。

https://toumaswitch.com/a7oklhivv0/#toc1%EF%BC%89

https://zakkioh.com/wp-add-mime-type/

https://tripbowl.net/wordpress-upload-error/

お読みいただきありがとうございました。
esaを使ってみての感想 

社内に導入するか検討中の[esa](https://esa.io/)について、使っていたので個人的な感想をまとめていきます。
12月始めに、使ってみて！と依頼が来まして、約1ヶ月間の利用です。


## 良かったところ

**◯ 普段から記載しているMarkdownで記載出来るので楽**
普段から慣れているMarkdownを利用できるので、記載する時にストレスはほぼないです。

**◯ ただのメモに誰かが反応してくれるのは新鮮**
⭐を貰えるだけでも、書いてよかった。と思えます。

**◯ 自分で整理するのが面倒。。。と思うような記事を誰かが作っていたりする**
これが本当にありがたいです。一番良かったかも。

**◯ 更新差分を管理してくれる**
誰かが自分の記事を変更したとしても、差分を出してくれるので安心です。

## 課題と思うところ

**△ 添付ファイル容量が小さい**
デフォルトでは1記事あたり10MBのファイルまで許容されます。
S3を利用することで最大50MBになる（[FAQ](https://docs.esa.io/posts/106#Q.%20%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A7%E3%81%8D%E3%82%8B%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%AE%B9%E9%87%8F%E3%81%AB%E5%88%B6%E9%99%90%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F)）とのことですが、Notionなど他サービスと比べると小さく感じてしまいます。


**△ 下書きの状態で他人が編集出来る**
「下書きってなんだっけ・・・？？？」ってなりました。
下書きで非公開にするくらいなら、途中のメモでも投稿しろ。ということなのかなと思いますが、下書きの記事が別のものになったら書きたくなくなりそうです。

**△ リアクションできる幅が薄い**
上述していますが、⭐はあります。ですが、Slackのように色々な反応ができたら嬉しいです。

**△ 複数人で同時編集時は注意**
複数人で同じ記事を保存しても、差分で更新してくれるようです。
誰かとコンフリクトするような編集は試せていませんが、注意しておくに越したことはなさそうです。

**(個人的に)ブラウザではなく、エディタから連携したい**
あくまで個人的な意見ですが、、、毎度ブラウザを開くのが面倒で。
メモをするだけなら、テキストエディタで済ませたいと思ってしまう人種です。
軽ければ軽いほど愛せます（今のお気に入りは[zed](https://zed.dev/)です）。
エディタと連携出来たら気分も変わるかも・・・と思ったところでした。

---

1ヶ月弱の利用期間ですが、誰かとメモをシェアするということが少なかったので、導入したら何か変わるかも、と思えました。
よく投稿する人、なかなか投稿出来ない人・・・と偏ってしまうかもしれません。
投稿しない方々もコメントなどリアクションしてもらえると、記載が増えてメモが育っていくのではないでしょうか。
4年半で約14のプロジェクトやチームを経験したので振り返り

この記事は [株式会社うるる（ULURU） Advent Calendar 2023 の22日目](https://qiita.com/advent-calendar/2023/uluru)の記事です。

## はじめに

初めまして？新卒入社4年目の雑談男です。
普段は雑談をよくしてます。

本記事では入社後様々なプロジェクトやチームを経験してきたので、その簡単な振り返りと学びを残そうと思います。
割と自分語りが多いので、苦手な方は総評だけ読むかブラウザバックをお願いします。

## 経験してきたこと

### 一年目
◆やったと
- 旧アプリケーションの運用保守
- データ移行
- スクレイパー開発

◆印象深いこと
入社一年目ですが、データ移行のうち1つフェーズの小チームの旗振りをさせてもらいました。しかし、見積もりに対し内容が濃く大幅にリリース時期が遅れました。また、リリース自体も失敗しました。
育成担当の先輩が切り戻しを引っ張ってやっていくださったので、なんとか大事にならずに済みました。
一年目にして**失敗時の適切なリカバリーと速度感の大切さ**を身をもって学びました。

### 二年目
◆やったと
- 新アプリケーション開発
- 片方向データ連携システム開発
- 新アプリケーション運用保守
- UI/UX改善
- ログイン前の新アプリケーション開発

◆印象深いこと
ずっとではありますが、ヘルプ要員などプロジェクトやチーム移動が多く一つのことに集中できることがあまりなかったです。しかし、移動が多かったことでキャッチアップスピードが上がり、チームへ参入した際の初速には自信がつきました。

特に意識していることは、参入時に次の様なプロセスで考えを進める様にしています。
```
プロジェクトの目的→プロジェクトの進捗や現状→プロジェクトの見えている課題→自分の期待されること→プロジェクトを進める上での課題→自分のやるべきことや具体的なタスク
```
こうすることで、全体を俯瞰しながら自分の動きを効率化できます。

### 三年目
◆やったと
- 検索制限機能の実装
- 新アプリケーション運用保守
- PHPバージョンアップ
- Vue,Nuxtバージョンアップ

◆印象深いこと
三年目は特筆することはないですが、1,2年目で学んだことを活かしながらどうしたら事業部への影響（利益）を最大化できるかを考えていました。**エンジニアとしてのこだわりを残しつつも事業部の利益を考える**ことの難しさを学びました。


### 四年目
◆やったと
- SREっぽいこと
- 検索機能のリニューアル
- 現在はまた別のこと

◆印象深いこと
AWSの異常コストを要件から考え一から設計し実装リリースまですることを（周りの力を借りながらも）ほぼ一人でできたことは感慨深かったです。まだまだインフラには弱いですが、キャッチアップスピードや設計、実装、各所との調整など今までの経験が形になったなと思いました。

## 4年半の総評
つらつらと経験と学びを書きましたが、この4年半で約14のプロジェクトやチームを経験してきた私なりのプロジェクトを進める上での学びを書きます。


### フロントとバックエンド間の連携はロスが発生する
多くのプロジェクトではフロントエンドとバックエンドの職能が分かれているのではないでしょうか？
この職能の境での連携にはとんでもないコミュニケーションロスが存在しています。APIの設計内容の連携ミスから始まり、何を実装していて何を実装していないのか、など様々あります。

正直仕方ない部分が多いと思いますが、職能で分けて自分はこの領域だから相手の領域は任せた！ではなく、相手の領域を知り譲歩し合う考えや巻き取りに行く動きができると素敵だなと感じています。


### コードの保守性の大切さ
仕事をしていく上でスピードは大切だと思います。しかし、スピードにばかり取りつかれると設計がおかしくなったり、保守性が下がったりとコードの質が落ちます。
コードの質が落ちると、バグを生む確率が上がったり、新機能の実装に時間がかかったり、最悪作り直す羽目になったりします。

この問題はどこでも抱えていて、プロジェクトの期日やQCDSの優先度によると思います。チームによっては基本リファクタは許されないし、綺麗に書いている余裕もないと考えるとこもあると思います。

正直末端の開発メンバーがどうするとかは難しいかもしれませんが、プロジェクトの始動時その分の工数を入れた形でリーダーなどに提案するのが良いと思っています。もし、期日があるのであればリリース後にリファクタをする期間を取る約束をしても良いかもしれないですね。


### プロジェクトとして動くのであれば、細かな仕様まで決めておくべき
アジャイルを取り入れている現場は多いと思います。しかし、アジャイルなのにプロジェクトとしてチームが発足し、期日が決まる。この動きをしてしまうと大変なことになります。

アジャイルで開発するのであれば、あーでもないこーでもないと言いながら少しの手戻りが発生するのは致し方ないです。しかし、ウォーターフォール的に期日が決まり、プロジェクトとして動くのであれば、細部まで仕様が決まり、デザインができていないと開発する側としては戸惑いが多く発生します。

もちろん、開発側から仕様の提案等はできると思いますし、どんどん提案すべきです。しかし、その発案/検証/提案/議論の工数は見積もりに含まれていません。

もし、細かいことまで決まっていないが、ウォーターフォール的になるのであれば、上記の様な工数や連携コストなどを上乗せして見積もる必要があると思います。


### 色々あるけど、チームの雰囲気は大切
ここまで、いろんな課題を出してきましたが意外と乗り切ってこれました。本来であれば、いろんな課題があると思い詰めたりする人が出てきたり、メンバー間でギスギスすることもあると思います。

しかし、それも普段からメンバー同士の関係値を高め結束を強くすることで、円滑なコミュニケーションが可能にな理ます。結果、お互いを助け合い課題解決に前向きになれると思います。
つまり、普段からの雑談は大事です！

長い自分語りと振り返りを読んでくださりありがとうございました。
RPi ZeroW で高精度AD-HATを使う ~地震計の製作 ノイズ対策編~

# 背景

前回の記事ではとりあえず RaspberryPiZeroW + High-Precision AD HAT で地震（まだ地動ノイズしかデータが無い）を観測できるところまで到達しました。

https://qiita.com/pirotan628/items/f0a4207e8b32295b82e4

問題になっていたのは電源ノイズと思われる40Hz付近のピークと10秒程度の間隔で入る矩形ノイズです。

# 実験
疑わしきは電源からのノイズ混入ですので、商用電源からの隔離を試してみます。

元々使用している一般的なELECOMのUSB充電器とAUKEYのモバイルバッテリ([PB-N83](https://jp.aukey.com/products/18w-10000mah-power-bank-pb-n83); 18W/10000mAh)で比較してみました。

# 結果
#### 地動ノイズ（交通量）が少ない時間帯
- ELECOMの充電器での観測記録：
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/2f80d48f-faee-58d8-c962-2a3d50cc9ad1.png">

- モバイルバッテリによる観測記録：
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/b2c4f6bf-44c9-c160-430f-2a1fa6ab053f.png">

モバイルバッテリーでの値はスイッチング電源に比べて、60Hzのピーク(40Hzに折り返し)および10Hz以下の低周波数帯のノイズともに1桁かそれ以上小さくなりました。ここまでくると、設置環境が良ければ震度0台の地震もなんとか扱えるかもしれません。一方で、矩形ノイズはモバイルバッテリでも混入しています。RPi-ZeroW由来のノイズなのか、AD HAT自身のノイズなのかは分かりません。

#### 地動ノイズ（交通量）が多い時間帯
- ELECOMの充電器での観測記録：
パワースペクトルで見ると、60Hzのピークは $ 10^8 $ [Cnt2/Hz]
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/bb1358f1-8023-e3d5-19e8-e1b973702540.png">

- モバイルバッテリによる観測記録：
パワースペクトルで見ると、60Hzのピークは $ 10^7 $ [Cnt2/Hz]
<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88076/639202d4-59ee-8b79-2f57-a3a8482fde52.png">

こちらも同様に、全体的に1桁ほどノイズが抑えられているようです。

# 結論
ノイズレベルの低さはモバイルバッテリーの圧勝でした。静かな環境に持って行けば微小地震観測もできそうなレベルになりました。

一方で懸念していた60Hzも矩形ノイズも完全には除去できていません。バッテリ給電ではどちらも抑えられたことから、矩形ノイズについても電源由来っぽい感じはします。データの扱いとしては矩形ノイズの方が厄介なので、原因を突き止めたいです。

現在はAD HATへの給電はRPi経由であるため、次の手はGPIO経由での給電、その次はRPiとAD HATの電源を切り離すことでしょう。こちらはAD HAT側の改造が必要になるため、しばらく様子見です。
Railsでinputにdisabled属性を指定した場合のパラメータ送信に関する注意点

※この記事は僕がぶち当たった問題をとりあえずChatGPTくんに丸投げしてライティングしてもらったものです。

# はじめに
Railsアプリケーションを開発する際、フォームのinput要素にdisabled属性を指定すると、そのinputからの値はサーバーに正しく送信されないという現象があります。本記事では、この問題に対する対策と回避策について説明します。

# 問題の概要
disabled属性が指定されたinput要素は、ユーザーからの入力を受け付けないようになりますが、それによってその値がフォームからサーバーに正しく送信されなくなります。これは、セキュリティ上の理由からブラウザがこのような挙動を示すためです。

# 対策方法
## readonly属性の利用
disabled属性と同様に、readonly属性もinput要素を読み取り専用にしますが、異なる点としてreadonly属性を指定したinputはフォームから値を正常に送信できます。そのため、readonly属性を使用することで、ユーザーが値を変更できないようにしつつ、値を正しく送信することができます。
```erb
<%= form_for @model do |f| %>
  <%= f.text_field :attribute, readonly: true %>
  <!-- 他のフォーム要素も追加する場合は適宜記述 -->
  <%= f.submit "Submit" %>
<% end %>
```

## JavaScriptを使用した対応
もし、disabled属性を利用してスタイリングやユーザビリティの向上が必要である場合は、JavaScriptを使用してフォーム送信時にdisabled属性が付いたinput要素の値を手動で追加することができます。以下は、簡単なJavaScriptの例です。

```js
// application.js や別途用意したファイルに追加
document.addEventListener('DOMContentLoaded', function() {
  var form = document.querySelector('form');

  form.addEventListener('submit', function() {
    var disabledInput = document.querySelector('input[disabled]');
    disabledInput.disabled = false; // 一時的にdisabledを解除
  });
});
```

ただし、このアプローチはJavaScriptが有効でない場合には動作しないため、注意が必要です。

# まとめ
フォームのinput要素にdisabled属性を指定すると、その値がサーバーに正しく送信されないという問題がありますが、readonly属性の利用やJavaScriptを使用した対応などが考えられます。開発者はプロジェクトの要件やセキュリティに基づいて適切な方法を選択することが重要です。
G2レポートでInstanaの評価が高い理由（InstanaのUI）

# はじめに 
こんにちは。
Instana Observability Advent Calendar 2023 22日目の投稿です。

私はInstanaについて学習中で、主にデモ環境を使用しています。
今回は、G2レポートの調査結果でInstanaの評価が高い理由について知りたいと思い、調査することにしました。

初めてInstanaを使用する方の参考になれば幸いです。

# 背景
Instanaは、G2によるSpring 2023 Application Performance Monitoring Grid ReportやSummer 2023 AIOps Platforms Grid Report等でリーダーに選出されています。下図のように、Instanaは高い顧客満足度を示しています。

![AIops.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698772/531f717e-3a05-8ba0-2ab2-c8d7891c56b5.png)

![APM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698772/43785aed-5250-e534-e566-b0fcea052b9c.png)

理由としては、主に以下の点が挙げられています。
・初心者でも使いやすい
・シンプルで分かりやすいUI
・セットアップが簡単
・問題原因の究明や影響範囲の特定が非常に容易
・ダッシュボードのカスタマイズが可能

Instanaのデモ環境を使用して、UIが見やすく操作しやすいと思ったので、今回は「InstanaのUI」にフォーカスして取り上げます。

# InstanaのUI
ここからは、Instanaのデモ環境のサイトを例に説明します。
デモ環境では、Instana利用時の状況を想定し、デモ用Webサイトの環境・各種ログ・性能情報が反映されています。

下図のように、左メニューからInstanaの各項目にアクセス可能です。

![Instana_Demo1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698772/452db0e4-0e3e-68a8-e30f-e3a1e5b75bd0.png)

各項目の詳細は、上から順に以下のようになります。

（１）Websites & Mobile Appsエリア
　　　• ページビュー
　　　• ページ読み込み時間
　　　• サイト診断結果

（２）Applicationsエリア
　　　• 呼び出し回数
　　　• レスポンス時間
　　　• エラー率

（３）Kubernetesエリア
　　　Instanaが管理しているコンテナの一覧

（４）Infrastructureエリア
　　　• ホスト名
　　　• OS
　　　• CPU数
　　　• CPU使用率

（５）Analysisエリア
　　　システムリクエストごとの挙動

（６）Eventsエリア
　　　イベント種別ごとの単位時間当たりのイベント発生件数

通常のAPMの画面だとメニューやUIが複雑になりがちですが、Instanaは主要な6メニューだけに集約されています。

左メニューのアプリケーションボタンをクリックして、Robotshopを選択すると下図のような画面に切り替わります。Robotshopは、Webショップを模したサンプルのアプリケーションです。

![UI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698772/e7a5ecd9-d4df-6856-d22a-3320fc3910b7.png)

アプリケーションの状態を横並びで表示できるので、関連性を同時に確認できます。1画面で以下の情報を確認できるのが特徴です。

・呼び出し回数
・エラー回数
・平均待ち時間
・インフラの問題や変更点
・よく使われているサービス
・処理時間

このようにInstanaはUI表示がシンプルで機能も分かりやすいので、初心者や非エンジニアの方でも手軽に使用できます。

# おわりに
いかがでしたでしょうか？
今回はG2レポートの調査結果をもとに、InstanaのUIについて記載しました。

初心者の方がAPMというキーワードを聞くと、難しく感じるかもしれません。
Instanaは画面構成が非常にシンプルなので、初心者の方でも簡単に操作できます。

ありがとうございました。
【Spring Boot】Beanクラスの使い分けを理解して実装する

Java歴がもうすぐ2年になるため、普段曖昧にしていたBeanクラスの違い（DTO、From、Entity、Modelなど）を、正しく理解して実装してみようと思い、調べて実装してみました。

理解できると色々とスッキリするので、まだ違いがわからない方はしっかり理解しておくと良いと思います。

参考になりましたら幸いです。

間違っている箇所などがございましたら、ご指摘よろしくお願い致します。

https://taikis-blog.vercel.app/blog/Java
生成AIオプション詳説：メールに含まれるワンタイムパスワードを抽出して入力する

2023年10月に、AeyeScanにChatGPTの技術を導入した「生成AIオプション」をリリースしました。

> 「生成AIを活用した脆弱性診断」に関する特許を取得並びに、取得した特許技術をもとにAeyeScanの新たな機能をリリース
　https://www.aeyesec.jp/post/pr_20231010_generativeai

このオプションを適用することで、設定、巡回、スキャン、レポートの各項目で生成AI技術の利点を享受できます。この記事では、生成AIオプションを利用した巡回機能の一つである、ワンタイムパスワードの入力機能について解説します。

## ワンタイムパスワードを利用した認証
ワンタイムパスワード(OTP)とは、有効期限が短い使い切りのパスワードのことです。通常のパスワードと異なり、基本的に認証の度に値が変わるため、使用済みのパスワードが流出した場合も、それを悪用することが難しいという特徴があります。
OTPを利用者が確認する方法の例として、サーバが特定のメールアドレスやSMSなどに送信する方法や、トークンと呼ばれる小型の端末に表示する方法などがあります。

## Chat GPTを利用してワンタイムパスワード入力を自動巡回する流れ
OTPを利用した認証には様々な形式がありますが、今回AeyeScanの自動巡回で対応できるようになったものは、フォームにメールアドレスを入力するとそのアドレスにメールでOTPが通知され、それを次の画面で入力するような構造のサイトです。
対応できるサイト構造と、自動巡回で作成される画面遷移図の大まかなイメージは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/feeaf0b3-36a7-cee3-b845-4c2597d06ba4.png)

このようなサイトを自動で巡回するためには、メールの中からOTPを探し出す必要がありますが、メールの文面もOTPの形式もサイトにより異なるため、ロジックのみで実現することは困難です。そこで、AeyeScanではこの工程にChat GPTを利用しています。

AeyeScanがChat GPTを利用して、メールを解析してOTPの入力機能を自動で巡回する流れは以下のようになります。
1. メール入力フォームを判別して、AeyeScan管理下のメールアドレスを入力する
1. AeyeScan管理下のメールアドレスを監視し、メールの文面を確認する。
1. メールの文面を解析し、OTPを抽出する
1. OTPの入力フォームを判別し、3で抽出したOTPを入力する

次に、各工程の実現方法について述べます。
「1. メール入力フォームを判別して、AeyeScan管理下のメールアドレスを入力する」、「2. AeyeScan管理下のメールアドレスを監視し、メールの文面を確認する。」の二項目については、AeyeScanの既存の機能として、既にロジックにより実現済みです。
「3. メールの文面を解析し、OTPを抽出する」については、先に述べた通りChat GPTを利用してメールの文面を解析しています。
「4. OTPの入力フォームを判別し、3で抽出したOTPを入力する」については、フォームを形成するタグの属性などを元にロジックで実現しています。

## Chat GPTによるメール文面からのワンタイムパスワードの抽出
ここで、実際にChat GPTを利用して、メール文面からOTPの抽出を行ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/15f524dd-094a-ecdd-9bd7-5e732dbe0974.png)

このように、Chat GPTを利用することで、メールの文面を解析し、その中に含まれるOTPを判別することができます。

このプロンプトから入力形式、出力形式を整え、APIから実行することで、メールの文面からOTPの抽出を行っています。
また、AeyeScanで実際に使用するにあたって、API呼び出し回数を減らす仕組みや、OTPが存在しない場合の処理などを組み込んでいます。

## 抽出したワンタイムパスワードの入力
Chat GPTを利用して、メールの文面からOTPを判別して抽出することができました。
続いて、OTPの入力箇所の特定および入力実行を行う必要がありますが、これには以下に示す３つの課題があります。
- どのページにOTPの入力フォームが存在するかを特定する
- 同じページ内に複数のフォームが存在する場合、どのフォームがOTP入力フォームか特定する
- 入力フォームが一文字ずつ区切られている場合でも入力できるようにする

まず、OTPの入力フォームが存在するページはメールアドレス入力フォームを送信した次のページである、としています。AeyeScanの自動巡回ロジックとして、元々画面遷移の流れを記録しているため、メールアドレス入力フォームの入力後のページを特定することができます。

次に、同じページ内に複数のフォームがある場合に、どこにOTPを入力すべきかの特定についてです。「OTPの入力フォームである」、という特徴を特定することは難しいため、フォームの属性などを元にOTPの入力フォームではなさそうなものを除外することで対応しています。

最後に、入力フォームが一文字ずつ区切られている場合についてです。このような形態のフォームに対して入力値パラメータを一つ一つ指定しようとすると、以下のような判別を行う必要があり非常に困難です。
- 入力フォームには何文字入力できるのか
- どこからどこまでがOTPの入力フォームに該当しているか

一文字ずつ区切られているタイプの入力フォームは、多くの場合一文字入力するごとに自動で次のフォームにカーソルが移動します。そのため、人間がブラウザからこのようなフォームに入力する時には、カーソル移動操作をせず、通常のフォームと同様に文字入力しています。
AeyeScanでは、キー入力操作をシミュレートすることでフォーム送信を行っているため、人間が一文字ずつ区切られたフォームに入力する操作にも対応が可能です。

## まとめ
以上、生成AIオプションのスキャン機能のうち、OTP入力機能について解説しました。
AeyeScanの機能について更にご興味のある方は、こちらをご覧ください。
https://www.aeyescan.jp/
ChatGPTとTwitter APIを組込んだPythonプログラムでXに自動ツイートする

今回はXへの投稿をChatGPTにツイート文を書かせて自動投稿させるプログラムを開発してみます。
ChatGPTに対するプロンプトやパラメータを外部ファイルから取得したり、これをタスクスケジューラ等から自動実行したりすると便利ですが今回は割愛しています。

まずはTwitter APIを[ここから取得します。](https://developer.twitter.com/)

:::note info
APIキーには以下の５種類がありますので取得したら環境変数等に設定しておきましょう。
API Key
API Key Secret
Access Token
Access Token Secret
Bearer Token
【Sign up for Free　Account】から取得して下さい。
:::
#### １．ChatGPTにTweet文を書かせるコード
get_twitter.py
```python
import openai
import os

# 環境変数からOpenai APIキーを取得する
openai.aip_key = os.environ["OPENAI_API_KEY"]

# ChatGPTによるツイート作成関数
def make_tweet():
    request = "私はAIを研究する企業を経営しています。私に代わってTwitterに投稿するツイートを150以内で作成して下さい。\n\nツイート作成の際は以下の文章を参考にして下さい。\n\n"

    tweet1 = "例文1:私ChatGPTは浦田さんに代わってPythonプログラムからツイートしています。"

    tweet2 = "例文2:私のfacebook'https://www.facebook.com/UrataSoft'もよろしくお願いします。"

    content = request + tweet1 + tweet2

    response = openai.chat.completions.create(
        
        model="gpt-3.5-turbo",
        temperature=0,
        messages=[
            {"role": "user", "content": content},
        ],
    )

    return response.choices[0].message.content
```
#### ２．Xに接続しツイートさせるコード
bot_twitter.py
```python
import tweepy
import os

# 環境変数からTwiiter APIキーを取得する
consumerKey = os.environ["TWITTER_CONSUMER_KEY"]
consumerSecret = os.environ["TWITTER_CONSUMER_SECRET"]
accessToken = os.environ["TWITTER_ACCESS_TOKEN"]
accessTokenSecret = os.environ["TWITTER_ACCESS_TOKEN_SECRET"]
bearerToken = os.environ["TWITTER_BEARER_TOKEN"]

# ツイート作成関数
def post(tweet):

    client = tweepy.Client(
        bearerToken,
        consumerKey,
        consumerSecret,
        accessToken,
        accessTokenSecret
    )

    client.create_tweet(text=tweet)
```
#### ３．１と２の関数を呼び出し実際にツイートするコード
tweet.py
```python
import gpt_twitter
import bot_twitter

tweet = gpt_twitter.make_tweet()
bot_twitter.post(tweet)
```
早速、この３のコードを実行してみます。
$ python tweet.py

以下の様にツイートされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/091391e4-4b30-3497-14d0-937ea6461e28.png)
【供養】2023/12/26 LLM Night

:::note warn
<font color="white">
2024アドカレで供養しようとしたものの後回しになったスライド記事だが、１年間の変化を見るという意味では面白かったので捨てずに公開する
</font>
:::

---

ちょうど一年前のスライド資料。
今年(追記: 2024年)はgammaを使ったりしたので、(追記: 2023年当時は)Qiitaで書く（マークダウンを使う）手法もまだまだ浅かったなと反省。
過去の自分と今の自分を振り返って力をつけたなぁ、と振り返るには良い記事になった。

---

# 👏皆様とのご縁に拍手👏

---

## スライドの取り扱い
本スライドのカメラ・録画OKです（当日の会場内利用に限ります）
Qiitaの限定公開を使用しています（QR参照）

![スクリーンショット 2023-12-22 13.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/fe5ab101-f85b-90a5-24d5-da1a4b9fa155.png)

---

## 私の概要
| 中 翔 | nomuraya名義で活動しています |
| --- | --- |
| ポジション | フリーランス<br>エンジニア/DX/IT講師 |
| 出身 | 大阪 |
| GenAIとの接点 | システム開発 |
| 最近の関心事 | メタバースx教育<br>デジタルツインx育児 |
| 本日の抱負 | DX教育においてGenAIをどう扱うべきか意見交換したい！ |

---

### ChatGPTハッカソン参加！
![スクリーンショット 2023-12-22 12.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/9e9ca52f-369a-a0ec-b4da-6fc888dfd751.png)

https://note.com/build_weekend/n/n2403919d358c

---

### アドベントカレンダー2023
![スクリーンショット 2023-12-22 12.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/16fc59c8-4fb9-de4f-196c-5baafb210633.png)

https://qiita.com/advent-calendar/2023/nomuraya_oreno

---

## 講師ならではのGenAIの話
(2023/4〜6月研修内調査)
- ChatGPTをはじめ生成AIを知っているか？
  - 知っている: 70%ぐらい
  - 知らない: 30%ぐらい
- 生成AIを使った事があるか？（重複あり）
  - ChatGPT: 30%ぐらい
  - 画像系(Stable Diffusionやそれ以外): 10%ぐらい
  - その他: 1人

https://prtimes.jp/main/html/rd/p/000000052.000033607.html

---

## オンライン名刺
![スクリーンショット 2023-12-22 12.34.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/603de3f5-3340-6f47-71b4-83670e0e7055.png)

---

# 🍷楽しみましょう🍺
BizRobo!ド初心者の私に役に立つ観念とコツ4選

[BizRobo!ド初心者の私に役に立つ観念とコツ3つ](https://qiita.com/FoxInmyArms/items/df86cf5ac9ef2c011122)の第2弾の感じです。
ロボット作成の練習をしながら、やはり「これを覚えておけば楽だな」と思うコツがちょこちょこ出てきますのでシェアしたいと思います。
コツなので深入りはせず、なるべく簡単な説明にさせてください。深掘りしたい方はリンクをご参考ください。

## 1. 3つ覚えたら多少楽になる正規表現
正規表現：文字列のパターンを表現するための特殊な記述法であり、文字列の検索や置換、パターンの一致判定などの文字列処理を行うために利用されます。
概念は分かりやすいですが実際書くときには難しいことが多いです。今時はChatGPTを活用すれば覚えなくてもよいかもしれませんが、下記3つはやはり覚える方かいいな、と思いますので紹介します。
### 1)	.*
（改行以外）文字列の中で任意の部分を一致させるためのパターンで、ゼロ回以上の任意の文字列を含む文字列にマッチします。
例：お知らせ.* 
"お知らせ"に続いて任意の文字列が続く場合に一致します。
例えば、以下の文字列はこの正規表現に一致します：
お知らせ`内容`
お知らせ`更新中`
お知らせ`詳細情報`

### 2)	\
\（バックスラッシュ）は、その文字をそのまま解釈するエスケープ文字です。コンポーネントを修正する時よく使います。
例：\\\.
“.”の前に“\”を追加すると、“.”自体を文字列の一部としてマッチングさせることができます。

### 3)	^と$
こちらは文字列の位置を指しています。
^は、文字列の先頭に一致する正規表現メタ文字です。^の読み方はキャレットです。
例：^お知らせ
これはは`お知らせ`で始まる文字列にマッチします。
$は文字列の終端に一致する文字です。
例：com$
こう書くと、"com"で終わる文字列にマッチします。

他にもたくさんあります。もっと詳しく読みたい方は[記事：変数操作などを行う際の「パターン」で使用する正規表現](https://knowledge.bizrobo.com/hc/ja/articles/360032156911-%E5%A4%89%E6%95%B0%E6%93%8D%E4%BD%9C%E3%81%AA%E3%81%A9%E3%82%92%E8%A1%8C%E3%81%86%E9%9A%9B%E3%81%AE-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)をご確認ください。

## 2. スペースに注意！
正規表現と関わっていますが、アプリケーションやコンポーネントのファインダー文字列を書くとき、スペースが入れられたら読み取れません
書き方の例として：
svg[class*="text-yellow-400"]（Ｏ）
svg[class* = "text-yellow-400"]（X）

エクスプレッションは書くときはスペースを入れてもかまいません。
変数+1（O）
変数 + 1（O）

私は見やすいにするためスペースを入れる習慣がありますが、最近この差を気づきました。よく開発している方たちは慣れていると思います。

## 3.レコーダービューにあるの色のブロックの意味？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/95367362-4576-90ae-ac58-cf6deacf6a02.png)
 
レコーダービューの一番下にある色のブロック、それぞれ意味があります。少し整理しました。
黒色：表示される画面、数字はマウスの居場所です。座標（x,y）は表示されている画面の左上を(0,0)として計算されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/4c493748-9f0f-7d27-5e61-aa2212d470b1.png)
 
紫色：画像認識したい時の範囲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/41590daf-107b-e4b2-176c-89166f041ea8.png)
 
緑色：今選択中（仮置き）のもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/5f8e3f3b-fc11-5278-eccd-ce849aa0a764.png)
 
オレンジ色：定義され（選択確定）、後続のアクションの処理対象、ループの範囲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/1222063f-3bd6-255a-1469-ec60319e2042.png)
 
青：ループされるもの（定義された要素）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/8c4b4b53-1ac3-89e0-c4e5-b59e53c057b5.png)
 

## 4. 「ここまで実行」はダブルクリックで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336621/2c84f276-9f10-a3a5-2102-797bda43c702.png)
 
ロボットをテストする時、よくマウスの右クリックをし、「ここまで実行」を選択します。
それはもちろん何も問題ありませんが、実はここまで実行したい場所をマウスでダブルクリック（左クリック）すると同じ動きになります。右クリック⇒選択するより早いと思います。

## まとめ
上記の4つ、いずれも覚えなくても損はなさそうですが、慣れて自然に使えればロボット開発はほんの少しだけ楽になるのでしょう。Windowsのショットカートみたいなのもですが、役に立てそうなコツがあればぜひお試しください。
Workato：ユーザー管理が行えなくなった（ユーザー一覧が表示できなくなった）場合の確認ポイント

# はじめに

Workatoでユーザー管理を行う際、`Workspace admin` をクリックすると、以下の画面が表示されてユーザー管理ができない場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/01c062fb-e0c4-5e74-e6d7-88ec64df41b1.png)


# 原因と対応方法

Advanced Recipe Management & Operation オプションを契約されている場合、ワークスペースの環境が次の通り３つに分かれます。ユーザー管理機能は「Development」へ環境を切り替えることで利用することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d5e443a4-a789-fe62-fff1-be2e5e3b22c5.png)

「Development」へ切り替え後、再度 `Workspace admin` をクリックすることで、次の通りユーザー管理が行えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4219a28e-7a49-e98c-8b4c-b4018e7a2581.png)


上記は、Workatoを使い始めて間もない方においてははまりやすいポイントであり、Workatoを普段から利用されている方においても、Workatoでのレシピ開発・メンテナンスの合間に、久しぶりにユーザー管理を行おうとする際にハマることのあるポイントでもあります。小ネタではありますが、そのような方の参考になりましたら幸いです。
整数が2の補数表現ではないプロセッサはもう考慮しなくていいか

釣り記事を書いて勉強したいわけではないのですが。

C言語では整数型の実現方法として。2の補数表現、1の補数表現、または符号ビット方式のどれかでなければならないことになっています。

https://qiita.com/a4lg/items/541c9d9dd5d874eeef2f

Fortran や C++ では決めていないので、決めてくれるのはありがたいことです。でも、2の補数表現ではないコンピュータって実際あるんでしょうか。

https://stackoverflow.com/questions/12276957/are-there-any-non-twos-complement-implementations-of-c

2015年発売の UNISYS 2200 が最後のようです。もういい加減サポートも終わったのではないでしょうか。

なお、GCC は２の補数表現しかサポートしていないそうです。

https://gcc.gnu.org/onlinedocs/gcc-12.3.0/gcc/Integers-implementation.html

もういいでしょう。2の補数を前提にしてプログラムしたことで後悔することはまずないし、そこが決まることで思考が大いに節約になります。
Rustのマクロにおけるスライス型の扱いについて

:::note info
この記事は、[はじめてのアドベントカレンダー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/first-time) の21日目です。
:::

少し考えれば当然の話ですが、これのせいで1時間程溶かしたので共有します。

<details><summary>記事執筆時点の環境</summary><div>

```shell-session
awayume@assam:~/programming/playground/rust-slice-sample$ cargo -v -V
cargo 1.73.0 (9c4383fb5 2023-08-26)
release: 1.73.0
commit-hash: 9c4383fb55986096b414d98125421ab87b5fd642
commit-date: 2023-08-26
host: aarch64-unknown-linux-gnu
libgit2: 1.6.4 (sys:0.17.2 vendored)
libcurl: 8.2.1-DEV (sys:0.4.65+curl-8.2.1 vendored ssl:OpenSSL/1.1.1u)
ssl: OpenSSL 1.1.1u  30 May 2023
os: Ubuntu 22.04 (jammy) [64-bit]
awayume@assam:~/programming/playground/rust-slice-sample$ rustc -v -V
rustc 1.73.0 (cc66ad468 2023-10-03)
binary: rustc
commit-hash: cc66ad468955717ab92600c770da8c1601a4ff33
commit-date: 2023-10-03
host: aarch64-unknown-linux-gnu
release: 1.73.0
LLVM version: 17.0.2
```
syn:  v2.0.41
</div></details>

:::note info
この記事では `syn` を使用することを前提としています。
また、unsafe Rustは使用しないという条件での内容です。
:::

# スライス型とは
この記事をどうぞ。

https://qiita.com/Awayume/items/4771e71f73f143961e48

この記事において重要なのは、基本的に**スライスは常に参照されなければならない**[^1]という点です。
# 型を扱う
マクロで型を扱う例として、導出マクロでstructの型を処理してみましょう。

## ダメな例
```rust
use proc_macro::TokenStream;
use syn::{parse_macro_input, Item, Struct, Type};

#[proc_macro_derive(SampleDerive)]
pub fn parse_type(input: TokenStream) -> TokenStream {
    // struct以外を弾く
    if let Item::Struct(ast) = parse_macro_input!(input) {
        let ident: Ident = ast.ident;
        for field in ast.fields {
            let field_ident: Ident = field.ident.unwrap();
            match field.ty {
                Type::Slice(_) => /* 処理 */,
                _ => unimplemented!(),
            }
        }
    }
    // 省略
}
```
```rust
#[derive(SampleDerive)]
struct MyStruct {
    sl: &[u8],
}
```

### 何がダメなのか
このコードは意味がありません。何故なら、フィールドの型が「スライス」である場合を捕捉しようとしているためです。

スライス型はあくまでも `[T]` です。`&[T]` ではありません。
unsafe Rustを使用しないとき、スライスはそれそのものを定義できず、常に参照を通して定義しなければなりませんが、それはあくまでも「スライスの参照」なのです。
実際に定義することはできませんが、「スライス」という型は確かに存在します。

上のコードが機能するためには、次のようなコードが必要です。

```rust
#[derive(SampleDerive)]
struct MyStruct {
    sl: [T],
}
```

このコードの場合でもコンパイルは通ります。
しかし、実際にこのstructを使うためには、unsafe Rustを使用して自身でメモリ安全を保障する必要があります。
(@kazatsuyuさんの[指摘]()を受け修正)

## 正しい例
```rust
use proc_macro::TokenStream;
use syn::{parse_macro_input, Item, Struct, Type};

#[proc_macro_derive(SampleDerive)]
pub fn parse_type(input: TokenStream) -> TokenStream {
    // struct以外を弾く
    if let Item::Struct(ast) = parse_macro_input!(input) {
        let ident: Ident = ast.ident;
        for field in ast.fields {
            let field_ident: Ident = field.ident.unwrap();
            match field.ty {
                Type::Reference(tref) => {
                    if let Type::Slice(_) = *tref.elem {
                        // 処理
                    }
                },
                _ => unimplemented!(),
            }
        }
    }
    // 省略
}
```

このコードでは、参照型を捕捉した後、その元の型がスライスであるか調べています。

# まとめ
- スライス型は `[T]` であり、`&[T]` ではない
- スライス型を捕捉したいときは、まず参照型を処理する必要がある

[^1]: 厳密に言うと可能です。その場合unsafe Rustを使用し自身でメモリ安全を保障する必要があります。
AIを活用したデータ分析プロジェクトで非エンジニアのお客様とのコミュニケーションを成功させるには？

## はじめに
AI開発プロジェクトに関しては、すでに開発手法がまとめられており、その内容を参考にプロジェクトの計画・実施をすることができます。昨年度私が携わったAIを活用したデータ分析プロジェクトにおいても、公表されている開発手法を参照しながらプロジェクトを実施しました。問題なくプロジェクト終了できました、といいたいところですが、非エンジニアのお客様とのコミュニケーションについて、さまざまな失敗をし対策を立てて解決してきました。技術的な課題を解決するより難しくプロジェクトメンバー全員で悩む時間が多かったので、今回はエンジニアではないお客様とのコミュニケーションについて経験値をまとめてみました。

## どのようなプロジェクトだった？
AIを活用したデータ分析の仕組みを作成し、実際にデータ分析を行いレポートにまとめるというプロジェクトでした。
ある分野でAIを活用して新たな観点でデータ分析をしていきたい、というゆるい感じでプロジェクトが開始されました。要件の明確化と目標設定、AIが検出するデータの定義、統計処理や分析手法の検討、レポート形式や可視化方法を毎週の会議でディスカッションしながら決定していく、という進め方です。会議でのコミュニケーションが非常に重要であったというわけです。
## 非エンジニアのお客様とのコミュニケーションで有用であったこと
**プロジェクトキックオフ時に信頼関係形成開始**
- 人となりを知ってもらうアイスブレイク的な話などを用意し、親しみをもってもらい話しかけやすくする
- わかりやすい説明を心がけ一方的に話さず、お客様の発言は傾聴する
- お客様への興味を示し、他人事のような話し方はしない

**ビジネス目標に対応したストーリーで説明する**
- AIを利用した分析で評価軸〇〇を数値化することで、より高評価の期待できるビジネスプランを作成可能、という内容を作成し分析結果の利用の流れや重要性をわかりやすく説明する

 **わかりやすい資料作成・説明**
- 図や表を用いて説明したい情報を視覚的に提示することで理解を進める
- 複雑な概念を説明したい場合にもなるべくシンプルな図で表す
- ヒアリングの際は適切な回答がすぐ得られるよう、順番や選択肢工夫した資料（ヒアリングシート）を作成する
- プロジェクトの中で重要な成果については強調して説明し、「腹落ちした」状態でお客様社内に成果として説明できるようになっていただく

**適切な用語の使用**
- 専門用語や技術用語はできるだけ避け、一般的な言葉で説明する
- プロジェクト内で専門用語を使用する場合には説明を実施、用語集を作成しておき、いつでも参照できるようにする

**プロトタイプ作成・デモンストレーション実施**
- プロトタイプを作成し、デモンストレーションを実施することで、実際の動作や結果を視覚的に示して効果をわかりやすくし、理解を深める

**お客様が受け身にならないよう行動をおこしやくする**
- 会議にてお客様が質問や意見を発言しやすいような雰囲気をつくる
- 質問にはわかりやすい回答を心がける
- お客様が不明瞭と感じている点があれば積極的に補足説明を行う
- お客様の意見を取り入れるようプロジェクト内で仕組みを作成しておく
- 定期的に実施中ステップでの成果物（説明資料等）に対するフィードバックを確認し、誤解や課題を早期発見できるようにする

## おわりに
経験値としてまとめてみると、プロジェクトマネージャーやコンサルタントとして心がけること、エンジニアがやってしまいがちな失敗を防止することが含まれていると思っています。
ビジネス目標によりそい、技術的な側面をわかりやすく説明していくことで信頼関係を築いていきます。その上で目標を共有してパートナーとして協業しながらプロジェクトを進めていけるよう努めることが重要と感じました。同様のプロジェクトを現在実施中ですので、さらに充実させていきたいと考えています。
OpenAIとServiceNowの連携(要約・コードチェックの実装手順)

# 1. はじめに
みなさんこんにちは、三井情報株式会社です。

[前回の記事](https://qiita.com/Mariko_Tada/private/8d80ff7e0b817bba3abb)ではOpenAIとServiceNowの翻訳の実装手順について紹介しました。
今回は要約・コードチェックの実装手順について紹介します。

# 2. 連携の実装手順
## 2.1 文章の要約
文章の要約は、翻訳と同じOpenAI API「Create chat completion」を使用して検証しました。
翻訳と同様の手順で実装します。
①インシデントレコードを作成します。
②要約処理を実行させます。
　この時、要約対象はインシデントのDescriptionです。
 ③要約結果はカスタムしたカラム"要約"に格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/f7108e52-6d94-66a1-badd-130c021fcdb8.png)

REST Messageは翻訳の処理と同様に実装し、chatへの指示文を要約用の文章に変更するのみで文章の要約が可能です。
``` javascript
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "system",
      "content": "You are given a sentence and your job is to summarise it"
    },
    {
      "role": "user",
      "content": "${summaryResult}"
    }
  ]
}
```

## 2.2 コードチェック
コードチェックも翻訳と同じOpenAI API「Create chat completion」を使用して、スクリプト欄のコードチェックを検証しました。
チェックボタンを押下することで、入力したスクリプトをOpenAIにレビューしてもらうことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/e1170b5b-c94e-f9c9-6e52-e98f815adcff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/726b4765-feab-c89f-35d8-d0b0edcd37a4.png)

REST Messageは翻訳の処理と同様に実装し、chatへの指示文を変更するのみでコードのチェックが可能です。
ここでは、Userから渡されたソースを調査すると宣言します。
``` javascript
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "system",
      "content": "ServiceNowのビジネスルールに作成したスクリプトの修正方法を調査します。スクリプトを提示してください。"
    },
    {
      "role": "user",
      "content": "${scriptChk}"
    }
  ]
}
```
UIアクションにて実行する処理はビジネスルールで作成したものと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/92d10bda-b241-bef6-5e6d-0813d66f4f33.png)

```javascript
var script = current.getValue("script");
var scriptJSON = JSON.stringify(script);

// OpenAI APIへのリクエストを生成
var openaiRequest;
var responseBody;

// システムプロパティに格納されているAPIキーを取得
var APIKey = gs.getProperty("u_vancouver_pt_openai_skm");

// RESTMessageを呼び出す
openaiRequest = new sn_ws.RESTMessageV2("u_vancouver_rm_openai_skm","chat_completions_scriptChk");
openaiRequest.setStringParameterNoEscape("scriptChk",scriptJSON);
openaiRequest.setStringParameterNoEscape("APIKey",APIKey);
openaiRequest.setHttpTimeout(60000);

// OpenAI APIを呼び出し
response = openaiRequest.execute();
responseBody = response.haveError() ? response.getErrorMessage() : response.getBody();
var status1 = response.getStatusCode();

var responseObj = JSON.parse(responseBody);

var summarizedDescription = responseObj.choices[0].message.content;
```

※sn_ws.RESTMessageV2についての詳細情報は以下のリファレンスサイトをご参照ください。
https://developer.servicenow.com/dev.do#!/reference/api/vancouver/server/sn_ws-namespace/c_RESTMessageV2API


# 3. おわりに
如何でしたか。
今回は、ServiceNowとOpenAI APIの連携の文章の要約・コードチェックの実装手順について紹介しました。
まだまだServiceNowとOpenAI APIの連携でできることはあると思うので、検証したらまた紹介したいと思います。

最後までお読みいただき、ありがとうございました。
rex0220 計算式プラグイン 文字列に対応したチェックボックスを選択

計算式プラグインで、文字列に対応したチェックボックスを選択する例です。

# 概要

要件の文字列に記述されたキーワードに対する区分の選択を行います。

- 大型車：大型,10トン,10t,タンクローリー,トレーラー
- 油圧ショベル：ユンボ,パワーショベル,ショベルカー

キーワードにより、複数の区分にマッチする場合があります。
"小型ショベルカー" -> 小型車。油圧ショベル

![2023-12-22_11h41_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/26d41841-b5a9-a658-104a-2842573475b3.png)

# 操作例

![2023-12-22_11h47_57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8b20ace7-c870-1354-35f5-0b8ddd95b655.gif)

# 計算式プラグイン設定

```.js
// 区分 CHECK_BOX
LET(
  str, ASC(要件,"an"), // 半角数字
  keys, ARRAY(  // "選択肢|key|...",
    "大型車|大型|10トン|10t|タンクローリー|トレーラー",
    "中型車|中型|8トン|8t|6トン|6t|4トン|4t",
    "小型車|小型|3トン|3t|2トン|2t",
    "油圧ショベル|ユンボ|パワーショベル|ショベルカー"
  ),
  cat, ARRAY_MAP(keys, x, REPLACERE(x, "\|.*", "")),
  ARRAY_FIL(cat, x, idx,
    TESTRE(str, ARRAY_GET(keys, idx))
  )
)

```
【PostgreSQL】シグナル送信について

## 初めに
PostgreSQLのプロセスに対して、シグナルを送信することで特定の操作を行うことができます。以下に、PostgreSQLでよく使用されるシグナルをいくつかまとめていきます。

## SIGHUP（ID:1）
このシグナルは、PostgreSQLプロセスに対して設定ファイルの再読み込みを要求します。このシグナルは、設定ファイル（`postgresql.conf`や`pg_hba.conf`）を更新した後に、その変更を反映させるために使用されます。

``` bash
pg_ctl reload
```

または

``` sql
SELECT pg_reload_conf();
```

## SIGINT（ID:2）
このシグナルは、一部のPostgreSQLプロセスに対して特定の操作を中断するように要求します。
Ctrl+Cなどでシグナルを送れる。
例えば、`pg_dump`コマンドの実行を中断するためにSIGINTを使用することができます。

``` bash
kill -INT [プロセスID]
```

## SIGKILL（ID:9）
プロセスに対して即時終了を要求します。このシグナルは、プロセスによって捕捉や無視、ブロックすることができないため、プロセスは必ず終了します。

ただし、SIGKILLは強制的にプロセスを終了させるため、データの破損や予期しない副作用を引き起こす可能性があります。そのため、このシグナルは最終手段としてのみ使用されるべきです。

PostgreSQLにおいては、通常、SIGKILLをPostgreSQLのプロセスに対して送信することは推奨されません。これは、データベースの整合性を保つために、PostgreSQLのプロセスが行う重要な終了処理をスキップする可能性があるからです。

もし、PostgreSQLのプロセスを終了させる必要がある場合は、まずはpg_terminate_backend()関数を使用するか、SIGTERMシグナルを送信して、プロセスが適切に終了処理を行う機会を与えるべきです。

特定のプロセスに対してSIGKILLを送信するには、以下のようにkillコマンドを使用します。

``` bash
kill -9 [プロセスID]
```
`-9`はSIGKILLのIDである9を指定してSIGKILLを送る

## SIGSEGV（ID:11）
プロセスが不正なメモリアクセスを試みたときにシステムから送信されます。これは通常、プロセスのバグやシステムの問題を示し、プロセスはこのシグナルを受け取ると強制的に終了します。

`SIGSEGV`は"Segmentation Violation"の略で、セグメンテーション違反（メモリの保護された領域への不正なアクセス）を示します。これは通常、ポインタの誤った使用や配列の範囲外アクセスなどによって引き起こされます。

PostgreSQLにおいては、`SIGSEGV`が発生した場合、通常はバックエンドプロセスが強制的に終了し、クラッシュダンプが生成されます。それは通常、システムのバグや、ハードウェアの問題を示します。

`SIGSEGV`はプロセス自体が生成するものではなく、システムがプロセスに対して送信するため、`SIGSEGV`を手動で送信することは通常ありません。

## SIGTERM（ID:15）
プロセスに対して終了を要求します。このシグナルは、プロセスが自身の終了処理（開放すべきリソースの解放など）を行った後に終了することを可能にします。

PostgreSQLでは、`SIGTERM`はバックエンドプロセスに対して現在のクエリを終了し、そのプロセスを終了するために使用されます。PostgreSQLのバックエンドプロセスは、`SIGTERM`を受け取ると現在のクエリを中断し、必要な終了処理を行った後に終了します。

また、PostgreSQLの主プロセス（postmaster）に対して`SIGTERM`を送信すると、主プロセスは全ての子プロセス（バックエンドプロセス）に対して`SIGTERM`を送信し、その後自身も終了します。これは、PostgreSQLをシャットダウンです。

`SIGTERM`を送信するには、以下のように`kill`コマンドを使用します。

```bash
kill -TERM [プロセスID]
```

PostgreSQLのバックエンドプロセスを終了させるためには、通常、`pg_terminate_backend()`関数を使用することが推奨されます。
以下は指定したユーザー名の全てのバックエンドプロセスを終了させるSQLです。実行するにはスーバーユーザー権限が必要です。

```sql
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'ユーザー名';
```

## まとめ
- `SIGHUP`は設定ファイルの再読み込みを要求します。
- `SIGINT`は特定の操作の中断を要求します。
- `SIGKILL`はプロセスの即時終了を要求しますが、使用は最終手段に限られます。
- `SIGSEGV`は不正なメモリアクセスがあった時にシステムから送信され、強制的にプロセスを終了します。
- `SIGTERM`はプロセスの終了を要求し、PostgreSQLでは現在のクエリの終了やプロセスの終了に使用されます。
【ChatGPT無&有】に新機能。その名も“Archive”。ほかにもあり。


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

　今回は、ChatGPTの新機能をご紹介。ただし、すぐには使わないようにしてください。履歴からそのセッションが消えてしまうので。

:::note info
　本記事は、
　　ChatGPTの
　　　無料版も有料版の両方で
　　　　共通しています。

　あしからず。
:::

　まずは、いくつか。
***
　スマホアプリ版のBingが
　　ようやくCopilotになりました。

　中身は、
　　同じですけどねw
***
　それから
　　Midjourneyが
　　　バージョンアップして
　　　　V6になりましたね。

　まぁ、
　　私は使っていませんがw

　X-Twitterにアップされた画像を
　　見ましたが、人物描写のレベルが
　　　以前よりも
　　　　高品質になっています。
***
　Google Bardが
　　拡張されました。

　でも、
　　設定しないと、
　　　使えません。

　設定方法については、
　　AI大学【AI&ChatGPT最新情報】
　　　という方が、動画を作成して
　　　　らっしゃるので、
　　　　　そちらを参照して
　　　　　　みてください。
[Bard拡張機能最速徹底解析 ～GmailやYouTubeと連携可能なGoogle本気のAIチャットボット～](https://youtu.be/P6PeDwhsrXs?si=qSCdXAdv8kFvVkPj)

　なお、
　　スマホで操作される方は、
　　　ご注意ください。

　Google Bardを
　　拡張するための
　　　アイコンが出てきません。

　そこで
　　ブラウザのメインメニュー
　　　右上の“︙”←これをタップ。

　その中の
　　“PC版サイト”を
　　　チェック。

　それで
　　アイコンが
　　　出てきます。

　あとは、
　　上記の設定をしてください。

　設定が終わって
　　使ってみると、
　　　Google Workspaceにも
　　　　アクセスできました。

　Gmailで、
　　未読メールのタイトルを
　　　リストアップしてもらった
　　　　だけですけどw

　使用例というかアイディアを
　　YouTuber KEITOさんが
　　　動画を出されていますので
　　　　参考にしてください。
[【Bard神アプデ】Google MAPやGmailなど拡張機能日本語版開始【活用アイデア7選】](https://youtu.be/RBpI1dTOgmk?si=L6V7ohui2odzDQYE)

　この中では、
　　“Gmailは信用ならない”と
　　　言われています。

　まぁ、生成AIですから
　　ハルシネーションを
　　　意識しておく必要がある、
　　　　というのは、
　　　　　利用者側の常識ですね。
***
　それから
　　X-Twitterでポストされるものに
　　　“GenAI”というワードが
　　　　出てくるようになりました。

　これは、
　　Generate AIの
　　　短縮語のようです。

　日本でも
　　流行るかも？
***
　さて、
　　本題です。

　ChatGPTの新機能を
　　ご紹介します。

　ただし、
　　すぐには
　　　使わない方がいい
　　　　と思います。
***
　まずは、
　　“Archive”について。
***
***GoogleSGE***
アーカイブ（archive）は、英語で「公文書」「保存記録」「記録保管場所」「～を保管する」などの意味を持ちます。﻿
コンピュータの世界では、複数のデータを一つにまとめたり、圧縮したりして保存することをアーカイブといいます。アーカイブには、データ保全のためのものと、ファイル圧縮のためのものがあります。
***
　ふつうは、
　　“圧縮する”意味で
　　　使われます。

　でも、ここでは
　　“保管”と思ってください。
　　　その方が、理解しやすい
　　　　ですから。

　そう、
　　保管場所を変えて、
　　　管理しやすくする、
　　　　ということなんです。

　で、“何を？”となりますよね。

　それは、
　　セッションです。

　ChatGPTとのやり取りが
　　セッションです。

　それを履歴として
　　残しているわけですが、
　　　毎日何度も使ううちに
　　　　履歴はどんどん
　　　　　積み上がります。

　それを管理するのは、
　　結構大変です。

　何度も使うセッションもあれば、
　　一度しか使わなかったものも
　　　ありますからね。

　これを管理しよう、
　　というのが、
　　　今回の機能“Archive”に
　　　　なるわけです。
***
　では、
　　使い方、というか、
　　　どこにどういう風に
　　　　あるのか、を
　　　　　知ってください。

　まず、下記のやり方で
　　Archiveするセッションを
　　　選んでください。

　1.履歴を開く
　2.セッションを選択
　3.再度、履歴を開き、
　　　セッションメニューを開く。

　そこに“Archive chat”があります。

　これを選択すると、
　　履歴からそのセッションが消え、
　　　そのセッションは保存されます。

　このアーカイブされたセッションは
　　下記のやり方で、
　　　見ることができます。

　メインメニューの“設定”
　（有料版では“プラス設定&ベータ”）
　　　で、“一般”タブの
　　　　“Archive chats”に
　　　　　“Manage”ボタン。

　これを押すと、
　　新たなメニューが表示されます。

　Archiveしていないと、
“You have no archived conversations.”
　　と表示されます。

　Archiveしていると
　　こんな感じの表示に
　　　なります。
![Screenshot_20231222-110837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/79def768-1acb-2070-37a1-d4386e2403ca.png)

　次々とArchiveしていけば、
　　ここに積み上がるわけですね。

　で、
　　セッションを見たい場合は
　　　青い表示をクリック/タップ
　　　　すれば、セッションに入る。

　というのが、
　　本来の動作なのでしょうが、
　　　新たなセッションに
　　　　なってしまいます。
　　　　　バグでしょう。
　　　　　　直るのを待ちましょう。

　さて、“Manage”の
　　各箇所を説明しますね。

　と言っても
　　左下のアイコン
　　　ふたつだけですけどねw

　右側は、ゴミ箱。
　　説明いりませんねw

　左側は、“戻す”です。
　　何を？
　　　セッションを、です。

　これをやると、
　　Archiveが解除されます。

　セッションは、
　　履歴に戻りますよ。

　もちろん、
　　Archive解除なので、
　　　Manageからは
　　　　なくなります。

　とりあえず、
　　以上です。
***
　それから、
　　設定も少し変わっています。
　　　確認してみてくださいね。

　今回は、ここまで。
【VSCode】サインインしてる？環境設定の同期と楽々簡単GitHub連携を手に入れよう！

## VSCode サインインできます！

知っている人にとっては日本はJapanくらい当たり前なんですが、知らない人はマジで知らない（身の回りでやってる人少なすぎ…）のでこの記事を書きました。

VSCodeの左下にサインインできるアイコンがあるの、知っていますか…？

![スクリーンショット 2023-12-22 10.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/821500dd-17e1-9b4c-0bce-8c02e2d170c2.png)

## サインインしてできること

- `settings.json`の同期　新しいパソコンに買い替えたり別環境でも常に同じ環境を用意できます。
- 拡張機能の同期　別環境でインストールした拡張機能を自動で有効にしてくれます
- キーボードショートカットの同期
- スニペットの同期

やるしかありませんね？やりましょう！

## やり方

まず、「バックアップと同期の設定」を押します。

![スクリーンショット 2023-12-22 11.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/c73fb53e-d516-bdfd-ea73-162dae130cc8.png)

同期する情報を設定します。基本そのまま（全部チェック）でいいと思います。

![スクリーンショット 2023-12-22 11.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/84de7af7-a446-9e5f-6bb1-200967308fe5.png)

どちらのアカウントでサインインするか聞かれます。個人的にはGiHubでサインインするとGit関連の扱いが楽になるのでGitHubでのログインをお勧めします。

![スクリーンショット 2023-12-22 11.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/a041b348-cab9-9c6a-7ce7-57c36d9dbedf.png)

普通にログインします。リダイレクトを許可しますか的なウィンドウがブラウザによっては現れますが許可します。その後自動的にVSCodeでの同期が開始されます。

![スクリーンショット 2023-12-22 11.35.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/3e4fdf11-569e-60ce-9a75-54fe17aeb467.png)

しばらくしたら`settings.json`を覗いてみましょう。

![スクリーンショット 2023-12-22 11.38.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/0471a5ed-ea72-5f4f-ad13-354ba3d5b4df.png)

**同期されました!!!**

## 応用 簡単にGit Clone

ソース管理→GitHubから複製を押します。

![スクリーンショット 2023-12-22 11.40.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/89681828-015a-bdba-4c0e-c45fd155e6bc.png)

リポジトリの一覧が表示されるので任意のリポジトリを選択します。

![スクリーンショット 2023-12-22 11.42.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/6ad4f507-789c-4c1a-84d5-d8cbf2df9418.png)

任意のクローン先を選択します。

![スクリーンショット 2023-12-22 11.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/5bd241ee-d48f-10f7-0ebd-dfc4d1e7f855.png)

簡単にクローンできました！！！

![スクリーンショット 2023-12-22 11.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628782/67abda35-4de4-0596-3137-708ef9e7d453.png)

もちろんサインインが完了しているので、ssh-keygenみたいな大変なことをしなくてもコミットしてプッシュすることができます。ただしgitの`user.name`と`user.email`だけは予め指定しておく必要があります。指定していない人は、以下のコマンドをターミナルに打ち込めば設定できます。

``` zsh
% git config --global user.name "USER_NAME"
% git config --global user.email "USER_EMAIL"
```

# 終わりに

VSCodeにサインイン機能があること、GitHubとの連携が簡単になることを布教できたら嬉しいです。

この方法を使うと、どこでもすぐに普段と同じ環境を整えることができるので開発の新規のハードルが非常に下がると思います。Dockerとかと組み合わせたら多分マジで最強なのでぜひ使ってみてください。
ラズパイで物体検出 bookworm対応版

## はじめに
2024年1月時点での最新版ラズベリーパイOS bookwormだと従来の方法では無理だったので覚書

## 実行環境
Distributor ID: DebianDescription:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
#bookwormでも確認済み
Python 3.9.2
USBカメラ

## 下準備
```shell-session
$ sudo apt upgrade
$ sudo apt install git
$ sudo apt install libatlas-base-dev
$ sudo raspi-config
　1.VNCの有効化
　2.レガシーカメラの有効化（あれば）
```
OSのアップデートとgit,開発ツールのインストール。
raspi-configでVNCとカメラを有効化にしておく。

## ラズパイでカメラを使えるようにする
```shell-session
$ sudo view /boot/config.txt
# Automatically load overlays for detected cameras
camera_auto_detect=1
```
camera_auto_detect=1がコメントアウトしてたら#を外して有効化

```shell-session
libcamera-hello -t 0
```
これでカメラが動くか確認。

:::note info
libcamera-helloコマンドで動かない場合、VNCから確認できる
メディア→キャプチャデバイス→
Videoデバイス名 /dev/video0
Audioデバイス名 hw:2,0
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659211/ffea647b-6e2f-d17b-ba94-edd4738090d8.png)

## Tensorflow liteのインストール
```shell-session
$ cd /home/Username/Desktop
$ git clone https://github.com/tensorflow/examples --depth 1 tensorflow_examples
$ python3 -m pip install virtualenv
$ python --version
$ python3.9 -m venv tf　＃直前のコマンドで確認したPythonのバージョンで仮想環境を作る
$ source tf/bin/activate　★
```
★sourceを実行するとプロンプトの前に(tf)が表示される。
以降は仮想環境下でコマンドを実行する

```shell-session
(tf)$ python -m pip install --upgrade tflite
(tf)$ cd tensorflow_examples/lite/examples/object_detection/raspberry_pi
(tf)$ sh setup.sh
(tf)$ python -m pip install --upgrade tflite-support==0.4.3
```

```shell-session
(tf)$ python detect.py --model efficientdet_lite0.tflite
```
カメラが起動して、物体検出できれば成功

## 終わりに
最新版ラズパイOSだとpip関連でエラーが出まくるので仮想環境を使うのと、tflite-supportをアップグレードするのがミソ
ちなみにUSB接続ではなく、カメラモジュールだと色々試したがうまくいかず…今後の検証が待たれる。
paiza.ioでelixir その273

# 概要
paiza.ioでelixirやってみた。
コンパイラ、見つけたのでやってみた。
codegenやってみた。

# 参考にしたページ

https://qiita.com/sonota88/items/fefef95264320a903300


# 投入したコード

```
[
  "top_stmts",
  [
    "func",
    "main",
    [
    ],
    [
      [
        "var",
        "a",
        1
      ],
      [
        "while",
        [
          "==",
          2,
          3
        ],
        [
          [
            "set",
            "a",
            [
              "+",
              "a",
              4
            ]
          ],
          [
            "set",
            "a",
            [
              "+",
              "a",
              5
            ]
          ]
        ]
      ]
    ]
  ]
]
```

# 実行結果

```
call main
  exit
label main
  push bp
  mov bp sp
  add sp -1
  mov reg_a 1
  mov [bp:-1] reg_a
label while_1
  mov reg_a 2
  push reg_a
  mov reg_a 3
  push reg_a
  pop reg_b
  pop reg_a
  compare
  jump_eq then_2
  mov reg_a 0
  jump end_eq_2
label then_2
  mov reg_a 1
label end_eq_2
  mov reg_b 0
  compare
  jump_eq end_while_1
  mov reg_a [bp:-1]
  push reg_a
  mov reg_a 4
  push reg_a
  pop reg_b
  pop reg_a
  add reg_a reg_b
  mov [bp:-1] reg_a
  mov reg_a [bp:-1]
  push reg_a
  mov reg_a 5
  push reg_a
  pop reg_b
  pop reg_a
  add reg_a reg_b
  mov [bp:-1] reg_a
  jump while_1
label end_while_1
  mov sp bp
  pop bp
  ret

#>builtins

label set_vram
  push bp
  mov bp sp
  set_vram [bp:2] [bp:3]
  mov sp bp
  pop bp
  ret

label get_vram
  push bp
  mov bp sp
  get_vram [bp:2] reg_a
  mov sp bp
  pop bp
  ret
#<builtins



```

# 成果物

https://paiza.io/projects/rVh9oYqIKpLXnIc4noBUTg


以上。
インフラ技術者の生成AI勉強ノートその１

## はじめに

　ご存知のように年初から生成AIが世の中の最もHotな話題の一つになりました。筆者も最初に気にしませんでしたが、今になって流石に勉強しないとダメだと認識しました。急にPrompt Engineerになりたいと思っていませんが、少なくとも私がこの流れにどうやって一緒に乗ることができるか、今後生成AIを利用するシステムを構築しようとした時に、AIチームの作業を理解しないとちゃんとしたシステムの設計ができないのでは、と思ったのが本ノートを書き始めたきっかけです。


## やったことこと

### どこから開始すべきか

筆者はAIの基礎の研修を受けたことがあり、なんとなく生成AIとは何かは聞いたことがある程度です。この時点でのイメージとして私ができることは新たにモデルを作ることではなく、そのモデルを利用することにだと理解しました。そのモデルを利用者向けにカスタマイズすることを現在Promt Engineeringだと理解しましたので、prompt Engineerの仕事をまず理解しようとしました。

Google検索やChatGPTに何から勉強すべきかを調査しまして、以下の順の勉強が良かったです。

#### prompt Engineering Guideを参照

https://www.promptingguide.ai/jp
日本語訳のサイトでしたので、比較的に読みやすいです。

上記のドキュメントを読んで分かったつもりで、早速ChatGPTの有料プランを契約して、検証を始めました。

#### 早速検証

生成AIが私の仕事にどのように作用するかの確認がしかったので、ソースコードを読み込ませて、仕様書の出力ができるかを確認してみましたが。。。。以下のようなことに気づきました。

・　ChatGPTに正しく命令をいれることがとても重要である。
　　　ー　上記にあるドキュメントだけでは具体的にChatGPTにてどうやっていれるのが最も適切であるかなどの話がなかったため、注意点だけ気にして入力しましたが、とても想定と異なる仕様書ができました。英語ではありますが、以下のような記事を読んだ方がもう少し上手くいきます。
   https://writesonic.com/blog/chatgpt-prompts

・ GPTには入力制限があるので、入力のコツを考える必要がある
　　　ー　ここでトークンという表現がありますが、GPTは入力のトークンの制限があります。そこで、長いコードを入力するとエラーがでました。対応方法はいくつかあると思いますが、Webで公開している複数回に分けて入力方法も一つです。ただ複数回に分けて入れる際にGPTも3回ぐらい前の会話まで覚えますが、それ以降のものは覚えませんので、それも制限にぶつかります。私のおすすめとしては関数単位や他のツールとの組み合わせて分析することがより適切であるようなきがします。

・ ファインチューニングとよく聞くが、現状ChatGPTはできなさそう
　　　ー　現状ではChatGPTを私なりに学習させることができないようです。（私が利用しているのが汎用なものだからかもしれませんが）


## ここまでのまとめ
上記のような気づきでより勉強が必要であるとの結論に至りました。
次は生成AI関連の書籍を拝読する予定で、また気づきがあったら共有します。
paiza.ioでelixir その272

# 概要
paiza.ioでelixirやってみた。
コンパイラ、見つけたのでやってみた。
parserやってみた。

# 参考にしたページ

https://qiita.com/sonota88/items/fefef95264320a903300



# 投入したコード

```
[1, "kw", "func"]
[1, "ident", "main"]
[1, "sym", "("]
[1, "sym", ")"]
[1, "sym", "{"]
[2, "kw", "var"]
[2, "ident", "a"]
[2, "sym", "="]
[2, "int", "1"]
[2, "sym", ";"]
[3, "kw", "while"]
[3, "sym", "("]
[3, "int", "2"]
[3, "sym", "=="]
[3, "int", "3"]
[3, "sym", ")"]
[3, "sym", "{"]
[4, "kw", "set"]
[4, "ident", "a"]
[4, "sym", "="]
[4, "ident", "a"]
[4, "sym", "+"]
[4, "int", "4"]
[4, "sym", ";"]
[5, "kw", "set"]
[5, "ident", "a"]
[5, "sym", "="]
[5, "ident", "a"]
[5, "sym", "+"]
[5, "int", "5"]
[5, "sym", ";"]
[6, "sym", "}"]
[7, "sym", "}"]
```

# 実行結果

```
[
  "top_stmts",
  [
    "func",
    "main",
    [
    ],
    [
      [
        "var",
        "a",
        1
      ],
      [
        "while",
        [
          "==",
          2,
          3
        ],
        [
          [
            "set",
            "a",
            [
              "+",
              "a",
              4
            ]
          ],
          [
            "set",
            "a",
            [
              "+",
              "a",
              5
            ]
          ]
        ]
      ]
    ]
  ]
]




```

# 成果物

https://paiza.io/projects/-lzlrF-S7r5yJfOsJQtM1Q


以上。
Torch Linearの最適化

# 概要
linear layerの入力のshapeによって、計算効率が変わるのか気になったので調べたら、
dimensionを2(channel dimensionとその他)にするとmultiplicationとadditionが同時に行われて、速くなるらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/807f011f-268e-7492-342f-8ae357dffe64.png)

次は並列化への影響があるのか調べてみたい。

# 参考文献
https://github.com/pytorch/pytorch/blob/4b97ed2ed89eb9d86efa86b97e7a84fc40edcac0/torch/csrc/api/include/torch/nn/functional/linear.h#L23
[解決済み]Laravelでのルートが定義されていないエラーの解決方法

# 

本記事では、Laravelアプリケーションにおいて、「not defined」というエラーが表示され、特定のルートが定義されていない場合の解決策を紹介します。エラーメッセージが発生する状況は、「routeディレクトリー内にあるweb.phpで指定したルートが正しいにもかかわらず、Not Foundが表示される」場合です。以下の手順に従って問題を特定し、解決することができます。

## **エラーの内容**

以下は、エラーが発生する状況の例です。

```php
phpCopy code
Route::get('/dashboard', function () {
    return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');

```

![not.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300625/e9e873d1-a8e3-0289-6b5a-7e9ca7edd565.png)

## **解決策**

エラーの原因として、publicディレクトリー内に同名のフォルダが存在し、そちらを参照していた可能性があります。例えば、「dashboard」という名前のフォルダが存在すると、ルートが正しく機能しないことがあります。この場合、フォルダの名称を変更することで問題を解決できます。

## **確認と修正した項目**

以下は、問題を特定し解決するために行った手順です。

1. **タイポの確認:**
    - ルートの名称や指定内容にタイポがないかを確認しました。
2. **php artisan route:listの実行:**
    - ターミナルで **`php artisan route:list`** コマンドを実行して、アプリケーションに登録されているすべてのルートのリストを確認しました。
3. **キャッシュのクリア:**
    - 最近ルートを追加または変更した場合、Laravelのルートキャッシュが更新されていない可能性を考慮し、キャッシュをクリアしました。
4. **ターミナルのタスクキル:**
    - Laravelアプリケーションに変更があった場合、ターミナルで動作しているプロセスが古いまま残っている可能性があります。必要に応じて、ターミナルのタスクキルを行いました。


## **参考記事**
PHP serverで「Not Found The requested resource / was not found on this server.」が出たときの対処法

https://qiita.com/aisplay/items/360fe2b6d0d4f9bf5518
この記事では、PHPサーバーで「Not Found The requested resource / was not found on this server.」というエラーが発生した場合の対処法について解説されています。

Laravel 4: The requested resource /admin was not found on this server

https://stackoverflow.com/questions/25031736/laravel4-the-requested-resource-admin-was-not-found-on-this-server
このStack Overflowの質問では、Laravel 4アプリケーションで「The requested resource /admin was not found on this server」というエラーに対する解決策が探られています。他の開発者たちが提供したアドバイスや解決法を参考にできます