October
17th,
2014
上到第三周了,開始有一些重點出來.主要有提到Intent,Permission跟 Fragment. 關於Intent: Intetn可以分為 Implicit Intent 跟Explicit Intent,差別如下: Implicit 是使用系統內建(或是有登陸的Activity/App) Explicity 是可以讓你呼叫自己定義的Activity 可以有許多”動作”(Action)選擇,比如說 ACTION_DIAL… 等等, 使用SetAction()來呼叫 URI 是幫助你傳遞一些需要的小資料,比如說: 電話號碼, 地圖經緯度.. 等等 使用SetData()來呼叫. Extra 可以指定為EXTRA_EMAIL,或是改為字串會是變數 需要多加變數可以用 putExtra(KEY, VALUE) 跟 getExtras() 來傳遞 關於OnActivityResult部分,要用setResult(Activity.RESULT_OK, Intent) 來傳遞 如果要跟系統註冊為一種 ImplicitAcitivity的瀏覽器就一定要在AndroidManifest.xml裡面加上: < intent-filter > < action android:name="android.intent.action.MAIN" /> < category android:name="android.intent.category.LAUNCHER" /> < /intent-filter> < intent-filter> < action android:name="android.intent.action.VIEW" /> < category android:name="android.intent.category.DEFAULT" /> < data android:scheme="http" /> < /intent-filter> 關於Permission: 我們比較熟悉的事,但是其實可以建立自定的permission,利用 的tag 想知道更多參考 Android Permission http://developer.android.com/guide/topics/security/permissions.html 如果有需要讀取瀏覽器的書簽需要加上以下的permission -更多的權限要看這裡 http://developer.android.com/reference/android/Manifest.permission.html#WRITE_HISTORY_BOOKMARKS < uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" /> 如果permission 已經被提升(granted)的話,就必須要移除App才能測試移除permission的部分. < permission > android:name="course.examples.permissionexample.TEST_PERM" android:description="@string/test_perm_string" android:label="@string/test_permission_label_string" > < /permission > 關於Fragment 使用的時機點: 同一個App在tablet 與手機上,可以顯示不同畫面 Fragment 建立的方式有以下幾種: Static Fragment: 將Fragment 定義在 layout裡面 Programmatically: 不用先將Fragment 寫死在Layout,而是動態讀取Fragment 然後貼在Frame上面. Dynamic Fragment: 不僅僅可以用程式指定Fragment,更可以決定在某些狀況下才顯示Fragment 一般而言,configuration change (手機直向或是橫向變化) 會Destroy Fragment然後重新建立,可以利用setRetainInstance(true) 去避免這個狀況. 如接下來的 Life Cycle 所顯示,如果有加上 setRetainInstance OnDestroy 與 OnDetach不會執行到,相對的也不會跑 OnAttach跟 OnCreate.只會跑OnCreateView. 所以要控制外觀的部分(比如說記錄selected list index)需要加在OnActivityCreate這裡. Fragment Life cycle : OnAttach OnCreate OnCreateView (handle Fragment UI) OnActivityCreate OnStart, OnResume …. OnDestroy OnDestroy OnDetach 可以參考這裡有更多解答 http://developer.android.com/guide/components/fragments.html Fragment 可以是動態加入(形成原本是單個frame的界面,按下後變成兩個frame的界面),並且利用加入onBackStackChanged來改變layout回單個frame 一般而言,在旋轉手機的時候會觸發 configuration...
繼續閱讀
October
15th,
2014
前言:
想要試著做做看一個簡單的相機資料管理系統,並且可以顯示QRCode到該相機資料庫並且顯示JSON資料. 主要也是趁個機會把Django再拿出來複習一下.雖然也是有打算用Golang來寫,但是Golang沒有找到比較方便的QRcode 模組就先緩些時間.
步驟:
把相關的模組與設定加到原來的Django網站. 這部分可以參考Django toturial 恢復記憶
source venv/bin/activate
//Install related component
pip install django-qrcode
//Write back to requirement.ext
pip freeze > requirements.txt
//Crete new app for this website
python manage.py startapp cam_qrcode
接下來要設定資料庫,這裡資料庫相當簡單,相機就只有名稱而已.並且有一個XMPP 賬戶做IOT(Internet Of Thing)使用.
class Camera(models.Model):
camera_id = models.IntegerField()
camera_name = models.CharField(max_length=200)
camera_xmpp_account = models.CharField(max_length=200)
camera_xmpp_password = models.CharField(max_length=200)
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
def __unicode__(self):
return self.camera_name
關於QRCode產生的部分,我使用的是 Django-qrcode.使用上相當簡單,而且很方便.
可以顯示之後就是要準備產生Json,這裡我是用Simplejson 來使用
cam = get_object_or_404(Camera, pk=cam_id)
response_data = {}
response_data['cam_id'] = cam.camera_id
response_data['camera_name'] = cam.camera_name
response_data['camera_xmpp_account'] = cam.camera_xmpp_account
response_data['camera_xmpp_password'] = cam.camera_xmpp_password
out_obj = json2.dumps(response_data)
這樣就完成了,作品在Heroku上面.大概花費四五個小時…
遇到問題:
列出來所遇到的一些問題:
Django 升級後反而不能跑
已試過把Django從1.6.2 升級到 1.7,就發現無法正常執行伺服器. 這部分先採取downgrade處理,之後有空再看.
pip install django 1.6.2
‘function’ object has no attribute ‘dumps’
這個主要是json似乎跟某個版本搞混,所以無法獲得正常的json.
我解決方法是使用simplejson 並且更改名稱到json2
import simplejson as json2
參考資料:
Django QRcode Generator
https://pypi.python.org/pypi/django-qrcode/0.3
Django Model Fields Document
https://docs.djangoproject.com/en/dev/ref/models/fields/
成品的網站
http://evan-web-apis.herokuapp.com/cam_qrcode/
產生json.dumps 的方法:
http://stackoverflow.com/questions/2428092/creating-a-json-response-using-django-and-python
官方的json文件
https://docs.python.org/2/library/json.html
Simplejson的文件
https://pypi.python.org/pypi/simplejson
繼續閱讀
October
15th,
2014
最近在做伺服器檢查的時候,發現公司內所寫的幾個背景程式經常莫名其妙出問題.於是開始下來檢查一下,就像前幾篇提到的一樣,我有加上HipChat當做是看門狗的程式來監視並且確實的回報資訊給我.
但是,就算有收到回報訊息.找出容易發生問題的地方才是重點.後來有查到當使用者自己從手機上輸入資料傳到伺服器的時候.就會發生MySQL Query Error ,以下面的範例:
"SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."' AND `password` LIKE '".$password."'"
如果這時候,使用這輸入加上有 “ ‘ “的字元,就會產生MySQL Query Error.甚至於會SQL Injeect就是輸入以下的內容:
"' OR ''=''#"
這時候唯一的方式就是講 “’“ 轉換成 “'”才不會讓SQL Qeury發生錯誤或是不可預期的狀態.
其實這相關的方式,在PHP裡面相當的簡單就是加上addslashes函式.但是在用C++直接存取MySQL的時候,可就沒那麼方便.
找了一下相關的文章,後來在MySQL API Document 裡面有找到mysql_escape_string,順便也找到有人寫的範例程式可以使用. 引用自這裡http://www.3dbuzz.com/forum/threads/146155-C-version-of-addslashes
/**
* escapes the mysql string
* note running on the entire SQL screws it so just run it on elements to be inserted
* @param string sql
* @author D.Busby
*/
char *db_connection::escape_string(string sql)
{
char *s = new char[sql.size()*2 + 1];
mysql_escape_string(s, const_cast<char *>(sql.c_str()), sql.size());
return s;
}
接下來只要將每個要帶入查詢的內容先加上這個函式就可以.
相關資源:
講解基本SQL Injection 的範例與原因
http://newaurora.pixnet.net/blog/post/166231341-sql-injection-%E7%AF%84%E4%BE%8B(%E7%99%BB%E5%85%A5%E7%AF%84%E4%BE%8B)
MySQL其實提供了一個函式,可以幫你把有威脅性的字元,加上”"的資源
http://www.3dbuzz.com/forum/threads/146155-C-version-of-addslashes
撰寫一個可以對應可變參數的函式
http://www.dotblogs.com.tw/simplecestlavie/archive/2013/01/02/86637.aspx
MySQL mysql_escape_string API document
http://dev.mysql.com/doc/refman/5.5/en/mysql-escape-string.html
資安電子報,如何預防SQL Injection 攻擊
http://getpocket.com/a/read/738670748
把一段C++ MySQL 加上解決SQL Injection的程式碼
https://gist.github.com/kkdai/31732f96daa9fd6fb0f7
繼續閱讀
October
6th,
2014
主要是在管的一些伺服器會有莫名其妙的service中斷的狀況,本來有在增加一些log.不論是在MySQL還是程式本身.但是除了要找出原因之外,要能夠迅速的回復服務也是一個方式.
其中想過不少方法,不過也都有撞牆的狀況:
使用SMTP,寄送Email (用Gmail account)
發現Google的安全機制太麻煩了,不僅僅會擋掉其他地區的登入.還會要求你使用網頁版的先登入過gmail 才能使用程式去跑SMTP.
這裡可以參考一些好用的Python Send Email:
http://stackoverflow.com/questions/10147455/trying-to-send-email-gmail-as-mail-provider-using-python
使用XMPP (或是使用Facebook Chat)
其實Facebook 的聊天有支援XMPP的,使用Pidgin也可以順利登入.但是考量到Aliyun在大陸內部臉書被擋.放棄!
參考一下Facebook Chat
還是回過頭來使用最被大家所推薦的Hipchat,不僅僅支援的服務多.也可以自己再去手動修改.
裡面比較需要注意的是 API Token 有分 1.0 跟 2.0,大部分外面的應用都是使用API 1.0
這邊有一個比較好用的 CLI的方式,可以直接傳送訊息 Hipchat-cli
這才剛開始.. 希望能把自動化弄得更容易…
參考link
Hubot 使用node.js 架設在hipchat的機器人系統
https://hubot.github.com/
關於hipchat xdite的看法
http://blog.xdite.net/posts/2013/04/02/move-to-hipchat
StreetVoice如何使用 HipChat打造自動化機器人
https://speakerdeck.com/tzangms/the-workflow-of-the-new-streetvoice
把Hipchat當成log 小鋪
http://demo.tc/Post/799
繼續閱讀
October
1st,
2014
我的iPhone4 也使用了三年半,這次iPhone6變大了實在很對我的胃口.
難得搶到中華電信的第二波領機專案,所以就順便攜碼過來,但是攜碼卻比想像中的困難.
開箱不會有開箱照,不過倒是有一些注意跟提醒,如果你跟我一樣是從iPhone4 轉到 iPhone6.
特別是如果你是攜碼(NP)的用戶,要注意:
電話資訊的轉移:
這裡給需要使用到itune備份與還原的人,使用到icloud的人代表也不太需要把資料轉過去.
先使用舊的iPhone4 連接到你的itune
選擇備份”到這個電腦”
建議把app與購買項目一併備份起來.
打開你的iPhone6
記得把一些初始設定都先跑完,到達一般使用的狀態
連接itune,自然會出現”歡迎使用新的iPhone”
選擇”從此備份回復”
這樣就可以了….. 簡單又快速..(就算我32G 用到幾乎滿,轉過去也大概20 mins)
電話帳號的轉移:
這邊比較需要提一下的是,先註明一下iPhone4 是 micro-sim 而 iPhone6/6Plus 使用的是 nano-sim
還有,中華電信的攜碼(NP)門號要有10天的作業時間.於是你可能得繼續使用你舊的門號.可是呢? 聽中華電信的小姐說,如果你先申辦攜碼(NP)的話,可能原來的電信商就比較不會主動幫你做卡片更換的動作.
所以,這邊可能要請還沒領機的人先注意一下,正常程序如下:
先到原電信商申請nano-sim 卡
這個時候可能會用遺失或是換卡處理,所以你最好順便拿一下 nano-sim 轉 micro-sim 的轉卡,不然短時間會沒卡
到中華電信去領機
使用原來電信商的卡片
不要跟我一樣,直接跑到了中華電信發現卡片還沒換.結果櫃檯人員好心的等我去對面把卡換過之後繼續領機的過程.途中還發現某電信傷的nano卡缺貨,還跑到第二家才有.
大螢幕真棒…. 一次升上 128G
繼續閱讀
September
26th,
2014
前言:
這本來是Moocs上面一系列關於Java/Android課程Mobile Cloud Computing with Android的第二門課程.由於最近我把第二階段的課上完了.也在想說要不要學一下.先開始follow看看…
其實對於Android 我還是處於不是很熟悉的狀態.雖然當初已經把一些簡單的相機功能有寫出來.但是整個還是架構不熟悉.也順便來學習一下.
關於環境使用:
關於Emulator的Shell使用,由於我使用的是Genymotion.稍微玩了一下,發現command幾乎都不太一樣.
Genyshell 必須在Genymotion模擬器跑起來之後再用
genymotion capabilities 可以查詢所有支援的指令
就算你查到camera/accleronmeter可以使用,但是其實因為是模擬器.其實是不能用的.
battery getlevel/setlevel 來設定電源目前使用量
gps setaltitude/setlatitude 可以來設定目前gps地點資訊
Emulator Call
這個部分使用AVD(Android Virtual Device)可以,但是我還沒找到如何使用Genymotion來做.
DDMS Perspective
這個部分我比較沒有在使用,不過這次的教學也會清楚地教導如何使用DDMS.主要在Hierachy View 還有 Methond profiling.
關於Activity Lifecycle
筆記一些我比較沒有注意的部分:
OnResume 發生的時間點是最多的,基本上就是Activity 出現前就會發生.所以以下情況都會發生:
第一次執行OnCreate之後
離開App回來之後
OnPause與OnRestart的返回
OnPause 發生在準備要離開Activity的時候,緊接著是OnStop會收到
OnStop 會出現在 OnPause之後,所以不一定會被呼叫到,如果user使用kill app.這時候只會有OnPause
旋轉手機的時候,OnCreate,OnStart跟OnResume都會發生
其他更多可以在這裡看到 http://developer.android.com/training/basics/activity-lifecycle/index.html
繼續閱讀