OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryを用いたGSCデータの可視化とLooker Studioでの表示

## はじめに

この記事では、Google Search Console（GSC）のデータをGoogle BigQueryを使用して集計し、その結果をLooker Studioで可視化する方法を解説します。最終的には毎日のサイトのインプレッション数とクリック数を折れ線グラフに表示しました。
本記事の内容はBigQueryに焦点を当てています。GCPやLooker Studioの設定に関する具体的な手順については今後別の記事で詳しく説明する予定ですので、気長にお待ちいただくか、他の記事を参考にしてください。

## 結果の可視化

最終結果としての可視化例を以下に示します。x軸が日付でy軸がそれぞれインプレッション数とクリック数です。

![GSCデータの可視化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/db8e7171-d68a-949b-2c9c-354610c07ede.png)


## データセットの準備

### 元のデータセット

使用するデータセットは、Google Search Consoleから取得した検索クエリ、インプレッション数、クリック数などの情報を含んでいます。

> **メモ:**  
> 異なるリージョンにデータセットが存在する場合、直接クエリを実行できないことがあります。例えば、以下のようなエラーが発生しました。
>
> ```plaintext
> Not found: Dataset your_project:your_dataset was not found in location your_region
> ```
> この問題を解決するために、データセットのリージョンを一致させる必要があります。今回は、プロジェクトとデータセットのリージョンを同じにする基本的な方法で解決しました。

##  新しいデータセットの作成
まず、BigQueryコンソールで新しいデータセットを作成します。このデータセットのリージョンは、元のデータセットと一致させます。

### 新しいデータセットの作成手順
1. BigQueryコンソールにアクセス:
1. GCPコンソールにログインし、BigQueryサービスを開きます。
1. 新しいデータセットの作成:

プロジェクト内に新しいデータセットを作成します。このデータセットのリージョンはUSに設定します。
### サマリーテーブルの作成
新しいデータセット内でサマリーテーブルを作成し、GSCデータを集計します。
```sql
CREATE TABLE `your_project.your_dataset0.site_impressions_clicks_summary` AS
SELECT
  data_date,
  site_url,
  SUM(impressions) AS total_impressions,
  SUM(clicks) AS total_clicks
FROM
  `your_project.your_dataset1.searchdata_url_impression`
GROUP BY
  data_date,
  site_url
ORDER BY
  data_date,
  site_url;
```
## Looker Studioでの可視化
### データソースの追加
Looker Studioにログインし、新しいレポートを作成します。
「データソースを追加」をクリックし、「Google BigQuery」を選択します。
プロジェクト内のデータセットを選択し、テーブルsite_impressions_clicks_summaryを選択します。
### 折れ線グラフの追加
レポートキャンバスに戻り、「チャートを追加」ボタンをクリックし、「折れ線グラフ」を選択します。
次元をdata_date、指標をtotal_impressionsおよびtotal_clicksに設定します。上でもご紹介しましたが下記の様なグラフを生成しました。
![GSCデータの可視化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/db8e7171-d68a-949b-2c9c-354610c07ede.png)

## 結論

GSCデータをLooker Studioで可視化する際に直面したリージョンの問題は、データセットのリージョンを一致させることで解決しました。Google Cloud Storageを使用してデータを移動する方法もありますが、私の経験ではデータセットのリージョンを揃えることが最もシンプルな解決策でした。この情報が皆さんの参考になれば幸いです。

## 関連記事
1. [tan0ry0(2024.6), BigQueryを用いた野球チーム(MLB)の勝率計算とLooker Studioでの可視化](https://qiita.com/tan0ry0shiny/items/7a9900c9ccede6ade368)
Connect REST API を使ってファイルを操作してみる2


前回の記事ではファイルのアップデート（バージョンアップ）の方法が分かりませんでした。
リファレンスを見てもずばりの方法がない感じですね。

[Connect REST API を使ってファイルを操作してみる](https://qiita.com/Keiji_otsubo/items/1c78049fed510f3b0f10)


以下をみてもConnect REST API でなくて、sobjects/ContentVersionなんですよ。

/services/data/vXX.X/sobjects/ContentVersion/

+ [How to Upload a Document in Salesforce Files and not as Attachments.](https://medium.com/@pddadson/how-to-upload-a-document-in-salesforce-files-and-not-as-attachments-a3bf76d138cd)

以下のリファレンスもsobjects/ContentVersionですね。Connect REST APIではできないのかな？

+ [Insert or Update Blob Data](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_insert_update_blob.htm)

curlコマンドの例では... (実際には改行は必要ありません。)　これはContentVersion


```
curl https://MyDomainName.my.salesforce.com/services/data/v61.0/sobjects/ContentVersion 
-H "Authorization: Bearer token" 
-H "Content-Type: multipart/form-data; boundary=\"boundary_string\"" 
--data-binary @NewContentVersion.json
```

# 無理やりアップデートするファイルを投稿してみる

Post メソッドでファイルのIdを指定してみましょう

```
{{_endpoint}}/services/data/v{{version}}/connect/files/:FILE_ID
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dd54ebba-1f0a-a942-05d5-3b84714934af.png)

結果は400エラーです

:::note alert
[
    {
        "errorCode": "POST_BODY_PARSE_ERROR",
        "message": "Missing expected \"fileData\" binary parameter"
    }
]
:::

同じようなエラーメッセージですが、読んでも理解できません。
間違ってないようなとも言われています

+ [Chatter REST Batch Post Multiple Files: Missing expected "fileData" binary parameter](https://salesforce.stackexchange.com/questions/164606/chatter-rest-batch-post-multiple-files-missing-expected-filedata-binary-param)

+ [Unable to upload file to REST API - python](https://stackoverflow.com/questions/42277585/unable-to-upload-file-to-rest-api)


ファイルを選んだつもりでしたが、無い？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dccc2cf1-9e53-d783-9c2c-fcae6ade5914.png)

ファイルを指定したらリターンコードは201だ。うまくいったかな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6d09dc19-bd93-7912-11c1-9d10c699338a.png)

バージョンアップできました。　思ったより簡単だった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/74e791b0-fbe1-0844-5ac4-4c5265af6f2b.png)
VIVADOにおいてverilogファイルをVScodeで編集する方法

VivadoでVerilogファイルをVS Codeで編集する方法を紹介します。これにより、VS Codeの優れたエディタ機能を活用して、効率的にVerilogコードを編集できます。

前提条件
Vivadoがインストールされていること
VS Codeがインストールされていること
手順
1. Vivadoの設定を変更
Vivadoを起動します。

メニューからTools -> Settingsを選択します。

Settingsウィンドウで、左側のメニューからText Editorを選択します。

External Editorセクションで、Use external editorのチェックボックスをオンにします。

External Editor PathにVS Codeの実行ファイルパスを入力します。通常は以下の通りです：

C:/Program Files/Microsoft VS Code/Code.exe [file name]:[line number] -g

OKをクリックして設定を保存します。

まとめ
この手順に従うことで、VivadoとVS Codeを統合し、より効率的にVerilogファイルを編集することができます。VS Codeの強力な編集機能を活用して、快適な開発環境を実現しましょう。

この投稿が役に立った場合は、いいねやコメントをお願いします！質問があればお気軽にどうぞ。
AWSのALBで用意されているデフォルトのWAFを設定したら大きめのファイルをアップロードできなくなった時の対処方

# 結論
**単純に大容量ファイルをアップロードできるようにする場合は**
`AWS-AWSManagedRulesCommonRuleSet`に設定されている`SizeRestrictions_BODY`を`Override to Count`にする。(これで大容量ファイルを上げ放題になる)
**特定のパスでのみ許可したい場合は**
以下二つのルールを追加する。
①特定のパスへのアクセスを`許可`
②8KBリクエストボディを超えるアクセスを`ブロック`
ルールのPriorityをデフォルトで設定されているものの下に上記①、②の順で設定する。
 
# 原因
先に結論から言うと
**AWS-AWSManagedRulesCommonRuleSetに設定されているSizeRestrictions_BODYがアクセスをブロックしている**
ということです。
ALB作成時に`AWS Web Application Firewall(WAF)`で`事前定義済みのウェブACLを自動生成`を選択して作成するとWeb ACL(アクセスコントロールリスト)が作成され、その中に3つのルールがデフォルトで用意されます。
そのルールの一つ、`AWS-AWSManagedRulesCommonRuleSet`で`SizeRestrictions_BODY`が設定されており、**8KB**を超えるリクエストボディを検知すると通信をブロックするという内容になっています。

# とにかく大きいファイルをアップロードできるようにしたい場合
`AWS-AWSManagedRulesCommonRuleSet`に設定されている`SizeRestrictions_BODY`を`Override to Count`にすることでファイルアップロードできるようになります。
`Override to Allow`にしてしまうとこの条件に一致した時点でアクセスを許可してしまい、このルールよりも優先度が低いルールのフィルタをすり抜けてしまうので、アクセス数を数えるだけのCountにしておきます。
**しかし、この設定は大容量ファイルをリクエストボディに設定しアクセスされることでサーバーに高負荷がかかることを許すことになります。**

# 特定の操作でのみ大型ファイルアップロードのアクセスを許したい場合
上記では大容量ファイルを誰でもどのパスでも上げ放題になってしまいます。
私なりに2つの方法でこの上げ放題を抑制する方法を考えました。
どの方法も**とにかく大きいファイルをアップロードできるようにしたい場合**の内容を設定していることが前提です。

## 特定のIPアドレスからのアクセスの場合に許可する
ファイルのアップロード機能がサービスの`管理ページにのみある`のであれば管理者が大容量ファイルをアップロードすることになるので管理者が特定のIPからのみ操作する場合にこの手法が利用できます。
設定手順は以下です。(UI変更などが多発するため詳細は割愛)
**①対象のIPアドレスの`IP set`を作成**
**②対象の`Web ACL`で`IP set`を利用して対象のIPからのアクセスを許可するルールを追加**
**③追加したルールの優先度を最上位にする**
これで特定のIPアドレスからのアクセスの場合のみファイルをアップロードできるようになりました。

## 特定のURLのみ許可する
特定のURLを利用したファイルアップロードのみ大容量ファイルアップロードアクセスを許可する設定ができます。
設定手順は以下です。(UI変更などが多発するため詳細は割愛)
**①対象の`Web ACL`で`Rule Builder`を利用し、`URI　path`が対象のURLに正規表現でマッチする場合に許可するルールを追加**
**②対象の`Web ACL`で`Rule Builder`を利用し、`Body`が8KB以上の場合にブロックするルールを追加する**
**③上記で追加したルールのPriorityをデフォルトで設定されているものの下に①、②の順で設定する**
これで特定のURLでのみ大容量ファイルをアップロードできるようになりました。
デフォルトのSizeRestrictions_BODYが機能しなくなっているので手順③でサイズを確認するフィルタを自前で作成しています。
③のルールでブロックされる前に②のルールでアクセスを許可するようにしています。

# 参考
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-baseline.html
TOEICを受けてみることにした

記念すべき初投稿！とのことで、はじめまして。
某SES企業でネットワークエンジニアをやっております、ゆりと申します。
ネットワークエンジニアを始めて、3年となりました。

何か自分のアウトプットできないかと思い、Qiitaのアカウントをずいぶん前に作成したのですが、技術系はハードルが高いと放置してました。。。

しかし、この度大学生活ぶりにTOEICを受験することになりましたので学習記録＆記念すべき初投稿として記載しておきます。

#TOEIC受けようと思ったわけ
会社から、**一定の点数を超えると報奨金がでるのと資格手当も支給される**ことを知ったので受けようと決意しました。
これが一番の理由です。（おい）
お金のために？となりますが、元々英語が得意だったので自分のスキルでお金が貰えるなら一石二鳥だと
思います。

また大学時代に受けたきりで、最近の自分の英語スキルを把握してないのでいい機会だと思っております。

##学習計画
受験日は7/28の予定です。
あと1か月あるので、まずは以下の2点を繰り返して2週間やっていきたいと思います。

・2日に1回リスニングの模試を受ける⇒Part1・2の復習⇒Part3・4の復習
・3日に1回リーディングの模試を受ける⇒Part5の復習⇒Part6・7の復習

分からなかった単語をメモすることも忘れずに、やっていきたいと思います。
ImageMagickで丸いサムネイル画像を作る


## はじめに

こんにちは。[@yug1224(Yuji Yamaguchi)](https://x.com/yug1224)です。

丸く切り抜いたサムネイル画像を使いたかったので、ImageMagickで加工した方法をメモ。

https://github.com/imagemagick/imagemagick

## TL;DR

300x300のサムネイル画像を作成するワンライナーコマンドは下記。

```sh
convert src.jpg -resize '300x300^' -gravity center -extent 300x300 \( -size 300x300 xc:none -fill white -draw 'circle 150,150 150,0' \) -compose CopyOpacity -composite dst.png
```

## 手順説明

1. 加工する画像を正方形に切り取る
1. マスク用に丸い画像を作る
1. 正方形の画像と丸い画像を合成する

加工する画像は下記。[フリー写真素材ぱくたそ](https://www.pakutaso.com/20220113021post-36964.html)から拝借しました。

![飼い主に挙手させられる猫の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/51a71607-57ac-1dbe-d295-70e211758a4c.jpeg)

## 1. 加工する画像を正方形に切り取る

まず加工する画像を任意の大きさにリサイズします。この時に`-gravity`を使って、円にしたい箇所も切り出しておきます。

```sh
convert src.jpg -resize '300x300^' -gravity center -extent 300x300 tmp.png
```

![正方形にリサイズした、飼い主に挙手させられる猫](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/2a0bfa56-0305-0e3d-e329-2e04c53a0cb0.png)

## 2. マスク用に丸い画像を作る

次にマスク用の正円画像を作ります。この円の大きさが最終的なサムネイル画像の大きさになります。

円の外側を透過にしたいのでアウトプットはpng画像にします。

```sh
convert -size 300x300 xc:none -fill white -draw 'circle 150,150 150,0' msk.png
```

![マスク用の正円画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/b8005341-53a1-6933-70e8-e8c9706b45a1.png)

※`-fill white`だと白い円で見えなくなってしまうので、添付画像ではわかりやすいように`-fill black`にしています。

## 3. 正方形の画像と丸い画像を合成する

切り出した正方形の画像とマスク用の円の画像を合成します。

```sh
convert tmp.png msk.png -compose CopyOpacity -composite dst.png
```

![丸く切り抜いた、飼い主に挙手させられる猫の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106236/f8e8c7e0-4a19-eac5-1fdd-3295b174b9c3.png)

冒頭にも記載した通り、すべての処理をワンライナーでも実行可能です。dst.pngを出力する処理を `()` で入れ子にして指定します。

```sh
convert src.jpg -resize '300x300^' -gravity center -extent 300x300 \( -size 300x300 xc:none -fill white -draw 'circle 150,150 150,0' \) -compose CopyOpacity -composite dst.png
```

## まとめ

パラメーターを変えれば、切り出す位置やリサイズの大きさ、正円ではなくて楕円や角丸なども対応できるので、画像加工アプリでは難しい微調整に良さそうです。

以上、ImageMagickを使って、丸いサムネイル画像を作成する方法を紹介しました。

## PR

HRBrainでは一緒に働く仲間を募集しています。歴史に残るトライをしよう！

https://www.hrbrain.co.jp/recruit
Helmで古いバージョンのアプリを入れる方法

## 結論

helmのパラメータで過去の chart を指定すると古いバージョンのアプリが入ります。

- `helm　install` の実行時に　`--version` を指定する
  - `--version` に指定するのは chart のバージョンなので、対象の chart でどのバージョンが入るかは GitHub リポジトリの release を探るなどの調査が必要

## 経緯等

Traefik を使って Kubernetes や Open ID Connect の勉強をしていた際に、Traefik の v3.0 だと出たばかりで中々ドキュメント等見つからずうまくいかない状態に陥りました。

最新版の Traefik を使用することが今回の勉強の本質ではなかったので、v2 系の最新を利用することにしました。

Traefik の `v2.11.2` を入れたい場合、chart のバージョンは `27.0.2` でした。

```bash
> helm install traefik traefik/traefik --version 27.0.2 -f traefik-values.yaml
NAME: traefik
LAST DEPLOYED: <日付>
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Traefik Proxy v2.11.2 has been deployed successfully on default namespace !
```
社会人歴1年半で転職失敗から学んだ4つの教訓

:::note 
<details><summary>AI要約</summary>

- 転職の動機と決意
    - 新卒で自社開発会社に入社後、前線でコードを書きたいという理由で転職を決意。

- 紆余曲折な転職活動
    - 転職活動は半年かかり、具体性に欠けたまま面接を受け続けた結果、ベンチャー企業に内定し入社を決意。

- 転職先での困難
    - 転職先のOJT担当者が高圧的で、鬱症状が発症し、1ヶ月間ベッドから出られなくなる。

- 休職とその後の展開
    - 休職を取り、体制の見直しを期待したが、休職後も高圧的な担当者とのマンツーマン業務で体調が悪化し、退職。

- 反省点と教訓
    - 焦らず転職活動期間を決めるべき、現在の企業でのシステム理解を深めるべき、転職活動中は具体的な思考の深掘りが必要。
</details>
:::
## はじめに
転職系の広告が多く出るようになってからしばらく経ち、
「嫌なことがあったら転職してしまおう」みたいな考えが世に蔓延っていますが、
転職が必ずしも良い結果を生むとは限らないという話を新卒で入社してわずか１年半で転職をして失敗した自分が経験を基につらつらと書き記します。

５年位前の話になります。

## 新卒入社そして転職決意
新卒で自社開発会社に入社しましたが、
平たく言えばもっと前線に立ってコードを書きたいという理由で転職を決意しました。

## 紆余曲折な転職活動
転職活動は１、2ヶ月で終わるというイメージがあると思いますが僕は半年かかりました

>前線に立ってコードを書きたい

が薄いのか具体性がないのか、とにかく思考を深堀ることをないがしろにして面接ばかり受けていたのが原因だと考えています。
結果的にベンチャー企業に内定をいただき、社内見学も経て入社を決意しました。
こうして新たな挑戦へ足を踏み込もうとしました。

## 転職先にいざ入社！しかし・・・
転職先に第２新卒として入社してOJT研修が始まりました。が、
OJT担当者がすごく高圧的な人で一瞬で病みました。
しかし半年かけて転職したので簡単に諦めたくないと粘った結果鬱症状が発症し、出社の時間になると体が動かなくなり、そこから１２時間はベッドから出れませんでした。
この期間、約１ヶ月です。

## 休職を取ったが、、、
心療内科で診断し、診断書ももらって事情を説明して１ヶ月の休職を取りました。
在籍期間と同じ期間休職するのって中々無いですよね。
休職を取る際に企業側から体制の見直しをするとのことで一旦は安心して休むことにしました。

休職から明けてあらビックリ、今度は高圧的な人とマンツーマンで実業務に入るようになりました。
はい、無理です。体調が悪化しました。
この件からその企業とはおさらばしました。

## 反省と教訓
以下が反省点だと考えています。
1. **焦って転職する必要はなかった**
    - 転職活動するなら期間を決めるべきだった
        - 2ヶ月までに決まらなければ諦めるなど
2. **現在の企業での経験を深めるべきだった**
    - 1年半しか在籍していないなら、その企業で取り扱っている事業やシステム理解を深めるべきだった
    - 先輩や上司に相談した上で本当にダメな環境だと感じたら転職活動を考えるべきだった
3. **転職活動中は思考を深掘りするべきだった**
    - 前線に立ってコードを書きたい
        - どんなプロジェクトで？
        - どういうポジションで？
        - そうなった後はどうする？
4. **面接準備をしっかりする**
    - 面接での具体的なビジョンや目標を明確にするべきだった



## まとめ
転職は必ずしも良い結果を生むわけではないということを知ってもらえたら嬉しいです。
今でも新卒入社した会社に残っていればよかったなぁと思ってます。

ただし、転職を機に飛躍するケースもあります。
僕もそれは経験していますが、今回の趣旨に反するので割愛します。またどこかで書くかもしれません。
テンプレートを使ってPRの記載内容を揃える

# はじめに
チームで開発する際にはGitHubのプルリクエスト(以下PR)機能を使って「ソースコードレビュー」をする機会が多いと思います。
しかし、PRを作成をする人により「記載内容」がバラバラであるため、レビューがしづらいなと感じることはありませんか？
そこで今回は「PRテンプレート」を使ってこの問題を簡単に解決しよう！という内容です。

※後から名称だけ登場しますが、私は開発に以下ツールを使用しています。
- チャットツール：Slack
- チケット管理ツール：Backlog
- Webデザインツール：Figma

# こんな人に読んでほしい
- チーム開発している
- GitHubを使っている
- レビューをすることがある
- レビュー依頼をすることがある

# 目次
- レビューがしづらいと感じる原因
- レビューがつらいPR事例
- レビュアーのメリット
- レビューイのメリット
- テンプレート事例
- テンプレートの作り方
- GitHubへの反映方法
- まとめ

# レビューがしづらいと感じる原因
そもそもPRの「記載内容」がバラバラであると、なぜ「レビューがしづらい」と感じるのか。
私はざっくり以下が原因であると感じます。
※PR運用方法のベストプラクティスについてはここでは言及しません。
- この実装の目的(何がしたいのか)が読み取りづらい
- いつまでにマージしたいのかわからない
- 時にはチャットツールやチケット管理ツールなどから背景を読み取る必要がある

# レビューがつらいPR事例
私がつらいなと感じるPR事例を紹介します。
少し極端ですが。

## パターンA(情報が少ない)
```md
# 概要

- 機能Aの追加

レビューお願いします！
```

機能Aの仕様は？デザインは？
ソースコードからすべてを読み取るのはつらい。

## パターンB(内容が冗長)
```
前回のMTGにてクライアントの〇〇さんから
フォーム中項目Bの下へ項目Aを追加したいという要望があり、
フロントエンドでは項目のタイトルとプルダウン表示、
選択がない場合にはバリデーションメッセージの表示、
また単体テストも実装しました。
レイアウトについてはFigmaをご覧ください。
XX月XX日には結合テストのため
△△ブランチへマージする必要があり、
お忙しいところ恐縮ですが早めにレビューお願いします！
```

たくさん書いてくれるのでなんとか読み取れますが、欲しい情報をピンポイントで取得しづらい。

上記のようなPRを見るのは(特に忙しい時には)つらいと感じますよね。
この「つらい」を解決するために、簡潔にPRに情報を集約させることでレビューの負担を減らそうと考えました。

# レビュアーのメリット
- 実装の目的が読み取れる
- 情報取得のためのレビューイとのコミュニケーションを減らすことができる

# レビューイのメリット
- 「何を記載すれば良いか」を考える時間を短縮できる
- 「マージ期限」など付加情報をレビュアーに伝えられる

# テンプレート事例
実際にテンプレートを作成する前に、私がプロジェクトで運用しているテンプレートを紹介します。
内容はプロジェクトやチームに合わせてカスタマイズしてください。

```md
## 概要
- フォームへ項目Aを追加

## 背景/経緯
- クライアントより項目Aを追加したいと要望があったため

## 対応内容
- フォームへの項目追加
- バリデーションメッセージ表示
- フロントエンドテスト実装

## マージ期日
XX月XX日までにマージしたく、レビューお願いします

## バックログチケット
[チケットタイトル](URL)

## エビデンス
- フォーム内の項目Aレイアウト
（ここに画像をFigmaのURLや画像を添付する）

## 備考
- 何かあればここに記載する
```

# テンプレートの作り方
それでは実際にテンプレートを作っていきましょう。
やることは次の2つだけです。
1. `.github`フォルダ作成
1. `pull_request_template.md`作成

## .githubフォルダ作成
プロジェクトのルートで次のコマンド使ってフォルダを作成してください。

```
mkdir .github
```

## pull_request_template.md作成
作成したフォルダ以下にファイルを作成します。

```
touch .github/pull_request_template.md
```

そして記載したい内容をマークダウンで記載してください。

# GitHubへの反映方法
テンプレートを作成したブランチをmainブランチへマージすれば、次回PR作成時に`description`へ反映されます。

# まとめ
今回はPRテンプレートの作成方法を紹介しました。
テンプレートを使うことで、少しでもレビューが楽になれば幸いです。
ここまで読んでくださりありがとうございました！
OWASP ZAPを使ってみた

# はじめに
ひょんなことからOWASP ZAPを使ってみたので簡単にまとめておきます。

# 導入手順

公式サイトからパッケージをインストール

https://www.zaproxy.org/download/

インストール後にexeを起動しようとすると、私の場合は以下のアラートが出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/8b61e1b8-e009-ee87-4cf5-628572dd7e82.png)

その場合はJDK-22をインストールすることで解決しました。

https://www.oracle.com/jp/java/technologies/downloads/

OWASP ZAPを起動すると、以下の確認画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/a9410ec2-9ff0-9c74-ebaf-112d393d0609.png)

セッションは毎回保持しない設定にしています。

また、画面左上のモードについては「プロテクト」推奨とのことでした。
プロテクトモードにすると指定したURLにしか攻撃がいかず、
逆に標準モードや攻撃モードにした場合は無関係なWebサイトにも攻撃してしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/4c833b5d-b2cc-94a3-b6c7-b24d4f086158.png)


次にOWASP_ZAPから攻撃をしかけるサイトにアクセスします。

私の場合はDockerコンテナで起動したlocalhost:3000に攻撃をしかけたかったのですが、
FireFoxでしかアクセスできなさそうでした。アクセスについての設定方法なども含め、以下の記事を参考にさせていただきました。

https://qiita.com/Sicut_study/items/5e419455991ff8a390aa#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95-3

設定後にFireFoxで3000番にアクセスすると以下のように表示されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/702e3b31-ebd5-5b3c-b63a-b3514d5eac51.png)

この状態でOWASP_ZAPを確認すると、「サイト」にlocalhost:3000の表示がされているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/87716b8d-974b-1cdf-babe-df46ae657793.png)

この状態で、「レポート」から「Generate Report...」をクリックすると脆弱性診断レポートが出力されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/74e59098-1793-6154-776d-e13bf3a4e357.png)

Create React Appで簡単に作成したサイトを診断すると以下の結果でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/c78acbbf-ac33-0622-dd2e-de468e9191da.png)


# おわりに
次の記事でこれらのアラートについて見ていきたいと思います。
Password Generator

## この記事では、Pythonを使って、安全なパスワードを作成するためのコードを紹介したい。

まず、random関数をimportする。
![Screenshot 2024-06-09 at 18.10.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/a23a36ef-e76e-0324-2c10-5a02f1561d6c.png)

一般的にパスワードは、記号、数字、英文字を含めたら安全だと言える。このプログラムコードにおいて、ユーザに、合計何文字のパスワードを生成した欲しいか、記号は何文字含めて欲しいか、さらには数字を何文字含めて欲しいかを聞いてからパスワードを生成する。

![Screenshot 2024-06-09 at 18.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/d70128fc-13a8-60c0-56fd-4615025bb720.png)
以上が、生成したプログラムコードだ。

15文字のパスワードが欲しいとしよう。記号を6文字、数字を6文字含めた場合、以下の写真のようなパスワードを生成できた。

![Screenshot 2024-06-09 at 18.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/7ee783d2-f182-58b1-1522-b3b73fdc529b.png)

一般的にパスワードは最低でも10桁以上の英数字と記号の組み合わせが必要になってくる。パスワードは、コンピュータに記憶されている情報の利用の際に入力する符号である。それが第３者に乗っ取られた場合、危険になりかねない。これをきっかけに皆さんもPassword Generatorを使って、いろんなサイトに利用するパスワードを作成したらいかがだろうか。
Fizz Buzz 問題に挑戦してみた

### FizzBuzz問題とは

"FizzBuzz"とは英語圏の有名な言葉遊びです。ルールは1から順に数を数え上げていき、3の倍数なら「Fizz」、5の倍数なら「Buzz」、両方の倍数（15の倍数）なら「Fizz Buzz」、いずれでもなければその数を言うというものです。簡単なプログラミングの練習として、3の倍数のときは「"fizz"」、5の倍数のときは「"buzz"」、共通の倍数（のときは「"fizzbuzz"」、その他は「数値」を戻すという単純な処理を実装します。

そこで今回は、範囲を1から100だけに限定して、どの数字がFizz, Buzz,FizzBuzzになるかを検証してみた。

### プログラムコード

```python
target = 100
for number in range (1, target + 1):
  if number % 3 == 0 and number % 5 == 0:
    print ("Fizz Buzz")
  elif number % 3 == 0:
    print ("Fizz")
  elif number % 5 == 0:
    print ("Buzz")
  else:
    print (number)
```
### 出力結果
```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
Fizz Buzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
Fizz Buzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
Fizz Buzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
Fizz Buzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
Fizz Buzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
``` 
ちゃんと3の倍数の時は、Fizz, 5の倍数の時は、Buzz, 15の倍数の時は、FizzBuzzとして出力されている。3の倍数、5の倍数、15の倍数ではない時は、通常の数字が出力されている。今回の検証結果においては、範囲を1から100に限定したが、次回の記事においては、範囲を1から1000にして、このプログラムコードを検証してみる。さらに、素数の倍数判定法についても説明します。
じゃんけん(Rock Paper Scissors)

### パソコンとのじゃんけんをPythonを使って書くのが、この記事の目的だ。

まず、random関数をimportする。じゃんけんらしくするために、
以下の画像のように、グー、チョキ、パーの画像も取り入れた。

![Screenshot 2024-06-09 at 17.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/66699962-55ff-dc8a-274f-f990e10298b5.png)

次に、以下の写真のように、0をRock (グー）、1をPaper(パー）、2をScissor（チョキ）に置き換え、ユーザーに出す手を選ばせる。
![Screenshot 2024-06-09 at 17.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/5d626e16-bb04-fd68-cfb8-8631ce9dbba9.png)

そして、今回私は1、つまりパーを選択した。以下の写真のように、パソコンは、グーを選択したので、今回は私が勝利した。

![Screenshot 2024-06-09 at 17.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/99b211dc-213c-5bea-fa55-b20a626c9f02.png)

以下が、私の書いたPythonコードだ。

![Screenshot 2024-06-09 at 17.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/a0029fbc-2843-48ed-c4a3-d067b99b67bf.png)
![Screenshot 2024-06-09 at 17.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/c268e8fc-def2-2fbe-eae3-74873adec4fc.png)

引用元：
https://github.com/dericsadrs/100-Days-of-Code-Complete-Python-Pro-BootCamp/blob/master/Day%204/rock_paper_scissors.py
（プログラムコードは、一部改変）

皆様も、このコードを参考にし、スキマ時間にパソコンとのじゃんけんをしてみては
いかがでしょう。
Tip Calculator（チップの計算機）

### 日本では、チップの制度はないが、海外へ旅行したときは、レストランのウェイターへのお礼として、食事代にチップを追加して支払うのが慣例だ。本記事の目的は、チップを割り勘した際にいくらずつ支払うべきかを計算するコードをPythonを使って書いた。

### print ("Welcome to the tip calculator!")
これは、チップ計算機へようこそという意味だ。

![Screenshot 2024-06-09 at 17.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/d99cb5a7-edc6-9344-1d9e-0ff5af80366c.png)

以上の画像のコードをPythonで書いた場合、これに辿り着く。
![Screenshot 2024-06-09 at 17.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/2e19dc6a-51aa-9b18-d3c2-8f02141f42e7.png)

飲食代金が、1000円だったとしよう。
チップ15%を含めた代金は、1000 x 1.15 = 1150円になる。
これを5人で割り勘したい場合、1150 x 0.2 = 230円
つまり、5人全員が、230円ずつ飲食代金を支払えばいいことになる。

![Screenshot 2024-06-09 at 17.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/c8d519b7-9f50-dc55-eb15-4b0c2f2ae8c7.png)

飲食代金が、8800円だったとしよう。
チップ12%を含めた代金は、8800 x 1.12 = 9856円になる。
これを6人で割り勘したい場合、9856 x 1/6 = 1642.67円
つまり、6人全員が、1642.67円ずつ飲食代金を支払えばいいことになる。
現実的には、それができないので、この場合は、誰かが多めに支払う必要があるだろう。

![Screenshot 2024-06-09 at 17.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/445c4f66-68a0-7d58-e982-0f04ea57cfb5.png)

日本国内で旅行に行った場合、チップは必要ないが、海外へ旅行した際にチップを求められたら、このようなプログラムコードを書いて計算したらどうだろうか。
Band Name Generator

## この記事の目的は、生まれた都市とペットの名前を入れることによって、バンドの名前を作成するやり方をPythonで書き上げた。

1. print("Welcome to the band name generator")
2. city = input("which city did you grow up in?\n")
3. pet = input ("what is your name of your pet?\n")
4. print ("Your band name would be " + city + " " + pet)

例えば、which city did you grow up in?にnishinomiya
       what is the name of your pet?にfredrick
       と入力すると、Your bandname would be nishinomiya fredrickと出力される。
       それが、この添付の画像に出力されている。
![Screenshot 2024-06-09 at 17.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518583/c597fd92-6a28-8417-cbf3-0b2f3de890d3.png)


皆さんもぜひ試してみてください。
IBM i Services Directory : QSYS2.DATA_AREA_INFO ビュー

## DATA_AREA_INFO ビューとは？

そのままですが、IBM i の指定したライブラリーやデータエリア*DTAARAオブジェクトの設定値を参照するSQLサービスです。

参照：[DATA_AREA_INFO ビュー](https://www.ibm.com/docs/ja/i/7.5?topic=services-data-area-info-view)

## Navigator for i のサンプルをACS SQLスクリプト実行画面に連動して実行させる方法

ところで、Navigator for i（ブラウザー）にはいろいろなIBM i サービスのサンプルスクリプトがありますが、その実行はACSのSQLスクリプト実行を使う方が何かと便利だと思います。ということで、***Navigator for i でSQLスクリプト実行を選択するとACSのSQLスクリプト実行画面を起動してサンプルをコピペする機能が搭載されています。***
全体の関係図は下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ec2dc30e-c9a5-5ecb-ed9f-38ed77517943.png)

***ポイントは①ACSでナビゲーター要求を開始 にすることです。***
※Navigator for i はそのままの名前で通りがいいと思うのですが、ACS上では"ナビゲーター"と表記されてるので？？となってしまう方もいそうです、この辺IBM社イマイチーといつも思います^^;

### ACSでナビゲーター要求(Navigator for iからのリッスンポートを起動する）手順
***ACS -> ツール -> ナビゲーター要求 を選択***
***ナビゲーター要求のパネルが表示されるので、接続したいIBM i を選択して開始ボタンを押す（画面コピーは開始済みの状態）***
※WindowsクライアントではPC再起動ごとにリッスンポートの開始が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/80e43d77-ced9-b5da-966b-6d2e3f3da20a.png)

以上で完了です。

## QSYS2.DATA_AREA_INFOビューを実行する
このIBM i サービスのサンプルがNavigator for i で提供されています。

***Navigator for i (http://IBM i ホスト名or IP:2002/Navigator)でアクセス -> システム -> SQLサービス でサンプル画面が開きます。

Navigator for i には2つ、サンプルがありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3aaad082-fea0-10d4-0fc9-16394b24a9dc.png)

### ①テーブル関数DATA_AREA_INFO を実行してみる
下記のようなサンプルが生成されました
```
-- Description: Show the value of DTAARA1 based on the current library list.
select DATA_AREA_LIBRARY,
       DATA_AREA_NAME,
       DATA_AREA_VALUE
    from table (
            QSYS2.DATA_AREA_INFO('DTAARA1', '*LIBL')
        );
```
ここで、DTAARA1, *LIBLは任意のオブジェクト名、ライブラリー名に置き換えて実行します。
下記では適当にQUSRSYSのデータエリア名を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b05f6752-0b83-1f24-0df3-d7328c81975e.png)

### ②ビュー DATA_AREA_INFO を実行してみる
こちらのサンプルは下記です。
```
-- Description: List all data areas named DTAARA1 and their values.
select DATA_AREA_LIBRARY,
       DATA_AREA_NAME,
       DATA_AREA_VALUE
    from QSYS2.DATA_AREA_INFO
    where DATA_AREA_NAME = 'DTAARA1';
```
ここでも DATAARA1 は任意のデータエリア名に置き換えて実行します。
下記は TEST として実行しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d2bc953a-6a2d-3e82-98e4-850aeb58b6ad.png)

このサンプルではTESTという名前のデータエリア*DTAARA すべての値が返されます。

### マニュアル記載のサンプルを実行してみる
上に張り付けたマニュアルリンクにもサンプルがありあした
```
SELECT DATA_AREA_NAME, DATA_AREA_VALUE FROM QSYS2.DATA_AREA_INFO
  WHERE DATA_AREA_LIBRARY = 'MYLIB';
```
MYLIBを任意のライブラリーに変更、実行します。

結果は下記のように指定ライブラリー中のデータエリアの設定値を一括で取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d96b2797-5679-4984-63d1-e8d3e2bfae82.png)
Salesforceでログインを簡単にしよう～Salesforce Logins by Synebo

本橋孝昭です

みなさんSalesforceにログインする際はどのようにログインしてますか？

「そりゃあSalesforceにログインするならSalesforce IDとパスワードを使うだろ」と思っている方。はい。おっしゃる通りです


とはいえ、Salesforce開発用のSandboxやDeveloper環境でも、いちいちSalesforceIDやパスワードを使ってログインするのは、ちょっと大変ではないでしょうか？

今回は、そんなSalesforceログインを簡単にするための拡張機能「Salesforce Logins by Synebo」について解説します

なお、今回はあくまでも設定手順をお伝えしますが、
もしもこちらの拡張機能を使う際はよく内容を確認しSandboxなどで検証して動作を確認することをお勧めします


## ステップ１　下記リンクから「Cheromeに追加」を行う


まずはGoogle Chromeから下記リンクをクリックし「Chromeに追加」を行いましょう

https://chromewebstore.google.com/detail/salesforce-logins-by-syne/mhpbcjokcjoldhjcapkcmfkkkgepapgm?pli=1


Chromeに追加はすぐに終わります

以下のような画面になれば設定は完了です


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d2645f59-74ce-1749-ec65-e50959dc7bfe.png)


## ステップ2　Salesforce環境のユーザ名、パスワードを追加しましょう


後は以下画像のようにユーザ名とパスワードを追加すれば完了です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f5cb10f2-b7ed-13ed-a1dc-95dc9479bdb8.png)

以上で設定が完了です

あとはこの画面から下記画像のようにログインしたい環境の右部にある→マークをクリックすることで容易にSalesforce環境にログインすることが可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8881cdbb-03d3-92a5-993d-1d739be671fa.png)
毎日ABC day16【c++】ABC330 A-C問題解説【ACコード付き】

# AtCoder Beginner Contest 330

https://atcoder.jp/contests/abc330

## A - Counting Passes

$N$ 人の点数が与えられるので、$L$ 点以上取得した人数を求めよ、という問題。

1人ずつL点以上か調べていく。

```cpp
int main()
{
	int N, L;
	cin >> N >> L;
	int A[109];
	int ans = 0;
	for (int i = 1; i <= N; i++)
	{
		cin >> A[i];
		if (A[i] >= L) ans++;
	}
	cout << ans << endl;
	return 0;
}
```

## B - Minimize Abs 1
問題はややこしく書いているが、とどのつまり
 - 左端の $L$ より小さければ $L$
 - 右端の $R$ より大きければ $R$
 - そのどちらでもない、つまり中間に属していたら $A_{i}$ 

をそれぞれ出力すれば良い。

```cpp
int N, L, R;
int A[200009];

int main()
{
	cin >> N >> L >> R;
	for (int i = 1; i <= N; i++) cin >> A[i];
	for (int i = 1; i <= N; i++)
	{
		if (i > 1) cout << " ";
		if (L > A[i]) cout << L;
		else if (R < A[i]) cout << R;
		else cout << A[i];
	}
	cout << endl;
	return 0;
}
```

## C - Minimize Abs 2
最初は $\sqrt{D}$ の最大値である $\sqrt{2} \times 10^6$までの累乗の数を事前に計算しておいて、一番近い値をDから引く方式を採用していたが、うまくいかなかったので素直に$\sqrt{D}$まで可能性のある$x$の値を全探索する方式に変更。

xの値が決まるとyの値は2択まで絞られるのがミソな問題だった。

```cpp
int main()
{
	ll D;
	cin >> D;
	ll ans = 1e18;
	for (ll i = 0; i*i <= D; i++)
	{
		ll y_diff = D - i * i;
		ll y = sqrt(y_diff);
		for (ll j = 0; j <= 1; j++)
		{
			ll y_tmp = y + j;
			ll diff = abs(y_diff - y_tmp * y_tmp);
			ans = min(ans, diff);
		}
	}
	cout << ans << endl;
	return 0;
}
```
新卒•未経験エンジニアに向けて入社後に抱いた感想をお伝えします！

# はじめに
自分自身も未経験からIT業界に飛び込んだのですが、そこで感じた感想を共有します！
入社した会社によると思うので、必ずしも自分と同じ感想を抱かないと思います！


# 1. ドキュメント作成が多い
自分は入社する前は、「就業時間中はずっとソースを書くのだろう。」と思っていました。
実際入社した会社では、すぐに開発業務に携わることができました。
ただしずっとテキストエディタ・IDEとにらめっこしてるわけではなく、ExcelやWord等を使用して設計書や環境構築資料等のドキュメントを書いている割合が比較的高いです。
むしろ最初は日本語をこんなに書くのか…とギャップに驚かされました。
実装力だけではなく、ドキュメント作成技術もエンジニアにとって大切なものだということを痛感しました。
もっと誰にとっても見やすいドキュメントを作成していきたいですね。

# 2. やはり自己解決が成長につながる
幸運なことに自分の周りは優しい先輩がたくさんいました。
何か実装で詰まったりしたら、優しく教えてくれる先輩ばかりでした。
ただし自分は先輩の手を止めるのがすごく嫌で、入社して一か月してから、できる限り自分で解決できる様に努めました。
そこからはアドバイスを頂くタイミングは、コードレビュー等の実際完成したものを見せる時になりました。
結果的に自分で主体的に考えて行動できる様になったため、チーム内の作業効率も上がり、自己解決力も成長を感じられる様になりました。
そんなある日自分と同じく未経験で入社された方が入社し、自分が教育する立場になりました。
優しかった先輩と同じく、自分自身も親身になって一緒に頑張っていたのですが、あまり後輩の成長を感じる事ができないと思いました。



# 3. 会議が多い
自分が入社した会社の規模はかなり小さく、チームで開発する際も4人体制という規模ですが、それでも会議が多いです。
対お客様との会議、チーム内での会議、会社全体としての会議、その全てが大切なものなのですが、それだけで1日が終わる時もあります。
ドキュメントの話と被りますが、会議では議事録が必須なので、ひたすら日本語を書いて1日が終わった時は、「ソースを書きたい」という欲求が止まりません(笑)

# 4. 自己学習は凄く大切
エンジニアの世界では学ぶことが多いので、就業時間中だけでは到底追いつけません。
また「この部分が足りなかったから、明日までにこういう所を復習しないとな」や「明日これを扱うが知識が足りてないから予習」等自分は就業時間中から、こういう事をしないと考えています。

# 5. やっぱり開発は楽しい！
新規機能開発を任されると自分で考え実装していくので、やはり楽しいです。
一番最初に機能開発を任された際自分の力で達成することができたのですが、
ITエンジニアとしてキャリアを歩み始めたと感じました。
それ以降も色々開発をしていましたが、やはり開発となると心が躍ります。

# 最後に
自分は正直キラキラしたイメージを抱いた状態でIT業界に飛び込みました。
キラキラだけではなく、しんどい事も色々経験しましたが、自分はこの仕事が大好きです。
今理想と現実に苦しんでいる方もそれを乗り越えたらもっと今の職業を好きになれると思います。
大変な事も多いですが一緒に頑張っていきましょう！
Starlightとは？基本と特徴を徹底解説！

この記事ではStarlightというドキュメント作成フレームワークについて解説していきます。Starlightは日本では少し知名度が低いものの、とても使いやすく非エンジニアの方との共同作業もしやすいのでこの記事を読み終えたらぜひ実際に使用してみてください！

# Starlightとは？
StarlightはAstro.jsというJavaScriptフレームワークをベースにして作成されたドキュメント作成ツールです。他のドキュメント作成ツールのSphinxやMkDocsと比べるとまだ知名度は低いですが、今後少しずつ普及していくと思います。

https://starlight.astro.build/ja/

StarlightではMarkdownとMDX（Markdown±JSX)ファイルでドキュメントを書いていく事ができます。MDXファイルでも書けるため、JavaScriptが分かるのであればドキュメントに独自のコンポーネントを使用したりすることも可能です。

**個人的にありがたいStarlightの機能**

::: note
1. デザイン力がないプログラマー（筆者も含む）でも洗練されたドキュメンテーションを作成する事ができる
2. アイコンがデフォルトで入っているのでわざわざアイコンを入れるために無駄なパッケージをインストールする手間が省ける
3.　カスタマイズする方法などもStarlight公式ドキュメントに載っているため、学習コストが低く扱いやすい
:::
の三つです。

個人的なプロジェクトのドキュメント以外にもFontAwsomeのドキュメントにもStarlightが使われています。

https://docs.fontawesome.com/




![スクリーンショット 2024-06-09 21.41.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/455abd3b-ebee-77cd-5752-1bd491af6d21.png)
*Starlightを使用すると奇麗なドキュメンテーションを簡単に作成する事ができる*

## Starlightを実際に使ってみよう！
深く説明するとこの記事の趣旨から大きく外れてしまうので詳しい説明は割愛しますが、ここで簡単な使い方を解説したいと思います。

初めに、Starlightのプロジェクトを作成する方法を解説していきます。作り方はカップラーメンを作るより簡単です。Starlightのドキュメントにあるコマンドをコピペして実行するだけです。

```terminal
npm create astro@latest -- --template starlight
```

すると下に貼り付けてある画像のような画面になると思うので、参考にしてください。
![スクリーンショット 2024-06-09 21.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/e1a721be-3d68-b77c-88f2-83c3b7d68592.png)

英語ですが、聞いていることは単純で**どこに****どんな名前**のプロジェクトを作成したいか？ということだけです。僕は`./Sample`と入れました。

![スクリーンショット 2024-06-09 21.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/5801cd1e-af60-0d81-c010-f931df89ab7e.png)
次に聞かれるのがTypeScriptの方が良いかです。ここは個人の好みで選んでください。（Noを選ぶとシンプルなJavaScriptでコードを書きます）
![スクリーンショット 2024-06-09 21.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/e25c55f1-d23d-160e-d8d8-a9875043336d.png)
**TypeScriptを使用すると答えた方のみ（Noと先ほど答えた方は飛ばしてください！）**
TypeScriptを使用する場合TypeScriptをどれほど厳格にしたいのか聞かれます。僕はStrictにしました。
![スクリーンショット 2024-06-09 21.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/c10f0abe-b37f-84d3-1ce9-37adcf6ddc99.png)
次に依存しているパッケージをインストールするか聞かれます。ここは絶対にYesと答えましょう。
![スクリーンショット 2024-06-09 22.00.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/52f2f75b-5431-6018-9738-5c051bc4c843.png)
最後にGitレポジトリーを作成するかどうかも聞かれます。インターネット上に実際に公開する場合Github上でファイルなどがあると便利なのでYesと答えておくと楽です。
これらの質問に応え終わってEnterを押すとプロジェクトが作成されます。

![スクリーンショット 2024-06-09 22.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/1d085799-ec3f-c6f9-c728-7e5dfc967b09.png)
![スクリーンショット 2024-06-09 22.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/4dcaca70-7238-6e6c-9cb8-2df5f061064b.png)
プロジェクト作成が成功するとマスコットのHouston君が次にできることを教えてくれます。これでプロジェクト作成は完了です。
ここから先のステップに関しては以下のリンク先の公式ドキュメントをお読みください。

https://starlight.astro.build/ja/getting-started/


# 最後に
今回はStarlightについて短く解説しました。続この記事の改善点や続編や書いてほしい記事の希望などについてはコメント欄で丁寧に教えていただけると助かります。
最後まで読んでいただきありがとうございました😊
3DCGにおいて表面のディテールを表現する技術

3DCGを学習していた際にバンプマッピング、ノーマルマップ、ノーマルブレンドの三つの用語の違いについて混同したので、下記に特長や違いをまとめます。

## バンプマッピング (Bump Mapping)

**概要**:
バンプマッピングは、表面の凹凸を疑似的に表現するための技術です。実際のジオメトリ（頂点）は変化せず、テクスチャを用いてライトの当たり方を変えることで凹凸があるように見せます。

**特徴**:
- **テクスチャの利用**: バンプマッピングでは、通常のカラーテクスチャに加えて「バンプマップ」と呼ばれるグレースケールのテクスチャを使用します。このテクスチャは各ピクセルの高さを示し、ライトの反射を調整します。
- **ジオメトリは変更されない**: 表面の実際の形状は変更されず、見かけ上のディテールを追加します。
- **計算負荷**: 計算は比較的軽量で、古いハードウェアでも実装が可能です。

**利点**:
- 計算コストが低い。
- 簡単に実装でき、効果的なディテール追加が可能。

**欠点**:
- 表面のシルエットは変わらないため、特定の角度から見ると効果が薄れる。
- 高精細なディテールを表現するには限界がある。

## ノーマルマッピング (Normal Mapping)

**概要**:
ノーマルマッピングは、表面の法線（ノーマル）ベクトルを変更することで、より詳細なディテールを表現します。これにより、光の反射がリアルに変化し、凹凸があるように見せます。

**特徴**:
- **テクスチャの利用**: ノーマルマッピングでは、RGBカラーチャネルを使用して法線ベクトルの情報を格納する「ノーマルマップ」を用います。このテクスチャによって、各ピクセルの法線ベクトルを直接変更します。
- **ジオメトリは変更されない**: 実際の頂点データは変更されず、視覚的に表面のディテールが向上します。
- **計算負荷**: バンプマッピングよりも計算がやや複雑ですが、現代のハードウェアでは問題なく処理可能です。

**利点**:
- よりリアルな凹凸表現が可能。
- 高解像度のディテールを表現できる。

**欠点**:
- テクスチャデータの準備が複雑。
- 計算コストがバンプマッピングより高い。

## ノーマルブレンド (Normal Blending)

**概要**:
ノーマルブレンドは、複数のノーマルマップをブレンドして使用する技術です。これにより、異なるノーマルマップの効果を組み合わせて、さらに複雑な表面ディテールを実現します。

**特徴**:
- **複数のノーマルマップ**: 複数のノーマルマップを一つのサーフェスに適用し、それらを適切にブレンドします。
- **複雑なディテール**: 一つのノーマルマップだけでは表現できない複雑なディテールを再現可能です。
- **計算負荷**: 計算はさらに複雑になり、ブレンドのための追加計算が必要になります。

**利点**:
- 複数のディテール層を組み合わせることで、リアルで複雑な表面表現が可能。
- 柔軟な表現力が向上。

**欠点**:
- 計算コストが高くなる。
- 実装が複雑。


## まとめ

バンプマップは凹凸のみを表現。ノーマルマップは法線を定義

- **バンプマッピング**: テクスチャを使って法線を変更し、視覚的に凹凸を追加。軽量で簡単。
- **ノーマルマッピング**: RGBテクスチャを使用して法線ベクトルを直接変更し、詳細なディテールを表現。よりリアルで詳細。
- **ノーマルブレンド**: 複数のノーマルマップをブレンドして使用し、複雑なディテールを表現。高コストだが柔軟な表現力。

## 参考にした記事
https://docs.unity3d.com/ja/2019.1/Manual/StandardShaderMaterialParameterNormalMap.html
マルチスレッド方式による並列Lisp

# 回顧
昨年、私はマルチスレッド方式による並列Lisp実装を試みていました。動作はするようになったものの、期待した並列性能が出ませんでした。スレッドプーリングの手法など効率化を試みたのですがうまくいきません。とうとう私は断念していました。CPUのL３キャッシュの問題ではないのか？という仮説を立てました。L3キャッシュは各コアCPUで共用されています。これのキャッシュミスではないかという仮説です。

![bandicam 2024-06-09 16-53-40-166.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/de9ec709-2283-d699-980e-946c8edd6fd0.jpeg)



# 再考
今年になりマルチプロセス方式で並列Lisp実装に挑戦しました。これはうまくいきました。２つのコアCPUに計算を分割することによりおおむね処理時間が2分の１に短縮されたのです。この結果をうけて私は以前の仮説が間違いであること思うようになりました。なぜならL3キャッシュの問題であればマルチプロセス方式でも同様に並列の効果がでないはずです。

![thread1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/7396418d-970b-8303-0fac-e92379324f0d.png)



# ラズパイ400
不思議なことにラズパイ400ではマルチスレッド方式でも並列の効果が表れていたのです。ところがデスクトップパソコンで利用されているインテルやAMD製のCPUでは並列の方が遅いのです。ラズパイ400はインテルなどのCPUの10分の１程度の速度しかありません。ひょっとしたら遅いために競合が起きにくくなっているからではないのか？と考えなおしました。インテル、AMDのCPUは高速です競合が頻繁に起きているように思えました。

![bandicam 2024-06-09 16-56-44-045.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/82d44b11-8544-491d-95b8-884595ea0b72.jpeg)



# 実証
この疑問を晴らすために自作のEasy-ISLispのマルチスレッドの実装を見直しました。多くの部分はスレッドセーフにしたのですが、ヒープ領域からセルを切り出してくる部分がスレッドセーフにはなっていませんでした。競合を回避するためにロック・アンロックをかけていました。ヒープ領域を分割し空リストを保持する自由リストをスレッドごとに独立させる方式を考えました。

![thread2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/00aaed17-959f-2023-5953-abad09436f92.png)



# 部分的な計算実験
セルを取り出している関数はfreshcell()という関数なのですが、リスト処理、計算など多くの関数がこの処理に依存しています。全部を書き換えるのはたいへんです。次の並列によりフィボナッチ数を計算するコードに絞って調べてみました。

```
;;----------- multi-thread-----------------

(defun fib1 (n)
    (mt-let ((a (fib (- n 1)))
             (b (fib (- n 2))))
        (+ a b)))

(defun fib (n)
    (the <fixnum> n) 
    (cond ((= n 0) 0)
          ((= n 1) 1)
          (t (+ (fib (- n 1)) (fib (- n 2))))))

```

Easy-ISLispでは小整数は即値になっておりセルを消費しません。フィボナッチの計算においてセルを消費しているのはapply関数で使用されるevlis関数であることが判明しました。ここでセルを消費しています。

```

int evlis(int addr, int th)
{
    arg_push(addr, th);
    top_flag = false;
    if (IS_NIL(addr)) {
	arg_pop(th);
	return (addr);
    } else {
	int car_addr, cdr_addr;

	car_addr = eval(car(addr), th);
	arg_push(car_addr, th);
	cdr_addr = evlis(cdr(addr), th);
	car_addr = arg_pop(th);
	(void) arg_pop(th);
	return (tcons(car_addr, cdr_addr, th));
    }
}

```


そこでこの部分をスレッドセーフなtcons関数に置き換えてみました。


# インタプリタでの実行
LinuxMINTのマシンで計算させました。AMDのRyzenが搭載されています。6コアです。これを２つのワーカースレッドで起動させてフィボナッチ数を計算させました。結果は下記のようです。


![2024-06-10 08-25-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/32fc812a-9d2a-557a-e551-0f5b4473ed78.png)



どうやらこんどの仮説は正しいようです。並列の方が高速になっています。


# 改良
ようやく原因が判明しました。原因がわかってしまえば改良は時間の問題です。コンパイラも含めてマルチスレッドでの実装を書き直しています。東北大学の伊藤教授の論文を読んで並列Lispに取り組みました。1年ほど試行錯誤してようやく深い理解に達したようです。

https://github.com/sasagawa888/eisl
PlaygroundにSwiftパッケージを追加したプロジェクトを爆速で作る

## はじめに

こんにちは。
最近、プロジェクトで新しいSwiftパッケージを試したいと思うことが増えてきました。
しかし、Xcodeを普段お使いの方には伝わるかと思うのですが、新しいパッケージを試すためだけの環境をすぐに用意するのは思ったよりも手間がかかりますよね。
とくにXcodeに慣れていない方（私もその一人です）にとっては、とりあえず試したい環境を作りたいだけなのに…と大変に感じると思います。

そこで、色々調べてみたのですが、ArenaというCLIツールを使うと簡単に作成できることがわかりました。
あまり知られていないかもしれないので、今回はこのArenaを使ってPlaygroundにSwiftパッケージを追加したプロジェクトを爆速で作る方法を紹介します！

:::note warn
本記事では以下の環境を想定しています  

- macOS Sonoma 14.3
- Xcode 15.2
:::

## Arenaとは

<!-- markdownlint-disable MD034 -->
https://github.com/finestructure/Arena
<!-- markdownlint-enable MD034 -->

公式サイトにおいて、Arenaは以下のように説明されています。
> Arenaとは、SPM(Swift Package Manger)を用いて簡単にセットアップされたSwift Playground入りのXcodeプロジェクトを作成するためのmacOSのコマンドラインツールです。
> また、Arenaは（パッケージとして）GitHubだけでなく、ローカルリポジトリも参照できます。特に後者においては、ライブラリ（パッケージ）を開発中にPlaygroundを作成するのに便利です。

## 手順

### 1. Arenaのインストール

インストール方法は以下の通りで、HomebrewやMintなどを用いてインストールできます。

```bash
# Homebrewの場合
brew install finestructure/tap/arena

# Mintの場合
mint install finestructure/arena
```

### 2. Arenaを用いてプロジェクトを作成する

今回は、APIクライアントライブラリの[Alamofire](https://github.com/Alamofire/Alamofire)を使用するプロジェクトを作成してみます。
`arena`コマンドのパラメーターに、使用したいパッケージのURL全体あるいは省略形（組織名とリポジトリ名のみ）を入れて実行します。

```bash
# URL全体の場合
arena https://github.com/Alamofire/Alamofire

# 省略形の場合
arena Alamofire/Alamofire
```

実行に成功すると、Xcodeが起動し作成したプロジェクトが開かれます。
Arenaで作成したプロジェクトには、以下の2つが含まれています

- `Content`（Playground）
- `PlaygroundDependencies`（Playground用パッケージ）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646568/ab2bdabf-a837-29c9-f529-f000c30f96ad.png" alt="initial_file_navigator" width="300">

### 3. Swift tools versionを修正する

:::note warn
後述するエラーが表示されない場合はこちらのプロセスはスキップして大丈夫です。
:::

XcodeのIssue Navigatorに以下のエラーが表示される場合があります。
`package 'playgrounddependencies' is using Swift tools version 5.10.0 but the installed version is 5.9.0`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646568/33a9b2d9-b197-7b96-e7dc-c219e7d87965.png" alt="swift tool version error" width="300">

この場合、`PlaygroundDependencies`内の`Package.swift`ファイルを開き、`swift-tools-version`を`5.9`に変更することでエラーを解消できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646568/9b55cbcd-fbd3-f04a-6e1e-90dd7f6cf053.png" alt="swift_tool_version_fix" width="600">

エラーが解消されると以下のように自動でパッケージがダウンロードされます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646568/ea074ef1-ee62-3f56-60ab-c0bab634a21d.png" alt="alamfire_installed" width="300">

### 4. Swift Playgroundを移動させる

これでやっとPlaygroundでAlamofireが使える！と思いきや、実はまだ使えません。
これは、`Content`がAlamofireが使用可能な`PlaygroundDependencies`の外側にいるためです。そのため`Content`を`PlaygroundDependencies`内に移動させる必要があります。

移動後のXcode File Navigatorは以下の通りになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646568/ac5b924f-41ba-5e9b-f1ef-70e6e0d04700.png" alt="after_moving_content" width="300">

これでPlayground内でAlamofireを使用できるようになりました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646568/b36513e7-7b13-711f-2c8f-c7ad13fb0e7d.png" alt="alamofire_example" width="700">
公開したnpmパッケージ非推奨に変更する

# はじめに
本記事は、公開済みのnpmパッケージを非推奨にしたい場合の設定変更方法について備忘録も兼ねてまとめたものになります。


# 非推奨に変更する
`npm-deprecate`コマンドを使用し対象のパッケージを非推奨に変更できます。

```
npm deprecate 対象のパッケージ名 "非推奨にする理由"
```

https://docs.npmjs.com/cli/v10/commands/npm-deprecate

# 非推奨に変更後
変更後には対象のnpmパッケージのブラウザ画面で次のように警告がでるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/330706fe-f58d-f0f7-fe5d-8b46ffd2d8f1.png)

対象のパッケージをインストールした際にも次のように警告が表示されます。

```
npm WARN deprecated パッケージ名 バージョン: 非推奨の理由
```
【Go】mockgenでディレクトリ内のファイルからモックを一度に作成するスクリプト

# mockgenとは？
Goでモックを作成するためのパッケージです。
※ `golang/mock/mockgen`はアーカイブされているため、使用するのは`go.uber.org/mock/mockgen`になります。

インストールは以下のコマンド
```zsh
go install go.uber.org/mock/mockgen@latest
```

モックを作成する際は、以下のコマンドのように一つづつ作成するが、正直めんどくさいですよね😇
``` zsh
mockgen -source=foo.go [other options]
```

という事で、対象ディレクトリ内のファイルを全てモック化してもらいましょう😎

# ディレクトリ内のファイルから一度にモックを作成するスクリプト

``` shell
#!/bin/bash -eu
# 環境変数設定
ROOT=対象のルート
MOCK_DATA_ROOT="モックを格納するディレクトリ"

# ROOTのモック化したいファイルのあるディレクトリ一覧
# この例では、usecaseとrepositoryディレクトリ配下のファイルを指定
SEARCH_DIR_LIST="
domain/repository
usecase
"

echo "Start..."

cd ${ROOT}

for dir in ${SEARCH_DIR_LIST}; do
  # test.go以外のgoファイルを対象のディレクトリから探す
  file_path_list=$(find ./${dir} -type f -not -name "*_test.go" -name "*.go")

  for file_path in ${file_path_list}; do
    # file_pathからモック作成
    mockgen -package mock -source=./$file_path -destination=./$MOCK_DATA_ROOT/$file_path
  done
done

echo "Done."

```
よく使う Linux コマンド一覧

# 基本コマンド

## ls: ディレクトリの内容を表示する

```bash
  ls
  ls -l
  ls -a
```

## cd: ディレクトリを変更する

```bash
cd /path/to/directory
cd ..
```

## pwd: 現在のディレクトリを表示する

```bash
pwd
```

## cp: ファイルやディレクトリをコピーする

```bash
cp source_file destination_file
cp -r source_directory destination_directory
```

## mv: ファイルやディレクトリを移動または名前を変更する

```bash
mv old_name new_name
mv file_name /new/path/
```

## rm: ファイルやディレクトリを削除する

```bash
rm file_name
rm -r directory_name
```

## touch: 空のファイルを作成する、または既存ファイルのタイムスタンプを更新する

```bash
touch new_file
```

## mkdir: 新しいディレクトリを作成する

```bash
mkdir new_directory
mkdir -p /path/to/new_directory
```

## rmdir: 空のディレクトリを削除する

```bash
rmdir directory_name
```

# ファイル操作コマンド

## cat: ファイルの内容を表示する

```bash
cat file_name
```

## less: ファイルの内容をページ単位で表示する

```bash
less file_name
```

## head: ファイルの最初の部分を表示する

```bash

head file_name
head -n 20 file_name
```

## tail: ファイルの最後の部分を表示する

```bash
tail file_name
tail -n 20 file_name
```

## grep: パターンにマッチする行を検索する

```bash
grep 'pattern' file_name
grep -r 'pattern' /path/to/directory
```

# システム情報コマンド

## df: ファイルシステムのディスク使用量を表示する

```bash
df
df -h
```

## du: ディレクトリのディスク使用量を表示する

```bash
du
du -h
```

## top: システムのリアルタイムのプロセス情報を表示する

```bash
top
```

## ps: 現在のプロセスを表示する

```bash
ps
ps aux
```

## uname: システム情報を表示する

```bash
uname
uname -a
```

# ネットワークコマンド

## ping: ネットワーク接続をテストする

```bash
ping hostname
```

## ifconfig: ネットワークインターフェイスの設定を表示または設定する

```bash
ifconfig
```

## netstat: ネットワーク接続、ルーティングテーブル、インターフェイス統計などを表示する

```bash
netstat
netstat -a
```

## ssh: リモートシステムにログインする

```bash
ssh user@hostname
```

## scp: セキュアコピー（SSH 経由でファイルをコピー）

```bash
scp source_file user@hostname:/path/to/destination
scp user@hostname:/path/to/source_file destination
```

# パーミッションコマンド

## chmod: ファイルやディレクトリのパーミッションを変更する

```bash
chmod 755 file_name
chmod -R 755 directory_name
```

## chown: ファイルやディレクトリの所有者を変更する

```bash
chown user:group file_name
chown -R user:group directory_name
```

# パッケージ管理コマンド

## apt-get: Debian 系ディストリビューションでパッケージを管理する

```bash
sudo apt-get update
sudo apt-get install package_name
sudo apt-get upgrade
```

## yum: RedHat 系ディストリビューションでパッケージを管理する

```bash
sudo yum update
sudo yum install package_name
sudo yum upgrade
```

# その他便利コマンド

## find: ファイルやディレクトリを検索する

```bash
find /path/to/search -name file_name
find /path/to/search -type d -name directory_name
```

## wget: ウェブからファイルをダウンロードする

```bash
wget url
```

## curl: データを転送するためのコマンドラインツール

```bash
curl url
curl -O url
```

## tar: アーカイブファイルを作成、抽出する

```bash
tar -cvf archive_name.tar directory_to_compress
tar -xvf archive_name.tar
tar -czvf archive_name.tar.gz directory_to_compress
tar -xzvf archive_name.tar.gz
```
MySQLの基本

## MySQLとは？
 
オープンソースのリレーショナルデータベース管理システム（RDBMS）。
MySQLは世界で最も使われているRDBMS。

 

#### MSQLのメリット
・OSに関係なく使える。
・接続するIPアドレスを指定できる。
・暗号化通信（SSHやSSL）の機能が備わっている。

#### そもそもの話しデータベースはなぜ必要か
データベースがあることで必要な情報を蓄積し、それが必要な時に取り出せる。

#### リレーショナル（関係）データベースとは何か？普通のデータベースと何が違うのか？

通常のデータベースは、ファイルをそのまま蓄積するだけ。
関係データベースは、外部キーによってデータ間の関係が紐づけられ、データ間に関係性がある。

#### データ間で関係性があると何がうれしいのか？

**間違いに強いデータベースが出来る**
もっと正確に言うと、データの整合性を確保してくれる。

間違えて存在しないデータを挿入したりするリスクがない。

 
　例）親テーブル

　部署IDテーブル

| Dep_ID |
|:-:|
| 1  |
| 2  |
| 3  |

   例）子テーブル

従業員テーブル

| Dep_ID | Name |
|:-:|:-:|
| 1  | Tanaka  |
| 2  | Itou |
| 3  | Sato  |


ここで、

・　外部キーがあると、部署IDテーブルに存在しない部署IDを子テーブルに書くことは出来ない
・　親テーブルの実際に存在するIDを削除すると、それを参照している子テーブルのIDも消える。
・　親テーブルで実際に存在しているIDを参照している子テーブルのデータは削除できない

といった制約がある。
 
普通にデータベースを管理していると、存在しないデータを入れてしまったり、必要なデータを間違って削除してしまったりするケースもある。それを防いでデータの整合性を担保してくれるのが外部キーであり、RDBMSである。

 
#### メンテナンスがより容易
正規化もしている
・重複したデータがない。つまり、修正すると一か所の修正だけでいい。既存のデータベースは、一度変更すると、該当データをすべて変更する必要がある。
標準モジュール

Option Explicit

Public Sub リセット()

''Sheet2の2行目以降を削除するボタンをsheet1に作成

    Dim ws As Worksheet
    
    '対象シートを設定'
    
    Set ws = ThisWorkbook.Sheets("sheet2")
    
    
    'データが入力されている最後のセル（最も右下のセル)を取得'
    
    Dim lastcell As Range
    Dim x As Long
    Dim y As Long
    
    Set lastcell = ws.Cells.SpecialCells(xlCellTypeLastCell)
    
    
    'そのセルの行番号と列番号を取得'
   
    x = lastcell.Row
    y = lastcell.Column
   
    Debug.Print "最終行： " & x & ", 最終列： " & y
    
    'clearcontentsは、値のみ削除'
    
    ws.Range(ws.Cells(2, 1), ws.Cells(x, y)).ClearContents
    
End Sub


Public Sub date_collect( _
    folderPath As String, _
    destinationFile As String, _
    destinationSheet As String)

    '###①定義
    Dim file As String
    Dim wb_output As Workbook
    Dim ws_output As Worksheet
    Dim wb_refer As Workbook
    Dim ws_refer As Worksheet
    Dim rng As Range
    Dim lastrow As Long
    Dim lastcell As Range
    Dim x As Long
    Dim y As Long

    '###②出力先のファイルを開く
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    Set wb_output = Workbooks.Open(destinationFile)
    Set ws_output = wb_output.Sheets(destinationSheet)

    '###③対象フォルダ内のファイルをループ
    file = Dir(folderPath & "*.xlsx")
    
    Do While file <> ""
        Set wb_refer = Workbooks.Open(folderPath & file) ' "Workbook.Open" を "Workbooks.Open" に修正
        Set ws_refer = wb_refer.Sheets(1)

        'データが入力されている最後のセル(最も右下のセル)を取得
        Set lastcell = ws_refer.Cells.SpecialCells(xlCellTypeLastCell)

        'そのセルの行番号と、列番号を取得
        x = lastcell.Row
        y = lastcell.Column

        'コピーする範囲を設定
        Set rng = ws_refer.Range(ws_refer.Cells(2, 1), ws_refer.Cells(x, y))

        '出力先の最終行を取得
        lastrow = ws_output.Cells(Rows.Count, 1).End(xlUp).Row + 1

        'コピー＆ペースト
        rng.Copy
        ws_output.Cells(lastrow, 1).PasteSpecial Paste:=xlPasteValues ' "pastspecial" を "PasteSpecial" に修正

        'ソースファイルを閉じる
        wb_refer.Close SaveChanges:=False

        file = Dir
    Loop

    '出力先ファイルを保存
    wb_output.Save

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    
End Sub
Storybook学んでみた①

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:

**「いいね」か「ブックマーク」**
を頂けると僕のモチベーションアップになります！:thumbsup:
少しでも気に入っていただけたらよろしくお願いいたします！:thumbsup:


# 今回の目的
自分の作ったコンポーネントを確認したり検証するための技術を身に付けたい！
公式のクイックスタートを参考に進めていきます。
項目ごとに補足のみ書いて進めています。わかりづらいところの理解の手助けになれば幸いです！

# 主に参考にさせていただいた記事
https://storybook.js.org/tutorials/intro-to-storybook/react/en/get-started/

# バージョン
React-18.2
Storybook-8.1.4

# 始める
チュートリアルに沿ってプロジェクトをクローンしセッティングのみ

# Simple component
## Taskコンポーネントの作成
### default
```jsx
export default {
  component: Task,
  title: 'Task',
  tags: ['autodocs'],
  excludeStories: /.*Data$/,
  args: {
    ...ActionsData,
  },
};
```
・component
　ストーリーブックで表示するコンポーネント
・title
　ストーリブックでのグループ名
・tags
・excludeStories
・args
　各Storyで使われる共通的な引数を記載。上書きも可能。

## 設定
### taskbox/.storybook/preview.js
Storybookの全体に適用させる設定です。（デコレータの追加、パラメータの設定、グローバルCSSのインポート）
たとえば、main.cssを読み込ませることで全体にスタイルを反映させることができます。
```jsx
import '../src/index.css';
```
### Build out the states
HTMLの整形のみ

### Specify data requirements
マニュアルだとpropsの型チェックのため下記を使用していますが、TypeScriptを使っている人にとっては余分かも。
```jsx
import PropTypes from 'prop-types';
```

### Catch accessibility issues
アクセシビリティの問題を確認する。
```bash
npm i --dev @storybook/addon-a11y
```
@storybook/addon-a11yをmain.jsのaddonsに記載する。
ストーリーブックを再起動し、画面に表示されていることを確認。

![スクリーンショット 2024-06-08 16.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/c08c1838-4a7d-5a69-caa9-c304d08152b0.png)

コントラストなどデザインに関わる部分で警告が出ます。
https://dequeuniversity.com/rules/axe/4.4/color-contrast?application=axeAPI

# 次
https://qiita.com/mr_noppo/items/d2167ae0ce4251a879ef