Laradock 安裝 MySQL 出現:Different lower_case_table_names settings for server (‘2’) and data dictionary (‘0’).

網路上這篇有提到解法:
https://stackoverflow.com/questions/64146845/mysql-not-starting-in-a-docker-container-on-macos-after-docker-update

Mac 環境底下 (我的環境 13.0) 的硬碟儲存是大小寫不敏感,只要你沒有在硬碟上動過手腳 (網路有其他教學但適合用在新電腦或是另外開一顆硬碟),那麽就適合使用 lower_case_table_names=2 的設定,這也是 mysql 8 的預設設定,不建議再去調整成 0或 1。參考官方:https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html

  • 0: Windows 或 macOS 不建議,因為使用敏感大小寫儲存與查詢
  • 1: 全部改成小寫寫入與比對
  • 2: 表和資料庫名稱使用 CREATE TABLE 或 CREATE DATABASE 語句中指定的字母大小寫儲存在硬碟上,但 MySQL 在查找時將它們轉換為小寫。比較名稱時不區分大小寫。適用於不區分大小寫的文件系統。InnoDB 資料表名稱和視圖名稱以小寫形式存儲,如 lower_case_table_names=1。

主要是把 Docker 的設定 gRPC Fuse 關閉。不過我嘗試關閉了以後,仍然會跳出這個問題。我看到網路有人提到把 docker 的 mount 出來的 mysql 儲存區刪掉,因此我找到了對應位置:

cd /Users/{這裡是你的 mac 使用者帳號}/.laradock/data/
rm -rf mysql # 刪掉整個 mysql 儲存區
docker-compose build --no-cache mysql
docker-compose up -d mysql

這樣就成功了!

造成的原因,我想可能是早期有安裝過 mysql 但是留了一些舊的系統格式在 mac 上,因為你 docker-compose down 並不會把 mount 到外部的內容刪除,因此殘留而造成與新版的格式衝突。

如果你想修改 lower_case_table_names

因為要避免與你之前生成的資料衝突,因此務必刪除後重啟。例如我將 lower_case_table_names=1,以下介紹步驟:

# 刪除 mysql 初始化過的儲存資料 (如果你有正式資料請匯出)
cd /Users/{這裡是你的 mac 使用者帳號}/.laradock/data/
rm -rf mysql # 刪掉整個 mysql 儲存區

# 專案底下打開你的 laradock 找到 mysql
vim laradock/mysql/my.cnf

# 在 [mysqld] 下方加入這行
lower_case_table_names=1

# 重新運行
docker-compose down mysql && 
  docker-compose build --no-cache mysql && 
  docker-compose up -d mysql

總之,你若要修改儲存與比對的大小寫方式,記得刪掉後重啟才能運行。

在 git clone 遇到 致命錯誤: 分支名稱無效:init.defaultBranch =

最近嘗試 clone 新專案的時候,遇到這樣的錯誤

git clone https://github.com/laradock/laradock.git larado
ck
正複製到 'laradock'...
致命錯誤: 分支名稱無效:init.defaultBranch =

只要將預設的分支名稱填上就可以了。早期我們使用 master 不過後期我習慣跟隨 github 將之改為 main。

git config --global init.defaultBranch main

ChatGPT – php 安裝用法教學 (laravel)

官方提供了 HTTP 的教學範例,其實可以直接訪問 https://platform.openai.com/docs/api-reference/introduction。自己用 PHP 寫一個 curl 當然沒問題,但就是懶了,你當然可以用 ChatGPT 幫你生產一篇,然後你做修改。但更好的方法我覺得可以使用套件。後面介紹套件的方式

註冊

先註冊一個一般的使用者:https://openai.com/blog/chatgpt,在右上角點擊 “View API Keys” 查看我們程式碼最需要的金鑰。

點擊後複製鑰匙,官方說只會顯示一次,如果搞丟了,就要產生一把新的

開始開發

我直接使用 laravel 開發,所以直接

composer require tectalic/openai

然後寫程式碼

use GuzzleHttp\Client;
use Tectalic\OpenAi\Authentication;
use Tectalic\OpenAi\Manager;

$openaiClient = Manager::build(
    new Client(),
    new Authentication(
        "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"
    )
);

$data = [
    'model' => 'gpt-3.5-turbo',
    'messages' => [
        [
            'role' => 'user',
            'content' => '請問你會說中文嗎'
        ],
    ],
];

$response = $openaiClient->chatCompletions()->create(
    new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest($data)
)->toArray();

// 輸出你就看到囉
dd($response['choices'][0]['message']['content']);

完成!

參考

Composer – 查詢套件的當前版本

用指令找最快。

當你安裝的套件是有版本號,那麼可以

composer show 套件名稱 | grep 'versions'

如果是自己私有或是公司內部的 repository 而沒有公開在 packagists ,可能沒有特別壓上版本號,這時候我們要認的就是 commit 的 hash 值,可以

composer show 套件名稱 | grep 'source'

當然可以直接看檔案 composer.lock 找版本,只是要用文字搜尋,就會比較麻煩。

mongo – 安裝 mongodump 的方法

我目前要在現在的主機,備份遠端的 mongo,那麼必須要在本機使用 mongodump,要安裝工具

apt-get update
apt install mongo-tools

這樣就可以下指令

mongodump --forceTableScan --host="遠端 IP" --db=你想備份的資料庫 --out="匯出的絕對路徑" --gzip