2010年12月10日 星期五

冰箱 Get!

冰箱、食材


冰箱啊~這是多麼奢侈的設備啊。記得大學時期,好像是升大三還升大四時,室友在校園討論板上,終於!搶到了冰箱,一行人推著推車很高興地去跟學長買二手的,我記得好像賣 1200 的樣子,還附一個烤箱跟平底鍋,當時室友們都很黑皮!對我而言倒覺得還好,因為我只三餐偶爾宵夜而已,並且不怎喝飲料,冰箱對我而言真的有跟沒有是一樣的。後來,過了幾個月後,那台冰箱的使用度真的降到了冰點,除了一開始很黑皮冰的飲料外,好像就沒什麼特別了。


直到幾天前,多虧同事的幫忙,在公司的討論網上終於買了一台二手冰箱,且賣冰箱的正巧一年前坐在我座位附近,真巧啊!就這樣重複著大學時的步驟,借推車、運冰箱和定位。對了,搬冰箱最好搬完靜待一會兒喔,所以我是隔天下班後才正式啟用它。


據同事的說法,擔心冷藏不冷,所以不怎使用,因此,第一件事就是冰塊的測試 XD 空蕩蕩的冰箱只冰那一小盤的生水。慶幸地,一切 OK ,就算我把冰箱的強度降到最低,早上的生水,下班時還是會結冰,看來運氣不錯。


沒多久後,就跟同事去賣場,買了一包僅 49 元的韭菜水餃,成了第二住進冰箱的食材。今晚上班就去附近的果菜賣場買了相關的工具,如鍋、瓢子等設備,順便試了買了一包料理包以及一把青菜和一包豆皮,看來未來又有東西可學了,來煮點東西訓練一下。


2010年12月1日 星期三

[Javascript] 使用 jQuery 把表單資料紀錄在 cookie 裡

做了一個有很多選項要填寫的表單,但由於一些環境上的考量,有點懶的把已填寫過過得表單資料記錄在 server 端,因此就想到稍微惡搞一下,把表單資料都紀錄在 client 上!由於該表單也沒有啥機密資訊,所以也不用太擔心什麼。


紀錄方式:


當使用者按下送出表單的那一刻時,除了會加上一些判斷,確認資料是否有輸入完整,而後可以做的小動作就是把表單的資料都儲存在 cookie 裡,以後有需要可以從 cookie 撈出來幫忙填寫。


相關環境:



  • jQuery

    • <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script>



  • jQuery Plugin - Cookie (非必要)

    • <script type="text/javascript" src="http://plugins.jquery.com/files/jquery.cookie.js.txt"></script>

    • 自己管也可以,但我有點懶的回顧 cookie 語法,就改用這個 plugin 啦,用 $.cookie( 'Name' , 'Value' , { path: '/', expires: 365 } ); 儲存,用 $.cookie( 'Name' ) 取回數值




用法:


<form method="POST" onsubmit="return checkData();">
    <dl>
        <dt><button onclick="reload(); return false">讀取前次資料</button></dt>

        <dd>&nbsp;</dd>


        <dt>姓名</dt>
        <dd><input class="cookie" name="builder_name" style="width:50%;"/></dd>
        <dd>&nbsp;</dd>

        <dt>喜愛運動</dt>
        <dd>
            <select class="cookie" name="status">
                <option value="0" selected>否</option>
                <option value="1">是</option>
            </select>
        </dd>
        <dd>&nbsp;</dd>


        <dt>狀態</dt>

        <dd><input type="checkbox" name="status"/> 已婚</dd>
        <dd>&nbsp;</dd>

        <dd>&nbsp;</dd>

       
<dt><button type="submit">執行</button></dt>

    </dl>
</form>


<script type="text/javascript">

function checkData()
{
    // ... do check ...

    // ... do save ...
    save();

    return true;
}

function save()
{
    $( '.cookie' ).each( function(){
        var target_cookie = '__' + $(this).attr('name');
        var data = $(this).val();
        if( $(this).attr('type') == 'checkbox' )
            data = $(this).is(':checked') ? 'on' : 'off';
    
        $.cookie( target_cookie, data , { path: '/', expires: 365 } );
        //console.log( target_cookie +' : ' + $(this).attr('type') + ' : ' + $.cookie( target_cookie ) + ' : ' + data );
    });
}

function reload()
{
    $( '.cookie' ).each( function(){
        var target_cookie = '__' + $(this).attr('name');
        if( $.cookie( target_cookie ) )
        {
            if( $(this).attr('type') == 'checkbox' )
            {
                if( $.cookie( target_cookie ) == 'on' )
                    $(this).attr('checked', true);
                else
                    $(this).attr('checked', false);
            }
            else if( $(this).attr('type') == 'select-one' && $(this).get(0) && $(this).get(0).options && $(this).get(0).options.length )
            {
                var data = $.cookie( target_cookie );
                var options_list = $(this).get(0).options;
                for( var i=0 , cnt = options_list.length ; i<cnt ; ++i )
                {
                    if( options_list[i].value == data )
                    {
                        $( options_list[i] ).attr( 'selected' , 'selected' );
                        break;
                    }
                }
                $(this).trigger('change');  // 有些 select 可以搭配 change 事件
            }
            else
                $(this).val( $.cookie( target_cookie ) );
            //console.log( target_cookie +' : ' + $(this).attr('type') + ' : ' + $.cookie( target_cookie ) );
        }
    });
}
</script>


如此一來,就可以儲存表單文字、checkbox以及 select 等,都可以處理。這邊比較投機的是對要儲存的表單,多設一個 class 數值,用來讓 jQuery 準確地撈出來。


2010年11月27日 星期六

iPhone 開發教學 - 框框圓角、置中和自動調整大小

autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight setCornerRadius


很久沒練習 iPhone 程式,大概有半年吧?剛好無意間看到片斷的程式,就順便記錄一下。


這兩張圖共三個重點:



  • 中間顯示的框框是有圓角的

  • 框框無論 iPhone 擺在哪,都可以置中

  • 無論直看或橫向,框框都會自動地調整填滿


程式碼:


@untitled.h (新增一個 UIViewController)


#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface untitled : UIViewController {
        UIView *_blockerView;
}       
        
@end


@untitled.m


- (void)viewDidLoad {
    [super viewDidLoad];
    CGSize _blockerViewSize = CGSizeMake(250, 450);

    if( UIInterfaceOrientationIsLandscape( [[UIDevice currentDevice] orientation] ) )
        _blockerViewSize = CGSizeMake(450, 250);
        
    _blockerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, _blockerViewSize.width, _blockerViewSize.height)] autorelease];
    _blockerView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.8];
    _blockerView.center = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2);
    _blockerView.clipsToBounds = YES;
    if( [_blockerView.layer respondsToSelector:@selector(setCornerRadius:)] )
        [_blockerView.layer setCornerRadius:10];

    _blockerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    [self.view addSubview:_blockerView];

}

- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation {
    _blockerView.center = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2);
}


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return YES;
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


各項部分:



  • 圓角

    • #import <QuartzCore/QuartzCore.h>

      if( [_blockerView.layer respondsToSelector:@selector(setCornerRadius:)] )
          [_blockerView.layer setCornerRadius:10];



  • 置中

    • _blockerView.center = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2);

    • 並且實作兩個對應函數

      • - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

      • - (void)didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation





  • 自動調整大小

    • _blockerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;




此部分常用在呈現 loading 或 waiting 的訊息,此時顯示黑色框框,大部分大小會調整成小型的正方型,不需要自動調整大小的功能,僅需置中即可,但如果需要疊一層圖層避免使用者點選到後面的部分,那就會需要自動調整大小的功能,以符合當下顯示或阻擋的大小。用法就跟在 Web Programming 上,使用 div 圖層顯示資訊或擋住不讓使用者點選到其他功能。


2010年11月22日 星期一

尋根?

假期度過了一半,我還在尋根嗎?


這些日子,聽週邊的朋友道述務農跟畜牧所掙錢的故事,發現有地真好!可以從事自己想做的事,也可以自給自足。記得一年前碰到務農的朋友,他跟我說,有些事現在不做,以後就沒辦法做了。我很認同他的感受,但我手邊卻沒有那對應的資源啊。


至於會不會羨慕呢?我不是很確定自己的感受,好像是又好像不是。記得幾個禮拜前的婚禮,當大家閒聊務農的收入時,某位 A 直接問某 B 會不會因此想務農,某 B 非常直接地回應:不會!某 B 還是喜歡台北的便利性。我真佩服這樣的人,很爽朗地回應,並且非常清楚自己想要的是什麼。我大概幾年之內還是會為錢而作事吧。


別人常說,要嘛為興趣工作,要嘛為錢工作。但是,愛錢不也是一種興趣嗎?別人常常會稱讚那些廢寢忘食鑽研自己興趣的人,卻總是用低俗的眼光看待那些為錢工作的人,例如賺錢買藥 :P 不曉得這是不是酸葡萄的反應呢?


我到現在還是沒有很執著於所學的行業,記得大學畢業那年,我甚至只想找一間制度不錯,可以努力升等的場所就好,偏偏我現在的環境不是努力就能升等的場所,因為最基本的升等條件是博士學歷 :P 但相對之下也還有其他優劣啦,至少我還能樂在其中吧!


晚上跟學弟聊天,才有想起來自己有點想從事傳統業的小想法,並且認為資訊能力啊,不該只是用來呈現多絢麗的技巧或成品,我反而還滿喜歡用來解決生活的小問題。希望兩年內自己能夠越來越清楚自己真正想要的是什麼,並且好好地執行下去。


2010年11月21日 星期日

PCMan Combo - 開不起來、Runtime Error

印象中,我以前在 Windows XP 時,用 PCMan Combo 偶爾會發生 PCMan 開不起來的問題,當時的解法就只是重新安裝 PCMan 就可以解決了,但這次碰到一位在 Vista 環境使用 PCMan Combo,發生 Runtime Error 的訊息,但透過重新安裝 PCMan 也無法解決,之後在 Ptt Ask 板看到解法:



  1. 刪掉 C:\Users\使用者帳號名稱\AppData\Roaming\PCMAN Combo 目錄

  2. 重新安裝 PCMan Combo


經測試的確可以解決。


話說我也好一陣子沒用 PCMan Combo 版,比較常用 PCMan Lite + Firefox/Google Chrome/IE,只是工作後也比較少逛 BBS 了,獲取再過一陣子就只會用 Firefox plugin 了