異常嘅文章瀏覽量


喺資料庫入面,我有加入到一欄係用黎記錄返每篇文章嘅點擊率或者瀏覽量。今日我重設咗呢嚿嘢返去0,由頭數過。

點解我要咁做呢?原因係其實喺1.1版本嘅時候已經發現文章個count數異常地大。當時我以為係因為自己無將increment個數定返做1,所以就將increment()嘅第二項變數set做1。當然其實心知肚明嘅係,佢個2nd argument預設就係1,又點會無啦啦變咗其他嘢?

於是close咗issue後直到準備上1.2嘅時候,走返入去資料庫睇返發現啲數依然都係異常地大...嘛,自己都有自知之明係不人氣(?)嘅時候就自然會試吓點解啦,於是就發現即使自己將increment()嘅第二項變數set做1,佢都係會自動變成+3。上網睇吓有無解決方案,發現有可能係有啲嘢multi-request咗所以行多咗兩次。咁我就走入去access.log度睇吓。

[IP_ADDRESS] - - [26/Apr/2018:15:06:46 +0800] "GET /images/upload/20180125022347-5a68cf3363088.png HTTP/1.1" 200 745476 "https://www.littpi.net/blog/post/12" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
[IP_ADDRESS] - - [26/Apr/2018:15:06:49 +0800] "GET /blog/post/12 HTTP/1.1" 206 9800 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"
[IP_ADDRESS] - - [26/Apr/2018:15:06:49 +0800] "GET /blog/post/12 HTTP/1.1" 206 9799 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"

嗯?facebookexternalhit/1.1?仲有條link?咩黎架?

閣下找到本頁,可能是因為有 Facebook 用戶曾將閣下的網站連結發送給其他 Facebook 用戶。

簡單黎講就應該係Facebook要將你嘅網站內容cache出黎,等share俾其他FB用戶嗰陣就會即刻拎到啲資料咁。問題係,因為呢嚿嘢嘅關係我無厘頭地多咗兩個view數?嘛,仲未計其他唔同搜尋引擎嘅bots同crawlers,諸如TwitterBot、MJ12Bot等等...無錯,呢堆bot有助我喺搜尋引擎度更易被搜尋到,但係另一方面佢哋擾亂咗我個實際數字。

於是我就更新咗當入去篇文章嘅連結嗰陣要做嘅嘢。流程如下:
1. 檢查佢係咪bot/crawler
2. 如果係bot/crawler就唔會更新view counter
(Bold咗嘅位係新加...)

// This is used to check if it is a robot or web crawler.
// It will be kept updated since the name is different.
$robot = false;
if (empty(request()->server('HTTP_USER_AGENT')) || preg_match('/(facebookexternalhit.*)|(.*bot.*)|(.*crawl.*)/i', request()->server('HTTP_USER_AGENT')) !== 0) {
    $robot = true;
}

if ($robot === false) {
    // Do the increment job if it is not a bot or crawler.
    ...
}

其實個regexp應該要加埋spider...不過可以遲下先再搞。希望跟住落黎呢個問題可以正式解決。

Gitlab CI/CD設置


It is done... and I am done.

今次唔講Vue住,因為我呢兩日都喺度玩緊呢嚿嘢...

GitLab係一個以網頁作為基底嘅Git Repository Manager,唔識咩叫Git嘅請自行Google,真係懶嘅話...


而家成個網站我都係用自己整嘅GitLab Server黎維護,畢竟係private project而且大部份嘢自己控制到就當然最好啦。關於GitLab嘅教學可以自行上佢官方網站度參詳下。今日想講少少關於佢嘅CI/CD功能。

CI/CD嘅意思係持續整合(Continuous Integration)及持續交付(Continuous Delivery)。你寫咗一啲新嘅功能,可能喺local嘅環境下測試成功,但基於local同staging甚至production嘅環境唔同(OS、Apache/Nginx、MySQL/Oracle等)而導致有誤差,擺咗上去先發現有問題。目前我都會恃住自己網站流量低,而且無乜人睇我個網誌直接丟上production睇吓有無問題再進行修改,不過長遠黎講呢個唔係一個好嘅方法。於是我就嘗試吓用GitLab提供嘅CI/CD功能。

要做呢樣嘢首先你要有一個或以上可以行你啲代碼嘅runner。我最後選擇咗喺自己部電腦度裝VirtualBox再裝Ubuntu 16.04黎模擬返production environment,然後為咗方便起見我喺個VM度裝咗LAMP stack、Node.js同埋docker。請記住嘅係其實GitLab Runner係可以喺windows上運行,只係因為我需要docker但係Win 10 Home裝唔到所以先淪落到我而家呢個地步......

詳細嘅GitLab Runner設定教學可以去官網文件 https://docs.gitlab.com/runner/ 度睇返架。

然後就要幫project加一個叫做.gitlab-ci.yml嘅檔案。呢個檔案係用黎設定你成個CI/CD嘅流程。

.gitlab-ci.yml設定檔。

我喺個設定檔入面指定咗會加載edbizarro/gitlab-ci-pipeline-php嘅PHP 7.2 Docker image,因為佢已經包含晒所有Laravel需要用到嘅嘢,包括Composer、Node.js等。亦都係因為呢個原因我先需要整個VM出黎裝docker...

然後就大功告成啦。不過一開始整出黎嘅Jobs報告未必會出現到coverage rate,因為你仲要去GitLab嘅Project入面揀選Settings > CI / CD > General pipelines settings度將Test coverage parsing嘅regexp寫返入去。GitLab已經好貼心咁俾埋提示你架啦。

Test coverage parsing regexp.

跟住就應該會喺CI / CD > Jobs嗰度睇到你啲代碼嘅coverage rate架啦。

我知好低...得啦唔駛講。

一開始初哥設定乜都唔識就會好似我一開頭張圖咁架啦,所以唔駛驚,搞下搞下就會搞得掂架啦。 w

Vue.js學習帳 - 1. 介紹


之前應承過自己要試下整Vue嘅教學,咁就由簡介吓佢開始啦,順便鞏固我對呢款JS framework嘅認知

如果仲有後續教學嘅話請注意呢一系列嘅教學並唔包括vue-router。

Vue係由Google嘅前員工尤雨溪開發。當時佢嘅諗法係覺得Angular太過龐大而且太過缺乏編程嘅彈性,於是佢就將Angular裡面覺得實用性高嘅部份抽出黎重寫並放上Github,呢個就係Vue嘅雛型。時至今日,Vue已經去到2.x版本,喺Github嘅星數已經可以同React爭一日之長短。

對我黎講,Vue點解會咁特別嘅原因有以下幾點:
1. Data-driven。其實而家普遍嘅JS framework都係以資料作主導,而唔再好似係以前jQuery之類嘅framework咁以操作DOM黎達成目的。由於我本身都係由jQuery開始學起,所以一開始上手其實唔係咁容易轉到諗法...不過上咗手之後就發現真心好好多。
2. 輕量化。同Angular嗰種以嘗試用一個framework解決絕大部份問題唔同,Vue本身剩係保持core code以及做data-binding嘅工作,其他嘢就一律以module嘅形式去整,用嘅時候先加載。如果問我嘅話,我會覺得Vue其實同React相似。

其實我會接觸Vue主要係因為Laravel...係,又係關佢事。Laravel 5.3嘅時候(亦即係我啱啱開始學Laravel嗰陣),Laravel嘅default JS framework就係用咗Vue。本住Vue喺當時已經係如日中天(?)JS framework,我就開始學習點樣去寫......而家CMS入面有一部份都已經由jQuery轉成用Vue,仲好方便添。

如果仲有下次的話(?)我就開始寫下基本嘅coding吧?

Laravel中如何解除Auto-incremented Integer Primary Key?


本來應該係過幾日先寫,但係更新緊個table發現咗呢個問題,立即過黎寫低先...

喺Laravel裡面,migrations係用黎做類似database版嘅version control,你可以用諸如php artisan migrate或者php artisan migrate:rollback去更新或者還原database入面嘅table structure。由於呢幾日喺度搞緊User Management嗰邊嘅table,所以就喺rollback嗰陣遇上咗問題。

問題code:
/**
 * Run the migrations.
 *
 * @return void
 */

public function up()
{
    Schema::table('dummy' function(Blueprint $table) {
        $table->increments('id')->first();
    });
}

/**
 * Reverse the migrations.
 * 
 * @return void
 */

public function down()
{
    Schema::table('dummy', function(Blueprint $table) {
        $table->dropPrimary(['id']);
        $table->dropColumn('id');
    });
}

喺更新嘅位我加咗一個會Auto-increment嘅id欄位並作為primary key存在,而當我要還原嘅時候應該係要首先將id嘅primary key屬性移除先再去將成個欄位刪走。不過好不幸地,當我rollback嗰陣出現咗以下嘅錯誤:

SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key

於是就諗起我要首先將個auto-increment特性移除咗先,但係Laravel嘅說明文檔無一個modifier係有呢個功能。結果喺上網搵完resource後發現原來我可以咁樣...

public function down()
{
    Schema::table('dummy', function(Blueprint $table) {
        $table->integer('id')->unsigned()->change();
        $table->dropPrimary(['id']);
        $table->dropColumn('id');
    });
}

利用change()嘅method將id欄位嘅unsign特性移走,咁就會順手無咗auto-increment嘅效果。之後就可以成功rollback啦。

圖片無法被Laravel Mix進行編彙?


話說近日我就喺度整緊後台既新介面,將個人資料更新個位寫好之後就擺咗上黎先。又更新Laravel 5.6,又轉Bootstrap 4,SweetAlert2又上左7,然後database有啲欄位又更新咗。喺開發嗰陣搞完一大輪再試無問題,就諗住擺上黎production應該就無問題啦,點知就出咗事......

事緣係因為更新咗堆SASS檔既關係,我就要行Laravel Mix黎compile做CSS啦,點知喺local同dev行咗幾次都無問題,上到production居然炒咗,所以尋日就應該會見到成個版面亂晒,又或者無咗背景張雲圖(手機版睇唔到好正常)。

咁到底衰咗啲乜?我試過鏟晒node_modules成個folder再行npm install,發現mozjpeg呢個package無辦法安裝,但我喺Windows又裝到喎。原來係因為Ubuntu個server無裝到一堆package......


如是者,裝返相關既嘢之後又用得返啦。明明之前都好地地無問題......

總而言之今次係想話俾大家聽終於都更新咗啦,應該會喺黎緊慢慢再加返啲唔同既功能落去啦。

Powered by Half-moon Production.

Copyright © 2011-2020 by 泣雨家的雜物房. Version 1.5.2.

異常嘅文章瀏覽量


喺資料庫入面,我有加入到一欄係用黎記錄返每篇文章嘅點擊率或者瀏覽量。今日我重設咗呢嚿嘢返去0,由頭數過。

點解我要咁做呢?原因係其實喺1.1版本嘅時候已經發現文章個count數異常地大。當時我以為係因為自己無將increment個數定返做1,所以就將increment()嘅第二項變數set做1。當然其實心知肚明嘅係,佢個2nd argument預設就係1,又點會無啦啦變咗其他嘢?

於是close咗issue後直到準備上1.2嘅時候,走返入去資料庫睇返發現啲數依然都係異常地大...嘛,自己都有自知之明係不人氣(?)嘅時候就自然會試吓點解啦,於是就發現即使自己將increment()嘅第二項變數set做1,佢都係會自動變成+3。上網睇吓有無解決方案,發現有可能係有啲嘢multi-request咗所以行多咗兩次。咁我就走入去access.log度睇吓。

[IP_ADDRESS] - - [26/Apr/2018:15:06:46 +0800] "GET /images/upload/20180125022347-5a68cf3363088.png HTTP/1.1" 200 745476 "https://www.littpi.net/blog/post/12" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
[IP_ADDRESS] - - [26/Apr/2018:15:06:49 +0800] "GET /blog/post/12 HTTP/1.1" 206 9800 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"
[IP_ADDRESS] - - [26/Apr/2018:15:06:49 +0800] "GET /blog/post/12 HTTP/1.1" 206 9799 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"

嗯?facebookexternalhit/1.1?仲有條link?咩黎架?

閣下找到本頁,可能是因為有 Facebook 用戶曾將閣下的網站連結發送給其他 Facebook 用戶。

簡單黎講就應該係Facebook要將你嘅網站內容cache出黎,等share俾其他FB用戶嗰陣就會即刻拎到啲資料咁。問題係,因為呢嚿嘢嘅關係我無厘頭地多咗兩個view數?嘛,仲未計其他唔同搜尋引擎嘅bots同crawlers,諸如TwitterBot、MJ12Bot等等...無錯,呢堆bot有助我喺搜尋引擎度更易被搜尋到,但係另一方面佢哋擾亂咗我個實際數字。

於是我就更新咗當入去篇文章嘅連結嗰陣要做嘅嘢。流程如下:
1. 檢查佢係咪bot/crawler
2. 如果係bot/crawler就唔會更新view counter
(Bold咗嘅位係新加...)

// This is used to check if it is a robot or web crawler.
// It will be kept updated since the name is different.
$robot = false;
if (empty(request()->server('HTTP_USER_AGENT')) || preg_match('/(facebookexternalhit.*)|(.*bot.*)|(.*crawl.*)/i', request()->server('HTTP_USER_AGENT')) !== 0) {
    $robot = true;
}

if ($robot === false) {
    // Do the increment job if it is not a bot or crawler.
    ...
}

其實個regexp應該要加埋spider...不過可以遲下先再搞。希望跟住落黎呢個問題可以正式解決。

Gitlab CI/CD設置


It is done... and I am done.

今次唔講Vue住,因為我呢兩日都喺度玩緊呢嚿嘢...

GitLab係一個以網頁作為基底嘅Git Repository Manager,唔識咩叫Git嘅請自行Google,真係懶嘅話...


而家成個網站我都係用自己整嘅GitLab Server黎維護,畢竟係private project而且大部份嘢自己控制到就當然最好啦。關於GitLab嘅教學可以自行上佢官方網站度參詳下。今日想講少少關於佢嘅CI/CD功能。

CI/CD嘅意思係持續整合(Continuous Integration)及持續交付(Continuous Delivery)。你寫咗一啲新嘅功能,可能喺local嘅環境下測試成功,但基於local同staging甚至production嘅環境唔同(OS、Apache/Nginx、MySQL/Oracle等)而導致有誤差,擺咗上去先發現有問題。目前我都會恃住自己網站流量低,而且無乜人睇我個網誌直接丟上production睇吓有無問題再進行修改,不過長遠黎講呢個唔係一個好嘅方法。於是我就嘗試吓用GitLab提供嘅CI/CD功能。

要做呢樣嘢首先你要有一個或以上可以行你啲代碼嘅runner。我最後選擇咗喺自己部電腦度裝VirtualBox再裝Ubuntu 16.04黎模擬返production environment,然後為咗方便起見我喺個VM度裝咗LAMP stack、Node.js同埋docker。請記住嘅係其實GitLab Runner係可以喺windows上運行,只係因為我需要docker但係Win 10 Home裝唔到所以先淪落到我而家呢個地步......

詳細嘅GitLab Runner設定教學可以去官網文件 https://docs.gitlab.com/runner/ 度睇返架。

然後就要幫project加一個叫做.gitlab-ci.yml嘅檔案。呢個檔案係用黎設定你成個CI/CD嘅流程。

.gitlab-ci.yml設定檔。

我喺個設定檔入面指定咗會加載edbizarro/gitlab-ci-pipeline-php嘅PHP 7.2 Docker image,因為佢已經包含晒所有Laravel需要用到嘅嘢,包括Composer、Node.js等。亦都係因為呢個原因我先需要整個VM出黎裝docker...

然後就大功告成啦。不過一開始整出黎嘅Jobs報告未必會出現到coverage rate,因為你仲要去GitLab嘅Project入面揀選Settings > CI / CD > General pipelines settings度將Test coverage parsing嘅regexp寫返入去。GitLab已經好貼心咁俾埋提示你架啦。

Test coverage parsing regexp.

跟住就應該會喺CI / CD > Jobs嗰度睇到你啲代碼嘅coverage rate架啦。

我知好低...得啦唔駛講。

一開始初哥設定乜都唔識就會好似我一開頭張圖咁架啦,所以唔駛驚,搞下搞下就會搞得掂架啦。 w

Vue.js學習帳 - 1. 介紹


之前應承過自己要試下整Vue嘅教學,咁就由簡介吓佢開始啦,順便鞏固我對呢款JS framework嘅認知

如果仲有後續教學嘅話請注意呢一系列嘅教學並唔包括vue-router。

Vue係由Google嘅前員工尤雨溪開發。當時佢嘅諗法係覺得Angular太過龐大而且太過缺乏編程嘅彈性,於是佢就將Angular裡面覺得實用性高嘅部份抽出黎重寫並放上Github,呢個就係Vue嘅雛型。時至今日,Vue已經去到2.x版本,喺Github嘅星數已經可以同React爭一日之長短。

對我黎講,Vue點解會咁特別嘅原因有以下幾點:
1. Data-driven。其實而家普遍嘅JS framework都係以資料作主導,而唔再好似係以前jQuery之類嘅framework咁以操作DOM黎達成目的。由於我本身都係由jQuery開始學起,所以一開始上手其實唔係咁容易轉到諗法...不過上咗手之後就發現真心好好多。
2. 輕量化。同Angular嗰種以嘗試用一個framework解決絕大部份問題唔同,Vue本身剩係保持core code以及做data-binding嘅工作,其他嘢就一律以module嘅形式去整,用嘅時候先加載。如果問我嘅話,我會覺得Vue其實同React相似。

其實我會接觸Vue主要係因為Laravel...係,又係關佢事。Laravel 5.3嘅時候(亦即係我啱啱開始學Laravel嗰陣),Laravel嘅default JS framework就係用咗Vue。本住Vue喺當時已經係如日中天(?)JS framework,我就開始學習點樣去寫......而家CMS入面有一部份都已經由jQuery轉成用Vue,仲好方便添。

如果仲有下次的話(?)我就開始寫下基本嘅coding吧?

Laravel中如何解除Auto-incremented Integer Primary Key?


本來應該係過幾日先寫,但係更新緊個table發現咗呢個問題,立即過黎寫低先...

喺Laravel裡面,migrations係用黎做類似database版嘅version control,你可以用諸如php artisan migrate或者php artisan migrate:rollback去更新或者還原database入面嘅table structure。由於呢幾日喺度搞緊User Management嗰邊嘅table,所以就喺rollback嗰陣遇上咗問題。

問題code:
/**
 * Run the migrations.
 *
 * @return void
 */

public function up()
{
    Schema::table('dummy' function(Blueprint $table) {
        $table->increments('id')->first();
    });
}

/**
 * Reverse the migrations.
 * 
 * @return void
 */

public function down()
{
    Schema::table('dummy', function(Blueprint $table) {
        $table->dropPrimary(['id']);
        $table->dropColumn('id');
    });
}

喺更新嘅位我加咗一個會Auto-increment嘅id欄位並作為primary key存在,而當我要還原嘅時候應該係要首先將id嘅primary key屬性移除先再去將成個欄位刪走。不過好不幸地,當我rollback嗰陣出現咗以下嘅錯誤:

SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key

於是就諗起我要首先將個auto-increment特性移除咗先,但係Laravel嘅說明文檔無一個modifier係有呢個功能。結果喺上網搵完resource後發現原來我可以咁樣...

public function down()
{
    Schema::table('dummy', function(Blueprint $table) {
        $table->integer('id')->unsigned()->change();
        $table->dropPrimary(['id']);
        $table->dropColumn('id');
    });
}

利用change()嘅method將id欄位嘅unsign特性移走,咁就會順手無咗auto-increment嘅效果。之後就可以成功rollback啦。

圖片無法被Laravel Mix進行編彙?


話說近日我就喺度整緊後台既新介面,將個人資料更新個位寫好之後就擺咗上黎先。又更新Laravel 5.6,又轉Bootstrap 4,SweetAlert2又上左7,然後database有啲欄位又更新咗。喺開發嗰陣搞完一大輪再試無問題,就諗住擺上黎production應該就無問題啦,點知就出咗事......

事緣係因為更新咗堆SASS檔既關係,我就要行Laravel Mix黎compile做CSS啦,點知喺local同dev行咗幾次都無問題,上到production居然炒咗,所以尋日就應該會見到成個版面亂晒,又或者無咗背景張雲圖(手機版睇唔到好正常)。

咁到底衰咗啲乜?我試過鏟晒node_modules成個folder再行npm install,發現mozjpeg呢個package無辦法安裝,但我喺Windows又裝到喎。原來係因為Ubuntu個server無裝到一堆package......


如是者,裝返相關既嘢之後又用得返啦。明明之前都好地地無問題......

總而言之今次係想話俾大家聽終於都更新咗啦,應該會喺黎緊慢慢再加返啲唔同既功能落去啦。