OmniAICreator/Qiita-1.07M huggingface dataset:
watsonx.dataでのコンピュートとストレージの分離

# はじめに

コンピュートとストレージの分離とは、データの処理において、データを処理するクエリーエンジン（コンピュート）とデータを保存するストレージを、物理的あるいは論理的に分けるアーキテクチャのことです。
SnowflakeやBigQueryのような主要なクラウドデータウェアハウスサービスで採用されています。

従来のシステムでは、これらの機能が同じハードウェア上で一体化されていました。
コンピュートとストレージを分離することで、それぞれのリソースをより柔軟に利用することができるようになります。
具体的には､データ処理の要求に応じて異なるクエリーエンジンを選択できるようになります｡
そのため､例えば処理速度が重要なタスクでは高性能なクエリーエンジンを使用し、速度がそれほど重要でないタスクでは低スペックなクエリーエンジンを選択することで、効率とコストのバランスを最適化できます。

IBMのデータレイクハウスソリューションである「[watsonx.data](https://www.ibm.com/jp-ja/products/watsonx-data?utm_content=SRCWW&p1=Search&p4=43700078941394533&p5=p&gclid=Cj0KCQiAsvWrBhC0ARIsAO4E6f9mWcra6REmkqTGg2OFq580sLBDb_hrXHqZ0qar8gEzNjTgBw_M_egaAi8DEALw_wcB&gclsrc=aw.ds)」でも、このアーキテクチャを採用しています。
本記事ではwatsonx.dataでの挙動をご紹介します｡

# watsonx.dataでのコンピュートとストレージの分離

watsonx.dataのアーキテクチャは、下図のように3つの主要な層で構成されています｡
1) データに対する処理を実行するエンジン
2) データの定義（メタデータ）を保持するカタログ
3) データの実体を保存するバケット（ストレージ）<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/043281b9-e02e-fbf0-6b9b-694364c08fa9.png)

カタログの中にはサンプルデータとして､下図のようにmyschemaスキーマと､3つの列で構成されたaddressesテーブルがあります｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/6b75a1b1-6804-3824-2bc8-ebc03412885f.png)

なお､データの実体はバケット(今回はIBM Cloud Object Storage)の中にparquetファイルとして保存されています｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/030b9753-ffff-ba57-69a2-7974f52ec7c6.png)

エンジン"presto1"を削除してみます｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/fadf6600-d058-04df-63e7-6d66743f7b69.png)

新しいエンジン"presto2"を追加します｡
エンジンとカタログ間の接続を示す線を繋げていないことにご注目ください｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/6e19ca72-8f8d-85de-424a-b68bb86a5c5d.png)

カタログへの接続を行っていないため､データ・マネージャー画面ではまだカタログのデータを参照することができず､空になっています｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/e78d4fad-46d8-ed85-a455-af056328b003.png)

エンジン"presto2"をカタログに接続します｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/efe05515-6b86-a6db-6422-3e1ac1c37a7c.png)

エンジン"presto1"を接続していたときと同様に､エンジン"presto2"でもカタログ内のデータを見ることができるようになりました｡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612462/6b7d4303-81d3-1a08-c7fe-c117fccdb4b1.png)

# まとめ
このように､watsonx.dataでもコンピュートとストレージの分離により､同じデータに対してエンジンを切り替えることが可能であり､エンジンの柔軟な選択や、処理速度とコストの最適化が実現されます。
さらにwatsonx.data固有の特徴として､PrestoやSparkといった異なる種類のエンジンをサポートすることで､目的に応じたエンジンの使い分けをより柔軟に行うことができるようになります｡
今どきのBasic認証＠CloudFront

🎅🦌こちらは ZYYX Advent Calendar 2023/12/24の記事です。✨🎄✨

# 概要
CloudFrontを入れている環境下でBasic認証を掛けたい場合、Lambda@Edgeでやるのはもう古いかも？CloudFront Functionでサクッと済ませるのが良さげ。というお話です。

# Lambda@EdgeでBasic認証を実現
4年くらい前に、以下の記事などを参考にCloudFrontを入れている環境下でLambda@Edgeを用いてBasic認証を掛けてみました。
https://qiita.com/takahashi-kazuki/items/688f5f736bd76682483c

（ちょっと手順が多くて大変だったけど）なんとかBasic認証できたー！ということで作業完了。

# CloudFront FunctionでBasic認証を実現
そして直近、別件でまたBasic認証を掛けることが有り、あの手順めんどくさかったな…ということを思い出し、別のやり方を調べ以下の記事などを参考に、CloudFront FunctionでBasic認証を実現しました。
https://dev.classmethod.jp/articles/apply-basic-authentication-password-with-cloudfront-functions/

あっさり作業完了しました。
1点、ビヘイビア設定のレスポンスヘッダに Authorization を追加しておく必要がありました。

# 比較
作業内容のシンプルさとしては、Lambda@EdgeよりCloudFront Functionを用いる方が断然楽でした。
また、CloudFrontのビヘイビア設定でどのように関数の関連付けを行ってるかによっても前提条件が変わってくるんですが、毎月のリクエスト回数が全く同じだった場合、料金はCloudFront Functionの方が安くなります。

# おわりに
AWS上で作っていたものについて、数年後にもっと簡単・安価に済ませられるやり方が登場してた、ということはよくありますよね。
その辺のアンテナはちゃんと張り続けておかなくてはなー、ついでにAWSの認定試験も数年おきにちゃんと受け直さなきゃなーと思いました。（次回の認定試験の更新日、いつだっけ…）
phpからshopifyアプリ制作メモ

## テンプレートを利用する
shopifyが用意しているPHPテンプレートを使えば、認証などは書かなくてよくなるので、これを使う、また参考にするのが良い(あまりメンテンスはされていない...やはりnodeやrubyかで開発したほうが良いかも）

https://github.com/Shopify/shopify-app-template-php



用意されているapiのスコープは「shopify.app.testlaravel.toml」から変更する
ただ、一度動かしていると変更しても反映されないので「npm run dev -- --reset」を実行する。
同様の質問をしている人がいなければ、原因が分からず、はまった可能性がある

https://community.shopify.com/c/shopify-apps/access-denied-for-scripttagcreate-field-required-access-write/m-p/2314957



## フロントにjsを追加する
script apiを使う(別の方法もあるようだが調べきれていない)

同じurlのjsでも何回でも登録できるので判定処理を入れる必要があると思う。


```php
//取得
Route::get('/api/script_tag/all', function (Request $request) {
    $session = $request->get('shopifySession');
    $success = $code = $error = null;

    
    try {
        $success = ScriptTag::all($session,[],[]);
        $code = 200;
        $error = null;
    } catch (\Exception $e) {
        $success = false;
        if ($e instanceof ShopifyProductCreatorException) {
            $code = $e->response->getStatusCode();
            $error = $e->response->getDecodedBody();
        }else {
            $code = 500;
            $error = $e->getMessage();
        }       

        Log::error("Failed to create products: $error");
    }finally {
        return response()->json(["success" => $success, "error" => $error], $code);
    }
})->middleware('shopify.auth');


//作成
Route::post('/api/script_tag/create', function (Request $request) {
    $session = $request->get('shopifySession'); // Provided by the shopify.auth middleware, guaranteed to be active

    $script_tag = new ScriptTag($session);
    $script_tag->event = "onload";
    $script_tag->src = "https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.min.js";
    $script_tag->save(true);
})->middleware('shopify.auth');


//削除
Route::get('/api/script_tag/delete', function (Request $request) {
    $session = $request->get('shopifySession'); // Provided by the shopify.auth middleware, guaranteed to be active

    $all_data = ScriptTag::all($session,[],[]);

    // 各script_tagをループし、idを削除
    foreach ($all_data as $scriptTag) {
        ScriptTag::delete(
            $session, // Session
            $scriptTag->id, // Id
            [], // Url Ids
            [], // Params
        );
    }
    
})->middleware('shopify.auth');
```
Windowsの環境変数にパスを追加する関数(PowerShell)

ユーザー環境変数へパスを追加する方法は以下

```powershell
$new_dir = "C:\HOGE"

$new_path = [Environment]::GetEnvironmentVariable("Path", "User")
$new_path += ";$new_dir"
[Environment]::SetEnvironmentVariable("Path", $new_path, "User")
```

こんなん毎回入力してられないので関数を作っておku

# 関数

下記をPowerShellの`.bashrc`的なファイルにコピペしておく
そのパスは`$profile`で確認できるから`code $profile`するとVSCodeで編集できるよ

```powershell
function add_path {
    param ([string]$new_path)

    $new_path = $new_path -replace '/', '\'

    # フォルダが存在しないなら終了
    if (-not (Test-Path -Path $new_path -PathType Container)) {
        Write-Output  "指定されたパスのフォルダは存在しません: $new_path"
        return
    }

    # 環境変数Pathを取得 (ユーザー)
    $user_path = [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::User)

    # すでに追加済みであれば終了
    if ($user_path -like "*$new_path*") {
        Write-Output  "パスはすでに環境変数に存在します: $new_path"
        return
    }

    # パスを追加
    if (-not $user_path.EndsWith(";")) {
      $user_path += ";"
    }
    $user_path += $new_path
    [Environment]::SetEnvironmentVariable("Path", $user_path, [EnvironmentVariableTarget]::User)

    Write-Output "新しいパスをユーザー環境変数に追加しました: $new_path"
}

function show_path {
  [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::User).Split(";")
}
```

自分用なんだしPowerShellのコーディングスタイルなんて気にしない

# 使う

`C:\flutter\bin>`を追加してみる

```
PS C:\flutter\bin> add_path C:\flutter\bin
新しいパスをユーザー環境変数に追加しました: C:\flutter\bin

PS C:\flutter\bin> show_path
C:\Users\inarb\AppData\Local\pnpm
C:\Users\inarb\AppData\Local\Programs\Python\Python312\Scripts\
C:\Users\inarb\AppData\Local\Programs\Python\Python312\
C:\Users\inarb\AppData\Local\Programs\Python\Launcher\
C:\Users\inarb\AppData\Local\Microsoft\WindowsApps
C:\Users\inarb\AppData\Local\Programs\Microsoft VS Code\bin
C:\Users\inarb\AppData\Local\Microsoft\WinGet\Packages\DenoLand.Deno_Microsoft.Winget.Source_8wekyb3d8bbwe
C:\flutter\bin

PS C:\flutter\bin> add_path $(pwd).Path
パスはすでに環境変数に存在します: C:\flutter\bin
```

いい感じ

# 参考

- [Windows10/11でPowerShellからパスを通す (環境変数PATHの変更) #Windows - Qiita](https://qiita.com/zakuroishikuro/items/754e44e4b59580ca451d)
2023.11 ⑥カタログソースのクローン

# はじめに

<!-- ★『インフォマティカが提供する、 CDGC(データガバナンスとデータカタログ)を使って』までは定型文 -->
[インフォマティカ](https://www.informatica.com/jp/)が提供する、 [CDGC](https://www.informatica.com/jp/products/data-governance/cloud-data-governance-and-catalog.html)(データガバナンス＆カタログ)において、2023年11月にリリースされたバージョンで、新たに追加されたQカタログソースのクローン機能について記載します。
※2023/12時点の情報を元にしています。

設定をコピーして複製を作ると言う、かなり地味な機能ですが、手間を減らす有効な機能となっています。

# クローンとは？
メタデータコマンドセンターのカタログソース設定画面にて、右上に「コピー」ボタンがあるので、こちらをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/7f829851-465c-4d7f-9525-f0019f27c370.png)

別のカタログソースが作成され、「_copy」と言う接尾語が自動的に付与されます。名前自体は自由に変更して頂いて構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110338/322a8e0c-c5fd-f906-f92c-556550672caf.png)

:::note info
クローン作成では、機密フィールドの内容はコピーされません。カタログソースにクライアントシークレットなどの機密フィールドが含まれている場合は、値を入力してください。
:::


# どんな時に嬉しいのか？
初期設定時に、同じようなカタログソースを連続して追記する場合や、トラブルシュート時に複数の変更をして試行錯誤したい場合などに有効です。

# 参考文献
<!-- ★URLをそれぞれのカタログ・ソースに応じて変更する -->
- [**Cloning a catalog source configuration - マニュアル** *ログインが必要](https://docs.informatica.com/data-governance-and-quality-cloud/metadata-command-center/current-version/catalog-source-configuration/manage-catalog-sources/cloning-a-catalog-source-configuration.html)
ヘッドレスCMSをプログラミング初心者がまとめてみた

## はじめに
今回、新規プロダクトのメディアサイト開発に携わることになりました。

[WordPress](https://wordpress.com/ja/)と[Astro](https://astro.build/)というフレームワークを組み合わせた**ヘッドレスCMS**で実装することになったのですが、そもそもヘッドレスCMSについて知らなかったのでできる限り噛み砕いてまとめてみます。

私と同じようなプログラミング初心者の方の参考になれば嬉しいです。

### 自己紹介
私は2023年9月1日にフロントエンドエンジニアとして自社開発のSaaS企業に入社しました。
未経験独学で、薬剤師からの転職です。
詳しくはこちらをご覧ください。

https://qiita.com/odendayoko/items/f616b2f1952897a9af5d

## ヘッドレスCMS
まず従来の**CMS**とは、**「Contents Management System」** の略で、Webサイトのコンテンツを構成する画像やテキスト、デザイン・レイアウト情報を一括で管理・保存する仕組みです。**バックエンド（コンテンツの管理）もフロントエンド（コンテンツの表示）もどちらも一括で管理**します。代表的なCMSがWordPressです。

（ここで補足なのですが、転職活動時のポートフォリオで作成したWEBアプリケーションは、Railsを使ってバックエンドもフロントエンドも管理していますが、CMSとは呼びません。あくまで、ブログやメディアサイトなど、管理者がいて管理者が投稿、編集したものをユーザーさんに見せているようなWEBサイトが対象です。）

一方**ヘッドレスCMS**とは、ヘッド（フロントエンド）がないCMSです。フロントエンドはバックエンドと切り離して、別で作ります。言い換えると、コンテンツを管理するためだけに作られた仕組みと言えます。
作成されたコンテンツはAPIを通じて、別で作ったフロントエンドに表示します。それぞれ**バックエンドとフロントエンドの機能が独立している**のがヘッドレスCMSの最大の特徴です。

以下に特徴をまとめます。

|  | 一般的なCMS | ヘッドレスCMS |
| --- | --- | --- |
| フロントとバッグエンドの関係性 | 密接 | 独立 |
| フロントエンド（コンテンツの表示） | ◯ | ✕　
| バックエンド（コンテンツの管理） | ◯ | ◯
| 表示速度 | 遅い | 速い |
| フロントエンド開発の自由度 | 低い | 高い |
| サイバー攻撃 | 受けやすい | 受けにくい |

### ヘッドレスCMSのメリット

- 表示が速い
- フロントエンド開発の自由度が高い
- セキュリティが強い
- フロントエンドの改修を行いやすい

#### 表示が速い

フロントエンドであらかじめWEBサイトで表示するデータを作っておくため、毎回データベースを読み込んでページを呼び出す必要がない分速いです。


#### フロントエンド開発の自由度が高い

通常のCMSの場合、例えばWordPressはPHPベースのCMSなのでPHPベースで作る必要があります。

一方ヘッドレスCMSでは、APIを通じてコンテンツをフロントエンドに配信するため、フロントエンドのプラグラミング言語は自由に決められます。

#### セキュリティが強い

動的コンテンツの方がサイバー攻撃で狙われやすいそうです。

ヘッドレスCMSではフロントエンドには静的ファイルのみが置かれるため、CMSに比べてセキュリティが強いと言えます。

動的とか静的とかよくわかんないですね。誰がみても同じで変化がないのが静的と私は解釈しています。

#### フロントエンドの改修を行いやすい

ヘッドレスCMSは、UI（見た目）となるフロントエンドと、コンテンツを管理するバックエンドが互いに独立しています。そのため、フロントエンド部分を改修してもバックエンドには影響がなく、自由にフロントエンドの改修を行えます。

### ヘッドレスCMSのデメリット

- 求められる知識・経験が幅広い
- 動的な機能には別途外部ツールが必要

#### 求められる知識・経験が幅広い

要は難しいし大変ってことです。

導入するには、専門的なフロントエンドの知識を持ったエンジニア、API設計ができるエンジニアが必要です。外注しても雇ってもコストがかかってしまいます。

#### 動的な機能には別途外部ツールが必要

全て静的なページだったらいいのですが、そうもいかないことがあります。問い合わせフォームなどが当てはまります。必要な機能やUIを洗い出し、フロントエンドや外部ツールも含めて設計する必要があります。


## WordPressをヘッドレス化
WordPressは代表的なCMSの1つですが、WP REST APIを利用することでヘッドレス化が可能です。

私の会社では、メディアに掲載する記事を書くチームがWordPressを利用しています。プログラミングの専門的な知識がなくても、簡単に記事を編集し、管理することができます。

一方で、フロントエンドは**Astro**というフレームワークで実装することになりました。Astroで静的なコンテンツを作成し、必要なところだけWP REST APIを叩いてデータを取得します。こちらは専門的な知識が必要なため、エンジニアチームが担当します。

多くの人が閲覧するメディアページでは、読み込みが遅いとユーザーさんは離れてしまうので、とにかく速く情報を表示することが求められます。ヘッドレスCMSを使うことで、管理側はメンテナンスもしやすく、ユーザーさんにも優しいというメリットがあることがわかりました。

## 終わりに
これまでポートフォリオや自社プロダクトにおいて、WEBアプリケーションしか作ったことがなかったのですが、新しくWEBサイトになり、仕組みや求められることを学ぶことができました。
WEBサイトでは、基本的にはすべてのユーザーさんに同じものを見せればいいからできる限り速く表示したい、また管理する側としても簡単でコストがかからない手段をとりたい、それを実現するためにヘッドレスCMSを選択したのだと思いました。

仕組みを知ると、なぜその技術選定を取ったのかを理解できて面白いですね。これからも色々な開発に携わりたいです！


### 参考記事

https://www.kagoya.jp/howto/it-glossary/develop/headlesscms/



https://wakka-inc.com/blog/1947/
【Premiere Pro】自動生成した字幕にテンプレート化した装飾を反映する手順

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はAdobe Premiere ProのAIで自動生成した字幕にテンプレート化した装飾を反映する手順を備忘録的に残しておきます。これが出来るようになることで面倒な文字起こしから文字の装飾迄簡単に出来るようになります。

# 手順
## 装飾のテンプレートを用意する
適当なプロジェクト（現在進行形で編集しているプロジェクトでも全く問題ありません）を開き適当に文字を入力します。
テンプレート化したい文字の装飾が出来上がったら「スタイルを作成」を押下します。今回は青の文字に白・青のアウトラインをひいた装飾をテンプレート化していきます。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/256c7927-eb38-6b3b-007a-e502c75b99f3.png)
※完全に余談ですが、この記事を執筆しているのが12/16でクリスマス間近でした。Qiitaに記事をあげるためのサンプル動画を探している時に全くの偶然で、クリスマス帽を被ったマッチョなイケメン男性が半裸でシャンパンを嗜んでいるというカオス（誉め言葉）な動画を発見しました。ファイル名もカオス！videoAC様ありがとうございます！この動画を見たい人は以下にアクセス！

https://video-ac.com/video/4537

テキストスタイルの名前を求められるので任意のものを入力します。今回は男性字幕としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1112844b-31b5-e2ec-0fc9-7019a6508413.png)

保存完了後、左下に表示がされるので「テキストスタイルを書き出し」を選択します。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/acda3927-246c-5151-a47e-cff9955c93a0.png)

今回はデスクトップに保存してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ff832d78-ce0b-2a30-b747-68aac01dcb75.png)

## 装飾のテンプレートを自動テロップに反映する
まずいつも通り、AIを使って自動文字起こしからキャプションを作成します。
キャプションの作成の仕方は以下の記事に書いているので、もしわからなければ併せて参考頂ければと思います。

https://qiita.com/ohtsuka-shota/items/91c230e3f0acde67945d

キャプション（タイムラインのオレンジのところ）が出来たら、装飾したい部分を選択して「グラフィックとタイトル」タブにある「キャプションをグラフィックにアップグレード」を押下します。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f5096012-a19b-8b97-2c26-d61571f29a0e.png)

するとキャプションが下に移動します。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3313624e-736d-6274-54f3-5eefe501201f.png)

テンプレート化した装飾を呼び出します。
画面左下をダブルクリックする（動画やBGMをプロジェクトに認識させる時と同じ）とexplorerが開きますので、先ほど保存したテンプレートを選択し、開くを押下します。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9cc3b3c0-8020-8644-9444-9b5842870089.png)

読み込みに成功すると画面左下にテンプレート化された装飾が表示されます。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e061c680-c3cd-91d2-e914-9e01555b701a.png)

あとは編集したい字幕を選択して、スタイルに表示されているテンプレートの名前、今回は男性字幕という名前を選択してあげると、字幕に装飾が反映されます。
よく使う装飾はテンプレート化しておくと便利ですね！
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/c89808a7-28f8-baba-25ab-a4fb763ec41f.png)
総務省CTF writeup

総務省CTFに参加したので備忘録です。

zo113、150ポイントでチームの中で一番貢献できませんでしたね。

まあでもチームメンバーのおかげで8位を取ることができたので満足。

途中で予定があり抜けたので正直もうちょっと本腰入れたかった。

## redacated
初手ghidraで出てきた配列が0x35でxorするとフラグだとコードにより自明なのでpython3でワンライナー。

redacated [reversing]
```C
undefined8 main(void)

{
  long in_FS_OFFSET;
  ulong local_150;
  undefined4 local_148 [60];
  byte local_58 [72];
  long local_10;
  
  local_10 = *(long *)(in_FS_OFFSET + 0x28);
  local_148[0] = 0x73;
  local_148[1] = 0x79;
  local_148[2] = 0x74;
  local_148[3] = 0x72;
  local_148[4] = 0x4e;
  local_148[5] = 0x42;
  local_148[6] = 0x5d;
  local_148[7] = 6;
  local_148[8] = 0x5b;
  local_148[9] = 0x6a;
  local_148[10] = 0x4c;
  local_148[11] = 5;
  local_148[12] = 0x40;
  local_148[13] = 0x6a;
  local_148[14] = 3;
  local_148[15] = 0x54;
  local_148[16] = 0x4f;
  local_148[17] = 0x50;
  local_148[18] = 0x6a;
  local_148[19] = 0x5c;
  local_148[20] = 0x5b;
  local_148[21] = 0x41;
  local_148[22] = 5;
  local_148[23] = 0x6a;
  local_148[24] = 1;
  local_148[25] = 0x5d;
  local_148[26] = 0x50;
  local_148[27] = 0x6a;
  local_148[28] = 0x54;
  local_148[29] = 0x57;
  local_148[30] = 0x4c;
  local_148[31] = 6;
  local_148[32] = 6;
  local_148[33] = 0x6a;
  local_148[34] = 1;
  local_148[35] = 0x5d;
  local_148[36] = 0x50;
  local_148[37] = 0x6a;
  local_148[38] = 1;
  local_148[39] = 0x57;
  local_148[40] = 0x4c;
  local_148[41] = 6;
  local_148[42] = 0x46;
  local_148[43] = 0x6a;
  local_148[44] = 0x52;
  local_148[45] = 1;
  local_148[46] = 0x4f;
  local_148[47] = 0x50;
  local_148[48] = 0x46;
  local_148[49] = 0x6a;
  local_148[50] = 4;
  local_148[51] = 0x5b;
  local_148[52] = 0x41;
  local_148[53] = 5;
  local_148[54] = 0x6a;
  local_148[55] = 0x4c;
  local_148[56] = 5;
  local_148[57] = 0x40;
  local_148[58] = 0x48;
  local_148[59] = 0x35;
  for (local_150 = 0; local_150 < 0x3c; local_150 = local_150 + 1) {
    local_58[local_150] = (byte)local_148[local_150] ^ 0x35;
  }
  printf("%s",local_58);
  puts(&DAT_00102010);
  if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return 0;
}
```

ソルバーをpython3で
```python

[print(x,end='') for x in list(map(lambda x: chr(x^0x35),[115, 121, 116, 114, 78, 66, 93, 6, 91, 106, 76, 5, 64, 106, 3, 84, 79, 80, 106, 92, 91, 65, 5, 106, 1, 93, 80, 106, 84, 87, 76, 6, 6, 106, 1, 93, 80, 106, 1, 87, 76, 6, 70, 106, 82, 1, 79, 80, 70, 106, 4, 91, 65, 5, 106, 76, 5, 64, 72, 53]))]
```

## gitty [misc]
gitレポジトリが渡されるのでgit diff HEAD^^^^^とか適当に遡ったら削除されたフラグが見つかる

# 感想
とても楽しかったです。

後輩とか巻き込んでTKCTF-clubを引き継がせて完走した感想を書かせたいですね。

うちの部のメンバーによるwriteup達
https://twitter.com/TKCTF_talker/status/1735983762075525219
FreeCADで作ったBlockのデータを3Dプリントしてみました〜その2〜

# ご挨拶
こんにちは。たいちゃんです。
12月ももう後半に差し掛かってきました。
今回は前回の[『FreeCADで作ったBlockのデータを3Dプリントしてみました〜その1〜』](https://qiita.com/toshita172/items/d5f91f7fde324e0b239d "")の出力方法の変更を試してみたことについて、紹介していきたいと思います。
# 前回迄のあらすじ
[『FreeCADで作ったBlockのデータを3Dプリントしてみました〜その1〜』](https://qiita.com/toshita172/items/d5f91f7fde324e0b239d "")では以下のようにことが運びました。
1) 元々は同じ秋葉原ロボット部の @KumahideSoukichi さんのレゴブロックのエレベータの説明図に使うブロックの図を、FreeCADで描けないかという話がありました。その後、技術書典15終了後の懇親会にて「3DCADデータからブロックを3Dプリンタを使って出力してみたらどうだろう」と @nanbuwks さんから提案を頂き、挑戦してみることにしました。
2) 3Dプリンタでの出力方法はサポート材と出力時間が若干少なそうだったので、その1ではひっくり返して出力する事にしました。
3) 肝心の接合部に当たる凸部周辺はボコボコになってしまいました。

![FreeCAD_Block_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/753e6bed-34f4-70f8-6b52-bfdcf324b772.png)
FreeCADにて作成した3DCADデータの上面部

![FreeCAD_Block_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/47320c10-ed17-286f-4420-79091d9f2b0d.png)
FreeCADにて作成した3DCADデータの底面部
# では今回の作戦は・・・
1) 裏返しにせず、そのままで出力します。
2) 更に、底面の品質を安定させる為、ラフトを付けます。
以上2点です。

![BaseBlock_4x2_20231214_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/84178284-0f87-6ded-93c4-e3ba5347c061.png)
スライサーにインポートした状態です。今回も層の厚さは0.1mm、材質はABS樹脂で出力しました。

![BaseBlock_4x2_20231214_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/6ea56cab-bc48-fb4c-405f-245e660b57a7.png)
表示モードを『造形プレビュー』モードにして表示したところです。
## 出力結果
![No1_Raft_Untreated_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/aa407301-27da-f53c-b886-31b6f9002443.jpeg)
1個目の出力物の正面側上面です。下についている板のようなものがラフトです。表面は綺麗です。

![No1_Raft_Untreated_02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/cb3e1adc-8073-a0fd-97eb-5a832e36fbdd.jpeg)
1個目の出力物を側面から写したものです。こちらも表面は綺麗です。

![No2_Raft_Untreated_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/7cc0db18-7979-8fde-a297-c79ca52b3dd9.jpeg)
2個目の出力物の正面側上面です。こちらもラフトを付けたままです。表面は綺麗です。

![No2_Raft_Untreated_02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/c71b1300-f3fb-a1be-8686-21c25991823b.jpeg)
2個目の出力物を側面から写したものです。こちらも表面は綺麗です。

![No1_and_2_Raft_Treated_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/e95841f1-cfcd-1bcf-344a-74df82ac3be6.jpeg)
1個目と2個目の出力物のラフトとサポート材を取り除いたものです。画像では分かり難いですが、実物だと内部がボコボコしています。狭くてサポート材が取り切れないという要因もあります。

![Assembly_01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/59d6a248-8448-4d59-2f95-279767218c6a.jpeg)
2つを重ねて接合具合をみます。

![Assembly_02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/dfb76585-8acd-4020-fe5a-bdf4003e2892.jpeg)
上を持ち上げると下の方も持ち上がりました!!
# 結果
・裏返しにせず出力すると表向きはとても綺麗に出力することが出来ました。
・一方で裏側がボコボコになっていました。
・接合は1回目の物、2回目の物どちらを下にしても一先ず接合しました。
・しかし、何度か接合と分離を繰り返しているとゆるくなってきました。
# 考察と感想
・裏側はボコボコになっていたので、もし、高さの低いブロックを出力するときはもうひと工夫いるかもしれないと思います。
・接合と分離を繰り返してゆるくなっていくのを防ぐのは、線状の樹脂を並べたり、積み重ねたりして形成している3Dプリンタの特性上難しいと思います。

最後迄お付き合い下さり、有難うございました。
社内でカイゼンを少しずつ行ってたらＤＸになっていた。


## 最初に
 この記事はクラウド技術を活用して組織をカイゼンした事例を投稿しよう！　19日目の記事です。

 https://qiita.com/advent-calendar/2023/kinto-technlogies
 

## 自己紹介
　佐賀県の小売業（和服業）で情シスをしています。

　地方の着物チェーン店ンで、西日本を中心に７０店舗を構えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/cb69b04a-d827-3a1c-4992-8d88e34e4d85.png)


## カイゼンを行う前

紙とＦＡＸと電話・館内放送が多く、店舗からの要望が便箋で送られてくるような企業で、

またシステム自体もレガシーシステムを利用しており、パソコンでしか業務システムが利用できずクラウドとは無縁の企業でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/39219a64-3056-71a8-38a3-11d70727d00f.png)


## カイゼン活動

　
### 活用したPower Platformについて
　Power Platformは直感的なローコード開発による独自のソリューションを構築する機会を組織に提供出来るツールになります。

Power Platformのうち当社はPower Appsによるアプリ作成、プロセスの自動化であるPower Automate、データ可視化・分析であるPower BIを利用しており、このツールを活用して様々なカイゼン活動を行っています。


 https://learn.microsoft.com/ja-jp/training/modules/introduction-power-platform/2-explore-microsoft-power-platform
 


### ペーパーレスのためのデータ分析
 本社・店舗の複合機のカラー印刷や印刷枚数が多いため、ペーパーレスを目指すため、約８０第の複合機カウンタ情報を取得し、Power BIにて分析を行い、ペーパーレス化を目指す。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/99f4e7c9-f7d2-d779-978d-eba44db871d6.png)


### 社内イベントをカイゼン

日本の伝統衣装である着物を知ってもらうのと、社会貢献のため社員で着物を着て街を散策するイベントを行っているのです。

コロナの影響で集団での行動が難しくなり、グループを分けての散策をすることになってしまい、一体感が欠けて盛り上がりが欠けてしまう可能性があると考え、離れていてもイベントが共有できるような仕組みを、Power Platformを活用して考えてみました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/5c08f356-0e36-afb2-9c7d-c1f7546797d1.png)




 https://note.com/tkchan/n/nbc1832f67a7e



### 営業社員のカイゼン

営業社員の年齢が高く、お客様との接点情報は手帳に記録されている。
ＰＣ操作がとても苦手な営業社員でも、簡単に接点情報を登録できるようPower Appsにてアプリ作成し、タブレットによるお客様の接点を登録し、会社の資産として保存管理するようになりました。


https://qiita.com/tsukapon/items/90d18c565936ac3e2c3b


### 業務で集めたデータを元に分析
お客様によりよいサービスを提供するために、お客様との接点情報を元にPower BIにて可視化・分析を行い、さらなる顧客サービス向上を目指しました。

 https://www.docswell.com/s/5270562/51J924-2023-12-08-133724
 

## カイゼンを繰り返した結果

### 2022年　佐賀県のＤＸフラグシップモデル
　2022年は佐賀県のＤＸフラグシップモデルとして採択されることとなりました。

https://kn.itmedia.co.jp/kn/articles/2303/30/news011.html

### 2023年　日本ＤＸ大賞　受賞

 2023年4月に日本ＤＸ大賞をに応募を行い、203年6月にUX部門大賞・船井総研デジタル賞のＷ受賞しました。


https://www.saga-smart.jp/2023/20230623.html


### まとめ

地方の中小企業でＩＴとは無縁な業種でも小さなカイゼン活動を続けていけば、大きな結果がいずれ訪れるので、カゼン活動を何回も繰り返していきましょう。、
あの漫画の最新巻って家にあったっけ？

## 1. 皆さんは単行本で漫画を買いますか？
僕は好きな漫画は単行本で買います。
どの漫画もそうですが、新しい巻が出るには３か月間ほどかかりますよね。
それだけ待って出た最新巻を買うのはワクワクするものです。
もちろん一生懸命なファンなら単行本発売日などを事前にリサーチしていて
それに合わせて本屋に行ったり今ならネット注文したりするでしょう。

しかし、僕はどちらかというと本屋に寄った時に
最新巻が売っていたら買おうというスタイルの単行本派です。

え。ダメですか？

<img src="https://1.bp.blogspot.com/--9Rl2O4BBN0/X-Fct8K5mqI/AAAAAAABdEI/yLOziAqJO34fwn73AolVP0e42A2h-ql1QCNcBGAsYHQ/s992/onepiece06_chopper.png"width="500">


## 2. 購入時の問題点
私はこのスタイルを変えるつもりはありません。**←ワガママ**
本屋に寄って最新巻があるのにも関わらずもう読む気がなくなって買わなくなるタイトルもあるからです。
かと思えば本屋で見かけるとやはり読みたくなって買うというパターンもあります。

そこで問題が発生します。

**あれ、このタイトルの漫画は何巻まで持っていたっけ。**

そうです。自分が最新巻を読んだことがあるのかわからなくなるんです。
それどころか何巻まで持っているのかを忘れてしまうのです。

**記憶障害かよ！！**

というツッコミが聞こえてきますが
何度も読み返すわけでもないので記憶は曖昧になりますし
中身を少し読めば思い出せるのでしょうが
本屋で単行本の中身を見るのはなかなか難しいです。

実際にわたしはダイヤのAという野球漫画の21巻を3冊持っていたりします。
持っていないと思って３回買ってしまったのです。

楽しみに家に帰ったのに
持っていたことに気づいた２回の絶望感は忘れられません。

<img src="https://1.bp.blogspot.com/-WoPLgzbefuw/X-FcxFa-YjI/AAAAAAABdE0/42S9V3wWi400mGKLEiB_pQT-dqTKT28kwCNcBGAsYHQ/s1156/onepiece14_enel.png"width="500">

## 3. アプリを作って解決したい

そこで今回はGlideを使ってノーコードでアプリを作ることで
この問題を解決することにしました。
自分がどの漫画を何巻まで読んだのか。
または持っているのか。
それらを記録しておくアプリになります。

![スクリーンショット 2023-12-16 193637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554996/3a21a648-79d9-d7a4-77a6-450d1a069e58.png)

https://yokki2nomanga.glide.page

ぜひこちらのリンクから入るかQRコードを読み込んで
実際にどうなっているか試してみてください。
出先の本屋で使う想定なのでスマホで見ていただくのがよいかと思います。


## 4. アプリの使用感
今回はプロトタイプですので登録してある漫画の種類は４種類だけですが
十分に操作感は理解できるかと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554996/0518d789-6503-6f57-cb52-afc761111366.png"width="500">

↑まず自分が使う設定なのでアプリを開くとYokkiというわたしのページが出てきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554996/91d9e753-8cc6-685a-01e3-b154bc39eadf.png"width="500">

↑検索ツールでタイトルの一部を入力するとすぐにそのタイトルリストが出ます。
漫画を無限に持っていてもこれなら安心ですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554996/df303e99-1472-aab9-9079-29ba3463819b.png"width="500">

↑検索したこの漫画の最新巻を本屋で購入したら
この漫画のカードの部分をタップすると
編集ができるので巻数を変更します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554996/a5a32fbb-d791-4ea1-8b01-623b92786c4b.png"width="500">

↑新しいタイトルの漫画を購入した時は
右上のAddボタンを押して
漫画タイトルと巻数等を入力すれば
簡単にその漫画をリストに入れることができます。

## 5. 追加機能
以上の機能だけでもわたしの解決したい悩みは解決できたと思います。
これでもう間違えて同じ巻を何冊も買うことはありませんし
買うかどうかを悩むこともありません。

しかしここまで作ると考えます。
新しい巻が出ていることを本屋で知っても
すぐにその場で購入するとその後の予定に差し支えたり
荷物になることもあります。
だったら忘れずにその場で
**ネット注文できたらいいじゃん**
と思いました。
なので購入サイトのリンクをトップページに貼ることにしました。
これで面倒がなく購入をすることができます。

そしてさらに思いました。
せっかく本屋に立ち寄ったなら
**同居の家族が持っている漫画**
の最新巻が出ていないかどうかも
チェックできたらいいなと。

そこでOthersのページを作って家族が持っている漫画のリストも簡単に見ることができ
編集もできるようにしました。

## 6. まとめ
ノーコードのツールを使って初めてWebアプリを作成しました。
まずはシンプルなアプリを作りたいと思いこのようなアプリになりましたが
１からコードを書くよりもかなり楽に作ることができました。

そもそも多くのユーザーは電子書籍を購入しており
こういう悩みとは無縁だと思うので
ユーザーの獲得には不向きな開発かもしれません。

まだプロトタイプなので今回は自分専用になっていますが
どのユーザーでも自分のスタイルに編集ができるようなアプリを目指したいと思います。

最後までお読みいただきありがとうございました。
「マナビDX Quest」で得た3つの学び

## 📕 1. まずはじめに 
本記事は [マナビDX Questで得たもの Advent Calendar 2023](https://qiita.com/advent-calendar/2023/manabi-dx-quest2023) シリーズ2 16日目となります。
立ち上げてくださったhataさん(@awonohata) 、みやのさん(@kotmyn0812)、本当にありがとうございます！

今回は「マナビDX Quest」（以下マナビDXQ）での学びを以下の方向けに書きました。
（~~と言いながらほぼ自分向けかも知れない~~）
- 今年度のマナビDXQの振り返りをしたい人
- 来年度以降にマナビDXQの参加に迷っている人

-----

### 超簡単に自己紹介
改めましてこんにちは、mikan🍊と申します。
2023年4月に未経験のIT業界へ転職。元サービス業従事。
現在は見習いデータサイエンティストとして、日々勉強しています。

「マナビDXQ」には今年度初めて参加しました。

（↓↓詳細はこちらを↓↓）
X: @Mii17715036

https://twitter.com/Mii17715036


## 📕 2. 「マナビDX Quest」とは
マナビDX Questは、主に経済産業省が提供するデジタル推進人材育成プログラム。

2023年度では、
第1ターム：「DXで現場の課題を解決する」ケーススタディプログラム
第2ターム： 実際に中小企業とDXの課題解決に取り組む地域企業協働プログラム + ケーススタディプログラム

を通して、企業におけるDXを推進する変革の考え方やプロセスを学ぶことができます。

詳しくは下記の[公式HP](https://dxq.manabi-dx.ipa.go.jp/)やこの[アドヴェントカレンダー](https://qiita.com/advent-calendar/2023/manabi-dx-quest2023)にも皆さん詳細を書いてくださっているので、ご覧ください。

https://dxq.manabi-dx.ipa.go.jp/

https://qiita.com/advent-calendar/2023/manabi-dx-quest2023

## 📕 3. 想像していたより本当に良かったマナビDX Quest
すみません。こんなにすごいと思っていませんでした。

勉強するツールもあるし、1番驚いたのは参加者の方々の意識。
参加者は製造・IT・サービス・事務系など様々な経歴の方々。
（中には学生さんもいらっしゃいました！すごい！）

前向きに努力されている方が多く、こんなに皆さんのモチベーションが高いコミュニティも稀なくらい。
この環境に身を置けただけでも参加して良かったと思えました。
<br>

## 4. 📕「マナビDX Quest」を通じて得た教訓
では、本題へ。
マナビDXQを通じて得た3つの学びを振り返りの意味を込めて書き記しておきます。
（来年はこの3つはもっとできるようになりたい）

### 📘 まなび1 「アウトプットの重要性：実践で学ぶ」
アウトプットする機会は自分で作りましょう。
マナビ教材やツールからインプットできる知識は多い分、理解を深めるにはそれらを使うことが大切だと感じさせられました。

例えば、
- 他の人に学んだ内容を話してみる
- 学んだ内容をブログ記事にまとめる
- 小さなプロジェクトを始める

など学んだ理論を実践に移す機会を自分で作り出しましょう。
と言いながら、私はまだまだ不十分です。

アウトプットして、もっと理解を深めて、他の人へ知識を還元できるように努力します！


### 📘 まなび2 「コミュニケーションスキルの向上：多様性の中で学ぶ」
マナビDXQは人数が多く、様々なバックグラウンドを持つ受講者がいらっしゃいます。
その中でのコミュニケーションは、難しかった。
オンラインの環境なので尚更。

その中で学んだことは、<b>立ち回りが上手い方を観察し、良いところを盗む</b>。

言葉の選び方、話の聞き方、質問の投げ方など、
上手な方をどんどん真似して成長に繋げていきたいと思わされました。



### 📘 まなび3 「時間管理：優先順位の設定とバランスを学ぶ」
忙しい日々の中で、学習に十分な時間を確保するのはやはり難しかったです。
仕事やプライベートで忙しいと言っていたら、課題に割く時間が想像の半分ほどしか取れず。
みたいなこともありました。

でもそこをやっぱりコントロールしていかなくてはと思う今日この頃。
マナビDXQ以外も含めて、もっと以下のことを意識していこうと考えています。
- 毎日のスケジュールに学習時間を組み込む（習慣化）
- 短期的な目標を設定する（マイルストーン設定）

https://minchalle.com/blog/purpose-and-goal


プライベートと学習時間の良いバランスを見つけて、よりマナビライフを充実させたいです！🌟


##  5. 📕 終わりに
マナビDXQを通しての気づきや反省を少し書いてみました。
プログラムの参加なしでは、ここまで幅広い業種・年齢層の方とお話する機会はなかったです。改めてマナビDXQの事務局・参加者の皆さまに感謝！
学んだことを活かして、更なる成長につなげていきたいです！

もし申込に迷われている方がいらっしゃいましたら、ぜひ申し込んでみてください！

https://dxq.manabi-dx.ipa.go.jp/


そしてもし読んでくださっている心優しい方がいらっしゃいましたら、ぜひいいねボタン押していただけると嬉しいです…！
Next.jsについて調べてみた

私は新卒の駆け出しエンジニアです。7月から案件に配属されて、Reactを業務で書くようになりました。毎日勉強をしながら、Reactを楽しんでいます。

そんな中、いつもお世話になっている先輩社員から、「Reactがより使いやすくなった、Next.jsってのもあるよ」と教えてもらいました。

実際に、Reactの公式ドキュメントには
 >React でアプリ全体を構築する場合は、Next.js や Remix のようなフルスタックのフレームワークをお勧めします。
 
と紹介されていました。


そこで、今回はReactからNext.jsに移行するのがなぜおすすめなのかをReactと比較しながら、Next.jsでは何ができるようになり、優れているのかをまとめていこうと思います。


## Next.jsとReactとは
### Next.js
Next.jsはReactのフレームワークで、高性能なウェブアプリケーションを構築するための基本構造を提供しており、サーバー機能を備えているため、サーバーレスでWebページを表示することができます。


### React
ReactはWebアプリのユーザーインターフェース（UI）構築に特化したJavaScriptライブラリで、コンポネントからユーザーインターフェースを作成できます。

### Next.jsの誕生背景
モバイルデバイスの普及により、Webサイトの閲覧環境が変化したことで、Webサイトの表示速度やSEOの重要性が高まってきました。今まではクライアントサイドレンダリングで、ブラウザでHTMLを生成するため、表示速度が遅くなるデメリットがありました。そこで、サーバーサイドレンダリングはこれらの課題を解決する有効な技術として注目を集め、Next.jsが誕生しました。




### Next.jsで追加された機能
- サーバーサイドレンダリング（SSR）
- 静的サイトジェネレーション（SSG）
- 画像の最適化
- ルーティング機能　など




## CSRとは
クライアントサイドレンダリングの略です。
リクエストが来たら、レスポンスを受け取って、ブラウザ側でレンダリングを行います。

![スクリーンショット 2023-12-16 16.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616998/4ba000b2-78e0-f2c9-2e31-c10adb88b82c.png)


### CSRの特長
- 動的コンテンツに対応：ユーザーの入力に応じて、コンテンツを動的に生成できる。
- リアルタイムなユーザー体験：即座にコンテンツを更新できる。
- 初回表示は遅い：ブラウザ上でHTMLを生成するため。




## SSRとは
サーバーサイドレンダリングの略です。
リクエストが来たら、サーバー側でレンダリングを行い、レスポンスを送信します。



![スクリーンショット 2023-12-16 20.07.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616998/97556b23-6a9a-d62e-3181-40228adc5f9c.png)

### SSRの特長
- 初回表示は早い：サーバー側でHTMLを生成するため。
- 動的コンテンツに対応する：ユーザーの入力に応じて、コンテンツを動的に生成できる。
- SEO対策には不利：HTMLに必要な情報を埋め込むのが難しい。

## SSGとは
静的サイトジェネレーターの略です。
事前にHTMLを生成しておき、リクエストが来たら、レスポンスを送信します

![スクリーンショット 2023-12-16 20.06.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616998/b4c60ca1-726f-8082-96e1-b78f4da16511.png)

### SSGの特長
- 初回表示は早い：事前にHTMLを生成しておくため。
- SEO対策に有利：HTMLに必要な情報を埋め込むことができるため。
- 動的コンテンツには対応しない：ユーザーの入力に応じて、コンテンツを動的に生成できない。


### わかったこと
Next.jsはReactにはなかった機能が追加されているが、利用目的が異なっているため、使い分けられている。


Next.jsの公式ドキュメントは学びコンテンツがとても充実しているので、こちらでもっと学んでいこうと思いました。



学習を行いながら、記事を作成しました。誤った点がございましたら、指摘していただけると幸いです。
最後まで、読んでいただき、ありがとうございました。
Nginxのリバースプロキシを実装する[Docker-compose環境]

# はじめに
私がDocker composeを使ってリバースプロキシを実装するのに苦労したため、その備忘録として残します。また、実験用コンテナのため最小構成で構築されていますので、必要に応じて読み替えてください。
因みにDocker-Composeは勉強し始めて３日なので漏れがあるかも知れませんがあしからず。

## 本実装の想定図
![demo2-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535599/ec863f36-a5b7-4153-53cb-039b6a6a483b.png)

リバプロのコンテナのみ80:80でフォワーディングを行い、WEB1・WEB2に対しては直接アクセスできないように実装を行う。

## 本編
今回のフォルダ構造は以下の通りにしています

```file
.
├── docker-compose.yml
├── web1
│   ├── dockerfile
│   └── index.html
├── web2
│   ├── dockerfile
│   └── index.html
└── reverse-proxy
    ├── dockerfile.proxy
    └── nginx.conf
```

まずプロキシされる側のコンテナの設定を行います。
`index.html`は任意のコードを作成してください。

```dockerfile:dockerfile
FROM nginx:latest
```

次にプロキシコンテナの設定を行います。

```dockerfile:dockerfile.proxy
FROM nginx:latest

# nginx内のconf置き換え
COPY nginx.conf /etc/nginx/
```
また`nginx.conf`は
```conf:nginx.conf
events {
  worker_connections 1024;
}

http {
  server {
    listen 80;

    location / {
      root /usr/share/nginx/html;
    }

    location /web1/ {
      proxy_pass http://web1/;
    }

    location /web2/ {
      proxy_pass http://web2/;
    }
  }
}
```
必ずロケーション設定は`/<dir_name>/`と書くのを忘れないようにしてください。
こうしないとプロキシした際のディレクトリがズレてwebサーバ側のディレクトリ配置が複雑になります。

最後に`docker-compose`を記述します。
```dockerfile:docekr-compose.yml
version: '3'

services:
  web1:
    build: 
      context: ./web1
      dockerfile: dockerfile
    volumes:
      - ./web1:/usr/share/nginx/html

  web2:
    build: 
      context: ./web2
      dockerfile: Dockerfile
    volumes:
      - ./web2:/usr/share/nginx/html  

  reverse-proxy:
    build:
      context: ./reverse-proxy
      dockerfile: dockerfile.proxy
    ports:
      - 80:80 
```
この様に記述することでリバプロのみフォワーディングを許可しながら、他のコンテナには直接アクセスができないようになります。また、composeファイルを組むことでコンテナが同一のネットワークに入るので、内部の通信をコンテナ名で解決できるようになります。これにより`nginx.conf`がコンテナ名で指定することが可能となり、コードの複雑化を防ぐことが可能です。

以上で設定は終了しました。`docker compose up`でログも流れるので挙動の確認も可能です。

終わり
---
今回のコードは一応GitHubにて公開しています。（他のも混ざっています）
必要とあらばご使用ください。
[Docker_Container_demos](https://github.com/Watanuki0401/Docker_Container_demos)
ランダムにおすすめのおやつを教えてくれるSlackワークフロー作ってみた

## 概要
業務にずっと集中していると、「ちょっと甘いもの食べたいなあ」と思うことが多くありませんか・・？

そこで15時にSlackでおすすめのおやつを教えてくれるワークフローを作ってみました！

![スクリーンショット 2023-12-16 19.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/bcde7553-9c09-5834-6fa2-d5da96ca9846.png)

## しくみ

![スクリーンショット 2023-12-16 19.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/6cc52f6c-4e8e-f740-f093-aada82a6330b.png)

Dynamo DBに「おすすめのおやつ」をいくつか登録しておき、15時になるとLambdaがDynamo DBのレコードからランダムに値を取得し、webhookでSlackワークフローを呼び出し、「おすすめのおやつ」を投稿する仕組みとなっています！

## ワークフローのようす

![スクリーンショット 2023-12-16 20.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/d021200c-9fae-69fa-d0a9-ef44abfae94b.png)

![スクリーンショット 2023-12-16 20.09.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/15671f9f-9cd0-4ee6-6756-f91960578e00.png)

このように、毎日15時におすすめのおやつを教えてくれます！
（ハンバーグはおやつかどうか微妙ですが・・）



## Slackから「おすすめのおやつ」を追加できるようにしてみた

「皆さんがおすすめするおやつをDynamo DBに追加して、ワークフローが教えてくれるようにすれば面白いのでは？」

と思い、Slack上からDynamo DBのレコードを追加できるワークフローを追加してみました

![スクリーンショット 2023-12-16 19.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/08f50bd8-d50d-030e-ab5e-63d5cf93c680.png)


### 結果・・・

![スクリーンショット 2023-12-16 20.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/08706fb1-f7e5-feae-e5e0-f87a59be8c9d.png)

![スクリーンショット 2023-12-16 20.16.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/95507da5-01d1-ff88-c3de-ad386e846a8d.png)

**奇抜な**おやつが紹介されるようになりました・・・


## おわりに

ここまでお読みいただきありがとうございます！

Slackワークフロービルダーを使うと、業務の効率化を図る便利なワークフローだけではなく、こうしたくだらないものも作れてしまいます。

業務の息抜きに、皆さんも是非作ってみてくださいw
【UEFN】Verseでプレイヤーカウンターを利用してみる

## 背景
PVP系の島を作ろうとしたときに現在生存しているキャラクターが指定の人数になったことを起点に何かのイベントを発生させたいというときにプレイヤーカウンターについて知りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/3135c625-0266-2a6d-46f0-ae738c84a19f.png)
## やること
指定の人数になったときに何か処理を行わせることです。
### 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/lU9ecihmtWA?si=Cy5RAohqNYfOC1lR" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## 実装
### デバイス設定
プレイヤーカウンターの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/a92f81e9-4ba4-983d-d81d-ef48bad09409.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/69e85091-0e4a-10a2-bafe-b313798dcb10.png)

- 目標プレイヤー数と同値になったときにイベントを起こすように設定
- ゾーンを作成してゾーン内にいるプレイヤー数を取得するように設定

### 全体コード
```
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

sample_counter_device := class(creative_device):

    @editable
    PlayerCounter:player_counter_device=player_counter_device{}

    OnBegin<override>()<suspends>:void=
        # 指定の人数がゾーンに入ったときに発火する
        PlayerCounter.CountSucceedsEvent.Subscribe(CountSucsses)
        # ゾーンにプレイヤーが入ったときに発火する（そのプレイヤーのagentも取得できる）
        PlayerCounter.CountedEvent.Subscribe(PlayerEntered)
        # ゾーンからプレイヤーが出たときに発火する（そのプレイヤーのagentも取得できる）
        PlayerCounter.RemovedEvent.Subscribe(PlayerExited)

    CountSucsses():void=
        Print("現在ゾーンにいる人数: {PlayerCounter.GetCount()}")

    PlayerEntered(Agnet:agent):void=
        Print("プレイヤーがゾーンに入りました")

    PlayerExited(Agnet:agent):void=
        Print("プレイヤーがゾーンから出ました")
```
今回は目標数と同値になったときのイベントやゾーンに入ってカウントされたとき、ゾーンから出てカウントが外れた時のイベントをサブスクライブしてみました。

カウント時のイベントで``agent``が取得できるので何番目に入ったプレイヤーに何かをするということが簡単にできそうですね。

## まとめ
プレイヤーカウンターデバイスはPVP系で使えそうなので覚えて損は無さそうです！！

このままデバイスをVerseであつかってみるを全制覇していきたいと思います！！

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/MehcNhyxdq
EBSのサイズ拡張 Amazon Linux 2023版

🎅🦌こちらは ZYYX Advent Calendar 2023/12/25の記事です。✨🎄✨

# 概要
少し前に、Amazon Linux 2023のEBSのサイズ拡張をやったのでそれの備忘録です。
ざっくりの流れ。

- バックアップ取得（AWSコンソール画面で実施）
- EBSのサイズ拡張（AWSコンソール画面で実施）
- パーティション拡張（SSHでターミナルに入って実施）
- ファイルシステムを拡張（SSHでターミナルに入って実施）

# 手順
### バックアップ取得
面倒ですが忘れずに最初にバックアップ（スナップショット）をとっておきます。
AWSコンソールのEC2＞スナップショット画面にて、スナップショットを作成を押下し、
・リソースタイプ：ボリューム
・ボリューム ID：対象のボリュームを選択
で作成。

### EBSのサイズ拡張
AWSコンソールのEC2＞ボリューム画面にて、対象ボリュームを選択した状態で、「アクション＞ボリュームの変更」を押下します。
ボリュームの変更画面上で、増やしたいボリュームサイズに変えて「変更」を押下します。（減らすことはできません）

### パーティション拡張
ここから先は対象のEC2にSSHで入った上で作業です。
EBSのサイズを拡張しただけでは、まだファイルシステム上では拡張されていないので、パーテーションの拡張・ファイルシステムの拡張と進めていきます。

`df -hT` でファイルシステムの状態を確認します。

```text:Nitroベースの場合
$ df -hT
Filesystem      Type  Size  Used Avail Use% Mounted on
（略）
/dev/nvme0n1p1  xfs  8.0G  1.6G  6.5G  19% /
```

ここで1点補足ですが、インスタンスが XenベースかNitroベースかでデバイス・パーティションの命名が異なります。
XenベースかNitroベースかはインスタンスタイプで変わってきます。
　
Xenベース：xvda1 （t2/M4/C4など）
Nitroベース：nvme0n1p1 （t3/M5/C5など）
　
上記はNitroベースの場合になります。
Xenベースだと以下のような見え方に。

```text:Xenベースの場合
$ df -hT
Filesystem      Type  Size  Used Avail Use% Mounted on
（略）
/dev/xvda1  xfs  8.0G  1.6G  6.5G  19% /
```
　
lsblkコマンドで現在利用できるブロックデバイスを確認します。

```text:Nitroベースの場合
$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1       259:0    0  20G  0 disk
├─nvme0n1p1   259:1    0   8G  0 part /
├─nvme0n1p127 259:2    0   1M  0 part
└─nvme0n1p128 259:3    0  10M  0 part
```

```text:Xenベースの場合
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
└─xvda1 202:1    0   8G  0 part /
```
　
growpartコマンドでパーティション拡張を実施します。

```text:Nitroベースの場合
$ sudo growpart /dev/nvme0n1 1
```

```text:Xenベースの場合
$ sudo growpart /dev/xvda 1
```
　
lsblkコマンドで結果を確認すると、パーテーション容量が拡張されています。

```text:Nitroベースの場合
$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1       259:0    0  20G  0 disk
├─nvme0n1p1   259:1    0   20G  0 part /
├─nvme0n1p127 259:2    0   1M  0 part
└─nvme0n1p128 259:3    0  10M  0 part
```

```text:Xenベースの場合
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
└─xvda1 202:1    0  20G  0 part /
```

### ファイルシステム拡張
パーテーションの拡張まで終わったら、ファイルシステムの拡張を進めていきます。
Amazon Linux 2023は、XFSファイルシステムになりますので、 `xfs_growfs` コマンドを使用します。
今回のケースではないですが、EXT4ファイルシステムだと `resize2fs` コマンドを使用します。

```text:Nitroベースの場合 & Xenベースの場合
$ sudo xfs_growfs -d /
```
　
完了後、 `lsblk` `df -hT` コマンドを使用して、ファイルシステムのサイズがボリュームサイズと等しいことを確認しましょう。

# おわりに
こうやって自身のための備忘録としてQiita記事にしてるんですが、そもそもこの内容をQiitaに書いた、って事自体を忘れてしまうとどーしょーもないなー、とか思った次第…😅
前のフレームのカメラ行列を使用した残像効果

### 単純な残像効果ですが
昔から好きで多用しています。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90046/e3efc914-3711-13c5-61a1-da5ff7c32a7f.gif)


### 要するに
前のフレームのカメラ行列をシェーダに渡しているのですが、今回はGodotでの実装例を紹介します。

### まずはGDScriptで
前回のカメラ座標を格納しておきます。この処理は最後に実行するようにします。
```gdscript
	self._prev_camera_transform = main_camera.get_camera_transform()
```

前のフレームで格納しておいたこの transform を Vector4 の配列に格納します。

```gdscript
func _process(delta:float) -> void:
	var prev_matrix:Array = [ Vector4(1, 0, 0, 0), Vector4(0, 1, 0, 0), Vector4(0, 0, 1, 0), Vector4(0, 0, 0, 1), ]
	var camera_transform_inverse := self._prev_camera_transform.inverse()
	var rot = camera_transform_inverse.basis
	var origin = camera_transform_inverse.origin;
	prev_matrix[0] = Vector4(rot.x.x, rot.x.y, rot.x.z, 0.0)
	prev_matrix[1] = Vector4(rot.y.x, rot.y.y, rot.y.z, 0.0)
	prev_matrix[2] = Vector4(rot.z.x, rot.z.y, rot.z.z, 0.0)
	prev_matrix[3] = Vector4(origin.x, origin.y, origin.z, 1.0)
	_material.set_shader_parameter("prev_matrix", prev_matrix)
```

### 次にシェーダ

```glsl
shader_type spatial;
render_mode cull_disabled, blend_add, depth_draw_never, unshaded, specular_disabled, shadows_disabled, ambient_light_disabled, skip_vertex_transform;
uniform vec4 prev_matrix[4];

void vertex()
{
	mat4 prev_view;
	prev_view[0] = prev_matrix[0];
	prev_view[1] = prev_matrix[1];
	prev_view[2] = prev_matrix[2];
	prev_view[3] = prev_matrix[3];
	float elapsed_time = COLOR.a;
	float velocity = 8.0;
	vec4 p = MODEL_MATRIX * vec4(VERTEX + NORMAL*elapsed_time*velocity, 1);
    VERTEX = VERTEX_ID%2 != 0 ? (VIEW_MATRIX * p).xyz : (prev_view * p).xyz;
	COLOR.a = VERTEX_ID%2 != 0 ? 1.0 : 0.0;
}

void fragment()
{
	ALBEDO = COLOR.rgb;
	ALPHA = COLOR.a;
}

```

VERTEX =
の行で、VERTEX_ID がどちらかで通常の行列か、ひとつ前の行列かを切り替えます。 mesh topology を line に設定したモデルを渡しているので、扱う頂点は２つだけなので。

### そんな小ネタでした
Advent Calendar がちょっと「弾幕薄いぞ」のように見えたので、援護射撃をば。
macからanacondaを消す方法

# はじめに
この記事ではanacondaをmacから完全に削除する方法を備忘録を兼ねて紹介します。

# 実装

## anaconda-cleanをインストールする
まずはライブラリ等をインストールするのと同じ手順でanaconda-creanをインストールしましょう。

```
conda install anaconda-clean
```

## anaconda-creanで削除を実行する
```
anaconda-clean
```
この後いくつか以下のような確認事項が出てくるので回答しましょう.
```
Delete .conda? (y/n): y
Backup directory: /Users/yukifujita/.anaconda_backup/2023-12-16T170254
Delete .ipython? (y/n): y
Delete .jupyter? (y/n): y
Delete .matplotlib? (y/n): y
```


## .anaconda_backupを削除する

anaconda-cleanを実行するとrootに.anaconda_backupというファイルが作成されます。これも削除しましょう.
```
cd
ls -a | grep .anaconda_backup
rm -r ~/.anaconda_backup
```

## anaconda3のフォルダの削除
`~/opt`のanaconda3というフォルダを削除します。

```
sudo rm -r ~/opt/anaconda3
```
sudoで実行しないと自分は権限的に消せませんでした。

## .zshrcまたは.bashrcの編集
自分のシェルを確認する.
```
echo $SHELL
```
- zshの人は.zshrc
- bashの人は.bashrc
からanaconda関連の記述を削除します。
[Godot 4.2] デバッグ用、デモ版などに切り替えてビルドする

:::note info
フィーチャータグを使います。
:::
参考文献: [フィーチャータグ — Godot Engine (4.x)の日本語のドキュメント](https://docs.godotengine.org/ja/4.x/tutorials/export/feature_tags.html)

## フィーチャータグの作り方
フィーチャータグはデフォルトで用意されているほか、自分で定義することもできます。

デフォルトのフィーチャータグには、 `android` `windows` のような実行環境に関するものと、 `debug` `release` のようなビルドモードに関するものとが存在します。

自作するには、エクスポートメニューからタグを追加したいプリセットを選び、 `機能` (Godot Engine 4.2 日本語版の場合)からタグを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699119/5f2a1708-5f4d-5721-8256-126dc5a12809.png)

エクスポートメニューについて: [プロジェクトのエクスポート — Godot Engine (4.x)の日本語のドキュメント](https://docs.godotengine.org/ja/4.x/tutorials/export/exporting_projects.html)

## フィーチャータグの使い方(参照する)
フィーチャータグに応じてプロジェクト設定を上書きしたり、スクリプト内でフィーチャータグの存在確認ができたりします。

プロジェクト設定についてはドキュメントを見たほうが早いです: [フィーチャータグ — Godot Engine (4.x)の日本語のドキュメント](https://docs.godotengine.org/ja/4.x/tutorials/export/feature_tags.html#overriding-project-settings)

スクリプト内では [`OS.has_feature(name)`](https://docs.godotengine.org/ja/4.x/classes/class_os.html#class-os-method-has-feature) を呼ぶことで確認できます。
`name` に渡した文字列と同じ名前を持つフィーチャータグがあれば `true` が返ってきます。

また、 `OS.has_feature("debug")` と [`OS.is_debug_build()`](https://docs.godotengine.org/ja/4.x/classes/class_os.html#class-os-method-is-debug-build) は等価であり、どちらを使ってもデバッグビルドまたはエディター上での実行であることが確認できます。
MCP9701温度センサーで遊ぶ(マクロ化)(STM32G031)


x MCP9701-E/TO 販売コード 103199

MCP9701温度センサーで遊ぶ(マクロ化)



x 過去ログを見よ


目的
マクロ化
小数点2桁までは、だいたい、正しい
3.3v 4096count


![o_cop856.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e81ada77-6095-0e7f-b4a5-d0e88bc8627b.jpeg)



プログラム



```c++


//S_SER_9701_O7_031_1

//インクルド
#include <Arduino.h>
#include <HardwareSerial.h>


//定義
//10の割り算 0から9999までは、正しい。
#define DIV10(n) (((n*409)+((n*154)>>8))>>12)
//MCP9701の温度を求める x100
#define TMP(so) ((((so)*270769)-134432821)>>16)

//初期化
void setup()
{

  delay(3000); //not delete

  //シリアルの初期化
  Serial.setTx(PA2_ALT1);
  Serial.setHalfDuplex();
  Serial.begin(9600);

} //setup


//メインループ
void loop()
{

  //アナログ値の読み込み
  analogReadResolution(12); //adc 12bit mode
  int s = analogRead(PB7);   // PIN1

  //s=245*4; //19.9

  //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
  s = DIV10(TMP(s));

  //温度の表示
  Serial.print( DIV10(s) );            // 小数点以上
  Serial.print(".");
  Serial.print( s - (DIV10(s) * 10) ); // 小数点以下
  Serial.println();

  //1秒の待ち
  delay(1000);

} //loop



```
cybozu共通管理者以外がグループメンバーの更新をする方法【グループメンバー更新プラグイン】

cybozu共通管理者以外のユーザーはグループメンバーを更新することができません。
今回はグループメンバーをkintone上で更新できるようにプラグインを開発しましたので紹介いたします。

紹介するプラグインは下記となります。
[グループメンバー更新プラグイン](https://idepenshop.stores.jp/items/657d4cc7fe92602793de661e)。

# 課題
kintoneの権限管理などでcybozu共通管理画面で作成できるグループを使って設定する場面は多いかと思います。
ただ、そのグループのメンバーはcybozu共通管理者でしか変更ができません。
cybozu共通管理者はフルコントロール権限であるため、メンバー更新をするだけのユーザーに渡してしまうのはセキュリティ的にNGです。
かと言って、人事異動やチーム内の情勢によって都度cybozu共通管理者に変更してもらうのも運用としてイケてないです。
そんな課題を解決するために特定のグループのメンバーを更新するプラグインを作成いたしました。

# 要件
作成したプラグインは以下要件を満たすことを目的としています。
+ kintone画面からグループメンバーを更新できること。
+ cybozu共通管理者権限の無いユーザーに指定したグループのメンバーだけが変更できること。
+ 指定していないグループのメンバーは変更できないこと。
+ cybozu共通管理者権限の無いユーザーにcybozu共通管理者の認証キーが漏れないこと。

# 全体像
次のようなケースを考えた時の全体像は以下となります。

**ケース：**
+ 九州支店長に「九州支店-開発チームA」と「九州支店-開発チームB」のグループメンバーの管理権限を与える。
+ 東北支店長に「東北支店-法人営業」と「東北支店-公共営業」のグループメンバーの管理権限を与える。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/b38ccf17-4d15-e2dc-67d4-0bdeb29f15e7.png)

# 導入手順
:::note warn
cybozu共通管理者によって作業をお願いいたします。
:::
1. kintoneへプラグインを導入してください。
2. アプリテンプレートからグループのメンバーを更新する用のアプリを作成してください。
3. アプリアクセス権にて、以下のように設定してください。
![アプリアクセス権.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/946f8eed-e067-6efa-f946-37461a413ace.png)
4. レコードアクセス権にて、以下のように設定してください。
![レコードアクセス権.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/1f113b44-f862-fc49-42c7-92043cb5fd22.png)
5. フィールドアクセス権にて、以下のように設定してください。
![フィールドアクセス権.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/fefad1bc-96bf-3ce2-fad0-1bf83e20c669.png)
6. プラグインをアプリへ導入してください。
7. プラグイン設定画面からkintoneでのメンバー更新を許可するグループを追加してください。
![プラグイン画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/2777c112-ca3d-8773-562a-5771d3865ef7.png)
8. レコード追加からメンバー更新用の画面を作成してください。
![レコード編集.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/7ef26029-8057-4cb8-3ec1-7b45b20a2ef5.png)

:::note info
本設定によりレコードの「グループ管理者」にのみグループメンバーの更新をすることができます。
※アクセス権はお好みで調整してください。
:::
:::note warn
更新キーはそのグループのメンバーを更新する権限があります。関係者以外に漏れないようにしてください。
:::

# メンバー連携
詳細画面の「グループメンバーを連携する」を押下することでcybozu共通管理のグループへメンバーが連携されます。
![グループメンバー連携.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/682901b9-069a-346f-ef2d-1a45c23dfa64.png)

# 最後に
kintoneを使えば使うほど、大人数になればなるほど、グループを作成して権限管理をするかと思います！
その時には[グループメンバー更新プラグイン](https://idepenshop.stores.jp/items/657d4cc7fe92602793de661e)が重宝するかと思いますので、是非導入検討してみてください。

他にもプラグイン公開していますので、興味があれば覗いてみてください。
[イデペンショップ](https://idepenshop.stores.jp/)
感情分析って簡単すぎんか・・・

生成AIのプロジェクトに関わるにあたって、LLMの概要くらいは知っておこうと勉強を始めました。

下の3行で文の感情分析ができるってどういうことよ・・・

```python
from transformers import pipeline

text_classification_pipeline = pipeline(model="llm-book/bert-base-japanese-v3-marc_ja")
print(text_classification_pipeline("世界には言葉がわからなくても感動する音楽がある。")[0])
# {'label': 'positive', 'score': 0.9993619322776794}
```

これで、その人のチャットとかを解析して、その人がポジティブな人なのかネガティブな人なのか解析とかできそう。


## 対象
https://huggingface.co/llm-book/bert-base-japanese-v3-marc_ja
【Go言語】Goらしい命名規則

## Goらしい命名とは
公式見解によると、基本的に[**Effective Go**](https://go.dev/doc/effective_go)に基づいて命名すること

### 変数名の命名

* `_`（アンダースコア）を使用せず、**MixedCaps**とする。例えば、`max_length`ではなく`maxLength`
* 他パッケージから参照できる変数は最初の文字を**大文字**（MaxLength）、参照できない変数は**小文字から**始める（maxLength）。
* 頭字語は大文字または小文字を統一。例: `URL`か`url`など。
* エラー型の変数名にはErrorを接尾語として付ける。例: `MarshalerError`。
* ローカル変数はスコープが限定されているため、短い名前が好まれる。例: `req`、`i`。

### パッケージの命名

* パッケージ名は簡潔で内容を想像しやすい名前が適切。例: `bytes`、`http`。
* 一般的な名前（`util`、`common`）は避け、内容を明確に示す名前にする。
* パッケージ名は**小文字の1単語**が慣習。スネークケースやキャメルケースは使用しない。
* `internal`パッケージはモジュール外からアクセスできない特別な名前。

### インタフェースの命名

* 1つのメソッドのみを持つインタフェースには、`-er`接尾語を付けることがある。例: `Reader`、`Stringer`。
* 複数のメソッドを持つインタフェースはその目的を反映した名前を選ぶ。例: `net.Conn`。

### レシーバーの命名
* レシーバー名は型を反映した短い名前を使用する。例: `r`（`Request`の場合）、`re`（`Regexp`の場合）。
* 一貫性を持たせるために、同一型に対して同じレシーバー名を用いる。

## 参考
https://www.oreilly.co.jp/books/9784873119694/