最近公務人員放榜了,幾家歡喜幾家愁,讓我不禁問自己『是不是應該考慮一下公務員這個職業』。
我:你覺得我應該去準備公務員嗎?
嘉:嗯?
我:但是我覺得那好像不太適合我去做,我能忍受在公文裡面翻來覆去嗎?
嘉:如果去做了,應該就可以慢慢適應吧!?
我:我能嗎?這好像跟我想做的事情相左耶。
嘉:你也適應現在的工作了呀!
我:我有適應嗎?我還是覺得很多事情很鳥。
嘉:但是以前比較氣憤的口氣,現在只是在敘述而已。
我:所以在情緒上已經默默接受嗎?
嘉:很多事情聽起來不合理,你也說的很平淡。
我:嗯。
一個人在某個環境待久了,似乎都還是會產生一些改變,不管是能力、言語、思想、體型,或最重要的心態;大概兩年前一位年輕人說:『我覺得這樣工作會沒有熱情』,一個老一輩的工程師回他『我做這幾十年來每天對工作都充滿熱情』,我想這句為了場面的假話,不知道有多少人在心裡竊笑;雖然我也不過工作3年半多,但我認識『人』這種生物也準備進入第30個年頭,如果『熱情』就是他傳遞出來的感覺,我很希望熱情消磨越快越好。
我想所謂的『熱情』當然不是該位資深工程師心中所充滿的東西,我們明白那是對事情的一種執著,一種信念,一種堅持的能量,而絕大部分的『工作』會慢慢地消磨這種能量,接著我們會說:『工作』給了我一個月固定的錢,支付著我的房貸、我的車貸、小孩的教育費、每年出國的旅遊基金(雖然我一樣都沒有),而我們越常對於工作抱怨能量下降的就越快,而能量越低就對工作的抱怨越多,惡性循環之下工作馬上就變成『真的只是工作』;接著我們會聽到有些人稱這個程序叫做『工作的歷練』,每一個剛進社會的年輕人都是一個帶有菱角的石頭,他們終究在社會這個泥漿裡越磨越光滑,然後我們會稱這件事情叫做『長大了』。
所以我聽到『你適應了』這句話,心中的感受不是升級,而是一種自我墮落的感覺,會不會在五、六年後,我也會昧著良心說出一些鬼話?就因為我又磨到更適應了?其實很多對於『長大』與『適應』的定義,包含了很多看更淡、計較更少、一種人生如浮雲的感覺,除了名與利,甚至包含『熱情』與『希望』。
我真的很希望對於『工作』除了金錢的獲得以外,有著更多對於自己或團隊『成果』的期待,是一種秀出來心中會微微興奮,一種要讓對方驚艷的感覺,而不是去比遮臉的速度。
總之,我從10分憤世忌俗的年輕人變成了9.9分,但我很希望未來的歲月可以有『說實話的勇氣』、『無奈中保有堅持』、『開創的熱情』與『平靜的心』。
最後願我未來告訴小孩的道理也一直落實在自己身上,而不是說出一種自己未達成的遺憾。
網頁
▼
2011年9月30日 星期五
SQL 2008_令人無力的評估版到期
如果:
1. 你灌了SQL 2008評估版。
2. 你在180天看到到期訊息,才想起來這件事情。
3. 你怎麼利用維護升級都沒辦法解決SSMS沒辦法開啟的問題。
那麼我勸你立刻進行我最後的做法:
1. 備份你的資料庫檔案。
2. 移除你的SQL 2008。
3. 重新安裝他。
這時你需要一個重要的語法→如何移除SQL 2008(官方參考)
1. 開啟命令提示 cmd
2. 輸入:CD %ProgramFiles%\Microsoft SQL Server\100\Setup Bootstrap\Release
3. 輸入:setup.exe /ACTION =uninstall /FEATURES = Feature_List /INSTANCENAME = MSSQLSERVER
若要安裝,請參考→SQL2008R2完整安裝攻略
註:聽說未到期前可正常利用維護升級方式將其改為正版,但過期後只能利用重灌的方式,但是我也不能測試,我想如果你看到這篇文章,那你也不能測試了。如果你設定還記得了話,重灌到系統恢復只要30-40分。good luck
1. 你灌了SQL 2008評估版。
2. 你在180天看到到期訊息,才想起來這件事情。
3. 你怎麼利用維護升級都沒辦法解決SSMS沒辦法開啟的問題。
那麼我勸你立刻進行我最後的做法:
1. 備份你的資料庫檔案。
2. 移除你的SQL 2008。
3. 重新安裝他。
這時你需要一個重要的語法→如何移除SQL 2008(官方參考)
1. 開啟命令提示 cmd
2. 輸入:CD %ProgramFiles%\Microsoft SQL Server\100\Setup Bootstrap\Release
3. 輸入:setup.exe /ACTION =uninstall /FEATURES = Feature_List /INSTANCENAME = MSSQLSERVER
若要安裝,請參考→SQL2008R2完整安裝攻略
註:聽說未到期前可正常利用維護升級方式將其改為正版,但過期後只能利用重灌的方式,但是我也不能測試,我想如果你看到這篇文章,那你也不能測試了。如果你設定還記得了話,重灌到系統恢復只要30-40分。good luck
2011年9月28日 星期三
asp.net_openxml 換行標籤
前幾天發了一篇『利用open xml於word套版列印』,同事在使用時碰到一個問題:雖然資料庫有記載換行字元,但於word檢視時,卻沒有換行的效果。
之前曾經發過一篇『textbox→SQL→Label(換行符號處理)』來處理換行的問題,原理是找到換行字元將其置換成HTML的換行標籤(br標籤)
所以相同的道理是,在open xml想要做出換行的效果,就必須找到open xml的換行標籤。
答案:『<w:br />』
之前曾經發過一篇『textbox→SQL→Label(換行符號處理)』來處理換行的問題,原理是找到換行字元將其置換成HTML的換行標籤(br標籤)
所以相同的道理是,在open xml想要做出換行的效果,就必須找到open xml的換行標籤。
答案:『<w:br />』
string changeline = "<w:br />";
ValueString.Replace("\r\n", changeline));
2011年9月27日 星期二
Android學習_getWritableDatabase called recursively.
如果有在Android裡面使用SQLite,都會知道要複寫兩個方法,onCreate與onUpgrade,若是希望程式安裝時,資料庫裡面就已經有一些預設值,那麼我們就會想在onCreate裡面insert需要的資料;但這時很有可能會碰到一個錯誤訊息:java.lang.IllegalStateException: getWritableDatabase called recursively.。
原因:在onCreate若要取得SQLiteDatabase的不能使用getWritableDatabase的方法。
解法:觀察onCreate方法中,已經預設傳入SQLiteDatabase,所以在onCreate方法內可以直接使用,而不需要另外取得。
原本的Insert
於onCreate中使用的Insert
差別也就只在於SQLiteDatabase的取得。
原因:在onCreate若要取得SQLiteDatabase的不能使用getWritableDatabase的方法。
解法:觀察onCreate方法中,已經預設傳入SQLiteDatabase,所以在onCreate方法內可以直接使用,而不需要另外取得。
原本的Insert
public long insert(String table, String fields[], String values[])
{
SQLiteDatabase db = this.getWritableDatabase();
/* 將新增的值放入ContentValues */
ContentValues cv = new ContentValues();
for (int i = 0; i < fields.length; i++)
{
cv.put(fields[i], values[i]);
}
return db.insert(table, null, cv);
}
於onCreate中使用的Insert
public long insertDefault(SQLiteDatabase db,String table, String fields[], String values[])
{
ContentValues cv = new ContentValues();
for (int i = 0; i < fields.length; i++)
{
cv.put(fields[i], values[i]);
}
return db.insert(table, null, cv);
}
差別也就只在於SQLiteDatabase的取得。
Android學習_uri轉byte
在進行圖片的處理時,常常會遇到需要將手機內圖片(照片)轉成byte再傳出去(例如facebook的圖片上傳)。
步驟:
1. 將uri傳成inputstream
*20120604補充第一步驟程式碼:
2. 將inputstream轉成byte[]
接著,就可以將byte[]擺放傳入自己或別人的方法中,完成圖片的傳遞。
步驟:
1. 將uri傳成inputstream
ContentResolver resolver = getContentResolver();
resolver.openInputStream(uri);
*20120604補充第一步驟程式碼:
byte[] buffer;
ContentResolver resolver = getContentResolver();
buffer = readStream(resolver.openInputStream(Uri.parse(Picuri.toString())));
2. 將inputstream轉成byte[]
public static byte[] readStream(InputStream inStream) throws Exception {
byte[] buffer = new byte[1024];
int len = -1;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return data;
}
接著,就可以將byte[]擺放傳入自己或別人的方法中,完成圖片的傳遞。
2011年9月24日 星期六
Android小品_Ola Account
說也奇怪,最近回家打開電視,不是理財節目就是政論節目,『夢想街57號』是我比較愛'聽'的節目,裡面的阿娟將許多理財投資觀念用很淺顯易懂的方式闡述,但其實講來講去最根本的當然就是'開源節流';說到開源大家都有很多很多的方式,可以買股票、買基金、談加薪、換工作、兼小差、嫁個有錢人,但節流第一步則不是學會怎麼節省,而是先瞭解自己的現金流,所謂『瞭解現金流』其實也就是記帳。
遙想當年我還在宜蘭打籃球,研究室打電動(?)的時候,不管是用小本子或是excel,都還有一個很好的記帳習慣,但真正開始工作以後,反而停止了這個好習慣;前一陣子在很多廣告牆與公車上有一句曝光率很高的廣告詞『未來的你會感謝現在的你』,所以也讓29.8歲的我想到另一個廣告詞『30歲了,還在這裡做什麼?』。
總之,開源還要想辦法,節流總是可以做了,那記帳就是第一步!
那身為一個半路出家、底子不穩、腦袋很小、很想在生活中使用自己程式的工程師,我馬上就決定要寫自己的記帳程式。
-----------------------------------------------------------------------------
但是記帳本說:你太小看我了;所以剛開始寫沒多久就後悔了,記帳程式可以擴充的範圍實在太廣,想要寫出一個"完善的",似乎也不是一時半刻可以完成,身為一個沒什麼毅力跟腦力的29.8歲窮鬼,實在是不想等到40歲才開始記帳,所以在時程不變、人力不變、品質也不想變的情況下,只好降低程式規模,做人要果決,就在資料庫ola、程式ola、介面ola與計畫經理ola四個人討論的結果,決定做出一個世界超級無敵陽春的......記支出本。
需要的功能完全針對客戶ola的需求:
1. 要可以記下項目跟金錢。
2. 可以修改記下的內容。
3. 一進程式就可以看到本月與本日金額
4. 可以查詢歷史資料
5. 含有一些簡單的統計
所以,登~登~登~登!
1. 一進到畫面有本月份的食、衣、住、行、育、樂、其他的金額統計,接著是本日的各項花費列表,右下角是本月與本日花費的總計。
2. 按下『又花錢』按鈕會跳出輸入對話框,可以輸入項目、金額、日期、時間跟備註。
3. 點選列表會跳出修改的對話框,可以對所有項目進行修改。
4. 長按列表項目會跳出刪除項目的對話框。
5. 點選手機選單按鍵,會跳出歷史與匯出/入的項目。
6. 點選『歷史』項目,會跳到歷史資料頁面。上方為年、月、日的切換選單,若選年則會列出該年總花費、接著是顯示各項目花費、再下面是以月區分的總計;右下角可以切換查詢時間點,若是輸入2011年9月24日,則按下"年"時出現2011年總計、按下"月"出現2011年9月總計、按下"日"則出現該日期各細項。
7. 按下"月"顯示該月各天總計。(點選列表各天可切換到該天項目列表)
8. 按下"日"顯示該天各細項。(點選細項可進入修改頁面)
9. 因為一邊寫一邊用,怕會不小心把資料刪掉,所以增加匯出/入功能。(匯出JSON格式)
最後,許個願,希望這次記帳不要停下來!加油!
遙想當年我還在宜蘭打籃球,研究室打電動(?)的時候,不管是用小本子或是excel,都還有一個很好的記帳習慣,但真正開始工作以後,反而停止了這個好習慣;前一陣子在很多廣告牆與公車上有一句曝光率很高的廣告詞『未來的你會感謝現在的你』,所以也讓29.8歲的我想到另一個廣告詞『30歲了,還在這裡做什麼?』。
總之,開源還要想辦法,節流總是可以做了,那記帳就是第一步!
那身為一個半路出家、底子不穩、腦袋很小、很想在生活中使用自己程式的工程師,我馬上就決定要寫自己的記帳程式。
-----------------------------------------------------------------------------
但是記帳本說:你太小看我了;所以剛開始寫沒多久就後悔了,記帳程式可以擴充的範圍實在太廣,想要寫出一個"完善的",似乎也不是一時半刻可以完成,身為一個沒什麼毅力跟腦力的29.8歲窮鬼,實在是不想等到40歲才開始記帳,所以在時程不變、人力不變、品質也不想變的情況下,只好降低程式規模,做人要果決,就在資料庫ola、程式ola、介面ola與計畫經理ola四個人討論的結果,決定做出一個世界超級無敵陽春的......記支出本。
需要的功能完全針對客戶ola的需求:
1. 要可以記下項目跟金錢。
2. 可以修改記下的內容。
3. 一進程式就可以看到本月與本日金額
4. 可以查詢歷史資料
5. 含有一些簡單的統計
所以,登~登~登~登!
1. 一進到畫面有本月份的食、衣、住、行、育、樂、其他的金額統計,接著是本日的各項花費列表,右下角是本月與本日花費的總計。
2. 按下『又花錢』按鈕會跳出輸入對話框,可以輸入項目、金額、日期、時間跟備註。
3. 點選列表會跳出修改的對話框,可以對所有項目進行修改。
4. 長按列表項目會跳出刪除項目的對話框。
5. 點選手機選單按鍵,會跳出歷史與匯出/入的項目。
6. 點選『歷史』項目,會跳到歷史資料頁面。上方為年、月、日的切換選單,若選年則會列出該年總花費、接著是顯示各項目花費、再下面是以月區分的總計;右下角可以切換查詢時間點,若是輸入2011年9月24日,則按下"年"時出現2011年總計、按下"月"出現2011年9月總計、按下"日"則出現該日期各細項。
7. 按下"月"顯示該月各天總計。(點選列表各天可切換到該天項目列表)
8. 按下"日"顯示該天各細項。(點選細項可進入修改頁面)
9. 因為一邊寫一邊用,怕會不小心把資料刪掉,所以增加匯出/入功能。(匯出JSON格式)
最後,許個願,希望這次記帳不要停下來!加油!
2011年9月23日 星期五
asp.net_利用open xml於word套版列印
在每一個單位,每一個處室,不管是公家還是私人,每一個有人在的地方,通常都會有一個需求:我要列印資料。
這時候我們應該可能也許,就會把資料匯成xls、doc、txt、csv,並且跟他說:印吧!
接著,他會說:我要按照我的格式(中式表格:A儲存格跟B左右合併、C跟D上下合併、標題字大之類的),那麼我們就會依照這個格式做一個相同的html檔案,把從資料庫撈出來的資料放到該放的位置,接著說:棒吧!按照你格式的表格。
接著,某些"精實的"外星人就會說:你這....感覺不是word,就是跟我原本的表格長得不太一樣,不能做一樣嗎?這樣我很困擾耶。
好!一般如我的工程師這時候就會放空,然後說服他:你看word跟我的html用word開根本就一模一樣、一模一樣、一模一樣(晃晃晃)
總之,以往在處理類似這樣的功能,都需要花費很大的力氣才能完成一張,有時候表格很複雜的時候更是讓人想要見見原本設計表格的人(?),最近同事又遇到類似的狀況,需求的單位"一定要"作出"一模一樣"的表格列印功能。
最後同事給我三個關鍵字:有空嗎、黑暗執行緒、套版列印跟一個網址。
----------------------------------------------------------------
依照黑大的相關文章,也試做了一下整個流程,我個人是覺得效果非常的好,好到我覺得我以前是呆子。
觀念:office2007以後使用標準的openxml作為檔案的定義方式,所以我們可以藉由修改xml的方式來置換已經於word裡面的文字。所以我們可以做好樣板→置換文字→下載檔案的方式來完成套版列印的功能。
流程:
1. 下載需要的sdk(Open XML SDK 2.0 for Microsoft Office)
進到下載頁面以後,會看到兩個可以下載的項目(OpenXMLSDKTool.msi與OpenXMLSDKv2.msi),OpenXMLSDKv2是程式開發所需要使用的SDK,OpenXMLSDKTool則是觀看openxml的工具。
2. 安裝剛剛所下載的兩個msi檔案。
3. 開啟一個專案檔(asp.net),並將需要的dll複製到bin資料夾。
A. DocumentFormat.OpenXml.dll:這個檔案為OpenXMLSDKv2所附的,位置在C:\Program Files (x86)\Open XML SDK\V2.0\lib。
B. WindowsBase.dll:這個為framework原本就有的檔案,位置在C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0。
4. 準備一個docx的樣版(上面有提到office2007才更改為openxml的方式,所以該方法僅適用於docx檔案)。
這個樣板的範例是模仿黑大的方式,需要置換的內容利用"[$$]"包起來,但實際上這是一個提供程式辨別的代號,如果想要使用別種符號定義也可以。
5. 撰寫程式碼
A. 將要放入樣板的資料以Dictionary包裝,比如說我要放入四個資訊:
B. 準備兩個路徑(一個為樣板的原始路徑、另一個為填寫內容後檔案的路徑)
C.置換openxml的程式碼(參考黑大文章)
整個道理就是程式在MakeDocx先複製一份樣板檔案,然後讀取WordprocessingDocument的內容,並且交給parse的函式;而在parse函式內將該內容以StreamReader.ReadToEnd()的方式讀取出來,並且去尋找出文件內有[$$]的地方,置換成我們預先儲存在Dictionary的內容。
所以上面[$Name$]的部分就會被置換成ola。
-----------------------------------------------------
依照上述的步驟我們就可以很方便的先處理樣板的docx,並且用置換字串的方式動態改變內容,再將完成的檔案讓使用者下載,來完成一個"完全一模一樣格式"的匯出或列印功能。
注意:在實作過程中,有可能會發生文字無法置換的情況,原因是在進行樣板docx設計時,有可能因為我們的操作,而讓辨識的內容(指文中的[$$])間存在了很多不應該出現標籤,而導致程式無法辨識,若要確認是否因為該原因可以利用Open XML SDK 2.0 Productivity Tool(OpenXMLSDKTool.msi安裝後)來開啟docx檔,即可觀看openxml的內容,用以確認。
這時候我們應該可能也許,就會把資料匯成xls、doc、txt、csv,並且跟他說:印吧!
接著,他會說:我要按照我的格式(中式表格:A儲存格跟B左右合併、C跟D上下合併、標題字大之類的),那麼我們就會依照這個格式做一個相同的html檔案,把從資料庫撈出來的資料放到該放的位置,接著說:棒吧!按照你格式的表格。
接著,某些"精實的"外星人就會說:你這....感覺不是word,就是跟我原本的表格長得不太一樣,不能做一樣嗎?這樣我很困擾耶。
好!一般如我的工程師這時候就會放空,然後說服他:你看word跟我的html用word開根本就一模一樣、一模一樣、一模一樣(晃晃晃)
總之,以往在處理類似這樣的功能,都需要花費很大的力氣才能完成一張,有時候表格很複雜的時候更是讓人想要見見原本設計表格的人(?),最近同事又遇到類似的狀況,需求的單位"一定要"作出"一模一樣"的表格列印功能。
最後同事給我三個關鍵字:有空嗎、黑暗執行緒、套版列印跟一個網址。
----------------------------------------------------------------
依照黑大的相關文章,也試做了一下整個流程,我個人是覺得效果非常的好,好到我覺得我以前是呆子。
觀念:office2007以後使用標準的openxml作為檔案的定義方式,所以我們可以藉由修改xml的方式來置換已經於word裡面的文字。所以我們可以做好樣板→置換文字→下載檔案的方式來完成套版列印的功能。
流程:
1. 下載需要的sdk(Open XML SDK 2.0 for Microsoft Office)
進到下載頁面以後,會看到兩個可以下載的項目(OpenXMLSDKTool.msi與OpenXMLSDKv2.msi),OpenXMLSDKv2是程式開發所需要使用的SDK,OpenXMLSDKTool則是觀看openxml的工具。
2. 安裝剛剛所下載的兩個msi檔案。
3. 開啟一個專案檔(asp.net),並將需要的dll複製到bin資料夾。
A. DocumentFormat.OpenXml.dll:這個檔案為OpenXMLSDKv2所附的,位置在C:\Program Files (x86)\Open XML SDK\V2.0\lib。
B. WindowsBase.dll:這個為framework原本就有的檔案,位置在C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0。
4. 準備一個docx的樣版(上面有提到office2007才更改為openxml的方式,所以該方法僅適用於docx檔案)。
這個樣板的範例是模仿黑大的方式,需要置換的內容利用"[$$]"包起來,但實際上這是一個提供程式辨別的代號,如果想要使用別種符號定義也可以。
5. 撰寫程式碼
A. 將要放入樣板的資料以Dictionary包裝,比如說我要放入四個資訊:
Dictionary<string, string> dataObject = new Dictionary<string, string>();
dataObject.Add("Name","Ola");
dataObject.Add("Tel", "123");
dataObject.Add("Address", "台北市");
dataObject.Add("Mail", "wangshifu1220@gmail.com");
B. 準備兩個路徑(一個為樣板的原始路徑、另一個為填寫內容後檔案的路徑)
C.置換openxml的程式碼(參考黑大文章)
public static byte[] MakeDocx(string tempFile, string templateFile, Dictionary dct)
{
File.Copy(templateFile, tempFile);
using (WordprocessingDocument wd = WordprocessingDocument.Open(tempFile, true))
{ parse(wd.MainDocumentPart, dct);}
}
private static void parse(OpenXmlPart oxp, Dictionary<string, string> dct)
{
string xmlString = null;
using (StreamReader sr = new StreamReader(oxp.GetStream()))
{ xmlString = sr.ReadToEnd(); }
foreach (string key in dct.Keys)
{ xmlString = xmlString.Replace("[$" + key + "$]", dct[key]);}
using (StreamWriter sw = new StreamWriter(oxp.GetStream(FileMode.Create)))
{ sw.Write(xmlString); }
}
整個道理就是程式在MakeDocx先複製一份樣板檔案,然後讀取WordprocessingDocument的內容,並且交給parse的函式;而在parse函式內將該內容以StreamReader.ReadToEnd()的方式讀取出來,並且去尋找出文件內有[$$]的地方,置換成我們預先儲存在Dictionary的內容。
所以上面[$Name$]的部分就會被置換成ola。
-----------------------------------------------------
依照上述的步驟我們就可以很方便的先處理樣板的docx,並且用置換字串的方式動態改變內容,再將完成的檔案讓使用者下載,來完成一個"完全一模一樣格式"的匯出或列印功能。
注意:在實作過程中,有可能會發生文字無法置換的情況,原因是在進行樣板docx設計時,有可能因為我們的操作,而讓辨識的內容(指文中的[$$])間存在了很多不應該出現標籤,而導致程式無法辨識,若要確認是否因為該原因可以利用Open XML SDK 2.0 Productivity Tool(OpenXMLSDKTool.msi安裝後)來開啟docx檔,即可觀看openxml的內容,用以確認。
2011年9月22日 星期四
Android學習_使用facebook sdk_Part3上傳照片
1. 完成開發facebook相關APP的準備工作
2. 將"文字訊息"貼上塗鴉牆
大部分開發者下一步就是希望可以上傳圖片。
可以先看一下之前傳文字到塗鴉牆的語法:
第一個參數是要傳到的位置(/me/feed代表塗鴉牆)
第二個參數是傳遞的內容(使用putString方法放入)
第三個參數是傳遞的方法
好,由這邊可以知道要上傳圖片勢必要先找到放置的位置與傳遞的內容;而圖片的放置位置對於facebook來說就是"相簿",而在網路上傳遞圖片的內容當然就是Stream一類。
所以我們要找到上傳的位置,與將圖片塞入params(Bundle)的方法:
1. 上傳位置:如果你去開啟facebook的相簿,可以發現每一本相簿都有一個唯一的ID,而在facebook sdk裡面也當然就是以這個ID作為辨識的方式,所以位置是"/相簿ID/photos"。(相簿ID為15碼)
2. 傳遞內容:在Bundle裡面可以利用putByteArray將類似圖片的內容傳遞出去,所以不管我們要上傳的圖片來自於哪裡,都必須先將該圖片轉為byte[]的格式,再利用params.putByteArray("picture", buffer);的語法加入。
有了以上的各項資訊以後,我們還是不能把圖片正確的上傳,這是因為若是要上傳資訊到facebook就必須要有足夠的權限(當時貼上塗鴉牆的權限為publish_stream),而上傳圖片的權限為user_photos。
程式碼:
1. 加入適當的權限
2. 上傳圖片
*注意:文字訊息規定於putString時,第一個參數帶"message";而圖片使用putByteArray的時候第一個參數帶"picture"。
*提醒:圖片不管是手機內的資源(uri),即時畫出來的圖片(Bitmap)或是一個Stream類的東西,都必須先轉換成byte[],才符合上傳的的格式。
*將uri轉byte[]請參考
如果因為本篇完成上傳圖片,請留:WOW!有圖有真相。
2. 將"文字訊息"貼上塗鴉牆
大部分開發者下一步就是希望可以上傳圖片。
可以先看一下之前傳文字到塗鴉牆的語法:
facebook.request("/me/feed", params, "POST");
第一個參數是要傳到的位置(/me/feed代表塗鴉牆)
第二個參數是傳遞的內容(使用putString方法放入)
第三個參數是傳遞的方法
好,由這邊可以知道要上傳圖片勢必要先找到放置的位置與傳遞的內容;而圖片的放置位置對於facebook來說就是"相簿",而在網路上傳遞圖片的內容當然就是Stream一類。
所以我們要找到上傳的位置,與將圖片塞入params(Bundle)的方法:
1. 上傳位置:如果你去開啟facebook的相簿,可以發現每一本相簿都有一個唯一的ID,而在facebook sdk裡面也當然就是以這個ID作為辨識的方式,所以位置是"/相簿ID/photos"。(相簿ID為15碼)
2. 傳遞內容:在Bundle裡面可以利用putByteArray將類似圖片的內容傳遞出去,所以不管我們要上傳的圖片來自於哪裡,都必須先將該圖片轉為byte[]的格式,再利用params.putByteArray("picture", buffer);的語法加入。
有了以上的各項資訊以後,我們還是不能把圖片正確的上傳,這是因為若是要上傳資訊到facebook就必須要有足夠的權限(當時貼上塗鴉牆的權限為publish_stream),而上傳圖片的權限為user_photos。
程式碼:
1. 加入適當的權限
private void facebookSetting(){
facebook.authorize(this, new String[] { "email","publish_stream", "read_stream","user_photos" },
new DialogListener() {
@Override
public void onComplete(Bundle values) {}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
}
);
}
2. 上傳圖片
public void postToWall_photos(String AlbumID ,String message , byte[] buffer) {
Bundle params = new Bundle();
params.putString("message", message);
try {
params.putByteArray("picture", buffer);
} catch (Exception e) {
e.printStackTrace();
}
try {
facebook.request("/" + AlbumID + "/photos", params, "POST");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
*注意:文字訊息規定於putString時,第一個參數帶"message";而圖片使用putByteArray的時候第一個參數帶"picture"。
*提醒:圖片不管是手機內的資源(uri),即時畫出來的圖片(Bitmap)或是一個Stream類的東西,都必須先轉換成byte[],才符合上傳的的格式。
*將uri轉byte[]請參考
如果因為本篇完成上傳圖片,請留:WOW!有圖有真相。
2011年9月15日 星期四
Android學習_GridView的使用
在使用者介面的安排上,我們常常會使用ListView來展示多組資料,就像下圖的感覺:
但有時候,我們要呈現的項目並不是這麼的寬,可能只是一些簡單的文字或是小圖片,而我們希望他們以格子的方式排列,這時候通常就會想到GridView這類的控制項。
之前操作ListView時,通常都會先定義一個表示"每一列"的layout檔案,來產生出不同風格的列表樣式;在GridView也是一樣,我們可以先定義一個layout來表示"每一格"的樣式:
上面的程式碼表示呈現出GridView中的每一格都有兩個TextView可以放值,而且兩個TextView是呈現垂直排列。
除了定義自己的layout以外,我們必須在要呈現出GridView的Activity的layout上擺上一個GridView標籤:
有幾個GridView獨特的變數紀錄一下
1. android:numColumns:表示每一橫列要展示的個數(若設為auto_fit,似乎就是一行三個)
2. android:verticalSpacing:行跟行中間的間距
3. android:horizontalSpacing:列跟列中間的間距
4. android:columnWidth:每一格的寬度
5. android:stretchMode:格子拉伸模式(none:不要伸縮、spacingWidth:拉伸每列的間距、columnWidth:拉伸每格、spacingWidthUniform:均勻拉伸間距)
呈現出來的效果就像圖中紅框部分:
而要將資料放入的方法,還是應先將資料放入Adapter,再利用setAdapter的方法將資料置入。
可以參考以下三篇:
一維陣列:Android學習_ArrayAdapter的使用
自行處理的二維陣列:Android學習_SimpleAdapter的使用
Cursor的處理:Android學習_SimpleCursorAdapter的使用
但有時候,我們要呈現的項目並不是這麼的寬,可能只是一些簡單的文字或是小圖片,而我們希望他們以格子的方式排列,這時候通常就會想到GridView這類的控制項。
之前操作ListView時,通常都會先定義一個表示"每一列"的layout檔案,來產生出不同風格的列表樣式;在GridView也是一樣,我們可以先定義一個layout來表示"每一格"的樣式:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/lab_MItemType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
/>
<TextView
android:id="@+id/lab_MoneyBroupType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
/>
</LinearLayout>
上面的程式碼表示呈現出GridView中的每一格都有兩個TextView可以放值,而且兩個TextView是呈現垂直排列。
除了定義自己的layout以外,我們必須在要呈現出GridView的Activity的layout上擺上一個GridView標籤:
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview_type"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numColumns="7"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:columnWidth="90dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
有幾個GridView獨特的變數紀錄一下
1. android:numColumns:表示每一橫列要展示的個數(若設為auto_fit,似乎就是一行三個)
2. android:verticalSpacing:行跟行中間的間距
3. android:horizontalSpacing:列跟列中間的間距
4. android:columnWidth:每一格的寬度
5. android:stretchMode:格子拉伸模式(none:不要伸縮、spacingWidth:拉伸每列的間距、columnWidth:拉伸每格、spacingWidthUniform:均勻拉伸間距)
呈現出來的效果就像圖中紅框部分:
而要將資料放入的方法,還是應先將資料放入Adapter,再利用setAdapter的方法將資料置入。
可以參考以下三篇:
一維陣列:Android學習_ArrayAdapter的使用
自行處理的二維陣列:Android學習_SimpleAdapter的使用
Cursor的處理:Android學習_SimpleCursorAdapter的使用
Android學習_SimpleCursorAdapter的使用
之前有將一個已經組好的list倒入SimpleAdapter顯示,但我們使用SQLite時,若已經取得了一個Cursor,如果還要以上述的方式重新整理成一個list,就顯得有些不方便,所以我們需要的是另一個繼承於BaseAdapter的SimpleCursorAdapter。
首先,觀察一下SimpleCursorAdapter所需要的變數,共有五個:
1. Content(content)
2. Layout(int)
3. Cursor(Cursor)
4. from(String[])
5. to(int[])
由參數大致上就可以了解用法了,與其他的Adapter相同,我們可以先準備一個定義好的layout,並且將當中諸如textview等物件都放置好;並且以SQLite的Select方式獲得一個Cursor,最後將對應要顯示的內容以一個字串陣列的方式輸入from變數,程式碼如下:
1. 定義一個Layout(Android xml檔案)
2. Java程式碼:
說明:
1. R.layout.listview_mitem為剛剛定義的layout
2. OnedayCursor為查詢出來的Cursor
3. new String[] { "_id","item","money","datevlaue","type" }為要顯示的欄位,必須要對應OnedayCursor查詢時所定義的欄位名稱。
4. new int[] {
R.id.listTextView1,R.id.listTextView2,R.id.listTextView3,R.id.listTextView4 ,R.id.listTextView_t}最後一個則是指上述欄位應擺放到的物件為何,也就是layout裡面放的物件。
如此,我們就可以很輕鬆的將Cursor的內容,利用ListView展示出來。
所以不管是
一維陣列:Android學習_ArrayAdapter的使用
自行處理的二維陣列:Android學習_SimpleAdapter的使用
Cursor的處理:Android學習_SimpleCursorAdapter的使用(也就是本篇)
我們都可以將各項資訊放置到希望的位置。
首先,觀察一下SimpleCursorAdapter所需要的變數,共有五個:
1. Content(content)
2. Layout(int)
3. Cursor(Cursor)
4. from(String[])
5. to(int[])
由參數大致上就可以了解用法了,與其他的Adapter相同,我們可以先準備一個定義好的layout,並且將當中諸如textview等物件都放置好;並且以SQLite的Select方式獲得一個Cursor,最後將對應要顯示的內容以一個字串陣列的方式輸入from變數,程式碼如下:
1. 定義一個Layout(Android xml檔案)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<CheckedTextView android:id="@+id/listTextView1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="2px"
android:layout_height="2px"
android:textColor="@drawable/green"
android:visibility="invisible"
>
</CheckedTextView>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<CheckedTextView android:id="@+id/listTextView_t"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/Orange"
android:textSize="40px"
>
</CheckedTextView>
<CheckedTextView android:id="@+id/listTextView2"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/green"
android:textSize="40px"
>
</CheckedTextView>
</LinearLayout>
<CheckedTextView android:id="@+id/listTextView3"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/gray"
android:textSize="25px"
>
</CheckedTextView>
<CheckedTextView android:id="@+id/listTextView4"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/gray"
android:layout_marginRight="10px"
android:textSize="20px"
>
</CheckedTextView>
</LinearLayout>
</LinearLayout>
2. Java程式碼:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listview_mitem,
OnedayCursor, new String[] { "_id","item","money","datevlaue","type" }, new int[] {
R.id.listTextView1,R.id.listTextView2,R.id.listTextView3,R.id.listTextView4 ,R.id.listTextView_t});
RecordListView.setAdapter(adapter);
說明:
1. R.layout.listview_mitem為剛剛定義的layout
2. OnedayCursor為查詢出來的Cursor
3. new String[] { "_id","item","money","datevlaue","type" }為要顯示的欄位,必須要對應OnedayCursor查詢時所定義的欄位名稱。
4. new int[] {
R.id.listTextView1,R.id.listTextView2,R.id.listTextView3,R.id.listTextView4 ,R.id.listTextView_t}最後一個則是指上述欄位應擺放到的物件為何,也就是layout裡面放的物件。
如此,我們就可以很輕鬆的將Cursor的內容,利用ListView展示出來。
所以不管是
一維陣列:Android學習_ArrayAdapter的使用
自行處理的二維陣列:Android學習_SimpleAdapter的使用
Cursor的處理:Android學習_SimpleCursorAdapter的使用(也就是本篇)
我們都可以將各項資訊放置到希望的位置。