OmniAICreator/Qiita-1.07M huggingface dataset:
結合テストの歴史と進化 第1回：IBMメインフレーム時代

## はじめに

現代のソフトウェアテストは、GitHubアクションでのCI/CDやマイクロサービスの結合テストなど、高度に自動化された環境で行われています。このような便利な環境に至るまでの結合テストの歴史を紐解きながら、現代のテスト手法への理解を深めていきたいと思います。

## IBM System/360の登場

1964年、IBMは革新的なメインフレームコンピュータ「System/360」を発表しました。
それまでのコンピュータは科学計算や事務処理等、特定の用途専用に設計されており、別の用途に使いまわすことは困難でした。
そんな時代に登場したSystem/360はOS（オペレーティングシステム）の概念を確立し、ハードウェアとソフトウェアの分離を進めることで、様々な用途に汎用的にコンピュータを使用できることが画期的でした。
「360」というのは360度を表し、あらゆる用途に対応できる「全方位」であることを示しています。
これは、ソフトウェア開発の歴史における重要な転換点となりました。

### パンチカードの時代の結合テスト

当時のプログラミングは、パンチカードを使用して行われていました。一枚のカードに一行のプログラムが記載され、数千行のプログラムは文字通り、段ボール箱いっぱいのパンチカードの山となりました。

```assembly
* 1960年代のアセンブリコード例
* 二つの浮動小数点数（DATA1とDATA2）を加算し、その結果をRESULTに格納する
START    BALR  R12,0         * ベースレジスタの設定
        USING *,R12
        L     R3,DATA1       * データのロード
        A     R3,DATA2       * 加算
        ST    R3,RESULT     * 結果の保存
DATA1    DC    F'100'        * 定数定義
DATA2    DC    F'200'
RESULT   DS    F             * 結果格納領域
        END
```

このような環境での結合テストには、以下のような特徴的な課題がありました：

1. 物理的な制約
   - プログラムの修正には、パンチカードの差し替えや再パンチが必要
   - カードの順序が狂うと、プログラム全体が機能しなくなる
   - テスト実行のたびにカードを読み込む必要があった

2. 時間的な制約
   - コンパイルに数時間かかることも
   - エラーが発生した場合、次の実行まで丸一日待つことも

### 初期の結合テスト手法

IBMのプログラマー、Fred Brooks（のちに「人月の神話」の著者）は、当時のテスト手法について以下のように記しています

> "プログラムの結合は、まるで巨大な手術のようだった。すべての部品が揃っているか確認し、一つずつ慎重に組み合わせていく。エラーが発生すれば、それは大きな手戻りを意味した。"

#### 当時の結合テスト手法の特徴

1. ステップバイステップの結合
   - 最小単位のモジュールから開始
   - 動作確認済みのモジュールに、新しいモジュールを一つずつ追加
   - 各ステップでの詳細なログ取得と解析

2. バッチ処理としてのテスト実行
   - テストケースもパンチカードで準備
   - 結果は紙の出力で確認
   - エラーの場合、メモリダンプ[^1]を解析
[^1]: メモリダンプとは
コンピューターが動いている最中のメモリの中身は、プログラムの命令やデータでいっぱいです。このメモリの中身を、ある特定のタイミングでファイルに保存することで、その時点でのコンピューターの状態を記録することができます。

### メモリダンプによるデバッグ

```
Memory Dump Example (1960s):
0000: 4C00 0000 0000 0000  L....... 
0008: 5820 1004 0000 0000  ........ 
0010: 5010 2000 0000 0000  ........ 
```

このようなメモリダンプを読み解き、問題箇所を特定する技術は、当時のプログラマーにとって必須のスキルでした。

## 結合テストの標準化への第一歩

この時代の経験から、以下のような教訓が得られました

1. モジュール間のインターフェース定義の重要性
    - メインフレーム時代、複数のプログラマーがそれぞれパンチカードでプログラムを作成
    - プログラム間のデータ受け渡しは、主にメモリ上の共有領域を介して行われていた
    - インターフェースの定義があいまいだと、深刻な問題が発生
2. 段階的なテストの必要性
    - コンピュータの実行時間は非常に高価（1時間あたり数千ドル）
    - デバッグ用のメモリダンプ出力も大量の紙を消費
    - 一度にすべてのモジュールを結合すると、エラーの原因特定が困難
3. テスト結果の記録と追跡の重要性
    - テスト実行には長時間を要する（数時間〜一日）
    - コンピュータリソースの予約が必要
    - 同じバグの再発が大きなコスト損失に

これらの教訓は、のちのモジュール化時代における設計手法や、現代のテスト戦略にも大きな影響を与えています。

## 振り返りと現代への示唆

IBMメインフレーム時代の結合テストから得た現代の結合テスト戦略。

1. 体系的なアプローチの重要性
   - 当時確立された「ステップバイステップの結合」の考え方は、現代でも有効
   - テスト計画の重要性は時代を超えて不変

2. ドキュメンテーションの価値
   - インターフェース仕様の明確な定義
   - テスト結果の詳細な記録

3. 制約がもたらすイノベーション
   - 限られたリソースでの効率的なテスト手法の開発
   - エラー検出・診断技術の進化
ディスクへのアクセスはなぜ遅いと言われるのか

# はじめに
ディスクアクセスは遅い、メモリアクセスは速い。

なにかのパフォーマンスを考える際のひとつの指標としてよく言われる話です。でも、「なぜディスクアクセスは遅いんですか？」と突っ込まれて聞かれると回答に窮します。具体的にどういう理由でディスクのアクセスがメモリに劣るのかを深堀りします。

# ディスクの種類と仕組み
ディスクにはHDDとSSDがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/570e2e73-b648-6e48-3ad5-addb482cd6bb.png)

- HDD
    - Hard Disk Drive
    - 円盤型の磁気ディスクとディスクを読み取るための磁気ヘッドを組み合わせたドライブ
- SSD
    - Solid State Drive
    - NANDフラッシュ回路を用いたドライブ


HDDは磁気ヘッドが対象のディスク位置まで物理的に移動する時間を要します。SSDは電子回路なので物理的移動時間はありませんが、回路上にあるセルと呼ばれる領域にビット単位でデータを保持します。

HDDは磁気ヘッドの移動時間があるのでSSDより低速です。じゃあSSDがとても速いのかと言われるとそんなことはなく、メモリアクセスのほうが速くなります。

```
HDD < SSD < RAM(メモリ)
```

# メモリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159675/2264cc40-68b7-fdc9-6938-07b0a952d19f.png)

メモリはRAM(Random Access Memory)と呼ばれる領域に保持されます。メモリはCPUと直接接続されているため、高速なデータ読み書きが可能です。HDDやSSDはCPUと直接接続はされていないため、メモリほど高速な読み書きはできません。

代わりに、メモリ上に保持したデータはシャットダウンと同時に消失します。一方でHDD,SSDに保存されたデータは永続化されるためシャットダウン後も残り続けます。データの揮発性の違いですね。

# インメモリxxと呼ばれるミドルウェア
インメモリDB、インメモリキャッシュなどのミドルウェアは、メモリ上で動作するDB/キャッシュということです。メモリ上にあるということはデータが揮発するリスクがあるのではないか？と感じますが、必ずしもそうではありません。

例えば、インメモリDBのRedisなどは定期的に裏でデータの永続化を実施しておりデータが揮発しないように設計されています。スナップショットを取ったり、AOF(Append Only File)というデータ書き込み履歴を管理するログファイルを用いたりしています。

https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/
Clients

[Previous << Flow Emulator](https://qiita.com/flowcadence/items/cdbb322711f32a09028c)
[Next >> Flow Client Library (FCL)](https://qiita.com/flowcadence/items/4174cc0ae785b1ddb1d6)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#reference-2020832ebee1810a325a


<h1>Go SDK</h1>

[Flow Go SDK](https://qiita.com/flowcadence/items/3616deed7fbb2d69f91e) は、Go開発者がFlowネットワークとやりとりするアプリケーションを構築するためのパッケージ一式を提供します。

<h1>Python SDK</h1>

[Flow Python SDK](https://github.com/janezpodhostnik/flow-py-sdk) は、Python開発者がFlowネットワークとやりとりするアプリケーションを構築するためのパッケージ一式を提供します。


<h1>Ruby</h1>

[flow_client](https://github.com/glucode/flow_client) は、Flow (onflow.org) の Ruby gRPC clientです。


<h1>JVM</h1>

[Flow JVM SDK](https://github.com/onflow/flow-jvm-sdk) は、Flowブロックチェーンとやりとりするためのユーティリティを提供する、Kotlinで実装された、JVM互換の言語のライブラリです。


<h1>JavaScript (FCL)</h1>

[Flow Client Library (FCL)](https://qiita.com/flowcadence/items/4174cc0ae785b1ddb1d6) は、ユーザーのウォレットとFlowブロックチェーンとのやり取りに使用されるパッケージです。


<h1>Swift</h1>

[flow-swift](https://github.com/Outblock/flow-swift)は、モバイル領域でFlowのiOSアプリケーションを構築するためのツールです。


<h1>.Net</h1>

[flow.net](https://github.com/tyronbrand/flow.net)は、Flow上で.Netアプリケーションを構築するためのツールです。


<h1>Rust</h1>

Flow blockchainネットワークのための[Rust SDK](https://github.com/fee1-dead/flow.rs)があります。


<h1>PHP</h1>

Flow blockchainのための [PHP SDK](https://github.com/mayvenstudios/flow-php-sdk) があります。


<h1>Elixir</h1>

[OnFlow](https://github.com/nkezhaya/on_flow)は、FlowブロックチェーンとやりとりするためのElixirクライアントです。ドキュメントは[こちら](https://hexdocs.pm/on_flow/OnFlow.html)にあります。


<h1>HTTP API</h1>

[Flow OpenAPI](https://developers.flow.com/http-api) 仕様



*Last updated on **Nov 15, 2024** by **Alex Ni***

翻訳元

https://developers.flow.com/tools/clients

***
<b>[Previous << Flow Emulator](https://qiita.com/flowcadence/items/cdbb322711f32a09028c)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Clients)

<b>[Next >> Flow Client Library (FCL)](https://qiita.com/flowcadence/items/4174cc0ae785b1ddb1d6)</b>
StackBlitzを使ってトップページを編集してみた

## はじめに
本記事は [土山竜輝のひとり Advent Calendar 2024](https://qiita.com/advent-calendar/2024/tatsuki-tsuchiyama) の4日目です。25日間でポートフォリオサイトを作っていきます！


## 実装
boltの右上のタブに「Open in StackBlitz」とあります。選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/1d1a4b40-6bfd-24dc-507e-ee449df14ac4.png)

コードエディタが表示されました。ブラウザで編集できるエディタのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/542b5e24-9ddf-022b-81c5-31b07855594d.png)

[Genspark](https://www.genspark.ai/)に「StackBlitzについて詳しく解説してください。」と質問してみました。

すると、以下の回答が返ってきました。
　　
（ここから回答）
StackBlitzは、Webブラウザ上で動作する強力なオンライン統合開発環境（IDE）であり、特にWeb開発者にとって便利なツールです。2017年にEric Simonsによって立ち上げられ、2021年にはWebContainersの導入により、ブラウザ内でNode.jsのようなサーバーサイド環境を完全に実行できるようになりました。この革新により、ローカルインストールを必要とせずにフルスタック開発が可能となり、Web開発の風景においてユニークなツールとなっています [1](https://stackblitz.com/) [4](https://en.wikipedia.org/wiki/StackBlitz)。

StackBlitzの主な特徴
即時開発環境: StackBlitzは、WebContainersによって強化された即時フルスタックWeb IDEを提供し、ブラウザ内でNode.js環境をミリ秒で起動できます。これにより、ローカルセットアップや構成の必要がなく、ユーザーはすぐにコーディングを開始できます [6](https://developer.stackblitz.com/guides/user-guide/what-is-stackblitz) [9](https://en.wikipedia.org/wiki/StackBlitz)。

セキュリティとパフォーマンス: すべての開発はブラウザ内で行われ、サンドボックス環境で実行されるため、セキュリティが向上します。このアプローチはセキュリティを強化するだけでなく、開発環境が高速で応答性が高く、依存関係のインストールや更新が迅速に行われます[6](https://developer.stackblitz.com/guides/user-guide/what-is-stackblitz) [9](https://en.wikipedia.org/wiki/StackBlitz)。

オフライン機能: StackBlitzはPWA技術を通じてオフライン開発をサポートし、インターネット接続がなくてもコーディングを続けることができます。この機能は、不安定な接続環境で作業する開発者にとって特に有用です [8](https://medium.com/stackblitz-blog/stackblitz-online-vs-code-ide-for-angular-react-7d09348497f4) [9](https://en.wikipedia.org/wiki/StackBlitz)。

リアルタイムコラボレーション: プラットフォームは、ユニークなURLを介してプロジェクトを簡単に共有でき、チームがリアルタイムでコードを共同作業するのを容易にします。この機能は、教育目的やプロのチーム環境の両方に有益で、即時のフィードバックとコラボレーションを促進します [7](https://stackblitz.com/) [10](https://stackblitz.com/)。

ホットリロード: IDEはリアルタイムのホットリロードをサポートしており、コードに加えた変更がページをリフレッシュすることなく即座にプレビューに反映されます。この機能は、開発プロセスを大幅にスピードアップし、開発者が変更の影響をすぐに確認できるようにします [6](https://developer.stackblitz.com/guides/user-guide/what-is-stackblitz) [7](https://stackblitz.com/) [10](https://stackblitz.com/)。

多様なフレームワークのサポート: StackBlitzは、Angular、React、Vue.jsなどのさまざまなフレームワークをサポートしており、さまざまなタイプのWebアプリケーションに対応しています。また、GitHubから既存のプロジェクトをインポートしたり、テンプレートから新しいプロジェクトを作成したりすることもできます [8](https://medium.com/stackblitz-blog/stackblitz-online-vs-code-ide-for-angular-react-7d09348497f4) [9](https://en.wikipedia.org/wiki/StackBlitz)。

StackBlitzは、迅速なプロトタイピング、コラボレーティブコーディング、効果的なデバッグを可能にする機能を備えた、現代のWeb開発ニーズに応える優れたプラットフォームです。
(回答ここまで）

　　
ブラウザ上でNode.js環境が動かせるのは良いですね。
このエディタを使ってトップページの内容を私自身の内容に編集します。

情報を書き換えました。
ここに関しては生成AI使ってません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/0d2331d9-6385-4a26-aad6-4487d22ced04.png)


少しバランスが悪い気もするので、これから調整していく予定です！
次回は、「生成AIを使って記事詳細ページを改善してみた」です。
マークダウン表示ができていなかったので、対応していきます。
最後まで読んでいただき、ありがとうございました！
boltで得られたプロジェクトをNetlifyにデプロイしてみた

## はじめに
本記事は [土山竜輝のひとり Advent Calendar 2024](https://qiita.com/advent-calendar/2024/tatsuki-tsuchiyama) の3日目です。25日間でポートフォリオサイトを作っていきます！


## 実装
boltで得られたコードをデプロイしてみましょう。

boltのSettingsを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/49aae57e-9e18-6bf8-bbfb-712d113ddb2d.png)
　　
ApplicationsのNetlifyの「Connect」を選択します。Netlifyのアカウントを持っていない場合は新規で作成してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/8965fe92-460d-b2c7-e1a1-b80c0463d2a6.png)
　　
「Authorize」を選択し、認証します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/7f1bc281-ae32-e5e8-7e84-967d77ca8559.png)
　　
右上の「Deploy」選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/311fb330-b7e6-1a7a-0e62-acff54907efe.png)
　　

URLにアクセスすると、サイトが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/20363a57-8171-aee9-2dd3-562573413432.png)
　　
簡単でしたね。
次回は「生成AIを使ってトップページを改善してみた」です。
boltのコードエディタを使って編集していきます。
最後まで読んでいただき、ありがとうございました！
Scratchで簡単な計算機を作ったら地獄だった

何を思ったのかScratchでプログラミング言語を作ろうと思ったけど、難しすぎて計算機で挫折しました。（普段は主にC++でプログラミング言語を作っています）

https://scratch.mit.edu/projects/1100944700/

# インタプリタの仕組み
```mermaid
graph TD;
字句解析-->Token([トークン])
Token-->構文解析
構文解析-->EXP([構文木])
EXP-->インタプリタ
インタプリタ-->result([結果])
```

# プログラム

## 字句解析器(Lexer)
字句解析器は、式をTokenと呼ばれる最も小さな要素に分割します。（日本語の文章を単語で分けるイメージ）
```mermaid
graph LR;
Exp([30 + 5 * a ** 2])-->字句解析器
字句解析器-->tokens([30, +, 5, *, a, **, 2])
```
![スクリーンショット 2024-11-19 7.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/ac72d1e0-a405-09ef-4e73-785de88451ba.png)

## 構文解析
構文解析器は、字句解析器で生成したtokenの列につながりを持たせます。
```mermaid
graph TD
    tokens([30, +, 5, *, a, **, 2])-->構文解析
    構文解析-->構文木

    subgraph 構文木
        '+'-->30 & '*'
        '*'-->5 & '**'
        '**'-->a & 2
    end
```
そして、演算子の順番を考慮するために、それぞれの優先度ごとに関数を作ります。優先度の低い演算子の関数（例えば = の関数）からはそれよりも優先度の高い演算子の関数を呼びます（例えば +,- の関数）。そして、最も優先度の高い演算子の関数は、要素（例えば 3,a,(3 + 5)　など）を表す関数(factor)を呼びます。
この計算機だと、演算子の順位は下の表のようになります。
| 演算子の名前         | 演算子       | 
| -------------------- | ------------ | 
| 冪乗                 | ^            | 
| 掛け算・割り算・余り | *, /, %      | 
| 足し算・引き算       | +, -         | 
| 比較演算子           | ==, !=, >, < | 
| 論理演算子           | &, &#124;, ! | 
| 代入演算子           | =            | 

### 要素（factor)![スクリーンショット 2024-11-23 15.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/9e903de8-54f5-d9d9-bdc5-458056d7a773.png)


### 冪乗
![スクリーンショット 2024-11-20 17.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/5b5499d3-a42e-b5a9-bf22-5df23f8a3ac0.png)

### 四則演算 余り
![スクリーンショット 2024-11-20 17.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/df411af6-15eb-aa28-a443-533dbc814a57.png)

### 比較演算子・論理演算子・代入
四則演算と同じような感じで定義しました

## インタプリタ
インタプリタは、構文木を上から辿っていくことで計算していきます。

![スクリーンショット 2024-11-23 11.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/b1a7cd70-861d-46ab-42ea-dbc83660dd48.png)
演算子の処理定義が無限に続きます。。。

# 困った点・工夫した点
## 関数の戻り値
構文解析は基本再帰で行うのですが、Scratchの関数（どちらかというとサブルーチン）は戻り値を返すことができないので、苦労しました。結局、実際の機械語の関数呼び出しの仕組みを参考にして、戻り値を格納するリストを作り、そこでPushとPopを繰り返すことで実現しました。
![スクリーンショット 2024-11-23 15.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/dcd767f8-b0bf-80ce-d526-4b21fb03c060.png)

## オブジェクト
Scratchはオブジェクト指向言語では（多分）ないので、こちらも要素を表すためにメモリーという名前のリストを作り、オブジェクトを表すときはその番号を示すことで実現しました。
![スクリーンショット 2024-11-23 15.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/e9f0aee6-2a08-cadf-d7f8-cfe30a8138f4.png)

# 結論
Scratchはめんどくさい！
少なくともプログラミング言語を作るときはScratchではない言語で作った方がいいと思います。
ただ、関数やオブジェクトもがんばれがスクラッチで作れることがわかりました。
Ｗｅｂデザイン入門　 jQueryでアコーディオンメニューを作ろう


1. サマライズ
 ・ dtタグで囲ってあるリストをクリックするとddが表示される
・ul liなど他のタグでも使用する機会がある
例　html側の記述
<dl id="accordion-menu">
      <dt>好きな食べ物は？</dt>
      <dd>お寿司です！</dd>
      <dt>嫌いな食べ物は？</dt>
      <dd>ミニトマトです。。。</dd>
    </dl>
　JS側の記述
// #accordion-menuの中のdtをクリックした時に

// クリックした要素の次の要素がスライドして表示される


下記コードを「.on」メソッドで言うと

「いつ」は「click」した時
「何を」は「.accordion-title」をクリックした時
「どうする」は次に定義されている関数の中で行われるアクション、
つまり、スライドをトグルすることとクラスの変更を行います。


$('.accordion-title').on('click', function () {
  /*クリックでコンテンツを開閉*/
  $(this).next().slideToggle(200);
  /*矢印の向きを変更*/
  $(this).toggleClass('open');
});

（200）は時間です。200ミリ秒ということは0.2秒になる

2.言語化してみての気づき
・200ミリ秒（0.2秒）があるということは、100ミリ秒（0.1秒）や50ミリ秒（0.05秒）があるということ
・数値を変えるとアニメーションの表示速度が変わるとあるが、実際にやってみたが、200ミリ秒→100ミリ秒は
速さが変わったと思うが、100ミリ秒→50ミリ秒に関してあまり速さが変わっと体感では感じられなかった。
Informatica EDCについて

# Informatica経歴

■ AWS上で構築。EC2・RDS(Oracle)・VPC・S3を使用。
- Informatica 10.4 EDC・EDP・DEI
- Informatica 10.5 EDC・EDP・DEI
オンプレ版のみ対応。
※DEIはPowerCenterの後継機に近い。

■ 具体的な作業内容
- Informaticaのパッチ適用
- Informaticaバージョンアップ・機能検証
- Informaticaインストール

## Informaticaの問題点。
・リソースのスキャン(プロファイリング)が凄く時間がかかる。

・バグがとにかく多い。パッチを都度適用する必要があった。
  例：EDPのプレパレーション画面を開くのに、20分以上かかる。
    ：EDCのリソースのスキャンが開局時間まで終わらず、データが更新されない。
※ただ、現在クラウド版が出ているため、パッチ適用を手動で行うこと必要はなくなり、解消されている可能性あり。
    
・データスチュワード側で、EDC・EDPの使い方を熟知している人がおらず、そもそもあまり使われなかった。

・EDC・EDPは機能としては充実しているように見えるが、使いこなさないと、ただのDB定義書のような扱いになってしまうため、事前にどのように使うか決めておく必要がある。
Pythonライブラリを使って、日出・日没時間を取得する

# はじめに
　天文学を扱うPythonライブラリである[PyEphem](https://github.com/brandon-rhodes/pyephem/tree/master)を使って、Pythonで日出時間および日没時間を取得する方法を紹介する。また、応用例として昼夜判定方法も併せて紹介する。

# 動作確認環境

* OS
  * Windows 10 
  * Ubuntu 20.04
* Python
  * 3.8.10
  * 3.10.11

# 環境構築

　pipでpyephemをインストールする。

```bash
pip install pyephem
```

# 方法

## 日出時間、日没時間の取得

　現時刻に対する日出時間、日没時間を計算する。

```python
#!/usr/bin/env python

import ephem
import datetime

observer = ephem.Observer()

# 東京駅の緯度経度
observer.lat = '35.6809591'
observer.lon = '139.7673068'

# 現在時刻 (UTC)
observer.date = datetime.datetime.utcnow()

sun = ephem.Sun()

# UTC時刻で、日出・日没時間を取得
prev_sunrise_utc_date = observer.previous_rising(sun, use_center=True)
next_sunrise_utc_date = observer.next_rising(sun, use_center=True)
prev_sunset_utc_date = observer.previous_setting(sun, use_center=True)
next_sunset_utc_date = observer.next_setting(sun, use_center=True)

# ローカル時刻へ変換
current_local_date = ephem.localtime(observer.date)
prev_sunrise_local_date = ephem.localtime(prev_sunrise_utc_date)
next_sunrise_local_date = ephem.localtime(next_sunrise_utc_date)
prev_sunset_local_date = ephem.localtime(prev_sunset_utc_date)
next_sunset_local_date = ephem.localtime(next_sunset_utc_date)


print(f'現在時刻：{current_local_date}')
print(f'現在時刻より前の日の出時刻：{prev_sunrise_local_date}')
print(f'現在時刻より後の日の出時刻：{next_sunrise_local_date}')
print(f'現在時刻より前の日の入り時刻：{prev_sunset_local_date}')
print(f'現在時刻より後の日の入り時刻：{next_sunset_local_date}')
```

出力例
```
現在時刻：2024-11-26 06:16:20.814236
現在時刻より前の日の出時刻：2024-11-25 06:28:02.656880
現在時刻より後の日の出時刻：2024-11-26 06:29:00.191108
現在時刻より前の日の入り時刻：2024-11-25 16:27:30.708754
現在時刻より後の日の入り時刻：2024-11-26 16:27:11.204736
```

## 昼夜判定

　上記の日出時間、日没時間の取得のPythonコードに以下を追記する。

```python
is_night = False
# 太陽が出ているかどうかを判定
if prev_sunrise_local_date > prev_sunset_local_date:
    print('Sun is up')

    if (prev_sunrise_local_date < current_local_date < next_sunset_local_date):
        is_night = False
    else:
        is_night = True

# 太陽が沈んでいるかどうかを判定
else:
    print('Sun is down')
    if (prev_sunset_local_date < current_local_date < next_sunrise_local_date):
        is_night = True
    else:
        is_night = False

print(f'現時刻({current_local_date})は、' + ('夜' if is_night else '昼'))
```

出力例
```
Sun is down
2024-11-26 06:16:20.814236は、夜
```

# まとめ

　Pythonで日出時間および日没時間を取得する方法を紹介した。また、応用例として昼夜判定方法を紹介した。夜間に自動で照明を点灯したい場合などに有用である。

# 参考

https://github.com/brandon-rhodes/pyephem/tree/master

https://rhodesmill.org/pyephem/

https://bcn.xsrv.jp/post-1929/

http://www.sci-museum.kita.osaka.jp/~egoshi/astronomy/python/python.html

https://qiita.com/taka_so/items/45c7a09d36de98d84611

https://kamosawa.hatenablog.com/entry/2023/02/27/145650

https://stackoverflow.com/questions/20690951/check-if-time-is-between-tonight-and-tomorrow-morning
読書感想文「名人椿正明が教える帳票分析 50のケーススタディ」

# 書籍名「名人椿正明が教える帳票分析 50のケーススタディ」
著　椿正明
翔泳社

# 読もうと思った動機
・高安 厚思著の「システム設計の謎を解く 改訂版 強いSEになるための機能設計と入出力設計の極意」の参考文献として紹介されていたため。
・タイトルに惹かれたため　「帳票分析」という単語の部分です。
・実務で帳票とデータモデルを触る機会があり、掘り下げたいと思ったため。


# 印象に残った部分
## はじめに
実データの記入された画面/帳票をベースにデータモデルの世界に足を踏み入れるのが最も無理のない習得方法だと思われます。

## データモデル種類
```
##entity
entityとは、identifierから「番号」や「コード」を取り除いた「従業員」や「顧客」のことです
identifierが無ければentityを生成することはできません
つまり、「顧客コード(identifier)」がなければ「顧客(entity)」は生成できません

ここがT字形ER手法の事実を元にモデリングを行う、という部分に繋がってきていますね！

##resourceとevent
entityをresourceとeventのどちらかに分類します
下記が分類のやり方です

eventになるもの
　①タイムスタンプを採取できること
　　それを行った日付があり、「それはいつ起こったの？」という質問ができるもの
　②監査証跡が保管されている
　　端的に言うと、数量や金額のこと
　　帳票等が保管されているもの

resourceになるもの
　event以外のentity

```
引用した部分
https://qiita.com/abcaaa/items/530d04075e68b3f1a6f6

## p47 画面や帳票は記入済のものを用いる
分析対象の画面や帳票のサンプルは実データの記入されたものとします。
単なるブランクフォームは分析を難しくします。
実データが記入された帳票にブランク欄があれば、それは該当値がないとして重要な意味を持ちます



# 実践できること or 感想

## 感想
・良い本ですね。中古でちょっと高かったですが良い買い物だったと思います。
・データモデル、帳票、画面が纏められているの自分で手を動かして勉強できます。
　なかなかここまで纏められている本は少ないのでとても良い本ですね。
・扱っている題材も豊富で腐りにくいテーマが多いので、一度習得しとけば使い勝手が良いスキルになると思います。

## 実践できること
・p3の画面/帳票部分10題を実際に作ってみる
　DBはsqlite、アプリケーション側は以下3通りを考えています。
　１．FileMaker:ローコードツール　月2000円　現状これで試すのが有力
　２．FineReport:ローコードツール　業務で使っている　使用料が要相談なので面倒　月1500円なら考える
　３．JavaScript + ActiveReport :Active Reportの利用料は高い　20万円は無理です
Momento Cache CLIを触ってみた。

## はじめに

以前、札幌で開催されたserverless meetup sapporoでmomentoを触ったので、それ元に自身の知識を整理する記事です。

このような貴重な経験ができる機会を札幌で開催していただき、関係者のみなさまには感謝しかありません！

https://serverless.connpass.com/event/332724/

この記事では、Momento Cacheを取り上げます。

## Momento Cache？

一言で書くと、フルマネージド型のサーバーレスキャッシュサービス。

セッション管理に利用したり、NoSQL型データベース、RDSのアクセラレータなどのパフォーマンス最適化に使用するサービスのようです。

https://www.gomomento.com/jp/%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0/cache/

### 料金は？

Momento料金体制は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/5a0bdfbb-4ac2-9fa4-a30d-cf3f3cc85990.png)

https://www.gomomento.com/jp/pricing/

無料枠(月間500万件まで無料)もあって、まず触ってみたい！って方から社内の小さいシステムとかでも十分無料で使えそうな大きな枠です。

## Redis、Memcachedとかと違うんだっけ？

適しているシーンはそれぞれ違うものの、用途としては「キャッシュサービス」で似ています。

ただ、Momento Cacheはフルマネージドなサーバレスというところで、以下のようなメリットがあるかなと思います。

https://docs.momentohq.com/ja/cache/introduction/what-is-serverless-caching

* インフラ管理不要
    * サーバのセットアップ不要
    * ゼロコンフィギュレーション
        * バージョン管理不要
        * クラスターや、フェールオーバ構成等が不要
* 従量課金制
    * 使った分だけ課金される


### なんと、無料でPrivateLinkも？

特に無料アカウントで対応できる旨の明記を見つけることができませんでしたが、AWS PrivateLinkにも対応していました。

https://github.com/momentohq/connectivity-patterns/tree/main/AwsPrivateLink

検証してみたかったのですが、申し込み等が必要なので今回は断念。

以下に詳しい検証がされていました。

https://zenn.dev/momentobigfun/articles/3225f576f0591d

## よし、触ってみよう！

ハンズオンでも触りましたが、もう一度気になったところを触っていきます。

### まずは、APIキー発行

手順は以下にありますが、とっても簡単です。

https://docs.momentohq.com/ja/cache/develop/authentication/api-keys

任意の方法でアカウント作成後、鍵のアイコンのところから発行できます。

![スクリーンショット 2024-11-26 4.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/6406159c-ecb2-a403-84e5-b6a5bb9509f7.png)

APIキーの種別は、なんでも出来る`Super User Key`と、特定の操作のみを許可する`Fine-Grained Access Key`がありました。

`Fine-Grained Access Key`の場合、Cacheごとに権限を個別に設定していくことができるみたい。

![スクリーンショット 2024-11-26 4.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/8be537bc-28e0-8a3f-6e4c-9695484a9a85.png)

### CLI

#### インストール

以下からCLIをダウンロードしてきます。
（MACの場合、Linuxの`apple`の名前がついているファイルです。）

https://github.com/momentohq/momento-cli/blob/main/README.ja.md

あとは一例ですが、以下のようなコマンドで利用できるようにしました。

```console
% mkdir -p ~/bin
% cp momento ~/bin/
% chmod +x ~/bin/momento
% echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc
% moment -version
momento 0.46.0
```
#### 設定

`momento configure`でToken等の初期設定をします。

なお、Token=APIキーです。

```console
% momento configure
Please paste your Momento auth token.  (If you do not have an auth token, use `momento account` to generate one.)
Windows users: if CTRL-V does not work, try right-click or SHIFT-INSERT to paste.

Token [****]: hogehoge==
Default Cache [default-cache]: 
Default Ttl Seconds [600]: 
default-cache successfully created as the default with default TTL of 600s
```

#### キャッシュ操作

以下のような操作をしています。
直感的でわかりやすいですし、特にレイテンシを感じたりすることもありません。

1. `demo-cache`という名前のキャッシュをつくる
1. キー`key1`に値`hohoge`を登録(TTLは100秒)
1. キー`key1`の値をとってくる

```console
% momento cache create demo-cache
% momento cache set key1 hogehoge --ttl 100 --cache demo-cache
% momento cache get key1 --cache demo-cache
% hogehoge
```

## 最後に。

今回はここまでにします。

次回、SDKをTypeScriptで触ってみる記事を書いてみます！
【Ruby】コードから学ぶ Dir.glob の使い方

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回はコードを通してDir.globについてまとめていきたいと思います。

たのしいRubyという教材で現在`Dir`クラスについて勉強しているのですが、前回書いた再帰呼び出しを使わないでディレクトリ探索ができるコードがあったので、`Dir.glob`の説明と合わせてそれについても触れていきたいと思います。

# `Dir.glob` とは？
`Dir.glob` は、指定したパターンに一致するファイルやディレクトリを効率よく取得できるRubyのメソッドです。以下のように簡単に使えます

```ruby
Dir.glob("*.rb")
# カレントディレクトリ内のすべての Ruby ファイルを取得
```
取得結果は 配列 で返されるため、結果を手軽に操作できます。また、ブロックを渡すと1件ずつ順次処理できる点も特徴です。

## パターン指定の柔軟性について
`Dir.glob` の最大の魅力は、柔軟なパターン指定が可能な点です。以下に代表的な例を挙げます。


| 　パターン　　| 説明                                                          |
|:-------------|:---------------------------------------------------------------|
| `"*"`        |カレントディレクトリ内のすべてのファイルやディレクトリを取得        |
|  `"*.rb"`    |  `.rb` 拡張子を持つファイルを取得                                 |
|`"*.{rb,py}"` | 	`.rb` または `.py` 拡張子を持つファイルを取得                       |	
|`["*.rb", "*.py"]` |`.rb` と `.py` 拡張子を持つファイルを両方取得                      |	
|  `"**/*" `   |サブディレクトリを含むすべてのファイルを再帰的に取得                |  
| `"**/.*" `   |	サブディレクトリを含む隠しファイル（`.` から始まるファイル）を取得   |  

詳細はリファレンスマニュアルをご覧ください

https://docs.ruby-lang.org/ja/3.3/class/Dir.html#S_--5B--5D

また、`Dir.glob` のパターン指定は「ワイルドカード」を用いますが、正規表現とは異なります。以下の点が特に重要です。
* ワイルドカードの `*`
任意の文字列にマッチします。また、単独で使うと カレントディレクトリ を意味します。

* 正規表現の `*`
直前の部分式を 0回以上繰り返す という特定の条件を意味します。

# 再帰呼び出しコードとの比較
今回は前回の記事で書いた再帰呼び出しのコードと、Dir.globを使用した例でディレクトリ探索のコードを見ていこうと思います
また、以下のコードは前回の記事でよりすっきりとしたコードの提案をいただいたのでそちらを使用しております
```ruby
def traverse(path)
  if File.directory?(path)
    Dir.each_child(path) do |entry|
      path2 = File.join(path, entry)
      traverse(path2)
    end
  else
    process_file(path)
  end
end
traverse(ARGV[0])

```
特徴は以下の通りです
* サブディレクトリを再帰的に探索
再帰呼び出しにより、サブディレクトリ内のファイルも処理します。

* . や .. を自動的にスキップ
`Dir.each_child` は、カレントディレクトリ（`.`）や親ディレクトリ（`..`）をスキップするため、それらの条件を手動で記述する必要がありません。

* 隠しファイルも探索対象
隠しファイル（例:` .gitignore` や `.env`）も通常のエントリとして処理されます。


# Dir.glob を使ったディレクトリ探索
次に、Dir.glob を使用したコードを見てみましょう。
```ruby
def traverse(path)
    Dir.glob(["#{path}/**/*", "#{path}/**/.*"]) do |name|
        unless File.directory?(name)
            process_file(name)
        end
    end
end

def process_file(path)
    puts path
end

traverse(ARGV[0])
```
コードの特徴は以下の通りです
* 再帰処理を明示的に記述する必要がありません。
* `**/*` で通常のファイル、`**/.*` で隠しファイルを一括取得。
* 結果をブロックで処理することで、メモリ効率を向上。

## Dir.glob を学んだポイント
私は、このコードを通じて Dir.glob の便利さを実感しました。

* シンプルな記述で再帰探索が可能
再帰呼び出しを自分で記述する必要がなく、`Dir.glob` だけでサブディレクトリも含めた探索が実現できます。

* 隠しファイルへの対応が容易
再帰処理コードでは、`"."` や `".."` をスキップする明示的な記述が必要でしたが、`Dir.glob` では `**/.*` を追加するだけで簡単に対応できます。

* メモリ効率の向上
配列で結果を取得する方法ではなく、ブロックを使用して順次処理することで、大量のファイルを扱う際のメモリ消費を抑えることができます。

# まとめ
今回の記事では、再帰呼び出しコードと `Dir.glob` を使ったコードを比較しながら、その違いや使い方について解説しました。

再帰呼び出しコードは、ディレクトリ探索のロジックを深く理解する良い練習になります。
一方、`Dir.glob` を使うと、柔軟で簡潔なコードを実現できます。
それぞれの特徴を抑えて、適切な場面でコードを使い分けれるようにこれからも多用の視点を持って勉強に臨みたいと思います
2024/11/26主にITとかセキュリティの記事

病院サイバー攻撃の脅威を考察!最新被害例と守るべきポイント
https://cybersecurity-park.com/3577/

重要インフラ業者がサイバー攻撃対策検討する会議　愛知(11/23)
https://www3.nhk.or.jp/tokai-news/20241123/3000038587.html

森永製菓がなりすましメールの注意喚起(11/24)
https://rocket-boys.co.jp/10782/

米国 国防総省 サイバーセキュリティ成熟度モデル認証プログラムの最終規則 (2024.10.15)(11/24)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-77e276.html

政府の「能動的サイバー防御」、第三者機関から事前承認得れば外国と国内間の通信監視可能に(11/24)
https://news.yahoo.co.jp/articles/9f29d614284307b1b342b13aee8301cdaf36540d

Amazon CloudFront VPC オリジンの紹介: アプリケーションのセキュリティ強化と運用の合理化(11/24)
https://aws.amazon.com/jp/blogs/news/introducing-amazon-cloudfront-vpc-origins-enhanced-security-and-streamlined-operations-for-your-applications/

欧州 改正製造物責任指令、官報に掲載 (2024.11.18)(11/24)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/11/post-221892.html

量子的脅威: カルダノの革新はブロックチェーンを未来から守れるか?(11/23)
https://bitperfect.pe/ja/%E9%87%8F%E5%AD%90%E7%9A%84%E8%84%85%E5%A8%81-%E3%82%AB%E3%83%AB%E3%83%80%E3%83%8E%E3%81%AE%E9%9D%A9%E6%96%B0%E3%81%AF%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%92/

アルトコインは金融の未来か？意外な利点を明らかにする(11/24)
https://bitperfect.pe/ja/%E3%82%A2%E3%83%AB%E3%83%88%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%AF%E9%87%91%E8%9E%8D%E3%81%AE%E6%9C%AA%E6%9D%A5%E3%81%8B%EF%BC%9F%E6%84%8F%E5%A4%96%E3%81%AA%E5%88%A9%E7%82%B9%E3%82%92%E6%98%8E%E3%82%89/

子どものネット利用は一日4時間57分！「ペアレンタルコントロール」で何ができるのか or できないのか、活用ポイントをチェック(11/24)
https://hugkum.sho.jp/628368

ロシアのサイバー攻撃、過小評価すべきでない 英主要閣僚(11/24)
https://www.afpbb.com/articles/-/3550486?cx_part=topstory

【分野別】エンジニア1年目の自分に読んでほしい書籍(11/24)
https://qiita.com/KNR109/items/928c4ee4a5454df91d28

情報セキュリティ3要素とは？追加の4要素も含めてわかりやすく解説(11/23)
https://smbiz.asahi.com/article/15501705

10万人超の個人情報に不正アクセス　サイバー攻撃でデータ管理不備が露呈 ヒロケイ(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/112000168/

SD-WAN(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/111800034/

ニデック系海外法人で情報　流出ダークWebで5万件超が暴露(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/111800069/

生保DXの息吹、住友生命が組み込み型保険に参入　
本丸のビジネスモデル変革は手つかず(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nft/21/040100002/112000050/

セキュリティー投資は売上高の「0.5％」を目指せ、ただし投資しすぎても無意味(11/25)
https://xtech.nikkei.com/atcl/nxt/column/18/03009/111900002/

LangChain(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/111900182/

個人情報漏洩の先に「闇バイト」　犯罪多発で問われる企業の責任(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/111500179/

TOPPAN HDに栄冠　前倒しで基幹モダナイ
IT Japan Award 2024(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/111900191/
【C++】クラステンプレートのファイル分割方法 (Visual Studio 2022)

# はじめに
たとえばこういうクラステンプレートのコードがあるとします。


TestClass.h
```cpp
#pragma once
#include <iostream>

template <typename T>
class TestClass
{
public:
    TestClass(T num) : Num(num) {}

public:
    T SayNum() const
    {
        std::cout << "Num: " << Num << std::endl;
        return Num;
    }

private:
    T Num;
};
```

main.cpp
```cpp
#include "TestClass.h"

int main(void)
{
	TestClass<int> intTest(10);
	intTest.SayNum();

	return 0;
}
```

出力
```
Num: 10
```
正常に動作しました。
これをいつものように.hに.cppにファイル分割してみようと思いますが、


TestClass.h
```cpp
#pragma once

template <typename T>
class TestClass
{
public:
    TestClass(T num);

public:
    T SayNum() const;

private:
    T Num;
};
```

TestClass.cpp
```cpp
#include <iostream>
#include "TestClass.h"

template <typename T>
TestClass<T>::TestClass(T num) : Num(num) {}

template <typename T>
T TestClass<T>::SayNum() const
{
    std::cout << "Num: " << Num << std::endl;
    return Num;
}
```

main.cpp
```cpp
#include "TestClass.h"

int main(void)
{
    TestClass<int> intTest(10);
    intTest.SayNum();

    return 0;
}
```

どうなるのか、実行してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920837/030c96c9-17ea-cf1a-8bbc-22240b2e230c.png)

どのファイルにもエラーが出ていませんが、未解決の外部シンボルエラーが出ました。

テンプレートの特性上、コンパイル時にインスタンス化されます。
TestClass<int>が使用されるときにSayNumの実装が必要ですが、cppに実装部があるだけではリンク時に解決できないためリンクエラーが発生してしまうということですね。

更に詳細なことは割愛するとして、常に.hの中に書くわけにはいかないですよね。
プロジェクトが巨大化すればするほどコードの可読性が下がりかねません。

ではどのように分割すればよいのか、
私が普段行っているファイル分割の方法を説明します。

# ファイル分割方法

TestClass.h
```cpp
#pragma once

template <typename T>
class TestClass
{
public:
    TestClass(T num);

public:
    T SayNum() const;

private:
    T Num;
};

#include "TestClass.tpp" // TestClass.hppでも可
```

TestClass.tpp (TestClass.hpp)
```cpp
#include <iostream

template<typename T>
TestClass<T>::TestClass(T num) : Num(num)
{
}

template <typename T>
T TestClass<T>::SayNum() const
{
    std::cout << "Num: " << Num << std::endl;
    return Num;
}
```

main.cpp
```cpp
#include "TestClass.h"

int main(void)
{
	TestClass<int> intTest(10);
	intTest.SayNum();

	return 0;
}
```

.hの最後に実装部分をincludeします。
この方法が一番わかりやすくて自分はよく使います。

注意点は.cppとした後に.hppや.tppとすると、このようにC/C++コンパイラとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920837/64d5302f-7648-1fc6-2473-427f2b277342.png)

なのでここを、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920837/5a63d9e7-55bd-ad2c-b6bc-f3d5274f8453.png)
とする必要があります。


# さいごに

明示的に.cppの後ろに`template class TestClass<int>;`とやる方法などがありますが、
汎用性が下がり、テンプレートじゃなくていいじゃんとなるのでおススメしません。
デスクトップにダウンロードしたファイルの読み込みと出力の仕方

コマンドライン引数を用いて選択したファイルを開けるようにした。ようやく理解できたので忘備録を書いていこうと思う。

まず基本的なプログラムの書き方については省略。今回一番大事なのはargcとargv[]の使い方とそれぞれのもつ意味を理解することだと思った。

argcはプログラム名を含むすべての引数の数としてカウントされる
例えばコマンドライン./a.out 100 abcと記述するとargcは３になる。これは
argv[0]=./a.out
argv[1]=100
argv[2]=abc
の３つに分けるからだ。

私はコマンドラインに下記のように打ち込み、
chcp 65001 > nul && booksystem %USERPROFILE%\Downloads\books_large.txt
次のようなプログラムを書き、確かめた。
printf("argc=%d\n",argc);	
for(int i=0;i<argc;i++){
	printf("argv[%d]=%s\n",i,argv[i]);
}

//出力結果
argc=2
argv[0]=booksystem
argv[1]=C:\Users\tanag\Downloads\books_large.txt

filename(ファイル名)を表しているのはargv[1]であり、argv[0]はソリューション？の名前を表している？と思った。ファイル名を入れるためにここでif(argc > 1)と書かなくてはならないかなああ
【超基礎】TypeScript変数のスコープについて

## 前提
この記事は、初学者の私が、サバイバルTypeScriptで学んだこと+調べたことをまとめたものになります。

従って、経験則に基づいた発言ではないため、一部慣習とは違っていたり、認知にずれがあったりする可能性がありますので、ぜひコメントで指摘していただけると幸いです。

https://typescriptbook.jp/

## スコープとは？
- ある変数を使うことができる範囲を指す
- 大きく分けて**グローバルスコープ**と**ローカルスコープ**に分けることができる
- それぞれ**グローバル変数**、**ローカル変数**と呼ばれる

https://www.ntt-west.co.jp/business/glossary/words-00064.html

## グローバルスコープについて
- **プログラムのどこからでも参照できる**変数
- ブラウザでは`window`オブジェクトがグローバルスコープのオブジェクトとなり、`console`や`Date`などを提供している
- **意図しない影響を受けるリスクがある**
::: note warn
JSでは変数宣言の際、`let`か`const`を付けないとグローバル変数になるため注意が必要。

TSではエラーになる
:::

```typescript
const a:number = 10;//グローバル変数の宣言

function func(){
    console.log(a);
}

func() //=>10
console.log(a); //=>10
```

## ローカルスコープについて
- **ある一定の範囲内で参照できる**変数
- 基本的に`{}`の中で宣言されたものは`{}`の中で有効となる
- **グローバル変数と名前が競合した場合、ローカル変数が優先される**
### 関数スコープ
- 関数の中でのみ参照できる変数
```Typescript
//関数外からのアクセスはエラーになる
function func(){
    const a:number = 10;
    console.log(a);
}
func() //=>10
console.log(a) //=>Error
```
```Typescript
//ローカルスコープ内ではローカル変数が優先される
const a: number=20;

function func(){
    const a:number = 10;
    console.log(a);
}

func() //=>10
console.log(a) //=>20
```
### レキシカルスコープ
- **関数呼び出しの前**で宣言された、**関数スコープの外**の変数は**関数スコープの中**で扱うことができる

- 安全なグローバル変数の様な振る舞いをする
```Typescript:前
function main() {    
    function func() {
        console.log(a);
    }    
    //関数呼び出しの前で宣言
    let a: number = 10;
    func();// => 10     
}
```
```Typescript:後
function main() {    
    function func() {
        console.log(a);
    }    
    //関数呼び出しの後で宣言    
    func();// => undefined
    let a: number = 10;
}
```
### ブロックスコープ
- `{}`で囲まれた範囲でのみ有効となる
- 関数やif文じゃない、素の`{}`内でも有効
```typescript
{    
    let a: number = 10;
    console.log(a); // => 10
}
console.log(a)// => Error
```
## まとめ
以上になります。実装の練習をしていた時何でもかんでもグローバル変数にしていた過去の自分をぶんなぐってやりたいですね！！


当方初学者なため、認知のずれや、モダンな開発現場ではもう使わない表現などがありましたらコメントで指摘していただけると幸いです。😸
競プロ日記#24/11/25

# A問題 - Shift
(https://atcoder.jp/contests/abc278/tasks/abc278_a)
標準入力したKに足してloopをするがその中でさらにN-1回（N回目は最後尾に0を入れるため不要）loopして
`int i = 1; i <= N - 1; i++`に対して
`A[i] = A[i + 1];`
とすることでN-1回左方向にずらしていける。最後に`A[N] = 0`
AWS Inspectorの概要と参考資料まとめ

AWS Inspectorについて、概要をキャッチアップするための資料をまとめました。

## 概要を掴む資料
### AWS Black Belt Online Seminar (2016年)
2016年時のAWS Black Belt Online Seminarでの紹介資料。2021年にアップデートがあり、こちらの資料で紹介されているものは2024年現在ではInspector Classicと名称変更されています。
古いとはいえ、セキュリティリスクは脅威x脆弱性x情報資産であるとか城攻めに例えるとどうかとか、図解とともにわかりやすく書かれています。

Inspector Classicでは、EC2とECRに対してスキャンが可能で、EC2を評価ターゲットに含めるにはEC2インスタンスにタグ付けをする必要がありました。
*現在はリージョン単位で、Agent-based scanning（SSMエージェント必要）かAgentless scanning（SSMエージェント不要、EBSスナップショット必要）でソフトウェアインベントリを収集してスキャンが可能で、ECRとLambdaもスキャン対象に含まれています。
https://pages.awscloud.com/rs/112-TZM-766/images/20160622_AWS_BlackBelt-Inspector-public.pdf

### AWS Black Belt Online Seminar (2023年)
アップデートされたもの。
下記で紹介するAWS公式のYoutubeチャンネルの動画を見ながら読むと相乗効果があり理解しやすいと思います。

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AmazonInspector_0228_v1.pdf

## 使い方を学ぶ
### AWS公式のAWS Inspectorのデモ動画
AWS公式のYoutubeチャンネルで紹介されている、AWS Inspectorのデモ動画。
実際のマネコン画面を映してダッシュボードや各機能の紹介をしてくれます。
https://www.youtube.com/watch?v=Nx8s7lwapoE&amp;t=96s&amp;ab_channel=AmazonWebServices

### AWS公式ドキュメント
上記を経て読むと、草津温泉の湯の如く、染み渡っていきます。

https://docs.aws.amazon.com/inspector/latest/user/getting_started.html


## さいごに
存在するすべての脆弱性に対処しなければならないわけではなく、リスクよりも自身の環境への影響度がそもそも大事であったりします。
例えば米国CISAが提供するKnown Exploited Vulnerabilities Catalogを参照して実際に悪用されたことが確認された脆弱性であるかも運用においては重要だと思います。

とはいえ、影響度がないからと放置していれば、自身の環境の変化に伴う形で影響度が高くなれば対処する必要があり、常日頃から発見と予防の措置をしておく必要があります。
その手段の一つとしてAWS Inspectorを利用するとよさそうです。
【JavaScript】変数　参照&コピー(プリミティブ値とオブジェクトの挙動)について

変数を参照&コピーした際の「"プリミティブ値"と"オブジェクト"の挙動」についての備忘録です。

基礎的な内容ではありますが、初心に帰ってまとめていく。
<br>

# 1: 参照とコピーに入る前に。
<br>
■プリミティブやオブジェクトなどの「データ型」について。

・変数は「データ型」という8種類のデータを持っている。
・その8種類のデータ型もJavaScriptでは2つに分けられる。それが【プリミティブ型とオブジェクト】の2つ。

⬇

①プリミティブ型(7種類)
・真偽値(Boolean)、数値(Number)、文字列(String)、undefind(Undefind)、null(Null)、シンボル(Symbol)、BigInt(BigInt)

②オブジェクト(1種類)
・Object(プリミティブ型以外の全て)
オブジェクトというのは「プロパティとその値を次いで格納する入れ物」

<br>

■プリミティブ型とオブジェクトの図
| プリミティブ型 | オブジェクト |
|:-:|:-:|
|String / Null<br>Number / Symbol<br>Boolean / BigInt<br>Undefind|Object(プリミティブ型以外の全て)|

<br>
<br>

■参照とコピーについて(概念)

・参照
「変数などの値や、オブジェクトのプロパティ」を参照すること。
```javascript: 参照
let a = 'hello'; //変数aは「'hello'」を参照している。

let c = {
  prop: 'hello' //変数cは「オブジェクト{}」と「プロパティ&値prop: 'hello'」を参照している。
};

```

・コピー
変数aから変数bにコピーすること。
```javascript: コピー
let a = 'hello';
b = a; //変数bは「変数aの値'hello'をコピー」している。
```

<br>
<br>

#  1: 「プリミティブ値」のコピー
■プリミティブ値のコピー
・プリミティブ値をコピーすると「コピー元とコピー先の値は変更される。」
これはコピーすると「メモリ空間(プログラミングの記憶装置)」のようなものに値が保管され、その値を各自管理しておくためのもの。
下記の例で言うとlet aは'hello'を参照している。その変数aを変数bにコピーすると「プリミティブ値'hello'は新しいメモリ空間に新しくコピーされ、変数bが参照している'hello'は全くの別物となる。」

その後「変数bに新しいプリミティブ値'bye'」を代入すると【変数bの参照先は'bye'に変更されます。】

```javascript: プリミティブ値のコピー
let a = 'hello';
let b = a; //ここで変数aをコピー。

b = 'bye'; //この時の変数bの参照先は「新しい値'bye'」です
```


<br>







# 2: 「オブジェクト」のコピー
■オブジェクトのコピーは「変数の参照先」だけをコピーする。
⬇︎
変数bにコピーするとどうなるか？
・変数bは「変数aが保持しているオブジェクトへの参照だけをコピー」します。
変数aのプロパティpropと、値'hello'を共有します。
これは、変数bの参照が保持している値は【変数aのオブジェクトへの実態】なので、コピーされた後も「変数aのプロパティpropと、値'hello'」を共有します」。
⬇︎
・__そして「変数bのプロパティpropに新しい値として'bye'」を入れると【変数aのprop参照先も'bye'に変更】されます。__ 

<br>

```javascript:オブジェクトのコピー

let a = {
  prop: 'hello' //変数aは「オブジェクト{}」と「プロパティ&値prop: 'hello'」を参照している。
};

let b = a; //変数aが保持しているオブジェクトへの参照だけをコピー。

b.prop = 'bye'; //b.propに新しい値'bye'を入れると「変数aのprop参照先も'bye'に変更される。」

```
⬇︎
__■上記を図解__

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338535/7a65d0be-6b66-07e9-7032-4b3299d6dad8.png)










# 3: まとめ
・プリミティブ値のコピー
「参照先の値」がコピーされる。

・オブジェクトのコピー
「オブジェクトへの参照」がコピーされる。

<br>

「初歩的な参照とコピーをうっかり間違えてしまった！」なんてことがあると思いまとめてみました。（何を学ぶにしてもこのような感じでメモしておくと良いですね…）
以上、参照&コピーの備忘録でした。
Arch Linuxをインストーラーでインストールしよう（archinstall）

以前、Arch Linuxを手動でインストールする記事を書きましたが、やはり実用的ではないので今回はarchinstallというスクリプトを使ってインストールしていきたいと思います。

カスタマイズ性の高さ、最小限のパッケージ（CalamaresやUbiquity不要）という点でArch Linuxの良さを活かしつつ、CLI上で簡単に（？）インストールすることができます。

# USBの作成
[前回の記事](https://qiita.com/undercover/items/bd0a590d07af5dbf4b92)を見てください

# 起動、Wi-Fiの設定
Wi-Fi接続をします。デスクトップの場合はLANケーブルを繋げば特にやることはありません。
```
iwctl
```
以下を入力します。
```
device list
```
ここで表示された無線LANデバイス名をdeviceNameとします。
```
station deviceName scan
station deviceName get-networks
```
ここで表示されたアクセスポイントの名前をWifiNameとします。
```
station deviceName connect WifiName
```
exitでiwctlから抜けます。
これでWi-Fiの設定は終わりです。ネットに繋がっているかpingで確認しましょう。
```
ping google.com
```
（PingはControl+Cで終了）

#### TIPS:Macbook等でWi-Fiが繋がらないときの対処法
一旦有線でArch Linuxを導入した後、AURからb43-firmwareパッケージをインストールしてください。

# archinstall
まずarchinstallを最新版にしましょう。（古いバージョンはdodgyです）
```
pacman -Syu
pacman -S archinstall
```
archinstallを実行します。
```
archinstall
```

解説が必要な項目のみ解説します。

・locale
　en_USにしておきましょう、文字化け対策
　ローカライゼーションは後で手動でやる必要があります。

・Disk Config
　Disk Configは自動設定で十分です。
　（古いバージョンだと少しくせのあるセッティングだった？らしい）
　もしディスクに既存のデータが有る場合、予めデータ消去しておいたほうが良いかもしれません。（[前回の記事](https://qiita.com/undercover/items/bd0a590d07af5dbf4b92)参照）
 
 ・Profile
 　デスクトップ環境無し（Minimal）でインストールして、後からXfceとi3wmを追加しましょう
  ちなみに、エディタが入ってなかったのでこれも後で手動で入れる必要があります。

・一般ユーザーの作成
　一般ユーザーの作成は少し挙動が謎だったので、後で手動で作成すると良いです。

特筆すべき項目はこの程度でしょう。素晴らしきarchinstall！

# 設定
  [前回の記事](https://qiita.com/undercover/items/bd0a590d07af5dbf4b92)の「起動とログイン」以下の項目と、「ローカライゼーション」の項目を実行します。

# おわり
らくだね！
【ChatGPT】自作システムの基本設計①

# はじめ
プログラマー1年生、@shika_ksです。
前回に引き続き、システムを作成すべくChatGPTに力を貸してもらいました。
要件定義ができたので、今回は基本設計に挑戦します。

# 基本設計について
基本設計をChatGPTに細分化させると、以下の項目に分けられました。
1. 機能要件
1. 非機能要件
1. 業務フロー図
1. データフロー図
1. 入出力関連図
1. 画面設計図
1. インターフェース設計図

今回の基本設計①では、機能要件・非機能要件をまとめました。

# 機能要件について
要件定義を読み込んだChatGPTに必要な機能を聞いたところ、以下の返答がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3855287/9fb61842-a4ba-4df7-1b02-148587c8ee99.png)

# 非機能要件について
同じように要件定義を読み込んだChatGPTに必要な非機能を聞いたところ、以下の返答がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3855287/635eea85-bb03-5161-9149-34cc5cf1eb37.png)

# 感想
事前に自身で構想していた機能、非機能を9割ほど網羅していました。
恐るべきAIです。
非機能要件については、IPAが提唱している6つの観点すべてが当てはまっているといった精度の高さです。
また、不足な部分がありましたらコメントいただけると幸いです。


次回は、業務フロー図とデータフロー図を作成していきたいと思います。
fabric.js による多角形の描画をChatGPT 4o with canvas で作成

ChatGPT 4o with canvas ベータ版を使って、fabric.js による多角形の描画を作成してみます。

# 概要

ちょっとさわった感じだと ChatGPT 4o with canvas ベータ版は、ChatGPT 4o よりもコード作成がしやすく、コードの変更内容もわかりやすい。
fabric.js による多角形の描画するコードを作成してみました。

作成した「Fabric.js Polygon Drawer」

- 初期バージョン
![2024-11-25_23h37_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f51b4bbb-95da-da6b-cae8-b1705cba6c18.png)

- いくつか変更したバージョン
![2024-11-25_23h38_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9771a4c8-64fe-94b2-b5db-bb090b06aa92.png)

# ChatGPT 4o with canvas の画面

指定に応じて、コードが右側に表示されます。
かなりラフな指示でもコードを作成してくれました。

![2024-11-25_23h37_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ce15c9c4-4941-5ef3-8cd3-5aa664fed2b3.png)

# コードの変更内容

コードの変更箇所を表示できます。

![2024-11-25_23h49_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/15bbdab2-ff8c-80af-dd27-f0837b35c1e2.png)

# 作成したコード

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Fabric.js Polygon Drawer</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.2.4/fabric.min.js"></script>
    <style>
        canvas {
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <h2>多角形を描く (3〜100角形)</h2>
    <label for="sides">角の数:</label>
    <input type="number" id="sides" min="3" max="100" value="6">
    <label for="bgColor">図形の背景色:</label>
    <input type="color" id="bgColor" value="#ffa500">
    <button onclick="drawPolygon()">描画</button>
    <canvas id="canvas" width="600" height="400"></canvas>

    <script>
        const canvas = new fabric.Canvas('canvas');

        function drawPolygon() {
            const sides = parseInt(document.getElementById('sides').value);
            if (sides < 3 || sides > 100) {
                alert('角の数は3から100までです');
                return;
            }

            const bgColor = document.getElementById('bgColor').value;

            const radius = 100;
            const centerX = canvas.getWidth() / 2;
            const centerY = canvas.getHeight() / 2;
            const points = [];

            for (let i = 0; i < sides; i++) {
                const angle = (i * 2 * Math.PI) / sides;
                const x = centerX + radius * Math.cos(angle);
                const y = centerY + radius * Math.sin(angle);
                points.push({ x, y });
            }

            const polygon = new fabric.Polygon(points, {
                left: centerX - radius,
                top: centerY - radius,
                fill: bgColor,
                stroke: 'blue',
                strokeWidth: 2,
                selectable: true
            });

            canvas.clear();
            canvas.add(polygon);
        }
    </script>
</body>
</html>
```

# 感想

ベータ版ということですが、なかなか使いやすくいい感じです。
ChatGPT 4o だとコードの応答が遅く感じますが、かなり改善されていると思います。
TypeScript入門①環境構築～コンパイルまで

# 環境構築
このコマンドを実行。
```
npm install -g typescript
```
なのだが、
しかし当然、npmをインストールしていないので、インストールする必要がある。
そしてそれをインストールするには、Nodeをインストールする必要あり。
さらにそのNodeをインストールするにはnvmがあるとすごく楽。（これに関しては無くてもOK。）
てなわけで、まずはnvmからインストールしよう！
昔やった記事からどうぞ。
macのが全然簡単にできます。

https://qiita.com/gato_qiita/items/54e2d589cd60826c1f63


ちなみに-gのオプションはグローバルの意。
どこからコマンドたたいてもtypescriptを使えるような場所にインストールをする。

# コンパイル
```typescript
tsc main.ts //ここはコンパイルしたいファイル名
```
これを行うことで、javascriptのファイルを生成する。
つまり、TypeScriptとは、結局のところJavaScriptである。
Javascriptを一旦難しく書いてるんだな～と思えばよい。


## 複数ファイルを一つのファイルにコンパイル
```typescript
tsc main.ts sub.ts --outfile main.js // main.jsにまとめる
```

## 変更があったら自動的にコンパイル
```typescript
tsc main.js --watch
```

# ES～ってなんだ？
JavaScriptの言語仕様のこと。
言語仕様とは、例えば
変数はこういう風に定義しますとか
｛｝はこんな意味を持ちますとか
制御構文はこう書きます
みたいな、JS側で決めたルールのこと。
それが定期的に変更がある。
そのバージョンがES〇〇の○○に入る。

ES5より前と、今では書き方が全く違く、
基本的にはES６以降を学んでいくのが良い。
使い勝手や書きやすさなども良くなっているし、
何より今後使われていくのはES6以降なのは間違いないので、
自分の技術資産的な観点で見ても、それが良い。
【Git】変更を一時的に退避する方法

`git stash`を使用すると変更を一時的に退避できます。

https://git-scm.com/docs/git-stash

## 変更をスタッシュする

作業中の変更を一時退避するには、以下のコマンドを実行します。

```terminal
git stash
```

これにより、現在の変更が一時退避され、作業ディレクトリがクリーンな状態に戻ります。

## スタッシュの一覧を表示する

スタッシュした変更の一覧を表示するには、次のコマンドを使用します。

```terminal
git stash list
```

これにより、スタッシュされた変更のリストが表示されます。各スタッシュには、`stash@{0}`、`stash@{1}`のような識別子が付与されます。

## スタッシュを適用する

スタッシュした変更を再適用するには、以下のコマンドを使用します。

```bash
git stash apply
```

特定のスタッシュを適用したい場合は、識別子を指定します。

```bash
git stash apply stash@{0}
```
弾幕STGを作りたいっていう話

# はじめまして
初めましてうちゅういかと言います。

C++を最近いじり始めてオセロとか作ってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3874473/6b65cf4c-ee05-1ca2-da4e-36148fa01772.png)


今回前からやりたかったゲーム開発を本格的にやりたいなと思ったので日記的な感じで記事を書いていきたいと思います。

# 作りたいもの
考えとしては東方みたいなシューティングゲームを目指して進めていこうと思います。

### 開発に使用するもの
言語はC++
ライブラリはSDL各種ライブラリ
OpenGLも活用してみたい

### 参考にするもの
###### 龍神録プログラミングの館1と2

https://dixq.net/rp/

https://dixq.net/rp2/

C++で弾幕シューティングを作るときに参考にするサイトといえばこのサイトらしい

###### ゲームプログラミングC++

https://www.shoeisha.co.jp/book/detail/9784798157610

ゲーム内での基本的な処理はこの本に書かれているアルゴリズムをもとにしようと考えています

###### ゲームエンジンアーキテクチャ 第三版

https://www.borndigital.co.jp/book/19115/

ゲームでの並列プログラミング、ファイルシステム、メモリ管理などマニアックなことがいっぱい書いてあって面白い。
けど今んところ全く理解できないので参考にできるかどうかは怪しい

# 最後に
プログラミングもゲーム開発も全くの初心者ですが、頑張っていくのでよかったら応援してください。

ｷｼﾞｶｸﾉｯﾃﾑｽﾞｶｼｲ
MarkdownAI を触ってみた

MarkdownAI を使ってみようということで実際に触ってみました。
こう新しいサービスが出たら触ってみないとですね。
この記事も MarkdownAI で書いています。

Qiita のキャンペーン投稿に合わせて書いています。
[Markdown AIを使った記事を投稿しよう！ - Qiita](https://qiita.com/official-events/6914e7e898953881ef94)

https://mdown.ai/content/03efb954-6fd7-4e56-ae8d-ff4078244ea2

更新がほぼリアルタイムで素晴らしいですね…

## 最初の印象

すごくシンプルに作ってあるなぁと思いました。
自動保存が有効にできるので、自動保存はまず有効にしてみました。
結構頻繁に保存されるので安心感がありますね（いつも保存し忘れて大変なことになるので）

## いろいろ触ってみる
### Insert を触ってみる

次の2つの機能があるようです。ファイルアップロードと、AIに対してスクリプトを実行する？ 物のようです。

- Inserts an image. Images can also be inserted from the image list.
- Insert a sample script that uses Server AI.

AI を実行してみたいですね。

### ロボットみたいなボタン

Model を作る画面に行きます。
あらかじめプロンプトに仕込んでおく文字列と、モデルが回答するときに参照するデータ（Markdown, PDF, link, テキスト）などが選択できそうでした。

昔登壇したスライドでも入れてみていろいろ聞いてみたいと思います。
使ったスライドは下記。

[Discordに流すWebhookを見れる形で流してみる（Chalice + AWS Lambda + Python） - Speaker Deck](https://speakerdeck.com/yumechi/discordniliu-suwebhookwojian-reruxing-deliu-sitemiru-chalice-plus-aws-lambda-plus-python)

これでスライドの中身の受け答えができると楽しそうなのですが…
なぜか PDF をアップしたあと backgroud や Insert から AI を追加してみても反応がなく、うまくいかないので試すのはここで止まっています。

ChatGPTのAPI KEYも登録してみましたがうまくいかず断念です。
時間帯が悪い説もあるので、そのうちリベンジしてみたい。

## 考察

上記PDFデータはLTの時に使ったものであんまり情報量的にもキーワードくらいしか抑えられていないので、そういう意味で投入データには向いていなかったかもしれません。
とはいえ Error Occurred みたいな表示以外が欲しいと思ってしまうのですが…。

また自分自身の経験をもとにいろいろ作ったデータとかを用意して、あれこれが面白かった！みたいなものをまとめて学習させると楽しいのかもと思いました。
例えば旅行記みたいなものを念入りに作っておくとか、自分のプロフィールなどを充実させておいて受け答えさせるとか。
既にありそうなアイディアもいくつかありますが、自分自身にしか語りえないものとか、自分AIならどう考えるのかとかに興味があるので、そういうデータを入力してみてみるみたいなのができると楽しいのかなと考えていました。

そしてそういう学習データを普段から自分で作っておけばよかったのかも… とかも考えるきっかけとなりました。
リンクとかも試してみたかったのですが、適当なコンテンツを思いつかなかったので断念しました。

## プラスボタン

新しい Markdown ページができました。
複数のページが作りたい場合はここから作ればよさそうです。
ただページの並び順がよくわからなかったので、いっぱい作る人は大変かも？ と思いました。

## view ボタン

表示プレビューができました。
そこから URL ボタンを押すと、 publish 設定もできるようです。
publish すると公開用ページができました。 公開したものを非公開設定もできました。

ほかの方も紹介されていますが HTML をコピーする機能もあります。

公開されたページを見て思ったのですがすごくシンプルな画面での公開になっていたので、少しものさみしさを感じました。
フルカスタマイズは大変なのでいくつかのテーマから選べると嬉しいかも、と思いました。

またURLもドメイン的に固定になってしまうので、そのままホスティングする分にはよさそうですが、自分のドメインで見せる場合は少し考える必要がありそうです。

## まとめ

ざっくりと使ってみましたが、Markdown で書いたものを気軽に公開できる、また学習データを使って何かしろのコンテンツがあればそれを素早く公開できる、という点が強みであるように思いました。
ドメインとなるデータだけあれば後はほかの AI に公開用の markdown だけ書かせて、Webですぐ使えるアイディアを形にするためのツールとしての未来があるように思いました。
私も機械学習分野についてはあまり詳しくなく、自分でドメイン知識を与えてということをやったことがなかったので、それを体験するよい機会にできそうな一方で、うまく動かさなかったので悔しく思います。

うまいこと使いこなせたらめちゃくちゃ楽しそうなので、使いこなしたいですね。
prisma-lint を使用し schema ファイルの記述を統一する


## はじめに

Prisma の schema ファイル。Prisma を触るうえでは切っても切り離せない重要なファイルです。
そんな Prisma の schema file の linter の紹介です。

prisma-lint を導入することで schema file の記述が統一され、ファイルに追記する私はもちろんレビュアーの負荷も下げることができました。(おそらく)

## `prisma-lint` のインストールと設定

### インストール

`npm` を使っている場合は下記コマンドを実行してください。
`yarn`, `pnpm` 等利用されている方は読み替えてください。

```sh
npm install --save-dev prisma-lint
```

### 設定ファイルの作成

`prisma-lint` の設定ファイルは `.prismalintrc.json` です。
`README.md` に記述例がありますが eslint (eslintrc format) に似ているため eslintrc のルールを記述したことがある方ならスムーズに用意できると思います。

```json
{
  "rules": {
    "field-name-mapping-snake-case": [
      "error",
      {
        "compoundWords": ["S3"]
      }
    ]
  }
}
```

prisma-lint に設定できるルールは、 [RULES.md](https://github.com/loop-payments/prisma-lint/blob/main/RULES.md) に記載されています。

### ルール例

prisma-lint にはいくつかルールが存在します。
よく使うものをピックアップして記述します。

#### フィールドの記述順を揃える、必須フィールドを定義場合

`"field-order` を定義しルールを `"order": ["id", "..."]` のように設定することで `id`, id 以外のカラム の順になるように制限することができます。
加えて `require-field-type` で必ず用意するカラム制限も追加することが可能です。

```json
{
  "rules": {
    "field-order": ["error", { "order": ["id", "..."] }],
    "require-field-type": [
      "error",
      {
        "require": [{ "ifName": "id", "type": "String" }]
      }
    ]
  }
}
```

#### その他 Rule

prisma-lint に設定できるルールは、 [RULES.md](https://github.com/loop-payments/prisma-lint/blob/main/RULES.md) に記載されているので適宜確認してください。

## Ref

https://github.com/loop-payments/prisma-lint

https://www.npmjs.com/package/prisma-lint