2014年6月26日 星期四

自動登入apple developer

在工作的時候遇到了需要讓電腦自動登入apple developer的需求,想到的解決方法就是用HttpWebRequest去做網頁的溝通,進而得到cookies,達到登入的目的。

目的

利用HttpWebRequest進入apple developer,取得登入所需的cookies。

方法

我們要模仿網頁的互動就要先去觀察網頁的傳遞方式,所以第一步我們要做的觀察,我們知道網頁的運作方式之後就可以將開始寫程式了,利用HttpWebRequest來模仿browser中我們所做的動作,達到登入的目的。

步驟

1. 觀察網頁運作

這裡我們利用chrome的developer tools(在chrome上按下F12即可使用),我們在觀察方面有2個部分要注意的:

1. 傳送帳號密碼的真正網址

網頁的設計常常會再登入中間安插一個專門處理的網頁,如果網頁是這樣設計的話那我們表面上看到的那個uri就不是真正在做登入的頁面了,為了避免這樣的情況,我們可以利用developer tools來找到真正做處理的uri。
在這裡我們可以看到Post的網頁其實是action中的uri,而非原本的uri

2. headers

接下來我們就要去看看網頁的標頭檔是什麼樣子的,由developer tools我們可以看到網頁的標頭檔。
紅色框框部分為要注意的部分

2. 撰寫程式碼

先處理第一點的第一個部分,我們要先抓出真正的uri,在這裡我們使用的是Html Agility Pack,這個package可以利用元素的XPath找出那個元素的屬性,要找出元素的XPath也很容易,只要使用developer tools就可以了。
元素>按右鍵>Copy XPath
找出XPath後我們才算是真正開始寫程式碼,我們可以把程式分成兩個部分:
  1. 找出真正處理的uri
  2. 撰寫正確的request取回登入資訊的cookies
再來是程式碼的部分


結論

其實要自動登入很簡單,只要熟悉http的運作就可以很容易的做出,在這個部份我覺得最重要的就是google developer tools要熟練。

2014年5月17日 星期六

手動ndk-build

在Android Studio裡,有了gradle的幫助我們不需要自己去撰寫Android.mk,它自動就會幫你產生Android.mk,build成.so檔就可以引用,但是當一個大程式要這麼做的時候就會產生問題,因為複雜,所以你會需要自己編寫Android.mk,這個時候就會產生問題,現在我們就來看看要怎麼樣自己撰寫Android.mk和ndk-build。

目的

自己撰寫Android.mk和ndk-build來寫一個Hello JNI。

前置處理

MainActivity.java中的寫法跟第一個Android NDK(Java call C)中相同,先把它寫上去。

步驟

1. javah

上一篇有講,這裡就不再多說了,只是這裡的classpath要改一下,如下所示 : 


2. main

這裡跟上一篇相同。

3. Android.mk

在ndk/doc中,我們可以找到ANDROID-MK.html中的說明,以下是我寫的 : 


4. 關掉自動ndk-build

因為我們不想要讓gradle自動去build ndk,所以我們要把它關掉,在build.gradle的android中打上下面的指令 :



5. ndk-build

接著開Terminal,目錄移到jni,鍵入ndk-build(記得要設定環境參數)


6. 移動檔案

將生成出來的libs中的armeabi資料夾整個移到build/ndk/debug/lib中,就可以運行了

參考資料

2014年5月15日 星期四

第一個Android NDK(Java call C)

最近因為要在Android中使用到C Library,查了一下發現NDK這個工具,它讓Java可以去呼叫C,讓我們在Android的專案中也可以使用C Library。

環境

  • Windows 8.1(64bits)
  • Android Studio 0.58
  • Android NDK Revision 9d
  • ASUS Nexus 7-Android 4.4.2(API 19)

目的

我們要利用Java去呼叫C的方法,然後將取到的字串輸出。

步驟

1. 下載NDK

到https://developer.android.com/tools/sdk/ndk/index.html下載符合自己系統的NDK,這裡我們下載Windows 64-bit的NDK,目前的版本是9d。
載好之後隨便放一個地方,記得路徑以便等下使用(我的路徑為C:\Android\android-ndk-r9d)。

2. 新增native宣告C的方法

在MainActivity.java中打入上面的程式碼,宣告完native function之後要先build,要不然等下的javah會找不到這個方法導致遺漏。

3. 使用javah

先簡單講解javah的使用方式,它可以幫我們產生C header file以便讓我們可以在.java中找到對應的方法。

開啟Terminal

Tools > Open Terminal

將所在目錄轉到main

鍵入javah的指令產生.h


  • -d directory(你要儲存的目錄)
  • -classpath path(javah需要的classes(SDK及project的class路徑))
PS:如果找不到javah的話會產生下面的錯誤
在環境變數裡加上javah的路徑就可解決

4. 加入main.c

如果上面的native有被build的話,你的.h中應該會有{your package}_{native function}(我的就是Java_com_hpchen_testndk_app_MainActivity_getStringFromNative)。
PS:如果沒有請clean project,刪掉jni資料夾,rebuild之後再把第3步重做一次。

  • 記得include .h
  • 將.h中的native function寫好

5. 加入util.c

加入一個空的util.c

6. local.properties中加入ndk路徑


將第1步記下的路徑加入local.properties

7. build.gradle中加入ndk參考


注意:是app中的build.gradle,不是project的。

8. 在MainActivity中load library


執行之後就會看到"Hello JNI !"了。

參考


2014年4月23日 星期三

WebRTC-控制傳輸內容

在視訊電話時,我們有時會不想要讓對方聽到聲音或是看到影像,WebRTC中也有這種功能,以下是一個簡單的例子(使用WebRTC二部曲-RTCPeerConnection-下部(實作)的例子過修改)。

原理

我們在上次的範例中直接將自己的資料流(localStream)傳給遠端,但因為local端和remote端都是同一個資料流,所以在改變資料流的內容的時候會連自己的都被改掉(你不想讓對方看到你的視訊影像,卻連自己都看不到自己的影像了),所以我們就要先新增一個新的MediaStream專門給remote端使用,這樣我們就可以對這個remote端的資料流做處理也不會影響到local端的資料流了。

實作

Step 1

在上次的例子中新增兩個check boxs :

Step 2

新增onclick事件
這裡我們利用getAudio(Video)Tracks()[0]來取得資料流的資訊,然後將enabled屬性做調整就可以達到控制的目的

Step 3

將localStream複製成remoteStream丟給remote peer

2014年4月18日 星期五

WebRTC二部曲-RTCPeerConnection-下部(實作)

平台

  • Visual studio 2012
  • adapter.js(WebRTC跨平台的shim)

目的

這次實作我們要在同一個視窗中開啟兩個視訊畫面,當我們按下Start鍵時我們可以在第一個畫面(Caller)將webcam抓到的畫面顯示,而當我們按下Call鍵時會利用RTCPeerConnection連線取得Stream顯示在第二個畫面(Callee),而HangUp鍵就是關閉連線,雖然這樣做實際性不高,但這樣的Demo可以很清楚地了解RTCPeerConnection的運作原理。

實作

Step 0 : adapter.js

在開始之前,我們要先解決一個擾人的問題-跨平台,就想我們在Demo getUserMedia的時候因為不同的Browser有不同的函式名稱,導致我們要去做一些處理才能確保他能在各個平台上運作,為了省去這樣的麻煩我們將使用adapter.js來cover這些問題。

Step 1 : html

我們一開始先設置需要的js及tag


Step2 : RTCPeerConnectionDemo.js

添加onclick事件給每個Button



Start : 利用webcam取得畫面(聲音)



Call : 設置RTCPeerConnection


1.設置Local跟Remote的Connection的handler
  •  onicecandidate : 還記得上次的圖中的送信人(candidate)嗎?onicecandidate就是在將找到的送信人給記起來
  • onaddstream(我們的demo中local peer並不需要接收stream所以local peer沒有此handler) : 當接收到stream時所要做的動作,在這裡我們將stream放到id為videoRemote的<video>中

2.將要傳送的stream放入connection中
3.建立offer及answer
  • local Peer建立offer
  • 將自己(local)的地址(local description)記下來
  • 當對方(remote)收到地址(remote description)時記下來
  • 對方(remote)也會把自己的地址(local description)記下來
  • 對方(remote)發送answer給自己(local)
  • 自己(local)會把對方的地址(remote description)記下來


HangUp : 關閉連線



2014年4月10日 星期四

Visual Studio 中斷點(break point) 介紹

這次要介紹的是在Visual Studio中的中斷點使用方式,我們在debugger的時候最簡單的方式就是將參數output到console上,可是這樣做很費時又很麻煩,且每次在做完debug之後往往又要把這些output刪除,學會中斷點出現之後,debug就會輕鬆很多了。

平台

  • Visual Studio 2012

設置

在要中斷的行前面點【滑鼠左鍵】
設置完之後可以按【開始】讓我們來看看中斷點的作用 : 
中斷的情形
由上圖我們可以看到兩點 : 
  1. 在中斷點的地方會有一個黃色箭頭還會反白字串,以方便程式設計師看到中斷的行位置
  2. 程式的執行只會到中斷行的前一行而已(console沒有output代表Console.WriteLine沒執行)

控制

在中斷的情況下我們會看到控制項中有幾個按鈕,在這裡我只介紹【逐步執行】,按下【逐步執行】(或按F11)後會看到下面的畫面 : 
黃色箭頭下移一行,Console出現output
【逐步執行】就是一步步往下執行的意思,這個功能在Debug的時候非常好用。

監看式

在中斷的情況下對變數按【右鍵】>【加入監看式】就可以將變數家道【監看式視窗】中 :

紅色框【加入監看式】,黃色框【監看式】,綠色框【平行監看式】
在【監看式】中,我們可以將變數的【值】做改變,這樣我們就可以測試在不同的情況下程式的反應是不是如預期,而【平行監看式】就可以以執行緒做區分,在多工的程式中Debug更加一目了然。

功能

在【中斷點】上按【滑鼠右鍵】可以看到有一些功能可以調整 : 
功能
  • 條件(因【叫用次數時】的功能可以被【條件取代】,所以就不多加描述了)
可以設定要中斷的條件,ex: num > 1000,下面可以選擇是要true的時候中斷還是要再狀態變更(true>false、false>true)的時候中斷
  • 篩選
篩選主要適用於【多工】,它可以讓使用者決定要使用【中斷點】的執行緒或是機器
  • 叫用時
可於每次【中斷】列印信息之後【繼續執行】,這個功能可以方便的觀察出變數的變化,也不用再將訊息output到console了

結論

在學校中通常都只講求理論,對於實作技巧的教學好像的沒那麼多了(像我就是一直到大四去實習才來學到這些Debug的技巧,真的浪費了我好多的時間QQ),可是這些技巧又是寫程式的重要技巧,所以就在此講解,希望有幫到大家^^

2014年4月5日 星期六

利用指令碼匯出(匯入)資料庫

在SQL server中雖然有匯入匯出精靈,但她真的是不太好用,所以我這次要提供一個不同的匯出方式,也就是利用產生指令碼來匯出資料庫,可以讓大家多一種選擇

平台

  • Microsoft SQL server 2012

步驟

Step 1

在要匯出的資料庫上按【右鍵】>【工作】>【產生指令碼】

Step 2

【下一步】

Step 3

這裡可以選擇要整個資料庫還是特定的物件,這個教學是要把整個資料庫給匯出所以選【編寫整個資料庫和所有資料物件的指令碼】>【下一步】

Step 4

先決定【檔案名稱】(也就是路徑)>【進階】>【要編寫指令碼的資料類型】選項改成【結構描述和資料】>【確定】>【下一步】

Step 5

【下一步】

Step 6

【完成】

Step 7 

之後去你儲存的路徑會看到一個.sql檔,將它點開,把裡面所有的內容複製。

Step 8

按下【新增查詢】>把剛剛複製的貼上>【執行】

結論

如果上列的步驟都有完成的話就可以看到一個你剛剛的資料庫了,完成,收工。
我個人是覺得這樣的方式比較快速,也不用東調西調的,希望有幫到大家^^