OmniAICreator/Qiita-1.07M huggingface dataset:
ちょっと深堀りTypeScript

# はじめにはっきりしておきたいこと
- 私のスタンス：型のある言語が大好き
- 関数を作るとき、まず型を書いて具体的なコーディングに入るタイプ

----
## TypeScriptとは
- TypeScriptは「型のあるJavaScript」
- 特に嬉しいのがnullやundefinedの悪影響が緩和されること

----
# JavaScriptの危ない例

```js
function firstElement(ary) {
  ...
}
```

配列の先頭要素を返す関数。配列の要素数が0の場合はどうなる？
→　例外がスローされる？それともnullが返る？それともundefined？

----
# TypeScriptによる改善

```ts
function firstElement<E>(ary: E[]): E {
  ...
}
```

この場合、要素数が0だと例外がスローされると推測できる。

----

```ts
function firstElement<E>(ary: E[]): E | undefined {
  ...
}
```

この書き方だと、要素数が0だとundefinedが返ると推測できる。

----
# 更に大事なこと！

```ts
function firstElement<E>(ary: E[]): E {
  if (ary.length === 0) {
    return undefined;
  } else {
    return ary[0];
  }
}
```

こう書くと**コンパイルエラーになります**！
→　関数の宣言ではundefinedを返すことになっていないのに、undefinedを返そうとしているから。

----
# JavaScriptの怖いところ
- 無意識にundefinedの可能性のあるコードを書いてしまうことは**非常に**よくあります。
  これを防げるだけでもTypeScriptを導入する価値があります。

----
# 他のありがたい機能
- interface：プロパティの名前と型を明示できる
  JSでプロパティの有無が原因でバグを仕込んでしまうのは**非常に**よくあります。

----
# TypeScriptの闇
- interfaceはありがたい一方、JSで便利に書いていたデータ操作がやりにくくなり、大きなストレスとなることがあります。
- そもそも**型にはストレスになりがちな要素が多く**あります。これは否定できないです。。。

----
# 最後に：TypeScriptを使い始めてみるなら
* nullやundefinedを厳密に扱ってみる
* interfaceを使ってみる

この２つだけでも、価値が高いと思います！
[cuDF]C++ libcudfのgithubを読み解く　～file_io_utilitiesとは～

[Perplexityによるまとめ](https://www.perplexity.ai/search/cudfnolibcudfnoread-csvnituite-wq.qmehhT1ujAn5KRmelrA)
[Perplexityによるfile_io_utilities解説](https://www.perplexity.ai/search/guan-shu-mei-nishuo-ming-site-xsIqO4RER5ybDefIK4Zg7g)


## **file_io_utilities.cpp**

### **`read_binary_file`**
この関数は、指定されたファイルパスからバイナリデータを読み込み、`std::vector<char>`として返します。ファイルが存在しない場合や読み込みに失敗した場合は例外をスローします。

### **`write_binary_file`**
この関数は、指定されたファイルパスにバイナリデータを書き込みます。データは`std::vector<char>`として渡され、ファイルに書き込まれます。書き込みに失敗した場合は例外をスローします。

## **arrow_io_source.cpp**

### **`arrow_io_source` クラス**
このクラスは、Apache Arrowの`io::RandomAccessFile`インターフェースを実装し、ランダムアクセスファイルの読み取り操作をサポートします。

#### **`arrow_io_source` コンストラクタ**
Arrowの`io::RandomAccessFile`を受け取り、内部メンバに保存します。

#### **`Read` メソッド**
指定されたバイト数を読み取り、バッファに格納します。読み取りに成功したバイト数を返します。

#### **`ReadAt` メソッド**
指定されたオフセットからバイト数を読み取り、バッファに格納します。読み取りに成功したバイト数を返します。

#### **`GetSize` メソッド**
ファイルのサイズを返します。

#### **`Seek` メソッド**
指定されたオフセットにファイルポインタを移動します。

## **column_buffer.cpp**

### **`column_buffer` クラス**
このクラスは、カラムデータをバッファとして管理するためのユーティリティを提供します。

#### **`column_buffer` コンストラクタ**
カラムのデータ型とサイズを受け取り、バッファを初期化します。

#### **`data` メソッド**
バッファのデータへのポインタを返します。

#### **`size` メソッド**
バッファのサイズを返します。

## **column_buffer_strings.cu**

### **`create_string_column`**
この関数は、文字列データから`cudf::column`を作成します。文字列データは`std::vector<std::string>`として渡され、`cudf::column`に変換されます。

### **`create_offsets`**
この関数は、文字列のオフセットを計算し、`std::vector<int>`として返します。各オフセットは文字列データの開始位置を示します。

## **parsing_utils.cuh**

### **`parse_value`**
この関数は、文字列から特定のデータ型に値をパースします。テンプレート関数として実装されており、異なるデータ型に対応しています。

### **`trim_whitespace`**
この関数は、文字列の前後の空白を取り除きます。入力文字列を受け取り、空白を取り除いた新しい文字列を返します。

### **`split_string`**
この関数は、指定されたデリミタで文字列を分割し、`std::vector<std::string>`として返します。

## **file_io_utilities.cpp**

### **`read_binary_file`**
この関数は、指定されたファイルパスからバイナリデータを読み込む役割を果たします。具体的には、以下の手順で動作します。

1. **ファイルのオープン**: 指定されたファイルパスを使用してファイルをバイナリモードで開きます。
2. **ファイルサイズの取得**: ファイルポインタを末尾に移動し、ファイルサイズを取得します。
3. **データの読み込み**: ファイルポインタを先頭に戻し、ファイル全体をバッファに読み込みます。
4. **バッファの返却**: 読み込んだデータを`std::vector<char>`として返します。

この関数は、ファイルが存在しない場合や読み込みに失敗した場合に例外をスローします。

### **`write_binary_file`**
この関数は、指定されたファイルパスにバイナリデータを書き込む役割を果たします。具体的には、以下の手順で動作します。

1. **ファイルのオープン**: 指定されたファイルパスを使用してファイルをバイナリモードで開きます。既存のファイルがある場合は上書きされます。
2. **データの書き込み**: 引数として渡された`std::vector<char>`のデータをファイルに書き込みます。
3. **ファイルのクローズ**: 書き込みが完了したらファイルを閉じます。

この関数も、書き込みに失敗した場合に例外をスローします。
基本情報技術者試験対策～情報セキュリティ用語② リスクマネジメント編～

# 基本情報技術者試験対策～情報セキュリティ用語② リスクマネジメント編～

## リスクマネジメント
企業活動というものは常に様々なリスクを伴うものです。
活動に伴って発生するリスクを管理し、損失を最小の費用で抑えようとすることを（そのままの意味ですが）リスクマネジメントと呼びます。
***
## リスクマネジメントのプロセス
リスクマネジメントは以下の過程に沿って行います。
①**リスク特定**…そもそもどのようなリスクがあるのかを洗い出す事。
②**リスク分析**…洗い出したリスクの発生確率や損害の大きさを調べる事。
③**リスク評価**…リスク分析を行った結果をもって、リスクに優先順位をつける事。
④**リスク対応**…それぞれのリスクに対応する事。

①～③を**リスクアセスメント**と呼びます。
そして④のリスク対応にはそれぞれ以下のような種類があります。
1. **リスク回避**⇒リスクを含む、その業務自体をやめる事。リスクがあるならそもそもやらない、という判断。
2. **リスク低減**⇒リスクの発生確率を下げる努力をしたり、発生した場合の損害を抑えようとする事。
3. **リスク移転**⇒リスクを自社から他社へ移す事。保険をかけたり、外部委託したりする事。
4. **リスク保有**⇒リスク低減やリスク移転を行うのが困難な場合や、コスト面の判断から、そもそもリスクへの対策をしない事。リスクを受け入れる事。

☆リスクマネジメントに関連する以下の用語も覚えておくと良いです。
・**BCM（事業継続管理）**…何かあったときでも企業活動を継続するための経営手法。
・**BCP（事業継続計画）**…BCMを達成するための計画。例えばシステムの二重化、分散配置、自家発電装置の調達など…

*** 

## 情報セキュリティマネジメント
情報セキュリティのリスクに対して管理すること。
機密性、完全性、可用性のバランスを維持、改善していく取り組みのことを**情報セキュリティマネジメントシステム**とよぶ。
・機密性⇒認められた人だけが情報にアクセスできること。
・完全性⇒情報が正確で改ざんや破壊が行われていないこと。
・可用性⇒必要な時に情報にアクセスできる（利用できる）こと。

***
## 脅威への対策
情報セキュリティのリスクへの対策をそれぞれリスクの種類で分類してみます。

### 人的セキュリティ対策
・**アクセス権**…ユーザごとに与えられるファイルへの読み書きの権限。「読み取り権限」「書き込み権限」「実行権限」を組み合わせて付与する。

### 技術的セキュリティ対策
・**ファイアウォール**…外部ネットワークと内部ネットワークの間に設置して不正アクセスから内部ネットワークを守るためのもの。ルータに組み込まれていることが多い。
・**パケットフィルタリングファイアウォール**…パケットのヘッダ情報を見て不正アクセスかどうか判断するファイアウォール。
・**IDS**…侵入検知システム。不正アクセスがあった場合、管理者に通知するシステム。
・**IPS**…侵入防止システム。不正アクセスに対して管理者に通知した上で、そのアクセスを遮断できるシステム。
・**WAF**…Webアプリケーションの脆弱性を狙った攻撃からWebアプリケーションを守る仕組み。検知と遮断ができる。
・**DMZ**…非武装地帯。外部、内部のどちらのネットワークとも隔離されたネットワーク領域のこと。
・**SSL/TLS**…PCとサーバのやり取りを暗号化する通信プロトコルのこと。
・**HTTPS**…SSL/TLSを使って、HTTP通信を暗号化する仕組み。HTTPSが暗号化するのはWebブラウザとWebサーバの間の部分。
・**WPA3**…無線LANの通信を暗号化する規格のこと。端末とアクセスポイントの間を暗号化する。

・マルウェアの検知
　　**コンペア法**…とあるファイルに対して原本のファイルを保持しておき、原本のファイルと対象のファイルを比較することでマルウェアを検知する方法。
　　**パターンマッチング法**…シグネチャと一致するかを検査してマルウェアを検知する方法。シグネチャとはマルウェアの攻撃パターンを蓄積したファイルのこと。
　　**ビヘイビア法**…実際のマルウェアを実行してみてその振る舞いを監視する。そこから対策などを研究したりする。
  
・携帯端末関連の対策法
　　**BYOD**…私物の端末を業務に使うこと。一見リスクを増加させるものに見えますが、シャドーIT（勝手に私物端末を業務に使うこと）を抑制する効果があります。
　　**MDM**…業務に使う端末を一元管理すること。MDMシステム。
  
・**ペネトレーションテスト**…攻撃を試しにやってみて対策の弱点を見つけるテスト。
・**セキュアブート**…PC起動時にOSのデジタル署名を検証して、マルウェアに感染しているOSの実行を防ぐもの。
・**CAPTCHA**…コンピュータと人間を区別するテスト。「私はロボットではありません」を証明するもの。画像を指定したり、崩れた書体の文字を入力したりするアレです。

### 物理的セキュリティ対策
・**バイオメトリクス認証**…身体的な特徴や行動的な特徴による認証のシステム。指紋、網膜、制脈パターンや筆跡、歩き方など…
・**二要素認証**…記憶、所有物、生体情報の3つの要素のうち2つを使って本人確認をする手法。
※あくまで3つのうち別々の2つを使って認証することをいう。
***
# まとめ
読みづらい記事になってしまいましたが…
情報セキュリティリスクに対して、どのようなアプローチを行って対策するか、
どのような種類の対策を行うか、適切に管理していく必要があります。
この記事でイメージしづらかった部分は調べてイメージを付けながら覚えておくと試験できっと役に立ちます！
new lightning app : Navigation Items not showing


+ [I am on "Set Up the Lightning Service Console" Accounts, Cases, Contacts and Knowledge does not show up as a possible navigation item to add.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmOJe)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bf840368-4762-c53a-3ca9-17919bfbd9b4.png)

:::note
I'm having the same issue. I tried multiple playgrounds and clearing cache. I was finally able to complete the task by opening an incognito window.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000DxT4VSAV
:::

+ [No Navigation Items available when creating New Lightning App](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A97snSAB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a8319957-2f20-2260-105d-7dcb4bb8c99a.png)

+ [Why am I unable to select available items when creating an App Unit?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000DxT4VSAV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/00fe6639-dc4b-08a4-5736-29ee8e2a2779.png)
【MySQL】INNER JOINとOUTER JOINの違い

# はじめに
複数のテーブルからデータを取得するために、JOINを使ってSQL文を書きました。その際、内部結合（INNER JOIN）と外部結合（OUTER JOIN）の違いについて調べたのでまとめておきます。

# 内部結合（INNER JOIN）とは
2つ以上のテーブルから関連するデータのみを取得します。内部結合では、指定した条件に一致する行だけが結果セットに含まれます。つまり、結合条件に一致しない行は結果に含まれません。

#### 使うべき場面
* 2つのテーブルの間で共通のデータが存在する時
* 両方のテーブルに存在するデータのみを取得したいとき

例えば、2つのテーブル orders と customers があるとします。orders テーブルには注文情報が、customers テーブルには顧客情報が含まれています。顧客とその注文を取得したいときに内部結合を使います。


```
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
```

# 外部結合（OUTER JOIN）とは
左外部結合（LEFT JOIN）と右外部結合（RIGHT JOIN）があります。外部結合は、一方のテーブルに存在するすべてのデータと、もう一方のテーブルに一致するデータを取得します。

左外部結合（LEFT JOIN）の場合、FROM後のテーブルのデータ全てとLEFT JOIN後の一致する行を取得します。一致しないLEFT JOIN後テーブルの行にはNULLが入ります。右外部結合（RIGHT JOIN）の場合はその逆です。

#### 使うべき場面
*あるテーブルのすべてのデータと、関連する他のテーブルのデータを取得したいとき
*片方のテーブルのすべてのデータが必要なとき

例えば、すべての顧客とその顧客が注文した情報を取得します。注文がない顧客も結果に含まれます。

```
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
```

# まとめ
いかがだったでしょう？
OUTER JOINとINNER JOINの違いを理解していなかった私は、必要なデータを取得できなかったり、意図しないデータが反映されてしまっていました。
この記事を書くことで少しでも皆さんの役に立てたら幸いです。
paizaラーニングレベルアップ問題集の「mod7占い」をやってみた

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集の[mod7占い](https://paiza.jp/works/mondai/s_rank_skillcheck_sample/mod7)をやってみました。
- - -
Aランク、Sランク問題となると、計算量やオーバーフローを考慮しなければなりません。
###### 三流占い師
```c
#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    int A[n];
    for(int i=0;i<n;i++)scanf("%d",&A[i]);
    int count=0;
    for(int i=0:i<n-2;i++){
        for(int j=i+1;j<n-1;j++){
            for(int k=j+1;k<n;k++){
                //3枚の合計が7の倍数ならインクリメント
                if((A[i]+A[j]+A[k])%7==0)count++;
            }
        }
    }
    printf("%d\n",count);
    return 0;
}
```
今回の入力は$0\le a_i<2^{32}$ですので、符号付$32\text{bit}$整数を使うと$a_i\ge 2^{31}$の入力に対してオーバーフローします。
また、$N\le 100000$という制約ですので、組合せ数は最大$166661666700000$通りとなり、符号付$32\text{bit}$整数では管理できません。
- - -
###### 二流占い師
```c
#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    long A[n];
    for(int i=0;i<n;i++)scanf("%ld",&A[i]);
    long count=0;
    for(int i=0:i<n-2;i++){
        for(int j=i+1;j<n-1;j++){
            for(int k=j+1;k<n;k++){
                //3枚の合計が7の倍数ならインクリメント
                if((A[i]+A[j]+A[k])%7==0)count++;
            }
        }
    }
    printf("%ld\n",count);
    return 0;
}
```
カードに書かれた整数を$64\text{bit}$整数で受け取り、組み合わせ数を$64\text{bit}$整数で管理します。上のプログラムを[paiza.io](https://paiza.io/)で実行したところ、$N=1000$で約$0.11$秒かかりました。三重ループなので、$N$が$a$倍になると処理時間は単純に$a^3$倍になります。$N=3000$程度ならギリギリ$3$秒で終わるでしょうが、$N=100000$では$30$時間以上かかることになります。
- - -
###### 一流占い師
カードは、$7$で割った余りでグループ分けすればよいです。あとは、重複に気を付けて組み合わせ数を計算すればよいです。以下の12パターンについて組み合わせ数を計算して足し合わせればよいです。
| 0 | 0 | 0 | 0が3重複 |
|:-:|:-:|:-:|:-:|
| 0 | 1 | 6 |   |
| 0 | 2 | 5 |   |
| 0 | 3 | 4 |   |
| 1 | 1 | 5 | 1が重複 |
| 1 | 2 | 4 |   |
| 1 | 3 | 3 | 3が重複 |
| 2 | 2 | 3 | 2が重複 |
| 2 | 6 | 6 | 6が重複 |
| 3 | 5 | 6 |   |
| 4 | 4 | 6 | 4が重複 |
| 4 | 5 | 5 | 5が重複 |
```c
int main(void) {
	int n;
	scanf("%d", &n);
	long mod7[7];
	memset(mod7, 0, sizeof(mod7));
	for (int i = 0; i < n; i++) {
		long a;
		scanf("%ld", &a);
        // カードに書かれた数を7で割った余りでグループ分け
		mod7[a % 7]++;
	}
	long count = mod7[0] * (mod7[0] - 1) * (mod7[0] - 2) / 6;
	count += mod7[0] * mod7[1] * mod7[6];
	count += mod7[0] * mod7[2] * mod7[5];
	count += mod7[0] * mod7[3] * mod7[4];
	count += mod7[1] * (mod7[1] - 1) * mod7[5] / 2;
	count += mod7[1] * mod7[2] * mod7[4];
	count += mod7[1] * mod7[3] * (mod7[3] - 1) / 2;
	count += mod7[2] * (mod7[2] - 1) * mod7[3] / 2;
	count += mod7[2] * mod7[6] * (mod7[6] - 1) / 2;
	count += mod7[3] * mod7[5] * mod7[6];
	count += mod7[4] * (mod7[4] - 1) * mod7[6] / 2;
	count += mod7[4] * mod7[5] * (mod7[5] - 1) / 2;
	printf("%ld\n", count);
	return 0;
}
```
(例1) $3$枚のカードが$1,5,8$の場合、$7$で割った余りが$1$のカードが$2$枚、余りが$5$のカードが$1$枚です。この時、余り$1$のグループから$2$枚取り出す取り出し方は$2\times(2-1)\div2=1$通り（$1\rightarrow8$と引く引き方と$8\rightarrow1$と引く引き方を同一視）です。
(例2) $3$枚のカードが$7,14,21$の場合、$7$で割った余りが$0$のカードが$3$枚です。この時、余り$0$のグループから$3$枚取り出す取り出し方は$3\times(3-1)\times(3-2)\div6=1$通り（$7\rightarrow14\rightarrow21$, $7\rightarrow21\rightarrow14$, $14\rightarrow7\rightarrow21$, $14\rightarrow21\rightarrow7$, $21\rightarrow7\rightarrow14$, $21\rightarrow14\rightarrow7$の6通りをを同一視）です。
PHPにおけるユーザ定義関数

# PHPにおけるユーザ定義関数
## はじめに
静止したウェブサイトはなんだか退屈。
っていうか『あれ？動いていない？壊れてる？』と思われちゃいます。
だから、利用する人が『このサービス、生きてる』と感じるには、ウェブサイトが躍動的に動くことが大切ですね。

『生きてるサービス』を実現するために、PHPは特定のタスクを実行する関数を作り込むこと（「定義する」とも言う）ができます。これが「ユーザ定義関数」です。

## ユーザ定義関数とは？
コンピューターにあるタスクを実行させたいので、プログラマーは「タスクを実行しろ」とタスク実行のやり方を順番通り書いて作り込んだ関数です。「プログラマーが定義する」ともいいます。このプログラムの塊（かたまり）をユーザー定義関数と言います。

コンピューターはユーザー定義関数を命令と解釈して実行しようとします。うまく動けばサービスを提供できます。
サービス実現のため、同じ動きや似た動きをするプログラムをいっぱい書くんじゃなくて、１か所にまとめて書いて、その１つのプログラムの塊を読み込んであちこちで実行させるのが賢いよね。プログラミングの仕事も減らせる。

こうして、コードの再利用を実現して、プログラム全体の可読性を向上させ、修正や改修などのメンテナンス性が向上します。
これがプログラミングの仕事であり、プログラマーの腕の見せどころです。

## ユーザー定義関数の書き方
###  関数を定義する
ユーザ定義関数は、`function`キーワードを使用して定義します。
関数名はアルファベットで始まる任意の文字列でよいのですが、原則として、どんな振る舞いをするのかを考えて命名すると良いでしょう。
```sh
function sayHello() {
    echo "Hello, World!";
}
```

### 引数を使用する
ユーザ定義関数の主目的は、似た動きを一箇所にまとめてコードのメンテナンス性を向上させることです。ですから、基本動作は同じでも、違う箇所を引数で渡して処理させるという構造を取ります。これにより、関数に情報を渡して、その情報に基づいて処理を行うことができます。
```sh
function sayHello($name) {
    echo "Hello, World " . $name . "!";
}
```
ここでは`$name`で「名前」を渡す構造になっています。実際の開発現場では、もっと複雑な値を渡したり、プログラムそのものを渡すなどして利用しています。

### 戻り値
サービスは単一のプログラムの塊で処理が終わることはありません。プログラムを実行したら、次のプログラムを実行させて、こうして次々に処理が進んでダイナミックな動きを演出するプログラミングが可能になります。

そのため `return`文を使用して実現します。
```sh
function sayHello($name) {
    $moji = "Hello, World " . $name . "!";
    return $moji;
}
```
このプログラムの塊に「名前」を渡したことで、「Hello, World （好きな人のなまえ）!」という文字列を生成し、返却します。こうしたプログラムの繋がりが、プログラミングです。

## ユーザ定義関数の利点
* **コードの再利用性:** 同じコードを何度も書く代わりに、関数を一度定義して必要なときに呼び出すことができます。
* **可読性の向上:** 関数名を適切に選ぶことで、コードの意図が明確になり、読みやすくなります。
* **メンテナンスの容易さ**: コードの特定部分を変更する必要がある場合、その部分が関数内にあれば、その関数だけを修正すればよく、全体の修正が容易になります。

## まとめ
ユーザ定義関数は、プログラミングにおいてとても重要な概念です。関数を効果的に使用することで、コード管理が用意になり、プロジェクトの開発効率が大幅に向上します。この概念をベースに、クラスの管理やクラス毎の関数、プラグインやオニオンアーキテクチャーなどの概念へと理解を深め広げていくことになりますので、まずはこの基本概念を理解するように取り組みましょう。
robloxでassistant その160

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
VoiceChatServiceを使え。

# サンプルコード

```
local Players = game:GetService("Players")
local VoiceChatService = game:GetService("VoiceChatService")
local localPlayer = Players.LocalPlayer
local success, enabled = pcall(function()
	return VoiceChatService:IsVoiceEnabledForUserIdAsync(localPlayer.UserId)
end)
if success and enabled then
	localPlayer.PlayerGui.MyVoiceGui.Enabled = true
	print("ok")
else
	print("ng")
end

```


以上。
robloxでassistant その159

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
UserInputServiceを使え。

# サンプルコード

```
local UserInputService = game:GetService("UserInputService")
local function onInputBegan(input, _gameProcessed)
	if input.UserInputType == Enum.UserInputType.MouseButton1 then
		print("The left mouse button has been pressed!")
	end
end
UserInputService.InputBegan:Connect(onInputBegan)

```

以上。
本当に、そのcreate-themeって必要？

# 本当に、そのcreate-themeって必要なの？

## 何故この記事を書こうと思ったのか
Reactの開発現場にて、既存のコードを眺めていたところ、
これって特に何も考えずにとりあえず形上、create-theme使ってないか？っていう場面に遭遇したので今回記事を作成しました。themeの呼び出しでカラーコード引っ張ってくると、実際のところCSSは読みづらいなぁ、という考えが自分的にはあります。
paletteを使うメリットはあるけれど、あまり使いきれてないなら別の方法のが楽じゃない？っていう感覚で書いていますので、
参考程度にでも見ていただきたいですし、意見があったら教えていただきたいなぁと思います。

サンプルコードと対応策を考えてみました。

## 割と開発現場でよく見がちなこのコード。
```javascript
// theme.js
export const Theme = {
  palette: {
    primary: {
      main: '#274a78',
    },
    secondary: {
      main: '#f50057',
    }
  },
};
```

配色管理をしているだけのtheme....しかも2色だけ。
styled-componentsでも、emotionsでもありがちなコードですよね。
この2色のためだけに、わざわざtheme Provider使ってラップして〜
定義した色の呼び出しはこんな感じで〜〜。
```javascript
import styled from 'styled-components';

export const StyleButton = styled.button`
  background-color: ${({ theme }) => theme.palette.primary.main};
`;
```

### 2色の管理のためだけに、この作業の繰り返しは非常〜に面倒！！
時々palette開くの面倒になってそのままカラーコード直書きしてしまったりね。

## この場合って、普通〜に定数化したコンフィグファイル作った方が楽なんじゃないか？と考えました。
themeを使わずにconfigディレクトリでも作成して、colors.tsを作成します。
※chatGPTで生成した適当なカラーコードとキー群です。
```javascript
// colors.js
export const COLORS = {
  PRIMARY: '#1976d2',
  PRIMARY_LIGHT: '#63a4ff',
  PRIMARY_DARK: '#004ba0',
  ACCENT: '#dc004e',
  ACCENT_LIGHT: '#ff6090',
  ACCENT_DARK: '#9a0036',
  BACKGROUND: '#fff',
  TEXT_PRIMARY: '#000',
};
```

使いたい時の呼び出し方

![スクリーン ショット 2024-08-06 に 06.08.26 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624085/352329d3-ff83-ad91-7a18-a1995aa70a6a.png)

importしたCOLORSから補完機能で出力されているキー名を選択する。これだけで完了です。

## 感想
例えば社内向けのシステムとか小規模なシステムでは特に活用できるんじゃないかと思います。ご意見もお待ちしております。
ありがとうございました。
Depo 25 Bonus 25 Karung Bonus 100% Situs Slot TO Kecil Bebas IP 2024

Depo 25 Bonus 25 Karung Bonus 100% kembali memberikan Bonus 100% kepada para New Member dengan berbagai bonus hot saat ini di sertai syarat yang mudah Turn Over Kecil mulai dari TO 5x 8x 10x 13x 15x dapat di pilih semua orang . Karung Bonus 100% juga memudahkan pemain dengan kemudahan penarikan Bebas IP sehingga tidak perlu khawatir kesahan ip dan gagal withdraw.Karung Bonus 100% merupakan sebuah situs slot tahunan yang selalu kembali di bulan Agustus dengan berbagai promo yang sangat banyak mengikuti Perayaan Kemerdekaan sehingga situs membagikan bonus plus plus kepada member . Dengan cukup Deposit 25 Bonus 25 member sudah mendapatkan Bonus 100 yang dapat di tarik dengan syarat TO 5x 8x 10x 13x 15x yang dapat di pilih , dengan Bebas IP menjadi mudah dalam penarikan .

>> [ DAFTAR DISINI ](https://magic.ly/Ruangbonus)
![Thor-from-Norse-mythology-2-1200x900.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3854353/15984a09-6cdc-5235-8a88-70019b80fdb8.jpeg)

Terdapat fitur RTP yang memudahkan pemain dalam memperoleh kemenangan membuat banyak member MAXWIN disini , sehingga Promo Bonus yang di berikan selalu berubah ubah . 
Karung Bonus menyediakan berbagai Bonus Tambahan seperti Rollingan mingguan , Bonus Deposit harian maupun referal dengan prosentase tinggi , Karung Bonus tidak hanya memberi Bonus 100% kepada New Member 100 yang melakukan Depo 25 melainkan banyak seperti Deposit 50k Bonus 50k hingga Deposit 100 ribu Bonus 100 ribu . Namun New member dengan saldo minim juga dapat melakukan deposit di bawah nilai tersebut seperti Deposit 10k Depo 20 namun tidak dapat mengikuti Promo Bonus 100% karena minimal Deposit untuk Promo Bonus 100% adalah 25 ribu .
Javaで「リージョン(対象文字列の中のパターンと比較する範囲)を設定する」の動作を確認してみた

# 概要

Javaで「リージョン(対象文字列の中のパターンと比較する範囲)を設定する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index26.html

# 実装

以下のファイルを作成しました。
```JSample26_1.java
import java.util.regex.*;

class JSample26_1{
  public static void main(String[] args){
    String target = "dancer singer";

    String regex = "\\b.*?er";
    Pattern p = Pattern.compile(regex);

    Matcher m1 = p.matcher(target);
    if (m1.find()){
      System.out.println(m1.group());
    }else{
       System.out.println("not match");     
    }

    Matcher m2 = p.matcher(target);
    m2.region(7, 13);
    if (m2.find()){
      System.out.println(m2.group());
    }else{
       System.out.println("not match");     
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample26_1.java 
$ java JSample26_1 
dancer
singer
```

# まとめ

何かの役に立てばと。
C#概要

初めましての投稿です。
今までQiitaは見る専だったのですが、本日インターンがございまして、自分の実力不足が目立ちすぎたため、積極的にプログラミングに取り組む必要があると判断し、学んだ内容をアウトプット、自分のレベルの低い文才を少しでも高めようと思い投稿を決意させていただきました。
文章が読みづらい、他者様との重複等あると思いますが、精進する気持ちしかないので、ご指摘どんどんお待ちしております。よろしくお願いします。
前書きは以上にして、早速本題に入っていきたいと思います。

---
### C#とは？
 C#とは**javaのようなObject指向言語の言語**の一つであり、
 Microsoftによって作られた言語の一つです。
 C言語、C++など聞いたことがあると思いますが、これらとの互換性はないようです。
 そもそも系統が違ったり、独自の機能を持つことから、互換性はないとのことです。

 
---
### 動作環境の構築
.NET Frameworkのダウンロード

windowsは標準搭載されているようですが、macにはありません。
私は以下リンクから.NET6.0をダウンロードしました。
https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0

---

### C#基本構文

```cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace basic
{
    class basic
    {
        static void Main(string[] args){
            Console.WriteLine("basic system");
        }
    }
}
```

basic system　と表示する超簡単なプログラムです。各行の役割について解説していきます。

```cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
```
C#には、名前空間、といった概念がありまして、クラスやファイルのグループ化ができることが大きなメリットです。
例えば1行目のusing System　は、これからSystemという名前空間を使いますよっていう宣言です。
ちなみに、Systemという名前空間にはC#を動かすにあたっての基盤になるものがたくさん入っているので、大体入ってる。


```cs
namespace basic{}
```
次にnamespaceですが、こちらは先ほど述べた名前空間の宣言になります。
今から作るクラスの名前空間をbasicという名前で宣言しますよってことです。
こうすることで、他クラスでusing basic　と宣言するとbasicクラスのメソッドが使えるようになるわけですね。
```cs
    class basic
    {
        static void Main(string[] args){
            Console.WriteLine("basic system");
        }
```

次にクラスについてです。
class basicと宣言してからプログラムを書き始めます。
基本namespaceと同じ名前にするのが基本でしょう。

`static void Main(string[] args)`について。

こちらはトップレベルステートメント　です。
簡単にいうと、この中身のコードから作業を開始するよってことで。
ここから他クラスのメソッドなどを呼び出して一つの作業を行うわけです。
**1つのプロジェクトに1つしか存在できません。**


---

### 実行方法

私はdotnet runを用いて実行しました。ていうか、それしかわかりません。
vscodeのデバックを開始(f5)でできるらしいのですが、XMLの拡張機能がどうとかって言われてよくわかりませんでした。賢くなって追記するかまた新しく記事作るか何かしたいと思います。すごく眠いです。

dotnet runの使用方法について、現在のディレクトリにcsprojっていう拡張子を持ったファイルを作成することが必要です。

```console
$ dotnet new console -o practice_cs
```

このコマンドを実行することでpractice_csディレクトリに(なければ作成して)csprojファイルとprogram.cs　ファイルを作成してくれます。

これ最初に述べとくべきかもしれませんでしたね。

program.cs、いらないなら削除しましょう。

```console
$ dotnet run
```

で動くはずです。。

---
### 初記事　感想

これを読んでくださる方は少ないだろうけど、もし読んでくださった方いらっしゃいましたら、ありがとうございます。
おそらく初学者の方かと思いますが、もしよろしければ実際に試していただいて、動かなかったや動いた報告してくだされば嬉しいです。
ここが良くなかったなとか反省につながると思うので。

眠いのでとりあえずここで締めたいと思います。
もっとできるやつになれるように頑張りたいと思います。
2024/8/6主にITとかセキュリティの記事

Wi-Fi Webカメラ(Ubiquiti)に脆弱性、2万台超が対象 - アップデートを(8/4)
https://news.mynavi.jp/techplus/article/20240804-2997753/

トークンが変えるゲームの未来──プログラマブルでパーミッションレスなゲームダイナミクスとは(8/4)
https://www.coindeskjapan.com/240390/

意外と知らない「Internet Explorer」が嫌われ続けていた理由(8/4)
https://news.yahoo.co.jp/articles/c7bae2decbdf788668235957861165fe9ec4f34b

Japan to Make Infrastructure Cyberattack Reporting Mandatory(8/4)
https://sp.m.jiji.com/english/show/34680

ソフトの脆弱性対策、通信業界に導入促す　総務省が指針(8/4)
https://www.nikkei.com/article/DGXZQOUA174RT0X10C24A7000000/

中国で19の職業が新たに発表(8/4)
https://japanese.cri.cn/2024/08/04/ARTInQjeh0qvmCP2K8R0M431240804.shtml

【IPアドレス】完全ガイド: 初心者から中級者まで理解できるネットワークの基本【AWS/VPC/CIDR表記/サブネット】(8/5)
https://zenn.dev/yukun369/articles/385408ad790754

教育現場の生成ＡＩ活用、模索続く　静岡県内高校、授業や校務に導入事例(8/4)
https://www.at-s.com/news/article/shizuoka/1527364.html

AzureのFront Doorとは(8/3)
https://zenn.dev/headwaters/articles/7ed3a8aecbba57

アインシュタイン稲田も被害に…SNSの「不正ログイン」防ぐコツ 一般人ほど注意が必要(8/4)
https://news.yahoo.co.jp/articles/0c4f105c52aaa4493df54372003415da364559d2

個人情報保護委員会 第１回 個人情報保護法のいわゆる３年ごと見直しに関する検討会(8/4)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/08/post-523368.html

米当局とＴｉｋＴｏｋの闘争が泥沼化　アプリを通じた中国政府へのデータ流出　「子供の情報を違法に収集」と司法省が新たに提訴(8/4)
https://www.zakzak.co.jp/article/20240804-MCGUFHTZJJKMRD4XDJMUW2V67U/

「住所は英数字もすべて全角で入力してください」はなぜそうなったのか(8/4)
https://qiita.com/ymrl/items/e6a5ecb6b6fc9fb71560

「史上最大規模」のシステム障害　EDRの設定ファイルにバグ 米クラウドストライク(8/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/073000161/

まずはランサムウエア被害の拡大を防止、直ちに感染端末をネットワークから隔離せよ(8/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02903/073000001/

プロジェクト管理の質問は生成AIにお任せ、状況把握や報告書の作成に活用(8/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02902/072400005/

Androidタブレットには14型の大画面モデルも、格安機でチェックすべき3つのポイント(8/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02895/071700003/

FTQC（Fault-Tolerant Quantum Computer）(8/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/072600174/

日本のデジタル赤字は5兆円超　実は「少なすぎる」のが問題だ(8/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/072600171/

セキュリティ・バイ・デザイン「システム開発のセキュリティ向上0.0」(7/31)
https://www.ipa.go.jp/jinzai/ics/core_human_resource/final_project/2024/security-by-design.html
プリザンターでさくらインターネットのメールを利用する

# はじめに
プリザンターでメールを使った事が無かったので設定してみました。
メールアドレスはさくらインターネットのメールアドレスを利用しています。

### 参考にしたサイト
https://help.sakura.ad.jp/mail/2132/

https://pleasanter.org/manual/smtp-mail

## 環境
OS：Windows 11 Pro
DB：SQL Server 2019
プリザンター：1.4.6.4
メール：さくらインターネット


# Mail.jsonの編集
Mail.jsonの場所は **Implem.Pleasanter\App_Data\Parameters** にあります。公式より必要なパラメータ情報を設定していきます。

https://pleasanter.org/manual/mail.json

### 実際に設定した値

```Mail.json
{
    "SmtpHost": "example.sakura.ne.jp",
    "SmtpPort": 587,
    "SmtpUserName": "mail@example.sakura.ne.jp",
    "SmtpPassword": "パスワードを入力",
    "SmtpEnableSsl": true,
    "ServerCertificateValidationCallback": false,
    "SecureSocketOptions": null,
    "FixedFrom": null,
    "AllowedFrom": null,
    "SupportFrom": "\"Pleasanter.org\" <mail@example.sakura.ne.jp>",
    "InternalDomains": "",
    "Encoding": null,
    "ContentEncoding": null
}
```

設定後はIISの再起動が必要となります。

# 試してみる
テーブルにデータを追加し、メールを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/833d3075-cc95-cf4a-d984-dcd1da24f43a.png)

アドレス帳を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/9d6c3ade-a72b-3765-3eef-86d329e3d114.png)

ユーザーを選択し、Toボタンを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/28bc5091-5e5a-21bc-7a70-18495e613f79.png)

先程Toで選択したユーザーが入力されている事を確認し、送信ボタンを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119455/8ca431cb-3f41-2a90-8f44-f762332b6a60.png)

送信後、メールボックスにメールが送られてきていれば成功です。
【個人開発/独学】React×Flaskでwebアプリを作る際の3つのポイント

# はじめに
### この記事を読んで欲しい人
同じような境遇の人に読んで欲しいです。具体的には以下の人たちの参考になれば嬉しいです。
・WEBアプリケーションに興味はあるが、何から始めれば良いかわからない人
・HTMLやCSS、JavaScriptを少し学んだが、公開する方法が分からない人
・Pythonなどプログラミングは少しできるが、WEBアプリはよく分からない人
・簡単なフレームワーク（React、Flask）と無料の環境（vercel、render）でサクッとWEBアプリを作りたい人

### 自己紹介
2024年4月頃から完全独学でWEBアプリケーションを勉強し始めた、マーケターです。もともと理系でPythonは仕事でも使うため少しできるレベルですが、WEBアプリ開発の経験は０でした。

### 作ったWEBアプリ:soccer:

海外サッカー分析アプリを作成しました。海外サッカーはその需要に対して、気軽に使える分析ツールが極端に少ないため、日本人向けに５大リーグの分析サイトを作りました。(*無料プランで公開しているため、データの読み込みに1分ほどかかります。)

https://football-app-gold.vercel.app/ranking

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/d3aa0376-565a-5728-4844-0d4ac8f92671.png)

# ポイント1：どんな言語があり、どれを選ぶべきか？
### そもそも言語とは？
WEBアプリケーションを作る上で必要になる言語は大きく２種類あります。一つはユーザーの使う画面を作るためのフロントエンドの言語。もう一つ分析したり計算を行うためのプログラムのバックエンドの言語です。
私の場合何か一つの言語だけできれば、WEBアプリが作れると勘違いしており、後述するpythonだけで全て作り込もうとしていました。
（＊簡単なものは一つの言語で作れますが、セキュリティや拡張性からどちらも学んだ方が良いです！）

### どの言語を選ぶべきか？
結論フロントエンドはJavaScript、バックエンドはpythonがおすすめです。フロントエンドは基本的にJavaScriptが必須で、バックエンドはruby,javaなど色々選択肢はあるものの利用率が高くシンプルでライブラリも充実しているpythonを選ぶことをお勧めします。

### フレームワークとは？
webアプリ開発はフロントエンド、バックエンドの言語でプログラムを書いていけば作れることは作れますが、フレームワークと呼ばれる仕組みを使うと効率的になります。フレームワークはwebアプリを作るための仕組みのことです。ざっくり言うとWEBアプリを作ることに特化したその言語特有のライブラリです。

https://www.sejuku.net/blog/87963#index_id0

JavaScriptのフレームワークにはReactやVue.jsと呼ばれるものがあります。PythonのフレームワークにはFlaskやDjangoがあります。

### どのフレームワークを選ぶべきか？
JavaScriptのフレームワークはReact、PythonはFlaskがお勧めです。どちらも難しい概念が少ないためとっつきやすいです。

# ポイント2：ChatGPTをフル活用する
下手なプログラミングの教科書を買うよりも0からChatGPTに教えてもらった方が、効率的に学習できます。
例えば、Ruby on Railsというフレームワークは非常に丁寧なチュートリアルを用意していますが、サックと開発したい個人開発で０から学習するのは非効率です。

https://railstutorial.jp/

その代わりにChatGPTにコードを自動出力してもらい、流れを掴む方がシンプルで分かりやすい場合が多いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/709ecdc5-4636-0610-e4dd-6dc9c7db2373.png)

# ポイント3：サーバーはホスティングサービスを使う
### localhostで動いた後はどうすれば良いか？
WEBアプリのプログラムを作成したら、サーバーを立ち上げる必要があります。フロントエンドはWEBサーバ、バックエンドはアプリケーションサーバというサーバを立ち上げ、そこで実行します。
本などでは、テスト用のサーバーで以下のコードでサーバを立ち上げ、アプリを動かしますが、本番環境でどうすれば良いか分からないというのが初学者あるあるです。私もだいぶ調べました。。。

```
npm start
```
```
flask run
```
上記コマンドは自分の環境であるlocalhost上では動きますが、誰でもアクセスできるわけではないです。

### vercelとrenderを使う
サーバーを立ち上げる方法はいくつかあります。一番オーソドックスな方法は、AWSのEC2などのクラウドを使いそこで実行する方法です。しかしそれはそれでスキルが必要です。
そこでお勧めなのが、ホスティングサービスを活用することです。フロントエンドはvercel、バックエンドはrenderというサービスが無料で活用できます。

https://vercel.com/

https://render.com/

### githubを使う
githubはプログラムファイルやフォルダを管理するためのバージョン管理ツールです。自分の書いたコードをオンライン上に保存できるイメージです。初学者にはしきいが高いイメージがありますが、githubは個人開発でも使えるに越したことはありません。また、意外と簡単に使えて便利です。
前述したホスティングサービスは、github上のソースコードを自動で読みに行っているため、githubも合わせて勉強する必要があります。
なお、githubにアップする際は「フロントエンド（react）」と「バックエンド（flask）」で別々にした方が都合が良いです。（意外とどこにも情報がないため迷います。。）

# 終わりに
独学だと何から勉強すれば良いのか見当がつかないことが多々あると思います。本当に基本的なことがわからない状態もザラです。私の場合は、「フロントエンドとバックエンドの違い」や「サーバーとは何か？」などよくわかっていませんでした。
この記事が個人開発で悩んでいる人の助けになれば嬉しいです！
忘れてた

勉強後のQiita更新とGithub更新を忘れていました～

ようやくJavaScript勉強を始めました。
この教材が終わったら投資の勉強とかCloudTechでAWSの勉強とかしたい…。けどさすがに勉強が長引きすぎて就職が伸びるので割愛。
自分のサイトを作りつつLaravel習得に注力します。
Laravel教材の予習もできるので自分専用のブログ機能も作ってみようと思っています。
Gollyの利用方法

# Gollyのダウンロード
https://golly.sourceforge.io/

このサイトにアクセスする。

すると、以下のようなページが表示されると思う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/523dd953-01ee-31fc-3486-9b55696d8a77.png)

ここに表示されているReleasedをクリックすると以下のサイトに行く。

https://sourceforge.net/projects/golly/files/golly/golly-4.3/

ここからそれぞれのOSのファイルをダウンロードして展開する。

# 実行
展開したファイルの中身のGollyを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/317ee1de-4efe-56fe-e06f-6d184893cdff.png)

こういう感じの画面になっていると思う。

右のサイドバーから`Patterns→self-Rep→JvN→JvN-llop-repricator.rle.gz`を選択するとノイマンの万能製造機が出現する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/bdf431c4-f3b7-6507-fa91-f2e2cc428faf.png)

最初は謎の一本線なので、拡大して、左端に行くと画像のような装置が出現する。

そのほかにも、`Patterns→Loops→EvoLoop-fineite.rle`を選択するとEvoloopが観察できる。
【MySQL】SQLでの処理順

## はじめに
最近MySQLのクエリを書いているときにSELECT句でASを使って作ったカラム名をWHERE句に投げるとエラーになった原因を調べて分かったことをメモ代わりに置いておきます。

## WHERE句にSELECT句のASで作成したカラム名を投げると
```mysql:入力
SELECT id AS number FROM table WHERE number = 1;
```
```mysql:出力
ERROR 1054(42522): Unknown column 'number' in 'where clause'
```
とこのようにこのようなカラムは存在しませんとエラーを返されます。

## なぜこのようなことになるのか
調べてみたところ、SQLでは上から順に実行されていくわけではなく、下記のように実行される順序があるようでした。
|順序|句|
|:--:|:--|
|1|FROM|
|2|JOIN|
|3|WHERE|
|4|GROUP BY|
|5|HAVING|
|6|SELECT|
|7|ORDER BY|
|8|LIMIT|

SELECT句よりもWHERE句のほうが先に実行されるのでASによってカラム名が作成されるよりも前に呼び出そうとしてしまい結果的にカラムが存在しないということになるようです。
ALifeにおける自己複製

## 自己複製

ジョンフォンノイマンの、ノイマンの万能製造機、ノイマンの自己複製機械から始まった。

### フォンノイマンの自己複製機械

複製機械はメモリテープに保存されたプログラムを持ち、マニピュレーター(複製機械)を使って、**海**から部品を取り出してそれらを使って、自分の複製を組み立て、メモリテープの内容を空の複製にコピーするように指示する。この複製機械は、**4つの理論素子**と構造骨格と可動性を提供するための**4つの機械素子**という部品で構成するようなもの。

### シミュレーションソフト「Golly」

**Golly**は自己複製オートマトンをシミュレートするためのソフトウェアである。

https://sourceforge.net/projects/golly/files/

URLからダウンロードできる


~~利用方法は別記事参照のこと。(めんどくさくて書かないかもしれない)~~
利用方法は以下の記事参照のこと。

https://qiita.com/BB-KING777/items/fd4323fc27bf4f6c493d

### Gollyによる自己複製オートマトンのシミュレート

![Golly ‐ Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/7f791cc9-b931-67bd-8e53-520d8f4cabff.gif)


これはノイマンの自己複製オートマトンである。

実行すると、画像のように少しづつ自己複製を行う。

おそらく、先ほどの**4つの論理素子**は
1. Decoder 命令処理装置
2. RTCO システムの制御を行う、おもにクロック制御
3. Input システムにデータおよびコマンドを送信する
4. Pulser パルス信号を生成する、イベントトリガーなどを行う

**4つの機械素子**は
1. E-Arm 物理的動作を行うEは移動を制御
2. C-Arm 物理的動作を行うCは組み立てを制御
3. SG シグナル生成、クロックの生成場所
4. Counter システムのイベントを集計する

であると考えられる。残念ながら、これは私の考えであり間違っている可能性が高い。

ノイマンの自己複製オートマトンがもう一つのオートマトンを作るための世代数は、
$6.34 \times 10^{10}$回の世代が必要である。

そのため、研究者はできるだけ少ないセルで単純なルールで動く自己複製オートマトンを考案した。それは**ラントンの自己複製オートマトン**と呼ばれるものである。

### ラントンの自己複製オートマトン
ラントンの自己複製オートマトンは、ノイマンの万能製造機の基本条件をあきらめ、86個のセルからなる7状態の限定されたオートマトンである。
状態は以下のようなものである。

1. 空の状態: セルが何も含んでいない状態。オートマトンの初期状態や空のスペースを表す。

2. 核: ループの中心部分を構成するセル。自己複製ループの主要構造を形成する。

3. シース: 核を囲むセル。ループの外殻を構成し、核を保護する。

4. 信号: セル内での情報伝達を担う状態。信号はループの成長や複製プロセスを制御する。

5. 信号の開始: 信号が始まる位置を示す状態。この状態から信号が発生し、ループ全体に伝播する。

6. 信号の終端: 信号が終わる位置を示す状態。信号の伝播が終わり、次のプロセスに移行する準備が整う。

7. 信号の中継: 信号が他のセルに中継される状態。信号がループ内を正しく伝播するために重要な役割を果たす。

これらが7状態である。

以下はラントンの自己複製オートマトンをGollyで実行した様子である。

![無題の動画 ‐ Clipchampで作成 (7).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/4a285ed3-f409-f17d-3bfb-7cfb83d5fa80.gif)


#### ラントンの自己複製オートマトンの問題
ラントンの自己複製オートマトンでは、自分と同じもののみしか生成しない。そのため、Lifeよりも鉱物などの結晶の生成に近い。

#### ラントンの自己複製オートマトンの進化

##### SDRSループ
現在、早稲田大学商学部に所属されている佐山弘樹教授によって提案されたオートマトンである。ラントンの自己複製オートマトンには、ループ構造分解の状態がないため、世代交代が存在していなかった。しかしSDRSループにはライフサイクルが追加され、オートマトンが世代交代と成長を行うようになっている。

![無題の動画 ‐ Clipchampで作成 (9).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/1b6228f4-7254-083b-f875-55aa355382b4.gif)


#### Evoloop
こちらも、佐山教授の研究によって作成されたオートマトンである。Evoloopの特徴は、SDRSループの拡張であり、隣接するループとの相互作用によって進化が可能となっている。また、コロニー同士の空間をめぐる競争であることがわかっている。

![無題の動画 ‐ Clipchampで作成 (10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/12a0a082-336e-f43f-40b6-0f351835175b.gif)


#### Sexyloop
sexyloopはEvoloopに性別の概念が加わり、種の進化における多様性が高まる。
（JS）ぐにゃぐにゃ動く背景

お疲れ様です。お久しぶりです。

勉強はしていたのですが、なんかコードを書いても、ちらちら見てばかりでちゃんと理解しながら書けていないなーと思い、参考書をちゃんと読み返しておりました。
今日も「1冊ですべて身につく入門講座」様から学んだアニメーションです。

```diff_css
#move {
    background: #0bd;
    border-radius: 50%;
    padding: 30px 30px;
    color: #fff;
    text-align: center;
}
```

```diff_javascript
const moving = document.querySelector('#move');

const keyframe = {
    borderRadius: [
    '50% 20% 70% 30%/30% 60% 20% 50%',
    '70% 20% 40% 60%/30% 50% 70% 20%',
    '40% 10% 50% 70%/40% 60% 20% 50%',
    '60% 30% 50% 40%/70% 40% 30% 60%',
],
};

const option = {
    duration: 8000,
    direction: 'alternate',
    iteration: Infinity,
};

moving.animate(keyframe, option);
```

htmlには h1 タグで適当な見出しのみ書いています。そのidが move です。

まず第一引数（動かす内容）である 定数名keyframe 内で、**'左上 右上 右下 左下'** の順で好きな値を入れます。
スラッシュで区切っているのは、 **横の半径/縦の半径** という内容です。
値を4行書いていますが、2行でも動きましたのでお好きなようにされて大丈夫です:relaxed:

第二引数（アニメの再生時間）では、コードの通りですが、
duration でアニメの再生時間を指定します。あとの direction: 'alternate' はアニメを実行する方向の指定で、ここでは「奇数回で通常再生、偶数回で反対方向に再生」としていますが、指定しなくても、初期値が通常の方向での再生となっているので動作します。
iteration: Infinity でアニメーションを繰り返す回数を指定しています。ここでは duration で指定した時間の間、無限ループするように指定しています。

結果から申し上げますと、ふよふよというかぐにゃぐにゃというか、動きのある背景を作ることができました:thumbsup_tone1:
画像ですが、以下↓
![53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/112ee121-d7db-6aef-42fc-6896f2139b63.png)


が、動作結果を掲載する情報を、前回の投稿にてコメントでお教えいただき、今日それを知ったところですので、これは実装できるようになりましたら、改めて結果のところだけ投稿いたします。
qiitaの仕様をよく読めよって話でもありますが、前回コメントくださった方、いつもありがたい情報ありがとうございます:sob::sob::sob:

以下、今回つまずいた箇所と反省です。
まず参考書の該当ページを読んで確認し、自分なりにコードを書き、ちゃんと動くかを確認し、ダメだったら参考書に戻って再度確認するという風に取り組みました。
![51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/954e4bec-3e50-c42a-1721-0827a03271cb.png)
画像は書いている途中のものですが、こういった感じで[]をつけ忘れていたり、
iteration: Infinity の「I」を小文字で書いてしまっていたので動かなかったりと凡ミスが目立ちました…
スペルミスはありませんでしたが、コンマ１つ付け忘れるだけでもエラーになるので、赤い波線を見つけたら何がダメなのかしっかり確認するようにせねば:confounded:
SSH 各種ファイルの説明

 #  1. SSH クライアント側の設定ファイル

 - ## ~/.ssh/config
SSHクライアント(SSHをする方)の設定ファイル。
ニックネームを使うことで、SSH接続を簡単かつ効率的に行うことができる。

↓中身の書式
 ```
Host <ホストのニックネーム>
    HostName <ホストの実際の名前またはIPアドレス>
    User <ユーザー名>
    Port <ポート番号>
    IdentityFile <秘密鍵ファイルのパス>
    その他のオプション
 ```

↓ 記述例
 ```
# hogeというホストの設定
Host hoge
    HostName example.com
    User your_username
    Port 2220
    IdentityFile ~/.ssh/id_rsa
 ```

↓活用例
```
ssh hoge
```
のように、ニックネーム(呼び名は違うかも？)指定でSSHコマンドを実行できる。


 ※ 参考
 https://qiita.com/passol78/items/2ad123e39efeb1a5286b


#  2. 認証関連ファイル
 - ## ~/.ssh/authorized_keys

生成された公開鍵 (~/.ssh/id_rsa.pub) の内容を接続先サーバーの ~/.ssh/authorized_keys ファイルに追加する。公開鍵認証は、クライアントの秘密鍵とサーバーに配置したこの公開鍵を照合（対になっているか）する。

↓ファイルの内容
```
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArf.... user@example.com
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC.... another_user@example.com
～
```

セキュリティのため、 ~/.ssh/authorized_keys ファイルとその親ディレクトリのパーミッションは以下のようにする
```
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```

<br>

 - ## ~/.ssh/known_hosts
 ~/.ssh/known_hosts ファイルは、SSHクライアントが接続したことのあるサーバーのホストキー情報を保存するためのファイルです。
ホストキーは、サーバーがそのアイデンティティを証明するために使用されるキーです。
known_hosts ファイルにホストキーが保存されることにより、SSHクライアントは次回同じサーバーに接続する際に、そのサーバーのアイデンティティを確認できます。

※ サーバーのアイデンティティとは、サーバーがその正当性を証明し、通信相手（クライアント）がそのサーバーが偽装されたものでないことを確認するために使用される情報のこと

- # known_hosts ファイルの構造
```
hostname,ip_address key_type key
```
例↓
```
example.com,192.168.1.100 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArf... rest_of_the_key
another.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC... rest_of_the_key
```

・補足
ホストキーが変更された場合や、不要なホストエントリを削除したい場合、known_hosts ファイルから該当する行を以下のコマンドで手動で削除できます。
```
ssh-keygen -R example.com
```
AtCoder 勉強記録[C++] その42

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Broken Rounding
[B - Broken Rounding](https://atcoder.jp/contests/abc273/tasks/abc273_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll x, k;
  cin >> x >> k;
  for(int i = 0; i < k; i++){
    ll di = pow(10, i);
    x /= di;
    ll tmp = x%10;
    if(tmp <= 4) {
      x -= tmp;
      x *= di;
    } else {
      x += 10-tmp;
      x *= di;
    }
  }
  cout << x << endl;
}
```
### 解法
四捨五入の操作を実装することで結果が求まる。
## C - Dice Sum
[C - Dice Sum](https://atcoder.jp/contests/abc248/tasks/abc248_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n, m, k;
  cin >> n >> m >> k;
  vector<vector<ll>> dp(n+10, vector<ll>(k+10, 0));
  dp[0][0] = 1;
  ll res = 0;
  for(int i = 0; i <= n; i++){
    for(int j = 0; j < k; j++){
      for(int l = 1; l <= m; l++){
        if(j+l <= k) {
          dp[i+1][j+l] += dp[i][j];
          dp[i+1][j+l] %= mod;
        }
      }
    }
  }
  for(int i = 1; i <= k; i++){
    res += dp[n][i];
    res %= mod;
  }
  cout << res << endl;
}
```
### 解法
数列と`K`に対してDPを用いることで結果が求まる。
## C - Just K
[C - Just K](https://atcoder.jp/contests/abc249/tasks/abc249_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n, k;
  cin >> n >> k;
  vector<string> s(n);
  rep(i, n) cin >> s[i];
  map<char, ll> mp;
  ll res = 0;
  for(int bit = 0; bit < (1<<n); bit++){
    mp.clear();
    ll tmp = 0;
    for(int i = 0; i < n; i++){
      if(bit&(1<<i)){
        for(char const&j: s[i]) {
          mp[j]++;
        }
      }
    }
    for(auto const&[key, v]:mp){
      if(v == k) tmp++;
    }
    res = max(res, tmp);
  }
  cout << res << endl;
}
```
### 解法
bit全探索を用いることで計算することができる。1回のループごとに、文字と出てくる回数を保持するmapを用意することで`K`回出てくる文字の数を求めることができる。
iOSバーコードリーダーの読込範囲指定方法

# はじめに
iOSバーコードリーダーの読込範囲指定をしたかったが、なかなか上手くいかず、
解決するまでに時間がかかったため、読込範囲指定方法についての記事を投稿します。

またソースコードは最低限しか載せていません。
基本的なバーコード読み取り方法に関しては、他の記事を参考にしてみてください。

# 完成図
作成中のアプリにはなりますが、
バーコード読み取り後、楽天APIを叩き、楽天から書籍情報を取得し、表示させています。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/fbb3a7cd-2aea-ac71-0478-77e4bcd9a9fe.gif)

# バーコードリーダーの読込範囲指定方法

### 1. 読込範囲を指定するためのViewを作成

下記画像の通り、captureViewを作成します。

![スクリーンショット 2024-08-05 23.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204266/59734081-dd66-7bc1-4d96-0403e70bb021.png)

### 2. バーコードの検出範囲の指定

下記のような形で、バーコードの検出範囲を指定します。

```swift
// 背面カメラの映像を画面に表示するためのレイヤーを生成
let previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
previewLayer.frame = self.captureView.bounds
previewLayer.videoGravity = .resizeAspectFill
self.captureView.layer.addSublayer(previewLayer)
                        
// 検出エリアの設定
metadataOutput.rectOfInterest = previewLayer.metadataOutputRectConverted(fromLayerRect: captureView.bounds)
```

下記のソースコード部分が重要な部分になります。
検出エリアのy軸がズレる事象は、下記のソースコードのような記載にすることで直るかと思います。
```previewLayer.metadataOutputRectConverted(fromLayerRect: captureView.bounds)```

以上。

# 参考文献
- [QR読込範囲指定](https://qiita.com/moccow/items/e27818b39f1c0cf46354)
【VSCode】パネルをエディタの上に表示する方法

パネル上部で右クリック > パネルの位置 > Topでパネルをエディタの上に表示できます。

![スクリーンショット 2024-08-05 23.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5c8dceaf-16ba-55e4-b042-0f21bef73792.png)

![スクリーンショット 2024-08-05 23.48.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/14ed2265-f757-21bf-94c1-87c2a08cd36c.png)
SAP S/4 HANA 在庫/購買管理（MM）基本知識５：資材所要量計画（MRP）

### 資材所要量計画（MRP）とは
![MRP1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/e673801c-fa8b-c022-4a59-33d6f1f9c369.png)
- 必要なモノを、必要な時に、必要な数だけ揃えておくには、適切な調達計画を立てることが必要です。
- この適切な調達計画をサポートする機能として、MRPを利用します。
- MRPは、何が、いくつ、いつまでに必要かを計算する仕組み（機能）です。

### MRPの方法
![MRP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/5868d14b-b65f-c30c-ea75-69908a27bde0.png)
#### SAP ERPでサポートしているMRPの方法は、大きく分けて2通りあります。
- 1つは、計画主導型で、製品の生産計画をもとに、購入部品・内作部品がいくつ、いつまでに必要かを部品表（BOM）展開して計算する方法です。
- もう1つは、消費主導型MRPです。計画主導型とは異なり、品目の消費にのみもとづいて計算されます。したがって、原則的に、受注、計画独立所要量、出庫予定、従属所要量などの所要データにもとづいて手配データが生成されることはありません。
- 発注点方式では、在庫数量が、品目に対して定義されている発注点を下回っていないか確認され、下回っている場合、手配データを生成します。
- 発注点は、マニュアルで品目マスタに設定する方法（マニュアル発注点）と過去の消費履歴にもとづき需要予測で算出する方法（自動発注点計画）があります。
- 需要予測主導型では、過去の消費履歴にもとづき需要予測を行い、予測数量分発注する方法です。
- 定期発注方式は、発注サイクルに応じて、発注数量を計算します。（この方式も過去の消費履歴にもとづき需要予測を行うことが前提になります。）
- どのMRP方式を採用するかは、品目マスタ MRPビューのMRPタイプで指定します（同じ品目でも異なるプラントでは、異なるMRPタイプを採用することができます）。
- 需要予測を行うことが前提となる「需要予測型」、「定期発注方式」、「自動発注点計画」を使用している事例はほとんどありません。

### 日程計画について
![MRP3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/ce67ff14-eca8-cad0-6c0b-81a06fd91e86.png)
#### 外部調達品に対する日程計画の方法について説明します。
- SAP ERPでは、「購買処理日数」、「納入予定日数」、「入庫処理日数」の3つの要素を考慮して、外部調達品に対する調達リードタイムを計算します。
- 「購買処理日数」は、購買担当者が購買依頼を購買発注に変換するためにかかる日数です。
	プラント単位で設定します。カスタマイズ（パラメータ設定）で定義します。
- 「納入予定日数」は、購買発注を仕入先へ出してから、納入されるまでの日数です。
	品目マスタ、購買情報で定義します。
- 「入庫処理日数」は、納品されてから、品質検査等の作業を経由して利用可能になるまでの日数です。品目マスタで定義します。
- 計画主導型MRPの場合、いつまでに品目が必要かを基準に日程計画を行います。この場合、利用可能日（所要日）から手配を開始するべき日付（つまり、購買依頼を登録しなければならない日付）を計算します。これを逆日程計画と言います。
- これとは反対に、発注点方式の場合、発注点を切った時点から、購買依頼を登録し、各リードタイムを加算して、いつ利用可能になるのかを計算します。これを順日程計画と言います。
AZ-104,AZ-305をそれぞれ一か月で取得した方法

## AZ-104,AZ-305をそれぞれ一か月で取得した方法




### それぞれの資格について
・AZ-104
Microsoft Certified: Azure Administrator Associateとあるように、Azureの運用管理者向けの中級レベルの資格とされている。
Azureの理解や各機能について広く浅く問われる。

・AZ-305
 Microsoft Certified: Azure Solutions Architect ExpertとあるようにAzureのアーキテクチャの構想担当者向けの上級レベルの資格とされている。
Azureを設計する際の事象を問われる。




### 勉強方法
利用したのは主に以下の二つ。

１．Udemyの模擬試験講座
受講生30万講師のAZ-104: Microsoft Azure Administrator模擬試験問題集（400問）
https://www.udemy.com/course/30az-104-microsoft-azure-administrator240/?couponCode=JPLETSLEARNNOW


最短で合格！Azure Solutions Architect Expert AZ-305 試験対策問題集
https://www.udemy.com/course/microsoft-azure-az305-exam/?campaigntype=Search&portfolio=Japan&language=JP&product=Course&test=&audience=DSA&topic=&priority=&matchtype=&gad_source=1&couponCode=JPLETSLEARNNOW


これら二つの講座は無心で解きまくります。
各テストごとで出題される問題に関しては順番は変われども、問題は変わらないので回数をこなすとなれます。
最初の数回はわからない単語や仕組みの理解のために時間がかかりますが、理解が進むと30分もかからないです。

こちらの問題集は次の教材に移るまでに90%以上とれるようになっていたと思います。



２．公式サイトの練習問題
https://learn.microsoft.com/ja-jp/credentials/certifications/azure-administrator/?practice-assessment-type=certification


https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-305/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824874/f7f91f5b-8e9b-a93b-e761-2b1980f6577f.png)




画像はaz-305のものです。
画像下部の"無料の練習用評価を受ける"から進みます。


個人的な体感の話ですが、こちらの問題のほうが実際の試験に近い気がしました。
おそらくUdemyの問題のほうはテスト内容の更新に準拠していないところもあるからだと思います。
主観的な話にはなってしまいますが、問題の種類が80問ほど存在して、テスト一回ごとに50問くらいが選ばれていた気がします。


一問一答で数問ずつ取り組むことができるので、電車移動の際に進めてました。


テスト前日までにはこちらの教材も90%以上とれるようになっていたと思います。





## 個人的な感想


上記で説明した内容のものを進めておくと時間に関しては問題ないです。


ほかの講義動画や書籍も軽く触れてみましたが、上記の二つの教材で足りるので他の教材は必要ないと思います。


比較的、難易度が高い資格とされていますが、模擬試験を繰り返し解くことで難なく合格できると思います。


また、AZ-900なる資格があります。
これはAZ-104の下位にあたる資格です。
取得しておくとAZ-104.AZ-305の取得がスムーズになるとは思いますが、受験料が安くはないのでご自身の懐事情と相談して進めてみるといいと思います。
難易度でいうとAZ-104,AZ-305に比べると簡単です。



これから受験される方はぜひ頑張ってください。
【学習記録　2024-08-05】JavaScript

## 使用教材
Udemy「超JavaScript完全ガイド 2024」

## 学習内容
### 学習時間：0.5h
- 配列の内部的な処理

#### 学習メモ
配列は内部的にオブジェクトを生成している。
具体的には添字をキーに要素を値に設定する。この処理を要素数の回数分行う。
加えて、オブジェクトの最後にlengthという要素数を値として持つプロパティを追加する。
このオブジェクトはArray.prototypeを配列のプロトタイプにしている。
```diff_javascript
const fruits = ["apple", "banana"];
const fruits = {
		0: "apple",
		1: "banana",
		length: 2,　// 要素数
		__proto__:Array.prototype,
}

/* ------------------------------------------------ */

// 内部的には上記の処理と全く同じ
const arrayLikeObject = {
    0: "apple",
    1: "banana",
    lenght: 2,
};
arrayLikeObject.__proto__ = Array.prototype;
```

生成したオブジェクトが配列かどうかを見極める方法はArray.isArray()を使用する。
```diff_javascript
Array.isArray(fruits);　         // true
Array.isArray(arrayLikeObject);  // false
```

## 所感
　配列生成時にどのような処理をしているのかを理解することができました。普段なんとなく使ってる配列も蓋を開けてみたらただのオブジェクトだったことの驚き🙃
 　今日は30分しか学習できなかったのでもっと時間を増やしたい！！
Docker memo



## command
### Dockerイメージをビルド
docker build -t techtrends -f Dockerfile .

### Dockerコンテナを起動（ホストのポート3112を使用）
docker run -d -p 3112:3111 techtrends

### 実行中のDockerコンテナを確認
docker ps

### 特定のコンテナのログを表示（<CONTAINER ID>を実際のIDに置き換えてください）
docker logs <CONTAINER ID>

### リアルタイムでログを表示（<CONTAINER ID>を実際のIDに置き換えてください）
docker logs -f <CONTAINER ID>

## 用語

### docker cache
ビルド時間の短縮のために使われるcache
--no-cache オプションを使えばcacheを使わずにビルドできる

### base image
DockerfileでFROM <image>で指定されているimage
ビルド時間の短縮ができる
<registry_path>/<repository_name>:<image_tag>
で指定できる

### docker ignore file

.dockerignore ビルドに含めたくないものを指定できる
センシティブな情報や開発環境特有の設定などを含めたくないときなど


### Arguments & Variables

Arguments is set on build time
Variables is set on run time

* argiuments
`docker build --build-arg key=value .`
* variables
`docker run -e key=value <image_name>`

### docker desktop

Windows & Macのためのdockerコンテナ管理ツール
docker daemon, docker CLI, docker composeを含む。
requirements.txtの簡単作成方法

# はじめに
皆さん、仮想環境を構築しなおして以前のプロジェクトと同じライブラリを用意したいけど、「どのライブラリインストールしてたっけ…」「バージョンなに使ってたっけ…」などという悩みはありませんか？
私はあります。
ちょうどなったばかりなので、備忘録として記録したいと思います。
同じ悩みの方にも是非参考にしていただければと思います。

# requirements.txtを作ろう
皆さんはrequirements.txtファイルを作成する際はどのように作成していますか？
私は、力技大好きなので手書きで記入していました。
しかし、調べているとやはり便利なライブラリや方法がありますね。
その中でもいいなと感じたものをまとめたいと思います。

## pipreqs
まず一つ目に紹介するのが、`pipreqs`というライブラリです。
```
pip install pipreqs
```
でインストールするだけで使用できます。
使用方法ですが、まずはプロジェクトディレクトリに移動します。
```
cd /path/to/your/project
```
そして、以下のコマンドを実行します。
```
pipreqs . --force
```
プロジェクトディレクトリ内のファイルでインポートされているライブラリをrequirements.txtに書き込んでくれます。
`--force`オプションはファイル内でインポートしたライブラリが変更された際に、requirements.txtを上書きするためのオプションです。
これで、プロジェクトで使用しているライブラリを管理することができますね！

## pip freeze > requirements.txt
次に紹介するのは以下のコマンド
```
pip freeze > requirements.txt
```
こちらのコマンドは現在使用している仮想環境でインストールされたすべてのライブラリをrequirements.txtに書き込むことができます。
要するに`pip list`で表示されるライブラリを管理できるということですね。
こちらも大変便利かと思います。
先ほどの`pipreqs`と違って、仮想環境は同一だけどプロジェクトを複数動かしているという時に、プロジェクトを跨いだライブラリの管理が可能になります。

単一のプロジェクトでのライブラリ管理は`pipreqs`、仮想環境毎でのライブラリ管理は`freeze`コマンドといったところでしょうか。

いずれにせよ、どちらも便利なので覚えておいてよさそうです。

# まとめ
いかがだったでしょうか。
requirements.txt作成するの面倒くさい！！！という方はコマンドを叩くだけで作成し、管理することができるので是非お試しください。
それでは！！！

### 参考記事
https://qiita.com/neko-kamaboko/items/2d59022bbc7e314f1f11
Next.js×Rails詳細画面を作る

https://qiita.com/gabakugik/items/5dc1d9ba087d657873b6
前回の続きで詳細画面を作っていこうと思います。(next.js+rails+mysql)

```backend/app/controllers/todos_controller.rb

class TodosController < ApplicationController
    
    def index
        # 日付が新しい順に10件まで取得する
        @todos = Todo.all.order(created_at: :desc).limit(10)
    
        render json: @todos
    
    end
    
    def show
    
        @todo = Todo.find(params[:id])

    render json: @todo
    end
   end

```

```/frontend/app/todos/[id]/page.tsx

"use client";

import { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
import useSWR from 'swr';
import Link from 'next/link';
import Todo from '@/components/Todo';
import { TodoType } from '@/types/Todo';
import axios from 'axios';

// Fetcher function for SWR
const fetcher = (url: string) => axios.get(url).then(res => res.data);

// Todo詳細ページを表示するコンポーネント
const TodoDetail = ({ params }: { params: { id: string } }) => {
  // ルーティング情報を取得する
  const router = useRouter();
  const { id } = params;

  // SWRを使ってデータを取得する
  const { data: todo, error } = useSWR<TodoType>(id ? `http://localhost:3000/todos/${id}` : null, fetcher);

  // エラーが発生した場合の処理
  if (error) return <div>Failed to load</div>;

  // Todoを取得中の場合は「Loading...」を表示する
  if (!todo) return <div>Loading...</div>;

  return (
    <div className="flex justify-center items-center">
      <div className="flex flex-col space-y-6 w-3/4 max-w-lg pt-10">
        <label className="block text-xl font-bold text-gray-700">Todo</label>
        <Todo todo={todo} />
        <div className="flex justify-end">
          <Link
            href="/"
            className="mt-auto font-medium text-blue-600 hover:bg-blue-300 focus:outline-none"
          >
            Back
          </Link>
        </div>
      </div>
    </div>
  );
};

export default TodoDetail;

```

これでdocker-composeを行い、localhost:3001するとデータが表示されるのでそれをクリックして詳細画面が出るはずです。