如何在 Ubuntu 架設 private Git server (Gitolite + GitWeb)

自己租的 VPS 經歷上次的更新 MySQL 5.7 版本之後就爛掉,資料庫變成只能讀不能儲存…..

一氣之下,就把上面的專案都把它放到其他的主機裡,這台就重新的 reset 掉。

這台目前打算就拿來架設:Git server 與 CI server 作為日後有private Git 專案使用,本來打算是是架設 GitLab 作為 Git server,可是現在目前的VPS規格不夠好。

據說 GitLab 要跑得順的話,需要將近 8G RAM 才有辦法…..於是目前就先放棄了….先打算架設版本控制跟可以做持續整合的服務的 server 為主。

在經歷了一番GitLab server 安裝不起來之後,現在是轉向這篇要講的東西了,這個方式的 private Git server 算是比較輕量型的方案,也是比較合理的。

所以以下就是安裝 Gitolite + GitWeb 的方法。

[參考的資料]

install_git_server.sh

how-to-create-own-git-server-with-gitolite-and-gitweb-in-ubuntu

 

  1. 首先,先 setup 一個乾淨 VPS 並裝好Ubuntu 14.04 或是 16.04 的 LTS 版本,沒有的話就自己去租一臺吧,DigitalOcean 都有很便宜的價格有可以加上 Github 的學生方案可以使用,可以拿到 50 美金作運用。不過,不用的話要記得關掉,不然可是會一直的扣錢喔!
  2. 接著跑下面的 bash script: initial_ubuntu.sh,使用方式是:
    # initial_ubuntu.sh
    #!/bin/bash
    #Firstly, we have to login the root user via ssh.
    # install some required package
    # set locales (zh_TW.UTF-8 or en_US.UTF-8)
    
    sudo locale-gen "en_US.UTF-8"
    
    sudo dpkg-reconfigure locales
    
    sudo echo 'LC_ALL="en_US.UTF-8"' > /etc/default/locale
    
    export USERNAME=$1
    
    if [ "$USERNAME" = "" ]
    then
    echo 'please add the user name!'
    exit 1;
    fi
    
    sudo apt-get update
    
    echo 'Upgrading the package...It will be let user type the yes | no'
    echo 'We have to notice that this upgrade package will be installed the Apache2 HTTP server...'
    # skip the kernel update (OpenVZ is not allowed updating the Kernel.)
    sudo apt-mark hold linux-image-generic linux-headers-generic
    sudo apt-get upgrade
    
    sudo apt-get install -y curl wget vim ufw
    
    sudo useradd -m $USERNAME
    sudo usermod -s /bin/bash $USERNAME
    sudo adduser $USERNAME sudo
    echo 'Please set password for the $USERNAME ...'
    sudo passwd $USERNAME
    
    sudo ufw enable
    sudo ufw default deny
    sudo ufw allow in ssh
    sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
    sudo echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
    sudo service ssh restart
    
    echo 'done.'
    
    exit 0;
    
    
    bash initial_ubuntu.sh your-usernmae
    

    可以安裝一些基本或是需要的套件在以及設定基本的軟體防火牆還有 SSH 的簡易安全防禦設定。
    這裡的 your-username 在範例中,我們先填  peter 做為這一次範例的使用者名稱。

  3. 接下來就是要安裝 Git server 了,首先先依照步驟慢慢來。
  4. 首先,先更新一下軟體來源庫的網址。
    sudo apt-get update
    

    接著,在安裝 Git 套件:git-core,接著新增一個使用者

    sudo apt-get install git-core -y
    
    #新增一個使用者
    sudo adduser \
     --system \
     --shell /bin/bash \
     --gecos 'git version control' \
     --group \
     --disabled-password \
     --home /home/git git
    
    #切換使用者:git
    sudo su -l git
    
  5. 切換到 git 使用者的家目錄下面並 clone Gitolite 的 repository.
    在家目錄下建立 bin 目錄。

    mkdir $HOME/bin
    cd /home/git/bin
    git clone git://github.com/sitaramc/gitolite
    
  6. 驗證使用者為 git 相關的設定 (user verification)
    # Verification 登入使用者 git
    # ------------------------------
    # git@ubuntu:~$ ls bin/gitolite/src/gitolite
    # git@ubuntu:~$
    # ------------------------------
    
    # ssh key generation and we have to type one and more enter key to check some interactive message.
    # In your Linux client and run your-name@your-ip-address-or-hostname:~$ ssh-keygen -t rsa -C "Git-Admin"
    # If you have already had the id_rsa.pub, we can skip previous step and run following command directly: (我們使用這一項)
    # scp ~/.ssh/id_rsa.pub username@git-server-FQDN-or-its-ip-address:~ then go back to the git-server
    
    
  7. 我們使用的是將本地端的 id_rsa.pub 上傳到 Git server 上
    要注意的是,我們在新建使用者 Git 的時候,我們並沒有為使用者: git 設定一組密碼,因此使用 scp 傳輸 public key 時,我們需要先傳給另一個使用者。
    並登入之後把檔案搬移到 git 使用者的家目錄下面。

    scp ~/.ssh/id_rsa.pub username@git-server-FQDN-or-its-ip-address:~
    
  8. 接著,執行下面的指令:
    sudo mv id_rsa.pub /home/git/Git-Admin.pub
    sudo chown git:git /home/git/Git-Admin.pub
    sudo su -l git
    bin/gitolite/src/gitolite setup -pk Git-Admin.pub
    # 離開使用者 git (logout)
    exit
    
  9. 安裝 GitWeb 與 Apache2 以及修改權限
    sudo apt-get install gitweb apache2
    sudo usermod -G git www-data
    sudo chmod -R 750 /home/git/repositories/
    
  10. 修改 gitolite.rc 設定檔並找到下面這一行改成:
    # sudo vim /home/git/.gitolite.rc
    UMASK value as 0027
    
  11. 修改 /etc/gitweb.conf 的檔案
    sudo vim /etc/gitweb.conf
    並修改下面這幾行:

    $projectroot = "/home/git/repositories/";
    $projects_list = $projectroot;
    
  12. 重新啟動 Apache HTTP server
    sudo service apache2 restart
    
  13. 有啟動防火牆設定的話,記得將 ufw 允許 http 可以有外部連線。
    sudo ufw allow http
    
  14. 複製 gitweb.conf 設定檔
    sudo cp /etc/apache2/conf.d/gitweb /etc/apache2/conf-available/gitweb.conf
    cd /etc/apache2/conf-enabled
    sudo ln -s ../conf-available/gitweb.conf
    
  15. 修改位在:/etc/apache2/conf-available/gitweb.conf 的設定檔
    <Directory /usr/share/gitweb>
    # 修改這一行
    Options +FollowSymLinks +ExecCGI
    AddHandler cgi-script .cgi
    # 如果有 HTTPS 連線的需要,則需要使用以下的設定
    # 從下面開始,是要啟動 rewrite module 之外
    # 設定強制使用 HTTPS 進行連線
    # 可以進行 HTTPS 連線有:Cloudflare and Let's encrypt
    AllowOverride All
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </Directory>
    
    
    # 接著重啟 Apcahe2 服務與啟用 cgi module
    sudo a2enmod cgi
    sudo service apache2 restart
    
  16. 最後,輸入網址:http://you-ip-address-or-hostname/gitweb 就可以看到 GitWeb 的清單了。
  17. 下面是要新建一個 repository 的方法
    git clone git@your-ip-address:gitolite-admin.git
    
  18. 接著切換到:gitolite/conf/gitolite.conf 編輯:
    
    RW+ = Git-Admin
    
    repo testing
    
    RW+ = @all
    

    像這樣就是新增一個名字叫做 testing 的 repository。如果要新增其他的,就依照新增 testing 的格式,再增加一個 repository.
    接著輸入: git commit -m “your commit message" && git push origin master

    這樣就完成新增一個 repository 了。

    [延伸閱讀]

    1.  為 VPS 增加 SSL 憑證:以  Let’s encrypt 為例
    2. 如何使用 Cloudflare 作為 DNS 代管
    3. 為你的 GitWeb 增加 HTTP-basic-Authentication
    4. 利用 reverse proxy server 把 git server 藏在其後面,增加安全性,以 Nginx 為例

WAMP Server3 安裝的注意事項

這一篇主要是提醒自己,WAMP Server 在版本 3 以後有顯著的安裝改變,特別是在要求 Windows 作業系統,VisualStudio 可轉散發套件,以及 Apache 設定上與之前有很大的不同。

詳細更改的注意事項,可以參考這裡

我目前需要注意的事項有:

  1. 目前這版本的作業系統開始已經不支援Windows XP 以前的版本。
  2. VisualStudio 可轉散發套件需要最新的版本。
  3. Apache2 目前只支援安裝成服務的形式
  4. 預設 PHP 有 5.6 跟 7.0.10 這兩個版本,可以自由的切換。
  5. Windows 7 我在安裝之後,缺少 vcruntime140.dll 而無法啟動 WAMP server 3 所以在下載 dll 擋之後,放到 c:\windows\system32 底下,再重新啟動就可以正常運作。
    缺少的 DLL 檔案可以在這裡下載

目前就只有遇到這些問題,再來就是 XAMPP 也是另外一個在 Windows 上受歡迎的 Apache + PHP + MySQL 的整合方案之一。

我現在是沒有再用,不過聽說他很快在 PHP 7 出的時候就快速更新版本上去惹@@,所以也是不錯,我也蠻推薦使用的。

之後想到再補充。

[名詞小解釋]

WAMP=Windows Apache MySQL PHP 的縮寫。

目前最新版本的資料庫仍是使用 MySQL 5.7

XAMPP=Crossed-Platform Apache MySQL Perl PHP

X即為跨平台,所以XAMPP有出跨平台方案,包含:Windows, Linux  and MAC OS

目前新版的資料庫已經轉換成為:MariaDB

研發替代役的一些面試心得

研發替代役的面試對我來說已經事告一個段落了,找這個項目就是等同於再找一般工作一樣辛苦。

畢竟現在工作也不好找,對於一個不是四大血統又是北部某間海邊大學的阿宅來說,是一件不容易的事。

我只能靠著平常的貢獻 Github 專案與平時開發累積的作品來提升一些非學歷相關的技術與能力。

以及剛有一點小成就的論文衝個場面,這些都準備齊全之後,就開始投履歷惹。

隨信附上充滿各式作品與貢獻的的Github帳號XD

大概從9月開始的時候,就準備好履歷開始投惹。

  • 群暉
    應徵工作:MIS 工程師
    第一次面試就去面在科技板上的大魔王
    工作內容:負責開發與維護公司內部應用系統使用到的程式語言大多是以 PHP 做為開發。面試流程:首先第一關是進入人資,人資開始請你自我介紹,以及詢問關於此工作以及你自己的人格特質。
    第二關則是工程師,首先也是自我介紹以及作品相關簡介,接著他就說:你知道我們的規矩吧?時間差不多了,我們來寫點程式吧!
    接著我就來到了小白板面前,他就跟我說:你最熟悉的排序演算法是什麼呢?我想想只好說:氣泡排序法吧!於是我就開始寫我的氣泡排序法。
    我很快就寫完了,不過我發現我寫的像是插入排序法 ORZ….接著被糾正之後,我想了大概 5 分鐘左右吧,終於把它改成正確的版本,以及更近一步需要提升效能。
    所以又改了第二次的版本。他看完並出去之後,沒多久就進來一位 MIS 主管,一樣開頭是自我介紹之後,接著問我有什麼問題要問,後來問的差不多之後面試就到這裡結束了。

結果:無聲卡

  • 歐酷網路
    應徵工作:Node.js 工程師
    這次面試時在是有些倉促,因為從遠地趕過去,還有些許的遲到,所幸還是到了公司,這家是一家新創的公司,自詡為亞洲版的 NetFlix,目前主要的服務是台日韓陸的戲劇。
    當然在我面試完之後,就有韓劇版權問題上新聞惹QQ。工作是主要是負責公司內部開發與維運應用系統。前後端都使用 JavaScript 做為開發的程式語言,當然對我來說其實就還好,不過我之前想說使用 PHP 比較多。
    但是 JavaScript 來開發後端我也有興趣,所以這間公司我也去投看看惹。第一關是技術相關的面試,近來是一位年輕的工程師,名片抬頭是架構師,接著就開始我自己的自我介紹,以及知識方面的問答,問的知識範圍極廣,從軟體工程的概念,到 Map/Reduce 以及 CI/CD 的概念皆有,以及 Node.js 上一些與 PHP 不同的特性都有。我有些自認為回答不是很好,有些就還可以,最後第一階段就結束了。第二階段是負責公司營運的經理,一樣有自我介紹之外,主要是關注在人格特質以及公司的介紹以及未來的發展。經理對於公司的營運與前景有一定的信心,在他的眼神中,看到對公司營運有信心。之後面試就結束了。

結果:感謝函

  • 艾絲資訊
    應徵工作:PHP 全端工程師
    這家是一家做運動器材的為主的公司,我應徵的是 PHP 程式設計師,主要是開發公司內部的系統之外,基本上就是電子商務網站開發為主。面試只有一個階段,由一位資深工程師面試,主要內容試提及技術方面問題作探討與面試以及我之前作品進行提問。此網站系統目前多以 Laravel 框架作為開發。

結果:無聲卡

  • 異術科技
    應徵工作:PHP 程式設計師
    這家是一個專門接政府的案子的公司,主要負責的像是有立法院的視訊會議系統等等,大多都是駐點在外,公司裡面的人很少。
    面試我只有到第一階段,一進去之後,一個人資大嬸發了一個履歷表示意要我填寫,我填寫完之後,接著等了快 10 分鐘左右,進來了一位資深工程師跟我面試,接著就開始我的自我介紹跟一些相關的經歷介紹,他後來覺得不錯,不過看到新水就皺眉頭,說碩士起薪只有 38K?要 45K 以上需要說服我為什麼可以給這個價碼以及跟其他人有什麼不一樣,後來我就說我有做一些作品而且也貢獻過專案,他還是說我沒經驗。那他這樣不就白問了嘛…….不懂後面問我這個問題最後還回這個答案的目的是什麼,後面有點讓人傻眼。他覺得我 ok 所以跟我說如果要進來的話再通知人資請他安排第二次面試談有關薪水的部分。

結果:婉拒二面

  • 資策會:大數據所
    應徵工作:前後端工程師
    因為資策會的面試我是直接參與它的聯合甄選,所以就跟同一批的人考英文和進到第二階段的複試這樣。
    基本上的面試過程時間非常的快,大概問了工作內容和基本的自我介紹,以及人格特質之後,面試就這樣結束了。

結果:offer get

  • 資策會:創研所
    應徵工作:後端工程師
    如同上面,也是在甄選的時候一起面試的部門,不過輪到我的時候,我在那裡坐了將近 20 幾分鐘,聽工作人員說面試的主管都跑去開會了….冏。接著好不容易來了一個資深工程師,接著自我介紹之後,就開始針對我的論文跟作品進行介紹與提問,介紹完了之後,他就簡單的自我介紹有關於他們部門目前在做的事情,現在他們目前在跟百貨公司進行合作,有關於百貨理餐廳的排隊快排系統,我提出一些想法與問題之後,面試就到這邊結束了。

結果:無聲卡

  • 資策會:教研所
    應徵工作:Internet 程式設計師
    有別於聯合甄選,他們是自己放消息出來要找人,所以我是自行投遞履歷進行應徵的。所以這是我應徵資策會裡相關的工作裡面,最早跟我聯絡的部門,也是有不一樣的要求,先是請我做一個投影片,從自我介紹,論文以及自我個人作品都放進去,面試時進行介紹,面試我的是一位組長。所以我也按照這個流程報告結束之後,開始聽他們目前在做的事情,教研所目前是在做有關於與教育相關的結合,所以大多跟學校有合作,目的是開發出一些應用系統與教育科技產業相關做結合。
    二面也是事後與他聯絡,並將投影片寄給他。

結果:二面無聲卡

  • KKBOX
    應徵工作:軟體工程師
    也是另類的大魔王,跟 PTT 科技板所講的一樣,從去年開始改成使用 codility 的服務來作為第一階段測驗面試者,這個服務就是企業付錢讓應試者考試,來判斷應試者的程式能力,雖然我在事前有做了有關於 codility 上面的練習題,不過考出來的跟我練習的內容與方向有些許的落差,所以考起來很鳥……

結果:感謝函

  • 甲尚科技
    應徵工作:前端工程師
    第一次面試有前端小測驗,主要是考一些像是前端的基本概念,還有 Bootstrap Layout 呈現是什麼樣子,請畫出來,考 Grid 的概念,以及 jQuery 的使用等等。我覺得蠻簡單的,所以大概 10 分鐘左右的時間就把測驗卷寫完了。接著就開始面試了,也是只有第一階段,直接進來兩位工程師跟我面談,大多內容也是跟自我介紹和過去的經歷進行提問,最後再問我想知道公司的一些事情。
    目前他們最主要產品以動畫軟體開發與販售為主,目前正在推出線上編輯動畫的網頁版,以及進行官方網站的首業改版,所以需要招一些會前端相關技術的人來開發公司所內需的網站以及產品網站。
    目前前端技術最主要是使用:AngularJS 與 jQuery 這兩個框架為主,還有 Grunt 等自動化測試做為輔助的工具。

結果:感謝函

  • 和沛科技
    應徵工作:後端工程師
    我是看到 PTT 科技板上有和沛的徵才相關的心得,因此我就抱著值得一試的心情投看看,接著就安排了第一階段的電話訪談。電話訪談就是有兩位工程師會先請你自我介紹之後,再輪番問你很多技術面的問題,以及就你開發的作品裡面題出問題請你試著去解決,有些我回答得不是很好,所以某些地方都卡有點久。
    最後就是讓你問想知道有關於公司的事情,我剛好有問一題,因為公司是很多的產品線,那有沒有可能產品結束被收起來?
    結果他跟我說他們做的都是長久產品線,不會說收就收。(我是在裁員風暴之前去面試的)然後就一語成讖惹 QAQ

結果:感謝函

  • 工研院
    應徵工作:資通所_光通訊網路技術部(K組)  資通所_資料中心架構與雲端應用軟體組(X組) 資通所_資料中心系統軟體組(F組) 以及資科中心
    這是我遇過最神奇的,我投了兩間有關工研院的工作,結果有面試邀約居然是這兩間以外的….而且人資還把 K 跟 X 組都排在同一天……..冏。
    K組,進行自我介紹之後,認為我還可以,所以就沒有進行筆試惹 0.0,接著進到二面,最後到跟組長面談,總共有三面(真漫長) 。
    結果 → offer getX組,原來我高中同學在這部門實習@@,開始前先進行一段筆試,接著三個階段面試,第一是主管,第二與第三都是資深工程師,時間老實說不是給得很好,一下面試又一下子筆試,因為安排的問題…..冏。
    結果→無聲卡不過友給交通費還送一個隨身碟紀念品,感覺挺不錯的(?F組,我事先不知道,原來這部門是我學姐的部門@@,一樣前面先筆試,考試卷可以選 C 或 JAVA ,接著一小時之後開始面試,分為兩階段,二個階段基本上都是注重在作品跟自我介紹裡面,要開發什麼以及問一些情境的問題等。
    二個階段中我覺得是答得還可以。反而是考卷我覺得有些差強人意就是了…….

    結果→無聲卡 (聽學姐說沒上 QQ)

    資科中心,本來是請我約個時間來進行視訊面談即可,不過剛好我那天有 F 組的面試,
    所以我就把面試排在同一天惹。

    面試大概是在講你曾經修課的內容,還有從你的自我介紹之中,提出問題,在團隊
    開發中有沒有遇到什麼困難等,最後問一些問題之後就結束了,資科中心大概就是工研院
    裡的 MIS 部門,負責整個院裡所有的機房 server 等設備維護以及維運。編制算是在整
    個資通所中最少的一個部門。

    結果→無聲卡

  • 聖洋科技
    應徵工作:PHP 全端工程師
    這家就是大河馬大大所開的公司,公司內容是廣告代理商,工作地點在新竹,開發基本上都是集中在新竹。
    面試分成兩個階段,第一階段是填寫基本邏輯測驗,性向測驗,英文測驗以及 PHP 相關的程式小測驗,可以上網查@@
    筆試結束之後,開始二階段的面試,第一階段就是資深工程師,最主要是說明因為愾了我自己的部落格還有我在 Github 上面的創作。覺得很有興趣,所以就請我來面試惹0.0
    所以面試就在愉快的氣氛下結束,接著下一階段是主管面試,基本上問了一下關於論文內容還有自我介紹之外,還有 offer 和上工時間,就差不多結束了,本來主管她是跟我說二個禮拜之後再問我下禮拜的意願,我就說好,沒想到隔天就打電話給我惹 0.0要我進行下一階段的主管面試,地點在台北,所以就先約了下禮拜進行面試。到了台北的分部,發現原來是新的公司,主要是銷售為主,也有少許的開發在台北的分部。
    這一次面試也見到人資姐接,並帶我去面試主管的房間進行最後一次面試,內容大概就是自我介紹還有人格特質等。

結果:offer get

  • 中華電信
    應徵工作:軟體工程師 (應徵有關於大型系統開發與設計以及前後端工程師),部門我是選數據分公司
    就聯合甄選,我以為會進到第二階段,結果書面就掰了 QAQ

結果:感謝函

  • 台積電
    應徵工作:軟體工程師,其實是投好玩的,大概就收感謝函吧。

結果:感謝函

 

[綜合心得]

最後我要感謝我學長,時常關心一些我們的動態,還有我做了什麼事也會給我一些建議。要感謝人太多了,還是謝天吧!

覺得找工作就是這樣,幾家歡樂幾家家愁,只有把自己準備好,剩下就靠運氣和實力惹,謝謝大家觀看!

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