November
20th,
2014
許多相關雜事紀錄,盡量條列式記起來.
[綜合]
關於xmpp programming的部分
xmpp 的連接可能會用到不少的時間.在正式上線前,沒辦法收到訊息.
所謂的正式上線.原本以為會是OnPresence,OnReadyToSend或是OnInitialize.他們的順序是 OnInit -> OnReadyToSend -> OnPresence
而onPresence 還必須要有好友(buddy)才會收到
真正要能送出訊息,必須直到OnPresence
Linux Socket Programming
似乎有遇到SIGPIPE的問題,雖然網路上都說可以使用signal(SIGPIPE,SIG_IGN)來處理斷線造成的問題.但是遇到了會被認為是仍在連線所造成的更多問題.看來還得仔細研究內容來解決問題.
相關文章:
https://www.ptt.cc/bbs/Linux/M.1378805552.A.A8A.html
http://q110185.blogspot.tw/2009/01/linuxsigpipe-handle.html
http://www.cppblog.com/elva/archive/2008/09/10/61544.html
[iOS]
HealthKit的請求權限(requestAuthorizationToShareTypes)必須在一開始就要要求.
如果有需要新增,或是減少,只是重新執行App是沒有用的.需要重新安裝才會跑到正確的集合.
它類似GameCenter一樣,當你試著移除App的時候.會詢問你要不要把相關的數據全部移除.
WatchKit也放出來了,幾件事情值得記起來.
WatchKit類似App Extension(Today Widget)類似,可能需要手機App作為互動本體.
[MacOSX]
本來想試著找找MacOSX上面的FileMerge工具(個人習慣使用Araxis Merge).但是太貴了,後來用習慣Xcode裡面的FileMerge也就放棄繼續找了.
[MSFT]
微軟在2014/11/13第二天的Connect Developer Event 裡面,做了重大的宣布:
開放.Net Framework 原始碼,範圍包括CLR,JIT(Just-In-Time Compiler),GC與.NET基本的一些Framework.
目前開放只有XPATH與Collection,喜愛用.NET裡面XML物件的可以去看看.hub.com/dotnet/corefx
微軟也宣布可以內建支援Docker,並且有放出原始碼給大家用.這篇文章有更多資訊.
相關資料:
關於HealthKit中文說明
https://www.apple.com/tw/ios/whats-new/health/
關於MSFT開放原始碼與相關變更的網頁
http://weblogs.asp.net/scottgu/announcing-open-source-of-net-core-framework-net-core-distribution-for-linux-osx-and-free-visual-studio-community-edition
Apple Developer[Need apple account] - App Extension (Widget, Today, Share …)
https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/NotificationCenter.html
How to compiler Docker in Windows
https://ahmetalpbalkan.com/blog/compiling-docker-cli-on-windows/
About SIGPIE
https://www.ptt.cc/bbs/Linux/M.1378805552.A.A8A.html
http://q110185.blogspot.tw/2009/01/linuxsigpipe-handle.html
http://www.cppblog.com/elva/archive/2008/09/10/61544.html
繼續閱讀
November
17th,
2014
前言: 最後一週,分成兩個一個是Assignment.另外還有Peer Assignment,要努力堅持到最後. 筆記: 關於資料管理的部分: SharePreferences 屬於小量的資料存取,(iOS 使用的是NSUserDefault 與 pList來管理) 讀取資料getInt getString 寫入資料必須先取得SharedPreferences.Editor 之後再setInt or setString PreferenceFragment 是一個UI Fragment可以存取與直接收到SharedPreferences 的變化. 透過setContentView可以把一個表示資料與介面的xml檔案設定好,然後存取它所代表的資料. File 可以使用 internal memory 或是external memory 其中比較需要注意的是MODE_PRIVATE會把檔案鎖定成這個App才能讀取或是只用同樣的user ID跟App. 對於external storage需要注意以下的事項: 對於external memory 的檔案需要在manifest上面增加相關的權限: 存取前要先注意是否有讀或寫的權限: Environment .getExternalStorageState() SQL (SQLlite) 如果要繼承SQLiteOpenHelper來使用,必須要Override OnCreate跟OnUpgrade. 資料庫的檔案在 /data/data//databases/ 透過以下方式可以讀取SQL資料 adb -s emulator-5554 shell sqlite3 /data/data // SharedPreferences final SharedPreferences prefs = getPreferences(MODE_PRIVATE); //get data from SharedPreferences int high_score = prefs.getInt("high_score", 0); //set data to SharedPreferences SharedPreferences.Editor editor = prefs.edit(); editor.putInt("high_score", 99); editor.commit(); //File read sample (internal storage) FileInputStream fis = openFileInput(fileName); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String line = ""; while (null != (line = br.readLine())) { TextView tv = new TextView(this); tv.setTextSize(24); tv.setText(line); ll.addView(tv); } br.close(); //File write FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE); PrintWriter pw = new PrintWriter(new BufferedWriter( new OutputStreamWriter(fos))); pw.println("Line 1: This is a test of the File Writing API"); pw.println("Line 2: This is a test of the File Writing API");...
繼續閱讀
November
17th,
2014
前言:
週末前剛好心血來潮更新了Android SDK,也看到了ADT有了23版,並且當然也有下載最新的Android L 的SDK.想不到下載完之後造成Eclipse完全無法使用,利用了週末的時間好好的把系統整理了一次.(決定重灌,並且也要重新安裝gradle)
接下來就記錄一下,那些部分有遇到問題.希望能幫助到一樣遇到問題的你.以下這篇文章有更清楚地解釋出現了22.6更換到23版的錯誤.
錯誤與修復:
有關更新到Android SDK 23的錯誤
錯誤狀況:
“This Android SDK requires Android Developer Toolkit version 23.0.0 …“並且重開也沒有效過.當然Check for update 也沒出現任何可以更新
解決方法:
根據一些網友的討論,似乎在[Install New Software]-> update SDK to 23.0
但是我都會出現更新的dependency 出錯,根據這篇文章似乎從2014的六月到現在都還沒解決.所以我還是決定重灌Android Developer Toolkit
有關更新到ADT 23之後,ADB 無法順利的執行(如果你有使用Genymotion 23.1之前的版本的話)
錯誤狀況:
Genymotion 模擬器執行之後,Eclipse一直無法正確的編譯程式.出現 “The connection to adb is down, and a severe error has occured”
到 ANDROID_SDK/sdk/platform-tools/adb 去跑 ./adb kill-server 與 ./adb start-server 也無法成功.
解決方法:
這邊有兩個解決方法,一個是把你的Genymotion更新到23.1
另外一個就是依照以下這篇文章去改變genymotion的設定不使用自己的Adb而使用Android SDK的adb
參考資料:
About stackoverflow in ADT 23 error
http://stackoverflow.com/questions/24525595/this-android-sdk-requires-android-developer-toolkit-version-23-0-0-or-above
In Mozil blog discussion about ADT 23 error
http://blog.mosil.biz/2014/06/android-sdk-tools-update-part-3/
Genymotion Adb error
http://stackoverflow.com/questions/26431972/android-studio-lollipop-adb-genymotion-issues-devices-wont-show-up-adb
繼續閱讀
November
12th,
2014
前言與心得:
前一次的作業雖然說是要做一個太空船射擊隕石的遊戲,但是僅僅是完成前半段.也就是只有完成船的移動,發射飛彈與隕石的移動部分.接下來就要做碰撞跟多個隕石的控制.
總算把這個課程弄完了,最後的作業其實讓我寫起來很過癮.這大概也是為什麼我除了平常晚上努力寫之外.週末還要拿時間來寫. 主要是最由透過去寫一個遊戲,來完成對於物件導向與多個物件的管理.
比如說,你要如何管理一個子彈飛行的時間跟是否有撞擊到目標.其實只要管理好一個,到多個的時候自然水到渠成.一步步慢慢地完成每個單獨的類別,然後看到多個物件瞬間可以完成的成就感真不錯.
筆記:
這一個章節主要是講解 List,Set與 Dictionary.而重心主要在Set上面.
關於List
資料可以重複
關於Set
不會重複
在逐一讀取(iteration)的時候,不應該做新增跟移除的動作,會造成索引混亂(也就是會讀錯個或是少讀)
一般的作法就是另外列出一個集合後,利用差集合(difference_update)去運算.
其中要注意difference不會改變原來的集合元素,而difference_update會.
其中對於原來集合會有變更mutate的函式,有以下:
add/remove/modify/update(但是s.update(s)不會更改)
兩個集合操作要有_update的函式
def get_rid_of(inst_set, starting_letter):
#透過另外一個集合來搜集所有要刪除的
remove_set = set([])
for inst in inst_set:
if inst[0] == starting_letter:
remove_set.add(inst)
#透過difference_update來移出所有在remove_set裡面的元素
inst_set.difference_update(remove_set)
作業:
其實上次不小心好像把這個禮拜的作業都弄完了.不過還是有一些細節需要微調:
由於這是一個太空船射擊遊戲,主要就是一個飛船在螢幕上可以發射飛彈來射擊每秒隨機產生的隕石.
所以原先的做法是寫了許多的函式來處理撞擊與子彈飛行的部分,這先部分要拆解到原先飛船與隕石各自的類別來處理.
對於個別物件的參數取得,原本做法比較粗糙就是直接取得.這部分得都改由函式來取得.
整個架構上,出題的人希望你透過兩個類別就能完成整個遊戲.一個類別是飛船,另外一個則是sprite.而不論是隕石,子彈或是爆炸三者都被視為是sprite的一個部分.
其中就必須要區分出來這三者哪些有生命週期,比如子彈跟爆炸必須要多久之後消失,而隕石不需要.
哪些屬於動畫需要改變畫圖的image
繼續閱讀
November
10th,
2014
前言: 最近開始比較忙碌了,也希望趕快把兩個課程結束.不然每次都得半夜熬夜想作業.尤其Python作業還搞到週末才弄完. 筆記: 關於Sensor的部分: 有各種的Sensor可以使用(動態(motion),動作(action),還有環境(environment)). 使用: 透過 getSystemService(context.SENSOR_SERVICE) 夠過註冊onSensorChanged() 與 onAccuracyChanged()來接收變更. 如果發現精準度(Accuracy)增加了,對於這樣得資料改變需要處理 關於座標系統(Coordinate System): X: 左到右 Y: 下到上 Z: 前面到後面 手機的橫放(landscape)或是直放(potrait)不會影嚮座標系統 關於動態資訊與磁力座標(magnetic)資訊處理: getRotationMatrix: 先透過手機的資訊轉換實際世界的資訊,主要是往北方的資訊 getOrientation: 拿到手機orientation資訊,裡面資訊是弧度(radians) 轉換弧度(radians)到角度(degree) @Override public void onSensorChanged(SensorEvent event) { // Acquire accelerometer event data if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { mGravity = new float[3]; System.arraycopy(event.values, 0, mGravity, 0, 3); } // Acquire magnetometer event data else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { mGeomagnetic = new float[3]; System.arraycopy(event.values, 0, mGeomagnetic, 0, 3); } // If we have readings from both sensors then // use the readings to compute the device's orientation // and then update the display. if (mGravity != null && mGeomagnetic != null) { float rotationMatrix[] = new float[9]; // Users the accelerometer and magnetometer readings // to compute the device's rotation with respect to // a real world coordinate system boolean success = SensorManager.getRotationMatrix(rotationMatrix, null, mGravity, mGeomagnetic); if (success) { float orientationMatrix[] = new float[3]; //...
繼續閱讀
November
6th,
2014
前言:
自從課程開始忙碌之後,我已經把Android跟Python的順序開始做個調整.不過因為這堂課程的loading一直不算輕鬆,雖然他的主要課程內容圍繞著他所提供的simplegui與codeskulptor之外,他的作業其實都是屬於peer assignment.也就是說你除了寫好作業之外,你還需要改其他同學的作業,不然就像我這個禮拜一樣被扣了20%的分數 orz .
課程筆記:
這次主要是圍繞著如何利用聲音播放與一些OnDraw的相關應用去做出一個太空船射擊的遊戲.這邊其中就會牽扯到一些部分需要瞭解:
關於推動力與摩擦力的運算
關於聲音的播放
對於動態物件的表示,與封裝.比如說隕石跟太空船都是會動的物件,但是隕石會飛出畫面外,太空船則不會.
對於畫面上物件的碰撞計算,前幾天在Android的作業裡面也是一樣的東西.
利用Dictionary 達成variable point 或是 function pointer map.
裡面的programming tip是每個禮拜課程中,都會教導一下關於這個禮拜可能會遇到的一些小技巧與需要注意的地方.
這次提到透過dictionary 裡面去加入其他函示的方式來達成function map的作用.當然舉一反三也可以指向其他的類別
#關於其他function point mapping
def f():
pass
d = { 0 : f }
d[0]() # call f function.
#利用Dictionary 做到類別mapping
class C1:
def __init__(self):
self.inVal = 5
def get(self):
return self.inVal
obj1 = C1()
print str(obj1.get()) #5
d = { 0:C1 }
obj2 = d[0]()
print str(obj2.get()) #5
作業筆記:
作業不簡單,所以寫了一下子才能回來更新部落格.一些筆記如下,大部分與http://www.codeskulptor.org裡面的simplegui處理有關:
關於圖片顯示,原來的圖片都是PNG所以已經能透明,只要需要把圖片換成網路上png自行會處理透明的部分
先試著處理keyboard event 對應著圖片旋轉的部分,這時候會發現圖片預設是0度(degree),所以要處理一下.
要寫這個作業,首先要先來複習一下角度(degree)與弧度(radians).這邊我弄了很久因為我把角度(degree)的起始點弄錯,所自然算出來的弧度(radians)就是錯的.
#算出推進力,課堂的影片有提到
forward = (cos(radians) , sin(radians) )
參考資料:
角度與弧度的運算
http://math.rice.edu/~pcmi/sphere/drg_txt.html
繼續閱讀