OmniAICreator/Qiita-1.07M huggingface dataset:
IEの起動方法

[Windows11でInternet Explorer11を起動する方法 - Qiita](https://qiita.com/lumin/items/bd2a8e90efb4010e2804) が消えた時用に退避

## vbs

```vb:ie.vbs
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.navigate "https://qiita.com/"
```

InternetExplorer.Application
の部分を
`D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E`
に書き換えることで、ウィンドウ処理を連続して行うことができる。
(IEのセキュリティレベルをMediumで扱うIDということらしい。
)


```vb:ie.vbs
Set objIE = CreateObject("D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E")
objIE.Visible = True
objIE.navigate "https://qiita.com/"

' Webページのロードを待つ
Do While objIE.Busy = True Or objIE.readyState <> 4
	WScript.Sleep 100
Loop    

objIE.navigate "https://qiita.com/tukiyo3"
```

2022年6月15日以降もIEが起動することを確認。(win11でも起動。)

## powershell

```powershell:ie.bat
@powershell -NoProfile -ExecutionPolicy unrestricted -Command ^
 "(New-Object -ComObject InternetExplorer.Application).Visible=1"
```


## パッチ

* https://www.catalog.update.microsoft.com/Search.aspx?q=KB5009596
AWS Cloud Practitioner について勉強してわからないことをまとめた ~モジュール３~

## はじめに
[「AWS Cloud Practitioner について勉強してわからないことをまとめた ~モジュール２~」](https://qiita.com/dai_chi/items/7c8620adb0b4478f8832)の続きです。

過去投稿分
[「AWS Cloud Practitioner について勉強してわからないことをまとめた ~モジュール１~」](https://qiita.com/dai_chi/items/9744c7935d00206ffc3a)

参考：[AWS Cloud Practitioner Essentials(Japanese)](https://explore.skillbuilder.aws/learn/course/1875/play/27620/aws-cloud-practitioner-essentials-japanese-ri-ben-yu-shi-xie-ban)

## AWSグローバルインフラストラクチャ
### リージョンを選択する
サービス、データ、アプリケーションに適したリージョンを決定する際は、以下の４つのビジネス要素を考慮する。

#### データガバナンスと法的要件の遵守
会社や場所によっては、ある特定の地域からデータを実行する必要がある場合があります。
例えば、自社のすべてのデータを英国内に保管するという要件がある場合は、ロンドンリージョンを選択する。

#### ユーザーとの近接性
お客様に近いリージョンを選択すると、コンテンツをお客様に素早く提供できる。

#### リージョン内で利用可能なサービス
場合によって、お客様に提供しようとするすべての機能が、最も近いリージョンでは利用できない場合がある。

#### 料金
アプリケーションを米国とブラジルの両方で実行しようとしているとする。ブラジルの課税体系上、あるワークロードをサンパウロリージョンから実行する場合、オレゴンリージョンと比較して料金が50%高くなる可能性がある。

### アベイラビリティーゾーン
リージョン内の１つのデータセンターまたはデータセンターのグループで構成されている。アベイラビリティーゾーンは互いに数十マイル離れた位置にある。これは、アベイラビリティーゾーン間の低レイテンシーを実現するために十分な距離。
災害が起きても複数のアベイラビリティーゾーンが影響を受ける可能性を減らすことのできる十分な距離である。

## エッジロケーション
Amazon CloudFrontで、今絵tンツのキャッシュされたコピーをお客様の近くに保存するために使用する場所
[Amazon CloudFront の主な特徴](https://aws.amazon.com/jp/cloudfront/features/?nc=sn&loc=2&whats-new-cloudfront.sort-by=item.additionalFields.postDateTime&whats-new-cloudfront.sort-order=desc#Amazon_CloudFront_Infrastructure)

## AWSリソースをプロビジョニングする方法
### AWS マネジメントコンソール
AWSのサービスにアクセスし、サービスを管理するためのウェブベースのインターフェイス。
リソースのモニタリング、アラームの表示、請求情報の確認と言ったタスクを実行することもできる。

### AWS コマンドラインインターフェイス
APIリクエストを作成する際の時間を短縮するには、AWSコマンドラインインターフェイス(AWS CLI)を使用できる。サービスやアプリケーションをスクリプトで自動化できる。

### ソフトウェア開発キット
プログラミング言語やプラットフォーム用に設計されたAPIを使用して、AWSのサービスを簡単に使用できる。

## AWS Elastic Beanstalk
ユーザーがコードと設定情報を提供することによって、以下のようなタスクの実行に必要なリソースが自動的にデプロイされる。
- キャパシティーの調整
- 負荷分散
- 自動スケーリング
- アプリケーションの状態モニタリング

### AWS CloudFormation
インフラストラクチャをコードとして扱うことができる。つまり、AWSマネジメントコンソールを使用してリソースを個別にプロビジョニングする代わりに、コード行を記述して環境を構築できる。

## 注意
自己学習のために割愛している部分があるので
公式も合わせてご確認ください。
[AWS Cloud Practitioner Essentials(Japanese)](https://explore.skillbuilder.aws/learn/course/1875/play/27620/aws-cloud-practitioner-essentials-japanese-ri-ben-yu-shi-xie-ban)

参考書籍： [図解即戦力　Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書](https://amzn.to/32Srimi)
Laravel jetstream プルダウンとチェックボックス

Laravelでconfigフォルダにファイルを保存してから値を記述する方法について
２箇所に記述しております。

パターンA
従来の記述

①config直下に保存するファイル

```:&#;app/config/prefecture.php
<?php 
return array(
  '0' => '未選択',
  '1' => '北海道', 
  '2' => '青森県', 
  '3' => '岩手県', 
  '4' => '宮城県',
  '5' => '秋田県', 
  '6' => '山形県', 
  '7' => '福島県', 
  '8' => '茨城県',
  '9' => '栃木県', 
  '10' => '群馬県', 
  '11' => '埼玉県', 
  '12' => '千葉県',
  '13' => '東京都', 
  '14' => '神奈川県', 
  '15' => '新潟県', 
  '16' => '富山県',
  '17' => '石川県', 
  '18' => '福井県', 
  '19' => '山梨県', 
  '20' => '長野県', 
  '21' => '岐阜県', 
  '22' => '静岡県', 
  '23' => '愛知県', 
  '24' => '三重県',
  '25' => '滋賀県', 
  '26' => '京都府', 
  '27' => '大阪府', 
  '28' => '兵庫県',
  '29' => '奈良県', 
  '30' => '和歌山県', 
  '31' => '鳥取県', 
  '32' => '島根県',
  '33' => '岡山県', 
  '34' => '広島県', 
  '35' => '山口県', 
  '36' => '徳島県',
  '37' => '香川県',
  '38' => '愛媛県',
  '39' => '高知県', 
  '40' => '福岡県',
  '41' => '佐賀県', 
  '42' => '長崎県', 
  '43' => '熊本県', 
  '44' => '大分県',
  '45' => '宮崎県', 
  '46' => '鹿児島県', 
  '47' => '沖縄県'
);
?>

```
続いてview

```resources/views/posts/create.blade.php

<div class="form-group">
<tr><th>出身地</th><td>
<select type="text" class="form-control" name="prefecture">                 
@foreach(config('prefecture') as $key => $score)
<option value="{{ $score }}">{{ $score }}</option>
@endforeach
</select>
</div>
```

パターンB
チェックボックスの時
下記はチェックボックスでviewに記述する場合の記述。



下記のように一つしか選択できないformを実装する際は、radioで実装して下さい。

```resources/views/posts/create.blade.php
   <div class="form-group row">
        <label>
      　  性別
         <p class="col-sm-4 col-form-label"></p>
               <div class="col-sm-8">
               <label>{{ Form::radio('gender', "未選択") }}未選択</label>
               <label>{{ Form::radio('gender', "男性") }}男性</label>
               <label>{{ Form::radio('gender', "女性") }}女性</label>
              </div>
          </div>
      </label>

```
2022/1/11主にITとかセキュリティの記事

富士通 法人向けサーバー値上げ 半導体不足で部品価格上昇など(1/7)
https://www3.nhk.or.jp/news/html/20220107/k10013419371000.html

フランスがグーグルとメタに制裁金275億円 クッキー拒否しにくくしたとして(1/8)
https://gunosy.com/articles/enhxu

Windowsはどう使われたがっているのか(1/8)
https://pc.watch.impress.co.jp/docs/column/config/1379224.html

サイバー防衛力の格付け広がる　「落第企業」取引停止も(1/8)
https://www.nikkei.com/article/DGXZQODZ317TQ0R30C21A3000000/

ノートン製品の暗号通貨採掘機能に懸念の声、日本では未搭載(1/8)
https://japan.zdnet.com/article/35181825/

ちょっとしたスクリプトにWindowsに含まれているアイコンを流用して、自分で作らずに済ませる方法(1/9)
https://gunosy.com/articles/ehrfv

北京冬季五輪の基幹情報システム、アリババクラウド上で100％運用(1/8)
https://www.excite.co.jp/news/article/36kr_167911/

3千人分の個人情報誤掲載　福井、外部アクセス31回(1/8)
https://news.goo.ne.jp/article/kyodo_nor/region/kyodo_nor-2022010801000989.html

教育データ、25年に共有　デジタル庁が工程表(1/7)
https://www.nikkei.com/article/DGXZQOUA07AWL0X00C22A1000000/
ファイルの転送で音質が変わるのか

# はじめに
私の結論は"変わる"です, 正しくはデータ転送によってデータ内容は変化することがあります. "ファイル転送サービスで音質が変わるか"という問いならば, 変わらないです, そんな品質のサービスなら誰も使わないでしょう. 私は馬鹿なので読むなら話半分で.

この問題に対して, TCPについてだけ調べてみました.

## 余談
ファイルフォーマットには, データ破壊検出機能があります, データ伝送でデータ破壊が起きた場合に検出できる可能性が上がります. 今回の問いとは何も関係がないので無視します.

- wav, mp3, mp4, 挙げられているフォーマットにそのような機能はない（調べてないですけど）
- Zip, 7zはCRC32でデータ破壊検出が可能

# TCPのエラー検出
TCPのエラー検出は, ヘッダに付与された16bitのチェックサムで行います. このチェックサムが異なればパケットの再送・破棄を行います. データ破壊が起きていてもチェックサムが同じであれば正常に通信が完了します.

（CRCの衝突についての論文があるのですが失念）, TCPのチェックサムはCRC16よりも弱く簡単に衝突します.

研究や経験則について, 軽く調べただけでも次のような情報があります.

- [When the CRC and TCP checksum disagree](https://dl.acm.org/doi/10.1145/347059.347561)
- [SoftEther VPN 2.0 Beta 1 バグ情報](https://softether.hatenadiary.org/entry/20050130/p2)

詳細は書けませんが, ある店舗とサーバの通信だけ再送やデータ破壊が起きるという知見もあります.
データではありませんが, [Bitsquatting](https://en.wikipedia.org/wiki/Bitsquatting) という攻撃手法も考えられます.

# まとめ
エンジニアを名乗らないのならば, どうでもいいと思います, 私もうまく付き合います.

SSL/TLSが必須になった今日では, フロントエンドエンジニアやバックエンドエンジニアの方々が気にするところではないですが, エンジニアを名乗るなら知っておいてもいいのではないでしょうか. TCPだけでは, データは壊れている可能性があるし, 意図していない宛先に届いていると思って実装するといいと思います.

ファイルのバイトの単位の一致を確認するために, ハッシュを使うのはエンジニアとしておかしくないですか？, ハッシュ値を計算するために全バイトをパースしているのはむだなので. 速さも正しさもバイト単位の比較をした方が良いのでは.
Vue-infinite-loading で no-resultsなどの設定を共通化する方法

```
   <div slot="spinner">読込中</div>
      <div slot="no-more">全件取得しました</div>
      <div slot="no-results">データがありません</div>
      <div slot="spinner">
     
      </div> 
 
```

#これ毎回コンポーネントにかくのだるくね？


だるいだるいだるい!!!!!


##やったこと

公式ドキュメントを読んだ。
https://peachscript.github.io/vue-infinite-loading/

英語と中国語　💢

##解決策

```

 import Vue from 'vue'
 import InfiniteLoading from 'vue-infinite-loading'


 Vue.use(InfiniteLoading, {
     slots: {
         spinner: "データないです",
         noMore: 'もうないです。', 
         noResults: "データがない",
     },

 });

```



おそらくInfinitive loadを入れる際にプラグイン？として任意のフォルダにjsファイルを入れているかと思います。(忘れている人は思いだして。)

そこに共通の設定が書けるようになっていました。なんて便利なんだ！


注意点として変数？として"-"が使えないようなので？キャメルケースでの記述に変換するようです。
no-more -> noMore
no-results -> noResults


```
<div slot="no-more">全件取得しました</div>
```

↓こんな感じかな。

```
noMore: '全件取得しました。', 
```



##結論
開発がんばろう。！！！！！！！！！！！！！！！
`zsh`で`eval`する

# `eval`とは

```zsh
       eval [ arg ... ]
          Read the arguments as input to the shell and execute the resulting
          command(s) in the current shell process.  The return status is the
          same as if the commands had been executed directly by the shell;
          if there are no args or they contain no commands (i.e. are an
          empty string or whitespace) the return status is zero.
```

要するに文字列を標準入力としてシェルに与えて実行（した上でその返り値を取得）できる



## 何が嬉しいのか
変数展開の都合によって通常の記法によるシェルスクリプトでは設定できないようなコマンドをそのまま通すことができる
もっと手軽に言えば，変数展開の実行と`eval`の実行を分けてしまうことでより簡易に明確に文字列をインジェクションできる

https://soluna-eureka.hatenablog.com/entry/2022/01/04/213224

例えば上記で扱った`c++` likeな文字列の取り扱いについても，シェルスクリプトの文面に直接的にコマンドを書かなくとも


```zsh:testZsh5
#!/bin/zsh -eu
# this is testZsh5

arg="ab\ncd"

echo "for echo():"

cmd1="echo ${arg}"
cmd2="echo '${arg}'"
cmd3="echo \"${arg}\""
cmd4="echo $'${arg}'"
cmd5="echo $\"${arg}\""

eval ${cmd1}
eval ${cmd2}
eval ${cmd3}
eval ${cmd4}
eval ${cmd5}

echo "for printf():"

cmd6="printf \"%s\n\" ${arg}"
cmd7="printf \"%s\n\" '${arg}'"
cmd8="printf \"%s\n\" \"${arg}\""
cmd9="printf \"%s\n\" $'${arg}'"
cmd10="printf \"%s\n\" $\"${arg}\""

eval ${cmd6}
eval ${cmd7}
eval ${cmd8}
eval ${cmd9}
eval ${cmd10}
```

```zsh
% testZsh5 
for echo():
abncd
ab
cd
ab
cd
ab
cd
$ab
cd
for printf():
abncd
ab\ncd
ab\ncd
ab
cd
$ab\ncd
```

とすればより使い分けやすくなるし挙動がより確実に追跡できる，これと同じものを生で記述するのはかなり面倒になるだろう




# `curl` to `ffmpeg`

**悪用厳禁**

インスペクタを開いてネットワークを監視しながら動画を見ていると，ほぼ必ず`curl`形式のダウンロードリンクがブラウザにエイリアスとして提供されていることが見て取れるが，その`header`要素をそのまま`ffmpeg`に渡すことでローカルファイルに落とせる，というのもCookieやsessionによって行われる管理を維持したままブラウザ環境とCLI環境に対応させることができる

しかしいくらそれをコピペしようが`curl`には`ffmpeg`のような機能はなく（もし単純に`mp4`が落ちてくるならまだしも`hls`の配信が相手だと無力である），また`ffmpeg`とはそれ自身のコマンドはもちろん渡されるオプションのフォーマットも違う，それなら以下のように`--ffmpeg [動画ファイルの名前]`を末尾に追記するだけで自動的にオプションを加工して（`-H`を集めて`-headers`に渡す）`ffmpeg`を呼び出せる（確実に実行ファイルを指定する）ようにすれば，かなり楽だろうと思われる<br>
現状ではちゃんと動作している

```zsh:curl
#!/bin/zsh -eu
# this is curl with ffmpeg

default=$argv
ffmpeg='--ffmpeg'

zparseopts -D -E -a optionArray -A optionPair -ffmpeg: X+: H+:

if ((${+optionPair[$ffmpeg]})); then
    echo "--ffmpeg option allowed!"
    n=0
    type=""
    head=""
    for i in $optionArray; do
        (( n += 1))
        if [ $i = "-X" ]; then
            echo "type added"
            type=$type$optionArray[n+1]'\r\n'
        elif [ $i = "-H" ]; then
            echo "head added"
            head=$head$optionArray[n+1]'\r\n'
        fi
    done
    command="/usr/local/bin/ffmpeg -loglevel quirt -headers $'${head}' -i '${*}' -c copy ${optionPair[$ffmpeg]}"
    eval "${command}"
else
    /usr/local/opt/bin/curl ${default}
fi
```



## youtubeとかは
`ffmpeg`だけでは無理なサイトもあるが，そういう時は`streamlink`の方が強いのでそっちに任せたい，しかし`streamlink`も決して万能ではなく対応していないサイトの方がむしろ多い，表向きに`.m3u8`や`.mp4`が出てくるサイトなら`ffmpeg`で対応できるが…

https://soluna-eureka.hatenablog.com/entry/2021/11/09/112925

`youtube-dl`とかより`streamlink`の方が一元的に利用できて良い

https://formulae.brew.sh/formula/streamlink
RaspberryPi＋Motionでカメラ画像が極端に暗く（黒く）なる場合の対処法

## TL;DR
- Motionでカメラ画像をキャプチャしたとき、画面がほぼ真っ暗（真っ黒）になる
- 構成はRaspberry pi OS 11.2とPiカメラv2.1互換モジュール
- 原因はOSとカメラモジュールのバージョン相性によるもの。レガシーカメラを有効にすれば解決する
- USBウェブカメラを使っていて画面が黒くなる場合の対処法はわかりません

## 構成
- Raspberry Pi Zero W
- Raspberry Pi OS Lite Bullseye 11.2
- Pi Camera module v2.1(秋葉原で買った互換品)

## 闇しかキャプチャできない
意気揚々とMotionを立ち上げたら画面に闇が映った。完全な暗黒である。

原因がわからないのでとりあえずググり、同じ悩みに直面した海外民のconfレシピ（参考リンク欄参照）を参考にしつつ設定チューニングに勤しみ4時間、ほんの小指ほどマシになる↓
![motion1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189424/ee3c772f-1ad2-75ba-6351-f1e1f416506f.jpeg)

（ティッシュを撮影しているので真ん中にボヤっとしている何かがかろうじて見えるはず）
自国の言語ではあまりこれを改善とは言わない。

しかし `libcamera-hello` をしてみるときちんと色鮮やかに画像が撮影できるのでカメラが壊れているとかではなさそう。
さらに深追いすると、原因は全く別のところにあることがわかりました。

## 原因と対処法
今回の問題の原因は、レガシーカメラモジュールの設定をONにしていないことでした。
以下ONにするための手順：

1. Raspberry pi configurationを開く。 `sudo raspi-config`
1. 3 Interface Options を選択。
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189424/3a690834-998f-5004-b222-8b112b0af9d5.jpeg)
1. I1 Legacy Cameraを選択。
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189424/e3adafd2-8323-6a2d-1468-ab0d17be9850.jpeg)
1. あとは出てくる質問に対してYesとかOKとか答えてRaspberry pi configurationを終了する。再起動する。
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189424/8a389c81-3fcd-7365-6a0c-3ef94a779a8e.jpeg)

これで闇問題が解決するはずです。
![ok.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189424/6d725213-e1db-7bf9-21f2-2382fbaf86e0.jpeg)


## なんでこんなのが必要になってるの
https://www.raspberrypi.com/documentation/accessories/camera.html#libcamera-and-the-legacy-raspicam-camera-stack

公式ドキュメンテーションによると、Bullseyeからカメラ周りの設定が一新された様子。経緯や背景はよくわからん…。
多分この口ぶりから察すると、そもそもBullseyeを使わなければこの問題は起きないかも。古いOSを使うのもこの問題の解決策としてアリかもしれません。（未検証ですが）


## 参考リンク
- 今回の問題では見当違いだったけど、秘伝のタレ系。confファイルのチューニングの参考にどうぞ

https://raspberrypi.stackexchange.com/questions/13818/auto-brightness-bypass-whilst-using-motion/15757#15757

https://forums.raspberrypi.com/viewtopic.php?t=248472

- レガシーカメラ何ぞや問題（あまり答え出てない）

https://www.reddit.com/r/raspberry_pi/comments/rdkypw/despite_updating_config_tool_and_enabling_legacy/
Windows TerminalでIterm2みたいなとうか表示をさせる方法

#誰に向けて
WindowsTerminalで背景透過の方法を調べてもどれもデフォルトのアクリル表示の方法だけで困っている方へ
#実行環境
Windows10 21H1
WindowsTerminal
#方法
1. まずAutoHotKeyというWindows上でいろんなショートカットキーを作成できるソフトをインストールします。
1. [Github Issue Link](https://github.com/microsoft/terminal/issues/1753#issuecomment-778649347)に載っているAHKスクリプトを適当なディレクトリに保存して実行します。(拡張子は.ahk)
1. WindowsTerminalを開いたら以下の方法で自由に透過表示を行えます。
    - ctrl+win+escで透過表示開始
    - ctrl+win+'='で不透明度を上げる
    - ctrl+win+'-'で不透明度を下げる

- またAHKスクリプトはPC起動時に手動で実行させないといけないためスタートアップファイルにAHKスクリプトへのショートカットを置いておくと自動で実行されて快適です。[スタートアップファイルの開き方](https://kiryusblog.com/autohotkey-autorun/)

#まとめ
ただRedditに解決法として載ってたものに少し上書きしたのを書いただけなので何となく投稿するのは気が引けますが、日本語の情報も必要だと思ったので投稿しました。
この方法だと文字も透過されているのですが現状これが一番の解決方法らしいです。公式にもデフォルトでこのような機能を実装するよう要望が来ているそうなのでそれが来るまではこれでしのごうと思います。
[git blame] ファイルを誰がいつ更新したか調べる


次のコマンドで、指定したファイルを誰がいつ更新したか調べることができる。
```git blame {filename}```

例）

```
git blame feature.txt
C:\workspace\01_Project\34_gittest_clone\gittest>git blame feature.txt
fe135f73 (jeronimo34 2022-01-11 00:01:55 +0900 1) "great feature"
```
(SpotMicroAI) 3. ソフトウェア環境構築

動作範囲は下記の通り。

![CD68BF8A-FC56-4CD3-8F13-8DC390B45E2F-L0-001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256233/54c5a26e-ed7c-9268-991d-8bc0d32b94dd.jpeg)
![CB7870A4-0B72-4AB8-A3BD-B90DDFA2689C-L0-001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256233/2c02bbef-ad22-bd4f-c0b4-48231ef3549a.jpeg)

最適化で歩容作成　→　関節角目標値を出力とした最適制御
【React】react-beautiful-dndの記述方法

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##react-beautiful-dndの記述方法
Reactで、react-beautiful-dndを使用する際には、以下のように記述します。

```App.jsx
import {useState} from 'react';
import {DragDropContext, Draggable, Droppable} from 'react-beautiful-dnd';
import './App.css';

function App() {
  const [items] = useState([
    {id: 0, text: "item0"},
    {id: 1, text: "item1"},
    {id: 2, text: "item2"},
  ])
  const onDragEnd = (result) => {
    const remove = items.splice(result.source.index, 1);
    console.log(remove);
    items.splice(result.destination.index, 0, remove[0]);
  };
  return (
    <div className="dragDropArea">
      <DragDropContext onDragEnd={onDragEnd}>
        <Droppable droppableId='doroppable'>
          {(provided) => (
            <div {...provided.droppableProps} ref={provided.innerRef}>
            {items.map((item, index) => (
              <Draggable draggableId={item.text} index={index} key={item.id}>
                {(provided) =>
                  <div
                  className='item'
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                  >
                    {item.text}
                  </div>
                }
              </Draggable>
            ))}
              {provided.placeholder}
            </div>
          )}
        </Droppable>
      </DragDropContext>
    </div>
  );
}

export default App;
webカメラを利用した感情分析をしてみた

どうも、学生エンジニアのirohasです。

今回はOpenCVとkerasを用いて、感情分析をしてみました。
今回のは共有というよりか、備忘録ならびに自己満記事ですので、説明聞きたい！という方はブラウザバック推奨です...

手順としては、モデルを作成→作成したモデルを使ってディープラーニング→webカメラで実行という形です。

ディープラーニングにおけるモデル作成などの説明はインターネット上や書籍などで詳しく解説されているものが多いのでこの記事では割愛させていただきます。

この記事ではディレクトリ構成と、起動する際のコードを貼り付けようと思います。

```
C:.
├─detector
├─models
├─__pycache__
├─cnn.py
├─load.py
├─make_model.py
└─emotion_detector.py
```

ディレクトリ構成はこんな感じです。

続いて、動かすコードの中身です。

```python:emotion_detector.py
from keras.preprocessing.image import img_to_array
import imutils
import cv2
from keras.models import load_model
import numpy as np

# モデルと分類器の読み込み
detection = 'detector/haarcascade_frontalface_default.xml'
emotion = 'models/_mini_XCEPTION.102-0.66.hdf5'

#モデルの読み込み
face_detection = cv2.CascadeClassifier(detection)
emotion_classifier = load_model(emotion, compile=False)
EMOTIONS = ["angry" ,"disgust","scared", "happy", "sad", "surprised",
 "neutral"]


#ビデオの開始
cv2.namedWindow('Camera')
cam = cv2.VideoCapture(0)
while True:
    frame = cam.read()[1]
    frame = imutils.resize(frame,width=300)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_detection.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30,30),flags=cv2.CASCADE_SCALE_IMAGE)
    
    canvas = np.zeros((250, 300, 3), dtype="uint8")
    frameClone = frame.copy()
    if len(faces) > 0:
        faces = sorted(faces, reverse=True,
        key=lambda x: (x[2] - x[0]) * (x[3] - x[1]))[0]
        (fX, fY, fW, fH) = faces
        #グレースケール画像から顔のROIを抽出、28x28ピクセル固定にリサイズして準備。
        # ROIをCNN経由で分類する
        roi = gray[fY:fY + fH, fX:fX + fW]
        roi = cv2.resize(roi, (64, 64))
        roi = roi.astype("float") / 255.0
        roi = img_to_array(roi)
        roi = np.expand_dims(roi, axis=0)
        
        
        preds = emotion_classifier.predict(roi)[0]
        emotion_probability = np.max(preds)
        label = EMOTIONS[preds.argmax()]
    else: continue

 
    for (i, (emotion, prob)) in enumerate(zip(EMOTIONS, preds)):
                #ラベルテキストを構築
                text = "{}: {:.2f}%".format(emotion, prob * 100)
                w = int(prob * 300)
                cv2.rectangle(canvas, (7, (i * 35) + 5),
                (w, (i * 35) + 35), (0, 0, 255), -1)
                cv2.putText(canvas, text, (10, (i * 35) + 23),
                cv2.FONT_HERSHEY_SIMPLEX, 0.45,
                (255, 255, 255), 2)
                cv2.putText(frameClone, label, (fX, fY - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
                cv2.rectangle(frameClone, (fX, fY), (fX + fW, fY + fH),
                              (0, 0, 255), 2)

    cv2.imshow('camera', frameClone)
    cv2.imshow("Emotion Now", canvas)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

camera.release()
cv2.destroyAllWindows()


```

■実行結果
![スクリーンショット (398).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/740730/c51e92c7-2538-3b2e-091e-51a2dc440a30.png)

こんな感じで上手くいきました。
個人的にはFERとか他のライブラリでも作成してみたいと思ったのと、二画面ではなく一画面でリアルタイム感情分析ができたらなと思っています。
ディープラーニングはまだまだ奥深いなと感じたので、これからも引き続き勉強していきます。
tsconfigのincludeやexcludeの初期設定を理解しておらず必要以上にコードを書いていた話

## この記事の概要

見よう見まねで`tsconfig.json`の設定をしていたので今まで何回か無駄なコードを書いてしまっていました。
これから新しく`tsconfig.json`を作成する人が少しでも少ないコード量で設定を終えられる助けになれば良いな、と思って書いた記事です。

## include編

### 無駄に書いていたコード

だいたいいつもこんな感じで書いていました。

```json:tsconfig.json
{
  "include": ["src/**/*.ts", "src/**/*.tsx"]
}
```

### これで良かった

拡張子を指定しないで、ひとまとめ。

```json:tsconfig.json
{
  "include": ["src/**/*"]
}
```

### 説明

デフォルトでは`.ts`と`.tsx`と`.d.ts`のみをサポートしています。

`allowJS`を指定すると`.js`と`.jsx`もincludeされますが、いつも`false`にしていたにも関わらず`.ts`や`.tsx`を記載していました。
明示的になるので悪いことも無いと思いますが、知っててやるのと知らないでやるのには大きな隔たりがあるよな……と感じています。

https://www.typescriptlang.org/tsconfig#include

## exclude編

### 無駄に書いていたコード

プロジェクトによって多少違いますが、だいたいこんな感じでした。

```jsonc:tsconfig.json
{
  "compilerOptions": {
    "outDir": "dist",
    // その他色々な設定
  },
  "exclude": ["dist", "node_modules"]
}
```

### これで良かった

記載そのものが不要。

```jsonc:tsconfig.json
{
  "compilerOptions": {
    "outDir": "./dist",
    // その他色々な設定
  },
}
```

### 説明

デフォルトでexcludeされるのは`node_modules`, `bower_components`, `jspm_packages`, そして`outDir`です。

そのため例に挙げたような設定であればまさにデフォルトそのまま。
記載する必要がありません。

こちらも明示的になるので悪いとは思いませんが、デフォルトを知っていればあえて指定することもないのかな？と思います。

https://www.typescriptlang.org/tsconfig#exclude
djangoのトランザクション処理

Djangoでオブジェクトに対してsave()やdelete()をするとその瞬間にデータベースに反映されるとのこと。
例えば一連の処理の中で例外が発生した場合、例外が発生した時点より前にsave()していた分はデータベースに反映されている。
こういうのはデータの一貫性が確保されない恐れがある（トランザクションが考慮されない）。

デフォルトでは上記のような仕様だけど、一連の処理の中で登録などをまとめてデータベースにコミットさせたい場合の方法もある。

## 1.  全ての処理にトランザクションを適用してしまう

```python:config/settings.py
DATABASES = {
    'default': {
        'ENGINE': ...,
        'NAME': 'hoge',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '5432',
        'ATOMIC_REQUESTS': True,  # これを追加
    }
}
```

全ての処理にトランザクションが適用される。
処理をまとめてコミットする。
例外が発生した場合、ロールバックされる。

ATOMIC_REQUESTS: True を指定した状態で特定の処理のみトランザクションを適用したくない時は
処理の前に@transaction.non_atomic_requestsを付ける。

```python
@transaction.non_atomic_requests
def create_hogehoge(request):
    ...
    ...
    ...
```

## 2. 指定の処理のみにトランザクションを適用する
処理の前に@transaction.atomicを付ける。

```python
@transaction.atomic
def fuga(request):
    ...
    ...
    ...
```

もしくはwith transaction.atomic():で対象の処理を囲み、囲んだ範囲のみ適用させる。

```python
def fuga(request):
    ...
    ...
    ...
    with transaction.atomic(): # この範囲のみトランザクションが適用される。
        ...
        ...
        ...
        ...save()
```
【作成中】ScriptOfSagaⅡを今更立ててみる ~立ち上げ編~ #2

#本稿のスコープ
https://qiita.com/sameruck/items/1fab6b4cf21efad6b970
上記ページに記載したロードマップにおける「公開されているスクリプトをWebサーバに上げる」に対して、
本稿ではCGIゲームに関係する基礎知識を概説します。手続き的な内容は次に回します。

ちなみに既にアップロードするだけしているので、良ければ登録してください。
何にも更新してない、かつ機能テストしてないですが笑 ※新規登録やログインぐらいの確認までしかしてないです

http://sameruck.sakura.ne.jp/sos2/sos2.cgi

###進捗(0/3)

- [ ] 公開されているスクリプトをWebサーバに上げる
- [ ] 公開されているスクリプトを可能な範囲で設計書にリバース
- [ ] 再構築 ※ここまでやれたらshoさんのメールアドレスに改造連絡をいれてみる？

# 概要
CGIゲームを立ち上げる上で必要な知識領域をざっくりと分けると
**「CGI」「perlによるゲーム構築」「CGIの動作環境構築」**の３つになると思います。
この３つを以下の2点を説明する体裁をとりながら間接的に説明し、理解してもらえればと思っています。

- CGIゲームの仕組み
- 仮想環境とは

なお、HTTP通信のことだとかインタプリタ言語のことを詳細に知っていることが好ましいですが、
とりあえず始める分には分からなくてもなんとかなると思うので、知らなくても進められるような内容にできればと思います。

# CGIゲームの仕組み
CGIゲームとは
「CGI(Common Gateway Interface)という仕組みを使い、ユーザの操作をWebサーバが受け取り、その結果をHTMLで返すゲームのこと」になると思います。
CGIはプログラミング言語を指す言葉ではなく、実装するのはperlなどのスクリプト言語が主です。C言語なども実際には実装可能なようですが、レンタルサーバで運用されることが多いCGIゲームに対して、環境依存の大きいコンパイル言語はアンマッチになるため使っているところは見たことがありません。

では「CGIという仕組み」とは何のことでしょう？

## CGIとは
抜粋で楽します。

抜粋元：IT用語辞典 e-works

https://e-words.jp/w/CGI.html


>CGIとは、Webサーバが、Webブラウザなどからの要求に応じてプログラムを実行する仕組みの一つ。Web上で最も初期から用いられている動的なプログラム起動のための技術仕様で、多くのWebサーバソフトウェアが対応している。

>プログラムファイルの置かれているURLにクライアント（ブラウザなど）がアクセスすると、Webサーバがオペレーティングシステム（OS）を介してプログラムを起動し、実行結果がクライアントに送信される。主にWebページ上のフォームに記入されたデータの受け取りや、ブラウザからのファイルアップロードなどに用いられる。

→ファイルサーバにあるCGIファイル対してHTTPリクエストを送ると、CGIに記述された応答用の処理を行ってくれます。
アクセスする際にデータを一緒に渡すことになるのですが、同じURL(CGIファイル)に対してどういったデータを送るかによって振る舞い = 処理や応答として返ってくるhtmlを変えられるというのがCGIの肝。
**今回題材とするScriptOfSagaⅡはユーザ情報と操作コマンドをRequest時のデータとして渡すことで、ファイルサーバに貯めているユーザデータに一連の処理結果を反映し、その結果をHTML形式で返信するという処理の流れになります。一連の処理というのは道具使用によるアイテム減少や戦闘による体力の変動だったりですね。**

>CGIの登場以前は、Webサーバはあらかじめ用意されたHTMLファイルなどの静的なコンテンツを要求に応じてただ送信するのみだったが、CGIによって閲覧者側からデータを受け取って動的に処理し、結果を送信内容に反映させられるようになった

>現在では多くのWebサーバが標準でCGIに対応しているため、サーバの種類を問わず同じプログラムを利用することができる。また、CGIは特定のプログラミング言語に依存しないため、様々な言語でプログラムを開発することができる。

→抜粋文の繰り返しになりますが、最初期のインターネット通信はファイルサーバに置かれているHTMLファイルを他の拡張子のデータ同様にHTTPで受信し、それをブラウザで翻訳して表示するだけでした。すなわち一方通行なコミュニケーションだったわけですが、それをCGIがインタラクティブな通信に変えてくれたという点が特徴だと思います。
また上のほうでは、「CGIが処理する」かのように書いていますが処理の実体はその裏に隠れているスクリプト言語になります。
**公開されたままのScriptOfSagaⅡはperlが処理の本体になっています。あと少しcssで見栄えを良くしているぐらい。**
pythonも使えるようなので、ゆくゆく使えたら良いですね。

----------
## 参考
基礎からわかるパソコン入門・再入門

https://www.yamanjo.net/knowledge/internet/internet_28.html
モバイルシステム技術検定(MCPC)2級の対策

皆様

お久しぶりです。satolabです。
最終更新から1年以上の月日が流れました。現在私は某IT企業でモバイル系のインフラエンジニアをしております。

この1年は慌ただしく、qiitaをはじめ情報発信や趣味の開発に中々時間を割けておりませんでした。

現在も四苦八苦の日々ですが、少しずつ情報発信の方も再開出来ればと思っております。

前置きが長くなりましたが、今回はちょっとニッチな資格である"MCPC2級"の対策について紹介したいと思います。

私は11月に受験し、無事合格出来ました。

##概要

モバイルシステム技術検定(通称:MCPC)は、モバイルシステムの提案、構築、運用のために必要となる知識とそのレベルを明示することによって、IT関連技術者の学習意欲の喚起を行い、その学習成果を検定（試験）により測定することが可能となります。
(引用: https://www.mcpc-jp.org/kentei/gaiyou.html)
試験は年に二回あり、後半の回はCBT方式で受けることができます。私は最寄りのテストセンターで受験しました。
なおボーダーは公開されていません。

##対策

公式本を読み込むことです。過去問等は公開されておらず、インターネット上を探しても見つかりませんでした。
公式本: [モバイルシステム技術テキスト 第9版 MCPC検定試験2級対応](https://www.mcpc-jp.org/kentei/text.html)
本は試験日までに3周し、重要そうな部分にマーカーを引いて頭に入れるようにしました。
勉強の期間は2-3週間程度で、1日に2時間程度本を読み込みました。なので計30時間ぐらい勉強しました。
丸暗記出来ればベストですが、数百ページあるので無理です笑
そのため、何周かする事で頭に情報を蓄積しました。本番の試験では選択式なので、丸暗記でなくとも消去法で回答することができます。

ポイントとしては略語、図、表をしっかり押さえる事です。[公式のページのサンプル問題](https://www.mcpc-jp.org/kentei/files/text/mcpc_sample_g2_Answer20170727.pdf)にもあるように、図や表から出題されるパターンがあります。


##試験の傾向と感想

公式サイトにも記述があるように、各章から偏りなく、バランス良く、均等に出題されました。
なので、この章にやまをはって…といった対策はしなくて正解でした。
難易度としては、公式本を読んでいれば必ず回答があるレベルですので高くありません。
試験時間も余裕があります。100問ありますが、急ぐ必要はありません。見直しと、もう一度解く時間が十分にありました。
試験後に自己採点をしまして、出来は7割といった感じでした。結果が心配でしたが、無事合格できました。

##試験から得られる学び

モバイル周りのお仕事につかれている方は、日々の業務に活きる知識を大会的に学べるので良いと思います。
(個人的には4Gや5Gの事業者側のシステムの話が興味深かったですね。3Gより以前の歴史的背景を学べる点も良いです。)
特に私のような若手・新人で、どうやって知識を得ようかと悩まれている方にもお勧めできます。
ポイントは試験の難易度が普通であり、対策の時間もそこまでかからないので日々の業務の片手間で取り組める点だと思います。
手っ取り早く資格取得という成果が出る点は魅力だと思います。

##最後に

今回はMCPCという資格試験の概要と対策をまとめました。
ちょっとニッチ？な試験なので、ネットには情報が少ないと思いましたので、今回まとめた次第です。
今後は勉強だけではなく、実際にインフラ周りの実装にトライし、記事にでも出来ればなと考えています。

最後までお読みいただきありがとうございました。


※本記事はあくまで個人の見解であり、私の属する企業及び組織を代表するものではありません。
Windowsでnode-gypが成功した話

## エラーが出る人は下準備をしていない?!
エラーが出るのはnode-gypの基準に満たしてないかも!  
[node-gyp公式サイト](https://github.com/nodejs/node-gyp#on-windows)に詳しい情報が載ってるので英語が得意な人は読んでみてください。

## 下準備
以下のことを順番通りにしてみてください!

## Pythonのインストール
まず、Pythonをインストールしてください。  
[Microsoft StoreのPython](https://docs.python.org/3/using/windows.html#the-microsoft-store-package)をおすすめします。

## Visual Studio Build Toolsのインストール
Pythonの次に、[Visual Studio Build Tools](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools)が必要です。  
「Visual C++ build tools(Visual C++ビルドツール) ワークロード」もしくは、「Desktop development with C++(C++によるデスクトップ開発) ワークロード」をインストールしてください。  
私の環境では、Visual Studio Build Tools 2019をインストールしました。

## npmのコンフィグの設定
大半の人はこの設定をしていないのでしょうか?  
コマンドプロンプトもしくはPowershell等の、npmが使えるものを起動してください。  
起動したら、  

```shell
npm config set msvs_version インストールしたバージョン
```  

を入力してエンターキーを押します。  
※インストールしたバージョンは、先ほどインストールしたVisual Studio Build Toolsのバージョンを入れてください。(私の場合は2019です。)

## 下準備完了
これでおそらくWindowsでnode-gypのエラーを見ることはないでしょう。  
試しにTensorFlow.jsのNode.js版をインストールしてみてください!

## 最新情報

この記事は、[Renorariぶろぐ](https://blog.renorari.net/pages/2)で配信中です!  
最新の情報を得るには、[Renorariぶろぐ](https://blog.renorari.net/pages/2)をご参照ください!!
変数の後ろにカンマがついている

##変数の後ろにカンマがついている問題があったので備忘録として記しておきます

```Ruby:main.rb
#変数の後ろにカンマを付ける
a, = (1..5).partition(&:odd?)
p a   => [1, 3, 5]

#カンマを付けない
b = (1..5).partition(&:odd?)
p b   => [[1, 3, 5], [2, 4]]
```
カンマを後ろに付けることで多重代入になる。今回の問題でいうとカンマを付けることで2個目の変数の枠が用意されるが2個目の変数を宣言していないことによって[2, 4]の配列がなくなり、[1, 3, 5]が表示される。

:::note info
partitionメソッドは指定した条件に一致するか否かで配列を分割します。
私がサクッと認証付きで Node.js からメールを送った話

## 認証付きで Node.js からメールを送るのは初心者には難しい?

人によって難易度は違うように感じますが、これはそこそこ難しいと思います。  
どうしても、エラー文が分かりにくく解決策も簡単に見せてはくれません。  
なので、挑戦するときは **挑戦して成功した人** と一緒に挑戦するといいでしょう。

## 必須条件

- Node.js が扱える・動かせる
- メール・Node.js についての知識がそこそこある
- サーバーとドメインがある
- サーバーで、すでに Node.js 製の何か(Web サーバー等)があり、ドメインの設定等が済んでいる

## Zoho 契約

### 無料で使える Zoho メールサービスに契約

[Zoho 公式サイト](https://mail.zoho.com/)にアクセスして、契約してください。  
契約はサイトの通りにしてください。

### Zoho メールサービスのセッティング

このサービスのセットアップウィザードは、非常に分かりやすいのでここに記載する必要はないでしょう。

### おっと！

Zoho のメールサービスのセットアップウィザードが便利すぎて、ここで解説することがなくなってしまいました!  
どうしましょう?

大切なことを忘れてませんか?  
この記事は、Node.js でメールを送信することを目標にしています。  
はい、ということでここからは Node.js を使ってメールを送信の方法を説明していきます!

## Node.js でメールを送信!

Node.js でメールを送信するには、「nodemailer」というパッケージが便利です。  

```shell
npm install nodemailer nodemailer-smtp-transport
```  

と入力してインストールしてください。

次は、Node.js でコードを書いていきます。
  
```js
//おなじみrequire
var mail = require("nodemailer");
//メールのパラメータ
var mailParam = {
    "host":"smtp.zoho.com",
    "port":465,
    "auth": {
        "user": "test@renorari.net",//ここはZohoで設定したものに!
        "pass": "renorari_is_god"//Zohoアカウントの設定 > セキュリティ > アプリ専用パスワード　で取得したパスワード
    }
};
//メール送信後のコールバック
var callback = (err, result) => {
    if (err) {
        console.log("メール送信エラー: " + err);
    } else {
        console.log("メール送信完了!: " + result);
    };
};
//送信
var smtp = mail.createTransport("SMTP", mailParam);
smtp.sendMail({
    from: "メール送信テスト <test@renorari.net>",
    to: "your.address@example.com",
    subject: "メール送信テスト",
    text: "テストのメール！"
}, callback);
```

## 最新情報

この記事は、[Renorariぶろぐ](https://blog.renorari.net/pages/1)で配信中です!  
最新の情報を得るには、[Renorariぶろぐ](https://blog.renorari.net/pages/1)をご参照ください!!
OpenFaaSでmydns.jpのIPアドレス更新を行うfunctionを作成する

# 前提
OpenFaaS環境の構築は終わっているものとする

# faas-cliでfunctionイメージの雛形を作成する

```bash
faas-cli template pull
faas-cli new mydns-update --lang dockerfile

Folder: mydns-update created.
  ___                   _____           ____
 / _ \ _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 \___/| .__/ \___|_| |_|_|  \__,_|\__,_|____/
      |_|


Function created in folder: mydns-update
Stack file written: mydns-update.yml
```

# 認証情報用Secret作成
公式では`faas-cli`経由で作成とあるが、gatewayやloginを指定する必要があり煩雑なため`kubectl`を使用して作成

```bash
kubectl create secret generic mydns-username --from-literal mydns-username="(username)" -n openfaas-fn
kubectl create secret generic mydns-password --from-literal mydns-password="(password)" -n openfaas-fn
```

# コマンド作成
実行するdocker imageはalpineなので`bash`はないので、`ash`を指定する。

```bash:/mydns-update/start.sh
#!/bin/ash

USER=`cat /var/openfaas/secrets/mydns-username`
PASS=`cat /var/openfaas/secrets/mydns-password`

wget -O- "http://$USER:$PASS@www.mydns.jp/login.html"
```

# Dockerfile編集
```diff:mydns-update/Dockerfile
FROM ghcr.io/openfaas/classic-watchdog:0.2.0 as watchdog

FROM alpine:3.12

RUN mkdir -p /home/app

COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog

+ ADD start.sh /home/app/start.sh
+ RUN chmod +x /home/app/start.sh

# Add non root user
RUN addgroup -S app && adduser app -S -G app
RUN chown -R app /home/app

WORKDIR /home/app

USER app

# Populate example here - i.e. "cat", "sha512sum" or "node index.js"
- ENV fprocess="cat"
+ ENV fprocess="/home/app/start.sh"
# Set to true to see request in function logs
ENV write_debug="false"

EXPOSE 8080

HEALTHCHECK --interval=3s CMD [ -e /tmp/.lock ] || exit 1

CMD ["fwatchdog"]
```

# イメージ作成&push

```bash
faas-cli build -f mydns-update.yml
docker login
docker tag mydns-update username/mydns-update
docker push username/mydns-update
```

# function定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851492/acfd8ac0-385c-adc4-db4a-76f1f0c67a97.png)

# 実行結果
INVOKEボタンを押して実行

```bash
Connecting to www.mydns.jp (81.4.101.244:80)
writing to stdout
<html>
<head>
<title>Free Dynamic DNS (DDNS) for Home Server and VPS etc  | MyDNS.JP</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<LINK href="./site.css" rel=stylesheet type=text/css>

</head>
<BODY BGCOLOR="#FFFFFF"
      TEXT="#304040"
      leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"
>
Login and IP address notify OK.<BR>
login_status = 1.<BR>
<BR>
<DT>MASTERID :</DT><DD>mydns??????</DD>
<DT>REMOTE ADDRESS:</DT><DD>xxx.102.yyy.zzz</DD>
<DT>ACCESS DAYTIME:</DT><DD>2022/01/10 13:50:44 UTC</DD>
<DT>SERVER ADDRESS:</DT><DD>81.4.101.244</DD>
<BR>

</body>
</html>
-                    100% |********************************|   618  0:00:00 ETA
written to stdout
```

# 感想
Secret作成・参照するのではなく、実行時に与えるべき
ラビットチャレンジ 応用数学

##本記事について
ラビットチャレンジの応用数学のレポートです。
ラビットチャレンジはStudy-AI開講のE資格受験資格を得られる認定プログラムとなっています。

##線形代数

####スカラーとベクトル
- スカラー
    - いわゆる普通の数。
    - 加減乗除の演算ができる。
    - ベクトルに対する係数になれる。
- ベクトル
    - 大きさと向きを持つ。
    - 矢印で図示される。
    - スカラーとセットで表示される。

####行列
- 行列の基本
    - スカラーを表にしたもの または ベクトルを並べたもの。
    - ベクトルの変換ができる。

```math
{\begin{pmatrix}
1 & 2 & 3 \\
3 & 2 & 1
\end{pmatrix}
}
```

- 行列とベクトルの積

```math
{\begin{pmatrix}
6 & 4 \\
3 & 5
\end{pmatrix}
\begin{pmatrix}
1 \\ 2
\end{pmatrix}
=
\begin{pmatrix}
(6×1)+(4×2) \\
(3×1)+(5×2)
\end{pmatrix}
=
\begin{pmatrix}
14 \\ 13
\end{pmatrix}
}
```

- 行列と行列の積

```math
{\begin{pmatrix}
2 & 1 \\
4 & 1
\end{pmatrix}
\begin{pmatrix}
1 & 3 \\
3 & 1
\end{pmatrix}
=
\begin{pmatrix}
(2×1)+(1×3) & (2×3)+(1×1)\\
(4×1)+(1×3) & (4×3)+(1×1)
\end{pmatrix}
=
\begin{pmatrix}
5 & 5 \\
7 & 13
\end{pmatrix}
}
```

- 単位行列

対角成分が1、それ以外が0の行列

```math
{\begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}
}
```

####固有値と固有ベクトル
ある行列Aに対して、以下の式を考える。

```math
A\vec{x} = λ\vec{x}
```

行列Aとベクトル$\vec{x}$の積は、スカラーλとベクトル$\vec{x}$との積と同じ値になる。
この特殊なベクトル$\vec{x}$を行列Aに対する固有ベクトル、係数λを行列Aに対する固有値という。

固有値・固有ベクトルの例

```math
{\begin{pmatrix}
1 & 4 \\
2 & 3
\end{pmatrix}
\begin{pmatrix}
1 \\ 1
\end{pmatrix}
=
\begin{pmatrix}
5 \\ 5
\end{pmatrix}
=5
\begin{pmatrix}
1\\ 1
\end{pmatrix}
}
```
このとき、

```math
A=
{\begin{pmatrix}
1 & 4 \\
2 & 3
\end{pmatrix},
}
```
```math
𝜆=5,
```
```math
\vec{x}=
{\begin{pmatrix}
1 \\
1
\end{pmatrix}
}
```
となり、
行列Aについて固有値𝜆=5、固有ベクトル$\vec{x}={\begin{pmatrix} 1 \\ 1\end{pmatrix}}$である。

####固有値分解

ある実数を正方形にならべて作られた行列A（Aは正方行列）が固有値と固有ベクトルを持つとする。この固有値を対角線上に並べた行列Λ（Λは対角行列：対角線上以外の成分は0）

```math
{Λ = 
\begin{pmatrix}
λ_1 & \\
& λ_2 \\
& & \ddots
\end{pmatrix}
}
```
と、それに対応する固有ベクトルを並べた行列V（Vは正則行列：掛け合わせると単位行列になる）

```math
{V = 
\begin{pmatrix}
\vec{v_1} & \vec{v_1} & \cdots
\end{pmatrix}
}
```
を用意した時、それらは

```math
AV = VΛ
```
と関係付けられる。したがって

```math
A = VΛV^{-1}
```

と変形できる。このように正方形の行列を3つの行列の積に変換することを固有値分解という。この変換によって行列の累乗の計算が容易になる等の利点がある。


##確率

- 条件付き確率

事象Aが起こっているという条件で事象Bが起きる確率は下記の式のようになる。

$$
P(B|A)=P(B∩A)P(A)
$$

- 期待値

変数Xの取りうる値x1,x2,...,xnに対してそれぞれ確率p1,p2,...,pnが定まっているとき、変数Xを確率変数という。
また、下記のような式を、期待値という。

$$
\sum_{n=1}^{k}x_ip_i
$$

- 分散
$$V(X)=E(X^2)−(E(X))^2$$

- 標準偏差
$$σ=\sqrt{V(X)}$$

- ベルヌーイ分布
$$P(x|μ)=p^x(1−p)^{(1−x)}$$

- 二項分布
$$P(x|λ,n)=\frac{n!}{x!(n−x)!}λ^x(1−λ)^{(n−x)}$$

- 正規分布
$$N(x;μ,σ2)=\frac{1}{\sqrt{2πσ^2}}exp{(-\frac{(x-μ)^2}{2σ^2})}$$

##情報理論

- 自己情報量

自己情報量$I(x)$に対する確率分布を$P(x)$としたとき

```math
I(x)= -log\bigl(P(x)\bigr)
```


- 平均情報量（シャノンエントロピー）

自己情報量$H(x)$の期待値$E(x)$としたとき

```math
H(x)=E\bigl(I(x)\bigr)= -E\bigl(log\bigl(P (x)\bigr)
\bigr)= -\sum\bigl(P(x)log\bigl(P (x)\bigr)
\bigr)

```

- カルバック・ライブラー ダイバージェンス
同じ事象・確率変数における異なる確率分布P,Qの違いを表す。

```math
D_{KL}(P||Q) = 
E_{X\sim P}\begin{bmatrix}
log\frac{P(x)}{Q(x)}
\end{bmatrix}
=
E_{X\sim P}
\begin{bmatrix}
logP(x)-logQ(x)
\end{bmatrix}

```
- 交差エントロピー
PのエントロピーにPのQに対するKL情報量を足したもの

```math
H(P,Q) = H(P) + D_{KL}(P||Q) \\
H(P,Q) = -E_{X\sim P}  log(Q(x)
aws ds パイプライン構築時考慮事項のメモ


| 粒度 |  | 手段 | 特徴 or ユースケース |
| ---------------------- | ---------------------- | ---------------------- | ---------------------- |
| サービス |  | athena | 非構造化データ、半構造化データ、構造化データすべてが対象<br>データレイクから直でアドホックなSQLを実行したい場合<br>BIチームなどにも情報へ素早くアクセスしてほしい場合<br>例：アドホックな分析 |
|  |  | redshift | 構造化データに対するアナリティクスが対象 <br>スケールとパフォーマンスを追求する場合、より本格的なワークロードを実行したい場合。|
| テーブル作成 | parquetによるパフォーマンス最適化 | パーティション | モダンなクエリエンジンのストレージに対するプッシュダウンを活用してディスクの異なる領域にランダムにスキップすることなくデータをシークできるようにする |
|  |  | 辞書エンコーディング | 小数のカテゴライズされた列に対して各カテゴリを表す小数のビットでカテゴリを識別したいケース |
|  |  | 型圧縮 | (String,String)(Integer,Integer)のように効率的に保存 |
|  |  | ベクトル化集計 | 列指向フォーマットなのででぅすくコントローラがデータを1回だけ集計する。|
|  | ENCODE属性の付与による列の圧縮を通じたパフォーマンス最適化 | zstd | 汎用圧縮アルゴ<br>https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/zstd-encoding.html |
|  |  | az64 | Oct 8, 2019リリース。Amazon Redshift に保存されている数値および日付/時刻データの最適な解凍パフォーマンスが得られます。 |
|  |  | bytedict | 有限カテゴリに有効。https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_Byte_dictionary_encoding.html |
|  | SORTKEYによるパフォーマンス最適化 |  | よく参照するデータに応じてSORTKEYを設定 |
|  | DISTを使用したテーブル分散スタイル |  | **データの移動を最小限に抑える目的**<br>https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_choosing_dist_sort.html参照 |
|  |  | ALL 分散 |  |
|  |  | EVEN 分散 |  |
|  |  | KEY 分散 |  |
| レコード挿入時 | ETLタスクのテクニック | selectの結果をテーブルに取り込む | 例えばcast(year(date(hoge_date)) as INTEGER) as yearとして念を抽出した列を作成するなどすると手間は減る |
|  | コマンド | COPY | まだテーブルが存在しない時点で新たにS3等のデータソースからテーブルを作成する場合 |
|  |  | INSERT INTO | データがすでにテーブルとして存在し、データのサブセットをロードする場合 |


備考:
- 46993975×16列の行挿入で約5分ほどかかったので、1億レコードを超える場合はParquetを使うべきか
- UNLOADは3929550×16列をParquet形式で保存するので8m 37.9sかかった
【エラー解決】Missing required parameters：リンク先が表示されない

####Missing required parameters
上記エラーメッセージが表示されて、リンク先に画面遷移ができず苦戦した為、解決方法を残しておきます。

下記のようなファイルがbladeに記載がされていたとします。

```php:shop.blade.php
@foreach($users as $user)
    <a href="{{ route('shop.show'）}}">{{ $user->name }}店</a>
@endforeach
```

該当するルーティングはこのような記載が書かれています。

```php:web.php
Route::get('/shop/{shop}', 'UserController@show')->name('shop.show');
```

リンク先に画面遷移を行うと
Missing required parameters
画面にはこのようなエラー文言が出現してしまいます。

どうやらURLにパラメーターが渡せていない事が原因であったとの事です。


####解決策

ルートに$user->idを追記してあげます。


```php:blade.php
@foreach($users as $user)
    <a href="{{ route('shop.show', $user->id) }}">{{ $user->name }}店</a>
@endforeach
```
これでうまく画面遷移させる事ができました。
Python学習(入出力)(初心者)

# はじめに 
この記事は、約1年主にc言語を学んできた私がPythonに少しでも触れてみようとアウトプット用に書いたものです。ほとんどの方には参考にならないとは思います。間違い等あればご指摘いただけると嬉しいです。

# Pythonとは
まず、Pythonとは
>Pythonとは1991年にオランダ人のグイド・ヴァンロッサムというプログラマーによって開発され、オープンソースで運営されているプログラミング言語。Pythonのプログラミング言語としての主な特徴は、**少ないコードで簡潔にプログラムを書けること、専門的なライブラリが豊富にあること**などが挙げられる。
https://www.internetacademy.jp/it/programming/programming-basic/what-is-python.html
インターネット・アカデミー　IT業界まるわかりガイド　より

Pythonはコードを書きやすく、そして読みやすくするために生まれた言語らしく、だれがコードを書いても似たようなコードになるそうです。

#入出力
hello worldと入力して出力する。

```python
string = input("入力")
print(string)
```


* c言語の場合

```c
#include <stdio.h>

int main(void)
{
	printf("入力\n");

	char string1[15],string2[15];
	scanf("%s %s", &string1,&string2);

	printf("%s %s", string1,string2);

	return 0;
}
```

#c言語との違い

* 変数宣言がない(変数の型は代入された値によって自動的に決まる)
* c言語のようなライブラリ読み込みが必要ない
* 文末にセミコロンをつける必要がない
* main関数が必要ない

 など

#終わりに
今回この記事を通して、ほんの少しだけではありますがPythonの人気の理由が分かった気がしました。特に今までc言語、c#しかやってこなかった私にとってこんなに書きやすく、読みやすい言語があるのかと驚きました。今後も少しずつPythonについて学習していければよいと思います。
【Ruby】二重ハッシュ

※初心者向け
※アウトプット練習の為

開発環境
rails 6.1.4.1
ruby 2.6.5

##問題内容##
配列の内部に、複数のユーザーの情報をハッシュとして持つ変数user_dataがあります。

```ruby
user_data = [
 {user: {profile: {name: 'George'}}},
 {user: {profile: {name: 'Alice'}}},
 {user: {profile: {name: 'Taro'}}},
]
```

user_dataを利用して、全てのユーザーの名前だけが出力されるようにRubyでコーディングしてください。
ただし、出力結果は次のようになるものとします。

```
George
Alice
Taro
```

##解答##

```ruby
user_data.each do |u|
  puts u[:user][:profile][:name]
end

あるいは
user_data.each{ |u| puts u.dig(:user, :profile, :name) }
```
##解説##
ハッシュから特定の値を取得する場合は、その値に対応するキーを指定します。以下の書き方で取得ができます。

```csharp
ハッシュ[取得したい値のキー]
```
また、二重ハッシュから特定の値を取得する場合は、取得したい値のキーまで連続して指定すると取得できます。

```csharp
ハッシュ[取得したい値のキー][取得したい値のキー]
```
今回取得したい値は、George, Alice, Taroという値です。
よって、取得したい値に対応するキーはnameというキーだということが分かります。
そのため、nameというキーまで連続して指定すると、George, Alice, Taroという値を取得できます。

```csharp
ハッシュ[:user][:profile][:name]
```
また、今回は配列の中にハッシュが格納されています。
そのため、each文でハッシュの1つ1つを取り出した上で、上記の記述を行うことが必要です。

```ruby
user_data.each do |u|
  puts u[:user][:profile][:name]
end
```
発展的な別解として、digメソッドを用いても取得できます。digメソッドはRubyに標準で組み込まれているメソッドで、多重階層にあるハッシュの値をまとめて取得できます。
Docker Desktop for Macのアプリケーションとその関連ファイル全て削除する

Docker deamonだけでDockerを動かせるようにDocker Desktopをアンインストールして、その関連ファイルを全て削除します。

環境
OS: Mac OSX (Intel CPU)

まず以下のコマンドをターミナルで実行してください。(コピペで構いません)

```qiita:terminal
docker ps -q | xargs 
docker rm -f docker ps
docker images -q | xargs 
docker rmi docker system prune
```

続いて以下のコマンドを実行してください。(こちらもコピペで構いません)

```qiita:terminal
sudo rm -Rf /Applications/Docker.app
sudo rm -f /usr/local/bin/docker
sudo rm -f /usr/local/bin/docker-machine
sudo rm -f /usr/local/bin/docker-compose
sudo rm -f /usr/local/bin/docker-credential-desktop
sudo rm -f /usr/local/bin/docker-credential-ecr-login
sudo rm -f /usr/local/bin/docker-credential-osxkeychain
sudo rm -Rf ~/.docker
sudo rm -Rf ~/Library/Containers/com.docker.docker
sudo rm -Rf ~/Library/Application\ Support/Docker\ Desktop
sudo rm -Rf ~/Library/Group\ Containers/group.com.docker
sudo rm -f ~/Library/HTTPStorages/com.docker.docker.binarycookies
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
sudo rm -f /Library/LaunchDaemons/com.docker.vmnetd.plist
sudo rm -Rf ~/Library/Logs/Docker\ Desktop
sudo rm -Rf /usr/local/lib/docker
sudo rm -f ~/Library/Preferences/com.docker.docker.plist
sudo rm -Rf ~/Library/Saved\ Application\ State/com.electron.docker-frontend.savedState
sudo rm -f ~/Library/Preferences/com.electron.docker-frontend.plist
```

<参考記事>
[Docker Desctop for mac を cli から削除する](https://qiita.com/esu_eichi/items/72bcd5801971fee793fe)
受験談 AWS Certified Developer - Associate 認定

AWS Certified Developer - Associateを受験しました。

受験される方の参考になりましたら。

# 前提
2021年
8月：SAA [(受験談)](https://qiita.com/h2m_kinoko/items/5179bcb73b6773771f79 "受験談 AWS Certified Solutions Architect – Associate 認定")
9月：SAP
11月：SOA [(受験談)](https://qiita.com/h2m_kinoko/items/0b05378d96f4246bbdd0 "受験談 AWS Certified SysOps Administrator - Associate 認定")
12月：SCS [(受験談)](https://qiita.com/h2m_kinoko/items/20f06a746ab15540cd37 "受験談 AWS Certified Security – Specialty 認定")
2022年
1月：DVA（←今回ココ）

SAA受験談に私のAWSの事前知識・経験が書いてありますが、業務等での経験はほぼゼロです。

これまでUdemyの講座をかなり使用してましたが、今回は以下の3つの問題をひたすら繰り返してました。

# 書籍

### ポケットスタディ AWS認定 デベロッパーアソシエイト (アソシエイト試験ポケットスタディ) 


https://www.amazon.co.jp/%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-AWS%E8%AA%8D%E5%AE%9A-%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E8%A9%A6%E9%A8%93%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4798063401

ただ、分厚いのと小さいのが個人的には難点なのと、どの順番で受験するか？にもよると思いますが、とても細かく書かれている印象で全てを読む気にはなれなかった。各章ごと巻末に問題がついているので、問題だけを解く形で活用しました。


# 公式サンプル問題

次はこれですね。
10問ではありますが、雰囲気や難易度をつかむには十分かなと思います。

https://aws.amazon.com/jp/certification/certified-developer-associate/

# AWS BenchPrep認定試験練習

いつからか、「AWS Skill BuilderからAWS認定無料版模擬試験」が登場してました。前回のSCS受験の時から活用してます。20問の模擬問題を無料で受けられますし、一問一答で解説も全ての選択肢についているのでおすすめです。

https://amazonwebservices.benchprep.com/

# koiwaclub

こちらもSCSから使っているサイトです。
46x7で、全322問あります。とにかく問題数をこなしたいという感じで活用しました。

https://aws.koiwaclub.com/

# Googleスプレッドシート

ここからは毎度自分の定番なのですが、とにかく間違えた問題などを後でチェックできるようにその都度まとめてます。

# 実際の試験

これもどの認定試験から受験するかにもよると思いますが、SAAやSCSなどの蓄積があったのもあり、手応えとしては今までで一番あった気がします。それでもあいまいな記憶のまま回答したのも7、8問はありましたので、出題される問題にもよるかとは思いますね・・。

# まとめ

いつも合格したらそこで一度区切りと思うのですが、記憶があるうちに・・・となり、次の試験を目指す形になってます。ただ、このあととなるとプロフェッショナルかスペシャリティになるので、きっと今回こそ一区切りにしよっと。また受験談を書けたら書きたいなと思います。
TWELITE R R2 のピン配置とその対応

|TWELITE R   |TWELITE R2|TWELITE DIP(ピン/シルク/信号名)|
|:----------:|:--------:|:---------:|
|GND         |GND       |1 / GND / GND  |
|TX          |TXD       |10 / 6 / TX    |
|PG          |PRG       |7 / I / PWM3   |
|RX          |RXD       |3 / 7 / RX     |
|RST         |RST       |21 / R / RST   |
|/           |VCC       |28 / VCC / VCC |
|/           |SET       |26 / 2 / M2    |
Raspberry Pi 4 5GHzのWi-Fiに接続する

Raspberry Piはデフォルトの状態では5GHzのWi-Fiに接続することができません。その設定をメモ程度に載せようと思います。

```
$ sudo raspi-config
```

## Locatisation Options

![スクリーンショット 2022-01-10 22.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/c58c210c-7abe-104d-b62f-85c1fb66fd14.png)

![スクリーンショット 2022-01-10 22.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/615b63ae-b9d5-bd40-2026-2e0d63222c68.png)


![スクリーンショット 2022-01-10 22.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/2c9c1fd5-c54b-05ce-f68a-f03f24a042c3.png)

![スクリーンショット 2022-01-10 22.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/0e38e21d-d8d1-0a7c-2038-90fed6bc19cc.png)

## System Options

![スクリーンショット 2022-01-10 22.12.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/482d7416-27eb-70b7-9652-df4ebda49113.png)

![スクリーンショット 2022-01-10 22.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/17ab0c1a-3fe5-3d52-921c-e0d3f5958cde.png)

Wi-FiのSSIDとパスワードを打ち込みます。

![スクリーンショット 2022-01-10 22.23.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/b1c3deb6-6205-f267-8d0a-0308d3dd2cf1.png)

Finishをクリックしてその後に再起動させます。

![スクリーンショット 2022-01-10 22.21.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/47322bc7-afee-e11f-7938-d17916c4f28f.png)


これでOSを再起動
【GIS】pyproj で標高の計算

# はじめに

標高の計算はPROJでできるのは、下記のQiitaの記事で知っていました。

https://qiita.com/tohka383/items/e8392db87359e384a91e


おじさんもこれは以前に確認していました。

```
$ echo 34.290 135.630 0.0 | PROJ_NETWORK=ON cs2cs -f "%.4f" EPSG:6667 EPSG:6697
34.2900 135.6300 -39.8601
```

[EPSG:6667](https://epsg.io/6667)はJGD2011(Japan, Geodetic Datum 2011, 日本測地系2011)に対応するEPSGコードです。一方、[EPSG:6697](https://epsg.io/6697)はJGD2011にJGD2011(Vercical)として日本の標高に対応する参照系となっています。つまり、geoid高さを楕円体高さから引き算して標高になっている、というわけです。WGS84ということなら[EPSG:4326](https://epsg.io/4326)を参照しても良いようです。

実はこのCUIプログラム cs2cs を直接呼ばなくても、pyproj で標高計算ができることを確認したものでメモしておきます。

# PYPROJ

### 動作確認をとった環境

何度かこちらにも投稿していますが、座標系の変換を行ってくれるとても便利なライブラリでありプログラム群である PROJ にはpython libary として pyrpoj として公開されています。昔はPROJや pyproj のインストールに悩みましたが、最近はインストール作業をしていないせいか、昔は何が問題だったか忘れてしまいました。（多分、ライブラリのインストールとそのための環境変数の設定やパスを通すとか。。。^^;）

私のPC(Windows ノートPCでWSL2)の設定:

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
$ python -V
Python 3.8.10
$ proj
Rel. 8.1.0, July 1st, 2021
usage: proj [-bdeEfiIlmorsStTvVwW [args]] [+opt[=arg] ...] [file ...]
```

### PROJ_NETWORK

PROJ_NETWORK_ONに対応する設定をする。現在の状態は、pyproj.network.is_network_enagled()で見れる。

```Python
import pyproj
pyproj.network.set_network_enabled(True)
```

環境変数を設定できるのかもしれませんが、確実なのはプログラムでset_network_enabled(True) のが良いかも。

### 日本のジオイドモデルで変換する

Transformer のインスタンスを作って transform するだけです。

```Python
tr = pyproj.Transformer.from_crs(6667,6669)
p = tr.transform(34.290, 135.630, 0.0)
print(p)
```

で以下が出力されます。

```
(34.29, 135.63, -39.8601222393958)
```

日本以外の場所を入れたらどうなるか？と気になる方もいらっしゃると思いますが、軽くスルーされるだけでした。

```
In []: p = tr.transform(1.0, 2.0, 3.0)

In []: p
Out[]: (1.0, 2.0, 3.0)
```

### 世界のジオイドモデルで変換する

あとは使うEPSGコードさえ分かれば、他のジオイドモデルでも変換できます。
世界をカバーするジオイドも出るEGS2008では、[EPSG:6893](https://epsg.io/6893)で動作確認とれました。JGD2011(height)とは少し値が異なりますね。

```
In []: tr = pyproj.Transformer.from_crs(4326,6893)

In []: tr.transform(34.290, 135.630, 0.0)
Out[]: (15098262.536291692, 4043736.5764537766, -39.56243024291974)
```

で、それぞれのジオイドモデルとの変換ですが、とりあえず動かしてみたもののリストです。
ここではEGM2008を参照するEPSG3855のように垂直なモデルだけでなく、水平方向のモデルも含んだものを利用しています。

EPSG | 地域 | 名前
 --- | --- | ---
 6893 | 世界 | EGM2008
 ? | イギリス | OSGB 1936 / British National Grid -- United Kingdom Ordnance Survey
 6697 | 日本 | JGD2011 + JGD2011 (vertical) height 

## おまけ

何とかEGM2008で変換はできたが、各国のジオイオ度を用いる計算はまだできていない。

### 役に立ちそうなサイト

- [GEOID Calculator](https://www.unavco.org/software/geodetic-utilities/geoid-height-calculator/geoid-height-calculator.html
): UNAVOCOにあった役に立ちそうなページ。
- [PROJの Vertical CRS](https://pyproj4.github.io/pyproj/dev/api/crs/crs.html#verticalcrs
): これを調べるべきだったのかも。理解できていない。
- EPSGの中身の調べ方：projinfo でしら得られる。例：```
$ projinfo epsg:6669 -o WKT2:2019```
- ここ[https://qiita.com/Olivine-Ryo/items/7198ee768eb2b26492a4]によるとNETWORKについてはproj_data があれば不要になるとか。理解できていない。
- [vertical datum](https://vdatum.noaa.gov/docs/datums.html)

将来の課題として、
- 各国のGeoidoのEPSGと複合的なEPSG の整理
- GEOIDモデルを参照したいだけなのに、わざわざcompound な設定をしているCRSを参照するのは変な気がする。良い手があるのか要調査。
- EPSGの使いこなし。範囲内の判定とか。

今週も生き延びれるかな。もう疲れてきた。。。
(2021/10/10)
【SwiftUI】TabViewを使用した簡単なタブの実装方法

## コード

```swift
struct ContentView: View {
    var body: some View {
        TabView {
            FirstView()
                .tabItem {
                    Image(systemName: "1.square.fill")
                    Text("First")
                }
            
            SecondView()
                .tabItem {
                    Image(systemName: "2.square.fill")
                    Text("Second")
                }
            
            ThirdView()
                .badge(5)
                .tabItem {
                    Image(systemName: "3.square.fill")
                    Text("Third")
                }
        }
    }
}
```

<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663839/236193de-de56-c388-a187-a82932bdb49c.png">

TabViewで囲い各タブごとに表示したいViewを追加していきます。`.tabItem`にImageとTextを追加することでアイコンとテキストを表示できます。

```swift
ThirdView()
    .badge(5)
```

`.badge`で簡単にバッジを表示できます。