Search

6/30/2012

鋒芝婚變進行曲 @ 王大師論壇 :: 痞客邦 PIXNET ::

鋒芝婚變進行曲 @ 王大師論壇 :: 痞客邦 PIXNET ::

電影《真愛旅程》我大概看過10遍,每看一次,就對婚姻有不同見解。劇中兩位夫婦一開始就在太太失敗的舞台劇演出後,吵得不可開交,本來一度想打圓場的老公,最後按耐不住脾氣,破口大罵妻子的爛演技不可怪他,妻子也回以若不是這位幼稚男孩的關係,她可以有更寬廣的發展空間,兩人就在高速公路上吵得不可開交。 這兩位夫妻一開始認識時,是鎮上人人稱羨的夫婦;男的風趣、瀟灑、有創意,女的美麗、大方、有才幹,而這兩位也真的深信自己與眾不同,凡是皆想比別人更高一等,但現實總要將雲端的牛郎織女給拉下地球;不久後,先生發現自己有如之前嗤之以鼻的老爸,過著無聊又一成不變的朝九晚五,太太則是兩位小孩的媽,甚至一度懷疑自己當母親後,終將斷送前程而打了墮胎的念頭。 最後兩位因為爭執是否應該放棄先生手邊的工作,而追尋去巴黎當作家的夢想,但先生認為如此的出走過於躁進,他甚至認為整個計畫只是太太想要逃離在美國郊區當個傳統太太桎梏的技倆,兩人又起了一場大爭執,當中一段對話耐人尋味。先生跟太太說:『我們一直想當與眾不同的夫婦,想比別人強,比別人更不一樣,可是事實上,我們跟其他的夫妻一樣空虛。』 此時太太回:『我倆一起相處多年,在生了第一胎後,為了要證明這婚姻不是個錯,又生第二胎綁住彼此,但事情有好轉嗎?我發覺,我們一直知道婚姻的真相;這些年來,我們並非更釐清事實,而僅是發現維持婚姻的方式,是當個更棒的說謊者罷了!』 當然,這部戲的結局並不樂觀,太太最後因為無法逃脫現實而墮胎自盡,先生則受刺激過大導致精神異常。 這就是將婚姻物化的結果,一個急需對方符合自己期望、夢想,甚至藉由爬在別人的自尊上,建築自己婚姻的價值,就是物化的具體表現。男的要漂亮的太太、賢慧的媽媽、見的了世面的妻子;女的則要風趣的先生、美麗的豪宅、發亮的鑽戒、顯赫的地位。雙方都希望從另一半的價值中實現自我,可是問題是,這世界並沒有人是為了要迎合另一半而存在的。 在看到鋒芝婚變事件後,不知為什麼的讓我想起這部電影。聽說霆鋒兄號稱「墨鏡影帝」,他一定得帶著墨鏡才能自在的『做自己』,而這自己又是誰呢?在演了螢光幕前那麼多的角色後,也許他已經不知道那個才是真正的自我,像足了金庸小說的另一鋒,『歐陽鋒』所云:『誰是我?我是誰?誰是謝霆鋒?謝霆鋒是誰?』 那何謂神聖的婚姻呢?若以刪除法而言,很簡單,就是一切將物化標準移開者皆是也。這本來就那麼簡單。文末,為更能具體箇中滋味,我分享一句林語堂的話,此為最貼切的畫龍點睛之見,其云: 「在婚姻裡尋覓浪漫情趣的人,會永遠失望;專心做良好而樂觀的伴侶的人,卻會在無意中得之。」 所言雖不多,然玩味無窮。

6/27/2012

最後的六年級生: 年輕人,你應該在台北買房子嗎?

最後的六年級生: 年輕人,你應該在台北買房子嗎?

先說結論:除非那筆錢對你來說5~10年就能賺到,否則不應該。 民國六七十年的時候房價 150多萬,薪水1.5萬,跟現在房價1000多萬 、薪水了不起5~6萬比,我想現在買房的壓力起始點比過去大了一倍有。 更可怕的是,當年貸款買房假設欠銀行100多萬,乘上利息,用最誇張的去算,了不起200多萬。過個十年二十年,以那個年代的薪水成長速度,這200萬每個月的貸款佔薪水的比例會掉很快。也就是說以我父親那個年代買房的時間點起算,10年後他的薪水一年搞不好都逼近60~70萬了。不吃不喝可以4年付清。 我們這一代的薪水漲幅呢? 過去十年的幅度(不升反降)對上目前台灣產業的近況,答案很清楚。 1000萬要能不吃不喝4年還完一年就是200多萬,這可是台灣前4%的人的薪資水平。 要能在十年內變成50%的人的薪資水平...我對台灣的潛力沒那麼有信心。 以現在房價/月租金比率高達700+的情況來看,最好的買自住房策略就是台北租房,有多少需求才租多大的房子,退休後離開台北市,去別的地方買房子。 畢竟台南台中買一棟不錯的公寓(350萬),對上台北的房租1.5萬大概是: (台南房價/ 台北月租) = 350 / 1.5 = 234(個月) 假設我們在台北很懶,得花上234 * 1.5 個月才存的到退休老本與一棟房子,那麼將 在台北租房子的租金(234 * 1.5)加上買房子的錢(234 * 1): 234 * (1 + 1.5) = 585 這還是比700+小,打了八折有,而這將有以下好處: (以下觀點只考慮自住、不考慮投資眼光) 你一開始付的只有租金。 那麼只要台灣總體薪水不漲,房價漲再兇也不可能漲房租。 台灣這麼小、對上交通發達的程度與人口遷徙變化,漲了只會導致空屋率而已。 所以我們設定一個月付多少房租多少錢就是多少錢,不要怕別人炒樓,漲就搬就對了,不要怕找不到,台灣人就剩這些了,未來20年只會越來越少,最後租屋市場就是這些越來越少的人玩大風吹哪裡便宜哪裡搬而已。 (就算總體薪水漲了導致房租漲,那只要你的薪水漲幅有追上大環境,你也不用擔心) 房價跌越多你越高興。 別人的失敗就是你的快樂,他們越失敗、導致欠債、法拍,你的未來就越爽。不要忘記你根本還沒付出半毛錢到房子裡,他們失敗的越慘你的未來越光明。你手上的現金放越久、累積的越多,對他們吸引力就越大,越能談到好價格。 現金折舊的速度風險遠比房屋好,未來的錢,現在不要花掉。 有人說,房子可以抗通膨,那個前提是你是『真的擁有』它,而且『隨時可變賣』的時候。 台灣房價可以抗通膨有很大的原因是台灣政府沒有盡責將土地增值的財富做重分配,導致很大的炒作空間,可以一直炒高的東西當然抗通膨。然後是台北市自住的一堆、建商又養地,一堆老人在那邊說:『要賣要賣多少』,但人卻仍住在屋子裡根本就不會賣,造成房價有行無市。這些因素對上歷史相對高點的房價,我不認為『現在的房子』是保值抗通膨的。什麼時候跌掉不曉得、一般自住的房子要賣還很難賣。 回歸主題,以自住的觀點去考慮通膨什麼的根本就是本末倒置。你真該去想的是:『準備一個可以接受,我老了沒有固定收入時可以住的地方,要付出的最小代價有多少?』這是你給很久以後未來的你要住10幾20 年的地方,你可以現在準備錢,但你如果只是普通人,不是什麼地產大亨還是有個水晶球可以預言未來那就不應該現在把頭押下去。 當你在台北市工作了20年決定要買房子的時候,你滿手現金,高興怎樣就怎樣。 而那些擺脫不了舊觀念就是要在台北買房自住的,就要幾十來年提心吊膽,背負沈重的債務,在台灣未來產業不確定、未來工作不確定、未來哪裡興盛繁榮不確定的情況下,現在就作決定,只為了: 『付房租的錢好可惜、自住順便抵房貸不是很好嗎?』 他們沒想到的是他們把自己的社會信用、40%~60%的收入都給抵押給銀行了,使得自己對未來的風險一點掌握能力都沒有。這20年的青春打拼人生同時也是人生中最有價值的時刻,而他們在一開始就把它可以有的可能性、自由度給賣掉了。

Understanding Hash Functions and Keeping Passwords Safe | Nettuts+

Understanding Hash Functions and Keeping Passwords Safe | Nettuts+

Problem #2: Rainbow Tables
$password = "easypassword";  
  
// this may be found in a rainbow table  
// because the password contains 2 common words  
echo sha1($password); // 6c94d3b42518febd4ad747801d50a8972022f956  
  
// use bunch of random characters, and it can be longer than this  
$salt = "f#@V)Hu^%Hgfds";  
  
// this will NOT be found in any pre-built rainbow table  
echo sha1($salt . $password); // cd56a16759623378628c0d9336af69b74d9d71a5  
What we basically do is concatenate the “salt” string with the passwords before hashing them. The resulting string obviously will not be on any pre-built rainbow table. But, we’re still not safe just yet! Problem #3: Rainbow Tables (again) Even if a salt was used, this may have been stolen along with the database. All they have to do is generate a new Rainbow Table from scratch, but this time they concatenate the salt to every word that they are putting in the table. For example, in a generic Rainbow Table, “easypassword” may exist. But in this new Rainbow Table, they have “f#@V)Hu^%Hgfdseasypassword” as well. When they run all of the 10 million stolen salted hashes against this table, they will again be able to find some matches. How can this be prevented? We can use a “unique salt” instead, which changes for each user. A candidate for this kind of salt is the user’s id value from the database:
$hash = sha1($user_id . $password);  
This is assuming that a user’s id number never changes, which is typically the case. We may also generate a random string for each user and use that as the unique salt. But we would need to ensure that we store that in the user record somewhere. This method protects us against Rainbow Tables, because now every single password has been salted with a different value. The attacker would have to generate 10 million separate Rainbow Tables, which would be completely impractical.

6/18/2012

Dillinger, the last Markdown editor, ever.

Dillinger, the last Markdown editor, ever.

Dillinger ========= Dillinger is a cloud-enabled HTML5 Markdown editor. - Type some Markdown text in the left window - See the HTML in the right - Magic

Feed Gaming - Facebook developer

Feed Gaming - Facebook developer

Developers can leverage in-feed gaming to create engaging stories for users. This involves publishing a story on behalf of a user which has a flash object attached. When a user's friends see these attachments, they will be able to click to play them inline. This opens up some interesting scenarios for a small embeddable version of your game to be shown to a user's friends, at the end of which you can encourage them to click through to your canvas app. Example posts from real games: Angry Birds lets users challenge friends to beat your score on a level. Try now.

軟體公司該這樣做:領導你的員工、而非管理他們

軟體公司該這樣做:領導你的員工、而非管理他們

軟體公司不能這樣經營 腦力密集的工作者型態,跟勞力密集工作者的型態完全不相同。勞力密集工作者的生產力,基本上是以工時在計算,工時越長,能組裝的零件越多,一翻兩瞪眼;腦力密集的工作者,卻沒有辦法用工時計算生產力。尤其是程式設計師,寫過 code 的人都知道,當你連續的工時拉得越長,你寫出來的 code 就越接近垃圾。等到你明天清醒了,你會很驚訝自己寫出的這堆垃圾,像是前一夜喝醉酒鬧事留下的爛攤子,然後你的隊友或是你自己,要花額外的時間把這些垃圾清掉或是重構 (refactor),結果整體的生產力,還比不上你早點去睡覺,早點起床後神智清醒的那短短幾個小時。 一個腦力密集的工作者能夠集中意志、進入「flow (心流)」狀態的時間是有限的,「flow」的概念已經反覆被討論,人一旦進入這個狀態,會發現意志極度集中、全世界與你隔絕、甚至於感受不到時間的流逝,在這段時間內,生產力達到顛峰。不過一旦脫離這個狀態,會需要花額外的一些時間才能再次進入,一天之中能維持心流狀態 8 個小時的人,已經算是超人了。開發軟體最重要的是腦袋有沒有清醒,而不是工時夠不夠長。站在經營者的角度,你要確定的是你的員工知道自己在做些什麼,而不是不讓他們回家。有些工程師喜歡晚上夜深人靜的時候拼進度 (我就是其中一個),有的人喜歡多一些面對面討論、不介意隨時被打斷。身為軟體主管,你得尊重每個人偏好的工作方式,你要做的是訂定清楚的目標和時程,然後隨時審視軟體的品質,至於工程師打算怎麼把東西生出來,是他們自己的事情。我不介意這些 code 是在上廁所的時候、還是乖乖坐在辦公桌前時寫出來的。 領導,而非管理 好的人才並不需要管理,他們需要的是領導,站在領導者的立場,最迫切的三件事情,就是給予好的人才最明確的目標、最大的彈性、和爭取最多的資源。剩下的,好的人才都會自動幫你完成。他們甚至會反過頭來告訴你,什麼是該做,什麼是不該做的。一個好的人才會幫你解決問題,一個不好的人卻會幫你製造更多的問題。如此一來一往,就決定了公司的命運,因此創業的初期,最重要的就是人,天大的 idea,如果你不能一個人完成,你需要的就是最棒的人才,組成一個真的能實現 idea 的團隊。idea 和執行力同樣重要。沒有人能保證任何 idea 一定會成功,但是如果沒把人找好,找到錯的人,失敗的機率鐵定大增。 好的人才最討厭人家管他們。他們自己有企圖心、自律、和執行力,你不用總是拉著他們的小手一同去郊遊,他們會自動把很多事情完成。 領導應該是明顯的,管理應該是隱諱的 軟體人才通常是一群很 free style 的人,但是身為領導者,應該要確實掌握住公司的方向願景,和制訂公司的發展策略,如此可以給公司員工清楚的目標,然後激勵他們,讓他們覺得自己真的是在做很棒的事情,這是領導。相較之下,軟體人才的管理應該建立在「制度」之上,而非建立在諸多「手段」之上。所以我把制度盡量簡化,並且致力於自動化重複性的管理工作,為的是盡量讓員工平常感受不到這些東西,有時間去做真正重要的事情,而非配合公司的重重規定作一些沒有生產力的事情。 「只有管不住自己的人,才需要別人管」,這也同時告訴我們,員工的自律,對於軟體公司是最重要的一個特質。 即使事實如此,很多人打從心底不相信公司可以這樣運作 Google 和許多成功的大公司,都是以這樣的一套哲學在經營公司,主管給予員工充分的自由,去完成訂定的目標。這並不代表放縱員工,而是代表員工必須有高度的「自律」,而不是「他律」去達成目標,因為公司依然存在著有效的淘汰和評量制度,能夠評判每個人的成果,目標沒有達成或是打混摸魚的人,都會攤在眾人眼前,這樣的環境,讓員工擁有高度的自由,但同樣是一個競爭激烈的環境。重要的是,這樣的環境可以讓員工充分發揮創意和獨立思考,用自己的方式去達成目標。軟體的本質本是如此,需要創意和獨立思考,才能創新和創造;也只有用這樣的方式,才能留住你的人才。 全世界都在喊著創新與創造,台灣更是不落人後,許多電子公司想要跨入軟體的領域,政府也拼命喊著文創的口號,要讓台灣成為設計島和創意國。但是這些機構和公司對於軟體公司的文化卻所知不多,也缺乏實踐,結果傳統的硬體文化和軟體文化格格不入,嚴重限制了軟體工程師能發揮的空間。造成軟體業始終沒辦法向上提升, 台灣很多公司普遍認為員工就是該被管,該被公司的重重規範用力綁住,才能為公司帶來生產力,這在軟體公司完全行不通。身為老闆,我們都有一種直覺,認為「員工工時越長,公司越划算」。但是,是時候做出違反直覺的決策了:給你的員工清楚無比的目標和設定公正有效的評量機制,剩下的,就不要管太多了吧。

How 30 days without Social Media changed my life by Steve Corona

How 30 days without Social Media changed my life by Steve Corona

My goal for giving up social media was to create more value in my life, quit hoarding information, and appreciate the time that I spent with friends. So, full disclosure- I briefly used Facebook and Twitter 5 times during my haitus to pimp blog posts, and I'm okay with that, because it was for the sole purpose of sharing value (and getting more pageviews, duh). What's my plan now? Well, I'm back on social media. It's nice to finally see “that picture that Ryan tagged me in”. But I don't want to go back to my old routine, the new one is so much better. I love creating things- code, art, writing, whatever. I want to keep doing that, because the act of producing, being a maker, has changed my life. If I want to read or post on social media, I will do it consciously and thoughtfully- so I won't be using Twitter or Facebook from my phone. And no more Reddit. Like, it provided absolutely 0 value to me. I love the information diet that I'm on and all I need to do is not plug back in.

Subtle Patterns | Free textures for your next web project

Subtle Patterns | Free textures for your next web project

6/16/2012

mockJSON

mockJSON - 可以依照既定或自己定義的 data set, random 回傳一組回來

MockJSON is a plugin for jQuery that can hijack JSON and JSONP requests and respond with randomly generated JSON data. Completely random JSON would be pretty useless of course, so you can specify a JSON template for each request. On the right you see an example of such a template and some generated output.
$(document).ready(function() {

    var template = {
        "fathers|5-10":[
            {
                "married|0-1":true,
                "name":"@MALE_FIRST_NAME @LAST_NAME",
                "sons":null,
                'daughters|0-3':[
                    {
                        "age|0-31":0, 
                        "name":"@FEMALE_FIRST_NAME"
                    }
                ]
            }
        ]
    };
    
    $.mockJSON(/mockme\.json/, template);
    $('#template').text(formatJSON(template));


    $.getJSON('mockme.json', function(json) {
        $('#result').text(formatJSON(json));
    });
});
    

Moment.js

Moment.js - A lightweight (4.3k) javascript date library for parsing, manipulating, and formatting dates.

moment().format('dddd, MMMM Do YYYY, h:mm:ss a');
moment().format('dddd [on the] wo [week of the year]');
moment().format("MMM Do 'YY");
moment().format(); // defaults to ISO-8601

肝的致命傷原因! 請耐心的把它看完~

肝的致命傷原因! 請耐心的把它看完~

肝的致命傷 原因如下: 1 .晚睡晚起為最大致命傷。 2.早上不排便。 3.暴飲暴食。 4 .不吃早餐→透支體力而不自知。 5 .服用藥物過度。 6 .防腐劑、添加物、色素、人工甘味(如:沙茶醬)註 1 。 7 .不當的油脂(如:沙拉油為不穩定油),烹調盡量少用油,即便是好油,如:橄欖油。疲倦時不吃油炸物,若要吃趁精神好時吃。 8 .不生食(完全熟食)亦不利肝。青菜生吃或煮三分或五分熟,炒過的青菜當天吃完,不要隔夜吃。 9 .錯誤的價值觀,只追求卓越,欠缺和平、博愛。 1 0.急躁。 要做到,完全不需花錢,只要注意起居與飲食習慣的調整。食療加上時療,讓身體在正確的時間內主動進行吸收與排毒的動作。 原因: 晚上 9- 1 1 點為免疫系統(淋巴)排毒時間,此段時間應安靜或聽音樂。倘若此時,作母親的仍處於焦慮狀態,如洗碗盤、盯孩子功課,對健康不利。 晚間 1 1-凌晨1 點 肝的排毒,需在熟睡中進行。 凌晨 1-3點 膽的排毒亦同。 凌晨3- 5 點肺的排毒,此即為何咳嗽的人在這段時間咳得最劇烈;因排毒動作已走到肺經,不應用止咳藥,以免抑制廢積物的排除。 凌晨 5- 7 點 大腸的排毒,應上廁所排便。 早晨 7- 9 點 小腸大量吸收營養的時段,應吃早餐。療病者最好早吃,在6點半前,養生者在7點半前,不吃早餐者應改變習慣,即使拖到 9 、 10點吃都比不吃好。 晚睡晚起 混亂整個排毒過程;另外,半夜至凌晨4點為脊椎造血時段,必須熟睡,不宜熬夜。 肝炎有四個現象 若有以下任何一個現象 經常性的發作時要注意 一、 右上腹悶痛 二、 右後腰酸痛 三、 右肩感覺酸、麻、痛,甚至造成右手舉不起來 四、 小腿晚上睡覺時,容易抽筋 肝臟出現問題時,我們的身體會產生的現象會有:肝臟像拳頭一樣,有正面,有背面,正面如果硬化、腫大,會擠到我們的肋間神經,肋間神經就會脹痛;如果在背後,會造成右腰酸痛。 全身的筋,都由肝臟主管,晚上血液必須進到肝,若肝臟有問題,血液進到肝臟會比較困難,所以翻來覆去睡不著;血液好不容易進入肝臟,出去也相對的困難,全身的筋需要血來滋養,人在睡覺翻身的時後需要動,動就需要血液提供,血液不容易從肝臟出來,筋就會僵硬,僵硬過度就會抽筋。 肝臟不好,晚上睡眠品質會不好,翻來覆去不容易睡著;起床後口乾、口苦、口臭,刷牙時牙齦會流血。平常為食物沒有興趣,不吃不餓,吃一點點就有飽感;走路走個兩步小腿就會很酸,會感覺全身越來越疲勞,手腳也是越來越沒有力。 肝臟不好的人,腳會經常扭到,扭到了又好不了,不小心割傷了,傷口也不容易癒合。 喜歡喝酒的朋友,忽然酒量減少了。或是有久治不癒的皮膚病,週而復始好不了,都要注意肝。

Best Taiwanese food | CNNGo.com

40 Taiwanese foods we can't live without | CNNGo.com

1. Braised pork rice (滷肉飯) 2. Beef noodle (牛肉麵) 3. Oyster omelet (蚵仔煎) 4. Bubble tea (珍珠奶茶) 5. Coffin bread (棺材板) 6. Slack Season danzai noodles (擔仔麵) 7. Pan-fried bun (生煎包) 8. Gua bao (割包) 9. Iron egg (鐵蛋) 10. Pineapple cake (鳳梨酥)

6/14/2012

jquery 1.7's callbacks feature demystified

jquery 1.7's callbacks feature demystified

function fn1(val) {
     console.log('f1 says: ' + val);
}
function fn2(val) {
     console.log('f2 says: ' + val)
}

var callbacks = $.Callbacks();
callbacks.add(fn1);
callbacks.fire('foo!'); 
// output: f1 says foo!
callbacks.add(fn2);
callbacks.fire('bar!');
// output:
// f1 says: bar!
// f2 says: bar!
flags: "once" – ensure the callback list can only be called once (整個list的funtion只會被執行一次, 後來加進來的也不會執行) "memory" – ensure if the list was already fired, adding more callbacks will have it called with the latest fired value 新加入的 function 先執行已經fire的event, list 裡面的 funtion 再執行 "unique" – ensure a callback can only be added to the list once "stopOnFalse" – interrupt callings when a particular callback returns false flags - once:
var callbacks = $.Callbacks("once");
callbacks.add(fn1);
callbacks.fire('foo');
callbacks.add(fn2);
callbacks.fire('bar');
callbacks.remove(fn2);
callbacks.fire('foobar');
// ouput:
// foo 
flags - memory:
var callbacks = $.Callbacks('memory');
callbacks.add(fn1);
callbacks.fire('foo');
callbacks.add(fn2);
callbacks.fire(''bar'');
callbacks.remove(fn2);
callbacks.fire('foobar');
/*
fn1 says: foo <- first fire
fn2 says: foo <- second fire. 新加入的 fn2 先執行已經fire的event, list 裡面的 funtion 再執行
fn1 says: bar
fn2 says: bar
fn1 says: foobar <- third fire
*/
flags - unique:
var callbacks = $.Callbacks('unique');
callbacks.add(fn1);
callbacks.fire('foo);
callbacks.add(fn1); // repeat addition
callbacks.add(fn2); 
callbacks.fire('bar');
callbacks.remove(fn2);
callbacks.fire('foobar');
/*
fn1 says: foo <- first fire
fn1 says: bar <- second fire
fn2 says: bar 
fn1 says: foobar <- third fire
*/
flags - stopOnFalse:
function fn1(val) {
     console.log('f1 says: ' + val);
     return false;
}
function fn2(val) {
     console.log('f2 says: ' + val)
     return false;
}

var callbacks = $.Callbacks('stopOnFalse');
callbacks.add(fn1);
callbacks.fire('foo');
callbacks.add(fn2);
callbacks.fire('bar');
callbacks.remove(fn2);
callbacks.fire('foobar');
/*
fn1 says: foo <- first fire
fn1 says: bar <- second fire
fn1 says: foobar <- third fire
*/
Flag combinations are internally used with $.Callbacks in jQuery for the .done() and .fail() buckets on a Deferred – both of which use "memory once". pub/sub implementation
var topics = {};
jQuery.Topic = function( id ) {
     var callbacks,
          method,
          topic = id && topics[ id ];
     if ( !topic ) {
          callbacks = jQuery.Callbacks();
          topic = {
               publish: callbacks.fire,
               subscribe: callbacks.add,
               unsubscribe: callbacks.remove
          };
          if ( id ) {
               topics[ id ] = topic;
          }
     }
     return topic;
};
// Subscribers
$.Topic( 'mailArrived' ).subscribe( fn1 );
$.Topic( 'mailArrived' ).subscribe( fn2 );
$.Topic( 'mailSent' ).subscribe( fn1 );
// Publisher
$.Topic( 'mailArrived' ).publish( 'hello world!' );
$.Topic( 'mailSent' ).publish( 'woo! mail!' );
//  Here, 'hello world!' gets pushed to fn1 and fn2
//  when the 'mailArrived' notification is published
//  with 'woo! mail!' also being pushed to fn1 when
//  the 'mailSent' notification is published.
/*
output:
hello world!
fn2 says: hello world!
woo! mail!
*/
Whilst this is great, we can take this pub/sub implementation further. Using $.Deferreds, we can ensure that publishers only publish notifications for subscribers once particular tasks have been completed (resolved). See the below code sample for some further comments on how this could be used in practice:
// subscribe to the mailArrived notification
$.Topic( 'mailArrived' ).subscribe( fn1 );
// create a new instance of Deferreds
var dfd = $.Deferred();
// define a new topic (without directly publishing)
var topic = $.Topic( 'mailArrived' );
// when the deferred has been resolved, we'll
// then publish a notification to subscribers
dfd.done( topic.publish );
// here we're resolving the Deferred with a message
// that will be passed back to subscribers. We could
// easily integrate this into a more complex routine
// (eg. waiting on an ajax call to complete) so that
// we only published once the task finished.
dfd.resolve( 'its been published!' );

6/13/2012

GradientFinder - Convert Images into CSS Gradients

GradientFinder - Convert Images into CSS Gradients An interesting Web-based tool that can take images of gradient and convert them into the equivalent CSS3 properties.

6/08/2012

xip.io: wildcard DNS for everyone

xip.io: wildcard DNS for everyone

What is xip.io? xip.io is a magic domain name that provides wildcard DNS for any IP address. Say your LAN IP address is 10.0.0.1. Using xip.io, 10.0.0.1.xip.io resolves to 10.0.0.1 www.10.0.0.1.xip.io resolves to 10.0.0.1 mysite.10.0.0.1.xip.io resolves to 10.0.0.1 foo.bar.10.0.0.1.xip.io resolves to 10.0.0.1 ...and so on. You can use these domains to access virtual hosts on your development web server from devices on your local network, like iPads, iPhones, and other computers. No configuration required!

6/07/2012

html5 video

Introduction to HTML5 video - Dev.Opera
Video for Everybody!
JW Player: Download | LongTail Video | Home of the JW Player
Flowplayer is an Open Source video player for your website.

Shawn Achor:優質工作的快樂秘訣 | TEDxTaipei

Shawn Achor:優質工作的快樂秘訣 | TEDxTaipei

Shawn Achor:優質工作的快樂秘訣 「我們相信工作會帶來幸福快樂,但是能不能反過來想呢?」 Shawn Achor以幽默詼諧的口吻來揭開快樂秘訣,Shawn Achor以自身經驗為例,當他進入哈佛大學就讀時,他以為大家會為了能夠進入哈佛大學並且能夠身處如此優秀的環境感到開心,但是不管這些學生原本對於能成功入學這件事有多高興,入學兩個星期後,他們滿腦子專注的事既不是這件殊榮,也不是任何課程內容,反之他們的腦子專注於競爭、工作量、麻煩、壓力、抱怨…等。 從旁人的眼中來看,能夠進入哈佛大學就讀是如此令人欣喜若狂的事,為何這些身在其中的人卻為了其他事情而煩悶? 其實,每個人幸福的程度可以由身處的外在環境來預測,可是事實是就算能夠知道你所處的外在環境,也只能預測你10%的長期幸福程度,另外的90%不能以外在環境預測的部分,是取決於你的腦子如何看待這個環境。所以很多時候開心與否不盡然由事實所塑造,塑造我們的其實是那副「你的腦子如何看世界」的鏡片,如果我們能換掉這個鏡片,我們不但能對快樂的定義改觀,同時我們還可以改變每一個學校及企業的績效。 普遍大家認為幸福及成功的公式即是「如果我更努力工作,我就會更成功,如果我更成功我就會更快樂。」這是我們的教養態度及管理模式的根本,也是我們激勵自己表現更好的方法,不過Shawn Achor指出其實這樣的想法不合科學邏輯且倒施逆行。因為你的腦子每經歷一次成功,你就會把你期望的成功目標更改一次。舉例來說:當你一進了好學校,下一所學校就要更好;你獲得了一個好工作,下一個工作必須要更好;你銷售成績亮眼,我們就要提高你的銷售額目標。因此,如果幸福快樂是在成功的另一端,那麼你將永遠得不到這個感覺。我們的社會集體意識把幸福快樂推到認知水平線的另一端,因為我們以為必須要先成功才會比較幸福,但其實我們的腦子是以相反的方式在運作。 事實上,如果你可以提升一個人的積極程度,那麼他的腦子會經歷「快樂優勢」的感覺,也就是說當你的腦部處於積極狀態,會比消極時、中立時或處在壓力時表現更好,不僅理解力提升,創造力及活力也增加,甚至發現每一種業務成效都大幅進步。此時,你會感到困惑,有方法可以訓練腦子讓他變得更加積極嗎? 答案是肯定的,只需要每天寫下三件感激的事及三件新事,並且連續二十一天,當過程結束後,你們的腦部會開始記住這個模式「先從正面掃描世界,而不是先看負面。」藉由訓練你的腦子,幸福與成功關係的公式便可以倒著寫,這麼做不但會激起正面漣漪,還能創造真正的革命,所以從今天起開始試試,為自己換一片看世界的鏡片吧!

6/05/2012

flow of oauth open new window

1. example.com/index.html open a new window which domain is flickr oauth page 2. after user authenticate, flickr will redirect to the callback url (example.com/auth.htm) 3. in example.com/auth.htm, there's a javascript file calling the function defined in example.com/index.html 3.1 window.opener.processAuth(...) 3.2 pass the auth credential, 3.3 window.close to close itself 4. in example.com/index.html, the processAuth handle the the rest

window opener vs. parent

window.parent和window.opener区别

opener即谁打开我的,比如A页面利用window.open弹出了B页面窗口,那么A页面所在窗口就是B页面的opener,在B页面通过opener对象可以访问A页面。 parent表示父窗口,比如一个A页面利用iframe或frame调用B页面,那么A页面所在窗口就是B页面的parent。

What is a Polyfill?

What is a Polyfill?

A polyfill, or polyfiller, is a piece of code (or plugin) that provides the technology that you, the developer, expect the browser to provide natively. Flattening the API landscape if you will. Alex Sexton also classifies polyfilling as a form of Regressive Enhancement. I think that sums it up nicely. Paul also defines it as: A shim that mimics a future API providing fallback functionality to older browsers.

Albert Kahn:彩色记录世界第一人 | 摄影之友

Albert Kahn:彩色记录世界第一人 | 摄影之友 A

lbert Kahn是法国巴黎的一位银行家、慈善家。20世纪初期,他雇用了10多名摄影师,在全球范围内进行他的摄影计划。1909至1931年间,他共拍摄收集了大约72000张彩色照片,4000张立体照片以及60英尺长、超过100小时的电影胶片,这一系列的照片和影像被称为“地球档案”。他的足迹遍布世界各大洲,横跨50多个国家,记录了各地不同的风俗人貌。最后在1931年因为财务问题被迫中止。 他曾专派一个小组来到中国拍摄。当时,慈禧太后刚去世,溥仪登基,他的父亲醇亲王负责执政。Albert Kahn 记录下了封建帝制被推翻前的中国。这也是记录中国最早的一批彩色照片,无疑是一份珍贵的历史记录。 BBC在2008年为 Albert Kahn 出版了一本摄影集,其中包含他的团队在一战前后拍摄的许多珍贵照片,这些照片现在都收藏于法国的Albert Kahn 博物馆,该博物馆对公众开放,馆内还有当时在这些国家拍摄的电影观看,博物馆的背后是一个花园,也是 Albert Kahn 生前居住过的地方。 Albert Kahn:用彩色记录世界的第一人