OmniAICreator/Qiita-1.07M huggingface dataset:
C言語で多次元配列を180度回転する方法

# 注意
・AtCoderの[abc004_B - 回転](https://atcoder.jp/contests/abc004/tasks/abc004_2)のネタバレあり。

# 学んだこと
・文字列を末尾から先頭の順番で出力するfor文の書き方。
・180度回転することは逆さまになること。


# 方針1
・多次元配列を180度回転したいので標準入力通りに受け取る。
・標準入力通りに受け取るのが確認できたら末尾から先頭の順番で受け取る。

# ACしたコード1
```C
#include <stdio.h>
int	main(void)
{
	char c[4][4];

	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			scanf("%s",&c[i][j]);
            // 標準入力と同じように出力できるかデバック
			// printf("%c",c[i][j]);
			// if(j == 3){
			// 	printf("\n");
			// }
		}
	}
	for (int i = 3; i >= 0; i--)
	{
		for (int j = 3; j >= 0; j--)
		{
			printf("%c",c[i][j]);
			if(j == 0){
				printf("\n");
			} else if(j != 0){
				printf(" ");
			}
		}
	}
	return (0);
}
```
# 方針2
・この問題は多次元配列を180度回転するということが理解できたので
・最初から末尾から標準入力を受け取れば良いと思った。

# ACしたコード2
```c
#include <stdio.h>
int	main(void)
{
	char c[4][4];

	for (int i = 3; i >= 0; i--)
	{
		for (int j = 3; j >= 0; j--)
		{
			scanf("%s",&c[i][j]);
			printf("%c",c[i][j]);
			if(j == 0){
				printf("\n");
			} else if(j != 0){
				printf(" ");
			}
		}
	}
	return (0);
}

```
Laravel sail × React × ViteでStorybookの導入で苦戦した話 

## 環境
Laraval 10 sail
React 18
Vite ^4.0.0

## 導入
Storybookの導入自体は公式でも他の技術サイトでも情報が載っているので、その通りにコマンドを実行します。
```
npx storybook@latest init
```
スタートページが表示されたので、localhost:6006にアクセス

このサイトにアクセスできません。
![スクリーンショット 2023-06-08 15.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671576/bd03feba-c6fa-2378-a2f2-11188c11a841.png)

？？

ファイアウォールなどの設定も特になし。
sailのDocker再起動しても状況変わらず、、、ぐぬぬ。

## 解決
Viteを使用している場合専用のオプションが必要でした。
```
npx sb init --builder vite
npm run storybook
```
成功！！
![スクリーンショット 2023-06-08 15.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671576/4a6ca136-bf6e-9ce0-b3f1-d30d75121ca6.png)

エラーの際に"Viteだからエラーです"的なものがあればすぐ解決できたけど、1時間くらい迷走しました。
現在時刻（日本時間）の取得、表示形式の変更方法【PowerAutomate】

## 現在時刻（日本時間）を取得する
「＋新しいステップ」から「変数を初期化する」アクションを選択します。
下の画像のようにアクションが追加されていたらOKです。
※検索バーで「変数」と入力すると候補が出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2258693/7dd03dc6-d441-2358-4426-8e9f603be0de.png)

次に「変数を初期化する」アクションに以下の内容を入力します。
* 名前：NowDate（任意の名前で大丈夫です）
* 種類：文字列
* 値：convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time')

「値」は枠内をクリックしたときに表示される画面右下の「式」に入力してください。
入力後はOKボタンを押すのも忘れずに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2258693/d55cb240-a7ed-49fd-3cf9-d775b50ff53f.png)

:::note info
convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time')　の説明

1. utcNow() を使って現在のタイムスタンプを取得します
2. convertTimeZone() を使って、取得したタイムスタンプをUTCからTokyo Standard Timeへと変換します
3. 返り値の型が文字列なので、「変数を初期化する」アクションの方も種類を文字列に合わせます 
:::

## 日付や時刻の表示形式を変更する
やり方は2通りあります。

### 1. 「タイムゾーンの変換」アクションを使う
「＋新しいステップ」から「タイムゾーンの変換」アクションを選択します。
※検索バーで「日時」と入力すると候補が出てきます

基準時間、変換元のタイムゾーン、変換先のタイムゾーンは必須入力、
書式設定文字列で好きなフォーマットを選択することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2258693/6c42a2f3-d2ab-90f9-908c-f015617aab85.png)

また以下の画像のように上記で取得した「NowDate」のフォーマットも変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2258693/f1951159-ff5a-64e8-e36c-47b5a8136a5f.png)

### 2. formatDateTime() を使う
再度「＋新しいステップ」から「変数を初期化する」アクションを選択し、以下の内容を入力します。
* 名前：HHmmDate（任意の名前で大丈夫です）
* 種類：文字列
* 値：formatDateTime(variables('NowDate'), 'HH:mm')

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2258693/b47c028f-3d19-15fc-aaa5-50c2bd51b629.png)

:::note info
formatDateTime(variables('NowDate'), 'HH:mm')　の説明

1. variables('変数名') で前のアクションで取得した変数を操作できます
2. formatDateTime() で「NowDate」の表示形式を「HH:mm」に指定します
3. 「HHmmDate」に 「HH:mm」形式の「NowDate」の値が格納されます
:::

## おわりに
結構フォーマットの種類がありますので、
フローのテストを行いながら実行結果を確認すると良いと思います。
【ServiceNow】「1列幅」の変数セットの中で一部を2列に設定する方法


変数セットを作成する際に、レイアウト項目で1列幅か2列幅かを選択しますが、
基本的には1列で表示したいものの一部分は2列表示にしたいときがあると思います。（逆も然り）

2列幅の変数セットを新たに用意することで対応できますが、
1列幅の変数セットの中でも2列幅表示を実装することができるのでその設定方法をまとめます。

## 事前準備
特にありません
開発者権限があれば誰でも実装可能です。

## 実装方法
①1列幅変数セットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/6eb335d6-603b-7665-2286-519d3171cb18.png)

②通常どおりに変数を追加していき、2列表示にしたい変数の上に「コンテナ終了」「コンテナ開始（※）」の順に変数を追加します。
　※「コンテナ開始」変数のレイアウトで2列幅を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/3df73f76-144a-feb1-6fac-ddfa681e0d80.png)

③1列表示に戻したい変数の上に「コンテナ終了」変数を追加します。

最終的には下記のように登録できたら完了です。
コンテナに挟まれたvariableA～Cだけが2列表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/502a3dbe-34ab-ef44-7748-0ed058576ff6.png)



## 動作確認
カタログアイテムを開いてみました。一部分だけ2列表示になっていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/315ad6e3-b7fb-0ec6-bc8e-7edf76dcf3e4.png)

## 終わりに
表示列数を変更するためだけに変数セットを量産する必要がなくなります。
小ネタではありますが意外と便利だと思います。是非試してみてください。
特定のclassのあるエレメントにReactのアプリを表示したい

# なぜ特定のクラスにReactのアプリを出したいのか？

通常、Reactは```<div id="root"></div>```というところにアプリを描画します。
index.htmlには上記divだけ置いて、SPAとして処理を行うことが多いでしょう。

ところが、レガシーなPHPに組み込む際、どうしてもReactを複数個所に設置したいときがあります。

たとえば、TODOリストを想像してください。
複数リストがあります。
そのリストの一番右にボタンをつくりたいわけです。
そのボタンを押したときの処理を含めて、Reactでつくりたい。

## どうすれば良いのか

```tsx:main.tsx
const elements = document.querySelectorAll(".target-class");

elements.forEach((element) => {
  ReactDOM.createRoot(element).render(<App />);
});
```

こうですね！
いつも1回しかReactDOM.createRootをしないと思いますが、elementsで拾ったところに出せば大丈夫です。

しかし邪道だと思うので、そもそもpreactとかlitでweb componentsにするべきでしょうな。
pdfのダウンロードにurlopenが使えなかった話

## はじめに
　趣味で個人開発してた時に、pdfダウンロードできず困りました…。初心者の備忘録なので、間違いがあればご指摘ください。


## urlopenでダウンロードするとpdfファイルが壊れてる…

```python
import urllib.request

data = urllib.request.urlopen(pdf_export_url).read()
with open(pdf_name, mode="wb") as f:
    f.write(data)
```

　上記のように`urlopen`でスプレッドシートをダウンロードし、ファイルの書き込みを終えるとpdfが破損していました。ダウンロード自体は出来ているようなのですが、書き込みがうまくいってないのか開けません。「なんでなん…」と悩みまくりました…。結局、なぜ開けないのかが解決できなかったので、次の形で解消しました。

```python
import requests

headers = {'Authorization': 'Bearer ' + credentials.create_delegated("").get_access_token().access_token}
res = requests.get(pdf_export_url, headers=headers)
with open(pdf_name, mode="wb") as f:
    f.write(res.content)
```

　`requests.get()`を使い、`headers`にはBearer認証で必要なトークンの情報をのせることでデータを引っ張ってきます。これで無事に開くことができました！Bearer認証も学べたので良かったです。

https://qiita.com/h_tyokinuhata/items/ab8e0337085997be04b1


## 参考

- [Pythonのファイルダウンロードにはurlretrieveではなくurlopenを使うべき理由 - Qiita](https://qiita.com/Kanahiro/items/dd585599f36a77540439)
- [Export data from the Google Sheet to PDF PYTHON - Stack Overflow](https://stackoverflow.com/questions/65049948/export-data-from-the-google-sheet-to-pdf-python)
FetchRequestするViewにPreview用のデータを渡してPreviewする

CoreData使用プロジェクトを新規作成した際のPersistenceControllerのままでいけるが、自身が忘れそうなので。


### 大事な点
- PersistenceControllerの静的変数previewにPersistenceController自身をセットする。そのcontainerプロパティのviewContextにpreview用データがsaveされる。
- environmentでmanagedObjectContextにpreview用コンテキストを設定する。

```View.swift
import SwiftUI
import CoreData

struct PeopleView: View {
    @FetchRequest(entity: Person.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Person.name, ascending: true)],animation: .default)
    var people: FetchedResults<Person>
    
    var body: some View {
                List(people){ person in
                    PersonRow(person)
                }
    }
}

struct PeopleView_Previews: PreviewProvider {
    static var previews: some View {
        PeopleView()
            .environment(\.managedObjectContext,
                          PersistenceController.preview.container.viewContext)//ここでpreview用viewContextをセット
    }
}

```

```PersistenceController.swift
import CoreData

struct PersistenceController {
    static let shared = PersistenceController()
    let container: NSPersistentContainer
    
//preview用viewContext置き場、viewContextにはpreview用データが入っている
    static var preview: PersistenceController = {
        let result = PersistenceController(inMemory: true)
        let viewContext = result.container.viewContext
        for i in 0..<10 {
            let newItem = Person(context: viewContext)
            newItem.name = "\(i)太郎"
            newItem.occupation = "エンジニア"
        }
        
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
        return result
    }()
    
    init(inMemory: Bool = false) {...}//CoreData使用プロジェクトを作成した際に作られる
}


```
【GithubActions】matrixを動的に生成してstepを回す

ActionsにチェックボックスUIを追加し､選択した項目についてstepを回すサンプルです｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692730/a83faa39-1323-d52a-2c23-8a59c652b7a3.png)
実行すると以下のように選択された"fuga"についてstepが実行されます｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2692730/940b899b-5781-d55c-2c20-2c54199c9f1e.png)

workflow
```yaml
name: example

on:
  workflow_dispatch:
    inputs:
      hoge:
        description: hoge
        required: false
        type: boolean
        default: false
      fuga:
        description: fuga
        required: false
        type: boolean
        default: false
      ...
jobs:
  set-matrix:
    runs-on: self-hosted
    outputs:
      target: ${{ steps.setmatrix.outputs.target }}
    steps:
      - name: Set dynamic matrix
        id: setmatrix
        run: |
          $tgts = @()
          $inputs = ConvertFrom-Json '${{ toJson(github.event.inputs) }}'
          foreach ($tgt in $inputs.psobject.Properties.Name) {
            if ($inputs.$tgt -eq "true") {
              $tgts += $tgt
            }
          }
          $tgts_str = $tgts -join '","'
          Write-Output "target=[`"$tgts_str`"]" >> $env:GITHUB_OUTPUT
  deploy:
    needs: set-matrix
    runs-on: self-hosted
    strategy:
      matrix:
        target: ${{ fromJson(needs.set-matrix.outputs.target) }}
    steps:
      - uses: actions/checkout@v3
      - name: deploy
        run: powershell -NoProfile -ExecutionPolicy Unrestricted $env:GITHUB_WORKSPACE\.github\example.ps1 ${{ matrix.target }}
```
備忘録：UnityEngine.VRが使えない

# 結論

**UnityEngine.XR** を使いましょう。

https://docs.unity3d.com/ja/2021.3/Manual/VRReference.html

## 詳細

https://portaltan.hatenablog.com/entry/2016/05/19/093704

こちらの記事を参考にHMDの傾きを取得しようとしましたが、
UnityEngine.VRが使用できないようでエラーが発生してしまいました。

調べた結果、ほぼ同じエラーケースに遭遇している方がいらっしゃったようです。

https://github.com/RenderHeads/UnityPlugin-AVProVideo/issues/587

どうやら、ある段階でUnityEngine.VRからUnityEngine.XRに名称が変更されたことによる弊害だそうです。

もう少し調べてみたところ、先駆者の方を発見。

https://bluebirdofoz.hatenablog.com/entry/2017/11/15/040859

2017.2で切り替わったみたいですね。
Wordpressの固定ページテンプレートファイルが増えすぎたのでフォルダにまとめたい

# 前提
固定ページテンプレートファイル`page-〇〇.php`は、本来は名前の通り固定ページの雛形なので、共通のレイアウトを作って、テータを流し込む時に使うものなのですが、実際には開発や管理上の都合から1ページ作るごとに固定ページテンプレートを作ってしまい、テーマフォルダの中に増えすぎて管理しづらい…となった経験はありませんか？

今回は、そんな時にフォルダに固定ページテンプレートファイルをすっきり収納する方法をやっていきます。

# テーマフォルダ直下に任意のフォルダを作る

まずはテーマフォルダ直下に特定の固定ページをまとめる用の任意のフォルダを作成します。
そして、その中に、どんどん固定ページテンプレートファイルを入れていきましょう。

# 移動させたテンプレートファイルを編集

任意のフォルダ内に入れたテンプレートファイルを開いて、ファイルの冒頭に以下のように記述します。
これを書いておくと、Wordpress管理画面の固定ページの編集画面のテンプレートという項目のセレクトボックスに、このファイルが表示されるようになります。

Template Nameは、page-と.phpを抜いたテンプレートファイル名を入れてください。

```php
<?php
    /*
    Template Name: テンプレートファイル名(page-と.phpを抜いたもの)
    Template Post Type: page
    Template Path: 任意のフォルダ名/
    */
```

参考：[Page Templates](https://developer.wordpress.org/themes/template-files-section/page-template-files/)

# function.phpを編集
function.phpに以下の記述を追加していきます。
テンプレート名は`page-`と`.php`を抜いた名称を入れます。
作った任意のフォルダ名/固定ページテンプレートファイル名の、固定ページテンプレートファイル名は`.php`を抜いた名称を入れましょう。

```php
    function custom_page_template($template) {
        $new_template = '';

        $page_templates = array(
            'テンプレート名' => '作った任意のフォルダ名/固定ページテンプレートファイル名',
            'abc_template' => 'abcfolder/page-abc_template',
            // 複数ある場合は以下に追加していく
        );

        foreach ($page_templates as $page_slug => $template_path) {
            if (is_page($page_slug)) {
                $new_template = locate_template(array($template_path));
                break;
            }
        }

        if (!empty($new_template)) {
            return $new_template;
        }

        return $template;
    }
    add_filter('page_template', 'custom_page_template');

```


# Wordpress管理画面で固定ページを新規作成
テンプレートファイルを表示させるためには固定ページ作成が必須です。

Wordpress管理画面を開いて、固定ページを新規作成をしましょう。
必要なのは以下です。

- 固定ページのタイトル
- テンプレートを選択
- URLをクリックしてスラッグを入力

![スクリーンショット 2023-08-08 18.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262827/5820372f-6a62-dbeb-7c31-752420bc3472.png)


※URLに入力するスラッグは、テンプレートファイルの`page-`と`.php`を抜いた名称を入れます。

できたら公開ボタンを押せばテンプレートファイルをブラウザで見ることができるようになります。
Macのcontrolキーを使いこなし隊

## tl;dr
### 全ての入力モードで使えるcontrol(`⌃`)キーのショートカット

|shortcut|アクション|覚え方|
|---:|:---|:---|
|`⌃a`|カーソルを文頭に移動|アルファベット初めの**A**|
|`⌃e`|カーソルを文末に移動|**E**nd|
|`⌃f`|カーソルを右に移動|**F**orward|
|`⌃b`|カーソルを左に移動|**B**ackward|
|`⌃p`|カーソルを上に移動|**P**revious|
|`⌃n`|カーソルを下に移動|**N**ext|
|`⌃l`|選択したテキストを、画面の中央に配置||
|`⌃o`|カーソルの後ろに空行を挿入||
|`⌃t`|カーソルの両脇の文字を入れ替える|**T**ranspose|

### 日本語入力モードで使えるcontrol(`⌃`)キーのショートカット
|shortcut|アクション|
|---:|:---|
|`⌃j`|入力中の日本語をひらがなに変換|
|`⌃k`|入力中の日本語をカタカナに変換|
|`⌃l`|入力中の日本語を全角ローマ字ｒｏ－ｍａに変換|
|`⌃;`|入力中の日本語を半角ローマ字ro-maに変換|
|`⌃⇧R`|入力後の日本語を再変換|
|`⌃3`|顔文字 ^_^|

## 「うん、よく使い道がわからない」
本当に？以下のような言葉、記号に覚えはないですか？

- 「建物名は全角英数字で入力してください」
- ようつべ。cおm
- （）
- 改善
- して見る

ナンとなく私の言いたいことが伝わったと思います。
世の中には隠れたストレスが多すぎる。。
それもこれもcontrolキーで解決できます！ってのが本記事の要点です。

### 「建物名は全角英数字で入力してください」
1. 建物名を日本語モードで入力
2. `⌃l`


例: メゾンA201
 → メゾン(`⏎`)Ａ２０１(`⌃l`)

### ようつべ。cおm → youtube.com

1. ようつべ。cおm
1. `⌃;`

### （） → ()

1. （）
1. `⌃;`
1. `⏎` (もしくはreturn)
1. `⌃b`

### ・ → /
1. ・
1. `⌃;`

### 改善 → カイゼン
1. 改善
2. `⌃k`

(なぜカタカナにする必要があるかはわからないが)

### して見る →　してみる
1. して見る
1. `⌃j`

## その他の設定で使えるショートカット(USキーボード使用者向け)

私がJISキーボードを使っていた頃、「かな」キーと「英数」キーが左右の親指で押しやすい位置にあるため、とりあえず「かな」キーを押してから日本語を入力したり、「英数」キーを押してから英語を入力していました。
![MK293J.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1833618/ea90a072-857d-7521-5048-843bcf1f22c1.png)

USキーボードになってからは画面右上で入力モードを確認していたのですが、上述のcontrolキーを使うようになってからはだいぶ楽になりました。
それでも、たまに英字入力モードのまま日本語を入力して→deleteキーを連打して→入力モードを変えて→再入力ということも起こります。
そこで、**JISキーボードの「かな」キーと「英数」キーの代わりになるのが`⌃⇧J`, `⌃⇧;`です**。

しかしそのためには、「日本語入力設定」を変える必要があります。
設定のKeyboard > Text Input > Input Source をEditで設定を開き、Japanese - Romajiを選択します。
デフォルトではInput modesがHiraganaだけが選択されていると思いますが、ローマ字を選択します。
(下図参照)
![Screenshot 2023-06-08 at 14.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1833618/c6c2466d-2580-9406-1828-73135d8f743b.png)

あとは簡単。入力前に日本語を入力したいなら`⌃⇧J`、英語を入力したいなら`⌃⇧;`を押すだけです。
嬉しいことに、この英語モードはUSキーボードの記号がそのまま使えます。
⇧8で`(`になり、⇧9で`)`になります。

## もう少し雑談
fnキー+F7/F8/F9/F10キーも使えるのですが、Fキーはホームポジションから離れているのでj,k,l,;が嬉しいです。

ちなみに、shift+spaceで半角スペースが入力できることをMacを使って6年目くらいで気づいた時は流石に情けなくなりましたね。もう少し早く気づけなかったのかと。。
まぁこれからもこまめにショートカットは調べたほうがいいですね
【Publisher】Import custom HTML code as a resource

In the article below, I pasted the created HTML code directly into the **Custom HTML** options editor.
[【Publisher】Creating KENDO DataSource with Sharperlight Query - UI:DropDownList](https://qiita.com/Miki_Yokohata/items/dd2e804ad4302ce2487d)
Here, I would like to introduce another method.
Create HTML code with a text editor such as `Visual Studio Code` and save it as a file.
Import that file into the Custom HTML option for a published query.

I wrote the code in `Visual Studio Code` like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dde70545-abe4-5c83-fbcb-95f72a682396.png)
Save this as an HTML file.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e4d46bb4-62a3-e9b9-45f8-74e5ccecc3f6.png)
## Published Query in Custom HTML Format ##
Start the Sharperlight Publisher and create a new published query or open an existing published query to use the Custom HTML option.
Go to Options tab.
### Published Query Resources ###
Bring in the saved HTML code file as a resource for published query.
Open the resource dialog with the `Edit` button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5f42c850-3916-b212-de5a-86dd1523a981.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/841bea04-0096-d425-2927-20a951638a91.png)
Start creating a resource with the `New` icon.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f3f42aa9-6aea-1fba-cc81-002ba161df53.png)
Select the added template and turn on the `File` option.
Specify and import the HTML file saved with the `Folder` icon.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/15ca1e81-961f-5922-6e2b-8adf3d903bbe.png)
Once the file is imported, use the `Copy` button in the `Reference` option to copy the resource code to the clipboard.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/060b4675-dc07-0d33-1f6c-aac3c3b0b744.png)
Close the resource dialog.

### Utilization of resources ###
Tick the 'Enable' checkbox for the **Custom HTML** option.
Click the `Edit` button to open the editor.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1fffff2b-da8d-4549-2758-281090803fb3.png)
Paste the resource code you copied to the clipboard earlier into the editor.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cdcf9fe9-d39f-90c3-5263-176cc66e337f.png)
Save with the `OK` button.
The HTML code is now imported into this published query.

## Postscript ##
The HTML code file is imported as a published query resource and its file path is also recorded.
So after making changes to the HTML code file and saving it, you can activate the changes by reopening this published query and updating/saving with the `Apply` or `OK` button.
16進数を10進数に変換する。1ノードでの実現

16進数を10進数に変換する方法は、@416nishimakiさんが以下の記事で紹介していました。

#### 16進数を10進数に変換する(SPSS Modeler データ加工逆引き3-18) - Qiita 

https://qiita.com/416nishimaki/items/3cd4af93f2b1e190e2c6

ただ、これはノードが多く、またデータ量が多いと時間がかかりがちでした。同じ処理を、たった１ノードで、さらに速く処理できる方法を、[SPSS春のユーザー会2021](https://www.ibm.com/blogs/solutions/jp-ja/smuc-2021-spring/)でもご発表をいただいた山口様からご紹介いただきましたのでご紹介します。

# 16進数を10進数に変換

以下のclem式になります。この式では5桁までに対応しています。
```python:16進数を10進数に変換するclem式
to_integer(substring(unicode_value(subscrs(length(V),replicate(0,"0")><V))*2-95,2,"00010203040506070809--------------101112131415")) * (16**0) +
to_integer(substring(unicode_value(subscrs(length(V),replicate(1,"0")><V))*2-95,2,"00010203040506070809--------------101112131415")) * (16**1) +
to_integer(substring(unicode_value(subscrs(length(V),replicate(2,"0")><V))*2-95,2,"00010203040506070809--------------101112131415")) * (16**2) +
to_integer(substring(unicode_value(subscrs(length(V),replicate(3,"0")><V))*2-95,2,"00010203040506070809--------------101112131415")) * (16**3) +
to_integer(substring(unicode_value(subscrs(length(V),replicate(4,"0")><V))*2-95,2,"00010203040506070809--------------101112131415")) * (16**4) 
```



各行が16進数の一桁に対応しています。1行目が1番右の桁で、5行目が一番左の桁です。最大の桁数によって行を減らしたり、増やしたりして利用してください。

以下のように変換できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e068804a-1005-abc2-deef-c77ad64e93db.png)

## サンプルストリームのダウンロード

https://github.com/hkwd/spsssample/raw/master/230606HEX2DEC/hexadecimal%2B1.str

# clem式の解説
少し詳しく説明します。

二行目の2桁目の処理に注目して読み解いていきます。
まず、
```python
replicate(1,"0")><V)
```
は桁数そろえのために行っています。

5桁までの16進数は
「1」のように1桁しかないものから「1E2A0」のように5桁すべてあるものもあります。そのため、5桁に足りていないものは「0」で補っています。
「0」なら「01」
「1E2A0」なら「01E2A0」になります。

```python
subscrs(length(V),replicate(1,"0")><V))
```
では右から2桁目の文字だけを切り出しています。
「01」なら「0」
「01E2A0」なら「A」になります。

そして、「unicode_value」でASCIIコード（正確にはUTF-8）に変換しています。
「0」なら48
「A」なら65になります。


これを「*2-95」することで
「0」なら1
「A」なら35に変換しています。

この値をつかって「substring」で
"00010203040506070809--------------101112131415"
から2文字ずつ取り出しています。これが16進数から10進数に変換した値になっています。
「1」なら「00」
「A」なら「10」が取り出されます。

最後に、
「to_integer」でこれを整数にして、16進数の二桁目でしたので、「* (16*\*1)」で16の1乗をかけています。
「00」=0* (16*\*1)=0
「10」=10* (16*\*1)=160

このようにすることで、「置換」ノードをふやさなくても一つの「フィールド作成」ノードで実現できるため、読みやすくなります。また、if文を使わずに変換が可能になり、5桁で２０％から３０％の高速化が実現しました。桁が増えればさらに効果が高まります。



## 参考

文字列関数
https://www.ibm.com/docs/ja/spss-modeler/18.4.0?topic=reference-string-functions
Ruby2.1技術者認定試験 Silver (例題解説).001

- ## 始めに
    先駆者の方々に習い、Qiitaの投稿練習としてRubySilverの問題の解説を書きます。
<br>
<br>

- ## 例題
    **Q .下記コードの実行結果を選べ。**
    ```ruby
    x = 12
    y = 6
    puts x / y unless y == 6
    ```
    ① true　② 6　③ nil　④ 2
    <br>
    
    :::note alert
    **解説をみる前に答えを予想してみて下さい。**
    
    ↓下に解説があります。↓

<br><br>
<br>
<br>
<br>
<br>
<br>


- ## 解説
    
    ```ruby
    unless y == 6
    ```
    
    `unless 条件` は条件が偽である(正しくない)場合のみ、定義した処理を行う条件分岐のメソッドです。
今回の場合は `y == 6` が真である(正しい)ので、先に書いた計算を行わず戻り値がない為 `nil` が表示されました。
    <br>
    <b>よって答えは　③ nil
    
    <br>
    
    検証の為、`y` に他の値を代入した場合や条件を変えた時は unless文の条件が偽となり、`x / y` の各計算結果が表示されました(以下実行例)。
    <br>
    ```ruby
    MyComputer% irb
    irb(main):001:0> x = 12
    => 12
    irb(main):002:0> y = 6
    => 6
    irb(main):003:0> puts x / y unless y == 6
    => nil
    irb(main):004:0> puts x / y unless y == 5
    2
    => nil
    irb(main):005:0> y = 4
    => 4
    irb(main):006:0> puts x / y unless y == 6
    3
    => nil
    irb(main):007:0> 
    ```
    <br>
    
- ## 最後に
   ここまで読んでいただき、ありがとうございました。
   **プログラミング的な解釈や文法**、**日本語的な文法**、**Qiita的な書き方**等で間違った点がありましたら修正を行いますので、指摘コメントを頂けると幸いです。
Ruby silver 模擬問題解説9

Ruby silverの模擬問題を抜粋して解説をしていきます。

下記コードを実行した出力結果を選びなさいという問題です。
```ruby
class Space
  @@address = "earth"

  def self.print_address
    puts "I came from the #{@@address}"
  end
end

class Planet < Space
  def self.print_address
    puts "I live on the #{@@address}"
  end
end

Space.print_address
Planet.print_address
```
1.（１）I came from the earth（２）I live on the earth
2.（１）I came from the earth（２）エラーになる
3.（１）I came from the earth（２）I live on the
4.（１）I live on the earth（２）I live on the earth

まず、'Space'というクラス名を定義します。
```ruby
class Space
end
```

次に、'@@address'というクラス変数に"earth"を初期値として定義します。
```ruby
@@address = "earth"
```

次に、Spaceクラスの為の'self.print_address'というメソッドを定義します。
その後、'puts "I came from the #{@@address}"'で@@adressを式展開をしてコンソールに出力されます。
```ruby
class Space
  @@address = "earth"

  def self.print_address
    puts "I came from the #{@@address}"
  end
end
```

次に、Planetというクラスを定義しSpaceクラスを継承させます。
```ruby
class Planet < Space
end
```

次に、Planetクラスの為の'self.print_address'というメソッドを定義します。
その後、'puts "I live on the #{@@address}"'で@@adressを式展開をしてコンソールに出力されます。
```ruby
class Planet < Space
  def self.print_address
    puts "I live on the #{@@address}"
  end
end
```
次に、Space.print_address: Spaceクラスのprint_addressメソッドを呼び出します。
Spaceクラスを使用するため、"I came from the earth"と出力されます。
```ruby
Space.print_address
```

最後に、Planet.print_address: Planetクラスのprint_addressメソッドを呼び出します。
Planetクラスでオーバーライドされたメソッドが実行されるため、"I live on the earth"と出力されます。
```ruby
Planet.print_address
```

解答としては１番になります。
Windows11のブラウザにてBUSICOM社製バーコードリーダーにてスキャン入力にてデータ欠落の問題

解決の結論はバーコードリーダーの文字間の読み取り速度を遅くし、人の手にて入力した様にする。
BUSICOM BC-BR1000Uの設定例を紹介。
下記の順番にてバーコードを本体で読ませると、４msで文字を順次読み取ります。（PCのスペック等にて時間を調整してください。）

![スクリーンショット 2023-06-08 13.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/6cf2bc6e-3720-a465-6c34-61b0eaaf3517.png)
![スクリーンショット 2023-06-08 13.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/df78e76c-68ac-71f0-49c2-f0c358207b33.png)
![スクリーンショット 2023-06-08 13.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/9b33a515-8b56-12b1-7944-0ca24a62a898.png)
![スクリーンショット 2023-06-08 13.47.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/08ba2df0-8bb3-0043-9b5d-3a1502e9d7a3.png)
![スクリーンショット 2023-06-08 13.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/b5824188-935b-2c52-d5d5-eac53bc542ae.png)
![スクリーンショット 2023-06-08 13.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/fbb11541-2835-1ac3-032e-40d349a17b43.png)
iOSショートカットレシピ コピーしたイベント情報をGoogleカレンダーに登録する

Webページで面白そうなイベントを見つけて、カレンダーに登録するときに、情報全体をコピーするだけでGoogleカレンダーのイベントにしてくれるショートカットアプリです。
VSCodeでGit Flowが確認できるGit Graph

# 概要
開発をしている時にGit Flowの状況がわからなくなってしまうことがあるかと思います。
Source treeを使えばすみますが、使わない現場もあったりします。

そこで　```Git Graph```をおすすめします。

# Git Graphの導入
VSCodeの拡張機能からGit　Graphをインストールしてください。

![スクリーンショット 2023-06-09 19.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/cd3d9af9-65ef-99c5-c0cd-ad7b9ed701ff.png)

# Git Graphの開き方
VSCodeの左側のバーにあるソース管理のGitのマークをクリックするとGit Graphを開くことができます。

![スクリーンショット 2023-06-09 20.03.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/6135be98-1029-a916-4749-53dfffb7a6a8.png)

# リポジトリーツリー
リポジトリーツリーを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/814ac260-c045-ed84-052a-c8f8172dc3a3.png)

> 引用　https://terrblog.com/%E3%80%90vacode%E3%80%91git-history%E3%81%8B%E3%82%89git-graph%E3%81%AB%E4%B9%97%E3%82%8A%E6%8F%9B%E3%81%88%E3%82%8B%E4%BA%8B%E3%81%AB%E3%81%97%E3%81%9F/

使い方は随時アップしていきます。よかったら下の資料も見てみてください。


# 資料

https://terrblog.com/%E3%80%90vacode%E3%80%91git-history%E3%81%8B%E3%82%89git-graph%E3%81%AB%E4%B9%97%E3%82%8A%E6%8F%9B%E3%81%88%E3%82%8B%E4%BA%8B%E3%81%AB%E3%81%97%E3%81%9F/

https://getech-lab.toniemon.com/vs-code-git-graph/#toc4
ABC304 - C - Virus 自己解法

# 問題
https://atcoder.jp/contests/abc304/tasks/abc304_c

# 考察
### まずは愚直にシミュレーションした場合の計算量を考える
まずは愚直にシミュレーションすると計算量がどうなるかを考えます。
$i<j$となる全ての$(i,j)$の組み合わせで以下の条件を両方満たすものを全探索します。両方満たしている場合は人$i$も人$j$も感染したといえます。
- 人$i$と人$j$の少なくとも一方が感染している。
- 人$i$と人$j$との距離が$D$以内である。

この全探索を1セットとします。Nセット繰り返せば十分に時間が経過したといえます。なぜなら十分に時間が経過していない間は新規の感染者が少なくとも1人出てるはずだからです。
ここまで書いておきながらなんですが、この通りに実装すると計算量が$O(N^3)$となります。$N≦2000$であることから実行時間制限に間に合いそうにないです。そこで他の方針を立てていきます。
### 人を頂点に見立てたグラフを考える
前置きが長くなりました。ここから計算量を落としていきます。そのために各人を頂点に見立てたグラフを考えてみます。感染経路になりえるのは距離が$D$以内の人同士です。そこで距離が$D$以内の頂点との間に辺を張ってみます。そうすると人$1$の頂点と連結した頂点の人は十分な時間が経過した頃には感染したといえるはずです。人$1$の頂点と連結しているかどうかは(深さ優先探索をする)、(幅優先探索をする)、(Union-Findを使用する)のいずれかをすれば小さい計算量で済みます。
ここまでを踏まえて以下の方針で実装を進めます。
1. サイズ$N$のUnion-Findを用意する。
1. 人$i$と人$j$の距離が$D$以内となる頂点同士を連結する。
1. 各人に対して人$1$と連結しているかを調べる。

この実装で進めれば2の部分が計算量$O(N^2)$で、それ以外は計算量が小さいため実行時間制限に十分間に合いそうです。
1つ注意点として、距離が$D$以内かどうかを判定するとき、ユークリッド距離の式をそのまま当てはめようとすると誤差が出る可能性があり、下手するとWAもあり得ます。$D,X_i,Y_i$の制約もそこまで大きくないため、判定する式を2乗したもので判定しましょう。具体的には以下の式です。
$$(X_i - X_j)^2 + (Y_i - Y_j)^2≦D^2$$

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc304/submissions/42044358

ご不明点などがあれば教えていただけると幸いです。
Oracle SQL Access to Kafkaを使ってOracle DatabaseからKafkaにクエリを実行する

# はじめに
先日<a href="https://www.oracle.com/database/free/" target="_blank" rel="noopener noreferrer">Oracle Database 23ai Free</a>がリリースされました。

たくさんの新機能がありますが、その1つである**Oracle SQL Access to Kafka**を本記事ではご紹介します。

# Oracle SQL Access to Kafkaとは
Oracle SQL Access to Kafka(OSaK)は、まずOracle Databaseを1つまたは複数のKafkaトピックに接続することができます。
接続後、Oracle SQL APIを使用して、Kafkaトピックに動的にクエリを実行できます。
この機能により、Oracle Databaseに取り込まれたデータと組み合わせて、リアルタイムにデータを分析することができます。また、Oracle SQL Access for Kafkaでは、KafkaトピックをOracle Databaseに高速、スケーラブル、ロスレスでロードすることができます。DBMS_KAFKA、DBMS_KAFKA_ADMパッケージで実行できるため、このプロセス全体をシンプルに実行することができます。

# メリット
ストリーミング処理を行うには、そのためのアプリケーションを開発する必要があり、アプリケーション開発者ではない人には、そのデータの価値を分かっていてもなかなか活用するのが難しいことがあります。

しかし、Oracle SQL Access to Kafkaを使えば、KafkaストリーミングデータをSQLを使って簡単に処理できるようになるので、アプリケーション開発者ではない人でもその恩恵を受けられるようになります。

また、Oracle Databaseにあるデータと組み合わせて、アノマリーデータ（特異的なデータ）や、オンラインでのデータ統合を実現できます。

Kafkaデータを処理するために作成するOracle SQL Access to Kafkaアプリケーションは、Oracle Databaseのトランザクションとして操作を実行・制御することができ、データベースのACID（Atomicity, Consistency, Isolation, Durability）要件に準拠します。
これにより、障害発生時にレコードを失ったり繰り返したりすることなく、データ復旧を行うことができるため、Kafkaデータの分離と耐久性の向上に役立ちます。

# 3つの機能
Oracle SQL Access to Kafkaには主に3つの機能があります。

+ **ロード**：KafkaレコードをOracle Databaseのテーブルにロードし、様々なアプリからアクセス可能にする（主にデータウェアハウス(DWH)用途）
+ **ストリーミング**：KafkaレコードをSQLやPL/SQLを使って順番に加工処理するアプリケーションの作成
+ **シーカブル**：ユーザが指定したタイムスタンプ間で、Kafkaトピックにあるレコードを再読み込みする

また、複数のストリーミング・アプリケーションを作成し、複数のKafkaトピックのデータをデータベース内で結合させることもできます。

# ユースケース
上で挙げた主な3つの機能については、例えば以下のユースケースがあります。

複数の拠点を持っているコンピューター会社があるとします。各拠点へのアクセスはすべてカードキーで管理されており、以下のデータがKafkaでストリーミングされています。

+ キーカードの使用状況 (KCdata)
+ 施設モニタリング（Fdata）
+ システム監視（稼働率、アクセス、侵入検知など） (Sdata)

ある拠点で何か問題が起きた場合、その日のキーカードのデータ（KCdata）をKafkaからOracle Databaseのテーブルにロードします。Oracle Databaseのデータは複数のアプリケーションからすぐに参照することができるので、例えば不動産チームがビルやオフィスの使用状況を追跡することに使用したり、IT部門が、誰がその拠点にいて指揮を取るべきかをこのデータから判断することに使えます。

また、ストリーミング・アプリケーションを作成して、施設データ（Fdata）に異常があるかどうかを確認することもできます。研究室の温度の急上昇、ドアが閉まらずアラームが鳴っている、火災検知システムがアラームを鳴らしているなど、さまざまな原因があるかもしれません。

ストリーミング・データから、午前3時17分にドアが開いたままになっていることを確認できました。シーカブル・クエリを使用すると、30分以内（3:02～3:32）に他の複数のデータ（KCdata、Fdata、Sdata）から、誰が建物にいたか、どの部屋にいたか、どのマシンがオフラインになったかなど、データを特定し、状況に対して適切な対応を取ることができます。

# 使用例
大まかな使用手順としては、以下です。
①Kafkaクラスタにアクセスするために必要な設定ファイルを作成し、適切なディレクトリに配置
②DBMS_KAFKA_ADM.REGISTER_CLUSTERプロシージャでKafkaクラスタを登録
③各機能のアプリケーションを作成

それぞれの機能の具体的な手順については、以下の記事で紹介していますので、ご参照ください。
+ ロード

https://qiita.com/wahagon/items/fdcaea3dfc90c9fc5227
+ ストリーミング

https://qiita.com/wahagon/items/70d8ea13d5561828ab40
+ シーカブル

https://qiita.com/wahagon/items/90ffcac60307af54481e
 
# サポートしているデータ形式
+ csvなどの区切りテキストデータ
+ JSON
+ Avro

# 参考情報
<a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/oracle-sql-access-to-kafka.html#GUID-EA66FD41-16B6-4E3F-A5ED-8C1897F1988F" target="_blank" rel="noopener noreferrer">Oracle SQL Access to Kafka</a>
python関連

テストページ。
import streamlit as st
import numpy as np
import pythreejs as p3
from pythreejs import *

def main():
    # SolidWorksファイルのアップロード
    file = st.file_uploader("SolidWorksファイルをアップロードしてください", type=["sldprt", "sldasm"])
    if file is not None:
        file_content = file.read()
        st.write("アップロードが完了しました")

        # 3Dオブジェクトの表示
        geometry = create_geometry(file_content)
        mesh = create_mesh(geometry)
        scene = create_scene(mesh)
        controller = create_controller(scene)
        st.write(controller)

def create_geometry(file_content):
    # SolidWorksファイルからジオメトリを作成する処理を実装する
    # この例では、pythreejsのジオメトリを作成する関数を使用しています
    geometry = create_your_geometry_from_solidworks(file_content)
    return geometry

def create_mesh(geometry):
    # ジオメトリからメッシュを作成する処理を実装する
    material = MeshLambertMaterial(color='red')
    mesh = Mesh(geometry=geometry, material=material)
    return mesh

def create_scene(mesh):
    # メッシュをシーンに追加する処理を実装する
    scene = Scene(children=[mesh, AmbientLight(color='white')])
    return scene

def create_controller(scene):
    # シーンを表示するコントローラを作成する処理を実装する
    controller = p3.Renderer(camera="perspective", scene=scene, controls=[OrbitControls(controlling=scene.camera)])
    controller.width = 500
    controller.height = 500
    return controller

if __name__ == "__main__":
    main()
WKWebViewでキーボードを展開中に画面がスクロールされたらキーボードを閉じる

タイトルママ

## 設定方法
- `UIScrollViewDelegate`を定義
```
final class WebViewModel: NSObject, ObservableObject, WKNavigationDelegate, WKUIDelegate, UIScrollViewDelegate {
```

- delegate登録
```
webView.scrollView.delegate = self
```

- webviewにkeyboardDismissModeを設定
```
webView.scrollView.keyboardDismissMode = .onDrag // 画面ドラッグしたとき、キーボードを閉じる
```


## おまけ：キーボードの表示/非表示の監視
- キーボードの表示/非表示を監視
```
// キーボード表示通知を登録
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)

// キーボード非表示通知を登録
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
```

- キーボード表示/非表示されたときの処理
```
    // キーボードが表示されるときの処理
    @objc func keyboardWillShow(_ notification: Notification) {
        print("Keyboard will show")
    }
    
    // キーボードが非表示になるときの処理
    @objc func keyboardWillHide(_ notification: Notification) {
        print("Keyboard will hide")
    }
    
    deinit {
        // NotificationCenterの登録解除
        NotificationCenter.default.removeObserver(self)
    }
```
【パブリッシャー】カスタムHTMLコードをリソースとしてインポートする

以下の記事では、作成したHTMLコードをカスタムHTMLオプションのエディタに直接貼り付けました。
[【パブリッシャー】Sharperlightクエリーを利用したKENDO DataSource - UI:DropDownList](https://qiita.com/Miki_Yokohata/items/daec3abd756f078567ba)
ここでは、もう一つの方法を紹介したいと思います。
HTMLコードを`Visual Studio Code`などの専用エディタで作成しファイルとして保存します。
そのファイルをカスタムHTMLオプションにインポートします。

このように`Visual Studio Code`でコードを記述しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dde70545-abe4-5c83-fbcb-95f72a682396.png)
これをHTMLファイルとして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e4d46bb4-62a3-e9b9-45f8-74e5ccecc3f6.png)
## カスタムHTML形式の公開クエリ ##
Sharperlightパブリッシャーを起動して、カスタムHTMLオプションを使用する公開クエリを新規作成するか、もしくは既存の公開クエリを開きます。
オプションタブに移動します。
### 公開クエリのリソース ###
保存したHTMLコードファイルを公開クエリのリソースとして取り込みます。
`編集`ボタンでリソースダイアログを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bed9492f-d2ed-29ba-25bd-4196b446ca8a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d8ed96a8-aa80-dd7d-2ae4-061031bd2830.png)
`新規`アイコンでリソースの作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/676b6273-b226-b693-adcf-a9c44ae9a53e.png)
追加されたテンプレートを選択し、`ファイル`オプションをオンにします。
`フォルダ`アイコンで保存したHTMLファイルを指定しインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f06e2025-4070-53eb-67e1-e8e0a387537d.png)
ファイルがインポートされたら、`参照`オプションで`コピー`ボタンを利用して、リソースコードをクリップボードにコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bc76586f-9982-cab7-39c4-33de35d9efb3.png)
リソースダイアログを閉じます。

### リソースの利用 ###
**カスタムHTML**オプションの`有効`チェックボックスにチェックを入れます。
`編集`ボタンをクリックして、エディタを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0dd2ff45-faa2-a528-81aa-16175e49f450.png)
エディタに先ほどクリップボードにコピーしておいたリソースのコードを貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c41e705e-4ff5-6957-9cc6-da52795c705e.png)
OKボタンで保存します。
これでHTMLコードがこの公開クエリにインポートされました。

## あとがき ##
HTMLコードファイルは公開クエリのリソースとしてインポートされ、そのファイルパスも記録されています。
よってHTMLコードファイルに変更をかけて保存した後、この公開クエリを再度開き`適用`あるいは`OK`ボタンで更新/保存することで変更を有効にすることができます。
Auroraメンテナンス適用


Auroraのメンテナンスを適用した際の手順と作業時間をメモ

## 経緯
AWSから「New Operating System update is available」を2023/5/6までに適用していないと自動適用する旨の案内を受領。
ただ、DBインスタンスに保留中のメンテナンス「New Operating System update is available」の表示がない。
案内メールにクラスターの保留中のメンテナンス「Upgrade to Aurora PostgreSQL 11.16.5」を適用しないとDBインスタンスの「New Operating System update is available」は表示されない旨の記載あり。

もし5/6までに手動で適用しなかった場合はクラスターのメンテナンスも適用されるらしいので、手動でクラスターのメンテナンスとDBインスタンスのメンテナンスを適用することとなった。


## 環境
##### DB クラスター
　エンジン：Aurora postgresql 11.16
　キャパシティータイプ：シングルマスター
　リージョン：ap-northeast-1

##### DB インスタンス
　インスタンスクラス：db.r5.large
　AZ(ライター)：ap-northeast-1c
　AZ(リーダー)：ap-northeast-1d


## 手順
### 1. DBクラスター-メンテナンス適用

(1) AWS Management Console にサインインし、Amazon RDS コンソールを開く
(2) ナビゲーションペインで、[データベース] を選択
(3) DBのクラスター名を選択し、[メンテナンスとバックアップ]タブを開く
(4) 保留中のメンテナンスを選択し、[今すぐ適用]を押下
(5) DBクラスターのステータスが[利用可能]となることを確認


### 2. リーダーインスタンス-メンテナンス適用

(1) DBのリーダーインスタンス名を選択し、[メンテナンス]タブを開く。
(2) 保留中のメンテナンスを選択し、[今すぐ適用]を押下
(3) DBインスタンスのステータスが[利用可能]となることを確認


### 3. DBインスタンスフェイルオーバー

(1) リーダーインスタンスを選択し、[アクション] - [フェイルオーバー]を押下
(2) DBインスタンスのリーダーとライターが逆になったことを確認


### 4. (元)ライターインスタンス-メンテナンス適用

操作方法は「2. リーダーインスタンスメンテナンス適用」と同じのため割愛

### 5. DBインスタンスフェイルオーバー

操作方法は「3. DBインスタンスフェイルオーバー」と同じのため割愛



## 作業時間
<table>
  <thead>
    <tr>
      <th>作業名</th> <th>時間</th>
    </tr>
  </thead>
  <tr>
    <td> DBクラスター-メンテナンス適用 </td> <td>18分</td>
  </tr>
  <tr>
    <td> リーダーインスタンス-メンテナンス適用 </td> <td>14分</td>
  </tr>
  <tr>
    <td> DBインスタンスフェイルオーバー </td> <td>2分</td>
  </tr>
  <tr>
    <td> (元)ライターインスタンス-メンテナンス適用 </td> <td>12分</td>
  </tr>
  <tr>
    <td> DBインスタンスフェイルオーバー </td> <td>1分</td>
  </tr>
</table>



## 余談
実際は[リーダーインスタンス-メンテナンス適用]は40時間以上かかった。
ライターインスタンスを基に新たなリーダーインスタンスを作成し、新リーダーインスタンスにメンテナンスを適用すると上記の時間で終了した。

40時間かかったことはそのうち投稿するかも…？
【Error/conda】activateにできないとき

# 問題
condaでacitvaeしようとしたら失敗してしまったので、解決策を探しました。

下記へのエラーの対処法を備忘録として残します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/185d582b-c0d4-2bb3-1d53-4fe5ba242cde.png)


### 環境
Windows11
Anaconda Prompt

# 解決方法

Anaconda Powershell Promptを「管理者として実行する」で管理者権限で起動してください。

## pscondaenvsをインストール

```
conda install -n base -c pscondaenvs pscondaenvs
```

## スクリプトによる実行を許可する

```
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```

下記のように「ポリシーを変更しますか？」と聞かれるので、「Yse」で続行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784589/f7892494-4e3b-2f78-2dcd-111e03442fac.png)

これでactivateできるようになりました。

参考にした記事

https://create-it-myself.com/error-resolve/resolve-what-venv-doesnot-change-in-powershell/

https://qiita.com/TrashBoxx/items/877caf785b20758ba7e0
リモートリポジトリのソースコードを持ってきて開発に参加したい【後から開発に参加する時仲間に入れてもらう方法】

# 前提
他の人のやっているプロジェクトの開発に入ることになったとき、githubやBitbucket、Backlogの「リモートリポジトリにソースコードはあるからね」と言われたとき…

具体的にはどんな作業を行なって、ソースコードを持ってくればいいのかまとめました。

gitはPCへインストール済みのところからスタートします。

# プロジェクトファイルを作りたいフォルダを用意するか、そこへ移動
ソースコードを持ってきたいフォルダ(ディレクトリ)を決めましょう。
新しくフォルダを作ってそこで管理したいようでしたら、フォルダを作ります。

# git clone
そして、そのフォルダをvs codeで開きます。

vs codeのターミナルを開いて、以下のコマンドを入力します。

```
$ git clone リモートリポジトリURL
```

# git init
次に自分のリポジトリを以下のコマンドでgitが使えるように初期化します。

```
$ git init
```

# あとはお好みで使いましょう
あとは、masterブランチにいる状態へ編集してしまうと多分怒られると思うので、`$ git checkout - b 'ブランチ名'`などして、自分のブランチを作って開発を進めましょう！
TuringPi v1 （あまりに時間がかかって腐った）　探偵編

# 稼働に持ち込むも・・・
TuringPi の扱いというか、CM3+ の扱いは慣れが必要でした。

* CM3 の 初期化の方法

eMMC に何も書いていない状態で売られているので、bootも何もしません。TuringPiのシリアルコンソールも最初は disable になってますので、ここをクリアする必要があります。
たまたま、壊れかけのmacBookAirが転がっているので、TuringPiまたは、評価基板のslaveコネクタ-USBケーブルでつないでイジってやることができます。　こいつに usbboot を突っ込んでコンパイルしてやると、CM3の eMMCを直付ハードウェアとしてマウントできるようになり、イロイロウフフとなります。

* 結局の所 TuringPi の他にも評価基板は要る

稼働している TuringPi から引っ剥がした CM3を修復することになったりすると、いちいちマスターまで剥がしてやる必要があって、実用的ではありません。WaveShareから買った評価基板は必要です。

# 10分で死ぬシステム？？

奇妙なことに、放置して置くと、個々のノードが動いていたり動かなくなったりするのに気が付きます。
特定のノードは10分ちょっとで応答がなくなります・・・

<pre>
64 bytes from 192.168.1.153: icmp_seq=419 ttl=64 time=0.611 ms
64 bytes from 192.168.1.153: icmp_seq=420 ttl=64 time=0.612 ms
From 192.168.1.156 icmp_seq=438 Destination Host Unreachable
From 192.168.1.156 icmp_seq=439 Destination Host Unreachable
</pre>
なんてこったい。　

1分単位でチェックすると10分を越えないところできちんと死んでくれやがります。
何度も試しています。何が動くのでしょう HypriotOSの何かが悪いんでしょう？？

<pre>
Jun  7 08:33:28 node2 kernel: [   31.959825] Bridge firewalling registered
Jun  8 02:15:23 node2 root:  02:15:23 up 1 min,  0 users,  load average: 0.42, 0.14, 0.05
Jun  8 02:16:01 node2 root:  02:16:01 up 1 min,  0 users,  load average: 0.22, 0.13, 0.05
Jun  8 02:17:02 node2 root:  02:17:02 up 2 min,  1 user,  load average: 0.08, 0.10, 0.04
Jun  8 02:18:01 node2 root:  02:18:01 up 3 min,  1 user,  load average: 0.03, 0.08, 0.04
Jun  8 02:19:01 node2 root:  02:19:01 up 4 min,  1 user,  load average: 0.01, 0.06, 0.03
Jun  8 02:20:01 node2 root:  02:20:01 up 5 min,  1 user,  load average: 0.00, 0.05, 0.02
Jun  8 02:21:01 node2 root:  02:21:01 up 6 min,  1 user,  load average: 0.00, 0.04, 0.02
Jun  8 02:22:01 node2 root:  02:22:01 up 7 min,  1 user,  load average: 0.00, 0.03, 0.01
Jun  8 02:23:01 node2 root:  02:23:01 up 8 min,  1 user,  load average: 0.00, 0.02, 0.01
Jun  8 02:24:01 node2 root:  02:24:01 up 9 min,  1 user,  load average: 0.00, 0.02, 0.00
</pre>

理由が判らないので、泣いています。　チップの温度じゃないでしょうねぇ。空冷ファン付けてるし、温度だったら、即再起動してもその度10分ちょうどということはない。犯人探しが始まります。
こんな探偵ごっこは大変です。相手は海賊。

続く。
ネットワーク (2) : Target (VPN接続) -> Kali(Linux) -> 外部接続

# Target (VPN接続) -> Kali(Linux) -> 外部接続

ネットワークシリーズの第二弾です。

Red Team Operation等で、攻撃端末から内部へVPNで接続しているのですが、接続先のターゲットからこの端末経由で外部接続させたいときがあります。今回はSSHとChiselを利用した接続例を解説します。

参考
https://0xdf.gitlab.io/2020/08/10/tunneling-with-chisel-and-ssf-update.html

ネットワーク概要
Target (eth0): 10.129.XX.XX/16
Kali: 10.10.14.XX/23
外部サイト: www.exploit-db.com:443

今回は、Chiselを利用します。

https://github.com/jpillora/chisel

https://github.com/jpillora/chisel/releases/tag/v1.8.1

## Kali
chiselのクライアントとサーバー間でのプロトコルを設定します。Kali側はサーバになります。
```bash
./chisel server --port 9000 &
```
## Target 
ターゲット側は、クライアントとなります。
```bash
./chisel client kali-ip:9000 9001:www.exploit-db.com:443 &
```
これで、ターゲット側から以下を叩いてみてください。
```bash
wget https://127.0.0.1:9001
```
www.exploit-db.com:443は通信できているはずです。

ハッピーハッキング！
ブランチ切って編集中にmasterにpushされてしまった時の対処法

# 前提
gitでブランチを切って編集している間に、誰かにmasterブランチ(mainブランチの人もいるかも)へ、git pushされてmasterブランチの内容が変更されてしまったという経験はないでしょうか？

そんな時の対処法です。

# ひとまず自分のブランチの変更内容をstashして一時保存する
自分のブランチの編集が終わったら、以下のコマンドで変更を一時保存しておきます。

```
$ git stash
```
これでステージングエリアやインデックスにある変更内容を一時的に保存されました。

# masterへ移動して変更内容をpull(同期)

masterへ移動して、変更内容をローカルへ落として同期させます。

```
$ git checkout master
$ git pull
```

# 自分のブランチへ戻って、masterの変更内容を同期
masterの変更内容を自分のブランチへ落として同期させます。

```
$ git checkout 自分のブランチ名
$ git merge master
```

# スタッシュから自分の編集内容を呼び出す
いよいよ、自分の変更内容を以下のコマンドで戻します。

```
$ git stash apply
```

ここでコンフリクトが起きた場合は解決しましょう。

# あとはいつも通り、git commitやgit push
ここまできたら、いつも通りgit commitやgit pushをして、プルリクなどを行いましょう。
Auroraマイナーバージョンアップ(11.8 → 11.16)

オンプレとは違いAuroraは強制バージョンアップがあるので今後同作業が発生した時の参考用に、以前Auroraのマイナーバージョンアップを実施した際の手順と作業時間をメモとしてここに残します。

## 環境
##### DB クラスター
　エンジン：Aurora postgresql
　キャパシティータイプ：シングルマスター
　リージョン：ap-northeast-1

##### DB インスタンス
　インスタンスクラス：db.r5.large
　AZ(ライター)：ap-northeast-1c
　AZ(リーダー)：ap-northeast-1d

##### EC2
　インスタンスタイプ：c5.large
　AZ：ap-northeast-1d
　OS：Red Hat Enterprise Linux 7.7
　導入済みパッケージ：postgresql11-11.10-1PGDG.rhel7.x86_64
　　　　　　　　　　　postgresql11-libs-11.10-1PGDG.rhel7.x86_64


## 手順
### 1. DBスナップショット取得

 (1) AWS Management Console にサインインし、Amazon RDS コンソールを開く
 (2) ナビゲーションペインで、[データベース] を選択
 (3) DB インスタンスのリストで、DB クラスターのライターインスタンスを選択
 (4) [アクション]→[スナップショットの取得] の順に選択
 (5) [DB スナップショットの取得] ウィンドウの[スナップショット名] ボックスに DB クラスタースナップショットの名前を入力


### 2. マイナーバージョンアップ

(1) DBのクラスタを選択し、[変更]を押下
(2) エンジンバージョンを「Aurora PostgreSQL (Compatible with PostgreSQL 11.16)」を選択
(3) [すぐに適用]を選択して[次へ]、[DBインスタンスを変更]を押下


### 3. ANALYZE
(1) EC2から以下のコマンドを実施し、DBインスタンスに接続
```
$ psql -h ＜Auroraエンドポイント＞ -p ＜ポート番号＞ -d ＜データベース名＞ -U ＜データベース接続ユーザ名＞
```

(2) ANALYZEコマンドを実行
```
> ANALYZE;
```

(3) データベース接続を切断
```
> \q
```

## 作業時間
※環境やデータ量等により異なります。

<table>
  <thead>
    <tr>
      <th>作業名</th> <th>時間</th>
    </tr>
  </thead>
  <tr>
    <td> DBスナップショット取得 </td> <td>6分</td>
  </tr>
  <tr>
    <td> マイナーバージョンアップ </td> <td>17分</td>
  </tr>
  <tr>
    <td> ANALYZE </td> <td>1時間45分</td>
  </tr>
</table>
クラスとインスタンスの練習

クラスとインスタンスを使って、出力結果がこうなるようにしたい。

```
著者: うさぎさん
タイトル: プログラミングの楽しさ
本文: Hello World　！
```

```ruby
class Book

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

end
```

答えはこちら。

```ruby
class Book

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

  def author
    @author
  end

  def title
    @title
  end

  def content
    @content
  end

end

article = Book.new("うさぎさん", "プログラミングの楽しさ", "Hello World!")
puts "著者: #{article.author}"
puts "タイトル: #{article.title}"
puts "本文: #{article.content}"
```

Book,newでインスタンスを生成し、変数articleに代入します。その際に、うさぎさん、プログラミングの楽しさ、Hello World!の3つ実引数を指定します。

initializeメソッドを定義して、インスタンス変数を宣言しました。実引数として指定した値を、仮引数のauthor、 title、contentにそれぞれ渡しています。

そうすることにより、initializeメソッドで宣言されたインスタンス変数に、うさぎさん、プログラミングの楽しさ、Hello World!という3つの値が代入されます。

上記インスタンス変数の値を返すための専用のメソッドをそれぞれ定義しています。

最後に、定義づけたメソッドを呼び出しています。
Amazon SNSのDVA試験用メモ

# はじめに
Amazon SNSでDVA試験に出題されそうなところにつてメモ代わりに残しておきます。

## Amazon SNSとは？
>Amazon Simple Notification Service (Amazon SNS) は、配信者から受信者 (または生産者から消費者) へのメッセージ配信を提供するマネージドサービスです。発行者は、論理アクセスポイントおよび通信チャネルであるトピックにメッセージを送信することで、受信者と非同期的に通信します。クライアントは、Amazon Kinesis Data Firehose、Amazon SQS、AWS Lambda、HTTP、E メール、モバイルプッシュ通知、モバイルテキストメッセージ (SMS) などのサポートされたエンドポイントを使用して SNS トピックにサブスクライブし発行されたメッセージを受信できます。

https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html

SNSがPublisher(発行者)とSubscriber(購読者)の間に入り、Publisherが発行したメッセージや通知をSubscriberに届ける。

- Publisher
 メッセージの配信者。メッセージを「Topic」に配信する。
- Topic
 「Publisher」と「Subscriber」をつなげるアクセスポイント。「Publisher」からメッセージを受け取り、「Subscriber」に渡す。
- Subscriber
　「Publisher」が「Topic」に配信したメッセージを受け取る人。

## Topicの種類
「スタンダード」と「FIFO」の2種類がある。
- スタンダード
順序は保証されない。重複は排除せず、配信する。
- FIFO
メッセージグループで順序が保証される。重複を排除し、1回のみ配信する。

FIFOでは順序が保証されるが、あくまで同一のメッセージグループの場合のみ。

https://docs.aws.amazon.com/ja_jp/sns/latest/dg/fifo-example-use-case.html

## 重複排除
FIFOのTopicに発行する場合は、重複排除IDを含める必要がある。
重複排除IDを持つメッセージがTopicに発行された場合は5分間の重複排除インターバルの間はメッセージを受け取るがSubscriberに配信しない。

https://docs.aws.amazon.com/ja_jp/sns/latest/dg/fifo-message-dedup.html

## セキュリティ
暗号化されるのはメッセージの本文のみ。そのほかは対象外となる。

## マルチリージョンへの配信
**別リージョン**のSQSとLambdaにメッセージの配信が行えるようです。

https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-cross-region-delivery.html
Microsoft IMEの句読点の設定をPowerShellで書き換える

# はじめに
[このあたりの資料](https://ri2t.kyushu-u.ac.jp/~watanabe/RESERCH/MANUSCRIPT/OTHERS/YOKO/ten.pdf)でも言われているように、句読点の種類は複数あり、仕様書の体裁も取引先のフォーマットに従わなければならない。違うフォーマットを要求している仕様書を、同時並行で書かなければならなくなった際、句読点を切り替えたいと思う時があった。

Windows11のMicrosoft IMEの設定は次の写真のように、4種類の句読点が設定されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197285/d2e72796-24eb-0fa7-775e-615a6125b270.png)
もちろん、GUIで設定を変更するのであれば簡単なのだが、いちいちクリックするのは面倒である。そこでコマンドプロンプト等のCUIベースで切り替えられるようにしたいと考えた。

# IMEの設定はレジストリにある


https://registry.tomoroh.net/archives/category/ime

http://smart-pda.net/software/Pocket%E3%81%AE%E6%89%8B/Chapter-110009.html/

このようなサイトを参考にしたところ、`HKEY_CURRENT_USER:\Software\Microsoft\IME\15.0\IMEJP\MSIME`にMicrosoft IMEの設定があることが判明した。
また、GUIで設定を変更しながら、レジストリエディタを起動して眺めていると、私の環境では`option1`のデータ値（10進数表記）が「、。」の場合`1376768`、「，。」の場合`1507840`であることが分かった。

# PowerShellで書き換える
レジストリに書かれてあるならば、コマンドプロンプトだろうとPowerShellだろうと、書き換えられる。そこで、今回はPowerShellを使って句読点を変更できるようにしてみた。

```powershell:change_punctuation.ps1
Add-Type -AssemblyName System.Windows.Forms;
$now_option1 =  (Get-ItemProperty HKCU:\Software\Microsoft\IME\15.0\IMEJP\MSIME).option1
$text = "現在の句読点が認識できません（Value=$now_option1）。`r`n「、 。」に変更しますか？";
$chenge_to = 1376768;

if($now_option1 -eq 1376768){
	$text = "現在の句読点は「、 。」です。`r`n「，。」に変更しますか？";
	$chenge_to = 1507840;
}elseif($now_option1 -eq 1507840){
	$text = "現在の句読点は「，。」です。`r`n「、 。」に変更しますか？";
	$chenge_to = 1376768;
}

$caption = "句読点の変更確認";
$buttonsType = "OKCancel";
$iconType = "Question";
$result = [System.Windows.Forms.MessageBox]::Show($text, $caption, $buttonsType, $iconType);
if($result -eq [System.Windows.Forms.DialogResult]::OK){
	Set-ItemProperty HKCU:\Software\Microsoft\IME\15.0\IMEJP\MSIME -Name option1 -Value $chenge_to
}
```
これを適当な場所に設置し、「右クリック」→「PowerShellで実行」を押すと確認ダイアログが出現する。おそらく、似たようなことがbatファイルでも出来る（regコマンド）と思われるが、今回はそこまでは手を出していない。

https://windows.command-ref.com/cmd-reg-add.html

# おわりに
[レジストリを無暗に編集するとOSが大変なことになる可能性](https://youtu.be/FoF18WM5daM)があるので、実行は自己責任で。
　

以上。
AWS ECS Execの利便性を高めるショートカットコマンドの作成

## AWS ECS Execのショートカットコマンドを作りましょう
AWS ECSでExecコマンドを実行する際、通常はAPIやConsoleを介してタスクIDを取得し、そのIDを用いてコマンドを実行します。これは手間がかかりますよね。そこで、タスクID取得からExecまでの一連の流れを一気に実行するショートカットコマンドを作成する方法をご紹介します。

まずは、以下のショートカットコマンドを ~/.zshrc に追記します。
 
```shell:~/.zshrc
ecs_exec_command() {
    # Check if the right number of arguments are passed
    if [ $# -ne 3 ]; then
        echo "Usage: ecs_exec_command <cluster> <container> <service>"
        return 1
    fi

    # Get the parameters
    cluster=$1
    container=$2
    service=$3

    # Command to execute
    command="/bin/sh"

    # Get the list of task ARNs for the service
    taskArns=$(aws ecs list-tasks --cluster $cluster --service-name $service --query 'taskArns' --output text)

    # If there are no tasks, exit
    if [ -z "$taskArns" ]; then
        echo "No tasks found for service $service in cluster $cluster"
        return 1
    fi

    # Get the first task ARN
    taskArn=$(echo $taskArns | awk '{print $1}')

    # Get the task ID from the task ARN
    taskId=${taskArn##*/}

    # Execute command on the task
    aws ecs execute-command \
    --cluster $cluster \
    --container $container \
    --interactive \
    --command "$command" \
    --task $taskId
}


```

このショートカットコマンドは <cluster> <container> <service> の3つの引数を受け取り、`aws ecs list-tasks`コマンドでタスクIDを取得した後`aws ecs execute-command`でExecを実行します。

しかし、毎回これらの引数を指定するのは面倒なので、プリセット値を使用するラッピング関数を作成します。これを使えば、引数を渡すだけで簡単にExecを実行できます。

以下に、そのラッピング関数を示します。こちらも ~/.zshrc に追記します。


```shell:~/.zshrc
pj-ecs-exec() {
  # Check if the right number of arguments are passed
  if [ $# -ne 1 ]; then
      echo "Usage: ecs_exec_command <container>"
      return 1
  fi

  # Get the parameters
  preset_container=$1

  # Your preset cluster, container and service
  preset_cluster="your-cluster-name"
  preset_service="your-service-name"

  # Call the ecs_exec_command function
  ecs-exec-command $preset_cluster $preset_container $preset_service
}

```

`preset_cluster`, `preset_service`に事前に入れておけば、
以下のコマンドでcontainerを引数にするだけで実行できます。

```shell
$ pj-ecs-exec nginx
```


このように、ショートカットコマンドとラッピング関数を利用することで、AWS ECS Execの利便性を格段に向上させることができます。ぜひ一度お試しください。