OmniAICreator/Qiita-1.07M huggingface dataset:
【Xserver】500エラー、Internal Server Errorが起こる時の対処法


500 error, internal server error が起きた時に試すことをここに追記していきます。



##エラー詳細の確認
Xserver > サーバーパネル > アクセス解析 > エラーログ　より、エラー詳細を確認する

##全角カタカナ、全角ひらがな禁止
ディレクトリ名を全角カタカナ、全角ひらがなにしない（英語がベストですが、どうしても日本語が使い、そんな時は、漢字、半角カタカナのいずれかでなければなりません）


##SSH接続中止
SSH接続をしていないか？（SSH接続をしている間は、500エラーが起きます。触るなら夜に触りましょう、ちなみにFTPからのファイル操作では起きません。）

#パスの確認
パスがまちがっていないか？

例えば僕は、Flaskインストール時にMiniconda3をインストールしたものの、それを手動でフォルダ移動してcondaパスを変更していなかったので、condaコマンドが使えないことにより、python library が一時使用不可になってしまいました。
特に、.cgi系のファイルは、一行目の（#! からはじまる）全てパスが正しいか確認しましょう。

最後に、どうしてもうまくいかなかった場合は。

##バックアップ復元によりエラー前に強制的に戻す。
を心がけましょう、、、というかこれが一番早いかもしれません。
時間と保存データの天秤次第、ということでしょうか。

![xserver-500-internal-server-error-001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/5293de11-5138-efd4-9acc-0db74a63462c.png)

![スクリーンショット 2021-11-21 2.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/5b0da3c7-0330-7aa2-fafc-e94d6e8fa01d.png)
レイアウトやデザインを一切気にしない場合の帳票印刷を考えてみる

#概要
日本語プログラミング言語「プロデル」を用いて、レイアウトなどを一切気にしない場合に限った簡単な帳票印刷プログラムを作ります。Excelでやったほうが早いとかいう突っ込みはなしで。

#準備する物
帳票として印刷したいデータを用意します。本記事ではCSVデータを使用します。例として、下図のような出荷データを用意しました。
![p02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/22a9b306-5639-b110-4845-ee79fc56b668.jpeg)

#作り方
####１　ウィンドウに必要な部品を配置する
最低限必要な部品は「テキスト」（又はラベルでも可）×１、「ボタン」×２、「テキスト領域」×１です。お好みのサイズや配置でどうぞ。
![p01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/cd59f9e4-ac69-a393-d672-4ce5b4905725.jpeg)

:::note
必要に応じて各部品を増やしたり、「チェックボックス」や「オプション」なども追加します。
:::

####２　ファイルを選択して必要な情報を取得する
上図のボタン１を押したときに、ファイルを選択する画面が表示され、印刷したいデータを選択できるようにします。

```
ボタン1がクリックされた時の手順
	開く画面のフィルタを、「データファイル|*.csv|すべてのファイル|*.*」に変える
	開く画面を表示する
	もし開く画面のキャンセルなら、手順から抜ける
	ファイル名は、開く画面のファイル名
	テキスト1の内容を［ファイル名］に変える
	データ表を作ってデータとする
	データに｛「日付」,「宛先」,「商品」,「数量」｝という列を加える
	データへ「［ファイル名］」から読み込む
終わり
```
開く画面のフィルタを目的のファイル拡張子にしておけば、目的のデータファイルがスムーズに見つけられます。今回の場合はCSVとしています。（手順内の最初の行）
ファイルを選択したら、そのファイル名がテキストに自動的に入力されます。（手順内の5行目）
6行目で「データ表」を作り、8行目で選択したデータの中身を取得します。

####３　必要な情報を整理して印刷する
例えば、この先のリンゴの出荷予定が知りたいとしましょう。（データを見れば一目瞭然なのはさておき・・・）
ということで、リンゴの出荷予定について帳票を作ってみましょう。

```
ボタン2がクリックされた時の手順
	「リンゴの出荷予定表［改行］」をテキスト領域１へ入力する
	日付は、（データの1列目を一覧で取得したもの）
	宛先は、（データの２列目を一覧で取得したもの）
	商品名は、（データの3列目を一覧で取得したもの）
	数量は、（データの4列目を一覧で取得したもの）
	行数を１から１ずつ増やしながら「[商品名の個数]」まで繰り返す
		もし　商品名の[行数]番目の内容が「リンゴ」なら
		　　「[改行][（日付の[行数]番目の内容）]　　　[（宛先の[行数]番目の内容）]　　　[（数量の[行数]番目の内容）]」をテキスト領域１へ入力する
		もし終わり
	繰り返し終わり
	テキスト領域１を確認して印刷する
終わり
```
まず、印刷する帳票のタイトルとして「リンゴの出荷予定表」を入力します。その後、データからリンゴの出荷予定だけを抜き出し、いつ、どこへ、いくつ出荷するかをテキスト領域に入力するのを繰り返すだけという、構造はとてもシンプルなものです。
最後に、入力が完了したテキスト領域を印刷します。

![p003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/afcf1338-0124-a6cc-ca8d-63bbd389b57c.jpeg)
印刷イメージです。

:::note
最終行に合計数を表示したり、日付や宛先ごとにまとめたり、アレンジはいろいろできると思います。
:::

#活用例
![papertestmaker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/24f2ff87-11c2-1b4f-d9cb-39e16ac7d45a.png)![kkptest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307195/c924da06-a71d-db5b-7d03-1228debe4dd5.png)
筆者が開発・公開している「学習支援ソフトKeyKnowledge」では、この仕組みをペーパーテスト作成機能に活用しています。3つまでのデータからランダムに抽出した問題をテキスト領域へ流し込み、ペーパーテストを自動で作成するプログラムです。もちろん、作り方はより複雑になりますが。

#最後に
プログラムで帳票を作成しようとすると、罫線の座標指定だの、文字列の配置だのなかなか思うようにいかないことが多々あると思います。しかし、「自分さえ分かればいい」「内部の人間さえ分かればいい」ような帳票類は、今回記した方法もシンプルでよいのかもしれません。もちろんしっかりとした帳票もプロデルで作ることができます。作例がすでにプロデル開発者ゆうと氏により公開されていますので、そちらをご参考ください。https://rdr.utopiat.net/cgi/progbbs/forump.php?mode=viewcode&id=86&rtn=86
AWS Certified Advanced Networking - Specialty に合格しました

2021/11/20 に ANS に合格しました。ANS に合格のためにしてきたことを書き記しておきます。
![Desktop-screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/de018b4d-f968-e2fc-a57b-e3a3021b3e62.png)

## 対策

ANS を合格された方の合格体験記を読んでいると、Direct Connect 周りの知識が問われるみたいなので、ここらへんを重点的に勉強しました。

**Black Belt**
ANS 試験には Direct Connect についての設問が必ず出題されるので、[Direct Connect の Black Belt](https://d1.awsstatic.com/webinars/jp/pdf/services/20210209-AWS-Blackbelt-DirectConnect.pdf)をまずは読みました。

「パブリックVIF」、「プライベートVIF」、「仮想プライベートゲートウェイ」などは Direct Connect での重要なキーワードなので、Black Belt の情報をもとにノートにまとめ、後述の問題集を解きながら徐々に情報を詰めていきました。BGP とか初めて見る用語があって、しかも、意外と重要だったので、逃げずになんとか理解するようにしました。

**WEB 問題集**
Black Belt を読んだ後は、[WEB 問題集](https://aws.koiwaclub.com/exam/ans/)を解いて知識を整理・補填していきました。2021/11 現在だと問題セットは 24 つ用意されていました。問題のパターンとしては、「オンプレと AWS の VPN 接続方法」、「オンプレと AWS を専用線で接続する」がメインだと思います。


ANS を取得して AWS 10 冠になりました。残るは SysOps のみです。SysOps は試験内容が変わり、ラボが追加されたので、実際に AWS マネジメントコンソールをいじりながら試験対策をしていきたいと思います。
突然Dockerコンテナ作成してみる話 Swaggerファイルを書く

# API設計
API設計を記載する。今回はコンテナ自体の動作確認のみを対象とするため。/sample#post /sample#get を用意する。本作業のスコープは以下の通り。
![ProjectImages-Swagger作成のスコープ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/417a3045-fdbd-2030-6018-128afd455e6d.png)

## ディレクトリ構成

今後、このシリーズで利用するファイルやディレクトリ構成を以下のように定義する。


![directories.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/fb5e7f08-7049-4429-d554-2f160e2013c5.png)

workspaceは任意のディレクトリどなるが、本シリーズでは誤解を避けるため、c:\dev\workspaceとして記載する。

### apiDesign.yml の編集準備

コマンドをたたいてVS Codeを起動します。c:\dev\workspaceは適宜変更してください。

``` shell 
mkdir c:\dev\workspace　
echo "" > c:\dev\workspace\apiDesign.yml
code c:\dev\workspace　
```

こんなことを聞いてきたら、とりあえずご自分の責任で、「はい、作成者を信頼します」を選択

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/8ad72107-13be-4ce5-d4c7-86aa0e1ffefc.jpeg)

apiDesign.ymlを開きます。続いて、ファイルを右クリックしてPreviwe Swaggerを起動します。
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/a53c327e-9101-489e-9c50-5ef7a9403940.jpeg)

最終的にはこのような画面になっているはずです。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/c5a2b7bc-61f1-e67f-67dc-57723ce2ad98.jpeg)

## apiDesign.yml の変更

次の内容を記載する。

``` yaml
swagger: "2.0"
info:
  title: "Sample API"
  version: "1.0.0"
  description: "Sample API"
  termsOfService: "http://swagger.io/terms/"
  contact:
    name: "API Support"
  license:
    name: "Apache 2.0"
    url: "http://www.apache.org/licenses/LICENSE-2.0.html"
host: "localhost:8080"
basePath: "/v1"

schemes:
  - "http"
  - "https"

paths:
  /sample:
    get:
      summary: "Sample API"
      description: "Sample API"
      responses:
        "405":
          description: "Invalid input"
        "200":
          description: "Sample API"
    
    post:
      summary: "Sample API"
      description: "Sample API"
      responses:
        "405":
          description: "Invalid input"
        "200":
          description: "Sample API"

        
```

この様に、APIがSwaggerViwerでいじれるようになっていれば。成功です。少し触ってみてください。「あれもしたい、これはどうなっているんだろう？」と思う事が出てくれば、今のところ十分です。
なお。このファイルを保存する際、必ずUTF-8で保存してください。

![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/486c0632-abf2-9f50-6c2a-dda4204d991c.jpeg)

今回の作業はここまでです。お疲れさまでした。次回はこの定義を使ってSpringBootのプロジェクトを生成します。そろそろ動くプログラムが出てくるので、頑張ってついてきてください。

### 免責事項

この資料は、本作業を行うために作成したものであり、本作業によって生じた損害については一切の責任を負いません。


[＜＜前の記事　　](https://qiita.com/shupeluter/items/3ca0dfab64385d6da384) [お品書き](https://qiita.com/shupeluter/items/475b8354047c51e11173#%E3%81%8A%E5%93%81%E6%9B%B8%E3%81%8D) [　　次の記事＞＞](https://qiita.com/shupeluter/items/a763b4d811bfd201025a)
Google Driveのデータをコマンドラインで入手する

```shell 
$ pip install gdown
```

Google Drive のファイルのリンクに含まれるIDを使う。（下記リンク参照）

```shell 
$ gdown --id <put-the-ID>
```

Reference 

https://stackoverflow.com/questions/25010369/wget-curl-large-file-from-google-drive/63781195#63781195

追記
wget などを使う方法は、現在ではうまくいかない。
WPS AOSS とは

## 勉強前イメージ

wifiに接続するためのなにか？

## 調査

### WPS とは

Wi-Fi Protected Setup の略で、
WPSを使用するとユーザは予備知識なしにwifiに接続することができます。
wifiは、wifiルーターのSSIDとパスワードを機器(スマホ等)に入力しないと接続できませんが、
WPSを使用すると端末同士で直接やり取りをして簡単に接続することができます。

### AOSSについて

元々AOSSというバッファローが開発した無線LANの設定をボタンを押すだけで簡単に接続することができるシステムになります。
しかし、AOSSには互換性がなかったのでAOSSを標準化した規格を作り、
それをWPSとしました。

### WPS と AOSS の違い

- WPS : 無線LANに簡単に接続する方法(標準化されている)
- AOSS : 無線LANに簡単に接続する方法(バッファローの独自規格)

## 勉強後イメージ

WPS、今まで使ったことないかも・・・
SSIDとパスワード使ってたわ。。。
昔AOSSみたいなの見たことあったけど、独自規格だったのか
それを標準化したのがWPS。

## 参考

- [WPS](https://wa3.i-3-i.info/word13816.html)
- [Wi-Fi（無線LAN）対応機器を簡単につなげるWPSとは？](https://www2.elecom.co.jp/network/wireless-lan/column/wifi_column/00084/)
Laravel SailとVSCode Devcontainerで開発環境を構築する流れ

[Laravel Sail](https://laravel.com/docs/8.x/sail)を利用して新しいLaravelプロジェクトの開発環境を構築した際、VSCodeのDevcontainerの設定手順が分かりづらかったのでまとめておきます。

## 事前準備
Devcontainerを利用するつもりであれば既に済んでいると思いますが、[Docker Desktop](https://www.docker.com/products/docker-desktop)のインストールを済ませておく必要があります。Windowsの場合は[WSL2のインストール](https://docs.microsoft.com/ja-jp/windows/wsl/install)も併せて必要です。

## Laravelのインストール
```shell
$ curl -s "https://laravel.build/laravel-example?with=mysql,mailhog" | bash
```

https://laravel.com/docs/8.x/installation

`with`クエリストリングにはカンマ区切りで次の値を指定すると必要なサービスだけを含めることができます。[^choosing-your-sail-services]

[^choosing-your-sail-services]: [Choosing Your Sail Services - Laravel Document](https://laravel.com/docs/8.x#choosing-your-sail-services)

- `mysql` (default)
- `pgsql`
- `mariadb`
- `redis` (default)
- `memcached`
- `meilisearch` (default)
- `minio`
- `selenium` (default)
- `mailhog` (default)

何も指定しない場合は (default) のついたサービスがセットアップされます。

## Sailの起動
```shell
$ cd laravel-example
$ ./vendor/bin/sail up -d
```

https://laravel.com/docs/8.x/sail#starting-and-stopping-sail

バックグラウンド（detach）モードで起動します。10分程度かかるのでしばらく待ちます。

## Devcontainer設定ファイルの作成
```shell
$ ./vendor/bin/sail artisan sail:install --devcontainer
```

artisanの`sail:install`コマンドに`--devcontainer`オプションを付けると、Devcontainerの設定ファイル`.devcontainer/devcontainer.json`が作成されます。

https://laravel.com/docs/8.x/sail#using-devcontainers

コンテナ内でartisanコマンドを実行するには`sail artisan queue:work`のようにします。

https://laravel.com/docs/8.x/sail#executing-artisan-commands

インストールするサービスを聞かれるのでカンマ区切りで入力します。

```
 Which services would you like to install? [mysql]:
  [0] mysql
  [1] pgsql
  [2] mariadb
  [3] redis
  [4] memcached
  [5] meilisearch
  [6] minio
  [7] mailhog
  [8] selenium
 > 0,7

Sail scaffolding installed successfully.
```

## ディレクトリをDevcontainerで開く
```shell
$ code .
```

VSCodeが開いたら、表示される通知（`Folder contains a Dev Container configuration file...`）あるいは[コマンドパレット](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette)に`Open Folder in Container`を入力する等の方法でコンテナで開けば環境構築は完了です。
Docker Desktopを使わずにWSL2でVSCode Remote Containerを使う

Docker Desktopはライセンス問題があり、利用しづらくなりそうなので、Docker Desktopを使わずに開発できるようにしたいです。Windowsを使っていると、Docker DesktopはWSL2がバックエンドになっており、DockerデーモンはWSL2で稼働していますので、Docker Desktopを使わずにVSCodeから利用できるようにします。

## Docker Daemonの設定

WSL2で動かしているUbuntuへのDockerの導入は以下を参照。
https://docs.docker.com/engine/install/ubuntu/

デフォルトではdocker.sockのUNIXソケットだけをListenしているのでTCPでもListenするように設定します。設定したら`service`で再起動して反映します。本当は`tls`は有効化したほうがいいんでしょうけれど簡単にするために`false`にしておきます。

/etc/docker/daemon.json

```json
{
  "debug": false,
  "tls": false,
  "hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"]
}
```

## Docker CLIの入手

ビルドされたものがあるようなので、ありがたく使います。
https://github.com/StefanScherer/docker-cli-builder

## Docker CLIの設定

PowerShellで実行できることを確認してみます。

```powershell
# Docker DaemonがListenしている、2375ポートがつながるか確認してみます
Test-NetConnection -ComputerName localhost -Port 2375
# つながりそうならdocker contextを作ります
docker context create remote --docker 'host=tcp://localhost:2375'
docker context use remote
# ClientとServerの情報が両方出てきたらOKです
docker version
```

## devcontainer

VSCodeに与える`.devcontainer/devcontainer.json`の例は以下の通りです。

- `dockerFile`で使うイメージをビルドするための`Dockerfile`を指定します。`image`で使いたいイメージを指定してもよいようです
- `extensions`で使いたいVSCode拡張機能を指定します。
- `workspaceMount`でコンテナにマウントしたいディレクトリを指定します。絶対パスでないといけない、かつ、WSL2からアクセス可能なパスでないとエラーが起きてしまいました。Docker Desktopならこうはならないようで、気持ち悪いですが諦めます。

```json
{
    "name": "my_python_container",
    "dockerFile": "Dockerfile",
    "settings": {
        "python.pythonPath": "/usr/bin/python3"
    },
    "extensions": [
        "ms-python.python"
    ],
    "workspaceMount": "source=/mnt/c/mydir/workspace,target=/workspace,type=bind,consistency=delegated",
    "workspaceFolder": "/workspace"
}
```

https://code.visualstudio.com/docs/remote/devcontainerjson-reference
未経験インフラエンジニア　転職後リアルな１ヶ月備忘録


#インフラエンジニア　転職後のリアルな１ヶ月備忘録

## 概要

本記事は、以下の方をターゲットにしています。
少しでも、私の実体験が参考になればと思い、投稿しました。

・IT分野に興味がある方。その中でも、インフラエンジニアという職業に興味を持ち、転職を考えている方。
・IT未経験からインフラエンジニアへ転職後のリアルを知りたい方。

今回、執筆するのが２回目になります。
前回の記事では、完全未経験からDMMWEBCAMPで学習して転職した実体験を執筆しました。
もしお時間に余裕があれば、そちらも参考にして頂くと非常に嬉しいです！
以下のリンクから閲覧可能です！
https://qiita.com/InTra/items/b8622c2c762cfa2bd658

## 業務内容

インフラエンジニアは、オンプレ（物理サーバーを管理している環境）やクラウド（サーバーをインターネット上の仮想環境で管理）もしくは両方を扱うことになります。
私は、クラウドをメインで扱っています。
（そのため、クラウドエンジニアといった方が個人的にはしっくりきています笑）
自社開発企業のクラウドエンジニアの業務一例として読んで頂けたらとおもいます。

仮想サーバーをTera Term・CentOS7系で管理している環境です。
メインのベンダーは国内・AWSを使用しています。

10月から就業開始して、どのようにこれまで過ごしてきたのかを時系列で以下まとめました。

###10月上旬
●Linux学習
最所の1Wは、参考書をひたすら学習＋テストとして自分の仮想サーバーにコマンドをひたすら打ってサーバー操作をしました笑
●ZABBIX監視・理解
ZABBIXとは、サーバーを監視するツールです。担当コンテンツを頂き、毎日異常がないかチェックします。
監視するサーバーはAPIやDBなどたくさんあります。各サーバーのCPU（処理能力）・Disk（容量）・Network traffic（ネットワークの混雑度みたいな？）など他にもたくさん監視項目があります。
●社内のサーバー構成・用語理解
これは今でも苦戦中です！週３回ぐらいミーティングがあるのですが、当初は内容を10%ぐらいしか理解出来ませんでした笑
●SQL更新作業（研修）
MySQL（DBのこと）のテーブルをSQL文使用して作業する手順書を作成しました。
●DBバックアップを日時指定して引っ張る作業（研修）
AWSのS3（DBのようなデータを保管している場所）にあるバックアップをサーバーのあるディレクトリ配下に持ってくる作業の計画書作成してローカル環境に実行しました。
※研修のものは、近々担当する可能性が高いため自分のトレーナーとマンツーマンで取り組みました。

###10月中旬
●本番やローカルでのSQL更新作業
研修の内容を本番で実行しました。本番環境での作業を失敗した場合、障害報告書の作成が求められます笑
●サーバー増設対応
cron（プログラムを定期起動する）を使用して、サーバーにあるスクリプトを修正しました。常に動いているサーバー台数を増やしたり、指定した時間のサーバー台数が増えるように修正したりしました。
●リモート操作による物理サーバー立ち上げ
自分の会社PCから物理サーバーに電源を入れてリモートでログインして立ち上げ作業を行いました。

###10月下旬
●問い合わせ転送先の変更
よくゲームでお問い合わせするページがあると思います。そのお問い合わせ転送先を変更しました。
●AWS更新・削除対応
AWSに登録しているドメイン(URLのこと）を更新するか削除するかを、実際に使われているかサーバーで確認する作業をしました。
●発表会準備
各部門のトップの前で自分の業務を発表する準備をしました。こうした取り組みはIT企業でよくあるのでしょうか？すでに発表を終えましたが、とても緊張しました笑
来月もあるので頑張ります！

##その他　待遇・人間関係・労働環境
給与面は、未経験からの条件としては申し分なかったです。

周りは新卒で自分と年齢が同じかそれより若い方が大半です。
指導頂いているのも自分より若い方ですが、この業界は年功序列でなく経験年数だと考えています。
年上で未経験な自分に対して、嫌な顔せず丁寧に指導頂けているので日々感謝しています。

労働環境については、残業など今後は増えそうですが、十分許容範囲だと思います。
無理な働き方を求められることはないと思います。

##就業前に学習すべきだったこと
LinuxやSQLはもっと学習すべきでした。。。
また、基本情報技術者試験などのIT基礎用語は聞かれたら一言ですぐアウトプット出来るぐらい理解出来たらと思いました。（インプットしていても、アウトプットが出来ていませんでした）

ですが、実際に現場で働くことで、就業前には分からなかった最優先して取得すべき知識などわかるようになってきました。日々の業務で手一杯な日々でしたが、ようやく慣れてきたので自己学習も進めたいです。目先の目標は、基本情報技術者試験の合格を目指します。

## 最後に

いかがでしたでしょうか？

まだまだ業務の練度が不足しているところがあり、説明が不足している部分が多々あると思います。
コメント等でご指摘頂けますと幸いです。

もっとこうした内容が知りたいなどあれば、ぜひご連絡ください。

ツイッターアカウント
https://twitter.com/@TA019_DWC
OpenCVでWebカメラ画像からリアルタイム顔検出


この記事は以前書いた[Google Colaboratory+OpenCVでWebカメラ画像から顔検出](https://qiita.com/uranishi/items/85184baf1df33192e00a)のバリエーションです．
PCに接続されたカメラから__リアルタイムで__顔検出するプログラムについて説明しています．

## 学習済みモデルの入手

Google Colabの場合は```wget```を用いて入手しました．今回も何らかの方法で入手し，任意のフォルダ (典型的にはワーキングフォルダ) に置くことになります．Webブラウザなどから入手することも可能ですが，今回は__かっこいいので__ターミナルからコマンドを叩いて入手します．Macの場合は```curl```を使いますので，下記のようになります．

```
$ curl -O https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt
$ curl -O https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20170830/res10_300x300_ssd_iter_140000.caffemodel
```

Linuxの場合は```wget```を使います．

## プログラム
[Google Colaboratory+OpenCVでWebカメラ画像から顔検出](https://qiita.com/uranishi/items/85184baf1df33192e00a)とほぼ同内容ですので，説明は省きます．


```python:facedetect_camera.py
# インポート (適宜pipでインストールする)
import imutils
import numpy as np
import cv2

# VideoCaptureをオープン
cap = cv2.VideoCapture(0)

# モデルを読み込む
prototxt = 'deploy.prototxt'
model = 'res10_300x300_ssd_iter_140000.caffemodel'
net = cv2.dnn.readNetFromCaffe(prototxt, model)

# カメラ画像を読み込み，顔検出して表示するループ
while True:
    ret, frame = cap.read()

    # カメラ画像を幅400pxにリサイズ
    img = imutils.resize(frame, width=400)
    (h, w) = img.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0))

    # 物体検出器にblobを適用する
    net.setInput(blob)
    detections = net.forward()

    for i in range(0, detections.shape[2]):
        # ネットワークが出力したconfidenceの値を抽出する
        confidence = detections[0, 0, i, 2]
        # confidenceの値が0.5以上の領域のみを検出結果として描画する
        if confidence > 0.5:
            # 対象領域のバウンディングボックスの座標を計算する
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            # バウンディングボックスとconfidenceの値を描画する
            text = "{:.2f}%".format(confidence * 100)
            y = startY - 10 if startY - 10 > 10 else startY + 10
            cv2.rectangle(img, (startX, startY), (endX, endY), (0, 0, 255), 2)
            cv2.putText(img, text, (startX, y),
                cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)

    cv2.imshow("Face Detection", img)
    k = cv2.waitKey(1)&0xff
    if k == ord('s'):
        cv2.imwrite("./output.jpg", img) # ファイル保存
    elif k == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```

## 実行結果

Macが早いのか何が早いのか分からないが，すごいフレームレートで動く．サラマンダーより、ずっとはやい！！

![facedetection_out](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1942789/16e7f391-a570-2161-a9b3-c2e74dcd4b63.gif)
Advent Calendar 2021 に参加表明したのでQiita を書く練習をする。 1日目

はじめまして！
The Greatest GIVER&COACH な爆速1stPENGUIN になりたい、@communication-engineer-ikz です！

これまでROM 専だったQiita で発信したいしたいと思いつつなかなか踏ん切りがつかなかったので、今年のAdvent Calendar に勇気を出して参加表明しました。
https://qiita.com/advent-calendar/2021

これまで全く記事を書いたことがないですが、爆速1stPENGUIN を目指す身として、早速投稿してみました。

とりあえずここまでで下書き保存してみる。

# 見出しの練習
無事、下書き保存できていたので再開。

## 見出し2つ目
### 見出し3つ目
#### 見出し4つ目
##### 見出し5つ目
###### 見出し6つ目
####### 見出し7つ目 はない。
TOC は自動で作成されるのだろうか?

# __**書式の練習**__
無印

## **太字**
```
**太字1**
__太字2__
```

## *斜体*
```
*斜体1*
_斜体2_
```

## ~~打ち消し線~~
```
~~打ち消し線~~
```

##URL リンク

[URL リンク](#文字の練習)
[参考にしたページ 「Markdown記法/書き方（見出し・表・リンク・画像・文字色など）」](https://notepm.jp/help/how-to-markdown)

## 引用
参考にしたページ
> Markdown記法/書き方（見出し・表・リンク・画像・文字色など）
> https://notepm.jp/help/how-to-markdown

コードブロック

```
hogehoge
fugafuga
```

インラインコード `fugafuga`

コードブロックの上に改行を入れないとインラインコードとして解釈される。
```
こんな感じ
```
基本は、改行を入れなくてもよしなに解釈してくれるが、コードブロックだけはそうではないらしい。

## テキストカラー
<span style="color: red; ">赤文字</span> は使えない。

## チェックリスト
- [x] チェックリストも使える。
- [ ] `<CR>` すると、文頭の補完も行われる。

## 箇条書きリスト
- 箇条書きリストも文頭の補完がされる。
    - Tab でインデントも行われる。
    - ありがたい。
        - さらにインデントすると
            - まだまだできて
                - さらに
                    - インデント
                        - できる
                            - 限界はなさそう?
    - Shift + Tab でインデントを浅くすることもできる。
    * アスタリスクでもOK。
        * もちろん補完もされる。

`<CR>` 2回で通常の入力に戻る。

## 番号付きリスト
1. 番号付きリストも使える。
1. VSCode とかだと、改行すると数字が増えていくが、`1.` のままで改行されるのは地味に嬉しい。
    1. インデントもできる。
        1. インデントを深くしてもインデックスは同じなのね。

## 画像の挿入

でかい...!
![iOS の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505647/1d46bb41-db8f-0363-d227-d8ad6a32b0a9.jpeg)

小さくするには お決まりの`<img src="***画像のURL***" width="***サイズ***">` を使う。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505647/1d46bb41-db8f-0363-d227-d8ad6a32b0a9.jpeg" width="50%">

### 参考ページ

https://qiita.com/shti_f/items/b819d7fd8cb79ae29687

```
画像をリサイズしたい時は
![***代替テキスト***](***画像のURL***)
ではなく
<img src="***画像のURL***" width="***サイズ***">
を用いる
```

## 水平線
`---`

↓

---

`***`

↓

***

`----`

↓

----

`****`

↓

****

いろいろな形式が使える。
でも、多分`---`しか使わない。

## テーブル
そろそろ打ち込むのも面倒くさくなってきたのでコピペする。

|  TH  |  TH  |
| ---- | ---- |
|  TD  |  TD  |
|  TD  |  TD  |

## PlantUML 記法

```uml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response

Alice -> Bob: Another authentication Request
Alice <-- Bob: another authentication Response
```

は流石に使えないみたい。

## 数式
... は使う予定ないからいいかな。
使いたくなったら練習しよう。

## 絵文字
:point_up:
:thumbsup: 
補完されるのが嬉しい。 :smile: 

# 今日はここまで。
## 次回は...
変更差分を記録しておきたい性分なので、本文をバージョン管理したい。
Qiita API を利用すれば、ファイルの内容を投稿できるようなので、GitHub + Qiita API で投稿文章をバージョン管理することに挑戦する。

https://qiita.com/kai_kou/items/663d3f7bbc4da4ccf62d

https://qiita.com/iimuz/items/4837e9c8043ce7c1262b

https://qiita.com/tomowarkar/items/11488231c6d22d960323

ここまでお付き合いありがとうございました :smiley: 

<details><summary> 次回もまた見てくださいね~ じゃんけん</summary><div>

ぽん! :fist_tone1:
</div></details>
【Swift】仕様変更が怖くなくなるif文の書き方 〜 enumを使ってSwiftらしく書く 〜

今回は、enum型を使ってSwiftらしいif文の書き方を記事にしてみました。

## この記事で学べること
- いつものif文をenumを利用してSwiftらしくスマートに書く方法
- 仕様変更に強いif文の書き方

## サンプルコード
### 仕様
今回はサンプルとして、APIなどの外部リソースから都道府県の文字列を取得したと仮定します。
その上で、都道府県が`"Tokyo"`or`"Osaka"`の場合とそれ以外の都道府県で処理を分岐したいという仕様にします。

### enumを一切使わないif文の場合
```swift
if city == "Tokyo" || city == "Osaka" {
    print("特定の都市が入力されました")
} else {
    print("特定の都市以外が入力されました")
}
```

この書き方でも処理的な問題はないが、この書き方で書かれているコードがプロジェクトに複数箇所あると、
`「都道府県名を大文字に変更してください」`
という仕様変更が発生した場合、該当箇所を全部修正する必要があります。
その過程でプログラマーが文字列のタイプミスをした場合、ヒューマンエラーによるバグが発生します。

### enumを使ってリファクタリング①
そこでenumを用いることで、上記のような手間を解消でき、ヒューマンエラーを防ぐことができます。
このようにif文をenumを利用して制御する方法はよく見られるやり方です。
僕も色々なところでこのように制御する方法を見てきましたし、自分も使います。

都道府県名を大文字にする仕様変更が発生しても、enumだけ修正すれば、if文自体の修正は不要です。

```swift
enum SelectedCity: String {
    case tokyo = "TOKYO"
    case osaka = "OSAKA"
}

if city == SelectedCity.tokyo.rawValue || city == SelectedCity.osaka.rawValue {
    print("特定の都市が入力されました")
} else {
    print("特定の都市以外が入力されました")
}
```

しかし、またまた仕様変更が発生し
`「北海道の場合も東京と大阪のように特別な処理を行ってください」`
となった場合、以下のように修正しなくてはいけません。

```swift
enum SelectedCity: String {
    case tokyo = "TOKYO"
    case osaka = "OSAKA"
    case hokkaido = "HOKKAIDO"
}

if city == SelectedCity.tokyo.rawValue || city == SelectedCity.osaka.rawValue || city == SelectedCity.hokkaido.rawValue {
    print("特定の都市が入力されました")
} else {
    print("特定以外の都市が入力されました")
}
```

となると、1回目のサンプルコードの問題同様、if文を直接修正する必要があります。
さらに、if文の条件が冗長になりがちなので、ちょっと可読性が下がってしまうかなぁと思います。

### enumを使ってリファクタリング②
そこで、`if let`と`enum`を組み合わせて使うことで、可読性と拡張性の両方を兼ね備えたコードを実現できます。

```swift
enum SelectedCity: String {
    case tokyo = "TOKYO"
    case osaka = "OSAKA"
    case hokkaido = "HOKKAIDO"
}

if let _ = SelectedCity(rawValue: city) {
    print("特定の都市が入力されました")
} else {
    print("特定以外の都市が入力されました")
}
```

`enum`を`init`する時の

- `SelectedCity`の`rawValue`に定義されている文字列であればインスタンスが返される
- `SelectedCity`の`rawValue`に該当しない文字列であれば`nil`が返される

という性質を利用して、該当文字列以外だったら`else`の処理が実行されるというコードを書くことができました。

if文を最初からこのようにコーディングしておけば、あとから`愛知`、`京都`も追加してくださいと言われても、`enum`に定義を追加するだけで済みます。
そうすればヒューマンエラーも仕様変更にかかるコストも最小限に抑えられると思います。

## おわりに
記事を読んでいただきありがとうございました。

実際にプロジェクトやっているときに、こうやったらいい感じじゃないかなということで思いついたものですので、
「こういう方法もありますよ！」というやり方があればコメントいただけると、嬉しいです。

いままで書いたif文でこれ使える所があれば、全部リファクタリングしたい気分です。。。
Swift学習おすすめ書籍

# 現役エンジニアおすすめのSwiftの書籍
前回、初めての投稿が下手くそな書き方だったようなので、記事を見た方がご指摘をしてきたので、以後気をつけます!!!

まだ、Swiftの基礎学習を始めたばかりで、分からないことばかりなので、現役iOSエンジニアの方より、昔この書籍に助けられたとのことで、毎朝読むようにしています。

**Swift5にも対応しているらしい!**

https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Swift&qid=1637416374&sr=8-1

SwiftはFlutterやAndroidのように破壊的な変更がなく、新しいバージョンのSwift5は安定しているとのこと?
初心者におすすめの言語な理由はこれかも...
カメラの下絵を読み込んでレンダリング解像度を設定するアドオン

Blender 2.8以降には　カメラビューで画像を下絵として表示する機能があります
下絵にカメラの構図を合わせてレンダリングするといった場合
下絵とレンダリングの解像度を合わせるという操作が必要になることがあるので
画像の読み込みからレンダリング解像度の設定まで行うアドオンを作ってみました。

```py:y_LoadBGimage_28.py
bl_info = {
    "name": "load BackGround Image28",
    "author": "Yukimi",
    "version": (1, 0),
    "blender": (2, 80, 0),
    "location": "View3D ",
    "description": "下絵画像の読み込みとそれに合わせたレンダリング解像度の設定 ",   
    "warning": "",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Interface"
}

import bpy
import os
from bpy_extras.io_utils import (
        ImportHelper,
        )

class IMAGE_OT_SetBackground(bpy.types.Operator):
    bl_idname = "import.backgroundimages"
    bl_label = "import background image"
    # ファイルオープンで選択されたファイル
    filepath: bpy.props.StringProperty(subtype='FILE_PATH')
    def execute(self, context):
        img = load_bg_img(context, self.filepath)
        #画像を下絵に設定
        set_camera_bg(context, img)
        return {'FINISHED'}  
    def invoke(self, context, event):
        context.window_manager.fileselect_add(self)
        return {'RUNNING_MODAL'}

def set_camera_bg(context, img):
    '''画像オブジェクトをシーンのカメラの下絵に設定'''
    camera = context.scene.camera
    camera.data.show_background_images = True
    bg = camera.data.background_images.new()
    bg.image = img
    # 前面表示
    bg.display_depth = 'FRONT'
    bg.frame_method = 'FIT'
    return

def load_bg_img(context, filepath):
    #イメージの読み込み
    img = bpy.data.images.load(filepath)
    #レンダリング解像度の設定
    context.scene.render.resolution_x = img.size[0]
    context.scene.render.resolution_y = img.size[1]
    return (img)

# メニューを構築する関数
def menu_func(self, context):
    self.layout.operator(IMAGE_OT_SetBackground.bl_idname, text="下絵を読み込んでレンダリングサイズ設定")
    
classes = (
    IMAGE_OT_SetBackground,
    )
def register():
    #classes
    for cls in classes:
        bpy.utils.register_class(cls)
    #menu
    bpy.types.TOPBAR_MT_file_import.append(menu_func)

def unregister():
    #menu
    bpy.types.TOPBAR_MT_file_import.remove(menu_func)
    #classes
    for cls in classes:
        bpy.utils.unregister_class(cls)

if __name__ == "__main__":
    register()
```
スクリプトを保存して プレファレンスのアドオン項目のインストールボタンで表示されるファイル選択から保存したファイルを選択し
　load BackGround Image28　を有効にしてください

ファイルのインポートメニューに「下絵を読み込んでレンダリングサイズ設定」の項目が追加されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/af130d43-cc9e-3d22-c627-ece99de70d97.png)
この項目を実行して　画像ファイルを選択すると
読み込んだ画像のサイズにレンダリングサイズを指定して
現在シーンでレンダリングに使用しているカメラの下絵に画像を設定します。
coroutine 簡単なまとめと参考ページ

いいリソースがたくさんあります。
リソースを読むための簡単なまとめと、参考になったリソースをメモしておきます。

## 概要
コルーチンは軽量なスレッドのようなもの、とよく説明されていますが、個人的には、スレッドのラッパーというのがしっくりきます。
コルーチンを通してスレッドを操作することで、タスク管理を効率化できます。

kotlinコルーチンなどというように、コルーチンはkotlinの言語自体の機能です。

今までJavaを使ってきた我々からすると、時間がかかる処理をする時に、別スレッドに切り出すことはポピュラーな手法かと思います。
なぜなら、そうしないと、時間がかかるタスクがスレッドをブロッキングして、その後ろのタスクが長い間実行されないからです。
またこのスレッド切り出しの結果、コードが各スレッドに散在し、また処理自体も非同期的になるため、処理が追いにくくなる問題がありました。

kotlinのコルーチンは、Javaで我々が手動で行なっていたスレッド上でのタスク管理を、ほとんど代わりにやってくれます。
あるスレッド上で、長いタスク中の空き時間があれば(例えばデータベースからのレスポンスを待っている間など)、そのタスクが終わっていなくても、他の実行可能なタスクを自動で割り当てます。そうやって、スレッドが実際暇になっている時間を最小にします。
デフォルトで3,4種類のスレッドが内部的に用意されていて、ほぼその中で完結するので、新しいスレッドを作る必要がほぼなくなります。(必要ならコルーチン上で新スレッドの作成もできます。)
また、異なるスレッド上の処理でも同期的に１箇所にコードがかけます。

## リソース

coroutine自体/androidでの使用

https://developer.android.com/kotlin/coroutines/additional-resources?hl=ja

https://kotlinlang.org/docs/coroutines-guide.html

並列処理

https://kotlinlang.org/docs/shared-mutable-state-and-concurrency.html#mutual-exclusion
【API開発】git addしたら「error: 'backend/' does not have a commit checked out fatal: adding files failed」となった

# 問題
バックエンドとフロントエンドを分けた開発で、git管理したく、
`git add .`をしたところ、
`error: 'backend/' does not have a commit checked out fatal: adding files failed`となった。

# ディレクトリ構成

「backend」と「frontend」のディレクトリ構造にした。

```
Document
├── backend
├── frontend
├── README.md
```
# 原因
`.git`ファイルが存在しているせいでコミットできなかった。

```
backend % ls -la
total 56
drwxr-xr-x  21 horitomoyuki  staff   672 11 20 18:04 .
drwxr-xr-x   6 horitomoyuki  staff   192 11 20 18:08 ..
drwxr-xr-x   8 horitomoyuki  staff   256 11 20 19:58 .git
-rw-r--r--   1 horitomoyuki  staff   659 11 20 16:23 .gitignore
-rw-r--r--   1 horitomoyuki  staff     6 11 20 18:04 .ruby-version
-rw-r--r--   1 horitomoyuki  staff  1424 11 20 16:23 Gemfile
-rw-r--r--   1 horitomoyuki  staff  4074 11 20 16:24 Gemfile.lock
-rw-r--r--   1 horitomoyuki  staff   374 11 20 16:23 README.md
```

# 解決策
とりあえず、READMEをコミット

```
echo "# vue-calendar" >> README.md
git init
git add README.md
git commit -m "first commit"
git push -u origin main
```

続いて、backendとfrontend両方のディレクトリに移動して`.git`を消去

```
rm -rf .git
```

その後、両ディレクトリでcommit,pushをしたら無事にコミット完了。


# 参考

https://zjschulz.medium.com/error-does-not-have-a-commit-checked-out-573c0ed9c49
M1 MacbookAirのAnacondaメモ

# 2021/11/20
- Anacondaインストール；<br>
普通にインストールできた
- Pycaretのインストール；    
Qt Consoleから、<br>
conda install -c conda-forge pycaret    
でインストール。
Pycaretはインストールできたものの、うまく動かず・・・。

バージョン違いが原因のよう。
ドキュメントによると、PycaretはPython3.6。
そこで、Python3.6で環境を作ったら、うまくいった。
【Nuxt.js・Firebase】Hostingで静的サイトをデプロイする方法

#はじめに
こんにちは。
こちらの記事では、FirebaseHostingで静的サイトのデプロイを行う方法を記しています。
誤っている点がございましたらコメントいただけると幸いです。

#前提
以下の条件を行なっていない方は[こちらの記事](https://nuxt.alizlab.com/%e3%80%90nuxt-js%e3%80%91firebase%e5%9f%ba%e7%a4%8e%e7%b7%a8%ef%bc%9afirebase-hosting-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%97%e3%82%88%e3%81%86%ef%bc%81/)を参考に進めてみてください。

* Nuxt.jsのプロジェクト作成済み
* FirebaseCLIのインストール済み
* Firebaseのログイン、初期化済み

#実装手順

###1. 静的サイトの生成
まずは`nuxt.congig.js`に下記のように追記して、`generate `コマンドを実行してファイルを生成します。

```javascript:nuxt.congig.js
target: 'static'
```

```
npm run generate
```
これで、nuxtプロジェクト直下の`dist`ディレクトリに、静的にエクスポートされる。

###2. firebase.jsonの確認
デプロイする際に、Nuxtは`dist`ディレクトリにサイトが生成されるので、`firebase.json`のpublicがdistになっているか確認する。

```javascript:firebase.js
{
  "hosting": {
    "public": "dist"
  }
}
```

###3. デプロイコマンドの実行
下記のコマンドをターミナルで実行して、`Deploy complete!`と表示が出ればデプロイの完了です。
【Firebaseコンソール＞Hosting】からURLを確認してみましょう！

```
firebase deploy --only hosting
```


#参考記事
* [【Nuxt.js】firebase基礎編：Firebase Hosting にデプロイしよう！](https://nuxt.alizlab.com/%e3%80%90nuxt-js%e3%80%91firebase%e5%9f%ba%e7%a4%8e%e7%b7%a8%ef%bc%9afirebase-hosting-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%97%e3%82%88%e3%81%86%ef%bc%81/)
* [コマンドと開発](https://nuxt.alizlab.com/%e3%80%90nuxt-js%e3%80%91firebase%e5%9f%ba%e7%a4%8e%e7%b7%a8%ef%bc%9afirebase-hosting-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%97%e3%82%88%e3%81%86%ef%bc%81/)



<br>


#おわりに
ここまで静的サイトのデプロイを行う方法についてまとめました。
コマンドを実行する前に、手順を踏んでいかないとうまく画面が反映されなくなるので、こちらの記事やNuxt公式を見ながら進めていただければと思います！

以上、最後まで読んでいただきありがとうございました！
よければLGTMを押してくれると嬉しいです！
vscodeを見やすくする（Theme, TreeView...）

# ゴール
VScodeをMacbookPro13インチで快適に使えるようにする。


# テーマを入れる
個人的には、Dracula が見やすくて好き。
https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/52b10524-4c74-400d-85a9-83c402c04f31.png)

# tree viewを見やすくする
VScodeのマテリアルUIはいい感じなのだが、TreeViewが見にくい。
![スクリーンショット 2021-11-20 午後9.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/6e04cc66-494c-9b7f-0ad7-22a56a474bcd.png)

# ミニマップを非表示にする
Macbook13インチを使ってるので、横幅は大きく使いたい。

設定 -> `map`で検索 -> `Minimap`をオフにする。
![スクリーンショット 2021-11-20 午後9.51.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/77e7c973-cd6d-b85d-1a63-fdc14a84b42f.png)

# bracketPairsをオンにする
![backetguide.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/85bc9155-d4f1-375a-9ebf-6032107c537b.gif)

設定 -> `bracketPairs`で検索 -> `true`にする
![スクリーンショット 2021-11-20 午後9.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/ab31e3cc-ae99-7e67-351b-da0494c7673a.png)

# コーディングに集中したい際は、Zenモードを使う
`cmd` `k` + `z`
最大表示になり、treeviewなどが非表示になる。
VSCodeにスニペットを登録する

# 登録方法
File -> Preferences -> User Snippets を選択する
適用する言語を選択する。すべての言語に適用したい場合は " New Global Snippets file" を選択する。

# 記載方法
JSONフォーマットで記述する
Cのスタイルのコメントが利用可能
登録するスニペットの数に制限はない

## 記述形式
<pre>
{
	< snippet name >:{
		"prefix":< trigger words >,
		"body":< contents >,
		"description":<description>
	}
}
</pre>

< snippet name >：スニペット名
< trigger words >：スニペットを呼び出すためのトリガとなる文字列。複数指定する場合はリストで記載。
< contents >：スニペットの中身。ここに記載したものがコードとして貼り付けられる。
< description >：スニペットの説明。保管候補とともに表示される。

# 記述例
<pre>
{
	// copyright
	"copyright":{
		"prefix":"copyright",
		"body":"// Copyright (C) $CURRENT_YEAR xxx inc. - All rights reserved",
		"description":"コピーライト"
	},
	// include guard
	"IncludeGuard":{
		"prefix":"IncludeGuard",
		"body":[
			"#ifndef ${TM_FILENAME/([\\.]*)(\\w+)/${1:+_}${2:/upcase}/g}",
			"#define ${TM_FILENAME/([\\.]*)(\\w+)/${1:+_}${2:/upcase}/g}",
			"$1",
			"#endif\n"
		],
		"description":"インクルードガード"
	}
}
</pre>

# bodyの記述で使える記法
bodyの記述で使用できる記述について解説します。

## Tabstops
`$1`, `$2`のように `$+数字` の形式の記述をすると、スニペットの内容を張り付けた後のカーソルの位置を指定することができます。例えば上記のinclude guardの記述例では、#defineの行と#endifの行の間の行にカーソルが移動します。
複数のTabstopsを記述した場合、最初に一番小さな数字を指定した位置にカーソルが移動し、Tabキーを押すごとに数字の小さい順にカーソルが移動します。また、"$0" は例外で最後にカーソルが移動する位置となります。

## Placeholders
`${1:aaa}`のように記述すると、Tabstopに値を指定することができます。
例えば下記のように指定することで、スニペットを張り付けた後に、容易にarg1, arg2, arg3の値を変更することができるようになります。
<pre>
"func(${1:arg1},${2:arg2},${3:arg3});"
</pre>
Placeholderは`${1:another ${2:placeholder}}`のようにネストして記述することもできます。

## Choice
`${1|a,b,c|}` のように記述すると、Placeholderの値を選択肢から選べるようになります。

## Variables
`$`に続けて以下の文字列を指定すると、変数の値を張り付けることができます。
変数値が設定されていない場合は、デフォルト値が空白が入力されます。

|変数名|説明|
|----|----|
|TM_SELECTED_TEXT|選択中の文字列|
|TM_CURRENT_LINE|現在カーソルのある行の内容|
|TM_CURRENT_WORD|現在カーソルのある単語の内容|
|TM_LINE_INDEX|現在カーソルのある行の行番号(0オリジン)|
|TM_LINE_NUMBER|現在カーソルのある行の行番号(1オリジン)|
|TM_FILENAME|編集中のファイル名|
|TM_FILENAME_BASE|編集中のファイル名から拡張子を除いた文字列|
|TM_DIRECTORY|編集中のファイルが存在するディレクトリの名前|
|TM_FILEPATH|ファイルのフルパス名|
|CLIPBOARD|クリップボードの中身|
|WORKSPACE_NAME|現在開いているワークスペースかフォルダの名前|
|WORKSPACE_FOLDER|現在開いているワークスペースかフォルダのパス|
|CURRENT_YEAR|現在時刻の年|
|CURRENT_YEAR_SHORT|現在時刻の年(下２桁)|
|CURRENT_MONTH|現在時刻の月(2桁表示)|
|CURRENT_MONTH_NAME|現在時刻の月(英語表記)|
|CURRENT_MONTH_NAME_SHORT|現在時刻の月(英語短縮表記)|
|CURRENT_DATE|現在時刻の日(2桁表示)|
|CURRENT_DAY_NAME|現在時刻の曜日(英語表記)|
|CURRENT_DAY_NAME_SHORT|現在時刻の曜日(英語短縮表記)|
|CURRENT_HOUR|現在時刻の時(24時間表記)|
|CURRENT_MINUTE|現在時刻の分|
|CURRENT_SECOND|現在時刻の秒|
|CURRENT_SECONDS_UNIX|Epoch Unix Time Stamp|
|BLOCK_COMMENT_START|コメントの開始。言語仕様に従って入力される。|
|BLOCK_COMMENT_END|コメントの最後。言語仕様に従って入力される。|
|LINE_COMMENT|インラインコメント。言語仕様に従って入力される。|

## Variable transforms
変数の値に対して、正規表現を用いて文字列置換を行うことができます。
例えば以下のように記述すると、ファイル名から拡張子を除いた文字列が入力されます。

<pre>
${TM_FILENAME/(.*)\\..+$/$1/}
</pre>

また、上述の記述例のIncludeGuardのbodyでは以下の記述で "." から "_" への変換と小文字を大文字に変換を行っています。複数の処理内容は分けて書きたいのですが、BNFを見た感じ、そのような記述はできないようです。

<pre>
${TM_FILENAME/([\\.]*)(\\w+)/${1:+_}${2:/upcase}/g}
</pre>

## Placeholder transform
Placeholderの文字列に対しても上記の文字列置換を行うことができます。

# 参考
https://code.visualstudio.com/docs/editor/userdefinedsnippets
shadow IT とは

## 勉強前イメージ

ITの影？
マイナスな感じかな？

## 調査

### shadow IT とは

情報システムの部門が認識しておらず、部門や社員が独自に導入したIT機器やサービスなどのことをshadow ITと呼びます。
こうしたIT機器やサービスは適切に管理されていないことが多く、脆弱性が発見されたとしても対策されないことが多いです。
このことからshadow ITはセキュリティ上のリスクとなっています。

### BYOD

shadow ITと似たような言葉で、BYODというのがあります。
Bring Your Own Device の略で、自分のデバイスを持ち込むという意味になります。
仕事をする上で、会社のPCを使うのではなく個人のPCを使用することで作業効率を高めることができます。
企業の予算を削減する意味でも広がりました。
BYODは企業が主導で行うことが多く個人のPCの利用を許可しますが、把握しているデバイスでないため管理が難しくプライバシーが侵害される可能性があります。

### shadow ITの例

どういうことがshadow ITになるのかの例として以下になります。

- 仕事のファイルを自分のPCで確認をする

保存した端末自体の紛失や、セキュリティ対応不足によって
マルウェアの感染→情報漏洩が起こってしまう可能性があります。

- SNSやチャットツールの使用

企業で認めていないのにも関わらず業務で利用されることがあります。
特にSNSに関しては誰でも閲覧できる状態になることが多く、情報漏えいのリスクが大きいです。

- クラウドサービスの利用

ファイル送信サービスやクラウドストレージサービスなど無料で使いやすいサービスが数多くあります。
こちらに関してもshadow ITになっていることも多いです。

## 勉強後イメージ

初めて聞いた言葉だけど中身は知ってた

## 参考

- [シャドーITとは？事例やリスク、その対策を解説](https://moconavi.jp/blog/2021/03/5640/)
- [シャドーIT 【shadow IT】 シャドウIT](https://e-words.jp/w/%E3%82%B7%E3%83%A3%E3%83%89%E3%83%BCIT.html)
電車でGO!新幹線専用コントローラーをパソコンにつなぐ（通信フォーマット編）

20年前（2001年）に発売された「電車でGO!新幹線専用コントローラー」を発掘したので、せっかくだからパソコンとつなげて遊ぼうと思います。
生産終了してからかなりたつので現物を持っていて、なおかつパソコンとつなげて遊ぼうとする人はほぼいないと思われますが、備忘録を兼ねて。
# 電車でGO!新幹線専用コントローラーとは
これです。
![FEKKeBSagAU7qfw.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271250/cc07f6aa-b1de-3023-fcf5-27d95ebfeed8.jpeg)
家庭用ゲーム機のコントローラーとしてはかなり気合の入った作りになっていまして、
「光る速度計に戸じめ灯!!警笛ペダルや振動も!!究極のコントローラ登場!!」
との謳い文句に恥じない出来となっています。
こういうのは時が過ぎても色あせない良さがありますよね。
今となっては若干のプレミア価格がついていたりいなかったりするとか。
こんな良いものを眠らせたままだなんてとんでもない。
# ドライバ
[先日書いた記事](https://qiita.com/admiralhetare/items/28d4a81994dcae8d2e62)のとおり、汎用USBドライバであるWinusbを使います。
# 通信フォーマット
### パソコン→コントローラ
データ配列はこんな感じでした[1]。
![データ形式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271250/933d747b-3e49-a62f-3816-bba2e4967e44.png)
私がマイコンと通信させるときも似たような感じになりますが、拡張性とか考慮してスカスカにしますよね。
それぞれのデータの意味はこんな感じです[1]。
![データ種類.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271250/dc472bb3-003b-acf0-2aa2-5297c22b5dd0.png)
速度表示とATC指示速度表示はリトルエンディアンのBCDって表現になるんですかね…？
ともかく、この配列はWindows、intel CPU、C#で見た場合ですから、環境に応じて適宜読み替えてください。
### コントローラ→パソコン
データ配列はこんな感じでした[2]。
![受信データ形式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271250/b661c872-314a-cb6e-a710-f19013ad57a2.png)
入力状態に変化があったときに6バイトのデータが送られてきます。
ゲームのタイトル画面でスタートボタンを押すように言われるのは初期状態を取得するためなんでしょうかね。
それぞれのデータの意味はこんな感じです[2]。
![受信データ種類.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2271250/9e906b7c-dd5b-8045-8467-7a9921318979.png)
マスコンが接点不良か何かでほとんど機能していないので、マスコン入力は自分で確認できてない部分があります。
偉大なる参考文献に感謝。
# 次回予告
以上の通信フォーマットをふまえて使いやすいようにするクラスを書いてみようかなと思います。
# 参考文献
[1] [電車でGO新幹線コントローラ - 酔いどれ野郎の日記帳](http://www.mnw-i.net/blog/2013/02/go.html)
[2] [電車でGO!専用コントローラー(USB) BVE連動用プログラム公開のお知らせ | Tech Otter](https://technotter.com/post_2687)
突然Dockerコンテナ作成してみる話 環境準備編

# 環境準備

この記事の作業スコープを示します。

![ProjectImages-環境設定スコープ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/fd2a8e14-ccbd-0914-5bc7-87c785871104.png)

## Windows host

手順の方針として、可能な限り、コマンドプロンプトで作業できるようにします。特に記載がない場合は管理者権限で起動したコマンドプロンプト上での作業を意味します。

### JDK

#### install

```
winget install Microsoft.OpenJDK.17
```

#### 確認、環境変数設定

```
java -version
★1 version 情報が表示されることを確認する。
echo  %JAVA_HOME%
★2 設定されていることを確認する。

こんな感じ
>echo %JAVA_HOME%
C:\Program Files\Microsoft\jdk-17.0.0.35-hotspot

"%JAVA_HOME%\bin\java" -version
★3 ★1の情報と同じであることを確認する。

```



### Maven インストール

#### ダウンロード

```
curl -O https://archive.apache.org/dist/maven/maven-3/3.8.3/binaries/apache-maven-3.8.3-bin.zip
```

### 解凍、環境変数設定
取得したMavenを任意のディレクトリに解凍する。ここではc:\dev\toolsとして記載する。

```
mkdir c:\dev\tools

jar -xvf apache-maven-3.8.3-bin.zip 
xcopy /S apache-maven-3.8.3 c:\dev\tools\apache-maven-3.8.3

rmdir /S /Q apache-maven-3.8.3

setx M3_HOME c:\dev\tools\apache-maven-3.8.3
setx PATH "%M3_HOME%\bin;%PATH%"

```

別のプロンプトを開いて以下のコマンドを実行する。なお、環境変数の変更やPATHへの追加は次回のコマンドプロンプト起動時に有効になるため、必要に応じて都度コマンドプロンプトを再起動すること。

```
mvn -version 
★バージョン情報が出力されることを確認する。
```

### git インストール

```
> winget install git -s winget 
★コマンドプロンプト再起動
>git --version
★バージョン情報が出力されることを確認する。
```

## swagger codegen のインストール

```
>mkdir c:\dev\tools\codegen

>curl -O https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.30/swagger-codegen-cli-3.0.30.jar

>copy swagger-codegen-cli-3.0.30.jar c:\dev\tools\codegen\swagger-codegen-cli-3.0.30.jar
```

### VS Code の拡張機能をインスト

VS Code で以下の拡張機能をインストールする。

|No.|拡張機能名|検索ワード|
|--|--|--|
|1|Extension Pack for Java|java|
|2|Swager Viewer|swagger|
|3|OpenAPI (Swagger) Tools|swagger|
|4|Swagger Tools|swagger|
|5|YAML|YAML|


いったん環境設定はこれで完了です。

[＜＜前の記事　　](https://qiita.com/shupeluter/items/475b8354047c51e11173) [お品書き](https://qiita.com/shupeluter/items/475b8354047c51e11173#%E3%81%8A%E5%93%81%E6%9B%B8%E3%81%8D) [　　次の記事＞＞](https://qiita.com/shupeluter/items/7341c43b35595d4204a6)
Rails ruby 2.6.0 のdockerイメージでwebpackが動作しない

###
Ruby 2.6.0でインストールされるyarnのversionが古い可能性がある。

```
#Dockerfile

RUN set -x && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

RUN set -x && apt-get update -qq && \
    apt-get install -yq build-essential　yarn

```

コンテナ内でversionを確認

```
yarn --version
1.22.15
```

これで動作した。
Linux入門 1-3 VirtualBoxにUbuntuをインストールしてみた

# はじめに
Linux初学者である自分向け用の記事です。[Udemyの動画講座]を参考にしました。
僕の勉強法は`動画を見る`→`実際に動かしてみる`→`問題演習`という流れです。

前回まで：[Linux入門 1-2]

***

#### 1. Linuxのインストール・簡単なコマンド操作

3日目：TeraTermを用いたUbuntuの画面操作
https://jp.ubuntu.com/download からUbuntu Desktop 20.04.3 LTSの.isoをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/1f192de0-e006-2407-a7b4-3cbb4b33387d.png)

- VirtualBoxの設定

省略（以下のように設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/e8043b81-0c3d-ebd4-7dd9-47ff67948d07.png)

3日目：TeraTermを用いたUbuntuへの接続

- Ubuntu側の設定

opensshサーバーをインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/a1ff750f-b470-9372-fb09-e1397f67704e.png)
これで、外部からUbuntuに接続できるようになった。

opensshサーバーが動作していることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/b11c29dc-261c-fa83-a0fb-dddd43c81f0a.png)

- Virtualbox側の設定

高度ネットワーク設定からポートフォワーディングを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/f3f06504-a451-3b58-d771-05df71c71cf1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/44dd5690-7a9f-bb78-f303-ff7d57e5f017.png)


- TeraTerm側の設定

ホストは127.0.0.1:4444に設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/6d4df131-7398-f6dd-860e-4fcac82f5d84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3b29997c-d707-0745-84be-14c66c6be4ac.png)




*To Be Continued...*
[Linux入門 2-1] へ
***
[](参照ソース)
[Linux Professional Institute公式HP]:https://www.lpi.org/ja/our-certifications/lpic-1-overview
[Udemy]:https://udemy.benesse.co.jp/career/workstyle/lpic-interview-company.html
[Udemyの動画講座]:https://www.udemy.com/course/linuxlpic/?utm_source=bene-content-marketing&utm_campaign=normal&utm_content=story&utm_term=career&utm_medium=udemyads
[Linux入門 1-2]:https://qiita.com/hoglet/items/edb0cb47b7705570492d
[Linux入門 2-1]:
C# 文字列の部分変更、削除

##0.0 はじめに
string型の文字列はchar型の集合体、リストの様な形で取り扱えるので目的の文字列もしくは文字を削除するのは非常に簡単です。(以下、文字１字も文字列として扱います。

##1.0 Replace関数
Replace関数はその名の通り、文字列を入れ換えるときに使います。第一引数に検索する文字列、第二引数に置き換える文字列を入れます。この第二引数に""(空文字)を指定すれば文字列を削除することが出来ます。

👍️**ポイント**
Replace関数はもとの文字列を変更するものではありません。もとの文字列を変更したい場合はstr=str.Replace("abc","")のように置き換えたものをもとの文字列に代入しましょう。

```C#:Test.cs
string str0 = "abcde";
string str1 = str0.Replace("de", "fgh"); // deをfghに変える
string str2 = str0.Replace("bc", ""); // bcを削除する
Debug.Log($"str0は {str0} です");
Debug.Log($"str1は {str1} です");
Debug.Log($"str2は {str2} です");
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/1eb05ee4-98c4-5fd3-5f11-2d1fa93920eb.png)

##2.0 Trim関数
Trim関数は前後の空白を削除することが出来ます。

👍️**ポイント**
文字列途中の空白は削除できません

```C#:Test.cs
string str0 = " abc de "; // 前後、真ん中に空白あり
string str1 = str0.Trim(); // 前後の空白を取り除く
string str2 = str0.TrimStart(); // 前の空白を取り除く
string str3 = str0.TrimEnd(); // 後の空白を取り除く
Debug.Log($"str0は{str0}です");
Debug.Log($"str1は{str1}です");
Debug.Log($"str2は{str2}です");
Debug.Log($"str3は{str3}です");

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/b6ce0db2-dfe8-dd41-7a60-eb1ecbbfa271.png)
Pythonのリストをテキスト変換してGZIP圧縮、S3へUP

実な検証ですが、忘備録として残します

# 環境
python3.7
実行時間はscaleneで計測

# やりたかったこと
1. PythonでDBからデータを取得（今回は省略）
1. 取得したデータをテキストファイル化
1. 上記をGZ圧縮してS3に保存

# 仮説
- メモリをバッファに一気に格納して処理すると実行速度が落ちる？
- 1行ずつ処理するより、ある程度の塊で処理したほうがよさそう

# 結果
- 変換行数が増加すると実行速度は落ちていった
- 思いのほか1行ずつの処理が速い。逐次処理で良さそう

# 検証結果
|変換行数|実行時間（秒）|
|--:|:-:| 
|1|4.16|
|10|4.30|
|100|4.49|
|1000|5.30|

# ソースコード
```python
from io import BytesIO,TextIOWrapper
import gzip
from boto3 import client,Session

testlist:list = [[x,x+10,x+20,x+30,x+40] for x in range(1,1000000)]
ROW_SPLIT = 10

buf = BytesIO()
with gzip.GzipFile(mode='wb', fileobj=buf, compresslevel=5) as gz_file:
    with TextIOWrapper(gz_file, encoding='utf-8') as wrapper:
        if ROW_SPLIT > 1:
            _line = ""
            for i,row in enumerate(testlist,start=1):
                _line += '\t'.join(map(str,row)) + '\n'
                if i % ROW_SPLIT == 0:
                    #print(f'{ROW_SPLIT}行分書き込み\n{_line}')
                    wrapper.write(_line)
                    _line = ""
            else:
                #print(f'最後の書き込み\n{_line}')
                wrapper.write(_line)
        else:
            [wrapper.write('\t'.join(map(str,row))) in testlist]
    
    # S3へUP（ここではプロファイル情報を読み込んでアクセスしている）
    s3 = Session(profile_name='my_profile').client('s3')
    s3.put_object(Bucket='xxx', Key='my_key/test.gz', Body=buf.getvalue())    
```

# 参考
[gzip 圧縮されたテキストファイルを書き出す](https://qiita.com/kkdd/items/bf895c9367004e31382b)
[Scalene: a high-performance CPU, GPU and memory profiler for Python](https://github.com/plasma-umass/scalene)
AtCoder ABC088B - Card Game for Two 解説


配列内で一番高い数値を取り出し、2番目に高い数値を取り出すロジックをどう書くかがポイント。


標準入力の順番が割り切れる（偶数）の時は一番目、割り切れない（奇数）の時は2番目になる。

標準入力nをrangeで取ってきた順番（0.1.2.3）の数字が割り切れる（偶数）の時は一番目、割り切れない（奇数）の時は2番目になる。

```
n=int(input())
a=list(map(int,input().split()))
a.sort()
a.reverse()
A=0;B=0
for i in range(n):
  if i%2==0:
    A+=a[i]
  else: 
    B+=a[i]
print(A-B)

```
突然Dockerコンテナ作成してみる話

# ちょっとしたきっかけ

何を思ったか、職場で利用する動作確認用のAPをヒヨコどもの代わりに作らなくてはならなくなった。せっかくなのでかんたんに手順をまとめて。誰でもできるようにしたい。

# やること概要

![ProjectImages.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837176/98cc6bf4-e09e-5acd-1012-95d487a459d1.jpeg)

ざっとこんな感じ。

## 環境前提

|No.|環境名|概要と前提|備考|
|--|--|--|--|
|1|Windows 11(Host)|Java開発環境として利用する。||
|2|WSL2|Dockerを使用するために利用|正直、仮想マシンでもMacでもDockerさえ動けば問題ない|

## 環境導入対象

### Windows 11(Host)
|No.|導入ソフトウェア|バージョン|目的|備考|
|--|--|--|--|--|
|1|JDK|11|SpringBoot Applicationを開発、実行するため||
|2|Maven|3.3+|SpringBoot Applicaitonのビルドを行うため||
|3|Visual Studio Code|1.62.3+|SpringBoot Applicationを開発、実行するため||
|4|git|2.33.0+|Gitを使用するため||

## お品書き

こんな予定で勧めていきます。楽しみになさってください。

* **[環境を準備しよう](https://qiita.com/shupeluter/items/3ca0dfab64385d6da384)**
* **[Swaggerを書こう](https://qiita.com/shupeluter/private/7341c43b35595d4204a6)**
* **[資源管理を始めよう](https://qiita.com/shupeluter/private/853db21db1c9d00cac7a)**
* **[APIを作成しよう](https://qiita.com/shupeluter/items/853db21db1c9d00cac7a)**
* **[APIを修正しよう](https://qiita.com/shupeluter/private/3d25603dd7e03404bdf0)**
* **[Dokcerを使ってコンテナを作成しよう](https://qiita.com/shupeluter/private/45db9c3a54951278aa8b)**
* **その他のコンテンツ**
  * **[そもそもGitって何よ。](https://qiita.com/shupeluter/items/3e64555cbd0476c7fff8)** 
  * **[VSCode。。。エディタやめるってよ。](https://qiita.com/shupeluter/private/f1be355168dbd107f43b)**


以上です次回は環境構築についてお話します。

[次の記事](https://qiita.com/shupeluter/items/3ca0dfab64385d6da384)
unity cloud buildの罠、あるいはzipの罠

今回のプロジェクトではunity cloud buildを使っているのだけど、そのとんでもないワナにかかったので、メモ書きを置いておきたい。

1. unity cloud buildはlinuxの仮想マシンの上で動いている。
1. ビルドはzipファイル形式でサーバーからダウンロードする。
1. linuxの上のZIPなのでUTF8でファイル名は扱われる。
1. ここに漢字のフォルダが入っている。サウンドとアートの都合でコレの方が楽だからこうしておいた。
1. windowでダウンロードする。
1. windowsではzipは伝統的にSJISとして扱われる。
1. 解凍すると文字化けする。

macのzipで文字化けと同じわけだけど **文字化けしている** と言われて原因に気がつくまで十数分は軽くかかったと思う。
解決策はUTF-8が扱えるzipで解凍する。

いくつかの解決策があるのだけど、プログラマ的に楽なのはWSL2かmigwinの上で

```
unzip -O auto hogehoge.zip
```

僕はWSL2で解決した。

下らないトラブルだが、実際に引っかかると気がつくまで時間がかかるので、ちょっとしたメモとして残しておきたい。
AWS MediaConvertでGOPに関するエラーが出た場合

AWS MediaConvertをつかってひとつの出力グループ内で複数の出力をしたときに下記の様なエラーが出た場合、全てのの出力の`GOPサイズ/フレームレート`が揃っていない事が原因です。


```
In Apple HLS output group [1], the GOP cadence in output [1] does not align with the GOP cadence in output [0]. 
Frame rate (framerate), GOP size (gopSize), GOP mode control (gopSizeUnits), Closed GOP cadence (gopClosedCadence), and Min I-Interval (minIInterval) all impact an output's GOP cadence.
Adjust these settings so that the GOP cadences align across all outputs in Apple HLS output group [1], and resubmit your job. 
Alternatively, set Segment length control (segmentLengthControl) to EXACT to force a GOP cadence equal to the specified Segment length (segmentLength).
Or, set GOP mode control to Auto (AUTO) and leave GOP size blank for all outputs in Apple HLS output group [1] to set the GOP automatically.
```
GOPはあまりいじらない気がしますので、フレームレートをそれぞれの出力で違う値、例えば、`30fps`, `15fps`みたいにしているとエラーがでます。また、`Follow source`と`30ｆｐｓ`の様になっていると、30fpsの動画を変換したときはエラーが起きないのに、29.970fpsの動画を変換するとエラーが起きます。
逆に30fps, 15fpsを混在させたいときはGOPのサイズの方をいじればOKです。
XMind8 Ubuntuで起動させる

###XMind8 Ubuntuで起動させる

https://jp.xmind.net/


####XMind8 Ubuntuで起動

ファイルをダウンロードし、中に入っているsetup.shを実行します。

```
sudo bash setup.sh
```

###Javaのバージョンのパスを取得する

XMind8はJava8で動きます。Java11だとエラーが出ます。Java8がインストールされていない場合はインストールしてください。
update-alternativesコマンドを打つとパスがわかります。

```
/usr/sbin/update-java-alternatives -l

sudo update-alternatives --config java
```

現在は11が設定されています。

```
* 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      自動モード
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      手動モード
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      手動モード
```

ここでは２を入力します。
これを手動に**Java8に変えてやるととりあえずXMindは起動します**。



###起動時だけJava8する

####XMind.iniの編集

他のサイトで書いてあったXMind.iniを編集しJavaのバージョン８にしてやることで、起動できるようです。


```
-vm
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
```

ただしこのやり方で起動ができませんでした。
とりあずJava8にすれば起動できたので、Java8でやります。


https://askubuntu.com/questions/1138225/xmind-8-suddenly-stopped-working-on-ubuntu-18-04-lts-after-ini-fix

https://qiita.com/ocean_f/items/21c86c2f2fb97f5d27c0