OmniAICreator/Qiita-1.07M huggingface dataset:
GAS 任意の文字列を返すGETのエンドポイントを作成してみる

## 概要

GASを使ってmessageのキーバリューとqueryのキーバリューを返すGETのAPIエンドポイントを作ってみようと思う。

## 内容

どうやらGASはメソッド名（`doGet()`）でGETなどのメソッドを指定するらしい。

1. 下記の様なGASのコードを記載

    ```js
    function doGet(e) {
      const response = {
        message: 'Hello, world!',
        query: e.parameter
      };
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
    }
    ```

1. 「デプロイ」をクリックし「新しいデプロイ」をクリック

    ![CleanShot 2024-11-21 at 14.24.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fdce9d82-ef95-3412-8c59-22122f36c88f.jpeg)

1. 歯車マークをクリックし「ウェブアプリ」をクリック
1. 必要な情報を入力して「デプロイ」をクリック

    ![CleanShot 2024-11-21 at 14.24.44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6e3ed0c2-06f2-dfb6-5ec9-a9e7c220d796.jpeg)

1. ウェブアプリのURLが表示されたら「コピー」をクリックしてメモ
1. 下記をターミナルで実行してmessageとqueryが返ってくれば完了

    ```terminal
    curl -L -X GET "先にコピーしたウェブアプリのURL"
    ```

    レスポンスの例↓

    ```
    {"message":"Hello, world!","query":{}}
    ```


## 参考文献

https://qiita.com/minimumskills/items/f2e8802664324e8b5981

https://developers.google.com/apps-script/reference/content/content-service?hl=ja

https://developers.google.com/apps-script/reference/content/content-service?hl=ja#createTextOutput(String)

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify


https://developers.google.com/apps-script/reference/content/text-output?hl=ja#setMimeType(MimeType)


https://developers.google.com/apps-script/reference/content/mime-type?hl=ja
GAS 任意の文字列を返すPOSTのエンドポイントを作成してみる

## 概要

GASを使ってmessageのキーバリューとqueryのキーバリューを返すPOSTのAPIエンドポイントを作ってみようと思う。

## 内容

どうやらGASはメソッド名（`doPost()`）でPOSTなどのメソッドを指定するらしい。

1. 下記の様なGASのコードを記載

    ```js
    function doPost(e) {
      console.log('関数は実行されました');
    }
    ```

1. 「デプロイ」をクリックし「新しいデプロイ」をクリック

    ![CleanShot 2024-11-21 at 15.54.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2c6272aa-c7bf-dbff-04c3-537f64d4b27a.jpeg)

1. 歯車マークをクリックし「ウェブアプリ」をクリック
1. 必要な情報を入力して「デプロイ」をクリック

    ![CleanShot 2024-11-21 at 15.52.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/659d5e5c-631d-fade-8009-9303ff9d79db.jpeg)


1. ウェブアプリのURLが表示されたら「コピー」をクリックしてメモ
1. 下記をターミナルで実行してmessageとqueryが返ってくれば完了

    ```terminal
    curl -L -X POST "先にコピーしたウェブアプリのURL" \
     -H "Content-Type: application/json" \
     -d '{"key1":"value1", "key2":"value2"}'
    ```

    特段戻る値が無いのでターミナルには下記のように表示される

    ```terminal
    スクリプトが完了しましたが、何も返されませんでした。
    ```

1. GASのサイドバーの実行数にアクセスし、ターミナルから実行したくらいの時間に実行されていることを確認して実行されていれば完了


## 参考文献

https://qiita.com/minimumskills/items/f2e8802664324e8b5981
AWS EC2踏み台サーバから目的の内部IPにSSH接続する

## 目的

ローカルマシンから目的のEC2に内部IP指定でSSH接続したい。

## コマンド(結論)

```shell
# ~/.ssh/config
Host fumidai
    User ec2-user
    HostName XXX.XXX.XXX.XXX # 踏み台サーバの外部IP
    IdentityFile ~/.ssh/my_keypair.pem
Host instance1
   User ec2-user
   HostName 10.1.10.100 # SSH接続したいEC2の内部IP
   IdentityFile ~/.ssh/my_keypair.pem
   ProxyCommand ssh -CW %h:%p fumidai
```

```shell
# ローカルマシンからinstance1に接続する
ssh instance1
# ダメなときはまずこれが入れるかどうかを確認
ssh fumidai
```

## 背景

AWSを利用しているとき、すべてのインスタンスに外部IP(ElasticIP)を付与するのは現実的ではありません。
踏み台サーバとして1台のみを外部IPをもち、そこにSSH接続してから、目的の内部IPにアクセスするなどします。
コンソールから接続ボタンを押す方法でもよいのですが、CLI好きなひとはこうしたいはず。

## 動機

プロジェクトにはいるたび調べてるな？と思ったので作業メモです。
Cloud Run functions × TypeScript 開発をしよう！【まえがき】

# はじめに
JavaScriptが好きだ。

ブラウザでサクッと動かすことができる。おしゃれなウェブサイトを作ることができる。サーバサイドも全然書ける。なんならデスクトップアプリも作れちゃう。スマホアプリも余裕で作れちゃう。自由に書けすぎちゃうという欠点を補う型付きで書けるTypeScriptなんてものも生まれちゃう。
本来はブラウザに動きをつける程度だったJavaScriptをここまで色んなことをできるようにしてくれた、僕以上にJavaScript好きの~~変態~~天才達に畏敬の念を感じずにはいられない。

僕も一端のJavaScript好きとして Cloud Run functionsでゴリゴリTypeScriptを書ける環境の構築方法を紹介してみようと思う。あまり情報がなく苦戦したので、誰かのお役に立てられたら嬉しいです。

:::note
校閲、修正依頼、アドバイスなど大歓迎です。よろしくお願いします。
:::

# 対象読者
- 自分初心者かもって思っている人
- TypeScript × Cloud Run functionsの開発環境構築に困っている人
- GCP環境に TypeScript × Cloud Run functions環境をデプロイする方法に悩んでいる人
- 個人開発したてで TypeScript × Cloud Run functionsでの開発を見切り発車で始めたものの、その情報のなさに困っている人

# この記事でしないこと
Cloud Run functionsがどういうものかを詳しく説明すること。
公式ドキュメントで詳しく説明してくれています。

https://cloud.google.com/functions/docs/concepts/overview?hl=ja

# 使用するサービス / ツール

### VSCode（Version: 1.95.3）
コーディングに使用する（当たり前）

https://code.visualstudio.com/

### GitHub
Github Actionsで CI/CD をやってみるために利用

https://github.co.jp/

### Google Cloud Platform（GCP）
サービスを置いておく場所。インフラ環境はここに作る

https://console.cloud.google.com/?hl=ja


### PC
MacBook Pro
Apple M2 Pro Chip
MacOS sonoma v14.5

# 使用しないツール
### Docker
一人で開発する + Dockerfileを書くのが面倒くさかったりあえてDockerを使う理由がないため使わない
IDMC上に式マクロを使ってみました

<h1> 1. はじめに </h1>

現代のビジネス環境では、企業が多様なデータソースを効果的に活用し、迅速な意思決定を行うことが求められています。  
**Informatica Intelligent Data Management Cloud (IDMC)** の **Cloud Data Integration (CDI)** は、これらのニーズに応えるクラウドネイティブなデータ統合プラットフォームです。

CDIは、異なるデータソースをシームレスに接続し、高速で信頼性の高いデータ処理を可能にします。直感的に操作できるGUIを活用することで、複雑なデータフローも簡単に設計できます。

こうしたCDIの中には、さまざまな便利な機能が含まれていますが、今回はその中でも**式マクロ**に焦点を当ててご紹介します。

---

<h1> 2. 式マクロとは </h1>

**式マクロ**は、IDMCのCDIにおける強力なデータ処理ツールです。複数のフィールドや定数に対して、一括で計算や処理を実行できるため、効率的なデータ操作が可能になります。

### 主な特徴

- **柔軟性**: 処理対象を任意に指定でき、特定のフィールドや条件に応じたロジックを適用可能。
- **効率性**: 重複するロジックを統一し、メンテナンス負荷を軽減。

たとえば、複数のフィールドで`null`値を置き換える処理や、販売データに基づいてラベルを付ける操作を式マクロで簡単に実現できます。

---

<h1> 3. 式マクロの使い方 </h1>

以下の手順に従って、IDMCのCDIで式マクロを作成および活用する方法を解説します。

---

<h2> 3.1. マッピングの作成と式トランスフォーメーションの追加 </h2>

1. CDIで新しいマッピングを作成し、ソースデータとターゲットを接続します。  
2. **式トランスフォーメーション**のコンポーネントをキャンバスに追加します。

![式トランスフォーメーションの例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/a66afacc-b25c-7f48-a5ba-a108df638556.png)

---

<h2> 3.2. マクロ入力フィールドの設定 </h2>

1. **式トランスフォーメーション**のプロパティを開き、新しいフィールドを追加します。  
   - 一般的に`Output Field`を選択しますが、ここでは**Input Macro Field**を選択してください。  
2. この`Input Macro Field`は、一括処理の対象となるフィールドをグループ化します。名前は任意で設定可能です。

![マクロ入力フィールドの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/189e377c-9af9-5507-d5c8-52981239e2a7.png)

次に、`Input Macro Field`で処理対象フィールドを選択します。以下の3つのオプションがあります：
- **All Incoming Fields**: 全てのフィールドを選択。
- **Named Fields**: 指定したフィールドのみを選択。
- **Fields by Text or Pattern**: 特定のパターンに一致するフィールド名を選択。

### Named Fieldsを選択する場合
指定したフィールドにチェックを入れるだけで設定が完了します。

![Named Fieldsの設定例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/ceafbfe2-9277-768d-5806-755c34496009.png)

### Fields by Text or Patternを選択する場合
正規表現やフィールド名パターンを設定します。

![パターンによるフィールド選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/ee1baf19-c85f-f6e6-5a53-4be7abd3b99e.png)

今回は、`Named Field`を選択し、任意のフィールドを指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/4b4465e0-8f94-e1fc-04d9-b7e9c340d822.png)

---

<h2> 3.3. マクロ出力フィールドの設定 </h2>

1. **Output Macro Field**を追加します。このフィールドは、マクロ処理後の結果を格納するためのものです。  
2. `Input Macro Field`を参照し、接尾辞（Suffix）や接頭辞（Prefix）を設定することで、出力フィールド名が自動生成されます。

![マクロ出力フィールドの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/2d21b011-a60f-47a8-ebc1-901ef9f1c124.png)

---

<h2> 3.4. 式の設定とプレビュー </h2>

1. `Output Macro Field`に対して計算式を設定します。今回は、フィールドの値に`"Macro_"`というPrefixを追加する式を使用しました。  

式の設定にInput Macro Fieldを使えますが、ただValidateをクリックして、式を検証すると「マクロフィールドを使っているため検証できない」メッセージが表示されます。これは式が間違っているわけではないので、無視してOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/465d1a3e-52b0-4041-7225-8cf9bd654ed9.png)

2\. 設定後、式トランスフォーメーションをプレビューして、結果を確認します。結果が予想通りであれば、ターゲットに出力フィールドをマッピングするだけで完了です。

![プレビュー結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/d8609688-7eb0-9234-5caf-494715308999.png)

---

<h1> 4. まとめ </h1>

IDMCのCDIにおける**式マクロ**は、複数フィールドに対する一括処理を効率的に行える強力な機能です。柔軟性、効率性を兼ね備えており、大量データ処理の課題を解決する手助けとなります。

今回の解説を参考に、皆さんのプロジェクトでも式マクロを活用してみてください！
Cursorのチャット機能が動作しない場合の対処法

最近cursorでAI　chat機能内で文字がタイプできなくなりました、解決方法を見つけたので共有します!


Cursorのバージョン0.43.5を使用している際に、チャット機能が動作しない問題が報告されています。以下の手順で問題を解決できます。

## 問題の概要
- チャット入力欄に文字を入力できない。
- 入力欄が空白のまま反応しない。

## 解決方法
1. **チャットをエディタタブに移動**
   - チャットを通常のサイドペインからエディタタブに移動します。
   - エディタタブでチャットが動作することを確認します。
Open caht as Editorボタンを押すと単体のタブとして開きます
[スクリーンショット 2024-12-02 9.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836918/6960933d-1e8f-f5ee-2cd9-f51fb2437fe3.png)
2. **サイドペインに戻す**
   - チャットがエディタタブで動作することを確認した後、再度サイドペインに戻します。
   - これで通常通りチャットが動作するはずです。

## 参考情報
- [Cursor Community Forumの投稿](https://forum.cursor.com/t/cant-type-in-chat/31447)によると、同様の問題が報告されており、上記の方法で解決されています。
松屋でコーラ一本に数時間待たされた話（クソ記事です）

# 松屋に行った話
妙にカツ丼が食いたくなり松屋へ行ってきた。カツ丼を頼んで、食べ終わったのだが、前にTwitter（旧X）で見た100円のコーラが飲みたくなり、モバイルオーダーで注文した。そうしたら1時間ほど待たされた。コーラは美味かったが普通に笑えない。
# 似たような事例を...
これに似た事例をこのqiitaというコミュニティの記事を読んでいるみなさんは経験したことがあるだろう。多分。
そう、これは（未完）
GCP Error ReportingをSlack連携する

# やりたいこと

GCP Error Reportingが便利なのでSlackに連携する

# Slack App作成

https://api.slack.com/apps/ からSlack Appを作成

`OAuth & Permissions` からScopeは以下のように設定

![Screenshot 2024-12-02 at 9.21.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/7d0d5d61-62ef-975a-3960-0d0f5c4b0e2f.png)

`Install App` からインストールする

`Bot User OAuth Token` が取得できる。(例. `xoxb-11111111-xxxxxxxx`)

# GCP Secret Managerの設定

上で取得したBot User OAuth TokenをSecret Managerに設定する

```hcl
resource "google_secret_manager_secret" "slack_bot_token_gcp" {
  secret_id = "slack-bot-token-gcp"
  replication {
    auto {}
  }
}
```

secret manager versionに値を追加 (Console 上 or gcloud)

```
echo -n "xoxb-xxxxxxx" | gcloud secrets versions add slack-bot-token-gcp --data-file=- --project <project>
```

notification channelの設定

```hcl
data "google_secret_manager_secret_version" "slack_bot_token_gcp" {
  secret = "slack-bot-token-gcp"
}

resource "google_monitoring_notification_channel" "slack_proj_internal_system" {
  display_name = "slack-proj-internal-system"
  type         = "slack"
  labels = {
    "channel_name" = "#proj-internal-system" # you can set your own slack channel name
  }

  sensitive_labels {
    auth_token = data.google_secret_manager_secret_version.slack_bot_token_gcp.secret_data
  }
}
```

# GCPのError Reporting を連携

terraform でのError Reportingとの連携はサポートされてないようなので、手動で設定。

https://github.com/hashicorp/terraform-provider-google/issues/12068



![Screenshot 2024-12-02 at 9.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/76ea90d4-427c-de58-d99c-3e1b1ec181d7.png)

# Slack通知

![Screenshot 2024-12-03 at 10.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/126f9d47-49ab-8250-26e8-d5f046af0049.png)


通知が来るようになる!

# Ref

- https://github.com/hashicorp/terraform-provider-google/issues/12068
- https://cloud.google.com/blog/products/devops-sre/use-slack-and-webhooks-for-notifications
- https://github.com/hashicorp/terraform-provider-google/issues/14256
- https://registry.terraform.io/providers/hashicorp/google/latest/docs/data-sources/secret_manager_secret_version
AWSにおけるMFA設定とCLI制御の実践

# AWSにおけるMFA設定とCLI制御の実践ガイド

## はじめに
AWSセキュリティ成熟度モデルでは、MFA (Multi-Factor Authentication) の活用がQuick Winsの一つとして推奨されている。以下、CLIにおけるMFAの設定方法とその具体的な効果について解説する。

公式ドキュメント: [AWS Security Maturity Model](https://maturitymodel.security.aws.dev/en/model/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/1d121b8f-ac0c-2aa9-af65-b79690ad4bbc.png)

---

## MFAの設定方法

### コンソールでのMFA設定
1. AWSコンソールにログインし、IAMサービスに移動
2. 対象ユーザーを選択し、MFAデバイスを設定

![MFA設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/22cba136-e679-2e2d-cfdd-c2158b80f0bc.png)

### MFAコード入力の例
設定した後、以下のように、コンソール画面からログイン時にMFAコードの入力が必要になる。

![MFAコード入力画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/1fc0675e-3caa-13e7-a503-cee71337b2d4.png)

### CLIでの操作が制限されない
MFA設定しただけで、AWS CLIを利用した操作は制限されない。このため、ポリシーを追加してCLI操作を制限する必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/bc8fcc8f-042b-f63d-28cb-d28b0b6fd4ab.png)
---

## ポリシーによるCLI操作の制限

### 制限ポリシーの例
以下のポリシーをIAMユーザーやロールに追加することで、MFA認証なしの操作を制限可能である。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BlockAccessWhenNoSignedInWithMFA",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```

適用後、MFA未認証のCLI操作は拒否される。

![制限の確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/3b1ccec9-d289-0366-ebb8-43b57c4e5032.png)

---

## MFA有効時のCLI操作方法

MFAを有効化した状態でAWS CLIを利用するには、以下の手順を実施する。

### 1. MFAデバイス識別子の取得
IAM画面でMFAデバイスの識別子 (ARN形式) を確認する。

![MFAデバイス識別子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/97e2bd88-d0cd-ef69-a6a5-2a11231e6488.png)

### 2. セッショントークンの取得
以下のコマンドを実行して一時的な認証情報を取得する。

```bash
aws sts get-session-token --serial-number <MFAデバイス識別子> --token-code <MFAコード>
```

レスポンス:
- AccessKeyId  
- SecretAccessKey  
- SessionToken  

![get-session-tokenレスポンス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/d8c5b9b4-1c92-6462-614e-c0d5a292e007.png)

### 3. 環境変数の設定(Windows Command Prompt)
取得した情報を以下の環境変数に設定する。

```bash
set AWS_ACCESS_KEY_ID=<AccessKeyId>
set AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
set AWS_SESSION_TOKEN=<SessionToken>
```

設定後、AWS CLIで操作可能となる。

![s3 lsの実行例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/10bd75cd-cdbd-7313-a338-d21e85b3986d.png)

---

## 例外コマンド(一部)
MFAが有効な状態でも、以下のコマンドがMFAコードなしで利用可能である。
- `sts get-caller-identity`: 現在の認証情報の確認  
- `sts get-session-token`: セッショントークンの取得(上記説明した通り)
strlen()+strchr()的な関数

strlen()の自作

```c: my_strlen.c
#include <stdlib.h> // size_t
#include <limits.h> // SIZE_MAX
#include <errno.h>  // errno, EINVAL, EOVERFLOW

size_t my_strlen(const char *str)
{
    if (str == NULL) {
        errno = EINVAL;
        return 0;
    }

    size_t len = 0;

    while (str[len] != '\0') {
        if (len == SIZE_MAX) {
            errno = EOVERFLOW;
            return 0;
        }
        len++;
    }

    return len;
}
```

strchr()の自作

```c: my_strchr.c
#include <stdio.h>  // NULL

char *my_strchr(const char *str, int chr)
{
    // if (str == NULL)
        // return NULL;
    unsigned char target = (unsigned char)chr;
    while (*str && (unsigned char)*str != target) {
        str++;
    }
    if ((unsigned char)*str == target) {
        return (char *)str;
    }
    return NULL;
}
```

strlen()とstrchr()を合わせたみたいな関数を作ってみました。

```c: strnchrlen.c
#include <stdbool.h> //bool
#include <stdio.h> // ssize_t (#include <stdlib.h> でもOK)
#include <limits.h> // SSIZE_MAX

// #define NOT_FOUND (-1)
// #define NOT_LOOKED (-2)
// #define NULL_PTR (-3)

typedef enum errorType
{
    NOT_FOUND = -1,
    NOT_LOOKED = -2,
    NULL_PTR = -3
} err_t;

bool chr_is_found_at(const char *str, ssize_t i, int chr)
{
    if (str == NULL)
        return false;
    return ((unsigned char)str[i] == (unsigned char)chr);
}

ssize_t	strnchrlen(const char *str, ssize_t n, int chr)
{
	ssize_t	len = 0;

    if (str == NULL)
        return NULL_PTR;
    if (n < 1)
        return NOT_LOOKED;
	while (len < n) {
    	if (chr_is_found_at(str, len, chr))
            return (len);
        if (str[len] == '\0')
            return NOT_FOUND;
    	len += 1;
	}
	return NOT_FOUND;
}
```
第２引数は文字列の中で見る文字数の最大値なので、特に指定がなければ、SSIZE_MAXを入れると楽だと思います。
第３引数を終端文字（'\0'）にすれば、普通のstrlen()と同様に使えます。
```c
    ssize_t len = strnchrlen(str, SSIZE_MAX, '\0');
```

strchr()を以下のように使うと、（最大値は異なりますが）同じような結果が得られます。

```c
  char *found = strchr(str, chr);

  if (found)
      size_t len = (size_t)(found - str);
```
自前のSlackアプリにBotユーザーを追加する

## 概要

自前のSlackアプリにスラッシュコマンドを追加する方法をまとめる。

## 前提

下記の内容が完了していること。

https://qiita.com/miriwo/items/f0ae86e4cafbaa57e37e

今回はテスト用として「commands」というSlakアプリを事前に作成した。

## 方法

1. 下記にアクセス
    1. https://api.slack.com/apps
1. 対象のアプリ名をクリック
1. サイドバーで「OAuth & Permissions」をクリック

    ![CleanShot 2024-11-21 at 00.39.39@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/514119b0-ecd2-78db-ec79-b3e999a42cab.png)

1. 「Scopes」の「Bot Token Scopes」の「Add an OAuth Scope」をクリック

    ![CleanShot 2024-11-21 at 00.43.11@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/27a33270-5e3b-0616-33be-24ea10f70cba.png)

1. 今回はチャットの書き込みを行う権限を与えたいので「chat:write」を選択

    ![CleanShot 2024-11-21 at 00.47.13@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0ea918a6-8c5e-2c23-5692-0a84375e8953.png)

1. サイドバーで「Install App」をクリック
1. 「Install to ワークスペース名」をクリックし作成したSlackアプリをワークスペースにインストール

    ![CleanShot 2024-11-21 at 00.50.43@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1809c3ae-def6-b9b3-d5c4-159e4ae42366.png)

1. 「許可する」をクリック

    ![CleanShot 2024-11-21 at 00.51.22@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7e66b23e-7944-6826-f425-5bea8580adac.png)

1. 「OAuth Tokens」が吐き出されるのでメモしておく。

    ![CleanShot 2024-11-21 at 00.53.06@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8f87f2e6-0a22-717a-6ed2-a0b79de7420e.png)


## 参考文献

https://api.slack.com/scopes

https://api.slack.com/scopes/chat:write

https://api.slack.com/interactivity/slash-commands
Raspberry pi picoを使ったプレイステーション用メモリーカード互換品PicoMemCardのジェネリック製品をアリエクで買って使ってみた

## はじめに
　プレイステーション用メモリーカードの中身をバックアップしたりチートコードと交換したりするには、作業用パソコンとメモリーカードを接続する環境構築が必要です。
　2022年5月、Raspberry pi picoを使ったプレイステーション用メモリーカードのPicoMemCardが公開されました。

https://github.com/dangiu/PicoMemcard

　この情報により、中古のメモリーカードとRaspberry pi picoと若干の配線材を使うことで、パソコンにUSBケーブルで接続することで、簡単にメモリカードのバックアップと復元が可能になります。
　さらに、SDカードにメモリカードの情報を保存可能なPicoMemCard＋も公開され、コントローラのボタンを使って、複数のメモリーカードの情報を入れ換え可能になりました。
　初代プレステ用自作プログラムを動かす人にも有用な情報です。

## PicoMemCardを自作か購入か
　PicoMemcardを自作するには、主な部品として、Raspberry pi pico、SPI接続可能なマイクロSDアダプタが必要です。バラックではなく一体型にしたい場合、さらに専用基板を用意する必要があります。
　費用として、だいたい千円から2千円程度を用意する必要があります。
　そのような状況下で、PicoMemCard＋を商品化したPsxMemCardがbitfunxから発売されました。日本からだと、Aliexpressのbitfunxのお店で購入することが可能です。

https://www.aliexpress.com/item/1005006160866713.html?pdp_npi=4%40dis%21JPY%21%EF%BF%A5%202%2C284%21%EF%BF%A5%201%2C970%21%21%2114.49%2112.50%21%402101253517314889130338837dab37%2112000036048939371%21sh01%21JP%21163537706%21X&spm=a2g0o.store_pc_home.productList_993128679.1005006160866713

アリエクの中で検索するといろいろな価格で販売されていますので、気に入ったお店を見つけてください。
　本稿では、PsxMemCardを使った、メモリーカードの情報のバックアップ、チートコードとの交換について説明します。

## SDカードの準備
PsxMemCardの取扱説明書は、以下のurlに掲載されています。

https://www.bitfunx.com/wp-content/uploads/2022/12/psxmemcard-usemanual.pdf

　PsxMemCardを購入すると、SDカードスロットに、512 MBのマイクロSDカードが入っているかと思います。
　このなかに、「MEMCARD.MCR」という名のファイルが存在します。このファイルが、からのメモリカードのイメージファイルです。
　このファイルをコピーして、コピー後のファイルの名前を「0.MCR」（「0」は数字のゼロ）すると、初代プレステで認識できるようになります。

## 実際の動作
　「0.MCR」ファイルを保存したSDカードの刺さったPsxMemCardを、プレステのカードスロットに差し込んで起動します。
　カードに問題がない場合、赤色LEDが点灯します。ゆっくり点滅する場合はマイクロSDカードの読み込みに失敗しています。

## マルチプルカードとして使う
　メモリバンクが30とか60のようなマルチプルカードとしても利用できます。
　「MEMCARD.MCR」のコピーを「1.MCR」、「２.MCR」と増やします。
　切り替えは、「スタート」+「セレクト」+「Dパッドの上」を同時に押します。この場合、「0.MCR」から「1.MCR」と数字の大きいファイルに切り替わります。
「スタート」+「セレクト」+「Dパッドの下」を同時に押すと、「1.MCR」から「0.MCR」と数字の小さいファイルに切り替わります。

## おわりに
プレイステーション用の128 kBのメモリーカードの内容をSDカードに保存して使用できるPsxMemCard等によって、メモリーカードの内容の出し入れが容易になりました。
にこkinが4冊揃ったので読んでみた

これは [kintone アドベントカレンダー](https://qiita.com/advent-calendar/2024/kintone) 2日目の記事です。

昨日(12/1) は、@yukaffy さんの[2024 年の cybozu developer network と周辺のエンジニアマーケティング活動](https://qiita.com/yukaffy/items/56bc6dad1aae20140924) でした。

## はじめに

こんにちは。
(人によってははじめまして？)

ふれーむといいます。
※技術同人誌関連ではふーれむと表記するケースがあります。「フレームワーク」でミーム汚染を起こす関係で……

技術同人誌界隈でそれとなくコミュニティ活動をしているものです。あとkintone界隈では界隈の片隅に生息しながら、kintoneをもっと使いやすく使ってもらう仕事をしています。

技術同人誌×kintoneという話でいうと、今年は**にこkin**が世に出た年でした。

## にこkin、知ってます？

**にこkin**は、今年発刊されたkintoneの技術同人誌である、『SEにこそ読んでほしいkintoneの技術的な話』という技術同人誌のシリーズ(現在全４冊)です。

今回ありがたいことに、手元に丁度今年刊行された、にこkinが４冊揃ったので読んでみました。

![seにこkin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144657/a764d0eb-acb1-8c32-dd44-66df442d23d2.png)

## Vol.1 ノーコードツールのデータ設計は超重要

この冊子については、頒布の初出しは技術書同人誌博覧会10(2024/5/12) でした。

https://x.com/satomi_izumo/status/1789527871545135393

冊子の構成としては、アンチパターン(要はこういう設定や設計をやってはいけないよ……　というノウハウ)が半分、参考になるポイントが半分　という感じの本で、論点が良くまとまっていました。

一つ気になった点としては、ルックアップフィールドについては言及があったのですが、関連レコード一覧フィールドについては言及がなく、ちょっとそこが勿体ないなぁ……という感じでした。

ただ「本がある」という大きなメリットからみれば、それは微々たる話(本があれば、その本を元に客観的な視点を足したり、本をベースに意見交換したり、検討を加速できる)なので、こういった本が世に出るのは非常に良い事だな　という感覚を得ました。
※これは、kintone SIGNPOSTの「[先駆者の話](https://kintone.cybozu.co.jp/kintone-signpost/pattern/1-12.html)」や「[プロの伴走](https://kintone.cybozu.co.jp/kintone-signpost/pattern/2-13.html)」にも通じるところがあるかな……　当然ながら本だけで代替はできないのですが、その前段としては良い気がします。

## Vol.2 要件定義フェーズの勘どころ

ここからVol.4までは、実際にみなさんが最初に頒布に触れる機会はサイボウズ商店さんか、Cybozu Days 2024 だったのではないかと思います。

https://x.com/satomi_izumo/status/1847218565688283494

この冊子については、基本的には要件定義の話でもあるし、権限周りの話や kintoneSIGNPOSTでいうところの「[基本機能から考える](https://kintone.cybozu.co.jp/kintone-signpost/pattern/2-14.html)」をもう少しブレークダウンした話が中心です。これもよい。

## Vol.3 運用後の改修で失敗しないためのポイント

こちらも公式のXのポストを貼っておきましょう

https://x.com/satomi_izumo/status/1848545193928364071

kintoneを基本機能だけで使っていると影響が少ないような気もするのですが、プラグインやJavaScriptカスタマイズ、外部連携サービスなどを使っているときにやってしまうとつらみが出るポイント（例えばフィールドコードを運用後に変えてみたりだとか……）

また、削除・移行に関する論点などもコンパクトにまとまっていて、個人的には **4冊の中で一番好きな冊子** です。

## Vol.4 カスタマイズ開発における知っておきたいお作法

現状、最後に出た冊子であるVol.4は、JavaScriptでのカスタマイズ開発における様々なポイントになります。

https://x.com/satomi_izumo/status/1851567220167516369

あまりJavaScriptカスタマイズをしていない人には刺さらない内容かもしれないのですが、まあこの技術同人誌はタイトルにも入っているように、「SEにこそ読んでほしい」なので、ある意味では原点回帰したのかな～　という感じの内容です。

冊子が薄い割に結構ポイントを絞った情報が載っているので、JavaScriptカスタマイズをしている人はたたき台になるかもしれません（既に知ってる人も多いかもですが）。

## おわりに

かんたんに今年のkintone技術同人誌を紹介してみましたが、どうだったでしょうか？

[サイボウズ商店](https://shop.cybozu.co.jp/)さんでは店頭で販売されているようなので、気になった方は足を運んでみても良いかもです！

https://x.com/satomi_izumo/status/1854726034173677726

---

また、技術同人誌自体が気になった方は、コミケの技術同人誌エリアや、技術同人誌の即売会に足を運んでみるのもおすすめです！

技術同人誌の即売会で一番日程が近いものでいうと、技術書同人誌博覧会11(2025/1/25)＠横浜産貿ホール マリネリア があります。
（私はコアスタッフをしています。たいへん手前味噌ですまない……）
https://gishohaku.dev/

入場無料なので、気になった方はぜひお越しください！
RaycastのSnippetsで「キーワード」の先頭に使う文字

macOSのランチャーツールに分類されるRaycastですが、単にアプリを起動するような使い方だけでなく、さまざまな便利な機能を備えています。その機能の1つが「Snippets」です。このSnippetsの便利な使い方とキーワードの設定について紹介します。

この記事は[Raycast Advent Calendar 2024](https://qiita.com/advent-calendar/2024/raycast)に参加しています。
昨日は @nagauta さんの「[Raycastを始めるなら"Clipboard History"がおすすめ](https://qiita.com/nagauta/items/b28e32bfba793096c9cd)」でした。

# Snippetsとは

日本語では「切れ端」や「断片」という意味がある言葉ですが、一般的には「スニペット」と書かれます。プログラミングなどでよく使われるソースコードの一部を登録しておくことで、手軽に入力する目的で使われます。

スニペットを登録して手軽に使えるツールはたくさんあり、私も過去に「Snippetty」というツールを使っていました（[過去記事](https://qiita.com/masuipeo/items/d3524cfd2c1a7345d114)）。

たとえば、プログラマであれば次のようなソースコードを登録しておき、呼び出すだけで手軽に入力するような使い方が考えられます。

```c
for (i = 0; i < n; i++) {
    // 処理
}
```

プログラミングだけでなく、日常で使う言葉でも、頻繁に入力する言葉を登録しておくと、簡単に入力できて便利です。たとえば、自分のメールアドレスを登録しておくと、毎回メールアドレスを入力する必要がなくなり、誤入力などを防げます。

もちろん、このような使い方であれば、かな漢字変換の辞書に登録しておく方法もあります。「めーる」と入力したときに、「sample@example.com」のような値を登録しておく方法です。

スニペットが便利なのは、改行などを含む内容も登録できることや、一部を書き換えられることです。たとえば、RaycastのSnippetsでは、次のように指定して登録しておくと、`{date}`で指定した部分を当日の日付にして自動的に入力できます。

```txt
今日の日付は「{date format="yyyy-MM-dd"}」です。
```

これを実行すると、次のように入力されます。

```txt
今日の日付は「2024-12-02」です。
```

# キーワードから起動する

登録しておいたSnippetsを呼び出すとき、Raycastでは「Search Snippets」というコマンドから起動する方法が一般的です。

![Snippetsの起動](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309006/796e3804-e3b2-f2ad-e063-69c973946715.png)

しかし、スニペットの起動時にスニペットの一覧から探すのは面倒なので、手軽に起動できるようにしたいものです。Raycastでは、スニペットを作成するときにオプションでキーワードを設定できます。

![キーワードを指定する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309006/8342d173-5cce-b4bb-46d6-26e5de43d736.png)

たとえば、メールアドレスを入力するスニペットに、キーワードとして「`@@`」と指定すると、テキストエディタやWebサイトのフォームでキーボードから「`@@`」と入力するだけでスニペットとして登録した内容に変換されます。

# キーワードに指定する文字

ここで問題になるのは、「どのような文字をキーワードに指定するか」です。もし一般的な英単語などを指定してしまうと、その単語を文章中で入力するたびにスニペットで指定した内容に置き換えられてしまいます。たとえば、「`mail`」というキーワードを設定すると、キーボードから「`mail`」と入力するたびに書き換えられてしまうのです。

これは困るので、普段は入力しないキーワードを指定します。よく使われるのは、何らかの記号に続けて英単語を指定する方法です。たとえば、Snippetsの公式サイトではメールアドレスに変換するとき、上記でも紹介した「`@@`」を指定しています。

https://manual.raycast.com/snippets

このように「`@`」などの文字で始めるのはわかりやすい一方で、「`@`」で始めるキーワードを入力することはプログラミングでは珍しくありません。Laravelでは、「`@csrf`」のように「`@`」で始めるキーワードがあるのです。

```php
<form action="{{ route('xxx')}}" method="post">
    @csrf
    <button type="submit">登録</button>
</form>
```

そこで、他の文字で始めることを考えます。Webを検索すると、「`;`」や「`,`」で始める人が多いように感じました。

Raycastの公式サイトを調べてみると、以下のページで紹介されている動画では、「`!@`」のように「`!`」という記号で始めています。

https://www.raycast.com/core-features/snippets

そして、この動画の中で紹介されている以下のサイトではいずれも「`!`」で始められています。

https://ray.so/snippets/symbols

# どんな文字がよいのか

私は上記のサイトを参考に、「`!`」で始まるキーワードを指定しています。
しかし、私は「`!`」で始める単語を入力することがあります。たとえば、Obsidianには「コールアウト」という記述方法があり、このコールアウトでは「`> [!info]`」のように書くのです。

https://help.obsidian.md/Editing+and+formatting/Callouts

つまり、もし「`!info`」をキーワードにすると、コールアウトを作ろうと入力したときに自動的に変換されてしまいます。もちろん、このようなキーワードの指定を避ければいいのですが、できればキーワードの先頭に使う文字を共通にしつつ自由に登録したいものです。

他の記号として「`#`」で始めると𝕏などのSNSでハッシュタグに影響してしまいますし、PythonやRuby、Bashなどのコメントで使うこともあります。「`%`」はTeXでコメントになります。

正解はないと思いますが、皆さんはどの文字を使っていますか？
起業するならElixirシリーズSTEP6.リスト化

## キャッチコピーの作成
前回はコンテンツを作成しましょう。という話しをしました。コンテンツの作成といっても、まだこの段階では中身をゴリゴリ作るのではなく、あくまで設計を作ろうという話しです。
何を提供するのか？ どう提供するのか？についての設計ですね。

この設計がしっかりできると、何をどのように提供するかのイメージが固まるので、ターゲットに向けて訴求するための言語化がより具体的にできるようになります。

コンテンツの設計が終わったら、キャッチコピーを作り、ビジネスメッセージを作ります。
この段階で、この商品が顧客に価値を提供できるものか？について仮説の検証を実施します。

## リスト化

キャッチコピー、ビジネスメッセージを作るというのは、価値を言語化する事に等しいです。その為、この言語化されたキャッチコピーやビジネスメッセージは本当にターゲットに価値提供できそうか？の検証を行います。

検証の方法は、リストを作ることです。その為のキャッチコピーとビジネスメッセージになります。
そのメッセージを利用して、ターゲットがいるであろう場所にメッセージを伝え、連絡できる状態を作ります。
例えば、SNSで繋がるでも良いですし、メールアドレスを取得するでも構いません。ターゲットにより最適な集め方をしてください。


## Elixirの課金実装
さて、前回から先に課金部分を作っておく取り組みも合わせてしてます。現時点ではまだこの起業するならELixirシリーズで、開発よりも抑えておきたいポイントがあるので別の記事として記載してるのでこちらを見てください。

https://qiita.com/Yoosuke/private/2b5abd87393f1cc0307a

ちなみに、なぜITエンジニア向けの媒体でこんな起業系の内容を書いてるかと言えば、AIがコードを生成できる時代に突入し（今後どんどん精度が良くなってきたとき）ITエンジニアに必要な能力として共感力が重要になると考えているからです。

インターネットの世界では、王者が一人勝ちする世界です、そんな競争の中でビジネス視点はあるが、開発がわからない。同様に、開発はわかるがビジネス視点が無い。ではとても勝てない。

その為、両方の知識を持つ人が必要になっていくと考えています。なので私の会社で育てるITエンジニアには、このビジネス視点を持ってもらう事も合わせて教育しています。
Google Chromeアドオンを公式公開する方法

こんにちは！この記事では、Google Chromeの拡張機能（アドオン）をChrome Web Storeに公開する方法を解説します。これから公開を検討している方や、初めて挑戦する方に向けて、以下の手順で進めていきます。

# Chromeデベロッパー登録の方法
アドオンのパッケージ化とアップロード
公開申請と審査プロセス

## 1. Chromeデベロッパー登録の方法
Google Chrome Web Storeでアドオンを公開するには、まず「Chromeデベロッパーアカウント」を登録する必要があります。

### 手順
Googleアカウントを準備する
デベロッパーアカウントの登録にはGoogleアカウントが必要です。既にアカウントをお持ちの方は、そのアカウントを使用できます。

### デベロッパーダッシュボードにアクセス
Chrome Web Storeデベロッパーダッシュボードにアクセスします。

### 登録料を支払う
デベロッパーアカウントの登録料は 5ドル（2024年現在） です。一度支払えば、永久に使用可能です。
支払いは、クレジットカードまたはデビットカードを利用できます。

### 必要情報を入力

氏名または会社名
メールアドレス
デベロッパープロフィール（ユーザーがあなたのアドオンを確認した際に表示される情報）
登録完了
支払いが完了し、情報が承認されるとデベロッパーアカウントが有効化されます。

## 2. アドオンのパッケージ化とアップロード
次に、作成したアドオンをChrome Web Storeにアップロードします。

### パッケージ化
アドオンのコードを準備
Manifestファイル（manifest.json）やHTML/CSS/JavaScriptファイルをプロジェクトフォルダ内にまとめます。

### ZIP形式で圧縮
プロジェクトフォルダ全体をZIP形式で圧縮します。

### アップロード手順
デベロッパーダッシュボードにログインします。
「新しいアイテムを追加」をクリックします。
圧縮したZIPファイルをアップロードします。
アドオンの情報（タイトル、説明、カテゴリなど）を入力します。
必要に応じてスクリーンショットやアイコンをアップロードします。
アイコンサイズ：128x128px
スクリーンショット推奨サイズ：1280x800px

## 3. 公開申請と審査プロセス
アドオンを公開するためには審査に通過する必要があります。

### 申請手順
必要な情報を入力し終えたら、「公開リリースを申請」をクリックします。
プライバシーポリシーとサポートページを記載してください。
特にデータを収集するアドオンの場合、プライバシーポリシーは必須です。
Googleの審査チームがアドオンを確認します。
### 審査期間
審査には通常 数日から1週間 かかります。ただし、アドオンが複雑な場合や問題が見つかった場合は、さらに時間がかかることがあります。

### 審査のポイント
アドオンがChrome Web Storeのポリシーに準拠していること。
アドオンにマルウェアやセキュリティリスクがないこと。
提供する情報が正確であること。

## 4. アドオンの公開
審査に通過すると、Chrome Web Storeで公開されます！公開後は、ユーザーのフィードバックを基に改善を繰り返し、アドオンを成長させましょう。

## まとめ
Google Chromeアドオンを公式に公開するには、デベロッパー登録から始まり、アドオンのパッケージ化と審査を経る必要があります。
初めての挑戦は少しハードルが高く感じるかもしれませんが、完成したアドオンが多くのユーザーに利用される喜びは格別です。ぜひ挑戦してみてください！

これで、あなたのChromeアドオンが世界中で利用される一歩を踏み出せます！質問やフィードバックがあれば、コメントで教えてください！
マルチプロダクト戦略におけるデータ分析プロダクトのアーキテクチャ

この記事は[Hacobu Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hacobu)の2日目の記事です。

# **はじめに**

株式会社Hacobu テクノロジー本部CTO室 室長の三木です。本記事は先日11/26 に行われた [アーキテクチャカンファレンス2024](https://architecture-con.findy-tools.io/) で発表した「マルチプロダクト戦略におけるデータ分析プロダクトのアーキテクチャ」のダイジェスト版になります。

![0216.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624650/2c74d95f-65b5-b5f0-c0fe-4d76e1ce9c45.jpeg)



## 物流課題解決へのアプローチ

Hacobuは 「持続可能な物流インフラを創る」のビジョンのもと、企業や業界の枠を越えた物流ビッグデータの蓄積・活用基盤となる「物流情報プラットフォーム」の構築を目指しています。人手不足や長時間残業といった物流の本質的な社会課題を解決するためには、様々なステークホルダーと連携しながら、データ駆動型のロジスティクスを社会に浸透させることが必要と考え、そのための手段として、物流DXを推進するSaaS型アプリケーションを提供しています。トラック予約受付サービス「MOVO Berth」、動態管理サービス「MOVO Fleet」、配車受発注・管理サービス「MOVO Vista」、生産・販売・在庫管理サービス「MOVO PSI」などのクラウドサービスと、コンサルティングサービス「Hacobu Strategy」を展開し、企業間物流の最適化を支援しています。

各領域でMOVOを用いて課題解決を促進し、物流情報のデジタルな蓄積を行なっています。蓄積したデータにより輸配送の合理化を行うことを目指したデータ分析プロダクトX-Dataになります。

![スクリーンショット 2024-11-28 10.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624650/01d20d55-348e-ced8-8eca-76c8085885d3.png)


## MOVOのアーキテクチャの全体像

MOVOシリーズはプロダクトプラットフォームと個別プロダクトの領域に分かれていて、マイクロサービスとしてそれぞれ連携しています。
![スクリーンショット 2024-11-28 10.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624650/89720ef3-b3c5-b4dd-b6fc-5fd8041727c5.png)


X-Data は主にFleet のデータや外部システムのデータをもとに分析を行うことができ、将来的にはBerth のデータも組み合わすことを目指しています。また、企業の枠を超えてプロジェクトという形でデータを連携・分析することもできます。プロダクトそれぞれでの最適なデータの持ち方、権限設計をしているのでそれらを統合してデータの閲覧範囲を設定し分析することが求められます。

![スクリーンショット 2024-11-28 10.44.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624650/278ce237-23b6-6fd9-3e6f-f28a9b5c26bf.png)


## MOVO X-Data での分析データ準備

X-Dataでの分析は専用のモデルを用意し、各プロダクトデータを統合しています。統合の過程はデータ基盤でよくあるデータレイク、ウェアハウス、マートの構成で段階的にテーブルを作るようにしました。より具体的には

1. Athena によりプロダクトDBのダンプデータに対してクエリ(Extract)
2. Golang によるデータ加工(Transform)
3. X-Data DBへの投入(Load)
4. X-Data DB上での最終加工(Transform)

という流れで行なっていて、各プロセスでの役割分担を適切に行うことでバッチのパフォーマンス向上を目指しています。

![スクリーンショット 2024-11-28 10.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624650/5aba2c97-0327-4fdf-fd3c-cb86f0315d7a.png)


## おわりに

マルチプロダクト戦略におけるデータ分析プロダクトのアーキテクチャについてダイジェスト版を紹介させていただきました。資料は[こちら](https://speakerdeck.com/hacobu/deng-tan-zi-liao-san-mu-tuo-shi)に格納しているので、より詳しく知りたい方はご覧いただければと思います。
Adobe FrescoをUdemyで学ぶ

## はじめてのUdemy

iPadとApple penを買ったのに全然活用できていない！

ということで、Udemyのアドベントカレンダーもあったので、これを機会にUdemyでAdobe Frescoを学んでみることにしました。

https://www.udemy.com/share/105jnG3@uQYSFyRgm0yg_hJgm8RdJyhyXA6IBfNNffjJYaH3ey9QZDxR6GYl4UsgJtB2t_DdKw==/

プログラム言語の学習などでは、どちらかというと動画学習より書籍のほうが好きですが、デザインツールなどのGUIアプリや、実際の現場の人がどのように手を動かしているのかが知りたい場合は、Udemyの動画はとても良いですね。

上記のコンテンツは合計2.5時間のコンテンツですが、休日や早朝の空いた時間に細切れで観ることもできて便利でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/2340aee0-343f-c4b6-121a-e0d676e70618.png)

上記のように各セクションの時間をあらかじめわかるので、この時間の間にここまで観れるなと予定も立てやすいです。
Android で大規模言語モデルを試す

# はじめに

TRIAL＆RetailAI Advent Calendar 2024 の 3日目の記事です。

昨日は @mizoguchi_ryosuke さんの『小売業における数理最適化事例』という記事でした。

凸二次計画問題を小売業に応用することで、効率的な配分が可能となり、特にポートフォリオのようなリソース管理において効果的だと感じました。素晴らしい記事ですね！

本日は、『Android で大規模言語モデルを試す』 です

前回の記事

https://qiita.com/yang_zaiqi/items/923115338cc9ab38ab8c

皆さん、こんにちは前回のお話の続きで、スマホで AI を動かすことについて話したいです。

実は、最近の調査によると、多くのスマートフォンユーザーが、プライバシーを守りつつ、いつでもどこでも AI の力を借りたいと考えているそうです。特に、個人情報を大切にしたい人や、オフラインでも使える便利なツールを求めている人たちの間で、この需要が高まっているんです。



残念ながら、スマホで オフラインAI を動かす現状では厳しいと言わざるを得ません。最新のスマホでも、メモリは 16GB 程度。大規模言語モデルが必要とする数百 GB には遠く及びません。処理能力も、パソコン用の高性能 CPU や GPU と比べると、まだまだ物足りないんです。

## Android で大規模言語モデルを試す環境の準備：

まずは、私のお気に入りのツール、Termux の出番です。Termux って聞いたことありますか？私が初めて使ったときは、驚いたんですよ。Linux 環境がスマホの中に！

Termux のインストール:
Google Play で配布されている Termux はサポートが終了しており、現在は F-Droid 上で配布されています。
そのため、まずは Android 端末に F-Droid アプリをインストールする必要があります。

https://f-droid.org/ja/

F-Droid のインストールが完了したら、F-Droid を起動し Termux を検索してください。
検索結果がいくつか出てきますが、「Termux Terminal emulator with packages」と書かれたリストをタップしインストール画面へ進んでください。

「インストール」というボタンをタッチすることでインストールを実行できます。

インストール後、アプリを開いて... おっと、ちょっと待って。黒い画面が出てきても慌てないでくださいね。これが正常です！


## それから 
Ollama のインストール:

https://ollama.com/download/linux

##  最後
自分好きなモデルインストール
ちなみに、私は*Qwen2.5-14b*モデルのインストールしました。

```rb
ollama run Qwen2.5:14b  
```

こちらは好きなモデルを探せます

https://ollama.com/library/qwen2.5

ここで、お茶でも入れてゆっくり待ちましょう。ダウンロードには時間がかかります。

私のスマートフォンは、Snapdragon 7 Gen ２プロセッサと 16GB の RAM を搭載しています。正直なところ、反応速度はちょっと... 遅いです。質問を入力してから答えが返ってくるまで、じりじりと待つ時間は、まるで受験の結果を待つような気分。（0.5token/sぐから）でも、がっかりしないでください。これは始まりに過ぎません。技術は日々進化しています。今日の「ちょっと遅い」が、明日には「驚くほど速い」に変わるかもしれません。

## まとめ
技術は日々進化が速いですね。
２年前LLMモデルはまだまだ一般の方が使えないのに、今は誰でもの端末に入れる。

明日は、@Mikeyさんの「第五次産業革命」という記事です。お楽しみに！

RetailAIとTRIALではエンジニアを募集しています！
興味がある方はご連絡ください！
一緒に働けることを楽しみにしています！

https://recruit.jobcan.jp/retail-ai/
 
https://hrmos.co/pages/trialgp/jobs?category=2020003768196907008
macOS でのテキスト編集が少しだけ楽になるかもしれない Tips

:::note
この記事は「[mofmof Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mofmof)」2 日目の記事です。
:::

記号の読み方

| 記号 | キー |
| --- | --- |
| ⌘ | Command |
| ⌃ | Control |
| ⌥ | Option |
| ⇧ | Shift |


## カーソルの移動

修飾キーとカーソルキーを組み合わせて効率よくカーソルの移動が行えます。

### 単語

| 動作 | バインディング |
| --- | --- |
| 次の単語 | ⌥→ |
| 前の単語 | ⌥← |

### 行

| 動作 | バインディング |
| --- | --- |
| 行の先頭 | ⌘← |
| 行の末尾 | ⌘→ |
| 先頭の行 | ⌘↑ |
| 末尾の行 | ⌘↓ |

## 範囲の選択

| 動作 | バインディング |
| --- | --- |
| 右に範囲を選択 | ⇧→ |
| 左に範囲を選択 | ⇧← |
| 次の行の行末またはカーソル位置の下まで範囲を選択 | ⇧↓ |
| 前の行の先頭またはカーソル位置の上まで範囲を選択 | ⇧↑ |
| 次の単語まで範囲を選択 | ⌥⇧→ |
| 前の単語まで範囲を選択 | ⌥⇧← |
| ドキュメントの末尾まで範囲を選択 | ⌘⇧↓ |
| ドキュメントの先頭まで範囲を選択 | ⌘⇧↑ |




## Emacs キーバインディングでのカーソルの移動と編集操作

macOSでは、一部のテキストフィールドでEmacs風のキーボードショートカットが使えます。

### カーソルの移動（文字）

| 動作 | バインディング | 覚え方 |
| --- | --- | --- |
| 右 | ⌃F | F →  Forward |
| 左 | ⌃B | B →  Back |

### カーソルの移動（単語）

| 動作 | バインディング | 覚え方 |
| --- | --- | --- |
| 次の単語 | ⌃⌥F | F →  Forward |
| 前の単語 | ⌃⌥B | B →  Back |

### カーソルの移動（行）

| 動作 | バインディング | 覚え方 |
| --- | --- | --- |
| 行の先頭 | ⌃A | A → アルファベットの最初の文字 |
| 行の末尾 | ⌃E | E →  End |
| 次の行 | ⌃N | N → Next |
| 前の行 | ⌃P | P → Preview |

### 編集操作

| 動作 | バインディング | 覚え方 |
| --- | --- | --- |
| カーソルの右側の文字を削除する | ⌃D | D →  Delete |
| カーソルの左側の文字を削除する | ⌃H | ? |
| 選択範囲または行末までを削除する（切り取り） | ⌃K | K → Kill (削除) |
| ⌃Kで削除したテキストを挿入する | ⌃Y | Y → Yank |

## ショートカット

### プレーンテキストとしてペーストする

`⌘⌥⇧V`

### 文字ビューアから絵文字や記号を入力する

`⌃⌘Space`
【PLATEAUアカデミー】建築物モデル(LOD1)作成【仙台会場】

みなさんはじめまして。本日はPLATEAUアカデミーで学んだ **建築物モデル(LOD1)作成** の一部を紹介させていただきます。
### 建築物に地表面高さを持たせる
建築物の高さの算出にあたりDEMの標高値を建物に付与するのですが、今回使用するDEMが2ｍ間隔のポイントデータなので一部狭小建築物がポイントと重ならないという事態が発生します。
そこでDEMを内挿補間ラスタデータに変換し高さを取得します。
何でラスタに高さが？と思いましたが**ラスタデータの各セルに高さ情報が入っています**とちゃんと説明がありました…なるほど。
ポイントデータ→高さ情報を持ったセルで区切られた画像になったわけですね。
![11281.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946977/b6363d20-cd65-ff9c-4d33-a1a3d7960ad5.jpeg)
実際に作成したラスタ。標高値が高くなるほど明るい色になっています。
使用ソフト：[QGIS](https://www.qgis.org/)3.34
CPU：Core i7-4610M
メモリ:8GB
OS：Windows10

このラスタはQGISのシンポロジの設定を変えると陰影図の表現もできます。視覚的にわかりやすいですね。
![11282.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946977/4e059255-85c8-4b53-96ab-f232a72115cf.jpeg)
次に建築物ポリゴンから頂点を発生させ、先ほど作成したラスタデータから空間結合で頂点にZ値を付与します。そして建物構成点の中から一番低い値をポリゴンに付与して建物地盤高が完成です。

### それでは復習をかねて別のモデルでやってみます ###
使用するのは[国土地理院 基盤地図情報](https://fgd.gsi.go.jp/download/menu.php)の基本項目**建築物**と**数値標高モデル**です。


数値標高モデルはQGISの**プラグインの管理とインストール**から**QuickDEM4JP**をインストールすれば簡単に高さ情報つきGeoTiffに変換できました。1マスごと高さが入っています。
建築物レイヤには高さ属性がありませんのでさっそく付与してみましょう。
![12081.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946977/a70a9606-c466-64b1-04d7-5df1c96627d2.jpeg)

まず**頂点を抽出**するのですが上手くいきません:persevere:調べてみるとレイヤのfidのタイプが文字列型というのがエラー原因のようです。今回特に必要ないのでフィールドごと削除します。


その後順調に進めていき無事にDTM_min属性を持った建築物レイヤが完成しました。
![12082.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946977/4ca0b8c6-d2f1-a9e4-3043-4d6fc0a4d83c.jpeg)

QGISは誰でも無償で使えるところがいいです。
動きが軽いですし。
利用者が多いのでしょうか、分からないことを検索すると有益な情報がヒットします、これって大事ですよね。
まだ始めたばかりなのでもっと使いこなせるようにならないと。


今回PLATEAUアカデミーに参加させていただきましてありがとうございました。
充実した3日間でした。分厚いテキストもいただけて復習にとても役立ちました。
［Windows］batファイルをタスクバーに固定する方法

# 概要
Windowsで作ったbatファイルをアプリみたいにタスクバーに固定する方法。
StableDiffusion ComfyUIとかをアプリみたいにタスクバーから起動したい時なんかに便利。

※Macの人は以下

https://qiita.com/GeneLab_999/items/32e7a6190b0490408886


## ステップ1:batファイルを作成
以下のようにbatファイルを作成し、
プロジェクトルートディレクトリに保存する

***run-app.bat***
```
@echo off
cd /d "<プロジェクトルートディレクトリのパス>"
call <仮想環境有効化コマンド>
cd "<エントリポイント(app.pyなど)のあるディレクトリ>"
python <エントリポイント>
```

## ステップ2: ショートカットを作成 
次に、デスクトップから
新規作成→ショートカットを作成を選択し、
「項目の場所を入力してください」の欄に以下を入力:
![スクリーンショット 2024-12-02 082847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908981/5f450963-ee6e-9a77-c8fd-3e45af86f075.png)

```
C:\Windows\System32\cmd.exe /c start "" "<run-app.batの正しいパス>"
```

ショートカットに名前を付ける:

「次へ」をクリック。
ショートカットの名前を任意のものに設定。
「完了」をクリック。

## ステップ3：ショートカットのプロパティを設定する
ショートカットを右クリックして「プロパティ」を選択。
リンクを以下のように修正する。
```
C:\Windows\System32\cmd.exe /c "あなたのバッチファイルへのパス"
```
「ショートカット」タブの「作業フォルダー」欄に、
エントリポイントのあるディレクトリを設定する。

完了！

## ステップ4: 任意
タスクバーに固定しちゃうと便利。
アイコン設定するとまるでアプリ。
自作Google Chromeアドオン「URL Tracker」

# はじめに
2024年CiscoSystems合同会社社員有志によるAdventCalendarの記事の一つです。

https://qiita.com/advent-calendar/2024/cisco


今回は私が作成したGoogle Chromeアドオン「URL Tracker」を紹介します。
このアドオンは、簡単に特定のURLをトラッキングし、記録するためのツールです。

# 「URL Tracker」の特徴と機能
作成の背景
実装のポイント
今後の展望

## 1. 「URL Tracker」の特徴と機能
「URL Tracker」は以下のような機能を備えています：

閲覧したURLを記録
閲覧履歴の中から特定のURLをピックアップし、リスト形式で保存します。

データのエクスポート
トラッキングしたURLをCSV形式でエクスポート可能。

実際の画面はこんな感じです：
![スクリーンショット 2024-12-02 8.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259135/a4b50352-dd9a-1a50-df82-155fa6d795b2.png)

## 2. 作成の背景
NW機器のトラフィックコントロールをする際にFQDNをベースとしたオブジェクト登録をすることが多く、重要なURLを簡単に記録・管理したいと感じたことです。出力形式としてフルURLやURIにするのではなくてFQDN部分にしています。バックエンドではURIまで取得しているのでそこらへんの細かいカスタマイズも可能です。

## 3. 実装のポイント
アドオンの開発には、以下の技術を活用しました：

Manifest V3:
最新のChrome拡張仕様に準拠した構成で、セキュリティとパフォーマンスを重視しました。

JavaScriptとChrome API:
特にchrome.historyやchrome.storageを使用して、閲覧履歴の取得やデータ保存を実現。

ユーザーインターフェース:
シンプルで直感的なUIを意識して、HTML/CSS/JavaScriptを組み合わせて構築しました。

コードの一部を紹介します：

```javascript
chrome.history.search({text: '', maxResults: 100}, (results) => {
  const filteredUrls = results.filter(item => item.url.includes('example.com'));
  chrome.storage.local.set({trackedUrls: filteredUrls});
});
```

## 4. 今後の展望
現在はシンプルな機能に絞っていますが、今後は以下の改善を計画中です：

・リアルタイム通知機能
特定のキーワードを含むURLが訪問された際に通知を送る。

・カスタマイズ可能なトラッキング条件
特定のキーワードやドメインでフィルタリングする設定ができます。

・UIの改善
ユーザーからのフィードバックを基に、使いやすさをさらに向上。

## まとめ
「URL Tracker」は、ウェブブラウジングを効率化するために作成したアドオンです。
ぜひ、こちらからダウンロードして使ってみてください！

https://chromewebstore.google.com/detail/url-tracker/ihpeipemnbocpbmfapedjjakkgmjgnjb?hl=ja


使用してみた感想やフィードバックがあれば、コメント欄でお知らせください。
Clojureの基本構文 - 関数の定義と呼び出し

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 5*](https://qiita.com/advent-calendar/2024/clojure)

## 基本構文

3つの基本についてまとめていきます

1. リテラル
1. 関数の定義と呼び出し
1. 特殊フォーム
今日は **2.関数の定義と呼び出し** についてまとめます

### 2. 関数の定義と呼び出し

1. 関数の定義

    `defn` を使って関数を定義します。
    
    ```clojure
    (defn greet [name]
      (str "Hello, " name "!"))
    
    (greet "Alice") ;=> "Hello, Alice!"
    ```

1. 無名関数（匿名関数）

    短い関数には `fn` やシャープ記法 `#()` を使用します。
    
    ```clojure
    ((fn [x] (* x x)) 3) ;=> 9
    (#(* % %) 3) ;=> 9
    ```

1. 高階関数

    関数を引数として受け取る、または関数を返す関数。
    
    ```clojure
    (map #(* % 2) [1 2 3]) ;=> (2 4 6)
    ```



### 参考

https://clojure.org/guides/learn/syntax
【基本情報】独学マラソン SEO基本 Day 26

:::note worn
この記事は自分用の備忘録です。
:::

## SEOってなんぞ？

検索エンジン最適化
検索エンジンで自分のウェブサイトが上位に表示されるように工夫すること

## どうすれば上位に表示される？
以下の3つの要素が大切らしい。
- コンテンツ（Content）
- 技術（Technical SEO）
- 外部評価（Off-Page SEO）

## 具体的には？

- コンテンツ（Content）
    - 読みやすく、役に立つ情報を提供する
        - h1,h2やliを使って構造化する
        - 画像にalt属性を設定する
        - 関連するページ同士をリンクでつなぐ

<br>

- 技術（Technical SEO）
    - レスポンシブ対応をする
    - 画像を圧縮して軽くする
    - CSSやJavaScriptを最適化する
    - url構造をシンプルにする
    - サイトマップを作成してGoogleに送信する
    - 404ページを作成する
    - httpsにする

<br>

- 外部評価（Off-Page SEO）
    - SNSでシェアされるようにする（OGP設定）
    - 被リンクを獲得する

# 感想
HTML構造部分は、全部divだとSEO的には0点である
しかし、AI時代においてはセマンティックよりもパフォーマンスやUI/UXが大切になる気がする

# 参考

https://wa3.i-3-i.info/word1382.html
（イベントレポート）社内トレーナー導入成功のコツ

:::note warn
本稿は、投稿日をいつにするかタイミングを失った記事の供養を兼ねている
:::

---

## （追記）本稿のセミナーイベント

多分これ、のはず

https://bcon-license.jp/self/

ビジネスコンサルタントからスピンオフした、という経緯があるそう。

## 社内トレーナーを育てると何が嬉しいか？
- 費用対効果
  - 特に受講生アンケート（満足度）が指標になりがち
- 研修後の行動変化を見れる（外部講師では難しい）

## クルト・レヴィンの法則：個人の行動変化の指標
`B[ビヘイビア]＝f(P[パーソナル],E[エンビロンメント])`

特に職場環境に依存する（挨拶をしなくなる理由）

## 外部講師・社内トレーナーのメリデメ比較
新しい風、内容が汎化される（社内技術に依存しない）
コスト感（謝礼金だけでなく、会場費や受講生の宿泊費・交通費など）

教育の質を取るか、費用を取るか
→費用のかからない社内トレーナーの教育の質を高めよう！

:::note warn
私の立場としては「費用のかからない」という点にフォーカスするのは危険な気がしており、全部を鵜呑みにするのは懐疑的
講義の品質や講師スキル（正しくは新卒研修やリーダー研修などのスキル装着を促進しやすい教え方や学び方の指導力）を高めるといった観点で見るべきかと
:::

## 成功への道
### 研修選定：ボリュームゾーンを中心に
- 業務スキル（元々外部講師にはできない）
- 一般スキル・レジリエンス（今回のメインレンジ）

社内研修は上役が教える関係になるため、特に役員研修を社内メンバーで実施するのはほぼ不可能（講師が講師にならないため）
→こういうケースは立場に捉われない外部講師を使う
部署ごとに１名、専任のフォローアップ役を立てる

### 人材選定
- 適正分析
  - 専門知識・経験
  - コミュニケーション能力
  - 成長支援ができる
  - 柔軟性
- （以下、私見：現場の社内メンバーから選抜すると現場の負担が増える問題がある）
  - 現場を知る人事部の人間
    - 外部講師の研修を見たり携わってきた担当者
  - 外部人材を社内研修ポジションで採用する
  - 人材育成チームをSWATにする

:::note warn
外部講師とうまく連携して、ドメインスキル面は社内でフォローアップするというのが目的であるべき
専門性が高い、というよりは外部講師でも対応できる部分をアウトソーシングするイメージ
社内開発メンバーを動員できるならそれでも良いが、本来の業務に合わせて研修計画を策定してアセスメント設計して講義評価をする…というのはリソース面で結構厳しい
:::

### フォローアップ：トレーナーから受講者へ
研修後のエンゲージメントが重要
外部講師は契約が切れた後のフォローができないため

研修後に定期的に集まる機会を持つことで意識づけを促す

### トレーナー育成計画：外部講師を使ってトレーナーを育成（ここも内製化したいね）
- トレーナー向け講座を活用する
- 教材開発・使い方の指導
- トレーナーサポート・コミュニティを作る

講師を育てるのが最もスキルアップの近道になる

## 社内トレーナー育成時の課題
- コミュニケーションの密度
  - リモートにより縦方向（レポートライン。報連相）は維持されたものの、横方向（同僚など雑談）は失われた
  - 職場ミーティング施策

## 所感
### 全体
当期の新卒社員に次期の新卒社員研修を何とかしてもらおう（変えよう）という動きが主に見えた。キーワードのように「レジリエンス強化」を主張していたが、私の経験からやるべきは研修計画や体制を改善して離職防止に繋げる施策は中長期的には危険（属人化を免れていない）だと考えているため、この辺りは銀の弾丸はなさそう。
取り入れられるべきを取り入れてみて、試行錯誤をしていくしかないか。
研修施策やフォローアップをどんなに強化しても、研修後に離職する流れの根本的な解決につながらないため。
それよりは、現場改善を考えるべきで、もっと言うとパーパスの方が先じゃないか？という気がした。
パーパスが変われば現場の意識が変わってくるので、研修負荷を下げられる（研修コストを下げる）方に話を進めやすいので、本セミナーのように社員育成を人事に丸投げする姿勢も疑問。
ただし、人事部が社内施策としてアプローチを検討するという意味では良いセミナーだった。

参加者間で課題や困りごとをディスカッションできればもう一つ良かったのかもしれない。

### Z世代目線では非効率的な施策に見える
社内トレーナーが実施する時の課題になりそう。非効率的な活動を全社または部署から発信されるとげんなりする。特に事前告知や説明会もなく「やります」という通知だけだと反発を生みやすい
個人的または講師の立場としては、本セミナーの内容に「いいね！」とは思いつつ、私も可能な限りコミュニケーションしたくない（返信も面倒だし、連絡も送ってほしくない）ので、業務外または業務時間内でも業務に直接関わらない施策を一方的に通知されると萎えるし、会社に反感を持つ施策である事も念頭におく必要はありそう。
【ECCV2024】Vision Transformerの特徴マップを高密度化する軽量な変換手法「LiFT」

# Vision Transformerの特徴マップを高密度化する軽量な変換手法「LiFT」
## LiFT: A Surprisingly Simple Lightweight Feature Transform for Dense ViT Descriptors

## 概要

Vision Transformer (ViT)の特徴マップを高密度化する新しい軽量な手法「LiFT」を紹介します。LiFTは事前学習済みViTの出力特徴マップを2倍の解像度に拡大し、物体検出やセグメンテーションなどの密な予測タスクの性能を向上させます。従来の手法と比べて計算コストを大幅に抑えながら、高い性能向上を実現しています。

## 背景と課題

Vision Transformerは画像認識タスクで高い性能を示していますが、パッチ分割による粗い特徴マップが密な予測タスクでの性能を制限していました。


![IMG_3384.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/c2952905-9db4-be87-7485-d447420cf610.jpeg)

> 従来は特徴マップの密度を上げるために、(1)モデルサイズを大きくする、(2)入力解像度を上げるという2つの方法がありましたが、いずれも計算コストが大幅に増加するという課題がありました。

例えば、DINO ViT-S/16からDINO ViT-B/16に拡大すると、パラメータ数が304%増加します。また入力解像度を2倍にすると、計算量が298%増加してしまいます。

## 提案手法

LiFTは、以下のような特徴を持つ軽量な特徴変換モジュールです：

![IMG_3385.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/531bebcf-d665-4305-5a71-1aabf231bda7.jpeg)


1. ViTの出力特徴マップと元画像の両方を入力として受け取ります
2. 小さなCNNで元画像から細かい特徴を抽出
3. U-Net風のモデルで特徴を融合し、2倍の解像度の特徴マップを生成
4. 自己教師あり学習で訓練可能

学習には以下のような再構成損失を使用します：

```python
L_Recon = d(F(x), Θ(F(x_1/2), x_1/2)) + d(F(x_1/2), Θ(F(x_1/4), x_1/4))
```

ここで、F(x)はViTの特徴抽出、Θ(・)はLiFTモジュール、dはコサイン距離を表します。

## 実験結果

SPair-71kのキーポイント対応付けタスクでの性能比較：

![IMG_3386.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/86667782-34c8-ef2c-cb1b-01533f133ce6.jpeg)

![IMG_3387.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/e1097c9c-3b82-6e2b-83c3-ea176cde74be.jpeg)


- DINO+LiFTは全ての解像度でベースラインを上回る性能を達成
- 特に低解像度(56x56)での性能向上が顕著
- パラメータ数の増加はわずか5.7%、計算量の増加は22.1%に抑制

さらに以下のタスクでも性能向上を確認：
- DAVISビデオセグメンテーション
- COCO物体検出・セグメンテーション
- 教師なし物体発見

## まとめと考察

LiFTの主な利点：
- 軽量で効率的な特徴マップの高密度化
- 様々なViTバックボーンに適用可能
- 複数回の適用による更なる高密度化も可能

今後の展望：
- より大規模なモデルへの適用
- 新しいタスクへの応用
- 構造の最適化

本研究は、ViTの密な予測タスクにおける性能向上を、計算効率を維持しながら実現する新しい手法を提案しました。実用的な計算コストで高い性能が得られることから、

## 参考文献

Saksham Suri, Matthew Walmer, Kamal Gupta, Abhinav Shrivastava. "LiFT: A Surprisingly Simple Lightweight Feature Transform for Dense ViT Descriptors". University of Maryland, College Park.​​​​​​​​​​​​​​​​
SAM2を上回る！？「SAMURAI」

# SAMモデルをベースにした高精度な物体追跡手法「SAMURAI」
## SAMURAI: Adapting Segment Anything Model for Zero-Shot Visual Tracking with Motion-Aware Memory

Segment Anything Model 2（SAM 2）の物体セグメンテーション能力を活かしながら、動的な物体追跡に特化した新しいアーキテクチャ「SAMURAI」を提案した研究です。従来のSAM2では難しかった混雑な場面での追跡や遮蔽物体の追跡について、動きを考慮したメモリ管理機能を導入することで大幅な性能向上を実現しています。特筆すべきは、追加学習なしでこれらの改善を達成した点です。

## 背景と課題

SAM 2は優れた物体セグメンテーション性能を持ちますが、ビデオ中の物体追跡タスクでは以下のような課題がありました。

![IMG_3380.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/c6d25a0f-5ead-3d39-5d2c-a5ca3641b458.jpeg)



図1に示すように、SAM 2には主に2つの課題があります：

1. **混雑シーンでの誤追跡**
- 類似した見た目の物体が近接する場合に誤認識
- 物体の動きの情報を考慮していないため、予測が不安定

2. **遮蔽時のメモリ管理の問題**
- 単純に直近のフレームを記憶する方式では不十分
- 遮蔽された物体の特徴が正しく保持されない
- 誤った予測が連鎖的に伝播

## 提案手法

SAMURAIは以下の2つのモジュールを追加することで、これらの課題に対処します：

![IMG_3381.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/9d95794d-f0e2-b46d-f790-b5bc6a368253.jpeg)


### 1. 動き予測モデル
- カルマンフィルタを用いて物体の動きを予測
- 状態ベクトル: [x, y, w, h, dx, dy, dw, dh]
  - (x,y): 中心座標
  - (w,h): 幅と高さ
  - (dx,dy,dw,dh): それぞれの変化量

```python
# 動きスコアと類似度スコアの統合
def select_mask(masks, motion_scores, affinity_scores):
    final_score = α_kf * motion_scores + (1 - α_kf) * affinity_scores
    return masks[np.argmax(final_score)]
```

### 2. モーション考慮型メモリ選択
- 3つのスコアに基づくメモリ管理
  1. マスク類似度スコア
  2. 物体存在スコア
  3. 動きスコア
- 全てのスコアが閾値を超えるフレームのみを記憶

## 実験結果

![IMG_3382.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/38641050-eaed-6508-9c05-9463d6359575.jpeg)
![IMG_3383.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/fd5fbfe5-daea-45de-c127-25bef666c1b4.jpeg)


主要なベンチマークデータセットでの評価結果：

1. **LaSOTデータセット**
- AUC: 74.2% (SAM 2比で+5.7%)
- Precision: 82.7% (SAM 2比で+6.5%)

2. **LaSOT_extデータセット**
- AUC: 61.0% (新記録を達成)
- 特に複雑なシーンでの優位性を確認

3. **処理速度**
- ベースラインと同等のリアルタイム処理を維持
- 追加の計算コストは最小限

特に注目すべき点として、これらの改善が追加学習なしで達成されている点が挙げられます。

## まとめと考察

SAMURAIの主な貢献は以下の点です：

1. **実用性の向上**
- 追加学習不要のゼロショット性能向上
- 最小限の計算コスト増加

2. **改善手法**
- 動き予測スコアなどの統合したスコアを導入
- メモリ管理における効率の向上


SAMURAIは、既存のSAM2モデルの能力を最大限に引き出しながら、計算コストも抑えました。より複雑なシーンでの対応が可能になったことで、実世界への応用も期待されているモデルです。

## 参考文献

Yang, C. Y., Huang, H. W., Chai, W., Jiang, Z., & Hwang, J. N. (2024). SAMURAI: Adapting Segment Anything Model for Zero-Shot Visual Tracking with Motion-Aware Memory. arXiv preprint arXiv:2411.11922v1.
県のリスキリング講座のデータ加工基礎（Power Query)を受けてみて

# 最初に
　この記事は、Power BI Advent Calendar 2024　10日目の記事です。

 https://qiita.com/advent-calendar/2024/powerbi

# 自己紹介・内容
　佐賀県の小売業で情シスをしています。
　

 
# 佐賀大学DXリスキルプログラムとは
　佐賀県内に居住又は勤務されている方で、就業されている方対象に 10月～12月の土日に行われる短期集中型の講座で座学・グループワーク・ハンズオン等の様々な学習を受講できるプログラムとなっています。
 
また技術の勉強よりも経営戦略・ビジネス企画等がメインとなっており、技術については組織内で展開する上での基礎知識を取得する受講する程度になっています。

 https://www.sagallege-dx.admin.saga-u.ac.jp/course/considering-new-business/


## Microsoft製品の講座ついて　  
　
 Microsoft365・Power Platformの講座は、Power Appsの他にCopilot、Power Queryが講座に含まれており、専門講師による座学・ハンズオンが行われました。
 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/e5838789-ca32-a949-3189-0b80ebb8be27.png)



## Power Query講座のアシスタントに
初心の気持ちでPower Queryのハンズオンを受講しようと思ったが、Power Queryの知識を有していることもあり、受講者である私が何故かアシスタントをすることなりました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/3debaa38-508b-4130-9e90-49a9d65565d9.png)



## 結果
データソースはCSV若しくはexcelファイルを使ってのデータクレンジングで、2時間という短い時間でドタバタしたが何とか終わり、組織内に展開してみよういう人もいたので、Power Queryの良さが伝わったと思います。


### よかったこと

#### ビジネスデータを元に行っている
 よくあるビジネスデータを元にPower Queryによるデータクレンジングをメインに行ったこと。
エクセルファイルの場合には、データをテーブルにしてからPower Queryにて変換処理を行っていた点。
 

#### 作業内容を記録する
 Power Queryのベストプラティクスに「作業内容を文書化する」があり、ステップ名に行った作業名を入力若しくはコメント入力をすることが徹底されていた。

https://learn.microsoft.com/ja-jp/power-query/best-practices#document-your-work


####  学習の意欲の高さ
土日に行われる講座なので、受講者自体が学習に熱心であり、質問があれば手を挙げらて操作方法等を聞かれたので私自身も前向きに教えることができた。



###  ただ課題が初心者殺しの内容だった

#### 初心者が諦めそうなエクセルデータ
課題がPower BI Desktopを使用し、JNTO(日本政府観光局）の「2023年～2024年の国籍/月別 訪日外客数」のエクセルデータをデータクレンジング作業する内容でした。


https://www.jnto.go.jp/statistics/data/visitors-statistics/


試しにエクセルデータを確認したら、Power Queryの2時間の講座にしては初心者が諦めてしまうようなデータクレンジング内容になっていた。

・2020年以降、エクセルの書式が変更されている
・セルの結合がされている。
・列方向に計がある
・行方向に様々な計が存在する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/9dc7523d-cadb-0745-3e42-82342e00a1a2.png)

手順書もありましたが「長く使用できるクエリ」でなかったり、計算部分も「暗黙のメジャー」しか使用していない等、初学者が学ぶにはこれで十分かもしれないが、間違った方向に進まないかと少し不安になった。


## まとめ
アシスタントではあるがオンサイトで社外の人にPower Queryを教えることがなかったので刺激になりました。

課題については、間違った方向に進まないように近々地域コミュニティ内で勉強会を開いてみようと思う。