OmniAICreator/Qiita-1.07M huggingface dataset:
Tabletの考察

[UI関係のトラブルに戻る](https://qiita.com/Keiji_otsubo/items/cc344223cfa02db6bed7)


+ [Can't see all fields in highlight panel on Tablet](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgDq1SAF)

When viewing record from Desktop and Phone, we're able to see all 7 fields on the linked highlight panel.  But on Tablet we only see 5.  Why is that?

+ Up to ten fields on your compact layout populate the record highlights section at the top of each record view in the Salesforce mobile app. The record highlights section in Lightning Experience uses the first seven fields on the compact layout. However, the number of fields that display can vary based on the width of your screen, which record page is being viewed, and the permissions of the user.

+ コンパクト レイアウトの最大 10 個のフィールドが、Salesforce モバイル アプリの各レコード ビューの上部にあるレコード ハイライト セクションに入力されます。 Lightning Experience のレコードの強調表示セクションでは、コンパクト レイアウトの最初の 7 つの項目が使用されます。ただし、表示されるフィールドの数は、画面の幅、表示されているレコード ページ、およびユーザーの権限によって異なります。


[Compact Layout Limitations and Considerations](https://help.salesforce.com/s/articleView?id=sf.compact_layout_notes.htm&type=5)

どうも障害ではないだろうか？

With the spring 22 release, we are seeing a drastic change on tablets, where only 4 fields from compact layout are visible in the highlights panel. Before this update, we were able to see more fields. Does anyone have a work around for tablet here?
 

+ [Allow more than 4 fields in Lightning Compact Layout](https://ideas.salesforce.com/s/idea/a0B8W00000GdaRbUAJ/allow-more-than-4-fields-in-lightning-compact-layout)

+ [Salesforce Mobile App Considerations forTablets](https://help.salesforce.com/s/articleView?id=sf.salesforce_app_ipad_considerations.htm&type=5)
日本語のパスパラメータをcurlでPOSTするワンライナーを作ってみる

## 概要
パスパラメータ形式のAPIに日本語文字列をPOSTしたい・・
しかし、`curl -X POST ${API_ENDPOINT}/あいうえお`　といった感じでそのまま日本語文字列を埋め込んでリクエストを送ると文字化けしてしまう。

そこで文字列をエンコードした上でリクエストを送信する必要がある。

## コマンド
`http://localhost:3000/:param`というURIに対して、パラメータ部分に日本語文字列を指定してリクエストを送る

```bash
PARAM=$(echo あいうえおかきくけこ | nkf -wMQ | tr = % | tr -d "\n" | tr -s "%%" "%") && curl -X POST http://localhost:3000/$PARAM
```

`nkf -wMQ`
日本語を**Quoted stream**形式でエンコードする
「あ」は`=E3`という形式で表現される。
パスパラメータの場合、`%E3`という形で表現する必要がある

`tr = %`
= を %に置換

`tr -d "\n"`
文字列が長いと改行されてしまうので、改行コードを削除

`tr -s "%%" "%"`
文字列が長いと、**%%** と連続してしまうことがあるので%に置換


## エンコードした文字列を日本語に戻す

エンコードした文字列を日本語に戻したいときは以下のコマンドを実行
```bash
$ echo $PARAM | tr % = | nkf -WmQ

あいうえおかきくけこ
```

`nkf -WmQ`
**Quoted stream** 形式の文字列を解読する

## 参考
https://kazmax.zpp.jp/cmd/n/nkf.1.html

https://linuxcommand.net/tr/

https://www.mtioutput.com/entry/nkf-qpencoding
M1 Mac の VSCode で Azure Functions （.NET）のデバッグ実行に失敗する

回避策が見つかったのでメモっておきます。
M1(~~多分M2も~~) Mac の VSCode では Azure Functions のデバッグ実行はプロセスのアタッチに失敗します。
launch.json に"targetArchitecture": "x86_64"を足すことで動作するようになります。

```json:launch.json
    "configurations": [
        {
            "name": "Attach to .NET Functions",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:azureFunctions.pickProcess}",
            "targetArchitecture": "x86_64"
        }
    ]
```
見つけた issue
https://github.com/OmniSharp/omnisharp-vscode/issues/4900

2023年２月現在、まだ直っていませんね。
https://github.com/microsoft/vscode-azurefunctions/issues/3005

**追記**
M2 Macでは上記設定不要でした。むしろ設定するとエラーになります。
【GAS】Google Calendarに月の予定を一括入力

# 初めに
インターンの出勤予定をGoogle Calendarで記載しようとした時に、毎週決まった時間に入力するなら一括でできないかと思いました。

# 準備するもの
- カレンダーID

# カレンダーIDの取得方法
1. Google Calendarにアクセスし、左側のサイドバーから「マイカレンダー」をクリックします。
2. カレンダーの一覧から、取得したいカレンダーの右側にある三点リーダーをクリックします。
3. 「設定と共有」をクリックします。
4. 「カレンダーの設定」のページが開かれますので、下にスクロールして「カレンダーのID」を確認できます。

# 書いていきます！
今回は2023年3月の月、水、金曜日に9:00~15:00で予定を入れるコード例となります。
必要に合わせて変更してください。

Googlea Apps Scriptに以下コードを貼り付けます。
```
function addSchedule() {
  // カレンダーIDを指定する
  var calendarId = '取得したカレンダーID';

  // 予定を作成する月を指定する
  var year = 2023;
  var month = 3;

  // 月曜日、水曜日、金曜日を取得する
  var days = [];
  for (var day = 1; day < 32; day++) {
    try {
      var date = new Date(year, month - 1, day);
    } catch (e) {
      break;
    }
    if ([1, 3, 5].indexOf(date.getDay()) !== -1) {
      days.push(Utilities.formatDate(date, 'Japan', 'yyyy-MM-dd'));
    }
  }

  // 予定を作成する
  var service = CalendarApp.getDefaultCalendar();
  for (var i = 0; i < days.length; i++) {
    var start = new Date(days[i] + 'T09:00:00');
    var end = new Date(days[i] + 'T15:00:00');
    var event = service.createEvent('予定', start, end, {location: 'リモート', description: 'リモートワーク'});
  }
}

```

実行してご自身のカレンダーに予定が追加されたことを確認してみてください！

# 終わりに
Pythonで同じことをやろうとすると、GCPでアカウントを作成して、プロジェクトを作成して、Google Calendar APIを有効にして、サービスアカウントを取得して...
とかなりめんどくさくて、GASの便利さを実感しますね。

以下に上記のGASのコードと同じ内容のPythonコードを貼っておくので、気になる人は試してみてください！
```
from google.oauth2 import service_account
from googleapiclient.discovery import build
from datetime import datetime, timedelta

# サービスアカウントキーのパス(ご自身のサービスアカウントキーのjsonファイルへのパスに変えてください）
KEY_FILE_LOCATION = 'path/key.json'

# 認証情報の取得
creds = service_account.Credentials.from_service_account_file(KEY_FILE_LOCATION, scopes=['https://www.googleapis.com/auth/calendar'])

# Google Calendar APIのオブジェクトを作成
service = build('calendar', 'v3', credentials=creds)

# 予定を作成する月を指定する
year = 2023
month = 3

# 月曜日、水曜日、金曜日を取得する
days = []
for day in range(1, 32):
    try:
        date = datetime(year, month, day)
    except ValueError:
        break
    if date.weekday() in [0, 2, 4]:
        days.append(date.strftime('%Y-%m-%d'))

# 予定を作成する
for day in days:
    event = {
        'summary': '予定',
        'location': 'リモート',
        'description': 'リモートワーク',
        'start': {
            'dateTime': f'{day}T09:00:00',
            'timeZone': 'Japan',
        },
        'end': {
            'dateTime': f'{day}T15:00:00',
            'timeZone': 'Japan',
        },
        'reminders': {
            'useDefault': True,
        },
    }

    event = service.events().insert(calendarId='ご自身のカレンダーID', body=event).execute()

```
【Go言語】strings.Replace VS strings.NewReplacer 速度比較

文字の置き換えをする際に使う「strings.Replace」と「strings.NewReplacer」について速度比較してみました。

# 実装（hoge→foo、moge→bar）
## strings.Replace

``` go
// 「hogemoge」のスライス1万個
var s = strings.Split(strings.TrimRight(strings.Repeat("hogemoge,", 10000), ","), ",")

func BenchmarkReplace(b *testing.B) {
	for _, v := range s {
		fmt.Println(strings.Replace(strings.Replace(v, "hoge", "foo", -1), "moge", "bar", -1))
	}
}

```

## strings.NewReplacer
``` go
// 「hogemoge」のスライス1万個
var s = strings.Split(strings.TrimRight(strings.Repeat("hogemoge,", 10000), ","), ",")

func BenchmarkNewReplacer(b *testing.B) {
	replacer := strings.NewReplacer(
		"hoge", "foo",
		"moge", "bar",
	)

	for _, v := range s {
		fmt.Println(replacer.Replace(v))
	}
}
```

# 計測（hoge→foo、moge→bar）
## 環境
- go version：1.20.1
- プロセッサ：AMD Ryzen 5 PRO 3500U w/ Radeon Vega Mobile Gfx   2.10 GHz
- RAM：8.00GB
- OS：Windows 10 Home（22H2）

## strings.Replace
１回目：0.446s
２回目：0.449s
３回目：0.436s

## strings.NewReplacer
１回目：0.448s
２回目：0.450s
３回目：0.442s

あれ？strings.NewReplacerの方が速いと思ったけどあまり変わらない。
３つ変換するパターンもやってみる。

# 実装（hoge→foo、moge→bar、huga→baz）
## strings.Replace

``` go
// 「hogemogehuga」のスライス1万個
var s = strings.Split(strings.TrimRight(strings.Repeat("hogemogehuga,", 10000), ","), ",")

func BenchmarkReplace(b *testing.B) {
	for _, v := range s {
		fmt.Println(strings.Replace(strings.Replace(strings.Replace(v, "hoge", "foo", -1), "moge", "bar", -1), "huga", "baz", -1))
	}
}

```

## strings.NewReplacer
``` go
// 「hogemogehuga」のスライス1万個
var s = strings.Split(strings.TrimRight(strings.Repeat("hogemogehuga,", 10000), ","), ",")

func BenchmarkNewReplacer(b *testing.B) {
	replacer := strings.NewReplacer(
		"hoge", "foo",
		"moge", "bar",
		"huga", "baz",
	)

	for _, v := range s {
		fmt.Println(replacer.Replace(v))
	}
}
```

# 計測（hoge→foo、moge→bar、huga→baz）
## strings.Replace
１回目：0.460s
２回目：0.463s
３回目：0.478s

## strings.NewReplacer
１回目：0.452s
２回目：0.454s
３回目：0.447s

若干strings.NewReplacerが優勢に。
さらに各スライスの文字列が大量のケースでもやってみる。

# 実装（hoge→foo、moge→bar、huga→baz）※文字列大量
## strings.Replace

``` go
// 「A × 10000 + hogemoge」のスライス1万個
var s = strings.Split(strings.TrimRight(strings.Repeat(strings.Repeat("A", 10000)+"hogemogehuga,", 10000), ","), ",")

func BenchmarkReplace(b *testing.B) {
	for _, v := range s {
		fmt.Println(strings.Replace(strings.Replace(strings.Replace(v, "hoge", "foo", -1), "moge", "bar", -1), "huga", "baz", -1))
	}
}

```

## strings.NewReplacer
``` go
// 「A × 10000 + hogemoge」のスライス1万個
var s = strings.Split(strings.TrimRight(strings.Repeat(strings.Repeat("A", 10000)+"hogemogehuga,", 10000), ","), ",")

func BenchmarkNewReplacer(b *testing.B) {
	replacer := strings.NewReplacer(
		"hoge", "foo",
		"moge", "bar",
		"huga", "baz",
	)

	for _, v := range s {
		fmt.Println(replacer.Replace(v))
	}
}
```

# 計測（hoge→foo、moge→bar、huga→baz）※文字列大量
## strings.Replace
１回目：27.802s
２回目：26.717s
３回目：30.299s

## strings.NewReplacer
１回目：14.379s
２回目：15.929s
３回目：10.609s

# 結論
長文に対して複数のワードで置換をしたい場合はstrings.NewReplacerが速いっぽい。
長文でなくても２ワード以上置換する場合は見やすいのでstrings.NewReplacerを使っておけば良さそう。
【Ruby】splitメソッドとjoinメソッドについて

## splitメソッドとjoinメソッドについて

splitメソッドと joinメソッドは、文字列を分割したり、分割された文字列を結合するために使用。

## 1. splitメソッド
splitメソッドは、文字列を指定した区切り文字で分割するために使用でき、分割された文字列を要素とする配列を返すことができる。
```ruby:ruby
string = "apple,banana,orange"
fruits = string.split(",")
puts fruits.inspect
#=> ["apple", "banana", "orange"]
```
上記の例では、string変数に `"apple,banana,orange"`という文字列を代入。次に、 splitメソッドを使用して`,`を区切り文字として文字列を分割し、fruits変数に代入。最後に、 putsメソッドを使用して、fruits配列を出力。

## 2. joinメソッド
join メソッドは、配列内の要素を指定した文字列で結合するために使用でき、結合された文字列を返すことができる。
```ruby:ruby
fruits = ["apple", "banana", "orange"]
string = fruits.join(",")
puts string
#=> "apple,banana,orange"
```
上記の例では、fruits変数に文字列を要素とする配列を代入。次に、joinメソッドを使用して`,`を区切り文字として配列の要素を結合し、 string変数に代入。最後に、putsメソッドを使用してstring変数を出力。
gRPCとは？

# はじめに

実務でprotoを使って開発しているのですが、そこで**gRPC通信**という言葉をよく聞きました。「何の話や。。」と思ったので、調べたことをまとめてみます。

# そもそもRPCとは？
以下、[引用](https://e-words.jp/w/RPC.html)
> RPCとは、あるコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェアへ処理を依頼したり、結果を返したりするための規約。

なるほど、よくわからん。

[こちら](https://qiita.com/il-m-yamagishi/items/8709de06be33e7051fd2)の記事の表現がわかりやすかったので引用させていただきます。

> サーバが実装している関数をクライアント側が叩く。逆も然り。

これが正解の表現なのかはわかりませんが、あるコンピュータで動作するソフトウェア(クライアント)から、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するソフトウェア(サーバが実装しているプログラム)を叩くための規約なのかなと解釈しました。

# ではgRPCとは

gRPCは、RPCを実現するためにGoogleが開発したプロトコルのようです。

## 特徴

クライアントアプリケーションが、他端末のサーバーアプリケーションのメソッドを直接呼び出せるため、マイクロサービスや分散アプリケーションを簡単に作成できるというものです。

![gRPCの図](https://grpc.io/img/landing-2.svg)

[公式ドキュメント](https://grpc.io/docs/what-is-grpc/introduction/#overview)から引用

他のコンポーネントとやり取りをするためのIDLとして、Protocol Buffersを利用していますと。(そのためのprotoだったのかと１人で納得)

# まとめ

先人の記事のおかげで理解が深まりました。これで、gRPCの話が出てもビビらない気がします(たぶん)。

# 参考記事

https://grpc.io/

https://qiita.com/oohira/items/63b5ccb2bf1a913659d6

https://e-words.jp/w/RPC.html

https://qiita.com/il-m-yamagishi/items/8709de06be33e7051fd2
🐣【Ruby入門】すごろくゲームを作ってみた🎲

簡易的なすごろくゲームを Ruby で作ってみました。

## 前段
- 今回、クラスを用いた実装を行いたかったので、 Player クラスを用意しました。
  - 「名前」、「サイコロ数」、「ゴール数」を保持するようにしています。
- main.rb では、メッセージやゲームの進行など実装しています。
- 実装を少なく、機能実現を目指したので、色々考慮出来ていないところは温かい目で、、、🥺

## 実装
```ruby:player.rb
class Player
    def initialize(name)
        @name = name
        @dice_number = 0
        @number_up_to_goal = 10
    end

    def add_dice_number(number)
        @dice_number += number
    end

    def get_name
        @name
    end

    def goal?
        @number_up_to_goal <= @dice_number
    end

    def subtract_goal
        @number_up_to_goal - @dice_number
    end
end
```

```ruby:main.rb
# Player クラスを読み込めるようにしておく。
require './player'

# 🎲 呼び出し処理
def roll_dice
    return rand(1..3)
end

puts '-----------------------------',
     'すごろくゲームにようこそ!!🎲', 
     '先に10マス進めた方が勝ちです。', 
     'あなたの名前を教えてください。',
     '-----------------------------'

# gets でユーザーにキーボード入力をさせる
player_name = gets
player_human = Player.new(player_name.chomp)
player_com = Player.new('HOGE')


puts "「#{player_human.get_name}さん。よろしくね。👤」", 
     "「COMは、#{player_com.get_name}さんだよ。👤」"

# 処理内で break を実装しているので loop 処理にしています。
loop do
    puts  '-----------------------------',
          "#{player_human.get_name}さんは、残り#{player_human.subtract_goal}マスです！！", 
          "COMは、残り#{player_com.subtract_goal}マスです！！",
          "#{player_human.get_name()}さんの番です。エンターキーを押してください。",
          '-----------------------------'
    gets

    player_dice_count = roll_dice
    puts "コロコロコロコロ...🎲"
    sleep(1) # サイコロ振っている感じを出すため、 sleep を使用
    puts "#{player_dice_count}が出ました！"
    player_human.add_dice_number(player_dice_count)

    com_dice_count = roll_dice
    puts "COMは、#{com_dice_count}が出ました！"
    player_com.add_dice_number(com_dice_count)

    if player_human.goal?
        puts "#{player_human.get_name}さんの勝ちです！！😆"
        break
    end

    if player_com.goal?
        puts 'COMの勝ちです！！🥺'
        break
    end
end
```

## 実行
```
ruby main.rb

=>
-----------------------------
すごろくゲームにようこそ!!🎲
先に10マス進めた方が勝ちです。
あなたの名前を教えてください。
-----------------------------

=>
「Qiita太郎さん。よろしくね。👤」
「COMは、HOGEさんだよ。👤」
-----------------------------
Qiita太郎さんは、残り10マスです！！
COMは、残り10マスです！！
Qiita太郎さんの番です。エンターキーを押してください。
-----------------------------

=>
コロコロコロコロ...🎲
3が出ました！
COMは、1が出ました！
-----------------------------
Qiita太郎さんは、残り7マスです！！
COMは、残り9マスです！！
Qiita太郎さんの番です。エンターキーを押してください。
-----------------------------

（省略..）
=>
コロコロコロコロ...🎲
1が出ました！
COMは、2が出ました！
Qiita太郎さんの勝ちです！！😆

```

## 所感
- ルールを複雑化にしたり、カード要素や、イベント要素まで機能があると、楽しめるゲームになりそう。機会があれば改良版を実装したいと思います。
- main.rb に関して、メッセージ部分と混在しているので読みにくいなと感じた、メソッド化して、メッセージはメッセージで管理するのがベターな気がする。
YoutubeアプリのミニプレイヤーのようなViewを実装する

普段何気なく使っていたYouTubeアプリですが、そのミニプレイヤーは結構面白い動作をしています。

画像はYouTube Musicのものですが、ミニプレイヤーは具体的には以下のようなものです。

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2763088/daeb9c61-fdc8-1ab5-6f20-8282f3a35009.gif)

YouTubeアプリもほぼ同じような動作です。

ハーフモーダルではなく、下部のタブバーと連動し、同一ビューでサイズを変えて、その内部でパーツのサイズを変えてシームレスにUIを変更しています。

サイズの変更は縦スワイプで行えます。

このViewの実装はどうやるんだろうと思い、いろいろ調べてみたのですが、実装方法やライブラリーをうまく見つけることができませんでした。

でもまあ、見つけられないならしょうがないので、とりあえずガワの部分だけでも実装してみることにしました。

-----------

その結果のソースはこちらで、Playgroundにコピペで動作します。

![名称未設定-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2763088/246927ea-1c0d-0adf-b86f-d2877f29ccbf.gif)

https://gist.github.com/HonmaMasaru/3360426c1e7c2fd09983acaeb9ac3665

-----------

基本的にはジェスチャーの移動量に応じて、オートレイアウトでビューの高さと下マージンを変更する、というものになります。

当初は`frame`でやろうとしていたのですが、下マージンの兼ね合いでY座標の計算が非常に面倒でしたのでオートレイアウトに切り替えたところ、非常にシンプルになりました。

また当初はスワイプを検出する[UISwipeGestureRecognizer](https://developer.apple.com/documentation/uikit/uiswipegesturerecognizer)で良いのかと思っていたのですが、こちらはiOSで既定されているスワイプ動作を行った際に発火するもので、移動量の取得はできないようです。

移動量を取得する際には[UIPanGestureRecognizer](https://developer.apple.com/documentation/uikit/uipangesturerecognizer)を利用する必要があるようです。

L68-
```swift
    /// ジェスチャーの設定
    private func setGestureRecognizer() {
        let recognizer = UIPanGestureRecognizer(target: self, action: #selector(onPanGesture(_:)))
        addGestureRecognizer(recognizer)
    }
```

-----------

今後いろいろ使いまわせるように、極力`MiniPlayerView`内に処理を収めたいという方針でやってみたのですが、結果的に大部分を収めることができました。

こちらはいろいろ調べている最中に見つけたものですが、View内部よりsuperviewでオートレイアウトを設定する、というテクニックは今後いろいろ使えそうです。

L84-
```swift
        // 制約の設定
        translatesAutoresizingMaskIntoConstraints = false
        heightConstraint = heightAnchor.constraint(equalToConstant: minHeight)
        bottomConstraint = bottomAnchor.constraint(equalTo: superview.bottomAnchor, constant: maxMargin)
        NSLayoutConstraint.activate([heightConstraint, bottomConstraint,
                                     leftAnchor.constraint(equalTo: superview.leftAnchor),
                                     rightAnchor.constraint(equalTo: superview.rightAnchor)])
```

-----------

とりあえずView自体の動きだけ試しに実装してみましたが、View内部のUIの動きはオートレイアウトでやっていくことになるでしょう。

タブバーなど外部のUIとの連携はデリゲートなりCombineなどを実装する必要はあり、Viewの継承元クラスとして使えるようにはなっておらず、使い回しは現状できませんが、実際に使う段階で考えたいと思います。
Unityのアニメーション設定について

Unityでアニメーションするとき
AnimatorControllerとAnimationClipを使うのはチュートリアルで分かりますが
FBXについてるアニメーションを制御するときはどうするのかをまとめておきます。

UnityEditor上では
FBXを読み込みAnimatorControllerを作成して同階層に置きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105499/006e780d-7279-338e-f60a-0233b5fdf808.png)
FBXのアニメーションはUnityのAnimationClipに自動変換されます。ただしリードオンリーなのでAnimationClipに完了イベントを設定したいときはFBXのインポート設定からアニメーションクリップ一覧とたどって設定をします。
このためFBXを差し替えるとインポート設定が消えてアニメーションクリップのイベント完了がトリガーされずうまく動かなくなったりするので注意してください。

そもそもFBX素材のインポート設定についてですがFBXデータそのものに値を書き込むとおかしくなります。
なのでUnityではFBXを選ぶとFBX毎にインポート設定欄をインスペクター上に表示して設定はそこに書き込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105499/b6c145d2-39c9-ad68-70ed-2bad89c20d92.png)
またプログラムコード上ではUnityEditorのアニメーションクリップから呼ばれる関数だとわからないので
一目でわかるようにコメントやプレフィックスをつけることをお勧めします。
例:
AnimComp -> AnimCompFromAC
AnimComp -> AnimComp // アニメーションクリップから呼ばれる関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105499/43f17def-de84-9f77-d0f8-3db1edc84f1f.png)

またアニメーション遷移はAnimatorControllerでほとんど制御できるのでFBXのアニメーションクリップを参照して活用しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105499/c8bb2082-21f9-683a-b861-d6c20a1084f2.png)
Xcode iCloudの key-value Storageの使い方





## key-value store

```
UserDefaults.standard
//置き換える

NSUbiquitousKeyValueStore()


```


```

NSUbiquitousKeyValueStore().set("hogehoge", forKey: "key_hoge")

let wantHoge = NSUbiquitousKeyValueStore().string(forKey: "key_hoge")


```
zabbix設定2) zabbix-agent2設定(自身の監視)

zabbix設定1) zabbix-server設定
https://qiita.com/naga_kt/items/cd1f6bc2c529fb8d250a
の続き。
　zabbix5.0をCentOS7にインストールする。

　監視対象のvpsにはagentでなくてagent2をインストールすることにした。agent2はagentでできることは全てできて、他の項目も監視できるということなのでこちらを選んだ。

　ここではzabbix-serverを導入したvps(CentOS7)に対しての導入について述べる。

## zabbix-agent2のインストール

　agent2をインストールする。

~~~linux
# yum install zabbix-agent2
・・・・・・
nstalled:
  zabbix-agent2.x86_64 0:5.0.31-1.el7

Complete!
~~~

　agent2の設定を行う。設定ファイルは/etc/zabbixにある。バックアップを取っておいて設定を変更する。

~~~linux
# cd /etc/zabbix/
# ls -lrt *agent2.conf
-rw-r--r-- 1 root root 24933 Jan 30 17:05 zabbix_agent2.conf
# cp -p zabbix_agent2.conf zabbix_agent2.conf-org
# vi zabbix_agent2.conf
~~~

　ここで次のように設定する。ServerとServerActiveはzabbix-serverがインストールされているサーバのIPを記載する。Hostnameは後でweb上で設定するホスト名だが、ここではデフォルトのZabbix serverのままにしておく。

~~~linux
# diff zabbix_agent2.conf zabbix_agent2.conf-org
80c80
< Server=XXX.XXX.XXX.XXX
---
> Server=127.0.0.1
125c125
< ServerActive=XXX.XXX.XXX.XXX
---
> ServerActive=127.0.0.1
~~~

## zabbix-agent2の起動

　以下のようにして起動し状態を確認する。

~~~linux
# systemctl start zabbix-agent2
# systemctl status zabbix-agent2
● zabbix-agent2.service - Zabbix Agent 2
   Loaded: loaded (/usr/lib/systemd/system/zabbix-agent2.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-02-01 15:46:50 JST; 4s ago
  Process: 17567 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=1/FAILURE)
 Main PID: 17632 (zabbix_agent2)
   CGroup: /system.slice/zabbix-agent2.service
           mq17632 /usr/sbin/zabbix_agent2 -c /etc/zabbix/zabbix_agent2.conf
・・・・・・
~~~

　正常に起動されたことが確認できたら、自動起動設定をしておく。

~~~linux
# systemctl is-enabled zabbix-agent2
enabled
~~~

---

zabbix設定3) zabbix webインターフェースの起動
https://qiita.com/naga_kt/items/7ab82d0648910dde1804
に続く。


---

## 参考記事

・zabbix-agentとzabbix-agent2の違い
Zabbix Agent2のインストール方法 (CentOS 8.X系対応済)
https://changineer.info/server/monitoring/monitoring_zabbix_agent2.html

Zabbix-agent2について
https://www.brainassist.com/ba-online/archives/1609

・zabbix-agent2のインストール
Zabbix 5.0 の Zabbix Agent2 をインストールして監視する(CentOS7)
https://qiita.com/Higemal/items/ff0eb6abc280349900ad
ゼロから始めるVSCode×Docker開発環境構築【Python】

# はじめに
最近仕事でDockerを使った開発が増えてきたので、自宅の開発環境にもDocker開発環境を作るついでに記事にまとめることにしました。
備忘録的にまとめるため一つ一つの詳しい説明は省きます、たくさん優良記事が落ちているので気になった方は各々調べてみてください。
**※VSCodeはインストール済み前提で進めます。インストール手順は以下の記事に記載しています。**

https://qiita.com/kotattsu3/items/30af03266a61ece4740e

# WSLのインストール
コマンドプロンプトを「管理者として実行」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/b302e05a-01d1-b6db-bd0c-79a4f31f75ca.png)
~~~bash:cmd
wsl --install
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/5c1e3c5a-3593-eba2-271c-bc7a40d942cf.png)
PCを再起動すると、自動でUbuntuが立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/9198a9f3-1329-0583-76b8-e91c4a2faad0.png)
ユーザ名とパスワードを設定してUbuntuを閉じます。

# WSLにDockerをインストール
以下の記事に手順を示しています。

https://qiita.com/kotattsu3/items/139e958d02bb87277843


# VSCodeの設定
### 拡張機能 RemoteDevelopmentのインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/5b12bee8-9882-1b09-1066-dd164d282d17.png)

左タブの「リモートエクスプローラー」からWSLターゲットの「Ubuntu」を選んで「WSLへの接続」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/a8cd0e3f-0550-4b96-1f70-ee0207e99f10.png)
新しいウインドウでVSCodeが立ち上がります。

### 便利な拡張機能群のインストール
新しいウインドウの方で拡張機能をインストールします。
参考程度に自分がPython開発の際にインストールしている拡張機能を以下に載せておきます。
更にオススメの拡張機能があれば教えてください。

・autoDocstring
・Black Formatter
・Docker
・Error Lens
・Flake8
・GitHub Theme
・Git History
・GitLens
・indent-rainbow
・isort
・Japanese Language Pack for Visual Studio Code
・Path Intellisense
・Python
・vscode-icons

### 設定の変更
ctrl + , で設定を開きます。

Insert Final Newline: True (ファイル最終行に改行を自動で入れる)
Trim Trailing Whitespace: True (行末尾の空白を自動で削除)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/5d7b3064-9bb4-62aa-30ed-af76f47822d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/5bbb3acc-381c-008f-396e-d025ddc00406.png)

**※拡張機能Black Formatter及びFlake8、isortを適用するには別途VSCodeの設定が必要になります。**

# 最後に
この設定で最低限Dockerを使える環境ができると思います。
もっと良い設定などあればコメントでご指摘していただけると幸いです。
Python : クラスの継承

作成日：20230225
言語：Python

Pythonで、クラスを継承するやり方のメモ。


## 1. 参考リンク


https://commte.net/7413 

https://www.tohoho-web.com/python/class.html


## 2. クラスを継承するサンプルコード


```python:class_inheritance.py
 class BaseClass(): #基底クラス（親クラスとも）。継承元のクラス。
 	def __init__(self, x): #クラスが呼び出されると自動的に呼ばれる関数。
 		#この__init__()は初期化に必要で、ないとコードが動かない。「コンストラクタ」というらしい。
 		self.x = x
 	
 	def base_method(self):
 		return self.x
 
 class InheritedClass(BaseClass): #サブクラス（子クラス）。基底クラスであるBaseClassを引数にする。
 	def __init__(self, x, y):
 	
 		super().__init__(x) #基底クラスのコンストラクタをオーバーライド。日本語で言うと、「基底クラスで定義した__init__を使い回しますよ」という命令。 
 		# サブクラスで__init__を定義すると、基底クラスの__init__が上書きされてしまう。
 		# これを書かないと、基底クラスの__init__は未定義のままになってしまい、例外が発生する。
 		# 今回の場合、self.xが定義できなくなる。
 		
         self.y = y
         
 	# ※ ここで、base_methodはすでに基底クラスから継承されているので、ここで定義する必要がない。便利〜〜！
 	
 	def additional_method(self):
 		return self.y
```

まとまったコードを、ほんの一部だけ仕様を変えて使い回したい時に便利ですね。
これ考えた人めっちゃ頭いいな！ （そして、この感想を書いてる私はめっちゃ頭悪そうだな……）


## 3. メモ

```python:
 super(InheritedClass, self).__init__(x)
```

という書き方も使われているらしい。明示的に「子」クラス名を記入する。意味は super() と同じ。
個人的には、Aという子クラスを定義する時に、Aの内部でAを呼び出しているような気がして、ちょっと変な感じがする。初めて見た時とても混乱したので、備忘のためにメモ。


</br>
</br>

<br/>

__終わり__
Python Flask sessionを使ってECのカートシステムを再現してみた

## tl;dr
* `Flask`の`session`を使うと、`Cookie`に任意の(ハッシュ化される)データを付与することができる
* 今回はECサイトのカートに追加された商品を記録し、カート内アイテム数の表記変更、及び`checkout`時に使用するデータとしている



## what I did
商品の"Add to cart"ボタンを押すことにより、`"/cart/<product_id>"`に`POST`。`session`にカート追加したアイテムを追加して、カートに入っているitems数を`index`に表示している。（htmlのコードは省略)
わかりづらいが、"Add to Cart"ボタンによって右上のカート数が１増えている

**追加前**
![Screenshot 2023-02-25 at 2.10.28 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/25c596b9-a22c-22a7-47ae-4f5508ee380c.png)

**追加後**
![Screenshot 2023-02-25 at 2.10.35 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/a9c80a5a-43fb-9da2-7980-e523b41ef464.png)


install
```
$ pip install Flask-Session
```

```python app.py
from flask import Flask, session
from stripe_csv_to_db import get_item_by_productID as get_item_by_productID


app.secret_key = os.environ.get("Flask_session.secret_key")
app.permanent_session_lifetime = timedelta(hours=3)

@app.route("/", methods = ['GET'])
def index():
    cart_items_number = 0
    if 'cart_items' in session:
        cart_items_number = len(session['cart_items'])      
    products = products_get_data()
    return render_template('index.html', products=products, cart_items_number = cart_items_number)

@app.route("/cart/<product_id>", methods=['POST'])
def add_to_cart(product_id):
    item = get_item_by_productID(product_id)
    session.permanent = True 
    session["id"] = product_id
    if 'cart_items' not in session:
        session['cart_items'] = []
    cart_list = session['cart_items']
    cart_list.append(item[0])
    session['cart_items'] = cart_list
    return redirect("/")
```

## Home work
* Sessionはさまざまな使い方ができそうだが、`HTTP`や`Cookie`を十分に理解しているとは言い難いため、勉強する。まずは[３分間ネットワーク](http://www5e.biglobe.ne.jp/~aji/3min/) あたりを読んで勉強したいと思った。
bit（ビット） とByte（バイト）の違い

## はじめに
bit（ビット） とByte（バイト）という単位がコンピュータの勉強をしているとよく出てくるので、違いとそれぞれの単位についてまとめました。

## 結論

結論から言うと、**8bit ＝ 1Byte** です。
省略形だと、bitの場合は100b、Byteの場合は100Bのように小文字と大文字で区別します。

## bit（ビット）とは
- コンピュータで扱う最小単位。
- 1bitは２進数の一桁（0か１）で表現できる。

## Byte（バイト）とは
- 8bitをくくった単位。
- 半角英数字１文字は１Byteで表現できる。
- 日本語の全角文字１文字は２Byteで表現できる。
- アルファベットを１文字扱うのにちょうどいい単位だったから、8bitをまとめた単位にした。
【Flutter】shared_preferencesでshared_preference_iosが廃止された際のエラー対応

## 事象概要
現在参画しているPJにて[shared_preferences](https://pub.dev/packages/shared_preferences)を2023/02現在の最新(`2.0.18`)に上げたところ、iOSでのみSharedPreferences利用時に以下のようなエラーが吐かれるようになった。

``` 
MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)
```

Androidでは問題無くshared_preferencesが利用できるため原因調査に至った。

## 原因 (恐らく)
### shared_preferencesに依存するiOSライブラリに起因するもの?
[Ver 2.0.16](https://pub.dev/packages/shared_preferences/changelog#2016)でiOSに依存しているライブラリ[shared_preferences_ios](https://pub.dev/packages/shared_preferences_ios)が廃止され、[shared_preferences_foundation](https://pub.dev/packages/shared_preferences_foundation)というライブラリに移行しているが、pub getで取得した依存関係にshared_preferences_iosが残っており、`getAll`関数が見つからないと怒られている可能性がある。

※shared_preferences_iosは既に **DISCONTINUED** となった模様。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410187/7b9fff3c-b26c-03c1-f87a-0c5ab7a863d6.png" width=500>


## 対応策
調べたところ現状以下2点の対応策が候補に挙がり、１で今の所問題無さそうな為1を採用して経過観察することにしました。一応どちらの方法でもエラーは回避できる模様。


### 1. SharedPreferenceのインスタンス生成のタイミングで各OSで`registerWith()`をコール

https://github.com/flutter/flutter/issues/98473#issuecomment-1041895729

### 2. shared_preferencesを2.0.15に固定

https://stackoverflow.com/a/75267901/17725279

`SharedPreferences.setMockInitialValues({});`をセットすると動くよという記事もあるが、流石にこれはテスト用の関数という[公式の記載](https://pub.dev/packages/shared_preferences#testing)もあるので、恐らく誤用な気がします。

https://codehunter.cc/a/ios/flutter-unhandled-exception-missingpluginexception-no-implementation-found-for-method-getall-on-channel-plugins-flutter-io-shared-preferences#:~:text=SharedPreferences.setMockInitialValues(%7B%7D)%3B

## まとめ
Ver 2.0.18の状態で`flutter clean`等を繰り返しても変わらず、本記事投稿に至りました。

もしかするとローカル環境の依存状態に起因している可能性もありますが、
同様の事象が発生した方は一度試してみるといいかもしれません。

或いはこういった対応策が最善ですよ、等あれば是非コメント頂けますと幸いです。

## 参考

https://stackoverflow.com/questions/75264268/swift-compiler-error-xcode-no-such-module-shared-preferences-ios-flutter

https://halzoblog.com/error-bug-diary/20230205-2/

以下は該当エラーのissue一覧

https://github.com/flutter/flutter/issues?q=is%3Aissue+label%3A%22p%3A+shared_preferences%22+MissingPluginException%28No+implementation+found+for+method+getAll+on+channel+plugins.flutter.io%2Fshared_preferences%29+is%3Aclosed
Visual Studio Code上でのAWS SAM CLI ローカルデバッグ方法メモ


* Visual Studio CodeでSAM CLIのデバッグ実行を行う方法についてメモする。



## 事前準備

* VS code 拡張機能のAWS Toolkitをインストールする
* テスト用SAM　CLIアプリを用意する。
  * **[こちらで作成したもの](https://qiita.com/KWS_0901/items/5d8ac7be4934e8ca7a8e)** を流用する。
    * 事前にMySQL(Docker)を起動しておく



## デバッグ設定

* VS Codeのコマンドパレットを開く(Windowsの場合、`Ctrl+Shift+P`)

* 「`AWS:Edit SAM Debug Configuration`」を選択する（SAMデバッグ設定画面が表示される）
    ![sam_debug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/6cbbfe40-d8be-0dbd-f8ab-334d0c842cfe.png)

* 下記項目を設定する

  * **Configuration**

    * `Template Path` : `{YOUR_PROJECT_PATH}/template.yaml`
    * `Resource (Logical Id)` : `HelloWorldFunction`
    * `Runtime` : 各自の環境にあわせる(筆者はPython3.9)

  * **Additional Fields**

    * `Environment Variables`(環境変数):下記JSONを直接指定する※**[こちらで作成したMySQLコンテナ接続先](https://qiita.com/KWS_0901/items/5d8ac7be4934e8ca7a8e)**

      ```json
      {
              "MYSQL_HOST":"db",
              "MYSQL_DATABASE":"test_db",
              "MYSQL_PORT":3308,
              "MYSQL_USER":"mysqluser",
              "MYSQL_PASSWORD":"mysqlpass"
      }
      ```

    * `Docker Network` : `docker.internal`(MySQLコンテナに接続するため)

* 「Save」を押下する（`launch.json`）として保存される

## 実行

* コード中の任意の箇所にブレークポイントを設定する

* 「`Edit SAM Debug Configuration`」コンソールの「`Invoke`」を押下する

  * スクリプトが実行され、ブレークポイント箇所でストップする

  



## 参考情報

* [Configuration options for debugging serverless applications](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/serverless-apps-run-debug-config-ref.html)
AZ-900合格までにやったこと

## 資格概要
こちらをご覧ください。
https://learn.microsoft.com/ja-jp/certifications/exams/az-900/

## 受検背景
去年10-12月にAzureを仕事で触ったので忘れないうちに体系的に学んどこうと思ったので。

## 勉強期間とかけた時間
去年末に受検を思い立つ。
1月中に受けたかったけど予約が取れなかった。
勉強期間は実質1ヶ月くらい。
受検日: 2023/02/25

## 教材と所感
- Microsoft認定資格試験テキスト AZ-900：Microsoft Azure Fundamentals
https://www.sbcr.jp/product/4815610869/
まずこのテキストを1周してざっと全体像をつかむ。ただ内容はこのテキストだけでは足りないので、以下Udemyの講座で補完。

- 合格への近道！Azure Fundamentals AZ-900 試験対策講座
https://www.udemy.com/course/microsoft-azure-az900-video/

- これだけで合格！AZ-900: Microsoft Azure Fundamentals模擬試験問題集（7回分430問）
https://www.udemy.com/course/az-900-microsoft-azure-fundamentals4176/
模試を解いて、苦手なところや理解が足りないところは動画や公式ドキュメントを見る、をひたすら繰り返す。
模試は全て2,3回繰り返し問いたら安定して80%以上取れるようになった。

- Microsoft Azure Virtual Training Days: Fundamentals
https://www.microsoft.com/ja-jp/events/top/training-days.aspx?activetab=a1%3aprimaryr3
教材としてはそんなに使わなかったが、この研修を受ける(ログインする)と試験の無料バウチャーが後日もらえる。


## 結果と今後
試験完了後の得点は865点くらいだった。めでたしめでたし。
次は[AZ-104](https://learn.microsoft.com/ja-jp/certifications/exams/az-104/)を受ける予定。
mysql ユニーク制約での注意事項

mysqlのユニーク制約を使用する際にエラーになったので、注意事項をまとめてみた。

### 大文字や小文字が区別されない
ユニークキーになった値について、大文字小文字が区別されない
下記の３つが同じものと判断され、ユニーク制約違反となる
test
TEST
Test


### 3072bytes(utf8mb4で768文字)より長い文字列のカラムはユニーク制約を掛ける事ができない
ユニークキーには文字数制限がある　
```
例 
CREATE TABLE test_table (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(769) NOT NULL,
    unique(title)
) DEFAULT CHARSET=utf8mb4 ENGINE=InnoDB;

```
【Angular】練習アプリ作成日記(Pythonを入れてみた）

[前記事](https://qiita.com/lacky-lacky/items/afdd6f32156dcc911bc4)
前記事では、練習用アプリを作成に使うDBの選定をしました。
PostgreSQLを利用したいと思います。

# 初めに
簡単に入力してバックエンドからデータを拾って来て
表示するものを作るということから
今回は、バックエンド側をどうするか考えました。
以前、現場でお世話になったのは、フロントがJSで
バックはpythonを使っていたものでしたので、
バックエンド側はpythonを使ってみようと思います。

# pythonをダウンロード
[公式サイト](https://www.python.org/downloads/windows/)からpythonをインストールします。
ダウンロード後、exeファイルを実行します。
インストール後、コマンドプロンプトを開き、
「python」コマンドを入力。
以下の画像の通りに表示されれば、インストール成功です。
※バージョンによって数値は変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991436/277f14e4-44a7-4a11-0546-37f035ad9b13.png)
【注意】
こちらが表示されない場合、考えられる原因は以下の2つです。
- インストール時にAdd Python 3.x to PATH" をチェックしなかった。
- Pythonがインストールされていない。

# pythonを動かしてみました
折角ですので、コードを書いて実行してみます。
```python:practice01.py
print('Hello, world!')
print(1+2)
```
cd コマンドでpyファイルがあるところまで移動しましょう。
そこで実行コマンドを打つと、以下のように結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991436/bc61d50c-ec18-382e-1fed-7dc02ec2685e.png)

とりあえず、これでpythonが無事に入ったことが確認できます。

# 開発用フレームワークを入れてみました
javaにSpringやStrutsのようなフレームワークがあるように、
Pythonにもフレームワークが存在します。
筆者が今回学習用として選んだものは
**Flask** を選びました。

# Flaskとは
pythonのフレームワークの一つです。
軽量なフレームワークとして特徴が挙げられます。
学習用としてもコストが低く、とても使いやすい
フレームワークとして有名です。
作ろうとしているのはあくまで勉強用のアプリケーションなので
Flaskを選んだというのも理由の一つです。

# インストール方法
以下のコマンドをコマンドプロンプトかVSCode上のターミナルで
入力をしてください。
```
pip install flask
```

これで、環境の方は完成しました。
今回作ろうとしている練習用アプリ内では
バックエンド側の処理に利用しようと思います。
イメージとしては、フロントで取ってきた値を
バックエンド側でSQLを返して値を返すイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991436/5e7e5edb-68d0-6457-e5de-366908658616.png)

詳しい処理については後に説明したいと思います。

# 最後に
今回は、pythonとそれを使うフレームワークを入れてみました。

今回はここまでにしたいと思います。
Reactでinputタグに入力した文字列を取得する

# 方法
Reactでinputタグに入力した文字列を取得するには`useRef`を使用します。

# 具体的なコード
下記コードでは「文字列を取得」ボタンを押すとブラウザのコンソールにinputタグに入力した文字列が出力されるコードです。
```react:App.js
import { useState, useRef } from "react";

function App() {

  const textRef = useRef();

  const getText = () =>{
    console.log(textRef.current.value);
  };

  return (
    <>
      <input type="text" ref={textRef}></input>
      <button onClick={getText}>文字列を取得</button>
    </>
  );
}

export default App;

```

# 注意点
下記の記載を忘れないようにしましょう。

・inputタグの```ref```
・buttonタグの```onClick```
Python dotenvでの環境変数設定について

## tl;dr
* 環境変数とは、OSの動作に対して外部から与えられる変数
* DBやAPIのKeyなど人に見せないように(githubにアップされないように)しながら使う方法


## What we did?


Install
```
$ pip install python-dotenv
```

```python app.py
from dotenv import load_dotenv

load_dotenv('{{file name}}')
stripe.api_key = os.environ.get("Stripe_API_KEY")
```
```.env
Stripe_API_KEY = "sk_live_XXXXXXX"
```
```.gitignore
.env
```

上記にて環境変数自体はリモートリポジトリに置いたまま、アプリケーションから参照できるようになった。

## Home work
* 上記はまだ開発環境のため、本番環境の際にどのように設定するかは調べていない
【開発なし？】標準機能でできる見た目の変更【PowerApps】

![Screenshot 2023-02-25 15.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/f6f24de6-74b0-28f1-6d96-133855c81e2f.png)

## 正直、シンプルすぎるモデル駆動型アプリ
お客様にアプリのイメージ画像を見せると **「何か…シンプルですね（笑）」** みたいに言われることが多くないですか？
個人的にはそのシンプルさがいいのになぁと思いながらも「そうですよね〜」と修正することがあります。

## 標準機能内での面白いコントロールをいくつか紹介！！
### 1. 数値入力（2023年4月より非推奨）
![Screenshot 2023-02-25 16.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/451a4b87-57ef-00da-f0ff-2f3d97a06ac4.png)
こちらは整数型の列に使えるコントロールです。
プラスマイナスでマウスのみで数値の増減をすることができます。
もちろん数値のあたりをクリックして手入力も可能です。

### 2. CC-optionset-Name
![Screenshot 2023-02-25 15.45.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/8bc65d9e-3ec3-1b53-a31e-6deb81366727.png)
いい名前がなかったのでアプリからそのままの名前で失礼します。
これ結構好きです！（突然の個人的感想）
これは複数選択肢型の列に使えるもので、リストを開かずに **感覚的に選択** することができます！

応用として、選択肢を一つにした選択肢型の列を作ってボタンのように使っていたこともあります。
例）ボタンを押すとビジネスルールでタブが表示されるなど
### 3. チェックボックス
![Screenshot 2023-02-25 15.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/af9ba0c7-e115-133c-d4e3-1980fe4c3e6a.png)
こちらはどんなアプリにもあるチェックボックス。
**「むかしアプリで使ってたからこれがいい」** という方、続出です。笑
これを見せると喜ばれますが、どんどん画面要件が広がって行くので注意です。
こちらは2つの選択肢型の列で使うことができます
**※複数選択肢では使えません**

### 4. 切り替え
![Screenshot 2023-02-25 15.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/d14272af-e0bf-a94d-48e0-8fb677a56109.png)
こちらも**2つの選択肢型**に使えるコントロールです。
トグルとも言ったりして名前が微妙ですね、、、
ですが、こちらもよく使います！なぜなら**見た目がスタイリッシュ**で横にも文字が出るためです。
iPhoneなどにも採用されているこの見た目が現代人には**直感的に**使える気がします。

### 5. 星評価（2023年4月より非推奨）
![Screenshot 2023-02-25 15.56.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/552382e1-496c-857c-25ab-ec518f9ae352.png)
最後はこちらｗｗｗｗｗ
これは正直使ったことないです。
こちらは整数型の0~5を表すときに使えます。
あまり使わない理由は2つあって下記です。
①ホテルやグルメサイトの評価にあまりに似ているのでビジネスで使うのはちょっとふざけすぎていないかと言う点
②5段階だけで示す必要があり、曖昧な評価になりそうという点

例えば**日報やナレッジの評価**などではさっと曖昧な評価することもあると思うので、
**チェックしましたよ的な使い方**であれば活用できそうかなと。

## コントロールを変更する方法
![Screenshot 2023-02-25 16.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/f96fdd45-8a24-b641-a2ad-111eaaeccdde.png)
フォームのカスタマイズ画面左側よりコンポーネントを引き出してその中のINPUT（入力）からいろんなコントロールを使用できます。


# 最後に
このあたりはどんどん増えているので他の開発者と差をつけられるところでもあります。
こういった細かい気配りから得られる信頼もあるので積極的に活用していきましょう。

# 追記（2023年3月）
https://learn.microsoft.com/ja-jp/power-platform/important-changes-coming#model-driven-app-controls-deprecation
↑何やらこのDocsによると、本記事の数値入力と星評価は4月より非推奨になりいずれ消えてしまうとのことです。

他にもオプションセットと書いています。これは仮説ですが、名前が変わるだけだと思います。
旧：オプションセット
新：選択肢（EN：choice）
選択肢は既に結構前から変更されているので特に問題はないかなと。

今後の動向に注意しましょう。
QC検定　ー　管理図

# 管理図の種類

| 区分 |        種別       | 内容 | 例 |
|:-:|:-:|:-|:-|
|  計量値 |  $\bar{x}-R$管理図 |  平均値と範囲の管理図 | 6時間おきに測定した測定値を1日分(n=4)を群として管理する  |
| ↑  | $\tilde{x}-R$管理図  |  メディアンと範囲の管理図 | ↑  |
| ↑  | x-Rs管理図  | 個々の測定値と移動範囲の管理図  | 1日1回測定した測定値を管理する  |
| 計数値  |  pn管理図 | 不良個数の管理図  |  ロットごとに100個抜き取り検査した時に発見された不良品の数を管理する |
| ↑  |  p管理図 | 不良率の管理図  |  全数検査で毎日発生している良品を管理する |
|  ↑ |  c管理図 | 欠点数の管理図  |  大きさが一定の製品の傷の状況(検出数)を管理する |
| ↑  |  u管理図 |  単位当たりの欠点数の管理図 | 大きさがバラバラの製品の傷の状況(検出数)を管理する  |

# 管理図の書き方

| 種別 | 管理限界線(x) | 管理限界線(R) | 備考 |
|:-:|:-:|:-:|:-|
| $\bar{x}-R$管理図  | 中心線：$\bar{\bar{x}}$ <BR> UCL：$\bar{\bar{x}}+A_2\bar{R}$ <BR> LCL：$\bar{\bar{x}}-A_2\bar{R}$ | 中心線：$\bar{R}$ <BR> UCL：$D_4\bar{R}$ <BR> LCL：$D_3\bar{R}$  | $A_2,D_3,D_4$は計数表から取得<BR>nが6以下のときは、LCLは考えない  | 
| $\tilde{x}-R$管理図  | 中心線：$\bar{\tilde{x}}$ <BR> UCL：$\bar{\tilde{x}}+m_3A_2\bar{R}$ <BR> LCL：$\bar{\tilde{x}}-m_3A_2\bar{R}$ | 中心線：$\bar{R}$ <BR> UCL：$D_4\bar{R}$ <BR> LCL：$D_3\bar{R}$   | $m_3A_2$は計数表から取得  | 
|  x-Rs管理図 | 中心線：$\bar{x}$ <BR> UCL：$\bar{\bar{x}}+E_2\bar{R_s}$ <BR> LCL：$\bar{\bar{x}}-E_2\bar{R}$ | 中心線：$\bar{R_s}$ <BR> UCL：$D_4\bar{R_s}$ <BR> LCL：考えない  | $E_2=2.659,D_4=3.267$  |
| pn管理図  |  中心線：$\bar{pn}$ <BR> UCL：$\bar{pn}+3\sqrt{\bar{pn}(1-\bar{p})}$ <BR> LCL：$\bar{pn}-3\sqrt{\bar{pn}(1-\bar{p})}$   | ―  |  |
| p管理図  | 中心線：$\bar{p}$ <BR> UCL：$\bar{p}+3\sqrt{\frac{\bar{p}(1-\bar{p})}{n}}$ <BR> LCL：$\bar{p}-3\sqrt{\frac{\bar{p}(1-\bar{p})}{n}}$   |  ― |   | 
| c管理図  |  中心線：$\bar{c}$ <BR> UCL：$\bar{c}+3\sqrt{\bar{c}}$ <BR> LCL：$\bar{c}-3\sqrt{\bar{c}}$   |  ― |   |
| u管理図  | 中心線：$\bar{u}$ <BR> UCL：$\bar{u}+3\sqrt{\frac{\bar{u}}{n}}$ <BR> LCL：$\bar{u}-3\sqrt{\frac{\bar{u}}{n}}$  |  ― |   |

# R管理図の郡内変動と群間変動

 $\bar{X}$-R管理図の郡内変動と群間変動の関係は、

全体変動：$\sigma_T^2 = \sigma_{\bar{X}}^2$
郡内変動：$\sigma_w^2= (\frac{\bar{R}}{d_2})^2$
郡間変動：$\sigma_b^2$
※$d_2$は係数表からもとめる。

とすると、$ \sigma_T^2 = \frac{\sigma_w^2}{n} + \sigma_b^2 $ となる。
windowsでiverilog その132

# 概要　
windowsでiverilogやってみた。
練習問題やってみた。
構想編。

# 練習問題
cpuを実装せよ。
fizzbuzzを実行せよ。

# 方針
8bitスタックマシンを作る。
スタックは、深さ8
命令は、12bit固定長
romは、200
ramは、4
outは、8bit パラレル

# 命令セット
|命令コード|ニーモニック	|意味	|stackの状態	|pcの状態|
|:--|:--|:--|:--|:--|
|000|nop	|何もしない。	|変化無し	|1つ増える
|1nn|jp i	|無条件でi番地へ飛ぶ。	|変化無し	|i番地になる。
|2nn|push 1	|stackに整数を積む。	|1個増える	|1つ増える
|3nn|get a	|stackに変数aの値を入れる。	|1個増える	|1つ増える
|4nn|set b	|変数bにstackを入れる。	|1個減る	|1つ増える
|500|out	|stackをそのまま出力する。	|1個減る	|1つ増える
|501|out1	|stackの100の位を出力する。	|変化無し	|1つ増える
|502|out2	|stackの10の位を出力する。	|変化無し	|1つ増える
|503|out3	|stackの1の位を出力する。	|変化無し	|1つ増える
|6nn|if i	|stackが真ならi番地へ飛ぶ。	|1個減る	|場合によりi番地になる
|7nn|if! i	|stackが偽ならi番地へ飛ぶ。	|1個減る	|場合によりi番地になる
|800|dup	|stackにコピーを積む。	|1個増える	|1つ増える
|801|rnd	|stackに乱数を積む。	|1個増える	|1つ増える
|900|drop	|stackを一個減らす。	|1個減る |1つ増える
|ann|call i	|stackへ今の番地を積んでi番地へ飛ぶ。	|1個増える	|i番地になる。
|001|ret	|stack番地へ飛ぶ。	|1個減る	|stack番地になる。
|f00|+	|stack-1,stackの加算を求める。	|1個減る	|1つ増える
|f01|-	|stack-1,stackの減算を求める。	|1個減る	|1つ増える
|f02|*	|stack-1,stackの乗算を求める。	|1個減る	|1つ増える
|f03|/	|stack-1,stackの除算を求める。	|1個減る	|1つ増える
|f04|%	|stack-1,stackの剰余を求める。	|1個減る	|1つ増える
|f05|=	|stack-1,stackの等しいを求める。	|1個減る	|1つ増える
|f06|>	|stack-1,stackの大小を求める。	|1個減る	|1つ増える

# 1から100までのアセンブラ

```
  1
loop  set  a
  100
  get  a
  >
  if  tugi
  get  a
  out3
  out2
  out1
  1
  +
  jmp  loop
tugi jmp  tugi

```

# fizzbuzz

```

  0
  set  a
loop  get  a
  1
  +
  set  a
  get  a
  15
  %
  0
  >
  if  skip2  
  get  a
  5
  %
  0
  >
  if  skip1
  get  a
  3
  %
  0
  >
  if  skip0
  get  a
  out3
  out2
  out1
  drop
  jp  skip3
skip0  'f'
  out
  'i'
  out
  's'
  out
  's'
  out
  jp  skip3
skip1  'b'
  out
  'u'
  out
  'z'
  out
  'z'
  out
  jp  skip3
skip2  'f'
  out
  'i'
  out
  's'
  out
  's'
  out
  jmp  skip1
skip3  get  a
  100
  >
  if  loop
  jmp  0

```


以上。
React NativeでDynamic Linksを設定する際のPod installエラー「The Swift pod FirebaseCoreInternal depends upon GoogleUtilities」の解決方法」

React Nativeでアプリ開発を行う際には、Firebaseを使用することがあります。Firebaseは、ユーザー認証やデータベース管理、通知機能など、多数の機能を提供しています。その中でも、Dynamic LinksはFirebaseの強力な機能の一つであり、アプリ内のコンテンツに対して、スマートにユーザーを誘導することができます。

しかし、React NativeでDynamic Linksを設定する際には、iOSのFirebase SDKを導入する過程で、エラーが発生することがあります。このエラーは、Firebase SDKが依存するGoogleUtilitiesが、モジュールを定義していないために発生します。本記事では、このエラーを解決する方法について説明します。

## 問題の再現方法
以下の手順で、React NativeでDynamic Linksを設定しようとすると、エラーが発生することがあります。

まず、React Nativeプロジェクトのルートディレクトリで、以下のコマンドを実行します。
```
# Install & setup the app module
yarn add @react-native-firebase/app

# Install the dynamic-links module
yarn add @react-native-firebase/dynamic-links

```

次に、以下のコマンドを実行して、iOSのFirebase SDKをインストールします。
```
npx pod-install
```

上記コマンドを実行すると、以下のようなエラーメッセージが表示されます。
```
The Swift pod `FirebaseCoreInternal` depends upon `GoogleUtilities`, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries), you may set `use_modular_headers!` globally in your Podfile, or specify `:modular_headers => true` for particular dependencies. Couldn't install Pods. Updating the Pods project and trying again... Command `pod install` failed.
```

## 原因の解説
このエラーは、Firebase SDKが依存するGoogleUtilitiesが、モジュールを定義していないために発生します。これにより、SwiftからGoogleUtilitiesをimportする際にエラーが発生します。

Firebaseの公式ドキュメントによると、GoogleUtilitiesをモジュールとして使用するには、use_modular_headers!をグローバルに設定するか、modular_headers => trueを特定の依存関係に指定する必要があります。

## 解決策
iOSのFirebase SDKが依存するGoogleUtilitiesが、モジュールとして定義されるように、Podfileに以下のコードを追加します。

```diff
+ pod 'Firebase', :modular_headers => true
+ pod 'FirebaseCore', :modular_headers => true
+ pod 'GoogleUtilities', :modular_headers => true
+ $RNFirebaseAsStatic

end
```
セレクトボックスに４７都道府県を簡単に設定する方法

# 初めに
都道府県って多いですよねぇ。
多くは語りません。今回実装するのは、タイトルの通りです。
行きましょう！

# 実装してみた
まず、gemファイルにこちらをインストールします。
```
gem 'jp_prefecture'
```
https://github.com/chocoby/jp_prefecture


先人の知恵をフル活用しましょう！

後は、ビューでセレクトボックスを作りたいところに
```
f.collection_select :prefecture_code, JpPrefecture::Prefecture.all, :code, :name

```
こちらをぶち込みます！

以上！！先人は偉大ですね。ありがとうございました！

# 参考にしたサイト
https://chocoby.com/blog/2013/02/19/jp-prefecture-gem
【HTML】SEO対策に｜ブロックレベル要素とインライン要素を紹介

# はじまり
　WEBコンサルやWEBマーケティングという言葉を調べるとSEO対策など、気になるので、HTMLのタグを具体的にどういう時に使うのか気になったので調べてみました。

　HTMLには、ブロックレベル要素とインライン要素の2つのカテゴリーがあり、それぞれ異なる目的に使用されます。以下に、主要なブロックレベル要素を一覧で示します。それぞれの要素の説明も添えます。

## h1 ~ h6
　見出しタグです。文書内の見出しを示すために使用されます。h1が最も大きな見出しで、h6が最も小さい見出しとなります。

## p
　段落を示すタグです。文章のまとまりを示すために使用されます。

## ul / ol / li
　リストを示すタグです。ulは順序のないリスト、olは順序付きリストを示し、liは各リストアイテムを示します。

## div
　Divisionの略で、複数の要素をグループ化するために使用されます。汎用的なコンテナとして使用されます。

## section
　文書内の関連するコンテンツをまとめるために使用されます。Webページ内の異なるセクションを示すために使用されます。

## header
　ヘッダー要素を示すタグです。通常、ロゴやナビゲーションなど、ページ上部に表示されるコンテンツを示します。

## nav
　ナビゲーション要素を示すタグです。通常、Webページ内のリンクやメニューなどのナビゲーションを示します。

## article
　Webページ内の独立したコンテンツを示すために使用されます。通常、ブログ記事やニュース記事などの記事の本文を示します。

## aside
　メインコンテンツと関連するコンテンツを示すタグです。通常、Webページのサイドバーや広告などのコンテンツを示します。

## footer
　フッター要素を示すタグです。通常、コピーライト情報や連絡先情報など、ページ下部に表示されるコンテンツを示します。

　上記のブロックレベル要素は、Webページ内のコンテンツを構造化するために使用されます。各要素には独自の目的があり、役割を明確にすることで、WebページのアクセシビリティやSEOの向上など、様々な利点があります。

# まとめ
HTMLのブロックレベル要素とインライン要素には
- h1 ~ h6
- p
- ul / ol / li
- div
- section
- header
- nav
- article
- aside
- footer

　などというタグが用意されている。

　また、上記のタグの意味を理解し正しく配置することで、SEO対策にもつながるので理解しておくといいと言われています。
評価指標入門を読んでみた感想

## 背景
ちょうど最近、日々、評価指標に思いを馳せていたところに、現職の関係で著者の長田さんから今話題の「評価指標入門」の献本をいただきましたので、その時に感じた感想や気になったポイント等をまとめていきたいと思います。
献本自体は電子書籍として頂いたので、PDF形式で保存してパソコンでメモをとりながら読ませていただきました。


## 書籍の概要
[評価指標入門 〜データサイエンスとビジネスをつなぐ架け橋](https://gihyo.jp/dp/ebook/2023/978-4-297-13315-3")

>「評価指標でXXXという最高のスコアが出た！」と喜び勇んで，機械学習モデルが出力してくる予測結果をもとにビジネスを運用したとします。 ところが，ビジネス上のKPIと相関が高い評価指標を選んでいなかったために，KPIの推移を見てみると大した変化がありませんでした。 あるいは「毎日夜遅くまで残業をして，特徴量生成とクロスバリデーションによって評価指標を改善しました！」というデータサイエンティストがいたとします。ところが，KPIの改善のためには そこまで高い評価指標の値を達成する必要ありませんでした。このようなケースでは，データサイエンティストが費やした工数がすべて水の泡となってしまいます。----------（はじめにより）----------



## 読んだ方が良いと思った方
【結論】データサイエンスに関わるすべての人に必見の本だと思いました！

細かいことを述べると、特にこのような人が読んだ方が良いと思いました。
- 本書で述べられるデータサイエンティストとしての考え方や立ち位置は、研究として学術的な新規性を発揮したり、Kaggleのように精度改善するという立ち位置とは違うと思います。ですので、新卒のように新たにビジネスの中でデータを分析していこうという方は、読むとよりクリアに業務のイメージが湧くと思いました。
- あらすじに書かれているようなKPIの話をすでに理解されているようなデータサイエンティストであっても、この本は評価指標の教科書としてすぐに参照したり、人に共有できるという役割もあると思いますので、一冊は手元にあった方が良いと思いました。


## 感想
最初はこの本をいただいた時には、評価指標が網羅的に乗っていて、サンプルコードが載っていたり、各指標の問題点や特徴が列挙されている本なのかなと思っていました。
結果として、確かにそういう教科書的な側面もあったのですが、この本の本質はむしろ具体的な評価指標に入るまでのあらすじ部分（特にビジネスとデータサイエンスを架けるもの、評価指標とKPIの章）だと思いました。具体的には、この本の良いところとしては、「KPI（Key Performance Indicators）の改善」と「モデリングでの改良」を結びつける橋として「評価指標」を位置付けているところだと思います。

書籍内では、そもそもデータサイエンティストが必要とされているのは、ビジネスの数理的な構造を理解した上で、利益を生み出すためにKPIを設定して、次にKPIに沿うような評価指標を設定して、そこからモデリングに進んでいくという手続きを設計が期待されているからだと述べています。また、このKPIと評価指標のギャップをどうやって埋めていくかというのがデータサイエンティストの腕の見せ所であり、評価指標に銀の弾丸はなく、プロジェクトによって臨機応変に設定しておく必要があるとも述べています。

確かに日々業務を行なっていて、データ分析の話はどうしても「どういうアルゴリズムを使って〜」や「こういう特徴量が良くて〜」といったように技術的な側面が強く出てしまいがちだと思います。この本を読んでいると、手段としてそのどうやって解決するかの前に、それを意味あるモデルものとするためにも、目的としてそもそも何を解決するのか？それをどうやって評価するか？というのを一回止まって考えて大枠を決定してから進めるということの重要性を実感します。「目的が先で手段が後」とそれだけを言われると、昔に研究室とかで無限に言われ続けた内容な気もしますが、日々論文や技術書を読んでいたりすると忘れてしまいがちな内容だと思いますので、改めてデータサイエンティストとしての価値を明確化していた点が印象に残りました。

本の内容的に個人的に面白かった点としては、回帰問題の事例を一つ挙げて、よくあるKPIに対して２乗誤差を評価指標に設定したときに生じる問題について論じていた節です。回帰問題の評価指標を２乗誤差を設定するというのはある意味定石だと思っていたので、実際に発生する問題点を具体例ベースで説明されており、身につまされる思いになりました。

本を読んでいて考えた点としては、精度の向上が必ずしもKPIの改善に繋がるとは限らないことを踏まえつつ、経験的に精度改善→KPI改善になるような場合もある気がしていて、その場合は実際の必要性の有無に関わらずそれなりに動いてしまうことがあるので、ビジネスの数理的な構造を理解することの重要さが浸透しにくいところもあるのかなと思いました。また、PoCのフェーズによっては個々のモデルの良し悪しよりもその前の段階として「そもそもそのタスクは最近の技術を使えばどこまでできるの？」という内容が主眼の場合もあり、そもそもモデル間の比較自体が優先度が低いようなプロジェクトもあると思いますので、この部分も実際はそのプロジェクト・フェーズによってまちまちなのかなとも思いました。
もちろん最初から最後まで一貫して必要ないとは全く思わないですが、個人的にはいきなり全てのビジネス構造を理解してから評価指標を進めるというよりも、最初は直感的な評価指標を暫定的な指標として設定して精度改善のタイミングになってきた場合に、改めて考えても遅くはない場合もあるのかなと読んでいて思いました。

いろいろ述べてきましたが、結論としては、このビジネスの数理的な構造を理解して逆算的に評価指標を設定していくことは、データサイエンティストとして働くにあたって切っても切れないプロセスになると思いました。個人的にはこの本をデータ分析に関わるさまざまな人に読んでいただき、作業者の共通理解としてこの本に書かれている内容が頭に入っていると、非常にスムーズに意見交換や方針の決定ができるように思いました。ですので、データサイエンティストはもちろんのこと、それに関わる関係部署の方々にもぜひご一読いただきたい本だな〜と読んでいてしみじみ思いました。


## 最後に
今回は、評価指標入門の献本をいただきありがとうございました。繰り返しますが、本書は大変身につまされる本で、データサインティストを志す人、すでに働いている人、関連部署としてデータサインティストと関わっている人、つまりデータ分析に関わるすべての人に読んでいただきたい本だと思いました。ご興味のある方はぜひ購入を検討していただければと思います。


## 関連レビュー
- [書籍「評価指標入門」の出版に寄せて 〜監修の想い（O・MO・I）](https://blog.hoxo-m.com/entry/2023/02/10/113418)
SREの学習3

SREにおけるDefense-In-Depthについて教えてください。
---
SRE（Site Reliability Engineering）において、Defense-In-Depthは、多層的な防御の原則を指します。つまり、システムを多重に保護することで、単一のセキュリティ対策に依存せず、より強固で信頼性の高いセキュリティ体制を構築することができます。

Defense-In-Depthは、以下のような多層的な防御を含みます。

パーミッション管理：ユーザーに対するアクセス権を管理し、必要な権限のみを与えることで、不正なアクセスを防止します。

ネットワークセキュリティ：ネットワークレベルでの防御策を導入することで、不正なアクセスや攻撃からシステムを保護します。

セキュリティプログラム：定期的なセキュリティ対策を実施することで、システムの脆弱性を特定し、修正することができます。

アプリケーションセキュリティ：アプリケーションレベルでのセキュリティ対策を実施することで、不正なアクセスや攻撃からシステムを保護します。

ハードウェア/ファームウェアセキュリティ：ハードウェアやファームウェアにセキュリティ対策を導入することで、不正なアクセスや攻撃からシステムを保護します。

Defense-In-Depthは、一つのセキュリティ対策に依存しないため、システムが攻撃された場合でも、複数の層の防御があるため、攻撃を防ぐことができます。SREチームは、セキュリティを確保するために、Defense-In-Depthの原則を導入し、システムを多重に保護することが重要です。


SREにおけるCapacity Planningについて教えてください。
---
SRE（Site Reliability Engineering）におけるCapacity Planningは、将来の需要を予測し、必要なリソースを計画するプロセスを指します。これにより、システムが需要に応じてスケーリングできるようになり、サイトの信頼性を高めることができます。

Capacity Planningの主な目的は、以下の通りです。

需要予測：将来の需要を予測し、必要なリソースを計画することで、システムのスケーラビリティを確保することができます。

リソースの最適化：必要なリソースを最適化し、コストを削減することができます。

リスク管理：システムに必要なリソースを提供することで、サービスの中断や遅延を回避し、ビジネスのリスクを最小限に抑えることができます。

SREチームは、以下のステップを実行して、Capacity Planningを行います。

要件の定義：システムが必要とするリソースと要件を定義します。

ベンチマークの実行：システムをベンチマークし、必要なリソースを特定します。

リソースの割り当て：必要なリソースを計画し、割り当てます。

テスト：計画されたリソースを使用して、システムをテストします。

モニタリング：システムのパフォーマンスを監視し、必要に応じてリソースを調整します。

Capacity Planningは、SREチームにとって非常に重要なプロセスであり、正確な予測と計画が、サイトの信頼性を高めるために必要です。
Vue.js3  de Class コンポーネント

# はじめに

※ この文章はベータ版です。

Vue.js3.x では、Classコンポーネントの作成は
(オフシャルには)サポートされていません。
おわり。

ではなく、ノンオフィシャルな方法...もありません...

でした、一昨年(2022年)まで。

# ノンオフィシャルな方法
その名も ...

# vue-facing-decorator
https://facing-dev.github.io/vue-facing-decorator/#/

https://github.com/facing-dev/vue-facing-decorator

Vue.js公式の2.x用Classコンポーネント・ライブラリ
vue-class-component & vue-property-decorator、
ほぼ互換。

vue-class-component & vue-property-decorator
を用いて作成したVue2.x対応Classコンポーネント(ES Class)
のコードベースをほとんど変更することなく、Vue.js3.x に
移行できるはずです。

https://github.com/vuejs/vue-class-component

https://github.com/kaorun343/vue-property-decorator

## 注意点

vue-facing-decorator は 作成した ES Class を(内部で)
Options API での(オブジェクトリテラルの形の)コンポーネント
定義に変換するため、ES Class 内で Composition API を利用
することはできません。

Vue.jsの未来は、Composition APIにあり、
Options API は 後方互換性のために
残されている印象ですので、

vue-facing-decorator の利用は、
継続的に開発されていくプロジェクトなら、
一時的なモノ、と、考え、Composition API
への移行を検討してください、
既にほぼ開発が終了していて、メンテナンス・モード
に入っているプロジェクトなら、新規に追加する
機能については、Compostion APIベースにすることを
検討してください。

## 追記 (2024/01/19)

https://tech.revcomm.co.jp/upgrade-to-vue3-with-vue-facing-decorator

# 最後に
vue-facing-decorator の日本語での紹介記事が
ググってみてヒットしなかった、ので、書いてみました。

Let’s Vue.js