OmniAICreator/Qiita-1.07M huggingface dataset:
開発者もIDEから稼働中のシステムの状態を確認したい？（ログ検索編）

# 概要
IDEを使って開発した後にデプロイされたシステムのパフォーマンスやログなどをIDE上で簡単に検索できたらワクワクしませんか？問題が起きたときのトラブルシュートでも使えますし、次のシステムの改善点を考える上でも活用できます！

こちらの投稿では開発者が使っている***IDEからデプロイ済みのシステムのログを検索***してみたいと思います。

***CodeStreamを使用するための設定***については下記で紹介しているので参照してください。

https://qiita.com/T_OMORI/private/0bb538095c36ba662948

CodeStreamの詳細は公式ガイドを参照ください。

https://docs.newrelic.com/jp/docs/codestream/start-here/what-is-codestream/

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2024年2月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202402 "New Relic アップデート(2024年２月)")
:::

# ログを検索（基本）
デプロイされているシステムのログをIDEから検索してみます。
まずは、CodeStream上のView Logsをクリックします。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/574c5b2d-fb42-b270-2255-78a1952f38da.png">

タブで開いたCodeStream(Logs)の検索ボックスに文字列を入れて[Query Logs]で検索すると、ログ検索の結果が素早く一覧表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/87d91cf6-ac67-b8b8-7cff-61ac96b3a684.png)

# ログを検索（文字列を選択）
ソースコード上で文字列を選んで検索することも可能です。
文字列を選択して右クリックから[Find in Logs]を選ぶと、選択された文字列で検索された状態でCodeStream(Logs)がタブで開いて、ログ検索の結果を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/0673bfd7-adc4-3d6b-0283-c416c0c0ea54.png)


# まとめ
CodeStreamを使ってIDEにからデプロイされたシステムのログを検索してみました！
いつも使っているIDEから直接見ることができるので、調査が早くできるだけでなく、自然とシステムの改良点などが見えてくるのではないかと思います！ぜひお試しください。

***CodeStreamでのログ検索の詳細***は下記を参照ください。

https://docs.newrelic.com/jp/docs/codestream/observability/log-search/


また、***CodeStreamを使用するための設定***については下記で紹介しているので参照してください。

https://qiita.com/T_OMORI/private/0bb538095c36ba662948

:::note info
このアップデートの詳細はこちら
[New Relic アップデート(2024年2月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202402 "New Relic アップデート(2024年２月)")
:::

:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
discord.pyで定期的に変わるbotのステータスをいい感じに実装する

# はじめに

Discordのbotの定期的に変わるステータスをよく見かけるので実装する方法を紹介します。

## この記事の対象者

- ある程度Pythonの知識があり、discord.pyで定期的に変わるbotのステータスを実装したい。

## 前提知識

- 基本的なPythonの記法と仕様を理解している
- discord.pyの基本的な使い方を知っている

# 実装

## 実際のコード

```python: main.py
import asyncio

import discord


# ステータス変更
async def change_status(statuses: dict, interval: int):
    while True:
        key = list(statuses.keys())[0]
        value = statuses.pop(key)
        statuses[key] = value

        if value == "playing":  # ~をプレイ中
            status = discord.Activity(type=discord.ActivityType.playing, name=key)
        elif value == "streaming":  # ~を配信中
            status = discord.Activity(type=discord.ActivityType.streaming, name=key)
        elif value == "listening":  # ~を再生中
            status = discord.Activity(type=discord.ActivityType.listening, name=key)
        elif value == "watching":  # ~を視聴中
            status = discord.Activity(type=discord.ActivityType.watching, name=key)
        elif value == "competing":  # ~に参戦中
            status = discord.Activity(type=discord.ActivityType.competing, name=key)
        else:  # その他
            status = discord.Activity(type=discord.ActivityType.custom, name=key)
    
        await bot.change_presence(activity=status)
    
        await asyncio.sleep(interval) # インターバル(秒)


# ステータス定義 ({key}を{value}中)
statuses = {
    "Minecraft": "playing",
    "YouTube": "watching",
    "Spotify": "listening"
}


@bot.event
async def on_ready():
    print(f'Logged in as {bot.user.name}')
    await change_status(statuses, 30)
```

## 解説

### `change_status()`関数

この非同期関数は、与えられたステータスとインターバルに基づいて、botのステータスを変更するループを作成します。ステータスは辞書形式で与えられ、キーは表示したいアクティビティ、値はそのアクティビティのタイプです。各アクティビティにはそれぞれ適切な`discord.ActivityType`が割り当てられます。例えば、`"playing"`の場合は`discord.ActivityType.playing`が、`"watching"`の場合は`discord.ActivityType.watching`が使用されます。よって、`"Minecraft": "playing"`とした場合、botのステータスは`"Minecraftをプレイ中"`と表示されます。キーと値は上から順に取り出され、循環するように処理されます。

### `on_ready()`デコレータ

そして`on_ready()`デコレータはbotが起動し準備が完了したときに実行されます。このイベントが発生すると、`change_status`関数を呼び出します。

# 終わりに

最後まで読んで頂きありがとうございます。不備があれば是非コメントで指摘して下さい。
ZED SDK での座標系の定義

# 想定する読者
stereolabsのzed2, zed mini, zed x などのステレオカメラの利用者
いまどきのステレオカメラは何ができるのかを知りたい人

# 前提
ZED SDK 4.0
Ubuntu 20.04
ZED2i
Python 版のAPI

## ZED SDK での座標系の定義
- ZED SDKでは、プログラムの中で、座標系の定義を選べるようになっている。

### 座標系の向きの定義に関する公式ドキュメント
https://www.stereolabs.com/docs/positional-tracking/coordinate-frames

![](https://docs.stereolabs.com/positional-tracking/images/CoordinateSystem.jpg)

ZED SDK のサンプルスクリプトで用いられている座標系の定義
```
init_params.coordinate_system = sl.COORDINATE_SYSTEM.RIGHT_HANDED_Y_UP
```

- 座標系の原点の位置は、図に示されているとおりです。

### ユーザースクリプトの中でどうするのがよいか
- 積極的に変更する理由がなければ、公式の標準で採用している座標系を使うのがよいと思います。
- 積極的に変更する理由の候補：
    - ステレオ計測した結果を用いる側のライブラリでの座標系の定義。
PowerApps sharepoint onlineのアイテムのデフォルト値の取得

アイテムを新規作成する時、sharepoint onlineのアイテムのデフォルト値を取得して、
画面上に設定する場合があります。
どうやってデフォルト値を取得するのかを調査しました。

# アイテムのデフォルト値の取得

取得方法：
Defaluts(リスト名).カラム名

対応するフィールドの種類:
数字
文字列
はい/いいえ

対応できないフィールドの種類:
選択肢
日付

# 注意点
上記の方法でアイテムのデフォルト値の取得ですますが、
アイテムのデフォルト値を変更すると、画面上に反映しないです。
powerappsを再公開すると、表示されます。

# 参考サイト
https://powerusers.microsoft.com/t5/Building-Power-Apps/Sharepoint-list-get-default-values/td-p/759865

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-defaults
UEFI環境でUbuntu 22.04でRTX4060でcudaをsetup

# まず、、、

* BIOSでSecure bootをdisable
    * 有効のままの場合は、必ず、Setupでsecure boot configでpasswordを設定すること

* 3rd party software込みでinstallすること

# nVIDIAのドライバーセットアップ

https://developer.nvidia.com/cuda-downloads

WSL2ユーザーは、必ず、上からWSL向けをdownloadすること（下は直にUbuntuをinstallした場合の話）

```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.debsudo dpkg -i cuda-keyring_1.1-1_all.debsudo apt-get updatesudo apt-get -y install cuda-toolkit-12-4
```

```
sudo apt-get install -y nvidia-driver-550-opensudo apt-get install -y cuda-drivers-550
```
# .bashrc

https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

```
echo "export PATH=/usr/local/cuda-12.4/bin${PATH:+:${PATH}}" >> .bashrc
echo "export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" >> .bashrc
```

# additional installation

```
sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa-dev libfreeimage-dev libglfw3-dev git
```
# cuda samples

```
mkdir work
cd work
git clone https://github.com/NVIDIA/cuda-samples
cd cuda-samples/Samples

cd BlackScholes
make
./BlackScholes

cd ../5_Domain_Specific/nbody
make
./nbody
```
Nanoplotをcondaでinstallする際に気をつけること[備忘録]

condaでロングリード(Nanopore read)用のクオリティ分析ツールである、Nanoplotをinstallした。
しかし、
```
$ conda install -c bioconda nanoplot
```
では導入できなかった。

調べてみるとtwitter (X)にて、@drk0311さんが以下のように言及していた。

https://twitter.com/drk0311/status/1318968591899795456

ということで、以下のようにpipでNanoplotをinstallしてみた。

```
$ conda create -n nanoplot python=3.7 pip
$ conda activate nanoplot
$ pip install nanoplot
```

この方法では、Nanoplotをinstallできた。

@drk0311さんは2020/10/22にtweetしているが、2024/3/25現在も、pipでinstallするしか方法がなさそう。
AzureADB2CのJWTアクセストークン検証を行う

# 大まかな流れ
* AzureAdB2Cのopenid-configurationから関連するEndpointを取得する
* jwks_uriの情報から公開鍵を生成する
* JWTのアクセストークンを検証する
# Endpointの取得
必要そうなのは、issuerとjwks_uri
[Microosftのサンプルサイト](https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/B2C_1_susi_reset_v2//v2.0/.well-known/openid-configuration
 "タイトル")
``` C#
class OpenIdConfig
{
    public string issuer { get; set; }
    public string jwks_uri { get; set; }
}

private async Task<OpenIdConfig> GetEndPointAsync(string onfigureEndpointUrl)
{
    var result = await _httpClient.GetStringAsync(configureEndpointUrl);
    return JsonSerializer.Deserialize<OpenIdConfig>(result);
}
```

# jwks_Uriから公開鍵の生成
[Microosftのサンプルサイト](https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/b2c_1_susi_reset_v2/discovery/v2.0/keys
 "タイトル")
``` C#
private async Task<Dictionary<string, RsaSecurityKey>> GetPublicKeyAsync(string jwksUri)
{
    //公開鍵キー情報を復元
    var jsonStr = await _httpClient.GetStringAsync(jwksUri);
    var sets = new JsonWebKeySet(jsonStr);

    //公開鍵生成（jwksUriには複数登録されているためDictionaryとする）
    var rsaProvider = new RSACryptoServiceProvider();

    var publicKeys = new Dictionary<string, RsaSecurityKey>();
    foreach (var key in sets.Keys)
    {
        rsaProvider.ImportParameters(new RSAParameters
        {
            Exponent = Base64UrlEncoder.DecodeBytes(key.E),
            Modulus = Base64UrlEncoder.DecodeBytes(key.N)
        });
        publicKeys.Add(key.Kid, new RsaSecurityKey(rsaProvider));
    }
    return publicKeys;
}
```
# JWTのアクセストークン検証
```C#
private ClaimsPrincipal ValidToken(string token, string issuer, RsaSecurityKey publicKey)
{
    //とりあえずこれで、署名・発行者・期限の確認ができる
    var validationParams = new TokenValidationParameters
    {
        ValidIssuer = issuer,
        ValidateLifetime = true,
        IssuerSigningKey = publicKey,
    };
    var handler = new JwtSecurityTokenHandler();

    var claim = handler.ValidateToken(token, validationParams, out SecurityToken securityToken);
    return claim;
}
```

# サンプル
※コストがかかるので、公開鍵の生成までは事前に行うこと
```C#
string accessToken = "ey～";
string config = "https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/B2C_1_susi_reset_v2//v2.0/.well-known/openid-configuration";

//Endpointを取得する
var openIdConfig = await GetEndPointAsync(config);

//jwks_Uriから公開鍵の生成
var publicKeys = await GetPublicKeyAsync(openIdConfig.jwks_uri);

//JWTのアクセストークン検証
try
{
    ValidToken(accessToken, openIdConfig.issuer, publicKeys["xxxxxxxxx"]);
}
catch (SecurityTokenExpiredException)
{
    //期限切れ
}
catch(SecurityTokenInvalidSignatureException)
{
    //証明書誤り
}
catch (Exception)
{
    //その他
}
```

# 次回
JWT検証を使いやすいようにアトリビュートで実装したいと思います。
はたしてニーズはあるのか？！
誕生日のパラドックスをpythonを使って検証してみた

# 概要


**誕生日のパラドックス**とは、「同じ誕生日の人がいる確率が50%を超えるのは、何人集まれば良いか？」という問題において、結果が直感と反しているというパラドックスです。


確率を計算すると以下の結果になります。

- 40人の場合は、`約89.12%`
- 23人の場合は、`約50.73%`

個人的にも納得できないので、Pythonを使って検証をしていきたいと思います。

# 計算式

同じクラス内に1組以上の誕生日が一致する確率は以下の式から導き出せます。（nは1クラスの人数）

```math
p(n) = 1 - \frac{365!}{365^n(365-n)!}
```


# コーディング


## 関数①：計算式を基にコーディング

まずは、計算式を基にプログラムを書いてみました。

```python
def birthday_paradox_prob_calc(n: int) -> float:
    '''
    誕生日のパラドックスの計算を行う
    Args:
      n (int): 人数
    Returns:
      float: 確率（%）
    '''
    if n > 365:
        return 100.0

    prob_no_shared_birthday = 1.0
    for i in range(n):
        prob_no_shared_birthday *= (365 - i) / 365
    prob_shared_birthday = 1 - prob_no_shared_birthday
    return prob_shared_birthday * 100
```

0から100までの折れ線グラフを作成すると、以下のようなグラフができます。
たしかに、23人くらいで50%くらいになっています。


![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/cb69daba-236e-b301-a93d-b0934b6ca21d.png)



## 関数②：シミュレーションを行うようにコーディング

こちらの関数は、実際に1から365の配列を作成し配列内に重複があるかどうかの割合を返すプログラムです。`try_count`に大きい数値を指定することで、より正確なシミュレーションができます。


```python
import random

def birthday_paradox_prob_act(n: int, try_count: int = 10000) -> float:
    '''
    誕生日のパラドックスのシミュレーションを実行する
    Args:
      n (int): 人数
      try_count (int): 試行回数
    Returns:
      float: 確率（%）
    '''
    if n > 365:
        return 100.0

    true_count = 0
    for _ in range(try_count):
        random_numbers = [random.randint(1, 365) for _ in range(n)]
        if len(random_numbers) != len(set(random_numbers)):
            true_count += 1

    return (true_count / try_count) * 100
```

試行回数を50を指定するとグラフは以下のようになりました。
(50を指定すると各人数のところで50回試行しその割合をグラフに表示します。そのため上がったり下がったりしています。）

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/b9cf28c9-4619-c5a6-5cc0-40916961ba5c.png)

試行回数を10,000を指定するとグラフは以下のようになり、ほぼ関数①と同じ形になりました。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/29c3d6d3-9d4b-b8a3-6507-ecc18b85c0ad.png)




## グラフを出力

matplotlibを使用して、2つのグラフを表示します。

```python
import matplotlib.pyplot as plt

def main():
    x = list(range(0, 101, 5))
    calc_data = [birthday_paradox_prob_calc(n) for n in x]
    act_data = [birthday_paradox_prob_act(n) for n in x]

    plt.rcParams['font.family'] = 'MS Gothic'
    plt.plot(x, calc_data, marker='o')
    plt.plot(x, act_data, marker='x')
    plt.title('誕生日のパラドックス')
    plt.xlabel('人数')
    plt.ylabel('確率 (%)')
    plt.grid(True)
    plt.show()
```

試行回数を50を指定するとグラフは以下のようになりました。
ぶれてはいますが、関数①のグラフと大体同じになってますね。

（青色が関数①、オレンジ色が関数②）

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/490c34fd-399f-a431-672b-769d3447e2b9.png)

試行回数を10,000を指定するとグラフは以下のようになり、よくみると僅かにずれていますが、確率が収束したのが分かります。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/bd7236f3-c0e2-4876-d51e-b0520f43b9fd.png)

# おわりに

誕生日のパラドックスを検証するプログラムを作ってみました。
冒頭で話した、23人で50%というのは正しそうです...

ちょっと悔しいですが、気になった問題があったら検証してみたいと思います。

ここまで読んでいただきありがとうございました。
【Flutter 3.19以降】Flutter 製のアプリか見分ける方法

## ■ はじめに

2024年2月16日に Flutter 3.19 が発表されました。

https://medium.com/flutter/whats-new-in-flutter-3-19-58b1aae242d2

アニメーションとかメソッドが追加されたりなど色々と変更点がありましたが、Twitter の皆さんが多分一番びっくりしていたのが、二本指でスクロール問題かと思います。
今までは Flutter で開発されたアプリか調べる為に二本指でスクロールして早くなるかどうかを指針にしていました。
しかし、Flutter 3.19 にすると今までの方法ではもう分からないよという事で、じゃあ今後はどのように判断するかという話をします。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/db2bdf19-99f1-f69d-581d-33518fe6f6f8.png)

- 移行ガイド

https://docs.flutter.dev/release/breaking-changes/multi-touch-scrolling

## ■ 本題
ずばり Flutter Shark というアプリを使うんです。（ちなみに iOS では使えず Android 端末のみ）

- 公式

https://fluttershark.hashnode.dev/

- Google Play Store

![2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/18e3b8d7-751f-3fd4-a42b-9b0590c678cc.jpeg)

インストールして起動すると自分のデバイスに入っている Flutter 製アプリが一覧で表示されます。
Dart / Flutter のバージョンも表示されてます。

![5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/003fff73-fbb2-6b0d-92c7-0ba63beb1035.jpeg)

該当のアプリをクリックすると、使用している Packages も表示されます。（この例では Money Forward さん）
これ凄いですよね。どうやってるんだろ。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/303d785f-d3a8-63f8-b86d-77dbf09daab1.jpeg)
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/2452b207-4822-5d35-fbed-786d31eeee61.jpeg)

こんな感じで、インストールしているだけで良いので、非常に簡単ですので簡単にご紹介させていただきました。
iOS ではこういう方法があるよ。などあれば是非教えてください。（私は Android と iOS 両方使ってます）


以上。
figによるターミナル補完が効かなくなったのでAmazon CodeWhispererに乗り換えてみる

## 概要

figによるコマンド補完が効かなくなった旨をお友達に愚痴ったら、「Amazon CodeWhispererというものになったらしいぞ！」と教えてくれたので入れ直してみる。

## 情報

お友達が教えてくれた情報源はこちら。

https://github.com/withfig/fig/issues/2885#issuecomment-1911474064

## 方法

### figをアンイストール

1. figのウインドウを開く。
1. Settingを開く。
1. 下部までスクロールする。
1. 「Uninstall Fig」をクリックする。

### Amazon CodeWhispererをインストール

- 下記にアクセスする。

https://docs.aws.amazon.com/codewhisperer/latest/userguide/command-line-getting-started-installing.html

- 「Download CodeWhisperer for command line(macOS only)」をクリックする。

    ![CleanShot 2024-03-25 at 20.17.01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fbd460f4-d009-56fe-d7d3-e20112d82c17.jpeg)

- ダウンロードされたファイルを開く。アプリケーションフォルダにドラッグアンドドロップしてそちらのアイコンをクリックして開く。
- 「Get started」をクリックする。

    ![CleanShot 2024-03-25 at 20.21.09@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/352e2f73-bd50-214a-ae04-93b01329aeb4.jpeg)

- 「install」をクリックする。

    ![CleanShot 2024-03-25 at 20.22.21@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d042426e-0feb-16d4-9a14-7e65d4d72790.jpeg)

- 「Enable」をクリックする。

    ![CleanShot 2024-03-25 at 20.23.12@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b3573024-4b07-52c1-a4d6-5d4796c72210.jpeg)

- Macの設定でアクセシビリティが開くのでCodeWhispererのスライダーをONに設定する。
- AWSのアカウントでログインを求められるらしいので「Sign in」をクリックする。

    ![CleanShot 2024-03-25 at 20.24.14@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7a79e6e0-bfdd-17f1-6a60-449523917868.jpeg)

- アクティブブラウザで「Authorization requested」の画面が出るので問題なければ「Confirm and continue」のボタンをクリックする。
- AWS ビルダーIDの作成を求められるので持っていない場合案内にアカウントを作成する。
- アカウント登録とログインに成功するとポータルにアクセスするリンクが出てくるのでクリックする。ポータルが開けば一旦登録は完了となる。
- もう一度の「Sign in」をクリックする。

    ![CleanShot 2024-03-25 at 20.24.14@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7a79e6e0-bfdd-17f1-6a60-449523917868.jpeg)

- 「Allow Access」をクリックする。

    ![CleanShot 2024-03-25 at 20.39.25@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3eb0534b-e34e-cc6b-5746-fc93681d0484.jpeg)

- Amazon CodeWhispererのウインドウが開く。

    ![CleanShot 2024-03-25 at 20.40.01@2x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8e816281-e3bf-0f61-e4ca-ab06be89db2c.jpeg)

- 「Launch a new shell session to start using autocomplete!」と書いてあるので、とりあえず新しいターミナルのウインドウを起動してみる。
- 筆者はCursorのターミナルを使っているのだが、新しいコマンドラインタブを開き、lsコマンドを入力し、スペースを入力してみたら補完が表示された。特段パスを通したりしていないのにすごい。。

    ![CleanShot 2024-03-25 at 20.42.49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d8f34945-e91f-19ff-9934-4e9c15905f51.jpeg)

- その後、VScodeや純正ターミナルでも補完が表示された。

    ![CleanShot 2024-03-25 at 20.44.33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/26aee5e2-9588-a912-c1df-3613e4cac012.jpeg)


## 参考文献

https://aws.amazon.com/jp/blogs/devops/introducing-amazon-codewhisperer-for-command-line/

https://github.com/withfig/fig/issues/2885

https://zenn.dev/yuta28/articles/codewhisperer-tutorial
Redisでキーの削除時にブロックが発生する状況を生じさせるための検証用データを作る

## はじめに

Redisでは、1つの処理が長時間に及ぶとブロックが発生します。
たとえば、大量の要素が登録されたセット型のキーを削除しようとしたような場合です。

ブロックが発生すると、クライアントが処理を実行しようとしても、ブロックが解消されるまでは応答が返ってこなくなります。

DEBUG SLEEPコマンドでブロックが発生したのと同じ状況を作り出すことはできるのですが、キーを削除していてブロックが発生するような状況を作り出したい場合には、ブロックが発生するようなデータを実際に作って確認したいものです。

環境に寄りますが、単純なキーの削除でブロックを発生させたい場合は、何千万個かの要素を登録したセット型のキーを用意して、そのキーをDELコマンドで削除するとブロックを発生させられます。

1つのキーに何千万個もの要素を登録するような設計を実際の運用で行うことはないと思いますが、ブロックを発生させての検証を行いたい場合には有効だと思います。

## キーを作成するためのコード

下記の例では、セット型のキー1つに3000万個の要素を追加しています。
10～20個ぐらいの要素を追加するなら、単純にredis-cliでsaddコマンドを実行すればよいですが、3000万個ともなるとそれは無理ですので、Pythonでコードを書きました。

1回の処理で3000万個の要素を追加するのは無理だろうと思いつつ実施してみましたら、懸念したとおり、処理が強制終了しました。
よって、1回の要素の登録数を100万個にして、100万個の要素を30回追加するようにしましたところ、処理が可能なことを確認しました。

```python
import redis

# 1回のsadd実行で登録する要素数
entry_num = 1_000_000

# saddを実行する回数
exec_sadd_times = 30

# キー名
key_name = 'mydata'

# Redisに接続する
r = redis.Redis(host='localhost', port=6379)

# セット型のキーに要素を登録する
# entry_num * exec-sadd_timesの数だけ要素を登録する
for e in range(0, exec_sadd_times):
    # 要素の開始・終了の範囲を設定する
    range_from = (entry_num * e) + 1
    range_to = range_from + entry_num

    # 要素を作成する
    new_entries = list(range(range_from, range_to))

    # セット型のキーを登録する
    # 同じキーに対してsaddを実行するので、1つのキーに対して大量の要素を追加することになる
    # saddに渡す値はアンパックする
    r.sadd(key_name, *new_entries)
```

## 実行

シバンを付けたり、実行用パーミッションを付けるのは、各自で対応してください。

```bash
$ python set_mydata.py
```

## キーの確認

キーが1つ登録され、当該キーの要素数が3000万個であることを確認しました。
この時のRedisのメモリ使用量は989.63MBでした。

```
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=1,expires=0,avg_ttl=0

127.0.0.1:6379> SCARD mydata
(integer) 30000000

127.0.0.1:6379> info memory
# Memory
used_memory:1037699024
used_memory_human:989.63M
used_memory_rss:1063030784
used_memory_rss_human:1013.79M
used_memory_peak:1078087568
used_memory_peak_human:1.00G
used_memory_peak_perc:96.25%
used_memory_overhead:870080
used_memory_startup:865968
used_memory_dataset:1036828944
used_memory_dataset_perc:100.00%
```

## キーの削除を実行する（ブロックが発生する）

環境によりますが、先のキーの削除には数秒前後かかります。
この間はブロックが発生していて、他のクライアントからの処理を受け付けなくなっています。

たとえば、キーの削除中に他のクライアントから`info`コマンドを実行すると、別のクライアントで実行しているキーの削除によるブロックが終わるまで、`info`コマンドの結果は返ってきません。

2つのターミナルをそれぞれクライアントA・Bに見立てて、クライアントAで`del mydata`コマンドを実行した直後にクライアントBで`info`コマンドを実行した結果は、次のとおりです。

```:クライアントA
127.0.0.1:6379> del mydata
(integer) 1
(7.71s)
```

```:クライアントB
127.0.0.1:6379> info    ← クライアントAで del mydata を実行した直後に実行
# Server
redis_version:7.2.4

（略）

# Keyspace
(7.24s)    ← クライアントAで「(7.71s)」が表示された後に応答が返ってきた。
```

## 本手順で作成したキーの使い道

`del`コマンドの実行でブロックが発生することの検証の他に、以下の検証にも使えます。

* `unlink`コマンドでキーを削除した時の挙動
    * データをノンブロッキングで削除する
* lazyfree-lazy-user-delディレクティブを`yes`として`del`コマンドを実行すると、`unlink`コマンドと同じ処理を行う
    * `del`コマンドを使っても、強制的に`unlink`コマンドを実行したときと同じ処理が行われ、ノンブロッキングで削除される
【Linux】条件に当てはまる行＋後ろn行を別ファイルに抽出する

## はじめに

以下のようなNginxのログのうち、`[error]`の行とその後ろ1行だけ抽出して別のファイルに出力します。

```nginx.log
[2024-03-25 11:13:14] [notice] xxxxxxx
[2024-03-25 11:13:14] [error] xxxxxxx
error message：xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[2024-03-25 11:13:14] [notice] xxxxxxx
[2024-03-25 11:15:45] [error] xxxxxxx
error message：xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[2024-03-25 13:54:45] [warn] error...
```

## コマンド

```bash
$ grep -A 1 "\[error\]" nginx.log > error.log
```
- grepでは条件に該当する行だけ表示されるため、後ろn行を出力したい場合は`-A n`を指定する
    - ちなみに、 前n行を出力したい場合は`-B n`というオプションを追加する
        - AfterのA、BeforeのBなので覚えやすい
- `[`と`]`は正規表現で使われるメタ文字なので、`\`でエスケープする

## 終わりに

後ろn行だけ指定したいという需要が絶対あると思ったので、オプションを調べたら案の定ありました。

## 参考

https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/137greplineplus.html
CpawCTF Q14.[PPC]並べ替えろ!

# 実行環境
OS : Mac(M1チップ）

# 解法
以下のように数値を降順で出力するプログラムを作成しフラッグを入手する．

```c++:sort.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    //問題の数値を配列に格納
    int n[]={15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207};
    
    sort(n.rbegin(),n.rend());
    for(int i:n)cout<<i;

}
```
CpawCTF Q6.[Crypto] Classical Cipher


# 目次
- 実行環境
- 解法
- 用いたアルゴリズムの概要

# 実行環境
OS : Mac(M1チップ）
言語　 : java 21.0.2
# 解法
フラッグをシーザー暗号（3シフト)を用いて暗号化したものが与えられる．
与えられたもの以下に示す．

    [暗号化されたフラッグ]
    fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}

シーザー暗号をデコードするプログラムを作成し，暗号を復元化してフラッグを入手する．

今回，デコーダーをjavaで作成した．
作成したプログラムを以下に示す．

```java:caesar.java
class CaesarDecoder
{
	public static char decode(char character,int key,boolean small)
	{
		//convert to character code
		int now=(int)character;
		now-=key;
		if((small && (int)'a'>now) || (!small && (int)'A'>now)){
			now+=26;
		}
		return (char)now;
	}
	public static void main(String[] args)
	{
		int key=3;
		if(args.length>1)key=Integer.parseInt(args[1]);
		
		String s=args[0];
		System.out.println(s);
		
		for(int i=0;i<s.length();i++){
			char now=s.charAt(i);
			char decoded=s.charAt(i);
			
			if('a'<=now && now<='z')decoded=decode(now,key,true);
			else if('A'<=now && now<='Z')decoded=decode(now,key,false);
			System.out.print(decoded);
		}
		System.out.println();
	}
}
```

 # シーザー暗号のアルゴリズム概要
 入力された文字の大文字・小文字を判別する．
 英字の大文字・小文字以外ならそのまま出力．
 英字なら大文字・小文字それぞれで3字分前のアルファベットを出力する．
SONY PDT-FP1のServiceMenuの入り方

# ServiceMenuとは
「ServiceMenu」は`Xperia`にごく最近まで「ServiceTest」があり、ボタンやタッチ画面、各センサが機能しているかを確認できる機能でしたが、現在では、「Xperia用サポート」に機能が分離されました

以前は`*#*#7378423#*#*`で「ServiceTest」が出来たのですが、今は「Serviceinfo」しかありません

# なぜこの記事を？

なぜこの記事を書こうと思ったのは一部の`Xperia`が「Xperia用サポート」非対応で確認ができない中、「電話」機能を排除した「モバイルデータトランスミッター」である
「PDT-FP1」では「ServiceMenu」どういった扱いなのかを本体を触っていたところ発見したので、覚書になります

# 機能の入り方
1. 「設定画面」を開きます
![設定画面へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/ebeac37f-805d-245f-34f1-dd026c466b50.png)

2. 「機器情報」を開きます
![設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/5fbc0cfd-e87b-e325-61b5-0bd585e07114.png)


3. 「ビルド番号」を連打し「開発者向けオプション」を出します
![情報機器.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/67920b87-48dd-e0f2-c9d3-39e541149ab8.png)

4. 「設定画面」に戻ります
5. 「システム」を開きます
![設定画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/dffe1456-2863-83ff-9fa7-f73d06ea002d.png)

6. 「開発者向けオプション」を開きます
![システム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/0322879b-6306-a85b-0370-a2c73092ca75.png)


7. 「Service Menu」を開きます
![開発者むけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/50127996-326f-a5d2-3316-34f7a8b53906.png)


なんと、「開発者向けオプション」の中に今までとお馴染みの「Serviceinfo」と「ServiceTest」が移動していたんですね
![ServiceMenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/38c1f4c5-6484-97bc-9c19-9be7ca9da1a7.png)



# 発売直後の「Serviceinfo」項目
![Test_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/9a91463e-6d79-ab33-e307-dc82e7dca100.png)

![Test_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679847/9fe73f88-9e0b-55db-af9b-e053033874fe.png)


今回追加されている冷却ファンのテストがあるのはありがたいですね

# まとめ
恐らく、電話機能をなくしたことによる、「Serviceinfo」機能に入れなくなる応急処置だとは思いますが、これで本体が不調になった際に本体が正常かを確認できますね。

それでは良いSONYライフを！
Windows 365 Boot 専用モード（Dedicated Mode）

マイクロソフトの渡部です☺

本記事では、Windows 365 Boot専用モードへの設定の仕方をご紹介します。

**Windows 365 Boot 専用モード とは？**
- 2024年1月に一般提供開始となった機能
- 自分専用の物理PC、自分専用のクラウドPCを所有している前提で、
物理PCから直接クラウドPCにサインインして仮想デスクトップを使うことができる機能
- 物理PCに備わるサインイン認証機能を用いて、クラウドPCにもサインインできる（パスワードレス認証も可能！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/63713c6b-6aaa-7df2-cfa8-efc68b4a8564.png)

# 前提条件
- Windows 11ベースのエンドポイント (Windows 11 Pro および Enterprise)
- Microsoft Intune 管理者の権限
- Windows 365 クラウド PC ライセンス。クラウド PC の作成方法については、プロビジョニングポリシーの作成を参照してください

本機能、プレビューは取れていますが、Insider Preview登録済の物理PCで検証したものになります。

# 設定方法
1. Microsoft Intuneにログインする
管理者権限があるアカウントで、[Microsoft Intune](https://intune.microsoft.com/)にログインしてください


2. 構成プロファイルを立ち上げる
デバイス＞Windows 365＞Windows 365 ブートの順にクリックして構成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/581c0044-7d3e-f7db-7d36-2aea315e1780.png)


3. 読んで次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/b2298621-be50-a490-7303-31291d758c10.png)

4. 構成プロファイル名、デバイスモードを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/f405a587-1595-6b70-6cdb-a65f5e13ec9d.png)

5. 更新設定に変更がなければ次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/afa7ff69-c365-4898-7dae-c757374927e5.png)

6. ネットワークや言語等、変更がなければ次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/8ca113b7-4ee2-587d-8322-a4b612606859.png)

7. この構成を適用するセキュリティグループを新規作成、もしくは既存で選択して次へ
グループには適用したい物理PCが含まれている必要があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/5ac5ad5a-ba2a-272a-fab1-6d02ef909c7d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/6219a316-817e-69da-9a0e-a3789571dec7.png)

8. 構成設定を確認して、OKであればSave
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/3e03c417-2810-ebb8-0500-3482dd813586.png)

9.構成設定の割り当て状況が確認できるので、すべて✅がつけば設定は完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/17e8de31-29b0-643c-aeb6-4c49f2de16e7.png)

10.物理PCに適用されるまでしばし待ちます。☕
（PCの再起動で数十分～数時間ほどで適用されます。もしすぐ適用したければIntuneからリタイア/ワイプ処理でも可能）

# Boot化した後の挙動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/6e5b3265-b883-71c5-5002-2a5475428cfb.png)
ユーザーはID PWだけでなく、Windows HelloやFIDO等を使ってクラウドPCにサインインできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529374/4a2ab838-491f-5373-cd54-44e42029a7ac.png)

セットアップに関しては、Boot化した物理PC上から、クラウドPCに一度ID PWでサインイン後、
クラウドPC内の
**設定＞アカウント＞サインインオプション**
より顔認証、指紋認証、PIN等を競っていただくことによって、次回以降ID PW以外の認証方法も選ぶことが可能です。


# References
日本語版（和訳）
[Windows 365 Boot と Switch の新機能がパブリックプレビューに](https://blogs.windows.com/japan/2024/01/12/new-windows-365-boot-and-switch-features-in-public-preview/ "Japan Windows Blog")

英語版（オリジナル）
[New Windows 365 Boot and Switch features in public preview](https://techcommunity.microsoft.com/t5/windows-it-pro-blog/new-windows-365-boot-and-switch-features-in-public-preview/ba-p/4027398 "Windows IT Pro Blog")
Astroにページネーションをつけてみる


# Astroにページネーションをつけてみる

Astroで作成中のサイトの一覧ページに表示するページネーションのコンポーネントを作ってみました。

現在表示中のページの前後にページ番号を表示するよくあるタイプのものです（ページの一番最後の方にイメージがあります）。

これからAstroを触ってみようかと思っている方の参考になれば幸いです。

## ソースコード

```jsx:PageNav.astro
---
interface Props {
    max_page: string;   // 最大ページ数
    cur_page: string;   // 現在表示中のページ（1～）
    base_url: string;   // リンク先のベースURL（末尾の'/'は不要）
    nav_size?: string;  //  カレントの前後に何ブロック表示するか（デフォルト'2'）
}
const { cur_page, max_page, base_url, nav_size = "2" } = Astro.props;

let page_list: string[] = [];

for (let i = parseInt(nav_size); i > 0; i--) {
    let pno = parseInt(cur_page) - i;
    if (pno > 0) {
        page_list.push(pno.toString());
    }
}
page_list.push(cur_page);
for (let i = 1; i <= parseInt(nav_size); i++) {
    let pno = parseInt(cur_page) + i;
    if (pno <= parseInt(max_page)) {
        page_list.push(pno.toString());
    }
}
---

<ul class="page-navi">
    {
        page_list.map((pno: string) => (
   pno == cur_page ? (
   <li class="cur-page">{pno}</li>
   ) : (
   <li><a href=`${base_url}/${pno}/`>{pno}</a></li>
   )
        ))
    }
</ul>


<style lang="scss">
  ul.page-navi {
  display: flex;
  justify-content: center;
  margin: 3em 0 0 0;
  padding: 0 0;

  li {
   display: block;
   text-align: center;
   list-style-type: none;
   border: #cfcfcf 1px solid;
   border-radius: 4px;
   width: 3em;
   margin-right: 2px;

   font-size: 0.9em;
   &.cur-page {
    background-color: #3d4d8d;
    color: #cfcfcf;
    font-weight: 700;
   }

   a {
    display: block;
    text-decoration: none;
    color: #3d4d8d;

    &:hover {
     font-weight: 700;
     color: #fffffe;
     background-color: #bd5d6d;
    }
   }
  }
 }
</style>
```

## サンプル

こんな感じで使います。

```jsx
<PageNavi cur_page="3" max_page="5" base_url="/blog" />
```

表示イメージはこちら。

![2024.03.25_01435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120649/c25be8cf-828f-590c-a643-ee88ca74d0c0.png)
【Tableau】ガントチャートを日ごとに縦に並べる方法

## はじめに
機械の稼働状況、出勤状況、プロジェクトの進捗状況などガントチャートで表現できることは沢山あります。
ガントチャートを日にちごと縦に並べる方法について解説します。

## やりたいこと
下記のような機械の稼働データを使って、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/293e3a08-ae28-4928-d741-bb5a5824ed3e.png)

稼働の状況をこんな感じで可視化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/b5200ec0-e965-1f54-4925-617c5b375cf9.png)

## 手順
1. データをTableauで読み込みます。 <br><br>
1. 計算フィールドで開始時間と終了時間の差から**作業時間**を作成します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/d5a05527-ad88-3d1b-dc60-a987584bd864.png)
<br><br>
1. 2000-01-01を起点とする、**仮の開始時間**を生成します。
(日付に関わらず横軸をそろえるため）　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/dee320b0-31ec-c2be-5548-dbca1b8612be.png)

    ※開始時間をそのまま使うと、下記のように日にちが横に表現されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/3bd602a0-73b9-a5e6-31a2-0a8a3f10ae29.png)
<br><br>      
1. 3で作成した**仮の時間**を列に置き、「正確な日付」にします。行に開始時間を置きます。   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/a9dd6c85-ff11-0eab-3d92-9252e7c0aba4.png)
<br><br>
1. 2で作成した**作業時間**をサイズに、作業内容を色に置きます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/c4fc7611-3ab5-b7cb-9b43-f0923b4de80e.png)
作業時間が重なっている場合は、並び順が後のものは見えなくなってしまいます。
作業内容の並び順を変更したり、色を透過したりして見やすくなるように調整します。　
[並び替え前]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/4a1101df-85ce-2e58-7b7d-45bef2968e3a.png)
[並び替え後]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/89f0c5a6-9f85-92cf-2400-bc60e07a36ae.png)
<br><br>
1. 稼働していない日も表現したい場合は、開始時間の「欠落した値を表示」をチェックします。　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/6deb76cd-9fca-a026-baea-2bc1b1efad08.png)
[チェック前]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/26e8b666-0706-c35a-053a-73b45f085386.png)
[チェック後]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/abea5bea-4141-9678-14a0-d73803da7ceb.png)
<br><br>
色の凡例でハイライトすることで、特定の作業だけを際立たせて見せることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655975/d7301d78-5da1-5068-9cd0-c9a667508e68.png)

注）24時を超える作業がある場合には、事前にデータを24時で区切るように前処理しておく必要があります。

## さいごに

「今月は稼働が多い」、「休憩があまりとれてない」、「最近エラーが多い」と言ったことを、
視覚的にとらえることができることが、この表現の良い所だと思います。

一日の生活のリズムを可視化するのも良さそうです。
ぜひ、お試しください！
[Gmail API] Javaで送信者エイリアス宛に確認メールを送る

Gmail API v1（Java）を使用して、
Gmailの送信者エイリアス宛に確認メールを送る方法
についてご紹介します。

**送信者エイリアスとは**
メールを送信する時、送信者エイリアスからメールを送信しているように見せることができる機能です。
最初に、メール転送を設定してアクティブにしておきます。
Gmailでは、「設定」 -> 「アカウントとインポート」 -> 名前:「他のメールアドレスを追加」
から設定できます。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/28614d1d-afb5-e31e-354b-2bd786b93ba0.png">

このAPIは、ドメイン全体の権限を委任されたサービスアカウントを
使用しての発行のみ利用可能です。OAuth 2.0では利用できません。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Gmail API] JavaでGmail APIを使う](https://qiita.com/doran/items/a078e966bfd93c4b19c2)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[確認メールを送信](#1-確認メールを送信)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. 確認メールを送信
送信者エイリアス宛に確認メールを送信します。

### 1.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
GmailScopes.GMAIL_SETTINGS_SHARING
```
[⧉[Gmail API] JavaでGmail APIを使う(2.2 Gmailインスタンスを取得)](https://qiita.com/doran/items/a078e966bfd93c4b19c2#22-gmailインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行
```java
public static void main(String[] args) throws Exception{
    Gmail gmail = getGmail();
    Gmail.Users users = gmail.users();
    Gmail.Users.Settings settings = users.settings();
    
    Gmail.Users.Settings.SendAs sendAs = settings.sendAs();
    Gmail.Users.Settings.SendAs.Verify verify = sendAs.verify("メールアドレス","送信者エイリアスメールアドレス");
    
    verify.execute();
}
```
#### 1.2.1. HTTPリクエスト
POST:　 https:\//gmail.googleapis.com/gmail/v1/users/{メールアドレス}/settings/sendAs/{送信者エイリアスメールアドレス}/verify
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
リクエストボディはありません。

### 1.3. レスポンスの内容
レスポンスはありません。

<br>
<br>
おしまい。。
[Swift] iOS17（Swift 5.9） で日本語ドメインのURLが生成できるようになってる！

# 日本語ドメインのURLが生成できない！
iOS16以下（Swift5.9未満）は、日本語ドメインURLを`URL(string:)`に突っ込むとnilになっていました
ドメイン以外も、パラメータに日本語や特殊文字が含まれるような場合はnilになります

```swift
let url = URL(string: "https://日本語.jp")
// nil
let urlWithParam = URL(string: "https://日本語.jp?param=日本語&emoji=😃")
// nil
```
これに対応するにはpunycode対応したり、パーセントエンコードしたり、色々ツラミがありました

# iOS16以下でもURLComponentsを使うとよしなにしてくれる
どのバージョン以上で対応されているかはわかりませんが、iOS16以下でもString -> URLの変換に`URLComponents`を挟むといい感じにしてくれます
```swift
let url = URLComponents(string: "https://日本語.jp")?.url
// Optional(https://xn--wgv71a119e.jp)

let urlWithParam = URLComponents(string: "https://日本語.jp?param=日本語&emoji=😃")?.url
// Optional(https://xn--wgv71a119e.jp?param=%E6%97%A5%E6%9C%AC%E8%AA%9E&emoji=%F0%9F%98%83)

```

# iOS17からは対応されたぞ！
iOS17からは文字列を突っ込むだけでいい感じにしてくれるようになりました :cat: ！！！
```swift
let url = URL(string: "https://日本語.jp")
// Optional(https://xn--wgv71a119e.jp)
let urlWithParam = URL(string: "https://日本語.jp?param=日本語&emoji=😃")
// Optional(https://xn--wgv71a119e.jp?param=%E6%97%A5%E6%9C%AC%E8%AA%9E&emoji=%F0%9F%98%83)
```
.dockerignoreの配置場所

# .dockerignoreの配置場所

コンテナで環境構築する際も、本番稼働用のDockerfileを作る際にも.dockerignoreは基本的に用意すると思います。

その中で、いろんなシチュエーションにおいて.dockerignoreは機能するのか？
適切な配置場所は？
と気になったのでいくつかのパターンで検証してみました。

# 結論

いくつか試した結論として、dockerのbuild contextのルートにあればどの状況でも効くようです。

build contextって何？って人は[こちら](https://www.guri2o1667.work/entry/2020/11/30/%E3%80%90docker%E3%80%91%E3%83%93%E3%83%AB%E3%83%89%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%88build_context%EF%BC%89%E3%81%A8%E3%81%AF%EF%BC%9F)を参考に。

# Docker関連ファイルの内容

どのパターンの検証も基本的に内容は一緒です。(一部場合によって変えます。)
開発環境の構築においてはdocker composeを利用することが多いと思いますので、compose前提です。

## Dockerfile

```Dockerfile
FROM busybox

WORKDIR /workspace
COPY *.txt .
```

## compose.yaml

```yaml
services:
  sample:
    build:
      context: .
      dockerfile: Dockerfile
    image: docker-ignore-test-sample
    container_name: docker-ignore-test-sample
```

## .dockerignore

```tex
mushi.txt
```

さらにルートディレクトリに以下の2つのファイルを置いて、**not_mushi.txt**だけが存在すればOKという検証をします。
- mushi.txt
- not_mushi.txt

確認のためのコマンド
```shell
docker compose run sample ls
```

# 検証

## パターン1: すべてルートディレクトリに

最も標準的な構成。

【ディレクトリ構成】
```shell
.
├── .dockerignore
├── compose.yaml
├── Dockerfile
├── mushi.txt
└── not_mushi.txt
```

【結果】
```shell
$ docker compose run sample ls
not_mushi.txt
```
もちろんOK！

## パターン2: Docker関連ファイルをサブディレクトリに配置

ルートを散らかしたくないという人だとこういう構成をとる場合もあると思います。
重要なのは.dockerignoreがcontextのルートにいる必要があるということ。

【ディレクトリ構成】
```shell
.
├── .dockerignore
├── docker
│   ├── Dockerfile
│   └── compose.yaml
├── mushi.txt
└── not_mushi.txt
```

【結果】
```shell
$ docker compose run sample ls
not_mushi.txt
```
OK！

また、このパターンではcompose.yamlを以下のようにしてcontextをルートディレクトリに移動しています。

```yaml
services:
  sample:
    build:
      context: .. # ここを変更！
      dockerfile: docker/Dockerfile # ここを変更！
    image: docker-ignore-test-sample
    container_name: docker-ignore-test-sample
```

## パターン3: VSCode DevContainerの利用

サブディレクトリ切る版にさらにdevcontainerの設定を追加。

【ディレクトリ構成】
```shell
.
├── .devcontainer
│   └── devcontainer.json
├── .dockerignore
├── docker
│   ├── Dockerfile
│   └── compose.yaml
├── mushi.txt
└── not_mushi.txt
```

【結果】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385410/9f178434-7c43-6818-9c2e-c12f05eaecf4.png)

ばっちり。

# おわりに

結論は上に書いた通りで、単純でした。

docker関連ファイルをディレクトリ切って格納したい人からするとルートに.dockerignoreだけ置かなければいけないのは気持ち悪いかもしれませんが、これは仕方ないですね。

まあだからこそ "." から始まるようになっているのかもしれません。
Minecraft Serverソフトウェアの基本

## Minecraft Serverソフトウェアの基本
:::note warn
今回はUbuntuの知識を入れています。
:::
今回はサーバーソフトウェアの基本について話していきます。
突然ですが、マイクラサーバーのソフトウェアはたくさんあります。
### とりあえず一覧
Vanila (公式サーバーソフトウェア)
Paper MC (プラグインサーバーソフトウェア)
Spigot MC (プラグインサーバーソフトウェア)
TacoSpigot (プラグインサーバーソフトウェア)
CraftBukkit (プラグインサーバーソフトウェア)
Akarin (プラグインサーバーソフトウェア)
Forge (MODサーバーソフトウェア)
Fabric (MODサーバーソフトウェア)

※他にもたくさんあります。

## 特徴

中には軽量のものもありますが重いのもあります。私は中でも育てているのはPaperMCを育てています。PaperMCは軽量かつプラグインが使用可能なソフトウェアです。
ここでプラグインについてお話します。
プラグインとは簡単に言うとサーバーの中にいれるmodみたいなものです。武器を追加したりするのは難しいですが、エレベータープラグインや管理プラグイン、権限設定プラグイン(誤爆注意)などがあります。

## Spigotのひ・み・つ
SpigotMCは元祖プラグインサーバーソフトウェアとして自分は見ています。このソフトウェアは自分でビルドツールを用意してビルドしなきゃ行けないので大変ですが、プラグインサーバーソフトウェアの中では主流だとおもいます。

# 最後に

他にもいろいろありますが、長くなるのでここで締めておきます。
あとはググってね★




ByBy



参考：https://viasnake.com/minecraft-java-edition-server-software-summary/
visionOSアプリ開発者向け公式ドキュメントまとめ

こんにちは、Apple Vision Proの発売日にvisionOSアプリを3つ公開した個人デベロッパの者です。

今回は、visionOSアプリデベロッパ向けに公開されているApple公式ドキュメントのリンクを最大限リストアップしました。


## 前置き
- あくまで私個人が把握している範囲での紹介です。
- visionOSアプリ開発固有のドキュメントについて載せています。iOS等と共通運用されているドキュメントについては載せていません。
- 公式日本語ページがある場合は日本語側のリンクを載せています。
- Unity関連のドキュメントについては(私が詳しくないので)載せていません。
- 2024年6月末現時点の情報です。


## デベロッパ向けvisionOSランディングページ
https://developer.apple.com/jp/visionos/

https://developer.apple.com/jp/visionos/planning/

https://developer.apple.com/jp/visionos/learn/

https://developer.apple.com/jp/visionos/submit/

### visionOS Pathway
https://developer.apple.com/jp/visionos/pathway/

#### Pathwayとは
https://developer.apple.com/jp/pathways/

> Pathwayは、魅力的なアプリやゲームを開発する際に参照できるビデオ、ドキュメント、リソースをまとめたシンプルで使いやすいコレクションです。Appleデベロッパとして初めて開発する方に最適です。Macとアイデアさえあれば、いつでも簡単に始められます。


## WWDCの動画
### 基調講演(Keynote)
#### WWDC23
https://developer.apple.com/videos/play/wwdc2023/101/?time=4837

対象部分は1:20:37から2:05:45までです。日本語字幕があります。

#### WWDC24
https://developer.apple.com/wwdc24/101?time=342

対象部分は0:05:42から0:14:29までです。日本語字幕があります。

### Platforms State of the Union
#### WWDC23
https://developer.apple.com/videos/play/wwdc2023/102/?time=3630

対象部分は1:00:30から1:28:06までです。日本語字幕があります。

#### WWDC24
https://developer.apple.com/wwdc24/102?time=3386

対象部分は0:56:26から1:02:15までです。日本語字幕があります。

### セッションビデオ
https://developer.apple.com/jp/videos/spatial-computing/

WWDC23では170のセッションビデオがあり、そのうち40がvisionOS関連です。各動画に日本語字幕があります。

WWDC24では約30のセッションビデオがvisionOS関連です。公開から一週間が経った現時点で各動画に日本語字幕は付いていませんが、これから少しずつ日本語字幕が付きます。WWDC23の場合、秋頃には全てのセッションビデオに日本語字幕が付いていました。

セッションビデオの個別ページのリンクは省略します。

### 補足: 「Apple Developer」公式YouTubeチャンネル
Apple DeveloperアプリとWebサイトに加えて、今年の4月頃から「Apple Developer」公式YouTubeチャンネルでもデベロッパ向けビデオを見れるようになりました。


## APIリファレンスや記事、サンプルコード
https://developer.apple.com/documentation/visionos/

developer.apple.com/documentationにはAPIリファレンスや記事、サンプルコードなどがあり、Appleはこれらをまとめて「ドキュメント」と呼んでいます。

全て英語です。「ドキュメント」はXcode上からも参照できます。
 
「ドキュメント」の個別ページのリンクは省略します。


## Develop in Swift Tutorials
https://developer.apple.com/tutorials/develop-in-swift

「Develop in Swift」というアプリ開発初心者向けチュートリアルがあります。3つの章の最後が「Spatial computing」という題名で、visionOS向けアプリ開発の内容となっています。英語のみです。


## ヒューマンインターフェイスガイドライン
https://developer.apple.com/jp/design/human-interface-guidelines/designing-for-visionos/

ヒューマンインターフェイスガイドラインの個別ページのリンクは省略します。


## visionOSアプリ開発に向けてAppleと直接やり取りするプログラムについて
https://developer.apple.com/jp/visionos/labs/

https://developer.apple.com/jp/visionos/developer-kit/

https://developer.apple.com/jp/visionos/compatibility-evaluations/


## 「ニュース」の一環として配信されたドキュメント
https://developer.apple.com/jp/news/?id=fi8ne6ji

https://developer.apple.com/jp/news/?id=prl6dp5r

https://developer.apple.com/jp/news/?id=j368ftil

https://developer.apple.com/jp/news/?id=ssmnoze2

https://developer.apple.com/jp/news/?id=5uxs103n


## デザインリソース
https://developer.apple.com/jp/design/resources/#visionos-apps


## visionOSリリースノート
https://developer.apple.com/documentation/visionos-release-notes


## 追記 2024/06/24
WWDC24での情報公開を踏まえて内容をアップデートしました。


* * *


https://qiita.com/mjnfhbuvwebwfiejcnw/items/90d6e1b312d36cf085c4
Minecraft BungeeCordプロキシサーバーのconfigの書き方

## Minecraft BungeeCordとは
BungeeCordとはプロキシサーバーの一部で、プレイヤーが各サーバーに転送する役目をもっているサーバーソフトウェアです。
今回は、そのBungeeCordのconfig.ymlの書き方をこのブログに残していきます。


:::note info
Bungeeの他にもWaterFAllやVelcityがあります。今回はBungeeCordです。
:::


:::note warn
ポート開放が可能な環境が必須です。
:::


今回のポート一覧
HUB：25567
サバイバルサーバー：25568
プロキシサーバー：25577


```config.yml
server_connect_timeout: 5000
enforce_secure_profile: false
remote_ping_cache: -1
forge_support: false
player_limit: -1
permissions:
  default:
  - bungeecord.command.server
  - bungeecord.command.list
  admin:
  - bungeecord.command.alert
  - bungeecord.command.end
  - bungeecord.command.ip
  - bungeecord.command.reload
  - bungeecord.command.kick
timeout: 30000
log_commands: false
network_compression_threshold: 256
online_mode: true
disabled_commands:
- disabledcommandhere
servers:
  lobby:
    motd: '&1Just another BungeeCord - Forced Host'
    address: localhost:25565
    restricted: false
listeners:
- query_port: 25577
  motd: '&1Another Bungee server'
  tab_list: GLOBAL_PING
  query_enabled: false
  proxy_protocol: false
  forced_hosts:
    pvp.md-5.net: pvp
  ping_passthrough: false
  priorities:
  - lobby
  bind_local_address: true
  host: 0.0.0.0:25577
  max_players: 1
  tab_size: 60
  force_default_server: false
ip_forward: false
remote_ping_timeout: 5000
reject_transfers: false
prevent_proxy_connections: false
groups:
  md_5:
  - admin
connection_throttle: 4000
stats: a4221039-e797-4e0e-8a44-a38840023a45
connection_throttle_limit: 3
log_pings: true
```
この構文はconfig.ymlの初期値です。


このままでは、サーバーにプレイヤーを転送することができません。
なぜかって？それは"ポート"を指定していないからです...


```config.yml
servers:
  lobby:
    motd: '&1Just another BungeeCord - Forced Host'
    address: localhost:25565
    restricted: false
```
では実際にポートを指定していきましょう。servers:を探して

```config.yml
servers:
  lobby:
    motd: '&1Just another BungeeCord - Forced Host'
    address: localhost:25565
    restricted: false
```

この25565を変更していきます。
欄が足りないって？その場合は追加してしまいましょう。

```config.yml
servers:
  lobby:
    motd: '&1Just another BungeeCord - Forced Host'
    address: localhost:25565
    restricted: false
  server1:
    motd: '&1Just another BungeeCord - Forced Host'
    address: localhost:25565
    restricted: false
```
このlobbyやserver1の名前は自由に変えられます。用途によって変えましょう。


このBUngeeCordにはプラグインというのが別であります。例えば、BungeeHUB。/hubを入力したらHUBに移動するプラグインなど。


わからないことがあったらコメントへ。
メールも可能：yukamomizi1952@gmail.comへ
仮想マシン(途中）

# 仮想マシン
　仮想マシンとは、物理的なコンピュータ上で動作する仮想的なコンピュータ環境のことを指します。仮想化ソフトウェアを使用して、1台の物理マシン上に複数の仮想マシンを作成することができます。各仮想マシンには、独自のCPU、メモリ、ストレージ、ネットワークインターフェイスなどのリソースが割り当てられ、それぞれが独立したコンピュータのように動作します。とか言われても全くイメージはつかない。
 
# コンピュータを構成する要素
## OS
そもそも、OSとは何か？何がOSをOSとしてたらしめているのだろうか。
### OSとは何か
### OSの役割
OSは、コンピュータハードウェアとソフトウェアの間のインターフェイスとして機能する。
OSの主な役割は以下の通りです：
1. ハードウェア資源の管理：CPUやメモリなどのハードウェア資源を効率的に管理し、複数のプログラムが同時に実行できるようにします。

2. ファイルシステムの管理：データの保存と取得を容易にするためにファイルシステムを提供します。

3. ユーザーインターフェイスの提供：ユーザーがコンピュータと対話できるようにするためのインターフェイス（GUI、CLIなど）を提供します。

4. セキュリティの確保：不正アクセスからシステムを保護し、ユーザー権限を管理します。

### ディストリビューション
一般的に、Linuxディストリビューションは、Linuxカーネル、GNU製ユーティリティ、およびその他のオープンソースソフトウェアの組み合わせで構成されています。カーネルは、ハードウェアとソフトウェアの間のやり取りを管理するOSの中核部分です。シェルは、ユーザーがコマンドラインインターフェイスを介してシステムと対話できるようにするプログラムです。
Debianは、Linuxディストリビューションの1つで、安定性、セキュリティ、および幅広いソフトウェアパッケージで知られています。Ubuntuは、Debianをベースにしたディストリビューションで、ユーザーフレンドリーなインターフェイスと定期的なアップデートサイクルが特徴です。これらのディストリビューションには、ワープロ、表計算、ウェブブラウザ、メディアプレーヤー、ゲームなど、さまざまなアプリケーションが含まれています。ユーザーは、これらのソフトウェアを使用してさまざまなタスクを実行できます。

# 仮想化ソフトウェア
Mu(pygame zero)とProcessing.pyとProcessingの動作比較

Processingユーザから見て、python環境に移行する際の気になる点のメモです。

# ウィンドウを開く

```python:Mu.py
WIDTH=800
HEIGHT=600
```

```python:Processing.py
size(800, 600)
```

```java:Processing
size(800, 600);
```
なお、サイズ指定なし（ノーコード）で実行した場合、
「Mu.py」(800,600)のウィンドウが開く。
「Processing.py」(100,100)のウィンドウが開く。
「Processing.java」(100,100)のウィンドウが開く。

# フルスクリーン

まず、コードを試す前にフルスクリーンを終了する方法を把握。

「Mac」の場合
control + q
command⌘ + q

「Windows」の場合
Alt + F4

「Mu.py」```pygame.display.set_mode```を使う。適当にモニタ比に変更される？
「Processing.py」```fullScreen()```を使う。解像度はOSで変更？OSメニューが残る。
「Processing」```fullScreen()```を使う。もしくはSHIFT押しながら実行ボタン。解像度はOSで変更？。
```python:Mu.py
import pygame

first = True

def draw():
    global first
    if first:
        screen.surface = pygame.display.set_mode((800, 600), pygame.FULLSCREEN)
        first = False
    screen.draw.circle((480, 300), 300, "white")
```

```python:Processing:py
def setup():
    fullScreen()
    
def draw():
    background(0)
    noFill()
    stroke(255)
    ellipse(480, 300, 300, 300)
```

```java:Processing
void setup() {
  fullScreen();
}

void draw() {
  background(0);
  noFill();
  stroke(255);
  ellipse(480, 300, 300, 300);
}
```

追記：
pygame.FULLSCREENの他に|で追加できる項目。
pygame.DOUBLEBUF
pygame.HWSURFACE
pygame.OPENGL
pygame.RESIZABLE
pygame.NOFRAME

# 実行ファイル生成

「Mu.py」基本的にできないが、CODONなどを使えばできるかも？
「Processing.py」export application、を使うはずだが、うまく動作しない。環境の問題？
「Processing.java」アプリケーションとして書き出し、を使う。
Slack APIのconversations.listでプライベートチャンネルが取得できなくてハマった

## ハマりどころ
conversations.listを利用してワークスペース内のチャンネル一覧を取得するため、`types='public_channel,private_channel'`として`conversations_list`を実行したが、パブリックチャンネルしか取得できない
```python:python
# 取得したトークン
token = os.environ.get('SLACK_BOT_TOKEN')

# Slack の WebClient を生成
client = WebClient(token=token)

# チャンネル一覧を取得
response = client.conversations_list(types='public_channel,private_channel')
channels = response['channels'] # <-パブリックチャンネルしか取得できない
```
pythonでのapiの呼び出し方の問題かと思い、[slackのAPIページ](https://api.slack.com/methods/conversations.list)のテスターで実行してみたものの結果は変わらず

APIのexampleでも`public_channel,private_channel`となってるのになんでだろう？と色々試してみるもののなかなか解決せず

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/ce945fb0-8d71-65f4-43b5-9f0486156219.png)


## 解決法
`types='public_channel,private_channel'`とすると`public_channel`が1ページ目、`public_channel`が2ページ目に出力されるので、以下のように各ページに対して処理を行ってあげる
```python:python
# 取得したトークン
token = os.environ.get('SLACK_BOT_TOKEN')

# Slack の WebClient を生成
client = WebClient(token=token)

# チャンネル一覧を取得
response = client.conversations_list(types='public_channel,private_channel')
for page in response:
    for channel in page['channels']:
         # 個別の処理
```
（@seratch(Kazuhiro Sera)さんコメントありがとうございます！）
Gitのステージングするの意味について

Gitのステージングする意味が理解できていなかったのでまとめてみた。

## 査読と精度向上
ステージングを使用することで、変更内容をコミット前に査読し、必要な変更のみを含むようにすることができます。
これにより、誤った変更や不必要な変更を防ぎ、コミットの精度を向上させます。

## 変更の分割と論理的なまとめ
ステージングを利用すると、大規模な変更を論理的な単位に分割し、意味のある単位でコミットすることができます。
これにより、コミットの履歴が整理され、変更が追跡しやすくなります。

## チームでの協力
ステージングを使用して変更内容を査読し、個々のコミットを準備することで、複数の開発者が同じプロジェクトで効果的に協力することができます。
各開発者は自分の変更をステージングし、他のメンバーが変更を取り込む前に確認することができます。

## コード品質の維持
ステージングを使用することで、変更内容を細かくチェックし、コードの品質を維持することができます。
これにより、不必要なバグや問題を事前に発見し、修正することができます。

## まとめ
総括すると、ステージングは変更の査読、分割、チームでの協力、コード品質の維持など、効果的な開発プロセスをサポートするための重要なツールです。