[golang] Heroku 平台操作練習

從PHP轉戰golang,超級不習慣的,因為之前也沒有MVC的概念,學習之路更是艱辛
於是我出了個題目給自己:

Heroku + Golang + Git command deploy

我,三種全部都不會!!

沒關係,這就是學習的好機會,來吧!

*環境:Mac OS X El Capitan 10.11.6

Step 1. 安裝Go

先把golang環境架起來吧!
到官網下載golang,我習慣自己處理套件,不裝包好的pkg

sudo tar -C /usr/local -xzf go1.7.3.darwin-amd64.tar.gz

那個版本之類的要記得自己調整啊,我打這篇的時候版本是1.7.3
接著是設定環境變數

nano ~/.bash_profile

加入這幾行

#Go Lang
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/Desktop/Trees/Go
export GOBIN=$GOPATH/bin
export PATH=$GOPATH:$GOBIN:$PATH

我解說一下,第一個export把go本身執行檔、編譯之類的弄進環境變數,第二個是GOPATH,是整個Workspace的位置,go跟某些語言一樣有自動套件相依檢查機制,所以整個Workspace就是你的套件庫。第三跟第四個是export我們利用go get從repository抓下來的工具。

然後你就可以挑一個你喜歡的editor來玩囉,我是開始學習使用Visual Studio Code來玩golang拉,那GUI的特性帶來的許多方便,雖然我還是覺得他比Sublime Text 3肥了些。

Step 2. 安裝Heroku

這段就直接安裝Heroku包好的pkg了

https://devcenter.heroku.com/articles/heroku-command-line

然後,別跟我說你沒裝git…

Step 3. 測試Heroku

首先介紹幾個heroku常用指令:

heroku login : 登入heroku
heroku ps : 目前使用中的Process,也會顯示剩餘的dyno hour(heroku的計價單位)
heroku create : 創造空的app,create後面可以帶參數,會成為app的name
heroku logs : 查看log檔

假設我們已經申請好Heroku帳號,下一步就直接登入了:

heroku login

untitled

登入之後,我們可以先從遠端拉個Hello World來玩玩看Heroku的部署,輸入以下指令:

go get github.com/heroku/go-getting-started

你會發現,有一包資料夾叫做go-getting-started,出現在你設定的GOPATH裡的src資料夾,沒錯,你已經學會利用go get抓git上面的repository了!
我們切換到該reposiory中,準備部署至heroku上看看

cd $GOPATH/src/github.com/heroku/go-getting-started
heroku create
git push heroku master

這邊講解一下,我們切換到repository之後在做heroku create的動作,目的是因為heroku他會自動針對此repository,將遠端分支”heroku”設定為heroku即將產生的app git位置,在鍵入heroku create之後,他會給你兩個網址:

獨立網址,例如:https://fierce-beyond-60579.herokuapp.com/
Git Repository,例如:https://git.heroku.com/fierce-beyond-60579.git

獨立網址就是此app的唯一位置,他的git就是你之後deploy的對象。

是的就是這麼簡單,你已經部署了hello world上去heroku囉!…什麼?你說你失敗了?
我猜你一定沒有把SSH KEY給heroku!

ssh-keygen -t rsa
heroku keys:add

是的,跟github一樣,要把ssh加到網站上面才能開始一切操作喔!

Heroku也提供本地測試,只需要輸入:

heroku local web

他自己就會監聽5000 port了!
如果是自製的Project,遇到heroku local不能跑的時候,記得檢查有沒有產生Procfile檔案(請參考heroku文件,他很簡單的就只是告訴heroku你的app在process裡叫做什麼名字),或是檢查你的自製Project有沒有執行過 go install -v

Step 4. 部署自己的App

相信你已經準備好自己的Hello World專案準備弄上這個免費雲端,但是!部署前要先知道遊戲規則,要在Heroku上面部署自己的app的話,你需要裝官方認得的相依性套件管理工具,我們會以godep來做範例。

Godep相當的方便,跟go get差不多,但是它是把所有跟你的專案有關的套件都抓到你的app資料夾裡,可以獨立運作也方便管理,同時也會自動產生一個相依列表”Godeps.json”,Heroku就是以這個檔案來當作識別,抓取你app的相關資料。

安裝指令:

go get github.com/tools/godep

使用方式:

godep save ./

好的,到這裡為止,應該準備的差不多了,不過我這邊要特別註解一下關於git的部分,因為小弟平常用git都是GUI操作,只知道幾個關鍵名詞但是對command line操作git完全沒概念,所以就來記錄一下!

我們先介紹幾個常用的指令:

git init : 初始化你的project,主要是產生 .git 資料夾
git remote add <remote> <url> : 新增遠端git位置
git remote remove <remote> : 移除遠端git位置
git remote -v : 查看遠端詳細位置
git add -A . : 一次新增所有檔案,準備commit
git commit -m <title> -m <message> : commit 加上訊息 git status : 顯示目前repo狀態
git push : PUSH到指定的遠端與分支

我們假設你已經寫好你的Hello World了…什麼?你還沒寫?好吧,我的借你抄一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    http.HandleFunc("/", hello)
    fmt.Println("listening...")
    err := http.ListenAndServe(":"+os.Getenv("PORT"), nil)
    if err != nil {
        panic(err)
    }
}

func hello(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintln(res, "hello, world")
}

稍微說一下,一般我們在處理Listen Port時會直接寫上例如:5000這樣,但是在Heroku線上,他只開80 Port給你,並且寫好了環境變數,使用方式就如我的範例那樣,os.Getenv(“PORT”)就可以拿到80這個數字,不包含冒號喔!

跑完godep、跑完git init,準備好Procfile檔案(反正就是在專案根目錄生一個叫做Procfile的檔案,裡面寫著 web: go-getting-started 即可,詳情請看https://devcenter.heroku.com/articles/getting-started-with-go#define-a-procfile),就可以準備部署了,我們可以先檢查一下自己的git remote 分支 heroku 目前被指向誰,輸入 git remote -v:

untitled

請注意看我的heroku目前被指向 https://git.heroku.com/young-ridge-89894.git ,這代表我如果在這個專案進行部署,會被部署到heroku上的young-ridge-89894這支app,如果你確定這是你的目標,那接下來就好處理了,但是如果不是,記得鍵入以下指令:

git remote remove heroku 

並加入遠端目標,例如:

git remote add heroku https://git.heroku.com/polar-sierra-53616.git

如果你是想要部署在新的app上面,只要在remove之後直接heroku create即可唷!
如果你的遠端目前已經被某個別的project部署過,只要在部署時加上 -f 就可以強制部署了!

部屬就跟git command操作一樣,先add、再commit、再push到遠端
範例指令:

git add -A .
git commit -m "Test"
git push heroku master

untitled

登登登登~完成了!

後記

我覺得應該可以開一篇關於go framework的東西XD
在範例專案 github.com/heroku/go-getting-started 中,他是使用了gin-gonic這個framework來開發的網頁,包含了html template的使用方法在裡面,感覺很好玩!

還有在利用Visual Studio Code的時候,發現了Git History這個套件(https://github.com/DonJayamanne/gitHistoryVSCode),他可以直接在Visual Studio Code中看到Git Log的Graph唷!使用方式就是 CMD + shift + P ,選擇 git view history (log) 。

阿對了,如果你是從Sublime Text轉來使用的人,可以打開一個功能,絕對會讓你有回到家的感覺,於選單的「使用者設定」中,插入以下:

"editor.renderIndentGuides": true

瞧瞧他打開了什麼?是垂直整理線!

——參考文獻——
[1] Getting Started on Heroku with Go – https://devcenter.heroku.com/articles/getting-started-with-go
[2] Go Dependencies via Godep – https://devcenter.heroku.com/articles/go-dependencies-via-godep
[3] Heroku Local – https://devcenter.heroku.com/articles/heroku-local
[4] Godep – https://github.com/tools/godep
[5] Managing Your SSH Keys – https://devcenter.heroku.com/articles/keys
[6] Deploying a Golang Project to Heroku – http://www.zhubert.com/blog/2014/03/08/deploying-golang-to-heroku/
[7] Manage Dependencies With GODEP – https://www.goinggo.net/2013/10/manage-dependencies-with-godep.html
[8] Git 教學(1) : Git 的基本使用 – http://gogojimmy.net/2012/01/17/how-to-use-git-1-git-basic/
[9] Getting Started with Go on Heroku – https://mmcgrana.github.io/2012/09/getting-started-with-go-on-heroku.html
[10] [NodeJS] 將程式部署到 Heroku 上 – NodeJS on Heroku – http://cire.pixnet.net/blog/post/37369672-%5Bnodejs%5D-%E5%B0%87%E7%A8%8B%E5%BC%8F%E9%83%A8%E7%BD%B2%E5%88%B0-heroku-%E4%B8%8A—nodejs-on–heroku
[11] Gin Gonic – https://gin-gonic.github.io/gin/
[12] How to attach my repo to heroku app – http://stackoverflow.com/questions/6877915/how-to-attach-my-repo-to-heroku-app
[13] Overwriting an existing Heroku app – http://stackoverflow.com/questions/14437903/overwriting-an-existing-heroku-app
[14] 在Heroku部署Rails專案結合AWS S3存放上傳圖片 – http://springok-blog.logdown.com/posts/2015/10/29/heroku-deploy-a-rails-project-with-aws-s3-storage-upload-pictures

[Ubuntu] [長期] Hadoop 兩個Node實作

Environment:

Node1&2 : Ubuntu 12.04.3 64bit
Controller : Ubuntu 12.04.3 32bit
Java ver. : Java 7
Hadoop ver. : hadoop-1.2.1.tar.gz

三台機器隨著離開研究所以後…還回去了XD
先暫停此計畫

閱讀全文〈[Ubuntu] [長期] Hadoop 兩個Node實作〉

[長期] 雲端程式設計 – 三種方式教學與筆記

一些基本建立環境的方法

  • Google App Engine
  • Hadoop MapReduce
  • Microsoft Windows Azure

[Google App Engine]

@環境
Windows 8 Enterprise x64
Java 7u45 x64 + Eclipse Kepler x64
GAESDK 1.8.8 + GWTSDK 2.5.1

使用Google帳號,有基本免費功能
申請開通AppEngine : https://developers.google.com/appengine/

比較免費與付費:
資料有點多,免費功能會出現在Dashboard請自行參考,付費功能請參考網頁
https://developers.google.com/appengine/pricing

下載Google App Engine SDK for Java,放在自己喜歡的位置 : https://developers.google.com/appengine/downloads
下載安裝JDK(7、6無差別,32、64位元無差別)
下載Eclipse
裝外掛,找適合自己Eclipse的版本 : https://developers.google.com/eclipse/docs/download

勾選:
Google Plugin for Eclipse (required)
GWT Designer for GPE (recommended)

如果GWT掛失敗,可自抓 : http://www.gwtproject.org/download.html

@測試

點選藍色GTD球,New Web Application Project

SDK失敗的人,自調囉。
初級部屬會在localhost:8888,成功Hello World之後,GTD選Deploy to App Engine,調App Engine project setting後就直接Deploy。

[Hadoop MapReduce]

@環境
1. 實體機器 Ubuntu 12.04.3 x64 兩台(Node)、Ubuntu 12.04.3 x86 一台(Master)
2. 虛擬機器 尚未建置

教學請參考另一文章

[Microsoft Windows Azure]

要錢…試用期一個月,尚未申請殭屍帳號。

VMware 時間鎖定

Step1:

產生好虛擬機器後先不要Power On,安裝作業系統前,在VMX檔加入以下參數:

tools.syncTime = “FALSE”
time.synchronize.continue = “FALSE”
time.synchronize.restore = “FALSE”
time.synchronize.resume.disk = “FALSE”
time.synchronize.shrink = “FALSE”
time.synchronize.tools.startup = “FALSE”

(其中tools.syncTime有可能已存在,我猜是因為我這次的機器是已經安裝過VM Tools的機器,只是格式化後重灌,他大概是裝完VM tools之後會有的參數)

Step2:

拔掉網路卡,開進BIOS調時間

Step3:

安裝完作業系統之後,取消勾選網路自動時間校正,裝上VM tools,重開機,檢查時間是否正確會跑掉

建議盡量在產生虛擬機器的時候不要裝網卡,根據實驗,無論有沒有加入上述參數或是關掉自動時間Update,只要連上網路時間都會自己Update。建議可以搭配時間修改器來做Drag and Drop,安裝VM Tools之後記得搜尋整個虛擬環境裡特定時間範圍內的檔案來進行時間修改,製作完整的虛擬環境。

[Ubuntu] 用VMware跑Ubuntu 8.04 II

[貳章:I don’t know how to write c language in Linux]


我又在一次的產生了虛擬機器
這次我加大了硬碟跟記憶體

一開始都是一樣的步驟
然後更新

等一切安頓好之後
我打開Mozilla Firefox
開始瀏覽網頁

正當我想使用滾輪時
滾輪沒反應…
我還以為滑鼠壞了
切回Windows去卻可以正常使用

不能用滾輪是哪招阿?!
於是我搜尋了一下
"如何在Linux使用滾輪"
果然有人遇到同樣的問題

這時我才發現
Ubuntu的終端機指令使用方法
sudo 布拉布拉布拉
接著打開類似硬體核心指令碼的東西
要我自行修改一下內容
反正…指令如下

sudo gedit /etc/X11/xorg.conf

此時會開啟核心檔
接著往下找 (不會太遠,大概二三十行左右)
直到你找到某篇幅長這樣:

Section “InputDevice”
Identifier “Configured Mouse”
Driver “vmmouse”
[.. 布拉布拉布拉..]
EndSection

把這段替代成下面這段:

Section “InputDevice”
Identifier “Configured Mouse”
Driver “vmmouse”
Option “CorePointer”
Option “Device” “/dev/input/mice”
Option “Protocol” “ImPS/2”
Option “Buttons” “5”
Option “ZAxisMapping” “4 5”
EndSection

哇嗚
重新開機之後我的滾輪就復活了!

接著打開我的無名網誌
哎呀呀 差點忘了裝Flash Player
馬上連到Adobe官網
載了Linux專用的FlashPlayer10

糗了…
怎麼不能開?

我看了一下版本號
Linux,32 bit,Flash Player 10

32bit…………….

我都忘了我的是64bit
看來又要搜尋一下了
"Linux Flash 64bit"

啊哈!
我遇到的都是小問題
網路都找的到

在Ubuntu AMD 64 bit安裝 Adobe Flash Player 10 :

$ wget http://queleimporta.com/downloads/flash10_en.sh
$ sudo bash ./flash10_en.sh

逛完網誌突然想起來
程式設計有作業

Ubuntu好像沒有C++程式
打開類似"新增/移除程式"的東西找找
有幾個內容有寫到C++的
我全部都裝

可是沒有一個能編譯C++…

然後我就想到
Ubuntu有沒有方法可以跑Windows的程式

於是我找到了Wine HQ

Wine是一個在X86X86-6上容許類Unix操作系統在X Window System下運行微軟視窗程式的軟體。另一方面,電腦程式設計師能經由Wine的程式庫將視窗的程式轉移至類Unix操作系統中運行。

這麼完美的東西也是有缺陷的
Microsoft似乎是跟Linux有仇
Visual C++ 6.0沒辦法安裝…

好吧
我只好關掉機器
繼續用Windows寫程式了

看來想要完全依賴Ubuntu
還需要一點努力喔

---------------------------
版本資料:
Ubuntu 8.04 Live CD for AMD 64bit
貳章使用之vmx資料:
硬碟20G
記憶體512MB

[Ubuntu] 用VMWare跑Ubuntu 8.04

[序章:The First Install of Ubuntu 8.04]

聽說最近是銘傳期中考
很認真的我
某天打開電腦準備查資料
查始計的翻譯
查完之後準備要關機睡覺

忽然發現桌上有一片CD
仔細端倪了一下,不是A片…
是我燒起來放很久的Ubuntu

突然很想裝來玩玩
此時心中有個聲音
"要期中考了…睡覺吧!"

不!好像很好玩耶!
於是我去抓了VMWare的開機檔
硬碟5G,記憶體384MB
跑吧!Ubuntu!

用的有點不順
記憶體好像不太夠
第一次裝哪會想這麼多

好慢!超級慢!
時間都浪費在等待上面了
等更新
等回應
重點是我沒有辦法用滑鼠滾輪
超麻煩的!
然後要抓Firefox的FlashPlayer外掛
又不給我裝…

於是我砍掉重練了…

(續)

---------------------------
版本資料:
Ubuntu 8.04 Live CD for AMD 64bit
序章使用之vmx資料:
硬碟5G
記憶體384MB