徑度=角度*pi/180*半徑

因為寫程式時剛好用到sin、cos等數學函數,但是傳入值都是徑度(單位圓上角度所對的弧長為該角度的徑度),
而不是角度,所以找到了換算的方法,順道也記錄下來。


已知  pi=3.1415
已知  圓周長=半徑*2*pi
已知  一個圓有360度
所以  1徑度=半徑*2*pi/360
所以  1徑度=半徑*pi/180

下圖是用Excel算出半徑10,角度60的徑度(Excel有一個直接換徑度的函數:RADIANS())


Corona SDK 讓小圓繞著大圓跑

------------------------------------------------
--檔案名稱:main.lua
------------------------------------------------

--產生一個大圓,半徑30
myCircle = display.newCircle( 250, 150, 30 )
myCircle:setFillColor( 0,0,1 )

--產生一個小圓,半徑10
myCircle1 = display.newCircle( 280, 150, 10 )
myCircle1:setFillColor( 0,1,0 )


function Start_Handle(event) 
    if rotationNum == -360 then 
        rotationNum = 0 
    end
    
    rotationNum = rotationNum - 2

--這裡有一個地方需要注意,自己數學不好,被sin、cos弄亂了。
--math.cos、math.sin傳入的是徑度(弧度)的值,不是角度的值。
--角度換算徑度的公式為「角度 * pi / 180」,pi約等於3.1415
--所以角度90換算起來的徑度:90*pi/180約為1.570796327
--而找出圓周上的座標公式是「x= 圓心X + cos(徑度)* 半徑」、「y= 圓心X + sin(徑度)* 半徑」
    myCircle1.x = myCircle.x + math.cos(rotationNum*-1*math.pi/180) * 30
    myCircle1.y = myCircle.y + math.sin(rotationNum*-1*math.pi/180) * 30
end  

Runtime:addEventListener( "enterFrame", Start_Handle)

Linux新增磁碟到LVM的例子

今天要在一台Linux的機器上安裝一個程式,查詢狀態發現空間不足。
[root@pv_test ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       28G   24G  2.4G  91% /
/dev/sda1             101M   13M   82M  14% /boot
tmpfs                  10G  1.4G  8.7G  14% /dev/shm

查詢硬碟的結構,發現還有一個sdb1,因為這台機器是VM上面的虛擬機器,所以可能是之前就已經分配好的空間
[root@pv_test orcl]# fdisk -l

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        3916    31350847+  8e  Linux LVM

Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        2610    20964793+  83  Linux
       ext3     defaults        0 0

       
因為有看到/dev/mapper/VolGroup00-LogVol00這樣的device,所以這台Linux應該有建LVM
實體Device可以建立為PV,多個PV可以建立為VG,VG就像一顆大的虛擬硬碟,就可以規劃分割區與格式化
而分割出來的虛擬區塊就是LV,這是可以實際使用的部份。

尋找是否有PV,發現有一顆PV /dev/sda2,並且正在使用  
[root@pv_test ora01]# pvscan
  PV /dev/sda2   VG VolGroup00   lvm2 [29.88 GB / 0    free]
  Total: 1 [29.88 GB] / in use: 1 [29.88 GB] / in no VG: 0 [0   ]

查詢PV的詳細訊息 
[root@pv_test ora01]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               VolGroup00
  PV Size               29.90 GB / not usable 24.06 MB
  Allocatable           yes (but full)
  PE Size (KByte)       32768
  Total PE              956
  Free PE               0
  Allocated PE          956
  PV UUID               O9OO6i-UAs5-WsUy-teoh-G8zx-PlcF-ozHzvd       

查詢VG的訊息,的確有一個VG(Found volumn group "VolGroup00")
[root@pv_test ora01]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "VolGroup00" using metadata type lvm2
 
查詢VG的詳細訊息,已經使用了全部的容量(Alloc PE / Size、Free  PE / Size)
[root@pv_test ora01]# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
  System ID            
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               29.88 GB
  PE Size               32.00 MB
  Total PE              956
  Alloc PE / Size       956 / 29.88 GB
  Free  PE / Size       0 / 0  
  VG UUID               K4DU8g-qJjI-uJoO-IzIa-Ji7o-vQVo-R4Zi8V  

接著準備把沒有使用到的sdb1加入LVM,讓空間變大,先更改sdb1的檔案格式旗標為Linux LVM
[root@pv_test ora01]# fdisk /dev/sdb

The number of cylinders for this disk is set to 2610.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): t
Selected partition 1    
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

將/dev/sdb1建立為PV
[root@pv_test /]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
 
重新尋找PV,已經成功建立/dev/sdb1的PV
[root@pv_test /]# pvscan
  PV /dev/sda2   VG VolGroup00      lvm2 [29.88 GB / 0    free]
  PV /dev/sdb1                      lvm2 [19.99 GB]
  Total: 2 [49.87 GB] / in use: 1 [29.88 GB] / in no VG: 1 [19.99 GB]
 
接著加入到VG
[root@pv_test /]# vgextend VolGroup00 /dev/sdb1
  Volume group "VolGroup00" successfully extended
 
重新查詢VG,發現空間變大了,而且還有19.97GB的空間可以使用(Free  PE / Size)
[root@pv_test /]# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
  System ID            
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               49.84 GB
  PE Size               32.00 MB
  Total PE              1595
  Alloc PE / Size       956 / 29.88 GB
  Free  PE / Size       639 / 19.97 GB
  VG UUID               K4DU8g-qJjI-uJoO-IzIa-Ji7o-vQVo-R4Zi8V

查詢LV,目前已分割成LogVol00與LogVol01,而這次我們要擴充空間的是LogVol00
[root@pv_test /]# lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [27.91 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [1.97 GB] inherit
 
把VG剩餘的空間(Free  PE / Size       639 / 19.97 GB)全部都給LogVol00
[root@pv_test /]# lvresize -l +639 /dev/VolGroup00/LogVol00
  Extending logical volume LogVol00 to 47.88 GB
  Logical volume LogVol00 successfully resized
 
重新查詢LV的詳細訊息,可以發現LogVol00的空間變大了
[root@pv_test /]# lvdisplay
  --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol00
  VG Name                VolGroup00
  LV UUID                8bnCPd-9VFM-V2fd-xyIP-MMZ2-1JlX-jhvz2t
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                47.88 GB
  Current LE             1532
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
  
  --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol01
  VG Name                VolGroup00
  LV UUID                rJ8EKs-4bev-rfeL-xXBr-8LBj-ndPH-0ejKJJ
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                1.97 GB
  Current LE             63
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
  
雖然LV(LogVol00)的空間變大了,但是變大的部份還不能被我們使用,我們最後再下resize2fs的指令讓變大的部份可以使用,
這個指令可以on-line直接執行,而且不會影響原本已存在的資料,這樣就直接把空間變大了,真的很方便。
[root@pv_test /]# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 12550144 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 12550144 blocks long.

查詢之後可以發現,原本不足的空間,實際可用量變多了。
[root@pv_test /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       47G   24G   21G  53% /
/dev/sda1              99M   13M   82M  14% /boot
tmpfs                  10G  1.4G  8.7G  14% /dev/shm

Corona SDK Lua的字串相加

 撰寫程式常常需要將變數的值與字串相加成新的字串,但是我試了使用「+」、「&」、「.」等常見的相加符號都失敗。
Lua的字串相加可以用table.concat。

語法:table.concat(tbl, delimiter_str)

範例:
table.concat( { "Hello!","The World" } )  -->  Hello!The World
table.concat( { "Hello!","The", "World" } , "--")   --> Hello!--The--World

2014/12/05更新:
原來用「..」也可以相加字串,例如:
local a = 1
local b = 2
local c = a * b
local Tmp1 = a .. " x " .. b .. " = " .. c

RFID感應卡號格式的問題

最近協助社區裝設了感應卡開門的專案,感應讀卡機相容Mifare格式。
我試著以電子鎖的Mifare感應吊飾新增到感應讀卡機,測試的結果是成功的。
但是卻無法從感應讀卡機上單獨刪除我的吊飾資料,原因是我的感應吊飾上沒有烙印卡號,
而感應讀卡機的簡易手冊上只有說明輸入卡號來刪除的步驟。
於是我從網上購買了一台可以讀取Mifare卡號的簡易型USB讀卡機,接上電腦後,不用安裝任何程式,
開啟記事本就可以直接感應吊飾的卡號,但是這組號碼與感應扣上用來刪除社區讀卡機的記錄位數不同,
社區的感應扣上印有三組不同的號碼,用社區的感應扣讀取卡號,出現的卡號位數與吊飾上的卡號位數一樣,
但是與可以刪除的卡號位數不同,實測結果也無法刪除社區讀卡機的記錄。

於是求助google後發現,卡號格式依廠商會有不同的格式,我的USB讀卡機讀取的卡號格式是一般常見的8H10D,
但是社區的讀卡機不是以8H10D的格式來刪除資料,所以社區感應扣上才會烙印有三組不同格式的號碼,經換算後,
其中一組是常見的8H10D格式,另一組是4H4H10D的格式,最後一組不知道是什麼格式。

不過不同格式之間的轉換都是以16進位來做變化,例如下面範例是其中一種轉換方式:
1、讀出來的十進位卡號是2234821496
2、開啟EXCEL 2010,在儲存格中先以函數DEC2HEX轉成16進位:「DEC2HEX("2234821496")」,轉出16進位「8534AB78」,
3、以16進位為基準,取16進位的前三位853轉成10進位「HEX2DEC("853")」,得到十進位的2131
4、再取16進位的第4~7碼轉成10進位「HEX2DEC("4AB7")」, 得到十進位19127
5、將兩組號碼組合起來得到「02131,19127」的卡號。


沒想到RFID還有這樣轉換不同格式卡號的方式,只是我在網路上能找到的資料不多,
無法換算社區感應扣的最後一組卡號是哪一種換算方法。
我之前接觸的專案都是以電腦程式來連線並控管感應讀卡機,所以都是直接在電腦上新增刪除資料。

EBS 11i -- Cost Rollup出現紅色的Error,Log的訊息是CST_LOCK_FAILED_CIC

今天有一個Concurrent Requests:Cost Rollup出現紅色的Error,Log的訊息如下:
MSG-00000: Before exploder 2014/11/19 10:37
MSG-00000: Group Id: 1548433
MSG-00000: Calling compute low level codes
MSG-00000: After exploder 2014/11/19 10:45
MSG-01999: 29: CST_LOCK_FAILED_CIC
REP-1825: Before Report trigger returned FALSE.

同事說應該是有無法Lock相關物件(CST_LOCK_FAILED_CIC),所以先執行下列的語法查詢:
select * from v$locked_object a , dba_objects b
    where a.object_id=b.object_id  and object_name like 'CST%';

發現有幾個CST開頭的表格正在Lock,而Session ID都是1726,於是再查SID 1726的狀態:
select vs.sid,vs.serial#,vp.spid,vs.*,vp.*
    from v$session vs,v$process vp
where vp.addr=vs.paddr  and vs.sid in  (1726);

查詢得知1726是一個Concurrent Request的Session,再執行下列的查詢語法:
select vs.sid  "Session_SID"
      ,vs.serial# "Session Serial#"
      ,vp.spid "OS PID"
      ,fcp.user_concurrent_program_name "Concurrent Name"
      ,fcr.request_id
      ,fcr.actual_start_date "Start Time"
      ,fcr.actual_completion_date "Finish Time"
      ,(fcr.actual_completion_date-fcr.actual_start_date)*24*60*60 "Expense Time(second)"
      ,decode(fcr.phase_code,'R','Running',
         'C','Completed','P','Pending','I','Inactive') "Request Status"
      ,decode(fcr.status_code,'A','Waiting','B','Resuming','C','Normal',
         'D','Cancelled','E','Error',
              'F','Scheduled','G','Warning','H','On Hold','I','Normal','M','No Manager',
              'Q','Standby','R','Normal','S','Suspended','T','Terminating','U','Disabled',
              'W','Paused','X','Terminated','Z','Waiting') "Request Phase"
    from v$session vs
        ,v$process vp
        ,fnd_concurrent_requests fcr
        ,fnd_concurrent_programs_tl fcp
    where vs.paddr=vp.addr
      and vs.process=fcr.os_process_id
      and fcr.concurrent_program_id=fcp.concurrent_program_id
      and fcr.phase_code='R'  --running
      and vs.sid = 1726 ;   --Session SID

但是卻傳回空的資料,換句話說就是有Session,而沒有running的concurrent request,
於是登入EBS,在administor的Requests查詢今天有執行過的Cost Rollup,
發現產生Error的Cost Rollup前幾分鐘有一個被使用者取消的Cost Rollup,
可能就是這個原因,本來想要強制刪除Session 1726,但是重新查詢發現Session 1726已經綀束了,
所以請使用者重新執行Cost Rollup,這次就成功了。

印度的乘法計算

乘法試算 17x13,算法如下:
1、算出 (17+3)x10 = 200
2、算出個位數相乘 7x3 = 21
3、兩者相加即是答案 200 + 21 = 221

原理可用面積的切割與交換來理解,如下圖的面積為17x13=221,將它分割為三個部份
並且將方形B移至虛線處,因為方形的長都是10,所以A+B的面積為 (17+3)x10 = 200
而剩下的一小塊方形的面積為7x3 = 21
所以A+B+C的面積為200+21=221


依此算法,只要十位數相同,都可以如法炮製,例如:62x63 = 3906
(62+3)x60 = 3900
2x3 = 6
3900+6 = 3906

當然這個方法對於大數字可能不會比直式乘法方便,只是我自己覺得很有趣,因為由不同的角度與觀點也可以得出相同的結果



Phonegap + Aerogear Error: scoket failed (Permission denied)

我在openshift上安裝了aerogear的GCM Server,要測試Android的GCM,在Genymotion模擬器中測試是正常的,
但是安裝到紅米實機上測試時,卻出現下列的錯誤:
Android java.net.SocketException: socket failed: EACCES (Permission denied)

雖然訊息說的很明確是權限的問題,但是為什麼Genymotion模擬器(Android 4.4)上測試正常,但是實機卻是失敗的。

原本我的程式全寫在index.html,改以Phonegap的Hello The World的範例結構,重新改寫一次如下:

index.html
=================================================================
...略

<script type="text/javascript" src="js/test.js"></script>
<script type="text/javascript">
    app.initialize();
</script>



test.js
=================================================================
var app = {
   
    initialize: function() {
        this.bindEvents();
    },
 
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
 
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
    },
 
    receivedEvent: function(id) {
        alert("aaaaaa");
         
         //離開程式
        $("#a_exit").click(function(){
             if (navigator.app) {
                navigator.app.exitApp();
            } else if (navigator.device) {
                navigator.device.exitApp();
            }
        });
         
          $("#a_reg").click(function() {
             try {
                  //設定參數
                 var pushConfig = {
                        pushServerURL: "https://aerogear-XXXXX.rhcloud.com/ag-push",
                        senderID: "12345678",
                        variantID: "8133-160f5f6fd3",
                        variantSecret: "956a-65441bf7"
                    };
                push.register(onNotification, successHandler, errorHandler, pushConfig);
             } catch(e) {
                  alert(e);
              }
         });
         
          //取消註冊
         $("#a_unreg").click(function() {
             try {
                 push.unregister(un_successHandler,un_errorHandler);
              } catch(e) {
                  alert(e);
              }
         });
         
                   
          function onNotification() {
              alert("收到");
          }
         
          function successHandler() {
              alert("註冊成功");
          }
         
          function errorHandler() {
              alert("註冊失敗");
          }
         
          function un_successHandler() {
              alert("取消註冊成功");
          }
         
          function un_errorHandler() {
              alert("取消註冊失敗");
          }
         
         
     } // receiveEvent: function(id)
         
   
}; // app



寫完之後重新編輯再試一次,這次雖然也是失敗,但是卻出現了紅米不允許這支APP透過行動網路(3G)的視窗,
原來是紅米的問題,因為有設定不允許APP透過行動網路(3G)出去的緣故,設定允許我自己的APP通過就正常了。
就算把程式還原成之前全寫在index.html內,也變得正常了,只是為什麼改寫了程式就會有不同的訊息,
init的用意是什麼,我也不太清楚,總之問題是暫時解決了。其他的問題等有時間再好好研究一番。

用雙手計算6~9的九九乘法

在網路上看到一個只要背1~5的九九乘法,6以後可以用雙手來計算出來。

例如要計算 6x6 的答案,首先將雙手攤開,手心朝上。
因為被乘數是6,而(6-5=1),所以左手把大姆指彎起來,如果是7,則把大姆指與食指兩根手指彎起來
接著因為乘數也是6,所以右手把大姆指彎起來,最後結果如下圖:


手指彎起來的就是十的倍數,如上圖兩手彎起來的手指加起來是兩根,所以是(10x2=20)。
而手指沒有彎起來的就要相乘,如上圖左手沒有彎起來的有四根,右手也有四根,所以(4x4=16)
最後把兩個結果加起來就是答案了(20+16=36)

單獨關閉/啟動EBS R11的Internet Concurrent Manager

今天同事反應在EBS R11的測試機上,Concurrent Request一直有問題,所以我到伺服器上下了一個指令:
$ ps -ef |grep FNDLIBR

發現有一個原本應該存在如下列的Service不見了。
testmgr 25011 24993   0 09:27:57 pts/1       0:00 FNDLIBR FND CPMGR FNDCPMBR sysmgr=""  

先執行adcmctl.sh把service停下來
$ adcmctl.sh stop apps/XXXXX

You are running adcmctl.sh version 115.31
Shutting down concurrent managers for TEST ...
Submitted request 12315687 for CONCURRENT FND SHUTDOWN
adcmctl.sh: exiting with status 0
最後回傳Status 0,但是還有許多的FNDLIBR FND Concurrent_Processor,一個一個把它kill。
$ kill -9 <Process ID>

重新執行adcmctl.sh,把service開啟
$ adcmctl.sh start apps/XXXXX

You are running adcmctl.sh version 115.31

Starting concurrent manager for TEST ...
Starting TEST_1111@TEST Internal Concurrent Manager
Default printer is noprint
adcmctl.sh: exiting with status 0
最後回傳Status 0,FNDLIBR FND CPMGR FNDCPMBR sysmgr=""也被正常啟動了。

openshift 如何設定SSH登入管理

我有申請ReaHad的openshift免費帳號來開立網站,但是因為openshift並未提供後台管理的網站介面,
必須以SSH登入主機以命令列模式來管理,所以必須設定SSH的Key來讓openshift允許我們登入。

我是安裝Xshell(個人使用免費)的SSH Client軟體,所以就以Xshell來設定SSH Key。




輸入密碼,這組密碼也是我們稍後登入openshfit時所需要的密碼





產生金錀後,選擇新增的金錀並按下「內容」


複製「公開金錀」內格式的一長串內容



接著到openshfit的Settings中,找到Add a new key,並且將上面複製的內容貼上去,確定後按下「Create」



建立完成後,回到openshift的應用程式中,在左半部就可以看到Source Code的內容,將它複製下來


複製下來的格式就像這樣:ssh://5452d000@aerogear-test.rhcloud.com/~/git/aerogear.git/
只要截取5452d000@aerogear-test.rhcloud.com(使用者名稱@主機名稱)的格式
以SSH開啟就會出現下列密碼畫面,輸入密碼後就可以登入自己的openshfit主機,也可以牢sftp來傳檔。

利用Linux的curl指定刪除AeroGear上的裝置

curl是Linux在命令列模式下執行http的操作指令,支援POST與GET模式傳送參數,也可以接收回傳的資料。

AeroGear是一個支援iOS、Android推播的Server套件,但是在網頁的管理介面上找不到可以刪除裝置的地方。

但是AeroGear可以以Http的方式來刪除指定的裝置,首先需要從AeroGear找而裝置的token如下圖:


但是如果以網頁上的token來刪除裝置,我自己測試的結果是失敗的,
原因是網頁上token沒有完整呈現,不知道後續的版本是否能解決。
我是以phpMyadmin登入AeroGear的資料庫(MySQL),在表格「installation」中找到正確的token如下圖:


配合Linux的curl指令就可以刪除指定的裝置(下列的指令是同一行,因為太長所以網頁上斷行)
# curl -4 -u "[variant ID]:[variantSecret]"  -v -H "Accept: application/json"
    -H "Content-type: application/json"  
     -X DELETE   [Server URL]/rest/registry/device/[token]

最後查看回傳的內容有如果有 「HTTP/1.1 204 No Content」就表示成功了

上面語法所需要的[variant ID]、[variantSecret]、[Server URL]都可以在AeroGear中找到,如下圖:

AeroGear UnifiedPush Server,支援Android、iOS的Push Notification Server

AeroGear UnifiedPush Server是一套JBoss的開放套件子專案,可以支援Android、iOS的Push Notification。
直接在OpenShift(https://openshift.redhat.com)申請一個免費的帳號即可快速安裝AeroGear。
OpenShift是著名的Linux軟體商RedHad所提供的雲端服務,目前提供一個免費方案(一個免費帳號支援三種平台)可以使用,
支援快速安裝多種環境,例如:AeroGear、JBoss、PHP+MySQL、Drupal、WordPress、Perl、Ruby…等,
但是不支援FTP及後台管理介面,畢竟它並不是一個提供免費的網站空間,而是提供一個供程式開發人員免費的主機使用。


因為我只有Windows的環境,所以只有測試Android的GCM服務而已。
首先登入AeroGear,新增一個Application



第二步,進入新增的Application,新增Android的Variants。如果同時有iOS的推播需求,也可以在這裡再新增iOS的Variants


這裡選擇Android,並且在「Google Cloud Messaging Key」中輸入在Google Developer Console中憑證的伺服器應用程式的金鑰(Server Key),「Project Number」則輸入在Google Developer Console中的專案ID(Project ID),這樣AeroGear就完成了。


完成設定之後,在Android的Variants將加號點開,把下圖紅色框線的訊息它記錄下來


第三步則必須在Android的裝置上撰寫註冊GCM及AeroGear的程式碼,註冊GCM主要是取得Registration ID,並將Registration ID傳給AeroGear記錄,GCM的詳細流程可以搜尋Google。
因為我是用Phonegap來寫Android的程式,所以以Phonegap的步驟來說明程式

1、新增專案
phonegap create test05

2、加入AeroGear專為Phonegap(Cordova)開發的plugin
phonegap plugin add org.jboss.aerogear.cordova.push

3、查詢安裝的plugin,發現不只安裝一個
phoegap plugin list

4、將所有的plugin增加到Phonegap專案,將下列的字串加到config.xml
<gap:plugin name="org.jboss.aerogear.cordova.push 1.0.2" />
<gap:plugin name="com.vladstirbu.cordova.promise 1.0.0" />
<gap:plugin name="com.google.playservices 19.0.0" />
<gap:plugin name="android.support.v4 1.0.0" />    

5、程式範例:

<!DOCTYPE html>

<html>
    <head>
        <meta charset="utf-8" />
        <meta name="format-detection" content="telephone=no" />
        <meta name="msapplication-tap-highlight" content="no" />
        <!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=medium-dpi" />
        <link rel="stylesheet" type="text/css" href="css/jquery.mobile-1.4.4.min.css" />
        <title></title>
    </head>
    <body>
         <a href="#"  id="a_reg" class="ui-btn  ui-corner-all ">推播註冊</a>
          <br /><br />
          <a href="#"  id="a_unreg" class="ui-btn  ui-corner-all ">取消註冊</a>
          <br /><br />
        <a href="#" id="a_exit" class="ui-btn  ui-corner-all ">離開</a>
          <br /> <br />
          <p id="showText"></P>    

    </body>
</html>

<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/jquery.mobile-1.4.4.min.js"></script>
<script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>

<script type="text/javascript">
   
    //離開程式
    $("#a_exit").click(function(){
         if (navigator.app) {
            navigator.app.exitApp();
        } else if (navigator.device) {
            navigator.device.exitApp();
        }
    });
   
   
     //註冊GCM與AeroGear
     $("#a_reg").click(function() {
         try {
              //設定參數,這些參數都可以在Variants上找到,也就是剛剛記錄的部份
             var pushConfig = {
                    pushServerURL: "<Server URL>",
                    senderID: "<Project Number>",
                    variantID: "<variant ID>",
                    variantSecret: "<Secret>"
                };
            push.register(onNotification, successHandler, errorHandler, pushConfig);
         } catch(e) {
              alert(e);
          }
     });
   
   
     //取消註冊
     $("#a_unreg").click(function() {
         try {
             push.unregister(un_successHandler,un_errorHandler);
          } catch(e) {
              alert(e);
          }
     });
   
   
     //APP開啟期間如果接收到推播時的處理函數
     function onNotification(event) {
         alert(event.alert);
     }
   
     //註冊成功的處理函數
     function successHandler() {
         $("#showText").html("註冊成功");
     }
   
     function errorHandler(error) {
         $("#showText").html("註冊失敗:" + error);
     }
   
     //取消註冊成功的處理函數
     function un_successHandler() {
         $("#showText").html("取消註冊成功");
     }
   
     //取消註冊成功的處理函數
     function un_errorHandler(error) {
         $("#showText").html("註冊成功:" + error);
     }
   
</script>

第四步就可以為已經註冊過的Android推播訊息了。




EBS利用Forms Personalize 自訂選單的子選項

EBS可以在Forms的Personalize來自訂選項並且自訂Trigger來完成一些特殊的作業。
例如Menu內並無寄mail的選項,我們可以自訂選項,名稱為「寄mail」,按下去後可以自動發Mail。

下圖是在選項Tools底下,自己新增一個選項叫做「自訂選項」


設定的步驟如下:



這裡就是設定選項名稱的地方,SPECIAL15指是是在Tools底下新增一個項目(SPECIAL1到SPECIAL15都是在tools底下)
Forms Personalization:
SPECIALn
Populate tools menu (SPECIAL 1-15)
Populate reports menu (SPECIAL 16-30)
Populate actions menu (SPECIAL 31-45)
MENUn
Populate tools menu (MENU1-15)
Use these before SPECIALn


完成新增的選項後,再新增一個Personalize,在Trigger Event指定SPECIAL15,其他的部份就跟一般設定Personalize一樣。


Genymation無法使用Google Play及Google API、GCM

Genymation比起原生的Android模擬器,在速度上快了許多,但是因為它是以VirtuallBox為架構平台,所以CPU是x86。
因此有時候拿它來測試程式時,會出現錯誤的訊息,而且也無法使用Google Plya、也無法支援GCM推播。

國外有人分享了修改的方法來解決這個問題,步驟如下:

1、Download the following ZIPs:
 
    ARM Translation Installer v1.1 (https://drive.google.com/file/d/0B4G6V6fglT-wcl9TNDVzY0xFMDA/view?usp=sharing)
 
    Download the correct GApps for your Android version:
      Google Apps for Android 4.4.4 (https://www.androidfilehost.com/?w=files&flid=15801)
      Google Apps for Android 4.3 (https://www.androidfilehost.com/?fid=23060877490000124 - gapps-jb-20130813-signed.zip)
      Google Apps for Android 4.2 (https://www.androidfilehost.com/?fid=23060877490000128 - gapps-jb-20130812-signed.zip)
      Google Apps for Android 4.1 (https://www.androidfilehost.com/?fid=22979706399755082 - gapps-jb-20121011-signed.zip)

2、開啟Genymotion並且來到主畫面
   Next Open your Genymotion VM and go to the Homescreen

3、將Genymotion-ARM-Translation.zip直接拖移到Genymotion的畫面上。畫面會顯示「File transfer in progress」
   完成後畫面會提示訊息,按下「ok」。
 
4、將Genymotion關閉後,重新開啟

5、將gapps-jb-20130813-signed.zip直接拖移到Genymotion的畫面上。畫面會顯示「File transfer in progress」
   完成後畫面會提示訊息,按下「ok」。作業完成後重新開啟Genymotion。
 
6、重開Genymotion後,按下畫面的Google Play,開始設定Google帳號,就跟手機一樣。原則上到這裡整個作業就完成了。

7、Once in the Store go to the 'My Apps' menu and let everything update (fixes a lot of issues), also try updating Google Play Services directly (https://play.google.com/store/apps/details?id=com.google.android.gms)
   (For Android 4.4.4 is posible you need to reboot several times before updates are shown)