OmniAICreator/Qiita-1.07M huggingface dataset:
twin.macro を使用して親要素ホバー時に子要素を変化させたい

# はじめに

初めてtailwindcssをベースのtwin.macroを使用する案件にて、親要素ホバー時に子要素を変化させる方法がわからなかったので調べて実装した備忘録です。

私が探した時点（2022.08）では、日本語で解説してくれている記事を見つけることができなかったので、参考になれば嬉しいです。


# 最初に
twin.macroとは？
twin.macroの使用方法は？
等の記事はたくさんありますので、敢えて記述しません。


：参考

https://www.luku.work/twin-macro-first




注意：tailwindcssにgroupというのがあり、twin.macroのtwの記述ではなく、classNameにgroupを追記すれば、子要素を操作することも可能です。

https://zenn.dev/ilove/articles/f501e24a0a12a8

今回は、classにはCSS関係の記述はしない方針の案件でしたので、別の方法を探した経緯があります。


# 結論
twin.macroには便利なcssプロパティというものがあります。
そちらを使用すると、SCSS的な記述ができるようでした！

```typescript:index.ts
export default function SignoutButton() {
  return (
    <button
      onClick={() => { 何かの処理 }}
      tw="text-gray-500 hover:(text-green-800)"
      css={[
        css`
          &:hover {
            > span {
              font-weight: bold;
            }
          }
        `,
      ]}
    >
      <span
        tw="font-normal text-center mt-1.5"
      >
        サインアウト
      </span>
    </button>
  )
}


```

cssプロパティーは

```
css={[
        css`
          cssを書ける          
        `,
      ]}

```

のような形で、tailwindcssでは足りない細かな設定をする際にcssを記述することができます。
そこは、SCSS記法での記述できるということが分かりました！

```
css={[
        css`
          &:hover {
           ホバーした際の処理を記述
          }
        `,
      ]}


```

上記でホバー時の記述が書けます。
そこで、SCSSを使用し、子要素を指定し、子要素に対するCSSを書く感じです。

```
 css={[
        css`
          &:hover {
            > span {
              font-weight: bold;
            }
          }
        `,
      ]}

```

上記の意味はbutton要素がホバー時にbutton要素直下にある子要素spanに対してフォントをボールドにさせる

という意味になります！


ちなみに、cssプロパティーには擬似要素の記述のできます。

```
   <div
    tw="relative"
    css={[
      css`
        &::after {
          content: '';
          display: inline-block;
          background-color: #fff;
          width: 28px;
          height: 5px;
          position: absolute;
          left: 50%;
          transform: translateX(-50%);
          bottom: 0;
        }
      `,
    ]}
  >

```


以上です。
VSCode上でのPRレビューを使いやすくする

## はじめに

最近、 VSCode 上でマルチラインコメントが使えるようになりました 🎉
これを機に、Github 上で行っていたレビューを VSCode に一本化したいなーと思った次第です。
ただ、標準の差分エディターの背景色が見づらいので、いい感じにカスタマイズしてみました。

## 前提

- VSCode に [Github 拡張機能](https://code.visualstudio.com/blogs/2018/09/10/introducing-github-pullrequests)がインストール済み

## マルチラインコメント機能

これは、Github UI 上で実装されている複数ラインに対してコメントを追加することができる機能です。（[サンプルコードの元](https://qiita.com/shoot16625/items/0539563346e44501250c)）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/112a7b4f-9bd2-1ddc-2f58-31040f30700e.png)

この機能が最近 VSCode でも使えるようになりました。
この機能に関する [Issue](https://github.com/microsoft/vscode-pull-request-github/issues/1376) は約 3 年前に起票されており、ついに実装が完了したようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/47f4656e-9fa2-598a-fd56-bc0fc32f3ce5.png)

画像のように、VSCode からでも UI 上と同じ操作感でマルチラインコメントを追加することができます。
この機能が実装されたことで VSCode 上でのレビューが格段に行いやすくなりました。

## 差分エディターの背景色をカスタマイズする

VSCode のデフォルトの背景色はこんな感じです。
個人的に、色調が強く目が疲れる配色です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/ab41e4e2-8aa8-6ed7-78d7-b3774e511684.png)

こちらに関して、背景色のカスタマイズに関する [Issue](https://github.com/microsoft/vscode/issues/103207) が挙がっており、わりと最近対応されたようです。
VSCode の settings.json に以下の設定を追加すれば、背景色のカスタマイズが可能になります。Issue 上でコメントされている配色例と使用イメージがこちらです。

```json
"workbench.colorCustomizations": {
    "diffEditor.insertedTextBackground": "#00ff007c",
    "diffEditor.removedTextBackground": "#ff00007c",

    "diffEditor.insertedLineBackground": "#22336866",
    "diffEditor.removedLineBackground": "#72336a66",

    "diffEditorGutter.insertedLineBackground": "#223368ff",
    "diffEditorGutter.removedLineBackground": "#72336aff",

    "diffEditorOverview.insertedForeground": "#02b40b",
    "diffEditorOverview.removedForeground": "#a10000"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/d671c748-e331-9d1e-1a1a-0580969a3f8f.png)


さらに、個人用に試行錯誤を試した結果の配色がこちらになります。

```json
"workbench.colorCustomizations": {
    "diffEditor.insertedTextBackground": "#090b12",
    "diffEditor.removedTextBackground": "#b205b57c",

    "diffEditor.insertedLineBackground": "#22336866",
    "diffEditor.removedLineBackground": "#72336a66",

    "diffEditorGutter.insertedLineBackground": "#223368ff",
    "diffEditorGutter.removedLineBackground": "#72336aff",

    "diffEditorOverview.insertedForeground": "#0296b4",
    "diffEditorOverview.removedForeground": "#82059e"
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/1af0165c-53d4-7f40-5485-ccedb40ee6c6.png)

## おわりに

これで、快適レビューライフをおくることができますね✨
MicroPythonでGoogle Homeを喋らせる【Raspberry Pi Pico W】

[PyChromecast](https://github.com/home-assistant-libs/pychromecast)が動かなかったので作ってみました。

https://github.com/GitHub30/pichromecast
# 使い方

```python
from pichromecast import play_url

play_url('https://nyanpass.com/nyanpass.mp3', '192.168.10.101')
```

音声合成
```python
from pichromecast import play_url, create_url

play_url(create_url('hello world', 'en'), '192.168.10.101')
```

```python
# https://gist.github.com/SpotlightKid/eca9b00239104e8c599b86635f62ab73#file-urlencode-py
from urlencode import urlencode
from pichromecast import play_url

url = 'https://translate.google.com/translate_tts?client=tw-ob&' + urlencode({'q': 'Hello, 世界', 'tl': 'ja'})
play_url(url, '192.168.10.101')
```

# インストール
`Tools` > `Manage package...`からインストールできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/351ecbdc-ebcc-727b-c7a4-5447baef4d3c.png)

ソースコードコピペでも大丈夫です。
https://github.com/GitHub30/pichromecast/blob/main/pichromecast.py

# デモ
BOOTSELボタンを押したときに喋るようにしてみました
[![Watch the video](https://img.youtube.com/vi/bA8fouVAPho/maxresdefault.jpg)](https://youtu.be/bA8fouVAPho)

```python
import network
import time

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("aterm-SSID-g", "YOUR_PASSWORD")
while not wlan.isconnected() and wlan.status() >= 0:
    time.sleep(1)

from pichromecast import play_url


playing = False
while True:
    if rp2.bootsel_button() == 1 and not playing:
        playing = True
        machine.Pin('LED', machine.Pin.OUT).on()
        play_url('https://nyanpass.com/nyanpass.mp3', '192.168.10.101')
        playing = False
        machine.Pin('LED', machine.Pin.OUT).off()
    time.sleep(0.1)
```


# IPの見つけ方
MDNSでIPを見つけられます。

```python
#pip install pychromecast
import pychromecast

services, browser = pychromecast.discovery.discover_chromecasts()
pychromecast.discovery.stop_discovery(browser)
print(services)
[CastInfo(services={ServiceInfo(type='mdns', data='Google-Home-Mini-3b0a32dc5803130351919f8a286e406f._googlecast._tcp.local.')}, uuid=UUID('3b0a32dc-5803-1303-5191-9f8a286e406f'), model_name='Google Home Mini', friendly_name='書斎', host='192.168.10.101', port=8009, cast_type='audio', manufacturer='Google Inc.')]
```
要素数が異なる2次元配列の取り出し方(備忘録)

# 要素数が異なる2次元配列の取り出し方

```java
public static void main(String[] args) {
	// 配列用意
	int[][] array = new int[][] { { 1, 2 }, { 2, 3, 4 } };

	// 2次元配列の要素数
	System.out.println("2次元配列の要素数: " + array.length);
	// 2次元配列の[0]に入っている配列の要素数
	System.out.println("2次元配列の[0]に入っている配列の要素数: " + array[0].length);
	// 2次元配列の[1]に入っている配列の要素数
	System.out.println("22次元配列の[1]に入っている配列の要素数: " + array[1].length);

	// 配列の中身全てのとり出す
	for (int i = 0; i < array.length; i++) {
		for (int j = 0; j < array[i].length; j++) {
			System.out.println("array[" + i + "][" + j + "] = " + array[i][j]);
		}
	}
}
```

#### コンソール結果
```
2次元配列の要素数: 2
2次元配列の[0]に入っている配列の要素数: 2
22次元配列の[1]に入っている配列の要素数: 3
array[0][0] = 1
array[0][1] = 2
array[1][0] = 2
array[1][1] = 3
array[1][2] = 4
```
2022年09月何故かベストアンサーをつけてくれない質問



# トレイルヘッド

+ [I am working on the section Create a Report, a Report Chart, and a Dashboard.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdULe)
+ [error message whenever I try to complete Create a Configurable Bundle with Options and Features Trailhead challenge](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IT2zl)
+ [The new user does not have the System Administrator profile. No Profile field in User Record, choose System Administrator.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdWRF)
+ [I'm getting an error message and can't complete the challenge, Can some one help me? Prepare Your Combined Data in a Recipe](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jd7Bo)
+ [When im trying to add a role this comes up, and i cant seem to figure this out](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdVeJ)
+ [URL syntax for adding conditional statements for a cusstom button](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdY7l)
+ [Knowledge - Suggested Articles 'admin-selected case fields'.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdYbl)
+ [ユニット組織のチャレンジ検証へのアクセスを制御できない](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JySg8)
+ [Control access to the unit org challenge verification](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdmT2)
+ [I am not sure how to activate 'Experience Builder Site Page' checkbox setting.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jdnql)
+ [Issues creating new admin user.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000K05gg)

# 数式

+ [Validation Rule Formula](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdpKK)
Android StudioによるFlutter開発で 作成した.dartファイルが認識されない場合の対処法


### ■ 発生した問題
新規ファイルを作成する際に、右クリック→ New → Dart File を選択します。
この時に、一度誤ったファイルを選択して作成すると
削除して作成し直しても、Dartファイルとして認識されなくなる。といった事象が発生します。

### ■ 原因
一度誤ったファイル形式で作成したファイル名が、以降もその時のファイル形式として認識されている。

### ■ 自分の環境
Mac Book M1
Android Studio Chipmunk | 2021.2.1  Patch 2

### ■ 発生事象
まず事象としては、前述した通りの手順を踏むと、以下のように「post_page.dart」ファイルに青いマークが付きません。
![スクリーンショット 2022-09-04 13.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823638/24c0a68a-e35c-9fb8-9f28-a91f07326ff6.png)

この状態で「stf」と入力しても、StatefulWidgetとして予測してくれないので、作成した段階でFlutterの.dartファイルとして認識してもらう必要があります。

### ■ 解決方法
■Mac
1. Android Studio
2. Preferences
&nbsp;&nbsp;&nbsp;&nbsp;ショートカット
&nbsp;&nbsp;「 command + ,」
3. Editor
4. File Types

■Windows
1. Android Studioの設定画面を開く
2. ショートカット
&nbsp; 「ctrl + slt + S」
3. Editor
4. File Types

ファイルタイプを一つ一つ確認していくと、目的のファイル名が右側に確認できます。
今回だと「post_page.dart」を探します。
![スクリーンショット 2022-09-03 20.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823638/ca628e86-77c4-0519-8ecd-2e0a80eb7508.png)

これをファイル名上部にある「-」を選択して削除し、右下の「OK」ボタンを選択。
設定画面を閉じると、先ほどの「post_page.dart」をdartファイルとして認識します。
更に「stf」を入力すると、StatefulWidgetとして予測してくれるようになります。
![スクリーンショット 2022-09-03 20.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823638/0abba9c8-a674-9010-08c3-ef3278a6b3b9.png)

以上が、Android StudioによるFlutter開発で
作成した.dartファイルが認識されない場合の解決方法でした。
ECSってなんぞや？

## ECSとは
公式ドキュメントより
> Amazon ECS は、フルマネージドコンテナオーケストレーションサービスであり、コンテナ化されたアプリケーションを簡単にデプロイ、管理、およびスケーリングできます。

んー、いまいちわからん。
色々調べてみると、
Dockerコンテナサービス、AWS上で稼働させるDockerをAmazon ECSが管理してくれるようですね。

## Dockerコンテナって？
![スクリーンショット 2022-09-04 11.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1155100/00b99e59-5c2c-17be-ff87-dd2b498425cb.png)

このイメージですね。下記より引用。
https://cn.teldevice.co.jp/column/10509/
Dockerコンテナを理解するには、従来の仮想化を理解する必要があります。
ここは飛ばします。

## ECSの全体的な構成要素
先に全体的な構成要素のイメージを貼り付けときます。
![スクリーンショット 2022-09-04 12.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1155100/e79e2c68-c328-abf4-0ed4-ad7ff40d8026.png)


#### クラスター
> Amazon ECSクラスターは、タスクまたはサービスの論理グループです。クラスターを使用して、アプリケーションを分離できます。

ECSの骨組みみたいなもので、タスクを配置するEC2インスタンス群になります。
ECSクラスターの上に後述する「EC2インスタンス」を起動した上で「タスク定義」を元に作成される「サービス」から「タスク(コンテナ)」をクラスター内のインスタンスにデプロイする事が出来ます。

#### タスクの定義
> タスク定義は、アプリケーションを形成する 1 つ以上のコンテナを記述するテキストファイルです。JSON 形式にあります。最大 10 個のコンテナを記述するために使用できます。タスク定義はアプリケーションのブループリントとして機能します。それは、アプリケーションのさまざまなパラメータを指定します。たとえば、オペレーティングシステムのパラメータ、使用するコンテナ、アプリケーションで開くポート、タスクのコンテナで使用するデータボリュームなどの指定に使用できます。タスク定義で使用できる特定のパラメータは、お客様の特定のアプリケーションのニーズによって異なります。

どうコンテナを実行するかの情報であり、その定義が書かれたものです。
docker-compose.ymlがタスク定義にあたります。

#### タスク
> タスクはクラスター内のタスク定義のインスタンス化です。Amazon ECS でアプリケーションのタスク定義を作成後、クラスターで実行するタスクの数を指定できます。スタンドアロンタスクを実行することもできますし、サービスの一部としてタスクを実行することもできます。

ECSにおけるコンテナに相当します。
タスクの定義の情報から起動させたコンテナの実行単位です。

### サービス
> Amazon ECS サービスを使用すると、Amazon ECS クラスターで必要な数のタスクを同時に実行して維持できます。仕組みとしては、タスクがいずれかの理由で失敗または停止した場合に、Amazon ECS サービススケジューラがタスク定義に基づいて別のインスタンスを起動することによって動作します。これは、それを置き換え、サービス内の必要な数のタスクを維持するために行われます。

+ タスク定義の選択
+ クラスターの選択
+ タスクの数
+ コンテナとELBの紐付け

などを設定することができます。

#### ECR
フルマネージドなDockerコンテナレジストリサービス

## まとめ
ECSを作成する際の手順を整理
+ クラスターの作成
    + ここでECSの骨組みを作成
+ タスクの定義
    + ここでどのようにタスクを実行するか、ロールやタスクサイズを設定
    + コンテナの定義もここで設定する
        + イメージやポート、環境変数などの設定
+ サービスの設定
    + タスクの数やコンテナとのELBの紐付けなどを行う

ECSは概念を理解するのが難しいですが、今回で少し理解が深まりました。
google cloud vision api で 人物、顔、QRコード（バーコード）判定

Google cloud vision api で 人物判定をしよう

性別判定はできるの？
→ 不可

色々な判定方法があるが、[faceAnnotations]があるかどうか
で判断するのがベスト。
※イラストまで人物判定されるときがあるので。

また仮に人物であってもエッチ及び不適切な画像の場合があるので、
dangerフラグをオンにするように設定

```hoge.php
$vision = new VisionClient([
    'projectId' => config('app.gcp_project_id'),
    'keyFile' => json_decode(file_get_contents(config_path('gcp.json')), true)
]);

//ノーマル
$img = "https://twikon.club/img/topmodel.png";

$image = $vision->image(file_get_contents($img), ['FACE_DETECTION','SAFE_SEARCH_DETECTION']);

$result = $vision->annotate($image);

$info = $result->info();

$flag = [
    'danger' => [],
    'person' => 0
];

foreach ($info['safeSearchAnnotation'] as $key => $v) {

    if(!preg_match("/un/i",$v)){
        $flag['danger'][$key] = 1;
    }

}

if(!empty($info['faceAnnotations'])){
    $flag['person'] = 1;
}

print_r($flag);
```

# safeSearchAnnotation の値について



adult	
エッチな画像か

spoof	
おもしろ加工されているか
（顔隠しや、顔を大きく、小さくしたり）


medical	
医療画像か

violence	
暴力的な画像か


racy	
際どい水着画像か（エッチ系）


# 値。普通の画像でもPOSSIBLEになるときがけっこうある。

0 UNKNOWN	未知の可能性。
1 VERY_UNLIKELY	それは非常にありそうもないです。
2 UNLIKELY	ありそうもありません。
3 POSSIBLE	可能です。
4 LIKELY	それは可能性があります。
5 VERY_LIKELY	その可能性は非常に高いです。

# QRコード（バーコード）判定

```hoge.php
<?php
$image = $vision->image(file_get_contents($img), ['OBJECT_LOCALIZATION','FACE_DETECTION','SAFE_SEARCH_DETECTION']);
$result = $vision->annotate($image);
$info = $result->info();

//            qrコードにマッチ
if(!empty($info['localizedObjectAnnotations'])){

    if(preg_match("/barcode/",$info['localizedObjectAnnotations'][0]['name'])){
        echo "qrコードです";
    }
    
}
```
include系とrequire系の使い分け

# include系とrequire系の違い

- 結論
ファイルの読み込みが失敗した場合の動作に違いがある

■使用例
```  
include 'samplefile.php';
```

```
require 'samplefile.php';
````

### include系の場合
指定したファイルの読み込みが失敗しても
Warning(警告)だけ表示され，処理が中断されない。
HTMLやテキスト等を読み込むときに使われる。

### require系の場合
指定したファイルの読み込みが失敗した場合，
Fatal Error(致命的なエラー)が表示され，処理が中断される。
主に関数(メソッド)や処理を読み込む時に使われる。

# 参考記事
https://www.php.net/manual/ja/function.require.php
https://www.php.net/manual/ja/function.include.php
VSCodeのコンフリクトエディタを戻す

## 追記 2022/09/10

VSCodeのAugust2022アップデート（version 1.71）で仕様が少し変わりました。

コンフリクトを起こしている画面で3way merge editorを開くボタンが表示されるように

この記事の役割が終わりました。（めでたし）

https://code.visualstudio.com/updates/v1_71#_merge-editor-improvements

# やること

これを

![スクリーンショット 2022-09-04 11.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974327/c57b176a-d930-b25c-4264-c270f1b40927.png)

これに戻す

![スクリーンショット 2022-09-04 11.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974327/8aaa3543-b891-10fb-122e-0001e2c92831.png)

## 設定変更方法

1. 歯車 > Settings
2. git.mergeEditorで検索
3. チェックを外す

![スクリーンショット 2022-09-04 11.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974327/d2788a35-4c3e-3a3f-efed-46701466b218.png)

## ちなみに3way merge editorと呼ぶらしい

2022年6月に実装されて、2022年7月にデフォルト設定になった（たぶん）

https://code.visualstudio.com/updates/v1_69#_3-way-merge-editor
React Hook Form,バリデーションzodを使用した場合の重複チェック

# はじめに

React Hook Form を使用し、バリデーションライブラリはzod という案件にて、重複チェックが必要だったのでそのメモです。
私が探した時点（2022.08）では、日本語で解説してくれている記事を見つけることができなかったので、参考になれば嬉しいです。



# 最初に

React Hook Formでバリデーションライブラリはzodを使用する方法は他の方が丁寧に書かれているので、敢えて書きません。

https://note.com/tabelog_frontend/n/n0dc1a2089e58



# やりたいこと

zodを使用して、アプリ名の重複チェックをしたい



# 結論

zodはz.object内にバリエーションルールを記載するのですが、

```typescript:index.ts
    .refine
```
refineを使用すれば良さそうです。




```typescript:index.ts

const FROM_SCHEMA = useMemo(() => {
    return z.object({
      name: z
        .string()
        .min(1)
        .refine(
          (name: string) =>
            !(apps && apps.some((app: AppSchema) => app.name === name)),
          {
            message: 'すでに同じ名前のアプリが存在します',
          }
        ),
    })
  }, [apps])

const {
    handleSubmit,
    register,
    reset,
    formState: { errors },
  } = useForm<z.infer<typeof FROM_SCHEMA>>({
    mode: 'onSubmit',
    resolver: zodResolver(FROM_SCHEMA),
    defaultValues: { ...template },
  })


```

# 参考

https://github.com/colinhacks/zod#refine
シェルスクリプトだけで大文字⇔小文字変換（POSIX準拠シェル用）

## はじめに

シェルスクリプトで大文字と小文字を変換する場合 `tr` コマンドを使用するのが一般的です。しかし `tr` コマンドは外部コマンドであるため呼び出しが遅く、ループの中で何度も呼び出すには適していません。bash であれば変数展開を用いて大文字小文字の変換ができるのですが、dash や ksh や zsh では使用できません（ksh や zsh では `declare` を使用した変換方法があります）。そこで POSIX 準拠シェルの機能だけを使って、どの POSIX シェルでも動く大文字小文字変換関数を実装してみました。

ちなみに、この方法は変数に代入された小さな文字列の変換に適していますが、大きなテキストファイルの変換は遅くなるため適していません。大きなテキストを変換する場合は以下の記事を参照してください。

- [tr,nkfはもう不要？最強uconvで全角⇔半角、大文字⇔小文字、ひらがな⇔カタカナなどの変換をシェルスクリプトで行う](https://qiita.com/ko1nksm/items/7c31a2759579e6a1b65b)

### 実装

```sh
#!/bin/sh

set -eu

str="ABCDEFGHIJKLM:NOPQRSTUVWXYZ"

gentr() {
  eval "$(
    echo "$1() {"
    echo '  set -- "$1" "$2" ""'
    echo '  while [ "$2" ]; do'
    echo '    case $2 in'
    shift
    while [ $# -gt 0 ]; do
      echo "      \"${1}\"*)" \
        "set -- \"\$1\" \"\${2#\"${1}\"}\" \"\${3}${2}\" ;;"
      shift 2
    done
    echo '      *) set -- "$1" "${2#?}" "$3${2%"${2#?}"}" ;;'
    echo '    esac'
    echo '  done'
    echo '  eval "$1=\$3"'
    echo '}'
  )"
}

gentr lowercase \
  A a B b C c D d E e F f G g H h I i J j K k L l M m \
  N n O o P p Q q R r S s T t U u V v W w X x Y y Z z

gentr uppercase \
  a A b B c C d D e E f F g G h H i I j J k K l L m M \
  n N o O p P q Q r R s S t T u U v V w W x X y Y z Z

lowercase str "$str"
echo "$str" # => abcdefghijklm:nopqrstuvwxyz

uppercase str "$str"
echo "$str" # => ABCDEFGHIJKLM:NOPQRSTUVWXYZ

# 以下とほぼ同等
#
# str="ABC"
# echo "$str" | tr A-Z a-z
# echo "${str,,}"
#
# str="abc"
# echo "$str" | tr a-z A-Z
# echo "${str^^}"
```

### 解説

`gentr` 関数は、変換関数を生成する関数です。　`gentr lowercase A a B b ・・・` のように、生成する関数名(`lowercase`) の後に、変換前の文字列 (`A`) と変換後の文字列 (`a`) を交互に書いていくことで、以下のようなコードを生成し `eval` することで関数を定義します。

```sh
lowercase() {
  set -- "$1" "$2" ""
  while [ "$2" ]; do
    case $2 in
      "A"*) set -- "$1" "${2#"A"}" "${3}a" ;;
      "B"*) set -- "$1" "${2#"B"}" "${3}b" ;;
        ︙
      "Z"*) set -- "$1" "${2#"Z"}" "${3}z" ;;
      *) set -- "$1" "${2#?}" "$3${2%"${2#?}"}" ;;
    esac
  done
  eval "$1=\$3"
}
```

あとはその関数を使用して変換するだけです。変換関数では外部コマンドもサブシェルも使用しないため（文字列が十分小さければ） `tr` コマンドを呼び出すよりも速く変換処理を行うことが出来ます。

```sh
lowercase str "ABC"
echo "$str" # => abc
```

`gentr` 関数は汎用的に作られているので、その他の変換にも使えると思います。ただしメタ文字を変換する場合、`gentr` 関数に渡す文字にエスケープが必要になるかもしれないので注意してください。

### 例 先頭一文字を大文字にする

```sh
capitalize() {
  set -- "$1" "${2%"${2#?}"}" "${2#?}"
  uppercase "$1" "$2"
  eval "$1=\"\${$1}\$3\""
}

capitalize str "abc"
echo "$str" # => Abc

# 以下とほぼ同等
#
# str="abc"
# echo "${str^}"
```

### 例 大文字と小文字を反転する

```sh
gentr togglecase \
  A a B b C c D d E e F f G g H h I i J j K k L l M m \
  N n O o P p Q q R r S s T t U u V v W w X x Y y Z z \
  a A b B c C d D e E f F g G h H i I j J k K l L m M \
  n N o O p P q Q r R s S t T u U v V w W x X y Y z Z

togglecase str "Abc"
echo "$str" # => aBC

# 以下とほぼ同等
#
# echo Abc | tr a-zA-Z A-Za-z
#
# str="Abc"
# echo "${str~~}"
```
cargo install cargo-generateのエラーで嵌まった話

# cargo install cargo-generateを実行すると、rhaiのバージョンが合わないと言われた

```
~$ cargo install cargo-generate
    Updating crates.io index
  Installing cargo-generate v0.16.0
error: failed to compile `cargo-generate v0.16.0`, intermediate artifacts can be found at `/tmp/cargo-installpQrOU1`

Caused by:
  failed to select a version for the requirement `rhai = "^1.8"`
  candidate versions found which didn't match: 1.7.0, 1.6.1, 1.6.0, ...
  location searched: crates.io index
  required by package `cargo-generate v0.16.0`
```

cargo-generateの最新バージョンが0.16で、使用しているrhaiのバージョンは1.8
しかし、使用できるrhaiのバージョンは最高でも1.7でした。

# しかし、cargo searchで調べると1.9.1が最新

```
~$ cargo search rhai
rhai = "1.9.1"                   # Embedded scripting for Rust
rhai-doc = "0.2.2"               # Documentation tool for Rhai - an embedded scripting language and engine for Rust
rhai-rand = "0.1.4"              # Random number package for Rhai
rhai-sci = "0.1.7"               # Scientific computing in the Rhai scripting language
bevy_rhai = "0.3.0"              # An easy way to integrate Rhai with Bevy.
tide-rhai = "0.0.2"              # A scritping component for tide.
quad-compat-rhai = "1.4.0"       # Embedded scripting for Rust
rhai_codegen = "1.4.2"           # Procedural macros support package for Rhai, a scripting language and engine for Rust
bevy_api_gen = "0.1.1"           # Derive macros for bevy_mod_scripting
bevy_event_priority = "0.1.1"    # Bevy plugin providing priority based event handling
... and 26 crates more (use --limit N to see more)
```

create.ioに問い合わせた結果、1.9.1が最新だという。
なぜそれを使用しないのか？

# rustのバージョンが古かった

```
~/cargo-generate$ cargo --version
cargo 1.59.0 (49d8809dc 2022-02-10)
```

ググったら、執筆時点での最新バージョンは1.63だった。

# rustをアップデートする

```
~$ rustup update
・・・
  stable-x86_64-unknown-linux-gnu updated - rustc 1.63.0 (4b91a6ea7 2022-08-08) (from rustc 1.59.0 (9d1b2106e 2022-02-23))
```

この状態で再びcargo-generateをインストール

```
~$ cargo install cargo-generate
・・・
   Installed package `cargo-generate v0.16.0` (executable `cargo-generate`)
```

ここまで到達するのに1時間半かかりました。
Blenderの画像とPythonあれこれ

## Blenderの画像とPythonあれこれ

### PNG画像をJPEGで保存するとき

ファイルサイズを圧縮するために、PNGファイルをJPEGで保存すると、色合いが変化することがありました。
完全な解決方法かはわからないですが、下記のようにしたら改善しました。

- レンダープロパティのカラーマネジメントのビュー変換をFlimicから標準に変える

| 変更前 | | 変更後 |
|--|--|--|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/9e66a40c-f4fe-d6c5-d003-08cb49754230.png" width="240"> | → | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/97eb94ca-4465-18e1-e227-ea85259f7c5b.png" width="240"> |

Pythonの場合

```py
bpy.context.scene.view_settings.view_transform = "Standard"  # 標準に設定
# 画像保存
bpy.context.scene.view_settings.view_transform = "Filmic"  # Flimicに戻す
```

### 品質などを指定して画像を保存

画像を保存するときに、ダイアログでフォーマットやカラーや品質を設定できます。
Pythonでこれを実現するとします。Imageオブジェクトの`save()`メソッドには引数がなく、オブジェクトの属性にもこれらの項目はありません。これらを設定するには、下記のようにする必要があるようです。

```py
stng = bpy.context.scene.render.image_settings
stng.file_format = フォーマット  # ex. "JPEG", "PNG"
stng.color_mode = カラー  # ex. "BW", "RGB", "RGBA"
stng.quality = 品質  # 0-100

img = bpy.data.images[対象画像]
img.save_render(パス, scene=bpy.context.scene)
```

`color_mode`の設定では、先に`file_format`を決定する必要があることに注意してください。
たとえば、`file_format == "JPEG"`のときに、`color_mode`を`"RGBA"`にするとエラーになります。
なお、`color_mode == "RGBA"`のときに`file_format`を`"JPEG"`にすると、`color_mode`が`"RGB"`に変わるだけでエラーにはなりません。

### アルファがあるかどうかの判定

画像がアルファを持っているかどうかを直接表す属性はないようですが、下記のようにして判定できました。ただし、JPEGとPNGのいくつかの種類でのみ確認しています。

```py
img = bpy.data.images[対象画像]
has_alpha = img.depth // (img.is_float * 3 + 1) // 8 % 2 == 0
```

調べた範囲では、`img.depth // (img.is_float * 3 + 1) // 8`は、`1, 2, 3, 4`の値を取り、それぞれ、「1色、1色＋α、3色、3色＋α」でした。

以上
Webサイトを最速で構築するフレームワーク Hugo


![Hugo-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/e2b693ff-b71e-34d3-7e76-51a080e286ce.png)

`Hugo`(ヒューゴ)と読みます。要は、`SSG(Static Site Generator)`こと静的サイトジェネレーターです。 Markdown 形式で追加/編集ができるため、とても手軽で簡単に、かつ無料で使えます。

:::note info
公式の [Quick Start](https://gohugo.io/getting-started/quick-start/) を意訳しているだけです
:::

## まずは完成形から

## ステップ1：Hugo をインストールする

```bash
brew install hugo
```

## ステップ2：新しいサイトを作成する

今回は`hugoQuickstart`という名前のディレクトリを作成します。

```bash
hugo new site hugoQuickstart
```

## ステップ3：テーマを追加する

テーマはこちらの『[Ananke Gohugo Theme](https://themes.gohugo.io/gohugo-theme-ananke/)』を使用します。
そのほかのテーマは 『[themes.gohugo.io](https://themes.gohugo.io/)』から探すことができます。

```bash
cd hugoQuickstart
git init
git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke
```

次のコマンドでテーマをサイト構成に追加します。

```bash
echo theme = \"ananke\" >> config.toml
```

## ステップ4：コンテンツを追加する

```bash
hugo new posts/my-first-post.md
```

作成したコンテンツを開いてみます。`draft: true`にしておくと公開ページから除外できます。

```yaml
$ cat content/posts/my-first-post.md
---
title: 'My First Post'
date: 2021-04-01T12:00:00+09:00
draft: true
---
```

## ステップ5：Hugoサーバーを起動する

```bash
hugo server -D
```

http://localhost:1313/ にアクセスしてください。
コマンドを叩いてきただけですが、一瞬で Webサイト が構築できました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/80c1906a-851c-78a9-52a5-a75ad6a38b11.png" width=600px></img>

## ステップ6：テーマをカスタマイズする

細かい設定は`config.toml`でできますが、割愛します。テーマごとに設定内容が異なるため、構成オプションについては、追加したテーマサイトを参照しましょう。[テーマサイト](https://github.com/theNewDynamic/gohugo-theme-ananke)

## ステップ7：静的ページを作成する

最後に次のコマンドを叩くことで静的ページが作成されます。作成したページは `./public/` に出力されます。こちらをお好きなところにアップロードするだけで公開完了です。自動デプロイをする場合は、[このあたり](https://gohugo.io/hosting-and-deployment/)を確認してみると良いでしょう。

`-D`オプションはドラフト版も public フォルダに出力します。
[hugoコマンドオプション](https://gohugo.io/commands/hugo/)

```bash
hugo -D
```

## github pages に反映されない場合

[Settings]-[Pages]
のSourceでブランチ指定が外れている場合があるため、設定し直してあげる必要がある。

## 参考

- 公式： https://gohugo.io/
Mac版EclipseのWorkspaceを復活させるメモ(2013/10/21)

2013/10/21当時のMac版EclipseのWorkspaceを復活させるメモです。
念のため残しておきます。

```bash
#!/bin/bash
rm -f "$1"/.metadata/.plugins/org.eclipse.core.resources/.projects/*/.*.snap
rm -f "$1"/.metadata/.plugins/org.eclipse.core.resources/.snap 
rm -R "$1"/.metadata/.plugins/org.eclipse.e4.workbench
/Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse -clean
```
Windows Server バックアップ利用

# はじめに
Windows Serverに標準搭載されている「Windows Serverバックアップ」を利用する機会があったのでメモします。

# Windows Server バックアップとは
Windows Serverにの標準バックアップ機能です。有効化するだけで利用できるようになります。基本的には下記の通りです。

https://jpwinsup.github.io/blog/2022/03/22/Storage/Backup/Windows-Server-Backup-Overview/

クラウド環境ではバックアップの機能があるため活躍するシーンが無いと思います。オンプレを利用する場合もバックアップはNetbackupなど別の製品ですることが多いように思います。
そうなると、この機能が活躍するのは例えばこういう場面でしょうか。

* オンプレで稼働していたWindowsサーバーをクラウドに移行した。オンプレをシャットダウンする前に念のためバックアップだけは取っておきたい。あとで必要になったらクラウド上で中身を確認したい。
* マルチクラウド間でバックアップリカバリしたい。例えばAWSで運用するサーバのDドライブを丸ごとバックアップしてAzureのサーバーに復元したい。

## できること

* Windowsサーバーを丸ごとバックアップできる（差分バックアップも）
* Dドライブだけ、のようにドライブを選んでバックアップできる
* バックアップ先としてネットワーク内のファイルサーバーを選択できる
* 別のWindowsサーバーでリカバリができる
* ファイル単位のリカバリができる
* 生成されたバックアップファイルをS3等に丸ごと保存できる

## できないこと

* 環境全体のバックアップ管理のようなこと

# 手順など
参考文献の記事がとても分かり易かったので、これを見ながらやりました。

## ながれ
今回は下記の流れで実施しました。
1. バックアップの機能をサーバー(2012)上で有効化
1. ファイルサーバにバックアップを取得（空き容量に注意）
1. 別のサーバー(2019)上でリカバリができるか確認

# おわりに

今回は急きょバックアップが必要になったので利用しました。またいずれ同じようなことがあるかもしれないのでメモしておきます。

# 参考文献

https://jpwinsup.github.io/blog/2022/03/22/Storage/Backup/Windows-Server-Backup-Overview/
Swift Playgrounds のアプリで多言語対応する


# 初めに

まず最初に **Xcode の Playground とは違います** のでmm
今回は **Swift Playgrounds** でアプリを開発する場合のお話です。



## Swift Playgrounds とは

2016年に登場した iPad 上で Swift を学習できるアプリです。

https://www.apple.com/jp/swift/playgrounds/


当初はテンプレートの教材を Swift で学習するだけでした。

現在はバージョンが`4.1`までリリースされており、iPad のみならず Mac 上でも動作し、**実際にリリースできるアプリが作成できる**までになりました。

## どんなことができるの？

iOSDC Japan 2022 で LT をしました！
資料をあげたので、見ていただけると少しは理解が深まるかと思いますmm

https://speakerdeck.com/hcrane/iosdc2022-ipadosdc-japan-2022

# ローカライズの実装方法

## 1. 前提

基本的には、`Xcode` で実装する場合と同じです。
ただし、`Swift Playgrounds` の GUI 上では**実装が提供されていません**。
そこで、自前で必要なファイルをプロジェクトに追加する必要があります。

※iPad ではなく Mac で行う必要があります。iPad でもファイル操作可能なアプリを入れればできるかと（未確認）


### 余談

ちなみに `Swift Playgrounds` のみで完結させたい場合は...

分岐処理を書いて、自前で実装することもできなくはないです。
その場合はネイティブが提供するAPI（`Locale.preferredLanguages`など）で言語を取得する形になります。

（オススメはしません）

## 2. ファイルの追加

`Xcode` でローカライズを実装する際に、自動で生成されるファイルをプロジェクトの任意の場所に設置します。
（プロジェクト配下にあれば自動で読み取ってくれます。）

以下、日本語と英語の場合
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/2679c8df-b6ed-21ec-8979-3a245dcad21d.png)

任意のプロジェクトを `Xcode` で作成し、そこからローカライズのファイルを持ってくるのが早いかと思います。

## 3. 設定の追加

プロジェクト内の `Package.swift` に設定を追加します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/af923a8b-0d64-b5c6-67da-4aeb19653832.png)

デフォルト言語を設定しましょう。
これで準備は完了です。

## 4. ローカライズ対応

これ以降は、特別なことはありません。

`Localizable.strings` ファイルに必要な文字を追加していくだけです。
また、使用する場合も従来と同じです。

以下、 「【SwiftUI】Localizable.stringsで、多言語対応する方法を解説」を参考にまでに。

https://hirauchi-genta.com/swift-swiftui-localizable/



# 終わりに

`Swift Playgrounds` の GUI 上でローカライズのインターフェースが提供されるのかわかりませんが...

今の `Xcode` と同じ実装で導入できることを考えると、今回のような少しハックするような実装を行ったとしても、今後影響はあまりないと思います。

今後のアップデートに期待です。


## リポジトリ


以下に導入したアプリがあるので、参考程度に見ていただけますと🙏

https://github.com/crane-hiromu/PadOSDC_Japan_App

## その他

関連記事はこちら

https://qiita.com/hcrane/items/10d5d579ea7f9bc935e9

https://qiita.com/hcrane/items/7a422bdf76091befc8c4

https://qiita.com/hcrane/items/7740c0718b6516b2393c
タスク整理アプリを作ろう!!①

## ご挨拶<br>
はじめまして!
株式会社ソントレーゾの**いのうえ**と申します。
入社して2年目になります。
大学は文系で、美術や芸術を研究していました。
Power Platformに関してはまだまだですが、去年1年間勉強してきた状態です。
Twitterアカウントはこちらになりますので、よかったらフォローしてください♪
(1日1ツイートを目標につぶやいています。内容は仕事やプライベートなどなど)
https://twitter.com/sentreseau_2221


## これからブログでやっていくこと<br>
このブログではPower Platformやその他技術的に学んだことをアウトプットしていく場所にしていきます。<br>
完全に私自身の備忘録的なものにはなりますが、たくさんの方に読んでいただいて、いろいろなご意見いただけるといいなと思っています。

## タスク整理アプリを作ろう!!<br>
さっそくタイトルにもありますように、8月から取り組んでいる**タスク整理アプリ**について書いていこうと思います。<br>
まだ機能自体固まっていないので、今回は大枠のアプリとフローを作成しました。

##### タスク整理アプリ
1. 目的：業務終了間際に明日やるべきタスクを整理して、次の日の業務をスムーズに行いたい。
1. 主な機能：退勤前にアプリを起動して明日のタスクを入力。入力したものを次の日の業務の前に表示させる。
1. データベース：Dataverse<br>


## 8月に行った作業
まず画面を2つ作りました。

**Home Screen**
![スクリーンショット 2022-09-04 101319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/d4aa2908-c6cb-f2d0-49ae-3fa91109a33c.png)
明日のタスクを登録する画面に遷移するボタンと今後のため過去のタスクを確認する画面に遷移するボタンを用意しました。<br>

**Tomorrow Task**
![スクリーンショット 2022-09-04 101603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/bd8b0df4-67b8-eee0-bdbc-61ed6768fe0f.png)

こちらは明日のタスク登録をする画面になります。
登録ボタンにPatch関数を設定して、Dataverseにデータ登録するようにしています。

それからフローも1つ作成しました。
**タスク送信**
![スクリーンショット 2022-09-04 101909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/103d7ca8-1c2f-2525-c535-72d3df5b9217.png)
このフローでは毎週月曜日から金曜日の出勤前に、Dataverseに登録されている今日のタスクをメール送信するフローです。

## まとめ
一旦、大枠だけ作ってみましたが、まだまだ機能が欲しくなるだろうなあといった感じですね。
メール送信のトリガーは出勤打刻したときのほうがいいかな…とか
そもそもメールじゃなくてTeamsのチャットのほうがいいかな…とか
いろいろアイデアは出てきそうですが、まずは試験的に使ってみようと思います。
今のところ、自分しか使わないものになりますが、**自分にとって使いやすいアプリ**ではなくて
**誰が使っても使いやすいアプリ**を目指して作成していきます!<br>


次回もぜひ読んでくださいね♪
DevToolsのconsoleを介してイベントと関数呼び出しを監視する

ブラウザの`console.log`は処理の状態を理解するのに便利です。
私もいつも`console.log`デバッグを使っています。
Chromeにはもっと便利な`monitorEvents`と`monitor`があり、イベントが発生したり関数が呼ばれたりするたびにログを取得することができます。

## Monitor Events
`monitorEvents`に要素と一連のイベントを渡して、イベントが発生したときにコンソールログを取得します。

```JavaScript
// クリックイベントを監視
monitorEvents(window, 'click')

// 上キー、下キーイベントを監視
monitorEvents(document.body, ['keyup', 'keydown'])

// スクロールイベントを監視
monitorEvents(window, 'scroll')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184922/c0a8af58-4315-87d9-ee2f-e6b8967bc735.png)
イベントの配列を渡すことで、複数のイベントをリスニングすることもできます。

## Monitor Function Calls
`Monitor`は、関数に関する情報を出力してくれます。

```JavaScript
// 適当な関数を定義
function myFn() { }

// 関数をモニター
monitor(myFn)

// 使い方1: 基本的な呼び出し
myFn()
// function myFn called

// 使い方2: 引数
myFn(1)
// function myFn called with arguments: 1
```
渡された引数を表示してくれるのがとても便利です😊

`console.log`を完全に置き換えるものではありませんが、
`monitor`と `monitorEvents`を併せて使うことでデバッグがこれまで以上にはかどるかと思います。
Liux anacronについて（自分用メモ

●anacron
cronによるジョブスケジューリングを補完するツール。

anacronの特徴
・日単位でジョブを実行
・実行履歴を管理しており、未実行のジョブを検出できる
・デーモン化（バックグラウンド実行）しないため、定期的に実行する必要がある。主にcrondによって実行される。
・ジョブ定義ファイルは /etc/anacrontab。rootユーザーのみが読み書きできる。


1時間おきに実行されるジョブはrun-parts コマンドで「/etc/cron.hourly」ディレクトリ内の全ファイルを実行。


●/etc/anacrontab

項目名
・period in days 実行する間隔(日単位)。@weekly(毎週１回)や@monthly(毎月１回)での指定もできる
・delay in minutes 実行までの待機時間(分)
・job-identifier ジョブ識別子。(任意の名前で作成可能)
・command 実行するコマンド


●at
1度だけ実行するジョブを予約するコマンド。atのジョブの管理には「at」コマンドを使用。

at [オプション] [日時]　※日時は基本的にHH:MMの形式で指定

オプション
・-l 予約中のジョブを表示(atqコマンドと同様)
・-d ジョブ番号　指定した予約中のジョブを削除(atrmコマンドと同様)
マナビDXクエスト開会式

マナビDX（デラックス） Questを受講することになリました。

# マナビDX（デラックス） Questとは
以下より。

> デジタル推進人材育成プログラム「マナビDX Quest」 https://manabi-dx.ipa.go.jp/manabi-dx-quest-2022/



# 開会式
9/3 Zoom にて数百名？が開会式に参加しました。

当プログラムの意義や進行について紹介がありました。何度か当プログラムに参加している方もいるそうです。
毎週のように課題があり提出期限を守って提出していく必要があるようでした。

メッセージとして、**主体的**にやってくださいという点が強い印象でした。

## 自己紹介タイム
自己紹介タイムもあり、7名ほどのルームで自己紹介がありました。

あれ？私以外全員エンジニア😅やばそう

## 有用そうなアドバイス
研修プログラムはチームプレイだから、協力すると楽なのでみんなと仲良くなるといいですよとのお話でした。

ぼっちにならないように準備しておくといいとのこと:thinking: 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/c86db106-efda-eced-a3b0-58e7b706f664.png" width="50%" />

# 学習など準備について
マナビDXクエストでは、基礎学習のために SIGNATE Cloud というオンライン勉強環境が用意されています。

そちらで学習を進めておくことで、プログラムの進捗に良い効果がありそうです。
現在私は0.5hなので9/5のプログラム開始までにどれくらい積めるかという感じですね。
![CleanShot 2022-09-04 at 10.00.07@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/c56404df-c1e7-de73-1e06-2d0ba185e5dd.png)


# 最後に
まずは提出期限を守れるようにやっていこうと思います。
FastaとFaiの含まれたGitリポジトリをWindowsにチェックアウトすると、改行コードの関係でインデックスがずれる

タイトルの通りです。

Fastaは、塩基配列やアミノ酸配列の形式です。リファレンスゲノムの表現によく利用されます。FastaはSamtoolsやSeqkitなどのコマンドラインツールを利用してインデックスファイル `.fai` を作成することができます。[インデックスファイルの中身](https://qiita.com/kojix2/items/50198b08128a84089597)はとても単純で、参照配列の名前、長さ、オフセット、ラインベース、改行を含む各行のバイト数、などが規定されています。

昨日、自作のライブラリ[ruby-htslib](https://github.com/kojix2/ruby-htslib) をWindowsに対応させました。
その際、ほとんどのテストは通ったのですが、Faidxのテストが通りませんでした。

その原因は、WindowsではデフォルトでGitが自動的に改行コードを変換する仕組みがあって、Fastaの改行コードが`LF`から`CRLF`に変換されたため、オフセットや改行を含むバイト数が、変換後のFastaファイルと不整合になっていたというのが原因でした。WindowsとMac/Linux間の改行コードの自動変換はいろいろなケースで問題になるようで、QiitaにはどのようにGitを設定を設定するべきかについて考察した記事もあります。

https://qiita.com/uggds/items/00a1974ec4f115616580

改行コードの長さが異なるので、同じFastaファイルであっても、① Mac/Linux上で `samtools faidx` した場合と、② Windows上で `samtools faidex` した場合は内容の異なるファイルが作成されます。逆に言うと、Mac/Linux上で作成したインデックスファイルは、GitでチェックアウトされたWindows上のFASTAファイルには適応できません。

この問題を解決する方法として、毎回新しくインデックスファイルを作り直すということも考えましたが、それよりもむしろFASTAファイルの改行コードを決め打ちした方がよいだろうと考えました。実は `.gitattribute` というファイルを作成すると、ファイルの拡張子単位で改行コードを指定することができます。

https://qiita.com/nacam403/items/23511637335fc221bba2

```.gitattribute
*           text=auto
*.fa        text eol=lf
```

このようにしておけば、拡張子 `.fa` のファイルの改行コードは `LF` に強制されます。便利ですね。これで、Fastaの含まれたGitリポジトリをチェックアウトしてもインデックスとの不整合を起こさなくなりました。

この記事は以上です。
Linux cronについて（自分用メモ

●cron
定期的に自動でジョブを実行。デーモン名は「crond」。
ユーザ用と管理者が設定するシステム用の2種類の設定ファイル（crontabファイル）がある。

●cronの設定ファイル

・ユーザ用のcrontabファイルは 「/var/spool/cron/ユーザ名」、「var/spool/cron/crontabs/ユーザ名」(ディストリビューションによる)、テキストエディタで直接編集はできない。ユーザ用のcronの設定を行うには「crontab」コマンドを使用。

・システム用のcrontabファイル（/etc/crontab）はviなどのテキストエディタで直接編集できる。ユーザ用のcrontabファイルの書式と異なり、各コマンドの実行ユーザも指定する必要がある。

●crontabファイルでは1行ごとに、自動的に実行するコマンドおよびその実行日時を指定。

crontabファイルの書式

[分] [時] [日] [月] [曜日] [実行ユーザ名(システム用設定ファイルでのみ指定)]　[コマンド]

項目
・分　0~59で指定
・時　0~23で指定
・日　1~31で指定
・月　1~12で指定
・曜日　0~7で指定（0,7=日曜、1=月・・・）

表記
・* 全ての範囲に一致
・- 範囲の指定。時に1−5を指定すると1時から5時までを意味する
・, 複数の値を指定
・/ 間隔の指定。時に「1−9/2」と指定すると１時から9時の間で２時間おきを意味する


●ユーザ用の設定
ユーザ用のcrontabファイルは テキストエディタで直接編集はできないので「crontab」コマンドを使用する。

crontab [オプション]

オプション
・-e(edit) 設定ファイル(crontabファイル)を編集
・-r(remove) 設定ファイルを削除
・-l(list) 設定ファイルを表示


crontab -eコマンドを実行するとEDITOR環境変数で指定されたエディタ（未指定の場合はviエディタ）が開き、ユーザ用のcrontabファイル（/var/spool/cron/ユーザ名）が編集できるようになる。


●cronのアクセス制御
cronを利用するユーザを制限するには、「/etc/cron.allow」ファイルと「/etc/cron.deny」ファイルを使用。「/etc/cron.allow」には利用を許可するユーザを、「/etc/cron.deny」ファイルには利用を拒否するユーザを記述。

■cronおよびat、batchのアクセス制御に使用されるファイルをまとめたもの
・cronのアクセス制御
許可　/etc/cron.allow
拒否　/etc/cron.deny

・at,batchのアクセス制御
許可　/etc/at.allow
拒否　/etc/at.deny

各ファイルは以下の順序で評価される。

1. 「/etc/cron.allow」ファイルがあれば、記述のあるユーザのみが利用可能
2. 「/etc/cron.allow」ファイルがなければ、「/etc/cron.deny」を参照し、そこに記述のないユーザが利用可能
3. 両方のファイルがなければ、rootユーザのみが利用可能

「/etc/cron.allow」ファイルが存在する場合、「/etc/cron.deny」ファイルの設定は無視され、「/etc/cron.allow」がなく「/etc/cron.deny」の中身に何も記述されていなければ、すべてのユーザが利用可能。

※UbuntuなどのDebian系ではどちらも存在しない場合は全てのユーザーが利用可能
※上記はat,batchの「/etc/at.allow」「/etc/at.deny」も同様
※rootユーザーの場合、両方のファイルが存在しない場合でも利用可能
「macOS BigSir(11.6.8)にてbrew doctor実行時、Xcodeのupdateを求められたとき」の対処法



## 現状

1→brew doctorを実行
すると、Xcodeのアップデート(バージョン13.2.1)を要求するエラー表示「warning」が出る。
※既インストールXcodeバージョン(11.3.1)

```zsh
Warning: Your Xcode (11.3.1) is too outdated.
Please update to Xcode 13.2.1 (or delete it).
Xcode can be updated from the App store.
```
2→それを受けてAppStoreにて最新バージョンのXcodeをダウンロードしようと試みたが、
古いバージョンのMac（macbook pro : mid 2014、macOS BigSir 11.6.8）を使用につき、
AppStoreで最新のXcodeにアップデート出来ない

## 解決手順

1→「brew doctor実行時にターミナルで要求されるバージョンのXcode(本環境においてはバージョン13.2.1)」を下記リンクよりダウンロードする
(※AppStoreでは最新バージョン以外にはアップデート出来ない)
https://developer.apple.com/download/all/
↑リンク先の検索窓にXcodeと入力すると各旧バージョンのダウンロードリンクが表示される

2→ダウンロードを実行し、Zipファイルを展開、インストールを実行

以上

## 追記

その後、Zipファイルがあるフォルダ内にインストールされたXcodeファイルを、
アプリケーションフォルダへ移動する際
(既インストールのXcodeと新しくインストールしたバージョンのXcodeを共存させたい場合)
の手順は、以下リンク記事内の「インストール済みのXcodeの名前を変更」を参照した
https://fukatsu.tech/xcode-multiple
MariaDB: 絵文字を挿入できない時の対策

絵文字を含むストリングを挿入時に次のエラーがでました。

```text
Incorrect string value: '\xF0\x9F\x98\x8A^M...'
```

その時の文字コード

```text
> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb3                    |
| character_set_connection | utf8mb3                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb3                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

## 設定の変更

```text:/etc/mysql/mariadb.conf.d/50-client.cnf
[client]
#
#
default-character-set = utf8mb4
```

MariaDB を再起動

```bash
sudo systemctl restart mariadb
```

設定が変更されたことを確認

```text
> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb3                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

絵文字を含むストリングを挿入できることを確認。
MariaDB: Incorrect datetime value というエラーへの対策

次のエラーが出た時の対策です。

## エラーの状況

```sql
create table cities (id varchar(10) primary key, name text, population int, date_mod timestamp);
insert into cities set id='t3325',name='笠岡',population=741256,date_mod='1969-9-17';
```

実行結果

```text
MariaDB [city]> drop table if exists cities;
Query OK, 0 rows affected (0.187 sec)

MariaDB [city]> create table cities (id varchar(10) primary key, name text, population int, date_mod timestamp);
Query OK, 0 rows affected (0.268 sec)

MariaDB [city]> insert into cities set id='t3325',name='笠岡',population=741256,date_mod='1969-9-17';
ERROR 1292 (22007): Incorrect datetime value: '1969-9-17' for column `city`.`cities`.`date_mod` at row 1
MariaDB [city]>
```

## 解決方法

timestamp を datetime に変更します。

```sql
create table cities (id varchar(10) primary key, name text, population int, date_mod datetime);
insert into cities set id='t3325',name='笠岡',population=741256,date_mod='1969-9-17';
```

実行結果

```text
MariaDB [city]> drop table if exists cities;
Query OK, 0 rows affected (0.142 sec)

MariaDB [city]> create table cities (id varchar(10) primary key, name text, population int, date_mod datetime);
Query OK, 0 rows affected (0.154 sec)

MariaDB [city]> insert into cities set id='t3325',name='笠岡',population=741256,date_mod='1969-9-17';
Query OK, 1 row affected (0.018 sec)

MariaDB [city]>
```
スクラムのメリットデメリットを発注者、受注者からの視点と共に

## 記事の目的
スクラムのメリットデメリットを整理し、適切なプロジェクトの運用形式の選択に役立てるため


## スクラムのメリット：発注者側
```
・プロジェクト開始時に、大規模で不透明な要件定義の対応コストを避けやすい。
・上記に伴って取りがちな開発終盤の不透明なバッファ期間を入れなくて良い
・プロジェクト開始が比較的容易かつ迅速に開始可能
・プロジェクト進行中に、問題点を見つやすい（エンジニアのレベルや仕様の詰めもれ、仕様の認識ずれなど）
・仕様の方向転換も比較的容易
・ユーザーの動向を確認しつつ、実際のレスポンスを用いて方向転換が容易なので、完全な前もった理論作成は必要ない（往々にしてこの理論は実際の市場と乖離するケースはよくある）
・失敗につながるミス（仕様の確定漏れ、メンバーの技術不足、実装工数の大きな見積漏れ）を早い段階で特定できるので、プロジェクト費用の大規模な損失は起こりづらく、コストの早期修正が比較的容易
・開発者のスキルアップが比較的容易
・受注者に実装の約束を取り付けづらい
・工数の予想と現実のずれが比較的起きづらい

## スクラムのデメリット：発注者側
・仕様を走りながら決めたり変更したりするので、ビジネス要件を決めるメンバー（発注者の場合もある）は開発メンバーと同じくらいの負担がかかることがよくある。
・ウォーターフォールのように中盤での暇だったりプレッシャーがない期間は比較的発生しづらい
・予算どりの難易度はウォーターフォールとは大きく異なり、スクラム独自の予算どりの方法を模索、対応する必要がある

```
## スクラムのメリット：受注者側
```
・仕様の認識ずれに伴う、プロジェクト終盤でのエスカレーションが発生しづらい
・リリース手前の炎上が比較的起こりづらい
・持続可能な速度を目標としているので、比較的に、有給を定期的に取りやすい
・プロジェクト開始前などの仕様決めという予算どりが難しい作業が比較的発生しづらい
・問題点の早期洗い出しができる
・変化に柔軟に対応できる
・問題点を早期に、明確に特定しやすいので、エンジニアのスキルアップスピードは比較的高い

```
## スクラムのデメリット：受注者側
```
・エンジニアはお客さんの要望に対して、自身のスキルアップや、開発ルールの適用など、常に進化を行う必要があるので、それはいいところでもあるが、苦労やプレッシャーは確実に存在する
　技術的な進化
　設計力の進化
　仕様把握能力の進化
　コミュニケーション能力の進化
・暇な期間は比較的発生しづらい
・開発者とお客さんとのコミュニケーションはより入念かつ頻繁に行う必要がある
・人の入れ替えや、進化はウォーターフォールよりも望まれる、許容されやすいので、プロジェクト進行中の手間はよりかかる。
・開発状況の透明性を高めるために、状況の報告は明確かつ、より高い透明性を要求される。
```

## まとめ：
```
スクラムはウォーターフォールより完全に優れている、スクラムは楽という認識のたいがいは間違っている。
スクラム独自の苦労を積み重ねて、開発進捗や成果物の透明性を維持し続けることで、初めてスクラム開発の価値がもたらされる。
開発中の成長を行う必要があったり、透明化された問題に対する対応の必要性はむしろスクラムの方が大きい。
（ウォーターフォールは開発中は問題が見えないことが多いので、それがリリース前に発覚し押し寄せやすい）
理不尽に苦労が重なることはスクラムの方が少ないが、苦労がない訳ではなく、毎スプリント、何かしらの苦労と成長のないスクラムチームは、スクラムをしている意味がない。
都度苦労、工夫、成長を重ねなければ、スクラムの価値を体感する間も無く成功しないまま終わる。

苦労が一気に押し寄せず、平たくならされ、常に一定の耐えられるプレッシャーの中走るのが理想的なスクラムチームだと思う
```
Discord BotをGAEで無料でホストするためのTipsをいくつか

## Discord Botのホスト先
Discord Bot楽しいですよね。

というわけで色々動かしておきたいわけですが、実際どこにホスティングするかは結構悩みどころです。

完全無料でやりたい場合によくやられているのは[Glitch](https://glitch.com/)や[Heroku](https://jp.heroku.com/home)だと思いますが、Glitchは[定期的に叩き続けるHackが必要](https://qiita.com/OJII3/items/cf8188b69bc7f00c5fbc)になるのでちょっとトリッキー、Herokuは[無料プランが廃止](https://blog.heroku.com/next-chapter)となるために移行が必要となっています。

というわけで、もうちょいシンプルな方法として、Google Application Engine（GAE）の無料枠内でなんとかする方法を考えましょう。

なお、Discord.jsを前提に書いていますが、他のフレームワークでも基本的な考え方は同じだと思います。

## GAEの無料枠を使う上での制限
GAEの無料枠は一日あたり28時間、なのでずっと動かしていても原理的には問題ありません。ただしこの28時間にはいくつかの制限があります。

### 1. 無料枠が大きいインスタンスではスケーリングが勝手に行われる
無料枠が大きいのは'F'インスタンス（おそらくフロントエンドインスタンス）のみです。
これは一体何かというと、以下の表の通りで **自動スケーリングのみが有効** なインスタンスとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/6816c975-359f-fff6-40a6-1efb1d675aa8.png)
出典: https://cloud.google.com/appengine/docs/standard#instance_classes

自動スケーリングとは何かというと、主に以下の2つの制限になります。

1. アクセスが少ない場合にインスタンスがシャットダウンされる
1. 勝手にインスタンスが入れ替わる



### 2. フロントエンドがないとそもそも立ち上がってくれない
GAEはいわゆるPaaSで、Webサイトをホスティングするものというのがユースケースです。したがって、アプリケーションが正常に立ち上がっているかどうかの確認の一つに、アプリケーションルートが正常に立ち上がっている（アクセスに対し200番を返す）というのが必要になります。

## それぞれの制限の回避方法
### 1. 無料枠でもスケーリングをある程度制御する
無料枠でのスケーリングは基本的には自動スケーリングのみですが、その自動スケーリングに対してある程度の制限をかけることは可能となっています。

以下の公式ドキュメントに記載されているように、`app.yaml` 設定ファイル内に `automatic_scaling` の設定を記述することで、オートスケール時の動作をカスタマイズできます。

https://cloud.google.com/appengine/docs/standard/python/config/appref?hl=ja#automatic_scaling

その中でも重要なのが `min_instances` で、これを指定すると実行されるインスタンス数がこの数を下回りません。つまり、常に **最低一つは起動** していることが保証されます。

ただし、ドキュメントの以下の記載のように、この設定を有効にするにはウォームアップリクエストのハンドリングが必要です。

> 警告: この機能を適正に機能させるには、ウォームアップ リクエストが有効であることを確認する必要があります。また、アプリケーションでウォームアップ リクエストが処理されることも確認する必要があります。

これについてですが、単に常時起動しておきたいだけならあんまり難しいこと考える必要はなく、以下の記事にあるように `/_ah/warmup` にサービスを構えておけば問題はありません。

https://cloud.google.com/appengine/docs/standard/nodejs/configuring-warmup-requests?hl=ja

### 2. フロントエンドをダミーで構える
次にフロントエンドを構えるという点ですが、こちらも要はルートのリクエストに何らかの正常レスポンスを返すようにダミーを構えてやればいいわけです。例えばExpressとかだと以下のように書いておけば問題ありません。

```typescript
  const app = express();
  app.get('/', (_req, res) => {
    res.send('🤖Bot is running!!🤖');
  });
```

## ちょっと厄介な問題
というわけで、比較的簡単にGAEでの無料ホスティングは実現できるのですが、ちょっと厄介な問題が一つ残っており、これは現在の対応（と最後に公開している実装例）では解消できていません。

GAEのF系インスタンスの場合、インスタンスが入れ替わるわけですが、無停止にするために2台が同時に立ち上がっている時間帯が発生します。このとき、Botの種類によっては問題は発生してしまいます。

一般的なDiscord Botは、最近は[Slash Command](https://discordjs.guide/interactions/slash-commands.html#slash-commands) によって処理を起動する場合が多いと思いますが、この場合は複数インスタンスがいても（同時に応答したとしても）、うまいこと単一の処理しか返さないようになっています。

しかし、Discordのメッセージを常に監視し、特定の文字列があった場合などに処理を実行するようなBotの場合、複数インスタンスがいる時は二重応答になってしまいます。

これを止めるには、なんらかのMutex的なものを実装する必要があります（データストア系のサービスを使えばそんなに難しくはないはずですが、、、）

## シンプルな実装例
最後にこの辺の設定を入れたDiscord Botのコードを置いておきます。

https://github.com/yurugengo-supporters/discord-cliche-bot

基本的には、`./app.yaml` と `src/createDummyServer.ts` の二箇所にここで書いている設定は入れてあります。

先述したように、多重起動による多重応答問題は放置してあります。

ちなみに、Organization名とかからもわかるように、これは[ゆる言語学ラジオ](https://yurugengo.com/)の[サポーターコミュニティ](https://yurugengo.com/support)内でちょろちょろと作っているもので（ゆるOSSプロジェクト）、興味ある人はまずはゆる言語学ラジオを聞いてみてください。
ウェブデザイン技能検定2級　令和4年度

自己採点では合格でしたが発表された解答と照らし合わせると学科不合格でした。　

受験手数料高かったので痛い。

1級	学科： 8,000円 ／ 実技： 25,000円 （実技はペーパー実技含む）
2級	学科： 7,000円 ／ 実技： 16,000円　または7,000円（25歳未満の在職者）※
3級	学科： 6,000円 ／ 実技： 8,000円 　または3,000円（25歳未満の在職者
2022/9/4主にITとかセキュリティの記事

明治の海外グループ会社がランサム被害 - 犯行声明も
https://www.security-next.com/139434

明治のグループ会社がランサム感染、10万ドル要求断ると情報公開か(9/2)
https://cybersecurity-jp.com/news/71170

明治HD、シンガポール子会社がサイバー攻撃被害(9/1)
https://www.nikkei.com/article/DGXZQOUC017BZ0R00C22A9000000/

害悪とまで言われる日本特有のメールセキュリティ「PPAP」から企業はどう脱出するか(9/2)
https://atmarkit.itmedia.co.jp/ait/articles/2209/02/news003.html

千葉南房総市にランサムウェア攻撃、身代金払わねば成績表公開と脅迫(9/2)
https://www.zaikei.co.jp/article/20220902/687938.html

2021年のインシデント - 59.3%がランサムウェア・Emotet、デジタルアーツ(9/2)
https://news.mynavi.jp/techplus/article/20220902-2442501/

弊社サーバーへの不正アクセスに関するお知らせ（最終報） 日本ケミコン(9/2)
https://www.chemi-con.co.jp/news/detail.php?id=topics20220902

Instagramの認証バッジめぐるフィッシング詐欺に注意(9/2)
https://japan.cnet.com/article/35192707/

【インタビュー】DGフィナンシャルテクノロジー 篠寛社長「ECサイトのセキュリティー対策は、”コスト”ではなく、”防衛策”」(9/2)
https://news.mynavi.jp/techplus/article/20220902-2442656/

フィッシングなりすましブランドのグローバル調査、日本はau・クレディセゾン・楽天の3つがランクイン(9/2)
https://scan.netsecurity.ne.jp/article/2022/09/02/48132.html

250万人超える学生ローンのデータ流出、悪用された脆弱性は不明(9/2)
https://news.mynavi.jp/techplus/article/20220902-2441288/

Appleの新セキュリティ機能「ロックダウンモード」をオンにすべき理由(8/31)
https://kn.itmedia.co.jp/kn/articles/2208/31/news137.html

あまり知られていないMacのマルウェア対策ソフトが最近さらにアクティブになっている？(9/1)
https://iphone-mania.jp/news-481847/

ランサムウエアと法規制　標的となる前に備えよ(9/2)
https://business.nikkei.com/atcl/NBD/19/00150/082500050/

FF XIVを標的とするQRコード詐欺に注意、アカウント侵害の恐れ(9/2)
https://news.mynavi.jp/techplus/article/20220902-2442485/

米司法省のバイナンスへの調査実態、CZの関与記録提出も要請か(9/2)
https://www.neweconomy.jp/posts/256548

データから見る暗号資産の犯罪利用の実情【コラム】(9/2)
https://www.coindeskjapan.com/159044/

Avalancheサブネットはパブリックチェーン部門でどのように目立ったのか？(9/1)
https://crypto-times.jp/avalanche-coinex-pr/

サプライチェーンリスクへの対策実施済企業は29％、事故発生時の被害額を想定できない企業は27％／タニウム調べ(8/31)
https://dxmagazine.jp/news/research/3XZpL

Webサイト向けLinuxシェア、DebianとCentOSが微減(9/2)
https://news.mynavi.jp/techplus/article/20220902-2442679/

iOS 16まもなく一般公開！実装が期待される注目の新機能総まとめ(9/1)
https://www.lifehacker.jp/article/2209-matome-ios-16-new-function/

分散型金融ｄＹｄＸが部分的本人確認システムを導入　批判も(9/2)
https://vc.morningstar.co.jp/011256.html

ＴｉｋＴｏｋ内で個人情報が収集されていた？　アプリ内、ブラウザ機能の落とし穴　重要な情報は標準アプリで入力を(9/2)
https://www.zakzak.co.jp/article/20220902-IKSM2O2IQBPHTOHOVGNIH3Z6Y4/

TikTokアプリにワンクリックでアカウント侵害できる脆弱性、Microsoft発見(9/2)
https://news.biglobe.ne.jp/it/0902/mnn_220902_8849645575.html

突然現れる偽のセキュリティ警告画面に注意！【消費生活センター情報特急便 2022年9月号】(9/2)
https://www.city.tokyo-nakano.lg.jp/dept/211500/d033146.html

マルウエア対策の裏をかく　サイト・署名・アイコン偽装(9/1)
https://www.nikkei.com/article/DGXZQOUC255H10V20C22A8000000/