OmniAICreator/Qiita-1.07M huggingface dataset:
後続処理に邪魔なヘッダー行を読み飛ばす。2行目以降のみ表示する tail と sed, awk

ファイルやコマンドの出力結果にヘッダー行がついていると、後続処理にとって邪魔です。ヘッダーを読み飛ばす必要があります。

# ヘッダーつきの出力

こういうヘッダー付きの出力を想定します。便宜上 `withheader.txt` というファイル名にします。

```text:withheader.txt
header
1
2
3
4
5
```

## tail の場合

tail は　`-n` で行数を指定できます。

```
tail -n +2 withheader.txt
```

https://pubs.opengroup.org/onlinepubs/007904875/utilities/tail.html


## sed の場合

`--expression` (`-e`)で最終行を表す `$` を使います。 `2,$p` で2行目以降から最終行まで表示する(`p`)という意味です。

```bash:コマンド
sed --silent --expression '2,$p' withheader.txt
```

```text:出力
1
2
3
4
5
```

## awk の場合

`NR` が行を示すので行番号が1より大きい行について `print $1` を実行します。 `$1` はフィールドセパレーターで区切られた1列目のことを指します。フィールドセパレーターは `-F` や `--field-separator`  で指定できます。フィールドセパレーターはデフォルトではスペースです。

```bash:コマンド
awk 'NR>1{print $1}' withheader.txt
```

```text:出力
1
2
3
4
5
```


# ユースケース: すべての Docker コンテナを止める

起動している docker コンテナをすべて止めることを考えます。 docker はストレージ容量をたくさん消費するため、不要なコンテナやイメージは削除することがあります。しかし、コンテナやイメージを削除するには、起動しているコンテナを止めなければなりません。

起動している docker のコンテナ一覧は `docker container ls` で確認できます。 **ヘッダーがついています。**

```
$ docker container ls
CONTAINER ID   IMAGE                              COMMAND                  CREATED        STATUS                             PORTS                                             NAMES
e74b29000a27   apache/superset:latest-dev         "/app/docker/docker-…"   2 months ago   Up 32 seconds (health: starting)   8088/tcp                                          superset_worker
a3a95fbdd855   apache/superset:latest-dev         "/app/docker/docker-…"   2 months ago   Up 31 seconds                      8088/tcp                                          superset_worker_beat
e5f9ba956cc7   apache/superset:latest-dev         "/app/docker/docker-…"   2 months ago   Up 31 seconds (health: starting)   0.0.0.0:8088->8088/tcp, :::8088->8088/tcp         superset_app
4a40a256f74a   postgres:10                        "docker-entrypoint.s…"   2 months ago   Up 31 seconds                      5432/tcp                                          superset_db
9e8af44d8e5d   redis:latest                       "docker-entrypoint.s…"   2 months ago   Up 32 seconds                      6379/tcp                                          superset_cache
bb4c9ffc005b   nginx:stable                       "/docker-entrypoint.…"   8 months ago   Restarting (1) 1 second ago                                                          nginx-php_nginx_1
8fc19aff9fe3   phpmyadmin/phpmyadmin:fpm-alpine   "/docker-entrypoint.…"   8 months ago   Up 31 seconds                      9000/tcp, 0.0.0.0:8888->80/tcp, :::8888->80/tcp   nginx-php_phpmyadmin_1
8cd99dcfce80   mysql:8                            "docker-entrypoint.s…"   8 months ago   Up 32 seconds                      3306/tcp, 33060/tcp                               nginx-php_db_1
```

## tail を使う場合

```
docker container ls | cut -f1 -d" " | tail -n +2 | xargs -I {} docker stop {}
```


## sed を使う場合

```
docker container ls | cut -f1 -d" " | sed --silent --expression '2,$p' | xargs -I {} docker stop {}
```

## awk を使う場合

```
docker container ls | awk 'NR>1{print $2}' | xargs -I {} docker stop {} 
```
Qiitaにアップロードした画像を、自分で削除できる機能が追加されました！

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民こと、
新藏（にいくら）と申します♪
(/・ω・)/

[以前の記事](https://qiita.com/Aichi_Lover/items/d5e8370790bbff7dbe70 "Qiitaにアップロードできる画像の上限、月間100MBに達した場合の対処法")では、Qiitaにアップロードできる画像の上限（100MB/月）
に達した場合の対処法について記載しました。

当時はアップロードした画像を、ユーザ自身で削除することができませんでしたが、
**2023/1/17のリリースノートにて、ユーザ自身での削除が可能になりました！**

https://qiita.com/release-notes#2023-01-17

そこで今回は**Qiitaにアップロードした画像を、自分で削除する方法**について記事にしたいと思います♪
Qiita初心者の方や、画像をよく使う方の参考になれば幸いです。
(*^^)v

# 2.Qiitaにアップロードした画像を、自分で削除する
では、早速進めていきましょう♪

2.1.今回は例として、以下の約3.7MBの画像を削除します。

|![001_削除対象の画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/f40c50ef-1cca-d147-e009-718162a049ec.png)|
|:--|

2.2.上記の画像をアップロードした場合の容量は以下となります。

|![010_削除前の容量.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/be729af9-659e-f523-2b02-53f741cf5b5e.png)|
|:--|

:::note
Qiitaにログインし、任意の記事を開き、
画面を下にスクロールすると、自分が使用している容量が確認できます。
:::

2.3.Qiitaの画面右上のアイコンを選択し、「設定」を選択します。

|![020_アイコンを選択し、設定を選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/be9ebf38-569c-88b1-74e9-ccc97c5752d6.png)|
|:--|

2.4.「アップロードしたファイル」を選択します。

|![030_アップロードしたファイルを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/8e4ec80d-0d51-bae8-c813-0b5163b5feaa.png)|
|:--|

2.5.削除したい画像の右にある「ファイルを削除する」を選択します。

|![040_ファイルを削除するを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/0781fd22-2b25-a926-4cfd-83681c414a45.png)|
|:--|

2.6.確認画面が表示されるので「OK」を選択します。

|![050_OKを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/c2509541-6272-a488-6f3c-670b674c26ca.png)|
|:--|

2.7.画像が削除されます。

|![060_画像が削除される.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/aafde1d0-0858-23a5-8194-91015281fd8e.png)|
|:--|

2.8.アップロードできるファイルの容量が回復します。

|![070_削除後の容量.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/62241088-7087-d4ee-a04d-f8b6fc088527.png)|
|:--|

# 3.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

以前はQiita運営様に削除をお願いして、対応に数日間かかっていましたが、
今回のアップデートで自分の好きなタイミングで即座に削除できるようになりました！

自分自身が比較的画像を多く使うので、とても嬉しいアップデートと感じました♪

次回も何かしら記事にしたいと思います！
(:3_ヽ)_
UnhandledRejectionエラーを握りつぶす

# エラー内容
Vue.jsに設定したSentryから以下のエラーが飛んできました。
[![Image from Gyazo](https://i.gyazo.com/12595ff9d545a35bd33e7f1ec0843f3c.png)](https://gyazo.com/12595ff9d545a35bd33e7f1ec0843f3c)

```
UnhandledRejection
Non-Error promise rejection captured with value: cancel
```

# エラーの意味
promiseでcancelが返ってきたが、ハンドルできなくて失敗したよ！と言っています。

# エラーコードサンプル
Vue.jsのライブラリ「Element-Plus」の確認ダイアログで発生するサンプルです。表示された確認ダイアログで「いいえ」を選択したときは、`.then`ではなく`.catch`に遷移しますが、`.catch`が定義されていないためUnhandledRejectionが発生します。
```javascript
  ElMessageBox.confirm(
    '削除しますか？',
    '注意',
    {
      confirmButtonText: 'はい',
      cancelButtonText: 'いいえ',
      type: 'warning'
    }
  ).then(() => {
    // ～～削除処理～～
  })
```

# 対処方法
`.catch`式を書けば発生しません
```javascript
  ElMessageBox.confirm(
    '削除しますか？',
    '注意',
    {
      confirmButtonText: 'はい',
      cancelButtonText: 'いいえ',
      type: 'warning'
    }
  ).then(() => {
    // ～～削除処理～～
  }).catch((error) => {
    // UnhandldRejectionのためにとりあえず定義する。何も処理は書かなくてもOK
  })
```

以上です！
LDIF（LDAP Data Interchange Format）ファイルについて

LDAPサーバにディレクトリ情報(エントリ)を登録したり、エントリの内容を変更したりするには、LDIF（LDAP Data Interchange Format）ファイルを利用。

●LDIFファイルの基本的な書式

dn:識別名
属性名:属性値
属性名:属性値
･･･

dn:識別名
属性名:属性値
属性名:属性値
･･･

LDIFファイルでは、最初の行でエントリの識別名(DN)を記述。複数のエントリを記載する場合は空行で区切ります。コメントは行頭に「#」。
属性値は、通常UTF-8のテキストで記載しますが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定。


LDAPではデータをオブジェクトとして扱います。また、オブジェクトが持つべき属性(情報)を定義したものをオブジェクトクラス。

LDAPでのオブジェクトの単位であるエントリは、必ずオブジェクトクラスに属しています。オブジェクトクラスによってエントリの実体(エントリが人を表すのか、組織を表すのかなど)が決定されます。

LDAPでは様々なオブジェクトクラスが用意されています。

オブジェクトクラスでは以下の3つの種類の属性が定義されます。

・必須属性(Required Attribute)
属性値を指定しなければならない属性

・オプション属性(Allowed Attribute)
属性値を指定しなくてもよい属性

・名前属性(Naming Attribute)
エントリの名前を表す属性(RDN)

●LDAPで使用される主な属性
・dn 識別名(Distinguished Name)
・objectClass オブジェクトクラス(必須)
・c 国名
・cn 一般名称
・dc ドメイン構成要素
・mail メールアドレス
・o 組織名
・ou 部署などの組織単位
・sn 名字
・telephoneNumber 電話番号
・uid ユーザのログイン名
・uidNumber ユーザID

objectClass属性はエントリが属するオブジェクトクラスを指定。
objectClass属性で指定したオブジェクトクラスの種類によって、必須属性およびオプション属性が決定。

※objectClass属性自体も「top」というオブジェクトクラスの必須属性。
「top」はすべてのオブジェクトクラスの基底クラス。したがって、objectClass属性は全てのエントリの必須属性。
C++でフォーマット文字列を生成する関数

## 概要

Goの`fmt.Sprintf`関数のようなフォーマット文字列を生成する関数をC++で使用したかったが，`std::string`型でフォーマット文字列を生成する関数がC++17まではなさそうだったので自作した．

なお，Boostライブラリを使用できる環境か，あるいはC++20以降なら以下の関数は不要である．それぞれ，[`boost::format()`](https://boostjp.github.io/tips/format.html)関数，[`std::format`](https://cpprefjp.github.io/reference/format/format.html)関数を使用できる．

## ソースコード

```main.cpp
#include <cstdarg>

#include <iostream>
#include <string>

/**
 * @brief 1023文字（+ヌル文字）までの文字列をフォーマットして返す
 */
std::string StrFormat(const char* format, ...) {
  va_list args;
  va_start(args, format);

  char buffer[1024];
  vsnprintf(buffer, sizeof(buffer), format, args);
  va_end(args);

  return std::string(buffer);
}

int main(int argc, char const* argv[]) {
  std::cout << StrFormat("Hello %s", "World") << std::endl;
  return 0;
}
```
[Python] 絶対わかるデコレータの説明

### 説明
デコレータは他の関数の機能を変更したり拡張したりすることができる関数です。

### 使用方法
まずデコレータ関数を定義し、 
@decorator_nameという構文を修正したい関数に追加します。
```python
def my_decorator(func):
    def wrapper():
        print("start")
        func()
        print("end")
    return wrapper

@my_decorator
def say_hello():
    print("hello")

say_hello()
```
実行結果:
```bash
start
hello
end
```

#### 說明
@my_decoratorはPythonの糖衣構文です。
say_hello関数をmy_decorator関数の引数として渡すことができます。

簡単に言うと、@my_decoratorは以下の記述と同じです。
```python
say_hello = my_decorator(say_hello)
```
つまり、元の関数をデコレータ関数の中に入れて実行することで、元の関数がデコレータの戻り関数に置き換わるのです。
say_hello()を呼び出す時、実際には元のsay_hello()ではなく、wrapper()関数を呼び出しているのです。

### 引数のある例
```python
def count_and_sum(func):
    def wrapper(*args, **kwargs):
        wrapper.count += 1
        result = func(*args, **kwargs)
        wrapper.sum += result
        return result
    wrapper.count = 0
    wrapper.sum = 0
    return wrapper

@count_and_sum
def add(x, y):
    return x + y

print(add(1, 2)) # 3
print(add(3, 4)) # 7
print(add(5, 6)) # 11
 
print("Total count: ", add.count) # 3
print("Total sum: ", add.sum) # 21
```
@count_and_sumをaddの前に付けると、addがcount_and_sumの引数として渡されます。
count_and_sumでは、wrapperがaddを引数に取り、addが呼ばれた回数と合計を計算します。
add(x, y)が呼ばれるたびに、実際にはwrapper(x, y)が呼ばれ、addが呼ばれた回数と合計が加算されることになります。
count_and_sumはwrapperを返すので、元のaddを統計機能のある関数に変更することができます。

add.countとadd.sumはwrapperで定義された変数です。
addを@count_and_sumで変更すると、wrapperが実行されるので、wrapper内の変数が生成されてaddに格納され、add.countとadd.sumが値を持つことができるようになります。

### QA
#### 1. 糖衣構文とは？
糖衣構文(syntactic sugar)とはプログラミング言語で提供される構文で、
コードをよりシンプルに見せ、理解しやすくするが、プログラムの機能には影響を与えないものです。
#### 2. なぜwrapperとfuncは*args, **kwargsを追加するんですか？
修正された関数（func）がいくつの引数を持ち、それらが位置引数なのかキーワード引数なのかが不明なためです。
*args、**kwargsは任意の数の位置引数とキーワード引数を取ることができるので、デコレータが元の関数の引数の数や種類に影響されないことを保証します。

#### 3. 位置引数とキーワード引数とは？
- 位置引数(positional arguments)
関数が呼び出された時に、関数内で定義された引数の順番で提供される引数です。
```python
def test_function(a, b, c):
    print(a, b, c)

test_function(1, 2, 3)
```
1はaの位置引数、2はbの位置引数、3はcの位置引数です。

- キーワード引数(keyword arguments)
関数が呼び出された時に、引数名を明示的に指定して提供される引数です。
```python
def test_function(a, b, c):
    print(a, b, c)

test_function(a=1, c=3, b=2)
```
a=1はaのキーワード引数で，c=3はcのキーワード引数で，b=2はbのキーワード引数です。

キーワード引数は任意の順序で入力できるが、
位置引数は関数で定義された順序で入力する必要があります。

#### 4. *argsとは？
*argsの機能は、任意の数の位置引数を受け取ることです。
```python
def test_function(*args):
    for arg in args:
        print(arg)
test_function(1,2,3,4,5)
```
実行結果:
```python
1
2
3
4
5
```
関数を呼び出す際に任意の数の引数を渡すことができ、
*argsを使って引数を受け取ることができるのです。

#### 5. **kwargsとは？
**kwargsの機能は、任意の数のキーワード引数を受け取ることです。
```python
def test_function(**kwargs):
    for key, value in kwargs.items():
        print(key, value)
test_function(a=1, b=2, c=3)
```
実行結果:
```python
a 1
b 2
c 3
```
kwargs.items()を介してすべてのキーワード引数を取得し、辞書のような構造に格納します。
さらにキーから値を取得することができます。

#### 6. argsと**kwargsを併用しない場合はどうなりますか？
1つだけだと制限があります。
例えば、*argsのみを使用した場合、位置引数は受け取れるが、キーワード引数は受け取ることができません。
**kwargs のみを使用した場合、位置引数を受け取ることができません。
したがって、デコレータは通常、任意の数の位置引数とキーワード引数を同時に取るために、両方とも使います。
【Shell】ログインシェルを確認する方法

## Linux

Linuxの場合には次のコマンドで確認できます。

```terminal
$ grep $USER /etc/passwd

```

また`SHELL`環境変数　にデフォルトでログインシェルのフルパスが設定されています。

```terminal
$ echo $SHELL
/bin/bash
```

## Mac

Macの場合には次のコマンドで確認できます。

```terminal
$ dscl localhost -read Local/Default/Users/$USER UserShell
```
Dart Numbers(数値型)のPropertiesとMethods


## Property
### hashcode 
数値のハッシュコードを返します。
``` dart
double num = 10.12;
num.hashcode; // 10200654231582541

double num = 10.0;
num.hashcode; // 10
```
### isFinite 
[NaN](https://ja.wikipedia.org/wiki/NaN)か正の無限大・負の無限大でであれば false そうでなければ true が返ります
``` dart
double num = (0.0 / 0.0);
num.isFinite; // false

double num = (1.0 / 0.0);
num.isFinite; // false

double num = 10.12;
num.isFinite; // true
```
### isInfinite 
正の無限大・負の無限大でであればtrueを返し、それ以外の場合はfalseを返します。
``` dart
double num = (0.0 / 0.0);
num.isInfinite; // false

double num = (1.0 / 0.0);
num.isInfinite; // true

double num = 10.12;
num.isInfinite; // false
```
### isNan 
数値が[NaN](https://ja.wikipedia.org/wiki/NaN)場合はtrueを返し、そうでない場合はfalseを返します。
``` dart
double num = (0.0 / 0.0);
num.isNan; // true

double num = (1.0 / 0.0);
num.isNan; // false
```
### isNegative 
数値が負の場合はtrueを返し、それ以外の場合はfalseを返します。
``` dart
double num = (0.0 / 0.0);
num.isNegative; // false

double num = 10.2;
num.isNegative; // false

double num = -10.2;
num.isNegative; // true
```
### sign 
数値の符号と値に応じて、-1、0または1を返します。
``` dart
double num = 10.0;
num.sign; // 1.0

double num = -10.0;
num.sign; // -1.0

double num = 0.0;
num.sign; // 0.0
```
### isEven	
数値が偶数の場合はtrueを返し、それ以外の場合はfalseを返します。
``` dart
int num = 0;
num.isEven; // true

int num = 2;
num.isEven; // true

int num = 1;
num.isEven; // false
```
### isOdd 
数値が奇数の場合はtrueを返し、それ以外の場合はfalseを返します。
``` dart
int num = 0;
num.isOdd; // false

int num = 2;
num.isOdd; // false

int num = 1;
num.isOdd; // true
```
## Methods
### abs	
数値の絶対値を返します。
``` dart
double num = 10.12;
num.abs(); // 10.12

double num = -10.12;
num.abs(); // 10.12
```
### ceil 
切り上げ。
``` dart
double num = 10.12;
num.ceil(); // 11

double num = -10.12;
num.ceil(); // -10
```
### compareTo 
その他の数値と比較します。
``` dart
double num = 10.12;
num.compareTo(11) // -1
num.compareTo(10.12); // 0
num.compareTo(10); // 1
```
### floor 
切り捨て。
``` dart
double num = 10.12;
num.floor(); // 10

double num = -10.12;
num.floor(); // -11
```
### truncate 
小数点以下を破棄した後、整数が返されます。
``` dart
double num = 10.12;
num.truncate(); // 10

double num = -10.12;
num.truncate(); // -10
```
### remainder 
2つの数値で除算した後、余数が返されます。
``` dart
double num = 10.5;
num.remainder(2); // 0.5 
```
### round 
四捨五入。
``` dart
double num = 10.5;
num.round(); // 11
```
### clamp(num lowerLimit, num upperLimit) 
範囲外の数値を範囲内クランプされ,upperLimitより大きいならupperLimitが返され、lowerLimitより小さいならlowerLimitが返される。
``` dart
double num = 10.5;
num.clamp(5, 10.0); // 10.0
num.clamp(-5, 5.0); // 5.0

double num = -10.5;
num.clamp(5, 10.0); // 5
num.clamp(-5, 5.0); // -5

double num = 5.5;
num.clamp(5, 10.0); // 5.5
```
### toDouble 
数値のdouble型の等価値を返します。
``` dart
int num = 10;
num.toDouble(); // 10.0
```
### toInt 
数値のint型の等価値を返します。
``` dart
double num = 10.5;
num.toInt(); // 10
```
### toString 
数値の文字列型の等価値を返します。
``` dart
double num = 10.5;
"num:" + num.toString(); // num:10.5
```
## その他
他に書いてないPropertiesとMethodsは以下のリンクを参照してください。
https://api.flutter.dev/flutter/dart-core/num-class.html
日本語訳 https://runebook.dev/ja/docs/dart/dart-core/num-class?
$app->loadEnvironmentFrom('.env.example');

https://github.com/laravel/framework/blob/0a18e9271c328fd86879a74487c4744cc2a6672d/src/Illuminate/Foundation/Application.php#L542

loadEnvironmentFromでenvをロードしてるわけではない。`.env`を上書きしてるだけ。`.env`とloadEnvironmentFrom()の引数の`.env`が両方ロードされることもない

```bash
    /**
     * The environment file to load during bootstrapping.
     *
     * @var string
     */
    protected $environmentFile = '.env';

    public function loadEnvironmentFrom($file)
    {
        $this->environmentFile = $file;

        return $this;
    }
```
ツイートするのがめんどくさい



## 投稿内容を考えるの、とっても大変ですよね
それを毎日続けるのは難しい

## ツイートの内容を考えるのをやめましょう
他人に記事をコピーすればいいじゃないですか
そんなこと許されるのかって？許されているんです
そう，Lonpaなら

## とっても簡単な３ステップ
１．https://lonpa.net/へアクセス
２．自分の意見とマッチしている意見の♡をタップ
３．SNSのマークを押す

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116004/f0fa2377-7b0d-f323-6340-4b7958541b43.png">

たったこれだけで，他人の意見を自分の意見として投稿できます！
Lonpaを活用して，人生の時間を有意義に使いましょう！
paizaラーニング レベルアップ問題集 二分探索メニュー JavaScript パイプを切り出そう

パイプを切り出そう (paizaランク A 相当)

https://paiza.jp/works/mondai/binary_search/binary_search__application_step0

# 解説
解き方を思いつくところが難しかったです。

**解き方の流れ**
 
切り出すパイプの長さを決める(長さの範囲の両端の真ん中mid)
→決めた長さで、A_1からA_nまで順に切り出し、本数を合計する
→切り出した本数の合計がk本切り出せているか判定する
→その判定により両端の範囲を狭める
→求められる誤差まで繰り返す。

**解き方を思いつくまで**

ある長さで、n本のパイプ1本1本から切り出す。切り出した本数がわかる。それがk本に満たないなら、もっと短い長さにする。k本を超えるなら、もっと長くできる。

できるだけ長くしたいので、k本切り出せるか切り出せないかの境目の長さが知りたい。手間がかかりそうなので、速い処理ができないか。二分探索が使えそう。

長さxのパイプをk本切り出せるなら、それ以下の長さのy(数式で表すとy<=x)についても、もちろん切り出せる。なので、yについては考えなくて良いので、範囲を一気に狭められる。

反対に、長さxのパイプをk本切り出せなかったら、それ以上の長さのz(数式で表すとx<=z)についても、もちろん切り出せない。なので、zについては考えなくて良いので、これも範囲を一気に狭められる。

切り出す長さを短くするほどたくさん切り出せる。長くするほど切り出す数が少なくなる。
こういった単調な性質があるので、パイプの長さで二分探索ができる。

**方針:二分探索する**

この問題について、パイプの長さの範囲は`1 ≦ A_i ≦ 10,000`。なので、この範囲を含む`(left=)0 ≦ A_i ≦ 10,001(=right)`において、二分探索をします。

両端の真ん中の長さmid=(rigth+left)/2のパイプをk本切り出せるかチェックします。

k本切り出せるかチェックの方法は、それぞれのパイプからmidの長さのパイプを切り出し、それぞれの本数を合計した本数がkより小さいか(または大きいか)で、できます。

i番目のパイプから切り出した長さmidのパイプの本数は、A_iをmidで割った商で求められます。これをn本について計算し、合計本数を求めます。
この合計本数がk本に到達しているか判定します。

k本に到達していないなら、切り出すパイプの本数を増やさないといけないので、切り出すパイプの長さを短くします。これより長い長さはk本に到達しないので調べる必要はありません。よって、調べた長さmidを、次から調べる範囲の右端rightにします。

反対に、k本に到達していたら、パイプの長さを長くできます。これより短い長さは調べなくて良いので、midを左端leftにできます。

この流れを、絶対誤差が 10^-6 (0.000001) 以下になるまで繰り返しますが、本条件では50回繰り返せば満たされます。

# 解答例(Python3とC++の場合参考)
方針では 50 回としていたところを、万全を期すために 100 回にしています。
長さ x のパイプから切り出せる長さ mid のパイプの本数は Math.trunc(a / mid) 本になります。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, k] = lines[0].split(" ").map(Number);
const A = lines[1].split(" ").map(Number);

//切り出すパイプの長さを二分探索する
let [left, right] = [0, 10001];//探索するパイプの長さの範囲の両端
for (let i = 0; i < 100; i++) { 
/*相対誤差または絶対誤差が 10^-6 (0.000001) 以下であれば正解なので、
50回も繰り返せばよいが、万全を期すため、100回繰り返す */
  //長さmidのパイプを合計num_of_pipes本切り出す
  let mid = (left + right) / 2;//範囲の両端の真ん中の長さ
  let num_of_pipes = 0;//合計何本切り出せたか
  //それぞれのパイプの長さについて切り出していく
  for (let a of A) { 
    num_of_pipes += Math.trunc(a / mid);
    /* a/midで切り分け、
    長さmidに満たない切れ端はいらないのでMath.truncで切り捨てる
    求めた本数Math.trunc(a / mid)を、
    合計本数num_of_pipesに加えていく */
  }
  //求まった合計本数num_of_pipesが、k本切り出せたかチェックする
  if (num_of_pipes < k) { //k本に満たない＝長さをもっと短くして本数を増やす
    right = mid;//midより長い長さはもちろん本数が足りないので、範囲の長い方(右端)をmidまで狭める
  } else { //k本切り出せた＝長さをもっと長くできる=本数減らせる
    left = mid;//midより短いところはもちろんk本切り出せるので、短い方(左端)の範囲をmidまで狭める
  }
  
}
//100回探索して、切り出せるか切り出せないかのパイプの長さの境目
console.log(left);
```
デスクトップのボリュームとフォルダアイコン位置を記録&戻すAppleScript

外部ファイルに記録するので、あとから編集して位置をぴったり合わせたりできます。

```AppleScript
tell application "Finder"
	activate
	set myPlace to folders of desktop -- ボリュームとフォルダを取得
	set outFile to "/Users/yamo/.DesktopIconPosition.txt" -- 記録ファイルのパス
	
	set myDiag to display dialog "フォルダとボリュームアイコンのレストア" buttons {"レストア", "記録する", "Cancel"} default button "レストア"
	
	if button returned of myDiag is "レストア" then
		if exists (outFile as POSIX file) then -- ファイル存在確認して、あるなら
				repeat with i in myPlace
                    try
    					set n to name of i
    					set iz to (do shell script "echo " & n & " | xargs -I{} awk -v 'OFS= ' '$1==name { print $2,$3}' name={} " & outFile) -- 記録ファイルから名前でマッチした行から位置の数字をスペース区切りで取り出す
    					set {ix, iy} to words of iz -- 取り出した数値を分解
    					set desktop position of i to {ix, iy} -- 位置を記録通りに
                    end try
				end repeat
				display notification "ボリュームとフォルダアイコンの位置を戻しました"
		else
			display alert "まず位置を保存してください"
		end if
		
	else if button returned of myDiag is "記録する" then
		try
			do shell script ":> " & outFile -- 記録ファイル作成&クリア
			repeat with i in myPlace
				set myItem to {desktop position, name} of i
				set myPosition to (item 2 of myItem) & tab & (item 1 of item 1 of myItem) & tab & (item 2 of item 1 of myItem)
				do shell script "echo '" & myPosition & "' >> " & outFile
			end repeat
			display notification outFile & "に記録しました"
		end try
	end if
end tell
```
image_pickerでライブラリの権限許可アラートが１度しか出なかったのでその対処法をメモ

端末から写真をアップロードする際に「許可しない」をタップすると再度ボタンをタップしてもライブラリ画面に遷移しなくなる。
以下のエラーが出力される。

```

PlatformException(photo_access_denied, The user did not allow photo access., null, null)<…>

```

### 対処法
基本的には[この記事](https://nobushiueshi.com/flutter%e6%a8%a9%e9%99%90permission%e3%81%ae%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e6%96%b9%e6%b3%95/
)のサンプルコードを参照すればいい。

ただ、PermissionStatus.isUndeterminedがFlutter2系では無いので、isDeniedに変更する。

続く.....。
componentが勝手に二重renderされちゃう

<h2>始めに</h2>

最初にReactを勉強していた時に、ログを確認したら絶対１回しか出力されないうはずのログが
２回出力されていることがわかりました。特に問題とかにはならなかったため、無視してきたが、
ソースが長くなることにより、ログを見るのがむずくて探してみた。

<h2>renderが二重されちゃう</h2>

```react
import React from 'react'
export default function List() {
    const todos= [
        {id: 1, text: 'Drink Water'},
        {id: 2, text: 'Wash Car'}
    ]
    
    const Item = (props) => {
        console.log(props);
        return <li>{props.id}{props.text}</li>
    }

    const todoList = todos.map((todo) => 
        <Item key={todo.id} id={todo.id} text={todo.text}/>
    )  

    return (
        <>
            {todoList}
        </>
    )
}
```
普通だと上記を実行させたらtodosのobjectが２回出力すると予想されますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/d7a45ff3-1180-5532-b5dc-01433ddc448d.png)
console画面を見るとなぜか２回出力され、２回renderされてしまうことがわかります。
一体なぜでしょか？
それはReact.StrictModeです。

<h2>React.StrictMode</h2>
StrictModeとは、Applicationの潜在的な問題を発覚するためのツールです。<br>
これは、開発モードでは活性化して、productionモードでは影響を受けないそうです。
render段階のライフサイクルメソッド(constructor、render、setStateupdate function...)は何度も呼び出されることがあるため、副作用を含まないことが重要です。 そうでなければメモリ漏れなど多様な問題を起こしかねない！<br>
しかし、このような問題は予測通りに動作しないため、発見するのが難しいです。
それで、StrictModeが問題を見つけることはできないですが、いくつかの機能を意図的に二重呼び出しして発見できるようにしてくれます。
<br>
<br>
その機能に該当するのは以下！

・Class component constructor, render, and shouldComponentUpdate methods
・Class component static getDerivedStateFromProps method
・Function component bodies
・State updater functions (the first argument to setState)
・Functions passed to useState, useMemo, or useReducer


React.StrictModeを解除するにはindex.jsのStrictModeを無効にしておけば二重呼び出されません。
```react
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  // StrictModeに囲まれているコンポーネントが対象！  
  <React.StrictMode> 
    <App />
  </React.StrictMode>
);
```

<h2>参考したサイト</h2>
https://mariosfakiolas.com/blog/my-react-components-render-twice-and-drive-me-crazy/
JetBrains Monoに色々なStylistic Setが追加されたのでまとめてみる

# はじめに

[JetBrains Mono](https://www.jetbrains.com/lp/mono/)は、同JetBrains製IDEのデフォルトフォントに選ばれたこともあり、よく見るようになりましたね。
そんなこのフォントですが、つい先日新たに[v2.304](https://github.com/JetBrains/JetBrainsMono/releases/tag/v2.304)がリリースされたみたいです。
実に約1年とちょっと振り。

入手はこちらからできます。

https://github.com/JetBrains/JetBrainsMono/releases/tag/v2.304

さて、Changelogを読んでいるとスタイルセットに関する記述が気になりました。
`ss**`や`cv**`で変更できるみたいですが、具体的にどれがどの文字を変更するのかが分からなかったので、自分の分かる範囲でまとめてみました。

~~※公式で記述されているのを見逃していたら、教えていただけると嬉しいです。~~
Wikiに追加されていました。

https://github.com/JetBrains/JetBrainsMono/wiki/OpenType-features

# 変更箇所

## `ss**`シリーズ

まずは、`ss**`で変更できるものについて。

![Screenshot 2023-01-18 213421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/2c7177fa-3b88-feec-eb6a-35190619e788.png)

セット|概要
:-|:-
`ss01`|プレーンテキストでより良く見える
`ss02`|狭い行間でより良く見える
`ss20`|`f`の横棒の高さを他の小文字と揃えた

数字、記号は特に違いが見られなかったので省略。
`ss01`と`ss02`の記述に関しては、[v2.300](https://github.com/JetBrains/JetBrainsMono/commit/784f65aca6b8c2b5cf4061b45b079f0e3f391248)のChangelogから引用しました。

![Screenshot 2023-01-18 213626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/056c36d5-c2ca-634d-190e-f36d3efe8a2e.png)

セット|概要
:-|:-
`ss19`|合字の別パターン
`No Liga`|（比較用）合字なし

これは
『合字からもとの文字の組み合わせは想像できるべき』
と言った主張（意訳）から作られたみたいですね（[Issue #287](https://github.com/JetBrains/JetBrainsMono/issues/287)）。

単に合字を無効にしているだけかと思いきや、スペーシングは調整されているような……？

## `cv**`シリーズ

次に、`cv**`で変更できるものたちです。
左側に設定前（デフォルト）、右側に`cv**`の各値を設定した後のものを出しています。

![Screenshot 2023-01-18 213708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/f0adf339-c215-afd2-7e9f-4c57b03136d8.png)
![Screenshot 2023-01-18 213725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/1cc7db45-8c46-a5b3-1ef6-23df159d819e.png)


それぞれ以下のように変更されています。

セット|違い|その他補足
:-|:-|:-
`cv01`|`l`の下側
`cv02`|`t`の下側
`cv03`|`g`のデザイン
`cv04`|`j`の下側
`cv05`|`l`の下側
`cv06`|`m`の真ん中が下までついているか
`cv07`|`w`、`W`の真ん中が上までとどいているか
`cv08`|`k`の縦線への付き方|~~大文字`K`は変わらなかった~~<br>大文字`K`も変わってました（画像は下へ）
`cv09`|`f`の下側
`cv10`|`r`のデザイン
`cv11`|`y`の下側
`cv12`|`u`の右下
`cv14`|`$`のデザイン
`cv15`|`&`のデザイン|関連する合字も変わっている模様
`cv16`|`Q`の下側
`cv17`|`f`の上側
`cv18`|`2`、`6`、`9`のデザイン
`cv19`|`8`のデザイン|旧バージョンの`8`に戻す
`cv20`|`5`のデザイン|旧バージョンの`5`に戻す

`cv13`はどこが変わっているのかわかりませんでした。

【追記】
大文字`K`もしっかり変わってました。すみません。
なぜ気づけなかった……。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/de8a420c-34d0-c6d7-ce3b-572d04bd9591.png)

## その他の違い

Changelogから記述は見つかりませんでしたが、大文字の`J`の上側のセリフがなくなってますね。
特にStylistic Setで変更もできない模様。

![Screenshot 2023-01-18 221629.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091433/28540dfb-528f-1c2b-9860-3d12ce791b9f.png)

# おまけ：VSCodeでStylistic Setを使う

`editor.fontLigatures`に文字列型で指定すると、VSCode上で反映させられます。

```jsonc
"editor.fontLigatures": "'cv07', 'cv11'"
```

よろしければ、私が書いたこちらの記事も参考にしてください。

https://qiita.com/gixim/items/b9422a9a36382da32a2d

# おわりに

まだまだStylistic Setに対応しているエディタは少ない気がしますが、今後どんどん使える場所が増えて、より自分好みのフォントスタイルを使えるようになるといいですね。
llvmのリポジトリを追加してclangの最新版をインストールする

# 準備

必要なパッケージをインストールします。

```bash
$ apt install curl gnupg
```

# gpgキーの取得

llvmリポジトリのgpgを取得してきます。

```bash
$ curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /etc/apt/keyrings/llvm.gpg
```

:::note info
公式サイトではapt-keyを使用する方法が紹介されていましたが、非推奨のワーニングが出るためgpgを使用する方法にしました。
:::

# リポジトリの登録

取得してきたgpgキーと紐付けてllvmリポジトリを登録します。

```bash
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/llvm.gpg] http://apt.llvm.org/jammy/ llvm-toolchain-jammy main" | tee /etc/apt/sources.list.d/llvm.list > /dev/nul
```

# インストール

インストールします。

```bash
$ apt update
$ apt install clang llvm lld lldb
```

```bash
$ clang++ --version
Ubuntu clang version 16.0.0 (++20230116031321+5ab0894fd570-1~exp1~20230116151419.689)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```

# バージョンを指定してインストールする


下記のようにバージョンを指定してリポジトリを登録した場合は、インストールするときもバージョンを指定することになります。

```bash
 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/llvm.gpg] http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main" | tee /etc/apt/sources.list.d/llvm.list > /dev/nul
```

```bash
$ apt install clang-15 llvm-15 lld-15 lldb-15
```

実行するときはバージョン付きだとめんどくさいのでバージョン無しでもアクセスできるようにします。

```bash
$ update-alternatives --install /usr/bin/clang clang /usr/bin/clang-15 1
$ update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-15 1
$ update-alternatives --install /usr/bin/lldb lldb /usr/bin/lldb-15 1
$ update-alternatives --install /usr/bin/lld lld /usr/bin/lld-15 1
```

```bash
$ clang --version
Ubuntu clang version 15.0.7
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```


# 参考サイト

- 公式サイト

https://apt.llvm.org/
【Python】Array.prototype.mapのようなLINQのようなパイプのようなやつ

# はじめに
私は基本Pythonしか書かないのですが、C#でデスクトップアプリ開発に手を出してみたりして、
パイプっぽいリストの加工便利だなーと感じ、Pythonで似たような？ことをできるようなクラスを試しに書いたメモ。
n番煎じ。

# こんなの

```py
arr = (l (range(10))
       | (lambda x: 2 * x)
       | (lambda x, i: x + i)
       | (lambda x, i, arr: x * arr[-i-1]))

print(arr) # -> [0, 72, 126, 162, 180, 180, 162, 126, 72, 0]
```
使用している書体によっては`l`から縦棒が連なってる感じで見た目がよい。

```py
import requests
from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get("https://qiita.com/tags/python").content)

dict(
    l (soup.find_all("li"))
    | (lambda x: x.a['href'])
    | (lambda x: x.split("/"))
    | (lambda x, i, arr: (f"{i+1}/{len(arr)}", [i for i in l(x) if i]))
)
#-> {'1/3': ['https:', 'www.python.jp'], '2/3': ['https:', 'docs.python.org', 'ja', '3'], '3/3': ['https:', 'ja.wikipedia.org', 'wiki', 'Python']}
```
こういう使い方とか。

# 実装
ただのリストのサブクラス、引数に応じてインデックスやリスト全体を得られる点はJSのArray.prototype.map譲り。
```py
class l(list):

    def __or__(self, f):
        # check is func
        assert hasattr(f, "__call__")
        
        # check num args
        from inspect import signature
        n = len(signature(f).parameters)
        assert 0 < n <= 3
        
        if n == 1:
            return l(f(x) for x in self)
        elif n == 2:
            return l(f(x, i) for i, x in enumerate(self))
        elif n == 3:
            return l(f(x, i, self) for i, x in enumerate(self))
```
Out of boxかTurnkeyか

Out of boxとTurnkeyの違いがなんか気になり、衝動に駆られてためにも暇つぶしにもならないものを書いてしまいました。

## 事の始まり
長いので、お忙しい方はCtrl+w、ちょっとお忙しい方は次の章までスキップ、読んでも良いよという変わった方はこのままお付き合い下さい。

さて、最近部屋に緑が欲しいなと鉢植えをいくつか購入したんですが、ものぐさな私は植物プランターの水やり回数を必要最小限に抑えたい思いがだんだん募り始めました。はて、癒されてるんだか、ストレスになっているんだか。ということで、プランター内の土壌の水分量がわかれば植物の元気が無くなる手前のタイミングもわかり、不必要な水やりを減らせるじゃないかと、おめでたい短絡思考により極めて明快かつド直球なアイデアを得ることができました。アイデアが浮かんだら後は実行です。以前から興味のあったM5Stackに土壌水分センサーを組み合わせて水やりモニターデバイスを作りました。しかし、これにはいくつか問題がありましたが、特に一つは致命的なものでした。このモニターデバイスは土壌の水分量を測るので、当然プランターの土にセンサーを差しておかないといけません。つまりモニターデバイスは鉢植えの所にあり、そこまで行かないと水分量が分からないというこれまた明快でしかし奥の深い問題です。１００畳ほどある我が家（四次元空間の中にあります）ではこれはこれはとても頭の痛い、いや足が痛くなる問題であるのと、なんならそこまで辿り着いたのであれば**指で土を触れば**何となくそろそろ水やんなきゃだなと分わる説すらあります。これでは折角作った意味が失われてしまいます。そうです、たとえ三次元空間で腕を伸ばせば届く距離にあったとしても意味を与える為に無線でデータを飛ばすしかありません。という事でAlexaに繋げる方法を模索し始めました。そこでOut of boxというワードと出会ったのです。

## Out of boxとは？IoT界隈はそこらじゅうOut of boxだらけ。Turnkey solutionは死語なのか？
Alexa, M5stack、connect、とかググると、Alexa Connect Kit (ACK、エーシーケー）に必ず漂着します。そこには初めて目にするワードがまるで太平洋ゴミベルトのレジ袋の如く漂っています。何とかそれらを掻き分けながら泳いでいるとOut of box、またはOut of the box、が意味するところが簡単、手間要らず、レンジでチンするだけ、という感じの意味なのだなとわかります。扇風機のように箱から出して(Out of box）コンセントに繋いで後はスイッチを押せば使えるくらい簡単、そんな様から来ているのでしょう。扇風機よりiPhoneとかの方が良かったか。

他にもどうにかコピペ程度でAlexaに繋げる方法が無いものかと漂流していると、どうやらIoTやEdgeデバイス界隈はOut of boxが標準ワードのようです。以前は同じようなニュアンスで、導入して直ぐに手間暇いらずに使えるソリューションであることを表してTurnkey solutionという言葉も一昔前はよく目にしました。流行り廃りなのか、それとも何か棲み分けみたいなものはあるんでしょうか。

何となくTurnkey solutionは情報システム系で用いられている感じがします。IoTも情報システムではありますが、Out of box、Box箱、箱には入っていもの、家電／電子機器と連想され、やはりThingsモノ、特に手で触れることができて直接操作できるモノで、操作が簡便な様を表して用いられるワードのような気がしました。また、Alexaに繋げる方法を調べる際に目にしたサイトでは、実現したい価値（アプリケーション、サービス）の部分に開発リソースを注力させることができ、それ以外のアクチベーションやデバイス管理、インフラ基盤といった実現したい価値ではない部分に注力する必要がないという開発者目線でのメリットが謳われていることから、Out of boxには新たな価値や体験の創造／提供といったニュアンスも込められていると思います。そういう意味では、Turnkey solutionは価値の創造ではなく、効率化、省力化という文脈で用いられるべき言葉なのかもしれません。

うまく伝えられたかわかりませんが長々と読んでくださありがとうございます。そろそろ意味を見出す旅にモニターデバイスの値を見に行かないといけないのでこの辺で失礼します。おっと、まだAlexaに繋がっていないのがバレた。
JAVA バージョン変更　Mac

## はじめに
今回は、Javaのバージョン変更方法について書いていきます。簡単です。
PCはMacです。今回はJava19.0.1をJava17.０.5に変更します。

## 現在のJavaのバージョンを確認していく


まず、現在のJavaのバージョンを確認していきます。
```
~ % java -version
java version "19.0.1" 2022-10-18
Java(TM) SE Runtime Environment (build 19.0.1+10-21)
Java HotSpot(TM) 64-Bit Server VM (build 19.0.1+10-21, mixed mode, sharing)
```

このコマンドで、現在のJavaのバージョンは19.0.1であるとわかります。

## インストールされているJavaのバージョンを確認する
次は、変更するJavaのバージョン17.0.5がインストールされているか確認します。

```
 ~ % /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
    19.0.1 (arm64) "Oracle Corporation" - "Java SE 19.0.1" /Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home
    17.0.5 (arm64) "Oracle Corporation" - "Java SE 17.0.5" /Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
```
このように、17.0.5がインストールされているとわかります。

## バージョンを変更する
バージョンを変更していきます。

```
 ~ % export JAVA_HOME=`/usr/libexec/java_home -v 17.0.5`
```
これでバージョンが変わりました。

最後に、バージョンがしっかり変わっているか確認していきます。

```
 ~ % java -version
java version "17.0.5" 2022-10-18 LTS
Java(TM) SE Runtime Environment (build 17.0.5+9-LTS-191)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.5+9-LTS-191, mixed mode, sharing)
```
以上でバージョンが変更することができました。
Googleプロジェクト管理：NDA,RFP,SOW

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c79c997-e4e4-7d71-3686-e01b7badaa3c.png" width="800">

# 調達に関連する重要な文書

プロジェクトマネージャが調達の各フェーズを進める上で、いくつかの重要な文書があります。

| フェーズ　 | 文書　　| 
| :--- | :--- | 
| 開始 | NDA(秘密保持契約書) | 
| 選定 | RFP(提案依頼書） | 
| 契約 | SOW（作業指示書） | 

# NDA(秘密保持契約書)

NDAは多くの企業で標準となっており、外部の契約社員にもNDAにサインしてもらうのがベストプラクティスです。NDAの目的は、***<font color="MediumBlue">機密情報を組織内に留めておく</font>*** ことです。

例えば、ある企業がプロジェクトで何らかの独自技術を使用していたり、機密性の高い製品の発売を準備している場合、その技術に関する会話や情報が、発売前に競合他社や一般に流出しないようにしたいと考えるからです。

# RFP(提案依頼書）

これは、 ***<font color="MediumBlue">組織のプロジェクトの詳細と要件を概説した文書</font>*** で、ベンダーに渡すためのものです。RFPは、ベンダーから入札を募るために使用され、その後、プロジェクトに最適なベンダーを選択することができます。RFPは、企業内のさまざまな部署やさまざまな業界で広く使用されています。

RFPには通常、

- プロジェクトの概要
- 望ましい成果
- 目標
- 予算
- 納期
- マイルストーン
- 連絡先

が記載されており、各ベンダーは、その仕事にどのように取り組む予定なのか、詳細な提案を持って返信してくることができます。

- このプロジェクトの目的は何ですか？
- このプロジェクトは、どのような問題を解決するのでしょうか？
- 会社にとってどんな新しい扉が開かれるのか？
- プロセスを通じて達成すべき測定可能な結果は何か？
- プロジェクトの具体的な内容は？
- プロジェクトに含まれる重要なマイルストーンは何か？
- これらの目標をどのように達成し、プロジェクトを成功させるのか？
- 「3つのプロトタイプを添付してください」といった提出要件や、プロセスの一環としてベンダーに回答してほしい質問を記載します。これは、潜在的なベンダーを適切に評価するのに役立ちます。

:::note info
ここで重要なのは、NDAとRFPの両方が固定されており、プロセス全体を通じて同じであることです。つまり、カスタマイズの余地はあまりなく、一度提出すれば変更されることはありません。
:::

# SOW（作業指示書）

Statement of Work（SOW）と呼ばれる3つ目の重要な文書があります。SOWはベンダー選定後に送付され、プロジェクトが進むにつれて進化していきます。

- SOWは、ベンダーやコントラクターが組織のために提供する製品やサービスを明確に示した文書です。
- SOWには、合意されたサービスを適切に実行するための請負業者のニーズと要件が記載されています。
- SOWは顧客のニーズに対応するものですが、組織のニーズやベンダーのニーズも含めることが同様に重要です。

最高の製品やサービスを提供するためには、すべての関係者がそれぞれに何を期待されているかを理解することが重要です。プロジェクトマネージャーはSOWの作成を担当しますが、プロジェクトマネージャーが持っていないような技術的な専門知識については、主題専門家やSMEに意見を求めることがよくあります。あなたの組織の法律顧問は、あなたと一緒にこの文書を検討し、あなたと一緒に作成することもあります。

↓SOWサンプル

https://docs.google.com/document/d/1TA55da0QI6aJousn5sLzOzN0X-Tcx5iwUaWmnOoUj50/template/preview

- **ゴール:** 望ましい結果が何であるかについて詳細に説明します。対象者に関するセクションを必ず入れて、誰もが参加できるようにします。もっと具体的な目標がある場合は、ここにも記載します。
- **スコープ:** サービスの内容を記載します。
- **アウトオブスコープ（範囲外）:** 潜在的な混乱の余地を排除し、ベンダーとの期待を設定するのに役立ちます。
- **成果物:** プロジェクトが何を提供するかについて、簡潔な記述が必要です。
- **マイルストーン:** 進捗、予算、スコープを追跡するために不可欠な部分であるため、ここにも含める必要があります。
- **日付：** このプロジェクトの完了に何時間必要かを明確にし、そのサービスを必要とする特定の日を指定します。
- **条件やその他の免責事項:** プロジェクトが進行するにつれて、改訂が行われる可能性があることを示す免責事項があるとよいでしょう。これは、予期せぬ問題でスコープが変更された場合に備えて入れておくことが重要です。プロジェクト・マネージャーとして、過剰な約束と過小な納品をしないことが一番ですから、免責事項に修正を加えるのは良い考えです。プロジェクト・マネージャーとして、過剰な約束と過小な納品は避けなければなりません。
- **支払い条件:**　サプライヤーにいつ支払いを行う必要があるのかを概説するものです。供給業者に期限内に確実に支払ってもらうことで、強固な関係を築くことができます。一般的に、良い調達慣行とは、状況的な合意がない限り、商品やサービスの納入前ではなく、納入時にベンダーや請負業者に支払うことでしょう。
【Vue.js】おそろしく速いキャベツ、オレでなきゃ見逃しちゃうね

### 【概要】
キャベツの画像をアニメーションで移動します。
トンパ、キルア、クロロの順にキャベツの移動速度が速くなります。

### 【環境】
Vue.js バージョン3.2.29

### 【コード】
・トンパ、キルア、クロロのキャベツ表示秒数の設定値は、特にこだわりはありません。
・トンパ、キルアまではキャベツが移動していることが目視できますが、クロロは目視できないと思います。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="gOjXYGm" data-user="nobu12n" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/nobu12n/pen/gOjXYGm">
  syutou</a> by nobu (<a href="https://codepen.io/nobu12n">@nobu12n</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### 【参考書】
[これからはじめるVue.js 3実践入門](https://www.amazon.co.jp/%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BVue-js-3%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4815613362/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=38KV5I6N1LOKK&keywords=vue&qid=1673930995&sprefix=vue%2Caps%2C184&sr=8-6)

### 【参考サイト】
[CSS animation を再実行させたい時は requestAnimationFrame してやる](https://zenn.dev/junki555/articles/24da1f474a7dfab48865)
[CSS アニメーションのヒントとコツ](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Animations/Tips)
SortableJSでリストをドラッグ順番入れ替え

# リストをドラッグで順番入れ替えする「SortableJS」を実装
たくさんある記事の順番入れ替え、商品リストの順番入れ替えなどがドラッグでできると直感的ですよね。
今回は、リストの順番入れ替えがドラッグで視覚的にできちゃう「SortableJS」の動作サンプルをご紹介します。

## 動作の様子
![SortableJS.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3017065/5db12a95-8394-fcba-f9c9-2a93f65a03e2.gif)

## 実際に触ってみよう
<p class="codepen" data-height="350" data-default-tab="html,result" data-slug-hash="qByRXKm" data-preview="true" data-user="may9" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/may9/pen/qByRXKm">
  SortableJSでリストをドラッグで順番入れ替え</a> by may9 (<a href="https://codepen.io/may9">@may9</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

※上記のCodePenでうまくドラッグで動かんぞ！？と思ったら、CodePenの実際のページに見に行ってみると動いているのではないかと思います（上記の埋め込みの右上「EDIT ON CodePen」のところをクリックすると実際の動作サンプルページに行けます）

## 公式

https://github.com/SortableJS/Sortable

こちらにも導入方法やオプションなども書いてありますね。（と、英語がチンプンカンプンな筆者がさらっと言う笑）

## 使い方について
### jQueryとSortableJSを読み込みます。
```html:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js" charset="UTF-8"></script>
<script src="https://sortablejs.github.io/Sortable/Sortable.js" charset="UTF-8"></script>
```
※読み込みはhead内でも&lt;/body&gt;直前あたりでもOK！

### リスト部分のHTML
```html:input.html
<ul id="list_sortable" class="list_sortable">
  <li>ハンバーガー</li>
  <li>テリヤキバーガー</li>
  <li>チーズバーガー</li>
  <li>チキンバーガー</li>
  <li>ポークバーガー</li>
</ul>
```
※ハンバーガーアイコンはコード上は消してます（どうでもいい）

### CSS
```css:style.css
/* common */
*, *:before, *:after {
  -webkit-box-sizing: border-box;
  box-sizing: border-box
}

/* main parts css */
.list_sortable{
  width:100%;
  max-width:500px;
}
.list_sortable li{
  padding:10px;
  background:#F9F7F7;
  list-style:none;
  margin-bottom:3px;
  cursor:move;
}
.list_sortable li:hover{
  background:#112D4E;
  color:#fff;
}
```
「/* common */」の部分はcss界隈でよくあるreset.cssとかに既に書いてあるかもしれないので、不要な場合は適宜削除してください。

### js
```javascript:general.js
$(function(){
  new Sortable(list_sortable, {
    animation: 150
  });
});
```
id="list_sortable"とjs内のlist_sortableを同じ名前にします。
上記だと
```javascript:
    animation: 150
```
の部分がアニメーション（ドラッグした時のコロコロっとリストが動く感じの部分）のスピードを決めています。

:::note warn
Caution
cssでliに対して「transition: all 0.5s 0s ease;」などのtransitionプロパティを指定すると、js側のanimationが効かなくなりました（コロコロっとしたリストの動きが無くなっちゃいました。。）↓こんな残念な感じ😂
:::

![sort2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3017065/fae09a6f-74a5-5131-9c60-14fd6eb7f8ae.gif)


リストをドラッグで移動させたときのなめらかな感じがないですよね…。
ということで、cssでのアニメーション関連のプロパティとのバッティングに注意しましょう！


## まとめ

ドラッグでリストの順番入れ替え、いかがだったでしょうか？
このライブラリを使って、DBの商品一覧の順番を入れ替えてみたり記事の順番を入れ替えてみたり、そんなことができると便利ですよね！（今はまだDBへの反映はできておりません；_；頑張れ自分…！）

この「SortableJS」は、二つのリストを並べて、一方のリストからもう一方のリストへ要素を移動させたり、と言うようなことも可能です。それについてはまた別の機会に動作サンプルをまとめようと思います。

このパーツは下記の記事「cakePHP4でカートを作ってみる」の制作工程の1つになります。

https://qiita.com/may9create/items/28aeef20dd59bcdaa6b5
Windowsのプロダクトキー確認方法

## 背景
端末の導入を行う際にライセンス(プロダクトキー)を変更し、変更したライセンス(プロダクトキー)を確認しようとしたところ確認方法によって出力が異なることがあった。
今回はその取得先についてまとめる。

## プロダクトキー取得方法
### ファームウェアのプロダクトキーを取得する

以下コマンドを実行するとファームウェアのプロダクトキーを取得する。
ファームウェアのプロダクトキーは、プロダクトキーを変更しても変わらないため取得結果は購入時から変わらない。

```cmd

wmic path SoftwareLicensingService get OA3xOriginalProductKey

```

```powershell

powershell "(Get-WmiObject -query 'select * from SoftwareLicensingService').OA3xOriginalProductKey"

```

### OSのプロダクトキーを取得する

以下コマンドを実行すると、ライセンス情報を取得可能。
出力結果にはプロダクトキー下5桁が表示される。
OSのプロダクトキーは、ライセンスを変更した際に変更される。

```cmd

slmgr -dlv

```

フルのプロダクトキーを確認したい場合は、コントロールパネルから確認可能。


## 参考資料

* [ボリューム ライセンス認証情報を取得するための Slmgr.vbs オプション](https://learn.microsoft.com/ja-jp/windows-server/get-started/activation-slmgr-vbs-options)
* [How to Find Your Original Windows 10 Product Key](https://1dcs.net/how-to-find-your-original-windows-10-product-key/)
【React】useReducerの使い方 💡

# useReducerとは

`useReducer`は、`useState`と同じく値を管理できるフックです。
構文は以下の通りです。
```js
const [state, dispatch] = useReducer(stateを更新する関数, stateの初期値);

// state初期値0で更新関数を実行するとstateの値から+1する例
const [state, dispatch] = useReducer(prev => ++prev, 0);
```

## usetStateとの違い

`useState`では更新用関数は、使用時に新しい値をどのように変更するか記述するのに対して、`useReducer`では定義時に第一引数に新しい値をどうするか記述します。

```jsx
// 例 useState
const [state, setState] = useState(0);
<button onClick={() => { setState((prev) => ++prev); }}>
+
</button>

// 例 useReducer
const [state, dispatch] = useReducer(prev => ++prev, 0);
<button onClick={() => { dispatch(); }}>
+
</button>
```

:::note
useState → 利用側が状態の更新の仕方を決定する
useReducer → 状態側で更新の仕方を決定する
:::

上記のような違いから、`useReducer`は、大きなアプリケーションを作成する場合や、多数で開発する場合に使用するメリットが多くなってきます。
個人開発では`useState`だけでも問題ありませんが、他の開発者と協働した場合、`useState`では利用者側が更新の仕方を決定するため意図しない使われ方をする場合があります。

## useReducerを使ったシンプルなコード例

`useReducer`を使って、ボタンクリックに応じてカウントが増減するコード例です。

```jsx
import { useReducer } from "react";
const Example = () => {
 const reducer = (prev, { type }) => {
    switch (type) {
      case "+":
        return ++prev;
      case "-":
        return --prev;
      default:
        throw new Error("不明なactionです");
    }
  };
  const [rstate, dispatch] = useReducer(reducer, 0);

  const rcountUp = () => {
    dispatch({ type: "+" });
  };

  const rcountDown = () => {
    dispatch({ type: "-" });
  };
  return (
    <>
      <h3>{rstate}</h3>
      <button onClick={rcountUp}>+</button>
      <button onClick={rcountDown}>-</button>
    </>
  );
};

export default Example;
```
![スクリーンショット 2023-01-15 14.44.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2609332/0430d052-86b6-1513-d215-fc9f2df1b5b3.png)

`useReducer()`定義時に第一引数に渡している更新用関数`reducer`に注目してください。
```js
(prev, { type }) => {
    switch (type) {
      case "+":
        return ++prev;
      case "-":
        return --prev;
      default:
        throw new Error("不明なactionです");
    }
  }
```
更新用関数では第一引数に前回の値の`state値`が渡されます。今回で言ったら`prev`に`state`の値が渡ってきます。
そして第二引数では、更新用関数実行時、つまり`dispatch()`実行時の引数が渡ってきます。
今回の例では、`{ type }`と、分割代入でtypeプロパティの値を渡しています。
ボタン押下時に`dispatch({ type: "+" });`と実行しているので、引数にはオブジェクトが渡ってきて、`type`プロパティの値に応じて、`switch`させているという流れです。
AWS RDS オプショングループが削除できない

# 概要

- AWSのRDSのオプショングループが削除できない場合の確認内容を簡単にまとめてみる。

# 内容

## オプショングループに紐づくDBインスタンスが無いか確認

- オプショングループは関連づけられたDBインスタンスが存在していると削除できない。
- 関連するDBインスタンスが無いか確認する。

## オプショングループに紐づく手動スナップショットが無いか確認

- オプショングループは関連づけられたスナップショットが存在しているとこれまた削除する事ができない。
- 関連するスナップショットが存在しないことを確認する。

## オプショングループに紐づく自動スナップショットが無いか確認

- 筆者の場合の原因はこれだった。
- RDSは設定によって自動でスナップショットを取得している。自動で取得されているスナップショットがオプショングループと紐付いている可能性がある。

# オプショングループと関連付けられたDBインスタンス・スナップショットがあるか確認する方法

1. RDSのページに遷移
1. 左サイドバーで「オプショングループ」をクリック
1. 削除予定のオプショングループ名をクリック
1. 「関連付けられた DB インスタンスとスナップショット」に記載されているものが関連付けられたDBインスタンスまたはスナップショット

# あとがき

- 自動スナップショットは人為的に削除できないらしい。左サイドバーの「自動バックアップ」から当該のDBに紐づく保持のバックアップを選んで削除した。筆者の場合既にDBインスタンスを削除しているのでこれ以上自動バックアップでスナップショットが作られることは無いはず。
- 後は経過した日に応じてスナップショットが削除されていくのを待つ感じになるんだろうか？？

![RDS_Management_Console_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/379e44dd-c02f-b873-9157-f2c38aca7212.png)
TypeScript: TypeDoc で Class コメントが出てこないと思ったら、無関係な tag を設定していたからだった

# 背景
TypeScript で TypeDoc を利用しようと試行してたところ全然コメントが出ない！という問題にであった

が・・知ってれば阿保らしいミスだと思います。ということで記録まで

# 原因
以下のように、class に対して、module タグをつけてたのが原因


```typescript: ダメな例
/**
 * くらす
 * 
 * @class SampleClass
 * @class SampleClass2
 * @module SampleModule
 */
export class SampleClass {
    public Name = "Sample";

    private Nickname = "Simple";
}
```

# 二重定義したら、二重に出るだけ
最初はこれかと思ったら・・二重定義しても問題なかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/eb2ffed7-5abd-a085-c881-de2dafdd2336.png)

# あとがき
付けていい場所、悪い場所、の分類はまだ出来てないけど・・
その前に、TypeDoc vs TSDoc という悩みの種が出てきたのが頭痛の種・・
Salesforceの項目一覧を一括出力する

# 実現したいこと
Salesforceのオブジェクト（今回は`取引先担当者`）に登録されている項目を整理したい
弊社環境では何のまちがいだかで661項目もあるので、
項目の名前、API名などを一覧で自動取得できないかなと思った
# 解決方法
1. 開発者コンソールを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/50dc0476-d50b-9956-c6c3-302010bfefff.png)

2. Open Excecute Anonimous Windowを選択
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/29385887-13d9-c2e2-adc4-2fdce5de365f.png)

3. 以下を貼り付け
```
ContentVersion cv = new ContentVersion();
cv.ContentLocation = 'S'; // ファイルをSalesforce上に保存する
cv.PathOnClient = 'MyObject.csv'; // ファイル名
cv.Title = 'MyObject'; // ファイルタイトル
String myContent = '項目名,API参照名,データ型,バイト数,文字数' + '\n'; //出力ファイルの項目を作成

//List<String> reqFields = new List<String>();
Map <String,Schema.SObjectType> gd = Schema.getGlobalDescribe();
Schema.SObjectType sobjType = gd.get('********');
Schema.DescribeSObjectResult r = sobjType.getDescribe();
Map<String, Schema.SObjectField> mapOfField = r.fields.getMap();

for(String fieldName : mapOfField.keySet()) {
    Schema.SObjectField field = mapOfField.get(fieldName);
    Schema.DescribeFieldResult fDescribe = field.getDescribe();
    System.debug('field-->' + field);
    System.debug('field describe-->' + fDescribe);
    myContent += fDescribe.getLabel() + ',' + field + ',' +  fDescribe.getType() + ',' + fDescribe.getByteLength() + ',' + fDescribe.getLength() + '\n';
}

cv.VersionData = Blob.valueOf(myContent); // ファイルデータ
insert cv;

```

Schema.SObjectType sobjType = gd.get('********');
の部分は取得したいオブジェクトによって変える。今回は
Schema.SObjectType sobjType = gd.get('Contact');
※カスタムオブジェクトの際は`__c`も忘れずに

4. 最後にExcuteを押下
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/6d64733f-4351-f889-1909-49609ce84a25.png)

5. ファイルを検索して、しっかり出力できていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/7d3ee281-cd63-4628-63c3-118ccfd1d1f8.png)


参考にしたサイト
https://zenn.dev/okapi/articles/a77633cef12390
VSCode: JSON を開いてもエラーが出ないようにする。JSON with comments

# 背景
node や TypeScript を触るようになると、設定ファイル関連で JSON ファイルをよく開くようになる

設定ファイルでもコメントが残したい。

で、残すとなると、JSON ファイルでのエラーはやっぱりうざいなぁ・・と思った

こういうやつね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/19449509-32f3-a6d5-da05-2b9db3f5a1e1.png)


既に VS Code で対応されてたので、設定いじるだけだった

# 結論
設定変更を以下のようにすることで
json を開く際に、JSON with comments とさせられる。

```json: 
"files.associations": { "*.json": "jsonc" }
```

CTRL + SHIFT + P 、で、settings.json を開いて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/6e3d3287-edf7-bacf-1e5d-438515dad935.png)

適当に追加して保存すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e0f8f378-5fe6-35a4-bd6d-6b3dab6b2911.png)


無事消えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/305b3d17-514d-6017-bb62-73fe6bf1ba78.png)


以下に記載有り

https://code.visualstudio.com/docs/languages/json#_json-with-comments


# 設定 json について
設定を全部覚えられるか？　自分には無理。

故に、最近は初期化で全設定がコメントで定義されるようになってきてる印象

例えば、
- <code>tsc --init</code>
- <code>api-extractor init</code>

って・・あれ？ Microsoft が推進してる？


# あとがき
jsdoc で文書生成しようとしたら、typedoc の方が良さそうに思えて調べたら・・
tsdoc になって・・api-extractor・・・

技術に疎いと、どの技術を使えばいいのかを悩んで試行してる時間が無駄に感じますね・・ :cry:
[Rust] 参照の比較

## 概要
- 同値性
     - 値を比較したい場合は比較演算子を用いる
- 同一性
    - アドレスの比較を実施したい場合はstd::ptr::eqを用いる

```rust:main.rs
use std::ptr::eq;
fn main() {
    let x = 10;
    let y = 10;

    let rx = &x;
    let ry = &y;

    let rrx = &rx;
    let rry = &ry;

    println!("同値性: rrx == rry -> {}", rrx == rry);
    println!("同一性: eq(rrx, rry) -> {}", eq(rrx, rry));
}

```

```sh
$ cargo run
同値性: rrx == rry -> true
同一性: eq(rrx, rry) -> false
```