OmniAICreator/Qiita-1.07M huggingface dataset:
Zigでreaderやwriterのインスタンスをメンバとする構造体を作ろう

Zigでなんかやり始めたの8月下旬わず。それまで新しいプログラミング言語なんかあんま触れようとしてこなかった。やってきたのはCとPythonとPerlとVanilla JSとシェルスクリプトであり、なんか他にやるようなことはあるのかという感じだった。PCに処理系をインストールしたらインストールサイズがでかくてディスクのスペースとりそうでマジで机上の空論だけで済まそうとしてた。だがZigが現代のC言語だのという論説とか、実際にインストールしたらマジで本体としては小さくてマジですごいと思った。んでプログラミング言語Zigのすごいところの論説で、気がつけばZigを始めてた。

# 私
たまたま学校でエンジニアリングを学んできたがたまたま私はエンジニアと縁がなかったしこれからもないだろうなとは今もなお思ってるし、どうせ死ぬだろうなとは思ってるし、プログラマか何かにこだわるのが馬鹿馬鹿しいと考えている、何故かプログラミングが趣味になってしまった製造業現場職の者。2015年から学校で教わったのを皮切りに今年で10年目。と数えて意味があるのか。

# 最近作ってるプロジェクト
私はEsolangの者わず。コードゴルフ参加のため、プログラミング言語Disの処理系を作ってた。

https://github.com/Tpaefawzen/dis.optimized

https://tpaefawzen.github.io/dis.web/

処理系を作るだけならBen Olmsteadさんの二番煎じ。しかし私は最適化実行の機能とか、プログラミング言語Disに関するライブラリとか、あとなんやかんやを実装しまくって実装することを楽しんでたんだと思う。

んで、Zigの存在を知って、CとJavaScriptで作ってた2つの実装をZigでやり直そうかなとか思えてきて、プロジェクトとしてスタートしちゃった。

https://github.com/Tpaefawzen/dis-esolang.zig

# 作ろうとしてる処理系の特徴
最適化レベルの指定ができるやつとか任意の進数や任意の桁のデータを取り扱うタイプのバリアントとか。なんかめちゃくちゃgeneralizationしちゃってるやつ。あと既存のコードを一ミリも活用しようとしてないやつ。

# 本題
最初私はこういう構造体を作りたかった。

```zig
pub fn Vm(comptime Math: type) type {
    return struct {
        a: Math.T,
        c: Math.T,
        d: Math.T,
        mem: [Math.END]Math.T,
        reader: anytype,
        weiter: anytype,
    };
}
```

どうせおもちゃのようなEsolangの実装であって第三者が私のライブラリを使うとかマジでありそうもないんだし、readerとwriterを素直に標準入出力にすればよいのに私はこのフィールドを一般化しようとしてた。このフィールドはプログラミング言語Disの処理系において入出力に関わるやつであり処理系の本体の外で良い。

しかしうまくいかなかった。anytypeは関数のパラメータの型でしか指定できない。

一方`*const anyopaque`とか`anyopaque`も試した。これは標準ライブラリにおける使用例を見たうえでの試みわず。しかし`opaque`型は内容が公開されていない構造体に使うやつであり、そのせいでReaderやWriterのメソッド等が利用できなくて詰んだ。

あと最初

```zig
pub fn Vm(
        comptime Math: type,
        comptime reader: anytype,
        comptime writer: anytype
) type {
    // 略
}
```

も前はやってた。だがテストコード作成時、varなreader等でテストしたくてテストしたら、アレだった。型を獲る関数は全てコンパイル時に得られなければならないが、reader等がvarなら終わってた。

したがって、私が一度たどり着いたのはreader等を構造体から外し、コンパイルされたプログラムについて一ステップだけ処理を行うメソッドにreader等を引数として与えるデザインだった。

```zig
    var vm = Vm(MyMath).init();
    vm.run(my_reader, my_writer);
```

# 納得のいく解決策は灯台下暗し
このことをとあるDiscordサーバで話した。
すると一人が私にこうリプライした。
`reader.any()`によりstd.io.AnyReader等を取得することでその方によるフィールドが定義できるはずだと。

```zig
struct {
    reader: std.io.AnyReader,
    writer: std.io.AnyWriter,
}
```

std.io.AnyReader等はstd.io.GenericReader等と比べて新しいAPIであり、これまでわりとバラバラだったReader群の型？を統一してくれる。

# まとめ:std.io.AnyReader等の恩恵
ということで私はあのコードを変えようと思う。
[Strategy] EA

# 一覧
|||
|:--|:-|
|ビジネスアーキテクチャ<br>BA|ビジネス戦略に必要な業務プロセスや情報の流れを体系的に示したもの|
||BRM(Business Reference Modesl)|
||業務説明書、機能構成図|
|データアーキテクチャ<br>DA|業務に必要なデータの内容、データ間の関連や構造などを体系的に示したもの|
||DRM(Date Reference Modesl)|
||UMLクラス図、E-R図|
|アプリケーションアーキテクチャ<br>AA|業務プロセスを支援するシステムの機能や構成などを体系的に示したもの|
||情報システム関連図|
||SRM(Service Reference Modesl)|
|テクノロジーアーキテクチャ<br>TA|情報システムの構築・運用に必要な技術的構成要素を体系的に示したもの|
||TRM(Technology Reference Modesl)|
||ネットワーク構成図、ソフトウェア構成図|


# 参考リンク
- [令和6春61](https://www.ap-siken.com/kakomon/06_haru/q61.html)
【DAY14】Tailwind CSSについて

## Tailwind CSSとは
Tailwind CSSは、CSSフレームワークのひとつで、ユーティリティクラスを使ってデザインを行うことができます。ユーティリティクラスには単一の機能が割り振られており、基本的には、1つのユーティリティクラスが1つのCSSプロパティと対応します。つまり、HTMLで使用したいCSSに対応したクラス名をつけることで、Webサイトの装飾が行えるといった感じです。
通常はHTMLでクラス名を考えて付け、CSSでそのクラスに対応したプロパティ等の記述をするかと思います。Tailwind CSSを使うことで、クラス名を考えるという工程が無くなるため、実装速度が上がります。
## Bootstrapとの違い
私は使用したことがほとんどありませんが、CSSフレームワークとしてはBootstrapも広く使われているようです。そこで、BootstrapとTailwind CSSの違いについてまとめてみようと思います。
* デザインを作るクラスの有無
Bootrtrapではデザインを作るクラスが存在します。つまり、少量のクラス名の指定で多くのCSSを反映させたデザインを作ることができます。このように、あらかじめ用意されたスタイルやコンポーネントが多いのが特徴です。
Tailwind CSSは基本的に1つのユーティリティクラスが1つのCSSプロパティと対応します。そのため、指定するクラス名は多くなり、CSSの知識が必須となります。一方で、デザインのカスタマイズ性、トラブルシューティングのしやすさについてはBootstrapより優れていると思われます。

## Tailwind CSSのカスタマイズについて
私はTailwind CSSのチートシートを見ながら装飾をしていましたが、チートシートには載っていないものもあり、それらについては別途クラス名を考えて別ファイルのCSSに記述をしていました。例えば、calcを使用したwidthやheightの指定、メジャーでない色の指定などです。しかし、Tailwind CSSの公式サイトをちゃんと読むと、デフォルトではないものについてもカスタマイズすることで使用できるようです。最後にこのカスタマイズについて紹介します。

カスタマイズするには、tailwind.config.jsというファイルにその内容を記述します。
例えば、heightに12.5remを指定したいという時には、以下のように記述します。
```tailwind.config.js
module.exports = {
  theme: {
    extend: {
    //　ここから追加
      spacing: {
        '50': '12.5rem',
      }
      height: {
        '50': '12.5rem',
      }
    }
  }
}
```
こうすることで、クラス名でh-50を指定すれば12.5remの高さにすることができます。

```html
<div class='h-50'>
    <p>200px</p>
</div>
```
(小ネタ) [CloudWatch Logs Insights] LogStream単位で、FluentBitによる構造化ログの必要情報のみを一覧出力

## 概要
- `FluentBit`から`CloudWatch Logs`に送信される情報が非常に見づらいです
- 上記を、`Logs Insights`で`LogStream`単位のフィルタリングを行うことにより解決します
 
## 前置き
記事にするほどのことではない気もしますが、社内で実際に困っている人がいたので記事化しておきます
誰かの参考になれば嬉しいです

## 想定ケース
本記事は、以下のようなケースを想定しています
- ECS on Fargateにおいて、FluentBitを利用してログを送信
- 送信先としてCloudWatch Logsを指定

![ecs-cloudwatch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643664/f2713007-157a-05c6-4f4c-8188f8c16a56.jpeg)

## 問題のシナリオ
以下のようなシナリオにおいて注意が必要です
- `ECS on Fargate`のデプロイにおいてトラブルが発生
- タスク起動後、例外が発生してタスクがキルされ続けている
- 上記を調査するために、タスクに紐づく`LogStream`上のログを`CloudWatch`上で参照したい

## 何が問題なのか？
- `FluentBit`のログはJSON形式で構造化されています
- `CloudWatch Logs`でこれを閲覧する場合、デフォルトで各行のトグルが閉じられています
- 本来閲覧したいログそのものの情報を参照するには、時系列順にトグルを開いて`log`の項目を参照する必要があります
- 全行を一度に展開することも可能ですが、時系列でログ出力を観察したい場合には、ログ以外の付帯情報がノイズになってしまいます
- これは、ローカルのターミナル等でログを見る場合に比較して、一覧性に欠けます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643664/d4272412-b894-2e71-b6ba-ac4ca1db1dfa.png)

## 解決方法
これを解決するために、`CloudtWatch Logs Insights`を活用します
具体的には以下のクエリにより、`LogStream`でフィルタリングし、参照したいlog項目のみを時系列順に出力します

```sql
fields @timestamp, log
| filter @logStream = "your_log_stream_id"
| sort @timestamp
```

こうすることで、時系列で本来見たいログ情報のみを一覧で見ることができ、ローカルに近い開発体験が得られ、調査が捗ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643664/e0750b0e-edb9-f650-eca2-c270be4c4194.png)

## 注意
クエリ発行にはコストがかかるのでご注意ください

```
# 2024/09/23現在

分析 (Logs Insights のクエリ)	USD 0.005/スキャンされたデータの GB
```

https://aws.amazon.com/jp/cloudwatch/pricing/
Raspberry Pi Pico W / WH でWi-Fi設定ライブラリをアップデート

[インターネット連携も可能になった Raspberry Pi Pico W ガイドブック](https://amzn.to/4gtuNAR)で記載しているWi-Fi設定ライブラリをアップデートしました。


## 従来の機能
例えば、ライブラリに含まれているサンプルで、`basic`を動作させ、Wi-FiのSSIDが設定されていないもしくは、起動してからBOOTSELボタンを長押しするとRaspberry Pi Pico Wがアクセスポイントとして、実行されてPCやスマホをそのアクセスポイントにつなぐと以下のようなWi-Fiのアクセスポイント設定画面が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/94075684-6775-182b-dc13-848c20173e78.png)

直接、Wi-FiのSSIDとパスワードを記入し、設定する必要がありました。

## アップデート内容
アップデート後は、Raspberry Pi Pico WでスキャンしたSSID一覧をプルダウンリストから選ぶ形にしたので、SSIDを直接記入する必要がなくなりました。
ただ、SSIDがステルスの場合は設定できなくなったため、その点は今後、アップデートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/97abeab7-74dc-d0d7-1d8f-fabae61ed431.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/17d7ccf2-6a15-9320-9987-3e1c5962911d.png)

## ライブラリを作った理由
家で使う場合は、直接SSIDをコードに書いてもよいのですが、展示やデモで持ち歩く時にスマホや会場のWi-Fiにつなぐとき、いちいちスケッチを書き換えるのが面倒でライブラリを作りました。
あと、Wi-Fiの接続部分は、毎回スケッチを用意しなくていいので、スケッチ的にはシンプルになります。
【AWS】機械学習系サービスまとめ【SAA-C03】

# はじめに
AWS ソリューションアーキテクト - アソシエイト(SAA-C03)を受験するにあたって、AWSの機械学習を利用したサービス名がなんとなく似ていて、選択肢を間違えがちだったので軽く整理をしてみました。

## Amazon Comprehend
#### Comprehend = 理解する
・機械学習を利用した自然言語処理サービスで**テキストからインサイトや関係性を発見する**ことが可能
・テキスト内の登場人物を識別すること（エンティティ認識）や、ポジティブ・ネガティブといった感情を分析すること（感情分析）、特定のキーワードに関連する情報を抽出すること（キーフレーズ抽出）などが可能
・**Amazon Comprehend Medical**という医療情報に特化したサービスもある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641068/a9d5d95c-ff1c-a9f0-d4b5-8c83e8a2781b.png)

## Amazon Transcribe
#### Transcribe = 書き写す
・機械学習を利用した音声認識サービスで、**音声をテキストに変換する**ことができる
・リアルタイム文字起こしや、通話記録データのテキスト化、動画の字幕付けなどに利用可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641068/3a4743f2-5606-b304-e8db-c86f25a8c599.png)


## Amazon Textract
#### Textract = Text(テキスト)＋Extract(抽出する) を組み合わせた造語 
・スキャンしたドキュメントから、**テキストとデータを自動的に検出し抽出する**サービス
・印刷されたテキスト、手書きの文字、レイアウト要素、データを、あらゆるドキュメントから自動的に抽出可能
・単純な光学式文字認識 (OCR) だけでなく、フォーム内のフィールドの内容やテーブルに格納された情報も識別可能
・英語、スペイン語、ドイツ語、イタリア語、フランス語、ポルトガル語をサポートしている(2024/09/19現在)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641068/69a770b7-ccda-4dc8-352d-72b43e2c8f8f.png)


## Amazon Translate
#### Translate ＝ 翻訳
・機械学習を利用した**テキストの翻訳機能**を提供するサービス
・複数言語のニーズを満たす、迅速で高品質な翻訳を低コストで提供
・深層学習技術を使用して、従来の統計ベースやルールベースの翻訳モデルよりも正確で流ちょうな翻訳を生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641068/6ac594bc-ef02-0cf8-429f-4c72721e664c.png)

# 参考
https://aws.amazon.com/jp/comprehend/

https://aws.amazon.com/jp/transcribe/

https://aws.amazon.com/jp/textract/

https://aws.amazon.com/jp/translate/
【解決方法】tcpdump: Couldn't change ownership of savefile 体験しながら学ぶネットワーク技術入門

# はじめに

本記事は「体験しながら学ぶネットワーク技術入門」のP.54の下記コマンドを実施した際に発生したエラーを解決する手順です。
```:error
root@cl2:/# tcpdump -i net0 -w /tmp/tinet/ethernet.pcap ether host 02:42:ac:01:10:01
tcpdump: Couldn't change ownership of savefile
```

# 環境の説明

Windowsではなく、macOS(M1)を利用しています。

```:environment
$ sw_vers
ProductName:		macOS
ProductVersion:		14.6.1
BuildVersion:		23G93
```



P.17の`Macに検証環境を構築したいときは`を実施し、P.54まで書籍通りに進めた状態です。

# 原因の調査

https://www.sbcr.jp/support/4815617794/

上記リンクにある、`Mシリーズ Mac対応版のファイルを使用する際の注意点（PDF）`内の下記2項目を実施しましたが解決しなかったため、補足として記事に残しておきます。

> tcpdump コマンドの-w オプションを使用して、パケットを保存する際、拡張子を「pcapng」とすると、「Couldn't change ownership of savefile」というエラーになります。拡張子を「pcap」としてください。

> 拡張子をpcap にしても同様のエラーが出た場合は、「multipass stop UBUNTU」→ 「multipassstart UBUNTU」で、仮想マシンを一度再起動してみてください。

chmodやchownで`/tmp/tinet/ethernet.pcap`の権限変更を試しましたが、同じエラーが発生しました。

# 解決策

tcpdumpコマンドでpcapファイルの吐き出し先を変更し、吐き出した後`/tmp/tinet`にコピーしました。

```:solution
root@cl2:/# tcpdump -i net0 -w /tmp/ethernet.pcap ether host 02:42:ac:01:10:01
tcpdump: listening on net0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C4 packets captured
4 packets received by filter
0 packets dropped by kernel
root@cl2:/# cp /tmp/ethernet.pcap /tmp/tinet/
```

ローカル端末の`~/tinet`ディレクトリは、multipass上のubuntuにあるディレクトリ`/tmp/tinet/`へマウントされているので、これによりローカル端末でWireSharkを起動し、対象のpcapファイルを選択することでパケット解析ができました。

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862159/99b9cc65-ae38-8b11-fa80-9dab796f4bdc.png">

# おわりに

まだ本書籍を読んでいる途中のため、またエラーが発生することがあればトラブルシュートを行い解決策を記事にしていけたらと思います。
同じ事象が発生した方の力になれば幸いです。
ここまでお読みいただきありがとうございました。
Open AI Data Analystを動かす

# はじめに
Open AIのData Analystは、バックエンドにPython環境を持ち、ここで実際にデータ分析コードをうごかしてくれる、夢のデータ分析環境です。
最新状況として、ほんのわずかの時間ではありますが、無料ユーザーもこの環境を動かせるようになりました。
本記事は、この環境を動かすまでの手順の説明となります。

# Chat-GPTのサインアップ
次のリンクからchat-GPTの画面を表示します。

https://openai.com/chatgpt/

次の画面が出たら、「Show now」のボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5ebcd8bd-8895-5ddd-f0ce-44dec2619ea1.png' width=700>

下記の画面になったら、右上の「アカウントを作成する」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4fa7dbbb-664b-ba24-11fd-dc49adaf13f1.png' width=700>

「アカウントの作成」の画面になったら、メールアドレスを入力して「続ける」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4669823a-3ff8-d091-6380-3a147e877886.png' width=400>

パスワード入力の画面になるので、パスワードを入力して「続ける」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/37b3ad31-152c-580e-ad2c-1b033c75deea.png' width=400>

次のような「メールを検証する」というメッセージがでてくるので、該当するメールを探し、開きます。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/3a37a989-aaaa-1918-afea-d87a32be546b.png' width=400>

該当するメールを開くと、「メールアドレスの確認」というボタンがあるので、クリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/33d9f83a-82d6-85ce-8539-df59341584f3.png' width=400>

「ご自身について教えて下さい」の画面が出てくるので、氏名と生年月日を入力し、「同意する」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/009185f2-3aab-8021-76cc-d4627755fe43.png' width=400>

次のような画面が表示され、右上にユーザーIDの略号が表示されていれば、ユーザー登録に成功しています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0b96aee7-ca97-bc88-8e5d-aa3936d54b9f.png' width=700>

# Data Analystをサイドバーに表示する
次にData Analystをサイドバーに表示します。

①　画面左のアイコンから「GPTを探す」をクリック
②　検索窓に「Data Analyst」とタイプしてEnter
③　リストに「Data Analyst」が出てくるので、これをクリック

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/140edfe9-6099-f76c-8479-c33b7155aea2.png' width=700>

「Data Analyst」のパネルが出てくるので、
①　画面右上の「...」のアイコンをクリック
②　メニューから「サイドバーに表示する」を選択
③　画面下の「チャットを開始する」をクリック

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0a6d4805-6dd5-8a2e-8ac7-76caf4c89a3e.png' width=400>

これで、Data Analystのセッションが始まっています。
また、①のアイコンをクリックすると、いつでも新規Data Analystセッションを開始可能です。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/7a157723-43af-c5ea-dfd0-7ceaeb35ef1d.png' width=700>

# Pythonをサイドバーに表示する
現在、様々なGPTが登録されていますが、その中でPythonコード生成をしてくれる「Python」をサイドバーに表示させます。
手順はData Analystとまったく同じです。検索窓で今度は「Python」と入力し、検索をしてください。
うまく登録できると、次のような画面になります。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/a5e64908-7460-03e0-80e5-6557d9d87d4c.png' width=700>
【LT】1000人の前でLTしてみたら色々と得した件


:::note warn
免責事項
この内容は学校法人角川ドワンゴ学園および、学園の公式としての文章ではありません。
あくまでも、一生徒のQiitaとしてお読みください。
:::

こんにちは。
だいぶと更新してなかったわけですけど、まぁ、色々あったので、書きたいなと思ってつらつら書いてます。

## 1000人の前でLTってどういう状況

弊学N/S高等学校の通学コースでは、去年から年2回、LT大会を行っています。
今回はそこで登壇させてもらいました。

通学コース全体の人数は、100人規模のデカデカキャンパスが10こくらい、私の所属する四日市キャンパスと同じ小規模キャンパスがわんさかと...
その中間もわんさかと...と把握していて(違うかもしれませんが)、それを用いて考えると、合計で1000人は優に越すでしょう、という推計です。
まぁ、推計なんですけどね。タイトル詐欺してすいません。ほんと。

## LTは自分のやっていることを客観的に見るいい機会になる

自分のやってることって、なかなか客観的に見ることないかなって思うんですよ。
まぁ、開発者なんで当たり前なんですけど。

客観的に見ると何がいいか...

- 自分の進捗がわかる
- 自分のやっていることで、効率の悪いこと、改善点が見える
- 人からも求められるにはどうすればいいかが見えやすくなる

こんな感じですね。

ここから、**どうすれば、このシステムをよくすることができるか**、**どのタスクが遅れているか**、というのを見つけることができます。

## プレゼンの練習になる

これは言わずもがなですね。
ほんとに、自分のしていることをいかにわかりやすく短い時間で伝えられるかって、結構難しい問題です。
現に、私の話も、聞き手の頭をハテナまみれにしてしまいました笑
なので、これを繰り返していると、説明力がすごく上がります。
特に、私はサークル運営をしているので、初心者さんにわかりやすく伝える必要がある場面が多いです。

他にも、人前で話すのって、苦手で避けることが多いのが私なのですが、~~流石に、1000人の前で話すと(例外エラー)~~話す勇気というか、やはり身に付きますね。
通学コース生の場合、前に立つ機会が非常に多いですし、社会人の皆様もおそらくそれは同じでしょう。
そういう時に、緊張でガチガチだったのが少しは緩和されるかもしれません。(現に私は1000人の時に比べればというメンタルになりました。)

## まとめ

とりあえず、何にせよ、いい経験ですし、やってみましょう。
ネタがなくても、とりあえず応募してから考えればいいです。
(と、参考にしたどこか忘れたサイトに書いてありました。)

良いLTライフを！！
Ubuntu-debianのonedrive更新で苦労した～公開鍵更新

PCでdebianを使っていてMicrosoftのOneDriveをアクセスする為にonedriveのリポジトリを追加してします。ある時からエラーが出て更新出来ない状況が続いていました。特に困ることは無かったので放置していましたがUbuntu 24.04へのアップグレードがこのエラーで出来ません（途中で中断してしまう）。
```:エラー
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_22.04 ./ InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY B8AC39B0876D807E
W: https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_22.04/./InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY B8AC39B0876D807E
```
検索すると公開鍵の更新方法は`apt-key del`で公開鍵を削除して`apt-key adv`や`curl`でダウンロードし直すと言う物でした。でも駄目でした。更に探して「[Bug: opensuse repository key is expired #2773](https://github.com/abraunegg/onedrive/issues/2773 "github.com/abraunegg/onedrive/issues/2773")」を見つけました。
```:対処方法
wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_24.04/Release.key | gpg --dearmor | sudo tee /usr/share/keyrings/obs-onedrive.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/obs-onedrive.gpg] https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_24.04/ ./" | sudo tee /etc/apt/sources.list.d/onedrive.list
```
中身は良く分かりませんが兎に角解決しました。
バッチファイルの基本

こんにちは。
バッチファイルの基本的なところについて記述していきます。


ローカル環境変数で、他のバッチファイルに変数が影響しないようにする。
```
setlocal
:: 処理予定コード
endlocal
```

プロンプトでメッセージを受け取り、変数に代入する。
```
set /p 変数 = "メッセージ"
```
Power Automate クラウドフローの「HTMLテーブルの作成」に渡したRSSに含まれるリンクタグ等が機能するようにするには

## こんな人のための投稿です
Power Automateクラウドフローの「HTMLテーブルの作成」は手軽だけれど、使ってみるとテーブルの中にHTMLのタグがあってもそのまま出てきてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/bc547631-1ac5-bba7-a47e-5b31bdfb068f.png)
今回のテーマは、こいつの改善です。

## RSSはとっても便利
Power Automateのクラウドフローには、「すべてのRSSフィード項目を一覧表示します」というアクションがあります。　RSSフィードのURLを入力するだけで、ニュース記事などを取得することができます。

たとえば、Googleニュースでは以下のように指定することで、特定のキーワードにマッチするニュース記事を取得できます。
```
https://news.google.com/rss/search?q=乃木坂48&hl=ja&gl=JP&ceid=JP:ja
```
上の例では「乃木坂48」と書かれている部分を、取得したいニュース記事のキーワードに変えてください。
この結果を「HTMLテーブルの作成」アクションに渡し、さらにその結果を「チャットまたはチャネルでメッセージを投稿する」アクションに渡してやります。　取得される記事が多すぎるとエラーが出ることがあるので、「以降」欄には次のような式をつかって過去24時間内に発行された記事以降のものだけが取得できるように調整しています。
```
addHours(utcNow(),-24)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/fa158bf6-d759-591d-f58f-3f2981593e1e.png)


これを実行すると、Teamsには以下のようなテーブルが投稿されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/eb9dafec-f646-5c43-34bb-74023732af3d.png)

## 日本語ヘッダーにして項目もスッキリさせるには
列の数が多いことやヘッダーが英語なのを日本語にするには「選択」を挟めばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/8dc18e4b-69d6-a8fd-3a6b-863b9445808c.png)
ついでに投稿日時はもともとUTC協定世界時なので、JST日本時間に変換するため以下のような式を使っています。　[UTC時間からの変換について、詳しくはこちらのブログを参考にしてください。](https://mocabrown.com/blog/archives/6273)

ヘッダーが日本語になって、列も必要なものだけに絞ってすっきりしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/e537b960-1800-04f5-fa6d-475e7eb80404.png)

## テーブルの中のHTMLタグを解釈してくれない？
ところで、テーブルのなかで「サマリー」の中身を見ると、せっかくHTMLのaタグをつかって記事へのリンクが設定されているのにタグがそのまま表示されています。これはもったいない。
実行結果から「HTMLテーブルの作成」の出力結果を「未加工出力の表示」で表示させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/d0a14abf-92c1-bc54-e413-85662e2778bb.png)

テキストエディタに貼ってみると・・・タグの一部がエンコードされたままになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/366cbe72-83f4-b75b-f70d-49c2c4563b47.png)

こういうのをHTMLの文字実体参照といって、HTMLの意味あるタグでなくて文字として表示するように変換されたもののよう。

https://qiita.com/fuuchin/items/4cc680e412754f84b8e4

これを直接デコードする関数はないようなので、replace関数を使ってタグで使う文字に差し替えてみます。式はこんな感じ。

```
replace(replace(replace(body('HTML_テーブルの作成'), '&lt;', '<'), '&gt;', '>'), '&amp;', '&')
```
すると、これが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/bc547631-1ac5-bba7-a47e-5b31bdfb068f.png)

こうなりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/2061e8b5-0056-524a-5e3e-084319f9f942.png)
NullReferenceExceptionをGetEntity(TransformUsageFlags.None);で解決

## ECSでNullReferenceExceptionが発生する

UNITY ECSベースでゲームを作っているとき、以下のような、既に消えたEntityやGameObjectにアクセスしてます、的なエラーに悩まされることがあります。

NullReferenceException: Object reference not set to an instance of an object
Unity.Entities.CompanionGameObjectUpdateTransformSystem.OnUpdate () (at ./Library/PackageCache/com.unity.entities@1.0.16/Unity.Transforms.Hybrid/CompanionGameObjectUpdateTransformSystem.cs:114)

単純にスクリプトの設計ミスで、修正できれば良いですが、例えば以下のような点を考慮済みでもエラーが発生すると、とても悩みます。
・削除するEntityには、まず「DestroyEntityTag」的なコンポーネントをつけて、纏めて処理している
・[UpdateInGroup(typeof(LateSimulationSystemGroup))]
や[UpdateAfter(typeof(EndSimulationEntityCommandBufferSystem))]の付与により、Entityの削除は、フレームの中でも、最後に実行している
・if (entityManager.HasComponent<LocalTransform>(entity))　等で、先にEntityが存在するか確認してスクリプトを処理している

そんなとき、解決に役立った方法を備忘録として残します。

### var entity = GetEntity(TransformUsageFlags.None); にする。

Authoring時に、深く考えずにvar entity = GetEntity(TransformUsageFlags.Dynamic);に設定することがありますが、DynamicにするとGameObjectとEntityが常に情報のやり取りをしあうので、ここでEntityが削除されているのにアクセスしてしまう、的なエラーが出ることがあります。
出ないこともあるので、再現性が低くて悩ましいところですが、エラーが出る可能性がある箇所は潰しておくべきですし、無駄な処理を省けるので、重要な設定です。
Javaの変数とは（初学者向け）

# 変数とは
プログラミングをしたことのない人にとってまず変数とはなんなんだってところから説明しないとわからないと思うので、まずは変数の説明から。
変数とは、数値を保存するメモリーの場所のことです。
コンピューター言語を用いて、プログラミングをするにあたって、コンピューターは数値しか扱えないということを理解しておかないといけません。ただ、かってに数値がおけるわけではありません。OSなどのコンピュータを動かすメモリの場所に自分が勝手に数値をおいてしまうとOSの挙動に問題を起こしてしまいます。（C言語で作られているWindowsやMacでポインターの場所をちょっとずついじると実はOS領域の内容を見ることも書き換えることも実際にはできますが。）

# 変数の種類
変数の種類はじつはいろいろとある。メモリーの確保する長さとかで変わるが、基本的にはintを使用することが多い。
以下の表に変数とその変数で扱える数値の幅を記載する。

|データ型の種類|名称|消費メモリ|範囲|
|---|---|---|---|
|byte|バイト型|1バイト|-128~127|
|short|短整数型|2バイト|-32768~32767|
|int|整数型|4バイト|-2147483648~2147483647|
|long|長整数型|8バイト|-9223372036854775808~9223372036854775807|
|float|単精度浮動小数点数型|4バイト|±3.40282347E+38~±1.40239846E-45|
|double|倍精度浮動小数点数型|8バイト|±1.79769313486231570E+308~±4.94065645841246544E-324|

基本的に実務では、intとdoubleを使うことが多いと感じる。また、longもflotも補助的に使うことがあると感じる。他の変数は基本的に実務では使っていないように感じる。（メモリーが大容量になっている今現在でほとんどメモリーの節約等で変数を使い分けるみたいな使い方は少ないようにも思える。）

# 参考文献
https://www.sejuku.net/blog/22805
Word2Vec：CBOWモデルとSkip-Gramモデルの解説

## はじめに

Word2Vecは、単語をベクトル空間に埋め込む技術であり、自然言語処理（NLP）において非常に重要です。この技術により、単語同士の意味的な距離を数値として表現でき、様々なタスクに応用されています。Word2Vecには2つの代表的なモデルがあり、それが **CBOW (Continuous Bag of Words)** と **Skip-Gram** です。本記事では、それぞれのモデルの仕組みと特徴について詳しく解説します。

---

## CBOWモデルの概要

### CBOW (Continuous Bag of Words)とは？

CBOWは、文脈から中心の単語を予測するモデルです。具体的には、周辺の単語（文脈）から、その中心に位置する単語を推測します。

### モデルの構造

- **入力**: 文脈にあたる複数の周辺単語
- **出力**: 中心の単語

例えば、「I came to the hill」という文章では、周辺の"came"と"hill"をもとに、"to"を予測します。

```
Input: W_{i-c}, W_{i-(c-1)}, ..., W_{i-1}, W_{i+1}, ..., W_{i+(c-1)}, W_{i+c}
Output: W_i
```

### CBOWの数式

CBOWモデルでは、入力として周辺単語のベクトルを結合し、その合計をもとに中心単語を予測します。

```
Y = softmax(W_o (W_h X))
```

ここで、`W_h`は隠れ層への重み行列、`W_o`は出力層への重み行列、`X`は入力単語のベクトルです。

### CBOWの特徴と課題

- **特徴**: 
    - 高速に学習が可能
    - 周辺単語からの情報で正確な単語を予測する
- **課題**: 
    - 文脈の順序を無視する
    - 多義語の扱いが難しい

---

## Skip-Gramモデルの概要

### Skip-Gramとは？

Skip-Gramは、CBOWとは逆のアプローチを取ります。Skip-Gramは、中心の単語から周辺の単語を予測するモデルです。例えば、「I came to the hill」という文章では、中心の"to"から、周囲の"came"や"hill"を予測します。

### モデルの構造

- **入力**: 中心の単語
- **出力**: 周辺の複数の単語

```
Input: W_i
Output: W_{i-c}, W_{i-(c-1)}, ..., W_{i-1}, W_{i+1}, ..., W_{i+(c-1)}, W_{i+c}
```

Skip-Gramは、1つの単語を入力として、その単語の周辺にある複数の単語を予測する形になります。

### Skip-Gramの数式

Skip-Gramモデルでは、以下の数式で表されます。

```
Y = softmax(W_o (W_h X))
```

CBOWと基本的な構造は同じですが、入力と出力の役割が逆になります。

---

## CBOWとSkip-Gramの比較

| 項目           | CBOW                                   | Skip-Gram                              |
| -------------- | -------------------------------------- | -------------------------------------- |
| **目的**       | 周辺単語から中心単語を予測する          | 中心単語から周辺単語を予測する          |
| **特徴**       | 高速で大量のデータに適している           | 少量のデータや希少単語に適している      |
| **学習の傾向** | 頻出単語に対して強く学習する             | 低頻度の単語でも効果的に学習できる      |
| **精度**       | 文脈が豊富な場合に精度が高い              | 周辺単語の関連性を広く捉えることができる |

---

## Word2Vecの最適化手法

CBOWおよびSkip-Gramモデルの学習には、大規模なデータセットを効率的に扱うための最適化手法が存在します。以下に代表的な2つの手法を紹介します。

### 1. Hierarchical Softmax

**Hierarchical Softmax**は、通常のsoftmaxを効率化する手法です。特にボキャブラリーサイズが非常に大きい場合、計算量が増加しますが、Hierarchical Softmaxでは、木構造を使い階層的に単語を分類して計算量を削減します。

例えば、ボキャブラリーサイズが100万の場合、通常のsoftmaxでは100万回の計算が必要ですが、Hierarchical Softmaxではこれを階層化することで、計算回数を`log(V)`回に抑えられます。

### 2. Negative Sampling

**Negative Sampling**は、正解の単語以外に不正解の単語も学習に使用する手法です。Skip-Gramモデルでは特に頻繁に使用されます。正例1つに対し、複数の負例をサンプリングし、そのペアでモデルを学習させます。これにより、計算量を削減しつつ効率的に学習が進みます。

---

## まとめ

Word2Vecは、単語をベクトル化し、意味的な関係を捉える非常に強力なツールです。CBOWモデルは周辺の文脈から中心の単語を予測するアプローチであり、特に頻繁に出現する単語の処理に強いです。一方で、Skip-Gramモデルは中心の単語から周辺の単語を予測し、希少な単語や少ないデータにも対応可能です。

それぞれのモデルは異なる特徴を持ち、タスクやデータの種類に応じて使い分けることが重要です。さらに、Hierarchical SoftmaxやNegative Samplingといった最適化手法を組み合わせることで、大規模なデータセットでも効率的に学習を行うことができます。

次回の記事では、具体的な実装方法や、応用例についてさらに掘り下げていきます。

---

## 参考文献

1. [Efficient Estimation of Word Representations in Vector Space](https://arxiv.org/abs/1301.3781)
2. [【深層学習】word2vec - 単語の意味を機械が理解する仕組み【ディープラーニングの世界 vol. 21】](https://youtu.be/0CXCqxQAKKQ?si=nRITLtK-8lq1XE_9)
ACDLを提唱します。その6

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
geminiに聞いてみた。


# prompt
アプリは、クラウド、大切なデータは、ローカル。
クラウドに、データは渡さない。
「その船を漕いでゆけ
　おまえの手で漕いでゆけ
　おまえが消えて喜ぶ者に
　おまえのオールをまかせるな」


# geminiの回答

中島みゆきの「宙船」の歌詞と、クラウドとローカルストレージの関係性について
中島みゆきの「宙船」の歌詞は、まさに自分自身の人生を船に例え、他人に委ねることなく、自らの力で進んでいくことの大切さを歌っていますね。

歌詞とクラウド・ローカルストレージの関係性
この歌詞を、現在のデジタル環境におけるクラウドとローカルストレージに置き換えて考えてみましょう。

「その船を漕いでゆけ」：自分のデータは、自分で管理する。クラウドに預けるのではなく、ローカルストレージに保存することで、データの主導権を自分自身で握る。
「おまえの手で漕いでゆけ」：クラウドサービスに頼らず、自分のデバイスで直接データを操作し、管理する。
「おまえが消えて喜ぶ者に おまえのオールをまかせるな」：データ漏洩や不正アクセスといったリスクを避けるために、大切なデータは、外部のサービスに委ねず、自分の手でしっかりと守る。
クラウドとローカルストレージ、どちらが良い？
クラウドとローカルストレージ、どちらが良いかは、状況やデータの種類によって異なります。

クラウドのメリット:
アクセス性: いつでもどこからでもデータにアクセスできる。
共有: 複数のデバイスでデータを共有しやすい。
自動バックアップ: データが自動でバックアップされるため、データ消失のリスクが低い。
ローカルストレージのメリット:
セキュリティ: データが自分だけのデバイスに保存されるため、外部からのアクセスリスクが低い。
速度: クラウド経由よりもデータの読み書きが高速。
オフラインでの利用: インターネット環境がなくてもデータを利用できる。
まとめ
中島みゆきの「宙船」の歌詞は、デジタル時代においても、自分のデータの管理について深く考えさせられる普遍的なメッセージと言えるでしょう。大切なデータは、クラウドに全て預けるのではなく、ローカルストレージと併用し、状況に応じて最適な方法を選択することが重要です。

より安全にデータを管理するために、以下のような対策も検討してみましょう。

定期的なバックアップ: ローカルストレージに保存したデータも、外部のハードディスクやクラウドサービスにバックアップを取っておく。
強力なパスワード設定: パスワードは長く、複雑なものを設定し、定期的に変更する。
セキュリティソフトの導入: ウイルスやマルウェアからパソコンを守るために、セキュリティソフトを導入する。
さらに議論を深めるために
プライバシー: クラウドサービスを利用する際のプライバシー問題について、どのように考えていますか？
データの永続性: クラウドサービスが提供しなくなった場合、保存していたデータはどうなるのでしょうか？
バランス: クラウドとローカルストレージをどのように組み合わせれば、セキュリティと利便性のバランスが取れるでしょうか？
これらの点について、ご自身の考えを整理してみると、より自分に合ったデータ管理方法が見えてくるかもしれません。

このテーマについて、何か質問はありますか？

以上。
【Blender4.2.1】複数アニメーションをglTF書き出し

Blenderで1つのオブジェクトに対して複数のアニメーションを設定してglTF書き出しするときの備忘録。

## 1、アニメーションを作成する
Blenderの[NLAエディタ](https://docs.blender.org/manual/ja/4.2/editors/nla/introduction.html)で、書き出したいアニメーションを[トラック](https://docs.blender.org/manual/ja/4.2/editors/nla/tracks.html)ごとに作成する。

連続するアニメーションにしたいときは同じトラック内で[ストリップ](https://docs.blender.org/manual/ja/4.2/editors/nla/strips.html)を並べる（↓添付画像の`scaleLocation`のところのように）。

![スクリーンショット 2024-09-23 19.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733459/02548c99-69f1-4d7f-5a0e-57b25b6ffe9f.png)

## 2、glTFを書き出す
`File ⇛ Export ⇛ glTF`で書き出し。
書き出すときにAnimation modeを`NLA Tracks`に設定する。

![スクリーンショット 2024-09-23 19.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733459/48a4c722-570a-7271-dab7-09a228850623.png)

## 3、確認
[Viewer](https://gltf-viewer.donmccurdy.com/)で確認してみる。
トラックごとにきちんとアニメーションが書き出されています。
また、連続アニメーションの`scaleLocation`もきちんと動作しています。

![画面収録-2024-09-23-19.45.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733459/a21bb833-1dc4-ae18-17f6-926c2c168928.gif)

余談ですが、このViewerはThree.js製なのでThree.jsで実装する場合は簡易確認としておすすめです。

おしまい。
【Blazor】bUnitを使用してHTMLタグ内の値を確認する方法

# 【Blazor】bUnitを使用してHTMLタグ内の値を確認する方法

## はじめに

Blazorで使用できる単体テストフレームフレームワークにbUnitについて詰まったところを共有します。

## 問題

公式チュートリアルを見るとチュートリアルではHTMLタグごと比較している。
CSSなどレイアウト系についてはロジックのテストとは分けたい。
(CSS制御のテストもロジックとは別にしたい)

https://bunit.dev/docs/getting-started/create-test-project.html?tabs=xunit

対象コード

``` html
@page "/counter"
@rendermode InteractiveServer

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

```

テストコード

``` csharp
    [TestMethod]
	public void ClickingButtonIncrementsCounter()
	{
		// Arrange
		var cut = Render(@<Counter />);

		// Act - click button to increment counter
		cut.Find("button").Click();

		// Assert that the counter was incremented
		cut.Find("p").MarkupMatches(@<p role="status">Current count: 1</p>);
	}

```

## 解決策

レンダリングした要素からは`TextContent`や`ClassList`などから内部の値を取得できる。

``` csharp
	[TestMethod]
	public void ClickingButtonIncrementsCounter3()
	{
		// Arrange
		var cut = Render(@<Counter />);

		// Act - click button to increment counter
		cut.Find("button").Click();

		// Assert that the counter was incremented
		var p = cut.Find("p");
		Assert.AreEqual("Current count: 1", p.TextContent);
	}
```

## おわりに

Bunitはまだまだポテンシャルを秘めていそうなので使いこなしたいです。

## 参考

https://bunit.dev/docs/getting-started/create-test-project.html?tabs=xunit
Vue.jsのcomputedで引数を受ける

たまに使うので忘備録として残します。


### 書き方

```typescript
// 引数を取らない
const dataList = computed(() => {})

// 引数を取る
const dataList = computed(() => (arg) => {})
```

### 呼び方
呼び方は引数を取るからと言って何か変わる訳でも制限がある訳でもなく、普通のcomputedと同じ、computed内で呼んでもいいし、v-for内で呼んでもOK

```vuejs
const data = computed(() => dataList.value(arg))

<div v-for="a in ARRAY">
  {{ dataList(a) }} 
</div>
```
Google翻訳をプラグインで動かす

# はじめに
今や生成AI全盛で、「なんでもAIでできて当たり前」の世界になってしまいました。
生成AIがはやり出す前に、地味に凄い技術と私が思っていたのが、多言語対応を同時に可能にする機械翻訳です。
(Transformerをベースの技術としているという意味において、「同じ技術」ともいえるかもしれませんが)
機械翻訳の分野ではDeepLが有名ですが、元祖のGoogleもしっかりしていると思います。
いろいろと前置きが長くなりましたが、当記事の目的は、「**ブラウザ上でGoogle翻訳を動かすようにすること**」です。
この設定をしておくことで、意外と便利なことが多いかと思っています。

# 前提環境
Googleとの相性がいいということで、ブラウザはChromeを前提とします。
動作確認はMacでやっていますが、同じ手順でWindowsでも動くはずです。
Chromeの導入までは終わっているところを出発点とします。

# 導入手順

## Webストアにアクセス
Chromeで次のリンクをクリックして、Webストア上のGoogle翻訳のサイトにアクセスします。

https://chromewebstore.google.com/detail/google-%E7%BF%BB%E8%A8%B3/aapbdbdomjkkjkaonfhkkikfgjllcleb?hl=ja&pli=1

## プラグインの導入
下記のような画面が出てくるはずなので、右上の「Chromeに追加」のボタンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ede70e67-f1dd-1fab-07e9-d6ee4f472545.png' width=600>

次の画面が出てくるので、「拡張機能を追加」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9196e4f3-4c1d-e1cd-732b-625844aa612e.png' width=400>

次の画面が出てくれば導入に成功しています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/cdf2c5f3-e02a-524d-c7ec-fd07b6c3ecef.png' width=400>

## 使ってみる
導入が終わったら、早速使ってみましょう。
サイトは日本語以外の言語のWebページであればどこでも構わないのですが、例えば下記とか。

https://www.cnn.com/

読みたい記事に遷移したあとで、マウス右ボタンクリックでメニューを出します。


<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/558bcc8f-2ed0-a0ba-565c-04399243287a.png' width=300>

先ほどの設定が正しくできていれば、「日本語に翻訳」のメニューが出るはずなので、それを選択します。

すると画面が次のように日本語になってくれるはずです。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/163b85f2-02ec-a722-280f-31b61bc8041e.png' width=600>

ここでは英語の画面を日本語にしましたが、Google翻訳のすごいところは、ほとんどすべての言語で同じ変換が可能なところです。いろいろなページで試してみて下さい。
ロボット開発プラットフォームのまとめ集(ROSなど)

## はじめに〜なぜこの記事を書こうと思ったか〜

今までロボット制御の開発プラットフォームというとROS、ROS2くらいしか知らなかったが、ROSだけでもROS#やIsaac Simなどフレームワーク・ミドルウェアは増えてきた。
備忘のため、この記事にまとめる。

## 開発プラットフォーム
### 1.ROS
一番有名な印象。各種モジュールはC++で基本書かれていて、Pythonで全体制御できる。
  <br>
  
### 2.ROS2
ROSの後継プラットフォーム。ROS2での開発コンペなど出てきているので、本格的にROS(ROS1)からの移行が進んでいるようだ。
今後勉強する際は、ROS2をメインで勉強したい。
・[ROS2 Foxy公式ドキュメント]( https://docs.ros.org/en/foxy/index.html )  
  <br>
  
### 3.Isaac SDK:
・NVIDIAが開発したロボティクス開発プラットフォーム
・C++とPythonのAPIを提供
・UnityプラグインでIsaacSimとの連携が可能
・AIと深層学習の統合に強み
・https://developer.nvidia.com/isaac/sim
・https://developer.nvidia.com/isaac/ros
  <br>

### 4.OpenRTM
・コンポーネントベースのロボットソフトウェア開発プラットフォーム。
・RT（Robot Technology）コンポーネントと呼ばれるモジュール化された機能単位を組み合わせて、複雑なロボットシステムを構築可能。
・C++、Python、Javaなど複数のプログラミング言語をサポートしており
・https://github.com/OpenRTM
  <br>

### 5.PyRobot:
・Pythonベースなのはありがたい。
・ROSと互換性があり、高レベルのPython APIを提供
・実機のロボットとシミュレーションの両方に対応
・公式ページhttps://pyrobot.org/
  <br>

### 6.Rock (The Robot Construction Kit):
・C++とRubyで書かれたロボット制御フレームワーク
・コンポーネントベースのアーキテクチャを採用
・宇宙ロボティクスや惑星探査ミッションで使用されている
・GitHubリポジトリ: https://github.com/rock-core/base-types
・https://www.rock-robotics.org/
  <br>

### 7.MRPT (Mobile Robot Programming Toolkit):
C++で書かれた、主に移動ロボットやコンピュータビジョンのためのライブラリ群
SLAM（同時位置推定と地図作成）、ナビゲーション、センサー処理などの機能を提供
豊富なドキュメントとチュートリアルがある
GitHubリポジトリ: https://github.com/MRPT/mrpt
  <br>

### 8.YARP (Yet Another Robot Platform):
C++で書かれたオープンソースのロボット制御フレームワーク
モジュール性が高く、分散システムの構築に適している
iCub人型ロボットプロジェクトで広く使用されている
GitHubリポジトリ: https://github.com/robotology/yarp
  <br>

### 9.MRPT (Mobile Robot Programming Toolkit):
C++で書かれた、主に移動ロボットやコンピュータビジョンのためのライブラリ群
SLAM（同時位置推定と地図作成）、ナビゲーション、センサー処理などの機能を提供
豊富なドキュメントとチュートリアルがある
GitHubリポジトリ: https://github.com/MRPT/mrpt
GASでスプレッドシートをSQL風に操作したい！！


# GASでスプレッドシートをSQL風に操作したい！！

## はじめに

こんにちは，ご覧いただきありがとうございます！
皆さんは仕事でGoogle SpreadSheetを使いますか？
GAS（Google Apps Script）を使ってスプレッドシートを操作することはありますか？
私の職場（学校）はGoogle Workspaceを利用しており，スプレッドシートを使う機会が多いです。
そのため，業務効率化のためにGASを使うことが多々あります。
しかしながら，SQLを使っている身からすると，スプレッドシートの操作は少し煩雑ですよね。
おそらく多くの方がスプレッドシートのデータをSQL風に扱いたいと思われているのではないでしょうか？
そこで，GASでスプレッドシートをSQL風に操作する方法をまとめたいと思います。

## 既存のライブラリ

当たり前ですが，SQLライクに操作できるライブラリを調べました。
以下の方が作成されているライブラリがありました。

https://qiita.com/roana0229/items/fea931fcabc57f193620

しかしながら，このライブラリはメンテナンスが終了しているようです。
そこで，新たに似たようなライブラリを作りました。

## ライブラリ

GitHub: [https://github.com/ikepu-tp/spreadsheets-sql](https://github.com/ikepu-tp/spreadsheets-sql)
Documentation: [https://script.google.com/macros/library/d/1RV4noVBniL1qVgNX0gqHM2qM_I2L-1dE8uSmuqyEklbBBgYw9eodmV65/2](https://script.google.com/macros/library/d/1RV4noVBniL1qVgNX0gqHM2qM_I2L-1dE8uSmuqyEklbBBgYw9eodmV65/2)
Scirpt ID: `1RV4noVBniL1qVgNX0gqHM2qM_I2L-1dE8uSmuqyEklbBBgYw9eodmV65`

### 使い方

GASプロジェクトに上記のスクリプトIDからライブラリを追加してください。
SQLライクに取得，保存，更新，削除ができます。

#### スプレッドシートの設定

シート=テーブル，1行目=カラム名となるようにシートを作成してください。

#### スプレッドシートを開く

```javascript
const sql = SpreadsheetSQL.SQL('spreadsheetId', "sheetName");
```

#### データの取得

```javascript
sql.get();
```

##### データのフィルタリング

データをフィルタリングしたい場合，`where`，`orWhere`， `whereIn`が使用できます。

###### `where`の使用

```javascript
sql.where(
  [
    "name", //カラム名
    "=", //関係子
    "John" //値
  ]
);
```

関係子は`=`， `!=`， `>`， `<`， `>=`，`<=`が使用できます。
`=`の時は省略出来ます。

```javascript
sql.where(
  [
    "name", //カラム名
    "John" //値
  ]
);
```

複数の条件がある場合は，配列をネスト化してください。

```javascript
sql.where(
  [
    [
      "name", //カラム名
      "=", //関係子
      "John" //値
    ],
    [
      "age", //カラム名
      ">", //関係子
      20 //値
    ]
  ]
);
```

###### `orWhere`の使用

```javascript
sql.orWhere(
  [
    "name", //カラム名
    "=", //関係子
    "John" //値
  ]
);
```

###### `whereIn`の使用

```javascript
sql.whereIn(
  [
    "name", //カラム名
    ["John", "Mike"] //値
  ]
);
```

##### 特定の列の選択

特定の列を選択するには、`select`メソッドを使用します。

```javascript
sql.select(["name", "age"]);
```

##### 最初のレコードの取得

最初のレコードのみを取得するには、`first`メソッドを使用します。

```javascript
sql.first();
```

##### 最後のレコードの取得

最後のレコードのみを取得するには、`last`メソッドを使用します。

```javascript
sql.last();
```

##### 特定のレコードの検索

特定のIDのレコードを検索するには、`find`メソッドを使用します。

```javascript
sql.find(1);
```

カスタムキー名を設定するには、`setKeyName`メソッドを使用します。

```javascript
sql.setKeyName('id');
sql.find(1);
```

#### 新しいデータの保存

```javascript
sql.fill({name: 'John', age: 20});
sql.save();
```

#### 既存データの更新

```javascript
sql.find(1);
sql.fill({name: 'John', age: 21});
sql.save();
```

#### 既存データの削除

```javascript
sql.find(1);
sql.deleteRecord();
```

## 最後に

スプレッドシートをGASでSQLライクに扱うためのライブラリはいかがでしょうか？
イシューやプルリクも歓迎しております！
皆様のお力添えを頂ければと思いますので，よろしくお願いいたします！！
ヲタクが解説！ キューとスタックについて

# 目的
基本情報技術者試験などを学習していたら、「キューとスタック」が出てきました。
暗記が苦手な私はいまいちイメージが掴めず困っていたところ、ふと自分の趣味に当てはめてみたらイメージが掴めましたのでそれを共有します。
この記事の目的は、**初学者がキューとスタックをイメージでつかめるようになる**です。

# 本題
### キュー = シリーズ物のアニメ？
キューを辞書的に説明すると、先入れ先出しです。FIFO（First In, First Out）ともいいますね。
#### イメージ
皆さんはシリーズ物のアニメなどを貯めてしまったことはないでしょうか。
私はガンダムSEEDを貯めてしまっているので、ここではそれを例に出します。
ガンダムSEEDは

* <font color="RoyalBlue">ガンダムSEED</font> (2002年)
* <font color="Crimson">ガンダムSEED Destiny</font> (2004年)
* <font color="DarkViolet">ガンダムSEED Freedom</font> (2024年)

の3つを見ればよいです（細かい話は省略）
さて、あなたはいきなり<font color="DarkViolet">ガンダムSEED Freedom</font>から見始めるでしょうか？
多分キラ・ヤマト（主人公）が何をやってる人なのかわからないので、<font color="RoyalBlue">ガンダムSEED</font>から見始めることでしょう。

1 <font color="RoyalBlue">ガンダムSEED</font> (2002年)
2 <font color="Crimson">ガンダムSEED Destiny</font> (2004年)
3 <font color="DarkViolet">ガンダムSEED Freedom</font> (2024年)

の順ですね。
<font color="RoyalBlue">2002年</font>に入れたもの、<font color="Crimson">2004年</font>に入れたもの、<font color="DarkViolet">2024年</font>に入れたもの、を<font color="Red">**古いものから順に**</font>取り出しています。
これがキューのイメージです。

### スタック = 積みプラ？
スタックを辞書的に説明すると、後入れ先出しです。LIFO（Last In First Out）ともいいますね。

#### イメージ
皆さんは積みプラしてますよね？！（してる前提で語りかける）
私はこの前再販のダンボール戦機のプラモデルを買いました！
積みプラを例にスタックを説明します。以下は私の積みプラの一部と買った年です。

* <font color="RoyalBlue">ウィングガンダムEW</font> (2022年)
* <font color="Crimson">ガンダムエアリアル</font> (2023年)
* <font color="DarkViolet">LBXペルセウス</font> (2024年)

私はウィングガンダムを最初に買いましたが、作らずに積み、また新しいプラモデルを買いました。
どんどん積んで今日まで至りますが、流石に作らなければなりません。
しかし、下から引っ張り出すのも大変なので、最近買って気分が乗っている<font color="DarkViolet">LBXペルセウス</font>から作り始めることにしました。
次は<font color="Crimson">ガンダムエアリアル</font>を作り、最後に一番古い<font color="RoyalBlue">ウィングガンダムEW</font>を作ります。

1 <font color="DarkViolet">LBXペルセウス</font> (2024年)
2 <font color="Crimson">ガンダムエアリアル</font> (2023年)
3 <font color="RoyalBlue">ウィングガンダムEW</font> (2022年)

の順です。
<font color="Blue">**先に買ったプラモデルほど後に**</font>作っていますね。
これがスタックのイメージです。

# 基本情報技術者試験に向けて
さて、先程の説明でイメージが掴めたでしょうか。この節では基本情報技術者試験に出てくる用語と場面にさらっと触れます。

### キュー
キューは「格納順にデータを取り出すことができるもの」です。
キューにデータをいれることを「**エンキュー**」
キューからデータを取り出すことを「**デキュー**」
といいます。

#### 実際に使われる場面
* プリンターの印刷ジョブ﻿
* CPUのタスクスケジューリング
* ネットワーク通信

要は順番待ちですね。

#### 基本情報技術者試験過去問
私が見る限りだと、「キューの説明はどれか」と「キューとスタックを使った処理問題（計算？させる）」くらいでした。
FIFOであることを覚えておけばなんとかなるかなといった感じです。

### スタック
スタックは「格納と逆順にデータを取り出すことができるもの」です。
スタックにデータをいれることを「**プッシュ**」
スタックからデータを取り出すことを「**ポップ**」
といいます。

#### 実際に使われる場面
* 関数の呼び出し
* 割り込み時のデータ退避
* webブラウザの戻ると進む

一言で説明するのは難しいですが、一旦置いておいてすぐに取り出すデータが多いですね。

#### 基本情報技術者試験過去問
スタックはキューと違い、かなりいろいろ出題されてました。スタックという言葉の意味を問うというよりは、実際に考えないとわからない問題が多かったです。
頭の中だけで解くと大変だと思うので、紙に書いて順に解いていってみましょう。
プッシュとポップという言葉を覚えていないと詰みます。

# もっと詳しく

もっと詳しく知りたい方は以下の記事を参考にされると良いと思います！
当記事はなんとなくイメージを掴むのが目的なので、理解ができたらより厳密な説明を読むことが今後の学習につながると思います。

https://qiita.com/drken/items/6a95b57d2e374a3d3292

https://qiita.com/uchidak/items/8efbf0190fb7f1e9bdda

# まとめ
キューは<font color="Red">**シリーズ物のアニメ**</font>
スタックは<font color="Blue">**積みプラ**</font>
というようなイメージを持っていただければ嬉しいです。

拙い文章ですがここまで読んでいただきありがとうございました。
私はこの後プラモデルを作りながらガンダムSEEDを見てこようと思います……
デザインの練習に「ピザ2点を10%割引」のチラシをリメイクした

## デザインの練習第一弾
先日、あるスーパーでこんなチラシを見た。
![IMG_3224.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808608/182e5445-7d5c-d92e-fc59-3a994f7cbf47.jpeg)

もっといいデザインにできそう。

ということで、デザインの練習を兼ねて新しくチラシを作ってみた。

## 新バージョン

これが作ったチラシだ。
![IMG_3232.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808608/8749d10c-65b7-5fe5-9194-b7d447650fb2.jpeg)

見比べるとこんな感じ
![模写（Webサイト）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808608/d22dc379-8bb6-5bca-5544-7bc58903c554.png)


## なぜこのようにデザインしたか

デザインする上で、いくつか心掛けたことある。

1. お客さんの大半を占める年代（50~80代くらい）に伝える
・文字が読みやすいように、文字数を少なくして大きめに配置した
・割引を伝える単語として、おしゃれな「OFF」ではなく、親しみやすそうな「割引」を使った
・QRコードの読み取り方が分からないお客さんがいるかもしれないので、検索できるように検索キーワード付け足した

2. じっくり読まなくても内容が分かるようにしたい
・2枚のピザが安く買えることを伝えるために、2枚のピザのイラストを大きく配置した


3. 使いやすくしたい
・誤って別のQRコードを読み込んでしまわないよう、2つのQRコードを離して配置した


4. 見たくなるデザインにしたい
・若い世代にもアプリをインストールしてもらえるよう、カラフルで目を惹くデザインにした
・彩度が高くて美味しそうなピザの画像を使った
・美味しそうなトマトを追加した
・緑色を足して色彩豊かにした

## まとめ
ピザの美味しさとお得感を伝えられる可愛いデザインになったのではないかと思う。

チラシのリメイクはまたやりたい。
ビットコイン上級者向けSeedSignerフォーク

# 概要
SeedSigner の開発者チームには彼等なりの思想･志向があるようで[^1]、ある種の機能追加リクエストは長い間優先度が低いままに据え置かれています。そこで個人的に欲しかった機能を追加したフォークを自分で作成しました。

[^1]:（セルフ･カストディの初心者が）誤った使い方をすることでセキュリティ上のリスクが生じる可能性のある機能には否定的な印象。たとえばパスフレーズのQRコード入力は多くの場合パスフレーズの紙媒体への保存が前提となりますが、初心者がシードフレーズの SeedQR出力 と一緒にそれを保管した場合のセキュリティリスクを彼らは懸念します。「パスフレーズは記憶すべき」、「長く複雑なパスフレーズより、パスフレーズを使わないマルチシグ設定の方がよい」という思想がある様に見受けられますが、個人的には、ケース・バイ・ケースだと思いますし、SeedSingerは単なるツールなので（特に上級者は）自己責任で利便性とリスクをそれぞれ自分で判断して活用すればよいと考えています。そもそも セルフ・カストディ自体がリスクを伴う訳ですし。

# 追加した機能
現在のところ公式版に追加している主な機能は以下のとおりです。一つ目は日本語のパスフレーズを入力するために必要だったのですが、長期保管用のウォレットなどに長いパスフレーズを設定している場合にも便利だと思います。

- QRコードを用いた BIP-39パスフレーズ入力
- 暗号化シードQR（krux互換）  <font color='red'>New!<font/>
- 平文QRコードによるシードエクスポート  <font color='red'>New!<font/>
- BIP-85 の子シードの読み込み（Jean Do氏のフォークの取り込み。公式版は子シードの画面表示のみ）

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189363/95e9e8bc-5d25-7674-6f02-ff2530489705.png)


# コード
ソース（Python）とSeedSigner用SDカードイメージを[こちらの GitHub サイト](https://github.com/earthdiver/seedsigner/releases)に掲載しています。
【モックアップ】個人開発者必見！アプリのイメージを簡単に作る方法

# はじめに
個人開発でアプリを作成する際、OGP画像やイメージ画像をどうするか悩むことは多いと思われます。

私も当初は非常に悩んでおりましたが、いろんなアプリに目を通してみて、アプリの魅力を一目で伝えるには、モックアップを活用するのが最適だと感じました。

この記事では、モックアップを活用してイメージ画像を作る方法を紹介します。特に個人開発者の方が、自分のアプリの魅力を視覚的に伝える手助けになれば嬉しいです。

# モックアップとは
モックアップとは、デザインやコンセプトを検証するための「模型」や「サンプル」を指しており、個人開発では、アプリの機能やデザインを一目で伝えるためにモックアップが効果的かと思われます。

私自身も開発したアプリのイメージ画像にモックアップを使用しています。次の画像は実際のアプリのイメージ画像ですが、スマートフォンのモックアップを使ってアプリ画面を埋め込んでいます。

![tackle_service.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/11522cf4-3753-f3b7-3229-ac66a31c4aed.jpeg)

モックアップにはスマートフォン以外にも、PCやタブレットなど様々なデバイスを選ぶことができるため、自分のアプリに合ったものを使うと良いと思われます。

## モックアップ画像の作り方
ここからは、モックアップを使ってイメージ画像を作る手順をまとめています。

### 1.モックアップに使う画像の準備

まず、モックアップに表示させたいアプリ画面をスクリーンショットで用意します。

スクショはさまざまな方法がありますが、私は「**FireShot**」というGoogle Chromeの拡張機能を使っています。

https://chromewebstore.google.com/detail/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8%E5%85%A8%E4%BD%93%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-firesh/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja

FireShotをインストール後、レスポンシブ幅を**400px程度**に設定し、モックアップに使用したい部分をキャプチャします。以下の手順でスクショが可能です。

1.検証ツールを開いて表示幅を調整。
2.FireShot拡張機能を使用し「表示部分をキャプチャ」→「画像として保存」でダウンロード。

[![Image from Gyazo](https://i.gyazo.com/2fa8202e77a91a372d9f10c2837304f7.gif)](https://gyazo.com/2fa8202e77a91a372d9f10c2837304f7)

### 2.Canvaでモックアップを作成

次に、Canvaを使ってモックアップを作成します。

https://www.canva.com/

左の「素材」から「モックアップ」を検索し、「フレーム」から好きなデバイスを選択。先ほど準備したアプリのスクリーンショットをドラッグ&ドロップでアップロードし、モックアップに反映させます。

[![Image from Gyazo](https://i.gyazo.com/91d351d6aa83910aefa4bf7dc9fc8408.gif)](https://gyazo.com/91d351d6aa83910aefa4bf7dc9fc8408)

最後に背景画像や文字を加えてデザインを仕上げます。これで完成です！

![tackle_service.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772961/a98379bd-91b0-0918-0d36-1dc179f1cc42.jpeg)

### おまけ

#### FireShotを使わない場合

ショートカットキーを使えば「⌘」＋「shift」＋「4」で範囲選択しながらスクリーンショットを撮ることもできます。ただし、少し難しいかもしれません。他のスクリーンショットツールを探してみるのも良いかもしれません。

#### 背景画像削除(remove.bg)

もし背景を削除したい場合は、remove.bgを使えば簡単にできます。画像をアップロードするだけで、背景を削除してくれる便利なサービスです。

https://www.remove.bg/ja

#### 背景素材集め

**ACシリーズ**

背景や素材を探す際には、写真ACやイラストACがおすすめです。無料で多くの素材が提供されているので、個人開発でも役立つ素材が見つかるはずです。

https://www.photo-ac.com/

https://www.ac-illust.com/

**Adobe Stock**

Adobe Stockの無料素材も十分に活用できます。

https://stock.adobe.com/jp/free

# おわりに
この記事では、個人開発で使えるモックアップ素材の作成方法について紹介しました。

私もかつてイメージ画像で悩んでいましたが、この方法にたどり着きました。アプリの魅力を視覚的に伝えたい方にとって、モックアップは非常に有効な手段だと思います。

今後また何か作った際には、この記事を参考にしてモックアップ画像を作成していきます。

もしこの記事が参考になったら、ぜひご意見や感想をいただけると嬉しいです。皆さんの個人開発が、より魅力的に伝わることを願っています！

# 参考

https://www.canva.com/ja_jp/mockup/

https://chromewebstore.google.com/detail/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8%E5%85%A8%E4%BD%93%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-firesh/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja

https://www.remove.bg/ja

https://www.photo-ac.com/

https://www.ac-illust.com/

https://stock.adobe.com/jp/free
VSCodeで始めるDockerコンテナ上にJava開発環境を構築（プロキシ設定）

# 目的
VSCodeのDev Containers機能を利用し、Dockerコンテナ（Java開発環境）を構築する場合、企業内ネットワークにおいては外部にアクセスするためにはプロキシ設定をしおてく必要があるかと思います。

本記事ではなるべく[Docker公式](https://docs.docker.jp/network/proxy.html)に沿って設定する方針としていますが、1つの事例としてご参考になれば幸いです。

## プロキシ設定として考慮した点
プロキシ設定は環境固有の内容となるため、なるべく「Dockerfile」、「docker-compose.yml」には設定しないようにしたいと考えました。

# 関連記事（ご参考）
下記記事の番外編として、プロキシ設定が必要となる環境における1つの事例を記載させて頂きます。

[VSCodeで始めるDockerコンテナ上にJava開発環境を構築（①WSL環境準備編）](https://qiita.com/peanuts2013/items/bca1ca6856c2a45fa9ea)
[VSCodeで始めるDockerコンテナ上にJava開発環境を構築（②Dockerコンテナ編）](https://qiita.com/peanuts2013/items/6f131f02c44d4ce290db)

# 1. プロキシ設定
## 1.1. 「.bashrc」ファイル
以下のようなケースで必要になる設定と考えています。
* ディストロ（Ubuntu）上から外部アクセス時（curlコマンドでHTTPリクエストを送信確認する場合等）

```bash:/home/app01/.bashrc
export HTTP_PROXY="[http://proxy server]:[port]"
export HTTPS_PROXY="[http://proxy server]:[port]"
export NO_PROXY="localhost,127.0.0.1"
```

```bash:設定例
export HTTP_PROXY="http://proxy.sample.co.jp:8080"
```

「.bashrc」更新後、以下コマンドを実行して設定内容を反映する。
```bash
$ source ~/.bashrc
```

## 1.2. 「http-proxy.conf」ファイル
以下のようなケースで必要になる設定と考えています。
* Dockerfileをビルドする際、ベースイメージの取得時

```config:/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment=[http://proxy server]:[port]
Environment=[http://proxy server]:[port]
Environment=localhost,127.0.0.1
```

「http-proxy.conf」更新後、以下コマンドを実行して設定内容を反映する。
```bash
# システムデーモンをリロードし、新しい設定を反映
$ sudo systemctl daemon-reload

# Dockerデーモンを再起動
$ sudo systemctl restart docker

```

## 1.3. 「config.json」ファイル
以下のようなケースで必要になる設定と考えています。
* コンテナ内から外部アクセス時
[VSCodeで始めるDockerコンテナ上にJava開発環境を構築（②Dockerコンテナ編）](https://qiita.com/peanuts2013/items/6f131f02c44d4ce290db)で使用した「sdk version」コマンド実行時など

```json:~/.docker/config.json
{
    "proxies": {
        "default": {
            "httpProxy": "http://[proxy server]:[port]",
            "httpsProxy": "http://[proxy server]:[port]",
            "noProxy": "localhost,127.0.0.1"
        }
    }
}
```

# おわりに
今回1つの事例として記載させて頂きましたが、使い方に応じてプロキシ設定は別な箇所で設定する事も可能だと思います。
個別の設定ファイルでプロキシ設定するのは分かりにくくなる、というご意見もあるかと思います。
公開範囲が限定的である場合などは、「Dockerfile」や「docker-compose.yml」に直接プロキシ設定を記述してしまった方がシンプル（分かり易い）かもしれません。

利用するシチュエーションに応じて最適な設定方法というのは異なるものだと思いますが、Dockerコンテナ構築ではプロキシ設定は何がどう設定されているのが正解なのか分からず、とても苦しみました。
プロキシ設定で悩まれている方に解決する1つの手段として、少しでもご参考になりましたら非常に嬉しく思います。
【初心者向け】Docker Compose基礎

# Docker Composeとは
- 複数のDockerコンテナをまとめて管理できるツールのこと
    - まとめて起動したり、終了させたりできる
- dockerコマンドはだいたいdocker-composeコマンドとして使える
- 設定ファイルはyml形式で記述される
    - docker-compose.yml
# docker-compose.ymlファイルの基本項目
```
# 例
version: '3.7'

services:
  web:
    build: httpd/Dockerfile
    ports:
      - "8080:80"
    volumes:
      - httpd/code:/code
    depends_on:
      - db
  db:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:
```

## version
- Docker Compose自体のバージョンを指定する
:::note warn
Docker自体のバージョンとは異なる点に注意
:::
## services
- 各コンテナごとに設定を定義する
- 設定項目
    - image
        - 使用するDockerイメージを指定
    - build
        - 使用するDockerfileを指定
        - imageかこちらのどちらかは必須で指定する、基本的にbuild推奨（=Dockerfileを使おうねということ）
    - container_name
        - コンテナに任意の名前を付ける
        - 設定推奨
    - ports
        - ポートの解放とポートフォワーディングを設定
        - {外部公開ポート}:{コンテナ内部ポート}
    - volumes
        - ホストとコンテナでディレクトリを共有する（マウント設定）
        - コードや設定ファイルなどに使用
    - environment
        - 環境変数を設定
        - DBコンテナの場合、ユーザー名やパスワードなど
    - depends_on
        - 他のサービスに依存する場合は指定
    - restart
        - コンテナが異常終了した場合の再起動ポリシーを指定
- ここで定義したservicesの名称はdocker-compose.yml内でそのコンテナを指すキーとして使用できる（例のdepends_onを参照）
# docker-composeコマンド
docker-composeでは基本的にdockerと同じコマンドが使えますが、固有のものもあります。
よく使うものを以下で紹介します。
## docker-compose up -d
- docker-compose.ymlで管理する各コンテナを起動する
- -dオプションを使用し、デタッチモード（バックグラウンド）で実行するのが一般的
## docker-compose down
- docker-compose upの反対
- docker-compose.ymlで管理する全コンテナに対し、docker stopとdocker rmを一括実行する
## docker-compose restart
- docker-compose.ymlで管理するコンテナを全て再起動する
## docker-compose logs
- 起動中のコンテナのログを表示する
## docker-compose run
- docker-compose.ymlで管理するコンテナを一つ指定してコマンドを実行する
- イメージをビルドする前でも実行可能なので、フレームワークのインストールなどに使われる
```
docker-compose run {サービス名} {実行したいコマンド}
```
## docker-compose ps
- docker-compose.ymlで管理されているコンテナを一覧表示する
# 参照
https://qiita.com/nana-solid/items/6e21302e60b23c4e24d0

https://qiita.com/nana-solid/items/fb05da4e89a376156981
【テスト駆動開発】t-wadaさんのLiveコーディングから学んだこと

# はじめに
[TDD Boot Camp 2020 Online](https://www.youtube.com/watch?v=Q-FJ3XmFlT8&t=16s)の講演・ライブコーディングを見て、テスト駆動開発とはこういうものなのかなという、僕が受け取り咀嚼したことを僕なりにまとめました。動画を見た方の簡単なおさらいやTDDに興味を持つきっかけになれば幸いです。
また、誤った認識等あるかもしれないので、まだ動画を見たことない方、TDDを知らない方はぜひ見てみてください。こんな開発手法があるのかと、衝撃を受けるかと思います。

また、テスト駆動開発のことを以後、英称である、TDD(Test Driven Development)と呼びます。

# TDDのゴール
「動作するきれいなコード」です。非常にシンプルです。

# TDDを進めるうえでの前提

- 動作する、と、きれい、の2つに分けて進める
- 設計し続ける
- テストファースト

# TDDの進め方

<font color="red">**テストコードを書く(Red)**</font>　→　<font color="green">**テストを最短で通す(Green)**</font>　→　<font color="yellow">**リファクタリング**</font>

基本的に、このサイクルを回し続けます。

これを**動作する**と**きれい**の2つの工程に分けると、

動作するコードを書く：<font color="red">**テストコードを書く(Red)**</font>　→　<font color="green">**テストを最短で通す(Green)**</font>
きれいなコードを書く：<font color="yellow">**リファクタリング**</font>

## 動作するコードを書く

ここでのポイントは、テストを書く前に機能要件を洗い出したTODOリストを書くことです。
そうすることで頭の中が整理でき、取り組んでいる一つのことに集中できます。

1. TODOリストのように達成すべき機能要件を洗い出す
2. 要件を一つ選ぶ
    1. テスト容易性が高いものからが推奨
    2. 優先順位が高いもの
3. テストを失敗させる（Red）
5. 汚くてもテストが動くコードを書く（Green）

## きれいなコードを書く

ここでのポイントは、テストは通るままでリファクタリングすることです。

## 一周した後

- Red、Green、リファクタリングを繰り返す
- テストの構造化
- 不要なテスト（三角測量のような）は消す

動画の中でt-wadaさんは、「テストは動く仕様書であれ」とおっしゃっています。
例えば、後に新しく参画した開発者がテストコード・実行結果を見ればある程度仕様が分かる状態を指します。
テストをクラスで分けて構造化をすることで、これを実現していました。

# TDDのポイント

テストは動作する仕様書であれ

## テストコードの構成は、準備、実行、検証
- 準備：使用するクラスのインスタンス化等
- 実行：テストする値の作成等
- 検証：assertEquals等

## テストコードは検証(assertEquals)から書くのがおすすめ
単一のゴール（検証結果）からぶれなくなります。

## 「作る」よりも先に「使う」
これが私の中で結構革新的で、TDD以外にも適用できる考え方だと思いました。私は以下のように捉えました。

ここで言う「作る」とは、コードを書くこと。例えば、メソッドの中身を書くことなどが当たります。
「使う」とは、その書いたメソッドを使うことです。
ライブコーディングでは、先にこんなクラスのこんなメソッド使いたいな、と`クラス.メソッド`を先に書いてから、クイックFixでクラスと空メソッドを自動作成し、メソッドの中身を書いていました。

こうする理由は、プログラミングでは、開発者の書きやすいよりも、使いやすい（読みやすい・理解しやすい）事が大事だからです。
また、作りやすさと使いやすさは一緒になりにくい、と仰っていたのもポイントだと感じました。

## One assertion per test
一つのテストに複数のassertionを入れると、失敗したassertionで止まってしまい、以降のテスト結果を見ることができないためです。
一つのテストに複数のassertionを入れないとテストとして成り立たないケースは除くようです。

## 不要なテストはそのテストを書いた本人が消すべきである
- テストは不要かどうかは書いた本人にしかわからない
- 消さないと後々不良資産になる

# 最後に
作りやすさより使いやすさ、であったり、TODOリストで整理することなど、TDD以外でも使えそうな考え方が多くあり、非常に勉強になりました。