分類彙整:技術
你還在PHP裡面使用srand()嗎?
念資工的人多數都是由C語言起家的,只要計概教到亂數產生的function時,授課老師總是會耳提面令的提醒著要記得使用srand()來產生一個random seed,否則每次跑出來的亂數都會是相同的,相信大家應該都有這段的印象才是。 於是,當我開始寫PHP後,也自然而然的將這個習慣套用進來,總是習慣先使用srand()產生亂數種子後,再用rand()產生亂數,直到前幾天,我亂翻PHP的Manual才在srand()說明頁看到下面這句話: Note: As of PHP 4.2.0, there is no need to seed the random number generator with srand() or mt_srand() as this is now done automatically. 原來PHP 4.2.0以後,使用亂數前已經不用先指定產生亂數種子了,它會自動的幫你產生,所以自己多做無謂的事情已經有一段時間了 Orz~,雖然少這行呼叫對程式效率也不會有任何提升,但是能少打點字還是不賴啦,如果你有看到這篇文章,記得下次在寫PHP時可以直接呼叫rand()喔!
簡單實作PHP圖片驗證
手邊有個服務需要圖片驗證(captcha)的功能,所以翻了一下之前寫的code,順便整理一下跟大家分享。這邊的code是產生出來的圖片是最簡單的樣式,僅是四個亂數產生的字母(有字母可能重複),外加上一些黑點雜訊來增加辨識上難度,為了避免黑點干擾造字母的辨識困難,我剔除掉一些長相相近的字母,希望增加使用者輸入正確的機率,畢竟圖片驗證是要拿來擋機器人而不是拿來刁難真正的人類阿。
MySQL的wildcard character
也許是因為我跟MySQL太不熟,長久以來我都以為MySQL裡面的wildcard character只有 % 跟 * (for host and table name),所以我就被愚弄了 Orz 之前寫的一個的MySQL服務會自動的加上 "帳號_" 的prefix,昨天我在檢查MySQL的時候突然發現有個資料庫是 "帳號-" 的prefix,心中第一個想法就是"糟糕! 遇到高手,第一天就被人玩爛了"。後來看了一下log跟user的設定發現是先用系統建立一個 xxx_test的db,然後在程式端因為打錯字,打成了xxx-test,妙的是系統竟然也接受,即便這個user沒有create的權限!! 後來經過一番survey才發現原來"_"也是個wildcard character,所以一旦建立了xxx_test的資料庫以及其對應的權限,user就可以自由的建立 xxx*test(ex: xxx-test,xxxatest,xxxbtest)。所幸發現的早,一下就搞定這個因為我的無知而造成的bug Orz 結論,所有東西的refernece manual都應該乖乖的看阿 Orz
aria2c – Linux下的多線程下載軟體
很多朋友轉換到Linux下的時候,再下載大型檔案時,往往會遭遇到網路速度緩慢,想要使用在Windows上面像是flashget這類的多線程軟體,來加速下載。這裡推薦一個好用的小軟體 – aria2c,不但能夠多線程下載檔案,也能夠拿來下載bittorrent的檔案(有支援DHT),不過下載bittorrent還是建議使用rtorrent比較威猛剛強一點,這邊介紹在Debian下面如何安裝使用aria2c。 在Debian下面安裝aria2c非常簡單: apt-get install aria2c 多線程下載使用方法如下: aira2c -s16 http://file.to.download/file.zip -s 後面接的數字是線程數目,限制是1~16,應該可以滿足大多數人的需求,如果需要更高的數目,可以透過 -j 來增加。 如果你需要使用aria2c來下載bittorrent檔案,使用方法如下: aria2c –enable-dht –listen-port=某個port –max-upload-limit=單一檔案上傳速度 –max-overall-upload-limit=全局上傳速度 –torrent-file=torrent檔案 上面簡單介紹了最常使用到的兩種功能,其他的細部設定請自行參酌aria2c的man page。
使用flashget 1.8以上的朋友請小心
昨天在使用flashget下載自己在VPS上面的資料後,檢察apache log竟然發現一堆不速之客的連線,都在嘗試我之前抓過的那個檔案(還好我習慣不錯,抓完即砍),後來網路上翻了一下才發現,flashget 1.8之後的版本,會非常"好心"的將你曾經下載過的連結都傳送到 stats.flashget.com 所以當其他user嘗試下載相同檔案時,便會使用連結到你的連結去下載。我目前的鴕鳥是解決法是,編輯c:\windows\system32\drivers\etc\hosts,在最後加上一行: 127.0.0.1 stats.flashget.com 來解決。如果你常使用這類的下載軟體,建議其他套來使用吧,才是永保安康之策。
ip_conntrack: table full, dropping packet
之前架設一台vpn時, 由dmesg看到一個警告訊息 "ip_conntrack: table full, dropping packet" google了一下發現似乎是個還蠻常見的問題,通常是NAT user過多或是同時建立太多tcp connection,導致table爆炸,因為Linux Kernel在NAT預設的tcp timeout是五天,難怪user多就爆炸。所以改法很簡單,就是把table加大,timeout縮短即可,要注意的是table所使用的memory為 ip_conntrack_max * 232 Bytes 所以要小心大小,不要改的太爽,加到超過你記憶體能夠負擔的能力,步驟如下: 首先查看一下table size以及timeout預設是多少: cat /proc/sys/net/ipv4/ip_conntrack_max cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 上面兩行指令能告訴你,目前機器上的table大小及tcp timeout時間 改法有二, 選一個你喜歡的作法即可 :Q 方法一: sysctl -w net.ipv4.ip_conntrack_max=131072 (or 任何妳喜歡且不會爆的值) sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=600 (把這兩行寫到你的開機啟動檔裡面) 方法二: 編輯/etc/sysctl.conf, … 繼續閱讀
BCB Form Create/Close Procedure Flow
如果沒有搞清楚這些動作, 常常在不該cleanup的部份就先cleanup了,害得後面一些還會被callup的method想access的東西都access不到。然後程式就爆走啦 XDD,為了避免自己重蹈覆轍,還是寫一篇來記錄一下。[這是我自己測出來的結果,使用的是BCB 6.0,若有錯誤還請幫忙指正,謝謝 ]
如何merge CIDR
上一篇"高效率的iptables GEOIP模組"的留言有人問到,如何去合併CIDR?用人工計算是一件非常痛苦的事情,資料一多當然就變的天方夜譚,這麼苦命的事情當然是交給電腦去做囉。 要合併CIDR,Perl提供了非常簡單的方法,程式碼如下: #!/usr/bin/perl use Net::CIDR::Lite; my $cidr = Net::CIDR::Lite->new; $cidr->add("202.38.175.0/24"); $cidr->add("202.38.174.0/24"); $cidr->add("202.38.173.0/24"); $cidr->add("202.38.172.0/24"); $cidr->add("202.38.171.0/24"); $cidr->add("202.38.170.0/24"); $cidr->add("202.38.169.0/24"); $cidr->add("202.38.168.0/24"); print "$_\n" for $cidr->list; 執行後,會輸出合併後的結果: 202.38.168.0/21 輕鬆寫意阿~
高效率的iptables GEOIP模組
手邊有台vpn server上面用iptables跑policy routing,連往大陸地區就從特定interface出去,之前的做法是到apnic取得大陸地區最新的ip list後,再利用script一行一行餵進去iptables裡面,即使做過CIDR merge後,還是快要達到800筆record,每每上線使用者一多、或是流量變大時機器的loading就會增加,這種作法不用分析也大概猜得出來,iptables內部作rule match是採用list match,當rule量很大的時候,效能當然會變差。
