OmniAICreator/Qiita-1.07M huggingface dataset:
React×firebaseでフロント側からドキュメントを削除するボタン設置

react×firebaseでアプリを作っている際、
フロント側からドキュメントを削除するボタンを作成したのですが、
少し躓きかけたのでメモします。

## ドキュメント削除ボタンの実装
```list.js

export const List = ({
  projects,
  setProjects,
  docId,
  deadlineDate,
}) => {
  const navigate = useNavigate();
  useEffect(() => {
    const projectsCollectionRef = collection(db, "projects");
    getDocs(projectsCollectionRef).then((querySnapShot) => {
      setProjects(
        querySnapShot.docs.map((doc) => ({ ...doc.data(), id: doc.id }))
      );
    });
    
    }, );

 
  return (
    <>
※一部省略していますが、ここに一覧が入ります。
↓ここからが削除ボタン↓
                <TableCell>
                  <Button
                    size="small"
                    variant="contained"
                    style={{
                      margin: "5px",
                      fontSize: "12px",
                      padding: "0.3vh",
                      color: "#FFFFFF",
                      background: "#3636B3",
                      "&:hover": {
                        backgroundColor: "#000066",
                      },
                    }}
                    onClick={()=>{
                      alert('削除が完了しました')
                      db.collection("projects").doc(row.id).delete()
                    }  
                    }
                  >
                    削除
                  </Button>
                </TableCell>
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </TableContainer>
    </>
  );
};
```

## useEffectの第二引数
これで試してみたところ、firestoreのコンソール上で該当idのドキュメントが削除されているのは確認できましたが、list.jsの一覧からは削除できていませんでした。

useEffetの第二引数に下記のように[projects]というfirebaseの該当コレクション名を入れると、ドキュメントの削除はすなわち[projects]の値に変化なので、更新されるようになりました。
が、この後、[projects]を第二引数に入れると毎秒データが読み込まれてしまい、ものの数十分で1日の上限に達してしまい、[projects]ではなく[setProjects]を第二引数に入れることで解決しました！
```
useEffect(() => {
    const projectsCollectionRef = collection(db, "projects");
    getDocs(projectsCollectionRef).then((querySnapShot) => {
      setProjects(
        querySnapShot.docs.map((doc) => ({ ...doc.data(), id: doc.id }))
      );
    });
    
    }, [setProjects]);

```

## 参考にしたもの
useEffectについて　　https://www.youtube.com/watch?v=f8iXdpbvvH8&t=903s
[Backspace]を使ったExcelのショートカットキー


## [Backspace]を使ったExcelのショートカットキーって、いくつあるの？

* 混乱しそうなので、整理してみました。

### [Shift]+[Backspace]

* [【機能】練習問題 - アクティブセルと選択範囲の操作(難易度：3)](https://youtu.be/H4tO2BfLyLY)
  + アクティブセルを移動せずに、選択範囲の解除

### [Alt]+[Backspace]

* [【Excel講座】Alt + Backspace の威力を知ってますか？](https://youtu.be/rAnnRIOIXnc)
  + 直前の操作を元に戻す（※ Undo）
  + [Ctrl]+[Z]と同じ結果

> ### __関連：[Alt]+[Enter]__
> 
> + 直前の操作をやり直す（※ Redo）
> + [Ctrl]+[Y]、[F4]と同じ結果

### [Ctrl]+[Backspace]

* [【Excel講座】Ctrl + Backspace の威力を知ってますか？](https://youtu.be/jff9jXscl7E)
  + アクティブセルが表示できるように画面をスクロールする 

> ### __関連：[Ctrl]+[Del]__
>
> * [【Excel講座】データ編集が超高速化する操作テクニック集★](https://youtu.be/8oGtUylyKv4)
>   + 現在、カーソルがある位置から後ろの文字列を削除する
>   + [Ctrl]+[←]/[→]も関連あり
Golang-構造体にあるパスワードなどのセキュリティ情報をログに出力しないようにする方法


構造体をログに出力する際に、パスワードとかのようなセキュリティ情報を出力したくない場合は、方法の一つは `構造体の埋め込み（Embedded）` 特性を利用することです。

構造体の埋め込みの形は、次のような形になります。

```go
type 埋め込み構造体名 struct {
	フィールド名 型名
	フィールド名 型名
}

type 構造体名 struct {
	埋め込み構造体名
	フィールド名 型名
}
```

以下のような例で説明しますと、

`RequestSanitized.Password` は `Request.Password` を上書きすることになります。

`Password`　を出力したくなければ、あえて`RequestSanitized.Password` を空値にすれば良いです。

```go
type Request struct {
	Name   string      `json:"user"`
	Password string `json:"password"`
}

type RequestSanitized struct {
	Request
	Password   string `json:"password"`
}
```

以下、完全なる例です。

```go
package main

import (
	"encoding/json"
	"fmt"

)

type Request struct {
	Name   string      `json:"user"`
	Password string `json:"password"`
}

type RequestSanitized struct {
	Request
	Password   string `json:"password"`
}

func main() {
	request := Request{Name: "wen", Password: "123"}
	requestSanitized := &RequestSanitized{
		Request: request,
	}

	requestSanitizedJson, _ := json.Marshal(requestSanitized)

	fmt.Println(string(requestSanitizedJson)) // {"user":"wen","password":""}
}
```

[Go Playground デモ](https://play.golang.org/p/camyHfxJN2R)

# 元記事

[Golang-構造体にあるパスワードなどのセキュリティ情報をログに出力しないようにする方法](https://aifan.jp/2022/02/27/golang-構造体にあるパスワードなどのセキュリティ情報をログに出力しないようにする方法/)
Git ローカルリポジトリに紐付いているリモートリポジトリを紐付け解除する

# 概要

- Gitにてローカルリポジトリに紐付いているリモートリポジトリの紐付けを解除する方法をメモ的にまとめる。

# 方法

1. まずは下記コマンドを実行して現在紐付いているリモートリポジトリとリモートリポジトリ名を確認する。

    ```terminal
    $ git remote -v
    ```

1. 下記コマンドを実行してローカルリポジトリとリモートリポジトリの紐付けを解除する。

    ```terminal
    $ git remote remove originなどのリモートリポジトリの名
    ```

1. 下記コマンドを実行して何も出力されなければローカルリポジトリとリモートリポジトリの紐付け解除成功

    ```terminal
    $ git remote -v
    ```
40 代おっさんPythonのことを軽く学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## 参考資料

<https://www.udemy.com/course/python-kaizen/learn/lecture/26849736#overview>

## ちょっとした良く使う関数

|関数|内容|
|----|----|
|print()|文字列や数値、変数に格納された値などを標準出力（sys.stdout）に表示する|
|int()|文字列,float型をint型に変換|
|str()|str 関数は引数に指定したオブジェクトを文字列にして取得します|

format()
構文

```python
'str1{}str2'.format(var)
```

## リスト

リスト：任意の型（整数、浮動小数点数、文字列など）のデータを格納できる。要素には順序があり、インデックスを用いて要素を指定できる。リストの要素は変更可能。他のプログラミング言語における「配列」的な使い方をする

例

```python
mylist = [1,2,3,4]
print(mylist)
```

出力結果

```python
[1, 2, 3, 4]
```

### インデックスを指定

リストは左から０から始める番号でインデックスを指定できる

例

```python
mylist = [1,2,3,4]
print(mylist[0])
```

出力結果

```python
1
```

後ろからもインデックスを指定できる。
始まる番号は「-1」から始める

例

```python
mylist = [1,2,3,4]
print(mylist[-1])
```

出力結果

```python
4
```

### リストに使う関数

len() : リストの長さを図る

構文

```python
len(リスト名)
```

append() : リストに追加

構文

```python
リスト名.append(追加する値)
```

## エラー

|エラーコード|内容|
|----------|-----|
|SyntaxError|括弧()やコロン:が足りない場合などのエラー,文法上のエラー|
|TypeError|不適切な型に対して演算や組み込み関数による処理が行われた場合のエラー|
|AttributeError |属性（Attribute）参照に関するエラー|
|IndentationError|インデントが正しくない場合のエラー|
|ModuleNotFoundError|モジュールが見つからないというエラー|
|ImportError|from <モジュール名> import <オブジェクト名（関数名など）>でモジュールに含まれていないオブジェクトをインポートしようとしたときなどのエラー|
|AttributeError|属性（Attribute）参照に関するエラー|
|ValueError|型は合っているが値が適切でない場合のエラー|
|ZeroDivisionError|0で割り算が行われた場合のエラー|
|NameError|名前が見つからなかった場合のエラー\
|IndexError|リストやタプルなどのシーケンスオブジェクトに格納された値を[インデックス]で取得する際に、範囲外の位置（要素数を超えたインデックス値）を指定してしまった場合のエラー|
|KeyError|辞書（dict型）の値をキーを指定して取得する際に、存在しないキーを指定してしまった場合のエラー|
|FileNotFoundError|open()でファイルを読み込む際などに指定したファイルが見つからない場合のエラー|
|FileExistsError|すでに存在しているファイルやディレクトリを作成しようとした場合のエラー|
SPLAについて

# 背景・目的
* AWSでMicrosoft Officeを動かす必要があり、調査した結果をまとめる。
* ここでは、SPLAというライセンスを整理する。

# 内容
## SPLAとは
* Microsoft Service Provider License Agreementの略。
* マイクロソフト製品を使用したサービスを、社外へ提供可能とするライセンスプログラム。
    * ボリュームライセンスの場合は、第三者提供はNG。
* サブスクリプションライセンス
* ライセンスモデルは以下の通り。

| ライセンス単位|ライセンス | 単位 | 備考 |
|:-- |:-- |:-- |:-- |
|サブスクライバー単位 | サブスクライバー アクセス ライセンス (SAL) |各ユーザーまたはデバイスごとに、ライセンスを取得する。 | |
|プロセッサ単位 |プロセッサ ライセンス | 無制限の数のユーザー| |
| コア単位|コア ライセンス (CL)  |  無制限の数のユーザー| |
| ホスト/ゲスト単位|ホスト/ゲスト ライセンス | ホスト向けプロセッサ単位<BR>ゲスト向けインスタンス単位| |


# 考察

# 参考
* https://www.microsoft.com/ja-jp/licensing/licensing-programs/spla-program
* https://aws.amazon.com/jp/windows/resources/licensing/
LambdaPermissionとは何か

# はじめに
Former2でCloudformationテンプレートを作っていたらLambdaPermissionなるものが生成された。
```yaml
LambdaPermission:
        Type: "AWS::Lambda::Permission"
        Properties:
            Action: "lambda:InvokeFunction"
            FunctionName: !GetAtt LambdaFunction.Arn
            Principal: "apigateway.amazonaws.com"
            SourceArn: "**************"
```
身に覚えがないぞ。

# 結論
* コンソールから手動で作成するときは自動で生成されるもの。
* Lambda関数にトリガーをセットする際、トリガーからのInvocateを許可するリソースベースポリシー。つまりこいつがないとトリガーが機能しない。

## 公式を確認
_The AWS::Lambda::Permission resource grants an AWS service or another account permission to use a function. You can apply the policy at the function level, or specify a qualifier to restrict access to a single version or alias. If you use a qualifier, the invoker must use the full Amazon Resource Name (ARN) of that version or alias to invoke the function._

(翻訳)
_AWS::Lambda::Permissionリソースは、AWSサービスや他のアカウントに関数の使用許可を与えるものです。関数のレベルでポリシーを適用するか、修飾子を指定して単一のバージョンまたはエイリアスにアクセスを制限することができます。修飾子を使用する場合、呼び出し側はそのバージョンまたはエイリアスの完全なAmazon Resource Name (ARN) を使用して関数を呼び出す必要があります。_

詰まるところLambdaに付与するリソースベースのポリシー。こいつがあることでAPI GatewayとかからLambdaを呼び出すことができる。

コンソールで手動でやる際には自動で作成されるものだからあまり意識したことなかった。

## 所感
CloudFormation今業務でガッツリ使っているのですが、コンソールだといい感じに自動でやってくれることとか全部自分で指定するのでAWSに対する理解が深まる気がする。

## 参考
[AWS::Lambda::Permission](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html)
[意外と盲点？Lambda関数にトリガーを追加するときはリソースベースポリシーを意識しよう](https://dev.classmethod.jp/articles/lambda-resourcebase-policy/)
【C#】Enumにメソッドを追加する方法(拡張メソッド)

# 前提
今回の記事では都市(City)の列挙体(Enum)から人工(Artificial)を取得したい場合を例とします。

# 拡張メソッドを知らなかった時の実装方法
拡張メソッドを知らなかった時は下記のように実装していました。

```C#:メソッドを使用した例
using System;

namespace ConsoleApp
{
    internal class Program
    {
        static void Main()
        {
            var city = City.東京24区;

            //ここでメソッドに列挙を渡して人工を取得する。
            var artificial = CityEnum.GetArtificial(city);

            Console.WriteLine(artificial);
        }
    }

    public enum City
    {
        東京24区,
        横浜市,
        大阪市,
        名古屋市
    }

    public static class CityEnum
    {
        public static int GetArtificial(City city)
        {
            return city switch
            {
                City.東京24区 => 9_671_000,
                City.横浜市 => 3_725_000,
                City.大阪市 => 2_691_000,
                City.名古屋市 => 2_296_000,
                _ => 0,
            };
        }
    }
}
```

下記で引数に指定された都市列挙体の人工を返すメソッドを実装しています。

```C#:GetArtificialメソッド
public static int GetArtificial(City city)
{
    return city switch
    {
        City.東京24区 => 9_671_000,
        City.横浜市 => 3_725_000,
        City.大阪市 => 2_691_000,
        City.名古屋市 => 2_296_000,
        _ => 0,
    };
}
```

そして、実装した人工取得メソッドに**東京24区**列挙値を渡して人工を取得しています。

```C#:東京24区の人工を取得
var city = City.東京24区;

var artificial = CityEnum.GetArtificial(city);
```

# 拡張メソッドを知っている場合の実装方法
拡張メソッドを知っていると下記のように実装できます。

```C#:拡張メソッドを使用した例
using System;

namespace ConsoleApp
{
    internal class Program
    {
        static void Main()
        {
            var city = City.東京24区;

            //ここでメソッドに列挙を渡して人工を取得する。
            var artificial = city.GetArtificial();

            Console.WriteLine(artificial);
        }
    }

    public enum City
    {
        東京24区,
        横浜市,
        大阪市,
        名古屋市
    }

    public static class CityEnum
    {
        public static int GetArtificial(this City city)
        {
            return city switch
            {
                City.東京24区 => 9_671_000,
                City.横浜市 => 3_725_000,
                City.大阪市 => 2_691_000,
                City.名古屋市 => 2_296_000,
                _ => 0,
            };
        }
    }
}
```

下記で都市列挙体(City)に対して人工を返す拡張メソッドを追加しています。

```C#:GetArtificialメソッド
public static int GetArtificial(this City city)
{
    return city switch
    {
        City.東京24区 => 9_671_000,
        City.横浜市 => 3_725_000,
        City.大阪市 => 2_691_000,
        City.名古屋市 => 2_296_000,
        _ => 0,
    };
}
```

そして、追加した人工取得拡張メソッドを使用して人工を取得しています。

```C#:東京24区の人工を取得
var city = City.東京24区;

var artificial = city.GetArtificial();
```
# 拡張メソッドの追加方法

拡張メソッドを追加するには引数の`City`列挙型の前に`this`をつけるだけです。

```C#:GetArtificialメソッド
//                              ↓ここにthisをつけるとCity列挙型の拡張メソッドになる
public static int GetArtificial(this City city)
{
    return city switch
    {
        City.東京24区 => 9_671_000,
        City.横浜市 => 3_725_000,
        City.大阪市 => 2_691_000,
        City.名古屋市 => 2_296_000,
        _ => 0,
    };
}
```
Ruby で 数独 の２

# はじめに
https://qiita.com/superrino130/items/cd5f2ee742f23c5438bf

前回の記事から一年近くたっていますが、`Numo::NArray`の学習を含めて、久々に取り組みたいと思います。

https://github.com/ruby-numo/numo-narray

# Numo::NArray
```require.rb
require 'numo/narray'
include Numo
```
```new.rb
@banmen = UInt32.zeros(h, w)
```
`XXX.zeros`で、初期値`0` `h`行`w`列の行列を生成します。

```cast.rb
@uramen = NArray.cast(Array.new(h){ Array.new(w){ (1..9).to_a } })
```
`NArray.cast`を使用すると`Ruby`の配列から行列を生成することができます。
ここでは、３次元の行列をイメージします。

![20220301a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/c6c0762b-2756-1086-a7dc-b7ee4641ccf7.png)

初期状態では、1~9のすべての数値の可能性があります。
ここで、角に`3`が設定されたとします。
すると行、列、ブロックの三つで`3`を消すことができます。

![20220301b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/e071b1b6-f601-8f18-3d08-44e3cbffdf73.png)

初期の配置が決まるたびに、積まれたダイスが次々に落とされるイメージをコーディングします。
# 今回のソース
```narray01.rb
require 'numo/narray'
include Numo

h = w = 9
@banmen = UInt32.zeros(h, w)
@uramen = NArray.cast(Array.new(h){ Array.new(w){ (1..9).to_a } })

def mask(h, w, num)
  return if num == 0
  h2 = (h / 3) * 3
  w2 = (w / 3) * 3
  maskarray = @uramen[h, w, 0..].eq(num)
  @uramen[h, w, 0..] *= maskarray            # 数値の設置用マスク
  maskarray = @uramen[h, 0.., 0..].ne(num)
  @uramen[h, 0.., 0..] *= maskarray          # 行のマスク
  maskarray = @uramen[0.., w, 0..].ne(num)
  @uramen[0.., w, 0..] *= maskarray          # 列のマスク
  maskarray = @uramen[h2..h2+2, w2..w2+2, 0..].ne(num)
  @uramen[h2..h2+2, w2..w2+2, 0..] *= maskarray # ブロックのマスク
end

h.times do |i|
  a = gets.chomp.split('').map(&:to_i)
  a.each_with_index do |x, j|
    @banmen[i, j] = x
    mask(i, j, x)
  end
end
```
今回のポイントはマスク処理です。
```maskarray.rb
require 'numo/narray'
include Numo

@uramen = NArray.cast([1, 2, 3, 4, 5, 6, 7, 8, 9])

maskarray = @uramen.eq(3)
p maskarray
# Numo::Bit#shape=[9]
# [0, 0, 1, 0, 0, 0, 0, 0, 0]

@uramen *= maskarray
p @uramen
# Numo::Int32#shape=[9]
# [0, 0, 3, 0, 0, 0, 0, 0, 0]
```
`eq`で等しいとき、`ne`で等しくないとき、`0`と`1`で構成された行列を生成し行列演算を行うことにより、不要な数値を`0`に置換します。
# まとめ
今回は、画像生成で力尽きました。
【AWS】WordPressでSite Guardの設定が効かない対処法

# 経緯
AWSのEC2で構築したWordPressでログインページをデフォルトから変更するためにSite Guard WP Pluginを導入しました。
画面上では有効になるものの、実際にアクセスしてみると以下のような挙動になりました。

- wp-adminにアクセスするとwp-login.phpにリダイレクトされる
- ログインページ変更後のURLでアクセスしようとすると404エラーが返ってくる

ネットで検索すると似たような事象は出てくるものの、解決に繋がりませんでしたが、何とか自己解決したので、同じような状況の人は同じ対処法を試してみてください。

# 原因
### wp-adminにアクセスするとwp-login.phpにリダイレクトされる

SiteGuardの「管理ページアクセス制御」を有効にしないとリダイレクトされるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/3dad1eaa-4119-d91f-f9ff-36c4a492f4d2.png)


### ログインページ変更後のURLでアクセスしようとすると404エラーが返ってくる

SiteGuardの設定を利用するには、mod_rewriteがロードされている必要があるようです。
つまり、.htaccessファイルの設定が有効になっていないと機能しない様子。
実際にSiteGuardの設定を行うと、.htaccessに設定が書き込まれていました。

今回EC2のAMIはBitnamiを使用しましたが、Bitnamiはデフォルトだとこの.htaccessは有効になっていないようです。
そのため、.htaccessが有効になる設定を行う必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/e850a047-f0ad-bd18-7ce7-c7bcd01b391f.png)

# 対処法
.htaccessを有効にするには、httpd.confファイルでWordPressのディレクトリに対して、AllowOverride Allの設定をする必要があります。

ただし、Bitnamiのバージョンによって、このhttpd.confファイルの場所が違うようで苦労しました。
今回私が利用したのは「バージョン 5.9.1-9-r01 on Debian 10」です。(2022-03-01時点でAWSのマーケットプレイスに出てきます）

上記のバージョンだと設定するhttpd.confファイルの場所は下記となります。
（2つありますが、片方だけだと設定反映されなかったため、私は両方設定変更しました。）

- /opt/bitnami/apache2/conf/vhosts/wordpress-https-vhost.conf
- /opt/bitnami/apache2/conf/vhosts/wordpress-vhost.conf

具体的な手順は次の通りです。

1. TeraTerm等でEC2にSSH接続します。
2. 下記コマンドAllowOverride Noneをコメントアウトして、AllowOverride Allを追記する。
    ```bash
    # sudo vi /opt/bitnami/apache2/conf/vhosts/wordpress-https-vhost.conf
      <Directory "/opt/bitnami/wordpress">
        Options -Indexes +FollowSymLinks -MultiViews
        # AllowOverride None
        AllowOverride All
    ```
3. wordpress-vhost.confに対しても同じ設定を行う。
4. 下記コマンドでapacheを再起動する。
    ```bash
    # sudo /opt/bitnami/ctlscript.sh  restart apache
    Restarted apache
    ```

apache再起動後、変更後のURLでログインページが表示されるか確認してください。
ちなみに、もしもの時のためにログイン済みのブラウザは残しておき、別のブラウザで試すというやり方をしたほうがいいと思います。もし上手くいかなかった場合に、ログイン済みの画面から設定を元に戻せるので。
コーディングに役立つchrome拡張機能６選

Googlechromeには様々な拡張機能があり、ちょっとしたものから知っていると知らないとでは効率性が大きく変わるものまで、色々な拡張機能があります。
今回はコーディング作業において経験上これはあった方がいいと感じた拡張機能を紹介していきます。<br>
<h2>PerfectPixel by WellDoneCode (pixel perfect) <br>~ピクセルパーフェクトのお供~</h2>

<a href="https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi" target="_blank">https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi</a><br>
チェックしたいページのデザイン画像を入力すると、ブラウザ画面上に重なるように表示され、透明度などを操作することができます。<br>
これによりデザインと実際コーディングしたページがどれ位ピッタリとあっているか、一目瞭然になります。<br>これを使用しながらchromeの検証機能でマージンなどを調整すれば、効率的にピクセルパーフェクトに近づけられます。<br>ピクセルパーフェクトが必要な案件にはマストなツールだと思います。

<h2>HeadingsMap<br>~ページ内の見出しを一覧にしてチェック~</h2>

<a href="https://chrome.google.com/webstore/detail/headingsmap/flbjommegcjonpdmenkdiocclhjacmbi" target="_blank">https://chrome.google.com/webstore/detail/headingsmap/flbjommegcjonpdmenkdiocclhjacmbi</a>
<br>
ページ内の見出し(h1~h6タグの内容)を一覧にして内容を確認します。<br>
h1~h6タグの順番が変だったり抜けがあるとその部分が赤く表示されます。<br>
チェック時に役立つツールの１つです。

<h2>Alt & Meta viewer<br>~ページ内のmetaとaltが一目でわかる~</h2>

https://chrome.google.com/webstore/detail/alt-meta-viewer/jjcjblcbnjhgjlnclhficglfjedhpjhl
<br>
ページ内のmetaとaltの内容が一目でわかるようになります。<br>
altは対象の画像の上に表示されるのでわかりやすです。<br>
こちらもチェックの際によく使用します。

<h2>HTMLエラーチェッカー<br>
~簡易なhtmlチェッカー~</h2>
https://chrome.google.com/webstore/detail/html%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC/ohdllebchmmponnofchalfkegpjojcaf?hl=ja
<br>
ボタン一つでそのページのhtmlソースをチェックしてくれます。<br>
最終チェックとしてはこころもとないですが、作業中の閉じタグ忘れや構文エラーを見つけて修正するのに役立ちます。


<h2>FireShot <br>~ウェブページ全体をスクリーンショット~</h2>
https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg
<br>
スクリーンショットの拡張機能で、pcのものとは違いwebページ全体を撮影できるところが案件によっては助かります。


<h2>HTML差分(diff)チェックツール<br>
~テスト環境と本番環境のdiffチェックがワンボタンで~</h2>
<a href="https://chrome.google.com/webstore/detail/html-diff-check-tool/fjbonpakihikkocmockbkndhooihpijo" target="_blank">https://chrome.google.com/webstore/detail/html-diff-check-tool/fjbonpakihikkocmockbkndhooihpijo</a>
<br>
ワンボタンで２つのサイトのソースコードの差分チェックができます。<br>
チェックしたいテスト環境と本番環境のURLを登録すれば、ワンボタンで
本番アップ時のdiffチェックが可能になります。<br>
<br>
昔に私が100ページ程の更新案件を担当した際に、1ページごとにいちいち本番環境のソースとテスト環境のソースをdiffチェックサイトに貼り付けて泣きながら作業していたところを、先輩にこれを教えてもらって大助かりした経験があります。<br><br><br><br>
今回は一旦以上になります。ツール一つで作業効率が大幅に変わる可能性があるので、常にこういった情報にはアンテナを貼っておきたいと思っております。<br><br>
少しでもお役に立てられれば幸いです！
今回紹介した以外でおすすめの拡張機能があれば教えていただけると助かります。
【TidalCycles】ある条件式が成り立つ場合のみにエフェクトをかける

# はじめに

TidalCyclesは、Haskellライクなコードによってリズムパターンを生成できるソフトウェアです。
個人的にTidalCyclesで作曲していて、記事も書いているのでこちらもぜひみてください！

https://qiita.com/s2hap/items/620082b82a4bbe475823

# ある条件のサイクル数のときに処理を実行する

公式のドキュメントにいろいろな方法が紹介されています。

http://tidalcycles.org/docs/reference/conditions/

またこれらについて、Qiitaでも詳しく記事を書いているので是非みてください

https://qiita.com/s2hap/items/a77c0a1feaab1696e18c

https://qiita.com/s2hap/items/ad23595151d069f5b463

# ある条件を満たしたときに処理を実行する

ただ、この方法だと、サイクル数起点でしか処理・エフェクトを適用できません。
例えば以下のように「d1,d2だけに同時にローパスフィルタをかける」みたいなことがしたいとします。

```haskell
do
  let
    elem' xs x = elem x xs
    mod' y x = mod x y
  d1
    -- $ (# lpf 400)
    $ ifp ((elem' [0..2]).(mod' 4)) (# up "<0,-5>") (# up "<-1,-3>")
    $ s "house!2 [~ house] ~ house"
    # n 1 # gain 0.5 # room 0.2 # sz 0.8
    # hpf (range 50 300 (slow 4 $ sine)) # pan 0.3
  d2
    -- $ (# lpf 2000)
    $ s "~ ~ ~ tabla" # n (choose [15,3,4,5,10]) # pan rand
  d3
    $ s "click:2*2" # lpf 500 # gain 1.1
```

2つのコメントアウトを外してローパスフィルターをかけるのは面倒なので、例えば以下のような書き方ができると使い勝手がよさそうです


```haskell
do
  let
    lpfOn = 0
    elem' xs x = elem x xs
    mod' y x = mod x y
  d1
    $ ifb (lpfOn==1) (# lpf 400)
    $ ifp ((elem' [0..2]).(mod' 4)) (# up "<0,-5>") (# up "<-1,-3>")
    $ s "house!2 [~ house] ~ house"
    # n 1 # gain 0.5 # room 0.2 # sz 0.8
    # hpf (range 50 300 (slow 4 $ sine)) # pan 0.3
  d2
    $ ifb (lpfOn==1) (# lpf 2000)
    $ s "~ ~ ~ tabla" # n (choose [15,3,4,5,10]) # pan rand
  d3
    $ s "click:2*2" # lpf 500 # gain 1.1
```

letのlpfOnを0から1に変更するだけでd1とd2にローパスフィルターがかかるという仕組みです。

<iframe width="100%" height="450" src="https://www.youtube.com/embed/t-4vpPW_QtU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

ということで、こういうことができるifb関数をつくってみました。以下のコードをBootTidal.hsに追記してTidalCyclesをrebootすればifb関数が使えます。

```haskell
:{
ifb :: (Bool) -> (Pattern a -> Pattern a) ->  Pattern a -> Pattern a
ifb test f p = splitQueries $ p {query = apply}
  where apply st | test = query (f p) st
                 | otherwise = query p st
:}
```
HTML5プロフェッショナル認定 レベル1 試験対策

# 概要
HTML5 と言いつつ、HTML+CSS+JavaScript のお勉強。
レベル1 では、JavaScript の比重は高くない。
Ping-t を解けるようになるまで繰り返す。

# ウェブ問題集
Ping-t のプレミアムコンテンツを解きまくる
https://ping-t.com/modules/premium/index.php

### 料金体系

|利用期間（月）  |料金（円、税込み）  |
|---|---|
|1  |2400  |
|2  |3200  |
|3  |3800  |
|6  |4800  |
|12 |6800  |
|24 |9800  |
|36 |12800 |
FlaskとVue.jsでSPA Webアプリ開発

### 参考記事

https://qiita.com/y-tsutsu/items/67f71fc8430a199a3efd

https://tech-market.org/vue-flask-cooperation/

https://rise-of-kantan.com/2021/07/06/91/

https://webjin.work/install-vue-js-on-ubuntu-16-04-at-npm/

https://xvideos.hatenablog.com/entry/ubuntu-vuejs-env-settings

https://noauto-nolife.com/post/startup-npm-install/

https://rise-of-kantan.com/2021/07/06/91/

https://qiita.com/watataku8911/items/26f2ce546fcd562e4b46

https://qiita.com/Toshiaki0315/items/1ab4e479007bb0f76f06

https://jp.vuejs.org/v2/guide/installation.html
VBA 図形のうち画像にのみ枠線をつけるマクロ

テスト証跡を作成する際、キャプチャした画像をExcelに貼り付けるのですが、枠線がなくて見づらいことがあります。毎回手動で枠線を設定するのが面倒なのでマクロを作りました。

```vb
Public Sub アクティブブックの画像すべてに枠線をつける()
    Dim ws As Worksheet
    Dim shp As Shape
    
    For Each ws In Worksheets  '全シートループ
        For Each shp In ws.Shapes  '全図形ループ
            If shp.Type = msoPicture Then  '図形タイプが画像のもののみ処理
                shp.Line.ForeColor.SchemeColor = vbBlack  '枠線の色
                shp.Line.Weight = 0.5  '枠線の太さ
                shp.Line.Style = msoLineSingle 
                shp.Line.DashStyle = msoLineSolid
            End If
        Next
    Next
End Sub
```
情報セキュリティマネジメント試験 試験対策

# 概要
セキュリティ周りの実務経験がなければ少し取っつきにくいかも。
ビデオ講義を視聴して用語に馴染んでから、勉強を進めるのがオススメ。参考書をざっと読んだら問題集を解きまくる。
過不足ないセキュリティ対策が涵養。厳しくすればするほどよいわけじゃないよ、ということが伝わってくる出題内容。

# ビデオ講義
Udemy - これからの時代に必須！基礎から学ぶ「情報セキュリティ入門」
https://www.udemy.com/course/wakuwaku_security_001/

# 参考書
徹底攻略 情報セキュリティマネジメント教科書 令和4年度
https://book.impress.co.jp/books/1121101070

# 問題集
令和04年 情報セキュリティマネジメント パーフェクトラーニング過去問題集
https://gihyo.jp/book/2021/978-4-297-12419-9
基本情報技術者試験 試験対策

# 概要
たくさんの若者が受験する試験。
実務でそれなりにいじっていれば、知識の漏れを埋めるだけで合格できる。
参考書も問題集も無数にある。問題集を解きながら参考書の内容を頭にたたき込む。
午後試験はクセがある（同じような問題が出る）ので、午後試験の問題集も活用した方が便利。

# 参考書
令和04年 基本情報技術者 合格教本
https://gihyo.jp/book/2021/978-4-297-12405-2

# 問題集
令和04年【上期】基本情報技術者 パーフェクトラーニング過去問題集
https://gihyo.jp/book/2021/978-4-297-12401-4

令和04-05年　基本情報技術者　試験によくでる問題集【午後】
https://gihyo.jp/book/2022/978-4-297-12377-2
HTMLのiframe内のページを切り替える

# やりたいこと
以下のようなページを作りたかったので、備忘録です。分かりにくいですが、左のpage1,2,3を押すと、右側の表示内容がpage1.html,page2.html,page3.htmlの内容に切り替わります。

![Screenshot from 2022-03-01 21-11-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738106/2ab95098-66d3-7fd5-bd22-20aee131ffe3.png)

# 作り方

## HTML
navとdivからなるシンプルなページです。

```html
<!DOCTYPE html>
<html lang="ja">

  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="style.css">
    <title>ページ切り替え</title>
  </head>

  <body>
    <nav>
      <ul>
        <li>
          <a target="target" href="page1.html">page1</a>
        </li>
        <li>
          <a target="target" href="page2.html">page2</a>
        </li>
        <li>
          <a target="target" href="page3.html">page3</a>
        </li>
      </ul>
    </nav>
    <div class="content">
      <iframe src="page1.html" name="target" width="100%" height="100%"></iframe>
    </div>
  </body>

</html>
```

iframeの中で表示する内容は以下のようにしています。page2.html,page3.htmlも同様です。
```html:page1.html
<!DOCTYPE html>
<html lang="ja">

  <head>
    <meta charset="UTF-8" />
    <title>Page 1</title>
  </head>

  <body>
    <h1>Page 1</h1>
    <p>ここはPage1です。</p>
  </body>

</html>
```

## CSS
iframeの線を消したりしています。
htmlタグとbodyタグのheightを100%にしないと、ブラウザ全体表示になりません。

```css:style.css
html {
  height: 100%;
}

body {
  height: 100%;
  margin: 0;
}

nav {
  margin: 0;
  width: 20%;
  height: 100%;
  float: left;
}

.content {
  margin: 0;
  width: 80%;
  height: 100%;
  float: left;
}

ul {
  list-style: none;
}


iframe {
  border: 0;
}
```
【Unity2D】マウスホイールでズームイン/ズームアウトする

# 1.Unityのズームイン・ズームアウトについて
カメラワークで「ズーム」というのはよく使う手段だと思います。
その他のカメラワークも含めて、一度Unityで活用できるカメラワーク全般を学んでおくのは無駄ではありません。この辺について興味がある方は、詳しくは以下の記事をご覧ください

https://ekulabo.com/camera-work-essentials

エクスプラボのtodoさんは「ズーム」というカメラワークについて、Cameraコンポーネントの「Field of View」の値を変更するか、物理カメラの焦点距離である「Focal Length」の値を変更するかの二つの実装方法を、書籍などでお話されています。個人的にはこの意見に賛成です。

# 2.マウスホイールでズーム
今回の話題である、マウスホイールでのズームカメラワークについて、関連するインターネットの記事を捜索すると、このような記事に出会いました。

https://yotiky.hatenablog.com/entry/unity_mousezoom

こちらは、カメラやゲームオブジェクト自体を移動してズームを実装するという、初心者にはとてもわかりやすい方法が示されています。

以上、二つの記事を挙げましたが、上記の方法は2DのUnityで使用できないっぽいので、2D用のズームの実装スクリプトを作成することにしました。

# 3.【本題】マウスホイールでズーム【2D】
スクリプトでどこを変更するのかというと、この部分です↓↓
![zajhajkgdjka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233990/52d03d61-bbcf-ba0a-328f-1ad66a9d9659.png)

実際に数字を変更して、ズーム機能が実装できる余地があることを確認しましょう。

ただし、**ここの数字を0にするとゲーム画面が真っ暗になってしまいます**。
これには理由があるのですが、詳しくは自分でググってみてください～。

ということで、スクリプトです。
こちらのスクリプトの方針として、件の項目に0が入ることをとにかく回避するしています。

```c#:CameraWork.cs
using UnityEngine;

public class CameraWork : MonoBehaviour
{
    private Camera mainCam; //カメラ
    void Start()
    {
        mainCam = Camera.main; //メインカメラを取得
    }
    
    void Update()
    {
        //ホイールを取得して、均しのためにtime.deltaTimeをかけておく
        var scroll = Input.mouseScrollDelta.y*Time.deltaTime*10;
        Debug.Log(scroll);
        
        //mainCam.orthographicSizeは0だとエラー出るっぽいので回避策
        if (mainCam.orthographicSize > 0)
        {
            mainCam.orthographicSize += scroll;
        }
        else
        {
            mainCam.orthographicSize -= scroll;
        }
    }
}
```

このスクリプトを適当なゲームオブジェクトにアタッチしていただければうまくいくかと…。
OSSECの起動コマンドのパスについて

# はじめに
Amazon Linux2にインストールしたOSSECを起動するコマンドについての備忘録
OSSECのインストール手順にご興味のある方は以下の記事を参照ください。
- [Amazon Linux2にOSSECをインストールした（OSSEC-Serverインストール）](https://qiita.com/Diavolo/items/81ce9ecdfca2a7c6b1a4)
- [Amazon Linux2にOSSECをインストールした（OSSEC-Agentインストール）](https://qiita.com/Diavolo/items/2bab537c36203049188d)
- [Amazon Linux2にOSSECをインストールした（OSSEC-Localインストール）](https://qiita.com/Diavolo/items/7a5391578abe5ca67536)

# OSSEC起動コマンドのパス
```
# cd /var/ossec/bin/ossec-control
```

# OSSEC制御コマンド
```
# ls /var/ossec/bin/ossec-control

Usage: /var/ossec/bin/ossec-control {start|stop|restart|status|enable|disable}
```

# OSSEC起動コマンド
```
# /var/ossec/bin/ossec-control start
Starting OSSEC HIDS v3.7.0...
Started ossec-maild...
Started ossec-execd...
Started ossec-analysisd...
Started ossec-logcollector...
Started ossec-syscheckd...
Started ossec-monitord...
Completed.
```
# OSSEC状態確認コマンド
```
# /var/ossec/bin/ossec-control status
ossec-monitord is running...
ossec-logcollector is running...
ossec-syscheckd is running...
ossec-analysisd is running...
ossec-maild is running...
ossec-execd is running...
```
# OSSEC停止コマンド
```
# /var/ossec/bin/ossec-control stop
Killing ossec-monitord ..
Killing ossec-logcollector ..
Killing ossec-syscheckd ..
Killing ossec-analysisd ..
Killing ossec-maild ..
Killing ossec-execd ..
OSSEC HIDS v3.7.0 Stopped
```

# OSSEC状態確認コマンド
```
# /var/ossec/bin/ossec-control status
ossec-monitord not running...
ossec-logcollector not running...
ossec-syscheckd not running...
ossec-analysisd not running...
ossec-maild not running...
ossec-execd not running...
```

# OSSEC再起動コマンド
```
# /var/ossec/bin/ossec-control restart
ossec-monitord not running ..
ossec-logcollector not running ..
ossec-syscheckd not running ..
ossec-analysisd not running ..
ossec-maild not running ..
ossec-execd not running ..
OSSEC HIDS v3.7.0 Stopped
Starting OSSEC HIDS v3.7.0...
Started ossec-maild...
Started ossec-execd...
Started ossec-analysisd...
Started ossec-logcollector...
Started ossec-syscheckd...
Started ossec-monitord...
Completed.
```

# おわりに
今回の記事は以上になります。では、また。
[Blender]3Dオブジェクトを使って２Dキャラクター画像を作る

# 概要
Blenderで作成した３Dオブジェクトを元にして２Dキャラクター画像を作ります。

色々なポーズ、角度、光の具合、色の変化で様々なパターンの２Dキャラ、アニメーション、アイテムが作れると思います。
# 本文
Blenderで3Dオブジェクトを作ります。キャラクター、動物なんでもいいです。今回はハットを用意しました。
![スクリーンショット 2022-03-01 20.34.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/7fb4f70f-7f32-ced0-684b-7b0eaa2c2df3.png)
OutputPropertiesのResolutionX / Yを変更します。出力したいキャラクターのドットサイズを設定します。
![スクリーンショット 2022-03-01 20.33.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/079ef4e0-8a0e-e2ff-1961-0f67c6a6ba83.png)
RenderProperties > Film > Transparentにチェックを入れると背景が透過されます。
![スクリーンショット 2022-03-01 21.41.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/95bfe9c7-f7da-82cf-c35e-998ac95f53ea.png)
最後にRender > Render Imageで出力して、
![スクリーンショット 2022-03-01 20.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/81086c2d-aa01-2e32-2506-dad6a887525b.png)
Image > Saveで完成です。
![スクリーンショット 2022-03-01 20.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/ae17ce60-5cc7-33ee-fb0e-30205457cabd.png)
# 補足
RenderProperties > Freestyleにチェックを入れると出力結果に縁取り線が追加されます。お好みで選んでください:sunny:
![スクリーンショット 2022-03-01 21.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/16896226-a9c1-77db-f0b2-e6e59adcb901.png)
周囲のWiFi通信を見る

# 自分の周りにどのような通信があるか見てみたいと思った・・・
普段，家の中にたくさんのデバイスがあるが，wiresharkを何もしていない設定だと自分のPCの通信しか見ることができません．．
モニターモードを使うことによって，WiFiをキャプチャできるようになります．
# macでの設定
https://www.macupdate.com/app/mac/56809/airtool
↑のサイトでairtoolを導入します．これを導入することによってmacをモニターモードにしたり，チャネルを指定してキャプチャすることが簡単になります．

# airtoolの設定
僕は普段wiresharkを用いています．おそらくパケットキャプチャをする人はほとんどの人が使っている．．．はず？

airtoolsを起動すると画面の上にwifiに似た新しいマークが出てきます．
![054a947477aef10a2c69bc0ffc7be266.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256914/5aa96a7b-e448-737e-943e-3c7318595c66.png)
これをクリックして，preferencesからGeneralのLaunchCaptureInにチェックを入れWiresharkを選択しておくと，自動的にWiresharkが起動してパケットを見せてくれます！

# 次回について
次回はこのパケットの中身をもっとみれるようにする方法について記載する予定です！
BlenderでカメラからISBNを読みとり書影画像を作成する

## カメラからISBNを読みとり書影画像を作成

コマンド1つで、以下のような書影画像を作成します。
対象の本は、カメラからISBNを読み取って認識します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/a3b9f7da-721a-f67c-954f-61bfb428da97.jpeg" width="200">

※ **カメラつきのmac**で確認しています。

## 準備

レンダリングはBlender3.0で行います。
「[Blenderのコマンドサンプル](https://qiita.com/SaitoTsutomu/items/6b70367455f843a979b1)」を参考に、`blender`コマンドと`blender_pip`コマンドを使えるようにしてください。

コマンドプロンプトで、BlenderのPythonに下記のようにインストールします。

```
blender_pip install -U requests openbd opencv-python pyzbar
```

また、`pyzbar`を使うために、下記のようにインストールします。

```
brew install zbar
```

書影のモデルや実行するためのPythonコードは、blenderのファイルに記述して、下記のSketchfabに用意しました。「Download 3D Model」をクリックし、「Original format (blend)」のDOWNLOADを押してください。

- [Set book image from ISBN](https://skfb.ly/oqqQX)

解凍した中の、`set-book-image-from-isbn/source/load_book.blend`を使います。
※ Pythonのコードは上記ファイルに記述されています。

書影を作りたい本を用意してください。

## 書影作成

コマンドプロンプトで下記を実行してください。カメラがアクティブになるので、ISBNのバーコードをカメラに見せてください。日本のISBNは、978ではじまります。192ではじまるバーコードではISBNを取得できないので、カメラに見せるときに指で隠してください。

```
blender -b -y load_book.blend --python-expr '__import__("bpy").ops.object.capture()' -o ./ -F JPEG -f 0
```

数秒ほどでカレントディレクトリに`0000.jpg`というファイルに書影が作成されます。

### オプションの説明

- `-b`：バックグラウンド実行
- `-y`：blenderファイルのPythonコード実行時に確認を省略
- `--python-expr コード`：コードを実行
- `-o パス`：画像の出力パス
- `-F フォーマット`：画像の出力形式
- `-f フレーム番号`：レンダリングするフレーム

※ `blender`コマンドの引数の順番通りに処理されます。

## 参考

- [BlenderでISBNから書影の自動作成](https://qiita.com/SaitoTsutomu/items/d9debb55020bd4a765d1)
- [BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

以上
VMware Cloud on AWS環境でストレッチクラスタを作成してみた (#2 後編 - 4ホスト構成)

# 1. はじめに
「[VMware Cloud on AWS](https://www.vmware.com/jp/products/vmc-on-aws.html)」でストレッチクラスタを作成したので、備忘録を前編と後編にまとめます。
後編である本稿は、前編で作成した「2ホスト構成のストレッチクラスタ」をスケールアップする手順、vCenterからみた構成画面をご紹介します。

前編では、ストレッチクラスタの概要、「2ホスト構成のストレッチクラスタ」の作成手順、vCenterからみた構成画面、および2ホスト構成における同時稼働可能な仮想マシン台数の制約についてご紹介しました。

https://qiita.com/sanjushi003/items/90e878528ef3526d5ba4

ストレッチクラスタの概要は下図もご参考ください。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/79fb4bc1-7167-7980-49e7-ed2584bc137c.png)
> Amazon Web Services ブログ [「VMware Cloud on AWSの耐障害性設計に関する考慮事項とベストプラクティス」](https://aws.amazon.com/jp/blogs/news/resiliency-design-considerations-and-best-practices-for-vmware-cloud-on-aws/)から図を引用

# 2. 2ホスト構成のストレッチクラスタを4ホスト構成にスケールアップする
## 対象のSDDCを確認する
対象のストレッチクラスタが所属するSDDCを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/b3d41f80-8b04-67d3-9912-1879bcb95c27.png)

## 対象のSDDCに対して、「Add Hosts」を実施する
「Actions..」から「Add Host」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/e51cb1b7-f2f3-2a45-a4fc-f0b22561f4d2.png)

## 2ホスト追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/cb38d495-12f4-e28b-cbc1-22627ad249fd.png)
> 一度4ホスト構成のストレッチクラスタからにした後、2ホスト構成のストレッチクラスタへの変更はできないのでご注意ください。

## 4ホスト構成のストレッチクラスタなったことを確認する
4ホスト構成となったことに伴い、コンピュートリソースが増加していることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/046e1d63-4450-4a3f-c37d-d9fff37b1b15.png)

## 36台の仮想マシンをPower-Onできることを確認する
前編ではエラーとなりPower-Onできなかった、36台目の仮想マシンが4ホスト構成のストレッチクラスタではPower-Onしていること確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/5652a950-3c57-6c19-7194-2678b9720ce7.png)

# 3. さいごに
前編、後編でVMware Cloud on AWSのストレッチクラスタ構成にかかる各種考慮事項、vCenterからみた構成画面、スケールアップ手順についてご紹介しました。

2018年にストレッチクラスタのプレビューがアナウンスされてから、さまざまなリージョンで正式にサポートされていき、ストレッチクラスタの最小ホスト数が6ホストであった頃を経て、最小4ホストとなり、現在では最小2ホストでストレッチクラスタが構成できるようになりました。

ますます多くのユースケースに対応し、さらに進化していくVMware Cloud on AWSに今後もご興味を持っていただければ幸いです。

VMware Cloud on AWSの進化の歴史については次をご参照ください。
[「VMware Cloud™ on AWS リリース ノート」](https://docs.vmware.com/jp/VMware-Cloud-on-AWS/0/rn/vmc-on-aws-relnotes.html)

# 4. 参考記事

https://qiita.com/sanjushi003/items/90e878528ef3526d5ba4

https://qiita.com/sanjushi003/items/175aad0ccdbb3488bfda
Chart.jsで凡例を消したりとかツールチップに単位を表記したりとか

Chart.jsを使っていて、仕様変更によって少しハマったので覚え書き。結論から言えば**公式のドキュメントを読むだけで解決**しましたが…

公式サイトは以下。

http://www.chartjs.org/

ドキュメントは以下から。

https://www.chartjs.org/docs/latest/

# ダメな例

『Chart.js 凡例 非表示』とかで適当にググると、以下のような感じの例コードが出てくる。

```html:exsample.html
<canvas id="myChart"></canvas>
<script>
	let chart = new Chart(document.getElementById("myChart"), {
		/* --- 省略 --- */
		options: {
			legend: {
				display: false
			}
		}
	});
</script>
```

あるいは『Chart.js ツールチップ 単位』とかで適当にググると、やはり以下のような感じの例が出てくる。

```html:exsample.html
<canvas id="myChart"></canvas>
<script>
	let chart = new Chart(document.getElementById("myChart"), {
		/* --- 省略 --- */
		options: {
			tooltips: {
				callbacks: {
					label: function (tooltipItem, data) {
						return data.labels[tooltipItem.index] + ": "
						+ data.datasets[0].data[tooltipItem.index]
						+ " %";	// 単位を付ける
					}
				}
			}
		}
	});
</script>
```

しかし残念なことに、**どっちも動かない。**

## なぜダメなのか→仕様が変わった模様

最初に凡例を消そうとして出来ず、「とりあえず置いとこう」でツールチップに単位を付ける方法をググってやはり出来なかったので、こらダメだと思い、英語がまるでダメなのでDeepL片手に公式ドキュメントを読む。
理由はすぐに分かったが、

[凡例](https://www.chartjs.org/docs/latest/configuration/legend.html) -> Namespace: `options.plugins.legend`
[ツールチップ](https://www.chartjs.org/docs/latest/configuration/tooltip.html) -> Namespace: `options.plugins.tooltip`

とあり、ともにプロパティの名前空間が変わっていた訳である。


# 新しいやり方

ともに `options.plugins` に移動しているため、基本的にはそっちに移動すればよい。

## 凡例の非表示

```html:exsample.html
<canvas id="myChart"></canvas>
<script>
	let chart = new Chart(document.getElementById("myChart"), {
		/* --- 省略 --- */
		options: {
			plugins: {			// pluginsの中に
				legend: {
					display: false
				}
			}
		}
	});
</script>
```

## ツールチップに単位を付ける

こちらを実装する場合はコールバック関数を利用するのだが、引数が1つになっているので、以前のままコピペでは正常に動かない。
ツールチップで他にも何かしらする場合、目的のデータやプロパティがどこにあるか先に確認してから実装しよう。
ただ、受け取るデータを見てみると以前よりもスマートになっているので分かりやすくなった印象。

```html:exsample.html
<canvas id="myChart"></canvas>
<script>
	let chart = new Chart(document.getElementById("myChart"), {
		/* --- 省略 --- */
		options: {
			plugins: {			// pluginsの中に
				tooltip: {		// プロパティ名の『s』が抜けて『tooltip』になっている点に注意
					callbacks: {
						label: function(context){	// 引数は1つ
							let label = context.label || '';
							if (label) {
								label += ': ';
							}
							if (context.formattedValue !== null) {
								label += context.formattedValue + '%';	// 単位
							}
							return label;
						}
					}
				}
			}
		}
	});
</script>
```


# 公式のドキュメントはちゃんと読もう、という話だった

ダメな例でもとくにエラー等も出ずハマりそうな内容なので、このページがググった人の助けになることを祈りつつ。

巷に出回っている情報はたいていChart.js Ver 2の時代（？）のものがほとんどな模様で、ググっても時間を浪費するだけな可能性が高いです。当たり前ですが公式読めば一発解決しました。

こういうドキュメントは丁寧な英語で書かれているので、DeepLならとてもしっかり翻訳してくれます。
筆者みたく英語が苦手な人でも何とかなりますので、公式のドキュメントはちゃんと読みましょう。
Androidの双方向データバインディングで`cannot be inverted, so it cannot be used in a two-way binding`を解決する

# はじめに
最近、Jetpack Composeばっかりやっていたのですが、久しぶりにxmlをやって思い出そうということで復習がてら勉強していたのですが、そこで双方向データバインディングをやろうとした時に、`cannot be inverted, so it cannot be used in a two-way binding`このエラーで少しだけ時間がかかったので、今回はこれを解決してみます。

# 原因
原因はシンプルでした。
僕は、今まで単方向しか書いたことがなかったのでViewModelで以下のような書き方をしていました。

```kotlin
private val _username = MutableLiveData<String>()
val username: LiveData<String> = _username

private val _password = MutableLiveData<String>()
val password: LiveData<String> = _password
```

しかしこれで双方向をやろうとすると、、、、、

```
The expression 'viewmodelUsername.getValue()' cannot be inverted, so it cannot be used in a two-way binding

Details: There is no inverse for method getValue, you must add an @InverseMethod annotation to the method to indicate which method should be used when using it in two-way binding expressions
```

こんな感じのエラーが出てきました。ネットで調べてもなかなか解決策が出てこなかったのですが、以下のように書くことで、このエラーを解決できました。

```kotlin
val username = MutableLiveData<String>()

val password = MutableLiveData<String>()
```

# DataBindingに関して
そもそも双方向データバインディングをどのようにやるのかに関しては、他にもたくさん記事があるので、今回は省略します。以下僕が勉強した時に参考にしたサイトです。

https://zenn.dev/kmd_htsh0226/articles/8579dff07c6f4ed84576
https://qiita.com/naoi/items/29c16746fa0fe9e8355d
【注意】POSIX awk は日本語文字 (UTF-8)を正しく扱うことが出来ません

## はじめに

**補足** UTF-8 を期待通りに扱える awk の実装もあります。

- 扱える: gawk、Solaris (`/usr/xpg4/bin/awk` と `/usr/bin/awk`）
- 扱えない: mawk、original-awk、busybox awk、macOS、FreeBSD 12.0、NetBSD 9.0、OpenBSD 6.6

## 論より証拠

環境は Ubuntu 20.04.2。`original-awk` とは `nawk` のこと

```console
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 gawk '{ print length($0) }'
5
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 mawk '{ print length($0) }'
15
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 original-awk '{ print length($0) }'
15
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 busybox awk '{ print length($0) }'
15
```

```console
$ echo あいうえおかきく | LC_ALL=ja_JP.UTF-8 gawk '{ print substr($0,4,3) }'
えおか
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 mawk '{ print substr($0,4,3) }'
い
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 original-awk '{ print substr($0,4,3) }'
い
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 busybox awk '{ print substr($0,4,3) }'
い
```

```console
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 gawk '{ gsub(/./, "[&]"); print }'
[あ][い][う][え][お]
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 mawk '{ gsub(/./, "[&]"); print }'
[][][][][][][][][][][][][][][]
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 original-awk '{ gsub(/./, "[&]"); print }'
[][][][][][][][][][][][][][][]
$ echo あいうえお | LC_ALL=ja_JP.UTF-8 busybox awk '{ gsub(/./, "[&]"); print }'
[][][][][][][][][][][][][][][]
```

## こんな状態でも POSIX 準拠だという事実

POSIX は C ロケール（別名 POSIX）以外のロケールを規定していません。しかしロケールを追加することは認めています。追加したロケールでの挙動は決まってないのでどのような動きであっても POSIX 違反にはなりません。

なぜ POSIX で C ロケール以外が規定されていないのかというと、どのようなロケールを実装するかは「OS で自由に拡張して良い」と定義するのが標準規格としては最善の選択で[^1]、さらに少なくとも POSIX 策定当時の 1988 年（シェルとコマンドは 1992 年）時点で、移植性があると認められたロケール（つまりどこでも使えるロケール）が C しかなかったからだと思われます。ちなみに UTF-8 の誕生は 1992 年、公式発表は 1993 年です。

[^1]: POSIX で「ja_JP.UTF-8 を実装しなければならない」と決めてしまうと、ja_JP.UTF-8 を実装してない Unix が POSIX 準拠にならなくなって OS ベンダーを困らせてしまいます。しかし「最低限実装しなければいけないのは C (POSIX) だけ、あとは自由な拡張にまかせる」と決めれば OS ベンダーは困らない上に OS ベンダーが思いついた拡張機能の実装を妨げることがありません。これが POSIX 流の考え方です。

POSIX で C.UTF-8 を標準化しようという提案は、ついこの間の 2022年1月11日 にされたばかりです（[0001548: Addition of a POSIX.utf-8 locale (likely as 7.3 "POSIX.utf-8 locale")](https://www.austingroupbugs.net/view.php?id=1548)。反応はまだないようです。

## さいごに

この事実は（どの環境でも同じように動く）**移植性がある方法で  UTF-8 を扱う awk コードを書くのは困難**であることを意味しています。awk 用の UTF-8 ライブラリでも作れば可能かもしれませんが。

UTF-8 文字列を正しく扱いたい場合は gawk を使いましょう。もしくは UTF-8 をサポートしている他のコマンドや言語を使いましょう。

**FAQ(?)** なんでロケールにちゃんと対応しないの？ ⇒ ロケールにちゃんと対応すると挙動が変わって互換性問題が発生しますからねぇ
パスの確認に便利なPowerShellのワンライナー

## パスに誤りがないか確認したい！

* 資料にファイルのパスを記載しているが、見直すのが面倒だ。
* パスが大量にあって、確認が間に合わない。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/87328085-2f17-05d8-6aaa-874980895660.png)

## PowerShellのワンライナー

* テキストファイルにパスをまとめて記載できれば、自動化できます。

``` powershell
# 前提：PathList.txtにファイルのパスが記載されている
Get-Content .\PathList.txt | ForEach-Object {Test-Path $_}
```

## 実行例

``` powershell
cd C:\Users\OneDrive\デスクトップ
Get-Content .\PathList.txt | ForEach-Object {Test-Path $_}
True
True
True
False
True
True
True
True
False
True
```

## 簡単な解説

|コマンド|処理内容|
|:-|:-|
|`Get-Content`|テキストファイルから1行ずつ文字列を取得します|
|`ForEach-Object`|反復処理です<br>`% {Test-Path $_}`と短く記述することも可能|
|`Test-Path`|パスの有効/無効を、True/Falseで判定します|
CSS Grid Layout の minmax() は auto-fill かどうかで文法が異なる 

タイトルの通りなのですが、たびたび忘れてしまうのでメモ代わりに。
なお、[日本語版のMDN](https://developer.mozilla.org/ja/docs/Web/CSS/minmax())の記述は微妙に間違っている。[英語版](https://developer.mozilla.org/en-US/docs/Web/CSS/minmax())は正しい記述だが、下記のことは説明されていない、と思います。

## grid-template, grid-auto-columns, grid-auto-rows などで使う場合

`repeat(i, ...)`で使う場合もこちら。

```
grid-template: minmax( 
                 [ 100px | 100% | min-content | max-content | auto ],
                 [ 100px | 100% | 1fr | min-content | max-content | auto ]
);
```

fr単位を使えるのは、max側だけ。

---

## repeat(auto-fill, ...) の中で使う場合

`auto-fit`も同様。

```
grid-template: repeat(auto-fill, minmax( 
                 [ 100px | 100% ],
                 [ 100px | 100% | 1fr | min-content | max-content | auto ]
));
```

または、

```
grid-template: repeat(auto-fill, minmax( 
                 [ 100px | 100% | min-content | max-content | auto ],
                 [ 100px | 100% ]
));
```

のどちらか。

つまるところ、

- fr単位を使いたいなら、min側はコンテンツ依存にできない。
- 片方をコンテンツ依存にしたいなら、もう一方は長さを固定しなくてはいけない。

ということかと思います。

---

## 仕様へのリンク

[7.2.3.1. Syntax of repeat() | CSS Grid Layout Module Level 2](https://drafts.csswg.org/css-grid/#funcdef-repeat)
wordpressで投稿者アーカイブを無効化する方法

WordPressで投稿者アーカイブを無効化するためのメモ。

WordPress管理画面から「外観」→「テーマエディター」→「function.php」に以下のコードを記述

----------------------------------
function disable_author_archive( $query ){
  if( !is_admin() && is_author() ){
    $query->set_404();
    status_header( 404 );
    nocache_headers();
  }
}
add_action( 'parse_query', 'disable_author_archive' );



[IT未経験からの転職なら未経験ＩＴ転職ラボ](https://www.programming-school-choice.com/ "未経験ＩＴ転職ラボトップ")
Amazon Linux2にインストールしたOSSECの起動をpsコマンドで確認した

# はじめに
[前回記事](https://qiita.com/Diavolo/items/512688e12f73b2dfeb02)の続きです。psコマンドでプロセスを確認した結果をメモします。
OSSECのインストール手順にご興味のある方は以下の記事を参照ください。
- [Amazon Linux2にOSSECをインストールした（OSSEC-Serverインストール）](https://qiita.com/Diavolo/items/81ce9ecdfca2a7c6b1a4)
- [Amazon Linux2にOSSECをインストールした（OSSEC-Agentインストール）](https://qiita.com/Diavolo/items/2bab537c36203049188d)
- [Amazon Linux2にOSSECをインストールした（OSSEC-Localインストール）](https://qiita.com/Diavolo/items/7a5391578abe5ca67536)

# メモ
```
# ps -aef | grep ossec
ossecm    4274     1  0 09:16 ?        00:00:00 /var/ossec/bin/ossec-maild
root      4278     1  0 09:16 ?        00:00:00 /var/ossec/bin/ossec-execd
ossec     4282     1  0 09:16 ?        00:00:01 /var/ossec/bin/ossec-analysisd
root      4287     1  0 09:16 ?        00:00:00 /var/ossec/bin/ossec-logcollector
root      4290     1  0 09:16 ?        00:00:11 /var/ossec/bin/ossec-syscheckd
ossec     4294     1  0 09:16 ?        00:00:00 /var/ossec/bin/ossec-monitord
root      5533  3543  0 10:25 pts/0    00:00:00 grep --color=auto ossec
```

# おわりに
今回は以上です。では、また。
【Linux】dateコマンドで日付フォーマットの変更及び日付計算の方法

Linuxのdateコマンドで日付計算をすることがあったので、調べた内容を自分の備忘録として残しておく。

# dateコマンドとは
「date」コマンドは指定したフォーマットの日付や時刻を表示します。

構文は以下の通りです。

```
date [オプション] [フォーマット]
```

## dateコマンドのオプション
以下に「date」コマンドで使用できる主なオプションを紹介します。

|  オプション  |  説明  |
| ---- | ---- |
|  -d  |  指定したオプションで日時を取得する  |
|  -s  |  日時を設定する  |
|  -u  |  協定世界時を取得する  |
|  +format  |  指定した形式で日時を取得する  |

## dateコマンドのフォーマット
以下は指定できる主なフォーマットの種類となります。

|  書式  |  説明  |
| ---- | ---- |
|  %Y  |  西暦4桁（1970〜）  |
|  %y  |  西暦下2桁（00〜99）  |
|  %m  |  月（01〜12）  |
|  %b  |  月の省略名（Jan～Dec）  |
|  %B  |  月名（January 〜 December）  |
|  %d  |  日（01〜31）  |
|  %H  |  時（24時間形式、00〜23）  |
|  %I  |  時（12時間形式、01〜12）  |
|  %M  |  分（00〜59）  |
|  %S  |  秒（00〜59）  |
|  %s  |  UTCからの時刻（1970-01-01 00:00:00からの秒数）  |
|  %a  |  曜日の省略名（Sun, Mon, Tue, Wed, Thu, Fri, Sat）  |
|  %A  |  曜日名（Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday）  |
|  %u  |  曜日（1：月曜日 〜 7：日曜日）  |

# 現在の日時
dateコマンドでフォーマット指定して、現在の日時を出力する例になります。

```
$ date "+%F"                      #年月日を出力
2022-02-28

$ date "+%T"                      #時分秒を出力
22:37:49

$ date '+%Y/%m/%d %H:%M:%S'       #年月日と時分秒を出力
2022/02/28 22:40:13
```

# 前日（1日前）・翌日（1日後）
指定した形式で日時を取得するには「-d」オプションを使用します。
例えば、1日前や1日後の日付を取得したい場合は以下のように記述します。

前日

```
$ date -d '1 day ago' '+%Y/%m/%d %H:%M:%S'
2022/02/27 08:39:33

#数値を負数（-）にして前日を指定
$ date -d '-1 day' '+%Y/%m/%d %H:%M:%S'
2022/02/27 08:40:48

#「'1 day ago'」の代わりに「yesterday」を指定
$ date '+%Y-%m-%d' -d 'yesterday'
2022-02-27
```
翌日
```
$ date '+%Y-%m-%d' -d '1 day'
2022-03-01

$ date '+%Y-%m-%d' -d '1 days'
2022-03-01

#「'1 day'」の代わりに「tomorrow」を指定
$ date '+%Y-%m-%d' -d 'tomorrow'
2022-03-01
```

# 任意の月の月初日
出力フォーマットを指定するときに、日付部分を「 01 」とします。

```
$ date '+%Y-%m-01' -d '-2 months'
2021-12-01
$ date '+%Y-%m-01' -d '-1 months'
2022-01-01
$ date '+%Y-%m-01'
2022-02-01
$ date '+%Y-%m-01' -d '1 months'
2022-03-01
$ date '+%Y-%m-01' -d '2 months'
2022-04-01
```

# 任意の月の月末日
月末は「月初（ある月の 1 日）」の「 1 日前 」として求めます。

```
$ date +'%Y%m%d' -d"1 month ago `date +'%Y%m01'` 1 days ago"  #先々月末
2021/12/31
$ date +'%Y%m%d' -d"`date +'%Y%m01'` 1 days ago"          　　#先月末
2022/01/31
$ date +'%Y%m%d' -d"1 month `date +'%Y%m01'` 1 days ago"　　　#今月末
2022/02/28
$ date +'%Y%m%d' -d"2 month `date +'%Y%m01'` 1 days ago"  　　#来月末
2022/03/31

```

# まとめ
今回は以上になります。
dateコマンドは日付を取得するのに便利なコマンドですので、この機会に使い方をよく理解しておきましょう。
もしdateコマンドの使い方を忘れてしまったら、この記事を参考にしてくださいね。
ASTERIA WarpでのKintoneファイルアップロード後の反映にタイムラグ

【事象】
以下のようなケースの場合、Kintoneにアップロードしたファイルを参照できない様子。

【ケース】
ASTERIA WarpからKintoneにPDFをアップロード。その直後に後続処理でKintoneのアップデートしたPDFファイルを取得(KinoneGet)する。
　※デバックするとファイルが参照できるが、手動起動やバッチ起動だとうまくいかない

【対応策】
KintoneにPDFをアップロード後にスリーブを入れる。
※そもそもアップデートするPDFが手元にあるのだから、後続処理でKintoneのPDF参照する必要がないのでは、、、とも思えるが

【背景（※ざっくりと）】
Kintone、Adobe Sign、ASTERIA Warpを使用して契約書管理をしている。
・Kintone
　⇒Excelプラグインを使用し、Excelライクに契約の一覧、各契約書のステータスが把握できるようにしている。

・Adobe Sign API
　⇒Kintoneの記載された内容をもとに契約書送付、契約書ステータス情報取得している。
　　※電子印鑑としてリマインド機能があるのでAdobe Signを使用

・ASTERIA Warp
　⇒Kintoneにボタン配置し、Adobe Sign APIの実行（契約書送付、契約書ステータス取得、締結済みの契約書PDFをKintoneにアップロードなど）している。

上記の環境の中、締結済みの契約書PDFをBoxに保管する方針となった。
Box保管にはいつ締結した契約書かを確認できるように年月でフォルダ分けし、日次バッチでBoxに保管する。

日次バッチ処理では、「契約書のステータスを更新」「締結済み契約書のBox保管」を行っており、以下の通りの処理を実施する。
１．「契約書のステータスを更新」：Kintoneに記載のある契約書のステータスを更新し、ステータスが締結済みであれば、Adobe Sign APIで契約書をPDFで取得し、Kintoneにアップロードする。
２，「締結済み契約書のBox保管」：Kintoneに締結済みでKintoneにPDFファイルが存在し、Boxに保存していない契約はBoxにアップロードする。

「契約書のステータスを更新」はKintoneからのボタン押下で複数の契約書管理Kintoneから呼び出される共通処理として内包されているので【Adobe Sign AI から取得したPDF】をそのままBoxにアップロードしすることができなく、Kintone上のPDFをBox保管しようとして今回のケースに遭遇。

【あとがき】
このような処理はデバックすると期待通りの処理ができ、手動起動やバッチ起動だとうまくいかないので混乱する方もいるかと思い記載しました。