2014/02/18

deploy時常用的linux指令

本篇為在linux server上做deploy時常會用到的指令筆記

連線到遠端主機

假設我們要deploy的目標主機為192.168.1.100, 可以用下列方式連線

  • mac os:開啟[終端機]後輸入下列指令後接著輸入帳號、密碼

    ssh root@192.168.1.100
    
  • windows:需安裝支援ssh的軟體例如putty、pietty,接著填入連線資訊後執行連線即可

從遠端主機下載檔案

假設有3台機器,一台正式機(linux)、一台測試機(linux)、一台自已在使用的電腦(windows)。假設正式機的程式需要做更新,但更新的程式檔是放在測試機,有2個方式可以將測試機上的程式檔copy到正式機上

  1. 在自已的電腦裝sftp軟體,例如filezilla,接著先從測試將檔案下載下來自已電腦後再上傳到正式機上,這樣的方式比較直覺簡單但會多花一倍的時間在檔案傳輸上(測試機->本機->正式機)。如果檔案size很大的話就不適合用此方法。

  2. 直接從正式機直接從測試機下載檔案(測試機->正式機),指令如下

ssh root@192.168.1.100 (先從本機連到正式機)
sftp root@192.168.1.150 (再從正式機sftp到測試機)
ls (查詢測試機上的檔案,可配合cd, cd .. 來切換目錄)
get xxxx.zip (從測試機上下載檔案至正式機的當前目錄下)

實際的畫面大致如下(假設已事先連到正式機192.168.1.100)

[root@192.168.1.100]# sftp root@192.168.1.150
Connecting to 192.168.1.150...
root@192.168.1.150's password:
sftp> ls
gabriel_20140218.zip    kokola_20140218.zip    kokome_20140218.zip
sftp> get kokola_20140218.zip
Fetching root/kokola_20140218.zip to kokola_20140218.zip
/root/kokola_20140218.zip           100%  12100KB 121.4KB/s   00:00

基本檔案操作指令

  • 解壓縮 (只能解壓縮在當前目錄,要解壓縮在別的目錄的話請解壓縮完後再做搬移)
tar zxvf gabriel.tgz
unzip gabriel.zip
  • 壓縮目錄(可用在將當前的程式做壓縮備份)
tar zcvf gabriel.tgz gabriel
  • 搬移目錄 mv (可用在備份當前的程式,如果deploy失敗後再從備份還原)
mv gabriel bak/gabriel-20140217
  • 刪檔案 rm
rm gabriel.zip
  • 刪目錄(含底下的目錄、檔案)
rm -rf gabriel
  • copy目錄(含底下的目錄、檔案)
cp -af gabriel gabriel_bak

故障排除

當程式更新完且web server重開後,如果browser連不上時,可以用下列指令來檢查是否哪邊出了問題

  • 檢查80 port是否開啟
[root@192.168.1.100 ~]# netstat -an|grep 80
tcp        0      0 0.0.0.0:8009                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN
  • 檢查java process是否存在
[root@kokola WEB-INF]# ps aux|grep java
root      1615  0.0  0.0   5852   800 pts/0    S+   11:03   0:00 grep --color java
root     24957  0.4 22.4 821476 229064 ?       S<l  Feb12  40:34 /usr/java/latest/bin/java -Djava.util.logging.config.file=/usr/share/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/usr/share/tomcat7/temp org.apache.catalina.startup.Bootstrap start
  • 檢查java用了哪些port
[root@192.168.1.100 ~]# netstat -apn |grep java
tcp        0      0 0.0.0.0:8009                0.0.0.0:*                   LISTEN      24957/java
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      24957/java
tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      24957/java
  • 查看cpu狀況(看哪些process占用多少cpu資源)
[root@192.168.1.100 WEB-INF]# top

top - 10:59:49 up 13 days,  2:00,  1 user,  load average: 0.08, 0.06, 0.01
Tasks: 176 total,   1 running, 175 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.4%us,  0.6%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1020656k total,   782344k used,   238312k free,   159420k buffers
Swap:  2064376k total,   164140k used,  1900236k free,   135812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1757 rabbitmq  10 -10  140m  18m 1584 S  1.7  1.8 242:23.18 beam.smp
 1480 root      20   0  2704 1136  868 R  0.7  0.1   0:00.52 top
24957 root      10 -10  802m 223m 5228 S  0.3 22.5  40:33.85 java

工具指令

  • 查看本機的ip
[root@kokola ~]# ifconfig
  • 查看當前系統時間
[root@192.168.1.100 WEB-INF]# date
二  2月 18 11:05:49 CST 2014

下列指令可修改系統時間,不過建議還是將該server設定time server,自動同步時間而非手動
date -s 22:10:30 改時間
  • 查看linux版本
cat /etc/redhat-release
  • 搜尋檔案 find
[root@kokola WEB-INF]# find / -name web.xml
/usr/share/apache-tomcat-7.0.42/webapps/kokola/WEB-INF/web.xml
/usr/share/apache-tomcat-7.0.42/webapps.backup/manager/WEB-INF/web.xml
/usr/share/apache-tomcat-7.0.42/webapps.backup/examples/WEB-INF/web.xml
/usr/share/apache-tomcat-7.0.42/webapps.backup/host-manager/WEB-INF/web.xml
/usr/share/apache-tomcat-7.0.42/webapps.backup/docs/WEB-INF/web.xml

設定ip

直接編輯/etc/sysconfig/network-scripts/ifcfg-eth0,在該檔案裡設定ip, mas, gateway...等, 存檔後需執行service network restart

[root@kokola WEB-INF]# vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
HWADDR=00:0c:29:55:24:b4
NETMASK=255.255.255.0
IPADDR=192.168.1.17
GATEWAY=192.168.1.1
TYPE=Ethernet

[root@kokola WEB-INF]# service network restart

改hostname

直接編輯/etc/sysconfig/network,在該檔案裡設定hostname

vim /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=kokola.maxkit.com.tw

查看檔案內容

如果deploy發生問題有可能是設定錯誤,可用下列指令看檔案的內容

less web.xml
檔案開啟後搭配下列指令
> (大於,畫面跳到頁尾)
b (往前一頁)
空白(往後一頁)
q (離開)

2014/02/17

企業遊戲化:5年級、90後,一起玩出競爭新策略 - Gabe Zichermann & Joselin Linder

人們似乎天生就會被某些遊戲吸引,每一個人喜歡的類型不同,遊戲通常都是由幾個重複的動作組成,每一個遊戲都有一些核心的程序,玩家必須要定時或是每一次去玩都得要重複那個動作,而人類為了消耗閒暇的時間,就會讓自己沈迷習慣於幾個重複的動作,美其名為休閒,但實際上往往有很多人會慢慢地被遊戲侵蝕,反客為主,把平常的時間都用在遊戲上,也就是上癮的症狀。

因應這種狀況,有越來越多企業,反過來利用遊戲化,來正向地增加參與者的投入感,能以更認真的心情,去進行企業希望某些對象花時間用心去做的一些事情。這本書將遊戲化的對象分成三個部份討論,分別是員工、客戶與群眾外包。

另外有一個重點,就是對象的人數必須要夠多,因為遊戲化需要消耗一些時間跟人力的成本去設計,如果對象不夠多,可能就不需要太過於精心設計這些遊戲,也沒辦法設計太過複雜的遊戲,畢竟企業投資也需要看成效,參與的人不夠多,玩家之間對抗的心理也會打折扣。

這就有點像是開心農場、candy crush爆紅的感覺,因為身邊的人都在玩,facebook 的朋友們都在上面競爭進度,慢慢地病毒式擴散出去,讓越來越多人去參與這個遊戲跟活動,但畢竟開心農場偷菜這種簡單又重複的東西,也會讓人厭倦,candy crush 越來越難的關卡,也慢慢地讓人卻步,因此要能有一款遊戲、一種方式,可以讓人長時間持續投入在其中,並不容易。

關於員工的部份,又可以分成兩個部份:一個是對內部的員工、一個是要招募員工。

針對內部員工,遊戲化可讓員工認同公司的文化,增強向心力,並引發工作上的創意,還有讓員工身心健康、教育訓練,也可以使用遊戲的方法。

範例:Ekins是 Nike 的一個九天訓練營,以故事的方式告訴員工公司的核心價值,甚至在活動後讓參與者可在腿上做勾形刺青,這是一種認同感。

範例:目標百貨利用遊戲機制,將結帳畫面做成遊戲的結果,鼓勵員工以更有效率的方式結帳,原本無聊的結帳動作,變成了一種良性競爭。

範例:MS 語言品質遊戲,讓世界各地的員工參與產品的翻譯檢查,以遊戲化的方式,讓員工主動參與,在出貨前找出有問題的翻譯。

範例:IDEOS 以角色扮演的遊戲體驗,讓設計師掌握整體的流程,進而提出更好更以使用者為導向的產品設計。

範例:美國陸軍以一款遊戲,吸引新兵從軍。

範例:google 以遊戲的方式,將招募資訊隱藏在裡面。

範例:萊雅以 Reveal 遊戲,讓學生全盤體驗化妝品產業中各項工作的內容,公司內部還能以遊戲的結果,來招募員工。

範例:萬豪酒店以遊戲體驗酒店內的工作,在遊戲結束,按鈕後就可以看到五萬個工作機會。

範例:國防採購大學採購弊端指標遊戲,教導員工發現弊端的方法。

面向客戶,遊戲化的方法就是抓住客戶眼球的方式,而且還需要持續,讓客戶能不斷回流,延續企業生命。

範例:foursqure 打卡遊戲,發出一些特別的徽章給使用者,例如玩家上場徽章、學校之夜徽章、某個地點的市長。

範例:Nike+, FuelBand 將運動資料記錄起來,創造以回饋為基礎的遊戲化體驗。

範例:Element Bar 是客製化的營養棒,使用者可在網站上設計 12 條營養棒,以 facebook 贈送的方式,吸引客戶的眼球。

群眾外包是藉由團隊的力量,大家一起合作完成一些事情,而這個特別的團隊,是在網路上的虛擬世界中得來的。

範例:Foldit是折疊蛋白質的遊戲,玩家花了10天就解決了科學家15年沒辦法解碼的酵素,用來研究 HIV。這些玩家大多沒有正式的數學或科學背景。

範例:StackOverflow 讓群眾回答問題,不像是 Yahoo 知識家單純地鼓勵用戶某種行為,造成回答的品質低下,StackOverflow是一套以同儕推動的聲譽系統,由其他人投票決定你的聲譽,有特別成就的人還有徽章。

範例:CNN 提出 iReport 公民新聞,授權公民記者收集獨家報導。

範例:KickStarter 讓所有人可以在上面提出構想,籌措資金,這也是驗證自己想法的一個好方式。

以下是幾種能讓人持續下去的方法,遊戲需要一個好方式建立持久的參與熱情。

  1. 清楚界定什麼是練功
    練功是某種簡單的動作,使用者要定期重複去做,日常生活中,打卡、回覆客服電話、參加例行會議都算是練功。在 Instagram 就是上傳相片,在郵差就是送信,但這些過程可能包含好幾個動作,使用者練功熟悉後就會成為習慣。
  2. 建立強大的參與循環
    提供情感動機 -> 社群性的行動號召 -> 激勵使用者再參與 -> 提供明顯的進展與獎賞 的循環。
  3. 讓內容時時保持新鮮
    以符合成本效益的方式維持內容新鮮,要找到方法,讓使用者彼此創造有趣的經驗。
  4. 善用有意義的誘因
    例如 RecyleBank 以 RFID 記錄回收項目,回收者可取得虛擬貨幣,向合作店家兌換商品、折扣,也能透過回收成就的分享,激發對成就感的需求。
  5. 針對個人需求,滿足掌控感
    Zamzee 健身記錄每個人的活動資訊,每天上傳後,進行統計,系統會不斷提供徽章及其他機制,鼓勵使用者持續維持,保持進步。
  6. 創造持續的學習機會
    Codecademy利用遊戲教導大家寫程式,在遊戲的過程中,完成學習。
  7. 讓忠誠度帶來獲利
    航空公司以里程兌換的方式,鼓勵使用者回流,頂級客戶可以不需要付費,享受航空公司提供的服務。

人們參與遊戲後,所得到的報酬,並不是單純只能給予金錢就好了,事實上金錢還有可能造成副作用,人們可以得到的報酬,可以是在虛擬世界的徽章、名聲,甚至是在 facebook 上朋友的讚,都是一種報酬,只要能讓玩家產生愉快的感覺,這樣的報酬就有作用,而且對企業來說,要消耗的實質成本很低。

企業遊戲化:5年級、90後,一起玩出競爭新策略

2014/02/14

MQTT(四)PUBLISH Message

前言:

上一篇提到建立起連線用的CONNECT Message,接著來談談和發佈訊息有關的Message,PUBLISH Message。

PUBLISH Message

PUBLISH Message是發佈訊息時會用到的訊息類型,它會使用在兩個方向:

  1. client對某個主題(Topic)散佈訊息,此時它會發送PUBLISH Message給Server。
  2. server收到了client發送給某個主題的訊息,server會把這些訊息已PUBLISH Message的方式發送給訂閱此主題的client。

每個PUBLISH Message都會包含一個topic name,代表此訊息要發送給哪個主題。

Fixed Header:

bit 7 6 5 4 3 2 1 0
byte 1 Message Type(3) DUP flag QoS level RETAIN
0 0 1 1 0 0 1 0
byte 2 Remaining Length

上面為PUBLISH Message裡面的fixed header,以下依依介紹它們的作用。

  • Message Type:每種類型的Message都要用到,要根據想用的訊息類型填上相對應的值,值可以參考先前貼的文章MQTT(二)Message Type and Flows。這邊由於是PUBLISH Message的關係,因此會填上0011。

  • DUP flag:標記此訊息為重複(duplicate)的訊息,會用在PUBLISH、PUBREL、SUBSCRIBE、UNSUBSCRIBE上。當client或是server要重新傳送上述訊息時,則要將此flag設為1。此flag會適用於QoS大於0的訊息。

    此flag 只能當成一種提示,表示此則訊息可能在之前有收過了,不應該拿它來當成訊息重複的檢查flag。

  • QoS level:設定此訊息的QoS level,只有在PUBLISH、PUBREL、SUBSCRIBE、UNSUBSCRIBE才會用到。可以參考MQTT(二)Message Type and Flows:PUBLISH flow來得知比較詳細的資訊。

  • RETAIN:設定訊息是否要保留在server上,此特性只有PUBLISH才會用到。當client發送PUBLISH Message給Server上的某個Topic時,如果將此flag設為1,則Server將此訊息發佈給當前的所以訂閱者後,必須將此訊息保留。

    當有一個新的client對此Topic進行訂閱,則Server必須把最後一則Retain flag設為1的訊息傳送給該client。被設為Retain的訊息必須保留直到Server重啟為止。

    此機制會適用於訊息與訊息之間會有一段時間的場景,也就是說,訊息的發佈(Publish)可能不是那麼的頻繁,如錯誤回報的系統。它可以讓新的訂閱者馬上知道上次的最新狀況為何。

  • Remaining Length:此欄位記錄當前的Message,它的Variable header和Payload總共的長度為何,此欄位不一定就是1 byte,它是可變得,最多到4 byte。

接著讓我們繼續往下看,再來是第二個Herader,也就是Variable Header。

Variable Header:

PUBLISH Message的Variable header會包含以下欄位:

  • Topic name:

    一個UTF的編碼字串,它必須是一個明確的主題定義。不能為萬用字元(wildcard characters),關於萬用字元會在後面的篇幅做介紹。這邊只需知道,當訂閱者用萬用字元訂閱到此主題時,此訂閱者收到的PUBLISH訊息裡面的Topic name欄位會是完整的名稱,而不是用萬用字元匹配到的名稱。

  • Message ID:

    Message ID會使用在QoS level 1或是2的下列訊息上面:PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK。

    Message ID為16bit無符號的整數,代表特定方向訊息唯一的id,每個client都會維護他們自己的Message ID列表。所以有可能會有一種狀況發生,就是某個client在發佈Message ID為1的訊息給server時,同時收到Server發佈過來Message ID為1的訊息。

    Message ID不能為0,它會被視為無效的Message ID。

    下面為PUBLISH Message QoS level為1時,variable header欄位範例:

Field Value
Topic Name: "a/b"
Message ID 10

Payload:

PUBLISH Message的payload會包含要發佈的訊息內容。Payload長度為0的訊息是有效的。

Response:

PUBLISH Message的回應會跟QoS level有關係,下表顯示QoS level與預期的回應:

Qos Level Expected response
Qos 0 None
QoS 1 PUBACK
QoS 2 PUBREC

PUBLISH Message可以是從client發佈給Server,或者是從server發佈給訂閱者。在收到訊息時,根據QoS level會做以下的動作:

  • QoS 0:

    將訊息提供給任何有興趣的訂閱者。

  • QoS 1:

    將訊息記錄到儲存裝置(persistent storage),將它提供給任何有興趣的訂閱者,然後回傳PUBACK給發送端。

  • QoS 2:

    將訊息記錄到儲存裝置,不要馬上將它提供給任何有興趣的訂閱者,先回傳PUBREC給發送端。

可以參考MQTT(二)Message Type and Flows:PUBLISH flow來得知比較詳細的資訊。

小結

本篇介紹了MQTT的PUBLISH Message,PUBLISH Message其實要注意的就是QoS level和Retain這兩個特性,QoS level會影響到訊息的可靠度,而Retain可以讓新的訂閱者在訂閱主題時就能得知此主題最新的狀態。了解這兩個特性會可以幫助整體服務架構的規劃。

另外還需要注意到,一次只能對一個Topic發佈訊息,所以沒辦法做到一次同時對多個Topic發佈訊息。

參考:

MQTT V3.1 Protocol Specification