2009/08/12

使用 .htaccess 的 URL 偽裝技術

為了安全性或是其他原因,常常看到許多網站的 URL 將實際檔案的路徑隱藏起來,比如說下方的 URL 我們就看不出該網頁是用什麼程式寫的,PHP 或是 ASP?
http://www.blogger.com/post-create.g?blogID=27977601

舉個簡單的例子,如果我們想把網址中的副檔名 php 改成 htm。
開啟 http://localhost/test.htm 實際上是連到 http://localhost/test.php
實作步驟如下:

2009/08/10

Cross-Site Scripting / 跨站腳本攻擊,簡稱XSS


防止網站檔案盜連

原文連結: OECSPACE

付費的網頁空間最怕檔案遭盜連,若主機有流量限制或超過流量必須追加付費等,
就會造成很大的困擾,以下教學方式,不適合一般免費網頁空間使用,
免費空間多不支援設置 .htaccess 檔案。
這個方式可以指定不允許被連結的檔案以及盜連檔案後會轉跳的網址

2009/08/06

到底是 <a href="#" onClick="..."> 還是 <a href="javascript: ...">


亂數產生字串函數 (推薦)

(發表於 2009-07-07 )

這個函數可以很簡單地設定亂數字串要出現的長度及內容

header() 執行之前,還是可以有內容輸出的

(發表於 2009-07-07 )

參考來源: Anistar RIA Blog

一般來說,PHP header() 函數的前面不能有任何的網頁內容輸出,但是有規則就有例外

開啟php.ini 設定檔,並找到 output_buffering 的項目,將註解拿掉(去掉前面的#),在後面輸入 4096或更高的數值,就可以了

Dreamweaver 載入時卡在 Initializing Extension data

(發表於 2009-07-04 )

參考連結 : Martin2k Forums

只要將以下資料夾刪除,重新開啟 Dreamweaver 即可

C:/Documents and Settings / / Application Data / Macromedia/Macromedia Dreamweaver 8 (or similar) / Configuration

MySQL 的匯入匯出, 使用 mysqldump

(發表於 2009-07-03 )

如果可以直接在 console 介面下操作 mysql, 使用 mysqldump 是最好的備份方法

假設我們要備份的資料庫名稱是 db_name , 帳號是 username
直接打入 :

finding eq index of clicked element

(發表於 2009-06-30 )

原文網址 : http://osdir.com/ml/jQuery/2009-02/msg03836.html

配合 jQuery 的 eq( index ) 使用
var eq = $(this).parent().children("a").index(this);

javascript string轉int int轉string


淺談在 JavaScript 中的 URLEncode 動作


2009/08/05

GMail + MySqlDump + PHPMailer 自動備份重要資料庫

(撰寫於 2009-04-30 )

由於公司經營線上遊戲網站,必須對會員的虛擬貨幣餘額進行每日歷史紀錄備份
所以參考以下網站的教學,找到了這個辦法:

[JavaScript] 檢查 function 是否存在


MySQL 欄位相減後產生天文數字

(發表於 2009-04-20 )

playerwinsloses
Tom12
Jerry20

假設有個如上的表格,裡面有兩個欄位 wins, loses,我們想要算出 wins - loses 的結果
並且按照大小排序,我們可以這樣作:

Convert date to timestamp

(發表於 2009-04-10 )

只要用 PHP 的內建函數 strtotime() 就好了

PHP 中的 javascript 換行符號


win32 https server 實作日記


直接參考這篇的內容即可 : 【懶人教學】建構您的 Apache + SSL on Win32

文章中需要調整的地方 :

[AJAX] 等待 jQuery.post() 處理時載入 "處理中..." 訊息


得知 Table 中總筆數最快的方法

(撰寫於 2009-03-17 )

參考網址1

重點:
According to the MySQL documentation this is most efficient if you're using a MyISAM table (which is the most usual type of tables used):

$result = mysql_query("SELECT COUNT(*) FROM table");

參考網址2

重點:
SELECT COUNT(*) FROM test_table;
SELECT COUNT(id) FROM test_table;
SELECT COUNT(1) FROM test_table; => 最快


MySQL 的匯入匯出 (版本 > MySQL 5)

(撰寫於 2009-01-27 )

目的 :
  1. 備份正式主機的 MySQL 資料庫
  2. 在工作用 PC ( Windows 環境) 架設測試用的 MySQL 資料庫
匯入和匯出都是 MySQL 5 以上版本
要匯入的資料庫,編碼環境要設定成和匯出的一樣

匯出 :
  • 主機代管,無法直接使用 mysql console 下指令
  • 使用 phpMyAdmin 匯出為 *.sql
    匯出選項 : SQL 兼容模式 => NONE
匯入 :
  • 在 Windows 環境,使用console 登入 mysql
  • 匯入之前,先執行 mysql > SET NAMES 'UTF8'; (很重要,避免亂碼)
  • 假設下載的 *.sql 檔案放在 C:\database\ myTable.sql
    執行 : mysql > source C:\database\ myTable.sql 就OK了

DreamWeaver 8 無法儲存 FTP 密碼

(撰寫於 2009-01-22 )

簡單說,這是IE升級到 7.0 會出現的問題,雖然IE升級乍看和 DW 無相關,不過問題就是這麼發生
了,所以 IE Sucks !

解決問題的原討論串出處 :
DW8 won't save username/password for FTP


只要把 DreamWeaver 8 升級到 8.0.2 即可
到 Adobe 下載中心去找合適的檔案,注意,語言版本一定要相同,不然裝不起來
http://www.adobe.com/support/dreamweaver/downloads_updaters.html#dw8

如何讓 IE6 IE7 並存

(撰寫於 2009-01-18 )

為了比較網頁顯示在 IE7,IE6 當中的不同,又不想升級舊版IE,所以參考了這篇安裝 IE7 stand alone :

安裝獨立的 IE7 正式中文版


裝好了以後,馬上來測試網頁程式

結果發現 IE7 stand alone 版本有許多 javascript 問題,比如最簡單的 alert() 函數就無法正常運作,IE 安全性也無法正確調整

結論: 安裝正版的 IE7,然後再安裝 Multiple IE 來測試 IE6,是最好的解決方法

AS3 讀取 GET 參數

(撰寫於 2009-01-17 )

URL = http://localhost/?member_num=xxx

AS3 寫法:
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
var member_num = String(paramObj["member_num"]);

PHP中 htmlentities 跟 htmlspecialchars 的區別

(撰寫於 2009-01-13 )

原文出處

很多人都以為htmlentities跟htmlspecialchars的功能是一樣的,都是格式化html代碼的,我以前也曾這麼認為,但是今天我發現並不是這樣的。

日期操作函數 for PHP

(撰寫於 2009-01-12 )

不需要用到 PHP5 的 DateTime class,在 PHP 4 的環境就可以 run
出處:PHP Free.net


<?php
/* ----------------------------------------
Interval can be one of:
yyyy year
q Quarter
m Month
y Day of year
d Day
w Weekday
ww Week of year
h Hour
n Minute
s
Second
---------------------------------------- */
function
DateAdd ($interval, $number, $date) {
$date_time_array = getdate($date); $date_time_array = getdate($date);
$hours = $date_time_array["hours"]; $hours = $date_time_array["hours"];
$minutes = $date_time_array["minutes"]; $minutes = $date_time_array["minutes"];
$seconds = $date_time_array["seconds"]; $seconds = $date_time_array["seconds"];
$month = $date_time_array["mon"]; $month = $date_time_array["mon"];
$day = $date_time_array["mday"]; $day = $date_time_array["mday"];
$year = $date_time_array["year"]; $year = $date_time_array["year"];
switch ($interval) {
case "yyyy": $year += $number; break; case "yyyy": $year += $number; break;
case "q": $month += ($number*3); break; case "q": $month += ($number*3); break;
case "m": $month += $number; break; case "m": $month += $number; break;
case "y": case "y":
case "d": case "d":
case "w": $day += $number; break; case "w": $day += $number; break;
case "ww": $day += ($number*7); break; case "ww": $day += ($number*7); break;
case "h": $hours += $number; break; case "h": $hours += $number; break;
case "n": $minutes += $number; break; case "n": $minutes += $number; break;
case "s": $seconds += $number; break; case "s": $seconds += $number; break;
}
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year);
return $timestamp;
}
?>

php4 和 php5 的一些重要差異

(撰寫於 2009-01-12 )

google 收集來的文章:

在 php v.4.0.6 後的版本如果你沒有包成 class 或者沒有用到 dom 的物件, 基本上不會有很大差別
php v.4.0.6(包含)前的版本沒有支援 super global 的 eniverment 變數, 所以不能用 $_POST, $_GET, $_SERVER 類似的 suber super global variable 取代的是 $HTTP_SERVER_VARS variable 之類的東西(要查一下 phpinfo)
所以請祈禱你的版本比 php v.4.0.6 還新

原文出處:PHP5網管實驗室



一堆英文,有時間再翻譯,這篇寫得很完整

原文出處:www.webmaster-talk.com

學習英文的免費資源

(撰寫於 2009-01-12 )

本來是在看這篇 MySQLi vs MySQL (benchmarks),看到 getting the upper hand 這句片語想弄清楚意思,google 一下就跑出了這頁:

輔大英語系的線上自修資源:開口說英文

魔獸房名

轉載: http://yolin.pixnet.net/blog/post/15440534

打魔獸的時候為了能吸引同在網路上的空虛人士,
往往都會在房名上下各種苦功,
當然也就造就了許多莫名其妙的白癡造句...

-------------------------
有個女孩像張飛
司馬意難忘
郭嘉就是你家
驚奇四曹仁
司馬當活馬醫
曹操不笑曹子笑
關羽毛球什麼事
自魏延長賽
張飛自魏延射
郭嘉門前有張郃
騎白馬岱把刀 走進城門滑一跤
路遙司馬懿,日久見甄姬
服部騎的阿斗
塞翁司馬 閹之非服
郭家就是你家
生糜竹成熟飯
魏你吃蜀條
祝融為快樂之本
張飛蹲完夏侯敦
大橋被馬超
劉備騎馬超甄姬
甘寧老師甄姬掰
馬超被馬操
馬超被曹操
關完大哥關二哥
魏延找司馬懿~~~~~~~~(胃炎找司馬醫)
魏延得胃炎
甄姬會液露
三國3.7d自選富貴手禁中離
小喬流水人家
張飛脫衣陪打
魔法少年賈詡
純情張飛俏甄姬
滿城盡帶玄武甲
老趙雲吞麵
三國高手區到底禁跳蛋
同歸於盡(于禁)
北極熊比你值錢
孤單閃電球
墾丁郭嘉公園
打三國比打美國便宜
服部完的兵役?
玩命光頭-東京典韋
邱毅比甄姬還會爆
天邊一趙雲
郭嘉地理頻道
亞歷山大地
內褲泛黃中
微笑阿速達
三國3.7D玩奶淫北京-AR
關羽你的歌
郭家地理頻道
張郃下西洋
奶大喬一下
劉備騎馬岱把刀
關完大哥關二哥
張飛在龐統甄跡
跳的馬子像張飛
劉備在龐統甄跡
甄姬下麵給你吃..
妳酥了我淫了..
妳比關羽還會跳
魏延先轟動
司馬懿下臭
許褚磨成繡花針
服部完的兵役
超級星落大道
諸葛亮老二
無馬超好看
槍口不要曹仁
鞋子的台語叫-ar
健康美魏延
老張飛上天
典偉不是楊宗緯
郭嘉不是林宥嘉
安柏政會空震
火郭嘉湯150
阿姨國語叫RE
太史慈濟功德會
太史池裡養周瑜
諸葛亮(晾)劉備(被)
乳溝喬事變
18禁于禁
關羽跳進太史池
開燈趙(照)雲
高速公路騎馬超速
我被夏侯冤枉了
馬岱球上籃
記得留備份
阿速達手槍
校園夏侯戰
漩渦曹仁--百草丸
經期似曹仁
老張遼養院
老郭嘉油站
老趙雲游四海
許褚留香?
老甄雞肉飯
老司馬殺雞
老服~部要這樣拉
楊宗尾刀大家撿
蕭敬藤甲剋弓手
子孝中路走九遍
子龍你口祝融你手
諸葛亮(晾)衣服
抓魚-禁水缸
唐伯虎的真跡
北極熊的眼淚
不能搓的咪咪
周瑜子宮緊(周瑜字公謹)
魏延既出司馬難追
姜太公釣周瑜,願者上鉤
大喬稱讚華陀針久
老黃中將湯
華陀養生雞精
甄姬張角給曹操<=4.3
我最怕張寶成<=4.3

-----------------------------
相關連結: 魔獸三國 wiki

MySQL vs MySQLi (效能實測)

(撰寫於 2009-01-12 )

原文出處:http://www.johnjawed.com/benchmarks/
直接翻譯一下結論,大意如下:

結論:
上述測試結果顯示 mysql_query 和 mysqli_query 整體效能上其實勢均力敵。但在插入約10萬筆資料的情況下,使用 mysqli_multi_query 反爾讓執行時間增加約兩倍。你可能會想,既然原來的 MySQL 效率比較好,那我們幹麻要改用 MySQLi。

然而在某些情況下,MySQLi 是會勝出的。記得 MySQLi 查詢語法是 "pre-escaped" 的 (就是說遇到特殊字元,MySQLi 會自己處理),這就是說不需要你自己加上
mysql_real_escape_string ( ) 來特別處理這類變數。

假設我們要 insert 的語法當中有很多這類變數,都需要加上 mysql_real_escape_string ( ) 做額外處理,那麼必定會大量增加執行時間,這時候 MySQLi 就發揮了他的特長。

雖然以上原因可能還不足以讓大家升級目前舊版的 SQL 查詢到 MySQLi,不過基於安全性和效能雙重考量,MySQLi 在未來還是大有可為 (MySQLi 支援 SSH 加密連線)。
----------


個人的感想:沒特別需求還是都用舊版的 MySQL 就好 ~_~

2009/08/04

如何安排 flash 與 div 的上下層次關係

I’m currently working on a site with the wonderful Hong Vo from Namaste Interactive that has an embedded flash video object on the home page. This site also has a horizontal drop-down menu. All was great until one of the drop down lists became long enough to overlap the flash video. Apparently, when embedding a flash video into an html page the embed code automatically puts the flash video on top of everything else. I could not for the life of me get the menu to lay behind the video no matter what I tried.

It was one of those “little problems” that was eating away my entire morning and most of my patience! ;o) In sadness, I discovered several forum discussions in which, apparently, it was agreed that there was simply nothing to be done.

Thankfully, I was stubborn and continued to dig further (I don’t give up easily!) and found this discussion, which contained a simple solution, which I will summarize for you:

  1. Wrap your flash content in a div
  2. Add
  3. to your object tag
  4. Set wmode=”transparent” in the embed tag
  5. Use css to set the position and z-index for your div (don’t set negative z-index values as it will make your flash disappear)


The CSS


#flash {
position: relative; /*or absolute*/
z-index: 0;
}

The XHTML


<div id="flash">
<object … >
<param name="wmode" value="transparent">
<embed … wmode="transparent">
</object>
</div>

AS3 的 getURL() 去哪裡了?

(撰寫於 2009-01-12 )

換成 navigateToURL()

AS3 接收 URL 參數

(撰寫於 2009-01-12 )

很簡單,只有2段關鍵 code

html 部分
<object classid="clsid: xxxx.......
<param name=xxxx....
<embed src="http://mySite/mySwf.swf?a=1&b=2" .......>
</object>

as3 部分
if(root.loaderInfo.parameters.a == '1'){
gotoAndStop(1);
}

RSS 產生器

(撰寫於 2008-07-15 )

因為想利用 PHP 自動產生 RSS feed,先是搜尋到了這篇 :
快快樂樂學PHP5-RSS2.0建置介紹

發現程式碼因為 html 轉換的問題,有的部分呈現不出來,所以再用 google 找到了完整正確的原始碼,也可能是該程式的原始出處 (韓文) :
http://0rz.tw/184pr

***** 中文版的程式碼在這 (Google文件連結) *****

Cannot load C:/php/sapi/php4apache.dll into server

(撰寫於 2007-04-10)

Windows 安裝 PHP 如果遇到這個問題
請按照以下步驟解決
  1. 用 php4apache2.dll 代替 php4apache.dll (如果你是用 Apache2)
  2. copy the php4ts.dll into your /windows/system or winnt/system folder

JavaScript 可以使用中文當作函數,變數名稱


【PHP】正確的裁切 UTF-8 字串

(撰寫於 2007-03-29 )

當首頁的新聞標題太長,僅需要抓取部份字串的時候,會發現使用 substr( ) 常常會讓最後一個字破損。

這時候可以用 mb_substr ( $str, $start , $length , $encoding ) 來代替 substr( )
如果你的網頁編碼是 UTF-8, $encoding 參數就填上 UTF-8,其他語系亦然


舉例來說....

網頁編碼:UTF-8
原始標題:2007寒假心靈成長小學
抓取 :前6個字元
使用 substr(),抓到的會是 "2007寒假�"
而使用 mb_substr,就可以正確的抓到 "2007寒假"

//去除html符號
$Title=strip_tags($Title);
$Title=str_replace(' ','',$Title);
if(mb_strlen($Title,'utf-8')>6)
{
$Title=mb_substr($Title,0,6,'utf-8').'..';
}

【PHP】縮圖處理用 Class 修正版

(撰寫於 2007-03-27 )

這篇發表的縮圖用 Class
發現它耗用記憶體很大.....,為了解決這問題,請出大神找到了不少資料

【問題】PHP 在處理圖片的過程,會耗用多大的記憶體
【解答】一般來說,The PHP memory required is 5 times the number of pixels in the image.
For example:
640x480x5 = 1.5MB
1600x1200x5 = 9.2MB

【問題】如何解決 php 使用記憶體大小限制的問題
【解答】除了直接在 php.ini 當中調整 "memory_limit" 設定,還有幾個方法
  • 安裝 ImageMagick 代替 GD Library,that will bypass the memory limit issue,ImageMagick 除了能夠跳過 php.ini 的設定之外,它的縮圖效能也比 GD 好很多,請看範例。可惜它不是 php 預設的安裝選項。
  • 在 PHP 程式中加上 ini_set("memory_limit", "XXM"); 來"暫時"改變預設的記憶體限制為 XX MB,,如果你沒有權限修改 php.ini 或是安裝 ImageMagick 這個方法最為推薦。

【PHP】縮圖處理用 Class

(撰寫於 2007-03-26 )

重要的功能:
  1. 可以依據原始圖片大小,按照自訂比例縮小,並且以圖片中心為準,裁切適合的大小作為縮圖 (好用!)
  2. 加上浮水印,並且還可以自動調整大小以符合圖片 (還未用過)
下載檔案

大陸的工程師開發的,真強,來源列在底下
不知道哪個才是原作,反正程式都是同一個 :

http://kayalulu.com/space/29/viewspace_1398
http://www.itfly.com/blog/article.asp?id=460
http://www.caibird.com/blog/?p=95
http://www.ccvita.com/index.php/29.html
http://www.stylecn.net/bbs/redirect.php?fid=37&tid=1156&goto=nextoldset

mysql 裡 utf8_general_ci 跟 utf8_unicode_ci 連線校對的差異

(撰寫於 2007-03-20)

轉載自 : http://blog.pixnet.net/origin2/post/1244682
------------------------------------------------------------------------------

有用過 mysql 的 UTF-8 編碼的人可能都會對這件事感到疑惑:

連線校對(collation)裡面的

utf8_general_ci

utf8_unicode_ci

到底有什麼差異呢?
在 phpMyAdmin 裡面的說明看起來通通一樣:

utf8_general_ci 統一碼 (Unicode) (多語言), 大小寫不相符
utf8_unicode_ci 統一碼 (Unicode) (多語言), 大小寫不相符

實際差別如下:

utf8_general_ci 在轉換時速度比較快
utf8_unicode_ci 在轉換時比較精準

轉換?怎麼講呢?
簡單說就是當資料要從一個編碼換成另外一個編碼時,
mysql 要在兩個 codepage 裡面找出來相對應的字元位置在哪裡。
對 utf8_general_ci 來說,來源 codepage 裡面的一個字元只能對應到目標 codepage 裡面的一個字元,
而 utf8_unicode_ci 則可以把來源 codepage 裡的一個字元對應到目標 codepage 裡的多個字元(或反過來)。
例如德文裡的 ß 要轉換成英文的時候如果是用 utf8_unicode_ci 轉換會變成正確的 ss ,
但是如果用 utf8_general_ci 的話則會變成單一的 s 而已。

所以如果可以的話請盡量用 utf8_unicode_ci 而不要用 utf8_general_ci ,
雖然對 multibyte 字元來說這兩個都沒差,
但是 utf8 的網頁誰也不知道哪天會不會有這種字元出現在你的網頁上,
所以如果設成 utf8_unicode_ci 你就不需要擔心貼上去之後資料在轉換間遺失了。

-------------------------
以下是個人實際測試的結果:
如果你使用 phpMyAdmin 並且在新增文字資料的時候內容 "中英文混雜"
當 Collation 是 utf8_xxxxxxx 的時候,都會有文字破損並且出現亂碼
建議 Collation 選擇 latin1_general_ci,個人測試項目如下,都不會出問題
  • 中英文混雜
  • 多國語言,如日文
  • 大五碼惡名昭彰的"許功蓋"

PHP 處理許功蓋問題的 Function

(撰寫於 2006-12-08 )

本函式轉載自 PHP + MySQL 程式設計研習
這個作者的網站是我目前看過,最淺顯易懂,也最實用的

目前這個函式,在 MySQL 各個版本使用上都沒問題
當然,MySQL 4.1 之後和 4.1 之前的版本,在 Big5 Coding 環境的設定上
有所不同,請看此篇

function Fix_Backslash($org_str)
{
// ----------------------------------------
// mysql_client_encoding() 這個 PHP 函數目前是有 bug 的 (PHP version < 5, 2006-12)
// 它總是回傳 latin1,而無法正確得知 mysql 的 character-set
// 雖然無法釐清是 PHP 還是 MySQL 的責任
// 不過在 MySQL 官網的討論區已經有人提出說明了:
//
// http://forums.mysql.com/read.php?103,14397,25128#msg-25128
// http://forums.mysql.com/read.php?52,56632,57821#msg-57821
//
// 所以這裡的函數我略加修正
// ----------------------------------------

// if ( mysql_client_encoding() != "big5" ) return $org_str;

$tmp_length = strlen($org_str);

for ( $tmp_i=0; $tmp_i<$tmp_length; $tmp_i++ )
{
$ascii_str_a = substr($org_str, $tmp_i , 1);
$ascii_str_b = substr($org_str, $tmp_i+1, 1);

$ascii_value_a = ord($ascii_str_a);
$ascii_value_b = ord($ascii_str_b);

if ( $ascii_value_a > 128 )
{
if ( $ascii_value_b == 92 )
{
$org_str = substr($org_str, 0, $tmp_i+2) . substr($org_str,$tmp_i+3);
$tmp_length = strlen($org_str);
}
$tmp_i++;
}
}

$tmp_length = strlen($org_str);
if ( substr($org_str, ($tmp_length-1), 1) == "\\" ) $org_str .= chr(32);

$org_str = str_replace("\\0", "\ 0", $org_str);
return $org_str;
}
// 本函式轉載自 http://chensh.loxa.edu.tw/php/X_1.php
?>

許功蓋問題,在不同的 MySQL 版本之下,如何解決

(撰寫於 2006-12-08 )

經過實地測試,終於找出方法,針對不同的 MySQL 版本
PHP 該如何應對,才不會出現許功蓋的問題...


MySQL 4.0.X 版本以下:

my.ini (windows), my.cnf (Unix) 設定 : default-character-set=latin1
ASCII92 處理 : 不需加上

my.ini (windows), my.cnf (Unix) 設定 : default-character-set=big5
ASCII92 處理 : 加上


MySQL 4.1.X 版本以上:

WIndows 版本 :
  • (MySQL方面) 首次安裝 MySQL Server的時候請把所有和 character-set 有關的部份,都設定成 utf8
  • (PHP方面) mysql_connect() 之後,先加上 mysql_query("SET NAMES 'big5'");
  • (PHP方面) 對於所有需要存取中文的資料,需要加上 ASCII92 的特別處理,有關 ASCII92 處理的函數請看此篇

從4.1這個版本之後,MySQL 加上了多語系支援的功能
MySQL 4.1 對於字元集支援 (Character Set Support) 分為兩個方面:
字元集 (Character set) 和文字校對 (Collation)

魔鬼都在細節裡

(撰寫於 2006-05-29 )
中華網龍繳了一堂二億四千萬的學費

「魔鬼都在細節裡」
「就是要嚴格執行標準作業程序」。現在中華網龍不但程式要按照標準程序完成,也開始要求其他開發工作也要建立標準作業程序。

以下轉載自: 商業週刊 Vol. 884 Mon, 1 Nov, 2004
-------------------------------------------------------
中華網龍繳了一堂二億四千萬的學費

一個由高手開發一年,也通過測試的遊戲大作,為什麼一上市就讓中華網龍慘賠?

「魔鬼都在細節裡」,這句鴻海董事長郭台銘的名言,聽在中華網龍總經理陳奎平的耳中,從來沒有這麼有感覺。

因為,今年中華網龍就是忽略了一個細節,而付出二億四千萬元的慘痛代價,相當於三分之一的資本額。

成立四年的中華網龍,靠著成功自製遊戲,營收從第一年的二百四十九萬成長到第三年的六億六千萬,成長了二百六十五倍,二○○二年甚至創下每股獲利十七‧八五元的紀錄。去年年底上櫃後,更曾在今年初創下每股一百一十四.五元的高價,成為智冠科技的金雞母。

然而,今年,中華網龍營運狀況卻直線下墜。十月十八日,中華網龍宣布調降財測,盈餘目標從三億降至六千萬元,每股盈餘○‧七九元,降幅高達八成,蒸發了二億四千萬;若與去年每股盈餘八‧六五元的成績相較,每股獲利能力衰退九成。陳奎平承認,毛利滑落的主因,還是因為忽略細節,讓一款原本能成為獲利引擎的遊戲根本無法正常營運,才導致高額毛利就此蒸發。

因為今年,中華網龍推出年度大作「東方傳說」,並沒有按照軟體開發的一般流程進行。

為了試用效果更好的新技術,又要趕進度,研發團隊寫程式時,每寫完一部分程式,就直接加進遊戲裡,並沒有按照原訂流程,把程式結構和規格交代清楚。這個沒有人知道全部細節的龐大程式,慢慢的一部分一部分完成,在通過基本測試、封閉測試之後,看來沒問題的產品,一上市卻變成中華網龍的最大夢魘。
「程式安裝後,畫面竟然一片黑」,連職業玩家都覺得安裝困難。於是,即使投入三千萬元大作廣告,今年初「東方傳說」上線之後,最高同時在線人數僅一千多人,遠低於預期的兩萬名以上,甚至比一些已下市的網路遊戲還少。

陳奎平說,這就是忽略細節的後果。因為,一個省掉開發紀錄過程的程式,雖然能通過各種品質測試,但等到正式上線之後,卻因為沒有人知道程式究竟是怎麼設計的,等到要配合玩家需求修改時,一修改就問題百出,最後變得無法可救。

更要命的是,「東方傳說」用新技術開發,過去用來解決緊急狀況的標準作法也派不上用場,只能眼睜睜看著辛苦付諸東流。

年底還要再推出另一款新作「金庸群俠傳二」,這一堂課,教會了中華網龍什麼?

「就是要嚴格執行標準作業程序」,陳奎平說。現在中華網龍不但程式要按照標準程序完成,也開始要求其他開發工作也要建立標準作業程序。未來,大型作品甚至會像韓國,花三年時間仔細研發一款遊戲。

兩億元的學費,如果能夠因此抓出細節裡的魔鬼,誠實面對失敗,將是中華網龍化危機為轉機的關鍵。

putty + FreeBSD 免輸入密碼登入系統,實戰教學

(撰寫於 2006-05-25 )
經過多次的 try error 終於給我找到一個可以用的教學文件

原文出處 : 行政院國家資通安全會報-技術服務中心-資安論壇
這裡只不過是轉載原文

至於 ssh 連線的運作邏輯,可以參考名人鳥哥的網站 SSH連線加密技術簡介
礙於篇幅這裡就不貼內容了



========================================================================
以下為教學原文內容
========================================================================

How to use Authorized Key by ssh for login?
如何使用公鑰/私鑰登入 Linux 系統?
====[Root篇---開始]=====================================================
以下的 config 檔,為 FC4 的 /etc/ssh/sshd_config 的內容
--------------------------------------------------------------------------------------

# $OpenBSD: sshd_config,v 1.70 2004/12/23 23:11:00 djm Exp $

# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.

Port 22
#Protocol 2,1
#Because Portocol 1 is not safe ,so I don't use, and avoid attack.
Protocol 2
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 768

# Logging
#obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
MaxAuthTries 3

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
GSSAPICleanupCredentials yes

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication mechanism.
# Depending on your PAM configuration, this may bypass the setting of
# PasswordAuthentication, PermitEmptyPasswords, and
# "PermitRootLogin without-password". If you just want the PAM account and
# session checks to run without PAM authentication, then enable this but set
# ChallengeResponseAuthentication=no
#UsePAM no
UsePAM yes

#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression yes
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10
#ShowPatchLevel no

# no default banner path
#Banner /some/path

# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server

---------------------------------------------------------------------------------------
以上內容為 FC4 的 /etc/ssh/sshd_config 的內容,但僅供參考,我不敢保證完全對,
所以照抄不一定 OK,所以請依您系統的實際狀況及週遭的情況去調整。
=======================================================
0.事前準備:
Puttygen.exe → http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe
Putty.exe → http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe
Pietty.exe(建議使用,有支援中文輸入,SCP 檔案上傳.)
http://ntu.csie.org/~piaip/pietty/stable/pietty0327.exe
WinSCP3 → http://winscp.net/eng/
==============================================
1.修改 /etc/ssh/sshd_config
#在 sshd_config 裡,找到與下列相符的選項,就將選項前的 # 號拿掉:
Protocol 2
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin yes
#找到 ChallengeResponseAuthentication yes 的選項,改成 no ,如下:
#(選項解釋:密碼登入選項,一定要改成 no,這樣子沒有擁有私鑰的人就會無法登入了)
# Change to no to disable s/key passwords
#修改成 no 來停用 s/key 密碼
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no
#以下為非必要選項
SyslogFacility AUTHPRIV(或 SyslogFacility AUTH)
LogLevel INFO

接下來就存檔離開
重新啟動 sshd 服務.
#service sshd restart

2.在 Server 端,使用 ssh-keygen 來建立 DSA Private Key 和 Public Key.
先檢查 /root 下有沒有 .ssh 的資料夾,如果有就略過建立資料夾的步驟,
在 /root 下建立資料夾 .ssh,
#mkdir .ssh
#cd .ssh
#ssh-keygen -b 2048 -t dsa
然後,輸入 Private Key(私鑰)檔名:id_dsa,和 Public Key(公鑰)檔名:id_dsa.pub
這個時候會問你 key passphrase,
(可以自由選擇輸入與否,即使現在不輸入也沒關係,
後面再用 puttygen.exe 轉換格式時再輸入,也是可以的,
但是不可為了省卻輸入密碼,而只用 KEY 就登入 LINUX 系統,
此舉很危險,萬一 Key 檔案被有心人士偷取,就糟糕了.>"<)
再來把公鑰的內容導入到 authorized_keys
#cat id_dsa.pub > authorized_keys

3.因為 Openssh 的私鑰格式和 putty 使用的格式截然不同,
所以需要由 puttygen.exe 轉換格式後才能使用,不然可能會有兩種錯誤的情況:
--------------------------------------------------------------
可能出現的幾種問題:
(a)、Server refused our key
公鑰和私鑰不匹配,或者沒有 authorized_keys 文件
(b)、Unable to use key file "id_dsa.ppk" (SSH2 private key)
私鑰檔案的格式不正確
--------------------------------------------------------------
3.1把 server 上的私鑰:id_dsa 拷貝到 PC 上
將 id_dsa 的內容顯示在螢幕上,再複製下來.
#cat id_dsa
把複製的內容貼到記事本裡存成 id_dsa_by_ssh-keygen.ppk
再來就是開啟用 puttygen.exe → Conversions → Import Key
匯入後,在 Key passphrase 和 Confirm passphrase 輸入保護私鑰的密碼後,
(不想打密碼的人,就保留成空白也可以,不過萬一私鑰掉了被撿到,那就慘了>"<),
然後,再從 File → Save Private Key 把私鑰另存新檔即可使用了。

4.Pietty/Putty 使用方法:
啟動 Pietty/Putty ,從 SSH → Auth 去指定私鑰的檔案路徑即可。

5.強烈建議:私鑰(Private Key)一定要用 Key Passphrase 來保護,
密碼(至少 8 位數以上,每三個月更換一次公/私鑰)千萬不要跟 root 的密碼一樣.
另外,當你在 Server 上用 ssh-keygen 公/私鑰時,會詢問公/私鑰的檔名和
保護 KEY 用的 Passphrase 的密碼,在 Server 有輸入的話,在用 puttygen.exe
做轉換時也會叫你輸入,所以要小心輸入喔!
====[Root篇---結束]=====================================================
有些人也想說,我也想替我的使用者也提供類似的服務,不要再用密碼登入系統,想要用 Key 來登入,但是,
因為目前密碼的服務,可能已經關閉了,怎麼辦?
====[User篇---開始]=====================================================
0.修改 sshd 的組態檔
/etc/ssh/sshd_config 要修改一行的內容
找到 AuthorizedKeysFile .ssh/authorized_keys
改成 AuthorizedKeysFile %h/.ssh/authorized_keys
存檔離開,並重新啟動 sshd 服務
#service sshd restart


1.建立 splin 這個使用者帳號,並修改密碼.
#useradd splin
#passwd splin
#cd /home/splin/
#mkdir .ssh
#cd .ssh
#ssh-keygen -b 2048 -t dsa
以下為 ssh-keygen 執行所會發問的問題:
Generating public/private dsa key pair.

當你用 root 登入時,執行 ssh-keygen 會出現下列顯示的路徑
Enter file in which to save the key (/root/.ssh/id_dsa):
當你用 splin 登入時,執行 ssh-keygen 會出現下列顯示的路徑
Enter file in which to save the key (/home/splin/.ssh/id_dsa):
所以以上不管出現何種,如果出現的是預設的路徑(/home/splin/.ssh/id_dsa)就按 Enter 跳過,
則不用輸入→ /home/splin/.ssh/id_dsa (要含路徑和檔名),以上跟你用那個 ID 登入系統有關係。

Enter passphrase (empty for no passphrase):
輸入要保護私鑰的密碼,這裡跟系統的密碼不用一樣,而且密碼千萬是不要一樣。

再來接下來和 Root 篇的公鑰內容導入至 authorized_keys
#cat id_dsa.pub > authorized_keys
但是要確認在 /home/[users]/.ssh/ 路徑和檔名有沒有錯誤。
[users]→表示為 user 的帳號名稱。


2把 server 上的私鑰:id_dsa 拷貝到 PC 上
將 id_dsa 的內容顯示在螢幕上,再複製下來.
#cat id_dsa
把複製的內容貼到記事本裡存成 id_dsa_by_ssh-keygen.ppk
(檔名命名方法沒有一定,但是為不讓自己搞不清楚,這樣子做最好)
再來就是開啟用 puttygen.exe → Conversions → Import Key
(匯入時,因為我們在用 ssh-keygen 產生公/私鑰時,就有用密碼了,所以在你使用 puttygen.exe,
做匯入的動作時,自然會要求你輸入密碼了)
匯入後,在 Key passphrase 和 Confirm passphrase 輸入保護私鑰的密碼後,
(不想打密碼的人,就保留成空白也可以,不過萬一私鑰掉了被撿到,那就慘了>"<),
然後,再從 File → Save Private Key 把私鑰另存新檔即可使用了。

3.強烈建議:私鑰(Private Key)一定要用 Key Passphrase 來保護,
密碼(至少 8 位數以上,每三個月更換一次公/私鑰)千萬不要跟 root 的密碼一樣.

4.因為我是用 root 來替 splin 這個 user 建立公/私鑰,
所以我要把檔案權限和屬性稍微修改一下。
#chown -R splin.splin /home/splin/.ssh/
#chmod -R 755 /home/splin/.ssh/

5.Pietty/Putty 使用方法:
啟動 Pietty/Putty ,從 SSH → Auth 去指定私鑰的檔案路徑即可。

====[User篇---結束]=====================================================

PS.
1.以上有任何看不懂的,歡迎在此發問,或來信詢問皆可。
2.在您用 putty 測試私鑰是否可以使用之前,請先不要把原先的連線直接關閉,
請先測試用私鑰可以登入後,再把停用密碼登入的選項設定由 yes 改成 no.

***** Contact Email: *****
***** 本文由 splin 撰寫,歡迎轉載,但請保留本行文字*****

[教學原文結束]

========================================================================
總結
========================================================================

所有的過程可以簡述如下:

  1. 用 Unix server 產生 public / private keys
  2. 將 public key 放到該帳號的家目錄底下
  3. 複製 private key 內容,貼到 Windows 個人工作 PC 當中保存。
    為了符合 putty 的私鑰格式,還要用 puttygen.exe 轉檔
  4. 修改 sshd_config 改成不用輸入密碼,並重新啟動 sshd
  5. putty 登入方式改成使用 private key

/etc/rc.d/sshd 不靈光?

(撰寫於 2006-05-18 )
今天一直想 try 不使用密碼的 ssh login 方法,也就是使用 public / private key 結果每次修改完 /etc/ssh/sshd_config 執行 /etc/rc.d/sshd restart 總是沒有讀取到新的設定

執行 /etc/rc.d/sshd stop 也無法停止 sshd

所以我直接用 kill 砍掉目前正在執行的 sshd process
再試著用 /etc/rc.d/sshd start 啟動,結果發現 sshd 並沒有啟動

用 "/etc/rc.d/sshd" 關鍵字去 酷!學園 搜尋答案
發現原來要在 /etc/rc.conf 中要加入一行 sshd_enable="yes" 才能使用 /etc/rc.d/sshd
去開啟 /etc/rc.conf 沒有看到這一行..... 加入了之後果然可以用了

FreeBSD 沒有幫 user 先設定好啟動 ssh 的環境
對於一開始只有接觸過 RedHat Linux 7.X 以上的人來說,果然是很不習慣

FreeBSD安裝日誌

(原文撰寫於 2005-05-12)
因為工作上需要,所以不得不自行摸索 FreeBSD,大部分的基本教學可以在這裡找得到twbsd.org (台灣中文站)
以下內容就是紀錄安裝過程中遇到的問題,以及解決的方法


按照 twbsd.org 的指示,從 交大資工下載了FreeBSD 6.0 Release 共兩張 CD 的內容
(我以為 FreeBSD 應該是小巧精緻的,怎麼需要兩張CD? 算了先抓下來,以後再說)
硬碟的分割規劃沒什麼問題,除了有一些小調整

硬碟共有80GB,詳細規劃如下

目錄 大小 說明
/ 1GB
/home 2GB 因為架設這個 server 不是當作個人網站用的,所以 /home 我只給了 2G
/swap 512MB
/tmp 1GB
/usr 15GB 所有的網頁程式還有安裝的軟體,都放在 /usr/local 底下
/var 10GB 資料庫會放在這裡
/var/log 剩下的空間 記錄檔會很龐大,所以剩下的空間都給它

因為一開始安裝忘了設定網路,所以在裝完了登入以後,打sysinstall進去設定。
sysinstall -> Configure -> Networking,其餘的在 twbsd.org 都寫得很詳細,請看 這裡

SSH 一開始 FreeBSD 並沒有幫你啟動,說的更明白點,它根本沒有幫你裝完整。
執行 /usr/sbin/sshd 的時候,會告訴你有錯誤。

Could not load host key: /etc/ssh/ssh_host_dsa_key
Disabling protocol version 2. Could not load host key

如果是安裝 RedHat Linux 會幫你把這些都做好,可是FreeBSD不會,所以我只好自行搜尋答案。
從 Google 搜尋到的答案如下: (原文網址)

建立金鑰的3個步驟 :
# usr/bin/ssh-keygen -t rsa1 -N '' -f /etc/ssh/ssh_host_key
# usr/bin/ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key
# usr/bin/ssh-keygen -t dsa -N '' -f /etc/ssh/ssh_host_dsa_key
然後執行sshd 即可 (或於rc.conf 加入 sshd_enable="YES" 後reboot)

ssh-keygen 的參數,-t 就是 type,-f 就是 file,這兩個沒什麼好說的。
至於那個 -N,使用 man ssh-keygen 查詢的結果是 new passphrase 的意思。
passphrase 一開始我用Yahoo字典去查,結果是啥都沒有....
不得已又請出大神,從www.cdt.org找到了以下的解釋

Passphrase - similar to a password but can be made up of any number of characters. A passphrase is generally thought to be stronger than a password, although not many programs support the use of a passphrase.

Web 技術中的 Session 是什麼?

轉載原文:  Web 技術中的 Session 是什麼? 本文目標 在 Web 的世界裡,Session 已經是被廣泛使用的一種技術,大多數的 Web 開發者,肯定都能運用自如。在現今的各類 Web 應用程式的開發框架和工具中,Session 也已經被包裝成容易使用的模...