2015年8月18日 星期二

Enlarge Openfire Heap Size

 

https://community.igniterealtime.org/docs/DOC-1033

Heap Settings

Add "-Xms32m -Xmx128m -Xss128k -Xoss128k -XX:ThreadStackSize=128" to INSTALL4J_ADD_VM_PARAMS to specify an initial heap of 32 MB, a maximum heap of 128 MB and a stack size of 128 kB for native and java threads. Do not append a k to the ThreadStackSize value.

One may also need to set "-XX:MaxPermSize=128m", but before doing this one should consult the gc.log file.

如果是以tar方式安裝,則編輯bin底下的openfire script, 裡面有一行INSTALL4J_ADD_VM_PARAMS, 取消# mark, 並且在等號後加上類似這樣的設定值"-Xms32m -Xmx128m -Xss128k -Xoss128k -XX:ThreadStackSize=128", 規則如官網文件所述,不再描述, 設定完成重啟!

轉貼請註明出處,最好直接使用聯結轉貼!Thanks~
作者: Samuel Lin
Blog:http://sabaothtech.blogspot.tw/
日期:2015/08/18

2015年8月17日 星期一

Openfire - Smack - TLS設定 全面講解

 

對於XMPP Openfire, Smack, AWS加乘下, 設定安全通道眾多問題, 故一次整理, 希望大家別再花費龐大時間研究驗證.

文中內文適用任何使用Smack Lib的平台, 例如: Server, Android等…

GitHub code: https://github.com/samuel1114/Openfire_TLS

1. Openfire不管是TLS還是一般未加密通道, 一律使用5222 Port,

任何文件上或Console上的5223 Port是針對Old SSL Version, 所以不需要開放5223 Port.

2. Smack在4.1.0版本後參數設定以及寫法, 與之前版本及aSmack差異較多, 故本文所使用的會是4.1.0之後版本(這樣才有意義, 網路上資源較少).

3. 一般來說Openfire Admin Console未加密是9090 Port, 加密是9091 Port.

4. 不管是Openfire Admin Console或者是一般XMPP使用TLS連線, 在Server Settings ==> Server Certificates需要有憑證設定(CA認證或者Self Signed).

5. 首先先來說明, 如果單純在Openfire設定憑證, 那Smack該如何建立連線,

….

XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder()

       .setSecurityMode(ConnectionConfiguration.SecurityMode.required)

        .setCustomSSLContext(HTTPSTrustManager.getSSLContextAllowAll())

        ……

以上可以發現, 我們必須要在Configuration設定成required, 並且透過setCustomSSLContext設定SSLContext,

範例上是採用接受所有憑證, 如果要更加強安全性, 建議直接指定憑證, HTTPSTrustManager裡有相關範例.

※TLS/SSL流程及SSLContext或SocketFactory為何, 不在本文說明範圍內.

 

6. 如果是直接在AWS的ELB上設定憑證, 這樣該如何建立?

如果在ELB上設定5222 Port憑證, 我們只需要先確定我們能夠與ELB先建立起安全通道,

而ELB到Openfire則不需要有任何安全通道的建立, 如此則需要使用不一樣寫法:

XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder()

       .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)

        .setSocketFactory(HTTPSTrustManager.getSSLContextAllowAll().getSocketFactory())

        ……

以上可以發現, 我們必須要將Configuration設定成disabled, 而必須透過setSocketFactory設定憑證,

使其可以與ELB建立起安全通道, 範例上是採用接受所有憑證,

如果要更加強安全性, 建議直接指定憑證, HTTPSTrustManager裡有相關範例. 

※請注意, 一但設定在ELB上, 則唯一的連線方式就是TLS, 不能使用未加密通道.

但也正如此, 我們必須將Openfire進行以下設定, 否則ELB與Openfire會有斷線問題.

clip_image002

 

7. 前端可能會因為各種因素, 導致與Openfire連線在很短時間內很常發生斷線問題,

故我們可以在Openfire上進行以下設定, 確保與Openfire之間的連線

clip_image003

 

8. 另外為了避免Exception in thread "main" SASL authentication failed using mechanism DIGEST-MD5

(Openfire Bug)

(1)在Openfire上需要增加Server Properties: sasl.mechs將其設定為PLAIN.

(2)Smack則需要特別指名sasl mechs

……

SASLAuthentication.unBlacklistSASLMechanism(SASLMechanism.PLAIN);

SASLAuthentication.blacklistSASLMechanism(SASLMechanism.DIGESTMD5);

SASLAuthentication.blacklistSASLMechanism(SASLMechanism.CRAMMD5);

SASLAuthentication.blacklistSASLMechanism(SASLMechanism.EXTERNAL);

SASLAuthentication.blacklistSASLMechanism(SASLMechanism.GSSAPI);

……

9. 如果在ELB上使用了域名, 並設定憑證, 例如:openfire.sabaothtech.com, 則在Openfire上的Server Name最好也是一樣叫openfire.sabaothtech.com, 並且其Server Properites的xmpp.fqdn, xmpp.domain也是要設定成openfire.sabaothtech.com, 避免之後在登入後又轉成Openfire的Server Name, 簡單來說, Openfire很注重Server Name, 所以讓ELB的Domain Name與Openfire一致是最佳的選擇.

由此處即可修改Server Name, 修改完後重啟Openfire

image

轉貼請註明出處,最好直接使用聯結轉貼! Thanks~
作者: Samuel Lin
Blog:http://sabaothtech.blogspot.tw/
日期:2015/08/17

XMPP-Openfire Setup Installation Guide

Openfire安裝方式(以Ubuntu為例)
1. 前置作業
   - Open Port
     sudo ufw allow 5222(XMPP Client & TLS)
     sudo ufw allow 5223(Old SSL)
     sudo ufw allow 9090(Admin Console)
     sudo ufw allow 9091(Admin Console Security Tunnel)

   - 安裝Java Runtime(如果採用deb方式安裝)
     https://www.digitalocean.com/community/tutorials/how-to-install-java-on-ubuntu-with-apt-get
     $sudo apt-get update
     $java -version
    
     #可以選擇安裝JRE或JDK
     $sudo apt-get install default-jre
     or
     $sudo apt-get install default-jdk
    
     #也可以選擇安裝Oracle JDK
     $sudo apt-get install python-software-properties
     $sudo add-apt-repository ppa:webupd8team/java
     $sudo apt-get update
     $sudo apt-get install oracle-java7-installer
    
     #設定要那一個JRE為Default
     $sudo update-alternatives --config java
    
     #設定JAVA_HOME環境變數
     $sudo nano /etc/environment
    
     #加入此行
     JAVA_HOME="YOUR_PATH"
     $source /etc/environment
     $echo $JAVA_HOME

2. tar檔
    https://www.linode.com/docs/applications/messaging/instant-messaging-services-with-openfire-on-ubuntu-12-04-lts-precise-pangolin

   - 將openfire.tar放到/opt底下, 並解壓
     $ tar xvf openfire.tar

   - Link service
     ln -s /opt/openfire/bin/openfire /etc/init.d/

   - Start Service
     service openfire stop
     service openfire start

   - 進入Admin Console設定
     http://x.x.x.x:9090
     default Account/Password: admin/admin

3. deb檔(此方法反而較為複雜, 並且最好有root權限)
   - 將openfire.deb放到/opt底下

   - 執行安裝, 請一定要安裝JRE, 並且一定要設定JAVA_HOME.
     $dpkg --force-all -i openfire.deb

     安裝完後安裝檔會散在以下地方
     # /etc/init.d/openfire - service script會建立
     # /etc/openfire/ - xml設定檔及security資料夾放置位置
     # /etc/default/openfire - openfire執行檔
     # /var/lib/openfire - plugins及embeded db放置位置
     # /var/log/openfire - Log directory
     # /usr/share/openfire - Link File及lib與resources資料夾

   - Start Service
     service openfire stop
     service openfire start

   - 進入Admin Console設定
     http://x.x.x.x:9090
     default Account/Password: admin/admin

   - 如何移除
     $dpkg -r openfire

2014年4月12日 星期六

GIT & EGIT 使用介紹(一) - 名詞與概念介紹


        GIT已經成為目前主流的版控,大家都在有用,但剛開始接觸GIT時,被其概念搞得一團亂,發現越看越多網路上的文章就越模糊,到底GIT的概念是甚麼? 所以在介紹如何使用之前,一定得先來介紹概念及專有名詞,畢竟網路上GIT的教學實在是太多了,就重新整理一些當初看不懂的東西,希望能夠縮短大家的學習歷程!

1. Work Directory: 也可以稱之為Work Tree,其實所代表的,就是在自己硬碟中所使用的專案目錄。

 

2. Repository: 故名思議就是版控的儲存庫,一台電腦或一台主機是可以有很多儲存庫,例如: 一個專案可以放在一個專屬的儲存庫,也可以多個專案共用一個儲存庫,如以下的資料夾結構:

Project Folder
--.git (repository)
--project files

or

Project Folder
--.git (repository)
--Project A
----Project A Files
--Project B
----Project B Files
--Project C
----Project C Files

 

3. Stage Area(Index): 又可視為一個索引記錄區域,當檔案被加入到索引時,代表這個檔案已經在版控的控制中,當檔案一開始加入到Index,其狀態為unmodified,如果更改了檔案內容,在Index的狀態就會修改為modified,請注意,此時的修改並未儲存到Repository。


所以到目前為止的架構應該為:


2014-4-12 上午 09-20-47

 

4. Branch(分支): GIT最重要的特點就是Branch,一個Branch就為一份完整專案(請注意! 這邊是假設專案中所有檔案已經加入到Index,並且commit到Repository),而我們也可以在同個Repository中建立多個Branch,這樣的好處在於,當專案需要大幅度改動架構,又或者需要區分不同做法的版本時,可以另外開一個Branch,將要改動的寫法寫在這個新建立出來的Branch,這樣原本主要版本的Branch就不會受到影響,並且當我們覺得大幅改動的程式足夠穩定使用,這時我們可以將這個新建立的Branch整合進我們主要的Branch進行使用。


所以到目前為止的架構應該為:


2014-4-12 上午 09-20-47 

 

5. HEAD: GIT可以有這麼多的Branch,但是我們目前到底是在修改那一個Branch當中的檔案?這時我們就必須要瞭解HEAD,這代表的是你目前正在使用的Branch,例如: 我們有Branch A, Branch B, Branch C,如果我們現在正在使用的Branch是Branch B,則HEAD就為Branch B,所以我們可以藉由切換Branch,來改動目前我們正在編輯使用的Branch。


所以到目前為止的架構應該為:


2014-4-12 上午 09-20-47 

 

6. Origin: 看到這邊大家應該會有個疑問就是: 那我從Server或類似Github弄下來的東西是怎麼回事? 其實我們的動作是直接從遠端將遠端Repository和遠端目前正在使用的Branch,Clone一份到我們的本機裡,這個動作我們稱之為Fork(分流),而遠端的部份我們就稱之為Origin。


所以到目前為止的架構應該為:

 

 2014-4-12 上午 09-20-47

 

7. Master: 看到這邊我們可以發現,不管是自己在本機端建立Repository及Branch,或者從遠端Clone一份到本機,我們都勢必會有一個Branch,這第一個Branch,通常我們都會稱之為master。


所以最後架構應該為:


2014-4-12 上午 09-20-47 

 


To be continue…


轉貼請註明出處,最好直接使用聯結轉貼! Thanks~
作者: Samuel - 林靖傑
Blog:http://sabaothtech.blogspot.tw/
日期:2014/04/12

2013年8月10日 星期六

SQLite 3 Data Type 資料型態

Storage Classes

A. SQLite資料庫儲存資料時, 主要區分為以下五種Storage Class, 會比Data Type來的更加簡易及統籌分類, 所以在SQLite Storage Class及 Data Type可以互相替代:

   1. NULL. The value is a NULL value.

   2. INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes
       depending on the magnitude of the value.

   3. REAL. The value is a floating point value,
       stored as an 8-byte IEEE floating point number.

   4. TEXT. The value is a text string,
       stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).

   5. BLOB. The value is a blob of data, stored exactly as it was input.

B. SQLite中並沒有Boolean, 會使用Integer的1和0來代表.

C. 在SQLite中會使用TEXT, REAL, INTEGER代表Date and Time:

  1. TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").

  2. REAL as Julian day numbers,
      the number of days since noon in Greenwich on November 24, 4714 B.C.
      according to the proleptic Gregorian calendar.

  3. INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UT

Type Affinity

最主要是設計用來能夠更相容於其他資料庫的Data Type, 目的在於找出資料儲存在Column中建議最適合的Storage Class, 所以在使用SQLite設計資料表時, 甚至可以不需要定義資料型態, 資料型態是建議不是必須! 當沒有指定資料型態時, 該Column可以儲存任何Storage Class的資料.

A. Type Affinity有以下五種:
    1. TEXT
    2. NUMERIC
    3. INTEGER
    4. REAL
    5. NONE

B. Rules規則:

Rule 1: 如果宣告的型態中有包含"INT"字串則會被歸類為INTEGER affinity,
            也就是直接使用INTEGER Storage Class.
            例如: INT, INTEGER, TINYINT. SMALLINT. MEDIUMINT,
                     BIGINT. UNSIGNED BIG INT, INT2, INT等

Rule 2: 如果宣告的型態中有包含"CHAR", "CLOB", or "TEXT"字串,
            則會被歸類為TEXT affinity,
            例如: VARCHAR有包含"CHAR", 所以使用TEXT Storage Class.
            也就是直接使用TEXT Storage Class.
            例如: CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255),
                     NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100). TEXT, CLOB等

Rule 3: 如果宣告的型態中有包含"BLOB"字串, 則會被歸類 NONE affinity,
            也就是會直接判斷所塞入的值是適合那一個Storage Class.
            例如: BLOB, 塞入的是BLOBs值則不會管Type affinity,
                     全部都會使用BLOB Storage Class

Rule 4: 如果宣告的型態中有包含"REAL", "FLOA", or "DOUB"字串, 則會被歸類REAL affinity.
            也就是直接使用REAL Storage Class.
            例如: REAL, DOUBLE, DOUBLE PRECISION, FLOA等

Rule 5: 其他會被歸類為NUMERIC affinity,
            會直接判斷所塞入的值是適合那一個Storage Class.
            例如: NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME等

Rule 6: 如果塞入的是NULL值則不會管Type affinity, 全部都會使用NULL Storage Class.

範例:

--建立資料表
CREATE TABLE t1(
    t  TEXT,     -- 套用Rule 2
    nu NUMERIC,  -- 套用Rule 5
    i  INTEGER,  -- 套用Rule 1
    r  REAL,     -- 套用Rule 4
    no BLOB      -- 套用Rule 3
);

-- 塞入字串
INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|text

-- 塞入浮點數1
DELETE FROM t1;
INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|real

-- 塞入浮點數2
DELETE FROM t1;
INSERT INTO t1 VALUES(500.0, 500.123, 500.0, 500.0, 500.0);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|real|integer|real|real

-- 塞入整數
DELETE FROM t1;
INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|integer

-- 塞入BLOBs
DELETE FROM t1;
INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
blob|blob|blob|blob|blob

-- 塞入NULLs
DELETE FROM t1;
INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
null|null|null|null|null



轉貼請註明出處,最好直接使用聯結轉貼!Thanks~
作者: Samuel - 林靖傑
Bloghttp://sabaothtech.blogspot.tw/
日期:2013/08/10


2013年5月4日 星期六

Android - 讓Android Emulator(AVD)支援相機及Webcam


        在AVD尚未支援相機模擬前如果要進行相機的模擬必須要透過架設Socket Server及安裝JMF來變相達成相機的功能但是在新版的Android Tools已經可以讓AVD藉由使用Webcam來當成相機鏡頭如下圖

 



但是這樣還是不太方便因為還需要有Webcam才能夠使用並且在本人教學上也會產生極度不方便的情況因為每個學生不可能都有Android手機或者Webcam所以開始想要將Webcam也運用軟體模擬,所以在經過測試後能夠讓AVD抓到Webcam的模擬軟體只有e2eSoft VCam這套Fake Webcam在經過測試後並無法正常使用但是需注意的是e2eSoft VCam所抓到的影像會是上下左右皆相反也就是放上的圖檔需要上下左右皆翻轉,這樣放到e2eSoft VCam上的圖片才可以正常看到畫面


e2eSoft VCam官網下載點 
http://www.e2esoft.cn/downloads.asp


當然這樣的方式支援拍照掃瞄外也支援錄影只要有關於鏡頭的功能都能使用e2eSoft VCam也支援圖片影音桌面截取及錄影等功能


使用方式

1.      需先開啟e2eSoft VCam並且放上圖片(e2eSoft VCam所抓到的影像會是上下左右皆相反也就是放上的圖檔需要上下左右皆翻轉,這樣放到e2eSoft VCam上的圖片才可以正常看到畫面)

 



2.      AVD設置上需將Back Camera選項改成Webcam0

 

3.      接著再開啟AVD注意! 請先開VCam再開AVD否則無法抓到!

4.    接下來就像相機一樣使用

 
轉貼請註明出處,最好直接使用聯結轉貼!Thanks~
作者: Samuel - 林靖傑
Bloghttp://sabaothtech.blogspot.tw/
日期:2013/05/04


2013年5月3日 星期五

Android - 掃瞄1維/2維(1D/2D)條碼 QR Code - 修改ZXing Source 2014-03-30 Updated.

 

ZXing是使用Java開發的Open Source專案,主要目的是用來進行1D/2D的條碼掃瞄,支援的格式如下:

  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 93
  • Code 128
  • ITF
  • Codabar
  • RSS-14 (all variants)
  • RSS Expanded (most variants)
  • QR Code
  • Data Matrix
  • Aztec ('beta' quality) 
  • PDF 417 ('alpha' quality)

官方原始碼及測試資料下載點

GitHub Project:
 
jar檔下載點
http://repo1.maven.org/maven2/com/google/zxing/

因為在測試的ZXing過程中,發現程式會直接呼叫ZXing Barcode Scanner程式中的Activity,為了不需額外安裝ZXing Barcode Scanner程式,則本人將專案修改成不需要安裝ZXing Barcode Scanner的版本,說明如下:


ZXing-2.3.1.zip下載點 經修正後,該版本可以使用在API 11(3.0) ~ API 19(4.4.2) 

  • Bug fix - 該版本修正第一次啟動會失敗的問題.
  • 該版本將所有元件整合為一個專案, 並精簡到只剩掃瞄與產出條碼功能.
  • ZXing 2.3.0版本只支持Android 4.0以後的版本, 但本人修正到支持Android 3.0, 但不再支持Android 2.x!
  1. Eclipse中匯入ZXing-2.3.1/ZXingLibs.zip壓縮檔裡的專案。
  2. Android專案按右鍵選Properties => 點選Android => 對下方的Library區塊點選Add => 選擇剛匯入的ZXingLibs專案引用。
  3. 請先確保您的Android專案已經有引用Android Support Library(android-support-v4.jar), 如遇Android Support Library版本衝突, 請統一Android Support Library版本即可!
  4. ZXing-2.3.1/AndroidManifest.xmlAndroidManifest.xml中的設定資訊, 目前只剩下掃瞄與產出條碼功能, 如需其他功能請自行使用官方原始專案! 
  5. 掃瞄呼叫方式如ZXing-2.3.1/Main.java檔。
  6. ZXing-2.3.1/EncodeAct.java檔為如何編碼的範例。

轉貼請註明出處,最好直接使用聯結轉貼! Thanks~
作者: Samuel - 林靖傑
Bloghttp://sabaothtech.blogspot.tw/
日期:2014/03/30 Updated.