PHPConf Taiwan 2016 第一天心得

過了一個禮拜終於要打這篇心得了,經過一個禮拜沉澱之後,來看看文筆會不會比較好一點(?

起先是學長揪我的,也很感謝學長的邀請讓我有機會參加道精彩的議程之外,也可以認識一些新的朋友,還有小插曲XD

第一天報到之後,在會場轉了一下,發現其實輔大的會議廳並不大,而且只有兩個會議廳,不過小而美,有麻雀雖小,五臟俱全。

在進場之前,還稍微逛了一下 Gandi 的攤位,所以也得到了他們的潮 T。

  1. 很快第一個 key note 就開始了,這次第一個大會演講邀請的是 Slim framework 的作者,同時也是 Modern PHP 與 PHP: The Right Way 的作者,網路上的代號是 codeguy 雖然小有名氣,不過一開始接觸的框架還真的是從他的框架開始學起的,所以榮幸聽到他本人的演講,我也是很開心的。內容是在講述他從 junior 到 senior PHP developer 的過程,中間還偷婊了一下台灣的工時 XD
  2. 第二場的 key note 是邀請到了 PHPUnit 的作者,作者本身是一個德國人,所以開場就說他的 code 都很 strict XD 過程中也偶有歡笑跟有趣的對談,比較偏向的是介紹 PHP 7.1 的時候有什麼改變與 PHPUnit 新版有什麼樣的變動,還有目前 PHPUnit 的版本 features. 最後給了一個有關於 PHP7.1 電子書的 coupon,我回家之後二話不說就先買了 XDD
  3. Rebuild flyingV with Laravel:這是後來第一個聽的議程,內容是在講述這個募資平台從以前到目前系統開發到改版過程,這方面還蠻有興趣的,因為跟重構有關,而且經歷很多的版本改變。可見技術長也是很強大的,能夠帶領開發團隊在經歷多次的系統改版之後越趨完整與穩定性。
  4.  Refactoring to Collections – 從陣列重構談物件導向程式設計:本議程是圍繞在對陣列的存取,以往我們要對陣列做修改值,通常都是走訪陣列再將值一個個取出並修改值再存回去,如果迴圈裡面還有一些 if….else 的條件判斷,簡單的還好,複雜的話會變成義大利麵條式的寫法導致 code 混亂不堪。不過若是使用 array_map 與 array_reduce 的話,在 code 的可讀性來說,會變得較容易理解,相對的這種寫法目的就是要提高可讀性並以不考慮效能為前提下。
    若是在 Laravel 下,有提供 map 與 reduce helper functions 可以使用,達到的效果是一樣的。
  5. 用 Laravel + Vue.js 打造即時資訊看板連續兩個議程都是 KKBOX 的工程師,真心覺得 KKBOX 很強大阿,這個是在介紹如何打造 real time 的看板,所以用到很多有關背景服務相關的工具,像是 queue 和 supervisor 等。

後面因為閉幕的時間間隔太久所以就先跟學長先走了,也這樣結束了第一天。

這天收穫主要就兩個,一個是見到之前面試我的 developer 順便幫我問問現在情況,結果忘記申請研替缺 QQ,看來只好再去找其他工作了。

另外一個就是透過學長去認識到另外一位有十年經驗的大大(? 希望可以切磋與交流技術之餘,能有得到工作面試的機會了….

[各議程的 slides]

Lately in PHP(Unit)

https://thephp.cc/dates/2016/10/phpconf-taiwan/lately-in-phpunit

Rebuild flyingV with Laravel

Refactoring to Collections – 從陣列重構談物件導向程式設計

https://hackmd.io/s/SJEH1KZgx

使用 Laravel & Vue.js

https://docs.google.com/presentation/d/1PN4Ou1b3_gnPyki9JfU3fp9sSeavk0rAvkZptxF2yFc/edit#slide=id.p

新增 Apache2 VirtualHost 使用子網域以及 Freenom 免費網域的申請

最近正在煩惱著該如何部署 Laravel 到專案的子目錄下,比如說,請求的網址:http://localhost/blog 而不是 http://localhost

使用 .hatcess 之後,還是無法設定成功,讓網址可以導向到請求專案的根目錄名稱一樣也可以成功。

目前也有人有這樣的問題,於是有人在 Laravel 的 Github 的專案上開了這樣的 issue: https://github.com/laravel/framework/pull/3918 問題也是跟我相同,需要請求網址的時候可以多一個專案根目錄名稱。

目前比較好的作法是使用:Apache2 的 VirtualHost 來解決這個問題,透過設定 VirtualHost 可以解決請求網址包含專案名稱的問題。下面的教學為使用 Apache2 VirtualHost 並搭配 Freenom 免費的頂級網域名稱來做到。

作業系統:LUbuntu 16.04 LTS

[Freenom 免費頂級網域申請]

  1. 進入 freenom.com 網站。
  2. 輸入一個沒有人註冊的網域名稱並按下『檢查可用性』,如下圖。
    %e5%bf%ab%e7%85%a710
  3. 註冊或登入一個帳號,並成功拿到網域之後,進到如下的畫面:點選 My Domain 接著選擇 Manage Domain。
    %e5%bf%ab%e7%85%a711
  4. 選擇 tab 名稱:Manage Freenom DNS
    %e5%bf%ab%e7%85%a713
    在『Add record』的部份新增一個 A 紀錄,紀錄 ipv4 位址。Name 空白以及在 Target 的地方,填寫自己的固定 ip 位址所以只適合 VPS 或實體有固定 ip 的主機。(TTL 數值可以用預設就好,不用修改它)
  5. 填寫完成之後,按下 Save Changes 按鈕,等一段時間之後,就會出現『Record added successfully 』就代表成功加入一筆紀錄了。
  6. 增加完 A 紀錄之後,就可以知道使用網域名稱來 request url 而且不需要打 ip 位址了。
  7. 接著再新增 CNAME 紀錄,用來做子網域使用,讓外面連進來的人也可以使用子網域連線(搭配 VirtualHost 使用)。
  8. 新增 CNAME 紀錄範例如下圖:
    %e5%bf%ab%e7%85%a714

[VirtualHost 設定]

  1. 需要先安裝好 Apache2 或是 LAMP server 可以參考之前的文章
  2. 照下面新增一個目錄(以 blog.peter279k.tk)
    sudo mkdir -p /var/www/blog.peter279k.tk/html
    
  3. 設定 permissions 權限,這裡可以將使用者權限設定成:www-data
    sudo chown -R www-data /var/www/blog.peter279k.tk/html
    
  4. 編輯一個測試的設定 HTML 檔。
    vi /var/www/blog.peter279k.tk/html/index.html
    
    <html>
    <head>
    <title>Welcome to Example.com!</title>
    </head>
    <body>
    <h1>Success! The example.com virtual host is working!</h1>
    </body>
    </html>
    
    sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/blog.peter279k.tk.conf
    
    # blog.peter279k.tk.conf
    <VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com
    
    ServerAdmin admin@blog.peter279k.tk
    ServerName blog.peter279k.tk
    ServerAlias www.blog.peter279k.tk
    DocumentRoot /var/www/blog.peter279k.tk/html/blog/public
    
    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    <Directory "/var/www/blog.peter279k.tk/html/blog/public">
    AllowOverride All
    </Directory>
    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
    </VirtualHost>
    
    

    DocumentRoot 和 Directory 需要指定自己的 folder 指定到哪個目錄,網域名稱也需要改成自己改的名稱。

  5. 啟動 site 並重新啟動 Apache2 服務,即完成了。
    sudo a2ensite blog.peter279k.tk.conf
    sudo systemctl restart apache2
    

VirtualHost 設定參考文章:https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts

安裝 Laravel 初始化的框架

雖然有一些方便的套件可以安裝 Laravel 像比如說:Wagon , homestead 等。不過,客製化的安裝還是很重要的。接下來的教學,是分別在 Window 以及 Linux 下去安裝 Laravel 。

[1] Linux/Ubuntu

前置作業:

  1. 已經有 LAMP server 或是 LNMP server 作為架站的環境。
  2. 有 cURL 指令。
  3. 有 php5-cli (或 php-cli)。看作業系統發行版本而套件名稱有所不同。(16.04 LTS 與 14.04LTS 的差別)

安裝 Laravel:

切換到 www (Document Root) 或是自己的家目錄。

[第一步]

下載 Composer

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

create project for Laravel scaffold 產生專案的骨架(scaffold) application.


php composer.phar create-project laravel/laravel project-name "5.3.*" --prefer-dist

#或者版本號字串不加,直接自動去偵測合適的版本。

php composer.phar create-project laravel/laravel project-name --prefer-dist
#版本部份可以自由選擇,建議是使用 5 以上的版本。 

[第二步]

打開瀏覽器輸入:localhost/project-name/public 就可以看到下面的截圖了。

 

[2] Windows

前置作業:

  1. 已經安裝好有 XAMPP 或 WAMP 或 EasyPHP
  2. 安裝好 Git for Windows,若沒有請到這裡下載。
  3. 已經設定好 git-bash 的 .bashrc 設定 alias 與 指令記憶。
  4. 若第 3 項沒有設定,請做這一項設定。
    bind '"\x1b\x5b\x41":history-search-backward'
    bind '"\x1b\x5b\x42":history-search-forward'
    

    可能第一次開啟 git-bash 的時候,會有 Warning 出現。

    WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile.
    

    當關掉再重開 git-bash 之後,就會沒有這行警告了。

    設定 alias 編輯 .bashrc 檔

    alias php='/path/to/php'
    

    重開 git-bash 就會生效了。

安裝 Laravel:

[第一步]

下載 Composer

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

create project for Laravel scaffold 產生專案的骨架(scaffold) application.

# 使用 --prefer-dist 選項來減少安裝的時間。
php composer.phar create-project laravel/laravel "5.3.*" project-name --prefer-dist

#版本部份可以自由選擇,建議是使用 5 以上的版本。

第一次做上面的步驟的時候,會發現有下面的錯誤:

Script php -r "copy('.env.example', '.env');" handling the post-root-package-install event returned with an error

如下錯誤截圖
%e5%bf%ab%e7%85%a73

這時候需要去複製 .env.example 到 document root 的目錄下,讓其可以抓到檔案,算是 Windows 下才產生的問題,而不會顯示 no such file or directory 的錯誤。
接著把專案 project-name 整個刪除,在重新安裝一次,就會成功了。

如果這一步還是無法成功的話,因為還需要將 PHP 執行的路徑加入至系統環境變數;加入之後,須重新開機。

%e5%bf%ab%e7%85%a77


# 可以參考 composer.json 裡的 scripts 的 key 所定義的 post-scripts 裡面都需要執行到。

php -r "file_exists('.env') || copy('.env.example', '.env');"

php artisan key:generate

php artisan optimize

[第二步] 啟動 development server


php artisan serve

打開瀏覽器輸入:localhost/project-name/public 就可以看到下面的截圖了。

以上就是各個不同作業系統平台安裝 Laravel 的不同方法。

[Laravel 5.1 and 5.2 預設的畫面]

%e5%bf%ab%e7%85%a74

 

[Laravel 5.3 預設的畫面]

%e5%bf%ab%e7%85%a75

 

[後記]

因為 Larvel 很吃版本,所以需要注意。

Laravel 5.1 與 5.2 需要 PHP 5.5 以上的版本。

Laravel 5.3 需要 PHP 5.6 以上的版本。

在虛擬共享主機上使用 Git 版本控制專案

一般在使用 Git 作為版本控制與部署專案時,都是使用指令居多,很少會使用像是檔案傳輸等方式部署,而且用檔案方式部署我們不太能知道哪些檔案已經傳過,或是還沒有傳上去等。

有鑑於這個問題,我們在使用只提供 FTP/FTPS 等檔案傳輸協定傳輸檔案的共享主機(shared hosting)時,可以使用 git-ftp 來幫我們完成 deployment 的任務。

本篇文章,就是要來介紹與使用 git-ftp 來幫助我們達成這項任務。

[0] 初始化一些 Git 指令的設定(環境設定)


git config --global user.email "your-mail-address"

git config --global user.name "your-user-name"

git config --global core.editor "vim"

git config --global color.ui true

git config --global alias.lg "log --color --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --"

[1] 先建立一個 hello-world 的專案


mkdir hello-world

cd hello-world

git init

echo "<?php echo 'hello world'; ?>" > index.php

git add .

git commit -m "initial commit"

[2] 下載 git-ftp 套件來安裝。

照著 官方 INSTALL.md 加入 ppa repository


sudo add-apt-repository ppa:resmo/git-ftp
sudo apt-get update

可以參考官方的安裝教學文件,本篇使用 Linux Ubuntu 與Windows 來進行安裝。這時候可能會在 sudo apt-get update 時,發現 Package 的 source ppa 發生 404 Not found 的現象。


W: 無法取得 http://ppa.launchpad.net/resmo/git-ftp/ubuntu/dists/wily/main/binary-amd64/Packages,404 Not Found

W: 無法取得 http://ppa.launchpad.net/resmo/git-ftp/ubuntu/dists/wily/main/binary-i386/Packages,404 Not Found

E: Some index files failed to download. They have been ignored, or old ones used instead.

[Ubuntu]

為了避免這種情形的發生,因此需要自己手動安裝 deb package。因此需要自己前往這個網站:https://launchpad.net/ubuntu/+source/git-ftp

目前的新版本為:1.2.0-1 可以使用這個版本,並下載:git-ftp_1.2.0-1_all.deb 檔案。下載回來之後,便雙擊安裝了。安裝好之後,就有 git-ftp 的指令可以使用了。如下:

%e5%bf%ab%e7%85%a71

 

[Windows]

一開始需要先安裝 Git for Windows (mysysgit)。安裝過程中,可以都用預設,唯一可以自己更改安裝的路徑,需要自己去注意一下。

安裝好之後,回到 Windows 桌面,並點滑鼠右鍵,這時會多一個:Git Bash here 的選項可以選擇。接著可以執行下面的步驟:

 

cd ~
git clone https://github.com/git-ftp/git-ftp git-ftp.git
cd git-ftp.git && chmod +x git-ftp
cp ~/git-ftp.git/git-ftp /bin/git-ftp

可以參考下面安裝示意圖:
%e5%bf%ab%e7%85%a72

[使用方法]

[init] 第一次把專案透過 git-ftp 放到 FTP/FTPS sever 上。

git-ftp init -u "your-account-name" -p "your-password" - ftpes://peter.nctu.me/web/peter.nctu.me/public_html/hello-world

[push] 已經 init 過,需要去更新 server 上面的檔案(使用 push 推上更新過後的 commit git-ftp 會自己自動比對版本做更新檔案的動作。)

git-ftp push -u "your-account-name" -p "your-password" - ftpes://peter.nctu.me/web/peter.nctu.me/public_html/hello-world

[.gitignore 問題] 若是有些 library 檔案,像使用 PHP Composer 則需要去控制 dependency package. 這些 package 並不會進到版本控制中。而且在用 git-ftp 時,
也會參考 .gitignore 的檔案。若要解決這個問題,需要在專案的目錄底下新增:.git-ftp-include 作為宣告,這一些檔案或目錄,需要一併 push 上去。

下面是 .git-ftp-include 的內容。(當然這個檔案也可以加到版本控制中,讓人方便部署,也知道該部署什麼額外的目錄上去。)

!vendor/
!token/
!bower_components/

這樣之後在 push 的時候,就不會因為 library 目錄 被 ignore 而去忽略沒有上傳到了。

VESTA Control Panel 教學與體驗

最近台東大學的虛擬主機開張了,身為校友的我,當然要去體驗看看,所以我就申請了一組帳號來玩看看。申請的步驟在此篇文章就不多作說明了,有興趣想要申請的,可以參考下列的文章:

虛擬主機服務

裡面有詳細的範例教學。教你如何申請,使用 FTP 以及安裝 WordPress。本篇的教學是要教你更進一步的使用。(下面項目不定期更新~)

[1] 使用版本控制,讓共享虛擬主機也有版本控制:git-ftp, ftp-deployment

[2] Deployment: 部署專案上去,含有 PHP 框架的專案:Slim, Laravel, Nette, Symfony, silex and so on.

[3] 小玩 Python , 使用 Python CGI.

[4] 其他,想到再補充。

hitcon-ctf-2016-papapa 建置環境

HITCON CTF 2016 已經出來了。現在可以在 Github 的 Orange 大大的帳號中的 repo 找的到。這是其中一題的重現環境的 server 建置

首先,要先有一台 server (或是使用 VPS) 接著上面已經安裝好 LAMP stack (或PHP + Apache) 推薦的 Linux Distribution 為 Ubuntu 14.04 LTS

接著到專案的網址:把 repository clone 回來。

git clone https://github.com/orangetw/My-CTF-Web-Challenges.git

接著,把目錄 hitcon-ctf-2016/papapa/ 底下的移到 server 上,並修改 /etc/apache2/sites-available/000-default.conf
下面的設定檔將專案中的 default-ssl.conf 整併到 000-default.conf

sudo vi /etc/apache2/sites-available/000-default.conf

修改的範例檔如下:

# 基本上,前面的 80 port 是都不用更改的,使用預設的設定就好。

<IfModule mod_ssl.c>
 <VirtualHost *:443>
 ServerAdmin webmaster@localhost
 ServerName your-ip-address
 DocumentRoot /var/www/html/papapa
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 SSLEngine on
 
 SSLCertificateFile /path/to/crt-file
 SSLCertificateKeyFile /path/to/key-file

 SSLCACertificateFile /path/to/crt-file
 
 <FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 <Directory /usr/lib/cgi-bin>
 SSLOptions +StdEnvVars
 </Directory>
 <Directory "/var/www/html">
 AllowOverride All
 </Directory>

 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 # MSIE 7 and newer should be able to use keepalive
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
 <VirtualHost *:443>
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html/secret/
 ServerName very-secret-area-for-ctf.orange.tw


 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
 SSLEngine on

 SSLCertificateFile /path/to/crt-file
 SSLCertificateKeyFile /path/to/key-file
 SSLCACertificateFile /path/to/crt-file

 <Directory /secret/>
 Options FollowSymLinks
 AllowOverride None
 Require all granted
 </Directory>


 <FilesMatch "\.(cgi|shtml|phtml|php)$">
 SSLOptions +StdEnvVars
 </FilesMatch>
 BrowserMatch "MSIE [2-6]" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 # MSIE 7 and newer should be able to use keepalive
 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

 </VirtualHost>
</IfModule>

設定完成之後,在 /var/www/html 的目錄下建立一個 secret 的目錄並把 index-secret.php 放到此目錄中。

重啟 Apache service


sudo service apache2 restart

接著:開始攻擊(?

開始攻擊時,先想辦法拿到:very-secret-area-for-ctf.orange.tw 這個網域名稱。

可以從主控台看到類似這樣的憑證圖示:

接著使用 cURL


curl -k -H "Host: very-secret-area-for-ctf.orange.tw" "https://your-ip-address/"

在虛擬主機上設定 SSL/TLS 與啟動 HTTPS 的方法

可喜可賀,最近的獅子免費主機終於回歸了!在回歸之於,馬上註冊了一個帳號,看起來還不錯, cPanel 也是新版的。

接著也開放了可以安裝 SSL/TLS 的憑證了。以前大都是要買憑證並透過有公信的 CA 才有合法的憑證,現在有免費的方案可以選擇,有 WoSign (沃通) 與  Let’s Encrypt 可以選擇,前者是大陸(恩..),後者大家可能比較有聽過,官方網站在這裡,所以我們本篇文章就以獅子主機與使用 Let’s Encrypt 為例子,來教大家如何安裝這個免費的憑證。

第一步:先登入獅子主機

這一步我想大家都應該會,先跳過,登入之後先切換到 cPanel。畫面會長下圖這個樣子。

cpanel

如果沒有註冊的話,可以註冊一個,使用免費的方案與一個子網域來作使用。

第二步:到 sslforfree.com

這個網站可以幫助你申請 Let’s Encrypt ,因為 Let’s Encrypt 對於虛擬共享主機 (shared hosting) 是不友善的,還好國外有人做出網站可以幫助我們順利取得 Let’s Encrypt 的憑證。

進到網頁的畫面之後,一開始就有一個地方可以輸入你的網址,就把網址輸入進去並按下:Create Free SSL Certificate 按鈕。

sslforfree

 

接著等待一段時間之後,就會跑出下面的畫面了,有兩種方式可以驗證你的網域,第一種是網站幫你登入 FTP 自動幫你驗證。

第二種是手動驗證下載所需的檔案並上傳至利用FTP上傳至你的虛擬主機上。

這邊是強烈建議使用自動認證,原因是不用把檔案下在回來手動上傳檔案上去。因此我們選擇 Automatic FTP Verification 的按鈕

sslforfree

 

這裡會要求你填寫使用者名稱與密碼,至於目錄那一欄可以不必填寫沒有關係,因為他自己會自動偵測到預設家目錄上。

填寫完以後,就可以按下 Download Free SSL Certificate 的按鈕了。等一段時間之後,就會出現如下的畫面,分成兩部分來說明:

第一部分是,這裡可以申請一個帳號來作為管裡每個網域的憑證,憑證有效期限為每三個月,因此需要每三個月做一次更新,憑證才會有效。

sslforfree

 

若有帳號的話,憑證的時間快過期的時候,網站也會發信到你的帳號信箱做提醒。

第二部分是,有三個欄位,分別是 憑證,私鑰與 CA 檔。下面的按鈕是可以下載一個壓縮檔,裡面會有這三個檔案。

這邊我們不需要用到,我們可以分別去複製這三個檔案,將這三個檔案放到 cPanel 中的 SSL/TLS server。

sslforfree

我們轉到 cPanel 控制畫面,點選安全性分類下的 SSL/TLS。

cpanel

進去之後,按下:管理 SSL 網站,下面有三個地方可以貼,分別是: 憑證,私鑰與 CA 檔。下面可以選擇網域,選擇好之後我們把剛剛所產生的憑證,私鑰與 CA 檔 這三個檔案分別匯入進去。

接著按下安裝憑證,就可以了。

cpanel

 

我們看一下有沒有裝好,開 web browser 並輸入網址,看到下圖這樣,就成功囉!

httpsurl

[後記]

sslforfree.com 登入帳號之後可以看到所有申請的網域,這邊就可以進行 renew (續約憑證) 等相關的動作了。

sslforfree

 

[參考文章]

[免費]SSLforFree 免費ssl憑證:https://changken.biz/969

更換預設 phpMyAdmin 登入網址

我們在 Linux/Ubuntu 下,安裝使用 LAMP (Apache, MySQL/MariaDB, PHP) 或是 LEMP (Nginx, MySQL/MariaDB, PHP) 這樣搭配的 web server 在管理 MySQL 資料庫的時候會不熟,則需要安裝  phpMyAdmin 作為管理 MySQL 管理 web 介面,通常在 Ubuntu 下用下面的指令安裝即可:


sudo apt-get install phpmyadmin

安裝完成之後,輸入網址:http://example.com/phpmyadmin 就可以使用了。

平常一般人都知道只要進入這個網址就是可以進入 phpMyAdmin,尤其是再有允許外連的時候,容易造成安全上的問題,因此,為了避免這樣的情形發生,通常會限制 IP 允許登入 phpMyAdmin,不過,限制 IP 有一個缺點,萬一在 IP 以外的地方要連線登入就有問題了,因此,我們需要使用這篇所要的教學,把預設的路徑改掉。

這裡只先教 Apache 的做法,如果需要 Nginx 的話,可以參考下面參考文章的做法。

第一步:修改設定檔


sudo vi /etc/phpmyadmin/apache.conf

第二步:開啟設定檔之後,把它改成下列的樣子:


# Alias /phpmyadmin /usr/share/phpmyadmin

# /my 可以改成自己想要的形式
Alias /my /usr/share/phpmyadmin

附上圖片參考

phpmyadmin

[注意]

若是看參考文章中,後面還有一個步驟要利用下面的指令,加入一行到 apache2.conf 的設定檔,接著再重新啟動 Apache server 。


echo "Include /etc/phpmyadmin/apache.conf" >> /etc/apache2/apache2.conf

我加了之後,重新啟動 Apache 時會出現錯誤:


The Alias directive will probably never match because it overlaps an earlier Alias

所以我上面這一步驟沒有做,不過還是可以 work ,記得要重新啟動 Apache service 即可。

驗證一下,就可以知道有沒有成功了。原來的 /phpmyadmin 就會變成 404 Not found 了。下圖為最後文章中所驗證的方法。

Secure-PhpMyAdmin-Login-Page

[參考文章]

How to Change and Secure Default PhpMyAdmin Login URL

Zend Framework 2 建立自己的 Module (5)

本篇文章是要來介紹有關於文字翻譯,還有頁面的樣式

Styling and Translations

有關於頁面上的文字內容都可以進行對應的翻譯,可以到:/path/to/project-name/module/Application/language 查看 en_US.po 檔案

po 副檔名檔案是一種翻譯類型的檔案,因此需要特殊的 editor 才能夠打開,我們這邊要先去下載一個 poedit 這個編輯氣是屬於跨平台的,進入官網之後是很容易找到下載點的。

下載回來之後,安裝並打開,會看到介面如下面的截圖:

poedit

我們按下開啟打開 en_US.po 檔,就可以進行編輯的動作,按照下面的圖把 skeleton application “翻譯" 成 “tutorial"

poedit

接著存檔之後,檔案選單中有一個編譯成 MO 檔,改完之後都需要編譯成新的 MO 檔

接下來是 styling 的部分,就是樣式的地方,每次在頁面出來的時候,都會有:© 2005 – 2016 by Zend Technologies Ltd. All rights reserved. 這個 copyright 的文字。

為了要把它移掉,我們需要去編輯:/path/to/project-name/module/Application/view/layout/layout.phtml

並移除:<p>&copy; 2005 – <?php echo date(‘Y’) ?> by Zend Technologies Ltd. <?php echo $this->translate(‘All rights reserved.’) ?></p> 這一行。
接著再打開頁面之後,那一行 copyright 文字就會不見了。

album

Zend Framework 2 建立自己的 Module (4)

Database and models

在這裡,我們使用了:Zend\Db\TableGateway\TableGateway 做為對資料庫中的資料表進行新增,查詢,修改以及刪除。

我們使用 MySQL 並透過 PHP 的 PDO 層作為存取資料庫,我們先建立一個名為:zf2tutorial 的資料庫作為資料庫的名稱,接著執行下面的 SQL 檔的指令

The model files

Zend Framework 並沒有提供 Model 之類的 component 原因是因為這部分是我們自己的商業邏輯,我們需要自己寫的

我們建立一個名為 Album.php 並放在 /path/to/project-name/module/Album/src/Album/Model 目錄下

Album.php

在 Album.php 中,就只有一個簡單的 Album class 我們為了要與 Zend\Db 中的 TableGateway 運作正常,因此我們需要實做 exchangeArray() 方法,這個方法可以簡易的從另一個項目設定中去複製一個陣列中的資料,並把資料可以印出在 view 上 (或表單)

我們建立了一個 AlbumTable.php 檔在: /path/to/project-name/module/Album/src/Album/Model 目錄下

AlbumTable.php

其中裡面的方法功能介紹如下:fetchAll 就是得到一個查詢所有 Album 的集合,getAlbum 則是得到某一行的且傳回物件,saveAlbum 則是儲存一行 Album 相關的資料,最後的 deleteAlbum 則是刪除某一行指定的 Album 記錄。

Using ServiceManager to configure the table gateway and inject into the AlbumTable

修改前面的 Module.php,位置在:/path/to/project-name/module/Album/Module.php

接下來要加入有關資料庫登入的驗證資訊,所以我們要分別編輯:/path/to/project-name/config/autoload/global.php 與 /path/to/project-name/config/autoload/local.php

global.php

就是加入 db 資料庫相關的,像這裡就是定義 PDO 的,下面則是加入 servive_manager 與 Zend\Db\Adapter\Adapter 內建操作資料庫有關的。

local.php

則是填入登入 MySQL 的驗證資訊,如帳號與密碼。

 

Back to the controller

Listing albums

 

AlbumController.php 前面已經有使用過了,在這裡可以看到一些註解,可以知道加了哪幾行。

index.phtml

下面是有關於視圖 (view) index.phtml 的 code

由 index.phtml 得知:

We always use the escapeHtml() view helper to help protect ourselves from Cross Site Scripting (XSS) vulnerabilities (see http://en.wikipedia.org/wiki/Cross-site_scripting).

我們常會使用 escapeHtml() 來防止跨站腳本的漏洞。

 

最後,輸入網址:http://localhost/project-name/public/album 就會看到如下的畫面

user-guide.database-and-models.album-list

 

到這裡就完成了一個簡單的表格列出專輯清單,下一篇我們會介紹:Styling and Translations 樣式與翻譯。