Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

分類: 未分類

PHP SplPriorityQueue …. WTF!

Posted on 2018 年 8 月 29 日2021 年 3 月 12 日 By 日落 在〈PHP SplPriorityQueue …. WTF!〉中尚無留言

我還以為 PHP SPL 的類別應該實作上應該有比較嚴謹,但 … 我錯了 QQ

先來看一下 SplPriorityQueue 的官方文件定義:
public void insert ( mixed $value , mixed $priority )
priority 和我預期的不一樣,原本以為只能放數字 (numbers) 但這邊的 priority type hint 卻標示為「mixed」,表示 priority 可以是任何資料型態 …?

先從最一般的 case 來測試吧:

$q = new SplPriorityQueue();

$q->insert(1, 'A');
$q->insert(2, 'B');
$q->insert(3, 'C');
$q->insert(4, 'D');
$q->insert(5, 'E');

while ($q->count() > 0) {
    echo $q->extract() . PHP_EOL;
}

output:

5
4
3
2
1

看起來會用 ASCII 數值來比較,數值大的優先 dequeue。看起來沒問題。


再來看一下遇到相同 priority 中有多個數值時,到底會發生什麼事:

$q = new SplPriorityQueue();

$q->insert(1, 1);
$q->insert(2, 1);
$q->insert(3, 1);
$q->insert(4, 1);
$q->insert(5, 1);

while ($q->count() > 0) {
    echo $q->extract() . PHP_EOL;
}

output:

1
5
4
3
2

「5, 4, 3, 2」還算正常,但是為什麼「1」會突然跑到最前面!?


最後,priority 真的可以放其他資料型態嗎?為了更清楚的看到執行結果,我這邊改使用 psysh 來操作:

Psy Shell v0.8.18 (PHP 7.1.18 — cli) by Justin Hileman
Unable to check for updates
>>> $q = new SplPriorityQueue();
=> SplPriorityQueue {#201
     heap: [],
   }
>>> $q->insert(1, [1, 2, 3]);
=> true
>>> $q->insert(2, []);
=> true
>>> $q->insert(3, new Exception())
=> true

靠北啊,Exception 也可以當作 priority 使用 ….

>>> while ($q->count() > 0) {
... echo $q->extract() . PHP_EOL;
... }
3
1
2

…. 我不想講了。

總之,若你要使用 SplPriorityQueue,請注意 undefined behavior。

Reference:

  • php – Why SplPriorityQueue keys are reversed? – Stack Overflowhttps://stackoverflow.com/questions/21446898/why-splpriorityqueue-keys-are-reversed
  • php – How SplPriorityQueue works when priority is not an integer? – Stack Overflowhttps://stackoverflow.com/questions/15851726/how-splpriorityqueue-works-when-priority-is-not-an-integer
  • 有人重新實作了自己的 priority queue –  ezimuel/FastPriorityQueue
    https://github.com/ezimuel/FastPriorityQueue
Tags:PHP

type (in Bash) 來判別 shell 實際執行的命令

Posted on 2018 年 8 月 27 日2021 年 3 月 12 日 By 日落 在〈type (in Bash) 來判別 shell 實際執行的命令〉中尚無留言

Linux 的 shell 提供了很多彈性,讓使用者可以客製化自己的工作環境。但也因此有時候把環境搞亂了自己也沒發現。

例如說:

johnroyer@box:~$ phpunit --version
PHPUnit 7.3.2 by Sebastian Bergmann and contributors.

johnroyer@box:~$ cd devel/laravel/
johnroyer@box:~/devel/laravel$ phpunit --version
PHPUnit 6.5.12 by Sebastian Bergmann and contributors.

這個時候雖然可以使用 which 來找出實際上執行的指令是哪一個 binary,但有時不一定與執行的是同一個。例如,上面的環境中,執行 which 都會有相同的結果:

$ which phpunit
/home/johnroyer/.config/composer/vendor/bin/phpunit

如果使用 type (Bash built-in) 來檢查的話,則會更清楚的告訴你,指令會如何執行,例如:

$ type phpunit
phpunit is a function
phpunit () 
{ 
    REPO_PHPUNIT=`pwd`"/vendor/bin/phpunit";
    if [ -e $REPO_PHPUNIT ]; then
        $REPO_PHPUNIT $*;
    else
        /home/johnroyer/.config/composer/vendor/bin/phpunit $*;
    fi
}

which 是由 $PATH 環境變數中的路徑來找出對應的執行擋路徑;type 則是由 Bash 當下的環境去檢查當下到底會如何執行。

Tags:Bash, Linux

氣喘藥可能會使心跳加速

Posted on 2018 年 8 月 9 日2021 年 3 月 12 日 By 日落 在〈氣喘藥可能會使心跳加速〉中尚無留言

昨天氣喘發作,緊急下使用了備勞喘 (Berotec) 吸劑,沒想到引發了一連串的不適。

氣喘藥的其中一個藥理作用,是讓支氣管附近的肌肉收緊,讓支氣管擴張來緩解不適。而這類的藥物會使交感神經緊繃,也連帶著讓身體出現緊張常見的生理現象,如手抖、心跳加速等。

如果因為氣喘經常發作,會需要使用 泛得林 (Ventolin)、備勞喘 (Berotec) 等藥物,且會引發身體不適時,建議先去醫院問診。緊急用藥的副作用可能較治療型藥物的副作用大,若有妥善的療程,除了可以降低氣喘發作的機率,也可以減少用藥造成的身體不適。

參考資料:

  • 氣喘用藥須知 – 高雄民生醫院
    http://www.kmsh.gov.tw/Files/Publish/P00000026.pdf
Tags:生活雜記, 醫療保健

讓 dehydrated 遇到錯誤仍繼續執行

Posted on 2018 年 8 月 7 日2021 年 3 月 12 日 By 日落 在〈讓 dehydrated 遇到錯誤仍繼續執行〉中尚無留言

發現手上一個 domain 的 HTTP cert 過期沒被更新到,但 dehydrated 理應會自動檢查到過期的憑證才對:

/etc/nginx/cert/dehydrated -c > /dev/null 2>&1; service nginx reload

手動執行 dehydrated 以後,發現有個 domain 已經被我刪除,而 dehydrated 遇到這個錯誤以後就會中斷執行,也因此後面幾個 domain 都沒有被檢查。

翻了文件,加上「–keep-going」參數,即可讓 dehydrated 遇到錯誤繼續往下走。

Tags:資訊學習

千萬不要得罪廚師

Posted on 2018 年 8 月 6 日2021 年 3 月 12 日 By 日落 在〈千萬不要得罪廚師〉中尚無留言

餐廳老闆問我吃不吃蝦,覺得懶就說:我不吃超過四隻腳的東西。

隔天,老闆買了 ……. 田雞!
田雞其實還不算太恐怖,個人吃過心理壓力最大的是烤小鳥,還是連頭都在的烤小鳥。要吃鳥頭的時候心裡真的很毛。
Tags:生活雜記

文章分頁

上一頁 1 ... 84 85 86 ... 318 下一頁

其他

關於我  (About me)

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.