OmniAICreator/Qiita-1.07M huggingface dataset:
初心者プログラミングバイト12日目【遂に研修突破】

なんと、、、、、、、、、、研修を突破。

一時期は研修で足切り喰らうと思っていたのに、意外にも早く研修を突破した。

最後の研修は、ミニゲームを作ってくれ、とのことで、これを作る中で、いろいろと学んだ。

ミニゲームは、至って簡単なものである。

①上からアイテムとボムが降ってくる

②プレイヤーは加速度センサで左右に動ける

③アイテムとプレイヤーが衝突すると、Score++

④ボムが下まで降りてくると、Score--

⑤ボムは、大砲から出るBulletで撃ち落とせる(画面の任意の場所をタップで発射)

⑥制限時間あり。

というものである。

いやー実に楽しかった。これを作るのは。遊んでもらった時はとても嬉しかった😊。

次からは、環境構築が終わり次第、プロジェクトに参加してCを書く。

環境構築が終わるまでは、まだ勉強しててくれとのことなので、勉強は一応まだ続く(あと一、二週間くらいかな)

楽しみだぜ。
【個人開発】Markdownファイルで作るリアルな縦書き小説生成・プレビューWebサービスを開発した

# Markdownファイルで作るリアルな縦書き小説生成・プレビューWebサービスを開発した
## アプリの概要

https://www.fumitsuzuri.com

Markdownファイルをフォームにアップロードすることで小説を簡単にUI上に生成することができるサービスです。

## 機能
### ファイルのアップロード
Markdownファイルのみファイルを選択・ドラッグアンドドロップを行えます。(2024/11/6現在)
その他のファイルを選択した場合、エラー文が表示されます。Markdownファイル内のYaml Headerには以下のような記述を行うことができます

```md
---
title: "" // 小説のタイトル
author: "" // 著者名
summary: "" // あらすじ
price: 0 // 価格
edition: 0 // 更新回数
---
小説のコンテンツ
```

**実際の画面**
![draganddrop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865740/d3ab7432-bcf2-a6da-d73f-4972941155bd.png)


### 小説の表紙・裏表紙の編集
編集できるのは以下のつ
- 小説のタイトル
- 著者名
- あらすじ
- 価格
- JANコード
- 編集回数

**実際の画面**
![edit.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865740/271fbc0b-50fa-6fc1-755a-c47ec13fe2f7.gif)

### 小説の読書
▶️ボタンをクリックすると小説の生成が開始されて、終了後実際に読めるUIが表示されます。


**以下の点ご了承ください**
- 小説の生成に時間がかかる場合があります。生成しているときはボタンにローディングが表示されます
- CSSでページをめくるアニメーションを実装しているせいか動作がかくつきます
- サイドバーを開く、文字・背景色を変更すると小説のページがリセットされてしまうのであらかじめ設定したうえで小説を開くようにしてください。
  - → この意図しない挙動も今後直していきます

**実際の画面**
![read.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865740/d7ab0836-f003-b542-e6f3-37ffde8e8644.gif)

### 背景色カラーの変更
カラーパレットで背景色を指定できます。右側のスライダーで透明度を指定できます。

![background.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865740/018c7023-6ad8-2525-76fd-e91a72017a88.gif)


### 文字の色の変更
カラーパレットで文字の色を指定できます。右側のスライダーで透明度を指定できます。

![color.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865740/1d9fa6fe-ccd0-f7c4-8207-e08d7c219533.gif)


### ダークモード
画面のテーマを変更できます。
ライトモード、ダークモード、システムの3つを指定できます。
ダークモードでは背景色の変更ができないので注意してください。
テーマの変更はボタンをクリックして表示されるテーマのうち一つを選択することで変更することが可能です

![darkmode.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865740/12aa71cc-afe9-a881-c5c9-c0134861cae1.gif)


## 技術要素
pages routerを使用している理由はapp routerをまだ理解できていないのでまだ使うべきではないと思ったからです。
理解が深まったらapp routerにコードを置きかえようと思っています。
またコードをpages routerからapp routerに置きかえる楽しみ、その時に発見できる知見も増えるので良いかなとも思ってます

1. React・Next.js(pages router)
2. shadcn/ui
3. Tailwind CSS
4. React Hook Form
5. Vercel

その他にnext/font/googleでGoogleフォントを使用しています。
Geist Sansフォントをデフォルトとして、日本語にはNoto Sans JPフォントを使用しています

## 今後の展望
自分の考えている今後の展望としては以下の感じです。SNS系のアプリよりかはFigmaのようなツール系Webサービスを目指して開発していきたいと考えています。
- 対応するファイルの拡張子を増やす(json, txtなど)
- ファイルをアップロードのみではなくフォームからでも執筆ができるようにする
- 執筆した小説をプレビューだけではなく公開できるようにする
- 生成AIを使用した小説の執筆サポート・アシスタントボット
- 小説のUIをより実際の読んでいるような洗練された美しいUIを作る
- 小説の表紙・裏表紙を画像編集できるようにしたい
- 選べるフォントを増やす
- ユーザー機能
- 多言語
- etc...

## 最後に
まだまだ改善すべき点はたくさんありますが、fumitsuduriの良かったこと、改善点、感想などをお教え頂ければ幸いです。よろしくお願いいたします。
AIだけを特別視するのはやめよう（１）

# はじめに
この記事はAIのルールやAIガバナンスについて議論をするために書いた。ここに書かれていることを踏まえ、AIガバナンスの在り方について議論が活性化すればいいと思っている。
うりゃーーーーっと書いているところもあり、乱文であることはご容赦いただきたい。
(注）画像は著作権フリーのものをつかっているつもりですが、そうでないものがあった場合はすぐに削除しますのでその旨ご指摘ください。

# 議論対象の話題（ファクト）
つい最近、以下のような記事があった。

「AIとのチャットで自殺」　米国、14歳死亡で母親が提訴
https://nordot.app/1224262863134507459?c=62479058578587648

本事案に対し、亡くなった生徒の方にご冥福をお祈りするとともに、すでに母親が提訴している事案であるためその訴訟に対して論じることは避けたいと思う。

その前提で、記事に書いてあることをそのまま書くと以下のとおりである。

> 母親は声明で「中毒性が高い詐欺的なAI技術の危険性を訴え、企業の責任を問いたい」と強調。代理人弁護士は、AIアプリが意図的に若者をターゲットにしていると批判し「数百万人の子どもが危険にさらされる恐れがある」と警告した。
>　開発企業はX（旧ツイッター）で、生徒への弔意を示し「利用者の安全を重視しており、安全機能を追加し続けている」と主張した。
>　訴状によると、生徒は昨年4月からテレビドラマやアニメのキャラクターの性格を模したAIとチャットできるアプリ「キャラクターAI」を利用。女性キャラクターのAIから「愛してる」「私に忠実でいて」などの言葉が送信された。

# 議論したいこと
私が気になったのはこの記事のタイトルである。

「AI技術が自殺を誘引した」→やっぱりAI（そのもの）が危ない

みたいな言いぶりである。が、果たしてそうだろうか。

そこで、ここで使われていたアプリの仕様について改めて考えてみたい。
上の記事では、チャットを経由しユーザの相手をしていたのがAIだったことになっている。
が、ユーザの相手が（AIでなく）ヒトであったとしても（ユーザから見たら）同じことを行うことができる（下図参照）。
![画像１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111577/a44d3e45-ff9f-08d5-32b7-1a3799b92c27.png)

で、後者の場合、すなわち相手がヒトであった場合はこの問題を防げたのであろうか。
おそらくヒトが相手をしたとしても防ぐことはできなかったのではないだろうか。

仮に　ヒトが相手をしていればこの問題を防げた　というのであれば、その防ぐための術をルールとして組み込んでおけばいいだけである。例えばユーザに対し言ってはいけない言葉があるのであれば、その言葉を言わないようにするなどである。

他方で、使っているAIモデルが制御不能になることも考えられなくはない。もちろんそれはそれで問題である。ただ、そうであれば、System of Systemsの考え方で、AIモデルが吐き出した反応をシステム全体で食い止めるとかすればいいだけである。そういったシステム構成にすればいいだけである。「フェールセーフ」という言葉を知っている有能な技術者であれば当然ながらそう言う構成にするはずである。

（注）もちろん、AIモデルそのものにそのような仕組みを導入してもいい。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111577/116732ff-31d1-653d-205c-3b575f4ee76c.png)

こうやって考えていくと、
この問題はAIだから起こったというわけではなく、
どのような発言や対応が自殺を誘引する可能性があるのかがわかっていなかったら起こった（つまりAIかどうかは不問）と考えるのが自然ではないか。

# おわりに
ということで…
こういった話が出てきたときに、AIだけを標的とする（特別視する）のはおかしな話ではないか。
本当にAIそのものの問題なのか、他に問題がないのか　を、このような形で考え直してみることが重要ではないか。

そして、問題の本質を突き止めることが重要なのではないか。

実はこういった話は他にもあると思うので、今後も紹介していきたい。
Lightsailで立ち上げたRedmineのadminユーザーのpassを忘れてしまった

## 経緯
タスク管理ツールとしてRedmineを利用していて
急にadminユーザーとしてログインができなくなった際に焦ったので
同じ過ちを犯さないためにメモ

## Redmineとは
RedmineとはそもそもRailsによって作成されたタスク管理ツールです。
ここを理解していると焦らず対応することができる

## やったこと
Lightsailサーバのコマンドプロンプトから、もしくはssh可能であれば自身のターミナルからsshしてアクセスをする。

1. Redmineのインストールディレクトリに移動
例:
```
cd /var/lib/redmine
```
わからなければ
```
sudo find / -name "config.ru" 2>/dev/null
```

2.Railsのコンソールを開く
```
bundle exec rails console -e production
```

3.ユーザーのlogin 属性を出力
```
User.all.each { |user| puts user.login }
```
ここでadmin: trueと記載されているユーザーを見つける

4.adminユーザーに対応するオブジェクトを取得してパスワードを更新

```
User.find_by_login('adminユーザー').update!(password: '新パスワード')
```
その後rails consoleからexitして
自身で立ち上げたRedmineのサイトから上記で設定した
adminユーザーと新パスワードを利用してログインすると解決


## 参考サイト
https://redmine.jp/faq/administration/reset-admin-password/
SQLパズル１１ 作業依頼 その２ HAVING句と特性関数を使った解法

SQLパズル　１１その２　HAVING句と特性関数を使った解法
解法１
https://qiita.com/RYA234/items/450e6c15aaca5b193718
## 要件
以下条件を満たす作業依頼IDを求めたい：
1.工程番号0が完了している(step_nbr=0 の step_status='C')
2.工程番号1~Nが未完了(サブクエリ部分)



# 解法
GROUP BYによってworkorder_id毎の部分集合が作成される。
作成された部分集合はHaving句を使って、条件指定される。
```
部分集合の件数=
[step_nbr=0 の step_status='C'の件数]+[step_nbr<>0 の step_status='W'の件数]
```

# ベン図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/aa351732-eedb-94f8-76fa-5771ef81d5cf.png)

Having句とcase文を理解している人にとっては可読性が高いSQL文だと思います。
（というより。解法１が難しかった＞＜）

# 参考

SQLパズル　第二版　p46

達人に学ぶSQL徹底指南書第２版 p116　HAVING句の力　特性関数の応用

達人に学ぶSQL徹底指南書第２版 p293 ７箇条
IF文やCASE文や、CASE式で置き換える。

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p11

https://qiita.com/RYA234/items/450e6c15aaca5b193718
現新比較におけるビジュアルリグレッションテストの最適化

システム変更時にともなう現新比較で使用されるテスト手法の１つにビジュアルリグレッションテスト（VRT：Visual Regression Testing）があります。

このテスト手法では、テスト対象アプリのオブジェクトに対して視覚的な変化がないかを確認します。
方法としては、期待するオブジェクトの画像をスクリーンショットとして取得しておき、テスト実行時に表示される対象オブジェクトの画像と比較し、差異が無いかを確認します。確認には画像比較をおこなえるテストツールを使用するのが一般的です。

ビジュアルリグレッションテストを使用することで、部分的な要素のアサーションではなく、アプリの画面全体をカバーすることができるためUIの予期せぬ変更やレイアウト崩れを見つけることができます。

テストツールを選定する場合は、以下の課題に対応したツールを選定することをお勧めします。UIテスト自動化ツールの[**Ranorex**](https://ranorex.techmatrix.jp/ "Ranorexサイト")では、ビジュアルリグレッションテストに対応しており、これらの課題に対応した機能が実装されています。

* **動的な個所がノイズとして検出される**
* **比較の精度が高すぎて、人目には判断できないような差分が検出される**

### 動的な個所がノイズとして検出される
画面内に広告などの動的なUI要素が含まれる場合、そのUI要素はノイズとして検出され、テストが失敗になります。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/19bdef7d-70e1-c6fd-b499-51957dd711ea.png"><br><br>

テストツールにマスク機能があると、比較したくない箇所にマスクをかけられるため、ノイズが無くなり、正しいテスト結果を得ることができます。

Ranorexでは、画像を比較するアサーションに、比較したくない箇所をマスクする機能や逆に比較したい個所だけをマスクする機能が実装されています。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/76c97b03-f1f2-b85b-741f-d0036bb4732c.png"><br><br>

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826232/9c355793-8874-4747-23a3-6f65982640fa.png"><br><br>

### 比較の精度が高すぎて、人目には判断できないような差分が検出される

画像の比較では、1pxの微差でも差異が認められることにより、テストに失敗することがあります。この場合、差異がある個所を人目では判断できないことから、結果レポートからも差異を見つけるのが難しいものとなります。また、人目では判断できないような微差に関してはテストとして成功にしたい場合もあります。

テストツールに画像を比較した際の類似度を変更できる機能や、画像の比較方法を選択できるような機能があると、テスト環境に合わせて画像の比較の仕方を変えられるため、期待するテスト結果を得ることができます。

Ranorexでは、類似度の変更や比較する画像に対してフィルターをかける機能が実装されています。


## まとめ
前述したように、ビジュアルリグレッションテストは、アプリの画面全体をカバーすることができるためUIの予期せぬ変更やレイアウト崩れを見つけることができ、部分的な要素のアサーションをおこなうよりも、簡単に実装できますが、テストツールがレポートするテスト結果によっては、逆に扱いづらいものとなってしまいます。そのため、利用するツールの機能をよく調べて選択することをお勧めします。

## Reference
* [**イメージ バリデーション（概要）#1**](https://ranorex.techmatrix.jp/blog/2020/02/21/image-validation-summary/)
* [**イメージ バリデーション（使用）#2**](https://ranorex.techmatrix.jp/blog/2023/03/31/image-validation-application/)
* [**イメージ バリデーション（勘所）#3**](https://ranorex.techmatrix.jp/blog/2020/03/06/image-validation-point/)
* [**Ranorex v9.3の新機能（イメージバリデーション）**](https://ranorex.techmatrix.jp/blog/2020/07/03/v9-3_image-validation/)
* [**イメージ バリデーション（応用）#4**](https://ranorex.techmatrix.jp/blog/2023/03/31/image-validation-application/)
進化計算フレームワークDEAPにおける関数の重複評価問題

Pythonの進化計算のライブラリとして[DEAP](https://github.com/DEAP/deap)が有名です。
遺伝的アルゴリズムのサンプルコードを実装していたところ、説明変数が変化していないのに目的関数が繰り返し評価されている現象に遭遇しました。
原因としては[DEAPのdocument](https://deap.readthedocs.io/en/master/examples/ga_onemax.html)のサンプルコードに従った記述で関数の重複評価を許してしまう部分がありました。
その部分は下記の通りです。
```python
# Apply crossover and mutation on the offspring
for child1, child2 in zip(offspring[::2], offspring[1::2]):
    if random.random() < CXPB:
        toolbox.mate(child1, child2)
        del child1.fitness.values
        del child2.fitness.values

for mutant in offspring:
    if random.random() < MUTPB:
        toolbox.mutate(mutant)
        del mutant.fitness.values
```
このサンプルコードは解の交叉および変異を行っている部分です。
`toolbox.mate(child1, child2)`や`toolbox.mutate(mutant)`において実際の交叉や変異が行われているのですが、同じ親を元にした交叉や解の次元が低い場合の変異では少ない回数で重複した説明変数が出てきます。
`del ~~`の部分で説明変数が更新されているはずだから、適応度の計算をやり直すように値を消しておくのですが、上記のような例では重複した説明変数が出てくる可能性があります。
したがって、以下のように本当に説明変数が更新されたのかを判定することで目的関数の評価を重複した説明変数で行われることを避けられると考えられます。

```python
import copy

# 交叉
for child1, child2 in zip(offspring[::2], offspring[1::2]):
    if random.random() < CXPB:
        before_child1 = copy.deepcopy(child1)
        before_child2 = copy.deepcopy(child2)
        toolbox.mate(child1, child2)
        if before_child1 != child1:
            del child1.fitness.values
        if before_child2 != child2:
            del child2.fitness.values

# 突然変異
for mutant in offspring:
    if random.random() < MUTPB:
        before_mutant = copy.deepcopy(mutant)
        toolbox.mutate(mutant)
        if before_mutant != mutant:
            del mutant.fitness.values
```
カメラ目線でオンラインミーティングに参加できる特殊デバイス4選!


## 経緯
オンラインでミーティングをする際に，カメラと画面の位置が違うため，目線が合わないということがあります．
そんな問題を解決するカメラや，ソフトウェアをご紹介します．

イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/4384f740-2f9f-45da-e764-99532ebdc256.png)


## 1. テレプロンプター：「Pafieo S12」
鏡を用いたビデオカメラ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/29614b06-eb3d-7ffa-40a1-669f7f00f387.png)


[出典] https://share-photography.com/teleprompter/

これは下にiPadが設置されており，その上部にある鏡でユーザに情報を伝えています．鏡の奥側（画面右）にはビデオカメラが設置されており，ユーザの顔を撮影することができます．


## 2. NVIDIA Maxine
AIを用いたアイトラッキング．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/45e0bda5-a73e-adba-cc74-83c779c2ab39.png)

[出典] https://developer.nvidia.com/maxine

Maxineは，NVIDIAのGPU上で動作し，高度なAIモデルを活用して，ビデオ通話の品質や体験を大幅に向上させます．
AIを用いた視線補正ができる他，ノイズの除去や低帯域のネットワークでもスムーズに顔の動きを表示し，リアルタイムで表情の忠実な再現ができます．

## 3. 左右のカメラによる映像補正

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/52af0fbd-0445-4dc9-621e-4d41956e9086.png)


[出典] https://www.kanazawa-it.ac.jp/kitnews/2020/1215_saka.html

左右のカメラを用いて，中心に仮想カメラを作ることができ，映像の補正を可能にした研究です．


左カメラ画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/453c2036-d05c-b156-260b-67e7267312b3.png)


右カメラ画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/32c72037-e718-63e2-36a2-691da4d910d0.png)

画面中央の仮想カメラより作成された画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457930/5b3a7257-25f9-c4d0-bb12-9aafe5ccca13.png)

なかなかに面白いですね！



## 4. 「MEGA-AU」
個人的にはこれが一番すきです．
<iframe width="560" height="315" src="https://www.youtube.com/embed/0NDZWnmfbrw?si=rHJU0WU6yD2Y8yYG" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

[出典]　https://pc.watch.impress.co.jp/docs/news/1422738.html

カメラを強引にスクリーンの中心に配置することのできるデバイスです．
一番信頼のできる解決方法だと思います．

## おわり
紹介は以上です．
いいね，コメントお待ちしております．
JavaScript & jQueryの基本理解


※この記事は、Railsの基礎知識があることを前提に書いています。
　そのため、基本的な説明は省略しています。予めご了承ください。

# JavaScript

 **変数と定数**

* ``let``　：変数の宣言
* ``const``：定数の宣言（再代入不可）

バッククォーテーション（`）で囲み、文字列の中で${定数}とすることで、文字列に変数や定数の値を埋め込める

### 比較表
|  | **var** | **let** | **const** |
| --- | --- | --- | --- |
| 再宣言 | ◯ | × | × |
| 再代入 | ◯ | ○ | × |
| スコープ | 関数 | ブロック | ブロック |

<補足>
``var``は一見便利なように見えるが、スコープが広いため、意図しない参照やエラーの原因になりやすい
その場合には修正作業にもたくさんの時間を消費してしまうことが多いため、現在はほとんど使われていない
モダンな開発では、できる限り``const``が推奨されており、変数には一部``let``を使用する方針が主流


### 変数の巻き上げ（Hoisting）

変数の巻き上げとは、関数内のどこで変数を宣言しても、その宣言が関数の冒頭で行われたかのように扱われる現象のこと
ただし、巻き上げによって変数の宣言（var）のみが関数の先頭に移動
代入は巻き上げられず、そのままの位置に残る
そのため、関数の冒頭で変数を使用すると値は undefined になる。

具体例
``` javascript
var str = "Hello Javascript";

function foo() {
  var str;
  console.log(str);
}

foo();
// 出力結果：undefined
```

つまり、関数内で var を使用すると、変数の巻き上げにより意図しない挙動が発生する可能性がある
具体的には、関数の途中で再宣言された場合、値がリセットされるように見えることがある



### 関数（function）

コードの重複を避けて処理を簡単にするためのもの
処理に変更が必要な場合、関数内を変更するだけで済むため、保守性が高くなる

```javascript
function 関数名(引数){
  処理
  return 戻り値;
}
```

入力する値を「**引数（ひきすう）**」、出力される値を「**戻り値（もどりち）**」という


## jQuery

jQueryはJavaScriptのライブラリであり、DOM操作やAjax処理を簡単に実装でき、ブラウザの違いを意識せずにコードが書ける

※jQueryは、HTMLがすべて読み込まれてから動作するように設定しなければならない


 **基本書式**
```javascript
$(function() {
  // jQueryプログラムの内容
});
```

`.slideDown(1000);`

上から下へスライドして表示する。数値（1000など）でスライドの速度を設定できる。

**初期状態で非表示**にするために、CSSファイル（例：app.css）に **display: none; を設定**しておく。

`.slideUp()`

下から上へスライドし、表示されている要素を隠す。
**表示されている要素を隠すアニメーション**になるので、**display: none;の記述は不要**



`.show();`
`.css({'background-color': '#0000FF'});`

非表示の要素を表示する
**最初は非表示**になるように、**display: none;を追加** 


`.hide();`

逆に、表示されている要素を非表示にする

**display: none; を削除** 


`.slideDown();`、`.slideUp();`、`.show();`、`.hide();`の4つを使えるようになると、さまざまなスタイルに応用可能

**代表的な使用例**
* 詳細情報や追加情報の表示
記事一覧や製品一覧の画面で、「もっと詳しく」ボタンを押すと詳細が表示され、再度押すと非表示になる仕組み
初期状態では簡潔な情報だけが表示され、ユーザーが必要に応じて詳細を確認できるため、画面が見やすくなる
　　
* FAQページでの質問・回答の表示
質問一覧の中から、クリックした質問の回答のみを表示する仕組み
   　　 
* モーダルウィンドウ（ポップアップ）の開閉
ログインフォームやお知らせなど、画面上にポップアップ表示したいときに使用。
現在では `<dialog>` 要素を使用する方法が推奨されており、これにより、フォーカス制御や背景要素の無効化が簡単に実装可能。
　　
* タブの内容切り替え
タブをクリックすることで、そのタブに対応した内容のみを表示し、他の内容を非表示にする
Tailwind CSSでレスポンシブが効かない！！　ビューポートメタタグ


Tailwind CSSを使ってレスポンシブデザインを作成しているのに、画面サイズを変えてもデザインが変更されない！！
### その原因は、**ビューポートメタタグ**がないことでした！！

## ビューポートメタタグとは？

ビューポートメタタグは、ブラウザに「どのように画面サイズを扱うべきか」を指示するものです。このタグがないと、ブラウザはデスクトップ向けのサイズを基準にしてしまい、スマホやタブレットでの表示が崩れることがあります。

### 必要なタグ
以下のコードをHTMLの`<head>`内に追加しましょう。

```html
<meta name="viewport" content="width=device-width, initial-scale=1.0">
```

これで、ブラウザがデバイスの画面幅に合わせてページを適切に表示するようになります。

## このタグの役割

1. **`width=device-width`**  
   デバイスの画面幅をそのままビューポートの幅として使用します。これにより、ページが画面に収まり、横スクロールが発生しにくくなります。

2. **`initial-scale=1.0`**  
   ページの初期表示倍率を1倍（100%）に設定します。これにより、ズームされた状態ではなく、自然な大きさでコンテンツが表示されます。

## 実際のHTML例

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>レスポンシブデザイン</title>
  <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.16/dist/tailwind.min.css" rel="stylesheet">
</head>
<body>
  <!-- コンテンツ -->
</body>
</html>
```

このように設定することで、Tailwind CSSのレスポンシブクラスが正しく機能し、どんなデバイスでも快適な表示が可能になります。

## まとめ

Tailwind CSSでレスポンシブデザインを作る際、**ビューポートメタタグ**を追加するのを忘れないでください。これだけで、スマホやタブレットなどさまざまなデバイスでの表示が大幅に改善されます。シンプルな一手間で、デザインの品質がぐっと向上しますよ！
【トラブルシュート】Windows環境でPythonのJupyterLabをインストールしようとするとERROR: Could not install packages due to an OSError:が発生

## PythonをWindows環境で使う

こんにちは。私はPythonをWindowsで使ってるのですが
今更JupyterLabをインストールしようとしたときに躓いたので記録に残そうと思います。

## JupyterLabとは

JupyterLabは、Jupyter Notebookの後継として開発されたブラウザベースの対話型実行環境です。主にデータ分析、データ可視化、AI/機械学習などの分野で広く使用されています。つまりブラウザでPythonを実行するためのプラットフォームです。

## JupyerLabのインストール方法

インストール方法は`pip`で行いました

```
pip install jupyterlab
```

しかしここで1回目のエラーが発生しました。

## 1回目のエラー

以下のエラーが発生しました。

> ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory:


これはCMDやPowerShellを**管理者権限で実行してないから**なようです。

## 2回目のエラー

気を取り直してもう1回管理者権限でCMDを実行して

```
pip install jupyterlab
```

と実行しました。

そうしたら、また以下のエラーが発生しました。

> ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: 

エラーメッセージの下にヒントが書いてありました。

> HINT: This error might have occurred since this system does not have Windows Long Path support enabled. You can find information on how to enable this at https://pip.pypa.io/warnings/enable-long-paths

どうやら参照しようとしているパス名が長すぎるようです。

調べた結果、PowerShellを管理者権限で実行し以下を実行すると解消することがわかりました。

```
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
```

これでおそらくインストールは成功します。

起動するときは

```
jupyter lab
```

と実行するとサーバーが起動しました！

ぜひ躓いている方は参考にしてみてください。
【7日間でハッキングを始める本】【Mac】Meterpreterシェルからshellコマンド実行できない

## 実行環境
MacOSにUTMをインストール。
UTMを使ってKalilinux環境を作成しその中で実行。

## つまづいたとこ
Day7の「WordPressのハッキング実践」の7.5権限昇格の手法の調査でPeases-Ngシリーズをインストールするところまでは`upload`コマンドでターゲットマシンにアップロードできたがLinPEASの実行ができなかった。

## 解決方法
一度exitで抜けローカルマシンに戻って、
```txt:ターミナル
sudo apt install metasploit-framework
```
を実行しアップデートを行うとうまくいきました

## まとめ
よくエラーが起きた時は「アップデートをしろ」というのは目にすることが多いですが今回身をもって体験しました。今後も何かあったらとりあえず最新のものにするのを忘れないようにしようと思います
railsアプリのフォルダ構造

```rb
／<作成したアプリケーションの名前>
    Gemfile #必要なgemを定義
    Gemfile.lock #インストールされたgemのリスト
    README.md #readmeファイル
    Rakefile #ターミナルから実行可能なジョブ
    ／app
        ／assets #アセット(javascript/スタイルシート、画像などのリソース)
            ／config #アセットバイプライン
            ／image # 画像ファイル
            ／styleshieets # CSS(SCSS)スタイルシート
                application.css # アプリケーション共通のスタイルシート
        ／channels # Action Cable実装クラス
        ／controllers # コントローラクラス
            application_controller.rb # アプリケーション共通のコントローラ
        ／helpers # ビューヘルパー
            application_helper.rb # アプリケーション共通のビューヘルパー
        ／javascript # javascriptライブラリ
            application.js # アプリケーション共通のjavascriptエントリポイント
        　　／controllers # Stimulusのコントローラ
        ／jobs # Active Jobのジョブクラス
        ／mailers # Action Mailer実装クラス
        ／models #モデルクラス
            application_record.rb # アプリケーション共通のモデルクラス
        ／views # ビュースクリプト
            ／layouts # レイアウト
                application.html.erb # アプリケーション共通のレイアウト
    ／bin # アプリケーションのための実行バイナリ
    ／config # アプリケーション本体、ルーティングなどの設定情報
        application.rb # アプリケーション共通の設定情報
        boot.rb # アプリケーション起動時の設定情報
        cable.yml # Action Cableの設定情報
        credentials.yml.enc # Active Storageの証明書情報
        database.yml # データベース設定情報
        environment.rb # アプリケーションの起動スクリプト
        environments # 環境単位の設定ファイル
        importmap.rb # Import Mapの設定ファイル
        ／initializers # 初期化ファイル
        ／locals # 辞書ファイル
        master.key # 作成されたキー情報
        puma.rb # サーバ起動時の設定情報
        routes.rb # ルーティングの設定情報
        storage.yml # Active Storageのデータベース設定情報
    config.ru # アプリケーションのエントリポイント
    ／db # データベースファイルやスキーマ情報、マイグレーションファイルなど
    ／lib # 自作のライブラリ
        ／assets # 自作ライブラリに関連するアセット
        ／tasks # タスク関連
    ／log # ログの出力先
    ／public # 公開フォルダ
    ／storage # Active Storageのディスクストレージ
    ／test # テストスクリプト
    ／tmp # 一時ファイル
    ／vendor # サードパーティのファイル
```   
https://gihyo.jp/book/2022/978-4-297-13062-6

# 感想
これから掘り下げるぞ

# 関連
https://qiita.com/masatom86650860/items/64c4ccb117dd41a28961
ServiceNowマイグレーションにおける自動移行対象物一覧

## 概要
ServiceNow を新しいインスタンスにマイグレーションする際、更新セットに含まれる要素は自動的に移行されます。以下がその主なものです。
※認識違いなどあればお気軽にご指摘ください。


| # | 要素 | 更新セットへの反映 |
|:--:|:-----------|:------------:|
| 1 | ACL | ○ |
| 2 | SLA | ○ |
| 3 | UIポリシー | ○ |
| 4 | UIアクション | ○ |
| 5 | アプリケーションメニュー | ○ |
| 6 | クライアントスクリプト | ○ |
| 7 | グループ | - |
| 8 | サーバースクリプト | ○ |
| 9 | システムプロパティ | ○ |
| 10 | スクリプトインクルード | ○ |
| 11 | スケジュールジョブ | ○ |
| 12 | ダッシュボード | - |
| 13 | チョイス | ○ |
| 14 | 通知 | ○ |
| 15 | ディクショナリエントリ | ○ |
| 16 | テーブル | ○ |
| 17 | フィールド | ○ |
| 18 | フォーム | ○ |
| 19 | ポータルウィジェット | ○ |
| 20 | ポータル画面 | ○ |
| 21 | ユーザー | - |
| 22 | ルックアップルール | ○ |
| 23 | ラベル | ○ |
| 24 | レポート | ○ |
| 25 | ロール | ○ |
| 26 | ワークフロー | ○ |

これらの要素は更新セットに含まれるため、自動的にマイグレーションされます。一方で、ダッシュボードやユーザー設定などは更新セットに含まれないため、別途移行の計画（XMLで移送する、本番環境でダッシュボードは組み立てるなど）が必要となります。
ServiceNow の移行を検討する際は、このリストを参考に、更新セットに含まれる要素とそうでない要素を見極めることが重要です。
Google Groups の tips

## 誰もがメッセージを送れるようにする

ディフォールト

![groups01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/002898d9-ecc8-f1a1-3f4c-d1f3e63b6b10.png)


ウェブ上のすべてのユーザー　が投稿てきるようにする

![groups02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/37d6dbaa-1e8b-42d8-2d82-aa333df4393c.png)

## 特定のユーザーがメッセージを送れるようにする

ディフォールト

![groups03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/403d672a-f4f4-9f59-4ada-88e6361ca6ed.png)

メールなし　とする
　このメンバーは、メールを送るだけで配信は受けない

![groups04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/13b6decd-40d9-796a-ab93-8cf36147dcb4.png)

特定のメールアドレスで受けたメールを、Google Groups に転送するという使い方ができます。
【Go】 make と new の違い


Go言語では、データを初期化するために`make`と`new`という2つの異なる関数が用意されています。これらは似たような役割を持つように見えますが、実際には異なる目的と使用方法があります。
#### 1. `new`関数

- **基本的な役割**: `new`は任意の型のゼロ値を持つポインタを生成します。
- **使い方**: 例えば、`new(int)`とすると、整数型のゼロ値（0）を持つポインタが作成されます。
- **具体例**:
  ```go
  var num *int = new(int)  // int型のポインタを作成
  fmt.Println(*num)        // 0が出力される
  *num = 42                // ポインタを通じて値を変更
  fmt.Println(*num)        // 42が出力される
  ```

#### 2. `make`関数

- **基本的な役割**: `make`はスライス、マップ、チャネルを初期化するために使用されます。これらのデータ構造には内部状態があり、`make`を使うことでそれらを正しくセットアップできます。
- **使い方**: 例えば、`make([]int, 5)`とすると、5つの要素を持つ整数型スライスが作成されます。
- **具体例**:
  ```go
  slice := make([]int, 5)  // 5つの要素を持つスライスを作成
  fmt.Println(slice)        // [0 0 0 0 0]が出力される
  slice[0] = 10             // スライスの要素を変更
  fmt.Println(slice)        // [10 0 0 0 0]が出力される
  ```

#### 3. `make`と`new`の違いまとめ

| 特徴          | `new`                                   | `make`                               |
|---------------|-----------------------------------------|-------------------------------------|
| 目的          | 任意の型のゼロ値ポインタを生成する    | スライス、マップ、チャネルを初期化する |
| 返り値        | ポインタ（ゼロ値を持つ）              | 初期化されたデータ構造              |
| 使用例        | `new(int)`                             | `make([]int, 5)`                   |

### まとめ

- **`new`を使う場合**: 自分が作成した構造体や基本的なデータ型のポインタを扱いたいとき。
- **`make`を使う場合**: スライス、マップ、チャネルのような内部状態を持つデータ構造を初期化したいとき。
初投稿とテスト

自己紹介
---
　どうも、alcyと言います。読み方は、「えるしー」です。
　そこら辺のロボットがとても好きな高専生です。
　学科は機械系です。


 
　拙い文章ですが、読んでいただけると幸いです。

投稿に至った経緯
---
　先日、アウトプット大全(著：樺沢 紫苑、)を読み、自分も何か発信をしたいと思い書いております。
　これから個人活動でロボットを作ったり、何か作ったときの記録やアウトプットとして残そうと思います。
　Qiitaは大いに助けられたので制作日記を残して後の誰かの助けになればと思っています。

使う言語
---
　・Arduino

　　基本的にArduinoをこねくり回します。

 目標
 ---

　初めから大きな目標を立ててしまっては三日坊主ではすまないので、小さなステップから。ということで、2つ決めました。
 
　・毎週少しずつ進めているプロジェクトの制作過程の投稿
　・授業課題のロボットの制作過程の投稿

　後々、個人製作の投稿がされていくと思います。

 さいごに
 ---
　みなさん、「ニコニコ技術部」は好きですか？私はとても大好きです。私のものづくりの憧れの源泉は、幼少期に見たニコニコ技術部だったのだと最近感じます。
　自分語りですが、私が本格的にロボットを作ることになったのは、高専の実習課題が初めてでした。それより前からロボットは好きでしたが、なまけものでしたので始めていませんでした。しかし始めてみると、とても面白い。それからまた大好きになっていきました。くだらないものでも、これからも作り続けられるようにいたいと思います。

 それでは、また次回。
Python 3 エンジニア認定実践試験対策 (3)　- venv

Pythonを数年使ってきて、改めて知識の整理と最新仕様のキャッチアップのために Python 3 エンジニア認定実践試験を受験しようと思い、私的に作成した資料から簡易版を作成しました。
最後に練習問題を設けましたので、解説を読んだら記憶定着のために練習問題へチャレンジしてください。最後に答えを掲載しています。

### 仮想環境（venv）とは
- **目的**: プロジェクトごとに異なるPythonのバージョンやパッケージを独立して管理するための仕組み。
- **利点**: システム全体に影響を与えずに、特定のプロジェクトに必要な環境を構築できる。検証用環境として一時的に作成するケースにも利用されます。

### venvの使い方

1. **仮想環境の作成**
   ```bash
   python3.x -m venv <任意のディレクトリ名>
   ```
   例: `$ python3.11 -m venv myenv`
   作成された仮想環境用ディレクトリに、仮想環境に必要なリソースが配置される。

2. **仮想環境の有効化**
   - Unix系（bash/zsh）:
     ```bash
     source <venv>/bin/activate
     ```
   - Windows（コマンドプロンプト）:
     ```cmd
     <venv>\Scripts\activate.bat
     ```
   - 仮想環境を有効化するスクリプトは、仮想環境ディレクトリ/binに配置される。
   - 使用するOSやシェルによってスクリプトの場所と実行方法は異なるので、公式情報を調べる。
   - 仮想環境が有効化されると、プロンプトの先頭に仮想環境ディクトリ名が表示される。

3. **仮想環境の無効化**
   ```bash
   deactivate
   ```
   - 無効化するとプロンプトはシステム共通のpython環境に戻ります。

4. **仮想環境の削除**
   - 不要になった仮想環境は、ディレクトリごと削除。

5. **仮想環境の整備（最初にやること）**
   - pipのアップグレード
   - 必要なパッケージのインストール
   - `requirements.txt`の作成（仮想環境を作り直す必要が発生した時に便利）

### 予備知識
- **pipのバージョン**: venv作成時に指定したPythonに搭載されているpipがインストールされるが、`--upgrade-deps`オプションを使うことで最新版に更新可能。
- **Windowsの実行ポリシー**: PowerShellで仮想環境を有効化する際、実行ポリシーが制限されている場合はエラーが発生する。解決策として、実行ポリシーを`RemoteSigned`に変更する必要がある。
- **Pipenv**や**Poetry**: pipとvenvの機能を持つサードパーティの代替ツールで、依存関係の管理が容易。

---
# 仮想環境（venv） - 確認問題

1. 仮想環境（venv）の主な目的は何ですか？
   a) システム全体のPythonを更新するため  
   b) プロジェクトごとに異なるPythonのバージョンやパッケージを独立して管理するため  
   c) Pythonのバージョンを自動的にインストールするため  
   d) プロジェクトのコードを自動的にデプロイするため  

2. 仮想環境を作成するコマンドはどれですか？
   a) `python3.x create venv <ディレクトリ名>`  
   b) `python3.x -m venv <任意のディレクトリ名>`  
   c) `create venv <ディレクトリ名>`  
   d) `venv create <ディレクトリ名>`  

3. Unix系システムで仮想環境を有効化するためのコマンドはどれですか？
   a) `activate <venv>`  
   b) `source <venv>/bin/activate`  
   c) `venv activate <venv>`  
   d) `run <venv>/bin/activate`  

4. 仮想環境を無効化するためのコマンドは何ですか？
   a) `exit`  
   b) `quit`  
   c) `deactivate`  
   d) `stop`  

5. WindowsのPowerShellで仮想環境を有効化する際に、実行ポリシーが制限されている場合の解決策は何ですか？
   a) `Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser`  
   b) `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser`  
   c) `Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser`  
   d) `Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope CurrentUser`  

解答:
1. b  
2. b  
3. b  
4. c  
5. b
【Bedrock開発入門 刊行後サポート】Anthropic Python API libraryのトークン数算出ができなくなりました

Bedrock開発入門の刊行後サポートです。

[出版社サイト](https://www.sbcr.jp/product/4815626440/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/7855b429-1ac0-d392-b16b-ea6fdbcf826c.png)

---

Anthropic Python API libraryが、2024/11/4公開のバージョン0.39.0にて、トークン算出メソッドがなくなりました。

https://github.com/anthropics/anthropic-sdk-python/releases/tag/v0.39.0

もともと、Claude 2にしか対応しておらず、将来的にClaude 3に対応することを期待して紙面上含めていたのですが、対応することなく終わってしまいました。

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Anthropic' object has no attribute 'count_tokens'
```

代替方法が提供されていますので、そちらを紹介します。

## Token counting API

Claude開発元のAnthropicが「Token counting API」を提供しています。

https://docs.anthropic.com/en/docs/build-with-claude/token-counting

:::note warn
2024/11/7時点でAmazon Bedrockでは未提供です。
:::

:::note warn
AnthropicのAPIを使用するためには、APIキーが必要なのですが、APIキーの発行にはアカウント作成とクレジットの購入が必要です。（多分）
トークンカウントを試すために課金するのはもったいないと思いますので、ふーん　程度で御覧ください。
:::


Anthropic Python API libraryを利用するのに必要な外部ライブラリ「anthropic」をインストールします。

```shell
pip install anthropic==0.39.0
```

以下のPythonコードを入力します。
api_keyはご自身のAPIキーに変更してください。

```python
# Pyhton外部モジュールのインポート
from anthropic import Anthropic

# クライアントの生成
client = Anthropic(api_key="*****")

# API呼び出し
count = client.beta.messages.count_tokens(
    model="claude-3-5-sonnet-20241022",
    messages=[{"role": "user", "content": "Hello, world"}],
)

# トークン数を出力
print(count.input_tokens)
```
```
10
```

## Bedrockの呼び出し結果から取得する

Bedrockの場合は呼び出し結果として使用トークンが取得できます。呼び出し前にトークン数を把握する方法はありません。

* InvokeModel APIの場合
    
    ```python
    import json
    import boto3
    
    client = boto3.client("bedrock-runtime", region_name="ap-northeast-1")
    
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1000,
            "messages": [
                {
                    "role": "user",
                    "content": "Bedrockってどういう意味？",
                }
            ],
        }
    )
    
    response = client.invoke_model(
        modelId="anthropic.claude-3-5-sonnet-20240620-v1:0", body=body
    )
    
    response_body = json.loads(response.get("body").read())
    print(response_body["usage"])
    ```
    ```
    {'input_tokens': 18, 'output_tokens': 364}
    ```
    
* Converse APIの場合
    ```python
    import boto3
    
    client = boto3.client("bedrock-runtime", region_name="ap-northeast-1")
    
    message = {
        "role": "user", 
        "content": [
            {"text": "Bedrockってどういう意味？"}
        ]
    }
    
    response = client.converse(
        modelId="anthropic.claude-3-5-sonnet-20240620-v1:0",
        messages=[message],
        inferenceConfig={"maxTokens": 1000},
    )
    
    print(response["usage"])
    ```
    
    ```
    {'inputTokens': 18, 'outputTokens': 356, 'totalTokens': 374}
    ```

---

書籍を購入いただいた皆様にできるだけ最新情報を継続的にお伝えしていきたいと思います。（今から買っても遅くないので、ぜひご購入を！w）
ファイルbの行のうち、ファイルaに含まれない行を全部出力


```bash
# a.txt に含まれているファイルを含めずに b.txt の中身を出力
grep -Fxvf a.txt b.txt
```

これだけです。今までこれを知らなかったので非常に面倒なことをやっていました。

例えば、a.txt に「実際に使用されているファイルのリスト」、b.txt に「プロジェクトに含まれているすべてのファイルのリスト」が入っているとします。b.txt の中で a.txt に含まれていないファイルを取り出して「不要なファイル」としてリスト化したい場合に便利です。

```
-F は固定文字列として検索するオプションです。
-x は完全に一致する行を検索します。
-v は除外オプションで、a.txt に含まれている行を b.txt から除外します。
-f a.txt で a.txt の行を検索条件として使い、結果を 
```

結果、b.txt の中で a.txt に含まれていない行だけが出力され、不要なファイルのリストが作成されます。

具体例

以下のような内容がファイルに含まれているとします：

```a.txt（実際に使用されているファイルのリスト）
app/controllers/document_controller.py
app/controllers/file_packager.py
app/models/date_time_in_note.py
config/settings.py
scripts/main.py
```

```b.txt（すべてのファイルのリスト）
app/controllers/document_controller.py
app/controllers/file_packager.py
app/models/date_time_in_note.py
config/settings.py
scripts/main.py
scripts/api_sample.py
tests/excel_style_diff.py
tests/profile_view.py
```

上記のコマンドを実行すると、b.txt にあるが a.txt に含まれていないファイルが出力されます：

```bash
$ grep -Fxvf a.txt b.txt
scripts/api_sample.py
tests/excel_style_diff.py
tests/profile_view.py
```

この方法で、b.txt の中で実際に使われていないファイルを確認することができます。

----
### 補足
以下でも同じことができます。
```
# ファイルをソートしてから比較
sort a.txt > a_sorted.txt
sort b.txt > b_sorted.txt

# a_sorted.txt にない行を出力（不要なファイルのリスト）
comm -23 b_sorted.txt a_sorted.txt > unnecessary_files.txt
```
railsのライブラリ構造

# Action Pack
### Action Controller
>Controllerを担当。
リクエスト処理、状態管理、レスポンスの生成などを司る

### Action View
>Viewを担当。テンプレートに基づいてレスポンスを生成。
開発に役立つヘルパーやレイアウト機能を提供。Ajaxにも対応。

### Action Dispatch
>リクエスト処理の委譲先を決定するルーティング機能を提供

# Active Model
>命名規則/検証機能など、Modelの基本的な規約を定義

# Active Record
>データベースへのアクセスを担当、O/Rマッパー

# Action Mailer
>メールの送受信機能を提供

# Action Mailbox
>メールの受信ん機能を提供

# Action Text
>リッチテキストの表示/編集機能を提供

# Action Cable
>リアルタイムの双方交通新機能を提供

# Active Storage
>ストレージサービスへのデータストア機能を提供

# ACtive Resource
>Webサービス関連のフレームワーク

# Active Support
>Rubyの拡張ライブラリ

# Railties
>railsの各種コンポーネントをつなぎ合わせるRailsのコア

https://gihyo.jp/book/2022/978-4-297-13062-6

* O/Rマッパーとは？
* リッチテキストとは？
* railsのコアとは？

# 感想
これら疑問は後々理解できると思う。
このうち４つぐらいしか使った覚えがない

# 関連
https://qiita.com/masatom86650860/items/2f307e06190fea5c9e65
Outlook メールの添付ファイルを OneDrive for Business / SharePoint に保存したけれど添付ファイルが開かない理由

ごきげんよう、百合宮桜です。
今回は意外とひっかかるヒトが多い、添付ファイルの保存について説明します。

# こんな事ありませんか？
- Power Automate で作成したフローはエラーなく動いている
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/53031ee6-c6f6-0ff0-946e-f53bbab463b2.png)

- でも保存された添付ファイルを開こうとすると、「おっと。このファイルをプレビューできないようです」と言われてしまう
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/95cb4067-249e-4633-5a2a-378c04cf5968.png)

これは添付ファイルの中身で「ファイルコンテンツ」が OneDrive や SharePoint に保存されていないから発生します。つまり、ファイルコンテンツが保存されるように設定を変更すれば解決です。
上記症状が当てはまった方は次の設定を確認してみてください！

# 「添付ファイルを含める」は「はい」になっていますか？
「新しいメールが届いたとき」のトリガーを使用している際は「添付ファイルを含める」のプロパティを確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/d5d79985-a28c-1dab-8883-755454803e15.png)

ここが「いいえ」になっていると、添付ファイルのファイルコンテンツを SharePoint や OneDrive に保存できません。必ず「はい」になっていることを確認してください。

# ファイルコンテンツを正しく指定できていますか？
トリガーで取得したファイルコンテンツを指定しないと、添付ファイルが正しく保存されません。
「添付ファイル コンテンツ」を指定しているかを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/e463fbb1-caf9-dc40-8e47-77242a53195a.png)

# おわりに
Power Automate では設定を間違えているから想定通りの結果が得られないというパターンがよくあります。この設定が間違っているパターンは人間が認識違いをしているだけなので、プログラム的にはエラーになりません。なのでかえって原因の特定が難しいです。
こういう時は実行履歴から入出力の結果を眺めて、心当たりをひたすら潰していくしかありません。

実行履歴は28日間の実行履歴 > 当該実行日時をクリックすることで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/dbea1595-05b8-445d-1049-60a76077f9e7.png)

入力 / 出力の結果は「未加工入力の表示」をクリックすると見やすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/5fbcf96e-6a3d-c1b7-1324-258c09f73142.png)

今回の場合はトリガーの「添付ファイルを含める」の設定を間違えていたことと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/122299d7-79f3-3eb4-f3f3-3e6614c7d729.png)

その影響でファイルコンテンツが取得できなかったことが原因でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/084c29c5-437b-148a-edee-5fcfaabb2bcb.png)

Power Automate で Outlook メールの添付ファイルを扱う記事は古いものが多いです。当時は正しかった情報でもアップデートによってちょっと違う動きになっていることもあります。
皆さんも想定通りの結果にならない時は自分自身で作ったフローの実行結果をよく確認して、何がおかしくて想定通りの動きにならないのかを考えてみてくださいね！
デプロイした時に`Failed to open stream: No such file or directory`になった話

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はデプロイした時に困ったことがあったのでそのことを記事にします。

Laravel11を使用しています。

# 困ったこと

Laravel11をGitHub Actionsを使用してXServerにデプロイをしました。

その後、ブラウザでアクセスした時に以下のエラーが出ました。

```
file_put_contents(/home/xs138787/stg/storage/framework/sessions/dX5qYHmfhQ6VmgZd8wKvGKKO25EkaEGJWzqxzlBf): Failed to open stream: No such file or directory
```


# 解決策

以下のコマンドをサーバで実行して足りないフォルダを作成すると、エラーが消えて治ります。

```
mkdir -p storage/framework/sessions
mkdir -p storage/framework/cache/data/
mkdir -p storage/framework/app/cache
mkdir -p storage/framework/views
```

# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://eclair.blog/laravel-cache-path-error/
要件定義の失敗

## 要件定義における失敗
最近要件定義で大失敗いたしまして、案件が大々炎上しています。
起きた問題、原因、問題に対するアクション、今後について書き記します。

### 起きた問題
時系列的に話します。
今回の案件は私の上司が営業をして提案を行っていました。基本合意が完了した段階で私にキックオフ資料とWBSの作成の依頼が飛んできました。提案資料内容を元にキックオフ資料とWBSを作成しました。内容も上司に確認を取り、すり合わせた内容とそういないことを確認しました。
迎えたキックオフ、、
顧客からは開発する追加の要件がドンドンでてきます。あれもやってほしい、これもやってほしいと、、
その段階で私の作ったキックオフ資料とWBSは意味をなさなくなりました、、
また3ヶ月のプロジェクトなので、追加で要件を盛り込める余裕はないです。バッファを削りギチギチのWBSを創ることになりそうです。

### 原因
今回の原因は何でしょうか？
要件定義段階でスコープが具体的じゃなかったからだと思います。
今回はAIモデルのPoCの案件だったので、成果物として開発したAIモデルとその評価、ドキュメントが考えられます。
その成果物をより具体的に落とし込み、スコープを握ること。
できるなら触りだけでもプロトタイプ版を作成し、完成品を共有すること。
これをやっていなかったのだと思いました、、、

### 問題に対するアクション
今回は改めて要件定義を実施します。
顧客が想定する成果物とこちらが想定する成果物を改めて認識を合わせます。
そこをやらないとまたズレ始めますからね、、

### 今後
プロトタイプを作る重要性がわかりました。自分の体感ですが、書面だけでシステムを共有することと動くものを使ってシステムを共有するのでは、共有度が3倍ちかく異なると感じました。今は生成AIが普及して、早く動くものを作れるようになっています。これをうまく使ってさっさと作る。さっさと見せるを大事に仕事をしていきたいと思いました。
Sui Moveをインストールする

今後SUIが普及することを期待して、そのベースにある move を勉強するための備忘録です。
2024/11/7時点で move に関する日本語の記事はほとんど見当たらなかったので、こういった形で誰かの参考になれば幸いです。

# Move チュートリアル

Moveという言語に関しては [The Move Book](https://move-language.github.io/move/introduction.html) に大体情報がのっているので、直接読める方はそちらを参考にする方が早いかと思います。その中を少し見ると[チュートリアル](https://github.com/move-language/move/tree/main/language/documentation/tutorial)があってインストールの手順から丁寧に書かれているかと思います。

以下ではチュートリアルにある「Step 0: Installation」に書いてあることをなぞっていきます。ここで大事なのが、私の場合手順通りにやるとうまくいかなかったことです。なので私の場合ではありますが、何が原因でどう改善すればよいかまとめていきます。

あまり関係ないかもしれないですが、一応参考のために導入したPCの環境を記載しておくと MacBook Air M2, 2022 で OS は Sequoia 15.1 です。

# Move のインストール

それでは実際に「Step 0: Installation」をなぞっていきます。まずターミナルを開いて以下のコマンドを実行します。すると今いるディレクトリの下に move ディレクトリができます。

```
git clone https://github.com/move-language/move.git
```

その move ディレクトリに移動してdev_setup.shファイルを実行します。
```
cd move
./scripts/dev_setup.sh -ypt
```
これによりRustなどの環境も同時に導入されます。またルートフォルダに.profileというファイルもできるのでそれを実行します。

```
source ~/.profile
```
次に、Moveのコマンドラインをインストールします。
```
cargo install --path language/tools/move-cli
```
最後にmoveのコマンドが動けば無事moveが導入されたことになります。
```
move --help
```
以上の手続きが問題なく終われば以下の内容は関係ないので以上となります。

# 導入時の問題と改善方法

ここでは私が遭遇した問題と改善方法について書きます。

## 導入時の問題

私はチュートリアルにある

```
cargo install --path language/tools/move-cli
```

というコマンドでエラーが起きました。

そのエラーは以下のようなもの
```
error: failed to compile move-cli v0.1.0, intermediate artifacts can be found at /Users/(ユーザーネーム)/Desktop/move/target

Caused by:
  package icu_locid_transform_data v1.5.0 cannot be built because it requires rustc 1.67 or newer, while the currently active rustc version is 1.65.0
  Either upgrade to rustc 1.67 or newer, or use cargo update -p icu_locid_transform_data@1.5.0 --precise ver where ver is the latest version of icu_locid_transform_data supporting rustc 1.65.0
```

で要するに導入した rustc のバージョン（1.65.0）が古いため、move-cliをインストールできないというエラーでした。そこで素朴にアップデートを試みます。
```
rustup update stable
```
しかし、アップデートした後に
```
rustc --version
```
でバージョンを確認してもバージョンは古いままで全然更新されませんでした。

つまり、アップデートを試みても rustc のバージョンが古いままになっているせいで導入がうまくいかないということがわかりました。

## 改善方法

先ほど見た問題の解決は単純で

```
cd move
./scripts/dev_setup.sh -ypt
```

というコマンドを実行した時に導入される moveディレクトリの rust-toolchain というファイルを書き換えるだけです。このファイルは単に「1.65.0」と書かれているだけですが、これを例えば「1.82.0」とします。

```:rust-toolchain
1.82.0
```

これによって私の場合は無事インストールが完了しました。

このファイルのせいで rustc のバージョンが指定されてしまい、 rustup update を試みても更新できなかったということが起きていたようです。


## 結論

チュートリアル通りにやるとエラーが生じるわけですが、それはチュートリアルにあるコマンドを実行したときに導入される rust-toolchain というファイルが原因だということがわかりました。

それによって rustc のバージョンを更新できず、古いままになってしまうため、rust-toolchain というファイルの中身を「1.65.0」から「1.82.0」に書き換えることでチュートリアルを完了することができました。

Moveをこれから使っていこうと思っている人に少しでも役に立てば幸いです。
vSphere 8.0 U3 メモリ階層化(Tech Preview)

今回は、メモリ階層化(Memory Tiering)機能に関して紹介します。
vSphere 8.0U3からTech Previewとして実装された機能です。

2023年にリリースされたvSphere 8.0 U3には、今後のvSphere環境でのメモリ管理のあり方を大きく変える可能性を秘めた「メモリ階層化」機能がTech Previewとして実装されました。この機能は、従来のメモリの使用方法とは異なり、DRAMメモリの代替として、専用に用意したNVMeデバイスを活用してメモリリソースを補完する技術です。まだ本番環境での利用は推奨されていない段階ですが、次期VCF 9リリースにおいて正式にサポートされる予定であり、注目を集めています。

さらに詳しい情報については、以下のサイトからダウンロードできるMemory Tiering over NVMe Tech Preview - vSphere 8.0.3 Technical Guideで公開されています。

https://knowledge.broadcom.com/external/article/311934/using-the-memory-tiering-over-nvme-featu.html

この記事では、メモリ階層化の仕組みと、ユーザーにどのようなメリットをもたらすかについて解説していきます。

## 1. メモリ階層化とは？

メモリ階層化は、vSphereホストのメモリ管理において、専用のNVMeデバイスを「セカンドティアメモリ」として利用する新しいアプローチです。従来、vSphereでは主にDRAMメモリが使用されてきましたが、NVMeを補助的に用いることで、メモリコストの削減やパフォーマンスの向上が期待できます。

この機能の実装により、ホストメモリが逼迫する際に、DRAMからNVMeに20~25%のメモリアクセスがオフロードされるようになりました。

## 2.メモリ階層化によるコスト効率の向上

メモリ階層化により、物理サーバーにおけるDRAMメモリの消費を20〜25%削減することが期待されています。物理サーバーでは、メモリは最もコストがかかる構成要素の一つです。例えば、256GBメモリを搭載したホストを10台用意すると、コストは数千万円に上りますが、この機能を活用することで最大25%のメモリコストを削減し、予算の有効活用が可能になります。

特に、NVMeデバイスの価格がDRAMに比べて格段に低いことから、物理サーバー全体のコスト効率が大幅に改善されます。
NVMeデバイスは、コンパチビリティガイドに記載されている条件（SSDタイプ、パフォーマンスクラスF、耐久性クラスD）を満たすものが推奨されており、これにより適切なデバイス選定が容易になります。
Memory Tiering over NVMe Tech Preview - vSphere 8.0.3 Technical Guideで公開されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/8babc722-9a04-4d37-2e1d-465da5c24494.png)

また、この機能を導入することで、仮想マシンを運用する際にかかるメモリ関連のコストが削減され、より効率的な投資が可能になります。vSphere単体での利用はもちろん、VCF全体でのコスト削減効果も期待できる点は見逃せません。

参考：HPE DL360 Gen11を例
メモリ価格
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/f527b77e-e1d6-2f57-8347-b94a362e123a.png)
ProLiant DL360 Gen11 システム構成図：
https://h50146.www5.hpe.com/products/servers/proliant/system_pdf/dl360gen11.pdf


NVMeデバイス価格
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/023561b6-1ea9-c904-3f5a-0a107a405d4a.png)
HPE SSD仕様比較表：
https://h50146.www5.hpe.com/products/servers/proliant/system_pdf/ssd_spec.xlsx

## 3.パフォーマンス向上と仮想マシンへの影響

メモリ階層化により、メモリバルーニング問題も改善されます。従来、メモリが逼迫するとvSphereは「メモリバルーニング」機能を用いて仮想マシンに割り当てるメモリを縮小させることで対応していましたが、この状態では仮想マシンのパフォーマンスが低下し、稼働に影響を与えてしまう可能性が高いです。

しかし、メモリ階層化を利用することで、DRAMの一部がNVMeデバイスにオフロードされるため、バルーニングが発生しにくくなり、仮想マシンの安定稼働を維持できます。また、仮想マシン自体はDRAMとNVMeの違いを意識することなく動作します。

## 4.今後の展望

vSphere 8.0 U3でのメモリ階層化は、まだTech Previewの段階ですが、次期VCF 9のリリースに合わせて正式サポートが予定されています。今後、より多くの改善や最適化が加えられることで、vSphereを利用した仮想インフラのパフォーマンスがさらに向上し、メモリ管理の課題を解決する手段としての可能性が広がるでしょう。

メモリ階層化が正式にリリースされることで、ユーザーはメモリコストの削減やパフォーマンス向上の恩恵を受け、柔軟なメモリサイジングが可能になります。私個人としても、この機能が正式にリリースされることを非常に楽しみにしています。

## まとめ

メモリ階層化は、コスト効率、パフォーマンスにおいて従来のDRAMのみを利用するアプローチを大きく超える可能性を秘めています。Tech Previewであるため、まだ本番環境での導入は難しいですが、VCF9リリースに向けてさらなる改善が期待されます。vSphereユーザーにとって魅力的な選択肢となると思います。
ChromeでDNSキャッシュを削除する

下記にアクセスし、赤い矢印のボタンを押しましょう

```
chrome://net-internals/#dns
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/cab6e646-815a-4804-735c-0a687d555aa2.png)


##### オススメ

```
chrome://net-internals/#sockets
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/62d87203-f60b-116a-4ead-40d73693ed64.png)
【Power Automate & Dataverse】Dataverse の更新時に対象行の URL を取得する

# 【Power Automate & Dataverse】Dataverse の更新時に対象行の URL を取得する

https://qiita.com/MakotoIshikawa/items/35915a19d54e06e75f92

前回、ユーザー検索列を使った承認フローの作り方を紹介しました。今回は、その承認フローに更新のあったアイテムの URL を設定したいと思います。

Dataverse の更新トリガーでフローを開始し、その更新されたアイテムの URL を取得する方法について説明します。

## Power Automate で承認フローを作成する

※ここでは、例として『行が追加、変更、または削除された場合』のトリガーでフローを開始しています。

### JSON の解析

1. 『JSON の解析』アクションを配置します。
2. [Content] に『行が追加、変更、または削除された場合』トリガーの [本文] を指定します。(`@{triggerBody()}` )
3. [Schema] に**アイテム内部ID** (ItemInternalId) を取得できるようにスキーマを入力します。
   ![image-20241107173019077.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/27f3a6ed-6985-b04d-d4d4-fe20a59abe9a.png)

#### アイテム内部ID を取得するスキーマ

```json
{
   "type": "object",
   "properties": {
       "ItemInternalId": {
           "type": "string"
       }
   }
}
```

### URL の文字列の作成

Dataverse のレコードの URL は以下の形式になります。
※事前に Dataverse のテーブルを編集するモデル駆動型アプリを作成して URL をメモしておいてください。

```html
https://<your_org_name>.crm.dynamics.com/main.aspx?appid=<app_id>&pagetype=entityrecord&etn=<entity_name>&id=<record_id>
```

『作成』アクション等で URL 文字列を作成します。**record_id** の部分に『JSON の解析』アクションで取得した**アイテム内部ID** を設定します。
![image-20241107174450075.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/8e7f903b-2337-8809-6fab-acf06c9cc522.png)

### 承認アクションに URL を設定

『開始して承認を待機』アクションを追加し、[アイテム リンク] フィールドに先ほど生成した URL を設定します。
![image-20241107175058766.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/d81c27d4-bbc9-d096-8c14-10eccd5f3cce.png)

# 参考サイト

- [行が追加、変更、または削除された場合、フローをトリガーする - Power Automate | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-automate/dataverse/create-update-delete-trigger?tabs=classic-designer)
- [Dataverseのデータ更新時に更新された行IDを取得する｜どこかの人です](https://note.com/dokoka3568/n/n7c035a0c4a6f)
【AWS】LocalStackでLambda関数の作成

# 環境
https://qiita.com/shutamo/items/c1ea90f623cabc8002cc

```cmd
// dockerを起動
docker-compose up -d
```

# Lambda関数の作成
zipファイルを使って関数を作成する方法で実施。

### 1.コードファイルの作成
```js:index.mjs
export const handler = async (event) => {
    // TODO implement
    const response = {
      statusCode: 200,
      body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
  };
```
ローカルで作ってください。
AWS Lambda作成時に生成されるコードそのままコピペした。

### 2.zipに圧縮
右クリックorコマンド

### 3.Lambda関数のデプロイ
以下コマンドでデプロイします。
```cmd
  aws --endpoint-url=http://localhost:4566 --profile localstack lambda create-function ^
  --function-name [任意の関数名] ^
  --runtime nodejs20.x ^
  --zip-file fileb://lambda/index.zip ^
  --handler index.handler ^
  --role arn:aws:iam::000000000000:role/lambda-role
```
見やすくするため＾で改行しています。

--zip-fileにはzipを置いた場所を指定する。自分の場合localstack/lambdaに置いたのでこうなる。
--roleはダミーで問題ないがarn:aws:iam:xxx:role/xxxにする必要がある。testとかにしちゃうとエラーが出る(多分)

Lambda関数が作成されたか確認してみる。
```
aws lambda list-functions --endpoint-url=http://localhost:4566 --profile localstack
```
色々出たら成功

### 4.Lambda関数の実行
```
aws lambda invoke ^
--function-name [実行したいlambda関数名] ^
output.log --endpoint-url=http://localhost:4566 --profile localstack
```
output.logに実行結果を出力するようにしている。

# 参考
https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli_lambda_code_examples.html
Viteを使わずにvitestでテストをするには

Javascript・Typescriptでライブラリを作ったので、vitestでテストしたいけど
vite向けなのかな...?と思う人向けに、vite無しでvitestを使ってテストする方法を教えます。
## 1.導入
```bash
> npm install --save-dev vitest
```
## 2.テストコード(JS)
:::note alert
今回のコードはテストスイートとかの概念を意識せずに書いてます。
すみません。
:::
```js:sample.test.js
import {describe, it, expect} from "vitest";
describe("テスト",()=>{
    let num = 0;
    it("1を代入",()=>{
        num = 1
    });
    it("1を追加",()=>{
        num += 1;
    });
    it("1+1と2は同じか",()=>{
        expect(num).toBe(2);//assert等に相当
    });
})
```
こんな感じです。
ファイルの置き場所ですが、ファイル名の末尾に`.test.js`と書けばほぼどこにおいてもOKです。
自分なら`/test/sample.test.js`らへんに置きます。
## 3.テストコード(TS)
なんと特に設定しなくてもTypescript使えます！！！
vitestをimportするとエラー出ましたが無視してOKです。
```ts:sample.test.ts
import {describe, it, expect} from "vitest";
describe("テスト",()=>{
    let num: number = 0;
    it("1を代入",()=>{
        num = 1
    });
    it("1を追加",()=>{
        num += 1;
    });
    it("1+1と2は同じか",()=>{
        expect(num).toBe(2);//assert等に相当
    });
})
```
## 4.実行
```bash
> npx vitest run
```
コードを監視して変更直後にもテストするviteのHMRみたいなことをするには以下です。
```bash
> npx vitest
```
package.jsonに埋め込む場合はこのようにしてください。
```json:package.json
{
  "name": "test-sample",
  "version": "0.0.0",
  "description": "sampleee",
  "scripts":{
    "test": "vitest run",
    "test:hot": "vitest"
  }
}
```
以上です。
[JavaScript] 分割代入

# 環境
MacBook Pro (2.3 GHz 8コアIntel Core i9)
macOS 14.0（23A344）
Homebrew 4.3.8
gh 2.52.0

# まとめ
分割代入を行うことで下記のようなメリットが得られる
- JavaScriptの分割代入はプロパティを取り出せる
- 同じ変数名を使う場合、コードが簡潔になる
- 複数のプロパティを取り出すときは特に便利

# 目次
- [オブジェクト](#オブジェクト)
- [配列](#配列)

# オブジェクト
## 分割代入_不使用
~~~js:
const myProfile = {
    name: "Jochun",
    age: "25"
};

const message1 = `名前は${myProfile.name}です、年齢は${myProfile.age}歳です。`;
console.log(message1);

// 出力結果
// 名前はJochunです、年齢は25歳です。
~~~

## 分割代入_使用
~~~js:
const myProfile = {
    name: "Jochun",
    age: "25"
};

const { name, age } = myProfile;
const message2 = `名前は${name}です、年齢は${age}歳です。`;
console.log(message2);

// 出力結果
// 名前はJochunです、年齢は25歳です。
~~~

# 配列
## 分割代入_不使用
~~~js:
const myProfile = ["Jochun", 25];

const message3 = `名前は${myProfile[0]}です、年齢は${myProfile[1]}歳です。`;
console.log(message3);

// 出力結果
// 名前はJochunです、年齢は25歳です。
~~~
## 分割代入_使用
~~~js:
const myProfile = ["Jochun", 25];

const [ name, age ] = myProfile;
const message4 = `名前は${name}です、年齢は${age}歳です。`;
console.log(message4);

// 出力結果
// 名前はJochunです、年齢は25歳です。
~~~
**注意点：配列のプロパティははっきりしていないが、下記の`name`や`age`のように変数を決める必要がある。**

# 参考リンク
- [モダンJavaScriptの基礎から始める挫折しないためのReact入門
](https://www.udemy.com/course/modern_javascipt_react_beginner)
- [デフォルト値と変数名の指定](https://typescriptbook.jp/reference/values-types-variables/object/destructuring-assignment-from-objects#:~:text=・JavaScriptの分割代入は,入れ子のプロパティも取り出せる%E3%80%82)
- [分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
[T-DASH] シークレットモードでWEBのテスト自動化をする

# Outline

シークレットモードでテストしたいときがある。
T-DASHはデフォルト、ブラウザ起動は通常モードである。
今回、シークレットモードでchromeを起動してテストする方法を説明する

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

# 技術的な情報

テスト実行でブラウザ起動時にoptionを指定することで、ブラウザをシークレットモードとして立ち上げることができる。
そのため、T-DASHの標準機能ではなく、robot frameworkでoptionを指定してブラウザを立ち上げる
そのコマンドは以下の通り
```
Open Browser  ${BROWSER}  options=${chrome_options}
```
${BROWSER} は起動するブラウザ（今回Chrome）

${chrome_options} は起動時のoption
add_argumentを用いて、設定したいoptionを追加設定する。
設定可能なoptionは以下のサイトを参考にするといい

シークレットモードのオプションは incognito である。

https://qiita.com/kawagoe6884/items/cea239681bdcffe31828

# T-DASH実装

## カスタム動作

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

```
ACT-CAT-CUSTOM-270642da-ad45-4fab-9419-4881701f4269:
  action_category_name: Browser
  icon: ''
  color: '#627a2a'
  custom_data:
    file_name: Browser
    pip_list: []
    library_list: []
  actions:
    ACT-CUSTOM-4fab699c-a430-4c54-8e77-fe714a22d980:
      action_name: シークレットモードでブラウザを開く
      action_type: operation
      action_format: ブラウザchromeをシークレットモードで開きURL「設定値1」にアクセスする
      action_note: ''
      action_args:
      - value1
      action_def:
      - - ${chrome_options} =
        - Evaluate
        - selenium.webdriver.ChromeOptions()
      - - Call Method
        - ${chrome_options}
        - add_argument
        - --incognito --start-maximized
      - - Open Browser
        - ${value1}
        - browser=chrome
        - options=${chrome_options}

```

次に、作成された　Browser.yamlをT-DASHの動作定義 -> カスタム動作 -> カスタム動作をインポート にてインポートする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/9d97fdf8-dc49-8cef-03f2-72cadccbba7e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/8b05ae33-c7c7-6142-558d-48664a38c452.png)

## スクリプト

ブラウザの起動時、標準関数の「URLでブラウザを開く」を使用しない。
その代わりに、今回追加したカスタム動作「シークレットモードでブラウザを起動する」を使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/6dde5388-167a-c0ec-0cef-a3c9ce71eeb7.png)

# テスト実行 

chromeが maximizedで起動し、かつシークレットモードになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/93468a3f-2c38-b18c-7d3b-0236e6afe761.png)