OmniAICreator/Qiita-1.07M huggingface dataset:
フェルマーの二平方和定理の応用

以下のような問題を考えます

**【問題】$x^2+y^2=1105$を満たす自然数$(x,y)$の組をすべて求めよ**

### フェルマーの二平方和定理

[フェルマーの二平方和定理（高校数学の美しい物語）](https://manabitimes.jp/math/844)によると

```math 
\begin{align}
 奇素数pが \; p&=x^{2}+y^{2} (x,y \in \mathbb{Z})と表せる \\ \Leftrightarrow p&\equiv 1\pmod {4} \dots (1) \\
\end{align}
```

### ブラーマグプタ-フィボナッチ恒等式（BF恒等式）
以下の式が成り立つので$x^2+y^2$で表される2つの数$m,n$があるとき、その積$m \times n$も$x^2+y^2$で表される。</br>
しかもその$(x,y)$のペアの数は2倍になる。

```math 
\begin{align}
&(a^2 +b^2)(c^2+d^2) \\
&=(ac−bd)^2+(ad+bc)^2 \\
&=(ac+bd)^2+(ad−bc)^2 \dots (2) \\
\end{align}
```

### 右辺の素因数分解

【問題】ですが、右辺$1105$の素因数分解をすると、3つの素数の積になり、しかも3つとも4で割った余りが１となっていることが分かります。 

```math 
1105 = 5 \times 13 \times 17
```
従って各々は$x^2+y^2$で表すことが出来ます。

```math 
\begin{align}
1^2+2^2 &= 5 \\
2^2+3^2 &= 13 \\
1^2+4^2 &= 17 \\
\end{align}
```

### BF恒等式のコード

(2)のBF恒等式を使うと例えば$5 \times 13 = 65$に対して$(x,y)=(1,8),(7,4)$の2通りの解が求まります。

```python 
def bf(a,b,c,d):
  return ((abs(a*c-b*d),abs(a*d+b*c)), (abs(a*c+b*d),abs(a*d-b*c)))
print(bf(1,2,2,3))
# ((1, 8), (7, 4))
```
最終的な$1105$はこれらの解それぞれに$7$の$(1,4)$を**bf**で掛ければ良いので。

```python 
print(bf(1,8,1,4))
print(bf(7,4,1,4))
# ((31, 12), (33, 4))
# ((9, 32), (23, 24))
```

一応検算してみると正しい結果になりました。

```python 
for x,y in [(31, 12), (33, 4), (9, 32), (23, 24)]:
  print(f"{x}^2+{y}^2 = {x**2+y**2}")
```
```math 
\begin{align}
31^2+12^2 &= 1105 \\
33^2+4^2 &= 1105 \\
9^2+32^2 &= 1105 \\
23^2+24^2 &= 1105 \\
\end{align}
```

### 解答
* $(x,y) = (31, 12),(33, 4),(9, 32),(23, 24)$

この考え方はEuler Project: Problem 273を解くのに役に立ちます。

（開発環境：Google Colab）
Javaのvar変数のうまい使い方

Java8のエンジニアだった筆者がJava11の案件に参画し、varの変数のうまいなーと思う使い方があったので紹介したい。

# Javaのvar変数の特徴
Javaでvar変数はJava8では使えなかったが、Java11では使えるようになった。ただし、Javaのvar変数の使用に関しては以下のような制約を含んでいる。

* 左辺でvar変数の宣言をした場合、右辺でどの型の指定をしなくてはいけない。
* var変数としては処理しておらず（JavScriptのように）、結局右側で提示した変数の処理として処理される。

上記2つの制約を守れば、Javaでvar変数を使用することはできるわけではある。
しかし、特段変数宣言を左右で行う従来の宣言と何が違うのか分からなかったのが、従来の思想であった。

# こんな使い方

感心させられた使い方はこんな使い方である。
ただし、実際に書いてあるソースコードとは違うもので、大体同じような構成になっていたと考えてよい。

```
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        
        List<String> list = new ArrayList<String>();
        list.add("dummy");
        List<Object> list2 = new ArrayList<Object>();
        list2.add(list);
        Optional<Object> opt = Optional.ofNullable(list2);
        
        var varTest = (ArrayList<Object>)opt.orElse(new ArrayList<Object>()); //varのこの使い方はうまいなと
        System.out.println(varTest.get(0));
        Object objectTest = opt.orElse(new ArrayList<Object>());
        List<Object> listTest = (ArrayList<Object>)opt.orElse(new ArrayList<Object>());
        
    }
}

```

Objectで変数処理しようとすると後続処理でArrayListの特徴を使えないしな、かといってlistで変数を新規に宣言してもどうせ右側でキャストしないと入れることもできないと思うとこの書き方が一番しっくりきている筆者である。
やはり先代が組んだソースを読むのも面白い。

# 新規でプログラミングするわけではないなら
どうせ既存の仕様を把握してプログラムの改善をソースコードに記載するのであれば、どんな組み方をしているのかを考えてみるのもありかと思われる。

# 余談 そんな上司であったが
最近ソースコードを上司から渡されることが多く、ソースコードが読むことが多い。
そんな時に上司が組んだコードを見ているとやたらめったらvarを使ったんで質問してみるとやはりjavascriptと同じ感覚で使っているらしい
個人的には新人来たら読めないだろうなと感じる。。。
まあ、そんなコードでも別の上司はコードレビューokだったりするんで案件全体でvarの使用方法にかんして議論してはという個人的な感想を付け加えておく。


＃Java silverの資格取得が難しい
Java11になってvarが追加され細かいvarのルールも把握しておく必要が資格取得には必要となることが判明した。（過去問を解く中で）。結構面倒と感じることが。
C#めも


# 値渡し、参照渡し
■値渡し
実際は参照型の値渡しをしている。
※@lensoukoさんの[コメント](https://qiita.com/kazuki480/items/8b477f3ffeeb8e66b649#comment-8b99958b09264d7c5404)を参考に修正。

```cs:
//値渡し(参照型の値渡し)
  public static void main(String[] args) {

      int[] array = {1,2};

      Console.WriteLine(array[1]);//2

      call(array);

      Console.WriteLine(array[1]);//100

  }

  private static void call(int[] array) {
      array[1] = 100;

      Console.WriteLine(array[1]);//100

      int[] array2 = {1,200};

      array = array2;

      Console.WriteLine(array[1]);//200
  }
```
■参照渡し
ref修飾子またはout修飾子を使う。
二つの違いは以下。

・メソッド呼び出し元の変数の初期化
out修飾子 → 不要
ref修飾子 → 必須

・メソッド呼び出し先での変数の初期化(変数への値の割り当て)
out修飾子 →必須(必ず割り当てする必要あり)
ref修飾子 → 任意(どちらでもよい)
```cs:
//参照渡し(ref修飾子)
  public static void main(String[] args) {

      int[] array = {1,2};

      Console.WriteLine(array[1]);//2

      call(ref array);

      Console.WriteLine(array[1]);//200

  }

  private static void call(ref int[] array) {
      array[1] = 100;

      Console.WriteLine(array[1]);//100

      int[] array2 = {1,200};

      array = array2;

      Console.WriteLine(array[1]);//200
  }
```
```cs:
//参照渡し(out修飾子)
  public static void main(String[] args) {

      int[] array = {1,2};

      Console.WriteLine(array[1]);//2

      call(out array);

      Console.WriteLine(array[1]);//200

  }

  private static void call(out int[] array) {
      //array[1] = 100;
      //Console.WriteLine(array[1]);//100

      int[] array2 = {1,200};

      array = array2;

      Console.WriteLine(array[1]);//200
  }
```

■余談
Javaだとrefとかoutとかはなくて、
値渡し(参照型の値渡し)しかない。

# クロージャ
■説明
ローカル変数を捕獲（キャプチャ）しているローカル関数や匿名関数をクロージャという。

```cs:
    static void Main()
    {
        var x = 1;

        // ローカル関数内でローカル変数xをキャプチャ
        void f(int n) => x = n;

        Console.WriteLine(x); // 1

        f(2);

        Console.WriteLine(x); // 2
    }
```

■余談
Javaだとこれはできない。（クロージャは存在しない）
ローカル関数を定義してるところで怒られる。
（Javaだとxは暗黙的にfinalが付く）

```java:
    public static void main(String[] args)
    {
        var x = 1;

        // コンパイルエラー
        // local variables referenced from a lambda expression must be final or effectively final
        //        IntUnaryOperator op = n -> x = n;
        //                                   ^
        IntUnaryOperator op = n -> x = n;
        
        System.out.println(x);

        op.applyAsInt(2);

        System.out.println(x);
    }
```
クロージャぽいことはできる。（オブジェクトを渡せばいい）
```java:
    public static void main(String[] args)
    {
        int[] array = {1,2};

        IntUnaryOperator op = n -> array[0]=n;
        
        System.out.println(array[0]);//1

        op.applyAsInt(2);

        System.out.println(array[0]);//2
    }
```
ショートカットキーでMacのPowerPointの数式入力を立ち上げる

## 目的

WordではCtrl+=で数式入力になるが，PowerPointではそのショートカットキーは下付き文字に割り当てられている．PowerPointで数式入力を頻繁に用いるためWordと同じように，ショートカットキーで数式入力したい．

## 方法

Macのシステム設定（System Preferences）から設定できる．

1. システム設定（System Preferences）を立ち上げる．
2. キーボード（Keyboard）をクリックする．
3. キーボードのショートカット（Shortcuts）タブをクリックする．
4. アプリのショートカット（App Shortcuts）を選ぶ．
5. +ボタンを押すとダイアログが立ち上がので，次のように入力する．
    - アプリケーション（Application）はPowerPointを選ぶ．
    - メニュータイトル（Menu Title）は数式（Equation）を入力する．
    - キーボードショートカット（Keybord Shortcut）は希望するショートカットキー（例：Ctrl+=）を入力する．
6. 以上でPowerPointでショートカットキーで数式入力が立ち上がるようになる．
Macのnanoエディタでカラーをつける

結論： **Macにデフォルトで入ってるnanoエディタはカラーを付けることができない！**

Macのnanoエディタでシンタックスハイライトを有効にするには、`brew`で改めてnanoエディタをインストールする必要がある：

```
brew install nano
```

その後、ホームディレクトリに`.nanorc`というファイルを作ってを次のように記述する：

```:.nanorc
include "/usr/local/share/nano/*.nanorc"
```

また、**nanoを起動した状態で常に行番号が表示されている**ようにするには、.nanorcに`set linenumbers`を追記すればよい：

```:.nanorc
set linenumbers
include "/usr/local/share/nano/*.nanorc"
```
100日後くらいに個人開発するぞ！day025

## 今日もHTML＆CSS中級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/5b975316-40f1-4b7e-6be1-9ceb96009076.png)

## 今日の備忘録


### ボタンを角丸にする方法
- 要素の角を丸めるにはbroder-radiusプロパティを用いる
    - 例：角を半径10pxの円にしたい
        - `.button{border-radius:10px;}`


### テキストを中央に寄せる方法
- text-alignプロパティを用いるとテキスト・インライン要素・インラインブロック要素の配置を指定できる
    - left：左寄せ
        - 例：`text-align:left`
    - center：中央揃え
        - 例：`text-align:center`
    - right：右寄せ
        - 例：`text-align:right`
- `margin:0 auto`と`text-align:center`の使い分け
    - `margin:0 auto`：広い範囲を囲うようなブロック要素を中央揃えにしたい時に用いる
    -  `text-align:center`：テキストやボタンのようなインライン要素・インラインブロック要素を中央揃えにしたい時に用いる


### アイコンを用いる方法
- アイコンを表示するにはFont Awesomeを使うと便利
    - https://fontawesome.com
- Font Awesomeは以下の手順で使用できる
    -　Font AwesomeのCSSファイルをHTMLの<head>タグで読み込む
        -　`<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">`
    - <span>タグにfaクラスとfa-アイコン名クラスを指定する
        - `<span class="fa fa-twitter"></span>`


### 背景色のみ透明にする方法
- opacityとrgbaの違い
    - opacity：要素の中身全てを透明にする
    - rgba:特定の色だけ透明にする
- 色を指定するrgb
    - rgbは色の指定方法の一種で3つの値を組み合わせて色を指定する
        - 例：背景色を指定する場合
            - `{background-color:rgb(255,147,30);}`
        - （例：#ffffffのような記法で背景色を指定する場合）
            - `{background-color:#ff931e;}`
- rgbaで特定の色を透明にする場合
    - rgbaは4つ目の値0~1で透明度を指定する
        - 例：背景色の透明度を0.5にしたい場合
            - `{background-color:rgba(255,147,30,0.5);}`


### アニメーションを付ける方法
- transiton：「変化の対象」や「変化にかかる時間」を指定できる
    - 例：全てのプロパティを対象として変化にかかる時間を1sにしたい場合
        - `div{transition:all 1s;}`
    - 例：背景色のhoverを0.5sで変化させたい場合
        - `div:hover{transition:background-color 0.5s}`



### 縦の中央揃えをする方法
- line-heightプロパティ
    - 行間を指定することができる
        - 例：行の高さを10pxに指定する場合
            - `{line-height:10px;}`
    - 要素の高さと行間の高さを同じにすることでテキストを縦の中央に揃えることができる


### `<a>`タグの範囲を要素全体に広げる方法
- `<a>`タグのdisplayプロパティをblockに指定すると`<a>`タグを要素全体に広げることができる
Raspberry Pi 3B+ に Minicondaを導入

# 0.Intro
自宅にRaspberryでソフトウェアRaidで常時稼働させているのでなんだったらスクレイピング走らせておくのもいいかなぁと思い導入することにしました。
やはりconda環境を入れたいと思います。

当方の環境は
```
pi@raspberrypi:~ $ cat /proc/device-tree/model
Raspberry Pi 3 Model B Plus Rev 1.3pi@raspberrypi:~ $
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.103-v8+ #1530 SMP PREEMPT Tue Mar 8 13:06:35 GMT 2022 aarch64 GNU/Linux
```

# 1.試行錯誤
ラズパイでcondaで検索すると
[Berry Conda](https://github.com/jjhelmus/berryconda)
が出てきます。

インストール試みましたが、
```
cannot execute native linux-armv7l binary
```
とarmv7lではないとのでインスートル出来ず。。。

ではaarch64版のMinicondaをとトップにある

```
https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
```

落として実行しても
```
"Miniconda3-latest-Linux-aarch64.sh: line 417: 2300 Illegal instruction "$CONDA_EXEC" constructor --prefix "$PREFIX" --extract-conda-pkgs"
```
とのことでだめ。

色々調べていると昔のバージョンだったら可能という情報を見つけました。
なので遡って
```
Miniconda3-py37_4.9.2-Linux-aarch64.sh
```
を試したところ成功しました。

大した内容ではないですが、成功報告と言うことで記事にいたしました。
なんにもできない人がUnityのワールドを作ってみる話～Hello world的なやつ～

# 前回やったこと
環境構築・・・具体的にはUnityを準備して、SDK3を入れた。

この後何しようとなってしまったので、とりあえずチュートリアル的な動画を見つつ、方針を決めたので、今回はそこを目指してやっていく。

# とりあえず最初にしたいこと
まずはどこの解説サイト見ても、最低限、
* 床おいて
* 椅子置いて
* 鏡を置いてオンオフできるようにして
* ビルドする

といったかんじで、Hello World的なことをしようというふうだったので、この4点（内容的には3点）をまずはやる。

# 床
シーンに床になるオブジェクトをPlaneで作って終わり。

とはいかず。
どうやらVRCWorldというのを置く必要があるそう。
というかこれがあることでワールドになるらしい。
とりあえず、シーンにExampleのPrefabに入っていたVRCWorldをコピー。

あ、あと床真っ白だと見づらいそうなので、マテリアルを作って、色つけて、床のオブジェクトにアタッチして色もつけておいた。

床、とりあえずクリア・・・？
ビルドしてみないとわからないけど。

# 椅子
PrefabからVRCChairをシーンに置いて終わり。
終わり・・・？？？？？
本当か？？？

どうやら、今はとりあえずこれでよさそう。
どうにも、実際任意のモデルとかを使って作るときは、このPrefabを重ねる・・・子にすることで、そのモデルに椅子の機能がつくらしい。
かしこくなった！！

# 鏡
これもPrefabからMirror自体をシーンに引っ張ってきて・・・映った！
ではスイッチを作ろう。
キューブで適当にぽっちつくってー、動画とか資料ではVRC_Triggerとかいうコンポーネントを追加しｔ・・・ない！！
VRC_Triggerないよ？？

はい。調べました。
SDK2と3の決定的（？）違いらしい。
SDK3を入れたときからよく目にしてた、Udonの正体。
このUdonシステムみたいなのを使うらしい。

# VRC_Triggerではなく、udonBehaviour
なんか急にうどんでてきた。
どうやら、どうしたらどうなるというプログラムを矢印の線つなぎで組めるすごいやつらしい。
とりあえず、やってみる。
[参考資料](https://note.com/kakutyu50/n/nc8bbe6cfc1c2)

スイッチになるキューブにコンポーネントを追加。
ここまでは同じ。
ここで、追加するのが、VRC_Triggerではなく、**udonBehaviour**。
そして、UdonBehaviorでNew Programする。
このとき、U#とかいう言語（？）で書くか、線つなぎで作るかを決められるらしい。
線つなぎでとりあえずやりたいので、Graphって書いてあるのを確認。
Open Udon Graphして、フローチャート図書けそうな画面を開く。
この画面で線つなぎをしていくらしい。
とりあえずつなぐもの（「～したら」や「～する」というブロック）をノードというそうなので、まずはノードを出す。

* 使ったら→Event > Interact
* 物のオンオフ→UnityEngine > GameObject > SetActive
* 鏡の変数を用意→Variableで＋ > GameObject（[]なしのやつ）
* 作った鏡変数を場に出ていなかったら出す
* 鏡変数にVRCMirrorを設定→鏡変数の>でパブリックにすると、インスペクター（右の画面）のUdonBehaviourで変数のところが設定できるようになるので、ヒエラルキーから鏡をアタッチ
* SetActiveの青丸から鏡変数の青丸につなぐ

これで鏡をオンにはできるようになったよう。

# 鏡のオンオフ切り替え
上でオンにすることはできたらしいので、今度はオンオフ切り替えできるようにしたい。
先程の参考資料を読み進めてみると、つまるところ、条件分岐を作ってやればいいらしい。線つなぎで。
これ、もしかしたらがんばってコードで書いたほうが楽・・・？

とりあえずオンオフつくるのに使ったノードだけ。

* branch→条件分岐のノード。booleanっぽい。Special > branch
* SetActiveとかに名前を付ける→Custom Event。「その名前を読んだら」にあたるノードらしい。Special > Event Custom
* 名前を呼ぶノード→UdonBehaviour >UdonBehaviour.SendCustomEvent
* SendCustomNetworkEvent→SendCustomEventの同期版。みんなで見る鏡とかのみんなが使えるようになってほしいときはNetwork、個人のみ動いてほしいときはSendCustomEvent。
* Get activeSelf→オンオフ確認に使う。trueかfalseかチェックみたいな。UnityEngine > GameObject > get activeSelf

ついでに、スイッチのUdonBehaviourのinteruction textでホバーメッセージを変えられる。

ここまでできたので一旦ビルドしてみる。

# ビルド
VRChat SDK > Show Control panel > builber で、なんか言われてたら対処して、ビルド＆テストみたいなやつでVRChatを起動。

1回目・・・鏡がつかん。と思ったら、enableとdisableを逆に繋いでた。
2回目・・・やっぱりつかん。と思って3秒悩んで、これ、ローカルだからネットワークのやつ使えない？？とか思ってやってみたら当たり。ローカルだとCustom Eventでできた！

# 冒険はこれからだ！！的なやつ
とりあえずHello World的なことはできたので、第1歩は踏めたと思いたい。
今後は床にテクスチャとかをやってみたい。
あと、とあるとこの再現とかもいずれ。
GitHub Pagesでポートフォリオを公開してみる

# 概要
BootStrap5がリリースされて「使ってみたい」ということから調べていたら、GitHub Pagesを使うと、GitHubにコミットするとWebページが公開できる「ワザ」があるということで、急遽「GitHub Pagesにポートフォリオを公開する」ことを目標にBootStrap5を学ぶことにしました。

就活や転職でGitHubが有効とかいう時代になったんですねぇ・・・（遠い目）

# GitHub Pagesってなんやねん

■ GitHub Pages

https://docs.github.com/ja/pages

一般的に、GitHubにソースなどをコミットしてリポジトリとして使っている人がほとんどだと思いますが、GitHubのリポジトリでホームページが公開できるというものです。

実際に、今回作って公開しているのが下記となります。

https://takanek07.github.io

## 方法
いろんな方がYouTubeや本Qiitaで説明してくれているので、ざっくりまとめると

* リポジトリを「(自分のGitHubアカウント名).github.io」という名前でPublicとして作成すると、自動的にGitHub Pagesとして公開される
下記は「たにぐち まことのともすたチャンネル」さんの該当動画です。（毎回わかりやすく説明してくれます）
<iframe width="560" height="315" src="https://www.youtube.com/embed/Ua_C3kBRcdI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

* リポジトリを「AAAA（なんでもいい）」でPublicにて作成すると、GitHub Pagesの設定後に「(自分のGitHubアカウント名).github.io/AAAA」で公開される
下記は「大学生がエンジニアになるまで / コーディングテスト実況」さんの該当動画です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/Vl8LcUU-b34" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

私の場合は、前者を選択しました。

## いざ実食！

BootStrap5の配布されているThemeを使うのは、BootStrapの勉強にならないだろうということで、1からカキカキしてます。

作成の方針としては、

- 文章量
    - 「すでに20年の社会人経験がある」ITエンジニアなので、書き始めると長くなる・・・・のでシンプルな情報量にする
    - いろいろできるけど、「なんとなく」分かってもらえればヨシとする（誰かにレビューしてもらうためのたたき台とする）
    - 廃れたプログラミング言語とか、最後に使って年数た経ちすぎて忘れかけてるのは除外する

- デザイン
    - フロントエンドエンジニアではないし、デザイナーでもないので凝った作りはしない
    - ソースを見たらだれでも「ハハーン、マネしたるわ」と思える作りにする

- その他
    - SEO対策は、ある程度は入れておく
    - GA4なども実装しておく
    - Googleフォントなども面白そうなので使っておく

あとは、もうBootStrap5のDocumentを見ながら作ります。
最初は、載せる文章を決めるほうが進行が楽ですね・・・

# 所感
BootStrap5の最初のとっかかりとしては、適度なコンテンツになりました。
次は、別のサイトを作るときに使ってみたいと思います。

それでは、もう一度完成したポートフォリオを。

https://takanek07.github.io

感想や、私のデザインをパクりたい申告などは随時受け付けてます。（私はデザイナーじゃないんで・・・・・）
Emacs fringe editor

# fringe matrix editor
 Emacs の左右のウインドウ枠に出るパターンのエディタです.
 
 Emacs 28.1 で bookmark 箇所のフリンジにマークが出るようになったのですが、 それを Emacs の画面でデザインしてカスタマイズします.

 8 x 8 しかもモノなので逆にデザインは難しいですが.

<!-- [matrix-sample.png] -->
![matrix-sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239081/151146d2-23de-2323-d28d-30712f2dcc63.png)


:::note info
使っているフォントやマージンの設定によってはアスペクト的に見辛いかもしれません.
:::

# インスコ & 実行
  [ここ](https://gist.github.com/fb8f66a729c8688e8bee5db7c91079cc.git "gist")から DL して `load-path` の通った処に置き `init.el` 等で

```emacs-lisp:init.el
(require 'matrix)
```


起動

```emacs-lisp:mini buffer
M-x matrix
```


初期化せずに起動(バッファを破壊せずに起動)

```emacs-lisp:mini buffer
C-u M-x matrix
```


# 主な操作
| コマンド               | バインド | 説明                    |
|:-----------------------|:--------:|:------------------------|
| matrix-put             | m        | 置く                    |
| matrix-delete          | C-d      | 消す                    |
| matrix-invert          | SPACE    | 反転                    |
| matrix-invert-all      | I        | 全体の白黒反転          |
| matrix-kill-new        | C-c C-w  | 定義書式を kill ring に |
| quit-window            | C-c C-q  | 終了                    |
| matrix-define-and-quit | C-c C-c  | w & q と等価            |
| matrix-erase-init      | C-c C-i  | 初期化                  |

他にもあります、詳しくは起動中に `C-h m` などで見てください(おざなりだなあ).

デザインができたら `C-c C-c` すると

```emacs-lisp:kill-ring
(define-fringe-bitmap 'bookmark-fringe-mark [128 192 160 144 136 132 130 255])
```


などと kill-ring に登録されマトリクス画面は閉じるので、それを `init.el` 等にヤンクすれば OK.

ちなみに 変数 `matrix-octstring` が `non-nil` なら8進の文字列表現になりますのでお好みで.

```emacs-lisp:kill-ring
(define-fringe-bitmap 'bookmark-fringe-mark "\0\302\304\310\320\340\300\200")
```


# ゴミ消し
  bookmark でも edebug でも、  フリンジによく描画ゴミが残りますが以下で消せます.
  本当はもっとスマートにできるかもしれません.判りません.

```emacs-lisp:mini buffer
M-: (remove-overlays) 
```
[AndroidStudio]スクロールバーのコードプレビュー機能（コードレンズ）をOFFにしたい時

# 概要
AndroidStudioではスクロールバーにマウスカーソルを重ねるとその位置のコードがプレビュー表示されます。
![スクリーンショット 2022-05-14 7.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/eab3701d-aa65-cad4-4d48-5653041d647a.png)

この機能をOFFにする方法を共有します。
# 本文
メニューからAndroidStudio > Preferencesで設定画面を開いて
Editor > General > Appearanceと進んで「Show code lens on scrollbar hover」をOFFにするだけです。
![スクリーンショット 2022-05-14 7.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ffa75586-a8e9-6c30-ac88-c37697594ed3.png)

もしくは、設定画面で検索窓に「code lends」とか入力すれば一発で表示されます。
![スクリーンショット 2022-05-14 7.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/8c751776-60be-29ba-5bc5-be577017870a.png)

スクロールバー上で右クリックすると表示されるメニューからも変更できます。
![スクリーンショット 2022-05-14 8.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0ab55350-e2ba-0743-d38b-1cfb88940776.png)

# 補足
このプレビュー機能、細いスクロールバーにカーソルを合わせないといけないので、ちょっと不便ですよね、、、。
必要ない時に逆に視界を遮られる事の方が多いです:sweat_smile:
VSCodeのマルチカーソルを手軽に表示・変更できる拡張機能「Multi Cursor Viewer」を作成しました

# はじめに

- マルチカーソル用の拡張機能「[Multi Cursor Viewer](https://marketplace.visualstudio.com/items?itemName=tobi-c.multi-cursor-viewer)」を作成しました。
- 書籍「[Visual Studio Code 実践入門](https://www.amazon.co.jp/dp/486594334X)」を執筆しました。


# 拡張機能「Mutli Cursor Viewer」

https://marketplace.visualstudio.com/items?itemName=tobi-c.multi-cursor-viewer

サイドバーにマルチカーソル一覧を表示する拡張機能です。
また個別のカーソルごとに移動や削除をサイドバーから操作できます。

![sidebar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130444/32bbc456-c3e9-461b-d54b-04d69c05279d.png)

VSCodeは`[Shift + Ctrl + L]`(macOSは`[Shift + Cmd + L]`)を押すと、同じ単語にまとめてマルチカーソルを作成できます。しかし、ファイル内のすべてが対象なため、画面外にも作成されて分かり難いことがあります。このような状況でも「Multi Cursor Viwewer」で表示すれば、画面内に収まらないのマルチカーソルの位置も認識しやすくなります。

 
## カーソル削除
マルチカーソルを作成した後、本来不要だったカーソルを削除できる機能です。
サイドバーの一覧から「×」ボタンを押すことでカーソルを削除します。
![remove_cursor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130444/5e88974d-8fa2-323f-74b2-e6c13eadb616.gif)

カーソル追加直後ならば標準機能のカーソルUndoで戻せますが、一通り作成した後だと最初からやり直しになってしまいます。この拡張機能を使うことで、あとから途中のカーソルを削除できるようになります。


## 個別のカーソル移動
サイドバーの矢印ボタンから、カーソル移動や選択範囲の変更が可能です。
１つのカーソル位置だけが合っていない場合、後から個別で調整できます。
![move_cursor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130444/8dd403c9-13c8-ffa6-81a8-4ac96873d287.gif)


## 選択文字列と連番を使用した置換
サイドバー上側の「Replace」ボタンを押すと、現在選択中の文字列や連番を使用して置換処理を実行できます。

- 「`$1`」は選択文字列で置き換えます
例えば`name`を選択して`this.$1 = $1;`で実行すると、`this.name = name;`に置換されます。
![replace1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130444/517a73d4-f6fd-9c80-10c3-2740841126a2.gif)

- 「`$$`」は連番で置き換えます。
連番は上から1始まりです。
![replace2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130444/fe1fc8fe-c32b-16a4-448b-2ff73117be11.gif)

### マルチカーソル時のフックコマンド

単一カーソルからマルチカーソルへの変更時に、自動で実行するコマンドIDを設定できます。
```
multi-cursor-viewer.autoCommandMultiCursor
```

下記のように設定すれば、マルチカーソル時に自動で「Multi Cusor Viewer」のサイドバーが開きます。
```
"multi-cursor-viewer.autoCommandMultiCursor": "workbench.view.extension.multi-cursor-viewer"
```

![auto_command.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130444/3f21d262-98e2-fc9d-47b4-8d37e3e5794c.gif)


## まとめ
サイドバーからマルチカーソルを表示・変更できる「Multi Cursor Viwewer」を作成しました。
GUIで扱えるため、マルチカーソルに慣れていない方にもお勧めです。

# 書籍「Visual Studio Code 実践入門」について
最後に拙著を紹介させてください。
執筆した「[Visual Studio Code 実践入門](https://www.amazon.co.jp/dp/486594334X)」が出版されました。

カーソル移動や編集系のショートカットキーから順番に説明しています。その操作は、今回のマルチカーソルとも組み合わせて使用できます。ほかにも検索や置換あたりの細々とした動作や、開発環境としてのデバッガやタスク実行、スニペットなどもカバーしています。

このようにVSCodeが備えている基本的な機能を重視した内容です。
また動作をイメージしやすいように、操作例の図を多く載せています。

エディターを効果的に使うには、幅広く機能を知って引き出しを増やすことが重要だと考えて書きました。普段から使用している方でも、振り返って確認すると、便利な手段が見つかると思います。せひ手に取ってみてください。
STM32G031でRS-485パケットでデバッグ用モニタープログラム(送信


x まだ試していない 確認ずみ2022/5/14


目的
STM32G031を使ったRS485のアナログサーボをデジタル化で
ピン端子が枯渇してきたので開発
RS-485パケットのデータ(バケット内)を単純にソフトウェアシリアルに出力

XXは、データ

第二バイトのアドレスは、0x7F
第六バイトは、ソフトウェアシリアルに送信されるデータ
第七バイトのチェックサム　ちゃんと計算





たぶんこんな感じ


```c++


//ser_500kbps_bmon_m_031_1

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

#include <Arduino.h>


void pc_putc(char ch){

  int ii;           //カウンター
  char out_buff[8]; //バッファー

  //バケットに値を設定
  // packet move
  out_buff[1 - 1] = 0x00; //header
  out_buff[2 - 1] = 0x7f; //address
  out_buff[3 - 1] = 0x00; //data1  zero Fixed
  out_buff[4 - 1] = 0x00; //data2  zero Fixed

  out_buff[5 - 1] = 0x00; //data3  zero Fixed
  out_buff[6 - 1] = ch;  //data4 pwm  Angle of rotation 0to255
  out_buff[7 - 1] = 0x00; //Checksum
  out_buff[8 - 1] = 0xff; //footer

  //チェックサムの計算
  //Checksum
  int chk = 0;
  for (ii = 0; ii < 8; ii++) {
    chk = chk + out_buff[ii];
  }//for
  out_buff[7 - 1] = chk & 0xff;

  //送信処理
  //send 8 byte
  delay(1);
  for (ii = 0; ii < 8; ii++) {
    Serial.write(out_buff[ii]);
  }//for
  delay(1);

} //pc_putc

//初期化処理
void setup() {

  delay(3000); //not Delete

  Serial.begin( 500000 ); // シリアル通信の速度を500000bpsにする。

} //setup


//メインループ
void loop() {

  pc_putc('A');

  delay(1000);

}//loop



```
Ruby | Qiita API で1人のユーザーの全記事一覧を取得する

100記事x100ページまで取得できるので、上限は1万記事。

# Ruby

```rb
require 'net/https'
require 'uri'

(1..100).each do |i|
  uri = URI.parse("https://qiita.com/api/v2/users/#{ENV['USER_ID']}/items?page=#{i}&per_page=100")
  res = Net::HTTP.get_response(uri)

  puts res.response.body
end
```

# コマンド実行例

```
USER_ID=yumainaura ruby qiita-post.rb | jq
```

# Qiita API のTOKENを使って実行上限数対策をする場合の例

```rb
require 'net/https'
require 'uri'

(1..100).each do |i|
  uri = URI.parse("https://qiita.com/api/v2/users/#{ENV['USER_ID']}/items?page=#{i}&per_page=100")

  request = Net::HTTP::Get.new(uri.request_uri, {'Content-Type' =>'application/json', "Authorization" => "Bearer #{ENV['TOKEN']}"})

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  response = http.request(request)

  puts response.response.body
end
```

# 参考

https://qiita.com/takano-h/items/dd10818eb7e09161bc29












<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【M1Mac】【Docker】環境構築で nokogiri のエラー対処方法 


## はじめに
未経験からエンジニアに転職しました。
まだまだわからないことだらけですが、毎日楽しく働いています！
業務や個人開発での発見やエラー解決などをアウトプットしています。
今回は、
M1 Macの環境構築で遭遇したエラーの解決方法です。
Docker Rails 環境を想定しています。

# エラー内容
~~~ 
Caused by:
LoadError: Error loading shared library ld-linux-aarch64.so.1: No such file or directory (needed by /usr/local/bundle/gems/nokogiri-1.13.3-aarch64-linux/lib/nokogiri/2.6/nokogiri.so) - /usr/local/bundle/gems/nokogiri-1.13.3-aarch64-linux/lib/nokogiri/2.6/nokogiri.so
~~~

~~~
rake aborted!
LoadError: cannot load such file -- nokogiri/nokogiri
~~~

# 解決方法
Dockerfile に以下を記述するだけです！

~~~
apk add gcompat
~~~

他にも、docker-compose 環境なのであれば、
~~~
docker-compose build --no-cache
~~~
をすることで、解決できちゃう場合もあるかもしれないです。
また、今回の　nokogiri のエラーに限らず、
M1 Mac での環境構築をする際には、
・ライブラリ等はx86-64(Rosetta2)なのか、ARM64なのか
・目的のバージョンがARM64に対応しているか
このあたりを考慮しながらすすめると良いかと思います。
neosでlogix その78

# 概要
neosでlogixやってみる。
Fire On Trueノード、使ってみた。

# 写真

![2022-05-13 21.39.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7e65fc90-abd2-3aa8-99ca-e49ca774b1c2.jpeg)

# Fire On True

```
Inputs
 	Bool	Condition
 	User	OnlyForUser
Outputs
 	Impulse	Pulse
```

# 手順

- logixtooltipを装着。
- Input Devices>Keyboard>Key Heldをスポーン。
- Flow>Fire On Trueをスポーン。
- つなぐ


以上。
Pythonで例外処理を関数化

## 背景
自作のスクレイピングツール、よく途中でコケて最初からやり直し、
になることが多いので、例外処理を追加したいと思い作成。
作成したところ思ったより汎用性が高いものができた気がするので、備忘も兼ねてメモ。

## 関数
``` py
import sys


def try_func(func, *args):
    print(f'{func}を試みます')
    try:
        func(*args)
        print(f'{func}が実行されました')
    except Exception as e:
        print(e)
        print(type(e))
        print('実行中にエラーになりました')
        print('手動で継続する場合、手動で調整した後yを、中止する場合はn(y以外)を入力してください')
        flg = input('"y"or"n":')
        if flg == 'y':
            print('継続します')
            return
        else:
            print('中止します')
            sys.exit()


def test_func(a, b):
    result = a / b
    print('test_funcが実行されます')
    print(result)


if __name__ == '__main__':
    try_func(test_func, 6, 0)
    try_func(test_func, 6, 3)
```
2022/5/14主にITとかセキュリティの記事

Zyxel製品の深刻な脆弱性、4月に修正済み - 報告者がサイレントパッチの危険性を指摘
https://www.security-next.com/136454

「Apache Tomcat」のクラスタリング運用に注意 - 必要に応じて対策を
https://www.security-next.com/136478

説明会申込フォーム、他者情報が閲覧できる状態に - 大阪産業局
https://www.security-next.com/136458

かんぽ生命を装う偽メールやSMSに注意
https://www.security-next.com/136464

「EC-CUBE」向けプラグイン「簡単ブログ for EC-CUBE4」に脆弱性
https://www.security-next.com/136482

トレンド製「スマートホームスキャナー」のインストーラに脆弱性 - 最新版の利用を
https://www.security-next.com/136468

サイバー保安企業への投資、韓国企業の９割が5億円未満(5/12)
https://www.kedglobal.com/jp/%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E6%8A%95%E8%B3%87/newsView/ked202205120005

フィッシング攻撃に関する2022年版レポートを発表：小売・卸売業界へのフィッシング攻撃が400%以上増加(5/12)
https://www.jiji.com/sp/article?k=000000031.000055108&g=prt

かんぽ生命を装った不審メールやSMSにご注意ください(5/12)
https://www.jp-life.japanpost.jp/information/news/2022/news_id001851.html

ランサムウェア被害により生じる二次的損害額、身代金支払い額の７倍の金額に(5/12)
https://prtimes.jp/main/html/rd/p/000000108.000021207.html

伊上院などにサイバー攻撃、ロシア系ハッカー集団の犯行＝報道(5/12)
https://news.infoseek.co.jp/article/11reutersJAPAN_KCN2MX2H3/?tpgnr=world

【2022年5月17日（火）オンライン開催】もはや対岸の火事ではない？！迫りくるサイバー攻撃をMicrosoft 365 で防御 ～侵入防止から検知、バックアップまでマルっとご紹介～(5/12)
https://www.jiji.com/sp/article?k=000000116.000042830&g=prt

イーロン・マスク氏、スターリンクへのサイバー攻撃を「活発化」したとして「ロシア」のハッカーを批難(5/11)
https://jp.sputniknews.com/20220511/11230174.html

自動拡散「ボット」排除へ　買い占めや偽情報で暗躍(5/12)
https://www.nikkei.com/article/DGXZQOUC25CVD0V20C22A4000000/

「通信インフラ水平分離の可能性」と題して、アクセンチュア（株）　廣瀬　隆治氏／堀口　雄哉氏によるセミナーを2022年6月3日（金）SSKセミナールームにて開催!!(5/12)
https://prtimes.jp/main/html/rd/p/000001920.000032407.html

JVNVU#93434935
トレンドマイクロ製スマートホームスキャナー（Windows版）のインストーラにおけるDLL読み込みに関する脆弱性(5/12)
https://jvn.jp/vu/JVNVU93434935/

Google Chromeに重要なセキュリティ脆弱性、アップデートを(5/12)
https://news.mynavi.jp/techplus/article/20220512-2343835/

Apache TomcatのEncryptInterceptorのドキュメントに安全性を誤認させる記載誤り(5/12)
https://news.mynavi.jp/techplus/article/20220512-2343809/

「SBOM (ソフトウェア部品表) とサイバーセキュリティへの対応状況」調査レポート公開(5/12)
https://prtimes.jp/main/html/rd/p/000000164.000042042.html

バグ修正が主なマイナーアップデート「Windows Admin Center 2110.2」がリリース、前バージョンのサポート切れに要注意(5/12)
https://atmarkit.itmedia.co.jp/ait/spv/2205/12/news004.html

Googleが仮のクレジットカード番号を生成して安全に買い物できるサービス「Virtual Cards」を発表(5/12)
https://gunosy.com/articles/epqLL

Intel製品に権限昇格や情報漏えいなど複数の脆弱性(5/12)
https://pc.watch.impress.co.jp/docs/news/1408549.html

ソフトウェアエンジニアは毎日何に時間を費やしている？--減らしたい作業は(5/12)
https://japan.zdnet.com/article/35187152/

インテルのCPU/SSD製品などに脆弱性 ～最大深刻度は「HIGH」(5/12)
https://forest.watch.impress.co.jp/docs/news/1408397.html

企業のデータ活用による意思決定はわずか4割　スノーフレイクが調査結果を発表(5/12)
https://enterprisezine.jp/news/detail/15967

「シフトレフト」をうまくいかせるこつは？　「開発者にセキュリティを丸投げ」は駄目(5/12)
https://techtarget.itmedia.co.jp/tt/spv/2205/12/news02.html

メルカリも成長鈍化の憂き目、深刻化するクレカの不正利用問題(5/13)
https://xtech.nikkei.com/atcl/nxt/column/18/00989/051200084/

岸田政権が「Web3」を成長戦略の柱に、一方で税制など課題は山積(5/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02053/051200004/

SOMPOグループが脆弱性対策に本腰、リスクの実態を経営陣と早期共有するわけ(5/13)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/06819/

Windows 11の設定は大幅に使いやすくなった、ホームの廃止で「戻る」が不要に(5/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02025/041200004/
【Tailwind CSS】Unknown at rule @tailwind解消法【VSCode】

## 状況
Next.jsのプロジェクトにおいてTailwind CSSを使用するために`globals.css`に以下文字列を記述したところ、画像1のように警告が表示された。

```globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

画像1. Visual Studio Codeで警告が表示されている
![Visual Studio Codeで警告が表示されている画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ba8f1fd5-451f-25c7-cab5-aedd1d408a6e.png "画像1. Visual Studio Codeで警告が表示されている")


## 解消方法

以下の4点のいずれかの方法で解消できる。

### 方法1. Tailwind CSS IntelliSense をインストールする

手順
1. [Tailwind CSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss) をインストールする。

2. Visual Studio Codeの設定ファイル（`settings.json`）に以下を追記する。

```json:settings.json
  "files.associations": {
    "*.css": "tailwindcss"
  }
```
以上

#### 参考ページ

https://tailwindcss.com/docs/editor-setup#syntax-support

https://github.com/tailwindlabs/tailwindcss-intellisense#recommended-vs-code-settings

### 方法2. PostCSS Language Support をインストールする

:::note warn
注意
以下の拡張機能をインストールするとCSSに対するIntelliSenseなどの機能が使用できなくなります。
[参考ページ](https://github.com/csstools/postcss-language/issues/12)
:::

手順
1. [PostCSS Language Support](https://marketplace.visualstudio.com/items?itemName=csstools.postcss)という拡張機能をインストールする。

以上

### 方法3. `globals.css`を編集する

手順
1. `globals.css`を編集する。

```diff:globals.css
- @tailwind base;
- @tailwind components;
- @tailwind utilities;

+ @import "tailwindcss/base";
+ @import "tailwindcss/components";
+ @import "tailwindcss/utilities";
```
以上

### 方法4. Visual Studio Codeの設定を変更する
手順
1. Visual Studio Codeの設定ファイル（`settings.json`）に以下を追記する。

```json:settings.json
   "css.lint.unknownAtRules": "ignore"
```

以上
【Laravel】EloquentCollectionにてネスト先カラムをGroupByする

## はじめに
そもそも1カラムに複数値を持たせるのはどうかという点は置いといておいて、、、。
何らかしらのレスポンスデータをログとしてそのまま格納したい場合などあると思います。
こちら調べてもあまり記事がなく、もしかしたらやりたい人がいるかな～と思いメモとして記事に残しておきます。


## 要件
Jsonがそのまま入ったカラムにて、Jsonのキーでグルーピングしたい

## 結論

```php
// ドット「.」でつなげる
$collection->gropuBy('xxx.xxx');
```

## 検証内容

### テーブル構成
```php:migration.php
Schema::create('conversions', function (Blueprint $table) {
    $table->id();
    $table->json('meta');
    $table->timestamps();
});
```
### データ
|id| meta       |  created_at      | updated_at|
|:------------------:|-------------------|-------------------|-------------------|
|1|{"gender": "male", "browser": "chrome", "language": "jp"}|2022-05-14 02:56:45|2022-05-14 02:56:45
|2|{"gender": "female", "browser": "edge", "language": "en"}|2022-05-14 02:56:45|2022-05-14 02:56:45
|3|{"gender": "male", "browser": "safari", "language": "en"}|2022-05-14 02:56:45|2022-05-14 02:56:45


### モデル
```php:Convesion.php
<?php

declare(strict_types=1);

namespace App\Models

class Conversion extends BaseModel
{
    protected $fillable = [
        'meta'
    ];

    protected $dates = [
        'updated_at',
        'created_at',
    ];

    protected $casts = [
        'meta' => 'json',
    ];
}

```

### コード
```php
$_conversions = Conversion::get();
$conversions = $_conversions->groupBy('meta.gender');

// 出力結果(ログ抜粋)
Illuminate\Database\Eloquent\Collection Object
    [male] => Illuminate\Database\Eloquent\Collection Object (
        [items:protected] => Array (
            [0] => App\Models\Conversion Object (
                [attributes:protected] =>
                Array ( [id] => 1 [meta] => {"gender": "male", "browser": "chrome", "language": "jp"} [created_at] => 2022-05-14 02:56:45 [updated_at] => 2022-05-14 02:56:45 )
            )
            [1] => App\Models\Conversion Object (
                [attributes:protected] =>
                Array ( [id] => 3 [meta] => {"gender": "male", "browser": "safari", "language": "en"} [created_at] => 2022-05-14 02:58:34 [updated_at] => 2022-05-14 02:58:34 )
            )
        )
    )
    [female] => Illuminate\Database\Eloquent\Collection Object ( [
        [items:protected] => Array (
            [0] => App\Models\Conversion Object (
                [attributes:protected] =>
                Array ( [id] => 2 [meta] => {"gender": "female", "browser": "edge", "language": "en"} [created_at] => 2022-05-14 02:58:09 [updated_at] => 2022-05-14 02:58:09 )
            )
        )
    )

```

EloquentModelが保持された状態でグループ化される

### 最後に
最後まで記事を見ていただきありがとうございます。
ご意見等ありましたらよろしくお願いします。
ChromeでGoogleのspreadsheetとドキュメントとスライドのメニュー欄が文字化けした場合

## 動作環境
MacOS
Chrome

## 具体的な症状
- 以下の画像のように、Google スプレッドシート・ドキュメントのタイトルとメニュー欄のみが文字化けするという現象が発生しました。

![スクリーンショット 2022-05-14 2.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/6c7e1b3b-f6d8-f2a0-fe40-1bee5414a68b.png)

![スクリーンショット 2022-05-14 2.35.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/b3fd5916-e0dd-e3ab-23ee-046cba842e3c.png)

- レアなケースだと思います。(Google先生に聞いても、同じ症状の記事は出てきませんでした)
- 他のサイトは、普通に日本語が表示されます。
- 入力は普通に日本語が入力できます。
- Chromeで別のユーザーで表示すると日本後で表示されます。(なので、Chromeの設定で履歴・キャッシュを削除しましたが、直りませんでした。)

## 原因
- Chromeの拡張機能である`テキストエンコーディング`の設定が別の言語に変わっていたことが原因でした。
- Spreadsheet操作時にフリーズした後に文字化けが始まったので、フリーズ時にChromeが誤動作したのかと思われます。
- 過去にChromeの拡張機能で`テキストエンコーディング`という機能を追加していたが、ずっと前にインストールしていたので、このことを忘れていた。

![スクリーンショット 2022-05-14 2.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/da6e6102-c9a8-882a-5837-60dadd0a3d77.png)

## 解決方法
- Googleドキュメントのトップメニューの空白部分を右クリック > テキストエンコーディングを選択、自動判定かUnicodeを選択すると直ります。

![スクリーンショット 2022-05-14 2.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/86bc327d-854d-0546-7b15-73ecae2afe91.png)
暗号化とハッシュ化の違いとは

演習でlocalStrageを使ってログイン機能を実装した時に[crypto.js](https://cryptojs.gitbook.io/docs/)を使用し、入力されたパスワードのハッシュ化を行ったので、暗号化とハッシュ化について調べてみた。

# ハッシュ化

ハッシュ化とは特定の計算手法に基づいて、元のデータを不規則な文字列に置換する処理。
ハッシュ化を施すアルゴリズムはハッシュ関数と呼ばれ、ハッシュ関数によって生成されるランダムな文字列はハッシュ値と呼ばれる。
**暗号化は可逆的な変換**であり、**ハッシュ化は不可逆**。

## 使用例

- パスワード保存・管理
- ビットコイン、ブロックチェーン
- 電子メール

## **ハッシュ化の規格**

- **MD5**
現在は非推奨
- **SHA-1**
グーグルも既にSHA-1の証明書受け入れを停止
- **SHA-2**
SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256
- **SHA-3**
2015年に公表された新たなハッシュ関数

# 暗号化

**暗号化**とは、元のデータに処理を施し、別なデータに変換すること。
変換されたデータを元に戻す作業のことを**復号化**という。

## 暗号化の種類

### 共通鍵暗号方式（AES）

共通鍵暗号方式は、**暗号化と復号化に同じ鍵を使う**もの。
暗号化する側と復号化する側以外の第三者に鍵が漏れないように管理する必要があるため、**秘密鍵暗号方式**とも呼ばれる。

### 公開鍵暗号方式（RSA）

公開鍵暗号方式は、**暗号化と復号化に違う鍵を使う**もの。
暗号化には公開された鍵を使い、復号化では受信者がもつ秘密の鍵を使う。復号化する側＝受信者の鍵さえ管理すればよいため、共通鍵暗号方式と比べて、鍵の漏洩リスクは少ないが、暗号化、復号化ともに処理速度が遅いという難点がある。

### ハイブリッド暗号方式

ハイブリッド暗号方式とは、**公開鍵暗号方式と共通鍵暗号方式を組み合わせた暗号方式**
で、Webの暗号で広く普及しているHTTPS（SSL/TLS）などで用いられている。

> [SSL（HTTPS）の仕組みを図解で分かりやすく説明](https://medium-company.com/ssl-仕組み/)
JavaScript 高階関数

# 高階関数とは
高階関数とは
**「関数を、引数や戻り値に持つ関数」**
のことです。

# 例
```javascript
function arrayWalk (array, f) {
    for (var key in array) {
        f(array[key]);
    }
}

function showData (value) {
    console.log(value);
}

var ary = ["Hi!","My Name is Tom!","Nice to meet you!"];
arrayWalk(ary,showData); 

```
```
Hi!
My Name is Tom!
Nice to meet you!
```

この場合、arrayWalkは引数に関数を持っていて実行しているため、高階関数になります。
また、呼び出される関数のことを**コールバック関数**と言います。

# 使いどころ
丸投げになってしまいますがこちらの記事がとても分かりやすかったです。
-- [高階関数を書いたら、中級者になれた気がした。を批判したら上級者になれた気がした。](https://qiita.com/elipmoc101/items/c34b38ddbbd9b52d0a4f#%E6%9C%AC%E9%A1%8C%E3%81%98%E3%82%83%E3%81%82%E9%AB%98%E9%9A%8E%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%AA%E3%81%AE)
VSCodeで利用したいnodejsを指定してデバッグ実行する

nodejs上で動作するプログラムをVSCodeでデバッグ実行する際に、デフォルトだと`pwa-node`というVSCodeに組み込まれたnodejsが利用されます。

nodejsの特定のバージョンを指定して実行したい場合は、そのバージョンのnodejsをインストールし、`.vscode`フォルダにある`launch.json`ファイルで、`runtimeExecutable`にインストールしたnodejsのパスを指定することで実現できます。

```
{
    ・・・
    "type": "pwa-node",
    "runtimeExecutable": "/Users/someone/.nvm/versions/node/v12.14.0/bin/node"
}
```
2022 年初夏の Magic Lantern RAW 動画撮影環境

# crop_rec_4k build

2022/5 月時点だと, crop_rec_4k build がはやりのようです.

EOS M
https://www.magiclantern.fm/forum/index.php?topic=25781.0

650D, 700D
https://www.magiclantern.fm/forum/index.php?topic=25784.0

それ以外の機種は検索すれば出てきます.

昔(?)は書き込み速度の問題から 5D2, 5D3, 7D などの CF カードのがよく使われましたが,
最近(?)は SD カード自体の性能あがったり SD カードをオーバークロック(!)する Magic Lantern モジュールが開発されて, SD カードでも十分使えるようになったような気がします.
 
EOS M は中古で 1 万円くらいで買えて, RAW 動画始めるにはおすすめですね(人気出てでもいまは 1 万円で買えないかも)

## 情報

https://www.magiclantern.fm/forum/index.php?board=49.0
https://www.magiclantern.fm/forum/index.php?board=54.0

### SD Card

SD カードをオーバークロックして書き込み速度を速めることができます.

- San disk Pro
- Samsung EVO plus 256 GB

あたりがおすすめでしょうか. EVO plus 256 GB では 60 ~ 70 MB/s くらい出ました.

### MLV app


### Raw から DNG へ変換

MLV app だったり、

https://www.cinemagear.jp/entry/2020/07/21/105208


raw2dng を使います(今だと MLV app 経由がいいかも?).

https://www.magiclantern.fm/forum/index.php?topic=5404.0

EOS M, 650 D, 700D では pink dots がある(オートフォーカス用の赤外線センサーがセンサーピクセルに埋め込まれている)のですがそれを取り除く機能あります.
MLV app は, 有志が作成した focus pixel map を自動でダウンロードしてくれて便利!

## 動画編集ソフト

あとは DNG 連番を DaVinci resolve なりで読んでカラコレしたり動画制作しましょう.
玄人なら動画編集ソフト自作ですね!

## TODO

* [ ] 音声録画を考える
【GitHub】SSH接続してみた

# はじめに
 やってみたので記録です。

環境はMacです。

公式ドキュメントを参照しました。
[Githubのドキュメント](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)

# SSHキーの作成
```:ターミナル
# ターミナルで既存のSSHキーがあるか確認
$ ls -al ~/.ssh

# 不要なものは消去
$ rm -rf ~/.ssh/不要なSSHキー

# SSHキーを作成
$ ssh-keygen -t ed25519 -C "githubのに登録しているメールアドレス"

Generating public/private ed25519 key pair.

# デフォだとid_ed25519になるので/Users/ユーザー名/.ssh/id_ed25519_githubにしてみました
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_ed25519): /Users/ユーザー名/.ssh/id_ed25519_github

#パスフレーズを入力
Enter passphrase (empty for no passphrase): 
#再入力
Enter same passphrase again: 

#　終わるとうわーっと出てくる
Your identification has been saved in id_ed25519_github.
Your public key has been saved in id_ed25519_github.pub.
The key fingerprint is:
.
.
.
```

# SSHキーをssh-agentに追加
```:ターミナル
# バックグラウンドでssh-agentを起動
$ eval "$(ssh-agent -s)"

# configファイルががなければ作成
$ touch ~/.ssh/config

#vscodeを使ってます
# lsで表示したconfigファイルをoption推しながらクリックして編集
# configファイルに以下の内容を追加

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519_github

#　SSH秘密鍵をssh-agentに追加し、パスフレーズをキーチェーンに保存
$ ssh-add -K ~/.ssh/id_ed25519_github
```

# GitHubのページで新しいSSHキーを追加する
```:ターミナル
# クリップボードに公開鍵をコピーする
$ pbcopy < ~/.ssh/id_ed25519.pub_github
```

### GitHubページ

1.設定をクリック
![20220514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680582/ab6166fa-9cff-f0db-df78-8117a6efc4f2.png)

2.左側にあるSSH and GPG keysをクリック

3.New SSH keyをクリック

4.タイトルを入力（どの環境で使っているのかなどがわかる）して、Keyにコピーしておいたパブリックキーを貼り付け

５．Add SSH keyをクリック

# SSH接続のテスト
```:ターミナル
$ ssh -T git@github.com
Hi GitHubユーザー名! You've successfully authenticated, but GitHub does not provide shell access
```

# パスフレーズの変更
```:ターミナル
$ ssh-keygen -p -f ~/.ssh/id_ed25519_github
Enter old passphrase: 
Key has comment 'GitHubに登録してあるメールアドレス'
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

# 終わりに
メモになりました。
Laravelで特定のホストでリクエストが来た時しか発動しないrouteを作って管理画面の認証画面すらも隠蔽してみる

趣味で作っているLaravelのアプリケーションで管理画面だけ通常のサービスを提供しているホストは全く別のIdentity-Aware Proxyで保護されたホストで配信して、一般のユーザから `/admin/` を叩かれても応答を返さないことで管理画面の認証画面すらも隠蔽したくなったのでその方法を紹介したいと思います。

## 早速route middlewareを作る
名前は何でも良いので早速route middlewareを作りましょう。

```php:app/Http/Middleware/CheckRestrictedRouteHost.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;

class CheckRestrictedRouteHost
{
    /**
     * ルートを特定のホストでのみ返すようにするためのMiddleware
     */
    public function handle(Request $request, Closure $next, string $host)
    {
        if ($request->getHost() === $host) {
            return $next($request);
        }
        abort(404);
        return false;
    }
}
```

middlewareのパラメータとして渡ってきた `$host` がリクエストのホストと一致しない場合は強制的に404 Not Foundのエラーを返して処理を中断するだけのmiddlewareを作っておきます。

これを後でrouteのmiddlewareに入れてあげて、リクエストを制限する形にします。

```php:app/Http/Kernel.php
<?php

namespace App\Http;

use App\Http\Middleware\CheckRestrictedRouteHost;

class Kernel extends HttpKernel
{
    protected $routeMiddleware = [
        'route.restrict.byhost' => CheckRestrictedRouteHost::class,
    ];
}
```

ここは他のroute middlewareと同様に、 `routeMiddleware` に登録してあげます。

準備はこれでおわり！

## 対象のrouteにmiddlewareを付ける
ここでは例として、 `example.com` で来たリクエストのみレスポンスを返すrouteを定義してみます。

```php:routes/web.php
<?php

use Illuminate\Support\Facades\Route;

// example.comでしか返さないroute
Route::group(['middleware' => ['route.restrict.byhost:example.com']], function () {
    // 制限したいrouteをここに記述
    Route::resource('admin', '\App\Http\Controllers\Page\AdminController')
        ->only(['index']);
    Route::group(['prefix' => 'admin'], function () {
        // 以下略...
    });
});
```

`middleware` として設定してあげるだけですね！

## さいごに
ホストが一致すれば通常通りリクエストを返す仕組みなので認証としては使えませんが(流石にこれだけで担保するのはやめましょう)、管理画面の認証画面すらも隠蔽したい時に使える手法なので試してみてください。
python-email-validator で example.com アドレスが拒否される理由と対処法

python-email-validator(email-validator) のバージョンを上げたところ、 test で使用していた example.com アドレスが `EmailNotValidError` で拒否されました。(確認時、python-email-validator は 1.2.1)

example.com を含む諸々を拒否する経緯と対処法は以下に記載がありました。

https://github.com/JoshData/python-email-validator#test-addresses

https://github.com/JoshData/python-email-validator/issues/78
Rubyでのメソッドの戻り値について勘違いしていた

Rubyのメソッドの戻り値は、`return`に渡した値です。
```ruby:greeting.rb
class Greeting
  def name(num)
    if num == 1
      result = 'Tom'
    elsif num == 2
      result = 'Ken'
    else
      result = 'Yumi'
    end
    result
  end
end

greet = Greeting.new
puts "Hello,#{greet.name(1)}!!!"
puts "Hello,#{greet.name(2)}!!!"
puts "Hello,#{greet.name(3)}!!!"
```
```ruby:実行結果
Hello,Tom!!!
Hello,Ken!!!
Hello,Yumi!!!
```
上記の場合は`return`を省略していますが、
省略されているだけで`result`が`return`に渡っています。

そして`return`を呼び出さない場合は、メソッド内の最後の式の値を
戻り値として返却するので、以下のように書いても同じ結果になります。

```ruby:greeting.rb
class Greeting
  def name(num)
    if num == 1
      result = 'Tom'
    elsif num == 2
      result = 'Ken'
    else
      result = 'Yumi'
    end
    # result
  end
end

greet = Greeting.new
puts "Hello,#{greet.name(1)}!!!"
puts "Hello,#{greet.name(2)}!!!"
puts "Hello,#{greet.name(3)}!!!"
```
```ruby:実行結果
Hello,Tom!!!
Hello,Ken!!!
Hello,Yumi!!!
```
では、以下の場合はどうなるでしょうか。
```ruby:greeting.rb
class Greeting
  def name(num)
    result = 'Yumi'
    if num == 1
      result = 'Tom'
    end
    if num == 2
      result = 'Ken'
    end
  end
end

greet = Greeting.new
puts "Hello,#{greet.name(1)}!!!"
puts "Hello,#{greet.name(2)}!!!"
puts "Hello,#{greet.name(3)}!!!"
```
```ruby:実行結果
Hello,!!!
Hello,Ken!!!
Hello,!!!
```
なんと、引数1, 3の結果はメソッドの戻り値が出力されていません。
'return'を呼び出さない場合は、メソッド内の最後の式の値を戻り値
として返却するので、`if num == 2 ~ end`の結果が返却されているのですね。
当たり前といえば当たり前なのですが、私は最初の例と同様の結果が得られると勘違いしていました。。
Vagrant upコマンドでのエラー対応記録

vagrant upコマンドでエラーが発生、解決に三日ほど時間がかかったので対処法を記録〜

## 環境
Windows10 pro
Vagrant 2.2.4
Virtualbox 6.0

※現行の最新版（Vagrant2.2.19/Virtualbox6.1)の組み合わせではvagrant upコマンドを打っても`auth method: private key`で止まってしまうという、この記事のメインとなるエラーとは違うエラーが出たため、**マイナーバージョンをインストール**して無理矢理解決させた。

# どんなエラーが出たか
```
==> ###: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "fe623649-8ae4-42fc-8725-d9a2049a4371", "--type", "headless"]

Stderr: VBoxManage.exe: error: Call to WHvSetupPartition failed: ERROR_SUCCESS (Last=0xc000000d/87) (VERR_NEM_VM_CREATE_FAILED)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
```

## 原因
問題はこの部分
```
Stderr: VBoxManage.exe: error: Call to WHvSetupPartition failed: ERROR_SUCCESS (Last=0xc000000d/87) (VERR_NEM_VM_CREATE_FAILED)
```
調べてみたところ原因は**Hyper-V**というものが有効になっていることらしい。
VirtualboxはHyper-Vと競合するため、Virtualboxを起動させるためのVagrant upコマンドでエラーが出ているみたい・・・

### Hyper-Vの状態の確認方法
管理者権限でPowerShellを起動させ、以下のコマンドを実行し、その下に貼った画像のようになっているかを確認
```
systeminfo.exe
```
こうなってたらOK
[![Image from Gyazo](https://i.gyazo.com/188e530d6551b5048039943cba76e147.png)](https://gyazo.com/188e530d6551b5048039943cba76e147)
これはNG
[![Image from Gyazo](https://i.gyazo.com/f295a8f330c49e3f102d6ddee3bdff89.png)](https://gyazo.com/f295a8f330c49e3f102d6ddee3bdff89)

# ここからが戦いだった・・・
**色々試した、、、でもダメだった**
- Vagrantのバージョンを変える
- VirtualBoxバージョンを変える
- Windowsの機能の有効化でHyper-Vを無効(チェックを外す）後、再起動
- コマンドプロンプトを管理者として起動し
```
bcdedit /set hypervisorlaunchtype off
```
その後再起動
- PowerShell（管理者権限）で
```
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```
↑Hyper-V関連すべての停止のコマンド
その後再起動
などなど・・・

なのに・・・
[![Image from Gyazo](https://i.gyazo.com/f295a8f330c49e3f102d6ddee3bdff89.png)](https://gyazo.com/f295a8f330c49e3f102d6ddee3bdff89)
何でやねん！
あーきもい、しつこい、泣きそう
と思っていながらたどり着いた記事の

`コア分離機能の「メモリ整合性」の設定をオフにするといいっすよ〜`

試してみるか・・・
[![Image from Gyazo](https://i.gyazo.com/b30df652d66ca742363d1eea2bcfdb7a.png)](https://gyazo.com/b30df652d66ca742363d1eea2bcfdb7a)
オフる
そして再起動
・
・
・
・
・
できた！！
こんなんわかんねぇよ…
とりあえず起動してよかった〜！！
HTML webコンテンツのタグ構成

### 大枠

- header
    - 企業ロゴ、各種リンク、お知らせ
- main
    - メインコンテンツ
- footer
    - ページの制作者や運営者に関する情報、関連ページへのリンク、copyright
    - smallタグ
        - 著作権表記に使用、欄外注釈など

### まとまりを表す要素

- nav
    - webサイト内の主要なナビゲーションを表す。リンクメニュー。
- article
    - articleのまとまりひとつで意味がわかるもの。その名の通り記事のまとまりなどに使用する。
- aside
    - webページの主要コンテンツとは関係のない一節。広告など。
- section
    - 上記3つに該当せず、section要素だけでは全体の意味が掴めないもの。
- div
    - レイアウトが目的のまとまり
    - ブロック要素
- span
    - こちらもレイアウトが目的のまとまり
    - インライン要素
- main
    - 各ページのメインコンテンツ
    - 各ページに1つ
    - navやasideのなかに含むのはNG
【図解】ReactのuseRefとuseStateの違いを理解する


## はじめに
業務でuseRefをさわる機会があったのですが、useStateとの違いをイマイチ把握できなかったので、整理しました。

## useRefとuseStateの違いまとめ

値更新時のレンダリング有無がポイントのようです。

| 項目     | 値の保持 | 値更新時のレンダリング | 
| -------- | -------- | ---------------------- | 
| useRef   | できる   | されない               | 
| useState | できる   | される                 | 

## 具体例

### サンプルソースコード

```app.js
import "./styles.css";

import * as React from "react";

export default function App() {
  const [count, setCount] = React.useState(0);
  const countRef = React.useRef(0);

  return (
    <div className="App">
      <div>カウント（useState）: {count}</div>
      <button onClick={() => setCount(count + 1)}>
        カウントアップ（useState）
      </button>

      <div>カウント（useRef）: {countRef.current}</div>
      <button onClick={() => countRef.current++}>
        カウントアップ（useRef）
      </button>
    </div>
  );
}
```

### デモ
1. useState用のボタンとuseRef用のボタンを用意
1. useRef用のボタンを3回クリックする
    - 	画面描画が行われず、カウントアップしない
1. useState用のボタンを3回クリックする
    - 	画面描画が行われ、カウントアップする
    - 	useRef用の表示もここで初めてレンダリングされて、3回クリックした後の表示となる

![useRefとuseState.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/07f626e4-91e2-1898-6531-7b7f1e625ffa.gif)
CloudTrailに記録されるマネジメントコンソールサインインのログはバージニア北部リージョンに記録されるとは限らない

いつもお世話になっているClassmethodさんのブログを参考に設定して設定してみました。

https://dev.classmethod.jp/articles/aws-management-console-sign-in-notice/

しかし**通知が来ない**😥😥😥

調べてみると、必ずバージニア北部リージョンとは限らないようです。
公式ドキュメントはこちら

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_sign-in.html

> ユーザーがコンソールに直接サインインすると、選択されたサービスのコンソールがリージョンをサポートするかどうかによって、グローバルまたはリージョンのサインインエンドポイントにリダイレクトされます。

ということで

# 試してみた

:::note
    Chromeのシークレットモードで試しました。 
    また、エイリアス設定はしていないので`alias`部分には`12桁のアカウントID`を指定しました。
:::

* URL欄に **https://alias.signin.aws.amazon.com/console/** を入力してCloudTrailのログを確認

* 結果
    **サインイン時のURL:** https://us-west-1.signin.aws.amazon.com/oauth?...
    **サインイン後のURL:** https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#
    **CloudTrailのログ:** 米国西部 (**北カリフォルニア**) us-west-1

**ん？北カリフォルニア？バージニア北部でも東京でもなく、北カリフォルニア。。。**

もう一回

* URL欄に **https://alias.signin.aws.amazon.com/console/** を入力してCloudTrailのログを確認

* 結果
    **サインイン時のURL:** https://us-west-2.signin.aws.amazon.com/oauth?...
    **サインイン後のURL:** https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#
    **CloudTrailのログ:** 米国西部 (**オレゴン**) us-west-2

**オレゴン。。もしかしてランダム？？**

次はFirefoxにしてみました。。。

* URL欄に **https://alias.signin.aws.amazon.com/console/** を入力してCloudTrailのログを確認

* 結果

    **サインイン時のURL:** https://us-west-2.signin.aws.amazon.com/oauth?...
    **サインイン後のURL:** https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#
    **CloudTrailのログ:** 米国西部 (**オレゴン**) us-west-2

**オレゴン！！！**

次はちょっと変えてみます。

1. **https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1** を開く
1. サインアウト
1. 再度ログイン

* 結果

    **サインイン時のURL:** https://us-west-2.signin.aws.amazon.com/oauth?...
    **サインイン後のURL:** https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1#
    **CloudTrailのログ:** 米国西部 (**オレゴン**) us-west-2

**オレゴーーーーン**

最後は公式ドキュメントにあった「リージョン直接指定」を試してみます。

* URL欄に **https://alias.signin.aws.amazon.com/console?region=ap-southeast-1** を入力してCloudTrailのログを確認

* 結果

    **サインイン時のURL:** https://ap-southeast-1.signin.aws.amazon.com/oauth?...
    **サインイン後のURL:** https://ap-southeast-1.console.aws.amazon.com/console/home?region=ap-southeast-1#
    **CloudTrailのログ:** アジアパシフィック (**シンガポール**) ap-southeast-1

**シンガポーーール**

はい。という結果でした。

# ということは。。

冒頭の**サインインをメールで通知する方法**については、**全リージョンに仕掛けないといけないような気がします**。（肝心なところは試してません😫😫😫どなたか続きをお願いします！！！）