OmniAICreator/Qiita-1.07M huggingface dataset:
C#でAtCoder Beginners Selection（ABC086C - Traveling）

####準備
[C#でAtCoderデビューのための準備]
(https://qiita.com/azumabashi/items/7aa9e4b77c10970cc30a)
のあとで AtCoder Beginners Selection　をやってみました。

####問題文
ABC086C - Traveling
[https://atcoder.jp/contests/abs/tasks/arc089_a]
(https://atcoder.jp/contests/abs/tasks/arc089_a)

####提出結果

```
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        int N = int.Parse(Console.ReadLine());

        string result = "Yes";
        int tBefore = 0;
        int xBefore = 0;
        int yBefore = 0;
        for (int i = 0; i < N; i++)
        {
            string[] input = Console.ReadLine().Split(' ');
            if (result != "No")
            {
                int t = Math.Abs(int.Parse(input[0]) - tBefore);
                int x = Math.Abs(int.Parse(input[1]) - xBefore);
                int y = Math.Abs(int.Parse(input[2]) - yBefore);
                if ((t - (x + y)) < 0)
                {
                    result = "No";
                }
                else if ((t - (x + y)) % 2 != 0)
                {
                    result = "No";
                }
                tBefore = t;
                xBefore = x;
                yBefore = y;

            }
        }

        Console.WriteLine($"{result}");

    }
}
```

####テスト実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/4432abb6-39a3-9ec8-2a44-f0de94bf291d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/8c30adba-4e24-7803-bbd9-ca1f9b9d07ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/77186f91-a578-746a-d0f6-a3d16b80083a.png)
After Effects 2020のAEPをダウングレードするバッチを作った

#### はじめに
どうも、遊技機界隈でよくわからない仕事をしている下原です。
遊技機界隈の作業１つにオーサリングという作業があります。
こちらは簡単に言えば、映像用の基板（ハード）に組み込むための処理を行うために、映像作成ソフト（現在はほぼAfter Effects一択）を活用して組み込み処理のために中のデータを最適化する作業になります。
オーサリングについての詳しいルールについてはメーカーやハードによって異なりますし、説明をしだすと膨大になりますので今回は除外させていただきまして…。

そのオーサリングを行う際に、ハードの制約の都合上、古いバージョンのAfter Effectsで作成しなければならないという、映像制作者泣かせの仕様があったりします。

組み込み用のツールを作成した当時の最新バージョンだったり、或いはハード的な仕様の都合だったりと理由は様々らしいです（私もあまり詳しくありません…）

しかし、Adobe社のツールではダウングレードは2バージョン前しか行えないという仕様があり、修正の度にダウングレードを何度も行わなければいけないというAdobeの担当者（と古いバージョンを仕様する開発都合）をぶん殴りたくなるような問題などもあります。

そのため、この作業を簡略化できないかと思い、色々と調べてみました。

#### 探してみたところ
飯澤英俊さんという、これまた遊技機関連のAfterEffectsのツールを開発されている方が5年前に書かれていた記事を見つけました！

[下位バージョン保存補助バッチ(AEP Project)](http://ae-users.com/jp/resources/2016/04/%e4%b8%8b%e4%bd%8d%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e4%bf%9d%e5%ad%98%e8%a3%9c%e5%8a%a9%e3%83%90%e3%83%83%e3%83%81/
)

やったね！

…あれ、動かない？
あ、この処理はCC13までしか対応してない…（悲哀）

なので、現行の最新バージョンである、After Effects 2020 から After Effects CC2014(CC13) までのダウングレードのバッチ処理を作ってみた。

貴方の思い（勝手に）引き継ぎます！

####必要なもの
- After Effects CC2020(17)
- After Effects CC2018(15)
- After Effects CC2014(13)

ダウングレードするためにはもちろん、各バージョンのソフトが必要になります。
（横道に逸れますが、これが意外と厄介だったりもします）

####コード
##### CC2020からCC2018にダウングレードするバッチ

	@echo off
	setlocal ENABLEDELAYEDEXPANSION
	rem cc2020 -> cc2018
	for %%f in (*.aep) do (
		set nameStr=%%f
		set nameStr2=!nameStr:.aep=_cc2018.aep!
		set renameStr2=!nameStr:.aep=" コピー  CC (15.x).aep"!
		set fullPathStr=%CD%
		set aePathStr=!fullPathStr:\=/!
		set scriptStr="app.open(new File("!aePathStr!/!nameStr!"));app.executeCommand(4163);"
		set scriptStr=!scriptStr:""="!
		"C:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe" -s !scriptStr!
		rename !renameStr2! !nameStr2!
	)

##### CC2018からCC2014にダウングレードするバッチ

	@echo off
	setlocal ENABLEDELAYEDEXPANSION
	for %%f in (*_cc2018.aep) do (
		set nameStr=%%f
		set nameStr2=!nameStr:_cc2018.aep=_cc2014.aep!
		set renameStr2=!nameStr:.aep=" コピー  (CC (13)).aep"!

		set fullPathStr=%CD%
		set aePathStr=!fullPathStr:\=/!
		set scriptStr="app.open(new File("!aePathStr!/!nameStr!"));app.executeCommand(4035);"
		set scriptStr=!scriptStr:""="!
		"C:\Program Files\Adobe\Adobe After Effects CC 2018\Support Files\AfterFX.exe" -s !scriptStr!
		rename !renameStr2! !nameStr2!
		del !nameStr!
	)




飯澤さんが作られたバッチと一番異なる所は`app.executeCommand(4163);`と`app.executeCommand(4035);`のところです、なんと。 CC2020とCC2018は過去バージョンとダウングレードのCommandIDが違うという仕様になっており、そのまま置き換えて書き換えても動かないという問題があります。

これより過去のものは上記で紹介した飯澤英俊様の記事を参考にして組み合わせてご使用ください。

また、ダウングレードの際の「保存する」やバージョンに対応していないプラグインなどの確認の際にエンターやクリックが必要になってきます。
私の場合は、こちらの処理についてはUWSCも活用して力業で対応していたりします。

そこは環境によって変わってきそうなので今回は割愛させていただきます。

非常にニッチな処理であるAE Script、最新情報は国内にはほぼないので海外サイトや自分で調査するしかないっていうものですが、まだまだ利用者は多いのでマニュアル増えてくれ～、あと既存バグ許さん。
ClubhouseでプロフィールURLを取得する方法

#概要
ClubhouseのプロフスクショがTLを満たしていて
ふと
URLないの？と思ったのが発端です。

#ユーザーAPI?
念の為確認しましたが、下記はいずれも存在しません。
（私のアカウント: @tetsuyaimagawa）
https://www.joinclubhouse.com/tetsuyaimagawa
https://www.joinclubhouse.com/user/tetsuyaimagawa

#eventはURLが発行される
イベントを作成するとURLが発行されるので、試しに作ってみました。
https://www.joinclubhouse.com/event/myWzWKAe

これにAndroidやPC, 未インストールのiOSでアクセスすると下記のような画面が出てきます。

<img width="300" alt="ss" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/eb837cc1-900f-2909-b13b-8c0872c06fa6.png">

今のところ、イベントが終了してもページは削除されないようです。

過去のイベントを立てるとURLが発行できないので、未来を指定する必要があり、少なくとも一回イベントを開催する必要があるのが難点ですね。

#ID?
自分のアイコンは下記のような名前で保存されているようです。
https://clubhouseprod.s3.amazonaws.com:443/4254249_2734f5ba-e1e9-433a-8232-927d2bba9a03_thumbnail_250x250

![Screen Shot 2021-02-03 at 7.50.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/9066dc64-263c-1e41-a387-235f3b26823b.png)

ユーザーページを作らずリリースしても、これだけユーザーを獲得できるサービスに垂涎。
Vim + rust-analyzerでrustcを読むときのTips

# はじめに

Vim + rust-analyzerの環境でrustcを読もうとする際のおすすめ設定みたいなものを紹介します。対象をrustcとしていますが、厳密に言えば`cargo check`が一般的な動作にならないRustプロジェクトに適用可能なものになります。

# 設定

rustc-dev-guideにも[記載があります](https://rustc-dev-guide.rust-lang.org/building/suggested.html#configuring-rust-analyzer-for-rustc)が、rust-analyzerはデフォルトで`cargo check`を利用しています。ですがrustcはそれに相当するものとして`./x.py check`を使用します。そのため、チェック用のコマンドを上書きしておく必要があります。

ガイドではVSCodeを例としていますが、Vim環境の場合はcoc.nvimに対して設定することになります。ですが、グローバルな設定としてコマンドを上書きしてしまうと、rustc以外の通常のRustプロジェクトを開発する場合に対応できなくなってしまいます。そこで、[coc.nvimの設定方法](https://github.com/neoclide/coc.nvim/wiki/Using-the-configuration-file)を見てみると、プロジェクト直下に`.vim`ディレクトリを作り、そこに`coc-settings.json`を配置することで特定のプロジェクトにのみ設定を行うことができそうです。

```json:rust/.vim/coc-settings.json
{
    "rust-analyzer.checkOnSave.overrideCommand": [
        "./x.py",
        "check",
        "--json-output"
    ],
    "rust-analyzer.rustfmt.overrideCommand": [
      "./build/TARGET_TRIPLE/stage0/bin/rustfmt"
    ],
    "editor.formatOnSave": true
}
```

これでrustcのプロジェクトに対してのみ、チェック用のコマンドを上書きすることができました。

rust-analyzerの設定はできましたが、プロジェクト内に新たなディレクトリを作成したので、このままでは`.vim`がGitで引っかかってしまい使いづらくなってしまいます。プロジェクトの`.gitignore`を見ても、`.vim`は無視する対象に含まれていないようです。ちなみに`.vscode`は含まれています、、`.vim`も追加するように要望を出していいかもしれませんが、冒頭のコメントには`.git/info/exclude`を使うように書いてあります。

```bash:rust/.gitignore
# This file should only ignore things that are generated during a `x.py` build,
# generated by common IDEs, and optional files controlled by the user that
# affect the build (such as config.toml).
# In particular, things like `mir_dump` should not be listed here; they are only
# created during manual debugging and many people like to clean up instead of
# having git ignore such leftovers. You can use `.git/info/exclude` to
# configure your local ignore list.
```

なので素直にそうしましょう。`.git/info/exclude`に記載することで、プロジェクトの`.gitignore`に記載することなく、ローカルのファイルを無視することができます。

```bash:rust/.git/info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
.vim/
```

# おまけ

rust-analyzerはrustcみたいな巨大なプロジェクトを読み込むと結構メモリを消費するようなので、Vimを複数立ち上げて使ったりするとそれなりの負担になってしまいます。タブとかを使うことでうまく効率化できるので、そのあたりはマシンスペックと相談しながら使っていくといいのではないでしょうか。
【Mono Depth】Mono Depth2 : 3種類のlossを計算するテクニック

<h1>Digging Into Self-Supervised Monocular Depth Estimation</h1>

MonoDepth2は従来研究に3つのlossの計算方法を導入しSOTAを獲得した。

<h1>新規性</h1>
<h2>Per-Pixel Minimum Reprojection Loss</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/64aac699-63ad-042b-2ddb-be326ac033ab.png)
photometric errorを複数のframeから計算し、一番errorが小さいものをlossとして定義する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/98158ed1-5dec-dbb5-9cf2-db736213c29f.png)

図にあるようにerrorが大きいものはOcclusionとしてと考えられ、それを無視する事でより良いlossを計算できる。

<h2>Auto-Masking Stationary Pixels</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/72244aac-bdd3-7ed1-cb9a-c70fa68386ea.png)
左辺:warpさせたImageのphotometric loss
右辺:2つのframe間のPhotometirc Loss

左辺が小さい時: 推定が上手くいった時
右辺が小さい時：Cameraが動いていない or 物体が同じ速度で動いている

よって
右辺のが小さい場合にμが0となり、maskingされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/4f7e4086-2172-12a4-adb2-1d7ff879206f.png)
上図: 同じ速度で動いてる物体はmaskingされている
下図: cameraが動いていないので、画像全体がmaskingされている


<h2>Multi-scale loss</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/d79b0aac-e33f-e767-e86f-3401ffc6fcec.png)
複数の解像度でDepthを推定する。
baselineでは解像度の大きさのままlossを計算していたが、upsampleしてからlossを計算すると精度が上がる事が分かった。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f4706d7b-1826-29b8-139f-61739483e4db.png)
min reprojection / auto-masking / full-res multi scaleのどれをなくしてもerrorが大きくなっている事が分かる。
よって3つとも効果的である事が示された。

<h1>結論</h1>
・lossをより良く定義出来れば、精度はあがる。

<h1>参考文献</h1>
Digging Into Self-Supervised Monocular Depth Estimation
https://arxiv.org/pdf/1806.01260.pdf
読書会「プログラマが知るべき97のこと」 #10

# 1．今回の読んだ記事
No.6　[リファクタリングの際に注意すべきこと](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E9%9A%9B%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%99%E3%81%B9%E3%81%8D%E3%81%93%E3%81%A8/)　
著者: Rajith Attapattu

# 2．記事の概要
**既存のコードを活かす**

+ リファクタリング対象のコード、テストの徹底的な掘り下げが必要
    + 良い点、悪い点、コスト
+ そのリファクタリングが本当に必要なのか？
    + どんなにひどいコードでも、一度テストに通っているコードを変更してまでリファクタリングする必要があるのか


# 3．この記事を選んだ理由・感想
**理由**

+ 現在業務でリファクタリングを行っているため、何か活かせないかと思った
+ いままでプログラミングを学習しているときに、リファクタリングまで行ったことがなかったため

**感想**
今までに必要になった時にリファクタリングはするものだと安易に考えていたが、「それが本当に必要なのか？」を極限まで考える必要があることを学んだ。

# 4．議論
**リファクタリングにおいて、失敗したことはありますか？**

   + やらなかったほうがよかったと思ったこと、またその理由を教えてください
     + やらないほうがよかったことがあります！（各自、経験談を語る）
        + 修正した結果、画面に表示されなくなってしまった
        + 冗長な記載があったので修正したが、画面表示がおかしいところが発生してしまった
            + テストが不足していたと思う
            + すぐに気づいて修正したので問題にはならなかったのでよかった
        + 内部ツールなので大ごとにはならなかったが、リファクタリングで修正したことにより問題が発生してしまった
 
**リファクタリングをする際の注意点、気にすること**

- 変数、メソッド名などの命名を気を付ける
- 無駄な処理がないか、代替で利用できるライブラリがないかも検討する
- 処理が停止するところに着目して、おかしな値が入ることがないのかを見る（例えばNULLが入る可能性など）
- 設計書通りに作られているか、動作が変わらないか
- 再度ちゃんと試験するならば、必要のあるリファクタリングは実施してよいのでは？
	
# まとめ
今回は配属された新人さんが担当になったので、いきなり任されて大変だったかもしれない。
それでも頑張ってまとめをして議題も出してくれたこともあり、話も弾んで新しいメンバーによる発表は新鮮だった。


# 総括
実は今回が最終回です。
１年間やってきたけれど、やってみてどうだったのかを一度みんなで振り返りをやりたい。
次のシーズンも「もう少し続けたいな」と思うが、他にやりたいことが出てきたのでいったんこの読書会は終了します。

**よかったこと**

- 短いエッセイだったので手間をかけずに読めるため、続けやすかった
- 担当者を決めて話しい内容を事前に議題にまとめてもらったので、議論はスムーズだったと思う
- いろいろな意見が聞けて、メンバーとコミュニケーションするためのいい機会になった（お酒を飲みながら開催できたり）

**改善したいところ**

- テーマが偏ったなかと感じる。同じ業務なので志向が偏ってしまった感じがあって、毎回全然違ったテーマが取り上げられることがあったらよりもおもしろかったかもしれない
- 議題以上に盛り上がるのは難しかった気がする（おしゃべりな人が少ないから・・・？）
AWSセキュリティ学習　インシデント対応メモ

AWSにおけるインシデント対応のメモです。
最近AWSのセキュリティに関する学習を始めたので、その勉強内容を備忘録として残します。
間違った認識があった場合はご指摘いただけますと幸いです。

###侵害されたインスタンスを検知したときの対応

|環境|対応|調査|
|---|---|---|
|オンプレミス|物理的にサーバーを手動でネットワークから切り離すことで対応する|切り離したサーバーをフォレンジックラボで解析する。
|AWS|セキュリティグループを変更し、ネットワークから隔離する|変更したセキュリティグループにフォレンジックインスタンスがアクセスできるように変更し、解析を行う。

※フォレンジック…コンピュータの中にあるデータや通信の記録などを調査すること(侵害されたインスタンスの分析に用いる)

![security.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048766/f21b1264-5488-28d4-b981-60b62b9ce428.png)


###アクセスキーが漏洩した場合の対応順
1. 認証情報を無効にする
    2. 公開された認証情報を無効にする
    3. 必要に応じて、公開されたアクセスキー削除する<br>(※削除すると同じアクセスキーを設定したインスタンスへのアクセスができなくなるため)
4. 特権的アクセスを取り消す
    5. 「IAMを拒否する」ポリシーを該当のユーザーにアタッチする
    6. 未処理のセッションをすべて取り消す
7. IAMアクセスキーのソースを確認する
    8. どのユーザーにアクセスキーが関連付けられているかを追跡する
    9. アクセスキーに関連付けられているポリシーの範囲を調べる
10. 整合性を確認し、影響範囲を調べる
    11. CloudTrail と AWS Config を使用して、証跡を確認する
    12. 他の IAM アクセスキーや認証情報が問題にならないかを検討する
grpc + ssl + azure instance でNo match found for server name:　となるときのエラー回避備忘録

## 概要

grpc クライアントとサーバの間でssl通信を行うとき、
ssl 鍵をopensslなどで生成し、各サーバに置く。

いざクライアント側から通信を実行しようとすると、

```
No match found for server name:
```
のようなエラーが出る。

サーバをクライアントとサーバの２台にわけずに、
一台でサーバ、クライアントを立て、docker-compose up などするときは、

```
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
```

等のコマンドを用い、

```
Generating a RSA private key
........................................................+++++
.....+++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*******  
Email Address []:


```

の `Common Name` のところに、サーバサイドのip（すなわちdocker-compose であればservice の名前で解決される) を書けばよかった。



## 解決策

単純ではあるのだが、grpc + sslをおこなうときに

` ドメインのみを使うことが許されており、IPは使えない　` 

ということだった。

https://zhuanlan.zhihu.com/p/35507832
上のブログに助けられた。


したがって、サーバサイドのインスタンスにドメインを振った後、それを先程の
`Common Name`に書いて鍵を生成、その後scpしてから通信を行うとうまくいった。
Unsupported type: NSPersonNameComponents (found in field fullname) 型に注意

###【iOS】Sign In with Apple をドキュメント通りに使っていると
```
if let code = appleIdCredential.authorizationCode { 
   authorizationCode = String(bytes: code, encoding: .utf8)
}
let userIdentifier = appleIdCredential.user
let fullName = appleIdCredential.fullName
let email = appleIdCredential.email
```

こんなクラッシュが。
```Unsupported type: NSPersonNameComponents (found in field fullname)
```

fullnameはString型ではなく、PersonNameComponents型でした。

##まとめ
プログラミングを始めたてのころは型のことなんてそっちのけでした。
そんな過去の自分に向けた戒めかつ、誰かしらの救いになればいいと思っています。
DockerでPHPの環境を構築する①

必要とする要素は
・PHP
・Apache
・MySQL
であり、そのうち今回はPHPとApacheを用意してindex.phpを実行させるシンプルな環境を構築する。
しかし、公式でPHPとApacheがセットになっているイメージが提供されているから、それを使用する。

#ディレクトリ構成

```
Docker-|-Dockerfile
       |-index.php
```

となっており、デスクトップ上にDockerというディレクトリを作成している。
その中にDockerfileと実際のPHPのソースコードのindex.phpが存在している。

##ステップ①　index.phpを作成する

```php:index.php
<?php
echo 'hello world';
```

`hello world`を表示するシンプルなソースコード。

##ステップ②　Dockerfileを作成する

```:Dockerfile
FROM php:7.2-apache
LABEL maintainer="carametal"
COPY ./ /var/www/html/
```

COPY命令でカレントディレクトリをコンテナの/var/www/htmlにコピーすることで
カレントディレクトリのindex.phpとDockerfileが/var/www/html配下にコピーされる。
Apacheは「IPアドレス/」へのアクセスに対して/var/www/html/index.phpをデフォルトで実行する。

##ステップ③　イメージを作成する（ビルドする）

```termial:Desktop/Docker
docker build -t php7.2-apache .
```

##ステップ④　コンテナを作成し、実行する

```terminal:Desktop/Docker
docker container run -p 8000:80 --name php-test php7.2-apache
```

これでApacheサーバが立ち上がって、
`localhost:8000`で`hello world`が表示される。

サーバーを停止する時は、`Cntroll + c`で停止する。

###ちなみに①

```:Desktop/Docker
docker container run -p 8000:80 --name php-test -v ${PWD}:/var/www/html php7.2-apache
```

こっちのコマンドでコンテナを起動すると、リアルタイムにPHPの変更された場所が反映される。

###ちなみに②

```:Desktop/Docker
docker container run -d -p 8000:80 --name php-test -v ${PWD}:/var/www/html php7.2-apache
```

とすると、バックグラウンドで起動できるから、ターミナルが使えるようになる。

###ちなみに③
バックグラウンドの状態（-d)の状態だと、ターミナルが使えてコンテナの中に入ることができる。

```:Desktop/Docker
docker exec -it php test bash
```

そうすると、Linuxのフォルダが一覧できる。
コンテナから抜ける場合は

```Desktop/Docker
exit
```

とコマンドを打つと抜けられ、
バックグランドの状態だと`controll + c`が使えないから、

```Desktop/Docker
docker stop php-test
```

と打つと、コンテナが停止される。
【Vue.js】コンソールに表示される、sockjs.js net:ERR_CONNECTION_TIMED_OUTの解決策

#出たエラー
VueCLI ver4.3.1環境下でWebアプリ開発をしていると、コンソールに以下のエラーが出ました。
![スクリーンショット (449).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513585/01ba6266-d6bd-9f6b-f2c3-c2e81ba16a96.png)

このエラーが出ていてもプロジェクトには影響がなかった~~（本当になかったのかは不明）~~のですが、やはりエラーが出続けるのには我慢ならなかったので、適当なワードでググると解決策を見つけることが出来ました。
>Vue sockjs.js net:ERR_CONNECTION_TIMED_OUT error report solution
>https://www.programmersought.com/article/34136112891/

#解決策
このエラーを解消するのは非常に簡単です。
まず、node-modules/sockjs-client/dist/sockjs.jsファイルを探してください。
![スクリーンショット (446).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513585/36f93bf1-432d-155e-ba78-f6faa4c62c3f.png)

そして、sockjs.jsファイルの1609行目
```self.xhr.send(payload);```
の1行をコメントアウトしてください。（参考にしたサイトでは1606行目だったので、バージョンによって違うかもしれません）
![スクリーンショット (447).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513585/d9628962-f6fb-62de-2634-d9071a5f42e2.png)

これでコンソールを見てみると、確かにエラーは消えました。
![スクリーンショット (451).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513585/84fd6a47-51e2-cbe2-450e-75f6982de6f1.png)
C#でAtCoder Beginners Selection（ABC049C - 白昼夢）

####準備
[C#でAtCoderデビューのための準備]
(https://qiita.com/azumabashi/items/7aa9e4b77c10970cc30a)
のあとで AtCoder Beginners Selection　をやってみました。

####問題文
ABC049C - 白昼夢
[https://atcoder.jp/contests/abs/tasks/arc065_a]
(https://atcoder.jp/contests/abs/tasks/arc065_a)

####提出結果

```
using System;
 
class Program
{
    static void Main(string[] args)
    {
        string S = Console.ReadLine();
        // dream dreamer erase eraser
        string dm = "dream";
        string dmr = "dreamer";
        string er = "erase";
        string err = "eraser";
        int dml = dm.Length;
        int dmrl = dmr.Length;
        int erl = er.Length;
        int errl = err.Length;
        string chkS = S;
        string result = "YES";
        while (true)
        {
            if (chkS.Length >= dml)
            {
                if (chkS.Substring(chkS.Length - dml, dml) == dm)
                {
                    if (chkS.Length == dml)
                    {
                        break;
                    }
                    else
                    {
                        chkS = chkS.Substring(0, chkS.Length - dml);
                        continue;
                    }
                }
            }
            if (chkS.Length >= dmrl)
            {
                if (chkS.Substring(chkS.Length - dmrl, dmrl) == dmr)
                {
                    if (chkS.Length == dmrl)
                    {
                        break;
                    }
                    else
                    {
                        chkS = chkS.Substring(0, chkS.Length - dmrl);
                        continue;
                    }
                }
            }
            if (chkS.Length >= erl)
            {
                if (chkS.Substring(chkS.Length - erl, erl) == er)
                {
                    if (chkS.Length == erl)
                    {
                        break;
                    }
                    else
                    {
                        chkS = chkS.Substring(0, chkS.Length - erl);
                        continue;
                    }
                }
            }
            if (chkS.Length >= errl)
            {
                if (chkS.Substring(chkS.Length - errl, errl) == err)
                {
                    if (chkS.Length == errl)
                    {
                        break;
                    }
                    else
                    {
                        chkS = chkS.Substring(0, chkS.Length - errl);
                        continue;
                    }
                }
            }
            result = "NO";
            break;
        }
                 
        Console.WriteLine($"{result}");
    }
}
```

####テスト実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/d745991d-0daf-b217-df24-1f0c7a6d7441.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/1d5fef2d-79b0-4b09-acfe-3f0ccae91779.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/bb56ca55-5841-442a-511b-772c7bdebf27.png)
【備忘録】react-reduxを使ってカレンダーを切り替えられるようにする

#基本的な設計
storeには以下のような形のstateを登録する。

```js
calendar:{
  year: number;
  month: number;
}
```

このオブジェクトを元にカレンダーを作成している。
カレンダーの月を切り替えるボタンを押すとactionがdispatchされ、storeの情報が更新される。それによりカレンダーを表示しているコンポーネントがレンダリングされ、表示が切り替わる。

1.actionの定義

```js
export const CALENDAR_SET_MONTH = "calendar/monthChanged"

export const calendarSetMonth = (payload) => ({
  type: CALENDAR_SET_MONTH,
  payload
});
```

2. reducerの定義

```js

const day = dayjs(); //その日のdayjsオブジェクトを取得

const init = formatMonth(day); //別ファイルで定義した関数。dayを{month: number, year: number}の形に整形する。

const calendarReducer = (state = init, action) => {
  const { type, payload } = action;
  switch (type) {
    case CALENDAR_SET_MONTH:
      return payload;
    default:
      return state;
  }
}

export default calendarReducer;
```

今後、別のreducerを作成する予定なので別のファイルでcombineReducersをしておく。

```js
const rootReducer = combineReducers({calendar: calendarReducer});
```

トップのコンポーネントでstoreに登録しておく。


2.presentational componentとの接続

```
const EnhancedPresentation = () => {
  const month = useSelector((state) => state.calendar);
  const nextMonth = getNextMonth(month); //次の月を取得する関数。別ファイルで定義済み。
  const previousMonth = getPreviousMonth(month); //前の月を取得する関数。別ファイルで定義済み。

  const dispatch = useDispatch();

  
  return (
    <Presention
      setNextMonth = {() => dispatch(calendarSetMonth(nextMonth))}
      setPreviousMonth = {() => dispatch(calendarSetMonth(previousMonth))}
    />
  )
}
```

あとはpresentational componentで`setNextMonth`と`setPreviousMonth`をコールすればstoreのstateが変化する。
カレンダーを表示しているコンポーネントもstoreと接続するのを忘れないように。
Miroのボードをチーム外に共有する

# 前置き
Miroは、オンラインホワイトボードです。
https://miro.com/index/

社内では、開発チームで資料を作ったり、KPTをしたりと活用しています。
資料については、チーム外へ共有することもあります。
有料プランの場合の共有方法が分かりづらかったので、まとめました。

# チーム外への共有方法
TeamやBusinessの有料プランの場合、チームのメンバごとに課金されます。

普段使わないメンバについては課金を避けたいので、チームに追加しないで共有しています。
この場合は基本的に、閲覧かコメントしかできません。
編集もしてもらいたい場合は、チームへの追加(課金)が必要です。
ゲストユーザーの場合は、編集してもらうことも可能です。

## Miroアカウント無しで共有する場合(ゲストユーザー)
共有URLを使えば、Miroアカウント無しで共有できます。
ゲストユーザーとなるため、誰が編集したかなどはわかりません。
https://help.miro.com/hc/en-us/articles/360012524559-Collaboration-with-Anonymous-Guest-Editors

そのときだけ見せたい場合はこの方法が便利です。
ただし共有URLを知っていればアクセス可能になるため、必要なとき以外は`No access`にしておくことをお勧めします。

1. 共有したいボードの右上「Share」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/a9fd8334-aee1-687d-9900-9fc7847f9efb.png)

1. 権限を指定して、共有URLを作成する
<img width="450px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/1e2b8cc7-fb70-607f-37d0-a170d8b44103.png">

## 既存のMiroアカウントに共有する場合
1. 共有したいboardを開いてもらい、閲覧リクエストを送ってもらう
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/3cb56b78-0fa4-6556-e49a-36c83813be66.png">

1. そのボードの通知欄に閲覧リクエストが来ているので、承認する
(権限は、閲覧のみ`Can view`かコメントのみ`Can comment`を選ぶこと)

## Miroアカウントを新規登録してもらって共有する場合
招待リンクからアカウント登録してもらうことで、初めからそのボードへの権限を付与できます。
https://help.miro.com/hc/en-us/articles/360017730813-Sharing-Boards-and-Inviting-Collaborators#h_2ba0540a-a5e8-4e35-bfc4-7715a3e7bc99

1. 共有したいボードの右上「Share」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/a9fd8334-aee1-687d-9900-9fc7847f9efb.png)

1. 招待リンクを作成する
(権限は、閲覧のみ`Can view`かコメントのみ`Can comment`を選ぶこと)
<img width="450px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/5a310b82-1b48-28b9-44ac-5bd3430b0c64.png">

1. 招待リンクからアカウント登録してもらう

# 共有状況の確認方法
そのボードの共有状況を確認するには、Share > Sharing settings で確認できます。
<img width="450px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/e7db2564-16c7-90ff-3987-70ddc0ee32bd.png">

また、Miroチームとしての状況は、dashboard > :gear:チーム名 > Active users で確認できます。
`Non-team user`となっていれば、チーム外なので課金対象外となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/27a654f7-d7bc-cecb-0bd5-7d082876e7cc.png)

# 注意
「Share」で`Team access to board`の方を変えてしまうと、メンバー全員のそのボードでの権限が変わってしまいます。
プルダウン変更したら即反映されてしまい、とても焦りました:persevere:
うっかり編集できない権限にしてしまった場合、そのボードのオーナーに変更してもらう必要があります。
<img width="450px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628295/e19ae5a8-1f9d-f488-ea9f-e72f7706ab76.png">

# 公式のヘルプページ
「Non-Team User」は無料。
https://help.miro.com/hc/en-us/articles/360017571514-Account-Access-Levels

「Non-team User」として招待するには、「Viewers」か「Commenters」にしておけばOK
https://help.miro.com/hc/en-us/articles/360017571214#active
【Flutter】【Firestore】FutureBuilder<->StreamBuilderに切り替える

## はじめに
FlutterでFirestoreを使う際に題のような切り替えをする際の備忘録。
FutureとStreamの違いに関しては[こちら](https://www.indetail.co.jp/blog/dart-async/)の記事が参考になった。

## やりかた
それぞれ以下のように対応させる。
### FutureBuilder
```dart
class ListFuture extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<QuerySnapshot>(
      future: FirebaseFirestore.instance.collection('hoge').get(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return new Text('Loading...');
          default:
            return new ListView(
              children: snapshot.data.docs.map((DocumentSnapshot document) {
                return new ListTile(
                  title: new Text(document['hige']),
                  subtitle: new Text(document['hage']),
                );
              }).toList(),
            );
        }
      },
    );
  }
}
```

### StreamBuilder
```dart
class ListStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: FirebaseFirestore.instance.collection('hoge').snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return new Text('Loading...');
          default:
            return new ListView(
              children: snapshot.data.docs.map((DocumentSnapshot document) {
                return new ListTile(
                  title: new Text(document['hige']),
                  subtitle: new Text(document['hage']),
                );
              }).toList(),
            );
        }
      },
    );
  }
}

```
Segueを使わずにセルの値を遷移先へ送る方法/セルの一つにチェックマーク入れる、外す方法

送る側

``` SolvedViewController.swift


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let storyboard = UIStoryboard(name: "Detail", bundle: nil)
    //DetailVCインスタンスを作成するのと、キャスト
    //ここのasがないとnextViewのデータ型とDetailVCの型が異なるのでエラーが起きる
    if let nextVC = storyboard.instantiateInitialViewController() as? DetailViewController {
        nextVC.questionTitle = quizList[indexPath.row].question
        present(nextVC, animated: true, completion: nil)
    }
}
```

受け取る側

``` DetailViewController.swift
@IBOutlet weak var questionLabel: UILabel!
//SolvedVCから送られてくるセルの情報を入れるための箱を作る
var questionTitle: String?
    
override func viewDidLoad() {
    super.viewDidLoad()
    //SolvedViewControllerと接続したLabel.textに、送られてきた情報を入れる
    questionLabel.text = questionTitle
}
```

すげー悩んだので備忘録的な感じで書きました。なのでだいぶ短いです。
もっと広く書く必要が出たら追記します。


セルにチェックマーク入れる方法

```swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
```

セルの「一つのみ」にチェックマークを入れるようにするにはこれも追記

```swift    
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
Google SignIn for iOS ログアウト→その端末でメールアドレスで再登録→ログインで少し困った話。

Google SignInをFirebaseで使っていて、少し困ったことが。
viewDidLoadにて、GIDSignIn.sharedInstance()?.restorePreviousSignIn()でログインが必須の状態だと、
GIDSignIn.sharedInstance()?.signOut()でログアウトしたあとに、そのまま別のメールアドレスアカウントでログインすると。

```
if (GIDSignIn.sharedInstance()?.hasPreviousSignIn()) == false
```

この条件だけだと
キャッシュが残っているのかGoogleアカウントとして判定されてしまう。

####こんなニッチな悩みを解決してくれたのがこれ
```
if (GIDSignIn.sharedInstance()?.hasPreviousSignIn()) == false
 || GIDSignIn.sharedInstance()?.currentUser == nil
```



##さいごに
ひとりでも同じ悩みを持った人に届けば幸いです。
Xcode12&iOS14でUIDatePickerがクラッシュするようになった件について

# はじめに
iOS14がリリースされて4ヶ月経ちましたね。
時間が経ってしまいましたがようやくXCode12に対応しました。

しかしXCode12対応版をリリースしたところ、
**コードを変更した覚えの無い日付入力フォーム**からクラッシュ報告が届くようになりました。

# クラッシュ箇所のコード
```Sample.swift
@IBOutlet private weak var datePicker: UIDatePicker!
~~~中略~~~
self.datePicker.setValue(false, forKey: "highlightsToday")
```

# 原因
iOS14 (13.4) では**UIDatePickerに更新**が入りました。
その際に**iOS13までは見た目がwheelsのみ**でしたが、
スタイルのパラメータが追加され**見た目が指定できる**ようになりました。

```UIDatePicker.swift
@available(iOS 13.4, *)
public enum UIDatePickerStyle : Int {    
    /// Automatically pick the best style available for the current platform & mode.
    case automatic = 0

    /// Use the wheels (UIPickerView) style. Editing occurs inline.
    case wheels = 1

    /// Use a compact style for the date picker. Editing occurs in an overlay.
    case compact = 2

    /// Use a style for the date picker that allows editing in place.
    @available(iOS 14.0, *)
    case inline = 3
}
```

出典：[UIDatePickerStyle](https://developer.apple.com/documentation/uikit/uidatepickerstyle?changes=_7)

指定していない場合はもちろん**automatic**になります。
そして何の見た目が使われるかは**端末のバージョンに依存**するようになります。

iOS13系では**wheels**になりますが、iOS14では**wheels以外**になるようです。

今回の更新でXCodeを11から12に移行した為に上記コードが適用され、
見た目が**automatic**になり、**highlightsTodayが存在しないキーとなりクラッシュ**したようです。

# 対応
以下のコードを追加することで見た目の指定が出来ます。
iOS13.4以降なので、Targetが13.4未満の場合は要求バージョンの指定が必要になります。

**今後iOS14以降をターゲットにする新規プロジェクトではデザインする際、
どの見た目を利用するかを検討する必要があるといえます。**

```Sample.swift
if #available(iOS 13.4, *) {
    self.datePickerView.preferredDatePickerStyle = .wheels
}
```


# 補足
iOS14で追加された見た目は以下のようになります。
上記のようにiOS14では**UIDatePickerStyle**を明記する必要があります。

|OS|automatic|compact|compact(タップ時)|inline|wheels|
|:---:|:---:|:---:|:---:|:---:|:---:|
|iOS14|![IMG_0137.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58367/e2c73331-9fe2-6559-1084-416abeb473de.png)|![IMG_0137.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58367/e2c73331-9fe2-6559-1084-416abeb473de.png)|![IMG_0138.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58367/ad918d91-4972-2b73-90cd-35e33bec558d.png)|![IMG_0136.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58367/3a2f64e7-089f-d3f8-3291-aca47995aa33.png)|![IMG_0135.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58367/d5964930-d964-6eca-e873-f0f4b986633a.png)|
|iOS13|![IMG_0135.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58367/1d9b778e-1f13-b326-27f8-d48ad22b51a3.png)|-|-|-|-|




以上
動的計画法（DP）の漸化式を基礎から理解 - 蟻本

# 最初に

この投稿は [動的計画法（DP）の漸化式を基礎から理解-Frog 1](https://qiita.com/nord2sudjp/items/aad0966a7399ebb332be "動的計画法（DP）の漸化式を基礎から理解-Frog 1")の続編になります。Frog 1は1次元のDP問題でした。今回は2次元のDP、おそらくDP初心者にとって最初の難関となるナップザック問題について説明します。

前回と同じく再帰、もしくはメモ化再帰は取り扱いません。競技プログラミングでは漸化しでないと、TLEもしくはメモリエラーになることが多いためです。

# 問題

蟻本 P51より

重さと価値がそれぞれW(i)とV(i)であるようなら、n個の品物があります。これらの品物から、重さの総和がWを超えないようにえらんだときの価値の総和の最大値を求めなさい。

入力
n=4
(w,v) = ((2,3), (1,2), (3,4), (2,2))

# 貰うDP
貰うDPの漸化式はP55に記載されています。こちらを順番に説明していきます。

## DPテーブルの説明
DPテーブルは縦軸がナップザックに入っている品物の数、横軸がナップザックに入っている品物の重さになります。項目は価値です。この項目を最大化することが目的となります。

![2021-02-01_17h03_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/e587e702-ee6c-637c-efd6-113c25477e03.png)

## 初期値の設定
まずは初期値を設定します。今回は２次元のために初期値は２つの軸に分かれます。

1. 品物数=0の時に価値は必ず0になります。
2. 重さ=0の場合には品物はないために、価値は必ず0となります。
![2021-02-01_17h08_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/9765faed-72bb-afd0-9a8c-bdd7dde7fc87.png)

## 一つ目の品物ついて更新する。
ひとつめの重さ=2, 価値=3となります。横軸の1について順番に更新します。
まずナップザックの重さ=1の場合には、品物の重さより小さいために入れることができません。よって重さ、価値ともに変化はありませんので、ここは0となります。
![2021-02-01_17h17_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/40775277-899b-7dcb-3bbf-3c06df488f1b.png)

次にナップザックの重さ=2です。今回は選択肢とては1) 品物を入れるか、2)品物を入れないかの２つがあります。この２つの選択肢について価値を比べて大きいほうを選びます。品物1の価値は3ですので、価値=3となります。

![2021-02-01_17h21_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/dc376f39-1d42-2ab1-3474-51970d0102b4.png)

以下同様にして品物1を更新します。重さの制限は増えます。しかし品物1は重さ=2、価値=3で固定されているために価値は3となります。

![2021-02-01_17h21_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/8ba4c667-d201-7ddd-bb4d-b3e4efdcf8e8.png)

## 品物2～4について同様に更新する。
品物2～4についても同様に更新します。ポイントとしては選択肢は２つ、一つはその行の品物を入れる、もう一つは何もしないということです。

![2021-02-01_17h27_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/238e4334-f14e-9472-b9f3-7164a3287883.png)

最後の品物まで更新すると答えは7となりました。
![2021-02-01_17h28_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/bb53e308-1322-9858-554d-efaaa35b078f.png)

## まとめ
![2021-02-01_17h30_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/7bf53a22-0ad9-231d-db0a-b8a4a713081e.png)

# 配るDP
貰うDPの漸化式はP56に記載されています。こちらを順番に説明していきます。

## 一つ目の品物ついて更新する。
初期値までは貰うDPと同じですので省略します。(0,0)が価値を配ることができるのは、(0,1)もしくは(2,1)の項目になります。

![2021-02-01_18h26_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/033aa1d3-2044-30bc-84e8-90e6274df4e5.png)

順番に更新を繰り返す。すでに価値が更新されている場合には大きいほうを優先する。

![2021-02-01_18h29_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/a742f700-070f-5fe1-756f-7d6a157eab7d.png)

## 品物2～4について同様に更新する。
![2021-02-01_18h32_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/fe298007-8edc-d63f-42bd-0ad0e079ef3c.png)

更新を繰り返すと答えは7となる。貰うDPでも配るDPでも答えは一緒となる。

![2021-02-01_18h37_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/d8c47721-7ed0-13df-ecaa-501f74db6bce.png)

## まとめ
![2021-02-01_18h39_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54430/ea07e913-f34d-0fa9-9ac7-3b3040aa594e.png)
言語を勉強するための環境構築

##言語を勉強するための環境構築

新しい言語を勉強するために環境構築手順としての自分用メモ。

#### ① Code の install

https://code.visualstudio.com/

Visual Studio Code を日本語化します。
※手順
①コマンドパレットを開きます（Ctrl + Shift + P）
②Configure Display Language > Install additional languages の順に選択します
③Japanese Language Pack for Visual Studio Codeをインストールします
Visual Studio Codeの再起動が必要です。


その他に良さげなプラグインを追加しました。
#### indent-rainbow
インデントに色付けしてくれるプラグイン。

####vscode-icons
ファイルアイコンを分かりやすくしてくれるプラグイン。

####Auto Rename Tag
片方のタグを編集すると、対応するタグの名前も自動的に編集してくれる拡張機能。

#### ②GitHub のアカウント登録

https://github.com/

####
Kali Linuxインストール

# Kali Linuxをラズパイ3にインストール

ラズパイ用のインストールイメージはここからダウンロードできた。
https://www.offensive-security.com/kali-linux-arm-images/


デフォルトパスワードはkali/kali
https://www.kali.org/docs/introduction/default-credentials/
【Mono Depth】SfMLearner++ : epipolar lineの類似度を重みに使う

<h1>SfMLearner++: Learning Monocular Depth & Ego-Motion using Meaningful
Geometric Constraints</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/cfe99e53-d03e-7d0b-b31c-361fd0c7dfef.png)

従来研究だとPhotometric Lossを計算する時に、Pose Estaimationが間違っていたら、Depth Estimation正しくても、Lossが大きくなってしまうという課題があった。
そこでその課題を解決するのがこの論文！

<h1>新規性</h1>
<h2>epipolar Costraing weighted Loss</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/21bf79e2-cf8a-0281-ed83-e3acf96ef4a1.png)
単純のPhotometric Lossにepipolar lineの類似度の重みを付ける
Pose Estimationが正しい=>Epipolar Lineは同じ

そうする事でPose Estimationが上手くいかなかったときのPhotometric Lossを軽減できる。


<h2>p’.trans Ep = 0の証明</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/65153ac6-869c-f8ac-c81a-627cdd4f205d.png)
EはExtrinsic Matric(2つのカメラ館の回転と移動量)

Pose Estimationが正しければこの値は0になるはず。

<h2>p'Ep = 0の証明</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/a85af29c-da44-589d-52d6-72890c9a14db.png)
p'・(Txp')は常にゼロとなる(あとで証明する)

Txp'=TxRp(pを回転させてp'と平行なベクターにすれば、Tとの外積は同じのはず)



<h2>a・(axb) =0の証明</h2>
aベクターとbベクターの外積にaベクターの内積を取ると0になる

外積はaベクターとbベクターの平面に対して垂直にzを取る。
そこに内積をかければ90度なのでいつも0となる。





<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/d1fc546e-985d-606e-711c-ab0191acf935.png)
Epipolar Constrain weightをPhotometric Lossに導入する事で精度が上がっている

<h1>結論</h1>
・Pose Estimationが悪さをしない為にEpipolar Lineを確認せよ

<h1>参考文献</h1>
SfMLearner++: Learning Monocular Depth & Ego-Motion using Meaningful Geometric Constraints
https://arxiv.org/pdf/1812.08370.pdf
https://www.quora.com/How-do-I-prove-that-a-axb-0
今更ながらEC2 × Docker × Laravel環境でSSL化する（React環境も整えつつ）

# はじめに

EC2上にdockerコンテナ（webコンテナ、php(laravel)コンテナ）を立てたときにSSL化したときのメモを書きます。

dockerを内部に立てずに直でミドルウェアを乗っけてSSLはあると思うのですが、
費用をかけられないプロジェクトなどでコンテナを使ってほしいとかって要求の時に、役立つかなと思ってメモです。

**しかも、忘れやすすぎる自分は、ポート何が開いているか忘れていて、ポートで詰まったので、「この構成で作りたくなってはまったら、『5. ポートの調整』を特に思い出してくれよ俺。」という意味での自分用メモとしても残しています。**

■ 追記
React環境については、「余談」項目で展開しています。

# 内容

laravelの動作とかは、laravelなどを検索してみてみてください。

## 1. EC2準備

VPCやEC2、ドメイン取得は他の記事を参考によろしくお願いいたします。

## 2. dockerコンテナ群準備

個人的に最強記事だと思っている以下を参照
こういうのってありがたいですよねー

https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4

以下とかでも全然OKだと思います。

https://qiita.com/y-do/items/e127211b32296d65803a

## 3. 証明書の取得

これもググれば出てくる感じなので、Let'sEncryptとかで取得してください。

まあ、以下が参考です。

https://qiita.com/tmatsumot/items/aca49d99558d2646ef36

自分はエラーったんで以下を参考にして修正しましたー。

・https://sole-color-blog.com/blog/1345/
・https://www.it-swarm.jp.net/ja/amazon-ec2/amazon-linux-ec2%e3%81%abcertbot%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/960066120/

## 4. webコンテナのdockerコンテナをSSL化

ここにも、@ucan-lab　さんが登場（笑）
いつもお世話になっております・・・

https://qiita.com/ucan-lab/items/c7f0690227ce7da4a172

以下とかでも全然OKです。

https://qiita.com/yujimny/items/7615046be674895f9565

まあ、今回localhostで適応するわけではないので、下が早いかもしれませんね。
ほぼ変わりませんが・・・

## 5. ポートの調整

ここで自分docker使っていることを忘れていて（鳥頭やん・・・）、
どこのポート空けたっけ？みたいになり、
docker-compose.ymlを見てみると

```yml
version: "3.8"
services:
  web:
    image: nginx:1.18-alpine
    ports:
      - 10080:443
```

はい、10080っすね。

これを、AWSコンソールのEC2のセキュリティグループで、10080をカスタムTCPで開けてやると、うまくいきまーす。


以上。


# 所感

今やサーバレスとかなので、「ACM + ELB」とか「ACM + CloudFront」とか、何ならもっと他の方法もあるので、、はいという感じではありますが、
お客様の要件で全然ある話なので、メモです。


# 余談

Reactも同時に導入したいよーってときは、
https://www.ritolab.com/entry/34
ここを参照しつつ、

https://note.com/laravelstudy/n/n17fd31eb64e4
ここで補って

npmないって怒られたら、事前に
https://zukucode.com/2019/06/docker-laravel-nodejs.html
ここでDockerfileに入れておく。
PowerShell で強制的に画面の解像度を変更する

Windows 10 でディスプレイ解像度設定を変更しようとすると、以下のような確認が表示されます：

![display-resolution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/901fe15d-48fb-ec06-1bec-8084cf5faea6.png)

意図しない変更による失敗を防ぐ機能と思われますが、頻繁に解像度設定を変更する場合には不便です。

コマンドラインから強制的に変更したいところですが、PowerShell には標準で解像度を制御するコマンドレットがありません。直接 Win32API をコールしてもよいですが、ここは先人の知恵をお借りして楽をしましょう。

## ScreenResolutionChangerEx を利用する

[ScreenResolutionChangerEx](https://github.com/timmui/ScreenResolutionChanger) とは、[Timothy Mui](https://github.com/timmui) 氏が公開している解像度変更ツールで、PowerShell 関数も含まれています。この大本となる ScreenResolutionChanger は Andy Schneider 氏が [TechNet ギャラリー](https://gallery.technet.microsoft.com/ScriptCenter/2a631d72-206d-4036-a3f2-2e150f297515/)で配布していたものですが、現在は入手できなくなっているようです。

利用方法は簡単で、該当の PowerShell モジュールをインポートし、`Set-ScreenResolutionEx` 関数を呼び出すだけです。

```powershell
# Set-ScreenResolutionEx 関数をインポートする
. ".\\Set-ScreenResolutionEx.ps1"

# Set-ScreenResolutionEx -Width <横幅> -Height <縦幅> -DeviceID <ディスプレイ番号（0ベース）>
Set-ScreenResolutionEx -Width 1920 -Height 1080 -DeviceID 0
```

## 参考リンク

* [PowerShellを使って、画面解像度をワンタッチで切り替えるアイコンをデスクトップに作成する](https://qiita.com/zamaezaaa/items/c4482fed9b391e3cb54a)
* [How to do a Powershell (or other) script to change screen resolution?](https://superuser.com/questions/29450/how-to-do-a-powershell-or-other-script-to-change-screen-resolution)
pythonの基本文法(youtubeを通して学んだ事)のメモ①(Hello worldからlistまで)

youtubeでpythonの基本文法を学んだので、メモとして残す。

まずはHello World
C言語と比べてセミコロンがなくてよい。

```python:test.py
print("Hello World!")
```

```cmd.exe
D:/python/test>python test.py
Hello World!
```

演算

```python:test.py
print(1+1)
print(1-1)
print(2*2)
print(10/2)
print(5%3)
```

```cmd.exe
D:/python/test>python test.py
2
0
4
5.0
2
```

変数
下の方のようにログインIDを記憶させておくと便利。

```python:test.py
unko = "Hello World!"
print(unko)
login_id = "asiek2$0ask1s"
print(login_id)
```

```cmd.exe
D:/python/test>python test.py
Hello World!
asiek2$0ask1s
```

文字列以外に数字も代入可能。
また真偽の代入も可能。

```python:test.py
unko_length = 5
unko_times = 5.5
print(unko_length)
print(unko_times)
unko_sitai = True
unko_sitai = False
```

```cmd.exe
D:/python/test>python test.py
5
5.5
```

type関数で変数の型を表示させることができる。

```python:test.py
unko = "Hello World!"
unko_length = 5
unko_times = 5.5
print(type(unko))
print(type(unko_length))
print(type(unko_times))
```

```cmd.exe
D:/python/test>python test.py
<class 'str'>
<class 'int`>
<class 'float'>
```

条件分岐と関係演算子
(if, else, elif, ==, !=, <, >, >=, <=)
else ifの代わりにelifがある。

```python:test.py
unko = "l_size"
unko_length = 5

if unko == "l_size":
    print("dekai!")

if unko_length > 6:
    print("ooi!")
elif unko_length ==0:
    print("nai!")
else:
    print("sukunai")
```

```cmd.exe
D:/python/test>python test.py
dekai!
sukunai
```

```test.cpp
if(unko_length > 6){
  printf("ooi!");
}
```
これで以前使っていた言語との差がわかる。
pythonのif文はセミコロンとネストが大事になってくる。

関数
pythonではdefの後に関数を定義するきまりになっている。
def(define)は"定義する"という意味。
引数が必要な場合は関数名の後のカッコ内に引数を定義する。
arg(argument)は"引数"という意味。

```python:test.py
def unko_funbaru(arg):
    unko_status = arg
    
    if(unko_status < 10):
        return "mada daijobu"
    else:
        return "yabai"

print(unko_funbaru(12))
```

```cmd.exe
D:/python/test>python test.py
yabai!
```

list
pythonのlistとはC言語でいう配列と自分では受け止めた。
print(unko_list)だけでlist内のデータを全て表示できる。

```python:test.py
unko_list = ["unko_small","unko_medium","unko_large"]
print(unko_list)
print(unko_list[1])
```

```cmd.exe
D:/python/test>python test.py
['unko_small', 'unko_medium', 'unko_large']
unko_medium
```
パワポのデザイン最強【プログラミング日記~ポートフォリオ④~】#5

#ヘッダートップ画面を作ろう
今回はワイヤーフレームの１枚目を作成していきたいと思います！
![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043307/222f616e-f9bf-dbef-a99b-2eaee8f155c8.jpeg)


```html:index.html
<body>
    <header>
     <div class="header-logo">
      <a href="/index.html"><img src="image/logo.jpg" height="50px" width="50px"></a>
    </div> 
    <div class="header-list">
     <nav>
       <ul>
         <li><a href="#profile"><i class="fas fa-user-alt"></i>PROFILE</a></li>
         <li><a href="#works"><i class="fas fa-book-open"></i>WORKS</a></li>
         <li><a href="#skill"><i class="fas fa-pencil-alt"></i>SKILLS</a></li>
         <li><a href="#contact"><i class="far fa-envelope"></i>CONTACT</a></li>
        </ul>
      </nav>
    </div> 
    </header>
    <div class="main-visual">
      <h1>PAPAPAPE's PORTFOLIO</h1>
      <img src="image/mein-visual.jpg" width="100%">
    </div>
</body>

```

```css:style.css
/* 共通 */
body, h1, h2, h3, p, ul{
  margin: 0;
  font-size: 20px;
}
a{
  text-decoration: none;
  color: black;
}

/* ヘッダー、トップ */
header{
  height: 70px;
  width: 100%;
  background-color:rgb(255, 255, 255);
  opacity: 0.7;
  position: fixed;
  top: 0px;
  z-index: 10;
  }
.header-logo{
  float: left;
  margin: 10px 400px 10px 30px;
}
.header-list li{
  font-size: 18px;
  list-style: none;
  float: left;
  line-height: 70px;
  padding-right: 50px;
}
.main-visual h1{
  font-size: 5rem;
  position: absolute;
  top: 50%;
  left: 250px;
}
```
###工夫したこと、苦労したこと
#####html
①ヘッダーのロゴとリストにa hrefを付けたことで任意の場所に飛べるようにした:airplane:
②ヘッダーのリストにfont awesomeを使いポップな見た目に
#####css
①ヘッダーの上に隙間ができてしまう問題
→検証ツールをデフォルトでmarginが設定されていることが判明。そのため一番上にbody,h1,h2,h3,p,ulにmargin0を設定した。検証ツール便利すぎ、神!!!
②シンプルなサイトなので少しでもおしゃれにするためにヘッダーを上に固定して少し透けさせた
main-visualのh1が中々真ん中に来なくて大変だった
→position:absoluteからtop:50%,left:50%だと少し右寄りになるのでpadding-leftを少しずつやるしかなくてだるかった、ほかに楽なやり方はあるんだろうか⁇
#そして完成したものがこちら！
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043307/e9201820-17fb-4535-1099-5fa0681bf2a7.png)
シンプルだけどワイヤーフレームの時よりおしゃれに見えるううううう:blush:
やはり天才かもしれん(すぐ調子乗る)
フォントをもうちょいシャレオツにしたいけどそれは余裕があったらやります。
おしゃれなフォントってなにがあるんだろ
#おわりに
いやーー4分の1完成しただけでこのうれしさだとすると完成したらうれしさで爆発するんじゃないかって恐怖で怯えています:disappointed:
ちなみにトップ画像はパワポのデザインというところで自動生成された画像です、パワポすごい
では、それでは～
Docker イメージ・コンテナ　一括削除・停止の方法

#イメージの一括削除

```terminal
docker images -aq | xargs docker rmi
```

#コンテナの一括削除

```terminal
docker ps -aq | xargs docker rm
```

#起動中のコンテナの一括停止

```terminal
docker stop $(docker ps -q)
```
RaspberryPiの初期設定を完全ヘッドレス環境で終わらせる

# はじめに
ラズパイをセットアップし直すたびに同じことググってる気がして嫌気がさしたので、初期設定をヘッドレス環境で終わらせるためのメモを残しておきます。
Raspberry Pi 3BとRaspberry Pi Zero WHでのみ動作確認済みですが、おそらく全モデル同じ手順で設定できると思います。

# OSのインストール
https://www.raspberrypi.org/software/
いつからかわかりませんが公式のイメージ書き込みツール「Raspberry Pi Imager」なるものが存在していました。昔はこんなの無かった気がする・・・。インストールしたいOSとインストール先SDカードを選択するだけでダウンロードからインストールまで全部やってくれます。すげ～！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547023/2fc70e98-1781-7b5c-f3ac-c960d3e86670.png)


# sshの有効化・WiFi設定
ヘッドレスで使用するためにはsshを有効化する必要があります。
OSの書き込みが終わったSDカードはパーティションが2つに分かれており、そのうち`boot`パーティション直下に以下の2ファイルを配置しておくことでラズパイ起動時に勝手に sshの有効化 および WiFi接続 が行われます。

- `ssh`
空白のファイル

- `wpa_supplicant.conf`
WiFi接続情報を以下のフォーマットで記載

```wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        # 接続するWiFiの設定
        ssid="SSID"
        psk="PASSWORD"
}
```

# ssh接続
DHCPでIPアドレスが割り振られていますが、ホスト名`raspberrypi.local`で名前解決してくれます。初期ユーザ/パスワードはpi/raspberryです。
sshで接続できることを確認しましょう。

# 固定IP設定
IPアドレスを固定にしておいたほうが何かと便利だと思うので設定を行います。
`/etc/dhcpcd.conf`に以下のように追記します。

```/etc/dhcpcd.conf
# static IP configration
interface wlan0
static ip_address=192.168.*.*/24
static routers=192.168.*.*
static domain_name_servers=192.168.*.*
```

設定を保存しラズパイを再起動したら設定が正しければIPアドレスが変わっているはずです。

# おわり
ヘッドレス環境でセットアップを完結できるととても便利ですね。Wifi接続とDHCP設定のためだけにわざわざキーボードとディスプレイを繋いでた昔の僕が馬鹿みたいです。
皆さんもよきラズパイライフを！
BitLockerを有効化して回復キーのバックアップを取る

# BitLockerを有効にする
manage-bdeを利用してPowerShellからBitLockerを有効にする手順。

## 数字パスワードで暗号化する
```
manage-bde -on C:  -RecoveryPassword
```
再起動すると暗号化が始まる。

### 回復用ファイル(.BEK)について
```
manage-bde –protectors -add C: -startupkey D:
```
上記のコマンドでは回復キーファイルがDドライブに作成されるらしいが、いくら探しても見つからない。適当に弄ってると、上記のコマンドに依って作成される回復ファイルは不可視のため、`ls -force` とオプションを付けると見えることが分かった。

## 回復用数字パスワードを表示する

```
manage-bde -protectors -get C:
```
これでよし。

# 自動化する
今回も複数台のPCに操作を行うため、PowerShellで一連の操作を行えるようにする。

## ハードウェアの検証が必要でない場合
MicroSoftの [BitLocker: BitLocker ドライブ暗号化ツールを使用して BitLocker を管理する](https://docs.microsoft.com/ja-jp/windows/security/information-protection/bitlocker/bitlocker-use-bitlocker-drive-encryption-tools-to-manage-bitlocker) を読むと、`-SkipHardwareTest` オプションを指定すると、再起動の必要なしに暗号化を開始するとある。

## 回復キーファイル名の抽出
GUIのBitLockerの有効化手順では、数字パスワードのファイルには複合に要するIDをファイル名に含んだtxtファイルが書き出される。
これを再現せよとのこと。頑張る。

```
manage-bde -protectors -get C:
```
まずキー自体はこれで書き出せる。
PowerShellでは、コマンドの実行結果はSystem.Arrayという型のため、色々と扱いにくい。型変換したあと、正規表現で{}で囲まれてる部分だけ拾ってこよう。

### 出来たものがこちら

```BitLocker.ps1
manage-bde -on C:  -RecoveryPassword -skiphardwaretest
$obj = manage-bde -protectors -get C:
$res = [string]$obj.trim() -match "数字パスワード: ID: {(?<SID>.*?)}"
$sid = $matches.SID
$hst = hostname

echo $obj > "C:\keys\$hst`_$sid`_BITLOCKER_recoverKey.txt"
```
juliaでcsvに読み書きする

julia(v1.5.2)でcsvに読み書きをします. いくつかのサイトに書かれているCSV.read()を上手く使えず, 手こずったためまとめました.

#読み込み
読み込まれるcsvファイルをhoge.csvとします.

```csv:hoge.csv
a, b, c
1, 0.1, 34
2, 1, 54
3, 10, 0.4
4, 99, 554
```


```julia:read.jl
using CSV
using DataFrames

dfr = CSV.File("./hoge.csv",  header=true, delim=',') |> DataFrame
print(dfr)
```

出力は次のようになります.

```
4×3 DataFrame
 Row │ a      b        c       
     │ Int64  Float64  Float64 
─────┼─────────────────────────
   1 │     1      0.1     34.0
   2 │     2      1.0     54.0
   3 │     3     10.0      0.4
   4 │     4     99.0    554.0
```
#書き込み

```julia:write.jl
using CSV
using DataFrames

data = [1  0.1 ;
        2  1.0 ;
        3  9.9 ];
dfw = DataFrame(data)
CSV.write("./fuga.csv", dfw, header=true, delim=", ")
```
出力ファイルは次のようになります.

```csv:fuga.csv
x1, x2
1.0, 0.1
2.0, 1.0
3.0, 9.9
```

delim=','とするよりdelim=", "とするほうが出力ファイルの見た目が少し良くなります.
CSV.File(), CSV.write()のいずれでもheader,delimは省略可能です