October 25, 2013

  • 終章

    當大家看見這篇文章,就意味我己離開這裡一個月。大家無須惋惜,亦無須傷心,人生無不散之延席。

June 11, 2013

  • MMD: 1

    (同步發佈至 Blogger)

    上一章

    陽光刺眼,像在催促尚在床上的本納起床。不過,本納大被蓋頭,對太陽的呼喊無動於衷。

    太陽改變策略,轉用隔着被舖都能發動的攻勢,將床面加熱到三十二度。攻擊非常有效,本納不敵高溫,在被中大汗淋漓。為躲避攻擊,本納掀開被子,但如此一來,就中了太陽的計。陽光穿過眼皮,刺上本納的視網膜。

    最終,本納投降,起身了。他看看時鐘,「今天終於來到。…」還未到十二時。「…離伺服器開放還有一小時多。」時間尚算充足。

    梳洗過後,本納乘上單車,到六個街口外,社區中唯一的遊戲銷售商。自從二十年前電子分銷普及,擁有門市的遊戲銷售商就不斷減少,很多地方甚至一間也不剩。還好這裡還有一間,不然「頭盔」就經網上才能買到。靠郵遞公司十年如一日的服務,會錯過伺服器開張的機會十分之大。

    還未接近銷售點,就已看見一條人龍,本納希望龍頭會探進其他商店中。可惜,來到遊戲銷售商的門市,可以清楚看見人龍確是源自那裏。「天啊。」這麼多人到遊戲銷售店,大概電子遊戲面世以來都從未試過。他們都來做什麼?怎樣都好,都應該與我無關吧。

    步入店內,「請問……」店內職員都手忙腳亂,沒有人有空去理會新進來的客人。當本納終於找到空位,截停一個手中沒拿貨物的職員時,「排隊吧。」還未開口,職員就不耐煩地回應,就像今天在本納之前已有二百個人問過相同問題。「但我只是來領取預購的……」「誰人不是?你以為是什麼召集這班人?…」以拇指指向人龍:「…排隊吧。」不等回應就再度投入工作。

    環顧四周,本納這才發現,店舖內能放貨物的地方和不能放貨物的地方都在放同一款箱子。「對,還有什麼會引來這班人?」

    回到店外,遙望勉強見到的龍尾。排隊人數鐵定過百。「唉……這回一定趕不及開張。…」時間已近十二時半。「…人何以總要到留待至最後一刻才行動?早一點領取不就能避免這問題嗎?」雖然這句話也適用於其他人,但本納是在說給自己聽遠多於給別人聽。

    心已死的本納帶上眼鏡,期望能找到有串流頻道直播開張。豈料不用搜尋,一開機就已看見眾多相關消息。遊戲網站、新聞頻道、個人網誌,全世界都在討論紀道域這款遊戲。

    誇讚紀道域會如何改變遊戲界的頻道,一概關閉。自紀道域的概念首次提出以來,都不知聽過幾多遍。無論該頻道有無表述過,觀眾已聽過這論調上百遍;現在還重覆的人一點傳媒觸覺也沒有。

    正在收看的幾個頻道突然播放同一畫面,原來大家都在直播的開發者的情況。臨近開幕,開發者「紫檀製作組」的辦公室空閒得出奇。多數房間都沒亮燈,而人則集中在辦公室中央的共用空間。大概是能做的準備功夫都已做完,接下來就只能聽天由命,祈求機器如運作如常。

    「歡迎大家來到紫檀。…」鏡頭前,年約二十的少女說:「…我是紫檀的創辦人之一,亞莎。紀道域是我們紫檀所製作的第三款遊戲。之前的兩款,你們可能連名字都未聽過。所以,紀道域和紫檀能有今日的規模,我們幾個創辦人至今仍然覺得難以置信。」

    亞莎的講話對像,是面前的幾位記者﹑遙距報導的串流頻道台主,以及全球數以千萬計的觀眾。比起面對十億人,面對一千萬的隱形人的壓力要高出幾倍,更不要說這片段會被錄影和永遠保留,也不要提面對群眾本就不是她的工作。就算講話者說話生硬,儘管用詞不精準,即使那段話是照讀一早寫好的稿也好,都情有可原。

    「稍後我們將有伺服器的開幕儀式。在那之前,現在或者先參觀一下幕後的製作環境,即這個辦公室,以及請製作人員解答你們的問題吧。…」亞莎開始習慣環境,話語間的抑揚頓挫漸漸回復至正常水平:「我們目前所在之處,凡進入辦公室的人都會首先會踏入。這是辦公室的共用空間,亦是會議的首選地點。這邊是編程部﹑美術部,另一邊是測試部,還有茶水間。」

    亞莎帶記者和全世界參觀各個工作空間。瞬間,紫檀製作組榮登為本納的理想工作地點;相信幾千萬人都抱相同想法。

    編程部中,無論職位高低,人人皆有獨立房間。美術部的設備,無論是影像還是音效相關,都是無與倫比。雖然錄音設備只是借回來,但紫檀甚至有自己的錄音室。至於測試部,亦是一隊伍一房間。從房間的佈置和設備的裝飾,可看出紫檀不介意員工把公司財産當成私人物品。

    剩下不見窗戶的地方,紫檀將其分作幾作幾個會議室以及休憩空間,並以光纖引入自然光。會造出這種細節,設計者簡直當這裏是住宅一樣。最神奇的是,將一層分作超過五十間房,竟然仍有近九成房間有窗。引發這奇蹟的執著,就如同看見自然景觀和陽光是基本人權一樣。

    回到共用空間時,約是二十三時四十五分。「對這辦公室有問題嗎?對我們的工作有疑問嗎?還是想問有關遊戲的問題?什麼也可以問噢。」

    「為什麼選擇製作大型多人線上遊戲?」「我們一直想在遊戲內建立社會。人是群居生物,想跟別人交流實在必然。若擴展概念,無可避免要建立社會實。我們認為,以大型多人線上遊戲為媒體,最能提供建立社會的基礎。」「但大型多人線上遊戲已末落多年,為什麼你們會冒險,選擇這個類型,而且還有這樣大的制作?」「要冒險,是因為獨立製作組如我們,除冒險外別無他法。有多少獨立製作組能靠製作主流遊戲維生?零,歷史上一個都無。主流遊戲是大型製作組和發行商的專利。我們沒有他們強大的宣傳團隊,只能突圍而出。其實大型多人線上遊戲並沒有衰落;衰落的只是大型單人線上遊戲。早在這類遊戲衰落之前,製作商已越來越省去『多人』的元素。當多人線上遊戲減去『多人』,剩下的就只是一般的單人遊戲,還有高出別人多倍的製作費。那麼,沒人再造也是預計之內的事。」

    「全球玩家同時上線的負荷,你們的伺服器如何應付?」「我們有眾多伺服器,遍佈全球,分別在日本﹑俄羅斯﹑澳洲﹑香港﹑印度﹑土耳其﹑南非﹑瑞士﹑英國﹑美國﹑和巴西。以這數量,伺服器不難應付負載。」「那『一個世界』的賣點又如何?是放棄了?」「怎會呢。『一個世界』一直是紀道域的一大賣點,即使有多個伺服器,這點仍然不變。伺服器上的一舉一動,會立即廣播至其他伺服器。全部伺服器都是同步的。」

    「以多個伺服器建立一個虛擬世界,對伺服器間的連線速度港和延遲的要求想必十分嚴格。能否講一下你們如何達到這些要求?」「這個嘛…」與其他職員討論一番後:「…我們也不是太清楚,因為這部份的網絡是由智匯集團總部負責。我們所知的只是伺服器間是以某形式的量子纏繞連接。基本上等同有專線連接,所以毋須擔心遊戲會加重全球網絡的負擔噢。」

    「你們是智匯集團的新成員。我想問的是,如果沒有集團的資助,你們能完成遊戲嗎?」「嗯……不可能。」「即使靠籌款得到更多資金也不能?」

    「尤其有更多資金時,更加不可能。…」一位年紀跟亞莎相約的男生回應。「…籌款的問題在於,資金量難以預計。…」畫面顯示他是紫檀創辦人之一,里奥。「…如果資金忽然增多,而且遠多於原預算,製作組就好容易誤用資源。你說。過去十年有多少遊戲商死於這手上?我想我們也不會例外。而且,智匯給予我們的,不只是資助。先不要說遊戲的骨幹網絡是由智匯架設,就連這辦公室的設計和我們的工作流程,智匯也提過很多意見。雖然你們已屢次從其他製作組聽過,但還請容我再說一遍:若是沒有智匯集團的協助,就不會有紀道域,紫檀也可能早已解散。」

    一位記者突然笑起來。「怎麼了?這裏地方有哪裏可笑嗎?還是我們說錯什麼?」亞莎緊張地問。「都不是。這問題從一個串流頻道而來,估計原本由其觀眾提出。…」還是忍不住笑:「…我就照讀出來了:『亞莎你可以當我的女朋友嗎?』」

    眾人終於理解記者笑的原因,共用空間旋即被笑聲掩蓋。亞莎則呆了數秒,然後:「不行啊。…」一手抱住里奥的手臂,「…我已有這傢伙。」拋出紫檀第一個公眾形像災難。

    擾攘一輪,時間將近十二時。共用空間的其中一面牆變成屏幕,顯示不屬於這個世界的畫面。現場和觀看直播者屏息靜待;人人皆知道,開張儀式即將開始。

    屏幕分作五個畫面,顯示五個超大型城市,每個都容得下百萬人有餘;紀道域究竟有多大,實在難以想像。「這些地點,測試玩家應該認得,是玩家首次登入時進入的地方。用以前的術語來說的話,是新手村,雖然『一個世界』令其遠遠脫離『村』的規模。」鏡頭轉向城內的中央廣場。

    屏幕上時鐘,表示距離遊戲正式開張還有……「十﹑九,…」亞莎帶頭跟全世界一起倒數:「…八﹑七…」本納覺得倒數聲有如親耳聽到般震撼,「…六…」當他意識到原來他附近的人都在一起倒數時,也加入倒數:「…五﹑四﹑三,二﹑一,零!」踏入二零二八年八月一日,紀道域的伺服器正式投入運作。

    ……鴉雀無聲。城市沒有動靜,現場無人作聲。「什麼也沒有。…」人們除了感到奇怪外,亦慶幸自己沒有拍手或叫喊。「…大家想這樣問吧?這是當然的:建立角色需時,對外觀如何隨便的人也至少要一分鐘吧?」

    二十秒後,中央廣場上浮現絲帶狀警告。在警告的光茫下,遊戲的首名玩家現身。「啪」的一聲,廣場與紫檀工作室同時滿佈彩帶。「歡迎來到紀道域!」歡呼聲此起彼落。

    更多玩家現身。一個、兩個,越來越多玩家在對鏡頭揮手。運作中的鏡頭都沒有立體模型;他們之所以會知道鏡頭所在,乃因為有人在遊戲內打開瀏覽器觀看直播。

    製作三年,當中辛苦只有製作人員知曉。三年耕耘終成果;看見遊戲化為成功,猶如看見子女成才。從兩個世界包圍製作人員的掌聲、歡呼聲、與揮手,都充滿道謝之意。製作人員再也按耐不住,感動得落涙。

June 3, 2013

  • MMD: 0

    (同步發佈至 Blogger)

    漆黑的空間中,唯一看得見的是一個男子。就好像他是這個空間中唯一的物質。又或者說,從他身上不自然光影看來,就好像他是空間中唯一的光源。

    一眨眼,男子前方出現黑暗中另一可見之物。紅色標語懸浮空中,寫有警告字句。帶狀的警告頭尾相連,成一圓圈。更多標語憑空出現,全都在繞某個「中心」公轉。

    中心離男子約二十米。這一刻那裡空無一物,下一刻就有個木箱。木箱因為警告的紅光而染成櫻桃色。箱子在跌下來,警告消失後,才變回原有的顏色。

    再有警告出現在木箱之上。警告和木箱相繼出現的循環重複數十次,堆成一座木箱山。此刻男子已在急步後退。

    靜下不久,又有警告。這次警告的中心並不是空白,而是一個木箱。新的木箱出現後,兩個木箱以物理上不可能的方式重疊,並猛烈震動。兩箱子承受不了這超乎常理的異力,雙雙爆炸。

    男子還沒來得及反應,又再有一對箱爆炸。幾秒內,整個木箱山都變成木屑煙火。

    「喂!可歡,你想殺了我嗎?」男人跌倒在地上后說。「對不起噢。不過這個提議值得考慮一下。」聞其聲不見其影的女子說。

    新一輪的爆炸又再開始,而且久久未有停下的徵兆。剩下的木屑堆積成山。眼見狀況,男子就想逃離。

    萌生念頭之時,一塊平面顯示在他面前。上面寫有:「確定退出?」,下方的數字由十開始倒數。

    數字歸零,空間中唯一的人消失於漆黑之中。

    男子張開眼,離開那黑暗的夢境。醒來後,他首先察覺的是頭被什麼匝着。他摘掉那戴着就只會露出臉的頭盔,在床上坐起身。

    「你到底要重複那實驗多少次?」他問眼前的女生。她正在盯着終端機,一副專注的樣子:「直到再出現為止。」是剛才聽到的那把聲線。「再出現?你都已經犧牲多少木箱了?」「算上剛才的,一千二百一十八個。」「即是你剛才一口氣炸掉上千個箱嗎……」

    記錄檔上最新的一行寫着「玩家『冀思』已登出」。「說起來…」突然一臉不滿地望向男子:「…為什麼你要登出得這麼快?本來我可打算運行夠十分鐘的!」

    「你還好意思說,這遊戲引擎可是連痛覺也會模擬的。你將爆炸場境設在我正前方,你可有理過我感受?」「可是,爆炸如此激烈,你不靠近的話,不就什麼也觀察不了?」

    「為什麼一定要用人觀測?遊戲引擎本身就有除錯用的記錄工具,而且你不是還有放置鏡頭去錄影嗎?那麼少我一個也沒所謂吧。」

    「你有沒有看過那次的記錄?」「只看過錄像,沒看過數據。畢竟那不是我的工作範圍。」「難怪。可悲的是,今次我所知的不比你這懶人多。」「為什麼?」「你自己看。」

    終端機幾乎等身高的螢幕上跑出幾個畫面,都是小鎮街景。冀思認得這地方:那個錯誤第一次出現﹑亦是最後次出現的地方。當時美術人員正在佈置場景,四處頻繁出現剛才見過的警告。

    在市場中的約翰,本來負責概念圖。他見工作半年前就已完成,閒着沒事就自願接上建構地圖的工作。

    他之所以會自動請纓,除了因為空閒,還有別的原因:他想感受一下這個世界,感受這個他有份創造的世界。

    蔚藍的天空﹑容積雲投下的影子﹑地上水坑刺眼的反光﹑貨攤上精緻的食材模型。一切都跟概念圖上的一樣。自動調節的物料設定,令物件的細節比概念圖更出色。

    遊戲引擎「鮮花」能帶給玩家的,不只這些。微風吹過,香草與蘑菇的香味撲鼻而來。「還好是在乾貨區。我可不想對『鮮花』的第一印象是魚腥跟生肉味。」

    張開懸空的藍圖,約翰繼續建設市場。或者說是「擺設」比較貼切吧?畢竟,這正是約翰在做的:按照藍圖,將一件件預先製備的模型放到這個世界。

    本來,開發者能透過鮮花的「傳感」介面,從腦部直接給予指令,不靠選單﹑不動手腳就能移動物件。不過約翰平常繪畫平面的概念圖,不太習慣三維控制,所以仔細的調節他都會親手做。

    木盤的質感與木紋﹑貨物在盤上滾動而做成的重心轉移﹑貨物間的碰撞聲﹑手臂因搬運重物而傳來的酸軟感。很難相信這一切也是遊戲引擎實時模擬出來。

    要說傳感介面的壞處,就是使用者一分神就很容易出錯。「糟糕。」連續下了兩個放置指令,將兩個木箱放在相同位置。

    警告標語包圍首先出現的木箱,然後……什麼也沒發生。

    沒有爆炸, 沒有猛烈搖晃,沒有碰撞聲,第二個木箱甚至沒有出現。只有首先出現的木箱,若無其事地站在地上。一切也靜得異常,直至東邊傳來尖叫聲。

    眾人跑到離市場四個街口的現場。在那裏,一位女工作人員坐在地上,又驚訝又疑惑地望着前方;在她面前,是約翰所放置的木箱。

    可歡停暫停錄像,回帶到約翰放置木箱的一刻,放到螢幕一角,然後打開記錄檔。看到這密密麻麻﹑頁復一頁的文字,冀思通常都會立即感到頭昏腦脹。不過,這次沒有。一來,可歡只篩選相關的資料顯示;二來,就算是篩選過,這次記錄檔上的項目都明顯比平常少。

    「終於了解吧。這就是一一九零九六奇異之處。」開發者模式顯示兩個木箱確是被召喚至同一位置,可是物理引擎蒲公英卻沒有木箱轉移位置前的記錄,就像木箱由一開始已在市場外。

    「根據這些系統的記錄,整件事豈不跟沒有發生過一樣嗎?」「不然你以為我是出於什麼原因才每次測試都需要你在?」「原來如此。不過這樣種錯誤,到底要怎樣才能找出來?」「基本上同平時無分別,惟不能依靠系統信息與記錄而已。」

    可歡除下白色幼身頭箍。像是了解到可歡要離開一樣,視窗一個個關閉。取而代之的,是螢幕正中的二頭身人像。人像很像可歡,甚至穿著同樣的羊毛外套。估計是可歡在工餘時畫的。

    「反正你已經出來,不如先吃些什麼吧。」可歡站起來伸個懶腰。身後本來的白色牆壁漸漸變得透明,染上街外茜色。夕陽透過落地玻璃窗照到室內。看着黃昏美景,「我真的很喜歡這辦公室。」可歡不禁從心底嘆道。

    在離開辦公室的路上,「你有信心在正式發佈前確認到這個錯誤嗎?」一一九零九六號錯誤,兩個月前首次出現,迄今未有人能重現。所以,其在錯誤資料庫中,只是「未確認」的「事件」。「老實說,就算能把全部時間都放到一一九零九六上,也沒有把握。你不忘了頭一周有多少測試員在嘗試重現嗎?」

    「印象中,好像沒有誰沒有試過……」當時就連非測試部的員工都加入測試行列,希望首先確定那個奇觀。其實,這本身就已是個奇觀。「不就是。現在就只剩下我們這組仍持有信心,不,是抱有懷疑,是什麼都好,總之現在只剩我們。人力物力到底是那時的幾分之一?單是想起也覺得頭痛。」不過,他們大多沒有正確的程序與適合的工具,就算他們真的能重現事件,最多也只能當作多個樣本作參考。

    「我們已經專注在這錯誤大半星期,上司不會容我們再放太多時間吧。如果今日內確認不了的話,就只能先放下它了。唉,這幾天到底堆了多少新的劇本?本來以為只有編程部的人才是這樣,臨到期限就會推來一大堆代碼。該說這果然是人的天性嗎……」

    「喂,可歡﹑冀思!」食堂內,是測試部的另一隊伍,馬克與尚樂。「論偷懶,還是你們更勝一籌。」可歡坐在馬克旁。「你這樣說有損我們名聲啊。我們過來前已完成工作目標。」「你們又怎樣?」尚樂接上話題,問二人。「不要提。堆得跟山一樣高。」冀思道, 並向可歡投以責怪的眼神。

    「還在執着於那個嗎?」「不行嗎?」「你們花了這麼長的時間都再見不到一一九零九六,也許就算遊戲正式推出後,也永遠不會再見到吧。」

    「不要天真。梅非定律指出…」「凡會出錯的,都會出錯嘛。」眾人異口同聲說。「…你們知道就好。不要忘記『紀道域』的首月目標銷售量是二百萬。就算每人導致出錯機會只有一百萬分之一,這二百萬人都不會觸發這錯誤的機率是……」可歡數起手指來。她到底想如何靠手指算出二百萬次方,實在不得而知。

    「百分之十三點五。」馬克的「眼鏡」已算出並顯示答案。「謝謝。這統計模型雖然是十分簡化,但亦只計算頭一個月的玩家。那你們該知道我們對大型遊戲有多重要吧?」

    馬克無視可歡的偉論:「為什麼你不用『眼鏡』?」逕自提問。「基於工作需要,我已經要戴半天傳感裝置。若連工餘時間都戴着它,我怕會分不清現實與虛擬。」席上,唯可歡頭上沒戴傳感裝置和眼鏡。

    「你擔心的時候,有考慮過我們的感受嗎?」尚樂抗議。他與冀思一樣,是有「潛水員」之稱的測試員。所謂「潛水員」,需要「潛行」至遊戲中,從內部測試。他們不但會經傳感裝置下達指令予輸入模組,還會由輸出模組將虛擬官感直接讀入腦中。雖然兩種技術都已有上十年的臨床經驗,但要說潛水員所面對的危險性的話,確是比身為「監察者」的可歡高。

    近年很多受歡迎的故事都以「被困潛行狀態」作主題。除了因為虛擬世界的設定容易吸引人外,亦因為理論上有此可能。

    每當鮮花加入新功能,只要通過自動測試與檢查,就會交由三支先頭隊伍測試,尚樂與馬克就是其中一隊。雖然現實從未發生事故,但尚樂始終站在潛行的應用層面最前端,要擔心亦不無道理。

    「抱歉。但我始終對自己的意志力沒有信心。」「我沒有責備之意,僅是想說你杞人憂天。」站在前端的好處,在於工作來得早亦去得早。馬克和尚樂現在之所以空閒,除了因為他們工作快,亦因為遊戲的引擎部份早已穩定,改動不多。

    可歡所屬的隊伍,以測試劇本和介面為主;在遊戲推出前,工作只會越來越多。多人遊戲的存活依賴不停引入優質的新內容,所以遊戲推出後的工作量亦不會減少。

    距離「紀道域」推出之時,尚餘兩個月。

    下一章

June 1, 2013

  • 從 Xanga 倒閉危機談起

    Xanga 面臨倒閉危機,大多數人歸因於 Facebook 興起。或者這確是原因之一,但不會是唯一原因。

    要說兩者之間有直接競爭,實在說不通。Xanga 是個 blog host,是一個發佈 (publish) 平台。至於 Facebook,我不會承認它是個發佈平台;硬要說的話,Facebook 是個很差劣得無可再差的發佈平台。如果 Xanga 自己都以 Facebook 為假想的競爭對手,那只能說倒閉是咎由自取。

    Facebook 的作用,不是發佈,是溝通與更新。Facebook 上的資料是「有時限」的。並不是 Facebook 上的舊資訊會消失,而是:一,一般人在 Facebook 上的發表的更新會隨時間而貶值。二,基於現在 Facebook 的 Bing 搜尋器和 timeline 介面,用戶很難找到舊資料,亦很難找到相關資料。更不要提 Facebook 上超連結的限制。認真對代自己文字的 blogger,並不會用 Facebook 作為發佈平台。因此,Facebook 與 Twitter 甚至 MSN messenger 的競爭都大於 Xanga。

    Xanga 的死因,其實在於不思進取。在我駐紮 Xanga 的八年間,Xanga 有兩次改版。初期,Xanga 的管理介面基本上等於瀏覽介面,一登入就會見到自己的 Xanga page 的樣子。加上當年 Xanga 使用者以中學生居多,各種頁面設計百花齊放,可謂 Xanga 最風光、最多姿多采的年代。

    後來,第一次改版,引入 Dash 介面。Dash 介面的正中是自己最近發表的文章,左邊跟以往一樣,是 subscription 的連結。對比以前,管理文章容易得多。

    再改,就是現在的 private home。加上前後的編輯器改版,這是 Xanga 有史以來最好的改版。頁面正中的不再是自己的文章,而是別人的文章。Blogsphere,以及其內的 blog,需要大量互動與連結才能存活。一登入就會看到 subscription 的最新動態,無疑是個絕佳的設計。模版式的新頁面設計,雖然沒有以前直接修改 HTML 時自由,但現在變成人人皆可設計自己的 Xanga 頁面。新 editor 雖然未算完善,但在斷線時能保留文章的功能值得一讚。

    至少,這在五年前是個上好的設計。

    這幾年間,Ajax 普及得幾乎沒有網站不用。Xanga 所提供的功能不再特別,久未更新的系統亦漸露疲態。原本可以接受的怪處 (quirks) 變成不可原諒的缺陷。

    幾年間,瀏覽器龍頭地位由 Internet Explorer 變成 Google Chrome,主要瀏覽器材由桌面電腦變為手提電話和平板電腦。主流 markup language 由 HTML 4.01 到 XHTML 1.0 / 1.1 到 HTML 5。網上服務供應商若不因此而改變,倒閉實屬必然。

    Xanga 今次籌款六萬美元。小量如此的金錢,能用來做什麼,我不知道。

    今後,無論 Xanga 倖存與否,我都將以 Blogger 為技術性文章的主要發佈平台。Xanga 仍會更新,但可能會慢幾拍。至於小說發佈,我仍在考慮各種方案。發佈於上述網誌?開設專用來連載的新網誌?原人圈

May 28, 2013

  • JavaScript Constant

    As a good programmer, you make everything constant. By doing so, you limit the places that you can make mistakes, and thus reduce number of bugs… at least works most of the time.

    I wrote an web page for an assignment. Naturally, I used the const keyword all over the place. I did not even think about the possibility that JavaScript has no constant as VIM highlights the keyword, and the page worked perfectly on Firefox and Opera on my machine.

    Therefore, I was very surprised when I found the page bugged out on the tutor’s computer with Google Chrome.

    The story starts with scoping rule of JavaScript. Variables in JavaScript has either global scope or function scope. Nested functions can access variables of the nesting function. This is called scope chain. Unlike most languages, JavaScript does not have a block scope; the following is valid JavaScript code

    function a() {
    if (true) {
    var b = 2;
    }
    alert(b);
    }

    What about constants? What will happen in this piece of code?

    function c() {
    for (var i = 0; i < 4; i++) {
    const j = i;
    alert(j);
    }
    }

    ECMAScript 5, the base language of the current version of JavaScript, has no constants. Constant is a proposed feature of the next version of ECMAScript, Harmony. There is also block-scoped variable in Harmony, declared using the keyword let.

    Firefox 20 treats constant as a block scope variable; Opera 12 does not distinguish between constants and variables (you can reassign a “constant”). My code works in both cases. In Chrome / Chromium 26, however, constants have function scope. You can declare a constant in a loop, the constant will not update its value at all. The above code will alert 0 four times. What makes this worse is Chrome / Chromium will not complain the failure of assignment.

    ECMAScript 6, can you standardize a bit faster?

April 4, 2013

  • 回歸

    最近,好似好多人回歸 Xanga。我並非回歸的一份子;皆因我從未走過,不過好耐無聲氣。現在上來講句:我未死得。

    其實有好多篇文寫了一半 (或者一句),在 private 狀態;又有更多尚在沉澱,從未落筆。

    有好多想寫,但無時間。又或者有時間寫,但總是力不從心。可能實在太耐無寫過字。

February 6, 2013

  • 所謂學習

    好多讀過大學的長輩都講,進大學最大得益並非獲得什麼知識,而是學會如何學習。

    我開頭不信。學習由出世已開始,何以要到大學才學如何學習?

    可是,在理工大學一個學期後,不到我不信。習作自十月起就未停過,留意係未停過,聖誔假期有幾份功課要交,到考最後一科的時候都有功課要交。經計算,應付完習作後,我有每科有十八小時複習。

    在這種情況下仍然只有兩科不合格,應該已經要還神。

    我從不認為壓力是教學之導。面對大學生、成年人,還要以此教學,實在有辱師門。如果學生是有心學的,沒有習作、考試,他們會學得更好。如果他們無心學習,再多工作也是徒勞。

    當然,沒有習作跟考試,學校就不能評核學生的水平。香港始終仍在奉行精英制,而且一切講求效果,這種「教學」模式長期內不會改變。

October 13, 2012

  • Trouble-shooting: Seg-fault (erroneous memory access) on glDrawElements()

    Yesterday, when I was writing basic rendering code for the new ViRe, I keep getting errors of erroneous memory access (in the form of an Ada exception).

    With the small code size I currently have, finding the offending line of source code is a matter of minutes. However, knowing that the exception is raised during the call to glDrawElements(), I still don’t know the cause of it. My first suspect is the Ada OpenGL binding that I have been writing alongside the renderer.

    Today, I wrote a small programme (~100 lines of Ada source text), set up everything that is needed and called glDrawElements(). To my surprise, it worked perfectly. The binding is working fine; it is the code that loads and prepares data that is in fault.

    After some time, I found out that if you call glDrawElements on a VAO that is not ready to be rendered, be it a non-existent array object (including the id 0) or an uninitialised one, a segmentation fault will happen. By uninitialised, I mean the vertex buffer or index buffer is not generated, bind, or you forgot to load data into the index buffer, or you failed to enable the corresponding vertex attribute array, or any combination of them.

    As long as index data is present, its values does not matter. It may cause an empty screen but not a memory access violation. Absence of vertex data does not affect rendering process.

    Note that glDrawArrays() does not generate this error regardless of the circumstances. That makes sense, since it does not rely on index buffer object or index data.

    Development environment:

    • OS: Linux Mint 13 with kernel 3.2.0-30-generic
    • Display Card : NVIDIA GT640M LE
    • Display Card driver: Bumblebee with NVIDIA binary driver 3.0.4.51

October 7, 2012

  • Back to Square One

    Screen short

    … Or should it be triangle one?

    Result of two months of development and more than 1000 lines of code.

    Most of the code is devoted to the entity system framework. Hope I have time and willingness to write more detail about that when the design stops changing every two days.

    Someone asked me why I find a 24-inch monitor inadequate. This is why. In the picture is only one of my three virtual desktop. When you have to simultaneously edit six or more files, look at 2 thousand-page documents and browse numerous websites, the screen is never big enough.