2018年11月30日 星期五

堆疊(Stack)& 佇列(Queue)

在解釋基本程式概念時,很難知道從哪裡開始。當有人開始編碼時,有大量不同的想法需要理解,吸收並最終轉化為解決方案。這取決於您所選語言的語法和特性。

最好的方法之一就是通過練習題來開始編寫程式碼。好像購物清單的使用,無論度假還是超市購物。程式碼中的列表邏輯就像在現實生活中清單一樣。清單很容易處理瑣事和片段的記憶。例如,在Python中,您可以如此建立一個購物清單(陣列)

shoppinglist = ["rice","salt","oil"]
print(shoppinglist)
['rice', 'salt', 'oil']

push() pop()
3.oil
2.salt
1.rice

這是一個陣列,因為每個值本身就是一個字串。但是陣列是動態的,您經常要做的第一件事就是新增資料,如何增加新資料是一個學問。例如,CPU如何增加法運算速度更快,或是以最好的方式將資料放在記憶體內,是從後面加好呢,還是從前面加。

堆疊
網路上大部分的人都是用疊書來做比喻,疊最高的也就是最後一本必須先拿,成為後進先出LIFO(Last In First Out)或者先進後出FILO(First In Last Out)的例子。我們也可以把它想做是Linux command列的歷史紀錄查詢一樣我們會先查最後一筆然後一直往上查,或是查看瀏覽器之前看過的頁面可以用上一頁網上查做作為後進先出的例子。

Python中可用append增加一筆資料
shoppinglist.append("tea")
print(len(shoppinglist))
4

push() pop()
4.tea
3.oil
2.salt
1.rice

Python中可用pop()取出一筆資料
shoppinglist.pop()  
print(shoppinglist)
['rice', 'salt', 'oil']

a stack
push() pop()
4.tea
3.oil
2.salt
1.rice

push()
將資料放入堆疊頂端
pop()
取出堆疊頂端之資料

心得
從最後一筆取得資料的時候處理器可以處理的較快。另外,索引也不用重建。

應用..........
CPU中斷處理
遞迴程式
十進位轉二進位
套環遊戲
字串反轉

佇列
a queue
先進先出法FIFO(First In First Out)
雖然新增或移除資料時,同步修改索引位址,浪費資源。但今日處理器的速度已經不在乎是先進先出或後進先出

shoppinglist.pop(0)     
'rice'
從第1筆取出
print(shoppinglist)     
['salt', 'oil']

pop() 1.rice 2.salt 3.oil push()

for x in range(0,len(shoppinglist)):
...  shoppinglist[x]
...  print
... 
'salt'
'oil'

陣列的建立會有一個索引來記錄目前所指到的位址,新增或移除資料時,同步修改索引位址

應用..........
大多數的程式運用

2018年11月29日 星期四

PHP超全域變數(_ENV,_REQUEST,_GLOBALS)

#超全域變數—$_ENV

#超全域變數—$_REQUEST
$_REQUEST — HTTP Request 變數
預設情況下包含了$_GET,$_POST 和$_COOKIE 的陣列。

以命令行方式運行時,將不包含argv 和argc 信息;它們將存在於$_SERVER 陣列。
import_request_variables() - 將GET/POST/Cookie 變數導入到全域作用域中

#超全域變數—$GLOBALS
$GLOBALS
引用全域作用域中可用的全部變數,一個包含了全部變數的全域組合陣列。
變數的名字就是陣列的索引。
範例:
<?php
function test() {
    $foo = "local variable";
    echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
    echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>

以上例程的輸出類似於:
$foo in global scope: Example content
$foo in current scope: local variable

PHP Note

 #php版本 

5.4
 
5.5
 
7.4

#PHP執行時的順序
php 執行中插入的javascript會等到php執行完才會執行javascript。因為php是server side會先執行然後才是client side的javascript。

#PHP 的等號
一個等號
給值的意思。例如 $a = 5; $b="equal"; $c='$a';
二個等號
等於的意思。 例如 if (a==b) do something.
三個等號
等於的意思。等於的意思。還包含類型的相等。

#PHP 如何回到上一個頁面(URL)?
被拒絕的頁面
if (!$FX_grantAccess) {//沒有權限登入
  $FX_qsChar = "?";
  if (strpos($FX_authFailedURL, "?")) $FX_qsChar = "&";
  $FX_referrer = $_SERVER['PHP_SELF']; //獲得當前頁面URL
  if (isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0) $FX_referrer .= "?" . $_SERVER['QUERY_STRING']; //獲得當前頁面URL的變數
  $FX_authFailedURL = $FX_authFailedURL . $FX_qsChar . "accessdenied=" . urlencode($FX_referrer);//沒有權限被導引到登入的頁面,並夾帶目前頁面URL變數$accessdenied
  header("Location: $FX_authFailedURL");
  exit;
}

登入的頁面
if (isset($_GET['accessdenied'])) $_SESSION['PreUrl'] = $_GET['accessdenied']; //如果有$accessdenied,紀錄上一個URL

if (isset($_SESSION['PreUrl']) && true) $redirectLoginSuccess = $_SESSION['PreUrl']; ////如果有$accessdenied,前往上一個URL
       header ("Location: $redirectLoginSuccess");
       exit;

#MySQL中使用null或空值
如果我們用SQL下插入指令,為什麼還可以插入空值呢?但用textfield插入空值為什麼就會報錯呢?
INSERT INTO "表格名" ("欄位1", "欄位2", ...) VALUES (" ", "值2", ...); 在欄位設定為 not null 可以被執行。
但用textfield插入空值為什麼就會報錯。
在SQL中,null與空字串(“”)有很大不同。空字串具體表示該值被設定為空的;null表示未設置任何值。
所以用textfield插入空值時被視為是沒有設定任何值。也就是null。
解決方法是判斷textfield沒有值時,給他一個空字串。
空值是不佔用空間的,MySQL中的NULL其實是佔用空間的。所以如果欄位可以為NULL,索引的效率會下降很多。

#在PHP中使用mb_substr解決亂碼問題
string substr(string 處理的字串, int 起始位置, int長度)
string mb_substr(string 處理的字串, int 起始位置, int長度, 編碼方式)
substr 和 mb_substr 基本上相同,但mb_substr多了一個引數,可以讓程式知道在int長度上,一個字的長度是哪一種編碼。
$str="這是一個測試字串";
echo substr($str,0,7);
這是??(亂碼)
3  3  1   byte    ASCII碼
substr()以1位元組為單位,所以中文字被切掉了。
$str="這是一個測試字串";
echo mb_substr($str,0,4,'utf8'); 或  echo mb_substr($str,0,4,"UTF-8");
這是一個
1  1  1  1   utf8

Apache-虛擬主機

虛擬主機<VirtualHost *:80></VirtualHost>
# 網站管理員email,可以隨意寫(可刪)

# 虛擬主機的根目錄 即站點的文檔(代碼目錄)
DocumentRoot 

# 虛擬主機的域名
ServerName 

# 虛擬主機的錯誤日誌 一般在apache的logs目錄下(可刪)
ErrorLog "/var/logs/dummy-host2.example.com-error.log"
   
# 虛擬主機訪問日誌(可刪)
CustomLog "var/logs/dummy-host2.example.com-access.log" common

#不要浪費時間查找IP地址
HostnameLookups Off

#命名虛擬主機需要
UseCanonicalName Off

#是否顯示apache的版本信息
ServerSignature On



Apache-資料夾設定

<Directory >
   #用新的方法管理目錄的門禁
    <IfModule !mod_access_compat.c>
    Require all denied(拒絕)
    Require all granted (允許)
    </IfModule>
   
    #mod_access_compat是舊的方法,如果此moudle存在,則用舊order,deny方法
    <IfModule mod_access_compat.c>
    Order deny,allow
    Deny from all(拒絕)
    Allow from all(允許)
    </IfModule>  
</Directory>

<Directory >
#允許在此目錄使用符號連接,讓Apache能夠連到其它的目錄去執行
FollowSymLinks

#當用戶訪問該目錄時,如果用戶找不到DirectoryIndex指定的主頁文檔(例如index.html),則返回該目錄下的文檔列表給用戶看
Indexes
e.g. Options Indexes FollowSymLinks
   
#表示允許使用.htaccess文檔重寫URL
 AllowOverride All 

#顯示目錄下所有檔案,檔案前面包含檔案類型的小圖示
IndexOptions +FancyIndexing 

#顯示目錄下所有檔案,但不包含檔案類型的小圖示
IndexOptions -FancyIndexing 

#隱藏特定的檔案, 其餘檔案正常顯示(隱藏所有的php和exe檔案)
IndexIgnore *.php *.exe 

# 要求和符号连接与其指向的目录或文件属主是同一人          
SymLinksOwnerMatch 

#讓Apache送出多國語言支援的頁面
MultiViews 

</Directory>

#單個文件的權限
<Files ".ht*">
    Require all denied
</Files>

Apache-.htaccess 改寫網址設定

#表示允許使用.htaccess文檔重寫URL
 AllowOverride All 

#/表示允許在此目錄使用符號連接
Options FollowSymLinks 

#開啟Rewrite功能
RewriteEngine On
RewriteBase /

#沒有參數,最簡單改寫
RewriteRule ^shorturl original.php
TYPE in Browser :
http://yourdomain/shorturl
Equal to :
http://yourdomain/original.php

#有參數
RewriteRule  ^shorturl/([0-9]+)-(.*)  original.php?id=$1&name=$2
^shorturl/ 是一個正規表示式,代表只要請求的 URL 中有 shorturl/ 就算符合
([0-9]+) 表示 ^shorturl/ 以後的數字
(.*) 表示 ^shorturl/ 以後的字串
$1 表示將 ^shorturl/ 以後的任何數字 ([0-9]+),接在 id= 後面
$2 表示將 ^shorturl/ 以後的任何字串 (.*) ,接在 name= 後面
([0-9]+): 表示參數值為數字
([a-z]+): 表示參數值為英文
(.*) : 表示參數萬用字元(可接受中文字)
. 任何單一字母
? 0個或是1個字母
* 0個或是N個字母
+ 1個或是N個字母
^ 表示一行的開始
$ 表示一行的結束
\ 跳脫字元(顯示符號本身)
[NC] (不分字母大小寫)
[NE] (不再輸出轉義特殊字符)
[OR] (或者, 用來與下一規則連結用)
[R] 重新導向
[F] 重新導向到 403 forbidden 頁面
[G] 重新導向到 410 forbidden 頁面
[P] 強制使用代理
[N] 重新從第一條規則開始運行
[L] 表示這是最後一條規則

例子 : original.php
<?php
$id = $_GET['id'];
$name = $_GET['name'];
?>

<!doctype html>
<html debug="true" lang="utf-8">
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<h1>This is the shorturl test.</h1>
<p>id: <span><?php echo $id; ?></span></p>
<p>name: <span><?php echo $name; ?></span></p>
</body>
</html>

TYPE in Browser :
http://yourdomain/shorturl/777-goodnumber

Equal to :
http://yourdomain/original.php?id=777&name=goodnumber


#.htaccess 分為兩部份解釋
1. 如果只是要用 .htaccess 的功能
    a. apache config file 中的 <Directory>AllowOverride 要設為 All
      <Directory "absolute path">
           AllowOverride All
       </Directory>
    b. .htaccess 中加上 Indexes 即可瀏覽目錄

2. 如果想要改寫網址
    a. apache config file 中 的 mod_rewrite 要打開(ps 不同的Linux distributions開法不同 opensuse 要改/etc/sysconfig/apache2 php5 後面加 rewrite)
     b. .htaccess 中加上 FollowSymLinks RewriteEngine On
(RewriteRule index.php test.php)

AI人工智慧

人工智能入門概念Introduction to Artificial Intelligence (AI)

AI Note

數據準備Data Preparation

機器學習Machine Learning

機器學習-回歸regression

機器學習-分類classification

機器學習-分群clustering

深度學習Deep Learning

強化學習Reinforcement learning

電腦視覺與影像分析

自然語言處理(NLP)

AI的應用

AI在農業上的應用(AI in Agriculture)

(數學)Math for Machine Learning 

圖形概念chart,diagram

OOP of PHP & Python(物件導向)

封裝Encapsulation 
物件導向的類別是一種資料結構data structure ,可以在{}中包含變數和函數。這些變數與函數統稱為“成員” ,變數被稱為其類別的“屬性”,函數被稱為其類別的“方法”。

能否從類別外部呼叫類別成員由類別宣告的方法控制。
Public
Private
Protected
Public可以從外部呼叫
private將拒絕呼外部叫類別變數,但允許內部呼叫
這種可以存儲和檢索這些變數成員的數據的方法。可以讓數據隱藏確保儲存的數據安全地封裝在類別變數成員中,是物件導向(OOP)的原理之一。

類別宣告以class關鍵字開始,後跟一個空格,然後是程序員指定的類別名稱 ,必須遵循的PHP命名約定,但以大寫開頭。接下來是類別屬性宣告,後面跟著類別方法聲明宣告。這些類似於常規變量和函數宣告,但每個都應以類別宣告開頭。類別宣告語法如下所示:

#PHP封裝
<?php
class vw {
    public $color; //宣告你要的屬性($color 不是變數)
    public function setColor($c) {
          $this->color = $c; //這裡跟函數寫法不同.如此才能被物件使用.
              return $this->color;
     }
} //類別vw

$vw = new vw;
echo $vw->setColor('none');
echo "<br>";
?>

#python封裝
class vw:
    def __init__(self,c): # 在類別內的函是參數self與c
         self.setColor = c
vwColor = vw('none') # 宣告一個類別為vw的物件
print(vwColor.setColor) # 使用物件的公開變數


繼承 Inheritance
我們可以將PHP類別創建為全新的類別,如前面示例中的類別,或者可以從現有類別“繼承”。重要的是,除了自己的成員之外,繼承類別還繼承它的父(基礎)類別的成員。從基礎類別繼承成員的能力允許創建繼承類別,這些繼承類別共享某些已在基類別中定義的公有屬性。 繼承的優點非常強大,是物件導向編程(OOP)的第二個原則。繼承類別宣告在其類名後面添加extends關鍵字,後跟它繼承的類別的名稱:

#PHP繼承
<?php
class vw {
    public $color; //宣告你要的屬性($color 不是變數)
    public function setColor($c) {
        $this->color = $c; //這裡跟函數寫法不同.如此才能被物件使用.
          return $this->color;
     }
} //類別vw

class golf extends vw { 
} //類別繼承


$vw = new vw;
$golf = new golf;
echo $vw->setColor('none');
echo "<br>";
echo $golf->setColor('red');
echo "<br>";
?>

#複寫繼承
<?php
class vw {
    public $color;
    public function setColor($c) {
       $this->color = $c;
         return $this->color;
    }
} //類別vw

class golf extends vw {
    public $year;
    public function setYear($y) {
       $this->year = $y;
         return $this->year;
     }
} //複寫繼承

$vw = new vw;
$golf = new golf;
echo $vw->setColor('none');
echo "<br>";
echo $golf->setColor('red');
echo "<br>";
echo $golf->setYear('2018');
echo "<br>";
?>


#python繼承
class vw:
    def __init__(self,c): # 在類別內的函是參數self與c
      self.setColor = c

class golf(vw): #繼承
    def __init__(self,c):
       super().__init__('golf color:'+c)

vwColor = vw('none')
golfColor = golf('red')
print(vwColor.setColor)
print(golfColor.setColor)

#python繼承複寫
class vw:
    def __init__(self,c): # 在類別內的函是參數self與c
      self.setColor = c

class golf(vw):
    def __init__(self,c):
      super().__init__('golf color:'+c) #繼承

def setYear(self):
      return '2018'

vw = vw('none')
golf = golf('red')

print(vw.setColor)
print(golf.setColor)
print(golf.setYear()

#python複寫函式,新增參數
class vw:
    def __init__(self,c): # 在類別內的函是參數self與c
      self.setColor = c
    def setYear(self):
          pass

class golf(vw): #繼承
    def __init__(self,c,door):
          super().__init__('golf color:'+c)
          self.door = door

    def setYear(self):
           return '2018'

vw = vw('none')
golf = golf('red',4)

print(vw.setColor)
print(golf.setColor,',doors:',golf.door)
print('year:',golf.setYear())


多型Polymorphism
物件導向編程(OOP)的三個基石是封裝,繼承和多型。在前面我們已經了解瞭如何將數據封裝在PHP類別中,以及如何繼承其類別的屬性,因此我們現在可以探索多型的原理。“多型”(來自希臘語,意思是“許多形式”)描述了根據其上下文為實體分配不同含義或目的的能力。例如,在現實世界中,每個人都知道如何使用按鈕(實體) - 您只需對其施加壓力即可。但是,該按鈕的作用取決於連接到它的內容(上下文),但結果不會影響該按鈕的使用方式。在物件導向編程的世界中,多型允許類別在共享公有接口時具有不同的功能。取用物件時不需要知道它正在使用哪個類別,因為它們像真實世界按鈕一樣,都以相同的方式使用,但可以產生不同的上下文結果。以這種方式擁抱多型態使程序員能夠創建可根據需求選擇的可互換對象,而不是通過條件測試。 PHP接口類似於類,但是使用interface關鍵字聲明,並且只能包含方法定義,而不包含要執行的任何方法語句,如下所示:

實現接口的每個類別必須通過指定要執行的語句來實現它定義的所有方法。通過在其聲明中包含implements關鍵字和接口名稱,將類附加到接口,如下所示:

#PHP多型
<?php
interface vw {
     public function setColor($c);
     public function setYear($y);
}

class golf implements vw {
     public $color;
     public function setColor($c) {
          $this->color = $c;
            return $this->color;
     }

      public $year;
      public function setYear($y) {
          $this->year = $y;
            return $this->year;
      }
}

#繼承
class passat extends golf{
}

$golf = new golf;
echo "golg color:".$golf->setColor('red');
echo "<br>";
echo "golf years:".$golf->setYear('2018');
echo "<br>";

$passat = new passat;
echo "passat color:".$passat->setColor('black');
echo "<br>";
echo "passat years:".$passat->setYear('2017');
echo "<br>";
?>

#python多型
class vw:
    def __init__(self,c): # 在類別內的函是參數self與c
      self.setColor = c
    def color(self):
          return self.setColor
    def setYear(self):
          pass

class golf(vw): #繼承
    def __init__(self,c):
          super().__init__('golf color:'+c)

    def setYear(self):
          return ',years:2018'

class passat(): #多型
    def __init__(self,c):
          self.setColor = 'passet color:'+c
    def color(self):
          return self.setColor
    def setYear(self):
         return ',years:2017'

    def vwShow(obj):
         print(obj.color(), obj.setYear())

vw = vw('none')
vwShow(vw)
golf = golf('red')
vwShow(golf)
passat = passat('black')
vwShow(passat)

#python多型(簡化)
class vw:
    def __init__(self,c): # 在類別內的函是參數self與c
        self.setColor = c
    def color(self):
        return self.setColor

class golf(vw): #繼承
    def __init__(self,c):
         super().__init__('golf color:'+c)


class passat(): #多型
    def __init__(self,c):
        self.setColor = 'passet color:'+c
    def color(self):
       return self.setColor

    def vwShow(obj):
        print(obj.color())

vw = vw('none')
vwShow(vw)
golf = golf('red')
vwShow(golf)
passat = passat('black')
vwShow(passat)


#多型(與繼承無關)
class vw:
    def __init__(self,c): # 在類別內的函是參數self與c
         self.setColor = c
    def color(self):
        return self.setColor

class passat(): #多型(與上面相同的函示)
    def __init__(self,c):
         self.setColor = 'passet color:'+c
    def color(self):
        return self.setColor

    def vwShow(obj):
         print(obj.color())

vw = vw('none')
vwShow(vw)
passat = passat('black')
vwShow(passat)