OmniAICreator/Qiita-1.07M huggingface dataset:
【資格合格記】AWS DBSに合格したので振り返る

2023/05/27に、AWS認定の一つであるデータベース専門知識（DBS-C01）に合格しました。
専門知識系はSCSに次いで2つ目の受験です。SCSと比較しながら振り返っていきます。

![DBSスコア2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/b635225b-a166-dc28-a347-323c72e6f266.png)


## 受験した感想

試験時間は180分と、SCSと比べて10分長いです。
とはいえ1周した時点で100分残っていたので焦る必要はなさそうです。

出題されるサービスはDB関連なので、試験範囲はSCSと比べて狭いです。
結構深いところまで聞かれる問題もあり、問題文も複雑なものも少しありました。

「移行する方法」といっても様々なケースがあり、
問題をよく読まないとベストな方法がわからなかったりします。

個人的には難易度は DBS > SCS かなと思います。
各サービスについてしっかり理解を深めておく必要があります。


## 使用した教材

・要点整理から攻略するAWS認定データベース – 専門知識
DBS試験用の本です。試験範囲はSCSと比べて狭いのにページ数は多いです。
試験範囲のサービスの概要、使い方など分かりやすくまとめられていました。
巻末の問題集も2周（2周目は間違えたところのみ）しました。

・Tech Stock
いつもの問題集サイトです。今回もお世話になりました。
2周しましたが、本試験と比べて難易度は簡単です。
解説をしっかり読んで、他の選択肢が間違いの理由も理解出来るように使うのが良いです。
出題されるサービスに偏りがある（Aurora,RDS,DynamoDB関連多め）ので、不足と感じたら前述した本を活用しましょう。


・Skill Builder
無料の公式問題集です。20問しかないですが一応利用しました。
SCSと同様Tech Stockの後にやると見たことある問題が多かったです。
Tech Stockを1周したのであれば不要かもしれません。判断は自由に。
Disk2VHDの上限127GBなのかテストする

Disk2VHDの上限が127GBという情報がちらほらあったので、2TBの仮想ディスクでテストしてみます。

Disk2VHDの情報についてはこちら。（マイクロソフト公式ブログ）
https://jpwinsup.github.io/mslog/other/tips-tricks/p2v.html

:::note info
**結論**
Disk2VHDの127GBの制限はとくにありませんでした。
:::
# Cドライブを拡張
ProxmoxでC:のサイズを2TB拡張。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/0fc0683e-836c-f28d-a681-addc4aca7fd7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7ac040bb-45ae-ddd8-9ade-4d0c660e0eaf.png)
しかしこのままだと回復パーティションが邪魔で拡張できません。Diskpartで削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/e4da8eba-0bb4-a658-0b29-b51a91143446.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/f4e9f25f-c849-ed09-0938-82f33cb4d724.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/a4078c72-3123-0350-58a2-a4cd1627f836.png)


# Disk2VHDでエクスポート
この2TBのCドライブをDisk2VHDで仮想ディスクとして共有フォルダにエクスポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/550aafb2-4a96-2c8f-03b5-55cc3aa8a930.png)
とくにエラーは出ませんでした。

# Hyper-Vにインポート
別マシンのHyper-Vでインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/6c5f2dea-6130-2433-f256-c430cadb7f7e.png)
普通に起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/e6062ac0-e2a2-f8dd-36d0-8a64ef0748c7.png)

# まとめ & メモ
- Disk2VHDの127GBの制限はとくにありませんでした。たぶんVirtualPCという古いプラットフォームのことかと。
- ただし**一度作成したVHDXファイルを縮小するのは、市販のパーティション変更ソフトが必要**になりますので注意です。
- 動的VHDXの最適化（デフラグみたいなもの）についてはPowershellでできます。

# 参考にさせていただいたサイト

Disk2vhd v2.02
https://learn.microsoft.com/ja-jp/sysinternals/downloads/disk2vhd

Disk2vhd ツールを利用した P2V 化
https://jpwinsup.github.io/mslog/other/tips-tricks/p2v.html
**→WinPEから起動することで、ログオンしていないSysprep直後状態などでもVHDXキャプチャできるということらしいです。さすが公式。**


Windows10でCドライブボリュームを拡張できない対処法
https://recoverit.wondershare.jp/windows-tips/how-to-expand-the-volume-in-windows-10.html
VirtualBox&VMware workstationからVMware ESXiへマシンを移動する

## virtual box -> ESXi
### 1. Virtual Boxでエクスポート
version 1.0で
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/d5986587-fe86-2b15-5d69-87c3a1772275.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/79bfca03-4f12-ae1f-d28d-cfe58d4dfcc2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/2f01674e-0b29-af0c-bddf-80b8a1997cc9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/db4517d1-4e45-12b5-7f6d-de1f6d0c5ae5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/ac00300d-3f16-d067-3499-38d237ffe1ec.png)


### 2. ovftoolで変換
ovftoolは[ここ](https://developer.vmware.com/web/tool/4.4.0/ovf)からダウンロードできる

"C:\Program Files\VMware\VMware OVF Tool\ovftool.exe"のフォルダに移動し、使用
なんかいろいろエラー出てるけどとりあえずできた

```
C:\Program Files\VMware\VMware OVF Tool>ovftool --lax "C:\path\to\file\Metasploitable 2.ova" "C:\path\to\file\Metasploitable 2.vmx"
Opening OVA source: C:\path\to\file\Metasploitable 2.ova
Opening VMX target: C:\path\to\file\Metasploitable 2.vmx
Warning:
 - Line 25: Unsupported hardware family 'virtualbox-2.2'.
 - Line 66: OVF hardware element 'ResourceType' with instance ID '5': No support for the virtual hardware device type '20'.
 - Line 83: OVF hardware element 'ResourceType' with instance ID '7': No support for the virtual hardware device type '35'.
Writing VMX file: C:\path\to\file\Metasploitable 2.vmx
Transfer Completed
The manifest validates
Warning:
 - No manifest entry found for: 'Metasploitable 2-disk001.vmdk'.
Completed successfully

```

### 3. ESXiに移動させて起動
.vmk, .vmdkファイルが作成される





## vmware workspace -> ESXi
### vmxファイル、vmdkファイルなどをESXiのデータストアにアップロード
### 1. vmdkファイル名前の変更
`mv "変更前" "変更後"`

### 2. vmkfstoolで変換
`vmkfstools -i "変換前.ova" -d thin "変換後.vmdk"`

### 3. ESXiで仮想マシンの登録をする
仮想マシン > 仮想マシンの作成/登録 > 既存の仮想マシンの登録 > .vmxファイルを選択


## こんなエラーが発生したときは
あくまでも自己流の解決策ですので参考程度にお願いします。

### vmkfstoolsで.vmdkファイルを変換できないとき（read beyond ~~）
再度ESXiへ変換前の.vmdkファイルをアップロードし、vmkfstoolsで変換する

### ovftoolでESXiから仮想マシンをエクスポートするとき
#### 下記のようなエラーが発生
```
C:\Program Files\VMware\ovftool_4.4.3>ovftool --noSSLVerify --noImageFiles vi://root:P@ssw0rd@172.16.1.10/Slingshot-H01-SEC504 "D:\VM"
Opening VI source: vi://root@172.16.1.10:443/Slingshot-H01-SEC504
Error:
 - Device 'Network adapter 1' cannot be exported.
Completed with errors


```
#### 解決策
ESXi上で仮想マシンに割り当てられているネットワークアダプタを削除
いったん登録を削除してから、再度登録しなおす


## 参考
- [Vitualboxの仮想マシンイメージをVMwareESXiのマシンイメージに変換](https://qiita.com/yes_dog/items/461bc0c6dc3e8308e526)
無償版ESXi 仮想マシンバックアップ・リストア手順（覚書）

## 環境
- Windows 10
    - VMware OVFtool 4.4.3

- VMware ESXi version


## 事前準備
- 仮想マシンをパワーオフする
- CD/DVDからisoファイルをアンマウントする（「ホストデバイス」を選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/4ef7c8a2-6a1f-8940-f949-9576c199a2d6.png)

## バックアップ
- バックアップコマンド入力

`C:\Program Files\VMware\ovftool_4.4.3>ovftool --noSSLVerify --noImageFiles vi://root:P@ssw0rd@172.16.1.10/Parrot "D:\VM"`

`ovftool --noSSLVerify --noImageFiles vi://[username]:[password]@[ESXi hostname or IPaddress]/[VMname]`

仮想マシン名 : Parrot
コピー元ESXiのユーザ名 : root
コピー元ESXiのIPアドレス : 172.16.1.10
OVF保存先のフルパス : D:\\VM

- 成功時の出力
```
C:\Program Files\VMware\ovftool_4.4.3>ovftool --noSSLVerify --noImageFiles vi://root:P@ssw0rd@172.16.1.10/Parrot "D:\VM"
Opening VI source: vi://root@172.16.1.10:443/Parrot
Opening OVF target: D:\VM
Writing OVF package: D:\VM\Parrot\Parrot.ovf
Transfer Completed
Completed successfully

```

## インポート

- `ovftool -ds=[コピー先データストア名] -dm=[ディスク形式 (thick,thin,eagerZeroedThick)] [OVFファイルのフルパス] vi://[ESXi username]:[ESXi password]@[ESXi hostname or IPaddress]/`

ちなみにthickプロビジョニングとthinプロビジョニングの違いはこんなかんじらしい
[【図解】VMware シンプロビジョニングとシック(eager zeroed/lazy zeroed)の違いとメリット/デメリット](https://milestone-of-se.nesuke.com/sv-basic/virtual-tech-basic/thin-thick-provisioning/)


- インベントリから削除後、再登録


## ESXiネットワーク構成のバックアップ（有償）

- 公式でバックアップできる方法あるの知らなかった。
- [ネットワーク構成のバックアップとリストア](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.networking.doc/GUID-140C6A52-F4C1-4B13-B2A3-9FFCF6000991.html)

## ESXi仮想マシンの定期バックアップ
https://dk521123.hatenablog.com/entry/37694505

https://miyamo83.com/20220717/

## 参考
- [OVF Toolを使って仮想マシンをエクスポート・インポートする](https://tech-mmmm.blogspot.com/2020/09/ovf-tool.html)
- [SSHとvSphere CLIでESXiのホスト＆ゲストをバックアップする方法](https://minory.org/esxi_backup.html)
- [【VMware】VMware vSphere Hypervisor（無償版ESXi） ～ バックアップ編 ～](https://dk521123.hatenablog.com/entry/37694505)
- [VMware ESXiホストの設定バックアップとリストア(その1:バックアップ)
](http://norimaki2000.blog48.fc2.com/blog-entry-1305.html)
- [VMware ESXi 仮想マシンをバックアップ](https://aulta.co.jp/technical/server-build/vmware/vmware-esxi/virtual-machine-backup  )
- [vSphere Distributed Switch 構成のバックアップとリストア](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.networking.doc/GUID-BE48C292-F222-4095-BCF8-D6444A785E16.html)
【資格合格記】AWS SCSに合格したので振り返る


2023/05/07に、AWS認定の一つであるセキュリティ専門知識（SCS-C01）に合格しました。
今回が専門知識系の初めての受験です。
ちなみにセキュリティ専門知識の認定試験は、2023/07/11にSCS-C02へと更新される予定です。
これから受験される方はご注意を。

![スクリーンショット 2023-05-07 180603.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/819801af-0d3d-0af8-da68-e8ea44766991.jpeg)


## 受験した感想

試験時間は170分ですが、残り時間が100分あたりの所で1周出来ました。時間については余裕があります。
見直しの時間も取れると思うので、焦らずに進めていきましょう。

セキュリティは色々なAWSサービスと絡んで来るため、学習する範囲も広めになります。
ただ、そこまで複雑な構成の問題は出ない印象でした。

ポリシーのjson形式の記述方法はしっかり理解しておいた方が良いです。
IAMポリシー、バケットポリシー、キーポリシーそれぞれ微妙に違うところがあるので混乱しないように。


## 使用した教材

・要点整理から攻略するAWS認定セキュリティ – 専門知識
SCS試験用の本です。試験範囲のサービスについての解説はもちろん、
どのように活用してセキュアな構成にするか理解できました。
アソシエイト、プロフェッショナル系に合格していればすんなりと読み進められると思います。


・Tech Stock
いつもの問題集サイトです。今回もお世話になりました。
SCSの問題は他と比べて数が少ないです（28セクション程度しかない？）
私は2周くらいしましたが、本試験と比べるとTech Stockの問題は簡単な印象です。
油断しないように。


・Skill Builder
無料の公式問題集です。20問しかないですが、こちらも利用しました。
Tech Stockの後で利用したのですが、Tech Stockで見たような問題が多かったです。
恐らくTech StockもSkill Builderを参考にしているのでしょう。
【SQL】最後の一文字を除いて抽出する+プチ応用

# はじめに

最後の一文字を除いたデータを抽出するSQLを書くことが稀にあるので簡易的に紹介します。

# 最後の一文字を除いてデータ抽出
以下のように、市区町村が格納された簡易テーブルがあるとします。

|id| city | 
|------------|------------|
| 1 | 世田谷区 |
| 2 | 東村山市 |
| 3 | 町田市 |

以下のクエリ実行で、最後の一文字である市区町村を除いたデータが取得できます。
```sql:SQL
SELECT SUBSTRING(city, 1, CHAR_LENGTH(city) - 1) FROM tabel_name;
```
結果
| city | 
|------------|
| 世田谷 |
| 東村山 |
| 町田 |

SUBSTRING関数を使用してcity列の1番目の文字から、city列の文字数 - 1番目の文字までの部分文字列を抽出しています。
世田谷区であれば、世〜谷を抽出することになります。

# 応用??
以下から、最後の一文字以外に「市」「区」「町」「村」を持つcityのデータを抽出します。

|id| city | 
|------------|------------|
| 1 | 世田谷区 |
| 2 | 東村山市 |
| 3 | 町田市 |

例えば、2番の東村山市は「市」以外に「村」が含まれるので抽出します。



それでは以下のクエリを実行します。
```sql:SQL
SELECT id, city, city_substring
FROM (
    SELECT id, city, SUBSTRING(city, 1, CHAR_LENGTH(city) - 1) AS city_substring
    FROM tabel_name
) AS sub
WHERE city_substring LIKE '%市%' OR city_substring LIKE '%区%' OR city_substring LIKE '%町%' OR city_substring LIKE '%村%';
```

結果

|id| city | city_substring |
|------------|------------|------------|
| 2 | 東村山市 |東村山
| 3 | 町田市 |町田

FROM句の中のサブクエリで、idとcityに加え、cityの最後の文字を取り除いた部分文字列 city_substringを取得しています。

サブクエリで取得したcity_substringのうち市区町村の文字列を含む行を
WHERE句とLIKE句を使用してフィルタリングします。
結果、最後の一文字以外に「市」「区」「町」「村」を持つcityのデータが判明しました。

上記のデータは例えば、住所から市区町村を抽出する正規表現のパターンに使用しますが
本記事の主旨とは少し逸れるため、詳細は別の記事で紹介できればと思います。
複数トピックのpub&sub

subscribeした情報をこねくり回したのち，publishしたいとき，どうしても同じコードに書く必要がある．
でも，ROSwikiのチュートリアルではそこまでカバーしていない．．．

そんなときに色々調べた結果をここにまとめる．（関連リンクはjoystickのデータをrosでsubscribeする方法）

# 主なやり方
* [golobal 変数を使う方法](#golobal-変数を使う方法)
* [class を使う方法](#class-を使う方法)

## golobal 変数を使う方法
こっちのが感覚的には分かりやすい．subscribe情報のうち必要なものをglobal変数に代入するだけ．

https://stackoverflow.com/questions/62799181/subscriber-to-joy-topic-in-ros

## class を使う方法
現状，classの知識が「structの親戚」程度にとどまっているので，まだいまいち理解しきれていないが，たぶん基本は上と一緒．

先にpub<->sub間で共有したい変数を宣言したり，callbackだけじゃなくて全体の流れもmain関数以外の関数で書けるから，コードが冗長になりにくいのかな...と思ったり思わなかったり．
少なくともmain関数はめっちゃ短く済む．

http://wiki.ros.org/joy/Tutorials/WritingTeleopNode

https://qiita.com/srs/items/9114bb3c27a148e0b855#joy%E7%94%A8%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

ちなみにclassの解説は[こちら](https://yttm-work.jp/lang/cpp/cpp_0001.html)


# あとがき
まだまだ分からない部分が多いので，これから少しずつ更新していければと．．．

それにしても，みんなpram関数を使ってるのはjoystickの仕様なのかな？普通に宣言するとうまく動かないのか試してみたい．
プログラミング入門コース　１週目

### **未経験４０代の挑戦**
初めまして２０１９年に片足を失った事をきっかけに
プログラミングを学び始めた者です。

### **プログラミングを学ぶ理由**
将来的に両足を病気で失う可能性が高いので
将来的に**在宅**で出来て、いつまでも**現役**で働きたいのが
理由ですね。(個人の感想です)

### **学習一周目**
一周目で学んだのは
・**HTML、CSS**の基礎(概念？)
・**Bootstrap**
・**Github**
もともと**paiza**さんなどのサイトで独学をしていたので
ある程度知識はあったのですが。
そんな私が目から鱗だった概念（考え方？）を書こうと思います。

### **divタグ**
このdivタグの概念が正直分かっていなかったです
でも今回の授業を受けてやっと理解できました。
それは「**箱**」って考え方です。
自分で好きに大きさを変えられる「箱」です。
てことは、最初に大きい「箱」を作ってその大きい「箱」の
中に**中くらい**の「箱」を**いくつか作って**その
中くらいの「箱」の中に自分の使いたいタグ（例えば「imgタグ」や「pタグ」など
）をしまって、最後に大きい「箱」をブラウザー上の置きたい位置にCSSで調整すれば
。もう雷が落ちた様な衝撃でした（笑）

### **CSS**
分かっていそうで分かっていなかった（自分が）コードをいくつか

 
            /*横幅*/
            width: 250px;
            /*高さ*/
            height: 50px;
            /*背景色*/
            background-color: transparent;
            /*枠の太さと色*/
            border: 1px solid white;
            /*文字の色*/
            color: white;
            /*枠の丸み*/
            border-radius: 50px;
            /*枠の外側の隙間（上だけ）*/
            margin-top: 30px;

### **１周目の課題**
さてそんな私が一週間学んで取り組んだ課題の
成果がこちらです。

![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469601/d8719794-8fe1-5eea-61bc-af64007837cb.png)


https://github.com/mokomokosparta/mypage.git


来週もがんばるぞ🎵
【JavaScript】順列全探索のメモです。

# この記事について
Atcoderで順列全探索の問題に出会い、コードを調べたので、まとめました。
仕組みについては書いておりません。いつか書けたらと思っています。

# 参考にした記事
@suzuki-naviさんの[順列の全探索をするプログラム（競技プログラミング向け）](https://qiita.com/suzuki-navi/items/a80677a0747232843957)です。

# 作成したコード
```
function Main(input){
    // ここに順列全探索をしたい配列を書く
  	P = [1, 3, 2, 4];
 
  	// 任意の配列Pをsortedに値渡しし、昇順にソート
  	sorted = P.slice();
    sorted.sort((a, b) => a - b);

    // 作成した順列を表示
    do {
        let str = "";
        for (let i = 0; i < sorted.length; i++) {
          str += sorted[i] + " ";
        }
      	console.log(str);
    } while (next_permutation(sorted));
}

// 階乗の計算
function factorial(n) {
	if(n == 0){
		return 1;
    }

	return n * factorial(n-1);
}

// 順列の生成
function next_permutation(arr) {
    const len = arr.length;
    let left = len - 2;
    while (left >= 0 && arr[left] >= arr[left+1]){
      left--;
    }  
    if (left < 0){
      return false;
    }
  
    let right = len - 1;
    while (arr[left] >= arr[right]){
      right--;
    }
    
  	const t = arr[left];
    arr[left] = arr[right]; 
    arr[right] = t; 
    left++;
    right = len - 1;
  
    while (left < right) {
        const t = arr[left]; 
      	arr[left] = arr[right]; 
      	arr[right] = t; 
        left++;
        right--;
    }
    return true;
}

Main(require("fs").readFileSync("/dev/stdin", "utf8"));
```

# 実行結果
```
1 2 3 4 
1 2 4 3 
1 3 2 4 
1 3 4 2 
1 4 2 3 
1 4 3 2 
2 1 3 4 
2 1 4 3 
2 3 1 4 
2 3 4 1 
2 4 1 3 
2 4 3 1 
3 1 2 4 
3 1 4 2 
3 2 1 4 
3 2 4 1 
3 4 1 2 
3 4 2 1 
4 1 2 3 
4 1 3 2 
4 2 1 3 
4 2 3 1 
4 3 1 2 
4 3 2 1 

```
VMWare FusionのARM版Windows(Insider Preview)のインストール手順

いまさら感がありますが、VMWare FusionにARM版Windowsを入れた手順のメモです。実際の利用などはWindows Insiderの利用条件に従う必要があります。

## 環境

- VMWare Fusion Fusion 13.0.2
- Windows11_InsiderPreview_Client_ARM64_en-us_25375.VHDX

## ARM版Windowsのダウンロード

「Windows Insider Preview」よりダウンロード（要ログイン

https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64

```Windows11_InsiderPreview_Client_ARM64_en-us_xxxx.VHDX```のようなファイルがダウンロードされる

## vmdkへの変換(qemu-image)

VHDXに対応していないので、変換を行う必要がある。

### qemuインストール
- ```brew install qemu```でqemuのインストールを行います。

### イメージ変換の実行

```
qemu-img convert -O vmdk Windows11_InsiderPreview_Client_ARM64_en-us_xxxx.vhdx windows11_arm.vmdk
```

## Windowsインストール

### VMWare Fusion
- 「カスタム仮想マシンの作成」を選択

![スクリーンショット 2023-06-03 12.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/8f689c89-7796-074e-5d4a-81f8895882b6.png)

- 「Microsoft Windows」　→ 「Windows 11 64bit ARM」を選択
- 「UEFI」選択（セキュアブートは不要）
- 暗号化を選択、パスワードはめんどくさい場合は「Auto Generate Password」を選択
    - いつ必要なのかよくわからないがメモしておく
- 「既存の仮想ディスクを使用」を選択し、変換したvmdkを選択する
    -　「仮想ディスクの個別コピーを作成する」を選択（する方が良いでしょう）
-　仮想マシンの名称と保存先を指定

### 起動後設定

ネットワーク接続がない場合にセットアップが進まないので起動後にテクニックが必要です。

- 一番初めの言語選択画面でShift+F10を押し、コマンドラインを開く

![スクリーンショット 2023-06-03 12.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/05acd7d7-7258-c48f-b257-6c9d0f393c2a.png)

- 以下を入力
    ```
    cd oobe
    bypassnro
    ```
- コマンドを打つと再起動する
- セットアップを進める
- インターネット接続の画面で「I dont have internet」を選択
    - 最初のコマンドを打っていないとこの選択肢が出ません

![スクリーンショット 2023-06-03 12.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/380f4e6d-8fd2-992f-625f-28206f9c49a8.png)

- そのままユーザー作成や設定をするとWindowsが立ち上がる

### VMWare Toolsのインストール

VMWareToolsが入っていないのでインタネットが使えないのでインストールを行います。

- スタート右クリック　→ 「Windows PowerShell(admin)」
- 「Set-ExecutionPolicy RemoteSigned」と入力しYを選択
- Fusionのメニュから「VMWare Toolsの再インストール」を選択
- ディスクマウントされるので、そのsetupを右クリックし「PowerShellで実行」を選択
    - ポリシーが変更されていないと実行できません
- 完了後再起動

# 参考

こちらの方がわかりやすいです。
https://softantenna.com/blog/vmware-fusion-13-arm-windows-11/
データサイエンスのための微分積分 第15回 単調有界数列必ず極限を持つ

:::note info
本記事は数学講座[2.14単調有界数列必ず極限を持つ](https://www.matongxue.com/lessons/589/parts/4645)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# 単調な数列と関数
**概念：**
- 狭義(きょうぎ)単調数列（関数）
- 単調数列（関数）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/ba69ca4b-899a-8edb-cfe8-c54e53ca63d3.png)

# 単調有界原則 

数列が単調、且つ[有界](https://qiita.com/Junlee/items/9b192582e54041c28c2d#%E6%9C%89%E7%95%8C%E6%95%B0%E5%88%97-bounded-sequence)であれば、この数列には必ず**極限**があり、**収束**します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/0ee7075d-78db-30df-f119-95baf856e0c9.png)

# オイラー数 e 

**定理：**
$\displaystyle\{a_n\}=\{\left(1+\frac{1}{n}\right)^n\}$の極限が存在します、その極限が$e$で表します：

```math
\lim_{n\to\infty}\left(1+\frac{1}{n}\right)^n=e
```

$e$がオイラー数 （Euler's number）、或は自然対数 （Base of the natural logarithms）、無理数です.
$e=2.718\ 281\ 828\ 459\ 045\cdots$

# オイラー数 e の例題 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/6faeca51-bd85-3d8f-e217-ac19e4d47a13.png)
【React】URLのハッシュ#を削除する

React Routerパッケージのルーティングを実装するコンポーネントはいくつかあるが、そのうちBrowserRouterとHashRouterはサーバー側の処理かクライアント側の処理かの違いで、HashRouterの場合、サーバー側の設定は不要だが、<BrowserRouter>ではサーバー側でルーティングの設定をする必要がある。


- ```<BrowserRouter>```
HTML5のhistoryAPIを使用してルーティングを処理します。
サーバーサイドの設定が必要です。特に、設定されたすべてのパスに対して正しいページを表示する必要があります。これにより、サーバー側とクライアント側のルーティングが一致します。
URLにはハッシュ（#）が含まれず、クリーンなURLが表示されます。例えば、example.com/homeのような形式です。

- ```<HashRouter>```
URL内のハッシュ（#）を使用してルーティングを処理します。
サーバーサイドの設定は不要です。URLのハッシュはクライアント側で処理されます。
URLにはハッシュ（#）が含まれ、その後にルーティング情報が続きます。例えば、example.com/#/homeのような形式です。

通常は```<BrowserRouter>```を使用することが一般的ですが、サーバーサイドの設定が困難な場合や、ブラウザのサポートに制限がある場合には```<HashRouter>```を使用することができます。

## BrowserRouterを使用するためのApacheの設定

```/etc/httpd/conf/httpd.conf```の/var/www/htmlのAllowOverride Allにして、.htaccessファイルの設定を有効にする。

```
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    #AllowOverride None 
    AllowOverride All
    Require all granted
</Directory>
```

```
<VirtualHost *:80>
    <Directory "/var/www/html">
        AllowOverRide All
        Options Indexes FollowSymLinks
        Require all granted
    </Directory>
</VirtualHost>
```

/var/www/html/.htaccessを作成し、下記を書き込む

```
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]
```

index.htmlの<head>に下記を追記する。
<base href="/">はHTMLの<head>要素内に配置されるタグであり、基本となるURL（ベースURL）を指定するためのものです。意味は、要素はドキュメント内の相対URLの解決に使用されるベースURLは、ルートディレクトリを指定する。
※まぁなんか基準を変えることで、URLのルーティングを解決しているってことかな？

```html
<head>
 <base href="/" /> //ここ
</head>
```

## 参考文献

https://zenn.dev/sgtkuc1118/articles/f8dad788e73c30
HTML＆javascriptでencoderを作ってみた

# html&javascriptでencode&decodeツールを作ってみた
<p>
    今回作ったのは、HTMLの入力欄に入力した情報をencodeさせるというものです。
　　前書きは短く！
    早速実践に移ります
</p>
<h1>早速作る！</h1>
<h2>javascript</h2>

```javascript:main.js
    var x;
    function code(){
        x = document.getElementById("encode").value;
        console.log(x);
    }
    function encode(){
        code();
        y=window.btoa(unescape(encodeURIComponent(x)))
        a()
    }
    function decode(){
        code();
        y=decodeURIComponent(escape(window.atob(x)))
        a()
    }
    function a(){
        let text = document.getElementById('id').textContent; //宣言
        document.getElementById('id').textContent = y;
    }
```
### 説明

    1,[var x;]は、関数内で変数を宣言すると、範囲が限られてしまうので、最初に宣言します。
    2,[ function code(){
          x = document.getElementById("encode").value;
          console.log(x);
      };]
    は、inputタグに入力した情報を取得するといった関数です。
    3,[function encode(){
           code();
           y=window.btoa(unescape(encodeURIComponent(x)))
           a()
       };]
    は、情報をencodeする関数です
    4,[function decode(){
           code();
           y=decodeURIComponent(escape(window.atob(x)))
           a()
       }]
    は、decodeする関数です。
    5,[function a(){
           let text = document.getElementById('id').textContent; //宣言
           document.getElementById('id').textContent = y;
    　 }]
    は、encodeかdecodeした情報を、表示させる関数です。

ちなみに、関数の宣言は[function 関数名(){処理}]で、できます。
<h2>html</h2>

```html:index.html
<script type="text/javascript" scr="/main.js">
<input type="text" id="encode">
<input type="button" onclick="encode()" value="エンコード">
<input type="button" onclick="decode()" value="デコード">
<textarea id="id"></textarea>
```
です

### 説明
    <script type="text/javascript" scr="/main.js">
    は、先ほど作ったjavascriptファイルを読み込みます。
    <input type="text" id="encode">
    は、入力欄を生成します。
    <input type="button" onclick="encode()" value="エンコード">
    これは、クリックすると、入力欄に入力した情報をencodeするボタンを生成します。
    <input type="button" onclick="decode()" value="デコード">
    これは、クリックすると、入力欄に入力した情報をdecodeするボタンを生成します。
    <textarea id="id"></textarea>
    encode&decodeした情報を表示させる欄です。

<h1>あとがき</h1>
この筆者は、まだ初心者なので時々間違った情報や、回りくどくて、短縮できる情報を発信することがあります。
なので、そういうことがあるとコメントで教えてくれると幸いです。

ご視聴有難うございました。
完成品↓
https://tanahiro2010.zatunen.com/encode.html
設置したvideoタグの動画のダウンロードを妨げる方法

# はじめに
今回はフロントエンド側の操作でvideoタグの動画のダウンロードを困難にする方法を紹介します。
「禁止する方法」ではなく「妨げる方法」としたのは、フロントエンドの実装だけで動画のダウンロードを禁止するのは不可能だからです。
完全に禁止したい場合は、サーバーサイドで動画へのアクセス制限を行ったり、HLS形式で配信する必要があります。

今回はあくまでフロントエンドの実装でユーザーの動画ダウンロードを簡単にはさせない方法を紹介します。


# 対象
- 作成したページ内にvideoタグを利用した動画が存在し、ダウンロードをさせたくない場合
- フロントエンド側で動画のダウンロードを禁止したい場合

# 動画のダウンロードを妨げる方法
## videoタグの属性指定
まずは、特定のブラウザで表示させるダウンロードボタンを非表示にする方法です。
特定のブラウザでは以下のようにご親切にダウンロードボタンが表示されます。

![スクリーンショット 2023-06-03 11.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/afce8305-b5ce-a826-4611-32429c991d81.png)

これを禁止するには、videoタグに以下のような属性の指定をします。

```html
<video controlsList="nodownload"></video>
```
上記の指定でダウンロードボタンは表示されなくなります。

## JavaScriptでの右クリック禁止
次に、以下のように動画を右クリックでコンテキストメニューを表示させて動画を保存するのを禁止する方法です。
以下のように動画を右クリックすると動画を保存するメニュー選択肢が表示されます。

![スクリーンショット 2023-06-03 11.46.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849606/e9704f08-e298-1f94-daa6-24cf2132dfb0.png)

### videoタグの属性指定
先ほどと同じようにvideoタグの属性指定で右クリックを禁止します。

```html
<video oncontextmenu="return false;"></video>
```

### JavaScriptでのcontextmenuのイベント禁止
上記と同様の内容ですが、scriptでvideoタグへのcontextmenuイベントを禁止する方法もあります。

```html
<video id="video1"></video>

<script>
document.getElementById('video1').addEventListener('contextmenu', function(e) {
     e.preventDefault();
});
</script>
```

加えて、右クリックを検知して他のメソッドを呼び出したい場合はこちらを利用してもいいと思います。

## CSSでクリック禁止
最後はあまりお勧めしませんが、videoタグへのクリックを禁止して右クリックを反応させない方法です。

```css
video {
    pointer-events: none;
}
```

これで右クリックは禁止出来ますが、左クリックも禁止するのでvideoタグをクリックして動画操作することが出来なくなります。
なので動画のコントローラーを外部に自作している場合に有効な方法になります。
クラウドコンピューティング


ここではサーバの考え方や用途等をまとめていきたいと思います。

```
【クラウドサービス・プロバイダ／CSP：Cloud Service Provider】
PaaS、IaaS、SaaSなどいずれの形態であれ、クラウドサービスを提供する企業を指します。

【クラウドストレージ ／Cloud Strage】
ユーザーがインターネットを介してリモートでアクセスできる、オンラインのデータ保管庫する。

【スケーラビリティ／Scalability】
ユーザー数や利用頻度、プロセスが増加しても対応できる能力を意味する。
スケーラブルなシステムは、ニーズの増加や変化に柔軟に対応できる。

【パブリッククラウド／Public Cloud】
一般ユーザーおよび企業ユーザー向けに、インターネット経由でクラウドコンピューティング環境を提供するサービス。

3大パブリッククラウドサービスと呼ばれている。
GCP、AWS、Azure

【DevOps／Development and Operations】
開発と運用を意味し、システム開発者（Development）担当と運用者（Operations）が相互に補完する協業体制、あるいは双方を同じ者が行う手法、もしくは概念。
システムのクオリティ向上に寄与する。
開発と運用を一貫して手掛ける技術者はDevOpsエンジニアと呼ばれる。

【プライベートクラウド／Private Cloud】
パブリッククラウドとは対照的に、特定のユーザーのみが活用できる専有クラウド環境を意味する。
企業が自社内で構築したクラウドコンピューティング環境を、社内の各部署やグループ企業に提供するクラウドの形態。
従来の社内システムと同様に企業内でシステムやデータを管理できるため、柔軟な運用ができる。

【IaaS／Infrastructure as a Service】「イアース」もしくは「アイアース」
ユーザーに対してインターネットを介して、コンピューティングリソース（ネットワークやサーバなどの機能）を提供するクラウドサービスのビジネスモデル。

主なサービス
Amazon Web Services(AWS)
Microsoft Azure.
FUJITSU Cloud Service.
Google Cloud.
Alibaba Cloud.
IBM Cloud.
Oracle Cloud.
Red Hat.

【PaaS／Platform as a Service】読み方は「パース」
ユーザーに対してインターネットを介して、アプリケーションの作成・展開・管理のためのツールを提供するしている。
大規模なデータセンターにサーバシステムやネットワーク、OSやミドルウェアなどのアプリケーションを稼動させるプラットフォームが用意され、ユーザがそのプラットフォーム上で開発作業を遂行できる。

主なサービス
・各種プログラミング言語を使用してWebアプリケーションの開発公開が可能なGoogle App Engine
・Webアプリケーションの開発から実行、運用までをクラウド上で完結できるHeroku

【SaaS／Software as a Service】読み方は「SaaS」
ユーザーに対してインターネットを介して、ソフトウェアを利用できるサービスを提供するビジネスモデルで、読み方は「サーズ」または「サース」です。アカウントを取得すれば、デバイスとネット環境がある限りどこからでも利用できる。
企業内のチームや企業間のグループで、ファイルやデータを共有して共同作業をすすめることも可能。ソフトウェアのバージョンアップはサービス提供者側で行う。ユーザーは常に最新の機能を享受でき、バグが発生しても速やかに修正される。サービスを契約してアカウントが準備できれば、すぐに利用を開始できる。

主なサービス
Microsoft Office 365などのオフィスソフト
GmailなどのWebメール
Dropboxなどのオンラインストレージ
サイボウズなどのグループウェア

```
C++のコメントについて

C++のコメントアウトの書き方やエラーの種類をまとめようと思います。
忘れないように自分用のメモでもあります。

## 開発環境(そんなに影響ないかも)
- Mac(ver 13.3.1)
- VSCode




## 参考コード
```C++:test.cpp
#include <iostream>
using namespace std;

int main()
{
    for (int i = 0; i < 10; i++) {
        cout << "コメントで消したい部分" << endl;
    }

    cout << "残したい部分" << endl;
}
```
この記事では上記のコードを使用していきます。




## コメントの書き方1️⃣
```C++:test.cpp
#include <iostream>
using namespace std;

int main()
{
    /*for (int i = 0; i < 10; i++) {
        cout << "コメントで消したい部分" << endl;
    }*/

    cout << "残したい部分" << endl;
}
```
/* */ で囲う方法です。
一番早く、綺麗に、簡単に消せる方法だと思ってます。ただし、とある落とし穴にハマるとエラーが出てしまいます。
```C++:test.cpp
#include <iostream>
using namespace std;

/*int main()
{
    /*for (int i = 0; i < 10; i++) {
        cout << "コメントで消したい部分" << endl;
    }*/

    cout << "残したい部分" << endl;
}*/
```
main関数ごとコメント化したい場合、このような書き方をするとエラーが起こってしまいます。
intの前の　/*　が　}　の前の　*/　とぶつかってしまうからですね。
これらの対処法は2つあります。




## コメントの書き方2️⃣
```C++:test.cpp
#include <iostream>
using namespace std;

// int main()
// {
//     for (int i = 0; i < 10; i++) {
//         cout << "コメントで消したい部分" << endl;
//     }

//     cout << "残したい部分" << endl;
// }
```
一つの方法として、全てに//をつける方法です。分かりやすいですね。
でも、もっと綺麗に書く方法があります。

## プリプロセッサで無効化する方法
```C++:test.cpp
#include <iostream>
using namespace std;

#if 0
int main()
{
    for (int i = 0; i < 10; i++) {
        cout << "コメントで消したい部分" << endl;
    }

    cout << "残したい部分" << endl;
}
#endif
```
コメントではありませんが、上記のように書くことで一定の範囲をプリプロセッサで無効化することもできます。
チームで開発する場合は下記のような書き方もするようです。
```C++:test.cpp
#include <iostream>
using namespace std;

int main()
{
#ifdef Rotodesu20230603
    for (int i = 0; i < 10; i++)
    {
        cout << "コメントで消したい部分" << endl;
    }
#endif

    cout << "残したい部分" << endl;
}
```
なぜか記事内では無効化されないですが、エディタではちゃんと無効化されます。
この書き方だと誰が、いつ、編集したのか分かり易いですね。
データサイエンスのための微分積分 第14回 漸近線

:::note info
本記事は数学講座[2.13漸近線](https://www.matongxue.com/lessons/570/parts/973)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::
# :sunny:纏め
X軸と斜め軸の漸近線が同時に存在する可能性がないです。両方ともXが無限大の場合ですので。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/e55487e6-e1b3-ae25-e97a-50dfbe50da5d.png)



# x軸平行の漸近線[ぜんきんせん]

**定義：**

$\lim_{x\to-\infty}f(x)=L\qquad\text{或いは}\qquad\lim_{x\to+\infty}f(x)=L$
、直線の$y=L$が函数$f(x)$の $x$軸平行の漸近線 （Horizontal asymptote）。

# y軸平行の漸近線

**定義：**
$\lim_{x\to x_0^-}f(x)=\pm\infty\qquad\text{或いは}\qquad\lim_{x\to x_0^+}f(x)=\pm\infty$
、直線の$x=x_0$が函数$f(x)$の $y$軸平行の漸近線（Vertical asymptote）。

# 斜め方向の（y=ax+bの形の）漸近線


**定義：**
$\lim_{x\to -\infty}[\ f(x)-(ax+b)\ ]=0\ \ \text{或いは
}\ \ \lim_{x\to +\infty}[\ f(x)-(ax+b)\ ]=0$
、直線の$y=ax+b$が函数$f(x)$斜め方向の漸近線（Slant asymptote）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/61551565-bc7c-b157-ea05-16c2135bb1ee.png)

# 練習

**例１:**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/89fb6543-eaff-e635-df57-cb6d5b19756f.png)

**例2:**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/8f6884d6-3d7f-10b7-0b5c-b2d4d23c5ba0.png)


# 参考情報

https://ja.wikipedia.org/wiki/%E6%BC%B8%E8%BF%91%E7%B7%9A#:~:text=%E8%A7%A3%E6%9E%90%E5%B9%BE%E4%BD%95%E5%AD%A6%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%80%81%E5%B9%B3%E9%9D%A2,%E5%9B%9E%E4%BA%A4%E3%82%8F%E3%81%A3%E3%81%A6%E3%82%82%E3%82%88%E3%81%84%E3%80%82

https://mathwords.net/zenkinsen

https://www.geisya.or.jp/~mwm48961/koukou/differ_graph12.htm
Salesforce × 帳票出力

## はじめに
今回は、Salesforceを用いて帳票出力する方法を、いくつか紹介していきます。

## 帳票出力とは
一般的に、システム上に入力して蓄積されたデータを、ユーザーの要求に従って成形・出力するものを「帳票」と呼ぶ。具体的には、見積書、請求書、承認書類などを指し、ビジネス業務の中で頻度高く使用される書類に対しては、帳票出力のニーズが高い。

## Salesforceで提供されている帳票出力
### 1. 差し込み印刷
Salesforceが標準で提供している帳票出力の機能。大きく2種類存在し、①差し込み印刷、②拡張差し込み印刷である。
差し込み印刷には非常に厳しい動作要件があるため、現実的に使用されることは少ない。具体的には下記のような制約がある。
- ブラウザはIEの特定バージョンに限定される。
- Wordは最新のバージョンをサポートしていない。
- クライアントOSが限定され、更に利用できる期間もTLS1.0が無効化されるまで。

一方、拡張差し込み印刷においてもいくつかの弱点が存在する。
- Lightning Experienceでは利用できない。
- 複数オブジェクトの複数データを1帳票上に出力できない。
- 操作が煩雑である。

したがって、これらの制約条件がある中、差し込み印刷で業務要件を満たせるケースは非常に限られる。

### 2. レポート機能
Salesforceの標準機能であるレポートを使用して、Excelファイルを出力する方法。
レポート機能で作成可能なデータ範囲であれば、帳票出力も可能である。例えば、以下の要件を満たすことが可能。
- 複数のオブジェクトを組み合わせる。
- レポートの絞り込み条件を使用して、特定のレコードのみを表示する。
- 行・列をグループ化する。

制約事項として、一覧形式（Excelファイル）は出力できるが、一覧形式以外は出力することができず、帳票のデザインに対する自由度は低いことが挙げられる。

### 3. Visualforce
Salesforceの開発言語であるVisuaforceを使用して、帳票出力する方法。
ページ属性にrenderAs=PDFを指定することで、そのページ内で表現される内容をPDF形式でブラウザに返すことができる。
帳票出力までの操作イメージは下記の通り。
1. レコード詳細画面上のカスタムボタンを押下する。
1. 出力したい帳票のプレビュー画面が表示される。
1. PDFファイルの帳票が画面に表示される。
※複数のレコードを事前に選択する、出力した帳票を該当レコードの添付ファイルに保存する、といったことも可能。

利点として、出力する帳票のデザインを自由度高く設定できる。一例は下記の通り。
- 出力する帳票のサイズ
- 上下左右の余白
- フォントサイズ・太さ
- 色の有無
※注意点として、フォントスタイルが1種類に限定されている。

## サードパーティの帳票出力サービス
数を挙げれば、キリがないが、代表的なサービスのみを抜粋。

### 1. SVF Cloud for Salesforce(ウイングアーク1st)
SalesforceのAppExchangeの中で、代表的な帳票出力のサービスの一つ。
Word、Excelから帳票のひな型を作成し、そのひな形に対してSalesforceの項目をマッピング（ドラッグ＆ドロップ操作）していく。
※マッピング操作にあたって、SVF Cloud専用のアドオンを搭載する必要がある。

また操作は簡易であり、基本的なマウス操作のみで完結する。Visualforceのように高度なプログラミングツールは不要である。

- [SVF Cloud for Salesforce](URL "https://www.wingarc.com/product/svfc/salesforce/")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025346/cb9317b3-bd2a-abdf-3a5c-81208122a5ac.png)


### 2. OPROARTS(オプロ)
SVF Cloudと同様、Salesforceの帳票出力サービスの代表的なものの一つ。
Excel/Word/PowerPointにOfficeアドインをインストールして設定する他、ウェブブラウザ上で動くデザインツールを使用して帳票テンプレートを作成できる。
- [oproarts](URL "https://oproarts.opro.net/service/salesforce.html")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025346/440ebf77-d2eb-2ae0-bd76-527838c616b9.png)

### 3. その他の帳票出力ツール
- Smart Report Meister
- freee for Salesforce
- Fleekform
- Canon Business Imaging Online

## 帳票出力機能の設計の流れ
帳票出力の提供サービスは複数あるものの、案件上での設計・開発フェーズの作業は共通化できる部分がある。以下の通りまとめる。

### 1. 帳票のレイアウトイメージの作成
ExcelやWordを使って、レイアウトをまとめていくのが一般的である。

### 2. 帳票に表示するオブジェクトの項目定義
特にAPI名、項目名は帳票を設定前に確定させる。五月雨式に変わってしまうと、その都度設計書の変更が発生してしまうため。 

### 3. マッピング仕様書の作成
作成した帳票のレイアウトに対して、Salesforceのどの項目を表示するのかを記したものを作成する。

## まとめ
- 帳票出力のサービスは複数あるが、帳票のデザインの自由度、開発工数などを総合的に鑑みて、サービスを選定する必要がある。
    - ただのExcel上の一覧形式であれば、レポート機能で充分だろうし、リッチな帳票を作り込みたい場合は、AppExchangeの使用を検討する、など。
- 帳票出力の設計においては、いかに手戻りを発生させないかが、重要である。
    - 帳票のデザインは、ユーザ側も拘る部分である。デザインの確定後、複数の変更要求が提出され、開発の手戻りが発生する、といったことがないよう、ユーザ側との調整が必要である。
cscの作法 その330

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
MDIコンテナを実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/839677d1-2fe7-ebd3-d813-86bf38234dab.png)


# サンプルコード

```
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;

namespace App
{
	public partial class formSub: Form {
		TextBox bo1;
		public formMain fm;
		public formSub() {
			Text = "formSub";
			ClientSize = new Size(300, 200);
			bo1 = new TextBox();
			bo1.Location = new Point(50, 20);
			bo1.Text = "test desu";
			bo1.Size = new Size(100, 20);
			Controls.AddRange(new Control[] {
				bo1
			});
			Button btn1 = new Button();
			btn1.Location = new Point(50, 100);
			btn1.Text = "test";
			btn1.Click += btn1_Click;
			Controls.AddRange(new Control[] {
				btn1
			});
		}
		void btn1_Click(object sender, System.EventArgs e) {
			if (fm != null)
			{
				fm.ReceiveData = bo1.Text;
			}
		}
	}
	public partial class formMain: Form {
		public string ReceiveData {
			set {
				receiveData = value;
				bo1.Text = receiveData;
			}
			get {
				return receiveData;
			}
		}
		TextBox bo1;
		private string receiveData = "";
		public formMain() {
			Text = "formMain";
			BackColor = Color.Azure;
			//ForeColor = Color.Blue;
			ClientSize = new Size(120, 500);
			bo1 = new TextBox();
			bo1.Location = new Point(10, 20);
			bo1.Size = new Size(100, 20);
			Controls.AddRange(new Control[] {
				bo1
			});
			Button btn1 = new Button();
			btn1.Location = new Point(10, 70);
			btn1.Text = "sub";
			btn1.Click += btn1_Click;
			Controls.AddRange(new Control[] {
				btn1
			});
			Button btn2 = new Button();
			btn2.Location = new Point(10, 470);
			btn2.Text = "exit";
			btn2.Click += btn2_Click;
			Controls.AddRange(new Control[] {
				btn2
			});
		}
		void btn1_Click(object sender, System.EventArgs e) {
			formSub sub = new formSub();
			sub.MdiParent = MdiParent;
			sub.fm = this;
			sub.Show();
		}
		void btn2_Click(object sender, System.EventArgs e) {
			Application.Exit();
		}
	}
	public partial class formMdi: Form {
		public formMdi() {
			Text = "formMdi";
			ClientSize = new Size(900, 550);
			IsMdiContainer = true;
			formMain ma = new formMain();
			ma.MdiParent = this;
			ma.Show();
		}
		[STAThread]
		public static void Main() {
			Application.Run(new formMdi());
		}
	}
}





```


以上。
cscの作法 その329

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
csvを読んでsqliteにinsertせよ。

# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Data.SQLite;

namespace App
{
	public class Program {
		public static void Main(string[] args) {
			SQLiteConnectionStringBuilder ConnectionStr = new SQLiteConnectionStringBuilder();
			ConnectionStr.DataSource = "db0.sqlite";
			using (SQLiteConnection Connection = new SQLiteConnection(ConnectionStr.ToString()))
			{
				Connection.Open();
				using(SQLiteCommand Command = new SQLiteCommand(Connection))
				{
					Encoding enc = Encoding.GetEncoding("Shift_JIS");
					string file = "out.csv";
					StreamReader reader = new StreamReader(file, enc);
					string temp = reader.ReadToEnd();
					string[] lines = temp.Split(new string[] {
						"\r\n"
					}, StringSplitOptions.None);
					string[] spLine;
					for (int i = 1; i < lines.Length; i++)
					{
						spLine = lines[i].Split(new char[] {
							',' ,
							'\t'
						}, StringSplitOptions.None);
						for (int j = 0; j < spLine.Length; j++)
						{
							spLine[j] = spLine[j].Trim('"');
						}
						//Console.WriteLine(spLine[2]);
						Command.CommandText = "INSERT INTO adata(stime, title, price, biko) VALUES (:stime, :title, :price, :biko)";
						Command.Parameters.Add(new SQLiteParameter("stime", spLine[1]));
						Command.Parameters.Add(new SQLiteParameter("title", spLine[2]));
						Command.Parameters.Add(new SQLiteParameter("price", spLine[3]));
						Command.Parameters.Add(new SQLiteParameter("biko", spLine[4]));
						Command.ExecuteNonQuery();
					}
				}
			}
			Console.WriteLine("ok0");
		}
	}
}
```


以上。
Macの定規ツールLinearの使い方

私がコーディングの時によく使用しているLinearというツールをご紹介します。主に画像などを挿入したときなどに、高さ、幅が合っているか確認するときに使用しています。

### インストール
https://github.com/mikaa123/linear/releases

こちらから最新バージョンをダウンロードできます。

### 使い方
- `ctrl`＋`command`＋`R`で起動
- `ctrl`＋`command`＋`W`で終了
- `ctrl`＋`command`＋`T`で表示非表示切り替え
- `command`＋`;`でセンターガイドの表示非表示切り替え
### 機能
- 複数の定規を起動可能
- 定規の単位はemとpxに対応
- 現在使用している定規の複製が可能

![スクリーンショット 2023-06-03 11.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884189/cf3e4bf9-3891-c785-8daf-6baf67bd8677.png)

すごくシンプルな操作方法で使いやすいなと感じました。

### 参考
https://zenn.dev/maneko/articles/web-create-tool-linear

https://coliss.com/articles/build-websites/operation/design/ruler-app-for-web-development.html
【React Tips】リスト要素以外のkeyの使いどころ

## はじめに
Reactで配列から`map`メソッドを使ってJSXでリスト要素を作成したときに`key`をつけ忘れてwarningで怒られてつけるということよくあるのではないでしょうか？
```
Warning: Each child in a list should have a unique "key" prop.
```
リスト要素には`key`を渡そうねとか、そのとき`map`の`index`使うのはよくないよ、という記事はよく見かけますが、今回はReactの公式ドキュメントを読んでいてリスト要素以外でもkeyが活かせるパターンを見つけたので紹介します。

https://react.dev/learn/you-might-not-need-an-effect#resetting-all-state-when-a-prop-changes

こちらの章ではそれ`useEffect`使う必要ないんじゃない？という例をいろいろと紹介しているのですが、その中で、渡ってくる`props`が変わるたびに`state`を初期化したい場合は`useEffect`使わずに`key`属性が使えるよ、という話がありました。

## NGな例🙅
`useEffect`を使って初期化する場合
```React
const Profile = ({ userId }) => {
  const [comment, setComment] = useState('');

  useEffect(() => {
    setComment('');  // userIdが変わるたびにcommentが空文字列になる
  }, [userId]);

  // ...
}
```

## Goodな例🙆
呼び出し側で`key`にも初期化のトリガーにしたい変数を渡す
```React
const ProfilePage = ({ userId }) => {
  return (
    <Profile
      userId={userId}
      key={userId}  // これでもuserIdが変わるたびにcommentが空文字列になる
    />
  );
}

const Profile = ({ userId }) => {
  const [comment, setComment] = useState('');

  // ...
}
```

## 仕組み
Reactでは同じコンポーネントをReactの仮想DOMツリーの同じ位置に描画する場合、そのコンポーネントの`state`を保持したまま更新します。
しかし、`key`属性を追加して`userId`が異なるコンポーネントは異なる`key`になるようにすることで、別のコンポーネントと見なされてDOMを再生成するので、`state`もリセットさせることができます。

## 最後に
`key`はリスト要素にしか使ったことがなかったのですが、こんな使い方もあるんですね。
NG例のようなことをしている箇所を見つけたら`key`で代用できないか検討したいと思いました。

ちなみに最初に貼った公式ドキュメントのページの一番最後にReactアプリのプレイグラウンド付きのチャレンジ問題があるのですが、その3問目がちょうどこの例なので、サクッと試してみたい場合はそれを使うとよいかもしれません。
【自作アプリ　番外編】

今回は番外編として「株式投資集計アプリ」とは別に並行して作成していた「占いアプリ」を公開しようと思います。

#### 【観点】
およそ半年前に作成していたアプリにはなるのですが現在の自分のスキルと比較してどこが成長しているのかを実感する回になります。


--環境--
使用テーブル：１
画面数：３
Database：h2Database
言語：java8
IDE：Eclipse
環境：jsp,servlet
pc：macbookAir2017

--まずはアプリの全貌--

#### 【画面レイアウト】

➀トップ画面
![トップ画面　占いアプリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/4b102540-8cb5-3082-0cc4-6bf05f352e0e.png)

➁占い結果画面
![占い結果画面　占いアプリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/13b48cc6-d912-16e3-9f22-662f455c41f1.png)

➂自己紹介画面
※こちらに関しては個人情報が記載されていた為キャプチャ無し


#### 【機能】
機能としては単純で
「トップ画面」にある項目に知りたい情報（自身の星座等）を入力して「占う」ボタンを押下する
↓
「占い結果画面」に遷移して「トップ画面」で入力されたデータを参考に結果を表示する
という機能になっています。

#### 【こだわった機能】
--ブランク
「トップ画面」にて入力する際に「名前」と「星座」を入力する項目がありますが「名前」に関してはブランク（空白）や入力しないと言う事を許可していますが「星座」に関してはブランクを許可していません。ですので何かしらを入力しないと「占う」ボタンは押下する事ができません。

--ダイアログ
「トップ画面」に結果が出力されていますがその横に「削除」ボタンがあると思いますがこちらを押下する際はJavaScriptを使用して確認ダイアログを出力するようにしています（以下参照）

![トップ画面　占いアプリ　確認ダイアログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/e7591d4d-9a80-bba9-24c1-dd5884ced165.png)

--レイアウト
全体的に落ち着いた雰囲気を出したいと言うことが当時の希望でしたのでモノトーンで作成しています。この時参考にしたのが楽天のサイトです。

#### 【振り返り】
・全体的に画面数が少なめになっている事
・Javaソースの部分でコードに無駄がある事

上記が特に見られるかと思いました。現在のスキルだと「こう言うふうに書くな〜」と言うところが数点ありました。当時はJavaを覚えたてだったこともありなるべく簡単で当時の自分でもできるものでと言うこともあったと思うのでコードについて無駄が多い気がします。servlet,jspについてもURLパターンがどう言うふうに裏で動いているのかの理解が追いついておらずに画面遷移することに恐れていたのかもしれません。そもそもデータを引っ張ってきたりbeanに一時的に格納する事がわかっていなかった。。。


以上になりますが、振り返りとして改めてコードレビュー的な意味で見返す事ができたのかなと思います。ありがとうございました。
DockerでUbuntu22.04のイメージを取得して起動する

# はじめに
Dockerイメージをpullして、起動する方法を記事にしています。
### Dockerイメージ取得
Ubuntu22.04のDockerイメージをpullします。
```
docker pull ubuntu:22.04
```
### コンテナ起動
Ubuntu22.04コンテナを起動します。
```
docker run --name myubuntu ubuntu:22.04 /bin/bash
```
### 起動中コンテナ一覧取得
起動しているコンテナ起動を取得します。
```
docker ps
```
さっき起動したはずですが、何も表示されません。
```
-zsh ~/Docker/ub22.04 % docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
-a オプションを付けてみます。
```
docker ps -a
```
表示されます。Exit（停止）しているようです。
```
-zsh ~/Docker/ub22.04 % docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
a9f80ec02728   ubuntu:22.04   "/bin/bash"   7 seconds ago   Exited (0) 5 seconds ago             myubuntu
```
### コンテナ起動（稼働中を維持）
コンテナ起動して稼働中のままにします。
* 方法1 tail -d /dev/nullを実行します。
```
docker run -d --name myubuntu ubuntu:22.04 tail -f /dev/null
```
実行例
```
-zsh ~/Docker/ub22.04 % docker run -d --name myubuntu ubuntu:22.04 tail -f /dev/null
b10de1d6d80b0ae8f739f78f8fa50af57c4248ce8a3473d4cfaa8fb77fc5c98d
-zsh ~/Docker/ub22.04 % docker ps
CONTAINER ID   IMAGE          COMMAND               CREATED         STATUS        PORTS     NAMES
b10de1d6d80b   ubuntu:22.04   "tail -f /dev/null"   2 seconds ago   Up 1 second             myubuntu
```
* 方法2 インタラクティブモードで実行します。
```
docker run -it -d --name myubuntu ubuntu:22.04 
```
実行例
```
-zsh ~/Docker/ub22.04 % docker run -it -d --name myubuntu ubuntu:22.04

626ca84beb9a609a281f71ecc711a645eb07189c1e26f20d6c240df9c2c1738d
-zsh ~/Docker/ub22.04 % docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
626ca84beb9a   ubuntu:22.04   "/bin/bash"   6 seconds ago   Up 5 seconds             myubuntu
```
### コンテナに入る
docker psコマンドで取得したコンテナIDを指定して稼働中のコンテナに入ります。
```
docker exec -it 258732c47a12 /bin/bash
```
実行例
```
-zsh ~/Docker/ub22.04 % docker exec -it 258732c47a12 /bin/bash
root@258732c47a12:/#
```
### コンテナ起動して中に入る
コンテナを起動すると同時にコンテナの中に入ります。
```
docker run -it --name aaa ubuntu:22.04 /bin/bash
```
実行例
```
-zsh ~/Docker/ub22.04 % docker run -it --name aaa ubuntu:22.04 /bin/bash
root@cf62b2d3aa64:/#
```
### コンテナの中から抜ける
exitすれば良いです。
実行例
```
root@cf62b2d3aa64:/# exit
exit
-zsh ~/Docker/ub22.04 %
```

### コンテナ停止
Ubuntu22.04コンテナを停止します。
```
docker stop myubuntu
```
### コンテナ削除 
Ubuntu22.04コンテナを削除します。
```
docker rm myubuntu
```
### Dockerイメージ削除
Dockerイメージの一覧を取得します。
```
docker images 
```
Dockerイメージの取得例
```
-zsh ~/Docker/ub22.04 % docker images
    
REPOSITORY                        TAG          IMAGE ID       CREATED        SIZE
ubuntu                            22.04        2767693332e5   11 days ago    69.2MB
```
IMAGE IDを指定して、Dockerイメージを削除します。
```
docker rmi 2767693332e5
```

以上です。
TensorFlow / Keras で GPU を有効化する方法（Windows 編）

# TensorFlow / Keras で GPU を有効化する方法（Windows 編）

Keras は高水準のニューラルネットワークライブラリで、バックエンドにTensorFlowを使用しています。TensorFlow は機械学習に用いるためのソフトウェアライブラリです。TensorFlow はGPUをサポートしており、CPUよりも高速に機械学習させることができます。本記事は Windows 上で Keras または TensorFlow でGPUを利用する方法を紹介します。

## 公式サイト

* [Keras](https://keras.io/ja/)
* [TensorFlow](https://www.tensorflow.org/?hl=ja)
* [NVIDIA CUDA Toolkit](https://docs.nvidia.com/cuda/index.html)
* [NVIDIA cuDNN](https://docs.nvidia.com/deeplearning/cudnn/index.html)

## 前提条件

本記事では NVIDIA 製 GPU を搭載した PC で、ハードウェア要件を満たしており、最新の GPU ドライバーをインストールしている前提で進めます。

## TensorFlow のバージョン確認

TensorFlow は 1.15 以前のリリースではパッケージが CPU と GPU で分かれていますが、最新のリリースでは統合されています。詳しくは[こちら](https://www.tensorflow.org/install/gpu?hl=ja)を参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/762911a0-7aab-92c2-1c04-36c9b622c507.png)
TensorFlow で GPU を利用するには NVIDIA CUDA Toolkit と NVIDIA cuDNN が必要になります。[こちら](https://www.tensorflow.org/install/gpu?hl=ja)でソフトウェア要件を確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/b8a6f779-6955-2efe-db03-4639045bf47b.png)
Windows 上の TensorFlow で GPU を利用する場合、バージョンを 2.10 以前にする必要があります。最新バージョンを利用する場合は[公式](https://www.tensorflow.org/?hl=ja)で確認してください。本記事では Windows で利用できる バージョン 2.10 を使用します。TensorFlow 2.10 は cuDNN 8.1 と CUDA 11.2 でビルドされています。詳しくは[こちら](https://www.tensorflow.org/install/source_windows?hl=ja)を参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33079/3e475f35-4fb1-9a8f-b11c-97df6d37635c.png)

## NVIDIA CUDA Toolkit のインストール

TensorFlow 2.10 のビルドに使用された CUDA 11.2 をダウンロードして、インストールします。本記事では最新の CUDA Toolkit 11.8.0 を使用します。from [NVIDIA CUDA Toolkit.](https://developer.nvidia.com/cuda-toolkit-archive)  
※ CUDA Toolkit のインストール時に、カスタムインストールオプションで **CUDA** のみ選択してインストールします。

## NVIDIA cuDNN のインストール

CUDA 11.x の cuDNN をダウンロードしてインストールします。本記事では最新の cuDNN 8.9.1 for CUDA 11.x を使用します。 from [NVIDIA cuDNN.](https://developer.nvidia.com/rdp/cudnn-archive)  
[こちら](https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#install-windows)の Windows インストールガイドに沿ってインストールしてください。

## TensorFlow のインストール

pip コマンドで TensorFlow 2.10 をインストールします。

```bash
pip install tensorflow==2.10
```

## TensorFlow の動作確認

次の Python のコードを実行して、GPU が利用できるか確認します。

```python
import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
```

実行結果に *`device_type='GPU'`* があれば、TensorFlow で GPU が利用できます。詳しくは[こちら](https://www.tensorflow.org/guide/gpu?hl=ja)を参照してください。

```python
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
```

## 参考文献

* [【手順】Keras(->TensorFlow)でGPU利用環境を構築する手順(Windows)](https://gloria.cool/blog/20220713-keras-tensor-gpu/)
* [Windows 11へのTensorFlow 2.6.0（GPU版）のインストール](https://self-development.info/windows-11%E3%81%B8%E3%81%AEtensorflow-2-6-0%EF%BC%88gpu%E7%89%88%EF%BC%89%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
Spring BootとMySQLで質素なメモアプリを開発しました #1【駆け出し】

# Spring(Spring Boot)の開発
前回の記事から日が空いてしまいましたが、今日も元気に駆け出しエンジニアをやっています。

実務では相変わらず、プログラミングではなくGoogleスプレッドシートおじさんだったりLinuxコマンド叩きおじさんと化しています。

勝手ながらJava Goldの資格を勉強していまして、プログラミング熱が再燃したので研修時の知識を無理やり引っ張りつつアプリケーション開発をしていきたいと思います。

## 経緯
上記の通り、サボっていたプログラミング学習への熱意の再燃と将来の不安から下記リンクのUdemy講座を
改めて受講してアウトプットとしてアプリを開発してみました。


研修でJavaを学んでいたものの、資格の勉強以外では全くコーディングをしていないので0から学び直す意識で取り組んでいきます。

https://www.udemy.com/course/intellij-spring-boot/

## 作ったもの
- メモアプリ
    - github: private化しました。

## 使用技術
- Spring Boot 2.7.12
- Java 11
- Maven(ビルドツール)
- MySQL(DB)
- Mybatis(O/Rマッパー)

## テーブル定義
```sql:schema.sql
CREATE TABLE IF NOT EXISTS memo (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'メモID',
title VARCHAR(80) NOT NULL PRIMARY KEY COMMENT 'タイトル',
content VARCHAR(512) NOT NULL PRIMARY KEY COMMENT 'コンテンツ',
deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '削除フラグ',
created_at TIMESTAMP DEFAULT current_timestamp COMMENT '作成日',
updated_at TIMESTAMP DEFAULT current_timestamp ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日'
) COMMENT='メモ';
```
## 成果物(画面)
スタイルを全く付けていないので見た目がごmです。

- トップ画面![スクリーンショット 2023-06-03 10.14.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523157/db296dad-c8d4-f54d-47ab-3355f4de3b88.png)
- 新規作成画面![スクリーンショット 2023-06-03 10.15.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523157/a1e04307-bf64-cf4f-b1b0-f2eea6b1abdd.png)
- 詳細ページ![スクリーンショット 2023-06-03 10.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523157/d7fded64-0652-62ab-b5e7-0c86aaeb8261.png)
- 編集ページ![スクリーンショット 2023-06-03 10.16.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523157/05075fe2-0e1e-97b0-5aed-2792c808d106.png)
- ゴミ箱![スクリーンショット 2023-06-03 10.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523157/7ae8a683-8900-ed6c-c08f-756ffe021013.png)

## 機能
- 新規作成
- 詳細取得
- 編集
- 削除（論理 + 物理）

## こだわった箇所
研修で論理削除・物理削除を学んでいたことを思い出し、これでゴミ箱みたいな機能が作れるんじゃ？
と思い実装をしてみました。

- 動作イメージ
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523157/5159f25c-c997-df74-3d32-2cd687969ff9.gif)
なんかそれっぽい処理が実装できて嬉しかったです。

## 反省点
- データに「作成日」「更新日」を取り入れているので、それを活かしたソート機能などを開発できれば良かった
    - ゴミ箱機能で満足して途中で力尽きましたw

- コードの可読性やリファクタリングを疎かにしていた
    - 特に、共通処理をまとめれる気がするので今後の課題としておきます。

- スタイリング
    - BootStrapでもいいから簡単なスタイルをつければ良かった。

## これから
未経験だったので、ただでさえプログラミング組む力がないのに実務でも関係のない業務をしているので
将来を考えた時にスキルアップができない気がしています。


案件自体は、ちゃんとコーディングできるようなところもあるみたいなのでアウトプットを増やしてアピールすれば
交渉材料になるかなと思い、頑張ります。