OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】コントローラからビューへの変数の受け渡し（compact関数）

## compact関数とは
`変数名とその値から配列を作成する`ものらしいです。
laravel独自の関数ではなく、PHPの関数でした。
[compact関数【PHP公式】](https://www.php.net/manual/ja/function.compact.php)

簡単に説明すると、
コントローラで受け取った値をビューへ受け渡す際、
compact関数を使うことで、よりスマートな記述をすることができるようになります。

## 実際の使い方
### compact関数を使用する場合
```
public function index(Request $request) {

    $trRecords = TrRecord::orderBy('tr_date', 'desc')->paginate(10);
    return view('trrecords.index', compact('trRecords'));

}
```

### compact関数を使用しない場合
```
public function index(Request $request) {

    $trRecords = TrRecord::orderBy('tr_date', 'desc')->paginate(10);
    return view('trrecords.index', ['trRecords' => $trRecords]);

}
```

やっていることは同じですが、
compact関数を使ってあげたときのほうがスマートな記述にすることができます。

今回は変数の数が1つだけだったのでそこまで冗長な感じのコードにはならなかったですが、
以下のように変数が増えていくとよりcompact関数を使ったほうが見やすいコードに仕上げることができるようになります。

```
public function test()
{
    $test1 = 'test1';
    $test2 = 'test2';
    $test3 = 'test3';
    $test4 = 'test4';
    
    // viewの第2引数で配列を書いている。
    return view('test', [
        'test1' => $test1,
        'test2' => $test2,
        'test3' => $test3,
        'test4' => $test4,
    ]);
}

public function test()
{
    $test1 = 'test1';
    $test2 = 'test2';
    $test3 = 'test3';
    $test4 = 'test4';
    
    // compact関数だけで書いている。
    return view('test', compact('test1', 'test2', 'test3', 'test4'));
}
```

ただ注意事項として、
`viewの変数とcontrollerで定義した変数が同じ`となるため、
そこを変えたい場合はcompact関数を使用せずに記載するやり方になるかとおもいます。
python maya remove vaccine

```ueserSetup.py
import os
import maya.OpenMaya as om
import maya.cmds as cmds

def killVaccineNodes(clientData):
    scriptNodes = cmds.ls('breed_gene', typ='script')
    if scriptNodes:
        cmds.delete(scriptNodes)
    scriptNodes = cmds.ls('vaccine_gene', typ='script')
    if scriptNodes:
        cmds.delete(scriptNodes)

file_path = cmds.internalVar(userAppDir=True) + '/scripts/vaccine.py'
if os.path.exists(file_path):
    os.remove(file_path)
file_path = cmds.internalVar(userAppDir=True) + '/scripts/userSetup.py'
if os.path.exists(file_path):
    os.remove(file_path)

om.MSceneMessage.addCallback(om.MSceneMessage.kAfterSceneReadAndRecordEdits, killVaccineNodes)

```
https://github.com/aizwellenstan/python_maya_remove_vaccine
CloudcraftでMicrosoft Azureが使えるようになった！

みなさんこんにちは、Datadog テクニカルエバンジェリストのTaijiです！
この度、CloudcraftがAzureに正式に対応したので、その内容を要約してみたいと思います。

## Cloudcraft for Microsoft Azureの一般提供
[2023年3月7日、Datadogの公式ブログ](https://blog.cloudcraft.co/datadog-bolsters-multi-cloud-visualization-design-with-the-addition-of-cloudcraft-for-azure/)にて、Cloudcraft for Microsoft Azureの一般提供が発表されました。Datadogのマルチクラウドサービスが広がってきていますね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/59d8ec78-bcb7-e38a-bc4e-9289011ef3cd.png)

## Cloudcraftとは
みなさん、Cloudcraftはご存知でしょうか？
Datadog傘下にあるダイアグラム作成ツール（サービス）で、かんたんに説明すると、スマートなダイアグラムを利用して、クラウド・アーキテクチャをプロのように視覚化することができちゃうツールです。汎用の図表作成ソリューションとは異なり、Cloudcraftはユーザーが利用しているクラウド・サービスを解釈して図を作成します。詳細は[公式サイト](https://www.cloudcraft.co/)をご覧ください。

## 今回のAzure対応によりできるようになったこと
今までは、CloudcraftはほぼAWS専用ツールのようになっていました。しかし、今回のAzureインフラストラクチャのサポートにより、Cloudcraftの直感的なクラウド図デザイナー、ライブ環境スキャナー、自動予算生成機能を活用して、Azure環境の動的な可視化を作成できるようになりました。
また、ライブ自動資産検出を使えば、対象のAzureアカウントをリアルタイムでライブスキャンし、関連するリソースをリバースエンジニアリングして、そのタイミングでのインフラを正確に反映した図を生成できるようです。これはちょっと便利な気がしますね！

Cloudcraftアカウントに、無制限にAzureサブスクリプションをリンクできるようになっています。同じダイアグラム内でAWSとAzureのコンポーネントやライブスキャンインフラを混在させることも完全にサポートされているので、マルチクラウド環境のユーザーにとっては嬉しい拡張と言えるのではないでしょうか。

## 使ってみる？
[無料トライアル](https://app.cloudcraft.co/signup)で使うことが可能です。まずはこちらで試してみるのはいかがでしょうか？
本格的に商用利用を検討されている方は、Datadogに対して[ライブデモをリクエストする](https://www.cloudcraft.co/request-demo)こともできますよ。

## 参考リンク
[AzureアカウントをCloudcraftへ接続する](https://help.cloudcraft.co/article/103-connect-azure-account-with-cloudcraft)
[Azureコンポーネントでサポートしている機能](https://help.cloudcraft.co/article/175-supported-azure-components)
Go言語のmutex排他処理について

### 概要
Go言語では、複数のゴルーチン（スレッド）が同時に実行されることがあるため、共有リソースへのアクセス制御が必要です。そのために、mutex（ミューテックス）と呼ばれる排他制御機構が提供されています。mutexを使うことで、複数のゴルーチンから同時にアクセスされた場合に、競合状態（race condition）を避けることができます。

### サンプルコード
以下のサンプルコードでは、3つのゴルーチンがそれぞれカウントアップを行います。しかし、共有変数であるcountに複数のゴルーチンから同時にアクセスされるため、競合状態が発生します。そこで、mutexを使ってcountに対するアクセスを排他制御します。

```go
package main

import (
    "fmt"
    "sync"
)

func main() {
    var count int
    var wg sync.WaitGroup
    var mu sync.Mutex

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for j := 0; j < 100000; j++ {
                mu.Lock()
                count++
                mu.Unlock()
            }
        }()
    }

    wg.Wait()
    fmt.Println("count:", count)
}
```

### 解説
1. sync.Mutexを使ってmutexを生成します。
2. ゴルーチンが共有する変数countを定義します。初期値は0です。
3. sync.WaitGroupを使って、3つのゴルーチンが終了するまで待機するようにします。
4. 3つのゴルーチンを生成します。wg.Add(1)でWaitGroupにゴルーチンを追加し、defer wg.Done()でゴルーチンが終了したことをWaitGroupに通知します。
5. ゴルーチンの中で、forループを使って100000回カウントアップを行います。mu.Lock()でmutexをロックし、countをインクリメントして、mu.Unlock()でmutexをアンロックします。
5. wg.Wait()で、3つのゴルーチンがすべて終了するまで待機します。
6. 最後に、countの値を表示します。
このように、mutexを使うことで、countに対するアクセスを排他制御し、競合状態を避けることができます。

https://free-engineer.life/golang-sync-mutex/

https://www.wakuwakubank.com/posts/793-go-goroutine-mutex/
inputの属性覚え直し

こんにちは！最近、セキュリティの本を読んでいた時にhtmlの<input/>属性が紹介されました。便利な機能があったことに気づき、自分なりにまとめてみたfいと思いましたので、今回はその内容をご紹介したいと思います。

https://www.amazon.co.jp/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E9%96%8B%E7%99%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%85%A5%E9%96%80-%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A7%E3%81%AF%E6%B8%88%E3%81%BE%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E8%84%86%E5%BC%B1%E6%80%A7%E5%AF%BE%E7%AD%96%E3%81%AE%E5%BF%85%E9%A0%88%E7%9F%A5%E8%AD%98-%E5%B9%B3%E9%87%8E-%E6%98%8C%E5%A3%AB-ebook/dp/B0BQM1KMBG

# コード
```html
<input
  type='password'
  name='password'
  required
  pattern='^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$'
  title='パスワードには8文字以上の英数字を入力'
  autocomplete='new-password'
  inputmode='text'
/>
```

id, type, nameはお馴染みなので説明しません。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/input

## required
必須項目になる

![スクリーンショット 2023-03-27 18.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/07a5e0b9-6a72-358c-4e9f-4aa3b8b74bc2.png)

## pattern
ブラウザがバリデーションしてくれる。

![スクリーンショット 2023-03-27 18.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/9b6ac67f-3373-b529-cf0b-36c2f3654cb5.png)
```html
<input 
  pattern='^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$'
/>
```
ちなみにこのバリデーションは任意の位置に数字と英字の両方が含まれかつ8文字以上という意味。
?=           : 任意の位置
.*\d         : 数字が含まれる
.*[A-Za-z]   : 英字
{8,}         : 8文字以上

## title
patternのメッセージ
![スクリーンショット 2023-03-27 18.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/c3e15ef0-ed08-d516-32c7-8ae77924b56d.png)

## autocomplete
passwordを自動補完してくれます
autocomplete='new-password'に指定すれば自動入力を停止できたりします。
指定しない場合はname属性から判断してるみたいですね。nameと一緒なら意図的に書くことは少ないかも？詳しくはmdn見てください。

https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete

## inputmode
スマホで見た時のキーボードを指定できます。デフォルトはtextです。

https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/inputmode

`inputmode='numeric'`
![IMG_4005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/dfd7609c-f98c-0494-3aa1-58b90faa3039.jpeg)


`inputmode='search'`
![IMG_4006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787586/e9ccd07d-343f-1fc1-9438-01bb7b1ca46d.jpeg)
M1 Macでxformersをインストールして使用する方法



この記事では、AppleのM1 Macでxformersライブラリをインストールし、使い始める方法を紹介します。以下の手順に従って、M1 Macでxformersをセットアップしてください。

<h1>手順1: HomebrewをARM64にアップデートする

M1 MacはARMベースのプロセッサを搭載しているため、HomebrewをARM64に対応させる必要があります。以下のコマンドをターミナルに入力してHomebrewをアップデートしましょう。

`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"`

<h1>手順2: libompをインストールする

xformersの依存関係であるlibompをインストールします。以下のコマンドをターミナルで実行してください。

`arch -arm64 brew install libomp`

<h1>手順3: PATHを通す

libompのインストールが完了したら、PATHに追加してください。

```
echo 'export PATH="/opt/homebrew/opt/libomp/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```

<h1>手順4: LLVMをインストールする

xformersはLLVMに依存しているため、次のコマンドでLLVMをインストールします。


`arch -arm64 brew install llvm`


<h1>手順5: PATHを通す

LLVMのインストールが完了したら、PATHに追加してください。

```
echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```

<h1>手順6: xformersをインストールする

すべての依存関係が整ったので、xformersをインストールしましょう。


`pip install xformers`


<h5>stable diffusion内にxformersをインストールする場合はこちらを参照

https://zenn.dev/ilai/articles/1ec9290bcc928d

<h2>注意事項

xformersは現在、CUDAにしか対応していません。そのため、COMMANDLINE_ARGSにxformersを含めることはできません。(色々検証中です。)
Salesforce認定アソシエイト試験の公式練習問題解説してみた-11

こんにちは

Salesforce認定アソシエイト試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回は
認定資格試験の準備: Salesforce 認定アソシエイト＞
データモデルについて学ぶ

の問題3問目を解説します

今回の内容は動画でも公開しています

https://youtu.be/MI4Kb5rYzOQ

<iframe width="560" height="315" src="https://www.youtube.com/embed/MI4Kb5rYzOQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>



https://trailhead.salesforce.com/ja/content/learn/modules/cert-prep-salesforce-certified-associate/study-up-on-the-data-model

問題はこちらです
![動的フォーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c7023e52-5f8d-e6e3-6027-209cc2cae960.png)


正解はAです

動的フォームを設定すれば特定の項目の状況で項目の表示が可能です

動的フォームの詳細はこちらのヘルプをご確認ください
https://help.salesforce.com/s/articleView?id=sf.salesforce_authenticator_add_account.htm&type=5

なお、キャンペーンなど一部の標準オブジェクトではこの動的フォームには対応していないのでご注意ください

https://ideas.salesforce.com/s/idea/a0B8W00000GdgCYUAZ/dynamic-forms-for-campaign-standard-object

### 他の認定アソシエイトの勉強方法について

他の勉強方法についてはこちらをご確認ください

https://qiita.com/Takaa/items/d35c9955fe8eb889d76b
競技プログラミングで初心者脱却付近で便利な小技(テクニック)

# おすすめする人
- Atcoder基準で茶色、緑色くらい人
- アルゴリズムを忘れやすい人
- アルゴリズムはだいたい覚えたけど記述する時に手を止めやすい人
- 標準入力を書き飽きた人
- 早解きコンテストで上触れを引きたい人

# そんな人はスニペット(snippet)を使おう

## スニペットって何？
事前に記述したコードをいつでも再利用できる方法です。

もう少しちゃんとした説明

https://www.sophia-it.com/content/%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88

## 例えば...

### 標準入力あるある
よく見るであろう、次のように数値が与えられたとします。
> N 
> a_1 a_2 a_3 ... a_N

この場合

~~~py
N = int(input())
a = list(map(int,input().split()))
~~~
とわざわざ書くより
~~~py
def num():
    return int(input())

def l():
    return list(map(int,input().split()))
~~~
をスニペットから呼び出し
~~~py
N = num()
a = l()
~~~
と書いてかなりの時短が出来ちゃいます。

### 使うアルゴリズムの分野がだいたいわかった時
これはアルゴリズムの分野ごとに保存しておくと便利です。
例えばグラフ探索系とすると

~~~py
def Bellman_Ford(s,n,w,es):
    #s→iの最短距離
    # s:始点, n:頂点数, w:辺の数, es[i]: [辺の始点,辺の終点,辺のコスト]

def dijkstra():
    #n:ノード数e:辺数,w:スタート


def warshall_floyd(n,d):

~~~
みたいに自分が保存した(使ったことがある)コードを見直し、どれを用いるべきか考えることもできます。
また忘れた際にも思い出す事が出来ちゃいます。


## スニペットの作り方
これに関しては公式や詳しい人が書いているのが存在しているので大体は
(自分の用いているコーディングソフト) スニペット
のように検索すると出てくると思います。

https://code.visualstudio.com/docs/editor/userdefinedsnippets

https://qiita.com/282Haniwa/items/82828c6a566e3e7e047d

## まとめ
事前に準備する必要があるがスニペットによってコード記述速度はかなり速くなる
【Wordpress】『.htaccess ファイルの有効化が必要なオプションですが、ファイルが書き込み可能ではありません。』エラーの解決方法

# 概要
* WordpressにReally Simple SSLプラグインを導入し、転送方法を「301 .htaccess 転送」にしたら以下の警告が出てきました。こちらの解決手順を記します。

```
.htaccess ファイルの有効化が必要なオプションですが、ファイルが書き込み可能ではありません。  以下の行を .htaccess に追加するか、書き込み可能に設定してください:
```

![スクリーンショット 2023-03-23 15.07.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/80e57d08-4e16-e44e-d78e-165cc0e451ce.png)


## Wordpress環境
* サーバー（AWS EC2インスタンス）
    * OS：Ubuntu 18.04.3 LTS
    * Web Server：Apache/2.4.29
    * Wordpressバージョン：6.1.1
    * PHPバージョン：7.4.33
* EC2への構築手順：[WordpressをEC2インスタンスにインストールする方法（Apacheのバーチャルホスト設定方法・Wordpress用DB作成方法も解説）](https://qiita.com/Ryo-0131/items/a6dab55ea5b54b6e10b7)

# 解決手順
* まずは以下のディレクトリ（wpsample_homepageのところは各自置き換えてください）に移動します。

```terminal
$ cd /var/www/html/wpsample_homepage
```

* ルートディレクトリ直下にある`.htaccess`に、警告で表示されている以下を先頭に追加します。

```.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
```

* Apacheを再起動します。

```terminal
$ sudo service apache2 restart
```

* Really Simple SSLの画面に戻って少し待つと、以下の警告が出てきました（すぐには反映されません）。エラー内容は先程と少し異なります。


```
.htaccess ファイルの有効化が必要なオプションですが、ファイルが書き込み可能ではありません。 以下の行を .htaccess に追加するか、書き込み可能に設定してください:
Options -Indexes
```

![スクリーンショット 2023-03-23 15.11.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/199c8de8-5922-4583-e255-c6b69c971b05.png)


* 言われた通り、`.htaccess`ファイルを開き、次の行を追加。

```.htaccess
Options -Indexes
```

* 書き込み可能な設定してくれと言われているので、パーミッションも変更しておく。「644」に設定することで書き込みが可能になります。

```terminal
$ sudo chmod 644 .htaccess
```

* Apacheを再起動します。

```terminal
$ sudo service apache2 restart
```

* エラーメッセージが消えました！一件落着！
AndroidのChromeで1700個のタブを開いて:DだったのをPC側にすべて移した

# はじめに
一部の人には強く共感してもらえると思うのだが、スマートフォンで興味の赴くままにネットを見ていると、Chromeのタブが無限に開き続けて常に右上にいる無機質な笑顔:Dとともに一日の大半を過ごすことになる。

こうなるともはやスマホ上で不要なタブを消そうにも、一つ一つ確認するのも億劫だしメモリを食いまくってるせいか動作も遅くなりもうどうしようもなくなる。

重い腰を上げてPC上で何とかタブ一覧を取得して、スマホのタブは一気に消してしまおうと色々と検索しながらやってみた。
これらのページを参考にしたり：
・https://365.honyanya.com/2022-10-20_android-chrome-tab-output-json/
・https://j3iiifn.hatenablog.com/entry/2019/07/14/193000

ChatGPTに聞いてみたりした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606134/d6b9dcee-2624-b036-472c-17d1ce03eea9.png)
（この後1時間ほど質問を繰り返す・・・）

のだがどうにもうまくいかない。

というわけで諦めて力業で解決したという話。

# 解決方法

1. PC側のChromeに拡張機能OneTabをインストールする（参考：https://tcd-theme.com/2020/12/one-tab.html　など）
2. PC側のChromeの画面右上の3つのドットアイコンをクリックし、「履歴」>「履歴」 > 「ほかのデバイスからのタブ」より、自分が使っているスマートフォンの機種を探す
3. スマートフォン名の右側の3つのドットアイコンをクリックし、「すべて開く」をクリックする
4. CPUが静かになるまで待つ
5. OneTabを発動する

さすがにタブを開きすぎてたら上記の方法ではきついのでは・・・と思ったのだけど、5分ほどCPUの悲鳴を聞き続けたら多分全部開ききってくれた。

OneTabでまとめた結果を見ると1726個のタブが開かれていたらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606134/354ea7c1-74b3-0027-bebc-0778cafdc2f2.png)

ちょっとドン引きした。

# 再発防止

とはいえ今後も同じように興味の赴くままネットを見ていれば、多分1か月後くらいにはまた:Dになることは目に見えている。
そこでこれ以降は、スマホ上でもChromeの拡張機能が使えるKiwi Browserをメインに使い、こまめにOneTabでタブをまとめていくことにする。

Kiwi Browserの安全性とかはちょっとよくわからないので推奨しているわけではない。むしろ危険性を知っている人がいれば教えてほしい。
[Rails] find、find_by、whereの使い分け

# 目次
[findについて](#findメソッドとは)
[find_byについて](#find_byメソッドとは)
[whereについて](#whereメソッドとは)
[まとめ](#まとめ)

# findメソッドとは
イメージは、「**主キー(id)を指定して、見つかった１レコードを返す**」です。

【特徴】
1.find()の()内に記述できるのは数値（id）のみ
2.idは主キーなので、1レコードのみ取得
3.検索に該当するデータがなかった場合、ActiveRecord::RecordNotFoundを返す

【書き方】
```ruby
モデル名.find(主キー)
```
【例】
①id=1のみ取得したい場合(モデルはListの場合)
```ruby
List.find(1)
```
②URLのidを取得したい場合
```ruby
List.find(params[:id])
```
# find_byメソッドとは
イメージは、「**主キー(id)以外のカラムを指定しても、見つかった1レコードを返せる**」です。

【特徴】
1.find_by()の()内に記述できるのは、数値（id）だけでなく、文字（id以外のカラム）も可能
2.id以外のカラムも指定できるので、複数のレコードが見つかる場合もありますが、その時は、一番最初に見つかったレコード1件を取得
3.検索に該当するデータがなかった場合、nilを返す

【書き方】
```ruby
モデル名.find_by(任意のカラム名: 格納されている値)
```
【例】
①titleカラムに「ruby」で投稿されたレコードを取得したい場合(モデルはList)
```ruby
List.find_by(title:"ruby")
```
②bodyカラムに「rails」で投稿されたレコードを取得したい場合
```ruby
List.find_by(body:"rails")
```
③titleカラムに「ruby」、bodyカラムに「rails」で投稿されたレコードを取得したい場合
```ruby
List.find_by(title:"ruby",body:"rails")
```

# whereメソッドとは
主なイメージは、「**主キー(id)以外のカラムも指定できる、且つ、複数のレコードも返せる**」です。

【特徴】
1.where()の()内に記述できるのは、数値（id）だけでなく、文字（id以外のカラム）も可能
2.該当する複数のレコードを取得
3.検索に該当するデータがなかった場合、空の配列を返す

【書き方】
```ruby
モデル名.where(任意のカラム名: 格納されている値)
```

【例】
①titleカラムに「ruby」で投稿された全レコードを取得したい場合(モデルはList)
```ruby
List.where(title:"ruby")
```
②bodyカラムに「rails」で投稿された全レコードを取得したい場合
```ruby
List.where(body:"rails")
```
③titleカラムに「ruby」、bodyカラムに「rails」で投稿された全レコードを取得したい場合
```ruby
List.where(title:"ruby",body:"rails")
```

# まとめ
今回はデータの取得方法としてよく使われる３パターンを整理しました！
それぞれに特徴があるので、適宜、必要な場面での使い分けが大切だと思いました！
これからも理解を深め、しっかり使い分けできるようになりたいです、、、！
Hexabase Flutter SDKの使い方（グループのCRUD操作）

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業向けのBaaS（Backend as a Service）を提供しています。認証やデータストア、ファイルストレージ、リアルタイム通知などの機能があり、企業向けのシステム開発に必要な機能をまるっと提供しています。

APIはREST APIとGraphQLを提供しています。そのAPIをラップしたSDKも開発を進めています。SDKは現在、TypeScriptとDart向けに開発しています。Dart向けのSDKは、もちろんFlutterでも利用できます。

この記事ではFlutter SDKについて、インストールとグループのCRUD（作成、更新、削除）操作の方法について解説します。

## パッケージとソースコード

パッケージはpub.devで公開しています。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseです。

[hexabase/hexabase-dart: Hexabase SDK for Dart & Flutter](https://github.com/hexabase/hexabase-dart)

## インストール

インストールは `dart pub get` で行えます。

```
dart pub get hexabase
```

## インポート

SDKをインポートします。

```dart
import 'package:hexabase/hexabase.dart';
```

## 初期化

まずインスタンスを作成します。

```dart
var client = Hexabase();
```

別なファイルで再度インポートした場合には、以下でインスタンスを取得してください。

```dart
var client = Hexabase.instance;
```

## グループについて

Hexabaseではユーザー毎に権限を設定できます。この時、グループを使うことでユーザーをまとめて設定できます。ユーザーはワークスペースに属している場合はもちろん、メールアドレスを指定して限定ユーザーとして登録もできます。

詳しくは [ユーザーとグループ | Hexabase 開発ガイド](https://devdoc.hexabase.com/docs/features/user_and_group) をご覧ください。

## グループの取得

まず登録しているグループを取得します。グループの取得は、すべてを取得するかIDを指定した取得の2パターンが用意されています。

```dart
// まとめて取得
var groups = await client.groups();

// IDを指定して取得
var group = await client.group(id: '999999');
```

## グループの新規作成

グループを新規作成する際には引数なしで `group` メソッドを呼んでください。新しいグループオブジェクトが返ってきます。グループ名、親グループ、ディスプレイIDは必須です。

保存する際には `save` メソッドを実行します。

[group.name](http://group.name/) = 'New group';
await group.save();

```dart
var group = await client.group();
group.name = 'Test group';
group.parent = groups[0];
group.displayId = 'test_group';
await group.save();
```

## グループの更新

グループの設定値を変更する際にも、 `save` メソッドを使います。

```dart
group.name = 'New group';
await group.save();
```

## グループの削除

データストアは `delete` メソッドで削除できます。

```dart
group.delete();

```

## まとめ

Dart SDKはFlutterでも利用できます。Flutterで使えると言うことは、iOS/Androidといったスマートフォンアプリやタブレットアプリはもちろん、Webやデスクトップアプリ開発でも利用できます。ぜひHexabaseをDart SDKとともに活用してください。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)
[pytest-mock]インスタンス変数をmock化したい

自分が詰まった点を備忘として残します。
ひとまず現時点での解決したやり方

## テスト対象のインスタンス変数
こちらは調べたらすぐ出てくる
```python
class Target:
    def __init__(self):
        self.value = 100

def test_1(mocker):
    target = Target()
    mocker.patch.object(target, "value", 0)
```

## テスト対象ではないクラスのインスタンス変数
こっちが詰まった

```python:hoge.py
class Hoge:
    def __init__(self):
        self.value = 100
```
```python:target.py
from hoge import Hoge

def func():
    hoge = Hoge()
    hoge_value = hoge.value
```

target.pyのhoge.valueをmockにしたい  
## ダミーのクラスを定義する
```python:target_test.py
class HogeMock:
    def __init__(self):
        self.value = 0

def test_1(mocker):
    mocker.patch("target.Hoge", new=HogeMock)
```
HogeMockとして定義する。項目が多い、再利用したいなどにも使える。

ただしHogeクラスに他のメソッドが存在する場合はHogeMockにも記載する必要がある。
Hogeにgetというメソッドがあった場合、クラスをmock化していない場合は以下で実行できるが、
mock化しているとgetが存在しない、とエラーになる。
```python
    mocker.patch("target.Hoge.get", return_value=200)
```
その場合はHogeMockにもgetメソッドを追加する必要がある。
```python:target_test.py
class HogeMock:
    def __init__(self):
        self.value = 0

    def get(self):
        pass

def test_1(mocker):
    mocker.patch("target.Hoge", new=HogeMock)
```

### テスト共通にしたい場合、以下
変更したいからmockにしているけれど。
```python
@pytest.fixture(autouse=True)
def init_mock(mocker):
    mocker.patch("target.Hoge", new=HogeMock)

def test_1():
    ...
```

## 参考

https://zenn.dev/re24_1986/articles/0a7895b1429bfa

https://webbibouroku.com/Blog/Article/pytest-mock
SQLiteでレコードを削除したのにidが1から始まらない

# 問題
以下でレコードを全部削除したのに、新たに追加したレコードのidが1から始まらない。
```zsh
sqlite> delete from table
```

# 解決
sqlite_sequenceにidを決めるオートインクリメントの値が保存されているみたいです。
以下のコマンドでオートインクリメントの値をリセット出来ます。
```zsh
sqlite> delete from sqlite_sequence where name='table';
```
"AWSで実現するモダンアプリケーション入門 〜サーバーレス、コンテナ、マイクロサービスで何ができるのか" をおすすめしたい理由

## 自己紹介
4月から2年目になる新米エンジニアです。未経験で業界に入り、あくせくしてたらいつの間にか一年が経ってしまいました。
そんな中読んだ一冊「AWSで実現するモダンアプリケーション入門 〜サーバーレス、コンテナ、マイクロサービスで何ができるのか」をご紹介します。

## 読んだほうがいい人
* 同じような境遇の新米エンジニア
* AWSの勉強したは良いけども、具体例がわからない
* ~~ハンズオンがめんどくさいというズボラさん~~

## おすすめな点5つ
1. モダンアプリケーション自体がよくわかっていなかった私に対して、わかりやすかった
    * とにかく新しいツールをつかえばいいというわけではない
    * アプリに対して、適したものを使っていく、最適化がモダンアプリケーション

2. モダンアプリケーションの考え方に対して、AWSサービスでの実装方法を解説してくれている
3. 難しいコードがあまりない。私が触ったことがない**Ruby**でもなんとなく
わかったほど必要十分な簡潔コード
4. なんとなーく理解していたつもりのことに対して理解が深まった気がする
    * CI/CD
    * ~~sagaなんて初耳だった~~
5. AWSの類似サービスのメリット・デメリットも簡潔に解説されている
    * ECS, EKSとLamdaの使い分けとかぼんやりしていた部分があった
## 感想
わたしがこの本を一年目（今もギリギリそうだけど←）で読みたかっただろう理由を5つ書いてみました。AWSのことをちょっと知りたかっただけだったが、今後の仕事にすぐ役立ちそうな考え方も学べてよかった。
特に「最新ツールより、適切なツール」という考え方は仕事を俯瞰して考えるのに役立ちそうで嬉しくなった笑。
読んでいただいてありがとうございます。初心者エンジニアの参考になれば嬉しいです。
サイバーエージェントにインターン行ってきた

# はじめに
この記事は、2023年3月に行われたJobLiteで私が体験したものなので実際に応募される際はしっかり募集要項を確認してください。はじめまして、学生エンジニアの[マーシー](https://github.com/mercy34mercy)といいます。いつもは[watnow](http://www.watnow.jp/)という学生IT団体に所属してサービス開発をしています。所属大学は立命館情報理工学部です。

# なぜ行ったのか
エンジニアを志している人ならサイバーエージェントに行ってみたいなと思ったことあるひとは多いのではないでしょうか。私もその一人でした。私は昨夏サイバーエージェントさんと関西学生団体合同でイベントを行いました。幹事ではありませんでしたが、主催団体の代表としてLTなどをしました。そちらの様子は[こちら](https://note.com/nanndemokakuyo/n/n3950fb290ca3) 。その時、サイバーエージェントさんのことを詳しく聞き興味を持ちました。そして一番近いインターンが春のインターンだったので申し込み、無事合格しました。

# 選考について
選考は、書類→技術面接→人事面談→技術面談の4段階でした。書類は一般的なものでその内容をもとに3回の面接が行われました。今までいくつかのインターンの選考を受けてきましたが印象的だったのが人事面接でした。個人的に人事面接が苦手です。理由はやはりエンジニアとしてやりたいことは多くあり経験も多いですが、人事面接で聞かれる一般的な就活質問は直感的に答えられず、しっかり準備する必要があるなと感じていたからです。準備してもなかなかいい感触が得られることも少なかったです。サイバーエージェントさんの人事面接は個人的にすごく受けやすく、終わった瞬間にあ、受かったなと思えるほどでした。個人差はあると思いますが、あまり人事面接にビビる必要はないと思います。

# インターンについて
インターンは体験就業型というもので2週間実際にオフィスに通勤し働くというものでした。
## 配属先
私は面接でこの部署がいいとは言っておらず、Goがやりたいです！ということだけを伝えていました。決まった配属先は[MG-DX](https://www.mg-dx.co.jp/)でした。医療系のDXをやられている会社で、結果的にこの配属はめちゃめちゃよかったです。選考を通じて私のことを理解していただいて、この配属先になったのかなと思い勝手に感謝しています。

## 待遇について
待遇はかなり良いと思います。実際に渋谷のオフィスに行き、2週間就業の体験ができます。かかる費用は朝、夜ご飯代くらいで、夜ご飯は渋谷にあるおいしいごはんを稼いだ給与で食べるのがいいと思います。
* 期間
    * 2週間(10営業日)
* 宿泊
    * 先方が用意してくださいました
* 交通費
    * 先方負担です
* 食事補助
    * ランチ制度(後述)
* 給与
    * あり(時給1500円)

### ランチ制度
サイバーエージェントのインターンにはランチ制度というのがあり、社員さんとランチに行けるというものです。ルール内で好きなものが食べられます。社員さんもインターン生と行くとこのような恩恵をうけられるので忙しそうにしておられても誘うと嬉しそうに来てくださいます。制度が形骸化しておらず、めちゃめちゃよかったです。

## エンジニアとしての業務
エンジニアとしては、サイバーエージェントのGithub Organizationに入って実際のコードを書くということをしました。10日間という短い期間でしたがおもったより多くのタスクを頂け達成することができました。
### タスク概要
* レガシーコードの修正
* サーバサイドでの認証システム構築
* テストファイルの合理化
* パフォーマンス監視系ツールの導入
* Slack bot開発

## レガシーコードの修正
go1.16で導入されたgo:embedという機能があり、開発プロダクトはそれより前から開発されていたため、サードパーティー製のライブラリを使用していました。それを公式ライブラリに置き換えるというタスクでした。タスク自体は軽めでしたが、システムが大きいので全体に適用させようとすると労力がいりました。
## テストファイルの合理化
Goに限らずテストをする際モックテストをすると思います。goではgomockというライブラリがあり、mockを自動生成してくれるのですが、大量のファイルができてしまうという問題がありました。これを一つのファイルに出力したいという要望があり取り組みました。gomockのライブラリforkしてきてを読み、修正を加えました。タスクの進め方としては、概要をつかんだら実装方針を書き出してテックリードの方に壁打ちしてもらい実装しました。
## その他
その他、上記したタスクをこなす中で、テストのためにGCPを触ったり、k8sを触ったりと様々な経験ができました。

## 働き方
インターン生としてどのように働いていたのかを説明します。インターン生は10:00～19:00(休憩1h)という契約になっています。私は、だいたい9:45分くらいにオフィスに行っていました。帰りはバラバラで19時に帰ることもあれば20時半頃まで残ったりもしました。ここから言いたいことは、楽しいからコードを書いていたということです。インターン生なので、タスクが終わらないからって残らないといけないとかそんなことはないです。ただただ、楽しくて残業してました。ちゃんと早く出勤したり、残業した分はお給料としていただけます。

# さいごに
私は、Goに初めて触れて約1年、本格的にやりだして半年ほどの学生エンジニアです。なかなかインターンに受からない時期もありましたが、インターンとか考えず自分が作りたいものを作り続けてきた結果、このような素晴らしい経験をすることができました。サマーインターンでは様々な企業が募集をすると思いますが、サイバーエージェントも素晴らしい選択肢の一つだと思います。筆者と話してみたいという方がいれば、[Twitter(@mercy34mercy)](https://x.com/mercy34mercy)をフォローしていただいてDM頂ければできるだけ返信します。
Xcodeを使用して実機にipaを入れる方法

1. Macと端末を有線で繋ぐ

2. Xcode起動
![スクリーンショット 2023-03-27 17.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027418/4b955180-33c6-99f9-d231-8048ce1059fb.png)

3. Window → Device and Simulators
![スクリーンショット 2023-03-27 17.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027418/6936c2ed-259a-9f8d-80b4-3fba3b142a5a.png)

4. Installed Appsの+ボタン
![スクリーンショット 2023-10-12 15.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027418/063dc250-043a-7fda-7112-4ca386a74127.png)

5. ファイルからipaを選択しOpen

完了！
C#ファイナライザの呼び出し順と危険性

みなさまこんにちは。

C#のファイナライザはご存知でしょうか。
ファイナライザはどういうときに使えば良いのでしょうか。

**実はC#のファイナライザには、注意しないとハマってしまう危険性が潜んでいるのです…**

# C#のファイナライザとは

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/classes#1413-finalizers

C#のファイナライザは、オブジェクトがガベージコレクタにより解放されたときに実行される処理です。
教科書的な説明では、オブジェクトの終了処理に使用するものとされています。

しかし、ガベージコレクタの呼び出されるタイミングは厳密に制御できないため、
「リソースを解放し忘れていないか確認し、解放し忘れていれば解放する」のようなフェイルセーフ的な使用方法にするべきとも説明されます。

→例：[Wikipedia/デストラクタ(ファイナライザ)](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF
)

# 本当にそうでしょうか？

次のコードをご覧ください。
クラスBが、クラスAを所持する形です。
この場合、ファイナライザはどの順番で呼び出されるのでしょうか？試してみましょう。

```cs
    class A
    {
	    ~A()
	    {
		    Console.WriteLine( "A" );
	    }
    };

    class B
    {
	    A a = new A();

	    ~B()
	    {
		    Console.WriteLine( "B" );
	    }
    };

    class Program
    {
        static void Main( string[] args )
        {
	        B b = new B();
        }
    }
```

実行結果
```
A
B
```

A→Bの順番になりました。
この結果を見る限り、Bのファイナライザの段階では、すでにAのファイナライザ処理は完了しているということになります。


C#においては、ガベージコレクタによって解放される順番は制御することができず、
それは、**所持関係にあるオブジェクトであっても**例外ではありません。
今回はたまたまA→Bの順になりましたが、常にそうなる保証はないのです。

この場合、Bの解放処理の中で、Aの状態を参照してなにか処理をするといったことはできませんし、
Aの持つメソッドを呼ぶようなことがあれば、Aは解放済み状態のため例外やクラッシュを引き起こすことも考えられます。

# さて困りました

こうなると、Bのファイナライザの段階でなにかフェイルセーフ的な処理を行おうにも、
Bがメンバに持っているオブジェクトの存在すら担保できないことになります。
この状態でできるフェイルセーフって何があるんでしょう…いちおう、アンマネージなリソースに限れば念のため解放するくらいはできそうですが…

# 結論：ファイナライザには期待するな
結論としては、C#においては解放処理が必要なクラスには[Dispose](https://learn.microsoft.com/ja-jp/dotnet/standard/garbage-collection/implementing-dispose)を使おう、ということになります。
身もふたもない話ですが、C#のファイナライザにできることはほとんどないと覚えておいたほうが良いでしょう。

# 追記
.NET 5 (.NET Core を含む) 以降のバージョンにおいては、アプリケーションの終了時にファイナライザ呼び出しがされなくなりました。→[参考](https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/finalizers)
そうなればなお、ファイナライザの意義とは…
Error: Member not found: 'FirebaseAppPlatform.verifyExtends'の解決策

## 概要
FlutterにFirebaseを導入する際以下のようなエラーが出た。
```
../../flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-1.24.0/lib/src/firebase_app.dart:18:25: Error: Member not found: 'FirebaseAppPlatform.verifyExtends'.
    FirebaseAppPlatform.verifyExtends(_delegate);
```

## 解決策
pubspec.yamlに以下を追加する
```
dependency_overrides:
  firebase_auth_platform_interface: 6.7.0
  firebase_core_platform_interface: 4.5.1
```
【Vue】Vue3(Composition API) × TypeScript チートシート

# 単一コンポーネントファイル(.vue)の記述
```Vue:App.vue
<template>
    <h1>{{ title }}</h1>
</template>

<script setup lang="ts">
    const title = "Hello World!";
</script>

<style scoped>
    .h1 {
        color: red;
    }
</style>
```

# 主要ディレクティブ一覧
| 名称 | 説明 |
|:-:|:-:|
| v-on:[イベント名]<br>(省略記号 @ ) | 要素にイベントリスナーを追加する．|
| v-bind:[プロパティ名]<br>(省略記号 : ) | 要素のプロパティに対してVueインスタンスを紐づける． |
| v-if | 条件に基づき，DOMに要素を追加するかを決定する．<br/>v-else-ifやv-elseも合わせて使用可能 |
| v-for | Vueインスタンスのプロパティをもとに，要素を繰り返しDOMに追加する． |
| v-model | input要素への入力値とVueインスタンスの値を紐づける．<br>双方向データバインディング |
| v-show | 条件に基づきdisplayプロパティを操作し，要素を表示するかどうか決定する．|

# 親から子コンポーネントへのデータの受け渡し(Props)
- 親コンポーネント
    - scriptで子コンポーネントをインポートする．
    - template内でタグを使ってDOMに追加する．(ケバブケースに自動で変換される．)
    - 子コンポーネントへのデータの受け渡しはプロパティを利用する．(Vueプロパティを使う場合はv-bindを用いる)
```Vue:ParentComp.vue
<template>
    <child-comp
        title="たいとる"
        :content="msg"
    >
    </child-comp>
</template>

<script setup lang="ts">
    import ChildComponent from "./component/ChildComp.vue";
    msg = "こんてんつ";
</script>
```


- 子コンポーネント
    - 親から受け取りたいデータを持つインターフェースを定義する．
    - defineProps()関数を実行する．`defineProps<インターフェース名>()`
```Vue.ChildComp.vue
<template>
    <div class="child">
        <h3>{{ title }}</h3>
        <p>{{ content }}</p>
    </div>
</template>

<script setup lang="ts">
    interface Props {
        title: string;
        content: string;
    }
    defineProps<Props>();
</script>
```

# 子から親コンポーネントへのデータの受け渡し(Emit)
子から親へのデータの受け渡しはイベント処理を通じて行う．

- 親コンポーネント
    - scriptで子コンポーネントをインポートする．
    - template内でv-onディレクティブを使って，子コンポネントで定義したイベントと親コンポーネントの関数を紐づける．
    - 紐づけた関数の引数で，子コンポーネント内でイベントと一緒に定義したデータを受け取る．
```Vue:ParentComp.vue
<template>
    <child-comp @sendMessage=""></child-comp>
</template>

<script setup lang="ts">
    import ChildComp from "./component/ChildComp.vue";
    
</script>
```

- 子コンポーネント
    - 親へ渡したいデータを持つインターフェースを定義する．`(event: "イベント名", 引数1, 引数2...)`
    - defineEmits()関数を実行する．defineEmits<インターフェース名>()
    - イベントを発生させる要素と関数を用意し，関数内で`emit("イベント名", 引数)`を実行する．

```Vue:ChildComp.vue
<template>
    <button @click="buttonClicked"></button>
</template>

<script setup lang="ts">
    interface Emits {
        (event: "sendMessage", msg: msg): void;
    }
    const emit = defineEmits<Emits>();
    const buttonClicked = () => {
        emit("sendMessage", msg);
    }
    msg = "こんにちは";
</script>
```
PHPerKaigi 2023でオフラインLT登壇してきましたレポ



# 登壇内容

以下の内容でLT登壇してきました

https://fortee.jp/phperkaigi-2023/proposal/e98b7956-6652-4fd5-817b-8df9ba1dd9e1

登壇後Twitterで反応を見たのですが、ありがたいことに好意的な意見が多く嬉しかったです

Day2最後の懇親会でも「ああ、あのLTの！」といった反応をもらっていたので
なかなかいい登壇になったのではないかと思います！

もうちょっと詳しくききたい！みたいな反応もあったので
別のカンファレンスや来年のPHPerKaigiなど、機会があればレギュラートークで詳しく話すのもありだなと思いました

唯一の後悔は、マスクを外し忘れていたことですね。息苦しかった……

# 勉強になったトーク

当日会場で聞いて、個人的に勉強になるなぁと思ったトークをピックアップします！

https://fortee.jp/phperkaigi-2023/proposal/60a7e89b-161e-4f3c-bd8a-135799581aef

https://fortee.jp/phperkaigi-2023/proposal/7e212cb2-be37-43e8-b6ee-5236d259fcbf

https://fortee.jp/phperkaigi-2023/proposal/b9414c59-cb8f-4654-84c7-ade44744295e

https://fortee.jp/phperkaigi-2023/proposal/98ad84b9-df03-4449-ab25-377761945005

https://fortee.jp/phperkaigi-2023/proposal/e68c1ed6-8fb4-4ff9-9d99-99214d9dba8d

# はじめてのオフラインカンファレンス

実は去年のPHPerKaigi2022でも[オンラインでLT登壇していた](https://fortee.jp/phperkaigi-2022/proposal/07c1682b-1170-4056-aac8-cacc6b86fb39)のですが
オフラインは交流の機会がすごく多いなと思いました

去年もLT枠はライブ登壇だったので、Zoomの待合室で多少の交流はあったのですが
実際の会場は、スポンサーブース、セッション会場、アンカンファレンス、Ask the Speakerなど
とにかく交流できる場所が用意されていました

私自身も、[曽根壮大さんのレギュラートーク](https://fortee.jp/phperkaigi-2023/proposal/98ad84b9-df03-4449-ab25-377761945005)を聞いて、疑問に思ったことを会場で直接質問させていただきました

曽根壮大さんとは初対面だったのですが、非常にわかりやすく答えていただきました！
なんと、記事にもしていだけるそうです。本当にありがとうございます

https://twitter.com/soudai1025/status/1640112762830602243

こういった交流は、やっぱりオフラインではできなかったなぁと思います

あとはスポンサーブースでもらったお土産も嬉しかったです（現金なやつ）
FindyさんのブースでAnkerの充電器がもらえました

https://twitter.com/tomoki2135/status/1639436502588604417


# まとめ

**初オフラインでしたが、非常に楽しく、貴重な経験ができました！**

また来年も、オフライン、オンラインに関わらず参加できたらなと思います！
Liberty で JMSを試す

# 目的

JMS環境を構築してJMSをテストします。

# Gitレポジトリ
用意したGitレポジトリをクローンします。

```
git clone https://github.com/pdprof/jms
cd jms/jms-docker/
```

# Libertyイメージのビルド

Liberty Docker イメージをビルドします。localhost 以外の docker を動かしているホストのIPアドレスをACCESS_HOSTに指定します。

```
export ACCESS_HOST=127.17.0.1
# export ACCESS_HOST=`hostname`
./setup-docker.sh
```

# MQの起動

MQ以外にも docker images の用意はありますが、ここではMQを起動します。

```
./mq-start.sh
```
Libertyを SIBusとして使用するときは ./jms-sib-start.sh を実行します。
ActiveMQを使用するときは ./amq-start.sh を実行します。


# MQにアクセスするLibertyの起動

JMSアプリケーションを実行するLibertyを起動します。

```
./jms-mq-start.sh
```
SIBusのクライアントは ./jms-sib-client-start.sh で起動します。
ActiveMQのクライアントは ./jms-amq-start.sh で起動します。


# アプリケーションにアクセスして動作確認

http://localhost:9080/jms/
にアクセスすると以下画面が確認できます。localhost部分はACCESS_HOSTに指定したものと置き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/5f23dbd5-91b7-b16a-81c6-79d6df68533b.png)

Action, Queue, Message を指定してメッセージの送受信をします。
Q3はMDBが動作しているので、receiveAllの必要はありません。MDBが動いたタイミングでlibertyのログに受信したメッセージが出力されています。

```
docker logs jms-mq
> PdprofJMSServlet.send
= PdprofJMSServlet.send to queue:Q3
< PdprofJMSServlet.send
PdprofMdb.onMessage() - Message Received : 
  JMSMessage class: jms_text
  JMSType:          null
  JMSDeliveryMode:  2
  JMSDeliveryDelay: 0
  JMSDeliveryTime:  0
  JMSExpiration:    0
  JMSPriority:      4
  JMSMessageID:     ID:414d5120514d31202020202020202020463f2164012c0040
  JMSTimestamp:     1679900861743
  JMSCorrelationID: null
  JMSDestination:   queue://QM1/DEV.QUEUE.3
  JMSReplyTo:       null
  JMSRedelivered:   false
    JMSXAppID: jar                         
    JMSXDeliveryCount: 1
    JMSXUserID: app         
    JMS_IBM_Character_Set: UTF-8
    JMS_IBM_Encoding: 273
    JMS_IBM_Format: MQSTR   
    JMS_IBM_MsgType: 8
    JMS_IBM_PutApplType: 28
    JMS_IBM_PutDate: 20230327
    JMS_IBM_PutTime: 07074175
test
```

# まとめ

JMSの環境を構築して、テストをすることができました。
VSCodeでデフォルトブラウザをChromeにする方法

左上タブCODE -> Settings... -> Settings -> 検索欄に「browser」と入力
※Macのショートカットは「⌘ ,」

「Live Preview: Custom External Browser」
「Live Server > Settings: Custom Browser」

のプルダウンメニューから「Chrome」を選択する。
ChatGPTで始めるJavaScript入門③～データ型の種類と変換方法～

# 概要
　今回は3.JavaScriptの文法と構文について、の上からなので、
　テータ型について確認していきます。

　**※無料版なので、誤っている情報もあると思いますが、アウトプットできれば良しとします。**


# データ型
　データ型について、記述方法や注意点を聞いてみます。

　【質問】
　JavaScriptの文法と構文について、データ型の種類、記述方法や注意点を教えてください。

　【回答】
　JavaScriptは動的型付け言語であり、変数の宣言時に明示的にデータ型を指定する必要がありません。
　以下に、JavaScriptの主要なデータ型とその記述方法、および注意点を説明します。

**1.文字列型 (string)**
文字列は、シングルクォーテーション (')、ダブルクォーテーション (")、もしくは
バッククォーテーション (`) で囲まれたテキストです。例えば、次のように書きます。

```javascript:type.js
let str1 = 'Hello World!';
let str2 = "JavaScript is fun.";
let str3 = `My name is ${name}.`;
```

**2. 数値型 (number)**
数値型は、整数や浮動小数点数を表すために使用されます。
JavaScriptでは、数値リテラルはデフォルトで浮動小数点数として解釈されます。例えば、

```javascript:type.js
let num1 = 10;
let num2 = 3.14;
```

**3. 真偽型 (boolean)**
真偽型は、trueとfalseの値を表します。例えば、

```javascript:type.js
let isTrue = true;
let isFalse = false;
```

**4. 配列型 (array)**
配列は、複数の値を格納することができるデータ構造です。
配列は、[]で囲まれたカンマ区切りの値のリストで表されます。例えば、

```javascript:type.js
let fruits = ['apple', 'banana', 'orange'];
```

**5. オブジェクト型 (object)**
オブジェクトは、プロパティと値のペアを格納することができるデータ構造です。
オブジェクトは、{}で囲まれたプロパティと値のリストで表されます。例えば、

```javascript:type.js
let person = {
  name: 'John',
  age: 30,
  city: 'New York'
};
```

**6. null型**
null型は、値が存在しないことを示す特別な型です。例えば、

```javascript:type.js
let person = null;
```

**7. undefined型**

undefined型は、値が未定義であることを示す特別な型です。例えば、

```javascript:type.js
let name;
```

JavaScriptでは、変数の型は動的に決定されるため、変数には異なる型の値を代入することができます。
また、注意すべき点として、文字列型と数値型を混合して計算する場合には、自動的に文字列型に変換されることがあります。
このため、正しい結果を得るためには、必要に応じて数値型に明示的に変換する必要があります。


【変数の宣言時に明示的にデータ型を指定しなくていい】　というのは特徴ですね。
数値型に関しては取り扱いに注意が必要そうです。


# データ型の変換
　数値型に変換するという話が出てきたので、データ型の変換方法を聞いてみます。

　【質問】
　JavaScriptの文法と構文について、データ型の変換はどのように記述しますか？

　【回答】
　JavaScriptでは、データ型の変換を行うために、いくつかの方法があります。以下にいくつかの例を挙げます。

**1. Number()関数を使用して、文字列を数値に変換することができます。**
例えば、以下のように記述します。

```javascript:type.js
let numString = "123";
let num = Number(numString);
console.log(num); // 結果: 123
```

**2. parseInt()関数を使用して、文字列を整数値に変換することができます。**
例えば、以下のように記述します。

```javascript:type.js
let numString = "123";
let num = parseInt(numString);
console.log(num); // 結果: 123
```

**3. parseFloat()関数を使用して、文字列を浮動小数点数に変換することができます。**
例えば、以下のように記述します。

```javascript:type.js
let numString = "123.45";
let num = parseFloat(numString);
console.log(num); // 結果: 123.45
```

**4. toString()メソッドを使用して、数値を文字列に変換することができます。**
例えば、以下のように記述します。

```javascript:type.js
let num = 123;
let numString = num.toString();
console.log(numString); // 結果: "123"
```

**5. String()関数を使用して、任意のデータ型を文字列に変換することができます。**
例えば、以下のように記述します。

```javascript:type.js
let num = 123;
let numString = String(num);
console.log(numString); // 結果: "123"
```

以上のように、JavaScriptではデータ型の変換を行うために、様々な関数やメソッドが用意されています。
適切な方法を選択して、変換を行うようにしてください。


変換方法も用意されているので、変換が必要な場合はこれを使いましょう。
poetryでshapがadd出来ない時の対処法

# 挨拶の前に結論
自分の場合はnumba(0.56.4)とnumpyのバージョンがコンフリクト起こしてた

```
poetry add numpy=1.23.3
```

これでinstallすれば解決
```
poetry add shap
```


# 本編

お疲れ様です。
最近XAIに興味を持って[SHAP](https://shap.readthedocs.io/en/latest/index.html)を使おうと思い、
```
poetry add shap
```
をしたところ
たくさんエラーが出ている最後の方に
```
Note: This error originates from the build 
backend, and is likely not a problem with poetry 
but with llvmlite (0.34.0) not supporting PEP 517 
builds. You can verify this by running 'pip wheel 
--use-pep517 "llvmlite (==0.34.0) ; 
python_version >= "3.6""'.
```

と書いてあるようなエラーが出てきます。
まあ、今時ChatGPTにエラーハンドリングさせれば解決することが多いですが、解決しなかったので書いてます。
(ちゃんとしたプロンプトを投げれば解決してくれると思いますが)

エラー原因はおそらく**llvmlite**か**numba**がInstall出来ないことが原因だと思います。
```
poetry add llvmlite
```
でllvmliteはすぐに突破できてしまったので今回はnumbaについて書いていきます。

「なんでinstall出来ないねん！」と思い
```
poetry add numba
```
を実行すると
赤い、怖い文字で
```
Because no versions of numba match >0.56.4,<0.57.0
 and numba (0.56.4) depends on numpy (>=1.18,
<1.24), numba (>=0.56.4,<0.57.0) requires numpy 
(>=1.18,<1.24).
So, because streamlit-app depends on both numpy 
(^1.24.2) and numba (^0.56.4), version solving 
failed.
```
と出てきます。
ホーンと思いながら見てみると、
```
numpy = "^1.24.2"
```
でして、これには対応してないっぽいんですよね。

1.24未満なら対応しているっぽいので、numpy=1.23.3をaddします！

:::note warn
pandas^1.5.3の場合、numpy (=>1.23.2)の必要があるので注意しましょう
:::
```
poetry add numpy=1.23.3
```

これでinstallすれば解決
```
poetry add shap
```
【WordPress】Elementor では、Text Editor を使うよりTitle を使う方が読み込み速度が早い。


タイトルの通りです。

Elementor では、Text Editor を使うよりTitle を使う方が読み込み速度が早いっぽいです。

理由は多分、Text Editor だと、独自CSSが勝手に作成されるから、テキスト部分に余計なCSSがかさむからだろうと。
日本語などのマルチバイト文字をコンピュータで表現するためUnicodeの用語について質問させてください。

以下の問答はちゃんとウラをとっていません。具体例のところは間違ってそうに見えます。
なんとなく用語の雰囲気をつかむために参照してください。

---

はい、Unicodeに関する質問にお答えします。どのようなことについてお聞きになりたいですか？


## まず、結合文字列と合成済み文字の違いについて教えて欲しいです。

Unicodeでは、多くの言語で使用される結合文字列や合成済み文字などの複合文字を表現するための機能があります。

結合文字列は、複数の文字を結合してひとつの文字を表現するために使用されます。例えば、ラテン語アルファベットの"e"とアクセント記号の"´"を結合して、"é"という1つの文字を表現することができます。Unicodeでは、結合文字列は別々の文字としてコードポイントが割り当てられており、それらを組み合わせることで複合文字を作成することができます。

一方、合成済み文字は、複数の文字を合成して1つの文字を表現するために使用されます。例えば、ハングルの"ㅏ"と"ㄴ"を合成して"난"という1つの文字を表現することができます。Unicodeでは、合成済み文字は1つのコードポイントで表現されます。

結合文字列と合成済み文字は、どちらも複合文字を表現するための手段ですが、結合文字列は複数のコードポイントからなるため、文字列の長さが変わることがあります。一方、合成済み文字は1つのコードポイントからなるため、文字列の長さは変わりません。


## 正準等価性と互換等価性の違いについて具体例を挙げて教えてください。


Unicodeでは、同じ意味を持つ文字でも、複数の異なる表現方法が存在することがあります。これらの表現方法を区別するために、Unicodeでは正準等価性と互換等価性という概念があります。

正準等価性とは、2つの文字列が完全に同じ文字列になるように変換できる場合、つまり、文字コードの値が完全に一致する場合に成立します。例えば、英字の小文字"e"は、通常の形の"e"（U+0065）とアキュートアクセントを付けた"é"（U+00E9）の2つの表現方法がありますが、これらは正準等価であると言えます。

一方、互換等価性とは、2つの文字列が似た意味を持つが完全に同じ文字列にはならない場合に成立します。例えば、アポストロフィー記号の"'"（U+0027）と、アキュートアクセントの代用として使われる"’"（U+2019）は、見た目が似ていますが、Unicodeの規格上は別々の文字として扱われ、互換等価であると言えます。

具体例としては、下のようなものがあります。

正準等価性の例：

*   "é"（U+00E9）と"e"（U+0065）+ アキュートアクセント（U+0301）
*   "Å"（U+00C5）と"A"（U+0041）+ 王冠マーク（U+030A）

互換等価性の例：

*   "ー"（U+30FC）と"―"（U+2015）
*   "゛"（U+309B）と"´"（U+00B4）


## 互換等価性をもつペアの例をもっとたくさんあげてください。とくに日本語の例があるとうれしいです。

了解です。以下に、互換等価性をもつペアの例をいくつか挙げてみます。日本語の例も含めています。

*   「゛」（U+309B）と「´」（U+00B4）
*   「゜」（U+309C）と「｀」（U+0060）
*   「ー」（U+30FC）と「―」（U+2015）
*   「～」（U+FF5E）と「〜」（U+301C）
*   「！」「ǃ」（U+01C3）、「｡」（U+FF61）
*   「？」「﹖」（U+FE57）、「︖」（U+FE16）
*   「（」（U+0028）、「﹝」（U+FE5D）
*   「）」（U+0029）、「﹞」（U+FE5E）
*   「〔」（U+3014）、「﹝」（U+FE5D）
*   「〕」（U+3015）、「﹞」（U+FE5E）

以上は一例ですが、Unicodeには互換等価性をもつ文字が数多く存在します。
laravelのフォルダ構成をまとめ

/srvフォルダ配下をまとめた。

- `/app`：Laravelアプリケーションの中でも特に重要な場所であり、アプリケーションのコアな部分
`app/Console`：Laravelのコンソールアプリケーションを定義するためのクラスが格納されるディレクトリ。
`app/Exceptions`：アプリケーションの例外処理を定義するためのクラスが格納されるディレクトリ。
`app/Http`：Webアプリケーションに必要なコントローラーやミドルウェア、リクエストやレスポンスを処理するためのクラスが格納されるディレクトリ。
`app/Models`：アプリケーションのモデルクラスが格納されるディレクトリ。
`app/Providers`：Laravelのサービスプロバイダークラスが格納されるディレクトリ。
`app/Services`：アプリケーションで使用されるサービスクラスが格納されるディレクトリ。




- `/confing`：アプリケーションの設定ファイルが格納される
`confing/app.php`：アプリケーション全般の設定を行うためのファイル。
`confing/auth.php`：認証機能に関する設定を行うためのファイル。
`confing/broadcasting.php`：ブロードキャスト機能に関する設定を行うためのファイル。
`confing/cache.php`：キャッシュ機能に関する設定を行うためのファイル。
`confing/database.php`：データベース接続に関する設定を行うためのファイル。
`confing/filesystems.php`：ファイルシステムに関する設定を行うためのファイル。
`confing/logging.php`：ログ機能に関する設定を行うためのファイル。
`confing/mail.php`：メール送信に関する設定を行うためのファイル。
`confing/queue.php`：キュー機能に関する設定を行うためのファイル。
`confing/services.php`：外部サービスとの連携に関する設定を行うためのファイル。
`confing/view.php`：ビューに関する設定を行うためのファイル。


- `/public`：外部に公開されるファイルを格納する場所
`public/index.php`：アプリケーションのエントリーポイントとなるファイル。publicディレクトリが公開されている場合、このファイルからアプリケーションが開始されます。
`public/favicon.ico：Webサイトのアイコン画像。
`public/robots.txt：クローラーに対して、どのようにウェブサイトをクロールするか指示するためのファイル。


- `/resources`：アプリケーションのリソースファイルを格納する場所
`resources/views`ディレクトリ：アプリケーションのビューファイルを格納するディレクトリ。
`resources/views/components`：再利用可能なUIコンポーネントのテンプレート。Webアプリケーションで使用されるUIコンポーネントのテンプレートがあります。テンプレートは、Bladeテンプレートエンジンを使用して書かれており、アプリケーション内のさまざまな場所で使用される再利用可能なビューコンポーネントを作成するために使用されます。例えば、ボタン、フォーム、テーブル、アラートなど。
`resources/views/auth`：認証機能に関連するビューをこのディレクトリにある。例えば、ログイン、パスワードリセットなど。これらのビューは、アプリケーションの認証機能を使用するときに必要になるものです。
`resources/views/layouts`：アプリケーションの共通レイアウトを提供するテンプレートが含まれている。例えば、ヘッダー、フッター、サイドバーなどのレイアウトがある。これらのテンプレートは、アプリケーションの複数のページで共通して使用されるため、レイアウトテンプレートとして定義されます。個々のページでレイアウトを使用する場合は、このテンプレートを継承して、必要な変更を加えたページ固有のテンプレートを作成する。
`resources/views/vendor`： アプリケーションが使用する外部パッケージに関連するテンプレートが含まれている。
`resources/lang`：アプリケーションのローカライズ用の言語ファイルを格納するディレクトリ。
`resources/js`：アプリケーションのJavaScriptファイルを格納するディレクトリ。
`resources/css`：アプリケーションのCSSファイルを格納するディレクトリ。
3/27 Linux コマンド操作part2

# 個人的リマインド用
ファイル操作

## 基本コマンド
cat → ファイルの中身を表示するコマンド
less → ファイルの中身をスクロール表示するコマンド
touch → 空のファイルを作成するコマンド
rm → ファイルやディレクトリを削除するコマンド
mv → mv ファイルの移動やファイル名を変更するコマンド
cp → ファイルやディレクトリをコピーするコマンド
ln → リンクを貼るコマンド
find → ファイルを検索するコマンド

## 各コマンドの詳細

**cat**
```
cat [オプション] <ファイル名>

cat -n /etc/hosts ファイルの詳細情報を表示 スペース開けで複数のファイルを指定可能
```
**less**
```
less <ファイル名>
スペースキー,f 一画面下にスクロール
b 一画面上にスクロール
j 一行下にスクロール
k 一行上にスクロール
q lessコマンドを実行
/<文字列> 下方向に向かって検索
?<文字列> 上方向に向かって検索
n 次の検索結果に移動
N 前の検索結果に移動
```
**touch**
```
touch <新規ファイル名1> <新規ファイル名2>
いいところは同じ名前のファイルがあっても上書きしない
```

**rm**
```
rm [オプション] <削除するファイル名1>

rm -r dir ディレクトリも併せて削除する
rm -f file ファイルを削除する際に警告文を表示しない(使わん方がいい)
rm -i file 削除前に確認する

rm -rf <ディレクトリ名> 有無を言わさず削除
```

**mv**
```
mv [オプション] <移動元>..<移動先>

mv file file1 ファイル名変更
mv file1 dir/ ファイルを移動

mv -i file file1 上書き前に確認する
```

**copy**
```
cp [オプション] <コピー元>..<コピー先> 上書きに注意

cp -i file new_file 上書きする前に確認
cp -r dir new_dir ディレクトリをコピーする
```

**link**
```
ln [オプション] <リンクもとファイル名> <リンク名>

ハードリンクを貼る
ln file1 file2 何もオプションをつけないとハードリンクになる

シンボリックリンクを貼る
ln -s file1 file3
```

**find**
```
find <検索開始ディレクトリ> <検索条件> <アクション>
find . -name README.md -print

検索条件
-name ファイル名を指定してファイルを検索。ファイル名の大文字小文字は区別する
ワイルドカード(*, ?)が使える
例: find . -name "*.html" -print 拡張子がhtmlのものを探して

-iname ファイル名を指定してファイルを検索。ファイル名の大文字小文字は区別しない

-type ファイルの種類で検索
-type fは通常ファイル
-type lはシンボリックファイル
-type dはディレクトリ

-a 複数の検索条件を指定。なお、-aは省略可能
find . -type d -a -name images -print ※imagesという名前のディレクトリを検索して
```

## テキストファイルとバイナリファイル
**テキストファイル** 文字列が書かれたファイルのこと
→文字列だけ コンピュータ上では数字のみ
LinuxではOSに関わるほとんどをテキストファイルとして管理している

**バイナリファイル** 画像ファイルや音声ファイル、実行ファイルなど
→テキスト以外のファイル

## リンクを貼るとは
Linuxではファイルに別名をつけることができ、別名をつけることを「リンクを貼る」という
Windowsで言うショートカットのようなもの

**ハードリンク**
・1つのファイルの実態に複数の名前をつける機能
・元のファイルを削除しても消えない
・全てのハードリンクがなくなった時に削除される

**シンボリックリンク**　こっち　使うことが多い
・リンク先のパス名が書かれた特殊ファイル。リンク先がファイルの実態
・シンボリックリンクを残したままファイルの実態を削除したり、ファイルを移動すると、ファイルを参照できなくなる

**どう言う時に使う？**
長いパス名を省略したい時
複数バージョンを共存させ最新を区別したい時
SQLCMDで2行目のハイフンを削除するバッチ

SQLCMD使用時に2行目に出てくる「---」の行を削除する

削除前：input.txt
削除後：output.txt

下記バッチを作成し、「input.txt」と同じフォルダで実行


```bat
@echo off
setlocal ENABLEDELAYEDEXPANSION
set "input_file=input.txt"
set "output_file=output.txt"
set count=0

for /f "usebackq delims==" %%i in (%input_file%) do (
    set /a count=count+1
    echo !count!番目
    if !count! neq 2 echo %%i>>%output_file%
)
pause

```
Linux環境下でnvidiaのGPUで運用すると, サスペンドからの復帰に失敗するケースへの対応

限られた御仁へのTIPSかもですが, Linux環境でnvidiaのグラボを使っていて, かつサスペンド/ハイバネートを利用する運用をしていると, サスペンドからの復帰時にブラックスクリーンになって再開できないことがあります.

そうなってしまった場合, gdmを再起動することで復旧してきました.

```
sudo systemctl restart gdm
```

サスペンド復帰後に, OpenCLまたはCUDAを使うアプリケーションがちゃんと動かなくなることもあり, その場合はnvidia関連のカーネルモジュールを読み込み直したりしてました.

```
sudo bash -c "modprobe -r nvidia_uvm && modprobe nvidia_uvm"
```

次の設定を行うことでこの問題を回避できるようになりました.

https://wiki.archlinux.jp/index.php/NVIDIA/%E3%83%92%E3%83%B3%E3%83%88%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF#.E3.82.B5.E3.82.B9.E3.83.9A.E3.83.B3.E3.83.89.E5.BE.8C.E3.81.AB.E3.83.93.E3.83.87.E3.82.AA.E3.83.A1.E3.83.A2.E3.83.AA.E3.82.92.E4.BF.9D.E6.8C.81.E3.81.99.E3.82.8B

次のカーネルモジュール向けのパラメータを追加.

```modconf:/etc/modprobe.d/nvidia.conf
options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/var/tmp
```

サービス nvidia-suspendとnvidia-hibernateを有効化 (archlinuxの場合は, nvidia-utils パッケージに含まれる).

```
sudo systemctl enable nvidia-hibernate.service && $ sudo systemctl enable nvidia-suspend.service
```

> デフォルトでは、システムのサスペンドと復帰時に NVIDIA の Linux ドライバーは必須のビデオメモリの割り当てのみを保存し復元します。NVIDIA 曰く ([7]、nvidia-utils パッケージの /usr/share/doc/nvidia/html/powermanagement.html): 結果として生じるビデオメモリの内容の消失は、ユーザスペースの NVIDIA ドライバーや一部のアプリケーションによって部分的に補われます。しかし、電源管理サイクルの終了時にレンダリングの破損やアプリケーションのクラッシュなどの機能不全が発生する可能性があります。

> デフォルトでは、ビデオメモリの内容は (tmpfs である) /tmp に保存されます。NVIDIA は、最高のパフォーマンスを得るために他のファイルシステムを使うことを推奨しています。また、/tmp のサイズがメモリの容量に対して不十分である場合も、他のファイルシステムを使う必要があります: NVreg_TemporaryFilePath オプションで別の場所を指定してください (例えば、NVreg_TemporaryFilePath=/var/tmp)。

サスペンド時のVRAMのデータを退避することに失敗していた, ということが原因だったのかと思います (ログからそれを読み取れず, 長らく謎だったのですが).

なお, ArchLinux環境下の話で, 標準パッケージの nvidia のインストールで起きていた問題です.
ディストリビューションによっては, このあたりをちゃんとチューニングした設定が入っているかも?
SaaSと通常のソフトウェア・アプリケーションの違い

![Thumbnail Miichisoft Blog (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/0ec1ce91-2afc-31ee-75f8-923bb93e7cb4.png)

カスタマイズ性、インストール、価格、所有権、セキュリティなど、いくつかの主要な要素が、SaaSを通常のソフトウェアと区別しています。

1. カスタマイズ性
カスタマイズ性については、通常のアプリケーション・ソフトウェアの方が優位に立つかもしれません。なぜなら、SaaSソリューションの場合、カスタマイズできるのはSaaSプロバイダーが提供するツールに限られるからです。 SaaSはあらかじめ構築されているため、サブスクリプションで利用することができ、柔軟性に欠ける。SaaSにおけるカスタマイズは、ユーザーのニーズに最適なアプリケーションを開発することに依存するため、一般的にはマスマーケットに販売するのではなく、社内で使用することになります。 

2. インストール
SaaSはインストールが不要ですが、通常のソフトウェア・アプリケーションはインストールやメンテナンスが必要で、そのアプリケーションをサポートするための他のコンポーネントが必要です。

3. 価格
価格に関しては、SaaSにはさらなる利点があります。SaaSには月額制など、柔軟な利用形態が用意されています。しかし一方で、通常のソフトウェアでは、デバイスごとにソフトウェアのライセンスが必要になるため、割高になってしまいます。

4. アーキテクチャ
SaaSはマルチテナントアーキテクチャで構築されており、すべてのユーザーが同じデータベースとアプリケーションを共有しますが、データは分離されており、他のユーザーがアクセスすることはできません。通常のソフトウェア・アプリケーションはシングル・テナント・アーキテクチャで、各ユーザーに異なるサーバー、OS、ハードウェア、DBMSを提供します。

5. クエリおよびレポート 
SaaSのクエリーとレポーティングは、マルチテナントアーキテクチャのため、データを探すためにデータベース全体をスキャンする必要があり、面倒です。しかし、従来のコンピュータアプリケーションでは、データは簡単に便利に再フォーマットすることができます。

6. データの所有権
SaaSは、ユーザーにソフトウェアの所有権を与えないため、アプリケーションに保存されたデータに対する所有権を持ちません。これは中小企業にとって、機密データの漏洩が懸念されます。一方、通常のコンピュータ・アプリケーションはデータを所有しているため、サービス提供者の同意がなくてもデータにアクセスすることが可能です。

7. スケーラビリティ
通常のソフトウェアは限られたユーザー数しかサポートしないため、中小企業がビジネスを拡大したい場合、より多くのライセンスを購入する必要があり、やがて高額になることがあります。一方、SaaSのユーザーは、アップグレードが簡単で、ライセンスにかかる高いコストを伴わないため、より柔軟で拡張性の高いサービスを享受できます。

8. セキュリティ
セキュリティに関して言えば、サイバー脅威から逃れられるものはありません。通常のソフトウェア・アプリケーションは、独自のOS、DBMS、サーバーを備えているため、ハッカーはサーバーに侵入するだけですべてのデータを取得できるため、簡単にアクセスできます。また、SaaSは、すべてのユーザーが同じデータベースとアプリケーションを共有するマルチテナントアーキテクチャであるため、侵害の危険性があります。

したがって、SaaSを従来のソフトウェアモデルと区別する要因として、このクラウドベースのソフトウェアは、通常、インターネット経由でアクセスし、サブスクリプションモデルに従うということが挙げられます。一方、従来のソフトウェアは、ローカルハードウェアにインストールする必要がありますが、より安全である可能性があります。 

まとめ
SaaSプラットフォームには、通常のソフトウェア・アプリケーションとは異なるいくつかの重要な特徴があります。まず、SaaSの場合、使用した分だけ支払うので、アップグレードやインストールを自分で行う心配がありません。第二に、SaaSプラットフォームは一般的にクラウドベースであり、インターネット接続があればどこからでもアクセスできることです。最後に、SaaSプロバイダーは通常、お客様の特定のニーズに合わせてカスタマイズできる様々な機能と統合を提供します。

参考：
https://miichisoft.com/what-is-saas-and-difference-iaas-paas/

Website: https://miichisoft.com/
Vuetify2.xのカスタムSASS変数を定義してコンポーネント内で使う方法


Vuetifyの公式ドキュメントを含めてカスタムSASS変数を定義してコンポーネント内で使う方法、どこにも書いてなかったんだな・・・適当な記事ばっかり

## Step 1.

assets/variables.scssにカスタム変数を追加

```scss
$my-title-color: #6d7793 !default;
```


## Step 2.

nuxt.config.jsを修正

```nuxt.config.js
vuetify: {
    customVariables: ['~/assets/variables.scss'],
    treeShake: true,
```

## Step 3.

コンポーネント内で使う

```vue
<style lang="scss" scoped>

.my-title {
  color: $my-title-color;
}

</style>
```

## Step3で使えないよ？

~/assets/variables.scssが読み込まれてない！！って人へ。
package.jsonにあるnode-sassとかsass-loaderとかを消したらうまくいくかも。
ChatGPTの検索は信用できるのか

## １.はじめに ##
ChatGPTの提示する情報はどれぐらい信用できるのでしょうか
今回はポケモンを題材に調べてみました．
ポケットモンスターは，特にパーティー構築の為に複数の条件からポケモンを検索する事がかなり多いです．
私はポケモン検索の為にサイトを使用することが多いですが，同じことがChatGPTで出来るなら便利だと思い，この記事を書きました．


 ## 2.本題 ## 
今回はポケモンの特性と覚える技から条件を絞り，指定した条件のポケモンを検索しようと試みました．

しかし...
何度か生成してみたところ”存在しない”または全く関係のないポケモンの名前を挙げました．
![スクリーンショット (3909).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292130/27f553b1-b1e2-bf4d-4ab0-33ddc4426b74.png)
![スクリーンショット (3910).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292130/95ca2aec-1c6c-abc7-8cd1-bc8bf915ba82.png)

該当するポケモンは存在しないとなっていますが，実際はルクシオやレントラーがいます．
また，特性：いかくを持つライチュウは存在しません．
この後も何度か試してみましたがポケモンの名前自体は合っていても，覚えない技を覚えると言う，ポケモンのタイプが異なるなど詳細な内容について間違っている場合もありました．
![スクリーンショット (3911).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292130/8e447350-e6af-0666-7367-cddff9e8f21b.png)
デンジュモクは第七世代から登場したポケモンで，タイプはでんきのみ，ポケモンでボルトチェンジを覚えますが特性はいかくではなくビーストブーストです．
さらにボルトチェンジをレベルアップでは覚えません．
↓デンジュモクのぺージ
https://yakkun.com/swsh/zukan/n796
どうやら専門的な内容になると正確な内容を出力するのは難しくなるのかもしれません．
既存のインターネットと同様に裏を確認する必要性を感じました．


 ## 参考 ##
検証にはポケモン徹底攻略様の詳細検索を使用しました．
https://yakkun.com/swsh/zukan/search/