OmniAICreator/Qiita-1.07M huggingface dataset:
protovalidate を試す

こんにちは。Enabling team の山本です。

2023年6月2回目は、[connect-go](https://connect.build/) の [protovalidate](https://github.com/bufbuild/protovalidate) についてです。

https://github.com/bufbuild/protovalidate

弊社では、現在、新サービスにおいて gRPC を使った開発を行っています。

今回新たに公開された protovalidate の設定と実装方法について、みていきます。

今回の code は、こちらです。

https://github.com/danny-yamamoto/go-connect-sample

## TL;DR
- [protoc-gen-validate](https://github.com/bufbuild/protoc-gen-validate) の後継です。
- validation を [CEL（Common Expression Language）](https://github.com/google/cel-spec) で定義できる Library です。

## Usage
今回は、`name` が5文字以上を必須としました。
```proto
message GreetRequest {
//  string name = 1;
  string name = 1 [(buf.validate.field).cel = {
    id: "name",
    message: "name must be at least 4 characters.",
    expression: "this.size() > 4"
  }];
}
```

https://github.com/danny-yamamoto/go-connect-sample/blob/main/greet/v1/greet.proto

```bash
rm -rf gen/
buf generate
go run ./cmd/server/main.go
```

### OK
- request を送信して、validation を確認します。
```bash
2023/06/12 02:05:53 validation succeeded
2023/06/12 02:05:53 Request headers:  map[Accept:[*/*] Content-Length:[19] Content-Type:[application/json] User-Agent:[curl/7.74.0]]
```

### NG
```bash
2023/06/12 02:06:01 validation failed: validation error:
 - name: name must be at least 4 characters. [name]
2023/06/12 02:06:01 Request headers:  map[Accept:[*/*] Content-Length:[16] Content-Type:[application/json] User-Agent:[curl/7.74.0]]
```

## Summary
> Powered by Google's Common Expression Language (CEL), it provides a flexible and efficient foundation for defining and evaluating custom validation rules. The primary goal of protovalidate is to help developers ensure data consistency and integrity across the network without requiring generated code.

公式に書いてある通り、より柔軟な validation が可能になりました。

protovalidate の一番の難点は、CEL だと思います。
慣れていないため、構文を正しく書くのが難しい。
今回、CEL は、ChatGPT を利用して作成しました。

なお、protovalidate は、現在、`beta` です。
開発の推移を見守りながら、Production に反映させていきたいと思います。
1周まわってフローの基礎をまとめてみる

## はじめに
Salesforceのフローとは、ビジネスプロセスを自動化する処理を構築できるノーコードツールです。
ワークフロールールやプロセスビルダーが廃止され、今後自動化ツールはフローに一本化されるため、この記事でフローの基本的な事項を執筆しようと思います。

## フローの種類
フローの種類は、その起動条件ごとに分けられる。フローを作成する際に、最初に選択するのが、このフローの種類である。
[参照：Salesforce ヘルプ「フロー種別」](URL "https://help.salesforce.com/s/articleView?id=sf.flow_concepts_type.htm&language=ja&type=5")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025346/09af4141-6566-4bc2-798c-cc7c703f3b0b.png)


### 1. 画面フロー
テキスト、チェックボックス、表などの部品を利用して独自の画面が作成できるフロー。
Lightningページやクイックアクションなどの操作が起動条件になる。構築した画面を通じて、ユーザの入力に合わせて動的に出し分けることが可能。

### 2. レコードトリガフロー
レコードを作成、更新、削除された時に起動するフロー。フローの開始条件として、「レコードの保存前」か「レコード保存後」を選択できる。
- レコードの保存前
    - 保存前のレコードの値をチェックしたり、変更したい。
- レコードの保存後
    - 保存後に確定される項目（ID、自動採番、更新日など）を利用したい。

### 3. スケジュールトリガフロー
指定した時間・頻度（1回、毎日、毎週）で自動起動するフロー。スケジュールを設定しておくことで、手動で都度実施する処理を省くことができる。

### 4. プラットフォームイベントトリガフロー
事前に設定したプラットフォームイベントの発火を起動条件とするフロー。ユーザの操作、プラットフォーム機能の実行、これらによって発生する変化をプラットフォームイベントとして公開し、公開されたプラットフォームイベントをキャッチした時にアクションを実行する。
- Salesforceにおけるプラットフォームイベントとは
    - Salesforce Platform上でイベント駆動型アーキテクチャを実現する機能。 

### 5. 自動起動フロー（トリガなし）
Apex、プロセス、REST API等から呼び出して利用するフロー。

## フローで利用するリソース
プログラミングでいう、変数的な存在。テキストの値や日付の値、真偽値などを一時的に格納する。
例えば、下記のような特徴がある。
- 単一の値だけでなく複数の値を格納できる。
- レコードの取得結果そのものを格納できる。

リソースの中で代表的なものを抜粋して、以下にまとめる。
[参照：Salesforce ヘルプ「フローのリソース」](URL "https://help.salesforce.com/s/articleView?id=sf.flow_ref_resources.htm&type=5")

### 1. 変数
- 最も一般的なリソース。数値や文字列といった値を一時的に格納する。
- 複数の値を一つの変数に保存することも可能（コレクション変数）。
- record Id
    - 特定のレコードの詳細画面から、フローを起動した際に、表示しているレコードIDを取得するための変数。変数のAPI参照名は、必ず"recordId"である必要がある。
### 2. 定数
- 後から変更できない固定値を格納する。
### 3. 数式
- 計算された値を格納する。
- オブジェクトの項目で使用できる数式とは書式ルールが異なるため、要注意。
- 例えば、以下のような使い方できる。
### 4. テキストテンプレート
- リッチテキストまたはプレーンテキストを選択可能。他のリソースを差し込み可能。
### 5. フェーズ
- フェーズ（ステージ）を定義できる。
### 6. グローバル変数
- ユーザのIDやAPIセッションIDなど、Salesforce組織や実行ユーザに関する情報を参照できるシステム指定の変数。
- 以下に一例を示す。
    - ＄Record：レコード作成時のトリガフローやバッジ処理において対象となっているレコードの情報を参照できる。
    - $User：実行ユーザの情報を参照できる。
    - $Flow：実行中のフロー処理の情報を参照できる。
### 7. グローバル定数
- システム指定の固定値。
- 以下に一例を示す。
    - {!$GlobalConstant.True}:Trueを指す。
    - {!$GlobalConstant.False}：Falseを指す。
    - {!$GlobalConstant.EmptyString}：空の文字列（Blank）を指す。


## まとめ
- フローの種類の、その起動条件によって5つに分類される。
- フローには、プログラミングでいう変数の役割を持つ、リソースと呼ばれるものがある。
UUID/ULIDジェネレータを理解する： 開発者向けガイド



# UUID/ULIDジェネレータを理解する： 開発者向けガイド

開発者であれば、UUIDやULID Generatorという概念に出会ったことがあるかもしれません。これらのツールは、さまざまなアプリケーションで一意の識別子を生成するために使用されます。この記事では、UUIDおよびULIDジェネレータとは何か、どのように機能するのか、その主な特徴、誤解、FAQについて詳しく見ていきます。

## UUID/ULID Generatorとは何ですか？

UUID（Universally Unique Identifier）とは、世界的にユニークな128ビットの番号のことです。ネットワークやデータベースなどの分散コンピューティング環境において、オブジェクトを識別するために使用されます。UUIDジェネレーターは、UUIDを自動生成するためのツールです。

ULID（Universally Unique Lexicographically Sortable Identifier）とは、辞書的にソート可能な128ビットの識別子を生成するフォーマットであり、時間軸を持った識別子である。つまり、ULIDはマイクロ秒単位でユニークであり、容易にソートすることができる。ULIDジェネレーターは、ULIDを素早く作成するためのツールです。

## UUID/ULID ジェネレーターはどのように機能するのか？

UUID/ULIDジェネレーターは、数式を使用して一意の識別子を生成します。この数式には、現在の時刻、マシンのネットワークアドレス、そして乱数が考慮されています。その結果、一意であることが保証されたコードが生成されます。

## UUID/ULIDジェネレーターの利用シーン

UUID/ULIDジェネレーターは、以下のようなユニークな識別子を必要とする様々なアプリケーションで使用されています：

- データベースの主キー
- URL短縮ツール
- セッションID
- APIキー
- トラッキングコード

## 主な特徴

UUID/ULIDジェネレーターの主な機能をご紹介します：

| 特徴 | 説明
|---------|-------------|
| 一意性｜生成されたコードがグローバルに一意であることを保証します。|
| 乱数性｜セキュリティを確保するために乱数を生成します。|
| ソート可能｜ULIDは辞書的にソート可能です。|
| タイムベース｜ULIDにはタイムスタンプも含まれており、作成日順に並べることができます。|
| コンパクト｜UUIDは36文字ですが、ULIDは26文字です。|

## サンプルコード

Node.jsでUUIDを生成するには、`uuid`モジュールを使用することができます：

```javascript
const { v4: uuidv4 } = require('uuid');
console.log(uuidv4());
```

Node.jsでULIDを生成するには、`ulid`モジュールを使用することができます：

```javascript
const ulid = require('ulid');
console.log(ulid());
```

## 誤解とFAQ

### 誤解1：UUIDは本当にユニークである。

2つのUUIDが全く同じに生成される確率は非常に低いのですが、不可能ではありません。重複したUUIDが生成される確率は、2^122分の1程度です。しかし、UUIDは分散システムで使用されるため、2つのUUIDが衝突することはまずありません。

### 誤解2：ULIDはランダムである。

ULIDはタイムスタンプを識別子の一部として使用しているため、完全にランダムというわけではありません。しかし、それでもユニークで安全なため、多くのアプリケーションに理想的です。

### FAQ 1: UUIDは大文字と小文字を区別するのですか？

いいえ、UUIDは大文字と小文字を区別しません。UUIDは通常小文字で表現されますが、大文字で表現することも可能です。

### FAQ 2: UUIDを予測することは可能ですか？

UUIDを予測することは不可能ではありませんが、使用されている乱数生成器の関係上、非常に困難です。UUIDは予測できないと考えたほうが無難です。

## UUID/ULID ジェネレーターの使用方法

UUIDやULIDを生成するためのツールはいくつかあります。その一つがHe3 ToolboxのUUID/ULID Generatorです([https://t.he3app.com?1exr](https://t.he3app.com?1exr))。このツールを使えば、UUIDやULIDを素早く簡単に生成することができます。

![UUID/ULID Generator](/images/blog/screenshots/UUID/ULID%20Generator.png)

## まとめ

UUID/ULID Generatorsは、様々なアプリケーションでユニークな識別子を生成するための強力なツールです。使いやすく、安全で信頼できるツールです。UUID/ULIDジェネレーターの仕組み、主な特徴、誤解、FAQを理解することで、プロジェクトでより効果的に使用できるようになります。

参考文献
## 結論

UUID/ULID Generatorsは、さまざまなアプリケーションで一意の識別子を生成するための強力なツールです。使いやすく、安全で信頼性の高いツールです。UUID/ULIDジェネレーターの仕組み、主な特徴、誤解、FAQを理解することで、プロジェクトでより効果的に使用できるようになります。

参考文献

- [UUID - Wikipedia](https://en.wikipedia.org/wiki/Universally_unique_identifier)
- [ULID - GitHub](https://github.com/ulid/spec)
- [Node.js UUID Module](https://www.npmjs.com/package/uuid)
- [Node.js ULID Module](https://www.npmjs.com/package/ulid)
累積和するときのメモ 

__累積和、理屈は分かってるけどとっさに実装できないよ:joy:__

:::note warn
※「この記事は～」的な言い訳はめんどいので省略です。
正確な情報が必要な方は、ちゃんとした記事を参照ください。
:::

要素数6個の配列で累積和を使うケースを考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476267/944883d8-714f-7353-4796-15562856da01.png)

:::note info
累積和用の配列は、元の配列より1つ長く、先頭は0にしておくのがポイント。
:::
num[0]からnum[1]までの合計を求めるときは、sum[1+1] - num[0]する。
num[2]からnum[5]までの合計を求めるときは、sum[5+1] - num[2]する。

:::note info
「まで」の方は+1
:::
```c++
#define n (6)
int main() {
    int num[n] = {1,3,2,5,2,4};
    
    int sum[n+1];
    // 先頭を0にして
    sum[0] = 0;

    // 累積和を計算する
    for (int i = 0; i < n ; i++) {
    	sum[i+1] = sum[i] + num[i];
    }

    // 3～5の合計を求めるときは、(5+1までの和) - (3までの和)
    printf("%d\n", sum[5 + 1]-sum[3]);
	return 0;
}
```
exclusive_scan というのもある。
```c++
#include <numeric>
#define n (6)

int main() {
    vector<int> num = {1,3,2,5,2,4};

    // 末尾に0をpushするのがポイント
    num.push_back(0);

    // exclusive_scan は領域を確保しないので。事前に。
    vector<int> sum(n+1);
    exclusive_scan(num.begin(), num.end(), sum.begin(), 0);

    // 3～5の合計を求めるときは、(5+1までの和) - (3までの和)
    printf("%d\n", sum[5 + 1]- sum[3]);
	return 0;
}
```

# 2次元配列の累積和
(0, 0)を左上の頂点にした長方形に含まれる和を求めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476267/e0083bcd-f3f0-c1f0-10c2-af5e6941313e.png)

### 準備
たとえば(2,4)の27を求めるには、赤 + 青 - 黄 + (1, 2) ⇒ 12 + 12 - 5 + 8 = 27
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476267/3158907a-85e4-bf02-32be-fd2da9277da3.png)

### 求める
たとえば赤の範囲を求めたいなら、緑 - 黄 - 桃 + 青 ⇒ 27 - 3 - 12 + 1 = 13
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476267/e1a200b5-2675-e9a5-f849-86f2b8a57622.png)

```c++
#define n (3)

int main() {
  int A[n][n] = {{1,2,3},
                 {4,5,6},
                 {7,8,9}};

  int sum[n + 1][n + 1];
  memset(sum, 0, sizeof(sum));

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      sum[i + 1][j + 1] = sum[i + 1][j] + sum[i][j + 1] - sum[i][j] + A[i][j];
    }
  }
  // 左上(1,1), 右下(1,2) の和を求める
  int lu_x = 0; int lu_y = 1; // 左上
  int rd_x = 1; int rd_y = 2; // 右下
  printf("%d - %d - %d + %d\n", sum[rd_y +1][rd_x +1] , sum[lu_y][rd_x +1] , sum[rd_y +1][lu_x] , sum[lu_y][lu_x]);
  printf("%d\n",                sum[rd_y +1][rd_x +1] - sum[lu_y][rd_x +1] - sum[rd_y +1][lu_x] + sum[lu_y][lu_x]);

  return 0;
}
```

正直、2次元の累積和は好きではないので、計算量が許されるなら行ごとに1次元の累積和したい。。。
Python3エンジニア基礎試験_模擬試験の復習④

# リストの問題

```list.py
dive_into_code = ['Noro', 'Nakao', 'Miyaoka', 'Miyashita', 'Shibata', 'Kimura']
ex_mentor = dive_into_code.pop(3)
print(ex_mentor)
# Miyashita
```

● 解説
.pop() はリストからデータを取り出すメソッドです。
.pop() の引数は取り出すインデックス番号を入れています。
インデックスは一番左をゼロとしてカウントアップしていきます。

```list.py
[(x, y) for x in [0,1,2] for y in [1,2,3] if x != y]
# [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 1), (2, 3)]
```

● 解説
リスト内包表記の問題です。for 文が 2 重になっていますが、
中の if 文で x と y が同じものは対象外にしている選択肢が正解です。

```list.py
リストから、引数の値(x)の最初のアイテムを削除するメソッドを選びなさい。
# list.remove(x)
```

● 解説
remove() メソッドは指定した値と同じ要素を探し、最初に該当した要素を削除します。

```list.py
def dive_into_code(teacher, L=[]):
    L.append(teacher)
    return L

print(dive_into_code('Noro'))
print(dive_into_code('Nakao'))
print(dive_into_code('Miyashita'))
# ['Noro']
# ['Noro', 'Nakao']
# ['Noro', 'Nakao', 'Miyashita']
```

● 解説
リストと関数の問題です。5, 6, 7 行目で関数を呼び出しています。
それぞれで実引数を用意し、teacher という仮引数に格納されます。
出力の結果を見ると仮引数の値がリストに順次格納するようになれば良いので、
.append が使われている選択肢が正解です。

```list.py
num_list  = [2, 4, 6, 4, 4, 2, 6]
for i in range(num_list.count(4)):
    print(i, end=' ')
# 0 1 2
```

● 解説
.count() メソッドは、変数の中にある要素の個数を数えることができます。
ここでは 4 の個数をカウントし、3個あります。 
for 文と組み合わせるとゼロ、1、 2 とカウントします。
【Android】Webページをchromeで見た時に、Noto Sans JPで指定されたフォントのboldが効かない

備忘録的に。

# 事象
Android端末(tablet,スマホなど)でChromeを使ってWebページを開いた時に、

```css
font-weight: 700
font-family: 'Noto Sans JP'
```
で指定されたテキストが太字になっていなかった。

PCのChromeから同じWebページを開くと該当のテキストはちゃんと太字になっていた。

# 原因

2023年6月現在に至るまで、googleはAndroidで日本語の`font-weight`の値を1つしかサポートしていないため。

# 解説

[このIssue](https://issuetracker.google.com/issues/186033995?pli=1)にある内容まんまを書いてしまうのですが、
Androidでは、CJK(中国語、日本語、韓国語)フォントについては1つの`font-weight`(400, Regular)しか無い模様。
英数字などはすべての`font-weight`(100~900)をサポートしているようです。

これにより、例えばbootstrapの`fw-bold`クラスなどを使ってテキストを太字にしようとすると、
elementに`font-weight: 700 !important`が付与されるようのですが
Androidだと700のweightはサポートしていないので、400のweightで表示されてしまうという罠。

で、このスレッドを見る限りこの問題は未だに解決していなさそう。
一部の端末では端末側で`font-weight`の他のバリエーションをサポートしてくれているみたいです。

情報が間違っている場合は指摘お願いします。:bow_tone1:

# 参考
- [[Feature request] Fix CJK languages display issue with variable font (NotoSansCJK-VF) 
](https://issuetracker.google.com/issues/186033995?pli=1)
【備忘録】dwave-ocean-sdkのサンプラーでパラメータβを固定する

### 概要

dwave-ocean-sdkのサンプラーを使うことで量子アニーリングができる  
量子アニーリングによっての基底状態周辺をサンプリングすることができる  
ところで量子アニーラーを用いて単純にボルツマン分布からサンプリングがしたい場合、つまりMCMCを行いたい場合どうすれば良いのか  
それを行うために、ボルツマン分布`β`の値を固定したい  
例えば`β=1`のMCMCを走らせ、逆温度1のボルツマン分布に従うサンプルを集めるにはどう実装すれば良いのか  

### 実装

ソルバーは`DW_2000Q_VFYC_6`を使う

```py
from dwave.system.samplers import DWaveSampler
from dwave.system.composites import EmbeddingComposite

token = '*****************'
solver = 'DW_2000Q_VFYC_6'

dw = DWaveSampler(token=token, solver=solver)
sampler = EmbeddingComposite(dw)
```

このソルバーではパラメータ`β`を固定することができる。  
`DW_2000Q_6`とかだと`β`を指定することができず量子アニーリングになる


```py
NUM_READS = 1000
sample_params={'beta': 1, 'num_reads': NUM_READS}

sampleset = sampler.sample_ising(h=h, J=J, **sample_params)
```

### まとめ
時間があったらもっと丁寧に書きたい
SAMLとかその辺をChatGPTに聞いたメモ

ちょっとChatGPTに聞いてみた

# SAML (Security Assertion Markup Language)

キュリティ認証情報をXML形式で交換するためのオープンスタンダードです。SAMLは、主にシングルサインオン (SSO) という方法で広く利用されています。これは、一度ログインすることで複数のアプリケーションにアクセスできる手法を指します。

SAMLの流れは以下の通りです:

1. ユーザーがサービスプロバイダ(SP)のウェブサイトを訪れます。
2. サービスプロバイダはユーザーをアイデンティティプロバイダ(IdP)のサイトにリダイレクトします。
3. ユーザーはアイデンティティプロバイダでログインします。
4. アイデンティティプロバイダは、認証成功を証明するSAMLアサーションを生成します。
5. ユーザーはそのSAMLアサーションを含むリダイレクトレスポンスを経由して、元のサービスプロバイダのサイトに戻ります。
6. サービスプロバイダはSAMLアサーションを検証し、ユーザーを認証します。

このフローにより、ユーザーは1つの認証（アイデンティティプロバイダでのログイン）で、複数のサービス（サービスプロバイダ）にアクセスできます。

#### OAuth 2.0との違い

OAuth 2.0は認可に重点を置いています。これはユーザーがあるサービス（例えばGoogle）から別のサービス（例えば、Googleを使ったログイン機能を持つウェブサイト）へ特定のリソース（ユーザー情報など）へのアクセスを許可することができます。OAuth 2.0はアクセストークンを使用してこれらのアクセス許可を交換します。

両者の一部の違いとしては、SAMLは認証に焦点を当てており、一方でOAuth 2.0は認可に焦点を当てています。しかし、OAuth 2.0はOpenID Connect（OIDC）という拡張を通じて認証機能も提供しています。

また、SAMLとOAuth 2.0は一緒に使用されることもあります。例えば、ユーザーがSAMLを使って企業のIDP（Identity Provider）に対して認証を行い、その後、企業の内部アプリケーションがOAuth 2.0を使ってそのユーザーの認証情報に基づいたアクセストークンを取得する、という流れが考えられます。


# SSO (Single Sign-On)

一度の認証で複数の関連システムやサービスにアクセスできる技術のことを指します。これにより、ユーザーはそれぞれのシステムやサービスで別々に認証する必要がなくなります。SAMLはこのSSOの実現方法の一つです。

SSOの利点は以下の通りです:

- ユーザーエクスペリエンスの向上: ユーザーは複数のサービスに対して一度だけログインすればよいため、操作が簡素化します。
- セキュリティの向上: パスワードの再利用を減らすことができ、セキュリティリスクを軽減します。
- 管理コストの削減: 各サービスでのアカウント管理やパスワードリセットの要求を減らすことができます。

# アイデンティティプロバイダ（Identity Provider、IdP）

ユーザーの認証情報を管理し、そのユーザーの認証やアイデンティティ情報を他のサービス（サービスプロバイダー）に提供するシステムのことを指します。

具体的には、ユーザーがログインする際に、そのユーザーが正当なユーザーであるか（認証）を判断し、認証が成功した場合にそのユーザーのアイデンティティ情報（ユーザー名やメールアドレスなど）をサービスプロバイダーに送信します。

そして、そのアイデンティティ情報を基にサービスプロバイダーはユーザーに対して適切なサービスを提供します。このように、アイデンティティプロバイダはユーザーの認証とアイデンティティ情報の管理を担当します。

具体的なアイデンティティプロバイダの例としては、以下のようなものがあります：

Google
Facebook
Twitter
Microsoft Azure Active Directory
Okta
Auth0

これらのサービスはユーザーの認証情報を管理し、他のサービスと連携してユーザーのアイデンティティ情報を提供することができます。例えば、「Googleでログインする」や「Facebookでログインする」ボタンをクリックすると、GoogleやFacebookの認証ページにリダイレクトされてログインし、認証後に元のサービスに戻ってきます。このとき、GoogleやFacebookがアイデンティティプロバイダとなっています。

# サービスプロバイダ（Service Provider、SP）

ユーザーに対して具体的なサービスを提供するシステムまたはアプリケーションを指します。

SAML（Security Assertion Markup Language）の文脈では、サービスプロバイダは、ユーザーがアクセスしようとしているウェブサイトやウェブアプリケーションを指します。このサービスプロバイダがアイデンティティプロバイダ（Identity Provider、IdP）からユーザーの認証情報を受け取り、それに基づいてユーザーに対してサービスを提供します。

例えば、企業が内部の従業員向けに提供するクラウドベースのアプリケーションがサービスプロバイダになり得ます。このアプリケーションは、従業員の認証情報を管理するためのアイデンティティプロバイダ（例えば、企業のLDAPサーバー）から認証情報を受け取り、それを基に従業員にサービスを提供します。

このように、サービスプロバイダはユーザーが実際に利用するサービスの役割を果たします。

# SAMLアサーションの検証

サービスプロバイダ(SP)がアイデンティティプロバイダ(IdP)から受け取ったSAMLアサーション（ユーザーの認証情報を含むXML文書）の信頼性と完全性を確認するプロセスを指します。主に以下のステップで行われます

1. **デジタル署名の検証**: SAMLアサーションはIdPによってデジタル署名されています。SPは公開鍵を用いてこの署名を検証し、アサーションがIdPによって正確に生成され、途中で改ざんされていないことを確認します。

2. **アサーションの期限チェック**: SAMLアサーションには通常、その有効期限が含まれています。SPはこの期限をチェックし、アサーションがまだ有効であることを確認します。

3. **アサーションの発行者チェック**: アサーションには発行者の情報が含まれており、これによってSPはアサーションが信頼できるIdPから来たものであることを確認します。

4. **属性の検証**: SAMLアサーションにはユーザーの属性（例えば、ユーザー名、メールアドレス、役職など）が含まれています。これらの属性はSPがユーザーに対して特定のサービスを提供するための重要な情報を提供します。SPはこれらの属性が正しいことを確認します。

以上のステップを通じて、SPはSAMLアサーションの信頼性と完全性を検証します。これにより、SPはユーザーが誰であるか（認証）を信頼性高く判断し、適切なサービスを提供することが可能となります。
【Spring Boot】schema.sqlが実行されない

# はじめに
spring JDBCではあらかじめschema.sqlに記載したSQL構文が起動時に実行されますが、なぜか実行されませんでした。
今回解決した方法を本記事で残しておこうと思います。

## 実行できなかった設定
【shema.sql】
```CREATE TABLE IF NOT EXISTS tasklist (
id VARCHAR(8) PRIMARY KEY,
task VARCHAR(256),
deadline VARCHAR(10),
done BOOLEAN
);
```

【application.properties】
```
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:~/S.demo
spring.datasource.username=*.*****
spring.datasource.password=*.*****
spring.sql.init.mode=always
spring.h2.console.enabled=true
```

## 解決した方法
記述したSQLはチェックしましたが間違っていなそうだったので、おそらくapplication.propertiesの設定では？　と色々検索したところ、
[公式ドキュメント](https://spring.pleiades.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization
)で答えになりそうな部分を見つけました。
どうやら記載の仕方に変更があったようです。
地味にこういう変更があるの困りますね、、笑
```
spring.sql.init.mode=always
```

ともあれ、上記の記載に変更し、実行したところ、ちゃんとテーブルが作成されていました。
rex0220 計算式プラグイン テーブル行の選択

計算式プラグインで、テーブル行をチェックボックスで選択してみます。
また詳細画面で選択行が分かりやすいように、項目書式プラグインで色を付与します。

# 概要

チェックボックスを選択すると、他のチェックボックスをクリアして、選択した行の値をテーブル外の項目に取得します。

![2023-06-12_17h52_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cddd218c-f716-8477-a5e4-49d30bcf4238.png)
![2023-06-12_18h12_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6cab3ca5-22bb-8bf5-4e9d-725a875b603d.png)

# 操作例

![2023-06-12_17h57_44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0199dee3-d07a-34a0-7c5d-9618781a70d0.gif)

# 画面設定

「選択行」は、チェックボックス選択時に他のチェックボックスをクリアするための作業用項目です。

![2023-06-12_18h00_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b0036fff-262d-36bd-c81b-ce70d4286cfa.png)

# 計算式プラグイン設定

「選択行」に選択中の行番号を取得しておき、チェックボックスの選択が変わった時（選択が２以上になった時）に新しい行番号を「選択行」にセットします。
チェックボックス「候補選択」は、「選択行」以外の行をクリアします。

![2023-06-12_18h01_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b3b5c3a2-a834-32d4-d6bf-2946df7af9d9.png)

```.js
// No
ROWNO(テーブル)+1
// 候補選択
IF(選択行=ROWNO(テーブル),ARRAY(候補選択),ARRAY())
// 候補No
選択行+1
// 選択行
IF(COUNTIF(IN(候補選択,"選択"),1)<=1,
FIRSTIF(IN(候補選択,"選択"),ROWNO(テーブル)),
FIRSTIF(AND(IN(候補選択,"選択"),選択行!=ROWNO(テーブル)),ROWNO(テーブル)))
// 確定会社
SUBTABLE(会社候補,NVL(選択行,-1))
// 確定金額
SUBTABLE(
  SWITCH(見積選択,
    "金額1",金額1,
    "金額2",金額2,
    "金額3",金額3,
    ""),
  NVL(選択行,-1)
)
```

# 項目書式プラグイン設定

選択行と選択金額をオレンジ、それ以外をグレイに設定します。

![2023-06-12_18h06_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ca81483a-39b3-2ce4-b43b-5bbc313f5f2a.png)

![2023-06-12_18h06_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ffa3537f-1caf-649e-1177-5bec2ceeefd1.png)

![2023-06-12_18h07_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a7169f24-b4cf-55c5-96cd-8fa9834811ca.png)
20分でまとめる備忘録　ゲームパッドの接続・切断時の取り方

## 備忘録のきっかけ
ゲームパッドを接続した際、ユーザーに接続したかを通知するためゲームパッド接続時に発火するイベントを調べた

## 実装例
UserInputServiceからイベントが取れるようになっているので、難しくない
```Lua
local UserInputService = game:GetService("UserInputService")
-- コントローラーが接続された時のイベントハンドラ
local function OnGamepadConnected(gamepad: Enum.UserInputType)
	print("コントローラーが接続されました:", tostring(gamepad))
	NotificationController.SendConnectedGamepadMessage(gamepad)
end
-- コントローラーが切断された時のイベントハンドラ
local function OnGamepadDisconnected(gamepad)
	print("コントローラーが切断されました:", tostring(gamepad))
end
-- ゲームパッド接続時のイベント接続
UserInputService.GamepadConnected:Connect(OnGamepadConnected)
UserInputService.GamepadDisconnected:Connect(OnGamepadDisconnected)
```
gamepadには[Enum.UserInputType](https://create.roblox.com/docs/reference/engine/enums/UserInputType)が入り、ここでキーボード・ゲームパッドなどが判別できる。
UserInputTypeは、以下のようにInputを取る箇所で使う

```Lua
local function onInputBegan(input, _gameProcessed)
	if input.UserInputType == Enum.UserInputType.Gamepad1 then
		print("user input gamepad1 keyCode:"..tostring(input.KeyCode))
    end
end
```

## おわりに
UserInputTypeにはGamepad1~8まで存在していて、きっと複数人プレイだとこちらでないと厳しそうだが、ソロのゲームだと扱いに困る。Gamepad1だけ対応すればほぼ問題なさそうだが、たまに二つ三つコントローラーを接続するユーザーがいないとも限らないし、こうなっているなら対応いれるべきか。

## 参考
https://create.roblox.com/docs/reference/engine/classes/UserInputService
https://create.roblox.com/docs/reference/engine/enums/UserInputType
ハイブリッドワークがクソである理由

# 自己紹介
エンジニア向けバーチャルコミュニケーションアプリのピクセルトークを開発・運営している石黒です。
コロナ禍でリモートワークになり便利さを実感していましたが、人との距離が広がってしまって寂しいと感じることが増えました。
離れていてもオフィスにいる感覚で仕事が出来ればいいという思いからピクセルトークの開発に着手しました。
是非ホームページをご覧になっていただけると嬉しいです！


www.pixeltalk.app

# ハイブリッドワークの問題点
ハイブリッドワークとはその名の通り、リモートワークとオフィス出社の丁度中間に当たり、週2〜3日出社し、残りをリモートワークで行うスタイルのことを言います。
一見するとリモートワークと出社の良いを合わせ持つ、実に良い案のように思えます。

しかし、ハイブリッドワークはリモートワークの良いところを全て潰してしまう最悪の案なのです。

## 従業員はオフィスの近くに住む必要がある
リモートワークは私たちの働く場所を無限に拡大しました。
このお陰で、以下のようなメリットが企業と従業員にできるようになりました。

従業員は高い家賃を払う必要がなく、田舎の辺境でも仕事ができる

企業はオフィスを持つことも必要なくなり、経費削減できる

しかしハイブリッドワークはどうでしょうか？
従業員は出社を行うために、オフィスの近くに住む必要があります。
そのために、高い家賃を払って住みたくもない家に住むことになるでしょう。
これではリモートワークの最大のメリットを完全に潰してしまっています。

## コミュニケーションに不平等が起きる
Aさんは週3リモートワークだけど、Bさんは重要作業があるので週2に抑えている、というようなことはよくあることでしょう。
するとBさんは上司とよくご飯に出かけるようになり、仕事の重要な裏話や、趣味のことで上司と良い関係を築くことができました。
ですがAさんは上司とそのような話をする機会は少なく、上司との距離は少し空いたままとなってしまいました。

この場合、仕事の能力は同じでも、AさんよりBさんの方が高く評価されてしまう可能性が高いです。
どんなに平等に評価をしようとしても、最後は人の感情で少なからず評価はブレてしまうものです。

このようになると、できるだけ従業員も出社することになってしまいます。
「自分のいない間に話されたくない」という思いもあるでしょう。

このように出社組とリモート組でそれぞれコミュニケーションの優劣ができてしまいます。

## 掃除などの雑務が楽になるわけではない
掃除やゴミ出しでも、使っていない期間が増えたからといって、労力が軽減できるものでもありません。
使っていない時間でもしっかりとホコリは溜まります。
掃除はリモートワークが無かった時と同じように、しっかりと手間暇かけてする羽目になるのです。

# どちらかに絞れ！
リモートワークをするのか、しないのか、どちらかに絞るべきです。
私はリモートワークの信者ではないので、オフィス出社のメリットもたくさんあると考えています。
中途半端なハイブリッドワークという折衷案が採用されがちですが、ここは良く考えて決断をしてもらいたいものです。
CPUとは

## CPUとは

プログラムの命令に従って、データの演算やコンピュータ全体の制御をおこなう

CPUの内部
→数百～数億の**トランジスタ**で構成されている

### トランジスタとは
電気の流れをコントロールする部品
電子回路において信号を増幅、スイッチングできる半導体素子

### レジスタとは
CPUそのものに内蔵されている記憶装置
→計算結果データや、計算中のデータを一時的に保存したりする
Husky + Commitlintの統合使用

# Husky + Commitlintの統合使用

ソフトウェア開発では、良好なコードのコミット規約と規範的なGitのコミットメッセージは重要なプラクティスです。HuskyとCommitlintは、Gitのコミットプロセス中にフックを実行し、コミットメッセージの規約性を検証するためのツールです。このドキュメントでは、それらをプロジェクトに統合する方法について説明します。

## 1. Huskyの概要

Huskyは、Gitフックマネージャーであり、Gitイベント発生時にカスタムスクリプトを実行することができます。コミットの前後に特定のタスクを実行するなど、Gitフックにコードを追加することができます。Huskyは簡単な設定と使いやすいコマンドラインインターフェースを提供します。

## 2. Commitlintの概要

Commitlintは、Gitのコミットメッセージを検証し、規約に基づいたメッセージかどうかをチェックするツールです。コミットメッセージのフォーマットと内容の規約に依存し、それに従って検証を行います。コミットメッセージの規約を定義することで、コードリポジトリの可読性、保守性、協業性を向上させることができます。

## 3. 統合手順

以下は、HuskyとCommitlintをプロジェクトに統合するための基本的な手順です：

### ステップ1：依存関係のインストール

プロジェクトのルートディレクトリでターミナルを開き、次のコマンドを実行して必要な依存関係をインストールします：


```
pnpm install husky @commitlint/cli @commitlint/config-conventional --save-dev
```

```
pnpm install husky @commitlint/cli @commitlint/config-conventional --save-dev

Downloading registry.npmjs.org/typescript/5.1.3: 7.15 MB/7.15 MB, done
Packages: +211
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Packages are copied from the content-addressable store to the virtual store.
  Content-addressable store is at: /Users/a/Library/pnpm/store/v3
  Virtual store is at:             node_modules/.pnpm
node_modules/.pnpm/esbuild@0.17.19/node_modules/esbuild: Running postinstall script, done in 705ms
Progress: resolved 232, reused 166, downloaded 45, added 211, done

devDependencies:
+ @commitlint/cli 17.6.5
+ @commitlint/config-conventional 17.6.5
+ husky 8.0.3
+ typescript 5.1.3
+ vite 4.3.9

Done in 8.5s
```

### ステップ2：husky-initの設定

```
npx husky-init 
```

```
npx husky-init 

Need to install the following packages:
  husky-init@8.0.0
Ok to proceed? (y) y
husky-init updating package.json
  setting prepare script to command "husky install"
husky - Git hooks installed
husky - created .husky/pre-commit

```

```
pnpm run prepare
```

```
pnpm run prepare                                                             

> my-husky@0.0.0 prepare /Users/a/Documents/temp/my-husky
> husky install

husky - Git hooks installed
```

### ステップ2：Commitlintの設定


プロジェクトのルートディレクトリに`.commitlintrc.js`というファイルを作成し、以下の内容を追加します：

```
module.exports = {   extends: ['@commitlint/config-conventional'], };
```

これにより、一般的な規約（conventional）を使用してコミットメッセージを検証します。

プロジェクトのルートディレクトリの`package.json`ファイルに、以下の設定を追加します：

```
{
  "scripts": {
    "commitmsg": "commitlint -e $GIT_PARAMS"
  }
}

```


### ステップ3：Huskyの設定

プロジェクトのルートディレクトリの`pre-commit`ファイルに、以下の設定を追加します：

```
.husky/pre-commit

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

pnpm run commitmsg
```

これにより、コミット時にCommitlintが実行され、コミットメッセージの検証が行われます。

### ステップ4：コミットメッセージの例

規約に従ったコミットメッセージの例：

`git commit -m "feat: 新機能を追加"`

規約に違反したコミットメッセージの例：

`git commit -m "新機能を追加"`

## 4. 結論

HuskyとCommitlintを統合することで、Gitのコミットプロセス中にカスタムスクリプトを実行し、コミットメッセージの規約性を検証することができます。これにより、コードリポジトリの一貫性と可読性が向上し、チームの協業が促進されます。

上記の手順に従って、HuskyとCommitlintをプロジェクトに簡単に統合し、Gitのコミットメッセージを規範化することができます。
G検定を受けてみた

私がG検定を受験してみて、どんな試験だったかについて紹介していこうと思います。
## テキスト
G検定の勉強をする際に使用したテキストは以下の2冊です。
![51WVZ818YhS._SY291_BO1,204,203,200_QL40_ML2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073852/d7725039-bb26-4c59-cc8c-d9c65c35d42e.jpeg)![51G6kmnZumS._SY291_BO1,204,203,200_QL40_ML2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073852/49ebbef4-5cc0-ea12-3dc9-78109a468ce4.jpeg)
* ディープラーニングG検定公式テキスト第2版
![51WVZ818YhS._SY291_BO1,204,203,200_QL40_ML2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073852/d7725039-bb26-4c59-cc8c-d9c65c35d42e.jpeg)
このテキストは 一般社団法人日本ディープラーニング協会（JDLA）が監修しているテキストです。AIの歴史からディープラーニングの手法、AIの社会実装まで幅広く載っています。各章の終わりには練習問題もあり、復習もできるのでおすすめです。

* ディープラーニングG検定問題集第2版
![51G6kmnZumS._SY291_BO1,204,203,200_QL40_ML2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073852/e5f15070-cd9a-425b-07a1-37b2c5dc212c.jpeg)
このテキストには解答だけでなく、解説も載っているので間違った箇所を確認できます。

## どんな検定だったか
G検定はAIの歴史（第１次AIブーム、第２次AIブーム、第３次AIブームなど）、機械学習（パーセプトロン、ランダムフォレスト、サポートベクターマシンなど）ディープラーニングの概要・手法（CNN, RNNなど）、AIの社会実装などが問われる検定です。オンライン試験で自宅から受験できます。複数選択肢があるのでその中から正解を選ぶというような試験になっています。試験時間は120分で問題が200問ほどあります。

## どのように勉強したか
勉強方法はシンプルで、ひたすらテキストを読んで重要なところはメモしたり線を引く、練習問題を解いて間違ったところをもう一度解く、ということをずっとしていました。試験本番が近くなるにつれ、問題集を解いて間違ったところを何度も解いていました。

## 受けた感想
G検定は試験時間120分で問題数は200問あるので一つの問題にかけれる時間が少なく、その中で全ての問題を解かないといけません。私は問題文をじっくり読んで解いていたので一問解くのにかなり時間がかかり、ラスト１０問くらいは時間が無さ過ぎて問題文をちゃんと読まずに適当に答えることになってしまいました。時間配分を考え、分からない問題は飛ばして分かる問題から解いていったほうがいいです。
ChatGPTのAPIを使ってしりとり作ってみた(続き)

## 今までの内容
ChatGPTのAPIを使ってしりとりのルールにのっとったPythonのコードを作っていました。(ひらがなだけではく漢字にも対応)
https://qiita.com/tryuuu/items/50bf8041ac4d982028bf
## 改良点
ターミナル上での操作だと見にくいので、GUIアプリを作成できるtkinterを用いて改良を行ってみた。
## 結果
最終的な結果はこのような感じで、前回よりは格段に見やすくなっていると思う。
![しりとり1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474661/002c65e7-3165-82a6-e456-271835ec6538.png)
![しりとり3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474661/6c7b6398-c85f-9847-eae5-ccf75ea920cf.png)
![しりとり4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474661/6dc69e91-4760-ef5f-72b1-1533322bcf2a.png)
## コードについて
ベースは前回の段階でできていたので、さまざまな記事(とChatGPT)の助けを借りながら以下のように設定をした。他にも前回からちょっといじりましたが長くなるので省略。
```python
from tkinter import *
import tkinter as tk
root = Tk()
root.title("しりとりゲーム")
root.geometry("400x500")

messages_frame = Frame(root)
scrollbar = Scrollbar(messages_frame)
messages_text = Text(
    messages_frame,
    height=20,
    width=50,
    yscrollcommand=scrollbar.set,
    wrap="word"
)

scrollbar.pack(side=RIGHT, fill=Y)
messages_text.pack(side=LEFT, fill=BOTH)
messages_frame.pack()

input_frame = Frame(root)
entry = Entry(input_frame)
response = "こんにちは！単語を入力してください。"
messages_text.insert(END, response + "\n")
root.update()
button = Button(input_frame, text="送信", command=ask_question)

entry.pack(side=LEFT)
button.pack(side=LEFT)
input_frame.pack()

root.mainloop()
```
## 最後に
たまにChatGPT側の回答時間が長くなるのでfine-tuningを行った改良を今度はしようかなと思ってます。
ここまで読んでくれてありがとうございました。Pythonって便利ですね。
【Python・API制限回避】gspreadで最終行に行を大量追加する方法

## 前置き
ログや情報をスプレッドシートに書き込む際、最終行に大量の行を追加したいことありますよね。
API制限を考えると空の行を確認して、update_cellを使うなど絶対に避けたいところです。

## 追加方法
スプレッドシートが3列ある場合
```python:exsample.py
append_list = [ ["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"] ]
worksheet.append_rows(append_list)
```

2次元配列を用意しappend_rowsとやることで1度のリクエストのみで3行も追加することができました。3行だけでなく、もっと追加することもできるので、必要に応じてやってみてください。
Linux mint startup

自分用に書く備忘録です

# 初期設定
英語版でインストールした後

- rootパスワードを設定

```terminal
sudo passwd root
```
- 新しいパスワードを設定後確認

```terminal
su -
```

- アップデートの確認・更新
```terminal
sudo apt update && sudo apt full-upgrade -y
```

を実行、`sudo reboot`でリブート

# vimの再インストール

```terminal
sudo apt-get --purge remove vim-common vim-tiny
```

```terminal
sudo apt-get install vim
```

# キーボードのみ日本語化
```terminal
sudo apt install fcitx-mozc --install-recommends
```

```terminal
im-config -n fcitx
```

Fcitx Configuration を開いて
1. デフォルトキーボードをJapaneseに設定
2. 左下の+を押してMozcをsearch,選択
3. Englishキーボードを選択,左下の-を押す

# ipアドレス固定
1. Networkを開く
1. 左下のAdd Profileを選択
1. IPv4を選択
1. AddressesをAutomatic(DHCP)→Manualに変更
1. Address 192.168.1.*** : 固定したい任意のアドレス
   Netmask 255.255.255.0
   Gateway 192.168.1.### : ルーターのipアドレス
   DNS Server 8.8.8.8
   に設定しAdd

`sudo reboot`でリブート

# Gitインストール
```terminal
sudo apt-get install git
```

```terminal
git config --global user.name "username"
git config --global user.email "useremail"
```

# pyenvをインストール

必要らしいパッケージをインストール(本当に必要かはわからん)

```terminal
sudo apt install build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev \
  libreadline-dev libsqlite3-dev libopencv-dev tk-dev git
```

Git Hubよりクローン
```terminal
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

`.bashrc`にpyenvの情報を追記

```terminal
echo '' >> ~/.bashrc
```
```terminal
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
```
```terminal
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
```
```terminal
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
```
```terminal
source ~/.bashrc
```

もろもろ確認&インストール

```terminal
pyenv -v
```

```terminal
pyenv install 3.10
```

```terminal
pyenv global 3.10
```

```terminal
pyenv local 3.10
```

```terminal
pyenv versions
```

https://zenn.dev/hr0t15/articles/8ae3564bde2cce

# Node.jsをインストール

```bash
# install Volta
curl https://get.volta.sh | bash

# install Node
volta install node

# start using Node
node
```

# 常時点灯

スリープ解除

```bash
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
```

元に戻すとき

```bash
sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
```
【ポエム】ABC305参加記

# [A - Water Station](https://atcoder.jp/contests/abc305/tasks/abc305_a)

バグが怖いので全探索しました

- 水が存在するすべての地点をlistに収め、距離が最小となる点をmin関数で求めた

# [B - ABCDEFG](https://atcoder.jp/contests/abc305/tasks/abc305_b)

dictとabsを使いました

# [C - Snuke the Cookie Picker](https://atcoder.jp/contests/abc305/tasks/abc305_c)

クッキーが存在する最[東西南北]端を求めて、欠けてる地点を全探索
- 上下左右にクッキーが2つ以上ある空白地点はすなわち答え、らしい
- - コンテスト後にTwitterで知った
- - 天才〜

# [D - Sleep Log](https://atcoder.jp/contests/abc305/tasks/abc305_d)

二分探索だとバグらせそうで怖かった
クエリ先読みをして座標圧縮を使った
- 高橋くんの睡眠状態が切り替わる時間とクエリで与えられる時間の和集合をとる
- その後座標圧縮
- 高橋くんの睡眠時間の累積和を求めておく
- このような前処理によって、クエリで左右の端が与えられた時、累積和の差を求めることで早く答えが出せる
- - 簡単に書いたが、コンテスト中は結構悩んでしまった
- - 競プロ<ruby><rb>筋</rb><rp>(</rp><rt>きん</rt><rp>)</rp></ruby>が足りない……

# [E - Art Gallery on Graph](https://atcoder.jp/contests/abc305/tasks/abc305_e)

優先度付きキューを使った変則的なDFS
- Pythonではheapqが使える

1つの頂点を複数の警備員が見張っている場合もあるので注意
- 重複がある可能性をわかった上でheapqに格納
- 最も眼力が強いやつだけを考え
- あとは無視
- - この処理についてよく考えずに提出したせいでWA

# [F - Dungeon Explore](https://atcoder.jp/contests/abc305/tasks/abc305_f)

インタラクティブ問題ということでめちゃくちゃ悩んでしまう
結局コンテスト中に解けなかった

- DFSをやりましょう
- - 通ってきた道を覚えておく必要があるので注意

# 総括

![スクリーンショット 2023-06-10 23.45.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210433/fe6246f8-abe4-9627-2b15-49515682fa49.png)
![スクリーンショット 2023-06-10 23.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210433/8ec5fa81-bc83-3681-bd64-37020f451a1e.png)

冷えは回避
- インタラクティブ問題が課題
- - 昔のABCにはインタラクティブ問題なんてなかったのだが……
- - あまり構えすぎず、見慣れたアルゴリズムで解決できないか考えること

解ける問題を早解きすることで、崖問題に対して考察時間が長くとれ、それも解ける可能性がある？
- 取らぬ狸の皮算用

# 余談

多重ループする時にitertools.productを使うと、外側の変数に応じて内側のループを変えられないから不便に思った
- なので関数を作った
- - ジェネレータは便利
- [提出 #42132418](https://atcoder.jp/contests/abc305/submissions/42132418)で使われている
- - しかしこの例はitertools.productでもよかった
- - - 考えてみると**この関数でないといけない**問題があまり思いつかない
- - - 実務では関数に切り出せばよいし……
【Python】gspreadで最終行数を取得する方法

## 前置き

GASであれば、「.getLastRow」とすれば取得できますよね。
ですがPythonのgspreadにはこのようなメソッドがありません。

検索等でヒットするのは「ws.row_count」ですが空白のセルの分まで含まれてしまいます。
空のセルまでfor文をぐるぐる回すのもAPIの制限に引っかかる為、推奨できません。

## 取得方法

```python:example.py
last_row =len(ws.col_values(1))
print(last_row)
```
これで取れます。


## 解説
```
len(ws.col_values(1))
```
ここでA列全てをリスト化し、lenで要素数をカウントしています。
【Java】釣り銭を計算する方法

# はじめに
本記事では、Java言語を使用して釣り銭を計算する方法について学習したのでアウトプットします。釣り銭計算は、支払い金額と預り金額を入力し、各種紙幣や硬貨の枚数を計算するプログラムです。具体的なコード例を交えて解説します。

## 釣り銭計算の実装
以下に、釣り銭を計算するJavaプログラムのコードを示します。
```java
public class Task {
    public static void main(String[] args) {
        // 数値リテラルはアンダースコアを入れて桁の可読性をよくすることが出来る
        int deposit = 10_000; // 10000 と同等
        int amount = 3_214; // 合計金額
        int Change = deposit - amount; //おつり

        // 以下に処理を追加する
        System.out.print("合計金額:" + String.format("%,d",amount) + "円 ");
        System.out.print("預り金" + String.format("%,d", deposit) + "円 ");
        System.out.println("おつり" + String.format("%,d", Change) + "円");

        int[] bills = { 5000, 1000 }; // 確認したいお札の種類を配列に組み込む
        int[] coins = { 500, 100, 50, 10 }; // 確認したい硬貨の種類を配列に組み込む

        // 紙幣の枚数を計算して出力する
        // 金額が高い順から割り切れた額があれば合計金額から減算処理を行う
        for (int bill : bills) {
            int count = Change / bill; // データ形式がintなので整数の値のみ代入される
            System.out.println(String.format("%,d", bill) + "円札:" + count + "枚");
            Change %= bill; // 金額を割り算して余った金額が次の計算に使用される
        }

        for (int coin : coins) {
            int count = Change / coin;
            System.out.println(String.format("%,d", coin) + "円玉:" + count + "枚");
            Change %= coin; // 最終的に1円で全て割り切れる計算なのでChangeが0になったら終了となる
        }
    }
}

```
## 実行結果
```java:実行結果
合計金額:3,214円 預り金:10,000円 おつり:6,786円
5,000円札:1枚
1,000円札:1枚
500円玉:1枚
100円玉:2枚
50円玉:1枚
10円玉:3枚
1円玉:6枚
```

## まとめ
本記事では、Javaを使用して釣り銭を計算する方法を解説しました。何かの参考になれば幸いです
terraformのバージョン Bump upを2年半ぶりに行った話

我々のチームではAWSインフラをterraformを使って管理しています。

terraformを導入して2年半にもなるんですが、バージョン差分による混乱を避けるためチームでバージョンを統一して使っているので、簡単にBump upできず長いこと古いバージョンを使い続けてました。
しかし2年半にもなると、日進月歩なAWSのサービスに対し利用できないresourceが出てきたり、deprecatedになってるresourceを使い続けたりということが増えてきたので、意を決してBump upしました。
今回その内容を共有したいと思います。


## Bump up バージョン
- terraform
  - 0.14.2 -> 1.4.6
- terraform-provider-aws
  - 3.33.0 -> 4.64.0

メジャーバージョンが `0` -> `1` なあたり、隔世の感ある。

## 手順  
terraformのclient、およびterraform-provider-awsのrequiredバージョンを更新。

```diff
 terraform {
-  required_version = "0.14.2"
+  required_version = "1.4.6"
   required_providers {
     aws = {
        source  = "hashicorp/aws"
-       version = "~> 3.33.0"
+       version = "~> 4.64.0"
     }
   }
 }
```

planを取ってバージョンアップによる差分を確認。量が膨大なのでファイルに出力する。
```zsh
terraform plan -out=plan_result.bin
terraform show -no-color plan_result.bin > plan_result.txt
```
1行目でplan結果をバイナリ出力し、
2行目でテキスト出力する。
こうやってバイナリを作っておくと、Plain TextではなくJSONを出したいときなどに改めて`terraform plan`する必要がなくなる（後述)。
resourceが膨大で何度もplanしたくないときに便利。


## `plan`差分確認
apply対象の値と異なりがないか確認する。

- AWSコンソールで現状の動作値と比較
- コンソール上で見れないものもあるので、AWS CLIも併用
- `sensitive` になっていて、何を`apply`しようとしてるかもterraform cli上で確認できない場合はJSON Dumpして確認する。やり方はとしては作成済みの`plan_result.bin`に対して、JSON出力を実行する。
    ```zsh
    terraform show -json plan_result.bin  > plan_result.json
    ```
  このJSONでは`sensitive`属性の値も確認できる。例えばこれはSecret Manager。
    ```zsh
    jq  '.resource_changes[] | select(.address | contains("aws_secretsmanager_secret"))' plan_result.json
    {
        "address": "aws_secretsmanager_secret.my_secret",
        "mode": "managed",
        ...
    }
    ```

- AWSではなくTerraform機能による属性の追加もある
    - 例えば `aws_security_group` の `revoke_rules_on_delete`。これはセキュリティグループのresourceを消す際、本属性を`true`にしておくと、アタッチされているリソースを自動的にデタッチしてくれるもの。こう言ったものを、必要か判断の上で設定する。今回のBump upでは全てデフォルトのままとした。


## 差分要因
具体的な数は省くが、膨大な差分が出た。
とは言っても差分の要因は同じものが多い。

差分の主な要因は以下。

1. 管理されていなかった属性が、新たに管理されるようになったことによるもの
各resourceや属性仕様が変わり、明示的に変更したいのでなければ指定する必要がなかった属性が(terraform provider的に)管理対象になった 
1. 既存属性に新たにsensitive属性が付いたことによるもの  
    - `password`や`key`といった機密性が高い属性はsensitive属性が付けられているものが多いが、既存属性に新たにsensitive属性がつけられた。
    - [terraform-provider-aws](https://github.com/hashicorp/terraform-provider-aws/blob/release/)のChangeLogを見るとある程度新たにsensitiveマークが付いた属性を確認できる（しかし、数が多すぎるのか全部は記載されていない模様）。
    

## apply
問題なければ`apply`。必要な動作確認をして完了。
```
terraform apply
```

terraform環境が複数あるなら、それぞれ差分確認、applyを行う。
アプリごとに環境が分かれてたり、さらに開発環境、ステージング環境、プロダクション環境とあるとかなり大変。

## まとめ
`plan`内容を1つ1つ確認しましたが、結果としてバージョンBump upによる`resource`や属性の変更は発生しなかったので、大層なコード修正も必要なかったです。メジャーバージョンの更新を含むので結構な覚悟をしていましたが、大きな問題はなし。terraform自身が後方互換をよく意識している証拠だと思います。
（それよりも、未コミットなコードがあって`plan`が取れない等、人為的なミスをいちいち担当者に確認するのが大変だった...）

これでまた2年しのげる...のかというとそれも微妙で、terraformは開発が活発で毎週バージョンが上がるので、やっぱりバージョン揃えて管理していくのはかなり面倒。
Terraform CloudやAtrantisの導入を考えたほうがいいかなぁ。

- [Terraform Cloud](https://app.terraform.io/)
- [Atrantis](https://www.runatlantis.io/)
NCMBの管理画面をGoogle Chrome機能拡張で便利にする（スクリプトログのダウンロード）

NCMBでは管理画面を提供していますが、時々物足りないことがあります。この機能があったらもっと便利なのに…と思いつつ、使っている方もいることでしょう。

そこで、その足りない機能を補足するGoogle Chrome機能拡張を開発しはじめました。今回は1.4で追加したスクリプトの実行ログダウンロード機能です。

## 動作について

実際の動作は以下のようになります。スクリプトのログ表示する画面に、ログDLボタンが追加されます。このボタンを押すと、ログデータがCSV形式でダウンロードされます。件数や日付、ステータスなどの検索条件も利用できます。

![log-dl.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/51b04cb5-7773-a32f-356e-9b282336dfa0.gif)


## インストール

[Chrome機能拡張のページからインストール](https://chrome.google.com/webstore/detail/ncmb-extension/dglkhlplcpmnbgodhbngcmdfpojkbdnc?hl=ja&authuser=0)してください。

## 利用法

任意のスクリプトファイルでログDLボタンを押してください。

## 制限

この機能拡張は [https://console.mbaas.nifcloud.com](https://console.mbaas.nifcloud.com/) 以下でのみ動作します。また、この機能は管理画面のAPIを使っていますので、APIコール数を消費しません。また、ACLは無視して処理されます。

DLされるファイルはCSVのみです。JSONをそのままCSVにしているので、行は長めかも知れません。

![スクリーンショット 2023-06-12 16.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/66ad1d3e-0b52-7156-440a-b665594347e0.png)


## コードについて

機能拡張のコードは[NCMBMania/chrome-extension](https://github.com/NCMBMania/chrome-extension)にアップロードしてあります。ライセンスはMIT Licenseです。依存ライブラリとして[URL.js](https://github.com/duzun/URL.js)を使っています（こちらもMIT Licenseです）。

## まとめ

機能的にはまだ多くありませんが、徐々に機能を追加していきます。Google ChromeでmBaaSの管理画面を利用されている方はぜひお使いください。
IBM i がサポートするWebSphere Application Server, Javaバージョンのリスト

前の記事、
WebSphere Application ServerやIBM S/Wの前提OS, S/W, H/Wの調べ方
https://qiita.com/gomAnomalocaris/items/20f3b5d290dee88c0562

の手順で調べたIBM i 7.xのサポートするWAS, JAVAバージョンのリストです。

■出典：http://pic.dhe.ibm.com/infocenter/prodguid/v1r0/clarity/index.html

Qiitaで表を埋めるのが面倒な為画像です、、すみません、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/744be887-8db6-65ea-6bfb-cef7cdebcc6a.png)
出典：	Software Product Compatibility Reports	
		
IBM i ver.	WAS9.0.5	Java
7.1	x	-
7.2	9.0.5 (IBM i 7.2TR8)	Java 8 SR5 FP15
7.3	9.0.5 (IBM i 7.3TR4)	Java 8 SR5 FP15
7.4	9.0.5	Java 8
7.5	9.0.5.12	Java 8
		
IBM i ver.	WAS9.0	Java
7.1	9.0 	Java 8
7.2	9.0 	Java 8
7.3	9.0 	Java 8
7.4	9.0.0.11	Java 8.0.4.1
7.5	x	-
		
IBM i ver.	WAS8.5.5	Java
7.1	8.5.5(IBM i 7.1 TR8) - 8.5.5.10	Java SE 1.6 or SE 7.0(WAS8.5.5) - Java SE 1.6, SE 7.0 or SE 8.0(WAS 8.5.5.10)
7.2	8.5.5.2 - 8.5.5.19(IBM i 7.2 TR8)	Java SE 1.6 or SE 7.0(WAS8.5.5.2) - Java 8 SR5 FP15(WAS8.5.5.19)
7.3	8.5.5.9(IBM i 7.3 TR4)	Java SE 1.6, SE 7.0 or SE 8 SR5 FP15)(WAS 8.5.5.9)
7.4	8.5.5.15	Java 8 SR5 FP15
7.5	x	-
		
IBM i ver.	WAS Liberty 23.0.0.5	Java
7.1	x	-
7.2	x	-
7.3	〇	Java SE 11.0 / Java SE 17 / Java SE8.0
7.4	〇	Java SE 11.0 / Java SE 17 / Java SE8.0
7.5	〇	Java SE 11.0 / Java SE 17 / Java SE8.0
※WAS Liberty 23.0.0.2. 23.0.0.3, 23.0.0.4も上記の表と同一です。		

■補足情報
IBM i と WAS V8.5.5について詳細なサポート説明のページ : https://www.ibm.com/docs/en/was-nd/8.5.5?topic=installation-i-prerequisites
※上記の表ではWAS8.5.5.xなどすべてのマイナーバージョンについてはサポートするjavaバージョンを調べていません。必要な場合は出典のリンクよりご確認ください。


■参考　こちらはIBM i 7.xがサポートするJavaバージョンのリストです。
IBM i 7.xがサポートするJavaバージョンリスト
https://qiita.com/gomAnomalocaris/items/c4d2c9d573b94c9603a3

■これも自分のメモ用ですが、
IBM i のWASライセンス体系は二種類あります。一般にPA(パスポートアドバンテージ)製品と呼ばれるほかのOS・プラットフォームと同じPAライセンスとして購入するWASとIBM i OSのバンドルS/W（IBM i OS料金に含まれるので追加費用無しで利用可）として提供されるWASライセンスです。後者はかつてWAS BASE, WAS Express等と呼ばれたシングルノード向けのWASです。PA版とIBM i バンドル版はIBMのライセンス番号が異なります。この辺の説明記事がこちら。
WebSphere Application Server for IBM i
Version 9.0 Overview　https://www.ibm.com/support/pages/websphere-application-server-ibm-i-version-90-overview

上記URLより引用※下記のThis product とは WAS V9.0 for IBM i のことです。
This product is available via Passport Advantage, It is ordered as PID 5724-J08, but installs as PID 5733W90 on the IBM i system. It is also available through ESS, at no additional charge, as web enablement for i under product number 5733-WE3.
Power BIでSharePointリストのデータを可視化する（Power BI Desktop）

## はじめに
Power BIを使っていて、元々のデータが更新された時に再度作り直すのが面倒だな。。と思われた事はありますか？

下記記事に詳しくは記載していますが、Power BIサービスでデータを扱う際にはExcelのデータなどをコピーして貼り付け、データソースを作成する必要がありました。

https://qiita.com/shinyasasaki/items/c9559fa9dec34fdcd9a8

簡易的な分析であればこれで問題ありませんが、皆様が日々業務をする中で下記のようなリクエストもあるかと思います。

**・貼り付けたデータは更新されないので古いままなので、更新されたデータを可視化するには都度レポートをデータセットから作り直さないといけない
・SharePointOnlineのリストがそのまま使えるとシンプルだし便利**

実は**Power BI Desktopを使うとSharePoint上のデータの参照ができる**ので、上記の懸念は解消可能です。
本記事ではその方法をお伝えしていきます。

## 前提条件（準備）
**1．自分がアクセスできるSharePointサイトでリストを作成、データを登録しておく事**

もし手元が使えるものがなければ、リストのテンプレートを使ってみて下さい
（自動的に列が作成されるのでテストで幾つかデータを保存しておく）
![スクリーンショット 2023-06-12 14.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/582b6eca-f601-c7a5-7539-3f237656b0f8.png)

**2．Power BI Desktopのアプリケーションが自分が操作するPCやサーバーにインストールされている事**

**3．インストールしたPower BI Desktopがリストが存在するテナントに接続できる事**


それではBI Desktopでの操作方法に関してまとめていきます。

## Power BI Destopの起動とSharePointリストへの接続
**1．「データを取得」からSharePointOnlineのリストを選択する**
![ezgif-1-daaa25dc81.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/5fe7bec6-1753-549b-c370-4523d331ec5b.gif)

**2．リストが格納されているサイトのURLを入力、リスト一覧が表示される**
![2_ezgif-1-b9f797e4fe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/63cfd17c-c6be-adb2-3558-7b4fac244405.gif)

**3．リスト一覧から対象のリストを選択し、読み込む**
![3_ezgif-1-e92765150d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/aa3ff2e2-e7b3-66d8-c0b7-1a55863f2c31.gif)


データの部分に、追加したリストが出てくれば読み込み成功です。
![スクリーンショット 2023-06-12 14.42.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/f70bb4ce-e086-dac7-df61-c6d14c3d82da.png)


### SharePointリストのデータ更新と反映確認
リストへの接続ができれば後はレポートを作成するだけですが、リストが更新された後にレポートが更新されるのかを見ていきたいと思います。

試しに幾つかビジュアルを追加してみました。この時は5つのレコード（行）のみ登録されています。
![スクリーンショット 2023-06-12 15.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/e6f36c77-32cb-299d-412a-0077a11ee859.png)

リストに1つサンプルのレコード（行）を追加してみます。
![スクリーンショット 2023-06-12 14.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/dee344d6-4e81-c0c0-a93b-f0bda119029a.png)

リストが更新された後に、Power BI Desktop側で「更新」ボタンを押してみます。
そうすると、リストに追加されたものがレポートにも反映される事がわかると思います。
![ezgif-4-7b3586f3bc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/bb00a660-e9de-9681-e075-97bf9b425913.gif)

もし、自動更新（定期的にレポートを最新化）する場合は、Power BIサービスを使うと可能です。
その場合は、サービス側にレポートを発行し、スケジュールを設定するとできます。
※こちらはまた別途まとめます。

こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
flash-all.bat実行でエラー

flash-all.bat実行でエラー


fastboot: error: device requires partition vendor_kernel_boot which is not known to this version of fastboot

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457637/980140b4-8d34-0427-c217-16afa03a5a02.png)

原因

ADB用ソフトウェアが古かった。
※以下推測で間違っていたらごめんなさい
Androidのドライブはいくつかのパーティションで分かれているようで、デバイスの方にはvendor_kernel_bootというパーティションが存在するが、ADBソフトでは非対応だったようです。

解決策
ADB用ソフトウェアを最新版にする。

※vendor_kernel_bootというパーティションに対応したADBソフトにしたことで、解決したようです。
[AWS Q&A 365][ECS]AWSのよくある問題の毎日5選 #76

# 1. 質問：起動に失敗しているタスク定義のトラブルシューティング方法は？
A: まず、タスク定義が有効であり、必要なリソースが割り当てられているかを確認してください。次に、コンテナイメージがアクセス可能で正しく設定されているかを確認してください。また、エラーメッセージや失敗のためにログを確認することもできます。

# 2. 質問：適切にスケーリングされないサービスのトラブルシューティング方法は？
A: サービスの構成が正しく設定されているか、希望の数と展開の設定を含めて確認してください。エラーや問題がないかを確認するために、サービスのログをチェックしてください。さらに、サービスが正しいスケーリングポリシーを使用しており、必要なリソースが利用可能であることも確認してください。

# 3. 質問：ロードバランサーの接続の問題をトラブルシューティングする方法は？
A: ロードバランサーの構成が正しく設定されているか、ターゲットグループとリスナーを含めて確認してください。ロードバランサーとの間のトラフィックを許可するためにセキュリティグループとネットワークACLを確認してください。最後に、エラーや問題がないかを確認するためにログをチェックしてください。

# 4. 質問：タスクのネットワーキングに関する問題のトラブルシューティング方法は？
A: タスク定義とサービスの構成を確認して、ネットワーク設定が正しいことを確認してください。タスクとの間のトラフィックを許可するためにセキュリティグループとネットワークACLを確認してください。最後に、ネットワーキングに関連するエラーや問題がないかを確認するためにログをチェックしてください。

# 5. 質問：コンテナの起動に関する問題のトラブルシューティング方法は？
A: コンテナイメージがアクセス可能で正しく設定されているかを確認してください。タスク定義が正しく定義され、必要なリソースが割り当てられていることを確認してください。コンテナやその依存関係に関連するエラーや問題を確認するためにログをチェックしてください。
[AWS Q&A 365][ECS]Daily Five Common Questions #76

# 1. Q: How do I troubleshoot a task definition that is failing to start? 
A: First, check the task definition to make sure it is valid and has the necessary resources allocated. Then, check the container image to make sure it is accessible and correctly configured. You can also check the logs for any error messages or failures. 

# 2. Q: How do I troubleshoot a service that is not scaling properly? 
A: Check the service configuration to make sure it is set up correctly, including the desired count and deployment configuration. Check the service logs for any errors or issues. Additionally, make sure the service is using the correct scaling policy and that the necessary resources are available. 

# 3. Q: How do I troubleshoot connectivity issues with a load balancer? 
A: Check the load balancer configuration to make sure it is set up correctly, including the target groups and listeners. Check the security groups and network ACLs to make sure they allow traffic to and from the load balancer. Finally, check the logs for any errors or issues. 

# 4. Q: How do I troubleshoot an issue with task networking? 
A: Check the task definition and service configuration to make sure the network settings are correct. Check the security groups and network ACLs to make sure they allow traffic to and from the task. Finally, check the logs for any errors or issues related to networking. 

# 5. Q: How do I troubleshoot an issue with a container failing to start? 
A: Check the container image to make sure it is accessible and correctly configured. Check the task definition to make sure the container is properly defined and has the necessary resources allocated. Check the logs for any errors or issues related to the container or its dependencies.
ifからunlessに書き換えする練習

```ruby
if c + z > 0
  puts "点数あるだけいいね！"
end
```
これをunlessを使って同じ意味で書き換えたい。

こうなる。
```ruby
unless c + z <= 0
  puts "点数あるだけいいね！"
end
```

ここで、c+z<０にしてはいけない。
c+zが0の場合でも、c+zが0より小さいという条件式がfalseとなるため文字列が表示されてしまう。
なので、演算子＜＝を使う。
WSL2でのapt updateでエラーを吐いた

# はじめに
WSL2を使用しているときに新しくアプリケーションのインストールをしようとして何も考えずにsudo apt updateを叩くとエラーを吐かれた。  

### エラー文
``` 
E: Release file for http://security.ubuntu.com/ubuntu/dists/jammy-security/InRelease is not valid yet (invalid for another 1h 51min 43s). 
Updates for this repository will not be applied.    
```

# 解決方法
yetとか出てたので日付関連だろうとあたりを付けて調べてみると時間がずれている場合があるらしいと発見。
`date`コマンドで時刻を見てみると時間がずれていたので
```
$ sudo hwclock --hctosys
```
で時間を合わせる   
この後に`sudo apt update`するとエラーを吐かなくなった
Rocky Linux8 Dockerコンテナの日本語化

## 日本語パッケージのインストール

```sh
dnf -y install langpacks-ja glibc-langpack-ja
```

## 文字コードの変更

```sh
localectl set-locale LANG=ja_JP.utf8
source /etc/locale.conf
```


## 文字コードの確認

```sh
localectl status
```
 ### 成功すれば以下の通り

```sh
System Locale: LANG=ja_JP.utf8
       VC Keymap: jp
      X11 Layout: jp
```

## タイムゾーンを日本に変更

```sh
timedatectl set-timezone Asia/Tokyo
```
【Java】VSCodeでSystem.out.printlnを記述した際「x:」が自動で挿入される件の解消方法

# はじめに
Javaの開発環境であるVSCodeにおいて、System.out.printlnなどのコードを記述すると、カッコ内に引数名が自動的に挿入されることがあります。この挿入される引数名は、Javaのパラメータ名のヒントとして表示されるため、一部の開発者にとっては邪魔に感じる場合があります。
![スクリーンショット 2023-06-12 14.34.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/62ab9d08-78e3-f5bd-dd9f-84a80926b975.png)

本記事では、VSCodeの設定を変更することで、JavaのSystem.out.printlnで引数名が表示されないようにする方法を解説します。

## 解決方法
以下の手順に従って、VSCodeの設定を変更します。
1. VSCodeを開きます。
1. メニューバーの「ファイル」をクリックします
1. 「基本設定」->「設定」を選択します。
1. 設定画面が表示されます。
1. 上側の入力ボックスで「parameter」を検索します。
1. 左側のナビゲーションボックスでJavaを選択します
1. 「Java › Inlay Hints › Parameter Names: Enabled」が表示されます
1. プルダウンメニューを「none」に変更します。
## ![スクリーンショット 2023-06-12 14.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/9f434473-52f7-2b1f-371e-de2d3af3d5cb.png)
![スクリーンショット 2023-06-12 14.38.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/48bbddc7-9431-983b-14a6-03574699f30f.png)
![スクリーンショット 2023-06-12 14.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/6c1eebc3-1883-dc28-88dd-a93b6b412571.png)
![スクリーンショット 2023-06-12 14.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/ce89f603-a498-df23-f005-f7925bda46a2.png)

## 結果
以上の手順で設定を変更することで、JavaのSystem.out.printlnなどのコードにおいて引数名が表示されなくなります。この設定変更により、コード内の表示がシンプルになり、邪魔に感じる要素を削減できます。

## まとめ

本記事では、Javaの開発環境であるVSCodeにおいて、System.out.printlnで引数名が表示される問題を解消する方法について解説しました。設定画面からJavaのInlay Hintsの設定を変更することで、引数名の表示を無効化することができます。

ただし、設定変更には注意が必要であり、ヒントが非表示になる可能性や他の操作に影響がある可能性があります。設定変更は自己責任で行い、必要なヒントや情報が欠落しないよう慎重に検討してください。