今天下午突然接到一通電話,接起電話後,對方就馬上說話了.


對方 : 大雄啊,他們已經過去囉.


我 : (吔,對方是女生,打錯電話了)誰過來了?


對方 : 就是那個 XXX啊,他現在就過去了.


我 : 那技安呢?


對方 : 那來的技安?


我 : 你不是宜靜嗎?


對方 : 不是啊,你是?


我 : 我不是大雄,我是多拉A夢啊.


對方 : .........不好意思,打錯電話了.


 


一個悶熱的下午,耍玩冷還是不能降溫.....熱啊.....

jeffyeh 發表在 痞客邦 留言(0) 人氣()

  最近跟某位老闆在討論公司資料備份的事情,過去一年多以來,一直有在做遠端備份,將ERP的資料庫備份至第三地,直到最近他突然問了MIS一句,你的遠端備份都是在備份什麼? MIS就答說ERP的資料庫. 可是沒料到老闆的反應,怎麼會是備份那個?怎麼不是備份公司FTP Server上的檔案? ERP系統又不重要,打打單而已啊,如果出問題,再請他們去重建就好了,但我們FTP上的檔案更重要,如果不見就沒了.


  MIS聽到後,有點無言(畢竟這也是前手交待下來或是上級說的),然而FTP上的檔案可是有好幾百G的資料,很多東西根本就是應用程式,不需要特別備份,因為那些都有光碟了,如果要備到遠端去,那個資料量很嚇人,要花不少錢去買那個空間.所以就跟老闆討論起成本及備份上的困難等,但老闆根本就聽不下去.


  我是覺得FTP的備份問題是還好,依然可以解決,只是讓我感覺到比較驚訝的,反而是該老闆竟然認為ERP的資料備份不重要?覺得公司一線人員可以馬上重建這些資料回來?為此,我花了一段時間在解說ERP備份的重要性,也不是三兩天就可以重建回來,如果資料不見,這段時間你的公司要用什麼樣的工具去維持公司營運,而那些資料除了在ERP系統上,是否在那還可以有系統的找到?在現有的有限人力資源下,如果又加派人員去重建資料,那麼正常的工作要怎麼辨?最後老闆才知道它的重要性.


  其實該老闆會說這句話,主要是因為他從來不操作這套系統,他要資料時,會請人員準備給他,看的也是最終的報表檔案,也不是透過ERP系統去看,所以一直覺得它沒什麼,希望這次之後,他就不會再認為ERP的備份不重要,不要那天真的發生問題,資料庫要重建,才知道備份的重要性.

jeffyeh 發表在 痞客邦 留言(0) 人氣()

  或許有些人有跟我一樣的經驗,接手前人的程式,有些還是更前面交接下來的,代代相傳,如果幸運的話,有文件又有原始碼,好一點的話,還有原始碼,慘的就是連原始碼也沒有,如果程式沒有要異動,那就還好,可是那天突然要去動到它或與它溝通時,那還真的是一個頭兩個大,不知道它裡面到底做了什麼,要傳什麼進去,如果要異動要內部的流程判斷,那還真是無法著手,如果能看到裡面的寫法,不知道有多好.


  小弟是有找到一個不錯用的工具Reflector,它支援的語言還不少有IL,C#,VB,Delphi,MC++,Chrome,各版的.Net Framework也支援,執行後的面畫如下 :



開啟一個用vs2005開發的視窗應用程式



點取左邊的樹狀圖,就可以在右邊的視窗帶出程式碼內容囉


 


其中還有一些不錯的工能,像Analyzer,可以看到這個類別被那些程式引用到,或是直接點取右邊視窗的類別,就會自動跳到該類別去, 有需要的人,自己玩看看吧. 希望網友是用在正途上.


 下載點 : Reflector

jeffyeh 發表在 痞客邦 留言(0) 人氣()

  工作3年多了,即將在這個月底劃下終點,走向另個不同的職場,最近陸陸續續的將先前的資料整理出來,準備將手頭上的工作交接給另一位同仁,而在這交接的過程中,有句話卻讓我的心中有點不太好受,怎麼會說我一直沒有教過你什麼,我不是很想特意去指出那件事情就是我教你的,當我指出我在給你與另外一位工程師在會議室上課時,你才哦的一聲,那個忘記了.


  記得我剛到公司時,什麼都不知道,進來前是學VB,進公司卻是用C#...一切都還在熟悉狀況的時候,帶我的資深工程師在月底就離職了,扣掉假期,大概就只有10多天的時間在帶我,在他離開後,原本以為還有其他同仁可以問,結果每位同仁都只給我一句 : "我不懂,去問合作廠商",主管對我的問題也沒有答案. 沒辦法,前人沒留下什麼文件,而且這些文件只是跟那位工程師寫的兩三隻作業有關,其它整個ERP系統的文件都沒有,在內部求問無門的情況下,改向合作廠商詢問,可是情況也沒有好到那去,幾乎都是不給答案,更過份的情況是電話拿起來,叫我等一下,一等就是很久,一直沒有回應,很無奈,只好掛斷電話,再打去問的時間,他出門了,或許這才真的是沒人教,沒人救的情況,用google查,上論壇發問,甚至利用下班時間去資策會或恆逸上課,當時主管還不准我提早個幾分鐘下班去上課,所以通常沒吃晚餐,就到補習班去了,回到家十點多,晚飯都收了,草草弄個東西吃一吃就算了,這樣過了一年多的時間,後面也陸續的考取了一些證照,這些費用林林總總加起來也要12萬,但這兩年的時間,卻也是打下我基礎的兩年.


  記得你剛到我們單位時,其實就已經在安排要怎麼帶你,只是那時有另一位工程師是我已經帶一段時間了,所以由他來帶你進入狀況,之後他離職了,見你的狀況似乎已經瞭解基礎了,我也沒再多加著墨去主動帶你,當你遇到不懂的問題時,再教你就好了,如果你沒問,我就當你懂了,後續的專案安排,其實也是有計畫性的,剛開始給你的專案是比較簡單的,讓你慢慢的熟悉,所以初期較有難度的都在我手上,後續再慢慢的把專案的難度提高,交由你的負責,讓你循序漸進的成長,縱使你的開發時間比我預料的多許多,可是我們的主管待人很好,為了讓你多學一點,進度上也沒說什麼,除了幾個真的做了太久,主管才過去關心你手頭上的專案,可是我們現在的組織變了,換了一位新主管,而這新主管是否會再給你那麼多的時間就不知道了,但可確定的是,過去那樣子不是常態,任何一家公司都會有時間壓力的.


  或許你有發現,主管有時給我們到外面去上課,不用我們付錢,公司還給公假去上課,但我還是不去,因為名額只有一個,所以每次都是讓你去上,我並不是不喜歡去上課,你想想,我先前為了上課, 自己花錢花時間去上,甚至還請假去上,我怎麼可能不喜歡上課?我也是很喜歡多學一點東西,但這些機會都讓給你了,只是希望你多學一點.


  至今你可能仍不認為我有教過你什麼,我也不是很強求要在別人面前證明什麼,畢竟我在這個職場也將於7月底結束,接下來的一切就要由你接手了,現在的你,比當初接下這個棒子時的我,更沒資格說不懂,我跟前手只交接10多天,文件少到一個文件夾放不滿,何況現在你也考到不少證照了不是嗎,不論我有沒有教你,前一位工程師也有教過你一段不短的時間,我也陪你走了一段時間.記得那天我們在銷毀一些重要文件,我也看到過去我為了讓後人好接手所寫的文件,當初是給那位離職工程師看,讓他瞭解系統,快點進入狀況所用的教學文件,但沒想到今日竟然是被放在廢紙堆,因為你現在已經會了,也覺得不需要這些資料,所以那些也就跟著一起被銷毀,但僅管如此,留給你的文件也依然相當的多,不管後續用不用的到,你要多加油,後面就靠你了, 我也不會在別人面前說我教過你什麼,只會說一切都是靠你自己學來的,Google是你最好的學習管道,而我就在這個月底卸任了~

jeffyeh 發表在 痞客邦 留言(4) 人氣()

  有段時間沒出門了,難得假期,在2008/07/05跟家人又跑去宜蘭新寮瀑布,一車7個人,頭頂著大太陽從台北往新店出發,由於雪隧塞車,所以改走北宜公路過去,好久沒走這條了,車子沒以前多了,但腳踏車變多了,一路上看到的腳踏車比汽機車還多,而雪隧的通車,也看到對坪林店家的影響,過去熱鬧的茶店(不是那個哦),門口不時有遊覽車停著,今日看到空曠的停車場,店家開的也不多,只剩少少的幾家還開著,最多客人的店,則是那家突兀的7-11便利商店,門口有一群騎腳踏車的遊客在那休息,或許這段山路因為雪隧的開通,變的更適合遊客到此騎腳路車.


  開了幾個小時,終於到了宜蘭,但痛苦開始了,剛剛在山上還不覺得熱,一下山後,天啊,熱翻了,冷氣咧?冷氣開到最強怎麼也是熱的,在30多度的車子裡,阿伯不知道是熱到昏睡,還是太累睡著了,一車7個人就這樣頂著大太陽,在沒有冷氣的車子裡,一路熱翻到冬山工作站去.


  一下車後,突然覺得一陣涼,感覺這時在車上打顆蛋,應該也是會熟的吧,好不容易到這裡了,到門口拍一下照片吧,妹妹的習慣就是每到一地,必拍門口及園區導覽.


 


看到招牌有猴子,以為裡面會看到他們,結果半隻都沒看到,看到一群人...



 


這個導覽圖,看起來很小,門口簡介人員也說來回40分鐘,但我光第一個瀑布就走了40分鐘....因為太熱了,半途一定要下去泡個水.



頂著大太陽,大家都快熱翻了,這三位可是拍完就馬上跑的不見人影...



那天真的太熱了,看到水的出現,二話不說,就先跑下去泡一下,快熱翻了....



我的頭快熱炸了,我是酷企鵝,你看不到我...看不到我....



看到清澈又冷涼的水,涼風吹來真是舒服啊.



走了一段路後,終於到了第一個瀑布了,門口的工作人員說,來回大概40分鐘,但我到第一個瀑布就40分鐘了....



看完了瀑布,改往下一個點走吧,今天的人真的很多,過個吊橋也要排隊,而吊橋一次限6人通行,所以大家就等一下囉,安全第一.



這個吊橋還真特別,它是大麻繩做的哦,所以大家就踩著大麻繩過去.



這橋並不長,但倒是很有味道的吊橋.



很多人過了吊橋後,就往右轉走回去了,為了見到更漂亮的瀑布,於是左轉繼續往上走去.



這隻蝴蝶很怪,停在老婆的手上好久,可能老婆手上的汗鹹鹹的,蝴蝶今天想換個口味,平時一直吃甜的,今天來個不同的,來吃個鹹濕味.



平時看到的毛毛蟲的毛都沒有這麼長,這隻長到讓我想到紅毛丹. 我也不是昆蟲專家,僅有的IT大腦所能想到的名字,就叫它新豐毛吧.



由於大多人只走前半部,走這吊橋時,沒有什麼人,所以也不用排隊了.



走了好久,一身的汗水,終於看到主角出現了,雖然沒有高愈百尺的高度,但也不失為壯觀.加上環境的陪襯,更顯它特別的美麗.



由下往看還真是壯觀,瀑布激起的風,夾帶著水花,這種涼意真的是無法言喻,這時只想多拍幾張照片,帶回家當桌面.



正在拍照的我,背影看起來還好,此時正面已經濕到不行....露點照就不宜放上來囉.



這階段看起來很陡吧,其實還好啦,只是想辦法把它拍的陡一點....



不管怎麼拍,看起來還是不陡,但卻另有一番味道.



 


  進入口的時間大約2點左右吧,走出來時就5點多了,因為夏天的關係,天看起來還很亮,回想起"來回40分鐘"的這句話,真要在這時間內來回,是做的到的,但沿途的風景就完全沒看到,平時工作為了達到目的,都是一路衝啊衝的,努力的在期限內完成,但這是不同的,難得的休閒,放慢腳步看風景,花的時間雖然比預期的多,但得到的卻不是只花40分鐘就能擁有的. 很多遊客看到第一個瀑布後,就往回去了,更漂亮的新豐瀑布反而沒看到,雖然很熱,又忘了帶水,又渴,又熱,又累的一路走上去,但看到新豐瀑布後,大腦就把那些全放到腦後,盡情的享受著這難得的景致.


  美好的時光總是短暫,沒冷氣的車子在停車場等我們,晒了下午的太陽,它更熱了,或許大家玩累了,上車沒多久就睡著了,此時也不在乎車子有多熱,一路搖搖晃晃的回台北去~


註 : 照片的日期在2003/01/01,沒為什麼,因為忘了調....

jeffyeh 發表在 痞客邦 留言(1) 人氣()

  這段時間較常用到GPS的功能,看了很多家的導航功能,最新的大概就是那種3D導航,不會讓你上錯橋,下錯路,走錯彎的,但這也只是局限一些大路口,並不是每個地方都有,有時還要低頭下來看,也不是很好,所以就想到抬頭顯示器HUD這種東西,如果能把方向直接投在前擋上,根本就不需要再去畫製3D圖,而且LED投影似乎也將開始投入市場,日前有看到一些新產品,手機真的內建LED投影了,所以之前並不是自己的幻想.


  開車族最不喜歡的就是後照鏡老是被"A"到,在猜想,或許未來LED投影也可能取代這個百年沒變的古董,試想,在前擋的某個地方,就可以看到四週的環景畫面(像某台InfXXXX),不用再怕後照鏡去A到,而且車身會更為流線型,少了兩片耳朵,之前是有想過,在前擋用個液晶畫面來顯示,只是覺得效果沒達到心中的那個標準,LED投影應該會更好,更省電,投出來的畫面更大,而且可以投在"透視物體"上~


  最近的怪想法很多,例如利用汽車冷氣有外進氣的功能,當車子熄火停車時,這是一個很好的排氣管道,而原本車內的冷氣口呢,就是眾多的吸氣口,在天窗或某個地方放置太陽能板,產生的電力去帶動風扇運作,就可以把熱氣從車內的冷氣口吸到車外去,再也不用在窗戶上裝那種小排風扇,車內也可降低一些溫度吧,不過這也只是自己的構想,或許那天會有廠商真的實作出來賣吧.

jeffyeh 發表在 痞客邦 留言(0) 人氣()

  用程式去調整EXCEL檔的格式,例如自動對齊,欄位大小,字型顏色等.這個功能平時寫程式很少用到,但有時要用,還真的不是很好找,所以把它給整理一下放上來,說不定那天用到時,就不用再去東翻西找,或許也有別人需要這個功能.


  廢話不多提,直接進入主題,要使用這個功能時,要先去加入一個COM元件的參考,Microsoft.Excel 11.0 Object.Library,將它加入參考後,就可以開始進行Coding的動作了,為了做基本功能的展示,所以做了一個簡易的UI.



加上一個OpenFileDialog即可,在Filter設定*.xls.其它就都是Code的部份.


接下來,就把調整格式的動作放入button_Click的事件內去做了.


        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Worksheet excelWs;
                Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(openFileDialog1.FileName,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);

                excelWs = (Microsoft.Office.Interop.Excel.Worksheet)excelWorkbook.Worksheets.get_Item(1);//取得第一個sheet

                設定小大位置

                設定顏色

                調整儲存格格式

                ClearCom(excelWs);
                excelWorkbook.Close(true, Type.Missing, Type.Missing);

                ClearCom(excelWorkbook);
                excelApp.Workbooks.Close();
                excelApp.Quit();
                ClearCom(excelApp);

                excelWs = null;
                excelWorkbook = null;
                excelApp = null;
                MessageBox.Show("設定完成");
            }

        }


        static void ClearCom(object o)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
            }

            catch { }
            finally
            {
                o = null;
            }

        }

 


這樣就完成Excel檔的格式調整了,當然還有其它未提到的參數屬性可以設,大家可以依自己的需求去找一下.


參考 :


MSDN : WorkSheet


MSDN : WorkBook


原始碼 : ExcelFormat.zip

jeffyeh 發表在 痞客邦 留言(0) 人氣()

Web Service一般都是直接呼叫使用,而以下的範例,則是加了Header,如果Header不對,則Client無法呼叫使用.


先從Web Service說起.


using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;


namespace WSHeaderWS
{
    /// <summary>
    ///Service1 的摘要描述
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]

    public class Service1 : System.Web.Services.WebService
    {
        public Service1()
        {
            if (Context.Request.Headers.Count < 2)
            {
                throw new Exception("Access Deny");
            }

            string[] AccID = Context.Request.Headers.GetValues("AccID");
            string[] AccPWD = Context.Request.Headers.GetValues("AccPWD");
            if (AccID == null || AccPWD == null)
            {
                throw new Exception("Access Deny");
            }

            if (AccID.Length < 1 || AccPWD.Length < 1)
            {
                throw new Exception("Access Deny");
            }

            if (AccID[0] != "123456" || AccPWD[0] != "654321")
            {
                throw new Exception("Access Deny");
            }

        }


        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

    }

}

 


從以上的Code可以看到,會先判斷Header存不存在,如果不存在,則Access Deny,如果存在,就判斷AccID及AccPWD是否正確,如果不正確,也是Access Deny.


而可以呼叫的WebMethod為HelloWorld().


這樣就做好Web Service端的Header部份的動作,而接下來Client就要使用這個WS.所以一定要先加入Web參考.


Client端的一般呼叫WS的方式很簡單.


try
{
    HW.Service1 ws = new WSHeaderCL.HW.Service1();
    MessageBox.Show(ws.HelloWorld());
}

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

這個程式呼叫HelloWorld一定會跳Exception,因為沒有Header.


所以要加入Header才能執行,做一個Demo畫面,用來測試,如果當Header的值有誤時,會怎麼樣.



不含Header即是前一個範例,而接下來要做的是含Header的部份.


首先先產生一個ProxyWeb的Class(名字隨個人高興),因為我的WS是用HW命名,所以是HW.Service1


public class ProxyWeb : HW.Service1
{
     private System.Collections.Specialized.NameValueCollection headers = new System.Collections.Specialized.NameValueCollection();
    public ProxyWeb(string ID,string PWD)
    {
        headers.Add("AccID",ID);
        headers.Add("AccPWD", PWD);
    }

    protected override System.Net.WebRequest GetWebRequest(System.Uri uri)
    {
        System.Net.WebRequest request = base.GetWebRequest(uri);
        request.Headers.Add(headers);
        return request;
     }

}

有了這個Class後,就可以直接使用了


try
{
    ProxyWeb ws = new ProxyWeb(txt_ID.Text.Trim(),txt_PWD.Text.Trim());
    MessageBox.Show(ws.HelloWorld());
}

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

用法一樣,只是在new ProxyWeb時,傳入ID及PWD,沒什麼特別的步驟.呼叫其它的WebMethod也不需再去寫另個Class或什麼的,用法都一樣,除非是另一個Web Service,才需要再寫一個Class.


測試結果,當然ID及PWD符合時,才會跳出HelloWorld,不然都是Access Deny.


而ProxyWeb除了可以加Header外,也可在這邊指定Web Service的Url,因為有些人的WS的Url是動態的,所以可以在ProxyWeb的這個Class指定就好.


 


這個的應用方式很多,不是像我這樣的簡易驗證,也可用來傳一些共用的固定值,例如UserID,我這只是Demo做法.


如果有更好的做法或寫法,也感謝各位的分享.


 


原始碼 :


Client : WSHeaderCL.zip


Web Service : WSHeaderWS.zip

jeffyeh 發表在 痞客邦 留言(0) 人氣()

  最近在公司發生了許多的事情,而有些事情也讓我想去過去在大陸工作時,所學到的一些經驗,記得剛從工程師升職為開發部主管時,剛開始是有點辛苦,但還算接的順利,直到後面,老闆派了一個人到我部門工作,也沒指示說,要這個人到我這做什麼,只說讓我安排這個人在我這工作,心想說,老闆給人應該是不錯或是有什麼特色才來我這的吧,所以一開始就先安排他先瞭解我們公司的商品.


  一段時間後,看他對我們公司的商品已有概念,大至瞭解了一下他的專長,接下來就請他先擔任助理工程師,兩週後,再次與他面談,想瞭解他的學習狀況,結果讓我嚇一跳,他回了我一句,我不會電腦,而且也不想學,晴天霹靂啊,你不會,怎麼當初不先說呢,那麼不學電腦,去學打樣品吧,同樣做沒幾天,跑來跟我說做這個很辛苦,而我的心裡就想說,他無法勝任我們的工作,只好跟老闆回報了,而老闆也只回了我一句,是你不會用人,不是他不好,不管,你就是想辦法任用他.


  說真的,當時有想過,啊他是跟你有什麼關係啊,怎麼對他這麼的特別,但老闆交待下來,不能不從,所以開始花腦筋去思考,到底要怎麼安排他的工作,電腦不行,打樣怕苦,這對剛升主管的我,真是一個考驗,想了很久的時間,決定換個角度去試這個人,但還是要求他去打樣,畢竟這項工作是基礎功,也對他是種耐心與壓力的考驗,幾過一個月後,他又受不了,再度跑來找我,只不過,這次是哭給我看,但當我對他表明我讓他去打樣的用意後,他似乎也接受了這個安排,也回去繼續工作,三個月後,他也沒讓我失望,也讓我看到他的專長,工作做安排與進度的掌握,剛開始真的看不出他有這個能力,但因為這段時間的磨練,使我看到他真正的光芒,因此改將他改調任為樣品製作組的組長.


  這個差别真的很大,剛開始覺得他不能用,缺點很多,但在這樣的磨練後,發掘出他的能力,升任後的他,也將該小組管理的很好,我也很少再去關注該組的進度及品質問題,這個結果讓我也很高興,我讓他找對位置了,於是就跟老闆報告這一切,老闆聽了也是很高興,也告訴了我,他這麼安排的用意,其實老闆是要我從這個人的身上去學習怎麼用人,怎麼去發掘一個人的能力,也點明了我當初用人的粗心,把人放錯位置,還有沒有花心思去瞭解這個人,把人才當庸材在用,而當初我對老闆所反應的問題,老闆之所以不理會,最主要,也是影響我後續最多的一句話,"你看人只看缺點,不看他的優點,用人要用優點,而不是用缺點".


  這句話真的沒錯,我開始真的沒花心思去瞭解,就按照公司的"新進人員流程"去安排,在這過程中,我用慣用的考核去看他,所以我看到一堆缺點,也就直覺的判斷他不行,後來開始花心思去注意他的表現,才讓我發現他的優點,將他指派至適合他的位置,之後他也成為我的助理,甚至我改調任製造部主管後,他也成為工程部的主管,如果當初真的讓他就這麼走了,或許我也不會有後續的際遇.


 


  用人要用優點,而不是用缺點,當你是在發揮他的優點時,你會覺得他很優秀,如果是一直在挑他的缺點時,你會覺得他一文不值,人沒有十全十美的,所以要去找出他的優點,放在對的位置,給予他機會,他自然就會發光發熱.

jeffyeh 發表在 痞客邦 留言(0) 人氣()

  MD5的加密已經出來很長一段時間了,也不是什麼特別的新技術,寫這篇的用意也有點像是給自己的一個Note,畢竟加密的功能不常用,最多寫成一個Class,未來去呼叫就好,怕自己也會忘記,所以把這個寫下來.


  初步的UI設定如下:



H執行是單純加密,而Salt執行則是跑Salted Hash的動作.


單純加密比較不好,如果被人猜到加密方法是採MD5,也沒有Salted,那會風險會高一點,而Salt的效果,因為多了一個Value去加密,除了前面的都要猜到外,還要知道Salted Value才可以.而Salted Value就看大家要怎麼去設了,這裡也只是單純的Demo.


單純加密的部份,其實很簡單,程式碼如下 :


byte[] Original = Encoding.Default.GetBytes(txt_Source.Text); //將字串來源轉為Byte[]
MD5 s1 = MD5.Create(); //使用MD5
byte[] Change = s1.ComputeHash(Original);//進行加密
txt_Result.Text = Convert.ToBase64String(Change);//將加密後的字串從byte[]轉回string

很簡短的四行,就可以達成了,但個人還是喜歡用Salted,畢竟要加密,就要降低風險.而這方法加密後的結果如下 :


值 : 123456789


結果 : JfnnlDI7RTiF9RgfG2JNCw==


Salted Hash就比較複雜了一點 :


string salted = txt_Salt.Text.Trim(); //宣告變數,儲存Salted值
if (salted.Length == 0)//如果使用者沒給Salt值,那給預設
{
    salted = "t15t";
}

byte[] Original = Encoding.Default.GetBytes(txt_Source.Text);//將來源字串轉為byte[]
byte[] SaltValue = Encoding.Default.GetBytes(salted);//將Salted Value轉為byte[]
byte[] ToSalt = new byte[Original.Length + SaltValue.Length]; //宣告新的byte[]來儲存加密後的值
Original.CopyTo(ToSalt, 0);//將來源字串複製到新byte[]
SaltValue.CopyTo(ToSalt, Original.Length);//將Salted Value複製到新byte[]
MD5 st = MD5.Create();//使用MD5
byte[] SaltPWD = st.ComputeHash(ToSalt);//進行加密
byte[] PWD = new byte[SaltPWD.Length + SaltValue.Length];//宣告新byte[]儲存加密及Salted的值
SaltPWD.CopyTo(PWD, 0);//將加密後的值複製到新byte[]
SaltValue.CopyTo(PWD, SaltPWD.Length);//將Salted Value複製到新byte[]
txt_Result.Text = Convert.ToBase64String(PWD);//顯示Salted Hash後的字串

那個byte[]要放那個,那個byte[]要做什麼,很容易一不注意,就放錯個進去. 但這個加密後的如果如下:


值 : 123456789


Salted Value : goTest


結果 : erxXv9V5RYeCJaiF1z3yZ29UZXN0AA==


 


  因為這是目前仍無法反解回來的加密方式,所以就算DataBase的資料外流,也不用怕這些資料會被還原回來,而Salted Value就看大家要怎麼去"動"它囉.


原始碼 : encodeTest.rar

jeffyeh 發表在 痞客邦 留言(0) 人氣()



  今天早出門上班前,突然心血來潮跑去給蜜蜂拍了一張照片,慢慢的靠近,發現它們似乎還沒起床,沒什麼在動,可能太暗了,它們以為還是晚上,等門一打開,光線射進來,他們才開始有了動作,但也只有2隻先飛出去,其它還在睡的樣子,但拍這照片時,我也不敢太靠近,怕他們被我吵醒,如果有起床氣,或是每隻都跑來給我個擁吻,我會受不了,老婆也會吃醋,所以這樣拍就好了,大概看了一下大小,似乎迷路的有回來了,雖然比第一天發現時還小了一點,但沒昨天少那麼多,應該是剛搬來,路不熟吧,下次出門別太晚回來,深夜問題多,平安回家最好.



2008/06/25 上午07:30攝.

jeffyeh 發表在 痞客邦 留言(0) 人氣()

  6/21晚上跟老婆去夜遊(基本上是迷路,從三重跑到快鶯歌了...),到家後,突然聽到好多嗡嗡聲,跟蒼蠅一樣的聲音,當下想說,是不是有東西壞了,才會有這麼多蒼蠅,延著聲音找去,哇,好多啊,因為太暗也看不清楚,正想揮手去趕,突然覺得不對,它們太"團結"了,怎麼可能我靠近他們還不閃,還是確認一下的好,拿出手電筒一照,我的媽啊,一大群蜜蜂,而且是野峰,不是家蜂.


 


  當下有幾個念頭,趕走它們,但另一個念頭讓我打消了趕走他們的想法,最近看到蜜蜂的消失與人類的滅亡,蜜蜂愈來愈少了,每個人都不喜歡它們,看到它們不是打死就是趕走,加上農藥的毒害,生存空間愈來愈少了,所以就讓它們留下來吧,反正它們又沒叮我,也沒叮我的家人,只要不去打擾它們,它們也不會來攻擊我們,經過這幾天的觀查,這群蜜蜂的窩沒長大多少,而且好像有些蜜蜂迷路了,數量沒有第一天發現時的多,不知道是否要去找個箱子給它們住~

jeffyeh 發表在 痞客邦 留言(0) 人氣()

      今天在家裡整理一些資料,用Word打文件打沒多久,竟然跳出"你的作業中沒有word的工作檔,而且記憶體將滿,請儲存你的工作",之後如果沒有存檔,還繼續打下去,Word就會像當掉一樣,只好儲存關閉再重開,但沒多久就又發生一樣的問題,心想,到底發生了什麼事,就到微軟網站去查這個問題,查是有查到,不過看到解決方案,似乎我的直覺告訴我,不是這個問題,就回想了一下最近"做了什麼好事",結果想到,之前玩過Ram Disk,好像有把Temp的目錄移過去,於是就檢查了一下檔錄檔.


在執行的地方打入regedit


找到這個路徑 :


HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders


看一下這個目錄下的Cache的設定


果然,我的Temporart Internet Files是設在一台不存在的Device,把它改為C:\Temporart Internet Files


重開機後,再打一次Word,果然,問題就沒發生了.


接下來,再接著打資料去...

jeffyeh 發表在 痞客邦 留言(0) 人氣()

日前寫了一篇如何用GPS抓取目前所在,並回傳至資料庫儲存,這篇將會利用這些回報的資料,將它顯示在地圖上,這個做法有兩種,最簡單的就是直接傳值到Google Maps上.


 


舉例來說,當我們知道經緯度後,只要將數據套到以下網址即可.


http://maps.google.com/maps?q=25.048346%2c121.516396


在參數q=後面,就可以加上經緯度了.


25.048346是Latitude緯度


%2c是空格


121.516396就是Longitude經度了.


範例畫面 :


image


 


而另一種做法就比這個複雜一點,要使用Google API來做,首先,要使用google API就必需要有google的帳號,沒帳號是無法申請的,當有google的帳號後,就可以到http://code.google.com/apis/maps/signup.html開始申請了.


image


最下方My web site URL就輸入各位的URL囉,如果輸入的與執行google map api的URL不同,那就無法執行了.所以這個URL務必輸入正確, 輸入正確的URL並將上方的CheckBox打勾後,就可以按Generate API Key了,如果已經登入GOOGLE的,就不會再跳登入畫面,之後就會跳到另一個畫面,上面就有Key及Example Code了,當有了這些,就可以開始自己寫Code了.


 


基本上,因為主要是Demo用的,所以設計介面很簡單.


map1


上面就一個DropDownList,因為先前的範例資料的關係,先手動在ITEM上加上1跟2.


而下方的地圖,就跟申請API時的Example Code一樣. 原始碼如下 :


 


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>GPS 位置地圖</title>
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=輸入你的Key"
type="text/javascript"></script>

<script src="http://www.google.com/uds/api?file=uds.js&v=1.0&key=輸入你的Key"
type="text/javascript"></script>

<script src="http://www.google.com/uds/solutions/localsearch/gmlocalsearch.js" type="text/javascript"></script>

<style type="text/css"> @import url("http://www.google.com/uds/css/gsearch.css");
@import url("http://www.google.com/uds/solutions/localsearch/gmlocalsearch.css");
</style>

<script type="text/javascript">
//<![CDATA[
function load(x,y,LocationName) {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
var point = new GLatLng(x,y);
map.setCenter(point, 16);
map.addOverlay(new GMarker(point));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
var lsc = new google.maps.LocalSearch();
map.addControl(new google.maps.LocalSearch() , new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,20)));
map.openInfoWindowHtml (map.getCenter(), LocationName);
}
}
//]]>
</script>
</head>
<body id="MainBody" runat="server">
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="ddl_Location" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddl_Location_SelectedIndexChanged"
Width="500px">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem Value="2">2</asp:ListItem>
</asp:DropDownList><br />
<br />
<div id="map" style="width: 500px; height: 400px">
</div>

</div>
</form>
</body>
</html>




 


只要將"輸入你的Key"的地方置換為你在Google MAP API申請到的Key即可.


 


   protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.QueryString.HasKeys())
{
string longitude = Request.QueryString.Get("lon");
string latitude = Request.QueryString.Get("lat");
string LN = Request.QueryString.Get(Server.UrlDecode("LN"));
this.MainBody.Attributes.Add("onload", "load(" + longitude + "," + latitude + ",'" + LN + "')");
}
else
{
DataTable dt = GetLocation(ddl_Location.SelectedValue);
if (dt.Rows.Count > 0)
{
DataRow dr = dt.Rows[0];
this.MainBody.Attributes.Add("onload", "load(" + dr["Latitude"].ToString() + "," + dr["Longitude"].ToString() + ",'" + dr["updtime"].ToString() + "')");
}
}
}
}

protected void ddl_Location_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
DataTable dt = GetLocation(ddl_Location.SelectedValue);
if (dt.Rows.Count > 0)
{
DataRow dr = dt.Rows[0];
this.MainBody.Attributes.Add("onload", "load(" + dr["Latitude"].ToString() + "," + dr["Longitude"].ToString() + ",'" + dr["updtime"].ToString() + "')");
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}


}

private DataTable GetLocation(string UID)
{
try
{
string strconn = "Data Source=localhost;Initial Catalog=GPSDB;User Id=GPSUser;Password=gpsuser;";
SqlConnection conn = new SqlConnection(strconn);
string strcmd = "select Latitude,Longitude,UpdTime from GPSDB..gpstrace where UID=@UID";
SqlCommand cmd = new SqlCommand(strcmd, conn);
cmd.Parameters.AddWithValue("@UID", UID);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt=new DataTable();
da.Fill(dt);
return dt;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}




 


如此一來,就大功告成了,但或許有些人會有些遺問,那麼MAP上,可以自訂一些東西,例如不給搜尋列,這都是可以做到的,可以參考Google Map API Examples,這裡就有很多詳細的說明.


 


感覺起來,GPS定位的想法部份,好像到此就沒了,但在這過程中也發現到,其實Google Map有出Mobile版的,而它的定位可不只是局限在GPS衛星訊號,而是可以用手機的訊號去定位,也就是說,他是透過手機與基地台之間的傳輸來計算出所在位置,這樣就可以不受到手機沒有GPS功能模組或收不到衛星訊號所限制,這個概念其實也不算新,記得幾年前的Run!PC雜誌上就有篇文章是在介紹這個的,採用的技術是Java.


 


不過不管如何,可以預見的是,這個的應用會愈來愈多元,誰說未來還要自己去用電腦下載圖資再更新到自己的GPS裝置上,裝置上的地圖永遠會是最新的,加上Street View,也不用去看那電腦畫出來的3D的道路圖了,或許3G或無線上網的普及,這些運用將會更廣泛.


 


參考資料 :


Google Map API Examples


Google Map Mobile


 


原始碼 : GPSMap.zip

jeffyeh 發表在 痞客邦 留言(1) 人氣()

最近家中有一名將從幼稚園畢業的小朋友.


 


同一般的幼稚園一樣,小朋友都要上台表演,所以家裡的妹妹也要上台表演.


 


劇情的主角是公主與王子的老掉牙戲碼,而角色是小朋友自己選的.


 


我們聽到的第一個想法是,你一定選公主吧.


 


結果不是,小朋友選了小天使~


 


我們都不懂,怎麼會選小天使呢? 演公主不是很好嗎? 怎麼會想要演小天使?


 


小朋友天真的回答 : 因為公主要背好多哦,小天使都不用背,只要在那飛來飛去就好......


 


大哥聽了苦笑說 : 好吧,那天畢業去看你演蒼蠅......

jeffyeh 發表在 痞客邦 留言(0) 人氣()