危機解除

長久以來一直把我的學習資料、生活點滴,各放置在google及自己的wordpress,再加上自己測試用的網站。算一算,總共要三個網站要維護,其中兩個網站是放在自己架設的伺服器中。

自己架伺服器好處是,可以順便學學Linux、mysql、php。讓我不只接觸php也學shell scrip、SQL語言。

主機的位址是用中華電信的IP,我的電信費用讓我可以擁有一個I固定IP跟七個浮動IP,想架站就必須先解決IP的問題,於是我先申請一個固定IP,並研究如何把家裡的分享器設定指向一台伺服器。解決了固定IP,就變成Domain Name了。

今年七月忍不住先申請了免費的DNS,是用myddns申請的。但是,他的免費性質,造成有很多雜七雜八的網站來申請,其中有色情、有詐騙得。導致此網域,被臺南市網解析為不受歡迎網站,而無法從學校端連網。於是我在九月申請了中華電信的Domain Name:wwesbake.idv.tw,每年400元,金額還可以。解決了Domain Name的問題,另一個則是SSL。

每次看著自己的網站連結總是出現不安全的訊息,總是讓我很在意。於是查一下中華電信的SSL服務,一年竟然要3000元這麼多。昨天(10/13)查一查有沒有免費不用錢的,就找到Certbot這個服務。還蠻好裝的,一下子就起來了,用起來也沒什麼問題。所以SSL也起來,真是開心!

心雪來潮試試網站裡的運動程式,竟然會出現一些問題,是可以用程式判斷來解決。可是登入時產生迴圈的問題,不知道該怎麼解決?一時慌張亂了頭緒,於是,就把Certbot移除,可是變成apache2出現問題,重新安裝apche2,PHP也出現錯誤。三個網站有兩個網站無法開啟,網站上的心得資料也打不開。

這時還好有google網站,讓我平時維護的心得資料可以用得上,今天(10/14)早上終於可以運作了。

所以,多做一點是好事!
不急,有事慢慢解決!
下次要慢慢的思考,不要慌!不要慌!

免費SSL

何謂SSL

為了讓使用者於瀏覽網頁時安全地傳輸資料,特別是具備後台管理或輸入個人機敏資料的網站,應該使用網站資料傳輸加密協定(如HTTPS),透過SSL憑證加密後讓資料傳輸更安全,並且若網站升級採用新一代的HTTP/2的網頁傳輸協定,其先決條件就是必須使用HTTPS加密。

一般而言要使用加密傳輸,若不是使用系統自發憑證(使用Chrome瀏覽器閱讀時會出現「不安全的憑證」),便需要向第三方以支付年費方式購買SSL憑證,本說明將提供於伺服器上安裝免費的憑證(以Let’s Encrypt為例)教學文件,為大家的網頁傳輸加密。          資料參考:師大資訊中心

申請及使用

Let’s Encrypt是由各大非營利團體為了推廣 HTTPS 而推出免費 SSL/TLS憑證服務,每次申請有效期為3個月,並可設定自動更新憑證。

我是主機的擁有者,所以選擇安裝Certbot軟體。

1.選擇 apache+Linux(snap)

2.ssh登入主機安裝snapd

sudo apt update
sudo snap install --class certbot

3.Prepare the Certbot command

sudo ln -s /snap/bin/certbot /usr/bin/certbot

4.Choose how you’d like to run Certbot

sudo certbot --apache

5.Test automatic renewal

sudo certbot renew --dry-run

後記:

安裝後運動程式會有問題,必須下判斷式去判斷。

發現網站加了SSL後,運動網站有點問題。
目前解決方式:
/include/config.php
加上判斷
//URL
if($_SERVER["HTTP_HOST"]=="wwesbake.idv.tw"){
   define('ROOT_URL' , "https://". $_SERVER["HTTP_HOST"] ."/$web_name/") ; 
}else{
   define('ROOT_URL' , "http://". $_SERVER["HTTP_HOST"] ."/$web_name/") ;
}

除了要加判斷式之外,登入時轉址還會出現錯誤。檔案在:/var/log/apache2 的 error.log檔

造成網頁出不來,移除Certbot,卻出現無法執行apache2的情形。

重裝apache2連帶影響php5.5,到我的google網站去看教學。安裝了php5,只有裝部份的php5模組,真是糟糕!爬一爬文章,再加上自己的判斷,終於是在10/13晚上裝好了,可是自己的網站還是不行。不過,phpmyadmin竟然可以跑,心比較平靜一點,因為資料還在就好。抱著忐忑的心去睡覺吧!

早上(10/14)起床,突然想一想應該是php.ini設定的問題。果然是

Short_open_tag 要設定on
display_errors 設定on
php.ini 檔案位置

設定好就可以執行了。

Pear 安裝 DB套件

主機  Ubutu 14.04.06 + PHP5.5

下 pear list 指令  

沒有安裝DB套件

先升級 pear 

pear  install  PEAR-1.10.10

再安裝 DB套件

pear install DB

就有DB的套件了

引入 DB

require “DB.php”;

連接mysql資料庫

$dsn = "mysql://{$mysql_user}:{$mysql_pass}@{$mysql_host}/{$db_name}";
$dbCon = DB::connect($dsn);
$sqlstr=" select * from gov ";
$sth = $dbCon->query($sqlstr);

三種取值方法

Method-1
$row = $sth->fetchRow(DB_FETCHMODE_ASSOC);
print "first".$row[gov_code]."-".$row[login_pass]."
";

Method-2
$row1 = $sth->fetchRow(DB_FETCHMODE_OBJECT);
print "second".$row1->gov_code."-".$row1->login_pass."
";

Method-3
$row2 = $sth->fetchRow();
print "third".show_array($row2)."
";

設定中文編碼UTF8

$dbCon->query('SET NAMES utf8');

誇張的媒體、政黨

傳賴清德飆罵將官?栗正傑轟三軍統帥竟不懂軍人禮節:丟臉、凸顯他沒威望

報導說:賴總統在晉升場合,當場翻臉罵人!

這是把讀者當成白癡嗎~有人會自動把醜態公開給大家看嗎?
會做出這種舉動的,一定是自己平時也會這樣做的人吧!自動把別人也類化為同種人。這也說明難怪某些政黨出國時,會出現以下的新聞。

週刊指凌濤訪美耍官威 國民黨:惡意扭曲

The ballman says: I am also agree that!

驚險的賽事平安過去了

賽事名稱-113年臺南市長盃國小田徑賽

這次是我幫忙接手後,第 一次,從建置資料庫、完成報名、編排秩序冊、賽道、輸入紀錄、印獎狀、填入總錦標,各種階段我從頭到尾參與的。

比賽第一天,就發生管理者帳號無法登入。solved!

第二天騎車的途中,建璋跟我說:網站沒有線上可以讓學校自行填報接力選手的介面。 solved!

第三天,有學校私底下提出,有學校選手參加四項比賽,看能不能抓出違規。solved!

第三天下午,要結束前計算總錦標,有學校發現總錦標沒有把全能成績加進去。solved!

真是緊湊的一個星期啊!

PHP4-chap7

正規表式

程式碼

//'7'正規表示式
$session_name = $session_txt['7.1'];
echo $session_name."<br>";
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    ereg()   int ereg(string pattern, string string [, array regs])<br>
    這函式會以pattern 中所指定的正規表示式來搜尋對應字串,並以陣列方式傳回。	
<br>
</fieldset>
";
echo $message."<br>";

//$datesever=$_SERVER['REQUEST_TIME'];
//echo $datesever."<br>";
$datestr=date("m-d-Y");
echo $datestr."<br>";
$date = $datestr;

if (ereg("([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})", $date, $regs)){
	echo ("$regs[2].$regs[1].$regs[3]");
}else{
	echo ("Invalid date format: $date");
}
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    ereg_replace()   (string pattern, string replace, string string )<br>
    這是個將字串中的pattern 以replacement來代替的函式。這個函式會傳回所找到並加以修改<br>
	過的字串加以運用。
	
<br>
</fieldset>
";
echo $message."<br>";

$num = '10';
$string = 'Ten Little Indians sitting ....';
echo "Befor: ". $string."<br>";
$string = ereg_replace('Ten', $num, $string);
echo "After: ". $string."<br>";

echo $breakstr."<br>";
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    eregi()   int ereg(string pattern, string string [, array regs])<br>
	這個函式和ereg()相同,只不過它忽略了對應到字母字元的狀況。<br>
	eregi_replace()   (string pattern, string replace, string string )<br>
	這個函式和ereg_replace()相同,只不過它忽略了對應到字母字元的狀況。<br>
<br>
</fieldset>
";
echo $message."<br>";
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    split()   array split(string pattern, string string [, int limit])<br>
	這個函式會傳回一個字串陣列,其中每一個都是以正規表示式pattern所形成的子字串的邊界所<br>
	區隔而成的字串。當limit引數有指定時,則所傳回的陣列會包含最多limit個元素,而其餘的<br>
	元素則包含在string引數中。<br>
	spliti()和split()相同,只不過它在對應字母時會忽略大小寫。
<br>
</fieldset>
";
echo $message."<br>";

$date = "19/Sep/1966 is my date of birth";

$array_date = split('[/.-]', $date, 4);
echo "Day: ".$array_date[0]. "Month: ".$array_date[1]."
		Year:". $array_date[2];
echo "<br>";
echo $array_date[3];


echo $breakstr."<br>";

PHP4-chap5

物件導向

程式碼

//'5.3'以PHP進行物件導向程式設計-繼承
$session_name = $session_txt['5.3'];
echo $session_name."<br>";

//這個方法比較複雜
$mediaItems = array();
$books = array();
$cds = array();

$item->id			=1;
$item->type			="book";
$item->name			="Professional PHP4";
$item->inStock		=33;
$item->price		=49.95;
$item->rating		=5;
$mediaItems[]	=$item;

$book->isbn			=124465343442;
$book->author		="Ken Egervari";
$book->numberOfPages	=500;
$books[$item->id]	=$book;

$item->id			=2;
$item->type			="cd";
$item->name			="This way";
$item->inStock		=120;
$item->price		=16.94;
$item->rating		=4;
$mediaItems[]	=$item;

$cd->serialNo		=323254354;
$cd->artist			="Jewel";
$cd->numberOfTradks	=13;
$cds[$item->id]	=$cd;

foreach ($mediaItems as $item){
	echo ("Name: " .$item->name. "<br>");
	echo ("Items in stock: " .$item->inStock. "<br>");
	echo ("Price: " .$item->price. "<br>");
	echo ("Rating: " .$item->rating. "<br>");
	
	switch ($item->type){
		case 'cd':
			echo ("Serial No: " .$cds[$item->id]->seriaNo. "<br>");
			echo ("Artist: " .$cds[$item->id]->artist. "<br>");
			echo ("# of Tracks: " .$cds[$item->id]->numberOfTradks. "<br>");
			break;
			
		case 'software':
			break;
		
		case 'movie':
			break;
			
		case 'book':
			break;
	}
}

//用class 繼承 extends
//Media.php
define ("MIN_RATING", 0);
define ("MAX_RATING", 5);


class Media
{
	var $id;
	var $name;
	var $inStock;
	var $price;
	var $rating;
	
	function Media ($id,$name,$inStock,$price,$rating)
	{
		if ($inStock < 0) $inStock = 0;
		if ($price < 0) $price =0;
		if ($rating < MIN_RATING) $rating = MIN_RATING;
		if ($rating > MAX_RATING) $rating = MAX_RATING;
			$this->id = $id;
			$this->name = $name;
			$this->inStock = $inStock;
			$this->price = $price;
			$this->rating = $rating;
	}
	
	function buy()
	{
		$this->inStock--;
	}
	
	function display()
	{
		echo "name: " .$this->name. "<br>";
		echo "Items in stock: " .$this->inStock. "<br>";
		echo "Price: " .$this->price. "<br>";
		echo "Rating: " .$this->rating. "<br>";
	}
}

//Book.php
class Book  extends Media
{
	var $isbn;
	var $author;
	var $numberOfPages;
	
	function Book($id, $name, $inStock, $price, $rating,
				  $isbn, $author, $numberOfPages)
	{
		$this->Media($id, $name, $inStock, $price, $rating);
		$this->isbn = $isbn;
		$this->author = $author;
		$this->numberOfPages = $numberOfPages;
	}
	
	function display()
	{
		Media::display();
		
		echo "ISBN: ". $this->isbn. "<br>";
		echo "Author: ". $this->author. "<br>";
		echo "number of pages: ". $this->numberOfPages. "<br>";
	}
					  
}		 
		
$book = new Book(0,'PHP Programming',23,59.99,4,'124-4333-4443',
					'Ken Egervari',1024);
$book->display();
			


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    class檔案:Media.php、主程式檔:Book.php<br>
	要注意的是,我們所有的媒體在建構後都有相同的行為。所有的display()方法<br>
	都不受引數,並且會適當地顯示每一個不同媒體項目。
<br>
</fieldset>
";
echo $message."<br>";