顯示具有 標籤的文章。 顯示所有文章
顯示具有 標籤的文章。 顯示所有文章

2015年1月13日 星期二

Graph - 圖

1.如何定義一張圖:
 
圖(Graph)是由點(Vertex)與邊(Edge)構成,以G = (V,E)表示。

2014年11月22日 星期六

JavaScript 基本資料型態

資料型態決定了以什麼方式呈現這個資料,大致上有字元(文字)、數字與邏輯值三種型式。

JavaScript屬於弱型別,也就是在宣告變數時不必特定指定資料型態,變數具體的資料型態會根據變數的具體內容推算出來,並且能隨著內容改變更改型態。


資料匿名化

資料匿名化是什麼?


簡單來說,就是對一份資料做匿名處理,使別人猜不透裡頭誰是誰。常看到公布名單時,上頭的名字是王**、alie*******等等,這類都是已經匿名化的資料。

那為什麼需要匿名資料

如何引入JavaScript程式碼

要將Javascript套用到HTML文件中,我們可以使用2種方法:
  • 利用<script>標籤
  • 使用HTML的事件屬性 
 

 

利用HTML中的Script標籤

  • <script>的屬性:
  • language:指定程式語言的版本,預設值為JavaScript
  • type:標示插入的腳本程式碼型別
  • src:用於將外部的.js 檔引入至當前文檔中,如果與HTML文檔在不同目錄,要另外指定位置
透過script標籤,我們能達成兩個方法:
在HTML文檔中利用<script></script>來封裝JavaScript: 
<script>...JavaScript Code...</script>
利用<script>的src屬性,將.js檔嵌入:
<script type="text/javascript" src="檔案名稱.js"></script>

利用HTML中的事件屬性


HTML文檔中可以設置事件處理器,我們能透過HTML元素中的某些屬性來啟動一個腳本,這些屬性稱為事件屬性。比如說有這麼一段程式碼被包裝在<script>中:
function Click()
{
    alert("Clicked");
}
我們能透過設置HTML的事件屬性反應使用者的操作,就像這樣
<input type="button" value="Click" onclick="Click()">
當這個按鈕被按下時,onclick便會調用JavaScrpit函式Click,跳出訊息Clicked!  
而在將程式碼插入至文檔前,我們還需要面對兩個問題:
  • 1.<script>該在哪裡插入?  
可以放在<head></head>之間或<body></body>之間,混著放也是可行的,差別在於:
<head>中的程式碼,在頁面載入時就會執行完畢。
<body>中的程式碼,只有對應的函式被調用時才開始執行。 


  • 2.處理不支援JavaScript的情況:
可以將程式碼包裝在<!-- -->當中,如果瀏覽器不支援JS便會自動跳過,比如
<script>
<!--
     Code
-->
</script>
或是利用<noscript>標籤,當腳本程式碼不被支援時,會在HTML頁面顯示提示資訊。


2014年11月21日 星期五

Ezgo project Meeting 1

這次是針對字音字形學習網的排版,除了打算用Html5改寫,也希望達成響應式網頁設計。

響應式網頁設計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


INDEX Topic 1.自由軟體的國際化與在地化
Topic 2.Ezgo打包的技術初窺探

講者介紹:
Franklin,在社群中被稱為馬哥,大一開始玩Linux,但真正栽入Linux與OOS是在念研究所時。出社會後都在做RD,現在則是以OSS為業的浪人。
2006年起,擔任KDE中文化團隊的協調人。

Topic 1.自由軟體的國際化與在地化


 Ezgo是推廣自由軟體用的一個系統,既然要推廣,中文化就是個相當重要的部分。
  • 國際化與在地化
過去的軟體,光是要能顯示中文,就要處理很多事情,如訊息的顯示、字型(px上的設定,同時涉及了自行的解析度)、編碼問題,使得在過去中文版的推出,即是一件大事。

而除了訊息,還可能會涉及當地的觀念,像是:
  • 數字表示法
例如在歐洲大多數的國家,1.000是一千,1,000才代表1,假設今天有一個德國的會計軟體,台灣中文化就得做內部的修改。
  • 年份的表示法
  • 日期的表示法
  • 金錢的表示法
  • 度量衡系統
這些都是在軟體在地化時要做的處理。

而現在,為了在同款軟體賣給不同國家時不大量修改,軟體公司提出簡單多國語言化概念。

原始程式→將訊息抽取出來編索引,存成一個檔案→將該檔的內容翻成不同語言
(原始程式在設計時就該有能檢視索引的機制)
因為訊息已經抽出來了,所以只要針對訊息獨立處理,不必修改原始程式。

Linux 上的中文化始祖 - CLE


Chinese Linux Extension - Linux 中文延伸套件
延伸:修改程式內容,重新編譯打包,以加入中文支援

CLE團隊也知道,光是修改打包只治標而不治本,因此積極與原始Linux團隊合作,期望加入國際化軟體的架構。
包刮 Linux ,  glibc , QT, KDE ,Gnome......都從收過CLE團隊的修改。

所謂國際化,即是將軟體與特定地區及語言脫鉤的過程,當移植時,不必做內部工程上的大量改變或修正。而在地化便是延續國際化的架構,建立某個地區文化的資料庫,填入該地區文化的資料,供程式在執行期呈現。

Gettext


關於自由軟體的國際化,主要是靠著Gettext這套軟體進行,Gettext只是套工具,他利用對訊息的包裝,可以將訊息抽取出來集中在一個 .pot 檔,翻譯者只需要拿pot翻譯成不同語言,並各別存成po檔即可,而開發者會將po檔編索引成為mo檔。

po檔分為檔頭與條目:

  • 檔頭存放的是po檔與其相對的pot檔的相關資訊,包括產生時間、最後翻譯者,還有複數型的定義 (plural - form)。
  • 條目則分為旗標與註解(區別相同訊息但不同意義,e.g: left : leave過去式? 左? )

翻譯工具簡介


  • 翻譯資料庫
  • Launchpad、pootle、transifex、tryneeds等線上共筆的翻譯平台

Ezgo打包技術初窺探


  • What is ezgo
    • 能夠讓從未接觸過OSS的人,接觸OSS並使用它 → 推廣
  • 推廣
    • 目標客群:從未用過OSS的人
    • Ezgo該有哪些特色?
      • 選單
      • 操作設計上貼近Windows思維
  • 從技術面而言
    • 屬於客製化的distribution
      • 有自己的品牌,卻不是一個獨立的distribution
    • Dirty hack產生的問題
      • 沒有組織,東西太零散
      • 版本一多不易管理
      • 不符合Debian規範,無法上傳
    • 目前的做法
      • 儘可能遵循標準機制,並自動化
      • 儘可能採用外加設定檔的方式,不覆蓋現有檔案
  • Debian - ezgo
    • Debian:套件的老祖宗
    • 遵循Debian規範,將常用重複的檔案與設定等等包裝成deb檔

古典密碼學

索引 #1.加密工具
  • 密碼棒
  • 卡爾達諾漏格板
  • 旋轉機
  • 一次性密碼本
#2.加密算法
  • 凱撒密碼
  • 希爾密碼
  • 路由加密
  • 單字母替換密碼
  • 維吉尼雅密碼
#3.攻擊類型 
  • 僅知密文攻擊
  • 已知明文攻擊
  • 選擇明文攻擊

加密工具 #1.密碼棒
取布條將其纏繞於木棒上,橫向寫下明文後取下布條。解密時,必須取得相同直徑的木棒。

#2.卡爾達諾漏格板


依照漏格書寫明文以及觀看明文。

#3.旋轉機(Rotar machine)


#4.一次性密碼本

藉由亂數產生的一本加密用密碼本,可以把它想成一組金鑰,每當要產生明文時,將明文與密碼本的內容相加,如明文中的字母C (3)與密碼本的字母 X (25),3+25=28,因為28超過了26個英文字母,而對28取餘數得2,即得加密完成的密文字母B。
一次性密碼本有三個限制:
  • 確定密碼本是由隨機產生的
  • 密碼本必須只能使用一次
  • 因為要與明文相加,密碼本至少要與明文一樣長

加密算法 #1.凱撒密碼

已知明文字母P,引入一個參數K,得出密文 C = (P + K)mod 26
例如 ABCDEFGHIJK,在K=3時,得出密文DEFGHIJKLMN。(K=3是最初的凱撒密碼)
解密時 P = (C - K)mod 26。

因其架構簡單,現今已能用暴力法輕易破解,故只用於字謎類遊戲(ROT-13)。

#2.希爾密碼

使用矩陣進行加密,由密文構成的密文矩陣C = KP,其中P為明文構成的明文矩陣,K為密鑰矩陣,密鑰矩陣須為可逆才可供解密。


 
希爾加密避開了頻率分析攻擊,然而在已知明文的情況下,可透過逆運算求得金鑰,無法保證安全性。

#3.路由加密

近似於密碼棒,採用直書橫寫進行加密。

#4.單字母替換密碼

與凱撒密碼同為單字母取代的概念。將26個英文字母分別做對應,比如A對應C,B對應F,替換不受限於特定規則,也不要求有跡可循,純粹是做出26個字母的明文密文對應表,以供加密與解密時使用。儘管其複雜度遠遠高於凱撒密碼,但明文字母與密文字母仍屬一對一對應,同樣易受頻率分析(分析字母出現的頻率)攻擊破解。

#5.維吉尼雅密碼


上圖其實是由26個凱薩密碼構成的。
維吉尼雅密碼引入了金鑰的概念,假設要加密ABCDEFG,使用密鑰CIP。首先,先將密鑰長度補至和明文一樣長:

ABCDEFG
CIPCIPC

接下來,取第A行第C列得A,取第B行第I列得J...取第G行第C列得I,如此完成加密。在配合一次性密碼本的情況下,維吉尼亞密碼是足夠安全的。
攻擊類型#1.僅知密文攻擊:攻擊者在只知道密文的情況下試圖求得明文或金鑰。

#2.已知明文攻擊:攻擊者在知道部分明文與密文配對的情況下試圖破解。

#3.選擇明文攻擊:公開加密器,攻擊者可以自由輸入明文及得到該明文的密文,藉此試圖破解算法。

儘管選擇明文攻擊於設計角度上看似不合理,但在近代密碼學中,十分強調在公開演算法的情況下,還能保證安全的才是優秀的演算法,這是為了避免開發者本身預先對算法預先留下了暗門,卻因為算法黑箱而無法得知,使得維護者或開發者成為最危險的攻擊者,因此必須公開算法接受檢視。

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,所以也是開學以來第一次爆滿(?)。比起分享,這此更像是推坑用讀書會,書目為linux kernel development 3rd 。這本書不像OS恐龍書,它假定你對基本觀念有一部分的認知了,而多著墨在怎麼去用那些觀念,所以可能不適合新手入門,而且它的圖真的很少。

今天是第一次開講,所以只就幾個章節做了簡單的流覽。jserv分享蠻有趣的,對於內容,將談談作業系統的基本觀念與排程。

#1.排程基本

進入排程之前,先讓我們釐清一件事:
  • Program:沒有反應,就只是個程式碼的集合。
  • Process:執行中程式的實體。
  • Thread:Process的紀錄器,告訴你這個Process幹了什麼。
一個Program能產生多的Process,每點一次程式,就會產生一個行程,多開就是這麼回事。而每一個行程,都有一個獨立自主的小空間(記憶體區塊),除了自己以外,沒有人能把它幹掉,同樣的,當這個行程掛掉時,別的行程也不會受到影響。

執行緒既為紀錄器,也是CPU分時的最小單位。一個行程通常有很多執行緒,這其實近似多工的概念。想像一個情形,如果只有一個執行緒,行程內所有的事就得都由他一手包辦,他可能要讀入檔案,又可能又呈現畫面給使用者,但是CPU一次只能分配給一個執行緒使用,這意味著我們必須等這個執行緒讀完檔案,才會有時間來回應使用者,如果前者曠日廢時,我們通常會認為是當機了。而多執行緒則把工作分攤開,我們可以有一個執行緒專職回報,告訴使用者這個行程做了什麼,而其他執行緒繼續埋頭苦幹。
但有一點要注意,多執行緒是近似分工,只是讓工作能同時啟動,真正在做事的還是處理器,如果只有一個執行緒,一個處理器,那你把它分成4個執行緒也不會比較快。事實上,在多執行緒中處理器只是快速的切換執行緒,以達到工作差不多快的效果。

排程, 其實就是如何切換行程。Linux的排程是基於分時,也就是把CPU時間切成許多片段,每一個片段可供一個行程來使用,當程式的時間配額額滿時,就會進行行程切換的操作。而判斷執行順序是來自優先權,它可能是透過一個演算法得出的,每個行程都會有個優先權,排程器(Scheduler)會透過它得知什麼時候該執行什麼程式。

我們先考慮三種行程:
  • Interactive process :會不斷跟使用者互動,需要偵測按鍵立即回覆使用者
  • Batch process:不需要和使用者互動,常在背景執行
  • Real-time process:即時性的,像是影音軟體
Linux的排程器實做了一個啟發式演算法,依據過去行程的行為,決定行程的優先權 。

此外,Linux 採取搶佔式多任務處理,也就是說當一個行程處於可執行狀態時,核心會將他的優先權和當前執行行程的優先權進行比對,若前者較大,中斷目前的行程,讓排程器挑出應當執行的行程。此外先佔也會發生在當前行程的時間配額額滿的時候,此時,一個鑑別旗標TIF_NEED_RESCHED 會被設立,讓計時器中止及調用排程器。

Execl - 第三次會議

上次的文件似乎沒什麼問題,所以今次又來了兩份新的文件。

一份是關於送餐的紀錄表,先從志工紀錄與長輩資料中讀取出每位志工與長輩,再依照日期分門對送餐紀錄進行統計,因為收到的資料是以日記,而統計結果要以月來看,所以又增加一的份月份表單。雖然觀念感覺蠻容易的,不過因為是動態的增加資料,使得這份文件極其龐大,在雲端進行debug時往往要等個2、3分鐘才會有結果,而且這可能造成了ㄧ些格式上的問題,

今次demo總會跳出ㄧ些莫名其妙的Bug,像在設定共用人員時屢屢失效,為了解決這個情形就延宕了近20分鐘,最後居然是瀏覽器的差異造成的OAO(Firefox → Chrome)。不過最大的問題還是格式出了差錯,從GoogleSheet一下載下來值又不見啦~反射性的檢查Sumproduct在逗號跟乘號之間的比對,結果居然是正確的


太棒了,我們發現了新的錯誤。
如果是平常我會這麼想,不過今天是資安project的死線,幸好我很快的發現了Bug,不然真的要爆炸了。Bug在於公式的枚舉失敗了,真是個奇葩的Bug,開檔時跳出了XML的報錯,推測應該與他有些相關,所以嘗試把全自動改成了文字格式,居然神奇的解決了?


話雖如此,也是到了11點多才完成,光是為了找錯就花了近30分鐘,現在想想真是太不值得了。

2014年10月18日 星期六

我的紫微星哪有這麼萌!?



Speaker:楊育誠


這次的分享和之前有個很大的不同,就是製作團隊從工作室至公司,所以在企劃、創作與行銷方面有著不同的格局,也論及到較多實務上及行銷上的策略,可以說是更貼近遊戲產業的現實面吧~


#1.星耀學園是什麼樣的作品

星耀學園是以紫微斗數為題材去進行動漫化的作品,當然啦,我們不能只餵公子吃天文圖,便置入了一堆萌妹子代表各個星靈,校長也坦承這近似西洋的黃道十二宮,但是就根本來看,把紫微斗數當背景的AVG還真的是絕無僅有,這無形中也成了行銷的噱頭。

學園設定來自於烏來鄉,至於為什麼在烏來鄉?因為那裡有山有水有溫泉,簡單來說就是滿滿的特色,而且像這樣的神奇學園,如果待在大都市裡大概天天都會被查水表,也顯得競技場這類古色古香的情境格格不入。

#2.遊戲實務製作部分

設定方面往往歸類於前期企劃,而在一個大團隊中,企劃特別要講究方法。

要將企劃內容盡可能的圖像化,不必拘泥於精細度,但是一定要呈現出概念與流程,比如說要做神奇寶貝的戰鬥,企劃要告訴團隊要如何呈現,像戰鬥方式(回合or即時)、場景配置、神奇寶貝出現的位置等等。我們可以寫一個小程式來模擬企劃內容,這樣討論時不僅降低溝通上的失誤,也能更貼近實務上面臨的難點或對現有設定該加強的部分。

而說起AVG,圖量相較於程式更重,如差分圖、臉部表情、立繪,這些都是需要精雕細琢的部分,而且良好的CG對於進軍同人市場是不可或缺的,講者有特別提到,以現今台灣市場的行情,一片沒有動畫化的AVG能賣個一千片就算不錯了,成本的回收只能鎖定在同人市場,比如角色人物的周邊,日常四格漫畫以及輕小說等等。

#3.業界的發展情形

首先要面對一個現實,所謂國產遊戲,風格到底要是什麼?

講者認為,什麼風格有市場,就嘗試什麼風格。

台灣經常有一種聲音,國產遊戲該有新風格,但是到底要如何去呈現、如何去定義,退一步而言,就算呈現出了新風格,也不保證能在市場上存活。其實原創並沒有什麼風格的問題,考慮風格當然很好,但是作品要先達到及格標準才行。


進行企劃時的思考點:

1.玩票性質與長遠發展2
2.外部及內部資源的評估
  • 確保資金回收\合作對象\企劃\程式\美術
3.遊戲類型
  •     大眾或小眾,以什麼去決勝負
  •     低美術門檻/高遊戲性 v.s 高美術門檻/低遊戲性
  •     老實說,靠現今靠遊戲性出線的非常非常少
4.發行平台
  • Steam/appstore/ps平台……
5.原創or改編
6.開發規模與賣點
7.上市時間與通路
  • 避免碰撞強檔,考慮發行商
8.多波次的行銷策略
9.數據回收與後期報告
  • 數位文創投資報酬率高\風險也相當高
10.版權模式與跨平台的可能性
  • 既然決定的是數位文創,就該注重在版權授權,這在數位文創上的獲利才是最高的
11.放長線釣大魚vs炒短線型遊戲

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來做統計分析,但我知道的是,我對如何應用所學更進一步。當初填組時其實是選教學組,因為我很擔心跟不上開發的腳步,但從這幾次的成果來看,其實不是個打醬油的,幸好當時選填人數不夠,不然我應不會有這段值得回味的精歷。

2014年10月13日 星期一

雨港基隆的製作與誕生

  講者:Erotes Studio 李處守總召



喔喔喔喔喔是TRPG的講座,自從看了ゆっくり妖夢と本当はこわいクトゥルフ神話,就一直對這個領域很感興趣,想不到Erotes Studio是從桌遊中成立的,讓我想到Sitcon當初也是為了在買消夜時有團揪,不少社團形成的原因實在是很微妙呢,

Erotes的團隊跟上次一樣都是蠻輕巧的,而且因為成員四散各洲,所以作業都是雲端進行,沒有特定的工作室,這就是我嚮往的工作環境呀~ 不過這也衍生了ㄧ些後續提到的小問題,順帶一提,講師觸手(無誤)是團隊的總召。

談談遊戲的背景,就算沒聽過雨港基隆,也該看過















2014年10月8日 星期三

C4 Labs - Meeting 2

呵呵~上禮拜還覺得很親民,這次就被制裁了



#1. Linux 程式分享

淺談在終端機上打殭屍,由於我ezgo還沒有實裝,對講者的分享不大有深刻體認,諸如:
  • ranger :終端機上的檔案管理員
  • catimg :可以在終端機上觀看圖片
  • cmus   :可以在終端機上播放音樂
  • nano   : 文書編輯器
倒是對一些有趣的程式蠻有印象的,比如

  • yes:他會一直輸出y輸出y輸出y,直到天荒地老
  • cowsay:你可以印出一頭牛,並且讓他說話!
  • < I Love nix >
     ------------
            \   ^__^
             \  (oo)\_______
                (__)\       )\/\
                    ||----w |
                    ||     ||
     
  • ponysay:wow,你可以印出彩虹小馬

  • cmatrix:

說明文件告訴你:他很酷,他很吃資源。

#2.Zend Framework
  •  Zend Framework
它是一個開源網頁應用框架,其架構是MVC。今天我們來處理這句話就好了
 推一部sitcon的研討會,我覺得講解蠻清楚的,還有附送練習題
  •  框架(Framework)
Wiki這麼告訴我們:
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來引入他們。
  • 網頁應用框架
顧名思義,他是個用於協助網頁開發的框架,像是套用Java的JQuery、獨霸Ruby的Rails等等,而Zend Framework是基於PHP。而網頁應用框架包含了若干種架構(architectures),架構涉及了這個框架是怎麼構成的,分別有
  • Model–view–controller (MVC)
  • Push-based vs. pull-based
  • Three-tier organization
目前大多數的網頁框架是屬於MVC架構。
  • MVC架構
MVC架構的核心思想不外乎是鬆耦合,他將系統分隔成三個部份
  • Model : 用來進行演算法及資料庫
  • Viewer :就只負責呈現使用者所看到的介面
  • Controller :可以想作Model與Viewer之間的橋樑,是邏輯處理的大本營
    • 會把從Model獲得的資料傳給Viewer呈現
    • 會對Viewer上的操作進行判斷,看要讓Model中的哪支程式處理它
 這麼做不但在網站出錯時容易Debug,也能把一個大型project分案處理。

2014年10月5日 星期日

聊聊有病遊戲的東南西唄

講師:哈利菠菜

  

 

遊戲四元素:程式、美術、企劃、行銷

      
        關於程式,除了要日常研磨自身的技巧外,最重要的就是要有個原形,不論是不是遊戲設計,在設計途中更改規格都是相當危險的,這不僅將大幅延誤開發進度,更會磨損組員之間的信任關係。對於一個專案的開發,務必要與組員之間先溝通好規格,最好能夠事先繪製出一份圖表,如此途中可能發生的錯誤也能先作出應對。


        談談美術,這次的講題主要是獨立遊戲:我滿懷青春的有病測驗,其實我認為講師的工作團隊蠻特殊的,它是以講師為溝通核心,其他成員彼此不認識,在協調上自是費力些,尤其是美術這部分就費時半年。對於美術的好與壞,其實這是一個相當抽象的概念,所以我們必須要去強調設定的重要性,何謂設定?大至世界觀,區住環境,民俗風情,這些會影響角色的外貌如服飾、膚色、刺青等等,而小則至家庭背景與人物性格,它能表現出人物該有的動作與氣質。而談到如何加強設定的功力,廣泛閱讀與社交是個不錯的方法,它能讓你更了解何為一個角色。

        談到美術之間的溝通,就是要求清晰,我記得講者提到延宕半年的理由,就是他收到第一任美術的人設圖時,回覆的是「沒有悸動」。價值觀的模糊會影響達成共識的速度,半年後,講師改用一些具體的方法陳述,像是「領口要再下來一公分左右」,「裙子可以再往上提高一點點」,並且就文獻內容來跟美術溝通,效率就快了許多。


        企劃及行銷其實是一體兩面,現在APP的市場已經殺成一片紅海,單一下載量的成本翻倍提升,更必須著重在這個區域。我很認同講師提出的一個黃金圈概念:

  • 想讓玩家體驗到什麼感受 - Why
  • 想讓玩家用什麼樣的玩法 - How
  • 遊戲應該最後長什麼樣子 - What

我們往往從What去著手,比如要設計出一個轉珠遊戲,要設計出一個守城遊戲,這些都是一個遊戲的最終呈現。我們真正該著手的是Why,這個遊戲的核心是什麼?它能為玩家帶來什麼?比如神奇寶貝,通常小孩子都有一個夢想:擁有一隻酷炫的怪獸,神奇寶貝實現了,而且越來越著重在培育出「自己的」神奇寶貝,你可以跟他互動,可以把自己的願望投射進遊戲裡。再比如MineCraft,它的核心在於創作,玩家不必去研究複雜的3D模型,它提供給你模型,讓你隨心發揮,做出來還能發佈給大家觀賞,這也能帶給玩家莫大的成就感。一個遊戲該在乎的是玩家的感受是什麼,而不是一味的塞東西給玩家,跳脫What的思維框架,往往能成就一個更有趣的遊戲,推銷的核心也呼之欲出了,我想在現今的APP市場中,掌握這種思維是相當有利的。

        至於行銷方法我認為也是一個類似的概念,要有推銷的核心。思考兩個問題,什麼遊戲最好玩?什麼遊戲最有病?我想後者帶來的印象會深刻些,雖然這在某部分也會限縮住客群,哈利波菜特別於此有提到一個失誤:其實這個遊戲一開始是瞄準大學生跟OL的,不過主要下載者都來自於中小學生,這在收費策略上出了些問題,因為沒有引入My Card機制,雖然下載量相當高,成本還是不大能回收。其實這讓我蠻訝異的,一個App排行前10,累積下載量近30萬的作品居然不算賺錢,這可能令不少獨立遊戲者望之卻步。

        感謝NCKU遊戲工作坊,感謝哈利菠菜,讓我回想起選擇資工的理由。尤其是看到桃轅傳 


有劇情,有配音,有音效,有美術,又有遊戲模式,我從沒想過在大學時期能做到這個地步,這場演講真是太精采了!

2014年10月2日 星期四

Excel維護 - 第一次會議

第一次開會,閒聊時間比我想像來的長~~很~~多~~~,主要都在自我介紹跟分享開發經驗,不過大家都沒說幾句話,當下感覺氣氛超沉悶的崩╰(〒皿〒)╯潰,期待日後能慢慢的有話聊,至少在半年間合作愉快XD

資訊顧問,這個名號感覺纏繞著霸氣,可惜我不是吃了Excel果實的EXEX人,為了不辜負這個名號,只好照三餐問候那張圖表,看著看著就日久生情有了點心得,也寫了一些函式嘗試去改進它

不過我沒聽說過要在會議上發表啊啊啊啊啊!!!!!!!!!
    
 看到會議通知的當下

我的Excel真的只有學了一個禮拜,加上當天重感冒又跑C4 Labs,還來不及進旅店就被拖進了會議室,我在麥克風前就只是隻HP=1的風中蟾蜍。真心認為,這次的發表不甚理想,雖然我本來就是個不擅言詞的人(?),但是回想不出自己說過什麼還是頭一遭,那時可能真的就靠直覺去做判斷吧,下次應該先擬好一份簡報,至少在狀況差時還能做些應對,幸好沒被Shut down

我個人其實對除錯蠻感興趣的,不過是在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的大小。

也由於分配出的記憶體是連續的,我們能瞭解每一個元素的記憶體位置。對於第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)進行處理。

C4 Labs - Meeting 1



頭次聽說系上有社群應該是半年前,那時頂多看看議程跟主題,一來是因為怕進去就像個打醬油的,二來是因為真的沒什麼動力能讓我騎15分鐘的夜車。不過歷經一年悠悠哉哉的洗禮後,我終於把E罐填滿了,抱著要挑戰Boss的心情踏入了會議室......


  這次的會議花了大約40分鐘在推SITCON的坑,剩下的則是利用python來做網路爬蟲。

簡單來說,就是以學生為核心的研討會,大家各自分享所長及專業,達到教學相長的目的。 SITCON的演講題目其實蠻多元的,可惜的是2014已經結束了~~~不過沒關係,SITCON的研討會都有上傳到Youtube,隨時都能夠回味那些有趣的演講,補全2014開幕時的一個梗XD


其實SITCON有的不只是年會而已,還有Hackgen跟不少Workshop,不過Hackgen就是要直接衝code上戰場了,年會比起來就平易近人一點,而且題目也能自由挑選。就像前文說的,如果認為自己有些想分享的,也能去交稿挑戰自己,或者當場報個Lightning talk

  •  #2. 網路爬蟲
網路爬蟲是個能自動抓取網頁上訊息的程式,可以用它來搜集大量的網路資料或偵測網頁內容的變動。
而這次引入的語言是python,聽到這個語言感覺就要被制裁了,幸好有獲得學習管道,不過Mac上也沒裝只好看著指令快速閃過,印象最深刻的也就DDOS選課系統了,這樣真的沒問題嗎?  
整體概念以requests為核心,然後利用beautifulsoup(美麗的湯?)來對獲得的網站進行編碼,最後用while迴圈持續的跑,當目標網站的文字(一個元件的.text值)改變時,會跳出警告,警告內容視需求而定,demo是彈出成功入口的網頁。
爬蟲不單需要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),不過目前先介紹他們的老大。


1.Big-Oh定義:

f(n) = O(g(n)):存在常數,對於所有大於的輸入,使得f(n)不大於*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,儘管這個答案是正確的。

說了這麼多,那要怎麼去預期?

最直觀地去想,找影響趨勢最大的就對啦,我們考慮的是極限,所以攻略目標是一個函式裡,極限值最大的那個,從成長趨勢的大原則說起,

多重指數函數 >  階乘 > 指數函數 > 多項式函數 > 對數函數 > 常函數