OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetes Internal #2に参加してみた

# Kubernetes Internal #2に参加してみた
Kubernetes InternalはKubernetesの内部実装を読み解いていくミートアップです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/12b31b83-f2be-5f39-0e8a-2c9367d0dc69.png)

https://k8sinternal.connpass.com

# 個人的に気になったポイントまとめ
## Q1 コンポーネントごとの関係性をまとめた資料などあったりする?
A1. inductorさん
KubernetesのComponentの関連性については、ZLabさんの下記の資料が参考になるとのこと。
https://www.youtube.com/watch?v=_Bve-nkBr2E 
https://qiita.com/yuanying/items/ceeeb7329a4fdc566546

A1. bells17さん
Kubernetes Componentの概観図については公式のドキュメントが参考になるとのこと
https://kubernetes.io/docs/concepts/overview/components/

## Q2 kube-apiserver, controller-manager, schedulerの図はよく見る気がするのですが、一歩進んでcluster-autoscalerなどが出てきたときに関連性をどのように整理されて理解されているのか
A2. inductorさん
Kubeconのメンテナセッションなどで、コンポーネント毎の動画を見るのがいい。
メンテナに質問もできるしおすすめとのこと。
例えば下記のような動画などがある。
https://www.youtube.com/watch?v=hoU79zapdYQ
https://www.youtube.com/watch?v=OXSRfl8mYyo

## Q3 KubernetesからCloudをラップする意味合いではcloud-cotroller-managerや[ACK](https://github.com/aws/aws-controllers-k8s)は両者同じような立ち位置かと思うが、役割についてコメントもらえるか
A3. inductorさん
ACKはAWSのCloud Formationやterraformのようなものの理解。
Kubernetes側でAWSリソースのライフサイクルを管理したくなったときにはユースケースがあるかも。
似たような前身として、[KubernetesのService Catalog](https://kubernetes.io/docs/concepts/extend-kubernetes/service-catalog/)というものがあるがメンテナンスされてるかわからない。

A3. bells17さん
etcdからデータを消す感覚でAWSリソースが消えるので、運用は少し大変かもしれない。

### Q3 個人的な補足
service catalogについて少し調べてみた
Kubernetesではないが、Openshift 4以降(Kubernetes 1.12以降)にてService Catalogはdeprecatedになっているよう

> The service catalog is deprecated in OpenShift Container Platform 4. Equivalent and better functionality is present in the Operator Framework and Operator Lifecycle Manager (OLM).

参考:  https://docs.openshift.com/container-platform/4.1/applications/service_brokers/installing-service-catalog.html

またService Catalogより優れた機能を持つ後続のOperator Frameworkは今年の7月にCNCFのIncubating projectになっている
https://www.cncf.io/blog/2020/07/09/toc-approves-operator-framework-as-incubating-project/

実質、Service Catalogは廃止してOperator Frameworkに統合していく動きかと思われる。
AccessのVBAで引数の渡し方を省略した時は参照渡しになるのでちょっと気を付けよう

#本当か～？本当にそうか～？
確認コードのテンプレはこちら。

```vb:
Option Compare Database
Option Explicit

Private Sub do_Click()

    Dim str As String
    str = "シャミ子"
    
    '関数に渡す前
    Debug.Print str
    
    Call momo(str)
    
    '関数に渡した後
    Debug.Print str

End Sub


Private Function momo(arg As String)
    arg = arg + "が悪いんだよ"
End Function
```

結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cc9c7b84-d333-ea96-9887-c043fefdf02a.png)


#蛇足
別の言語からVBAに移ると、あれ？デフォルトってどっちだっけ？とか、ああ…VBAはデフォルトは参照渡しだったのね…、なんていろいろ間違えちゃうことあります。

『ByVal or ByRef を必ず付ける』というコード規約にすると良いかもですね。

VBE側で『ByVal』と自動補完してくれて、必要がある時だけ『ByRef』に変更、が一番ベストかなって思います。
できるだけ疎結合になるように。


#参考サイトさん
http://officetanaka.net/excel/vba/tips/tips94.htm

#バージョン
Windows10 Pro バージョン1909 OSビルド18363.1171
Access for Microsoft 365 MSO（16.0.13328.20262）32ビット
【Django】Webアプリ入門 Part1 MTVモデルとは

#はじめに
この記事シリーズでは、Python、JavaScript歴1年の大初心者がどうにか頑張ってWebアプリを作ろうとする過程を克明に描き出したいと思います。
なるべく公式ドキュメントやいろいろなサイトを調べて間違いのないようにしますが、これは違うんじゃない？と思ったら是非コメントをください！！
**ほかのプログラマ・エンジニアの方の生の声をいただくことは初心者にとっては貴重な学習の機会になります！！**

#Part1でやること
[前回](https://qiita.com/sun-narumi/items/6737ad7579df4e402ec3 "Pre")の記事ではDjangoとReact.jsを使ってWeb家計簿アプリを作るという方針を決定しました。
今回からはDjangoについて学んでいこうと思います。
いきなり環境構築やコーディングから始める前にDjangoの骨子を一通り確認してみたいと思います。

#Webアプリケーションに必要なこと
Webページは適切な実行環境とHTMLファイルさえあれば作ることができます。
しかし、それだけでは**動的な**Webページにするのは限界があります。
Webページが動的であるとは、ユーザーからのデータによって表示する内容を変える仕組みを持っているということです。
さらに本格的なWebアプリケーションではデータを保持、管理する仕組みが必要不可欠になってきます。
主にそれは**データベース**によって実現されます。
また、データベースやユーザーから取得したデータの処理はHTMLファイルでは行えないので、それを処理してHTMLファイルに埋め込む仕組みも必要です。

まとめると、ある程度の規模を持つWebアプリケーションを作成するためには**HTMLファイル、データベース、ユーザーとデータベースからのデータを処理する仕組み**の3つが必要であるということです。
(補足: 実行環境のことなどを考えるともっといっぱい必要になります。大変ですね...)

#Djangoとは？
Djangoは先ほど述べた3つの仕組みのうちでは、HTMLファイルと、ユーザーとデータベースからのデータを処理する仕組みを提供します。
もう少し正確に言うとHTMLファイルを提供するというよりかは、データを埋め込んだHTMLファイルを作成する仕組みを提供します。
その中で開発者側が基本的に操作する部分は3つに大別され、**M(モデル) T(テンプレート) V(ビュー)**と呼ばれます。
次のセクションからそれぞれが何をするところなのかを見てみます。
#T(テンプレート)
先ほどDjangoではデータを埋め込んだHTMLファイルを作成する仕組みがあると述べました。
ここをもう少し詳しく説明すると２ステップに分かれます。
まず、開発者は決まりに従ってテキストファイルを作成します。その際に埋め込みたいデータも記述します。
そして、Djangoアプリケーションが実行されると、そのテキストファイルが自動的に翻訳されHTMLファイルに変換されます。
このようにしてデータが埋め込まれたHTMLファイルが作成されるのですが、このときに元となるテキストファイルを**テンプレート**といい、テンプレートをHTMLファイルに変換する機能を持つソフトウェアを**テンプレートエンジン**と言います。
開発者はテンプレートエンジンをカスタマイズすることもできますが、デフォルトでも十分便利です。よってテンプレートだけを気にすればよいのです。

テンプレートにはユーザーとデータベースからのデータを埋め込むことができますが、そのデータはビューから渡されます。
ユーザーはそれをもとに作られたHTMLファイルをWebブラウザが整形したWebページを見るのですが（ややこしい）、
その際にフォーム等があったときはその入力データがテンプレートで記述したルールに従ってビューに渡されます。
詳しくはビューのセクションを見てください。
#M(モデル)
Djangoとは？のセクションで、Djangoはユーザーとデータベースからのデータを処理する仕組みを提供すると述べました。そしてテンプレートのセクションの最後でユーザーからのデータを処理する仕組みは軽く説明しました。
データベースからデータを取得し処理する仕組みはどうなっているのでしょうか。
基本的なやり方では**モデル**というクラスを用意して、ビューからそれを操作することで間接的にデータベースを操ります。
モデルがビューとデータベースのインターフェース（接点）となるというわけですね。
このようにデータベースの情報をオブジェクト指向的にあらわす手法を**O/Rマッピング**と言います。

実は、ビューから直接データを取得することもできます。
何故ビューから直接データを操らないのかというのは思想的な問題になるので
初学者からすると何とも言えませんが、[このスライド](https://www.slideshare.net/kwatch/sqlor "Slide")をみてなるほどーと思いました。
しかし、[O/Rマッピングは百害あって一利なし！](https://qiita.com/gomiryo/items/6d448c500749f91242d2)と考える人もいます。
（余談ですが技術的なことよりこういう思想的なことを学ぶほうが大変ですよね...）


#V(ビュー)
ビューはテンプレートとモデルで述べたように、ユーザから送られてきたりデータベースから抜き出したデータを処理し、
データベースに反映したりWeb上での表示を変えたりする、**全体の制御役**を務めます。その実体は関数やクラスです。
モデル・テンプレートとの関係を明確にすると、
ビューはモデルやそのインスタンスを操作することでデータベースからデータを取得したり追加や削除をし、
ユーザーの様々な入力情報を取得し、それらやデータベースからのデータをテンプレートに渡すという役割を持っています。

ビューはURLと対応しており、「このURLが指定されたらこのビューの処理を実行させる」という形でその機能を果たしています。
よって、全体の流れを確認すると
URLが指定される->ビューが呼び出される->ビューは諸データを取得・処理しテンプレートファイルに渡す
->そのファイルはテンプレートエンジンによりHTMLファイルに変換され、ブラウザに渡される->Webページが表示される
といったようになります。
#まとめ
簡単にテンプレート・モデル・ビューについてまとめると、
テンプレートは実際の表示となるHTMLファイルをつくる元となるテキストファイルで、
モデルはデータベースと対応し、Django上でビューとデータベースのインターフェース的役割を果たすクラスであり、
ビューはテンプレートやモデルを制御する関数やクラスのことです。
これによってWebアプリケーションのうちのHTMLファイルを提供する仕組みと様々なデータを取得し処理する仕組みが実現されます。
次回ではDjangoの開発環境構築を行いたいと思います。
ご感想やご意見がありましたら是非コメントしてください！
Rでforループ内にkable文を入れたら、表を出力してくれず困ったときの対処

ただの小ネタで備忘録です。

#困ったこと
次のような文をR Markdownで書いたときに、kableの表が表示されなくて困ったことがありました。

```{R}
#```{r}
files <- list.files(path, pattern=".csv")
for (csv.file in list.file){
  df <- read.csv(csv.file)
  knitr::kable(summary(df)) #問題の箇所
}
#```
```
（RMarkdownのchunk区切りをそのまま表示できないので、苦し紛れにコメントしてます。）
これを実行してもkableの表は出力されません。forの外なら出力されるのに。。

#解決方法
[stack overflowにドンピシャの解決方法が載っており](https://stackoverflow.com/questions/39650166/r-why-kable-doesnt-print-inside-a-for-loop)があり、これにならって書き直して実行したら無事に出力されました。```{r results="asis"}を指定して、kableの箇所はprintで出力されるようにする必要がありましたという話。

```{R}
#```{r results = "asis"}
files <- list.files(path, pattern=".csv")
for (csv.file in list.file){
  df <- read.csv(csv.file)
  print(knitr::kable(summary(df))) #問題の箇所
  cat("\n")
}
#```
```

#終わりに
まあ、Rではfor文はあまり好まれませんし、他のやり方をした方がいいのかなとは思います。

#参考文献
[Stack overflow - R: why kable doesn't print inside a for loop?](
https://stackoverflow.com/questions/39650166/r-why-kable-doesnt-print-inside-a-for-loop)
Auth0のWebAuthn登録時の公開鍵クレデンシャル生成オプション

Auth0にBeta版だけどWebAuthnがきていたので少しだけ動かしてみた。
とりあえず`PublicKeyCredentialCreationOptions`を見てみたのでメモ

```JSON
{
  "publicKey": {
    "challenge": "OEOI7G_mIg8XXptQkIzVlA3CW6YmUckLLkOX5LhCt6k",
    "rp": { "name": "morikawa" },
    "user": {
      "id": "auth0|5f759a4b44d2020069567094",
      "name": "xxxxxxxx@gmail.com",
      "displayName": "xxxxxxxx"
    },
    "pubKeyCredParams": [
      { "alg": -7, "type": "public-key" },
      { "alg": -257, "type": "public-key" }
    ],
    "authenticatorSelection": {
      "userVerification": "discouraged",
      "authenticatorAttachment": "cross-platform"
    },
    "timeout": 60000,
    "attestation": "none",
    "excludeCredentials": []
  }
}
```

[Configure WebAuthn with Security Keys for MFA](https://auth0.com/docs/mfa/configure-webauthn-with-security-keys-for-mfa)

---

> Auth0 will support platform authenticators in the future.

公式サイトのこの記述は、`authenticatorAttachment`が`cross-platform`になっている、ってだけなのかな。
[Blender×Python]   コードを記号で考える

#目次

0.コードを記号で考えるとは
1.今回使うコード
2.変数とは
3.メソッドとは
4.ドット(.)の役割
5.イコール(=)の役割
最後に

#0.コードを記号で考えるとは
コードを正確に読むためには**コード全体をみる**ことが大事です。

コード全体をみるためには、抽象化して情報を**圧縮する**のがポイントです。
短くなれば理解しやすいですよね!!
これがコードを記号化するということです。

コードを読むときに、**左端から順に読む**のはおすすめしません!!!!!!!!!


#1.今回使うコード
使うコードは、前回の記事で使用したmonkeyを追加するコード(↓)です。

```.py
bpy.ops.mesh.primitive_monkey_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
```
記号化(抽象化)は以下のようなイメージです。

bpy.ops.mesh.primitive_monkey_add(size←2, enter_editmode←False, align←'WORLD', location←(0, 0, 0), scale←(1, 1, 1))

⬇️
□.□.□.primitive_monkey_add(□←2,□←False,□←'WORLD',□←(0, 0, 0),□←(1, 1, 1))

⬇️
===>関数(□←数値,□←真偽値,□←文字列,□←タプル,□←タプル)

⬇️
===>関数(引数1,引数2,引数3,引数4,引数5)

⬇️
**引数を5つ使ってmonkeyを追加する処理を行う**

---

#2.変数とは
変数はデータを入れておく**箱**のようなものです。

変数を□とおくと、上のコードは
``□.□.□.primitive_monkey_add(□=2,□=False,□='World',□=(0,0,0),□=(1,1,1))``
となります。

---

#3.関数とは

関数は**出力装置**のようなものです。
備え付けの( )の中にある情報( **引数** )を使って、決められた処理を行います。

ここでは、**primitive_monkey_add( )**が関数です。
( )の中にある、**大きさや位置の情報**を使って、monkeyを出現させます。



---



#4.ドット ( . ) の役割

ドットは　**右向きの矢印(→)**　と考えるとわかりやすいです。
つまり最初の部分は
``bpy → ops → mesh → primitive_monkey_add( )``
となります。

日本語でいうならば**~の中にいく**という意味です。
``bpy　の中の　ops　の中の　mesh　の中の　primitive_monkey_add( )``

つまり目的のもの(ここでは関数)に到達するための**道筋**だとも言えます。
``====> primitive_monkey_add( )``


#5.イコール ( = ) の役割

イコールは　**左向きの矢印(←)**　だと考えるとわかりやすいです。
つまり、メソッドの( )のなかは、

``size ← 2,
enter_editmode ← False,
align ← 'WORLD',
location ← (0, 0, 0),
scale ← (1, 1, 1)``

となります。

日本語でいうならば、**~に代入する**という意味です。

```.py
#整数2を変数sizeに代入する
size = 2, 
#ブール値Falseを変数enter_editmodeに代入する
enter_editmode = False,
#文字列'WORLD'を変数alignに代入する
align = 'WORLD',
#タプル(0, 0, 0)を変数locationに代入する
location = (0, 0, 0),
#タプル(1, 1, 1)を変数scaleに代入する
scale = (1, 1, 1)
```


#最後に

今回は、コードを抽象化して記号で考えることでコードの全体像を把握しやすくすることを目指しました。
とにかく、記号で考えてみるのが役に立ちそうだなと思っていただけたら嬉しいです。
テスト18


```vb

Sub Kyoyu_Hantei()

Dim FileName As String
Dim wb As Workbook

FileName = "C:\Users\User\Desktop\共有ファイル.xlsx"
Set wb = Workbooks.Open(FileName)
    
'確認メッセージを非表示にする
Application.DisplayAlerts = False

'指定のフォルダに「排他モード」で保存
wb.SaveAs FileName:="C:\Users\User\Desktop\VBA関連\一時保存" & "\" & "(印刷済)" & Dir(wb.FullName), _
                     AccessMode:=xlExclusive
                     
If wb.MultiUserEditing = True Then  '共有モードの場合
    
    '共有モードで開いた場合、排他モードに変更
    wb.ExclusiveAccess

End If
'---------------------
'いろいろ処理
MsgBox "test"
'--------------------

wb.Close

End Sub

```
SES企業と自社開発企業の比較

#概要
転職活動中だがSESと自社開発企業をいろいろ調べて比較したので
メモとしてまとめる（個人の考えに基づく）

##SES企業の特徴
####メリット

1. 会社の上下関係などに縛られない（客先常駐のため）
2. クライアント側には指揮権がないためエンジニア個人の裁量権が大きい
3. 案件により、様々なスキルを得られる。
4. 客先企業とのコネや他社のエンジニアなどとの繋がりが得られる
5. 業界未経験や開発未経験などでも比較的参入しやすい傾向（研修が充実していることが多い）

####デメリット

1. 給料が安い傾向がある
2. 闇案件（家電量販店の店員などよく聞くやつ）がある場合がある
3. 自分の望むスキルを磨き続けられるとは限らない（様々な案件にアサインするため）
4. 実際は常駐先にこき使われる場合もある
5. 案件により使用技術も偏るためスキルも偏ることがある（もちろんその逆もある）
6. 客先常駐のため帰属意識が薄れる
7. 勤務地が場合によってはコロコロ変わる

##自社開発企業の特徴
####メリット

1. 技術力が高い環境である場合が多い
2. 給料もSESより平均的に高い傾向
3. 一貫して同じ技術を使うケースが多いため一つのスキルを磨くことができる
4. 自分の気に入ったサービスを作り出す仲間の一人として働けるためモチベーションが高まりやすい
5. 柔軟な働き方を提供している会社が多い

####デメリット
1. 未経験の参入障壁が高め
2. 自社サービスがすでに保守・運用段階まで行っていると開発フェーズでの実力がつかない可能性も、、、


##まとめ
私の個人的な意見だが
・自社開発、SES両方メリットがあるがSESの場合は会社をよく見定めて入らないと
闇案件や待機時間などでキャリア形成に支障が出る可能性がある（その逆もある）ため
慎重に動くのであれば、SESでも問題なし。
仮にSESでキャリア形成に時間がかかりそうだと感じたなら
実務経歴がつくのでより多くのスキルを得られる環境がある会社へ転職するなどの手もある。

##注釈
この記事は私が個人的に調べて自分用にまとめた記事のため、間違いや追記などございましたら
報告していただけますと幸いです。
PCをスリープするとWSL 2の日時がずれるバグとそのワークアラウンド

この記事は[WSL Advent Calendar 2020](https://qiita.com/advent-calendar/2020/wsl)の3日目です。

# はじめに

この記事の執筆時点で、PCをスリープするとWSL 2の日時がずれるバグが存在します。

[WSL2 date incorrect after waking from sleep](https://github.com/microsoft/WSL/issues/5324)

Issueを読むと修正プログラムがリリースされたようですが、直った人と直っていない人がいて、まだ完全に修正されたわけではなさそうです。

私も過去最大で3日くらい日時がずれたことがあり、気づかずに`git commit`してコミット日時が盛大にずれてしまったり、`apt update`が通らなくなって小一時間ハマったりしました。

# hwclockを実行して日時のずれを修正する

ずれた日時の修正は簡単で`hwclock`を実行するだけで良いです。

```
hwclock --hctosys
```

もちろん`ntpdate`でも良いですが、Ubuntu 20.04 LTSには最初からは`ntpdate`が入っていないので、その場合は`sudo apt install ntp`する必要があります。

# cronで定期的に日時のずれを修正する

ずれに気づくたびにコマンドを実行するのは面倒くさいので、私はrootユーザのcrontabに下記を設定して、毎分コマンドを実行するようにしています。

```
* * * * * /usr/sbin/hwclock --hctosys
```

cronを起動します。

```
sudo service cron start
```

cronではなくsystemdを使いたいかもしれませんが、WSL 2ではsystemdが動きません。
[genie](https://github.com/arkane-systems/genie)を使えばsystemdを動かすことができますが、私の場合は下記のようにいろいろな問題が出たので使うのをやめました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">genie -sすると$PATHからWindows側のディレクトリが消失するやんけ…。</p>&mdash; 長男 (@ngmy) <a href="https://twitter.com/ngmy/status/1309310589139734529?ref_src=twsrc%5Etfw">September 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">localeもぶっ壊れるな。</p>&mdash; 長男 (@ngmy) <a href="https://twitter.com/ngmy/status/1309312656696778752?ref_src=twsrc%5Etfw">September 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">genieを使ってWSL 2でsystemdを動かしてますって人たち、$PATHとかlocaleとかどうしてるんだ？泥臭く自分で.login等を書いてるのか？</p>&mdash; 長男 (@ngmy) <a href="https://twitter.com/ngmy/status/1309315238282457093?ref_src=twsrc%5Etfw">September 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# ログイン時に自動でcronを起動する

なおcronはPCをシャットダウンすると死ぬので、PCをシャットダウンして立ち上げるたびにcronの起動が必要になります。

これも面倒くさいので、私は`.bash_profile`に下記を設定して、ログイン時にcronが死んでいたら起動するようにしています。

```bash:bash_profile
if ! service cron status > /dev/null 2>&1; then
  echo "Firing up cron daemon..." >&2
  sudo service cron start > /dev/null 2>&1
  if service cron status > /dev/null 2>&1; then
    echo "cron now running." >&2
  else
    echo "cron failed to start!" >&2
  fi
else
  echo "cron already running." >&2
fi
```

これでPCをスリープした際のWSL 2の日時のずれが自動で修正されるようになりました。

# おわりに

PCをスリープするとWSL 2の日時がずれるバグとそのワークアラウンドについて書きました。
少しでもみなさんのWSLライフのお役に立てれば幸いです。
応用数学2

#**集合と確率**

集合：モノの集まり
　集合の要素＝元ともいう

ベン図
　和集合A⋁B、共通部分A∧B　※積集合は別のことを指す
　絶対補・相対補

確率
頻度確率(客観確率)・・・やればわかる、客観的
ベイズ確率(主観確率)・・・主観的、信念の度合い(算出が難しい)

確率の定義～全事象が起きる数に対するAが起きる数＝P(A)
つまり0～1の間の値を取る

条件付確率
P(A|B)＝P(A∧B)/P(B)　⇔　P(A∧B)＝P(B)P(A|B)＝P(A)P(B|A)　Aが起きた条件下でBがおきる

独立な事象の時の同時確率
P(A∧B)＝P(A)P(B)　積集合っぽい

P(A⋁B)＝P(A)＋P(B)－P(A∧B)　
（P(A∧B)はベン図的に二重で数えているので引く）

ベイズ則
P(B)P(A|B)＝P(A)P(B|A)


#**統計**
記述統計・・・平均値、偏差、などなど特徴をわかりやすくするための学問
推測統計・・・標本から母集団を推測する学問

確率変数・・・事象と結びつけられた数値～賞金のようなもの(Ex.あたりで400円貰える、の400円の方)
確率分布・・・確率の分布～どのくらい当たるのかの分布(Ex.表が4枚出るのは1/16、の1/16の方)
※コインの表裏のようなときは二項分布

期待値：平均の値・・・（確率変数×確率）の平均値

分散：期待値の散らばり・・・{(期待値平均値)ー(個々の期待値)｝^2
　※二乗は計算のしやすさのため
　（個々の期待値^2）の期待値　－（期待値平均値）^2　とも表される　計算しやすい
　　　　　　　　　二乗の平均　－　平均の二乗
データの形を正確に表すために分散は必要

共分散：・・・2つデータの動きが似ていれば＋or－、また関係ないなら0
　～相関係数

標準偏差＝√分散（単位系を合わせるため）

様々な確率分布
ベルヌーイ分布・・・コイントスイメージ　どちらかが出る
　　　⇒　どちらかが出る確率は等しくなくても使える　μは足したら1
マルチヌーイ(カテゴリカル)分布・・・さいころのイメージ
　　　⇒　書き方はベルヌーイ分布と同じ。場合分けしているだけ
二項分布・・・組み合わせ(Combinataion)を考慮したベルヌーイ分布
　　　⇒　10回投げて5回表がでる、など
ガウス分布・・・釣り鐘型連続分布。正規分布。
　　　⇒　生産品のバラつきなど
　　　　　※全体積分したら1になるように係数がつく

推定
　目的：母集団(本当の集団)を特徴づける平均値などの統計量を推測すること

推定量：パラメータを推定する計算式(関数)のこと　～　導関数みたいなもの
推定値：実際に計算した結果　～　ある値を導関数に入れた時に出てくる値
注意）推定値はθハットとする。本当の値はθ(真値)。

標本平均：母集団から取り出した標本の平均値
　一致性・・・サンプル数大で母集団の値に近づく
　不偏性・・・サンプル数に影響されず、標本の期待値は母集団と一緒
　　　(色々な標本平均値をとって、その平均値をとると母集団平均値と一緒)
標本分散：標本のバラつき
　母集団のバラつきよりも標本分散は小さくなるのがわかっている
　⇒　不偏分散にすることで母集団分散に近づける(自由度を1つ下げる)



![bnr_jdla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870365/bf69d857-d4f7-b9e0-8fd6-6191de148774.png)
ソシャゲのガチャで高レアキャラをコンプするにはいくらかかるのかシミュレートしてみた

# 始めに
いつも通りだらだらYouTubeを見ていたら、とあるソシャゲで『高レアリティのキャラをコンプリートするにはいくらかかるのか？』というなかなかヤバイ動画を発見したので、シミュレートしてざっくり考えてみました。

# 条件
扱うソシャゲのガチャからはレア度が3~5のキャラと装備品が出現します。
ここでの高レアとは、レア度が4と5のキャラのみを指すものとします。
それぞれの排出率とそのレアリティのキャラ数は

- レア5 ： 1% (34体)
- レア4 ： 3% (59体)

という風になっています。なお同レアリティのキャラは等しい確率で出現するとします。

また1回ずつガチャを回すのではなく、11回を1セットとして回すこととします。

# シミュレート
pythonで適当に書きました。もっと効率的に書けそうですが、そこは目をつむってください()

``` Gacha.py
money_ave = 0
count_ave = 0
min_money = 1000000000
max_money = 0

for num in range(10000):
    box_5 = np.zeros(34)
    box_4 = np.zeros(59)
    money = 0
    count = 0
    hoshi5_comp = False
    hoshi4_comp = False

    while True:
        for i in range(11):
            a = random.randrange(0, 100)

            if(a == 0):
                hoshi5 = random.randrange(0, 34)
                box_5[hoshi5] += 1
            elif(a <= 4):
                hoshi4 = random.randrange(0, 59)
                box_4[hoshi4] += 1

        for i in range(34):
            if(hoshi5_comp == True):
                break

            if(box_5[i] == 0):
                break

            if(i == 33):
                hoshi5_comp = True

        for i in range(59):
            if(hoshi4_comp == True):
                break

            if(box_4[i] == 0):
                break

            if(i == 58):
                hoshi4_comp = True

        money += 1800
        count += 11


        if(hoshi5_comp and hoshi4_comp):
            break
    
    money_ave += money
    count_ave += count
    
    if(money < min_money):
        min_money = money
    if(money > max_money):
        max_money = money
    

money_ave /= 10000
count_ave /= 10000
print(money_ave)
print(count_ave)
print(min_money)
print(max_money)

```

#結果
10000回試行して、目的達成までの平均回転数は14046回となりました。
このソシャゲでは11連が約1800円でできるので、約230万円あれば高レアのキャラをコンプリートできそうということが分かりました。

なお全シミュレートのうち、最も安く済んだときで約90万円、最も高くついたときで約750万円でした。

#おわりに
数学的な期待値の計算方法がパッと思いつかなかったので、シミュレートしてみたのですが、結構すごい額になることが分かって笑いました。好きな投稿者さんなので破産しない程度に頑張ってもらいたいです。
Accessの実行時エラー3001への対応したざんす

#バージョン
Windows10 Pro バージョン1909 OSビルド18363.1171
Access for Microsoft 365 MSO（16.0.13328.20262）32ビット


#症状
それまで正常に実行できていたSQLが下記エラーで急に実行できなくなる。
**実行時エラー3001 引数が無効です**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fb1fabc9-6c56-825a-6ecf-68f991eb5021.png)

デバッグモードで止まっているSQLのコードに対して、再開ボタンを押すとなぜか正常に実行できる。
つまり、 **特定のテーブルに対する特定のSQLの1回目の実行だけ** エラーになる。


#何がどうなっとるんじゃい
Accessが内部で保持してる設定情報が、画面上のものと違っているらしい。
要はテーブル定義がおかしくなってしまったと…。
はぁ…(´・ω・`)


#テーブルを一旦削除して再作成
**まずはバックアップを取る**

この件に限らずだけど最悪作業前まで切り戻しできるように。
Accessならファイルをコピぺ。

んでんでんで…だめっこどうぶつになってるテーブルをXMLファイルとして一旦書き出し。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2e7ba5f2-cf49-e220-694c-239eeec6b492.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/520beb0e-b1ce-4bae-5a7b-04ea58979278.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/aa297b82-7f07-8708-b582-d4f45f54ecff.png)

だめっこどうぶつのテーブルは削除。
ここで可能なら [最適化/修復](https://qiita.com/waokitsune/items/82e03876b0c729fea0d4) ができるとよいかも。（おまじない）

生き返れ…生き返れ…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cf5c6deb-c1e5-7d47-44ba-41e366cda628.png)
まずはxsdファイルでテーブル定義を復活させるんば。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d48fc21f-e495-d541-4b86-97c5a429948d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/59c44152-cf1e-3f4b-28b7-bb7e3112f470.png)
テーブルが出来上がったら次はレコード復元。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b9ca1bd4-02ea-133d-eb13-59721e864be0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/90314403-bb7a-a7e2-59ba-a8cbb25ca5cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/864a9da1-1897-f5c3-9f2d-1a56a026d224.png)
終わり。


#参考サイトさん
https://support.microsoft.com/ja-jp/help/2480088


#蛇足
本当は日次バックアップとかから復元して、バイナリログからロールフォワードした方がデータベースの復元としては正しいのかな…？まあ…そのへんはね…うん…(´・ω・`)

『テーブルをxmlで一旦退避して再作成』はなんかAccessの動作が不安定な時の対処法の一つとしても使えるかなと思います。（なんか動作が不安定ってどういうことやねん…）
【初心者でもわかる】スクロールしたら下からふわっと出てくるコンテンツの作り方

# どうも7noteです。シャレたサイト作りに必須のスクロールしたらふわっと出てくるアレを作ります。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/fadein/
Excelを操作するPythonライブラリ簡易比較

PythonでExcelをいじるやり方が複数あって混乱したので表にまとめてみた。

##比較表
表が大きいのでQiitaでは書かずにExcelを別サーバーにポスト。
よく使いそうな操作のみ記載。
http://mirutsurumi.html.xdomain.jp/Excel_pylib.html
（適宜更新予定。）

まとめたのは以下のライブラリ。

|             | 使い道                                                                                              |
|:-----------|:----|
| openpyxl    | ExcelをExcelとして扱い、セルの書式などを気にした操作に使う。書籍で説明が多いのはこちら。                                            |
| pandas      | Excelの書式などには興味がなく、データの分析のみに特化したい場合に使う。engine変数としてopenpyxl, xlsxwriterも使用可能。                                   |
| xlwings（編集中）| できることはopenpyxlに近いが、操作感が異なる。実行するとExcelそのものが起動し、インタラクティブシェルを使えば中身が変化するのを見ながら操作可能。また公式によるとpandasのdfを読み込むこともできる。VBAの操作もできるため、セル範囲指定はrange("A1:C3")のような指定ができるのも分かりやすい。|
| xlrd, xlwt  | openpyxlに近く、その従来版のようなイメージ。pandasにも包含されているためあまりこれ単体で使うことはなさそう。pandasでExcelを操作する際に事前にこれらのインストールが必要。|
| xlsxwriter  | openpyxlに近く、その従来版のようなイメージ。pandasにも包含されているためあまりこれ単体で使うことはなさそう。pandasでExcelを操作する際にxlsxwriterを事前にインストール必要。|

表は簡易参照用のため細かい説明は省略。

なおxlwingsとopenpyxlは下記記事でも比較されている。
https://qiita.com/m5knt/items/ab56f1d0a783f3422ee3

■基本的な手順
【openpyxl, xlrd/xlwt, xlsxwriter】
①ライブラリ名.Workbook() でwbオブジェクト作成
②ws = wb.シート追加関数でwsオブジェクト作成（xlsxwriterはここまで）
③同様にwsからセルオブジェクトまで作成し、あとは好きな関数で操作。
④保存（この段階で新規Excel出現）

【pandas】
①データを設定（pd.read_excelで既存Excel読み込み）※pd.DataFrameで直書きもできる。
②df.locなどでセル値操作やフィルタリング（表未記載だがpivot_tableも使える。）
③df.to_excelで新規Excel化
※runしてみて、ないよと怒られる上記4種ライブラリを逐次インストール。
※Defaultではindex/columnが勝手に追加される上、上書きモードなので別Excelを作るのが安全。

#### pandas補足
read_excel, to_excel, ExcelWriterの関係性が複雑なので補足する。

■read_excel
既存Excelの指定シート（指定しないと一番左のシート）のデータdfを読み込む。
あくまでもdf(DataFrame型)の読み込みであり、Excel workbook型を定義するわけではない。

■to_excel
指定したExcelファイルにdfを書き込む。

■ExcelWriter
to_excelで書き込み対象とするExcelファイルを定義する。（openpyxlでwbを定義するイメージに近い。）
ExcelWriterを定義しなくてもto_excel(file名)で書き込めてしまうが、with文と組み合わせることで複数シートにデータを一括書き込みできるようになる。
またこれとwith文を組み合わせてExcelファイル名を（場合によってはパスごと）変数化しないとto_excelの記述が冗長になる。
つまるところ記述を簡便にするための存在であり、使用マストではない。
TypeScriptでreadonlyのフィールド定義をsetも出来るフィールドに戻す



```typescript
interface ReadonlyFields {
  readonly name: string
  readonly age: number
}
```
のようなreadonlyがフィールドに指定されている定義から全てのreadonlyを除去する方法の紹介です。


```typescript
type Assignable<T> = {
  -readonly [P in keyof T]: T[P]
}

// つまり
// Assignable<ReadonlyFields> == {
//   name: string
//   age: number
// }
// になります
```

このような定義を行えば下のように使えます

```typescript

const f: Assignable<ReadonlyFields> = {
  name: "Tom",
  age: 20
}
f.name = "Bob"
f.age = 30

```

## 余談

CDKでXXXPropsを構築する時にreadonlyを外したくてこの方法を見つけました。
【Github】masterのマージに失敗した場合の対処法

個人メモです。
githubでマージに失敗してサーバーが起動できなくなった場合の対処法。

##発生している問題

ローカルブランチにリモートリモートレポジトリをプルしたところマージに失敗した。

**▼発生原因**

ローカルブランチのワークツリーやステージにコミット前（もしくは変更破棄前）のファイルが残っていた。

また、その中途半端な状態でリモートの自分のブランチにもプッシュしていた。

（そもそも、リモートレポジトリからプルしたmasterでコミット前の変更がある状態だった）


##対処法

(1) ローカルブランチを消す
masterブランチに移動してから、ローカルブランチを削除
`git branch master`
`git branch -D ローカルブランチ名`

(2) リモートの個人ブランチにを真っさらにする
masterと同じ状態のローカルブランチを作成し、ブランチを強制プッシュ(-f)。
`git checkout ローカルブランチ名`
`git push origin リモートブランチ名 -f`


(3) masterからpullする
`git pull origin master:ローカルブランチ名`




<br>
##注意点
ローカルブランチで作業する場合は、**毎回masterと同期して最新状態にしてから開始する**。

VScodeで全てチェックがついている状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/e85be4de-197d-30a1-e6db-e0bef92851cc.png)
**通常はmasterブランチ。masterブランチでコミット完了していない場合はコミット前の変更を一つ前に戻す**。

画像の、10f0a54cがそれにあたる。masterにするとステージに変更があるため、**変更を破棄**している。

このVScodeの状態でステージ前の変更がある場合はプルやマージはNG。


<br>
##ステージの変更が発生する理由
ローカルで全く作業していないファイルで、リモートレポジトリからプルしたときにローカルでステージの変更が発生する理由は、**ローカルと差分が発生するため**。

最新版にしたい場合はステージの変更を破棄する。（昔のデータのため）


<br>
**▼変更を破棄する理由**
ローカルで作業していないのに翌日に再度プルしたらローカルのステージに変更が発生した場合の例


- 1日にリモートレポジトリからプル（ファイルの状態A）
- 2日にリモートレポジトリからプル（ファイルの状態B）
- ローカルでステージに変更内容が生じる

１日時点のローカルのファイルの状態はA。これに対し状態Bをプルしたため、A != B となり、ローカルの**Aが変更点として現れる**。

Aは古い状態になるので、**ステージの変更を破棄することで最新**になる。


<br>
##破棄せずコミットする場合
何でもかんでもステージを破棄すればいいわけではない。

**自分が作業して進めた場合は変更をコミットする**。

自分が作業後に、リモートをプルして生じたステージの変更は、ローカルの方が進んだ状態なのでコミットして、ローカルを最新状態に保つ。



<br>
##コンフリクトの発生
まったく触っていないリモートレポジトリをプルした際にコンフリクトが発生することがある。

これは、誰かがリモートレポジトリの状態を過去に戻した場合に発生する。（マージ後にエラーに気付き、過去のコミットに戻した場合など）

**▼コンフリクト発生の流れ**

- Aさんがリモートレポトリを更新
- Bさんがリモートレポジトリをプル（１回目）
- Aさんがリモートレポジトリの誤りに気付き、コミットを戻す
- Bさんがリモートレポジトリをプル（２回目）

上記のような流れの場合、Bさんが２回目のプルを実行した時点でローカル内でコンフリクトが発生する。


###コンフリクトの対処法
上記のような場合の対処法は、ローカルのmasterブランチを削除し、再度プルし直す作業が必要となる。

```:状態の確認
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   xxx.vue
        both modified:   Modules/yyy.vue
```

コンフリクトの発生が確認できる。
以下操作で、ローカルブランチの状態をリモートブランチの状態と合わせる。

```:コンフリクトの修正
//merge操作を戻す
$ git merge --abort

//暫定ブランチを作成し移動
$ git checkout -b sub

//masterブランチを削除
$ git branch -D master

//masterブランチを新規作成
$ git checkout -b master

//リモートからプル
$ git pull origin master
```
[Roblox studio] NPCと会話する。& スポーン地点を追加しリスポーン時間を制御するやり方

##NPCと会話するやりかた
まずToolBoxからなんでもいいのでNPCを持ってくる。(ゲーム画面のほうにドラッグアンドドロップすれば持ってこれる)
Explorerの所からNPCの左にある  **>**  をクリックしていきheadを見つけたら。そこで右に出てくる + を押し、Dialogを追加する。
PropertiesからDataのinitialPromptにNPCが話してほしい言葉を入力すればできる。

まず?と出て、そこで右クリックで出てくる。

###対話する
dialogを追加後に、また + を押すとDialogChoiceが出てくる。
DataのUserDialogに話したいことを入力。(実際のゲーム画面では左下に出てくる)
ResponseDialogにはuserDialogに書いたことをクリックした後に出てくる言葉を書く。

##スポーン地点を追加する
explorerで右クリック -> insert Object -> spawnLocationをクリック。
出てきたブロックをスポーンしたいところに置けば出来る。

##リスポーンする時間を制御する
デフォルトで5秒。
まずExplorerからPlayer選択　-> DataのRespawnTimeの所を変更。
HSP3で湯婆婆を実装してみる

# はじめに

原作者様: [Javaで湯婆婆を実装してみる - Qiita](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)

各言語版の実装が流行していますが、もう列挙できないほど広まってしまったのでこちらをどうぞ。
[【毎日自動更新】湯婆婆 LGTMランキング！ - Qiita](https://qiita.com/torifukukaiou/items/c8361231cdc56e493245)

もう自分の使ったことのある言語は出尽くしてしまった…かと思ったのですが、**[HSP (Hot Soup Processor)](https://hsp.tv/) は誰もやっていないっぽい！**
ということで、HSP3で書いてみました。
このネタをやりたいがためにHSP3.51をインストールしました。


15年くらい触っていなかったこともあり（当時はHSP2.55とか2.6とか…）、言語仕様が変わっていたり単純に忘れていたりしたので、意外に苦労しました。

# コード

QiitaはHSPのシンタックスハイライトに対応していないらしい。。。

```yubaba.hsp
#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var ; Windows API

	randomize                  ; 乱数シードの初期化
	screen 0, 1000, 400        ; ウィンドウサイズの指定
	font "", 24                ; フォントの指定
	objmode 2                  ; コントロールのフォントも変更する
	mes "契約書だよ。そこに名前を書きな。"
	name = ""
	input name, 500, 30, 30    ; テキストボックス作成
	objsize 100, 30
	button "送信", *clicked    ; ボタン作成
	stop
*clicked
	sdim nameUnicode, 64       ; 文字列バッファを初期化
	cnvstow nameUnicode, name  ; マルチバイト文字列操作のためUnicodeに変換
	mes "フン。" + name + "というのかい。贅沢な名だねぇ。"
	newNameIndex = rnd(lstrlenW(nameUnicode))
	sdim newNameUnicode        ; Unicodeベースで1文字取り出す
	memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2
	newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換
	mes "今からお前の名前は" + newName + "だ。いいかい、" + newName + "だよ。分かったら返事をするんだ、" + newName + "!!"
```

## 実行例

テキストボックスに名前を入れ、「送信」ボタンを押すと、湯婆婆が答えてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204084/5fb1b916-4c3e-5360-767d-e500ac949b36.png)


## コードの注意点（特にマルチバイト関連）

令和にもなればHSPでもUnicode (UTF-16) なんて当たり前に使えるようになっていると思っていましたが、割と面倒でした。
マルチバイト文字を考慮して文字列の切り出しを行うために、目的の文字列をまずUnicodeに変換します。

```
	cnvstow nameUnicode, name  ; 文字数操作のためUnicodeに変換
```

続いて、入力された名前の文字数をカウントして、取ってくる文字のインデックスを選択します。文字数カウントの部分でWindows APIを使っています。

```
	newNameIndex = rnd(lstrlenW(nameUnicode))
```

関連: [lstrlenW function (winbase.h) - Win32 apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-lstrlenw)


``lstrlenW`` を使うために、スクリプトの先頭で以下のように宣言しています。

```
#uselib "kernel32.dll"
#cfunc lstrlenW "lstrlenW" var
```

関連: [HSP3 プログラミング・マニュアル 「4.9. API呼び出し」](http://www.onionsoft.net/hsp/v33/doclib/hspprog.htm#CALL_API)

そして選んだインデックスで1文字を取ります。Unicodeは1文字あたり2バイトなので、文字数と転送元のインデックスを2倍します。

```
	memcpy newNameUnicode, nameUnicode, 2, 0, newNameIndex * 2
```

ここで ``strmid`` を使いたくなるのですが、Unicode文字列では終端以外にNULL文字 (C言語でいうところの ``\0``) が現れる場合があるため、正しく動作しません。

最後に、取ってきた文字を通常の文字列に戻します。

```
	newName = cnvwtos(newNameUnicode) ; 通常の文字列に変換
```

## お約束

名前を入れないで送信すると落ちます。
原作リスペクト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204084/b52fa89f-6c65-ee55-0fc4-039645cfbbca.png)
ひとりぼっち用のgit,githubメモ【備忘録,どこでも同じドキュメント編集がしたい】


ほんとに自分用備忘録

#何を書くか

・家のPC
・ノートPC
・会社のPC

いろんなところでドキュメントやコードを書く。
書いてる良いところで移動が挟まったりしてモヤモヤ。


「githubをリモートリポジトリとして使い、どのPCからでも常に内容を更新できるようにしたい」


枝別れさせて安全に開発？
上書きされないように変更を確認？

**どうせ一人なので気にしない**

(誰かとやるようになったら絶対気にすべき)

滅多にgit使わないからこそコマンド忘れるのでメモ


#内容

windows環境です

### 1-リポジトリを作りローカルにコピーする

github登録&gitインストール

github上で新しいリポジトリ作る(もしくはgitからも作れる)
リポジトリ名を「test」と仮定

この段階でドキュメントとかuploadしてもいい

リポジトリをローカルにコピーするには

```
git clone ここにgithubのtestのURL
```

URLはcodeタブからHTTPSを確認する
すると自分のユーザー直下にtestフォルダが作られている
(同じ階層で同名のフォルダを作っていなければ、testフォルダ内には.gitがあるはず)

### 2-ローカルで編集

ローカルフォルダにドキュメントとか突っ込む
ドキュメントに書き込む

```
cd test #windowsならcdでtestフォルダまで移動

git add .
```

addによって変更を見つけてもらう。
.はフォルダ内のすべてを対象とする

addで探した変更点をリポジトリに挙げる準備(メッセージも追加)

```
git commit -m 'ここにメッセージを書く'
```

問題なければリポジトリに反映


```
git push
```


ここで移動なり寝るなり自由に生活する。

### 3-別環境で再開したい


今の状態を確認

```
git status
```

作業ディレクトリに移って

```
cd test
```

リポジトリの内容を引っ張ってきて最新に同期する

```
git pull
```



# 以上

vim,nanoが開いたらお好きに弄る。閉じる。



cmdでひとつ上の階層にもどるには

```
cd..
```
応用数学1


#**線形代数-行列**

行列
スカラー(数)とベクトル(方向と大きさ)
行列でより情報を密に、簡単に表示する
　(連立方程式を行列で書く)

連立方程式を行基本変形する
　→　連立方程式を解くこととは、行列の計算をすること

数字の逆数をとるのと同様の働きを、行列でさせるには「逆行列」を作る必要あり
　※行列は割り算をすることができない

単位行列と逆行列の関係　AA-1＝A-1A＝I

逆行列の算出の仕方：(ガウスの)掃き出し法
　→　逆行列を求めたい行列を左、単位行列を右におき、変形させていく
　　　最後に左が単位行列になるような形にする

逆行列が存在しないの条件
（連立方程式でいうと解がない、解が1個にならないもの）
2行2列の場合、ad-bc=0であること
　幾何学的に考えるなら、平行四辺形の面積が”ゼロ”

行列式・・・逆行列が存在するかどうか確認する条件
<特徴>
行列式に同じベクトルがあるとゼロになる
1つのベクトルがラムダ倍されるなら行列式がラムダ倍される
他の成分が同じで1つだけ違った場合は行列式の足し合わせになる

3×3行列の行列式も2×2と上記特徴を使えば計算可能
（入れ替えると符号がかわるので注意）
（0があれば計算が少なくなるように変形するとわかりやすい）

#**線形代数-固有値**

固有値
Ax＝λx　x：行列Aに対する固有ベクトル、λ：行列Aに対する固有値 
(Aは正方行列)
固有値がある値の場合、固有ベクトルはたくさんある(同じ比率であればOK)

Ax＝λx
⇔（A-λI）x＝0　※x≠0のため
A-λIを行列と考えると、逆行列をもつとx=0になってしまう。
しかしx≠0としているので、”逆行列をもってはいけない”と考えればよい
　⇒　行列式が0であれば逆行列を持たないので式を解けば固有値λが出る
※固有ベクトルは定数倍すべてが回答。従って書くときは大きさを1にするとよい

行＝列の数＝固有値の数

行列をバラバラに分解する～固有値分解
A＝VΛV-1
　→　A^nを解くとき、VΛ^nV-1
　　　とても簡単に解ける形になる

特異値・特異ベクトル
　→　画像は正方行列ではないことが多い。固有値分解のようにしたい。
転置行列を右、または左からかけてあげることで正方行列を作ることで固有値分解のようにすることができる
二乗するので、最終的に固有値は平方根を取ってあげれば固有値になる

特異値分解の利用
　画像情報を削減していくイメージ(アインシュタインの写真の例)


![bnr_jdla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870365/236d7ca9-b821-d699-9d1b-66d22952ec62.png)
Roblox Studioを始める

ただのメモ
[ここから](https://www.roblox.com/create)インストールできます。

また遊ぶためにはRobloxのインストールが必要になる。

またRobloxStudioで使うプログラミング言語は**「Lua」**という言語

とりあえずこの[動画のシリーズ](https://www.youtube.com/watch?v=5JHK0twzCGo)を見れば基本は分かる

##画面の詳細

###Explorer
画面に配置しているオブジェクトの一覧(Blockやcameraなど)

###Properties
オブジェクトの詳細が載っている。

###ToolBox
ここからアセットを入手したり、ローカルからアセットを持ってきたりできる。

###一番下のRun a Command と OutPut
Run a commandと書かれたところに,Luaというプログラミング言語を書くことが出来る。
Output欄にはRun a commandの結果がのる。
例: print("hello world")
outputにはhello worldと出る。


また何かできるようになったら投稿する
Nuxtでvueファイルに対してTSXを書く設定

# はじめに
NuxtではデフォルトでTSXがサポートされていますが、vueファイルで書くと何故かエラーになったので、その対応方法です。ちなみに`.tsx`では動いていました。

## 環境
+ Node: 12.16.3
+ Nuxt: 2.14.6
+ @nuxt/typescript-build: 1.0.3

# 設定方法
`@nuxt/typescript-build`の設定でtsのappendTsSuffixToをなくすと解消されるようです。

```js
export default {
  buildModules: [
    [
      '@nuxt/typescript-build',
      {
        loaders: {
          ts: { appendTsSuffixTo: [] },
        },
      },
    ],
  ]
};
```

# 終わりに
よく`appendTsSuffixTo: [/\.vue$/]`を見ていたので、loaderにそれを追加するべきなのかと思っていましたが、逆になくすとよかったらしいです・・・。また、moduleに対してオプションで設定するというのも気付きませんでした。
調べてもなかなか原因が分からなかったので誰かのお役に立てれば幸いです。

## 参考URL
+ [Files written with lang='tsx' doesn't work](https://github.com/nuxt/typescript/issues/370)
JIRAでconfluenceページをメンションしたチケットを検索する方法


Confluenceにメンションされているチケットの一覧を作りたかったのですが、
調べても調べてもなかなか良い記事が出なくて、
ようやく見つけた英語の解決策をここにまとめておきます。
日本語で解説してるページはここ以外にないはず・・・！

###1.ConfluenceのグローバルIDを入手する


①confluenceにメンションされているチケット番号をメモをしておく
②以下URLの「XXX」の箇所を編集する
https://XXX.atlassian.net/rest/api/latest/issue/XXX（ここにチケットのアルファベットとチケット番号を書く）/remotelink
③編集したURLをアクセス
④表示されたJSONからグローバルIDをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88533/ed555727-2e5a-6de4-2fc5-2a3601f8975a.png)

###2.JIRAのJQL検索する

さきほどコピーしたグローバルIDを以下にあてはめる

```
issue in issuesWithRemoteLinksByGlobalId('appId=XXX&pageId=XXX')
```


これでConfluenceでメンションされているJIRAチケットの一覧を入手することができます！

###参考資料
https://community.atlassian.com/t5/Confluence-questions/Filter-by-Issue-Links-quot-mentioned-in-quot/qaq-p/398831
https://community.atlassian.com/t5/Jira-questions/How-to-list-the-globalId-to-use-in/qaq-p/177062
キカガクの機械学習セミナーを受けてみた【事前学習編】

# 概要

会社の取り組みにより、機械学習のセミナーを受講することになりました。せっかくなので学びの記録を残し、これから研修を受けようと思っている人たちにもどのような内容だったかを共有する。

今回受けるセミナーは、キカガクさんの「機械学習実践コース」。
料金は￥200,000。（会社経費もち。こういうときは助かる）

(参考)
https://www.kikagaku.co.jp/seminars/machinelearning/


事前学習を行いそこから3日間の本セミナーを受ける流れだ。
この記事では、事前学習の内容について記載する。

# 事前学習で学べること
事前学習はすべて動画を見る形式で、ものによっては自分の手元の環境で実際にpythonのコードを書いて見るようなものになっている。


- 機械学習ってそもそも何？(イントロ)
- 微分の基本
- 単回帰分析(数学的な理論の説明)
- Pythonの基本
- 単回帰分析(実装)
- 線形代数
- 重回帰分析(数学的な理論の説明)
- 重回帰分析(実装)
- 統計(統計学的な理論の説明)
- 外れ値を考慮した実装(統計を活用した実装)

動画はどれも5分から15分程度で細かく区切られている。
また特徴的なのはPPT等のスライドでの説明は行わず、紙に手書きで数式や図を書いて説明するということ。（ホワイトボードに記載しているようものなので、わかりにくいというようなことはありませんでした）

# 個人的に重要だなと思ったこと
私の場合は、別のセミナーで機械学習の基本をすでに学んでいたので部分的に思い出したり、「あー、これ知らないなー」とか思いながら見ていた。
中でも重要だなと思ったことを記載する。

## なぜ微分を求めることが必要なのか
Q.微分することで何が求まるのか
A.接線の傾き

Q.接線の傾きを何に使うのか
A.傾きが0となる点を求めることで「最小」のYとなるXを求めることができる

これは機械学習においては以下のようなことになる。

機械学習の例として不動産の家賃を予測するというモデルを考える。
このとき最終的には、実際の家賃と予測値との差を限りなく0に近づけたいはず。（つまり誤差を小さくしたい）
このとき、『「実際の値」-「予測値」』という関係を数式に落とし込み、この差を0に近づけるために微分を使う。

## 単回帰分析と重回帰分析の違いについて
◆単回帰分析
例：「部屋の広さ」というインプットから「家賃」というアウトプットを予測する。
このように1つの変数からアウトプットを予測する分析手法。

◆重回帰分析
例：「部屋の広さ」「犯罪発生率」「駅からの距離」というインプットから「家賃」というアウトプットを予測する。
このように複数の変数からアウトプットを予測する分析手法。
単回帰分析は変数が１つなので数学的にはあまり難しくないが、重回帰分析となると変数の数が一気に多くなる。その計算に耐えるために、ベクトルや行列といった線形台数の基本知識が必要となる。

## 機械学習のSTEP
以下の3STEPに分けて考えることができる。

1. モデルを決める。
どのような数式で表すことができるかを考える。一次関数なのか二次関数なのか指数関数なのか。
これは「人間がこのモデルで行けるんじゃね？」という感じで決める。（厳密にはいろんな調査・分析があるはずだが、要は自然に決まるものではないという理解）

1. 評価関数を決める
1で決めたモデルが適切なのかを決める。この適切というのをどう測るかというと、『「実際の値」-「予測値」』を0に近づけるという話に繋がる。実際にはサンプルの数だけ、二乗誤差を足し合わせて関数の形にする（この辺は数学的なテクニック）

1. 評価関数を最小化する
評価関数を微分した結果0に最も近いパラメータ（インプット）は何かを求める。
数学的には式変形したりいろいろあるが、実際はプログラムに任せる。


この3STEPは単回帰分析だろうと重回帰分析だろうと変わらない。

## 統計学はどこでどう使うのか
機械学習のSTEPとしては上記の通りだが、実際の予測精度を上げたり、各変数の重要性(重み)を把握するために統計のスキルが必要となる。
特に必要なのは平均、分散、標準偏差の3つ。聞きなれない分散と標準偏差はなんやねんというと、データのばらつきを表すものである。
これらを用いると、例えば3σ法と呼ばれる外れ値を除去の方法を使ったり、スタンダードスケーリングといってデータを標準化することで、各パラメータの重みを同じメジャーで測り、どのパラメータが機械学習において重要かを確認できたりする。


## 実装上でのTips
numpy、sklearn、pandas、matplotlib、seabornなどの有名ライブラリの基的な使い方も動画の中で教えてくれる。
ググればいくらでも出てくると思うのでTips的なものを備忘として残す。



■相関関係の確認

```python:
df = pd.read_csv('housing.csv')
df.corr()
```

これで相関係数をみることができる。


■相関関係の確認

相関係数を視覚的にわかりやすく見たい場合は、以下のようにすることも可能。

```python:
import seaborn as sns
sns.distplot(df['x6'], bins = 30)
sns.pairplot(df)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/b65b42cf-0f39-99b4-cc3e-3807e82d1782.png)

■指数表現とか小数桁が煩わしいとき


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/a8f1b837-a071-679d-28b3-88597084f88f.png)

こういうは直感的に分かりづらい。。。
そこで以下のように工夫する。

```python:
np.set_printoptions(precision=3,suppress=True)
```

結果、以下のようなスッキリした表現に￥１

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/2a1458ef-ae43-e2ea-4456-f2199e95b5b0.png)


## まとめ
事前学習だけでも結構盛りだくさんの内容だと個人的には感じた。
3日間の本講座を受けた後には自分がどうなっているのかが楽しみ。ということで次回をお楽しみに。
チャート式ruby-appendix-VI(thor, rubocop)

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# thor

いくつかの振る舞いを一つのコマンドに持たそうとすると，オプションなどを適切に扱う必要が出てきます．そのためにいくつかのCLI builder gemsがあります．人気は，<http://52.198.30.45/categories/CLI+Builder>で調べることができます．ここではthorを紹介します．これはRakefileに似たDSLで実現できます．

まずは

    gem install thor

してください．

[前に作ったhello\_rudy](https://qiita.com/daddygongon/items/14218c96df5cbcf35c62)にcliのinterfaceを組み込んでみましょう．

```ruby
 1  #+begin_src ruby
 2  require 'thor'
 3  require "hello_rudy/version"
 4  
 5  class HelloRudyCLI < Thor
 6    desc "hello NAME", "say hello to NAME"
 7    def hello(name)
 8      puts "Hello " + name
 9    end
10  end
11  
12  HelloRudyCLI.start(ARGV)
13  #+end_src
```

と修正するとほぼ動きます．CLIという文字列がclass名の最後にないとダメです．

ちゃんと動かすには，さらに下のあたりを修正します．

    > in hello_rudy.gemspec
      spec.add_runtime_dependency('thor')
    
    > bundle update
    > bundle install
    
    > cat lib/hello_rudy/version.rb 
    class HelloRudy　#
      VERSION = "0.1.0"
    end

で出来上がり．

bundleでlocalに動かしてみると

    > bundle exec exe/hello_rudy
    Commands:
      hello_rudy hello NAME      # say hello to NAME
      hello_rudy help [COMMAND]  # Describe available commands or one specific command
    
    > bundle exec exe/hello_rudy hello Rudy
    Hello Rudy

とCLIらしく動いてくれます．

さらにrake installすればいろんなとこから使えます．Thorはruby on railsなんかでも使われています．gitもだったかな．．．<https://github.com/erikhuda/thor/wiki>に詳しい解説があります．my\_help, qiita\_orgはthorを使っています．


# rubocop

前の週のchart式でちょっと紹介したrubocopっというのがあります．これはcode formatterとかlinterと呼ばれる類のツールです．規約通りにコードが書かれているかをチェックしてくれます．

タブとか空白のformatといった簡単なチェック以外に，method lengthとabc sizeというのがあります．method lengthはデフォルトは10行以上だと警告です．abc sizeというのは，

-   Assignment : 変数への代入
-   Branch : メソッド呼び出し
-   Condition : 条件文

なんかを勘定して基準値を超えると警告します．これらの要素が多いと，codeが複雑になるので，避けなさいという警告です．長いcodeを書くようになったら，これらのツールを定期的に使ってcodeを整理するようにしましょう．methodは短いほどわかりやすいんです．


# github issue

rubocopにauto correctがあります．

    gem install rubocop
    rubocop --auto-correct fibonacci.rb

とかで直してくれます．

もうだいぶ前になるんですが，これで悲惨な目に遭いました．その様子は，

-   <https://github.com/rubocop-hq/rubocop/issues/4644>

にあります．

これはOSS(Open Source Software)開発ではありがちなことです．でもね，このフットワークの軽さがいいところなんです．すぐにメンターが出てきて，開発者が対応してくれる．逆に皆さんもすぐにOSSにcontribute(貢献)することができます．

OSSの定義は，ライセンスがOSSならOK.[open source initiative 定義](https://opensource.org/licenses/alphabetical)で調べてみてください．my\_help やqiita\_orgもOSSです．日本語でいいんで，issueやpull requestを投げましょう．



------
 - **source** ~/git_hub/ruby_docs/chart_style_ruby/c06_thor.org
最新のリモートブランチを取得する（自分用のメモ）

# この記事の対象者

Gitをターミナル操作が初心者の方


## リモートブランチを表示する

```terminal
$ git branch -a
```

## リモートブランチ情報が古いから最新にしたい

開発が進むに連れてリモートブランチが新たに作成されたり削除されたりしますよね。
これを実行すると最新のリモートブランチが反映されるようになります。

```
$ git remote prune origin
```
【JavaScript】カウントダウンタイマーを作る

#プログラミング勉強日記
2020年11月10日
書籍でカウントダウンタイマーの作成しました。
忘れそうなので、記録しておきます。

#概要
現在時刻から明日までの残り時間を表示するタイマーを作成します。

#完成品
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">メモ<br><br>現在時刻から11月11日までの残り時間を表示するタイマーを作成しました。 <a href="https://t.co/B9qtdAprMv">pic.twitter.com/B9qtdAprMv</a></p>&mdash; ミキ🐹@プログラミング (@mikiprogram) <a href="https://twitter.com/mikiprogram/status/1326050995374186496?ref_src=twsrc%5Etfw">November 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#コード
```index.html
<p>11月11日まであと<span id="timer"></span>です。</p>
```
```script.js
'use strict';

function countdown(due) {
    const now = new Date();
    const rest = due.getTime() - now.getTime();
    const sec = Math.floor(rest / 1000) % 60;
    const min = Math.floor(rest / 1000 / 60) % 60;
    const hours = Math.floor(rest / 1000 / 60 / 60) % 24;
    const days = Math.floor(rest / 1000 / 60 / 60 / 24);
    const count = [days, hours, min, sec];
    return count;
}

let goal = new Date();
goal.setHours(23);
goal.setMinutes(59);
goal.setSeconds(59);

function recalc() {
    const counter = countdown(goal);
    const time = `${counter[1]}時間${counter[2]}分${counter[3]}秒`;
    document.getElementById('timer').textContent = time;
    refresh();
}
function refresh() {
    setTimeout(recalc,1000);
}

recalc();
```

#コードの中でつまづいたところ解説（自分用）

###const rest = due.getTime() - now.getTime();

```script.js
    const rest = due.getTime() - now.getTime();
```

`getTime()`....1970年1月1日0時0分から、対象のオブジェクトの基準日になっている日時までに経過した時間をミリ秒で取得します。

仮に、今が2020年9月30日15時00分だとすると、getTimeメソッドで`16014456000000ミリ秒`が出力します。
これを同日の23時59分59秒のミリ秒から引いた数を、定数restに代入しています。

1601477999000 - 16014456000000 = `32399000`←定数restに代入

####const sec = Math.floor(rest / 1000) % 60;

```script.js
    const sec = Math.floor(rest / 1000) % 60;
```
* `Math.floor`....小数を切り捨て

* `(rest / 1000)`....restは32399000ミリ秒のため1000で割って全体の秒を求めます。(ミリ秒→秒)

* 32399000 / 1000 = `32399秒`←23時59分59秒まで残り32399秒です。

* `% 60`....残り秒数から60を割ると分になりますが、1分に満たないのが秒数なので60で割った余りを求めます。(0~59秒の間)

* 32399 % 60 =539 `余り59`となります。

* 当たり前ですが、割る数より余りが大きくなることはないので、0~59の間を取得したい時は、60で割った余りを求めます。

* 分も1時間＝60分なので60で割った余りを求めます。
* 時間は1日 = 24時間なので24で割った余りを求めます。(0~23の間)


#参考

* [Math](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math)
* [【JavaScript入門】setTimeoutの使い方とサンプル事例まとめ！](https://www.sejuku.net/blog/24540)
Orange Pi 4用のAndroidイメージをDockerでビルドする

![20191205_orangepi4_eyecatch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93722/b3d6c1dc-4f4f-276f-c4d5-497f9e4f3c92.jpeg)

Orange Pi 4はRockchip RK3399を搭載したシングルボードコンピュータです。
公式ページからAndroidイメージをダウンロードする事もできますが、カスタマイズをする場合は自分でイメージをビルドする必要があります。

### 必要な環境

- 100GB 以上のストレージ空き容量
- Docker環境

*(マニュアルでは、Ubuntu 14.04にJDKや依存関係をインストールするよう指示されていますが、現在Ubuntu 14.04をネイティブで使用している方は少ないと思うので、ビルド環境をDockerにまとめました。)*
私はDockerホストはUbuntu 20.04を使っています。


**参考 : 私の開発環境**
Ryzen 3700X / 32GB RAM
makeの`-jN`オプションによるかもしれませんが、ビルド中は10GB程度のメモリを消費する模様です。

## 手順

1. http://www.orangepi.org/downloadresources/ から
**Orange Pi 4B / Android Source Code**をダウンロードしましょう。中国以外の国からはGoogle Driveでダウンロードするのが良いでしょう。サイズは16GBです。

2. ソースコードのZipファイルを展開
落としてきた `Android code source.zip`を適当な場所に展開します。
*(ここから先は展開したファイル中にある中国語PDFの"七、 Android 编译环境搭建"の内容と、環境をDockerに置き換えたものです。)*

3. tar.gzaXを結合/展開
`rk3399-android-8.1.tar.gz*`がある場所で

    ```
    $ mkdir OrangePi_4
    $ cat rk3399-android-8.1.tar.gz* > rk3399-android-8.1.tar.gz
    $ tar xvf rk3399-android-8.1.tar.gz -C OrangePi_4
    ```

4. ビルド!

    ```
    $ cd OrangePi_4/rk3399-android-8.1/
    $ docker run --rm -v $(pwd):/workdir aquahika/android-buildenv-orangepi4 ./make.sh -F -M -u
    ```
私の環境ではビルドが終わるまで約１時間でした

5. 成果物
`OrangePi_4/rk3399-android-8.1/rockdev/Image-rk3399_mid`にあります

    ```
    $ cd rockdev/Image-rk3399_mid
    $ ls
    boot.img           misc.img       pcba_small_misc.img  resource.img  uboot.img
    kernel.img         oem.img        pcba_whole_misc.img  system.img    update.img
    MiniLoaderAll.bin  parameter.txt  recovery.img         trust.img     vendor.img
    ```
手元にOrangePi4がまだ無いので実際に書き込んではいませんが、ビルド自体はうまく出来ているようです。

### マルチコア用並列ビルドの設定

`OrangePi_4/rk3399-android-8.1/make.sh`の11行目に`MAKE="make -j8"`と書いてあり、デフォルトでは8スレッドで並列ビルドをするようです。
私のRyzen 7 3700Xは8コア16スレッドなので、`MAKE="make -j16"`に書き換えました。

※ `-jN`オプションは[コア数+1を指定したほうがよい説](http://lpha-z.hatenablog.com/entry/2018/12/30/231500)もあります。が、すべてのコアがフルに使われている様子をシステムモニターで眺めていると気持ち良いので(笑)、最大スレッド数にしています。


### ビルド環境のDockerイメージ / Dockerfile
Issue/PR歓迎しております。

- https://github.com/aquahika/android-buildenv-orangepi4
- https://hub.docker.com/r/aquahika/android-buildenv-orangepi4
【SwiftUI】Appプロトコルのリファレンスを読む

#この記事は何か？
Apple Developerサイトの[Appプロトコル](https://developer.apple.com/documentation/swiftui/app)を独自に翻訳・解釈したものです。

#[アプリケーションの構造と振る舞い](https://developer.apple.com/documentation/swiftui/app-structure-and-behavior)
`App`プロトコルに準拠した構造体を作成してアプリを宣言し、そこに1つ以上のシーンを追加します。`WindowGroup`のようなビルトインシーンを使用することも、`Scene`プロトコルに準拠したシーンを独自に作成することもできます。シーンは、アプリのユーザーインターフェースを定義するビュー階層を含み、システムが管理するライフサイクルを持っています。

`CommandMenu`インスタンスを適用して、シーンにメニューコマンドを追加します。`CommandGroup`を使用して、システムが提供するメニューを更新することもできます。コマンドにキーボードショートカットを提供すると、iOS、iPadOS、tvOSはそれらをキーコマンドとして利用できるようにします。

ウィジェットをアプリに追加するには、`WidgetKit`と連携して`SwiftUI`を使用することができます。ウィジェットは、アプリから関連するコンテンツへの迅速なアクセスを提供します。ウィジェットプロトコルに準拠した構造を定義し、ウィジェットのビュー階層を宣言します。

アクションを呼び出して、システムの他の部分とインタラクトします。たとえば、`OpenURLAction`インスタンスを使用してURLを開くことができます。

#Appプロトコル
アプリケーションの構造と振る舞いをモデル化します。

````Swift:宣言
protocol App
````

###概要
アプリを作成するには、`App`プロトコルに準拠した構造体を宣言します。
そして、アプリの内容を定義するために必要な`body`という名前の計算プロパティを実装します。

次のコードは、`App`プロトコルに準拠する独自の構造体に`@main`属性を付けて、「アプリのエントリーポイント」を提供することを示します。

````Swift:アプリケーションのエントリーポイントになるMyApp構造体
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            Text("Hello, world!")
        }
    }
}
````

`App`プロトコルは、システムがアプリを起動するために呼び出す`main()`メソッドのデフォルトの実装を提供します。アプリのすべてのファイルの中に、正確なエントリーポイントを1つにすることができます。
「`Scene`プロトコルに準拠するインスタンス」からアプリのボディを構成します。各シーンは「ビュー階層のルートビュー」があり、と「システムによって管理されるライフサイクル」を持っています。
SwiftUIは、ドキュメントや設定画面を表示するような一般的なシナリオを扱うために、いくつかの具体的なシーンタイプを提供しています。カスタムシーンを作成することもできます。

````Swift:一般的な設定画面のシーン
@main
struct Mail: App {
    var body: some Scene {
        WindowGroup {
            MailViewer()
        }
        Settings {
            SettingsView()
        }
    }
}
````

アプリ内で「ステート」を宣言すると、すべてのシーンで共有することができます。
たとえば、`StateObject`属性を使用してデータモデルを初期化して、`ObservedObject`として入力するビューのモデル、あるいは`EnvironmentObject`としての環境をアプリ内のシーンに提供できます。

````Swift:シーンにデータモデルを渡す
@main
struct Mail: App {
    @StateObject private var model = MailModel()

    var body: some Scene {
        WindowGroup {
            MailViewer()
                .environmentObject(model) // 環境オブジェクトを介して、モデルを渡す
        }
        Settings {
            SettingsView(model: model) // 監視オブジェクトとして、モデルを渡す
        }
    }
}
````
【入門者向け】Canvas入門講座#3 三角形を描こう【JavaScript】

#問題3
点(100,100)と点(300,200)を点(50,150)結ぶ三角形を線分で描画しなさい。
なお、以下のHTMLを使うこと。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>問題3</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$(() => {
    // ここにプログラムを書く
});
</script>
</head>
<body>
<canvas id="my-canvas" width="500" height="300"></canvas>
</body>
</html>
```

#答え

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>問題3</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$(() => {
	// コンテキストを取得
    const ctx = $('#my-canvas')[0].getContext('2d');

    ctx.beginPath();		// 現在のパスをリセットする
	ctx.moveTo(100, 100);	// パスの開始座標を指定する
	ctx.lineTo(300, 200);	// 座標を指定してラインを引く
	ctx.lineTo(50, 150);	// 座標を指定してラインを引く
	ctx.closePath();		// パスを閉じる
	ctx.stroke();			// 現在のパスの輪郭を描画する
});
</script>
</head>
<body>
<canvas id="my-canvas" width="500" height="300"></canvas>
</body>
</html>
```

三角形が表示されました！
![ダウンロード (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/03bb173e-574c-32ed-8e95-2aebc5fe4879.png)

#解説
コンテキストを取得します。これは問題1と同じです。

```js
const ctx = $('#my-canvas')[0].getContext('2d');
```

問題2と異なり、<b>strokeの前にclosePath</b>を呼んで、パスを閉じています。
パスを閉じないと線分が2本表示されるだけになり、三角形にはなりません。注意しましょう。

```js
ctx.beginPath();        // 現在のパスをリセットする
ctx.moveTo(100, 100);   // パスの開始座標を指定する
ctx.lineTo(300, 200);   // 座標を指定してラインを引く
ctx.lineTo(50, 150);    // 座標を指定してラインを引く
ctx.closePath();        // パスを閉じる
ctx.stroke();           // 現在のパスの輪郭を描画する
```
README.org

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# qiita\_links

-   [R5](https://qiita.com/satokikono/items/960eb39cdf0c2fbd3b93)
-   [R6](https://qiita.com/satokikono/items/4d56549b7fb85a936375)
-   [R7](https://qiita.com/satokikono/items/fc032c2ea7db454bac7d)
-   [R8](https://qiita.com/satokikono/items/d5322d99925797ab277d)
-   [R9](https://qiita.com/satokikono/items/31cb1efdf1900132edf4)
-   [R10](https://qiita.com/satokikono/items/8928d3006f064361cd7a)
-   [R11](https://qiita.com/satokikono/items/20cfac30798d56c9d6cc)



------
 - **source** ~/grad_members_20f/members/skona/README.org
【入門者向け】Canvas入門講座#2 線分を描こう【JavaScript】

#問題2
点(100,100)と点(300,200)を結ぶ線分を描画しなさい。
なお、以下のHTMLを使うこと。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>問題2</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$(() => {
    // ここにプログラムを書く
});
</script>
</head>
<body>
<canvas id="my-canvas" width="500" height="300"></canvas>
</body>
</html>
```

#答え

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>問題2</title>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$(() => {
	// コンテキストを取得
    const ctx = $('#my-canvas')[0].getContext('2d');

    ctx.beginPath();		// 現在のパスをリセットする
	ctx.moveTo(100, 100);	// パスの開始座標を指定する
	ctx.lineTo(300, 200);	// 座標を指定してラインを引く
	ctx.stroke();			// 現在のパスを輪郭を描画する
});
</script>
</head>
<body>
<canvas id="my-canvas" width="500" height="300"></canvas>
</body>
</html>
```

こんな感じで描画できます。
![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/4c48e4df-8eaa-f99d-7ba5-e42cc2150825.png)

#解説
コンテキストを取得します。これは問題1と同じです。

```js
const ctx = $('#my-canvas')[0].getContext('2d');
```

線分の描画の仕方ですが、パスを作成した後、strokeメソッドで描画します。

<b>パスを作成して、描画</b>という流れは線を書いたり塗りつぶしたりする時の共通処理ですので、頭に入れておいてください。

```js
ctx.beginPath();		// 現在のパスをリセットする
ctx.moveTo(100, 100);	// パスの開始座標を指定する
ctx.lineTo(300, 200);	// 座標を指定してラインを引く
ctx.stroke();			// 現在のパスを輪郭を描画する
```