OmniAICreator/Qiita-1.07M huggingface dataset:
数学_Q17

## 考察
交換の積が交換可能というお題から
単位行列周りの話であろうとは推察がつく。
生真面目に要素定義しての演算は凹む、３分で行けるのか？

## コードで解決
```python
# 変数定義
a, b, c, d = symbols('a b c d', real=True)
x_1, x_2, x_3, x_4 = symbols('x{1:5}', real=True)

# 行列定義
A = Matrix([
    [a, b],
    [c, d],
])
X = Matrix([
    [x1, x2],
    [x3, x4],
])
display(A, X)

# 条件
eq = Eq(A*X, X*A)
display(eq)

# 解答
print(f'計算結果')
solve(eq, (a, b, c, d))
```
![Screenshot from 2023-01-09 10-57-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/8dc10a3d-1d40-2181-b5d3-259d72cd7210.png)

## 結果から考察
この計算結果をそのままでは解答にならない。
任意の $ \displaystyle x1〜x4$ で成り立つというところから条件を絞り込む。

得られた２つ目の条件式から 
$ \displaystyle b = A*c (ただしA=\frac{x2}{x3}) $
であるが、
$ \displaystyle x3\neq0$ のときこの式が成立するのは
$ \displaystyle b = c = 0 $ しかない。
この時
$ \displaystyle a = d  $ となる。

$ \displaystyle x3=0$ のとき
同様に計算して
```python
# 行列定義
A = Matrix([
    [a, b],
    [c, d],
])
X = Matrix([
    [x1, x2],
    [0, x4],
])
display(A, X)

# 条件
eq = Eq(A*X, X*A)
display(eq)

# 解答
print(f'計算結果')
solve(eq, (a, b, c, d))
```
![Screenshot from 2023-01-09 11-10-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/b121b985-c881-957f-9d79-e09ee234eddf.png)

１つ目の結果から任意の $ \displaystyle x1〜x4 $ で成立するのは
$ \displaystyle b = 0 $ しかない。
この時
$ \displaystyle a = d  $ となる。

いずれの場合も
$ \displaystyle a = d, b= c=0  $ となる。
数学_Q16

## 考察
複素数を要素に含む $ \displaystyle ３☓３ $ の行列
固有値算出

det計算を行う、計算間違えやすい。

## コードで解決
sympyには行列演算メソッドが提供されているので使ってみる。

```python
# 行列定義
A = Matrix([
    [0, 1-I, 1],
    [1+I, 0, 1-I],
    [1, 1+I, 0]
])
display(A)

r = symbols('r', real=True)
B = r*eye(3)

display(B)

# 固有値計算定義
eq = Eq((A-B).det(), 0)

print(f'固有値算出 問題文から結果をSortする')
display(solve(eq))
r1, r2, r3 = sorted(solve(eq))
print(r1, r2, r3)

print(f'解答')
print(r1/2 + r2/3 + r2/4)
```

良さげ
![Screenshot from 2023-01-09 10-23-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/0c88b3c1-0cc2-0423-545a-9ccb845f488f.png)

## 別解
元の行列から直接固有値を算出するメソッドあり。

```python
# 別解
# 固有値算出を直接元の行列から
print(f'別解：直接固有値算出')
display(sorted((A).eigenvals()))
```
結果表示がなんだかわかりにくいけど
固有値算出ができている。
![Screenshot from 2023-01-09 10-41-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/57744b51-ca4c-663e-a100-16c3a4921f38.png)
数学_Q15

## 考察
簡単な行列の演算。
暗算でもできるけどちょっとめんどい。


## コードで解決
```python
# 行列定義
A_plus_B = Matrix([
    [2, 2],
    [-3, 3]
])
A_minus_B = Matrix([
    [4, 2],
    [1, -3]
])

display(A_plus_B)
display(A_minus_B)

# A,Bを算出
A = (A_plus_B +  A_minus_B)/2
display(A)
B = (A_plus_B - A_minus_B)/2
display(B)

# ABを算出
print(f'解答')
display(A*B)
```
よさげ


![Screenshot from 2023-01-09 09-42-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/7ba6b91a-5c26-ef70-0985-c14557e60387.png)

## 別解
数学_Q14

## 考察
２次導関数を持って三角関数。
おそらく２回微分でぐるっと回って何かが見えてくる・・・はず。

$ \displaystyle f(x) = \int_0^xf(t)sin(x-t)dt + ax + b $

手計算だと２階微分するために１階微分を経由せねばならぬのだけど
sympyなら直接２階微分が可能というメリットあり。

あと $ \displaystyle x = 0 $ の条件をうまく使う必要ありそう。

## コードで解決
途中まではコードで算出できるけど
途中で人間の思考が必要となっている。

```python
# 変数定義
x, t, a, b = symbols('x t a b', real=True)

# 関数定義
f = Function('f')
f = integrate(f(t)*sin(x-t),(t, 0, x)) + a*x + b
display(f)

# いきなり２階微分（１階微分をはしょる）
f.diff(x, 2)
```
![Screenshot from 2023-01-08 23-42-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/6506c571-f7a9-bcad-6326-09c27144e8da.png)

つまり
$ \displaystyle f'' (x) = f(x) + \int_0^xf(t)sin(t-x)dt $
なのだけど行き詰まる。

２階微分→循環の観点で、もとの　$ \displaystyle f(x) $ を眺めてみると
$ \displaystyle \int_0^xf(t)sin(t-x)dt = -f(x) + ax + b $
であることに気づく、これを得られた結果に代入すると

$ \displaystyle f'' (x) = ax + b $
となる・・・なんと。たぶんこれはsympy単発では得られないと思われる。

```python
# 改めて f''を定義
f2 = a * x + b
display(f2)

# 不定積分のCが省略されている・・・
C1, C2 = symbols('C1 C2', real=True)

# f'を求める
f_1 = integrate(f2, x) + C1
display(f_1)

# fを求める
f_0 = integrate(f_1, x) + C2
display(f_0)

# C1とC2を求める
display(f_1.subs(x, 0),  f.diff(x).subs(x, 0))
display(f_0.subs(x, 0), f.subs(x, 0))
```
計算過程の３つ目の結果から
すでに選択肢は絞れるものの、C1とC2も求める。

計算結果から $ \displaystyle C1 = a, C2 = b $

![Screenshot from 2023-01-08 23-50-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/2f06448b-ce40-4d9a-7ade-3087f0b42fd5.png)

よって解答は以下となる。

$ \displaystyle f(x) = \frac{a}{6}x^3 + \frac{b}{2}x^2 + ax + b $
数学_Q13

## 考察
段々と計算量が重苦しい問題出現。。。

- 置換積分
- 部分分数分解

計算量多め、３分では対応できない可能性高い
$ \displaystyle S = \int_0^1 \frac{6}{(e^x+1)(e^x+3)}dx $

## コードで解く
なんとこれはコードは容易に、そして一発（厳密には。。だけど）
```python
# 変数定義
x = symbols('x', real=True)

# 関数定義
f = 6 / ((exp(x) + 1)*(exp(x)+3))
display(f)

# 積分演算
integrate(f,(x, 0, 1))
```
$ \displaystyle \log(4) $が $ \displaystyle 2\log(2) $になっていないけど、まあ良しとする。解答選択肢の中にそれらしきものがある。

![Screenshot from 2023-01-08 21-12-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/de184648-0310-0d05-2955-8530d0c6fa64.png)

さらに結果をまとめることもできるが
解答選択肢にはない

```python
# 更に計算
simplify(integrate(f, (x,(0,1))))
```
![Screenshot from 2023-01-08 21-15-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/5f08b072-ac2b-4043-37bb-d8f8da6e75bd.png)
数学_Q12

## 考察
logの減算、まとめてlimitが推察できる構成にすればOK

## コードで解決

```python
# 変数定義
n = symbols('n', real=True)

# 関数定義
f = log(n + 100, 10) - log(1000*n + 1, 10)
display(f)

# 極限値計算 ∞は `oo`で表現・・・
limit(f, n, oo)
```
よさげ
![Screenshot from 2023-01-08 20-54-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/92cb5e4c-3328-c009-8a87-cdd12e99557b.png)
数学_Q11

## 考察
三角形頂点から垂線をおろしてそのベクトルを表現する話。
頂点の角度は120°

## コードで解決
文字をベクトルで表現する方法がわからず。
直交座標は定義できるが、内積を取れば当然0に。
この課題はそうではない。。。

一発で解答にたどり着く定義方法がわからず。
なので計算過程ではsympyを使いつつ解を求めてみる。
調査は継続。

```python
# まず条件から内積を算出
import numpy as np
a = 6
b = 7
dot_ab = a * b *np.cos((4/3)*np.pi)
dot_ab
```
![Screenshot from 2023-01-08 18-32-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/18abd036-9fa0-d61a-b33d-63a6602be51f.png)

```python
# 続いて OH ⊥ ABから条件式定義
# 手作業でdot計算した結果を定義
l = symbols('l', Rational=True)
eq1 = Eq(-(1-l) * 36 + (1-2*l) *int(dot_ab) + 49*l, 0)

display(solve(eq1, l)[0])
display(1 - solve(eq1, l)[0])
```
![Screenshot from 2023-01-08 18-34-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/5d088f6b-9a02-7942-97c3-8e33abd3b0c6.png)

## 結果
$\displaystyle \vec{OH} = \frac{70}{127}\vec{a} + \frac{57}{127}\vec{b} $
DBの接続情報をApp.configで指定する

DBの接続情報をハードコードしていたため、App.configで指定する方法に変更した。

使用ツール：
SQLServer
## 指定方法

ソリューションエクスプローラーから**App.config**ファイルを開く。

\<configuration>\</configuration>
の中に、以下の設定を記述していく。
```App.config
<connectionStrings>
    <add name="sqlsvrconnect"
    connectionString="Data Source=Db12345;User Id=hoge;Password=pass;Initial Catalog=DBNAME"
    providerName="System.Data.SqlClient"/>
</connectionStrings>
```
<記述情報に関する説明>　SQLServer接続時に入力する情報をそのまま記述する
**Data Source** = サーバ名(S)
**User Id** = ログイン(L)
**Password** = パスワード(P)
**Initial Catalog** = 使用したいデータベース名

## 指定した設定の取得方法

**必要なusing記述**
```c#
using System.Configuration;
```
※using System.Configurationの記述だけでうまくいかない場合、ソリューションエクスプローラーにある参照を右クリックして、参照の追加を選択。
System.Configurationを検索して、チェックボックスにチェックを入れると使用できるようになる。
#### App.configで指定した接続文字列を取得する
[]の中にはadd nameで指定した名前を入れる。
```c#
string connStr = ConfigrationManager.ConnectionStrings["sqlsvrconnect"].ConnectionString;
```

### おまけ
ハードコードで接続文字列を書く場合
```c#
string connStr = @"Data Source=Db12345;User Id=hoge;Password=pass;Initial Catalog=DBNAME";
```
<br>
【iOS】【AWS】はじめての個人アプリ(iOS+AWS)で開発からリリースまでやった話（苦戦あり）

## 概要
　2023年1月1日に、はじめて個人アプリをリリースしたので
　開発からリリースまで苦労だらけだったので
　同じようなところに苦戦するような人がいたり、参考になれば嬉しいです。
　今回は全体感の話なので細かいところは別記事で追記していこうと思います。

## なぜ個人アプリを作ろうと思ったのか
　コロナで１週間何もせず寝込んでいた時に
　よく使っていたアプリ自体の更新が止まっていて不便な思いをしたので
　自分で新しいアプリを作ろうと思ったのがキッカケ

## どういうアプリを作りたかったのか
　FF14のまとめ記事と動画などを検索せずに見れるアプリ
　最新情報が探しづらいし情報が古かったりするから最新情報だけ欲しいアプリを目指す。
　![アプリレビュー説明資料.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215997/7cf71fe5-538b-1523-4a20-bf5b55a9ea05.png)

## バックエンド AWS開発編 (試しながら1〜2週間)
　バックエンドは全く知識がない状態からのスタートでAWSを採用。
### 当初の設計
　　**AWS採用サービス：Lambda, RDS, API Gateway**
　　1. node.jsのLambda関数を作成し、インターネット経由でrssデータを入手してRDS(DB)に保存する
　　2. API GatewayでRDS経由でデータを整形してjsonを返す

:::note warn　　
**上記の設計は挫折。**
- インターネットを許可した状態のLambda関数でRDSへのアクセスが簡単にできなかった
- RDSの無料の枠を超えそうだった（そんなに使ってないと思うのになぜ・・）
:::

### 設計の見直し
　　**AWS採用サービス：Lambda, S3, API Gateway**
　　1. node.jsのLambda関数を作成し、インターネット経由でrssデータを入手してS3(json)に保存する
　　2. API GatewayでS3経由でjsonを返す

:::note warn　　
　　S3であればjsonを直接書き込んで保存して参照するだけでできた！
　　（開発の内容に関しての記事は別記事予定）
:::

## iOSアプリ開発編 (4〜5日)
- タブで切り替えられてサクサクアクセスできるシンプルなアプリ
- ダークモード対応は自身が開発したことなかったので絶対やりたかった
- アプリアイコン作成
- AppStore用のスクリーンショット作成
### iOSアプリ採用技術
- SwiftUI
- SFSafariViewController (WKWebviewめちゃ遅かったため・・)
- AWS SDK
- Google AdMob
- Firebase Analytics
- Firebase Messaging


## iOSアプリ審査通らない編 (2週間)
　レビューに出すも厳しい審査を乗り越えた話(**別途記事予定**)
　**レビュー指摘！** このリジェクトで震える開発者がいるようだ・・
> 4.2 Minimum Functionality でリジェクト
　https://developer.apple.com/jp/app-store/review/guidelines/

### 初期の機能
- AWSからjson取得してニュース記事、動画一覧をリスト表示してリスト選択でwebview表示する
確かにアプリとしてはクソと言われたらそうなんだけど
バックエンドで情報を集約ことに１番の意味があり、アプリの機能を言われてもな・・

### 審査通すためにやったこと
Webで検索して同じ境遇の方々の知恵を拝借して何度もトライ
　・アプリがユーザーに対してこんな嬉しいことがあるよアピール
　　 → **ダメ** (ガイドライン4.2.2の指摘)
　・ローカルプッシュ対応
　　 → **ダメ** (ガイドライン4.2.2の指摘)
　・お気に入り
　　 → **ダメ** (ガイドライン4.2の指摘)
　・絞り込み機能
　　 → **ダメ** (ガイドライン4.2の指摘。まだまだ足りないと言われた。足せばいけるのか？)
　・シェアボタン、閲覧履歴、リモートプッシュ
　　　　→ **成功(一気に３機能足したら審査通った！！)**
　
　結局機能を追加しないとダメそうだった

　レビューが１日１回で戻されるたびにへこむ日々が続いたけど
　でも結果としてアプリとして良くなった気がする・・！

## あとがき
それぞれの開発のポイントは別の記事で書いていこうと思います。

## 開発したアプリ
https://apps.apple.com/app/id1660703416
三角関数「岡山理科大学2008年第１問」をwolframalphaとsympyでやってみたい。

tan(θ)=-1/2のとき、....

オリジナル

https://mathmathmass.exblog.jp/32739301/

上と同じです。大学入試数学問題集成＞
未登録
岡山県

https://mathexamtest.web.fc2.com/daigakubetumj/index.html#okayama

# wolframalphaで

tanθ=-1/2,(sinθ-cosθ)/(sinθ+cosθ),1/(1+cosθ)+1/(1-cosθ)

https://www.wolframalpha.com/input?i=tan%CE%B8%3D-1%2F2%2C%28sin%CE%B8-cos%CE%B8%29%2F%28sin%CE%B8%2Bcos%CE%B8%29%2C1%2F%281%2Bcos%CE%B8%29%2B1%2F%281-cos%CE%B8%29&lang=ja

代入
(sin(θ) - cos(θ))/(sin(θ) + cos(θ)) = -3, 2 csc^2(θ) = 10
csc(x)は余割関数です。

# 参考
これらは順に余割関数 (cosecant function)、.....＜wikipediaより

https://ja.m.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0#%E5%8D%98%E4%BD%8D%E5%86%86%E3%81%AB%E3%82%88%E3%82%8B%E3%82%82%E3%81%AE

google 検索より

https://www.google.com/search?q=%E4%BD%99%E5%89%B2%E9%96%A2%E6%95%B0&oq=%E4%BD%99%E5%89%B2%E9%96%A2%E6%95%B0&aqs=chrome..69i57.2195j0j7&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8

# sympyで

```python
from sympy import *
var('θ')
mySubs={θ:solve(Eq(tan(θ),Rational(-1,2)),θ)[0]}
print("#",((sin(θ)-cos(θ))/(sin(θ)+cos(θ))).subs(mySubs))
print("#",( 1/(1+cos(θ))+1/(1-cos(θ))     ).subs(mySubs).simplify())
# -3
# 10
```

# sympyで(half=Trueでできませんでした。)
わかられる方教えてください。よろしくお願いします。

```python
from sympy import *
from sympy.simplify.fu import TR2i
from sympy.abc import x, a
from sympy import sin, cos
var('θ')
print("#",TR2i(sin(θ)/cos(θ)))
print("#",TR2i(sin(θ)**2/(cos(θ) + 1)**2      , half=True))
print("#",TR2i((sin(θ)-cos(θ))/(sin(θ)+cos(θ)), half=True))
print("#",TR2i( 1/(1+cos(θ))+1/(1-cos(θ))     , half=True))
# tan(θ)
# tan(θ/2)**2
# (sin(θ) - cos(θ))/(sin(θ) + cos(θ))
# 1/(cos(θ) + 1) + 1/(1 - cos(θ))
```
参考 TR2i

https://docs.sympy.org/dev/modules/simplify/fu.html#rules
Web ブラウザで文字列を Data URL に変換する

備忘録。

## ASCII 文字のみの場合
``` js
function stringToDataURL(str) {
  return "data:text/plain;base64, " + btoa(str)
}
```

``` js
stringToDataURL("Hello, World!") //=> "data:text/plain;base64, SGVsbG8sIFdvcmxkIQ=="
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16369/3cf66a09-e269-d674-36f2-a694839cbacc.png)

## (2023.01.12 追記) マルチバイト文字を含む場合
btoa を使うやり方だとマルチバイト文字が含まれている場合にエラーが出てしまうとコメントでご指摘いただいた。その場合は Blob に変換してから FileReader の readAsDataURL を使ったほうが良さそう。(こちらは非同期関数になるが)

``` js
function stringToDataURL(str, type = 'text/plain;charset=utf-8') {
  return new Promise((resolve, reject) => {
    const fileReader = new FileReader()
    fileReader.addEventListener('load', () => resolve(fileReader.result))
    fileReader.addEventListener('error', () => reject(fileReader.error))
    fileReader.readAsDataURL(new Blob([str], { type }))
  })
}
```

``` js
const dataUrl = await stringToDataURL("あいうえお") //=> "data:text/plain;base64,44GC44GE44GG44GI44GK"
```
Minecraft Dynmapで統合版と疑似クロスプレイでのプレイヤーアイコン表示【備忘録】

# なにが起こったか
Java EditionとBedrock Edition(以下統合版と記載)でマイクラを楽しくクロスプラットフォームプレイ。
Dynmapを見てみると統合版の友人のプレイヤーアイコンが以下のようになっている。なんで？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/970058/af09fbe0-dfb0-0eef-87a2-0cbc370441c0.png)


# 使用プラグイン
一部
* Dynmap
* GeyserMC
* Floodgate
* GeyserSkinManager

# 原因　 Player ID
プレイヤーIDの前に"."がついている。これにより登録されるプレイヤーの顔アイコンが隠しファイル状態となってしまう。
隠しフォルダにはアクセスできず、結果よくわからないのが出てきている。

※　**.MAMEGIKA**みたいになっていた。上記画像はJAVA版での再現のため"."は出ていない

### 解決方法

**Floodgate**のconfigファイル(config.yml)の以下パラメーターを変更
##### Befoer
```YAML:config.yml
username-prefix: "."
``` 
##### After
```YAML:config.yml
username-prefix: "BE_"
```

変更後、サーバー再起動で適用。
これで少なくともスティーブアイコンが表示されるように。
~~でもスティーブじゃ物足りないよな~~

# MAP上のアイコンのカスタマイズ
統合版ユーザースキンを拾って来る方法がわからなかったので、ゴリ押しで好きな画像を表示させます。
~~DiscordSRVは統合版のスキンアイコン表示できてる、なんで？~~
小規模サーバーなので手作業で行っています。大規模だと代案を検討したほうがいいかも。

初期状態だと~~たぶん~~画像をはめ込んでも更新されてしまうので、**Dynmap**のコンフィグを設定します。
```yaml:configuration.txt
# Control updating of player faces, once loaded (if faces are being managed by other apps or manually)
refreshskins: false
```
Skinが自動で更新されないように設定を変更します。

`マイクラ置いてるサーバー/plugins/dynmap/web/tiles/faces/32x32`
あとは上記フォルダに32×32のping画像を **{playerID}.png**の形式で置いておきましょう。
ex) `MAMEGIKA.png`

16×16ではDynmapの横にある画像を変更できます。
16×16の画像を用意し、上記の手順でできます。

~~8×8って何に使われてるんだろう……不明~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/970058/f3a0ba80-e6e9-bf12-4d77-2dbcc8c68b9c.png)
#### やったね！
結構ちいさいのでパッと見で何かわかるくらいの大きさの画像がいいかも。
画像サイズの変換には[iloveimg](https://www.iloveimg.com/ja/resize-image/resize-png)さんを使用させていただきました。
【JavaScript】現在時刻のyyyy-mm-dd hh:mm:ss の文字列を作成

使用する機会があったのでメモです。
`yyyy/mm/dd hh:mm:ss`の記事は見かけたのですが、`yyyy-mm-dd hh:mm:ss`の記事は少なく…
`getMonth()`をつなげる方法だと「5月」とか1桁しか取れないし、ライブラリも使いたくない。

```js
const date = new Date();
date.setTime(date.getTime() - date.getTimezoneOffset() * 60 * 1000);
const str_date = date.toISOString().replace('T', ' ').substring(0,19);
console.log(str_date); // 2023-01-07 12:01:43
```

追記:
@ss8826 さんよりコメント欄にてより良い書き方を教えていただきました。
ありがとうございます！


以下のサイトにお世話になりました。

## 参考

https://dev.matumo.com/1019/

https://k-sugi.sakura.ne.jp/javascript/5472/
Raspberry PiからMacにファイルを転送するときの備忘録

# 1. 概要

Raspberry PiをMacからSSH接続して操作しています。

https://qiita.com/Tokoroteen/items/54c035ebe25b6d7b42fd#5-ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8B

ラスパイからMacにファイル転送するのどうやるんだっけとなってしまったので忘れないようにメモしておきます。

# 2. scpコマンド
Macのターミナルから
```
% scp [ユーザー名]@[ホスト名]:[転送したいファイルのパス] [Macでファイルを受け取りたいフォルダのパス]
```
で転送できます。

今回は、ラズパイのデスクトップにある`items.txt`をMacのカレントディレクトリ(`.`)に転送したかったので、

```
% scp pi@raspberrypi.local:/home/pi/Desktop/items.txt .
```
とし、
```
pi@raspberrypi.local's password: 
```
求められたパスワードを入力すればOK！
What's New from CircleCI - 2023/01/10

CircleCIに関する最近1週間(2023/01/04~10)くらいの情報のまとめを始めてみました。
今回のCircleCIのセキュリティインシデントでは、トークンの無効化、ローテーションといった作業や、(詳細な情報がお届けされていない時点での)社内での説明などにお時間をいただき、また、ソーシャルメディアでの弊社情報の拡散や、ブログ等でのツール、作業内容の共有をいただき、CircleCIをご利用いただいている皆さまに感謝申し上げます。

なお、弊社からの最新の情報は、
- 日本語: [CircleCI セキュリティアラート: CircleCI 内に保存されているシークレットのローテーションをお願いいたします](https://circleci.com/ja/blog/january-4-2023-security-alert/)
- 英語: [CircleCI security alert: Rotate any secrets stored in CircleCI](https://circleci.com/blog/january-4-2023-security-alert/)

にて公開・更新いたしております。

[＜ What's New from CircleCI - 2023/01/04](https://qiita.com/CircleCIJapan/items/c6ee8a331c6c1a073a63) | 今週 | [What's New from CircleCI - 2023/01/17 ＞](https://qiita.com/CircleCIJapan/items/caaae20095932043a0ce)

---
# CircleCI 定期メンテナンスのお知らせ
CircleCIでは日本時間 2023/01/22(日) AM 2:00~2:30 の間、定期メンテナンスを実施します。
詳しくは、こちらの CircleCI Discuss の記事をご覧ください。

## CircleCI Discuss
- [日本語アナウンス](https://discuss.circleci.com/tag/ja-%E6%97%A5%E6%9C%AC%E8%AA%9E)
    - [定期メンテナンスのお知らせ 2023年1月22日 午前 02:00~02:30 (日本時間)](https://bit.ly/3Cxcxnx)        
---
    
# ユーザーブログ・スライド
- [CircleCIのセキュリティインシデント（2023/1/4）に対応した話](https://qiita.com/blue32a/items/493784e8ca7c3f4481fb) by [a.okui](https://twitter.com/blue32a_jp) さん
- [[CircleCIのセキュリティインシデント対応] Railsのmaster keyをローテーション(再生成)する](https://qiita.com/tikaranimaru/items/3026d58d88f1cd8b4f40) by @tikaranimaru さん
- [CI/CDサービスのOpenID Connect対応 Dive Into](https://kouki.hatenadiary.com/entry/2023/01/08/000000) by [こーき](https://twitter.com/kouki_dan) さん

# CircleCI 公式ブログ
- [Blogs in English](https://circleci.com/blog/)
    - [CircleCI security alert: Rotate any secrets stored in CircleCI](https://circleci.com/blog/january-4-2023-security-alert/)
- [日本語ブログ](https://circleci.com/ja/blog/)
    - [CircleCI セキュリティアラート: CircleCI 内に保存されているシークレットのローテーションをお願いいたします](https://circleci.com/ja/blog/january-4-2023-security-alert/)
        - 【ツール】[CircleCI-Env-Inspector](https://github.com/CircleCI-Public/CircleCI-Env-Inspector)


# Changelog (更新履歴)
- クラウド版の更新履歴: https://circleci.com/ja/changelog/
    - 12/21 [Android の cimg イメージとマシンイメージの 12 月度アップデート](https://circleci.com/ja/changelog/#android-の-cimg-イメージとマシンイメージの-12-月度アップデート)
- サーバー版の更新履歴: https://circleci.com/ja/server/changelog/
- セルフホストランナーの更新履歴: https://circleci.com/ja/changelog/self-hosted-runner/
- プロダクト ロードマップ(英語:今後の提供予定機能): https://circleci.com/ja/product-roadmap/

# YouTube (動画コンテンツ)
- [CircleCI チャンネル (日本語)](https://youtube.com/playlist?list=PL9GgS3TcDh8x71MTG2uvZ-ljhIkuveSHZ)
    - [CircleCI スタートガイド](https://youtu.be/vk5N3P-tMzo)
- [CircleCI Channel (English)](https://www.youtube.com/c/CircleCI-Videos)

# CircleCI Knowledge Base
- [CircleCI ナレッジベース (日本語)](https://support.circleci.com/hc/ja)
- [CircleCI Knowledge Base (English)](https://support.circleci.com/hc/en-us/)
    - [Rotating Secrets for January 4th Incident](https://support.circleci.com/hc/en-us/articles/11816211460891-Rotating-Secrets-for-January-4th-Incident)
    - [How to run a job in the background on CircleCI](https://support.circleci.com/hc/en-us/articles/11775183948827-How-to-run-a-job-in-the-background-on-CircleCI)
【Rx】前のObservableの値を後続のObservableに渡して一本化する 

## はじめに

Reactive Extension(C#)で、Observable同士の合成の方法で少してこずったのでメモします。

## やりたかった事
あるObservable(A)が返した値を次の引数を受け取るObservable(B)に渡して、(A)と(B)を一つのObservableとして扱うという事を実現したかった。
具体的に言うとAccess Tokenを返すObservableからAccess Tokenを取得し、それを引数としてUser Nameを返すObservableに渡す、というような流れを一つに合成したいと思いました。

## 合成なしの例
データ取得する上で以下のようなRepositoryがあるとします。

'''

        public class AuthRepository 
        {
            private readonly static string _accessToken = "your access token";

            public IObservable<string> GetAccessTokenObservable()
            {
                // AccessTokenを発行
                return Observable.Return(_accessToken);
            }

            public IObservable<string> GetUserNameObservable(string accessToken)
            {
                if (accessToken == _accessToken)
                {
                    // 発行したAccessTokenと同じ値ならUserNameを返す
                    return Observable.Return("your name");
                }
                else 
                {
                    return Observable.Return("anonymous");
                }
            }
        }

'''

``GetAccessTokenObservable()``でAccess Tokenを取得します。
``GetUserNameObservable(string)``にAccess Tokenを渡してUser Nameを取得します。
一連の処理を合成なしにひとまとめに書いたら以下のようになると思います。

'''

            var repository = new AuthRepository();
            repository.GetAccessTokenObservable()
                      .Subscribe(x =>
                      {
                          repository.GetUserNameObservable(x).Subscribe(y =>
                          {
                              Console.WriteLine("User Name:" + y); // 適当に出力
                          });
                      });

'''

これでも一応AccessTokenを取得して、それを利用してUserNameを取得するという目的は達成できるのですが、OnErrorなどの処理を加えようとすると二重に記述することとなり面倒です。
Subscribeを二重に行う事によりIDisposableが二重に発行されてしまうのも管理が面倒となるポイントだと思います。

## 合成

結論から言うと以下のやり方でIObservableの一本化ができました。

'''

            repository.GetAccessTokenObservable()
                      .Select(x => repository.GetUserNameObservable(x))
                      .Merge()
                      .Subscribe(x => Console.WriteLine("User Name:" + x));
            

'''
流れとしては
1. ``GetAccessTokenObservable()``でAccessTokenを取得
2. ``Select()``で``GetUserNameObservable()``に値を渡し``IObservable<IObservable<string>>``に変換
3. ``Merge()``で``IObservable<string>``に変換
4. ``Subscribe()``で購読

となってます。
``Select()``を行った時点では値は``IObservable<IObservable<string>>``となってますので、その後``Merge()``で``IObservable<string>``に変換する必要がある、という所がちょっとつまずいたポイントでした。

参考
Reactive Extensions再入門 その４０「IObservableの合成はじめました」https://blog.okazuki.jp/entry/20120218/1329581391
Pythonでwindowsのコンソールの×ボタンを無効化する

https://stackoverflow.com/questions/29269436/disable-close-button-of-console-window

```
pip install pywin32
```

```python
import win32console, win32gui, win32con
hwnd = win32console.GetConsoleWindow()
if hwnd:
   hMenu = win32gui.GetSystemMenu(hwnd, 0)
   if hMenu:
       win32gui.DeleteMenu(hMenu, win32con.SC_CLOSE, win32con.MF_BYCOMMAND)
```
Dockerが初心者過ぎて

Dockerが初心者過ぎて・・・

Docker でBuildする
Dockerでupする
コンテナの中に入る！！！←この概念がなかった！！！

現在Docker上でLaravelの構築をしているのですが、何もわかっておらず
コンテナに入らず
```
php artisan make:migration create_posts_table --create=posts
```
↓
エラー

の繰り返しでした。
助かりました。今日の発見。
Backlogのgitでソースを管理する

# 要件
Backlogにソース管理のgitがついているが、どうやって運用できるか。
・ソースバージョンを管理する
・課題と自動関連する
# 分析
AzureのDevopsとGitHubのパイプラインがあるので、CI/CDができますが、Backlogにパイプラインがないです、ソースコントロースしかできないです。
参照：　https://qiita.com/richard_hcq/items/b82d801cb2ec42709e5b

# 実現
①ローカルのgitとBacklogのgitをつなぐ
	プロジェクトの直下
・	git remote add origin https://ncast.backlog.com/git/Prjxxx/Prjxxx.git
・	git pull		
		※　初回目に認証画面が出る（backlogのid,passwordを入れ）	
・	Branchの確認		
	$ git branch -a		
	  remotes/origin/develop		
	  remotes/origin/master		
・	作業ブランチを作成		
	git checkout -b develop origin/develop		
		※　初回目にローカルと矛盾のファイルがある場合、ローカルファイルを削除する	
②作業したソースをコミットする
・	開発環境と繋ぎ、修正テストを行い	
・	修正完了あとにGitに追加する	
	例	xxx.page
　git add force-app/main/default/pages/xxx.page	
	※バックスラッシュ
　コミットするとき、課題Noをメンションする	
　git commit -m "modified for 課題No NNN-YYY "	
　※複数行のコメントの場合
　　①　複数-m 例 git commit -m "xx1" -m "xx2"
　　②　変数　例　git commit -m << EOF
　　　　　　　　　　xx1
　　　　　　　　　　xx2
　　　　　　　　　　EOF

③BacklogのgitにPush
	 git push origin develop

結果確認：
今回のサンプルページxxx.pageが自動的に課題のコメントに追加されて、差分も見れます。
Firebaseいいね！と思ったけど、今やRailsを検討している件

以前firebaseよりもAmplifyがいいよね！
なんてタイトルで記事を書いたところ、思っていたよりも多くの方に読んでいただけて
本当にありがとうございます。

https://qiita.com/toto_inu/items/77e31e92f908a1fda8f7

しかし…

実は私、Firebaseをプロダクト利用したことありません！
ごめんなさい！！🙇‍♂️
（記事上もAmplifyに偏った記事であることは明記してますが…比較しているかのような紛らわしいタイトルでした）


そんなわけで、今回個人開発することを機にFirebaseを使ってみようと走り出したわけですが
1か月後にはRailsに乗り替えを検討しはじめている、と。

その変遷を軽くお話できればと思います。

:::note info
今開発しているサービスに少しでも気になった方は、是非こちらの記事をお読みください！
筆者が泣いて喜びます。
『[MokuPa](https://mokupa.com/)』
:::

https://note.com/oztoto/n/n44f7991fcc80



## Amplify × GraphQLこそ至高… 紀 🐚

Amplifyは本当に便利です。
はじめて触ったサーバーレスサービスがこれでしたが、
慣れたAWSのサービスたちが、Terminal上から対話形式でポチポチするだけで立ち上がる様に感動した覚えがあります。

さらに、REST/GraphQLを選択もできて…
**GraphQLならローカルでモックサーバー（FirebaseのEmulatorと一緒）を立ち上げることができるので、サクサク開発できます。**

詳しくは是非こちらの記事をご覧ください。

https://qiita.com/toto_inu/items/77e31e92f908a1fda8f7

## Firebaseもええじゃないか 紀 🦖

さて、今回触り始めたFirestoreでしたが
非常に開発体験は良かったです！

何よりFirebase内のサービスについて、エミュレーターを立ち上げることができるのです！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156985/46ba27e9-2a14-860d-9572-b1d588514ba9.png" width="800px" />

立ち上げるコマンドは以下の通りです。

`firebase emulators:start --import fire_emu_dump --export-on-exit`

※ 指定したオプションは以下の通り
`--import`: 指定したフォルダ配下のdumpファイルを読み込む
`--export-on-exit`: emulatorを閉じるときに、authやstoreなどのデータを**dumpしてimportに指定したフォルダに出力**

基本emulatorに保存したデータは揮発性ですが、dumpファイルの読み込みはき出しが可能なので問題ありません。

https://firebase.google.com/docs/emulator-suite

## やっぱりSQLが欲しい 紀 🚶

しかし…

その開発体験にワクワクしても、どうしても許せないことがありました。

それは、**複数クエリ（不等号系）を発行できないこと**です。
イベントテーブルから、開催中のイベントを取得するために `start_time <= now && end_time > now` みたいな条件でイベントを取得してきたいことがありました。

しかし、どうやってもfirestoreではできない…と。
ありえない！！！みんなどうやって開発してるんだ！！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156985/63cf53e5-bef4-2126-b97d-d8afe55c0d0c.png" width="400px" />

:::note info
[2023/01/10 追記]
@kontikunさんのコメントより、補足頂きました。
以下のやり方であれば、色々と工夫できそうです！！
- 不等号ではなく==で絞り込めるカラムを設ける → これである程度取ってくるデータ数を絞る
- その上で、**複雑な絞り込みはフロントで行う**

（Firebase愛も伝わってきますので、是非コメント原文をご覧ください😇）
:::


:::note warn

あと細かいですが、firestoreの更新条件（セキュリティルール）に
バリデーションを書く記事をしばしば見かけましたが、2テーブル追加したら100行を超えました。
:::

そういった経緯があり、今ではRailsでの開発にいそしんでいます。
時間がさえあればElasticSearchをキャッチアップして頑張りたかったのですが、悔しい限りです。



## 乗り越えるべき壁


今回は特に、サクッとリリースまで行きたかったので
ぶつかった壁に対して新しいチャレンジ（特にドキュメント少なもの）は、減らしました。

しかし、今後も機会を作って何とかサーバーレスを攻略しに行きます。
せっかくの**開発体験**と**コストカット**を手放すなんて、実にもったいないですからね。

そこで、今後乗り越えるべき壁について記して終わりにしようかなと思います。



- Amplify × GraphQL : **cloudformationを理解する**
- Firebase : **Firestoreを使わない or ElasticSearchと併用**


### 壁1: Amplify × GraphQL

触っていたのが1年ほど前なので、変わってるかもしれませんが
GraphQLはリゾルバー（RailsでいうControllerみたいなもの）をカスタマイズするときに、**「Amplifyが生成したごちゃっとしたCloudFormation」をいじる必要があった**と記憶してます。

このあたりを慣れていくのが大事かなと。
※ 筆者は`CloudFormation`への苦手意識が並みではない。

変わってたり違ったら教えてください。

また、このあたりは最近再開した **AWS Loft tokyo**にいけば相談に乗ってもらえそう。

https://aws-startup-lofts.com/apj/loft/tokyo


### 壁2: Firebase

今回躓いたFirestoreの制限は本当に驚きでした…
NoSQLゆえの躓き、SQLが恋しくなること必至です。

解決するには、いずれかかなと。

- 別途RDB(CloudSQL, RDB,...)を用意して接続しにいく
- ElasticSearchを活用する

いずれにしても、Firebaseで感動したEmulatorの機能は
DBについてはオフにして、DBをローカルで準備することになるとは思います。


## さいごに

言い訳がましくなんども書いてしまいますが、時間がなく
自分の狭い知識範囲で技術選定をしています。

**他に良い対策方法などあれば、是非気軽にコメントください！！**
（いいね！だけでも言っていただけると泣いて喜びます）
今日起ったtomcatがらみの障害

## これ何
今日お昼ご飯食べられなかったので。

## 何が起ったの
午前中画像とかアップロードできなくなった。

## 原因は
tomcat上で運用されているSpring Bootのサーバでtempが溢れた。

## 問題の説明

tomcatにはデフォルトで動的に書き込まれるディレクトリが２つあります。
一つは `logs`、もう一つは `temp`。
workやwebappsも動的といえば動的だけどある程度以上膨れることはないので除外します。

`logs` はアプリケーションのログ(catalina.out) とかアクセスログ(access_log.txt)とかもろもろ吐かれるところ。
１日に１回程度cronか、log appenderによるローテーションがかかるように設定するのがセオリー。

`temp` はjavaのテンポラリディレクトリのことで、tomcatではデフォルトここに置かれるというもの。
さまざまなライブラリが一時保存先として利用している。
つまり、javaをつるしで起動すると `/tmp` になるし、tomcat上でなにもしないと `$TOMCAT_HOME/temp` になる。変更可能。

問題はこの一時保存のファイルのライフサイクルにあります。
ここで作ったファイルのライフサイクルはアプリケーションに依存しており、ルールとしては、強いていえば**テンポラリファイルを使ったら消しておこうね**くらいの勢いであるため、消されずにそのままにしてしまうことがたまにある。
ただ、javaのvm終了時にまとめて消すとかいう `File.deleteOnExit()` というのもあるんですが、どうやら今回はこれを使っていても、２０８日間連続起動というちょっとびっくりな時間起動しているtomcatであったため、仮にこの実装をやっていても意味はなかった。

なので、tomcatに限らずjavaのプログラムだと意図して消すような対策をとっていなければ、消さない限りは残り続ける仕様です。

では、消さないと何が起こるか・・・そう、Disk Fullである。

## 問題点

画像ファイルのアップロードは近年大きいと10MiBの写真がぽいぽい投げられるのが普通になっており、一昔前の写メールかっこわらいのノリでいると痛い目を見る。
dockerのコンテナとかデフォルトでは２０GBしかファイルシステム割り当てられないので、デプロイせずに連続稼働しているとヤバいことになるケースもあると思うし、サードパーリー製の某みたいなのは頻繁にテンポラリファイルを生成しては消ししているのでお気をつけ遊ばせ！

今回は 80GiBを200日くらいで使い潰したので、約0.4Gib/dayで増えていったんですね・・

昔私もやったことあるから直接は言わなかったですが、政治的な事情で申し上げることができないことがいくつかあったのでここでいいます！！

アプリケーション側の問題点は下記の２つ。

1. 使い終わった一時保存として書き込んだファイルが放置されているか先述のvm依存になっている
1. ファイルが書き込めなかった時のエラーハンドリングが雑
    1. DBに行が残り、ファイルの実体がない状態

インフラ側の問題点
1. ディスクフルを検出できなかった

## 対策は？

政治的な事情もあるので月１でインスタンスをローテーションしましょう、です。

## 障害対策を完走した感想
古傷を抉られるのは誰しも痛いもので、この件に関しては私は優しかったと思います。

## 参照

File.deleteOnExit() の詳細はこちら。
https://stackoverflow.com/questions/16691437/when-are-java-temporary-files-deleted

Javaのテンポラリフォルダの説明など
 https://codechacha.com/ja/java-get-temp-dir/
Rails7にてesbuildとtailwind使用時にカスタムCSSを導入するには

## 前提となる使用技術
- Rails7
- jsbundling-rails with esbuild
- cssbundling-rails with tailwind

## 話したいこと
cssbundling-railsにてtailwindモードを利用している場合、`application.tailwind.css`の内容をバンドルして`app/assets/builds/application.css`にまとめてくれる。しかし、初期状態では例えばオリジナルであなたが`app/assets/stylesheets`配下に新たに`custom.css`を追加して`application.tailwind.css`に`@import 'custom'`としてもオリジナルのcssファイルを読み込むことはできない。

ref: [github cssbundling-rails](https://github.com/rails/cssbundling-rails#how-do-i-import-relative-css-files-with-tailwind)

> If you want to use @import statements as part of your Tailwind application.js file, you need to configure Tailwind to use postcss and then postcss-import. But you should also consider simply referring to your other CSS files directly, instead of bundling them all into one big file. It's better for caching, and it's simpler to setup. You can refer to other CSS files by expanding the stylesheet_link_tag in application.html.erb like so: <%= stylesheet_link_tag "application", "other", "styles", "data-turbo-track": "reload" %>.


```css:application.tailwind.css
@tailwind base;
@tailwind components;
@tailwind utilities;
@import 'custom' // custom.cssを読み込もうとしても読み込めない
```

そこで本記事では、上の技術スタックの時に、いかにしてtailwindとオリジナルCSSを両立させるかを話したい。
また、本記事は[Setup TailwindCSS and esbuild on Rails 7](http://www.ahmednadar.com/posts/setup-tailwindcss-and-esbuild-on-rails-7)を参照している。

## なぜ読み込めないか、どのように解決するか
cssbundling-railsのtailwindモードを利用している時、nodeベースのtailwindCSSはcssbundling-railsによって提供されているのだが、このcssbundling-railsがデフォルトではcssのインポートを許容していないからである。  
そこで、postcssを使ってこの問題を解決することができる。

## ステップ
### 1. postcssとその関連ライブラリのインストール

```shell:terminal
> yarn add postcss postcss-flexbugs-fixes postcss-import postcss-nested 
```

### 2. postcss.config.jsファイルを作成&編集

```shell:terminal
> touch postcss.config.js
```

```js:postcss.config.js
module.exports = {
  plugins: [
    require('postcss-import'),
    require('tailwindcss'),
    require('autoprefixer'),
    require("postcss-nested"),
    require("postcss-flexbugs-fixes"),
  ]
}
```

### 3. `app/assets/stylesheets/application.tailwind.css`を編集

```css:application.tailwind.css
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
/* app components */
@import './custom.css';
```

以上のステップであなたが作成したオリジナルのCSSもバンドルされてbuilds配下の`application.css`にまとめられて、CSS適用が可能になるはずである。

ありがとうございました！
zlibjsでGZIP形式で圧縮されて返却されたレスポンスデータを取得

APIで返却されるデータが大きすぎてAWSの制限に引っかかってしまう
とのことで、base64でエンコードしたファイルを gzip で固めて返却するから
と言われたので、そこからデータをごにょごにょして取得する方法のメモ

以下のライブラリを使用

https://github.com/imaya/zlib.js/


パッケージインストール
```
yarn add zlibjs
```


インポートする
今回は解凍だけでよいのいで以下のみをインポートした
```
import { Zlib } from "zlibjs/bin/gunzip.min.js"
```


処理概要
```
const res = await axios.get(url, {
  params: {
    compress: 1,
  },
})

const compressed = res.data.compress // 圧縮されたデータが格納されている

// BASE64デコード
const b64Decoded = new Uint8Array(
  [...window.atob(compressed)].map((s) => s.charCodeAt(0))
)

// 圧縮データを展開
const gunzip = new Zlib.Gunzip(b64Decoded)
const decompressed = gunzip.decompress()

// バイナリ（Uint8Array） を文字列に変換
const output = JSON.parse(new TextDecoder().decode(decompressed))
console.log(output)
```
Javaのレコードクラス

# 記事の目的
DDD（ドメイン駆動設計）では値オブジェクトはイミュータブルであることが求められる。
エンティティオブジェクトも可能であればイミュータブルとすべきである。

レコードクラスはイミュータブルであることが強制できるので、DDDと相性が良い。

DDDに限らず、オブジェクト指向でプログラミングするのであれば、予期せぬオブジェクトの状態変化でつまらないバグにハマることも無くなるので、オブジェクトは極力イミュータブルになるようにしたほうが良いと思っている。

世の中にはクラスに無条件かつ盲目的にgetter/setterをつくる思考停止なプログラミングが溢れていて、Lombokのようなライブラリがそのような悪いプログラミングの量産に拍車をかけている気がする。
「Lombokイコールすべて悪」とは言わないが、なぜそのフィールドがprivateなのか、本当にsetterが必要なのかを考えること無く、なんとなく動く（だけど危うい）プログラムがラクに書けてしまうので、少なくとも自分の携わるプロジェクトではLombokは利用禁止にしている。

Java16から正式実装されたレコードクラスを積極的に使うことで、少なくともイミュータブルであることが保証できるし、Lombokのようなライブラリを使わなくても、言語レベルでシンプル且つ安全なクラスが作れるようになったのでこの記事で基本的な書き方を扱う。

### レコードクラスの効能
- フィールドが `private final`で強制されオブジェクトがイミュータブルになる
- コンストラクタ、toString、equqls、hashCode 各メソッドが自動実装されコードがシンプルになるため、本当に必要な業務ロジックに注目できる


# 前提
Java16以降（Java14でプレビュー版）

# 本題
一般的なValueObjectを従来のクラスとレコードクラスそれぞれで書いてみる

## 普通のJavaクラス
```java
import java.util.Objects;

public final class Title {

    private final String value;

    public Title(String value) {
        this.value = value;
    }

    public String value() {
        return value;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (obj == null || obj.getClass() != this.getClass()) return false;
        var that = (Title) obj;
        return Objects.equals(this.value, that.value);
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }

    @Override
    public String toString() {
        return "Title[" +
                "value=" + value + ']';
    }
}
```

### 上記と同義のレコードクラス
超シンプルになる
```java:
public record Title(
    String value
) {
}
```

### コンストラクタの上書きもできる
```java:
public record Title(
    String value
) {

    public Title(String value){
        this.value = value + "hoge";
    }
}
```

### Bean Validationもできる
```java:
import javax.validation.constraints.NotEmpty;

public record Title(
    @NotEmpty(message = "タイトルを入力してください")
    String value
) {
}
```

### 勿論メソッドも実装できる
```java:
public record Title(
    String value
) {

    public int length() {
        return this.value.length();
    }
}
```
phpmyadminでCSVインポートをする

## phpmyadmin(データベース)に事前に用意したテーブル情報を登録したい
今回トレーニングデータをまとめたテーブル情報をスプレッドシートにまとめており、
それを使ってphpmyadminに登録していきます。

### テーブル情報をまとめたファイルをCSVにダウンロードする
![スクリーンショット 2023-01-08 19.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/c4b00f2a-fc88-4c01-7c79-daaf88770a76.png)

画像のようにCSVにダウンロードしていきます。
Macの場合Finderに保存されるので確認もしておきましょう。

### Finderに保存されたCSVファイルをテキストエディタに置いてあげる
![スクリーンショット 2023-01-08 19.46.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/c93cf09a-db88-0841-d4d3-0a0eaea1f668.png)

この作業をしないと後ほどインポートの際に *CSV 入力のカラム数が不正です (行: 1)。* というエラーが発生してしまいます。
エクセルでCSVファイルを作るとBOMっていうのが各文字に追加されていてうまくインポートできないという理由らしく、エディタに保存してそれをインポートしてあげることで可能となります。

### phpmyadmin上でインポート作業を行う
![スクリーンショット 2023-01-08 19.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/fae6ee7d-ed17-f835-0f25-fdbc9967ab46.png)

インポートするテーブルを指定したうえで画面上部にあるインポート画面を押下する。

### ファイルを選択し実行ボタンを押下
![スクリーンショット 2023-01-08 19.30.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/863d1b9b-50ca-bc75-ce6c-fed9ca72bd13.png)

FinderのデスクトップやダウンロードフォルダにあるCSVファイルではなく
先程保存したソースコードを書いているフォルダの中にあるCSVファイルを選択しましょう。
でないと、先程言ったエラーが発生します。

![スクリーンショット 2023-01-08 19.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/c7a1a0f3-6c32-dd31-02eb-37a42c86c805.png)

これでインポートが完成します。

![スクリーンショット 2023-01-08 19.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589286/91037f8b-e02f-ef2b-01ce-3641466032ae.png)

## 重要なこと
スムーズにインポートできるかなと思ったのですが、意外と落とし穴があり時間をかけてしまいました。
2つ意識して取り組んでいけば問題なくインポートまでたどり着けるかと思います。

#### ① テキストエディタに保存したものをインポートすること
先程も書きましたがエクセルでCSVファイルを作るとBOMっていうのが各文字に追加されていてうまくインポートできないという事象が起こります。
一度テキストエディタを経由することでこの問題を回避することができるようになります。
必ずエディタに一度保存をし、そのファイルをインポートするようにしましょう。

#### ② phpmyadminとCSVファイルのカラムの数をあわせる
CSVファイルでは各カラムを区切る際カンマを使って区切られます。
お互いのカラム数が一致しないとエラーが起きインポートすることができなくなってしまいます。

今回引っかかってしまったのが、
created_atとupdated_atに関してです。
CSVファイルには最初そのカラムを気にせずにいたのですが、その2つのカラムも意識した上で書いてあげることが必要でした。
今回はその2カラムにNULLとすべて記載をして回避することができました。
最後の行なので空欄だとだめっぽいので、NULLなど記載し回避することをおすすめします。


## まとめ
今回ですが、このような形でphpmyadminを使ってCSVファイルをインポートするやり方を選択しましたが、
もともとはmysqlを使ってCSVファイルをインポートするつもりでした。

ですが、エラーに阻まれてしまい泣く泣く今回のやり方でインポートすることにしました。

今回うまく行かなかったmysqlを使ったインポートもできるようにして
記事としてあげていけたらいいなと考えております。

以上です!
【Ruby】Array.newを迂闊に使ってはいけないワケ...


(これに2時間気づかず時間を浪費した腹いせに、記事を書いています。)

# 配列内のオブジェクトを1つだけ変更したつもりが全部変わっている罠

```ruby
nested_array = Array.new(2, [])
pp nested_array
# [[], []]
```

なんてことはない、二重配列ですね。この1つ目の子ども配列に適当な値をpushしてみます。

```ruby
nested_array = Array.new(2, [])
pp nested_array
nested_array[0].push('テキスト')
pp nested_array
# [[], []]
# [["テキスト"], ["テキスト"]]
```

ちゃんと1つ目の子ども配列を指定したにも関わらず、両方の子ども配列に要素が追加されてしまいました。

### Array.newで複数作るオブジェクトは同じオブジェクトとして扱われる

```ruby
nested_array = Array.new(2, [])
pp nested_array[0].object_id
pp nested_array[1].object_id
# 60
# 60

text_array = Array.new(2, 'テキスト')
pp text_array[0].object_id
pp text_array[1].object_id
# 70
# 70
```

こんなふうに、Array.newで作られるオブジェクトは同じオブジェクトIDを持ちます。したがって、破壊的変更をどちらかで行うと、見かけ上すべてのオブジェクトが変更されるというカラクリでした。

:::note info
公式ドキュメントより
new(size = 0, val = nil) -> Array
長さ size の配列を生成し、各要素を val で初期化して返します。

**要素毎に val が複製されるわけではないことに注意してください**。全要素が同じオブジェクト val を参照します。後述の例では、配列の各要素は全て同一の文字列を指します。
:::

```ruby
text_array = Array.new(2, 'テキスト')
text_array[0].concat('を破壊的に変更')
pp text_array
# ["テキストを破壊的に変更", "テキストを破壊的に変更"]
```

~~初期値が必要で、かつ配列内のオブジェクトは別々のものとして扱いたい場合、おとなしく順番に詰め込んでいきましょう。~~
→こういった場合のセオリーをコメントにて教えていただきました。

*こういうケースではArray.newにブロックを渡すのが定石です。*

```ruby
nested_array = Array.new(2) { [] }

pp nested_array
#=> [[], []]

nested_array[0].push('値')
pp nested_array
#=> [["値"], []]

```

公式ドキュメントでも以下のように記載があります。


:::note info
new(size) {|index| ... } -> Array
長さ size の配列を生成し、各要素のインデックスを引数としてブロックを実行し、各要素の値をブロックの評価結果に設定します。

**ブロックは要素毎に実行されるので、全要素をあるオブジェクトの複製にすることができます。**
:::
【2023年1月】コマンドが一切わからなくてもGitHubが使えるようになる「GitHub Desktop」

# 何の記事か
GitHubに超苦手意識があった自分が、GitHubをそれなりに使えるようになったツール「GitHub Desktop」の簡単な使い方をまとめた記事です。
コマンドを一切知らなくても、pushとかpullとかの操作ができるという素晴らしいツールになっています。

# 使い方
### Clone
予め作成したリモートレポジトリをローカルにクローンする操作です。GitHub Desktopを開いて、「File」から「Clone repository」をクリックします。
![clone1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/03b9cbb3-77fc-eebf-4629-0c154e93d58a.png)
すると、クローンしたいレポジトリを選択でき、クローンするローカルパスも指定できます。すごく便利。
![clone2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/88c47cd7-12de-870a-3583-f0bf344976f7.png)

### Branch
作業ブランチに関する操作。私がGithubのコマンドを苦手になった原因。``checkout``とかよくわかりません。でもGithub Desktopなら...
![branch1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/22bda6c0-7c26-9ae5-615d-2d9af73dd7c6.png)
branchを選択してクリックするだけで簡単にブランチが切り替わります。「New branch」を押せば新しいブランチが誕生します。すごく便利。

### Commit、pull request
ローカルの変更をリモートに反映する操作。こちらも非常に簡単にできます。まずはVisual Studio Codeから、変更した内容をローカルにコミットします。「Source Control」メニューから、コミットしたい変更をステージングして、Commitボタンを押します。
![commit1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/090ccdef-7d5c-504d-0831-36c7c7c1e049.png)
そうすると、Github Desktopがコミットを読み取り、それを元レポジトリにPushするボタンを作ってくれます。
![commit2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/74ed788d-ceed-5045-479d-7555793d1c9f.png)
「Push origin」をクリックすると、自動的にPull Requestを作ってくれます。
![commit3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/f262c7a4-c9d9-2778-f891-c3b3cbf9e8da.png)
「Create Pull Request」をクリックして、Pull Request作成ページで作成すれば終了。すごく便利。
![commit4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/d65aecdb-014a-5e06-f163-25a6c4bef0f6.png)


### fetch
元レポジトリをローカルに引っ張ってくる操作。一瞬で終わります。まず「Fetch origin」をクリックします。
![fetch1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/e5793914-6873-0662-ce7a-3a1e10a7b2db.png)
あとはBranchメニューから、「Update from main」をクリックします。「Successfully merged ...」みたいなメッセージがGithub Desktopの真ん中あたりに表示されれば成功です。
![fetch2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665102/12f351f7-fbbf-a82d-cfb9-96d6783b0b85.png)

# まとめ
コマンドにはもう戻れませんなこりゃ。
【Moment.js】日付と時間を合体させるには？

# はじめに
JavaScriptで日付の操作といえばMoment.js

https://momentjs.com

Moment.jsで**別々の変数として存在する日付（YYYY-MM-DD）と時間（HH:mm）を合体させるにはどうしたらいいでしょうか？**

※Moment.jsのインストールなどの環境構築はこの記事では省きます

# 普通に文字列連結みたいな感じで合体できました

```javascript
function compareDateApply(workDate, workTimeFrom) {
  console.log(workDate) // 2023-01-12
  console.log(workTimeFrom) // 15:00:00
}
```

👆のようなコードがあったとして
`workDate`（YYYY-MM-DD）と`workTimeFrom`（HH:mm）を合体して「**2023-01-12 15:00:00**」にするにはどうすればいいか？

```javascript
function compareDateApply(workDate, workTimeFrom) {
  console.log(workDate) // 2023-01-12
  console.log(workTimeFrom) // 15:00:00
  const workDateAndTime = moment(workDate + ' ' + workTimeFrom)
  console.log(workDateAndTime.format('YYYY-MM-DD HH:mm')) // 2023-01-12 15:00
}
```

文字列連結のように`+`で繋げること合体させることができるようです。


ちなみに`workDate + ' ' + workTimeFrom`で間に`' '`で余白を作らないと`workDateAndTime`がInvalid dateとなって正常に読み込まれないので要注意です！:pray:

# 参考

https://stackoverflow.com/questions/42404507/moment-js-concatenate-date-and-time
複数の資源を設定する書き方

```xml
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Themes/BureauBlue.xaml"/>
                <ResourceDictionary>
                    <local:Enum2BooleanConverter x:Key="Enum2BooleanConverter"/>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
```
mpc-be で映像と音声が絶妙にズレちょる時の調整方法

[mpc-be](https://sourceforge.net/projects/mpcbe/) と言うマルチメディアプレーヤがフリーソフトで公開されてるのじゃが、コンテンツの中や再生環境によっては絶妙に映像と音声がズレて再生されてしまうのじゃが、これを快適にズレを修正して再生する方法を書き留めておく。

mpc-be のバージョンは 1.6.5.3 を対象にしているけぇ、之より古かったり新しくなって項目が移動されたり無くなったりしてもワシは知らんけぇ、差異が新しいバージョンで見つかった場合にはリプおねしゃすm(__)m

表示→オプション→音声→サウンド処理
![リップシンク2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152444/265eb863-846a-2222-2f13-2cee49340e82.png)
![リップシンク3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152444/81a84971-4ccd-23ca-66e3-721ee65c7edd.png)
音声のタイムシフトにチェックして、
音声が映像より進んでいる場合はマイナス記述で遅延させる間隔をミリ秒単位で指定して、
音声が映像より遅れている場合は遅延させる間隔をミリ秒単位で指定する。

マイナス記述で本来のタイミングよりも指定時間分遅れて音声を再生されることを意味しちょる。
また、その逆は指定時間分進めて音声が再生されると言う事じゃ。
[PowerShell] ファイルの更新日時/作成日時を取得/変更する

# 結論
PowerShellからファイルの更新日時・作成日時を取得・変更できる。
ファイルのパーミッションによっては管理者権限での実行が必要なので注意。

## 取得
```PowerShell
(Get-ItemProperty target.txt).CreationTime # -> 2023年1月1日 12:00:00
(Get-ItemProperty target.txt).LastWriteTime # -> 2023年1月1日 12:00:00
```

## 変更
```PowerShell
Set-ItemProperty target.txt -name CreationTime -value '2023/01/01 12:00:00' # 作成日時
Set-ItemProperty target.txt -name LastWriteTime -value  '2023/01/01 12:00:00' # 更新日時
```

# 参考文献
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/get-itemproperty?view=powershell-7.3

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/set-itemproperty?view=powershell-7.3
【備忘録】React(Next.js)でゲームを作ろう

# React 360(旧 React VR)とは
React 360（リアクト スリーシックスティ）は、Meta(旧 Facebook)社が開発したVRアプリケーションフレームワーク。
React 360を使うと、Reactを使用してウェブブラウザ上で実行するVRコンテンツを開発できる。React自体はJavaScriptを使ってウェブアプリケーションを作るためのライブラリだが、React 360はReactを使って360度空間のUIを実装するためのライブラリ。

# 【悲報】Githubリポジトリがarchiveになってた
2022年11月にReact 360のリポジトリがアーカイブになってた。メンテする気ないんだね。。
https://github.com/facebookarchive/react-360

# React公式サイトにチュートリアルを発見
三目並べゲームのチュートリアルがある。
https://ja.reactjs.org/tutorial/tutorial.html#completing-the-game

Next.jsで作った方がいたので参考にした。
https://devlog.neton.co.jp/develop/react/react-tutorial/
UnityプロジェクトからApplovinSDKを完全削除する

メディエーションをMAXからAdmobに乗り換えるときにAppLovinのプラグインがなかなか取れなかったので、メモ。入れてる時は更新作業めっちゃ楽だったんですけどね。

まずXcodeでTargetのUnity-iPhone>Build PhasesおよびUnityFrameWork>Build Phasesから、　AppLovin関連の項目を全部削除。

UnityでApplovinセッティングウィンドウ開いていれてたadapterを全部ゴミ箱、Applovin　ad Viewをオフ
UnityでAppLovinおよびMAXで検索かけて関連ファイルを全部削除。

Podfileから'AppLovinSDK'とかアダプターの行を全部削除

以上が終わってから、いつも通りUnityからAppendでiosプロジェクトを吐かせる

XcodeでAppLovinおよびMAXで検索かけて関連ファイルを全部削除

これで正常に実機ビルドできれば削除完了。

作業にするまえにバックアップは必須。
【JavaScript】タブメニューの作成

# 1日1UI投稿！
本日も投稿します。


# タブメニュー
完成品はこちら。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="jOpBVjV" data-user="ri-tama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ri-tama/pen/jOpBVjV">
  Untitled</a> by ri-tama (<a href="https://codepen.io/ri-tama">@ri-tama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


## 苦戦続きの毎日です。
プログラミングの勉強は暗記するものじゃない！って思ってやっておりますが
CSSとかは暗記しなければ...と思い始めております(多少暗記した方が慣れもはやいような)


## わからなかった所やポイント

```css

.menu{
    list-style: none;
    display: flex;
    margin:0;
    padding:0;
}
```

初歩的な部分ですが、list-style:none;でリストにした・←これを無くせます。
またdisplay:flex;で要素を横並びにできます(親要素限定)


```css
.menu li a{
    text-decoration: none;
    display: inline-block;
    text-align: center;
    padding:5px 10px 0 5px;
    color: #333;
    border-radius: 4px 4px 0 0 ;
}
```

text-decoration:none;で、aタグで囲まれた部分の下線を消せます。
またaタグはインライン要素となっていますので、display:inline-block;とすることで
幅や高さの設定ができるようになります。

```css
.menu li a:not(.active):hover{
    opacity: 0.5;
    transition:opacity 0.5s;
}
```

初めて使ったCSSですが、notを付けることにより、activeが付いていないタグにカーソルを乗せると
透過するという処理です。

```js
  menuItems.forEach(clickeditem=>{
        clickeditem.addEventListener('click',e =>{
          e.preventDefault();
          menuItems.forEach(item=>{
            item.classList.remove('active');
          });
          
          clickeditem.classList.add('active');
```

classListから最初にactiveクラスを取り除き
クリックしたものだけにactiveクラスを付与するという処理です。


本日はここまでです。今日も引き続き勉強していきます。
最後まで読んでいただきありがとうございました！


参考↓

https://dotinstall.com/
(リンクだけです) 「整式 多項式 違い」を調べました。

https://biz-journal.jp/2023/01/post_331344.html


「単項式の次数」と「整式の次数」の定義をそれぞれ述べなさい．

オリジナル

なお，２０２２年の新課程の教科書では，”整式”という言葉はあまり使わず，”多項式”という言葉に置き換わっています。＜

https://mathmathmass.exblog.jp/32154200/

上と同じです。大学入試数学問題集成＞【1】

https://mathexamtest.web.fc2.com/2022/202210762/2022107620100mj.html

# 大学入試問題(M.E.T.A.様の内部検索)
整式

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E6%95%B4%E5%BC%8F&oq=%E6%95%B4%E5%BC%8F&gs_l=partner-web.3..0i512l10.3079.12456.0.12933.24.24.0.0.0.0.158.2601.3j21.24.0.csems%2Cnrl%3D10...0....1j4.34.partner-web..0.24.2599.HYg3YYe-9No

多項式

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E5%A4%9A%E9%A0%85%E5%BC%8F&oq=%E5%A4%9A%E9%A0%85%E5%BC%8F&gs_l=partner-web.3..0i512l8j0i7i30j0i7i30i625.210101.216861.0.219041.13.13.0.0.0.0.164.1446.0j13.13.0.csems%2Cnrl%3D10...0....1j4.34.partner-web..0.13.1443.22ABHOUknnI

# 大学入試問題(kamelink様の内部検索)
整式

https://www.google.com/search?q=site%3A%2F%2Fkamelink.com+%E6%95%B4%E5%BC%8F&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fkamelink.com+%E6%95%B4%E5%BC%8F&aqs=chrome..69i57j69i58.14765j0j4&sourceid=chrome&ie=UTF-8

多項式

https://www.google.com/search?q=site%3A%2F%2Fkamelink.com+%E5%A4%9A%E9%A0%85%E5%BC%8F&rlz=1CAUHAM_enJP1038JP1038&sxsrf=AJOqlzW67XLrUthKrh8TmeARAKpeHyYHHg%3A1673328194665&ei=Qva8Y_CbKMWp2roPxqCVqAs&ved=0ahUKEwjwxIqlobz8AhXFlFYBHUZQBbUQ4dUDCA8&uact=5&oq=site%3A%2F%2Fkamelink.com+%E5%A4%9A%E9%A0%85%E5%BC%8F&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIFCAAQogQ6BwgjELADECc6BAgjECc6BQghEKABSgQIQRgBSgQIRhgAUJvNAVim_gFg64UCaAJwAHgAgAHaAYgB7AqSAQYxLjEwLjGYAQCgAQHIAQHAAQE&sclient=gws-wiz-serp


# 大学入試問題(T氏様の内部検索)
整式

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%E6%95%B4%E5%BC%8F&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fmathmathmass.exblog.jp+%E6%95%B4%E5%BC%8F&aqs=chrome..69i57j69i58.18522j0j4&sourceid=chrome&ie=UTF-8

多項式

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%E5%A4%9A%E9%A0%85%E5%BC%8F&rlz=1CAUHAM_enJP1038JP1038&sxsrf=AJOqlzUQAn8HGnXk55Il9t0k1RNP-KfvrA%3A1673328907853&ei=C_m8Y_nVM4Tm2roPsd2Q2AY&ved=0ahUKEwi5h5T5o7z8AhUEs1YBHbEuBGsQ4dUDCA8&uact=5&oq=site%3A%2F%2Fmathmathmass.exblog.jp+%E5%A4%9A%E9%A0%85%E5%BC%8F&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIKCAAQ8QQQHhCiBDIFCAAQogQ6CAgAEKIEELADOgQIIxAnOgUIIRCgAUoECEEYAUoECEYYAFCFCFj-W2DDYmgKcAB4AIAB4gGIAZATkgEGMS4xOS4xmAEAoAEByAEEwAEB&sclient=gws-wiz-serp

# 参考

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10120910555

https://www.google.com/search?hl=ja&sxsrf=AJOqlzV5zzzSWhDR-Y4piTTzR_PsFBm2WA%3A1673305323345&q=%E6%95%B4%E5%BC%8F+%E5%A4%9A%E9%A0%85%E5%BC%8F+%E9%81%95%E3%81%84&oq=%E6%95%B4%E5%BC%8F+%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%80%80&aqs=heirloom-srp.0.0l5

# wikipedia

https://ja.wikipedia.org/wiki/%E6%95%B4%E5%BC%8F

https://ja.wikipedia.org/wiki/%E5%A4%9A%E9%A0%85%E5%BC%8F

# DeepL翻訳？
整式 
多項式 
違い
整式と多項式 の違い

Integer 
Polynomial 
Difference
Difference between Integer and Polynomial