OmniAICreator/Qiita-1.07M huggingface dataset:
Aurora MySQLでGRANTできない

# 何が起きたか
弊社で秘伝のたれのように使っていた新人向け設定の内、DBアカウントを作る以下の手順が失敗した。

## 手順
```sql
CREATE USER 'name.name'@'%' IDENTIFIED BY '********************';
GRANT SELECT,SHOW DATABASES, PROCESS, RELOAD, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'name.name'@'%';
```

## 失敗しました
RDSのマスターユーザで作業しましたがこのエラーが出ました。
```
SQLエラー[1410][42000]: You are not allowed to create a user with GRANT
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192137/dfe127fb-fa4a-e906-8eb6-7394413f5928.png)



# 解決策
最近はロールを使った権限付与に変わったそうです。ロールをGRANTすることで同様の作業ができました。
ちなみに、ちゃんとロールは独自で作ったほうがいいと思います。

```sql
-- ユーザ作成。パスワードは適当な文字列を設定する
CREATE USER 'name.name'@'%' IDENTIFIED BY '*********************';

-- 権限割り当て
GRANT 'rds_superuser_role'@`%` TO `name.name`@`%`;

-- 反映
SET DEFAULT ROLE 'rds_superuser_role' TO 'name.name'@'%';

-- 確認
show grants for `name.name`@`%` using 'rds_superuser_role';
```

## 参考
https://dev.classmethod.jp/articles/mysql-rds-superuser-role

https://qiita.com/itsuki3/items/e650806152956a371fdb
[BigQuery API(V2)] JavaでBigQueryのジョブの実行をキャンセルする

BigQuery API V2(Java)を使用して、
BigQueryのジョブの実行をキャンセルする方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[BigQuery API(V2)] JavaでBigQueryを使う](https://qiita.com/doran/items/8b7ba29672527426e88d)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[ジョブの実行をキャンセル](#1-ジョブの実行をキャンセル)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. ジョブの実行をキャンセル
ジョブの実行をキャンセルします。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
```
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)](https://qiita.com/doran/items/8b7ba29672527426e88d#32-bigqueryインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Jobs jobs = bigquery.jobs();
    
    Bigquery.Jobs.Cancel cancel = jobs.cancel("プロジェクトID","ジョブID");
    cancel.setLocation("ロケーションID");
    
    JobCancelResponse res = cancel.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/jobs/{ジョブID}/cance
が実行されます。

#### 1.2.2. クエリパラメータ
Bigquery.Jobs.Cancelのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setLocation|String|【必須(US、EUマルチリージョンの場合は不要】<br>ロケーションID|

### 1.3. レスポンスの内容
#### JobCancelResponse
|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："bigquery#jobCancelResponse"|
|getJob|[⧉ Job](https://qiita.com/doran/items/d0e8c55bad94e643adf1#job)|ジョブの最終状態|

<br>
<br>
おしまい。。
【SwiftUI】iOS ↔ macOS 互換の記述

なるほど、こうするといいのか。

```swift
public extension Color {
#if os(macOS)
  static let background = Color(NSColor.windowBackgroundColor)
  static let secondaryBackground = Color(NSColor.underPageBackgroundColor)
  static let tertiaryBackground = Color(NSColor.controlBackgroundColor)
#else
  static let background = Color(UIColor.systemBackground)
  static let secondaryBackground = Color(UIColor.secondarySystemBackground)
  static let tertiaryBackground = Color(UIColor.tertiarySystemBackground)
#endif
}
```

![sc 2024-05-23 at 13.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/9d9dfc05-56e9-68f2-24f8-1bde8a63203f.png)

![sc 2024-05-23 at 13.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/a67216b6-4289-f42e-83f0-496d5121a006.png)

基本的ですが、いろいろ使えそうです。

# 🙆🏻‍♂️ 参考
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【SwiftUI】iOS と macOS で互換したいコードの一つの解法<br>👉 <a href="https://t.co/gUgv9B40x7">https://t.co/gUgv9B40x7</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a> <a href="https://twitter.com/hashtag/SwiftUI?src=hash&amp;ref_src=twsrc%5Etfw">#SwiftUI</a></p>&mdash; chanzmao (@maochanz) <a href="https://twitter.com/maochanz/status/1793505147261472932?ref_src=twsrc%5Etfw">May 23, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Go 基礎

# はじめに
初めまして！WebエンジニアになりたいK.Yです！
今回は、まだ基礎を勉強中であるGoについて書きたいと思います！
※認識間違ってたら、コメントしてくれると有り難いです:bow_tone1:

# Goのプログラムの構成
Goは、変数や関数の全てのプログラムの要素は何らかのパッケージに属しています！
その為、プログラムはパッケージの宣言から始まります。

以下のようにpackage mainと記述することで、そのファイルはメインパッケージに
関するプログラムであることを宣言しているということです。
``` 
package main
```




続いては、main関数です。
こちらはエントリーポイントと呼ばれていて、プログラムの本体となります。
何かを出力したい時は、このmain関数の中に記述します。

```
func main() {
	
}
```

# GoでHello Worldと出力してみた！
Goでは出力用の関数を纏めたパッケージが装備されているので、そのパッケージを
インポートする必要があります！

まずはパッケージのインポートをしていきます。
fmtについてなんですが、こちらはフォーマットパッケージと呼ばれるもので
PrintやPrintlnの出力用関数がフォーマットパッケージの中で使えるようになっています。

```
package main

import "fmt"

func main() {
	
}
```

次は、main関数の中にfmtを呼び出します。
Hello Worldを出力するためにPrinln関数と付け加えます。
文字列を出力するのでダブルクォーテーションで囲んでHello Worldと記述します。

Prinlnは渡したデータを改行付きで出力を行う関数です。
他にも基本形のPrintなどあります。
```
package main

import "fmt"

func main() {
	fmt.Println("Hello World");
}
```

最後に実行していきます！
まず、作成したファイルがあるディレクトリーまで移動します。

```
(base) ➜  test pwd
/Users/Administrator/go/src/test
(base) ➜  test ls
main.go
(base) ➜  test 
```

移動できたら、go run　"実行するファイル名"で実行します。

```
(base) ➜  test go run main.go 
Hello World
(base) ➜  test 
```
Hello Worldと出ましたね:sunglasses:

# さいご
今回は、GoでHello Worldと出力してみました！
内容は基礎になりますが、これからコツコツとGoを学んでフロントと合わせた
アプリ開発作ることを目標に頑張っていきます:grin:
2年以上使っている OpenShift クラスタで必須な証明書の更新作業

## TL;DR
- OpenShift インストール時に、内部の ingress にセットされるデフォルトの証明書 (cert) は有効期限2年が設定されており、2年を超えてそのまま使い続けるとクラスタが徐々に崩壊してくる
- cert を再作成することで大部分の問題は解決する: [How to redeploy/renew an expired default ingress certificate in RHOCP4 - Red Hat Customer Portal](https://access.redhat.com/solutions/6458661)
- OLM 周りに問題が残ることがあるので、その場合は packageserver の cert も再作成する: [How to renew/rotate the certificate for cluster operator operator-lifecycle-manager-packageserver in RHOCP4 - Red Hat Customer Portal](https://access.redhat.com/solutions/6999798)

（以下のコマンドラインは再現のため再構築したものなので、一部実際とは異なる点があるかもしれません）

## 問題発生

それは、削除できない名前空間から始まった。

```
$ oc delete ns mynamespace
namespace "mynamespace" deleted
$ oc get ns | grep mynamespace
mynamespace        Terminating   27d
```

こうなった場合に一番あり得るのが、「finalizer で登録された Pod が先にいなくなってしまったため、後処理する人がいなくて削除が止まる」という理由。多くのページでは（例えば [こちら](https://www.ibm.com/docs/ja/cloud-private/3.2.x?topic=console-namespace-is-stuck-in-terminating-state)）、原因となっているリソースを復旧させるか、それでも無理なら `.spec.finalizers` を削除すればよい、と書いてある。

ところが私の場合、`oc edit` で `.spec.finalizers` を削除しても、再度 `oc get ns` で確認すると `.spec.finalizers` が勝手に復活してしまい、いつまで経っても削除できなかった。

そのメッセージを見てみると、どうやら packageserver という Operator が提供する apiservice の不具合らしい。`PackageManifest` カスタムリソースが見つからないようだ。`PackageManifest` は、Operator Lifecycle Manager (OLM) の `CatalogSource` で追加された Operator ひとつにつきひとつ用意される、いわば OLM でインストール可能な Operator を表現するためのカスタムリソースで、その定義がない、というのは明らかにおかしい。

```
$ oc -n openshift-operator-lifecycle-manager get csv packageserver
NAME            DISPLAY          VERSION   REPLACES   PHASE
packageserver   Package Server   0.19.0               Installing
```

ステータスが `Installing` になっていて、どうやら packageserver のインストールが途中で止まっているようだ。

仕方ないので OpenShift web console から入ってみようとて、新規ユーザを作成して web console にログインを試みるもログインできない。おかしいなと思って CLI でログインしようとすると…

```
$ oc login https://api.example.com/ -u myuser -p mypasswd
error: x509: certificate has expired or is not yet valid: ...
```

あ、これは証明書の問題だ、と気付いた。


## ingress-controller の cert 更新

エラーメッセージで検索を書けると、原因と対策はすぐに見つかった。

[How to redeploy/renew an expired default ingress certificate in RHOCP4 - Red Hat Customer Portal](https://access.redhat.com/solutions/6458661)

OpenShift はインストール後2年でデフォルト証明書の有効期限が切れてしまい、不具合が発生し始めることが記述されている。そこで、ここに書いてあることを丁寧に読んで、"Workaround for the default ingress certificate" に記述されている手順を踏んだ。手順実施直後は `oc login` できなかった (oauth サーバが応答してくれない）が、しばらく（数分）時間が経つと `oc login` できるようになり、web console にも入れるようになった。どうやら更新した証明書は徐々に内部サービスに浸透していくらしい。そうかそうか、待てばいいのか。

しかし、待てど暮らせど `packageserver` は `Installing` のまま。正直途方に暮れた。

## packageserver の cert 更新

ここで「もしや」と思って、"operator package server certificate renew" で検索してみた。

[How to renew/rotate the certificate for cluster operator operator-lifecycle-manager-packageserver in RHOCP4 - Red Hat Customer Portal](https://access.redhat.com/solutions/6999798)

全ての Operator に浸透するわけじゃないのか…とここで気付いた。このドキュメントも上記の ingress-controller のものと同じく丁寧に記述されているので、きちんと手順を踏めば証明書は更新される。

## そして…


```
$ oc -n openshift-operator-lifecycle-manager get csv packageserver
NAME            DISPLAY          VERSION   REPLACES   PHASE
packageserver   Package Server   0.19.0               Succeeded
$ oc get ns | grep mynamespace
$
```

消えた。
TexLiveのインストールが上手くいかない時の解決策(Windows)

# TexLiveが上手くインストールできない時
## GUIなしのターミナルで実行する

何度も普通にGUIの画面にてインストールを押して、インストールしようとしても最終的に3~4時間後にGUIがエラーを出して上手くいきませんでしたなどとなり上手くインストールできませんでした。



このような時は、以下の手順でGUIなしで実行してみてください。
 install-tl.zipを[ここ](https://www.tug.org/texlive/acquire-netinstall.html)からダウンロードして、展開する
install-tl-windows.batが存在しているフォルダをターミナルで開く
そして以下のコマンドを実行する

    .\install-tl-windows.bat -no-gui

## 参考記事

https://texwiki.texjp.org/?TeX%20Live%2FWindows#s0045851

https://qiita.com/passive-radio/items/623c9a35e86b6666b89e
github actionsからvariablesの値を変更する

# github actionsから参照できる変数
[Githubの変数](https://docs.github.com/ja/actions/learn-github-actions/variables)はgithub actionsの中から参照できる環境変数のようなもので、事前に設定した値を取得したり、変数の値を変更したりできます。変数はリポジトリに紐づいており、workflowが終わった後も残ります。

変数はGUIからの操作、APIを通じたCUIでの操作両方に対応しています。GUIからの設定方法は[公式のドキュメント](https://docs.github.com/ja/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository)が画像キャプチャ付きでわかりやすいです。

# github actionsの中から変数の値を変更する
github actionsの中で変数の値を変更する際には以下のリポジトリが利用できます。

https://github.com/mmoyaferrer/set-github-variable

以下のように使用します。
```workflow.yaml
- uses: mmoyaferrer/set-github-variable@v1.0.0
  with:
      name: '変更したい変数名'
      value: '変更後の変数の値'
      repository: ${{ github.repository }}
      token: ${{ secrets.REPO_ACCESS_TOKEN }}
```

ここで `secrets.REPO_ACCESS_TOKEN` はpersonal access token（PAT）で、variablesに対してread/write権限を持っている必要があります。PATを作成したらsecretsにトークンを登録します。この時の名前はなんでもOKです。

## PATの作り方
PATを組織で利用する場合は組織の方で事前に設定が必要です。組織の設定が不要な場合はこの段落を飛ばしてください。組織の設定は[公式のドキュメント](https://docs.github.com/ja/organizations/managing-programmatic-access-to-your-organization/setting-a-personal-access-token-policy-for-your-organization)のガイダンスに従い、「fine-grained personal access token を介したアクセスを許可する」を選択します。他の設定項目はどっちであっても上記のリポジトリは利用できます。

PATの発行方法も[公式のドキュメント](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#fine-grained-personal-access-token-%E3%81%AE%E4%BD%9C%E6%88%90)がキャプチャ付きでわかりやすいです。PATのトークンは作成時にしか見えないため、画面を閉じてしまった場合は再発行が必要なことに注意してください。
GoogleCloud ComputeEngineのVMインスタンス上にAirbyteをデプロイする方法

## **はじめに**

今回は、GoogleCloud ComputeEngineのVMインスタンスにAirbyteオープンソースをデプロイするための詳細な手順を紹介します。Airbyteはデータの統合とパイプラインの設定を容易にする強力なツールです。このガイドでは、公式の手順に従い、リモート環境でのセットアップからデプロイまでを説明します。

## **前提条件**

- Google Cloud Platformアカウント
- Google Cloud SDKがインストールされているローカルマシン➡️[Google Cloud SDKのインストール](https://qiita.com/RyutoYoda/items/a9a7e5323dcd55036cb1)
- GCPプロジェクトが作成されている
- VMインスタンスにリモートssh接続されていること➡️[TerrafromでVMインスタンスを作成起動する方法](https://qiita.com/RyutoYoda/items/3948357eb4c063294830) / [VMインスタンスへの接続方法](https://qiita.com/RyutoYoda/items/e046cf7f9a08605a99f5)

## **ステップ 1: DockerとDocker Composeのインストール**

SSH接続しているVMターミナルで以下のコマンドを実行します。

### **1.1 Dockerのインストール**

```bash
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add --
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo usermod -a -G docker $USE
```

### **1.2 Docker Composeのインストール**

```bash
sudo apt-get -y install docker-compose-plugin
docker compose version
```

### **1.3 SSH接続の再起動**

Dockerグループの変更を反映させるため、現在のSSHセッションを閉じて再接続します。

```bash
exit
```

再度SSH接続を行います。

![スクリーンショット 2024-05-23 11.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/9c13b104-dbc0-1f43-a091-4b1a5761e332.png)


## **ステップ 2: Airbyteのインストールと起動**

### **Airbyteディレクトリの作成と起動**

SSH接続しているVMターミナルで以下のコマンドを実行します。

```bash
mkdir airbyte && cd airbyte
wget https://raw.githubusercontent.com/airbytehq/airbyte/master/run-ab-platform.sh
chmod +x [run-ab-platform.sh](http://run-ab-platform.sh/)
./run-ab-platform.sh -bmkdir airbyte && cd airbyte
wget https://raw.githubusercontent.com/airbytehq/airbyte/master/run-ab-platform.sh
chmod +x run-ab-platform.sh
```
![スクリーンショット 2024-05-15 16.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/f694d5b4-61ee-0f2c-46f0-a63c1f6884bd.png)

## **ステップ 3: Airbyteに接続するためのSSHトンネルの作成**

ローカルターミナルで以下のコマンドを実行してSSHトンネルを作成し、ローカルマシンからAirbyteに接続します。

```bash
gcloud --project=$PROJECT_ID beta compute ssh $INSTANCE_NAME -- -L 8000:localhost:8000 -N -f
```

これで、ローカルのブラウザで **`http://localhost:8000`** にアクセスして、Airbyteのウェブインターフェースに接続できるようになります。
![スクリーンショット 2024-05-23 11.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/6492f35f-acfa-19fd-1986-13ad7d546e50.png)
初期登録後、接続画面に入ることができます。
![スクリーンショット 2024-05-23 11.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/a6c82aeb-fcac-7460-57fc-96931b95a2b1.png)

## **終わりに**

以上で、Google Cloud VMインスタンス上でAirbyteをデプロイし、起動する手順が完了です。Airbyteは強力なデータ統合ツールであり、これを活用することで効率的にデータパイプラインを構築できます。必要に応じて、Airbyteの設定を行い、データの統合を進めてください。
複数のブランチ運用の PR で Conflict したときは GitHub web editor に注意

# はじめに
これは私が `main / develop / feature` という 3 つ以上のブランチを使い開発していた時、
GitHub の Pull Request (以下 PR) で merge しようとしたところ conflict してしまい、GitHub の Web Editor で Conflict 解消をしてしまったが故の失敗を記す。

--
GitHub は非常に便利で conflict した PR の場合、Resolve Conflict ボタンが出現し、Web Editor を使用して解決することができ、実際私はこれを使って解決し、merge "してしまった"。

そう、この Web Editor を正しく理解せず使ってしまい、`merge commit` をしてしまったのである。


# どんなブランチ運用？
## ブランチの意味
- `main`: 本番環境
- `develop`: 検証環境
- `feature`: 機能追加など細かい作業用

## ブランチの切り方
機能を作るためにブランチを切る: `main -> feature`
検証環境に merge する: `develop <- feature`
本番環境に merge する: `main <- feature`


# 何がいけなかった？
`develop <- feature` で PR を作成して Web Editor で conflict を解消すると、`feature` に `develop` の変更点が全て入ってきてしまうところが大分問題だった。(`feature <- develop` を挟むことで conflict を解消するため)

これが起こると、`develop` の内容がすべて `feature` に入ってしまうので、`main` に `merge` しようとすると、`develop` の内容がそのまままるっと入ってしまうのである。

これは大層な問題である。なぜなら開発中のデータなどが本番環境に入ることを意味しているからだ。(まぁ他にも問題あったりするけど一番はこれかと)


# どうしたらいいんだ！
解決策は至って簡単。ローカル環境で `merge` して `push` してしまえばいいのである。
コマンドでもできると思うが今回は GitHub Desktop でのやり方を説明する。

以下ローカル環境での作業
`develop <- feature` で conflict してしまった場合、
1. `develop` ブランチに切り替える
1. `Branch タブ > Merge into current branch... (Ctrl+Shift+M)`
1. ブランチ一覧が表示されるので `merge` したいブランチを選択し `Create a merge commit`
1. conflict があれば任意のエディタを使用し conflict を解消する
1. 解消されると `Continue merge` が押せるので押す
1. `Push` すれば `merge` 完了

とまぁこんな感じである。

:::note warn
※ 注意点として、`merge` したものを `push` すると、作成した PR が `Merged` ステータスになり自動的に `close` されるので、レビューをしなければならないなどがあれば、先にしてもらいましょう。
:::


# おわり
いろいろな運用方法があって、いろいろな解決方法とかがあると思うけど、
きちんと理解した上でその機能を使う、ちょっとでも疑問に思ったら納得いくまで聞く/調べる、が大事。特に本番環境とかあってミスれないとき！(当たり前)
fpokcet（タンパク質結合部位抽出）　メモ

https://github.com/Discngine/fpocket
~~~
conda config --add channels conda-forge
conda install fpocket
~~~
任意のPDBファイル
~~~
fpocket -f xxxxx.pdb
~~~
出力されるxxxxx.pmlをpymolにDDすれば
![Screenshot from 2024-05-16 22-55-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723193/cb1497d1-395d-bd6b-3293-15282c4f7fda.png)
こんな感じに予想ポケット部位を出力する

Fpocket のスコア _info.txtの一番上のものが必ずしも実際のタンパク質ポケットではないことに注意。

ぶっちゃけautodockの全範囲シミュレートのほうが正確なポケット位置は分かると思う。
学習アプリQuizletを活用して、プログラミング言語の文法を覚える

# はじめに

私自身、文法は検索すれば良いから過度に覚える必要はないと考えていました。

ただ、最近あることがきっかけで文法を覚えようと意気込み、Qiitaの記事や公式ドキュメントと睨めっこしていましたが、なかなか疲れるし覚えるのが難しいと感じていたところ、

***Quizlet***の存在を知って、これは便利だ。と感じたので紹介する記事を書くことにします。

# 文法を覚え始めたきっかけ

きっかけは、以下の本を読んだことです。
***[プログラマー脳 ～優れたプログラマーになるための認知科学に基づくアプローチ(amazon)](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E8%84%B3-%EF%BD%9E%E5%84%AA%E3%82%8C%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E8%AA%8D%E7%9F%A5%E7%A7%91%E5%AD%A6%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8F%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81-Felienne-Hermans/dp/4798068535)***


この本は全体を通して、プログラミングの際のさまざまな作業や技術の取得を効率的に行うための方法を紹介しているのですが、その中に***長期記憶***と***短期記憶***に関しての解説がされているチャプターがあります。

そこでは、かなり噛み砕くと以下のようなことが書かれてありました。


>・コードを読む時には、長期記憶・短期記憶・ワーキングメモリが互いに補完し合っている
>
>・短期記憶は記憶時間と容量が限られている
>
>・長期記憶に情報があることで、コードの記憶や理解が捗る

詳しい内容は実際に読んで欲しいのですが、***基本文法を長期記憶に持つ***ことがプログラミングを上達する1つの方法だと理解しました。

そこで、文法を覚える良い方法はないかなー、と考えた時に知ったのがQuizletです。

# Quizletとは

以下は[Quizlet](https://quizlet.com/)の公式から引用した紹介文です。
>Quizlet【クイズレット】のデジタル フラッシュカードで何でも簡単に暗記
Quizletは何でも簡単に暗記できる学習ツールです。Quizlet のデジタル フラッシュカード、模擬テスト、ゲーム、とAI ツールを使えば、どんな試験でも一発合格！

私自身、まだ使いこなせてる訳ではありませんが、既に感じた***おすすめポイント***を２点紹介します。

### 1.スマホアプリとWebアプリが存在する

プログラミングの文法を覚えることが目的の場合、英単語などに比べて文字の入力が複雑になりがちです。
ですので、普段の暗記に使う場合はスマホで、入力はパソコンで行いたくなります。

Quizletはデータもしっかりと同期されていますし、この使い分けが可能で便利に感じました。

![スクリーンショット 2024-05-23 13.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/8a0d335f-f7ed-5230-3eb1-8391607ec6d1.png)

私の場合は上の画像のように、左にQuizlet、右に公式ドキュメントや記事などで気になった部分を置いて、それをコピペしてフラッシュカードに追加していってます。


### 2.他人が作ったデータでも勉強できる

データを追加するの面倒だなーって思ったりしましたが、プログラミング言語で検索してみると、かなりの数のデータセットが存在しました。

![スクリーンショット 2024-05-23 13.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708101/cca56070-515d-0276-9924-0beb5c9a4d25.png)

実際にJavascriptで検索してみると、上の画像のように625ページ分のデータセットが存在するようです。
ただ英語で作成されたものが多いようなので、そこは少し不便かもしれませんが、英語とプログラミングの２つを同時に学習できると前向きに考えます。

<br>

他にもクイズ形式で覚えられたり、テストのような機能もあったりしますが、長くなるので紹介はやめておきます。
気になった方はぜひ使ってみてください。

# おわりに
長期記憶を活用することが、プログラミング上達の1つの道だと知ってから、Quizletの活用を始めましたが、なかなか便利に感じます。

CSSのFelxBoxであったり、なんかこの言語のこのメソッドの書き方覚えられないといったことは、よくあると思うので、積極的に活用したいと考えるようになりました。

参考になった方がいれば光栄です！
flutter_webviewを使用してAndroidでWebviewを使用した場合に、他のアプリに遷移後戻ってくるとWebviewがフリーズする

# 解決方法

- flutterのversionを上げる
    - 3.19.3 → 3.22.1
- 各種ライブラリのversionを上げる
    - webview_flutter_android
        - 3.16.0 → 3.16.1以上
【JQuery UI】jsファイル側にメッセージを記載してダイアログ表示する方法

jsファイル側にメッセージを記載してダイアログ表示する方法は下記のソースです。
jsファイル(dialog.js)は、HTMLファイル(SampleJDialog.html)を格納したフォルダに
jsフォルダを作成して格納します。

```ruby:dialog.js
$(function() {
	$('#btn').on("click", function() {
    	$("#message").html("メッセージを表示");
		$("#dlg").dialog({
			modal:true,
			title:"ダイアログのタイトル",
			buttons: {"OK": function() {$(this).dialog("close");}}
		});
	});
});
```
```ruby:SampleJDialog.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/pepper-grinder/jquery-ui.css">
    <title>ダイアログの表示</title>
    </head>
  <body>
    <h1>ダイアログの表示</h1>

    <!-- JSファイルの定義 -->
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
    <script type="text/javascript" src="js/dialog.js"></script>

    <!-- ダイアログの表示 -->
    <div id="dlg" style="display:none;">
      <p id="message"></p>
    </div>
    <input type="button" id="btn" value="表示">
  </body>
</html>
```
githubにpushするまでの流れ

# 本日のお悩み
### githubのリポジトリにソースコードをpushしたい

# 本日の処方箋
### 詳細手順と解説を入れながら書き記します。

* ### githubにてリモートリポジトリを作成する
  * GitHubにログインして緑のNewボタンで新規リポジトリを作成
  * リポジトリ名、詳細を入力しCreate repositoryでリポジトリを作成
  <br>

* ### 対象ディレクトリへ移動する

  * ```sh
    $ cd sampleディレクトリ
    ```
    <br>

* ### 「git init」で現在いるフォルダ全体をGit管理できるようにする(初期化)
  * ```sh
    $ git init
    ```
<br>

* ### ブランチの名前を "main" に変更。(必要な時のみでスルーしてOK)
  * **現在のバージョンでは始めからmainなので基本無視**
  * ```sh
    $ git branch -m main
    ```
    **このコマンドは、以下の2つの操作をまとめて実行します。**
    <br>
  * git checkout HEAD: 現在作業中のブランチをチェックアウトします。
  * git branch -m main: チェックアウトしたブランチの名前を "main" に変更します。
    <br>
    つまり、このコマンドを実行すると、現在作業中のブランチが "main" という名前になるだけでなく、HEADポインタもそのブランチを指すようになります。
このコマンドは、以下の状況で使用されます。
    <br>
  * 新しく作成したリポジトリで、デフォルトブランチの名前を "master" から "main" に変更したい場合。
    <br>
  * 既存のリポジトリで、ブランチの名前を "master" から "main" に変更したい場合。
    誤って別のブランチをチェックアウトしてしまった場合、現在作業中のブランチを元のブランチに戻したい場合。
<br>

* ### 「git add」でcommitする前に変更内容を一時的に保存する

  * ```sh
    $ git add .
    ```
<br>

* ### 「git commit」 でディレクトリの変更をローカルリポジトリに登録

  * ```sh
    $ git commit -m "first commit"
    ```
    -mをつけることでコメントを定義することができる
    
    <br>

* ### リモートリポジトリとローカルリポジトリを紐付け
  * ```sh
    # リポジトリからURLをコピーする
    $ git remote add origin https://github.com/Ucchii70/image_analysis.git   
    ```
    
    一回このコマンドを入力すると、ローカルリポジトリとリモートリポジトリがつながっていることになるので、今後ディレクトリの内容を変更してpushする場合はこの作業を飛ばしても良い。
    
![スクリーンショット 2024-05-23 0.50.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768511/c72a8852-fb58-92a9-bb64-ad510283ed4d.png)

<br>

* ### 「git remote -v」でローカルリポジトリに紐づいているリモートリポジトリの名前とURLを表示・確認
  * ```sh
    $ git remote -v
    origin  git@github.com:user/repository.git (fetch)
    origin  git@github.com:user/repository.git (push)
    ```
    **確認しOKならリモートリポジトリとローカルリポジトリの作成と紐付けが完了**
    <br>

  * 紐付けを間違えた場合は、「git remote rm」 (リポジトリURL) で関連付けを削除出来る。
ちなみに、ローカルリポジトリ側からの連携を解除するだけなので、Github上にあるリポジトリは消えない。

  * ```sh
    $ git remote rm origin
    ```
    <br>
    
  * 削除の確認
  * ```sh
    $ git remote -v
    ```
    何も表示されなければ、リモートリポジトリの紐付けが削除されている。
<br>

* ### ローカルリポジトリからリモートリポジトリに「push」(データを送信)する

  * ```sh
    $ git push -u origin main
    ```
リーダー育成

社内リーダー候補に会話した内容を備忘として残します:writing_hand:
言葉足らずの部分があると思いますので予めご了承ください:beginner:

## :crayon: 目的
会社の将来を担う人材の育成:relaxed:
基本的な考え方をベースに最終的に自分のやり方に昇華することを目指します:point_up:

## :innocent: 「丁賞感微」を実践する
- 「丁」は丁寧の丁です。相手に接するときはできるだけ丁重にすること:bow_tone1:
- 「賞」は賞賛の賞です。相手の重要感を満たす効果的な方法は、相手をホメること:clap:
- 「感」は感謝の感です。こちらが心から感謝を示せば、それが相手の重要感を満たすことになる:pray:
- 「微」は微笑の微です。リーダーがニコニコしていれば周囲は安心します:smile:

## :couple: 誰に対しても敬意をもって接する
リーダーになった途端、急に偉そうな態度をとり、部下をあごで使う人がいます。
しかし役職はあくまでも組織のなかでの**役割**にすぎません。
地位があがって自分が偉くなったと錯覚する人がいますが、地位は「権力ではなくて責任」を意味します。部下を権力で動かせると思うこと自体が間違っています。
地位の高さは**責任の重さ**を示しています:point_up:

リーダーに求められるのは、知識や威厳などではなく、**謙虚で偉ぶらない態度**:bangbang:
仕事がうまくいったときにはみんなが支えてくれた、運がよかっただけだと謙虚に考え、
うまくいかなかったときには、自分の努力が足りなかったと自省する:sob:

## :taco: サンドイッチで叱る
どうしても相手に注意を与えたり、間違いを直してもらわなければならないときもあります。
サンドイッチ・テクニックとは次の:three:つのステップを言います。

1. **まずはホメる:clap:**
1. **オブラートに包んで遠回しに注意する:angry:**
1. **もう一度ホメる:clap:**

というように、注意する事柄をほめ言葉でサンドイッチにし、挟み込むのがサンドイッチ・テクニックです。このテクニックを使えば、部下を叱ってもやる気を落とすことはありません。

但し、緊急事態（障害発生時）などはそんなことを悠長にやっている場合ではありませんので、注意することが重要になります。時と場合を判断して使い分けてください:pensive:

## :mountain_bicyclist: 挫折を味わう（失敗を経験する）
挫折を味わうことで、人の痛みが少しは理解できるようになるのです。
**人は決して強くない。百点満点の人などいない:point_up:**
これがのちにリーダーとして人を引っ張っていくときのベースになっていきます。

挫折を経験することで自分の弱さを知るだけでなく、挫折は必ず乗り越えられるのだという
自分を信じる気持ちを学び得ることができます。
**（ひとりではなくチームで）頑張れば何とかなるという自信です:thumbsup:**
挫折を乗り越えた小さな成功体験を積むことで、リーダーに必要な人間性や自信を身につけられると思います:chart_with_upwards_trend:

## :loudspeaker: 普段の意識がつい言葉に出てしまう
言葉遣いに無神経なリーダーは、部下のモチベーションをあっという間に下げてしまう。
どんな言葉を使ったら部下はどう思うのかという想像力を働かさなければなりません。
**リーダーが使う言葉によって、部下の働き方（パフォーマンス）も違ってくると考えています:rocket:**

また、不機嫌は伝染するもので、こちらが不機嫌だと相手も不機嫌になることがあります。
自分の感情がチームの雰囲気を悪くしてしまうのです。
人間は感情の動物ですから、リーダーであっても不機嫌で感情的になるときはあります。
リーダーは個人的な感情をコントロールする方法を身につけなくてはならない:muscle:


## :white_flower: まとめ
私も含め、まずは人間力を底上げすることから徐々に初めていきます:runner_tone1:

- 上司だから偉いわけではない
- リーダーは謙虚でなければならない
- リーダーは挫折を知っている人がいい
- 言葉の大切さを知る
- 不機嫌な自分をコントロールする
【ChatGPT＋DALL-E3】ＵＩが変わりましたよ。


　どうも、カーブミラーです。

　今回は、ＵＩが変わりましたよ、という話です。いくつかあります。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　まずは、ニュース？

　OpenAIが
　　多数のメディア企業と
　　　提携しています。

　それにより
　　ChatGPTのWebを使った出力に
　　　悪影響があるようです。
[IT naviポスト](https://x.com/itnavi2022/status/1793462363649343820?t=xzwYF_1dD9S3q129HiRblw&s=03)
***
　今日の本題は
　　ChatGPTのWeb版の
　　　ＵＩが変更されたことに
　　　　ついてです。

　まずは、
　　スマホブラウザでの
　　　ChatGPT Web版の画面が
　　　　変わりました。
　　　　　無料版も有料版もです。
![Screenshot_20240523-111806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/718708af-e53e-8db5-ff59-d12ab5ad03f1.png)

　　これはパソコンで
　　　見られた形式に
　　　　倣ったんですかね😅

　次に
　　入力して気付きました。
　　　LINEのように
　　　　互い違いな表示に
　　　　　なりました。
　　　　　　枠もあります
![Screenshot_20240523-112923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/747502b5-542d-b4af-adfb-6ae3a2ce8efb.png)

　　入力の編集は
　　　タップすれば、
　　　　鉛筆マークが出てきますので
　　　　　これまで同様です。


　それから
　　画像をアップロード
　　　しようとしたら
![Screenshot_20240523-114147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/41fba7d2-7a4c-cc7c-8206-f36854aded30.png)

　　これは
　　　前から言われていた
　　　　こちらのストレージだけでなく
　　　　　ネット上のファイルが
　　　　　　扱えるように
　　　　　　　なった模様。

　また、
　　画像生成の
　　　待機も変わっています。
![Screenshot_20240523-115327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/34008d6e-9249-c8e2-4bfd-51b7dd50e60b.png)
***
　今回は、短いですね。

　でも、ＵＩ変更は
　　今後の操作に関わってきますので
　　　大切です。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ソースの失われたアプリのSQLを確認したい

とてもとてもレガシーなWindowsアプリがありました。

社内の誰かが開発して幾年月
すでにソースが失われてしまって久しく、だけれども皆で便利に使っている野良アプリ

こいつがどうも変な情報を出しているというコトで調査を行うことになりました。

けれど、ソースがない。。

しかたがないので、アプリが発行しているSQLをパケットキャプチャして解析することにしましたとさ
しかし、Windowsには強力な監視ソフトが入っていて [Wireshark](https://www.wireshark.org/download.html) などはインストール不可！！！

なので、

```mermaid
flowchart LR
    A[Windows] -->|1521| B[Linux] -->|1521| C[Oracle]
```

ってな感じで作業用 Linux を中継させて、LinuxでTcpdumpすることにした



### 手順１： Windowsで通信先とおぼしき相手先を hosts ファイルでねじ曲げる

アプリに手は入れられないので、相手先をLinuxにするため hosts ファイルを編集です

    c:\Windows\System32\drivers\etc\hosts


### 手順２： Linuxでポート転送

Linuxでは Socat を使ってポート転送しときます。
お手軽

```bash
 socat TCP-LISTEN:1521,fork TCP:DBServer:1521  &
```

Socatについてはこちらを参照
　[【2023年10月版】socat による tcp/udp ポート転送 【PROXY】](https://qiita.com/nouernet/items/3091b41234af304f273a)


### 手順３： パケットキャプチャ

Linuxでパケットを取得です

```bash
tcpdump  -i eth0  port 1521  -w DBServer.pcap
```


### 手順４： レガシーアプリを操作

疑わしい情報が表示されるところを操作


### 手順５： キャプチャ結果の確認

tcpdump の結果を確認したいけど、、SQL内にSJISコード文字があるのでちょっとメンドクサイ
　(DBテーブル名やカラム名がSJIS日本語で定義されている。。時代を感じる）

なので、バイナリファイルを表示できる 「 Hex Editor 」 をVSCodeにインストール

VSCodeでファイルを開くと怒られるので、16進数エディター で開く
![u3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/80ce38c0-8f80-5514-770d-c470ddf51913.jpeg)

SJIS部分もちゃんと表示できました

![u4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/2f7dd5f5-4bdf-16bf-2759-de0afa08ccf5.jpeg)




---


とてもとてもレガシーなので暗号化も何もせず、パケットながしてくれてて助かりました
原因が分かったのはいいけど、どうやって治す？？

全解析して再作成？ は、したくないなぁ・・
BigQuery の特定プロジェクトの DatasetID とデータセット作成日時を出力するワンライナー

# 前提
- MacOS で zsh

# 実際のコマンドと出力サンプル

コマンド

```bash
$ bq ls --format prettyjson -n 100 --project_id foobar-project |
jq -r '.[].datasetReference.datasetId' |
xargs -I {} bq show --format prettyjson --project_id foobar-project -d=true {} |
jq -r '[."datasetReference"."datasetId", ."creationTime"] | @csv' |
gawk -F "," '{
    gsub(/"/, "");
    print $1 "\t" strftime("%Y-%m-%d %H:%M:%S", substr($2, 1, 10))
}'
```

出力サンプル（TSV)

```
aaa       2021-09-28 09:57:51
bbb       2020-02-12 19:24:36
ccc       2020-01-10 18:41:00
```
robloxでassistant その72

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
TweenServiceを、連携せよ。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```

local part = Instance.new("Part", game.Workspace)
part.Position = Vector3.new(-30, 1, -12)
part.Anchored = true
local TweenService = game:GetService("TweenService")
local tweenInfo = TweenInfo.new(5)
local tween = TweenService:Create(part, tweenInfo, {
	Position = Vector3.new(20, 1, -12)
})
local tween1 = TweenService:Create(part, tweenInfo, {
	Position = Vector3.new(20, 1, -42)
})
local tween2 = TweenService:Create(part, tweenInfo, {
	Position = Vector3.new(-30, 1, -12)
})
wait(2)
tween:Play()
tween.Completed:Connect(function()
	print("end")
	tween1:Play()
end)
tween1.Completed:Connect(function()
	print("end1")
	tween2:Play()
end)




```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/370ebef8-f42c-735e-b991-77e839f6d530.png)


以上。
git lfsで管理されているfileが含まれるとき

```
$ sudo apt-get install git-lfs
$ git lfs install
```

```
$ git clone https://....
```
で持ってこれるはずですが、git lfs install前に、cloneしていた場合は、

```
$ git lfs pull
```

で、該当ファイルを取得できます。
あああ

import pandas as pd

# df2が既に環境にロードされていると仮定します

# BDATEでデータをソート
df2 = df2.sort_values('BDATE')

# SICC_CODEでグループ化し、STMT_SCOREで前向きの穴埋めを行う
df2['STMT_SCORE'] = df2.groupby('SICC_CODE')['STMT_SCORE'].fillna(method='ffill')

# 同様に、STMT_SCOREが存在する最後のBDATEを記録
df2['REF_DATE'] = df2.groupby('SICC_CODE')['BDATE'].transform(lambda x: x.ffill().where(df2['STMT_SCORE'].notna()))

# 結果を確認
print(df2)
CUDAのオススメの勉強方法

# 概要
CUDAを勉強する時のオススメのTutorialをまとめる

# CUDA初心者
C言語とCUDA言語の違いを勉強できる。
Tutorialに沿って自分でC言語のサンプルコードをCUDAに変化させると、基本が身につく。
https://github.com/puttsk/cuda-tutorial

# CUDA中級者

https://github.com/CoffeeBeforeArch/cuda_programming/tree/master
https://github.com/PacktPublishing/Learn-CUDA-Programming/tree/master
https://github.com/CUDA-Tutorial/CodeSamples

# CUDA上級者
<profesional>
https://github.com/NVIDIA/cuda-samples/tree/master

<too-short>
https://github.com/priteshgohil/CUDA-programming-tutorial


<no order>
https://github.com/rshipley160/learn-cuda/tree/main
ITパスポート 第４次産業革命とビッグデータ

・第４次産業革命
大量のデータを自動収集し連携させ、解析して活用することで新たな価値を生み出す、データどうしのつながりによる産業革命

・超スマート社会（Society5.0）
狩猟社会、農耕社会、工業社会、情報社会に続く人間中心の社会

・SDGs
地球環境を保護しながら、すべての人が貧困を脱し、平和で豊かに暮らせるような世界を目指そうとする国際目標
・持続可能性（サスティナビリティ）
将来に渡り環境破壊や資源の枯渇がなく、経済活動が継続できること

・5G
第５世代移動通信システム
超高速、超低遅延、多数同時接続の三つの特徴がある

・ビッグデータ
多種多様で高頻度に更新される大量のデータ

・ライフログ
生活の記録を長期にわたりデジタルデータに残すこと、または残されたデータ

・PDS
個人が自らのパーソナルデータを管理し、第三者に提供できる仕組み
・情報銀行
個人に代わってパーソナルデータを管理し、第三者に提供する事業者

・構造化データ
定型化されているデータ
学生一覧表や売上表
・非構造化データ
定型化されていないデータ
写真や電子メールなど

・データサイエンス
ビッグデータを数学、統計的に処理したり分析したりすることで、新たな価値を生み出そうとするもの
・データマイニング
大量のデータを分析し、単なる検索では発見できないような隠れた規則や相関関係を導き出そうとする技術
・バスケット分析
よく一緒に購入される商品を分析する技術
・テキストマイニング
データマイニングの一種で、大量のテキストデータから有益な情報を抽出する技術

・PPDACサイクル
データに基づき、現象を中立公正に捉えて、客観的な分析を行っていく解決プロセス
robloxでassistant その71

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
パーツを追いかけるカメラを作れ。

# 手順
- ReplicatedFirstに、localscriptを追加。
- スクリプトを書く。
```
local part = Instance.new("Part", game.Workspace)
part.Position = Vector3.new(-20, 1, -10)
part.Anchored = false

local attachment = Instance.new("Attachment", part)
local vectorForce = Instance.new("VectorForce", part)
vectorForce.Attachment0 = attachment
vectorForce.Force = Vector3.new(400, 0, 0)

local RunService = game:GetService("RunService")
local camera = game.Workspace.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable
RunService.RenderStepped:Connect(function()
	camera.CFrame = CFrame.new(part.Position + Vector3.new(-20, 10, 0), part.Position)
end)

```





# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b616fb97-903a-a93b-0dc6-84eaf5a41e10.png)


以上。
【Chocolatey】Win11にアプリ管理ツールを入れる

# 新しいPCゲットだぜ!!
会社から貸与されてるPCが、4～5年も使ってると色々とガタが来まして。。。
- 起動中にコンセントを抜くと電源が落ちる
- 左のCtrlキーが反応しない
- 色々とやってるプロジェクトのせいで容量が枯渇
- Excelが起動せずにフリーズする ...etc

そんなわけで、新しいPCに変えてもらって絶賛移行作業中の え～すけさんですよ。

# 移行めんどくせぇ。。。
GitHubやDevOps（要はGit）、SVNなどリモートにある資源はまた落とし直せばいいとして、ローカルにしかない【個人的な資料】や【勉強がてらに作ってどこにも公開してないソース】とかはとりあえず前PCから持ってきたけど、インストールしてたツールをまたこっちに移動するの面倒臭くてゲロでそう。。。

な、時に役立つツールがあるので今日はそれをご紹介！

# Chocolateyてなんぞや？
Windows版のGooglePlayやAppStore的な奴で、アプリ一覧とかがあってそこから使いたいアプリをほぼワンクリックでインストール/アンインストールしてくれるツールになります。

# インストールのしかた
- 英語で書かれた[公式サイト](https://chocolatey.org/)の右上にある[インストールリンク](https://chocolatey.org/install)に飛ぶ
- Step 2: Choose Your Installation Method の 
Individual を選択
- ちょっと下にあるコマンドをコピー
```powershell:この記事書いたときのコマンド
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```
- PowerShellを管理者権限で起動して、コピーしたものを実行
- これだけだとコマンドでしかインストールとかの管理が出来ないので、GUIツールをインストール(そのままPowerShellで実行)
```powershell:GUI入れるやつ
choco install chocolateygui
```

ね、簡単でしょ？

# 使い方について
見ろ、公式！
後はフィーリングで使いこなすのです。。。

さぁて、こんな記事書いて遊んでないで、移行作業の続きでもしますか（仕事は？
OpenSSL aes-256-cbcで暗号化したファイルをPython pycryptoで復号する話

# OpenSSL aes-256-cbcで暗号化したファイルをPython pycryptoで復号する
PyCryptoで復号する際、SALTの指定が必要。だが、OpenSSLで暗号化する際にはSALTを指定した記憶が無い。
どうやってSALTを抽出すればいいのか悩んだ結果を記載しておく。

## OpenSSLで暗号化と復号化テスト
`openssl`であればたいていのシステムには入っているので、コマンドラインでの暗号/復号をする際はこれが便利だと思う。
```shell-session
# openssl enc -aes-256-cbc -a -pbkdf2 -in ./plain.txt -out ./crypted.enc -pass pass:'mypassword'
# ls
crypted.enc plain.txt
# cat crypted.enc 
U2FsdGVkX19s4t3BtVIv30+1d5rbOvSwTKMP0cap7NJxuVCKvbRKgk6cDYH4oixt
```
もちろん`openssl enc -d`で解凍も可能。
ちなみに、`-iter` 未指定時は10000回がデフォルトとのこと。使っているサーバに`enc.c`が無かったので自分でエビデンス確認していません。以下を参照させていただきました。
[opensslコマンドを使って暗号化したり...](https://qiita.com/akase244/items/4f8936957c910682d1de)

## pythonで解凍するためのスクリプト
opensslでは、SALTは指定しなくとも暗号化できる。その場合、opensslがランダムに生成しているとのこと。
解凍時、そのSALTはどうやって取得するのかというと、暗号化ファイルの中から抽出できる。
（正直、この辺があってSALTって何の意味があるのか全然理解できていない）

で、それを踏まえて書いたスクリプトが以下。
* count=10000は上記のページを参考にして設定。
* SALTは`data[8:16]`でencryptedファイルから取得するので事前指定不要。
* `pycrypto`使用

``` python:decrypt.py 
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import SHA256
from Crypto.Util.Padding import unpad
from Crypto.Cipher import AES
import base64

def decrypt(data, password, iter_count=10000):
    salt = data[8:16]
    ciphertext = data[16:]

    pbkdf2Hash = PBKDF2(password, salt, 32 + 16, count=iter_count, hmac_hash_module=SHA256)
    key = pbkdf2Hash[0:32]
    iv  = pbkdf2Hash[32:32 + 16]

    cipher = AES.new(key, AES.MODE_CBC, iv)
    return unpad(cipher.decrypt(ciphertext), 16)

password = b'mypassword'
with open('./crypted.enc', 'r') as f:
    data = base64.b64decode(f.read())
plaintext = decrypt(data, password).decode("utf-8")
print(plaintext)
```
実行してみる。
```shell-session
# python3 ./decrypt.py 
犯人はごん

```
ごん、お前だったのか…
robloxでassistant その70

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
BodyVelocityを、使え。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```
local part = Instance.new("Part", game.Workspace)
part.Position = Vector3.new(-10, 1, -10)
part.Anchored = false
local attachment = Instance.new("Attachment", part)

local bv = Instance.new("BodyVelocity", part)
bv.Velocity = Vector3.new(1, 0, 0)
bv.MaxForce = Vector3.new(90, math.huge, 90)
bv.P = 9000

```

以上。
robloxでassistant その69

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
LinearVelocityを、使え。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```
local part = Instance.new("Part", game.Workspace)
part.Position = Vector3.new(-10, 1, -10)
part.Anchored = false
local attachment = Instance.new("Attachment", part)

local linearVelocity = Instance.new("LinearVelocity", part)
linearVelocity.Attachment0 = attachment
linearVelocity.MaxForce = 10000
linearVelocity.VectorVelocity = Vector3.new(1, 0, 0)

```

以上。
Microsoft Word 2016 で印刷したら文字が切れる


# 環境
- MS-Windows 10 Pro
- Microsoft Word 2016
- Canon iR-ADV C3520 レーザー複合機
- EPSON EP-884AW インクジェットプリンター

# Word文書

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/01635054-4416-a8a6-201a-cbafcc9aacd4.png)

# 印刷したら切れる

 Canon iR-ADV C3520 レーザー複合機で印刷すると、右横断禁止の標識が切れてしまう。信号機は問題なし。

# ??

別　PC　マシンで印刷したら問題なし、また、同じ　PC　でEPSON EP-884AW インクジェットプリンターで印刷しても問題なし

# プリンタドライバ

ドライバのバージョンは不明。いまどきはどこで確認するのかな？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8230462f-2507-602b-9d19-1d632b18bd09.png)

PC　2台　間で違いはなさそうだが・・・


# 解決

データが .doc  形式だったので、.docx 形式に直して印刷するとOK
robloxでassistant その68

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
AngularVelocityを、使え。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```
local part = Instance.new("Part", game.Workspace)
part.Position = Vector3.new(-10, 1, -10)
part.Anchored = false
local attachment = Instance.new("Attachment", part)

local angularVelocity = Instance.new("AngularVelocity", part)
angularVelocity.Attachment0 = attachment
angularVelocity.MaxTorque = 100000
angularVelocity.AngularVelocity = Vector3.new(0, 1, 0)
```

以上。
robloxでassistant その67

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
VectorForceを、使え。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。

```
local part = Instance.new("Part", game.Workspace)
part.Position = Vector3.new(-10, 1, -10)
part.Anchored = false
local attachment = Instance.new("Attachment", part)

local vectorForce = Instance.new("VectorForce", part)
vectorForce.Attachment0 = attachment
vectorForce.Force = Vector3.new(400, 0, 0)

```

以上。
社内文章検索システム：RAG(Retrieval-Augmented Generation)による高度な情報検索

# はじめに

Amazon BedrockとKendraを活用したRAG(Retrieval-Augmented Generation)による社内文章検索システムについて説明します。本システムは、従来の検索システムよりも高度な情報検索を実現し、社内情報の活用を促進します。

今回作ったレポジトリーはこちらです。

https://github.com/sugiyama404/practice_aws_rag

# Retrieval-Augmented Generation(RAG)とは

Retrieval-Augmented Generation(RAG)とは、日本語では「検索拡張生成」と訳されます。これは、自然言語処理技術を活用して、既存の文書から情報を抽出し、新しい文章を生成する手法です。
AWS BedrockとKendraを組み合わせることで、社内文書を効率的に活用し、高品質な文章を生成することが可能になります。

## 仕組み

Kendraによる検索: ユーザーからの質問や指示に基づいて、Kendraに対して検索クエリを送信します。Kendraは社内文書をインデックス化しており、関連性の高い文書を抽出して検索結果を返します。

1. Bedrockによる文章生成: Bedrockは、Kendraから返された検索結果を基に、新しい文章を生成します
2. Bedrockは、生成された文章が論理的に整合性があり、文法的に正しいことを確認します
3. ユーザーへの回答: 生成された文章は、ユーザーに対して回答として提示されます

## RAGとファインチューニングの違い

RAG（Retrieval-Augmented Generation）とファインチューニングは、どちらも自然言語処理において重要な技術ですが、それぞれ異なる目的と仕組みを持っています。

### 目的
+ RAG: 既存の文書から情報を抽出し、新しい文章を生成すること
+ ファインチューニング: 既存の言語モデルを特定のタスクやデータセットに合わせて調整すること

### 仕組み
+ RAG: 検索エンジンを使って、入力クエリの関連する文書を検索します。検索結果から情報を抽出し、新しい文章を生成します
+ ファインチューニング: 既存の言語モデルに対して、特定のタスクやデータセットのラベル付きデータを入力します。言語モデルのパラメータを調整し、タスクやデータセットのパフォーマンスを向上させます

### 長所と短所


x|RAG|ファインチューニング
---|---|---
長所|- 少ないデータで学習できる。<br>- 既存の知識を活かせる。<br>- 多様な文章形式を生成できる。|- 高い精度が期待できる。<br>- 特定のタスクに特化できる。
短所|- 生成される文章の質が不安定になる場合がある。<br>- 検索結果に依存するため、偏りが生じる可能性がある。|- 大量のデータと計算資源が必要。<br>- 汎用性が低くなる。

# 実装
## インフラ構成

![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/047ad313-6856-402f-a7bb-a247e0e802cb.png)

+ S3: データの保存と管理
+ API Gateway: システムと外部の通信を可能にする API の作成と管理
+ CloudWatch: ログの収集
+ ELB: トラフィックの分散と負荷分散
+ Fargate: コンテナの管理とスケーリング
+ ECR: コンテナイメージの保存と管理
+ IAM: アクセス管理とセキュリティの設定
+ Lambda: イベント駆動型のサーバーレスコンピューティング

## 実装のポイント

### Bedrockのモデルを有効にする。
AWS マネジメントコンソールで Amazon Bedrockにアクセスし、「Titan Text G1 - Express」を有効にして下さい。terraformでは自動化できず手動のみです。

### Amazon Kendraサービスとs3と同期
AWS マネジメントコンソールで Amazon Kendraにアクセスし、s3と同期して下さい。terraformでは自動化できず手動のみです。

# 結果

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/6248010d-6b5f-5466-b72e-c3506b22f3aa.gif)

参考記事

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html

https://kdl-di.hatenablog.com/entry/2024/03/13/090000
【Slack】チャンネルに投稿されたスレッドメッセージに表示される「チャンネルから外す」とは何かを調べてみました

<!--

## 技術記事のタイトル

最も伝えたいこと。
簡潔かつ分かりやすく過不足ないタイトルを考えましょう。

### 【 】(墨付き括弧)

- 【言語やサービス】
    - 例1.【Python】すぐにpytestで単体テストを実行するまでの手順
- 【言いたいこと】
    - 例1.【必見】Objectはどこに消えた？
- 【前提】
    - 例1.【個人開発】○○を○○できるサービスをリリースしました
    - 例2.【初心者向け】Reactとはそもそも何なのか説明します
- 【続き物の番号】
    - 例1.【2024年版】新入社員向け研修資料を公開します
    - 例2.【環境構築編】Windows11でPythonを実行するまで

【前提】詳しいタイトル【言語やサービス】のように、複数を併用するパターンもあります。

-->

## はじめに

最近、Slackを使っていて「チャンネルから外す」という良く分からないメニューがあることに気づき調べてみたいのですが、ネット上に情報がなかったので調査がてらまとめてました。

### この記事でわかる・できること

- Slackのメッセージのメニューに表示される「チャンネルから外す」の意味
- 一度スレッドに投稿したメッセージをチャンネルに投稿する方法

## 「チャンネルから外す」について

「チャンネルから外す」と言ってるのは、このメッセージのことです。

![Screenshot 2024-05-23 at 10.14.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/6f7e7d1e-dce3-2310-5f21-c4a0cd1ac3b9.png)

クリックすると以下の画面が表示されます。

![Screenshot 2024-05-23 at 10.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/36e965b4-4b27-b71f-71df-fb3c1b36bcd6.png)

「メッセージを削除する」をクリックすると、
以下の画面のようにチャンネル上からはメッセージは削除されますが、
スレッド上にはメッセージが残った状態となります。

![Screenshot 2024-05-23 at 10.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/19be2d07-e41e-2640-c6e5-889d7e90a1e1.png)


## 一度スレッドに投稿したメッセージをチャンネルに投稿する方法

関連情報として、スレッド上のメッセージをチャンネルに投稿する方法があることを知ったので、こちらも以下にまとめます。

スレッドメッセージの「︙」をクリックすると「このチャンネルにも返信を投稿する」が表示されます。

![Screenshot 2024-05-23 at 10.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/9b8d46d8-7428-85e1-3628-fd80892b339c.png)

「このチャンネルにも返信を投稿する」をクリックすると、
以下の赤枠のようにメッセージがチャンネルにも投稿されます。

![Screenshot 2024-05-23 at 10.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/efd1ef29-9145-67ab-03d4-793c59237b78.png)


## おわりに

普段使ってるSlackでも、気をつけてみると知らない機能があり、
今回調査してみて結構使えるなと思ったので普段から色んなことに興味持つこと大事だなと思いました！


## 参考資料

https://slack.com/intl/ja-jp/help/articles/115000769927-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E4%BC%9A%E8%A9%B1%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B-

本記事を書く時にテンプレートを使わせて頂きました！
https://qiita.com/FlatBone/items/187f40a0530a44b2d7bd
Nextjs App Router での静的サイトのための設定と実装

NexjsのApp RouterでSSGでの静的サイトを構築した際の備忘録。

用意して頂いた環境が良くあるレンタルサーバーだったので、SSGで生成したindex.htmlをURLの通り分けたフォルダに置く必要があった。App Routerで作成して無理ならPagesに戻すつもりで進めたら、意外と何とかなった。

[Nextjsのドキュメント | Static Exports](https://nextjs.org/docs/app/building-your-application/deploying/static-exports)

ポイントは以下の通り。

- next.configの設定
  - `output: 'export'` : 静的サイトまたはSPAとしてビルドする設定
  - `trailingSlash: true` : これを設定すると`/path.html`から`/path/index.html` となる。

- pages.tsxの実装
  - `'use client'` : クライアント側で処理を実行する
  - 動的にURLを生成するための`generateStaticParams()`の実装

## next.configの設定

設定後の`next.config.mjs`。

```js:next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export',
  // distDir: 'dist'
  trailingSlash: true,
};

export default nextConfig;
```

### output: 'export'

静的サイトまたはSPAとしてビルドする設定。`next build`を実行するとデフォルトでは`out`ディレクトリに出力される。この`out`の出力をファイルとフォルダ構成そのままホスティングサービスのルートに置けば静的サイトを公開できる。

`out`ではないディレクトリに出力したい場合は`distDir: 'dist'`で書き換えると良い。

### trailingSlash: true

階層のあるページ`/app/path/to/page.tsx`はデフォルトでは`root/path/to.html`のファイルとして出力される。
今回は`/path/to/`のURLにアクセスしたとき、そのフォルダの`index.html`を読むウェブサーバーの設定出るため、`root/path/to/index.html`を出力して欲しい。`trailingSlash: true`の設定だけで切り替わった。

## pages.tsxの実装例

サーバ側はNodeがなくホスティングのみで処理ができないため、`pages.tsx`ファイルの先頭には`'use client'`を明示してクライアント側で処理する。

```tsx:pages.tsx
'use client'

export default function Home() {
  return (
    <>{/* ページのコンテンツ */}</>
  );
}
```

### 動的なページの場合

お知らせの記事`/news/[slug]/`のようにページを動的に作るときの書き方。

`'use client'`は書かない。`generateStaticParams()`の関数で`slug`にあたる文字列のリストを作って渡す。

```tsx:/news/[slug]/page.tsx
// 'use client'は不要。`generateStaticParams()`と競合する。

type Props = {
  params: {
    slug: string;
  };
};

export default function NewsDetail({ params }: Props) {
  return (
    <>{/* ページのコンテンツ */}</>
  );
}

export async function generateStaticParams() {
  const newsList = [{ slug: '2021-01-01' }, { slug: '2021-01-02' }]; // 記事の一覧を取得する処理
  // 静的なパラメータの配列を返す
  return newsList.map((news) => ({
    slug: news.slug,
  }));
}
```

この書き方では、以下の通りslugがnews配下のフォルダとなってそこにindex.htmlができる。

```txt
/
|- news/
   |- 2021-01-01/
      |- index.html
   |- 2021-01-02/
      |- index.html
```

[自分のブログ](https://tech.suzu-san.com/posts/342-next-app-router-ssg)にも同じ記事がある。
UbuntuでVRChatに入るとAnti-Cheat Errorで弾かれる！

# ある日...
よっしゃ〜今日もぶいちゃやるか〜(時計「01:00」)
...ん？アンチチートエラー？
...何分待っても進まんな...落とすか...

よしぶいちゃ再起！
...ん？なんかいま一瞬韓国語の言語ファイルのVerifyに失敗したとかって見えたが...なんか進んだしいっか〜

**(爆音不協和音)**

# 概要...というか経緯その2
...なんて事、ぶいちゃLinux勢の方なら何度も通ってきた道ですよね。
私なんかこれがTiger-Horseになって2週間ぐらいぶいちゃ起動できませんでしたからね(恨み節)
なんかggったりするとそもそもProtonで動かしてんだからそーいうのはしゃーないとか、特にAMD製CPUだと相性悪いとか色々出てきはするものの、
解決策っぽいのが特に引っ掛からなくて途方に暮れていたそんな時。
たまたまSteamのライブラリを眺めていた時、ふと視線に「Proton EasyAntiCheat Runtime」が。

**これやん！！！！！(クソデカボイス)**

なんか他のEAC使ってるゲームは一緒に入れてくれたりするらしいんですけど、**何故か**ぶいちゃは入れてくれないんですよね(想定してない遊び方してる我々のせいだろうけど)
というわけで「Proton EasyAntiCheat Runtime」入れましょう。

:::note alert
(2024/05/26追記)
出ました。Anti-Cheat Error。久々に。
というわけで結局の所絶対に防げるってわけじゃなさそうです。
あくまで予防みたいな感じでやっておくスタンスでいましょう。
アンチチートとか一瞬でも見えたら即座に☒連打しましょう。間に合います。
:::

# Proton EasyAntiCheat Runtime、入れよう！
入れると言ってもSteam上で公開されてるのでただインストールﾎﾟﾁｨだけでいいです。楽。

まずSteam起動して、「ライブラリ」タブを開きます。
そしたら左の列、「ホーム」の下の「ゲーム」とか書いてるドロップダウンを開き、デフォルトでOFFになっているであろう「ツール」にチェックを入れます。
すると一覧のどっかに「Proton EasyAntiCheat Runtime」が現れるので「インストール」をﾎﾟﾁｨと。

...はい。これだけです。なんか関連付け的なsomethingはないっぽいです。

# 最後に
Proton EasyAntiCheat Runtime自体そもそも自動で入る事が多いらしくあんまり情報がなかったので、ライブラリたまたま眺めてなければまた爆音に悩まされるところでした。

あと最後に言うのもなんですけど、爆音不協和音が怖すぎるので実は検証とか特にしてないです。
なので本当にこれのおかげでAnti-Cheat Errorが消えたかどうかは分かりません。
ただ少なくとも、入れる前までは6〜7割ぐらいの頻度で起きていたAnti-Cheat Errorが入れてから1回も起きてない事は大きいかと。
この記事を通して少しでも多くのぶいちゃLinux勢の虎馬を滅する事ができればワイ、幸いの限りです...

:::note info
ちなみに筆者には未だに傷跡は残ってて、ぶいちゃ起動時にはヘドンホホは外し、すぐに閉じれるように2番ディスプレイにSteamを起動させておいてたりします。爆音不協和音ｺﾜｲ
:::
LoftQ: 量子化とLoRAファインチューニングの初期化の不一致問題の解決策

※ このページは「LoftQ: LoRA-Fine-Tuning-Aware Quantization for Large Language Models」の要約になります。

## このページでわかること
- LoftQという新しい量子化フレームワークを提案し、量子化とLoRAファインチューニングを組み合わせることで、下流タスクでの性能を向上させる
- LoftQは、量子化による初期化の不一致を緩和し、特に低ビット量子化の条件下で優れた性能を発揮
- 実験結果から、LoftQが既存の量子化手法を上回ることが確認

## 対象読者
- 大規模言語モデル（LLM）の効率的な量子化とファインチューニングに関心があり、新しい手法を探求したい人
- 特に、リソース制約のある環境で大規模モデルをデプロイし、性能を最適化したい人

## 従来手法の問題点
1. **大規模言語モデル（LLM）の高い計算リソースとメモリ要求**：
   - 事前学習済み言語モデルは、自然言語処理（NLP）のさまざまなタスクで優れた性能を発揮しますが、計算リソースとメモリの要求が非常に高いため、実際の運用で課題となる

2. **量子化とLoRAファインチューニングの不一致**：
   - 量子化はモデルの圧縮技術として広く用いられていますが、量子化後のモデルの初期化がLoRAファインチューニングに適さず、性能が低下するという問題がある
   - 特に低ビット（例：2ビット）での量子化では、この不一致が顕著であり、初期化の不一致が下流タスクの性能に悪影響を与えることが指摘されている

3. **既存手法の限界**：
   - 従来の量子化手法（例えばQLoRA）は、量子化とLoRAファインチューニングを別々に考慮するため、初期化の不一致問題を十分に解決できていません。この結果、低ビット量子化での性能が著しく低下することがある

## LoftQ
### LoftQ とは？
LoftQ（LoRA-Fine-Tuning-Aware Quantization）は、LLMに対して量子化とLoRA（Low-Rank Adaptation）ファインチューニングを同時に適用する新しい量子化フレームワークです。この手法は、量子化されたモデルとフルプレシジョンモデルの不一致を緩和し、量子化の影響を受けずに下流タスクでの性能を向上させることを目的としています。

### LoftQ のメリット
1. **性能向上**：LoftQは、従来の量子化手法に比べて、特に低ビット量子化（2ビットや2/4ビット混合精度）において優れた性能を発揮する
2. **初期化の不一致を緩和**：量子化によって導入される初期化の不一致を緩和し、LoRAファインチューニングの有効性を高める
3. **幅広い適用性**：自然言語理解、質問応答、要約、自然言語生成など、さまざまな下流タスクでの有効性が実証されている
4. **効率性**：LoftQは、様々な量子化方法（例えば、Uniform量子化やNormalFloat量子化）と互換性があり、効率的な適用が可能

### LoftQ の手順
1. **初期化**：低ランクの重み行列 $A$ と $B$ をゼロで初期化する
2. **交互最適化**：
   - **量子化ステップ**：前ステップで得られた低ランク近似 $A_{t-1}$ と $B_{t-1}$ を用いて、元の高精度の事前学習済み重み $W$ と $A_{t-1} B_{t-1}^\top$ の差を量子化し、量子化重み $Q_t$ を得る
   - **SVD（特異値分解）ステップ**：量子化残差$R_t = W - Q_t$に対して特異値分解を行い、低ランク近似 $A_t$ と $B_t$ を更新する
3. **LoRAファインチューニングの初期化**：得られた量子化重み $Q_T$ と低ランク近似 $A_T$、$B_T$ を用いてモデルを初期化し、LoRAファインチューニングを実行する

### LoftQ の性能
LoftQは、以下の実験で既存の量子化手法を上回る性能を示しています：
1. **自然言語理解（NLU）**：GLUEベンチマーク、SQuADv1.1、ANLIなどのデータセットで評価。LoftQは一貫してQLoRAを上回る性能を示し、特に2ビット量子化でも高い精度を維持
2. **要約**：BART-largeモデルを用いたXSumおよびCNN/DailyMailデータセットで評価。LoftQはQLoRAよりも高いROUGEスコアを達成
3. **自然言語生成（NLG）**：LLAMA-2モデルを用いたWikiText-2およびGSM8Kデータセットで評価。LoftQはQLoRAを上回り、低ビット量子化でも良好な性能を維持


## まとめ
以上がLoftQの要約でした。QLoRAやQA-LoRAと異なり、量子化と低ランク近似を交互に適用して性能を向上させようというアプローチのようですね。

QA-LoRA 難かと比べて複雑ですが、どこまで性能が向上するのか気になりますね。

おわり。
Webサービスのマネタイズ手法

# はじめに

インターネット上のサービスやアプリケーションが普及する中で、それらを収益化する手法も多岐にわたっています。この記事では、代表的なマネタイズ手法を紹介し、それぞれの特徴や適用例について解説します。

# Webサービスのマネタイズ手法

Webサービスのマネタイズ手法を例と一緒にご紹介します。

## 広告モデル

広告モデルは、ウェブサイトやアプリに広告スペースを提供し、広告主から収入を得る方法です。ユーザーが広告をクリックするか、単に表示されるだけで収益が発生します。広告内容はユーザーの興味や行動に合わせて最適化されることが多く、ターゲティング広告が主流です。このモデルは、[Google AdSense](https://www.google.com/adsense/start/)や[Yahoo! JAPAN Ads](https://promotionalads.yahoo.co.jp/)などで広く利用されています。

## サブスクリプションモデル

サブスクリプションモデルは、ユーザーに月額や年額の定期料金を支払わせることでサービスを提供します。これにより、継続的な収入源を確保することができ、ユーザーには継続的なコンテンツやサービスへのアクセスが保証されます。新聞、音楽、動画配信サービス（例：[Netflix](https://www.netflix.com/)、[Spotify](https://www.spotify.com/)、[dTV](https://video.dmkt-sp.jp/)）などで一般的に見られるモデルです。

## フリーミアムモデル

フリーミアムモデルは、基本サービスを無料で提供し、特定の追加機能やサービスを有料で提供する手法です。多くのユーザーを惹きつけるために無料サービスを広げ、一部のユーザーからの収益化を図ります。このモデルは、アプリやソフトウェア（例：[Dropbox](https://www.dropbox.com/)、[LINE](https://line.me/ja/)）で特に人気があります。

## トランザクション手数料

トランザクション手数料は、商品やサービスの売買が成立するたびに手数料を取る方法です。この手数料は、プラットフォームが提供する取引の便利さや安全性に対する対価として設定されます。オンラインマーケットプレイス（例：[メルカリ](https://www.mercari.com/jp/)、[楽天市場](https://www.rakuten.co.jp/)）や予約システムでよく使用されます。

## アフィリエイトモデル

アフィリエイトモデルは、他者の商品やサービスを推薦し、それが販売された場合に手数料を受け取る手法です。リンクを通じて商品が購入されると、アフィリエイトは売上の一定割合を受け取ります。このモデルは、ブログや情報サイト（例：[Amazonアソシエイト](https://affiliate.amazon.co.jp/)、[楽天アフィリエイト](https://affiliate.rakuten.co.jp/)）に多く採用されています。

## ライセンス販売

ライセンス販売は、ソフトウェアやデータベースなどの製品を他社に利用する権利を売ることで収益を上げる方法です。一度の販売で継続的な収入を得ることができる場合もあります。この手法は、ビジネスソフトウェアやデジタルコンテンツ（例：[Microsoft Office](https://www.microsoft.com/ja-jp/microsoft-365)、[Adobe Creative Cloud](https://www.adobe.com/jp/creativecloud.html)）でよく見られます。

## データ販売

データ販売は、収集したデータを分析し、その情報を他の企業や機関に販売する方法です。このデータは市場の洞察や消費者行動の分析に利用されます。データブローカーや分析会社（例：[NTTデータ](https://www.nttdata.com/jp/ja/)、[楽天インサイト](https://insight.rakuten.co.jp/)）が主に行っているビジネスモデルです。

## コース販売

コース販売は、専門知識やスキルを学ぶためのオンラインコースを販売する方法です。これにより、受講者は専門的な知識や技術を習得することができます。このモデルは、[Udemy](https://www.udemy.com/)、[Schoo](https://schoo.jp/)などでよく見られます。

# 結論

各マネタイズ手法にはそれぞれのメリットとデメリットがあり、提供するサービスやターゲットとするユーザー層に応じて最適な手法を選択することが重要です。適切なマネタイズ戦略を採用することで、持続可能なビジネスモデルを構築し、安定した収益を得ることが可能となります。