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

networking note

網路速度無法升級:
中華電信拿不到路權

Library,Module,framwork

digital數位 vs analog類比

類比信號
在進一步討論之前,我們應該談談信號實際上是什麼,特別是電子信號。 我們所談論的信號是隨時間變化的“數量”,它們傳達某種信息。 在電氣工程中,時間變量通常是電壓(如果不是電壓,通常是電流)。 因此,當我們談論信號時,只需將它們視為隨時間變化的電壓。

信號在設備之間傳遞,以便發送和接收信息,信息可以是視頻,音頻或某種編碼數據。 通常信號通過電線傳輸,但它們也可以通過射頻(RF)波傳播到空中。 例如,音頻信號可能會在計算機的音效卡和揚聲器之間傳輸,而數據信號可能會通過平板電腦和WiFi路由器之間的空氣傳遞。

*類比信號圖
由於信號隨時間變化,因此將其繪製在圖表上是有幫助的,其中時間繪製在水平,x軸上,電壓繪製在垂直y軸上。 查看信號圖表通常是識別類比或數位信號的最簡單方法; 類比信號的時間 - 電壓圖應該是連續的。



雖然這些信號可能被限制在最大值和最小值的範圍內,但在該範圍內仍然存在無限數量的可能值。 例如,從牆壁插座出來的類比電壓可能會被限制在-120V和+ 120V之間,但是,隨著您越來越多地增加分辨率,您會發現信號實際上可以有無數個值(如64.4V) ,64.42V,64.424V,以及無限,越來越精確的值)。

*類比信號例子
純音頻信號也是類比信號。 唱盤發出的信號充滿了類比頻率和諧波,結合起的失真波來製作出優美的音樂。



數位信號
數為信號必須具有一組有限的可能值。 集合中的值的數量可以是兩個之間的任何值,也可以是非常大的數量,這不是無窮大。 最常見的數字信號將是兩個值之一 - 如0V或5V。 這些信號的時序圖看起來像方波。


*數位訊號讀取來源: 音樂光碟





*取樣頻率:
數位訊號取樣量化後,若取樣頻率增加波形也越近平滑





類比和數位電路
*類比電子
大多數基本電子元件 - 電阻,電容,電感,二極體,電晶體和運算放大器 - 都具有固有的類比性。 僅使用這些組件構建的電路通常是類比的。



類比電路通常是運算放大器,電阻,電容和其他基礎電子元件的複雜組合。例如簡單的音樂盒就只有這些電子元件。



類比電路可以是具有許多組件的非常優雅的設計,或者它們可以非常簡單,例如兩個電阻組合以形成分壓器。 但是,一般而言,類比電路的設計要比以數位方式完成相同任務的類比電路要困難得多。 需要一種特殊的類比電路嚮導來設計類比無線電接收器或類比電池充電器; 存在數位組件以使這些設計更加簡單。



*數位電子
數位電路使用數位離散信號進行操作。 這些電路通常由電晶體和邏輯閘的組合構成,並且在更高級別上由微控制器或其他計算芯片組成。 大多數處理器,無論它們是計算機中的強大處理器,還是小型微控制器,都在數位領域中運行。

數位電路使用諸如邏輯閘之類的組件,或者更複雜的數位IC(通常由具有從其延伸的標記引腳的矩形表示)。

數位電路通常使用二進位方式進行數位指令。 這些系統將兩個不同的電壓分配為兩個不同的邏輯電平 - 高電壓(通常為5V,3.3V或1.8V)代表一個值,低電壓(通常為0V)代表另一個。




數位 vs 類比
類比電路通常更容易受到被雜訊干擾(電壓的小的,不希望的變化)。 類比信號的電壓電平的微小變化在處理時可能產生顯著的誤差。

數位系統在運算的過程中所處理的信號電壓不是高(代表1的電壓)就是低(代表0的電壓),高低之間會留有一段容易區分的距離,此種距離容忍了一些雜訊的重疊干擾,使得數位系統分辨代表數值的高低信號不至錯亂,所以運算的結果也是穩定精確的。然而,類比系統將小信號直接透過(電晶體)放大器放大,在放大的同時雜訊也跟著被放大了,其放大的結果就可想而知了。

雖然數位電路通常更容易設計,但它們往往比同等任務的類比電路貴一點。




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-CGI配置

#Alias CGI目錄
<IfModule alias_module>
   ScriptAlias  /cgi-bin/    "/srv/www/vhosts/dummy-host.example.com/cgi-bin/"(ScriptAlias指向的位置)
</IfModule>

#執行CGI
<Directory >
Options +ExecCGI (執行CGI)

#Options 可用 + 為加上設定 - 為取消 ,是指加入前一層目錄的設定之意,比方說第一層的 Options 有none或其屬性,下一層如果要繼承上一層屬性,就要用加號。如果沒有加號,就是重新所有設定而沒有繼承。
</Directory >

#addhander
addhandler cgi-script .cgi .pl .py
(if handler not exist, handler will see cgi files as text files 
no options ExecCGI otherwise meet Access forbidden)

#filename$的CGI擋都可以不用副檔名
<FilesMatch filename$>
    SetHandler cgi-script
</FilesMatch>

#所有CGI擋都可以不用副檔名,但要小心會跟資料夾衝突
<FilesMatch "^[^\.]+$">
  SetHandler cgi-script
</FilesMatch>

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)

Apache-啟動多少個服務器進程

server-tuning.conf
Apache 實際的運作,其實都是以可同時「多 process」執行的程式模組進行,稱為 MPM (Mutil-Processing Module)。
MPM 有兩種:prefork 和 worker。

ServerLimit 150 (ServerLimit 的設定應「大於等於」底下的 MaxClients)
StartServers 5 (apache 一執行時的 process數,也就是可同時處理的 request 數)
MinSpareServers 5
MaxSpareServers 10
MaxClients 150 (官方的定義就是「最大可同時處理的 connection 數」)
MaxRequestsPerChild 10000 (一個「Apache sever」在處理該數目後,會自動中止並重啟,以防 memory leakage。)