OmniAICreator/Qiita-1.07M huggingface dataset:
【Jetpack Compose】Themeを適用するとText要素のサイズが変わる

既存のxmlの実装をcomposeにリファクタしていたときに、全く同じサイズにしているのにTextを含む要素のサイズが変わり、膨大な時間を消費してしまったのでメモ

### 背景
行内の要素の大きさに合わせていい感じに折り返す必要がある画面で、
FlexboxLayoutをcomposeのFlowRowにリファクタしていた際、
Themeで囲うとなぜか本来折り返されないところで折り返された！！
　　→ テーマの有無で文字を含む要素のサイズが変わってる、、、？
| Theme未適用時 | Theme適用時 |
|:-:|:-:|
|![スクリーンショット 2023-10-15 0.05.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577219/f0fb33c5-acda-5015-128e-e06e973b3aac.png)|![スクリーンショット 2023-10-15 0.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577219/27bfead4-eab0-6b3a-48fc-a7c958afc4c3.png)|



```kotlin:kotlin
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun FlexBlock() {
    MaterialTheme { //　この行の有無で1行の表示数が変わる
        FlowRow {
            for (i in 0..10) {
                Text(
                    text = "テキスト$i",
                    modifier = Modifier
                        .padding(5.dp)
                        .background(Color.Gray, RoundedCornerShape(3.dp))
                        .padding(horizontal = 7.dp, vertical = 4.dp)
                )
            }
        }
    }
}
```


### 本題: Themeを適用するとTextの`letterSpacing`が`0.5.sp`に設定される
MaterialThemeはデフォルトで`letterSpacing=0.5.sp`に設定されており、文字間にスペースが追加されるらしい
→ `letterSpacing=0.sp`とすることで既存の実装と同じになって解決した
ピクセル単位で厳密にリファクタリングする必要がある際には覚えておいたほうがいいかも、、、
```kotlin:kotlin
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun FlexBlock() {
    MaterialTheme {
        FlowRow {
            for (i in 0..10) {
                Text(
                    text = "テキスト$i",
                    letterSpacing = 0.sp, // 追加する
                    modifier = Modifier
                        .padding(5.dp)
                        .background(Color.Gray, RoundedCornerShape(3.dp))
                        .padding(horizontal = 7.dp, vertical = 4.dp)
                )
            }
        }
    }
}
```
個人開発でゲームをリリースした話とその反省点

先日UnityでPC用ゲームを作ってDLSiteにてリリースしました。
その時感じた課題や次回への反省点を書こうと思います。

### 開発の動機

私はエンジニアになって5年ほどですが、普段はWEBサービスの開発を行っており、ゲームについては門外漢です。
何故ゲームを作る気になったのかというと、

- ゲームをするのが好き
- ちょうど積みゲーを消化しきって暇だしなんかアウトプットでもするか
- 仕事でやっているWEBサービス以外のものにしよう
- あわよくばちょっとした実績や副収入になればなおよし

というふわっとしたものでした。

### 作ったゲームと結果
制作期間は約3か月。制作費用は０円。価格は１００円(DLSiteの割引を設定し実際は30円くらいで売り始めました)
想定プレイ時間は１時間半～で、全ルートやろうとしたら3時間くらいでしょう。
作ったゲームは20階層のシンプルなマップを探索しながら美少女を育てて最上階にいる魔王を倒す、みたいなシンプルな2Dゲームです。良かったら買ってください(ステマ)。
https://www.dlsite.com/home/work/=/product_id/RJ01089582.html
一応言っておきますが、エッチな奴じゃないです。DLSiteでリリースした理由は後述します。

個人開発のゲームは全然儲からないとGoogle検索で出てきたサイトすべてに書いてあったのでまあ１本でも売れたら御の字だろうと思っていましたが、結果は６本売れ、お気に入り数は21(記事投稿時)でした。
初めてにしては上出来ですね。

### ゲームを作ってよかったこと
- プロダクトを一から作って世に出すという経験ができた
- 自分が設定した納期を守れた
- 大量のソースを書いたりシステム全体を１から設計したりと勉強になることも多かった
- 絵がちょっとうまくなった
- エンジニア的なスキル以外で今の自分に必要なものが見えて来た
- 己の今の力量が客観的にわかった

普段の仕事でやったことがないことをできたのは貴重な経験だったと思います。
また、仕様は全部自分で決められるので自分の胸先三寸で好き勝手作れるのも昼休みにやるバスケみたいで楽しかったですね。

### 直面した課題
#### ゲームをリリースするには金がかかる
クオリティを追求することなく、ただ作るだけならお金はかかりません。
Unityもタダですからね(いまのところは）
しかし、リリースするとなると、プラットフォームの多くはお金がかかるんですね。
最初はSteamで出すつもりでしたが、１万円かかると聞いて断念しました。
海外にはゲームを投稿できる無料サイトもあるそうですが、トラブった時に海外の法廷に呼ばれたらどうするんだと知人に脅かされてチキったのでやめました。
スマホ版も出そうかな、なんて思ってもいましたが、GooglePlayの登録料が数千円かかるのでやめました。
どれも大金ではないので払えばいいじゃんって感じですが、赤字は出したくなかったので断念しました。

#### ノウハウがないのでこれでいいのかわからない
オブジェクトの動かし方からセーブの仕方まで正直WEBサービスを作るときには考えたことのないことなので、ググりググり、果たしてこれでいいのか、もっといい書き方があるんじゃないかと思いながらふわっと完成させてしまいました。
これが個人でやったことの一番の弊害だったと思います。
ソースについてもレビューしてくれる人がいないので今見返すともっといい感じにできたんじゃないかという部分がちらほらありますね。
これは開発に限った話ではなく、PRやらマーケティングやら何か商品を売るうえでやらなければいけないことがいくつかあるんだなということはわかるんですが、それをどうやればいいのか、何からやればいいのか。これがわからない。

### 反省点
全体を通しての反省点は以下の通りです。
- 作りたいものでも望まれるものでもない中途半端な出来
- 仕様について資料を残していないので見返すのが大変
- マーケティングをしなかった(できなかった)

#### 作りたいものでも望まれるものでもない中途半端な出来
これに関しては計画段階から問題があります。
なんとなくこれなら作れそうかなという観点ですべてを考えてしまった結果、誰からも、作者である私からも望まれないゲームになってしまいました。

やってみると意外と初見殺しとか運要素とかちょっとした戦略性もあってまあまあ面白いんですけどね。飽きる頃にはクリアできるくらいのボリュームですし。

でも、ゲームを探す時ってそういうコンセプトがわからない奴はスルーしがちですよね。
自分の好きなジャンルとか好きなゲームに似ているものなら期待できそうだから買いますが、ジャンルもゲーム性も不明なゲームで面白いかどうか判断する材料(PVとか体験版とか)がなければ１円でも買いたいとは思わないでしょう。

#### 仕様について資料を残していないので見返すのが大変
個人で作っているので仕様は自分だけがわかればいいと思い、スピード重視でドキュメントをほとんど作成しませんでした。
でもそれは間違いでした。３か月前に考えた事なんて当然忘れるからです。

断片的な走り書きやソースコードに残されたわずかなコメントを元に本来どう動くのが正しいのかを推理しながら進めるのは大変でした。数か月前の自分なんてほとんど他人みたいなものですし。
これが開発中で一番苦労したことでした。

#### マーケティングをしなかった(できなかった)
人間欲がわくもので、仕事の後やら休みの日やらを何か月間も費やした作品なんですから、売れるならそれに越したことはないと思うわけです。
あと、全然売れないとレビューを書いてもらえません。
作ったものに対してフィードバックがないのはあまりにも悲しい。
個人開発だとチームメンバーと感想を言い合うということもできませんし。

クオリティを上げることも大事ですが、ゲームのターゲット決定にもかかわってくる部分ですし、
作ったものをより多くの人に手に取ってもらいたいと思うなら必要なことだと思いました。

### 今後について
反省点はいろいろありましたが、なんだかんだ面白かったのでゲーム開発は続けていく所存です。
コーディングも大事ですが、イラストの腕を上げたり、マーケティングを勉強したり、面白いゲームシステムを検討したり、エンジニア以外のスキルの方が重要だと感じる部分が多かったのでそちらを重点的に伸ばしていければなと思います。

目下、バトルのないローグライク風の美少女のゲームを鋭意制作中です。
次はSTEAMでも出して、その費用が回収できるくらいの出来になればいいなと思います。
学習記録10月15日

## はじめに
"こんにちは、未経験からエンジニア転職達成のためこの学習記録では、JavaScriptをマスターし、ウェブ開発のスキルを向上させることを目指します。進捗や課題についても発信していく予定です。
改善点やアドバイス等ぜひコメントください🙇‍♂️


## 課題と問題
1.< link rel="icon" href="images/favicon.svg" type="images/svg+xml">とは

2.position: fixed;:とは

3.inset: 0;とは

4.offsetとは

## 

### 分かったこと
1.rel属性でwebページのアイコンを指定して、href属性: ファビコンのファイルパスを指定する。
2.position: fixed;: このプロパティは要素をビューポートに対して固定位置に配置します。要素がスクロールに追従せず、画面上で固定されます。
3.inset: 0;: inset プロパティは、上下左右の余白（マージン）を一括して設定します。0の値を指定することで、上下左右の余白をすべてゼロに設定し、要素が画面全体に広がります。この方法は要素を画面いっぱいに広げるための簡単で効果的な手法です。

 4.opacity:1,offset:.8, durationで指定した秒数のうちoffsetで指定した％から（2秒なら80%1.6秒から）変化をつける。　

## 振り返り
インプットだけでなくアウトプットとして、
ロードが完了したら背景が徐々に変わっていく機能を一からやってみました。
わからない点は 無料版のchatgptに聞いていますが、有料版にした方がいいのか迷ってます。

## 参考記事
[リンクタイトル](https://zenn.dev/tak_dcxi/articles/26280e7607bcd2)
Django12～Model 項目属性と、項目チェック機能について

備忘録として入れときます。後で見直したときの参考用です。

こちらでわかりやす可いてあったので覚書としてリンクしておきます。
https://note.com/saito_pythonista/n/n920bbc48c8fd

ドキュメントの該当箇所かこちら。
https://docs.djangoproject.com/ja/4.2/ref/models/fields/#model-field-types
https://docs.djangoproject.com/ja/4.2/ref/models/fields/#common-model-field-options

ためしにうってみた。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/cdc8f006-3bbe-a235-f99c-b6d3416eaff7.jpeg)
キーボードの接触が悪くなった時は、接点復活剤でクリーニング

　仕事でプログラミングなどをしていると、キーボードが壊れたからと言って、慣れているキーボードから買い換えるのは、躊躇いがあるものです。私も長年使用しているキーボードを、飲み物などで水没させてしまい、それから調子が悪くなってしまいました。清涼飲料水などは電解質ですから、そのまま使用し続けるわけにも行かず、べたべたですし、何とかクリーニングしたいと思うものです。そこで今回は、タイトルにもある通り、「接点復活剤」でクリーニングしてやると調子がいいので、記録として残しておきます。

<BR>
<BR>

### ThinkPad Tablet2 Bluetooth Keyboard with Stand : EBK-209A の接点復活剤によるクリーニング

　「接点復活剤」は言うまでもなく、Amazon や楽天市場にお手頃なものがいくつもあります。

![20231016_052727766_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486355/6ae63352-c31c-e53b-9ccf-428b91297765.jpeg)

　今回は、私の長年使用しているキーボードを接点復活剤を利用して、接触不良の改善をしてみました。チャタリングで困っている場合も、効果があるはずです。

![20231016_053108559_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486355/295ecb57-42cb-2eeb-560f-2ada63793d36.jpeg)

キーボードの分解方法はそれぞれですので、一般的には、裏面のゴム足の下にあるネジを緩めるなどして蓋を開けます。このキーボードの場合は、上面の周囲にカバーが付いているので、爪を折らないように取り外し、ネジを幾つか緩めると、この様にキーボードの接点にアクセスできるようになります。

![20231016_052302584_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486355/51944a5f-0aa3-e565-94b2-5d5d2a6b1719.jpeg)

このキーボードの場合は、コーヒーなどによる水没対策として、キーと基盤との間に透明フィルムが粘着テープらしきもので、がっちり貼り付けてありました。なかなか考えてあるなと思いましたが、結局、キーが使えなくなってしまうのでは、意味がないなぁとも感じました。

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486355/898c0f53-de99-50c6-1cb5-3bf987ae399f.gif)

このキーボードでは、キーとスイッチが分かれていなかった為、隙間から接点復活剤を流し込み、念入りに繰り返しキーを押すことで対処しました。

何れにしても、キーボードの接点に接点復活剤を流し込むことが重要です。一般的なキーボードの場合は、前述の通り、裏蓋を開けるだけで接点にアクセスできるはずですから、まずは、裏蓋を開けてみることです。

**以上**

<BR>
<BR>
<BR>
<BR>
Django基本１１～Modelを作成して簡単なテーブルを作ってみた。

今回からModelについてやっていきます。
modelの位置づけについては以下のリンクをご参照ください
https://www.sejuku.net/blog/27387#index_id0

以下をやっていきます。
１．開発準備
２．model作成
３．マイグレート

１．開発準備
   プロジェクト名＝norizo_project5
   APP名＝norizo_app5
   sttingu.pyのinstall一覧にnorizo_app5も追加しておく
２．norizo_app5/model.pyを修正する
　　　ここにテーブルの定義を書いていきます。
　　　こんな感じです。とりあえずTBLのnoriを作成し、名前と名字を保有した
　　　TBLのnoriを定義します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/93ee485a-b912-b994-5864-a2c52f741211.jpeg)
３．マイグレーションの実施
（１）modelの定義内容（変更内容）をファイル出力する。
　　「python manage.py makemigrations アプリ名 --name マイ麩レーションの名前」
左の赤くくくったところにファイルが出来ているのが分かります。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/93396d9c-0daa-dff9-b683-ac96f2843c93.jpeg)

（２）マイグレｰション、TBLの変更内容をDBへ反映させる
「python manage.py migrate」 
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/1b2b2737-d8cc-9184-e184-697b6f7a8e89.jpeg)
（３）マイグレーションの実施状況を表示する
「python manage.py showmigrations」
反映されてます。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/3c0ea519-d8d5-dc8f-7178-29c8528821e1.jpeg)
（４)データベースの中身を見てみましょう
　　![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/8a7c5f77-2ecd-6f35-e4a2-96f510be3360.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/b87ef9af-c3f4-ec2e-35fa-2c3ac816c100.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/2fb76f25-a51e-be45-5276-5fbe00552dda.jpeg)
追加されてました。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/4b6d6c26-1864-966c-f568-a5a005063cb5.jpeg)
（５）マイグレートを元に戻したい場合
もう一つTBLを追加します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/893d93eb-ceb2-76b6-b182-06742ceb11a0.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/e060c17a-0234-7268-927e-8e230664cb01.jpeg)

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/cfa8d735-4861-ee17-5e9f-ce4d3318dd69.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/63b38761-bc8a-5567-669c-101f44c0ebb1.jpeg)
ここでひとつ前の状態に戻します。
「python manage.py migrate ModelApp　更新ファイル名」
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/c39dd3ca-283c-8c9e-3870-59ca3a8a12b1.jpeg)![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/dab737dc-7936-0dc9-83f0-d36432ddddda.jpeg)
６．マイグレートをなかったことにします。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/3ace5622-da96-fb7e-b9c5-bf1fc7f97583.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/6b61e849-83f5-4d61-9d95-730a093ce8d8.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/c423f6a6-35ea-1826-28fd-7872fb6a5a73.jpeg)
DBが削除され、更新ファイルも削除されました。
iproファイルをiRIC v4に関連付けできるようになりました。

# はじめに

iRICのv4がリリースされ、PCにv3とv4どちらもインストールしているという方は多いと思います。

これまでiRIC v4はインストールしてもiproファイルは関連付けされておらず、iRICからファイルを開くしかありませんでした。
また、v3もインストールしている人はv3のiRICに関連付けされたままになっているので、v4のプロジェクトのiproファイルをクリックして開いたらiRIC v3が起動してこのプロジェクトは開けないと文句を言われたという経験はあるあるだと思います。

**そんな悩みをiRIC開発者へ相談してiRIC v4にiproファイルを関連付けできるようにしてもらいました！！**

# 設定方法

1. iRIC v4のメンテナンスツールを起動します。
    メンテナンスツールの起動方法は以下の記事を参考にしてください。

    [iRICのアップデートの方法、ソルバー等の追加・削除方法](https://qiita.com/starfieldKt/items/b62b767b66777ab876f9#iric-maintainance%E3%81%AE%E8%B5%B7%E5%8B%95)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/2845f3a7-99d2-fd79-fc9a-008bbeae9a44.png)


1. `コンポーネントの追加または削除`にチェックを入れて`次へ`をクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/11b66c8f-4eb2-9b81-300a-bbf559d5b29c.png)

1. コンポーネント一覧の`iRIC GUI`の項目の中の`*.ipro assotiation`にチェックを入れて`次へ`を押します。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/74e5739f-7615-bec9-1f25-42be37f6db34.png)

1. `更新`を押します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/53ee83e7-2d5d-8d1f-feac-83b24078763f.png)

1. 更新が完了したら`完了`を押してメンテナンスツールを終了します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/51b9f9b5-35fe-7f85-9f51-ee938dfb7000.png)


**iproファイルのアイコンがiRICのロゴになってクリックしたらiRIC v4が起動するようになりました!!!**

![anime2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/de928e84-c363-d304-305f-a3e8dfa19606.gif)
Interface Soup アンチパターンになっていた

# はじめに
現在Unityでブロックを持ったり置いたりしてギミックを解いていくゲームを作っています。
操作するキャラクターの処理に対してICharacterというインターフェイスを使っているのですが、そのインターフェースが見事にInterface Soup アンチパターンになっていたので、次からミスをしないようにここに記録しておきます。

作成にあたって「Adaptive Code C#実践開発手法 第２版」を参考にさせていただきました。

# 問題となっているコード
```cs
public interface ICharacter:
        IMoveExecutor, 
        IHoldActionExecutor, 
        IPassActionExecutor, 
{
}

// 実装クラス
public class Character : ICharacter
{
    // ...　省略
}

// ICharacterを使用するMonobehaviourのクラス
public class CharacterController : MonoBehaviour
{
    ICharacter _character;
    
    public void Construct(ICharacter character)
    {
        _character = character;
    }
}
```
このコードはSOLID原則のうちの一つである、「インターフェース分離の原則（Interface Segregation Principle）」に反しています。
Adaptive Codeでは以下のようにInterface Soup アンチパターンについて以下のように説明されています。
> 分割されたインターフェイスを何らかの理由で1つのインターフェイスに集約するのは、よくある間違いです。

> 実装時に全ての操作の実装を再び提供しなければならなくなるため、ターゲットを絞ったデコレーターを作成する余地はありません。

# 解決方法
ICharacterを受け取っているところ(CharacterControllerのConstruct())で、それぞれのインターフェースで受け取るように変更します。
このことによって、同一のインスタンスを複数回実引数として渡すことになりますが、これで良いとされています。Adaptive Codeではこのことがインターフェース分離の原則における一般的な副作用であると説明されています。
```cs
public class Character :
    IMoveExecutor,
    IHoldActionExecutor,
    IPassActionExecutor
{
    public void Move(Vector3 input)
    {
        // ...
    }

    public void Hold()
    {
        // ...
    }

    public void Pass()
    {
        // ...
    }
}
```
```cs
public class CharacterController : MonoBehaviour
{
    IMoveExecutor _move;
    IHoldActionExecutor _holdAction;
    IPassActionExecutor _passAction;

    // それぞれのインターフェースを受け取るようにする
    public void Construct(IMoveExecutor move, IHoldActionExecutor holdAction, IPassActionExecutor passAction)
    {
        _move = move;
        _holdAction = holdAction;
        _passAction = passAction;
    }
}
```
```cs
public class CharacterBuilder : MonoBehaviour
{
    [SerializeField] CharacterController characterPrefab;
    
    public void Create()
    {
        var characterController = Instantiate(characterPrefab, transform.position, Quaternion.identity);
        var character = new Character();
        characterController.Construct(character, character, character);  // 同一のインスタンスを複数渡すことになるが間違いではない

    }
}
```

# 参考記事
書籍「Adaptive Code C#実践開発手法 第２版」

https://www.amazon.co.jp/Adaptive-Code-%E5%AE%9F%E8%B7%B5%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95-%E7%AC%AC2%E7%89%88-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E9%96%A2%E9%80%A3%E6%9B%B8/dp/4822253546
Windowsのコマンドプロンプト（bat）で特定のプロセス（アプリ）停止

# やり方

```bat:『notepad.exe』という名前のプロセスを強制停止
C:\Windows\System32\cmd.exe /C taskkill /IM notepad.exe /f
```

## /IM

```/IM``` によって停止するプロセスを名前で指定できます。

プロセス名は ```taslilist``` の結果の『イメージ名』で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b2360e90-339e-b6df-a539-b7db0447aa77.png)

例えば下記のように同じ名前のプロセスが複数あった場合は、例外にならず、2つとも停止されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b91fe9ac-de5b-ade7-668e-f5b9db8eac29.png)


## /PID

プロセスIDで指定したい時は ```/PID``` 。

## /f

```/f``` は強制の意味。
タスクスケジューラー登録で実行されているアプリの場合 ```/f``` つけないと終了できない場合があります。

# 参考サイトさん

https://aprico-media.com/posts/6465

http://okayamadey.starfree.jp/wp/archives/taskkill.html

https://4thsight.xyz/9400

https://qiita.com/hadacchi/items/749bcdabe44d8c5c8532

https://qiita.com/hadacchi/items/749bcdabe44d8c5c8532

https://yogi.blog.ss-blog.jp/2014-03-27

# バージョン

Microsoft Windows [Version 10.0.19045.3570]
QuicksightでAD認証

## Amazon Quicksight をActiveDirectory連携で使用するとどんな感じになるか

QuicksightをActiveDirectory(AWS Managed MSAD)の認証で構成する機会がありました。
ActiveDirectoryの認証で使用する場合のQuicksisghtの動きにが、あまり情報がなかったので、自分で気になったところをメモとして残しておきます。
BIツールとして、というより、ツールを管理する時に気になる点が多いです。

### IAMユーザでログインしているブラウザでQuicksightのログインページ(quicksight.aws.amazon.com)に入ろうとすると、勝手にIAMユーザ側でログインしてしまう

別ブラウザかプライベートブラウジングで入る

### 一部管理メニューをクリックするとマネジメントコンソールのログイン画面に遷移してしまう

Manage assets
![Manageasset.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/ef79babb-2611-ed36-507e-a7a40e965678.jpeg)

Manage usersのmanage role groupボタン
![manage-role-group.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/77e3c55d-bffd-078b-9d1f-1295f462d4f1.jpeg)

Security & PermissionsのManageボタン
![security-permissions.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/ee9c2480-01ce-6a19-28db-51aaae9f30ab.jpeg)

Manage VPC Connections
![vpc-con.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/3d3ea70b-1376-0f5e-b0a8-8fabb6bcd228.jpeg)


IAMに飛んでしまうこの辺りの管理作業はADのユーザからはできない模様
どの作業でIAMユーザでのコンソールログインが必要になるかはきにしたほうがよさそう


サインイン画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/b7e4ad21-001c-4a29-9fb5-20a89e0d027c.png)


### ADユーザはQuicksightからどう見える？

ログインすると、Quicksightの「Manage Users」に出てくる
ログインして初めてQuicksightのユーザとしてカウントされる模様
![QS_ManageUsers.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/79913d4f-b5cd-ceb4-2ced-9446416271d2.jpeg)


表示されたのはAdmin権限とAuthor権限のユーザだけだった
またInactiveUsersにはいつ移動するのかはまだ不明(月毎課金だから、一月ログインしないと月跨ぎでInactiveに移動される？<-未確認)

### QuicksightからAD上のパスワードを変えたい

パスワード変更するインターフェースはない
唯一できるとしたらログイン画面の「パスワードを忘れた時」からパスワードのリセットでやる
パスワードのリセットはリセットするためのメールが飛ぶタイプなので、ADのユーザにメールアドレスを登録する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/45b3250d-881c-3b28-7ea6-8455c4918136.png)

### QuicksightからAD上のパスワードをパスワードリセットで変更する時

新しいパスワードを入力する画面がでるが、Quicksight組み込みユーザの場合のパスワードポリシーを要求されてしまう(ActiveDirectory側で設定したポリシーではない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/963625ae-300b-3bc8-3339-75e4779e2f20.png)

Quicksightのパスワードポリシー
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/signing-in.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245869/1df226d4-a149-9044-adca-38e8fef4d827.png)



## わかったこと
・Quicksightを運用する際には、Quicksight上のAdmin権限での運用管理と、IAM権限での運用管理を併用する必要があることを考えて運用を設計することが必要。
・Quicksightでは認証に使っているADのパスワード変更はできない。パスワードリセットの仕様はAD側ポリシーとうまく整合しないのでいまいち。
【GCP】インスタンスグループにインスタンステンプレートを設定しようとすると「テンプレートのネットワークはグループと同じにする必要があります」と言われる問題について

# 「テンプレートのネットワークはグループと同じにする必要があります」と言われたら

**原因：** 

下記はGCPの公式ドキュメントの引用です。重要なのはこちらの「**テンプレートで指定したリージョンに自動的に作成されたサブネットが選択されます**」という一文です。つまりインスタンステンプレートでvpcを設定した場合、インスタンスグループを作成時にそのテンプレートを指定しないと、同じネットワークにならないということです。

**解決方法：**

自分で作成したvpcを使用したいならば、インスタンステンプレートでvpcを設定しそのテンプレートを指定してインスタンスグループを作成する必要があります。おそらく、意識しないでインスタンスグループを作った場合vpcはdefault vpcを使用してるため作り直しになります。

>マネージド インスタンス グループを作成するときは、既存のインスタンス テンプレートを参照する必要があります。このインスタンス テンプレートで、メンバー インスタンスで使用する VPC ネットワークとサブネットを定義します。自動モード VPC ネットワークの場合、サブネットを省略できます。これによって、Google Cloud ではテンプレートで指定したリージョンに自動的に作成されたサブネットが選択されます。VPC ネットワークを省略すると、Google Cloud は default という名前の VPC ネットワークを使用しようとします。

https://cloud.google.com/compute/docs/instance-groups?hl=ja#network

私はこの仕組みを知らずに、インスタンスグループを作成し、しばらくしてvpcを設定した別なインスタンステンプレートに変更したくなったのだが、タイトルのエラーが発生。「インスタンスグループの作成時にネットワークの設定なんかしてねーよ、、、」と思いました。
ReactコンポーネントでWebAPIからデータを取得し画面に表示するまで[改]


## はじめに

昔こんな記事を書きました。

https://qiita.com/diskszk/items/e9f4664a3093d001f596

しかし、外部リソースからデータを fetch する目的であれば、必ずしも `useEffect` を使う必要はなく、むしろ別の方法のほうがいいとも言われています。

https://react.dev/learn/synchronizing-with-effects

ということなので、こちらの記事を参考にしつつ、`useEffect` を使ってデータフェッチしている処理から `useEffect` を取り除いていきます。

https://zenn.dev/kazuma1989/articles/a30ba6e29b5b4c

## useEffectを使用する場合

```tsx
type Todo = {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
};

const fetchPosts = async (): Promise<Post[]> => {
  const res = await fetch(
    "https://jsonplaceholder.typicode.com/posts/?_limit=10"
  );
  return res.json();
};

const PostList: React.FC = () => {
  const [posts, setPosts] = useState<Post[]>([]);

  useEffect(() => {
    (async function () {
      const data = await fetchPosts();

      setPosts(data);
    })();
  }, []);

  return (
    <div>
      <h2>todos</h2>
      <ul>
        {todos?.map((todo) => (
          <li key={todo.id}>
            <p>title: {todo.title}</p>
          </li>
        ))}
      </ul>
    </div>
  );
};
```

コンポーネントがレンダリングされる際に一度だけ `useEffect` 内の処理が実行され、WebAPI からデータをフェッチします。

## useEffectを使用しない場合

`useSyncExternalStore` を使用します。

```tsx
import { useCallback, useRef, useSyncExternalStore } from "react";
import axios from "axios";

type Todo = {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
};

export const Todos: React.FC = () => {
  const data$ = useRef<Todo[]>();

  const subscribe = useCallback((onStoreChange: () => void): (() => void) => {
    const controller = new AbortController();

    axios
      .get<Todo[]>("/https://jsonplaceholder.typicode.com/posts/?_limit=10", { signal: controller.signal })
      .then((res) => res.data)
      .then((data) => {
        data$.current = data;

        onStoreChange();
      });

    return () => controller.abort();
  }, []);

  const todos = useSyncExternalStore(subscribe, () => data$.current);

  return (
    <div>
      <h2>todos</h2>
      <ul>
        {todos?.map((todo) => (
          <li key={todo.id}>
            <p>title: {todo.title}</p>
          </li>
        ))}
      </ul>
    </div>
  );
};
```
script タグ `<script>` 内で 'use strict' の動作メモ

script タグ `<script>` もファイルの先頭で書くのと同様、頭に書けば適用される。

```
<script>
  'use strict'
  ...
</script>
```

また、外側の script タグには影響しない。
以下のコードを実行するとエラーが出て、簡単に挙動を確認できます。

```
<script>
  'use strict'
  foo = 'Set variable test'
</script>
<script>
  bar = 'Set variable test'
</script>
```

後者の `bar` の定義は怒られないが `'use strict'` を書いた script タグ内の `foo` は怒られる。
記事を検索したけど見つけられなかったので、ササっと挙動調査したログ残し程度に。
plunkerでopenjscad その12

# 概要
plunkerでopenjscadやってみる。
練習問題やってみた。

# 練習問題
MQOをパースして、描画せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ff359c70-17a2-2731-c375-dfd5b515937b.png)


# サンプルコード


```
function main() {
	var mqo = 
"Metasequoia Document\n" +
"Format Text Ver 1.0\n" +
"\n" +
"Scene {\n" +
"  pos 0.0000 0.0000 1500.0000\n" +
"  lookat 0.0000 0.0000 0.0000\n" +
"  head 3.7864\n" +
"  pich 0.2392\n" +
"  ortho 0\n" +
"  zoom2 5.0000\n" +
"  amb 0.250 0.250 0.250\n" +
"}\n" +
"Material 2 {\n" +
'  "mat1" col(1.000 0.000 0.000 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00)\n' +
'  "mat2" col(1.000 0.647 0.000 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00)\n' +
"}\n" +
'Object "obj1" {\n' +
"  visible 15\n" +
"  locking 0\n" +
"  shading 0\n" +
"  facet 59.5\n" +
"  color 0.898 0.498 0.698\n" +
"  color_type 0\n" +
"  vertex 8 {\n" +
"    -100.0000 100.0000 100.0000\n" +
"    -100.0000 -100.0000 100.0000\n" +
"     100.0000 100.0000 100.0000\n" +
"     100.0000 -100.0000 100.0000\n" +
"     100.0000 100.0000 -100.0000\n" +
"     100.0000 -100.0000 -100.0000\n" +
"    -100.0000 100.0000 -100.0000\n" +
"    -100.0000 -100.0000 -100.0000\n" +
"  }\n" +
"  face 6 {\n" +
"    4 V(0 2 3 1) M(0) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000)\n" +
"    4 V(2 4 5 3) M(1) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000)\n" +
"    4 V(4 6 7 5) M(0) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000)\n" +
"    4 V(6 0 1 7) M(0) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000)\n" +
"    4 V(6 4 2 0) M(0) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000)\n" +
"    4 V(1 3 5 7) M(0) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000)\n" +
"  }\n" +
"}\n" +
"Eof";
	var points = [];
	var faces = [];
  var textArray = mqo.split(/\r\n|\r|\n/);
	for (var i = 0; i < textArray.length; i++)
	{
		var line = textArray[i];
		if (line.indexOf('    4') === 0)
		{
			line = line.replace('    4 V(', '');
			var tmp = line.replace(')', '');
			var p = tmp.split(' '); 
			faces.push([p[0], p[1], p[2]]);
			faces.push([p[0], p[2], p[3]]);
		}
		else if (line.indexOf('    ') === 0)
		{
			line = line.trim();
			var tmp = line.split(' ');
			points.push([tmp[0], tmp[1], tmp[2]]);
		}
	}
	return CSG.polyhedron({
		points: points,
		faces: faces
	});
}

```

# 成果物

https://embed.plnkr.co/plunk/JB88pGHC22yYGsx7


以上。
CODESYS サンプルプロジェクト

# はじめに

CODESYS Examplesには、様々なサンプルプログラムが用意されていて
とても参考になるのでおすすめです。




サンプルプロジェクトは以下のページよりダウンロードできます。

https://forge.codesys.com/prj/codesys-example/home/Home/

# サンプルプロジェクトの開き方

サンプルプロジェクトをダウンロードして起動します。
問題なければ動作すると思いますが、エラーが表示される等、上手くいかない場合は以下の手順を参考にしてください。

## 手順
1. IDE のバージョンが新しいことを確認する
2. プロジェクトで使用されているすべてのアドオンを入手する
3. ご使用のPLCに変更してください
4. デバイスの説明を更新または取得する
5. プロジェクト環境を更新する
6. 不足しているライブラリを入手する
7. コンパイルしてダウンロードする
8. 未解決のエラーを修正する

## 1. IDEのバージョンが新しいことを確認する

`ヘルプ`→`バージョン情報`より確認できます。
V3.5 SP14などのバージョンがサンプルプロジェクトより新しいことを確認してください。

![Lib05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/d38492e7-c49b-c642-65a3-59115aec6bd0.png)


## 2. プロジェクトで使用されているすべてのアドオンを入手する

プロジェクトを開いたときに不足しているアドオンをインストールするように求められます。(SP17以降)
また、サードパーティのアドオンは他の場所から入手して個別にインストールする必要があります。

## 3. ご使用のPLCに変更してください

ご使用のPLCの型式に問題がないか確認して、必要に応じて変更してください。

## 4. デバイスの説明を更新または取得する

一部のデバイスには更新パスが含まれているようです。
`Device`上で右クリックして`デバイスの更新`を行ってください。

![Lib06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/f09ecd1f-af1f-5914-c124-3234bb665969.png)

## 5. プロジェクト環境を更新する

`プロジェクト`タブより`プロジェクト環境`を選択します。
全ての項目についておすすめの設定になっているかどうか確認してください。

![Lib07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e1c4688e-d911-9395-622c-ee91244c0699.png)


## 6. 不足しているライブラリを入手する

`ライブラリマネージャー`を開いて、`不足しているライブラリをダウンロード`を押します。

![Lib04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/17f7c300-c546-0dbf-d8d7-1b1cc1c9a4aa.png)

## 7. コンパイルしてダウンロードする

`ビルド`と`オンライン`→`ログイン`

問題なければ起動すると思います。

## 8. 未解決のエラーを修正する

エラーが発生していれば内容を確認してください。エラー項目をダブルクリックすると該当箇所に遷移します。（移動しないエラーもあります）

エラーコードがわかればオンラインヘルプより詳細を確認します。

# 参考ページ

https://faq.codesys.com/display/CDSFAQ/How+to+open+an+Example+Project
WebRTCとHLSを組み合わせてゲーム実況アプリの開発

Tencent CloudのTRTCとCSSを組み合わせてゲーム実況アプリの開発を考えてみます。

## TRTCとは
TRTC（Tencent Real-Time Communication）は、高品質な音声・動画通話や低遅延のライブ配信を実現するクラウドサービスです。小規模なビジネスから大規模なエンターテインメントまで、幅広い用途に利用されています。

### TRTCの特徴
TRTCの特徴は、以下のとおりです。
* 高品質な音声・動画通話：遅延が少なく、音声・動画の品質が高い
* 低遅延のライブ配信：リアルタイムで双方向のコミュニケーションが可能
* 豊富な機能：音声エフェクト、画面共有、ビデオフィルターなど
* 多彩なプラットフォーム：Web、Android、iOS、macOS、Windowsなどに対応

### TRTCの用途
TRTCは、以下の用途に利用されています。
* 音声通話：オンライン会議、ビデオ通話、ゲーム通話など
* 動画通話：オンラインレッスン、ライブ配信、セミナーなど
* 互動型ライブ配信：ゲーム配信、音楽配信、教育配信など

## CSSとは
TencentCloudのCSS(Cloud Streaming Services)は、ライブストリーミング、オンデマンドストリーミング、ビデオ会議などのマルチメディア配信サービスを提供するクラウドサービスです。

### Cloud Streaming Servicesの特徴
Cloud Streaming Servicesの特徴は、以下のとおりです。
* 高品質な配信
* スケーラブルな配信
* グローバル配信


## Cloud Streaming Servicesの利用シーン

Cloud Streaming Servicesは、以下のシーンで利用できます。

* エンタメライブ配信：eスポーツ、コンサートなど
* セミナー:オンラインレッスン、講演会など
* EC:ライブコマースなど

## ゲーム実況に必要な要素
ゲーム実況に必要な要素としては以下になります。これらは必要最低限であり、実際には視聴者からのチャットなども重要な要素として考えられます。

* カメラ・マイクキャプチャ
* 画面キャプチャ（BGM込み）
* 配信
* 視聴

## アーキテクチャ
![fa00298505bb8284bb5224b65cff4c6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/d33ac212-197a-a207-6aa9-a7df4d0d8eb8.png)

[公式ドキュメントより抜粋](https://www.tencentcloud.com/jp/document/product/647/47858)
こちらはTRTCとCDNを連携した際のアーキテクチャになります。LiveCDNの部分はTencent CloudのCSSやAWSのIVS等が該当します。
一般的なゲーム実況は1名での配信ですが、低遅延でのTRTCを活用すればゲーム実況のコラボ配信も可能です。
会話が必要な登場人物はTRTCで配信に参加し、視聴だけ必要なユーザーは安価で大規模に対応可能なHLSでの視聴という構成になります。


## おまけ
Tencent CloudのCAR(クラウドレンダリング)で実行中のアプリケーションをCSSで配信する事も可能です。
クラウドレンダリングとは、3DCG等のレンダリングをクラウド上で行う技術です。
こちらの記事を参照ください。
[クラウドレンダリングを試してみた](https://qiita.com/v-cube/items/06b586248f8d24bb1782)

![20fb1ed6422811eeb917525400b31cf9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/6bd3339b-1619-38f5-64bb-2888d2fd38c8.png)
[公式ドキュメントより抜粋](https://www.tencentcloud.com/document/product/1158/56131)

このクラウドレンダリングとCSSを組み合わせる事で、廉価版のスマホブラウザからゲームのライブ配信を行う事ができます。
（この場合は、ゲームアプリも自社で開発する必要があります）

## 最後に
[**Tencent Cloudに関するお問い合わせはこちらから**](https://jp.vcube.com/form-inquiry-md06-tencent.html)
【ChatGPTBOT】LINEの公式アカウントの、アカウント認証を通過させたいのですが非承認となる原因がわかりません。

お世話になっております。
現在、下記のLINEの公式アカウントの、アカウント認証を通過させたいと思っております。
何度か申請したものの、認証通過せず、調べてみても、原因がわかりません。
下記の設定以外で、こうすれば審査が通るのではないか？等、もしわかる方おりましたら、お教え頂けませんでしょうか。
何卒よろしくお願いいたします。

https://line.me/R/ti/p/@833eijpc?oat_content=url
→内容としましては、嫁姑問題に関する悩みを受け付ける、ChatGPTBOTとなります。
→HP：https://yomeshuutome.com/
→特定商取引法に基づく表記：https://yomeshuutome.com/page-89/
→嫁姑問題相談のプロAI 利用規約とポリシー：https://yomeshuutome.com/page-87/


【対応した内容について】
・店舗／施設情報 アカウントの作成する対象の店舗名、企業名、サービス名などを50文字以内で入力。 
・住所は、全角（英数字は半角）で入力（個人のため、住所を記載）
・URLでは、BOTの情報が確認できるサイトを入力。
・申込者情報申込者氏名：名前をフルネーム入力済。
・最初に選択した業種と「アカウントの認証」の申請時の「事業者情報」に相違なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577945/43bd122a-7d59-ce47-9d02-014925c06c81.png)
![スクリーンショット 2023-10-16 145012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577945/7dac637b-2b4d-e557-5562-b213bd12a666.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577945/54b1ee99-3274-94fc-4af6-fe6bc56c0bd5.png)
エアレス包装市場： 医薬品分野での利用拡大を背景に2023年から2033年にかけて成長するとの分析

リサーチ・ネスターは次のタイトルのレポートを発表した「エアレス包装市場 世界の需要分析と機会展望2033年"この調査レポートは、世界のエアレスパッケージング市場を、包装、材料、ディスペンサーシステム、用途別、地域別に細分化した詳細な概要を掲載しています。
さらに詳細な分析として、市場の成長に関連する現在および将来の市場動向の詳細な考察とともに、業界の成長指標、阻害要因、需給リスクを網羅している。
世界のエアレスパッケージング市場は、予測期間、すなわち2023年～2033年に大幅な収益を達成することで、年平均成長率～5％で成長すると予測されている。医薬品を包装するための大きな需要が、予測期間中の市場成長を促進すると予測されている。例えば、2021年に医薬品セグメントは約1.5兆米ドルの支出を受けた。さらに、食品＆飲料業界におけるエアレスパッケージングの利用の高まりは、予測期間中の市場成長をさらに促進すると推定されている。世界の食品セグメントは、2022年に約2,750億米ドルの総収入を生み出すと予測されている。
![Airless-Packaging-Market-Demand.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491677/e4ddc376-76a1-e1a8-d8ec-c3d283e9e11c.jpeg)

詳細レポートへのアクセスはこちら：
https://www.researchnester.jp/reports/airless-packaging-market/1442

さらに、パッケージング別に、世界のエアレスパッケージング市場はボトル、チューブ、ジャー、バッグ＆パウチ、その他に区分される。これらのサブセグメントのうち、ボトルセグメントは予測期間中に市場で最大のシェアを獲得すると推定されている。このセグメントの成長は、通常のプラスチックボトルを使用することで病気にかかる可能性が高くなることに起因している。2020年現在、世界中で約7億本の密閉ボトルが生産されている。
さらに、世界のエアレス包装市場は、地域別に北米、欧州、アジア太平洋、中南米、中東・アフリカ地域に二分される。これらの地域のうち、北米地域の市場は、ヘア＆スキンケア業界の需要増加を背景に、予測期間中に急成長すると推定されている。2020年には、ヘア＆スキンケア産業は約3,000億米ドルに達すると見られている。
この調査はグローバルな性質を持ち、以下の市場の詳細な分析をカバーしているNorth America (U.S., Canada), Europe (U.K., Germany, France, Italy, Spain, Hungary, Belgium, Netherlands & Luxembourg, NORDIC [Finland, Sweden, Norway, Denmark], Poland, Turkey, Russia, Rest of Europe), Latin America (Brazil, Mexico, Argentina, Rest of Latin America), Asia-Pacific (China, India, Japan, South Korea, Indonesia, Singapore, Malaysia, Australia, New Zealand, Rest of Asia-Pacific), Middle East and Africa (Israel, GCC [Saudi Arabia, UAE, Bahrain, Kuwait, Qatar, Oman], North Africa, South Africa, Rest of the Middle East and Africa). さらに、市場規模、前年比成長率・機会分析、市場プレイヤーの競争力調査、投資機会、将来の展望に対する需要などを含む分析も、調査報告書の中で取り上げられ、表示されている。
化粧品販売の増加が市場成長を促進する
米国における化粧品の総売上高は、毎年約500億米ドルに達すると推定されている。
多くの国民が日常的に特定の化粧品を使用しているため、適切な効果が長持ちする製品への需要が高まっている。このような状況下で、化粧品メーカーは製品のエアレス包装の利用にさらされている。したがって、このような要因が予測期間中の市場の成長を促進すると予想される。
しかし、市場における代替品の存在とCOVID-19によるサプライチェーンの混乱は、予測期間中、世界のエアレス包装市場の成長の主な阻害要因として作用すると予想される。
本レポートはまた、以下の企業プロフィールを含む、世界のエアレス包装市場における主要企業の既存の競争シナリオを提供しますCospack America Corp., AptarGroup, Inc., Pharma Packaging Solutions, Albéa Services S.A.S., Eastman Chemical Company, Silgan Dispensing Systems, Webpac Ltd, Lumson S.p.A., WestRock Company, and HCP Packaging UK Ltd. プロファイリングでは、事業概要、製品およびサービス、主要財務、最近のニュースおよび開発など、企業の主要な情報を包含しています。全体として、本レポートは世界のエアレスパッケージング市場の詳細な概観を描いており、業界コンサルタント、装置メーカー、拡大機会を探している既存プレイヤー、可能性を探している新規プレイヤー、その他の利害関係者が現在進行中および今後予想される動向に従って市場中心戦略を調整するのに役立ちます。
レポートサンプル@を請求する
https://www.researchnester.jp/sample-request-1442

について Research Nester
Research Nesterは戦略的市場調査とコンサルティングのリーディング・サービス・プロバイダーです。業界、コングロマリット、エグゼクティブが将来のマーケティング戦略、事業拡大、投資などのために賢明な決断を下せるよう、偏りのない比類のない市場洞察と業界分析を提供することを目指しています。私たちは、戦略的思考を通じて適切なタイミングで適切なガイダンスを得ることができれば、あらゆるビジネスが新たな地平へと拡大できると信じています。私たちの既成概念にとらわれない思考は、クライアントが将来の不確実性を回避するために賢明な決断を下すのに役立ちます。
【お問い合わせ先】
ナオミ コスギ
Eメール: info@researchnester.jp
米国の電話番号: +81 505 050 8480
ChatGPT Plus「Code Interpreter（コード・インタープリター）」メモ

## Code Interpreter（コード・インタープリター）について
### リリース時期
* 7月初め（アカウントにより利用開始時期は異なる模様）
### 概要
* データの分析、グラフの作成、数学の問題の解答、ファイルの編集などを行うことができる。
* 今までのChatGPTでは不可能だったファイルのアップロードやダウンロードにも対応している。
* サンドボックス化されたファイアウォールで保護された実行環境で動作する Python インタープリターと一時的なディスク領域をモデルに提供し、会話からコードを自動生成して実行し、結果を利用する。

### 所感
* Open AIのサイトでは「Code Interpreter」は「alpha」提供となっている。
* ChatGPTのPlugin Storeに「Code Interpreter」は存在しない。
* オプションの「Advanced Data Analysis」を有効にすることで「Code Interpreter」で紹介された機能が利用できた。
  * Open AIのサイトにある例に記載されていた問いかけを実際に試したが、計算結果が例に記載されている値と異なった。

### 参考
* Open AI
  * https://openai.com/blog/chatgpt-plugins#code-interpreter

* ChatGPT活用を激震させる新機能｢Code Interpreter｣にNetflixをデータ解析させたらスゴかった
  * https://www.businessinsider.jp/post-273289

* ChatGPTのCode Interpreterはどこまでできるのか
  * https://zenn.dev/yuhei_fujita/articles/try-chat-gpt-code-interpreter

* OpenAIのCode Interpreterを使ってみたら、すごいアクセス解析ツールが作れそうだった！
  * https://qazero.com/blog/code-interpreter-impact-new-analytics-tool/
IBM watsonx AssistantをAPIで呼び出してみた

# はじめに
下記ドキュメントを参考に curl コマンドを使って動作確認した。
[watsonx Assistant v2 | IBM Cloud API Docs](https://cloud.ibm.com/apidocs/assistant-v2#deletesession)

# 環境
## 前提
Macで試した。WindowsもLinuxもそんなに変わらないと思う。jqのインストール方法くらい。
IBM Cloud上でIBM watsonx Assistantのリソース（インスタンス？）は準備済みを想定。

## jq
jq を入れておく

```bash
brew install jq
```

## API 取得
IBM Cloudのリソース・リストから確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/6aaae880-edb6-e3c7-b235-03be670b94bd.png)

## 環境変数
`.zshrc`にセット

```zsh:.zshrc
# assistant
export WA_API_KEY="xxx"
export WA_URL="https://yyy"
```

必要に応じて`source .zshrc`

# 実行
## watsonx Assistant
こんな感じでとりあえず設定。
（「[みいつけた! - NHK](https://www.nhk.jp/p/miitsuketa/ts/P81683LLKY/)」のコッシーを想定して、こんにちはと言うと「おいーっす」と返してくれるチャットボット（）

![Actions-IBM-watsonx-Assistant (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/8d5dddf8-da57-e05c-618b-adcfd2efa509.png)
![Actions-IBM-watsonx-Assistant (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/b7c2b6c6-3657-9802-f6c9-c21b61c1b132.png)
![Actions-IBM-watsonx-Assistant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/e9bb42da-4021-d91c-8e3a-cfa1225d9f9e.png)

プレビュー画面で見るとこんな感じ。メッセージを送って返事を受け取る部分をAPIから呼び出したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/7636f35a-dd41-102b-de42-d1bdf43fe66a.png)


## コード
必要最小限（たぶん）で書いてみた。

```bash:test.sh
#!/bin/bash

# 環境変数
apikey=$WA_API_KEY
url=$WA_URL

# environment_idを取得
assistant=$(curl -X GET -u "apikey:${apikey}" "${url}/v2/assistants?version=2021-11-27")
environment_id=$(echo $assistant | jq -r '.assistants[0].assistant_environments[0].environment_id')
echo $environment_id

# session_idを取得
res_sessions=$(curl -X POST -u "apikey:${apikey}" "${url}/v2/assistants/${environment_id}/sessions?version=2021-11-27")
session_id=$(echo $res_sessions | jq -r '.session_id')
echo $session_id

# メッセージ送信
input_text="こんにちは"
message=$(curl -X POST -u "apikey:${apikey}" --header "Content-Type:application/json" --data "{\"input\": {\"text\": \"${input_text}\"}}" "${url}/v2/assistants/${environment_id}/sessions/${session_id}/message?version=2021-11-27")
text=$(echo $message | jq -r '.output.generic[0].text')
echo $text

# セッション削除
curl -X DELETE -u "apikey:${apikey}" "${url}/v2/assistants/${environment_id}/sessions/${session_id}?version=2021-11-27"
```

## 権限
スクリプトの権限を変更

```bash
chmod 755 test.sh
```

## 実行

```bash
./test.sh
```

# おわりに
色々やるには、Python の方が色々やりやすいと思うので、そのうちそっちも試したい。
GoogleカレンダーのマイカレンダーすべてのチェックBOXをON/OFFするブックマークレット

以下のJSをブックマークに登録。

```js
javascript:(function(){document.querySelectorAll('[aria-label=マイカレンダー] input[type=checkbox]').forEach(chk => {chk.click();});})();
```

### 解説

「マイカレンダー」のDIV配下のチェックボックス全てに対して `querySelectorAll('[aria-label=マイカレンダー] input[type=checkbox]')`
click()メソッドを実行する。

checkboxのトグルは、`checkbox.checked = !checkbox.checked;` でも可能だが、単にチェックbox要素のchecked属性を変えるだけじゃなくて、クリックイベントを発生させないとカレンダーのONOFFは変わりませんでした。

### 注意点

`querySelectorAll('[aria-label=マイカレンダー] input[type=checkbox]')` で帰ってくるNodeListは画面上に描画されているものだけなので、あまりにたくさんのマイカレンダーが登録されていてスロール外のカレンダーがあってもクリックできない。
スクールを卒業して実務に入って思ったこと

### 概要
本記事では、私がプログラミングスクールを卒業後、実務経験を通じて実感している点を3つシェアします。
実務に入ってみて思うことは人それぞれだと思いますが、あくまで個人の感想として読んでいただけると嬉しいです。

因みに、筆者が通っていたプログラミングスクールはこちらです。もしご興味があれば、損はしないのでLPを覗いてみるだけでもしてみてください。

https://happiness-chain.com/

### フルリモート環境での自走力の必要性

現在、フルリモートで開発業務に従事しています。こういった作業環境では、環境構築・設計・エラー対応などなど、他方面で自ら問題を解決しなければならない状況が頻繁に生じます。（あまり悩みすぎても時間が勿体無いので、必要に応じて周囲のメンバーに質問することはもちろんあります！）
しかし、限られたリソースの中では手取り足取り教えてもらう機会は少ないので、ある程度自力で原因調査〜対応まで漕ぎ着く状況にならざるを得ないです。最初は1人で解決していく自信がなかったですが、そういった場面に何度も遭遇するうちになんとなく当たりを付けられるようになってきたと思えるようになりました。

また、筆者が通っていたスクールでの課題は難易度が高く、メンターからのLGTMが必要でした。しかも課題内容は、メンターが実務で経験したタスクで難しかった実装が散りばめられています。。。そのため、課題をクリアするために数週間かけてエラーの解決策を探ることもありました。メンタル的にキツい時ももちろんありましたが、そのお陰で結果的に**自走力**を付けることができ、現在の実務環境で非常に助けになっているなと感じます。

### DB設計・バックエンドの重要性

新機能を開発する際、フロントエンドよりもまずDBの設計、エンドポイント、スキーマの定義を行い、バックエンドの実装やAPIテストを優先することで、全体の開発がスムーズに進むなと感じています。
筆者の開発現場では、いち機能実装をする場合、自分1人で0→1で進めていくことがほとんどです。先にフロントエンドでコンポーネントだけ実装もします。しかし、結局バックエンドAPIと値をどのように受け渡ししたいかが肝なので、先にエンドポイントをある程度作り込めばフロントエンドとの繋ぎ込みがやりやすいなと思いました。

あくまで筆者の肌感なので、根拠は正直ありません。が、どんなデータをどのような形で受け取り、DBに格納したり、取得したいのか？をベースに考えることで自ずとやるべきことが見えてくるなと感じます。


### 公式ドキュメントの英語読解

メジャーでないライブラリやツールを使用する場面では、英語の公式ドキュメントの読解力も重要だなと思います。
シンプルに、日本語よりも英語で情報検索すれば多くの情報を得られます。
また、DeepLやGoogle翻訳も便利ですが日本語訳の文章に違和感を感じるので、原文を直接読むことでより正確な情報を得られると個人的に思いました。

### おわりに

実務経験を通じて感じたことは多々ありますが、自走力の重要性を特に実感しています。
自走力をつけても尚、実務経験最初の3ヶ月くらいとにかく必死で開発していた記憶があります。（今も勿論必死で開発しています！w）

独学でWebエンジニアを目指すのも一つの手段だと思いますが、効率的に学ぶためにはスクールのサポートが非常に役立つと感じています。実際筆者も半年ほど独学でRailsやDockerを学んでいましたが、正直当時学んだことはあまり覚えていないし、今役立っている感覚はないです。

私が通っていた[Happiness Chain](https://happiness-chain.com/)では、そもそも分からない時の調べ方や環境構築などなど、開発業務でコードを書く以前に必須だけどあまり教えてもらえない基礎中の基礎から学ぶことができました。なので、いざ実務初日！となった時に、環境構築で躓かずスタート地点に立つことができ、現在に至ります。
スクールで得られたものは大きい財産だなと日々感じながら、今日も開発を進めようと思います。
Istioのインストール　~Sock Shop編~

# はじめに
Sock Shopのサービス間の応答時間を取得するためにIstioをインストールしました．
↓前回↓

https://qiita.com/hikida621/items/dcf75e54335a69f3430a

## Istioのインストール

公式を参考にインストールしていきました．
https://istio.io/latest/docs/setup/getting-started/

最新のIstioをダウンロード
~~~
curl -L https://istio.io/downloadIstio | sh -
~~~
~~~
cd istio-x.xx.x
~~~
~~~
export PATH=$PWD/bin:$PATH
~~~
Istioをインストール
ここでistioctlが使えない場合はパスの指定が上手くいっていない可能性があります．
~~~
istioctl install --set profile=demo -y
~~~
~~~
kubectl label namespace default istio-injection=enabled
~~~
~~~
touch ~/.kuberc
~~~
~~~
echo source ~/.kuberc >> ~/.bashrc
~~~
## イングレスとポートの設定
~~~
echo export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') >>~/.kuberc
~~~
~~~
echo export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') >>~/.kuberc
~~~
~~~
echo export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}') >>~/.kuberc
~~~
~~~
echo export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT >>~/.kuberc
~~~
~~~
source ~/.bashrc
~~~

以上でIstioの設定は完了です．

## アドオンのapply
Istioのアドオンはprometheusから値を取得しているようなのでprometheusのapplyを忘れずに

~~~
kubectl apply -f samples/addons/prometheus.yaml
kubectl apply -f samples/addons/jaeger.yaml
~~~

## Sock Shopのインストール
続いてSock Shopをインストールしていきます．
Sock Shopにlabel付するために`complete-demo.yaml`に追記をします． 
~~~complete-demo.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: sock-shop
  labels:
    istio-injection: enabled
~~~
apply
~~~
kubectl apply -f microservices-demo/deploy/kubernetes/complete-demo.yaml
~~~

以上で導入ができました．
Hexabase TypeScript SDKを使ってコメントのリアルタイム通知を受け取る

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

この記事ではHexabase TypeScript SDKのインストールと、コメントの通知を受け取る方法を紹介します。

## インストール

インストールはnpmやyarnを使って行います。

```jsx
# npmの場合
npm install @hexabase/hexabase-js

# yarnの場合
yarn add @hexabase/hexabase-js
```

## インポート

インポートすると、 `HexabaseClient` というオブジェクトが取得できます。

```jsx
import { HexabaseClient } from "@hexabase/hexabase-js";
```

## 初期化

HexabaseClientを初期化します。

```jsx
const client = new HexabaseClient();
```

## 認証

Hexabaseでは業務利用を想定しているため、利用する際に認証情報が必須になります。最初はメールアドレスとパスワードで認証し、その後はトークンを使ってGraphQLにアクセスします。 `client` を使って処理します。

初回の認証は次のようになります。emailとパスワード、またはトークンが必須です。

```jsx
await client.login({email, password, token});
```

後はこの `client` に対して処理を行います。

## 通知の種類

Hexabaseで提供されている通知は、現時点ではデータストアのアイテム（RDBMSでいう行相当）に対するコメントの通知のみです。また、コメントは新規作成のみ対応しています。

[PostItemComment \| Hexabase API ガイド](https://apidoc.hexabase.com/docs/v0/item-histories/PostItemComment)

## 通知の受け取り方

データは保存されている前提です。

```ts
const project = await client.currentWorkspace!.project(projectId);
const datastore = await project.datastore(datastoreId);
const item = await datastore.item();
item.set('name', '名前');
const bol = await item.save();
```

この保存したデータに対するコメント追加を購読します。 `data` は ItemSubscription という型になります。

```ts
item.subscribe('update', data => {
	console.log(data);
});
```

ItemSubscriptionには `comment` でコメントの内容や、 `user` でコメントしたユーザーの情報が取得できます。

## 通知の止め方

通知を止めるには、 `unsubscribe` を呼び出します。

```ts
item.unsubscribe();
```

## まとめ

通知を使えば、擬似的にチャットのような機能が実現できます。アイテムに紐付くので、各アイテムがルームのような役割を果たします。

SlackやTeamsのように、チャット機能はさまざまなアプリケーションで求められます。Hexabaseを使えば、簡単に実装できますので、ぜひ試してください。

[Hexabase | 新規事業向け開発・競争領域でのDX実現をサポート](https://hexabase.com/)
定時帰る術-Linuxパーミッション(chmod、umask)

# パーミッション管理-chmod

### 確認
```
ls -l
-rw-r--r-- 1 root root 38 10月 14 09:44 test.txt
```
もしくは
```
stat test.txt
  File: test.txt
  Size: 38              Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 33583486    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-10-14 09:46:16.000000000 +0900
Modify: 2023-10-14 09:44:59.000000000 +0900
Change: 2023-10-14 11:13:50.341510281 +0900
 Birth: -
```
-rw-r--r--が0644と同じことを指していますが、具体的な考え方が↓となる

rwxの値が↓となり、一つ目の[-]がファイルの種類を表示されているので、パーミッションには関係ないため、ここでは無視


読み取り：r：4
書き込み：w：2
実行：x：1

---が二進法であり、001が1、010が2、100が4なので、xが1、wが2、rが4となります。



一つ目の「-」を除いて、「-」が3つごとで「所有者」、「所有グループ」、「その他ユーザ」の考え方です。

上記「-rw-r--r--」の場合：
「rw-」：「r+w」=「4+2」= 6
「r--」：「r」=「4」= 4
「r--」：「r」=「4」= 4
なので、「-rw-r--r--」が644となります。




### 変更(chmod)

chmodでの変更が数字とアルファベット2つ方法があります。



数字
「-rw-r--r--」に実行権限(x)を付けたい場合
```chmod 755 test.txt```


「-rw-r--r--」からその他ユーザの読み取り権限を削除したい場合

```chmod 640 test.txt```



アルファベット

「対象」「操作」「パーミッション」


対象：
u：所有者
g：所有グループ
o：その他
a：上記のすべて


操作：

+：付ける
-：削除
=：にする

「-rw-r--r--」に実行権限(x)を付けたい場合

``` chmod a+x test.txt```

「-rw-r--r--」からその他の読み取り権限を削除したい場合

```chmod o-r test.txt```

[,]を付けって、複数条件が書けます。

例：
「-rw-r--r--」に所有者に実行権限をつけて、所有グループの権限をrwにし、その他の読み取り権限を削除する。
```chmod u+x,g=rw,o-r test.txt```


また、-Rを付けることで、再帰的に変更することもできます。

「/var/tmp」配下の全ファイル、ディレクトリに対して、その他のアクセス権限を削除する。
```chmod -R o= /var/tmp```










## umask

新しいファイル、ディレクトリを作る時のパーミッションはどうするのがumaskで管理する。
（ファイルの実行権限はumaskeでつけられない）

umask -Sで確認できる。
例：
```
umask -S
u=rwx,g=rx,o=rx
```

デフォルトの設定ファイル場所： /etc/profile
下記の処理で各ユーザのumaskを設定している。
```
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi
```
ユーザIDが199より大きく、/usr/bin/id -gn（所有グループ）と/usr/bin/id -un（ユーザ名）が同じの場合、はumaskを002にする。
上記以外の場合、umaskを022にする。
（useraddの場合は、ユーザIDが1000となる）


umaskが002場合：
ファイル：777-002=775、775-111=664（-rw-rw-r--）
ディレクトリ：777-002=775（drwxrwxr-x）

022場合：
ファイル：777-022=755、755-111=644（-rw-r--r--）
ディレクトリ：777-022=755（drwxr-xr-x）


umask自体がumaskコマンドで変更できますが、ログアウトやOS再起動とかで設定が消えてしまうため、ユーザのホームディレクトリ配下の「.bash_profile」ファイルに追記した方がいいでしょう。
モンティ・ホール問題を愚直にやらない

# 趣旨
こちらの記事を拝見したときに、自分だったらどうするかなと思い、
要件を詰めたら、思ったより簡単な判断式になったので、共有。
https://qiita.com/bkh4149/items/93adeaa46c77efb8ae73
（参考ありがとうございました！）

# コード
```python
from random import randint

def do(user_change: bool):
    correct = randint(0, 2)
    user = randint(0, 2)

    # 変えない場合、そのまま
    if user_change == False:
        return correct == user

    # 変える場合
    # 最初が当たっている場合、→必ず外れる
    # 最初が外れている場合、→必ずあたる
    return correct != user

from tqdm import tqdm

result_1 = [do(False) for x in tqdm(range(0, 1000000))]
result_2 = [do(True) for x in tqdm(range(0, 1000000))]

hit_1 = [x for x in result_1 if x] 
hit_2 = [x for x in result_2 if x]

print('------')
print(f'{len(hit_1)}/{len(result_1)}')
print('------')
print(f'{len(hit_2)}/{len(result_2)}')
```

```text
100%|██████████| 1000000/1000000 [00:01<00:00, 633529.37it/s]
100%|██████████| 1000000/1000000 [00:01<00:00, 630403.13it/s]
------
333092/1000000
------
666834/1000000
```

# 考察
コメントにもあるように、扉を変える場合は、
最初が当たっている場合(1/3)、必ず、はずれ。
最初が外れている場合(2/3)、必ず、あたり。
なので、変える方がお得。
LLMのfinetuning手法「LoRA」について

今日はLLMのfinutuningで有名な「LoRA」について簡単に説明してみたいと思います。

 

LoRAは「モデルのfinetuningを高速化する技術」です。

 
finetuningはモデルの重みを調整することで実現しています。ニューラルネットワークには多くの「全結合層」が含まれており、これらの層は主に行列乗算によって構成されています。また、多くの全結合層の重み行列はフルランクです。（d x d)
従来のfinetuning手法は、フルランクですので、基本的にはすべての重みを調整することでチューニングしていました。
そうすると、非常に大量なGPUリソースと時間が必要です。
そこで、LoRAの提出者はモデルのfinetuningにすべての重みが調整する必要がなく、タスクによって必要な重みだけ調整すればいいではないかと考えて、層（ｄ）を次元削減して、ほとんどの重みは調整せず、必要な重みだけを調整する小さな並列層(r)を作りました。（ｒ < < d)
そうすると、数式は(d x d)から(d x r + r x d)に変わって、パラメータ数がかなり少なくなります。処理時間も全パラメータ調整より10-100倍くらい速くなりました。
イメージとしては⇩の画像の通りです。
![10-16-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/a3ae65b2-455c-d4f6-be12-a165ed36db15.png)


 

わかりにくいかもしれないので、簡単な例で説明すると、モデルのfinetuningは料理を作ることと似ています。
「モデル」自体は色んな食材を保管されている大きな冷蔵庫のようなもので、そして、一つの「重み」は一つの食材となります。
例えば、チャーハンを作る時には、「卵」と「ご飯」あと「醤油」がいりますね。（これらは3つの重みと考えられます）
そして、もっとおいしいチャーハンを作りたい時（finetuning）には、食材（重み）を調整することがありますね。
例えば、もっと美味しい品種のご飯を使うことなどです。（これは重みの調整、つまりfinetuningのことです）
ですが、チャーハンおいしくするために、冷蔵庫の中のすべての食材を変える必要はありません。
同様に、モデルのfinetuningも、特定のタスクに必要な「重み」だけを更新すれば良いという考え方です。

 

LoRAをベースとして、改善されたバージョン「QLoRA」や「AdaLoRA」もあります。
AdaLoRAはメモリーの使用方法を改善するもので、重みを全て一箇所のメモリに保存するのではなく、分散して保存することでメモリの使用効率を向上させます。
（処理時間長くなりますが）
QLoRAは4bitの微調整の精度を高め、16bitとの差を小さくする手法です。（小規模なfinetuningでは結構使われています。）

 

興味ある方⇩の論文参考してください
https://arxiv.org/abs/2106.09685
Hexabase TypeScript SDKを使ってステータスを更新する

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

この記事ではHexabase TypeScript SDKのインストールと、ステータスの更新方法を紹介します。

## インストール

インストールはnpmやyarnを使って行います。

```jsx
# npmの場合
npm install @hexabase/hexabase-js

# yarnの場合
yarn add @hexabase/hexabase-js
```

## インポート

インポートすると、 `HexabaseClient` というオブジェクトが取得できます。

```jsx
import { HexabaseClient } from "@hexabase/hexabase-js";
```

## 初期化

HexabaseClientを初期化します。

```jsx
const client = new HexabaseClient();
```

## 認証

Hexabaseでは業務利用を想定しているため、利用する際に認証情報が必須になります。最初はメールアドレスとパスワードで認証し、その後はトークンを使ってGraphQLにアクセスします。 `client` を使って処理します。

初回の認証は次のようになります。emailとパスワード、またはトークンが必須です。

```jsx
await client.login({email, password, token});
```

後はこの `client` に対して処理を行います。

## ステータスとは

Hexabaseのデータストア（RDBMSでいうテーブル相当）ではステータスという特別なフィールドが用意されています。

ステータスは、データの状態を表すためのフィールドです。例えば、案件のデータを管理する場合、ステータスには「新規」「進行中」「完了」などの値を設定します。そして、ステータスは直接変更はできず、ステータス変更のアクションを実行して変更します。

たとえば以下のようになります。

| データの状態     | ステータス |
| ---------------- | ---------- |
| 新規保存         | 起票       |
| プロジェクト開始 | 開始       |
| 納品完了         | 検収中     |
| プロジェクト終了 | 請求前     |
| 請求書発行       | 入金前     |
| 入金確認         | 完了       |

そして、このステータスの中には差し戻しが発生することもあるでしょう。検収中のステータスから開始に戻すこともあるでしょう。このような場合も、ステータスの変更はアクションを実行することで行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/81032847-12f3-5478-1d1e-f52a0cc3d524.png)


Hexabaseでは、特定のステータスから別なステータスに変更するアクションは、あらかじめ定義したものだけが指定できます。

## ステータスの作成

ステータスは管理画面で作成します。ここで各ステータスが別なステータスに変更できるアクションを定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/85d0d1bd-faa0-1966-cd42-db8240a7308a.png)


## TypeScript SDKでの実装

### ステータスの取得

あるアイテム（既存）のアイテムがどんなステータスアクションを実行できるかは、 `item.statusActions` で取得できます。

```ts
const item = await datastore.item('99999999');
item.statusActions.map(action => {
	console.log(action.name);
});
```

### ステータスの変更

ステータスの変更は `execute` メソッドを使います。これは保存処理とは異なりますので注意してください。

```ts
await item.execute('納品完了');
```

## まとめ

Hexabaseのステータス管理を使えば、データの管理を柔軟に行えるようになります。ステータスは間違って上書きしてしまうと、データの二重処理などにつながりますので、アクションを通して変更する仕組みが便利です。

ステータスの変更時にアクションスクリプト（FaaS）を実行したり、Webhookなども呼び出せます。ぜひ活用してください。

[Hexabase \| 新規事業向け開発・競争領域でのDX実現をサポート](https://www.hexabase.com/)