OmniAICreator/Qiita-1.07M huggingface dataset:
JISOUのHARD DAYで得た気づき

# はじめに
今回はJISOUのイベントであるHARD DAYに参加して得た気づきをさくっと書いていこうと思います。
# そもそもHARD DAYとは
簡単に説明するとJISOUのコーチが普段行っているスケジュールをJISOUのみんなでこなしていくイベントです。基本的にはポモドーロを活用した学習を各自進めていくのですが、合間にお互いのコードをリファクタリングしあったり体を動かす時間などのアクティビティがあったりします。メンバー同士交流する時間も多かったです。
# HARD DAYで得た気づき
### 言語化のスキルは超重要
HARD DAYではいきなり「0秒思考」というものをやりました。これは与えられたお題に対する自分の考えを1分という短い時間でなるべくたくさん(目標としては10個)書き出すというものです。お題は以下のようなものが出されました。
```
- なぜプログラミングの勉強をしているのか
- 自分の得たい未来は何か
- そのためにこれから何をすべきか
- ...
```
皆さんは各お題に対して1分でどれくらい書き出せますか？自分は多くて5個、基本は2,3個しか書き出せませんでした。このように自分の考えを短い時間で紙に書き出すには言語化の力が必要です。最初は言語化のスキルって本当に必要なのかと思っていたのですが、よくよく考えてみるとエラーで詰まっている際に誰かに質問するときや面接で想定外の質問が飛んできた時など言語化スキルが必要な場面はたくさんあるなと思いました。HARD DAYでは0秒思考の他にもプライミング瞑想や他の方のコードリファクタリング、感想共有など強制的に言語化の訓練をする場面がたくさんあり言語化の難しさと大切さを実感できました。

https://studyhacker.net/zerobyo-tips

https://atelierkanon.jimdofree.com/%E3%82%AA%E3%82%B9%E3%82%B9%E3%83%A1%E3%83%AA%E3%83%B3%E3%82%AF/

### 単に技術を学ぶだけでは差別化できない
スケジュールの中でpivotのYoutube動画をみんなでみて感想を共有し合う時間がありました。その中で日本はモノを作る技術はあるが、それをユーザーに十分に提供できる人が少ないという内容があり技術を学ぶだけでなく、どこにニーズがあるのかやマーケティングなどの経営(金融や会計)に関する知識も学習し常にアップスキリングしていく重要性が語られていました。
ここはJISOUでの考え方にも似ていますが、やはり単に技術を学ぶだけでなくその技術を使ってどう世の中に価値を提供できるか重要だと感じました。
また動画の後半ではリスクを恐れずチャレンジすることの重要性について話されていて、失敗しても死ぬわけではないしどうせ100年経ったら死ぬなら成功するかわからなくてもチャレンジした方が良いというゲストの言葉に少し感動しました。

https://www.youtube.com/watch?v=zK_9IDqn134

### 自分が普段いかに勉強していないか
最初に説明したようにHARD DAYでは基本的にポモドーロ式に学習を進めていきます。ポモドーロとは「25分学習したら5分休む」を1ポモドーロとしこれを繰り返しながら作業していくことで、集中力を保つことができるようにする学習方式です。しかしこれがなかなか疲れる... 普段自分は休憩を取る際は30分くらい取ることが多いので、5分しか休憩がないポモドーロ式の学習は体力的になかなかしんどかったです。いかに普段自分が勉強していないかを自覚できました。とはいえこの方式のおかげで集中力を保ちながら作業できたので、普段1人で学習する時よりもかなりのスピードで学習を進められた気がします。

https://shingakunet.com/journal/fromsapuri/20230704000006/

# おわりに
JISOUのHARD DAYで得た気づきを簡単にまとめました。HARD DAYという名前ですが交流の時間も多く、楽しく成長を実感できるイベントでした。今回得た学びを普段の自分の生活にもどんどん取り入れていきたいです。ここまでみてくださりありがとうございました。

# 参考

https://studyhacker.net/zerobyo-tips

https://atelierkanon.jimdofree.com/%E3%82%AA%E3%82%B9%E3%82%B9%E3%83%A1%E3%83%AA%E3%83%B3%E3%82%AF/

https://www.youtube.com/watch?v=zK_9IDqn134

https://shingakunet.com/journal/fromsapuri/20230704000006/



# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします:point_down:

https://projisou.jp
【Docker】USER=rootの代わりにsudoを使う

## 背景 
`docker run`の実行時に管理者権限が必要だったので`USER=root`を使う代わりにsudoを使うことにしたのでその方法を記載します。

### なぜ管理者権限が必要だったか
scapyでSYNパケットを生成してポートスキャンするツールを作っていたのですが，SYNパケットの作成にsudoが必要なようです。

管理者アカウントでnmapを使うとsyn scanになるという記載が公式ドキュメントにありますが，nmapでも管理者アカウントでSYNパケットは作成できません。
>  So when running Nmap as root or Administrator, -sS is usually omitted. 

```shell
nmap -sS localhost
You requested a scan type which requires root privileges.
QUITTING!
```

---

## 実際のやりかた
該当部分だけ抜粋してますが全体を見たい方は[こちら](https://github.com/RyosukeDTomita/my_portscanner/blob/0.1.1/Dockerfile)

```
ARG USER_NAME="sigma"
RUN <<EOF
apt-get update -y
apt-get install -y --no-install-recommends sudo
echo 'Creating ${USER_NAME} group.'
addgroup ${USER_NAME}
echo 'Creating ${USER_NAME} user.'
adduser --ingroup ${USER_NAME} --gecos "my_portscanner user" --shell /bin/bash --no-create-home --disabled-password ${USER_NAME}
echo 'using sudo'
usermod -aG sudo ${USER_NAME}
echo "${USER_NAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
rm -rf /var/lib/lists
EOF

COPY --from=devcontainer --chown=${USER_NAME}:${USER_NAME} ["/app/dist/my_portscanner-${VERSION}-py3-none-any.whl", "/app/dist/my_portscanner-${VERSION}-py3-none-any.whl"]

# install app
RUN <<EOF
python3 -m pip install /app/dist/my_portscanner-${VERSION}-py3-none-any.whl
EOF

USER ${USER_NAME}

ENTRYPOINT ["sudo", "my_portscanner"]
```
### ポイント解説

1. sudoをインストール
2. 新しいユーザsigmaを作成する。この際，HOMEディレクトリは作成せず，ログインパスワードなしにしている。
3. sigmaユーザがsudoを使えるようにsudoグループに追加する。
4. sudo時のパスワードを求められるとめんどくさいのでpasswordなしでsudoできるように設定
5. `USER`で sigmaをコンテナ実行ユーザにする。
6. ENTRYPOINTをsudo付きにする。

---

## 最後に
もっといい方法がありましたらコメント欄等でご指摘いただけると幸いです。
Pandasの基本とデータ操作の入門

# Pandasの基本とデータ操作の入門

最近、Pandasに関するYouTube動画を見て勉強しました（[こちらの動画](https://youtu.be/ZQZ38rK28Gk?si=v8viOTVY3OebOntC)）。動画で学んだ内容を実際に試したコードは、Google Colabに保存してあります（[こちらのリンク](https://colab.research.google.com/drive/1fU5MiuPGkCcbCLwbw3ddibs23YuyK03H?usp=sharing)）。この記事では、Pandasの基本的な文法とともに、学んだ内容をシェアします。

## Pandasとは？

Pandasは、Pythonでデータ操作を行うためのライブラリで、データフレーム（表形式のデータ構造）を扱うことができる強力なツールです。大量のデータを簡単に読み込み、操作、分析、可視化することが可能です。

## Pandasの基本文法

### 1. ライブラリのインポート
まず、Pandasを使用するにはライブラリをインポートする必要があります。

```python
import pandas as pd
```

Pandasは通常、`pd`という短縮名でインポートします。

### 2. データの読み込み
CSVファイルなどのデータを読み込む際は、`read_csv`関数を使用します。

```python
df = pd.read_csv('ファイルパス.csv')
```

この`df`は「データフレーム」と呼ばれるもので、Pandasの中心的なデータ構造です。

### 3. データの表示
データの最初の数行を確認するには、`head()`を使用します。

```python
print(df.head())
```

逆に、最後の数行を確認するには、`tail()`を使います。

### 4. 基本的な統計情報の確認
データの概要を確認するには、`describe()`が便利です。

```python
print(df.describe())
```

これにより、数値データの平均値や標準偏差、最小値、最大値などが確認できます。

### 5. データの選択とフィルタリング
特定の列を選択する場合は、次のようにします。

```python
df['列名']
```

複数の列を選択する場合は、リスト形式で指定します。

```python
df[['列名1', '列名2']]
```

行をフィルタリングするには、条件を指定します。

```python
filtered_df = df[df['列名'] > 100]
```

### 6. データの集計とグループ化
Pandasを使ってデータをグループ化し、集計することもできます。

```python
grouped = df.groupby('列名').mean()
```

これで、指定した列でグループ化し、各グループの平均値が取得できます。

## 学んだポイントのまとめ

今回の学習で特に重要だったポイントは以下の通りです：

- データの読み込みから基本的な操作（フィルタリング、集計など）を効率よく行えるPandasの強力さ。
- 実際に手を動かし、Google Colabを使ってコードを試すことで、理解が深まる。
- YouTubeの動画解説は、初心者にとっても非常にわかりやすく、実践的な学びを得られる。

## まとめ

Pandasは、データ解析を行う上で欠かせないライブラリです。基本的な操作をしっかりと理解しておくことで、より複雑なデータ処理にもスムーズに対応できるようになります。今回の学びを通して、Pandasの使い方に対する理解がさらに深まりました。今後もさらに多くの操作を学んでいきたいと思います。
Scala の新規プロジェクトを雑に作成する

# 目標

エディターで補完を効かせながらScalaをコーディングできるようにする。


# 手順

プロジェクトを新規作成する。

```sh
sbt new scala/scala3.g8

# project名は、my-projectにした。
```

editorを開いて、コーディングする。

```sh
sbt compile
sbt run

# あるいは、sbtのshellに入る。
sbt
> compile
> run
> ~compile # --watch mode
> ~run     # --watch mode
```


## その他

もっと良い方法があればupdateする。
よく使うPythonの構文

## よく使うPythonの構文
* リスト型
* for ~ in ...
* if ~
* split

## リスト型
リスト型は基本的に以下のように定義する。
```python
str_list = ['aaa', 'bbb', 'ccc']
```
空のリストも定義できる。
```python
empty = []
```

## for ~ in ...
for文は以下のように書く。
```python
str_list = ['aaa', 'bbb', 'ccc']

for x in str_list:
    print(x)
```
実行結果
```
aaa
bbb
ccc
```


## if
if文、if else, else文は以下のように書く。
```python
x = 11

if x > 10:
    print("over 10")
elif x == 10:
    print("equal 10")
else:
    print("under 10")
```
実行結果
```
over 10
```

## split
文字列区切りにはsplitを使う。
```python
string = "aaa bbb ccc"
str_list = string.split()
print(str_list)
```
実行結果
```
['aaa', 'bbb', 'ccc']
```

何も指定しない場合はスペースやタブで区切られる。
指定する場合は以下のように書く。
```python
string = "aaa,bbb,ccc"
str_list = string.split(",")
print(str_list)
```

## 参考
https://utokyo-ipp.github.io/2/2-2.html

https://qiita.com/MoroeTachibana-oh/items/b3afbd952db3aee10ef7

https://www.kikagaku.co.jp/kikagaku-blog/python-if-else-elif/#i-2

https://qiita.com/Morio/items/38701038ad098dd5dc3d
【JavaScript】名刺バインダー管理 (paizaランク B 相当) やってみたのと解説

これのやつです。

https://qiita.com/official-events/9ab96aa95d62fe3cbdd7

# 問題
https://paiza.jp/works/mondai/b_rank_skillcheck_archive/name_card

# 解答コード

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ！！
var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [n, m] = lines[0].split(' ').map(item => Number(item));
  
  const set = n * 2;
  let front = 1;
  let back;
  let i = 0;
  while(front <= m){
      if(front % set === 1){
          i++;
          back = i * set;
      }else{
          back--;
      }
      front++;
  }
  console.log(back);
});
```

# 解説
問題見た時 N(1) で求められそうだな、と思いました。ただ、計算式を作るより、そのまま処理を書いてしまった方が自分の数学知識的に早そうだし、間違った時にデバッグしやすそうだなと思い、そのまんま処理を書きました。
単純に以下の順で数えてます。
```
<入力例3>
3 8
の場合

front...1 back ...6
front...2 back ...5
front...3 back ...4
front...4 back ...3
front...5 back ...2
front...6 back ...1
front...7 back ...12
front...8 back ...11
```

# 感想
Bランクは問題の内容さえ理解していれば、そのまま解けば大丈夫そうな印象でした。
ただ、実際のレベルアップの試験の方が難しいので実際はわかりません。
（自分はBランクで、Aランクアップへの挑戦に何度か負けています）
あまり解説していませんが、読んでいただきありがとうございます。
【基本情報・Chapter1-2】基数変換、数値表現

<font color="CornflowerBlue">**こんにちは！painappuruと申します！
文系未経験者として、基礎知識を身につけるために、基本情報技術者に関する知識をここでまとめたいと思います。
お気づきの点がございましたら、ご指摘いただけると幸甚です。ᐖ**</font>
#### ビット
*bit*
コンピュータの世界ではすべての情報が2進数で処理されているが、その1桁のことを1ビット（bit）という。
「bit」は情報量の**最小**単位であり、「1bit」は「1桁の二進数」の情報量です。 「0」「1」の2通りの値しか表現することができない。 「1Byte」は「8bit」なので、8桁の二進数の情報量である。

#### 補数・余数（よすう）
*complement*
補数というのは元の数を足したときに桁上がりする**最小**の数のことを指す。
例えば、10進数の7の補数は3、77の補数は23といった具合である。 
2進数の補数は，2進数の各桁を反転させ（0を1に，1を0にする），その結果に1を加えることによって求められる。これを「反転して1」と覚えます。
`0000 0110`の補数：`1111 1010`。
#### シフト演算（えんざん）
*shift operation*　移位运算
シフト演算とはビットを左右にずらして行う演算方法である。 
2進数では左に一つ移動すると**2倍**、右に一つ移動すると1/2倍になります。〇進数では左に一つ移動すると〇倍、右に一つ移動すると1/〇倍になる。
#### 固定小数点数
*Fixed-point*　定点数
コンピュータ世界における小数の扱い方のひとつで、小数点が特定の位置にある前提で扱うやり方
・小数点が**特定の位置**にある前提で、数字のみを覚えさせる
・数字を扱うときは、特定の位置に小数点を打つ
#### 浮動小数点数
*floating-point*　浮点数
コンピュータ世界における小数の扱い方のひとつで「12345×10^-2」における「12345」と「-2」のように、仮数部と指数部のみを記憶しておくやり方
・**仮数と指数のみ**を覚えさせる
・数字を扱うときは、計算によって実際の数字を思い出させる


★数字を「X × Y ^ Z（XかけるYのZ乗）」形式で表現するやり方
　Xに相当する部分は「仮数」。
　Yに相当する部分は「基数」。
　Zに相当する部分は「指数」。
#### IEEE754
*IEEE Standard for Floating-Point Arithmetic*
1985年にIEEE(Institute of Electrical and Electronics Engineers・米国電気電子技術者協会)によって定められた、浮動小数点算術に関する標準規格である。


## <font color="CornflowerBlue">誤差</font>

#### 桁あふれ誤差
演算結果の値が、コンピュータが表現できうる有効桁の範囲の**最大値や最小値**（上限や下限）を超えてしまうことにより生じる誤差を言います。
- **アンダーフロー**
*underflow*　下溢出
浮動小数点演算処理について、計算結果の指数部が**小**さくなり過ぎ、使用している記述方式では数値が表現できなくなることである。
- **オーバーフロー**
*overflow*　上溢出
計算結果が**膨大**になり過ぎて表示しきれなくなることがオーバーフローと呼ばれる。

表示できなくなるという点ではどちらも共通している。
#### 情報落ち
*loss of trailing digits*
絶対値の大きな数値と小さな数値同士で**加算や減算**を行った場合に、小さな数字の桁情報が**無視**されてしまい計算結果に反映されない誤差のこと。
#### 打切り誤差（うちきり）
*truncation error*
主に**除算**などにより無限に桁が続く場合などに起こる誤差のことで、あらかじめ決めておいた桁数までで計算を終了することにより発生する。 打切り誤差の例としては、**円周率**を用いた計算が挙げられる。
#### 桁落ち
*cancellation of significant digits*
浮動小数点数の計算において、絶対値が近い数値同士の**減算**をすると有効桁数が小さくなってしまうことである。
有効桁数が小さい場合、計算を繰り返すと誤差が蓄積され、時として大きな誤差となることがある。このように、計算途中の桁落ちの発生を考慮しないと大きな問題を引き起こす可能性がある。
#### 丸め誤差
*rounding error, round-off error*
丸め誤差とは、数値の計算処理の都合上、ある程度で値を**省略**することにより、計算結果に現れてくる誤差のことである。
丸め誤差の「丸め」とは、任意の桁数以上の精度の数値を端数として処理してしまうことであり、**四捨五入**や切り上げ、切り捨てなどを含んでいる。丸め処理は主に数値の桁数を揃えるために行われる。


<font color="CornflowerBlue">**ここまで読んでくれて
お疲れ様です！
ありがとうございました！(⁎ᵕᴗᵕ⁎)**</font>
[T-DASH] safari browserのテストを行う in Mac

# Outline

現在(2024/8/19)のT-DASHは chrome, Firefox, Edgeのブラウザをサポートしている。
しかし、mac Safari はサポートしていない。

![スクリーンショット 2024-08-19 15.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/961599e5-ac2f-f8e6-e902-626b72643c25.png)

今回、この課題を解決する方法を示す。

https://service.valtes.co.jp/t-dash/

# 技術的情報

robot frameworkの Open Browser のkeywordでブラウザを指定することができる。
※尚、今回proxy指定などoption設定などする場合、今回の説明には含まれていません。環境に合わせて、設定する必要があります。

```
Open Browser  ${URL}  browser=safari
```


https://robotframework.org/SeleniumLibrary/SeleniumLibrary.html#Open%20Browser



# 基本設定

## Safari の設定

Safariをテスト自動化で操作できるように設定をする。

Safari > 開発 > デベロッパ設定　から、オートメーションの「リモートオートメーションを許可」にチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/0118e7af-a0df-be0c-e4c0-3380a468fcee.png)

## SafariDriver の確認

標準でsafaridriverは実行環境にあると思いますが、念のため確認する
ターミナルで以下コマンドで確認できる

```
which safaridriver
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/0421619e-51e5-5d20-37d2-0374b596e92f.png)

# T-DASH

## カスタム動作

以下設定内容をBrowser.yamlのファイル名で保存する

```
ACT-CAT-CUSTOM-e2e94ebd-5462-4d60-be78-64dd8d54b020:
  action_category_name: Browser
  icon: ''
  color: '#a603c2'
  custom_data:
    file_name: Browser
    pip_list: []
    library_list:
    - SeleniumLibrary
  actions:
    ACT-CUSTOM-5476e825-19bb-4e2b-8c37-7a3786693d8e:
      action_name: Safariを開く
      action_type: operation
      action_format: URL「設定値1」をSafariで開く
      action_note: ''
      action_args:
      - value1
      action_def:
      - - Open Browser
        - ${value1}
        - browser=safari
      - - Maximize Browser Window

```

次に、作成された Browser.yamlをT-DASHの動作定義 -> カスタム動作 -> カスタム動作をインポート にてインポートし、実際にインポートされた設定内容を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/eed47efc-924b-b92b-080a-0e19744c6dba.png)

カスタム動作の処理は以下の通りです
1.Safariを開く
2.ブラウザを最大化する

## テストケース

一番最初の「ブラウザを開く」のキーワードとして、作成したカスタム動作「Safariを開く」を用いる。
設定値１は開くURLを指定する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/d49a5e6f-f04b-7db8-2a38-b48f4e53f5c8.png)
【プラクティス紹介】1分でさらっと分かる「DTA」

## プラクティス名（別名）
DTA　（Designed Team Alliance）

## プラクティスの目的・狙い
* 意図的に協働関係を築く（＝チームの関係性を自分たちでデザインする）
* チームとしてありたい姿を明確にする

## どんな時に使うか
* 新しくチームができたばかりで関係性が固まっていない時
* 既存のチームがギクシャクしている時

## 実施手順
1. チーム全員参加の会議を設定し、ファシリテータを決める
1. チームの方向性を問う質問を行い、回答をホワイトボードなどに書き出す
1. 意見が出揃ったら、その中からチームにとって重要なものを選び、話し合う
1. 最終的に3～5個ぐらいの文言に集約し、以降、定期的に確認する

| 質問の例 |
|:--|
| ・どんな雰囲気のチームにしたいですか？  |
| ・どんな文化を醸成していきたいですか？  |
| ・難しい問題に直面した時、互いにどのようにふるまうべきでしょうか？  |

| 回答の例 |
|:--|
| ・ちょっとしたことでも気軽に聞ける話しやすい雰囲気  |
| ・「最初は誰でも初心者」を旨とし、教え合い、高め合う  |
| ・知識不足/スキル不足を素直に認め、早めに有識者に助けを求める |

## アレンジ例
* チームとしての方向性がある程度見えてきたところで「そのためにあなたは何をすべきですか？」という追加質問を行い、個人の推奨行動に落とし込む

## アンチパターン
* リーダーや上司がリーダーシップを発揮しようとして一人で全て決めてしまう
* 作成しただけで終わってしまい、事後、見直さずに放置する

## 参考情報

以下の記事を参考にさせていただきました。（アジャイルコーチShimizu様とIto様のブログ）

https://note.com/koki_jp/n/na6747d1a220e


https://note.com/takahiroyte/n/nc5fbd4d42fe2

DTAはORSC®(Organization & Relationship Systems Coaching®)というシステムコーチング理論に登場する用語ですが、大元のアイデアがどこ由来かは不明。

https://crrglobal.com/course/fundamentals/

## こぼれ話（私的コメント）
DTAとよく似たものにWorking Agreementというものがありますが、本質的には別物とのこと。両者の違いは、前者がチームの関係性に焦点を当て、対話自体を目的としているのに対し、後者はスムーズに仕事をするための具体的なルール決めを行うことが目的です。チームの性格によっては細かいルールに縛られるのが好きではないケースもあるので、そういった場面ではDTAの方が自由度が高く、使いやすいかもしれません。
なおDTAとWAは排他的なものではないので、併用も可です。DTAから話を始めて、WAに繋げるという展開もアリだと思います。（両者の違いを説明するのがちょっと大変そうではありますが...(^^;)）

---
　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
AWS SESはバウンスレート10%以下 苦情レート0.1%以下に抑えないとアカウントが一時停止される可能性がある

## 概要

SESはSESを使ってイケてないメールをたくさん送ってしまうと一時的に利用停止されたり、ヒアリングが行われることがある。
この「イケてないメール」を送信しているかどうかは下記の情報のどちらかに抵触しているかで判断される

- バウンス（メールが届かない）率がAWSが定めるしきい値に達している場合
- 苦情（ユーザーが迷惑メールと判断してアクションを起こした）率がAWSが定めるしきい値に達している場合

ようは届かない相手にメールをたくさん送ってしまったり（バウンス）、スパムのような内容のメールを送ってしまう（苦情）と利用停止される可能性があるということ。

## 詳細

では、2024年8月現在のバウンスレート・苦情レートはいくつになると一時的に利用停止される可能性があるのだろうか。公式ドキュメントの内容を引用する。

| 項目 | レート（%） |
| --- | --- |
| バウンス | 10 |
| 苦情 | 0.1 |

内容を引用する

>アカウントのバウンス率が 10% を超えた場合、当社はお客様のアカウントによる E メール送信機能を一時的に停止することがあります。

>アカウントの苦情率が 0.1% を超えた場合、当社はお客様のアカウントによる E メール送信機能を一時的に停止することがあります。

参考ページは下記

https://docs.aws.amazon.com/ja_jp/pinpoint/latest/userguide/channels-email-deliverability-dashboard-bounce-complaint.html

## バウンスと苦情の通知を簡単に作ろう

バウンス・苦情のレートを確認するにはAWSのマネジメントコンソールにログインし、SESの画面をひらきそれぞれのレートを見れる。
ただ、この方法を毎日実施することは面倒なので通知する機能を作ることをおすすめする。
方法は複数あるが比較的簡単なものを上げておく。（条件としてSlackワークスペースを持っており、そのワークスペースが企業アカウントであること）

1. Slackで通知専用のチャンネルを作成
1. 通知専用チャンネルの詳細を開き「このチャンネルにメールを送信する」をクリック（Slack通知専用のメールアドレスが払い出されるのでコピー）
1. AWSのSNSでトピックとサブスクリプションの作成を行い、サブスクリプションのプロトコルは「Eメール」として「Slack通知専用のメールアドレス」を設定(SNSのトピックの名前をメモしておく）
1. 送信しているメールのFromのメールアドレスをAWSのSESの「ID」から探索しクリックして詳細に遷移
1. 「通知」のタブで「フィードバック通知」の編集をクリックし「バウンスフィードバック」もしくは「苦情のフィードバック」で先に作成したSNSトピックを選択して保存

この方法だと、バウンス・苦情レートそのものを知ることはできない。しかしながらバウンス・苦情が発生したことは知ることができる。「通知が来たらAWSのマネジメントコンソールからSESを確認する」習慣があればこれだけでも最悪の事態は防げそう。
[paiza]どんどん足していこうね～（足し算 (paizaランク D 相当)

# しまっちゃうおじさん
スナドリネコさんみたいなビジュアルなのに、
やってることは拉致・監禁という鬼畜なおじさん。
そりゃ、ぼのぼのも泣くわ...

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition

# チェック処理とかは端折ってる
/** ここから定型文 */
ここで記載したクラスについては、
[こっちの記事](https://qiita.com/AsilHatake/items/40204293bdf59cb9f9d8)に書いてある、標準入力をList化したりしてるMainクラスから呼び出す予定だし・なんか継承したりしてるYO!!

ちな、Mainを実行して標準入力から入力するのクソ面倒くさいので、
Java編については問題の入力例をパラメータにしたテストクラスとかも作って公開するYO!!

<details open><summary>開発・実行環境はこんな感じ</summary>

- VSCode
- Java 17
- jUnit 5.9
- maven

pom.xmlはこんな感じ

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.co.asil</groupId>
    <artifactId>paiza202408</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
```

</details>
/** ここまで定型文 */

## 実装クラス 
```java:Addition.java
package jp.co.asil.paiza202408;

import java.util.List;

public class Addition extends Question {

  public Addition(List<String> list) {
    super(list);
  }

  /**
   * ２つの正の整数 a, b が半角スペース区切りで入力されるので a と b を足した数を出力してください。
   */
  @Override
  public List<String> answer() {
    return List.of(String.valueOf(List.of(list.get(0).split(" ")).stream().mapToInt(Integer::parseInt).sum()));
  }
}
```

## テストクラス 
```java:AdditionTest.java
package jp.co.asil.paiza202408;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.List;

import org.junit.jupiter.api.Test;

public class AdditionTest {
  @Test
  void testAnswer1() {
    Addition testClass = new Addition(List.of("1 1"));
    assertEquals(testClass.answer().get(0), "2");
  }

  @Test
  void testAnswer2() {
    Addition testClass = new Addition(List.of("0 99"));
    assertEquals(testClass.answer().get(0), "99");
  }
}
```

# まとめ的なアレ
min/maxに然り、sumに然り、**java.util.stream.IntStream** って便利!!
【AWS-SAA勉強記】第3回_Amazon FSx編

この記事は作者本人がAWS-SAAの学習を通じて、曖昧や覚えづらい部分をサービス単位でまとめたものです。
特に、概要だけではイメージがわきづらいので、できるだけユースケースを活用して理解しやすいようにしています。
教材はSHOEISHAの[AWS教科書 AWS認定ソリューションアーキテクトアソシエイト テキスト＆問題集](https://www.amazon.co.jp/AWS%E6%95%99%E7%A7%91%E6%9B%B8-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%85%A4%E7%94%B0-%E5%BC%98%E6%B3%95/dp/4798183261/ref=sr_1_5?crid=3FF4OG65DFJ67&dib=eyJ2IjoiMSJ9.T249byXp1rsbDxkYXfxXb6fI4BUDNVOMSaquZL-1mVpPGu6oOTJAj19zZAYJR86Jon6ca0-q7sg_Ial5s1cea15f4gmNEJG8LyNQfNCbzfRWbdc3QShULjB2kryq34xDUkL-inBJMmFaiNYCb3lq0OcIRowzNObcgxFyIO96gEzEfcAYd2dxcSG6AHyl5e2DAQpdDy0xOEQZb_sRAX47vahzwyOMS8huPEScwArE3A0.zBHSxW-BjHBATnQ5vd4s6NikPxikuDNRnvEEGpF7d6A&dib_tag=se&keywords=aws+%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88+%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88&qid=1724027719&s=books&sprefix=AWS%2Cstripbooks%2C195&sr=1-5)を参考にしています。

## Amazon FSxに関する曖昧な部分
Amazon FSxはフルマネージドのファイルシステムで、Windowsファイルサーバや高性能なLustreファイルシステムを提供します。
Amazon FSxの中で、曖昧になりがちな部分は以下の通りです。（あくまでも私個人が曖昧であると感じた部分です）
* Amazon FSxの概要
* Amazon EFS（Elastic File System）とは何が違うの？

本記事では、これらの内容やユースケースについて解説していきます。

## Amazon FSxの概要
S3やインスタンスストア、EBS、EFSなどはそれぞれの違いが分かりやすいのですが、FSxを初めて勉強したときは「？」といった感じでした。。

Amazon FSxは以下の4種類のサービスがあります。
* Amazon FSx for Windows File Server
* Amazon FSx for Lustre
* Amazon FSx for NetApp ONTAP
* Amazon FSx for OpenZFS

AWS-SAAでは、これら4種類の違いを細かく理解する必要はなく、Amazon FSxの概要が分かっていればOKかと思います。
そこで、本記事では、「Amazon FSx for Windows File Server」を取り上げて整理していきます。

### Amazon FSx for Windows File Server
Amazon FSx for Windows File Serverは、Microsoft Windowsファイルシステムをベースにしたサービスで、**Windowsアプリケーションに高可用性で高性能のストレージを提供**します。
これにより、オンプレミスのWindowsファイルサーバーをクラウドに移行することが容易になります。

要するに、**特定の用途に特化したファイルシステムを提供**します。
今回の場合はWindows File Serverに特化。その他3つのサービスもそれぞれLustre、NetApp ONTAP、OpenZFSに特化したファイルシステムということです。


## Amazon EFS（Elastic File System）とは何が違うの？
Amazon FSxとAmazon EFSはどちらもAWSが提供するファイルストレージサービスです。
用途や特徴が異なります。
|    | Amazon EFS | Amazon FSx |
| ---- | ---- | ---- |
| サポートするファイルシステム | NFS（Network File System）を使用し、**LinuxやUnix系のシステムでの利用**に適しています。 |Windows File Server、Lustre、NetApp ONTAP、OpenZFSなど、特定の用途に特化したファイルシステムを提供します。 |
| パフォーマンス | スループットとレイテンシーのバランスが良く、**複数のEC2インスタンスから同時にアクセス可能**。 | 高いI/O性能を持ち、特にI/O集約型のワークロードに適しています。 |
| ユースケース |  コンテンツ管理システム（CMS）、データ共有、ホームディレクトリ、ビッグデータ分析など。 | 高性能計算（HPC）、機械学習、Windowsベースのアプリケーション、エンタープライズファイルシステムなど。 |

つまり、
FSxは特定の用途に特化した高性能なファイルシステムを提供し、特に**Windows環境や高性能計算**に適しています。
EFSはNFSを使用し、**LinuxやUnix系のシステムでのファイル共有やデータ管理**に適しています。

## まとめ
本記事では、以下のサービスについて概要とユースケース等をまとめました。
* Amazon FSxの概要
* Amazon EFS（Elastic File System）とは何が違うの？

次回は[【AWS-SAA勉強記】第4回_Amazon VPC編](https://qiita.com/sknp/items/c33aa25d9d9e11c07b13)です。
VRChatでJoin通知ソフトなどが動かない(ログファイルが生成･更新されない)場合の設定確認項目

# 概要
VRChatの外部ソフトとして、VRChatのログファイルを監視することで、Join通知を行ったり、写真へワールド情報を追記したり、ゲームワールドのセーブコードの保存などを行う、便利なソフトが色々あります。

しかし、気づかない間にVRChatからログファイルが生成されない設定になっていて、これらのソフト類が一切動かないユーザーを見かけることが稀にあります。

この記事では上記の解決方法としてVRChatからログファイルが生成されるようにする設定を残します。


# 設定項目
VRChatのMenuからSettings → Debug → Loggingのチェックを入れる。
これで C:\Users\ユーザー\AppData\LocalLow\VRChat\VRChat\内の、
output_log*.txtファイルが生成もしくは更新されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864812/175d1b1a-8768-db4d-5403-823eedb909aa.png)
matplotlibについてのメモ

# 複数の画像形式で保存する

画像形式をリストにして、for文で回します。MS WordにはSVGで、LaTeXにはPDFで貼りましょう。

```py
# 保存するファイル形式のリスト
formats = ['eps', 'svg', 'pdf', 'png']

# 各ファイル形式で保存
[plt.savefig(f'sine_wave.{fmt}') for fmt in formats]
```

例：

```py
import numpy as np
import matplotlib.pyplot as plt

# データの作成
x = np.linspace(0, 2 * np.pi, 1000)  # 0から2πまでの範囲で1000点
y = np.sin(x)

# Sine波のプロット
plt.plot(x, y, label='sin(x)', color='black', linewidth=2)

# 軸ラベル、タイトル、凡例、グリッドの設定
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave')
plt.legend()
plt.grid(True, linestyle='--')

# レイアウトを調整
plt.tight_layout()

# 保存するファイル形式のリスト
formats = ['eps', 'svg', 'pdf', 'png']

# 各ファイル形式で保存
[plt.savefig(f'sine_wave.{fmt}') for fmt in formats]

# 描画をクリア
plt.clf()
```

# SVG でテキストをベクター画像に変換しない

以下のようにパラメータを設定することで変換できます。

```py
plt.rcParams['svg.fonttype'] = 'none'
```

具体例：

```py
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['svg.fonttype'] = 'none'  # テキスト情報を保持する設定

# データの作成
x = np.linspace(0, 2 * np.pi, 1000)  # 0から2πまでの範囲で1000点
y = np.sin(x)

# Sine波のプロット
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)

# 軸ラベルとタイトル、グリッドの設定
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.title('Sine Wave.')
plt.legend()
plt.grid(True)

# SVG形式で保存
plt.savefig('sine_wave.svg')
```

## 比較

ベクター画像：

![](https://raw.githubusercontent.com/KaoruHOSOKAWA/img_test/3de909365dcb6bdc550a9f184f787c73314e7555/sine_wave_vector_text_as_path.svg)

テキスト：

![](https://raw.githubusercontent.com/KaoruHOSOKAWA/img_test/main/sine_wave_vector_text_as_text.svg)

# カスタムのx軸ラベル

```py
# カスタムのx軸ラベルを設定
plt.xticks(x)
```

例：

```py
import matplotlib.pyplot as plt

x = [1, 2, 4]
y = [1.2, 1.4, 1.3]

# プロット
plt.plot(x, y, '.-',  label='foo')

# カスタムのx軸ラベルを設定
plt.xticks(x)

# 軸ラベルとタイトル、グリッドの設定
plt.xlabel('x')
plt.ylabel('y')
plt.title('foo graph')
plt.legend()
plt.grid(True)

plt.show()
```

![foo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986389/00aa0c1c-76c8-62c6-7eb9-d8fbc7ec4ed8.png)
VUE + Element-UI : フォームインスタンスの初期値設定に関する問題

```html
<template>
  <el-form ref="registerForm" size="large" autocomplete="off" v-if="isRegister" :rules="registerDataRules" :model="registerData">
  <!-- フォームの内容 -->
  </el-form>
</template>

<script setup>
import { ref } from 'vue';

const registerForm = ref(null); //ここで初期値を NULL に設定する理由は何ですか？ 

const register = () => {
  // registerForm インスタンスのメソッドにアクセス
  if (registerForm.value) {
    registerForm.value.resetFields();
  }
};
</script>
```

### コードの説明

- **`const registerForm = ref(null)`**：
  - これは `setup` 関数内で、初期値が `null` のリアクティブな参照 `registerForm` を作成するものです。`ref` は Vue 3 が提供するリアクティブ API で、リアクティブなデータ参照を作成します。
  - `null` は、`el-form` インスタンスがまだ作成されていない、またはマウントされていない状態を示します。
- **テンプレート内で `ref` を `el-form` にバインドする**：
  - テンプレート内で、`ref="registerForm"` を使って `registerForm` を実際の `el-form` インスタンスにバインドします。
  - Vue がテンプレートをレンダリングするとき、`el-form` インスタンスが `registerForm.value` に割り当てられます。
- **`registerForm.value` の使用**：
  - `setup` 内で、`registerForm.value` を使って `el-form` インスタンスのメソッドやプロパティにアクセスできます。例えば、`resetFields()` メソッドなどです。
  - 初期値が `null` であるため、実際に使用する前に `registerForm.value` が存在するかどうかを確認する必要があります。

`registerForm` が `el-form` インスタンスへの参照として使われています。最初は `null` ですが、Vue が `el-form` をレンダリングしマウントすると、`registerForm.value` は実際の `el-form` インスタンスを指すようになります。これにより、`resetFields()` やその他の `el-form` インスタンスのメソッドを安全に呼び出すことができます。


### Q: じゃ、なぜ他の値を設定しないのか、あるいは直接 `el-form` に設定しないのか？

`ref` の初期値を `null` に設定する理由は以下の通りです：

### 1. **早期アクセスの回避**

コンポーネントの初期レンダリング段階では、`el-form` のインスタンスはまだ作成されていません。そのため、初期値として `el-form` のインスタンスを直接設定することはできません。初期値を `null` にすることで、コンポーネントがマウントされる前に存在しないインスタンスにアクセスすることを防ぎます。

### 2. **遅延取得**

Vue の `ref` の値は、Vue がコンポーネントをレンダリングしマウントした後に設定されます。したがって、コンポーネントのライフサイクルの初期段階（例えば、`setup` 関数の初期段階）では、`ref` の値を `null` にしておくのが適切です。その後、`el-form` のインスタンスが実際にマウントされたときに値が更新されます。

### 3. **リアクティブな管理**

Vue の `ref` メカニズムを使用することで、テンプレートと JavaScript コードの両方でコンポーネントのインスタンスを動的に管理できます。`ref` の初期値が `null` の場合、Vue はコンポーネントが完全にマウントされた後に実際のインスタンスに更新します。このメカニズムにより、動的で非同期的な状態を処理する際に、`ref` に対する操作が正しく行われることが保証されます。

### 4. **正確なアクセスの保証**

初期値として `el-form` のインスタンスを直接設定することは現実的ではありません。なぜなら、`el-form` のインスタンスは初期レンダリング時には存在しないからです。初期値を `null` にすることで、コンポーネントが完全にマウントされた後に実際の操作を行うことができます。この方法により、コンポーネントインスタンスにアクセスする際に `undefined` エラーを避け、コンポーネントが完全にレンダリングされていることが保証されます。
[paiza]ちっちゃいことは気にするな（一番小さい値 (paizaランク D 相当)

# きょ～れつ～（ワカチコワカチコ
小さい数を探す（ここらへんの文考えるのめんどくなってきた

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/min_num

# チェック処理とかは端折ってる
/** ここから定型文 */
ここで記載したクラスについては、
[こっちの記事](https://qiita.com/AsilHatake/items/40204293bdf59cb9f9d8)に書いてある、標準入力をList化したりしてるMainクラスから呼び出す予定だし・なんか継承したりしてるYO!!

ちな、Mainを実行して標準入力から入力するのクソ面倒くさいので、
Java編については問題の入力例をパラメータにしたテストクラスとかも作って公開するYO!!

<details open><summary>開発・実行環境はこんな感じ</summary>

- VSCode
- Java 17
- jUnit 5.9
- maven

pom.xmlはこんな感じ

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.co.asil</groupId>
    <artifactId>paiza202408</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
```

</details>
/** ここまで定型文 */

## 実装クラス 
```java:MinNum.java
package jp.co.asil.paiza202408;

import java.util.List;

public class MinNum extends Question {

  public MinNum(List<String> list) {
    super(list);
  }

  /**
   * 5 つの正の整数が入力されるので、最も小さい数字を出力して下さい。
   */
  @Override
  public List<String> answer() {
    return List.of(String.valueOf(list.stream().mapToInt(Integer::parseInt).min().getAsInt()));
  }
}
```

## テストクラス 
```java:MinNumTest.java
package jp.co.asil.paiza202408;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.List;

import org.junit.jupiter.api.Test;

public class MinNumTest {
  @Test
  void testAnswer1() {
    MinNum MinNum = new MinNum(List.of("10",
        "12",
        "4",
        "8",
        "46"));
    assertEquals(MinNum.answer().get(0), "4");
  }

  @Test
  void testAnswer2() {
    MinNum MinNum = new MinNum(List.of("1",
        "2",
        "3",
        "2",
        "1"));
    assertEquals(MinNum.answer().get(0), "1");
  }
}
```

# まとめるほどでもないやつ
何をするかを順序よく書けばいいだけなので、ラムダを使えば簡単に書けるね（ﾆｯｺﾘ
文字列を数値変換　→　最小値取得　→　Int型で取得
米国経済政策の不確実性データを取得する

米国経済の不確実性に関する独自の研究を行っている素晴らしいサイトを見つけたので記事にしてみました。

この記事では下記のサイトからデータを取得するpythonコードを記載します。
http://www.policyuncertainty.com/index.html

サイトでは米国経済の不確実性を下記のような観点で指数化し分析しています。



### a. ニュース報道による政策関連経済不確実性の指数
10の大手新聞（USA Today、マイアミ・ヘラルド、シカゴ・トリビューン、ワシントン・ポスト、ロサンゼルス・タイムズ、ボストン・グローブ、サンフランシスコ・クロニクル、ダラス・モーニング・ニュース、ヒューストン・クロニクル、ウォール・ストリート・ジャーナル）の記事を基にして作成されます。
毎月、各新聞に対して「不確実性」や「不確定」、「経済」、「議会」、「立法」、「ホワイトハウス」、「規制」、「連邦準備制度」、「赤字」といった用語を含む記事を検索します。
記事の総数に対して政策関連の不確実性記事の比率を計算し、それを1985年1月から2009年12月までの期間で標準偏差1に正規化します。

### b. 税制改正の不確実性データ
この要素は、議会予算局（CBO）の報告書に基づいており、連邦税法の一時的な規定をリスト化しています。
一時的な税制措置は、企業や家庭に不確実性をもたらすため、これらの延長が遅れると税制の安定性が損なわれます。
### c. 経済予測者の意見の不一致
フィラデルフィア連邦準備銀行の「プロフェッショナルフォーキャスターズ調査」に基づいています。
政府政策に直接影響を受ける変数（消費者物価指数（CPI）、州および地方政府の財とサービスの購入、連邦政府の財とサービスの購入）の予測に対する意見の分散を測定します。

### データを取得
例えば下記のようにcsvで各指数がまとめられているのでこれを取得します。
```
http://www.policyuncertainty.com/media/All_Daily_Policy_Data.csv
```

まずはCSVファイルのデータを読み込み、どのような配列になっているか確認するためのコードを以下に示します。これにより、CSVの内容を把握し、その後グラフ化する際の準備ができます。
```python
import pandas as pd

# CSVファイルのURL
url = "http://www.policyuncertainty.com/media/All_Daily_Policy_Data.csv"

# データの読み込み
data = pd.read_csv(url)

# データの最初の数行を表示して配列を確認
print(data.head())

# データの概要を確認
print(data.info())
```

コードを実行するとこのデータには、以下の列が含まれていることがわかります。
```
   day  month  year  daily_policy_index
     1      1  1985              103.83
```

### matplotlibでグラフ
データが取得できたので最後にグラフを作成します。
```python
import pandas as pd
import matplotlib.pyplot as plt

# CSVファイルのURL
url = "http://www.policyuncertainty.com/media/All_Daily_Policy_Data.csv"

# データの読み込み
data = pd.read_csv(url)

# 日付を一つの列にまとめる
data['date'] = pd.to_datetime(data[['year', 'month', 'day']])

# グラフの作成
plt.figure(figsize=(12, 6))
plt.plot(data['date'], data['daily_policy_index'], label='Daily Policy Uncertainty Index')
plt.xlabel('Date')
plt.ylabel('Daily Policy Index')
plt.title('US Daily Policy Uncertainty Index Over Time')
plt.legend()
plt.grid(True)
plt.show()
```
エクセルデータも取得した
```python
import pandas as pd
import matplotlib.pyplot as plt

# ExcelファイルのURL
url = "http://www.policyuncertainty.com/media/Categorical_EPU_Data.xlsx"

# データの読み込み
data = pd.read_excel(url, sheet_name='Indices')

# 欠損値を含む行を削除
data = data.dropna(subset=['Year', 'Month'])

# 日付を作成
data['date'] = pd.to_datetime(data['Year'].astype(str) + '-' + data['Month'].astype(int).astype(str))

# プロットする列のリスト（'Year', 'Month', 'date' 以外）
columns_to_plot = data.columns[2:-1]

# グラフの作成
plt.figure(figsize=(14, 8))

for column in columns_to_plot:
    plt.plot(data['date'], data[column], label=column)

plt.xlabel('Date')
plt.ylabel('Policy Uncertainty Index')
plt.title('Various Categories of Economic Policy Uncertainty Over Time')
plt.legend(loc='upper right', bbox_to_anchor=(1.15, 1))
plt.grid(True)
plt.show()
```
Quest Link (Oculus Link)で画質が悪い際の設定確認項目

# 概要
年に数回OSの再インストールを行った際に、毎回設定を忘れてしまうので備忘録として残しておきます。
この設定をしないと、私の環境では画面全体にブロックノイズが乗った見た目になります。SteamVR上の解像度をいくら上げても解決しません。使用用途はVRChatです。

# 環境
・Windows 10 home
・GeForce GTX 1080Ti
・Meta Quest 2
・Meta Quest Link アプリバージョン 65.0.0.499.343
・NVIDIA グラフィックス ドライバー 536.23
・NVIDIA GeForce Experience 3.28.0.412

※NVIDIA GeForce Experienceがインストールされてないと、Quest Link接続時に黒い画面から進まなくなる罠があるので、OSの再インストール後にQuest Linkがつながらなくなった場合は確認してみましょう(詳細記事様↓)

http://zze128.blog9.fc2.com/blog-entry-511.html

# 設定項目
・グラフィック設定へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864812/6af07315-b736-ffce-5bf2-dfb8dd8a470f.png)

・レンダリング解像度の自動設定のチェックを外す。これで高負荷時の画質低下を防げます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864812/246a14bc-4da4-e723-83c1-41e1bb841a1e.png)

・私の場合、レンダリング解像度はSteamVR側で200%に設定しています
  (もしかしたらQuestアプリ側で変更してもいいかもしれません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864812/6737dd94-d0b9-05ef-7c19-afc849b6c4d8.png)
[paiza]若さ、若さって何だ？（文字の一致 (paizaランク D 相当)

# 振り向かないことさ（あばよ涙
タイトルはいつも適当につけてます。タイトル詐欺でスイマセン。
そんなこんなで、正式にJava版（ジャーーーバーン）突入！！
まずはね、Dランクでイキリ倒してやろうかと（よろしく勇気

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/diff_str

# チェック処理とかは端折ってる
/** ここから定型文 */
ここで記載したクラスについては、
[こっちの記事](https://qiita.com/AsilHatake/items/40204293bdf59cb9f9d8)に書いてある、標準入力をList化したりしてるMainクラスから呼び出す予定だし・なんか継承したりしてるYO!!

ちな、Mainを実行して標準入力から入力するのクソ面倒くさいので、
Java編については問題の入力例をパラメータにしたテストクラスとかも作って公開するYO!!

<details open><summary>開発・実行環境はこんな感じ</summary>

- VSCode
- Java 17
- jUnit 5.9
- maven

pom.xmlはこんな感じ

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.co.asil</groupId>
    <artifactId>paiza202408</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
```

</details>
/** ここまで定型文 */

## 実装クラス 
```java:DiffStr.java
package jp.co.asil.paiza202408;

import java.util.List;

public class DiffStr extends Question {

  public DiffStr(List<String> list) {
    super(list);
  }

  /**
   * [問題]
   * 2 つの文字列 a, b が入力されます。文字列が一致していれば "OK" 、異なっていれば "NG" と出力してください。
   */
  @Override
  public List<String> answer() {
    return List.of(list.get(0).equals(list.get(1)) ? "OK" : "NG");
  }
}
```

## テストクラス
```java:DiffStrTest.java
package jp.co.asil.paiza202408;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.List;

import org.junit.jupiter.api.Test;

public class DiffStrTest {
  @Test
  void testAnswerOK() {
    DiffStr diffStr = new DiffStr(List.of("paiza", "paiza"));
    assertEquals(diffStr.answer().get(0), "OK");
  }

  @Test
  void testAnswerNG() {
    DiffStr diffStr = new DiffStr(List.of("paiza", "aziap"));
    assertEquals(diffStr.answer().get(0), "NG");
  }
}
```

# きっと
`String == String`　って書いちゃって、
ちゃんと比較できねぇじゃねぇかよっていうのを、
出題者は期待してるんだろうなぁ（新人あるある

JavaScriptだとそれで比較できちゃうので、
ゴリゴリにJavaScriptやった後にJavaとかやると間違え...るわけないよね（ﾆｯｺﾘ
棒グラフでマークラベルを内側の右端に表示する方法

## 背景
棒グラフでマークラベルを内側の右端に表示するために、マークラベルの配置を編集したがうまく内側に持ってこれない。
完成イメージは以下の画像。
![スクリーンショット 2024-08-17 14.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786947/7a9a1418-a23d-a6c8-bbf5-49b2a9db5293.png)

## 方法
### 複合グラフを使う
棒グラフを利用するだけでは、内側にラベルを表示できない。
そこで棒グラフ＆ガントチャートを作成し、二重軸に結合する！

以下の画像のように、棒グラフを作ったあとにガントチャート形式のグラフを追加する。

![スクリーンショット 2024-08-17 14.14.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786947/f2d7c496-3b07-3246-fb39-8cc571a0489f.png)

その際にガントチャートのマークカードのラベルより、ラベルを表示のチェックボックスにチェックを入れて配置を左に設定する。

さらにガントチャートのマークカードの色より不透明度を0%にしておく。

![スクリーンショット 2024-08-17 14.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786947/4f467a8c-8be7-ac34-5b2c-34295142a6fa.png)

ガントチャートの合計(売上)ピルを右クリックし、軸の動機を行う。
ヘッダーを右クリックして、軸の非表示を行う。

ガントチャートのラベルお好みでラベルのデザインの変更を行っておく。
河川データを用いてTableauのマップに描画する方法

## 背景
Tableauで国土数値情報のデータを読み込み、河川をマップ表示する。
完成イメージは以下の画像。
![スクリーンショット 2024-08-02 18.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786947/50c400b3-bebc-bc4c-f195-6065672cbe6b.png)

利用したデータ→https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-W05.html

## 方法
### shp形式のデータを読み込み
Tableauで「新しいデータソース」より空間ファイルを選択し、shp形式のファイルを読み込む。

自動的にジオメトリというフィールドが追加されるので、マークカードの詳細にドラッグする。
河川のデータが読み込まれ、マップ上に表示される。

国土数情報のサイトに各フィールドの値について説明があるので確認する。
1級河川などといった、項目ごとに色分けなどが可能。

河川名に対して文字化けが発生する可能性があるので、別途以下の記事を参照。
https://qiita.com/nattonattonatoo/items/18192cfecafbb124fc6b
Tableauで地理データを利用する方法

## Tableauで地理データを読み込む
Tableauで国土数値情報のデータを読み込む際に河川名で文字化けが発生。
利用したデータ→https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-W05.html

## 対処法
### Qgisをダウンロード
無料で利用可能なQgisというアプリケーションを利用。ダウンロードは以下のURLより可能。
https://www.qgis.org/

### 利用方法
ドラッグアンドドロップでshp形式のファイルをQgisにインポートする。
画面上のメニュー欄の「レイヤタブ」の「レイヤプロパティ」を選択。
「データソースエンコーディング」を「UTF-8」から「Shift_JIS」へ変換し、OKをクリック。


![スクリーンショット 2024-08-02 18.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786947/afb30ee3-f085-f750-d573-5d263451b4b6.png)
画面上のメニュー欄の「ファイル」→「名前をつけて保存」を選択し添付画像のように設定を行う。
文字コードを「UTF-8」、形式を「ESRI Shapefile」にて出力する。
ファイル名が空欄だとエラーがでるので注意。
その他はデフォルトの設定でOK！
WhereScape

## はじめに
以前の記事で、[Data Vault 2.0](https://qiita.com/ExtremeCarvFJ/items/1f82ca51f0d4103ad418) や [ELT](https://qiita.com/ExtremeCarvFJ/items/d4bca89792efea7332b1) を紹介しました。中でも Data Vault 2.0 に関しては、特殊なデータモデルや独自アーキテクチャを扱う基盤を、一から開発・構築するのには至難の業です。

そこで朗報です。Yellowfin と同じ Idera グループの WhereScape 社が、ELT 上で Data Vault 2.0 の設計・運用を担うソフトウェア Wherescape を提供しています。

## WhereScape 概要
WhereScape の役割を一言で説明すると、DWH の構築です。データソースからデータを収集し、スキーマを変換しながら、スタースキーマ、スノーフレーク、Data Vault など、DWH が参照するためのスキーマを構築します。

#### モジュール

その役割を提供するために、WhereScape は、3D、RED、Data Vault Express (DVE) の 3 機能で構成されます。それぞれの役割は大まかに以下の感じです。
|機能|役割|
|---|---|
|3D|・データソース探索 (リバースプロキシー)<br>・データプロファイリング<br>・データモデリング<br>・メタデータ生成|
|RED|・実行プロシージャの生成<br>・スケジュール実行|
|DVE|・Data Vault データモデリング|

なお、WhereScape 自体、実データは管理しません。メタデータだけを管理し、実際の処理は全て外部のデータベースに委譲します。

#### 処理の流れ
下記イメージは、実行環境である WhereScape RED の機能概要を説明する目的で、プレゼン資料などに使われるものです。

![ws-architecture-1024x561.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/e6c24222-82af-9467-66fb-6d7c7aa32829.jpeg)

左から順を追って説明します。
1) DATA SOURCES から データを LOADING し、DATA TRANSFORM でデータ構造を変換したものを、DATA FOUNDATION に格納します。
2) DATA FOUNDATIONでは、中間テーブルが、DATA STORE/LAKE、DATA VAULT、3NF などの構造で管理されます。
3) さらに、BUSINESS TRANSFORM でデータ構造が変換され、END USER LAYER で STAR SCHEMA や BUSINESS VAULT など、目的に応じたデータ構造で管理されます。
4) BI や ANALYTICS TOOLS は、END USER LAYER のデータにアクセスし、データを可視化・分析します。
5) 先述の通り、WhereScape はメタデータだけを管理します。メタデータをもとに、データのロード、変換、生成などに関わるスクリプトやプロシージャを生成し、これらの実行を外部データベースに委譲します。

#### 簡易イメージ

更に簡素化したイメージが下記です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/486ff7a1-19f9-69b7-df44-3964712cbc0b.png)

・イメージ下部に示される WhereScape は、外部データベースのメタデータを管理します。メタデータをもとに生成されたスクリプトで、外部データベースに対してデータのロードや変換などの実行を委譲します。
・データのロードや変換の実処理は、全て外部データベースのリソースを使って実行するため、パフォーマンスも外部データベースのスペックに依存する形です。
・クラウド上のデータベースの処理性能を活用できることから、データ量の多い処理を行う場面で強みを発揮します。いわゆる ELT です。

## WhereScape 操作
Data Vault データモデリングの作成を前提とした操作手順を、画面イメージと併せて説明します。

#### データーソース
データソースにアクセスし、構造を可視化して確認します。併せて、詳細なプロファイルを作成することも可能です。
リバースエンジニアリングとしての役割も果たします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/822c5e83-ab63-3149-57a9-c723af5bd809.png)

#### 構造変換
ステージングレイヤを介して、データを変換していきます。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/01d2a3e8-6b95-84a1-74e9-9771714a5fa8.png)


DWH が取り扱えるように、Data Vault データモデリングを生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/1df33ebd-2a1e-cc64-cb46-b784628f7e5a.png)

データのロードや変換は、全てメタデータをもとに作成されたスクリプトやプロシージャを WhereScape から実行し、実際の処理は外部データベースに委譲します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/6ac8e07e-e6ff-6b07-d52d-96097dc1ae79.png)

#### スケジュール実行
この処理をスケジューリング実行します。WhereScape のスケジュール機能でなく、外部のスケジュール機能を使って実行することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/ff89ac91-cd08-6ab8-9751-d47639d63b88.png)

## 最後に
手短に WhereScape を紹介いたしました。なかなか奥の深い製品で、簡単に説明しきれるものではありません。
興味を持たれた方は、是非 Yellowfin 営業担当までご連絡ください。24 時間 365 日受け付けています。

では皆様、良いデータ分析を！
[SOLVED] linux mint ver. 22で、rtl8812auのwifi設定をする際に使えるドライバー

　使用している無線LANアダプターは、rtl8812au仕様とされているBuffalo製のWI-U2-433DMとEDUP製の2つで、EDUP製は15年くらい前の製品である。
　OSは Linux Mint Wilma Cinnamon ver.22で、FMV-AH550/5B(core i5, メモリ 4Gbx2, SSD 500Gb)を使っている。なお、このPCのBIOSには、セキュアブートの項目がない。
 　Q4OSやUbuntu 22.04LTSではwifiを設定できず、意外と手間がかかった。弄っているうちにLinuxが分かってきて、気分をかえてOSをmintにしたらwifiも設定できた。
  
  結論からいうと、rtl8821auをインストールすれば、rtl8812auが使える。
　https://github.com/morrownr/8821au-20210708
 （別のバージョンは、https://github.com/morrownr/8812au-20210820）
 を参考にした設定の手順は以下の通り。

$ sudo apt install git
$ git clone https://github.com/morrownr/8821au-20210708
$ cd 8821au-20210708
$ sudo sh install-driver.sh
の後に、Yを入力した場合は、メニューに従って 
cntl+X の後に、
Y --->rebooting

　リブート後、上記いずれかの無線LANアダプターを差し込んで点滅を確認し、無線wifiをonにして、5GHzを選んだ。回線速度は、300Mbps（upload: 220Mbps）であった。
 
 ###notes
（１）無線LANアダプターを外すときは、予め、無線をoffにして当該アダプターの点滅が消えたのを確認した後に抜いている。
（２）当初、Linux mint forums（https://forums.linuxmint.com/viewtopic.php?t=374706&start=20
）の記事にしたがって下記の手順を試みたが、フリーズすることや、Buffalo製のアダプターが認識されなかったため、上記の手順に変更した。
 
$ sudo apt install git
$ git clone https://github.com/aircrack-ng/rtl8812au.git
$ cd rtl8812au
$ sudo make dkms_install
$ sudo shutdown -r now

（３）ubuntu mintだと思っていた。正しいOS名は、linux mintなのだねw。
（４）台湾製だと思っていたEDUPは、中国製だった。調べなおして、愕然としている。そもそも買った記憶がない。気がついたら、部屋に転がっていた（怖くて草ｗww）。
S3へのアップロードが無料だと思ってたら意外なところで課金された話

## はじめに
S3へのアップロードって確か無料だよねぇ、EC2のデータを日時バックアップしちゃえ。
と思って構築してたらめっちゃ課金されてしまった話です。

### まずはこちらを・・・
ご覧ください。一目瞭然、やっちまってます・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/50f73365-0a10-26d8-4157-ad521401f1b1.png)

### ザ・原因
すぐに原因調査です。こちらの記事を参考にさせていただきました。（感謝！）
[EC2からS3へアクセスする4つのルートとコスト](https://tech.nri-net.com/entry/access_routes_from_EC2_to_S3)
ざっくりまとめるとこんな感じです↓↓
(1)Internet Gateway→無料
(2)NAT Gateway→有料
(3)VPC Endpoint（Gatewayタイプ）→無料
(4)PrivateLink（Interfaceタイプ）→有料


で、現状の環境は下記のような感じ↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/715207b5-af51-f2d9-c32c-193b4bc7b9e4.png)
EC2からS3に通信するとき、一旦リージョンを抜けて（オンプレ側のカスタマーゲートウェイを経由して）いるので、この辺りで課金されているのかなと。

### 対策
先ほどの記事では、(1),(3)が無料なので、どちらかを採用します。
今回は、プライベートな環境なので(1)は採用できません。
よって(3)の構成にしていきます。
ということで早速構築してみました。
※VPCエンドポイントの作成手順は省略します。参考にした記事はこちらです↓↓（感謝！）
[VPCエンドポイント経由で S3 にアクセスする](https://www.aws-room.com/entry/s3-gateway-endpoint)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/16cabc10-3335-d2f7-a1b2-a95e341de1dc.png)

で、重要なのがここからです。
①の通信は止めつつ②の経路で通信するようにしなくてはいけません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980545/7047b20e-a762-1f79-6e33-0c0fcb33f0ea.png)

これをバケットポリシーで制御します。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::[バケット名]",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "[IPアドレス]/32"
                },
                "StringNotEquals": {
                    "aws:sourceVpce": "[VPCエンドポイント名]"
                }
            }
        }
    ]
}
```
↑↑VPCエンドポイントからの通信のみを許可するように設定しました。
ちなみに特定のIPアドレスからも通信を許可するようにしていますが、これはオンプレ側のグローバルIPです。
これを入れておかないと、マネジメントコンソールでバケットの操作ができなくなる可能性がありますので十分ご注意ください！

### 動作確認
許可されていないソースからAWS CLIで確認コマンドを実行してみると、
```
$ aws s3 ls s3://[バケット名]/
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
```
通信が拒否されていることがわかります。

以上！

## おわりに
AWSの料金体系っていまだにちょっとわからない部分が多くて、いつも恐る恐るコストエクスプローラーでチェックしています^^;
【エンジニア就活を振り返る】就活におけるメンターとの付き合い方

おはようございます!
駆け出しエンジニアのさわまりんです。

今回はOB訪問をしていると出会うことになる
『メンター』との付き合い方について解説していきます。

# OB訪問って？
そもそもOB訪問とは、
実際に企業に内定をもらった方や、
実際に働いている方にお話を聞くことです。

リアルな情報を教えていただくことで、
就活がよりスムーズに進行します。

# いろんなメンターさん
そしてOB訪問をしていると出会うのが『メンター』さんです。
「あなたの就活をサポートさせてくれませんか？」と声をかけてくれます。

メンターの中にも、
有給インターンとして活動している方や、
ボランティアとして活動している方、
人材会社の仕事として活動している方などがおられます。

# 有給インターンとして活動しているメンターさん
私は、有給インターンとして活動しているメンターさんとの間で
少しもやもやする経験があったので、
もし今困っている人がいれば参考にしていただきたいです。

有給インターンとして活動しているメンターさんの中には、
純粋に後輩の就活を応援したい人だけでなく、
成果報酬のお金稼ぎをしたくて活動されている方がいます。

具体的には、
○○会社の面接を紹介して、内定を取れたら○○円
○○のイベントを紹介して、参加してもらえたら○○円
といった感じです。

上手いこと理由をつけられて紹介されたものの、
本当は興味ない、他のことに時間を使いたいなど、思うことが出てくると思います。

そんなときは相手も普通の学生だと思い出してください。
自分の見せ方がうまい学生バイトです。

ちなみに私がいまいちのメンターさんと出会ったときは、
エンジニア志望なのにも関わらず、人材や不動産を押し売りされていました。

# はっきり伝えていい
自分の将来を守れるのは自分だけです。
意味のないことに時間を費やす必要はありません。

興味がなければ興味がないと伝えていいんです。
ちゃんと自分に向き合ってくれるメンターさんを大事にしましょう。

# さいごに
今回はOB訪問をしていると出会うことになる
『メンター』との付き合い方について解説しました。

ぶっちゃけメンターさんの質にはかなり差があります。
自分と相性のいい人、信頼できる人をぜひ探してみてください。

実際、私は自分の今までの経験の壁打ちをかなり手伝っていただきました。
メンターさんと上手いこと付き合っていってください。

最後まで読んでいただきありがとうございました。
SCPでPermission deniedが出るトラブルシュート

## はじめに

**SCPコマンド**を使って、ローカル環境からリモート環境にファイルをコピーしようとしたところ、**Permission denied**のエラーが出たため、そのトラブルシュートの記事です。

## 環境

Ubuntu20.4

## 内容

結論を言えば、コピー先のディレクトリにファイルを書き込む権限がなかったとことが原因です。

次のコマンドで「権限がありません」と言われました。

```
$scp -r /hoge hoge-user1@remote-hostname:/hoge
Permission denied
```

そして、コピー先のhogeディレクトリの権限を確認してみます。

hogeディレクトリの所有者はhoge-user2です。hoge-user2ユーザーであれば、hogeディレクトリへの書き込みはできるようになっています。しかし、hoge-user2以外のユーザーからの書き込みに関しては、権限が付与されていません。SCPコマンドでは、hoge-user1ユーザーで書き込みをしようとしたため、権限がありませんといわれてしまいました。

```
$ls -la
drwxr-xr-x  2 hoge-user2 hoge-user2    4096  5月 10 11:09 hoge
```


### 方法その１

SCPでコピーするときに、ユーザーをコピー先のディレクトリの所有者と同じユーザーを指定すればコピーができるようになります。

つまり、hoge-user1ユーザーではなく、hoge-user2ユーザーでSCPをすれば、問題なくコピーができます。

```
$scp -r /hoge hoge-user2@remote-hostname:/hoge
```

### 方法その２

コピー先のディレクトリの所有者を変えてしまいます。

コピー先のディレクトリの所有者を、既存のhoge-user2ユーザーからhoge-user1ユーザーに変更すれば、SCPでhoge-user1ユーザーを指定してコピーができるようになります。

hogeディレクトリの所有者とグループを、hoge-user1に変更するコマンドです。

```
$chown hoge-user1 /hoge
$chown :hoge-user1 /hoge
```

### 方法その３

コピー先のディレクトリで、所有者以外のユーザーからでも書き込みができるようにします。

コピー先のディレクトリの所有者はhoge-user2ユーザーのままで、hoge-user2ユーザー以外のユーザーからでもhogeディレクトリへの書き込みができるように権限を付与してあげればOKです。

hogeディレクトリの権限は、もともと、755になっており、他ユーザーからの書き込みはできないようになっていました。他ユーザーからの書き込みができるように、755→757に変更します。

これで、SCPでhoge-user1ユーザーからhoge-user2ユーザーが所有するディレクトリにコピーすることができるようになります。

```
$chrom 757 /hoge
```
Javaで「UNIX_LINESフラグ(\nのみ行末記号として認識される)」の動作を確認してみた

# 概要

Javaで「UNIX_LINESフラグ(\nのみ行末記号として認識される)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index20.html

# 実装

以下のファイルを作成しました。
```JSample20_1.java
import java.util.regex.*;

class JSample20_1{
  public static void main(String[] args){
    String target1 = "Thank You!\r\nGood Bye";
    String target2 = "Good Bye\nThank You!";
    String target3 = "Good Bye\r\nThank You!";

    String regex = "Bye$";
    Pattern p1 = Pattern.compile(regex, Pattern.MULTILINE);

    Matcher m1_1 = p1.matcher(target1);
    System.out.println(target1 + ":" + m1_1.find());
    Matcher m1_2 = p1.matcher(target2);
    System.out.println(target2 + ":" + m1_2.find());
    Matcher m1_3 = p1.matcher(target3);
    System.out.println(target3 + ":" + m1_3.find());

    System.out.println("---- ----");

    Pattern p2 = Pattern.compile(regex, Pattern.MULTILINE|Pattern.UNIX_LINES);

    Matcher m2_1 = p2.matcher(target1);
    System.out.println(target1 + ":" + m2_1.find());
    Matcher m2_2 = p2.matcher(target2);
    System.out.println(target2 + ":" + m2_2.find());
    Matcher m2_3 = p2.matcher(target3);
    System.out.println(target3 + ":" + m2_3.find());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample20_1.java 
$ java JSample20_1 
Thank You!
Good Bye:true
Good Bye
Thank You!:true
Good Bye
Thank You!:true
---- ----
Thank You!
Good Bye:true
Good Bye
Thank You!:true
Good Bye
Thank You!:false
```

# まとめ

何かの役に立てばと。
[paiza]Javaで解いていく事前準備編

# Java編始まるよ～
そんなこんなでJavaScript編が完走できたので、次はJavaでダラダラと解いていくZeeee!!

# とりあえず。。。
いきなり問題解いてもアレなので、最初に標準入力から値を受け取ってStringのListに変換する部分だけを実装しようかと。

公式でも載ってる↓を見てね

https://paiza.jp/guide/samplecode.html


ほら、これから投稿していくソースは、標準出力を受け取った後のソースにしたいため。

```java:実行するメインクラス
package jp.co.asil;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        try (Scanner sc = new Scanner(System.in)) {
            while (sc.hasNextLine()) {
                list.add(sc.nextLine());
            }
        }
        // ココに各問題のクラスのメソッドを書くよ！
    }
}
```

コメントにも有るように、コメントの下に以下を実装する予定。
`new 実装クラス(list).answer().stream().forEach(System::out:plintln);`

で、ついでに。
これから実装予定の問題回答のクラスでは標準入力から値を受け取って、回答をするっていう処理になるので、なんとなく共通のAbstractクラス作って継承とかやってみるかということで以下のクラスを作ってみたよ

```java:Question.java
package jp.co.asil.paiza202408;

import java.util.List;

public abstract class Question {

  // 標準入力
  protected List<String> list;
  
  /**
   * コンストラクタ
   * @param list 標準入力
   */
  public Question(List<String> list) {
    this.list = list;
  }

  /** 実装しなきゃならん回答メソッド */
  abstract public List<String> answer();

}
```

# 一旦これで
前準備は出来たので、残り僅かな期間ですがガシガシとJavaScriptからのリプレイス作業を進めてみようかと。

# 変更点(2024-08-19 14:00)
abstractメソッドの戻りをvoidからStringのListに変更
→テストクラス作った時に、結果を受け取りたかったから。