2022年9月17日 星期六

[書籤小工具] Youtube 的 shorts 影片改成正常影片

[方法]
將網址中的「/shorts/」改成「/watch?v=


[書籤小工具]
將以下連結拉到書籤,加入書籤,當成書籤小工具 (bookmarklet),要轉換網址時點擊此書籤即可
Youtube 的 shorts 影片改成正常影片


此書籤小工具的JavaScript程式碼如下:
location.href=location.href.replace('/shorts/','/watch?v=')


2022年9月10日 星期六

Linux SMB 掛載失敗(CIFS VFS: Dialect not supported by server)

環境:
一台NAS提供 SMB 服務
一台Linux(CentOS 7)使用 autofs 掛載 NAS 上的 SMB 資料夾

問題:
掛載 NAS 上的 SMB 資料夾失敗,查看 /var/log/messages,發現錯誤訊息
localhost kernel: No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.
localhost kernel: CIFS VFS: Dialect not supported by server. Consider specifying vers=1.0 or vers=2.0 on mount for accessing older servers
localhost kernel: CIFS VFS: cifs_mount failed w/return code = -95

原因:
掛載時沒指定使用哪個 SMB 版本連線,預設使用更安全的版本 SMB2.1 或之後(SMB3)的版本
但 SMB Server (NAS) 不支援新版本


解決:
  1. 方法一:
    到 NAS 上看 SMB 服務,將 SMB 版本設定成 SMB2.1 或之後(SMB3)的版本後即可。
  2. 方法二:如果 SMB Server,不支援新版本。就只能將連線版本指定成較低的版本。
    例如,原本
    testDir -fstype=cifs,rw,suid,dir_mode=0777,file_mode=0666,username=帳號,password=密碼 ://192.168.0.10/testDir
    指定使用低版本 vers=2.0,則改成
    testDir -fstype=cifs,rw,suid,dir_mode=0777,file_mode=0666,vers=2.0,username=帳號,password=密碼 ://192.168.0.10/testDir



其他:
  • Linux(CentOS 7) 使用 nmap 掃描 SMB Server,查 SMB Server支援的版本
    使用 yum install nmap 安裝的版本若太低,用到的指令(smb-protocols)不支援
    可到 https://nmap.org/ ,用官網提供的 rpm 檔安裝
    # rpm -ivh https://nmap.org/dist/nmap-7.92-1.x86_64.rpm
    # nmap -p139,445 --script smb-protocols 192.168.0.10
    Starting Nmap 7.92 ( https://nmap.org )
    Nmap scan report for 192.168.0.10
    Host is up (0.00062s latency).
    
    PORT    STATE SERVICE
    139/tcp open  netbios-ssn
    445/tcp open  microsoft-ds
    
    Host script results:
    | smb-protocols:
    |   dialects:
    |     NT LM 0.12 (SMBv1) [dangerous, but default]
    |     2.0.2
    |     2.1
    |     3.0
    |     3.0.2
    |_    3.1.1
    
    Nmap done: 1 IP address (1 host up) scanned in 0.77 seconds
  • Windows(Win10) 查詢目前 SMB 連線版本
    使用系統管理員身分執行 Windows PowerShell
    > Get-SmbConnection
    ServerName ShareName UserName     Credential   Dialect NumOpens
    ---------- --------- --------     ----------   ------- --------
    NAS        aaa       PC\user      PC\user      3.1.1   2



參考:


Linux nc 指令

nc 指令可以用來開一個 PORT 來監聽(listen),或是檢查 Server 的 PORT 是否有開(連得上)
安裝
# yum install nc

監聽 6666 PORT
# nc -lv 6666

檢查 192.168.56.3 的 80 PORT 是否有開(連得上)
# nc -v 192.168.56.3 80
# nc -zv 192.168.56.3 80

參數說明:
-l, --listen   Bind and listen for incoming connections
-v, --verbose  Set verbosity level (can be used several times)
-z             Zero-I/O mode, report connection status only(只檢查PORT是否有開,不傳送資料)

yum 指令,套件名稱匹配符號:「*」星號、「?」問號

yum 指令用「*」星號(匹配多個字元)、「?」問號(匹配一個字元),搭配關鍵字,匹配套件名稱時,須注意要使用「\」反斜線(Backslash)脫逸,

避免這些匹配符號,可能被 bash shell 先解釋了,導致 bash shell 傳給 yum 的指令沒有匹配符號


確保 bash shell 依預期將匹配符號傳給 yum 的方式:

  1. 使用「\」反斜線脫逸匹配符號
    # yum list php\*
    # yum list php-\?\?-\*
  2. 用雙引號或單引號,包住整個含有「*」星號的表達式
    # yum list "php*"
    # yum list 'php*'
    # yum list "php-??-*"
    # yum list 'php-??-*'



Red Hat 網站說明:
「All of yum’s list commands allow you to filter the results by appending one or more glob expressions as arguments.
 Glob expressions are normal strings of characters which contain one or more of the wildcard characters
 * (which expands to match any character subset) and
 ? (which expands to match any single character).

Be careful to escape the glob expressions when passing them as arguments to a yum command,
 otherwise the Bash shell will interpret these expressions as pathname expansions,
 and potentially pass all files in the current directory that match the global expressions to yum.
 To make sure the glob expressions are passed to yum as intended, use one of the following methods:
1.escape the wildcard characters by preceding them with a backslash character
2.double-quote or single-quote the entire glob expression.」



參考:

PHP 類別物件的 Covariance(協變)、Contravariance(逆變)

Covariance(協變)、Contravariance(逆變):
子類別、父類別,互相替代的問題。


Covariance(協變):原本規定是父類,但用子類取代。如果類別設計符合里氏替換原則(子類別必須能替換父類別),這通常是被允許的。
Contravariance(逆變):原本規定是子類,但用父類取代。

範例:
//一個食物類別
class Food {
    
}

//動物食物(食物類別的子類)
class AnimalFood extends Food {
    
}

//一個動物類別,有一個吃食物的方法
class Animal {

    public function eat(AnimalFood $ff) {//規定只能吃"動物食物"
        echo get_class($this) . " 吃 " . get_class($ff);
    }

}

//有一個動物收容所介面,有一個領養動物的方法,想開動物收容所,須實現此方法
interface AnimalShelter {

    public function adoption(): Animal; //規定只能領養動物類別
}
#Covariance(協變):
//1.有一個人,想要開狗收容所,所以要實現狗領養的方法
//2.收容所介面,規定只能領養 Animal 類別,但可用 Dog 子類別取代
//  原本規定是父類 Animal,但用子類 Dog 取代=>協變

class Dog extends Animal {//收容所要有狗,建立 Dog 類別 
}

//狗收容所
class DogShelter implements AnimalShelter {

    //規定只能領養Animal類別,但可用Dog子類別取代(協變)
    public function adoption(): Dog {//返回值協變
        return new Dog();
    }

}

//一個狗收容所
$ds = new DogShelter();
//從狗收容所領養了一隻動物
$aa = $ds->adoption();
//看看從狗收容所領養了什麼動物
echo "領養了:" . get_class($aa); //領養了:Dog
//這是狗,能吃AnimalFood,餵牠吃
$aa->eat(new AnimalFood()); //Dog 吃 AnimalFood
//但不能吃 Food (全部的食物)
//Fatal error: Uncaught TypeError: Animal::eat(): Argument #1 ($ff) must be of type AnimalFood, Food given
//$aa->eat(new Food());
#Contravariance(逆變):
//有一個人,想要開豬收容所,所以要實現豬領養的方法
//1.收容所要有豬,所以建立 Pig 類別,
//2.建立 Pig 類別時,才想到豬不只可吃動物食物 class AnimalFood,而是所有食物 class Food 都可以吃
//  但動物類別 class Animal 裡的 eat(AnimalFood $ff) 方法,已經限制只能吃動物食物 class AnimalFood
//3.所以只好將豬的 eat(AnimalFood $ff) 覆寫,改成 eat(Food $ff)
//  原本規定是子類 AnimalFood,但用父類 Food 取代=>逆變

class Pig extends Animal {

    //規定用AnimalFood,但覆寫後,改用Food父類取代(逆變)
    public function eat(Food $ff) {//方法參數逆變
        echo get_class($this) . " 吃 " . get_class($ff);
    }

}

//豬收容所
class PigShelter implements AnimalShelter {

    public function adoption(): Pig {
        return new Pig();
    }

}

//一個豬收容所
$ds = new PigShelter();
//從豬收容所領養了一隻動物
$aa = $ds->adoption();
//看看從豬收容所領養了什麼動物
echo "領養了:" . get_class($aa); //領養了:Pig
//這是豬,什麼都能吃,AnimalFood、Food 都餵牠吃
$aa->eat(new AnimalFood()); //Pig 吃 AnimalFood
$aa->eat(new Food()); //Pig 吃 Food



參考: