May 2009 - 文章

端午"龍舟"行

四天端午連假,奉皇后懿旨,應至少出遊一日,以娛公主、太子殿下。

原本想去宜蘭走走,自昨天在新聞上看到比美"超大長型室內停車場"的雪隧後,便打了退堂鼓。心一橫,索性連車都別開,就搭著捷運去玩樂吧!

捷運能達,又不需額外交通工具接駁的風景區選擇並不多,最後決定了淡水。理由是兩個小鬼可以在河畔市集的彈珠檯、娃娃機間獲得慰藉,兩個大人則打算靠"坐船視同度假"尋求精神上的救贖,嗯,真是絕佳的安排。

淡水捷運線人好多,到了淡水人更多,適逢五月初六清水祖師遶境,整條淡水老街人聲鼎沸、鑼鼓喧天,也算是讓小朋友見識一下台灣民俗。不過我倒在遶境隊伍中見識到新奇的組合--白襯衫格子短裙麂皮靴美少女大鼓團!

  

先讓兩個小朋友在市集裡玩了撈球機、打彈珠,花幾百元換來充氣小球、小鎚及小狼牙棒,小人們心靈稍獲滿足,才願意跟著坐船真的去"旅遊"。船票不算貴,淡水老街到漁人碼頭的來往票全票一百、半票五十,甚至可以刷悠遊卡。上了船,坐當然要坐刺激新鮮的船尾室外區,船速比我想像得快很多,後方捲起壯觀的浪花,還可以不時體驗水花拂面的感覺,咳... 是鹹的! 兩個小孩興奮得很,看到風大浪大樂不可支,一路上笑得合不攏嘴。

   

接近漁人碼頭,岸邊開始出現消波塊,讓我想到這陣子天天吃天天吃的粽子。誰知拍完消波塊一轉頭,忽然一陣強風襲來,我的帽子瞬間以完美的抛物線離開頭頂,劃過天空落入離船尾三尺達的水面,剎時消失在船尾的滾滾浪花中。一切經過不到兩秒,我的MVP棒球帽就這麼追隨屈原,投了汩羅江淡水河,棒球帽你安心去吧! 這水邊剛好有這麼多"肉粽",魚兒不會吃你的。
(PS: 如果有人在漁人碼頭附近拾獲漂流上岸的米色棒球帽,上繡有黑白MVP Logo,請與我連絡! 鳴~~~)

第一次到漁人碼頭,發現整體的規劃比我想像來得精緻完善,景觀很美,非常適合在這裡的餐廳小店與家人、朋友消磨一整個下午,太陽雖大,但海風清透,全無燥熱悶溼感,晚一點若遇上夕照,想必更是美不可言吧!

   

兩點多,原本悠閒的碼頭人忽然開始多了起來,是怕擠的老人家該撤退的時候了。搭回程船時,才發現原來這裡跑船的有兩家業者: 順風跟台航,順風的生意明顯比台航好上許多。我才想起,順風在登船口前方數十公尺設了一個前進指揮所,派了人在路中央吆喝,逢人便問有無要坐船,直接帶至票口買票。初次想坐船的人傻呼呼如我們,哪知門路,見有人招呼就樂得早早買票順利上船。生意好壞,立見高下。

回程的捷運塞得滿滿的,兩個小時後,終於回到溫暖的家,結束了今天端午補"龍舟"之旅。

PS: 我兒子跟女兒對端午節的含意有特殊的體會...
兒子說: 我知道,老師有跟我們說,端午的由來是"七元"掉到水裡...  (幸好不是皮夾掉下去)
女兒說: 不只,我還知道為什要點雄黃酒,就是以前有個白娘娘,她愛上"許先生".... (是許仙 是許仙 是許仙)

Posted 30 May 2009 03:52 AMJeffrey | no comments
Filed under:
關於Checkbox Click事件的小發現

我寫了一小段程式讓一群Checkbox具有單選的限制。理論上,單選改用Radio就好了,但在我接觸的一些需求中,使用者就是偏好方格打勾的呈現方式,比較貼近傳統紙張表單設計。

程式碼挺簡單的,利用class將幾個Checkbox歸成同一群,當其中任何一個被點選時,就將整群的Checkbox先全設為未勾選,只保留被點選者。

for (var i = 1; i <= 3; i++) 
    $("body").append(
        "<input type='checkbox' class='grpCbx' value='" + i + "' />" +
        "<span>OPTION " + i + "</span>");
$(".grpCbx").click(function() {
    $(".grpCbx").removeAttr("checked");
    this.checked = true;
});
$("<input type='button' value='TEST'>").appendTo("body")
.click(function() { $(".grpCbx:eq(1)").click(); });

(註: 以上的程式碼可以直接拿到Mini jQuery Lab玩)

不過,程式執行結果跟我想像的有些出入。我發現如果用滑鼠點選Checkbox時,操作反應正常,的確具有單選效果。但如果我透過另一個Button點選事件呼叫Checkbox的click(),其他已勾選的Checkbox是會被清除,但指定的Checkbox卻沒有如預期被勾選。

如果將this.checked = true;移除,則以.click()觸發會成功,直接點選反而失敗,直覺上好像內部某種this.checked = !this.checked機制在左右結果,但我推理不出現象背後的邏輯。

詭異的測試結果讓我苦思好久,終於在加了一行alert(this.checked)測試後解開謎團...

我將程式碼改成$(“.grpCbx”).click(function() { alert(this.checked); $(“.grpCbx”)… 分別點擊及程式呼叫,就突顯出差異來。當手動點擊時,在click事件的一開始,this.checked == true;而由程式呼叫click()時,事件一開始時則this.checked == false。

我的推論是:

在手動點選時,Browser先將checked設為true才呼叫click事件函數,如果我清除了全部checked又沒將被點者的設定回true,就會導致勾選失效;而程式以click()觸發時,事件中所見this.checked仍是false,似乎在click事件函數完成後才進行this.checked = !this.checked的動作,我將checked設成true,反而會讓最終結果變成false。

回頭考慮程式修改,才發現原本的寫法很笨--"先將全部清除,再重設被點選者"。為何不只清除點選者以外的Checkbox就好了呢? jQuery有個很棒的API--not(),可以傳入selector、元素或元素陣列,寫成not(this)立刻一步到位。程式改成如下寫法,精簡又有效率,早該如此。

$(".grpCbx").click(function() {
    $(".grpCbx").not(this).removeAttr("checked");
});
Greasemonkey Script: 大圖自動縮小顯示

宅神朱學恆Blog的文章除了一向犀利大膽外,極其豪邁的全尺寸圖檔(尤其是美女正妹圖)更是一大特色。不過,圖檔實在是太大了,即便用我的1280*1024螢幕檢視,若不捲動網頁,往往只能窺得正妹照片的一小角,必須由小得可憐的可視範圍推測那一大塊膚色到底是美腿還是伴隨入鏡狗狗的後腳? 頗有瞎子摸象之趣。
【補註】後來才知道,原來有個"男子漢絕不縮圖"的典故,我又孤陋寡聞了,呵!

前幾天偶爾逛到在Greasemonkey載入jquery.js的做法,一時興趣就動手寫了這個想了很久的外掛。載入jQuery後,隨意加幾行Code,遇到大尺寸圖檔自動縮小顯示比例的Greasemonkey Script就完成了。

完整Script附於文後,敬請大家指教,程式中有幾個重點補充說明一下:

在head中加掛script src=”…”載入js是很標準的做法,利用setTimeout定期檢查jQuery物件存在與否偵測js是否載入完成,這跟我另一篇文章介紹過的原理相仿。裡面用了unsafeWindow來存取網頁所在的window物件,則是本次實作練習的重大學習收獲。

resizeHugeImage()會掃瞄網頁裡所有的圖檔,針對長或寬大於800px者縮小顯示尺寸,使其長寬均不超過800為原則。由於圖檔載入完成時間可能發生在$(document).read(…)之後,此時便無法得知圖片長寬,無以為繼。因此,此處利用image的complete屬性判別圖片是否載入完成? 若否,則將檢測長寬及縮圖函數掛在load事件上,待圖片載入完成自動觸發;若圖檔已載入完成,則用先前介紹過的call()觸發檢測縮圖函數。另外,我發現某些圖需要完整顯示才看得清楚,在圖片上加上hover()紅框,並提供dblclick()恢復原尺寸的功能。

// ==UserScript==
// @name           Resize Lucifer's super big picture
// @namespace      http://www.darkthread.net
// @include        http://blogs.myoops.org/*
// ==/UserScript==
    // Add jQuery, ref http://joanpiedra.com/jquery/greasemonkey/
    var GM_JQ = document.createElement('script');
    GM_JQ.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js';
    GM_JQ.type = 'text/javascript';
    document.getElementsByTagName('head')[0].appendChild(GM_JQ);
 
    // Check if jQuery's loaded
    function GM_wait() {
        if(typeof unsafeWindow.jQuery == 'undefined') 
            window.setTimeout(GM_wait,100);
        else { $ = unsafeWindow.jQuery; resizeHugeImage(); }
    }
    GM_wait();
 
    // All your GM code must be inside this function
    function resizeHugeImage() {
        $("img").each(function() {
            if (this.complete) //if already loaded
                proc.call(this);
            else //hook load event
                $(this).load(proc);
        });
        function proc() {
            var img = $(this);
            var w = img.width(), h = img.height();
            var longSide = (w > h ? w : h);
            if (longSide > 800) {
                var ratio = 800.0 / longSide;
                var nw = w * ratio;
                var nh = h * ratio;
                img.data("h", h).data("w", w)
                .width(nw).height(nh)
                .css("cursor", "pointer")
                .hover(
                function() { $(this).css("border", "solid 2px red"); },
                function() { $(this).css("border", "solid 2px black"); })
                .dblclick(function() { 
                    var x = $(this);
                    x.width(x.data("w"))
                    .height(x.data("h"));
                });
                
            }
        }
    }

調整前

調整後

* Firefox使用者可以按這裡下載直接安裝!

TIPS-在.js中啟用WCF的JScript Intellisense

之前介紹VS2008裡針對WCF也提供JScript Intellisense的貼心功能,做法很簡單,只要在ScriptManager裡加上asp:ServiceReference宣告指向WCF的svc檔即可:

但如果是在.js中撰寫Client Script怎麼辦?

原本以為會很麻煩,後來才發現這已在VS2008的料想中,只要加上以下兩行reference就OK囉!

/// <reference name="MicrosoftAjax.js" />
/// <reference path="WebApi.svc" />

為VS2008鼔掌30秒!

Posted 27 May 2009 07:14 PMJeffrey | 1 comment(s)
Filed under:
多想兩分鐘,你可以不必教User關掉Vista UAC

三年前見識過WebATM網站"教導"使用者設定IE,允許執行所有不標示為安全的ActiveX控制項,我寫了這篇: 讓我們再創台灣的資安奇蹟。啊~~~ 福氣啦!!

前幾天我又發現另一椿資安奇蹟。

話說Vista UAC這份昂貴的保險,讓不少原本依賴管理者權限在Windows裡縱橫的程式紛紛中箭落馬(連Visual Studio 2005/2008都在名單上),必須透過以管理者權限執行的做法克服問題。

不過,像這樣教導使用者索性關閉UAC來個眼不見為淨,未免也太霸氣...

在這份說明裡完全沒提到關閉UAC可能衍生的風險,感覺上只想解決自家軟體的相容問題,力求少接幾通客服電話。在我的觀點裡,這很像早期電腦設備還不那麼普遍時,工程師在裝機時一看到插座只有兩孔,問都不問就很阿莎力地把電源線插頭多出來的"那一根"當場折斷(只差沒有吶喊"殺很大~~~")。電腦馬上能開機使用,至於會不會增加漏電風險,反正那是將來的事,立即能用、馬上收錢才是重點。

我一直天真地以為,從事軟體產業(尤其是跟錢有關的),應該要多負些"社會責任",把握機會教育使用者用正確、安全的方式使用電腦,讓大眾有好的資安觀念跟習慣,降低中毒掛馬入侵盜帳號事件發生的機率,大家更能放心使用電腦處理個人身家財產,軟體應用才會更普遍,資訊產業才會篷勃發展,創造了更多的就業機會,最後還是幫到自己。

在這個案例中,我不苛求廠商改寫程式,避開非必要動用管理者權限的動作使與Vista UAC相容(連MS自己都不太做得到);但既然都能細心地準備了圖文並茂的說明,為何介紹的不是先下載程式存到本機,再用"Run as administrator”執行? 一樣兩張圖可以解決,程式就能順利執行無誤。

多想兩分鐘,你可以不必教User關掉Vista UAC。

改造jQuery delay plugin

天才少年James Padolsey寫過一個神奇的jQuery 'delay' plugin,我來狗尾續貂一下...

我的需求是要在動畫播放過程中加入一些非數字型CSS屬性的變化,例如: 在變寬動晝結束後,為文字加上底線。animate()有callback可指定動畫結束時的動作,所以可寫成:
.animate({ width:"100" }, 100, function() { $(this).css({ textDecoration: "underline" }); })

然而,還有另一種情況,我們純粹想在一段時間後改變元素Style,而不用結合任何animate(),例如: 一秒後改字型、兩秒後加上底線。傳統Javascript會用setTimeOut()實踐,挺囉嗦的。James的delay plugin巧妙地運用了animate()循序執行queue的機制,讓一連串的動作可以用.delay()串起來,簡潔易讀許多。因此用.delay()做到預訂時間後修改CSS,我們寫成:
.delay(100, function() { $(this).css("font-family", "arial"); });

不過,我還是覺得不夠簡短,動作一多,得寫出一堆無意義的function() { $(this)... },索性在James的delay plugin加了三行,讓修改CSS屬性時可再簡寫為:
.delay(100, { "font-family", "arial" });

嗯,更有jQuery極簡風的fu了~~~

$.fn.delay = function(time, callback) {
    // Empty function:
jQuery.fx.step.delay = function() { };
    // You can set the second argument as CSS properties
    if (typeof callback == "object")
    {
        var cssObj = callback;
        callback = function() { $(this).css(cssObj); }
    }
    // Return meaningless animation, (will be added to queue)
    return this.animate({ delay: 1 }, time, callback);
}
 
$("<div id='x'>Darkthread</div>")
.appendTo("body").width(100)
.delay(500, { color:"blue", border:"solid 1px red" })
.animate({ width: "200px" }, 1000)
.delay(1, { backgroundColor:"yellow", fontWeight:"bold" })
.delay(1000, function() { alert("Done!"); });
Posted 20 May 2009 10:15 AMJeffrey | no comments
Filed under:
幫倒忙的IE8 JSON.stringify()

正在趕工寫程式,沒想到又跟Bug耗上了大半天… (好像每次都這樣)

有段程式用了JSON2.js處理資料欄位的編修,原本執行良好,今天測試卻發現如果<input type='text'>的value是空字串,傳回結果會變成null四個字。

原本以為這是JSON2.js將空字串視為null所致(以前怎麼沒發現?),但如果是null,應該也要表示為{ "n”:null }而不是{"n”:”null”},幾過一番折騰,總算抓出這隻臭蟲來。

首先,我發現一件事實,因為IE8內建了JSON.stringify,JSON2.js裡找到這段"禮讓"的Code...
if (typeof JSON.stringify !== 'function') {
    JSON.stringify = function (value, replacer, space) {

原來換了IE8後,JSON2.js就已經悄悄隱退,這陣子根本都是IE8的內建JSON在陪公子測試。而這解釋了為什麼以前用IE7, FF, Chrome測試都OK,改用IE8之後的今天才發生問題。

換句話說,這個簍子是IE8捅的,與JSON2.js完全無關。而我寫了簡單的var obj = { n:”” }; alert(JSON.stringify(obj));在IE8下測試,結果倒完全正常。再花了近半小時,總算釐清問題,寫出可以重製問題的簡短Code: (可放入Mini jQuery Lab直接測試)

$("<input type='text' id='txtEmpty' value='' />").appendTo("body");
var obj = { n:$("#txtEmpty")[0].value };
alert(typeof obj.n + "->" + obj.n);
alert(JSON.stringify(obj));

明明typeof obj.n回應是string,測試obj.n == null也是false,但JSON.stringify(obj)就是會變成{"n":"null"}...

一邊幹譙一邊寫了Bug單(微軟至少提供了公開的問題回報UI,火氣是有消了一些),然後用var obj = { n:$("#txtEmpty")[0].value + "" };避開問題,繼續趕工去~~~

好用的SQL Dumper

最近有個需求,要將SQL Server A上某個Table的部分資料匯入到SQL Server B的同名Table中。要完成這類作業,最有效率最方便的做法莫過於建立Linked Server,直接INSERT INTO ... SELECT ...,但這回因事涉DB管理權限的議題,不想增設這些DB層級的設定,想要更不沾手的方式解決。

過去我用過類似的資料庫匯出/匯入工具: Database Publish Wizard,它可以將整個DB的全部內容轉代為Create Table、Insert Data,連同View/UDF/Stored Procedure的建立都轉成T-SQL Script,以方便在Web Hosting的環境下複製DB。但這回我只想取出部分資料,希望將SELECT ... FROM ... WHERE得到的結果直接轉成INSERT INTO就好了,與Database Publish Wizard的目標及適用情境有些不同。

經過一番查訪,找到這個完全符合需求的好東西: SQL Dumper!!

可以下拉選取資料庫、資料表、欄位決定輸出範圍:

還有我最愛的功能,將自訂SELECT的查詢結果轉成INSERT INTO指令:

功能單純有效,介面簡單易用,深得我心。推!!

PS: 試用SQL Dumper後,原本不過在Plurk上喃喃自語了一句,沒想到意外獲得好幾位噗友的熱烈回應! 民意基礎如此雄厚的軟體當然要出來選總統也得在部落格推一把,以免人神共憤、天地不容。

Posted 14 May 2009 02:15 PMJeffrey | 3 comment(s)
Filed under:
TIPS-用jQuery操作<select>

關於jQuery如何讀取及設定<select>元素的選取值,對其用法一直有些含糊,今天摸個清楚,順便為文一篇作為紀念:

$("<select id='s1'><option value='1'>One</option>" +
  "<option value='2'>Two</option>" +
  "<option value='3'>Three</option></select>").appendTo("body");
//直接用val("...")可以選取特定value的選項
var s1 = $("#s1").val(2);
//val()可以取得選取項的值,find(":selected").text()則可得選取項的文字
//直接text()會傳回所有選項的文字大串連,不要誤用
alert(s1.val() + "." + s1.find(":selected").text());
//面對多選式select也不是問題,例如切成multiple,並選取所有選項
s1.attr({ "multiple":"true", size:"3" }).find("option")
.each(function() { this.selected = true; });
//薑 薑 薑 薑~~~ val()傳回的可是字串陣列呢!
var a = s1.val();
if ($.isArray(a)) alert(a.join(","));
//要選取特定選項,傳陣列進去就搞定了
a = ["2", "3"];
s1.val(a);

註: 以上程式碼可以直接貼到Mini jQuery Lab的Script區,馬上測試效果。

Posted 12 May 2009 09:51 AMJeffrey | 3 comment(s)
Filed under: ,
【茶包射手專欄】MSCOMCTL.OCX問題

手邊還有些老系統是用ASP+OCX古法釀造的,一直沿用至今。這樣的設計對新版IE及非IE瀏覽器來說極不友善,但基於改寫成本及效益考量,我想它仍存在繼續活下去的正當性。

話說前陣子公司網路設計做了些調整,近來聽到一些User的哀嚎,抱怨在Client端在更換網域後,原本含有ListView Control(我也不懂為什麼原設計者要這麼寫,不是用<select multiple>就可以解決嗎?)的網頁在瀏覽時出現大紅X,控件無法顯示及使用,但偏偏日期檢視器的OCX卻又操作正常。

我排除問題的過程是:

  1. 先做一個只有ListView OCX的HTML簡化問題並試圖重製錯誤:
    <object id="lsv" codebase="../Somewhere/MSCOMCTL.CAB#version=6.0.88.62" classid="clsid:BDD1F04B-858B-11D1-B16A-00C0F0283628" width="100" height="100"></object>
  2. 發現在特定機器上,這個OCX無法顯示,出現方框紅X,代表物件建立有問題,在其餘機器上則正常顯現。很好,可明確重現的問題,不會太棘手。
  3. 為排除IE安全設定因素的干擾,我寫了一段VBScript
    Set ocx = CreateObject("MSComctlLib.ListViewCtrl.2")
    發現在問題機器上會爆出0x80040112的錯誤而無法建立物件。正常機器則無此狀況。
  4. 查詢0x80040112與License有關,問題的大方向確定,集中火力Google MSCOMCTL.OCX的License相關文章。
  5. 找到這篇Microsoft KB,依上面的指示在Visual Studio.NET 2003的光碟上找到Extra\VB6 Controls\VB6Controls.reg,複製到問題機上匯入。
  6. 匯入完成後重啟IE,莫名其妙出現在網頁裡的ListView控件終於現身了。
【考古系列】中古世紀的電腦書籍

考古工作持續進行,又有部分古籍出土,資源回收前再來一次巡禮。由左到右,由上而下依序為:

  • IBM PC/XT組合語言入門
    買這本是為了學著用組合語言寫畫直線邏輯,讓BASIC呼叫,以求較佳的執行效能。
  • 33個IBM PC BASIC遊戲程式設計
    本書的使用方法是要照著把畫上數百行的程式一個字母一個字母輸入到電腦裡,且常常因為打錯字程式跑不起來(有些我懷疑是書上漏印或印錯)。總之,辛苦的Key In及校稿工作在撐了幾個短程式就半途而廢了。
  • IBM PC BASIC電腦繪圖入門
    也是要輸入數百行程式才能看到結果,尤其裡面大部分是透過READ、DATA指令輸入座標,枯燥得很。不過至少看到哪一點歪掉可以大概追出哪一部分出錯,比前一本遊戲程式好Debug許多。後來我受到啟發,自己買了方格紙,描了戰鬥機圖片算座標,也在電腦上搞出一台戰鬥機來。
  • PASCAL程式設計入門與應用實例
    我的PASCAL入門書。節儉成性,買電腦書淨挑便宜的薄書,書寫得好不好常放在其次,幸好我的程式沒有因為貪小便宜而誤入歧途。
  • MS DOS 3.1使用手冊
    了不起吧?! MS DOS 3.1的手冊耶~~~ DOS 3.1,用過的人不多,有正版的更少,原文手冊還留著的更如鳳毛麟角。
  • 倚天中文系統使用手冊
    當天倚天採取睜一隻眼閉一隻眼的防盜版策略,攻下了可觀的市佔率,靠賣手冊應該有小小補了一點血。
  • 龍碟中文系統手冊
    跟我的第一台電腦小教授MPF 500一起附贈,號稱價值近兩千元的中文系統。有段小插曲是當年年紀小兼浩呆,連廠商忘了附贈都不自知,還乖乖地帶了血汗錢要去電腦店買,店員大概第一次聽說有傻瓜要掏錢買這套破爛贈品,大驚之下連忙追問,這才快快雙手奉上。(哼! 算你還有點良心!)
Posted 05 May 2009 01:59 AMJeffrey | 1 comment(s)
Filed under:
掃很大 掃不用錢 的全面式病毒檢測

雖然有點Lag,但我最近才知道有這種服務

當你發現一個懷疑內含病毒或木馬的檔案,上傳過去,就會有善心人士程式一口氣幫你用全世界的掃毒軟體掃過一輪,很美妙吧!?

今天遇到一台安裝Avast的XP在瀏覽某個JPG檔時彈出含毒訊息,但同一圖檔在我安裝AVG的Vista上卻沒警示。一時興起,剛好拿這個可疑檔案來練兵,於是連到http://www.virustotal.com 上傳檔案後,耐心等候,網頁上開始一一浮現各家掃毒程式的檢查結果。結果是40種掃毒程式裡有9種說有毒。是否為誤判? 還是不得而知,但至少它畢其功於一役,讓全天下的掃毒程式舉手投票,最後再交給聰明的您做最後裁決。

要防堵含毒JPG,除了安裝防毒軟體外,記得要勤做Windows Update、CPU支援的話就開啟DEP,如果OS是Windows Vista,UAC也可在關鍵時刻發揮一些作用,盡人事後,餘下的就聽天命囉。

【考古系列】塗鴉人生

老家最近要整修,許多埋藏多年"古代遺蹟"陸續"出土",看到老東西,中年人多愁善感的惡習又復發了。年少往事一幕幕湧上心頭,心中五味雜陳...

最近會把一些考古發現貼上來,算是將自己的人生歷程用電子形式留下記錄,以發思古之幽情。PO文主要是為了紀念自己的人生,閒來沒事的人可以加減看,一秒鐘幾十萬上下的朋友請略過本文去做正事。

翻到一堆夾在教科書中的筆記紙,在筆記空白處有不少信手塗鴉,題材還挺多樣化的。像是中國武俠魔幻風(這陣子線上遊戲中國武俠題材又開始發燒,但這可是我十幾年前的晝作,很有前曕性吧?)、暴力美學風...

 

抄筆記時,我喜歡找機會練習畫圖,為筆記加上精美插圖,調劑枯燥的上課時光。但偶爾筆記紙上的塗鴉會多過上課內容,意味著當時整顆心已經去四海雲遊了~~~(老師,我對不起您!)

 

木訥內向卻愛搞笑的性格,學生時代就可見一斑。

最後,在課本中發現這張Q版12生肖,忽然覺得,如果網路能早十年發達起來,說不定我有機會跟彎彎平起平坐。(謎之聲: 你會不會想太多了,快點去研究Silverlight比較實在吧?)

Posted 03 May 2009 02:54 AMJeffrey | 3 comment(s)
Filed under:
T610,最後的絢爛~~~

我現在用的手機是T610,當初會來報到,是因為它學長Sony J70雖然在洗衣機大冒險後歷刧重生,但卻留下麥克風接收不良的後遺症,搞得每次講電話都像在砲火陣地講拐拐,吼叫嘶喊到旁人側目,對方還不一定聽得清楚。這可讓我斯文有禮的形象一夕崩潰,自然非同小可,於是T610衝著它外型時尚、重量輕巧及四五天換一次電池的驚人省電性雀屏中選。

但算算這機子也用了五年多了,半年來開始冒出些小毛病,常常會莫名自動重開機,或忽然抱怨不認得SIM卡,再不然就是當機到要拔電池重插SIM卡才能解除。但往往被搞到火大想換手機的前夕,它又忽然乖了起來。

勞動節放假前一天,下班前T610手機的電池圖示呈現紅色,就想順手換一下電池免得假期中電力不足。熟練地換上電池,卻發現再也開不了機。先是以為換上的電池沒電,但換回原電池,猛按電源鈕還是一聲毫無動靜。反覆換電池、拔SIM卡、輕敲機身,胡亂試了十來分鐘,也沒能改變事實。啊!,T610,它離開我了。

換下電池後忽然人機永隔實在太過突然,讓人徹底措手不及!! 如果它是從手中滑落,在地上爆完零件才斷氣,我能理解牛頓定律的不可憾動與電子產品的脆弱易碎,自能默默接受;如果它是當機頻率愈來愈高,然後在某次當機後長眠不起,我能體會歲月的無情與愛別離的苦楚,當可淡然處之。哪有這個樣子,已經一兩個月沒當過機,不過是去換條牛仔褲,就忽然與世長辭?

不死心地試到20分鐘,T610忽然又醒來了,但已中風到胡言亂語,畫面整個花了,感覺上按鍵操作都還正常,但是畫面顯示全亂。我一心想的是,來不及備份的電話簿要怎麼救出來?

功能都還可用,所以應該可用FMA把電話簿同步出來。但問題來了,這得啟用藍牙或紅外線傳輸。螢幕看不到下,要如何矇著眼睛打開藍牙或紅外線? 找另一隻T610比對,或有T610的選單說明書都成。一時也找不到有T610的人,而講到T610手冊才氣人,在我家閒置了五年,年前大掃除時心想再也用不到,才丟資源回收沒多久就又忽然需要它了。我很有毅力的Google了近四個小時,終於找到一個神奇的網站,裡面居然搜集了各式手機選單的資料。按下【選項 -> 下 -> 下 –> 確定】的密技,終於,FMA透過紅外線傳輸與無法說話的垂死T610比手語,撐著一口氣將電話簿交回到我手上。

我深信此刻的T610已經羽化成仙了,不信你看它的關機畫面多絢爛?

由畫面錯亂的狀況來看,很像螢幕VGA同步壞掉的狀況,在電話簿救回後,我打算放心大膽來個手術看看有無挽救的機會! 感謝Internet時代創造出難以想像的資訊交流性,我竟能找到了一段T610拆解影片,加上一份詳細的換殼圖說(感謝!!!)。照著實作,當拆下上背蓋後,按了電源鈕試試,熟悉的畫面居然又回來了。

T610,你這殘忍的小東西,不許不許再這樣離開我了!!
(話雖如此,我把這次當成老天爺給的額外機會,是該展開新機Survey的時候了,誰知道下回再遇上,還有沒有機會回天?)

Posted 02 May 2009 06:10 PMJeffrey | no comments
Filed under:

搜尋

Go

<May 2009>
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication