2019/07/18

使用 Eloquent migration 刪除有 key constrain 的 table / index

建立 table 時可能會同時建立 foreign key:
$table->foreign('good_id')
    ->references('id')
    ->on('goods')
    ->onDelete('cascade');

$table->index('value');

這個情況下要直接 dropIndex() 是會出現錯誤的,要先把 key constraint 解掉再來刪除 index。

而 constraint key name 用 show index from TABLE 是看不到的,但是可以使用下面的語法看到 create table 時做的事情:
show create table NAME

看到 contrain key name 以後先用 dropForeign() 刪除,再 dropIndex() 即可。

ps. 記得事情處理完以後,要把 constraint 加回去喔

2019/07/06

給台灣人的 Raspbian 懶人版映象檔

這幾天被 Raspbian 安裝搞得七葷八素,所以乾脆把幾個常用設定改好,直接打包給大家用。


我用的是 Raspbian Buster Lite:
  • Version: June 2019
  • Release Date: 2019-06-20
  • Kernal version: 4.19


我調整過的設定 (目標是接上電源線即可遠端操作):

  • Localization
    • Locale:en_US.utf8 + zh_TW.utf8
    • 時區:Asia/Taipei
    • 鍵盤對應:en (US)
    • Wify county:TW
  • SSH 預設啟動
  • 有線網路自動 DHCP
  • /etc/apt/source.list 的 source 改為 NCHC (快超多)
  • 已經做過一次 apt-get update && apt-get upgrade


載點:https://mega.nz/#F!dR5EVABL!Nkynwg5ivQuRyRqpGz1Q4A

SHA1: 71664d5651d660077621f91b29edeecf4810a486
SHA256: 981a8ded523c30f06ec09292445255c55a862e5d756b4e0fff5f8d069ef35afa

2019/07/04

Google Dou 沒有 Desktop 版本 ... 但有 web 版!

近期找到的語音通訊軟體,音質、順暢程度感覺最好的是 Google Duo,但是在行動裝置上運作起來,可以說是個非常吃系統資源的怪獸 (僅次於 LINEFacebook 吧),所以打算找找看有沒有 Desktop 的版本。

沒想到 Google Dou 提供的不是 Desktop 版本 ...


感覺目前資訊產業從個人電腦,又慢慢轉回中央主機系統的架構,只是 terminal 變成彩色瀏覽器而已。

2019/07/03

使用 setup.py 安裝 Python Package 要切換至根目錄

最近在研究 Python,下載了 RPIO 來安裝:
$ wget http://...... -O RPIO.zip
$ unzip RPIO.zip
$ python RPIO/setup.py install
....
running install
running bdist_egg
error: error in 'egg_base' option: 'source' does not exist or is not a directory

弄了半天,才知道有路徑問題,要先切到 package 根目錄再安裝才會成功:
$ cd RPIO
$ python setup.py install

沒寫過 Python 直接衝 GPIO 有越級打怪的感覺,不知道機器會不會被我搞爛 Orz

2019/06/28

注意 PHPUnit 的 fixture 行為

理論上,各個 test case 不應該互相影響,所以 PHPUnit 設計的 fixtures 像是 setUp() 和 tearDown() 都會在各個 test case 前後執行。

簡單做個測試:
<?php

use PHPUnit\Framework\TestCase;

class LibTest extends TestCase
{
    public function setUp(): void
    {
        $this->data = null;
    }

    public function tearDown(): void
    {
        $this->data = null;
    }

    public function testOne()
    {
        $this->data = 123;
        $this->assertEquals(123, $this->data);

        return $this->data;
    }

    /**
     * @depends testOne
     */
    public function testTwo($data)
    {
        $this->assertEquals(123, $this->data);
    }
}

// -----

PHPUnit 8.2.3 by Sebastian Bergmann and contributors.

.F

即使在 test case 加上 @depends 標記,fixture 也會運作,所以若是要讓下一個 test case 繼續使用的測試值,都必須用 return 的方式傳值。

----

另外,Laravel 提供的 testing tools 也有相同的行為。例如:「RefreshDatabase」,在 test case 執行結束以後就會把資料清空,因此如果要對 DB 做多像檢查,就必須在同一個 test case 中建立多個 assertions (個人不喜歡這樣做),不然即使加上 @depends,DB 中的資料也會被 refresh 掉。