2017年10月15日 星期日

如何更改 Docker image 預設安裝資料夾

如何更改 Docker image 預設安裝資料夾

一開始規劃 ubuntu partition 的時候,/var 雖然有獨立成一個新的 partition,但因為有特別安排了一個 partition 專門給 MariaDB(MySQL)使用,所以 /var 也就沒有給的特別大。這一陣子開始使用 docker 作為開發環境,docker 的 image 預設是儲存於 /var/lib/docker 路徑下,會佔用 /var 很多空間,希望能將預設的路徑移到別的 partition。

在不同版本的 Linux 下設定方式會有些不同,在 Stackoverflow 有許多討論,另外在 Travis 這篇文章 中也有直接提供一個 shell script 可以修改 ubuntu 16.04 下的預設路徑。

Docker doc 中發現官方的設定,相對簡單,在自己嘗試後可以適用,分享我在 ubuntu 16.04 下的設定方式,設定後不用重新開機即可套用。

OS:Ubuntu 16.04.3 LTS (Xenial Xerus)
Docker Version17.09.0-ce

Docker daemon 設定檔

Docker 官方建議的方式為在 daemon.json 檔案中設定 daemon flags,daemon.json 在 Linux 中預設位置在 /etc/docker/。在 ubuntu 16.04 中預設這個檔案不存在,可以手動新增這個檔案。

$ sudo vim /etc/docker/daemon.json

在檔案中加上下面的內容,graph 為執行與存放的路徑位置:

{
    "graph": "/mnt/docker-data",
    "storage-driver": "overlay"
}

更新修改內容與重新啟動 Docker

更新套用修改內容:

$ sudo systemctl daemon-reload

重新啟動 Docker:

$ sudo systemctl restart docker

重新啟動後,在 graph 指定的資料夾下(/mnt/docker-data)就會出現相關的資料夾。


資料參考連結:
1.https://stackoverflow.com/questions/24309526/how-to-change-the-docker-image-installation-directory
2.https://sysinfo.io/ubuntu-16-04-move-docker-root/
3.https://docs.docker.com/engine/admin/systemd/#start-automatically-at-system-boot

Categories: , ,

2017年10月9日 星期一

SSH tunnel 方式連結限制區域的伺服器

SSH tunnel 方式連結限制區域的伺服器

自從進了前公司,好久沒有時間好好的更新部落格內容了。近期離開待了將近兩年的公司,和好朋友一起創立了新的新創公司,一起在農業上用技術來幫助返鄉的青小農,希望讓用更有溫度的數據來降低青農們的門檻。

新的開始新的期待,希望自己能繼續保持赤子熱忱,把研究過的方法記錄下來分享。

在這個資安即國安的時代(嗯…那是政府的口號),大部分的伺服器都會有許多的安全設定,無論是更新的規則或是防火牆的限制等等。會限制在某個網段甚至是某個 IP 才能進行連線某些服務,對於常常喜歡加入文青到咖啡廳 Out coding 的宅宅,還是要想辦法鑽回去連線伺服器。

如果在限制區域中有一臺能對外開放連線的 SSH 機器,我們便能夠使用 SSH Tunnel 的方式橋接回去,透過通道連結到目標伺服器。說穿了其實這臺對外的機器就是跳板,我們可以利用這個跳板以類似 Port forwarding 的方式,將遠端伺服器的 IP 與 Port 對應至本機的一組位址與 Port。

Linux 下的連接方式

大部分的 Unix-Like 系統都有內建 SSH 的 Client 指令,我們只需要在 terminal 下指令就可以達到目的。

指令如下:

$ ssh -N -f -L LOCAL_PORT:DEST_HOST:DEST_HOST_PORT SSH_USER@SSH_SERVER_IP

SSH 參數說明
-N: 連接後不執行任何的遠端指令
-f: 連線後在背景執行
-L port:host:hostport: 在 Client 與 Server 建立一組 secure tunneling

LOCAL_PORT:本機連接埠
DEST_HOST:目標連線伺服器位址
DEST_HOST_PORT:目標連線伺服器埠號
SSH_USER@SSH_SERVER_IP:做爲跳板的機器連線

Example:

$ ssh -N -f -L 33890:192.168.1.100:5022 username@168.95.1.1

上述的例子,會透過 168.95.1.1 這臺跳板機器,將限制區域內 192.168.1.100,Port
為 5022 建立通道至本機的 33890 Port。可以透過 netstat 指令來觀察是否有建立成功。

$ netstat -ntulp | grep 33890
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:33890         0.0.0.0:*               LISTEN      5223/ssh            
tcp6       0      0 ::1:33890               :::*                    LISTEN      5223/ssh 

關閉通道

先查詢目前我們開啓的通道是在哪一個 process id (pid) 執行,再透過 kill 指令刪除執行中的 process 即可關閉。

查詢 ssh 服務與在 33890 port 執行的 process,取得 <PID>

$ ps aux | grep ssh | grep 33890

以 kill 指令刪除指定編號 <PID> 的 Process。

$ kill <PID>

netstate 檢查是否還有在執行。

$ netstat -ntulp | grep 33890

Categories: , ,

2017年6月24日 星期六

使用者只能 SFTP 登入自己的家目錄

使用者只能 SFTP 登入自己的家目錄

老師的電腦動畫課堂的期末作品,是開放讓學生透過 FTP 上傳自己的作品及網頁至實驗室的伺服器,由於 FTP 是明碼的封包傳輸於最近升級系統後,便考慮改用 SFTP(SSH File Transfer Protocol)來提供上傳的服務。

提供 SFTP 上傳的同時,希望使用者和以前一樣只能使用 SFTP 無法使用 SSH 登入伺服器。SFTP 為 SSH 的檔案傳輸服務,預設建立帳號的時候使用者同時可以使用這兩種服務。透過 SFTP only + Chroot 設定我們能限制使用者僅能 SFTP 並且無法離開自己的家目錄去到處閒晃。

  1. 安裝 OpenSSH
    如果安裝的是 Ubuntu Server 應該在安裝過程會安裝 openssh-server 套件,沒有的話可以利用下面的指令安裝。

    $ sudo apt-get install openssh-server
  2. 新增一個給 SFTP 使用的群組 sftpaccess

    $ sudo groupadd sftpaccess 
  3. 修改 OpenSSH 設定檔
    編輯 /etc/ssh/sshd_config 設定檔,在約 77 行的地方找到 Subsystem sftp /usr/lib/openssh/sftp-server 註解此行並修改為 Subsystem sftp internal-sftp

    $ sudo vim /etc/ssh/sshd_config
    
    #Subsystem sftp /usr/lib/openssh/sftp-server
    
    Subsystem sftp internal-sftp

    在檔案的尾端加上下面的片段

    Match group sftpaccess
        ChrootDirectory /home/%u
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp
  4. 建立新的使用者並加入 sftpaccess 群組
    在設定檔中,我們設置了 sftpaccess 這個群組套用要做 ChrootDirectory 的設定,所以我們將要限制的使用者,加入這個群組中。

    $ sudo useradd -G sftpaccess -m <<username>> -s /sbin/nologin
  5. 更改使用者家目錄權限
    由於 Chroot 的關係,這個要 ChrootDirectory 的目錄要將擁有者設定為 root,並且目錄的權限需要為 755。

    $ sudo chown root:root /home/<<username>>
    $ sudo chmod 755 /home/<<username>>
  6. 建立上傳目錄及修改權限
    要讓使用者能上傳網頁到某個目錄,即能透過對應的網址看到內容,需要開啟上傳檔案的目錄,並於稍後的步驟中設定 Apache 的 userdir。Apache 預設的目錄名稱為 public_html 位置在使用者家目錄。
    使用者的家目錄在前一個步驟已經將擁有者設定為 root,使用者在登入後一定無法使用這個目錄,我們必須建立一個上傳目錄(public_html)並且將權限賦予使用者帳號。

    $ sudo mkdir /home/<<username>>/public_html
    $ sudo chown <<username>>:<<username>> /home/<<username>>/public_html
    $ sudo chmod 755 /home/<<username>>/public_html    
  7. 安裝 Apache2

    $ sudo apt-get install apache2
  8. 開啟 userdir module
    使用 a2enmod 開啟 userdir,並重新啟動 Apache。

    $ sudo a2enmod userdir
    $ sudo systemctl restart apache2

經過上述的步驟,使用者便僅能透過 SFTP 的方式將網站資料上傳至伺服器,由瀏覽器直接看到網頁內容了。

Categories: ,

2016年8月14日 星期日

雙系統升級 Windows 10 後造成 ubuntu 開機進入 grub rescue

雙系統升級 Windows 10 後造成 ubuntu 開機進入 grub rescue

7/29 是免費升級 Windows 10 的最後期限,雖然現在幾乎都使用 ubuntu 做為平時工作或一般使用的環境,鮮少使用 Windows 了,但是現在使用雙系統的方式,仍保有原本購買筆電附送的 Windows 8.1 。微軟這免費的升級的活動還是很吸引人,經過將近一年時間的改善,現在的 Windows 10 好像也沒有什麼災情,決定在這個截止日前升級。

升級完 Windows 10 重新開機後,系統就直接進入 grub rescue 模式,估計是原來磁區的位置號碼改變所致。只要找回之前開機的磁區修改正確就好了。

查詢原本的開機磁區

以 ls 指令查詢磁區情形

grub rescue> ls

(hd0,gpt1) (hd0,gpt2) (hd0,gpt3) (hd0,gpt4) (hd0,gpt5) (hd0,gpt6)

逐步以 ls 看能不能查詢目錄情形,找出開機磁區

grub rescue> ls (hd0,gpt1)/
grub rescue> ls (hd0,gpt1)/boot
grub rescue> ls (hd0,gpt2)/
grub rescue> ls (hd0,gpt2)/boot
...

以此類推。記錄下查詢到的磁區位置(我的是(hd0,gpt6)),後面會使用上。

離開 rescue 進入 normal 模式

在 rescue 提示符號(grub rescue>)輸入 set 查詢現在的 prefix 和 root 設定值。

grub rescue> set

prefix=(hd0,gpt5)/boot/grub
root=hd0,gpt5

使用 set 指令將 prefix 和 root 更換成正確的磁區號碼,我的是將 (hd0,gpt5) 更改為 (hd0,gpt6)。

grub rescue> set prefix=(hd0,gpt6)/boot/grub
grub rescue> set root=(hd0,gpt6)

再次檢查 prefix 和 root

grub rescue> set

prefix=(hd0,gpt6)/boot/grub
root=hd0,gpt6

切換至 normal 模式

grub rescue> insmod normal
grub rescue> normal

在進入 Normal 模式後,編輯 /boot/grub/grub.cfg 檔案,將 (hd0,gpt5) 取代為 (hd0,gpt6)。取代後執行:

$ sudo grub-install

結束後重新開機。

Categories: ,

2015年11月22日 星期日

StackEdit 自定 CSS 匯出 HTML Template

StackEdit 自定 CSS 匯出 HTML Template

StackEdit 是一個所見即所得的線上 Markdown 編輯器,在先前的文章已有許多的介紹。身為程式設計在寫筆記的時候更是需要像這樣的工具,讓我們更能聚焦在內容上並且能運用 highlight.js 來標註程式碼。


檔案分享的方法

Google 雲端硬碟、Dropbox

我們更可以將筆記透過 StackEdit 直接發佈至 Google Blogger 上,或是儲存在自己的 Google 雲端硬碟、Dropbox 等等的位置。

Gist、StackEdit Viewer

如果需要將資料分享給其他沒有安裝 Markdown Viewer 的人,除了使用上述的方法,我們也可以將檔案發佈至 Gist ,或是將我們的 Markdown 檔案放至網路,透過 StackEdit 的 Viewer 將網址引入直接使用瀏覽器觀看。Ex:Here

https://stackedit.io/viewer#!url=[放置 Markdown 檔案的 URL 位址]

PDF

StackEdit 的 PDF 功能是需要透過雲端的轉換(透過 Pondoc + LaTex 實踐),對於這個部分的功能是贊助者項目,如果覺得 StackEdit 好用,很建議大家贊助讓他們可以更長久的經營。另外一個方式,是利用 StackEdit Viewer + Chrome Browser 來實踐。

  1. 開啓 Chrome Browser
  2. 開啓 StackEdit Viewer:Menu –> StackEdit Viewer
  3. 在 Viewer 模式下開啓列印
  4. 選擇 「Save as PDF」

HTML

另外一種跨平臺支援的方式是使用 HTML,只要是有瀏覽器都可以觀看,而且透過 CSS 可以改變成我們自己想要變化的風格。也是今天主要想和大家分享的方法。


使用自定的 CSS 匯出 HTML 檔案

StackEdit 匯出 HTML 的方式所匯出的檔案是很陽春白白靜靜的檔案,無論字型還是區塊安排都會有一點點的悲劇。還好,它還提供了一個以自定 Template 來匯出 HTML 的方式,讓我們有機會透過自定的 CSS 檔來完整個 HTML 檔的佈局。

自定的方式需要準備兩個主要的內容,HTML TemplateMarkdown CSS

HTML Template

我的 HTML Template 如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= documentTitle %></title>

<link rel="stylesheet" type="text/css" href="***[user define css file url]***">

<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.9.1/styles/monokai_sublime.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.9.1/highlight.min.js"></script>

<!--
To use prettify.js uncomment this part and comment the previous script
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert"></script>
-->

</head>
<body><%= documentHTML %></body>
</html>

請以上面的 Template 的內容取代 StackEdit Default template 的設定。這份 Template 使用 Highlight.js 作為程式碼標註,如果想使用 Google 的 Code-prettify(prettify.js)只要交換註解的部分即可。

Note:
1. 將 ***[user define css file url]*** 的內容取代為自己 CSS 的 URL位址。
2. 上述 Template 在 highlight.js 的部分是使用 sublime monokai 的顏色主題。

Default template 的設定:

  1. Menu –> Settings
  2. Settings 對話視窗 –> Advance

    enter image description here

  3. Advance –> Default template

    enter image description here

Markdown CSS

我自定的 CSS 檔內容如下,歡迎複製存檔後傳至自己的網路空間(我是放在 Google 雲端硬碟中),在 Template 中設定好路徑即可。

/* 
 * Copyright 2015 ninthday.
 * Version: 1.2
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Some content is copyrighted by Twitter, Inc., and also released under an
 * Apache License; these sections are noted in the source.
 * 
 * The CSS is based on this template:
 * http://pacinispace.blogspot.tw/2013/07/write-in-markdown-stackedit-with-custom.html
 *[(Copyright 2013 Alex Pacini unless otherwise noted.
 * Licensed under the Apache License, Version 2.0 (the "License");]
 * http://kevinburke.bitbucket.org/markdowncss/
 *[(Copyright 2011 Kevin Burke unless otherwise noted.
 * Licensed under the Apache License, Version 2.0 (the "License");]
 * Then it was extended to cover the Markdown Extra and applied some light changes.
 */
html{
    font-size: 62.5%;
}
body{
    margin: 0 auto;
    /*font-family: Georgia, Palatino, serif;*/
    font-family: Arial, "文泉驛正黑", "WenQuanYi Zen Hei", "儷黑 Pro", "LiHei Pro", "微軟正黑體", "Microsoft JhengHei", sans-serif;
    color: #444444;
    line-height: 1.3;
    max-width: 960px;
    padding: 30px;
    font-size: 1.6rpm;
}

h1, h2, h3, h4 {
    color: #111111;
    font-weight: 400;
}
h1, h2, h3, h4, h5, p {
    margin-bottom: 24px;
    padding: 0;
}
h1 {
    font-size: 4.8rem;
}
h2 {
    font-size: 3.6rem;
    /* The bottom margin is small. It's designed to be used with gray meta text
     * below a post title. */
    margin: 24px 0 6px;
}
h3 {
    font-size: 2.8rem;
}
h4 {
    font-size: 2.4rem;
}
h5 {
    font-size: 2rem;
}
a {
    color: #0099ff;
    margin: 0;
    padding: 0;
    vertical-align: baseline;
    text-decoration: none;
}
img[alt=banner] {
    width: 100%;
    height: 100%;
    margin-left: -10%;
}
a:hover {
    text-decoration: none;
    color: #ff6600;
}
a:visited {
    color: purple;
    text-decoration: none;
}
ul, ol {
    margin-top: 0;
    margin-bottom: 1.1em;
}
li {
    line-height: 2.4rem;
}
li ul, li ol {
    margin-left: 1.2rem;
}

p, ul, ol {
    font-size: 1.6rem;
    line-height: 1.5;
    max-width: 800px;
}

pre {
    border-radius: 4px;
    padding: 10px 24px;
    max-width: 800px;
    white-space: pre-wrap;
}

pre code {
    line-height: 1.7;
    font-size: 14px;
    font-family: "Source Code Pro", Consolas, monospace;
}

pre code, pre.prettyprint code{
    background-color:transparent !important;
}

pre.prettyprint {
    background: #23241f;
}

code {
    border-radius: 4px;
    font-size: 1.6rem;
    color: #3f3f3f;
    padding: 2px 4px;
    background-color: rgba(128,128,128,0.09);
}

aside {
    display: block;
    float: right;
    width: 390px;
}

blockquote {
    border-left: 10px solid #eee;
    padding: 15px 20px;
    margin-left:0;
    background-color: rgba(128,128,128,0.06);
    border-top-right-radius: 5px;
    border-bottom-right-radius: 5px;
}

blockquote cite {
    font-size:14px;
    line-height:20px;
    color:#bfbfbf;
}
blockquote cite:before {
    content: '\2014 \00A0';
}

blockquote p {  
    color: #666;
    margin:0 0 1.1rem;
}

blockquote p:last-child,
blockquote ul:last-child,
blockquote ol:last-child{
    margin-bottom:0;
}

hr{
    margin-top:21px;
    margin-bottom:21px;
    border:0;
    border-top:1px solid rgba(128,128,128,0.3)
}

dt {
  font-weight: bold;
}

dt, dd {
    margin-top: 5px; 
    margin-bottom: 10px;
    font-size: 1.6rem;
}

dd {
    margin-left: 40px;
}

table {
    margin-bottom: 20px;
    max-width: 100%;
    background-color: transparent;
    border-collapse: collapse;
    font-size: 1.6rem;
}

table th,
table td {
    padding: 10px;
    line-height: 20px;
    text-align: left;
    vertical-align: top;
    border-top: 1px solid #dddddd;
}

table th {
    font-weight: bold;
}

table thead th {
    vertical-align: bottom;
}

table caption + thead tr:first-child th,
table caption + thead tr:first-child td,
table colgroup + thead tr:first-child th,
table colgroup + thead tr:first-child td,
table thead:first-child tr:first-child th,
table thead:first-child tr:first-child td {
    border-top: 0;
}

table tbody + tbody {
    border-top: 2px solid #dddddd;
}

.footnote {
    vertical-align: top;
    position: relative;
    top: -0.5em;
    font-size: 0.8rem;
}

.tooltip li {
    line-height: 1.4;
}

.toc ul {
    list-style-type: none;
    margin-bottom: 1.1rem;
}

.sequence-diagram,
.flow-chart{
    text-align:center;
    margin-bottom:1.1rem
}

.sequence-diagram text,
.flow-chart text{
    font-size:15px !important;
    font-family:"Source Sans Pro",sans-serif !important;
}

.sequence-diagram [fill="#ffffff"],
.flow-chart [fill="#ffffff"]{
    fill:#f8f8f8;
}

.sequence-diagram [stroke="#000000"],
.flow-chart [stroke="#000000"]{
    stroke:#3f3f3f;
}

.sequence-diagram text[stroke="#000000"],
.flow-chart text[stroke="#000000"]{
    stroke:none;
}

.sequence-diagram [fill="#000"],
.flow-chart [fill="#000"],
.sequence-diagram [fill="#000000"],
.flow-chart [fill="#000000"],
.sequence-diagram [fill="black"],
.flow-chart [fill="black"]{
    fill:#3f3f3f;
}

Note:
這個 Markdown CSS 是參考 Pacini’s Space 文章,再做了不少的修改。

  • 修改加強了對於中文的設定
  • 整個系統單位使用 rem 的方式取代 px
  • 調整相關 Highligh.js 顯示設定
  • UML 圖形跑版的調整
  • 補上 dt, dd 設定
  • Note 區塊的寬度限制
  • 分割線的顏色比重與寬度限制
  • 將 pre code 的設定獨立

StackEdit 的 Hello! 文件,在套用我的 Markdown CSS 後的樣子(Live Preview)。原先 Pacini 的版本

Categories: ,

2015年10月16日 星期五

uBuntu /boot 空間 100% 滿載問題

uBuntu /boot 空間 100% 滿載問題

在先前的文章「uBuntu 更新時 /boot 空間不足」中,有針對如果 boot 空間不足的時候該如何以 apt-get purge 的方式移除舊的 kernel-package。現在可以使用 apt-get autoremove old-kernel-package 的方式移除,如果不指定 kernel-package 的版本,則會移除現在所有的舊版本。

sudo apt-get autoremove linux-image-3.13.0-51-generic linux-image-3.13.0-51-generic

這個方式也會一併的移除相依套件,相當的安全又乾淨(愈來愈無腦操作了 =,.=)。先前 purge 方式是在 /boot 還有空間的時候移除舊版,最近碰上的問題則是 /boot 空間已經 100% 滿載,新的 kernel 又只有裝一半(相依套件未完成安裝),導致任何的 apt-get 方式都無法使用,系統提示要以 apt-get -f install 方式強制解決新 kernel 的相依問題,而 /boot 又沒有任何空間,進入 Deadlock 狀況…

對於這種狀況的解法,

  1. 我們先清理出一些 /boot 的空間

    
    # 切換至 /boot 目錄下
    
    $ cd /boot
    
    
    # 確認目前運行的 kernel 版本
    
    $ uname -r
    
    
    # 備份舊的 kernel 版本
    
    $ sudo tar -cvf ~/boot.tar *3.13.0-36-generic *3.13.0-37-generic
    
    
    # 刪除已經備份的內容
    
    $ sudo rm -f *3.13.0-36-generic *3.13.0-37-generic

    Note
    完成後面的相依性安裝需要一些空間,請試需要移出足夠的空間。

  2. 解決套件相依性問題

     $ sudo apt-get -f install
  3. 使用 autoremove 方法清除舊版本

$ sudo apt-get autoremove

重新開機就會套用新的 kernel 版本。

參考連結:

Categories: ,

2015年10月2日 星期五

PHP 命名風格

PHP 的命名風格(Coding Style)

PHP 的學習與使用有蠻常的時間,近期的 PHP 更新使得這個語言融入其他語言的優點,在程式的特性上有些大躍進。近期閱讀 「現代PHP(Modren PHP)」 這本書,有種看完會更新整個使用 PHP 思維的感覺。書中有篇章在說明 PHP-FIG 的 PSR 建議標準,相同的使用規範能夠讓程式開發人員的程式互通性更好,合作性更佳,不再是悶着頭寫程式的時代,讓我們更容易的使用別人的輪子造車子。

其中 PSR-1 對於程式碼的風格有一些基礎的規範,回顧之前不同時期寫的程式,會發現自己在不同的學習階段,會依據當時查詢的風格規範而更改,每次都有一點小小的不同,這次決定記錄下來讓自己參考也與其他人交流。

變數命名

PSR-1 建議標準中,有針對類別、常數等建議命名原則,對於變數的名稱在 PSR-1 的內容中有提到沒有特別制定建議項目,之前觀察不同前輩的建議和查詢幾個有名的框架(Zend、Symfony、Laravel),寫下自己對變數名稱的命名。

  • 駝峰式命名法(camelCase),小寫字母開頭,後面每個單字的第一個字母大寫。
  • 要使用描述性的命名方式。
  • 迴圈變數通常使用: $i, $j, $k, …等等。
  • 存放 session 的變數前面以 sess 開頭。
  • 存放 cookie 的變數前面以 coke 開頭。
  • 臨時性的變數前面以 tmp 開頭。
  • $query$result 這兩個變數只能用在 SQL 的查詢語法變數與查詢結果變數。
  • 項目名稱(option)全部使用小寫及使用底線 _ (underscore)分隔。
$defaultOptions = array(
    'some_default' => 'values',
    'another_default' => 'more values',
);

常數命名

  • 常數名稱完全採用大寫英文字母。【PSR-1】
  • 必要時使用底線 _ (underscore)來區分單字。【PSR-1】
  • 如果內容有可能會改變,應改採用變數而非常數。

類別命名

  • 必須使用大寫開頭的駝峰式命名(camelCase),又稱爲 TitleCase。【PSR-1】
  • extends 和 implements 關鍵字需和類別名稱在同一行。【PSR-2】

方法命名

  • 必須使用小寫開頭的駝峰式命名(camelCase)。【PSR-1】
  • 小寫字母開頭,後面每個單字的第一個字母大寫。【PSR-1】
  • 當參數的數量多長度超過最大值(80字)時,可以換行處理。換行後其他參數要縮排起始大括弧要在新的一行。【Zend 1
public function bar($arg1, $arg2, $arg3,
    $arg4, $arg5, $arg6) 
{
    // all contents of function
    // must be indented four spaces
}

SQL語法

  • $query 變數名稱來存放 SQL 的命令。當發生錯誤時可以容易找出問題的地方。
  • 所有 SQL 的關鍵字必須採用大寫英文字母。
  • SQL 的寫法要分行,幫助程式碼容易閱讀與了解。

檔案命名

  • 檔案名稱完全採用小寫英文字母。
  • 字與字之間使用底線 _ 連接(EX:show_table.php)。
  • 一定要使用 .php 作為副檔名。
  • 會被引入的設定內容以 .inc.php 結尾。
  • 檔名長度必須小於 32 個字元(符合舊式系統)。

Categories:

Copyright © Open Jiang       Up ↑

Design by Anders Noren | Theme by NewBloggerThemes.com