OmniAICreator/Qiita-1.07M huggingface dataset:
Rustのコマンドライン引数パーサーにbpafを使ってサブコマンドを作る

Rustのコマンドライン引数パーサーといえば文字通りclapが一定の人気があるようですが、
これとは別にbpafというものがあります。

今回はこのbpafを使ってコマンドの引数がコマンドの体を成すものをパースします。
具体的には`ipfs daemon`や`ipfs bitswap`のようなものです

## やってみる

まずは`Cargo.toml`で`bpaf`に依存させまして、

```toml
[package]
name="example-bpaf-subcommand"
version="0.0.0"
edition="2021"

[dependencies.bpaf]
version="^0.9.12"
features=[
	"derive",
]
```

特に今回は`drive`を使います。

肝心の`src/main.rs`はだいたいこんな感じにしまして、

```rust
use bpaf::Bpaf;
use std::error::Error;

#[allow(dead_code)]
#[derive(
	Bpaf,
	Clone,
	Debug,
)]
#[bpaf(
	options,
	version,
)]
enum Options{
	#[bpaf(
		command("daemon"),
	)]
	Daemon{
		config:String,
		foreground:bool,
	},
}

fn main(
)->Result<(),Box<dyn Error>>{
	let args=options()
		.run();
	println!("{:?}",args);
	Ok(())
}
```

## うごかしてみる

`--help`をつけて実行すると……

```
Usage: example-bpaf-subcommand COMMAND ...

Available options:
    -h, --help     Prints help information
    -V, --version  Prints version information

Available commands:
    daemon

```

今度は`daemon --help`をつけて実行すると……

```
Usage: example-bpaf-subcommand daemon --config=ARG [--foreground]

Available options:
        --config=ARG
        --foreground
    -h, --help        Prints help information

```

`--help`はこのくらいにして今度は`daemon --config=./config.json`をつけて実行すると……

```
Daemon { config: "./config.json", foreground: false }
```

できました！
[Blender]No bone collections have UI buttons assigned - please check the Bone Collections UI sub-panel.のエラー解決

## 何が起きた？
Blender4.1.1でRigifyを使ってリギングをしようとしていたら（Generate Rigしようとしたら）題名のエラーが出ました。

## 原因
（おそらく）Rigifyを適応するBoneの指定ができていないからでした。

## 解決法

下記の手順でエラー解消できました。

① オブジェクトモードにする
![スクリーンショット 2024-05-06 18.03.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/535a948f-ae6b-f7c6-6bae-9e89688d1d05.png)

②アウトライナーのBone Collectionsをクリックする
![スクリーンショット 2024-05-06 18.07.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/4e00dac4-e6a5-016c-cfea-9adc50669a2c.png)

③プロパティのデータタブ内の`Rigify > Bone Collections`のプルダウンを開き、`+ボタン`を押す
![スクリーンショット 2024-05-07 1.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/aae6d910-2ab3-6cd8-d668-8e70b7753004.png)

④プロパティのデータタブ内の`Rigify > Bone Collection UI > UI Layout`のプルダウンを開き、`◀︎（左向きの三角ボタン）`を押す
![スクリーンショット 2024-05-06 18.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/4cddc0bd-1cba-530a-6dfe-e957548b2222.png)

## 参考
上記の対応後にGenerate Rigをすると下記のようにリグが表示されます。
![スクリーンショット 2024-05-06 18.24.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/7f3760ff-2bc3-b953-cb7b-3e17ad995725.png)

## 補足
Bone CollectionsやWGTS_Amatureを削除したりArmatureの指定対象を変更するとRigifyがバグるようで、筆者はGenerate Rigができなくなりハマりました。（結局直せませんでした。）
なので、もし同じ現象になった場合は０から（ボーン作成から）やり直す必要があると思われます。
Unityで縦スクロールゲーム「DragonEscape」をつくってみた

unityで簡単なゲームを作ってみたので、紹介します！
以下のURLから無料で遊べます。
https://unityroom.com/games/dragonescape
### 

## 目次
[1.はじめに](#1はじめに)
[2.プレイ動画](#2プレイ動画)
[3.操作方法](#3操作方法)
[4.新しく学んだ技術](#4新しく学んだ技術)
[5.おわりに](#5おわりに)
[6.使用させていただいたもの](#6使用させていただいたもの)


## 1.はじめに
インターンでMVP設計を学び、それをなにか形にしたい！ということでこのゲーム「DragonEscape」を作ってみました。（直訳すると、ドラゴンの脱出、みたいになってますが、ドラゴンから逃げるゲームです。）
また、せっかくなので、Copilotにて生成した画像も使ってみました。


## 2.プレイ動画
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">２D縦スクロールゲーム作ってみた！ <a href="https://t.co/vAhgFVuQCU">pic.twitter.com/vAhgFVuQCU</a></p>&mdash; とりポン酢 (@toriponzu_tech) <a href="https://twitter.com/toriponzu_tech/status/1787410816138191176?ref_src=twsrc%5Etfw">May 6, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


### 3.操作方法
**[矢印キー(左右)]** or **[A][D]**：**移動**

**[クリック]**：タイトル画面の「-TAP-」、リザルト画面の「もう一度プレイ」、「タイトルに戻る」

<dl>
  <dt>タイトル画面</dt>
  <dd>
  
  ![タイトル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582036/52a52677-4ebb-90e0-92a0-f23ee96adb0a.png)
タイトル画面の「-TAP-」を押してゲームスタート
  
  </dd>
  
  <dt>プレイ画面</dt>
  <dd>
  
  ![プレイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582036/6f375f0e-ea4a-f47c-9fa9-ee92dc52e2fd.png)
**[矢印キー(左右)]** or **[A][D]** でドラゴンを避けながら進もう！
　
　</dd>
 
  <dt>リザルト画面</dt>
  <dd>

  ![リザルト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582036/6cd8d64d-c9b2-0a15-e19a-4c77d3d7938e.png)
リザルト画面の「もう一度プレイ」で再びプレイ画面へ、「タイトルに戻る」でタイトル画面へ戻る。
 　スコアは生き残った時間に応じて大きくなる！
  
  </dd>
</dl>


## 4.新しく学んだ技術
### コード
+ **MVP設計パターン** (InGame, Player, Scoreなど多くの部分で使用)
+ **オブジェクトプール** (敵のドラゴンにて使用)
+ **スプライトアニメーション** (Playerやドラゴンのアニメーション)
+ **UVスクロール** (背景の自動縦スクロールにて使用)

### 画像生成
[タイトル画面](#3操作方法)のドラゴンの影のシルエットのロゴはMicrosoft社のCopilotにて画像生成したものを使用しました。AIチャットで、もっと〇〇にしてと指示しながら作成しました。影のシルエットにしたいのに全然ならなくて大変でした（笑）


## 5.おわりに
MVC設計は知っていたこともあり、MVP設計の理解は早かったです。ただ、いざ使ってみると、ここはView？Presenter？どっちだろう、ということがなんどもありました。
ほかにも知らない技術ばかりで大変でもあり、面白くもありました。


## 6.使用させていただいたもの
ドラシルのキャラクター　https://yurudora.com/tkool/
Microsoft社のCopilot　https://copilot.microsoft.com/
【三問三答】Oracle Master DBA Silverで出題されるパラメータをまとめてみた！

Oracle Master DBA Silver試験の出題範囲の
パラメータを問題形式でまとめました。自分と同じく暗記が苦手な人は本記事を活用してみてください。
（ツールのオプションや、コマンドを別記事でまとめる予定です。）



【共有サーバ接続関連編】
問①下記の説明に該当するパラメータを答えよ
１：インスタンス起動時に合わせて起動される共有サーバプロセス数の設定。共有サーバ接続を使用する際は1以上を設定する必要あり。
２：同時実行できる共有サーバプロセスの最大数の設定。
３：ディスパッチャの起動数、使用するプロトコルなどのディスパッチャに関する各種設定。



答①
１：SHARED_SERVERS
２：MAX_SHARED_SERVERS
３：DISPATCHERS



【プロファイルのリソース制限編】
問①下記にプロファイルのリソース制限に関するパラメータの説明を記載する。該当するパラメータ名と指定単位を答えよ。
１：セッションで使用できるCPU合計時間
２：個々のSQL実行で使用できるCPU時間。
３：接続時間。


問①
１：CPU_PER_SESSION,1/100秒
２：CPU_PER_CALL,1/100秒
３：CONNECT_TIME,分


問②下記にプロファイルのリソース制限に関するパラメータの説明を記載する。該当するパラメータ名と指定単位を答えよ。
４：セッションでアイドル状態が許される時間。
５：同じアカウント名を使用して接続できるセッション数。
６：共有サーバ接続時に使用できるSGA内のUGA最大サイズ。


答②
４：IDLE_TIME,分
５：SESSIONS_PER_USER,セッション数
６：PRIVATE_SGA,バイト



問③下記にプロファイルのリソース制限に関するパラメータの説明を記載する。該当するパラメータ名と指定単位を答えよ。
７：セッションで使用できる倫理I/Oブロック合計数。
８：個々のSQL実行で使用できる倫理I/Oブロック合計数。
９：CPU_PER_SESSION,LOGICAL_READS_PER_SESSION,CONNECT_TIME,PRIVATE_SGAをもとに算出されたコスト値で制限


答③
７：LOGICAL_READS_PER_SESSION,ブロック
８：LOGICAL_READS_PER_CALL.ブロック
９：COMPOSITE_LIMITE,コスト


【セキュリティ編】
問①セキュリティの観点からデフォルト値から変更しない方が良い初期化パラメータを4つ答えよ。


答①
・07_DICTIONARY_ACCESSIBILITY
・SEC_CASE_SENSITIVE_LOGON
・REMOTE_OS_AUTHENT
・UTL_FILE_DIR



【Oracle Managed Files編】
問①下記の初期化パラメータがOMF管理対象にできるファイルの種類を答えよ。
１：DB_CREATE_FILE_DEST
２：DBCREATE_ONLINE_LOG_DEST_n(n=1,2,...5)
３：DB_RECOVERY_FILE_DEST



答①
１：データファイル、一時ファイル、制御ファイル、REDOログファイル
２：制御ファイル、REDOログファイル
３：リカバリ関連（バックアップファイル、アーカイブログファイルなど）、制御ファイル、REDOログファイル

【Data Pump編】
問①下記の説明に該当するパラメータを答えよ
１；ダンプファイル名、ディレクトリ名を指定
２：ダンプファイルを配置するディレクトリを指定
３：ダンプファイルの最大サイズを指定

答①
１：DUMPFILE
２：DIRECTORY
３：FILESIZE

問②下記の説明に該当するパラメータを答えよ
４：処理結果を記録するログファイル名を指定
５：エクスポート時のスキーマとは別のスキーマにインポートする際に指定
６：除外したい処理対象を指定

答②
４：LOGFILE
５：REMAP_SCHEMA
６：EXCLUDE


問③下記の説明に該当するパラメータを答えよ
７：含めたい処理対象を指定
８：インポート時にすでに表が存在する場合の動作を指定
９：パラレル処理の並列度を指定。指定した数のプロセスが起動して、処理を並列実行する。
１０：実行する処理に対して明示的にジョブ名を指定。

答③
７：INCLUDE
８：TABLE_EXISTS_ACTION
９：PARALLEL
１０：JOB_NAME

問④下記はTABLE_EXISTS_ACTIONパラメータの動作を指定する値である。該当する指定値を答えよ
１：指定すると対照表へのインポート処理をスキップし、別表の処理を継続する
２：指定すると既存データは変更せず、ダンプファイルのデータを追加する形でインポートする。
３：指定すると既存データを削除した後、ダンプファイルのデータをインポートする。
４：指定すると既存の表を削除した後、表を作成してデータをロードする。


答④
１：SKIP
２：APPEND
３：TRUNCATE
４：REPLACE



【SQL*Loader編】
問①下記コマンドラインパラメータの説明に該当するパラメータを答えよ。
１：不良ファイルのファイル名
２：制御ファイルのファイル名
３：データファイルのファイル名

答①
１：BAD
２：CONTROL
３：DATA

問②下記コマンドラインパラメータの説明に該当するパラメータを答えよ。
４：従来型パスまたはダイレクトとパスのどちらの方法でデータをロードするか指定
５：廃棄ファイルのファイル名
６：エラー許容最大数。

答②
４：DIRECT
５：DISCARD
６：ERRORS

問③下記コマンドラインパラメータの説明に該当するパラメータを答えよ。
７：ログファイルのファイル名
８：ダイレクトロード時に複数の同時セッションによって同じ表にデータをロードできるか指定
９：指定した数字の行数ごとにコミット処理を実行する

答③
７：LOG
８：PARALLEL
９：ROWS
Laravel Duskでブラウザテストを行う

### 開発環境
- Windows 10 Pro(64bit)
- PHP 8.1.9
- Laravel 10.10
- Laravel Dusk 8.2

Laravel Duskとは、ブラウザテストを自動化するためのLaravelのパッケージです。今回は、インストールしてから、簡単なテストをするまで記事に書きます。

1.[Google Chrome](https://www.google.co.jp/intl/ja/chrome/browser/welcomeback.html)の最新版をダウンロードして、バージョンを確認してください。確認方法として、僕の開発環境では、**C:\Program Files (x86)\Google\Chrome\Application** ディレクトリ内の**124.0.6367.119**ディレクトリがありますので、これがバージョンとなります。

2.以下のコマンドをプロジェクトのルートディレクトリで実行
```bash
composer require laravel/dusk --dev
```
3.ChromeDriverをインストールする際にcURLでHTTPS通信を行うため、[cacert.pem](http://curl.haxx.se/ca/cacert.pem)をダウンロードし、Cドライブ直下に、pemディレクトリを作り、その中へ入れておきます。

4.**php.ini**を開いて、その中の**curl.cainfo**の行のコメントを外し、上記のpemファイルのあるディレクトリを絶対パスで指定します。
```
curl.cainfo=C:\pem\cacert.pem
```

5.以下のコマンドをプロジェクトのルートディレクトリで実行
```
php artisan dusk:install
```

6.以下のコマンドをプロジェクトのルートディレクトリで実行
```
php artisan dusk:make FirstTest
```

7.**.env**ファイル内の**APP_URL**に、テスト用のホストを実行時のサーバーのポート番号付きで指定
```bash:.env
APP_URL=http://localhost:8000/
```

8.以下のコマンドでChromeDriverを実行。1.で調べたバージョンを指定します。
```
php artisan dusk:chrome-driver 124.0.6367.119
```

9.**/tests/Browser**ディレクトリ内に**FirstTest.php**が作成されているので開いて、以下のようにコードを作成し保存
```php:FirstTest.php
<?php

namespace Tests\Browser;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

class FirstTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     */
    public function testExample(): void
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/');
            // トップページ内のbodyタグ内に指定の文章があるかチェック
            $browser->assertSee('Hello Laravel Dusk.');
        });
    }
}

```

10.組み込みサーバーを以下のコマンドで実行
```
php artisan serve
```

11.組み込みサーバーを実行しつつ、以下のコマンドで、Laravel Duskを実行
```
php artisan dusk
```


### 参考リンク
https://cresta522.hateblo.jp/entry/20210819/1629382566

https://laravel.com/docs/master/dusk
データサイエンティストに関するスキル定義を集めてみた

# はじめに
データサイエンティストの育成研修を作成する際に、
身につけるべきスキルの一覧があればと思い探したところ、
3つの良い定義が見つかったのでまとめておきたいと思います。
スキル一覧があれば、それをもとにどのスキルを身につけるべきか、各スキルを身につけるには何を学習すれば良いかを考えられるので便利です。

# 1. データサイエンティスト協会による定義
## 概要
https://www.datascientist.or.jp/news/n-pressrelease/post-1757/

こちらが一番有名かと思います。見たことのある方も多いのでは無いでしょうか。
データサイエンティストに必要なスキル領域を
- ビジネス力
- データサイエンス力
- データエンジニアリング力

の3つに分け、各項目で必要なスキルを詳細に定義してくれています。

## メリット
- 必要な専門スキルが具体的に分かる

## デメリット
- 定義が細かすぎる（データサイエンス力だけで309個のスキルが定義）
- そのため、データサイエンスの知識が無い方々に説明するのは難しい（これが理由で私は研修メニューの立案に使用するのは断念しました）

# 2. IPAによるDX推進スキル標準
## 概要
https://www.ipa.go.jp/jinzai/skill-standard/dss/about_dss-p.html

結論として、私はこの定義を採用しました。
DX全般に関わるスキル定義ではありますが、
データサイエンティストに関するスキルも綺麗にまとまっています。
たとえば、データサイエンティストの中でも
- データビジネスストラテジスト
- データサイエンスプロフェッショナル
- データエンジニア

の3つに役割を細分化し、それぞれに必要なスキルを定義しています。
たとえば、下表のような定義です。

|  | データビジネスストラテジスト | データサイエンスプロフェッショナル | データエンジニア |
|-----------------------|----------------------|-------------------|---------------|
| ビジネス戦略策定・実行 | b                    | d                 | d             |
| プロダクトマネジメント      | c                    | c                 | c             |
| 変革マネジメント      | c                    | c                 | c             |
| システムズエンジニアリング | c                    | c                 | b             |
| エンタープライズアーキクチャ | c                    | d                 | b             |
| プロジェクトマネジメント | b                    | c                 | c             |

※a: 高い実践力と専門性が必要　b: 一定の実践力と専門性が必要　c: 説明可能なレベルで理解が必要　d: 位置づけや関連性の理解が必要

## メリット
- 役割ごとに身につけるべきスキルレベルのグラデーションが付いている
- 粒度がデータサイエンティスト協会ほど細かくなく、説明しやすい
- この定義にもとづく研修プログラムが巷に存在している

## デメリット
- 抽象的でスキル獲得の定義が説明しづらいスキルが一部存在（例：変革マネジメントとは何ができるようになるとそのスキルを身に付けたといえるのか？）

# 3. IPAによるデータサイエンス領域タスクリスト
## 概要
https://www.ipa.go.jp/jinzai/skill-standard/plus-it-ui/itssplus/data_science.html

こちらはスキルというよりはタスクの一覧ですが、
データサイエンス領域のプロジェクトを進めるにあたり、必要となるタスクがまとまっています。

たとえば
- アプローチ設計
- データ収集
- データ加工

などです。

## メリット
- タスクが具体的なため、身につけるべきスキルのイメージがしやすい
- DX推進スキル標準と同じく、説明しやすい粒度にまとまっている

## デメリット
- スキル定義では無いため、タスク→スキルの変換が必要


# まとめ
以上が調べてみて有用だと思ったスキル定義です。
私はIPAによるDX推進スキル標準を採用しましたが、ベストとなる定義はケースバイケースだと思いますので、
ぜひ見比べてみてご自身のケースに最も合う定義を選定いただければと思います。
Rack::Attackでのリクエスト制限時の問題と解決策

## 背景

Railsアプリケーションにおいて、Rack::Attackを使用して特定のリクエストに制限を設けた際に、以下のエラーメッセージが発生しました。

```
NoMethodError at /reservations/confirm
undefined method `env' for {:request=>#<Rack::Attack::Request:0x00007fd2b4b8c3b8 @params=nil, @env={...}}>
```

このエラーは、`Rack::Attack`内のイベント購読の部分で発生しており、ペイロードから直接 `env` を呼び出そうとしたために発生しました。

## 問題点の特定

問題のコードは以下の部分です。

```config/initializers/rack_attack.rb
  ActiveSupport::Notifications.subscribe('rack.attack') do |name, start, finish, request_id, req|
    Rails.logger.info "Rack::Attack: #{req.env['rack.attack.match_type']} from #{req.ip} blocked."
  end
```
または
```config/initializers/rack_attack.rb
ActiveSupport::Notifications.subscribe('rack.attack') do |name, start, finish, request_id, payload|
  Rails.logger.info "Rack::Attack: #{payload[:request].env['rack.attack.match_type']} from #{payload[:request].ip} blocked."
end
```
などがエラーの原因になります。

## 解決策

`payload[:request]` が実際には `Rack::Attack::Request` オブジェクトであるため、`.env` を直接呼び出す必要があります。修正後のコードは以下のようになります。

```ruby
ActiveSupport::Notifications.subscribe('rack.attack') do |name, start, finish, request_id, payload|
  Rails.logger.info "Rack::Attack: #{payload[:request].env['rack.attack.match_type']} from #{payload[:request].env['REMOTE_ADDR']} blocked."
end
```

## おまけ: ユーザーフレンドリーな429エラーページの追加

リクエスト制限を超えた際に、ユーザーに対してより親切なフィードバックを提供するため、次のようなカスタム429エラーページを作成しました。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>リクエストが多すぎます</title>
    <style>
        body { font-family: "Helvetica Neue", Arial, sans-serif; line-height: 1.6; padding: 20px; }
        h1 { color: #ff6347; }
        p { max-width: 550px; }
    </style>
</head>
<body>
    <h1>お待ちください！</h1>
    <p>ただいまアクセスが集中しております。サーバーへの負担軽減のため、少し時間を置いてから再度お試しください。</p>
    <p>何度もこのメッセージが表示される場合は、サポートへお問い合わせください。</p>
</body>
</html>
```

このページは `public/429.html` として保存し、Rack::Attackの設定で指定することで、サーバーがリクエスト制限を行った際にこのページを表示するように設定しました。
emacs native compile benchmark

# 目的
native compile での実行速度を計測する


# sample code
```
(defun simple_loop ()
  (progn
    (setq count 1)
    (setq max_times 50000000)
    (while (< count max_times)
      (setq count (1+ count)))))
```



# benchmark

| elisp | byte compile | native compile |
|:-----------|------------:|:------------:|
| 4.67 sec | 0.668 sec | 0.587 sec|

// それぞれ, 10回程の平均


# 所管
このケースにおいて
差は小さいものの, 確実に高速化が見込める事が確認できた.

様々な機能を動かす中で10%の高速化は有り難い



# native compile 対応の emacs install はこちら
https://qiita.com/Satoshi_Numasawa/items/b9ddb36724e154c543b7
[BigQuery API(V2)] Javaでアクセス可能なプロジェクト一覧を取得する

BigQuery API V2(Java)を使用して、
BigQueryのアクセス可能なプロジェクト一覧を取得する方法
についてご紹介します。

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

|No||目次|
|---|---|---|
|1||[プロジェクト一覧を取得](#1-プロジェクト一覧を取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. プロジェクト一覧を取得
BigQueryで利用可能なプロジェクト一覧を取得します。
読み取りアクセス権以上があるプロジェクトのみ取得できます。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
BigqueryScopes.CLOUD_PLATFORM_READ_ONLY
https://www.googleapis.com/auth/bigquery.readonly
```
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)](https://qiita.com/doran/items/8b7ba29672527426e88d#32-bigqueryインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Projects projects = bigquery.projects();
    
    Bigquery.Projects.List list = projects.list();
    
    ProjectList res = list.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//bigquery.googleapis.com/bigquery/v2/projects
が実行されます。

#### 1.2.2. クエリパラメータ
Bigquery.Projects.Listのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setMaxResults|Integer|結果の最大数|
|setPageToken|String|取得するページトークン|

### 1.3. レスポンスの内容
#### ProjectList
|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："bigquery#projectList"|
|getEtag|String|ハッシュ値|
|getNextPageToken|String|次のページトークン|
|getTotalItems|Integer|ページ内のプロジェクトの総数|
|getProjects|List\<[ProjectList.Projects](#projectlistprojects)\>|プロジェクト情報|

#### ProjectList.Projects
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|プロジェクトID|
|getKind|String|リソースの種類<br>固定文字列："bigquery#project"|
|getNumericId|BigInteger|プロジェクトの数値ID|
|getProjectReference|[ProjectReference](#projectreference)|プロジェクトのリファレンス|
|getFriendlyName|String|プロジェクトを説明する名前|

#### ProjectReference
|メソッド|戻り値|説明|
|---|---|---|
|getProjectId|String|プロジェクトID|

<br>
<br>
おしまい。。
オブジェクト初期化子で、インデクサーにIndexを渡す（C#13）

## 参考
この記事は、以下の動画を参考にしています。
詳しくは、動画をご覧ください。

https://youtu.be/zwY5M72FOms?si=69suhLCiBONQI99Q

## オブジェクト初期化子で、インデクサーにIndexを渡す

__現時点（2024年5月）ではC#13のプレビュー機能です。__
プロジェクトの`LangVersion`を`Preview`にする必要があります。
```xml
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>

    <LangVersion>Preview</LangVersion>
 
  </PropertyGroup>
```

オブジェクト初期化子で、インデクサーにIndexを渡すことができます。

```C#
class MyClass
{
    public int[] Numbers { get; } = new int[4];
}

var obj = new MyClass
{
    Number = 
    { // オブジェクト初期化子
        [^4] = 4, // 最後の要素から4つ目
        [^3] = 3,
        [new Index(value: 2, fromEnd: true)] = 2, // 最後の要素から2つ目
        [new Index(value: 1, fromEnd: true)] = 1,
    },
};

// obj.Numbers は [ 4, 3, 2, 1 ] となる
```
tailwindで親要素のpaddingを無視

よくあるcssで親要素の一番上にpaddingをつけて、全体の端っこに余白を設定するケース。
これに対して子要素のコンポーネントなどで画面いっぱいに表示したいのに、bodyにつけたpaddingのせいで空白が消えない場合、下記で解決できます。

今回はtailwindで検証。

```src/app/page.tsx
import { About } from '@/app/components/layouts/About';

export default function Home() {
  return (
      // 親要素に padding で余白が作成されている。
      <main className='w-[375px] px-5'>
        <About />
      </main>
  );
}

```

### 下記の子コンポーネントにある `<h2>` を親要素の **px-5** の適用外とし、画面幅いっぱいに表示したい。

```src/app/components/layouts/About.tsx
'use client';
import React, { useState } from 'react';

export const About = () => {
  return (
    <div className=''>
      // ↓これ
      <h2 className=''>画面いっぱいに表示したい</h2>
    </div>
  );
};
```

# 解決策

```src/app/components/layouts/About.tsx
'use client';
import React, { useState } from 'react';

export const About = () => {
  return (
    // ↓マイナスでmarginを設定して余白を相殺
    <div className='-mx-5'>
      // 画面幅いっぱいにするためのスタイル (w-screen は width:100vw; と同じ)
      <h2 className='w-screen'>画面いっぱいに表示したい</h2>
    </div>
  );
};
```

と言うことで、上記のように画面いっぱいに表示したい要素に対して、`-mx-5'を使用し、marginをマイナスで適用することで親要素のpaddingを相殺することができます。では!!
`numpy.histogram`のビンは、最後のビンだけ閉区間になる

# 環境
* Python 3.12.1
* numpy 1.26.4

# 内容
公式ドキュメントに書いてある通りです。

>All but the last (righthand-most) bin is half-open

https://numpy.org/doc/stable/reference/generated/numpy.histogram.html

最後のビンは閉区間、それ以外のビンは半開区間になります。


`bins`引数に`[0,1]`を指定すると、1個目のビンが「0以上1**未満**」、2個目のビンが「1以上2**以下**」の度数を計算します。

```
In [194]: import numpy as np
In [195]: data=[0, 0, 1]

In [214]: hist, bins = np.histogram(data, bins=[0, 1, 2])

In [215]: hist
Out[215]: array([2, 1])

In [216]: bins
Out[216]: array([0, 1, 2])
```



# ビンの幅から`bins`を計算する。
ビンの幅からビンの境界を計算する関数を作成しました。
`range`で算出したビンの境界の右端が最大値に一致するときだけ、ビンの数を増やしています。

```python
def get_bin_edges(min_value: int, max_value: int, bin_width:int) -> list:
    bin_edges = list(range(min_value, max_value + bin_width, bin_width))

    if bin_edges[-1] == max_value:
        bin_edges.append(bin_edges[-1] + bin_width)

    return bin_edges
```

```
In [242]: get_bin_edges(0,4,2)
Out[242]: [0, 2, 4, 6]

In [243]: get_bin_edges(0,3,2)
Out[243]: [0, 2, 4]
```

上記の`get_bin_edges`関数に小数を渡すことはできません。小数を渡すと`range()`でエラーが発生します。

```
In [285]: get_bin_edges(0, 0.2, 0.1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[285], line 1
----> 1 get_bin_edges(0, 0.2, 0.1)

Cell In[282], line 2, in get_bin_edges(min_value, max_value, bin_width)
      1 def get_bin_edges(min_value: int, max_value: int, bin_width:int) -> list:
----> 2     bin_edges = list(range(min_value, max_value + bin_width, bin_width))
      4     if bin_edges[-1] == max_value:
      5         bin_edges.append(bin_edges[-1] + bin_width)

TypeError: 'float' object cannot be interpreted as an integer
```



小数にも対応するのであれば、`range()`でなく`numpy.arange()`を使う必要があります。
ただし小数の場合は等価演算が期待通りにならないときがあるので、最初からビンの個数を多めに作るのがよさそうです。

```python
def get_bin_edges2(min_value: float, max_value: float, bin_width:float) -> numpy.ndarray:
    bin_edges = numpy.arange(min_value, max_value + bin_width*2, bin_width)
    return bin_edges
```


```
In [270]: get_bin_edges2(0, 0.2, 0.1)
Out[270]: array([0. , 0.1, 0.2, 0.3])

In [271]: get_bin_edges2(0, 0.3, 0.1)
Out[271]: array([0. , 0.1, 0.2, 0.3, 0.4])

In [272]: get_bin_edges2(0, 0.4, 0.1)
Out[272]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6])

In [273]: get_bin_edges2(0, 4, 2)
Out[273]: array([0, 2, 4, 6])

In [277]: get_bin_edges2(0, 3, 2)
Out[277]: array([0, 2, 4, 6])
```

# 参考にしたサイト

https://snowtree-injune.com/2019/07/07/arange-linspace/

https://yakumido.blogspot.com/2014/08/numpy.html
VMware Cloud Services コンソールへのログイン方法が少し変わりました - 多要素認証 (MFA) 

# 1. はじめに

VMware Cloud on AWS を利用する際などにログインする [VMware Cloud Services](https://docs.vmware.com/en/VMware-Cloud-services/services/Using-VMware-Cloud-Services/GUID-20D62AFF-024B-4901-976D-69BFD71BECC8.html) コンソールへのログイン時の画面遷移が少し変わったので備忘録としてメモを残します。

https://vmc.vmware.com/home

# 2. VMware Cloud Services コンソールにログインしてみる

私は 多要素認証 (MFA) の手段として、Okata Verify を選択して iPhone ですでに設定完了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/b56137da-fd63-5dc5-e837-b4f694059a56.png)


必要な MFA の設定については、Broadcom 公式のガイド / KB が図解で非常にわかりやすいので後述します。

まずVMware Cloud Services コンソールのホーム画面はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/a4e27970-06e8-a48e-3b71-4fa2c68deea3.png)

ログインを試みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/ffc6ca39-7749-807b-44cb-34d4eaec2e23.png)

すると Broadcom のサインインに遷移します。
今までは VMware Cloud Services 内で認証が完了していたので、この遷移は新しいステップとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d79b24d8-c474-e8cd-88bb-67bb1f090932.png)

パスワードを入力し、サインインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/327043b9-f948-6dd6-bc5a-480fc9cae4cd.png)

事前に設定しておいた Okta Verify アプリを利用して 多要素認証 (MFA) します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/22f02aec-2470-9d92-09de-579b51ac39a5.png)

設定したデバイス (私の場合は iPhone) に通知が届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d2facd1c-4e24-2cce-f972-152d6e919eaf.png)

Okta Verifyのアプリの中で「はい、私です」を選択して、認証します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/c702bcde-2692-2a65-aae7-bc510463a8bd.png)

再度 VMware Cloud Services コンソールに遷移し、ログインが完了します。こちらは VMware Cloud on AWS の操作画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/b4733819-b217-fe4a-4082-630eda415041.png)

# 3. まとめ

実際にやってみると、事前に選択した何かしらの MFA認証のステップがあるだけで、いつも通り VMware Cloud Services コンソールにアクセスできました。

私はもともと Microsoft Authenticator のアプリで MFA 認証していたので、私にとっては今回のログイン方法変更で 多要素認証 (MFA) ツールが Okta Verify になったが唯一の変更点でした。

仮に今まで多要素認証 (MFA) 無しで 「ID/パスワードのみ」でログインしていた場合には １ ステップ分が増えることになりますが、そもそも重要なポータルへのログインには MFA が推奨ですので、今回の変更で MFA が強制されるという点はセキュリティの観点でむしろ良い気がします。

# 4. 参考資料 (Broadcom 公式ガイド)

Broadcom による VMware Cloud Services コンソールへのログイン方法の変更については、次の公式ガイドおよび KB をご参照ください。

執筆時点 (2024年5月6日) ではガイドが英語版のみとはなりますが、重要な最新情報が詳細に図解や FAQ も含めて解説されているので、まずはご自身でもご確認されることを推奨します。

https://knowledge.broadcom.com/external/article?articleNumber=366715

https://ent.box.com/s/52acyi1t3abc51xbss93x69xeox4p2zd
x86のAOSPでArmのアプリを動かせるようにする(Android11)

はじめに、この記事はwaydroid_scriptのソースを参考に書いています(waydroid_scriptでやっていることをaospでもできるようにしています)
https://github.com/casualsnek/waydroid_script

また、Android11と書いていますが、Android13でもおそらくできると思います
Android13の場合は適宜読み替えてください

1.まず、必要なファイルを以下からダウンロードしてください(dl_linksです)
https://github.com/casualsnek/waydroid_script/blob/main/stuff/ndk.py

それを作業ディレクトリに展開してください
以下のようになっているのが正しいです
```sh
$ls
ndk
```

2.-writable-systemのオプションをつけてemulatorを起動してください

3.以下のコードを実行します
コードは汚いですが正しく動くと思います...

```python
import os
import subprocess


def init():
    subprocess.run(["adb", "remount"])
    subprocess.run(["adb", "shell", "mount", "-o", "rw,remount", "/system"])


def chown(path, uid, gid):
    subprocess.run(["adb", "shell", "chown", f"{uid}:{gid}", path])


def chmod(path, mode):
    subprocess.run(["adb", "shell", "chmod", f"{mode}", path])


def mkdir(path):
    subprocess.run(["adb", "shell", "mkdir", "-m", "777", "-p", path])


def push_file(src, dest):
    subprocess.run(["adb", "push", src, dest])


def get_dir(path):
    return "/".join(path.split("/")[:-1])


def write_build_prop():
    prop = """
ro.product.cpu.abilist=x86_64,x86,armeabi-v7a,armeabi,arm64-v8a
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist64=x86_64,arm64-v8a
ro.dalvik.vm.native.bridge=libndk_translation.so
ro.enable.native.bridge.exec=1
ro.vendor.enable.native.bridge.exec=1
ro.vendor.enable.native.bridge.exec64=1
ro.ndk_translation.version=0.2.3
ro.dalvik.vm.isa.arm=x86
ro.dalvik.vm.isa.arm64=x86_64
"""
    command = f"echo '{prop}'  | tee -a /system/build.prop >> /system/vendor/build.prop"
    subprocess.run(["adb", "shell", command])


files = [
    "bin/arm",
    "bin/arm64",
    "bin/ndk_translation_program_runner_binfmt_misc",
    "bin/ndk_translation_program_runner_binfmt_misc_arm64",
    "etc/binfmt_misc",
    "etc/ld.config.arm.txt",
    "etc/ld.config.arm64.txt",
    "etc/init/ndk_translation.rc",
    "lib/arm",
    "lib64/arm64",
    "lib/libndk*",
    "lib64/libndk*",
]


init()

os.chdir(
    "./ndk/vendor_google_proprietary_ndk_translation-prebuilt-9324a8914b649b885dad6f2bfd14a67e5d1520bf/prebuilts"
)
for root, dirs, files in os.walk("."):
    for file in files:
        path = root + "/" + file
        dir = get_dir(path)
        mkdir("/system/" + dir)
        push_file(path, "/system/" + path)
        chown("/system/" + path, 0, 0)
        chmod("/system/" + path, "777")

write_build_prop()
```

4.再起動してx86のバイナリがないarmのアプリが正しく動くことを確認します
【三問三答】Oracle Master DBA Silverで出題されるビューをまとめてみた！

この記事にOracle Master DBA Silverにて出題されるビューをまとめました。
暗記しやすいように三問三答にまとめましたので活用してみてください。
この記事だけで暗記をした後に、ぜひテキストを読み返してみてください。理解がより深まると思います。




【主なデータディクショナリビュー編】
問①下記の情報が確認できるビュー名を答えよ
１：表の情報
２：索引の情報
３：ビューの情報



答①
１：DBA_TABLES
２：DBA_INDEXES
３：DBA_VIEWS

問②下記の情報が確認できるビュー名を答えよ
４：シーケンスの情報
５：シノニムの情報
６：制約の情報



答②
４：DBA_SEQUENCES
５：DBA_SYNONYMS
６：DBA_CONSTRAINTS

問③下記の情報が確認できるビュー名を答えよ
７：ユーザの情報
８：表領域の情報
９：データファイルの情報
１０：データファイルの空き領域の情報



答③
７：DBA_USERS
８：DBA_TABLESPACES
９：DBA_DATA_FILES
１０：DBA_FREE_SPACE




【主な動的パフォーマンスビュー編】
問①下記の情報が確認できるビュー名を答えよ
１：初期化パラメータの設定値
２：SGAのサマリー
３：SGAコンポーネントのサイズ


答①
１：V$PARAMETER
２：V$SGA
３：V$SGAINFO

問②下記の情報が確認できるビュー名を答えよ
４：インスタンス内のセッション情報
５：制御ファイルに格納されたデータファイルの情報
６：制御ファイルに格納された一時ファイルの情報



答②
４：V$SESSION
５：V$DATAFILE
６：$TEMPFILE



問③下記の情報が確認できるビュー名を答えよ
７：インスタンスの情報
８：共有プールにキャッシュされているSQLの情報
９：インスタンスの様々な稼働統計情報
１０：セッションの様々な稼働統計情報



答③
７：V$INSTANCE
８：V$SQL
９：V$SYSTAT
１０：V$SESSTAT




【CREATE VIEW編】
問①下記にCREATE VIEW文のオプションの説明を示す。オプション名を答えよ
１：指定すると同じ名前のビューがあると上書きして作成する。
２：SELECT文で参照するオブジェクトが存在しない場合や、読み取り権限がない場合でもビューを強制的に作成する。
３：SELECT文で参照するオブジェクトが存在しない場合や、読み取り権限がない場合はビューの作成がエラーになる。



答①
１：OR REPLACE
２：FORCE
３：NO FORCE


問②下記にCREATE VIEW文のオプションの説明を示す。オプション名を答えよ
４：指定すると読み取り専用になる。指定しないとビューにＤＭＬを実行可能になる。
５：ビューにＤＭＬを実行したときに変更内容がチェックされる。


答②
４：WITH READ ONLY
５：WITH CHECK OPTION




【ビューへＤＭＬ実行編】
問①
１：ビューへDMLを実行する際、含まれているとエラーになるものを５つ答えよ
２：ビューへDML実行ができるようにするトリガー名を答えよ
３：ビューへDELETE文を実行するトリガー名を答えよ


答①
１：集合演算子、DISTINCT演算子、集計関数、GROUP BY、ORDER BY
２：INSTEAD OF
３；DELETE_EMPS_FROM_{ビュー名}
mrubyでDSPラジオ

秋月電子でRDA5807Hを購入してきてしばらく部品箱に入れてあったのですが、使ってみることにしました。

当初マイコンでいじろうかと思ったのですが、試行錯誤するにはFreeBSDのmrubyの方が楽だということでFreeBSD/mipsなモジュールにつないでみました。

![IMG_20240506_160348.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/822c8334-b207-6b6d-09e7-499865cad413.jpeg)

貧乏なので、変換基板とか使わず、エッジのパターンの7箇所からワイヤーで裏のランドとつなぎました。結構大変でした。

```
# i2c -s
Scanning I2C devices on /dev/iic0: 04 10 11 3e 60 
```

10,11,60がこのチップのアドレスです。

Ardiunoのライブラリなどもありますが、簡単に確認するため、こちらを参考にしました。

https://qiita.com/dabodabo/items/f8b52413849291a2d462

```ruby
t = BsdIic.new(0)

id = t.read(0x11, 1, 0)

p "ID:" + id.to_s(16)

t.write(0x10, [0x00, 0x00, 0x00, 0x00])

chan = 789 - 760
h3 = chan >> 2
l3 = chan & 3
l3 = l3 << 6
l3 |= 0x18

t.write(0x10, [0xc2, 0x85, h3, l3, 0x0a, 0x00, 0x88, 0x81])

t.write(0x11, [0x05, 0x88, 0x8f])

rssi = t.read(0x11, 1, 0xb)

p "RSSI:" + rssi.to_s
```

I2Cデバイスはアドレスについて8ビットのデータを持つ仕様が多いのですが、このデバイスはアドレスについて16ビットのデータになるようです。データは上位8ビット・下位8ビットの順のようです。

RSSIは信号強度なのですが、正しく拾えてないです。なにか設定が必要なのかもしれません。

ケーブルテレビのFMの再送信を受信してみたのですが、結構ノイズっぽいです。またステレオ出力のゲインが低いようです。

RDA5807HはRDA5807Mの後に出て改良されているようなのですが、RDA5807Mの方がいいという話がありました。
GitHub Actionsを使って特定のブランチからのみPRを受け付けるようにする

# はじめに
developブランチからfeatureブランチを切って、featureブランチで開発をした後にdevelopへPRを投げるブランチ戦略は割と多い気がします。
しかし、feature以外のブランチからdevelopにPRを誤って送ってしまった場合、PRの承認者が誤ってマージしてしまう可能性もあると思います。
運用面で回避できればいいのですが、可能であればシステム的に対象のブランチからしかPRを受け付けないように制限を入れたいです。
本記事はこちらの方法について記載します。


# ゴール
GitHub Actionを使用しdevelopブランチへのプルリクエストは、プレフィックスに「feature」がつくブランチからしか受け付けないように制限する。

# 前提
デフォルトブランチをmainとして、main⇒develop⇒feature/○○ブランチを作成している状態を想定しています。

# featureブランチの名前について
featureはdevelopからfeature/hoge1、feature/hoge2などそれぞれブランチを切る場合、一意なブランチ名とはならないと思います。
プレフィックスに「feature/」がついてるのが特徴なので、正規表現で「feature/○○」といったブランチ名を検知したいです。

# 正規表現

次の正規表現で`feature/`で始まるブランチ名を検知します。

```
^feature/.*
```
- ^: 行の先頭
- feature/: "feature/" という文字列
- .*: 任意の文字列が続く


# ソース（ymlファイル）

以下はdevelop.ymlファイル全体のコードになります。

```yml:develop.yml
name: CI

on:
  pull_request:
    types: [opened, reopened]
    branches:
      - develop

jobs:
  cicd_test:
    name: feature_to_devlop
    runs-on: ubuntu-latest
    steps:
      - name: Check:if PR is from feature to develop branch
        run: |
          if [ "${{ github.event.pull_request.base.ref }}" == "develop" ] && [[ "${{ github.event.pull_request.head.ref }}" =~ ^feature/.* ]]; then
            echo "Pull request from feature to develop branch"  
          else
            echo "Pull request not from feature to develop branch, exiting with code 1"
            exit 1
          fi
```


### ◆ 詳細

if文の条件としては、PRが featureからdevelop ブランチに向けられている事を設定しています。
この条件が満たされた場合、GitHub Actionのワークフローのステータスチェックは成功し、
条件に当てはまらない場合はelseに入り、ステータスチェック処理を失敗させます。

```yml
  if [ "${{ github.event.pull_request.base.ref }}" == "develop" ] && [[ "${{ github.event.pull_request.head.ref }}" =~ ^feature/.* ]]; then
    echo "Pull request from feature to develop branch"  
  else
    echo "Pull request not from feature to develop branch, exiting with code 1"
    exit 1
  fi
```

# Branch protection rulesの設定
developブランチに対するブランチの保護ルールを設定していきます。
テキストボックスにジョブ名を入力し、動かす対象のジョブを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/fa7eb4cb-d1b4-fd7a-281e-85200959291b.png)


# 実行
developブランチに対して、以下の2つのパターンを検証してみます。

1. errortestブランチ⇒developブランチへのPRを送付
2. feature/○○ブランチ⇒developブランチへPRを送付


## ◆1. errortestブランチ⇒developブランチへのPR

PRを出してみると以下の通り、ステータスチェックで弾く事ができました。
errortestブランチは、ブランチ名がfeature/○○ではないのでこの結果は想定通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/42fa0865-e588-9900-2538-36f483df209a.png)


## ◆2. feature/test1ブランチ⇒developブランチへPR

PRを出してみると以下の通り、ステータスチェックを通す事ができました。
feature/test1ブランチは、ブランチ名がfeature/○○に当てはまっているのでこの結果は想定通りです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/61d18ddf-1c90-3d9a-d38f-2a90bccf6756.png)

# 参考
https://qiita.com/enumura1/items/efea5456410079e0add1
docker レジストリからイメージやリポジトリを取得


# docker レジストリからイメージやリポジトリを取得

レジストリからイメージやリポジトリを 取得するコマンドです。

```
docker pull [OPTIONS] REPOSITORY[:TAG]
```

**Docker Hub** レジストリにある ベース・イメージを元から取得します。
**Docker Hub** には多くの構築済みのイメージがあり、自分で定義や設定をしなくても、イメージを取得できます。

## オプション

| 名前, 省略形 | デフォルト値 | 説明 |
| ------------| ------------| -----|
| --all-tags, -a | なし | リポジトリにあるタグ付きイメージをダウンロードします |
| --disable-content-trust | true | イメージ検証を省略します |
| --platform | なし | マルチプラットフォーム対応であればプラットフォームを指定 |
| --quit ,-q | なし | 冗長な出力はしない |

## プロキシ設定をする

**HTTPプロキシ・サーバ** がある場合は、設定には環境変数**HTTP_PROXY** 、**HTTPS_PROXY** 、 **NO_PROXY** を指定して使います。

## 並列ダウンロード

デフォルトの**Dockerデーモン** は、同時に3つのイメージレイヤから取得します。
ネットワーク帯域幅が狭くてタイムアウトを引き起こす場合は、デーモンのオプション **--max-concurrent-downloads** によって、この数を減らすことができます。

## 使用例

**docker pull** の使い方を記載します。
タグを指定しなければ、 デフォルトで :latest タグが使用されます。

次のコマンドは hello-world:latest イメージを取得することができます。

```
docker pull hello-world
```

![スクリーンショット 2024-05-06 160643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/a107642b-87fa-5cb9-bf6c-45e3b622e839.png)
WSL2でAOSPをビルドしてみた

はじめに
ドキュメントがあるので、基本的にはこちらを見たほうがいいと思います
この記事は忘備録です...

https://source.android.com/docs/setup/start/initializing?hl=ja
https://source.android.com/docs/setup/build/building?hl=ja


0.環境
ビルドした環境は以下になります
```
$cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
...


$ uname -m
x86_64
```

1.wslのメモリの割り当てを変更する

aospは非常に巨大なプロジェクトのため、できるだけ多くのメモリを割り当てることをお勧めします
```.wslconfig
[wsl2]
memory=32GB 
```

2.必要なパッケージをインストールする

```sh
sudo apt update
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
```

```sh
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```

3.作業ディレクトリの作成/初期化
```sh
mkdir `WORKING_DIRECTORY`
cd `WORKING_DIRECTORY`
repo init -u https://android.googlesource.com/platform/manifest -b `BRANCH`

nproc --all
repo sync -c -j`n` # `n` には nproc --all で出力されたスレッド数を入力する
```

利用可能なbranchの一覧はこちらにあります
https://source.android.com/docs/setup/reference/build-numbers?hl=ja#source-code-tags-and-builds

branchはここでは`android-11.0.0_r48`としました
理由として、android7をビルドしようとすると、環境構築がうまくいかずjavaのビルドエラーがでたこと、またandroid10はarm、arm64のアプリをx86上で動かすことが難しかったことが挙げられます
(android10以降では確かプロジェクト内にjavaが含まれていて環境構築でつまづきにくくなっていたはずです...)

`repo sync`は時間がかかるので気楽に待ちましょう
寝ている間などにすべての環境構築を終わらせたい場合は以下のようなシェルスクリプトを組んでください(4のステップの内容も含まれています)

```sh
yes | repo sync -c -j`n`
. build/envsetup.sh
lunch aosp_x86_64-eng
m
```

4.ビルド
非常に時間がかかるので気長に待ちましょう
ここでタスクマネージャーのパフォーマンスタブを開くとCPUとメモリがフルで動いていて面白いと思います
```sh
. build/envsetup.sh
lunch aosp_x86_64-eng
m
```

5.エミュレーターの起動
```
. build/envsetup.sh
lunch aosp_x86_64-eng
emulator -gpu swiftshader_indirect -memory 4096 
```
`-gpu swiftshader_indirect`はこちらの環境だとないとうまく動きませんでした

6.最後に
enjoy!

(ソースコード検索はAndroid Code Searchを使うといいと思います)
https://cs.android.com/?hl=ja
jpaリポジトリ内でSQLを作成する方法

## JPAリポジトリ内で用意されているメソッド以外を使用する方法

``` sample.java
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

@Repository
public interface dailyEvRepository extends JpaRepository<dailyEv, Long> {

    @Query(value = "SELECT * FROM SAMPLE WHERE id = ?1", nativeQuery = true)
    Optional<sample> findByIdCustom(Integer id);
}

```

注目箇所
```
@Query(value = "SELECT * FROM SAMPLE WHERE id = ?1", nativeQuery = true)
```
?1には使用する際の引数の1つ目が入ります。
nativeQuery = trueにすることでJPQLではなくSQLを使用可能になります。

例としては
```
Optional<Sample> sampleData = repository.findByIdCustom(1); 
```

だとSAMPLEテーブル内のIDが1のデータを取得します。

以上
Flutter Webでhttp.getするとXMLHttpRequest errorが出た時の解決方法

# エラーが出たコード
```dart
    try {
      final res = await http.get(Uri.parse('https://xxx.com/xxx'));
    } on Exception catch (e) {
      print('${e.toString()}'); ←XMLHttpRequest error.
    }
```

Flutter Webで他のWebApiを実行するとエラーになります。原因はCORSです。

# 解決方法
とりあえずlocalhostでデバッグするには次の方法で解決します。

(1) FlutterのSDK（3.16.9とか）\bin\cache\flutter_tools.stamp
flutter_tools.stamp を削除します。
このファイルは削除してもビルドすると再作成されます。

(2) FlutterのSDK（3.16.9とか）\packages\flutter_tools\lib\src\web\chrome.dart
--disable-extensions の下に --disable-web-security を追加します。
```dart
200行目
    final List<String> args = <String>[
      chromeExecutable,
      // Using a tmp directory ensures that a new instance of chrome launches
      // allowing for the remote debug port to be enabled.
      '--user-data-dir=${userDataDir.path}',
      '--remote-debugging-port=$port',
      // When the DevTools has focus we don't want to slow down the application.
      '--disable-background-timer-throttling',
      // Since we are using a temp profile, disable features that slow the
      // Chrome launch.
      '--disable-extensions',
      '--disable-web-security',　←追加
      '--disable-popup-blocking',

```

# Flutter Web を流行らせよう

余談ですがFlutter Webって全然流行らないですね。スマホアプリの方は徐々に浸透しているように思えます。

## メリット① androidとiosの両対応
一番の理由がこれです。特にUIの開発が一緒なのが大きいです。
両方開発できるのは、
Flutter
ReactNative
Unity
Xamarin

Kotlin,Swiftの人はFlutter。Webからの人はReactNativeが多い気がします。
スマホアプリを開発したい人はFlutterをお勧めします。KotlinやSwiftも必要になるのですが、まずはFlutterだけでリリースまでやってみるのがいいと思います。

## メリット② Google が出している

|会社 |OS |環境|
|--|--|--|
|Google|android/chrome|Flutter/dart|
|Apple|ios/mac|Xcode/swift|
|Microsoft|Windows|VisualStudio/C#|

Xcode/swift も VisualStudio/C# もずっとサポートが続いています。そのため Flutter もサポートが続くのではないかと期待できます。

## メリット③ ネイティブとウェブの両方が開発可能
ネイティブがメインでWebはおまけの場合は効果ありです。毎日使う業務アプリで速さが求められる場合はスマホアプリがよいです。FlutterならあとからWebにも対応できます。

## デメリット ウェブが遅い
まず初回のロードが遅いです。これが解決するなら一気に普及すると思います。バックエンドに関してはどのみち別環境＋別言語になるので問題にはならないでしょう。
プロジェクト成功させるためのポイント

# 目的
業務円滑化、効率化のため

# 企画と計画そして実行、進捗管理し、終結させる
1 プロジェクトのゴールを明確にし、達成シナリオを考える
2  ステークホルダーを見極め、そのプロジェクトへの期待を理解する
3  ステークホルダーの期待を摺り合わせ、プロジェクト成功を定義する
4  成功に必要な成果物を明確にするとともに、各タスクの明確化
5  スケジュールを決める
  > マイルストーンをまず置き、細かなスケジュール部分を引いていくこと  
  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/29c75762-1804-dd93-100e-4fb265046a89.png)
  ※ マイルストーンは、設定しすぎないよう気をつけましょう。設定しすぎると、進捗状況がわかりにくくなります。上記画像のスケジュールは例ですが、マイルストーンということが分かりやすいような★印の付加や、マイルストーンのエリアを設けて置いたりすることでマイルストーンとわかりやすくなる。汎用例はつけておくと他メンバーにも共有し理解されやすい。



6 成果物と予算、項番５のトレードオフを調整
7 プロジェクトを取り巻くリスクを最小化する
8  プロジェクトの計画をドキュメントにする
9  進捗計測の基準を決め、進捗を管理する
10  パフォーマンスの高いチームを創る
11  ステークホルダーとコミュニケーションを行い、良好な関係を保つ
12  今回のプロジェクトで学んだことを整理して、組織内に水平展開する

# PMコンピテンシー
> コンピテンシーとは、自分の置かれている立場を見渡し、相手の期待を把握し、期待にこたえる行動をとる能力のことであり、以下7つのクラスターに分類できます。  

1. 主体的に行動
2. 目的を意識
3. ゴールまでの道筋を明確化
4. リスクを楽しむ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/f64e7e43-e40c-b0a8-b7a0-6318d44e39db.png)

5. チームを成長させる
6. ステークホルダーとの共通認識
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/dcaa8f64-8a25-f314-8ea4-889ee83359c8.png)
※ ステークホルダとは一般的に「利害関係者」と訳します。
※　ご自身の現場状況を図で整理してみるとステークホルダーの関係が整理できます。
7. 顧客視点で品質を考える     

# まとめ
> プロジェクトを成功させるには以下5点が重要であり、大切であること  
1. チーム内でしっかりゴールを共有する
2. ゴールまでの道のりと責任の計画化、および、 計画に基づく管理
3. 的確なスコープのコントロール
4. コミュニケーションの活性化
5. 上位組織によるプロジェクト支援  

# 参考 
①  [書籍] プロジェクトマネジメントの基本　この１冊ですべてわかる  好川哲人 日本実業出版社
  > https://amzn.asia/d/cmbJL7C

②  https://pmstyle.biz/com/check.htm
【Golang, PHP】PDFスライド画像変換＆S3保存処理のパフォーマンス改善

大学の学部四年生でエンジニアをしている者です。
普段は業務委託でバックエンド開発をメインに行っています。
今回はPHPのプロダクト内で起きていた問題解消にGolangの機能(Go routine, channel)を使用して解消をしました。
その概要をまとめます。
コード自体はプロダクトに反映してしまったので載せるのは控えます。

## プロダクト使用技術
- AWS EC2 (t3.medium)
- AWS S3
- PHP (Laravel)
- poppler-utils (pdftoppmコマンド) ⇒ PDFの画像変換処理で使用
- Golang ⇒ 改善のために使用

## 開発機能詳細

ピッチ資料を生成する機能です。

https://www.hear.co.jp/recruit/saiyoupitch-100sen

機能の内部処理の流れとしては以下の通りです。(AS IS)
1️⃣ **ユーザーはPDFファイルをアップロード**
2️⃣ **アップロードされたファイルをローカルのディスクに一時保存**
3️⃣ **ローカルディスクに保存されているPDFスライドを画像変換するコマンドを実行し、変換された画像をすべてローカルディスクに一時保存**
4️⃣ **画像を一枚ずつS3に保存し、保存完了した画像に関しては削除する**
5️⃣ **アップロードされていたPDFファイルを削除**
6️⃣ **ユーザーにS3保存先フォルダのパスを返す**


## 起きていた問題
### 画像変換の遅延 (CPUバウンド)
画像変換処理にはpdftoppmコマンドをPHPから叩いてPDFのスライドを全て画像に一括変換処理を走らせていました。
コマンドの内部では逐次実行(一枚ずつ変換)が走るのでCPUバウンドによる遅延が大きくなっていました。
一般的なファイルでは問題がなかったのですが、変換が難しいスライド(高解像度、大量テキストなど)が含まれているとそこで変換が止まってしまうような現象も起きていました。

### ディスク操作による遅延（I/Oバウンド）
画像やPDFを一時的にローカルストレージ内に保存する処理や、処理終了後に削除する処理があります。
これをこれまで逐次実行していたため、ディスク操作のI/Oが発生していました。
画像変換の遅延に比較すると影響は軽微ではあります。

### S3保存の実行 (I/Oバウンド)
全ての変換処理が終わったら変換した画像ファイルをローカルディスクからs3に保存する処理を走らせていました。
ループで1枚1枚保存を走らせるので、待ち時間がかかる原因になっていました。
こちらも同様に画像変換の遅延に比較すると影響は軽微です。

## 考えた改善案
コードベースで最終的に以下4点を用いて改善を試みました。
- 画像の変換は並列化し、インフラのCPUをなるべく効率的に使う
- これまでは全ての画像変換が終わってから、S3保存を走らせていたが、変換処理が終わったものから順にS3への保存を実行するようにする。(S3保存と画像変換は並行して行う)
- 画像のS3保存も1枚ずつ実行していたのを変換処理が終わったものからすべて並行して行うようにする
- ディスクへの一時保存をメモリを使った方法に変更する

![goruntine.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470041/28b35301-d866-4ad7-02de-002eb64393a1.png)


## 技術選定根拠
- Goは多少使ったことがあるのと、開発の他メンバーにも使っている人がいたため
- goキーワードを使うだけで並行処理が実現でき、記述が簡単
- buildしたバイナリをデプロイすルだけなので特に環境を変える手間もなかった。（私の業務範囲で事足りる(サーバーサイド, CICD)）
- PHPで同様のことを実現するのはできなくなさそうだったが、複雑な上現在の実行環境を変更する必要があった

## 結果

実行テストは既存コードでかなり処理が遅かったファイルを採用して行いました。
画像変換処理のみ ⇒ 35%のパフォーマンス改善
全処理 ⇒ 50%のパフォーマンス改善

## より良くするために
- **この機能だけAWS Lamdaに切り離す**
改善はしたもののいまだに待ち時間はあります。CPUコアを増やせば(インスタンスを変える)この機能に最適化されたものを作れますが、実際のプロダクトではコストを考える必要があります。そこでLamdaがちょうど良いかなと考えています。（未実装）
Lamdaはリクエストの回数と、インフラのスペックで金額が決まるそうです。インフラで負荷がかかるのはこの機能以外に今の所はないのでLamdaに切り離して実装できると良いかなと思っています。今後機会があればチャレンジして見たいなと思います。

## 終わりに
Golangに関しては初心者なのでより良くする方法があれば教えていただけると嬉しいです。
技術の幅が広がると、解決できる問題の幅も広がるなと実感しました。
並行処理などについて実務の中で理解が深められ、良い経験になりました。
PostgreSQL: バイナリーデータの取り扱い

こちらのページを参考にしました。
[Aurora(PostgreSQL)のbytea列にバイナリデータをpythonでインサートする](https://zatoima.github.io/aws-aurora-bytea-insert-binary-data.html)

## PostgreSQL への接続情報

User: scott
Password: tiger123
DataBase: db_pdf

## テーブルの用意

```sql:create_table.sql
create table table_pdf
(
    id  int primary key,
    pdf bytea not null
);
```

```text
$ psql -U scott db_pdf < create_table.sql
CREATE TABLE
```

## データの挿入

fuji.pdf というデータを挿入します。

```py:pdf_insert.py
#! /usr/bin/python

import psycopg2
import psycopg2.extras

conn = psycopg2.connect("host=localhost port=5432 dbname=db_pdf user=scott password=tiger123")

cur = conn.cursor()
img = open('fuji.pdf', 'rb').read()

idx = 102

cur.execute("INSERT INTO table_pdf (id,pdf) values (%d,%s)" %
    (idx,psycopg2.Binary(img),))

conn.commit()
cur.close()
conn.close()
```

実行

```bash
./pdf_insert.py
```

## データの取り出し

```py:pdf_retrieve.py
#! /usr/bin/python

import psycopg2
import psycopg2.extras

conn = psycopg2.connect("host=localhost port=5432 dbname=db_pdf user=scott password=tiger123")

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("SELECT pdf FROM table_pdf;")

row = cur.fetchone()
pic = row['pdf']

f = open('out01.pdf', 'wb')
f.write(pic)
f.close()
cur.close()
conn.close()
```

実行

```bash
./pdf_retrieve.py
```

## csvファイルへの出力

```text
db_pdf=> \copy table_pdf to '/tmp/t001.csv' delimiter ',' csv header;
COPY 1
```

テーブルからデータの削除

```text
db_pdf=> delete from table_pdf;
DELETE 1
```

csv ファイルを取り込んで見る

```text
db_pdf=> \copy table_pdf from '/tmp/t001.csv' delimiter ',' csv header;
COPY 1
```
「React の流儀」を読んでまとめてみた

# はじめに
そもそも React ってなんだっけ？
いつもなんとなくこんな感じ〜で書いてるけど、これで本当にいいんだっけ？ってふと疑問に思った。
この「なんとなく使う」を脱却したく、原点に立ち返り、

React の公式ドキュメントにある [React の流儀](https://ja.react.dev/learn/thinking-in-react)

を読んで、自分なりにまとめることにした。
ちなみに余談だけど React の流儀は、英語では Thinking in React だった。訳し方がカッコイイ！

# React の流儀 まとめ
React で UI を実装するときの５つのステップ
### ステップ１： UI をコンポーネントの階層に分割する
- モックアップのすべてのコンポーネントとサブコンポーネントを囲む、それぞれに名前をつける
  - １つのコンポーネントは理想的には１つのことだけを行うべきである（単一責任の原則）
  - コンポーネントが大きくなってしまったら、より小さなサブコンポーネントに分解するべき
- モックアップ内にあるコンポーネントを特定したら、それらを階層構造に整理する

### ステップ２： React で静的なバージョンを作成する
- インタラクティブな要素は加えずに、単にデータモデルから UI をレンダーするバージョンを作成する
- コンポーネントを作成する際に、他のコンポーネントを再利用しつつ、props 経由でデータを渡すようにする(ここではまだ state を使わない)
- 階層の一番上のコンポーネントが、データモデルを props として受け取り、下の階層にあるコンポーネントに流れていく構造をつくる（単方向データフロー）

### ステップ３： UI の状態を最小限かつ完全に表現する方法を見つける
- ここでようやく state が登場する
- state の構造を考える上で最も重要な原則は DRY(Don’t Repeat Yourself: 繰り返しを避ける)
- state の見分け方
  - 時間が経っても変わらないもの → state ではない
  - 親から props 経由で渡されるもの → state ではない
  - コンポーネント内にある既存の state や props に基づいて計算可能なデー → state ではない
  - それら以外で残ったものが state

### ステップ４： state を保持すべき場所を特定する
- state を置く場所の決め方
  - ①その state に基づいて、何かをレンダーする **全てのコンポーネント** を特定する
  - ②階層内でそれら全ての上に位置する、最も近い共通のコンポーネントを見つける
  - ③state がどこにあるべきか決定する
    - 多くの場合、state をその 共通の親 に直接置くことができる
    - state を、その共通の親の さらに上にあるコンポーネント に置くこともできる
    - state を所有するのに適切なコンポーネントが見つからない場合は、state を保持するためだけの新しいコンポーネントを作成し、共通の親コンポーネントの階層の上のどこかに追加する

### ステップ５： 逆方向のデータフローを追加する
- ユーザの入力に従って state を変更するには、逆方向へのデータの流れをサポートする必要がある
- set 関数を props で渡す

# 所感
サンプルコードも眺めてたんだけど、コンポーネントの認識が実はズレてるかもしれないことに気づいた。

コンポーネント ＝ 再利用できる ＝ 同じものが複数出てきたらそれらをまとめる

だと思ってた。

しかし、サンプルコードを見るとどうも違う。
小さいパーツ毎にコンポーネントにしており、それらをいい感じにグルーピングして新たにコンポーネントを作っている。
そうか。単一責任の原則が抜けているのか。
React の言う「コンポーネント」ってそういう意味で使っていたのか・・・。

おそらく現場では UI が確定しないうちから実装を始めているので、ステップ１やステップ２が抜け落ちているのかもしれない。
最初のうちは仕方ないかもしれないが、UI が出てきたら、一度立ち止まってコンポーネントの分け方や階層構造の見直しなどを行う必要があるのではないだろうか。

# Next Action
サンプルコードを眺めてるだけじゃ分からないこともあったので、実際に手を動かしてコーディングしてみようと思う。
こんなに小さくコンポーネントを分けたことがないので、実装の流れを把握できるようにしたい。
【c++】ABC352 A-D問題解説【ACコード付き】

# AtCoder Beginner Contest 352

C問題までの3完15分。
レートは283から331の48アップとなった。
A,B,Cを迅速に解けたのは良かったが、D問題で相変わらずTLE祭り。

今回掲載しているD問題のACコードは翌日の朝に解いたものになっている。

https://atcoder.jp/users/yabukin

## A - AtCoder Line
1からNまでの数のうち、XからYの間にZが存在するか調べる問題。XとYの大小関係で場合分けして、

```cpp
int N,X,Y,Z;

int main()
{
	cin >> N >> X >> Y >> Z;
	if (X > Y)
	{
		if (X >= Z && Z >= Y)
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}
	}
	else
	{
		if (Y >= Z && Z >= X)
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}
	}
}
```
## B - Typing
文字列の中で正しく入力された文字が何文字目にあるかを調べる問題。

入力された文字列を1文字ずつ探索していきながら、正解の文字列に一致する文字の場合は何文字目かを出力していけばOK。

```cpp
string S,T;	

int main()
{
	cin >> S >> T;
	for(int i = 0 ; i < S.size(); i++)
	{
		for(int j = 0 ; j < T.size(); j++)
		{
			if (S[i] == T[j])
			{
				cout << j+1;
				i++;
				cout << " ";
			}
		}
	}
	cout << endl;
	return 0;
}
```
## C - Standing On The Shoulders
巨人の肩の高さと頭の高さが与えられるので、巨人の肩に巨人を積み上げていき、一番上の巨人の頭の高さを最大化する問題。

全員肩の高さ分を足した後に、巨人一人分だけ肩と頭の高さの差を足して良い、と言い換えることができる。

そのため、一番上の巨人は肩の高さと頭の高さの差分が一番大きい巨人が担うことになる。

```cpp
int N;
int A[200009], B[200009];
int C[200009];

int main()
{
	cin >> N;
	for (int i = 1; i <= N; i++) cin >> A[i] >> B[i];
	int diff_max = 0;
	int diff_max_place = 0;
	for (int i = 1; i <= N; i++)
	{
		C[i] =  B[i] - A[i];
		if (diff_max <= C[i])
		{
			diff_max = C[i];
			diff_max_place = i;
		}
	}
	long long total_height = B[diff_max_place];
	for (int i = 1; i <= N; i++)
	{
		if (i != diff_max_place) total_height += A[i];
	}
	cout << total_height << endl;
}
```
## D - Permutation Subsequence
{1,2,...,N}を並び替えてできる数列P = {P1,P2,...,PN}が与えられるので、その中から連続するK個の数字を抜き出した時に、場所（数列Pの添字）が一番大きなものと小さなものの差の最小値を求める問題。

与えられる配列 PとPの中にNまでの数字がどの場所にあるかを記憶するnum_place配列を作り、あとは連続するK個の組み合わせが(N - K + 1)個あるので全探索。

ひたすらに全探索するとO(N^2)の計算量になってしまうので、順序付き配列であるsetを利用して解いた。多分計算量がO(NlogN)になっているはず。

```cpp
int N,K;
int P[200009];
int num_place[200009];
set<int> group;

int main()
{
	// 入力
	cin >> N >> K;
	for (int i = 1; i <= N; i++)
	{
		cin >> P[i];
		num_place[P[i]] = i;
		if (P[i] >= 1 && P[i] <= K) group.insert(i);
	}
	// ik - i1の暫定値
	int min_distance = *group.rbegin() -  *group.begin();
	// 全てのパターン探索して最小値を更新
	for (int i = 1; i <= N - K ; i++)
	{
		group.erase(num_place[i]);
		group.insert(num_place[K  + i]);
		int distance = *group.rbegin() -  *group.begin();
		min_distance = min(min_distance, distance);
	}
	// 最小値を出力
	cout << min_distance << endl;
	return 0;
}
```
【ゼロから作るDeepLearning】mnistデータセットの読み込みエラーの対処

## 2024/5/7更新
コード実行時に毎回データを取得しているため動作が遅い
→アクセス後にpickle形式で保存することで解消

## はじめに 
オライリー社の『ゼロから作るDeepLearning』で画像認識の勉強中に、MNISTデータセットの準備で詰まったので解決法を共有します

## 問題
P.72 3.6.1 MNISTデータセット
用意されているスクリプトのload_mnist()関数を実行時、以下のエラーが出る
```python
(X_train, t_train), (X_test, t_test) = load_mnist(flatten=True, normalize=False)

# エラーコード ------------------------------------------------------------------
HTTPError: HTTP Error 403: Forbidden
```
エラーの原因を調べてみると
サイト側のアクセス制限によりダウンロードができないらしい

## 解決方法
sklearnのfetch_mldata関数を利用
```python
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split

mnist_X, mnist_y = fetch_openml("mnist_784", version=1, data_home=".", return_X_y=True)

X = mnist_X.astype("float32").to_numpy()
y = mnist_y.astype(int).to_numpy()

# 学習用と評価用に分割
X_train, X_test, t_train, t_test = train_test_split(X, y, test_size=10000)
```
これで当書と同じようにデータをnumpy配列で取得し、学習用と評価用に分割ができた

また、再利用に備えPickle形式で保存しておくと便利
```python
# pickle形式で保存
import pickle

with open('mnist_X.pkl', 'wb') as f:
    pickle.dump(X, f)
    
with open('mnist_y.pkl', 'wb') as f:
    pickle.dump(y, f)
```
pikleファイルの読み込み
```python
with open('mnist_X.pkl', 'rb') as f:
    X = pickle.load(f)
    
with open('mnist_y.pkl', 'rb') as f:
    y = pickle.load(f)
```
## おわりに
skleanの関数を利用することで、配布スクリプトと同じようにMNISTデータセットをnumpy配列で取得し、学習用と評価用に分割ができた

## 参考
https://qiita.com/02130515/items/41a4cfc0435e61bc4bc1