OmniAICreator/Qiita-1.07M huggingface dataset:
[Servicenow][Flow]Flow ActionからRest Messageを実行する（Script Step）

# Flow ActionからRest Messageを実行する
REST Messageの呼び出し方法が何種類かあるので実施したことを簡単にまとめておきます。

## 環境
- Version：Tokyo

## 設定手順
Flow ActionからRest Messageを実行する（Script Step）設定手順の例です。
Rest Messageは以下を参考に事前に用意しておく必要があります。
https://qiita.com/tabuchi530/items/292fcd717cdd2c782887

1.  [rest message]と検索しREST Message一覧画面を開き、実行したいREST Messageを選択する。
1.  実行したいメソッドを選択し、[Preview Script Usage]をクリックする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/cd6e656e-4fb5-e33c-7e84-501e25028676.png)
1.  表示されたScript内容をコピペしてメモ帳などに保存しておく。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/5b88d8b4-5873-9af7-e3e4-3e8e5d09b44d.png)
1. [flow designer]と検索し、flow designerを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/a2257ed3-56a1-7ea9-8eb1-ab600f5f85dd.png)
1. [New]<[Action]をクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/1fc517fa-7963-ff0e-9f8a-9758274b2576.png)
1. nameを入力し、submitします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/0a9d142f-2182-a0d1-df32-5f70be9bcced.png)
1. Inputsをクリックし、API実行に必要なパラメータを定義します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/67afef5c-ee8a-d1d9-530e-f702870b63f7.png)
1. inputの下の[+]アイコンをクリックし、[Script]を選択します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/808aaf05-de13-2ef1-fd80-a38f60b53ff7.png)

1. Input Variablesを定義します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/3a335314-650d-dd43-3753-a19ac156cb38.png)
1. Output Variablesに戻り値を定義しておきます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/712105b4-4b96-26e5-7da4-54f10db51f1f.png)

1. Script欄にコピペしておいたScriptを張り付け、必要に応じて呼び出すパラメータや戻り値の部分を加工します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/de145d01-7b39-30be-c274-3da56e5a3308.png)
1. Outputsで戻り値を定義します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/caf08b87-f997-4857-403c-37018f1bc2fe.png)
1. [Save]して、[Publish]します。
1. [Test]をクリックし、API実行に必要なパラメータがあれば入力し[Run Test]をクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/5e0f13b5-1e02-9730-74cf-bbe8a85ea8f0.png)
1. [Your test has finished running. View the Action execution details.]をクリックし実行結果を確認します。

API実行できていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/6a20ba80-03d1-c073-a060-f2bf0c9a4e02.png)


作成したActionをFlowなどから呼び出すことができます。

Script例
```
(function execute(inputs, outputs) {
// ... code ...
  try { 
    var rest = new sn_ws.RESTMessageV2('住所検索', 'Default GET');
    rest.setStringParameterNoEscape('zipcode', inputs.zipcode);
    var response = rest.execute();
    outputs.status_code = response.getStatusCode();
    outputs.massage = response.getBody();
  }
  catch(ex) {
    var message = ex.message;
  }
  
})(inputs, outputs);
```
this exceeds GitHub's file size limit of 100.00 MBの対応

# 対応法
[参考1: サイズエラー前のコミットに戻る](https://qiita.com/ffggss/items/b61e726bc8cbd3137956)
[参考2: gitignoreが無視される場合、キャッシュを消去する](https://qiita.com/fuwamaki/items/3ed021163e50beab7154)

上記を参考に対応すると、治った。
VSCodeでdevcontainerが開けなくなった(SyntaxError: Unexpected end of JSON input)

初めまして､fsd-shoyaです｡
初投稿になりますので間違いなどありましたらお知らせ下さい｡
今回は､devcontainerで詰まってしまった原因と解決策について投稿させて頂きます｡

## はじまり
いつも通りVSCodeを起動して､作業を開始しようとしたら､devcontainerが開けず､
```
SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at n6 (/Users/fsd-shoya/.vscode/extensions/ms-vscode-remote.remote-containers-0.295.0/dist/extension/extension.js:224:1268)
at process.processTicksAndRejections (node:internal/process/task_queues:96:5)
at async t6 (/Users/fsd-shoya/.vscode/extensions/ms-vscode-remote.remote-containers-0.295.0/dist/extension/extension.js:220:733)
at async vm (/Users/fsd-shoya/.vscode/extensions/ms-vscode-remote.remote-containers-0.295.0/dist/extension/extension.js:194:9112)
at async Wbe (/Users/fsd-shoya/.vscode/extensions/ms-vscode-remote.remote-containers-0.295.0/dist/extension/extension.js:288:7491)
at async DK (/Users/fsd-shoya/.vscode/extensions/ms-vscode-remote.remote-containers-0.295.0/dist/extension/extension.js:288:6424)
at async BO (/Users/fsd-shoya/.vscode/extensions/ms-vscode-remote.remote-containers-0.295.0/dist/extension/extension.js:279:4972)

```
のようなエラーが生じ､解決しようと藻掻いていると､数時間が経ってしまいました｡
実行環境はwsl+VSCode+Docker+devcontainerです｡
## 原因
エラー文の最初の行を見ると､JSON入力のエラーであると分かります｡
どの入力でエラーが生じたのかを確認するために､直前のログを確認すると､
```
Start: Run in container: cat '/home/node/.vscode-server/bin/695af097c7bd098fbf017ce3ac85e09bbc5dda06/product.json'
```
となっているので､
`/home/node/.vscode-server/bin/695af097c7bd098fbf017ce3ac85e09bbc5dda06/product.json`
の入力でエラーが生じたようです｡
## 解決策
エラーが生じたJSONファイルのあるディレクトリを削除しました｡
```bash:wsl
//コンテナー内で作業する
docker run -it --rm -v vscode:/vscode ubuntu
//対象のディレクトリがあるか確認
ls -l /vscode/vscode-server/bin/linux-x64/695af097c7bd098fbf017ce3ac85e09bbc5dda06/
//対象のディレクトリを削除
rm -rf /vscode/vscode-server/bin/linux-x64/695af097c7bd098fbf017ce3ac85e09bbc5dda06/
```
:::note warn
/vscode/vscode-server/bin/linux-x64/**695af097c7bd098fbf017ce3ac85e09bbc5dda06**/
太字の部分は､エラーが生じたファイルパスを参照して下さい｡
:::
***
## 学んだこと
* wsl上で直接コンテナーの中身を触ることは出来ない｡
* 赤字のエラー文のみでなく､**どこでエラーが起こっているか**を特定するべき｡
***
以上になります｡
どなたかの参考になれば幸いです｡
#### 参考資料
https://github.com/microsoft/vscode-remote-release/issues/8624
Chakra UIでの色指定とカスタム色の追加


## はじめに　

Reactに入門する際、CSSライブラリとしてChakra UIを選びました。  
Chakra UIは色指定にはカラーコードではなく、デフォルトで定義されている`blue`のような識別子を使います（カラーコードも使えます）。　　
限られた色を使うことで、シンプルで一貫性を保つことを方針にしているみたいです[^1]　　
しかしながらどうしても定義済みの色以外を使いたくなったので、その方法を調べてわかったことを書きたいと思います。　　

## 濃さも定義済みのものしか使えない　　

色の濃さは`blue.100`のように数字で指定するのですが、blue.50とblue.100の中間の濃さを使いたいと思い、blue.75としてみましたが反映されませんでした。　　

色の定義は`node_modules/@chakra-ui/theme/dist/foundations/colors.js`に記載があるとのことで確認してみると、やはり75は定義されていませんでした。

```js:node_modules/@chakra-ui/theme/dist/foundations/colors.js
var colors = {
  // ...
  blue: {
    50: "#ebf8ff",
    100: "#bee3f8",
    200: "#90cdf4",
    300: "#63b3ed",
    // ...
  },
  // ...
};
```
このような、色などを管理するための設定値の集まりを、テーマと呼ぶそうです。

## 新たな色をテーマに追加する　　

それであればしょうがないので中間の濃さのカラーコードを直接指定しようと思いましたが、それだとChakra UIの方針に反しそうな気がしたので、テーマに色を追加する方法を取りました。　　

テーマの拡張には`extendTheme()`を使います。　　

```jsx:src/theme.jsx  
import { extendTheme } from "@chakra-ui/react"

const theme = extendTheme({
  colors: {
    blue: {
      75: "#d4e8ff"
    },
  },
});

export default theme;
```

次のように`<ChakraProvider theme={theme}>`として適用します。

```jsx:src/index.jsx
// ...
import { ChakraProvider } from '@chakra-ui/react';
import theme from './theme';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <ChakraProvider theme={theme}>
      <App />
    </ChakraProvider>
  </React.StrictMode>
);
// ...
```

これで新しく定義した`blue.75`が使えるようになります。　　
テーマの適用範囲をコンポーネント単位で分けることもできます。　　


## テーマの色をカラーコードで取得する

テーマはChakra UIのプロパティで使用しますが、通常のCSSプロパティにテーマを指定することはできません。
例えば`<Box style={{backgroundColor: "blue.100"}}>`のようにインラインスタイルでblue.100を指定しても反映されません。  

テーマと同じ色を使いたいときは、テーマオブジェクトから対応するカラーコードを取得します。　　
Chakra UIにはテーマオブジェクトを取得する`useTheme()`というフックが用意されているので、それを使います。　　

```jsx:src/components/MyComponent.jsx
import { Box, useTheme } from "@chakra-ui/react";

const MyComponent = () {
  const theme = useTheme();
  return (
    <Box style={{ backgroundColor: theme.colors.blue[100] }}>
      // ...
    </Box>
  );
};
```
`theme.colors.blue[100]`とすると文字列`#bee3f8`を取得できます。　　

## おわりに　　

他のCSSライブラリとの比較はできませんが、Chakra UIは自然な形でReactに組み込めている感覚があり、使いやすかったです。MUI等も似たような感じなのでしょうか？おいおい使ってみたいと思います。



[^1]: https://chakra-ui.com/getting-started/principles
Dockerコマンドコピペ元

dockerコマンドで使うたびにググっているようなものをまとめてコピペできるようにしておく。逐次追加予定

### dockerコマンドについて調べる
`docker --help` でコマンド一覧を表示して、各コマンドの使い方は `docker ps --help`などすれば詳細な説明を見ることができる。
---
## イメージ関係
### イメージの一覧を取得
```shell
docker images
```

### イメージ削除
```shell
docker rmi {イメージID}
```

---
## コンテナ関係

### 起動しているコンテナ上でbashを起動する
`-it` つけないとbashの起動が終了したらそのまま抜けてしまうので注意
``` shell
docker exec -it {コンテナ名(ID)} bash
```

### コンテナの状態を確認する（一覧を取得）
``` shell
docker ps
```
- `-a` をつけると起動していないものも表示される


### コンテナを停止する
``` shell
docker stop {コンテナ名(ID)}
```

### コンテナを再起動する
``` shell
docker restart {コンテナ名(ID)}
```

### コンテナを削除する
``` shell
docker rm {コンテナ名(ID)}
```

### コンテナのログファイルを表示する
``` shell
docker [オプション] logs {コンテナ名(ID)}
```
- `--tail n` で末尾n行を表示


## docker run
オプションが多いので整理
https://docs.docker.jp/engine/reference/run.html
### `--name`
- コンテナに名前を付ける
- １つのイメージから複数コンテナを作成するのに必要
### `-i(--interactive)`
- コンテナの出力をホスト（実行しているターミナル）の標準出力に紐づける
### `-t(--tty)`
- pseudo tty (=pty: 疑似端末/仮想端末)を有効にする設定
- 疑似端末は、カーソルキーやエスケープキー、［Ctrl］キーなどで操作するためのもの
### `-d(--detach)`
- デタッチモードでコンテナを起動します。要はバックグラウンド実行
### `-v (--volume) {ホスト側ディレクトリ}:{コンテナ側ディレクトリ}`
- ホスト側ディレクトリとコンテナ側ディレクトリを紐づける
- ネットワークドライブを割り当てるイメージ
### `-e (--env)`
- コンテナ起動時に環境変数を設定できる
- Docker on Linuxの場合以下の環境変数がデフォルトで設定されて起動する

|  変数  |  値  |
| ---- | ---- |
| HOME | USER の値を元にして指定  |
| HOSTNAME  | コンテナに関連づけるホスト名 |
| PATH | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin のような一般的なディレクトリを含む |
| TERM | コンテナが疑似ターミナル（pseudo-TTY）を割り当てるときは xterm |
CloudFrontとAmplifyではHTTPレスポンスヘッダの優先度が異なる？

# 結論
CloudFrontのキャッシュビヘイビアと、Amplifyのカスタムヘッダでは優先順位が異なる！

### CloudFrontの場合
**最初に提示した** ワイルドカードルールに従ったビヘイビアが選ばれる
つまり、複数のパスパターンにマッチする場合は、最初にマッチしたものが適用される

https://qiita.com/t-kigi/items/55227032ba780a526a55

### Amplifyの場合
**最後に提示した** ワイルドカードルールに従ったパスパターンが選ばれる
つまり、複数のパスパターンにマッチする場合は、最後にマッチしたものが適用される

↓ この場合、`**/*` に一致する`/assets/*` でも、`Cache-Control = s-maxage=3600`が適用される！
~~この挙動めっちゃ気持ち悪いのでCloudFrontに統一してほしい~~
```customHttp.yml
applications:
  - customHeaders:
      - pattern: '**/*'
        headers:
          - key: 'Cache-Control'
            value: 'no-store'
      - pattern: '/assets/*'
        headers:
          - key: 'Cache-Control'
            value: 's-maxage=36000'
```

## (おまけ) HTTPレスポンスヘッダの追加方法
### Cloudfrontの場合
キャッシュビヘイビアの設定で、HTTPレスポンスヘッダを追加できる。
また、レスポンスヘッダポリシーを設定することで、HTTPレスポンスヘッダをテンプレート化できる。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/modifying-response-headers.html

### Amplifyの場合
デフォルトではHTTPレスポンスヘッダを追加することはできないが、パフォーマンスモードを有効化している時にカスタムヘッダの設定をすることで、HTTPレスポンスヘッダを追加することができる。
https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/custom-headers.html


# 一言
AWS Amplifyは独自の仕様がいっぱいあって難しい😭
[Servicenow][Flow]Flow ActionからRest Messageを実行する（REST Step）

# Flow ActionからRest Messageを実行する
REST Messageの呼び出し方法が何種類かあるので実施したことを簡単にまとめておきます。

## 環境
- Version：Tokyo

## 設定手順
Flow ActionからRest Messageを実行する（REST Step）設定手順の例です。
Rest Messageは以下を参考に事前に用意しておく必要があります。
https://qiita.com/tabuchi530/items/292fcd717cdd2c782887

1.  [flow designer]と検索し、flow designerを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/a2257ed3-56a1-7ea9-8eb1-ab600f5f85dd.png)
1. [New]<[Action]をクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/1fc517fa-7963-ff0e-9f8a-9758274b2576.png)
1. nameを入力し、submitします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/0a9d142f-2182-a0d1-df32-5f70be9bcced.png)
1. inputの下の[+]アイコンをクリックし、[REST]を選択します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/45dc37df-945a-f0fd-084b-28e237198258.png)
1. [Build Request]で「From REST Message」を選択します。
1. [REST Message]で呼び出したいREST Messageを選択します。
1. [REST Message Function]で呼び出すメソッドを選択します。
1. [Import REST Message]ボタンをクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/8c633028-30fe-8596-77da-67acdb7f6406.png)
1. インポートした内容が他の項目に反映されます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/dc13b9cb-f7c5-7357-4464-40026636cc00.png)
1. outputで戻り値を定義します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/473b966c-fc2c-00d2-b7f1-f14dad6a60dc.png)
1. [Save]して、[Publish]します。
1. [Test]をクリックし、API実行に必要なパラメータがあれば入力し[Run Test]をクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/5e0f13b5-1e02-9730-74cf-bbe8a85ea8f0.png)
1. [Your test has finished running. View the Action execution details.]をクリックし実行結果を確認します。

API実行できていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636124/6a20ba80-03d1-c073-a060-f2bf0c9a4e02.png)


作成したActionをFlowなどから呼び出すことができます。
Flutterエンジニアなら知っておきたい企業InvertaseとVery Good Venturesを勝手に紹介します

## はじめに
Flutterエンジニアの皆さんは[pub.dev](https://pub.dev/)のパッケージを日々使っているかと思います。
パッケージといっても色々ありますが、開発元に注目したときコミュニティが作っているもの、個人が作っているもの、企業が作っているものなど様々です。
今回はpubのパッケージなどFlutter関連のOSS開発をしている企業でも特に存在感のある2社について勝手に紹介します。

## Invertase
InvertaseはFlutterFireやMelosなどのOSSを開発している企業です。
ちなみに日本語だとインバーテースと読むみたいです。

https://invertase.io/

Riverpod作者の[Remi Rousselet](https://twitter.com/remi_rousselet)さんが在籍してることでも有名ですね。また[Majid Hajian](https://twitter.com/mhadaily)さんや[Mais Alheraki](https://twitter.com/pr_Mais)さんなどGoogle Developers Expertの方が多数在籍しています。

### パッケージ
主要なパッケージの紹介です。

#### FlutterFire
現在はInvertaseのリポジトリで管理されていませんが、お世話になっている人が多いであろうFlutterFireはInvertaseが開発しています。

https://github.com/firebase/flutterfire

#### Melos
マルチパッケージのDartプロジェクト管理ツールのMelosもInvertaseが開発しています。MelosはFlutterFireやRiverpodで利用されています。

https://github.com/invertase/melos

#### Custom Lints
オリジナルのLintを作成できるパッケージです。

https://github.com/invertase/dart_custom_lint

### その他の活動

#### Zapp.run
ブラウザ上で使える開発環境Zapp!もInvertaseが開発しています。

https://zapp.run/

#### カンファレンスの主催

Flutter Firebase Festivalというイベントを主催しています。

https://f3.events/

#### コンテスト
InvertaseのOSSをテーマにしたコンテストを開催しています。

https://invertase.io/content-contest

以下は私のコンテスト参加レポートです

https://note.com/k9i/n/nde94f7971e2b


## Very Good Ventures
GoogleのイベントでVery Good Venturesの開発したアプリをみたことのではないかと思います。名前が長いのでVGVと略されることが多いです。
個人的にBLoCを推してる企業みたいな印象があります👀（日本だとBLoCあまり使われてない感覚ありますが）

### パッケージ

#### Very Good CLI

テンプレートに基づいて色々な初期化を済ませたプロジェクトを作成できるCLIツールです。

https://pub.dev/packages/very_good_cli

Flameを使ったゲームアプリのテンプレなんかもあるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/6b83fbe6-e0dc-6da2-3524-3aa5294f6aee.png)

#### Dart Frog
Dart向けの軽量バックエンドフレームワークのDart Frogの開発元もVGVです。

https://github.com/VeryGoodOpenSource/dart_frog

### その他の活動
その他というかこっちがメイン？な気がしますが、パッケージ以外の紹介です。

#### I/O FLIP
Google I/O 2023のコンテンツだったAIカードゲームのI/O FLIPはVGVが開発しています。

https://flip.withgoogle.com/

リポジトリ

https://github.com/VGVentures/io_flip

2022のpinballや2021のphotoboothもVGVが開発しています。

https://github.com/VGVentures/pinball

https://github.com/VGVentures/photobooth

#### Flutter News Toolkit
ニュースアプリ用のテンプレートプロジェクトFlutter News ToolkitはGoogleとVGVの共同開発です。

https://github.com/flutter/news_toolkit/tree/main


## まとめ
InvertaseとVery Good Venturesについて紹介しました！
この情報も追加しべきでは？とかこの企業も紹介して！みたいなのあったらコメントお願いします🙋‍♂️
時間管理のはなし

# はじめに
Sierで人材教育をやっている**TKY**です。

今回は、自分の１日の仕事がどれくらい予想とズレているかというお話をふまえ、
どうやってズレを減らしていくかのポイントをお伝えしたいと思います。

# もくじ
- １日の内容は？
- 実際、何をしていたか？
- ズレを認識してカイゼンする

# １日の内容は？
１日のやることをチームのメンバーとコミットしてから、その日の作業を開始することはよくあると思いますが、
タスクの内容と、何となくの作業時間だけ積み上げて１日のやることを設定していると思います。

実際、フタを開けてみると、
　誰かから声をかけられて作業ができなかったり、
　急に打ち合わせに呼ばれたり、
　レビューのお願いをされたり、、
と、想定外の作業が発生することがありかと思います。

# 実際、何をしていたか？
まずやって欲しいことは、１５分単位で作業内容の実績を残すことです。
最初は面倒かもしれませんが、慣れてくればそれほど苦にななりません。

これをやって分かることは、
- 予定してなかった作業が発生していることに気が付く
- 小さな打合せも含めて会議の時間が明確になる
- ちょっとした休憩を何度かしていることに気が付く
- 移動時間を意識するようになる

言えばキリがないですが、気が付く子t歩がたくさんあります。

# ズレを認識する
上記の通し、実績を見える化することで予定とのズレが見えてきます。
ズレている部分を把握することで、見えていなかった作業を予測して、
予定に組み込んでいくことが少しずつできるようになってきます。

- 朝会の時間
- 相談の時間
- レビューの時間
- 会議の時間
- 休憩の時間
- 雑談の時間
- おやつの時間

自分の予定を立てるスキルが上がると、見積りの精度も上がってきます。

# さいごに
最後まで読んでいただきありがとうございます。
参考になれば幸いです。
Backlog APIで使用する 'userId' を取得する方法

[Backlog API](https://developer.nulab.com/ja/docs/backlog/#)では、よく`userId`を使用するのだが、この`userId`は個人設定で変更できるユーザーIDではなく、`39585３`のような数値を使用する。

この`39585３`のような数値は、Backlogの個人設定などからは取得できなかったため、Backlog APIを使用して取得する方法を備忘録として残しておきます。

## プロジェクトのユーザー一覧を取得
Backlog APIの[プロジェクトユーザー一覧の取得](https://developer.nulab.com/ja/docs/backlog/api/2/get-project-user-list/#)を実行して、ユーザー一覧（jsonデータ）を取得する。

## ユーザー一覧から`userId`を取得
取得したユーザー一覧（jsonデータ）の中のidの値が`userId`になる。
次の場合、Yamada Taroさんの`userId`は`111111`になる。
``` json
[
    {
        "id":111111,
        "userId":null,
        "name":"Yamada Taro",
        ...省略...
    },
    {
        "id":222222,
        "userId":null,
        "name":"Nihon Hanako",
        ...省略...
    },
    ...省略...
]
```

## 補足事項
Backlog APIの[ユーザー一覧の取得](https://developer.nulab.com/ja/docs/backlog/api/2/get-user-list/#)でも取得可能だと思われる。こちらの場合は、管理者、または、プロジェクト管理者である必要があるため、未確認です。
AWS DMS使ってみた

## １．AWS DMSの概要

AWS Database Migration Serviceの略でデータベースの移行を支援するサービス
・AWS～AWS間の移行だけではなく、オンプレミス～AWS間の移行に対応
・異なるデータベースエンジン間の移行も可能
・レプリケーションインスタンスを介して移行をする。専用エンドポイントが必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/f6d7f3ab-cbea-4886-de4c-fbae8e81a071.png)
https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/Welcome.html より抜粋

## ２．使ってみた　その①

検証内容：EC2にインストールしたMadiaDBを、RDSに移行(レプリケーションインスタンスを使用)　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/87f72e08-8d63-c592-f9b3-0d1592758057.png)

設定①　レプリケーションインスタンスの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/e82d71d7-42c6-dc13-54c5-cba78244b640.png)

設定②　ソースエンドポイントの作成　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/6e27e148-fadf-7bdf-dc22-41f83a641f3c.png)

データ移行タスクの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/33a1d4fd-565e-1d81-f76f-d13b85e7e29b.png)

## ３．使ってみた　その②
AWS DMSのサーバレス版がGAとなった。これによりレプリケーションインスタンスが不要となる。
https://aws.amazon.com/jp/blogs/news/new-aws-dms-serverless-automatically-provisions-and-scales-capacity-for-migration-and-data-replication/

検証内容：EC2にインストールしたMadiaDBを、RDSに移行(サーバレスレプリケーションに変更)　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/1cfb55e9-e0ff-c799-e60a-6f2f7bc3d143.png)


サーバーレスレプリケーションはここ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/9227c20a-6dc2-aa3d-24a1-106deab80f59.png)

データ移行タスクの実行
エラーとなりレプリケーションがうまくいかなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148393/33ea6385-5e43-08b0-ab06-8cc516644155.png)

## ４．感想
- リファレンスマニュアルだけでは、使いこなせないサービスだと思った。
- 実際に動かしてみて、手順は何となく理解した。
- エンドポイントとレプリケーションインスタンスを用意するのが手間だが、
   短時間でDBをレプリケーションできることは魅力的だと思った。
- 　実際にレプリケーションをするためにはソースDBの外部許可設定をする必要がある。
- 　サーバレスに挑戦してみたが、うまくいかなかった。継続して調査する予定。

## ５．参考
https://ent.iij.ad.jp/articles/2511/
【SwiftUI】List内に複数のButtonがある場合に動かなくなる対処


# 【SwiftUI】List内に複数のButtonがある場合に動かなくなる対処



![Screen Recording 2023-07-19 at 22.19.39.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/7d24c5ca-7666-cdf7-a497-e50671bc94fa.gif)

動画のようにList内に複数のButtonが設置したい場合は多々あります。

しかしながら、Buttonが複数ある場合、動画の一行目のように意図したようにButtonが動作しないことが生じます。今回はこれを解決して、四行目のような動作になるような対処法について説明していきます。

# **開発環境**

Xcode : 14.3

Swift : 5.8

SwiftUIを使用

# 再現コード

```swift
List {
    HStack {
        Button {
            print("button 1 tapped")
        } label: {
            Text("One")
        }
            
        Button {
            print("button 2 tapped")
        } label: {
            Text("Two")
        }
    }
}
```

このコードを実行すると、ボタンのタップが適切に認識されません。なぜなら、SwiftUIのListはその行全体をタップ可能な領域として認識し、ユーザが行自体をタップしたと解釈します。この結果、行内のButtonのタップイベントは上書きされてしまいます。

この問題の根本的な原因はタップイベントの管理が競合してしまう点にあります。Listはその全体が一つのタップ領域となり、Buttonも同様に自身が独立のタップ領域であると認識します。そのため、ユーザがButtonをタップしてもListのタップイベントが優先され、Buttonのタップイベントが無視されます。

この問題を解決するには2つのアプローチがあります。

# 解決策1：****buttonStyleを使う****

Buttonには**`buttonStyle`**修飾子があります。これを使用してButtonに**`.borderless`**または**`.plain`**のスタイルを適用すると、ボタンのタップが正しく認識されます。

```swift
List{
    HStack {
        Button(action: { 
						print("button 1 tapped")
				}) {
            Text("One")
        }
        .buttonStyle(.borderless)
        
        Button(action: { 
						print("button 2 tapped") 
				}) {
            Text("Two")
        }
        .buttonStyle(.plain)
    }
}
```

**`.borderless`**や**`.plain`**スタイルを適用すると、Buttonはタップ可能な領域を自身のラベル（この場合はText）に制限します。これにより、Buttonのタップ領域とListのタップ領域が競合することを避け、Buttonのタップイベントが正しく検出されます。

# 解決策2：****onTapGestureを使う****

もう1つの解決策はButtonをTextに変え、**`onTapGesture`**を使用する方法です。これにより、Textのタップイベントを捉えることができます。

```swift
List {
  HStack {
    Text("One").onTapGesture { 
				print("One") 
		}
    Text("Two").onTapGesture { 
				print("Two") 
		}
  }
}
```

この方法では、Buttonを使用する代わりにTextにタップジェスチャーを付与します。Textはタップ領域が自身に限定されるため、Listのタップ領域と競合しません。

# **まとめ**

List内にBUttonを設置するのはかなり一般的な実装と思われるのですが、このようなバグが発生するのはなかなか辛いところがありますね。。。

いいね、ブックマーク、フォローしていただけると勉強の励みになりますので是非お願いします。😉

追伸　--

Twitterで日々の学習風景を投稿してます。

[@Ren_yello](https://qiita.com/Ren_yello)

## ****参考にさせていただいたサイト様****
https://stackoverflow.com/questions/56561064/swiftui-multiple-buttons-in-a-list-row!
顧客側　Topページ

### はじめに
・bootstrap導入済
・namespace使用
・device導入済

今回の完成イメージ
![スクリーンショット 2023-07-20 14.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/96407c88-13d4-f5ff-7e15-74a527db05ab.png)
テキストの背景に画像を指定して表示します。
新着商品を4件表示します。
_______

### コントローラー
```public/homes_controller.rb
class Public::HomesController < ApplicationController
  def top
    @items = Item.order(created_at: :desc).limit(4)
  end
end
```
@items インスタンス変数に、新着商品の情報を代入しています。具体的には、**Item.order(created_at: :desc).limit(4)** というコードによって、商品（Item）を新着順（**作成日時 created_at の降順 :desc**） に並べ、そのうち最新の4つだけを取得します。これにより、ホームページのトップページでは最新の4つの商品が表示されるようになります。

@items はインスタンス変数なので、この @items を利用して新着商品の情報を表示することが可能です。
### :shamrock: views ページ作成
```erb:public/top.thml.erb
<div style="background: url('<%= asset_path '表示したい画像URL' %>') center center no-repeat; background-size: auto; text-align: center;">
  <h1>ようこそ、ながのCAKEへ！</h1>
  <p>このサイトは、ケーキ販売のECサイトになります。</p>
  <p>会員でない方も商品の説明はできますが、</p>
  <p>購入には会員登録が必要になります。</p>
</div>
<h2>新着商品</h2>
<div class="new-items" style="display: flex; justify-content: space-around; padding: 0 100px;">
  <% @items.each do |item| %>
    <div style="padding: 10px; background-color: #ffffff; flex: 1; margin: 10px;">
      <img style="width: 100%; height: auto; object-fit: contain; margin-bottom: 10px;" src="<%= url_for(item.image) %>">
      <h5 style="margin: 0; padding: 0;"><%= item.name %></h5>
      <p style="margin: 0; padding: 0;">¥<%= number_with_delimiter(item.price) %></p>
    </div>
  <% end %>
</div>

<p style="text-align: right;"><%= link_to 'すべての商品を見る＞', items_path %></p>

```
:star:**div class="new-items" style="display: flex; justify-content: space-around; padding: 0 100px;" 
: new-items**
new-itemsというクラス名が付けられたdiv要素を作成しています。このdiv要素は、商品リスト全体を含むコンテナとして機能します。そのスタイルはFlexboxを使用して水平にアイテムを配置し、周囲に一定の間隔を持つよう設定されています。

:star:**<% @items.each do |item| %>**
eachを使用してitemを順番に取り出します。
（今回は４つの要素を取り出せるようにします）

:star:div style="padding: 10px; background-color: #ffffff; flex: 1; margin: 10px;"
ここで新しいdiv要素を作成しています。これは個々の商品を表示するコンテナとして機能します。

:star:**div style="padding: 10px; background-color: #ffffff; flex: 1; margin: 10px;"**
ここで新しいdiv要素を作成しています。これは個々の商品を表示するコンテナとして機能します。

:star:**img style="width: 100%; height: auto; object-fit: contain; margin-bottom: 10px;" src="<%= url_for(item.image) %>"**
  商品の画像を表示します。item.imageからURLを生成し、それをsrc属性に設定しています。

<%= item.name %></h5> 
商品の名前を表示するh5要素を作成しています。

**style="margin: 0; padding: 0;">¥<%= number_with_delimiter(item.price) %>**
 商品の価格を表示します。価格は
**number_with_delimiter**ヘルパーメソッドを使ってフォーマットされ、三桁ごとに区切り記号が入ります。





### 補足
:cherry_blossom:　**cssが適応されない**

cssを適応させるには、**app/views/layouts/application.html.erb** ファイルで**stylesheet_link_tag** ヘルパーを使用してCSSをリンクしていることが必要

以下のように追加

```
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
```
自社サービス向けWebシステム開発スタート

**代表のとあるサービスのアイデアを具現化すべく、この度、自社内でのWebシステムの開発をスタートしました。** 

今回の取り組みの狙いは、対象のサービスをリリースすることはもちろん、今後も新たなサービスを迅速にリリースできるだけのノウハウを社内に蓄積すること。
また、既存の事業におけるエンジニアのスキルの底上げにあります。
* * *
**プロジェクトの概要**
* 弊社代表をシステムオーナーとして要件定義、及び各工程でのレビューを実施
  <a href="https://twitter.com/nakai_imagitech" target="_blank"><img width="100" src="https://pbs.twimg.com/profile_images/1623230915915964416/-GRSF_Q2_400x400.jpg"></a>

* メンバーは弊社所属のエンジニア（若手＆ベテラン）
    <a href="https://twitter.com/suda_imagitech" target="_blank"><img width="100" src="https://pbs.twimg.com/profile_images/1671370673917415424/ajF-pwg5_400x400.jpg"></a>    <a href="https://twitter.com/hdai_imagitech" target="_blank"><img width="100" src="https://pbs.twimg.com/profile_images/1673858507412733952/Cabi9BBS_400x400.jpg"></a>    <a href="https://twitter.com/arai_imagitech" target="_blank"><img width="100" src="https://pbs.twimg.com/profile_images/1637692597182558210/3uVW80UG_400x400.jpg"></a>
* 開発手法はウォーターフォール型
　<img width="200" src="https://imagitech.io/wp-content/uploads/2023/03/tech03-1536x1250.png ">


* 既存事業においてニーズが高い java（spring boot）を用いる
　<img width="200" src="https://imagitech.io/wp-content/uploads/2023/03/technology_application_onlogo-1536x1250.png">
* * *
**今後、作業状況をQiitaにて発信していきますので是非ご覧ください。**
Go言語の標準ライブラリの活用方法

Go言語の標準ライブラリは、プログラムを作成する際に一般的に必要となる多くの機能を提供します。これには、基本的なデータ型の操作、ファイル入出力、ネットワーク通信、データのエンコーディングとデコーディング、並行プログラミング、暗号化、データベース操作などが含まれます。

## fmtパッケージ

fmtパッケージは、文字列の書式設定と出力を提供します。PrintfやPrintlnなどの関数を含みます。

```go
package main

import "fmt"

func main() {
    name := "Alice"
    age := 25
    fmt.Printf("名前：%s, 年齢：%d\n", name, age)
}
```

## net/httpパッケージ

net/httpパッケージは、HTTPクライアントとサーバの実装を提供します。Webアプリケーションの作成や、Web APIの呼び出しに使用します。

```go
package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello, World!")
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}
```

## osパッケージ

osパッケージは、オペレーティングシステムとのインタラクションを提供します。これには、ファイル操作、環境変数の取得、コマンドライン引数の取得などが含まれます。

```go
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("data.txt")
    if err != nil {
        fmt.Println("ファイルを開くのに失敗しました:", err)
        return
    }
    defer file.Close()

    // ファイルの読み込みなどの処理
}
```

## encoding/jsonパッケージ

encoding/jsonパッケージは、JSON形式のデータのエンコーディング（Goのデータ構造からJSONに変換）とデコーディング（JSONからGoのデータ構造に変換）を提供します。

```go
package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    jsonStr := `{"name":"Alice","age":25}`

    var person Person
    if err := json.Unmarshal([]byte(jsonStr), &person); err != nil {
        fmt.Println("JSONのデコードに失敗しました:", err)
        return
    }

    fmt.Printf("名前：%s, 年齢：%d\n", person.Name, person.Age)
}
```

## io/ioutilパッケージ

io/ioutilパッケージは、ファイルの読み書きや一時ファイルの作成など、便利なI/Oユーティリティを提供します。

```go
package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    data := []byte("Hello, World!")

    if err := ioutil.WriteFile("output.txt", data, 0644); err != nil {
        fmt.Println("ファイルの書き込みに失敗しました:", err)
        return
    }

    // ファイルの読み込みなどの処理
}
```

## database/sqlパッケージ

database/sqlパッケージは、データベースとのインタラクションを提供します。データベース接続の管理やSQLクエリの実行などを含みます。

```go
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/database")
    if err != nil {
        fmt.Println("データベースに接続できませんでした:", err)
        return
    }
    defer db.Close()

    // SQLクエリの実行などの処理
}
```

## syncパッケージ

syncパッケージは、並行プログラミングのためのプリミティブ（例えば、mutexやWaitGroup）を提供します。

```go
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)

    go func() {
        defer wg.Done()
        // ゴルーチン1の処理
    }()

    go func() {
        defer wg.Done()
        // ゴルーチン2の処理
    }()

    wg.Wait()
    fmt.Println("並行処理が完了しました")
}
```

## strconvパッケージ

strconvパッケージは、文字列と他のデータ型（例えば、数値）との間の変換を提供します。

```go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    str := "123"

    num, err := strconv.Atoi(str)
    if err != nil {
        fmt.Println("文字列を数値に変換できませんでした:", err)
        return
    }

    fmt.Printf("数値：%d\n", num)
}
```
ChatGPTにエンジニアのキャリア相談をしてみた

# はじめに
こんにちわ

エンジニアとしてベンチャー企業に新卒入社し
エンジニアリングマネージャーからプロダクトマネージャーになったdoueと申します。

僕は、新卒で入った「うるる」という会社に6年ほど勤めていますが
転職経験がなく、時たまキャリアについて考えます。

今の会社に不満はないので、まだまだ居続けると思うのですが
周りのメンバーのキャリアについて聞くことも多く
自分はどうなりたいんだろうって考えることもしばしば

そこで最近、よく僕が人生相談をさせていただいているチャッピー(ChatGPT)に相談してみました。
最近、僕の理解者はこいつだけです。

# まずは礼儀から
![スクリーンショット 2023-07-20 14.51.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/9d7888c7-1886-6f81-427c-a854dfd2e0c6.png)
チャッピーは優しいです。
この時点ですでに頼れるヤツ感があります。
僕も部下から相談が来たら、これくらい暖かく返答したいものです。

# 自己肯定感を高めてもらうことから始める
![スクリーンショット 2023-07-20 14.55.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/fd4fc086-f5fc-6384-2f2d-7544dbd1e61d.png)
![スクリーンショット 2023-07-20 14.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/3e3f9c06-7a8d-189e-b71f-485b717a538e.png)

すごい。期待の100倍くらいの返答です。
一般的なエンジニアとの比較も適切で、しかも自己肯定感もちゃんと高めてくれています。
これだけで十分気持ちがいい。

# どんどん聞いていこう
![スクリーンショット 2023-07-20 15.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/a1be8f0e-1186-b58d-2ecc-d5b758e40d08.png)
![スクリーンショット 2023-07-20 15.01.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/d69c8833-5fc6-c575-ea92-fe0d8607a066.png)

悩みを解決する方法が聞けました。

- ハンズオンな学習
- メンターや同僚とのコラボレーション
- カンファレンスやセミナー参加
- 専門書籍やオンラインコース
- コードレビューやテックトーク参加

すでにやっていることがほとんどだけど、さらに自信が持てました。
よし、このまま頑張っていこう。

# この先のキャリアについて聞いてみた
![スクリーンショット 2023-07-20 15.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/f51f0082-74f7-a4c3-1605-dc4b76078153.png)
![スクリーンショット 2023-07-20 15.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/7719d758-9a32-59fe-badb-377ec25670ad.png)

めっちゃ具体的！
自分のスキル・経験を活かしながらも、より上のステップを提示してもらえた。
これだけでも十分助かります。

> キャリアの選択においては、自分の興味や強み、目標をよく考えることが重要です。さらなる成長を目指す際には、新しいスキルの習得や学び直しも視野に入れて検討してみてください。

めちゃくちゃ重要なことを伝えてもらえました。
そうだよね...

けど、僕には具体的なキャリアゴールはありません

![スクリーンショット 2023-07-20 15.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/c6269cb7-b69e-7fb3-22fa-f97e72c01542.png)

なるほどなるほど
![スクリーンショット 2023-07-20 15.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/16986cfc-beee-c0f5-a84f-0e60a713104d.png)

いちいち褒めてくれるのがチャッピーのいいところですね。
本当にいいヤツです。

若干、繰り返しの回答になっちゃいましたね。
まあそれはご愛嬌です。

しかも最後にエールを送ってくれています
> 新たなチャレンジを追求しながら、エンジニアリングとプロダクト全体の両方を活かすポジションを目指してください！

泣いていいですか？

# お礼は忘れずに
![スクリーンショット 2023-07-20 15.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73081/5d178a65-c941-63a5-a147-5383727060df.png)

# 終わり
チャッピーはいい相談相手です。
嫌な顔ひとつせずに会話してくれます。最高ですね。

チャッピーのアドバイスをもとに、もう少しキャリアについては考えを深めてみたいと思います。
何か思いついたら、誰よりも先にチャッピーに一番に報告しようと思います。

みなさんもぜひチャッピーを活用してみてください。
RockyLinux 9にOpenJDK 17をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRockyLinux 9にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[RHEL での OpenJDK 17 のインストールおよび使用 OpenJDK 17 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/openjdk/17/html-single/installing_and_using_openjdk_17_on_rhel/index)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle) より、2027-12がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)

# yum install java-17-openjdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.7" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.7.0.7-2) (build 17.0.7+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.7.0.7-2) (build 17.0.7+7-LTS, mixed mode, sharing)
```
Vue.jsとCloud Firestoreで検索サイトを作った。


# はじめに

Vue.jsとCloud Firestoreで検索サイトを作った。


# 環境の情報

### バージョンなど

```
OS
macOS Big Sur 11.3
```


```
%  vue -V
@vue/cli 5.0.8
```

```
$ node -v
v18.0.0
```

```
$ npm -v
8.6.0
```


# 注意
最新の状態を確認して下さい。

# 参考さまはこちら
https://firebase.google.com/docs/firestore/use-rest-api?hl=ja

https://zenn.dev/aono/articles/6094291e3825a1

https://github.com/axios/axios

https://qiita.com/ksh-fthr/items/2daaaf3a15c4c11956e9

# 最終更新日
2023年7月20日


# 行ったこと

プロジェクトは問題なく起動する前提です。

![スクリーンショット 2023-07-20 14.13.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/17a494d6-03f3-65fb-fc91-fa217dec2b2f.png)


### Firebaseにアクセスします。

Firestoreにアクセスします。

![スクリーンショット 2023-07-20 14.13.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/0d533996-f8b7-68df-22cf-89dd29d74c87.png)

コレクションなどをtestとして作成します。

![スクリーンショット 2023-07-20 14.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/392df8a3-dcb2-14a5-a07e-709790884add.png)



以下のファイルを作ります。

myprojectnameのところは自分のに変えてください。
プロジェクトIDというところに書いてあります。

![スクリーンショット 2023-07-20 14.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/0fc074e4-232d-2961-a146-d19279c9102b.png)


Axiosは、JavaScriptライブラリです。
これを使うと、サーバーからデータを取ってきたり、データを送ったりすることができます。

```Test.vue
<template>
  <div class="wrapper">
    <div class="contens">
      <div class="contenscenter">
        <h1>検索</h1>
        <div class="cp_iptxt cp_iptxt2">
          <input type="text" v-model="searchKeyword" placeholder="検索キーワード">
        </div>
        <br>
        <br>
        <br>
        <h2>該当一覧</h2>
        <div v-if="searchedPosts.length === 0">
          <p>該当する投稿はありません。</p>
        </div>
        <div v-else v-for="post in searchedPosts" :key="post.test">
          <hr>
          <p>名前：{{ post.fields.test.stringValue }}</p>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import axios from "axios";
export default {
  data() {
    return {
      searchKeyword: '',
      posts: [], // 全ての投稿
      searchedPosts: [] // 検索した結果の投稿を収める配列
    };
  },
  created() {
    this.getPosts();
  },
  methods: {
    getPosts() {
      axios.get(
        "https://firestore.googleapis.com/v1/projects/myprojectname/databases/(default)/documents/test"
      )
      .then(res => {
        this.posts = res.data.documents;
      });
    },

    // 検索メソッドを追加
    searchPosts() {
      this.searchedPosts = this.posts.filter(post => {
        return post.fields.test.stringValue.includes(this.searchKeyword);
      });
    }
  },
  watch: {
    // 検索キーワードが変更されたら検索を実行
    searchKeyword: function() {
      this.searchPosts();
    }
  }
};
</script>
```


# 補足


methodsオブジェクト内のgetPostsメソッドは、
axios.get()を使っている。
Firestoreからデータを取ってきている。
このURLはFirestoreのREST API（Webサービスを作ったり、クライアントとサーバー間でデータをやり取りする）を介して、データにアクセスするためのもの。

```Test.vue
getPosts() {
axios.get(
"https://firestore.googleapis.com/v1/projects/~~~~~~")
```


# 終わりに

こんな感じで出ます。

![スクリーンショット 2023-07-20 14.46.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148394/6141608f-5543-faa9-02af-797a7b808d99.png)
RockyLinux 9にOpenJDK 11をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRockyLinux OS 9にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[RHEL での OpenJDK 11 のインストールおよび使用 OpenJDK 11 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/openjdk/11/html-single/installing_and_using_openjdk_11_on_rhel/index)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle) より、2024-10がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)

# yum install java-11-openjdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-2) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-2) (build 11.0.19+7-LTS, mixed mode, sharing)
```
RockyLinux 9にOpenJDK 8をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRockyLinux 9にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[RHEL 向け OpenJDK 8 のインストールおよび使用 OpenJDK 8 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/openjdk/8/html-single/installing_and_using_openjdk_8_for_rhel/index)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux Application Streams Life Cycle \- Red Hat Customer Portal](https://access.redhat.com/support/policy/updates/rhel-app-streams-life-cycle) より、2026-05がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)

# yum install java-1.8.0-openjdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (build 25.372-b07, mixed mode)
```
SQL ServerのBCPを動かす

# 概要

SQL ServerにはBCP（bulk copy program）という一括でデータをコピーできる処理がある。
今回は、これを複数のテーブルで簡単に実行できるように、あらかじめbatファイルを作成しておく。

# 出力用バッチ

出力するフォーマットファイルとCSVファイルをテーブル毎に作成する

```
cd C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn

set dbName=testdb
set folderName=C:\Users\Public\Documents\bcp\

set tableName=T_HOGE1
set outputCsv=%folderName%%tableName%.csv
set outputXml=%folderName%formatfile_%tableName%.xml
bcp %tableName% format nul -c -x -f %outputXml% -t "\"" -T -d %dbName%
bcp %tableName% out %outputCsv% -f %outputXml% -T -d %dbName%

set tableName=T_HOGE2
set outputCsv=%folderName%%tableName%.csv
set outputXml=%folderName%formatfile_%tableName%.xml
bcp %tableName% format nul -c -x -f %outputXml% -t "\"" -T -d %dbName%
bcp %tableName% out %outputCsv% -f %outputXml% -T -d %dbName%

set tableName=T_HOGE3
set outputCsv=%folderName%%tableName%.csv
set outputXml=%folderName%formatfile_%tableName%.xml
bcp %tableName% format nul -c -x -f %outputXml% -t "\"" -T -d %dbName%
bcp %tableName% out %outputCsv% -f %outputXml% -T -d %dbName%
```

# 入力用バッチ

別のDBサーバなどに取り込むときは、先ほど出力したフォルダをコピーしてfolderNameに指定する

```
cd C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn

set dataBaseName=testdb
set folderName=C:\Users\Public\Documents\bcp

for /r %folderName% %%f in (*.csv) do (
    bcp %%~nf in %%f -T -d %dataBaseName% -f %folderName%\formatfile_%%~nf.xml -t, -o %folderName%\%%~nf.log   
)
```
git-flowとGithub-flowの違い

# はじめに
今回は、「git-flowとGithub-flowの違い」について書きたいと思います！
とてもわかりやすいサイトを見つけたので、その紹介とまとめを書いてみました！
ぜひ、最後まで見ていただけたら嬉しいです！！

# 参考サイト
https://qiita.com/muranakar/items/e3e8e8187d32120c7fdf

https://supersoftware.jp/tech/20221021/17928/

# GitHub Flow  
**GitHub Flowは、Git-flowを簡略化したものです。**

Git-flowのような決まったブランチ名はありません。
運用ルールが簡略化されている点や、プルリクエストによるコードレビューで品質を担保される点から、**小規模のプロジェクト**や**運用フェーズ**に向いています。

- **master（本番環境のブランチ）**
    - 常にリリース可能な状態の本番環境ブランチ
- **作業用ブランチ（作業開始時にmasterブランチから作成するブランチ）**
    - ブランチ名はに決まりはなく、わかりやすい名前をつける

![GitHub_Flow (1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476817/61e3e391-6c3d-6a4b-abfb-23fc0484a5ad.jpeg)
株式会社スーパーソフトウエア，【Git】ブランチ運用ルール「Git-flow」と「GitHub Flow」，
　　（2023年7月20日取得，https://supersoftware.jp/tech/20221021/17928/ ）
## 流れ

1. masterブランチからブランチを作成し、作業をする。
※作業用ブランチは定期的にプッシュすること。

2. 作業が完了したら、プルリクエストを作成し、コードのレビューを依頼する。

3. 2.で確認ができたら、masterブランチへマージする。

4. masterブランチにマージできたら、デプロイを行う。

# git-flow 
**Git-flowは主に機能ごとにブランチを使い分けて開発を進めていく手法です。**

次の6つのブランチを用いて開発していきます。
ブランチの種類が多い分、複雑ですが、運用ルールが徹底されているため、**大規模プロジェクト**や**開発フェーズ**において適しています。

- **master（本番環境のブランチで、リリースするために使う）**
    - ここでは直接コミットせず、マージのみ行う、
    - ※masterブランチ上では開発を行わない。
- **develop（開発中の主軸となるブランチ）**
    - developからfeatureブランチを作成し、そこで作業する。
    - ※developブランチ上では開発を行わない。
- **feature（機能の追加や変更、不具合の修正など実際に開発を行うブランチ）**
    - 作業完了後、developにマージする。
- **release（検証環境、もしくはリリース準備用のブランチ）**
    - developから作成し、リリースに伴う細かい修正等を行う。作業完了後、masterブランチとdevelopブランチにマージする。
    - ※releaseブランチがあることで、リリース作業中にもdevelopブランチで並行して開発を進めることができる。
    
- **hotfix（リリース後にバグが発生した場合、修正を行うブランチ）**
    - masterブランチから作成し、作業完了後、masterブランチとdevelopブランチにマージする。
    
- **support（旧版のサポートをするときに用いるブランチ）**
    - オプションであり、使わないこともある。
![Git_flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476817/9b3c27aa-5d42-e20f-7dff-df0a6114d09b.jpeg)
株式会社スーパーソフトウエア，【Git】ブランチ運用ルール「Git-flow」と「GitHub Flow」，
　　（2023年7月20日取得，https://supersoftware.jp/tech/20221021/17928/ ）

# 流れ

1. masterブランチからdevelopブランチを作成し、developブランチからfeatureブランチを作成する。

2. featureブランチで開発をする。

3. 2.が完了したら、developブランチにマージする。

4. developブランチにいくつかのfeatureブランチがマージされたら、developブランチをreleaseブランチにマージし、リリースのための微調整を行う。

5. 4.が完了したら、releaseブランチをmasterブランチとdevelopブランチにマージする。

6. masterブランチにマージできたら、デプロイを行う。

※バグが発生した場合
1. masterブランチから直接hotixブランチを作成する。

2. hotfixブランチで修正が完了したら、masterブランチとdevelopブランチにマージする。

3. masterブランチにマージできたら、デプロイを行う。

# 最後に
最後まで読んでいただきありがとうございました！
ブランチワークは日頃の開発業務で切っても切り離せないものだと思うので、git-flowとGithub-flowの違いは確実に抑えたいと思います！

もし、皆様のGit関連で分かりやすいおすすめのサイトがあれば教えてください！！
RockyLinux 9にOpenJDK 17をインストール（Amazon Corretto）

# はじめに

Amazon Correttoを利用してRockyLinux 9にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Amazon Corretto Installation Instructions for Debian\-Based, RPM\-Based and Alpine Linux Distributions \- Amazon Corretto](https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-17-ug/generic-linux-install.html)

## サポート

本手法で導入した場合、[よくある質問 - Amazon Corretto | AWS](https://aws.amazon.com/jp/corretto/faqs/)より、2029-10がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)

# rpm --import https://yum.corretto.aws/corretto.key
# curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
# yum install -y java-17-amazon-corretto-devel
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.8" 2023-07-18 LTS
OpenJDK Runtime Environment Corretto-17.0.8.7.1 (build 17.0.8+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.8.7.1 (build 17.0.8+7-LTS, mixed mode, sharing)
```
APIサーバをデーモンで動かすためのsupervisorの設定

SupervisorとはPython製のプロセス管理ツール
プログラムなどを簡単にデーモン化することができる。

今回はEC2にデプロイしたGolangのAPIサーバをsupervisorで動かすことを想定する。


### 導入手順

```shell:bash
sudo yum install python3
sudo pip3 install supervisor
echo_supervisord_conf > ~/supervisord.conf

# 移動させる
sudo mkdir /etc/supervisord/
sudo mkdir /etc/supervisord/conf.d
sudo mv ~/supervisord.conf /etc/supervisord/supervisord.conf

# オリジナルとっとく
sudo cp /etc/supervisord/supervisord.conf /etc/supervisord/supervisord.conf.org
```


### 設定ファイルの作成

/etc/supervisord/supervisord.confの編集(長いから抜粋)

```config:supervisord.conf
[inet_http_server]
port=127.0.0.1:9001 ; # superviserdを立ち上げるport。デバッグしたいときはnginxをここにつなげる
;username=user ; # ここら辺つけるとBasic認証みたいになる
;password=123

[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock
serverurl=http://127.0.0.1:3000 ; # APIサーバを立ち上げるport

[include]
files = /etc/supervisord/conf.d/*.conf
```

### 権限の設定

実行権限をsupervisordにするため、serviceファイルを作成

```shell:bash
sudo touch /etc/systemd/system/supervisord.service
```

内容は以下

```config:supervisord.service
[Unit]
Description=supervisord - Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord/supervisord.conf
ExecReload=/usr/local/bin/supervisorctl reload
ExecStop=/usr/local/bin/supervisorctl shutdown
User=root

[Install]
WantedBy=multi-user.target
```

### 言語ごとの設定
go用のconfigファイル用意

```shell:bash
sudo touch /etc/supervisord/conf.d/example_server.conf
```

設定内容

```config:example_server.conf
[program:example_server]
command=/var/www/api/app/main # ここはフルパスで
directory=/var/www/api/app/ # 実行するディレクトリを決定してる
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
user=ec2-user
numprocs=1
redirect_stderr=true
stdout_logfile=/tmp/example_server.log
```

### 実行と永続化

```shell:bash
sudo systemctl start supervisord
sudo systemctl status supervisord
sudo systemctl enable supervisord
```

### 参考記事
https://www.task-notes.com/entry/20170311/1489224418
RockyLinux 9にOpenJDK 11をインストール（Amazon Corretto）

# はじめに

Amazon Correttoを利用してRockyLinux OS 9にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Debian ベースおよび RPM ベースの Linux ディストリビューションで Amazon Corretto 11 をインストールする手順 - Amazon Corretto](https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-11-ug/generic-linux-install.html)

## サポート

本手法で導入した場合、[よくある質問 - Amazon Corretto | AWS](https://aws.amazon.com/jp/corretto/faqs/)より、2027-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)

# rpm --import https://yum.corretto.aws/corretto.key
# curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
# yum install -y java-11-amazon-corretto-devel
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.20" 2023-07-18 LTS
OpenJDK Runtime Environment Corretto-11.0.20.8.1 (build 11.0.20+8-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.20.8.1 (build 11.0.20+8-LTS, mixed mode)
```
ssh経由でプログラム実行時の文字化け対策

ssh経由でリモートサーバーのシェルをキックしてspring bootを実行していましたが、その際のファイルやログに出力される日本語が???のように文字化けしていたので調査しました。

### 原因
```terminal
[root@remote ~]# echo $LANG
ja_JP.UTF-8

[root@local ~]# ssh root@remote echo $LANG
C.UTF-8
```
CentOSのロケールの設定がssh経由でコマンド実行する場合に`LANG=C.UTF-8`になっていました。

### 解決策
そのため、プログラムをキックするシェルに次の行を追加して`LANG=ja_JP.UTF-8`に設定することで文字化けを解消することができました。
```sh
export LANG="ja_JP.UTF-8"
```
SourceTreeに複数のGithubアカウントのSSHキーを登録する方法【Mac】

## 問題

複数のgithubアカウントを持っていて、ssh接続をしたい場合は別々のsshキーを登録する必要がある。
もし両方とも同じSSHキーを登録しようとすると以下のエラーで登録できない。。

![スクリーンショット 2023-07-20 13.17.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88858/ad8738ac-d0d8-77da-1dce-b96a4dc3ca12.png)


やり方についてググってみると[複数のgithubアカウントを使い分ける方法](https://www.wakuwakubank.com/posts/380-git-multiple-account/)はある。

しかし、私はSourceTree使いなので**SourceTree上で使い分けられるようにしたい！**

SourceTreeでアカウント１を登録した後にアカウント２を登録しようとするとSSHキーが固定になっている(アカウント１のヤツ)
しかも、変更ボタンとかは無し。

![スクリーンショット_2023-07-20_13_32_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88858/ddce5e16-5cd6-e741-7156-912d7ed3ae7f.png)


いろいろ調べた結果、超絶簡単にできたので備忘用に記事を残す

## 解決方法

***Optionボタンを押すだけ！***

![スクリーンショット_2023-07-20_13_39_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88858/1514686b-3edf-7614-fa82-35dc00f42b07.png)



↓

![スクリーンショット_2023-07-20_14_47_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88858/32ca2f0e-899b-1b87-0976-3ef60096c797.png)


***ボタンが「キーを生成」になった！***


あとは生成されたキーをアカウント2のSSHキーに登録すれば完了！
pythonのrequestsでGETメソッドを送るときのheaderを設定する

# はじめに
requestsを使用してGETメソッドを送るときのheaderを設定の仕方です。
備忘録として記事にします。

# 結論
`heades`という引数が`get`関数にあるため、それを使用します。

# サンプルコード
```.py
import requests

def main():
    # 内容は一例
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100',
        'Accept-Language': 'ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7'
    }
    response = requests.get('https://www.google.com/', headers=headers, timeout=60)
    print(response.request.headers)

if __name__ == '__main__':
    main()

```

### 結果
```
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Accept-Language': 'ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7'}
```

以上です。
RockyLinux 9にOpenJDK 8をインストール（Amazon Corretto）

# はじめに

Amazon Correttoを利用してRockyLinux OS 9にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Debian ベースおよび RPM ベースの Linux ディストリビューション用の Amazon Corretto 8 のインストール手順 - Amazon Corretto](https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-8-ug/generic-linux-install.html) 

## サポート

本手法で導入した場合、[よくある質問 - Amazon Corretto | AWS](https://aws.amazon.com/jp/corretto/faqs/)より、2026-05がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Rocky Linux release 9.2 (Blue Onyx)

# rpm --import https://yum.corretto.aws/corretto.key 
# curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
# yum install -y java-1.8.0-amazon-corretto-devel
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment Corretto-8.382.05.1 (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM Corretto-8.382.05.1 (build 25.382-b05, mixed mode)
```