OmniAICreator/Qiita-1.07M huggingface dataset:
Brightの使い方　〜スキルの分析〜


Brightのことはこのページで確認してください

https://bright-fun.org/

このBrightはElixirで作られています

# マイページ
「マイページ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/f2f8d4ea-7bb6-e41f-2698-4d5c558915b0.png)

## 「他者と比較」してみよう
「他者と比較」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/8bb00645-02ca-fe1d-d99c-a7a700a05e85.png)

比較の対象（目標者）をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/be69e52f-e259-90bd-09c8-0bc288cd0008.png)

紫の部分が比較の対象（目標者）になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/c36a6847-29c1-c23d-3c1e-402ce5958ce5.png)


比較の対象（目標者）は☓で解除できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/13a96fbb-3502-4b94-2c1f-eaa1f505d321.png)

## 過去の自分と比較してみよう
「自分と比較」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/f34d1666-0c03-0b4b-0d3b-b279c667bccd.png)

過去の日付をクリック
ジェムの内側は過去の自分です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/baa80999-65db-cd73-9f8a-0cb03314e869.png)

「自分と比較」は☓で解除できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/1dfc2ccf-0997-807a-7407-ff4187d2c0e5.png)

## 自分の苦手な部分を分析しよう
「あと20%でベテランになれます。ベテランまでのスキル数22個」の部分で次の目標がわかります
僕の場合はジェムから「インフラ構築/操作」が弱いのがわかるので
「インフラ構築/操作」のリンクをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/d2ab33e3-5e08-9cec-9b9c-7ed98909b0e6.png)

スキルパネルの「インフラ構築/操作」に飛びました
ここで▲と-の部分の勉強の計画を立てるとします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/53b358b0-90c3-8f7e-ce2d-9203cb860bd7.png)

以上
Node.js 日時のフォーマット・妥当性チェック

# 日時の妥当性チェックしなくていいの？

ユーザーから送られてきたリクエストボディの日時のフォーマットを正規表現を用いてチェックする機能を追加したときに頂いたコメント。

確かに正規表現だけだと`2月30日`を`false`にすることやうるう年の判断が出来ない。
機能を追加しなければ!と調べた結果を忘れないようにまとめます。

### 前提
今回のリクエストボディは`YYYY/MM/DD HH:mm`の形式で送られてきます。
そのため日付のフォーマットが`/`区切りになっているかの判断も重要になってきます。
※今回実装している機能がリクエストボディの日付を外部APIに連携し、外部APIの指定で`/`区切りとなっているためリクエスト時点でこのフォーマットにして欲しいためフォーマットも固定にしております。

### Moment.isValid()
まず最初に見つけた方法は、`moment`パッケージに規定されているisValid関数を用いた方法。
参考にさせていただいた[stackOverflow](https://ja.stackoverflow.com/questions/68413/moment-isvalid%E3%81%A7%E3%81%AE24%E6%99%8200%E5%88%8600%E7%A7%92%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

しかし上記のサイトでも記載があるように`moment.isValid()`は`24:00`でも妥当(`true`)と返してしまう。
そのため、`2024/01/01 24:00`と`01/02 00:00`がどちらも`true`になるが同じ日時を表すのに複数の表現があるのはよくない。
そのため、`moment.isValid()`を呼び出す前にフォーマットチェックと日時チェックを行うように実装。
```Node.js
let result;
const pattern = /^[0-9]{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01]) ([01][0-9]|2[0-3]):[0-5][0-9]$/g;
// フォーマットチェック
result = pattern.test(文字列の日付);

// 妥当性チェック
result = moment(文字列の日付, 'YYYY/MM/DD HH:mm', true).isValid();
```
妥当性チェックの部分でもフォーマットチェックを行っているため冗長。
`24:00`の動きを伝えても違う方法を見つけるようにとコメントをいただき再検討。

### MomentでMomentオブジェクトに変換して再度文字列に変換した結果の比較
隣の方に相談すると昔こんな感じで実装したよと天の一声。

```Node.js
const result = moment(文字列の日付, 'YYYY/MM/DD HH:mm').format('YYYY/MM/DD HH:mm') === 文字列の日付;
```
これで動かすと`2024/01/01 24:00`はコンストラクタの時点で`2024/01/02 00:00`と同じ値に変換され、`format`で変換すると`2024/01/02 00:00`と表示される!
うるう年も対応してるし、元々の文字列の日付と比較するため元々の日付が`2024-01-01 12:00`だったら`moment`で変換した後の日付`2024/01/01 12:00`と一致しないためフォーマットチェックもできる!
(momentを使うのは非推奨だけど既存実装で使ってるからええやろ。。。)
もろたで工藤!!

「Moment使うのいまいち」
。。。

次!!(泣)

(MomentはMoment自体が使用しないようにホームページにも載せているため新規実装の場合は選んだらいけなさそう
 https://momentjs.com/)

 ### date-and-time.isValid()
 最終的に教えていただいたのは`date-and-time`パッケージの`isValid()`。
 ([date-and-time](https://www.npmjs.com/package/date-and-time))
 実装コードは以下になりました。
 ```Node.js
 const date = require('date-and-time');
 const result = data.isValid(文字列の日付, 'YYYY/MM/DD HH:mm');
 ```
 これで非推奨パッケージを利用せずフォーマットチェックと妥当性チェックを1行で行えるようになりました。

 ### 他記事でよく見た実装
 今回の対応で調べているときに妥当性チェックとタイトルにあっても実際はフォーマットチェックしかしていなかったり、`isNaN`を用いてる実装を見ましたがうまく動くものがなくて困っていたため記事にしてみました。

日々学びがある毎日に感謝しながらも毎回頭を抱える日々笑
macOSでphpコマンドを使用できるようにする

# 前提
homebrewをインストールしてあること

# 現状
```
$ php -v
zsh: command not found: php
```
command not found: phpと出ます。

# やり方
下記コマンドを実行し、homebrewを最新化
```
brew upgrade
```
下記コマンドを実行し、PHPを手動でインストールする。
```
brew install php
```

下記コマンドを実行し、PHPのversionとコマンドを使用できることを確認
```
php -v

PHP 8.3.7 (cli) (built: May  7 2024 16:35:26) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.7, Copyright (c), by Zend Technologies
```

PHPはほとんどのmacOSシステムにプリインストールされているため、通常は手動でインストールする必要はないそうですが、どうしても必要な場合はお試しください。
シン・言語化入門

# はじめに
「話が噛み合わない」や「会話が平行線を辿っている」といった状況を経験されたことのある方は居ますでしょうか？
私は何度もあります。

実際の経験としては、自身と他の誰かとの会話というよりは、他の誰か同士（仮にAさんBさん）の間で問題が生じてるといった場面に遭遇した経験が多いという形です。

こういった時、「言語化がうまくないから失敗した」や「言語化が苦手」のようにまとめてしまう事を見かけて、一因としては分かるものの本当にそうなんだろうか？と疑問に感じる部分が多いため、改めて深掘って考えてみたいと思いました。

:::note info
記事タイトル接頭辞の「シン」は、庵野秀明監督作品のオマージュで、特に深い意味はありません。
ただ使いたかっただけです。
:::


# 自己紹介
[わたし](https://inside.dmm.com/entry/2020/08/06/yondemasu07)は、[合同会社DMM.com](https://dmm-corp.com/company/)で[二次元事業のエンジニアリングマネジメント](https://www.geekly.co.jp/column/cat-geeklycolumn/interview_dmm_dojinservice/)に携わっています。
過去に[通信不確実性に関する話題で登壇発表した内容がログミーTechさんで記事になった](https://logmi.jp/tech/articles/327232)りもしました。


# 「コミュニケーションが取りやすい」と感じることの正体

私は普段から、話が分かりやすい・話をし易いと言って頂けることが比較的多いです。
実は、意識している秘伝のコツがありまして。

それは、会話をする相手にとって**予測可能な状態を保つ**ことです。

これだけだと少し分かりづらいかも知れないので、順を追って詳しく説明したいと思います。


# 意味が先、言葉が後
我々の祖先が「言語」を使い始めたのは、紀元前5万年頃と言われています。
文字が確立する前なので、口頭での話す言葉ですね。

ヒトは集団（群れ）で生活してきた社会的動物なので、言語が出来上がる前から自分以外の他者との意思疎通を何らかの形でやってきたことでしょう。

また、「ノンバーバル（非言語）コミュニケーション」という用語も存在します。
身振り手振りなどの身体の動きや、アイコンタクトを含む顔の表情によって、怒っている・喜んでいる・驚いているなどが読み取れます。
特定の方角を指さすことで、その方向への注意を促し先導したり、手拍子でリズムを刻むことで集団の祭りや活動へ一緒に参加している感覚があることでしょう。

このような現象を、ここまで文字（言葉）で表してきましたが、実際には文字や言葉が無い時代から現代まで存在するものなので、言葉よりも「意味が先」と言っています。


# 言語は、道具の1つである
我々の祖先が「道具」を使い始めたのは、紀元前500万年頃と言われており、最初の道具は何も加工していない石や木の棒だったと言われています。
※現代の鳥類であるカラスが上手に石を使っている動画があったりもするので、動物としてはもっと前から使えているかもですが。

進化の歴史の中で「道具を使う」という記憶が遺伝子レベルで言語よりも深く刻まれているはずなので、言語は道具の一種だと捉えているのではないかと考えています。


# 道具は、達成したい目的のために使っている
石を使う時は、1例として木の実を割る時など手で直接叩くと痛くて硬いものを壊す目的が考えられます。
木の棒を使う時は、1例として自分の手の長さだけでは届かない所にあるものを取ったり、毒を持っている生物から距離をとりつつ追い払う目的が考えられます。

この様に用途（使い方）がある程度限定されているものは分かり易いと思います。

では「何にでも使えるもの」は、どのような目的が考えられるでしょうか？


# 文脈や状況に依存する。だからこそ
前置きが長くなり失礼しました。「予測可能な状態」の説明です。

言語は、何にでも使える道具です。
さらに言い換えると、色々な意味を持たせることができる道具です。

ここまでの間に「言葉が後、意味が先」だと言いました。
なので、ヒトは言語（他者が使う道具）に対しての向き合い方として「これは、どんな意味があるのか？」をずっと考え続けて（認知しようとして）いるのです。

ヒトにとって一番苦痛を感じるのは、意味が理解できない時です。
ある一定時間内に意味が理解できない場合、興味を失ってしまうか、理解しようとして脳がフル稼働するため凄くエネルギーを消費してしまう（疲れたと感じさせる）ことになります。
エネルギーが切れてしまうと、いわゆる集中力が途切れる状態になるので、どのような言葉を発したとしても受け取れない状態になります。

この、苦痛を感じたり集中力が途切れる状態を生まないことが秘伝のコツです。
つまり「予測可能」とは「意味が理解しやすい」ことを指しています。


# 何がしたいのか分からない、何が言いたいのか分からない
これまで「意味」と表現してきた部分には「意図」も含んでいます。
つまり、話者が自身だった際に「どんな目的をもって話そうとしているのか」という意図のことです。

報連相は、報告・連絡・相談の意味ですが「進捗状況の報告」と「懸案事項の相談」だと目的が全く異なるため、話を受けた側は**最初に目的を伝えてもらえていないと、これから話そうとしている内容を予測できない**ため、ずっと意味・意図を探ろうとする訳です。

もし「考えがまとまっていない」と言われてしまう方の場合は、自分が何を目的として話をしたいのかを一言で表現できるレベルまで準備（自身の考えを整理）できていないことが多いのではないかと思います。

会議におけるアジェンダの準備も凄く大事ですね。


# 明確な目的を持ってからが、言語化のスタートライン
誤解の無いように改めて表現すると、ここでいう目的は、言語化スキルを高めるための目的では無く、他者に話をする時々において自分が達成したい目的のことです。

話をする時の達成したい目的は、以下のように色々あると思います。
* 助けて欲しい。何故なら困っているから
* 愚痴を聞いて欲しい。何故なら気分を害したから
* 教えて欲しい。何故なら自分で調べたけど見つからないから
* ご飯が食べたい。何故ならお腹が空いたから
* 早く解決して欲しい。何故なら顧客からクレームが入っているから

「言語化」というと、どのような言葉を用いれば良いのかというような言葉の使い方に考えが偏ってしまう方は居ませんでしょうか？
もちろん、適切な表現の言葉を適切なタイミングで使用することは凄く重要なのですが、その手前の段階として、**ハッキリと求めていることを最初に伝えられているか**を今一度考えてみていただくことが第一歩だと思っています。

細かい言葉使いよりも、伝える順番を意識することが肝心です。


# さいごに
「言語化」というと、抽象・具体の行き来や情報整理がテーマに掲げられることが多かったり、思っていることを言葉にする・モヤモヤした感情を言葉にするといったテーマになることが多いように感じていたので、別の観点での考えを入門編としてまとめてみました。


# 参考書籍
* 情報の歴史21: 象形文字から仮想現実まで
【Python】「FileExistsError: [Errno 17] File exists: 'xxx'」エラーには`exist_ok=True`オプションを

# エラー内容
Pythonアプリで以下のエラーが発生。

> FileExistsError: [Errno 17] File exists: 'loggings'

# 原因と解決方法

BEFORE:

```py
import os

os.makedirs("loggings")

# FileExistsError: [Errno 17] File exists: 'loggings'
```

AFTER:

```py
import os

os.makedirs("loggings", exist_ok=True)
```


`os.makedirs`関数は、既に存在するディレクトリを作成しようとすると`FileExistsError`を発生させる。

これを防ぐためには、`os.makedirs`関数の`exist_ok`パラメータを`True`に設定すると良いです。デフォルトでは`False`になっています。

`True`にすると、ディレクトリが既に存在していてもエラーが発生せず、ディレクトリが存在しない場合のみ新たに作成されるようになりました。
Laravelのキャッシュについて

## キャッシュとは
動作を高速化するため利用されます。

## キャッシュの作り方
例えば、`config`ディレクトリにある設定ファイルのキャッシュを作成する場合
```bash
php artisan config:cache
```

を実行することで作成されます。
他にもルートのキャッシュやviewのキャッシュなど、様々な種類があります。

## 何が起きているのか
上記のコマンドでキャッシュ作成コマンドが実行されると
`/bootstrap/cache/config.php`
というファイルが作成されます。これこそがキャッシュの正体です。

このファイルの中身は、主に`config`ディレクトリ内のファイルの中身が**全て纏められたもの**であり、このファイルが作られると今後はこの設定を参照するようになります。


```
.
├── app
├── bootstrap/
│   ├── cache/
│       ├── config.php　←キャッシュファイル
│       ├── ...
├── config/  ←このディレクトリの中身全てが纏められる
│   ├── app.php
│   ├── broadcasting.php
│   ├── cors.php
│   ├── filesystems.php
│   ├── logging.php
│   ├── queue.php
│   ├── services.php
│   ├── view.php
│   ├── auth.php
│   ├── cache.php
│   ├── database.php
│   ├── hashing.php
│   ├── mail.php
│   ├── sanctum.php
│   └── session.php
├── database
└── ...
```



例えば、`/config/app.php`の中に
```php
'name' => env('APP_NAME', 'Laravel'),
```
という記述があると思いますが、キャッシュファイルを作った後にここを編集しても、その変更は反映されません。代わりに、キャッシュファイルの
```php
<?php return array(
    'app' => array(
        'name' => 'Laravel',
        'env' => 'local',
        ...
```
の`'Laravel'`部分を直接編集すると、その値が反映されます。

## envとの関係性
Laravelには
```php
env('AAA', 'bbb');
```
という関数があります。
第一引数のキーが.envに設定されてあればそちらを。なければ第二引数を返します。
こちら、キャッシュファイルが作成されると、.envファイルがロードされなくなってしまい、全てnullが返ってくるようになってしまいます。

## キャッシュの消し方
```bash
php artisan config:clear
```
これを実行することで、キャッシュが削除されます。

## ショートカット
キャッシュを作成するショートカットが存在します。
```bash
php artisan optimize
```
これを実行することで、以下が全て実行されます。
- php artisan config:cache
- php artisan route:cache

また、キャッシュを削除するショートカットもあります。
```bash
php artisan optimize:clear
```
これを実行することで、以下が全て実行されます。
- php artisan event:clear
- php artisan view:clear
- php artisan cache:clear
- php artisan route:clear
- php artisan config:clear
- php artisan clear-compiled
Github Copilot の修正力！

# 3の倍数と3がつく数字の出現数

懐かしい「世界のナベアツ」の持ちネタで、「３の倍数と３がつく数字の時にあほになる」というのがありますが、１から始めてどんどん大きい数字に進めていくと、だんだんあほになる割合が高くなるという話があります。

そこで、1から1億まで数えながら、３の倍数と３がつく数値がどれくらいの割合で出現するのかを調べてみました。

```Python
%%time
counta = 0
countn = 0
for i in range(1, 100000000):
    if (i % 3) == 0:
        #print(i , "AHO!")
        counta += 1
    elif ('3' in str(i)):
        #print(i , "AHO!")
        counta += 1
    else:
        #print(i)
        countn += 1
print("A/N = ", (counta/countn)*100 , "%")
```
結果は以下の通り。あほになるほうがだいぶ多いですね。
```
A/N =  248.45859339669568 %
```

# Github Copilotにプログラムを作ってもらう

このプログラムをGithub copilotくんにみせたら、NumPyかPandasを使ってみたらというので、それならプログラム書いてよとお願いしてみました。

```bash
次のプログラムを作成してください。
・ NumPyを使用する
・ １から１００００００００までの整数のうち、３の倍数と３を含む数の出現回数を求める
・ それ以外の数の出現回数を求める
・ ３の倍数と３を含む数の出現回数の合計と、それ以外の数の出現回数との比率を求める
```

できたプログラムが以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570192/7660e307-826e-6326-d7a5-d056cc6fe675.png)

Google Colabで実行すると。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570192/fe66da61-5f3c-5c32-be18-9108e3e86682.png)

ありゃ。エラーですね。。。

# Github Copilotによる修正

Copilotくんにエラーを報告。

```
このプログラムを実行すると、以下のエラーが発生します。
TypeError Traceback (most recent call last) in <cell line: 7>() 5 6 # 3の倍数または3を含む数をフィルタリング ----> 7 mask = (numbers % 3 == 0) | ('3' in str(number) for number in numbers) 8 9 # 3の倍数または3を含む数の出現回数

TypeError: unsupported operand type(s) for |: 'bool' and 'generator'
```

すると、なんとCopilotが自分のミスだとして、修正コードを示してくれました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570192/f504dc24-d6a9-b4c3-242f-c4e7ef144c6d.png)

修正後のソースを再度Colabで実行すると、ちゃんと実行されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570192/958f77c4-b652-8a86-5071-dfb6fc06f54c.png)

# 感想

生成AIがこの手のプログラムを作成するのは、これまでも何度も目にしてきましたが、自らのミスを理解して修正コードまで書けるとは。さすがです。

# おまけ（視覚化)

ついでに、あほとノーマルのせめぎ合いを視覚化してみました。クラウドで実行する場合は、CPU時間をだいぶ使いますのでご注意ください。

```Python
%%time
import matplotlib.pyplot as plt
from IPython.display import clear_output
import time

counta = 0
countn = 0
labels = ('AHO', 'NORMAL')
for i in range(1, 100000000):
    if (i % 3) == 0:
        #print(i , "AHO!")
        counta += 1
    elif ('3' in str(i)):
        #print(i , "AHO!")
        counta += 1
    else:
        #print(i)
        countn += 1
    if(i % 1000 == 0):
        ratio = (counta , countn)
        plt.pie(ratio, labels=labels, autopct='%1.1f%%')
        plt.title('n = ' + str(i))
        clear_output(wait=True)
        plt.show()
print("A/N = ", (counta/countn)*100 , "%")
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570192/636910c4-d1f4-4ae5-3325-14843caee713.png" width="300px" alt="円グラフ">
非マネージドのカスタマイズをブロック機能が一般提供されたので試してみた


# はじめに

今回、以下の機能が一般提供されたのでサクッと記事にまとめてみました。

https://powerapps.microsoft.com/ja-jp/blog/announcing-general-availability-of-block-unmanaged-customizations/

# どこでオンにする？

Power Platform 管理センターで、環境を選択し、[設定]>[機能] からオンにすることが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f765cc82-80b4-a356-88fa-529d0d913e84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/356112d6-5d3f-0ca3-8d40-1b2367120f99.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8a4e949d-55ea-9543-41b2-7a9521f9ee7d.png)

私の環境で試したところ、設定はすぐに反映されました。

# どんな動きになる？

まず、Power Apps を開くと、アプリの作成が出来ないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d01b7a88-1a2f-a7a2-f3f6-a6c10a83fc8f.png)

データから作成しようとしても失敗しました。それっぽいメッセージが出ていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8e817dd6-f697-e8d2-3ee7-85b7c1280603.png)

Power Autoamte は作成出来ちゃいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/077f5b04-8627-8e3e-fbcf-0b50acbf910a.png)

アンマネージドソリューションのインポートは失敗しました。こちらが一番の目的だと思うので期待通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ae3234e9-9ba2-2fdf-b692-e53b033e4439.png)

新規ソリューションの作成は出来ちゃいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/59e2174c-43d7-5790-1c34-1b84d3ffbc03.png)

ソリューション内でアプリ作れそうな感じがしましたが、保存の段階で失敗しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/997c282a-83eb-ebe5-d04d-70237ec451de.png)

設定をオンにする前に作成していたアプリについて、設定変更しようとしたら失敗しました。こちらはモデル駆動型アプリのビューやフォームの設定変更して保存・公開しようとしたら失敗しました。
はじめからそのような用途の環境に対してオンにしましょうね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f25439b4-5ded-fb16-e0a5-22598f2fd970.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/282fefc8-8869-4f06-cd36-ed7e7fcdc009.png)

# 設定戻すと

戻したら今まで通りの動きにありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8748f062-4d25-1f28-1416-d7f0c4267c8f.png)

画面も今まで通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/07501f9e-8244-44b8-22a9-0e4b90a8a327.png)

アプリも作成できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/57bc2545-3916-b8d4-9e2e-7d1c61f5dc64.png)

# まとめ

今回は、非マネージドのカスタマイズをブロック機能が一般提供されたので試してみました。開発環境と本番環境を分けて開発する際、本番環境の方で、こちらの機能をオンにする感じになると思います。
functionを使うことで結論から処理を書く!functionのメリット

### この記事を読むメリット
:::note info
結論(処理の流れ)を書いた後に、具体的な内容(処理の詳細)を書けるようになる
:::

### functionのメリット
アロー関数では、宣言する前に関数を呼ぶとエラーになります。
```js
method() // ReferenceError: Cannot access 'arrow' before initialization
const method = () => {}
```

一方で、functionでは、下のように書いてもエラーになりません。
```js
method() 
function method() {}
```
これを活用することで、処理の流れを先に書いて、具体的な内容を後に書けます。

例えば、アロー関数で下のように書いてたとします。
```js
const getName = () => {
    return "山田 太郎"
}

const greet = (name) => {
    const text = `こんにちは${name}さん`
    console.log(text)
}

const name = getName();
greet(name);

```
functionを用いることで、処理の流れを先に書いて、その下に、具体的な方法を書けます。
```js
const name = getName();
greet(name);

function getName() {
    return "山田 太郎"
}

function greet(name) {
    const text = `こんにちは${name}さん`
    console.log(text)
}
```
よく、プレゼンなどでは、結論を先に述べることが大事といいます。
プログラミングでも<strong>結論(処理の流れ)→具体的な内容(functionによる処理の記述)</strong>と書くことで見やすくなるはずです。

特に、スパゲッティコードのプロジェクトでの簡単なリファクタリングに役に立ちます。
メソッドの中身が長い時も、可読性が上がります。

「コードは長いけど、何故か読みやすい」を実現できるはずです。

もちろん、このfunctionの挙動を嫌う人もいますが、、、
PHPのhtmlspecialchars

# htmlspecialcharsとは？
https://webukatu.com/wordpress/blog/34025/

「HTMLコードをそのままブラウザに表示しようとすると、HTMLコードとして認識されますが、特殊な文字を別の文字列に変換することで、ブラウザにHTMLコードとしてではなく、ただの文字列として表示されるようになります。」

と記載しているので試してみる。
**「index.html」送信フォームのファイル**
```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>ユーザー登録フォーム</h1>
    <form action="confirm.php" method="post">
        <p>名前：<input type="text" name="name"></p>
        <p>ふりがな：<input type="text" name="kana"></p>
        <p>都道府県：<input type="text" name="add1"></p>
        <p>市町村：<input type="text" name="add2"></p>
        <p>番地：<input type="text" name="add3"></p>
        <p>最寄えき<input type="text" name="station"></p>
        <input type="submit" value="確認">
    </form>
    <a href="list.php">一覧へ</a>
</body>
</html>
```
![PHPのhtmlspecialchars.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/562686ad-14f6-316e-3121-5a7fc7418287.png)
↑コンタクトフォームにhtmlコードを入れて確認ボタンを押し送信してみる。
**「confirm.php」受信確認ファイル**
```php
    print($_POST["name"]);
    print($_POST["kana"]);
    print($_POST["add1"]);
    print($_POST["add2"]);
    print($_POST["add3"]);
    print($_POST["station"]);
```
![PHPのhtmlspecialchars2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/de776abe-c6b2-0be2-dc20-c9ca2fc14ec7.png)

↑フォーム内に入れたpタグが反映されて送られてきた["add3"]と["station"]が改行で表示されている。

# htmlspecialcharsを使う

```php
    // var_dump($_POST);
    $name = htmlspecialchars($_POST["name"],ENT_QUOTES);
    $kana = htmlspecialchars($_POST["kana"],ENT_QUOTES);
    $add1 = htmlspecialchars($_POST["add1"],ENT_QUOTES);
    $add2 = htmlspecialchars($_POST["add2"],ENT_QUOTES);
    $add3 = htmlspecialchars($_POST["add3"],ENT_QUOTES);
    $station = htmlspecialchars($_POST["station"],ENT_QUOTES);
    print($name);
    print($kana);
    print($add1);
    print($add2);
    print($add3);
    print($station);
```
![PHPのhtmlspecialchars3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/526c602d-36b8-3cbc-0f4d-72ec5431fb47.png)
↑このようにpタグが文字列に変換され表示される。
【失敗談】ChatGPTに相談したらハマりかけた話

## はじめに

こんにちは！[@nyakako13](https://qiita.com/nyakako13 "Qiita ページ") です。

ChatGPTに相談したらハマりかけた話です。

最後に次世代GPT2？を試してみました。



## 間違い探しです
![スクリーンショット 2024-05-10 14.32.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/9468586a-57c9-3590-118c-1243e4a73cba.png)


```
import { render, waitFor } from "@testing-library/react";
import App from "../App";

describe("App", () => {
	test("タイトルが表示していること", async () => {
		render(<App />);
		await waitFor(() => screen.getAllByTestId("table"));
		const title = screen.get("title");

		expect(title).toBeInTheDocument();
	});
});
```

`screen.get`まで入力してるのに、`getByTestId`とか`getByRole〜`とかの入力補完の候補が表示しない！

なぜだー！！

「vscode jest 入力補完　効かない」みたいなキーワードでググってもよくわかないー。


そうだ、GPT先生に聞いてみよう。


## 間違った質問の仕方と回答
![スクリーンショット 2024-05-10 14.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/967251ac-1586-8fae-93a9-f13bc62ca1fb.png)


やってみるも改善できず・・・

再生成したり、claudeに聞いてみたりしても拡張機能やライブラリ、設定ファイルの見直しを提案されるばかりで改善できず。。

<br>

**そして、これらの回答の内容は全部必要ありません！！！**


## 正しい質問の仕方と回答
![スクリーンショット 2024-05-10 14.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/a5cc2288-6021-fd30-eff4-0667597927bf.png)


<br>

### **screenのインポートが漏れていただけでした。。**



↓改善しました
![スクリーンショット 2024-05-10 14.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/79b816e3-730d-734c-3261-3add05397268.png)


## 余談
ちなみに次世代のGPT2??ではコードなしの質問でも解決できそう。やば。

![スクリーンショット 2024-05-10 20.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2539365/ff93aa0c-c0f8-c55d-4bb8-c5f26f74e9fb.png)


https://chat.lmsys.org/
のAI battle でModel 名が下記だとGPT2だという噂。
- im-a-good-gpt2-chatbot
- im-also-a-good-gpt2-chatbot

https://chat.lmsys.org/


## 感想
具体的なコーディングでググっても解決できない時などは、開発環境や前提条件を共有したり、実際のコードを入力してAIに相談するようにしていましたが、今回はちょっとした質問でハマりかけたので、気をつけたいと思います。


## おわりに
よかったら[X(@nyakako13)](https://twitter.com/nyakako13 "Xプロフィール")もフォローしてもらえると嬉しいです。

[Qiita100投稿](https://qiita.com/nyakako13/items/03ad61cfb82a1582b5d1)まで残り89！

未経験や浅経験、厳しいと言われている年代でエンジニアへの転職活動されている方、負けずにがんばりましょう！！

## 参考
https://x.com/masahirochaen/status/1788010304921878747

https://chat.lmsys.org/
単純なバックエンドAPIのサンプル

色々テストするのに短くて簡単なAPIをメモっておこうと思ってこのページを作りました。
まだAPIとか作ったことがないという方が手始めに動かしてみるのにもちょうどいいかなと思います。

金額をリクエストとして送ると税込みの金額を返すAPIを作りました。エラー処理とかはそこまで厳密にやっていません。

```tax.py
from flask import Flask, request, jsonify

app = Flask(__name__)

def tax(amount int, taxRate int):
    return amount*(100+taxRate)/100

@app.route('/calc',methods=['POST'])
def main():
    data = request.get_json()
    try:
        amount = int(data['amount'])
        result = tax(amount,10)
        return jsonify({'result':amount})
    except (KeyError,ValueError,TypeError) as e:
        return jsonify({'error':str(e)}),400

if __name__ == '__main__':
    app.run(debug=True)
```

このままでも動きますが、コンテナを立てて動かしたいと思います。

まず、imageを保存するためにdocker desktopをダウンロードして起動します。

https://www.docker.com/products/docker-desktop/

次に以下のファイルを用意します。

Dockerfile:
```dockerfile
FROM python:3.9-slim

WORKDIR /app

copy . /app

RUN pip install --no-cache-dir flask gunicon

EXPOSE 5000

ENV NAME 10

CMD ['gunicon','--bind','0.0.0.0:5000','tax:app']
```

```docker-compose.yaml
version: '3'
services:
    image: ./
    ports:
        - '5000:5000'
    enironment:
        - NUMBER=10
```

ファイル構成はこんな感じになります。
```
*
|- tax.py
|- Dockerfile
|- docker-compose.yaml
```

では、コンテナを立ててみましょう。

```
docker compose up
```

curlコマンドで試しにリクエストを送ってみます。

```
curl -X POST -H 'Content-Type: application/json' -d '{"amount":100}' http://localhost:5000/calc
```

すると、`{result:110}`と税込みの金額が返ってくると思います。

最後にコンテナを止めてお片付けをします。

```
docker compose down
```
【初心者】localhostの問題の解消(別のプロジェクトが立ち上がる、ホットリロードが効かない)

## 概要
Vueを触り始め、はや２ヶ月。
触り始めた頃にlocalhostでなんで！？となった初歩的なミスの解決法を書いてあります。

## ①別のプロジェクトが立ち上がる
`npm run dev`,`yarn dev`等でlocalhostを立ち上げているのに、別のタイミングで作業していたページが表示されてしまうということが起きたので、その問題の解決の手順を書いていきます。

### どのような解決策を考えたか
複数のローカル環境を立ち上げていたため、私は最初キャッシュのようなものが残っているのかと考えていました。

スーパーリロード(command shift R)をしたり、ブラウザのキャッシュを削除しても改善されません。

### 原因
私の場合はターミナル上で自分がいる位置のディレクトリが違うことが原因でした。
Vueのプロジェクトを立ち上げたかったのに、前に作業していた別のプロジェクト（下記でいう`React-project`）が立ち上がっていたのです。

```
sample@sampleUser React-project % npm run dev

> React-project@0.0.0 dev
> vite

Port 8000 is in use, trying another one...

  VITE v5.2.10  ready in 320 ms

  ➜  Local:   http://localhost:8001/
  ➜  Network: http://111.111.1.111:8001/
  ➜  press h + enter to show help
```

上記の立ち上がり方だとlocalhost:8000番が使われているということもわかるので、その辺も含めて原因を探せると別の原因にも気づけると思います。

### 解決法

**cdコマンドか、新しいターミナルを立ち上げる等で該当のルートフォルダに移動してから行えば解決します。**

### 別のプロジェクトが立ち上がる件のまとめ
VS Codeで開発を行っているのですが、いつもそのフォルダを開くと自動的に該当のrootフォルダのターミナルが立ち上がっていたの気にしておらず意外とハマってしまいました。

## ②ホットリロードが効かない
ファイルを変更しているのに、ローカル環境のページに反映されないという問題に直面しました。

### ホットリロード（ライブリロード）とは
localhostには自動でファイル上の変更を検知して、反映してくれる機能があります。これをホットリロードを呼びます。

### どのような解決策を考えたか
コンポーネントの数が多かったため最初は間違えて違うファイルを触ってしまっていることを考えましたが、その時の場合は違いました。

こちらも、キャッシュ等を考えましたが違いました。

### 原因
私の場合は階層構造を見直そうと、ファイルの階層構造を変えてしまっていたことが原因でした。

**変更前**
```
vue-project
├── node_modules
├── public
├── src
│   ├── assets
│   ├── components
│   │   ├── Header.vue
│   │   ├── Body.vue
│   │   ├── Footer.vue
│   │   └── Button.vue
│   ├── router
│   │   └── index.ts
│   │ 
```
**変更後**
componentsフォルダの中にフォルダが追加されています。
```
vue-project
├── node_modules
├── public
├── src
│   ├── assets
│   ├── components
│   │   ├── Organisms
│   │   │   ├── Header.vue
│   │   │   ├── Body.vue
│   │   │   └── Footer.vue
│   │   └── atoms
│   │       └── Button.vue
│   ├── router
│   │   └── index.ts
│   │ 
```

### 解決法

**`npm run dev`,`yarn dev`等で新しくlocalhostを立ち上げることで解決します。**

### ホットリロードが効かなくなってしまった件のまとめ
ファイルの位置を変更すると、開発サーバーがその変更を検知できず、ファイルが監視対象から外れてしまった可能性が高いのではないかと考えています。その結果、ファイルの変更が自動的に検知されず、ホットリロードが機能しなくなってしまったのでしょう。

## まとめ
この記事を見た方が1分でも早く解決し、初歩的なミスに時間が取られず、どんどん成長に時間を割いていければ幸いです。ありがとうございました。
【Tableau】カスタムSQLでの同一項目名のエラーについて

【Tableauデータソース上のカスタムSQLで同一名称の項目があるとエラーになる件】

用意したテーブルは下記の3つ

・メインとなるデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/6e16a2e3-ea04-e92c-c274-5606a250defb.png)

・権限マスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/ad690bb4-4dd5-9f0a-8e7c-6e2a5948d15c.png)

・ユーザー権限マスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/f20d7a6a-27d4-a346-98e2-2887de4ddd95.png)


●事象
tableau server上でデータソースの新規作成時に下記のSQL文をカスタムSQLに入力したところエラーとなった。
SQL文：
select * FROM TABLE_A 
INNER JOIN W_KENGEN 
ON TABLE_A ."会社コード" =  W_KENGEN."KAISHA_CD" 
INNER JOIN W_KENGEN_USER2 
ON W_KENGEN."GROUP_ID" AS K = W_KENGEN_USER2."GROUP_ID" AS U 
WHERE W_KENGEN_USER2."USER_ID" = 'userA'

エラー文：TableauException: Oracle データベース エラー 904: ORA-00904: "W_KENGEN_USER2"."GROUP_ID": 無効な識別子です。



●解決策
・カスタムSQLの抽出項目で同一名称の項目があると、Tableauの項目名が同一項目で被ってしまってエラーとなる。
・SELECT句を「*」ではなく、必要な項目のみ抽出して、複数テーブルで同一名称の項目がある場合は別名をつける。

select 売上金額,w.group_id2 AS wgrp_id, u.group_id2 AS ugrp_id FROM TABLE_A
INNER JOIN W_KENGEN w
ON TABLE_A."会社コード" = w."KAISHA_CD"
INNER JOIN W_KENGEN_USER2 u
ON w."GROUP_ID2" = u."GROUP_ID2"
WHERE u."USER_ID" = 'userA'

最後まで読んでいただきありがとうございました！
いいね！お願いいたします！
オブジェクトの操作

## はじめに

PHPのオブジェクトの操作についてまとめる。

### オブジェクトの代入

オブジェクト変数の代入は参照渡しが規定。

```php:Person.php
class Person
{
    public $firstName;
    public $lastName;

    public function __construct($firstName, $lastName)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    public function show()
    {
        print "<p>私の名前は{$this->lastName}{$this->firstName}です。</p>";
    }
}
```

```clone.php
require_once 'Person.php';

$p1 = new Person('リオ', '山田');
$p2 = $p1;
$p2->firstName = '奈美';
$p2->lastName = '掛谷';
print_r($p1); // 結果：Person Object ( [firstName] => 奈美 [lastName] => 掛谷 )
print_r($p2); // 結果：Person Object ( [firstName] => 奈美 [lastName] => 掛谷 )
```

オブジェクトが参照渡しされた結果、変数`$p2`への変更が元々の`$p1`にも反映されている。

#### オブジェクトの値渡し


オブジェクトを値渡ししたい場合には、clone命令を使う。

```clone2.php
require_once 'Person.php';

$p1 = new Person('リオ', '山田');
$p2 = clone $p1;
$p2->firstName = '奈美';
$p2->lastName = '掛谷';
print_r($p1); // 結果：Person Object ( [firstName] => リオ [lastName] => 山田 )
print_r($p2); // 結果：Person Object ( [firstName] => 奈美 [lastName] => 掛谷 )
```

### オブジェクトの比較

== → 同じクラスのインスタンスであると同時に、同じプロパティと値を持つこと。
=== → 同じクラスの同じインスタンスを参照すること。

```php:compare.php
require_once 'Person.php';

$p1 = new Person('リオ', '山田');
$p2 = $p1;
var_dump($p1 == $p2); // 結果：bool (true)
var_dump($p1 === $p2); // 結果：bool (true)

$p3 = clone $p1;
var_dump($p1 == $p3); // 結果：bool (true)
var_dump($p1 === $p3); // 結果：bool (false)
```

### オブジェクトの反復処理

`FliendList`クラスを`foreach`命令で処理すると、配列`$list`の内容が順番に処理される。

```php:FliendList.php
class FliendList implements IteratorAggregate
{
    public string $version = '1.0.0';
    public string $name = '友人リスト';
    private $list = [];

    public function getIterator()
    {
        return new ArrayIterator($this->list);
    }

    public function add(Person $p): void
    {
        $this->list[] = $p;
    }
}
```

```php:foreach_custom.php
require_once 'Person.php';
require_once 'FriendList.php';

$list = new FriendList();
$list->add(new Person('太郎', '山田'));
$list->add(new Person('奈美', '掛谷'));
$list->add(new Person('賢', '高江'));

foreach ($list as $value) {
    $value->show();
}

// 実行結果
// 私の名前は山田太郎です。
// 私の名前は掛谷奈美です。
// 私の名前は高江賢です。

```



#### `IteratorAggregate`インターフェイスを実装する

`IteratorAggregate`インターフェイスはカスタムの反復機能を実装するための機能を取り決めているPHP標準のインターフェイス。
`IteratorAggregate`インターフェイスを実装した上で、その`getIterator`メソッドをオーバーライドする必要がある。

#### `getIterator`メソッドをオーバーライドする

`getIterator`メソッドは反復処理に使うイテレーターを返すためのメソッド。
`getIterator`メソッドが`ArrayIterator`オブジェクトを返すように実装している。
`ArrayIterator`クラスは配列にイテレーターとしての機能を持たせるためのPHP標準クラス。
kali-linux を VirtualBox 上で構築


覚書として、kali-linux 構築手順とエラーについて記述します
kali-linuxはlinuxディストリビューションの一種であり、ペネトレーションテスト等を行うのに役立つツールが同梱されているOSのこと

## [kali-linux](https://www.kali.org/get-kali/#kali-virtual-machines) ダウンロード

VirtualBox 上に構築を行いましたので画像内の赤枠部分からダウンロード

![kali-linux.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/a290ba52-1d96-b473-59e7-5149a964fc09.png)

## [VM VirtualBox](https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html) ダウンロード

Windows 上にインストールを行いましたので、赤枠部分から実行ファイルをダウンロード

![VM VirtualBox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/332d8262-34a1-c093-0069-01e8110dda7b.png)

## VirtualBox インストール実行時にエラー
VirtualBox の実行ファイルをクリック後に下記ダイアログが表示

![exe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/f57c3557-a229-2dac-608b-e129ffaf8e4e.png)

そのままインストールを試みたところ、「致命的なエラー」を発出
![エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/18b251d8-38c2-4b03-6397-d0a13acbcfa2.png)

## [microsoft visual c++ 2019 redistributable package](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170) ダウンロード

[パッケージ](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170)が必要なようなので、DL

![C++.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/e5402b7f-2d76-330e-e20c-87e2cc1315cf.png)

その後、インストール

![C++２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/896af20c-b4c1-541f-0aec-87d460c6bd70.png)

VirtualBox を再度実行インストール

![VM VirtualBox2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/cc8e19d0-b3cd-b813-dcb0-acb0c9fbcdb6.png)

## kali-linux を VirtualBox に追加

追加をクリック

![kali.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/4aaa509e-3fb8-82a2-6161-399f9cec0632.png)

仮想ファイルを選択

![kali2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/809dce0a-b04c-1901-e3d3-d7677074caf8.png)

電源ボタンをダブルクリックで立ち上げ

![kali3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/2a29c162-9bdb-f420-b4d4-4f33a4df6622.png)

ID:kali
PW：kali

![pw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/e3876315-eb8a-6341-6443-b0b49e7982ad.png)

ログイン後画面

![ログイン後画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483720/19b6b3f7-4287-e2d1-27f6-190b5fd2f632.png)
オフラインでの Tableau Server のライセンス認証

https://help.tableau.com/current/server/ja-jp/activate_off.htm

上記サイトに記載のTSM CLI使用の方法を実際にやってみましたので、
スクリーンショットを用いて説明いたします！



ステップ 1.Tableau サービス マネージャーへのログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/11427c09-77be-8bd7-0111-1a2e7a6ba240.png)



ステップ 2.オフライン アクティブ化要求ファイルを生成する
1.最初のノードで、管理者としてコマンド プロンプトを開きます。

2.オフラインのライセンス認証ファイルを取得するには、次のコマンドを入力します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/d86fd0ea-7937-83a2-4681-3f1496d38720.png)


パスワードは入力しても表示されないので、張り付けた後にENTERを押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/9cec8ff0-d7e2-efc4-4cb5-6dd9f0229b6b.png)


ステップ 3.オフライン アクティブ化要求を Tableau アクティベーション Web サイトにアップロードする
1.インターネットにアクセスできるコンピューターで、Tableau の「アクティブ化」(新しいウィンドウでリンクが開く)ページに移動します。
https://www.tableau.com/ja-jp/support/activation

2.手順を完了し、OfflineActivationRequest ファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/8f977117-0d53-089b-d1d3-90fcc8831213.png)

3.これにより、アクティブ化応答ファイル (OfflineActivationResponse) が作成されます。

4.Tableau アクティベーション Web サイトから OfflineActivationResponse ファイルをダウンロードします。(オレンジ字のここにを押下)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/9e5d22f6-08e3-c6fd-ba23-56399cba68dd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/aa665f0f-bd46-a4d7-a060-ab208ed50a2e.png)

ステップ 4.ライセンスを初期化または認証します
1.OfflineActivationResponse ファイルを Tableau Server コンピューターからアクセスできる場所にコピーします。

2.次のコマンドを実行します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/79f6af12-f30d-7d78-8262-8ef4edfc9bf2.png)

zipファイルのままで大丈夫です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/bc58d464-9bfd-2cf7-4ca9-1ac0d3fcf70d.png)

上記のステップを完了すると、成功メッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119468/79facdc2-894d-2707-cc3f-13f7d9736cd1.png)

TSMにログインし、ライセンスキーが適用されているか確認してください。

最後まで読んでいただきありがとうございました！
いいね！お願いいたします！
Binary Editor Hex

# Hexadecimal Editor on VS code

Binary Editor allows you to open any file and display data sequence in hexadecimal number.  

***Hex Editor***  is one of the binary editor available on VS code.

This Application is useful when you want to learn file structure.
**Hex Editor** can be installed with VS code extensions.


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567519/626f570b-1f8e-7c56-07de-cf4a73bf94e1.png" width="400">

Click Install.

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567519/5beb8780-962d-68da-0904-9d65a4a12986.png" width="650">

Open any forder which contains files you want to open with Hex Editor. And right-click the file, select Open With...

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567519/0dc7115e-9550-0977-dd13-dd4976c6d815.png" width="750">

Choose **Hex Editor**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567519/4e8558fd-b7da-0d40-a3db-94578fb8bd99.png" width="400">

Now you can see how exactly hexadecimal number is stored in binary file.
![Hex Editor5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567519/37ac4839-b01f-688f-7cce-ee2d7bf3fbd8.png)

## Configurations

You can control viewing, opening setting icon.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567519/f3d977da-c191-9abb-874a-fb474a228c64.png" width="400">
ルンバ 7j/7j+の初期設定メモ

# なにこれ
ルンバ7j+をレンタルしたのはいいけど、[公式の説明書](https://reviews.irobot-jp.com/vivr/manuals/4798372_OG_c755860.pdf)に設定方法が碌に記載されていないので備忘録として書いておきます。

# Roomba Home
[Roomba Home](https://www.irobot-jp.com/irobothomeapp.html)アプリをインストールし、アカウントの作成まで完了していることを前提にやることを箇条書きに記載します。

写真はめんどくさくて取らなかったので、文字で我慢してください。。。

## 製品の設定
先にルンバ本体を通電させ、充電しておきます。

- 製品の追加を行います
- Roomba 7j+にはQRコードがないので、`製品を選択`を押します。
- `ロボット掃除機 Roomba®`を選択
- `ルンバ jシリーズ`を選択
- 確認事項の後に、接続したいWifiを設定します
- `製品を検索しています...`と出てきたら、ルンバのボタンを1回押し、白色に光らせます(=電源を入れる)
- ペアリングができればボタンが青色になるので、ボタンを1回押します

以上でペアリングが終わり、通常通り設定ができるはずです！

# ドキュメントは整備しろ
プログラムに限らずですが、ドキュメントがないと何もわかりません...  
ルンバ7j/7j+については、ホームボタンがなく、中央にアイコンも何も書いていないボタンがあるのみで公式の説明が意味をなしていません。

お願いだからこの箇条書きレベルの説明だけでもつけてほしいな...
[Flutter, VSCode]ワイヤレスデバッグでADB return null value

# 環境
VSCodeの拡張機能"ADB Interface for VSCode"(v0.22.4)を使用してAndroidに接続しワイヤレスデバッグをしています。
# 問題
deviceのIP addressとPortを入力すると"ADB return null value"というメッセージがVSCodeの通知欄に出力され、デバッグができるdevice listに追加されない問題がおこりました。
![ADB_return_null.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1655458/24f656a3-8e80-cc18-227a-558888b4d258.png)
# 対処法
VSCodeで```Cmd + Shift + p```を押して```Kill ADB server```を選択します。
![スクリーンショット 2024-05-10 18.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1655458/07a4ba39-a412-dbdf-1ebc-8d3fbaf1cd8b.png)
ADBが再起動するので、もう一度deviceのIP addressとPortを入力すると接続に成功しました。

# 補足
調査している時、初めてワイヤレスデバッグをする時も同じメッセージが出力されるという情報もあったので、こちらの記事も共有しておきます。
https://medium.com/@quedicesebas/connect-your-android-device-over-wifi-in-vscode-to-run-and-debug-your-flutter-app-480adbeb85fa
Googleカレンダーで会議室を含めてURLからスケジュールを追加する

## TL;DR
追加したいものは全部 `add` クエリパラメータに足しちゃえ〜（おジャ魔女カーニバルのリズムで）

## 背景
Google Workspaceを使っている組織に所属されている方は、会議室や設備などのリソースが組織で定義されていて、カレンダーから予定を作成するときにこれらも予定に入れて確保することがあると思います。
Googleカレンダーの画面から予定を作成するときはポチポチと利用状況などを確認しながら設定すればいいのですが、たとえば「いま会議室が空いていることは確認できている。すぐに使いたいけど、予約としてカレンダーに予定を入れておきたい」といったときに毎回ポチポチするのは面倒だったので、リソースを含めて予定を作成する方法を調べてみました。

:::note warn
公式のリファレンスなどに記載がない方法のため、仕様変更などによって想定通りに動作しない場合や今後動作しなくなることが想定されます。自己責任で使用してください。
:::

## 方法

### リソースのカレンダーIDを調べる

組織でリソースが定義されている場合、そのリソースのカレンダーが存在するはずです。Googleカレンダーの設定→「カレンダーの追加」→「リソースをブラウジング」から、使いたい会議室などのリソースにチェックを入れて「他のカレンダーの設定」に追加しておきます。

![スクリーンショット 2024-05-10 16.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182576/1dbf363d-c778-0498-6d67-73023df52169.png)

次に、追加したリソースの「カレンダーの設定」→「カレンダーの統合」に記載のある `@resource.calendar.google.com` で終わるカレンダーIDをメモしておきます。

![スクリーンショット 2024-05-10 16.58.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182576/838a21ae-2400-5159-39a3-0b437ebe14b4.png)

これ以降リソースのカレンダーは必要ないので、チェックを外してもOKです。

### リソースのカレンダーIDを含めてスケジュールを作成するURLを組み立てる

公式のリファレンスが見つからないのですが、Googleカレンダーではクエリパラメータを使って予定を追加する画面に遷移できます。

https://qiita.com/osadataku/items/a2c9cbb967adbb7893c6

https://webasterisk.sakura.ne.jp/googlecalendar_eventbuttonsgenerator/

https://github.com/InteractionDesignFoundation/add-event-to-calendar-docs/blob/main/services/google.md

ただ、この手の方法の紹介記事ではタイトルや説明の追記方法は説明があったり察しがつくものの、会議室の追加方法は見つかりません。

ここで冒頭の伏線が回収されるのですが、`add` クエリパラメータにはその予定に参加するメンバーのメールアドレスを追加するような説明があります。そしてリソースもメールアドレスっぽいカレンダーIDを持っています。
そこで、下記のようなURLを組み立ててGoogleカレンダーに遷移すると…

```text
https://www.google.com/calendar/render?action=TEMPLATE&text=Reserve%20test&details=Created%20by%20URL&add=<リソースのカレンダーID@resource.calendar.google.com>
```

![スクリーンショット 2024-05-10 17.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182576/a2239216-81a0-0af1-3e5c-906595b5bd65.png)

タイトルや説明とあわせて、リソースを含んだスケジュール作成画面に遷移できました。このURLをブックマークしたりQRコードに利用すると、1クリックで会議室などのリソースを含む予定が作成できるようになります。

:::note info
上記のURLをAndroidで開いてもアプリからリソース付きのカレンダーが作成できましたが、スケジュールの作成画面ではユーザー欄にリソースが表示されたり、会議室名が正しく表示されない場合があるようです（実際リソースカレンダーを見ると予約はできていました）。
:::

### ヒントになったサイト
https://help.okta.com/wf/ja-jp/content/topics/workflows/connector-reference/googlecalendar/actions/createnewevent.htm
正規表現の基礎：/\d+mm$/

### 正規表現
正規表現はテキスト内のパターンを表現するための便利なツールです。今回は、「/\d+mm$/」という特定のパターンに焦点を当てて、その意味と使い方について考えます。

### パターンの意味
このパターンは次のような意味を持ちます：

- \d: 1つ以上の数字を表します
- +: 直前の要素が1回以上繰り返されることを示します
- mm: 文字列「mm」を表します
- $: 文字列の終わりを意味します

したがって、「/\d+mm$/」は、数字の後に「mm」が続き、文字列の最後で終わるパターンを表します。

### 使い方の例
- 寸法情報の抽出: 「100mm」や「50mm」などの寸法情報を抽出する際に利用できます。
テキストから寸法情報を取得する際に、この正規表現を使うとスムーズに抽出できます。
- ファイル名の検索: 特定の拡張子やフォーマットを持つファイルを検索する際にも有用です。
例えば、「report_2023_10mm.pdf」のようなファイルを見つけるのに役立ちます。
日付と単位の組み合わせ: 日付と単位が連結された文字列を解析する際にも活用できます。
「2023/05/15 10mm」のような文字列から、日付と寸法を分離するのに使えます。
### 注意点
- マッチングの範囲: このパターンは「100mm」や「50mm」などの形式にマッチしますが、「mm」単体にはマッチしません。
- 大文字と小文字: 大文字と小文字を区別します。大文字と小文字を無視したい場合は、正規表現のフラグを適切に設定します。
ゴミ箱の状況を確認したい

以下のSQLを実行

set lines 1500
set pages 1000
set colsep ','

col OWNER          for a50
col OBJECT_NAME    for a50
col ORIGINAL_NAME  for a50
col OPERATION      for a20
col TYPE           for a50
col TS_NAME        for a50
col CREATETIME     for a50
col DROPTIME       for a50
col PARTITION_NAME for a50
col CAN_UNDROP     for a10
col CAN_PURGE      for a50


select * from dba_recyclebin;


ついでにExtentsも
select count(1) from dba_extents;
【Go言語学習】chan struct{}

この意味不明なコードは何なんだ？
と思ったら、Go言語の仕様上、struct{}はゼロサイズのデータを表すものとのこと。
つまりメモリを消費しないものを表している。
ただし、変数やチャネルで使用した場合、これらを管理するためのメモリは当然消費される。
チャネルで使用する場合、目的はデータのやり取りで無く、ゴルーチンの同期が目的になる。

```Go
package main

import (
	"fmt"
	"time"
)

func main() {
	doneCh := make(chan struct{})

	go func() {
		time.Sleep(2 * time.Second) // 何かの処理を模擬
		close(doneCh) // 処理が終了したらチャネルを閉じる
	}()

	fmt.Println("Waiting for the goroutine to finish...")

	<-doneCh // チャネルが閉じられるまで待つ

	fmt.Println("The goroutine has finished!")
}
```
初めてのgithub。git init から git pushまで。

## 初めてのgithub

今月からスクールにて学習中のプログラミング初心者です。

タイトルの通り、githubで使うコマンドについて。
みんな知ってるゾ、ってことを改めて。復習を兼ねてアウトプットしていきます。

#### １．git init 
現在いるディレクトリの中にgitのローカルのリポジトリを作成するコマンド。
「.git」のフォルダが作成されていたら、成功。

※間違えた場所にgit initした場合は、「.git」をフォルダごと削除する。

#### ２．git add [ファイル]
作業フォルダの中のデータをステージングエリアに上げるためのコマンド。
ディレクトリの中身全部上げたいときは、[git add .]。

#### ３．git commit -m "コメント"
ステージングエリアにあるデータをローカルリポジトリに登録するためのコマンド。

ここまではローカルリポジトリの準備。
それまでにリモートリポジトリの作成を済ませておく。
→「リモートリポジトリの作成」については省略。

※ローカルリポジトリとワーキングツリー（作業しているディレクトリのこと）は違う。
→私はここで理解がちょっとズレたりしてました。

#### ４．git remote -v
コマンドを実行してURLの表示が無ければ、リモートリポジトリのURLが移動していないことになるので、
以下のコマンドでリモートリポジトリのURLを変更します。

**※git remote set-url origin [新しいURL]** →既存のリモートリポジトリから、別のリモートリポジトリへ移動するとき。
**※git remote add origin [新しいURL]**　→新しいリモートリポジトリを作成して、それと今のローカルリポジトリをリンクさせる時はこっち。


#### ５．git push
３でコミットされた状態のデータをリモートリポジトリに上げるコマンド。

※間違ったデータをpushしてしまった場合＝リモートリポジトリの中（githubで見える状態)に入ってしまった場合。
**git rm --cached [不要なファイル名]** →これでローカルリポジトリのファイルを削除、ステージングエリアからも消す。
**git commit -m "削除理由など"** →これでローカルリポジトリの状態＝いらないファイルがない状態を登録する
**git push** →これで変更内容をリモートリポジトリに反映させる。

---

ここからは、ただの雑談。自分が抱いているイメージについて。
文語体すらも安定しないので、口語体にしてます。

まず、githubって？の部分。
個人的なイメージとしては「箱」。
その「箱」に書き上げたスクリプトなど、完成形のデータを入れ込む。
入れ込んだ履歴がはっきり残るので、間違ったものをプッシュしちゃった時とかは戻ることも可能。＝間違ったスクリプトを書いてしまったとき、やり直しできる。
※git addしてcommitしてないとリモートリポジトリの中に履歴反映されないので、そこも重要だったりしますが。

ゲームでいうとアプデされたー。バグ修正されてんじゃん、きゃほーい。…うわー、ナーフされてるー。
みたいなデータの出し入れ（修正）をgithubでやる？みたいな印象。

と、githubという便利なシステムがあって！

そこで終わらずに。
最終的にはデプロイ（構築）をして、アプリケーションとしてサーバで動かすことができる。
HTMLとかなら、見える状態になるとか。

最初は「githubにデータ上げればOK？」なのかと思ってたんですが、そこから既に解釈違いをしていたり。

そんな感じの初心者ですが。
一歩でも前進していきたいと思う、今日この頃です。
AKKODiS エンジニア自習室に参加してみた

AKKODiS エンジニア自習室に参加してみた
https://techplay.jp/event/941423

# 参加費
無料

# 住所
[〒108-0023　東京都港区芝浦3丁目4番1号　グランパークタワー3F](https://www.google.com/maps/place/%E3%80%92108-0023+%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%8A%9D%E6%B5%A6%EF%BC%93%E4%B8%81%E7%9B%AE%EF%BC%94%E2%88%92%EF%BC%91+%E3%82%B0%E3%83%A9%E3%83%B3%E3%83%91%E3%83%BC%E3%82%AF%E3%82%BF%E3%83%AF%E3%83%BC/@35.6446988,139.7440515,16.75z/data=!4m6!3m5!1s0x60188bb3a434dd3f:0xefd9fa3ffb887a44!8m2!3d35.6436764!4d139.7455608!16s%2Fg%2F122qyy6f?entry=ttu)

# 時間
|時間|内容|
|---|---|
|17:00～20:00|受付時間|
|17:00～20:25|自習|
|20:25～20:30|エンディング|
	
- 3時間30分程勉強できる
	
# Wi-Fi
![スクリーンショット 2024-05-10 190749.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/471672b2-24ec-2de1-27d3-259048ab2de7.png)

- 100Mbps以上出ています。


# 会場の写真
![IMG20240510171829.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/c401ca19-e347-54f5-65e6-9a168e8dd415.jpeg)
![IMG20240510171833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/2d50ed32-4a8f-d4d3-60bf-3f0eade1232c.jpeg)
![IMG20240510171847.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/e0ba39f5-2b72-9117-98d2-cd1f323d1e95.jpeg)
![IMG20240510171915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/c2c61045-35ff-17d7-09f4-e894d43e4436.jpeg)
![IMG20240510172326.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/cbcfea35-f0fe-69a5-9345-a9e0fc1ab309.jpeg)
![IMG20240510172346.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/2103a4b9-8fca-d1b7-7030-e3e4ed455c12.jpeg)

- お菓子と飲み物も頂けます

![IMG20240510181428.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/a376914d-04ba-87c6-dde1-55c42598851f.jpeg)

![IMG20240510181353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/533ae11f-f637-abf0-1918-a69132086c6e.jpeg)

# 感想
参加者が4人程度だったので広々とつかえて快適でした。
また参加したいと思います。
【Git】.DS_Storeとの格闘記録

謎のファイル.DS_Storeと格闘記録です。

## 謎のファイルとの遭遇

遭遇までの流れを、自分の復習も兼ねて記載します。
（以下、全てターミナルでの作業となります）

#### 1）ディレクトリに移動、`git init`を実行
~~~
    ■移動
$ cd ~/workspace/github

    ■居場所確認
$ pwd 
/workspace/github

    ■ディレクトリにリポジトリを作成
$ git init
Initialized empty Git repository in　/workspace/github/
~~~

#### 2）ディレクトリの状態を確認するために、`git status`コマンドを実行。
~~~
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	git_test.txt
    .DS_Store

nothing added to commit but untracked files present (use "git add" to track)
~~~
ここで、身に覚えのないファイルがあることを発見しました。**.DS_Store**です

## .DS_Storeファイルとは


最初は、「なんか変なファイルがあるなぁ」と思ってただ単にそのファイルを消去して、終わっていました。
しかし、このファイルは何なんだろうと調べたところ、どうやらMacOSがフォルダ情報を保存しておくための**隠しファイル**なのだとか。

調べてみた感じでは、消去したりしても問題ないらしいのですが、不安症なため本当に消したままでいいのか、消してしまったけど問題が発生したらどうしようなどと思い、ここで既に.DS_Storeと出会ってから30分程度調べたり悩んだりで時間を潰してしまっておりました。

#### そんな私に手を差し伸べたのが.gitignoreでした。


# .gitignoreの活用

#### .gitignoreファイルとは
Gitに対象ファイル/ディレクトリを無視をさせるよう設定するファイルのこと。
ファイルの中身が多かったりして全てGitで管理するのには重すぎる時、この.gitignoreが大変便利なのだとか。

私はまだまだその段階まで達していないので、今回は.DS_Storeをどうにかするために活用させていただきました。



#### １）.gitignoreファイルを作成
~~~
    ■ファイルを作成
$ touch .gitignore

    ■無視させたいファイルを記載する
$ echo “.DS_Store” >> .gitignore

    ■一応内容を確認
$ cat .gitignore
.DS_Store
~~~
ちゃんと消したいファイル名が記載されていればOKです。
次に、`git status`コマンドでも、.DS_Storeが消えているか確認します。
#### ２）git statusを実行
~~~
$git status
On branch master
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    git_test.txt
	.gitignore

nothing added to commit but untracked files present (use "git add" to track)
~~~

.DS_Storeファイルが消えています！成功です。

こうして、無事に.DS_Storeファイルとの戦闘に勝利しました。

ただ、これはGitにpushしてしまった後でもこれは通じるのか、まだ勉強不足で分からないため、これから勉強していきます。
外国人エンジニアが日本語でプログラミングを勉強して困ったこと、「変数」から「糖衣構文」まで

### はじめに
ナイトレイに入社する前はほとんど英語でしかプログラミングの情報収集をしてきませんでした。今は日本語でプログラミングの勉強を続けており、プログラミング言語ではなく自然言語において予期しなかったトラブルに遭いました。

### 糖衣構文について
この間、会社の人とランチに行った時に、プログラミングすることにおいて英語と日本語の違いについてお話ししました。ある言葉は直訳として使われていて、ある言葉は英語のカタカナとして使われているのはなぜか、という話をしている時に「糖衣構文」という言葉が出てきました。

糖衣構文は、複雑な構文を読み書きやすくするためにプログラミング言語に導入されるものです。簡単な例を挙げますと、Python言語では「Method Chaining」（メソッドチェーン）という機能があります。
```python:people.py
# メソッドチェーン無し
person.set_name("Alex")
person.set_age("29")
person.set_interest("Programming")

# メソッドチェーン有り
person.set_name("Alex").set_age("29").set_interest("Programming")
```
「Variable」が「変数」と、「Function」が「関数」と訳されるため、「Syntactic Sugar」が「糖衣構文」に直訳されることはおかしくないですね。

しかし、会社の人とこの話をしたところ、「糖衣構文」が前述の「変数」と「関数」と同じようにピンとこないらしくて、私はそれを少し不思議に思いました。私からしたら、「変数」と「糖衣構文」は同じぐらい複雑な言葉で、どっちかというと「糖衣構文」の方がピンと来ます。

でも、会社の人の理由を聞いたら、『「糖衣」という言葉だと聞いたことが無いため、「甘い」のイメージよりも先に「糖の衣とは？」みたいになってしまい「甘い」イメージとは結びつきづらくて、「簡単」「楽」な印象をあまり受けません。』とのことでした。

それを聞いて納得しました！糖衣構文の表す意味は砂糖のように甘くて「楽」なのに、「糖衣構文」という言葉自体は全く「楽」じゃありません！

### 問題例１：パス事件
パスという言葉を初めて耳にした時は直感的に「Pass」という意味で捉えました。それで5分間ぐらい混乱していたら、最終的にパスの表している意味が「Path」だと分かった瞬間、自分の頭が大丈夫かなと思いました。

開発用語では「Path」がウェブサイトのURLや、ファイルの場所を表します。その反面、「Pass」は「Pass an argument」という文脈で使われることが多いです。要するに、「関数に引数を渡す」の「渡す」に当たります。英語だと「Pass an argument to a function (method)」になります。

こういうふうに、英語の言葉がカタカナになると使い分けが難しくなることもあると個人的に感じます。慣れるしかないですね！

### 問題例２：どっちを使う？
日本語でプログラミングについて話す時は、日本語の直訳を使うか、元々英語のカタカナ化された言葉を使うかとなると、困ることになります。

「Return」という単語は日本語でそのまま「リターン」として使われていることもあれば、「Return」により返ってくる値を「返り値」と「戻り値」と言うこともあるよう。カタカナを使う時と日本語を使う時、しかも日本語の時は二つの言葉もあり、たまにconfusedになりがちです！ある意味、日本語でプログラミングについて話す時は英語と比較したら、よりカラフルに表現できるのではないかと思います（もし日本語と英語の使い分けが出来るようになりましたら…）。

### 逆に、英語の略語は覚えにくい？
上記は全て私の個人的の経験と考えを元にした話です。しかし、プログラミング言語のシンタックスは英語がベースとなっているので、日本語が母国語のエンジニアの同僚の視点を考えてみると、尊敬しかありません。

「char（character）」とか「env（environment）」など、プログラミング言語で英語の単語が略語として使われていることは少なくはないです。この[GitHubページ](https://github.com/abbrcode/abbreviations-in-code)をご覧いただくとプログラミングの略語が非常に多く、英語話者からしても難しいです。

### 最後に
なるほど、一人で苦労しているわけではないようですね。私は日本語を覚えながらプログラミングも勉強していますが、同僚もプログラミング言語の英単語の学習や英語のドキュメントに取り組んでいるので、もっと頑張ろうと思いました！
macOSでminikubeコマンド実行時にdockerがoperation not permittedに。

どハマりしたので、個人的なメモ。

macOSにて、
```
$ minikube start --mount --mount-string="$(pwd):/localmnt" --driver docker ~
```
のような minikubeでstartコマンドを実行した時に、


内部で実行されるdockerコマンドが以下のような operation not permitted.　のエラーになった。
```
stderr:
docker: Error response from daemon: error while creating mount source path '/host_mnt/Users/~': mkdir /host_mnt/Users/~: operation not permitted.
```


https://itochu-cable-systems.jp/esb/category/useful/other/2023/10/6653/

こちらのようなSIPを無効にすることで一旦解消できましたが、セキュリティシステムを無効化するのも怖いので、


https://qiita.com/KEINOS/items/0366f1c281b574a79cfb
こちらを参考にターミナルとdockerだけ許可するようにして解決した。