OmniAICreator/Qiita-1.07M huggingface dataset:
Slackでアプリケーションを作成し、OAuth Tokenを発行するまで

# 目標
SlackのAPIを使用してワークスペース内の特定のスレッドに投稿できるようにセットアップする

# 手順
## 1. Slackにサインインする
https://api.slack.com/apps/
「sign in to your Slack account」をクリックする
![スクリーンショット 2023-03-24 9.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/56244e9d-a03e-dbc2-fabd-87529b8b193e.png)

そうするとSlackのログインフローが始まるので、最後に、連携したいWorkspaceに参加する

## 2. アプリを作成する
「Create New App」をクリックする
![スクリーンショット 2023-03-24 10.10.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/c2689ede-612a-2289-2b62-9d2ea3015be6.png)

「From scratch」をクリックする
![スクリーンショット 2023-03-24 10.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/e506e7b5-02d4-518b-56db-2191bae441be.png)

アプリケーション名・連携するワークスペースを選択後、「Create App」クリックする
![スクリーンショット 2023-03-24 10.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/e94cb459-7b92-99ca-38ae-6b39d37ac20d.png)

作成が完了すると、左上の赤枠のように、作成したアプリ名が表示されます
![スクリーンショット 2023-03-24 10.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/1fba20e5-e456-f17a-696f-c80b16fda221.png)

## 3. 作成したアプリの設定を行う
「Add features and functionality」内の「Permissions」をクリックする
![スクリーンショット 2023-03-24 10.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/4c747d5a-7cd1-9af5-8cf6-cecefa6f56c7.png)

「Scopes」セクションに移動し、「Add an OAuth Scope」をクリックする
![スクリーンショット 2023-03-24 10.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/5d22bfd3-f425-6f22-af83-4ff771bb394b.png)

「chat:write」を選択する
![スクリーンショット 2023-03-24 10.37.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/f6987608-1ee7-a0c3-4809-a1282d122b5c.png)

選択したらこのように表示されれば設定は完了です
![スクリーンショット 2023-03-24 10.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/cbb93e5a-ee3e-61d4-7636-a50f02c73590.png)

## 4. OAuth Tokenを取得する
「OAuth & Permissions」の「OAuth Tokens for Your Workspace」項目まで移動し、「Install to Workspace」をクリック
![スクリーンショット 2023-03-24 10.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/d8db50b0-3ecc-ba55-1411-f2467138ce63.png)

そうすると、権限リクエストの画面が出てくるので、このアプリの権限を許可してください

その後、設定画面に戻るので、以下のようにトークンが発行されているか確認してください
![スクリーンショット 2023-03-24 10.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123957/7fb98daf-8ec6-6400-06a4-e0f53cd1f368.png)

これでSlackのAPIを使用してワークスペースにメッセージを投稿する準備が完了しました

# おわりに
お疲れ様でした
次回はGoogle Apps ScriptとSlackワークスペースを連携して、
アプリの審査状況を監視できるようにしたいと思います

次の記事
Gmail + Google Apps Script + Slack APIを連携して、アプリストアからの通知メールを監視する

https://qiita.com/kobayashi_ryo/items/a76faed0af26f42ddfb0
Arduino IDE 2.0.4にバージョンアップしてみた

# バージョンアップ内容
1.8.2.0 → 2.0.4
# 背景
自分はこれまで ATmegaで MPLAB X IDE 5.5をメインと使っていました。
といっても、コーディングはVSCodeを使ってます。ソースコードがデカくなっていくと断然便利！
最近になって STM32やESP32、そして今後 M5Stack等も使ってみたいなと思っておりArduino環境を整え様と思っておりました。
Arduino UNOや Arduino Megaも持っていますが MPLAB X IDEで Atmel-ICEで使っていたくらいです(^_^;)
Arduino IDEってAVRを使ったArduinoUNO等だけではなく、STM32のNucleo、ESP32やM5Stack等、多くのデバイスに対応できているのは便利ですね。
同じソース（スケッチですね）をもとに、デバイスの変更、移行にも便利そうと思っています。
今のところメインに使いそうなターゲットは ESP32になりそうですけどね
インストール方法、基本設定は他の方による投稿が色々ありそうなので割愛します。
すぐに使うのが ESP32-DevKitC-32E なので追加ボードマネージャーに以下のURLを追加しました。

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

# 結果と感想
旧バージョンででESP32のボード登録していたせいなのか、リストにESP32 DEV Moduleがありました。
昔からC言語等のインデントは４文字分でしたので、Arduino IDEのインデント２文字は未だに慣れません😔
配色はダークにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/4ec2b7e9-c32c-22f2-72fc-c7b9d6af644c.png)


シリアルモニタが別ウィンドウにならないのは良いですね。
なんか「デバッグの開始」というアイコンがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/a201b92f-358f-8dc7-36f1-d7e0070ce432.png)
クリックしたら

GDB executable "C:\Users\＃＃＃\AppData\Local\Arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-97-gc752ad5-5.2.0\bin\arm-none-eabi-gdb.exe" was not found. Please configure "cortex-debug.armToolchainPath" or "cortex-debug.gdbPath" correctly.

というエラーが出力されました。追々調べていきたいと思います。
あとシリアルプロッタというのが右上にあったのでクリック
ん～、なんだかわからない。これも追々調べていきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/07db9025-d25c-429d-f83d-202c527ce0a4.png)

シリアルモニタにタイムスタンプが付けられます！
実行速度計測に使えそうですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118608/94e291bb-0180-91af-26b0-968f41afd4af.png)

# 結論
とりあえず、ESP32のコンパイル、書き込み、シリアルモニタはバージョンアップ前と同様に使えました。
ちょっとだけ VSCodeに近づいたかなという印象です。
（あくまで個人的感想です）
【AWS】Amazon RDSのバックアップと復元

# Amazon RDSのバックアップと復元方法

### 自動バックアップ
自動バックアップはデフォルトで有効になっており、Amazon S3に作成され、
指定した期間、安全に保存される。

バックアップされるのは、「データベース」と「トランザクションログ」。

DBインスタンスのストレージボリュームのスナップショットも自動的に作成されるため、
DBインスタンス全体をバックアップする。

### ポイントインタイムの復元
バックアップの保持期間中にDBインスタンスを復元することで、新しいDBインスタンスが作成できる。
操作は、AWSコンソールかコマンドラインインターフェイスを使用。

DBインスタンスの復元可能な直近の時間は、通常5分以内。
復元可能な直近の時間を調べるには、AWSコンソールのDBインスタンスの[LatestRestorableTime] フィールドに返される値を参照。

### データベースのスナップショット
データベースのスナップショット　＝　Amazon S3に保存されているインスタンスの、ユーザーが開始したバックアップ
削除しない限り保持される。

必要があればデータベーススナップショットから新しいインスタンスを作成することもできる。
課金は、追加のストレージ使用分に対してのみ課金される。

# スナップショットのコピー
DBスナップショットと、DBクラスタースナップショットをコピーできる。
自動も手動も可能。
同じAWSリージョン内、AWSリージョン間、AWSアカウント間でもスナップショットのコピーが可能。

# スナップショットの共有
手動DBスナップショットもDBクラスタースナップショットも、他のAWSアカウントと共有することができる。
暗号化の有無に関わらず、権限のあるAWSアカウントがスナップショットをコピーできるようになる。

暗号化されていない手動スナップショットを共有した場合、
スナップショットからDBインスタンスを直接復元できるようになる。
この操作は、暗号化されている手動DBスナップショットではできない。

手動DBクラスタースナップショットを共有した場合、
暗号化の有無に関わらず、スナップショットのDBクラスターを直接復元できるようになる。
【React】react-routerを使った画面遷移

## react-routerを使った画面遷移を行う
今回はReact Router v6を使った画面遷移です。
v5とは書き方が変更されているようです。

* メインの画面
```typescript:App.tsx
import "./styles/App.scss";
import { Route, Routes } from "react-router";
import { Home, About } from "-------";

function App() {
  return (
    <div className="app">
      <Routes>
        <Route
          path={`/home`}
          element={<Home />}
        ></Route>
        <Route
          path={`/about`}
          element={<About />}
        ></Route>
      </Routes>
    </div>
  );
}

export default App;
```
まず画面遷移を行いたい、コンポーネントを囲む`<Routes></Routes>`を書きます。
その中に`<Route></Route>`で画面遷移を行います。
`path`と`element`があり、`path`は画面遷移したときのパスを設定、`element`は画面遷移したときに表示するコンポーネントを指定します。

* コンポーネント
```typescript:home.tsx
export const Home = () => {
  return <h1>Home</h1>;
};
```

```typescript:about.tsx
export const About = () => {
  return <h1>About</h1>;
};
```
【TypeScript】interfaceとtypeの違い メモ

## interfaceとtypeの違いとは？
`interface`と`type`は両方とも型の定義に使用されますが、それぞれ異なる目的で使用されます。

### interface
`interface`は主にオブジェクトの形状を定義するために使用されます。
例としてPersonオブジェクトを定義してみます。
```typescript
interface Person {
  name: string;
  age: number;
  address?: string;
}
```
Personオブジェクトには`name`,`age`,`address`プロパティが存在します。
使用する際は以下の様にできます。
```typescript
const yamada: Person = {
  name: "yamda";
  age: 20;
  address?: "tokyo";
}
```

### type
`type`は主に特定の方を再利用するために使用されます。
例としてAgeという方を定義してみます。
```typescript
type Age = number;
```

例えば以下のような関数がある場合、コードの可読性が向上します。
また、変更を加えやすくなります。
```typescript
function calculateBirthYear(currentYear: number, age: Age) {
  return currentYear - age;
}
```
`age`は`number`でなければなりませんが、`Age`型を使うことで変数名や関数名の意図を明確にすることができます。

サバイバルTypeScriptの同様の記事はこちら↓
https://typescriptbook.jp/reference/object-oriented/interface/interface-vs-type-alias
VirtualBox や VMware Workstation Player 環境下の FreeBSD で syslogd を汚す devd を大人しくさせる

# ニッチな対象範囲
フィジカルのサーバやワークステーションじゃと、あまり表舞台には出てこん事例じゃが、ワシの知っちょう仮想サーバで、以下のログが結構ウザ目に記録されて、本来見たいメッセージを斜め読みし難いけん、喋っちょう devd 君に quiet して貰う。

```text:syslogの一部
Mar 24 09:35:01 VMWareHOST devd[1254]: Processing event '!system=CAM subsystem=periph type=error device=cd0 serial="" cam_status="0xcc" scsi_status=2 scsi_sense="70 02 3a 00" CDB="00 00 00 00 00 00 " '
Mar 24 09:35:01 VMWareHOST devd[1254]: Pushing table
Mar 24 09:35:01 VMWareHOST devd[1254]: Processing notify event
Mar 24 09:35:01 VMWareHOST devd[1254]: Popping table
```
メッセージの内容は cd0 に cam コマンド送ったけど、エラーで返事しおるよーっていう内容が devd 君から吐き出される。

# adhoc 的対処法

以下のワンライナーを、wheel グループで実行。

```sh
sysrc devd_flags=-q ; service devd restart
```
やっちょう事は devd の起動フラグに `-q' を付けちゃるダケなんじゃが、チョイチョイ忘れよるけん、ワシの忘備録として書いておく。
Talend Open Studio for Mac M2 chip インストール手順エラー回避

Talend を使い始めるときにつまづいた箇所を残します。

環境：Macbook Pro (M2)
OS: Ventura 13.2.1
SW:Talend Open Studio 8.0.1

ダメだった方法
　標準手順　＞Talend ホームページよりフリーダウンロードのフォームで登録。

Mac Dmgのインストーラーは手に入るが、インストールウィザードが表示されず。
具体的には、SETUPのWindowが表示されるが内容は真っ黒ですすめない。
→完了せず。

OKだった手順
Zip圧縮版のTalend8.0.1を手にいれる。
Talend　For Big Data

https://sourceforge.net/projects/talend-bigdata/files/Talend%20Open%20Studio%20for%20Big%20Data/8.0.1/?utm_medium=help&utm_source=help_content
こちらからダウンロード可能

方法　以下のようなzipファイルを選択、カッコの中身は、最新化されると変わる可能性あり
**TOS_BD-（20211109_1610）-V8.0.1.zip**

これを解凍すると、以下の全てが実行ファイルが入っている

　-Linux版
　-Windows版
　-Mac版

Mac m2は、 _TOS_BD-macosx-cocoa-aarch64_ を選択するが、事前に下記のコマンドを実行する必要がある。

:::note warn
警告
事前に下記のコマンドを実行する必要がある。
セキュリティ対策で実行を停められる。
:::

```code:terminalで実行する
cd <studio_dir>
xattr -d com.apple.quarantine
For　ex.
xattr -d com.apple.quarantine TOS_BD-macosx-cocoa-aarch64.app
```

これで、起動画面か、ライセンス承諾画面にすすめばOK
![スクリーンショット 2023-03-24 9.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16552/324afcdf-9deb-854a-341c-dd003d08b8bc.png)

最後に日本語版でBugありとのこと
こちらの記事を参考に、英語に変えるとエラー回避。
https://www.reichelblog.com/talend-error/
画面の変更が反映されない

[UI関係のトラブルに戻る](https://qiita.com/Keiji_otsubo/items/cc344223cfa02db6bed7)



動的フォームの設定が優先しているかもしれません。

+ [Trouble with viewing Contact Record in NPSP](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000O8vDK)
VMCのストレージ事情 vSAN vs FSxN vs Flex

# はじめに
VMware Cloud on AWS(以降VMC)はvSAN構成であるためストレージだけを増やすことはできませんでした。もちろんゲストOSからNASを利用することはできたのですが、仮想マシンのバックエンドストレージとして使えるのは内蔵SSDのみでした。しかし、[VMware Explore 2022](https://blogs.vmware.com/vmware-japan/2022/09/vmc-explore-2022.html)にて２つの方法が発表されました。
Amazon FSx for NetApp ONTAP(2022年9月より)を使う方法とVMware Cloud Flex Storage(2023年2月より)を使う方法です。この記事ではそれぞれの特徴と使いどころを検討していきたいと思います。

# Amazon FSx for NetApp ONTAP(FSxN) v.s. VMware Cloud Flex Storage(Flex)
|            |ローカル|FSxN|Flex|
|:-----------|:-----------:|:-----------:|:------------:|
|マウント方法|vSAN|NFS|NFS|
|最小容量    |20.74GiB(※1)|1TiB|25TiB|
|最大容量    |14.3PiB(※2)|3PiB(※3)|400TiB|
|容量課金(25TiB/月で比較)    |$18,254/month(※4)|$2,183.21/25TiB-month(※５)|$4,485.12/25TiB-month(※６)|
|通信課金    |なし|$1,491/month(※７)|なし|
|応答速度    |高|低(※７)|中|
|転送速度    |高|中|中|
|最大IOPS    |高(※８)|低(80k)|中(300k)|
|重複排除    |可|可|可|
|圧縮    |可|可|可|
|暗号化|可|可|可|
| その他      |ストレージを足すにはホストを足すしかない|接続にはVMware Managed Transit Gatewayが必要|アサイン量ではなく使用量に対して課金|

※上記情報は 2023/3/23時点の東京リージョン利用時の情報であり最新の情報はAWS、VMware社のWEBをご参照ください。
※１ i3 10.37GiB x 2(最小台数) = 20.74GiB(冗長化、管理領域考慮せず)
※２ SDDCあたりi3en 45.84TiB x 16台(最大クラスタ台数) x 20(最大クラスタ数) = 約14.3PiB(冗長化、管理領域考慮せず)
※３ 高速アクセスのためのSSDは192TiBまでなのであまり容量を増やすと速度が落ちます。
※４ i3(10.37GiB) ＄6,084/month x 3台 = $18,254/month (i3はもうすぐ廃止される予定です)
※５ FSxNの料金計算はSSDの割合、スループット、IOPSアサイン等で変わり複雑なため25TB分をカリキュレータで計算したサンプルを以下に記載します。（25TiB/SSD 20% シングルAZ 重複排除効果考慮せず、1000IOPS、1024MBps)
　　https://calculator.aws/#/estimate?id=9b06a828c85e1be5d0bb7e6d600a5be117ddafb9
※６ オンデマンド料金 ＄179.40480/TiB-month x 25TiBで $4,485.12/month
※７ FSxとVMCを繋ぐためにはVMware Managed Transit Gatewayを通す必要があり通信課金があります。また、ネットワーク的に遠いためFlexよりは応答性が落ちます。通信課金は時間課金 ＄0.07/アタッチメント-hと通信課金 ＄0.02/GB-hが掛かります。VMCとFSxNを接続するのでアタッチメントは２、月に72TB通信したとすると、時間課金 0.07 x 2 * 24 * 30.4 = 51.072、通信課金 0.02 * 72,000 = 1,440、計 $1,491/month
※８ 公表値はありませんが、オールNVMe SSDでのvSANなので相当速いです。

# まとめ
価格はvSAN > Flex > FSxN です。ただし、FSxNは通信課金やスループット、IOPS課金があるのでヘビーユースには向かないです。一番速いのは何と言ってもvSANです。

上記を考慮すると、以下の様なユースケースが合ってるかと思います。

【vSAN】
・本番機（高いディスク性能が必要）
・とにかく速度が欲しい。
・CPU、メモリ、ストレージのバランスがVMC構成にマッチしている(外部ストレージを使う必要がない)

【FSxN】
・検証機（常時稼働しない）
・いつも稼働している訳ではないがいつでも使えるように仮想マシンを残しておきたい。性能は求めない。

【Flex】
・本番機＆検証機（そこそこ性能を必要とする）
・VMCホストのCPU、メモリ、ストレージバランスだとストレージが不足する。
・常時稼働でそれなりに性能を要求する。

# おまけ
どうしても仮想マシンからはローカルディスクとして見せたいならば上記のようにESXiのデータストアとして構成する必要がありますが、別にゲストOSからNFSやSMBマウントでもいいのであれば、積極的にFSxNをNASとして利用することをお勧めします。FSxNは元々NASとして設計されているので、マルチユーザ、マルチアクセス、マルチプロトコルでのアクセスが可能です。複数のサーバで使う場合むしろマルチアクセスできた方が嬉しいことも多いと思います。

# 参考サイト
[Amazon FSx for NetApp ONTAP を VMware Cloud on AWS のデータストアとしてサポート](https://blogs.vmware.com/vmware-japan/2022/10/vmc-fsxn.html)
[VMware Cloud Flex Storage とは](https://blogs.vmware.com/vmware-japan/2023/02/vmc-flexstorage.html)
[VMware Cloud on AWS上の仮想マシンでのFSx for NetApp ONTAP利用](https://aws.amazon.com/jp/blogs/news/amazon-fsx-for-netapp-ontap-with-vmware-cloud-on-aws-virtual-machines/)
ガラス体積計の不確かさに対処するライブラリ(Json編)(1)

# ガラス体積計と不確かさの取り扱い
## 現状と対策
JIS R 3505に対応したJSONはメスフラスコ、ホールピペット、メスピペット、ビュレット、メスシリンダー、乳脂計と一通り対応しました。さて、ここでこのライブラリの本質について見つめなおします。ガラス体積計というのは正確な体積を量り取る器具です。その器具が使用された後はX±.00Ymlという性質は残りますがガラス体積計そのものは残りません。
ということは私がやるべきことは 
- JISを反映したJSON
- 不確かさ付き値を返すクラス

の二つに絞られます。0節は既に実行済みです。1節への対処方法はquantitiesというライブラリが既に存在します。またC#でもUnit.Netという似たようなライブラリが存在しています。きっと同じ方法が通じるでしょう。
``` AGlassWare.py
import quantities as pq


class AGlassware(BaseClass):
    @property
    def value(self) -> pq.UncertainQuantity:
        return pq.uncertainquantity(params)
    
    @abstractmethod
    def __func__(self, other) -> pq.UncertainQuantity:
        return self.value().__func__(other)
```
というコードを書けばいいことになります。
此処でやっていることはガラス器具の性質を反映した不確かさ付き値を返すメソッドの定義
Pythonの +.-.*./へと不確かさ付き値を返すメソッドの定義の二つです。
このライブラリの本質はquantitiesというライブラリにずいぶんとお任せしていることになります。これを移譲 Delegate といいます。
もうひとつしておくことがあります。Pythonには整数割り算(//)と割り算の二つがあります。そこで整数割り算をSyntaxErrorで機能停止させておきます。
``` KFD.py
    def __floordiv__(self, other) -> None:
        raise SyntaxError('Volumetric Glassware library is to discuss uncertainty. No Turn for floor division.')
```
## 要約
このライブラリの真髄はガラス器具の不確かさ付き値を返すことです。
ですので計算メソッドを呼び出した場合には不確かさ付き値を返して消滅します。
さて次回は、JSONデータをメソッドで返すクラスを実装しましょう。
これを実装すればPython上におけるガラス器具もずいぶん使いやすくなるはずです。
以上です。

### 失敗
データと処理を分離することを考えてJSONとPython混合ライブラリにしましたがQuantitiesやMendeleevなどの参考にすべきライブラリは全てをPythonに仕舞っています。これは間違えたかもしれません。
Power Automate の実行履歴でトリガー結果の詳細を確認する方法


そういえば Power Automate の実行履歴画面でトリガーの実行結果から一覧表示が編集できるのを案内してなかったな、と気づいた やまさん です、ども（汗
シレっと、前回 Automate の紹介記事でも全く説明せずに画像出してました。

https://qiita.com/yamad365/items/ed8f37dff2a809487ada

3/18（土） に 気ままに勉強会 #49 で登壇している最中に気づきましたｗ

https://kimamani.connpass.com/event/274882/

と、いうことで Power Automate の実行履歴でトリガー結果の情報を一覧表示する方法のネタです。

# Power Automate 実行履歴 に列を追加する
さて、本題です。

## 説明で利用するトリガー
冒頭でも紹介した記事で利用している『イベントが追加、更新、または削除されたとき (V3)』（CalendarGetOnChangedItemsV3）トリガーで説明を続けます。

https://learn.microsoft.com/ja-jp/connectors/office365/?WT.mc_id=BA-MVP-5004053#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%80%81%E6%9B%B4%E6%96%B0%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AF%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D-(v3)

## 初期状態
記事投稿時点（2023年3月）のフロー実行履歴は初期だと下記のイメージになります。

![01-デフォルト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/d7ef2ecc-9f97-441d-f528-716a8d8d1d75.png)

初期状態の実行履歴一覧に表示される列は［開始］、［時間］（実行に要した時間）、［状況］（成功や失敗など）のみです。ここにトリガーの実行結果が追加できるようになったんですよ。

## 実行履歴に列を追加する方法
では、実際にフローのトリガー実行結果を一覧へ追加してみましょう。

1．フローの実行履歴にある［列を編集する］をクリックします。
![02-列を編集する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/8a0fe814-ab64-8f62-24ae-e60df8ec18b9.png)

2．右ペインにフローの実行結果から選択肢が表示されます
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/ab2357be-a3be-ec94-cfb3-a58f48dbca7d.png)


そこから実行履歴の一覧に表示させたいプロパティを選択して［保存］をクリックします。ちなみに、右ペインで選択した順番で一覧へ表示されます。上図だと［id］と［ActionType］の順に選んでいるので、その順番になっています。並び順が気に入らない場合は選択する順番に気を付けて操作してください。


ちなみに・・・最初に表示されている［時間］＝［duration］である、というが［列を編集する］をクリックするコトで把握できるようになりましたね。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/ef2b69e7-4a00-2481-32eb-bee10b230e9e.png)

## ［すべての実行］にした場合
フローの実行履歴を［すべての実行］にした場合は・・・
![05-すべての実行履歴.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b1192d50-c114-97e0-d092-3967e870b422.png)

［列を追加する］に変わります。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/34684327-7376-2fc0-4de4-54f3581dee71.png)
すべての実行結果が表示された画面のほうが、横幅が広く取れます。この前の画面ですと、2つぐらいしか見えない感じですね。

# 結び
今回紹介した機能が装備される前は、フローのトリガー実行結果で「どんな値が取得できているか？」を 1 つずつ詳細を開いて確認する必要がありました。それが、このアップデートのおかげで一覧で表示できるようになったのでメッチャ便利です。

例えば、今回の例で利用したトリガーであれば「この実行結果は削除（deleted）の時なんだな」というのが詳細画面を開かずに把握できます。何か意図しない結果になった場合などの調査で”あたり”をつけるコトが容易に実施できるようになりました。ホントに便利なので利用しまくってます。

それでは皆さま、素晴らしい Power Platform Life を！！
ChatGPTでKareteのテストスクリプトを作成してみる

# はじめに
最近、OpenAIのChatGPTを使って、開発を効率化できないか、いろいろと検証をしています。
Karateは、テストスクリプトの内容が、構造化されており、シンプルな内容で記述できるので、
ChatGPTとの相性も良いのではないか、と思って試してみました。

※Karateは、Cucumberと同様のBDD（ビヘイビア駆動開発）を行うためのテストフレームワークであり、Gherkinの文法を自然言語に近い形で記述できるユニットテストツールです。
※Karateについては、以下を参照してください。

- [APIテスト自動化ツール「Karate」のまとめ](https://qiita.com/takanorig/items/46098b066f1216e3ca89)


# ChatGPTでのKarateプロンプト定義
早速、Karateのテストの内容を想定して、自然言語でテストを書いてみます。

```
あなたは、Test Automation Tool の Karate を利用するテストエキスパートです。
Karateで、以下を行うテストシナリオを生成してください。

# Given
- HTTPリクエストを送信する。
- BodyはJSON形式とする。

# When
- POSTで送信する。

# Then
- HTTPステータス200であること。
- レスポンスに、データが10件あること。
- レスポンスで、ID = 100 のデータが含まれること。
```

# ChatGPTでの出力結果
ChatGPT（GPT-4）を使って、先の内容を問い合わせてみました。

![karate-chatgpt01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/777a34f7-7b6b-6eac-7fcf-57d22fabd68f.jpeg)

出力結果は、思ったよりも精度が良いです！
キチンとKarate記法を理解してくれています。
また、プロンプトでは記載していない、URLやJSONリクエストの内容なども、補完してくれています。

これは、自動テストの夢が広がりますね！


また、出力結果が読みにくいため、インデントをお願いしてみたところ、
ちゃんと、Given／When／Thenの構成を踏まえて、インデントもしてくれました。

![karate-chatgpt02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/22dada51-1457-3eb6-8644-9694e273d21d.jpeg)


# まとめ

KarateとChatGPTは、相性が良さそうです。
このぐらいの精度で出力ができるなら、シナリオテストの内容を書いたテストドキュメントから、
Karateのテストスクリプトも、十分に自動生成できそうです。
Unity Editorの拡張 Vector3の座標番号をシーンから確認できるようにする 2/3

# 概要
前回の続きです。
今回は点を識別するためにシーン上にテキストを表示します。下画像参照

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/35a36e14-aa48-e795-7688-c26245c65649.png)



# 開発環境
IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# コード

```diff_c_sharp:Waypoint.cs

// 座標を定義しているクラス、オブジェクトにアタッチする
public class Waypoint : MonoBehaviour
{
    // Start is called before the first frame update
    [SerializeField] private Vector3[] points;
    public Vector3[] Points => points;
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```

```diff_c_sharp:WaypointEditor.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

[CustomEditor(typeof(Waypoint))]
public class WaypointEditor : Editor
{
    private Waypoint Waypoint => target as Waypoint;
    private void OnSceneGUI()
    {
        
        Handles.color = Color.red;
        for (int i = 0; i < Waypoint.Points.Length; i++)
        {
            EditorGUI.BeginChangeCheck();
            
            // シーンのGUI上の座標
            // 例えば、Waypoint.Point[i]= new Vector3(0,0,0)だとすると、点が原点に密集し変更できない
            Vector3 currentWaypointPoint = Waypoint.Points[i];
            Vector3 newWaypointPoint = Handles.FreeMoveHandle(currentWaypointPoint,
                Quaternion.identity, 0.7f,new Vector3(0.3f,0.3f, 0.3f), Handles.SphereHandleCap);
            
            // テキストの作成           
+            GUIStyle textStyle = new GUIStyle();
+            textStyle.fontStyle = FontStyle.Bold;
+            textStyle.fontSize = 16;
+            textStyle.normal.textColor = Color.yellow;           
+            Handles.Label(Waypoint.Points[i], $"{i + 1}", textStyle);

            if (EditorGUI.EndChangeCheck())
            {
                // インスペクター上のベクトルの座標
                Waypoint.Points[i] = newWaypointPoint;
            }
        }
    }
}

```


# 参考
https://docs.unity3d.com/ja/2021.2/ScriptReference/GUIStyle.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8e48c90b-b371-80cc-6366-1039fd4b3f98.png)




https://docs.unity3d.com/ja/2021.1/ScriptReference/Handles.Label.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3567390c-f75d-5fbe-dd58-ecfbb6c8677d.png)

githubコミット分

https://github.com/RYA234/2DTowerDeffenceMyLearning/commit/33606bdaa0de2f0fe5408f5b12c428b42004614c
お母さんでもわかるJavaScript「オブジェクト、map、filter」

## オブジェクトの省略
```index.js
const name = "清水";
const age = 24;

const user = {
    name:name,
    age:age,
};

//下記のように省略できる
const user{
    name,
    age,
};
```
## mapについて
関数内に実行したい処理を書いておくことで、配列の各要素に対して好きな操作をし、その結果を新しい配列として返すことが出来る。
```index.js
const arr2 = ["１です", "２です", "３です"];

//引数に配列の値が設定されます
const arr4 = arr2.map((arr) => {
  console.log(arr);//１です ２です ３です
});


const arr4 = arr2.map((arr) => {
  return arr;
});
console.log(arr4);//['１です', '２です', '３です']


//if文も使えるよ
const name = ["清水", "伊藤", "金子"];
const newNum = name.map((name) => {
  if (name === "清水") {
    return name;
  } else {
    return `${name}さん`;
  }
});
console.log(newNum);//['清水', '伊藤さん', '金子さん']
```
上記の結果を見るに、`arr`自体はただのループ処理で、`return`で返した`arr4`は新しい配列になる。

## filter
使い方はmapと変わりないが、条件に合う値のみを返却することができる。
```index.js
const num = [1, 2, 3, 4, 5, 6];
const oddNum = num.filter((num) => {
  return num % 2 === 1;
});
console.log(oddNum);//[1,3,5]
```
wemosでalexaデバイス その5

# 概要
wemos d1で、alexaデバイスを作ってみる。
練習問題、やってみた。

# 練習問題
upnpのm-searchを実装せよ。

# サンプルコード

```
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

const char * ssid = "****";
const char * password = "****";
static WiFiUDP udp;

void setup() {
	Serial.begin(115200);
	delay(100);
	boolean state = true;
	int i = 0;
	WiFi.mode(WIFI_STA);
	WiFi.begin(ssid, password);
	Serial.println("");
	Serial.println("Connecting to WiFi");
	Serial.print("Connecting ...");
	while (WiFi.status() != WL_CONNECTED)
	{
		delay(500);
		Serial.print(".");
		if (i > 10)
		{
			state = false;
			break;
		}
		i++;
	}
	if (state)
	{
		Serial.println("");
		Serial.print("Connected to ");
		Serial.println(ssid);
		Serial.print("IP address: ");
		Serial.println(WiFi.localIP());
	}
	else
	{
		Serial.println("");
		Serial.println("Connection failed.");
	}
	udp.begin(1900);
	Serial.println("Sending M-SEARCH multicast");
	udp.beginPacketMulticast(IPAddress(239, 255, 255, 250), 1900, WiFi.localIP());
	udp.write("M-SEARCH * HTTP/1.1\r\n"
		"HOST: 239.255.255.250:1900\r\n"
		"MX: 5\r\n"
		"MAN: \"ssdp:discover\"\r\n"
		"ST: upnp:rootdevice\r\n\r\n\r\n");
	udp.endPacket();
}
void loop() {
	IPAddress sonosIP;
	unsigned long lastSearch = millis();
	while ((millis() - lastSearch) < 5000)
	{
		int packetSize = udp.parsePacket();
		if (packetSize)
		{
			char packetBuffer[255];
			Serial.print("Received packet of size ");
			Serial.println(packetSize);
			Serial.print("From ");
			sonosIP = udp.remoteIP();
			Serial.print(sonosIP);
			Serial.print(", port ");
			Serial.println(udp.remotePort());
			int len = udp.read(packetBuffer, 255);
			if (len > 0)
			{
				packetBuffer[len] = 0;
			}
			Serial.println("Contents:");
			Serial.println(packetBuffer);
		}
		delay(50);
		Serial.print(".");
	}
	Serial.println("ok");
}







```

以上。
wemosでalexaデバイス その4

# 概要
wemos d1で、alexaデバイスを作ってみる。
練習問題、やってみた。

# 練習問題
udpで、ブロードキャストで、ポート49153番に、helloを送信せよ。

# サンプルコード

```
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

const char * ssid = "****";
const char * pass = "****";
static WiFiUDP udp;
#define LOCAL_PORT 		0xC000
#define REMOTE_PORT 	0xC001
IPAddress broadcastIP(239, 255, 255, 250);

void setup() {
	Serial.begin(115200);
	Serial.println("start");
	WiFi.begin(ssid, pass);
	while (WiFi.status() != WL_CONNECTED)
	{
		delay(500);
	}
	udp.begin(LOCAL_PORT);
}
void loop() {
	udp.beginPacketMulticast(broadcastIP, LOCAL_PORT, WiFi.localIP());
	udp.write("hello");
	udp.endPacket();
	delay(3000);
	Serial.print(".");
}




```

以上。
wemosでalexaデバイス その3

# 概要
wemos d1で、alexaデバイスを作ってみる。
練習問題、やってみた。

# 練習問題
udpで、IPアドレス192, 168, 0, 100の、ポート49153番に、helloを送信せよ。

# サンプルコード

```
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

const char * ssid = "****";
const char * pass = "****";
static WiFiUDP udp;
#define LOCAL_PORT 		0xC000
#define REMOTE_PORT 	0xC001
IPAddress remoteIP(192, 168, 0, 100);

void setup() {
	Serial.begin(115200);
	Serial.println("start");
	WiFi.begin(ssid, pass);
	while (WiFi.status() != WL_CONNECTED)
	{
		delay(500);
	}
	udp.begin(LOCAL_PORT);
}
void loop() {
	udp.beginPacket(remoteIP, REMOTE_PORT);
	udp.write("hello");
	udp.endPacket();
	delay(3000);
	Serial.print(".");
}


```

以上。
【SwiftUI】Swiftのコードをシンタックスハイライトで表示する方法

# はじめに
検索できるChatGPT「ThinkMate」でシンタックスハイライトに対応しました。
今回は、そこで使用した技術をご紹介します。

https://twitter.com/shota_appdev/status/1639010531683237888?s=61&t=RjRB_UOGQelSwfCt67gFHg


# 作るもの

以下のようなコードビューアを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366249/a3cf6a24-f27c-4ae0-7559-ec771abcb076.png)

# 準備
Swift Package ManagerでSplashというライブラリをインストールします。

https://github.com/JohnSundell/Splash

# 実装方法
以下は、Swiftのコードをシンタックスハイライトで表示するコードです。

```Swift
import SwiftUI
import Splash

struct ContentView: View {
    let code = """
    import SwiftUI

    struct ContentView: View {
        var body: some View {
            VStack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundColor(.accentColor)
                Text("Hello, world!")
            }
        }
    }
    """

    var body: some View {
        codeView(code)
    }

    private func codeView(_ code: String) -> some View {
        let theme = Theme(
            font: Font(size: 20),
            plainTextColor: UIColor(.primary),
            tokenColors: [
                .keyword: UIColor(.pink),
                .string: UIColor(.orange),
                .type: UIColor(.indigo),
                .call: UIColor(.purple),
                .number: UIColor(.yellow),
                .comment: UIColor.lightGray,
                .property: UIColor(.teal),
                .dotAccess: UIColor(.teal),
                .preprocessing: UIColor.darkGray
            ]
        )

        let highlighter = SyntaxHighlighter(
            format: AttributedStringOutputFormat(theme: theme)
        )

        let attributedString = AttributedString(highlighter.highlight(code))

        return Text(attributedString)
    }
}
```
Splashというライブラリを使ってシンタックスハイライトを実現しました。

ポイントは以下の3点です。
- Themeで色を指定
- SyntaxHighlighterでハイライト
- SyntaxHighlighter.highlightはNSAttributedStringであるため、Textで使えるAttributedStringに変換

# おわり
以上のコードを実行することで、コードビューアができあがります。

---

ご覧いただきありがとうございました。

🐦 [Twitter: @shota_appdev](https://twitter.com/shota_appdev)

📱 [個人アプリ: Symbols Explorer](https://apps.apple.com/jp/app/symbols-explorer/id1612933742)
AWS SageMakerでドメインを作成したときに「'roleDescription' failed to satisfy constraint: Member must satisfy regular expression pattern: [\u0009\u000A\u000D\u0020-\u007E\u00A1-\u00FF]*」と表示されるときの解決方法

# 問題
AWS SageMakerでドメインを作成したときに
> 'roleDescription' failed to satisfy constraint: Member must satisfy regular expression pattern: [\u0009\u000A\u000D\u0020-\u007E\u00A1-\u00FF]*

と表示される。

# 原因
どうやら言語を日本語にしていると起こるようです。
SageMakerがロールを作成しようとするときに、ロールの説明に日本語を入れようとしてエラーになっているようです。

# 解決方法
AWS側で直すのを待つしかないですが、一旦は自分の言語設定を英語にすることでエラーは回避できました。
OSS-DB 学習メモその4【組み込み関数一覧と演算子一覧】

# はじめに
今回は、PostgreSQLの組み込み演算子や演算子についてまとめていきます。

数も多いので表でまとめました。

# 組み込み関数一覧

ますはじめに、多数の組み込み関数が用意されています。
これらの関数を使うことで、データの取得や加工、計算を効率的に行うことができます。
下記に組み込み関数の一覧をまとめていきます。
|関数名|説明|例|
|:-----|:-----|:-----|
|abs|引数の絶対値を返す|abs(-10.5) => 10.5|
|cbrt|引数の立方根を返す|cbrt(27) => 3|
|ceil|引数以上の最小の整数値を返す|ceil(10.1) => 1|
|floor|引数以下の最大の整数値を返す|floor(10.9) => 10|
|round|小数部を四捨五入した値を返す|round(10.4) => 10, round(10.5) => 11|
|exp|引数の自然対数の底(e)の累乗を返す|引数の自然対数の底(e)の累乗を返す|
|ln|引数の自然対数を返す|ln(2.718) => 1|
|log|第一引数を底とする第二引数の対数を返す|log(2,8) => 3|
|mod|第一引数を第二引数で割った余りを返す|mod(10,3) => 1|
|pi|円周率πの値を返す|pi() => 3.141|
|power|第一引数を第二引数で累乗した値を返す|power(2,3) => 8|
|sqrt|引数の平方根を返す|sqrt(16) => 4|
|random|0.0以上1.0未満のランダムな値を返す|random() => 0.458|
|setseed|random関数のシード値を設定する|setseed(0.5)|
|sign|引数の符号を返す。引数が0の場合は0を返す|sign(-5) => -1|
|width_bucket|第一引数を第二引数から第三引数までの範囲に分割した際、第四引数がどの範囲に属するかを返す|width_bucket(50,0,100,5) => 3|
|trunc|小数部を切り捨てた値を返す|trunc(10.9) => 10|
|greatest|引数の中で最大値を返す|greatest(10,5,20) => 20|
|least|引数の中で最小値を返す|least(10,5,20) => 5|
|nullif|第一引数が第二引数と等しい場合はnullを、そうでない場合は第一引数を返す|nullif(10,10) => null, nullif(10,5) => 10|

# 演算子一覧

PostgreSQLで使用できる主要な演算子を紹介します。
※実際には、状況に応じて異なる使用方法があります。

|演算子|説明|例|
|:-----|:-----|:-----|
|=|左辺と右辺が等しい場合にTRUEを返す。|SELECT * FROM users WHERE age = 20;|
|<>|左辺と右辺が異なる場合にTRUEを返す。|SELECT * FROM users WHERE age <> 20;|
|<|左辺が右辺より小さい場合にTRUEを返す。|SELECT * FROM users WHERE age < 20;|
|>|左辺が右辺より大きい場合にTRUEを返す。|SELECT * FROM users WHERE age > 20;|
|<=|左辺が右辺以下の場合にTRUEを返す。|SELECT * FROM users WHERE age <= 20;|
|>=|左辺が右辺以上の場合にTRUEを返す|SELECT * FROM users WHERE age >= 20;|
|LIKE|パターンマッチングを行い、マッチした場合にTRUEを返す。|SELECT * FROM users WHERE name LIKE 'T%';|
|IN|左辺が右辺のいずれかと等しい場合にTRUEを返す。|SELECT * FROM users WHERE age IN (20, 30, 40);|
|NOT|後続する条件式の否定を表す。|SELECT * FROM users WHERE NOT age = 20;|
|AND|左右の条件式が両方TRUEの場合にTRUEを返す。|SELECT * FROM users WHERE age > 20 AND age < 30;|
|OR|左右の条件式のどちらかがTRUEの場合にTRUEを返す。|SELECT * FROM users WHERE age < 20 OR age > 30;|

# 最後に

今回は、PostgreSQLの組み込み関数と演算子についてまとめました。
足りないところなどありましたらご教授していただきたいです。

これからも私自身が気になったことなどや勉強したことを投稿していこうと思うのでよかったら「いいね」と「フォロー」の程よろしくお願いいたします！

自分が過去に投稿したDB・SQL関連の記事を下記のURLからとべるので、もしよかったらこちらも参考にしてください！
- [SQL超初心者がDB・SQLについて調べてみました](https://qiita.com/takada-syunya/items/5ebd29bda11c7bd24cb3)
- [SQLの基礎的な構文まとめ](https://qiita.com/takada-syunya/items/543beb894c67af69a793)
- [正規化の要点まとめてみました！](https://qiita.com/circular/items/c1249866b5e364c8a7dd)
- [OSS-DB Silverの学習メモ(その１[一般知識])](https://qiita.com/takada-syunya/items/aeed55696a9c0f09fb47)
- [OSS-DB Silver 学習メモその2【initdbについて】](https://qiita.com/takada-syunya/items/98eb24ff76e99e1c54a9)
- [OSS-DB 学習メモその3【標準付属ツールについて】](https://qiita.com/takada-syunya/items/87ec6583383095129643)
オブジェクト指向でのシステム分析・設計

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！

今回は具体的なオブジェクト指向でのシステム分析・設計について更に詳しく調べてみましょう！
![インスタスライド_202303063.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/f19f0552-b260-a236-0b66-480faac1006b.gif)


# オブジェクト指向分析とは
オブジェクト指向においてもシステム要件定義は行う。

要件定義では、モデリングの標準表記法であるUMLを用いるのが一般的である

# UMLとは
UMLとは　Unified Modeling Language（統一モデリング言語）

OMG（ http://www.omg.org/ ）が策定した

システムのモデル化を行う分析・設計工程で使用する

顧客と開発者、および開発者同士で同じモデリング言語を用い設計を行うことで、対象システムへの要求を明確にすることができる

# UMLのゴール
１．オブジェクト指向の概念を使って、システムをモデル化すること

２．上流工程の開発成果物と実行可能な成果物との明示的な結びつきを確立すること

３・複雑かつミッションクリティカルなシステムでは避けられない、システム規模自体の問題に対応すること

４．人間とコンピュータの両方にとって利用しやすいモデリング言語を開発すること

# まとめ
ーオブジェクト指向分析では、UMLを使う

ーUMLとは、Unified Modeling Language（統一モデリング言語）

ーUMLのゴールを理解する

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
datepickerで選択した月以前のデータを、非同期で表示させる

# datepickerの実装

　これは先の記事に詳しく書いている。

https://qiita.com/kyokucho1989/items/b9db3b9a65d77f12f2f2

# viewファイルに部分プレート追加

```erb:app/views/reports/index.html.erb
        <input type="hidden" id="reported_array" value="<%= @reports %>">
        <input type="hidden" id="reported" value="<%= @reported_days %>">
        <div id="datepicker-report"></div>
      <div class="col-lg-7">
        <div id="report_list">
        <%= render partial: 'reportlist' %>
        </div>
      </div>
```

```erb:app/views/reports/_reportlist.html.erb
<% @reports.each.with_index(1) do |report, i| %>
    <% report.report_items.each do |item| %>
      <%= item.content %>
    <% end %>
    <%= report.content %>
<% end %>
<nav aria-label="Page navigation example">
<ul class="pagination">
  <%= paginate @reports %>
</ul>
</nav>
```

細かいdivタグは排除している。レポートの中身を部分テンプレートに格納している。



# JSファイルの書き換え

```js:app/javascript/home.js
$(document).on("page:load turbolinks:load", function() {
// 略
 let reportedDays_json = document.getElementById('reported').value;
  if (reportedDays_json !== null) {
    let reportedDays = JSON.parse(reportedDays_json);
    $( "#datepicker-report" ).datepicker({
      beforeShowDay: function(date) {
        // 略
      },
      onChangeMonthYear: function(year, month, inst) {
        $.ajax({
          type: 'GET', 
          url: '/reports/filter_report', 
          data:  { 'year' : year, 'month' : month }, 
          dataType: 'script'
        })
        .done(function(data){ 
            //　なし
        })
      }
    });
}
```

　このようになる。jQuery UIのdatepickerの`onChangeMonthYear` オプションを利用することで、カレンダーの月が変更したときの関数を定義している。

　この関数ではyearとmonthの値を取得し、Ajaxを使用してサーバーにデータを送信している。

# ルーティング設定

　以下のように書き換える。

```rb:config/routes.rb
Rails.application.routes.draw do
# 略
  resources :reports do
    collection do
      get 'filter_report'
    end
  end
# 略
end
```

　collectionルーティングを使用し、idを伴わないパスを認識させる。これによってjsに書いた、`url: '/reports/filter_report'` が生きてくる。

# コントローラーの変更

　以下のようにする。

```rb:app/controllers/reports_controller.rb
class ReportsController < ApplicationController
# 略
  def filter_report
    year = filter_params[:year].to_i
    month = filter_params[:month].to_i
    target_month = Date.new(year,month)
    target_day = target_month.end_of_month
    @reports = get_filterd_report.where('reported_on < ?', target_day)
    respond_to do |format| # リクエスト形式によって処理を切り分ける
      format.html { redirect_to :root } # html形式の場合
      format.js
      format.json { render json: @reports } # json形式の場合
    end
  end
# 略
end
```

`@reports`に 選択した月とその月以前のレポートデータを入れる。ajax通信で呼ばれると、次に`filter_report.js.erb`　ファイルを呼び出す。



# JSファイルによるページの一部書き換え

```ruby:app/views/reports/filter_report.js.erb

if (typeof reports === 'undefined'){
  let reports = document.querySelector("#report_list");
  reports.innerHTML = '<%= j render 'reportlist' %>';
} else {
  reports = document.querySelector("#report_list");
  reports.innerHTML = '<%= j render 'reportlist' %>';
}

```

 viewファイルの中からid `report_list`の要素を探す。あったら、その中の部分テンプレートを更新させる。


# おわり

　すこしややこしい話になったが、この流れで実装させることができた。
2023/3/24主にITとかセキュリティの記事

ランサム被害が前年比約1.5倍 - バックアップ取得も復元に難あり
https://www.security-next.com/144683

ランサムウェア「LockBit 3.0」の詳細情報を公開、注意を喚起 - 米政府
https://www.security-next.com/144685

米政府、重要インフラ向けの「CPGs」をアップデート
https://www.security-next.com/144671

「三井住友信託銀行」装うフィッシング攻撃が発生
https://www.security-next.com/144709

Emotet配布にMicrosoft OneNoteの添付ファイルを悪用する手法を確認(3/22)
https://news.mynavi.jp/techplus/article/20230321-2630653/

Google Pixel、スクショエディタに編集前画像データが残っている脆弱性(3/21)
https://news.nicovideo.jp/watch/nw12291246

ドコモ、本人確認書類として健康保険証の取り扱い終了　不正契約の多さが理由(3/22)
https://ascii.jp/elem/000/004/129/4129534/?rss

DX時代におけるデータセキュリティ--安全性を高める4つのデータ管理方法(3/22)
https://japan.zdnet.com/article/35201413/

チェック・ポイント、2023年2月に最も活発だったマルウェアを発表(3/22)
https://securityinsight.jp/news/13-inbrief/5358-230322-1

「携帯電話のセキュリティが不十分で犯罪に悪用…」70代男性 90万円の特殊詐欺被害　大分(3/22)
https://news.yahoo.co.jp/articles/cc61e16437ab4fb9d458d6ace942cc0d83c21104?source=rss

三井住友信託銀行をかたるフィッシング、件名「【三井住友信託銀行】取引目的開示のお願い」などの不審なメールに注意
偽サイトに誘導し、口座番号などを詐取(3/22)
https://internet.watch.impress.co.jp/docs/news/1487546.html

FBI、ハッカーフォーラム運営者「ポムポムプリン」を逮捕(3/22)
https://www.zaikei.co.jp/article/20230322/714584.html

ゲームをする子どもたちへの2022年のサイバー攻撃は前年比57%増加(3/22)
https://prtimes.jp/main/html/rd/p/000000343.000011471.html

対話型AIにハッカー注目　悪用手口議論、闇サイトで急増(3/21)
https://nordot.app/1010815027890962432?c=220450040231249399

コインベースがERC-20トークンセキュリティ分析にChatGPTをテスト(3/22)
https://nextmoney.jp/?p=57422

ベビーモニターがハッキングの対象に　どうすれば守ることができるのか(3/22)
https://ascii.jp/elem/000/004/129/4129416/?rss

パスワードからの解放？　米巨大IT企業が足並みをそろえる「パスキー」とは(3/22)
https://news.yahoo.co.jp/articles/4deb5934ee030955f83cdebe6e0b9c18a94c4b0f?source=rss

サイバー攻撃演習訓練実施マニュアル(3/22)
https://www.nca.gr.jp/ttc/drill_manual.html

豪規制当局、銀行に暗号資産関連リスクなどの報告指示＝国内紙(3/22)
https://jp.reuters.com/article/global-banks-australia-idJPKBN2VO077

米、TikTok包囲網を強化　売却指示や司法捜査　中国は反発(3/22)
https://news.yahoo.co.jp/articles/2818e7d823f42bf3a7c0c82d8ebccd8eb2403cc4

データ管理業務はクラウドと好相性　最新技術トレンドを賢く押さえる(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/031700346/031700001/

VPNのセキュリティー(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/031600014/

埼玉大学がランサムウエア被害　朝8時の設定ミスで正午に侵入(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/031600049/

ITIL4なら企業のサステナビリティーへの取り組みを改善できる(3/23)
https://xtech.nikkei.com/atcl/nxt/column/18/01687/00350/

Linuxの実力を100％引き出したいなら必須、コマンド活用法を知る(3/23)
https://xtech.nikkei.com/atcl/nxt/column/18/02365/022400003/

「生成AI」と共に仕事を進める　対話を通じて思考と行動を刺激(3/23)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020900021/031700134/
OSS-DB Silver 学習メモその2【initdbについて】

# はじめに
今回の記事では、「initdb」について簡単に説明していきます。

initdbとは、PostgreSQLのデータベースクラスタを新しく作成するためのコマンドです。

# データクラスタとは
データクラスタとは、PostgreSQLにおけるデータベースの格納領域のことです。PostgreSQL上で扱うデータは全てデータクラスタ内で管理されています。
そして、そのデータクラスタを作成するためにinitdbコマンドを使用します。
initdbコマンドを実行すると、データベースクラスタに必要なファイルやディレクトリが作成されます。
initdbの書式は次のようになります。
- initdb [オプション] [ディレクトリ名]

# オプションの種類

initdbのオプションを次の表にまとめていきます。

| オプション名 | 説明| 
|:------|:------|
|-D、　--pgdate=ディレクトリ|データベースクラスタを作成するディレクトリを指定します。|
|-E、　--encoding=エンコーディング|エンコーディングを指定します。|
|-U、　--username=ユーザー名|管理者ユーザー名を指定します。|
|-W、　--pwprompt|管理者パスワードを入力するようにパスワード入力のプロンプトを表じさせます。|
|--locale=ロケール|デフォルトのロケールを設定します。|

## ロケールとは
ロケール（locale）とは、言語・文字コード・カレンダー等の地域に依存する設定情報のことです。
プログラムの実行時に必要となる文字列の言語や表記を設定するために利用されます。
例えば、日本語のロケールでは日付の書式が「年/月/日」になりますが、アメリカ英語のロケールでは「月/日/年」になります。
ロケールを設定すると、検索の性能が低下するなどの問題が発生する場合があります。そのため、PostgreSQLで日本語を使う場合にはロケールを無効にすることが推奨されています。

## エンコーディングとは
エンコーディング（encoding）とは、文字コードとも呼ばれ、文字をビットやバイト列に変換する方式のことです。
コンピュータが文字を扱うには、それを数値に変換する必要がありますが、エンコーディングによってその変換方法が定められます。
PostgreSQLがサポートする主なエンコーディングにはEUC_JP、UTF-8、SJISなどがあり、それぞれ異なる特徴を持ちます。
正しくエンコーディングを使わないと文字化けが起きたりするなどの問題が発生する恐れがあります。

# initdbで良く使われるコマンドの例

- データベースを初期化する場所を指定する例
```
$ initdb -D /usr/local/pgsql/data
```

- データベースで使用する文字エンコーディングを指定する例
```
$ initdb -D /usr/local/pgsql/data -E UTF8
```

- データベースの所有者となるユーザ名を指定する例
```
$ initdb -D /usr/local/pgsql/data -U postgres
```


# 最後に

今回は、「initdb」について簡単にまとめさせていただきました。

initdbは、PostgreSQLにおいてデータベースを初期化するためのコマンドであり、様々な設定を行うことができます。

これからも私自身が気になったことなどや勉強したことを投稿していこうと思うのでよかったら「いいね」と「フォロー」の程よろしくお願いいたします！

自分が過去に投稿したDB・SQL関連の記事を下記のURLからとべるので、もしよかったらこちらも参考にしてください！
- [SQL超初心者がDB・SQLについて調べてみました](https://qiita.com/takada-syunya/items/5ebd29bda11c7bd24cb3)
- [SQLの基礎的な構文まとめ](https://qiita.com/takada-syunya/items/543beb894c67af69a793)
- [正規化の要点まとめてみました！](https://qiita.com/circular/items/c1249866b5e364c8a7dd)
- [OSS-DB Silverの学習メモ(その１[一般知識])](https://qiita.com/takada-syunya/items/aeed55696a9c0f09fb47)

#### 参考資料
- https://www.postgresql.jp/document/10/html/app-initdb.html
【未経験でもカンタン】Pythonなら激重csvを開かずに「フィルタリングして個別保存」を自動化できる！

# 概要

今回は社内にも未だ多く見られる、
**「超重いcsvを開いて、特定条件でフィルタリングし、他の行を無くし、保存し直す作業」** 
を撲滅すべく、Pythonでのcsv操作自動化を説明いたします:hugging:

レベルとしては大したものではありませんが、
営業職の方々はこういったものが地味にありがたかったりしますよね。

**コピペや改変して使っていただいて全く構いません。**

# 目的詳細

A列に社名が存在し、B列に取引日付が存在するcsv（カンマ区切り）を、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/f4d6418e-5b6b-14b8-3d5d-8da7f5d9d8f4.png)



`・B列の取引日付が、現在の月のものだけ`

`・A列の社名ごと`

という条件でPythonによりcsvを自動で新規保存する。
下記の色ごとで単独のcsvが出来るイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/f3c912df-7b13-ae78-2043-1ca1d51522f9.png)

# 作業の事前準備

・[必須]Pythonのインストール
[先人の参考記事](https://qiita.com/Haruka-Ogawa/items/b37d0a2b48d14e29e802)

:::note warn
Pythonには主要なバージョンで「Python」と「Python3」が存在し、
同時にインストールすると複雑なことになるため片方のみが推奨です。
:::

・[必須]必要ライブラリのインストール
　コマンドプロンプトもしくはターミナルを開いて以下のコマンドを実行してください。
（Python3のコード例を記載）
```terminal:コンソール
pip3 install pandas
pip3 install tkinter
```

・[推奨]VSCodeのインストール
[先人の参考記事](https://qiita.com/psychoroid/items/7d85ae6bade4a67aedb1)

:::note info
必須ではないですが、メモ帳などに記載していくよりはこちらの方が快適です
:::

# 完成品（サンプルコード）
さっそく作っていきましょう。

```Python:csv_splitter.py
# ライブラリのインポート

# pandas : 表形式データを作成・フィルタリング・結合・グループ化・集計などの操作を行うライブラリ。csvを扱うこともできる。
import pandas as pd
# tkinter : Pythonの標準ライブラリ。GUI作成ができる。今回はファイル選択ダイアログに利用。
import tkinter as tk
from tkinter import filedialog
# datetime : 日付や時刻を操作するライブラリ。
import datetime

# tkinterでファイルダイアログを開き、CSVファイルを選択します

# Tkinterのルートウィンドウ（親ウィンドウ的なもの）を作成します。
root = tk.Tk()
# ルートウィンドウを非表示にします。
root.withdraw()
# ファイル選択ダイアログのGUIを表示し、CSVファイルを選択します。選択ファイルのパスがfile_pathに格納されます。
file_path = filedialog.askopenfilename(filetypes=[("CSV Files", "*.csv")])

# pandasのread_csv関数を使い、選択したCSVファイルを読み込みます。その際に","を列の区切りとしている。
df = pd.read_csv(file_path, thousands=",")

# 実行時の月（つまり当月）を取得します
current_month = datetime.datetime.now().month

# 「取引日付」という項目がある列で、当月のみをフィルタリングします。日付データが違う行にある場合はここを変えてください。
filtered_df = df[df["取引日付"].apply(lambda x: datetime.datetime.strptime(x, "%Y/%m/%d").month) == current_month]

# 「取引会社」という項目がある列で、値ごとに分割します。重複の場合はまとめられます。
for value in filtered_df["取引会社"].unique():
    value_filtered_df = filtered_df[filtered_df["取引会社"] == value]
    # 各フィルタされたデータフレームをCSVファイルとして保存します
    # ファイル名は参照した値に基づいて作成されます
    value_filtered_df.to_csv(f"{value}.csv", index=False)

```

# 実行方法 および 期待挙動

① コマンドプロンプトやターミナルからファイルが存在するディレクトリにて

```
python3 csv_splitter.py
```
と実行してください（Python3の場合の記述）
※ファイル名はそれぞれの保存した名前にご変更ください。

② ダイアログが開くので、対象となるcsvファイルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/2224b7ad-c6a5-8f62-98ca-04e4172fce46.png)

③ 会社ごとにcsvが保存されました。カレントディレクトリに保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/85a6d12f-927b-8770-66be-4cc9ddf5eafe.png)

ひとつ確認してみましたが期待通りの結果ですね:clap:

```csv:わんわん株式会社.csv
取引会社,取引日付,取引内容,販売額
わんわん株式会社,2023/03/13,首輪販売,2500
わんわん株式会社,2023/03/24,骨の販売,1000
```

# あとがき

自分の業務も含め、まだExcelを整形するだけのルーティン作業は社内に溢れています。
Excelのマクロ機能を使うのもいいですが、そもそも重いExcelはマクロ実行のために開くだけで
相当のストレスを感じ、PCの待機時間もチリツモで結構ムダにしている気がします。

Pythonは今回のデータの場合だと0秒で完了したので、時間面はかなり優位に感じるため、
積極的に使う機会を見つけていきたいと思います。

このような非エンジニアでもかんたんに使えるプログラミング情報を載せていきたいと思うので良ければまた見てください:hugging:
Microsoft Loopパブリックプレビューがはじまりました

# はじめに
Microsoft界隈では，Microsoft copilotの発表があったばかりですが，
3月22日に「Microsoft Loop」新たにLoopというアプリのリリースがされました．

https://www.microsoft.com/ja-jp/microsoft-loop?ms.url=microsoftcommicrosoft-loop

https://support.microsoft.com/ja-jp/office/microsoft-loop%E3%81%AE%E6%A6%82%E8%A6%81-9f4d8d4f-dfc6-4518-9ef6-069408c21f0c

自分は知りませんでしたが，すでにteamsアプリなどでは「Loopコンポーネント」というものがリリースされていたとのことで，
今回発表された「Microsoft Loop」はそれの母体となる独立したアプリのようです。

https://qiita.com/simpt/items/5c5112f3ea5760ba09fc

# 参加方法
**パブリックプレビューは，こちらから参加できます。**
https://loop.microsoft.com/learn

# とりあえず，つかってみた
みためは，Notionっぽい．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601976/8382d46e-d92f-cdad-99d9-451cc100010e.png)

まだパブリックプレビューでは使用できませんが，最近発表されたcopilotも導入されるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601976/41a846c2-84b4-e77b-4cf6-5513559d279c.png)
MRTK3を使用してVR開発をする上で詰まったこと・注意すべきことをまとめてみる

# はじめに
先日、ヤフー株式会社様主催のOpen Hack U Spring OSAKA に所属するITコミュニティのメンバーとともに参加しました。私たちのチームはVR・ARを用いたゲームアプリを作成することになり、私はVR側を担当し、MRTK3というフレームワークを使用したのですが、参考記事が多いわけではなかったので、いくつか詰まった点や気を付けるべき点を備忘録も兼ねてまとめようと思います。

#### 開発環境
| 名前 | バージョン |
|:-:|:-:|
| Unity  | 2021.3.7f1  |
| VRデバイス | Meta(Oculus) Quest 2 |

# そもそもMRTK3とは？
MRTK3 は、Unity 用 Microsoft Mixed Reality ツールキットの第 3 世代にあたるものです。「Mixed Reality」と付いていることから分かるように本来はMRに使用されるものですが、VRでも活用が可能です。MRTK3の特徴として、豊富なUIとUIの見た目がリッチである点が挙げられます。MRTK3に関する細かい内容は下記のサイトを参照してください。

>[Mixed Reality ツールキット 3 開発者向けドキュメント - MRTK3](https://learn.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/mrtk3-overview/)

# MRTK3の導入
MRTK3の導入自体は本題ではないので、この記事では割愛させていただきます。MRTK3を組み込んだ新規プロジェクトの立ち上げ方と既存のプロジェクトにMRTK3を組み込む方法は下記の記事がとても参考になります。

https://zenn.dev/miyaura/articles/be65665439f0d4

それでは、導入後詰まった点や注意すべきだと感じた点を列挙していきます。

## 1. MRTK XR RigとOVR Camera Rigは併用するのは避ける

　UnityでVR開発をする方法を載せている記事はいくつか見受けられますが、VR空間上での視点変更や移動、コントローラーの表示などをするために**OVRCameraRig**を使用しているものがあります。
　MRTK3を使用しない場合は全く問題ないのですが、MRTK3で使われるカメラリグである**MRTK XR Rig**と併用するとコントローラーから延びるレーザーポインターがものすごくブレる現象に直面しました。ブレるだけならまだよいのですが、UIを操作しようとすると、自分が押そうとしているボタンの隣のボタンにレーザーポインターが吸い寄せられるという謎の挙動に苦しめられました...

　それでもOVRCameraRigを使用しないとやりたいことができない！という方は**OVR Manager**というスクリプトを移植することでだいたいのことはできるようになります。(コントローラーの入力の取得など)

## 2. ボタンの長押しはRayCastを併用することで実現する。

　通常、2Dや3Dのゲームを作成する際に長押しの処理をしたい場合は、Event Triggerコンポーネントを使用すると思います。しかし、MRTK3のUIは一般的なuGUIを使用しているわけではないのでEvent Triggerで長押しの処理をしても機能しません。
　また、VRではコントローラーの入力をOVRInputのメソッドを呼び出すことで取得すると思いますが、用意されている長押しを検知するメソッド【OVRInput.Get(...)】ではボタンのあるなしに関係なく呼び出されるため、これ単体ではボタンの長押し処理は実現できません。
　そこで、これらの解決策としてRayCastを併用することで長押しの機能を正しく実装できます。

以下は左右のトリガーで長押しの操作をするサンプルスクリプトです。

```c#:LongPressSample
private void Update() 
{
    //左右トリガーの入力を検知する。
    if(OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.LTouch) || OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.RTouch))
    {
        //コントローラーの向いている方向にレイを飛ばす
        Ray ray = new Ray(rightController.transform.position, rightController.transform.forward);
        RaycastHit hit;
        if(Physics.Raycast(ray, out hit))
        {
            //タグでどのボタンを長押ししているかの判別
            if(hit.collider.gameObject.CompareTag("Button"))
            {

                //長押しをしたときの処理

            }
        }
    }
}
```

上記のスクリプトでは、必ず長押しの処理をタグ等でどのボタンオブジェクトで行っているかを確認しているif文の中で行ってください。この確認がないと別のボタンオブジェクトで処理が実行されてしまう可能性があります。

## 3. MRTKのインプットシステムが一部正しく設定されていない

:::note warn
この不具合は私だけかもしれませんが、一度確認しておくことを推奨します。
:::

　開発途中、右のスティックで移動できるようにしようと考え、MRTKのインプットシステムを利用して作成していたのですが、いざビルドしてみると右のコントローラーのスティックが反応しない...左のスティックは反応するのになぜだ！！...となり、調べてみるとMRTKのInput Actionで右のコントローラーのMoveに三角形がついていない！つまり、Moveの項目に何も設定されていないことに気が付きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111921/22626a88-647b-fbd7-74ed-9c93ff4409dd.png)

ただ、これの対処法はシンプルで左のコントローラーにもMoveの項目があり、そちらは正しく設定されているので設定を真似れば大丈夫です。具体的には下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111921/2e71a1b5-c906-d80e-c1f7-6978c876189e.png)

## 終わりに

今回はMRTK3を使ってVR開発を行った際に詰まった点・注意すべき点をまとめました。今後、MRTK3を使用した際に他に注意すべき点など見つかれば追記していきたいと思います。
【備忘録】Nrealで撮影した写真をMR空間上に配置する

# はじめに
NRSDKのデモに存在するスクリプトを用いて、Nreal搭載カメラで撮影した写真をMR空間上に配置するアプリを作成したので備忘録として残します。

# 環境
- Unity (2020.3.44f1)
- Xperia 5 III SOG05
- Nreal Light
- NRSDK for Unity 1.10.1

# 準備
Nrealアプリの開発を行うための準備をします。
[こちら](https://qiita.com/tk526608/items/11f2a3e1c83ce8e79273)の投稿の「カメラとコントローラーの配置」まで進めれば、開発準備完了です。

# オブジェクトにスクリプトを配置
NRSDKで用意されたスクリプトをオブジェクトに配置するのみで、期待する動作を実現できます。
まず、GameObject -> Create Emptyを選択して、空のオブジェクトを作成しましょう（名前は任意）。
作成したオブジェクトのInspectorにてAdd Componentを押下し、Photo Capture Example.csを追加してください。
これで期待する動作を実現できます。
![スクリーンショット 2023-03-21 0.43.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949714/14c9866c-5ff9-f393-5ea9-cadd521dde35.png)

# 実機での確認
作成したアプリを実行し、Android端末の画面に表示されているボタンを押下すると、Nreal搭載のカメラで撮影された写真がMR空間上に投影されていることを確認できます。

# 参考
https://nreal.gitbook.io/nrsdk/nrsdk-fundamentals/core-features
備忘録 CodeCommit

[【復習】Git（initからpushまで）](https://qiita.com/iwajin/items/8a9fdb1ca06f2c52a266)
Gtiの復習をしたので今度は去年の12月に取得したAWS-DVAの復習も兼ねてAWS Skill Builder、CodeCommit入門のハンズオンをやってみました。自分用なのでまとめ方だいぶテキトーです。

# リモートリポジトリ作成〜`push`まで
①CodeCommitのコンソールにて`リポジトリ名`を入力し、`作成`を押下、リポジトリのURLを控える
②IAMのコンソールにてユーザを新規作成、`AWSCodeCommitPowerUser`を付与
③作成したユーザ＞`セキュリティ認証情報`＞`AWS CodeCommit の HTTPS Git 認証情報`にて認証情報を発行する
④ローカルの作業フォルダにて`init`,`clone`を実行
※`warning:〜`はファイルがない。空だよって教えてくれてる
```
$ git init
$ git clone [リポジトリ作成時に控えたURL]
Cloning into 'test-repository'...
git: 'credential-aws' is not a git command. See 'git --help'.
Username for 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-repository': [認証情報：ユーザ名を入力]
Password for 'https://commit_testuser+1-at-272958834483@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-repository': [認証情報：パスワード]
git: 'credential-aws' is not a git command. See 'git --help'.
warning: You appear to have cloned an empty repository.
```
⑤適当にファイルを作って`push`まで実行
```
$ vi "newFile"
$ git add .
$ git commit -m "first"
[master (root-commit) 0d5d8b9] first
 1 file changed, 3 insertions(+)
 create mode 100644 newFile
$ git push origin master
git: 'credential-aws' is not a git command. See 'git --help'.
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Validating objects: 100%
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-repository
 * [new branch]      master -> master
```
⑥CodeCommitのコンソールを確認しリモートリポジトリに`push`されていることを確認する
![Screenshot (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779468/2cb785db-e113-29fe-203f-f8253b81ee81.png)

# `branch` `checkout` `merge` など
前回のgit復習でできなかったことをやりました。

参考
[Git のブランチ機能 - ブランチとマージの基本](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC)

```
# ブランチの切り替え
$ git checkout branch2
Switched to branch 'branch2'

# ブランチを作成、切り替え
$ git checkout -b branch2
Switched to a new branch 'branch2'

# ブランチの確認
$ git branch
* branch1  branch2  master

# マージ先のブランチに切り替えてからマージ
$ git checkout master
$ git merge branch2
Updating 0d5d8b9..ad4b2e1
Fast-forward
 bbb | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 bbb
```