2013年6月28日 星期五

[android]特別企劃~垃圾車在哪裡,絕對難不倒你

某個月黑風高的夜裡
筆者因為錯過了家門口的垃圾車
拿著手機連上環保局,看著沒有支援手機板的網站
痛苦的查著只有地址的垃圾車班表
不熟悉的路名還要貼到google map去找
提著一包垃圾騎著歐兜賣
在不斷的等待與錯過中就這樣在路上折騰了好久
最後才將垃圾交給一台偶遇的垃圾車結束這一天的冒險

有鑑於此
我發願要把這一切簡單化
筆者跟java不熟,也從來沒寫過任何app
但我相信google威能,於是就開始訂定了我需要的api和資料

更新,1跟2的資料
以高雄市來說,現在可以直接下載到垃圾車的座標資訊
https://waste.ksepb.gov.tw/
使用上方便太多了
/*
1. 垃圾車地點、時間資料
萬事起頭難,我決定第一步先不碰java
先用自己熟悉的C#來準備好需要的資料
雖然是用熟悉的技術
但這個是讓我搞了最久的部分
http://abandoned.kbj.com.tw/waste/search <--垃圾車資料網站
自己摸著摸著挖出了用QueryString來列所有資料的方式
http://abandoned.kbj.com.tw/waste/search/0/0/0/0/0 這是我最後找到的
最後一個參數是決定開始顯示的index
而每次固定顯示15筆,於是只能for loop了
這個處理資料的過程就不贅述了
基本上就是用HttpWebRequest抓畫面中的表格分析資料塞進sqlite
而各地環保局的網站各自成一格
若要將這功能發揚光大至全台灣恐怕花最多時間的都是在蒐集資料這工作了

2. 補足定位點資料
現在有了地址我打算連同座標也整理好才放進app
app做的事情只有讀出座標判斷距離顯示在地圖上
這邊使用的是google map的api
var url = String.Format("http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address={0}", address);
address帶的當然就是地址了
當中xml是我選比較習慣的格式,也可以用json的格式取得回傳結果
另外sensor這個參數一定要帶,不然查不出來
取出的xml分析的動作用XmlDocument就可以搞定了
格式及用法可參考 https://developers.google.com/maps/documentation/geocoding/?hl=zh-tw
另外google map這個api有每天2500次Query的限制
每秒內的Query次數也有限制
因此我為了補足這些資料洗了好幾次ip
*/


3. 資料內嵌進app
準備好的資料要送進app內
這邊我參考的是這篇
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
作法完全照抄網頁上的方式

4. Google Maps Android API
基本上這個app要達到的目的就是在地圖上顯示自己的座標和附近的垃圾車座標
而我相信google map會是一個好選擇
設定及使用方式參考了這個
http://cheng-min-i-taiwan.blogspot.tw/2013/04/google-maps-android-api-v2-android.html
溫馨小提醒
在Google API Console要打開的是Google Maps Android API v2不是Google Maps API喔
筆者由於眼殘在這邊卡了一下

5. 取得定位點
GPS定位這個只是個小技巧
網路上的資源多如牛毛
但大部分都是做個Class來implements LocationListener
我是懶人所以我則是參考了這篇
http://zhuyonghui116.blog.hexun.com.tw/43948361_d.html
另外發現在requestLocationUpdates後他就隨著周期卯起來一直定了
然而我只有在開啟app和按下更新時想去跑一次
所以還有參考了這篇
http://hp.dewen.org/?p=576

結合以上的東西,這個app大致上算完成了
剩下的就是換個美美的圖再把exception修一修
畢竟是個不熟悉的開發工具跟語言
整個過程其實也花了不少時間
但這也證明了一件事
你可以不會寫程式也可以不會用IDE
但你一定要會用google search

2012年9月4日 星期二

[VS]visual studio 2010 之 消失的scrollbar

雖然說vs2012都出了
不過小弟我最近才剛開始從vs2008轉到vs2010
題外話,雖然我的NB只是兩萬塊的便宜貨又沒有ssd
但i5開vs2010慢成這樣也著實令我驚訝

安裝完也是用了很久的telerik web元件之後
遇到了神秘的狀況,我的toolbox的scroll bar消失了
用滾輪也滾不動,下面還卡了好幾個東西選不到
試了一下子之後發現了這個神祕的現象
不囉嗦直接看影片
一直展開項目開到一定程度之後scroll bar就會消失
同時可以發現的是scroll bar的拉bar小到一個程度以後就不再縮小
看起來是個故意設定的行為
理由為何就要問問微軟囉

2012年8月9日 星期四

[windows]我的圖哩??

今天這一篇,實際上跟寫程式一點關係也沒有
只能算是一個windows設定的線上問題處理經驗分享

故事是這樣的
昨天早上接獲通報,我做的winform功能在某台電腦上都顯示不出圖片
"某台",一聽就覺得是電腦狀況造成的個案不太想理
不過進去以後發現了有趣的現象
不是所有圖都不見,也不是只有我的功能圖會不見
交叉比對了大家的功能內容之後發現一件事
消失的只有BackgroundImage,就是背景圖
這下子我開始對這問題產生興趣了
這是一個winform程式又不是web會有不同瀏覽器造成的靈異現象
究竟是怎樣的一個狀況可以造成這種情形呢
讓我們繼續看下去

一、修個案必經路程--重開機
很遺憾,這個嘗試完全沒有效果

二、換個帳號登入
同一台電腦其他User登入跑同一份程式居然是正常的
這種現象要嘛是權限要嘛是設定
把測試帳號開到power user的權限試試
遺憾,無效,往下一步發展

三、既然是圖片,應該是顯示設定吧(?)
不才小弟我就這樣在這個設定畫面卡了一個早上
翻過來又翻過去,把裡面每個設定值都玩了一次
依然無解

四、一切都只是巧合
窮途末路想到頭都痛起來的我
痴痴地對著控制台畫面發呆
這時很不巧的讓我看到了這一行字
Windows用了這麼多年,第一次覺得他的註解這麼重要
這時心想"是阿,會不會有盲人不想看到背景圖只想聽聲音?"
但我馬上覺得自己這個想法五告北七
即使如此,我還是點進去了
罷了,死馬當活馬醫試試看囉
進去協助工具選項->畫面
恩,沒什麼選擇性阿
游標就不用看了,高對比是啥?
應該只是讓他更明顯吧,不然勾掉看看囉
就在這時,一切的謎團全都解開了,圖全都回來了
但是,另一個謎團又出現了
究竟為什麼一個高對比會讓我的圖全都神隱呢???

這時我回到自己的電腦想再複製一次這個現象看看
我是Win7,win7的高對比藏在輕鬆存取中心裡面
點畫面中那個小項他很北七的開去控制台->外觀及個人化->個人化
要先點輕鬆存取中心->設定高對比
跟WinXP不同的,裡面有很多細項選擇
這邊就不一一提了
但其中有一個選項能夠完美的解釋這一切糾結的因果
我想不用做太多解釋了,各位客官直接看圖吧


2012年5月21日 星期一

[C#]幫我換行謝謝

今天不才小弟接到一個需求,是要將一串樂樂長的字串印到小小標籤上
每行22個字元,gotta be twenty two,twenty two lucky
不喇賽,換行而已嘛,很簡單,大家都會換行,不就是\n\r這麼簡單
不過後續來了,因為有人反應,單純用22這個幸運數字來抓index切字串的話
英文單字會被腰斬屍首分散兩地,所以必須判斷相連的英文字太長就去下一行
這功能用過word的人都知道這功能
就是這樣的感覺

遺憾的是標籤列印的程式不在我這邊
所以不能挑一個會自動換行的列印程式來印,我必須幫他換行
這時問題來了
我要去判斷連接的字和空白嗎?
字串裡包含中英文數字和特殊符號,分析這個會不會太"搞剛"?
因此我心頭一轉,C#的RichTextBox不是也會自動換行
如果宣告一個RichTextBox設定寬度讓他幫我換行不好嗎?
身為一個極力幫自己偷空閒時間的programmer,我想這是一個最快速的解法
以此方向為基準產生了第一次嘗試
        private void button1_Click(object sender, EventArgs e)
        {
            //要換行的字串
            string sourcetext = "Who knows what tomorrow brings In a world where few hearts survive All I know is the way I feel When it's real I keep it alive The road is long There are mountains in the way But we climb a  step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow Some hang on to used to be Live their lives looking behind When all we have is here and now All our lives Out there to find The road is long There are mountains in the way But we climb a step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow";
            //宣告一個RichTextBox來用
            RichTextBox rtbWrap = new RichTextBox();
            //設定自動換行
            rtbWrap.WordWrap = true;
            //設定寬度
            rtbWrap.Width = 140;
            //字串給rtb
            rtbWrap.Text = sourcetext;
            string resultstr = "";
            foreach (string line in rtbWrap.Lines)
            {
                resultstr += line + "\n";
            }
          MessageBox.Show(resultstr);
         }

看起來一切都很順利,但是出來的結果....
說好的換行呢?
遺憾的,rtbWrap.Lines裡面只有一個字串,也就是原本的樣子
這下可好,我要怎麼抓他的每一行呢?
不用怕,微軟有他貼心的一面RichTextBox中有這麼一個method
GetFirstCharIndexFromLine
這東西會根據你給他的行號回傳那一行第一個字的index
當沒有那一行的時候他則會回傳-1
有了這東西就一切好辦了啦
這是成果
        private void button1_Click(object sender, EventArgs e)
        {
            //要換行的字串
            string sourcetext = "Who knows what tomorrow brings In a world where few hearts survive All I know is the way I feel When it's real I keep it alive The road is long There are mountains in the way But we climb a  step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow Some hang on to used to be Live their lives looking behind When all we have is here and now All our lives Out there to find The road is long There are mountains in the way But we climb a step every day Love lift us up where we belong Where the eagles cry On a mountain high Love lift us up where we belong Far from the world we know Up where the clear winds blow";

            //宣告一個RichTextBox來用
            RichTextBox rtbWrap = new RichTextBox();
            //設定自動換行
            rtbWrap.WordWrap = true;
            //設定寬度
            rtbWrap.Width = 140;
            //字串給rtb
            rtbWrap.Text = sourcetext;

            string resultstr = "";
            int i = 0;
            while (rtbWrap.GetFirstCharIndexFromLine(i) != -1)
            {
                int thislineindex = rtbWrap.GetFirstCharIndexFromLine(i);
                int nextlineindex = rtbWrap.GetFirstCharIndexFromLine(i + 1);
                if (nextlineindex == -1)
                {
                    resultstr += sourcetext.Substring(thislineindex) + "\n";
                }
                else
                {
                    resultstr += sourcetext.Substring(thislineindex, nextlineindex - thislineindex) + "\n";
                }
                i++;
            }

            MessageBox.Show(resultstr);
        }

就是這樣
換行的標準取決於RichTextBox的寬度,寫活一點的話可以隨著紙張大小去做調整
各位請自行運用