不明原因,說違法服務條款,帳號被封鎖,私人頻道、付費頻道都沒辦法看了。
透過「切換帳戶」用備用帳號打開 YouTube 後,備用帳號也被封鎖了。
不知道是最近數發部打詐還是 Google 遇到什麼問題有動作,好幾年沒上傳影片的帳號莫名其妙就被封鎖了,去申訴也是罐頭回覆 …..
好險懂一點伺服器架設方法,來思考有什麼替代方案好了。
軟體開發、伺服器和生活瑣事
不明原因,說違法服務條款,帳號被封鎖,私人頻道、付費頻道都沒辦法看了。
透過「切換帳戶」用備用帳號打開 YouTube 後,備用帳號也被封鎖了。
不知道是最近數發部打詐還是 Google 遇到什麼問題有動作,好幾年沒上傳影片的帳號莫名其妙就被封鎖了,去申訴也是罐頭回覆 …..
好險懂一點伺服器架設方法,來思考有什麼替代方案好了。
反串注意!
接觸 YAML 大概是因為遇到 docker 和 kubuernetes 的關係,因為設定檔都必須使用 YAML,然後受到各種荼毒。
先來看一下 spec。
YAML 目前支援常見的幾種資料型態:
100
、-100
、不同進位的表示法 0xC
12.3015e+02
、負無限 -.inf
、以及非數字 .nan
true
、false
John
、加上引號 "John"
或 'John'
先到這邊即可,其他容器類型的陣列、物件這邊先不討論。
這邊先來看一下可能會遇到的問題這個描述:
Name: Zeroplex version: 3.2.9 stable: 3.2
這邊使用 Symfony\Component\Yaml
來 parse 上面的設定,結果為:
array(3) { 'Name' => string(8) "Zeroplex" 'version' => string(5) "3.2.9" 'stable' => double(3.2) }
二個版本號,一個是字串,一個是數字。
為什麼會這樣?YAML 中並沒有規範怎麼樣的文字會應該是數字、什麼狀態是文字。也就是說如果字串沒有加上引號時,依照不同的 parser 實作方式,可能會有不同的結果。
這就是規範不明確導致的 undefine behaviour,最慘的是不同的 parser 實作方式不同,因此相同的設定檔使用不同的 parser 可能會被轉譯成不同的內容,而且無法誤測。
上述指示其中一個小問題,如果你想知道其他的問題,可以參考 The yaml document hell 這篇文章,設計不良讓大家都下地獄。
除了 YAML 以外,其實還有不少設計很好的語言,可以用來協助標示設定、狀態:
只因為 YAML 定義不明確,浪費幾個工作天除錯,真是浪費生命。
我接觸 PHP 蠻久了,大概從 5.1 還是 5.2 開始用到現在 8.4,避開了聽說很雷的 PHP 4,看著 PHP 引進新的功能,到現在社群開發出各種神奇的工具。
回顧過去一些事情,我覺得很重要的事情,不只可以了解 PHP 是什麼樣子程式語言,或許也可以協助判斷其他程式語言是否適合在你手上的專案使用。
就我所知,PHP 4 到 5 主要是支援物件導向,開始可以使用 class 來設計自己所需的功能,不用擔心 function name 和其他人的衝突。在這個時候,大家可以各自在網路上下載別人寫好的類別來使用,例如那個時候「藍色小舖」就有很多工程師分享自己實做的功能,例如 MySQL driver 之類的。
一些大型的專案仍保有這類的程式,像是 dolibarr ERP 的 /htdocs/core/class
目錄下,就有多個作者實做的 class。
在這個時候,功能比較複雜的專案可能會遇到類似的問題,我想要 require
新的 class 時,發現該 class 也有 require
其他的 class,如 dolibarr 的 fileupload.class.php
:
<?php /* Copyright (C) 2011-2022 Regis Houssin * .... */ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; /** * This class is used to manage file upload using ajax */ class FileUpload {
在 FileUpload
中需要使用到 files
和 images
這二個類別。
若現有的專案,剛好有這二個類別時,會遇到類別名稱衝突,導致 require
失敗,導致 FileUpload
沒有辦法使用。這個問題其實和更早期 PHP 的狀況相同,大家各自實做自己的 function、和別人分享 function,卻又怕遇到相同的 function 名稱導致衝突。
為了解決 dependency (相依性、依賴關係) 問題,PHP 5.3 開始支援 namespace。
透過 namespace 功能,大家為 class 和 function 設定各自的 namespace,如:
<?php namesace Zeroplex; class FileUpload { }
雖然 class 名稱相同,但只要在不同的 namespace 就不會導致衝突。
再故事往下之前提一下 autoload 功能,當 require 寫到手軟時,就開始有人開始想各種偷懶的方法了。
PHP 的 autoload 功能,允許使用者在建議物件時,針對自訂的邏輯,決定要做什麼事。所以這讓帶來幾個好處:
當這個功能合併使用時,就獲得合併技能「要使用時在 require」,不僅可以讓程式碼可讀性增加,也可以減少 disk I/O、記憶體使用量。
例如我透過 spl_autoload_register() 先定義好 require 規則:
<?php spl_autoload_register(function ($className) { $classInfo = explode('/', $className); $namespace = $classInfo[0]; $className = $classInfo[1]; echo "namespace: " . $namespace . "\n"; echo "class name: " . $className . "\n"; require __DIR__ . "/library/" . $namespace . "/" . $className . ".php"; }
上述設定會自動將 Zeroplex/FileUploader
拆解成 namespace 和檔案名稱並 require,執行程式時會在 new 階段透過 autoloader 來決定要去哪裡 require 檔案:
<?php $uploader = new Zeroplex\FileUploader(); namespace: Zeroplex class name: FileUploader
在百家爭鳴寫 library 時,還會遇到一個問題:A 和 B library 都需要用到 C library,但 A library 中任何版本的 C library 都可,而 B library 則需要 C library 的最新版。這樣開發程式時,就還需要考慮到底要使用 C library 的哪一個版本。
於是 composer 就出現了。composer 是 dependency management,會自動尋找專案中各 library 可正確運作的版本。
時間往後走一段時間, 來到 PHP 7。
PHP 7 做的最大改變,是大幅改寫直譯器,讓效能大幅提升,而且不只是快一點點而已,是快了 100%。以前為了讓 PHP 程式跑得更快,Facebook 開發了 hhvm,現在用不到了。
若想知道為什麼效能可以快這麼多,可以參考 Nikita Popov (PHP 核心工程師之一) 的簡報:PHP 7 – What changed internally?。或是聽他的演講:
除了效能以外,PHP 在此時也慢慢的提供一些資料型態的定義、檢查功能,像是在撰寫 function 時可以定義 argument 的資料型態 (type hint),除了 scalar type 也開始支援使用者自訂 class 的支援。
這些支援,讓原本是 dynamic typing 的 PHP 可以多一些檢查,程式的可讀性和穩定性上都有改善。
PHP 7 到 8 我打算很不負責任得什麼都不說直接跳過 XD
這邊列出一些有趣的專案:
前陣子,花時間慢慢把中國廠商和中資廠商記錄下來,若比較敏感的產品,可以避開這些公司。
後來發現,這件事情早就有人在做了,整理成資料庫「笨他侵略」,而且還比我敏感很多,連和辦活動有合作關係的公司都被記錄戲來。
常看到其他人建議新手分區切 /
和 /home
,但覺得那是伺服器和多人共用的切法。
通常會把 /home
獨立出來,是因為多人共用主機時:
/var/log
無法寫入,導致服務中斷若電腦是個人使用的話,不會遇到上述問題,就不需要把 /home
獨立出來。整個分割區給 /
其實也沒問題。若擔心的話,倒是可以把 /boot
獨立出來 (看建議是保留 2 GB),開機失敗還有機會還原。
/boot
:系統開機程式用,保守的話使用 ext 檔案系統格式,其他格式也可以/
:其他資料放一起就好