簡易的防火牆 – UFW & GUFW

從 2008 年開始 Ubuntu 8.04 LTS 多了個簡單的防火牆「UFW (Uncomplicated Firewall)」,它簡化了 iptable 複雜的指令及參數,讓人們能快速上手,之後更出現了圖形介面的 GUFW (甚至連指令都免了)。原先為了 Ubuntu 而誕生的 UFW 現在也成功移植到基於 Debian 發展的 GNU/Linux (ezgo, Linux Mint) 以及 Arch Linux。 來源

UFW
若系統尚未預載 UFW,請手動安裝

# Debian, Ubuntu
$ sudo aptitude install ufw 

# Arch Linux
$ sudo pacman -S ufw

基礎操作

狀態查詢,預設為閒置 (inactive)

$ sudo ufw status
Status: inactive

啟動 UFW 服務 (enable)

$ sudo ufw enable

預設 (default) 全部阻擋 (deny)

$ sudo ufw default deny

允許 (allow) 所有的 ssh 埠口連線

$ sudo ufw allow ssh

允許來自 127.0.0.1 (本機) 的 3389 埠口連線 (xrdp)

$ sudo ufw allow from 127.0.0.1 to any port 3389

狀態查詢,已成功啟動 (active) 並加入自訂規則

$ sudo ufw status
Status: active

To            Action    From
--            ------    ----
22            ALLOW     Anywhere
3389        ALLOW     127.0.0.1

進階使用

允許來自 192.168.1.2 上所有連線

$ sudo ufw allow from 192.168.1.2

允許來自 192.168.2.1 ~ 192.168.2.254 的所有 22 埠口連線

$ sudo ufw allow from 192.168.2.1/24 to any port 22

阻擋來自 110.88.4.5 的 22 埠口連線

$ sudo ufw deny from 110.88.4.5 to any port 22

阻擋來自 27.16.3.1 ~ 27.16.3.254 的所有連線。

$ sudo ufw deny from 27.16.3.0/24

Ubuntu 20.04 安裝 Laravel

Step1. install Apacher Server
sudo apt install apache2

執行apache2伺服器

sudo sytemctl start apache2

開機啟動apache2

sudo systemctl enable apache2 

測試apach2執行情形

sudo systemctl status apache2
Step2. Installing PHP and its additional plugins

安裝PHP

sudo apt install php libapache2-mod-php php-mbstring php-cli php-bcmath php-json php-xml php-zip php-pdo php-common php-tokenizer php-mysql

測試安裝情形

php -v
Step3. creating a database

安裝MariaDB伺服器

sudo apt install mariadb-server

執行Mariadb

sudo mysql -u root -p

執行SQL語法

CREATE DATABASE laravel_db;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'secretpassword';
GRANT ALL ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
QUIT;
Step 4: Install Composer

執行”連線到安裝網站,使用PHP安裝”

$ curl -sS https://getcomposer.org/installer | php

安裝完後設定

sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
composer --version
Step 5: Install Laravel 8 on Ubuntu
cd /var/www/html
sudo composer create-project laravel/laravel laravelapp
sudo chown -R www-data:www-data /var/www/html/laravelapp
sudo chmod -R 775 /var/www/html/laravelapp/storage
cd laravelapp
php artisan
Step 6: Configure Apache to serve Laravel

 建立laravel.conf檔案

<VirtualHost *:80>
ServerName example.com
ServerAdmin admin@example.com
DocumentRoot /var/www/html/laravelapp/public
<Directory /var/www/html/laravelapp>
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

執行下列兩個指令,讓他們進入Apache rewiter 模組

sudo a2ensite laravel.conf
$ sudo a2enmod rewrite

重新啟動apache2

sudo systemctl restart apache2
Step 7: Run Laravel in a web browser

網站在 /var/www/html/laravelapp/public

使用Laravel8 PHP(一)

類別class

class.php

<?php  //class.php

echo "<head>
  <meta charset='utf-8'>
  <meta name='description' content='Free Web Tutorial'>
  <meta name='author' content='wwesbake'>
</head>
";

class Dog
{
	public $age;

	public function sayAge()
	{
		echo "我的年齡 {$this->age} 歲";
	}
}

$myDog = new Dog();
$myDog->age=1;
$myDog->sayAge();

?>

__condtruct(建構子)以及__destruct(解構子)

class Dog
{
	public $age;
	//規定建立類別一定要給年齡參數
	
	public function __construct($age)
	{
		echo "旺旺旺, 我誕生了!<br>";
		$this->age=$age;
	//前面是類別自身屬性,後方是建立物件時傳入的值
	}

	public function sayAge()
	{
		echo "我的年齡{$this->age} 歲";
	}

	public function __destruct()
	{
		echo "<br/> PHP程式執行結束 Dog Class關閉";
	}
}

$myDog = new Dog(1); //建立實體物件執行__construct()內的動作
$myDog->sayAge();
說明
public $age; 1.<--屬性

public function satAge()
{
echo "我的年齡 $this->age 歲"; 2.<--方法
} 3.使用自身的屬性要加$this關鍵字

注意
要在方法中使用自身類別的屬性,必須使用關鍵字$this來取得屬性值,只使用$age會讀不到值,必須使用$this->age。

繼承(Extends)

<?php  //extend.php

echo "<head>
  <meta charset='utf-8'>
  <meta name='description' content='Free Web Tutorial'>
  <meta name='author' content='wwesbake'>
</head>
";

class Animal
{
	public $age;

	public function sayAge()
	{
		echo "我的年齡 {$this->age} 歲";
	}
}

class Dog extends Animal
{
	//內容為空
}

class Cat extends Animal
{
	//內容為空
}

$myDog = new Dog();
$myDog->age=1;
$myDog->sayAge();
echo "<br/>--HR--<br/>";
//產生了新的物件
$myCat = new Cat();
$myCat->age=2;
$myCat->sayAge();

?>
說明
Animal 類別是 Dog、Cat的父類別,反之Dog、Cat都是Animal的子類別,可以看到子類別的內容都是為空,但Dog、Cat產生實體物件,可以設定年齡以及執行顯示年齡的方法,讓我們不用重複撰寫一樣的程式碼,父子類別它們在意義上是有關係的才使用繼承,以上我們都使用public存取權限,繼承後子類別擁有父類別的所有屬性以及方法。

封裝(Encapsulation)

<?php

echo "<head>
  <meta charset='utf-8'>
  <meta name='description' content='Free Web Tutorial'>
  <meta name='author' content='wwesbake'>
</head>
";

class Animal
{
	public     $name;    //存取權限public
	protected  $age;     //存取權限protected
	private    $weight;  //存取權限private

	public function __construct($name, $age, $weight)
	{
		$this->name = $name;
		$this->age = $age;
		$this->weight = $weight;
	}

	public function animalShowData()
	{
		echo "暱稱: {$this->name} <br>";   //正常讀取
		echo "年齡: {$this->age} <br>";    //正常讀取
		echo "體重: {$this->weight} <br>"; //正常讀取
	}
}

class Dog extends Animal
{
		public function dogShowData()
		{
			echo "暱稱: {$this->name} <br>";   //正常讀取
		  echo "年齡: {$this->age} <br>";    //正常讀取
		  echo "體重: {$this->weight} <br>"; //無法讀取
		}
}


$myDog = new Dog('多多', 3, '3kg');
//$myDog->animalShowData(); //正常顯示屬性

echo $myDog->name;   //正常讀取
echo $myDog->age;    //無法讀取
echo $myDog->weight; //無法讀取

//$myDog->dogShowData();  //無法讀取$weight變數
?>

介面(Interface)

一個類別只能繼承單一類別,但可以實作多個介面,介面用於更抽象的定義,例如狗的類別有年齡的方法,人類也有年齡的方法要實作,但計算方式可能略為不同,可以建立Age介面,在其中定義,讀取年齡的方法...如果類別有年齡的特性,可以於該類別使用Age介面,類別就要實作Age介面中定義的所有方法,也可以建立一個Foot介面定義用腳可以跑步、走路...。
//1.介面 Age 使用interface 宣告介面Age
interface Age
{
	public function getAge();
}

interface Foot
{
	public function run();
	public function walk();
}


//2.Dog 類別使用implrmrnts 實作Age介面的定義
class Dog implements Age, Foot
{
	public $age;

	public function getAge()
	{
		 return $this->age * 7 . "<br>";
	}

	public function run()
	{
		 return "我用四隻腳跑步<br>";
	}

	public function walk()
	{
		 return "我用四隻腳走路<br>";
	}
}

$dog = new Dog();
$dog->age = 1;
echo $dog->getAge(); // 7
echo $dog->run();    // 我用四隻跑步
echo $dog->walk();   // 我用四隻腳走路

注意介面中只能定義常數以及public 存取權限的抽象方法。

SQL指令語法速查手冊(十)

函數語法

彙總函數

AVG

語法
AVG <數值式>

範例
SELECT AVG(price) FROM store;

COUNT

語法
COUNT 欄位

說明
COUNT函數是用來計算指定的欄位中值有多少列的函數,COUNT會計算欄位內非NULL的列數。但是,單純的想要計算所有的列數情況下,要透過「*」指定。在指定「*」的情況下,會將NULL值的列也計算進去。
COUNT中可以指定的指令有ALL與DISTINCT兩種。沒有設定特定指令的話,預設會使用ALL。如果指定DISTNCT的話,在指定欄位中重複的值就只會被計算一次。也就是說可以用來計算多少不同的值。

範例
取得所有的列數目
SELECT COUNT(*) FROM store;

取得有幾種不同的分類
SELECT COUNT(DISTINCT class) FROM store;

MAX

語法
MAX <數值式>

說明
取得指定欄位中最大值。

範例
取得price欄位的最大值
SELECT MAX(price) FROM store;

計算各群組的最大值
SELECT class,MAX(price) FROM store GROUP BY class;

MIN

語法
MIN <數值式>

範例
SELECT MIN(price) FROM store;

SELECT class,MIN(price) FROM store GROUP BY class;

STDDEV

語法
STDDEV <數值式>

說明
STDDEV函數式用來求引數中指定的<數值式>標準差的函數。但是使用者要注意,在PostgreSQL、Oracle式回傳標準差,而MySQL則是回傳母體標準差。

範例
STDDEV函數計算標準差
SELECT STDDEV(price) FROM store;

計算各個群組的標準差
SELECT class,STDDEV(price) FROM store GROUP BY class;

SUM

語法:
SUM <數值式>

說明:
SUM函數是用來求取數值式的總和的函數,SUM會計算在引數內<數值式>中指定數值欄位的總和並回傳。在SUM中也可以指定ALL以及DISTINCT指令。指定DISTINCT的話,在指定的數值欄位中如果有相同的值情況下,只會計算第一個出現的計算對象。ALL的話則會計算所有的值。

範例:
SELECT SUM(price) FROM store;

SELECT class,SUM(price) FROM store GROUP BY class;

VARIANCE  變異數

語法:
VARINCE <數值式>
求指定數值的變異數值。

字串函數

ASCII

語法:
ASCII <字串>

說明:
ASCII函數是用來將指定文字轉為ASCII碼,並傳回ASCII碼的函數。在指定多個字串的情況下,會傳回開頭第一個ASCII碼。

範例:
SELECT name,ASCII(name) FROM store;

CHAR

語法:
CHAR <數值式>

說明:
CHAR函數是用來將引數中指定的ASCII碼轉回對應字元的函數。

範例:
SELECT CHAR(99),CHAR(100),CHAR(101);