發表文章

小克的 Visual Studio Code 必裝擴充套件(Extensions)私藏推薦

圖片
沒錯,又是私藏推薦系列,不過這次是 Visual Studio Code。
(上一篇:小克 2017 不能沒有、2018 一定繼續用的必裝 app 下載私藏推薦 (Android/iOS))從 Sublime Text 3 跳到 VS Code 一陣子了,在微軟及社群頻繁的維護與更新下,總算是越用越順手。VS Code 擴充功能(Extensions,俗稱擴充套件)的生態也算是越來越完整,一點也不輸給 Sublime Text 或是 Atom 的外掛或擴充套件。算一算裝的擴充功能也有數十種了,到了要整理的地步(笑),那就寫一篇來記錄一下好了,這篇也會持續更新。我平時主力為 Laravel/PHP 開發,所以會有比較多 Laravel 和 PHP 的相關套件。所以以下就是我的私人珍藏、必裝、必備、必下載、不裝不行的 VS Code 擴充功能。(直接拿 app 那篇來改 XDDD)
如果你有喜歡的其他擴充功能沒列到,也歡迎留言告訴我(各種方面的都歡迎建議)
來放一個官方的圖給 Facebook 抓預覽Changelog2018.08.03 新增 PHPUnit Snippets2018.08.03 將 Better PHPUnit 替換成更好用的 VSCode PHPUnit2018.04.02 裝回 Git History2018.03.27 使用者設定中新增 emmet 和 trimTrailingWhitespace 設定2018.03.24 新增使用者設定2018.03.24 新增 Fira Code2018.03.24 初版效率提升強烈推薦類這個區塊表列的,應該是不裝我會覺得渾身不對勁的的擴充功能 😂Fira Code安裝方法在此
首先推薦的這個不是套件,而是字體,強烈建議安裝,爽度提昇超多!
Settings Sync
如果你有多台電腦,可以幫你同步設定檔和安裝的套件(透過 GitHub Gist),支援背景自動同步
Auto Close Tag
被 Sublime Text 慣壞的必裝,會幫你把右括號或結束標籤補上。現在 VS Code 有內建基本補完功能了,但是他支援更多符號和設定,例如我喜歡打 </ 的時候也幫我補上 HTML close tag。
Guides
這工具我找超久!在你的程式開關符號(例如左右大括號)拉一條線,方便你識別程式區塊

如何正確在 Laravel 撰寫 PHPUnit 單元測試

本篇文章內容主要參考自 LaracastsLaravel 5.4 From Scratch: Testing 101,並且替換掉舊有寫法,改寫成新版(Laravel 5.6)的版本。我們會撰寫一個簡單的 Unit Test 測試,可以在獨立的測試資料庫中測試 model 操作 CRUD,同時不會因為測試 Create 操作而造成資料庫無限肥大下去。建立測試案例先建立一個測試案例,本篇以單元測試為例建立一個 PostTest.php。# Create a test in the Unit directory... php artisan make:test PostTest --unit 規劃測試內容例如我們想要測試以下 Post model 的 method 是否正常:# app/Post.phppublicstaticfunctionarchives(){returnstatic::selectRaw('year(created_at) year, monthname(created_at) month, count(*) published')->groupBy('year','month')->orderByRaw('min(created_at) desc')->get()->toArray();}我們可以先依據 Given-When-Then 格式來撰寫註解,規劃好我們要寫的測試內容。關於 Given-When-Then 可以參考本篇文末 延伸閱讀 段落的整理。# tests/Unit/PostTest.phppublicfunctiontestArchives(){// Given I have two records in the database that art posts,// and each one is posted a month apart.// When I fetch the archives.// Then the response should be in the proper format.}建立測試資料在這裡,我們需要兩筆資料來測試。這時我們可以使用 Model Factories 來產生我們需要的測試資料到資料庫中。關於 Mod…

PHPBrew:編譯 PHP 的各種踩雷紀錄

PHPBrew 是由 C9S 大神產出來的神作,一直以來都用它維護伺服器上的 PHP 版本,但時常會有一些小問題要解決。這次剛好要裝到新機器上,就順便記錄一下遇到的一些狀況。系統環境新開的 VPS 主機,作業系統為 CentOS 7.5,已經用 yum update 更新到最新環境,有啟用 epel-release repository。Requirement先安裝官方 Wiki 指定的基本套件,使用的是以下段落:
https://github.com/phpbrew/phpbrew/wiki/Requirement#fedoracentos-requirements這頁面的另一個段落(CentOS Requirement)親身實驗確定已失效,repoforge.org 已經掛很久啦!!yum installmake automake gcc gcc-c++ kernel-devel yum install php php-devel php-pear bzip2-devel yum-utils bison re2c libmcrypt-devel libpqxx-devel libxslt-devel pcre-devel libcurl-devel libgsasl-devel openldap-devel yum-builddep php yum install httpd-devel 以及我自己需要裝的相依,注意 readline 是有包含在 +default 的,如果你也是指定 +default ,記得安裝。yum install readline-devel ImageMagick-devel libmemcached-devel Installing PHPBrew into System wide Environment參考資料:https://github.com/phpbrew/phpbrew/wiki/Installing-PHPBrew-into-System-wide-Environment如果想要讓編譯的 PHP 可以給所有使用者使用,就使用 root 來編譯吧。sudo -i # 切換成 root 身份 phpbrew init 增加環境變數到 PHPBrew 的 bashrcvim ~/.phpbrew/bashrc 增加 PHPB…

[筆記] 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=newCategory;$category->id="category01";$category->name="分類 C";$category->save();$product=newProduct;$product->name="商品 P";$category->products()->save($product);檢查了一遍 Category 的 Model 已經設好 hasMany:publicfunctionproducts(){return$this->hasMany('App\Product');}Product 的 Model 中 belongsTo 也設定正確:publicfunctioncategory(){return$this->belongsTo('App\Category');}問題在這這時我們從上面錯誤訊息可以注意到 category_id 的值是「0」values(商品 P,0)這個 category_id 照程式碼來看應該要是「category01」,
但我們要儲存 one to many 時,卻在組成 …

[筆記] 無法重置 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 是一個認證外掛,
主要是讓使用者可以直接透過系統認證進入資料庫,不需輸入密碼。
(那為什麼我還要這麼折騰進不去RRRR)所以解決方法?解決方法很簡單,就是把 “unix_socket…

[筆記] Facebook Open Graph 的 og:local 該如何設定?

圖片
Facebook 的開放社交關係圖(Open Graph)針對 og:locale 的規範不曉得是不是有更新,以至於檢查網頁抓取資訊的時候噴了一個我沒看過的錯:
「 website 」類型的 URL「 https://www.example.com 」無效,因為「 og:locale:locale 」特性的指定值「 XX 」無法作為「 enum 」類型進行剖析。
Object at URL ‘https://www.example.com’ of type ‘website’ is invalid because the given value ‘XX’ for property ‘og:locale:locale’ could not be parsed as type ‘enum’.查了一下發現是語言格式錯了,Facebook 的格式不是完全依照 ISO 標準,依據本地化文件的說明:Facebook 上的語言使用 ll_CC 格式,ll 是兩個字母的語言代碼,CC 是兩個字母的國家/地區代碼。例如,en_US 代表美式英文。 我們支援許多 ISO 語言和國碼/區碼從 SDK 文件裡面可以看到目前 Facebook 支援的 og:locate 列舉如下:Allowed values: en_us, ca_es, cs_cz, cx_ph, cy_gb, da_dk, de_de, eu_es, en_pi, en_ud, ck_us, es_la, es_es, es_mx, gn_py, fi_fi, fr_fr, gl_es, ht_ht, hu_hu, it_it, ja_jp, ko_kr, nb_no, nn_no, nl_nl, fy_nl, pl_pl, pt_br, pt_pt, ro_ro, ru_ru, sk_sk, sl_si, sv_se, th_th, tr_tr, ku_tr, zh_cn, zh_hk, zh_tw, fb_lt, af_za, sq_al, hy_am, az_az, be_by, bn_in, bs_ba, bg_bg, hr_hr, nl_be, en_gb, eo_eo, et_ee, fo_fo, fr_ca, ka_ge, el_gr, gu_in, hi_in, is_is, id_id, ga_ie, …

[筆記] 使用其他 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/bashsource ~/.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>"