﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/"><channel><title><![CDATA[俱乐部 - 码库]]></title><link>http://club.muchool.com/</link><description><![CDATA[码库俱乐部是一个专门为开源软件爱好者提供的交流平台，如果你正在研究某个开源项目，不妨加入我们的俱乐部和正在学习使用此项目的人共同探讨。]]></description><language>zh-CN</language><pubDate>Wed, 19 Nov 2008 00:00:00 GMT</pubDate><lastBuildDate>Wed, 19 Nov 2008 00:00:00 GMT</lastBuildDate><docs>http://blogs.law.harvard.edu/tech/rss</docs><generator>x3blog generator</generator><ttl>120</ttl><image><title><![CDATA[俱乐部 - 码库 - muchool.com]]></title><url>http://club.muchool.com/img/logo.jpg</url><link>http://club.muchool.com/</link></image><item><title><![CDATA[是IM吗？]]></title><link>http://club.muchool.com/AIM Sniff/topic_68.htm</link><description><![CDATA[不是到是不是IM？顶一下，。]]></description><author>维</author><slash:comments>0</slash:comments><pubDate>Tue, 18 Nov 2008 13:34:00 GMT</pubDate><dcterms:modified>Tue, 18 Nov 2008 13:34:00 GMT</dcterms:modified></item><item><title><![CDATA[提供SIP Trunk使用，上海电信平台，企业办公打入打出必备]]></title><link>http://club.muchool.com/trixbox CE/topic_67.htm</link><description><![CDATA[CTS提供上海电信自营VOIP话务平台服务（平台对接、落地），标准SIP协议，无需加密，提供021 8位大号号码，可打入打出，拨打全国任意地区电话一律0.09元/分钟，可与asterisk、trixbox等任何pbx系统配置SIP trunk
细节参考：http://www.cts.sh.cn/zhcn/proposal_ippbxsiptrunk.htm
QQ:496646377  TEL:021-33190998，32194228，MP:13916610254
By CTS喜友科技
]]></description><author>小猪</author><slash:comments>0</slash:comments><pubDate>Wed, 12 Nov 2008 09:34:00 GMT</pubDate><dcterms:modified>Wed, 12 Nov 2008 09:34:00 GMT</dcterms:modified></item><item><title><![CDATA[HiShop网店系统]]></title><link>http://club.muchool.com/HiShop网店系统/topic_66.htm</link><description><![CDATA[晕，这个好像不是源代码吧，是发布到服务器的页面]]></description><author>迷茫的鱼儿</author><slash:comments>1</slash:comments><pubDate>Fri, 19 Sep 2008 11:01:00 GMT</pubDate><dcterms:modified>Sun, 21 Sep 2008 12:14:00 GMT</dcterms:modified></item><item><title><![CDATA[不知道可以怎么用，识别PDF可以不？]]></title><link>http://club.muchool.com/Tesseract/topic_65.htm</link><description><![CDATA[不知道可以怎么用，识别PDF可以不？
用过的大哥麻烦回答一下，用这个可以进行PDF识别不，怎么用呢？]]></description><author>漂流一千万公尺</author><slash:comments>0</slash:comments><pubDate>Fri, 12 Sep 2008 00:01:00 GMT</pubDate><dcterms:modified>Fri, 12 Sep 2008 00:01:00 GMT</dcterms:modified></item><item><title><![CDATA[晕，这么冷！哪个高手介绍一下具体情况三！]]></title><link>http://club.muchool.com/Tesseract/topic_64.htm</link><description><![CDATA[晕，这么冷！哪个高手介绍一下具体情况三！]]></description><author>漂流一千万公尺</author><slash:comments>0</slash:comments><pubDate>Thu, 11 Sep 2008 23:59:00 GMT</pubDate><dcterms:modified>Thu, 11 Sep 2008 23:59:00 GMT</dcterms:modified></item><item><title><![CDATA[Tesseract]]></title><link>http://club.muchool.com/Tesseract/topic_63.htm</link><description><![CDATA[Google 最近发布了一个叫做Tesseract的开源光学文字识别程序。这个程序原本在1985年到1995年之间在惠普实验室进行开发，曾被称作现存的最精确的光学文字识别程序。在这个程序尘封多年以后，Google 清理了其中一些陈旧的代码，并将其作为开源软件发布。用户可以从Sourceforge下载这个程序。]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Thu, 11 Sep 2008 23:54:00 GMT</pubDate><dcterms:modified>Thu, 11 Sep 2008 23:54:00 GMT</dcterms:modified></item><item><title><![CDATA[asdfds]]></title><link>http://club.muchool.com/Axis2C/topic_62.htm</link><description><![CDATA[sadfdsafdsafdsa]]></description><author>sadf</author><slash:comments>0</slash:comments><pubDate>Mon, 08 Sep 2008 23:43:00 GMT</pubDate><dcterms:modified>Mon, 08 Sep 2008 23:43:00 GMT</dcterms:modified></item><item><title><![CDATA[怎么下载啊]]></title><link>http://club.muchool.com/起点9 V2.0小说整站系统源码/topic_61.htm</link><description><![CDATA[刚上路，呵，，]]></description><author>仌..在路上..仌</author><slash:comments>1</slash:comments><pubDate>Sun, 07 Sep 2008 23:46:00 GMT</pubDate><dcterms:modified>Tue, 09 Sep 2008 11:16:00 GMT</dcterms:modified></item><item><title><![CDATA[Scintilla使用指南]]></title><link>http://club.muchool.com/Scintilla/topic_60.htm</link><description><![CDATA[Scintilla是一个免费的源代码编辑控件，它完全开放源代码，并且提供一个license允许用户自由地将它用在开源软件或是商业软件中。


我是在做毕业课题的时候发现的这个编辑控件，使用后发现它实在是强大和稳定，作为源代码编辑控件，我们能在普通的的文本编辑控件中能看到的功能，Scintilla都完全能够实现，而且，它还能够提供很多编辑和调试源代码时有用的特殊功能。包括语法高亮显示，错误指示，代码自动完成以及代码提示等。而且在左边的空白处(margin)，可以显示调试代码中非常有用的显示断点以及显示当前运行行等功能。而且，自定义风格的功能比其他大部分编辑器控件都开放，它允许用户自定义不同类型下的字体，是否粗体，是否斜体，前景色和背景色，支持大量的字体。举个例子，在设置C/C++编辑模式后，你可以定义注释语句类型的颜色，字体，大小等等，同样，可以自定义关键字类型的颜色，字体，大小……诸如此类，这样给用户极大的配置的自由。


据Scintilla的网站上发布的消息，Scitilla将在以后的开发中，更加灵活，健壮，更好地表现在.Net和java虚拟机中运行，就这一点，可以看出Scitilla项目就是一个非常有活力的项目，其开发团队对它非常有激情，这也使我们——这些用户从中受益。


据作者介绍，开发Scintilla的动机是来自他对Richedit的失望，在Richedit中,样式的改变被看作是文档的一种改变，从而会被记录到undo的堆栈中，并且设置的文档对象的修改标记。这对源代码编辑是非常不合适的，改变关键字类型的颜色或是运算符的颜色，这不应该看作是文档的修改，也不应该能够通过undo/redo来返回/前进。我对此深有感触，如果是Richedit来做源代码编辑的控件，那将有太多的东西需要自己编写代码实现了，选择Scintilla,将是一个明智的选择，省时，省力，安全，可靠。


Scintilla目前提供了Win32版本和Linux版本。在Linux中使用的是GTK+，已经在 Windows95，nt4.0, Windows2000, windows XP以及RedHat Linux8和9中的GTK+1.2和2.0中测试运行正常。这是一个跨平台的控件，也是我对其非常欣赏的原因之一。下面我的主要论述的还是在 windows + VC下如何使用这个控件，但是其他平台/编译工具下也大同小异，触类旁通吧。

简介：

Scintilla的windows版本就是一个窗体控件。它的主要编程接口是通过窗体消息来传送的。你要实现什么功能，向控件发送一个消息就可以了，当需要从控件得到什么信息，接受WM_NOTIFY消息即可，可以从它带的参数中获得大量当前控件的信息，比如是否已经修改文字了，是否正在点击左边的边框等等。但是，实际上在MFC编程中，通过消息的方式来控制控件还是非常麻烦的，因为这些消息的大部分都是自定义消息，不便于记忆。所以一般的做法就是将这些消息的调用封装成一个窗体类，这样调用方便多了。除了能实现一般编辑控件能实现的功能外，scintilla还能实现语法高亮，代码折叠，书签，自动完成，语句提示等等功能。你完全可以不用学习标准编辑控件CEDIT或者是 RichEdit，scintilla提供了协调一致的API口，这些都是它的优点之处。

事实上，scintilla开发组同时也用这个控件开发了一个编辑软件SciTE，它百分百的实现了 scintilla的全部功能，如果你对scintilla非常感兴趣，但又不知它到底能做到那些功能的活，当一个SciTE，使用一下就完全明白了。同时，SciTE也是开源软件，学习它的代码，就是学习scintilla的使用方法。在scintilla的文档中，就说明了，这个文档只是独立地讲解各个消息的使用方法，功能和参数，并不能讲解如何把它们连接起来组成一个实用的编辑器，要想知道如何实现某些特定功能，还是看看SciTE是如何实现的。我也看过SciTE的代码，可读性还是不错的，可惜我是没有耐心的人，也就读了几个函数，大体了解了一下，如果你想用好这个控件，多读读SciTE的源码还是不错的。

scintilla的消息就用SendMessage函数发送，它提供两个头文件：Scintilla.h和 SciLexer.h，消息号的宏定义都在这里，而且还有很多要用到的结构体，类型等等的定义。消息带的两个参数wParam和lParam是要经常用到的，也许会用到一个，两个，或者无需参数。但建议你最好在使用的时候把不用的参数都赋予0值，因为如果以后扩充消息功能，用到了某个参数，赋值能防止程序的崩溃。

通常参数的类型如下：
bool      int         const char*         char*         colour       <unused>

其他的类型不用多说，至于color类型，是用于描述颜色的，它实际上就是一个整数，计算方法是：red| (green << 8)|(blue << 16), red,green,blue是8位2进制数，也就是2位16进制数。很容易就能实现256色的调配。至于<unused>，就是说这个参数在这个消息中不用，可以赋为0值。

下面的讲解的重点是放在VC+MFC的环境中，因为我一直在这个环境下开发东西，要是用SDK编程也一样的，只是用到了更多的API，至于编译器，VC也好，GCC也好，我觉得没什么大问题，我就曾经用GDB调试SciTE的源码，来了解scintilla如何使用的，Linux平台下的GTK+编程我没尝试过，从文档上看，也是用消息的方式来控制控件，用接受消息的方式来获得控件的信息。


下面我就如何封装scintilla成为一个窗体类，如何在程序中使用它的功能一一讲解，水平有限，而且现在还在上学中，可能写得比较慢，呵呵，谅解。

如何使用scinitlla控件呢？scintilla控件需要两个头文件，Scintilla.h和SciLexer.h，这里定义了消息宏，所用到的数据结构类型等等。在所要用到的cpp文件中包括这两个头文件即可。
scinitlla控件与主程序交互通信是通过消息传递的。在窗体类中，创建一个scinitlla控件，然后发送消息给控件，以达到不同的目的。有的时候，我们也需要控件的反馈，比如当用户点击编辑器左边栏时，我们希望控件能通知父窗体，这时，父窗体接收到一个WM_NOTIFY消息，它的参数lParam可以转化为结构体SCNotification的指针类型，结构体SCNotification是由控件头文件定义的，该结构体定义如下：

struct SCNotification {
    struct NotifyHeader nmhdr;
    int position;
    // SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART,
    // SCN_DWELLEND, SCN_CALLTIPCLICK,
    // SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
    int ch;             // SCN_CHARADDED, SCN_KEY
    int modifiers;      // SCN_KEY, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
    int modificationType; // SCN_MODIFIED
    const char *text;   // SCN_MODIFIED
    int length;         // SCN_MODIFIED
    int linesAdded;     // SCN_MODIFIED
    int message;        // SCN_MACRORECORD
    uptr_t wParam;      // SCN_MACRORECORD
    sptr_t lParam;      // SCN_MACRORECORD
    int line;           // SCN_MODIFIED
    int foldLevelNow;   // SCN_MODIFIED
    int foldLevelPrev;  // SCN_MODIFIED
    int margin;         // SCN_MARGINCLICK
    int listType;       // SCN_USERLISTSELECTION
    int x;              // SCN_DWELLSTART, SCN_DWELLEND
    int y;              // SCN_DWELLSTART, SCN_DWELLEND
};

上面的SCN_MODIFIED, SCN_MARGINCLICK，SCN_STYLENEEDED等都是控件定义不同的消息宏，通过该结构体，可以知道控件通知父窗体的内容，

具体的代码实现会在下面的内容叙述的。

在创建控件之前，必不可少的一步就是加载动态库scilexer.dll，在WinApp类的InitInstance()方法中，加入
m_hDll = LoadLibrary(_T("SciLexer.dll"));

其中m_hDll是定义的App类的成员变量，同时，在ExitInstance() 方法中，加入
// unload scintilla dll
if (m_hDll != NULL)
 FreeLibrary(m_hDll);

这样才能使用功能强大的scintilla控件，否则是会出现无法创建控件的错误的。

那么如何创建scintilla控件？在MFC中，我们一般的做法是建立一个CWND窗体类，封装与scintilla控件通信的一系列实现，然后在视图类中加一个该窗体类的成员变量，通过窗体类来实现控件的各种操作，如创建、初始化等。这时起封装作用的窗体类看作是控件，这就是在设计模式中称为PROXY的模式。

我们建立一个CScintillaWnd类，如下：
class CScintillaWnd : public CWnd 
{
public:
 CScintillaWnd();
 virtual ~CScintillaWnd();
 BOOL Create (LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
}

#define STR_SCINTILLAWND _T("Scintilla")

BOOL CScintillaWnd::Create (LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
     return CWnd::CreateEx(WS_EX_CLIENTEDGE, STR_SCINTILLAWND, lpszWindowName, dwStyle,  rect, pParentWnd,(UINT)nID))
}

这样就创建了控件，在视图类中，加入CScintillaWnd类型的成员变量，例如：
private:
CScintillaWnd m_wndScintilla;

在视图类的OnCreate()函数中，加入：
if (!m_wndScintilla.Create(_T("Title"), WS_CHILD | WS_VISIBLE, CRect(0,0,0,0), this, 10000))

{  
    AfxMessageBox("can't create scintilla!");
    return -1;
}
     return 0;
同时，在OnSize()函数中，加入：
if (m_wndScintilla.GetSafeHwnd())
     m_wndScintilla.MoveWindow(0, 0, cx, cy);
这样保证控件与视图对齐，否则会发生找不到控件的现象。

执行了上述几步之后，在视图类中，应该可以看到scintilla控件的编辑窗口，现在就可以在该窗口上输入文本了。]]></description><author>ScintillaFans</author><slash:comments>1</slash:comments><pubDate>Wed, 03 Sep 2008 10:41:00 GMT</pubDate><dcterms:modified>Fri, 12 Sep 2008 00:06:00 GMT</dcterms:modified></item><item><title><![CDATA[用JEdit进行Ruby/Rails开发]]></title><link>http://club.muchool.com/jEdit/topic_59.htm</link><description><![CDATA[在windows/linux下面，我尝试了多种组合来进行rails开发，所进行的尝试包括：

* windows: Editplus（我用了好多年的编辑器） + 控制台
* windows/linux: RadRails
* linux: GEdit + snippet plugin + terminal
* windows/linux: jedit

最终发现，自定义能力极强以及插件/Macro众多的JEdit可能是TextMate之外最方便的编辑器。下面是截屏：

打开文件：

特点：

* 自定义功能极强的abbreviation功能，类似于TextMate中的snippets, Eclipse中的Template。Linux下GEdit也有类似的插件
* 语法加亮
* rails项目视图
* 快速打开某一个文件（我现在将这个功能绑定为Ctrl+N，用起来跟IntelliJ IDEA一样了）
* 精心的类比TextMate的配色

基础配置参考http://saimonmoore.net/permalink/jedit-for-ruby-rails-development

注意，最好安装JEdit 4.2stable版本，4.3版本与文中提到的某些插件（如SupperAbbrev）并不兼容。我所做的一些增强如下：

* 从http://rubyjedit.org/download/下载ruby mode语法文件。jedit自带的语法不够全面。
* 从http://community.jedit.org/?q=filestore/browse/21找到更新的html/css的语法文件并覆盖原有的mode文件，注意备份。Jedit自带的mode支持有限。
* 到http://community.jedit.org/?q=filestore/browse/23找到更漂亮的图标。许多人放弃JEdit是因为默认的图标实在太难看了。
* 下载我调制的颜色方案：http://mechiland.googlepages.com/RealTextMate.jedit-scheme 放在~userhome/.jedit/schemas 目录下面，用Editor Schema Selector插件选择使用。
* 从http://synthesis.sbecker.net/articles/2006/03/20/jedit-snippets-for-ruby-on-rails下载rails的缩写文件 （重要!）。以后如果要扩展自己的缩写片段，可以参考已有的，或者参考http://www.ifakedit.com/log/2006/02/19/jedit-tutorial-a-how-to-on-abbreviations-superabbrevs-in-html-ruby-on-rails-and-more/
* 安装增强Mac字体，有两个选择：Monaco或者ProFontWindows。当然你可以用你喜欢的字体，这两个字体是Mac的默认字体。
* 定义自己的快捷键。我定义的快捷键：Ctrl+H: 显示文件结构，Ctrl+ENTER: 自动扩展缩写，Ctrl+SPACE: 自动完成，Ctrl+D: 复制一行，Ctrl+Y: 删除一行，CTRL+ALT+UP/DOWN: 行上移/下移。

通过以上配置，你就可以在windows下面拥有一套相当便利的rails开发环境了。在出手MacBook之前，这就是我开发rails应用的IDE。]]></description><author>TOU2ME</author><slash:comments>1</slash:comments><pubDate>Wed, 03 Sep 2008 10:14:00 GMT</pubDate><dcterms:modified>Fri, 12 Sep 2008 00:04:00 GMT</dcterms:modified></item><item><title><![CDATA[jEdit应用指南【基础篇】]]></title><link>http://club.muchool.com/jEdit/topic_58.htm</link><description><![CDATA[      jEdit是一个非常强大和灵活的文本编辑器.在java开发过程中,我一直使用eclipse,UltraEdit和jEdit.经常在它们之间来回切换.因为ultraEdit太简单,而eclipse又太复杂,所以现在我要介绍的就是简单又复杂的jEdit,它将大大加速你的编程，我会将重点放在其内嵌的Beanshell脚本上。
第一章 jEdit是Java编写，强大，易用的程序员文本编辑器

以下部分介绍是我从其官方网站翻译来的:

      jEdit是一个成熟的,设计优秀的程序员文本编辑器,已经有了7年的开发历史。在功能和易用性方面压倒许多昂贵的开发工具时,jEdit在GNU公用许可证(GPL)下发布成了开源软件。

jEdit的核心主要由Slava Pestov开发完成,一支由世界各地的程序员组成的队伍正在为jEdit开发插件(plugin)。

下面是jEdit的几个特色：

    * 用java编写,所以它可以运行在Mac OS X, OS/2, Unix, VMS 和Windows平台上(山颠:非java程序员不推荐使用)
    * 内建宏语言;可扩展的插件体系;目前已经有了很多宏和插件.(山颠:内建BeanShell脚本语言,通过插件可以支持其他脚本语言.这点是我之所以在这里费力的原因 ^_^)
    * 使用jEdit的插件管理器可以下载插件并安装.(山颠:如果网络状况允许,这个功能确实非常好.不过建议想这么干的家伙去sf看看那些插件都是干什么的先,全装了会影响性能)
    * 提供超过130总编程语言的自动缩进和语法高亮.(山颠:很棒.据我所知,BeanShell的高亮显示好象只有它支持)
    * 支持UTF8和Unicode在内的大量字符编码
    * 代码折叠
    * 自动换行
    * 极高的可配置性和可定制性
    * 所有其他你希望在一个文本编辑器里找到的功能,不管是基础性的还是高级的,你都可以在jEdit中找到.请查看全部功能清单

看看这些截图，从直观上感受一下jEdit：http://www.jedit.org/index.php?page=screenshots

是啊，千变万化的jEdit。融合VIM，EditPlus，Emacs等编辑器的优点于一身。请查看维基百科中的文本编辑器比较。在这个有些片面（显然测试的是个阳春版本，没有加任何插件）的比较中，jEdit的表现仍然很是抢眼，全面超越它的只有Emacs(这个超级难用的程序)。作为一个Java程序员，我找遍了整个地球，在苦恼地承认自己的智商还不足以轻松学好Emacs或Vim后欣喜地发现了：开源、强大、易用、Java编写的jEdit正是我要的。
相关：从其他编辑器转移到jEdit http://community.jedit.org/cgi-bin/TWiki/view/Main/SwitchingToJEdit
 
第二章 jEdit的下载、安装和插件配置

   jEdit的官方主页是www.jedit.org,目前最高版本是4.3，稳定版本是4.2final。因为有些插件还不支持4.3,因此建议下载jEdit4.2版本。jEdit还需要JDK1.4的支持

    * 开源项目网址：http://sourceforge.net/projects/jedit/
    * 官方网站下载页面：http://www.jedit.org/index.php?page=download
    * 用户指南：http://jedit.org/users-guide/
    * 安装FAQ：http://www.jedit.org/FAQ/installation.html#id2877328
    * 官方Wiki：http://community.jedit.org/cgi-bin/TWiki/view/Main/WebHome

Note：jEdit的各个版本都有平台独立的版本和相应平台的版本。不过针对windows用户，jEdit还提供了一个启动器jEditLauncher。（目前官方已经不提供启动器了，相关的讨论见：http://community.jedit.org/?q=node/view/1411，其实以前的启动程序还是能用的，下载我使用的启动程序包,释放到jedit安装目录下就行了）

       安装完jEdit，下一步就是安装插件。和Eclipse类似，jEdit的插件安装也有两种途径：直接在jEdit中升级和手工下载插件包。建议选择直接升级。

1． 直接升级。

按Plugins->Plugin Manager打开插件管理器，进入Install，选择你想装的插件，点击install就可以安装了。注意，一次安装不要选中太多插件，否则这个过程将持续很长时间。安装完成后可以在Plugins->Plugin Options中进行配置。

2． 手工安装

jEdit插件是个开源项目，见http://sourceforge.net/projects/jedit-plugins/

在官方主页上也有这些插件的介绍：http://plugins.jedit.org/list.php。仔细的看看插件的说明，确定你需要的。下载后把压缩包后解压缩到jEdit安装目录的jars目录中（确保有jar文件在jars目录下，如果你下载的是完全版的插件，jars目录下还会有个包含源文件的同名文件夹），之后重启jEdit。

Note：必备的几个美化界面的插件是：Buffer Tabs（类似UltraEdit的标签）、Background（为View――编辑区添加背景图片）、LookAndFeel（外观选择）。如果有需要，其他插件会在后续文章中按用途进行介绍。
第三章 Beanshell脚本在jEdit的应用
第一节 强大、简单、独到的宏

在目前的Java IDE领域中，Eclipse是最好的。但jEdit并不是一个IDE，而是“程序员文本编辑器”。在文本编辑领域，jEdit拥有很多独到的优势，其中之一，也是作者最感兴趣的部分，就是它的宏——其实就是Beanshell脚本。内嵌的Beanshell引擎能够直接访问jEdit的内部对象和API，例如：你可以写出这样的宏命令：

buffer.undo(textArea);   //撤销当前buffer的一个操作

Registers.paste(textArea,'$',false);//粘贴到当前文本域

textArea.setSelectedText("    ");//将选定文本设为“    ”

textArea.goToNextLine(false);//移动光标到下一行

Registers.copy(textArea,'$');//copy

textArea.showWordCountDialog();//显示对话框，统计字数

textArea.backspace();//按一下后退键

       buffer、textArea都是jEdit的内部对象，Registers是jEdit中的寄存器类。可见Beanshell脚本具有直接访问jEdit内部资源的能力，这使我们写出一个高度自动化的宏命令成为可能。
      除了手工编写宏文件（.bsh文件）外，jEdit也可以录制宏。 录制宏有三种途径：
      1.使用菜单：打开 Macros->Record Macro，进行操作，完成时点击stop Recording。
      2.使用快捷键：开始录制用c+m c+r,结束录制用c+m c+s。（其中c+m c+r表示先按Ctrl+e，再按Ctrl+r,也可以按住Ctrl，然后再接着按m和r键）
      3.使用action bar：Ctrl＋Enter组合键打开action bar，输入record，按Tab键，回车，就开始录制宏。完成后打开action bar，输入recording，按tab，回车。
       Note：多种使用方式体现出jEdit强大的操作性；有关action bar的相关资料，请查看帮助。
       Note：宏文件必须存放在jedit\macros\目录或\Documents and Settings\uername\.jedit\macros目录下，前者是系统宏目录，后者是用户宏目录。
      
第二节 使用 jEdit中的Beanshell编写宏

    到了这一步，看来我们又要学一门新的语言了。“太麻烦了！”，你可能已经决定放弃jEdit了。幸好，Beanshell是Java阵营的脚本语言，我们基本上不需要什么精力就学会怎么在jEdit中使用它——当然前提你必须熟悉Java，这就是我在前面推荐Java程序员使用jEdit的原因。

       Beanshell 有脚本语言的特性，如弱类型、闭包等，但同时也完全兼容Java语法。为了简便起见，我们这里就象java一样来写beanshell，只要记住一点：它是解释执行的。更深入的学习推荐访问以下网站：

1.        http://dev.csdn.net/develop/article/15/15090.shtm

2.        http://www-128.ibm.com/developerworks/cn/java/l-beanshell/index.html

3.        官方网站：http://www.beanshell.org

4.        在线教程：http://www.beanshell.org/manual/contents.html

下面通过jEdit自带的一个宏文件来看看宏是怎么“炼成”的。
实例：jEdit 4.2\macros\java\Java_File_Save.bsh

文件源代码如下：中文部分是添加的注释
/**//*
 * Java_File_Save.bsh - a BeanShell macro for saving new java files.
 *
 * Copyright (C) 2004 Nicholas O'Leary nol@deferential.net
 * 
 * :mode=beanshell:tabSize=3:indentSize=3:maxLineLen=0:noTabs=true:
 * :indentOnTab=true:indentOnEnter=true:folding=explicit:collapseFolds=1:
 *
 *
 * Notes:
 *  Only the first 250 lines of the buffer are scanned for a suitable
 *  class or interface declaration.
 *  
 * Changes:
 *  17-May-04: Only scans if the edit mode is either 'java' or the default mode
 *           : Ignores declarations that are in multiline comments
 *  08-Jun-04: If an infinite loop is hit (1000 iterations) in the comment
 *           : parsing, it now opens the default save dialog, rather than
 *           : just returning.
 * $Id: Java_File_Save.bsh,v 1.1 2004/06/26 19:10:58 spestov Exp $
 */
//以上是宏作者写的说明

// Check this is a new file。
// 在jEdit中buffer对象指向当前正在编辑的文件，打开一个文件，就是在当前视图（view）的textArea中创建一个buffer
// 在帮助中可以查看这些类的API：对象buffer： org.gjt.sp.jedit.Buffer，
//                           对象textArea: org.gjt.sp.jedit.textarea.JEditTextArea
//                           对象view:    org.gjt.sp.jedit.View
// beanshell能访问的内存中的对象有view，buffer，textArea，editPane，wm，scriptPath，
// 详情请看帮助中的 Chapter 13. Macro Basics-->Predefined Variables in BeanShell小节
if (buffer.isNewFile() && buffer.getPath() != null)
{
   // Only look further if the mode is 'java', or still the default
   String buffer_mode = buffer.getMode().toString();//编辑模式，jEdit的默认编辑模式是text
   if (buffer_mode.equals("java") || buffer_mode.equals(jEdit.getProperty("buffer.defaultMode","")))
   {
      String fullpath = buffer.getPath();//打开文件的路径
      VFS vfs = VFSManager.getVFSForPath(fullpath);//根据路径生成虚拟文件系统
      // Split into constituent parts
      String path = vfs.getParentOfPath(fullpath);//获得所在目录
      String name = vfs.getFileName(fullpath);//获得文件名
      
      // At most, check the first 250 lines - this sounds reasonable to me
      //以下利用GNU的正则表达式包检查代码，提取出类名（最多检查250行）
      int maxLine = Math.min(buffer.getLineCount(),250);
      import gnu.regexp.RE;
      import gnu.regexp.REMatch;//这样引入包，jar文件必须能被jEdit找到(只要将jar文件放在jars目录下)
      // Build the regex - based on the offical java language spec.
      RE regex = new RE("^\\s*(public|protected|private|static|abstract|final|native|synchronized|transient|volatile|strictfp)?\\s*(class|interface)\\s*([^ {/]*)");
      int regexMinimum = regex.getMinimumLength();//可能构成一次匹配的最小字符数
      boolean inComment = false;//是否在注释里
      for(int i=0;i<maxLine;i++)
      {
         String txt = buffer.getLineText(i);//第i行的字符串
         int count = 0;
            // See if this line has a the start or finish of a multiline comment
         //确定提取的类名是有效的，不在注释里
         while (txt.indexOf("/*")!=-1 || txt.indexOf("*/")!=-1)
            {
                // A little paranoia on my part 
            count++;
            if (count==1000)//最多执行1000次，如果这行长度超过2000就不管了，直接保存为默认文件名
            {
               Log.log(Log.ERROR,BeanShell.class,"Infinite loop:["+txt+"]");
               //log: org.gjt.sp.util.Log jEdit的log系统
               buffer.save(view,null,true);//以默认名保存
               return;//结束脚本执行
            }
                // Look for the next starting comment if we're not in a comment
            if (!inComment)
            {
               int commentStartIndex = txt.indexOf("/*");
               if (commentStartIndex != -1)
               {
                  inComment = true;
                  if (commentStartIndex+2 == txt.length())
                     txt = "";
                  else
                     txt = txt.substring(commentStartIndex+2);
               }
            }
                // Look for the next ending comment if we are in a comment
            if (inComment)
            {
               int commentEndIndex = txt.indexOf("*/");
               if (commentEndIndex != -1)
               {
                  inComment = false;
                  if (commentEndIndex+2 == txt.length())
                     txt = "";
                  else
                     txt = txt.substring(commentEndIndex+2);
               } else {
                  continue;
               }
            }
         }
            
            // We now know if the remainder of the line is in a comment or not
         if (!inComment)
         {
            // Ignore lines that are too short for the regex
            if (txt.length() < regexMinimum)
               continue;
            REMatch match = regex.getMatch(txt);
            // See if it matches
            if (match!=null)
            {
               int startIndex = match.getStartIndex(3);
               int endIndex = match.getEndIndex(3);
               // Extract the class/interface name 得出第三个匹配，就是类名
               name = txt.substring(startIndex,endIndex)+".java";//文件名
               break;
            }
         }
      }
      
      // Open the VFSBrowser
      String[] files = GUIUtilities.showVFSFileDialog(view,path+name,
                                                VFSBrowser.SAVE_DIALOG,false);
      if(files == null)
         return false;
      buffer.save(view,files[0],true);
      return;
   }
}

// This isn't a file that has been scanned, so just do a normal save
buffer.save(view,null,true);

/**//*

Macro index data (in DocBook format)

   <listitem>
      <para><filename>Java_File_Save.bsh</filename></para>
      <abstract><para>Acts as a wrapper script to the Save As action. If the buffer
      is a new file, it scans the first 250 lines for a Java class or interface
      declaration. On finding one, it extracts the appropriate filename to be
      used in the Save As dialog.</para></abstract>   
      </listitem>

*/
         这个bsh脚本能自动得到文件中的类名，以此作为文件名的前缀保存。要执行这个文件，点击Macros－Java－java_File_save。要快速执行，可以设定快捷键。打开Utilities-Global option，选择shortcuts－macros进行快捷键设置。
          jEdit自带的Macro就是很好的例子，配合帮助中的API，beanshell宏是很容易上手的。
]]></description><author>TOU2ME</author><slash:comments>1</slash:comments><pubDate>Wed, 03 Sep 2008 10:09:00 GMT</pubDate><dcterms:modified>Fri, 12 Sep 2008 00:05:00 GMT</dcterms:modified></item><item><title><![CDATA[模板整体架构]]></title><link>http://club.muchool.com/ShopNC多用户商城系统/topic_57.htm</link><description><![CDATA[一、网站首页面（index.html）
（一）首页面头部
1、网站导航 (menu.html) 部分
2、站内搜索 (search_box.html) 部分
3、跑马灯广告栏（horse.html）部分
（二）首页面左侧
1、会员登陆（login_box.html）部分
2、购物车（cart_windows.html）部分
3、商品分类（search_style_one.html / search_banner.html）部分
4、友情链接（link_friend.html）部分
（三）首页面右侧
1、广告图（iframe_adver.html）部分
2、特价商品（main_scroll.js）滚动部分
3、商店公告（include_article.html）部分
4、投票栏（poll.html）部分
（四）首页面底部

[li]版权、站内说明（bottom.html）部分[/li]
二、会员中心页面（subject_index.html）的制作 
（一）会员登陆（login_windows.html） 
1、头部——网站导航 (menu.html) 部分
2、头部——站内搜索 (search_box.html) 部分
3、左侧——商品分类（search_style_one.html）部分
4、右侧——会员中心登陆框
5、底部——版权、站内说明（bottom.html）部分

（二）会员中心首页（member_index.html） 
1、头部——网站导航 (menu.html) 部分
2、头部——站内搜索 (search_box.html) 部分
3、左侧——会员中心功能连接（left.html）部分
4、右侧——会员中心各个版块功能的说明部分
5、底部——版权、站内说明（bottom.html）部分

（三）我的订单页面（MyOrder.html） 
1、头部——网站导航 (menu.html) 部分
2、头部——站内搜索 (search_box.html) 部分
3、左侧——会员中心功能连接（left.html）部分
4、右侧——我已定购的产品列表
5、底部——版权、站内说明（bottom.html）部分

（四）追踪订单页面（MyOrder.html） 
1、头部——网站导航 (menu.html) 部分
2、头部——站内搜索 (search_box.html) 部分
3、左侧——会员中心功能连接（left.html）部分
4、右侧——我已收藏的产品列表
5、底部——版权、站内说明（bottom.html）部分

（五）红利商品收藏页面（BonusCollection_list.html） 
1、头部——网站导航 (menu.html) 部分
2、头部——站内搜索 (search_box.html) 部分
3、左侧——会员中心功能连接（left.html）部分
4、右侧——我已收藏的红利产品列表
5、底部——版权、站内说明（bottom.html）部分

（六）会员信息页面（AccountInformation.html） 
1、头部——网站导航 (menu.html) 部分
2、头部——站内搜索 (search_box.html) 部分
3、左侧——会员中心功能连接（left.html）部分
4、右侧——我注册时所填写的注册信息，可在此修改
5、底部——版权、站内说明（bottom.html）部分

（七）修改密码页面（ChangePwd.html） 
1、头部——网站导航 (menu.html) 部分
2、头部——站内搜索 (search_box.html) 部分
3、左侧——会员中心功能连接（left.html）部分
4、右侧——修改密码表单
5、底部——版权、站内说明（bottom.html）部分


（八）注销（LoginOut） 
退出会员中心，返回login_windows.html
三、红利商品页面（subject_index.html）的制作 
（一）红利商品页面头部
1、网站导航 (menu.html) 部分
2、站内搜索 (search_box.html) 部分
（二）红利商品页面左侧
1、会员登陆（login_box.html）部分
2、购物车（cart_windows.html）部分
3、商品分类（search_style_one.html / search_banner.html）部分
（三）红利商品页面右侧
1、红利商品列表
（四）红利商品页面底部
1、版权、站内说明（bottom.html）部分

四、购物车页面 
（购物车整个流程包括：购物资讯确认、选择付款方式、订单资讯确认、订单完成四个大体部分组成。其中包含一下几个页面：cart.html 、cart_op.html 、cart_paythird.html 、cart_fourthly.html，其中每个页面的组成部分大体相同，只是在页面的右侧，根据使用者到达的每一步，显示的表单内容不同。）
（一）购物车页面头部
1、网站导航 (menu.html) 部分
2、站内搜索 (search_box.html) 部分
（二）购物车页面左侧
1、会员登陆（login_box.html）部分
2、购物车（cart_windows.html）部分
3、商品分类（search_style_one.html / search_banner.html）部分
（三）购物车页面右侧
1、购物车相应的流程表单
（四）购物车页面底部
1、版权、站内说明（bottom.html）部分
]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Tue, 02 Sep 2008 13:44:00 GMT</pubDate><dcterms:modified>Tue, 02 Sep 2008 13:44:00 GMT</dcterms:modified></item><item><title><![CDATA[QQ2008贺岁版协议分析 ]]></title><link>http://club.muchool.com/LumaQQ.Net/topic_56.htm</link><description><![CDATA[一、      Touch包0x91
a)       0x2aa8 客户端
原始数据：
02 11 5b 00 91 2a a8 38 25 f5 91 5d 4c af 65 54 44 6d 76 7b ff f0 14 73 e6 0a 95 9d 74 ce b3 b5 fd 61 1d 12 84 a5 04 53 3c b1 d4 f9 27 9c 7c 3f ef f0 bb 3c dc 3f 0f 25 ee 3d 7c 03
 
包头：
02 11 5b
命令：
00 91 
序号：
2a a8 
QQ号码：
38 25 f5 91  （十进制：我的Q，942011793）
临时钥匙A：
5d 4c af 65 54 44 6d 76 7b ff f0 14 73 e6 0a 95 （随机生成）
加密数据：
9d 74 ce b3 b5 fd 61 1d 12 84 a5 04 53 3c b1 d4 f9 27 9c 7c 3f ef f0 bb 3c dc 3f 0f 25 ee 3d 7c
包尾：
03
 
解密数据（临时钥匙A）：
00 01 01 00 00 00 02 00 00 00 00 DB 85 31 A9
第一次发送该包时，这里的数据全部为0
 
b)       0x2aa8 服务器
原始数据：
02 11 5b 00 91 2a a8 ef a7 fc 36 e7 5e f5 df a9 6e e0 e6 5a ba e4 84 03
 
包头：
02 11 5b 
命令：
00 91 
序号：
2a a8 
加密数据：
ef a7 fc 36 e7 5e f5 df a9 6e e0 e6 5a ba e4 84 
包尾：
03
 
解密数据（临时钥匙A）：
00 00
 
二、      登录令牌0x62
a)     0x221d 客户端
原始数据：
02 11 5b 00 62 22 1d 38 25 f5 91 00 03
 
包头：
02 11 5b
命令：
00 62
序号：
22 1d 
QQ号码：
38 25 f5 91
数据：
00
包尾：
03
 
b)     0x221d服务器
原始数据：
02 11 5b 00 62 22 1d 00 18 d3 19 45 57 28 1f 56 dd a6 dd be c1 67 2e 32 92 b9 ee ea 81 65 03 68 8d 03
 
包头：
02 11 5b
命令：
00 62
序号：
0x221d
令牌0x62长度：
00 18 
令牌0x62数据：
d3 19 45 57 28 1f 56 dd a6 dd be c1 67 2e 32 92 b9 ee ea 81 65 03 68 8d包尾：
03
 


详情请查看:http://bbs.muchool.com/190/ShowPost.aspx#190]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Sat, 30 Aug 2008 23:08:00 GMT</pubDate><dcterms:modified>Sat, 30 Aug 2008 23:08:00 GMT</dcterms:modified></item><item><title><![CDATA[AWStats 的配置指令和选项]]></title><link>http://club.muchool.com/Awstats/topic_55.htm</link><description><![CDATA[AWStats 的配置指令和选项 
主设置(必须设置)
LogFile 
"LogFile"包含要分析的日志文件，可以使用绝对路径或者相对路径(对 awstats.pl而言)。 
比如： 
LogFile = /var/log/apache2/access_log 
如果需要设定动态的文件名(比如日志文件名中含有该日志生成的日期)，可以使用标签(tags)： 
tags 含义 
%YYYY-n n小时前的年(四位，比如2006) 
%YY-n n小时前的年(两位，比如06) 
%MM-n n小时前的月(比如01) 
%MO-n n小时前的月(比如Jan) 
%DD-n n小时前的天(比如03) 
%HH-n n小时前的小时(比如03) 
%NS-n n小时前的秒(自1970年0:00以来，只精确到天，比如1136332800，是格林威治时间2006年1月4日的零点) 
%WM-n n小时前的周(week in month，值为01-05)(注意，文档与实际并不一致，文档中值为1-5，可能是个bug) 
%Wm-n n小时前的周(week in month，值为0-4) 
%WY-n n小时前的周(week in year，值为01-52) 
%Wy-n n小时前的周(week in year，值为00-51) 
%DW-n n小时前的天(day in week，值为1-7，1=sunday，如果需要使得1=monday，减去24小时就可以了。) 
%Dw-n n小时前的天(day in week，值为0-6，0=sunday，如果需要使得0=monday，减去24小时就可以了。) 
比如： 
LogFile = /var/log/apache2/access_log.%YYYY-24-%MM-24-%DD-24.txt
还可以使用管道： 
LogFile = gzip -d 
如果有多个日志文件需要分析(比如做了负载均衡)，可以这样： 
LogFile = "/pathtotools/logresolvemerge.pl *.log |"

LogType 
日志的类型： 
W web日志 
M mail日志 
F ftp日志 
比如： 
LogType=W

LogFormat
日志的格式： 
1 Apache 或者 Lotus Notes/Domino 的combined日志格式 
2 老的IIS的日志格式 
3 Webstar的native日志格式 
4 Apache 或者 Squid 的common日志格式 
我们还可以自己指定日志格式，下表是日志格式的各个字段 
%host 客户端的主机名或者IP地址 
%lognamequot Authenticated login/user with format: "alex" 
%logname Authenticated login/user with format: alex 
%time1 日期，格式为 [dd/mon/yyyy:hh:mm:ss +0000] 或 [dd/mon/yyyy:hh:mm:ss] 
%time2 日期，格式为 yyyy-mm-dd hh-mm-ss 
%time3 日期，格式为 Mon dd hh:mm:ss 或 Mon dd hh:mm:ss yyyy 
%time4 日期，格式为 dddddddddd(unix的时间戳) 
%methodurl 方法和url，格式为："GET /index.html HTTP/x.x" 
%methodurlnoprot 方法和url，格式为："GET /index.html" 
%method 方法，格式为：GET 
%url URL，格式为：/index.html 
%query 查询的字符串(Query string) ( URLWithQuery 选项要用) 
%code 返回的状态码Return code status (with format for web log: 999) 
%bytesd 文档的大小(字节) 
%refererquot Referer page，格式为："http://from.com/from.htm" 
%referer Referer page，格式为：http://from.com/from.htm 
%uaquot User agent，格式为："Mozilla/4.0 (compatible, ...)" 
%ua User agent，格式为：Mozilla/4.0_(compatible...) 
%gzipin mod_gzip comdivssion input bytes: In:XXX 
%gzipout mod_gzip comdivssion output bytes & ratio: Out:YYY:ZZpct. 
%gzipratio mod_gzip comdivssion ratio: ZZpct. 
%deflateratio mod_deflate comdivssion ratio with format: (ZZ) 
%email EMail sender (for mail log) 
%email_r EMail receiver (for mail log) 
%virtualname Web sever virtual hostname. Use this tag when same log contains data of several virtual web servers. AWStats will discard records not in SiteDomain nor HostAliases 
%cluster If log file is provided from several computers (merged by logresolvemerge.pl), this tag define field of cluster id.
%other 如果日志文件有一些字段不被上面的列表包括，使用%other 
比如： 
LogFormat= 1
LogFormat= "%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"

LogSeparator 
日志各个字段间的分隔符 
比如： 
LogSeparator=" "

DNSLookup 
DNS反查，可取的值如下： 
0 不用DNS反查 
1 完全启用DNS反查 
2 DNS反查只从静态的DNS的缓存中取得 
比如： 
DNSlookup=2

DirData 
统计结果存放的目录。 
注意：如果需要直接在浏览器上更新统计结果的话，这个目录要设为apache用户 (比如nobody)可写。 
比如： 
DirData="/var/lib/awstats"

DirCgi 
awstats的cgi-bin目录的相对或者绝对URL路径。 
这个参数只是在命令行下使用-output选项时才有用 
比如： 
DirCgi="/cgi-bin"

DirIcons 
awstats的icon目录的相对或者绝对URL路径。 
比如： 
DirIcons="/icon"

SiteDomain 
主域名。如果日志里含有多个域名的话，AWStats将过滤掉非此域名的访问。(当然，你的日志格式里得含有域名的信息) 
当ShowLinksOnUrl选项设为1时，这个参数用来生成URL路径。 
如果是分析mail日志，这里写上mail服务器的域名。 
比如： 
SiteDomain="www.sunnavy.net"

HostAliases 
可以在这里写上其他所有可以访问这个站点的域名，IP等等。这些值之间用空格隔开。为了获得最好的性能，这个参数的值越少越好。这个参数还用来分析日志里的referer字段，以区分一个referer URL是本地的还是别的站点的。 
还可以使用正则表达式(REGEX[value])，比如： 
HostAliases = "localhost 127.0.0.1 REGEX[^.*\.myserver\.com$]"

AllowToUpdateStatsFromBrowser 
可选值为0或1。 
如果设为1的话，将在报告页面里增加一个"update now"的按钮，这样可以在线更新统计结果。 
比如： 
AllowToUpdateStatsFromBrowser=0

AllowFullYearView 
AWStats是按月来存放数据库的。这使得可以很快地生成统计结果。如果你在命令行下选择-month=all或者在web上选择-year-，AWStats将把一年的数据全部加载以生成统计结果，这将耗费大量的资源。 
可选值为： 
0 不允许 
1 只允许在命令行下使用，web上不可见。 
2 只允许在命令行下使用，web上可见但不可用。 
3 允许 
比如： 
AllowFullYearView=2
可选的设置(不是必需但可以增加AWStats的功能)

EnableLockForUpdate 
可选值为0或1。 
如果设为1的话，当更新统计结果的时候，AWStats可以在TEMP或者TMP目录设置一个锁文件，这样可以避免同时有多个进程更新，避免可能的冲突以及DoS攻击。 
可是，当使用锁文件的时候，你可能会碰到锁文件不能自动删除的问题，就只能手动删除，所以你需要登陆服务器的权限。 
比如： 
EnableLockForUpdate=0

DNSStaticCacheFile 
AWStats可以通过一个静态(static)的DNS缓存(cache)文件进行DNS反查。这个文件默认的路径为DirData，这个文件不能改变(This file is never changed)。 
DNS文件的格式为'minsince1970 ipaddress resolved_hostname'或者只是 'ipaddress resolved_hostname' 
比如： 
DNSStaticCacheFile="dnscache.txt"

DNSLastUpdateCacheFile 
AWStats可以通过一个静态(static)的DNS缓存(cache)文件进行DNS反查。在每次统计结果更新完后，这个文件会自动消除和重新生成，所以不需要手动创建或改变。这个文件将被放在DirData目录。 
只有当DNSLookup=1时，这个选项才有作用。 
注意：如果DNSStaticCacheFile存在的话，AWStats将会在检查 DNSStaticCacheFile完后检查这个文件。 
比如： 
DNSLastUpdateCacheFile="dnscachelastupdate.txt"

SkipDNSLookupFor 
可以指定某些IP不被DNS反查。这个选项只有在DNSLookup=1时才起作用。IP之间用空格隔开。 
注意：可以使用正则表达式。 
比如： 
SkipDNSLookupFor="123.123.123.123 REGEX[^192\.168\.]"

AllowAccessFromWebToAuthenticatedUsersOnly 
可选值为0或1 
接下来的这两个选项允许你保护你的配置文件不被AWStats访问，如果这个AWStats是被未经认证的web用户访问的话。这样的话，AWStats必须被httpd设为认证访问。 
AllowAccessFromWebToAuthenticatedUsersOnly=0
AllowAccessFromWebToFollowingAuthenticatedUsers 
这个参数指定允许访问统计结果的用户名单，只有在AllowAccessFromWebToAuthenticatedUsersOnly=1时才起作用。 
比如： 
AllowAccessFromWebToFollowingAuthenticatedUsers="sunnavy sunhj"

AllowAccessFromWebToFollowingIPAddresses 
当这个参数定义后，用户从浏览器访问统计结果时所用的IP地址将被检查是否在指定的IP里。 
比如： 
AllowAccessFromWebToFollowingIPAddresses="127.0.0.1 123.123.123.1-123.123.123.255"

CreateDirDataIfNotExists 
可选值为0和1。 
如果DirData目录不存在的话，AWStats将返回一个错误。我们可以让AWStats自行创建这个目录，如果这个值设为1的话。 
比如： 
CreateDirDataIfNotEXists=1

BuildHistoryFormat 
我们可以选择AWStats历史数据库的保存格式，"xml"或者"text"。 
比如： 
BuildHistoryFormat=text

BuildReportFormat 
生成的统计结果格式，"html"或者"xhtml"。 
比如： 
BuildReportFormat=html

SaveDatabaseFilesWithPermissionsForEveryone 
数据库文件是否对所有人可写，可选值为0或1。如果我们想在浏览器上直接更新，这个值我们得设成1。 
比如： 
SaveDatabaseFilesWithPermissionsForEveryone=0

PurgeLogFile 
是否清除已经分析过的日志文件，可选值为0或1。 
比如： 
PurgeLogFile=0

ArchiveLogRecords 
是否将日志文件归档，可选值为0或1。归档文件放在DirData里。 
如果PurgeLogFile设为0，则这个选项将不起作用。 
ArchiveLogRecords=0

KeepBackupOfHistoricFiles 
是否将历史文件备份，可选值为0或1。 
AWStats更新时，将覆盖旧文件，如果这期间机器出了故障的话(比如硬盘满了)，我们的历史文件就会丢了。可以将这个选项设为1来备份旧文件(备份文件以.bak结尾) 
比如： 
KeepBackupOfHistoricFiles=0

DefaultFile 
默认的index页面的文件名。 
比如： 
DefaultFile="index.html"

SkipHosts 
分析时跳过的主机，主机之间用空格隔开。 
如果日志已经做了DNS反查，这里必须写主机名，否则得写IP地址。可以使用正则表达式。 
比如： 
SkipHosts="127.0.0.1 192.168.0.1"

SkipUserAgents 
分析时跳过的UserAgent，即浏览器的型号，不区分大小写，型号之间用空格隔开，可以使用正则表达式。 
如果你想跳过某个机器人访问，应该更新robots.pm文件而不这个选项。 
比如： 
SkipUserAgents="wget curl"

SkipFiles 
分析时跳过的URL，URL之间用空格隔开，可以使用正则表达式。 
是否区分大小写，由URLNotCaseSensitive决定。 
比如： 
SkipFiles="test.html"

OnlyHosts 
SkipHost的反义词。 
比如： 
OnlyHosts=""

OnlyUserAgents 
SkipUserAgents的反义词。 
比如： 
OnlyUserAgents=""

OnlyFiles 
OnlyFiles的反义词。 
比如： 
OnlyFiles=""

NotPageList 
这个列表保存一些URL(文件扩展名)，带这些扩展名的URL将被看做 "Hit Only"而不是"Hit"和"Page/Download"，因此将不被包括在"TOP Pages/URL report"里。 
比如： 
NotPageList="css js class gif jpg jpeg png bmp"

ValidHTTPCodes 
有效的HTTP返回状态码，在该列表之外的均列在错误报告的表中。 
比如： 
ValidHTTPCodes="200 304"
HTTP的返回状态码见这里

ValidSMTPCodes 
有效的SMTP状态码。 
比如： 
ValidSMTPCodes="1 250"

AuthenticatedUsersNotCaseSensitive 
认证的用户名不区分大小写，可选值为0或1。 
比如：

AuthenticatedUsersNotCaseSensitive=0

URLNotCaseSensitive 
URL不区分大小写，可选值为0或1。 
比如： 
URLNotCaseSensitive=0

URLWithAnchor 
是否保留URL中的锚。 
比如： 
URLWithAnchor=0

URLQuerySeparators 
URL中的查询分隔符(QuerySeparators)。 
比如： 
URLQuerySeparators="?;"

URLWithQuery 
是否在统计结果中保留查询字符串，可选值为0或1。 
如果保留，则"mypage.html?id=x"和"mypage.html?id=y"将被当作两个不同的 URL。 
比如： 
URLWithQuery=0

URLWithQueryWithOnlyFollowingParameters 
仅保留本列表里的查询字符串的参数。 
只有当URLWithQuery=1时才起作用，并且不能和 URLWithQueryWithoutFollowingParameters共同使用。 
比如： 
URLWithQueryWithOnlyFollowingParameters="param"

URLWithQueryWithoutFollowingParameters 
去掉在本列表里的查询字符串的参数。 
只有当URLWithQuery=1时才起作用，并且不能和 URLWithQueryWithOnlyFollowingParameters共同使用。 
比如： 
URLWithQueryWithoutFollowingParameters=""

URLRefererWithQuery 
是否在统计结果中的Referer页面中保留查询字符串，可选值为0或1。 
如果保留，则"mypage.html?id=x"和"mypage.html?id=y"将被当作两个不同的 Referer页面。 
比如： 
URLReferrerWithQuery=0

WarningMessages 
是否打开AWStats的提醒消息，这些消息可以帮你找出设置的问题或者帮你更好地使用AWStats，所以打开比较好。 比如： 
WarningMessages=1

ErrorMessages 
当有错误发生时，AWStats根据所发生的错误输出信息。也可以自定义输出的信息。 
比如： 
ErrorMessages=""

DebugMessages 
是否打开Debug功能。如果打开的话，当参数含debug=x时，AWStats将输出很多相关信息来帮助我们解决问题。 
比如： 
DebugMessages=0

NbOfLinesForCorruptedLog 
检查日志格式是否正确时查看前文件的多少行。如果这些行的日志都是不符和格式的， AWSTats就认为这个日志文件的格式是不对的。 
比如： 
NbOfLinesForCorruptedLog=50

WrapperScript 
CGI下访问的脚本名。 
比如：

WrapperScript="awstats.pl"

DecodeUA 
如果web服务器为Roxen，则设为1，否则，设为0 
比如： 
DecodeUA=

MiscTrackerUrl 
比如： 
AWStats可以用一个js脚本检测很多浏览器相关的选项，包括： 
Screen size
Screen color depth
Java enabled
Macromedia Director plugin
Macromedia Shockwave plugin
Realplayer G2 plugin
QuickTime plugin
Mediaplayer plugin
Acrobat PDF plugin
如果要支持这个，需要把awstats_misc_tracker.js文件拷贝到web服务器的一个目录(比如/js/)，并在主页的最后(之前)加上这个
]]></description><author>水月·静夜思</author><slash:comments>0</slash:comments><pubDate>Wed, 27 Aug 2008 14:36:00 GMT</pubDate><dcterms:modified>Wed, 27 Aug 2008 14:36:00 GMT</dcterms:modified></item><item><title><![CDATA[[yui]Yahoo!User Interface Libray 介绍]]></title><link>http://club.muchool.com/Yahoo! User Interface Library/topic_54.htm</link><description><![CDATA[第一章 简介Yahoo! User Interface Library(简称yui) 是一个使用JavaScript编写的工具和控件库。它利用DOM脚本,DHTML和AJAX来构造具有丰富交互功能的Web程序。yui也包含几个核心的CSS文件。yui中的所有组件已经以开源的形式发布，它们遵循BSD协议并且可以免费使用。可以从Sourceforge站点下载完整的项目文件，同时包含相关文档和示例。 

yui项目开发人员的BLOG：YUI Blog，交流社区：ydn-javaScript on Yahoo! Groups。 

准备工作： 

1、 下载yui 

yui项目文件已经发布在Sourceforge站点，文件包含相关文档，示例和代码。 

注：Yahoo没有为yui的运行提供免费的运行环境，你需要运行在你在即Web服务器上。 

2、 在你的网页中加入你需要的类库文件 

为了使用yui中的组件你必须在你的页面文件中用<script>指定相关组件的类库文件地址。如果该组件依赖于其他组件，你必须使用<script>指定所依赖的组件的类库文件地址。 

3、 如果有必要，在页面中加入CSS文件 

某些yui的控件包含一个相应的CSS文件，用来设定控件的样式。此时，你必须在页面中使用<style>指定相应的CSS文件的地址。你可以通过修改相应的CSS文件达到你想要的效果。 

4、 浏览相关文档和示例 

每一个组件都包含详细的API文档，并且提供了常用的例子。学习完后，回顾一下所有的API，做到心中有数。因为对于API理解的好坏将影响你对yui的使用效果。 

  

第二章 组件介绍Yui组件分成2类：工具包和控件库 

Yui 工具包 

Yui 工具包利用DOM脚本来简化浏览器内的开发（in-browser devolvement），使用DHTML和AJAX的特性开发所有的Web程序。 

动画（Animation）：在你的页面中通过指定位置，大小，透明度或者页面元素的其他特性来创建一个“电影效果（cinematic effects）”。这些效果将在你的页面发生变化的时候给用户更好的体验。 

连接管理（Connection Manager ）：这个工具包帮助你管理XMLHttpRequest（一般被称为AJAX）事务，它提供对表单提交（form posts），错误捕获（error handling）和callbacks的全面支持。该工具包也支持文件的上传管理。 

DOM：DOM工具包提供更简单的DOM脚本的功能调用方式，包含元素的位置和CSS样式的管理。 

拖放（Drag and Drop）：创建可拖放的对象。为了提供丰富的交互功能（比如拖动一个对象到目标位置）你可能需要编写很多代码。这个工具包可以在所有支持的浏览器中捕获所有的操作事务并保证其稳定地运行。 

事件（Event）：这个神奇的管理类库给你提供一种简单安全的方法访问浏览器的事件（比如点击和键盘操作）。这个事件封包中还包含了自定义事件对象，它为你的程序交互提供一种发布和订阅事件的机制。 

  

yui控件： 

yui控件库为你页面提供一组高交互性性的可视化元素。这些元素完全在客户端创建维护，不需要请求服务器进行页面刷新。 

这些控件包括： 

自动完成（AutoComplete）控件：自动完成控件为文本输入提供一种渐进式的用户体验（streamline user interactions）。控件会提供相似项列表和基于多样化的数据格式的提前键入功能（type-ahead functionality based on a variety of data-source formats），并且可以通过XMLHttpRequest访问服务端的数据。 

日历（Calendar）控件：一个用来日期选择的动态图形控件。 

容器（Container）控件：一组模仿windows样式的控件，他们包括Tooltip, Panel, Dialog 和 SimpleDialog。其中Module 和 Overlay控件提供一个可扩展的平台，你可以控制自定义的模仿windows样式的控件。 

日志（Logger）控件：提供一个快速和简单的记录日志的方式，它直接将日志信息输出到屏幕控制台（on-screen console）、Firefox的扩展组件FireBug，或者Safari的Javascript控制台。yui的Debug组件将完整的记录输出信息和调试信息。 

菜单（Menu）控件：利用此控件只需要几行简单的代码就可以设计一个动态样式的菜单。可以完全使用javascript构造一个菜单，can be layered on top of semantic unordered lists。 

滑块（Slider）控件：提供一个可滑动的组件，它允许使用者在一定的范围内（x轴，y轴）改变滑块的位置。 

树形（TreeView）控件：提供一个节点可缩放的树形控件。节点可以是链接，自定义属性，并且可以动态加载。节点元素的展现可以通过CSS修改，比如文件夹视图，TO－DO任务列表或者其他可视化处理 

  

第三章 yui的CSS资源 

为了让CSS能符合不同等级的浏览器（A-Grade browsers）的标准，我们想了很多。我们把这些作为yui类库的一部分共享出来，希望能在这里得到促进，获得一个简洁的，可维护并在浏览器中表现优秀的设计。 

页面网格样式（CSS Page Grids）：7个基本的用css组织子组件的页面框架，支持130种不通的页面布局。 

标准的CSS字体（Standard CSS Fonts）：标准的跨浏览器字体样式和大小展现。 

标准的CSS排列（Standard CSS Reset）：使用这些CSS声明来排除页面的空白部分并且公共元素的样式兼容各种浏览器的展现。

]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Fri, 15 Aug 2008 13:52:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:52:00 GMT</dcterms:modified></item><item><title><![CDATA[EasyJWeb－Velocity脚本简明教程 ]]></title><link>http://club.muchool.com/EasyJWeb/topic_53.htm</link><description><![CDATA[很多人下载了EasyJWeb的开源应用示例，但是对动态页面模板文件中的标签使用不是很熟悉，这里简单介绍一下。EasyJWeb特定把视图限定为Velocity，因为我们觉得在Velocity在表现上从可维护性、简洁性乃灵活性上，比JSP及其它视力技术表现强得多。虽然我们可以非常简单把EasyJWeb扩展成支持多种视力技术，但当前我们不打算这样做！
　　使用EasyJWeb的目的，是在于把页面－程序完成分开，就也就是一个项目中，程序员使用专业Java开发工具（如Eclipse、JBuilder等)来编写、调试、测试程序，页面制作人员使用专业的网页制作工具（如Macromedia Dreamweaver）来设计制作网页，而两者之间的协调通过一个规范的接口协议来解决。需要在页面里面加如一些标签，来生成动态内容，这一工作可以交由网页制作人员来完成。因为使用Velocity作为视图，由于他的语法、功能及使用方法都比较简单，因此一般情况下，一天以内就能让页面制作人员熟练掌握其用法。
　　Velocity是一个基于java的模板引擎（template engine），它允许任何人仅仅简单的使用模板语言（template language）来引用由java代码定义的对象。作为一个比较完善的模板引擎，Velocity的功能是比较强大的，但强大的同时也增加了应用复杂性。
一、基本语法
 
 
1、"#"用来标识Velocity的脚本语句，包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等；
如:
#if($info.imgs)

#else

#end

2、"$"用来标识一个对象(或理解为变量)；如
如：$i、$msg、$TagUtil.options(...)等。

3、"{}"用来明确标识Velocity变量；
比如在页面中，页面中有一个$someonename，此时，Velocity将把someonename作为变量名，若我们程序是想在someone这个变量的后面紧接着显示name字符，则上面的标签应该改成${someone}name。

4、"!"用来强制把不存在的变量显示为空白。
如当页面中包含$msg，如果msg对象有值，将显示msg的值，如果不存在msg对象同，则在页面中将显示$msg字符。这是我们不希望的，为了把不存在的变量或变量值为null的对象显示为空白，则只需要在变量名前加一个“!”号即可。
如：$!msg
  
  
 
二、在EasyJWeb中的最佳实践
 
 
  　　理论上你可以在EasyjWeb模板使用所有Velocity的脚本及功能，但我们不推荐你在界面模板中使用过多过复杂的脚本表达方式，在万不得已的情况下，不要在界面模板中加入任何复杂的逻辑，更不要在界面模板中加入变量声明、逻辑运算符等等。 
　　在EasyJWeb中，我们提供了五条基本的模板脚本语句，基本上就能满足所有应用模板的要求。这四条模板语句很简单，可以直接由界面设计人员来添加。在当前很多EasyJWeb的应用实践中，我们看到，所有界面模板中归纳起来只有下面四种简单模板脚本语句即可实现：
　　 1、$!obj 　直接返回对象结果。
　　 如：在html标签中显示java对象msg的值。

$!msg


　 在html标签中显示经过HtmlUtil对象处理过后的msg对象的值　　 
$!HtmlUtil.doSomething($!msg)

 

　　2、#if($!obj) #else #end 判断语句
　　 如：在EasyJWeb各种开源应用中，我们经常看到的用于弹出提示信息msg的例子。
　　 #if($msg)
　　 
　　 #end
上面的脚本表示当对象msg对象存在时，输出
　　 #end
上面的脚本表示当对象msg对象存在时，输出 
 
 
 
]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Fri, 15 Aug 2008 13:50:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:50:00 GMT</dcterms:modified></item><item><title><![CDATA[EasyJWeb 1.1快速体验－ExtJS without javascript]]></title><link>http://club.muchool.com/EasyJWeb/topic_52.htm</link><description><![CDATA[       新年刚过，EasyJWeb发布了1.1版本，该个版本主要于EasyJWeb的Ajax支持功能进行了加强，并在EasyJWeb 扩展项目中提供一套Rich Component实现，同时对上一版本中存在的一些Bug及网友们提的一些功能进行完善及改进。
 由于之前用ExtJS做了几个项目，并且给大家开源了一个wlr.easyjf.com，而大峡同学尽然把我提供的wlr.easyjf.com开源版本用java重写了一遍，让我费尽心思写的那些javascript效果都消失了，感到惊叹的同时又有点可惜。
 对于很多正在为学ExtJS的朋友们来说，EasyJWeb 1.1的推出可以算是一个非常好的消息，只需要写java代码，就能给你的Java EE应用穿上艳丽的ExtJS外套。想起Rod的“J2EE　without EJB”，我发现用“Ext without javascript”来形容EasyJWeb 1.1中的Rich Componet非常适合。
 废话不多说，下面让我们直接进入EasyJWeb 1.1的快速体验吧。
 
 下载EasyJWeb 1.1，地址：

easyjweb-1.1.zip   22.0M 有依赖包
easyjweb-1.1-without-dependencies.zip  5.42M 无依赖包 

 2、解压下载的文件，切换进命令进入EasyJWeb1.1主目录的bin目录，如下图所示：
 3、执行easyjweb project d:\test\demo –extjs，将会在d:\test\demo中生成一个空的项目。
 4、在Eclipse中导入刚才用命令建立的demo项目。
 5、在myapp.action中添加一个SimpleAction，继承RichComponetAction
 6、添加一个方法doGrid，代码如下：
 public Page doGrid() {
  ViewPort view = new ViewPort();
  GridPanel grid = new GridPanel("grid", "数据表格",500,100);
  grid.setColumns(new String[]{"id","姓名","出生日期","email"});  
  view.add(grid);  
  this.addComponent(view);
  return  componentPage;
  }
 7、然后使用命令行切换到d:\test\demo\bin 目录，输入easyjweb war
 8、把生成的demo.war文件拷到tomcat的webapps目录，启动tomcat。
 9、使用http://localhost:8080/mini/simple.ejf?cmd=grid
]]></description><author>『楊^ò^超』</author><slash:comments>1</slash:comments><pubDate>Fri, 15 Aug 2008 13:47:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:47:00 GMT</dcterms:modified></item><item><title><![CDATA[BugFree修改记录]]></title><link>http://club.muchool.com/BugFree/topic_51.htm</link><description><![CDATA[摘要：BugFree的修改记录。

关键词：BugFree,changelog,ADO,PHP,smarty,Email,0.3,notice,开源,修改记录

BugFree Version 1.1 (2007-01-01)
NEW: 增加了统计报表功能。我们采用了FusionChart的解决方案，采用Flash来绘制图表，这样对安装BugFree的机器就没有什么限制了。 
FIX: 后台管理添加项目无法及时看到的问题。 
FIX: 添加项目点击“保存”在firefox下面没有响应的问题。 
FIX: BaseURL变量采用HTTP_HOST变量，而不是SERVER_NAME 
FIX: ResolveBug.tpl中第31行的错误。 
FIX: bugGetUserACL(): 如果没有项目，而且是管理员，可以进入后台进行管理。普通用户则进入登录页面。 
FIX: BugProject没有添加日期。 
FIX: BugModule的添加日期没有。 
FIX: 新加项目列表没有及时刷新。 
BugFree Version 1.0 (2005-10-08)
New：在项目一级增加权限管理！BugFree的主要功能已添加完毕，成为非常完整的Bug管理工具，故版本升级为1.0！ 
New: 可以自定义查询结果的显示字段 
New: 界面优化，可方便的把左栏和右上栏隐藏，腾出最大的显示区域给查询结果和Bug显示 
New: 查询列表页面优化，调整了配色方案，增加了颜色区分，点击时加重背景。 
New: 增强后台管理的功能 
New: 发送邮件的时候，显示用户的真实姓名。 
New: build版本可以从已有的记录中选择。 
New: 修改了sql查询的错误提示方式，使之更加友好。 
New: 显示当前用户的名称。 
New: 调整了配置文件的结构，使之更加明确。 
New: 启用新的Logo。 
Fix: Bug严重程度恢复到纯数字显示 
Fix: 可以查询某些域（比如AssignTo）的值为空的Bug 
Fix: 去掉现在每个文件中的CVS Log信息，尽可能的减少BugFree的体积 
Fix: 去掉Install.php导致的潜在安全隐患 
Fix: 解决Bug系统的Cookie变量与其他系统冲突 
Fix: 解决一个执行Install.php时候，安装程序js脚本报错的问题 
Fix: 快捷键的表示采用windows的传统方式() (鸣谢网友.NetCobra) 
Fix: 查询结果增加默认BugID排序 
Fix: 历史记录按照时间先后顺序排序 
Fix: 标题过长导致列表出现错位的问题解决了 
Fix: 登录页面的问题，样式表在某些情况下不起作用的问题解决了 
Fix: BugFree描述里面可以包含单引号了 
Fix: BugFree描述里面可以添加程序代码了。 
Fix: 标题里面含有网页代码也可以正常显示了 
Fix: 指派给某个人，指派日期也随之变化 
Fix: 修改了在IIS下面后台管理无法进入的问题。 
Remove: 去掉可视化编辑，为后续的功能开发做准备。 
BugFree Version 0.5 (2005-08-13)
New：支持UTF-8编码！BugFree由此开始支持Unicode，为未来发展打下重要基础 
New：查询结果可以“全部导出”到Microsoft Excel中，然后利用Excel强大的数据统计、图示、打印等功能对Bug进行分析 
New：修改SetupBug.inc.php和Install.php程序，增加BugFree目录和网址两项参数的自定义功能。IIS平台的用户可自己手工更改这两个参数保证BugFree的运行。 
Fix: 后台管理左侧“项目和模块列表”也应该有上下移动的滚动条 
Fix：把FunctionsMain.inc.php开始的php标签改为标准模式。(Thanks to Netelf:ukyo_wlp at 163 dot com) 
Fix：修改bugGetModulePath的定义，去掉强制引用传递。(Thanks to Netelf:ukyo_wlp at 163 dot com) 
Fix：抑制发信失败时的错误信息。 
Fix：修改安装程序生成的配置文件中SmtpAuth变量的错误。 
Team：BugFree开发小组正式成立，详情请访问网站： BugFree开发小组成员 
Thanks：感谢手机之家站长高春辉先生，YouNote站长李梁先生对BugFree的支持。 
BugFree Version 0.4 (2005-07-02)
打造BugFree的新家：http://bugfree.1zsoft.com，BugFree 为【易软开源】网站的一个组成部分，关于【易软开源】网站，请点击此处：www.1zsoft.com 
增强编辑器功能，可以支持可视化的编辑 
改用phpmailer类来增强Email发送功能，windows下面的用户只需一个合法的email地址应该就可以发信了 
增加安装程序，可通过 BugFree/Install.php 来配置系统参数 
整理并完善 BugFree/Document中的文档，新增加了“BugFree常见问题解答(FAQ)”和“BugFree配置参数详细说明” 
修改LIMII -20,20的错误 (特别感谢网友 lixiaoliang@gmail.com 和 panzs@supcon.com) 
修改判断程序路径的方法，以适应虚拟主机的情况 
修改Error_reporting的参数设置 
改用Javascript来控制显示、隐藏框架，无需与服务器进行交互 
解决Bug: 通过左边栏点击“最近5个指派给我的Bug”显示模块信息错误 
Bug激活时，可以重新指派，方便使用 
可以将某个自定义查询的条件发送到某个邮箱地址，以便共享。]]></description><author>『楊^ò^超』</author><slash:comments>1</slash:comments><pubDate>Fri, 15 Aug 2008 13:44:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:45:00 GMT</dcterms:modified></item><item><title><![CDATA[BugFree数据库结构]]></title><link>http://club.muchool.com/BugFree/topic_50.htm</link><description><![CDATA[-- phpMyAdmin SQL Dump
-- version 2.6.2-pl1
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Generation Time: Sep 28, 2005 at 09:03 AM
-- Server version: 4.0.24
-- PHP Version: 4.3.10-15
-- 
-- Database: `BugFree10`
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table `BugFile`
-- 

CREATE TABLE `BugFile` (
  `FileID` int(10) unsigned NOT NULL auto_increment,
  `BugID` mediumint(7) unsigned zerofill NOT NULL default '0000000',
  `FileTitle` varchar(100) NOT NULL default '',
  `FileName` varchar(50) NOT NULL default '',
  `FileType` varchar(10) NOT NULL default '',
  `FileSize` varchar(20) NOT NULL default '',
  `AddUser` varchar(30) NOT NULL default '',
  `AddDate` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`FileID`),
  KEY `BugID` (`BugID`)
) TYPE=MyISAM;

-- 
-- Dumping data for table `BugFile`
-- 

INSERT INTO `BugFile` VALUES (1, 0000001, 'Bug演示', '20040922115157_4895.txt', 'txt', '1.02KB', 'guest', '2004-09-22 11:51:57');

-- --------------------------------------------------------

-- 
-- Table structure for table `BugGroup`
-- 

CREATE TABLE `BugGroup` (
  `GroupID` smallint(5) unsigned NOT NULL auto_increment,
  `GroupName` varchar(60) NOT NULL default '',
  `GroupUser` text NOT NULL,
  `GroupACL` text NOT NULL,
  `LastDate` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`GroupID`)
) TYPE=MyISAM;

-- 
-- Dumping data for table `BugGroup`
-- 


-- --------------------------------------------------------

-- 
-- Table structure for table `BugHistory`
-- 

CREATE TABLE `BugHistory` (
  `HistoryID` int(10) unsigned NOT NULL auto_increment,
  `BugID` mediumint(8) unsigned zerofill NOT NULL default '00000000',
  `UserName` varchar(30) NOT NULL default '',
  `Action` varchar(100) NOT NULL default '',
  `FullInfo` text NOT NULL,
  `ActionDate` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`HistoryID`)
) TYPE=MyISAM;

-- 
-- Dumping data for table `BugHistory`
-- 

INSERT INTO `BugHistory` VALUES (1, 00000001, 'guest', 'Opened', '[步骤]\r\n1.第一步...\r\n2.第二步...\r\n3.第三步...\r\n\r\n[结果]\r\n此处说明当前结果...\r\n\r\n[期望]\r\n此处说明正确的情况...\r\n\r\n[备注]\r\n', '2004-09-22 11:51:57');

-- --------------------------------------------------------
]]></description><author>『楊^ò^超』</author><slash:comments>3</slash:comments><pubDate>Fri, 15 Aug 2008 13:42:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:44:00 GMT</dcterms:modified></item><item><title><![CDATA[BugFree目录文件结构列表]]></title><link>http://club.muchool.com/BugFree/topic_45.htm</link><description><![CDATA[摘要：本文描述了BugFree的目录文件结构，适合于开发人员阅读。

关键词：BugFree,结构,登录,验证,查询,开源

1. 公共文件 /Include
◇ SetupBug.inc.php 
BugFree的公共头文件，被上层PHP文件包含。这个公共头文件中包含配置文件、公共函数、公共类文件以及其他公用信息 
◇ ConfigBug.inc.php 
BugFree的公共配置参数(如数据库访问等) 
◇ FunctionsMain.inc.php 
公共函数集合 
◇ LangFile 
多语言、多样式支持，目前支持中、英文；标准样式和蓝色样式 
*.php文件 
语言文件，一种语言对应一个php文件。 
*.css文件 
样式表文件。因为不同语言的显示效果不同，所以一种语言一种样式对应一个样式表文件。 
◇ Class 
存放公用的类文件如：Html,JS(JavaScript),Page,TreeMenu,ADO,Smarty 
2. 登录退出
◇ Login.php => Login.tpl 登录入口 
显示登录页面(Login.tpl)，调用 FunctionsMain.inc.php 中公用函数 bugJudgeUser判断是否为合法用户， 若是则进入BugFree 主页面 index.php。可以在此页面改变该用户的语言和样式，这些信息被保留在 cookie 中， 以后凡是涉及到信息提示/Email时都会用到语言的设置。 
◇ Logout.php 退出系统 
当用户点击主页面右上角的“退出”时，调用此文件。退出前会提示用户。 
◇ index.php => index.tpl 成功登录以后的主页面 
这是显示的首页面。用到框架(Frame)技术，由以下左、右两个页面组合而成： 
◇ LeftMenu.php => LeftMenu.tpl 主页面的左边框架 
由上部的 ListModule.php 和下部的 UserControl.php 组成。 
◇ RightMenu.php => RightMenu.tpl 主页面的右边框架 
由上部的 QueryBugForm.php 和下部的 QueryBug.php (缺省)组成。这里下部显示动态可变，由 $_SESSION["RightBottomURL"] 确定。 
3. 首页组成部分
◇ ListModule.php => ListModule.tpl 显示项目/模块信息 
首页面的左边框架之上部。分两块：切换查询和创建(QueryBug.php+AddBugForm.php), 项目和模块列表。请注意当点击查询或创建时，项目和模块列表树状列表中的链接地址是自 动变化的，这样在右边框架下部显示查询结果或创建Bug页面。 
◇ UserControl.php => UserControl.tpl 显示当前用户的Bug查询信息 
首页面的左边框架之下部。此处依次显示最近5个指派给用户的、由用户创建的Bug以及自定义的查询条件。 
◇ QueryBugForm.php QueryBugForm.tpl 
首页面的右边框架之上部。显示查询的各种条件。上方是一些命令列表： 帮助、关于 BugFree、检查更新、主页、退出。
首页面的右边框架之下部是动态改变的，根据不同的状态显示不同的文件 --- 查询或Bug的 不同生命周期对应的文件。 
4. Bug操作的相关文件：Bug 的一生：从创建到关闭
◇ AddBugForm.php => AddBugForm.tpl 创建一个新Bug的表单 
当点击首页面左上方的“创建 Bug”链接时，此表单被显示在右边框架之下部。用户在 此输入新Bug的各种信息。特别注意的是，一个新Bug可以同时提交多次给不同的人，从而生 成不同的Bug。这个特性对数据校对、事物跟踪两类问题特别有用。提交时调用AddBug.php。 
◇ AddBug.php 加入一个新Bug 
把用户提交的Bug加入到BugFree系统中。若是指派给多个人，则生成多个 Bug。并将这 个Bug的变化信息发Email通知给被指派人和发信通知人。加入后调用 BugInfo.php。 
◇ BugInfo.php => BugInfo.tpl 显示一个Bug信息 
显示一个Bug的所有信息，此时可以编辑(EditBugForm.php)、解决(Resolve这个Bug。 
◇ EditBugForm.php => EditBugForm.tpl 编辑一个Bug的信息 
编辑一个Bug的所有信息。提交时调用 UpdateBug.php。 
◇ UpdateBug.php 更新一个Bug的信息 
把一个Bug的信息更新到系统中，并返回 BugInfo.php。 
◇ ResolveBug.php => ResolveBug.tpl 解决一个Bug 
解决一个Bug，选定七个解决方案中的一个。完了返回BugInfo.php。此时可以关闭或者 激活(CloseBug.php & ActivateBug.php)这个Bug。 
◇ ActivateBug.php => ActivateBug.tpl 激活一个Bug 
激活一个Bug，表示你不同意这个Bug的解决方案。一个Bug 只有在被解决后或关闭后才 可以被激活。 
◇ CloseBug.php => CloseBug.tpl 关闭一个Bug 
关闭一个Bug，意味着Bug生命的终结。此后用户可以激活这个Bug，表示这个Bug又重现 了，也可以继续编辑这个Bug。 
5. 查询功能的文件
◇ QueryBug.php => QueryBug.tpl 查询符合条件的Bug 
系统中查询符合条件的Bug的集中处理地方。有以下几种情况： * 查询模式下，点击左边 [项目和模块列表 ] 中某项，查询指定项目和模块的Bug * 执行 [我自定义的查询条件] 中的某个用户自定义查询 * 用户点击查询窗口中，OpenedBy、AssignedTo、Resolved、Status等任一项 * 用户通过 QueryBugForm.php 定义的查询条件 
◇ SaveQuery.php => SaveQuery.tpl 保存用户定义的查询条件 
当前用户点击 QueryBugForm.php 上的[保存查询]时调用此文件。 
◇ DelQuery.php 删除一个用户定义的查询条件 
点击左下方UserControl.php 上的[删除]按钮时，调用此文件以删除一个用户定义的查询条件。 
6. Email自动通知功能相关文件
◇ NoticeBug.php => NoticeBug.tpl 发信通知每个用户的Bug情况 
所有没有关闭的Bug按照AssignedTo排序，列举每个用户当前头上的Bug数。可以定期执 行这个文件以通知所有头上有Bug的用户加快处理进度，比如每天早上8:00am执行。 
◇ StatBug.php => StatBug.tpl 发信给所有人告知当前Bug统计情况 
可以定时执行这个文件，比如每周一上午12:00。这样BugFree中所有的用户都会收到一 封统计Bug情况的信件：(1)上周Bug情况 (2)到目前为止所有Bug情况 
7. 后台管理
◇ index.php => index.tpl 入口文件 
此文件是登录到后台管理的入口文件。 
◇ AdminMenu.php => AdminMenu.tpl 后台管理菜单 
显示在后台管理页面的左侧，主要列出两类事情的管理：用户管理、项目和模块的管理。 
◇ ManageProject.php => ManageProject.tpl 管理项目的信息 
可以添加或编辑一个项目，以及给它添加一个新模块。 
◇ ManageModule.php => ManageModule.tpl 管理模块的信息 
可以编辑当前模块，或添加一个新的子模块。 
◇ ListBugUser.php => ListBugUser.tpl 列举BugFree的用户 
此处是简单后台用户管理的入口。 
◇ AddBugUser.php => 添加一个BugFree的用户 
当管理员通过ListBugUser.php来添加一个用户时，调用此文件来完成添加。 
◇ DelBugUser.php => 删除一个BugFree的用户 
当管理员通过DelBugUser.php来删除一个用户时，调用此文件来完成删除。 
]]></description><author>『楊^ò^超』</author><slash:comments>1</slash:comments><pubDate>Fri, 15 Aug 2008 13:39:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:40:00 GMT</dcterms:modified></item><item><title><![CDATA[BugFree快速使用入门]]></title><link>http://club.muchool.com/BugFree/topic_43.htm</link><description><![CDATA[摘要：本文旨在介绍如何使用BugFree，这是一个比较简单的版本，比较详细的说明陆续推出。

关键词：BugFree,开源,使用说明,项目,查询,解决,关闭,Resove,Fixed

假定你把BugFree安装在 http://www.yourcom.com/BugFree
1. 添加项目及模块 (BugFree的后台管理)
请访问http://www.yourcom.com/BugFree/Admin/index.php，你可以添加一个新的项目，项目文档库和进度文件处请填写该项目(产品)对应的文档及进度链接，可以为空。 
一个项目添加后，可以为该项目“添加模块”，一个项目可以有多个模块，每个模块又可以分为多个子模块。 
作为示例，BugFree中缺省建立了“BugFree”项目，其中包含了很多模块。 
2. Bug管理
请访问http://www.yourcom.com/BugFree，你就可以看到BugFree的真面目了。 
2.1 左侧栏 
2.1.1 切换查询和创建 
2.1.1.1 查询模式：你可以设定不同的查询条件，寻找你想找的Bug们。 
2.1.1.2 创建 Bug：新建一个Bug，是Bug生命的开始。注意你必须要选定该Bug对应的模块。 填写完相关的Bug说明后，点击“创建 Bug”按钮即宣告一个Bug的诞生。 
2.1.2 项目及其模块的列表：你选择不同的项目，系统会自动列出其下属的模块。 
2.1.3 项目文档和项目进度分别对应BugFree的后台管理中添加的两个链接。 
2.1.4 最近5个指派给我的 Bug：此处列出分派给你的最近五个没有被关闭(终止生命)的Bug。 
2.1.5 最近5个由我创建的 Bug：此处列出你最近新建的五个没有被关闭(终止生命)的Bug。 
2.1.6 我自定义的查询条件：你可以在【Query Bug (查询Bug)】中把查询条件起个名字永久保留起来，这里将会显示出所有你个人定义的查询条件。 
2.2 右侧栏 
2.2.1 页面组成 
一是缺省显示的查询页面，上面显示查询条件、下面显示查询出来的符合条件的Bug们； 二是点击一个Bug时，右栏显示该Bug的所有信息。 
2.2.2 查询 
查询你可以根据自己需要，选择不同的查询条件，比如查找 
Bug ID(Bug编号) Smaller Than (小于) 100 下面就会倒序显示所有ID号小于100的Bug们。 
2.2.3 保存查询 
你也可以选择“Save Query(保存查询)”，给这次定义的查询命名永久保存起来，然后就可 以在【左栏】的“您自定义的查询条件”中随时使用这个查询。 
2.2.5 一个Bug的处理过程 
新建一个Bug后，或者查询出符合条件的Bug们点击一个后，【右栏】显示该Bug详细信息。 在中间的四个Action按钮，你可以： 
2.2.5.1 Edit(编辑) 
该动作允许你改动这个Bug所有可以改动的信息。最常见的是把这个Bug指派给(Assign To)某同事，同时在描述信息中加上你的新注释。 
2.2.5.2 Resolve(解决) 
一个Bug有7种解法： 
By Design - 就是这么设计的，无效的Bug 
Duplicate - 这个问题别人已经发现了，重复的Bug 
External - 是个外部因素(比如浏览器、操作系统、其他第3方软件)造成的问题 
Fixed - 问题被修理掉了。Tester要尽可能找到这种Bug 
Not Repro - 无法复现你这个问题，无效的Bug 
Postponed - 是个问题，但是目前不必修理了，推迟到以后再解 
Won't Fix - 是个问题，但是不值得修理了，不管它吧 
2.2.5.3 Close(关闭) 
当一个Bug被解决之后，如果当初上这个Bug的 Tester同意此解法，则关闭这个Bug。意 味这个Bug生命周期的终结。 
2.2.5.4 Activate(激活) 
如果Tester不同意该Bug的解法，则可激活之。该Bug会自动被指派给当初解决(Resolve) 的同事，当然你在激活的时候应该写上为什么你这么做，让别人明白你激活它是由道理的。 
3. BugFree使用过程中常见的问题
3.1 不能正确的改变Bug状态 
一个Bug只有3种状态：Active、Resolved、Closed。实践中经常有不熟悉的同事通过“编辑 (Edit)”来改变所有的状态，那是不合适的。 正确的状态转换方法应该是：

某个状态自己到自己的改变，使用“编辑 (Edit)”。比如一个Active的Bug，从一个人指派到另外一个人； 
Active -> Resolved 只能用“解决 (Resolve)”； Resolved -> Closed 只能用“关闭 (Closed)”； 
Resolved -> Active 和 Closed -> Active 只能使用“激活 (Activate)” 
3.2 没有正确的设置项目/模块 
上Bug的时候没有选择所属的项目/模块，仅使用缺省的当前项目/模块。 
3.3 没有正确的设置严重程度 
应该明确各项目中严重程度1、2、3、4分别代表哪些类型的缺陷，分门别类去设置。 
3.4 不能正确的设置解决方案 
解决一个Bug的时候，一共有7种不同的解决方案。需要根据这个Bug的具体情况来设置。 ]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Fri, 15 Aug 2008 13:39:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:39:00 GMT</dcterms:modified></item><item><title><![CDATA[BugFree配置参数详细说明]]></title><link>http://club.muchool.com/BugFree/topic_42.htm</link><description><![CDATA[摘要：如何配置BugFree，包括如何修改数据库的连接参数、如何成为管理员、如何配置Email、如何增加上传附件大小等等。

关键词：BugFree,配置,数据库,用户名,密码,管理员,Email,开源

﻿<?php 
/** 
* bugfree的版本号，请不要修改。 
*/ 
$BugConfig["Version"]          = 0.4; 

/** 
* 连接BugFree数据库的用户名和密码。 
*/ 
$BugConfig["BugDB"]["User"]     = "root"; 
$BugConfig["BugDB"]["Password"] = ""; 
$BugConfig["BugDB"]["Host"]     = "localhost"; 
$BugConfig["BugDB"]["Database"] = "BugFree"; 

/** 
* 用户验证数据库的用户名和密码。 
* BugFree的验证表有两种选择： 
* 1、 使用BugFree自身的BugUser表。 
* 2、 使用其他的系统的用户表，比如已经安装好的论坛。这种验证方式需要讲下面的几行注释去掉。 
*/ 
//$BugConfig["UserDB"]["User"]     = "root"; 
//$BugConfig["UserDB"]["Password"] = ""; 
//$BugConfig["UserDB"]["Host"]     = "localhost"; 
//$BugConfig["UserDB"]["Database"] = "BugFree"; 

/** 
* 定义验证表对应的字段。如果使用BugFree自身的验证表，无需修改。 
* 如果使用其他的系统，则需要修改对应的字段。注释后面的是phpbb论坛的配置： 
*/ 
$BugConfig["UserTable"]["TableName"]     = "BugUser";      //phpbb里面的用户表是phpbb_users 
$BugConfig["UserTable"]["UserName"]      = "UserName";     //phpbb_users表里面对应的用户名字段是：username 
$BugConfig["UserTable"]["RealName"]      = "RealName";     //phpbb_users表里面没有对应的真实姓名的字段，可以设为username 
$BugConfig["UserTable"]["UserPassword"]  = "UserPassword"; //对应user_password 
$BugConfig["UserTable"]["Email"]         = "Email";        //对应user_email 
$BugConfig["UserTable"]["EncryptType"]   = "md5";          //加密方式选择md5。text:明文 mysqlpassword：mysql自带的password函数加密。 

/** 
* 管理员列表。一定要注意引号和逗号的间隔。 
*/ 
$BugConfig["AdminUser"] = array("wangcs","你的用户名"); 

/** 
* 支持的语言列表，现在有英文和中文两种。请不要修改。 
*/ 
$BugConfig["LangList"]["English"] = "English"; 
$BugConfig["LangList"]["Chinese"] = "Chinese"; 

/** 
* 默认的语言。 
*/ 
$BugConfig["DefaultLang"] = "Chinese"; 

/** 
* 可用来查询的字段的数量，会影响查询表单页面。请根据实际需要进行修改。 
*/ 
$BugConfig["QueryFieldNumber"] = 3; 

/** 
* 是否显示查询条件。true|false 
*/ 
$BugConfig["ShowQuery"] = true; 

/** 
* 每页显示的记录数量。 
*/ 
$BugConfig["RecordPerPage"] = 20; 

/** 
* 一次可以最多添加多少个文件。默认配置是两个，1,3则表示一次可以最多添加三个。 
*/ 
$BugConfig["File"]["MaxAddFilesCount"] = range(1,2); 

/** 
* 对系统存在威胁的文件类型扩展名。比如用户提交了一个aaa.php文件，会自动改名为aaa.php.txt 
*/ 
$BugConfig["File"]["DangerousTypeList"] = array("php","php3","php4","cgi","pl","py","asp","jsp"); 

/** 
* 在AddBugForm.tpl模板中和bugAddFile()函数需要的文件选择框变量的名字。 
*/ 
$BugConfig["File"]["BugFileName"] = "BugFileName"; 

/** 
* 上传附件存储的目录。linux系统下面，权限必须为o=rwx。ntfs分区也要添加读写权限。 
*/ 
$BugConfig["File"]["UploadDirectory"] = "BugFile"; 

/** 
* 可以上传文件的大小限制，默认是100KB。 
*/ 
$BugConfig["File"]["MaxFileSize"] = 1024 * 100; 

/** 
* 是否打开email发送功能。true|false 
*/ 
$BugConfig["Mail"]["On"]   = true; 

/** 
* 发信的地址：可以根据自己的实际情况进行修改。 
*/ 
$BugConfig["Mail"]["FromAddress"] = "bugfree@{$_SERVER["SERVER_NAME"]}"; // 可以改成bugfree@xxx.com.net 
$BugConfig["Mail"]["FromName"]    = "BugFree";                           // 发信人的名字，可以改成“精灵”等等。 

/** 
* 定义发信的方式： 
* MAIL:通过php内置的mail函数发信。 
* SENDMAIL:通过sendmail发信。 
* SMTP:通过smtp连接发信。 
* QMAIL:通过qmail进行发信。 
*/ 
$BugConfig["Mail"]["SendMethod"] = "SMTP"; "MAIL|SENDMAIL|SMTP|QMAIL"; 

/** 
* 如果选择的是smtp方式，需要设置smtp服务器的地址，如果smtp服务器发信需要验证，则需将SMTPAuth设成true，并设定用户名和密码。 
*/ 
$BugConfig["Mail"]["SendParam"]["Host"]     = "smtp.263.net";      //The server to connect. Default is localhost 
$BugConfig["Mail"]["SendParam"]["SMTPAuth"] = true;                //Whether or not to use SMTP authentication. Default is FALSE 
$BugConfig["Mail"]["SendParam"]["Username"] = "";                  //The username to use for SMTP authentication. 
$BugConfig["Mail"]["SendParam"]["Password"] = "";                  //The password to use for SMTP authentication. 

/** 
* 发送Bug统计信息到哪个地址，如果为空，则发送到所有的昂户。当然你也可以指定一个email地址。 
*/ 
$BugConfig["Mail"]["To"] = array(); 
?> 
]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Fri, 15 Aug 2008 13:38:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:38:00 GMT</dcterms:modified></item><item><title><![CDATA[BugFree常见问题解答(FAQ)]]></title><link>http://club.muchool.com/BugFree/topic_41.htm</link><description><![CDATA[摘要：本文讲述了BugFree安装使用过程经常遇到的问题及其解决方案。

关键词：BugFree,FAQ,PHP,apache,易软,开源,LIMIT,notice,warnning,SMTP,管理员

BugFree的含义是什么？ 
1. 我们希望可以通过BugFree为您的软件开发起到一定的帮助，有效的跟踪解决开发中所遇到的Bug.
2. BugFree自身是开源且免费的，您可以随意使用。

1zsoft.com 是什么意思？ 
这个地方是数字的 “1” ，而并非是字母“L”， 1zsoft的含义是easy soft 的谐音，中文翻译是"易软"
BugFree是"易软开源"网站的一个组成部分，关于易软开源网站，请访问 http://www.1zsoft.com 

为什么点击一个还没有提交Bug的模块，会出现LIMIT -20,20的错误？ 
原因：Page.class类的limit()方法对记录总数为零的情况判断不好，导致出现这个问题。
解决：请升级到最新的版本以解决这个问题。

如何配置BugFree可以发信？ 
请参照《BugFree配置文件详细说明》

我是不是必须安装SMTP服务器才能使用BugFree的自动发信功能呢？ 
并不是必须的，你可以使用其他的smtp服务器，只要它允许你可以访问就可以了。换句话讲，只要你有一个合法的email账号， 就可以使用BugFree的自动发信功能。

BugFree的7种解决方案各自的含义是什么？ 
By Design - 就是这么设计的，无效的Bug
Duplicate - 这个问题别人已经发现了，重复的Bug
External - 是个外部因素(比如浏览器、操作系统、其他第3方软件)造成的问题
Fixed - 问题被修理掉了。Tester要尽可能找到这种Bug
Not Repro - 无法复现你这个问题，无效的Bug
Postponed - 是个问题，但是目前不必修理了，推迟到以后再解
Won't Fix - 是个问题，但是不值得修理了，不管它吧

如何成为管理员？ 
打开Include/ConfigBug.inc.php文件:
$BugConfig["AdminUser"] = array("admin","你的用户名");
要注意引号和逗号的间隔。 

我的BugFree安装完了之后中文界面全是乱码 
1. 如果你安装的apache版本是2.0系列的，请修改httpd.conf文件， 将AddDefaultCharset ISO-8859-1 改成 AddDefaultCharset GB2312
2. 你曾经修改Include/LangFile/的语言文件，保存的时候没有按照原来的文件类型进行保存。请换一个编辑器重新打开，然后保存一下。
3. 你曾经修改过Docuemnt/BugFree.sql文件，也导致了上面相同的问题。建议使用phpmyadmin将BugFree数据库里面的记录清空，然后 通过BugFree自带的改理后台建立初始的项目和模块。 

BugFree有没有windows或者linux下面的版本？ 
BugFree是用php编写的，而php是跨平台的，所以只要你的平台支持php，BugFree就可以使用。曾经有一位网友给我们发信说 他成功的在MAC的系统上面配置了BugFree，而且非常稳定。

BugFree可以在IIS下面运行吗？ 
可以，但我们没有做过详细的测试。

如何下载BugFree？ 
请到我们的网站进行下载：http://bugfree.1zsoft.com

如何增加上传附件的大小? 
修改ConfigBug.inc.php文件。
$BugConfig["File"]["MaxFileSize"] = 1024 * 100; //注意单位是字节。 

为什么提示“服务器繁忙”？ 
请检查你的配置文件ConfigBug.inc.php里面连接数据库的参数是否正确。

你们是使用什么编辑器来编辑PHP的？ 
我们使用的是UltraEdit-32。

为什么我在局域网装好了BugFree之后，同局域网里面的机器无法访问呢？ 
请修改你的httpd.conf配置文件，将其中的ServerName改成你的机器的IP地址。

提示找不到文件:'ADO/adodb.inc.php' 
请升级到最新的版本来解决这个问题。

为什么我登录以后老是报错呢？Warning: session_start(): 
请检查你的php.ini文件，其中有一项为session.save_path，确保这个目录存在，并且可读可写可执行。

Warning: Call-time pass-by-reference has been deprecated 
请修改你的php.ini文件，将allow_call_time_pass_reference 设成 "On"

unable to read resource: "Login.tpl" 
请升级到最新的版本来解决这个问题，如果问题还是存在，请修改SetupBug.inc.php文件:
$TPL->template_dir = $BugConfig["ScriptDir"] . "/" . 'Template';
$TPL->compile_dir = $BugConfig["ScriptDir"] . "/" . 'Compile'; 
将上面路径改成绝对路径，如果windows下面，可以这样写：d:\\BugFree\\Template; 

BugFree支持不支持php5 
支持

Notice: Undefined index: BugUserName 
请升级到最新的版本来解决这个问题

我在这个地方没有找到答案？ 
如果在这个地方还没有找到你的的答案，你可以到我们的论坛提出你的问题。 http://bugfree.1zsoft.com
强烈建议你在提问之前，使用搜索功能，看看你的问题有没有得到解答。
在你决定提问之前，强烈建议你首先阅读 《提问的智慧》 

]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Fri, 15 Aug 2008 13:37:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:37:00 GMT</dcterms:modified></item><item><title><![CDATA[BugFree安装升级说明]]></title><link>http://club.muchool.com/BugFree/topic_40.htm</link><description><![CDATA[摘要：本文详细讲述了如何安装BugFree，包括快速安装步骤和详细的安装步骤，还讲述了安装过程中需要注意的问题。 
关键词：BugFree,安装说明,Install,开源,linux,windows,apache,php,mysql

在阅读此文章之前，请先阅读文档索引，以便对BugFree有比较全面的了解。 
快速安装 
系统要求 
详细安装步骤 
Windows平台下面的安装 
升级到0.5版本 
升级到1.0版本 
1. 快速安装
如果你对apache,php,mysql比较熟悉，可以通过下面的步骤进行快速的安装。比较详细的安装步骤请参照 3 ，如果你选择在windows平台下面进行安装，可以参照步骤 4 。

1.1 下载BugFree 
请到http://bugfree.1zsoft.com下载最新的BugFree版本 
1.2 解压缩BugFree文件，上传到服务器的某个目录 
请选择合适的解压缩程序解开BugFree发行包，然后通过FTP软件上传到服务器的某个目录，此目录通过http协议可以访问 
1.3 修改目录的权限 
上传之后，必须修改几个目录的权限：

linux平台下面：chmod o=rwx Compile BugFile 
windows平台下面，如果BugFree所在的目录分区为NTFS分区，也需要增加读写的权限。 
1.4 访问install.php页面，生成ConfigBug.inc.php文件 
访问http://xxx.com/BugFree/install.php页面，根据页面提示填写参数，生成BugFree的配置文件， 将其保存到Include目录下面，命名为ConfigBug.inc.php文件。 
1.5 用管理员账号登录，建立初始的项目，建立权限系统。 
使用在1.4步骤里面建立的管理员账号登录，点击页面右上部的“管理”菜单进入后台管理，建立项目、模块，添加用户组，添加用户就可以了。 
2. 系统需求
操作平台不限，推荐使用linux，以获得更好的性能 
一台提供web服务的服务器，推荐使用apache 1.3系列的最新版本 
MySQL (3.22 or higher)，推荐使用4.0系列的最新版本，4.1系列还有待测试 
PHP>4.0，支持MySQL数据库，推荐使用4.3系列次最新版本。 
3. 详细安装步骤
3.1-3.3下载BugFree，上传到服务器，修改目录的读写权限 
请重复1.1,1.2,1.3这三个步骤 
3.4 创建数据库 
需要创建一个数据库来保存BugFree相关的表。比如可以创建一个名为BugFree的数据库。
你可以通过命令行来建立，命令如下：
mysql> create database BugFree;
也可以使用phpMyAdmin来建立此数据库。 
3.5 为BugFree 库分配访问权限。默认的可以使用root帐号。 
命令行如下：
mysql> GRANT ALL PRIVILEGES ON BugFree.* TO UserName@localhost IDENTIFIED BY 'Password' WITH GRANT OPTION;
上面的UserName和Passowrd请分别换成你自己的用户名和密码。
也可以使用phpMyAdmin来建立此数据库。 
3.6 建立各个表 
3.6.1 使用phpMyAdmin. 
选择BugFree库，然后选择SQL，然后选中Document目录下面的BugFree.sql，执行就可以了。 
3.6.1 使用命令行 
将Document目录下面的BugFree.sql文件拷贝到你的服务器上的某个目录下面。
mysql -u UserName -p Password BugFree < 路径/BugFree.sql
其中的UserName和Password换成刚才设定的用户名和密码。BugFree.sql要写成完整的路径。 
3.7 修改配置文件Include/ConfigBug.inc.php 
请按照BugFree参数配置文件说明文件里面的说明配置参数文件 
3.8 重复1.5步，建立初始的项目模块 
这样安装，系统会自动创建一个管理员账号为admin,密码为123456 
3.9 配置自动发信程序 
3.9.1 定时脚本功能说明 
Shell下面共有四个脚本程序，分别为NoticeBug.php, NoticeBug.sh, StatBug.php, StatBug.sh。
NoticeBug脚本用于每天给相关人员发信，通知各自的头上还有多少个bug等待处理。
StatBug一般用在周一的时候，给相关人员发信，汇报上个礼拜的Bug统计数据。

3.9.2 调用方式 
NoticeBug.php和NoticeBug.sh功能是一样，只是执行的方式不一样而已，StataBug也是如此。
.php脚本执行方式：
your/path/to/php your/path/to/NoticeBug.php
比如：linux平台：# /usr/bin/php /your/path/to/NoticeBug.php
windows平台：d:\php\php.exe d:\bugfree\Shell\NoticeBug.php
.sh结尾的脚本只用于linux平台，使用之前需要增加文件的执行权限：
# chmod 700 NoticeBug.sh
然后直接执行就可以了。 
3.9.3 修改Shell目录的读写权限。 
linux平台下面可以通过 chmod 700 Shell -R 命令来取消其他用户的读写权限， 或者你可以把Shell目录移到网站目录之外，防止其他用户可以直接通过浏览器访问这个目录。 
3.9.4 修改用户名和密码。 
打开某个脚本文件，设置某个在BugFree上面的用户名和密码。 
3.9.5 建立定时程序 
linux平台通过cron程序来建立。
windows平台通过定时程序来建立。
我们的应用实例：NoticeBug每天早上8点执行，StatBug每周一中午12点执行。 
4. Windows平台上面的安装步骤
考虑到很多网友以前没有接触过apache+php+mysql这样一种组合，安装起来会遇到很多的困难，我们单独说明一下windows平台 下面的BugFree的安装。 
4.1 安装Apache + Mysql + PHP 组合套件 
在我们以前的文档里面是推荐使用EasyPHP来安装这三个软件，可是EasyPHP改动了许多PHP的默认配置，给很多初次接触AMP 的网友带来很多麻烦。因此我们从本版本开始推荐使用GreenAMP 050123版套装。

4.1.1 GreenAMP介绍 
http://chin.blogchina.com/604819.html 
4.1.2 GreenAMP下载 
点击此处进行搜索 注意，一定要下载050123版本的。 
4.1.3 GreenAMP的安装 
将GreenAMP解压缩到一个目录下面，推荐解压缩到D:\greenamp目录下面，然后双击“启动GreenAMP.bat”这个文件。中间可能会有警告报错， 不用管它。 
4.1.4 如何启动GreenAMP 
安装之后会apache 和 mysql自动成为系统的服务，开机的时候会自动运行，如果没有运行，请双击"启动GreenAMP.bat"文件。 
4.2 安装BugFree 
GreenAMP已经自带了phpmyadmin，你可以通过http://localhost/phpmyadmin/来管理数据库，用户名默认为root，密码为空。然后按照上面讲述的步骤 1 或者 3 进行安装就可以了。 
]]></description><author>『楊^ò^超』</author><slash:comments>1</slash:comments><pubDate>Fri, 15 Aug 2008 13:36:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:36:00 GMT</dcterms:modified></item><item><title><![CDATA[关于BugFree]]></title><link>http://club.muchool.com/BugFree/topic_37.htm</link><description><![CDATA[摘要：本文通过讲述我在方正、微软和西线三个公司的工作经历，向读者描述BugFree的来龙去脉。

关键词：BugFree,微软,Raid,Product Studio,SharePoint,方正,php,Bug,项目管理,开源,C++

1. BugFree 简介
1.1 BugFree的来源 
BugFree是借鉴微软的研发流程和Bug管理理念，使用PHP+MySQL独立写出的一个Bug管理 系统。简单实用、免费并且开放源代码(遵循GNU GPL)。
如何有效地管理软件产品中的 Bug，是每一家软件企业必须面临的问题。遗憾的是很多软件企业还是停留在作坊式的研发模式中，其研发流程、研发工具、人员管理不尽人意，无法有效的保证质量、控制进度，并使产品可持续发展。
针对这个问题，我们独立做出了 BugFree，并且半年多来每天都在使用。我们公司就是用它来管理Bug，不断提高产品质量的:-) 
1.2 BugFree名称的含义 
命名BugFree 有两层意思：一是希望软件中的缺陷越来越少直到没有，Free嘛；二是表 示它是免费且开放源代码的，大家可以自由使用传播。 
1.3 为什么开放BugFree的源代码呢？ 
根据半年多的实践，觉得BugFree非常有用，我们公司的日常工作已经离不开它 了。虽然没有微软的Bug管理系统(以前叫Raid，现在是 Product Studio)的功能那么强大， 但是处理方法和思想是完全一致的，起码我自己用起来的感觉和在微软时基本一样，值得向大家推荐。 
我们是用开放源代码的 PHP+MySQL开发的，目的就是希望跟大家分享BugFree。而 且开放源代码之后，期待高手不断改进它，大家都能用到更加强大的功能。也算为中国的软 件业做点小小的贡献:-) 
BugFree代码在我们的“数字神经系统”中非常独立，很容易拿出来给大家共享。 
1.4 BugFree仅仅是个工具 
不过坦率的讲，BugFree 仅仅是个工具而已，重要的是掌握其中蕴含的软件研发的流程思想，才能用好这个工具。如果你以前没有用过 Bug管理系统，那么一开始的时候也许你会觉得这个工具是在浪费时间，因为一个测试人员需要费神把发现 Bug的详细步骤记录下来， 有时还要贴一张示意图，这一切都不如当面说来得直接。
但是使用一段时间，你会发现 BugFree很有用，它忠实的记录着每个问题的处理过程， 不断提醒你存在的问题，永远不会丢失和忘记。如果你参与过较大软件项目或产品的研发， 就会理解它对软件可持续发展是至关重要的。而且研发的规模越大，BugFree 的作用就会越大。]]></description><author>『楊^ò^超』</author><slash:comments>3</slash:comments><pubDate>Fri, 15 Aug 2008 13:32:00 GMT</pubDate><dcterms:modified>Fri, 15 Aug 2008 13:34:00 GMT</dcterms:modified></item><item><title><![CDATA[x3blog在线技术交流]]></title><link>http://club.muchool.com/x3blog 多用户版/topic_36.htm</link><description><![CDATA[http://bbs.muchool.com/ShowForum.aspx?ForumID=173]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Wed, 06 Aug 2008 12:48:00 GMT</pubDate><dcterms:modified>Wed, 06 Aug 2008 12:48:00 GMT</dcterms:modified></item><item><title><![CDATA[Cocoon简介]]></title><link>http://club.muchool.com/Cocoon/topic_35.htm</link><description><![CDATA[Stefano Mazzocchi于1999年1月创建了Cocoon项目，将其作为ASF之下的开放源代码项目。Cocoon的目标是帮助分离内容格式、逻辑和对基于XML网站的管理功能。Cocoon使用XML, Extensible Stylesheet Language Transformations (XSLT), 以及 Simple API for XML (SAX) 技术，以帮助创建、部署和维护XML服务器应用程序。它支持大多数类型的数据源，包括RDBMS、LDAP和文件系统。在Eclipseh下进行开发的插件 ]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Wed, 06 Aug 2008 10:27:00 GMT</pubDate><dcterms:modified>Wed, 06 Aug 2008 10:27:00 GMT</dcterms:modified></item><item><title><![CDATA[BT搜索引擎TorrentSpy被迫永久关闭]]></title><link>http://club.muchool.com/TorrentSpy/topic_34.htm</link><description><![CDATA[北京时间2008年3月30日消息，据国外媒体报道，由于卷入了一场代价昂贵的法律大战，针对BitTorrent文件共享服务的搜索引擎TorrentSpy将被迫关闭。

　　TorrentSpy发表声明称，该网站关闭并非因为法院裁决或和解协议，而完全是团队的决定。过去两年里，TorrentSpy已经投入数十万美元用于“维护用户和自身的权益”，以抵御对于文件共享不利的法律环境。

　　TorrentSpy管理团队表示：“最终，我们认为法院的要求同我们的隐私政策、传统的法院裁决、以及国际法相抵触。基于这一原因，我们决定采取保护用户隐私的终极措施，即永久关闭网站。”

　　TorrentSpy是一个旨在帮助用户在互联网上查找torrent格式共享文件的搜索引擎。自创建之初，TorrentSpy就遭到了娱乐行业的强烈反对，因为它们不愿意自己的版权内容免费发行。去年12月，美国电影协会(MPAA)在一起针对TorrentSpy的侵权诉讼中获得了胜利。 TorrentSpy则坚称，该网站并不包含任何版权内容或相关链接，也没有推动侵权行为，因此不能为访问者离开TorrentSpy之后的行为负责。]]></description><author>水月·静夜思</author><slash:comments>0</slash:comments><pubDate>Sun, 06 Jul 2008 23:00:00 GMT</pubDate><dcterms:modified>Sun, 06 Jul 2008 23:00:00 GMT</dcterms:modified></item><item><title><![CDATA[Asp.Net Forums2配置文件(web.config)简要说明]]></title><link>http://club.muchool.com/Asp.Net Forums 2/topic_33.htm</link><description><![CDATA[主要部分：
<forums 
            defaultProvider="SqlForumsProvider"     // 要使用的数据提供者类
            defaultLanguage="zh-CN"                      // 网站使用的默认语言
            forumFilesPath="/"                                 // 论坛根路径
            disableEmail="true"                                 // 是否禁用邮件发送,依附于disableThreading
            disableIndexing="false"                          // 是否禁用索引(要使用搜索功能,必须启用)
                                                                             // 依附于disableThreading    
            disableThreading="false"                      // 是否禁用后台线程运行
            threadIntervalStats="15"                       // 后台帖子索引运行间隔时间(分钟)
            threadIntervalEmail="3"                         // 后台邮件发送运行间隔时间(分钟)
            passwordEncodingFormat="unicode"        // 密码编码格式
            allowAutoUserRegistration="false"        // 
            adminWindowsGroup="Administrators"
            assignLocalAdminsAdminRole="false"
            smtpServerConnectionLimit="-1"
            enableLatestVersionCheck="false"        // 允许版本检查
        >
        <add 
            name = "SqlForumsProvider"             // 使用Sql Server数据提供者类
            type = "AspNetForums.Data.SqlDataProvider, AspNetForums.SqlDataProvider" 
                                                                     // Sql Server数据提供者类的程序集
            connectionString = "server={0};database={1};uid={2};pwd={3}"
                    // {0}数据库服务器名或IP；{1}数据库名称；{2}登录数据库用户ID；
                    // {3}登录数据库密码.
            databaseOwner = "dbo"    // 数据库所有者，dbo或{2}
        />
]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Wed, 02 Jul 2008 13:23:00 GMT</pubDate><dcterms:modified>Wed, 02 Jul 2008 13:23:00 GMT</dcterms:modified></item><item><title><![CDATA[sakai配置(中文版)(四)]]></title><link>http://club.muchool.com/Sakai/topic_32.htm</link><description><![CDATA[6. 开始使用 sakai 
到此为止，你的安装已经和配置已经基本完成，现在可以开始使用 sakai 了，在这里不打算详细讲解 sakai 的使用细节，只是做一个入门的说明，详细使用细节可以参考其他文档。 
6.1. Gateway 页（ The Gateway page ） 
tomcat 成功启动后，通过 http://localhost:8080/portal ，你可以访问到 sakai 的 gateway 页面，通过 gateway 页，你可以注册一个新的账号，或者浏览公共站点内容。你可以用刚刚注册的账号登录，也可以用一个管理员的账号登录进行操作， sakai 提供一个缺省的管理员账号： admin ，密码也是 admin 。 
6.2. 我的工作区（ My Workspace ） 
每个用户（包括 admin ）都有一个私人工作区（ site ）叫我的工作区（ My Workspace ），在左上角可以看到这个 tab ，在这个 tab 下面（左边）是去到各种不同工具页的链接， admin 的 My Workspace 比其他类型的账号有更多不同的选项，但是不同类型的账号都可以通过不同的模版来自定义不同的工具页链接。详见以下的说明。 
6.3. 其他站点（ Other Sites ） 
如果用户还有其他站点（可访问的），将在顶部的 tab 中， My Workspace 的右边依次显示出来。对大多数用户而言，初始只有一个站点— My Workspace ，管理员用户有两个站点，除了自己的 My Workspace 外，还有一个 Administration Workspace 。但是这个站点看上去和 My Workspace 的内容完全相同。这是因为你有可能会想让其他一些特定用户可以使用某些管理工具，但不能让他访问 admin 用户的个人工作区（ My Workspace ），所以，为了容许特定用户使用管理工具时，只需将该用户加入 Administration Workspace 的用户列表中，然后授予他们“ admin ”的角色即可。 
6.4. 管理工具（ Admin Tools ） 
6.4.1 . 创建用户 
你想做的第一件事可能就是修改 admin 用户的密码，并在你的系统中创建一些示例用户。你能在 Users 工具中做这些事情。为了修改 admin 用户的密码，只需点击用户列表中的“ admin ”用户名，在随后出现的页面中修改即可。为了创建用户，只需点击这个页面顶端的“ New User ”链接。 
6.4.2 . 创建站点（ Creating Sites ） 
Sites 工具是一个功能非常强大的建站工具，利用 Sites 工具，可以从头开始建立一个站点，包括对其中每个页面、工具的控制粒度以及细节方面的配置。但是强大的功能是有代价的，因此 Sites 工具最好是用来对一个已经存在的站点进行调整。而不是从头开始创建一个全新的站点。 
这里简单介绍一下如何创建一个站点。点击左边的 Worksite Setup 工具，然后点击这个工具页顶部的 New 链接，为了简单起见，我们选择“ Project ”类型，然后跟随下一步的操作提示选择自己喜欢的配置，最后点击 Create Site 按钮，一个新的站点就创建完了，在页面顶部的 tab 中将显示这个新站点的标签。 
6.4.3 . 增加用户到站点 
刚刚你以 admin 的身份创建了一个新的站点，目前这个站点只有一个 admin 用户，如果你想增加其他具有不同角色的用户，可以通过该站点的 Site Info 工具中的 Add Participants 功能来完成这项工作。注意，这里只能增加已经注册或者创建好的用户。]]></description><author>『楊^ò^超』</author><slash:comments>3</slash:comments><pubDate>Wed, 02 Jul 2008 13:18:00 GMT</pubDate><dcterms:modified>Wed, 02 Jul 2008 13:20:00 GMT</dcterms:modified></item><item><title><![CDATA[ sakai配置(中文版)(三)]]></title><link>http://club.muchool.com/Sakai/topic_31.htm</link><description><![CDATA[5. 数据库配置 
5.1. 从早期版本移植 
从 2.2.0 到 2.2.1 ， sakai 提供了 mysql 和 oracle 的转换脚本，保存在以下目录 reference/docs/updating ，从以下网址也可以获得： 
MySQL:  https://source.sakaiproject.org/svn/reference/tags/sakai_2-2-1/docs/conversion/sakai_2_2_0-2_2_1_mysql_conversion.sql  
Oracle:  https://source.sakaiproject.org/svn/reference/tags/sakai_2-2-1/docs/conversion/sakai_2_2_0-2_2_1_oracle_conversion.sql  

在该目录下，你还可以发现其他版本的转换脚本。另外，需要注意的是，如果你是从更早期的版本升级到当前版本，则需要依次执行相应脚本，比如，如果你要从 2.1.2 升级到 2.2.1 ，则需要先执行 2.1.2 到 2.2.0 的转换脚本，然后再执行 2.2.0 到 2.2.1 的转换脚本。 
5.2. 驱动配置 
Sakai 支持的产品级的数据库包括 MySQL 4.1.12+ （注意， MySQL 5.0 还未经过充分测试）和 oracle9i+ 。 JDBC 驱动的版本也很重要， 对于 mysql 来说，需要用 MySQL a 3.1.12+ 连接器，对于 oracle 来说必须用 10g 的驱动，即使数据库版本是 9i ，这些驱动应该放到 $CATALINA_HOME/common/lib 目录下，相应的驱动可以从以下网址获得： 
MySQL:  http://dev.mysql.com/downloads/connector/j/3.1.html  
Oracle:  http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html  

5.3. 创建数据库和用户 
在使用 sakai 之前，必须先创建一个 sakai 数据库，并建立相应的特权用户，下面以 mysql 为例说明操作的过程： 
C:\sakai\reference\sql\legacy\mysql\> 
mysql -u root -p 
Enter password: ****** 
Welcome to the MySQL monitor. Commands end with ; or \g. 
 
Your MySQL connection id is 51 to server version: 4.1.5-gamma-nt 
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 
 
mysql> create database sakai default character set utf8; 
Query OK, 1 row affected (0.00 sec) 
 
mysql> grant all on sakai.* to sakaiuser@'localhost' identified by 'sakaipassword'; 
Query OK, 0 rows affected (0.00 sec 
 
mysql> grant all on sakai.* to sakaiuser@'127.0.0.1' identified by 'sakaipassword'; 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> quit 
UTF-8 字符集 
创建数据库时，必须确保使用 UTF-8 字符集，就像 tomcat 也必须配置成 UTF-8 字符集一样。如果你不确定你的数据库的当前配置，你可以通过 sql 来查询，下面是以 oralce 为例，说明如何确定你的数据库使用的字符集： 
SQL> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET'; 
VALUE 
-------------------------------------------------------------------------------- 
AL32UTF8 
]]></description><author>『楊^ò^超』</author><slash:comments>1</slash:comments><pubDate>Wed, 02 Jul 2008 13:17:00 GMT</pubDate><dcterms:modified>Wed, 02 Jul 2008 13:17:00 GMT</dcterms:modified></item><item><title><![CDATA[sakai配置(中文版)(二)]]></title><link>http://club.muchool.com/Sakai/topic_29.htm</link><description><![CDATA[2. 安装环境配置 
2.1. 验证 java 安装版本 
检查你的系统中是否装有 java （版本在 1.4.2 或更高），以下以 *nix 系统为例： 
$ java -version 
java version "1.5.0_06" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05) 
Java HotSpot(TM) Server VM (build 1.5.0_06-b05, mixed mode) 
如果你选择了源代码安装方式，必须确保你安装了 J2SE ，而不仅仅是 JRE 。 
2.2. 验证 java 环境变量 
有两个 java 环境变量 JAVA_HOME 、 PATH 需要配置。 配置方式如下： 
Windows:  Set the (or create a new) environment variable JAVA_HOME to C:\jdk1.5.0_06 .  
Mac/*nix:  export JAVA_HOME=/usr/java/java-current  
Windows:  Append the string ;C:\jdk1.5.0_06\bin to the end of the system variable named Path.  
Mac:  Not necessary.  
*nix:  export PATH=$PATH:$JAVA_HOME/bin/  

2.3. 安装 Tomcat 
Sakai 2.2.1 推荐使用 Tomcat 5.5.17 。具体安装方法略。 
2.4. 配置 Tomcat 
Sakai 支持 UTF-8 字符集，所以必须配置 tomcat 接受 UTF-8 URLs ，因为 tomcat 将 ISO-8859-1 作为其缺省的 URL 编码。通过编辑 $CATALINA_HOME/conf/server.xml 文件，增加 URIEncoding="UTF-8" 属性到 <connector> 标记里面，即可改变 tomcat 的 URL 字符集的配置。以下是示例： 
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" 
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/> 
2.5. 安装 Maven 
Maven 是 sakai 用的一种 build 工具。当前 sakai 要求的稳定版本是 1.0.2 ，可以从 http://maven.apache.org/start/download.html 下载 
Maven 的更新版本 
当前已经有了 maven1.1beta 版和 moven2.0 版，但是对于 sakai2.2 来说， maven1.0.2 版才能真正适合 sakai 的许多插件。 
Moven 的安装就是直接解压到一个指定位置即可。 
2.6. 配置 Maven 
为了使用 maven ，你必须配置两个环境变量，并且利用 maven 提供的脚本创建一个本地存储区。以下是环境变量和创建 maven 存储区的示例： 
Windows:  Create a new MAVEN_HOME environment variable to C:\maven-1.0.2 . Then append to the PATH variable ;C:\maven-1.0.2\bin  
Mac/*nix:  export MAVEN_HOME=/usr/local/maven; export PATH=$PATH:$MAVEN_HOME/bin  
Windows:  install_repo.bat %HOMEDRIVE%%HOMEPATH%\.maven\repository  
Mac/*nix:  install_repo.sh $HOME/.maven/repository  

你需要在你的根目录下创建一个 build 属性文件，在这个文件里，将定义一些 sakai 编译的基本参数。在根目录创建一个名为 build.properties 的文本文件， 拷贝以下内容到文件中： 
maven.repo.remote=http://source.sakaiproject.org/maven/ 
maven.tomcat.home= /usr/local/tomcat/ 
最后，为了确保你能够起动 maven ，运行 maven –v 命令，将起动 maven 并报告其版本。 
]]></description><author>『楊^ò^超』</author><slash:comments>3</slash:comments><pubDate>Wed, 02 Jul 2008 13:09:00 GMT</pubDate><dcterms:modified>Wed, 02 Jul 2008 13:11:00 GMT</dcterms:modified></item><item><title><![CDATA[ sakai配置(中文版)(一)]]></title><link>http://club.muchool.com/Sakai/topic_27.htm</link><description><![CDATA[1. 概述 
1.1. 选择一种安装类型 
Sakai 2.2.1 提供三种不同的安装类型： 
Demo:  Demo 版包括了 tomcat 和预装好的 webapps ，所以唯一预先要做的就是提供 JDK1.4.2 或者更高版本的 java 环境。但是该版本只适合小范围应用，适合于进行软件评估和单服务器的应用。  
Binary:  如果你有一个已经配置好的 tomcat ，这种安装类型提供了一个简单的安装方式，即直接解压 sakai 应用包到 tomcat ，而不需要通过专业的 build ，适合于不需要代码级改动的应用要求。  
Source:  这种方式只提供源代码，安装前须提供 tomcat 、专业 build 工具、数据库。用户可以通过 build 配置来自定义需安装的组件。  

1.2. Demo 安装 
Demo 安装是非常简单直接的，其最关键的就是确保正确的 java 环境。安装步骤如下： 
1.                   配置 java 的安装路径（ JAVA_HOME ），详见第二部分要求。 
2.                   下载并解压 demo 压缩包。 
Windows:  demo archive  
Mac/*nix:  demo archive  

3.                   用以下命令启动 tomcat ，脚本在 tomcat 根目录。 
Windows:  start-sakai.bat  
Mac/*nix:  start-sakai.sh  

Tomcat 启动后，可以通过地址： http://localhost:8080/portal 来进行访问。具体怎么使用 sakai ，参见第六部分说明。 
停止 sakai 的方式： : 
Windows:  stop-sakai.bat  

Demo 安装特别注意事项： 
数据存储  Demo 安装版的数据保存在 HypersonicSQL database (HSQLDB) 中，运行时，数据存放在内存中， tomcat 停止时写回文件，文件位于： sakai-demo/sakai/db/sakai.db.* .  
没有 email 配置  Sakai 的 demo 版没有配置 email  

1.3. 二 进制安装 
对于已经有了配置好的 tomcat 服务器的用户，二进制安装提供了一种快捷的安装模式。 Tomcat 的具体配置要求详见第二部分说明。通过解压预先编译好的 sakai 安装包到 tomcat 的根目录即可。 
如果你希望配置自己的安装目录，你必须手工配置 CATALINA_HOME ，以指定你的 sakai 安装目录，具体见第四部分说明。 
1.4. 源代码安装 
Demo 和二进制安装提供了一种快速的方式来使用 sakai ，但是这两种安装方式都不能作代码级的改变。源代码安装方式提供了一种定制安装，这种安装方式相对复杂，具体有以下几个大的步骤： 
1.                   配置安装环境，包括 java 、 tomcat 和专业编译工具。 
2.                   编译和发布，通过专业编译工具来发布 sakai 。 
3.                   根据需要，对 sakai 应用进行安装后配置。 
4.                   如果需要，进行数据库配置。 
1.5. 从以前版本移植 
2.2.1 a dds only bug fixes to 2.2.0, and so a transition between the two should be straightforward. If you have been running 2.2.0 already, you should be able to deploy 2.2.1 with confidence: it will not break your skins, providers, or other 2.2 code. 
If you are moving from an earlier 2.1 or 2.0 codebase, however, 2.2 involves some significant changes: in tools, DB schema, and APIs. Migrating to 2.2 from a previous release therefore requires close attention to detail. Be sure to go over the release notes carefully, and a few key hurdles are identified below: 
sakai.properties:  The 2.2 framework refactoring means that many package names have changed, and these differences will mainly be encountered in sakai.properties settings which reference beans. It's best to not try to use a sakai.properties from a previous release, and instead start with the sample in reference/docs/sakai.properties .  
DB conversion scripts:  Every release has DB conversion scripts, and 2.2.1 is no exception. Be sure, however, to read these scripts over carefully before executing them on your production data. They do not take into account any special customizations you may have done, and you may need to alter them for your situation. See the Database Configuration section for more details.  
Provisional tools:  A few contrib tools that schools may have already put into production are now provisional with 2.2 releases. The DB conversion scripts in particular assume that these new provisional tools are not represented in your schema, and attempt to introduce them. If you have already deployed Message Center , Post 'Em , Search , or Summary Calendar on a production system, you'll want to be sure to avoid running the portions of the conversion scripts that pertain to them. Again, see the Database Configuration section for more details.  
Providers:  Among the changes that 2.2 introduces is a separation of external user identifiers from Sakai's internal user ids. Any custom UserDirectoryProvider will need some alteration to account for this, along with changes to its import statements and declarations that stem from API changes. See the release notes for more details.  
]]></description><author>『楊^ò^超』</author><slash:comments>0</slash:comments><pubDate>Wed, 02 Jul 2008 13:07:00 GMT</pubDate><dcterms:modified>Wed, 02 Jul 2008 13:07:00 GMT</dcterms:modified></item><item><title><![CDATA[Sakai的安装使用]]></title><link>http://club.muchool.com/Sakai/topic_25.htm</link><description><![CDATA[谈到开源eLearning的学习课程开发管理系统，大家都更多地想到Moodle，前不久英国那份著名的教育系统使用开源软件的观察报告显示Moodle是英国的大学使用最多的学习课程开发管理系统。此外，也有人把Moodle aTutor Claroline并称为三大开源学习系统。

但是，谈LMS而不谈及Sakai实在是一个缺憾。

Sakai项目Sakai是由美国印地安那大学、密西根大学、斯坦福大学和麻省理工学院于2004年共同发起的一项开源CMS计划。Sakai项目的主要目标是，开发Sakai程序的系统架构，将之与已有各种CMS工具和组件整合为一体。这些工具与组件既可用于课程管理，同时也可作为原有CMS模型的扩展插件。更为重要的是，Sakai也将支持研究性协作学习。
另外，Sakai项目似乎很重视ePortfolio这个教育技术界的前沿技术，国内应用还几乎没有；目前Sakai的用户主要是一些大学，中小学应用的还几乎没有；Sakai很重视商业运作，在教育技术界大谈混合学习的时代，我们应该能更好地接受这种“混合软件系统”的模式；Sakai也积极地遵守IMS SCORM等教育技术界的标准。

    Sakai和Moodle同为开源的学习开发管理系统，两者还是有一些区别，我想起码有下面这些：
    1 架构完全不同。
    Moodle是架构于最流行的开源软件架构模式LAMP上的，而Sakai则是架构在J2EE之上。一般人们认为前者是一个轻量级的架构，而后者是一个重量级的架构。

    2 软件许可证的不同。
    Moodle遵循的是开源世界最流行的GPL许可证，而Sakai则遵循教育社区许可证(Educational Community License,http://opensource.org/licenses