跳到主要內容

發表文章

RSA, AES加密大檔案

RSA加密有長度限制,測試了一下最大是245K Byte,超過就會報錯「data too large for key size」 如果改用AES則沒有長度限制,但AES是對稱式的加密,等於你要把密鑰傳給對方,對方才能解密。這樣子中間轉手的Router,或是同網域中的電腦就能接收到到你的密鑰了。 那麼解決方法是什麼呢? 答:將資料用AES加密,AES加密時的密鑰用RSA加密,然後一起傳給對方就行了 那怎麼實作呢?Linux上面有openssl所有的功能都在裡面了,不管是要編碼,要加密解密,通通都有了

Github Pages 使用jekyll安裝與設定,及連結多個github專案

第一個github pages 在github建立一個repository 名稱為 <username>.github.io 好了,剛建立好等一陣子,打開瀏覽器進入 <username>.github.io ,就可以看到空白網站了 把 <username>.github.io git clone下來,隨便加個 index.html 就可以看到結果了 連結其他的github專案 每個github專案都可以自己管理自己的github pages,不用都放在剛剛那個 <username>.github.io 裡面。 譬如你還有一個github專案,名稱為 project ,則在 project 裡面再開啟一條branch命名為 gh-pages ,那麼連結 <username>.github.io/project ,就可以連到 project 裡面了。 只是 gh-pages 這條分支,都只會用來做專案的網頁呈現,所以我們會將它設定為獨立分支,不從master裡面分出來,所以開啟分支時,使用 git checkout --orphan gh-pages 就可以開啟獨立的分支,沒有任何parent的分支,這時候再把原本的檔案都刪掉,這條分支就專心做網頁就好。 使用jekyll 從HTML慢慢刻出一個網頁有點累,github pages大多是用 jekyll 這個框架來產生部落格網站。 怎麼安裝, jekyll-quick-start 已經講得很清楚了,這邊說一下,連結其他github專案時要特別設定的地方 在jekyll根目錄有個 _config.yml 檔案,找到 BASE_PATH : 這一行。如果沒有修改的話,在網頁裡面預設的連結都會連回 <username>.github.io ,而不是你目前的 <username>.github.io/project ,這裡使用絕對路徑或相對路徑都可以 絕對路徑 BASE_PATH : <username>.github.io/project 相對路徑 BASE_PATH : /project 這樣子預設的連結就不會亂跑了,我一開始找不到,只好傻傻的去改模板,越...

linux, bash, find 的應用(-exec, sed -i, 檔案內取代, 與xargs比較)

find -exec find -exec 指的是將找到的檔案,送到後面的指令去處理。從 -exec 到 \; 為止,代表是接受從find送來要處理的指令,而送來的檔案將用 {} 代表找到的檔案。 譬如你想把所有副檔名為 .log 的檔案刪除掉,可以這麼做 find . -type f -name "*.log" -exec rm {} \; (其實我加上 -type f 有點多餘,因為我已經指定 -name "*.log" 了,就不可能輸出資料夾了。) 如果刪檔案的時候,一直要你按 yes ,可以這樣 yes | find . -type f -name "*.log" -exec rm {} \; yes 這個指令會一直串流輸出yes,這樣刪檔案就自動一直輸入yes 例子中 find 找到的檔案,就放到 -exec 至 \; 之間的指令去處理,譬如找到了檔案 develop.log ,就會變成 rm develop.log 另外, {} 並不是規定只能出現一次,譬如你要將資料夾內所有檔案加上副檔名 log ,可以這麼做 find . -type f -exec mv {} {}.log \; 這指令會包含子資料前內的檔案都加上.log副檔名。如果只想要目前資料夾的檔案,所以可以加上 -maxdepth 1 ,若要地回到下一層資料夾可以將1改成2,3或4以此類推 find . -maxdepth 1 -type f -exec mv {} {}.log \; 因此,若要批次改變檔案的內容,就可以搭配 find -exec 跟 sed -i 。sed 加上 -i 參數,代表直接對檔案內容做修改。 我常常在幫別人複製或移動網站,很多人的網址都寫成包含域名的絕對路徑,所以常常要用這個指令去找出所有含舊域名的檔案,並改成新域名。 譬如舊域名為 http://www.old.com ,要改成 http://www.new.com ,我會這麼做 find . -type f -exec sed -i 's/www.old.com/www.new.com/g' {} \; (sed這個指令在OS X上面如果照上例那樣執行,會有...

HTML, CSS, 相對視窗或螢幕的高度與寬度

在 w3school.com 網站, CSS Units 有各種與寬度的表示法 以我使用的頻率來排序: px: 使用螢幕幾個像素(但是還要考慮Retina螢幕像素是一般螢幕像素的兩倍) %: 相對父層的大小比例 vh, vw: 相對於瀏覽器展示網頁區域的大小(不是整個瀏覽器的大小,沒包含瀏覽器的工具列,只有展示網頁的區域) vmin: vh, vw取最小值(另外還有vmax則是取最大值,但是目前IE跟safari不支援) px 與 % 很常用, vh , vw 與 vmin 是CSS3的新產物,表示相對瀏覽器展示頁面的大小 相對視窗大小 這邊先說明, vh , vw 與 vmin 只包含網頁顯示區域的長寬,不包含瀏覽器的工具列 先從dom的最根本講起好了,一份HTML文件,根是 <html></html> (雖然沒有嚴格規定,不寫也能顯示),然後這個根的父元件就是瀏覽器的網頁頁面顯示區 因此,如果對 <html></html> 宣告大小是 100% 就跟宣告 100vh 一樣,因為都是指瀏覽器的網頁頁面顯示區大小 這個範例是將html設定為100vh <html style="height: 100vh"> <head> <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script> <script type="text/javascript"> console.log($('html').height()); </script> </head> </html> 這個範例是將html設定為100% <html style="height: 100%"> <head> <script src="https://code.jquery.com/jque...

Linux, bash, 壓縮, tar, bz2, xz, 7z, 壓縮率

Linux, bash, 壓縮, tar, bz2, xz, 7z, 壓縮率 如果只是想查各種副檔名的解壓縮指令,只要Google副檔名就可以找到(例如: tar.bz2 ) 這邊主要是在對資料夾壓縮時,為了自訂壓縮率而深入研究壓縮指令而產生。 tar 可以對檔案或資料夾進行單存的打包(或解開打包),後面接c代表打包,x代表解開打包。這邊在Bash底下產生一個簡單的文字檔來練習: echo "Hello World" > text tar c text # 輸出 text000644 000765 000000 00000000014 12437746653 012241 0ustar00wemeewheel000000 000000 Hello World # 如果要儲存,加上參數f,並指定存檔名稱 tar cf text1.tar text # 或者使用串流來寫入檔案也可以(實際應用不建議) tar c text > text2.tar 原始檔案12B, 打包後2K, 使用串流寫入的10K, 可以確定打包完全不會有壓縮的效果 12B 12 4 10:57 text 2.0K 12 4 11:01 text1.tar 10K 12 4 11:01 text2.tar 其實打包主要目的在於,我常用的bz2壓縮,只能對檔案壓縮,不能對目錄壓縮,所以才需要先把目錄打包成一個檔案,再用bz2去壓縮它 接下來,弄個目錄跟文字檔來測試 mkdir dir echo "Hello World" > dir/text tar cf dir1.tar dir tar c dir > dir2.tar 結果一樣,使用串流寫入的,佔的容量比較大 102B 12 4 11:28 dir 2.5K 12 4 11:44 dir1.tar 10K 12 4 11:44 dir2.tar 接下來,使用bz2壓縮看看 bzip2 -z dir1.tar bzip2 -z dir2.tar 來看看所佔用的容量 102B 12 4 11:28 dir 167B 12 4 11:44 dir1.tar.bz2 169B 12 4 11:44 dir2...

Ruby, dup跟clone的不同, 淺層複製與深層複製

Ruby, dup跟clone的不同, 淺層複製與深層複製 Ruby裡面,對於物件的複製有兩個方法,分別是對物件呼叫 dup 跟 clone ,這兩種有什麼不同呢?這兩種方法並非只是alias的名稱而已。 先不討論 淺層複製 跟 深層複製 的問題,先來看看呼叫dup做了什麼事情。假設有個class: class Foo def foo 'foo' end end 我們來試試看,產生Foo物件,然後對他呼叫 dup : foo = Foo.new dup_foo = foo.dup dup_foo.foo # => 'foo' 一切依照預期,順利的進行複製了,接下來我們對foo動態增加一些Method上去,看看能不能夠複製(至於如何對物件動態增加Method請參考 這篇 ) class << foo def run 'run' end end foo.foo # => 'foo' 原本class就有宣告 沒問題 foo.run # => 'run' 動態新增的Method 也沒問題 dup_foo_2 = foo.dup dup_foo_2.foo # => 'foo' 原本class就有宣告 沒問題 dup_foo_2.run # => 發生錯誤,No Method Error 由此,可以知道,dup方法,僅對完整宣告的class進行複製,動態增加的不會複製,那麼我們再多測試一點,使用另一種方法增加Method。我們把整個程式碼完整再寫過 class Foo def foo 'foo' end end foo = Foo.new dup_foo = foo.dup # 使用另一種方法增加Method到Foo上面去 class Foo def go 'go' end end foo.go # => 'go' dup_foo.go # => 'go', 正常執行 由此可見,只要是宣告...