OmniAICreator/Qiita-1.07M huggingface dataset:
【pwgin】禁止文字を指定してパスワードをランダム生成できる！pwginの使い方【JSON形式でメールを送る時便利】

# 1.pwginの最大の特徴
pwginとはlinuxで使用できるパスワード生成コマンドです。

パスワードを生成するコマンドなら
・mkpwd
・pwmake
がありますが、最大の特徴として禁止文字を指定できるところにあります。

json形式(aws ses cliのsendEmailなど)でパスワード添付メールを送る際などに便利でしょう。

下記から使い方を紹介していきます。

# 2.pwginをlinuxにインストール

まずepelをインストールする必要があります。
下記のコマンドでインストールできます。
```
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```
次に以下のコマンドでpgwinをインストールします。
```
sudo yum install pwgen –y
```
これでpgwinが使用できます。

# 3.基本の書式

基本は以下のように使用します。
```
pwgen　[数字1] [数字２]
```
数字１にはパスワードの文字数を指定します。
数字2には生成するパスワードの数を指定します。

例えばこんな感じに指定してコマンドを叩くと
```
pwgen 9 4
```
9文字のパスワードが4個生成されます。

▼結果
```
hoafan4-^ arAfsf112 Hs920s12" Gwd83ka1s
```
# 4.禁止文字の指定方法

いよいよタイトルにある禁止文字の指定方法について説明します。

禁止文字の指定にはオプションでrを使用します。
以下のように記述してください。
```
pwgen -r='禁止文字' 9 4
```
## 例1
「8」を禁止文字として9文字のパスワードを4つ生成したい時
```
pwgen -r='8' 9 4
```
▼結果
```
fYsnf23;s geDe3va7f2 Bd90643sf haDer)tc1
```

禁止文字を複数指定することもできます。その場合はシングルクォートのなかに禁止文字を複数いれてください。

## 例2
「8」と「/」と「a」を禁止文字として9文字のパスワードを4つ生成したい時
```
pwgen -r='8/a' 9 4
```

# 5.使用例

JSON形式でパスワードを送付する際に役立ちます。
JSON形式では以下の文字がメール文に含まれていると送信できません。
・”（ダブルクォート)
・¥(バックスラッシュ）
・/(スラッシュ)

そのため、json方式を用いて、上記の文字が含まれたパスワードを添付したメールを送信ができません。

そこでpgwinです！

以下の正規表現でパスワードを生成しましょう。

```
pwgen -r='"¥/' 9 1
```

これで生成されるパスワードに”（ダブルクォート),¥(バックスラッシュ）,/(スラッシュ)が含まれません。
メールが送信できます！

# 5.ほかのオプション

pwginにはrだけでなく他のオプションもあります。
<table>
  <caption>オプション</caption>
  <thead>
    <tr>
      <th>名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td>-c</td> <td>少なくとも一つの大文字を含める</td>
  </tr>
  <tr>
    <td>-A</td> <td>大文字を含めない</td>
  </tr>
 <tr>
    <td>-n</td> <td>少なくとも１つの数字を含める</td>
  </tr>
　　　<tr>
    <td>-0</td> <td>数字を含めない</td>
  </tr>
  　　　<tr>
    <td>-１</td> <td>生成されたパスワードを一行に一つ表示する</td>
  </tr>
    <tr>
    <td>-y</td> <td>少なくとも一つの記号を含めて生成する</td>
  </tr>
      <tr>
    <td>-s</td> <td>ランダム性の高いパスワードを生成する</td>
  </tr>
    <tr>
    <td>-B</td> <td>あいまいな文字列をふくめない(1とi,0とoなど）</td>
  </tr>
　<tr>
    <td>-v</td> <td>母音や母音と間違う文字を含まない</td>
  </tr>
  　<tr>
    <td>-N</td> <td>数字のパスワードを表示する</td>
  </tr>
</table>

pwginは覚えやすいパスワードを生成するのでsオプションをつけて生成することをお勧めします。
さらに
```
pwgin -sync 12 1
```
とオプションを設定したらセキュアなパスワードが生成できると思います。

みなさんもぜひpwginを使用してみてくださいね。
IDCホワイトペーパーAivenのクラウドデータサービスは3年間で340%のROIをもたらす

<font color="Grey">*[IDC White paper: Aiven's cloud data services bring 340% three year ROI](https://aiven.io/blog/aiven-cloud-data-services-bring-340-three-year-roi)の翻訳です。*</font>

2021年10月18日

# IDCホワイトペーパーAivenのクラウドデータサービスは3年間で340%のROIをもたらす

IDCは、Aivenのサービスがお客様にとってどれほどの価値をもたらすかをホワイトペーパーにまとめました。私たちの成果をお読みください！(ネタバレ：私たちは本当によくやりました)

Aivenでは、DBAやアプリケーション開発者の生活をどのように楽にしているか、率直に言ってかなり誇りに思っています。クラウド上でデータを保存し、処理することを可能にする私たちの迅速で手間のかからないサービスは、本当に高く評価されています。このようなフィードバックは非常に喜ばしいことであり、正直なところ、大きな驚きではありません。


しかし、当社のマネージド・クラウド・データベース・サービスが、大規模かつ具体的なビジネス上のメリットをもたらしているという声も、お客様から繰り返し聞かれます。俊敏性が向上し、ペースの速いビジネス環境でもより迅速に対応できるようになり、効率性が収益に直接反映されるようになったというのです。


この効果がどれほど大きいかについては、経験則から推測することもできる。私たちはこの効果を数字で示し、私たちのサービスが何を達成するのかを正しく理解したかったのです。


そこで、私たちはIDCによる調査のスポンサーとなり、この問題を調査しました。


その結果は興味深いものだった。IDCのホワイトペーパーによると、ビジネス価値という点では、当社の顧客は**340%の3年間のROI**と**5ヶ月の投資回収期間**、**37%の3年間の運用コスト**の削減、そしてDBA、インフラ、セキュリティ・チームの有効性の目覚ましい急上昇を目の当たりにしています。


IDCの計算によると、この調査に参加したエンタープライズレベルの企業は、1社あたり年間平均18万4800ドルの純収益増を実現できたという。


### ホワイトペーパーのハイライト


より深い洞察はIDCのホワイトペーパー*を読んでいただくとして、ここではそのハイライトをいくつか紹介しよう：


* Aivenは、データベースの自動スケーリングやApache Kafkaへのアクセスを、メンテナンスの心配なしに提供できる点でユニークである。
* Aivenを利用することで、企業は物理的な資産の維持から、必要に応じてサービスを購入することができます。
* Aivenにより、開発チームは俊敏性とスケーラビリティを大幅に向上させることができます。
* Aivenを使用することで、DBA、ITインフラ、セキュリティへの時間と投資を大幅に削減しながら、同等の結果を得ることができます。
* Aivenは、アップスケーリングやダウンスケーリングを容易にすることで、ビジネスの俊敏性を高めます。
* Aivenは大きなリスク軽減効果をもたらします。


Aiven独自のマルチクラウド、オープンソースアプローチは、オンプレミスのソリューションや各大手クラウドプロバイダーが提供する独自ソリューションよりも汎用性が高い。データはユーザーの近くに置くことができ、状況が変われば異なる地域やクラウドに簡単に移動できる。このため、社内ソリューションやプロプライエタリー・ソリューションに比べて、ビジネスの俊敏性が大幅に向上する。


### 自動化された俊敏性


自動化されたスケーリングも差別化要因として挙げられているが、これもオペレーションにおける俊敏性の大きな源泉である。顧客は不要なキャパシティを抱え込むことがないため、必要なときに安心してキャパシティを増やし、メリットを享受することができる。ニーズが一時的にでも減少すれば、支出を減らすというメリットを再び活用することができる。


*Aivenのおかげで、大きなイベントの数日前に簡単に規模を拡大することができました。-- EMEAのビジネスサービス企業


Aivenがクラウドデータ管理にもたらす使いやすさについても、お客様から高い評価をいただいています。グラフィカル・ユーザー・インターフェースであるAiven Consoleをはじめ、一般的にわかりやすいセットアップやユーザー・エクスペリエンスも高く評価されています。


*DBAは、インストール、メンテナンス、アップグレード、パスワード変更に時間を割く必要がなくなったため、パフォーマンス、データベースエンジンの選択、スキーマ定義などに取り組む時間が増えました。[インストール、メンテナンス、アップグレード、パスワードの変更に時間を費やす必要がなくなったからです。-- EMEAの小売企業


しかし、この自慢話はもう十分でしょう？[ホワイトペーパー](https://landing.aiven.io/whitepapers/the-business-value-of-aiven-data-cloud-solutions/)をご覧になり、Aivenがもたらすビジネス上のメリットについて、確かなデータをお読みください。


--


\* 出典IDCホワイトペーパー、Aiven主催、The Business Value of Aiven Data Cloud、ドキュメント番号48198621、2021年8月。


まだAivenのサービスをご利用になっていませんか？<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントをフォローし、製品や機能関連の最新情報をご確認ください。
Dockerfile

Dockerfileメモ :whale:

## Dockerfileとは
Dockerfileは、Dockerイメージを作成するためのテキストファイル

以下の情報が記述される
- 基本となるOS
- インストールする必要があるソフトウェア
- コピーするファイル・ディレクトリ
- 開くポート
- 実行するコマンド

```dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
```

### FROM
ベースとなるイメージを指定
FROM ubuntu:18.04と記述すると、Ubuntu 18.04をベースにしたイメージが作成

### WORKDIR
コマンドを実行する作業ディレクトリを指定
WORKDIR /appと記述すると、その後のRUN、CMD、ENTRYPOINT、COPY、ADD命令が/appディレクトリで実行される

### COPY
ソースコードや設定ファイルをローカルからDockerイメージにコピーする
COPY index.html /mydir/index.htmlと記述すると、ローカルのindex.htmlがイメージの/mydir/index.htmlにコピーされる

### RUN
イメージ作成時に実行するコマンドを指定します。例えば、RUN apt-get update && apt-get install -y gitと記述すると、イメージ作成時にパッケージリストの更新とgitのインストールが行われます

### EXPOSE
コンテナがリッスンするポートを指定する(デフォルトのプロトコルはTCP)
プロトコルを指定する場合は `EXPOSE [ポート番号]/[プロトコル]`

### CMD
Dockerコンテナが実行されたときにデフォルトで実行するコマンドを定義
CMD ["apachectl","-D","FOREGROUND"]と記述すると、コンテナが実行されたときにApacheがフォアグラウンドで起動する

## Reference
- [Dockerfile reference](https://docs.docker.com/engine/reference/builder/)
- [Docker ドキュメント](https://docs.docker.jp/engine/reference/builder.html)
nohello.com

## nohello.com 

https://www.nohello.com/ 

## Don't Just Say "Hello" in Chat.

チャットで「お疲れさまです」だけ書いて放置すんな.com とのことらしい。

https://x.com/satoru_takeuchi/status/1566721280702758912?s=20
> 「お疲れさまです」
「…(要件はなんだろう)」
「いまお時間よろしいですか」
「…(要件はなんだろう)」
「お忙しそうなのでまた今度にします」
「…(要件は何だったんだろう)」

に準ずる。

nohello.net もあった…

https://nohello.net/en/

## Hi -- I'm working on [something] and I'm trying to do [etc...]

「今これやってて、こうしたいんだけど」

をまず伝えよう。

以上
STM32C011(8SOP)のリセット端子。(概要)(注意あり)(STM32C011J4M7)

---------------------------------

参考


↓ここをクリック↓


https://ameblo.jp/pta55/entry-12838948374.html



参考


↓ここをクリック↓(なぜか2回から3回、再ロードすると画像が見れる)


http://nemuisan.blog.bai.ne.jp/?eid=239023

参考

↓ここをクリック↓

http://meerstern.seesaa.net/article/477348927.html



いろいろ

全体的にペースが速すぎる
前回は、参入が検討で3か月から半年
シリアル書き込みで2週間、時間を浪費したので

やらかし隊の人たちが
オブジェクト(置物)作るに励んでいたので
特に罪の意識もなく6GPIOの記事を書いていたが

ちなみに6GPIOは、前回のアクセスランキングナンバーワンです。
STM32C011J4M7が1回で20～30個ポンポン売れているので
1000個ぐらい、あっという間になくなる。
やらかし隊が追い付いてくるまでリセット系は、ペースを落とすか
念入りに解説する必要がありそう。
OBは、引っ張るか!!

キター、えー　みんな、おててが速いようで、なんじゃ!!
こりゃー完全に追い越される。
ハードマニュアル(英語)やアプリケーションノート(英語)を熟読しょうよ!!
LチカよりラインLEDのWS2812Bのアクセスカウントが多い?でなんじゃ!!
頭が処理不能、完全に処理落ちだわ、理解不能。

(アニメ化物語風)今回の教訓、見たら信じちゃうんダ!!
なかみは、ともかく、動くて言う情報が一番大切。

---------------------------------


x 自己責任の意味がわかる方が読んでください。


目的
PA13、PA14やリセット端子をGPIOにチェンジして遊ぶ。

(注意)最悪、二度と書き込めなくなります。(事故と弁当は、自分もち?)(自己責任でお願いします。)
(はっきり言って、このCPUは、安いから2、3個ダメにした方が為になる)
(ハーイ、各自、壊した物は、年月時間と原因、氏名を書いてホワイトボートに貼っておく事。(なんの事だ?(さらし者?)))

●リセット端子の場所　4ピン


![o_cop914.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a7208442-6e4b-6d08-5929-71cff972814e.jpeg)


●3秒ルール

全体の開始時に3秒待って書き込み時間を作る事。
(けっして、拾い食いの事では、ありません。)
(アニメ「日常」ゼンマイ中高生のやつを参照)


```c++



//初期化
void setup() {

  delay(3000);//i don't. Not delete. (しらない、消しちゃダメ)(不要删除文档)

  //ピンの初期化 PA8
  pinMode(PA8, OUTPUT);

} //setup


//メインループ
void loop() {

  //6をオン
  digitalWrite(PA8, HIGH);

  delay(1000); //1秒待つ

  //6をオフ
  digitalWrite(PA8, LOW);

  delay(1000); //1秒待つ

} //loop




```

●OB(オプションビット)(オプションバイト?)
(注意)不用意いじると二度と書き込めなくなります。
(意味を完全に理解してください。)
(やりかた書くとすぐに壊すので今は書かない)
(やるなて、言ったことをやって壊すので、はいそうですね、で終わり)

起動前の設定を変えるビットたち。
今回使うのは、ブートの設定とリセット端子のGPIO化


●中華ST-LINKリセット改造

中華ST-LINKをまず、分解して、ターゲットリセット信号を
外部に取り出す。

ST-Link V2 CloneにReset追加

参考

https://denshikousakusenka.jimdofree.com/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/stm32/st-link-v2-clone%E3%81%ABreset/


●ターゲットリセット信号の意味

リセット端子が生きていれば、どんな時でも書き込める
(高電圧による完全破壊は、除く)(核爆弾による蒸発も、除く)

●PA13、PA14のGPIOの利用について

PA13、PA14をGPIOに設定すると二度と2線SWDから書き込めなくなります。
が、しかし、中華ST-LINKターゲットリセット改造ずみの
ターゲットリセット信号をターゲットに繋いで、書き込みソフトの設定を
ハードウェアリセットにするとSWDが接続出来て、書き込めるように
なります。

もう一つの事前のやりかたとして3秒ルール適用という方法があります。
やり方して、
「delay(3000);//i don't. Not delete. (しらない、消しちゃダメ)(不要删除文档)」を全体の先頭に書いて書き込み時間を確保する方法があります。


ここでは、説明しませんがシリアルポート書き込みの方法があります。
ただし、標準のマイコンは、ほぼ、書き込み不可の設定になっています。

●リセット端子のGPIO化

標準では、リセット端子(4ピン)は、リセット端子になっています。

事前に3秒ルールを必ず適用してください。

リセット端子をGPIOに設定した場合の再書き込み方法は、

(PA13、PA14をいじっていない場合)

SWD、3秒ルールとシリアル書き込みだけになります。
今日からSTM32C011J4M7には、全て3秒ルールを適用してください。
お約束だよ

●救済方法1

ちかくの友達からターゲットリセット付の書き込み器を借りる


●リセット即抜き

書き込みソフトで接続後そく、リセット端子からGNDを抜く

C011で確認しました。

x 著作権の違反にならない程度に利用します。

![o_cop920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d11417d5-cdcc-6f21-3faa-3b33ac4a30fd.jpeg)



とりま
(完)
[YaST]YaSTのテーマを変更する方法

# みなさんこんにちは
openSUSEを使っている方、```YaST(GUI)``` ***眩しくないですか？***
初期状態だと以下のような感じで***眩しい***です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269735/996dbc37-be34-0077-487b-dfe0ffff78ea.png)
これを以下のようにする方法を紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269735/d273643d-0cf0-8808-3e67-435521d66b67.png)
単純にQt5のテーマを変えるだけですが、YaSTはrootで実行されるため、ひと手間必要になります。

# やり方
###  ```sudo zypper in qt5ct``` を実行する

- ```qt5ct``` は設定ファイルを編集することなく、GUI上でQt5の設定
をできるツールです。YaSTはQtでできているので、こちらのインストールが必要になります。

### ```xdg-su -c "qt5ct"``` を実行し、rootとして```qt5ct``` を起動する
- ```xdg-su``` はGUIアプリケーションをrootとして実行するためのコマンドです。GUIアプリケーションをrootとして実行することは、あまり良くないとされていますが、今回はrootのQt5設定を変える必要があるのでこちらのコマンドが必要になります。

### よしなに設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269735/9d57499c-5ab8-b0b6-9847-6cf38aa3f58a.png)


よしなにやってやった後、右下の適用、OKを押下で保存されます。
- ```Adwaita``` とかが ```adwaita-qt5``` パッケージとして配布されているように、GTK-Qtどちらにも提供されているテーマもあります。
    - [Qt と GTK アプリケーションの外観の統合 #Qt と GTK 両方のためのスタイル - ArchWiki](https://wiki.archlinux.jp/index.php/Qt_%E3%81%A8_GTK_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%A4%96%E8%A6%B3%E3%81%AE%E7%B5%B1%E5%90%88#Qt_.E3.81.A8_GTK_.E4.B8.A1.E6.96.B9.E3.81.AE.E3.81.9F.E3.82.81.E3.81.AE.E3.82.B9.E3.82.BF.E3.82.A4.E3.83.AB)
［PHP］xamppでmb_send_mail

# 概要
xamppでgmailからメールを送信する際の設定方法です。

# google
１．googleのアカウント設定の「セキュリティ」から２段階認証プロセスをオンにする。
２．２段階認証プロセス画面の一番したにある「アプリパスワード」を設定。
表示されたパスワードを再確認することはできないのでメモしておく。


# xampp
１．\php\php.iniの[mail function]で`sendmail_path`を編集。
php.iniは念のためにバックアップする。
自分はxamppをDドライブに入れているので`"\"D:\xampp\sendmail\sendmail.exe\" -t"`となる。
２．sendmail\sendmail.iniを編集。
```:
smtp_server=smtp.gmail.com
smtp_port=587
auth_username=hoge@gmail.com
auth_password=**** **** **** ****
force_sender=hoge@gmail.com
```
コンポーネントを純粋に保つ




## 純関数とは


純関数とは計算だけを行い、他には何もしない関数


## 目的

・ あらゆる種類の不可解なバグ、予測不可能な挙動を回避する

## 特徴

・自分の仕事に集中する
・同じ入力には同じ出力する
個人的によく使うLaravelのコマンドまとめ


この記事ではLaravelのよく使うコマンドをまとめてみました。

## プロジェクトの作成

Macで開発していてPCにDockerがインストールされていれば、このコマンドでLaravelのプロジェクトを作成することができます。

```
curl -s "https://laravel.build/example-app" | bash
```

## Sail関係のコマンド

LaravelのSailに関連したコマンドです。

### Sailを立ち上げる

```
./vendor/bin/sail up
```

### Sailのコンテナの中に入る

```
./vendor/bin/sail shell
```

### SailのMySQLに接続する
```
./vendor/bin/sail exec mysql mysql -u sail -p
```



## ファイル作成系のコマンド

Laravelのコントローラーやマイグレーションファイルなどを作成するためのコマンドです。

### コントローラー作成

```
php artisan make:controller SampleController
```


### リクエスト作成

```
php artisan make:request SampleRequest
```

### モデル作成

```
php artisan make:model Sample
```


### マイグレーション作成

テーブルを作成する場合の書き方。

```
php artisan make:migration create_samples_table
```

カラムを追加する場合の書き方。

```
php artisan make:migration add_name_to_samples_table
```

### シーダーの作成

```
php artisan make:seeder SampleSeeder
```

### ミドルウェアの作成

```
php artisan make:middleware Sample
```

## マイグレーションやシーダー関係のコマンド

Laravelでマイグレーションやシーダーを実行するためのコマンドです。

### マイグレーション実行

```
php artisan migrate
```

### シーダー実行

```
php artisan db:seed
```

### マイグレーションのやり直し

```
php artisan migrate:fresh
```

### 特定のマイグレーションだけを実行
```
php artisan migrate --path=/database/migrations/202x_xx_xx_xxxxxx_samples.php
```

### 特定のシーダーだけを実行する

```
php artisan db:seed --class=SampleSeeder
```


## キャッシュクリア系のコマンド

Laravelで様々なキャッシュをクリアするためのコマンドです。

### アプリケーションのキャッシュをクリア

```
php artisan cache:clear
```

### 設定のキャッシュをクリア

```
php artisan config:clear
```

### ルートのキャッシュをクリア

```
php artisan route:clear
```


### ビューのキャッシュをクリア

```
php artisan view:clear
```


## テスト関係のコマンド

Laravelのテストに関連するコマンドです。

### テストを実行

```
php artisan test
```

### 指定したテストだけを実行

例えばtests/feature/SampleTest.phpを実行する場合。

```
php artisan test tests/feature/SampleTest.php
```

今回の記事はこれで以上です。
Tableauの散布図の0の位置を常に固定する

## 課題
![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/54628f6c-5118-8ae6-751d-6939837e5413.png)
通常負の値をとる散布図はそれぞれのとる値によって列・行の各軸の表示領域の最大・最小が変わるため、それに伴ってゼロの位置が変わってしまい、フィルターを変更するたびに目線が変わってしまい分析の妨げになる恐れがある。

0を中央に固定する方法を考える。

## 使用する技術
軸の範囲を「自動」に設定しているとき、リファレンスラインをそのグラフのマークの値を超えた値で設定すると、ビューの表示範囲はそのリファレンスラインに合わせて広がる。

![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/521b685e-052e-6d5a-f183-06ae6cfab52a.png)
![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/62b20e0d-ddfa-02be-243a-c63d9183788d.png)

さらに、リファレンスラインの設定で「線」を「なし」に設定することで、何も表示させずに表示領域を自動的に拡張することが可能。
![Untitled (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/e2bbd6bc-86c4-2f05-a4a2-28b8f3de8027.png)
![Untitled (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/3ebf7c8c-2bd9-3e56-18df-0026e049eb91.png)

この仕組みを上下両方に設定します。
## 手順

計算フィールド「表示範囲」を作成。この計算により、正の値、負の値どちらを基準に領域を設定するかを状況に応じて変更できるようにする。

```
IF ABS(SUM([利益]))>ABS(-SUM([利益])) THEN SUM([利益])
ELSE ABS(-SUM([利益]))
END
```
「表示範囲」と「-表示範囲」を詳細に設定する。
![Untitled (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/47365583-77f5-757b-84e5-1bd2ab55b700.png)
リファレンスラインを２つ作成。「表示範囲」の最大値、「‐表示範囲」の最小値を表示するように設定する。
![Untitled (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/96151b5b-76b7-dc40-f311-3eb71f64ebbf.png)
![Untitled (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/8b9cfe0d-f07c-1dbb-cee7-0624fc571e4a.png)

完成。
![Untitled (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/b85d3fb7-1ae4-b476-e19c-2e23bb3d0fe0.png)
![Untitled (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/29dfa7c9-cb9d-6aaa-a86b-18b33ebb74b3.png)
![Untitled (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/9fbe04bc-adba-4bc7-5b0a-c2c20a717fb0.png)

## おわりに
リファレンスラインによる軸範囲の調整はかなり便利なので活用できると色んなビューに対応できるようになるかと思います。是非いろんな場面に活用してみてください。
Tableauのパラメーターが複数選択出来たらなあと思った時はセットの出番

## 悩み
パラメーターで指定したサブカテゴリの全体に対する売上を計算することを考える。
以下の計算フィールドを作成してドーナツグラフを作成する。
```
SUM(
IF [サブカテゴリ]=[パラメーター.サブカテゴリ選択] THEN [売上]
ELSE 0
END)
/
SUM([売上])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/b3aa3c5c-52ae-cd03-e7f3-819cf1ca17c0.png)
このとき、パラメーターは単一選択しかできない。複数選択をするにはどうすればいいかを考える。
## 解決策
LOD計算を使用せずに要件を満たすには、セットを使用すると良い。
セットでチェックされたサブカテゴリを売上の計算に含む、という計算式にすることによって複数選択が実現可能である。

## 手順
「サブカテゴリ」を右クリック→作成→セットを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/cf7776c2-d930-aba7-8be8-fac105355ce4.png)
計算式を以下のように変更する。
```
SUM(
IF [サブカテゴリ]in[サブカテゴリ セット]  THEN [売上]
ELSE 0
END)
/
SUM([売上])
```
ドーナツグラフのワークシートからセットを表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/eeb3e831-5802-d2d6-2341-fca5ce9e4d42.png)
複数選択できるリストから、チェックされたサブカテゴリの売上の合計が全体の何％かを表示することが出来た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687866/a9841fd1-b19e-444f-ffc3-14e3f3ea104e.png)
## 終わりに
分母にLOD計算が使えればこの手順は不要ですが、コンテキストフィルターなどの都合でLOD計算を使用できないという場合もあるかと思うのでセットを活用する手順を紹介しました。
セットは概念が分かりにくいですが便利な機能ではあるので是非活用してみてください。
コンポーネントを純粋に保つ


# [コンポーネントを純粋に保つ](https://ja.react.dev/learn/keeping-components-pure)を読んだ結果


1. 変数を使うな
1. フロントエンドのフレームワークでは、バックエンド処理は書くな
と言われてる気がした
【Java Gold】(1Z0-816-JPN) 合格体験記

## はじめに
Java Goldに合格したので、合格までの過程を記載します。
(取得してから約3か月経ちましたが...)

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438095/915070a3-f423-7731-bd93-0984bc6a9de9.png">



Oracle社が提供しているJava Gold以外のJava資格の合格の記事も書いています。↓

https://qiita.com/tt8811/items/2c01165cb885967bccb8

https://qiita.com/tt8811/items/141858ab7acfe88baa8d

## スペック
* Java Gold合格の約2か月前にJava Silverを取得
* Java開発経験なし

## 使用参考書
* 徹底攻略Java SE 11 Gold問題集［1Z0-816］対応(今回も黒本メイン)
→Goldは出題範囲が広いため、黒本だけでは少し物足りない感じだった
→適宜公式のドキュメントや検索して学習を進めた

## 勉強時間
* 勉強期間はトータルで約3か月程度で、試験間際の2~3週間はフォーカスして勉強した
→初めの1~2か月間はゆっくり勉強していたため、後半詰め詰めになってしまった(反省n回目)
* 平日は1~2時間程度行い、休日は均すと2~3時間でした

## 勉強方法
* 取り合えず黒本は3~4周した
* 関数型インターフェースとストリームAPIに関しては黒本だけでは、足りないと感じドキュメントなどを確認
* chatGPT(無料)を使用して、理解しずらい箇所を「○○を初心者でも理解できるように説明して」などという感じで使用した
→「Java Gold (1Z0-816-JPN) で出題されそうな問題を出して」という感じで聞いてみるとそれっぽい問題が出てくる
※生成される回答が全て正しいとは限らないので注意

### ■黒本のカテゴリ
* カッコ内に自分が受けた時に出題された体感的な割合を、「多い・そこそこ・少ない」で割り振ってみた
1. クラスとインターフェース(多い)
1. 関数型インターフェースとラムダ式(多い)
1. 並列処理(そこそこ)
1. ストリームAPI(多い)
1. 入出力(多い)
1. JDBCによるデータベース連携(そこそこ)
1. 汎用とコレクション(そこそこ)
1. アノテーション(少ない)
1. 例外とアサーション(少ない)
1. ローカライズ(そこそこ)
1. モジュール・システム(少ない)
1. Java SEアプリケーションにおけるセキュアコーディング(そこそこ)
1. 総仕上げ問題

## 学習のポイント
* 取り合えず量をこなし(時間を費やして)知識をインプットする
→正直これが一番重要で大変でした
* 早めに苦手なカテゴリを自己分析して重点的に勉強する
→効率的に合格するには苦手なカテゴリを自己分析して潰していくのが早いです
* 隙間時間を使う 
→学生・社会人...etc 色々な背景の人がいると思いますが、まとめて時間を取れないや長時間勉強できない人は隙間時間がかなり有効です

## 試験当日
* 移動中は [Java SE11 Gold試験に合格したので要点をまとめてみる-Qiita](https://qiita.com/Anest_Doi/items/eebc8d19743330a612ed "") を参考に見直し
* 試験センターにギリギリでついた(反省n回目)
* 最初の5問ぐらいが黒本の系統と違う感じの問題が出題され焦り、中盤は黒本に出題されている感じの問題がちらほら出題され安心
→OracleのJava試験では上記のパターンが多い(体感)
* 回答と見直しを含め、残り時間40分程度残して終了した

## 最後に
Java Goldはかなり範囲が広く難易度も高かったので勉強したことは今後役に立つかと思います。
受験を考えている方で不明なことなど力になれることがあればコメントください。

自分はこれからも新たな資格取得にチャレンジしていきたいと思います
## 参考にしたサイト
* Javaのモジュール 根本理解　※多分2部構成

https://news.mynavi.jp/techplus/article/imajava-4/

* java.util.Function 公式Doc

https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/package-summary.html

* java.util.Function 使い方メモ

https://qiita.com/opengl-8080/items/22c4405a38127ed86a31

* ラムダ式・StreamAPI 根本理解

https://nuxtblog.work/blog/9l3yp4trh/

* Stream/Optional 解説

https://tech.asoview.co.jp/entry/2023/03/16/151427

* コレクションとジェネリクス 解説

https://qiita.com/yoshitaro-yoyo/items/7ce53cc3c01d23108376

* マルチスレッド 解説

https://qiita.com/KenyaSaitoh/items/8ff0a564ada70e3b5ee5
wbrタグを使って文章を改行し、レスポンシブなビューを作る

## レスポンシブデザインで簡単に区切りよく改行したい時

1月にエンジニアとして働き始め、間も無く1ヶ月の新米です。
研修が終わり開発に参画し、画面デザインをしている際のおはなし。
レスポンシブデザインの際にシンプルなコードで簡単に改行出来るものを見つけました。
それがこちらです。
## wbrタグとword-break: keep-all;
これです。実装は超絶簡単。
まず、CSSを書きます。
```CSS:CSS
<style>
  .break-keep-all {
    word-break: keep-all;
  }
</style>
```

で、それを適用させる
```HTML:HTML
<div class="break-keep-all">
  この後ろで改行したい<wbr />ここで改行したい
</div>
```
そうするとこうなる
```HTML:view
この後ろで改行したい
ここで改行したい
```
これで終わりです。
## つまりどういうことかを簡単に説明すると
◆ wbrタグ
テキストが親要素の幅に収まりきらない時、特定の位置で改行するように指示してる
◆ keep-all
単語を途中で分割しないようにしてる

この収まりきらない時ってのがミソです。
要は、改行が必要ない場合は改行されないのです。
画面幅のサイズで改行するかしないか判断してくれます。天才ですね。
この組み合わせで不自然な分割を避けながら特定の位置で改行してくれます。

## 注意点
めっちゃ便利なんですけど、もちろんデメリットもあります。
この指定をするとwbrタグの箇所でしか改行してくれなくなります。
なので、幅がさらに縮んだりしても、wbrタグの場所までは改行してくれません。
ビューが崩れます。ご注意を。

## 最後に
ざっくりとした説明になりましたが、異常がwbrタグを利用したレスポンシブ対応の手順です。
メディアクエリを設定するのめんどい、自分の思った位置で改行させたいって時に便利です。
最後まで読んでいただきありがとうございました。
ITストラテジスト受験の振り返り

# はじめに
SIerと社内SEで10年程度の経験です。
新卒時はSIerでシステム開発していました。
2年ほど前にシステムアーキテクト、1年ほどまえにITストラテジストをとったのですが、正直大きなメリットは感じてません。
ただ、かけたコストとメリットをまとめる目的で記事を書こうと思いました。

# ITストラテジストとは

[ITストラテジスト試験](https://www.ipa.go.jp/shiken/kubun/st.html)は、情報処理推進機構（IPA）が認定する高度情報処理技術者試験の一つ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2431363/928d2d2e-2f41-0c49-bcf2-c61f891111e0.png)

IPAによると以下の人におすすめらしい。

>経営戦略に基づいてIT戦略を策定し、ITを高度に活用した事業革新、業務改革、及び競争優位を獲得する製品・サービスの創出を企画・推進して、ビジネスを成功に導くCIOやCTO、ITコンサルタントを目指す方に最適です。

# 試験内容

| 試験| 時間 | 回答方式 |
|:-:|:-:|:-:|
|午前1|  50分 | 選択式|
|午前2| 40分 | 選択式|
|午後1| 90分| 記述式|
|午後2| 120分| 論文|

* 午前1は高度情報共通の内容。応用情報のような範囲の4択問題が出てくる
    * 応用情報もしくは高度情報の午前1を過去２年以内に合格していれば免除
* 午前2はITストラテジストに関連する４択問題
* 午後1はケースに対する記述問題
* 午後2は前提が記載されたうえで自分の経験をもとに論述

# 学習コスト

以前にシステムアーキテクトで60時間程学習していた。
それに加えて以下の書籍を１周。合計20時間程度。
[ALL IN ONE オールインワン パーフェクトマスター ITストラテジスト](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E3%82%AA%E3%83%BC%E3%83%AB%E3%82%A4%E3%83%B3%E3%83%AF%E3%83%B3-%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC-IT%E3%82%B9%E3%83%88%E3%83%A9%E3%83%86%E3%82%B8%E3%82%B9%E3%83%88-TAC%E3%81%AE%E9%AB%98%E5%BA%A6%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96%E6%9B%B8%E3%81%AF%E3%80%81%E5%8D%88%E5%89%8D%E2%85%A1%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96%E3%82%82%E5%85%85%E5%AE%9F%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99/dp/4300106401/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1PAEU3TLVEXL9&keywords=it%E3%82%B9%E3%83%88%E3%83%A9%E3%83%86%E3%82%B8%E3%82%B9%E3%83%88&qid=1706712219&sprefix=it%E3%81%99%E3%81%A8%E3%82%89%E3%81%A6%E3%81%98%E3%81%99%E3%81%A8%2Caps%2C252&sr=8-1)

この本は簡潔に一通りまとまっていて、かなりおすすめ。
午前2の強化には以下サイトがかなり役に立ちました。

https://ids.information.jp/st/

ただし、この本も他の関連するシリーズも基本的に午前1は範囲外。
午前1は以下サイトで勉強するとよい。

https://www.ap-siken.com/apkakomon.php

# 試験の感想
結論から言うと、この試験は読み書きの正確性と時間との勝負。
<b>知識や経験が十分であれば合格できるわけではない。</b>

試験別にポイントを考えてみる。

|試験|ポイント|
|:-|:-|
|午前1|出題範囲が広いので、対策が大変。ただし、<b>過去問さえを抑えておけば合格ラインの60%近く点数が取れる。</b>|
|午前2|ITストラテジストに関連する問題なうえ、<b>過去問さえ押さえておけば合格ラインの60%近く取れる。</b>|
|午後1|A4 4枚程度の文章に対する記述回答が2問程度あるので<b>読む時間が足りない。</b>ただし、<b>どんな経験のITストラテジストでもとけるよう文章内に回答がある</b>ので、逆に文章さえ理解できれば<b>知識や経験がなくても解ける</b>。|
|午後2|1000文字近くを120分で解くので<b>時間がない。</b>ただ、<b>論文の内容は矛盾さえなければ自分が実際にやってなくてもよい。</b>できる人がやってたことややってそうなことを<b>お題に沿う形で矛盾なくかければ合格できる</b>|

この内容から、以下さえできれば<b>合格するために知識や経験はあまり重要ではない。</b>

* 過去問を何度か解いて内容を知っている
* 日本語文章を時間内に論理的に読み書きできる

# 取得してみた後の感想

上述の通り、本資格を取得してもできる業務が広がるわけでもないため、近視眼的に考えると大したメリットはない。
ただし、この資格が最も良いのは<b>世の中のイメージでは高難度である</b>という点。
それにより
* スキルがあると思ってもらえる
* スキル確保にかなり前向きである

と周りに思ってもらえることが最大のメリット。
結果として転職時の証明になるのは当然だが、既存の仕事の中でも一目置かれるようになり、<b>意見を通しやすくなったり評価に跳ね返ってくるので仕事しやすくなる。</b>
受験料自体も7500円程度で、<b>一度取得すると一生ものなので、
かけた時間に対する業務やキャリアに対するメリットは最終的には大きかったと思う。</b>
そもそもそんなに難しくないので、費用対効果としては良い資格だと思う。

ただ、IPAの試験は全て長すぎる！
そもそも情報処理の試験を手書きでさせる時点でキツいが、
休み時間30分で20分前の着席が求められる。
試験の仕方があまりに前時代的すぎるので改善してほしい・・・
身体が痛くなり、その点が最も苦労した点でした。
Anacondaインストール

# ぶっちゃけ環境構築どうしたらいいのかよくわからん
以前学習してた時はRubyがメインでその時はrailsで主にVScodeでやっていたので困らんかったけど、Pythonは色々ありすぎてどれがいいのかわからないです

## Anacondaインストール
画面通りに進めば基本OK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/fba7b008-a036-869c-c030-5461be987858.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/646d4baf-4c95-4bf0-d75a-926a34fdcc45.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/920559ce-5276-333d-8983-72322a6d2b11.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/45a46822-9fb1-1405-7c0b-61a909735910.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/e8874ddb-8c10-8f65-33c7-521d3d5ccb27.png)

## アップデート
一応、最新版にアップデートしておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/7c453cad-394b-eee3-d2a5-876aa9f2e1eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/766ca609-fbae-9350-c054-436a1952f822.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/f05a3c44-7080-9e92-10bd-426e5b3c9737.png)

## 確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/1af684d9-c0f4-fd7b-68f5-be8fc8c974dc.png)

スタートメニューにある「Anaconda Prompt」を起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/3a4fd832-a9cb-e773-64f4-6601b04e002c.png)

きちんとインストールされていることを確認

## 通常のコマンドプロンプトでもPythonコードを使いたい！

1.Anacondaのインストールディレクトリを確認
Anacondaがインストールされたディレクトリを確認
通常、デフォルトの場合は C:\Users\<ユーザー名>\Anaconda3 または C:\ProgramData\Anaconda3 など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/494d6095-b754-a8f7-4483-67d31d824901.png)

2.環境変数の設定
システムの環境変数にAnacondaのScripts フォルダのパスを追加
Windows 10の場合：
1.スタートメニューから「システム環境変数を編集」を開く
2.「環境変数(N)」ボタンをクリック
3.「システム環境変数」セクションの下にある「Path」を選択して「編集」をクリック
4.「新規」をクリックし、AnacondaのScripts フォルダのパス（通常は C:\Users\<ユーザー名>\Anaconda3\Scripts ）を追加
5.すべてのダイアログを閉じる

これでコマンドプロンプトを開きなおすと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/c705470c-b107-cf50-cc3f-8cf99ec583c2.png)

通常のコマンドプロンプトでもPythonを使えた

更にPowerShellでも使える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680269/06f98b9a-8d20-f70a-b996-b5ac0198673b.png)

つまり環境変数が大切ということ
Copilot Studioの利用制御方法


今回は、Copilot Studioの作成ユーザー、利用ユーザーの利用制御方法についてご紹介します。

# 作成者
Copilot StudioでCopilotを作成する人を制御する場合は、**セキュリティロールを使用した制御**になります。
セキュリティロールの詳細については以下をご参照ください。

https://qiita.com/skuramoto/items/fe305aac24273c7cccbf

作成者は「**環境作成者**」のロールが必要です。
このロールがあると、Copilotを作成、管理し、Power Automateのフローを作成することができます。

また、共同作成者に共有するためには、共有する作成者本人が「**システム管理者**」のロールを持っている必要があります。
（ただし、共有される側にすでに必要な権限（環境作成者やそれに代替するロール）が割り当たっている場合は、この限りではありません。）

::: note
「システム管理者」はセキュリティロールを表示および追加をする権限です。ロールを割り当てる必要がなければこちらのロールは必要ありません。

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/eff9ce87-382e-5af3-0b8c-be4503d28b7a.png)

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/admin-share-bots?tabs=web#assign-environment-security-roles


# 利用者の制御
Copilot Studioを公開した際に、社内で使えるユーザーを制御したいこともあると思います。
こちらはボットを共有する前に認証の設定をオンにすることにより制御をすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/294a9ff9-eddf-eaf2-42e4-7ab2eef2f849.png)

「認証なし」で公開すると社内のユーザー全員に公開されますが、「認証オン」にすると、共有されたセキュリティグループでないとCopilotが表示されません。

::: note
チャットのためにボットを共有する場合、基本的にセキュリティグループを使っての共有の動きになりそうです。
個々のユーザーに直接付与するのは作成権限で、ユーザー用の共有はセキュリティグループという動きのようです。
その為、個々のユーザーアクセスを管理するには、セキュリティグループのユーザーを追加または削除するなどして操作する必要があります。

:::

セキュリティグループで共有して、Teamsのチームメンバーだけに公開するなどもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e4e1c687-c9fa-4530-26b8-6c1f1373060c.png)

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/admin-share-bots?tabs=web
dxlib-for-linux 2023年（+α）の進捗

# （例によって）旧暦になってしまいましたが、今年の進捗

[去年に引き続き](https://qiita.com/dragoon2014/items/7ab2b3695933b7430d53)少しですが追加実装しました。
年明けにアプデがでてたのでそこの対応まで含めます。

# sample12_clipboard

クリップボードの読み書きができるようになりました。
なお読み出し機能に構造上の問題があったのを見つけたので本家に報告しました。
無事修正されたようで良かったです。
[本家DxLibでクリップボード読み出し機能を使っている場合は3.24d以降を使いましょう。](https://qiita.com/dragoon2014/items/5c5630f15a1fa0cedfec)

# Makefile

make時の使い勝手が多少改善されています。
完全ではないですが、makeによる依存性解決がなされるので変更された箇所だけ再ビルドします。
（dxlib-for-linux自体の開発をしない場合はあまり影響ないかも）

# 細かい話

## GetClipboardTextについて

dxlib-for-linuxにおいては技術的制約によって第一引数にNULLを渡すとクリップボードがキャッシュされ、
第一引数に非NULLを渡すとキャッシュが消失します。

```
int len = GetClipboardText(NULL, 0);  // A
char* str = (char*)malloc(len);
GetClipboardText(str, len);  // B
```

すなわちAを呼ばずにBを呼んだり、Bを2度続けて呼ぶことはできません。
本家でもそのような使い方は危険なのでしないと思います。

なお内部的に値をキャッシュしているので、
AとBの間でクリップボードの内容が書き換えられたとしても、
BではAの時点でのクリップボードの内容が出てきます。
同様の理由でAを呼んでBを呼ばないでいると、
その間メモリを確保したままとなります。

また極端ですがGetClipboardTextの戻り値および第二引数DestBufferBytesがそれぞれint型なので、
2GBないし4GB（試してない）を超えるデータは本家同様扱えませんのでご注意ください。

Windowsの場合、クリップボードは共有メモリからいつでも呼び出すことができます（もちろんロック中は不可）が、
Linux（というかX11）の場合、クリップボードの中身を要求して、メッセージに乗せて返すといった挙動をするため、
このような実装となっています。
アクセスされたプロパティ名を記録し、配列として吐き出すオブジェクト

実用性は置いといて、[JavaScriptの`Proxy`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy)で、こんなことできるかなと思ってやってみたもの。

```js
const recorder = new Proxy(() => [], {
  apply: function (target, _thisArg, args) {
    return [...target(), ...args];
  },
  get: function (target, prop) {
    return new Proxy(() => [...target(), prop], this);
  },
});

// アクセスしたプロパティを記録していき、関数として呼ぶと配列を吐く
console.log(
  recorder.hoge.fuga.piyo.hogehoge.hogefuga.hogepiyo.foo.bar.baz.foober.barbaz.foobarbaz[1][2][3]()
);

// ファイルパスを作るとか？
console.log({
  path: recorder['C:\\'].Users.Public.Downloads('somefile.txt').join('\\'),
});

// 丸サ進行
console.log({ chords: recorder.FMaj7.E7.Am7.Gm7.C7() });

```
## 動かしてみる
https://stackblitz.com/edit/stackblitz-starters-hg6gnb?embed=1&file=index.js

## 型をつける
- 一応型をつけました。
    - もうちょっとスマートな書き方がありそうな気がします。
        - できれば`as`を撲滅したい。

```ts
interface CallableProperty {
  (...args: string[]): string[];
  [key: string]: CallableProperty;
}

const recorder = new Proxy<CallableProperty>(
  ((...args: string[]) => args) as CallableProperty,
  {
    apply: function (target, _thisArg, args) {
      return [...target(), ...args];
    },
    get: function (target, prop) {
      return new Proxy(() => [...target(), prop], this);
    },
  }
);
```

## 終わりに
- いつかライブラリを作ったりすることがあれば役に立つことがあるかもしれない。
- `Proxy`はいろいろ悪さできて楽しそうですね。
    - [Vueはこれを使ってリアクティブな値を実現しています。](https://ja.vuejs.org/guide/extras/reactivity-in-depth.html#how-reactivity-works-in-vue)
        - これを知らなかったので、以前ハマったことがあるのですが、それはまた別のお話。
長年苦しんだ日中の眠気の解消方法

### はじめに

こんにちは、私は現在37歳のエンジニアです。
日中の眠気は辛いです。
「設計を考える」「コードを読む」等、脳の処理能力が必要になる作業と襲ってくる眠気との相性が最悪で、意思に反して寝落ちしてしまうこともあります。
そんな時はコーヒーを飲んだり、少し仮眠したりと対処療法で誤魔化してきましたが、やっと対処方法がわかりました。

あくまで私のケースですので人により向き不向きがあると思いますが、この方法で救われる方が居れば幸いです。

### 事象

以下のような症状が20代前半からありました。

* 朝目覚ましが鳴った時間に起きられずスヌーズで30分~１時間くらい二度寝したり、ぼーっとしてからでないと起きられない
* 通勤電車で立ったまま寝落ちしそうになる
* 体がだるい
* 頭が重い（特に眉間の上の辺り）
* 肩甲骨から首にかけて肩こりがひどい
* 仕事中寝落ちしそうになるorしてしまう
* 集中できず、意図せず別の事を考えてしまう
* 余裕が無いため人にやさしくできない
* ネガティブな思考になる
* 必要以上に食事をしてしまう（太る）
* 寝る前にだらだらと起きてしまい寝る時間が1時や2時になってしまう
* 布団に入ると気絶するようにすぐ寝てしまう

### 原因

わかった上で対処したわけではないので仮説ですが、不摂生と老化です。

### 解消方法

* 1日に1回運動をする（風邪とか体調悪い時は無理しない）
  * 10分汗をかくレベルの有酸素運動をする
    * ランニング
    * スポーツジムのエアロバイク
  * 10分程度肩回りの筋トレをする
    * リングフィットの肩こりコース
    * スポーツジムでチェストプレスとラットプルダウンを10回3セットずつ
  * 運動した後はプロテイン飲む
* 食事
  * 間食はナッツ25g~30gに変更
  * 夕食、夜食を食べ過ぎない
* 睡眠
  * 布団に入って目をつぶるタイミングを0時を超えないようにする

### 結果

事象に書いたようなことはほとんどなくなりました。
私としては運動と睡眠がハードル高かったのですが、やり始めたら恩恵の方がでかいので続いております。

運動せずに食事も割と若い時と同じような感じでいたので、体の色々な所が滞っていたのだと思います。

### 参考

* [世界一流エンジニアの思考法](https://amzn.asia/d/4sqReNw)（本）

### 最後に

ここからはポエムなので読まなくても良いですが、
学生の時は資格の勉強を始めると眠気がひどく集中できない。仕事では眠くて作業が進まず、残業したり帰宅してから仕事について考えたり、踏ん張った所でどうにもできないレベルの眠気で眠ってしまい、体調を気遣われたり、もっと早く寝た方が良いのではとアドバイスされたりする自分が情けなくて辛くて、心が折れそうになることも何度かありました。
昼ごはんも炭水化物を取ってしまうと眠気が倍増するので、好きなものを食べられずそれもまたストレスになる。悪循環が本当にひどかったです。それがなくなるだけで幸せです。
DxLib Ver 3.24d以降でのGetClipboardTextの使い方

# TL;DR
**3.24b以前でクリップボード読出機能（GetClipboardText）を使っている場合、3.24dにアプデしてコード修正しましょう。**

# はじめに
DXライブラリのVer 3.24dが年明けまもなく公開されました。
クリップボードの読み出しに使う隠し関数であるGetClipboardText関数がありますが、
このバージョンでメモリ破壊のリスクが修正されたのでアップデートをしましょう。

第2引数が追加されています。

```
-extern int GetClipboardText( TCHAR *DestBuffer )  // 〜3.24b
+extern int GetClipboardText( TCHAR *DestBuffer, int DestBufferBytes DEFAULTPARAM( = -1 ) )  // 3.24d〜
```

# 使い方

```
int len = GetClipboardText(NULL);
char* str = (char*)malloc(len);
// GetClipboardText(str); // もともとの書き方
GetClipboardText(str, len); // 新しい書き方
```

二回目のDestBufferBytesに一回目の戻り値を入れることで、strの確保サイズを上回る書き込みを防ぎます。

# 背景

C言語あるあるですが、不定サイズのメモリ書き込み時には必ずサイズを与えましょう。
タイミングはシビアですが、一回目と二回目の間でクリップボードが拡張された場合、メモリ破壊を起こします。
理論上はブラウザで細工されたサイトを開くだけでも影響を受けえます。
（JavaScriptからクリップボードにアクセス可能なため）

# まとめ

ゲーム用途ではあまり利用されていない機能かもしれませんが、
クリップボードの読み出し機能を利用している場合はライブラリのバージョンアップと対象箇所の修正をしましょう。
Streamlit 1.30.0の新機能紹介

## Streamlitとは

StreamlitはPython向けのWebアプリケーションフレームワークです。  

https://streamlit.io/

Streamlitを使うとフロントエンドの知識ゼロでもデータを可視化するためのWebアプリケーションを簡単に作れます。以下のような機能が特徴。  
- 変数を地の文に書くだけで、GUIに出力される(**マジックコマンド**)
- `st.radio`や`st.text_input`のようなWidget APIを呼び出すだけで、GUIコンポーネントが生成される

## Streamlitの最新バージョン

Streamlitの最新バージョンは[Changelog](https://docs.streamlit.io/library/changelog)で確認できます。  
2024/1/31時点で最新バージョンは1.30.0です。  

https://docs.streamlit.io/library/changelog

1.30.0では次がHighlightsとしてアナウンスされています。  

- st.switch_page
- st.query_params

## st.switch_page

マルチページ対応の機能強化です。  
1.10.0でリリースされたマルチページ対応はサイドバーでページを切り替えるものだったのですが、```st.switch_page```関数でアプリケーションから能動的にページを切り替えられるようになりました。  
例えばボタンを押したときにページを切り替えられますね。

```py:multipage.py
import streamlit as st

# ディレクトリ構成は必ず次のように構成する。pagesはディレクトリ名を変更できない！
# your-repository/
# ├── pages/
# │   ├── page1.py
# │   └── page2.py
# └── multipage.py

if st.button("Home"):
    # 最初のページに切り替える
    st.switch_page("multipage.py")
if st.button("Page 1"):
    # page1.pyに切り替える。なお、サブページは必ずpagesディレクトリに配置する必要がある
    st.switch_page("pages/page1.py")
if st.button("Page 2"):
    # page2.pyに切り替える。なお、サブページは必ずpagesディレクトリに配置する必要がある
    st.switch_page("pages/page2.py")

st.write('Here is mainpage.')
```

![Streamlit switch_page](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/5ec54e31-4196-30cc-197e-9920a33ab3b4.png)

## st.query_params

URLクエリパラメータ対応の正式リリースです。  
これまでは```st.experimental_get_query_params```というexperimentalカテゴリの機能として実装されていました。  

```py:param_check.py
import streamlit as st

# URLクエリパラメータを読み込む
params = st.query_params.to_dict()

# dictとして取得されることを確認する
st.write(params)

# 重複するキー(Repeated keys)に対応するにはキーを指定してget_allする
for key in params.keys():
    values = st.query_params.get_all(key)
    st.write(f'key: {key}')
    st.write(values)
```

次のようにURLクエリパラメータを渡すことができます。  

```url
http://localhost:8501/?first_key=1&second_key=two&third_key=true&third_key=repeated
```

![Streamlit query_params](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/4414a08e-0284-f0bd-71d7-a75f95f9a98c.png)

なお、残念ながら前述のマルチページ対応とは同時に使えません。遷移するときにURLクエリパラメータが消えてしまいます。また、```st.switch_page```でURLクエリパラメータを渡す方法も今のところ用意されていません。残念。  

> Query parameters are cleared when navigating between pages in a multipage app.
Amazon Connect 日本の0800番号から0800番号への発信制限解除申請ができない理由

ジャーニーマン( @beajourneyman )です。今回はフリーコール番号(通話料無料番号)に関して遭遇した少しレアなケースについてのメモです。

# 結論

- Amazon Connect で取得した日本の「0800」番号から「0800」番号への発信制限解除申請はできない。
-「0800」番号の実回線の番号は「050」番号と思われるため「050」番号から「0800」番号への発信自体は電話会社側で制限されておりそもそも架電できない。

# 背景

https://qiita.com/beajourneyman/items/57a662d3b164ea7cb481

日本の携帯電話向けの発信はデフォルトで制限さているため、発信制限を解除する緩和申請が出せます。取得した「0800」番号から「0800」番号へ架電テストをしたところ、発信制限でかかりませんでした。同様に緩和申請が必要なのかと考え、サポートへ緩和申請を行いました。

ご注意：本エントリーの Amazon Connect のコンソールは基本的に「日本語」を選択しております。また、サポートケースを直接起票できない他社提供の請求代行を使っている環境の話しとなります。

# 経過

発進制限解除を申請をしたところ、サポートから以下の情報提供がありました。ただ、発信元は「0800」のフリーコール番号で「050 IP電話」の番号ではありません。

> ※ 各社の「050 IP電話」からフリーコールへの発信は規制されています。
> ※ 各社0AB～J番号からの発信が可能です。0AB～J番号とは03 (東京) や06 (大阪) などで始まる番号のことをいいます。

https://biz.kddi.com/service/free-call/

追加で検証しました。「0800」番号から「050」番号への架電はできました。追加検証を踏まえ再確認したところ、「内部情報なのでご案内できない」と正式回答をいただきました。

動作から発信番号「0800-xxx-xxx」の実回線番号が「050 IP」電話でフリーコール側の制限で架電不可である状態が想定されました。また、電話会社側の制限で架電できないため、そもそも緩和申請を通して発進制限を解除すること自体ができない状態でした。

# 回避策

発信側と受信側の観点で2点あります。

- 発信側の番号として「03」番号を取得して「0800」番号に発信する(サポートからご提案いただいた案)。
- 受信側の番号として「0800」番号以外を設定する。

今回のケースでは架電テストの転送先として「0800」番号を利用しようとして、現象に気が付きました。ただ、架電テストのテスト要件自体は「0800」番号への架電ではなかったため、別の番号へ架電することで回避しました。

架電には上記制限がある点を認識して、テストや本番で急な対処が発生しないようにしましょう。レアケースですがご参考になれば幸いです。

以上です。
StimulusのRouter class、Dispatcher classのプロパティ

# はじめに

以下の記事で、Stimulus アプリケーションの起動時にしていることをまとめました。

https://qiita.com/yasu-sg/items/38f7b3529d0096d68d14

起動時に、`Router` class、`Dispatcher` classのインスタンスを作成して、それぞれのインスタンスで`start`メソッドを実行していることがわかりました。
しかし、それぞれのインスタンスの役割が何であって、なんのために`start`メソッドを実行しているのいまいちわかりませんでした。
調べた限り、それぞれの役割について書かれている記事は見当たりませんでした。
全てのコードを一気に読んで役割を推察するのは難しいです。
なので、少しずつコードを読み解いて、役割を理解していくことにします。
本記事では、それぞれのclassのプロパティを読み解きます。

# `Router` classのプロパティ

以下は、`Router` classのプロパティです。

```ts
readonly application: Application
private modulesByIdentifier: Map<string, Module>
private scopesByIdentifier: Multimap<string, Scope>
private scopeObserver: ScopeObserver
```

`application`は、Stimulus アプリケーション自体です。

`modulesByIdentifier`は`Module` classのインスタンスを値とするマップです。`Module` classの役割は、Stimulus controllerの管理です。１つのStimulus controllerに対して、１つの`Module` classのインスタンスが対応します。`modulesByIdentifier`のキーは、Stimulus controllerの識別子です。

`scopesByIdentifier`の型は`Multimap<string, Scope>` classという型ではありますが、要するに`Map<string, Set<Scope>>`のインスタンスです。`Scope` classは、Stimulus controllerが適用できる範囲を司るclassです。例えば、以下のようにStimulus controllerを指定しているとき、`<div>`要素とその子要素がこのcontrollerの適用範囲です。この範囲を司るのが`Scope` classの役割です。
```html
<div data-controller="modal">
  <button data-modal-target="button">閉じる</button>
</div>
<a href="#">戻る</a>
```

`scopeObserver`は、`Scope` classの全インスタンスの監視を管理するものです。つまり、Stimulus controllerを指定しているすべてのHTML要素の監視を管理しています。


# `Dispatcher` classのプロパティ

以下は、`Dispatcher` classのプロパティです。

```ts
readonly application: Application
private eventListenerMaps: Map<EventTarget, Map<string, EventListener>>
private started: boolean
```

`application`は、Stimulus アプリケーション自体です。

`eventListenerMaps`は、イベントを監視するDOMとイベントリスナーを管理するためのものです。

`started`は、イベントリスナーを設置済みか否かを判別するためのものです。

# おわりに

本記事では、`Router` class、`Dispatcher` classのプロパティを読み解きました。その結果、それぞれのclassの役割がなんとなくわかってきました。おそらく、以下のような感じだと思います。

- `Router`: Stimulus controllerを管理し、それが適用されているDOMを監視する
- `Dispatcher`: Stimulus controllerが適用されているDOM内のイベントに対して、Stimulus controllerのActionを実行させる

なんとなく役割はわかってきたのですが、いまいち全貌がわかりません。なので、今後はclass同士の依存関係を明らかにして、役割の輪郭をはっきりさせようと思います。
Prismaでcreateしたときに身に覚えのないUnique制約エラーが発生した件

# はじめに
PrismaにてCreateを行った際、UniqueKeyが重複していないのにUnique制約エラーが発生しました。

# 環境
- Docker
- PostgreSQL
- TypeScript
- nest.js
- Table定義
```
model User {
  id                                         Int        @default(autoincrement())                         
  type                                       Type
  name                                       String

  @@unique(fields: [name, deliveryType])
}
```

# エラーが発生するコード
以下のコードを実行するとエラーが発生する。
DBも確認したが、UniqueKeyの重複はなかった。
```
export const UserList: User[] = [
  {
    id: 1,
    type: Type.Hoge,
    name: '山田',
  },
  {
    id: 1,
    type: Type.Huga,
    name: '田山',
  },
];


for (const user of UserList) {
   await prisma.user.create({
      data:user
    });
}
```


# 原因と解決策
CreateやUpsertするときにIDを指定すると、idの自動インクリメントが狂います。
https://github.com/prisma/prisma/discussions/5256

idを指定しないよう修正したのが以下です。
```
export const UserList: User[] = [
  {
    id: 1,
    type: Type.Hoge,
    name: '山田',
  },
  {
    id: 1,
    type: Type.Huga,
    name: '田山',
  },
];


for (const user of UserList) {
await prisma.user.create({
  data: {
    name: user.name,
    deliveryType: user.type,
  },
});
}
```

# おわり
上記により、手動での検証では問題がないのに自動テストの時だけエラーとなる現象が発生していました。
挙動が変わることを知らず、はまりました。
文字コードとは

仕事で文字コードについて調べることがあったので少しまとめてみます。

文字コードとは、PC上で文字を扱うために、文字・記号に割り当てられた固有の番号のことです。

主なものでは
JIS(ジス)は、JIS(日本工業規格)が定めた情報交換用の文字コードのことで、日本語で送受信する際の標準規格です。
Unicode(ユニコード)は、WindowsやJava、XMLなどで使用されている文字コードです。
Unicodeの種類の1つとしてUTF-8が存在しています。

文字コードが異なることによる影響は、例えばWindowsからのメールがMacで文字化けするのは文字コードが異なっていたためだそうです。
(私はWindowsしか使ったことなかったので知らなかったですが)


文字コードを知る方法としてExcelの関数がありますので2つ紹介します。

CODE関数は、文字列の先頭の文字を文字コードに変換します。
文字列が半角の場合はASCIIコードに、文字列が全角の場合はJISコードに変換します。

UNICOD関数は、文字列の先頭の文字をUnicode値(10進数)に変換します。
Unicode値(16進数)とは異なる注意が必要です。16進数のUnicodeにしたい場合はさらに10進数を16進数に変換する必要があります。

上記以外にもネットで検索すれば文字コードが判明する場合もあります。
【エラー対応】Next.jsとPrismaでSupabaseに繋いだら「PrismaClientInitizationError:」が出た

# 背景
Next.jsで個人開発しているカレンダーアプリにアクセスすると500エラーが返ってきた。
VercelでLogsを見ると以下のエラー文があった。
```
PrismaClientInitizationError:
invalid prisma.event.findMany() invocation:
```

<details><summary>エラー文のスクショ</summary>

![スクリーンショット 2024-01-31 18.54.24_Qiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/841ece3c-ded4-af65-241e-9889effcb488.png)



</details>



# やったこと
## 1. ローカルでTable plusを使って新しい接続URLのsupabaseに繋げにいけるかを確認
* Host名、User名、Port番号が変更されていた。

* supabase の Dashboard > プロジェクト名 > Project Settings > Database の Connection parameters を見ながら、Table PlusにDBを新規作成して入力 → 「Test」クリック

* 緑色になったので接続を確認できた。

<details><summary>スクショ</summary>

![スクリーンショット 2024-01-31 18.49.12_Qiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/43d6c251-a77f-1f0a-079d-3fa98a7ad508.png)

</details>



## 2. VercelのDB接続設定（環境変数）を更新
Settings > Environment Variables > DATABASE_URL の「・・・」 > 「Edit」
DATABASE_URLを新しく変更されたものに更新する。

しかし、そのままだと別のエラー文（`PrismaClientUnknownRequestError:`）が出るので、**末尾に `?pgbouncer=true&connection_limit=1` を追記する**。

* 変更前DATABASE_URL
```
postgresql://[db-user]:[db-password]@db.[project-ref].supabase.co:5432/[db-name]
```


* 変更後DATABASE_URL
```
postgres://[db-user]:[db-password]@aws-0-[aws-region].pooler.supabase.com:6543/[db-name]?pgbouncer=true&connection_limit=1
```


<details><summary>スクショ</summary>

![スクリーンショット 2024-01-31 18.59.01_Qiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/cd7494af-2db8-b591-899c-9ac3ecbd53d5.png)

</details>


## 3. リデプロイをする
無事、サイトにアクセスできるようになった。

# 反省
去年の秋から継続してsupabaseから接続文字列の更新メールが来ていたのに、内容を見ずスルーしていた。今後、翻訳して内容を確認する癖をつけたい。

# 参考サイト
* [PGBouncer and IPv4 Deprecation · supabase · Discussion #17817](https://github.com/orgs/supabase/discussions/17817)
* [【Prisma】Supabaseの接続でSupavisor対応してみた。 #Next.js - Qiita](https://qiita.com/r1ku0ka/items/252a95142607be5ed7a7)
* [Prisma \| Works With Supabase](https://supabase.com/partners/integrations/prisma)
【アカウント作成なし】HDFViewをダウンロードする方法

## 普通にやると

アカウントを作成してログインする必要があります。
フリーで使えることに感謝して、皆さんアカウントを作成して入手しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665667/1f52c179-ce67-d9ce-ba3c-a8c47390d97a.png)

## 諸事情でアカウントを作りたくない方へ

<details><summary>こちら</summary>

1. [The HDF Group のポータルサイト](https://portal.hdfgroup.org/)で、Dwonloadsの項へ行く
2. HDFView 3.3.1（現在の最新版）をクリックする
3. Pre-built binaries をクリックする
4. 一覧があるので、自分の環境にあったインストーラを入手する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665667/e930f6fe-4aa3-0ec3-dddf-b6bccf6800a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665667/294785a3-aad7-d5f2-c66c-08dc7e7646b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665667/03ed04ab-a86d-07e3-5548-018de32593da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665667/1d7fd88f-e5bd-d776-e9d9-3f41e8e352f0.png)
</details>
エンジニア歴3年を迎えての初期との比較

当記事の概要はタイトルのとおりです。

あまりポエム系記事は書いたことがないのですが、エンジニアになって3年経っていたので一つの節目としてポエってみようと思います。





## 略歴

私のエンジニア歴をざっと載せます。





### 案件1（1年3ヶ月）

某企業様の販売管理システムの保守・改修を担当させていただいたのが最初の案件でした。

最後の3ヶ月は上記保守・改修と並行して、とあるサービス上で動作するWebアプリの開発・改修も経験しました。ただ、その実態はアプリの要件に応じたAPIを呼び出す、ちょっとしたJavaScriptコードを書くだけという感じのタスクでしたので「Webアプリの開発・改修経験があります！」とは口が裂けても言えません。





### 案件2（1年9ヶ月）

次に経験したのが、とある企業様の商品売買契約情報管理システムの開発・改修でした。

事実上の、初めての開発・改修案件ということもあり多くのことを学べました。特に設計とテスト周りについては、それまでまったく意識したことがなかったので大変勉強になりました。





### 案件3（4ヶ月）

現在参画させていただいているのが3つ目の案件です。

2つ目の案件と同様に開発・改修系のタスクを担当させていただいています。





## キャリア初期と現在とのいろいろな違い

エンジニア歴1年未満の時分と現在とで、エンジニアという職業・仕事内容に対して見方が変わったところ、変わらなかったところがあります。

そのあたりをつらつらと書いてみようと思います。





### 仕事は常に楽しい

仕事は常に楽しいです。エンジニアという職業・仕事自体に不満をもったことは一度もありません。今後どうなるかは分かりませんが、少なくとも現時点では天職そのものです。

なぜ不満を感じないのか考えてみたのですが、エンジニアという職業の嫌われるところが私に刺さっていないのが大きいと思います。新しい技術を学ぶのは楽しいですし、エラーが出ても直せばよいだけですし、仕様が変わって作り直しになっても作り直せば済む話ですし……ほかにもいろいろありますが、巷の「エンジニアという職業における嫌なところ」のほとんどは気になりません。





### 実装以外にも興味が出てきた

エンジニアになって1年半くらい――2つ目の案件に参画して3ヶ月が経ったくらいまでは実装にしか興味がありませんでした。いかに綺麗なコードを書くか、読みやすいコードを書くか、スマートな処理にするか、そんなことばかり考えていました。

ただ、2つ目の案件でテスト工程をちゃんと経験したことで考えが変わってきました。

当たり前のことではありますが、どんなに綺麗なコードを書いたとしても、そのコードが要件どおりになっていなければそれは「綺麗だけどダメなコード」なんです。この気づきから、私のなかで「綺麗なコードを書きたい」から「良いプログラムを作りたい」に意識が変化しました。

ここでテストの重要性を実感できたのは良かったのですが、まぁ、それでもテスト自体は今でも好きではありません。他人が作ったプログラムをテストするのはまだ楽しいのですが、自分が作ったプログラムを自分でテストするのは「一度クリアしたゲームの2周目をプレイする」ような感じがして、かなりストレスです。

それから3ヶ月か半年経ったくらいには要件定義や設計にも興味が出てきました。このあたりから綺麗なコードはシステムの複雑化を「抑える」ことはできても「止める」ことはできないということに気づき始めました。例えば、エンジニア歴1年の駆け出しエンジニアが作った10命令ぶんのシステムと、エンジニア歴50年のスーパーウルトラエンジニアが作った1,000,000,000命令ぶんのシステムとでは、圧倒的に前者のほうが保守・改修が容易です。

もちろん、綺麗なコードを書くことは相変わらず大事です。ただ、それだけでなく要件定義・設計の段階から、そのシステムの用途や目的・仕様をハッキリとさせ、のちのち改修したりすることがあっても改修担当者が混乱しないようなシステム構造にしておかないといけないな、と思ったのです。





### どう作るかよりも何がしたいのか

なにかタスクが振られたとき、かつての私は「どう実装しようか」「どう作業しようか」ということが真っ先に思い浮かぶ人間でした。

それが今では「何を目的としたタスクなのか」「何をもって『作業完了』なのか」ということを真っ先に考えるようになりました。

こうした変化が生じた要因はいくつか思いつくのですが、たぶん最も比重が大きいのは「良い意味で、実装にある程度飽きた」ことにあると思っています。

私は今でも実装という作業が好きです。小さい頃にレゴブロックで遊んでいたときを思い出します。ブロックをくっつけて飛行機や宇宙船を作っていたあのときのように、コードを書いていって1つのシステムを作る――その流れが今でも好きです。

ただ、エンジニアに成りたての頃よりも実装に対する熱は弱くなりました。それは上でも述べたように、良いシステムを作るには実装だけでなく要件定義・設計・テストも大事であるということに気づいたことも大きいのでしょうが、あるていど実装してきたので慣れた・飽きたということに尽きるのｄせよう。

しかし、その飽きが良い方向に繋がっていると感じています。駆け出しの段階では見えていなかった「作業の目的」「作業の背景」そういったところに意識を向けられるようになったからです。





### 明確、かつ主体的なコミュニケーション

プロジェクトメンバーとのコミュニケーション方法もエンジニア初期と現在とでは違いがあります。

まず、あいまいな表現に気を付けるようになりました。「～のような状態です」「～だと思われます」よりも「～です」「～かは分かりません」といった表現を意識的に使うようにしています。理由はシンプルで伝わりやすいからですね。

また、タスクからタスクへ移行するときに、以前は「Aが完了しましたのでBに移ろうと思いますがよろしいでしょうか？」という質問をしていましたが、現在は「Aが完了しましたのでBに移ります」という意思表示というかたちを採るように意識しています。前者も後者も私の認識に問題があれば突っ込みが入ります。くわえて、前者の場合は問題が無くても誰かが私の問いかけに対して返答をする必要があります。その返答のコストが気になって、今のようなスタイルになりました。

……と書いてみましたが、なんだかこの項目については上手に言語化できていない気がします。また、どこかで「エンジニアにとっての良いコミュニケーションとは」みたいなタイトルで自分の考えを整理しつつ記事化してみたいですね。
javascript someメソッドについて

## someメソッドとは
配列に対して用意されているメソッド
要素の中身がtrueのものが1つでもあればtrueを返す

```
user = 'Alice'
names = ['Bob', 'Alice', 'Hanako']

names.some(name => name === user)
 →true
```

## everyメソッドもある
everyは文字通り、全てがtrueになったものに対しtrueを返す
```
user = 'Alice'
names = ['Bob', 'Alice', 'Hanako']

names.every(name => name === user)
 →false

one = 1
nums = [1, 1, 1]

nums.every(num => num === one)
 →true
```
数値モデルシミュレーションの結果をバイナリデータからテキスト（.txt）で出したい

数値モデルシミュレーションの結果をテキスト（.txt）で出したい時の手順


# バイナリファイルからデータを読み取り
~~~
import numpy as np 
fld = np.fromfile('「取り出したいデータ」.bin', 'float32').reshape(366, 180 * 4, 360 * 4)
~~~

# テキストファイルにデータを保存
~~~
np.savetxt('「取り出したいデータ」.txt', fld.flatten())
~~~

これにより、バイナリ形式から読み取ったデータ fld をnp.savetxtを使用してテキストファイルに保存できます。ただし、バイナリ形式のデータを完全にテキスト形式で保存することは、元のバイナリ形式と同じ精度を保つことができない場合があります。データ形式やサイズによっては、ファイルサイズが非常に大きくなることもありますので、ご注意ください。


上記のPythonコードは、バイナリ形式のシミュレーション結果（xxxxx.bin）を読み取り、NumPyを使用してデータを3次元配列に変形し、それを可視化しています。

同じシミュレーション結果をテキスト形式で保存する方法としては、Pythonのnp.savetxtを使用することができます。以下はその例です.

### 保存されたデータの保存先

保存されたデータは、指定されたパスに保存されます。例えば指定したい時は以下のコードを実行しましょう。

~~~
np.savetxt('xxxx.txt', fld.flatten()) oooooooo
~~~
ここで、xxxx.txt はテキスト形式で保存されたデータファイルであり、指定されたパス[oooooooo]に保存されます。

## fld.flatten()の意味

fld.flatten() は、NumPyの多次元配列（ここでは fld）を1次元の配列に変換するメソッドです。元の多次元配列のすべての要素を1次元の配列に並べます。これにより、データを1つの行にフラット化することができます。その後、np.savetxt を使ってこの1次元の配列をテキストファイルとして保存することができます。


### ２次元に配列することの違いとメリットデメリット、どういうときに使うか

多次元配列を1次元に変換すること（flatten() を使うこと）と、逆に1次元の配列を多次元配列に戻すこと（reshape を使うこと）にはいくつかの違いと使いどころがあります。

**flatten() の特徴：**
メリット：
フラットなデータ構造：多次元配列を1次元の配列にフラット化するので、単純で扱いやすいデータ構造に変換できます。
直感的な操作：1次元の配列なので、標準的な配列操作や処理が適用しやすくなります。
デメリット：
元の形状を失う：多次元の情報を失って1次元に変換されるため、元の形状を復元することができません。
リソースの無駄使い：新たな1次元のコピーを作成するため、元の多次元配列とは別のメモリ領域を使用します。

**reshape() の特徴：**
メリット：
形状を変更できる：データの形状を変更できるため、特定の形状や次元を持つデータ構造に変換できます。
メモリ使用量の最適化：1次元の配列から多次元配列に戻す場合、新しい形状でデータを参照できますが、新しいコピーは作成されません。
デメリット：
形状の整合性：形状を変更するときに、元の要素数と一致しない形状を指定するとエラーが発生することがあります。
多次元配列への復元が必要な場合：1次元配列から多次元配列に戻す場合は reshape を使いますが、1次元化されたデータが必要な場合は flatten を使用します。
使いどころ：
flatten() の使いどころ：データを1次元化し、そのまま1次元のリストやベクトルとして使用したい場合に有用です。例えば、機械学習の特徴行列のような入力データの前処理で使われることがあります。
reshape() の使いどころ：多次元のデータを特定の形状に整える必要がある場合に便利です。例えば、画像処理における画像の形状変換などがあります。

# 結構出すのに時間がかかる

データにもよりますが、地図なんかでシミュレーション結果を図示できるようなものをやったら１５分かかりました。

もしグローバル地図のシミュレーション結果を出しているなら一部地域に絞るなどして縮小させることが近道。