rsync

rsync 是如何比較檔案差異的?

rsync 是 unix 上常常被用來同步兩臺主機資料的指令。而 rsync 令人稱道同步能力,不僅僅是把檔案抓下來到本機,而是厲害到可以只下載一個檔案中的差異部分,而非整份檔案抓下來。 如果自己想自製一個能夠比較兩份文件差異的程式,稍微想一下設計,大約還能以行爲單位來設計,找出差異。 但是如果檔案並非純文字,而是像照片這般的二進位檔案,可能一整份檔案都沒有任何換行符號,一比較差異就是讓伺服器把整份檔案重新抓下來了。 面對通用檔案的差異比較,其設計思路就會朝向將檔案切成一塊一塊的區塊來進行差異比較。但終究需要面對以下問題: 不可能將每個區塊的內容下載下來讓客戶端進行比較,這樣等同下載整份檔案 如果只是檔頭加了一點內容,切割區塊有機會造成每個區塊內容就不同,也等同要下載整份檔案 面對以上問題,rsync 採用了一些不錯的解決對策 校驗和 (Checksum) 校驗和不是 rsync

  • FreedomKnight
    FreedomKnight
5 min read
java

annotation 的二三事

第一次看這隻小老鼠 在 java 裡面常常會看見下面這樣的用法 @Override void method() { } 上面有個小老鼠的 @Override 便是 annotation 。 這個 @Override 的作用是開發者繼承某個 class 之後,想要覆寫父類別的時候加上這個 annotation 可以讓編譯器知道你想覆寫,因此編譯器會檢查父類別是否有相同的 method ,以免你原本想要覆寫父類別的 method 結果卻手殘打錯字沒有真的覆寫到而發生意外。 因此 annotation 的作用就是讓被 annotation 標籤上的 class, method 之類的東西額外的增加資訊。 再看小老鼠

  • FreedomKnight
    FreedomKnight
4 min read
scheme

Scheme 中的 quasiquote, unquote, unquote-splicing

先談談 Scheme 中的 Quote 每次我向人介紹 Scheme 的時候,我總是喜歡跟人說 Scheme 語法只有一個: (函數名稱 參數1 參數2 參數n...) 在 scheme 如果不是數字或是文字,則會被當成 symbol ,而 symbol 簡言就是被當成某個內容的名稱,像是函數的命名、變數的命名都被稱為 symbol。 只要遇到 symbol ,也就是一個像是變數名稱或是函數名稱的文字,Scheme 都會嘗試去找找看有沒有對應的變數值或是函數。 而今天 Scheme 是可以用同一個語法去表達資料的,

  • FreedomKnight
    FreedomKnight
3 min read
lambda

lambda 與邱奇數

lambda 這幾天研究了一下 lambda 之後,發現 lambda 根本不只是匿名的函數這麼簡單而已。在很早之前邱奇就很想用數學表達世界上所有的事情。而當中為為了設計一套方法來判斷什麼樣的東西是可以拿來被計算的,lambda 就被獨立出來發展了。 而 lambda 運算其實包含的元素其實很簡單,只有包含兩個東西,就是變數跟函數而已。 先講一下如何表示一個 lambda 表達式 ( lambda term ),接著舉幾個例子就能很快看懂這套數學系統了。 lambda 表達式的規則(以下用 t 來代表 lambda 表達式,變數用 x 來代表): x

  • FreedomKnight
    FreedomKnight
11 min read
php

Ruby, Python, NodeJS, PHP 小看法

最近在 Codecademy 把 Ruby 這個我沒學過的語言給跑了一遍,之前我是覺得這語言有點醜啦,但深入了解一下之後,我發現是有他的哲學存在的。 所以我現在想稍微比較一下我碰過的語言,比較一下社群的生態 Ruby 先拿 Ruby 來聊聊,因為才正剛好跑完一趟他的教學。一開始我看到 Ruby 的 Block 是用 end 結束,我就聯想到 Pascal 這個號稱當代最美的程式語言。 Pascal 真的很美,也幾乎都做得很好,但是美中不足的就是 begin - end 來當作程式的

  • FreedomKnight
    FreedomKnight
6 min read
vm

初探虛擬機和虛擬化

這幾天小弟我開始接觸虛擬機了,但是許多產品讓人搞得有點頭昏腦脹 因此小弟開始爬文好好的釐清這些有關虛擬化的事情。 小弟目前看到大約有 Xen, KVM, VMware, Virtual Box, Hyper-V 這些產品,因此接下來的介紹會將這些產品慢慢的分類 原來虛擬化中有個東西叫做 Hypervisor 這個實在不知道怎麼翻譯的東西,這東西其實就像是 VM 的控制台,虛擬的作業系統裝在 hypervisor 上面,由 hypervisor 去控制硬體。而當中又依照 hypervisor 的安裝位置分成兩類。 type I : 又稱為 bare-metal hypervisor ,看這個詞大致上就是跟裸機裝虛擬機有點關係,

  • FreedomKnight
    FreedomKnight
4 min read
python

從 Python 樂透小程式看美感

因為最近有需要個類似樂透電腦選號的功能,需要取六個亂數就是了。 當我完成這個小的程式之後,我深深的覺得 python 是個非常具有美感的語言 choiced = [] # 選到的號碼 for i in range(6): choiced.append(random.choice([x for x in range(1, 50) if x not in choiced])) 這已經是我拆出來最重要的三行程式碼了,不過當中最重要的是以下這一段 choiced.append(

  • FreedomKnight
    FreedomKnight
6 min read
git

Git 的衝突與分支

關於衝突 當我們在使用 git 跟人家一起合作時,照著上一次講到的每次都是 pull, commit, push 這三個步驟。 只有一個人的時候還感覺不出有些什麼問題。 但是如果有一個狀況是,我跟其他人 pull 到的瞬間都是相同的程式碼,各自修改了不同的部份之後 commit 接著準備要 push,但好死不死對方比我早 push 回代管主機。 那換成比較慢的我要 push 回代管主機時會發現出現了問題。 主要原因是因為剛剛另一個人已經把代管主機的原始程式碼更新了,所以你原先 pull 到的內容已經過舊囉! 這其實也是為什麼在每次修改程式碼之前都會希望你做一次 pull 的主要原因之一,就是希望自己電腦裡的程式碼是跟代管主機上的版本一樣的新。 那麼這次由於對方已經快了我們一步導致我們

  • FreedomKnight
    FreedomKnight
6 min read
php

PHP 的 Cookie 與 Session

這次想談到的主題跟 php 的 session 有關,這東西的產生當然也是一步一步的演進。 網頁在網路上,一開始其實單純只是想要有一個分享文章的空間。 並沒有想到會有今天如此強大的應用。 當初在設計網頁瀏覽時,主要分為兩個部份 協議 內容 協議 這部份主要是是軟體在處理的,我們必須知道,上網的時候是靠軟體抓取網頁的內容的,那軟體要如何知道要抓哪一個網頁呢? 又或者我要如何告訴網頁,我現在要把我的帳號密碼輸入給伺服器呢? 因此,所謂的協議,其實就如同公文一般的存在。必須寫出特定的內容,讓兩邊的軟體知道你想要做什麼 例如: i want /index.html 字面上可能代表我要 index.html

  • FreedomKnight
    FreedomKnight
8 min read
javascript

javascript 匿名函數

這幾年來,有個程式語言的名詞很夯,到處都在喊著 lambda, lambda, lambda ,就連 Java 下一次的改版重點也都放在 lambda 上面。 而其中我最喜歡的語言 Python 也有這個東西,到底什麼是 lambda 呢? 其實 lambda 就是所謂的匿名函式,而其中的始祖就是 functional language 的始祖 - Lisp 所生出來的一個應用。 對 js 而言,許多開發者也都不斷的嫌 js 奇怪、

  • FreedomKnight
    FreedomKnight
8 min read
markdown

簡潔的編輯語法-Markdown

Markdown 是目前很火紅的一種編輯的語法,有許多知名的網站開始支援這種東西 例如: GitHub 程式語言也有函式庫能夠支援生成 Markdown 語法的文字 例如: php, javascript, python 如果要解釋這語法是什麼,我想可以先從編輯文字的歷史 html 在網路開始興盛之前,所有的文字都是在命令介面下,但這並不表示當時的黑畫面是不能調整字型、大小、顏色的。 那會寫程式的人當然很好控制這些東西,但對於一般人來講,不希望學會寫程式才能去控制這些排版。因此開始有許多方式來做到這件事情 其中一個方法就是,設計一種標記的方法,讓某翻譯軟體讀到,那就幫忙翻譯成我想要的排版方式,而 html 就是這樣的作法。 <strong&

  • FreedomKnight
    FreedomKnight
6 min read
php

關於 PHP 字串跟引號

這幾天寫 PHP 的時候,我的組員突然想看起我的程式碼 結果他說他有點困擾我程式碼中的引號 我想主要是因為 SQL 字串也是需要引號,讓一堆引號出現在字串裡令人困惑 我想應該寫點有關引號的部份,不過這篇主要的目的並不會著重於 PHP 字串的底層機制 PHP 字串表示法 PHP 的字串宣告如同下方 $str = 'hello world' // 單引號表示 $str = "hello world" // 雙引號表示 如此一來 php 就能理解這個變數是個字串變數,那為什麼可以單引號以及雙引號呢? 這必須牽涉到如果你的字串裡頭真的也想放入 '

  • FreedomKnight
    FreedomKnight
2 min read
python

小試 Python GUI, 以心理測驗計數練習

Python 真的是一個很棒的語言,不但語言的理念是簡單而已,還有許多好用的 library 可以用,當中官方提供的 library 已經很夠用了,而 GUI 介面是使用 Tcl/Tk 去整合。 Tcl/Tk 本來就是自成一格的腳本語言,不過 Python 肯定是發現 Tcl 是很容易做到快速開發的腳本語言,可能也是因為 Tcl 是用純命令的概念的腳本語言啦!最後 Python 把 Tcl 整合成自己的模組,也非常的 Python-like

  • FreedomKnight
    FreedomKnight
4 min read
git

Git 基礎教學

Git 是個分散式的版本控制系統 以往的版本控制系統都是將程式碼放在伺服器上集中管理 當修改程式碼時皆需要連上網路,將修改一一提交 而 Git 則可以不需要連上網路,來做單機的版本控制 除了單機也能透過伺服器代管程式碼提交回去 首先如果要使用 Git 要在專案資料夾下 初始化 git init // 這是讓 git 初始化,生成 .git/ 資料夾 加入追蹤 接著專案資料夾底下,應該有了一些檔案,為了讓 git 去追蹤這個檔案必須使用 git add 加入追蹤。 git add

  • FreedomKnight
    FreedomKnight
5 min read