OmniAICreator/Qiita-1.07M huggingface dataset:
ご家庭で楽しめるP2P、SyncthingとResilio Syncの比較と紹介

# はじめに

* スマホで撮った写真のバックアップを取るため
* スマホとPCでファイルを共有するため
* 多人数でファイルをシェアするため

上記の理由で、DropboxやGoogle Driveなどのクラウドサービスを使う方は多いと思う。

一方で、外部サービスである以上突如無料で使える枠に制限がかかったり、セキュリティの面で問題が発生するなど心配事も多い。

そこでご提案したいのが、クラウドにデータをアップするのではなく、持っているデバイス間でファイルを共有・同期するソフトの導入である。サーバ構築ほどの手間はかからず、容量の上限＝端末容量の上限となるため、クラウドに課金するよりも安く済むことも多いだろう。

ここでは、筆者が日常的に使用している [Syncthing](https://syncthing.net/) と [Resilio Sync](https://www.resilio.com/individuals/)について紹介・比較する。どちらも、基本的には無料で使えるソフト・サービスとなる。おうちクラウドならぬ、おうちP2Pだろうか？

なお、今回は家庭内LANで同期させることを前提にしている。

# ファイル共有ソフトの紹介

## Syncthing

> 「Syncthing」は、インターネットを介して複数の端末のローカルフォルダーを同期できる無料のツール。第三者の管理する中央サーバーを介さずに済むため、プライベートなデータを共有したい場合に向いている。通信が完全に暗号化されている点や、開発がオープンソースで行われている点なども安心できる要素と言える。幅広いプラットフォームに対応しているのも魅力。

[「Syncthing」複数の端末のローカルフォルダーを同期できるツール \- 窓の杜](https://forest.watch.impress.co.jp/library/software/syncthing/)

## Resilio Sync

> Resilio Sync（レジリオリンク）、旧名称 BitTorrent Sync（ビットトレントシンク）は、Resilio, Inc.により提供されているP2Pファイル同期ソフトである

[Resilio Sync \- Wikipedia](https://ja.wikipedia.org/wiki/Resilio_Sync)

# 利点と欠点

まずは何と言っても、端末の容量がある限りは無料で使えるのが利点。特に電子書籍はファイル容量が大きくなりがちなので、AndroidにさしているmicroSDとPCで同期させている。

また、例えば家族とファイル共有を行う場合、クラウドサービスの場合はアカウント作成が必要になるが、ソフトを入れて設定をするだけで使えるようになるのも利点だろう。家庭内共有としてはownCloudなども選択肢になると思うが、別途サーバや設定が必要になる。

なお、ファイル共有ソフトの欠点としては、同期する端末双方がアクティブになっている必要があるということだろうか。これを解決するために、（前述した利点とは矛盾するが）別途サーバーなど常時起動しているマシンにソフトをいれるというのもおすすめだ。筆者はRaspberry PiにSyncthingとResilio Syncを入れているが、ownCloudほど面倒でないし低スペックでも十分使えている。

# 比較

| | Syncthing | Resilio Sync |
|---|---|---|
|対応OS|Windows, macOS, Linux, Android, Solaris, Darwin, BSD|Windows, Mac, Linux, Android, **iOS**, Windows Phone, Amazon Kindle Fire, FreeBSD|
|e2e|○|○|
|OSS|○|×|
|無料か？|○|△ (一部有料)|
|日本語化|○|○|

ソフトは日本語対応しているがドキュメントは英語。

# どんな用途におすすめか？

## iPhone/iPad で使うなら？

→ iOS に対応している **Resilio Sync**

## Linux で使うなら？

→ 私の環境では、Resilio SyncをLinuxで使うとパーミッション関係がいろいろ面倒だったため **Syncthing** を推す。

## 家族で使うなら？

→ **Resilio Sync** の方がシンプルで分かりやすい。Syncthingはまずデバイス同士を登録したのちに同期するディレクトリを選ぶが、Resilio Syncは同期元でQRやURLを同期先で登録すればよい。同期元では同期先でファイルの編集を許可するか決められるのもポイントが高い。また、Resilio Syncは基本的にソフト1つを入れれば使用できるが、Syncthingは同期のためのソフトと設定変更のためのソフトが分かれている（またはWeb GUIを使用する）。

## 細かい設定を使いたいなら？

→ **Syncthing** は、ファイルのバージョン管理方法等細かい設定ができるように感じた。なお、Resilio Syncも「パワーユーザー向け環境設定」でいろいろと設定できるようだ。

## 選択型同期を使いたいなら？

→ 「選択型同期」とは、同期先が同期元のどのファイルをダウンロードするか選べる機能を指す。 **Resilio Sync** はこれに対応しているが、Windows版は有料版でないと利用できないようだ。iOS版とAndroid版はなぜか無料でも使えている。

# 未来へ

色々なサービスに手を出しては使わない、を繰り返しがちな私でも、この2つのサービスはないと困る程度には利用している。特に、使用用途が限られるRaspberry Piもこれらの導入で活用できており、「アナログ画像をPCでスキャンする→Resilio SyncでRaspiに同期→Raspiで自動的にファイル変換→他の端末に同期」という、回りくどい使い方で利用中だ。今後も、何かしら活用法が見つかったらアップデートしていきたい。
Shell Scriptコマンドで調べた書き方や作法について

# 経緯
シェルコマンドは頻繁に書くものではないが、時々書く際に細かいルールや書き方を忘れてしまうことがある。
その時のために調べて実行してみたコマンドについてまとめてみた備忘録です



## Q. シェルコマンドの戻り値を取得したい

### A. 
```shell:Terminal
a=$(git config user.name)
echo ${a}
# GITHUB_USERNAME
```
用途：CLIでgit操作する際に現在のステータスを元に条件分岐処理させるため。複数アカウントある際に上記のコマンドで確認して各アカウントに紐づいた処理をするため。

参考記事：[リンク](https://armadillo.atmark-techno.com/blog/53/3081)
【Bash】scriptコマンドの使用方法


## scriptコマンドとは
端末での操作内容を記録するコマンドです。
scriptコマンドからexitを入力するまで記録します。

## 使い方
以下のように記述します。
```:ターミナル
$ script オプション 保存先ファイルのパス
```
保存先ファイルのパスを指定しない場合は`typescript`というファイルが作成され記録されます。
また何のオプションを指定しないと既存のファイルに上書きされます。
記録が保存されるのはexitを実行したタイミングです。

## オプション
オプションには以下のようなものがあります。
<table class="cmd_option" border="1">
  <tbody>
    <tr>
      <th class="opt">オプション</th>
      <th class="note">説明</th>
    </tr>
    <tr>
      <td>-a</td>
      <td>内容を上書きせず既存のファイルに追記する</td>
    </tr>
    <tr>
      <td>-c コマンド</td>
      <td>コマンドの実行結果を記録する</td>
    </tr>
    <tr>
      <td>-f</td>
      <td>リアルタイムに記録する</td>
    </tr>
    <tr>
      <td>-q</td>
      <td>開始、終了時のメッセージを表示しない＆終了時のメッセージを表示しない</td>
    </tr>
    <tr>
      <td>-t</td>
      <td>タイミングデータを標準エラー出力に出力する。/td>
    </tr>
  </tbody>
</table>
Gitのローカルリポジトリでワークツリーを一時退避するチートシート

# はじめに

Gitでバージョン管理を行っているローカルリポジトリで
ワークツリー内の変更内容を一時的に保存(現在の作業を一時的に退避)する方法について
よく使用するコマンドの覚書を残します。

## コマンド

```bash
# 追跡されていないファイルも含めて名前を付けて退避する
$ git stash save -u "sample_stash_name" 

# 補足：save時にpオプションを指定することで部分的に(hunkという単位で)退避することもできる
例：git stash save -p "sample_stash_name"

# 退避した作業一覧を確認
$ git stash list

# 退避した作業の詳細を確認
$ git stash show stash@{number}

# 補足：show時にpオプションを指定することで差分(diff)を確認することができる
例：git stash show -p stash@{number}

# 退避した作業を指定して元に戻す(applyで戻した作業は退避一覧から削除されない/popコマンドだと削除される)
$ git stash apply stash@{number}

# 作業が戻っていることを確認してから削除
$ git stash drop stash@{number}

※「sample_stash_name」及び「number」は適宜読み替えること。

```
stack-chan制作記(シリアルサーボの設定)

[こちら](https://github.com/meganetaaan/stack-chan/blob/dev/v1.0/case/README_ja.md)を参考に、stack-chanを作成しています。

作成時にはまったことをまとめています。

# 環境＆
windows 10 
FEETECHサーボ　STS3215
FEETECH FE-URT1-C001 シリアルバスサーボ用USBプログラマ

## シリアルサーボの設定
シリアルサーボは、通信線を共有しているため、2つのサーボにそれぞれIDを割り当てます。下記のように割り当てを行いました。

ID1: 足側（左右回転、パン軸）
ID2: 顔側（上下回転、チルト軸）

### サーボの書き込み
1. giteeのFeetechのリポジトリからダウンロードします。[link](https://gitee.com/ftservo/fddebug)
2. シリアルバスサーボ用USBプログラマを接続すると、Comのタブで選択ができる。BaudRは、1000000に設定し、Openを押し、Searchを押す。
3. Servo listに接続したサーボが出てくるのでそれを選択する。あとは、マニュアルを参照すればできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/f9507553-f48d-c0e5-e9e1-4d5b9d20f216.png)
Indented.Net.IPを利用してPowerShellでCIDR計算してみる

CIDR計算をしたり、CIDR範囲を展開したり。

ここらへんをPowerShellで取り扱う方法をしらべた際に、.Netを利用した手法は色々とありましたが。

PowerShellギャラリーで公開されている、`Indented.Net.IP`モジュールが自分が欲しかった機能を提供していて、CIDR計算をする時に便利なのでご紹介。

## ドキュメント

- [PowerShellギャラリー - Indented.Net.IP](https://www.powershellgallery.com/packages/Indented.Net.IP/)
- [Indented.Net.IP](https://github.com/indented-automation/Indented.Net.IP)

## 今回試している環境

- Windows 10 21H2
- Powershell 7.4.0-preview.4
- Indented.Net.IP v 6.3.2

## インストール

PowerShellギャラリーで公開されているので、下記コマンドでCurrentユーザのスコープにインストールできます。

```powershell
Install-Module -Name Indented.Net.IP -Scope CurrentUser
`

## インストールされるコマンド

インストールされるコマンドは下記で確認できます。
Get-Command -Module Indented.Net.IP
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/313399b0-a0f5-8f97-9e1e-1e3e9f3c2ba7.png)

### Get-NetworkSummary

個人的にこのモジュールで一番使っているコマンドレット

下記のように`CIDR`を渡すと範囲を返してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c2f01748-9d93-c007-df6b-4bb1a74a6d05.png)

サブネットをどう分割するか考えながら、確認のためにこのコマンドを叩くと便利です。

### Get-NetworkRange 

資料などを作る際に、CIDR範囲のIP一覧が欲しいときなどはこのコマンドレットを利用します。

`CIDR`を渡すとIPの一覧を返してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8924d0e8-a657-d80c-3f34-bb36de5697ac.png)

### ConvertTo-Mask

マスク長を入力すると`255.255.255.224`といった形で返してくれます。
瞬時に計算できる人以外は普通に便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2d12e508-899a-4444-f29a-7868f0553906.png)

### ConvertTo-Subnet

StartとEndのIPを渡すと、近い範囲のサブネットを計算してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ccbdf3c9-9289-2fd8-4b7f-ab8e2f66f3ec.png)

## 総評

だいたい作業しているときは`Windows Terminal`が起動していて、四則演算だったりちょっとした計算はPowreShell上で実行していたりするので、そんな人はそれらと同様にPowerShell上でちょっとCIDR計算ができるとだいぶ便利かと思います。
【自作アプリ】実装機能④

今回の実装機能について解説していきます！！

#### 【実装機能】
・これまでに作成した株式投資データをひとまとめに指定集計する機能を実装
・集計毎に前回の集計との差で文字の色に変化をつけている
・集計できるのは1日に1回までの制約がありそれに違反する際はエラー画面に飛ぶ様にしてい

#### 【画面レイアウト】
収支確認画面➀
![集計画面➀ 　実装機能④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/34ca9d7f-f3ae-5ebc-fa41-8e629daf0787.png)
収支確認画面➁
![集計画面➁ 実装機能④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/fef29be1-d95a-cfba-97d4-1d3a15f5e253.png)
集計画面
![集計画面➂ 実装機能④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/044e59d9-4503-47e6-a24e-896786dee4b9.png)
集計確定画面（エラー画面）
![集計画面④ 実装機能④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/8f6ee053-a140-c1b4-58f0-d305e1ce018c.png)
集計確定画面
![スクリーンショット 2023-08-05 11.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/4dbf80fe-5942-fa94-eed7-cac24a5aa23f.png)
基本情報技術（科目A）の学習メモ

基本情報技術（科目A）の学習中に出てきた基礎知識をただダラダラ書いていくだけです。
実務でももしかしたら会話中に出てくるかも！？（出てきたらラッキー）

### AES
米国で企画化された**共通鍵暗号方式**
### KCipher-2
九州大学とKDDIにより開発された**共通鍵暗号方式**
### RSA
**公開鍵暗号方式**の一つ

---

### MTBF(Mean Time Between Failure)
**平均故障間隔**：故障と故障の間を表す
「大体このくらいの間隔でどこかしらが故障する」といった目安
### MTTR(Mean Time To Repair)
**平均修理時間**：修理に必要な時間の平均

---

### ACID特性
DBMSのトランザクション処理に対しての次の4つの特性の頭文字をとったもの
**Atomicity(原始性)**：トランザクション処理結果は「すべて実行」か「全く実行しない」のいずれか。中途半端に実行されるようなことはない。
**Consistency(一貫性)**:データベースの内容が矛盾のない状態であること。
**Isolation（隔離性）**:複数のトランザクションおいて、排他処理を行い相互に影響させないこと。
**Durability(耐久性)**:正常に終了したトランザクションの更新結果は、障害が発生してもデータベースから消失しないこと。復旧手段が保障されていること。

---
### SOA
サービス指向アーキテクチャの意。
企業に導入されている様々なアプリケーションまたその機能の一部を一つのサービスとしてコンポーネント化し、その部分部分を必要に応じて一つのサービスとして組み合わせることで新たなシステムとして使う、といった設計の手法
第一世代のQAエンジニア(2)組織構造・業務範囲・権限・評価

## 1. はじめに
「[第一世代のQAエンジニア](https://qiita.com/pbjpkas/items/83c1c4fdfbb2b88d4c96)」で紹介した[ソフトウェア品質保証部長の会](http://www.juse-sqip.jp/bucho/index/)の資料を中心に、組織構造・業務範囲・権限・評価の話題を取り上げたいと思います。

## 2. 組織構造
「[各社の品証部長が語るソフト品質保証の取り組み](http://www.juse-sqip.jp/bucho/1term/attachs/grp3.pdf)[^1]」において組織構造（QA部門の位置づけ）が3パターン挙げられています。

> ①経営直轄型：事業部門から独立して、品質の砦として位置づけられる
> ②技術支援型：事業部門に対する全社的技術支援業務の一環
> ③事業部内型：事業部門内におかれ、事業特性に合わせた機能を持つ

QA部門を設けるならQAエンジニアやQA部門をどのように位置づけていて、将来どうしたい（どうなりたい）というビジョンを持っておくと良いように思います。以下は架空のビジョンですがこういのうが一枚あると経営側とQAエンジニア側で認識合わせがしやすくなるのではと思います。

1. 最初は商品Xの設計部門へ入ってインプロセスQAとしてQAサービスを提供する
2. QAエンジニアの効果を示して商品Y、商品ZへもQAサービスを展開し、並行してQAコーチ、QAコンサルタント、QAプロモーターとしてQA部門を組織化していく
3. 出荷判定の権限を設計部門からQA部門へ移管しフェーズゲートQAとして出荷のGo/NoGo判定を行う
![qa-structure](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/a6627ea3-efdb-56fa-333a-3fb549069dbd.png)

## 3. 業務範囲
「[各社の品証部長が語るソフト品質保証の取り組み](http://www.juse-sqip.jp/bucho/1term/attachs/grp3.pdf)」によると、業務範囲として「QA（プロセス）」「QA（成果物）」「SEPG」「（品質）教育」「保守（出荷後障害管理）」「リスク管理（プロジェクト）」が挙げられていて、

> QA（成果物・プロセス）および教育を業務範囲としている組織が多い
> ※組込系に比べ、エンタープライズ系の業務範囲は多岐にわたる

という話です。組み込み系の筆者にとって組み込み系のQAの業務範囲は妥当な感じがしました。

また、「[1からQAエンジニア採用を始めるあなたへ【QAエンジニア採用の教科書】 ](https://note.com/r_wasa/n/n77cc690bf296)」ではQAエンジニアの業務内容を大きく①テストに関する業務内容、②品質基準の策定やテスト実施後に起きる業務内容、の2つで整理されています。ただ、「一人目のQAエンジニアは、品質基準の策定からテストの実施までを自ら行うため業務範囲はものすごく広く、採用難易度は高めです」についてはQA部門の業務範囲とQAエンジニア個人の業務範囲が混ざっているように思いました。

QA部門の業務範囲が広いのはその通りで中にはこれもソフトウェアのQAの範疇なの？と思うようなものも持ち込まれたりすることがありますが、そうは言ってもリソースは有限なので重要度や優先度でやるやらないを決めて対応します。また、QAエンジニア個人でいえばどの分野もできるというよりも得意な分野がいくつかとその他は広く浅くという感じと思います。QA部門を設けて品質改善を図るなら得意分野がちょっとずつ異なる複数のQAエンジニアでチームを組んで業務範囲を広げていくのが良いのではと思います。

## 4. 権限
ここでいう権限は出荷判定の権限で「[各社の品証部長が語るソフト品質保証の取り組み](http://www.juse-sqip.jp/bucho/1term/attachs/grp3.pdf)」によると「組込系は品質保証部、エンプラ系は開発・製造部門 に明確に分かれた」という話です。

QA部門が出荷判定の権限を持つかどうかは「[探針テストと「強いQA」「弱いQA」](https://togetter.com/li/1068123)」も参考になると思います。

## 5. 評価
「[各社の品証部長が語るソフト品質保証の取り組み](http://www.juse-sqip.jp/bucho/1term/attachs/grp3.pdf)」によると、品質保証部の組織としての評価項目に「出荷後のバグ・不具合件数」「出荷後の事故費用、回収不能コスト」「プロジェクトの赤字数。赤字額」「社内への貢献（レビュー指摘内容、ES指標など）」が挙げられていて、

> 組込み系とエンタープライズ系で、評価尺度に大きな違いがある
> ・組込み系：出荷後の不具合を減らすという具体的指標
> ・エンプラ系：ビジネス全体の品質を向上させるという幅広い指標

とのことです。組み込み系の筆者にとって組み込み系のQAの評価項目は妥当な感じがします。また、業種によって指標が異なるのは興味深かったです。

また、[グリー品質管理 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/greecps2021)の「[より良い成長につなげるために！QAメンバーの目標設定](https://qiita.com/shumai-hime/items/f74cf709b24f0b892a96)」では「目標とはかくあるべきか」からスタートしてさまざまなKPI、KGIを紹介されています。

## 6. おわりに
今回取り上げた組織構造、業務範囲、権限、評価はいずれも経営の専権事項と考えられるものです。

第二世代のQA部門（分業体制が確立しているQA部門）で担当者としてQAの仕事をするのであれば「品証部長はこういうのも考える必要あるのですね」と眺めていられるのかもしれないし、少なくとも経営側はQA部門の役割をきちんと説明できることが求められます。

一方、一人目のQAエンジニアを採用するなどしてQA部門を立ち上げる場合は経営側にQA部門やQAエンジニアの知見が不足している可能性があります。自分自身で成果を出すだけでなくQA部門がスケールするようにレールを敷くのも第一世代のQAエンジニアの役割である以上、経営の専権事項といえども組織と自分自身のどちらもバリューを出せるようQAの専門家として助言してゆくのが良いと思います。

[^1]: [日科技連 | ソフトウェア品質 | 第2期 第1回 ソフトウェア品質保証部長の会・無料講演会 -第1期成果発表-](http://www.juse-sqip.jp/bucho/1term/report.html)(2010年)
最低限のgrepコマンド知識

## はじめに
初めまして、mirankoといいます。
今回はgrepコマンド大全、というよりは今業務で使っている最低限のgrepコマンドについて紹介していきます。

## 対象者
新卒～2年目程度のレベル感を想定しています。grepをオプションなしで実行しているままの人もとっかかりにはなるはずです。

## 目次
[1 -i 大文字小文字を区別しない](#1--i-大文字小文字を区別しない)
[2 -r フォルダ内を再帰的にgrep](#2--r-フォルダ内を再帰的にgrep)
[3 -v 除外](#3--v-除外)
[4 -n 行番号表示](4--n-行番号表示)
[5 --include 対象ファイルの条件指定](#5---include-対象ファイルの条件指定)
[6 --exclude 除外ファイルの条件指定](#6---exclude-除外ファイルの条件指定)

----

### 1 -i 大文字小文字を区別しない
iオプションは大文字小文字を区別しないため、例えばソースコードの中から「qiita」という文字を探すとき以下のような具合で検索結果が変わります。**特に業務用語をクラス名や変数名にしている場合、人によって大文字小文字のつけ方が違う場合がある**ため、基本iオプションはつけるのが吉です。

 - iオプションをつけたとき
```
$ grep -i qiita grep.txt
qiita
Qiita
QIITA
QiiTa
```
 - iオプションがないとき
```
$ grep qiita grep.txt
qiita
```

### 2 -r フォルダ内を再帰的にgrep
こちらも基本的につけるオプション。再帰的（今の階層より深い階層すべてのファイルを対象）にgrepを実行します。findと少し似てますね。

### 3 -v 除外
-v をつけると、通常とは逆に**除外するキーワード**を指定できます。
例えばHTMLファイルのinputタグのうちbutton以外を検索結果として得たいのであれば、
```
 grep "input" | grep -v "button"
```

とすることで **「input」の検索結果から「button」が含まれる行を除く結果** を抽出できます。
-vは「除外モード」のような挙動なので、以下のようにして除外したいキーワードを複数並べることもできます。
```
grep -v "AAA" "BBB" ファイル名
```
もしくは
```
egrep -v "AAA|BBB" ファイル名
```
といった風に書くこともできます。|（パイプ）でまとめるには -Eでの正規表現モードONかegrepを使う必要があります。

### 4 -n 行番号表示
-nをつけると抽出結果に行番号が合わせて出力されます。**grepした結果に該当する行を修正したい**といったケースで有用です。
```
$ grep -n "ii" grep.txt
1:qiita
2:Qiita
4:QiiTa
```

ファイル名無しの場合は以下のように「ファイル名:行番号:実際の行」で出力されます。
```
$ grep -rn "ii"
grep.txt:1:qiita
grep.txt:2:Qiita
grep.txt:4:QiiTa
```
このgrep結果をExcelに貼り付けたい、といった場合には:（コロン）をTabに置換すると、Excel上で別のセルに分かれて貼り付けできます。

### 5 --include 対象ファイルの条件指定
--includeオプションは**抽出対象ファイルをより細かく指定できます。**
例えば、jsp、js、cssの入ったWebContentフォルダに対して、jspだけ対象にgrepしたい、という場合は以下のようになります。
```
grep -r "input" --include="*.jsp"
```
*は任意の、という意味なので、拡張子がjspのファイルに限定してgrepする、というような使い方ができます。
includeの指定が複数ある場合は、""ではなく{}を用います。

```
grep -r "tokyo" --include{*.jsp,*.js}
```
この場合は、任意のjspファイル、任意のjsファイルに限定してgrepを行っています。
対象ファイルが絞り込めているのであれば、grep段階から絞り込んでしまうのがよいです。


### 6 --exclude 除外ファイルの条件指定
--excludeはincludeとは逆で、**除外したいファイルの条件を指定します。**
明らかに関係ないファイルは除きたいけれど、対象ファイルははっきり絞り込めていない、という場合には一旦excludeで除外した抽出結果を精査して、真に必要な条件を狭めていくとよいでしょう。
例としては以下のような形です。classファイルやTestクラスのjavaファイルを除外しています。
```
grep -r "Tokyo" --exclude={*.class,*Test.java}
```

## まとめ
最低限1~6のオプションを知っていれば、grepを使い始めて半年1年レベルにはなれるのではと思います。他にもファイル名のみ出力する-lオプションなど使えるオプションはありますし、grepとsedを組み合わせる、psコマンドの結果をgrepするといった組み合わせによりさらにできるようになることも無限にあるので、ぜひ使いこなせるようになりましょう！

## 終わりに
これはよく使う、といったgrepコマンドオプション、組み合わせるコマンドあればコメント頂けますと幸いです！
MySQL 5.7→8.0 移行のメモ

MySQL5.7がそろそろEOLなってしまうので色々検証していてそのメモです。

# 移行に関するドキュメント
MySQL公式
https://dev.mysql.com/blog-archive/upgrading-to-mysql-8-0-here-is-what-you-need-to-know/

AWS RDS公式
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.MySQL.html

# 事前チェック
## Update Checker Utility
MySQL公式の移行に関するドキュメントに記載されているチェック項目をツールで実施してくれるようです。

ツールの公式URL
https://dev.mysql.com/doc/mysql-shell/8.0/ja/mysql-shell-utilities-upgrade.html

### インストール
インストールが公式ドキュメント通りにいかなかったのでメモ

```
# apt install する準備
$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.26-1_all.deb

$ sudo dpkg -i  mysql-apt-config_0.8.26-1_all.deb
  # ここで [Which MySQL product do you wish to configure?] とでてくる
  # 一覧から「OK」選び、tabキーを押下して「OK」を選択、Enter

# インストール
$ sudo apt-get update
$ sudo apt-get install mysql-shell
```

### 使い方

```
# 接続する
$ mysqlsh ユーザ名@DBエンドポイント

# チェックを流す 「util.checkForServerUpgrade()」を入力してEnter
MySQL  DBエンドポイント名:3306 ssl  JS > util.checkForServerUpgrade()

～～　チェック結果がずらずらでます　～～～

# mysqlshから抜ける 「\q」を入力してEnter
MySQL  DBエンドポイント名:3306 ssl  JS > \q

```

## MySQL Check
mysql clientに内包されているっぽい
手軽に確認できます
Update Checker Utilityより限定的なチェックをするみたいです。

```
$ mysqlcheck -u ユーザ名 -h DBエンドポイント -p --all-databases --check-upgrade
```
ドラゴンボールのキャラクターやエピソードで英単語を覚えるAI英和辞書を作ってみた

# ■まえがき
皆さんは英単語を覚える時にどのように勉強されていますか？

私はTOEICの勉強をしているので「金のフレーズ」や「mikan」、iPhoneの辞書アプリなどを主に使っています。
ですが、ある程度覚えてくるとなんとなくはわかるものの、記憶の定着率が悪いな。。。と感じるようになりました。
そこでChatGPTを使って語源を調べることができることに気づき、語源を知ると単語を覚えやすいと感じ、これを生かして辞書チャットボットを作ってみようと思い立ちました。

その過程で多くの辞書では例文がついているものが多いですが、それらの例文を見ても記憶に残らなかったのですがキャラクターを使った例文だとイメージすることが簡単にでき、記憶に残りやすかったのでそれも取り込むことにしました。

今回はそれをご紹介しながら開発経緯などをお話したいと思います。

:zap:無料公開していますが、ChatGPTのAPIの利用に費用がかかるので制限超えるとエラーになってしまうかもです。💦

# ■ドラゴンボール超AI英和辞書Zのご紹介
これはLINEで使用するAI英和辞書チャットボットです。

【イメージ画像】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/d7341209-abc0-0e71-2beb-aedb3079d91d.png)

【動画】
![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/7358e80d-ce7d-be56-98e0-eee8a92c8cb8.gif)

## 使用方法
↓のURLまたはQRコードでLINEの友達追加してください
https://liff.line.me/1645278921-kWRPP32q/?accountId=244xbiyp
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/63f5285b-415b-abaa-d54f-60e84990a90a.png)
あとはLINEトークで調べたい単語を送信すると単語の調査結果が返答されます。

## 機能
以下の内容を返答するようになっています。
・意味
・類語
・発音
・品詞
・コアイメージ
・語源
・DragonBall例文
　ドラゴンボールのキャラクターを使った例文をみて、その文の状況をイメージしながら読むようにしましょう。

・Weblio辞書検索
　もっと詳細に単語の意味を知りたい場合に使用します。

・Google画像検索
　入力した単語で画像を検索して、その単語の意味をイメージするのに用います。

## 特徴
よくある基本辞書に部分に加えて、語源と例文を示してくれるところが特徴です。

「語源」は接頭辞、語根、接尾辞やその他の語源要素を説明します。

「例文作成」は入力した単語を使った例文を作成してくれます。
その際にドラゴンボールのキャラクターおよび世界観を用いた英文が作成されるのでイメージしやすく単語の使い方が理解しやすいと思います。

## 開発環境
GAS（Google App Script）を用いて開発しました。詳細は以下の記事を参照ください。
https://qiita.com/rakio/items/a5b1beff89a720fdafee

# ■プロンプト考察
プログラムの作成よりもプロンプトの作成にかなり時間を費やしました。
理由はGPT3を使っているのですがかなりのじゃじゃ馬で全然いうことを聞いてくれなくて本当に困りました。:confounded:
それでもGPT4を使わなかった理由は精度は高くて良いのですが、返答が遅いのと費用が高いので諦めました。:weary:

##  大文字・小文字の扱いについて
スマホのLINEで英文を入力する場合、最初の文字が大文字になることが多いかと思います。
これをそのままChatGPTに送ると動詞だった場合、命令文と判断されてしまうようでロールプレイを忘れて解答してしまうことがわかりました。
「最初の文字は大文字で小文字として考えて」というようなことを依頼して見ましたがダメで。
結局、プログラムで小文字にした方が速くね？と思いつき、それで対応するようにしました。
なんでもプロンプトでやろうとしない方がよいことがわかりました。

##  例文作成でドラゴンボールを使用した理由
当初、有名な人物、歴史上の人物、アニメのキャラクターなど色々選定してみたのですが、日本のキャラクターを使用すると意味のおかしい例文を作成することに気が付きました。
例えば、サザエさんを使うとのりすけさんが小学生扱いされたり、ドラえもんを使用するとまったく意味不明なものが作成されました。
そこでアメリカ、イギリスで人気があるHarryPotterやスティーブ・ジョブズなども考えたのですが魔法の世界観またはビジネス業界に絞られる例文になるのでこれはどうなのかと思い悩みました。
色々と思案しているとそういえばドラゴンボールはハリウッドで映画になったことを思い出し、試してみたところ、ChatGPTとの相性がよく、うまくドラゴンボールの世界観に合わせた例文を作ってくれることがわかりました。

#  ■その他
【Jetpack Compose】Material3のButtonの高さを48dp未満に設定する

次のようにボタンに高さを設定しても、何故か48dpまで余白が設定されてしまう。

```kotlin
Button(
    onClick = {},
    modifier = Modifier
        .border(width = 1.dp, color = Color.Blue)
        .heightIn(min = 36.dp)
) {
    Text("36dp")
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53293/63231e4d-84eb-55d0-cc0f-2c022ff07069.png)

## 対応策

`LocalMinimumTouchTargetEnforcement`に`false`をセットする。（`ExperimentalMaterial3Api`であることに注意）
```kotlin
CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
    Button(
        onClick = {},
        modifier = Modifier
            .border(width = 1.dp, color = Color.Blue)
            .heightIn(min = 36.dp)
    ) {
        Text("36.dp")
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53293/942278ee-6ada-0a47-ef6f-1fadea920265.png)


## 詳細
ButtonはSurfaceを使って実装されているが、Surface内でタップ領域として48dpを確保している。
https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt;l=223;drc=f683eb9211f4df84f04e6437df3804135f8cf62e?hl=ja

## 2024/9/26 追記
仕様が変わったようです。`LocalMinimumTouchTargetEnforcement`ではなく、 `LocalMinimumInteractiveComponentSize` で最小のタッチサイズ指定する形になりました。
```kotlin
CompositionLocalProvider(LocalMinimumInteractiveComponentSize provides 0.dp) {
    Button(
        onClick = {},
        modifier = Modifier
            .border(width = 1.dp, color = Color.Blue)
            .heightIn(min = 36.dp)
    ) {
        Text("36.dp")
    }
}
```
いまさら解説する「データ加工」 §0

今回から不定期に、データ加工についての基本技術を発信していこうと思います。

# 自己紹介
「お前、誰だよ」「どんだけ経験積んだん？」と言われそうなので、まず軽く自己紹介を。:angel:
（※はよ話せという人は飛ばしてどうぞ）

・社会人経験6年目
・データサイエンス界隈には4か月くらい
・今までプログラミングはおろか、大学のパソコンの授業は一番下のレベル

と、まあ要はド素人なわけですわ。そのド素人の私が、ここ数か月で学習したことをここでつらつらと発信していきますので、先輩データ分析ニキネキたちは生暖かい目で、後輩データ分析ニキネキたちは「なんやこいつ、こんなん俺でもできるわ」とにやにやしていてください。

# 記事の方向性
この記事では、以下のことを書いていこうと思います。

・データ分析処理を行う上での心構え
・簡単なデータ分析の処理技術
・私の学習歴

などなどを書いていきます。書いてほしいこととか、あれば教えてください。なんでもしま…:boy_tone5:

# 私の学習歴
現在私は以下のことをやっております。

a) Signateを利用した学習
b) 書籍を活用した学習
c) 資格取得を活用した学習

## a) Signateを利用した学習
### What is Signate?
まずはSignateについて簡単に説明をば。（ご存じなニキネキたちは飛ばしてどうぞ）
Signateは一言でいえば「データ分析コンペ」です。要は与えられたデータから、予測モデルを作りその精度を競う、つよつよな人が集う世界です。

ところでデータ分析コンペといえば「Kaggle」が思いつくニキネキもいると思いますが、これとは全く違います。
何が違うって、もうそれはすべてがですね「日！本！語！」なのですよ。。。
いやいや最近はKaggleだって日本語版の本とか出てるし余裕でしょ？って思いますよね？そりゃただ普通にやる分には、まあいけると思いますよ（くっそどうでもいいですが、私も英語はそれなりにわかりますし）。
ただ予期せぬ事態が起こったとき「母国語のほうが安心しませんか？安心しますよね！」ということでSignateを選びまし…


たというわけではないのですよ。
ちゃんと理由はあります。それは
#### 「あなたはデータをはいと渡されてすぐ分析できますか？！？」
ということにあります。

このSignateの最高なのは、課金すると（ここ重要）データ分析の手法を学べるのですよ、しかもハンズオン形式で環境設定不要で。これ最高Of最高じゃないですか？
私のようなペーぺーは何からやればいいかわからなくて困りました。なので今はこれをせかせかとやっております。
これほんといいですよ、まじで（Signateさん、宣伝してあげたから無料にしてくれないかな…（小声））。

んで、これは後述するんですけど、入門書との相性がエド・〇るみよろしくバッチグー:thumbsup:です。

## b) 書籍を活用した学習
「じゃあ、その入門書って何やねん」って話なので、とっとと言います。

・『東京大学のデータサイエンティスト育成講座』

https://www.amazon.co.jp/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E8%82%B2%E6%88%90%E8%AC%9B%E5%BA%A7-%E5%A1%9A%E6%9C%AC-%E9%82%A6%E5%B0%8A-ebook/dp/B07PD237GQ/ref=sr_1_12?adgrpid=150605272950&hvadid=658792569819&hvdev=c&hvqmt=b&hvtargid=kwd-2008068689681&hydadcr=4074_13329421&jp-ad-ap=0&keywords=%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E6%9C%AC&qid=1690810718&sr=8-12

です。まじ魔本です。pythonのさわりをやって、各種ライブラリをやり、機械学習を学習します。
私のようなド素人はですね、パソコンに打ち込んでその通りに動くだけで興奮するんですよ。「やった動いた！！」みたいな感じで。

なので、データサイエンスに興味あるニキネキはとりあえずこの本を買って勉強しような:punch_tone2:

余談ですがこの本の良きポイントはほかにもあって
・余白が多い
・参考文献が豊富に載っている
ということが挙げられます。

参考文献は言わずもがな、学習の道順を示してくれるダンジョンマップです。載っているとテンション上がります。だってまだこんなに勉強できるんだ！！と思わせてくれるんですよ？？？

じゃあ、余白が多いのはなんでいいんでしょうか。中身スカスカなのでは？と思いませんか？答えはもちろんNoです。

自分の学習やあれやこれやで学んだことをどんどんと書き込んでいけるんですよ。最高じゃないですか？
そうやって魔本を作り育てていくんです、そう、令和は「本は育てる」時代です。ということで少々大判な本ではありますが、電子書籍よりも紙の本を買ったほうが良いと思います。

ほかにもいい本はあると思いますが（事実私はほかにも持っていますが）、とりあえず今日のところはこの辺で。

## c) 資格取得を活用した学習
最後に資格試験です。データサイエンス界隈は最近いろんな資格が勃興しておりますが、私は

・統計検定 準一級以上（できれば一級）
・データベーススペシャリスト

を学習しております。
理由は簡単で、そんなに簡単な試験ではないからです。簡単な試験はそれだけライバルも多いし、わかったような気にさせるだけのことも多いです。「道を極めるなら（その道で食っていくなら）少々高い山でも登っていくべき」が私の信条です。


# 結びに変えて
「未経験からでもOK‼最短三か月で給料がXX万円に‼」みたいなものも最近は見かけますが、どんな業界でも仕事はそんなにやさしいものではない。この記事をここまで読んでくれたニキネキは普段仕事なり勉強なりを一生懸命やっているはずです。「いやいや、そんなやってないよ」というかもしれませんが、ほんとは遊びたいし眠たいし、というようなものを抑えて対峙しているわけです。

そんなニキネキだからこそ「お前も鬼（道を極めた人）にならないか？」という言葉で締めます。
データサイエンスはそんなに甘くない、ことを痛感したからこそ、その面白さに引き込まれました。その面白さが少しでも伝わればうれしいです。


※次回からが本編です（失踪しないように願っててください）。
ChatGPT 公式Best Practiceからヒントを得たい人へ

## はじめに
　本記事ではChatGPTの開発元OpenAIが記しているベストプラクティスの要点をまとめています。

早速ですが今回使用した公式ソースは以下の通りです。
1. [GPT のベスト プラクティス - OpenAI API](https://platform.openai.com/docs/guides/gpt-best-practices)
1.  [Azure OpenAI Service - Azure OpenAI | Microsoft Learn](https://learn.microsoft.com/ja-JP/azure/ai-services/openai/concepts/prompt-engineering#best-practices)

1.はChatGPTの開発元OpenAIによるベストプラクティス。
2.はMicrosoftとOpenAIが共同開発した[Azure OpenAI](https://learn.microsoft.com/en-us/azure/ai-services/openai/overview)を活用するためのベストプラクティス。

### Best Practice from OpenAI inc.
OpenAIでは以下6つの要点でまとめています。
1. Write clear instructions　
1. Provide reference text　
1. Split complex tasks into simpler subtasks
1. Give GPTs time to "think"
1. Use external tools
1. Test changes systematically　
 
##### 1. Write clear instructions
GPPTに対して出力が長すぎる場合は、簡単な返信を求めてください。出力が単純すぎる場合は、専門家レベルの入力を行い依頼をしてください。
GPTがあなたの望むものの推測をする必要が少なくなるほど精度の高い返信が得られます。

##### 2.Provide reference text
GPTは時に堂々と偽の回答を作り上げてしまう恐れがあります。
そのため、参考文献を提供することでより正確で信頼性の高い回答が得られる可能性が高まります。

##### 3.Split complex tasks into simpler subtasks
複雑なタスクは要約やフィルタリングをかけることでより単純なサブタスクに分割をします。
複雑なタスクは単純なタスクよりもエラー率が高い傾向があります。そのため、複雑なタスクは単純なタスクのワークフローとして再定義されることが多く、前のタスクのアウトプットが後のタスクのインプットを構築するために使われます。

##### 4.Give GPTs time to "think"
人と同じようにGPTもすぐに答えようとすると推論エラーを起こしやすく、答えを導き出す時間を与えるとより確実に正しい答えを得られます。
具体的には、答えの前に推論の連鎖（計算の過程など）を含めて依頼をすることで信頼性の高い回答が得られる可能性が高まります。


##### 5.Use external tools
GPTの弱点を補うために外部ツールの出力をGPTに与えることで、より良い結果が得られる場合があります。
例えば、画像や音声やビデオなどの非テキスト形式の入力や出力が必要な場合や、数値計算やデータ分析などの高度な処理が必要な場合は外部ツールを利用することが有効です。


##### 6.Test changes systematically
GPTは時に間違った回答をしたり、不適切な言葉を使ったりすることがあります。
そのような場合には、[OpenAI Evals](https://github.com/openai/evals#openai-evals)を利用することでGPTを評価するフィードバックを与えて改善するように促すことができます。


### Best Practice from Microsoft inc.
Microsoftでは5つの要点でまとめています。
1. Be Specific
1. Be Descriptive
1. Double Down
1. Order Matters
1. Give the model an “out” 

##### 1.Be Specific
　具体的記載することで解釈の幅をできるだけ狭めます。これによりGPTの回答へ制限を加えます。

##### 2.Be Descriptive
　例を与えて分かりやすくします。

##### 3.Double Down
　あなたの優先度の高い文章は質問の前後に繰り返し使用して、指示を明確に指定しましょう。

##### 4.Order Matters
　支持の順番も重要です。指示をコンテンツの前に配置するか、コンテンツの後に配置するかで出力が異なる場合があります。
特に[few-shot examples](https://github.com/openai/openai-cookbook/blob/main/techniques_to_improve_reliability.md#few-shot-examples)などでも順番が重要となります。大量の細かな指示よりも時には良質な出力例を提示してあげることも重要です。

##### 5.Give the model an “out”
　モデルが誤った応答を生成することを回避するため、割り当てられたタスクを完了できない場合の代替案を提示して依頼しましょう。
　例) GPTへ質問を尋ねる際に"Respond with ‘not found’ if the answer is not present" (回答がない場合は、"見つかりませんでした" と応答してください。) という内容を含めるなど。



## おわりに
いかがだったでしょうか。　
今回、公式で発表されているGPTを使用するベストプラクティスについてまとめてみました。
ChatGPTから思うような回答が得られない場合はこれらを念頭に置いてみてはいかがでしょう。
皆様の快適なChatGPTライフの参考になると幸いです。
TwinMakerに良い感じの（ホバー、操作ができる）ボタンを置く

# この記事について

- AWS IoT TwinMakerで作成した3D空間に、ホバー、クリック操作ができるボタンを作成します
- この記事では、クリックからECHONET Liteのカーテンが閉まるところまで確認します

# どうやって？

- three-mesh-uiを使います
    - VRや3D Webアプリ向けのライブラリです
    - 簡単に良い感じのボタンやテキスト、キーボードを作成して、3D空間上に配置できます

# 動いているところ

- マウスポインタが「閉じるボタン」に乗るとホバーで色が変わります
- 「閉じるボタン」がクリック操作を受けると、ECHONET Lite シミュレータのカーテンが閉まります。また、部屋の奥にあるテキストの表示が変わります

![control.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/52b41cc0-fa2f-453b-55eb-35f090083f20.gif)

※gifだとぼやけているので、pngの画像がこちらです

![button-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/2cc51435-5efd-1e84-a31b-72c58654c2c3.png)

![bar-button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233180/a0ba60e2-e2fc-c906-6172-39b23df95ac9.png)


# ソースコード

ソースコードはこちらにあります。add-buttonのブランチです
https://github.com/ShotaOki/twinmaker-echonet-direct/tree/add-button

TwinMakerをiot-app-kitで動かして実装します。

# 実装方法

ボタンの実装部分はThree-Mesh-Uiのサンプルそのままを適用するだけなので、大まかに実装の流れだけを説明します。
https://github.com/felixmariotto/three-mesh-ui

インタラクティブ・ボタンのサンプルそのままで大丈夫です。
https://github.com/felixmariotto/three-mesh-ui/blob/master/examples/interactive_button.js

### 1. 日本語フォントを持ってくる

3DアプリにはHTMLのようなフォントレンダリングの仕組みがないため、MSDFフォントを使います。画像に文字が敷き詰められていて、そこから目的の文字をピックアップしてくるフォントです。

Three-Mesh-Uiに入っているMSDFフォントは日本語フォントに対応していないので、こちらからNotoの日本語フォントを借用します。
https://github.com/studioTeaTwo/aframe-japanese-font

- noto-sans-cjk-jp-msdf.json
- noto-sans-cjk-jp-msdf.png

コピーしたら、Reactプロジェクトのpublicディレクトリに配置します。

### 2. フォントをボタンに適用する

フォントは親要素のBlockに適用します。

```javascript
    // フォントを適用する
	const container = new ThreeMeshUI.Block( {
		justifyContent: 'center',
		contentDirection: 'row-reverse',
		fontFamily: "/noto-sans-cjk-jp-msdf.json",
		fontTexture: "/noto-sans-cjk-jp-msdf.png",
		fontSize: 0.07,
		padding: 0.02,
		borderRadius: 0.11
	} );
```

あとはThreeMeshUI.Textでテキストを作成して、containerにぶら下げて、クリックイベントを登録すればOKです。

# まとめ

TwinMakerとThree-mesh-uiの相性は悪くないので、Three.js向けのUI資産が簡単に使えます。
オリジナルな操作用ボタンを作成して、TwinMakerの3D空間から現実の機器を操作することで、便利なものが作れると思います。
Go言語で完全コンストラクタパターンを実装する

## はじめに
これまではPHPをメインで扱っていたのですが、最近はGo言語を使用しています。そこで、Go言語ではどのように値オブジェクト＆完全コンストラクタパターン（Complete Constructor Pattern）を実装するのか解説していきます。

## 対象の読者
- Go言語に興味を持っている方
- オブジェクト指向設計（デザインパターン）に興味がある方
- コードの品質向上を目指す方
- PHPからGoへの移行を検討している方

## 完全コンストラクタパターンの基本
### 完全コンストラクタパターンとは？
インスタンスを生成した時点で完全な状態となるような初期化ロジックを、コンストラクタに実装するパターンのことです。

完全コンストラクタパターンを用いることで、オブジェクトが不正な状態で存在することがなくなります。これにより、呼び出し側でオブジェクトが正常かどうかチェックする必要がなくなり、ロジックの重複や修正漏れを防ぎ、保守性の向上が見込めます。

### 注意点 ： 生成したインスタンスを不変に保つ
せっかく完全コンストラクタでオブジェクトを完全な状態にしても、不変（immutable）な状態を保たなければ意味がありません。そこで、setterを実装しない＆構造体のフィールドは小文字はじまりで非公開にしておきましょう。

※ 構造体のフィールドを小文字始まりにしても同じパッケージ内からはアクセス可能です。外部パッケージからのアクセスのみ制限します。
※ コンストラクタを使わなくても構造体を生成できますが、生成する際は必ずコンストラクタを使用するルールを定めましょう。

## Go言語におけるコンストラクタの基本
Go言語ではPHPの__constructのような言語仕様としてのコンストラクタがないため、代わりにNew〜という関数を定義し、その中でインスタンスの生成を行います。

```go:user.go
package domain

type User struct {
	Name string
	Age int
}

// 最小限のコンストラクタ
func NewUser(name string, age int) *User {
	return &User{
		Name: name,
		Age: age,
	}
}

func (u *User) GetName() string {
	return u.name
}

func (u *User) GetAge() int {
	return u.age
}
```

## 完全コンストラクタパターンの設計と実装
先ほどのコンストラクタの例では、不完全な状態のオブジェクトを生成できてしまいます。例えば、`age`に0を渡してオブジェクトを生成します。

```go:main.go
func main() {
	user := NewUser("佐藤", -1)
	fmt.Println(user.GetAge()) // -1が出力される
}
```
何もチェックを入れていないので問題なくインスタンスの生成と値の出力ができていますが、これは不完全な状態です。なぜなら本来`age`に負の値が入ることはありえないのにも関わらず、インスタンスを生成できてしまっているからです。

そこで、以下のように`User`を修正します。

```go:修正後のuser.go
package domain

type User struct {
	name string
	age  int
}

func NewUser(name string, age int) (*User, error) {
    // nameが空文字列の場合はエラー
	if name == "" {
		return nil, fmt.Errorf("name is empty")
	}
    // ageが0未満の場合はエラー
	if age < 0 {
		return nil, fmt.Errorf("age is negative")
	}

	return &User{
		name: name,
		age:  age,
	}, nil
}

func (u *User) GetName() string {
	return u.name
}

func (u *User) GetAge() int {
	return u.age
}
```
コンストラクタ内で`age`に負の値が入った場合はエラーを返すようにしており、ついでに名前が空文字列ということは最低限あり得ないので、ここも弾くようにしました。
これにより、NewUser関数を使用する限り不完全な状態でインスタンスが生成されないようになりました。

```go:main.go
package main

import "fmt"

func main() {
	user, err := NewUser("test user", -1)
	if err != nil {
		fmt.Println(err) // エラーが出力される
		return
	}
	fmt.Println(user.GetAge())
}
```
これを実行すると、NewUserがエラーを返すようになり、標準出力として`age is negative`が出力されるようになります。不完全な状態ではインスタンスが生成できないようになっていますね。

## 終わりに
Go言語で完全コンストラクタパターンの実装を行いました。NewUserでインスタンスを生成するようにしましたが、結局User{}で初期化されてしまうので完全コンストラクタ風にはなっています。これについてはinterfaceを使用することで解決できますが、コード量や複雑さが増すのでトレードオフかと思います。

また、今回記載しているオブジェクトの「完全な状態」とは状況によって異なります。ここはドメインの知識を把握し、しっかりとコードに反映していく必要があります。
PLCとは

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# PLCとは
PLC(Programmable Logic Controller)は、__プログラム可能な制御装置__ を指します。産業分野で用いられる制御システムの一種であり、様々な自動化プロセスを管理・制御するために使用されています。`PLCは、従来のリレー制御に代わる高度な技術として、産業界に革命をもたらしました。`
よくシーケンサーと混同されますが、三菱電機がPLCをシーケンサーという名前で販売しているため、三菱電機製のPLCをシーケンサーと呼びます。

# なぜPLCなのか
PLCが選ばれる理由は多岐にわたります。まず、PLCは __柔軟性が高く__、プログラムを変更することで異なる制御タスクに対応できます。また、__リレー制御に比べて配線が簡略化され、制御システムの信頼性向上とメンテナンスの容易さ__ が実現されます。さらに、産業プロセスの高度な自動化に必要な複雑な制御ロジックを実現できるため、効率的で正確な制御が可能となります。


# PLCの仕組み
PLCは、入力モジュールでセンサーやスイッチからの信号を読み取り、プログラムに基づいてこれらの信号を処理します。その後、制御プログラムが決定した結果に基づいて、出力モジュールを介してアクチュエータや制御装置に制御信号を送ります。
PLCで用いられるプログラム言語は、テキスト方式のものもありますが、ラダー図と言ってハシゴに似た図と少しの文で構成されるものもあり、日本国内で最も普及しているのが、このラダー図になります。


# 終わりに
PLCは、産業界において生産性の向上、安全性の向上、コスト削減などの多くの利点をもたらしています。自動車製造、製造業、エネルギー産業、プロセス制御など、さまざまな分野で幅広く利用されています。今後も技術の進化によって、より高度な制御が可能になるとともに、IoT（Internet of Things）との統合によるさらなる自動化の発展が期待されています。PLCのさらなる進化と産業への貢献に期待が高まります。

最後までお付き合いくださりありがとうございました。
Gazebo velodyne_simulatorの使い方

# 概要

ROS2 のGazebo環境においてvelodyne_simulatorの使い方のメモ

# インストール

githubにあるvelodyne_simulatorではなくbitbucketにあるこちらのfoxy-develブランチを使う

https://bitbucket.org/DataspeedInc/velodyne_simulator/src/foxy-devel/

```bash
mkdir -p ~/veloydne_ws/src
cd ~/veloydne_ws/src
git clone https://bitbucket.org/DataspeedInc/velodyne_simulator.git -b foxy-devel
cd ~/veloydne_ws
colcon build --symlink-install 
```


# サンプルの実行

```bash
ros2 launch velodyne_description example.launch.py
```

Gazeboとrviz2が起動し、VLP-16とHDL-32E両方のPointCloud2が表示される

![rviz_screenshot_2023_07_30-11_24_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/1fd83ca3-642d-da4f-2a2d-0b3b2f5d7470.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/3ef3b804-c138-2be4-de55-966f3534f4ad.png)


# ロボットにのせる場合

urdfファイルに以下を追加 VLP-16の場合

```xml
  <xacro:include filename="$(find velodyne_description)/urdf/VLP-16.urdf.xacro"/>
  <xacro:VLP-16 parent="base_link" name="velodyne" topic="/velodyne_points" organize_cloud="${organize_cloud}" hz="10" samples="440" gpu="${gpu}">
    <origin xyz="0 0 0.4" rpy="0 0 0" />
  </xacro:VLP-16>
```
【 ChatGPT】生成AIを使ったデータ分析の記事まとめ

ExcelやTableauに搭載予定の生成AIのデモ画面を見て、生成AIを使った分析ツールに可能性を感じたので、自分の勉強のために生成AIを使ったデータ分析の記事をまとめてみました。

もし、私以外にも生成AI×データ分析に興味がある人がいればぜひ読んでみてください！


# ChatGPT×LangChainで全自動データ分析ツールを作った話①

https://recruit.gmo.jp/engineer/jisedai/blog/chatgpt-data-analytics/

こちらの記事は、GMOインターネットグループの技術ブログで、ChatGPTのAPIとLangChainを使って、全自動分析ツールを作れるかを試した記事です。

アリババが発表した「ChatGPTがどれくらい優れたデータ分析者なのか？」を評価した論文を参考に、生成AI搭載のデータ分析ツールを作成しています。

この記事で作成しているのはかなり簡易的なアプリですが、実装方法の詳細もわかりやすく書かれているので、生成AIを使ってデータ分析アプリを作りたいと考えている人は必見です。

# ChatGPT×LangChainで全自動データ分析ツールを作った話②

https://blog.brainpad.co.jp/entry/2023/06/12/182351


こちらの記事も、ChatGPTのAPIとLangChainを使って、全自動分析ツールを作れるかを試した記事ですが、データ分析の専門会社であるブレインパッドが作っているだけ会ってより本格的なツールを作っています。

分析ツールが実際に動いているデモ画面もGIFで確認できるので、ChatGPTを使えばどんな全自動分析ツールが作れるか知りたい人は必見です。

# ChatGPT×LangChainで全自動データ分析ツールを作った話③

https://note.com/dory111111/n/n6df3cfbd7b3a

こちらの記事も、ChatGPTのAPIとLangChainを使ってデータ分析ツールを作った話です。

この分析ツールの特徴は、データ分析をスムーズに行うために、「プランナーAI」や」「コードAI」、「レビューAI」など6つの機能に分けて実装している点です。

また、開発も1週間程度で行ったとのことで、ChatGPTのAPIやLangChainを使えばサクッと自動分析ツールが作れる良い例ですね。

# ChatGPTを使った人事データの分析

https://note.com/hrmos_worktech/n/n260469d0cc2e

ChatGPTの新機能「Code Interpreter」を使って、人事データの分析をした話です。

かなり具体的な分析の方法が解説されているので、実際に「Code Interpreter」を使ってどんなことができるかのイメージがつきます。

特に人事データの分析にデータ分析の専門家の工数を割ける会社は少ないと思うので、このようにChatGPTをうまく活用して誰でも簡単に分析ができるようになる良い例です。

# ChatGPTを使った売上分析

https://generativeinfo365.com/?p=1031

上の記事と同じくChatGPTの「Code Interpreter」を使って、アパレル店舗の売り上げデータを分析している記事です。

多くの企業で取り組んでいるであろう売上分析をChatGPTの「Code Interpreter」を使えばどれくらい任せられるのかが解説されています。

売上分析をしたいと思っているけど、分析に人員を割くのは難しい小売店などで活用できるようになるのではと思わせてくれます。
キーボードを打音で選んだら、選ばれたのは◯◯でした

# はじめに
まだ新型コロナウイルスが猛威を振るっていた頃、在宅勤務をするためにデスク周りを整えるべく、キーボードやモニター、デスクなど一通り買い揃えました。その際、ガジェットの選定に一番時間をかけたのが、キーボードでした。
キーボードとしてお馴染みなのはHHKBですが、悩んだ末に私が購入したキーボードは、logicoolのPOP Keysでした。
![IMG_0035.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332870/f97fc24e-ca4b-9ffa-2dc3-29eb00980209.jpeg)

# なぜ選んだのか
どうせ買うなら後悔しない買い物をしたいので、購入時は大きめの家電量販店に行き、実際にキーを打ちまくりました。個人的にキーボードには打音の良さを求めていたのですが、打感が一番気持ちいいと感じたのが、POP Keysでした。
今現在は、自宅ではPOP Keys・会社用ではHHKBというふうに使い分けていますが、私としては、POP Keysの「カチャカチャ」という打音の方が好きです。

# その他の良いところ
私が考える限りでのPOP Keysの良いところです。
前提：メイン機→MacBook、使用歴→Windowsが長い

・MacをWindowsと似た感覚で使える(キーの配置がWindowsに寄っている気がする)
・ペアリングが簡単
・開封してから初期設定で色々せずに使い始められる

# おわりに
ガジェットは値段が高ければいいってもんじゃないんだな〜としみじみ。
業務効率アップ！！毎日１時間かかる集計作業がPower Automate Desktopで15秒に！

私の職場では毎日、前日までの実績を集計する作業があり、出社すると当番の人は一番初めに取り掛かる業務になっています。作業としては特に問題なく行うルーチン業務ですが長い間、手作業となっており作業時間がかかる業務となっています。今回はこの作業を想定したサンプルデータを使って、`Power Automate Desktop`を利用しエクセルの集計作業を自動化してみました。
この集計作業を自動化することで、仕事の内容を「集計すること」から「集計された実績をどう見せるか」「分析する」という時間に変えて行きたいです。
## 完成した動画
https://twitter.com/maminnie1107/status/1685887383223599104?s=20

## 使用したもの
・EXCEL３種類（元データ、計算ファイル、集計ファイル）
・[Power Automate Desktop](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/install)

## 手順
### １．[Power Automate Desktop](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/install)を手順に沿ってパソコンにダウンロードする。
　※Windows11の場合は標準で搭載されているので、インストール不要です。

### ２．Power Automate Desktopの手順
#### 【全体の流れ】
集計作業で使用するEXCELファイル３種類の作業の流れを説明します。
①`元データ`と`計算ファイル`を開き、`元データ`の実績をコピーし`計算ファイル`の指定の位置に張り付ける。
②`計算ファイル`で計算された数値を`集計ファイル`の指定の位置に数値として貼り付け完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/6783dda6-c506-6da7-c1cb-755aca8b28c7.png)
##### 【①の手順】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/ad83089e-9a33-f4dd-8da7-fc7971e8ea66.png)
・`元データ`と`計算ファイル`を開くを設定する。
　`Excelの起動`を左クリックし起動するファイルを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/5a310f46-3e7d-03cd-e06f-8f8edbc24889.png)
・`元データ`のコピーする範囲を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/78425a82-7cc0-6362-29cb-26d32aac466f.png)
・`計算ファイル`の貼り付けするセルを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/f2c3166f-9caa-fd95-b77b-d492d4a8c826.png)
・`元データ`は使用しないので閉じる。保存する必要はないので「保存しない」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/82fe5049-d238-2164-e812-6783761be394.png)
##### 【②の手順】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/464f3b17-c503-a6f3-4ecb-d4054acba4be.png)
・`集計ファイル`を開く。
・`計算ファイル`で計算した数値を読み取る。セルの範囲を設定。
`※値の貼り付けをするため「セルをコピー」ではなく「ワークシートから読み取る」を選択。`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/d8c87e45-5009-b4e4-a01e-9047fed432e6.png)
・`集計ファイル`の書き込むセルを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/689d231a-3cf4-56a9-da5c-6e8a794f2b23.png)
・ファイルを保存し完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477447/f35a6030-cf66-9cc6-9d43-95245488f7f2.png)

## 完成してみて
　同じチームメンバー2名に完成した`Power Automate Desktop`を見てもらったところ、Aさんは「業務で使えそう」Bさんは「他の資料の数値集計等でも使えそう」、作り方を説明したところ「自分でも作れそう」という感想でした。毎日の実績集計作業以外にも各自が担当する定例の会議資料で集計しなければいけない作業は少なくありません。個人の業務で各自が使用するツールとしても導入することで業務効率が図れるのではないかと思いました。
すぐにでも会社のパソコンで使えるようにしたいと思い、上司にも私が作った`Power Automate Desktop`を見てもらったところ、業務で利用できるようにしようということで、導入できるかシステム部門、リスク部門へ導入可否を確認することになりました。今回サンプルで試した集計作業が自動化できれば、年間約480時間の人件費削減に繋げることができ、約80万円の経費削減にもなります。
## 最後に
　ジームメンパーに見てもらった時に思ったよりも反応が薄かったのが気になりました。私は自分で作ったので完成したときにとても感動しました。（毎回何かできたときは感動します）同僚にも同じように感じてもらえるといいなと思います。試すという意味でも`Power Automate Desktop`は取り掛かりやすいツールだと思いますので、業務に取り組めるように社内の調整を進めていきたいです。
DateTime.MaxValueの翻訳の誤り

2023/7/31時点

[DateTime.MaxValue フィールド (System)](https://learn.microsoft.com/ja-jp/dotnet/api/system.datetime.maxvalue?view=net-7.0&source=docs)

Microsoftの公式の解説が、間違っているとはあまり思わないじゃないですか。
この項の日本語は機械翻訳みたいですが、日時の翻訳に失敗しているとは予想していませんでした。

> この定数の値は、グレゴリオ暦の 9999 年 12 月 31 日の 23:59:59.99999999 と等価です。

とはっきり書いてあるので、
```c#
DateTime.Parse("9999-12-31 23:59:59.99999999")
```

がエラーになるのが、何故？　としばらく原因を調査していました。

2時間ぐらい調べている中、英語の解説を読むと、

> The value of this constant is equivalent to 23:59:59.9999999 UTC, December 31, 9999 in the Gregorian calendar

とあります。

`99999999`ではなくて、`9999999`です。
しかも、`January 1, 10000`が、`100000 年 1 月 1 日`になっています。

従って、エラーにならないコードは次です。
```c#
DateTime.Parse("9999-12-31 23:59:59.9999999");
```

## スクリーンショット
### 英語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/20eba3a5-597b-7a34-ba6b-bc2984e59d5c.png)

### 日本語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/3f1133c6-fde4-f859-a444-a02201934077.png)


英語版では、
23:59:59.9999999
January 1, 10000

日本語版では、
23:59:59.99999999
100000 年 1 月 1 日
[MR Dev Tips #4] Unity プロジェクトで音声データを扱う際の基礎理論

# はじめに
今回は Unity で HoloLens 2 のアプリケーションを開発する際に必要になる効果音 ( SE : サウンドエフェクト ) について書いていきたいと思います。Mixed Reality アプリケーションを開発する際、ボタンを押した際や場面転換時、何かイベントが発生した時、BGM (バックグラウンドミュージック) 等、アプリケーションの起動がから終了までの間の音 (Audio) を考慮する必要があります。特に、HoloLens 2 のようにジェスチャー操作が基本となるデバイスは、コントローラーを使用する他のAR/VRデバイスと比較して触覚のフィードバック (振動、物理的なボタン) が使えないので、視覚と聴覚を駆使して仮想オブジェクトがまるで現実世界に実在するかのように没入できる体験を作り込まなければいけません。

# Unity プロジェクトで音声データを扱う際の基礎知識
Unity のオーディオシステムを使えば、自然界と同じようにドップラー効果やサラウンド効果をコンテンツで再現することが可能です。

## 基礎理論
- 物理学において **音は気体、液体、固体などの伝達媒体を音響波として伝搬する振動** を指す
- 実生活において、音はオブジェクトから発され **(音源)**、人々の耳 **(リスナー)** に届く
- 同じ音でも環境要因等によって聞こえ方が異なる
- 音の高さは **ピッチ** と呼ばれ、音の高さは **Hz (ヘルツ)** という単位の周波数で決まる
- 動きの速い音源 (通り過ぎる救急車など) はピッチを変えることでドップラー効果を引き起こす
- トンネルや洞窟などの閉鎖空間では、音が反射してエコーがかかる


> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/079e5a47-3f6b-7283-ecc3-b89609b12028.png)
> (引用元:[オーディオの概要](https://docs.unity3d.com/ja/2021.3/Manual/AudioOverview.html))


Unity では、音源の位置の影響をシミュレートするために ``AudioSource`` コンポーネントがアタッチされたオブジェクトから音を発生させます。発生した音は ``AudioListener`` がアタッチされた他のオブジェクト (主に Main Camera) を通じて受け取ることができます。リスナーオブジェクト (ユーザー) から ソースオブジェクト (音源) までの距離と位置の影響をシミュレートして、それに応じて再生された音をユーザーに届けてくれます。



# Refs
- [オーディオの概要 - Unity Documentation](https://docs.unity3d.com/ja/2021.3/Manual/AudioOverview.html)
- [Sound - Wikipedia](https://en.wikipedia.org/wiki/Sound)
【SwiftUI】ScrollViewを一番下から始める

# はじめに
チャット画面の実装する際にScrollViewを使うことになると思いますが、
開いた時は最新のチャットが表示されてないといけません。

最新のチャットは1番下にあるのでScrollViewを1番下からはじめたいです。

その方法を記録しておきます。

# サンプルアプリ
![Something went wrong]()


# 実装
ScrollView内の1番下の要素のidに`proxy.scrollTo()`で移動します
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ScrollView {
            ScrollViewReader { proxy in
                VStack(spacing: 10) {
                    ForEach(0..<50) { index in
                        RoundedRectangle(cornerRadius: 10)
                            .frame(maxWidth: .infinity)
                            .frame(height: 100)
                            .foregroundStyle(Color(red: .random(in: 0...1), green: .random(in: 0...1), blue: .random(in: 0...1)))
                            .id(index)
                    }
                }
                .padding(16)
                .onAppear {
                    proxy.scrollTo(49)
                }
            }
        }
    }
}
```

# おわり
意外と簡単にできました
ソフトウェア開発に用いるツール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/d68ed61d-eacd-0a65-73ec-fd21ec8d127e.png)
　ソフトウェア開発に利用するツールには、言語プロフェッサをはじめとして、エラー検出やテストに利用するツール、CASEツールがあります。言語プロフェッサは、C Java、Pythonなどの言語で書かれていたプログラムをCPUが実行できる形に処理・変換するツールです。
　エラー検出には、ダンプ、トレーサ、インスペクタ、アサーションチェッカといったツールが役立ちます。テストには、テストケースジェネレータやしゅみゅレー田といったツールが役立ちます。このような一種のツールを結びつけ、さらには、仕様書の作成なども支援するツールをCASEツールといいます。

　プログラミング言語は、プログラムを記述するための言語です。CPUが直接的に理解し実行できるのは機械語のみです。しかし、機械語のプログラムは数値が羅列されただけのものですから人間にとって解釈しづらいです。そこで、英単語などをつかってプログラムを記述できるようにしました。このような、人間にとって分かりやすい表記ができるプログラミング言語を高水準言語（高級言語）といいます。一方で、機械語は低水準言語（低級言語）といいます。
aws-cliでタグの有無を検索条件に一覧出力してみる（snapshot）

AWSのタグ情報は運用管理や料金管理につながる部分となるため。
通常運用では仕組みから付与されたり、手動でタグ登録する際はルールに従ってタグ登録がされているかと思います。

ここではイレギュラーケースが発生したときを想定し

- タグ情報が何もついていないSnapshot
- 特定のタグがついていないSnapshot
- 特定のタグの組み合わせがついていないSnapshot

を`aws-cli`で一覧に出力する方法を説明します。

## 参考ドキュメント

[AWS CLI を使用して、指定されたキータグの有無にかかわらず、Amazon EBS スナップショットをすべてリストするにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ebs-snapshots-list/)

### タグ情報がなにもついていないSnapshotの一覧を取得

○○のタグ情報がついているといった検索をする場合は、`--filter`オプションを使ってフィルタをできますが。

今回はタグがついて　**いない**　ものを探す必要があるため

    `--filter`オプションではなく`query`オプションで全件取得したあとに`query`していきます。

```powerhsell
# タグ登録がないSnapshotの情報を出力
aws ec2 describe-snapshots --owner self --query 'Snapshots[?!not_null(Tags)]'
```

上記の様に`Snapshots`構造を`!not_null(tags)`で検索して、タグ登録がないSnapshot一覧を出力しています。

`describe-snapshots`ではタグ登録がない場合は、`Tags`自体がなくなるため。

`not_null(Tags)`で、タグが登録されていると真となり、それを`!（反転）`でなにもタグ登録がない場合に真となる検索条件となります。

### 実行サンプル

下記のようなSnapshotがある状態で実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a5bc23da-bf7f-398c-b958-2d38c38a70c0.png)

タグが登録されていない、説明が`qiita-tags001`となっているスナップショットの情報が取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d4cd51a1-0ce0-069b-68c1-7229cfe11e3b.png)

### 特定のタグが登録されていないSnapshotの一覧を取得

ここでは`Name`が登録されていないsnapshotを検索してみます。

```powershell
# Nameタグが登録されていないSnapshotの情報を出力
aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[?!(Tags[?Key == `Name`])]'
```

```?Tags[?Key == `Name`]```でNameタグが登録されていれば真となる条件となり、これを`!（反転）`して```?!(Tags[?Key == `Name`])```はNameタグが登録されてなければ真となります。

### 実行サンプル

下記のようなSnapshotがある状態で実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a5bc23da-bf7f-398c-b958-2d38c38a70c0.png)

Nameタグが登録されていない、説明`qiita-tags001`と`qiita-tags003`のスナップショットが取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2658cf63-1929-b697-f1cd-277c96c48922.png)

### 特定のタグの組み合わせが登録されていないSnapshotの一覧を取得

ここでは`Name`タグと`sample`タグが登録されていない一覧を検索してみます

```powershell
# Nameタグが登録されていないSnapshotの情報を出力
aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[?!(Tags[?Key == `Name`] && Tags[?Key == `sample`])]'
```

```?Tags[?Key == `Name`] && Tags[?Key == `sample`]```でNameタグとsampleタグをもつ場合に真となる条件となり、これを`!（反転）`して```?!(Tags[?Key == `Name`] && Tags[?Key == `sample`])```はNameタグとsampleタグがない場合は真となります。

### 実行サンプル

下記のようなSnapshotがある状態で実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a5bc23da-bf7f-398c-b958-2d38c38a70c0.png)

Nameタグとsampleタグがあわせて登録されていない説明`qiita-tags001`,`qiita-tags002`,`qiita-tags003`が取得できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1e9a0e09-cbd6-2321-e1db-164817c8af22.png)

## 総評

`filter`オプションを利用せずに`query`で全件チェックをしているため。
Snapshotが大量にある環境では時間がかかるかと思いますが、特定のタグが登録されていないといった切り口で情報を一覧で出力できるのは便利です。
もう光源は何処！？と悩まなくも良い！？「自動陰影」機能登場！！


最近、何かと話題になる「AI」のうち、今回はイラストに関係する「AI」
CLIP STUDIO PAINTの「**自動陰影**」機能についてご紹介したいと思います。

この自動陰影機能は、「CLIP STUDIO PAINT PRO」「CLIP STUDIO PAINT EX」
どちらのプランでも利用が可能です。
※Ver2にアップデートが必要です。

## ◆イラストを用意します。
![平面丸.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/cba6fd79-2dec-7f19-768f-9fd9d215b793.png)
例として簡単なものを用意しました。
作成する際に、線画と色部分を分けます。
今回は、簡単なイラストですが人物などの場合は、線画フォルダや色部分をフォルダで分けると良いと思います。
※色が多すぎると機能しないため、ベースの色だけ塗りましょう。

## ◆境界を設定します。

線画と色部分を分けて作成したら、線画部分に参照設定をします。
※フォルダの場合も設定可能です。
 ![画像１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/dd0835fd-e9cd-e64d-67a3-0d33ea534d2f.png)
## ◆自動陰影を設定します。
続いて、色部分のレイヤーまたは、フォルダを選択した状態で、
「編集」＞「自動陰影」をクリックします。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/8160afe6-295f-c71b-dac3-f821664cccd6.png)
すると、下記のような画面となります。
![通常階調化した陰影.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/f63d1b75-752c-b8fc-5c61-839be393ee28.png)
様々なプリセットがありますが、上の画像は
「通常」プリセットで「階調化した陰影」が選ばれているため、アニメ等のように
くっきりとした陰影が反映されています。

プリセットなどを弄ることで様々な陰影をつけることができます。
また、青いアイコンを動かすことで、光源の位置を自由に動かすこともできます。
感覚的にできるので、誰でも簡単に操作が可能かと思います。
実際に動かしている様子については、下記の動画をご参照ください。

<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/2zeVA0bbC5M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

![自動陰影適用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/0232d536-e867-808c-7d10-19347638a070.png)
※上記は、プリセット「なし」「滑らかな陰影」を設定しています。

そのまま使うのも悪くないですが、光源の位置によってどのように影がつくかの参考にしたり、さらに手を加えたりという選択肢もあります。
少し楽をするという意味でも、この「自動陰影」機能は有用ではないでしょうか。

試しに上記の画像に手を加えてみました。
![手を加える.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/29de6e8d-a715-715f-a8cf-634f5ef2eb33.png)
昨今、AIイラストについては賛否が分かれておりますが、AIを上手く利用してみるのも良いのではないでしょうか。
PHPでのシングルアロー演算子（->）を完全に理解した

# オブジェクトから指定したキーの値を取得したい！

ということで、
そんな機会がありました。

```
@foreach ($shopArticles as $shopArticle)
    <p>id: {{ $shopArticle->id }}</p>
    <p>name: {{ $shopArticle->name }}</p>
    <p>comment: {{ $shopArticle->comment }}</p>
    <p>shop_id: {{ $shopArticle->shop_id }}</p><br>
@endforeach
```

こんな感じで値を取得しました。

```
@foreach ($shopArticles as $shopArticle)
    <p>id: {{ $id }}</p>
    <p>name: {{ $name }}</p>
    <p>comment: {{ $comment }}</p>
    <p>shop_id: {{ $shop_id }}</p><br>
@endforeach
```

初めは↑の様に書いておりまして、
値が取れねーんだけど！
と半泣きになっておりました。

# シングルアロー演算子とは

矢印のように見える「->」は、アロー演算子（オブジェクト演算子）と呼ばれています。
PHPのアロー演算子は、主にクラスから生成されたインスタンスで、
プロパティやメソッドにアクセスする場合に用いられます。
参考：https://webukatu.com/wordpress/blog/39841/#-gt


今回の場合は、
配列の各要素がオブジェクトとなっていたので、
そのオブジェクトごとにforeachで取得していきたかったということです。

```
<p>id: {{ $shopArticle->id }}</p>
オブジェクトshopArticleのプロパティのうち、
キーがidの値を取得する。
```

こんな感じの理解でどうでしょう。


# まとめ
```
{{ $object->key }}
keyに対応した値（value）を取得できるのだ！
```
多分超基礎だけど我流で勉強しているとすっ飛ばしているところが出てきちゃうのじゃ。
実務で使うことになると半泣きになりながら習得できるから、
なんだかんだ強制力って大事。

ストレスは溜めすぎず、緩めすぎず。

```
張り詰めた弓の震える弦よ。
月の光にざわめくおまえの心。

もののけ姫 より
```

張り詰めすぎて弦が切れない様に。
ということで、

おわり
Javaのパターンの記述について学習してみた

# 概要
Javaのパターンの記述について学習してみました。以下のページを参考にしました。

パターンの記述

文字クラスを使って色々な文字にマッチするパターンを記述する

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

文字列の先頭や末尾などの位置にマッチするパターンを記述する

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

最長一致数量子、最短一致数量子、強欲な数量子の違い

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

直前の文字を繰り返す文字列にマッチするパターンを記述する

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

複数の文字列のいずれかにマッチするパターンを記述する

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

正規表現グループを設定してパターンの一部にマッチした文字列を取得する

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

名前付き正規表現グループの使い方

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

先読みと後読みを使ったパターンの記述

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

# まとめ
何かの役に立てばと。
右クリックでファイルパスからフォルダを開くOutlookアドイン

## はじめに

その昔に新人時代の導入研修で作成したOutlookアドインが今でもちょこちょこ社内で使われているみたいで、謎に好評なようなので公開します。

（私が先日、Microsoft 365 Apps for enterpriseに更新しまして、その環境でも問題なく動作できています。）

## 概要

- 解消できる困りごと
  - Outlook標準のリンクに対するメニューだとファイルの実行はできるが、そのファイルがあるフォルダを開きたいことが結構ある。
  - ファイルパス中にスペースなどがあってリンクが切れて開けなくなってる。

- 機能
  - Outlookのメール文章中に存在するファイルパスを右クリックメニューから、そのファイルが直下に格納されている親フォルダを開くことができる。 
  - ハイパーリンクが途中で切れてしまったフォルダおよびファイルでも範囲選択したパスに対し、フォルダおよびファイルを開くことができる。

## 導入方法

以下でダウンロードしてsetup.exeを実行してください。

https://github.com/yus-sasaki/OutlookAddIn_FolderOpen#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95


## できること

* ファイルパスから、そのファイルが格納されているフォルダを開くことができる。
* ハイパーリンクが途中で切れてしまったパスであっても、ファイルやフォルダ開くことができる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062357/572f0853-0284-a47b-4b06-bbec9cba8894.png)

## おわり

新人の頃に作ったにしてはソースコードも意外にキレイだし、普通に便利なので
よく頑張ってたんだな昔の自分って感じ。