2010年11月2日 星期二

驗證 MSN 使用明文傳遞聊天內容

msnms


記得幾年前大學專題也在玩 MSN ,當時只大概了解有幾種 M$ Server 負責一些事情,也久聞 MSN 是傳送明碼,但一直沒有仔細確認,剛好想到就使用 Wireshark 測試一下。


測試環境:


Ubuntu 10.10 x86_64 + Pidgin 2.7.3 + Wireshark 1.2.11


使用上就只要把 filter 設成 msnms 就可以看到一連串的資訊,上例挑選一則從 MSN Server 傳來的訊息,代表某人丟訊息給我,而後面幾個 bytes 就是聊天內容:


訊息


e4 bd a0 e6 83 b3 e9 81 b8 e4 bb 80 e9 ba bc ef bc 9f


使用 Python 驗證:


#!/usr/bin/python
if __name__ == "__main__":
        print "\xe4\xbd\xa0\xe6\x83\xb3\xe9\x81\xb8\xe4\xbb\x80\xe9\xba\xbc\xef\xbc\x9f"


結果:


你想選什麼?


我想應該不用解釋吧?轉出來的文字是可讀的,因此的確沒有加密處理。所以,人在外頭,一些敏感字眼還是少用 MSN 傳遞吧!


2010年11月1日 星期一

免費軟體 - 使用 GIMP 和 XnView 去背景顏色(透明背景)

一時之間找不到去背景的免費工具,試過了 XnView 但效果不好,最後想起安裝過 GIMP,翻了一下終於找到了!


我是要把一張 PNG 檔案的圖,把白色的背景去掉,但由於圖中間又有用到白色,導致使用 XnView 去背景時,想要留下的部分會被清掉,解法就是把真正要去背景的部分,先用另一種顏色填補,再挑該顏色去背景。


XnView


xnview



  • 影像(i) -> 編輯色彩圖(Ctrl+M) -> 挑選你要的顏色 ->啟用透明效果 -> 確定

  • 好像僅適用於 GIF 檔案


GIMP


gimp



  • 圖層(L) -> 透明度(A) -> 色彩轉成透明(A) -> 挑選你要的顏色 -> 確定

  • 可先先把想要轉成透明的部分,使用某個不在該圖顏色填滿,如黑色,再使用上述的步驟挑選黑色來轉換


[Javascript] 模仿 Monocle 分頁效果之簡單的 HTML 閱讀器

Monocle 是一套 Javascript 電子書閱讀器,以 EPUB 格式結構作為設計,使用方式不是餵給他一個 EPUB 檔案,而是依照 Monocle 所定義的資料進行實做,例如某個 function 要回傳書目,這類似於 EPUB 裡的 OPF content file 或 Spine file 等,另外還要實做一個回傳指定章節的內容,如問你第一章時,要回傳第一章整個 XHTML 內容等,以此做出豐富的閱讀效果。


關於翻頁效果,可以參考這篇 [Javascript] EPUB Reader 翻頁效果的原理,在此就仿照 Monocle 的分頁效果,使用 jQueryCSS Multi-column Layout Module (W3C Candidate Recommendation 17 December 2009) 實作簡單的 HTML 閱讀器,順便筆記一下。


程式碼 - index.html:


<!DOCTYPE html>
<html xml:lang="utf-8" lang="utf-8" xmlns="http://www.w3.org/1999/xhtml">
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
                <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
                <LINK REL="StyleSheet" HREF="style.css" TYPE="text/css"/>
                <script type="text/javascript">
                        try{
                                console.log( '' );
                        }catch(err){
                                console = {}
                                console.log = function(){}
                        }
                        var page = 1;
                        $( document ).ready( function() {
                                $( '#info' ).hide();
                                $( '#tools' ).hide();
                                $( '#touch_menu' ).click( function(){
                                        var obj;
                                        obj = $( '#info' );
                                        if( obj.is( ':visible' ) )
                                                obj.hide();
                                        else
                                                obj.show();

                                        obj = $( '#tools' );
                                        if( obj.is( ':visible' ) )
                                                obj.hide();
                                        else
                                                obj.show();
                                } );
                                var window_width = $(window).width();
                                $( '#show' ).width( window_width);
                                $( '#content' ).css( '-moz-column-width' , window_width );
                                $( '#content' ).css( '-webkit-column-width' , window_width );
                                $( '#touch_next' ).click( function(){
                                        var obj = document.getElementById( 'show' );
                                        var tmp = obj.scrollLeft;
                                        obj.scrollLeft += $( '#show' ).width();
                                        if( tmp == obj.scrollLeft )
                                                getPage( ++page );
                                } );
                                $( '#touch_prev' ).click( function(){
                                        var obj = document.getElementById( 'show' );
                                        if( obj.scrollLeft > 0 )
                                        {
                                                obj.scrollLeft -= $( '#show' ).width();
                                        }
                                        else if( page > 1 )
                                                getPage( --page , true );
                                        else
                                                obj.scrollLeft = 0;
                                } );
                                getPage( page );
                        } );


                        function getPage( page , be_last )
                        {
                                $.ajax({
                                        //
                                        // url 為 EPUB 檔案解壓縮後,章節檔案的位置
                                        // 此例剛好章節檔名是 chapter1.html ~ chapter100.html
                                        // 因此翻頁就只是類似從 chapter1.html 換到 chapter2.html 而已
                                        //
                                        url:'epub/OPS/chapter'+page+'.html', 
                                        type:'GET',
                                        async: false,
                                        success:function(data){
                                                $( '#content' ).empty();
                                                xmlDoc = new DOMParser().parseFromString( data , "text/xml" );
                                                while( xmlDoc.hasChildNodes() )
                                                {
                                                        var node = xmlDoc.removeChild(xmlDoc.firstChild);
                                                        console.log( node.nodeType );
                                                        if (node.nodeType == 1)
                                                        {
                                                                $( '#content' ).append( node );
                                                        }
                                                        else if (node.nodeType == 3 && !node.nodeValue.match(/^\s+$/))
                                                        {
                                                                var elem = document.createElement('div');
                                                                elem.appendChild(node);
                                                                $( '#content' ).append( elem );
                                                        }
                                                }
                                        }
                                });
                                var obj = document.getElementById( 'show' );
                                if( !obj )
                                        return;
                                if( be_last == undefined )
                                {
                                        obj.scrollLeft = 0;
                                }
                                else
                                {
                                        obj.scrollLeft += 999999;
                                }
                        }
                </script>
        </head>
        <body>
                <div id="container"><div id="show"><div id="content"></div></div></div>
                <div id="info"></div>
                <div id="tools"></div>
                <div id="touch_menu"></div>
                <div id="touch_next"></div>
                <div id="touch_prev"></div>
        </body>
</html>


程式碼 - style.css:


html, body {
        margin: 0;
}
#container , #show , #content , #info , #tools , #touch_menu , #touch_prev , #touch_next {
        position:absolute;
        width:100%;
        height:100%;
}
#container {
        background-color:rgba(75%, 75%,75%,0.5);
        z-index: 0;
}
#touch_menu , #touch_prev , #touch_next {
        z-index: 10;
}
#touch_menu {
        background-color:rgba(70%,70%,70%,0.5);
        width:40%;
        top:0;
        left:30%;
}
#touch_prev , #touch_next {
        width:30%;
}
#touch_prev {
        top:0;
        left:0;
        background-color:rgba(90%,90%,90%,0.4);
}
#touch_next {
        top:0;
        left:70%;
        background-color:rgba(90%,90%,90%,0.4);
}

#info , #tools {
        height:10%;
        z-index: 100;
}
#info {
        top:0px;
        background-color:rgba(0%,10%,20%,0.5);
}
#tools {
        top:90%;
        background-color:rgba(0%,10%,20%,0.5);
}
#show {
        z-index:100;
        width:1000px;
        overflow: hidden;
}
#content {
        font-size:20px;
        -moz-column-gap: 0pt; -moz-column-width: 1000px;
        -webkit-column-gap: 0pt; -webkit-column-width: 1000px;
        z-index:100;
}


使用上需要更新 ajax 那一塊,把 url 的規則修改,不然就自己擺個幾個網頁,如 chapter1.html, chapter2.html 就可以試試效果囉。


成果:


ereader
分成三塊,中間點了顯示上下兩個圖層外,可以拿來規劃成其他服務,另外,左右兩邊就只是翻頁而已。


上述程式碼大概只有 ajax 裡的 sucess function 裡的部分動作,是從 Monocle 參考修改而來的,除此之外都非常簡單,只是翻頁計算的事情。此次僅為了熟習 CSS Multi-column Layout Module 翻頁,大家要多支持 Monocle 這套閱讀器,他可還是 MIT License 的 open source!另外,還可以看到 Monocle 網站的最新消息,推出了 BOOKish 網站服務,感覺未來走向跟 ibis reader 差不多吧。


2010年10月22日 星期五

opubWriter - An Online WYSIWYG EPUB Writer

opubWriter
http://www.opubwriter.com/ & http://opubwriter.wordpress.com/


在找 tinyMCE 相關資料時,剛好找到 opubWriter 的服務,他是一款線上編輯 EPUB 的服務,編輯完後可以把書籍下載回來。


目前提供的介面還很陽春,用起來稍稍不方便。例如想要把圖片擺進 EPUB 時,必須先透過 [Library]->[Media] 上傳圖片,上傳完可以看到圖片下面有個 path 描述,如 images/file.jpg,接著換到 Editor 編輯文章時,使用插入圖片,要選擇指定 images/file.jpg 的方式。如果直接填入圖片網址的話,依照 EPUB 的規格,該 link 在遵循 EPUB Spec 的閱讀器上,並不會顯示。


opubWriter02


雖然 opubWriter 操作介面陽春,但大概該有的功能都差不多,的確可以在線上編輯產生一本 EPUB 書籍,依照上述的 To do list,唯一的缺憾大概是 EPUB Validate 並還沒有加入,另外,則是連到國外操作很緩慢。


簡述編輯書籍的流程:



  1. 先到 Library > New 新增一本書,預設只先給 Title 和 Copyright 兩章

  2. 接著 Library > Organisation 裡頭,點選 Content 時,就可以自行新增 XHTML 檔案,並且最後會詢問該檔案的順序位置,只需挑選一個對應的檔案,選擇 After, Before 等選項

  3. 透過 Library > Editor 的區域,挑選你要編輯的檔案(皆為 XHTML),就開始 WYSIWYG 的編輯環境了,編輯完記得要按右上角的 Save

  4. 最後,切換到 Library,就可以選擇下載指定的 EPUB 檔案


Sigil - A WYSIWYG EPUB Writer

坊間大部分產生 EPUB 的方式,都是從 A 格式轉成 B 格式的方式,找了一下有沒有 Open Source 或免費的 EPUB Writer,發現有一套用起來還不會太難用:



Sigil - A WYSIWYG ebook editor
http://code.google.com/p/sigil/


此軟體支援 Windows、Linux 和 Mac。我只在 Windows XP 上安裝測試,初步使用還算正常。


sigil
上圖綠色背景是我自己電腦上的不傷眼的設定,原樣應該是白色背景


使用上有個地方要留意,那就是在編輯文章時,很常把圖片用拖拉的方式擺進去,的確可以顯示,但編輯出來的 EPUB 卻不見得可以看到,最常見的範例是把網頁的圖片拖拉到編輯器,這時候顯示的圖片其實是透過超連結的,但 EPUB Spec 上頭,有規範使用的圖片都是要包在 EPUB 檔案內的,因此,在某些遵守 EPUB 格式的閱讀器上,就會看不到圖片。解法也很簡單,每次要拖拉圖進去,先把圖下載好,在透過上面的 Insert > Image 的方式,把圖加入,此時就會看到右邊的 Images 目錄中有圖片,這樣的方式就是把圖片都包進 EPUB 囉。