發表文章

目前顯示的是 九月, 2013的文章

如何 console stop !

太久沒在windows下用GNU的compiler build code,都忘記compiler完後console畫面閃一下就會自己關掉,變成看不到console是顯示什麼東西。

其實要要讓他暫停很簡單,如果用的是M$的IDE可以在return 0 ;之前加上 system("pause");就會停止,如果使用是一般GNU的可以#include在最後面的return 0;之前加個system ("pause");這樣程式就會暫停住了。

當然你也可以直接開出command line去執行.exe檔,當然要懂一些dos指令了。

使用Sublime Text 來作為C/C++的IDE Linux/Win/Mac ~移除套件

圖片
這篇是教大家如何移除套件!因為當我們會安裝套件之後可能會裝了一些不如自己意的套
,此時想要移除它的時候要該如何做呢?其實很簡單,只要打開ST然後按下熱鍵 Ctrl + 
Shift + p 也就是呼叫 Package Control 接著輸入 remove 就會看到 Remove Package的指令,接著按下Enter 就會出現 你目前安裝的所有套件,選擇你要移除的套件按下Enter就會被移除掉了。

這個移除動作不管是在windows、Linux、MacOS動作都是一樣的,安裝Package Control也是三個平台都是相同的動作與指令



列出你目前安裝的套件。

~待續.

使用Sublime Text 來作為C/C++的IDE in Windows(3) ~CTags

圖片
CTags 是一個撰寫程式碼常用的套件,它會先收尋整個資料夾裡的名稱定義方便我們用來Trace code使用或是找出某個變數、function的定義,因此早期在Linux下使用Vi 或 Vim 很常用的套件之一。接著我們用ST的Package Control來安裝這套軟體。

首先開啟ST後 按下熱鍵 Ctrl + Shift + p 呼叫出Package Control ,接著輸入PCI ( 其實就是 Package controal : Install Package) 等待它連接到套件網站後接著輸入 ctags 並按Enter來安裝它。



安裝完後我們可以從ST的上方功能下拉選單看看有沒有真的安裝成功。 Preferences => Package Settings 這邊會顯示你所安裝的套件,如果有安裝成功CTags應該就能看到CTags的這個名字,並且可以看到它預設的設定( Settings-Default )熱鍵的設定( Key Bindings-Default )

ST的強項之一就是每個套件可以針對不同的使用者做設定,所以我們會看到CTags的套件光是設定就有分Default 跟User 每個套件都有這樣的機制,在這邊小弟認定每個PC都只有你一個人在使用所以只會針對Default 做修改!

接著我們點選Settings - Default 來修改CTags的設定。

如果你的PC硬體夠力的話可以將 "autocomplete" : false, 設定成 true,讓CTags在你輸入一些Keywords的時候自動補完程式的格式。EX : 當我們使用 for loop的時候只要輸入 for =>看到CTags會有for的候選字,接著按Enter就會自動幫你把for loop的格式打好。

接著自動幫你把格式建立好!

接著教大家使用CTags一些簡單功能。CTags 它前序中提到~它會掃描資料夾內的程式碼,把一些變數或是function 、物件之類的宣告建立一個資料庫索引檔,並透過這個資料檔來Trace code或是跳到你想知道某個變數Define的地方,所以在使用前必須先讓CTags建立資料庫檔,使用方法可以從Preference => Package Settings => CTags => Key Bindi…

使用Sublime Text 來作為C/C++的IDE in Windows(2) ~G++ Compiler

圖片
這次來教大家如何安裝用來編譯C/C++ 的Compiler,由於ST只是單純的Editor工具並未具備Compiler可以用來編譯C/C++,所以這邊教大家如何安裝Compiler來配合ST;當然你可以安裝Code::Block因為他本身有內建GCC/G++這套GNU的Compiler。在這邊小弟會使用MinGW來安裝GCC/G++

首先我們先到MinGW下載安裝程式 ~MinGW首頁~  可以點選左下方的 Downloads =>中間的Installer => mingw-get-setup.exe  下載下來。






接下來就能安裝MinGW了,由於MinGW是透過網路安裝所以此檔案只是個安裝檔會透過網路下載你所勾選的軟體做安裝。建議將MinGW安裝在C:\下比較方便設定並且勾選G++Compiler,小弟是把Basic的部份乾脆全部都安裝,反正現在HarDisk都很大。


點選左邊Basic Setup 後將右邊的每一個框框點選滑鼠右鍵 選擇 Mark for Installation.




全選。


接著就是等他Download 下載安裝完畢嚕。
安裝玩後我們開啟ST,在這邊我們是透過MinGW的G++來當作我們的Compiler,這其中必須讓ST對G++下指令,但是因為ST根本不會知道我們把MinGW安裝在哪邊,因此要去Windows的系統加入PATH讓ST呼叫G++的時候Windows會自動幫他代入。所以這邊我們要把MinGW的路徑寫到Windows系統內:
控制台 => 系統 => 進階系統設定 => 環境變數 => 系統變數 ---> Path --->編輯




編輯系統變數 視窗內的  變數值(V):的輸入框最後面加上     ; C:\MinGW\bin    別忘記前方有個分號(;) 區別前方的程式路徑。

接著我們測試是否Path是否設定正確:
打開widnows的命令模式 輸入 g++ -v  來看看是否有出現版本訊息。

這樣表示我們路徑有正確被Windows識別,接著我們要跟ST講要使用G++ Compiler時要下什麼參數來使用它。


開啟ST後 點選上方功能選單的Tools => Build System我們會看到預設為 Automatic!此時我們選擇下方的『New Build Sys…

使用Sublime Text 來作為C/C++的IDE in Windows(1) Package Control

圖片
這陣子想要試著用Sublime Text 來作為我寫C/C++的工具(其實它本身用來做網頁撰寫用的),由於之前是用Code::Block 整合式IDE來撰寫;其實CB很不錯但就是介面太醜,而我又是外貿協會,所以決定跳到非IDE的開放式Sublime Text 2透過安裝 Plugs來達到IDE的使用需求。

下載:Sublime Text 首頁以下簡稱ST
ST 他是一套收費的軟體,但是作者很佛心可以讓大家無限試用,加上開放式的環境所以
許多程式設計師幫他寫了許多套件,而且在Linux、Windows、MacOS這三大平台上都能使用,所以口袋有$$的朋友們也希望各位多多贊助作者吧。

首先:
我們可以透過Package Control 這個套件直接使用ST連接網路安裝你需要的套件!
所以要先教大家怎麼安裝Package Control 這個套件。



在各位下載ST安裝後請執行ST,將會看到一個黑底的視窗。接著請到Package Control的網頁點選右上角 Install Now ,接著會在左方中間看見一個SUBLIME TEXT 3SUBLIME TEXT2的字框,點選你目前使用的ST版本接著將下方灰色底框框內的文字複製(import 開頭)。
接著回到ST並且按下Ctrl + ` ( ` 為Tab上方那顆鍵 ),會看到ST下方出現一條指令框,接著將剛剛複製的文字貼上去後按Enter
等到ST最下方文字訊息顯示安裝完成就接著將ST重開,重新開啟後透過ST最上方的Preference 下拉選單看看是否有沒有多兩個功能選單的名字為『Package Setting』跟『Package Control』,如果有的話代表你已經安裝成功。



接著我們以後會透過熱鍵Ctrl + Shift + P 並輸入PCI連接到Package Control的網站來安裝套件,所以請先裝好這個套件。~待續..

PHP 隨機字串與SHA1加密生成CAPTCHA的小bug

在前陣子撰寫PHP隨機產生6個字的string用GD來生出有雜訊的圖片,

作為防止spam bot 的機制;類似一張圖片上面會有6個隨機的字母與

雜訊,讓正常的使用者可以透過人眼與大腦分辨是哪6個字母。在這

過程有個很有趣的小bug,不知道是因為我的nas問題還是怎樣(我試過

我自己的Synology跟某人的QNAP都有同樣的問題....)會有加密前後string

被修改的情況。

先來看一下程式碼:
------------------------------------------------------------------------------
$pass_phrase = '';
for($i = 0 ; $i < 6 ; $i++)
{
$pass_phrase .= chr( rand( 97, 122 ) );
}

這邊為隨機產生6個ASCII 小寫的a-z 的字母並組成一個字串,通常
在生成之後會做個簡單加密:如下

-------------------------------------------------------------------------------
$_SESSION['pass_phrase'] = sha1($pass_phrase);

這邊我們透過SHA1加密將生成的字串加密並將結果透過Session傳遞,

接著在$pass_phrase 這個『原始』字串丟給GD去畫在記憶體的圖片內
EX:
------------------------------------------------------------------------------
imagettftext($img, 18,0 , 5,CAPTCHA_HEIGHT-5, $text_color,$font,$pass_phrase);

接著看你是要用header去傳圖片並透過 imagepng 等之類似的函式去生成圖片
的二進位檔案。

但是此時會發現圖片上面的字碼卻跟原始的6個字碼不同,反而變成一串很

長的亂碼,後來發現這串亂碼就是SHA1加密過後的亂碼!詭異的事你用echo 

去列印$pass_phrase 就沒有這個問題,但是丟到GD函式去生成就是一直抓到

加密後的亂碼!這真的不知道是哪邊的問題~同樣的名稱 echo 是抓…

有關Session Life Time 的一些問題心得

因為發現session 理當在關閉瀏覽器之後會自動closed,但是事實上卻不是!

由於server並不會知道使用者有沒有關閉瀏覽器,所以必須等到系統時間到,server去garbage

閒置的session( 時間可以在php.ini 內的 session.gc_maxlifetime去調整),但是server通常很忙就

算去garbage 能夠正確抓到閒置的session的機率大概也只有1%當然或許你可以透過調整

php.ini裡面的session.gc_probabity 與 session.gc_divisor的參數,但是一旦調高連帶server效能也會

下降很多,所以我們可以自己寫一隻程式放在每個要確保使用者登入的頁面裡做檢查session

過期自動清除與登出的動作。
----------------------------------------------------------------------------------------------
if ( isset($_SESSION[ ' time ' ]) && (time( )-$_SESSION[ ' time ' ] > 1800))
{
//last request was more than 30 minutes age
session_unset( );
session_destroy( );
}
$_SESSION[ ' time ' ] = time( );

------------------------------------------------------------------------------------------------
我們可以在login之後紀錄當時的時間,跳到每個頁面的時候就做檢查當下的時間

距離上一次更動到session 的時間超過30分鐘,就自動清空session與殺掉等於就是

使用者若閒置超過30分鐘就會自動登出,或是在沒有登出的時候關閉瀏覽器也會在

30分鐘後無法重新使用這個session來跳過登入過程。

資料參考:
http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30…

有關session id 存在cookies下刪除方式小撇步。

在logout的時候由於採用session的name存在client端的cookies內,理論上當我們logout的時候

使用setcookie( session_name( ) , ' ' , time( )-3600 ) ; 來移除存在client端 session cookies,有時候

卻不會清掉sessionID的cookies讓使用者重新開啟網頁的時候用不同的session ID

此時我們可以採用 setcookie( setcookie( session_name( ) , ' ' , time( )-3600 ) ,'/' );

指定存sessionID 的cookie位置來做確保每次登出在重新使用session的時候都是

不同的session ID至於session cookie存放的位置可以透過 php.ini內的 "session.cookie_path = xx" 看

到,或是使用print_r(session_get_cookie_params()); 來觀看 [path] => xx