OmniAICreator/Qiita-1.07M huggingface dataset:
CodeIQ:最大公約フィボナッチ数の解答　

@nabetaniさん出題のCodeIQの問題です。
問題と解説はこちら
->http://nabetani.hatenablog.com/entry/codeiq_gcfibo_q649
（テストケースの答えは別の所から拝借したはずですが出処が不明になってしまいました）

とりあえず力任せに解いてみたところ十分な速さでパスしてしまいました。
二つの入力其々に対し、入力値をNとし適当にXを決め、
Y1=N-X,Y2=X,Y3=Y1-Y2,Y4=Y2-Y3...としていって最後に1になる数列をfindallで集め
(fibn/2,fibn/3)、集めた数列をflatten/2でばらして一つのリストにまとめ,
それを降順でソートしてmember/2で両方のリストに最初に見つかる数が求める数です(gcfibo/3)。

```Prolog
%SWI-Prolog (version 7.4.2,7.6.4)
%:-initialization(start3).     %ideone
%start3.

fibn(N,R):-N1 is N div 2,findall(L,(between(1,N1,X),Y is N-X,fibn(N,Y,[N],L)),R),!.
fibn(_,N,_,_):-N=<0.
fibn(_,1,L,L).
fibn(R1,R2,L,R):-L1=[R2|L],R2<R1,R3 is R1-R2,R3<R2,fibn(R2,R3,L1,R).

gcfibo(N1,N2,R):-
     fibn(N1,R1),fibn(N2,R2),flatten(R1,R11),flatten(R2,R21),
     sort(0,@>,R11,R12),sort(0,@>,R21,R22),member(R,R12),member(R,R22),!.
     
start3:-data3(L),member([X,Y,A],L),gcfibo(X,Y,R),writeln(A->R),fail.
start3.

data3([[10,14,9],[18, 14,4],[73, 97,37],[23, 25,12],[308, 320, 123],
     [6168, 9877,1234],[18518, 19942,12345]]).
```

これでは面白くないのでもう少し考えてみました。
fibo(B)を順に計算して並べてみると普通のフィボナッチ数のk番目の値をfib(k)として
a[k+1]=B*fib(k+1)+fib(k), k=0から
となります。
そこでfib3/2でfib(k)をK=20まで計算しておいてsetb/3でKを0から19まで動かしながら
B=(N-fib(k))/fib(k+1)が自然数となるBを集めます。
その後それぞれのBに対してfibn1/3で入力値の約フィボナッチ数を求めます。
後は同様です。

```Prolog
%SWI-Prolog (version 7.4.2,7.6.4)
%:-initialization(start3).    %ideone
%start3.

fibn(N,LF,R):-setb(N,LF,LB),findall(L,(member(B,LB),fibn1(N,[B,1],L)),R),!.
fibn1(N,[N|R],[N|R]):-!.
fibn1(N,[X,Y|T],R):-Z is X+Y,fibn1(N,[Z,X,Y|T],R).

gcfibo(N1,N2,LF,R):-
     fibn(N1,LF,R1),fibn(N2,LF,R2),flatten(R1,R11),flatten(R2,R21),
     sort(0,@>,R11,R12),sort(0,@>,R21,R22),member(R,R12),member(R,R22),!.

setb(N,LF,R):-
     findall(B,(between(1,19,M),M1 is M+1,nth1(M,LF,X),nth1(M1,LF,Y),
     B is(N-X)/Y,integer(B)),R).

fib3(1,[1,0]):-!.
fib3(N,R):-N1 is N-1,fib3(N1,[X,Y|T]),Z is X+Y,R=[Z,X,Y|T].

start3:-
     data3(L),member([X,Y,A],L),fib3(20,LF),reverse(LF,LF1),
     gcfibo(X,Y,LF1,R),writeln(A->R),fail.
start3.

data3([[10,14,9],[18, 14,4],[73, 97,37],[23, 25,12],[308, 320, 123],
     [6168, 9877,1234],[18518, 19942,12345]]).
```
QGroundControlをビルドする（WSL2）

# QGroundControl

Windows10では、Xサーバーが必要なので、以下に従って、インストールします。（Windows11は不要なようですが手元になく試していません）

https://rin-ka.net/windows-x-server/

DISPLAY環境設定が設定できたら、

```
sudo apt install x11-apps
xeyes
```

などとして、動作確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/a521c20a-ab7f-2dd1-ed84-ebb8cfa42b5f.png)

```
sudo apt install libxkbcommon-x11-0
sudo apt install libxcb-icccm4
sudo apt install libxcb-image0
sudo apt install libxcb-keysyms1
sudo apt install libxcb-render-util0
sudo apt install libxcb-xinerama0
sudo apt install mesa-utils build-essential
```

http://www.qt.io/download-open-source
からダウンロードインストーラーをいれます。ページ中ほどにあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/4e64e491-30cb-0082-cf27-0b017ee53c8d.png)

```
./qt-unified-linux-x64-4.4.1-online.run
```

QGroundControlをビルドするためには、Qtを入れるバージョンが決められています。以下を確認してください。

https://dev.qgroundcontrol.com/master/en/getting_started/index.html

```
git clone --recursive -j8 https://github.com/mavlink/qgroundcontrol.git
~/Qt/Tools/QtCreator/bin/qtcreator
```

qgroundcontrol.pro を開く
ビルドボタンを押す

# PX4 simulatorで遊ぶ

```
sudo apt install cmake python3-pip
sudo apt install python-is-python3
sudo apt install openjdk-11-jdk
pip install empy catkin_pkg numpy toml
git clone  https://github.com/PX4/PX4-Autopilot.git
cd PX4-Autopilot
make px4_sitl jmavsim
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/b81863fe-fa4b-3bff-8c0b-ee5716a1293c.png)
Salesforceの行動の「終日行動」のデフォルト値を確認してみた

Salesforceの行動の「終日行動」のデフォルト値を確認しました。


結果は以下のようなものです


※カレンダー上の日付から直接クリックした場合の動き

・日　なら終日行動がデフォルトでチェック無し

・週　なら終日行動がデフォルトでチェック無し

・月　なら終日行動がデフォルトでチェック有り

 

※カレンダー右上にある「新規行動」をクリックした場合の動き

・日 なら終日行動がデフォルトでチェック無し

・週 なら終日行動がデフォルトでチェック無し

・月 なら終日行動がデフォルトでチェック無し


（※レコードのアクション「新規行動」から作成される行動はチェックが無いです）

では、それぞれ見ていきましょう

### ※カレンダー上の日付から直接クリックした場合の動き について

こちらはこのような動きです。
例えば「日」を選択し日付をクリックしたら「終日行動」のチェックのない行動が作成できます
![日カレンダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a6522f99-1338-1ad5-31af-ad240e261559.png)

![行動01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a2604987-179e-45d3-78d2-27c2fb40149d.png)


ここで「月」を選択肢日付をクリックしたら（標準でおそらく唯一）「終日行動」のチェックのある行動が作成できます
![月.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/47caec1d-8b87-7493-f34e-a646f47f8c67.png)



なお、カレンダーで「新規行動」ボタンから行動を作成した場合、「日」でも「週」でも「月」でも「終日行動」のチェックのない行動が作成できます
![新規行動ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/77a0a721-0210-b09f-9008-869094cc3920.png)

もしも終日行動のチェックがある状態で行動を作成したいなら方法は２つかと思います

１カレンダーで「月」を選択肢日付をクリックして作成
２アクションで「終日行動」デフォルトを「TRUE」にチェックをする（下画像参照）
![グローバル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fac0217c-dfc2-9e3c-4099-99e542178285.png)
【Docker】secretsについて

## secretsについて
### Short syntax
```docker-compose.yml
services:
  frontend:
    image: awesome/webapp
    secrets:
      - server-certificate
secrets:
  server-certificate:
    file: ./server.cert
```

### Long syntax
```docker-compose.yml
services:
  frontend:
    image: awesome/webapp
    secrets:
      - source: server-certificate
        target: server.cert
        uid: "103"
        gid: "103"
        mode: 0440
secrets:
  server-certificate:
    external: true
```
Go Echo でミドルウェアを入れようとした時のつまずき

## 1. Echo で 以下のようにミドルウェアを設定

```go
func main() {
	e := echo.New()

	// ミドルウェア
	e.Use(middleware.Recover())
	e.Use(middleware.Logger())
```

## 2. jwt-go が必要と言われたので入れた
```
echo-test-app-1  | ../pkg/mod/github.com/labstack/echo@v3.3.10+incompatible/middleware/jwt.go:9:2: no required module provides package github.com/dgrijalva/jwt-go; to add it:
echo-test-app-1  |      go get github.com/dgrijalva/jwt-go
echo-test-app-1 exited with code 1
```

```
go get github.com/dgrijalva/jwt-go
```

## 3. MiddlewareFunc である必要があるとのこと
```
echo-test-app-1  | go: downloading github.com/dgrijalva/jwt-go v3.2.0+incompatible
echo-test-app-1  | # command-line-arguments
echo-test-app-1  | ./server.go:14:8: cannot use middleware.Recover() (value of type "github.com/labstack/echo".MiddlewareFunc) as type "github.com/labstack/echo/v4".MiddlewareFunc in argument to e.Use
echo-test-app-1  | ./server.go:15:8: cannot use middleware.Logger() (value of type "github.com/labstack/echo".MiddlewareFunc) as type "github.com/labstack/echo/v4".MiddlewareFunc in argument to e.Use
echo-test-app-1 exited with code 2
```

以下記事の通り、 import の記述を変える
https://qiita.com/niwa3/items/642236261b16ef1a78dd

```diff
import (
- 	"github.com/labstack/echo/middleware"
	"github.com/labstack/echo/v4"
+ 	"github.com/labstack/echo/v4/middleware"
)
```

## 4. go get で v4/middleware を取得し、無事起動できた
```
echo-test-app-1  | ../pkg/mod/github.com/labstack/echo/v4@v4.7.2/middleware/jwt.go:9:2: missing go.sum entry for module providing package github.com/golang-jwt/jwt (imported by github.com/labstack/echo/v4/middleware); to add:echo-test-app-1  |      go get github.com/labstack/echo/v4/middleware@v4.7.2
echo-test-app-1  | ../pkg/mod/github.com/labstack/echo/v4@v4.7.2/middleware/rate_limiter.go:9:2: missing go.sum entry for module providing package golang.org/x/time/rate (imported by github.com/labstack/echo/v4/middleware); to add:
echo-test-app-1  |      go get github.com/labstack/echo/v4/middleware@v4.7.2
echo-test-app-1 exited with code 1
```

```
go get github.com/labstack/echo/v4/middleware@v4.7.2
```

無事立ち上がり、ログも出力された。
```
Attaching to echo-test-app-1
echo-test-app-1  | go: downloading github.com/golang-jwt/jwt v3.2.2+incompatible
echo-test-app-1  | go: downloading golang.org/x/time v0.0.0-20201208040808-7e3f01d25324
echo-test-app-1  |
echo-test-app-1  |    ____    __
echo-test-app-1  |   / __/___/ /  ___
echo-test-app-1  |  / _// __/ _ \/ _ \
echo-test-app-1  | /___/\__/_//_/\___/ v4.7.2
echo-test-app-1  | High performance, minimalist Go web framework
echo-test-app-1  | https://echo.labstack.com
echo-test-app-1  | ____________________________________O/_______
echo-test-app-1  |                                     O\
echo-test-app-1  | ⇨ http server started on [::]:1323
```

```
echo-test-app-1  | {"time":"2022-08-05T23:39:06.262116217Z","id":"","remote_ip":"172.19.0.1","host":"localhost:1323","method":"GET","uri":"/users/14","user_agent":"PostmanRuntime/7.29.2","status":200,"error":"","latency":12143792,"latency_human":"12.143792ms","bytes_in":0,"bytes_out":169}
```
Pythonが嫌いなのでC++版のPytorchで画像認識をやってみる 6日目

# 実行時型チェック
なんか型を調べているだけでハマりそう。サンプルを作ってみた。
```c++:
#include <torch/torch.h>
#include <iostream>

class Net : torch::nn::Module
{
public:
    torch::nn::Conv2d conv1=nullptr; //謎の構文
    torch::nn::MaxPool2d* pool;      //ポインタで定義
    Net();
    ~Net();
};
Net::Net()
{
    torch::nn::Module();
    conv1 = torch::nn::Conv2d(1, 6, 5); //変数代入で初期化
    pool = new torch::nn::MaxPool2d(torch::nn::MaxPool2dOptions({2, 2})); //newでメモリ確保
}
Net::~Net()
{
    //delete conv1;　//変数なのでdelete命令を掛けるとエラー
    delete pool;
}
int main() 
{
    Net net1;
    std::cout << *net1.conv1 << std::endl;  //①変数にインスタンス化する*演算子(正式には間接演算子といふ)を付ける。エラーになるはずだが。
    std::cout << net1.conv1 << std::endl;   //②普通に出力
    std::cout << *net1.pool << std::endl;   //③ポインタにインスタンス化する*演算子を付けて出力。
    std::cout << net1.pool << std::endl;    //④ポインタそのまま。
    return 0;
}
```
# なぜ通る???
結果は↓
```
torch::nn::Conv2d(1, 6, kernel_size=[5, 5], stride=[1, 1])
torch::nn::Conv2d(1, 6, kernel_size=[5, 5], stride=[1, 1])
torch::nn::MaxPool2d(kernel_size=[2, 2], stride=[2, 2], padding=[0, 0], dilation=[1, 1], ceil_mode=false)
000002162CA9DE30
```
なぜ通る???特に①の挙動が不可解である。インスタンス変数に*を付けてエラーにならない。
実行時型チェックを行ってみる。C++11からtypeidという便利なクラスができたようなので使ってみる。
```C++:
    std::cout << typeid(*net1.conv1).name() << std::endl;
    std::cout << typeid(net1.conv1).name() << std::endl;
    std::cout << typeid(*net1.pool).name() << std::endl;
    std::cout << typeid(net1.pool).name() << std::endl;
```
結果は↓
```
class torch::nn::Conv2dImpl
class torch::nn::Conv2d
class torch::nn::MaxPool2d
class torch::nn::MaxPool2d * __ptr64
```
想像以上に分かりやすい表示。メモリサイズでも出てくるものだと思っていたが。

# 演算子のオーバーライドを調べる
どうやらConv2dはポインタ型ではなくインスタンスらしい。*演算子を付けると親クラスの実体かなんかを返すオーバーライドがあるのだろう。そう思って公式ドキュメントをみると、
https://pytorch.org/cppdocs/api/classtorch_1_1nn_1_1_conv2d.html?highlight=conv2d
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/9b926f1e-7514-f0e7-7347-a1708db3841f.png)
ModuleHolderという奴が親クラスである。コイツの定義をさらに見ると、
https://pytorch.org/cppdocs/api/classtorch_1_1nn_1_1_module_holder.html#_CPPv4I0EN5torch2nn12ModuleHolderE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/4da2acc0-3b55-d94b-2965-c13aada62bbc.png)
おやおや、演算子のオーバーライドがゾロゾロでてくる。無茶苦茶するなあ。少しでもpythonぽくしたいということか。
# 参照渡しかよ
*演算子の定義はこうなっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/c55b5ffa-797f-2412-3951-0bcefb3598ca.png)
保有するモジュールのアドレスか参照を返すということらしい。おそらく実体渡しだとロスが大きいので**参照渡し**にしたいということか。ポインタ渡しの方が不用意に変数を変えなくていいと思うが。*は参照渡し。なんだかなあ。無茶しすぎやろ。意味は分かったが昭和のおじさんは先行き不安でしばし戸惑うのであった。こんなチラ裏日記読んでる人はいないと思うが**参照渡し**は実体渡しと挙動が使うので注意されたい。
随分遠回りしてしまった。なんとなくライブラリの癖みたいのは分かってきたので、明日からはコーディングに入りたいなあ。さて泥かきするか。

今日はここまで
2022-07-28 カンマ区切りの文字列を標準入力で受け取り、要素の数を出力する PHP スクリプト

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.264 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Fri Jul 29 2022 01:57:18 GMT-0700 (PDT)
* Source doc: 2022-07-28 カンマ区切りの文字列を標準入力で受け取り、要素の数を出力する PHP スクリプト
* This is a partial selection. Check to make sure intra-doc links work.
* Tables are currently converted to HTML tables.
----->

## 前書き

以下のようなデータについて、各行のカラムの数を数える必要があり、シェルのコマンドで実現しようとすると難儀したので PHP でスクリプトを書いた。


```
A, B, C
A, B, C
A, B, C
A, B, C
A, B, C

A, B, C


A, B, C
A, B, C
A, B, C
A, B, C
A, B, C
A, B, C
A, B, C

A, C
A, C
A, C
C, A
C, A
C, A
```

欲しい出力

```
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
0
3 A, B, C
0
0
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
0
2 A, C
2 A, C
2 A, C
2 C, A
2 C, A
2 C, A
```


## 作成した PHP スクリプト


```
<?php
while (true) {
	$line = fgets(STDIN);
	if ($line===false) {
		break;
	}
	$line=trim($line);
	if (empty($line)) {
		echo sprintf('%s %s%s', "0", $line, PHP_EOL);
		continue;
	}
	$values = explode(",", $line);
	echo sprintf('%s %s%s', count($values), $line, PHP_EOL);
}
```



## 実行結果


```
[root@localhost ~]# cat z.sh
cat <<EOF | php a.php
A, B, C
A, B, C
A, B, C
A, B, C
A, B, C

A, B, C


A, B, C
A, B, C
A, B, C
A, B, C
A, B, C
A, B, C
A, B, C

A, C
A, C
A, C
C, A
C, A
C, A
EOF
[root@localhost ~]# sh ./z.sh
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
0
3 A, B, C
0
0
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
3 A, B, C
0
2 A, C
2 A, C
2 A, C
2 C, A
2 C, A
2 C, A

```



## Ref

[PHP: I/O streams - Manual](https://www.php.net/manual/en/features.commandline.io-streams.php)
2022-07-27 sendmail で mail を送信する

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.33 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Fri Jul 29 2022 01:55:37 GMT-0700 (PDT)
* Source doc: 2022-07-27 sendmail で mail を送信する
* Tables are currently converted to HTML tables.
----->

## 方法

以下の方法で、テストメールを送信することができる。


```
# echo 'Test' | sendmail example@example.example
```



## 経緯

メールの送信確認、疎通確認を行う際に、sendmail コマンドしかない環境では sendmail コマンドを利用することになる。

mail コマンドには慣れ親しんでいるが、 sendmail コマンドでメールを送ることになると毎度戸惑うので、書き残しておくことにした。


## Ref

[5 Ways To Send Email from Linux Command Line - TecAdmin](https://tecadmin.net/ways-to-send-email-from-linux-command-line/)
2022-07-27 ping: socket: Operation not permitted

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.375 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Fri Jul 29 2022 01:54:40 GMT-0700 (PDT)
* Source doc: 2022-07-27 ping: socket: Operation not permitted
* Tables are currently converted to HTML tables.
----->


## 環境

* [Vagrant box rockylinux/8 v5.0.0 - Vagrant Cloud (vagrantup.com)](https://app.vagrantup.com/rockylinux/boxes/8/versions/5.0.0)
* ロケールは「en_US.UTF-8」


## 発生した事象

Rocky Linux 環境を Vagrant box で作成し、 vagrant ユーザで SSH ログインして ping コマンドを実行したところ、「ping: socket: Operation not permitted」というエラーが出た。

root ユーザで実行したところ成功した。


```
[vagrant@localhost ~]$ ping -c1 8.8.8.8
ping: socket: Operation not permitted

[vagrant@localhost ~]$ sudo su -
Last login: Wed Jul 27 06:56:51 UTC 2022
[root@localhost ~]# ping -c1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=15.3 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 15.282/15.282/15.282/0.000 ms
```



## 解決方法


```
chmod 4711 /usr/bin/ping
```


とコマンドを実行したところ、事象が解消された。


```
[root@localhost ~]# ls -l /usr/bin/ping
-rwxr-xr-x. 1 root root 67656 Apr 19 23:11 /usr/bin/ping
[root@localhost ~]# chmod 4711 /usr/bin/ping
[vagrant@localhost ~]$ ping -c1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=16.2 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 16.238/16.238/16.238/0.000 ms
[vagrant@localhost ~]$ 
```


[How to fix – ping: socket: Operation not permitted | Incredigeek](https://www.incredigeek.com/home/how-to-fix-ping-socket-operation-not-permitted/)
2022-07-26 キーボードからコマンドに標準入力を受け渡す

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.342 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Fri Jul 29 2022 01:51:44 GMT-0700 (PDT)
* Source doc: 2022-07-26 キーボードからコマンドに標準入力を受け渡す
* Tables are currently converted to HTML tables.
----->

## 環境


```
$ bash --version
GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```



## 発生した問題

間違えて `sort` コマンドを単体で入力したときなど、コマンドが標準入力を受け付けた状態となる。

ctrl+c で抜ければいいのだが、何も出力なく中断されてしまう。なんか面白味がない。


```
$ sort
h
a
t
s
u
n
e

m
i
k
u

^C
$
```


キーボード入力を標準入力から受け渡して、それを sort させたい。


## 方法

ctrl+c ではなく ctrl+d を入力することで、キーボードで入力した内容を `sort` コマンドに受け渡すことができる。

ctrl+d を入力した後、 sort コマンドの結果が出力される。


```
$ sort
h
a
t
s
u
n
e

m
i
k
u

^D

a
e
h
i
k
m
n
s
t
u
u
```

## 余談

php 単体で実行した際の、標準入力を受け付ける処理においても利用できる。

```
$ php
<?php
class Hatsune
{
    public function run() 
    {   
        echo 'Hatsune Miku';
    }
}

$h = new Hatsune();
$h->run();
^D
Hatsune Miku
```

## 余談2

Windows の場合は ctrl+Z で同様の挙動となる。

```
C:\Users\taro_hida>php
<?php
class Hatsune
{
    public function run()
    {
        echo 'Hatsune Miku';
    }
}

$h = new Hatsune();
$h->run();
^Z
Hatsune Miku
```
我が家のポータブルラジオ

![IMGP0036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d891e9a9-008d-1f87-0281-79e7f4419aca.jpeg)

中央の黒いのが40年位前の中学時代に作ったカホ無線のキット(RS-563)です。このキットはAMラジオが受信でき、NECのICのuPC1018Cを使っています。元々イヤフォンで聞くようになっていて、アンプが同じようなケースに入って別売でした。確か結構高かったので、これだけ買って作りました。バーアンテナもしっかりしていて良く入ります。さすがカホ無線のキットだけあり、受信周波数の上下もぴったりです。

昔は中学生の電子工作の一歩はラジオでした。

数年前にLM386とスピーカーを入れてこれだけで聞けるようにしました。アンプのキットも同じケースだったので、ちょうどスピーカーがつけられるスペースがありました。スピーカーがちょっと大きかったので、すこしケースを削って加工しました。LM386は小さな基板で組み立てて、インジケーターの後ろに入れました。緑のLEDが受信感度ですが、ループアンテナのバリコンを回すと同調がしっかり分かっていいです。昔はメーターに憧れましたが、これで十分です。ループアンテナは接続しなくてもバーアンテナの近くに置くだけで十分感度が上がります。

スピーカーも大きく音にメリハリがあり、ニュースのアナウンサーの調子がよく分かりとっても気に入っています。

単三四本で、エネループで半年くらい持ちます。

右のがSONYのICF-SW1です。これは1990前後にシリコンバレーに出張するときに日本のラジオを聞こうと思い買いました。その後20年位前に修理に出して、表面実装のコンデンサーを替えてもらえたのでちゃんと使えます。アンテナが折れてしまいSONYに問い合わせたところ部品はもう無いという事だったので、同じような太さのアンテナをつけていますが、ちょっと長いので本体に収まりません。（2023年追記：またコンデンサーの劣化で正常に受信できなくなりました）

コンデンサーが劣化して、電池交換時にメモリが飛ぶのでとっても不便です。昔はデジタルの方がいいと思いましたが、アナログバリコンの方が便利です。

FMは大丈夫ですがAMがちょっと周波数ずれてしまっています。調整方法がわかればSSGもあるので、どうにかできるかもなのですが。

単三二本で、エネループで半年くらい持ちます。

黄色いのはSAMSUNGのKA22425Dを使った防水のラジオです。うっすら分かりますが、バーアンテナを倍くらいの長さのものに替えてあります。手持ちのものをダメもとで替えてみたのですが、うまくいきました。AMはかなり良く入りますが、ちょっと上のほうの周波数が切れてしまってラジオ関東が入りません。FMの選局は片寄っていてよくありません。そのうち調整します。

どちらかでこのラジオをいろいろ調べている人を見かけました。

単三三本で、エネループで半年くらい持ちます。

左上のが[DSPラジオ](https://qiita.com/yamori813/items/95bee3cfbf945745d6d4)です。単四二本ですが、OFFでも1週間で電池が切れてしまいます。OFFでも5mAくらい流れてしまっているので、ON/OFFできる電池ボックスをつないでいます。

海外はラジオがデジタルになってしまい、昔のラジオでは聞けなくなってる国もあるようですが、日本はデジタル化に失敗したのでよかったです。デジタルだったらネットでもいいわけですし。

災害が激甚化している今日においては適切な情報源として、より原始的なラジオが有用だと思われます。

ラジオが大好きです。
ずっとFPGA初心者（その16）：JKフリップフロップ(2)

# VHDL(Quartus)が生成する回路図
前回「[エレキ素人が何か考える（その10）＆ずっとFPGA初心者（その15）：JKフリップフロップ(1)](https://qiita.com/infinite1oop/items/9698be8215f267b8a651)」にて、
「回路上の左のAND回路と右のNOR回路は、Process文内で順番に実施してはいけないということを意味するはず、、（FPGA内で同時処理が必要）。
（間違っていたら、どなたか、ご指摘ください。）」
とつぶやいたところ、有識者の方から、Quartusにて、RTL Viewer（下記サイト参照）を使うと、回路図表示ができるというアドバイスを頂いたので、その内容を記載する。
- [QuartusのRTL Viewerを使ってみる | 猫式会社neco-tech](https://neco-tech.com/archives/198)

## そもそもFPGAの構成？
回路図表示（後述）を行ったところ、Dフリップフロップが現れ、初心者として、少々驚いたので調べてみた。
- [FPGAの基礎知識](https://www.cqpub.co.jp/dwm/contents/0116/dwm011600320.pdf)
- [いまさら聞けない FPGA入門](https://monoist.itmedia.co.jp/mn/articles/0609/20/news118_2.html)
- [FPGA](https://ja.wikipedia.org/wiki/FPGA)

FPGAは、ルックアップテーブルとDフリップフロップなどから構成されているとのこと。

## JKフリップフロップ（再掲）
[前回](https://qiita.com/infinite1oop/items/9698be8215f267b8a651)の復習。
### ANDおよびNORロジックで構成されたFPGAの対象の回路
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d3ca32df-3767-68ec-cb98-bef47210f321.png)
### VHDLコード
```vhdl:JK.vhd
library ieee;
use ieee.std_logic_1164.all;

entity JK is
  port (CLK, J, K : in  std_logic;  -- ①
        Q, Qbar : out std_logic);   -- ②
end;

architecture RTL of JK is
signal out1 : std_logic := '0';   -- ③
signal out2 : std_logic := '0';
signal out3 : std_logic := '1';
signal out4 : std_logic := '0';

begin
	process (CLK)
	begin
		if (rising_edge(CLK)) then  -- ④
			out1 <= J and out3;
			out2 <= K and out4;
			-- out3 <= not(out1 or out4); -- does not work  -- ⑤
			-- out4 <= not(out2 or out3); -- does not work
		end if;
	end process;
	
	out3 <= not(out1 or out4);  -- ⑥
	out4 <= not(out2 or out3);
	Q <= out4;
	Qbar <= out3;
end RTL;
```
上記のコード（以降、正しい動きをするもの：Ａ）の回路図表示をしたものと、⑥以下2行の代わりに、⑤以下2行を用いたときのコード（以降、正しくない動きをするもの：Ｂ）の回路図表示をしたものとを比較する。

## 回路図表示
### 正しい動きをするもの（コードＡ）
![回路１（正しい動き）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/92a389b7-c1da-0a3d-2fb7-6062b451ab42.png)
### 正しくない動きをするもの（コードＢ）
![回路２（正しくない動き）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d15228d1-bad1-daa0-56c1-9f2a7843d585.png)

### 考察
（理解できていないところ多々あるので、誤りなどあるかもしれません。）

まずは、前記のとおり、Dフリップフロップが用いられていることがわかる。コードＡでは、CLKがAND回路のみ適用される（CLKの立ち上がり時のみANDの結果が次のInputとなる）（のように見える）。コードＢでは、AND回路にもNOR回路にもCLKが適用されているようだ。

JKフリップフロップにCLKが入るのは左側のAND回路だけなので、コードＢのようにNOR回路にCLKが入ると、動作が期待どおりにならないのは当然、、、と思えるようになってきた。（コードＢでは、CLKの立ち上がり時のみに、すべての信号が変化している。）

また、回路図表示にて、コードＡでもコードＢでも、CLKの立ち上がり時に順番（Process文）に処理されているのかは、素人＆初心者にはよくわからず。というより、FPGA的には、そういった構文にすべきではないような気がする。

ソフトウェア視点があるとは言っても、FPGAでは、クロックに合わせた信号の変化を考慮して設計する必要がある、つまり、ハードウェアの資質がMustである、、と勝手に解釈。

## 次回
素人には、正直、あまり深堀りできず。とにかく、リアルFPGAボードで、VHDLで記述されたコードの動作を確認する。
Pushbullet + websocketsでリアルタイムに通知を受け取る

## 前提知識
### Pushbulletとは
複数デバイス間（PC・スマートフォン・タブレットetc）で情報を共有するためのアプリ。
Androidを使っている場合、端末間での通知のミラーリングに対応しています。

https://www.pushbullet.com/

### websocketとは

ざっくり言うとリアルタイム通信のためのプロトコルです。
こちらに詳しいです。

https://qiita.com/chihiro/items/9d280704c6eff8603389

## やったこと
Android端末上の通知を、Pushbullet APIを介してPythonスクリプトで取得します。
リアルタイムの通信手段としてwebsocketを使用するので、Pythonのライブラリ「websockets」を利用していきます。

https://websockets.readthedocs.io/en/stable/index.html

## サンプルコード

```python
import asyncio
import websockets
import json
import logging

# デバッグレベルのロガーを追加しておくと何かと助かります。必須ではないです。
logging.basicConfig(
    format="%(asctime)s %(message)s",
    level=logging.DEBUG,
)


async def process(msg):
    event = json.loads(msg)
    # Pushbulletから30秒に1回送信される {"type": "nop"} を無視
    if event.get("type", "nop") != "nop":
        p = event.get("push", {})
        title = p.get("title")
        body = p.get("body")
        app_name = p.get("application_name")
        print(title, body, app_name)


async def __main():
    async for websocket in websockets.connect("wss://stream.pushbullet.com/websocket/<KEY>",
                                              logger=logging.getLogger("websockets.server")):
        try:
            async for message in websocket:
                await process(message)
        except websockets.ConnectionClosed:
            continue


if __name__ == '__main__':
    asyncio.run(__main())
```

このスクリプトを実行しつつ、Pushbulletアプリで **「Mirroring」→「Send a test notification」** を押下すると、

![Screenshot_20220805-153251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189424/407fc870-a11e-964a-41fb-ecd0f06323b4.png)


```
Test notification If you see this on your computer, notification mirroring is working! Pushbullet
```

プッシュが受信され、このメッセージが吐き出されるはずです。
TypeScript で配列の中身の型を取得する Unwrap 型

# コード

```typescript
type Unwrap<T> = T extends { [K in keyof T]: infer U } ? U : never
```

## 使い方

```typescript
type HogeList = {
  id: number
  name: string
}[]

type FugaList = {
  id: number
  label: string
}[]

type Result = Unwrap<HogeList | FugaList> // ココ
```
↓ `Result` はこう解釈される
```typescript
type Result =
  | {
      id: number
      name: string
    }
  | {
      id: number
      label: string
    }
```

自動生成された型に含まれる配列を解体したい時とかに便利。
１２．最後に復習と補足


# ホスティングサービスのおさらい

[最初の頃に学びました](https://qiita.com/rougherina/items/e246fedf0e1f4b95c262)
GitHubにソースコードをアップしNetlifyに静的サイトとしてアップロードしました。

## GitHubとは

Gitの仕組みを利用して、世界中の人々が自分の作品(プログラムコードやデザインデータなど)を保存、公開できるようにしたウェブサービス

## Netlifyとは

似たようなサービスにVercel、Github Pages、Firebase Hostingがあります。
違いは無料枠での制限などいろいろあるかと思います。
データ容量、データベースが使用可能か、<font color="red">ソースからの自動デプロイがあるか</font>など
私は、簡単に利用できるということと<font color="red">ソースからの自動デプロイがある</font>ということで
勉強用にはNetlifyが使いやすいと思い選びました。

# デザインカンプ（Adobe XD）からのコーディング練習サイト紹介

デザインカンプはXD以外にもあるとは思います。
デザイン絡みの仕事をしたことが無いので分かりませんが、
Webシステム開発時に出会ったデザインカンプはXDでしたので、
XDからコーディングをしていくサイトとちょっとしたやり方を
少しだけ説明したいと思います。

[このサイトを使用します。](https://code-step.com/xd-public/)

# Googleアナリティクスの実際

実際のGoogleアナリティクスを見てみましょう。（一部）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/a2310a51-2e5a-ad7a-27d7-2c26ccea2de7.png)

7/9~8/5までの以下の内容が分かります。
- アクセスユーザ数
- ユーザの国
- どこからアクセスしてきたか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/b0030150-05bc-9cb2-7bd1-615ee8c7ac6f.png)

どのページにどのくらいアクセスしたか分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/c8a3d6c0-84b8-7194-4d1e-48a96ff9ede3.png)

アクセスしたユーザの国、市町村が分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/9e34f9e2-cbb6-102f-c23a-cab85b1192a7.png)

地域の集計です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/5da143fd-a119-99ed-06d9-ca4487b3df0c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/a07ce842-9b32-cd58-8df6-84b969a34693.png)

アクセスしたユーザのデバイス環境
- OS
- ブラウザの種類
- 画面サイズ
等が分かります。

<font color="red">これを元に</font>サイトの修正、最適化を行うといいかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/57d9bdc4-3b04-f1d2-e24c-8518b322cd7d.png)
平均エンゲージメント時間が分かります。
平均エンゲージメント時間は「ユーザーがサイトやアプリを実際に見ていた・使用していた時間」のことです。

[現在使用しているUniversal Analiticsは2023.07に終了となるようです。](https://www.tribeck.jp/column/opinion/marketing/20220323/)
Googleアナリティクス4が主流になるようです。導入方法を調査しておいた方がよさそうですね。

現在のアナリティクスからGA4への移行は[こちらなど](https://qiita.com/ran/items/78abe31b5969d9c30466)、ググればたくさんでてきます。
私も実際に試しましたが、ちょっとややこしかったです。

# CSS単位

リキッドレイアウト、フレキシブルレイアウトとも絡みますが、
[vw](https://qiita.com/yokowake12345/items/f94ce43e9fd9b8637543)は非常にレスポンシブにおいて便利です。

[新しい単位](
https://coliss.com/articles/build-websites/operation/css/large-small-dynamic-viewports.html#:~:text=%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%82%8B%20%7C%20%E3%82%B3%E3%83%AA%E3%82%B9-,CSS%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E5%8D%98%E4%BD%8D%E3%80%8Clvh%E3%80%8D%E3%80%8Csvh%E3%80%8D%E3%81%93%E3%82%8C%E3%81%A7,%E3%81%AA%E3%81%84%E4%BB%95%E6%A7%98%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%8D%E3%82%8B&text=Safari%2015.4%EF%BC%88%E6%9C%80%E6%96%B0%E3%81%AF15.5,%E3%81%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)についても目を通しておいてください。

# 復習（レスポンシブ）

https://qiita.com/rougherina/private/6b85cd2b2f5ba18de67a

# 資格の紹介

[Webクリエイター能力認定](https://www.sikaku.gr.jp/web/wc/)
[Webデザイナ検定試験](https://www.cgarts.or.jp/kentei/about/web/)
[HTML5プロフェッショナル認定資格](https://html5exam.jp/)
2022/8/6主にITとかセキュリティの記事

2021年に観測が多かったマルウェア、大半が5年以上活動 - ランサム感染にも関与
https://www.security-next.com/138689

F5、8月のセキュリティパッチを公開 - 「BIG-IP」などの脆弱性に対処
https://www.security-next.com/138686

サポート終了も1割強が業務でIE利用 - 35％はEdgeのIEモード
https://www.security-next.com/138703

カスペルスキーのVPN製品に権限昇格の脆弱性
https://www.security-next.com/138707

「DIY FACTORY Business」に不正アクセス、偽のクレジットカード情報入力ページに意図的に誘導(8/4)
https://scan.netsecurity.ne.jp/article/2022/08/04/48008.html

2020-22年のNFT盗難被害総額 = 1200億円【調査レポート】(8/4)
https://crypto-times.jp/nft-total-damage/

チェックポイント、第2四半期のなりすましブランドランキングを発表　今回もLinkedInが第1位(8/4)
https://enterprisezine.jp/news/detail/16433

台湾の国防部HPがサイバー攻撃受けアクセス不能　「ハクティビスト」か(8/4)
https://news.tv-asahi.co.jp/news_international/articles/000263948.html

北朝鮮発のサイバー攻撃に、企業はどうすればいいのか(8/4)
https://news.nicovideo.jp/watch/nw11256799

3万5,000超のGithubリポジトリに悪意あるコード、Githubにサプライチェーン攻撃(8/4)
https://news.mynavi.jp/techplus/article/20220804-2416046/

日本におけるサプライチェーン セキュリティインシデント調査レポート「サプライチェーンリスクジャパンレポート2022」を公開(8/4)
https://www.jiji.com/jc/article?k=000000013.000059751&g=prt

Jenkins（ジェンキンス）とは？　【ITワード365】標的型攻撃メール／Google Workspace／Windows Hello／ワンタイムパスワード／ICT／アクセシビリティー
ITワード365(8/4)
https://atmarkit.itmedia.co.jp/ait/articles/2208/04/news014.html

ガートナー、IT調達における「地政学リスク」の重大な影響への見解発表 コスト・データ保護などへ影響(8/4)
https://bizzine.jp/article/detail/8003

NordVPN: 4人に1人が休暇移動中にハッキング被害に合っているという事実(8/4)
https://jp.acrofan.com/detail.php?number=99909

RSS3 Coin (RSS3) トークン、RSSHub プロジェクト、プロトコル、SocialFi とは(8/3)
https://portalcripto.com.br/ja/rss3-%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%AF-rss3-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88-rsshub-%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A8-socialfi/

スマホやPCの紛失・盗難でデータ漏洩、悪夢を避けるためにすべきことは？(8/4)
https://news.mynavi.jp/techplus/article/20220804-2416292/

Google、log4j に関するレポートを受け、オープンソース セキュリティの改善を求める CSRB の呼びかけを支持(8/4)
https://cloud.google.com/blog/ja/products/identity-security/google-supports-csrb-call-improve-open-source-security

新しくネットサービスを始めるハードル(8/4)
https://note.com/ganbaranzo/n/n956ed5ce7e43

マイクロソフト、クラウドのサーバーの耐用年数を2年伸ばし数十億ドルを節約(8/4)
https://www.axion.zone/29716/

政令市の4割が委託先調査に乗り出す、尼崎市のUSBメモリー紛失に危機感(8/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00989/080300091/

AWSの全資格を取得した基盤エンジニア、「突き詰める力」で道を切り開く(8/5)
https://xtech.nikkei.com/atcl/nxt/column/18/02142/080300007/

ゼロトラストの新機軸、アカマイが参入する「マイクロセグメンテーション」の威力(8/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07063/
逆にnext.jsをやめた話

# はじめに

プロダクトの要件的にSSRは要らないよねという判断でnext.jsをやめSPAとして再構築しました。next.js自体のノウハウやSPAからnext.jsへの移行みたいな記事はよく見るのですが、逆にやめた話は管見の限り(よく調べていないという意味で使っています)、目にした記憶が無いので書く価値があるかなと思いました。決定の経緯や実際の移行に際しての手順などについて書こうと思います。
これがベストプラクティスと主張するつもりはなく、むしろ泥臭くコードを直していっているのでこうすると楽だよというノウハウがあればご教授いただけると嬉しいです。

# 経緯

## すでに簡単に機能が作ってあるプロジェクトに参画

配属された時点ですでにプロジェクトは走り始めており、ある程度の画面や機能が作られていました。next.jsを利用し、バックエンドはfirebaseのauthenticationやfirestoreを利用する構成でした。

## SDK使いたいので検討

既存のコードを改修していたところ、不便さを感じるようになりました。firebaseのリソースを操作する際、プロジェクトの要件的な部分やWeb以外の他チャネルとの兼ね合いから独自に実装したAPIを経由してfirestoreを操作する構成を取っていました。しかし、このAPIが他チャネル用の要件に従って実装されており、Web的には困ることがあります。一方でWebのチャネルのために改修を入れていくとAPI仕様が次々と複雑化していくことが目に見えて明らかでした。
そこでWebのクライアントはsdkを利用しつつ要件を実現できないか検討を進めました。結果、sdk利用でも良いだろうという結論にいたり、既存のコードをsdkで代替するように改修を進めました。

## SSRでfirebaseを利用しようとすると結構面倒

しかしながら、課題に直面しました。SSRは語義の通りサーバサイドでレンダリングするため、初期化関連で考慮が必要になります。例えば、クライアント側で認証をしていてもサーバ側は認証されていないので認証エラーになります。SPAと同じノリで実装はできないということです。SSR時はサーバ想定でfirebase-adminを使う、CSRする部分ではfirebase-sdkを使うという形で考慮が必要になります。

参考：
https://qiita.com/centerfield77/items/799f2840f48221c2f84d

next.jsのまま、firesbaseを利用しようとすると、この辺の考慮を強いられるということです。

## という課題について考えていたときに、SSR自体要らないのでは？という話に

一般にSSRのメリットとしては、
1. サーバサイドでレンダリングするので初期表示が早く安定する
1. SEOに強い

という点などが挙げられると思います。ですが、要件的にこれらの強みは特に必要ないだろうという結論にいたりました。
今後もSSRを利用しているために別途考慮が必要な点が出てくる可能性があるだろうということが予想され、作り込まれている機能の量も限られていたのでSPAに置き換えようという結論にいたりました。

このあたりは私はそもそもSSRでの開発経験に乏しいので、経験を積んでいる人が考えた場合には、異なる判断をした可能性があると思います。

# 移行

以下、移行の際にやったことです。

## 一旦全部消す

最新のmainブランチから切り出した作業ブランチにて、一旦プロジェクトの中身を一通り削除しました。残しつつ置き換えていくと中途半端な状態が続き苦労しそうだなと思ってのことです。git管理しているのですぐ復元できますし。

## viteで初期化する

CRAとかsnowpackとか他にも色々ありますが、今回はviteを採用しました。一度viteの速さを知ってしまうとやめられないですよね。

## 既存で利用されている各種ライブラリを追加する

next.jsに関わりなく、機能を提供する上で必要なライブラリ類を`yarn add`しました。

## 代替するライブラリを追加する

next.jsの機能で提供される機能やサーバサイドで動く前提のライブラリを置き換えました。例えば、以下のようなものです。

### ルーティング

`react-router-dom`です。v6は使ったことがなかったのでこの際、使ってみようと思いました。今のところ快適です。

### jwtのデコード

アプリケーションにはJWTをデコードする処理があるのですが、`jsonwebtoken`はnode環境で動く想定で、webだと動きません。`jwt-decode`に置き換えました。機能が増えていくにつれこうした考慮が増えそうな予感がしました。

## 順番にrestoreして置き直していく

### そもそもreact非依存なものたちを復活する

githubのワークフローやhuskyのスクリプトなどは基本的にそのまま使える(中身のコマンドは置き換わってますが)のでそのまま復活します。他そのまま流用できるものなどをrestoreしていきました。componentもそのまま利用できるものは様子を見つつrestoreしていきます。

### 修正が必要なものを直していく

一方で、next.jsのpages/配下のファイルなどはディレクトリ構成がそのままルーティングに利用されるなどしているので、修正が必要です。基本の構成は変えずに`Router.tsx`のようなファイルを作り、ルーティングさせるようにコードを書いていきました。この際、`React.lazy`でコード分割するなどの最低限の調整は行いました。

### 動作確認

最後に一通り動作確認して終了です。

# 終わりに

今回は逆にnext.jsをやめた話について、その経緯と移行について書きました。要件や限られた時間での調査の範囲から上記のような結論にいたりましたが、そもそもの構築初期から参画していたり、もっとNextJSの開発経験や知識があると違った判断をしていた可能性があるという気もしています。このあたりは今後も手広く経験や知識を深めつつ、その時その時の最善の技術選定ができるようになりたいなと思います。
LightSail上に構築したWordPressのSSL証明書を更新する

## 役に立つ対象の方
+ LightSail上にWordPressを構築した方でSSLの証明書が切れてしまった方

## できるようになること
+ SSLの証明書を更新できるようになる

## SSL更新の手順

1.LightSailの管理画面からターミナルを開く
＊黄色にハイライトされたアイコンから開けます。
![スクリーンショット 2022-08-06 015858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442933/baf3fd6b-130e-b7c3-91a0-74da5389d256.png)

2.下記のコマンドを入力する
~~~
sudo /opt/bitnami/bncert-tool
~~~
3.下記の質問で自身のサイトのドメインを入力する。
＊例えば"qiita.com"など設定しているドメインを入力する。
~~~
// 有効なドメイン名を設定して下さい。
Please provide a valid space-separated list of domains for which you wish to 
configure your web server.
Domain list []: qiita.com
~~~
4.内容に問題がなければYesを回答する
~~~
// 以下のドメインに含まれていません。それを追加してもいいですか？
The following domains were not included: www.qiita.com. Do you want to add them? 
[Y/n]: Y
~~~
5.下記の質問にそれぞれ返答する
~~~
Enable/disable redirections

Please select the redirections you wish to enable or disable on your Bitnami 
installation.

// HTTPでアクセスされた場合HTTPSへリダイレクトさせますか？
Enable HTTP to HTTPS redirection [Y/n]: Y
// wwwなしでアクセスされた場合wwwへリダイレクトさせますか？
Enable non-www to www redirection [Y/n]: Y
// wwwでアクセスされた場合wwwなしへリダイレクトさせますか？
Enable www to non-www redirection [y/N]: n
~~~
6.規約に同意する
~~~
Changes to perform

The following changes will be performed to your Bitnami installation:

1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains: 
echiechimykano.com www.echiechimykano.com
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: www.echiechimykano.com
5. Enable HTTP to HTTPS redirection (example: redirect http://echiechimykano.com 
to https://echiechimykano.com)
6. Enable non-www to www redirection (example: redirect echiechimykano.com to 
www.echiechimykano.com)
7. Start web server once all changes have been performed

// 規約に同意してくれますか？
Do you agree to these changes? [Y/n]: Y
~~~


## 更新完了
Successが表示されれば更新が完了しました。
自身のWebサイトにアクセスしてSSLの証明書が更新されていることを確認してください。
PowerAutomate - Plannerでチームメンバー全員のプランを作成する 

**あんこ先生リスペクト!!**
[PowerApps│Plannerと連動したタスク管理アプリの作り方](https://anko7793.com/2022/03/1005/)

# 概要
こちらのアプリを導入する際に、グループ全員のプランを新しく作成した上で、アプリへ登録するための関数を作成します。

チームの人数が多いと、プランを人数分用意するだけでも結構な手間になるので、そのあたりをAutomateで自動化してみました。

フローの全体図は以下の通りです。
<details><summary>フローの全様</summary>

![フロー全様.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/41f3d533-518c-29b0-f68c-83cced7705a6.png)

</details>



# 使い方
環境によって修正が必要な個所は「グループ メンバーの一覧表示」アクションのグループIDのみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/7d14f30f-6078-353f-2656-577d9025b87e.png)

実行するとプランが作成され、OutputとしてAppsに登録するための関数が作成されます。(実行履歴からコピペして使用できます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/78cc4cb7-424b-08e4-5540-53f14dfced46.png)


# ポイント

- Plannerの標準アクションではプランの作成ができないので、Graph APIを使用しています。
- グループIDの入力が1ヵ所で済むように、actionのInputを取得しています。
- プランの作成時にはバケットが存在しないので、適当なバケットを新規作成して取得しています。


# おわりに
今回は初投稿ということで、申し訳ないですが細かい解説は割愛させていただきます。
エクスポートファイルを[github](https://github.com/ksgiksg/Power-Automate/blob/main/メンバー全員のプランを作成_20220805164231.zip)に保存してみたので気になる方は使ってみてください。

(githubも初めて触ったので不具合あれば教えてください…)
【読書メモ】現場で役立つシステム設計の原則


書籍「[現場で役立つシステム設計の原則](https://amzn.to/3zZpLso "Amazon")」 の読書メモ
 
## 第5章　アプリケーション機能を組み立てる
- リポジトリのメソッド名、引数、返す値は、すべて業務用語で表現する
- リポジトリを使った業務データの操作は、データベースの操作ではなく、業務の関心事としてとらえる

## 第6章　データベースの設計とドメインオブジェクト
- テーブル設計の基本は3つの制約
    - NOT NULL制約
    - 一意制約
    - 外部キー制約
- まずカラムをすべてNOT NULL制約にし、どうしてもNULL値が必要な場合は別テーブルに分けることを検討する
- 「コト」の記録を徹底する
- UPDATE文はデータの不整合が混入しやすいので使わない

## 第7章　画面とドメインオブジェクトの設計を連動させる
- なんでも画面はわかりにくい
- 画面はアプリケーションに複雑さ持ち込む（画面表示ロジックと業務ルールの混在）
- 用途ごとのシンプルな画面設計が重要
- 利用者の関心事に焦点を当てると、タスクごとの画面に分けやすい
- 画面を表示するロジックにif文が入り始めたら要注意。　ドメインオブジェクトに書くべきロジックの可能性がある。
ファイルの場所を示す方法

補助記憶の中にファイルやディレクトリがたくさんある。それに名前がある。
しかし名前があってもどこにあるのかわからない。
なのでファイルの場所を示さなければならない。

# パス
ファイルまでの場所を指し示す経路
これを使い、ファイルの位置を知ることができる。

## 絶対パス
ルートディレクトリからの経路を書き記す

## 相対パス
カレントディレクトリから経路を書き記す

# 絶対パスの表記方法
パスを書く上でルールがある。
* ルートディレクトリは```/```または```¥```で表す。
* ディレクトリと次の階層の間は```/```または```¥````で区切る。
* カレントディレクトいは```.```で表す。
* 親ディレクトリは```..```で表す。

p２７７の図の通り```/DIR-A2/FILE-B2```となる。
最初の```/```はルートディレクトリ
２番目はファイル名
３番目の```/```はディクトリと次の階層の間を区切るため
4番目はファイル名

この４番目ファイル名を探していることに気がつく。


## 気づき
最初の```/```は、ルートディレクトリを指すのか忘れないように気をつけよう。

# 相対パスの表記方法
これにもルールがある。
* ルートディレクトリは```/```または```¥```で表す。
* ディレクトリと次の階層との間は```/```または```¥```で区切る。
* カレントディレクトリは```.```で表す。
* 親ディレクトリは```..```で表す。

自分が今どのディレクトリにいるかを基準とする。
自分がいる位置からの道順を書き記します。

## 気づき
```.```を書けば今の位置のディレクトリ（カレンとディレクトリ）を表すのか。
```..```を書けば親ディレクトリを指して一階層上のディレクトリを指すのか。
ディレクトリ名を記述するとそのディレクトリを開くことができるのか。

# パスの訳
```./DIR-B1/FILE-C1```は
*　```.```でカレントディレクトリを指す
*　```DIR-B1```で開きたいディレクトリを開く
*　```FILE-C1```は取り出したいファイル名をとる。

```./../DIR-A2/FILE-B2```は
* ```..```でカレントディレクトリの親ディレクトリを指す。

## 気づき
```..```を使うことで階層を上がって指定することができるのか。
便利だな。

# 問題を解いた時の気づき
## カレントディレクトリを調べる問題
* 問題文を解読を十分に解読できなかった。
* 矢印で自動で位置が引き継がれると思っていた。
* しっかり一箇所ずつでカレントディレクトや親ディレクトリの指定をしていた。
* やっぱり　問題文が複雑でわかりにくいな。
* 読解力がないな。
* ```.¥```と```¥```の違いを理解しないといけなかった。
恥ずかしい間違い集

# 0805リモートデスクトップのデータ移動
リモートデスクトップの中で作ったデータはコピーしてペーストではローカル(自分のPC)に落とせない。リモートデスクトップ内で自分のPCにデータをドラッグ&ドロップする。
# 0805パレート解
パレート解はトレードオフしているものの場合どちらかを優先するようになるので、理論的に両方の要素が平均以上になるものは存在しえない
ex)エネルギー密度とサイクル特性の両方が平均以上の値を示すものは存在しない
# 0810ssh接続
ssh接続している時は、ローカルで編集したファイル(excelなど)をVSC上にドロップして上げなおさないと更新されない。何度コードを回してもファイルが更新されないままだと意味がない。
# 0810interactivewindow
インタラクティブウィンドウにimportだけでててもコードが回っていないことがある。ファイルを生成するコードの場合は都度新しい名前を付けるようなコードにしておくか、ローカルに落としてVSCでは削除する、などコードが動いているかウィンドウ以外でも確認できるようにする。動いていなかったらウィンドウを再起動するだけで直ることもある
音階波形の生成

# 環境
Unity2021.3.4f1

# 概要
プロシージャルに音階の波形を生成して、かえるのうたを流してみました。
このままだとノイズがひどいので、AudioMixerを作成してLowpassフィルタを追加して値調整するとノイズが軽減されます。

OnAudioFilterReadはAudioスレッドから呼ばれています。
AudioSourceにAudioClipを設定しなくても、第１引数のdataに値を設定するとその音が鳴ります。

[ここ](https://kenken5050.hatenablog.com/entry/2022/08/05/205318)に全コード記載しています。
```c#
private void OnAudioFilterRead(float[] data, int channels)
{
    ...
    for (int i = 0; i< data.Length; i++)
    {
        float time = begin + (float)currentSampleIndex / _outputSampleRate;
        data[i] = volume * Mathf.Sin(2.0f * Mathf.PI * time * note.tone);
        currentSampleIndex++;
        if (channels == 2)
        {
            data[i + 1] = data[i];
            i++;
        }
    }
}
```
# 参考

https://tomari.org/main/java/oto.html
https://fabeee.co.jp/column/employee-blog/sugichan02/
Cloudflare の IP を判定するコマンド

# 概要

対象のドメインが Cloudflare を使っているかを判定して、
Cloudflare を使っていた場合には、その Cloudflare IP を返すコマンドを関数定義とエイリアスで作ります。

# `grepcidr` インストール

macOS では `brew` でインストールできます。

```shell
brew install grepcidr
```

# `grepcidr`  使い方

入力が IP レンジ内であれば、該当する IP を返します。なければ何も返しません。

```shell
% grepcidr 104.16.0.0/13 <(echo "104.17.110.184")
104.17.110.184
% grepcidr 104.16.0.0/13 <(echo "192.168.1.1") 

```

# Cloudflare IP の該当確認

[IP Ranges | Cloudflare](https://www.cloudflare.com/ips/) で公開されている IP レンジに関して、確認するには以下のコマンドになります。

```shell
% grepcidr "$(curl -fsSL https://www.cloudflare.com/ips-v4) $(curl -fsSL https://www.cloudflare.com/ips-v6)" <(echo "172.70.49.134")
172.70.49.134
```

# 関数定義とエイリアス


名前解決の結果得られる IP アドレスを元にしたコマンドを `~/.zshrc` に関数で定義し、エイリアスを設定します。

```shell:~/.zshrc
function checkcfip() {
    value=$(grepcidr "$(curl -fsSL https://www.cloudflare.com/ips-v4) $(curl -fsSL https://www.cloudflare.com/ips-v6)" <(echo "$(dig $1 +short A)\n$(dig $1 +short AAAA)"))
    if [ -z "$value" ] 
    then echo "not found"
    else echo $value
    fi
}
alias checkcfip=checkcfip
```

現在のターミナルセッションに設定を反映するには、以下のコマンドを実行します。

```shell
source ~/.zshrc 
```

# `checkcfip` コマンド確認

```shell
% checkcfip dash.cloudflare.com
104.17.110.184
104.17.111.184
2606:4700::6811:6eb8
2606:4700::6811:6fb8
```

```shell
% checkcfip blog.cloudflare.com
104.18.41.174
172.64.146.82
2606:4700:4400::6812:29ae
2606:4700:4400::ac40:9252
```

```shell
% checkcfip google.com         
not found
```

# 参考

- [grepcidr — Homebrew Formulae](https://formulae.brew.sh/formula/grepcidr)
- [shell script - Check IP is in Range of Whitelist Array - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/274330/check-ip-is-in-range-of-whitelist-array/274343)
- [IP Ranges | Cloudflare](https://www.cloudflare.com/ips/)
実名を公開したくない

# はじめに

XcodeのプロジェクトをGithubにプッシュしようとしたら、プロジェクトに自分の氏名が含まれているではありませんか！
私はインターネット上に自分の名前が出ることを避けたい部類の人種なので、これは排除しなければならないと思いました。

# 環境

macOS 12.5
Xcode 13.4

# ソースファイルのヘッダ

ソースファイルを作成すると、先頭に自動的に著名のコメントが挿入されます。
この「Created by (名前)」の部分を変える方法は以下の通りです。

1 `IDETemplateMacros.plist`というファイルを以下の内容で作成する。

``` xml:IDETemplateMacros.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>FILEHEADER</key>
    <string>
//  ___FILENAME___
//  ___TARGETNAME___
//  
//  Created by (ここに表示される名前) on ___DATE___
//  ___COPYRIGHT___
//</string>
</dict>
</plist>
```

2 `~/Library/Developer/Xcode/UserData/`に配置する。

これによって、新しく作成されるソースファイルに追加される名前が更新されます。

# xcuserdata

プロジェクトの`.xcodeproj`パッケージの中には`xcuserdata`というフォルダがあり、この直下にはmacのユーザアカウント名が含まれたフォルダが生成されます。
この名前を変更するにはアカウント名を変更する以外に方法が見つからなかったので、諦めてリポジトリに含めないようにします。

具体的には`.xcodeproj`と同じフォルダの`.gitignore`（なければ作成）に以下を追加します。

``` .gitignore
xcuserdata
```

# 参照

https://mst335.hatenablog.com/entry/2020/08/15/134220
【Python】フォルダ内ファイルを一括削除する方法

会社業務で提出物を一括ダウンロードするツールを作成しており、
古いファイルが邪魔でダウンロードフォルダからワークフォルダに移動時にエラーが
でたので、その対応で古いファイルがあったら削除する処理を作成しましたので、
ここにまとめます。

## 処理内容

1. ワークフォルダを確認
2. ファイルが存在したら削除

## 1, ワークフォルダを確認

今回使うモジュールは、pathlibです。
ファイル削除だけでなく、ディレクトリ作成、削除などもできるので、
OS処理をPythonで実行するならpathlibを使用するのが良いかと。

osでも良いかと思いますがPython3で書くならpathlibかと。

```python
import pathlib

check_dir = pathlib.Path("対象フォルダパス") # 対象フォルダパスを変数に格納
for file in check_dir.iterdir():  # check_dir内をlsして1ファイルずつファイル名を取得
    print(file.name)

```

上記で対象フォルダ内にある不要ファイル名を取得します。

## 2, ファイルが存在したら削除

ファイルはunlink()で削除します。しかし、フォルダも存在する場合はエラーとなってしまうため、is_file()でファイルの場合は削除する処理にします。

```python
import pathlib

check_dir = pathlib.Path("対象フォルダパス") # 対象フォルダパスを変数に格納
for file in check_dir.iterdir():  # check_dir内をlsして1ファイルずつファイル名を取得
    if file.is_file()   # もしファイルなら次の処理に進む
        file.unlink()   #  ファイルを削除する
```

## 最後に

pathlibはデフォルトで入っているモジュールのため、pipでインストールは不要です。
今回は自社業務用で自分のPCで作業するようで作りましたが、
現場でpythonが入っているサーバーを使用する時に使えそうだなと思いました。

特に現場だとインターネットに接続できなくて、pipインストールができない場所のあるので、、、
PHP  正規表現　まとめ

PHPの学習を始めました。

正規表現をいつでも思い出せるよう、簡単に纏めます。

備忘録。

## 関数と処理内容

| 　関数　　　| 処理 　　|
| ---- | ---- |
|  preg_match()  |  正規表現による検索を行い、最初に一致した文字列を取得  |
|  preg_match_all() |  正規表現による検索を行い、一致した文字列をすべて取得す |
|  preg_replace()  |  正規表現による検索を行い、一致した文字列を他の文字列に置換 |
|  preg_grep()  |  配列に対して正規表現による検索を行い、一致した要素を配列で返却  |


## 検索方法と書き方、意味
|　　 検索方法　　　| 　　書き方　　| 　　　意味　　　 |
| --- | --- | --- |
| 部分一致 | 	/文字列/ | 	/Orange/（「Orange」が含まれているかどうか） |
| 前方一致 | 	/^文字列/ | 	/^090/（「090」で始まっているかどうか） |
| 後方一致 | /文字列$/ | 	/。$/（「。」で終わっているかどうか） |
| 完全一致 | 	/\A文字列\z/ | 	/\A侍太郎\z/（「侍太郎」と完全に一致しているかどうか） |
| または | ` | 	` |
| 小文字のアルファベット | [a-z] | 	/[a-z]/（小文字が含まれているかどうか） |
| 大文字のアルファベット | [A-Z] | 	/^[A-Z]/（大文字で始まっているかどうか） |
| 数字 | [0-9] | 	/[0-9]$/（数字で終わっているかどうか） |
| 英数字 | [a-zA-Z0-9] | 	/\A[a-zA-Z0-9]\z/（英数字と完全に一致しているかどうか） |
| 改行以外のすべての文字 | . | 	/.+/（改行以外の1文字以上の文字が含まれているかどうか） |
| 0回以上の繰り返し | * | 	/\Aあ.*り$\z/（「あ」で始まって「り」で終わる文字列と完全に一致しているかどうか） |
| 1回以上の繰り返し | + | 	/[a-zA-Z0-9]+/（1文字以上の英数字が含まれているかどうか） |
| n回の繰り返し | {n} | /[0-9]{4}/（4桁の数字が含まれているかどうか） |
| グループ化 | () | 	(○○○)-(●●●●)-(■■■■)＝$1-$2-$3 |


## 後書き
覚えなくてもいいけど、やっぱろ、サッと書けるとかっこいい、、、
ログインとか登録フォームとか、いろんな場面で使うから使い慣れておこうと思います。
IoT事始めM5stack＆STM32Discovery


### UIFlow-Desktop-IDE　子供達には、良いですね！
　65歳おじいさんにも💦　良いかも！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/6551214d-831c-df37-54f9-8f97ef2d6659.png)

### M5stack 左-UIFlowで簡単温度湿度気圧表示　
右-Wifi接続-温度＆湿度（Arduino-IDE）
下　STM32L4 Discovery Kit IoT で 温度＆湿度表示 今後Amazon-FreeRTOSでの試験予定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/32160eb1-f8d5-3612-54bf-fe6a0c6673eb.png)

### UIFlow-Desktop-IDEは　
画面＆シリーズのセンサーを接続すれば簡単プログラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/a9f5f698-08c2-e34b-e8a3-bf6a45037fa8.png)

### 次の課題は　Amazon FreeRTOS を STM32L4 Discovery で試験予定です。

参考サイト　

http://www.openspc2.org/reibun/M5/UI-Flow/1.2.3/Units/env/0001/index.html

https://qiita.com/yankee/items/f1e1fd47a1a3e83501e4

https://qiita.com/imagou/items/428a362d06d7ca401930

https://flogics.com/wp/ja/2018/05/evaluating-amazonfreertos-on-stm32/

https://twitter.com/tkurume/status/1548891669378248704/photo/1

#### tuyaも進めます

https://iot.tuya.com/

https://qiita.com/search?q=tuya
Excel VBAでSeleniumもWebDriverもVBA-JSONも使わないでクロームとエッジを操作するインストール不要のライブラリっぽいものつくってみた　

https://qiita.com/kabkabkab/items/d65aef219b14ca44c25c

上記の記事を投稿後、実装を続け、
基本的なDom操作ができるようなライブラリっぽいものを作ってみました。
またChromeだけでなく、Edgeも操作できるようにしてみました。

<h1>概要

以下、Githubのリポジトリのクラスを全てマクロファイルにインポートしていただければ、
Seleniumのような感じで使用することができます。
（インストール不要）

https://github.com/24000/ChromeControler-No-Selenium-WebDriver-VBAJSON/tree/master

<br>

<h1>2023/12/22追記

具体的な導入方法や使用例を以下記事でご紹介いただきました！

https://qiita.com/yaju/items/0807cc762af4a0568806

<br>

<h1>使用例

以下、Wikiにて紹介しています。
https://github.com/24000/ChromeControler-No-Selenium-WebDriver-VBAJSON/wiki/%E4%BD%BF%E7%94%A8%E4%BE%8B


<h1>メソッド実装状況

以下、Wikiにて紹介しています。
https://github.com/24000/ChromeControler-No-Selenium-WebDriver-VBAJSON/wiki/%E5%AE%9F%E8%A3%85%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6



<h1>最後に

　何かダメっぽいところを見つけた方や、
　より詳しい情報を持っている方がいたら教えていただけると嬉しいです。