1.如何定義一張圖:
圖(Graph)是由點(Vertex)與邊(Edge)構成,以G = (V,E)表示。
2015年1月13日 星期二
2014年11月22日 星期六
JavaScript 基本資料型態
資料型態決定了以什麼方式呈現這個資料,大致上有字元(文字)、數字與邏輯值三種型式。
JavaScript屬於弱型別,也就是在宣告變數時不必特定指定資料型態,變數具體的資料型態會根據變數的具體內容推算出來,並且能隨著內容改變更改型態。
JavaScript屬於弱型別,也就是在宣告變數時不必特定指定資料型態,變數具體的資料型態會根據變數的具體內容推算出來,並且能隨著內容改變更改型態。
資料匿名化
資料匿名化是什麼?
簡單來說,就是對一份資料做匿名處理,使別人猜不透裡頭誰是誰。常看到公布名單時,上頭的名字是王**、alie*******等等,這類都是已經匿名化的資料。
那為什麼需要匿名資料
如何引入JavaScript程式碼
要將Javascript套用到HTML文件中,我們可以使用2種方法:
在HTML文檔中利用<script></script>來封裝JavaScript:
HTML文檔中可以設置事件處理器,我們能透過HTML元素中的某些屬性來啟動一個腳本,這些屬性稱為事件屬性。比如說有這麼一段程式碼被包裝在<script>中:
- 利用<script>標籤
- 使用HTML的事件屬性
利用HTML中的Script標籤
- <script>的屬性:
- language:指定程式語言的版本,預設值為JavaScript
- type:標示插入的腳本程式碼型別
- src:用於將外部的.js 檔引入至當前文檔中,如果與HTML文檔在不同目錄,要另外指定位置
在HTML文檔中利用<script></script>來封裝JavaScript:
利用<script>的src屬性,將.js檔嵌入:<script>...JavaScript Code...</script>
<script type="text/javascript" src="檔案名稱.js"></script>
利用HTML中的事件屬性
HTML文檔中可以設置事件處理器,我們能透過HTML元素中的某些屬性來啟動一個腳本,這些屬性稱為事件屬性。比如說有這麼一段程式碼被包裝在<script>中:
我們能透過設置HTML的事件屬性反應使用者的操作,就像這樣function Click() { alert("Clicked"); }
<input type="button" value="Click" onclick="Click()"> 當這個按鈕被按下時,onclick便會調用JavaScrpit函式Click,跳出訊息Clicked!
而在將程式碼插入至文檔前,我們還需要面對兩個問題:
1.<script>該在哪裡插入?
可以放在<head></head>之間或<body></body>之間,混著放也是可行的,差別在於:
<head>中的程式碼,在頁面載入時就會執行完畢。
<body>中的程式碼,只有對應的函式被調用時才開始執行。
- 2.處理不支援JavaScript的情況:
或是利用<noscript>標籤,當腳本程式碼不被支援時,會在HTML頁面顯示提示資訊。<script> <!-- Code --> </script>
2014年11月21日 星期五
Ezgo project Meeting 1
這次是針對字音字形學習網的排版,除了打算用Html5改寫,也希望達成響應式網頁設計。
這方面決定採用12欄的網格佈局達成,引入了bootstrap協助操作,目前預計完成四個頁面,配合AJAX後大略的規劃長得像這樣:
響應式網頁設計(Responsive web design - RWD)
能讓網頁隨著啟動裝置自動調整版面,換句話說,電腦有電腦的版面,手機有手機的版面,平板也有平板的版面,不用再針對裝置分別設計網站囉,RWD的思維在於響應解析度,隨著解析度的不同,網站的元件會流動至合適的位置,比如原本一行兩列的大按鈕,隨著解析度提高,按鈕會越變越大,當提高到目前的顯示裝置一行容不下兩個按鈕時,第二個按鈕會流動到下一行,變成兩行一列的按鈕。這方面決定採用12欄的網格佈局達成,引入了bootstrap協助操作,目前預計完成四個頁面,配合AJAX後大略的規劃長得像這樣:
2014年11月15日 星期六
訊息鑑別技術
Message Authentication
每說到文件識別技術,我們通常關心三件事:
- 送出的訊息是否完整且正確 (protect integrity)
- 你不會希望在匯款時多送了幾個 0
- 發訊人的身分是不是正確的 (validate identity)
- 防止有人假冒你幹些雞鳴狗盜的勾當
- 發訊人不可否認曾做過的事 (Non-repudiation)
- 沒辦法切割幹過的壞事
- CBC - residue , CMAC(Cipher-based MAC):在區塊加密時進行鑑別
- HMAC :另外用個雜湊函式(Hash) 進行鑑別
什麼是MAC
是Message Authentication code的縮寫,它是文件經過某些演算法(MAC algorith)產生的,能夠擷取出文件訊息,從加解密的而言,我們可以把它當成一個Checksum,用其進行完整性或身分檢查。要使用MAC,傳送方跟接受方需要共享一把鑰匙,這可以視為MAC演算法的一個參數。每當傳送方發送文件時,會經由演算法送出MAC,並附在文件中,接收方在收到文件後,會對收到的文件再做一次演算,如果兩方得出的MAC是相同的,可以假定這份文件沒被修改過。
CBC - Residue
使用了2把Key,一把用於進行CBC模式,一把用於產生MAC(Residue)。CBC - Residue在加密過程幾乎沒有改變,唯一的不同是在最後的明文Pn的加密,他分成兩個部份,我們把Pn和密文Cn-1做XOR產生的東東叫做Xn好了,一是Xn用Key1加密產生最後一份密文Cn,二是Xn用Key2加密產生一個渣渣,這個渣渣跟密文一點關係都沒有,我們把他當做一個校正碼。因為CBC特有的雪崩效應,使得先前的加密有ㄧ些小改變就會造成後續一連串的錯誤,所以我們才能把這個渣渣用做比對。HMAC
1.什麼是 Hash ?Hash是一個單向函式,假設有一個Hash函式H,H(X) = A, 你無法透過A得到X,從加解密而言,Hash做到的只有加密,而沒辦法解密,因此Hash只會用來做驗證及比較。
2.HMAC
道理很簡單,我們有相同鑰匙,相同算法,那麼對相同明文,Hash出來的東西就該相同。
Authenticated Encryption
加密做的是:保證資料的安全驗證做的是:保證資料的完整
而雙管齊下就是Authenticated encryption,直觀來看有這幾種型式:
但是他們都有一個缺點,就是對於N個區塊而言,他們往往要進行2N次的處理。為了解決這個問題,出現了IAPM與OCB這兩種新模式。
IAPM
S0~SM是用做擾亂資料,因為這是個近似ECB的模式。Sigma P 是由P1XorP2...XorPm-1得出的,Cm即為產生的校正碼。
OCB (Offset codebook Mode)
OCB參考資料
Checksum = M1 ⊕…⊕ Mn
2014年11月13日 星期四
軟體的國際化與在地化
自由軟體開發與社群發展
講者:FrankLin
Topic 1.自由軟體的國際化與在地化
- 國際化與在地化
而除了訊息,還可能會涉及當地的觀念,像是:
- 數字表示法
- 年份的表示法
- 日期的表示法
- 金錢的表示法
- 度量衡系統
而現在,為了在同款軟體賣給不同國家時不大量修改,軟體公司提出簡單多國語言化概念。
原始程式→將訊息抽取出來,編索引,存成一個檔案→將該檔的內容翻成不同語言
(原始程式在設計時就該有能檢視索引的機制)
因為訊息已經抽出來了,所以只要針對訊息獨立處理,不必修改原始程式。
Linux 上的中文化始祖 - CLE
Chinese Linux Extension - Linux 中文延伸套件
延伸:修改程式內容,重新編譯打包,以加入中文支援
CLE團隊也知道,光是修改打包只治標而不治本,因此積極與原始Linux團隊合作,期望加入國際化軟體的架構。
包刮 Linux , glibc , QT, KDE ,Gnome......都從收過CLE團隊的修改。
所謂國際化,即是將軟體與特定地區及語言脫鉤的過程,當移植時,不必做內部工程上的大量改變或修正。而在地化便是延續國際化的架構,建立某個地區文化的資料庫,填入該地區文化的資料,供程式在執行期呈現。
關於自由軟體的國際化,主要是靠著Gettext這套軟體進行,Gettext只是套工具,他利用對訊息的包裝,可以將訊息抽取出來集中在一個 .pot 檔,翻譯者只需要拿pot翻譯成不同語言,並各別存成po檔即可,而開發者會將po檔編索引成為mo檔。
po檔分為檔頭與條目:
所謂國際化,即是將軟體與特定地區及語言脫鉤的過程,當移植時,不必做內部工程上的大量改變或修正。而在地化便是延續國際化的架構,建立某個地區文化的資料庫,填入該地區文化的資料,供程式在執行期呈現。
Gettext
po檔分為檔頭與條目:
- 檔頭存放的是po檔與其相對的pot檔的相關資訊,包括產生時間、最後翻譯者,還有複數型的定義 (plural - form)。
- 條目則分為旗標與註解(區別相同訊息但不同意義,e.g: left : leave過去式? 左? )
翻譯工具簡介
- 翻譯資料庫
- Lokalize
- Poedit
- Launchpad、pootle、transifex、tryneeds等線上共筆的翻譯平台
Ezgo打包技術初窺探
- What is ezgo
- 能夠讓從未接觸過OSS的人,接觸OSS並使用它 → 推廣
- 推廣
- 目標客群:從未用過OSS的人
- Ezgo該有哪些特色?
- 選單
- 操作設計上貼近Windows思維
- 從技術面而言
- 屬於客製化的distribution
- 有自己的品牌,卻不是一個獨立的distribution
- Dirty hack產生的問題
- 沒有組織,東西太零散
- 版本一多不易管理
- 不符合Debian規範,無法上傳
- 目前的做法
- 儘可能遵循標準機制,並自動化
- 儘可能採用外加設定檔的方式,不覆蓋現有檔案
- Debian - ezgo
- Debian:套件的老祖宗
- 遵循Debian規範,將常用重複的檔案與設定等等包裝成deb檔
2014年11月1日 星期六
MOPCON 2014 會後會
MOPCON 2014 議程紀錄
這次是MOPCON會後會,主要在分享ㄧ些參加心得和揭露祕辛,所以不會跟議程直接相關唷。
第一次摸去IRSlab,空間比想像中的要大些,席間有提供飲料跟小點心,是個蠻愜意社群環境。分享人是MOPCON贊助組的成員,提及了一些MOPCON內部的分工,研討會的初衷與贊助者的立場等等。
對於贊助商而言,贊助的目的無非是推銷自身的產品,不過今年有些小悲劇,因為會眾有約40%是學生,所以有些產品不怎麼迎合需求,為了拯救贊助商,只好把MOPCON的店面移到贊助商旁邊,希望幫忙挽回一點人氣~算是會議的小插曲吧。
不光是產品推銷,這次的MOPCON也成為獵人頭的手段。分享人提到,這類大型開發者聚會往往是找人才的管道,因為會來參加聚會的,通常也都是對這領域略有了解的人,不妨藉此管道找尋真正適合的人才,比起104的模糊篩選好太多了。
但是這也引發了一個問題,一個堅持在濁水溪以南舉辦的研討會,來的贊助商卻多是北部的,講者也是北下而來,而會眾族群又多是學生,這會不會把南部的資訊人才又往北拉?反而是違背了研討會的初衷。這個問題討論了整整一個小時,直到蘇教授出來Demo自製咖啡機,工作人員是認為,能把北部的資源拿來南部用,這對研討會而言是件好事,而人才流失的問題,這並不是一時半刻就能解決的,MOPCON 至今也才辦了三屆,還不算個成熟的研討會,就先放眼當下,想辦法促進南部的素質吧。
2014年10月30日 星期四
C4 Labs - Meeting 3
主持的是jserv,所以也是開學以來第一次爆滿(?)。比起分享,這此更像是
今天是第一次開講,所以只就幾個章節做了簡單的流覽。jserv分享蠻有趣的,對於內容,將談談作業系統的基本觀念與排程。
#1.排程基本
進入排程之前,先讓我們釐清一件事:
- Program:沒有反應,就只是個程式碼的集合。
- Process:執行中程式的實體。
- Thread:Process的紀錄器,告訴你這個Process幹了什麼。
執行緒既為紀錄器,也是CPU分時的最小單位。一個行程通常有很多執行緒,這其實近似多工的概念。想像一個情形,如果只有一個執行緒,行程內所有的事就得都由他一手包辦,他可能要讀入檔案,又可能又呈現畫面給使用者,但是CPU一次只能分配給一個執行緒使用,這意味著我們必須等這個執行緒讀完檔案,才會有時間來回應使用者,如果前者曠日廢時,我們通常會認為是當機了。而多執行緒則把工作分攤開,我們可以有一個執行緒專職回報,告訴使用者這個行程做了什麼,而其他執行緒繼續埋頭苦幹。
但有一點要注意,多執行緒是近似分工,只是讓工作能同時啟動,真正在做事的還是處理器,如果只有一個執行緒,一個處理器,那你把它分成4個執行緒也不會比較快。事實上,在多執行緒中處理器只是快速的切換執行緒,以達到工作差不多快的效果。
排程, 其實就是如何切換行程。Linux的排程是基於分時,也就是把CPU時間切成許多片段,每一個片段可供一個行程來使用,當程式的時間配額額滿時,就會進行行程切換的操作。而判斷執行順序是來自優先權,它可能是透過一個演算法得出的,每個行程都會有個優先權,排程器(Scheduler)會透過它得知什麼時候該執行什麼程式。
我們先考慮三種行程:
- Interactive process :會不斷跟使用者互動,需要偵測按鍵立即回覆使用者
- Batch process:不需要和使用者互動,常在背景執行
- Real-time process:即時性的,像是影音軟體
此外,Linux 採取搶佔式多任務處理,也就是說當一個行程處於可執行狀態時,核心會將他的優先權和當前執行行程的優先權進行比對,若前者較大,中斷目前的行程,讓排程器挑出應當執行的行程。此外先佔也會發生在當前行程的時間配額額滿的時候,此時,一個鑑別旗標TIF_NEED_RESCHED 會被設立,讓計時器中止及調用排程器。
Execl - 第三次會議
上次的文件似乎沒什麼問題,所以今次又來了兩份新的文件。
一份是關於送餐的紀錄表,先從志工紀錄與長輩資料中讀取出每位志工與長輩,再依照日期分門對送餐紀錄進行統計,因為收到的資料是以日記,而統計結果要以月來看,所以又增加一的份月份表單。雖然觀念感覺蠻容易的,不過因為是動態的增加資料,使得這份文件極其龐大,在雲端進行debug時往往要等個2、3分鐘才會有結果,而且這可能造成了ㄧ些格式上的問題,
今次demo總會跳出ㄧ些莫名其妙的Bug,像在設定共用人員時屢屢失效,為了解決這個情形就延宕了近20分鐘,最後居然是瀏覽器的差異造成的OAO(Firefox → Chrome)。不過最大的問題還是格式出了差錯,從GoogleSheet一下載下來值又不見啦~反射性的檢查Sumproduct在逗號跟乘號之間的比對,結果居然是正確的
太棒了,我們發現了新的錯誤。
如果是平常我會這麼想,不過今天是資安project的死線,幸好我很快的發現了Bug,不然真的要爆炸了。Bug在於公式的枚舉失敗了,真是個奇葩的Bug,開檔時跳出了XML的報錯,推測應該與他有些相關,所以嘗試把全自動改成了文字格式,居然神奇的解決了?
話雖如此,也是到了11點多才完成,光是為了找錯就花了近30分鐘,現在想想真是太不值得了。
一份是關於送餐的紀錄表,先從志工紀錄與長輩資料中讀取出每位志工與長輩,再依照日期分門對送餐紀錄進行統計,因為收到的資料是以日記,而統計結果要以月來看,所以又增加一的份月份表單。雖然觀念感覺蠻容易的,不過因為是動態的增加資料,使得這份文件極其龐大,在雲端進行debug時往往要等個2、3分鐘才會有結果,而且這可能造成了ㄧ些格式上的問題,
今次demo總會跳出ㄧ些莫名其妙的Bug,像在設定共用人員時屢屢失效,為了解決這個情形就延宕了近20分鐘,最後居然是瀏覽器的差異造成的OAO(Firefox → Chrome)。不過最大的問題還是格式出了差錯,從GoogleSheet一下載下來值又不見啦~反射性的檢查Sumproduct在逗號跟乘號之間的比對,結果居然是正確的
太棒了,我們發現了新的錯誤。
如果是平常我會這麼想,不過今天是資安project的死線,幸好我很快的發現了Bug,不然真的要爆炸了。Bug在於公式的枚舉失敗了,真是個奇葩的Bug,開檔時跳出了XML的報錯,推測應該與他有些相關,所以嘗試把全自動改成了文字格式,居然神奇的解決了?
話雖如此,也是到了11點多才完成,光是為了找錯就花了近30分鐘,現在想想真是太不值得了。
2014年10月18日 星期六
我的紫微星哪有這麼萌!?
這次的分享和之前有個很大的不同,就是製作團隊從工作室至公司,所以在企劃、創作與行銷方面有著不同的格局,也論及到較多實務上及行銷上的策略,可以說是更貼近遊戲產業的現實面吧~
#1.星耀學園是什麼樣的作品
星耀學園是以紫微斗數為題材去進行動漫化的作品,當然啦,我們不能只餵公子吃天文圖,便置入了一堆萌妹子代表各個星靈,校長也坦承這近似西洋的黃道十二宮,但是就根本來看,把紫微斗數當背景的AVG還真的是絕無僅有,這無形中也成了行銷的噱頭。
學園設定來自於烏來鄉,至於為什麼在烏來鄉?因為那裡有山有水有溫泉,簡單來說就是滿滿的特色,而且像這樣的神奇學園,如果待在大都市裡大概天天都會被查水表,也顯得競技場這類古色古香的情境格格不入。
#2.遊戲實務製作部分
設定方面往往歸類於前期企劃,而在一個大團隊中,企劃特別要講究方法。
要將企劃內容盡可能的圖像化,不必拘泥於精細度,但是一定要呈現出概念與流程,比如說要做神奇寶貝的戰鬥,企劃要告訴團隊要如何呈現,像戰鬥方式(回合or即時)、場景配置、神奇寶貝出現的位置等等。我們可以寫一個小程式來模擬企劃內容,這樣討論時不僅降低溝通上的失誤,也能更貼近實務上面臨的難點或對現有設定該加強的部分。
而說起AVG,圖量相較於程式更重,如差分圖、臉部表情、立繪,這些都是需要精雕細琢的部分,而且良好的CG對於進軍同人市場是不可或缺的,講者有特別提到,以現今台灣市場的行情,一片沒有動畫化的AVG能賣個一千片就算不錯了,成本的回收只能鎖定在同人市場,比如角色人物的周邊,日常四格漫畫以及輕小說等等。
#3.業界的發展情形
首先要面對一個現實,所謂國產遊戲,風格到底要是什麼?
講者認為,什麼風格有市場,就嘗試什麼風格。
台灣經常有一種聲音,國產遊戲該有新風格,但是到底要如何去呈現、如何去定義,退一步而言,就算呈現出了新風格,也不保證能在市場上存活。其實原創並沒有什麼風格的問題,考慮風格當然很好,但是作品要先達到及格標準才行。
進行企劃時的思考點:
1.玩票性質與長遠發展2
2.外部及內部資源的評估
- 確保資金回收\合作對象\企劃\程式\美術
- 大眾或小眾,以什麼去決勝負
- 低美術門檻/高遊戲性 v.s 高美術門檻/低遊戲性
- 老實說,靠現今靠遊戲性出線的非常非常少
- Steam/appstore/ps平台……
6.開發規模與賣點
7.上市時間與通路
- 避免碰撞強檔,考慮發行商
9.數據回收與後期報告
- 數位文創投資報酬率高\風險也相當高
- 既然決定的是數位文創,就該注重在版權授權,這在數位文創上的獲利才是最高的
12.策略上的盲點
- 游擊戰與陣地戰的選擇
- 推很多不一定紅的 v.s 拼一步會紅的
- 海外市場的佈局策略與輸出
- 開闢第二戰場
- 同人/週邊/置入性行銷
- 品牌聯名效應
- 虛擬與實體的交叉模式
- 透過展覽推銷遊戲
- 時間換取空間的策略模式
2014年10月16日 星期四
Excel - 第二次會議
這次開會是21:00~23:00 ,比起上次挑燈夜戰到00:30,整體狀況感覺好了很多。不過感冒還是沒有好,感謝AJ提供的楊桃汁跟金桔汁,可惜我從小喝到大,現在已經對那些有陰影了。
經歷了兩個禮拜,終於成功解決了sumproduct的問題,一開始就有發現到,是資料型態上出了錯誤,但是第一次嘗試時沒有加括號才找不到參考。現在整份表單都有值了,剩下都只是些數值上的小bug。比如對於一個紀錄時間的空儲存格判斷,在Google Sheet上會判斷為12月,而Excel上會列入1月,至今我仍理不清這種詭異的邏輯。會議中AJ提議要再對值的有無進行一次確認,但是我對人數的完整性有點顧慮而沒做答覆,人工算表一個小時表示痛苦,畢竟我們也不知道業主什麼時候才會維護表,到時候總人數突然跳到就又陷入一個除錯迴圈,所以我只另外標紀了有問題的儲存格而已。
這禮拜又收到了一份新案子,內容是關於南投的社區照顧。雖然有一部分是為了分工方便,但我仍認為這類文件應該要用資料庫保存,沒匿名化的資料放在雲端實在不怎麼安全。在9月討論AJ有提到的是別自行開發,避免會期結束後程式沒人維護,不過使用現有的軟體應該也是個辦法,當然我不否認,比起Excel填表與Google文件,如何使用一個資料庫就顯得專業些,教學上也會較難以著墨。
這禮拜新學到的函式Filter,這個東西真是太酷了,他能夠對表單中的資料做篩選,如果我們給每個專案一個ID,那透過篩選ID的動作,就能用拉選的方式分隔開每個專案,宛如一個小型的資料庫。我們目前有2個表單要處理,一個是紀錄表,一個是給志工填入的總表,志工只需要在總表輸入ID/生日/案主等等的資料,就會把資料傳入紀錄表對應的ID裡,每個ID預定可以儲存20筆資料。架構是這樣,不過編寫的過程出了一些小Bug,我猜是在拉動Execl時沒有用$固定行造成的問題,因為我們將3儲存格合成1個用,比如ABC當成A用,但是在判斷時卻把A/B/C輪著用,不過學長即時的解決了這個Bug,目前這份表單看來是沒有問題的。
為了要在會議上刷些存在感,一直是我嘗試理解那些拗口函式的最大動力,還記得剛收到第一份表時,感覺就像是踏出新手區就直接打最終Boss了,有種不知如何學起的無力感,而且裡頭的用法實在蠻進階的,google也沒什麼值得參考的範例,更別提去解決問題了。不過現在來看,其實這幾次會議讓我進步蠻多的,可能跟越級打怪有點關係,我不確定以後還會不會用Excel來做統計分析,但我知道的是,我對如何應用所學更進一步。當初填組時其實是選教學組,因為我很擔心跟不上開發的腳步,但從這幾次的成果來看,其實不是個打醬油的,幸好當時選填人數不夠,不然我應不會有這段值得回味的精歷。
經歷了兩個禮拜,終於成功解決了sumproduct的問題,一開始就有發現到,是資料型態上出了錯誤,但是第一次嘗試時沒有加括號才找不到參考。現在整份表單都有值了,剩下都只是些數值上的小bug。比如對於一個紀錄時間的空儲存格判斷,在Google Sheet上會判斷為12月,而Excel上會列入1月,至今我仍理不清這種詭異的邏輯。會議中AJ提議要再對值的有無進行一次確認,但是我對人數的完整性有點顧慮而沒做答覆,
這禮拜又收到了一份新案子,內容是關於南投的社區照顧。雖然有一部分是為了分工方便,但我仍認為這類文件應該要用資料庫保存,沒匿名化的資料放在雲端實在不怎麼安全。在9月討論AJ有提到的是別自行開發,避免會期結束後程式沒人維護,不過使用現有的軟體應該也是個辦法,當然我不否認,比起Excel填表與Google文件,如何使用一個資料庫就顯得專業些,教學上也會較難以著墨。
這禮拜新學到的函式Filter,這個東西真是太酷了,他能夠對表單中的資料做篩選,如果我們給每個專案一個ID,那透過篩選ID的動作,就能用拉選的方式分隔開每個專案,宛如一個小型的資料庫。我們目前有2個表單要處理,一個是紀錄表,一個是給志工填入的總表,志工只需要在總表輸入ID/生日/案主等等的資料,就會把資料傳入紀錄表對應的ID裡,每個ID預定可以儲存20筆資料。架構是這樣,不過編寫的過程出了一些小Bug,我猜是在拉動Execl時沒有用$固定行造成的問題,因為我們將3儲存格合成1個用,比如ABC當成A用,但是在判斷時卻把A/B/C輪著用,不過學長即時的解決了這個Bug,目前這份表單看來是沒有問題的。
為了要在會議上刷些存在感,一直是我嘗試理解那些拗口函式的最大動力,還記得剛收到第一份表時,感覺就像是踏出新手區就直接打最終Boss了,有種不知如何學起的無力感,而且裡頭的用法實在蠻進階的,google也沒什麼值得參考的範例,更別提去解決問題了。不過現在來看,其實這幾次會議讓我進步蠻多的,
2014年10月13日 星期一
雨港基隆的製作與誕生
講者:Erotes Studio 李處守總召
Erotes的團隊跟上次一樣都是蠻輕巧的,而且因為成員四散各洲,所以作業都是雲端進行,沒有特定的工作室,
談談遊戲的背景,就算沒聽過雨港基隆,也該看過鼎鼎大名李元德吧
接下來絕對沒有劇透了,不過有病測驗寫過的東西我可能就會少提ㄧ些。回歸正題,遊戲的背景設定在228時期,嗯......看起來就像是會被查水表的東西。文本與CG一直都是AVG相當重要的部分,為了追求背景的一致性,觸手在前期企劃時還特別去圖書館、國民黨黨史館借資料,訪問當時的受難者等等。
既然提到了前期企劃,就先從這部分說起吧~這部分包括了
- 開發預算
- 避免無止盡的錢坑,評估是否能回本
- 設計核心
- Why、How、What
- 瞄準客群
- 這同時影響了收費管道與遊戲路線
- 企劃書
想要跟別人做合作,你總是得要有個拿的出手的東西。特別是在你沒什麼名氣的時候,想要找到比較強的人才,或者希望壓低價格、請人幫忙推廣,企劃書就是必備的,因為這一定程度的避免了玩票性質,傳達給外界「我們有在做事,而且我們很清楚自己要做的是什麼」。那麼企劃書該有什麼,從雨港基隆來看,就是粗估劇情大綱、未來走向、CG與立繪的量,如果能擬定好這些,對團隊也相當有幫助,至少很清楚進度條在哪。
再來說說簽約,無論是面對朋友或合作夥伴,簽約都算是必備的,即便是無償幫忙也該簽個約,不然出包時真的會非常痛苦,你會陷入一個良心跟死線之間的兩難。首先,這是對雙方的協調窗口,避免日後分紅時發生爭執。再者簽約確保了對遊戲該有的熱誠,總召要確保的是遊戲完成,總不能編劇寫了一半不幹了,CG在死線之前跳票,總而言之,簽約其實是對整個團隊的一個保障。
既然雨港基隆屬於AVG, 不可不談CG的重要性,雖然文本也是很重要的,但是要注意,在還還沒有知名度的時,沒有人會替你的劇本背書,CG自然成為客人首先關注的焦點。而好CG也需要好繪師,觸手談到諮詢繪師不外乎有三點
- 對價格要有基本的認知
- 不斷的投遞企劃書,不要怕被打槍
- 透過各種人脈找
「編劇編劇,我覺得這個段落要做些小修正會比較好」
「OK」
----- 一個禮拜後 -----
「欸,上次不是要你改這部份嗎,怎麼還是一樣」
「你不是說小修正嗎?」
大概是這種情境,沒吵起來倒是還好,但是工作進度是一定會拖延了,與其如此,不如一開始就把話說明,這也是之前為何強調同伴不適合找自我意識太強的人,劇情的好壞本就因人而異,需要做的是討論與修改,而居中協調就是總召最重要的任務。
2014年10月8日 星期三
C4 Labs - Meeting 2
呵呵~上禮拜還覺得很親民,這次就被制裁了
#1. Linux 程式分享
淺談在終端機上打殭屍,由於我ezgo還沒有實裝,對講者的分享不大有深刻體認,諸如:
說明文件告訴你:他很酷,他很吃資源。
#2.Zend Framework
推一部sitcon的研討會,我覺得講解蠻清楚的,還有附送練習題
你可能會對framework與IDE產生一些混淆,可以把framework當作是一個函式庫,透過它能讓你在編寫軟體時更加容易,而IDE 則是執行、編寫code來套用框架的工具。比方說Qt、.NET都是框架,而欲使用這些框架你需要一個IDE來引入他們。
#1. Linux 程式分享
- ranger :終端機上的檔案管理員
- catimg :可以在終端機上觀看圖片
- cmus :可以在終端機上播放音樂
- nano : 文書編輯器
- yes:他會一直輸出y輸出y輸出y,直到天荒地老
- cowsay:你可以印出一頭牛,並且讓他說話!
< I Love nix > ------------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||- ponysay:wow,你可以印出彩虹小馬
- cmatrix:
說明文件告訴你:他很酷,他很吃資源。
#2.Zend Framework
- Zend Framework
推一部sitcon的研討會,我覺得講解蠻清楚的,還有附送練習題
- 框架(Framework)
a software framework is an abstraction in which software providing generic functionality can be selectively changed by additional user-written code, thus providing application-specific software簡單來說,可以把framework視為開發某個應用的大型函式庫,裡頭包含了各式各樣在開發該項應用時需要用到的功能,這些都已經是可以重複使用的組件,當然,你也可以改寫這些功能來迎合自己的需求。
你可能會對framework與IDE產生一些混淆,可以把framework當作是一個函式庫,透過它能讓你在編寫軟體時更加容易,而IDE 則是執行、編寫code來套用框架的工具。比方說Qt、.NET都是框架,而欲使用這些框架你需要一個IDE來引入他們。
- 網頁應用框架
- Model–view–controller (MVC)
- Push-based vs. pull-based
- Three-tier organization
- MVC架構
- Model : 用來進行演算法及資料庫
- Viewer :就只負責呈現使用者所看到的介面
- Controller :可以想作Model與Viewer之間的橋樑,是邏輯處理的大本營
- 會把從Model獲得的資料傳給Viewer呈現
- 會對Viewer上的操作進行判斷,看要讓Model中的哪支程式處理它
2014年10月5日 星期日
聊聊有病遊戲的東南西唄
講師:哈利菠菜
遊戲四元素:程式、美術、企劃、行銷
關於程式,除了要日常研磨自身的技巧外,最重要的就是要有個原形,不論是不是遊戲設計,在設計途中更改規格都是相當危險的,這不僅將大幅延誤開發進度,更會磨損組員之間的信任關係。對於一個專案的開發,務必要與組員之間先溝通好規格,最好能夠事先繪製出一份圖表,如此途中可能發生的錯誤也能先作出應對。
談談美術,這次的講題主要是獨立遊戲:我滿懷青春的有病測驗,其實我認為講師的工作團隊蠻特殊的,它是以講師為溝通核心,其他成員彼此不認識,在協調上自是費力些,尤其是美術這部分就費時半年。對於美術的好與壞,其實這是一個相當抽象的概念,所以我們必須要去強調設定的重要性,何謂設定?大至世界觀,區住環境,民俗風情,這些會影響角色的外貌如服飾、膚色、刺青等等,而小則至家庭背景與人物性格,它能表現出人物該有的動作與氣質。而談到如何加強設定的功力,廣泛閱讀與社交是個不錯的方法,它能讓你更了解何為一個角色。
談到美術之間的溝通,就是要求清晰,我記得講者提到延宕半年的理由,就是他收到第一任美術的人設圖時,回覆的是「沒有悸動」。價值觀的模糊會影響達成共識的速度,半年後,講師改用一些具體的方法陳述,像是「領口要再下來一公分左右」,「裙子可以再往上提高一點點」,並且就文獻內容來跟美術溝通,效率就快了許多。
企劃及行銷其實是一體兩面,現在APP的市場已經殺成一片紅海,單一下載量的成本翻倍提升,更必須著重在這個區域。我很認同講師提出的一個黃金圈概念:
- 想讓玩家體驗到什麼感受 - Why
- 想讓玩家用什麼樣的玩法 - How
- 遊戲應該最後長什麼樣子 - What
至於行銷方法我認為也是一個類似的概念,要有推銷的核心。思考兩個問題,什麼遊戲最好玩?什麼遊戲最有病?我想後者帶來的印象會深刻些,雖然這在某部分也會限縮住客群,哈利波菜特別於此有提到一個失誤:其實這個遊戲一開始是瞄準大學生跟OL的,不過主要下載者都來自於中小學生,這在收費策略上出了些問題,因為沒有引入My Card機制,雖然下載量相當高,成本還是不大能回收。其實這讓我蠻訝異的,一個App排行前10,累積下載量近30萬的作品居然不算賺錢,這可能令不少獨立遊戲者望之卻步。
感謝NCKU遊戲工作坊,感謝哈利菠菜,讓我回想起選擇資工的理由。尤其是看到桃轅傳
有劇情,有配音,有音效,有美術,又有遊戲模式,我從沒想過在大學時期能做到這個地步,這場演講真是太精采了!
2014年10月2日 星期四
Excel維護 - 第一次會議
第一次開會,閒聊時間比我想像來的長~~很~~多~~~,主要都在自我介紹跟分享開發經驗,不過大家都沒說幾句話,當下感覺氣氛超沉悶的崩╰(〒皿〒)╯潰,期待日後能慢慢的有話聊,至少在半年間合作愉快XD
資訊顧問,這個名號感覺纏繞著霸氣,可惜我不是吃了Excel果實的EXEX人,為了不辜負這個名號,只好照三餐問候那張圖表,看著看著就日久生情有了點心得,也寫了一些函式嘗試去改進它
不過我沒聽說過要在會議上發表啊啊啊啊啊!!!!!!!!!
看到會議通知的當下
我的Excel真的只有學了一個禮拜,加上當天重感冒又跑C4 Labs,還來不及進旅店就被拖進了會議室,我在麥克風前就只是隻HP=1的風中蟾蜍。真心認為,這次的發表不甚理想,雖然我本來就是個不擅言詞的人(?),但是回想不出自己說過什麼還是頭一遭,那時可能真的就靠直覺去做判斷吧,下次應該先擬好一份簡報,至少在狀況差時還能做些應對,
我個人其實對除錯蠻感興趣的,不過是在ACM以外的地方,比方是這次的Excel。主要的錯誤是在Google試算表上可得的值,到了Excel裡變成 0,到了Number會少值,而錯誤是出現在多個sumproducts的Arrayformula跟vlookup上
Number會少值其實是我的誤判。Number在遇上函式不相容時,會先把儲存格內容轉為文字型態而非實際數值,這使得countif > 0會少算了浮點數。
Excel在這方面就乾脆多了,直接把所有的值都換成0,讓你不得不跟他來場生死決鬥。
除了一開始在編輯器上錯誤的嘗試之外,曾經想過把sumproducts轉換成sum,可惜功力不夠,參不透所有運算表達的意義,而且對vlookup是無解的。之後又把腦筋動到Arrayformula,結果還是Fail T_T,最後只好嘗試這兩個無效的函式剩下的的交集,都導入了其他試算表的資料,我猜應該是在這方面不太嚴謹吧,當初看到沒有用indirect就感覺毛毛的。
距離下次會議還有兩個禮拜,或許有時間把一些危險的東東糾正過來,之後再對所有問題做個小統整吧~
2014年10月1日 星期三
Array - 陣列
1.陣列
陣列可想成是相同資料型態的一組集合,每個集合中的元素都會有一個索引值,透過 [ ]
陣列存取運算子,我們便能取得陣列中的元素。
2.C語言中實做一個陣列
當編譯器遇到了一個 Element_type array[SIZE] 的宣告,它會分配 SIZE 個連續記憶體給這個陣列,其中每份記憶體都足以儲存Element_type的大小。
陣列可想成是相同資料型態的一組集合,每個集合中的元素都會有一個索引值,透過 [ ]
陣列存取運算子,我們便能取得陣列中的元素。
2.C語言中實做一個陣列
當編譯器遇到了一個 Element_type array[SIZE] 的宣告,它會分配 SIZE 個連續記憶體給這個陣列,其中每份記憶體都足以儲存Element_type的大小。
也由於分配出的記憶體是連續的,我們能瞭解每一個元素的記憶體位置。對於第i個元素,他的位置是:
array + (i-1)*sizeof(Element_type)
還記得嗎,c的陣列是從0開始的,所以必須先執行 (i-1)。要特別注意,當i=0的時候,就是陣列本身,也是第0個元素儲存的位置,所以我們能夠這麼說:
array = &array[0]
有了每個元素的位置,利用 * 運算子就能夠依照位置取得元素的值了,若要取得第i個元素(從0開始)的值:
array[i] = *(array + i);
上述兩種取值方法是等價的。
值得一提的是,在C語言中,我們不必對i*sizeof(Element_type)進行處理。
值得一提的是,在C語言中,我們不必對i*sizeof(Element_type)進行處理。
C4 Labs - Meeting 1
頭次聽說系上有社群應該是半年前,那時頂多看看議程跟主題,一來是因為怕進去就像個打醬油的,二來是因為真的沒什麼動力能讓我騎15分鐘的夜車。不過歷經一年
這次的會議花了大約40分鐘在推SITCON的坑,剩下的則是利用python來做網路爬蟲。
- #1. 什麼是SITCON?
其實SITCON有的不只是年會而已,還有Hackgen跟不少Workshop,不過Hackgen就是要直接衝code上戰場了,年會比起來就平易近人一點,而且題目也能自由挑選。就像前文說的,如果認為自己有些想分享的,也能去交稿挑戰自己,或者當場報個Lightning talk。
- #2. 網路爬蟲
整體概念以requests為核心,然後利用beautifulsoup(
爬蟲不單需要python,對HTML與CSS也要有點認知才行,否則在查找原始碼時也不知道哪些是需要的資料。
2014年8月6日 星期三
演算法效率與Big oh
要討論一個演算法的效率,可以從空間複雜度和時間複雜度兩方面來分析。
關於空間複雜度,指的是演算法所占用的儲存空間,可以考慮為固定空間與變動空間的總和。固定空間指的是程式用來儲存指令、變數、常數及結構等等所耗費的空間。而可變空間則涉及了程式的輸入大小,或者遞歸呼叫等等所要占用的空間,需要視解決的問題而更動。一般而言,程式所需的全部空間S(P) =Sp(I) + c,前者為變動空間,後者c為一常數,屬於固定空間。
關於時間複雜度,考慮的是演算法執行完成要花費多少時間,包括了編譯和執行時間,不過一個程式編譯後能執行多次而不需重新編譯,因此,我們真正關心的是程式的執行時間。至於如何得知執行時間?基本上有兩個方法,一是利用計時程式來幫助我們,例如引入<time.h>,不過這會因硬體設備產生偏差,二是土法煉鋼,計算出程式需要多少個步驟完成,但這又讓我們面臨一個新問題,如何定義一個步驟?
我們先暫且假設一個步驟等同於一個指令,意思是t++這種簡單的指令與t=t+3*a+4*b+5*c這種複雜的計算都為一個步驟,現在。我們已經能藉由一個變數來對一個程式記數,例如:
step告訴我們這個程式共花了103個步驟,如果將50改為一個自由輸入的變數n,那麼步驟總數即為2n+3次。
題外話,你可能會很好奇為何int i沒有被列入step,因為從系統的角度來看,宣告一個變數只是在編譯時建立一個空間,並不會產生什麼對應的程式碼,除非在宣告時有分配一個值給變數。
不過還記得嗎?先前我們對步驟的定義一點也不精確,即便一行一行的慢慢數,也未必有助於估計效率。換句話說,既然從一開始就是估計,結果也是夠用就好,那麼夠用又是指什麼程度呢?如果從極限的角度出發,在n極大時,2n+3的3影響微乎其微,一兆與一兆零三元相差無幾,進一步而言,an^2+b與cn+d,我們不必精確知道常數a、b、c、d,代表什麼,因為函數的成長趨勢告訴我們,在n突破某個值後,前者所耗費的時間必定會超越後者。當然,不排除在n不夠大時考量效率會做出錯誤判斷,但通常我們在意的往往是相當大的輸入,而不是拘泥幾微秒的差距。
Big O notation
談時間複雜度,總是不能忘記他的老跟班Big-Oh,它是一個漸進符號,至於為什麼用O,有人說是代表Order,有人說是形容你看到它的表情。總之,O能夠描述函數漸進的趨勢,他的快樂夥伴還有Ω (omega)跟Θ(theta),不過目前先介紹他們的老大。
但是,這樣會導致一個問題,答案多樣性,它是生物多樣性的好朋友,常見於作業、考卷讓學生被當掉。
比方說 f(n)=123n+456,那我能說g(n)=n,g(n)=n2,或者像g(n)=en2+5n+8這種奇葩函數,只要能找到適合C和M,都算是個解。為了解決這個問題,我們希望g(n)越小越好,如此它才最接近,也最能夠描述逼近的趨勢,所以當f(n)=123n+456n時,我們預期g(n)=n,而不是n2,儘管這個答案是正確的。
說了這麼多,那要怎麼去預期?
最直觀地去想,找影響趨勢最大的就對啦,我們考慮的是極限,所以攻略目標是一個函式裡,極限值最大的那個,從成長趨勢的大原則說起,
多重指數函數 > 階乘 > 指數函數 > 多項式函數 > 對數函數 > 常函數
關於空間複雜度,指的是演算法所占用的儲存空間,可以考慮為固定空間與變動空間的總和。固定空間指的是程式用來儲存指令、變數、常數及結構等等所耗費的空間。而可變空間則涉及了程式的輸入大小,或者遞歸呼叫等等所要占用的空間,需要視解決的問題而更動。一般而言,程式所需的全部空間S(P) =Sp(I) + c,前者為變動空間,後者c為一常數,屬於固定空間。
關於時間複雜度,考慮的是演算法執行完成要花費多少時間,包括了編譯和執行時間,不過一個程式編譯後能執行多次而不需重新編譯,因此,我們真正關心的是程式的執行時間。至於如何得知執行時間?基本上有兩個方法,一是利用計時程式來幫助我們,例如引入<time.h>,不過這會因硬體設備產生偏差,二是土法煉鋼,計算出程式需要多少個步驟完成,但這又讓我們面臨一個新問題,如何定義一個步驟?
我們先暫且假設一個步驟等同於一個指令,意思是t++這種簡單的指令與t=t+3*a+4*b+5*c這種複雜的計算都為一個步驟,現在。我們已經能藉由一個變數來對一個程式記數,例如:
step告訴我們這個程式共花了103個步驟,如果將50改為一個自由輸入的變數n,那麼步驟總數即為2n+3次。
題外話,你可能會很好奇為何int i沒有被列入step,因為從系統的角度來看,宣告一個變數只是在編譯時建立一個空間,並不會產生什麼對應的程式碼,除非在宣告時有分配一個值給變數。
不過還記得嗎?先前我們對步驟的定義一點也不精確,即便一行一行的慢慢數,也未必有助於估計效率。換句話說,既然從一開始就是估計,結果也是夠用就好,那麼夠用又是指什麼程度呢?如果從極限的角度出發,在n極大時,2n+3的3影響微乎其微,一兆與一兆零三元相差無幾,進一步而言,an^2+b與cn+d,我們不必精確知道常數a、b、c、d,代表什麼,因為函數的成長趨勢告訴我們,在n突破某個值後,前者所耗費的時間必定會超越後者。當然,不排除在n不夠大時考量效率會做出錯誤判斷,但通常我們在意的往往是相當大的輸入,而不是拘泥幾微秒的差距。
Big O notation
談時間複雜度,總是不能忘記他的老跟班Big-Oh,它是一個漸進符號,至於為什麼用O,有人說是代表Order,有人說是形容你看到它的表情。總之,O能夠描述函數漸進的趨勢,他的快樂夥伴還有Ω (omega)跟Θ(theta),不過目前先介紹他們的老大。
1.Big-Oh定義:
簡單來說,f(n)的成長速度不會超過g(n),頂多跟他一樣快而已。
以上文舉例:f(n) = 2n+3,g(n)=n,則當N大於3時,f(n)不大於3*g(n),我們便可以說f(n) = O(n)
再舉一個比較常見的例子:當N>5時,10n2+10 < 11n2,因此10n2 +10 = O(n2)
「看,很簡單吧」。「我們在這裡沒有什麼錯誤,只有快樂的意外。」
f(n) = O(g(n)):存在常數C、M,對於所有大於M的輸入N,使得f(n)不大於C*g(n)
簡單來說,f(n)的成長速度不會超過g(n),頂多跟他一樣快而已。
以上文舉例:f(n) = 2n+3,g(n)=n,則當N大於3時,f(n)不大於3*g(n),我們便可以說f(n) = O(n)
再舉一個比較常見的例子:當N>5時,10n2+10 < 11n2,因此10n2 +10 = O(n2)
g(n)怎麼來的?怎麼突然蹦出一個3?4不行嗎?4也是符合答案啊,教科書就這麼討厭4嗎?如果要亂入的話,我也能讓g(n)=99n,這樣我N=1的時候也對呀,而且我答案還是f(n) = O(99n)耶。更傷心的是,它還舉了滿滿一頁的例子來嘲諷我,不禁令我回想起童年中那顆超級爆炸頭。
首先,範例就真的只是個範例,他沒有要你求任何東西。先回顧一下定義,f(n)的成長速度不會超過g(n),換句話說,當n非常非常大的時候,f(n)一定會比g(n)矮,那如果我們把g(n)整形成g'(n):
g'(n) = g(n)+1,f(n)會不會比g'(n)矮?會
g'(n) = g(n)+2,f(n)會不會比g'(n)矮?當然會
g'(n) = g(n)+2,f(n)會不會比g'(n)矮?肯定會
我們能一直+++++出各式各樣的g'(n),當然,g'(n)=2g(n)也是個可行的辦法,定義告訴我們:只要g(n)在座標軸的右端比f(n)高就成了,別去在乎他高了多少。照這樣看來,g(n)會有很多種可能囉?就定義上來看,沒錯,如果符合定義,我們就能舉出各式各樣的答案。
但是,這樣會導致一個問題,答案多樣性,它是生物多樣性的好朋友,常見於作業、考卷讓學生被當掉。
比方說 f(n)=123n+456,那我能說g(n)=n,g(n)=n2,或者像g(n)=en2+5n+8這種奇葩函數,只要能找到適合C和M,都算是個解。為了解決這個問題,我們希望g(n)越小越好,如此它才最接近,也最能夠描述逼近的趨勢,所以當f(n)=123n+456n時,我們預期g(n)=n,而不是n2,儘管這個答案是正確的。
說了這麼多,那要怎麼去預期?
最直觀地去想,找影響趨勢最大的就對啦,我們考慮的是極限,所以攻略目標是一個函式裡,極限值最大的那個,從成長趨勢的大原則說起,
多重指數函數 > 階乘 > 指數函數 > 多項式函數 > 對數函數 > 常函數
訂閱:
文章 (Atom)






















