December
5th,
2014
前言:
本週工作依舊五花八門,下週要去Intel上課.要看看能寫多少出來.
筆記:
[MSFT] 關於Visual Studio 2013 upate 4更新過後,整個編輯器變慢.
新增的功能會預設把git當作他的source control plugin這樣會有一些問題.
問題:
更新VS2013 update4 之後,編輯器變慢.尤其是開啟檔案與關閉檔案的時候.
原因:
VS2013 source control plugin 會讀取該目錄git的資料,並且加入自已的source control plugin.
如果你已經有用到其他的source control system,可能會造成衝突而變慢.
解決方法:
也不算正式解決方法,只是先關閉這個plugin.可以幫助整體效能的提升.
Option -> Source Control -> Plug-in Selection -> Current Source control plugin -> None.
參考:
http://stackoverflow.com/questions/20101211/disable-git-in-visual-studio-2013
[iOS] 關於這週的一些小修改
有些App需要在背景的時候強制重啟,以確保連線狀態(尤其是xmpp).對於類似的App設計,可能可以考慮強制不要App進入背景模式.
原因:
這邊紀錄一下,主要是xmpp server通常會主動踢人(1 min),所以通常一般client 的實現都會有keepalive的機制.不過經過測試App方面的keepalive往往不盡人意.除非有傳輸的需求,不然建議不要進入背景模式比較好.
方法:
新增UIApplicationExitsOnSuspend = True在Plist裡面.
參考: http://stackoverflow.com/questions/5999638/quit-app-instead-of-entering-background-when-receiving-applicationdidenterbackgr
關於dispatch_async(dispatch_get_main_queue() 大家都會用它來把工作移到別的thread
但是其實他也是有照順序的,所以如果你依照順序跑三次,他就會依序跑那些你指定的指令.
用法上對於需要等待回應的程式,其實相當的方便.
關於NSUserDefaults的預設值總是會錯~如果第一次安裝App
錯誤狀況:
第一次安裝App後,讀取NSUserDefaults會無法讀到預設為True的值()或是其他預設值)
解決方式:
原因是因為你沒有把plist的數值去註冊,這邊有兩種方式可以選擇.
第一種: 讀取數值不要用boolValue 而用NSNumber接起來~然後判斷是不是nil
第二種: 執行NSUserDefaults registerDefaults把預設值先讀進App
參考資料:
http://oleb.net/blog/2014/02/nsuserdefaults-handling-default-values/
XCode更新了6.1.1:
很希望他有把IDE穩定性修好,不過有看到一個特別的詞 (SourceKit),去查了一下原來SourceKit是用來給swift作為Source code parser,Syntax highlighter 還有cross-language header generator…
這裏有詳細的解釋: http://www.jpsim.com/uncovering-sourcekit/
[Android] Android Studio 1.0RC版本出來,有些地方要注意:
Android安裝方式,可以選擇Standard來安裝.不過得要啟動時候沒有專案才會出現這個選項.
由於Gradle設定檔有問題,需要把runProguard改成minifyEnabled
參考這篇臉書: https://www.facebook.com/photo.php?fbid=1002023656481430&set=a.113952728621865.18504.100000214145898&type=1
參考這篇問答: http://stackoverflow.com/questions/27078075/gradle-dsl-method-not-found-runproguard
使用舊的Android Studio 含0.8.14版以前,所建立出來的專案,會自動產生res/values-v21/styles.xml造成在Android 5.0的裝置上會因沒有”android:Theme.Material.Light”而Crash掉.
參考這篇臉書: https://www.facebook.com/photo.php?fbid=1002023656481430&set=a.113952728621865.18504.100000214145898&type=1
[Linux][Ubuntu][Python] 手工打造process watcher and recovery
遇到的問題:
工作上遇到的問題主要是有管一些雲端服務,自然要監測這幾個service的狀況.如果遇到service出錯必須要有自動的回覆機制.
解決方式:
原本是透過Python寫一個透過grep來找特定的service的方式,這裡有程式碼.
不過研究過後,或許採取pidof的方式是不容易重複的方式.也改寫成shell script. 參考這裡.
這篇討論很值得思考,偵測process要考慮會不會產生額外的資源消耗.
繼續閱讀
November
28th,
2014
好像變成週記?不過~因為只是草草的紀錄一下,工作上有關的問題或是看到的網路介紹,並沒有打算寫成詳細的文章.
[綜合] 關於 Regular Expression
http://jex.im/regulex/ 是一個透過Java Script 可以視覺化呈現Regular Exoression 的網頁.
好用的Regular Expression範例(不論是取得信用卡號碼,電話號碼,生日,區碼甚至是Email 與 IP Address都有) http://www.virtuosimedia.com/dev/php/37-tested-php-perl-and-javascript-regular-expressions
個人認為兩個網站搭配起來,可以讓你的Regex的功力更上一層樓.
其他資源:
Eclipse 的Regex Tester介紹 http://www.ewdna.com/2009/12/eclipse-regular-expression-tester.html
Regex 精華整理 http://www.javaworld.com.tw/jute/post/view?bid=20&id=130126&sty=1&tpg=1&age=0
[iOS] 關於XCode6的Adaptive Layouts
到了Xcode6為了配合iPhone6(或是其他size iPhone),在XCode6裡面新增了Adaptive Layout的功能.仔細看了功能,發現真的是相當容易搞死人的設計.
相關資料:
One Storyboard for all sizes http://www.learnswift.io/blog/2014/6/12/size-classes-with-xcode-6-and-swift
Size Class tutorials http://www.ioscreator.com/tutorials/size-classes-ios8-xcode-6
Video tutorial https://www.youtube.com/watch?v=E3glNbNnokw
[Android] 關於InetAddress的 thread safe 問題
問題:
當手機在做Wifi 切換的時候,如果網路不穩定的狀況下,同時使用InetAddress.getByName()會hang住.
詳細狀況為第一次呼叫到會成功,第二次會hang在裡面.(同時呼叫)
解法:
沒有找到確切的證據,不過由於InetAddress本身是透過JNI來查詢網路,不適合作為網路狀況的確認.
網路上比較建議的方式必須要有UI來負責這件事情,因為比需要使用到permission “android.permission.ACCESS_NETWORK_STATE”
參考:
http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts
http://thiranjith.com/2011/03/31/how-to-monitor-network-connectivity-in-android/
// 當兩個thread同時呼叫以下的指令,在網路不穩的狀況下會出問題.
InetAddress.getByName("SOME_DOMAIN_NAME").isReachable(30);
// 比較建議的方式
public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
// 必須要注意到加到 Manifest
< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
繼續閱讀
November
23rd,
2014
前言: 最後一個作業是要做出一個自拍管理的App透過Content Provider來管理資料,還附有通知.從無到有其實很有趣的.我相信也能學到更多的東西,我希望能夠全部寫完,加油了. 筆記: 關於使用App Action Bar會強制請你加入Android-support-V7的project. 如果你是要讓Android V7~V10的App支援Action Bar,你必須要新增Android-support-V7的project並且新增相依專案.但是如果希望新增一個然後不要有這些的相依性問題的話,你需要利用以下設定建立.(同時符合大部分作業的需求在V18上) Minimal Requirement V17 Target V19 Compitible with V18 參考文章: http://oldgrayduck.blogspot.tw/2013/10/android-support-library-actionbar.html 如果要找default camera 在action menu的icon 其實Android SDK裡面就有,在ANDROID_SDK/platforms/android-XX/data/res/drawable-XXX 參考: http://stackoverflow.com/questions/8179653/where-can-i-find-standards-icons-for-actionbar 裡面主要透過Content Provider 的方式來達到資料的存取,並且增加了Notification的功能. Alarm Manager 透過他呼叫起一個Intent然後來設定Notification.透過這個方式來達到,離開App之後,可以在固定時間後收到通知. 關於讀取camera所拍照回來的照片檔案位址: Android無法直接取得相簿裡面的位址,比較容易的方法是在透過intent設定camera 的時候先設定好相關的參數. 光是那個參數設定了好久才能正常把相片另存地方.getBaseContext().getFilesDir()這個位址會讓Intent回不來. 參考http://stackoverflow.com/questions/15009581/camera-intent-picture-file-path //指定時間作為檔名來另存新檔 PackageManager pm = getPackageManager(); if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Intent intent_camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss"); String currentTimeStamp = dateFormat.format(new Date()); File mFile = new File(Environment.getExternalStorageDirectory(), currentTimeStamp+".jpg"); Uri outputFileUri = Uri.fromFile(mFile); intent_camera.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, outputFileUri); Toast.makeText(getBaseContext(), "File URI is "+outputFileUri, Toast.LENGTH_LONG).show(); startActivityForResult(intent_camera, 0); } else { Toast.makeText(getBaseContext(), "Camera is not available", Toast.LENGTH_LONG).show(); } 讀取縮圖並且直接設定到ListView裡面: 關於這部分的我把它想得太複雜了,網路上不少作法推薦直接把檔案放進content provider裡面,但是這樣沒有辦法存取多個資料. 最後其實就直接記住檔名(這裡檔名使用當下的時間,最後把圖片放進去BitmapDrawable就可以. // 從content provide拿取檔案名稱 String photoContentUri = cursor.getString(cursor.getColumnIndex(DataContract.PIC_FILE_NAME)); // 與系統位置配對成完整檔案位置 File mFile = new File(Environment.getExternalStorageDirectory(), photoContentUri); if (null != photoContentUri) { InputStream input = null; try { // 讀取縮圖 input = context.getContentResolver().openInputStream(Uri.fromFile(mFile)); if (input != null) { photoBitmap = new BitmapDrawable(mApplicationContext.getResources(), input); photoBitmap.setBounds(0, 0, mBitmapSize, mBitmapSize); } } catch (FileNotFoundException e) { Log.e(TAG, "FileNotFoundException"); }...
繼續閱讀
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
繼續閱讀