OmniAICreator/Qiita-1.07M huggingface dataset:
Client Actionでfetchしてみた


こちらの郵便番号WebAPIを使用させていただきます
https://anko.education/webapi/zipcode
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/cea15430-1a73-1339-790d-d7cab39deea7.png)
とのことです

---
Screenを右クリック、Add Local VariableでVarZipcodeを作成

ScreenにInputを配置し、VarZipcodeを設定

ScreenにButtonを配置、ダブルクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/f00fb05c-d528-8bf3-1bc7-087828a67e43.png)

JavaScriptを配置、VarZipcodeを渡し、その上のJavaScriptをダブルクリック（または...をクリック）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/21156380-055c-99ff-2957-09691a997b00.png)

Parametersを右クリックして、Add Output Parameter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/5afaadab-6e30-7955-a16d-bc9256a9f6d1.png)

JavaScriptを記述します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/330c5c23-a335-c22b-1724-9d80878add32.png)

私はJavaScirpt歴は深くないのでコピペです
fetchは非同期らしくresolveを入れたらなおりました
エラー処理も？？？なので、その点、注意してください
```JavaScript
 let txt = "https://api.anko.education/zipcode?zipcode=" + $parameters.VarZipcode;
 
  func1 = async function (){
    let result = await fetch(txt);
    let text = await result.text();
    console.log(text);

    $resolve();

    $parameters.Out1 = text;
    
  }
  func1();
  ```
次に戻り値を格納するStructureを作成
DataタブのStrecturesで右クリックして、Add Structure from JSON...
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/9afefa60-3801-6180-38d7-57c616e9ae6d.png)

戻り値のjsonをコピーして
https://api.anko.education/zipcode/?zipcode=1130033
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/6c2859a9-5a2e-b7ea-9761-f6306bf39d54.png)

こちらにペーストします
名前はaddress
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/9a5ffbfd-1919-2d1a-4a4e-1a575374103c.png)

JSONが解析されて、Structureが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/7ee92f1f-8f63-af2e-4692-3006a4e1605e.png)

Screenを右クリックし、Add Local VariableでVarAddress
Data TypeをAddress
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/c63691e2-0592-3c6d-1dc2-aeb9c43e2b98.png)

JavaScriptの下にJSONDeserializeを配置
JavaScript.Out1をAddressにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/2c34a4a6-2b68-10ec-f09e-3eb511021caa.png)

Assignを配置
VarAddressにJSONDeserializeAddress.Dataを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/22f8db3b-97a7-6a1c-19d1-2686a77b46a6.png)

ScreenにExpressionを５つ配置
VarAddressの５つの項目が表示されるようにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/1f976469-e13e-ace1-22a2-3f623d44e427.png)

存在する郵便番号を入力して、ボタンを押すと、住所が表示されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/ebdfe09b-cc18-f6fb-04bb-59eb9400fcc2.png)

存在しない郵便番号を入力して、ボタンを押すと、エラーになりました
エラー処理が必要と思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/ea396b1b-156b-a98b-bfba-feba6968e579.png)
神奈川県高校出願システムの設定の不備を説明できないから勉強してみた

## 概要
1月9日頃からX上で「神奈川県公立高等学校入学者選抜インターネット出願システム」でGoogleドメインのアドレスへのメール不着が発生し、受託会社の設定が問題視されました。
X上で設定方法が炎上しましたが、正直「〜が問題であって、〜したら良かった」という解決方法を説明できないので、私も批判を受けるレベルだなぁと思って、すぐに勉強しました。
この記事は、そのアウトプットですので、間違っている認識の箇所がありましたら、温かい目でお知らせください。

### 前提
この記事は、今回、問題になった設定箇所を取り上げています。
基本の範囲をはっきりと定義できませんが、基本的なメールサーバーの処理等は記載していません。

### 事例
#### 1. MXレコードについて
https://twitter.com/xplntr/status/1747139490521731424?s=20
> 神奈川県高校出願システムだけど、何気にMXレコードをみたらとんでもない設定ミスしてる。こんな基本的な事に気づかないなんてダメでしょ。

このツイートの指摘、何がダメで、どうしたら良いパターンになるのでしょうか？

まず、良いパターンです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321920/07412fad-62e2-fc11-4fa8-a2f334feff09.png)
※ 2024/1/24 コメントにて上図の宛先が「hoge[]somebady.com」になっているとの指摘がありました。こちらは誤記でしたので、この場で「hoge[]somebody.com」と訂正させていただきます:bow_tone1:
<br>
1. hoge[]somebody.com宛にメールを送ります
1. mail.fukushima.comメールサーバがDNSサーバのMXレコードのsomebody.comの情報を依頼します
1. mail.somebody.comが返却されます
1. DNSサーバにAレコードのmail.somebody.comの情報を依頼します
1. IPアドレスが返却されます
1. mail.somebody.comメールサーバにメールを送信します

ざっくりですので、異論は認めます。

神奈川県高校出願システムの場合です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321920/ddaec768-3fcc-adae-f798-93ecb8b40123.png)
<br>
1. hoge[]shutugankanagawa.com宛にメールを送ります
1. mail.fukushima.comメールサーバがDNSサーバのMXレコードのshutugankanagawa.comの情報を依頼します

「、、、MXレコードにshutugankanagawa.comに紐づくmail.shutugankanagawa.comがないじゃないか！？」

「AレコードにIPアドレスを登録しているか」や「優先度は合っているか」など諸問題はあるかと思いますが、「これが原因？」かと調べていて思っています。

#### 2. SPF、DKIM、DMARCについて
https://x.com/buellxb12s/status/1745241003932729848?s=20
> 神奈川県の公立高校出願がシステム化されたけど、そりゃGmailには届かないよな。昨日先生から話しあった通りiCloudのメール使うか。
>
> DMARCの判定NGじゃん。
この設定についても調査してみました。

##### SPF（Sender Policy Framework）とは

> SPFとは、正規のIPアドレスからメールが送信されたかどうかを認証する送信ドメイン認証技術です。
> 引用元：https://www.nri-secure.co.jp/glossary/spf#:~:text=SPF%E3%81%A8%E3%81%AF%E3%80%81%E6%AD%A3%E8%A6%8F%E3%81%AE,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

SPFで、IPアドレスの認証はできているようですね。

##### DKIM (DomainKeys Identified Mail)とは

> DKIM (DomainKeys Identified Mail)は、 電子メールにおける送信ドメイン認証技術の一つであり、 メールを送信する際に送信元が電子署名を行い、 受信者がそれを検証することで、 送信者のなりすましやメールの改ざんを検知できるようにするものです。
> 引用元：https://www.nic.ad.jp/ja/basics/terms/dkim.html

DKIMの設定ができていないようですね。
DKIM認証がないからGmailにメールが届かなかったのかなと思っていますが、2024年2月以降に「SPF」と「DKIM」の規制が強くなるそうですので、DKIMの設定は違うのかな〜と。

##### DMARC（Domain-based Message Authentication, Reporting, and Conformance）とは
> Domain-based Message Authentication, Reporting and Conformance (DMARC)は、電子メール認証プロトコルの一つ。電子メールのドメイン所有者が、保有するドメインを認証を通さずに利用されること(なりすましメール、フィッシングメール、詐欺メールその他の脅威)を防止できることを目的に設計された。
>引用元：https://ja.wikipedia.org/wiki/DMARC

DMARCは、検証に失敗した場合の挙動を制御する仕組みですので、今回の件への関わりはないかな〜と思っています。

2024年1月のGmailの仕様ですとメールが届かない可能性や設定に問題もありますが、本件の原因にはならないかなと考えています。

## 最後に
神奈川県高校出願システムの件があり、なんとなく知っていたメールの仕組みを改めて学習する機会になりました。
ただ、にわか知識で本記事を書きましたので、間違っている認識があるかも知れませんので、温かい目でご指摘ください。

この記事は、現在所属している会社のSlackにも投稿しようと思います。
ですので、知識の叩き台として、「この記事、ここの認識はこうじゃない？」とか、「この記事ではこう書いているけど、違っていそうだから調べてみよう」とか、メンバーの知識を深める踏み台にしてもらえれば良いかなと思っています。

何かご指摘がありましたら、コメントやSlackで連絡ください:bow_tone1:

まだこの件やメールについては調査していきたいので、また追記するも知れません。

よろしくお願いします:grinning:
【備忘】コードレビューでやること・やらないこと

GitHubのPRベースでコードレビューをする現場に入ったので、改めてコードレビューについて自分用にまとめておく

# 
レビューによるコードの改善はレビューアとレビューイの共同作業。
コードレビューにおいて最重要なのは、敬意と礼儀。お互いを尊重することが大切。
レビューは、レビューイを助けるためのプロセス。

レビューの重要な目的はコードベースの可読性を高く保ち、一定の生産性を維持すること。
レビューイの助けになることと、生産性を維持することのバランスをとる上で重要な４つのポイント。

- レビュー依頼を放置しない
- 問題のあるプルリクエストを拒否する
- 締切を意識しすぎない
- 「提案」以外のコメントを考慮する

### レビュー依頼を放置しない

- レビュー依頼を受けた時、入るまでに最初の返信をするかという期限を、チームのルールとして決めておく
  - レビューをする期限ではなく、あくまでも返信の期限にすると良い
  - 優先度の高いタスクを大量に抱えていて、すぐにレビューできないような時は、レビューの返信期限までに自分がどういう状態なのかを伝えることが大切
  - 実際にはレビューできないのに「レビューできる」と返信するのは避けるべき

### 問題のあるプルリクエストを拒否する

- プルリクエストが大きすぎる場合や基本的な設計が間違っている場合など、大きな問題のあるプルリクエストは一旦クローズしてもらい、新たに作り直してもらうことも必要
- その場合は、どのように分割するかや、構造について焦点を絞ってレビューするなど、必ずフォローアップをすること

### 締切を意識しすぎない

- 「忙しい」「締め切りが近い」などの理由でレビューの品質を下げるべきではない
- レビューのプロセスを急ぐ必要がある場合はその理由を説明してもらう
    - 場合によっては、仕様の変更で対処できたり、機能実装を次回のリリースに延期できる可能性もある
    - レビューイが「絶対に期限までにマージしなくてはならない」という先入観にとらわれているケースもあるので、より広い視野でレビューを
- どうしても急がなければならない場合は必要に応じて以下を実施する
    - 後でどのようにコードを改善するか、大まかな方針の合意をとっておく
    - その場しのぎのコードに対するコメントとテストを残しておく
    - イシュー管理システム上で「将来のコード改善」のチケットを作成しておく

### 「提案」以外のコメントを考慮する

- レビューコメントで改善の提案を行う場合、具体的かつ明確な内容を書く
- ただし、コメントで詳細を詰めようとすると多くの時間をかける必要があるためレビューアとレビューイの負荷のバランスが崩れてしまうので注意
- どの程度具体的な提案をするかの段階の例
    - 問題点がないか確認を促す
    - 問題点を指摘する
    - 問題点とその再現方法や理由を提示する
    - 問題を解消するための手法をいくつか提示する
    - 問題を解消するための最適な手法を提示する
    - 問題を解消するためのコードを定案する
- 問題点のハッケイン以前にコードで不明な点がある場合はレビューイに質問する方が効率的
- 指摘内容を伝えるにしても、質問をするにしても必ずしもレビューコメントを使う必要なく、対面の議論やチャットなども選択肢に入れる
    - その場合は議論した内容や結論を要約してレビューコメントに残しておく

また、GoogleのChromiumプロジェクトのレビュー指針、「尊敬に満ちたコードレビュー」も参考になる

## コメント（指摘）の内容

- プログラミング原則
- 命名
- コメント
- 状態
- 関数
- 依存関係
- コーディングスタイル・コーディング規約・言語やプラットフォーム固有のイディオム
- テストコードや動作の確認手段
- プルリクエストやコミットの大きさ・構造
- タスクそのものの目的・範囲
- コードの複雑性と達成したいことのバランス
- バグやセキュリティ上の欠陥
- パフォーマンスやフットプリントの変化

ただし、上記の中で静的解析ツールなどによって自動で指摘できるものはできるだけツールに任せること
また、「気が付かないうちにコードベースの可読性が下がっていた」という状況を避けるため、変更があったコードだけでなく、周辺のコードや依存関係のあるコードも確認する必要がある

コードレビューは設計的な妥当性に重点を置いてレビューする

### 参考書籍

- 読みやすいコードのガイドライン 石川宗寿 著
- 良いコード／悪いコードで学ぶ設計入門 仙塲大也 著
【初心者向け】INNER JOINしてみた結果どうなるの？

## なんとなく背景
始めまして、株式会社ジールのSOです。

SQLに触れ始めてから7年目になりましたが、
実務中の経験を踏まえ、改めていろんな構文を考え直したいと思います。
初心者のみならず、少しご参考になることがあれば大変嬉しいです！
※今回はSnowflake環境を利用しますが、結果は変わらないと思います。


## まずは、～INNER JOIN編～

###### INNER JOINとは
INNER JOINは2つ以上のテーブルからデータを結合するSQL構文の一つです。 この結合方法は共通のキーを持つ行のみを抽出し、それらを結合して新しい結果セットを作成します。 結果として得られるテーブルには結合条件を満たす行だけが含まれるため、データが一致しない行は除外されます。
だそうです。

###### (・・?
共通のキーを持つ行のみを抽出と言ってますが、
片方にキーが重複する場合結果セットはどなるの？
両方にキーが重複する場合結果セットはどうなるの？
イメージ全然ないので、「TEST_NAME」と「TEST_ADDRESS」2つのテストデータを利用し見ていきます。


###### ①結合キーに重複がない
👇TEST_NAME　結合キーに重複ない
![test_name.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/60fc8028-e089-89cd-8793-9804544259ed.png)
👇TEST_ADDRESS　結合キーに重複ない
![test_adress.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/9c7dcda2-1b5a-f726-07d0-82ad4beb5c42.png)
👇結果セット
無難に普通の3行の結果セットが作成されましたね
![test_name.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/93fe2ccb-72b9-0439-af59-d6fdb29e4cc8.png)


###### ②片方テーブルの結合キーに重複あり
👇TEST_NAME　結合キーに重複ない
![test_name.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/b693a58d-8a14-01ca-a8b7-d539ce58f730.png)
👇TEST_ADDRESS　結合キーに重複あり
「ID=1」レコートが2行存在する
![test_adress2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/b24a8973-342c-aed0-a641-66c7673b2b11.png)
👇結果セット
花子さんのレコートが2行になり、4行の結果セットが作成ましたね
![result2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/68c1c659-b2ce-b072-460f-aaa8750aea9c.png)


###### ➂両方テーブルの結合キーが重複あり
👇TEST_NAME　結合キーに重複あり
「ID=1」レコートが2行存在する
![test_name2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/34da6ca1-63dc-ed04-293f-a03f91ce1ee8.png)
👇TEST_ADDRESS　結合キーに重複あり
「ID=1」レコートが2行存在する
![test_adress2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/284941fc-ce63-0a13-a593-2e45c49083d6.png)
👇結果セット
「ID=1」のすべての組み合わせパターンで結果セットが作成されて、なんかわけわからないですね
![result3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529165/4be9c110-ff03-cdd7-79d7-9ecb716fc62e.png)


## 結論
レコードを一意に識別できるようなカラムを利用して結合を行えば問題ないかと思いますが、
データ要件や実務中で忘れがちなので、上記のような事象が起こりうるのではないかと思いますね。

いかがでしょうか。～
「なるほど！」と「それはそうでしょう」と思う方それぞれいらっしゃると思いますが、
今回の検証みたいな少し変わったSQLで改めて理解を深めることができたら嬉しいです！

## ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area
音でモータ回転数を同定したい

# 背景
謎のモータが転がっていたので、これが何Vで何回転かを調査しようとした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/a0405584-6ff4-964d-f465-1fb82560f326.png)

調べるとモータ回転数音をFFTすることで回転数が得られるということだったが、
このアプリではいまいち回転数を算出できなかった。

https://apps.apple.com/jp/app/giri-the-rpm-checker/id849558016

仕方がないのでMatlabを用いてPCのマイクで音を拾い、それらをFFT解析し、そのピーク値を取ることで回転数が得られないか調査した。

# 作成コード
audiorecoreder で　44.1kHzでサンプリングし、それらを自作FFT関数で
解析するソフトです。

```matlab

recObj = audiorecorder(44100, 16, 1);
recDuration = 5;
disp("Begin speaking.")
recordblocking(recObj,recDuration);
disp("End of recording.")

play(recObj);

y = getaudiodata(recObj);

%%
[Frequency,Power,Phase_deg] = fftFitSampling(y,44100);

subplot 211
plot(y);

subplot 212
plot(Frequency, Power);

```

# 結果

上が取得したデータ（横軸,サンプル数@44.1kHz、縦軸V? )
下がFFT解析した結果（横軸,周波数、　縦軸　電圧？）

376Hz付近にピークが来た。376*60= 22560rpm がこのときの回転数か？なんとなくそれっぽいけど
あっているかどうか確かめる方法がない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915299/9837c657-49f9-b5ad-837c-790dc728b97e.png)

# 最後に
どなたかモータ回転数調べる　良い方法を教えてください。
無料でできる！AppwriteのOAuthカスタムドメインにまつわる設定。

Firebaseと似たサービスである[Appwrite](https://appwrite.io)を最近使用し始めており、情報共有のために記事を書きます。

Firebaseではカスタマイズドメインを使用するにはBlazeプランへの移行が必要ですが、Appwriteでは無料プランでもカスタマイズドメインを利用できます。これにより、GoogleのOAuth2を使用する際にも独自のドメインを表示でき、見栄えが良くなります。カスタマイズドメインが使えないとhttps://[PROJECT-ID].firebaseapp.com のようなユーザーに警戒感を与えるURLが表示されて、あまり見た目がよろしく有りません。

カスタムドメインの追加は[https://cloud.appwrite.io/console/[PROJECT-ID]/settings/domains](https://cloud.appwrite.io/console/[PROJECT-ID]/settings/domains)から簡単に行えます。また、PlatformのOverviewタブからHostnameの項目を探して、カスタムドメインを追加する必要があります。これによりOAuthログイン時のリダイレクトがカスタムドメインでも動作するようになります。

コーディングの際には、setEndpointの引数にappwrite.[カスタムドメイン]のような形で指定する必要があります。また、OAuthログインの成功時と失敗時のリダイレクトURLも必要になります。こちらのURLはローカルとプロダクション環境で変更できるよう環境変数等で対応すると良いと思います。


```javascript
import { Client, Databases } from "appwrite";

const client = new Client();

const databases = new Databases(client);

client
    .setEndpoint('https://appwrite.customdomain.com/v1') // Your API Endpoint
    .setProject('5df5acd0d48c2') // Your project ID
;

// Go to OAuth provider login page
account.createOAuth2Session('google', [LINK_ON_SUCCESS], [LINK_ON_FAILURE]);
```
https://appwrite.io/docs/references/cloud/client-web/databases
IBMの(現在は全IBM講座)一部講座がCoursera plusに加わった！CourseraはIBMから学びたい人のさらに有力な選択肢に。

IBMの講座は長らくcoursera plusに含まれていませんでした。以下の記事(2024/01/21じてん)でもIBMはcoursera plusの対象外と出ています。

![スクリーンショット (1203).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/770430bb-012e-dd93-ac4e-180bde529a41.png)

けれど最近coursera plusに[IBM Full-Stack JavaScript Developer Professional Certificate]が下記の通り加わったようです。

![スクリーンショット (1204).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/9fe51f21-27b2-7158-2efa-571930659a5c.png)

IBMはudemy for skillsbuildにて無料で学びの場を提供しています。今後courseraのサブスクリプションにも加わったということです。IBMもcourseraを重要拠点として考え始めたということでしょうか。

coursera plusはAmazon Google Meta Microsoftがcoursera plusの講座を提供しており、質の高い学習を提供しています。IBMもcoursera plusに加わり、学びが進化したのではと思います。

今後も学習サイトの変化に目が離せないですね！
【VALL-E-X】音声生成で、あの人に呼びかけてもらいたい

# クラウドファンディング継続中です！
**【期間】2024/1/11～1/24**
**多くの方にご支援いただけており、目標達成まであと一息のところまできています！**

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/6232e966-185d-7e6f-ce7a-3ca064bc45c7.png)


# さておき、音声生成を学ぶ。
**そのクラファンプロダクトの売りの一つでもある、音声設定について記事にします。**
既存のボイス素材を設定するも良し、ずんだもんのような読み上げソフトを活用するも良し、**音声生成に挑戦するも良し（個人利用限定！）。**

**VALL-E X**を使ってみましたので、自分用メモも兼ねて、概要をご紹介します。
詳細はクラファンのリターン内でもご案内予定です。

ある方の音声データから、
**「残念、それは残像だ」** を生成してみました（他にセリフなかったの？）

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563752/884f56bc-ac27-3fa0-1d3c-d8c5f462f2c0.png)

https://youtu.be/WSjzUEVhw8g

めっちゃ自然ですよね…！
**この技術があれば、憧れのあの人に「○○さん、頑張って！」など言ってもらうことも可能です（個人利用限定！）。**

たすかる…！
# 好きは原動力になる
**4ヶ月前まではモノづくりのモの字も知らなかった私がここまで学べたのは、好きなことをテーマにして頑張ってきたからだと思います。**　モチベーションを保つための工夫って本当に大切ですね。

クラウドファンディングへの挑戦が、この4ヶ月の活動の一区切りとなります。達成が全てではないのですが、ここまで来たからには最後まで走りぬきたいと思っています。**自分が面白いと思ったものに共感してもらえて、頑張れって言ってもらえるのって、うれしいです。**
みんなであぁだこうだ言いながら、新しくて、良いモノづくりが出来たらって思います。

**クラファンプロダクト『推しらせたすかる（からくり時計）』について、**
**「ちょっと面白いかも」と思っていただけたら、応援いただけると大変励みになります！**
**『推しらせたすかる』『#推しらせたすかる』、よろしくお願いします！**

https://camp-fire.jp/projects/view/731102?utm_campaign=cp_po_share_c_msg_mypage_projects_show
【HTML】リンクをクリック時、新規ページを別タブで開くようにする

# はじめに
通常、`a`タグで作成したリンクをクリックすると、
別タブを開かずに現在のタブでページを開き遷移してしまう。
本記事では、リンクをクリック時に新しく別のタブでページを開く方法を紹介する。


# 対象の方
- タイトルに興味を持った方
- リンクをクリック時に別タブで開く方法を知りたい方

# ソース
以下の`a`タグ部分に記載しているように、
`target`属性に`"_blank"`を指定することで別タブを開けるようになります。

```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 現在のタブでページを開いてしまう -->
    <a href="hogelink">ほげほげ</a>

    <!-- 新しいタブでページを開くことができる -->
    <a href="hogelink" target="_blank" >ほげほげ</a>
</body>
</html>
```

:::note info
#### 補足：便利なショートカット
上記のHTMLのひな形はvsCodeで作成しました。
vscodeのHTMLファイル（□□.html）では`!`＋tab補完のショートカットで、
ひな形を生成することができます。
:::
Pypiにモジュールを公開 2024年版



以下の神記事の手順で、Pypiに自作モジュールを公開しようとしたのですが、途中でエラーが出てしまいました。

https://zenn.dev/k0kishima/articles/7a977bd2dd055e

なんとか公開できたので、その手順を記録しておきます。

## ライセンスの設定〜パッケージのビルドまで

上記の記事のとおりにやればOKです。

## パッケージのアップロード

Pypiがユーザー名とパスワードでの認証を廃止したため、APIトークンを使う必要があります。

### 1. APIトークンを取得

Pypiの"Account settings"からAPIトークンを取得します。（"API tokens"の"Add API token"をクリック）

### 2. `.pypirc` を以下のように書き換える。

```
[distutils]
index-servers =
  pypi

[pypi]
repository: https://upload.pypi.org/legacy/
username = __token__
password = pypi-(取得したAPIトークン)
```

usernameが`__token__`になっていることに注意してください。

### 3. 公開
あとは、以下のコマンドでアップロードできます。

```bash
twine upload --repository pypi dist/*
```
[Python]内包表記のif文でelseの場合何もしない処理を入れたい時

## 本記事の目的
**内包表記の if 文で，条件に当てはまらない (else) の場合，何もしない処理 (pass)をしたい**

例）
条件「偶数」の時，その数字をリストに格納し，
「偶数」でない場合 (else) ，何もしない (pass)

```Python
ans = [i if i % 2 == 0 else pass for i in range(10)]
# 下記のリストを作成したい
# [0, 2, 4, 6, 8]
```

実際にこれを実行すると以下のように怒られます．

```Python
 File "<file_name>", line 7
    ans = [i if i % 2 == 0 else pass for i in range(10)]
                                ^
SyntaxError: invalid syntax
```

「無効な文法です」と怒られました...

## 結論

「if」を for の前ではなく後ろに記述する．

```Python
ans = [i for i in range(10) if i % 2 == 0]
# エラーが起きずに下記のリストが作成される
# [0, 2, 4, 6, 8]
```

これで目的が果たせました．
よかったです．

## 反論
とここで，ふと考えてみます．
else の場合は何もしないのであれば別に pass は記述しなくて良いのでは？
そもそも else は要らないのでは？
と思いましたので実行してみます．

```Python
# はじめにやろうとしてたこと (a)
ans = [i if i % 2 == 0 else pass for i in range(10)]

# else と pass を無くす (b)
ans = [i if i % 2 == 0 for i in range(10)]
```

では，(b) だけ実行してみます．

```Python
 File "<file_name>", line 9
    ans = [i if i % 2 == 0 for i in range(10)]
           ^
SyntaxError: expected 'else' after 'if' expression
```

「いや，if の後には else くるでしょ」と怒られました...

## 解説
ということで，下記を解説します．

```Python
# これは if の後に else を書かないと怒られる (A)
ans = [i if i % 2 == 0 for i in range(10)]

# これは if の後に else を書かなくても怒られない (B)
ans = [i for i in range(10) if i % 2 == 0]
```

まず，(A) と (B) の if は何だったのかですが，

- (A) : 三項演算子の if
- (B) : 通常の if 文

(A) の三項演算子の場合，「三項」というくらいなので，
下記のように a, b, c の三つの項を扱います．
なので，else が無いといわれ怒られます．

```Python
a if b else c
```

(B) の通常の if 文はご存知の if 文ですので，
else が無くても問題ないということになります．

## [補足] 三項演算子
散々「三項演算子」と書きましたが，
正しくは条件式といいます．

> 条件式 (しばしば "三項演算子" と呼ばれます) は最も優先度が低いPython の演算です。
https://docs.python.org/ja/3/reference/expressions.html#conditional-expressions

下記のように記述します．
```Python
Trueの時 if 条件 else Falseの時
```

下記が例です．
変数「B」が，
True の時変数「A」に「真」，
Falseの時変数「A」に「偽」を格納したいとします．

これを三項演算子で書くとこのようになります．

```Python
# 通常の if
if B:
    A = '真'
else:
    A = '偽'

# 三項演算子で書くと
A = '真' if B else '偽'
```

このように，条件分岐を一行で書けるのがメリットですが，
本記事のように内包表記で else が不要な時に困るのがデメリットです．
（ついうっかり忘れて解決に時間がかかります...）

## まとめ
内包表記の if 文で else の場合何もしない処理を入れたい時は，if 文を for 文の後ろに書く．

```Python
# for 文の後ろに if 文を書くと else 書かなくて良い
ans = [i for i in range(10) if i % 2 == 0]
```
Next.jsでの履歴スタック利用

## 履歴スタックとは
Webブラウザ上での閲覧履歴は、スタックとして管理されている。それを履歴スタックという。
例えば、以下のような履歴スタックがあるとする。
履歴１|履歴２|履歴３|
:-:|:--|--:|
前|現在位置|先|

履歴3から戻るボタンを押して履歴2に戻ったことを想定。
ここから先に進むボタンを押すと
履歴１|履歴２|履歴３|
:-:|:--|--:|
前|前|現在位置|

当然こうなる。もう一度戻るボタンを押そう。

履歴１|履歴２|履歴３|
:-:|:--|--:|
前|現在位置|先|

ここで、履歴2のページ内で、別のaタグのリンクをクリックしてみる。そうすると...

履歴１|履歴２|履歴4|
:-:|:--|--:|
前|前|現在位置|

履歴3がpopされ履歴4が現在位置となる。こうなると、戻る/進むボタンを押しても履歴3には当然戻れない。

## Next.jsでJavascriptのHistory API利用
Next.jsではjavascriptのネイティブなHistoryAPIを利用して、リロード無しでブラウザの履歴とURLを動作することができる。
主にユーザー体験を向上させるために利用することができる。

*メリット*
・リロードによる待機時間を減らせる
・ブックマークやURL共有時に状態を共有できる
・履歴の細かな制御ができるため開発を柔軟にできる

#### 公式より引用
> Using the native History API
Next.js allows you to use the native window.history.pushState and window.history.replaceState methods to update the browser's history stack without reloading the page.

>pushState and replaceState calls integrate into the Next.js Router, allowing you to sync with usePathname and useSearchParams.

>window.history.pushState
Use it to add a new entry to the browser's history stack. The user can navigate back to the previous state. For example, to sort a list of products:

``` javascript
'use client'
 
import { useSearchParams } from 'next/navigation'
 
export default function SortProducts() {
  const searchParams = useSearchParams()
 
  function updateSorting(sortOrder: string) {
    const params = new URLSearchParams(searchParams.toString())
    params.set('sort', sortOrder)
    window.history.pushState(null, '', `?${params.toString()}`)
  }
 
  return (
    <>
      <button onClick={() => updateSorting('asc')}>Sort Ascending</button>
      <button onClick={() => updateSorting('desc')}>Sort Descending</button>
    </>
  )
}
```

https://nextjs.org/docs/app/building-your-application/routing/linking-and-navigating#using-the-native-history-api
それ，numpy で書かない？--5--

## それ，numpy で書かない？--5--

Python ではリストがよく使われる。また，for ループが遅いのでリストに特化したリスト内包表記も推奨されることが多い。

それなりの根拠があるからではあるが...

課題：リストではなく一次元配列を使う

副次効果：他の部分のプログラムもシェープアップされる

以下の記事を素材とさせていただき，
https://qiita.com/Kazuma-Nakano/items/8294f96698e792614a9b

以下のように書き換えてみる。

```python
import numpy as np
import matplotlib.pyplot as plt

def plot(l_inf = 20, K = 0.3, color = "black"):  # 繰り返し処理をまとめる
    t = np.arange(0, 25, 0.1)  # 簡単に，刻みを細かくできる
    lt = l_inf*(1 - np.exp(-K*t))  # ベクトル演算できる（組み込み関数を使おう）
    ax.plot(t, lt, color=color, label="K=" + str(K)) 

fig, ax = plt.subplots()
ax.set_xlabel('t')  # x軸ラベル
ax.set_ylabel('lt')  # y軸ラベル
ax.grid() # 罫線を引く

plot(20, 0.3, "black")  # 条件を変えて描画するのが簡単にできる
plot(20, 0.5, "red")
plot(20, 0.7, "blue")

ax.legend(loc=0)

plt.show()
```
![output_2_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/60145419-40ad-72c0-6588-4d0f7d81d53e.png)
Next.jsでapp-index.jsでCannot render a sync or defer <script> outside the main document without knowing its order. Try adding async="" or moving it into the root <head> tag. エラーが出る

# はじめに

スクリプトを埋め込まないといけないGoogle AdsenseやGoogle Analyticsなどでコンソールにエラーが出たのでまとめます

# 問題

以下の実装をしたところコンソールにWarningが表示されるようになりました

```tsx
  return (
    <html lang="jp">
      <script async src={`https://www.googletagmanager.com/gtag/js?id=${process.env.NEXT_PUBLIC_GA_ID}`}></script>　# 追加
      <body>
        <Header />
        <div className="pb-8 md:pb-20">{children}</div>
        <Footer />
      </body>
    </html>
  );
```

```
app-index.js:32 Warning: Cannot render a sync or defer <script> outside the main document without knowing its order. Try adding async="" or moving it into the root <head> tag.
    at html
```

# 解決方法

```tsx
  return (
    <html lang="jp">
      <head>
        <script async src={`https://www.googletagmanager.com/gtag/js?id=${process.env.NEXT_PUBLIC_GA_ID}`}></script>
      </head>
      <body>
        <Header />
        <div className="pb-8 md:pb-20">{children}</div>
        <Footer />
      </body>
    </html>
  );
```

**head**タグで囲むことでWarningが消えました！

# おわりに

これのせいで他のスクリプトもうまくいっていないと勘違いしてしまいました
普段からコンソールにエラーが出ていないか確認してすぐに対応したほうがいいなと思いました
Docker超入門

# はじめに

Dockerについて学ぶ機会があったので、学んだ内容を自分なりに言語化してみました。Dockerを始めて使う方やDockerの簡単な概要を知りたい方は、参考になるかもしれません。

# Dockerとは

コンテナ型仮想環境を作成・実行・管理するためのプラットフォーム。
コンテナ型仮想環境はアプリケーションとその実行環境を１つにまとめあげて動作させる技術のこと。簡単に言い換えると、コンテナはアプリケーションに必要な物をまとめた箱のこと。自身のPC上で独立した環境（コンテナ）を作成することができる。
アプリケーションの開発環境を複数人で共通化できるため、「AさんのPCでは動くけど、BさんのPCでは動かない。」といった問題を避けることができる。

https://o2mamiblog.com/docker-beginner-1/

# 仮想とは

実際の物理的な環境（実際のコンピュータ）を模倣して作成された環境のことを指す。Dockerにおける「仮想」は、物理的な制約から独立した環境を提供し、アプリケーションの実行と管理を可能にする。この仮想環境を利用して、アプリケーションの開発を行う。

# 従来の仮想化とDockerの違い

- 従来の仮想化：1つの物理サーバー（実際のコンピュータ）上に複数の仮想マシンを作成する。仮想マシンは、コンピュータ内で別のコンピュータのように機能するソフトウェア。それぞれの仮想マシンには、異なるOS（オペレーティングシステム：コンピュータが基本的な機能を実行するためのソフトウェア）がインストールされる。これにより、1つの物理サーバー上で異なる環境の仮想マシンを同時に実行できる。
- Docker：1つの物理サーバー上に複数の軽量で独立したコンテナを作成する。コンテナは、特定のアプリケーションと、そのアプリケーションが適切に動作するために必要なプログラムやライブラリ（コードの集まり）だけを含む環境。コンテナはホストOS（物理サーバー上で直接実行されるOS）のカーネル（OSの中心部分で、ハードウェアとソフトウェア間の通信を管理する部分）を共有し、より効率的に動作する。

![docker_diff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935364/ac24b744-3ed4-59c3-9353-4287c25559f2.png)
引用：https://lab.sonicmoov.com/development/server/docker-tutorial/

Dockerは従来の仮想マシンよりも速く、軽量である。これにより、コンピュータのリソースを節約しながら、アプリケーションをすばやく立ち上げて実行できる。

# Docker関連の用語

- ビルド：`Dockerfile`（設計図）に基づいて、イメージを作成する行為。
- イメージ：コンテナを作るための設計図のようなもの。この設計図には、コンテナをどのように構築するかの指示が書かれている。`Dockerfile`をビルドすると、イメージが作成される。
- コンテナ：特定のアプリケーションと、そのアプリケーションが適切に動作するために必要なプログラムやライブラリ（コードの集まり）だけを含む環境。イメージをもとにコンテナが作成される。

![docker_build_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935364/01d047ae-57db-5786-7d19-9279c5fab5b1.png)
引用：https://www.kagoya.jp/howto/cloud/container/docker/

# docker composeの役割

特定のアプリケーションを実行するためのコンテナをまとめて管理する。複数のコンテナが協力して一つの大きな作業を行うように設定されている。

# ファイルの役割

- `docker-compose.yml`：イメージをビルドするための情報や、コンテナ起動するための情報など、アプリケーション全体の構成を定義。（上記の画像でいうと、`build`と`run`のステップを管理する。）
- `Dockerfile`：イメージの作成方法を定義。

# コマンド一覧

- `docker compose build`：`Dockerfile`をもとに、イメージをビルドする。
- `docker compose run`：イメージをもとに、コンテナを起動する。
- `docker compose up`：`Dockerfile`をもとにイメージをビルドし、そのイメージをもとにコンテナを起動する。`build`と`run`を同時に行うコマンド。`-d`オプションを追加すると、コンテナがバックグラウンドで起動する。
- `docker compose ps`：現在のプロジェクトで稼働中のコンテナの一覧を表示する。`-a`オプションを追加すると、起動に失敗したコンテナも含めて表示する。
- `docker compose exec`：実行中のコンテナに対してコマンドを実行する。
    - `docker compose exec [サービス名] bash`：該当サービスのコンテナでbashシェルを開始する。
    ※bashシェルとは、「Bourne-Again Shell」の略で、Unix系のOSで使われるコマンドラインインターフェースの一種。ユーザーがテキストベースのコマンドを入力すると、Bashシェルはそれを解釈し、適切なシステム処理を行ったり、応答を返したりする役割を担う。このシェルは、システムとの直接的な対話やスクリプト実行のためのツール。
    参考：https://tech-blog.rakus.co.jp/entry/20210525/shellscript
    
    - `exit`：該当サービスのコンテナのbashシェルを終了する。
- `docker compose stop`：コンテナを停止する。コンテナは停止されるが削除されないため、再開が可能。

https://qiita.com/nikadon/items/995c5705ff1171f7484d

# さいごに
Dockerについてざっくり解説してみましたが、いかがでしたでしょうか？正直私もまだまだ理解できていないことがたくさんあります。もし誤った内容を記載している場合は、申し訳ありません。その際は、ご指摘いただけると大変嬉しいです。最後まで読んでくださり、ありがとうございました！
「生産性が落ちたなぁ〜」と思ったときにチェックする3つのポイント

どもども、ogimanです。

今日は自分自身もしくは他メンバーの生産性が落ちているなーと思ったときにチェックする３つのポイントをメモっときます。
どれだけ客観的に物事を見れるか、そしてどれだけ解像度を高められるかで生産性を高められるぅ〜〜〜
気持ち穏やかに問題と向きあいましょい♪

実際に私がマネージメントする際に非常に意識していることなのでお役に立つはず！？:sunglasses:

# 前提
- これはogimanが勝手に思考している内容ですので、参考程度にインプットしてもらえると。
- この方法を取ったからといって、すべてが解決するわけではありません！一つのTIPSとして扱ってもらえると助かります。

# 目的
- 個人（もしくはチーム）の解像度を上げて、個人（もしくはチーム）の生産性を安定させる、もしくは最大化する方法

# 誰向け
以下の方々にとって何かヒントになると思います！
- 仕事でなかなか成果が出ていない方
- チームリーダーの方
- 入社したばかりで自身の生産性が気になる方
- 異動したばかりで自身の生産性が気になる方
- チーム・個人の生産性を上げたいと思っている方


# 現状
- もっと生産性が出せるはずなのにチームに求められる期待値に到達していない
  - 割り振られたタスクが完遂できない

# 問題
- 何が要因で生産性が出ていないのかを理解できていない もしくは深ぼっていない

# 対処
3つのバランスを意識する
![スクリーンショット 2024-01-20 11.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144316/8c2e42c4-068a-f9df-1395-1d8d2b2c32d0.png)

イメージは
1. 知識（点）を増やす
2. 行動して点を線でつなげる
3. つながると経験になる

![スクリーンショット 2024-01-20 11.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144316/8297fec3-6ff8-6e3b-6f6e-e096411bc90f.png)

この3つのどれかが足りていないと生産性が出ない気がします。
ただ、この3つだけでは解像度が荒いので、さらに分解します。

![スクリーンショット 2024-01-20 12.17.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144316/316d7ed0-0e26-20b5-6a9a-d5b6dacb64d0.png)



**知識（情報）**
ネットや書籍等から得られる一般的な情報と会社固有（もしくはプロジェクト固有）な情報がわかれます。
一般的な情報はキャッチアップしやすいですが、会社固有の情報がドキュメントに残っていなければ、人から聞く以外に知る術はなさそうです。

**行動**
思考と行動です。
この2つのバランスは非常に大事だと思っています。
仕事の進め方として、大枠を把握（仮説を立てて）して、早い段階で行動に移す、そして問題が起きたら解決方法を思考して次の行動（次の仮説を立てて）するという順番で繰り返すのが良いと思います。
大体、生産性が出ない場合は、知識（情報）や経験（想像）が足らずに悶々と思考を繰り返して行動に移せていないことが多いです。

**経験（想像）**
キャリアでの経験と会社の経験です。
様々な会社、プロジェクト、もしくは様々なポジションでたくさんの経験をしている方は視野・視座・視点が広いです。様々なユースケースを経験しているので、現場固有の情報と現場での実践があれば立ち上がりは早いです。

一方、以下の方はこれまでの知識（情報）が通用しないことが多く、一時的に生産性でないことがあります。

- 新卒
- 一つの会社（もしくはプロジェクト）の経験が長い方
- 新しい役職や役割に就く方

この場合、必要な知識（情報）と行動量を増やして、新しい経験を貯めていくことで生産性が上がります。この場合、結構な時間と労力は掛かるので焦らずに出来ることを増やして行くことが大事です。改善が見込めない場合、その会社（もしくはプロジェクト）から離れる（異動・転職）ことも手段の一つです。

## 具体的には
あるISSUEに対して、なかなかアウトプットが出ないとします。これまでの知識と経験で思考と行動を繰り返しているが答えが出ない場合、それはもしかしたら会社（プロジェクト）の情報が足らないから答えがでないかもしれないです。「そのISSUEを進めるには開発環境に個別で〇〇をインストールしないと動作しません！」みたいな。こんなときはいくら考えても答えはでないので、先輩や同僚に聞いた方が良いでしょう。
つまり、これは情報（点）が足らないので点と点が繋がらない状態です。

## 最後に
こんな感じでこの３つポイントで自分自身（もしくはチームメンバー）を解像度高くみてください。
今、自分自身（もしくはチーム）に何が足りていないのか見えてくるはずです。
チームの生産性を上げるきっかけになると嬉しいです:grin:

ではでは、良い一日を〜
【ChatGPT 3.5 Turbo】早い以外に何がある？


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

　今回は、ChatGPT 3.5 Turboを触ってみました。早い以外に、利点はあるのか？

:::note info
本記事は、ChatGPT（有料版）
3.5 Turboで行なっております。

あしからず。
:::

　ChatGPT有料版には、
　　モードがふたつありますね。

　GPT-3.5とGPT-4です。

　GPT-3.5と言えば、
　　無料版と同じで
　　　速度が早いだけ、と
　　　　思っていました。

　だから、これまで
　　ラストナレッジカットオフを
　　　知るためだけに、
　　　　触っていました。

　たまたま、GPT-4の利用制限に
　　引っ掛かってしまったので、
　　　“触ってみるか”と思って触った。
　　　　それだけのはずでした。

　まずは、
　　ラストナレッジカットオフを
　　　教えてもらいました。

　ふつうに
　　2022/01と出てきました。

　次に
　　無料版との違いを
　　　尋ねました。

　そのやり取りをどうぞ。
***
***User***
あなたは、無料版との違いをご存知ですか?

***ChatGPT***
はい、無料版と有料版の違いについてお教えできます。無料版では基本的なテキスト生成機能が利用できますが、有料版は以下の点で追加の利点があります：

1. より高度なテキスト生成: 有料版ではより高度なテキスト生成が可能で、例えば、より長いテキストを生成したり、特定のスタイルやトーンでの生成ができます。

2. 優先サポート: 有料版のユーザーは優先的にサポートを受けることができます。質問や問題がある場合、優れたサポートを受けることができます。

3. APIアクセス: 有料版のユーザーは、GPT-3モデルをAPI経由で利用できます。これにより、カスタムアプリケーションやサービスに組み込むことができます。

4. 高速なレスポンス: 有料版は高速なレスポンスを提供し、テキスト生成の待ち時間が短縮されます。

詳細な情報や価格については、OpenAIの公式ウェブサイトを確認するか、OpenAIのサポートにお問い合わせいただくことをお勧めします。

***User***
無料版にできなくて、あなたにできることを教えてください。

***ChatGPT***
もちろん、ChatGPT 3.5 Turboの有料版が提供するいくつかの特長的なことを教えます。

1. 長いテキスト生成: ChatGPT 3.5 Turboは、より長いテキストを生成することができます。無料版ではテキストの制限がありますが、有料版ではそれが緩和されています。

2. より高速な応答: 有料版は高速で、迅速なテキスト生成を提供します。無料版に比べてより素早いレスポンスが期待できます。

3. カスタムエンドポイントの利用: 有料版ではAPIを使用してカスタムアプリケーションやサービスにChatGPTを組み込むことができます。これにより、独自のニーズに合わせたカスタマイズが可能です。

4. 優先サポート: 有料版ユーザーは、優先的なサポートを受けることができます。質問や問題に対して迅速かつ効果的なサポートを提供します。

これらは、有料版の主な特長の一部です。有料版を利用することで、より多くのテキスト生成オプションと便益が得られます。
***
　長いテキスト生成？
***
***User***
長いテキスト生成についてですが、あなたとGPT-4との違いはありますか？　知識や内容は別として。

***ChatGPT***
私はGPT-3.5 Turboモデルで、GPT-4の詳細情報に関する知識は持っていませんが、長いテキスト生成に関する基本的な概念はGPT-4とも共通していると考えられます。長いテキスト生成に関しては、モデルのアーキテクチャ、トレーニングデータ、ハイパーパラメータの調整などが重要な要因です。

GPT-4がより長いテキスト生成に優れた性能を持つかどうかは、具体的なモデルの改良に依存するでしょう。新しいバージョンのモデルは通常、前のバージョンよりも性能が向上していますが、その詳細は公に発表される必要があります。

GPT-4に関する情報が利用可能になった場合、そのモデルの特長と性能について詳しく知ることができるでしょう。それに関する詳細な情報は、OpenAIの公式発表を追跡することで入手できるかもしれません。
***
　さすがに
　　わからないか。

　では、
　　昨日の問いを
　　　やってみましょう。
[【ChatGPT有】文字数について尋ねました。](https://qiita.com/kabumira/items/219ad9e40424c2400c1a)

　今回はこんな感じです。
「300文字で、✘✘✘について説明してください。」

　ChatGPT　　331
　白内障　　　265
　ガン　　　　343
　画像生成AI　391

　どちらかと言うと、
　　オーバー気味ですね(=^･^=)

　白内障については
　　これ以上の知識がない
　　　のかもしれませんね。

　ちなみに
　　ChatGPT以外は
　　　段落付きでした👍

　この結果から
　　文字数を決めて、
　　　文章作成を求める方は
　　　　GPT 3.5 Turboの方が、
　　　　　いいように感じます。

　まぁ、
　　オーバー気味なので、
　　　削る作業が煩わしいですけどw
***
　以上になります。

　どうでしたか？

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

　今回は、ここまで。
初めの挨拶

初めまして。
未経験で地方から上京し訓練学校での訓練を終えて就職しているnakaです。

３０歳になり未経験でIT業界に進み日々、業務に苦労しています。

少しでも未経験で就職を目指している方に
仕事中に起こった作業について分からないことを発信していき
SEの職に着くため知らなくてはいけないことを発信していきたいと思います。
（自分のアウトプットの為のある）

私は、物覚えが良い方ではないので職場での注意を受けることが多いのです。
（現に怒られているるので私には、向いていないのじゃないかと考えている）

せっかく今まで学習してきたのでSEを続けていきたいと思っています。

どういった事で注意を受けているのかを反面教師として捉えていただいて
今後、IT業界に就職される方に役立ててもらえれば嬉しいと思います。

どうぞ、よろしくお願いします。
HTML/CSSとJavaScriptは楽しかった話

## 1.初めに
今週は主にフロントエンドの領域の勉強をしていたので、フロントエンドを学習していて楽しかったことや思ったことなどを発信していきます。

## 2.楽しかったこと
フロントエンドを学習していて楽しかったことは、自分の書いたコードがリアルタイムで更新されWebサイトになっていったところです。バックエンド側の勉強をしているときは一通り書き終わってから、エラーなどを攻略して、ようやく動いて完成だ！みたいな感じだったのが、フロントエンドになって製作過程が直にみられるようになるので、だんだん作り上げていっている感が自分はすごく好きです。

## 3.逆に苦労したこと
苦労したことは、CSSをいじっているときに思い通りの配置に全然ならないことです。HTML/CSSを触ったことがある人は、みんな共感してくれるんじゃないかなというぐらいには、全然思い通りに動きませんでした。それで試行錯誤しながらコードを増やしていくと「前書いたこれ要らなくね？」という感じになるんですよね。なのでいずれは、コードをなるべく増やさず、必要なものだけを書いていけるように頑張りたいと思います！！

## 4.最後に
自分はまだまだReactもNode.jsもTypeScriptも、ほぼ学習していませんが、これができるようになれば、どんなWebサイトでも作れるようになると思っているので引き続き勉強を頑張っていきたいと思います！
Vuetify3でタイムピッカーを使う方法

# Vuetify3で`<v-time-picker>`が使えなくなっていた
`Vuetify2`で使えていた`<v-time-picker>`が`Vuetify3`では使えなくなっていました。

https://vuetifyjs.com/en/getting-started/upgrade-guide/#upgrade-guide

`Issues`を確認したところ、バージョン3.4の直後にリリースする予定っぽいですが、現在最新の3.5.1でリリースされていない状況です。

https://github.com/vuetifyjs/vuetify/issues/13516

# タイムピッカーを使う方法
代替案として`v-text-field`に`type="time"`を設定する方法があるようです。
```vue
<template>
  <v-form style="width: 50%; padding:10px;">
    <v-text-field type="time"></v-text-field>
  </v-form>
</template>
```
![time-picker-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1046681/5e469b1a-1280-89d9-c49f-cf22ff534672.png)

`<v-time-picker>`と同じ機能とはなりませんが、一応`Vuetify`のコンポーネントでタイムピッカーを使うことができます。

`type="time"`を`input`タグに設定できることは知っていましたが、`v-text-field`にも設定できることは知りませんでした。
あまり調べても情報がなかったのは常識だからなのでしょうか。
dayjsのタイムゾーン理解した

### 概要
###### こちらは日本時間でのみ運用したい場合や、タイムゾーン固定したい時の覚書となっています

dayjsを何気なく何も考えずに使っていると、環境によって時間がずれる！という問題が発生しました。

ローカル環境とデプロイ環境(Cloud Run)でタイムゾーンが違うことが原因だったので、これを機に、dayjsのタイムゾーンの動きをまとめたいと思います。

**※dayjsはシステムのタイムゾーンを使っています。**

### タイムゾーンとは
各地域で時差があるので、これをUTCを基準として表現するということです。
日本だと+9時間、ニューヨークだと-5時間といった形です。

### どのように設定するか
[Day.jsの公式サイト](https://day.js.org/docs/en/timezone/set-default-timezone)を見てみるとtzでデフォルトのタイムゾーンが設定できます。
```js
dayjs.extend(utc)
dayjs.extend(timezone)

dayjs.tz.setDefault("America/New_York")

// The same behavior with dayjs.tz("2014-06-01 12:00", "America/New_York")
dayjs.tz("2014-06-01 12:00")  // 2014-06-01T12:00:00-04:00

// use another timezone
dayjs.tz("2014-06-01 12:00", "Asia/Tokyo")  // 2014-06-01T12:00:00+09:00

// reset timezone
dayjs.tz.setDefault()
```

ここでとっても重要なのが、`dayjs.tz`を使うということです。

```js
// dayjs.tz.setDefaultで設定したタイムゾーンが適用される！！
dayjs.tz("2014-06-01 12:00") 
// タイムゾーン指定すると、指定したタイムゾーンが適用される！
dayjs.tz("2014-06-01 12:00", "Asia/Tokyo")
```
tzにタイムゾーンを指定すると一時的に上書きして表示できます。


### 結論
`dayjs()`ではなく、`dayjs.tz()`を必ず使いましょう！

:::note info
But dayjs(dateValue) always uses the local timezone, even if dayjs.tz.setDefault is used; only dayjs.tz(dateValue) (without second parameter) uses the default timezone.

ただし、dayjs.tz.setDefaultを使用している場合でも、dayjs(dateValue)を使うと、常にローカルタイムゾーンを使用します。dayjs.tz(dateValue)(2 番目のパラメータなし) のみデフォルトのタイムゾーンをが適用されます。
:::

ドキュメントに書いてありました:relaxed:
自動車関係の標準化団体

# 背景
車載関係の標準化の団体は色々あり、それら団体が連携・協力して業界の課題に取り組もうとしている。
以下、AUTOSARのニュース参照；

https://www.autosar.org/news-events/detail?tx_news_pi1%5Baction%5D=detail&tx_news_pi1%5Bcontroller%5D=News&tx_news_pi1%5Bnews%5D=236&cHash=0fc27843f8c88e646213f1ee406918ba

知らないものや良くわからないものが多いので、各団体の目的を整理しておきたい。情報は適宜追加していく。

# AUTOSAR
欧州自動車メーカーを中心に、車載ソフトウェアの共通化を目指し2003年に設立された団体。
車載ソフトウェアの共通化を実現するためのプラットフォームの仕様名称でもある。

https://www.autosar.org

# ASAM
ASAM：Association for Standardization of Automation and Measuring Systems とは、
自動車および測定システムの標準化を推進する国際的な非営利団体。

https://www.asam.net

[コメント]
AUTOSARに関係するところとしては、車両診断サービスの「Service-Oriented Vehicle Diagnostics」（SOVD）という考え方の標準化を行なっている。

Adaptive PlatformではR23-11でサポートされている。

参考：

https://qiita.com/issykatsu/items/5b5f06977d20ff191045

# COVESA
COVESA（Connected Vehicle Systems Alliance）は、コネクテッド・ビークル・システムのイノベーションを加速するオープンスタンダードと技術の開発に焦点を当てた、多様で持続可能で統合されたモビリティエコシステムを実現するグローバルなメンバー主導のアライアンス。 

https://covesa.global

[コメント]
以下のAUTOSARのニュースで、クラウドとの連携に関してCOVESAと協力すると言われている。

https://www.autosar.org/news-events/detail?tx_news_pi1%5Baction%5D=detail&tx_news_pi1%5Bcontroller%5D=News&tx_news_pi1%5Bnews%5D=235&cHash=052e50c28df49704afb2944a653a0bca

# Jasper
一般社団法人JASPAR（Japan Automotive Software Platform and Architecture）は2004年 9月に、高度化・複雑化する 車載電子制御システムのソフトウエアやネットワークの標準化及び共通利用による、開発の効率化と高信頼性確保を目指し設立された。
自動車メーカ、電装品メーカ、半導体・電子部品メーカ、ソフト・ツールメーカ、商社/キャリアの各業種、大学・研究機関から技術者が参画し、海外・国内の関連団体との協調の下、 車載ネットワーク、ソフトウエア、情報セキュリティにおける標準化を推進している。

https://www.jaspar.jp/about_us

# SOAFEE
Scalable Open Architecture For Embedded Edge (SOAFEE)
SOAFEEでは、SDVで想定されているクラウドネイティブな車載ソフトウェア開発のエコシステムの実現を目指すソフトウェアアーキテクチャとオープンなレファレンス実装の開発を進めている。

https://www.soafee.io

参考：

https://eetimes.itmedia.co.jp/ee/articles/2110/06/news032.html

# Eclipse SDV
Eclipse Software Defined Vehicle（SDV）
オープンソースコミュニティの1つであるEclipse Foundationが設立した「ソフトウェアデファインドビークル（SDV）」向けワーキンググループ。
「コードファースト」型のアプローチを用いて、自動車業界初のソフトウェアスタックの1つを構築することを目的に進めている。

https://sdv.eclipse.org

# Khronos
主にコンピュータグラフィックスや並列コンピューティング、ビジョン処理、そして音声処理などの分野で標準の仕様を策定するコンソーシアム。

例：
OpenGL: 3DグラフィックスのためのクロスプラットフォームAPI。
Vulkan: 高効率かつ高パフォーマンスな3Dグラフィックスと計算のための次世代API。
OpenCL: 異種並列計算のためのフレームワーク。
WebGL: ウェブブラウザ上での3DグラフィックスのためのAPI。
OpenVX: ビジョン処理のためのAPI。
SYCL: シングルソースのC++プログラミングをサポートする異種並列計算のためのAPI。

Khronos Groupは、多くの企業や業界パートナーと協力し、これらの標準を策定、維持、推進しています。これにより、開発者は特定のハードウェアやプラットフォームに依存せず、高性能なグラフィックスやコンピューティングのアプリケーションを作成することができる。

https://www.khronos.org


# 変更履歴
2024/07/15 Khronos追加
Mindでcurlを使ってWebページを取得するためのライブラリ

# はじめに

　@Mind-Club_2017 さんがQiitaに次の投稿をされて興味を持ちました。

Mind Webアプリケーション(CGI)で「禅の言葉」を得てGoogle翻訳で和訳 #Webアプリケーション
https://qiita.com/Mind-Club_2017/items/ba2c4473706ba1fd7f59

　上記で紹介されたプログラムでは、Webからのデータ取得にcurlを使われていました。

 （curlはWindows標準装備だったんですね。知りませんでした）
 
　curlは単なるWebページの取得にかぎらす、Web API として提供されるサービスのアクセスでも使うことができるので、Webページをcurl経由でMind側に取り込むのは汎用性があるのでは思い、ライブラリを作ってみました。

## ライブラリのソースコード

<details><summary>ライブラリ</summary>

```Mind:redirectcurl.src

curl受信文字列は　文字列実体　長さ　８１９２。

curlを実行しデータ取得とは　（オプション、ＵＲＬ　→　文字列）
		オプションは		文字列
		ＵＲＬは		文字列
		エラー出力もリダイレクトは　数値　１
		起動コマンドは	文字列実体　長さ　２５６
		プロセスＩＤは　	変数
		行は			文字列

	オプションと　ＵＲＬに　入れ
	エラークリアし
	curl受信文字列を　クリアし

	エラー出力もリダイレクト
		ならば　子のエラー出力をリダイレクト要求を　セットし
		つぎに

	"curl"を	起動コマンドに　入れ
	半角空白を	起動コマンドに　一文字追加し
	"--silent"を	起動コマンドに　追加し
	半角空白を	起動コマンドに　一文字追加し
	オプションが　非空列？
		ならば　オプションを　起動コマンドに　追加し
			半角空白を　　起動コマンドに　一文字追加し
		つぎに
	'"'を		起動コマンドに　一文字追加し
	ＵＲＬを	起動コマンドに　追加し
	'"'を		起動コマンドに　一文字追加し

	起動コマンドで　子をリダイレクトして子プロセス起動し　プロセスＩＤに　入れ
	エラー？
		ならば　終り
		つぎに

	送り書き込みハンドルで　ハンドル指定でクローズし

	ここから
		受け読み出しハンドルで　ハンドル指定で一行読み出し　行に　入れ
		データ終り？
			ならば　打ち切り
			つぎに
		行を		curl受信文字列に　追加し
		改行コードを	curl受信文字列に　一文字追加し
	繰り返し

	プロセスＩＤで　子プロセス終了を待ち
	エラー？
		ならば　エラー文字列で　重大エラー
		つぎに

	curl受信文字列を　返すこと。

```
</details>

　curlのオプションとURLの二つを（いずれも文字列）スタックに積んで「curlを実行しデータ取得」を実行するとデータが返されるという単純な仕様です。
 
　Mindで外部プログラムを実行する処理単語は複数ありますが、「・・実行」ではなく「・・起動」と名のついた処理単語はプロセスのキックだけを行い直ちに戻ってきます。そのあと、ループを組んで子プロセスからのデータを吸い上げることができます。
　受信するデータ終わるとパイプからの「一行読み出し」のあとの「データ終り？」が真を返すのでループを脱出します。

## ライブラリの機能確認プログラム

ライブラリをテストするサンプルプログラムが以下です（「メインとは」付き）。

<details><summary>テストプログラム</summary>

```Mind:redirectcurlTEST.src

"redirectcurl.src"を　コンパイル。

メインとは
		受信文字列は　文字列
	起動引数個数が　１と　異なる
		ならば　「Usage: 」を　表示し
			私のプログラム名・短縮を　表示し
			「 URL」を　一行表示し
			「（注：-L オプションをこのプログラム内で設定します）」を　一行表示し
			実行終り
		つぎに
	「-L」と　起動引数（１）で　curlを実行しデータ取得し　受信文字列に　入れ
	エラー？
		ならば　エラー文字列で　重大エラー
		つぎに
	「--------------」を　一行表示し
	受信文字列を　一行表示し
	「--------------」を　一行表示し
	。
```
</details>

## 実行結果

　うちのサーバ内のテストページ（静的HTML）をURL指定して取得してみました。

```
>redirectcurlTEST https://www.scripts-lab.co.jp/info.html
--------------
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body bgcolor="#FFFFFF">

GOLD (scripts-lab.co.jp)

</body>
</html>
--------------
pyautoguiのlocateCenterOnScreenで画像のパス指定に日本語が使えない問題


### 開発環境
- Windows 10 Pro(64bit)

### 問題
タイトル通りですが、Pythonのパッケージであるpyautoguiの中のlocateCenterOnScreen関数で、第一引数に画像のパスを指定するのですが、ここに、日本語を含んだパスを指定すると、エラーになってうまく動作しません。

### 解決策
画像は相対パスで指定できるので、下記のどちらか、

1.プログラムを実行中のディレクトリに、画像を置き、相対パスで読み込む
2.日本語以外の名前でディレクトリを新規作成し、その中に、画像を置き、相対パスで読み込む

で対処できます。これだと、**実行中のディレクトリよりも上層のディレクトリに日本語が含まれていても**、問題なく動作します。

### サンプルコード
```python
import pyautogui

# 同一ディレクトリにある場合
pyautogui.locateCenterOnScreen('screenshot.png')
# 下部ディレクトリにある場合(今回はimageディレクトリ)
pyautogui.locateCenterOnScreen('image\\screenshot.png')

```
ABC337の記録

# はじめに
今週は予定があって不参加でした。あとから解いた。

https://atcoder.jp/contests/abc337

# A
両チームの点数を都度足していって最後に比較すればOK。
```python:A
n = int(input())
tak = 0
aok = 0
for _ in range(n):
    x, y = map(int, input().split())
    tak += x
    aok += y
if tak > aok:
    print("Takahashi")
if tak < aok:
    print("Aoki")
if tak == aok:
    print("Draw")
```
ちなみに三項演算子のことは忘れていた。

# B
拡張ABC文字列は最初はABCいずれの文字も受け付けるが、一度Bが入力された後はBかC、一度Cが入力されたらCしか受け付けなくなる。
という訳で、今がどの状態かを管理しながら一文字ずつ確認していく。
```python:B
s = input()
param = s[0]
for i in range(len(s)):
    if param == 'A': #Aなら何もしない、BかCなら次区間へ。
        if s[i] == 'B':
            param ='B'
        if s[i] == 'C':
            param ='C'
    if param == 'B': #Aならアウト、Bなら何もしない、Cなら次区間へ
        if s[i] == 'A':
            print("No")
            break
        if s[i] == 'C':
            param = 'C'
    if param == 'C': #AかBならアウト、Cなら何もしない
        if s[i] == 'A' or s[i] == 'B':
            print("No")
            break
else:
    print("Yes")
```
なお、初期段階では「初手にいきなりBやCが入力される」「Aの次がいきなりCになる」などを想定できておらず2ペナついてしまった。
また、正規表現を使えば秒殺らしい。

# C
やりたいことは明瞭で、「前にいる人の番号」がリストに入っているのでそのインデックスを取得して、取得したインデックスで「前にいる人の番号」を上書きしてまたインデックスを取得して……とやっていけばできる。
```python:C
n = int(input())
A = list(map(int,input().split()))
num = -1
ans = []
for _ in range(n):
    value = A.index(num) + 1
    ans.append(value)
    num = value
print(*ans)
```

しかし、index()は$O(n)$かかるので全体では$O(n^2)$となりTLEになる。
高速化する方法はいろいろとありそうだけど、{前にいる人の番号:自身の番号}という辞書を作るのが直感的に理解しやすかったのでそうした。取得した値で次に取得するキーを上書きしていけばよい。

```python:C'
n = int(input())
A = list(map(int,input().split()))
d = {}
for i in range(n):
    d[A[i]] = i+1 #キーに前に並んでる人、値に人の番号。
ans = []
num = -1
for i in range(n):
    ans.append(d[num])
    num = d[num]
print(*ans)
```
辞書はあまり使ったことがなかったが扱いやすくて安心。
参加してたらCまでは解けてたんじゃないかという気がする。来週頑張りましょう。
【Python】`.whl`をuniversal wheelにするときに必要なコマンドライン引数の書き方

## 初めに
Pythonのパッケージ形式の一つとして、`wheel`があります。
Python3系だけでなくPython2系もサポートしてC拡張を含んでいないプロジェクトを`wheel`化したものを、universal wheelといいます。

## 遭遇した問題
universal wheelについて、[PyPIのドキュメントに`setup.cfg`でオプションを指定してuniversal wheelを作成する方法がある](https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#wheels)ものの、コマンドライン引数でオプションを指定する方法が明記されていませんでした。
ここで少しハマりましたが冷静に考えてオプションを指定すればいいだけなので、下記を実行することで`PATH/TO/PRJ_ROOT/dist/`下にuniversal wheelを`package-x.y.z-py2.py3-none-any.whl`のファイル名で作成することができました。
```
PATH/TO/PRJ_ROOT>python setup.py bdist_wheel --universal
```

また、下記を実行すれば、`.zip`(`.tar.gz`ではなく)も同時に`PATH/TO/PRJ_ROOT/dist/`直下に作成することができます。
```
PATH/TO/PRJ_ROOT>python setup.py sdist --formats=zip bdist_wheel --universal
```

## あとがき
もうPython2系なんてほとんどのパッケージでサポートされていないので、これが役に立つ期間もあと少しで終わるでしょう。
声優ぴっちょりーなさんに魅せられて！第４級アマチュア無線（講習会）について

# はじめに

第４級アマチュア無線の講習会に参加することになったので投稿します。

# Who am i ?

しがないエンジニア（IT）です。三陸特の免許は取得していますが無線はもっぱら初心者です。今のところ仕事でも三陸特等の特殊無線に関わる範囲は扱ったことありません。

https://qiita.com/forest_moririri/items/59807152df80ce630902


# なぜ資格を取得しようと思ったのか？

ドローン関係の勉強をしていたら、三陸特以外にアマチュア無線の資格も取得していると便利だと思ったからです。特殊無線技士だと無線局の申請が少々面倒なようでして、個人で運用するアマチュア無線局の必要性を感じております。
また、YouTuberとしても活躍中のぴっちょりーなさんに影響されたというのも理由の一つです。というかももすけさんとぴっちょりーなさんの動画を見ていたら、自分もアマチュア無線の勉強をしたくなってしまいました。

# 本題

YouTubeでぴっちょりーなさんの動画を見て大変勇気づけられました。ぴっちょりーなさんとももすけさんの相性抜群な所とぴっちょりーなさんの若干刺激が強めなコスチュームに注目です！JKコスチュームがこんなに似合う人は久しぶりに見ました。。

https://www.youtube.com/watch?v=NK11iIKBr-E&t=1s

https://www.youtube.com/watch?v=MXpMWCXxIFI&t=406s

https://www.youtube.com/watch?v=qIvyI_4oJk4&t=391s

https://www.youtube.com/watch?v=pfCvdZeIhSw

少々脱線してしまいましたが、私が勉強に使用した教材を参考までに記載しておきます。所感ですが、三陸特に比べると特に無線工学の周辺は勉強がいると思います。というかアマチュア無線って思ったよりも勉強すること多いんですよね。ほとんどおまけのような感じになってしまいますが、私は以下の教材をメインに学習を進めました。

かんまるくんでも勉強しましたが、免許を取得した後についても勉強したいと思いまして、以下は予習に使った教材達です。

https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE3%E7%B4%9A%E3%83%BB4%E7%B4%9A%E3%82%A2%E3%83%9E%E3%83%81%E3%83%A5%E3%82%A2%E7%84%A1%E7%B7%9A%E6%8A%80%E5%A3%AB%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%90%89%E5%B7%9D%E5%BF%A0%E4%B9%85-ebook/dp/B09MT3F5F4/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3M9X129366OT4&dib=eyJ2IjoiMSJ9.0N2qqeeQur1lXxEZ8rp9BBFBNBKUUNSMN-oRDzS7HIKkc7OBlJ9JXY-Zlpo5K3s7WamnjXqM3upvdYd9PLJXIt6NWmBH0NZS9zPZMmUvb0ougoWSiODMoBjkCr5bvJYvWu-IvwLxV6xIHLT9fcnk0Q.L4xvSIBa1-hQdMv9tbp0x5ZDsLS9bvwycKI6S1eVUSE&dib_tag=se&keywords=%E3%82%A2%E3%83%9E%E3%83%81%E3%83%A5%E3%82%A2%E7%84%A1%E7%B7%9A&qid=1705208254&s=books&sprefix=%E3%82%A2%E3%83%9E%E3%83%81%E3%83%A5%E3%82%A2%E7%84%A1%E7%B7%9A%2Cstripbooks%2C180&sr=1-2


https://www.amazon.co.jp/%E5%88%9D%E7%B4%9A%E3%82%A2%E3%83%9E%E3%83%81%E3%83%A5%E3%82%A2%E7%84%A1%E7%B7%9A%E4%BA%88%E6%83%B3%E5%95%8F%E9%A1%8C%E9%9B%862023%E5%B9%B4%E7%89%88-%E5%AE%8C%E5%85%A8%E4%B8%B8%E6%9A%97%E8%A8%98-%E5%88%9D%E7%B4%9A%E3%83%8F%E3%83%A0%E5%9B%BD%E8%A9%A6%E5%95%8F%E9%A1%8C%E7%A0%94%E7%A9%B6%E4%BC%9A/dp/4416622074

その後は以下のウェブサイトが役に立ちました。

http://lab.icoro.com/4a/index.html

大体２周間くらいかけて予習をした感じですね。近々講習会を受講予定です。

# JARDの講習会に参加した感想（追記）

講習会ですが、講師の方が大変わかりやすく説明してくれました。まず修了試験についてです。国試の勉強をしていたこともあってか、私は内容を確認する程度で合格できました。また、講習会を受講したからといって100%合格できるとは限らないですので、予習はしていった方が確実かと思います。
講習会の無線工学のレベル感ですが、中学生～高校1年生くらいで勉強する物理の基本を知っていれば十分です。小学生にもわかるレベルで説明してくれます。
講習会の参加者ですが、小学生～中学生の方や高齢者の方まで年齢層はかなり幅が広い印象を受けました。
講習会のメリットですが、JARD側で従事者免許の申請を行ってくれるため、国試のように自分で総務省へ申請する必要がありません。提出書類についてもちゃんと確認してくれるため、書類不備が未然に防げるというのもあると思います。ただし、無線局免許状については従事者免許が到着後、別途自分で申請する必要があります。


# 補足

完全にぴっちょりーなさん推しの記事になってしまいましたが、かんまるくんだけだと答えが簡潔すぎなので、国家試験で免許を取得する方は一度全体の範囲をさらっと学習してからかんまるくんに取り組むと良いと思います。で、その後はさらっと過去問形式で復習していければベストかなぁと。

# 最後に

ぴっちょりーなさんもアマチュア無線の免許を講習会で取得したようなのです。少しずつ無線家が増えてきているようですね！講習会で取得することを視野に入れておくのも良い選択肢かなとは思います。

また、ぴっちょりーなさんのこれからの更なるご活躍を期待しております。
【Linux】九九表をシェルスクリプトで作成

# はじめに
オープン系COBOLに欠かせないのがLinuxの知識であったり、シェルの知識であったりします。
今回はシェルスクリプトを使って、A×B=Cの形で九九表を表示させていたいと思います。

# 早速bashで作ってみます。
```pro2008A.sh
#!/bin/bash
#九九表を表示する。
sum=0
for ((i = 1; i <= 9; i++))
do
  for ((j = 1; j <= 9; j++))
  do
    ((sum = i * j))
     printf '%d×%d=%2d' "$i" "$j" "$sum"
     echo -n ' '
  done
  if ((j = 9))
    then
      echo # 改行する
    else
      continue
  fi
done
```
bashでは算術式を使ってforでループさせて、計算した結果をprintfを使って形を整えます。
'%d×%d=%2d'の表記について九九なので%d×%dの部分は1桁でいいでしょう。
=%2dも2桁確保することによって1桁でも列で見た時に形が整うことが出来ます。

最後、改行なしで1文字空文字を入れて整形するためecho -n ' 'を用いています。
ここでecho -e ' \c'にしても同様な挙動を示します。

jのループを1回抜けたらA×9=Cの段階まで行ったら改行します。
それによって横に1の段、2の段と段を行で表示させることが出来ます。

```pro2008A.sh実行結果
$ ./pro2008A.sh
1×1= 1 1×2= 2 1×3= 3 1×4= 4 1×5= 5 1×6= 6 1×7= 7 1×8= 8 1×9= 9
2×1= 2 2×2= 4 2×3= 6 2×4= 8 2×5=10 2×6=12 2×7=14 2×8=16 2×9=18
3×1= 3 3×2= 6 3×3= 9 3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27
4×1= 4 4×2= 8 4×3=12 4×4=16 4×5=20 4×6=24 4×7=28 4×8=32 4×9=36
5×1= 5 5×2=10 5×3=15 5×4=20 5×5=25 5×6=30 5×7=35 5×8=40 5×9=45
6×1= 6 6×2=12 6×3=18 6×4=24 6×5=30 6×6=36 6×7=42 6×8=48 6×9=54
7×1= 7 7×2=14 7×3=21 7×4=28 7×5=35 7×6=42 7×7=49 7×8=56 7×9=63
8×1= 8 8×2=16 8×3=24 8×4=32 8×5=40 8×6=48 8×7=56 8×8=64 8×9=72
9×1= 9 9×2=18 9×3=27 9×4=36 9×5=45 9×6=54 9×7=63 9×8=72 9×9=81
```

実行結果見ると列と行が乱れないで表示されたことがお分かりいただけたと思います。

# shでシェルスクリプトを作ったらこうなります。
```pro2008A.sh
#!/bin/sh
#九九表を表示する。
sum=0
for i in $(seq 1 9)
do
  for j in $(seq 1 9)
  do
    sum=$(expr "$i" \* "$j")
    printf '%d×%d=%2d' "$i" "$j" "$sum"
    echo -n ' '
  done
  if [ "$j" = 9 ]
    then
      echo # 改行する
    else
      continue
  fi
done
```
まずfor文はいくつか別解的書き方がいくつかあって
```
for i in 1 2 3 4 5 6 7 8 9
```
の様に書く事ができますし、

バッククォーテーションとseqコマンドを使って
```
for i in `seq 1 9`
```
の様に書く事が出来ます。
```
for i in $(seq 1 9)
```
が一番スマートな書き方に思えたのでこちらを採用しました.

また、exprコマンドで掛け算する時は*の前に\をつけるのを忘れないようにしましょう。
shなので算術式は使えずexprコマンドで計算する形になります。

```pro2008B.sh実行結果
$ ./pro2008B.sh
1×1= 1 1×2= 2 1×3= 3 1×4= 4 1×5= 5 1×6= 6 1×7= 7 1×8= 8 1×9= 9
2×1= 2 2×2= 4 2×3= 6 2×4= 8 2×5=10 2×6=12 2×7=14 2×8=16 2×9=18
3×1= 3 3×2= 6 3×3= 9 3×4=12 3×5=15 3×6=18 3×7=21 3×8=24 3×9=27
4×1= 4 4×2= 8 4×3=12 4×4=16 4×5=20 4×6=24 4×7=28 4×8=32 4×9=36
5×1= 5 5×2=10 5×3=15 5×4=20 5×5=25 5×6=30 5×7=35 5×8=40 5×9=45
6×1= 6 6×2=12 6×3=18 6×4=24 6×5=30 6×6=36 6×7=42 6×8=48 6×9=54
7×1= 7 7×2=14 7×3=21 7×4=28 7×5=35 7×6=42 7×7=49 7×8=56 7×9=63
8×1= 8 8×2=16 8×3=24 8×4=32 8×5=40 8×6=48 8×7=56 8×8=64 8×9=72
9×1= 9 9×2=18 9×3=27 9×4=36 9×5=45 9×6=54 9×7=63 9×8=72 9×9=81
```

shでも実行結果が正しく出たのが確認出来ました。

# 最後に
今回、九九表を行うスクリプトを紹介しました。

最後までご覧いただきありがとうございました！