2014年12月9日 星期二

數位簽章

Digital Signature



什麼是數位簽章:
  • 數學演算法或其他運算方式,對要簽署的文件進行加密,所產生的結果
數位簽章的需求:
  • 驗證
    • 簽章者身份 (不可偽冒)
    • 簽章日期、時間
    • 訊息完整性 (不可偽造)
  • 透過此簽章,能讓第三方來解決紛爭 (不可否認性)
 數位簽章流程:
  • 產生簽章
    • 有一份文件M 
    • 計算文件的摘要 H(M),明文中1bit的不同,會在摘要產生大量不同  
    • 加密摘要:Ek(h)
    • 獲得簽章 S = Ek(h)
  • 同時傳送M與S給對方,完成簽章的傳送
  • 接收方也有一把驗證金鑰,可以對文件與簽章進行比對,確認這個簽確實是對應這份文件
  • 注意:簽章屬於非對稱式金鑰
    • 為什麼要是非對稱?
      • 若為對稱式金鑰,接收方可用同樣方式產生出簽章來仿冒傳送人
    • 加密用的是私鑰,解密用的是公鑰
    • 也就是說,簽章的結果是所有人都可以比對的
      • 有利於第三方驗證

2014年12月8日 星期一

組合邏輯電路

1.組合電路 v.s 循序電路
  • 組合電路:
    • 由邏輯閘構成,輸出為當前運算的結果
  • 循序電路:
    • 使用了儲存原件與邏輯閘
    • 輸出關係到輸入與先前儲存的結果
2.組合電路設計順序
  • 確定問題
  • 確定輸入與輸出
  • 指派輸入與輸出變數
  • 推導真值表
  • 簡化布林函式
  • 繪製邏輯電路圖並驗證結果
3.加法器
  • 半加器:2輸入2輸出,兩個當前要相加的bit,輸出該位元相加值與進位值
  • 全加器:3輸入2輸出,兩個當前要相加的bit,一個為前個bit的進位 ,輸出該位元相加值與進位值 
  • 透過串連的全加器,可夠成N-bit的加法器(漣波進位加法器)
    • 跟直觀的人為加法一樣,由後往前加,所以必須知道前一個bit是否有進位才可繼續運算 →造成傳遞延遲
  • 為了避免漣波進位的延遲 → 超前進位加法器
    • 因電路複雜使成本增加,但是簡短了運算時間
    • 打破資料相依性,使相加結果只與C0(初始值)有關
      • 使用疊代,將目前進位以前一次相加的結果取代,始終用最低位元表示
      • 因此,越高層(高bit)的電路,複雜度會愈趨增加
  • 使用加法器實做減法器
    • 可以透過一個位元操作
    • 減法其實等於與2補數相加,而2補數為1補數再加1
    • 那麼
      • 有AB兩數
      • 透過一個位元M,傳給C0,先將與B的各個Bit與M做Xor再送入全加器
      • 當M = 0時,B xor M = B,C0 = 0,為加法
      • 當M = 1時,B xor M = B',C0 = 1,所得為B的1補數+1=B的2補數,為減法
4. 溢位
  • 定義:一個n-bits間的運算卻造成了n+1-bits的結果 → 進位到了表示正負號的bit
  • 電腦必須偵測溢位並設置正反器以供之後調用
  • 如何避免溢位?
    • 假設有7bits相加
    • 使用9bits去儲存,多的2個bit
      • 第9 bit當作正負號
      • 第8 bit當做額外進位(7→8)
5.比較器
  • 兩輸入:A、B,三輸出:A>B、A<B、A=B 
  • 假設A、B的為4bits:A3A2A1A0、B3B2B1B0
  • 令Xi = AiBi + Ai'Bi' (Ai XNOR Bi)、即Ai、Bi相同時為1
  • 當A = B →  A3 = B3(X3 = 1) ...... A0 = B0(X0 = 1) → A=B可以表示為 X3*X2*X1*X0
  • 判斷A > B:A3B3'+x3A2B2'+x3x2A1B1'+x3x2x1 A0B0'
    • 先看A3B3'
      • 如果A3是1、B3是1:該項為0 → 往下一bit繼續比
      • 如果A3是1、B3是0:該項為1 → 不用比了,A > B
      • 如果A3是0、B3是1:該項為0,而且x3為0 → 接下來的每項都 = 0 → A < B
      • 如果A3是0、B3是0:該項為0、不過x3為1 → 可以往下一bit繼續比
    •  可以發現x3、x2...可以用做比較是否進行的標準
  • 判斷A < B:A3'B3+x3A2'B2+x3x2A1'B1+x3x2x1 A0'B0
6.n to m 解碼器
  • 有 n 個 bits→ 能表示 2^n種情形
    • 解碼器目的:輸入有n bits,產生2^n種輸出 
    • 即是表現出所有的 minterm 型式
    • 既然能表示出所有的 minterm,即能利用解碼器實做出任何電路
      • 但是效率並非最佳化
7.編碼器
  • 解碼器的逆操作: 2^n → n
  • 無法用卡諾圖化簡,直接用結果畫電路
  • 優先權編碼器
    • 允許多個輸入為1,因為只看最高位元,其他為Don't care (X)
8.多工器 (選擇器)
  • 目的:從多個輸入中,選擇出其中一個輸入
    • 比如說有輸入A、B,選擇用位元S
      • 使 A AND S、B AND S',再將他們做 OR
      • 在 S = 0時,輸出的是 B
      • 在 S = 1時,輸出的是 A
9.三態閘
  • 輸出:0、1、高阻抗(斷開電路,不會產生邏輯訊號)

2014年12月5日 星期五

OpenSource翻譯組會議紀錄

Opensource.com翻譯組開發會議 @2014/12/5

思考核心:

    1.傳承與延續的方法
    2.組員內部分工
    3.如何使成員對工作建立認同感
    4.如何吸引新成員參與專案

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月20日 星期四

OpenStreetMap

講者:李昕迪 mcdlee


  • 想像自己是一個地圖廠商老闆
    • 收集一個城市或國家的資料,應當耗費多少資源?
    • 自己又要花費多少的比例,在收集這些資料
      • 多久更新一份資料?
      • 多久能處理一份Bug?
  • OpenStreeMap (中譯為開放街圖)
2004年由Steve Coast成立,具備Open Source與Wikipedia的精神,屬於開放授權(ODbl)且開放格式(對外交換為xml),只要有標註來源,就可以自由的複製、散布、傳輸與修改。

OpenStreetMap包含了森羅萬象的地理資料庫,如路網、地名、設施、速限、甚至連路燈、涼亭、店家開門時間等等都有標註,也可挑選其中幾個屬性作為其他地圖的底圖使用,比如素食地圖、WheelmapFOURSQUAREOpenHistoricalMap(歷史地圖數位化)等等。
  • Mapper(圖客)
開放街圖的貢獻者,帶著GPS的tracker,或透過Field Papers印製地圖,實地走訪在圖上描點,紀錄完資訊後上傳至開放街圖。
  • WikiStyle
    • 可能發生悲劇(惡意修改),但紀錄有跡可循
    • 半成品是可接受的,因為每個人都可以編輯


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

你不可不知的JavaScript

原文:You don't know JavaScript but you should



這是我參與Kyle Simpson會談時記錄的部分抄本,他是名來自奧斯丁的開放網路提倡者,同時也身兼作家、講師、工作指導、開源軟體的贊助者等多種身份,最重要的是,他熱衷於與Javascript相關的一切。

感謝各位這次的邀請,我是凱爾·辛普森,暱稱getify,目前活躍於TwitterGithub、及這些地方。就在上週末,我受邀於Thought@Work在羅切斯特主持了場研討會,並在討論New Media Interactive Development這個專案時,發現自己陷於JavaScript和Node的類別囹圄中,所以再次感謝各位邀請我來,讓我有重新審視JS的機會。

我曾寫過幾本關於JavaScript的系列書You Don't Know JS,全冊都開放在GitHub 供免費閱讀。它們也有經歐萊禮正式出版,但目前市面上只有兩冊,第三冊正在進行最後的修訂,第四冊已近乎完成,而第五冊將在不久後著手編修。

  1. Scope & Closures:主要在探討閉包,它是Javascript中最重要的基本議題,每個JS的程式都涉及閉包,但是大部分的開發者都不曉得它們正在使用它,或不了解什麼機制呼叫了閉包及其運作原理。
  2.  this & Object Prototypes:將探討 this 這個奧妙的關鍵字,並且解決JS中的一個錯誤的迷思一一JS有類別。事實上,JS有的只是原型的指派,我們應當正視它,而非去嘗試不切實際的類別導向。
  3. Types & Grammar:我們將專注在變數的強制轉型,儘管多數開發者把它當成糟糕的機制,但我鼓勵各位深入鑽研它。因為強制轉型並不如你所聽到的那麼詭異,而且如果你運用得當,它能大幅改善你的編碼。
  4. Async & Performance (編寫中) :我們首先會解釋為何回呼函式不適用於非同步程式,並深入於改善非同步模式下的promise與generators,當然也囊括了優化與評估JavaScript效能的部分。
  5. ES6 & Beyond (預定編寫): 涵蓋了JS在ES6的所有改變,以及ES6後即將迎來的各種革新
如果想洞悉這系列的精神,不妨和道格拉斯·克羅克福特JavaScript: The Good Parts做個比較。這本書對我們社群有好有壞,他就像名領航人,近乎獨力地把開發者帶至(或拉回)JS,並使JS獲得了高度的重視,在這方面,我們欠他一份大恩。但是他也灌輸了開發者一些錯誤的思想,那就是「在JS中,你真正當學的只有極小的一部分」,這使得大多數的開發者,甚至是有5~10年經歷的程式設計師,所理解的仍只有JavaScript的冰山一角。

而談到我寫的這系列,若與JavaScript: The Good Parts做對比,它們所論及的是「非優良部分」,要注意,這不代表他們是壞的部分,而是涵蓋了JavaScirpt完整的面向。我認為開發者不該試圖迴避困難,我鼓勵各位挑戰它並瓦解它,當各位碰上了JS中令你困惑費解的語法,比起埋怨語言本身,更當去思索自己究竟遺漏了什麼,並進一步徹底鑽研。

我想這種思維對JS開發者顯得有些微妙,因為在他們的認知中,JS應該是一個既簡單又直覺,甚至是能夠一望而知的程式語言,如果JS達不到這些要求,那一定是語言本身出了什麼問題。其實,期望任何一種語言(如C++、Java)在規則上不言而喻,本身就是不合理的要求。所以當你碰著了不懂的程式碼,別去苛責語言設計者或寫這段程式碼的人,而是要趕緊補足自己缺失的部分。許多時候,開發者討厭JS的一些功能,只由於不理解,而在我向他們解釋運作原理後,他們漸漸從厭惡轉為接受,補充一下,接受可不一定等於喜歡,只意味他們肯正視這些功能而已。

在我看來,欲確實駕馭JS,精神與時間的投資必不可少,除了瞭解怎麼去寫,更該瞭解JS做了什麼?乃至JS為什麼要這麼做?我之所以鼓勵各位在學時就該精熟JS,是因我身為一名JS的教員,曾和一群用錯誤方式學習JS的工程師共事過,為了重新起步,他們無不投入了莫大心力,如果各位在學期間就真正理解了JS,進入產業後,除了不重蹈覆轍,更能明白JS的規範在當今網路平台何其重要。

在未來,JS將是鞏固網路平台的堅實地基,為此,我們更當熟悉它,並且掌握它。

最後,我想傳達給各位一件事‧我堅信,各位在課程上必定能學到不少好東西,但是更重要的是,要趁現在掌握學習的方法,以及享受學習的過程。在你這輩子裡,不可能只需精通一件事。科技日新月異,業界主流一代換過一代。如果沒別人出頭的話,我想現在是蘋果當道。無論你的興趣何在,唯有永不止歇的學習,才是成功的不二法門。

Q&A

Q:這五本書有特定的閱讀順序嗎?
A:Scope and Closures應該算是必修,按照出版順序閱讀是OK的。前三冊鎖定在JS的核心,雖然四五冊是建立在前三冊之上,但它們主要是探討ES6上的改變。

Q:免費的開源軟體對你的工作有多重要?
A:我工作上的一切都來自開源軟體,我堅信它的影響力,在不久的將來,開源軟體將使我的事業更上層樓。如果你對科技的發展史有些研究,會發現雖然技術總起於私有,但幾經調適後,最終都會走向開放,而且我認為,起於開放將漸漸成為一種趨勢。或許不少人會說:「我不想把我的程式碼公開,我怕別人會取笑我蹩腳的技術。」不過我先前嘗試時,別人是這麼說的:「你該更有自信些,因為你的程式寫的真好。」但你若看看那份程式碼,會發現裡頭充斥著不少糟糕的設計。You Don't Know JS的You其實是個集合名詞,就連我也不敢說我了解他。

我寫的每份專案都是起源於空白文件,我會把他們公開在GitHub,並盡全力持續更新它。這麼做並非要行銷理念或設計,我假定我寫的每行程式碼都是最糟糕的,而唯一能改進的方法就是借助他人。開源軟體超越了任何獨力開發,因為它是集眾人之力協做而成。

各位應當投身於開源文化中,我堅信開放是一切技術的起源,也是我們事業能延續10年的首要原因。

Q:像我這種怕把自己程式碼公開的人,應該從哪裏參與起?
A:這有很多答案,就我而言,加入別人的專案是個不錯的選擇。許多自由及開放原始軟體(FOSS)上的貢獻不是來自編程,而是來專案文件的編修與更新,如果你能夠在文件上添加一些註釋、細節或測試結果,乃至回傳一份錯誤訊息給開發團隊,這都是對社群的巨大貢獻。而要揪出這些小bug,已經有不少廣為人知的方法,並不需要透過編程去處理他們。其實,不少FOSS界的巨星都是從寫文件起頭的,一個專案要成功,實際上就只是比別人多做一點點,編程是很重要,但留下文件能傳承這份專案,而且你透過親身參與,也能更了解一份專案到底是怎麼運作的,所以我建議新手由此入門。

Q:那有什麼參與的管道嗎?
A:通常是選擇Github,當然,其他社群也不錯。然後,我不會叫你去選某個專案,因為你該選的是你「自己感興趣」的專案,比如你想做資料可視化,那就試試D3。找出你的熱情所在,這不但助於快速建立自信,同時也是優化程式的良性循環。

Q:你曾說JS將是我們這輩子唯一會用的網路語言,先聲明一下,我並不是Dart或類似語言的支持者,但你怎麼不覺得他們會成功?
A:真是個有內涵的好問題, 不過Dart無法取代JS,並不是Dart設計的不好,而是在Google的態度。先看看Google在網站上怎麼說,他們把Dart定位成JS的死對頭,期望有朝一日能取代JS,而非僅只實驗性的影響JS發展。不過從Dart外洩的紀錄得知了一件事:「Dart無法修正JS的根本性瑕疵。」,無論是在Chrome中與JS分庭抗禮的虛擬機Dartium,或是在語言轉議器Dart2JS裡,Dart都做不到。這訊息相當耐人尋味,Google似乎不是想做的比JS更好,而是認為在開發者生來就選Dart的前提下,JS將逐步衰退。但我能肯定一件事,Mozilla絕對不會在Firefox中實做Dart。如果Dart真要取代JS,那得等到Firefox消失,不過我想像不出這種情形。

宏觀來看,有數以百計的語言能編譯為JS,如果你想在網頁上執行你的程式碼,可以把它轉譯為JS。 雖然我個人不怎麼喜歡那些語言,但它們確實很重要!源碼不是給電腦看的,而是給開發者看的,處理與演算的手段如恆河沙數,開發者要在這些手段中,找出一個最符合自己思考模式的。為此,我們還需JS的轉譯上做更多試驗,就像CoffeeScript,他使ES6如虎添翼。我想未來CoffeeScript能做的已經很有限了,但不要緊,它已是JS革新的重要推手。至於Typescript,雖然我不怎麼喜歡類別,但Eich在報告中提到,它未來將改為近似JS的宣告方式。

先學好JS,儘管你仍將接觸其他語言,並發現在某些情形它們做的比JS好,或對你的團隊更有利。很多人就因為這樣而不學JS,但我認為不該這麼做,學會JS不僅對自己有利,也能將你喜歡的語言轉譯為JS。這促成了網路平台的美好未來。


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月10日 星期一

在地社群使Firefox行動版登陸印度

Firefox for mobile,開發代號Fennec,是Firefox建構於行動裝置(平板電腦,智慧型手機)上的網頁瀏覽器。Fennec內建了多種語系,而就在數月前,Fennec新增了 Assamese, Bengali (India), Gujarati, Kannada, Maithili, Malayalam, Marathi, Oriya, Punjabi, Tamil, and Telugu 十二種印地文。

在最新釋出的版本中,這12種印地語占了新植入語言的大多數,為此,印度社群舉辦了一個小型的聚會,慶祝與宣傳這引盼已久的成就。約莫30名志工與自由軟體的愛好者參與了Moilzia在浦那的活動。Mahesh Kulkarni,是語言技術的權威,同時也身為C-DAC GIST group的首長與 W3C India駐印經理,由他負責切下Fennec蛋糕的第一刀,為這起盛事揭開序幕。

Mahesh Kulkarni在會席上分享了他的經驗,他認為社群中端與端間的在地化經驗是必要的,而不僅只於裝飾性質。於在地化的領域,只有第一等的工作仍持續至今,而現在這是著手於第二等工作的時刻。與會的社群有些來自Mozilla Hindi Team,涉及Mozilla的在地化工程,有些則是Pune Linux User Group (PLUG)的成員,還有不少活躍於Mozilla各領域的社群,他們一同研討了當前翻譯上的討戰,以及籌畫實質策略以改善現狀。

這些來自世界各地的志願團體,都是被一份初衷所吸引:可以為講者提供配有當地語言的軟體,並幫助他們用自己的語言瞭解網路與瀏覽器。這份在地化的熱情及同行評審制往往產了比付費業者還優質的翻譯軟體。這些在地化的細節都紀錄在 the Mozilla Wiki上。

有許多用戶只理解當地語言,所以不論是網站的內容或是界面都須在地化,以讓更多用戶受益,Mozilla將持續促進網頁上的語言革新,以迎合這些使用者們

Mozilla的在地化工程首重民主的原則 ── 民有、民治、民享,搭配上熱情與優良的作業流程。舉例來說,Mozilla的德國化起於一個簡單而微小的點 ── 一個大學生打算完成Firefox的德國版本做為給他父親的禮物,由於Firefo的原碼開放,他有能力完成這份願望。同樣的,在十幾年前我加入Red Hat印度語團隊,並開始投身在各個開源專案,現在我以相當熟悉Mozilla的在地化工作,並參與了Mozilla印度語翻譯團隊。

時至今日,大多Mozilla的產品都完成了翻譯,在地化工程於Pootle platform上平穩的進行著。Fennec的印度版也藉由協做完成了翻譯及測試,儘管如此,我們仍歡迎更多的志工朋友們加入。


2014年11月9日 星期日

Network Security issues

  • Network Security Basis
    • Confidentiality
      • 維持資料的完整性
    • Integrity
      • 確認資料是否有被修改
    • Authentication
      • 建立使用者身份的認證
    • Non - repudiation
      • 防止使用者否認其曾做過的行為
    • Access Control
      • 管制使用資料的使用權限
    • Availability
      • 隨時保持資料的可用性
  • Protocol
    • 網路傳輸的協定:HTTP/FTP......
    • 資訊安全的協定:SSL,IPSec,Kerberos......
  • Ideal Security Protocol
    • 滿足安全需求
    • 效率高
      • 運算量少、延遲短
    • 健壯性
    • 容易使用與實作且應用彈性高
  • Secure Entry to NSA
    • Insert badge into reader
    • Enter Pin
    • Correct Pin?
      • Yes : Enter
      • No : get shot by security guard

Authentication Protocol

  • mutual authentication
    • 假設現在有兩個使用者Alice和Bob (可以為人或電腦)
      • Alice必須要向Bob證明她的身份是Alice
      • 同樣的,Bob需要向Alice證明他的身份是Bob
      • 因為雙方都要驗證自己的身份,而稱為mutual authentication
    • 過程可能需要建立對稱金鑰,作為辨別的基準
    • 雙向認證的必要性
      • 以往都只有系統認證人
      • 但人遇上假的系統 → 資料外流
  •  Challenge-Response mode
    • 為了避免重放攻擊,使用challenge-Responce
    • 當認證時,使用只有Alice本人才能進行的認證
    • e.g.
      • Bob為了確認Alice的身份,Bob送出一個Nonce給Alice,Nonce就是個Challenge
      • Alice對 Alice's password跟Nonce進行一次雜湊
        • 因為只有Alice跟Bob知道Alice's password,所以可避免重放攻擊
      • 若Bob進行雜湊的結果與Alice一樣,就能確認Alice的身份
  • Authentication : Symmetric Key
    • Alice和Bob共享一把對稱金鑰
    • 只有Alice和Bob知道這把金鑰
      • 為了認證Alice的身份,Bob會傳送一個Nonce,給Alice
      • Alice對Nonce進行加密 E= (Nonce,key),傳送E給Bob
      • 上述只完成了Bob對Alice的認證
    • 那麼如何完成雙向認證呢?
      • Alice先送Ra給Bob
      • Bob送回Rb跟E(Ra,key)給Alice
        • Alice可透過解密知道是否為Ra
      • Alice送出E(Rb,k)給Bob
        • Bob可透過解密知道是否為Rb
    • 然而,這會產生一個問題
      • 分成兩次的嘗試
      • 第一次,攻擊者可以透過送出Ra得到Rb跟E(Ra,k)
      • 第二次,攻擊者送出Rb,得到E(Rb,k)
      • 那麼就可以在第一次嘗試中送回E(Rb,k) 
  •  

2014年11月6日 星期四

Ezgo

Ezgo

Speaker : Eric


Ezgo開源教材分享
  • Stellarium
    • 可以描繪星體的軌跡
  • MuseScore
    • 可繪製五線譜,快速調整譜面
    • 可隨音符演奏音樂
    • 配有音樂社群,分享音樂創作
  • Hydrogen
    • 節奏編曲軟體
    • 配有各種音源,操作容易
  • Fritzing
    • 備有虛擬麵包板與圖像化電路,可以用於電路設計上的教學

2014年11月4日 星期二

C4 Labs Course 4

#1. Makefile


  • makefile REF
    • Makefile學習筆記
  • 平常的編譯方式
    • gcc file.c -o file
    • make file.o -> make file
  • makefile :很多個檔案要做編譯,彼此之間有相依性,所以寫一個腳本來完成所有的編譯動作
PROJECT = test
OBJS = a.o b.o c.o //物件檔當成三個字串

all: $(PROJECT)
$(PROJECT): $(OBJS)
...編譯指令...
  • 檢查include的標頭檔是否有被改過
    • 知道誰被改過,又有誰用到它
  • 建立一個描述相依性的檔案,然後將其include到makefile中
    • command line指令:-MF
      •  產生出一個.d檔,說明完成這個.o檔需要哪些.h檔
  • 引入一個目錄內所有檔案:wildcard
    • wildcard會展開目錄內的檔案

#2.Arch Linux


2014年11月1日 星期六

MOPCON 2014 會後會

 

MOPCON 2014 議程紀錄


這次是MOPCON會後會,主要在分享ㄧ些參加心得和揭露祕辛,所以不會跟議程直接相關唷。

第一次摸去IRSlab,空間比想像中的要大些,席間有提供飲料跟小點心,是個蠻愜意社群環境。分享人是MOPCON贊助組的成員,提及了一些MOPCON內部的分工,研討會的初衷與贊助者的立場等等。

對於贊助商而言,贊助的目的無非是推銷自身的產品,不過今年有些小悲劇,因為會眾有約40%是學生,所以有些產品不怎麼迎合需求,為了拯救贊助商,只好把MOPCON的店面移到贊助商旁邊,希望幫忙挽回一點人氣~算是會議的小插曲吧。

不光是產品推銷,這次的MOPCON也成為獵人頭的手段。分享人提到,這類大型開發者聚會往往是找人才的管道,因為會來參加聚會的,通常也都是對這領域略有了解的人,不妨藉此管道找尋真正適合的人才,比起104的模糊篩選好太多了。

但是這也引發了一個問題,一個堅持在濁水溪以南舉辦的研討會,來的贊助商卻多是北部的,講者也是北下而來,而會眾族群又多是學生,這會不會把南部的資訊人才又往北拉?反而是違背了研討會的初衷。這個問題討論了整整一個小時,直到蘇教授出來Demo自製咖啡機,工作人員是認為,能把北部的資源拿來南部用,這對研討會而言是件好事,而人才流失的問題,這並不是一時半刻就能解決的,MOPCON 至今也才辦了三屆,還不算個成熟的研討會,就先放眼當下,想辦法促進南部的素質吧。

2014年10月31日 星期五

鳥哥的私房菜&國際社群參與

#1.鳥哥、鳥站與自由軟體的學習
講者:鳥哥


  • 自我介紹(?)
    • 菜鳥長大了,總該變成哥
  • 為何接觸Linux
    • 一開始是被環境所逼
      • 不過換個想法,多學學也是件好事
    • 以前的信箱都有流量限制,所以想架設mail Server給自己使用
  • 為什麼會有鳥站
    • 因為想輕鬆一點
      • 為了要讓更多學弟妹學會linux,老師就不會老是找我了
    • 所以鳥站的來源其實是
      • 預防忘記以前做過的蠢事,以防再遇上時又要花時間
    • 鳥站怎麼來的
      • 從study area跟bbs.sayya.org(已關站)學習網路、電腦及Linux的基礎
        • 內容難度較高
      • 鳥哥創造Linux.vbird.org
        • 較適合新手入門
  • 關於鳥站?
    • 一開始會引起注意的主因是鳥哥夠雞婆
      • 解決討論區上看到的各種特殊問題
    • 鳥哥有句名言:我沒有錢
      • 因為沒有錢,設備買不起,只好用點特殊方法取代
      • 所以,就得要學習一些比較特殊的技巧
        • 這其實也是件好事
  • 鳥書?
    • 鳥站的文章一定比書籍還要新
  • 近年鳥哥在玩的東西
    • 教學專用虛擬化平台
      • 起因:沒linux要教linux
      • 遇上的問題:
      • VM效能優化
        • 透過Red hat Spice
      • VM Cpu優化
        • 原先使用的是最陽春的CPU
        • 改成透過libvirt的CPU去修改
      • 對顯卡負擔較重的軟體無法使用
    • 既然有實體PC/電腦教室了,為何還需要雲端?
      • 比較省錢

#2.參與國際社群經驗談
講者:Max

Slide

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月29日 星期三

Linked list - 鍊表



1.Why Linked list ?
因為Array在使用上存在兩個問題
  1. 在宣告時,就得指定大小,如果分配太多會造成空間的浪費,若分配太少又會出現錯誤,
  2. 若要刪除或插入某個元素至陣列中,通常須對其他元素進行平移
而Linked list能透過pointer動態的分配紀憶體空間,補足了Array這兩個缺點。

2. Linked list的核心人物:pointer
  • Pointer存放的是記憶體位置
  • & : the address operator (對一個變數取得它的位置
  • *  : the de-referencing operator (這個變數的位置去取得它的值
  • e.g. :int * p = &x;
    • int * p  :宣告一個儲存int位置的pointer
    • p = &x :讓p儲存x的地址
    • 而*p形同*&x,對x的位置取值,自然能取得x的值囉
  • 誤用Pointer
    • Dangling pointer
      • pointer記錄到失效的記憶體位置(比如已經被刪除的變數),進而取到錯誤的值
    • Memory leakage
      • 忘了去deallocate不必要用的空間
3.Linked list
  • Singly linked list
    • 結構 :
      • 一個pointer的欄位,指向下一個節點(node)
      • 一個data的欄位,儲存這個節點的資料
      • 通常我們會用一個指標Head來指向第一個節點
      • 通常最後一個節點會指向NULL
    • 對linked的操作
      • 1.定義一個節點的結構(struct)
      • 2.當要新增一個節點時
        • 先分配記憶體給這個新節點
        • 把list中最尾端節點的指標指向新節點
      • 3.當要移除一個節點時 -> free

2014年10月23日 星期四

g0v & Git Cafe

Topic #1 g0v零時政府 & open data

講者:江明宗

一、簡介g0v與open data

  • g0v -> 為了補足gov的不足而成立

    • g0v 社群 motto :「不要問為什麼沒有人這個?先承認你就是『沒有人』,因為『沒有人』是萬能的!」

  • open data 的五個等級

    • 1.open licence : 開放文件的存取
    • 2.RE : 提供的文件可再使用/修改
    • 3.CSV : 純文字開放格式
    • 4.Url : 有固定的網址存放資料
    • 5.Ld : 除了自己的資料,還能跟別人的資料連結在一起

二、g0v專案

  • Case 1:開放政治獻金
    • 起因:監察院的資料必須到場查閱
    • 2013開始
      • 進監察院取得紙本資料,再將其掃描成電子檔
      • 因為圖片幫助不大,考慮用openCV按照掃描完成的表格切割
      • 工程師設計出一個網站,用來比照文字與圖片
    • 2014/04/19 專案正式公開
      • 24小時內,完成7個專戶,共309,666個文字比對
    • 截至目前,取得了28個專戶資料,但仍只是冰山一角(監察院有約6000個專戶)
    • 未來展望:將公司之間的投資關係畫做關聯圖,以釐清政治人物與企業之間的關係
  • Case 2:
    • 政府的選舉公報在2天前才會發出
      • ->要在 2 天內看完十餘名的候選人的資料
    • 減少盲目投票,讓民主社會的台灣更進步
      • 所以我們成立了一個網站,匯入村里等行政區以及選舉資料庫的資料,羅列出所有候選人的政見,並透過tag分隔出政黨、選區等等
    • 在Hackpad上線上編輯
      • 發佈想要整理的格式,轉發至ptt、FB
    • 運用newsdiff資料取得候選人相關新聞,並且將其比對
    • 2014/7月時,GitHub開始有人傳送PR
    • 2014/9月,匯入中選會登記概況

Topic #2 Git Cafe

講者:林旅強 Legist Qiang

一、Git Cafe與Git
  • 代碼託管 + Open Source 協作平台
  • 版本控制:
    • 對修改留下log,可以輕易知道改了什麼以及回復先前的文本
    • Git就是一個多人版本控制系統
      • 分散式,每個人的本機端都有一種套的版本
二、Open Source
to understand the concept you should think of free as in free speech not as in free beer -Richard Stallman
  • Free software foundation
  • GNU project (GNU's not Unix)
  • 自由軟體定義
    • 有使用程式的自由
    • 有修改程式的自由
    • 有再散播程式的自由 
  • Free Software -> Open Source
    • 因為free自由總是被誤解成免費
    • The Cathedral and the Bazaar
      • Open Source之所以好,因為它的選擇性很高,就像一個市集。
      • 蓋教堂是種開發模式,而市集又是一種開發模式
  • Creative Commons
  • Community & Crowdsourcing
    • e.g. PTT 成為納莉颱風第一手訊息流通處 
三、Open Source與個人發展\
  • 把自己的code放上平台,會有自己與助教之外的人給予建議
  • 參與開源專案,發掘自己真正的興趣
  • 遇到問題,通常會去問有經驗的人,社群在業界與學界都有相當好的資源
四、如何參與社群
  • 國際社群
    • e.g. Linux Kernel,Debian,Ubuntu,Gnome...

2014年10月19日 星期日

區塊加密的工作模式

1.當message size大於或小於加密的block size時,我們通常會將其切割:
  • 比如在AES的情形下,容許一次加密的明文為128bits,那我們必須先把加密文件切割成若干個128 bits 才能進行加密處理。
2.為什麼我們需要引入各種加密型式
  • 將加密算法配合至各種需要(如上述第一個情形),同時也能增加密文的強度
3.ㄧ些常見的塊密碼工作模式
  • ECB : Electric Codebook
    • Let Plain text to P1,P2,P3,...Pn
    • Let Cipher text  to C1,C2,C3,...Cn
    • 把明文分成若干的block,各自加密,或將密文分成若干的block,各自解密
    • 弱點:重複的block + 重複的Key → 重複的密文,面對頻率分析相當危險
      • 比如加密星期二寄出的Email,Tuesday重複被加密成同樣的密文
      • 重複觀察就知道,這都是禮拜二寄出的,可以借此解出金鑰
  • CBC:Cipher Block Chaining
    • 一樣把明文分成若干塊
    • 把目前明文跟前份密文做Xor,之後再將完成Xor的明文送入加密演算法
    • 第一份明文需要一個初始向量(Initial Vector)做Xor
    • 限制:
        • Bit Flipping Attack
          • 因為傳送中有一點缺失,密文將大量改變 -> DoS
        • 需要一個IV,要讓sender and receiver 知道且不可重複

上述模式在明文被分割成若干區塊前不可執行,需要補綴處理至區塊大小
接下來的模型將明文當作位元流,可以對即時的資料進行加密

  • CFB:

    • 將明文視為位元流
      • 首先將明文切割為兩部分b-s與s
      • 將明文加密,捨棄b-s的明文,將s部分的密文與前一部份的s明文Xor得密文C
      • 把新明文左移s位,插入C至新明文
    • 限制:
      • 會有延遲,無法併行處理資料
      • 跟CBC mode一樣,錯誤容易擴散
      • 那麼,有偵測錯的方法嗎?
        • 可以加入除錯碼,可以及時發現錯誤,但要犧牲一個bit
        • PCBC mode
  • OFB:
    • 同樣的,把明文作為位元流
    •  一開始加密一個初始向量
      • 將加密後的初始向量分別傳到:
        • 1.第二個block
        • 2.與P1做Xor -> 得密文C1
      • 再來對先前傳至第二個block的IV做加密,完成後分別傳到第3個block ......
    • 優點:
      • 不依賴產生出的P1或C1, 所以不產生時間延遲
      • 錯誤不會擴散
  • CTR (Counter):
    • 加密方法:將Counter i 加密,與Pi進行Xor得到密文Ci,持續進行直到完全加密
    • 解密方法:將Counter i 加密,與Ci進行Xor得到明文Pi,持續進行直到完全解密
    • 每進行一次運算,便會將Counter++,所以稱為計數器模式
    • Counter 不應該被重複使用,避免相同明文出現相同密文
    • 類似於ECB的觀念,但放入加密器的是會變動Counter,而且Counter總是128位,所以可以視作密鑰流處理

  • 確保資料的正確性
    • message authentication
      • CBC - Residue, or CMAC , NMAC
      • HMAC
    • 核心觀念:建立一個除錯碼以及演算出除錯碼的方式,由傳送方跟接收方約定而成,接收方在獲得密文後再進行驗證。

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日 星期四

自由軟體 - 台南數位文創園區

台南數位文創園區

講者 : AJ


  • 園區提供設備
    • 3D印表機
    • 雷射切割機
      • Tinkercad
        • 線上建模網站
        • 使用OpenGL,所以不支援IE
  • PanScience泛科學
  • 台灣第一大科普網路社群
    • 用輕鬆有趣的方式,推廣科普閱讀
  • Npost公益交流站
    • 關注主流媒體不關注的公益問題
    • 讓公益變成全民運動
 it's technology married with liberal arts, married with the humanities, that yields us the result that makes our heart sing
協會的初衷:科技應當與人結合,與人作互動。我們一開始就是使用PunCar把自己送進任何需要我們的地方,教導他人Excel、Google、Dropbox,用最簡單的方式,去替不會使用電腦的人解決問題,而在我們離開那裏後,改變仍能留下,讓科技與當地人結合,進而改變他們的生活。同時這也是增長自身經歷的過程,能從不會使用電腦的人的思考模式出發,換個不同的邏輯或許也會有不同的發現。

台南數位文創園區與政府合作,為任何想創業的人,想自己做小物品的人,想參與活動的人,提供空間與設備讓大家互相認識,同時也會邀請一些創業家來演講,讓每個人都有學習與分享的機會。

Queue - 佇列

Queue跟Stack一樣都是有順序性的,存與取之間有一定的規則。直觀來看,Queue其實就像隊列,排頭的當然先服務,後到的就得等前面完事才能往前走,當然,我們不考慮插隊的情形,每次要加入這個隊伍的,都必須排在隊伍尾端,所以成了FIFO(First in First out)的型式。

1.Queue ADT
  • Queue CreatQ(maxQueueSize) :創造一個空的quene
  • Boolen IsFull(quene,maxQueuesize):判斷quene是否滿了,
  • Boolen isEmpty(queue):判斷quene是否為空
  • Quene Add(queue,item):添入item是quene
  • Element Delete(queue):刪除quene中的一個物件,並把它傳回給item
Queue的操作都與Stack類似,主要有兩個不同:

其一是stack有一方是底,我們只需要一直把東西丟進去丟進去,不過quene則是兩端皆開放的,要分別處理排頭跟排尾,所以我們需要兩個變數(front , rear)來儲存quene的頭跟尾,而front與rear的初始值一樣可以當作-1,配合於isEmpty的判斷上。
  • add : rear = rear +1
  • delete : front = front +1;
第一,從上述的操作,我們可以看出quene會不斷地往右偏移,所以在判斷isFull時,我們不能僅考慮rear是否>maxQuenesize,我們要思考的是,這個隊列是不是真的滿了?如果沒滿,則要把整個隊列往左平移。

2.Circular Queue

它是一個環狀的queue,這能解決上述第二個問題,不過他也得付出一點代價,即只能放MAX_Queue_Size - 1個元素,剩下一個必須用來判斷queue為空或為滿。

3.其他quene形式
    • Double ended queue:兩端都能放且兩端都能拿的queue
    • Priority queue:元素在queue的位置跟它的priority值有關,跟進入queue的時間無關
    • Double ended priority queue

Stack 堆疊

1.什麼是Stack?

如果把input的資料當成積木,Stack就像疊積木一樣,把新加入的磚塊放在後加入的上面,要拿出也是把新加入的拿出,屬於LIFO (Last - in -First out)模型。

2. System Stack

有些語言函式的呼叫也是個Stack,比如Function A呼叫了Function B,而Function B又呼叫了Function C,用Stack結構來表示的話:

FunctionC
FunctionB
FunctionA

FunctionC會先執行,完成後才會是B與A。
當然囉,如果函式巢狀增加,這些積木也會越疊越高,而高度也是有個極限的,當到某個地步後還要疊的話,就會發生stack overflow的情形,所以在Recursive的終止條件上要特別注意。


4.Stack 的抽象資料結構
  • Stack CreateS(maxStackSize) :創造一個空Stack,並給予這個Stack最大容許儲存量
  • Boolean IsFull(stack, maxStackSize):確認stack是否滿了,避免push時把item丟入錯誤區塊
  • Boolean IsEmpty(stack):確認stack是否為空,避免pop時丟出的錯誤資料
  • Stack Push(stack,item):配合isFull使用,當還有位置放時,把item放入stack
  • Element Pop(stack):配合isEmpty使用,當裡頭還有物件,就把物件丟給item
實作stack最簡單的方法就是用一維陣列去處理它,為此我們需要兩個東西,一個是陣列stack[MAX_SIZE]來儲存,另一個就是top,用來表示目前存了多少item。

top
...
...
Stack[2]
Stack[1]
Stack[0]

在創造一個Stack時,可以把top設為一個非合理範圍,比如 -1,這樣便可在isEmpty上做判斷。
每當push就top++,如果top合理,便加入物件,pop則把top--,丟出物件。

5.一些Stack的應用

System Stack就是堆疊的基本應用,他用於在Run-time時決定Function呼叫的順序。在進行Backtracking與Recursive上,也涉及了Stack的概念。








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日 星期一

卡諾圖的化簡

1.認識 minterm & maxterm

Minterm   :  由輸入或輸入的補數構成的   AND
    比如有兩個輸入x,y,那minterm = xy , x’y, xy’ ,x’y’
Maxterm : 由輸入或輸入的補數構成的    Or
    比如有兩個輸入x,y,那maxterm = x + y, x’+y , x+y’ , x’+y’

->考慮DeMorgan’s theorem
    (A + B + C)’ = A’B’C’
    (ABC)’ = A’ + B’ + C’

可以進行Minterm與Maxterm之間的轉換:
    e.g. x’y’z’ = m0 = x + y + z =M0
再比如說有一個電路
    F = x’y’z’ + xy’z’ + xyz = m1 + m4 + m7,
    F’ = x’y’z’ + x’yz +x’yz’ +xy’z +xyz’ =m0 + m2 +m3 +m5 +m6
    F’’ = (x+y+z)(x+y’+z)(x+y’+z’)(x’yz’)(x’y’z)
所以說F可表達成兩個形式

    1.  5個 minterm    or   在一起 (SOP)sum of product形式
    2.  5個 Maxterm  and 在一起 (POS)product of sum形式


那有了Minterm跟Maxterm有什麼好處呢?

    若電路F表示為 x’y’z + xyz +xyz’
    上述的F稱為 canonical form,因為它有三個輸入,而且每項都有3個變數,實際上F可化簡為x’y’z +xy,但這樣就非 canonical form
    那表示成canonical form又有什麼好處?就是真值表定可表達成canonical form,比如說:
        x=0,y=0,z=1,可以寫作x’y’z
        x=0,y=1,z=1,可以寫作x’yz
        x=1,y=1,z=0,可以寫作xyz’
    所以只要有真值表,任何電路總能表達成canoncial form(SOP或POS),但是這個形式有個致命的缺點,就是他的變數很多,這間接導致了成本增加。

於是,我們需要簡化的技巧

Gate-level minimization

2.Karnaugh Map

    1.按照格雷碼填入電路輸入 e.g(00 , 01, 11, 10)
    2.圈1 or 圈 0 ,以1,2,4,8,16,32...2的次方為個數去圈,儘量多圈讓化簡達到最大效果
    3.圖視為連通的
    4.持續的圈0 or 圈1,直到所有的0或1都被圈到
    5.圈1得到化簡的F (SOP形式),圈0得化簡的F' (SOP形式),需再做一次迪摩根得F(POS形式)
   
0或1可以重複圈,但是一定要完全圈完其中一種
注意:如果一個項的變數個數跟輸入不同,比如說輸入有w,x,y,z,但F中有一項為wxy’,即缺少了z項,那麼我們就要把wxy’z與wxy’z都視為1

卡諾圖的消去原理:(x' + x) = 1

雨港基隆的製作與誕生

  講者:Erotes Studio 李處守總召



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

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

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















2014年10月12日 星期日

串流加密法

串流加密法


像DES、AES這種將明文分為一個一個區塊(block)的稱為區塊加密,與之區隔的便是串流加密。

串流加密的精神在無論明文或是金鑰,都將其視為位元流來操作,如此一來,就不必特意去分割明文區塊,在需要處理即時資料時相當方便。
  • 區塊加密
    • DES (Data Encryption Standard)
    • AES (Advanced Encryption Standard)
  • 串流加密
    • 亂數產生器
    • A5/1
1.亂數產生器
  • 可以視為一個實際版的One - time - Pad
  • 線性反饋移位暫存器 (Linear Feedback Shift Register)
    • 移位暫存器越長安全性越高
    • 理論上 L = n 之LFSR最多可產生2^n-1的週期
      • 要為Primitive polynomial(無法再分解成2個多項式的乘積)
  • A5/1
    • 利用3個LFSR (19bits 22bits 23bits)
      • 為什麼長度要不同?
        • 因為一開始LFSR都是為0,必須要透過一個64bit的key填入,LFSR長度必須不同,初始狀態才會不同
    • 填入LFSR後再將LFSR初始狀態分別作22跟100次的打亂
    • 總是反饋最大的值
      • e.g. = maj(x3,y4,z4) = (1,1,0) = 1 (因為1有兩個)
        • 於是x3 -> x4 , y4 ->y5 ,z4不動
    • A5/1 Demo

現代加密 - AES

AES



1.AES根據金鑰長度不同分別有10、12、14個回合,每個回合各有一把128位元的金鑰

2.明文區塊(block)與狀態(state) 上的轉換
  • 將明文block轉換為16進位編碼,填入矩陣(State)
  • 同樣的,每把鑰匙也能用state表示
  • State為16進位的數字
3.操作
  • 1.SubBytes : 假設state是19,則找第一列,第九行,取代state
  • 2.Shiftrow :第一列不移位,第二列移一位,第三列移兩位,第四列移三位
  • 3.MixColumn : 把每一個行乘一個矩陣
  • 4.AddRoundKey : 讓State跟回合金鑰做XOR
  • 以上步驟進行10、12、14次,依金鑰長度而定 
4.回合金鑰如何產生?
  • 利用主金鑰產生回合金鑰
  • 每個欲加入的字元w[i]由前一個跟往前第四個字元決定
    • 若i為4的倍數,將上述兩值XOR
    • 否則將w[i-1]進行函數g運算後,再與w[i-4]做XOR
  •  函數g
    • 將w[i-1]做旋轉後與取代

6.破解AES
  • 128位元的密鑰,要2^128次
  • 差異攻擊、線性攻擊與統計攻擊對AES無效 
7.補充:Mixcolumn
  • 矩陣中相乘會不會導致state的值越來越大?
  • 思考什麼是有限體 (GF)
  • 有限體能以多項式來表示有限運算元集合
  • AES的運算是基於GF(2^8)
    • 在GF(2^8)下,加法運算被列入XOR
    • 為了使乘法有封閉性,要mod多項式x^8+x^4+x^3+x+1

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月6日 星期一

時間複雜度

-Compile time :
-Execution time

     -Program step:       
   
        Definition : a program step is a syntactically meaningful program step whose execution time is independent of the instance characteristics,which means that something like the header of a sub program, a declaration of a variable (without assignment) is not consider as program step.
        Cautious : the execution time of program steps may be different,which depends on the degree of complexity.
   
    -How to ?
        -by a global variable (count) to calculate step by step.
        -by a table on counting the product of s/e(step/execution) and frequency (Fig.1.3)
       
    -So whats the different between two methods?
        -a global variable returns a number,
        -a table presents a function of time and step. e.g. 2n+n , n is a scale of input.
   
    -The best / average / worst step count.



-The big O notation:
    -Definition :   
    f(n) = O(g(n)) iff there exist positive constants c and n0 such that f(n) <= cg(n) for all n,n>=n0

-The omega notation:
    -Definition :
    f(n) = omega(g(n)) iff there exist positive constants c and n0 such that f(n) >= cg(n) for all n,n>=n0

-The theta notation:
    -Definition :
    f(n) = theta(g(n)) iff there exist positive constants c1,c2 and n0 such that c1g(n0) <=f(n)<=c2g(n) for all n,n>=n0.

-結論:
    1.O考慮的是函數上限(Upper bound),omega則考慮下限,theta則是O跟omega的夾擠
    2.取的都是最函數趨勢影響最重要的一項

2014年10月5日 星期日

聊聊有病遊戲的東南西唄

講師:哈利菠菜

  

 

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

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


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

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


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

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

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

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

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


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

2014年10月3日 星期五

自由軟體 - 俠益千里

Course 2 - 俠益千里 ‧ 扶餘海外

紀宗衡講師@真理大學資管系


  • 行動的初衷 :
讓外國的孩子看得懂外國的新聞。因為他們的家園正在一點一滴的消失,愈來愈多的草原瀕臨沙漠化,愈來愈多的土地被賣出,但是苦於地理與資訊上的隔閡,孩子缺乏了危機意識。
起床,電車,四小時辦公室或工廠的工作,吃飯,電車,四小時的工作,吃飯,睡覺,星期一,星期二,星期三,星期四,星期五,星期六,大部分的日子一天接一天按照同樣的節奏周而復始地流逝。可是某一天,『為什麼』的問題浮現在意識中,一切就都從這略帶驚奇的厭倦中開始了。『開始』,這是至關重要的。厭倦產生在機械麻木的生活之後,但它開啟了意識的運動。
-薛西弗斯神話
我把我的一切都交了出來,財產,作品,只把日記留給我自己。如果你還要折磨我,我就出走!我就出走! 
-托爾斯泰  
俠益千里,就是跳脫日復一日的框架,出走 。
  • 當我們透過資訊去服務時,不是工程上的思維,而是管理上的
    • 志工:
      • 追求更好的生活民質,透過志工想想自己究竟能做什麼
    • 因為有需求,才能達到真正的資訊應用
    • 不是透過鍵盤,而是實實切切的用自己的手去幫助別人
  • 寫程式與志工之間,究竟有什麼關係 ?
  • 青年的四個大夢
    • 一個人在17~33歲之間,如果沒有完成這四個大夢,將影響他往後會成為怎樣的人
  • GitHub
    • Social Coding : Code/do-ing together
    • 思考如何分工合作、如何做自己想做的,如何做得更好
  • 出走
    • 你敢不敢走一條未曾走過的路,從安逸的大夢中醒來? 
    • 因為走出去,而會與當地有了很深的連結,從文化,從語言,那將是跟著你一輩子的記憶,甚至改變一個人。
    • 活動 :
      • 偏鄉最大的問題,就是年輕人不回去了,即便我們現在把年輕人找回來,也必須面對他們的就業問題,於是,我們決定著手在留下這一代的年輕人。
        • Arduino + Scratch + 布袋戲
        • 讓寫程式不只有寫程式,而是包含了環境與文化
      • 2013滾滾江原
      • 2014俠益千里 : 哈薩克~台灣5500公里
        • 服務 : 
          • 建置一間電腦教室
          • 一個自由軟體與英文的培訓團隊

Course 2 - 科技啟蒙


  • 發表就是最好的記憶
  • 鼓勵實作與研究,提供一個發表的舞台
  • 科技啟蒙 = 對新手最友善的研討會

數位系統導論 - 布林代數


0.布林代數其實就是0與1的運算

1.三種布林代數的表示
  • Boolean Algebra
  • Truth table
  • Circuit Diagram
2.普遍原則
  • Closure
    • e.g. 若x*y屬於集合S,則x,y也會屬於S
  • Associative law
    • a*b*c = a*c*b
  • Commutative law
    • 1+0 = 0+1, 1*0 = 0*1
  • Identity elements
    • + : 0+0 = 0 , 1+0=0 ,such that x+0 = x
    • *  : 0*1 = 0 ,  1*1=1, such that x*1=x
  • Distributive law
    • x*(y+z) = x*y + x*z
    • x + yz - (x+y)(x+z)
  • DeMorgan's Theorem (德摩根定律)
    • (x+y)' = x'y'
    • (xy)' = x' + y'
    • 廣泛用於電路最佳化(And與Or的轉換)
      • e.g : x' + y' = (xy)' = NAND gate
    • 可以用在SOP與POS之間的轉換
  • Absorption
    • xy + x = x (x+y) = x
3.運算子優先順序
  • 括號 > NOT > AND > OR
4.邏輯閘

x與y為input
  • And  : x*y
  • Or : x + y
  • Not : x = x'
  • NAND : -> And ->Not
  • NOR :  -> Or -> Not
  • Exclusive - Or  (Xor) = xy' + x'y 相同input為0,不同input為1(互斥)
  • Exclusive - Nor  = xy + x'y' 相同input為1,不同input為0
5.Positive logic and negative logic
  • Postive logic : H =1, L=0
  • Negative logic : H=0, L=1
  • active high : 1的時候出現反應,為正邏輯
  • active low : 0的時候出現反應,為負邏輯
6.Circuit
  • Gate : 1個邏輯閘大概由2~14個電晶體構成
  • Circuit : 由多組邏輯閘構成
    •  A combination of interacting gates
    • Integrated Circuit (IC)
    • Chip 
      • A silicon semiconductor crystal that contains the electronic components for constructing digital gates.
    • Level
      • SSI
      • MSI
      • LSI
      • VLSI
  • System : 放在一個PCB(印刷電路板)上,由很多組電路構成
7.Parameters for Digital Logic Families

由於不同的製作技術,在邏輯閘上以下的參數可能會有所不同
  • Fan-Out
    • 一個邏輯閘的Output到底能夠推動幾個邏輯閘正常運作
      • 一個邏輯閘的輸出,最多能推動幾個輸入
    • e.g. Fan-out = 2,Output就只能接兩個
      • 假設1代表5V,如果接了3個,有可能一個Output只能達到2V
      • 但是不影響原本的布林函數
  • Fan - In
    • 想做Fan-Out的反面
  • Propagation delay (傳遞延遲)
    • 邏輯閘是由電晶體構成,電晶體充放電都需要時間,所以會造成延遲
    • 一個晶片裡,邏輯閘的數目有幾百萬~幾千萬個
      • 即便一個邏輯閘的延遲只有幾奈秒,加總起來仍十分龐大
      • 是用最慢產生的最終Output當成傳遞延遲
      • 所以說,晶片的表現要好,整體模組的速度要差不多快
    • 傳遞延遲跟光罩製作技術(e.g.微米,奈米)有關
  • Noise Margin
    • e.g. 1~0V之間判斷為0,4~5V之間會判斷為1
8.Computer Aided Design
  • 現在的邏輯閘動輒上百萬,我們需要電腦輔助設計(CAD tool)
  • EDA is specially used for IC design
    • HDL (Hardware Deseription Language)
      • 用來描述你電路的語言
      • tool幫你compile之後會轉換(Logic synthesis)為邏輯閘(一個實體的電路)
  • 電路實現的種類
    • ASIC 
      • 應用導向的積體電路
      • 量身打造你設計出的電路
    • FPGA & CPLD
      • 給你的是晶片,裏面cell都固定
      • 我們可以自己把電路燒上去
      • 只要電路沒有超過cell,都能應用上去 
9.NAND and NOR
  • 其餘邏輯閘都能由NAND或NOR實做而成
    • 為何使用?
      • 因為NAND與NOR容易透過電晶體實做
      • 因為NAND與NOR比起AND與OR有更低的傳遞延遲
  • 電路上的轉換要則
    • 1.2個Not = 0個Not,透過增加雙向的Not將AND或OR轉換
    • NAND與NOR之間的轉換
      • 用兩次迪摩根法則: x' + y' + z' = (xyz)'

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也要有點認知才行,否則在查找原始碼時也不知道哪些是需要的資料。