OmniAICreator/Qiita-1.07M huggingface dataset:
EC-CUBE4系で画像ホバー時にキャプションを表示する

EC-CUBE4系以外にも汎用的に使えるデザインtipsです。
商品一覧の画像にマウスを載せたホバー時に、テキストキャプションを表示します。
簡単ですが、少しリッチに見えるのでおすすめです。
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668571/797edb2c-7bd3-c4c0-323b-90062fddd8bd.png)

仕組みは、画像の背景に黒色を設定し、擬似要素のbeforeで「詳細を見る」というキャプションを作成。
ホバー時に、画像を半透明にし、before要素を表示する事で、画像が暗くなりキャプションが浮き上がる仕組みです。

## HTML追記
商品画像のimg要素をdivやp要素で囲み、class属性を追加します。
今回はu-item__captionというクラス名にしてますが、ご自身で変更可能。
トップページと商品一覧ページでは、記載場所が異なりますので、以下をご参考に編集ください。

### トップページの新着商品ブロックに適用する
トップページは新着商品ブロックに記載するので、
管理画面の[コンテンツ管理]>[ブロック管理]>[新着商品]ブロックを編集してください。
デフォルトであれば、25行目、32行目、39行目あたりにimg要素があると思います。
img要素をdiv要素で囲みclass属性とclass名「u-item__caption」を追記してください。

```HTML
<div class="u-item__caption">
  <img 〜〜〜>
</div>
```

![block.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668571/87f06391-fb42-21ed-6d35-47f7c60c4784.png)

### 商品一覧ページに適用する
商品一覧ページは、ページに記載するので、
管理画面の[コンテンツ管理]>[ページ管理]>[商品一覧ページ]を編集してください。
デフォルトであれば、152〜154行目あたりにp要素とimg要素があると思います。
こちらは、img要素の親にp要素があるのでそちらにclass名「u-item__caption」追加で大丈夫です。

```HTML
<p class="ec-shelfGrid__item-image u-item__caption">
  <img src="{{ asset(Product.main_list_image|no_image_product, 'save_image') }}">
</p>
```
![page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668571/79b0d8e6-f03e-734c-caf0-b743d684c01f.png)


## CSS追記
HTMLで指定したclassに、CSSでホバー時のスタイルを適用します。
CSSは管理画面のCSS管理か、直接cssファイルを編集されている方は、そちらのファイルに追記ください。
商品一覧ページには、画像の高さがバラバラだった場合の対策として、画像の高さを固定する値がデフォルトでは入っています。
こちらは今回autoにしていますので、画像の横幅と高さは揃えるようにしてください。

```CSS
/*商品一覧ページ画像の高さの値をautoに変更*/
.ec-shelfGrid .ec-shelfGrid__item-image{
    height: auto;
}
/* hover時にキャプション表示するスタイル */
.u-item__caption{
    background: #000;/*画像の下に黒色の背景を置く*/
    position: relative;
    line-height:1;
}
.u-item__caption img,.u-item__caption::before{
    transition: 0.5s;/*ホバー時にフワッと表示する処理の秒数*/
}
.u-item__caption:hover img{
    opacity: 0.5;/*ホバー時に画像を半透明にする値*/
    z-index: 1;
}
.u-item__caption::before{
    content: "詳細を見る";/*キャプションテキスト*/
    position: absolute;
    top: 50%;
    left: 50%;
    z-index: 2;
    padding: 8px 5px;/*枠線とテキストの間の内余白*/
    border: 1px solid #fff;
    color: #fff;
    font-size: 1.2rem;/*テキストの文字サイズ*/
    width: 50%;/*キャプションテキスト枠の横幅*/
    text-align: center;
    transform: translate(-50%,-50%);
    opacity: 0;
}
.u-item__caption:hover::before{
    opacity: 1;
}
```
管理画面のCSS管理は、[コンテンツ管理] > [CSS管理]は以下になります。
![CSS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668571/5659fe7a-39b7-5075-b1dd-ba14d9c9f7cc.png)
vimでセミコロンとコロンを入れ替える

ChromebookでCrostiniを利用するにあたり、英字キーボードだとvimが使いにくいのでセミコロンとコロンを入れ替える方法。

# 環境
- Asus Chromebook C425TA
- Google Chrome OS
 - バージョン: 87.0.4280.142（Official Build）（64 ビット）
- Debian GNU/Linux 10 (buster)

# .vimrcに以下を追加する

```
" セミコロンとコロンを入れ替え（ノーマルモード）
nnoremap ; :
nnoremap : ;
" セミコロンとコロンを入れ替え（インサートモード）
inoremap ; :
inoremap : ;
```

`:map`系のコマンドは再帰的にマッピングしてしまうので`:noremap`系のコマンドを使用する。
他のモード以外でも入れ替えたい場合には [Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/usr_40.html)を参照。
原因結果グラフで全称命題と存在命題を扱う

本稿では原因結果グラフで全称命題と存在命題を扱うために量化子を導入する方法を提案します。
誤りや、より良い方法があれば教えていただけると幸いです。

## 二項分類と多項分類

ある要素の分類方法には二項分類と多項分類があります。[^1]
二項分類はその因子の条件を満たすかどうかという二値の分類で、水準を省略可能です。

![原因結果グラフ1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/d27dd7eb-aa19-7d2c-2538-2185fb288968.png)

多項分類の場合は因子に対して同値分割を用いて水準を定義し、制約記号で因子と水準の包含関係を明確にします。

![原因結果グラフ2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/9859934d-564e-afa4-5989-56e712273f22.png)

## 全称命題と存在命題

さて、前述の二項分類・多項分類は単一の要素がどの条件を満たすかという問題であるのに対して、次の全称命題・存在命題では**条件を満たす要素がどれだけ存在するか**という問題を扱います。

(例) ある塾では欠席または早退した生徒全員に授業のフォローメールを送信するという業務がある。

これを原因結果グラフで表現すると下図のように考えられそうです。

![原因結果グラフ3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/b4e366e6-ff3b-7a1f-8513-0b6a6b98a506.png)

しかし、メールは送信したけど一部の人に送信し忘れていた場合はどうでしょうか？
もしくは、メールは送信したけど別の人に送信してしまった場合は？
この原因結果グラフからは正しい結果を読み取ることができません。
なぜなら、「欠席者」も「早退者」も「メール送信済の生徒」も**集合**だからです。

そこで、リンクを拡張して量化子を導入すると、下図のように書けます。

![原因結果グラフ4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/e7fd9637-a955-e671-0e38-a614d608edba.png)

通常の命題と区別するため、因子を角丸にしました。
上図より、生徒の集合を*X*とすると業務完了する条件は「&forall; *x* &isin; *X*, &not; (欠席 &or; 早退) &or; ((欠席 &or; 早退) &and; メール送信済)」となります。

このとき因子は命題ではなく、**命題関数**となっている点に注意してください。
例えば、「*x*は欠席である」という文章は変数*x*が確定するまで真偽を評価できません。
命題関数に接続された論理演算は次のように遅延評価されます。

ケース: 授業の参加者が出席者2人のみの場合

![図1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/92e3e805-a34b-23a9-fb11-cef55731b3d6.png)

![図2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/ea24335d-20dd-b712-16bc-9af8cf7fb93b.png)

量化子に辿り着いたら左に折り返して値が確定していきます。

①: 「欠席、または早退である」
②: ①の否定
③: { 出席者, 出席者 } という集合の全ての元に対して、②が成り立つ
②': { 出席者, 出席者 } という集合の全ての元に対して、①の否定が成り立つ
①': { 出席者, 出席者 } という集合の全ての元に対して、「欠席でない、かつ早退でない」が成り立つ
&there4; 授業の参加者が出席者2人のみの場合、業務完了は真である。

## テストケースの作成

先ほどの原因結果グラフを元にデシジョンテーブルを使ってテストケースを作成する方法を考えます。

総当たりで8通りの組み合わせができますが、制約条件より「早退 &and; 欠席」を満たすケースはあり得ないので削除します。
そうすると、下図のように6通りの組み合わせが残ります。

![デシジョンテーブル1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/b0a625ae-e500-8f67-4d56-e3c3bb53e502.png)

例えば、1のテストケースは早退かつメール送信済の生徒を対象にしたテストです。
それ以外の条件が混ざってしまうと意味のあるテストにならないので、「&forall; *x* &isin; *X*, &not; 欠席 &and; 早退 &and; メール送信済」を満たすテストケースを作成します。
※「欠席の生徒が存在しない &and; 早退の生徒が存在する &and; メール送信済の生徒が存在する」ではないので注意してください。

これで有則の組み合わせを全て網羅することができましたが、下図のように複数の条件が混在するケースに不具合が潜んでいる可能性もあります。

![図3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/0b43442b-734d-4afc-36ce-4789f01285b0.png)

今回はこのようなケースは無則の組み合わせと見なし、Pictを使って二因子間網羅のテストケースを作成してみました。

![デシジョンテーブル2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72814/26db1acf-95e3-aafb-fc6b-812ae07148ad.png)

例えば、7のテストケースでは早退かつメール未送信の生徒が存在するので、業務完了が偽です。
先ほどの全網羅のテーブルとは異なり、こちらは各行の条件を満たす生徒が存在するかという意味で書いています。

以上です。

[^1]: これは統計学の用語で、ソフトウェアテストの一般的な用語ではありません。
Windows版Gitで複数のGitHubアカウントを使い分ける方法(https認証)

## はじめに

WindowsにおけるGitHubアカウントの複数運用に関して、簡潔な情報が見当たりませんでしたので解決策を記しておきます。

1. リポジトリの作成
2. git configにて資格情報の設定をする
3. https認証する

## 手順

ローカルリポジトリにおいて、以下のコマンドで資格情報を個別に指定します。

```bash
git config credential.namespace git-sub
```

`git-sub`は任意の文字列ですが、`git...`としておいた方が管理の都合がいいと思われます。  

後は普通にPushします。`git-sub`の利用が初めてなのであれば、その段階でログインが求められます。  
この際、予めGitHubのメインアカウントからはログアウトしておく必要がある場合があります。

```bash
git add .
git commit -m "init"
git remote add origin https://github.com/user/repo.git
git push origin main
```

このリポジトリは`git-sub`としたGitHubアカウントに関連付けられたため、次回以降は特別な設定作業は不要です。

---

ところで、`git-sub`の情報は`資格情報マネージャ`から確認できます。
資格情報マネージャは`Win + R`→`control.exe /name Microsoft.CredentialManager`もしくは`Win + S`→`しかく`などから開けます。
Rubyスクリプトにもmainメソッドを定義するといいかも、という話

## はじめに
Ruby（Railsではない、単純なRubyスクリプト）では、以下のようにトップレベルで変数を宣言したり、様々な処理を記述したりすることができます。

```ruby
require 'date'

def play
  puts 'あそぶよー'
end

def study
  puts '勉強するよー'
end

# トップレベルで変数宣言
today = Date.today

# トップレベルで条件分岐とメソッド呼び出し
if today.sunday?
  play
else
  study
end
```

## 上のコードの問題点

もちろんこれでもよいと言えばよいのですが、以下のような問題点もあります。

### コードリーディング時に下から上に進まないといけない

プログラムとしてのロジックが開始されるのは `today = Date.today` の行からですが、プログラムの構造上、どうしてもメソッド定義（`def play`や`def study`）の方を先に書かざるを得なくなります。

よって、コードリーディング時（またはコードレビュー時）は先にファイルの下に進んでから、メソッドの内容を確認するために上スクロールしなければならなくなります。

![Screen Shot 2021-01-24 at 17.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/44668912-1e52-be50-0d77-297e02c93470.png)

できれば実行の起点となるコードはできればスクリプトの先頭に書いて、上から下へ文章っぽく自然に読みたいところです。

### 可読性の低いコードを書いてもRubocopに指摘されない

コードレビューを自動化するためにRubocopを導入している人も多いと思います。

しかし、トップレベルに書いたロジックはいくらダラダラと何行に渡って書いても、Rubocopに「長すぎる」と怒られることがありません。
その結果、他の人にとって理解しづらいメソッドを書いてしまう恐れがあります。

![Screen Shot 2021-01-24 at 17.31.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/88e24c91-1fa1-cc97-1880-ab103919991f.png)

これがメソッドになっていれば、メソッドの長さをRubocopがチェックしてくれるはずです。

## そこでmainメソッドを導入してみる

こういった問題を避けるため、僕は明示的な `main` メソッドを導入することが多いです。

```ruby
require 'date'

# トップレベルに書いていたロジックをmainメソッドに移動させる
def main
  today = Date.today
  if today.sunday?
    play
  else
    study
  end
end

def play
  puts 'あそぶよー'
end

def study
  puts '勉強するよー'
end

# トップレベルではmainメソッドの呼び出しを最後に書くだけ
main
```

### mainメソッドを導入するメリット

`main` メソッドを導入すると、実行の起点となるコードをスクリプトの先頭に書くことができるので、コードを上から下へ順に読み下しやすくなります。
また、 `main` メソッドが無駄に長くなるとRubocopのチェックで「メソッド長すぎ！」と指摘されるようになります。

### なぜmainという名前なのか

`main` というメソッド名は任意です。 `start` でも `run` でも `execute` でも何でも構いません。
ただ、C言語やJavaなどでは `main` メソッド（ `main` 関数）から処理を開始するようになっています。

```c
#include <stdio.h>

// C言語
int main(void)
{
    puts("Hello, world!");
    return 0;
}
```

```java
// Java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
```

そのため、 `main` という名前にしておけば他の開発者も「あ、ここから処理が始まるんだな」と推測しやすくなると思い、この名前を付けるようにしています。

## まとめ

というわけで、この記事ではRubyスクリプトにmainメソッドを導入する理由やメリットについて書いてみました。

メソッド定義がいくつかあって、1画面に収まらないぐらいの長さのRubyスクリプトを書く場合は、 `main` メソッドを導入して可読性を上げることを検討してみてください😉

### あわせて読みたい

mainメソッドを導入したら、次はメソッドの並び順にも気を配ってみましょう。

[【新人プログラマ応援】メソッドは呼ぶ側を手前に、呼ばれる側を後ろに定義しよう \- Qiita](https://qiita.com/jnchito/items/860ffa0391ade46aabf9)
【いいね機能】非同期通信による部分テンプレート差し替えが、ページ最上部の投稿にしか反映されなかった話

# エラー概要
一通り機能が実装できた後、挙動確認を行う。
⇨どのいいねボタンをクリックしても投稿一覧画面の一番上の投稿だけ表示が切り替わる。
ブラウザをリロードすると、クリックした箇所の表示が切り替わり、一番上の投稿は元に戻る。

# 結論
部分テンプレートを差し込む箇所の親要素のidに一意性がなかったのが原因。
（エラー概要から考えれば、機能は正常に動いているため、非同期による部分テンプレートを差し込む場所をきちんと指示できていないと予想できる。）

# 実装経緯と誤り箇所
いいね機能を実装している箇所の親要素に一意性のあるidを与える。

```view/posts/index
# 修正前
<div class="like_or_unlike">
  <%= render "likes/like", { post: post } %>
</div>

# 修正後
<div class="like_or_unlike", id="post_like_<% post.id %>">  #一意性を持たせるために投稿ごとのidを追加
  <%= render "likes/like", { post: post } %>
</div>
```
**このタイミングでミスあり！**
一意性を持たせるために、rubyの記述を差し込みpostごとのidを渡したつもりだったが、
「 = 」がついていない！！
このことによって投稿ごとのidは全て同じになっている。
検証ツールを利用して確認してみるとこんな感じ。

```html
<div class="like_or_unlike", id="post_like_"> 
    省略                      　　　　　　　　　　　　# idが同じになっている
</div>
<div class="like_or_unlike", id="post_like_">   
    省略
</div>
```
よってidが重複しているため、一番初めに読み込まれたidを指定している要素のみ
非同期通信が適用される。

## 最後に
ご一読ありがとうございました。
誤りがありましたらご連絡ください！
Tkinter で配置した画像の大きさを変えたい 

#概要
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/6f72fbba-83be-8ce9-1664-51f036477a05.gif)


こういうやつです。

#とりあえずサイズ変更

```:python
from PIL import Image, ImageTk

fn = 'sample.png'
#画像読み込み
img = Image.open(fn)
#大きさ変更
img = img.resize(500,500)
#ImageTkで変換
tkimg = ImageTk.PhotoImage(img)
           略
```

読み込んだ画像をImageTkで変換する前に、resize()を使います。
でもこれだとCanvasに配置してからの大きさの変更ができない。。。
では↑はどうやっているかというと、

#Canvasに配置してからサイズ変更したい！
大きさを変更したい時にその都度画像を読み込んで配置して、元の画像を削除しています。。。


#最後に
他に良い方法がありましたら、ご教授お願いします！
【Unity(C#)】お互いに正面で顔を合わせているのを内積(Vector3.Dot)で判定を行う

この記事は、こちらの記事を参考にお互いが正面向き合ってる状態で、判定する内容になります。
内積、Vector3.Dot、normarizedについての説明は、参考記事内にあるため省略します。
[【Unity(C#)】Rayではなく内積(Vector3.Dot)で視線判定を行う](https://qiita.com/OKsaiyowa/items/6b93fe41b33061abf5aa)

記述が増えてしまう為、お互いの頭のゲームオブジェクトは今回Inspecterからアタッチしてます。
概ね頭のある場所は、キャラクターオブジェクト>Root>Hips>Spine_1>Spine_2>Neck>Headと言った感じの階層です。
取り敢えず、どんなもんか気になる人向けに先にコードを出します。
# コード
```C#:LookMatch.cs
using UnityEngine;
public class LookMatch : MonoBehaviour
{
    [SerializeField]private GameObject playerHead; //プレイヤーの頭
    [SerializeField]private GameObject targetHead; //対象となる相手の頭
    [SerializeField]private float distance;        //判定に必要な距離
    // Start is called before the first frame update
    void Start()
    {
       
    }
    // Update is called once per frame
    void Update()
    {
        //互いの距離が一定距離内だったら判定する。
        float mag = (targetHead.transform.position - playerHead.transform.position).magnitude;
        if (distance >= mag)
        {
            //ターゲットからこちらの方向へ正規化したベクトルを作成
            Vector3 targetToCharaDirection = (playerHead.transform.position - targetHead.transform.position).normalized;
            if (Vector3.Dot(targetToCharaDirection, playerHead.transform.forward.normalized) < -0.9      //正規化したベクトルの内積がプレイヤーの頭から一定以下
                && Vector3.Dot(targetToCharaDirection, targetHead.transform.forward.normalized) > 0.9    //正規化したベクトルの内積が相手の頭から一定以上　
                && targetHead.transform.InverseTransformPoint(playerHead.transform.position).z >= 0)    //対象にとって正面側にいるかどうか
            { 
                //顔が向き合っている時の処理内容を記述
            }else{
                //顔が向き合ってない時の処理内容を記述
            }

        }else{
            //距離が離れている時の処理を記述
        }
    }
}
```


# デモ ～顔が合うと？マークを表示する～
![顔が合う.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387576/9560e809-d313-ec6e-5d4e-9c63fb5fcb77.gif)
・一定距離にいて
・顔も向き合っている

以上の状態であると？マークが表示されるようになります。

# InverseTransformPoint
[Transform.InverseTransformPoint](https://docs.unity3d.com/ja/2018.4/ScriptReference/Transform.InverseTransformPoint.html)
ワールド空間からローカル空間へ position を変換します。

これにより、プレイヤーの頭が対象の頭にとってローカル空間にpositionが変換され
前方側(z >= 0 )にいる状態になります。
Vector3.Dot(targetToCharaDirection, targetHead.transform.forward.normalized) > 0.9　    //正規化したベクトルの内積が相手の頭から一定以上
によりあまりいらない気もします。

# magnitude
[Vector3.magnitude](https://docs.unity3d.com/ja/2019.4/ScriptReference/Vector3-magnitude.html)
ベクトルの長さ（読み取り専用）
ベクトルの (x *x+y* y+z* z) の平方根の長さを返します。

今回の使い方としては、対象の頭の位置とプレイヤーの頭の位置を差し引いた時の距離の値が
distanceに設定した値より小さければ距離の判定を満たす形になっています。
そうしないと、数百m離れても判定する事に・・・


# 顔が向き合っていれば胴はどうでもいい
![顔.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387576/21197e3d-9c2f-4db5-c2c7-0e983a6a9e94.png)
「文字コードを自動判別する」と言う幻想を打ち砕く👊

# 概要
文字コードを自動判別する様な仕組みを持ったソフトウェアがたまに存在する。その努力を否定するものでは無いが、そういった状況のため、 ``文字コードは自動判別できる`` という誤解をしている人もしばしばいる。たまにそういう提案してくる人もいて、割と困ることもある。
しかし。

* テキストの内容だけで文字コードを判別することは、 **原理的には不可能** 
* 自動判別機能は **作業の一助** にはなるが、結局化けているかどうかは人間が見たときの判断であり、結果論でしかない。
* テキスト以外の様々な状況や運用によってある程度の潰しこみをするしか無い。

である。
昔撮った、誤判定による文字化けの面白いサンプルがあったので、参考に記載したい。
![IMG_20160316_232916.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/95c0ef9f-d673-b68c-ccfa-7759b37a16d1.jpeg)
(2016年頃にGALAXY NOTE II にカスタムROM入れた当時に、面白いサンプルが得られて、ゲラってた)

# 環境
* OS
  * GALAXY NOTE II 
  * Android CM12 (カスタムROM。 S-JISで無いことは確か。)
* サンプル ファイル
  * CD：[洲崎西 - Smile☆Revolution](https://www.youtube.com/watch?v=EFc1n34vNCY)
  * CDをリッピングしてスマホ端末へ
  * MP3 + ID3 Tag
  * ID3での 文字コードの設定はなし **※諸悪の根源**
  * 日本語Windows (S-JIS環境) で作成

## サンプルのCDとトラック
使用文字がバラけている、 ~~サンプルには~~ 良いアルバム。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/ddab28f0-f21c-4c7b-4475-c37ffebda443.png)
(自宅でのRaspberry Piで運用している [LMS](https://github.com/epoupon/lms) でのSS)

# 自動判別による誤判定例
## ① アルバム全体 👎
トラックごとに異なる文字コード判定により異なる文字化けを起こし、異なるアルバム扱いになっている。Android (CM12当時) のメディア ストレージは、トラック名で文字コードを判断し、ファイル全体の文字コードとして扱う模様。そのため、アーティスト名がトラック名の傾向によって異なってしまっている。
![Screenshot_2016-03-20-07-55-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/a7505ed4-9850-40a4-f8c0-8e655a899775.png)

## ② Track.1 ``Smile☆Revolution`` 👎
☆が面白い形に化けている。繁体字のBig5あたりにでも同じコードポイントがあったのだろうか？その判定にひっぱられ、アーティスト名も誰やねん状態。(しかも居そうな印象すら感じるから面白い)
![ss_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/093c258d-7943-c52e-2a19-1eb530deeb54.png)


## ③ Track.2 ``ホップ・ステップ・ジャンプ!`` 👍
先に探索される文字コードに見つからない文字があってか、日本語文字コード(S-JIS)になんとかお鉢が回ってきた様子。その判定にひっぱられ、アーティスト名も正しく ``洲崎西`` 、アルバム名もちゃんと☆が化けていない。
![ss_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/534fd03c-be7f-0b2e-5d59-f41e1039cb60.png)
※ EUC-JPじゃなくてよかったね！

## ④ Track.3 ``AUNG`` 👎
ASCIIしかなかったために、おそらくLaten-1扱いになったのだと思われる。
(流石にASCIIではない)
アーティスト名やアルバム名に欧米文字や豆腐が見られる。
![ss_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/344cc66b-cfdf-5490-2492-2e90f425153c.png)
※ ``¼`` も欧米文字。

# まとめ
* **テキストから文字コードの自動判別することは原則出来ない**
* マルチ プラットフォームな昨今において、旧来の ``システム文字コード`` を基点にして運用されていた時代のデータのままでは、もう運用できない。
   * 例1) スマホやカーナビに昔の音楽データを転送したら文字化けした
      * 流石にSJISの端末なんかあるか！😡 (S-JIS優先の端末はある様だけど、Xperiaとかだって基本海外端末だぜ？)
      * データにちゃんと文字コードを定義しろ (古いデータ仕様が悪い)  
       (例えばID3 TagならID3v2.3 or ID3v2.4の何れかでUNICODEを設定するのが望ましい。)
       ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/05e291c3-56d1-bd3a-1bef-c9935cf5baff.png)  
   * 例2) ZIP圧縮するWEBアプリを作ったら文字化けした
      * WEBアプリこそマルチ プラットフォームを本懐とするシステム
      * 日本国内ですら、WEBブラウジング可能なクライアントOSの文字コードがバラけている
      * ZIPに追加された仕様であるUNICODE ZIPを使え (その準備はほぼ整っている)
      * UNICODE ZIPに対応しないOS、ソフトウェアを排除しろ (Win7, Lhaplus, Java6など)

* 文字コード (キャラ セット) 運用について、パラダイム シフトが起きていることを自覚する必要がある。  
   * 国ごとに文字コード (キャラ セット) ⇒ 文字コードはUNICODEで統一
   * 実行ファイル ⇒ 内部処理をUNICODEで統一して行える様になった (WCHAR, Java VM, .NET CLR)
   * ID3 Tag ⇒ 文字コード情報を持てる様になり、UNICODEで統一出来る様になった (ID3v2.3, ID3v2.4)
   * ZIP ⇒ 文字コード情報を持てる様になり、UNICODEで統一出来る様になった (UNICODE ZIP)
gitの運用ルール

![2021-01-25_06h10_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222041/f88f827e-f03c-6fb6-55f3-9f9aa26a6442.png)

#Gitの流れ
gitの運用ルールに関して備忘。

##■最新のdevelopブランチに移動する
git checkout develop
git pull origin develop
##■自分のブランチを作る
git checkout -b {自分のブランチ名:future}
##■コミット
git add {対応してるファイル}
git commit -m "{コミット名}"
##■コミットをまとめる
git rebase -i HEAD~{コミットを実行した回数}
##■rebaseして最新のdevelopブランチのコミットを取得する
git pull --rebase origin develop
##■pushを実行
git push origin {自分のブランチ名:future}

すでにリモートにプッシュしている場合は-fでコミット履歴を上書きできる。
(1merge1commitなどの運用ルールがある場合利用)
git push -f origin {自分のブランチ名:future}
【JavaScript, Java】数値の桁数を取得する方法

#プログラミング勉強日記
2021年1月25日
数値の桁数の取得方法に困ったので、備忘録として書く。


#JavaScriptで数値の桁数を取得する

```js
let number = 12345;
let numberDigit = String(number).length;
console.log(numberDigit);   // 5
```

#Javaで数値の桁数を取得する

```java
int number = 12345;
int numberDigit = String.valueOf(number).length();   
System.out.println(numberDigit);  // 5
```


#入力した整数値の桁数を出力するプログラム

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>sample</title>

  <script type="text/javascript">
	//数値から桁数を取得する
	function getNumber() {
		// フォームから数値を取得する
		let inputNumber = document.getElementById("number").value; 
		// 取得した数値から整数部分の桁数を取得する
		let integerDigit = parseInt(inputNumber).toString().length; 
		//　桁数を出力する
		let output = "";
		if (inputNumber > 0) {
			output = integerDigit + "桁";
		}
	document.getElementById("digit").innerHTML = output;
	}
</script>
</head>

<body>
	<form>
		<input type="text" id="number"  onKeyUp="getNumber()">
	</form>
	<p id="digit"></p>
 </body>
</html>
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/74f34544-b012-1874-b627-ae19140c86f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/ae33bac9-dc1b-f66d-feda-87e53cf1e5f3.png)
[Go] GET リクエスト & レスポンスの取り扱い方

サーバー側の実装例をよくみかけますがｋ、GO ではクライアント側の実装もできます。

## 基本的な GET リクエスト

まずは、基本から。

```golang
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	url := "http://localhost:8080"
	resp, err := http.Get(url)
	if err != nil {
		log.Fatalln("Failed to get response")
	}

	content, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln("Failed to read content")
	}
	defer resp.Body.Close()

	fmt.Println(string(content))
}
```

netcat を使ってリクエスト内容を確認 (= `nc -l 8080`)。

```shell
GET / HTTP/1.1
Host: localhost:8080
User-Agent: Go-http-client/1.1
Accept-Encoding: gzip
```

標準では `User-Agent: Go-http-client/1.1` ですね。


## リクエストヘッダーにカスタムの情報を追加・編集

`User-Agent` を別の情報で表示する場合は、ヘッダーの編集が必要

```golang
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	url := "http://localhost:8080"

	// Client 型を取得
	client := http.DefaultClient

	// Request 型 (ポインタ) を取得
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		log.Fatalln("Failed to create reqeust")
	}

	// 任意の Header を作る。ここでは、Agent 名を変更
	req.Header.Add("User-Agent", "Custom Agent")

	// リクエストを送信、レスポンスを resp に入れる
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalln("Failed to get response")
	}

	content, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln("Failed to read content")
	}
	defer resp.Body.Close()

	fmt.Println(string(content))
}
```

netcat を使ってリクエスト内容を確認 (= `nc -l 8080`)。

```shell
GET / HTTP/1.1
Host: localhost:8080
User-Agent: Custom Agent # ちゃんと変わってる
Accept-Encoding: gzip
```

## Basic 認証

Basic 認証の仕組みを理解するついでに調べました。

```golang
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	url := "http://localhost:8080"

	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		log.Fatalln("Failed to create request")
	}

	// Basic 認証用の ID & Password
	req.SetBasicAuth("user", "passw0rd")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatalln("Failed to get response")
	}

	content, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln("Failed to read content")
	}
	defer resp.Body.Close()

	fmt.Println(string(content))
	fmt.Println(resp.StatusCode)
}
```

netcat を使ってリクエスト内容を確認 (= `nc -l 8080`)。

```shell
GET / HTTP/1.1
Host: localhost:8080
User-Agent: Go-http-client/1.1
Authorization: Basic dXNlcjpwYXNzdzByZA==  # base64 デコードすると user:passw0rd
Accept-Encoding: gzip
```

ヘッダーに base64 エンコードされた ID & パスワードを入れるとなると、確かに安全ではないですね。。
RealSenseD435iで手指を取得したいが駄目そうだった

なんかNui使いなさいってことなのかな。。

###参考サイト

Unity Wrapper for RealSense SDK 2.0を使用して、ハンドトラックからデータを取得することは可能ですか？
https://support.intelrealsense.com/hc/en-us/community/posts/360051213994-Is-it-possible-with-Unity-Wrapper-for-RealSense-SDK-2-0-to-get-data-from-hand-track-

Real Sence D400シリーズ備忘録
https://qiita.com/sy_/items/8c27c4236113dd38a9d0
ArducamのMulti Camera Adapter Module V2.2をRaspberry Piで動かし４カメラを１カメラに統合(できなかった話)

Arducam Multi Camera Adapter Module V2.2を使って４カメラを一つにしたかったメモ

# カメラ接続の確認とモジュール更新

```
vcgencmd get_camera
```

「supported=1 detected=1」

正しくカメラモジュールが認識されていない
「supported=1 detected=0」

```
sudo apt-get update
sudo apt-get upgrade
```

```
pip3 install opencv-python
```




```
sudo apt-get install libatlas-base-dev
```


# Arduカメラの手順通りにデータインストール

```
git clone https://github.com/arducam/RaspberryPi.git
```

```
sudo apt-get install libopencv-dev
sudo apt-get install cmake
```

いるかも？どのみちOpenCVないからコンパイルできない。。

```
cd RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_4Channel/Multi_Camera_Adapter_V2.2_C++/

make
```


``` 
mmal: Cannot read camera info, keeping the defaults for OV5647
mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
```


##トラブルシューティング
video0が見つかりません
i2cバスが正常かどうかを確認します
dtparam = i2c_vc = onを/boot/config.txtに追加してから、再起動します
i2cdetect -y 0を実行して、デバイスのアドレスを確認します。
デバイスのアドレスが検出されない場合は、リボンケーブルの接続をチェックして、逆になっていないことを確認してください。

#このときの結論

購入したハードウェアが故障してたか、カメラは４つともラズパイ用のカメラにしていたのですが、合わなかったのか。。なぞのまま動作せず、。



#参考サイト

Raspberry Pi用マルチカメラアダプタ V2.1
https://www.switch-science.com/catalog/5757/

Arducam Multi Camera Adapter Module V2.2 for Raspberry Pi 4 B, 3B+, Pi 3, Pi 2, Model A/B/B+, Work with 5MP / 8MP / High Quality Cameras
https://www.arducam.com/product/multi-camera-v2-1-adapter-raspberry-pi/

ArduCAM/RaspberryPi
https://github.com/ArduCAM/RaspberryPi/tree/master/Multi_Camera_Adapter/Multi_Adapter_Board_4Channel

【Raspberry Pi】Raspberry Pi Zero WにOpenCVの環境を構築する
https://rikoubou.hatenablog.com/entry/2019/05/21/151337

Webカメラでこまったらまずこれをやれ
https://qiita.com/naoppy/items/74bdfa8216c7223f584b

Raspberry PiとUSBカメラで監視カメラを作る
https://cgbeginner.net/raspi-monitor-camera/

FAQ
Arducam has released Multi-Adapter-Board-V2.2. We have made a summary of the problems that customers often encounter.
https://www.arducam.com/docs/cameras-for-raspberry-pi/multi-camera-adapter-board/faq/

RaspberryPi3にカメラモジュールを接続する
https://qiita.com/h-sakano/items/9f7743830f32f18b291c

PiCam異常時の現象
https://research.itplants.com/?p=1617

RaspberryPiでカメラを使う(raspivid, raspistill, fsbcam)
https://blog.kwst.site/202006135342/

1,000円のラズパイ用カメラがラズパイZeroで使えなかった話
https://shigeru-orikura.com/2020/05/06/raspistill-command-error/

Raspberry Piに接続されているwebカメラの情報をv4l2-ctlで簡単に取得したい
https://dev.classmethod.jp/articles/raspberry_pi_v4l2_ctl_get_resorution_from_webcam/

Raspberry Pi Multi Camera Adapter Module V2.2 User Guide
https://www.uctronics.com/download/Amazon/B0120.pdf

i2c-0が見えない
http://nanicananica.blog.fc2.com/blog-entry-50.html
【JSP/サーブレット】　インクルード（include)の実装 動的＆静的インクルード

#インクルードとは:mag:
JSPファイルが他のJSPファイルを取り込み表示させる仕組みです。
<font color="Red">**動的インクルード**</font>と<font color="Red">**静的インクルード**</font>の２種類の方法があります。

#１，ソースコード
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/f694a674-b691-1cdc-9dec-68e1a2bb3b84.png" width="600">

#２，ブラウザ表示
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/27e2abf8-bd4c-b775-6230-e324f18ed80e.png" width="600">

#３，振り返り:beer:
動的インクルードは、「実行中」に他のJSPファイルの「内容」を取り込む
動的インクルードは、実行後にインクルード元に処理が戻ってくる

静的インクルードは、「実行前」に他のJSPファイルの「内容」を取り込む
静的インクルードは、変数やインスタンス、クラスをインクルード元で利用することができる

#４，次のステップ:airplane:
次回は、リクエストメソッド（”GET”、”POST"）を扱います。
JSPファイルからサーブレットクラスへのページ遷移になります。

キーワード : doGet doPost　:mag:
TypeScriptのnamespaceは非推奨ではない

## 結論から

公式の [TypeScript ドキュメント](https://www.typescriptlang.org/docs/handbook/namespaces-and-modules.html)の何処にも namespace を非推奨と示唆する記載は無い。
尚且つ [microsoft/TypeScript#30994(comment)](https://github.com/microsoft/TypeScript/issues/30994#issuecomment-491998238) で TypeScript チームのリード開発者である Ryan Cavanaugh 氏が述べているように将来的に廃止される事も無い。

TypeScript の namespace について調べると公式では無い記事や投稿で非推奨（deprecated）というワードが目立つ事、tslint や typescript-eslint を使用していると namespace の使用で注意されてしまう事などから非推奨と認識されてしまっていると推測する。

個人的に「非推奨」という強いワードは「使用するな」というメッセージ性を感じる。開発者同士の間で誤解を生みかねないため namespace は非推奨では無いと伝えるためこの記事を書こうと思った。

## namespace の使用が敬遠される理由

非推奨という訳ではないが namespace の使用が推奨されている訳でも無い。
なぜならば JavaScript 標準仕様である ESModules の import / export の使用で大体は namespace を使わずとも解決するからだ。現に typescript-eslint でも [no-namespace](https://github.com/typescript-eslint/typescript-eslint/blob/v3.10.1/packages/eslint-plugin/docs/rules/no-namespace.md) というルールが存在しており、import / export を優先して使用するよう設定されている。

## namespace が便利な時

標準的な import / export で殆ど事足りる事は事実である。
それでも namespace の方が適しているケースもあると思っている。以下いくつかのパターンを紹介する。

### ① オブジェクトとして型を名前付き export したい時

```ts:namespace
/**
 * modules/hoge.ts
 */
export namespace Hoge {
    export type LowerCase = 'a' | 'b' | 'c';
}

/**
 * example.ts
 */
import { Hoge } from './modules/hoge.ts';

let text: Hoge.LowerCase = 'a';
```

```ts:no-namespace
/**
 * modules/types.ts
 */
export type LowerCase = 'a' | 'b' | 'c';

/**
 * example.ts
 */
export * as Hoge from './modules/types';

let text: Hoge.LowerCase = 'a';
```

前者も後者も `Hoge` という名前で型オブジェクトを import している。
namespace を使用する前者は `Hoge` という名前付き export しているのに対して、後者では as 句を使用して `Hoge` という名前で import するようにしている。私個人的な意見としては、この場合は前者の方が優れていると考える。後者の場合、自由に名前をつけて import できてしまう事から一貫性が損なわれてしまう。

### ② ネストした型オブジェクトを export したい時

```ts:namespace
/**
 * modules/sample.ts
 */
export namespace Sample {
    namespace Hoge {
        export type LowerCase = 'a' | 'b' | 'c';
    }
}

/**
 * example.ts
 */
import { Sample } from './modules/sample';

let text: Sample.Hoge.LowerCase = 'a';
```

```ts:no-namespace
/**
 * modules/types.ts
 */
export type LowerCase = 'a' | 'b' | 'c';

/**
 * modules/re-export.ts
 */
export * as Hoge from './modules/types';

/**
 * example.ts
 */
import * as Sample from './modules/re-export';

let text: Sample.Hoge.LowerCase = 'a';
```

`Sample.Hoge.LowerCase` のような形で型を扱いたい場合に、前者の namespace ではネストした形で表現できるのに対し、後者の ESModules 形式で同じ形を実現させるには re-export を使用する必要が出てくる。各ファイルをモジュールとして扱う ESModules の仕様的には何もおかしくはないが、単純にそこまで分割管理したく無い場合には namespace を活用できる。


### ③ d.ts で型をグローバルに扱いたい時

```ts:namespace
/**
 * @types/example.d.ts
 */
namespace Hoge {
    export type LowerCase = 'a' | 'b' | 'c';
    export type UpperCase = 'A' | 'B' | 'C';
}
```

```ts:no-namespace
/**
 * @types/example.d.ts
 */
type LowerCase = 'a' | 'b' | 'c';
type UpperCase = 'A' | 'B' | 'C';
```

型定義ファイル（d.ts）なので ESModules との比較という意味では内容が少し逸れますが、型をグローバルに定義したい場合 d.ts が有効です。その際、後者のように型定義してしまうとグローバルで複数の型が散乱し名前衝突を起こしてしまう可能性が増えます（俗に言うグローバル汚染）。また IDE 上でも複数の型がサジェストされるようになってしまう。[型の国のTypeScript（幽霊 namespace）](http://typescript.ninja/typescript-in-definitelyland/definition-file.html#fn-ghost-module) でも同じ様に namespace の活用事例が紹介されている。
【JSP/サーブレット】　リダイレクト（redirect)の実装 How to Redirect Request from Java Servlet to JSP

#前回まで...:train2:
前回では、[フォワード(forward)](https://qiita.com/iwasaki-hub/items/47d6e22bc0dcb6ed25b8  "フォワード(forward)")を扱いました！

#リダイレクトとは:mag:
リダイレクトは、ブラウザのリクエスト先を変更して処理の転送を行います！

#１，ファイルの配置確認:blue_book:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6bb4da7b-862f-f3ca-c6d6-72521f907b59.png" width="400">

#２，HelloServlet.javaにリダイレクト用のソースコードを追記:pencil2:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/2a56f5aa-7b9a-c4ac-12d9-8b7b9ea00878.png" width="600">

#３，サーバーを起動:cat:
>サーバー起動（Tomcat）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/40388efb-9c51-b698-67f1-33795ec5b319.png" width="600">

>ブラウザ表示（Google Chrome）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/bd53c5ef-ca92-dd7a-66ab-ba294d8fd4df.png" width="600">

#４，振り返り:beer:
サーブレットクラスを起動すると、ＪＳＰファイルの処理結果が表示されました！

フォワードと同様、サーブレットクラスも表示されているのですが、一瞬すぎて見えないだけです:zap:

これがリダイレクトです！

URLとリクエストメソッドにも注目すると、

　URL ⇨ localhost:8080/JSP_Servlet/view/<font color="Red">**index.jsp**</font>

　Request Method ⇨ <font color="Red">**GET**</font>

となっています.

今回は、ブラウザのリクエスト先がindex.jspになっていることがわかります！

#５，次のステップ:airplane:
次回は、JSPファイルにフォーカスして[インクルード（include）](https://qiita.com/iwasaki-hub/items/32b3eca5b431b6baa55f  "インクルード（include）")について扱います！

キーワード : include　:mag:
JavaScriptで最後の単語の長さ取得


#説明
 * 文字列がスペースで区切られたいくつかの単語で構成されている場合、文字列の最後の単語の長さを返します。

#例
```
入力： s = "Hello World"
出力： 5
```

#ソース
```javascript:JavaScript
/**
 * @param {string}
 * @return {number}
 */
var lengthOfLastWord = function(s) {
    return s.trim().split(' ').pop().length;  
};
```

#説明

 * trim()で文字列の最初と最後のスペースをすべて削除します。
 * split(' ')文字列をスペースで分割して配列に変換。
 * pop()で最後の要素を返す。
 * .lengthで上記の要素の長さにアクセス。
【Docker + CircleCI + Rails】Missing secret_key_base エラー

## 環境
Ruby 2.7.1
Rails 6.0.3.4

CircleCIを使ってECSへデプロイ時に以下のようなエラーが発生

```
rake aborted!
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
```

## 結論
Railsのmaster.keyをCircleCIの環境変数に設定しconfig.ymlとDockerfileに設定した環境変数を渡す事で解決しました。

### Step1
CircleCI環境変数設定
nameを`RAILS_MASTER_KEY`とし、
valueに`master.key`の値を入力


### Step2
Dockerfileに追記

```dockerfile:Dockerfile
# 追記
ARG RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}
```

### Step3
CircleCIの設定

```:.circleci/config.yml
      - aws-ecr/build-and-push-image:
          # 追記
          extra-build-args: '--build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY}'
```
extra-build-argsで設定する事でCircleCI内で設定した環境変数をRails側でENVとして受け取る事が出来るとのことです。

## 参考にさせていただいた記事
- [CircleCIを使ってAWS ECSにRailsをデプロイ](https://gyabooo.hatenablog.com/entry/2019/12/25/133258 "CircleCIを使ってAWS ECSにRailsをデプロイ")
- [【実践: 詳しくわかる】TerraformでCircleCIを通してAWSにECS環境を自動構築する方法](https://tech-mr-myself.hatenablog.com/entry/2020/01/04/210518 "【実践: 詳しくわかる】TerraformでCircleCIを通してAWSにECS環境を自動構築する方法")
ゲーム理論入門　２

# Graph Games
Impartial gameはグラフの頂点をゲームの中の状態、グラフの辺をゲームの動作と同一視す る事によって有向グラフで表せる。

## Rules
有向グラフ G は、空集合でない頂点(状態)の集合 X と、各 $X ∋ x$ に対して、X の部分集 合 $X ⊃ F(x)$ を満たす関数 F を用いて $(X, F)$ と表される。X ∋ x に対して、$F(x)$ は、$x$ からプレイヤーが 動かせる状態を表している (x の follower と呼ばれる)。もし、F(x) が空集合なら、x は terminal position である。
2 人で行う勝敗のあるゲームは、最初の状態が X ∋ $x_0$ と規定され、次のルールを使って、$G = (X, F)$ の ようなグラフでプレーされる。
(1) プレイヤー問が $x_0$ から最初に動かす。
(2) プレイヤーは交互に動かす。
(3) 状態 x で、それを動かすプレイヤーは、次の状態 $y ∈ F(x)$ を選ぶ。

## Sprague-Grundy 関数
グラフは、P-位置と N-位置が与えられることによって解析されるが、Sprague-Grundy 関数を通しても
また解析されている。

グラフ $(X, F)$ の Sprague-Grundy 関数は、X と非負整数の値で定義された関数 g であり、次のように定義される

```math 
g(x)=\min \{ n≥0:n ≠ g(y) : y∈F(x) \}
```

g(x) は、x の follower の Sprague-Grundy 値の中で見つからない最小の非負整数である。もし、集合の 中にない最小の非負整数としての、非負整数の集合を minimal excludent、または mex と定義すると、単純に

```math 
g(x)= mex \{ g(y) : y∈F(x) \}
```

g(x) は、x の全ての follower y に対する、g(y) によって定義される。のでterminal から逆算的に求めていける。
terminal である x は、F(x) が空集合なので、g(x) = 0 と定 義される。全ての x の follower が terminal である、terminal でない x は、g(x) = 1.

g(x) = 0 である状態 x は P-位置で、その他の状態は N-位置である。勝つ方法は、各動作において、 Sprague-Grundy 値が 0 になる頂点への動作を選ぶことである。

### Prop
1. もし x が terminal position なら、g(x) = 0
2. g(x) = 0 である x からの全ての follower y は、g(y) ≠ 0 である。
3. g(x) ≠ 0 である x からは、g(y) = 0 となるような、follower y が少なくとも 1 つある。
julia v1.5.3から始めるJupyter Notebook



[前回](https://qiita.com/doorei/items/c0916f0866bfc2859c2f)、juliaをインストールしたあと環境をきれいにしたところ、juliaがちょっとバージョンアップしていた。特に困ったことはないけど再々々度書いてみる。
※[Julia1.5.4対応版はこちら](https://qiita.com/doorei/items/854ede6ebf872d2b4861)

# やってみた環境
- Windows 10 Home (64bit) Ver 20H2 (OSビルド19042.746)
- julia v1.5.3 (64bit)

# やり方
0. juliaがインストール済みの前提(インストーラー版)
1. juliaのコンソールを起動(緑字のプロンプト)
2. `]`キーを押してパッケージモードへ(青字のプロンプトになる)
3. `add IJulia`を実行(Cloning～となり、しばらく時間がかかる)
4. バックスペースでパッケージモードを抜ける(緑字のプロンプト)
5. `using IJulia`を実行(Precompilingされる)
6. `notebook(detached=true)`を実行
7. 「install Jupyter via Conda, y/n? [y]:」と聞かれるので`y`を入力
8. 関連パッケージがダウンロードとインストールされる。(結構時間がかかるので気長に待つ)
9. Jupyterが起動する！「New」のプルダウンにはJulia 1.3.1、Julia 1.4.2、Julia 1.5.3とpython 3が出てくる

juliaからインストールしたcondaはjulia専用(?!)なのでDisk容量がもったいないといえばもったいないけど、面倒なことを考えないでJupyterが使えるようになるのでまずやりたいことをやる！という場合にはいいんではないでしょうか？

ちなみにjuliaからインストールしたcondaでインストールしたパッケージの確認などは次のようにします。

```julia
julia> using Conda                    
Julia> Conda.list()                   # Condaでインストールしたパッケージ一覧 
Julia> Conda.update()                 # Condaでインストールしたパッケージのアップデート
Julia> Conda.install("package_Name")  # Condaで"package_Name"をインストール⇒「conda install -y package_Name」を実行
Julia> Conda.clean()                  # Condaでインストールされた不要なパッケージの削除
```

上記の`using Conda`でエラーが出る場合は一回だけ次のようにパッケージを追加する必要があります。
`]`キーを押してパッケージモードへ(青字のプロンプトになる)

```julia
Julia> add Conda
```

# 普段のjupyter起動
念のためですがインストールが終われば次からは下記だけでjupyter Notebookが起動します。

```julia
julia> using IJulia
julia> notebook(detached=true)
```

# IJuliaのbuild不要について
@tainakanchu さんがおっしゃっている通り、IJuliaは別途buildは不要でした。
もしかしたら1.5の時からそうだったかも…。
【JSP/サーブレット】　フォワード（forward)の実装  How to Forward Request from Java Servlet to JSP

#前回まで...:train2:
サーブレットクラス（[HelloServlet.java](https://qiita.com/iwasaki-hub/items/ed781ebe773d25cb28e9 "HelloServlet.java")）とJSPファイル（[index.jsp](https://qiita.com/iwasaki-hub/items/3c17d694930e2fcffb33 "index.jsp")）を作成しました。

#フォワードとは:mag:
フォワードを使用すると、サーブレットクラスがJSPファイルに出力の表示を依頼することができます！


#１，ファイルの配置確認:blue_book:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/6bb4da7b-862f-f3ca-c6d6-72521f907b59.png" width="400">

#２，HelloServlet.javaにフォワード用のソースコードを追記:pencil2:

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/e952f86c-ee6f-a226-c41b-51a80e99e312.png" width="600">

#３，サーバーを起動:cat:
>サーバー起動（Tomcat）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/0611f0d8-3e36-40cb-7bcc-a55f150e8b87.png" width="600">

>ブラウザ表示（Google Chrome）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/9c55c3ad-773e-81fe-bf90-682bad9c8c1f.png" width="600">

#４，振り返り:beer:
サーブレットクラスを起動すると、ＪＳＰファイルの処理結果が表示されました！

もちろん、サーブレットクラスも表示されているのですが、一瞬すぎて見えないだけです:zap:

これが<font color="Red">**フォワード**</font>です！

URLとリクエストメソッドにも注目すると、

　URL ⇨ **localhost:8080/JSP_Servlet/**<font color="Red">**HelloServlet**</font>

　Request Method ⇨ **GET**

となっています.

JSPファイルが表示されているのに、サーブレットクラス名が末尾に記述されています！

#５，次のステップ:airplane:
次回は、[リダイレクト（Redirect）](https://qiita.com/iwasaki-hub/items/4083fe9b4c4787f0b065  "リダイレクト（Redirect）")を扱います！
これも、サーブレットクラスからJSPファイルに画面遷移する方法です！

キーワード : response.sendRedirect　:mag:
プログラミング学習で使った無料のサービスをリストアップする

# はじめに
私は約1年間、プログラミング学習を続けてきました。
2020年2月から学んできた主なコンピュータ言語は、ざっくりと以下となります。
`Python` → `Java` → `HTML`, `CSS` → `JavaScript` → `Node.js` → `(FW)Express` -> `Linuxコマンド`

今回、その学習の中で利用してきた無料のサービス（だけ）をリストアップする記事を書きます。
自身が十分に使ったことのないサービスは項目に入れません。

# 学習サービス

## [Paizaラーニング](https://paiza.jp/works)

オンライン学習サービスだと[Progate](https://prog-8.com/), [ドットインストール](https://dotinstall.com/)などが有名ですが、私はほとんど利用しませんでした。
Paizaラーニングも上記2サービスと同様に月額課金制なのですが、**Python**, **C#** は完全無料で利用することができます。
章末の練習問題で、理解度チェックもすぐ行えるのはPaizaラーニングの特徴だと考えます。

「変数とは何ぞや」から「クラスを利用する」ところまで、簡単な文法を一通り学べました。
この講座だけでも、おみくじやじゃんけんアプリくらいなら作れるのではないでしょうか（多分）
私はこのあとPythonでDiscord BOTを作り、また今でも かんたんなアルゴリズム問題はPythonで解くようにしています。

- [Paizaラーニング - Python3入門編](https://paiza.jp/works/python3/primer)
- [Paizaラーニング - C#入門編](https://paiza.jp/works/search_courses/2201)


## Udemy

Udemyは数時間～十数時間に及ぶ動画講座を購入・視聴するサービスですが、一部は無料で公開されています。
無料の講座の中で特にオススメなのはAWSとGitに関する、次の初心者向け講座です。

### [Udemy - AWS：はじめてのAmazon Web Services ](https://www.udemy.com/course/aws-for-beginner/)

インフラやネットワークの知識がなくとも、「同じ操作をしたらAWS EC2でWebアプリケーションの公開ができる」ように作られています。
このAWSの講座内ではWordPressを公開する方法が紹介されていますが、読み替えたり検索したりすることで、私は別のプログラミング言語を使ったWebアプリケーションを公開しました。
さらに、「同じ操作をしたらとりあえず公開ができる」と同時に、自身にどのような知識が足りていないかがわかるようにも説明がなされているので、
自分が学習すべき/補うべき知識が認識しやすいです。


###[Udemy - Git:はじめてのGitとGitHub](https://www.udemy.com/course/intro_git/)

Gitの講座に関しては、「Gitって何？Git使うとどう便利になるの？」というところから、基本的なコマンドの学習、GitHubの連携までをハンズオン形式で学習できます。
これを学んだだけでは十分ではないのかもしれませんが、最低限のバージョン管理方法と、リモートリポジトリ連携の知識は身につくかなと感じます。
講座によって「Gitってだいたいこんなもの」は理解できるため、[サル先生のGit入門](https://backlog.com/ja/git-tutorial/)や、評価の高い他のGit講座（有料）にうつり学習を進めるのもよさそうです。

## Others

### [SQL攻略 - Web上でSQLを実行しながらマスターするサイト](http://sql.main.jp/)

（事前に簡単なテキストを少し読み込んでおかないと難しい気もしますが）
Webブラウザ上でSQLの練習ができるため（しかも解説つき）非常に便利です。
所属コミュニティのエンジニア仲間もおすすめしていました。

###[初心者のための Node.jsプログラミング入門](https://www.tuyano.com/index2?id=1115003)

サーバーサイドNode.jsと、そのフレームワークExpressに関する無料の情報です。
正直HTTPプロトコルのようなWeb技術の基本がわからなければ、読みこなすのは難しい内容かなと思います。

また、このサイトの管理者が別で執筆していらっしゃる[Node.js超入門](https://www.amazon.co.jp/dp/B08HRMTXHB/)を最近読んだのですが、Webサイトと比べ圧倒的に内容が濃かったです。
~~正直このサイトを参照するよりも本買ってしまったほうがよいのでは？~~

フレームワークであるExpressに関しては日本語訳が充実しているため、[公式リファレンス](https://expressjs.com/ja/)も、初心者であってもそれなりに読み込むことができそうです。

### [Linux標準教科書](https://linuc.org/textbooks/linux/)
Linuxコマンドをはじめとして、様々なLinuxの知識が（恐らく浅く）わかりやすく解説されている教科書です。
アンケートに答えることで無料でpdfファイルをダウンロードできます。


# 本番環境

## Heroku
クレカ登録なしの無料枠では、月の稼働時間600時間（うろおぼえ）でWebアプリケーションを公開することができます。
クレカ登録した場合の無料枠では稼働時間が720時間（24時間x30日）に延長されます。
Herokuを使ってWebアプリケーションをデプロイして、私は就職活動に臨んでいました。

## github.io
GitHubのリポジトリと結びつけることで、静的サイトを公開することができます。
ポートフォリオサイトのランディングページや、静的なコンテンツ（ソーシャルゲームの補助ツール）作成に使っていました。

# おわりに
今回は無料で（無料でも）利用できるWebサービスを紹介しましたが、
近所の図書館などで本を借りて知識を得るのも、強力な手段です。

（そして時にはお金を払って情報を取得することも大切です。世に出回る名著は、お金を払ってでもほしい情報だからこそ、売れているのです！）

お試しあれ！
Amazon SNSでSMSする時のPolicy設定

「AWS LambdaからSMSを送りたい」と思い、こちらの記事「[【AWS】Lambda+Amazon SNSでSMSを送信する - Qiita](https://qiita.com/duplicate1984/items/8a3ce5c434a44b2b04fd)」を参考に実装していました。Lambdaへの権限を絞る時に少しつまづいたのでメモに残します。

結論を先に載せますと、こちらのStackOverflowの記事「[Authorization when sending a text message using AmazonSNSClient - StackOverflow](https://stackoverflow.com/questions/38871201/authorization-when-sending-a-text-message-using-amazonsnsclient)」を参考に解決しました。

## つまづいたところ

SMSの送信にはAmazon SNSサービスの`sns:Publish` 権限を利用します。
しかし、この権限には**リソース**の指定が必要です。

以下のような「全てのリソースへのアクセスを許可する」ポリシーを作れば解決しますが、これではアカウント・リージョンを絞らないまま、今回使わないSNSトピックに手が届いてしまいます。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "*"
        }
    ]
}
```

では、「SMS用のトピックを作ればいい」、という話になります。これが可能な場合はもちろんそうすれば良いですが、今回はサブスクライブ先の電話番号を管理したくありませんでしたのでその方法は取りませんでした。

## 解決方法

以下のように、まず

・「全てのアカウント・リージョンのトピック」に対するPublish権限を拒否

した後、

・全てのリソースへのPublish権限を許可

することで解決しました。



```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "arn:aws:sns:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "*"
        }
    ]
}
```

### おまけ：電話番号が固定の場合（未検証）

「特定の電話番号に対し許可」する場合は、エラーメッセージから推測するに、以下の方法でできるのではないかな、と思います（未検証です）。
以下では、日本国内電話番号のみ許可しています。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "+81*" 
        }
    ]
}
```

### おまけ：CDK

CDK（TypeScript）ではこんな風に書きました。

- Node.js： 14.15.4
- CDK： 1.50.0

```ts
// 関数
public static createSMSPublishRoleStatement(): PolicyStatement[] {
    // SNSトピックリソースへのPublishを全面禁止
    const denyPolicy: PolicyStatement = new PolicyStatement({
      effect: Effect.DENY,
      actions: ["sns:Publish"],
      resources: ["arn:aws:sns:*:*:*"],
    });
    // 電話番号でPublishできるよう許可
    const allowPolicy: PolicyStatement = new PolicyStatement({
      effect: Effect.ALLOW,
      actions: ["sns:Publish"],
      resources: ["*"],
    });
    return [denyPolicy, allowPolicy];
}

public static addPolicyStatementsToLambda(
    lambdaFunc: LambdaFunction /*(Function as LambdaFunction)*/,
    policyStatements: PolicyStatement[]
): void {
    policyStatements.forEach((policyStatement: PolicyStatement) => {
      lambdaFunc.addToRolePolicy(policyStatement);
    });
}

// 実行
const smsPublishPolicyStatements: PolicyStatement[] = createSMSPublishRoleStatement();

addPolicyStatementsToLambda(
    ${"ポリシーを紐付けたいLambda"},
    smsPublishPolicyStatements.concat([
        ${"他のポリシーステートメント"},
    ])
);
```
カメラの画角についてのまとめ

カメラの「画角」についてのまとめ。
主に[『デジタル画像処理』](https://www.amazon.co.jp/dp/490347464X/ref=cm_sw_r_tw_dp_9BydGbW2E2NW4?_encoding=UTF8&psc=1 )を参照する。

#画角とは
カメラで撮影する際、写る範囲のことを画角(angle of view)という。
撮像素子の両端をレンズの中心で結んだときの__角度__で表す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/64edefa6-4a21-51d7-1684-ab34193de9b8.png)
引用：https://www.nikon-image.com/enjoy/phototech/manual/19/01.html

撮像素子(さつぞうそし)：光を画像データに変換する装置
焦点距離：撮像素子からレンズの中心までの距離

撮像素子の幅と高さに対応する画角を、それぞれ__水平画角__と__垂直画角__と呼ぶ。
だが、基本は撮像素子の対角線をレンズに伸ばした時に求まる__対角線画角__で表す事が多い。

# 画角の求め方
画角は__①撮像素子の大きさ__と__②焦点距離__によって求まる。

画角θはレンズ焦点距離f[mm]と撮像素子S[mm]から、以下の式で表す。
![tan.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/e3e1c8ca-e3b3-08df-7bca-0cd93b3b7e60.png)
公式の導き方は以下。
![camera.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/4494bb48-4f4c-7afe-c4ed-3990d900e6da.jpeg)
## 画像素子サイズ
画像素子のサイズは変更できないため、カメラを選定することによって決定する。

画像素子サイズ一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/5919fbc9-cdcd-2cd2-1558-3e92450262da.png)
転載元：http://machizukan.net/DK/dj_came/ccd_gakaku/index.html

最も標準的なのは__フルサイズ(35mmフィルム)__
焦点距離と画角を紐付ける際、撮像素子サイズは固定しておく必要があるが、その場合はフルサイズとみなして計算する。

## レンズ焦点距離
レンズ焦点距離が長いほど被写体は大きく撮影され、撮影できる範囲は狭い。レンズ焦点距離が短いほど被写体は小さく撮影され、撮影できる範囲は長い。

__35mmフィルム換算焦点距離__(フルサイズの場合の焦点距離)において、
焦点距離が50mm前後のレンズを標準レンズ、これより焦点距離が短いレンズを広角レンズ、長いレンズを望遠レンズと呼ぶ。


ちなみにLogicoolのWebカメラ（[C922N](https://www.logicool.co.jp/ja-jp/product/c922n-pro-stream-webcam)）の画角を調べてみたところ「78°」だった。Webカメラってすごく広角なんですね。
AWS EC2でのwebp変換について ImageMagick


### 環境：
```
AWS
EC2
centos7
最低限convert(ImageMagick)が動く (バージョンは6.8前後)
```

### ImageMagickでwebpに変換する：

デフォルトでimagemagick(convert)でwebpに変換しようとすると

```shell
convert: delegate failed `'cwebp' -quiet %Q '%i' -o '%o'' @ error/delegate.c/InvokeDelegate/1928.
```

とエラーになる。

知ってる人には当たり前の知識っぽいが、convertの中は単に外部ライブラリを呼んでるだけっぽいので手動でcwebpをインストールしてやる。

```shell
yum install libwebp-tools -y
```

yumすら入っていない場合は論外

これでconvertでwebpに変換出来る

```shell
convert a.png a.webp
```



### 追伸：
よく見かけるフォーマット確認コマンドを打っても何故か相変わらずwebpは見つからない・・・

```shell
convert -list format | grep -i webp
```
Google cloud scheduler で Functionsを定期実行する

# Google cloud scheduler で Functionsを定期実行する

## はじめに

最初にSchedulerに実行させる Functionsを作成
※ 定期実行させるFunctionsの作成、デプロイは[こちら](https://qiita.com/morita-toyscreation/items/e5d62673c3c5fafbdbbc)の投稿を参照

**ポイント**
1. Functionsは以下コマンドでデプロイを行うとPub/Subトピックが自動的に作成される
2. Pub/Subを実行すると対象のFunctionsが実行される
3. Schedulerから指定した時間でPub/Subを実行しFunctionsを実行する
ポイントは`--trigger-topic` でこれを指定するとPub/Subで実行するFunctionsが作成される

```
gcloud functions deploy favorite --timeout=300 --entry-point=favorite --source=./functions/favorite --runtime python37 --trigger-topic favorite_action --allow-unauthenticated
```

下記は私が作ったFunctions
![screencapture-console-cloud-google-functions-list-2021-01-25-00_29_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/1b700941-5713-0738-f9ce-7646f8c7749f.png)
Pub/Subも作られる
![screencapture-console-cloud-google-cloudpubsub-topic-list-2021-01-25-00_28_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/437aa61d-3627-a995-05c3-6fac728097fd.png)

## スケジューラー設定

頻度はcrontabの設定と同じ
ターゲットはPub/Sub、HTTPが指定できる
今回はPub/Sub
![screencapture-console-cloud-google-cloudscheduler-jobs-edit-us-central1-twitter-function-favorite-2021-01-25-00_22_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/62929ff7-fb33-220b-248a-872b8ee42b4a.png)


トピックに対象のPub/Subを指定する
このSchedulerの場合、毎日10〜２２時ちょうどにFunctionsが実行される
![screencapture-console-cloud-google-cloudscheduler-jobs-edit-us-central1-twitter-function-favorite-2021-01-25-00_32_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/3587e47b-03a1-0176-4cd3-3554220e38cb.png)
JavaScriptの非同期処理について①

業務でTypeScript（JavaScript）を使うようになり、なんとなくで実装していた非同期処理について学習した結果をアウトプットしたいと思い、初投稿することにしました。
文章構成等、下手くそな部分もあるかも知れませんが、温かく見守ってやってください。
##そもそも非同期処理って？
>非同期処理は、あるタスクが実行をしている際に、他のタスクが別の処理を実行できる方式である。同期処理では、あるタスクが実行している間、他のタスクの処理は中断される方式である。
【参考サイト】（http://ossforum.jp/node/753）

上記にも記載ある通り、非同期処理は、あるタスクが実行中に他のタスクも実行できるような実行方式です。
何の話？となるかもしれませんが、まずは非同期処理を学ぶ前に「同期処理」とはなにかから振り返ってみましょう。
***
###・同期処理
同期処理は、__プログラムを1つ1つ上から順番に実行__していく方式です。

```javascript
function func1(){
  return "Function1!!!";
}
function func2(){
  return "Function2!!!";
}
console.log(func1());
console.log(func2());
```
上記のコードですと、単純に上から順番に実行され、
1.「Function1!!!」
2.「Function2!!!」
の順番でコンソールにメッセージが出力されます。順番に処理が実行される、これが同期処理です。プログラムが上から順番に1つずつ実行され、処理の完了を待ってから次の処理が実行されていきます。
上から順番に処理が実行されていくので、例えばfunc1の処理時間が10分かかるとすると、func2が実行されるのはfunc1の処理が完了した後（10分後）となります。
同期処理は、時間のかかる処理があると、その処理が完了するまで他の処理の実行ができません。その間ユーザも操作できない、トータルの実行時間もかかってしまう・・・それならば__時間のかかる処理は別の場所に投げてしまい、その間に軽い処理を行ってしまおう！__という考えから作られたのが非同期処理です。
***
###・非同期処理
非同期処理は、先ほどお伝えした通り、あるタスクが実行中に他のタスクも実行できるような処理方式です。
参考に以下コードを考えてみましょう。

```javascript
console.log('First');
setTimeout(() => console.log('Second'), 2000);
console.log('third');
```
同期処理の考えですと、以下順番でコンソールにメッセージが表示されるはずです。
`1.「First」`
`2. 2000ミリ秒後に「Second」`
`3.「third」`

ですが、実際には
`1.「First」`
`2.「third」`
`3. 2000ミリ秒以降に「Second」`
という順番でメッセージが表示されます。なぜでしょう・・・？？

###・setTimeout
setTimeoutは__コールバック関数__と、実行遅延時間を引数に取るメソッドです。
実行遅延時間が経過したらコールバック関数の処理を開始するようなイメージです。

```javascript
setTimeout('コールバック関数', '実行遅延時間');
```
setTimeout自身は非同期処理を行うメソッドで、処理が呼ばれた時点で別の場所に処理を投げて、時間が経過した後にコールバック関数を実行する形になっています。
このように、非同期処理は、外部に処理を投げてその間に他の処理を実行し、外部に投げた処理が完了した段階でまた処理を再実行するような仕組みとなっています。

##まとめ
同期処理、非同期処理について解説いたしました。かなり簡単な内容なため、特に参考にする方はいないかもしれませんが。次は、同期処理・非同期処理がどのように実行されているか（コールスタックの説明など）を書いていけたらと思います。拙い文章ですが、ご覧いただきありがとうございました。
UWPにおいてTextBoxMaskを設定したTextBoxの値をクリアする

`TextBox.Text = ""` のように簡単にクリアできなかったので、いつまで使える回避策か分かりませんが、備忘録として残しておきます。

# 使用したNuGetパッケージ
Microsoft.Toolkit.Uwp.UI 6.1.1
https://www.nuget.org/packages/Microsoft.Toolkit.Uwp.UI

# 対策
Textのマスクの数だけクリアをし、TextBoxMaskを再設定することにより回避できそうです。

```vb:test
'マスクの数だけクリア
TimeTextBox.Text = ""
TimeTextBox.Text = ""
TimeTextBox.Text = ""
TimeTextBox.Text = ""
TimeTextBox.Text = ""
TimeTextBox.Text = ""

'マスクを取得
Dim Mask As String = TextBoxMask.GetMask(TimeTextBox)
Dim CustomMask As String = TextBoxMask.GetCustomMask(TimeTextBox)
'マスクをクリア
TextBoxMask.SetMask(TimeTextBox, "")
TextBoxMask.SetCustomMask(TimeTextBox, "")
'マスクを設定
TextBoxMask.SetCustomMask(TimeTextBox, CustomMask)
TextBoxMask.SetMask(TimeTextBox, Mask)
```

ただし、クリアボタン ("×") の押下操作でも1つずつしか消えない不具合があるので、下記URLを参考に、スタイルで定義されている DeleteButton が動作しないようにします。
https://social.msdn.microsoft.com/Forums/ja-jp/0ee7c65f-92d2-411e-80e2-d207217decde/
viエディタの基本操作

# viエディタの基本操作

## ノーマルモードの操作

|コマンド|動作|
|:--|:--|
|w|単語単位の移動（進む）|
|b|単語単位の移動（戻る）|
|W|スペース単位で移動（進む）|
|B|スペース単位で移動（戻る）|
|gg|ページ頭に移動|
|G|ページ末に移動|
|^|現在行の先頭位置へ|
|$|現在行の末端位置へ|
|-|前行の先頭位置へ|
|Enterキー|次業の先頭位置へ|
|:数字|指定行へ|
|e|単語末尾へ|
|||
|d$|行末まで削除|
|p|貼り付け|
|d0|行頭まで削除|
|dl|1文字削除（xと同様）|
|dgg|最初の行まで削除|
|dG|最後の行まで削除|
|dd|1行削除|
|yy|1行コピー|
|J|下の行と連結|
|u|もとにもどす（undo）|
|ctrl + r|リドゥ|


## 検索に使う
|検索文字列を入力|
|:--|
|/文字列（下）|
|?文字列（上）|

|検索文字列を見ていく|
|:--|
|n　次の結果|
|N　前の結果|


## 文字の置き換え

|コマンド|動作|
|:--|:--|
|:%s/元の文字列/変更後文字列/g|検索置換
|:行数s/元の文字列/変更後文字列/g|行数を指定して置換|


### 矩形選択でコメントアウト
`ctrl + v`で矩形選択にして範囲を選択、`I # Escキー`でコメントアウトにできた。