[Linux學習日誌] OS中的記憶體快取

posted in: Linux, Server | 2

最近在玩cloudatcost賣的便宜vps主機,發現明明我什麼程式都沒開,結果記憶體卻用到了73%,如下圖: 查了一下,發現下面這篇文章寫的蠻好的: http://blogger.gtwang.org/2013/07/linux-cache-memory-linux.html 原來linux會把沒用到memory拿來當做memdisk來用阿……第一次知道有這種事。 另外發現自己不太懂buffer跟cache的差別,稍微查了一下: http://stackoverflow.com/questions/6345020/linux-memory-buffer-vs-cache 簡單來說: A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.

[網路程式設計] 網路服務認證:OAuth

posted in: Server, 網路程式設計 | 0

何謂OAuth?依照其官網的定義: 『An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications』 當我們要使用網路上提供的服務時,正常的做法的話,會需要使用者的帳號密碼來做登入的動作才能執行((如Facebook上的各種小遊戲及應用程式需要取得你在facebook上的朋友)。可是,我們並不能保證每個網路上的服務都是正常的,如果是釣魚網站的話該怎麼辦?當我們越頻繁的去傳送這組帳密給不同的服務使用時,就代表使用者帳號被惡意使用的風險越高。--而取得帳號密碼的服務,可以為所欲為的進行任何的事,例如改變使用者密碼。如果這組帳密同樣用在如網路銀行等對使用者而言非常重要的網站的話,那麼後果更是不可設想。 我們所需要的,是讓各種不同的third-party的服務有限度的存取他們所需要的資源。 OAuth的導入,便是為了解決這個問題。 不同於Client-Server的架構,client任何資源的請求都是利用他自己的credentials直接跟server存取。在OAuth裡,其導入了resource owner,將client對資源存取的權限抽離出來。--意即client端想對Server進任何資源的存取,都需要先向resource owner請求permission,例如:在facebook中常常會跳出請求授權的畫面,如下: 請求resource owner的permission                     跟resource owner請求額外權限 … Continued

[Boost] ASIO學習筆記:network basic– UDP Server

posted in: ASIO, boost, C/C++程式設計, Server | 0

UDP  Server跟TCP Server不同,它是屬於connectionless的技術,因此不需要acceptor去跟client建立連線的步驟。我們只需要利用socket去bind特定的port後,就可以接收到資料。 一個Sync socket的流程如下,圖片引用自此: 在ASIO中的Server端程式碼: #include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/bind.hpp> #include <iostream> #include <string> #include <boost/thread.hpp> using namespace std; void main(){ boost::system::error_code ec; boost::shared_ptr<boost::asio::io_service> io_service(new boost::asio::io_service); boost::shared_ptr<boost::asio::io_service::strand> strand(new boost::asio::io_service::strand(*io_service)); // boost::shared_ptr< boost::asio::io_service::work > work(new boost::asio::io_service::work( *io_service )); try{ … Continued

[Boost] ASIO學習筆記:network basic– TCP Server

posted in: ASIO, boost, C/C++程式設計, Server | 0

在上一篇[Boost] ASIO學習筆記:network basic – client有展示了該怎麼撰寫一個client去連接一個遠端的Server,而在本篇,將會接著介紹怎麼利用ASIO撰寫一個Server來處理與client端的連接。 首先在Server端開始運行之前,最重要的事便是決定要與哪個port綁定並監聽是否有資料傳送進來。只是,到底什麼是port呢?port是範圍定在0~65535之間的號碼,為Client跟Server之間連接的管道。打個比喻來說:如果ip是電話號碼的話,那麼port便是一個公司(Server)的分機號碼。port所定義的,是Client要打哪個分機號碼才能得公司(Server)所提供的服務。 其中: 0~1023為公認埠(Well Known Ports),通常用於某些特定的系統程序或者是常用的網路協定上。例如80為http、21為ftp、23為telnet…等等。 1024~49151為註冊埠(Registered Ports):理論上要使用該port來提供服務的公司要跟IANA是出申請,但實際上我們也常常拿來做動態或私人用途。 49152~65535為動態和/或私有埠(Dynamic and/or Private Ports):通常是拿來當作臨時或特定客製化的需求時使用。 其實,在撰寫程式的時候,我們可以去監聽任何的port,下圖為TCP Server操作的流程圖(下圖引自wiki,我們可以看到ASIO完全遵照Berkeley sockets API進行封裝): 以下為一個最簡單監聽port 12345的serve程式: #include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/bind.hpp> #include <iostream> #include <string> #include <boost/thread.hpp> using namespace std; void onAcceptEvent(boost::system::error_code ec, … Continued

[Boost] ASIO學習筆記:network basic – client

posted in: ASIO, boost, C/C++程式設計, Server, 遊戲 | 0

對於網路程式設計而言,不外乎是server或者是client程式這二種。 而怎麼讓二台遠端的電腦透過網路溝通的程式設計,稱作socket programming。 現在就讓我們先從最基本的client端連接到遠端server的程式開始: #include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <iostream> #include <string> using namespace std; int main( int argc, char * argv[] ) { boost::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service); boost::asio::ip::tcp::socket sock( *io_service ); boost::asio::ip::tcp::resolver resolver(*io_service); boost::asio::ip::tcp::resolver::query query( “www.yahoo.com.tw”, “80”); boost::asio::ip::tcp::resolver::iterator … Continued

[Server]Apache+PHP+MySQL架設過程記錄

posted in: C/C++程式設計, MySQL, Server | 0

記錄一下比較關鍵的問題 這樣以後裝的時候才不用一直去google~ apache: 在安裝過後如果一直無法成功將啟動的話, 到console模式apache安裝資料夾的bin底下,執行: httpd.exe -w -n “Apache2.2” -k start 這樣就會詳細列出錯誤,會比較好debug 當然,”Apache2.2″要看你安裝的版本而改變 這個階段會打不開的原因,大致上都是因為port衝到, 例如skype預設是用80 port,所以要先將他關掉 在正式測試之前,記得到防火牆把80port打開 PHP: 比較大的問題是在安裝之後,在重啟apache的時候會無法打開,用上面的方法來找原因則會出現apache2_2.dll無法載入的訊息。這時候請開啟apache的httpd.conf,找出php相關設定將其改成以下內容: #BEGIN PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL PHPIniDir “C:\workspace\PHP” LoadModule php5_module “C:\workspace\PHP\php5apache2_2.dll” #END PHP INSTALLER EDITS – REMOVE ONLY … Continued

[C/C++]解決MySQL多國語系(中文、日文)插入時變成亂碼問題

posted in: C/C++程式設計, MySQL, Server | 0

MySQL的亂碼問題果然兇惡…(苦笑) 我試著插入下面的文字的結果居然都是亂碼: string SQL = “insert test(t) values(‘測試中文’)”; 在網路上找教學,幾乎每篇都是說在connect之後insert之前輸入以下指令就行了: mysql_query(conn, “SET NAMES ‘utf8′”); 可是我不管怎麼試都還是失敗 後來試著去找原因,發現語系是有分client跟server二種 雖然我的mysql DB(server)全都是用utf8建好的,可是c++中的string在IDE內的文字,只會認識local作業系統的語系(我用繁體中文,所以是big5) 因此必需要對應好我們文件的語系: mysql_query(conn, “SET NAMES ‘big5′”); 可是以上方法只能解決中文問題 但如果我們需要插入的語句中夾雜著中文及日文及多國字時該怎麼辦呢?用上面的方法只會讓中文正確,但日文還是錯的… 如下面的文字: string SQL = “insert test(t) values(‘測試中文與日本語testかなかな’)”; 我想那是我們的編譯器無法判別哪個字元該拿什麼語系來轉才好,所以才會出現日文字都變成???? 這部份我找了好久還是找不到解決方案 先轉wstring之後再用WideCharToMultiByte也轉成特定語系(利用code page) 也是會發生不知道哪個字元是哪國字的情況… 悲哀的是,MySQL的c api不支援wide string,所以這問題看似是無解了!? 如果有路過的人知道該怎麼解決的話,請告訴我一下吧~我會非常感激的 … Continued