OmniAICreator/Qiita-1.07M huggingface dataset:
データベーススペシャリスト試験に挑戦してみた(R5秋期)

## はじめに
令和5年度秋期開催(2023/10/8)のデータベーススペシャリスト試験に挑戦し、合格出来ました！
誰かのお役に立てばと思い、雑記として情報を残そうと思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617151/1be360a9-f687-f32b-c78a-3472e3476769.png)




## 何故受けようと思ったのか？
- ~~学生時代からスペシャリストっていう名前がなんかかっこいいと思っていた...~~
- 案件開発での経験から以下のような所感を持っており、一度体系的に学んでみたいと考えたため。
    - DBがイマイチだとコードが幾ら良くても色々と厳しい(基礎がダメな建物のような...)
    - 一度稼働し始めると修正が困難で、最初にしっかりと組んでおく必要が有る 
- 社内の営業さんの実感として、IPAの高度資格持ちが居ると特に官公庁系案件の入札にて有利に働くというものがある
    - 持っているだけで案件獲得に寄与できるならお得だと考えました

## 学習開始時のレベル感など
- Rails/AWSを利用した案件開発にてDBには4年ほど触れていました
  - 1からDB設計をした経験は小さなシステムを除いては無く、基本的には他の方によって既に組まれているDBを利用し、機能追加に応じてテーブル追加等を行うといった形での接点がありました。設計やテーブル追加を行う際もRailsでの利用に即した視点で行うことが殆どでした。
  - パフォーマンス面では「インデックスがあるとなんか早くなる」といった漠然とした理解で、基本的には「Rails頼み」といった状態になっていました。
  - SQLに関してはデータ調査などで利用することもありSELECT文に限ってはある程度の理解があるものの、それ以外は極めて曖昧という状態でした

- IPA資格に関しては学生時代に基本情報を、令和5年春試験にて応用情報を取得していたという状況です
  - 応用情報対策にあたり少しは勉強していたものの、結果的に午後問題にてデータベースを選択する事はなかった、といったレベル感になります


## 学習面について
- 学習ペースに関しては以下のような形で行っておりました
    - 期間:7月に試験申し込みを行ってからの約3か月間
    - 累計学習時間: 約100時間
    - 1日あたりの学習時間：(時間を取れるタイミングで)平日2h、休日4h

- 詳細な勉強法や意識していた点に関しては長くなりそうだと感じた為、
[午前対策](https://qiita.com/TKY_study/items/4e2cb0d13c15fcf9d60a)/[午後対策](https://qiita.com/TKY_study/items/6ddb1935efb9d9006818)別に記事に分割しております。

## 得られた学び・感想など
- ~~学生時代からスペシャリストっていう名前が良いんだよな～と思っていたので取れて嬉しい~~
- 学習前はDBに関しては普通～ちょっと苦手といった少し抵抗感のある印象を抱いていたのですが、今では~~かかってこんかい~~そういった抵抗感が消えたと感じています。
- 今回の学習そのものの効果も大きいのですが、自信が付いてDB系のタスクをより積極的に取れる様になった事で実務経験値(?)の溜まり方が良くなったことも同等かそれ以上に大きな恩恵だと感じています🍀
- 学習開始前はパフォーマンスってなんだ？~~食えるのか？~~ といった状態だったのですが、今ではDDL・DMLからの自分の予想と実行計画を見比べて遊び始めるといった状態になりました🍀
- 実務経験では得られない部分の知見を得られることを期待していたのですが、個人的には本当に期待通りの内容でした
- 案件獲得に寄与できれば嬉しい

## おわりに
例えば私であればDBはRails用、MySQLかつAWS利用といった特定の文脈で利用することが多いところ、
この資格単品で見ると各所で言われている通り特定のベンダーに特化しておらず、概念的な内容が多いという印象を受けました。
しかしだからこそ文脈を問わず実務経験/個人開発を汎用的にサポート・底上げするものとして光るのだと感じ、個人的に強くオススメしたい内容となっております🍀

## 参考にさせて頂いた記事など
https://www.ipa.go.jp/shiken/kubun/db.html
軽深演習 #24 自分を味方にする

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 24日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。

### 前提知識　自分を味方にする

ヒットソング[最高到達点](https://www.youtube.com/watch?v=yu-0eh9jdZg)の歌詞に出てくる一文が、この自分を味方にする。です。ヒットソングと圏論は全然別物で接点がないと思う人もいるでしょう。[軽深演習 #1 BL33XU ](https://qiita.com/zanjibar/items/1c81641dcffe2373ec5b)のポアンカレの言葉を思い出してください。**数学とは違うものを同じものとみなす技術である** です。ヒットソングには価値があると思いませんか？　学ぶところがあると思いませんか？　どんなことでもシェアをたくさんとったことからは学ぶことがあるのではないでしょうか？では、ヒットソングのどこから学ぶのがいいのでしょうか？　聖書の言葉を思い出しましょう。**はじめに言葉ありき**　です。言葉は重要です。それで歌詞です。[When talk is not cheap](https://amzn.to/3v7sPmi)という古い英語のカウンセリングの本に書いてあった一説を今でもよく覚えています。1986年出版の本です。意訳します。「言葉はそれだけでは現実を作り出すことはできないけど、最初につくりかえることができる現実は言葉なんだ」　何かを変えるなら、まず使っている言葉から、変えていきませんか？　
「自分を味方にする」の意味の考察をしましょう。軽深（かるしん　なんちゃって圏論）なので自由に解釈しましょう。自分の経験からなんでも理解できるという意味にとります。**すべての答えは自分の中にある** これは、あちこちで見る文ですね。何を意味するのでしょうか？　[1人の顧客からアイデアを得て広げるN1分析](https://markezine.jp/article/detail/30846)というものがあります。

N1分析を図式で書くと、こんな感じですね。
```mermaid
flowchart LR
A[1人の顧客]-->B[顧客全体]
```

自分を味方にするをこれに適用すると
```mermaid
flowchart LR
A[自分]-->B[みんな]
```
になります。
自分が体験したことは、みんなが体験して理解していると扱うわけです。正確には、圏論的に意味構造を考察して同型性を明確にする作業が必要になります。

例えば、自分には理解できることと理解できないことがある　の図式は
```mermaid
flowchart LR
A-->B[できること]
A[自分には理解]-->C[できないこと]
```

自分を　誰でも　に変えても

```mermaid
flowchart LR
A-->B[できること]
A[誰でも理解]-->C[できないこと]
```

同じ構造になりませんか？　自分の体験を普遍化するわけです。普遍性は、圏論では非常に重要な概念です。

### 演習 自分がいままで経験から学んだことで、歴史から学んだのと同じことはありませんか？

ビスマルクの**愚者は経験に学び、賢者は歴史に学ぶ**という名言があります。経験も歴史も同じになれば、賢者はどんどん増えるでしょう。圏論が面白くなってきたでしょうか？
Ubuntu 22.04 の自動スリープを無効にする

# 方法 

リモートからSSHログインなどを受け付けなくなってしまう.

解決方法：
次のようにスリープ機能を無効にする.
```
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
```

なお戻すときは次のようにする.
```
sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
```
参考文献：
https://askubuntu.com/questions/47311/how-do-i-disable-my-system-from-going-to-sleep
【DependaBot】Axios Cross-Site Request Forgery Vulnerability の脆弱性について

# はじめに
しばらく目を離していた個人開発のリポジトリのDependaBotを確認したところ、下記のAxiosのアラートが出ていました。
どうやらCSRFに関わる脆弱性が発見されたらしく、この脆弱性について個人的に調査をしたので共有したいと思います。
**対応策なども書きますが、私の解釈なのであくまで判断等は自己責任でお願いします。**

> Axios Cross-Site Request Forgery Vulnerability

> An issue discovered in Axios 0.8.1 through 1.5.1 inadvertently reveals the confidential XSRF-TOKEN stored in cookies by including it in the HTTP header X-XSRF-TOKEN for every request made to any host allowing attackers to view sensitive information.

日本語機械翻訳：
> Axios 0.8.1 ～ 1.5.1 で発見された問題により、任意のホストに対して行われるすべてのリクエストの HTTP ヘッダー X-XSRF-TOKEN にそれが含まれることにより、Cookie に保存されている機密 XSRF-TOKEN が誤って暴露され、攻撃者が機密情報を閲覧できるようになります。


# 結論
[こちらの記事](https://security.snyk.io/vuln/SNYK-JS-AXIOS-6032459)が分かりやすかったです。
* 影響を受けるケース
  * v0.8.1〜1.5.1を使っている
  * withCredentialsがtrueになっている
  * XSRF-TOKENという名前のCookieを使っている
* 影響を受けないケース
  * 1.6.0以上を使っている
  * withCredentialsがtrueになっていない
  * XSRF-TOKENという名前のCookieを使っていない
* 対応策
  * バージョンを1.6.0以上に更新する（理想）
  * XSRF-TOKENという名前のCookie名を変更する

# どんな脆弱性か
クライアント側に`XSRF-TOKEN`という名前のCookieが存在していた場合、Axiosが全てのリクエストにおいてX-XSRF-TOKENヘッダに`XSRF-TOKEN`の値を挿入し、サーバーに送信してしまう脆弱性のようです。
`XSRF-TOKEN`はCSRF対策に関わるクッキー名として、一般的にフレームワークなどでもよく使われます。
この値が全てのHTTPリクエストに挿入されることによって、不必要にトークンが攻撃者に見られて攻撃につながるかもしれませんよ、という脆弱性のようです。

# 脆弱性を受けるか確認したいこと
できればバージョンを更新することが理想ですが、Axiosのバージョンアップは影響範囲的にもハードルがあると思うので、優先度判断のためにも確認事項の例を挙げておきますね。
* ソースコードをgrepし、XSRF-TOKENという記述があるか
  * CSRFトークンはサーバー側で発行するので、クライアント側だけでなくサーバー側も確認しましょう
* ブラウザの検証ツール等でAxiosを利用しているリクエストのリクエストヘッダを確認し、X-XSRF-TOKENやXSRF-TOKENに関する記述はないか
* ブラウザの検証ツール等でCookie一覧を確認し、XSRF-TOKENという名前のCookieがあるか

影響を受けるかどうかも大事ですが、なるべくバージョンを上げる方向性で考えましょう。
一旦バージョンを上げてみて、どれくらいアプリケーションに影響があるか早めに確認してみると良いです。


# 調査する上で役に立った資料
* [Axiosのチェンジログ](https://github.com/axios/axios/releases)
* [脆弱性の発覚issue](https://github.com/axios/axios/issues/6006)
* [この脆弱性の概要など説明してる記事](https://security.snyk.io/vuln/SNYK-JS-AXIOS-6032459)
さや香の「見せ算」をPythonで実装する

# はじめに
昨日M1グランプリ2023がありましたね。

個人的にはさや香が好きでしたが、優勝は令和ロマンスでした。

さや香の決勝戦のネタで「見せ算」というものでした。
これは`+-*/`の四則演算に新たな第5の演算を追加したい、というコンセプトのネタです。
今回はこれを可能な限りプログラミングの世界に落とし込み、実装していきたいと思います。

# 見せ算の定義
`+-*/`に当たる部分は「見せ」といい、和差積商に当たる部分は「眼（がん）」と呼びます。

### 基本ルール
1. A=Bのとき、A見せB=0
2. A<Bのとき、A見せB=B

### 応用ルール
1. 6見せ9=11. これは、6と9がお互い形が似ているため見つめ合うように近づいて行き、結果11になる.
2. 2見せ5=11. 6見せ9と同じ論理で11になり、かつ5がスマホをポケットから落とすためそれが小数点となり、1.1になる。
3. 1見せ100=17. 1が17倒すので83になる

# コード
ソースコードはGitHubにPUSH済みです。
本記事ではメインのロジックのみ記載します。

https://github.com/tttol/misezan

```python
def misezan(a, b):
    a, b = min(a, b), max(a, b)
    
    if a == 6 and b == 9:
        return 11
    
    if a == 2 and b == 5:
        return 1.1
    
    if a == 1 and b == 100:
        return 83
    
    return misezan_basic(a, b)


def misezan_basic(a, b):
    if a == b:
        return 0
    
    if a != b:
        return max(a, b)

input = [(6, 9), (2, 5), (1, 100), (5, 5), (10, 3), (30, 100), (200, 140)]
for a, b in input:
    print(f"{a} 見せ {b} = {misezan(a, b)}")
```

実行結果↓
```bash
$ python3 misezan.py
6 見せ 9 = 11
2 見せ 5 = 1.1
1 見せ 100 = 83
5 見せ 5 = 0
10 見せ 3 = 10
30 見せ 100 = 100
200 見せ 140 = 200
```

見事、実装できました。

# 応用ルールの拡張
お気づきの方も多いと思いますが、応用ルールの定義がかなり曖昧です。
その曖昧さにつけこんで、さらに曖昧な応用ルールをＣｈａｔGPTに考えてもらいました。

プロンプト
```markdown
# 見せ算
### 定義
+-*/に当たる部分は「見せ」といい、和差積商に当たる部分は「眼（がん）」と呼びます。

### 基本ルール
1. A=Bのとき、A見せB=0
2. A<Bのとき、A見せB=B

### 応用ルール
1. 6見せ9=11. これは、6と9がお互い形が似ているため見つめ合うように近づいて行き、結果11になる.
2. 2見せ5=11. 6見せ9と同じ論理で11になり、かつ5がスマホをポケットから落とすためそれが小数点となり、1.1になる。
3. 1見せ100=17. 1が17倒すので83になる
ーーーーーーーーーーーーーー
上記の定義に従って、応用ルールをお笑い芸人っぽく拡張してください。
例えば、
- 16と91は上下反転させるとおなじに見えるので1111
- 1000以上同士の引数が2つ与えられた場合戦争を起こして10以下の数字まで減る
```
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/f204f936-0073-1707-1431-01b0a602fb84.png)

面白いルールがでてきたので、これを先程のPythonスクリプトに追加してもらいます。
その結果がこちら↓
```python
def misezan(a, b):
    a, b = min(a, b), max(a, b)

    if a == 6 and b == 9:
        return 11
    if a == 2 and b == 5:
        return 1.1
    if a == 1 and b == 100:
        return 83
    if a == 77 and b == 88:
        return 18
    if a == 404 and b == 505:
        return 6
    if a == 123 and b == 321:
        return 447
    if a == 2020 and b == 3030:
        return 0

    # 基本ルール
    return misezan_basic(a, b)

def misezan_basic(a, b):
    if a == b:
        return 0
    
    if a != b:
        return max(a, b)

input = [(6, 9), (2, 5), (1, 100), (5, 5), (10, 3), (30, 100), (200, 140), 
         (77, 88), (404, 505), (123, 321), (2020, 3030)]
for a, b in input:
    print(f"{a} 見せ {b} = {misezan(a, b)}")
```

実行結果↓
```bash
$ python3 misezan.py
6 見せ 9 = 11
2 見せ 5 = 1.1
1 見せ 100 = 83
5 見せ 5 = 0
10 見せ 3 = 10
30 見せ 100 = 100
200 見せ 140 = 200
77 見せ 88 = 18
404 見せ 505 = 6
123 見せ 321 = 447
2020 見せ 3030 = 0
```

# さいごに
ほかにも面白い追加ルールをコメント欄にてお待ちしてます。
全人類が幸せになるPythonプログラム

# はじめに
全力おてんばおねえさんなので「Qiita、もっと書きたいッ！」となってしまいました。ヤーレンズの「ﾂｯﾂｰｳﾗｳﾗ」も好きすぎました。
ひとまずお気に入りの過去作を投稿してみます。

実務で使う機会が存在するのか謎なrandomモジュールの活用方法です。

# 内容
```python
import random

omikuji_option = [
    "ファビュラス伝説のフルアーマー大吉",
    "毎食後フロス行うと神の国に導かれる",
    "湯船に入るとワンダフル大吉",
    "水周りを掃除すると運気爆上げ",
    "部屋の片づけをすると願望がアホほど叶う",
    "先延ばしをやめると伝説のグランドデラックス大吉",
    "運動するとロイヤルゴージャススーパー大吉",
    "日光を浴びると人生サイコー"
]

omikuji = random.choice(omikuji_option)

print(omikuji)
```
出力
```python
'湯船に入るとワンダフル大吉'
```

このおみくじを毎朝引くと、人生がとても楽しくなります。

「おみくじを引く」というと他力本願で依存的な行為に見えないこともありませんが、愉快なツールと自らの強い気持ちで生活を正しいあり方に補正し続けたい、というのがこのプログラムの作成意図です。
なんでこんなに私のNext.jsは遅いのか

# はじめに
こんにちは、HappyManaです。
今回、Next.jsでの開発をして起きた問題について話していきたいと思います。

# Next.jsのレンダリングが死ぬほど遅い
Next.jsを立ち上げたとき、初回で最大120秒ほどレンダリングに時間がかかります。

長すぎて萎えます。
まだ特にコードも追加してない、create-next-appしたときで23秒でした。

ここで、開発環境を整理すると、以下の感じになってます。
- Docker
- Next.js 13
- Node.js 18
- pnpm(パッケージ管理)

Dockerについては、APIサーバの方でRails+PostgreSQLを使っていたので、それ用のサーバも一緒に立ち上げるために使っています。

# 原因を考える

まず考えたのが私のPCのせいかなと思ったんですが、他の人のPCでも立ち上げ時間が変わらなかったので、違いました。
また、Cloudflare Pagesにデプロイしてみたところ爆速でレンダリングされたので関係ありませんでした。

---
次に、Dockerの環境が重すぎるのかと思いました。
Dockerfileは以下になってます。
```
FROM node:18

WORKDIR /usr/src/app

COPY package.json pnpm-lock.yaml ./

RUN npm install -g pnpm && \
    pnpm install

COPY . .

RUN pnpm build

EXPOSE 3000

CMD ["pnpm", "dev"]

```

調べたら、なんとImageのSizeが2.24GBありました笑
![スクリーンショット 2023-12-25 21.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946733/4d51bf69-36b5-91e1-4def-eb04f6020a72.png)

これをなんとかするために、まずNodeのimageをslimに変更しました。
```
// before
FROM node:18

// after
FROM node:18-slim
```
これで、ImagのSizeは1.27GBまで減りました。
![スクリーンショット 2023-12-25 21.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946733/8cb163bc-4b6d-e980-dace-97054b1ac488.png)

まあまあですね。

また、初回レンダリングの時間も120秒から50秒に減ったのでまあまあ減ったのではないでしょうか...

まだまだ遅いので、もっと早くするためにいろいろ試していこうと思います。
（それはまた発見があり次第追記します...）
AppcmdでPowerShellからIISを操作する



## Appcmdについて

### 概要

IISの構成や操作に関する多くのタスクを、コマンドラインから実行するために使用されるツールで、IIS 7.0以降のバージョンで利用出来ます。
コマンドラインツールなので、バッチファイルやスクリプトに組み込むことで、処理の自動化などが可能になっています。

### 出来ること

`Appcmd`で行える操作には以下のようなものがあります。
- サイトの作成・設定
- アプリケーションプールの作成・設定
- サイトやアプリケーションプールの一覧表示
- サイトやアプリケーションプールの状態の変更（開始、停止など）
- 構成のバックアップや復元


## Appcmdの場所

`Appcmd`はWindowsの以下の場所に配置されています。

```powershell
C:\Windows\System32\inetsrv\Appcmd.exe
```

## 一覧表示系

### サイトの一覧表示

```powershell
appcmd list site
```

### アプリケーションプールの一覧表示

```powershell
appcmd list apppool
```

## アプリケーションプール関連

IISにはデフォルトで`DefaultAppPool`や`.NET 2.0`、`.NET 4.5`等のアプリケーションが作成されています。
`.Net CLR バージョン`という列の値が`v2.0`の場合は`.NET Framework 3.X`、`v4.0`の場合は`.NET Framework 4.X`のアプリケーションがそれぞれ対応しています。

### アプリケーションプールの作成

```powershell
appcmd add apppool /name:"MyAppPool"
```

- `/name`
  アプリケーションプール名


### アプリケーションプールの削除

```powershell
appcmd delete apppool "MyAppPool"
```


## サイト関連

IISにはデフォルトで`Default Web Site`という名称でサイトが作成されています。

### サイトの作成

```powershell
appcmd add site /name:"MySite" /bindings:http://localhost:80 /physicalPath:"C:\サイトまでの物理パス"
```

- `/name`
  サイト名
- `/bindings`
  待ち受けるドメインとポート番号
- `/physicalPath`
  コンテキストルートとする物理パス


### サイトの削除

```powershell
appcmd add site "MySite"
```

### サイトの停止

```powershell
appcmd stop site "MySite"
```

### サイトの開始

```powershell
appcmd start site "MySite"
```

### サイトとアプリケーションプールの関連付け

```powershell
appcmd set app "MySite/" /applicationPool:"MyAppPool"
```

- `/applicationPool`
  アプリケーションプール名


## おまけ

以下のコマンドで、IISそのものを停止/開始することが出来ます。

```powershell
# IISの開始
net start w3svc

# IISの停止
net stop w3svc
```
プロデルのアドベントカレンダー2023最終日

# はじめに
プロデルのアドベントカレンダー2023最終日がついに到来しました！メリークリスマス！:tada::santa_tone2:

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

# プロデルとの関わりの１年を振り返る

実は今年初めて日本語プログラミング言語プロデル、スミレのソースコードを書かせていただきました。

最初はトランスコンパイラ企画の仕様検討のための構文比較だったのですが、アドベントカレンダー2023が始まるころには、他の言語との実行速度比較などを行っていました。

そしていまもっとも注目しているのは、データベースとの接続機能です。アドベントカレンダー2023ではSQLServer2022との接続機能を評価しておりました。

いや、ほんとすごいです。@jpl_produireさん、おひとりの力でここまで、あんな機能やこんな機能まで、プロデルのホームページは多機能サンプルの宝庫ですね。

また、開発者の@jpl_produireさんとも少しだけ交流できたのは幸いでした。いろいろなお考えを聞けてうれしかったです。

# スペシャルサンクス
@nipoさん、ありがとうございました。とても安心しました。

# おわりに

来年もやります！と言っていいかわかりませんが、わたし的にはやる気まんまんです。また、アドベントカレンダーの日をすべて埋められなかったことをお詫び申し上げます。ひとえにわたしの力不足のせいです。
VCI開発するときのお役立ちtips VScode編


# VScode
### コメントアウト
Ctrl+/でカーソルががある行をコメントアウトできます。デバッグの際重宝します。

### ごっそり削除
vciのクラス名、結構長いことがありますよね。そんな時はCtrl+BSでごっそり削除できます。単語ごと消してくれるようなのでBS連打したり勢い余って消しすぎたりという微妙なストレスがなくなります

### 行移動
インスタンス化の順番などでエラーが出るのは割とあるあるですが、そのたびにマウスに戻ってカット＆ペーストはちょっと面倒なこともあります。そんな時はAlt+↑↓を押してやるとカーソルのある行を引き連れて移動できます。複数行選択していれば複数行まとめて移動することも可能です。
![alt-arrow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/d766c317-4ff1-7768-1a1c-8ad08cd8913d.gif)


### 対応するかっこを探す
プログラムが複雑になってくると、かっこの閉じ忘れや入れ違いが複雑になって訳が分からなくなることもあるかと思います。
そんな時はCtrl+Shift+\を入れてあげると対応するかっこまで飛べるので確かめるのに重宝します。もっとも、これを使わなければならなくなってきたら変数を分けるのがおすすめですが...

### 行番号に飛ぶ
エラーメッセージはエラーが起きている番号を教えてくれますが、スクリプトが長くなってくると移動するのもおっくうになってきます。そんな時はCtrl+Gで行番号を指定して飛んでしまいましょう

# 参考
https://qiita.com/RyotaMurohoshi/items/fa777dfd50254a3a88cf
ブラウザでリモートデスクトップするぞ！ ～noVNC編～

## はじめに
　ブラウザでリモートデスクトップする方法の一つである、noVNCの導入方法について解説したいと思います。

### 環境
Ubuntu 20.04 LTS

## インストール
　以下のコマンドで更新とパッケージのインストールをします。
```shell
sudo apt -y update&&sudo apt -y upgrade&&sudo apt -y autoremove
sudo apt -y install tigervnc-standalone-server novnc websockify
```

## ファイアウォールの設定
　6080ポートを開放して、そのポートにブラウザからアクセスできるようにします。
```shell
sudo ufw allow 6080/tcp
```

## VNCサーバーの起動
　ユーザー名は適宜変更してください。
```shell
USER=ユーザー名 tigervncserver :1 -geometry 1980x1200
```

### 停止する方法
```shell
tigervncserver -kill :1
```

## noVNCの起動
```shell
websockify -D --web=/usr/share/novnc/ 6080 localhost:5901
```

## おわりに
　ブラウザからリモートデスクトップする環境が整えば、デバイスやＯＳの選ばないので、どこからでもどの端末からでもアクセスすることができます。また、ApacheGuacamoleを用いた方法も解説したいと思います。
楕円曲線をsympyのplot_implicitでグラフにする（その２）

[前回](https://qiita.com/masa0599/items/48bd4809f25c822b02b8)ではsympyのplot_implicitが生成した座標を取り出してmatplotlibで描く方法を紹介しました。今回はそれを使って楕円曲線暗号の基礎の基礎となる2点の和と2倍したときの点の座標を描いてみます。

### 楕円曲線上の2点の和

**例題１: 楕円曲線$y^2=x^3+17$上の2点$P_1(-1,4), P_2(2,5)$の和を求めてグラフに描け**

[楕円曲線暗号 (Wikipedia)](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7) の楕円曲線の加算公式より
```math 
\begin{align}
&楕円曲線 y^2 = x^3+ax+b 上の\\
&2点P_1=(x_1,y_1), P_2=(x_2,y_2)\\
&を通る直線が楕円曲線と交わる点をP_1*P_2= (x_3, y_3)とすると\\
&P_1+P_2 = (x_3,-y_3)となる \\ \\
&直線の式をy = λx+νとすると\\
&λ= (y_2-y_1)/(x_2-x_1) \\
&ν= y_1-λx_1=y_2-λx_2 \\
&これからx_3, y_3は以下のように求まる \\ \\
&x_3=λ^2-x_1-x_2 \\
&y_3 = λ(x_3-x_1)+y_1
\end{align}
```
これをそのままコードに下のがこれです。キャンバスの定義と楕円曲線の座標の取得は前回の投稿の**init_subplot**と**plot_fxy**を使っています。

```python
import sympy as sp
import matplotlib.pyplot as plt

def draw_line(ax, p1, a, CY): # p1上の傾きaの直線をキャンバスいっぱいに描く 
  (x, y), (cb, ct) = p1, CY
  ax.plot([x+(cb-y)/a, x+(ct-y)/a], CY,  lw=0.5, color='green')
  return

def plot_dot(x,y,dx,dy,pn):
  ax.plot(x,y, marker='o',  ms=3,color='blue')
  ax.text(x+dx,y+dy, pn+f"({x},{y})", fontsize="xx-small")
  return

x, y = sp.symbols("x y")
# キャンバスの定義
sizex = 6
CX, CY = (-sizex, sizex), (-sizex, sizex)
ax = init_subplot(plt, CX, CY)
plt.rcParams["font.size"] = 12
# 楕円曲線を描く
a, b = 0, 17
ax.fill(*plot_fxy(x**3+a*x+b-y**2, CX, CY), facecolor='blue')

x1, y1, x2, y2 = -1, 4, 2, 5
plot_dot(x1,y1,-2.5,0.5, r"$P_1$")  #  Plot P1
plot_dot(x2,y2,1,-0.5, r"$P_2$")    #  Plot P2
# ----------- P*Qを計算する --------------
l = sp.Rational(y2-y1,x2-x1)
x3 = l**2-x1-x2
y3 = l*(x3-x1)+y1

draw_line(ax, (x1,y1), l, CY)
plot_dot(x3,y3,0.5,-0.5, r"$P_1*P_2$")    #  Plot P1*P2
plot_dot(x3,-y3,0.5,-0.5, r"$P_1+P_2$")    #  Plot P1+P2
draw_line(ax, (x3,y3), sp.oo, CY)
plt.show
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/6d232e52-00db-8fb2-40c5-628e8c638bd8.png)

### 楕円曲線上の点Pから2Pを求める

**例題１: 楕円曲線$y^2=x^3+17$上の点が$P(-1,4)$のとき$2P$をグラフ上に描け**

これはPとQが重なったと考えればよいので傾き$\lambda$を微分で求めるだけが違いとなります。

```math 
\begin{align}
&楕円曲線 y^2 = x^3+ax+b 上の\\
&点P_1=(x_1,y_1)で接する直線\\
&楕円曲線と交わる点をP_1*P_2= (x_3, y_3)とする\\
&直線の式をy = λx+νとすると\\
&λ = (3x^2+a)/2y  \\
&ν= y_1-λx_1=y_2-λx_2 \\
&これからx_3, y_3は以下のように求まる\\ \\
&x_3=λ^2-2x_1\\
&y_3 = λ(x_3-x1)+ν
\end{align}
```
したがって上記のコードの$P_2$関連を削除し「P*Qを計算する」部分を以下に変えればよいですね。

```python
# ----------- P*Qを計算する --------------
l = sp.Rational((3*x1**2+a),2*y1)
x3 = l**2-2*x1
y3 = l*(x3-x1)+y1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/ab3ac1dd-c804-150a-7086-95e102b72a18.png)


（開発環境：Google Colab）
各言語のコメントアウトの方法だけ知っておきたい

## コメントアウトの方法さえ知っていれば
　プログラミング言語はたくさんの種類がありますが、多くの言語を覚えるのは無理があります。そこで今回はコメントの記載法だけをまとめました。**コメントアウトの方法さえ知っていれば、コメントの入っているコードだけは読めるかもしれません。**

## 多くの言語（ //または/\*...*/ ）
- C/C++
- Java
- C#
- JavaScript
- PHP
- Swift
- Go
- Kotlin
- Scala

これらの言語では、1行コメントを//、複数行コメントを/\*...*/で記載します。


```cpp
// いえーい

/*
このコメントアウトが、
多くの言語で使われているから
覚えておこうね
*/
```

## Python　( # または"""...""" )

```python
# いえーい

"""
このコメントアウトが、
Pythonで使われているから
覚えておこうね
"""
```
## Ruby ( # または =begin ... =end )

```ruby
# いえ~い

=begin
このコメントアウトが、
Rubyで使われているから
覚えておこうね
=end
```
## SQL ( -- または /\*...*/ )
```sql
-- いえーい

/*
このコメントアウトが、
SQLで使われているから
覚えておこうよ
*/
```

## HTML ( \<!-- ... --> )

```html
<!--
このコメントアウトが、
HTMLで使われているから
覚えておくように
-->
```

## Lua ( -- または --[[ ... --]] )
```lua
-- いえ～い

--[[
このコメントアウトが、
Luaで使われているから
覚えておこうね
--]]
```

## Bash (シェルスクリプト) ( # )
```bash
# ひやー
```

<!--
## MATLAB （ % または %{ ... }% )
```matlab
% いえーい

%{
このコメントアウトが、
MATLABで使われているから
覚えておこうぜ
%}
```


## 
[参考](https://qiita.com/yu0819ki/items/e1e1d20cedc68706ba23)

```

```
[](
aaa
)
-->

## さいごに
　見出しだけ見ればすべてを理解できる記事ができました。コメントは、メンテナス性や他者への理解性を高める効果があるので、くどくならない程度に入れておきましょう。
 （ /\*...*/これが顔文字みたい笑 ）
プライベートサブネットについて調べてみた

## はじめに
業務で聞いたプライベートサブネットという言葉がなんとなくしかわからなかったので、調べて備忘録として記事に残そうと思います。

## プライベートサブネットについて調べてみた
プライベートサブネットを知るために、まずはサブネットについて調べました。

### サブネットとは
サブネットは、効率的に管理するために、ネットワークを分割した小さなネットワークのことを指します。

https://www.cloudflare.com/ja-jp/learning/network-layer/what-is-a-subnet/

### サブネット化するメリット
#### ネットワークの効率化
サブネット化されていない場合、たくさんのデバイスと通信してしまう可能性があります。サブネット化することで通信するデバイスの台数を限定することができ、ネットワークの混雑を減少させることができます。

https://envader.plus/article/53

https://www.cloudflare.com/ja-jp/learning/network-layer/what-is-a-subnet/

#### セキュリティの強化
特定のサブネット内のデバイスのみが互いに通信できるため、セキュリティを向上させることができます。

https://hurehure-lady.com/what-is-a-subnet-and-the-difference-from-subnet-mask/

### プライベートサブネットとは
プライベートサブネットは、サブネットの中でも、インターネットと通信できないものを指します。特定の組織やグループ内でのみアクセス可能なネットワークなため、データの安全性を高めるのに役立ちます。

プライベートサブネットに対して、インターネットと通信できるサブネットのことを、パブリックサブネットといいます。

https://tech.excite.co.jp/entry/2022/06/14/132710

#### プライベートサブネットの実際の使用例
##### 企業内ネットワーク
企業はプライベートサブネットを使用して、社内のファイルサーバーやアプリケーションに安全にアクセスできる環境を作ります。これにより、従業員は必要なリソースに迅速にアクセスし、外部の脅威から保護されます。

##### クラウド環境
クラウドサービスでは、プライベートサブネットを通じてセキュアな環境を提供します。ユーザーは、クラウド内でアプリケーションやデータベースを安全に運用できるようになります。

## さいごに
今回はプライベートサブネットについてまとめました。今後もこのように自分がわからない言葉を、簡単なものでもいいから、少しずつアウトプットしていこうと思います。
BigQueryのスケジュールクエリの認証情報をサービスアカウントに切り替える

## 背景

BigQueryのスケジュールクエリを個人の認証情報で実行している場合、退職などで認証情報が無効になるとクエリの実行が停止することになります。

そのため認証情報のサービスアカウントへの切り替えが必要となりますが、公式のドキュメントが存在せずやや分かりづらいため、備忘録として設定方法を残しておきます。

※誤っている箇所あれば指摘願いますm(_ _)m

## 必要なパーミッション

「権限の足りないアカウントにて操作→ロギングを確認」という手順にて、必要な権限が調べました。

結論、以下の3つの権限が必要となります。

- bigquery.transfers.update
  - 転送設定のアップデート権限
- iam.serviceAccounts.list
  - サービスアカウントの一覧を取得する権限
- [iam.serviceAccounts.actAs](https://cloud.google.com/iam/docs/service-accounts-actas?hl=ja)
  - サービスアカウントをリソースに紐づける権限

オーナー権限があればこれらの権限を細かく割り当てる必要もありませんが、組織のルール上オーナー権限の付与が難しい場合には上記3つを含めたカスタムロールを作成すると良いと思います。

## Cloud Consoleから変更する場合

Cloud Consoleからサービスアカウントの変更はできないと認識していましたが、2024年9月現在、変更できるようになっています。

ヘルプには「できる」とも「できない」とも記載されてますが、実際には設定変更が可能です。


> You can update an existing scheduled query with the credentials of a service account with the bq command-line tool or Google Cloud console. For more information, see Update scheduled query credentials.
>
> https://cloud.google.com/bigquery/docs/scheduling-queries?hl=en#using_a_service_account

> Caution: Changing the credentials used in a scheduled query to a service account is not supported in the Google Cloud console.
>
> https://cloud.google.com/bigquery/docs/scheduling-queries?hl=en#update_scheduled_query_credentials


必要な権限を付与することで、スケジュールクエリの編集画面にて「任意のサービスアカウント表示」と「認証情報の切り替え」が可能となります。

![スクリーンショット 2023-12-25 13.26.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147689/19944c56-5c0e-1df8-8dfb-275a733df897.png)


## Cloud Shellで変更する場合

bqコマンドを使って認証情報を切り替えることができます。


### スケジュールクエリの一覧を確認

以下のコマンドで設定されているスケジュールクエリの一覧が確認できます。
※LOCATIONは任意のロケーションを指定してください。


```shell
bq ls --transfer_config --transfer_location=LOCATION --filter='dataSourceIds:scheduled_query'
```


![スクリーンショット 2023-12-25 13.46.01（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147689/3d6fe053-e291-f86d-54be-2bd3ecf4cc8b.png)


### 認証情報をアップデート

`bq update` で任意のサービスアカウントと転送IDと指定します。

```shell
bq update \
--transfer_config \
--update_credentials \
--service_account_name=hogehoge@fugafuga.iam.gserviceaccount.com projects/XXXXX/locations/asia-northeast1/transferConfigs/YYYYY \
```

※GCPプロジェクトがVPC-SCで保護されている場合はCloudShellでのBQコマンドに制限がかかるため（CloudShellが別のGCPプロジェクトとなるため） 、VPC-SC境界内の別環境で実行する必要があります。

## 転送構成の確認

無事サービスアカウントに切り替わっていました。めでたしめでたし。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147689/93d9742c-53a9-7894-ca54-b218f8f83954.png)



## 参考になりそうなサイト

https://iga-ninja.hatenablog.com/entry/2024/03/18/012802
Gatsby.jsで実際に簡単なサイトを作る方法 （基礎編）

# はじめに
こんにちは。えか太郎と言います。今回は前回の続きとなります。

https://qiita.com/EkaTaro3/items/0baa5bda3e596221fcb2

前回の記事を読んでGatsbyの準備ができてない方はぜひご覧ください（宣伝）。

## 今回の内容
簡単なサイトをGatsbyで構築します。
公式英語ドキュメントから書きました。英語でしたが動画もあったので、英語がまともに使える方は是非どうぞ。

https://www.gatsbyjs.com/docs/tutorial/getting-started/part-1/

今回の完成例

https://github.com/gatsbyjs/tutorial-example

# 本編 実際に構築しよう
簡単なブログサイトを作ります。ちょっとずつ自分にあったものに書き換えたら自分のサイトが構築できるようになると思います。知らんけど
## 前提条件
はじめに記述したように環境構築が済んでない方は構築してから進んでください。実際にだれでも見れるようにはする方法（公開の仕方）は次回に記事で書きます。
## ディレクトリの移動
Gatsbyのサイトを作りたいディレクトリに移動してください。CDコマンドを使えばできます。

## Gatsbyでサイトを生成する
前回インストールしたgatsby-cliを使ってGatsbyサイトを生成します。以下のコマンドを入力してください。
~~~
gatsby new
~~~
## 詳細設定
このコマンドを実行するとコマンドラインにいくつか質問がされます。
### サイトの名称
~~~
What would you like to call your site?（訳：なんて名前のサイト作るんや？）
✔ · （ここにお好みのサイト名を入力）
~~~
作るサイトの名前を入力してください。
### サイトのフォルダー名
~~~
What would you like to name the folder where your site will be created?
（訳：サイトのフォルダーの名前は何にするんや？）
✔ Desktop/ （ここお好みの名前を入力）
~~~ 
### JavaScriptかTypeScriptの選択
~~~
Will you be using JavaScript or TypeScript?
（訳：あんたJavaScriptとTypeScriptのどっち使うんや？）
❯ JavaScript
  TypeScript
~~~
キーボードの上下方向キーで選択できます。私はJavaScriptを選びました（というかTypeScript書けません）

### CMSの使用の選択
Noでおっｋ
~~~
✔ Will you be using a CMS?
（訳：CMSは使うんか？）
· No (or I'll add it later)
~~~
### スタイリングシステム（CSS系）のインストール
一番下のNoを選べばヨシ
~~~
✔ Would you like to install a styling system?
（訳：スタイリングシステム入れへんか？）
· No (or I'll add it later)
~~~
### その他のプラグイン
その他のプラグインを入れるかを聞かれます。矢印キーを使ってDoneにします。
~~~
✔ Would you like to install additional features with other plugins?
（訳：他に言う事ないんか？）
· Done
~~~
### 最終確認
本当に設定が間違えていないかどうか確認されます。ｙを入れたら生成が開始されます。
~~~
Thanks! Here's what we'll now do:

    🛠  Create a new Gatsby site in the folder my-first-gatsby-site


? Shall we do this? (Y/n) › Yes
~~~
私の環境ではCeleronを使っているというだけあって生成には一分以上かかりました。
# 構築したGatsbyサイトを実行する
これでとりあえずテンプレートの元になるものは自分の指定したディレクトリにできたと思います。次はサイトをローカルで実行します。
###  実行するコマンド
生成したディレクトリに移動したら以下のコマンドを入力してください。
~~~
gatsby develop
~~~
ちなみに実行を停止する場合はCtrl+Cです。

### もしもError opening directoryが出た場合
以下の記事で解決方法がわかると思います。

https://qiita.com/EkaTaro3/items/63092a2b01146ac0a0a4

## 実行したサイトを見る
実行したサイトはブラウザからローカルホスト8000にアクセスすれば開くことができます。
![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120367/9cbdbdd3-4b20-8246-8c81-4a575e977bf7.png)

これがブラウザで見ることができれば本記事でしたいことは終わりです。
# おわりに
次回はここで作ったページを公開する方法について解説します。CSSだとかもっと詳しいデザインの変更についてはもうしばらくお待ちください。

#### 前回の記事（環境構築）

https://qiita.com/EkaTaro3/items/0baa5bda3e596221fcb2

#### 次回の記事（サイトの公開方法について）
現在作成中
Linuxを初めて触ったときに戸惑ったこと３選

## はじめに
　私が、初めてLinuxを触ったのは３年前ぐらいの時です。コロナで学校が休校になり、暇で仕方がなかったので、古いノートパソコンにインストールして遊んだのがきっかけです。その時に、戸惑ったことを記事にしたいと思います。

## コマンドってなんや？
　もちろんLinuxコマンドのことを全く知らなかったので、一番戸惑いました。アプリやソフトをインストールするために、コマンドを打たないといけないのは、当時の私にはとてもハードルが高かったです。特にエラーを吐かれた時は、どうすればいいかわかりませんでした。（ログを読め！）

## rootアカウントとは？
　Windowsを使っていても、管理アカウントと一般アカウントはありますよね。Linuxでいきなりrootアカウントとかいうやつが出てきて意味が分かりませんでした。

## デスクトップ環境周りがややこしい
　デスクトップ環境といっても色々ありますよね。`Gnome`や`KDE`、`LXDE`など、大量にあります。それに加えてウィンドウマネージャーなどもあり、当時、RaspberryPiOSにいろんなデスクトップ環境をインストールして、研究したりしていました。

## おわりに
　わからないことがあったらすぐに調べることが重要だと思います。調べずに考えていても、ほとんど解決できないと思います。また、Linuxをマスターしたいなら、LinuCなどの検定の対策書を買って初めから読んでみるのもおすすめですね。
Gatsby.jsでError opening directorというエラーが出る時の解決方法

# Gatsby.js の 「Error opening directory」の解決方法
Error opening directoryというエラーを吐いて生成したサイトを実行できません。海外ニキの教えによるとこれは生成したディレクトリ名に特殊文字（アルファベット以外）が含まれるとうまいこと実行できなくなるらしいです。
だからWindowsの初期設定のときに日本語で設定すると行けないらしいです。

https://github.com/gatsbyjs/gatsby/issues/35690

もしこうなった場合の解決策としては
* クリーンインストールしてPCの初期設定の名前を漢字ではなく英語にする（初期設定をし直す）
* Dドライブを作ってそこのディレクトリに作る
* 諦める
* なんかレジストリをいじって名前を変更する

が考えられます。私は一番楽そうな二番目のDドライブを作る方法を選びました。あたらしくSSDやUSBを買う必要はなく既存のCドライブから数GB分のパーティションを削除してそれをDに当てました。30秒もあればできるのでおすすめ。
# 追記
その他の原因としてTypeScriptのエラーが起こることもあるらしいです。しかし、私はTypeScriptチョットワカラナイので。他の人の解説を見てください。
アドベントカレンダー振り返り

# アドベントカレンダーをやってみて
今回私はアウトプットの習慣をつけることを目的に，アドベントカレンダ―に挑戦した。そこで，学んだことがつある。

## アウトプットするのは結構大変
記事を1つ書くのに大体1時間弱かかった(インプットと記事を書くのと全て含めて)。なかなか平日に時間を取ることは難しいので，休日に記事をまとめて書くようにしたがかなりエネルギーを使った。
そもそも今回のアウトプットはAWSという初めての分野に取り組んだからというのもある。普段から学習する時にメモを書いておくことの大切さを理解した。

## アウトプットすると知識が身に付きやすい
私の場合，文字を読むときに流し読みになっていることが多々ある。しかし，アウトプットを前提に書籍を読んだり動画を参照すると，情報が入りやすく感じた。また，分からない言葉も一緒に調べてメモすることで，AWS以外の知識も得ることができた。

## マークダウン記法が便利
マークダウン記法で記事を書くときは以下のページを参照している。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

やはり使うと見栄えが良くなるし，ページも綺麗にまとまる。次は絵文字も使用してみたい。

## モチベーション作りが大事
25日ぶっ通しで記事を作るとなると，やはりネタ作りやモチベーション維持が大変だろう。
私は今回アドベントカレンダーの完走賞狙いでほぼ維持で書き上げた。12月はプライベートも仕事も忙しかったが，とにかく完走賞のぬいぐるみが欲しかった。

## Laprasのスコアが0.3上がった
本当に微小ではあるが，Laprasの技術スコアが0.3上がった。思わぬ副産物だったが，嬉しい。

# 今後の目標
## 資格取得
Linucレベル1 102試験とAWSクラウドプラクティショナーの合格を目指す。
特にLinucはそろそろ取らないと…

## アウトプットの継続
Qiitaだけでなく，githubも頑張る。

## アウトプットの質向上
自分でサイト・アプリを作成するなどして，アウトプットの質を高めたい。

# 最後に
内容としてもおぼつかないアドベントカレンダーでしたが，結果やって良かった。大きな自身にもなったので，引き続き勉強を頑張ります。
メリークリスマス🎅
GoogleAppScriptでHTTP POSTとGETの送信と受信パラメータの確認の最小コード

## 注意：これは備忘録です。
Qiitaで、POSTとGETの受信パラメータの確認の仕方を調べたら、

* スプレッドシートに書き出すとか
* HTMLページに表示するとか

出てきたので、びっくりした。

僕の記憶していたものは、もっと簡単な方法だったので、備忘録として書いておきます。
なぜ備忘録なのかというと、全ての環境に使えるかどうかわからないからです。
少なくとも、僕の環境では、出来る、しかし、先人たちが書いた難しい方法を使わないとダメな時もあるかもしれない。そういうことで、これは自分用の備忘録として公開します。

## 試してみる価値はある、とてもシンプルなコード。
#### POST＆GET受信側
ポイントは、以下３つです。
* PostでもGetでも、受信した「e」を、JSON文字列して、Logger.logで見ています。
* Getなら、e.parameterに、javascriptオブジェクトで値が格納されています。
* Postなら、e.postData.contentsに、JSON文字列形式で値が格納されています。これは、送信側でJSON文字列で送信されてくるため。
そこに気を付けてコードを書くと、シンプルなコードは以下となります。

```js
function doGet(e) {
  Logger.log('メソッド: GET');
  Logger.log(`引き渡されたものをJSON文字列化したe:\n${JSON.stringify(e)}`);
  Logger.log(`引き渡されたものをJSON文字列化したe.parameter:\n${JSON.stringify(e.parameter)}`);
}

function doPost(e) {
  Logger.log('メソッド: POST');
  Logger.log(`引き渡されたものをJSON文字列化したe:\n${JSON.stringify(e)}`);
  Logger.log(`引き渡されたものをJSON文字列化したe.postData.contents:\n${JSON.stringify(e.postData.contents)}`);
  const contents = JSON.parse(e.postData.contents);//パースする。
  Logger.log(`JSON文字列化した、パース後contents: ${JSON.stringify(contents)}`);
}
```

#### POST＆GET送信側
送信側のコードも参考につけておきます。
```js
// 受信側デプロイ後のウェブアプリURLを設定
const fetchUrl = '[受信側デプロイ後のウェブアプリURL]';

function fetchGet() {
  //DriveApp.getRootFolder().getName(); //ウェブアプリ実行時に４０１エラーが出た場合はこれを実行すると良さそう 
  //ウェブアプリを全体公開出来ない場合はトークンが必要。下の行のコメントアウトをはずし、トークンをfetch直前に取得
  //const token = ScriptApp.getOAuthToken();

  // Optionsを設定します
  const options = {
    'method' : 'get',
    'contentType': 'application/json'
    //,'headers': {'Authorization': `Bearer ${token}`} //ウェブアプリを全体公開出来ない場合この認証が必要なので、コメントアウトをはずす。
  };

  //送りたいデータをここで設定。
  let name = 'Bob Smith';
  let age = 35;
  let hobby = '他人のソースコードのダメ出し。// : ? . % a';
  name = encodeURIComponent(name);
  age = encodeURIComponent(age);
  hobby = encodeURIComponent(hobby);

  res = UrlFetchApp.fetch(fetchUrl + '?name=' + name + '&age=' + age + '&hobby=' + hobby, options); // <- GET リクエスト
}

function fetchPost() {
  //DriveApp.getRootFolder().getName(); //ウェブアプリ実行時に４０１エラーが出た場合はこれを実行すると良さそう 
  //ウェブアプリを全体公開出来ない場合はトークンが必要。下の行のコメントアウトをはずし、トークンをfetch直前に取得
  //const token = ScriptApp.getOAuthToken();

  //送りたいデータをここで設定。
  const data = {
    'name': 'Bob Smith',
    'age': 35,
    'hobby' : '他人のソースコードのダメ出し。// : ? . % a'
  };

  // Optionsを設定します
  const options = {
    'method' : 'post',
    'headers': {
      'Content-Type': 'application/json'
      //,'Authorization': `Bearer ${token}` //ウェブアプリを全体公開出来ない場合この認証が必要なので、コメントアウトをはずす。
    },
    'payload' : JSON.stringify(data) //送りたいデータをpayloadに配置してJSON形式変換。
  };

  res = UrlFetchApp.fetch(fetchUrl,options); // <- Post リクエスト
}
```
今年から始めたアウトプットについて書いてみる

どうもこんにちは、たくびー(@takubii)です。
今年はエンジニアとしてQiitaでのアウトプットを始めてみました。
頻度は高くないですが何とか約1年間続けることができ自分に驚いています。

今回は私がなぜアウトプットを始めようと思い、なぜQiitaを選んだのか考えていきたいと思います。

# アウトプットでブログを書こうと思った理由

優秀なエンジニアは皆さん何かしらのアウトプットを行っていると思います。
主なアウトプットの手段としては以下の3点が思いつきます。

- ブログを書く
- 個人開発をする
- OSSに参加する

私は何かを作るためにプログラミングを学ぶよりもプログラミングを学ぶことが楽しいのでエンジニアをやっている節があります。
また、プライベートは趣味に全振りしているので上記の中では比較的に手を付けやすいブログを書くというアウトプット方法を選択しました。

# アウトプットを行おうと思ったきっかけ

そもそもなぜブログを書こうと思ったのかというと、正直に言うなら仕事中の空き時間を有効に使いたかったからです。
転職してまだ間もなかったころは仕事量も多くなく、比較的に暇な時間が多かったです。
その時間ではよくQiitaやZennなどを眺めてインプットをしていました。
そこで自分も仕事中にメモしていたことなどをブログに書けばいいのでは？と思い書き始めました。

ブログを書くとなると文章にまとめられるくらいしっかりと手順などメモするようになりました。
インプット時にもブログの記事としてまとめられるかといった点から見るようになり良い点が増えてきました。

# 約1年間アウトプットを行ってきてどうなったか

以前ブログに書いたことを自分で見直したりすることは多々ありました。
1度躓いたことは2度目もあるということが多いので備忘録としてとてもよかったと思っています。
まだバズを経験したことがないのでいつか自分の書いた記事が多くの人の目に留まることを願ってこれからも書いていきたいと思います。

また、ブログを書くことで自分はアウトプットを行っているエンジニアなんだという自己肯定感が上がり、エンジニアとしての自信も上がりました。
下心ではありますが、転職にも役立つかなーという気持ちもあります。

# まとめ

今年は転職して約1年間が経ちました。
新しい挑戦としてブログを書くということが自分にできたということを自分が一番驚いています。
来年も何か新しいことへの挑戦やエンジニアとして成長できることが+αでできればいいなと思っています。

ただ、1年前と変わらずプライベート第一というポリシーは曲げていませんので今後もプライベートとエンジニアどちらも大事にしたいです。

それでは今回はこのあたりで締めたいと思います。
今年はありがとうございました。また来年もよろしくお願いいたします。
テスト自動化について考えてみた

# テストと自動化
## テスト自動化ナンダソレ?
[めちゃめちゃわかりやすいyutachaosさんの記事](https://qiita.com/yutachaos/items/857472c7d3c65d3cf316)
ざっくり言えば設計通りできててちゃんと動くか？ってことだな。

## 自動化してみたいテスト
普段webアプリを使うことが多い。それも考慮して考えてみる。
* アプリもろもろ
* ゲーム系(いろんな動作あるし自動化したい)
* セキュリティ系

アプリ系のテストはよくありそう。
ゲーム・セキュリティのテスト自動化...
上記二点についてもあるよう

## テストって広いね
システムの出来具合を評価するといういみではかなりひろい。IT系のサービスにかかわらず現実世界でも同じようなことが言える。

## 機能要件
その中でも機能要件というのは非常に重要だと思う。
機能要件のテストの自動化
正確性が求められる、その範囲を確実にカバー

非機能要件
完成度を高める、広くカバー、最大限の量のテストを行う

こんなイメージをテスト超初心者の中学生は抱いたとさ
AWS Certified Advanced Networking - Specialty

## Site to Site VPN
- Site-to-Site VPN connection need **Public VIF**
- Acceleration is only supported for Site-to-Site VPN connections that are attached to a **Transit Gateway**
- Site-to-Site VPN cannot be modifed, **must be replaced**
- For dual-stack connectivity on the Site-to-Site VPN connection via a Transit Gateway, you **need to create two VPN connections**, one for the IPv4 stack and one for the IPv6 stack
- Site-to-Site VPN **does not** support jumbo frames

## Direct Connect
- Updating transit VIF to support IPv6 will not affect the current Ipv4 connectivity
Godot4で3D風２D縦スクロールシューティングゲームを作る　4回目 敵を追加する

Godot4.1.3でシューティングゲームを作っていきます。

# 敵を追加します
　twin bodyという名前の敵を1種類追加します。上から下に直進するのみのキャラクターです。

# github
　本記事で実装したものをgithubで公開しています。

https://github.com/footinglow/woden/tree/004_add_a_enemy_named_twin_body

# twin bodyのglTF2.0形式ファイルをassetsフォルダに配置
　Blenderで敵をモデリングし、twin_body.glbというファイル名で、glTF2.0形式で出力したものを、res://assets/blender/twin_body/twin_body.glbに配置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/52f2ffff-4f53-defb-e9a3-33d25f8ddd30.png)

# twin bodyのシーンとGDScriptを作成する
　res://characterの下に、enemyフォルダを作成し、その中に「twin_body.scn」シーンを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/6df303e3-2bd0-61bf-7ff2-1c07c516f7f0.png)

　ルートノードはArea3Dにします。子ノードは３つあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/0270204b-53aa-59f2-c20c-710a1521b394.png)
 - twin_body
　res://assets/blender/twin_body/twin_body.glbをドラッグしたものです。
　Scaleを2倍にしました。
 - CollisionShape3D
　Shapeは新規BosShape3Dにして、x=3m、z=5mにしました。
 - VisibleOnScreenNotifier3D
　画面外に出たことを検知できるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/9a78ca6e-c5ba-95ba-aada-7b18fdd1b60a.png)

　ルートノートにスクリプトをアタッチして、下記のように修正します。
 ```GDScript
extends Area3D

@export var _d_speed_mps = 20.0

func _physics_process(delta):
	global_position += Vector3(0, 0, 1) * _d_speed_mps * delta

func _on_visible_on_screen_notifier_3d_screen_exited():
	queue_free()
 ```
　_physics_processメソッドに、画面の上から下に直進する動きを記述しています。
 　画面の下はZ軸のプラス方向なので、Zのみ１にしたVector3(0,0,1)を使用します。_d_speed_mpsが1秒あたりに進む速度なので、deltaを掛け算して今周期分の移動量をglobal_positionに足しています。

　画面外に出たことを知るには、VisibleOnScreenNotifier3Dのscreen_exitedイベントを受けるようにします。
　VisibleOnScreenNotifier3Dを選択して、インスペクタの右のノード/シグナルの中にある、screen_exited()をダブルクリックします。ルートノードのtwin_bodyを選択して接続します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/6dc57484-36ba-064e-f1a4-9f08bf91dfab.png)
　_on_visible_on_screen_notifier_3d_screen_exitedメソッドの左に矢印アイコンが表示されると、twin_bodyシーンが画面外に出ると本メソッドが呼ばれるので、queue_free()と書けば、シーンが削除されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/33ee7bf3-470e-21da-792b-524feb2236da.png)

# twin_bodyの動作確認
　今追加したtwin_bodyの動きを確認するために、一時的にgame.scnにtwin_body.scnを追加して動きを確認します。transform/position.zを-130にして、初期位置を画面の上の方にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/1abd1acf-8a15-a621-17ee-f3d2931322d9.png)

　実行すると、twin_bodyが上の方から下に移動します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/4233d74f-2573-9ff7-1395-767c41a06652.png)

　画面外に出ると消えることも確認します。
　実行中、シーンのリモートを見ると、画面にいるときは、twin_bodyノードが存在しますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/c6db44fa-32f1-3caa-67b1-60b4408ae9e5.png)
　twin_Bodyが画面外に出ると、twin_bodyノードが消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/01b95a4e-75dc-1a14-f9f7-518cd05e4429.png)

 　以上です。
Next13でのuseRouterのインポートでエラーがでる

# はじめに
こんにちは、HappyManaです。
Next.js13でWebアプリを開発しているときに、詰まったことを備忘録として書きます。
フロントエンドはまだ入門したばかりなのでだいぶ初心者です。

# useRouterのインポートでエラーがでる
useRouterをインポートして使ったところ以下のエラーが出ました。
```
Error: NextRouter was not mounted. https://nextjs.org/docs/messages/next-router-not-mounted
```

このURLに遷移すると、Next.js公式のページに飛びます。書かれている文章を日本語訳すると、以下が書かれています。
> 　コンポーネントがNext.jsアプリケーションの外部でuseRouterを使用した、またはNext.jsアプリケーションの外部でレンダリングされた。
この現象は、useRouterフックを使用するコンポーネントの単体テストを行う際に、Next.jsのコンテキストが設定されていないために発生する可能性があります。
　また、アプリルータのnext/navigationからのuseRouterは、ページ内のuseRouterフックとは動作が異なるため、アプリディレクトリ内のnext/routerからuseRouterフックを使おうとしたときにも発生します。

つまり、useRouterのインポート元を`next/router`ではなく`next/navigation`にする必要があるようです。

next/routerのuseRouterでは、pathnameやqueryなどを取得できます。

しかし、next/navigationのuseRouterではこれらを取得することはできず、pathnameはnext/navigationの[usePathname](https://nextjs.org/docs/app/api-reference/functions/use-pathname)、queryはnext/navigationの[useSearchParams](https://nextjs.org/docs/app/api-reference/functions/use-search-params)を使って取得するようです。

# 解決策
そのため、import文を以下のように変更します。
```
// ×
import { useRouter } from 'next/router'

// ◯
import { useRouter } from 'next/navigation'
```

# おわりに
調べていると、App RouterのことなのかPages Routerのことなのかわからないことが多かったので、公式のドキュメントを見ることが大事だとわかりました。
また、公式のドキュメントでも「Using Pages Router」の方でPages Routerの説明をしているページを間違ってみてたこともあったので気をつけたいです。
![スクリーンショット 2023-12-25 20.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946733/11bc758f-4568-8ba9-053c-a56075850e40.png)
Pythonで指定行数のcsvファイルを出力する

# はじめに
先日、数千行のCSVファイルを作りたい場面がありました。
Excelやスプレッドシートで作るのは大変なので、ChatGPTに相談しながら、Pythonで指定行数のファイルが出力できるようにしました。

# 概要
- 動作確認した環境は **Python 3.10.12**
- 出力行数と出力先のパスは、引数で指定
- 出力ファイルの文字コードはutf-8
- 1行目はヘッダ行
- フィールドに `test[5桁0埋めの連番]@example.com` を出力

# コード
少し長いので折りたたんでいます。
<details><summary>作成したコード</summary>

```sample.py
import csv
import sys
import datetime

# インデックスを使用してテスト用のメールアドレスを生成する関数
def generate_email_address(index):
    return f"test{index:05d}@example.com"

# 指定された行数のCSVファイルを生成する関数
def generate_csv_file(output_path, num_rows, log_interval=1000):
    # ヘッダ行の作成
    header = "email_address"

    # 実行開始時刻の記録
    start_time = datetime.datetime.now()
    print(f"Execution started at {start_time.strftime('%Y-%m-%d %H:%M:%S')}")

    # CSVファイルの書き込み
    with open(output_path, mode='w', encoding='utf-8', newline='') as file:
        writer = csv.writer(file)

        # ヘッダ行を書き込み
        writer.writerow(header.split(','))

        # 指定された行数分のデータを生成して書き込み
        for i in range(1, num_rows + 1):
            email_address = generate_email_address(i)
            row_data = [email_address]
            writer.writerow(row_data)

            # ログ出力
            if i % log_interval == 0:
                print(f"Generated {i} rows")

    # 実行終了時刻の記録
    end_time = datetime.datetime.now()
    print(f"Execution finished at {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
    elapsed_time = end_time - start_time
    print(f"Total execution time: {elapsed_time}")

if __name__ == "__main__":
    # コマンドライン引数の確認
    if len(sys.argv) != 3:
        print("Usage: python script.py <num_rows> <output_file_path>")
        sys.exit(1)

    try:
        # 指定された行数を取得
        num_rows = int(sys.argv[1])

        # 出力ファイルのパスを取得
        output_file = sys.argv[2]

        # 出力ファイル名と指定された行数でCSVファイルを生成
        generate_csv_file(output_file, num_rows)

        # 成功メッセージの表示
        print(f"CSV file generated successfully: {output_file}")
    except ValueError:
        # エラー処理：不正な入力の場合
        print("Invalid input. Please provide a valid number of rows.")
        sys.exit(1)
```
</details>


# 実行例

```bash
# 3000行を「output.csv」として出力する
python3 script.py 3000 output.csv
```

1000行出力ごとにログが出ます。最後には所要時間も出ます。

```plaintext:実行ログ
$ python3 script.py 3000 output.csv
Execution started at 2023-12-25 12:35:12
Generated 1000 rows
Generated 2000 rows
Generated 3000 rows
Execution finished at 2023-12-25 12:35:12
Total execution time: 0:00:00.011421
CSV file generated successfully: output.csv
$
```


## 出力内容
```output.csv
email_address
test00001@example.com
test00002@example.com
test00003@example.com
・・・
・・・
test03000@example.com
```


# おわりに
もし似たような場面があれば、お役に立てると嬉しいです。

アドベントカレンダー、他の記事もぜひご覧ください:christmas_tree:

https://qiita.com/advent-calendar/2023/activecore
2023 大谷選手 / 打撃データ コース別の打球スピード2

前回の続き。前回の内容もそのまま書く

***

*   2023 大谷選手 / 打撃データ コース別の打球スピード<br>
    <https://hide.ac/articles/gm2TFvdao>

***

今季の大谷選手の打撃結果、コース別の打球スピードを確認する。<br>データは、pybaseballから取得。取得コードは以下。

# データ取得のコード

    !pip install pybaseball
    from pybaseball import statcast
    import pandas as pd
    df = statcast(start_dt='2023-03-30', end_dt='2023-12-31')
    df_ohtani = df[df['batter'] == 660271]

以下にグラフを表示していく。コードは省略。

ストライクゾーンは仮で設定している。以下参照<br><https://hide.ac/articles/LHdcE7uLM>

# 全球の結果　※ビンの数を8に設定

*   各ビンの位置：`plate_x`と`plate_z`の値に基づき、打球がプレートのどの位置に落ちたかを示します。
*   各ビンの色：そのビン内の全ての打球の速度の平均値に基づいて色分けされています。色のスケール（カラーバー）は打球速度の平均値を反映しています。

このヒストグラムは特定の打球位置における打球速度の分布を視覚的に表しており、各ビンの色がそのエリアでの平均打球速度を示しています。

![](https://pbs.twimg.com/media/GA-mP5-asAAvOGB?format=png\&name=900x900)

# 球種ごとの結果　

![](https://pbs.twimg.com/media/GA-mWtFaEAApCMY?format=png\&name=4096x4096)

*   チェンジアップ (CH)
*   カーブボール (CU)
*   カッター (FC)
*   フォークボール (FO)
*   フォーシームファストボール (FF)
*   ナックルボール (KN)
*   ナックルカーブ (KC)
*   スクリューボール (SC)
*   シンカー、2シーム (SI)
*   スライダー (SL)
*   スラーブ (SV)
*   スプリッター (FS)
*   スイーパー (ST)

# カウント別の結果

![](https://pbs.twimg.com/media/GA-mce5boAA92l-?format=png\&name=900x900)

# vs 左投手 / 球種別

![](https://pbs.twimg.com/media/GCMGtwFaIAAzzEt?format=jpg\&name=4096x4096)

# vs 右投手 / 球種別

![](https://pbs.twimg.com/media/GCMHAMyb0AARBTk?format=png\&name=4096x4096)

# vs左右 / 球種別

![](https://pbs.twimg.com/media/GCMHUyda8AAVx85?format=png\&name=4096x4096)

# vs左右 / カウント表示

![](https://pbs.twimg.com/media/GCMHnYPagAA9Qss?format=jpg\&name=4096x4096)

# vs 左右 カウント別、球種別

大量になったので割愛

# カウント別、球種別

![](https://pbs.twimg.com/media/GCMH0xuaMAAlVjF?format=png\&name=4096x4096)

# カウント別、球種別 ※何球中、何球打った結果かも表示

![](https://pbs.twimg.com/media/GCMIjhUa0AA3s66?format=png\&name=4096x4096)

# カウント別、球種別、ランナーなし(アウト数は無視) ※何球中、何球打った結果かも表示

![](https://pbs.twimg.com/media/GCMIw7kbMAAVuFh?format=png\&name=4096x4096)

# カウント別、球種別、ランナー1塁(アウト数は無視) ※何球中、何球打った結果かも表示

![](https://pbs.twimg.com/media/GCMKLyPaoAAEokh?format=png\&name=4096x4096)

# カウント別、球種別、ランナー得点圏にいるとき(アウト数は無視) ※何球中、何球打った結果かも表示

![](https://pbs.twimg.com/media/GCMQf8KbMAA6Vrp?format=png\&name=4096x4096)

# カウント別、球種別、ランナー満塁(アウト数は無視) ※何球中、何球打った結果かも表示

![](https://pbs.twimg.com/media/GCMSs9-aMAAYCck?format=png\&name=4096x4096)
Webminを導入したら行うべきセキュリティー対策３選

## はじめに
　この記事では、Webminを導入したらしておかないと**特にヤバい**セキュリティー対策を紹介します。Webminを導入すると、長いコマンドをワンクリックだけで済ませたり、設定ファイルの作成を自動で行ってくれるというメリットがあります。しかし、その便利さが仇となり、乗っ取られたときの代償は大きいものです。だからこそ、セキュリティー対策を行うべきだと考えます。

## その１ 〜SSL証明書の取得〜
　これは、言わずもがなの対策法ですね。
　`webmin`→`Webmin 設定`→`SSL 暗号化`の順に進んで、`Let's Encrypt`のタブを選びます。場合によっては、Webサーバーを立てて、そのWebサーバーを利用して証明書を取得する必要があるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/722654f4-f94d-af41-94a1-76b3caf2e1c9.png)

## その２ 〜ポートの変更〜
　これも、Webminの管理画面から簡単に行うことができます。`ufw`などのファイアウォールを設定してある場合は、変更先のポートを予め開放しておく必要があります。
　`webmin`→`Webmin 設定`→`ポートとアドレス`の順に進んで、以下の写真の赤い四角で囲んでいる部分を変更します。また、IPv6は利用しない設定にしておきます。
![スクリーンショット 2023-12-25 204622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/b877f98c-610a-e918-a91e-35801e2c760d.png)

## その３ 〜二要素認証の導入〜
　これは、あまり知られていなそうな対策法ですね。この記事を書いている時点では、「Google Authenticator」と「Authy」が対応しているみたいです。私は、「Google Authenticator」で試してみました。
　`webmin`→`Webmin 設定`→`2 ファクタ認証`の順に進んで、認証プロバイダを選んで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/9fd5e967-847a-5a2c-b0b7-85f282d3ecc8.png)

　次に、`webmin`→`Webmin ユーザ`→`Two-Factor Authentication`の順に進んで、「Enroll for Two-Factor Authentication」ボタンを押すと、QRコードが表示されるので、それをアプリで読み取ります。これで、設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/c1a448e9-b8af-a037-a813-dd7795c9129d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/b82c98b0-8f2c-d25a-15ce-4b9f0fc7605c.png)

　いつも通りログインすると、以下の画像のような画面が出てくるのでワンタイムパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/c7ebfd53-3a45-3cd1-e3e4-2b2b2d157239.png)

## おわりに
　Webminは、サーバーのほとんどの機能を扱えるのでこれらのセキュリティー対策対策は必須だと思います。セキュリティーを強化して、自分のサーバーを保護していきましょう。
記事を書くときに思っていること

　本日は、私がブログ記事を書いていて思ったことや、気を付けたこと、できればやりたいことを書いていきます。私の思っていることですので、これが正解というわけではありません。むしろ **正解なんてありません**。 **読者にとって最適であるが正義**です。
 

## はじめに...
　記事の最初に「はじめに」という章を設置することがありますよね。よく0章とも呼ばれます。ここでは、記事を読むにあたっての **主題の紹介や前提知識などを簡潔に**書きます。導入部と呼ばれるように読者が記事を読み進めるか、離脱するかを決める重要な部分でもあります。そのため、 **読者に最後まで読みたいと思わせる**ような工夫が必要です。たとえば、 記事の内容が信頼できると思わせるような **権威性**や読者が得られる **ベネフィット**を入れるのが良いかと思います。

　よく思うのが最終章に設置する「さいごに」です。「はじめに」を設置しなかった場合は、「さいごに」で良いですが、 **「はじめに」で始まった場合は、「おわりに」にすべき**だと感じます。
　「さいしょに」と「さいごに」のように対応関係を合わせておくと記事の統一感が出るでしょう。でも、最初にをひらがなで書くと少し違和感を感じてしまうので、「最初に」「最後に」よりも「はじめに」「おわりに」のほうが良いと思います。

 ## 適切に太字を入れる
 　読者にわかりやすいように文章を丁寧に書くことは大事です。しかし、文章を丁寧に書こうとするとどうしても長くなってしまいます。結果として長くなった文章は読者にとっては文字の塊に見えてしまいます。この文字の塊を見ると一気に読む気がうせてしまうでしょう。それならどうしたらよいでしょうか。最も手軽で効果的な方法の一つとして、文章の中で重要なポイントやキーワードに適切に太字を用いるという手段が挙げられます。
  
　前の段落のように長い文章の中には、適切に太字を入れるべきです。 **強調したいところを太字にする**のが良いと思います。読者はできるだけ早く文章を読み終えたいと思っていると考えて、どこが大事かを示していくのが良いでしょう。私は、 文章の２～３割程度を太字にして、 **太字部分だけを読んでも書いてある内容がある程度わかる**ようにするのが理想だと考えています。
  
 ## 画像や図解を入れる
　記事を読み進める中で、文字だけで構成すると読者は読み進めないといけなくなり、疲れてしまいます。そこで、 **途中に画像や図解を入れるの**が良いと考えています。画像や図解は、書いてある **文章を理解しやすくするため** にいれますが、結果的に文字を読むという行為の **休憩場所にもなる**と考えています。
 
 　ブログ記事を執筆するとき、**図解を作るにはどうしても時間がかかってしまいます**。しかし、その考えは **筆者の怠慢**だと思います。作成した記事を読んで欲しいと思っているなら、**読者が読みやすい記事**にするのは当然でしょう。（この記事も画像や図解は入っていません。すいません）

 ## おわりに...
　ここまで、今の私が記事を書くときに意識することをまとめてきました。しかし、私が書いた記事のすべてがこの記事で紹介したようになっているとは言えません。そのため、これからもいくつかの記事を書いて、より読者にとって適切な文章が書けるように精進していきたいです。
　ぜひ、過去の記事がこの記事の内容に沿っているかをチェックしてみてください。

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



（全然できていないです。）
JSONデータを理解する

　今回の記事はJSONの理解を深める記事を書いていきます。

## JSONとは
　JSONデータは以下のようなデータ構造になっています。（ChatGPT作成）
```JavaScript
[
    {
        "name": "山田太郎",
        "age": 25,
        "isStudent": true,
        "hobbies": ["読書", "映画鑑賞", "旅行"],
        "address": {
            "city": "東京",
            "postalCode": "100-0001"
        },
        "siblings": null
    },
    {
        "name": "佐藤花子",
        "age": 22,
        "isStudent": false,
        "hobbies": ["料理", "ガーデニング", "写真撮影"],
        "address": {
            "city": "大阪",
            "postalCode": "530-0001"
        },
        "siblings": 1
    }
]

```
### JSONはJavaScriptを元にしている!?
　JSONは、**J**ava **S**cript **O**bject **N**otationの頭文字をとったものです。名前の通り、もともとはJava Scriptで定義されたオブジェクト記法の一つだったのです。それが、今では多くの言語で使用されています。

### JSONデータの特徴
　JSONデータの特徴を挙げていきましょう
 - テキストベース
 - キーと値のペア
 - 非言語依存
 - シンプルな構文

　テキストベースでシンプルな構文のため、軽量のデータとされています。
 
## JSON構文に登場する記号
　JSONの構文に使用する記号を挙げていきます。
 
### 波括弧 {}
オブジェクトを定義する際に使用します。オブジェクトはキーと値のペアの集合です。
```javascript
{ "name": "John", "age": 30 }
```
ここでは、nameがキー、Johnがnameキーに対応する値です。

### 角括弧 []
 配列を定義する際に使用します。配列は順序付けられた値のリストです。
```javascript
[ "apple", "banana", "cherry" ]
```

### コロン :
オブジェクト内のキーと値を区切る際に使用します。
```javascript
{ "name": "John" } 
```

### カンマ ,
オブジェクトの異なるキーと値のペアや、配列の異なる要素を区切る際に使用します。
```javascript
 { "name": "John", "age": 30 }  // オブジェクト
 [ "apple", "banana", "cherry" ]  // 配列
```


### 二十引用符 "
文字列の値を囲む際に使用します。JSONでは、キーも二十引用符で囲む必要があります。
```javascript
{ "name": "John" } //"name"と"John"は両方とも二十引用符で囲まれている
```
### エスケープ　\（¥マーク）
文字列の値の中に構造で使用する文字を入れるときに使用します。

```javascript
{ "request": "I want \"money\" !" } // データとしては「I want "money" !」
```
文字列の中に二十引用符などの構文に使用している文字を入れる場合は\を付けます。そのほかにも改行（\n）やタブ（\t）を入れるときに使用します。
## JSONは構造化データか
　データ型の中でも、列と行のように明確に定められた構造に成形されたデータを構造化データと言います。ExcelファイルやSQLデータベースなどが構造化データに当たります。では、JSONは構造化データに入るのでしょうか。答えは **NO**です。
　JSONは列と行のように完全に構造化されていないため、構造化データには入りません。しかし、ある程度は構造が決まっているため、 **半構造化データと呼ばれています**。JSON以外の半構造化データはXMLなどです。

## JSON成形ツール
　JSONデータは改行やタブが入っていると構造が見やすく、人間にとって理解しやすいですが、そのままデータとして取り込むと不具合が起こる場合もあります。そのため、データを成形する必要が出てきます。

https://www.en-pc.jp/tech/jsonformat.php

 ## 参考
 https://qiita.com/momonoki1990/items/cd9a65498c2b16b0ed55
 https://and-engineer.com/articles/YUrUYBAAACUA2zGd
Kaggleに挑戦したい

## やりたい宣言
　来年やりたいことの一つにKaggleなどのコンペへの挑戦があります。そこで今回はKaggleについて調べてみました。マナビを活かしての今後の展望に乞うご期待ください。


https://www.kaggle.com/


## 挑戦のメリットをまとめよう

- 機械学習やデータサイエンスのスキル向上
- 技術や経験を積む
- コミュニティの参加
- 実績の積み上げ

　やはり、Kaggleに緒戦する主な理由としては、これまで学んできた統計や機械学習の知識の実践です。実際のデータセットを用いているので、より実践的な技術や知識を深めることができます。上位に入賞することができれば、それが実績となり、自身のキャリアに大きく寄与することができるでしょう。

　私も知識や技術を得るために、挑戦をしていきたいです。
　
kaggleのアドベントカレンダーがあります。読むだけでもたくさんの知恵を得ることができました。

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