OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】Atcoder勉強記録⑥

Atcoderの勉強した記録を書いていきます。
勉強の参考にしてください。
[解いた問題一覧](https://kenkoooo.com/atcoder/#/table/kenbo0224)

# 1.問題①
[A - Alternately](https://atcoder.jp/contests/abc296/tasks/abc296_a)（<font color="SpringGreen">Difficulty14</font>）

### 解答
```python
n = int(input())
s = input()
flg = True
cnt = 0
cnt_1 = 0

for i in s:
    if i == 'M':
        cnt += 1
        cnt_1 = 0
    elif i == 'F':
        cnt = 0
        cnt_1 += 1
    if cnt == 2 or cnt_1 == 2:
        flg = False
        break

if flg:
    print('Yes')
else:
    print('No')
```
### 解法
文字の入力をinput()で受け取ります。
for文で文字を確認して文字が同じ場合はcntを1プラスします。
cntが2になった時点でflgをFalseにしてfor文を抜けます。
最後にYesかNoを表示します。

# 2.問題②
[B - Chessboard](https://atcoder.jp/contests/abc296/tasks/abc296_b)（<font color="SpringGreen">Difficulty31</font>）

### 解答
```python
s_list = []
cnt = 0
int_list = ['8', '7', '6', '5', '4', '3', '2', '1']
moji_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
ans = ''
flg_moji = ''
for _ in range(8):
    s = input()
    s_list.append(s)

for i in s_list:
    if '*' in i:
        flg_moji = i
        num = int_list[cnt]
    else:
        cnt += 1

s_cnt = flg_moji.find('*')
moji = moji_list[s_cnt]
ans = moji + num
print(ans)
```

### 解法
数字のlistと文字のlistを用意します。
数字のlistは降順で用意して文字のリストはaから順番通りに用意します。
まず入力で下記画像のような文字を受け取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2759758/147815f2-60cb-5476-c168-004b7a0bd423.png)
一番下の列がaという風になり上の列に行くにつれてb,cとなっていきます。
そして、列の一番左のマスが1でそこから右に行くに従って1ずつ増えていきます。
今回の画像はa1と表示されるのが正解です。

下記から実際のプログラムの説明をします。

まず、入力を受け取ったら*が何行目にあるのかを探します。今回はfor文で探しています。
一個ずつ見ていきif文で*の行があるかを確認してあった場合にその行数を変数に格納します。
行数を格納して*が存在する行も変数に格納します。

次に*が存在する文字を見て*が何文字目にあるのかのindexを探します。
この際にfindという関数を使用します。

用意した数字のリストと文字のリストにアクセスして値を取り空の変数にセットして表示します。
Glue(Jupyter Notebook)の実行クラス(execution class)を、FLEXに変更する方法

# はじめに
re:Postにて、タイトルの事ができませんか？という質問があったので、試してみた内容を記事にしました。

https://repost.aws/ja/questions/QUHPzEaPxoTJuil56o2_SoSQ/glue-jupyter-job-execution-class

"FLEX"の実行クラスについては、以下のページをご覧ください。

https://qiita.com/masanori0001/items/d2b53638055e6b8a2124


# 概要
## CodeCommitを使う方法
- 一度、CodeCommitにPUSHさせてから、そこで編集して、PULLします
    - Glueからダウンロードをしても、"executionClass"の設定値は見つかりませんでした
    - magicでも、設定変更できませんでした。
```bash
# 変更できなかった。_を-に変えてもダメでした。
%%configure
{
    "execution_class" : "FLEX"
}
```
## ダウンロードファイルを編集する方法
- 一度ダウンロードして、そこで編集して、アップロードします
    - 以下の2つを、`"jobConfig"`の下に定義します
        - `"flexExecution": true`
        - `"minFlexWorkers": null`
    - こちらもmagicでも、設定変更できませんでした。
```bash
# こちらも同様にダメでした。
%%configure
{
    "flex_execution" : "true",
    "min_flex_workers" : "null"
}
```

# やり方
## CodeCommitを使う方法
まずは、CodeCommitにPUSHします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/01efda62-cab4-963d-8f1e-7b84cdc24c32.png)

その後CodeCommit上で、"executionClass"の設定値を"FLEX"に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/54abbfab-a8f3-d263-995d-58341b997288.png)

変更した内容をPULLしてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e2e0d534-b53f-b214-d168-4674cbfd4366.png)

[Job details]を見ると、チェックが入っていますので、変更できたのでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/cc051fea-c7b9-5666-9ca5-20953212c83b.png)

ジョブ実行すると、Execution classがFLEXになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/950bfdd8-a759-b204-a3cd-18580205cf19.png)

## ダウンロードファイルを編集する方法
対象のJobをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/57c6777b-215a-715e-df3e-f28ab7b3f458.png)

ダウンロードしたファイルを編集し、以下の2つを、`"jobConfig"`の下に定義します
- `"flexExecution": true`
- `"minFlexWorkers": null`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/457657db-9f10-0879-c4b2-b10b5bdd36a1.png)

編集したファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/bce752a6-4314-0a59-abb7-ace62a696598.png)


# おわりに
今回はGlue Jupyter Notebookの設定変更を記事にしました。
他の方法や、magicでの変更方法がわかった方は是非教えてください。


# おまけ
なんかGlueの画面が変わったような気がします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a59a5ae0-997b-bb70-bd87-3239e2e6d564.png)


またNotebookのデフォルトも変わっていました。ヘルプやいくつかの例が記述されている状態でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2fcc5d2d-779a-1ba8-82fb-fed0d954e002.png)
【git実用的まとめ】個人開発でのgitの使い方

# はじめに

railsを使って開発をしているプログラミング初心者のため、
Gitの使い方がまだあまりよくわかっておりませんでした。

個人開発において、コードレビューをしていただきながら開発していく際の
Gitの使い方を流れに沿って説明します。

特に知りたかったことが、「レビューを待っているときに、待ち時間を無駄にしないために次の開発を行う方法」だったのですが、簡単に見つからなかったためここにまとめます。

常に「どのブランチにいる状態なのか」を意識しながら行っていきます。


# 全体の流れ

行いたいことの流れは以下です。

①githubのリモートリポジトリからローカルリポジトリにデータを取得する

②取得したものから、ブランチを分けて開発する

③ローカルリポジトリの変更内容をリモートリポジトリに送りプルリクを出す

④コードレビューをしていただいている間に、ブランチを分けて別の新たな開発を行う

⑤コードレビューをいただき、④で開発した部分はとりあえず置いておきながら、③の状態に戻してご指摘点を修正する

⑥再度レビューしていただく

⑦④の状態に戻す

⑧プルリクの承認を得たので、github上でmainにマージを行いそれをローカルリポジトリにも、④にも反映させる（④の変更した部分はそのままにしたい）

⑨④の開発を続ける


## ①githubのリモートリポジトリからローカルリポジトリにデータを取得する

必ず、mainブランチにいる状態で行います。

```
$ git pull origin main
```
これで、ローカルリポジトリにデータを取得できました。

## ②取得したものから、ブランチを分けて開発する

今はmainにいる状態なので、ブランチを分けます。

```
$ git checkout -b AAA

//"AAA"の部分に好きなブランチ名を書く
```
ここで開発していきます。

本当にブランチを分けられているか不安な場合は

```
$ git branch
```
これで確認できます。

## ③ローカルリポジトリの変更内容をリモートリポジトリに送りプルリクを出す

開発が完了したら行うコマンドです。

```
$ git add -A
$ git commit -m "〇〇機能の実装"
$ git push origin HEAD

//"〇〇機能の実装"の部分に好きなメッセージを入れる
```
githubを確認し、プルリクを行います。

## ④コードレビューをしていただいている間に、ブランチを分けて別の新たな開発を行う

レビューをしてくださる方の都合もあるので、待っている間に次の開発に取り掛かります。

```
$ git checkout -b BBB

//"BBB"の部分に好きなブランチ名を書く
```

ここで次の開発をしましょう。

## ⑤コードレビューをいただき、④で開発した部分は保存、③の状態に戻してご指摘点を修正する

レビューしていただいたので、ご指摘いただいた部分を修正します。
そのためには、先に取り掛かっていた開発を一時保存し、元の状態に戻す必要があります。

```
$ git stash -u
$ git checkout AAA
```

git stash -u の "-u"　は無くても大丈夫ですが、
無かった場合はaddしていないファイルはそのまま残ってしまいます。
つけておいた方が安心です。

これで、最初の開発部分を修正してきます。

## ⑥再度レビューしていただく

修正が終わったら、再度レビューをしていただきます。

```
$ git add -A
$ git commit -m "〇〇修正"
$ git push origin HEAD

//"〇〇修正"の部分に好きなメッセージを入れる
```

githubで確認をし、レビュー担当者にご連絡をします。

## ⑦④の状態に戻す

またレビュー待ちの時間があるので、次の開発を進めておきます。

```
$ git checkout BBB
$ git stash list
$ git stash pop stash@{0}
```

git stash list で一時保存している状態のものが確認できるので、それに合ったstash@{0}を選択します。

ここで再度、新たな開発の続きを行います。

## ⑧プルリクの承認を得たので、github上でmainにマージを行いそれをローカルリポジトリにも、④にも反映させる（④の変更した部分はそのままにしたい）

承認を得たら、承認部分を反映させます。
今、新たな開発をしている状態でもあるので、一時保存を行なってから反映させます。

```
$ git stash -u
$ git checkout AAA
$ git pull origin AAA
$ git checkout BBB
$ git merge AAA
```

これで新たな開発部分にも、修正点を反映させることができます。
コンフリクトがある場合は、必ず修正しておきます。

## ⑨④の開発を続ける

これで最初の開発は完了したので、新しい開発を進めていきます。

```
$ git checkout BBB
$ git stash list
$ git stash apply stash@{0}
```

以上を適宜、繰り返しです。


お読みいただき、ありがとうございました！
Unity 2022.2 以降の .jslib で使用できる ES6+ 構文の調査

Unity 2022.2 から emscripten が 3.1.8 にバージョンアップしてるので、 どれだけ .jslib の関数内 で使用できる ES6+ 構文があるのか思いつく範囲で簡単に調べてみた。
大抵のものは使用できるようになったけど、一部まだ使えなかった。
(もしかすると、.jslib 関数以外で使えない場面もあるかもしれないが今回はそこまで深く調べてない)

## 使用しても問題ない ES6+ 構文
||説明|例文|
|:-:|:---|:--|
|🟢|テンプレートリテラル (Template Literals) (複数行も可)|let a = '123';<br>let b = \`\\${a}, \\${a}\`;<br>let c = \`aaa<br>bbb\`;|
|🟢|アロー関数 (Arrow Functions)|const a = () => console.log('hoge');|
|🟢|短いオブジェクトのメンバー関数定義構文|const a = {<br>&nbsp;&nbsp;&nbsp;&nbsp;hoge(){}<br>};|
|🟢|変数宣言での let / const ステートメント|let a;<br>const b = 'hoge';|
|🟢|分割代入 (Destructuring assignments)|let [a, b] = [1, 2];<br>let {a, b} = {a:1,b:2};|
|🟢| for of ループ|for(let [i, v] of [1,2,3].entries()){<br>&nbsp;&nbsp;&nbsp;&nbsp;console.log(i, v);<br>}|
|🟢|配列でのスプレッド構文|let a = [1, 2, 3];<br>let b = [...a, 4, 5, 6];|
|🟢|クラス (Class)|class Hoge { }<br>let Hoge = class { }|
|🟢|クラス プロパティ getter / setter|class Hoge {<br>&nbsp;&nbsp;&nbsp;&nbsp;get fuga(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this._fuga;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;set fuga(val){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this._fuga = val;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}|
|🟢|派生クラス (Extended class)|class Fuga extends Hoge { }|
|🟢|残余引数 (Rest parameters)|const a = (a, b, ...c) => console.log(a, b, c);<br>a(1,2,3,4);|
|🟢|jslib メンバー関数定義で 残余引数 (Rest parameters)|mergeInto(LibraryManager.library, {<br>&nbsp;&nbsp;&nbsp;&nbsp;hoge: function(a, b, ...c){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(a,b,c);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>});|
|🟢|スプレッド構文での引数渡し|Math.min(...[33,22,44]);|
|🟢|名前付き引数|const a = ({b, c, d}) => {<br>&nbsp;&nbsp;&nbsp;&nbsp;console.log(b, c, d);<br>};<br>a({b:1, c:2, d:3});|
|🟢|デフォルト引数 (Default parameters)|const a = (a, b, c = 'hoge');<br>a('a','b');|
|🟢|デフォルト引数 (Default parameters) を jslib のメンバー関数定義で使用|mergeInto(LibraryManager.library, {<br>&nbsp;&nbsp;&nbsp;&nbsp;hoge: function(a, b, c = 'hoge'){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(a,b,c);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>});|

## 使用したらエラーになる ES6+ 構文
|コンパイルエラー|実行時フリーズ|コンパイルすると消える|説明|例|
|:---:|:---:|:---:|:--|:--|
||❌||jslib のメンバー関数定義にアロー関数を使用|mergeInto(LibraryManager.library, {<br>&nbsp;&nbsp;&nbsp;&nbsp;hoge: () => {}<br>});|
|❌|||短いオブジェクトのメンバー関数定義構文を jslib のメンバーで使用|mergeInto(LibraryManager.library, {<br>&nbsp;&nbsp;&nbsp;&nbsp;hoge(){}<br>});|
|❌|||オブジェクトでのスプレッド構文|let a = {a:1,b:2,c:3};<br>let b = {...a,d:4,e:5,f:6};|
|❌|||クラスのフィールドメンバー定義|class Hoge{<br>&nbsp;&nbsp;&nbsp;&nbsp;fuga;<br>}|
|❌|||クラスのプライベート関数提議|class Hoge{<br>&nbsp;&nbsp;&nbsp;&nbsp;#fuga(){}<br>}|
|❌|||オブジェクトの動的プロパティ (Dynamic properties)|let a = 'hoge';<br> const b = {<br>&nbsp;&nbsp;&nbsp;&nbsp;[a]:'fuga'<br>};|
|||❌|クラスをこういった場所で定義|const lib = {};<br>class Hoge{}<br>mergeInto(LibraryManager.library, lib});|
Googleデータアナリティクス：データと直観


# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9ecfac9e-53bb-7cf3-3a30-dbc832717f52.png" width="800">

# データと直観

アナリストは、データ主導で意思決定し、段階的なプロセスを踏んでいきます。

1. 問いかけをして、課題を定義する。
1. 情報を収集、保存してデータを準備する。
1. 情報をクリーニングし、チェックしたうえでデータを処理する。
1. データを分析して、パターンや関係性、傾向を見つける。
1. 関係者とデータを共有する。

分析結果を活用し、データに基づいて行動する。

しかし、意思決定のプロセスに影響を与える要因は他にもあります。探偵が第六感に導かれ、直観にしたがって事件を解決するミステリー作品を読んだことがあるかもしれません。直観とは、わずかな説明で、またはほとんど説明がなくても物事を本能的に理解することを意味します。これは必ずしも意識的なものではなく、無意識のうちにシグナルを受け取っていることが多いのです。ただ、それが正解だという「感覚」だけがあるのです。

# なぜ直観が問題となりうるのか

データ主導の意思決定の中心にあるのはデータです。したがって、データ アナリストが情報に基づいた意思決定を行うためには、データに注目する必要があります。データを無視して自分の経験に頼ると、決断に偏りが生じるおそれがあります。さらに悪いことに、データによる裏付けがないまま直観で判断をすると、間違いにつながるおそれがあることです。

プロジェクトに関連するデータを理解すればするほど、何が必要なのかが把握しやすくなります。こうした取り組みは、データの誤りや不備を見つけ、調査結果を的確に伝える際にも有効です。過去の経験が、他の誰も気付かなかった関連性を見いだすのに役立つ場合もあります。たとえば、いま捜査中の事件とよく似た過去の事件を覚えていた刑事が解決の糸口を見つけることもあるかも知れません。直観だけでは不十分なのです。

# データ＋ビジネスの知識＝謎を解決する

ポイントは、個々のプロジェクトに応じて正しい組み合わせを見つけることです。多くの場合、それは分析の目的によって異なります。そのため、アナリストはよく

- ***<font color="MediumVioletRed">「このプロジェクトにおける成功の定義は何か」</font>***

と問いかけるのです。

さらに、プロジェクトについて以下の問いかけをすることで、完璧なバランスを見つけましょう。

- どのような結果を必要とするのか？
- 誰に情報を伝えるか？
- 自分が受けた質問に答えられているか？
- どのくらい素早く決断しなければならないのか？

# 状況に応じた対応

- 緊急プロジェクトの場合、普段よりも自分の知識と経験に頼らざるを得ないかもしれません。利用できる全てのデータを徹底的に分析するだけの時間がないからです。
- 一方、時間もリソースもたくさん確保できるプロジェクトであれば、データ主導で進めるのが最善の戦略です。
ChatGPT で SWI Prolog のプログラムを作成

## 質問

```text
How do I make an HTTP request in SWI Prolog?
```

## 回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a0b7f2a5-b671-2774-d71d-8fd768ca6be4.png)

```text
:- use_module(library(http/http_client)).

make_request(URL) :-
    http_get(URL, Reply, []),
    format('~s~n', [Reply]).
```

## 動くプログラムに改造

```prolog:http_get.pl
/* ------------------------------------------------------------------- */
/*
	http_get.pl

					Apr/02/2023
*/
/* ------------------------------------------------------------------- */
:- initialization main.
:- use_module(library(http/http_client)).

make_request(URL) :-
    http_get(URL, Reply, []),
    format('~s~n', [Reply]).

/* ------------------------------------------------------------------- */
main() :-
	format('*** 開始 ***\n'),
	URL = 'https://httpbin.org/get',
	make_request(URL),

	format('*** 終了 ***\n'),
	halt.
/* ------------------------------------------------------------------- */
```

## 実行結果

```text
$ swipl -f http_get.pl 
*** 開始 ***
{
  "args": {}, 
  "headers": {
    "Host": "httpbin.org", 
    "User-Agent": "SWI-Prolog", 
    "X-Amzn-Trace-Id": "Root=1-6428de5e-6f6f25b85e7377b1365f1dc5"
  }, 
  "origin": "219.126.142.122", 
  "url": "https://httpbin.org/get"
}

*** 終了 ***
```

## 課題
>スニペットでなく、実際に動くプログラムを提示してもらうにはどうしたらよいか。

## 参考
私が4年半まえに書いた同じプログラム
[SWI-Prolog の http クライアントの使い方 (Get)](https://qiita.com/ekzemplaro/items/93df2414bbca2bd80bde)
【ドラゴンボール風解説】AWS CLIについて

# はじめに
この記事はAWSの説明は今ひとつよくわからないのでドラゴンボールに例えて説明してほしい。
というAWS初学者向けの記事です。
※投稿記事作成にはchatGPTを使用しております

# AWS CLI
オラ悟空だ！このAWS CLIってのはな、Amazon Web Servicesを管理するための**コマンドラインツールだ**！

オラにとっての「界王拳」みたいなもんだ。オラが強くなるための必殺技で、これを使えば**Amazonのクラウドサービスを簡単に管理できるぞ**！

それに、このAWS CLIを使うと、ブルマが作った「ドラゴンレーダー」のように、**Amazonのクラウドサービスを簡単に自動化できるんだ**。手順が複雑なもんを自動化できるから、めっちゃ便利なんだ！

しかも、AWS CLIには「サイヤ人」っていう強力なコマンドがあるんだ。これはオラたちが「超サイヤ人」に変身するためのものさ。サイヤ人は、**Amazonのクラウドサービスを高度に管理できるコマンドだ**。超サイヤ人に変身するようにより強力な管理ができるようになるんだ！

最後にな、AWS CLIを使うと神龍を呼び出せるんだぜ！神龍は、オラたちの願いを叶えることができる存在だ。これは、**Amazonのクラウドサービスをより効率的に管理するための必須ツールだ**！オメェもAWS CLIを使って、Amazonのクラウドサービスを効率的に管理しようぜ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3304054/427c5bf2-4ce6-4d21-e4a2-deaf79fc1a27.png)
Googleデータアナリティクス：優れた意思決定のためにデータをどう役立てるか

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9ecfac9e-53bb-7cf3-3a30-dbc832717f52.png" width="800">

# データ主導の意思決定

私たちは普段の生活で、 フィットネス トラッカーを装着したときや、 商品レビューを読んで購入を決定するとき などにデータを使っています。 そしてビジネスでは、 顧客をより深く理解したり、 プロセスの改善や、従業員の業務生産性 向上を図るためにデータを使っています。 しかしこれは氷山の一角にすぎません。 業務上データを使ってできる最も有益なこと の 1 つが、データ主導の意思決定です。 

***<font color="MediumVioletRed">『データ主導の意思決定とは、データに 基づいてビジネス戦略を導くこと』</font>***

あらゆる業界の組織において、 データアナリストが 常にデータ主導のより良い意思決定が できるよう、推進されています。 

1. データ主導の意思決定の最初のステップは、 ***<font color="MediumBlue">事業ニーズを把握する</font>***　ことです。 通常、これは解決する必要がある 問題のことを指します。 この問題とは、たとえばある新しい会社が、 より規模の大きく有名な 競合企業と戦うために ブランドの認知を高めるといったこと、 あるいは、ある組織が製品改良のために、 よりサステナブルでエシカルな サプライヤーから部品を調達する 方法を見つけ出すことかもしれません。 もしくは企業で、従業員の不満や エンゲージメント、満足度、 会社への定着率の低さを解決しようと することかもしれません。 
1. 問題が何であれ、それが定義されると、 データ アナリストはデータを見つけ、 それを分析・活用して、トレンド、 パターン、関連性を明らかにします。 データ主導で導かれた戦略は、 過去の成功に沿った形になる場合もあれば またある時は、まったく新しい方向への 事業展開を示す場合もあります。 

# 実際の事例

### 音楽や映画のストリーミング サービス
各企業は、個人が何を見たいか、聞きたいかを どのようにして知るのでしょうか？ また、 それらをどのように提供しているのでしょう？ データ主導の意思決定を上手く利用して 企業は顧客が現在見たり、 聞いたりしているものについての 情報を集めて分析し、 そこからインサイトを得て、 今後最も好まれそうなものを提案します。 その結果、顧客の満足度が高まり、 リピーターが増えることで 会社の収益につながっていきます。 

### e コマース

ほとんどの買い物が実店舗経由だったのは、 それほど昔のことではありません。 しかし、データによって、消費者の志向が 変わっていることがわかりました。 そのため、多くの企業がまったく新しい ビジネスモデルを構築し、 実店舗をなくし、個人がパソコンや 携帯電話から直接買い物をして、 商品が自宅まで届けられるようにしたのです。

# 人間の経験、観察、 直観との組み合わせ

実際、データ主導の意思決定は 非常に強力なもので、 ビジネスの手法を全体から 覆してしまうこともあります。 たとえば、データによって各企業は 固定電話から、 携帯電話に完全移行しました。 

データ アナリストは、データをあらゆる ビジネス戦略に組み込み、 企業を成功に導くうえで 重要な役割を果たします。 しかしデータ主導の意思決定に どれほど価値があったとしても、 人間の経験、観察、 時には直観と組み合わせなければ データ単体ではそこまで強力なものに ならないことは注意すべきでしょう。

# 内容領域専門家（SME,Subject matter experts）
最も有益なデータ主導の意思決定のためには 事業課題をよく知っている人々のインサイトを 含めることが重要です。 これらの人々は内容領域専門家と呼ばれ、 データ分析の結果を見て 矛盾を突き止め、不確かな点を明らかにし、 

そして、最終的にはその選択を 検証することもできます。 このような取り組みを行う組織は、 ビジネス戦略の中心にデータを位置づけつつ 社員のインサイトからも恩恵を受けます。 Win-Win の関係なのです。 

あなたはデータ アナリストとして、 組織がデータ主導の意思決定をする上で 重要な役割を果たします。だからこそ、 データの意思決定プロセスにおいて データがどのように関わっているかを 理解することが重要なのです。

# Google の エド

ただデータが多いだけではダメなんです。 データそのものはほとんど 価値を持ちません。 Twitter や Square の創業者である ジャック・ドーシーの言葉を借りれば、 

***<font color="MediumVioletRed">「この世界で私たちが行う一つ一つの行動が、 何らかのデータが引き金になっていて、 そのデータのほとんどは、 誰かが何らかの解釈を加えるか、 誰かがストーリーを練るまでは 無意味なものである。」 </font>***

データとは、端的に言えば、 事実の集まりであり、 何かを説明するための値です。 個々のデータは収集され、 構造化されてより有用になりますが、 しかしそれだけではまだ 十分な意味を持ちません。 データを情報に変えるには、 解釈する必要があります。 

水泳の 200m 個人メドレーで マイケル・フェルプスの タイムは 1 分 54 秒でした。 これではよくわかりません。 しかし、ライバルたちのタイムと比較すると、 マイケルは 1 位でゴールし、 金メダルを獲得していることがわかります。 この分析では、データとして マイケルのレース相手のリストと タイムを使用し 他のデータと比較することで 情報に変えました。 文脈も重要です。 このレースが他でもない オリンピックの決勝戦であるということが ”金メダル獲得”という判断につながります。 しかし、これでもまだ知識とは いえません。 私たちが情報に触れて、理解し、そして 応用するときが、 データが最も役に立つときです。 

つまり、マイケル・フェルプスは 速い競泳選手だ、ということですよね。 データを知識に変え、 理想のレストランを見つけたり、 環境に配慮した行動をとったりと、 さまざまなことに役立てることができるのが、 データの真骨頂なのです。
Dockerで「Error saving credentials: error storing credentials...」出た時の対処

WSL2上のUbuntu 20.04において

```sh
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <id>.dkr.ecr.ap-northeast-1.amazonaws.com
```

を実行した時に、以下のようなエラーが出た。

```
Error saving credentials: error storing credentials - err: exit status 1, out: `Post "http://ipc/registry/credstore-updated": open \\.\pipe\dockerBackendApiServer: The system cannot find the file specified.`
```

ググると `~/.docker/config.json` の `"credsStore": "desktop.exe"` を削除すればよいという記事がいくつかヒットしたのでやってみると、たしかにログインは通るのだが、以下のような警告が出る。

```
WARNING! Your password will be stored unencrypted in /home/marukaz/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
```

実際に `config.json` を改めて確認するとcredentialが平文で書き込まれてしまっている。

ここで改めて `"credsStore": "desktop.exe"` という文字列を見て気づいたのだが、Docker Desktopが起動していないだけだった…。
Docker Desktopを起動し、`~/.docker/config.json` に書き込まれてしまったcredentialを削除してもう一度冒頭のコマンドを実行したところ、無事ログインできた。
Django俺的チートシート

# プロジェクトファイル作成

①プロジェクトフォルダ作成
② __django-admin startproject [Project Name]__
③cd [Project Name]
④ __python3 manage.py startapp [App Name]__
④P(roject)ファイルのurlsにA(pp)のパスを入れる
⑤settingの「INSTALLED_APPS」に[ __AppName.apps.AppConfig__ ]を追加
　(例：'book.apps.BookConfig',)
⑥settingのTEMPLATESのDIRの[]に __[BASE_DIR / 'template']__ と記入
⑦Aフォルダのurlsに仮で __urlpatterns=[]__ を宣言しておく
【Laravel】migration ロールバックコマンド集

アプリを開発していて、ロールバックすることが増えてきたので備忘録です。

# rollback

直前に行ったマイグレーションをなかったことにします。
down()メソッド内の処理を実行。

```
php artisan migrate:rollback
```

回数指定
```
php artisan migrate:rollback --step=[回数]
```

# reset

完全にリセットしたいときに使います。

```
php artisan migrate:reset
```

# refresh

すべてのマイグレーションをロールバックしてから再びマイグレーションします。
```
php artisan migrate:refresh
```

# fresh
すべてのテーブルを削除してから再びマイグレーションします。

```
php artisan migrate:fresh
```
NG案件 - 20230402

うまく行ってない案件の一覧です。

IDT 79RC32334 - ハーフピッチのjtagコネクタ変換基板作って、urjtagでcpuは見えるのですがflashが焼けません

MPC8241 - これもurjtagでCPUは見えてるのですが、バスアクセスができなくて、flashが焼けません

BCM33xx - 使えるブートが作れません

BCM4210 - mruby on YABMが動くはずだがUARTがないので思案中

IXP422 - Redbootは出来たが、NetBSDでPCIのUSBが使えず

Comcerto - NetBSDでPCIeのサポート。PCIeのサポートはけっこう個別実装が必要なようで、どうしようか考えてます

ARM - USB無しのターゲットを使い方考え中

RT3883+RT3050 - RT3050の利用方法検討

FreeBSD etherswitch - atheros以外のATUサポート

mips 24K pcm - USBオーディオで音が飛ぶ件を調べる。パフォーマンスが足りないとは考えにくいのよね

元祖amd64 - FreeBSD 12.4Rの確認(12.3RがHungするので12.2Rのまま)

macam NTSC - デコーダーコード共通化

go MGEP - AVIなのでとりあえずあまりきがのらない

故障モジュール確認

ほかいろいろ
powershell 実行したらMethod invocation failed because [System.Object[]] does not contain a method named 'op_Subtraction'.というエラーが出た


# 事象

乱数を１０個出力する内容を実行したところ以下のエラーが発生しました。

```
$r-1..10 | %{get-random}
$r
```


```
InvalidOperation: /（フォルダパス）/new.ps1:1
Line |
   1 |  $r-1..10 | %{get-random}
     |  ~~~~~~~~~~~~~~~~~~~~~~~~
     | Method invocation failed because [System.Object[]] does not
     | contain a method named 'op_Subtraction'.
```


うーんエラーの内容を直訳すると「
[System.Object] がないため、メソッドの呼び出しに失敗しました」という内容です。
なんじゃそりゃ。。


# 対処策

「r-1..10」の「-」を「=」に修正したら解決しました。
```
$r=1..10 | %{get-random}
$r

xxx
~
xxxxx
計10個の乱数が出力

```

# 雑感

他のプログラミング言語も同様なのですが、エラー文の内容を馬鹿正直に解読しようとするのではなく、
そもそも文法的におかしい点がある、何かファイルが作成されていないという観点を常に持ち合わせておくことが
大切だと改めて感じました。
ExcelファイルからODBC接続のクエリー情報をPythonで抽出する

## 動機

- 自分はデータ分析基盤のインフラの方を担当しBIツールとしてExcelは使わない
- データ利用者のExcelファイルをもらって調べるにあたり中に埋め込まれたクエリーを見たいがドライバーの設定がちゃんとしてないとグレーアウトされてSQL文を取り出せない様子
- ExcelのODBC接続の仕組みについてはよくわかってない
- Excel側でドライバーや設定をきちんとするのも良いが、とりあえずクエリー情報が欲しいだけなので、xlsxファイルに情報は入っているはずだから取り出そう

ここら辺の問題に近い

https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%83%94%E3%83%9C%E3%83%83%E3%83%88%E3%83%86/cc275ce3-bff0-45a6-aad0-9fad38ee2205

https://learn.microsoft.com/en-US/office/troubleshoot/excel/cannot-modify-odata-connection

https://www.stadlersoftware.com/training/edit-excel-connections-in-xml/

## Excelファイルの構造

openpyxlでなんとかなるのかなぁと思ったけどちょっと見当たらなかったので直接XMLを操作する。

xlsxファイルをzipファイルとして展開して、`xl/connections.xml`を見てみるとここにクエリーの情報が記載されている。

https://learn.microsoft.com/ja-jp/dotnet/api/documentformat.openxml.office2013.excel.dbcommand?view=openxml-2.8.1

抜粋するとこんな感じ

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<connections xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="xr16"
    xmlns:xr16="http://schemas.microsoft.com/office/spreadsheetml/2017/revision16">
    <connection id="1" xr16:uid="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX}" name="connection-name" type="100" refreshedVersion="7" savePassword="1" saveData="1" credentials="stored" singleSignOnId="username">
        <extLst>
            <ext uri="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
                xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main">
                <x15:connection id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">
                    <x15:oledbPr connection="Provider=MSDASQL.1;Persist Security Info=True;User ID=username;DSN=ODBC-Connection-Name;Password=password">
                        <x15:dbCommand text="SELECT * FROM mytable"/>
                    </x15:oledbPr>
                </x15:connection>
            </ext>
        </extLst>
    </connection>
</connections>
```

## Pythonで取り出す

```python
import sys
import xml.etree.ElementTree as ET
import zipfile


def get_queries(filename):
    """
    Get External queries from Excel file
    """
    # Unzip connection file
    with zipfile.ZipFile(filename) as zf:
        xml = zf.read("xl/connections.xml")

    root = ET.fromstring(xml)

    for connections in root.findall('connections:connection',
                                     {'connections': 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'}):
        for command in connections.findall('.//x15:connection/x15:oledbPr/x15:dbCommand',
                                               {'x15': 'http://schemas.microsoft.com/office/spreadsheetml/2010/11/main'}):
            print(command.attrib.get('text'))
            print()


if __name__ == '__main__': 
    get_queries(sys.argv[1])
```

めでたし。

```shell
$ python get_queries_from_xlsx.py myfile.xlsx

SELECT * FROM mytable
```

## 追記

- このままだと、SQLの改行がXML中に `_000d_`(CF) `_000a_`(LF) で入ったままだったので、適当に置換してあげる必要あり。
2023年3月振り返り〜どこもかしこもChatGPT〜

## はじめに
さあ、やってきました、3月の振り返りです
2月も書いたけど3月もあっという間すぎる、、、焦ります
今月も振り返りしていきます、よろしくお願いします！

↓上記の文章をChatGPTに「ポップに韻を踏んで」と依頼をするとこんな文章が返ってきました

```
春めいた3月も、あっという間に過ぎ去ってしまいました！
焦るばかりの中、私はいろいろなことに挑戦して、大いに踊りました♪
2月も書いたけど、3月もこんなに早く終わっちゃうなんて、もっと焦らせて！って感じですね。
そんなわけで、今月も私が体験したことや感じたこと、
ときにはちょっとおバカな出来事まで、お届けしちゃいます！
```
はい、今月もよろしくお願いします！！

## 2023年3月のざっくり何してた？
2月からチーム内のユニット編成が分かれていましたが、
本格的に各ユニットの仕事が増えたと感じる1ヶ月でした。
日常業務に追われている感覚はありつつも、**ユニットの目的は何か**、
**それぞれの業務も何のために進めるのか**を意識しながら動いていました。

余談ですが、2~3月でいっきに話題がchatGPTになったなと。
記事を見ていてもChatGPT関連多すぎぃいいって感じでした。
勉強しているとこれはChatGPTに聞けば一瞬なのでは、、？自分が学ぶ意味はあるのか、、？と
一瞬よぎったりもするのですが、原理原則など知らないと結局どの技術も使えないと思うので
日々勉強です。押忍。

### 今月おもしろかった、気になった記事、本
**- [Web APIの設計](https://www.amazon.co.jp/API%E3%81%AE%E8%A8%AD%E8%A8%88-Programmers-SELECTION-Arnaud-Lauret/dp/4798167010)**
まだ途中ですが、Web APIとはなんぞやから始まり、あるべきの考え方や書き方が
いろんな例を出しながら書かれているのでわかりやすかったです。

**- [エンジニアとして事業に貢献するとは「Why-What-Howの一貫性を保ちながら、技術意思決定を積み重ねること」である](https://tech.speee.jp/entry/why-what-how-engineering)**
Speeeさんの技術ブログ。自分がエンジニアとして大事にしたい部分と重なる部分が多く
何のために働くのかを改めて考えたタイミングでした。

**- [Chatter(チャッター): 「頭の中のひとりごと」をコントロールし、最良の行動を導くための26の方法](https://www.amazon.co.jp/Chatter-%E3%83%81%E3%83%A3%E3%83%83%E3%82%BF%E3%83%BC-%E3%80%8C%E9%A0%AD%E3%81%AE%E4%B8%AD%E3%81%AE%E3%81%B2%E3%81%A8%E3%82%8A%E3%81%94%E3%81%A8%E3%80%8D%E3%82%92%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%97%E3%80%81%E6%9C%80%E8%89%AF%E3%81%AE%E8%A1%8C%E5%8B%95%E3%82%92%E5%B0%8E%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE26%E3%81%AE%E6%96%B9%E6%B3%95-%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%B3%E3%83%BB%E3%82%AF%E3%83%AD%E3%82%B9/dp/4492047204/ref=sr_1_1?adgrpid=119249245324&hvadid=626754208742&hvdev=c&hvlocphy=1009318&hvnetw=g&hvqmt=e&hvrand=883304482073196550&hvtargid=kwd-306554281&hydadcr=29567_14663662&jp-ad-ap=0&keywords=chatter&qid=1680395582&sr=8-1)**
技術系ではないですが、、自己対話を見直すきっかけになりました。
これを読んでから頭の中でマイナスなことが思い浮かんだときには、
問いかけに変えたり、一人称を自分の名前にしたりしています。視点が変わる感覚があり今のとこは良きです。

## 印象に残ったトピック
### 自分が提案していた機能案が通り進めることになったこと
先月に
> 日常業務から機能案を提案してみて全然ダメだったり（でも学びも多かった）、

と書いていましたが、この案がなんと通りました！嬉しい！やったぜ！
しかもそのまま自分も開発を担当させてもらえることに。やったぜ2！
密かに**今年の目標のうちの1つが、自分が起案した開発を形にするだった**ので、
開発自体はまだまだこれからなのでリリース、その先の効果検証まで進めてからになりますが、
1つ目標達成の兆しが見えました、やったぜ3！

### 要件定義〜リリースまでの一連のフローを改めて学ぶことができたこと
2月から着手していた案件がほとんど終了し、一部除きリリースまで完了しました。
今回の案件がこれまでと異なるのは、一連のフローを改めて学ぶことができたこと。
案件自体は大きくはないですが、型、基本のきを学ぶことができました。
```
企画/仮説立案 → 要求定義/要件定義　→ 設計（外部設計・内部設計）→　製造　→　検証 →リリース）
```
ざっくり上記のフローの中で、設計や製造段階で要件定義のときに考えきれなかったことも出てきたり。
一緒に進めるのか、劣後にさせるのかなどビジネスサイドの皆さんと議論、すり合わせしたり。

短期的な目線だとベターなことも、長期的に考えると他の方がよかったり。
例えば、**今後の開発を考えると今ここの負債を解消したいよね**だったり、
**別々に進めるよりもまとめて検証できるので効率的だよね**、ということはある一方で
当然ながら納期もあるので、全てはなかなか難しい。
正解もないので、都度コミュニケーションをとることが重要だと実感しました。

これからの開発、開発以外の仕事でも活きる部分なので大きな学びだったなと思います。
また一方で反省や改善点もたくさん出てきたので、
これはまた全て完了したタイミングで振り返りできたらと思います。

## 終わりに
学びも大きかった1ヶ月でしたが、自分は前に進んでいないのでは、
実はしゃがんでいるだけなのでは、、？と感じる場面も多かった1ヶ月でした。
踏ん張りどころと半分言い聞かせながら乗り切った感じもあるので、
4月以降も踏ん張りつつ、前にも進みたいなと思います。
3月でエンジニアになって丸2年、２年前と比較するとさすがに成長実感はありますが
まだまだこれから。4月以降もよろしくお願いします！
JSONをJavaオブジェクトに変換

入力パラメーターをJSONで受け取ってJavaオブジェクトに変換する処理がよくあるので備忘録

**入力パラメーター**
```json
{"id":100,"name":"らつき","age":25}
```
変換先のPersonクラス
```java
public class Person {
    private int id;
    private String name;
    private int age;
    
    public Person() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
```

## ObjectMapper
JacksonというJSONライブラリで提供される、JavaオブジェクトとJSONの相互変換を行うためのクラス。
ObjectMapperを使用することで、JavaオブジェクトをJSON文字列に変換したり、JSON文字列をJavaオブジェクトに変換したりすることができる。ObjectMapperは、複雑なJSONデータを扱う場合にも便利。
例えば、ネストされたJSONオブジェクトを含むJSON文字列を、Javaオブジェクトの階層構造にマッピングすることができる。

**ObjectMapperを使用して変換する**
```java
public class SyainService {
	public static void main(String[] args) {
        String json = "{\"id\":100,\"name\":\"らつき\",\"age\":25}";
        ObjectMapper mapper = new ObjectMapper();

        try {
            //mapper.readValue(json,変換したいクラス);
            Person person = mapper.readValue(json,Person.class);
            System.out.println(person.getId());
            System.out.println(person.getName());
            System.out.println(person.getAge());
        } catch(JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}
```
**実行結果**
JSONのキーとJavaのフィールド名が一致して入れば変換を行えることが分かる
```
100
らつき
25
```
powershellでuniq

# 概要
powershellでbashのuniqと同じようなことを行う。

# 使用例
以下のunixでのコマンドをpowershellで行う
```unix.sh
ls | uniq -c -s 3 -w 4
```
次がpowershellでの方法
```powershell.ps1
ls | group -p @{e={$_.name.substring(2,4)}}
```
または、単純に
```powershell2.ps1
ls | group {$_.name.substring(2,4)}
```


# 詳細説明
どうも、powershellは@{name="タイトル",expression={式}}というような項目を
表示してくれるようになっている。このsampleはabout_CALCULATED_PROPERTIESという
helpファイルに、いろいろサンプルがある。nameの部分は省略してもよい。

man about_CALCULATED_PROPERTIES とすればでてくる。

powershell.ps1の中でe=としているのはexpressionの略である。

まあ、unixは分かってしまえば有用なオプションが山ほどあるんだがなかなか使いこなせない。

powershellのやり方の方が、なんとなく分かり易くて、いいなあと思った次第。
Visual Studio 2022 のcommunity版で、過去のマイナーバージョンを利用したい

# したい事
* Visual Studio 2022 のcommunity版で、過去のマイナーバージョンを利用したい（タイトルのまんま）

# したくない事

* 既にインストール済のバージョンに下げるには、17.4でロールバック機能が追加されたとのことだけれど、その機能ではなくて、新規にインストールしたい
* Visual Studio 2019や2017をインストールしたい訳でもなくて、例えばVisual Studio **2022** の17.3をインストールしたい

# 実験（失敗）

* Visla StudioがインストールされたことのないPCを用意する
* Visual Studio 2022 バージョン 17.3 リリース ノート　を開く　https://learn.microsoft.com/ja-jp/visualstudio/releases/2022/release-notes-v17.3
* Download Community 2022　をクリックすると、次のページに移動し、VisualStudioSetup.exe　がダウンロードされる　https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false
* ダウンロードされた　VisualStudioSetup.exe　の[プロパティ]-[詳細]で確認したファイルバージョンは　**17.5.33516.290**　で、嫌な予感しかしない
* 同ファイルを実行する
* ひと先ず、.NETデスクトップ開発にチェックして、インストールする![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/77c7076c-911f-0ffa-d028-f3a90d8a7b1f.png)
* インストール中の画面はこんな感じ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/6302096e-9e13-74dd-7235-a10e50f1fa03.png)

* 思った通り、現時点での最新のバージョン（17.5.3）になっている、少なくとも17.3ではない![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/c8dee0bc-bfdb-bb78-0348-9bc422436775.png)

# 調査（どうもこちらからDLするらしい）

* Visual Studio 2022 リリース履歴　を開く　https://learn.microsoft.com/ja-jp/visualstudio/releases/2022/release-history#release-dates-and-build-numbers
* 下の方にスクロールすると、**Evergreen ブートストラップ**　や　**修正済みバージョンのブートストラップ**　が表示される![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/9c20d437-cfbc-5afc-2ae1-385128023317.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/a6d7c03a-3303-750c-6c42-9378dc351775.png)
* なお、更新タイミングは、以下の図のようであるらしい　https://learn.microsoft.com/ja-jp/visualstudio/productinfo/release-rhythm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/fdaf97d1-35e0-2d18-c72a-2d7da8e56332.png)
LTSC...長期サービス チャネル

* 例えば、Spring 2022 LTSC	17.2　のProfessionalのリンクをクリックすると　vs_Professional.exe　がダウンロードされて、このファイルバージョンは　17.2.33502.348　で、製品バージョンは　17.2LTSC　になっている（→「おまけ」を参照）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/eb65802c-6a42-f8c1-d901-28ee68e98a60.png)

* 但し、先のページにEnterpriseやProfessonalの文字はあれど、communityの文字はない（まぁそうでしょうね）

# 現時点での結論

* Visual Studio 2022 で、過去のマイナーバージョンを利用したいと思ったら、少なくともProfessonal版を買いなさい、という事ですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/24a2b97d-8f86-a2dc-5016-2cbff0d4901f.png)

# おまけ（17.2LTSCをインストールしてみた）

* community版をアンインストール後、Professional版の　17.2LTSC　をインストールした
* 期待の持てるインストール画面　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/43e0e4f1-f69d-ce60-ab18-dfc166887108.png)
* 無事　17.2LTSC　がインストールされた　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/facc393d-2991-bce2-0cbe-97ae574375e9.png)
* [その他▼]をクリックし、[設定の更新]を表示させたところ　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417890/1ca53085-f3f9-0ddf-075a-e12ff5979fc8.png)
* Professional版（と、多分Enperprise版）だと、新規インストールで、過去のマイナーバージョンが利用できるようですね
AI Code Translatorを使ってJSコードをPythonに変換する

## 概要
ある言語で書かれたコードを別言語のコードに変換できるというものです。

## JS→Python

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/1f4d4712-7e0a-3e84-0132-07bb309b302e.png)

## Python→Rust
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/8555db01-eb93-3ed4-47b9-bc107cb8abd1.png)
 
## Rust→JS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/d08d1d62-fada-db4d-bbff-75a5b4254b80.png)

ちゃんと元のJSコードに帰ってきましたね！
## 感想

速度もかなり早く、精度も高く、API Keyを発行するだけで無料で利用できたので、実際にこれから使う機会もありそうだなと思いました。

今業務で困っているNuxt2→Nuxt3やVue→Reactの変換には対応していないのは少し残念ですが、他のツールでこれら対応しているものがあれば教えていただきたいです！(まだ無いか精度が低そう..

有名な会社で作られたわけでは無いので、ちょっとセキュリティ的に会社で使うのは厳しそうです><
wsl

* プログラムと機能にて、以下の機能を有効化
・Hyper-V
・Linux用Windowsサブシステム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232903/f5b64266-e6a0-1059-74ed-7d832d0f54be.png)

* wslのバージョンアップ(windows subsystem for linuxのインストール?)
```shell:管理者として実行
wsl --update
```

* マイクロソフトストアで以下のソフトウェアをインストール
Ubuntu 22.04.2 LTS

* パッケージリストを最新化
```shell:
sudo apt-get update
```

* パッケージを最新化
```shell:
sudo apt-get upgrade
```

* nvimをインストール
```shell:
sudo apt install nvim
cd /usr/local/bin
sudo mv vi vi_org
sudo ln nvim vi
```

* wslバージョンのデフォルト設定
```shell:管理者として実行
wsl --set-default-version {デフォルトバージョン}
```

* wslバージョンの変換
```shell:
wsl --set-version {環境名} {バージョン}
```

* 環境の一覧
```shell:
wsl -l -v
```

* 環境のexport
```shell:
wsl --export {環境名} {バックアップファイル}
```

* 環境のimport
```shell:
wsl --import {環境名} {インポート先ディレクトリ} {バックアップファイル}
```
SQLiteでデータベース間の比較がしたい

# はじめに
恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

[「泣きたくなるほど遅い」](https://qiita.com/koizumistr/items/d81f121ef3566e9fcd10)などの困難を乗り越えてSQLiteで簡単にデータベースが作成できることが分かると、調子に乗ってついついデータベースを作りすぎてしまうことってあると思います。（そんなわけ、ねーだろ！と思ったあなた、大人ですね。）で、しばらくして我に返って、「先程作ったデータベースと今作ったデータベース、実は中身は同じなのでは」と思った時、「ん？データベースが異なる場合に、どうやって比較するのかな。同じデータベースの中ならSQLで何とかできそうだけど、、、」と思ってしまったら、この先を読んでください。

# sqldiff.exe
データベースと言ったってどうせファイルだろ、とdiffを使うと
~~~
$ diff my_sqlite1.db my_sqlite2.db 
Binary files my_sqlite1.db and my_sqlite2.db differ
~~~
（違うことは分かるが何が違うのかは全く分からない）という残念な結果になります。（実はここでmy_sqlite1.dbとmy_sqlite2.dbは（見た目には）同じデータが入っている入っているはずなのです。きっとメタデータか何かが異なるのでしょうね。）

ここでSQLにこだわって、「dumpしたもの同士を比較するのか」とか考え始めると茨の道かもです。

やはり、データベース同士を簡単に比較したいという需要はあるようで、SQLiteのサイトにsqldiff.exeなんてものがあります。

https://www.sqlite.org/sqldiff.html

.exeなんて書いてあるから、Windows専用のツールなのではと思うかもしれませんが、SQLite3をインストールした私のPC（FreeBSD/GhostBSD）にも入ってました（もちろん.exeなんてついていませんが）[^Mac]。SQLite3をインストールするとついてくるみたいですね。

[^Mac]: MacにもHomebrewで入れられます。ただし、SQLite3をインストールするとついてくるというわけではなく、sqldiffを独立にインストールするようです。

~~~
$ pkg which `which sqldiff`
/usr/local/bin/sqldiff was installed by package sqlite3-3.41.0,1
~~~
中身が同じ（だけどファイルは異なる）データベースを比較すると以下のようになります。
~~~
$ sqldiff my_sqlite1.db my_sqlite2.db
~~~
sqldiffはmy_sqlite1.dbをmy_sqlite2.dbと同じにするためのSQLコマンド（群）を出力するもののようですから、何も出ない=>同じにするためにSQLコマンドは必要ない=>2つのデータベースの中身は同じ、ということになるようです。
が、diffの-sオプションみたいに
~~~
$ diff -s file1 file2 
Files file1 and file2 are identical
~~~
とずばっと言ってくれるともっと安心ですよね。sqldiffには残念ながらdiffの-sオプションに相当するものはなさそうです。そのかわりに以下のようにすれば多少は安心できるのではないでしょうか。

## --summary
~~~
$ sqldiff --summary my_sqlite1.db my_sqlite2.db
my_table0: 0 changes, 0 inserts, 0 deletes, 1085 unchanged
my_table1: 0 changes, 0 inserts, 0 deletes, 1066 unchanged
my_table2: 0 changes, 0 inserts, 0 deletes, 1593 unchanged
my_table3: 0 changes, 0 inserts, 0 deletes, 327 unchanged
~~~
このオプションは差の集計を出力してくれるものです。上の例で言うと、どちらのデータベースにも共通の名前のテーブルが（4つ）あり、各テーブルで変更されたもの（change）、挿入されたもの（insert）、削除されたもの（delete）はなく、変化がないもの（unchanged）ばかりだ、ということが分かります。なので、my_sqlite1.dbとmy_sqlite2.dbの中身は同じだと自信を持って判断できますね。

## --transaction
~~~
sqldiff --transaction my_sqlite1.db my_sqlite2.db 
BEGIN TRANSACTION;
COMMIT;
~~~
このオプションは出力をトランザクションとしてまとめてくれるものです。"BEGIN TRANSACTION;"と"COMMIT;"で囲まれた部分が出力ですから、出力は何もない、ただし、"BEGIN TRANSACTION;"と"COMMIT;"は出力しているからsqldiffとしてはちゃんと動作しているようだ、と安心できるのではないでしょうか。
テスト91

```vb

Sub Cell_Select()

'H1セルとI1セルを結合セルとする
'カーソルを手動で移動させるような動作をさせる...〆('ω'*)ﾒﾓﾒﾓ

With ThisWorkbook.Sheets("商品テーブル1")

    .Range("K1").Select

    '以下のコードだとH1セルで止まってしまう
'    .Range("K1").Previous.Previous.Previous.Select
    
    '以下のコードでG１セルを選択できる
    Selection.Previous.Select
    Selection.Previous.Select
    Selection.Previous.Select
    
    .Range("G1").Select
    
    '以下のコードではK1セルは選択できない(J1セルを選択してしまう)
'    Selection.Next.Next.Next.Select
    
    '以下のコードでK1セルを選択できる
    ActiveCell.MergeArea.Item(ActiveCell.MergeArea.Columns.Count).Next.Select
    ActiveCell.MergeArea.Item(ActiveCell.MergeArea.Columns.Count).Next.Select
    ActiveCell.MergeArea.Item(ActiveCell.MergeArea.Columns.Count).Next.Select
    
End With

End Sub
読書ログが表示される流れ

**読書ログが表示される流れ**
まず、読書ログのページにアクセスするために、ブラウザはDNSを使用してドメイン名をIPアドレスに変換します。その後、TCP/IPプロトコルを使用してHTTPリクエストデータを小分け（パケット）にして、読書ログのサーバーに送信します。サーバーはHTTPレスポンスを返し、ブラウザに表示するための情報を提供します。

このときのHTTPメソッドは通常GETメソッドが使用され、通信が成功した場合はステータスコード200が返されます。

次に、登録ページからデータを登録する場合、HTTPメソッドはPOSTが使用されます。成功した場合は、ステータスコード201（作成）が返されます。

データが登録された後、一覧ページにリダイレクトされます。この場合、HTTPメソッドはGETが使用され、ステータスコード302（一時的リダイレクト）が返されます。


**構成**
paiza.ioでelixir その218

# 概要
paiza.ioでelixirやってみた。
gen_event使ってみた。

# 参考にしたページ。

https://qiita.com/feelinguy/items/4cf35fe2a417a39c6f09

# サンプルコード

```

defmodule Curling.Dump do
  def set_teams(team_a, team_b) do
    IO.puts("Scoreboard: #{team_a} vs #{team_b}")
  end
  def next_round do
    IO.puts("Scoreboard: ラウンド終了")
  end
  def add_point(team) do
    IO.puts("Scoreboard: #{team} のスコアを１増加")
  end
  def reset_board do
    IO.puts("Scoreboard: 全チームを未定義、全スコアを０に設定")
  end
end

defmodule Curling.ScoreBoard do
  alias Curling.Dump
  def init([]), do: {:ok, []}
  def handle_event({:set_teams, team_a, team_b}, state) do
    Dump.set_teams(team_a, team_b)
    {:ok, state}
  end
  def handle_event({:add_points, team, n}, state) do
    1..n
    |> Enum.each(fn _ -> 
        Dump.add_point(team) 
    end)
    {:ok, state}
  end
  def handle_event(:next_round, state) do
    Dump.next_round()
    {:ok, state}
  end
  def handle_event(_event, state) do
    {:ok, state}
  end
  def handle_call(_term, state) do
    {:ok, :ok, state}
  end
  def handle_info(_term, state) do
    {:ok, state}
  end
end

{:ok, pid} = :gen_event.start_link()

:gen_event.add_handler(pid, Curling.ScoreBoard, [])

:gen_event.notify(pid, {:set_teams, "Pirates", "Scotsmen"})

:gen_event.notify(pid, {:add_points, "Pirates", 3})

:gen_event.notify(pid, :next_round)

:gen_event.delete_handler(pid, Curling.ScoreBoard, :turn_off)

:gen_event.notify(pid, :next_round)


```

# 実行結果

```
Scoreboard: Pirates vs Scotsmen
Scoreboard: Pirates のスコアを１増加
Scoreboard: Pirates のスコアを１増加
Scoreboard: Pirates のスコアを１増加
Scoreboard: ラウンド終了
```

# 成果物

https://paiza.io/projects/bs5NTF_ruEYghkvsCNdM7Q


以上。
hyper-v マネージャーで作成したubuntu 22.04 でdocker desktop for Linux をインストールすると「Docker Desktop Stopped...」のまま起動できない件について

# TL;DR

* docker desktop for Linux の動作にはKVMが有効化になっている必要があるが、hyper-vで作成するubuntuではデフォルトで有効化されていない
* hyper-vでのubuntu 22.04 上で仮想化を可能にする

https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/nested-virtualization#configure-nested-virtualization

* ubuntu内でKVM virtualization supportを設定

https://docs.docker.com/desktop/install/linux-install/#kvm-virtualization-support

# docker desktop for Linux のインストール

インストール自体はこれの通りにやればOK。

けどそれだけだと動作しない

https://docs.docker.com/desktop/install/ubuntu/

# 「Docker Desktop Stopped...」のまま起動できない

プロセスは存在しているがずっとStoppedのまま

調べるといろいろ報告がありますが、私の場合はKVMが無効になっていたためでした。

DockerDesktop上の画面ではログなどは確認できない

# 原因

私の場合はKVMが無効になっていたためでした

# 対応

* hyper-vでのubuntu 22.04 上で仮想化を可能にする

https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/nested-virtualization#configure-nested-virtualization

* ubuntu内でKVM virtualization supportを設定

https://docs.docker.com/desktop/install/linux-install/#kvm-virtualization-support

対応後ログアウト・ログインし直すと、「Docker Desktop Starting...」になり、しばらく待つと正常に起動します
Visual Studioの既定テンプレートとスニペット

Visual StudioのWindowなどの既定テンプレートには説明的なコメントが入っていたりして、最初は参考になっても、慣れると無駄なだけだったりしますが、これが入るのを変えるにはテンプレートを修正する必要があります。

## テンプレート

このテンプレートファイルのパスは以下のようになります。

```
%ProgramFiles%\Microsoft Visual Studio\2022\<edition>\Common7\IDE\ItemTemplates\<Language>\<Locale ID>
```

`<edition>`にはCommunityなど、`<Language>`にはC#の場合はCSharpが入ります。`<Locale ID>`は英語では1033、日本語では1041になります。

[How to: Locate and organize project and item templates](https://learn.microsoft.com/en-us/visualstudio/ide/how-to-locate-and-organize-project-and-item-templates)

この前後のフォルダーに色々なテンプレートがありますが、例えば、

- Visual Studio 2022 Community
- C#
- WPF
- English

のものは以下のパスにありました。

```
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\ItemTemplates\CSharp\WPF\1033
```

![wpf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60028/9f193969-bcf8-4b35-b63b-f419cb1364ed.png)

テンプレートファイルは権限の関係で直接編集できませんが、一旦デスクトップなどに保存後、元のフォルダーに上書きすれば（「続行」を選択）修正できます。

## スニペット

`propdp`や`propa`などのスニペットは@soiさんの記事から変わっていないようです。

[C#7時代の依存関係プロパティと添付プロパティのコードスニペット](https://qiita.com/soi/items/c8686230f759cb4b9dc6)

パスは同じ条件で以下のとおりでした。

```
C:\Program Files\Microsoft Visual Studio\2022\Community\VC#\Snippets\1033\NetFX30
```

このカスタマイズでは、特にownerclassに`<Function>ClassName()</Function>`を入れるのが有用です。これは自明なくせに、いちいち変えるのが面倒なんですよね。

ちなみに、`propdp`で`nameof`を使うことには個人的には否定的で、プロパティ名を変えるにもDependency PropertyとCLRアクセサーを自動的に合せられないので、作り直した方が確実かと。
[GitHub]メインメニューとサブメニューを和訳してみた。

GitHubにおいて

> Code、issues、Pull Requests、Actions、Projects、Security、Insights、Settings
> Githubにおけるそれぞれ意味と、具体的な説明を教えてください。

GitHubには、多くのフレームワークや機能があります。
以下はそれぞれの機能について説明します

|メインメニュー内容|意味や説明|
|--|--|
|Code|リポジトリ内のソースコードを表示するページです。ここでは、コードを閲覧したり、変更を加えたりすることができます。|
|Issues|リポジトリ内の問題やトラブルシューティングを行うためのページです。ここでは、問題を提示したり、解決策を提案したりすることができます。|
|Pull Requests|他の人からの変更をマージするためのページです。ここでは、変更をリクエストしたり、他の人の変更をレビューしたりすることができます。|
|Discussions|リポジトリに関連付けられたコミュニケーションツールです。Discussionsを使用することで、リポジトリのメンバーや関連するコミュニティとのコミュニケーションを簡単に行うことができます。このツールを使用することで、開発者やユーザーのフィードバックを収集し、議論を促進することができます。また、特定のトピックに関する詳細な議論を行うこともできます。|
|Actions|GitHub上で自動的に実行するワークフローを設定するためのページです。ここでは、リポジトリ内の変更に対して自動的に実行されるタスクを設定することができます。|
|Projects|リポジトリ内のタスクやプロジェクトを管理するためのページです。ここでは、タスクを追跡したり、タスク間の依存関係を設定したりすることができます。|
|Security|リポジトリのセキュリティに関連するページです。ここでは、セキュリティ上の問題を検出したり、修正することができます。|
|Insights|リポジトリに関する詳細な情報や統計を表示するページです。ここでは、リポジトリのアクティビティやコミット状況などを確認することができます。|
|Settings|リポジトリの設定を行うためのページです。ここでは、リポジトリ名や説明文、リポジトリのプライバシー設定などを変更することができます。また、コラボレーターやフォークの設定、GitHub Pagesサイトの設定、GitHub Actionsワークフローの設定なども行うことができます。このページを使用することで、リポジトリを適切に管理することができます。|

> Author Label Projects Milestones Assignee
> Githubにおけるそれぞれ意味と、具体的な説明を教えてください。

これらのタグはプロジェクトの管理に役立つものです。詳細は以下の通りです。

|サブメニュー内容|意味や説明|
|--|--|
|Author|コミットやプルリクエストなどの作成者を表します。|
|Label|イシューやプルリクエストに付けられたラベルで、そのタスクや問題のカテゴリーや状況を表現することができます。|
|Project|複数のイシューやプルリクエストをまとめて管理するためのツールです。カードやカンバンのような形式で、タスクを管理したり、進捗状況を追跡することができます。|
|Milestone|一連のタスクや問題の進捗状況を追跡するためのツールです。特定の期限やゴールに向けて進めていくことができます。|
|Assignee|イシューやプルリクエストに対して責任者を割り当てることができます。担当者は問題の解決やタスクの進捗状況の管理を行うことが求められます。|

これらを理解し、GitHubのプロジェクト管理に活用することで、より効率的な開発が行えるようになります。

## 青空プログラミング❌プログラミングラボ 企画
note と連動していきます
https://note.com/thecardgame/n/n7ced7c281a43

Twitterアカウント
💻プログラミングラボ💻
[＠PLab2020](http://twitter.com/PLab2020)
UserLAndのUbuntuにインストールしたMySQLを自動起動させる

## MySQLを自動起動させたい
UserLAndのUbuntu22.04にMySQL8.0がインストールされている状態。
UserLAndからUbuntuを立ち上げたときに自動でMySQLが起動するようにしたいけど、UserLAndではsystemctlが使えないので他の方法で自動起動するようにしました。そのやり方のメモを残します。

## Ubuntu起動時に実行するスクリプトを使用する
UserLAndでUbuntuを立ち上げたときに`/support/startSSHServer.sh` を起動しているのでこのファイルにMySQL起動コマンドを追記する。

```sh 
vim /support/startSSHServer.sh


#! /bin/bash

if [ ! -f /support/.ssh_setup_complete ]; then
    rm -rf /etc/dropbear
    mkdir /etc/dropbear
    dropbearkey -t dss -s 1024 -f /etc/dropbear/dropbear_dss_host_key
    dropbearkey -t rsa -s 2048 -f /etc/dropbear/dropbear_rsa_host_key
    dropbearkey -t ecdsa -s 521 -f /etc/dropbear/dropbear_ecdsa_host_key
    touch /support/.ssh_setup_complete
fi

dropbear -E -p 2022

# Start MySQL server
/etc/init.d/mysql start
```
UserLAndからUbuntuを再起動すると、MySQLが起動している。
ちなみに`update-rc.d`も試しましたが、こちらの方法ではできませんでした。
ChatGBTのAPIキーの発行方法

ChatGBTのAPIキーの発行方法

①ChatGBTのサイトからサインアップ
アカウントを作成

②作成後　Personalを選択
![スクリーンショット 2023-04-02 3.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297716/fd7762f3-8d9e-1dfd-28a6-886b67d86b7c.png)

③APIキーの発行は、自分のアカウントのサイドバーにある「APIキー」をクリックする
![スクリーンショット 2023-04-02 3.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297716/cd29e419-7ad2-0c4e-3924-7e9007b795ad.png)

④「Create API Key」をクリックするだけで発行できます。
![スクリーンショット 2023-04-02 3.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297716/22e7072c-8b71-eb1d-d844-8e119610633d.png)

⑤発行される。
![スクリーンショット 2023-04-02 3.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297716/9319eba8-7e76-7a27-3d48-3e8981a9483b.png)
振り子に現れる特殊関数(5/5)

# はじめに
前回までに振り子の運動についての計算はほぼ終わりました。ここでは，特殊関数で置くだけでなくもう少しだけ深く計算をしてみることにします。
以下，少し難しい内容もあるかもしれませんが記事の最後に参考を載せておくので，わからない部分は参照してください。

前回の記事はこちら↓↓↓
https://qiita.com/nefu_chem/items/0b887e7757fbd2cdeb7f

# 第一種完全楕円積分
第一種完全楕円積分を実行してみます。記事では計算不可能と書きましたが，ある程度までは進めることができます。
そもそも第一種完全楕円積分とは以下のようなものでした。
```math
\int _0^{\frac{\pi }{2}}\frac{d\phi }{\sqrt{1-k^2 \sin ^2 \phi }}
```
まずは準備として被積分関数とよく似た関数である
```math
\frac{1}{\sqrt{1-x}}
```
を$x=0$のまわりでTaylor展開します。計算は難しくないので省略しますが
```math
\frac{1}{\sqrt{1-x}} = 1 +\frac{1}{2}x + \frac{3}{8}x^2 + \cdots = \sum_{n=0}^{\infty }\frac{(2n-1)!!}{2n!!}x^n
```
となります。ここで$n!!$は二重階乗というもので一つおきにかけ合わせたものです(ex. $5!! = 5\times 3\times 1$)。
これを用いて先の積分は
```math
\int _0^{\frac{\pi }{2}}\frac{d\phi }{\sqrt{1-k^2 \sin ^2 \phi }} = \int _0^{\frac{\pi }{2}} \sum _{n=0}^{\infty} \frac{(2n-1)!!}{(2n)!!}(k^2\sin ^2\phi )^n d\phi
```
となります。残ったのは$\sin ^{2n}\phi $の積分です。この積分は高校数学でもお馴染みWaliis積分です。詳しくは省略しますが
```math
\int _0^{\frac{\pi }{2}} \sum _{n=0}^{\infty} \sin ^{2n} \phi d\phi = \frac{\pi }{2} \sum _{n=0}^{\infty} \frac{(2n-1)!!}{(2n)!!}
```
となります。
以上より楕円積分は
```math
\int _0^{\frac{\pi }{2}}\frac{d\phi }{\sqrt{1-k^2 \sin ^2 \phi }} = \frac{\pi }{2}\sum _{n=0}^{\infty}(\frac{(2n-1)!!}{(2n)!!})^2k^{2n}
```
となります。

# 周期の再考
Taylor展開とWallis積分より周期は
```math
T = \frac{2\pi }{\omega_0}\sum _{n=0}^{\infty}(\frac{(2n-1)!!}{(2n)!!})^2k^{2n}
```
となります。$ k=\sin \theta_m $でしたので無限級数の部分に注目してみましょう。$\xi =\sum _{n=0}^{\infty}(\dfrac{(2n-1)!!}{(2n)!!})^2k^{2n}$とおいてみます。きちんと書いてみれば
```math
\begin{align}
\xi &=\sum _{n=0}^{\infty}(\frac{(2n-1)!!}{(2n)!!})^2k^{2n}\\
&=1+(\frac{1}{2})^2\sin ^2 \frac{\theta_0}{2}+(\frac{3}{2\cdot 4})^2\sin ^4 \frac{\theta_0}{2}+\dots
\end{align}
```
となります。
ここで $f(\theta)=\sin ^2 \dfrac{\theta_0}{2}$ が $0<\theta<\pi $ での動きを考えると， $0<f(\theta)<1$ かつ単調増加関数であるので，最大角 $\theta_0$ が小さいとき，$\xi $ の最初の数項だけをとればよいことがわかります。つまり，$\theta_0\fallingdotseq 0$ のとき$\xi \fallingdotseq 1$となり，近似する前の周期$T$と一致することがわかりました。

# おわりに
今回は振り子を一例に物理に現れる特殊関数を見てみました。特殊関数といっても，それは三角関数や指数関数と同じようなもので，様々な物理現象を数式で記述する際に初等関数についで頻繁に現れる関数に名前をつけたものを指します。ここで扱った特殊関数はごく一部ですので，勉強を進めていって沢山の特殊関数に出会ってください！

# 参考
二重階乗について
https://manabitimes.jp/math/1369
Wallis積分について
https://mathlandscape.com/wallis-integral/
振り子に現れる特殊関数(4/5)

# はじめに
続きの記事です。前回の記事はこちら↓↓↓
https://qiita.com/nefu_chem/items/3788f6512a19c9f5b3e3

# 振り子の運動
それでは最後に振り子の運動を解きます。つまり$\theta $を$t$の関数として表します。先ほどの計算と同じノリで考えて
```math
t = \int_0^t dt = \int_0^{\theta} \frac{d\theta}{\omega_0 \sqrt{2(\cos \theta - \cos \theta_m)}}
```
となります。ここで$\phi $を$\sin \dfrac{\theta }{2} = \sin \dfrac{\theta_m }{2} \sin \phi $を満たすようにとると
```math
t = \frac{1}{\omega _0} \int_0^{\phi } \frac{d\phi ^{\prime }}{\sqrt{1- k^2\sin^2 \phi ^{\prime }}}
```
となります。ここで出てきた積分($0<k<1$)
```math
\begin{align}
F(\phi , k) &= \int_0^{\phi } \frac{d\phi ^{\prime }}{\sqrt{1- k^2\sin^2 \phi ^{\prime }}}\\
&= \int_0^{\sin \phi } \frac{du}{\sqrt{(1-u^2)(1-k^2u^2)}}
\end{align}
```
を第一種楕円積分といいます。先の記事に出てきたのは$\phi = \dfrac{\pi }{2}$の第一種完全楕円積分であることに注意してください。
これで$t$を$\theta $で表せたので逆関数を考えましょう。楕円積分
```math
y = \int_0^x \frac{du}{\sqrt{(1-u^2)(1-k^2u^2)}} \quad (0<k<1)
```
の逆関数を
```math
x=sn(y, k)
```
と書くことにしましょう。この関数はJacobiの楕円関数という特殊関数の一つです。これを用いれば
```math
\sin \phi = sn(\omega_0t, k)
```
となります。$\sin \dfrac{\theta }{2} = k\sin \phi $だから最終的な解は
```math
\theta = 2 \sin ^{-1} [k sn(\omega_0t, k)]
```
となりました。これで振り子の運動を解くことができました。
これで話を終わってもいいですが，最後のおまけとして前回からの計算をもう少し深くやってみることにします。
振り子に現れる特殊関数(2/5)

# はじめに
前回の記事の続きです。前回の記事はこちら↓
https://qiita.com/nefu_chem/items/34941d51bd3438e84975

# Taylor展開
本記事ではTaylor展開を使うので軽くまとめておきます。きちんと学びたい方は数学書を参考にしてください。
変域では発散せず，何度も微分できる関数$f(x)$を考えます。このような関数は一般に以下のように表せます。
```math
f(x)=\sum_{m=0}^{\infty } C_m x^m
```
この式を用いると$f(x+a)$は
```math
f(x+a)=\sum_{m=0}^{\infty } C_m (x+a)^m
```
となります。皆さん大好き二項定理より
```math
(x+a)^m = \sum_{l=0}^m \frac{m!}{(m-l)!l!}x^{m-l}a^l
```
だから，先の式は
```math
f(x+a)=\sum_{m=0}^{\infty } \sum_{l=0}^m C_m \frac{m!}{(m-l)!l!}x^{m-l}a^l
```
となります。
ところで一番最初の式を$l$回微分してみると
```math
f^{(l)}(x) = \sum_{m=0}^{\infty } C_{m+l} (m+l)(m+l-1) \cdots (m+1)x^m = \sum_{m=0}^{\infty } C_{m+l} \frac{(m+l)!}{m!} x^m
```
となりますよね。この式より
```math
\sum_{l=0}^{\infty }\frac{1}{l!}f^{(l)}(a)x^l = \sum_{l=0}^{\infty } \sum_{m=0}^{\infty } C_{m+l} \frac{(m+l)!}{l! m!} a^m x^m
```
という式が得られて，ここで $l=n-m$ と置き換えてやれば
```math
\sum_{l=0}^{\infty }\frac{1}{l!}f^{(l)}(a)x^l = \sum_{n=0}^{\infty } \sum_{m=0}^n C_n \frac{(n-m)!m!}{n!} a^m x^{n-m}
```
となります。これは先の$f(x+a)$の式と一致するので
```math
f(x+a) = \sum_{l=0}^{\infty } \frac{1}{l!}f^{(l)}(a)x^l
```
と表されます。これがTaylor展開の公式です。

# 振り子の周期の導出に戻ってみる
さて，前回記事でやったことをもう一度見ていきます。
前回の導出で出てきた式
```math
\frac{d^2(\theta )}{dt^2} + \omega _0 ^2 \sin \theta = 0
```
がありました。前回はここで$\sin \theta \approx \theta $の近似を用いました。ですが，ここでは厳密解を求めることを試みます。そこで先ほど考えたTaylor展開を$\sin \theta $に対して行ってみましょう。
```math
\sin \theta = \theta - \frac{1}{3!} \theta ^3 + \frac{1}{5!} \theta ^5 - \frac{1}{7!}\theta^7 + \cdots = \sum_{n=0}^{\infty } \frac{(-1)^n}{(2n+1)!} \theta ^{2n+1}
```
これが先ほどの微分方程式に含まれていることが見えました。つまり，関数$\theta (t)$に対して無限に続く$\theta ^n$の項を含み，これを難しい言葉で非線形微分方程式といいます。ですが，もし$\theta $が小さければこの式からも分かるように$\sin \theta \approx \theta $の近似を用いることができ，前回同様に解けます。
ですが，もし$\theta $が大きければどうしましょう？（記事が重くなってきたので次に続く）