發表文章

[筆記] Laravel One to Many 遇到 a foreign key constraint fails

圖片
碰到錯誤訊息了 (以下 Model 與 Table 名稱為示意,有可能因為手工改寫而有出入,看起來怪怪的地方請跟我說) 在儲存 Category、Product 兩 table 的 One to Many 資料時,我收到的錯誤訊息如下: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`store`.`products`, CONSTRAINT `products_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)) (SQL: insert into `products` (`name`, `category_id`) values (商品 P, 0)) 發生錯誤的程式碼簡化後類似這樣: $category = new Category ; $category - > id = "category01" ; $category - > name = "分類 C" ; $category - > save ( ) ; $product = new Product ; $product - > name = "商品 P" ; $category - > products ( ) - > save ( $product ) ; 檢查了一遍 Category 的 Model 已經設好 hasMany : public function products ( ) { return $this - > hasMany ( 'App\Product' ) ; } Product 的 Model 中 belongsTo 也設定正確: public function category ( ) { return $this - > belongsTo ( ...

[筆記] 無法重置 MariaDB 的 root 密碼該怎麼做?

圖片
忘記 MariaDB 的密碼想要重設,下了多個常見的指令 MariaDB [ ( none ) ] > SET PASSWORD FOR 'root' @'localhost ' = PASSWORD(' new_password '); MariaDB [(none)]> ALTER USER ' root '@' localhost ' IDENTIFIED BY ' new_password '; MariaDB [(none)]> UPDATE mysql.user SET authentication_string = PASSWORD(' new_password ') WHERE User = ' root ' AND Host = ' localhost '; MariaDB [(none)]> update mysql.user set password=password(' MyNewPass ') where user=' root' ; 都失敗,出現的錯誤訊息大多如下 ERROR 1131 (42000): You are using MariaDB as an anonymous user and anonymous users are not allowed to change password 照著很多網路步驟做,都還是不能修改成功。 都是當下看起來成功,然後下 quit 重新登入又失敗。 這時只好換個關鍵字搜尋:"cant reset MariaDB password" 就被拯救了! 發生什麼事? 多篇文章都提到同一個現象 如果你的 mysql.user table 裡面的 plugin 欄位被 “unix_socket” 佔據, 就會修改失敗(這是什麼巫術…) 依據國外網友分析, 通常 MariaDB 更新後, plugin 欄位就會被補上這個值(這又是什麼巫術…) 大致看一下, Unix Socket 是一個認證外掛, 主要是讓使用者可以直接透過系統認證進入資...

[筆記] 使用其他 User 執行 Cron Job 腳本

以 Laravel 的 php artisan schedule 為例, 如果希望是特定使用者執行的話可以這樣做: Crontab 部分 在 crontab 中用 su 指定使用者(例如 www),並執行 shell 腳本。 例如在 crontab -e 中: * * * * * su www -c "/usr/local/bin/laravel-scheduler.sh" Shell Script 部分 使用 crontab 執行 shell script 時,預設不會載入 .bashrc。 因為我們有使用 PHPBrew 管理多版本的 PHP, 需要手動透過 source 載入環境變數, 才能執行正確的 PHP 版本。 例如在 /usr/local/bin/laravel-scheduler.sh 中: #!/bin/bash source ~/.bashrc # 載入 www 的 bash 環境變數 php /path-to-your-project/artisan schedule:run >> /dev/null 2 > & 1 其實… 網路上找到一些其他的解決方案,我還沒實際嘗試,有錯誤的話煩請告訴我。 也可以都寫在 Crontab 這樣就不用寫 shell script。 例如在 crontab -e 中: * * * * * su www -c "source /home/www/.bashrc; <command>" 也可以直接指定 Shell 和環境變數 但這應該會影響到整個 crontab。 例如在 crontab -e 中: SHELL = /bin/bash BASH_ENV = "/home/www/.bashrc" * * * * * su www -c "<command>"

[筆記] 不小心 Git push 了含有錯誤內容的 commit 怎麼辦?

狀況: 想要修改已經 push 的 commit, 而且很慘的是,剛剛也不小心已經在 Server 上執行 git pull 了,怎麼辦? 步驟一:修改最後一次的 Commit 完成如 git add 等 commit 變動後,將 git commit 的步驟加上 --amend 參數,如: ( local ) $ git commit --amend --no-edit 運用此參數,git 就會直接修改最後一次的 commit,而不會增加新的 commit。 這裡我們又加了 --no-edit 參數,就是不修改原本 commit 訊息的意思。 步驟二:強制 push 遠端分支 接著強制覆寫遠端 git 的分支紀錄 ( local ) $ git push -f 步驟三:Server 強制 pull 因為 Server 留有錯誤的 commit, 所以要透過 rebase 來更改。 (server) $ git pull --rebase 20190213 更新:不對,比較好的做法是 reset ,否則錯誤檔案會留在工作目錄。 ( server ) $ git fetch # 先取得最新的樹 ( server ) $ git reset origin/master --hard # 再 hard reset 到正確的 origin/master 延伸閱讀 關於各個指令的詳細資訊,以下資料有更完整的敘述和說明: 【狀況題】追加檔案到最近一次的 Commit - 為你自己學 Git 【狀況題】怎麼有時候推不上去… - 為你自己學 Git Pull 下載更新 - 為你自己學 Git

最方便的程式教室 GitHub Classroom 動手玩

圖片
GitHub Classroom 推出已經有一段時間,好像沒看到網路上有人介紹他的使用方法。剛好最近有機會可以嘗試看看,就寫個紀錄分享一下 GitHub Classroom 的一些特色功能。 開始使用 GitHub Classroom 首先當然是直接到 GitHub Classroom 開間 教室 啊,網址如下: https://classroom.github.com 過程十分簡單,稍微講一下就好: 開 教室 的人必須要將教室連結到一個 GitHub Organization (下稱 組織 ) 既然是要連到 組織 ,那想當然每個學生都要加到 組織 中 教室 可以設定多個 Administrators (下稱 管理員 ),前提是他們必須要有 組織 的 Owner 身份 可以把每個學生的 GitHub 帳號對應到自定義的 roster (下稱 名單 ),就不用背帳號名了!!(超棒 🎉🎉) 學生 名單 是可以隨時變動的 設定學生名單 GitHub 提供了很方便識別學生帳號的方法,就是類似暱稱的方式將你的名單跟學生們的帳號綁定起來。 第一格:要你填入你想用什麼方式識別 GitHub 帳號,你可以選擇任意的暱稱來識別 GitHub 帳號,官方舉例是用姓名、email 或學號等。 填這格的目的,是讓其他 管理員 在手動增加新學生的時候,輸入框旁會提示應該填寫什麼樣的內容,以便讓整份名單格式保持一致。因為我的授課對象比較接近社團性質,我在這裡是使用「班級 座號 姓名」混合識別。 第二格:則是填寫每個學生的資料。如果你剛剛選擇使用姓名識別,就是將學生姓名一人一行表列出來。你也可以直接上傳 CSV 檔,學校老師看到這功能應該蠻高興的。 由於 名單 是可以隨時變動的,所以操作過程有誤隨時都可以砍掉重來。 新增好後會像這樣,目前只有名單但還沒跟 GitHub 帳號連接。這部分要等到學生交作業的時候才能連接。 建立作業 接著我們就來建立第一份作業。 選擇作業類型 作業分成個人作業和分組作業,這裡以個人作業為例。 設定作業內容 選擇「Create an individual assignment」後,介面就跟一般建立 repo 類似。 在這裡你可以指定: 作業名稱 repo 的前綴詞(給學生在自己帳號建立 repo 用)...

[筆記] 用 Graph API 檢查 Instant Articles 錯誤

文件竟然什麼都沒寫@@ 抓取所有 IA 文章 這個文件有,可以參考 List All Articles 。 https://graph.facebook.com/{page-id}/instant_articles 抓取所有 IA 文章,並包含狀態 這是我從 Graph API Explorer 挖出來的。重點是 most_recent_import_status 這個 field 竟然沒有在文件中出現… https://graph.facebook.com/{page-id}/instant_articles?fields=most_recent_import_status 其他實用的 field limit publish_status

[筆記] MariaDB 全新安裝遇到 ERROR 1698 (28000) 錯誤怎麼辦

這幾天終於申請 VPS 來玩啦(撒花~~) 參考了 毫無理由使用 MySQL:MariaDB、MySQL 創始者 Michael Widenius 的訪談 ,果斷決定藉這個全新安裝的機會,把 MySQL 換掉,投入我大 MariaDB 。 在 DigitalOcean 提供的 Ubuntu 上,安裝應該很簡單 $ sudo apt install mariadb-server $ mysql_secure_installation 結果問我資料庫的 root 密碼,理論上還沒設定 root 密碼過,應該是直接按 Enter 就好。 結果噴錯了… ERROR 1698 ( 28000 ) : Access denied for user 'root' @ 'localhost' 網路上很多資料和解法,但沒道理啊!!我全新的機器吶!! 結果看完悟出來一個道理: 沒有權限r 所以最簡單的解法如下: $ sudo mysql_secure_installation 解決了 😂😂😂