linux下apache + fastcgi开发 C版本接口说明

应工作需求,最近用fastcgi写了个小项目。鉴于网上资料缺乏且存在一些错误,为了少走一些弯路,本人干脆利用课余时间把fastcgi源码读了一遍。总体来讲,整个源码异常的简洁明了,但是fastcgi却有如此稳定的性能表现,不得不让人惊叹。

1.fastcgi简介

CGI全称是“通用网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。


2.工作原理

1)Web Server启动时载入FastCGI进程管理器。  

2)FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web Server的连接。

3)当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。

4)FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。

3.fastcgi单线程与多线程编程

单线程模板:

#include   
  
void main(void)  
{  
    int count = 0;  
    while(FCGI_Accept() >= 0) {  
        printf("Content-type: text/html\r\n");  
        printf("\r\n");  
        printf("Hello world!
\r\n"); printf("Request number %d.", count++); } exit(0); }

多线程模板

#define THREAD_COUNT 20  
  
static int counts[THREAD_COUNT];  
  
static void *doit(void *a)  
{  
    int rc;  
    FCGX_Request request;  
    FCGX_InitRequest(&request, 0, 0);  
    for (;;)  
    {  
        rc = FCGX_Accept_r(&request);  
  
        if (rc < 0)  
            break;  
        FCGX_FPrintF(request.out,  
            "Content-type: text/html\r\n"  
            "\r\n"  
            "FastCGI Hello! ");  
  
        sleep(2);  
        FCGX_Finish_r(&request);  
    }  
    return NULL;  
}  
  
int main(void)  
{  
    int i;  
    pthread_t id[THREAD_COUNT];  
  
    FCGX_Init();  
  
    for (i = 1; i < THREAD_COUNT; i++)  
        pthread_create(&id[i], NULL, doit, (void*)i);  
  
    doit(0);  
    return 0;  
}</code></pre> 
  <br> 
  <p><strong>3.接口说明</strong></p> 
  <p><strong>1)重要的数据结构</strong></p> 
  <p><strong>FCGX_Stream:</strong>fastcgi自定义的流。里面包含了读写缓冲区的指针,和相应的操作方法。他们本质上都是对链接过来的套接字fd做操作。这个数据封装最值得借鉴的地方就是体现出了面向对象的编程思想,大大提高了程序的可扩展性和可复用性。<br></p> 
  <pre><code class="language-cpp">typedef struct FCGX_Stream {
    unsigned char *rdNext;    /* reader: first valid byte
                               * writer: equals stop */
    unsigned char *wrNext;    /* writer: first free byte
                               * reader: equals stop */
    unsigned char *stop;      /* reader: last valid byte + 1
                               * writer: last free byte + 1 */
    unsigned char *stopUnget; /* reader: first byte of current buffer
                               * fragment, for ungetc
                               * writer: undefined */
    int isReader;
    int isClosed;
    int wasFCloseCalled;
    int FCGI_errno;                /* error status */
    void (*fillBuffProc) (struct FCGX_Stream *stream);
    void (*emptyBuffProc) (struct FCGX_Stream *stream, int doClose);
    void *data;
} FCGX_Stream;</code></pre> 
  <br> 
  <p><strong>FCGX_Request:</strong>当程序调用FCGX_Accept_r函数时,每次接受到的请求数据都会填充至FCGX_Request类型的结构体当中。<br></p> 
  <p>几个重要的成员变量:</p> 
  <p><strong>in:</strong>输入流</p> 
  <p><strong>out:</strong>输出流</p> 
  <p><strong>err:</strong>本质上也是个输出流,他会把一些错误信息返回给链接的客户端<strong>。</strong></p> 
  <p><strong>envp:</strong>主要存放cgi的一些环境变量。</p> 
  <p><strong>ipcFd</strong>:链接过来的套接字的fd。</p> 
  <pre><code class="language-cpp">typedef struct FCGX_Request {
    int requestId;            /* valid if isBeginProcessed */
    int role;
    FCGX_Stream *in;
    FCGX_Stream *out;
    FCGX_Stream *err;
<span style="white-space:pre;">	</span>char **envp;


<span style="white-space:pre;">	</span>/* Don't use anything below here */


    struct Params *paramsPtr;
    int ipcFd;               /* < 0 means no connection */
    int isBeginProcessed;     /* FCGI_BEGIN_REQUEST seen */
    int keepConnection;       /* don't close ipcFd at end of request */
    int appStatus;
    int nWriters;             /* number of open writers (0..2) */
<span style="white-space:pre;">	</span>int flags;
<span style="white-space:pre;">	</span>int listen_sock;
} FCGX_Request;
</code></pre> 
  <p><strong>2)头文件</strong></p> 
  <p>常用的头文件有两个:</p> 
  <p><strong>Fcgi_stdio.h:</strong>这个头文件里面的接口大多只是对标准C中提供的一些接口进行简单的封装,甚至只是重新宏定义了一下。这类接口以FCGI_开头。</p> 
  <p><strong>Fcgiapp.h:</strong>这个头文件里面实现的接口,完全是具备fastcgi特性的开发接口了。这类接口以FCGX_开头。</p> 
  <p><strong>3)fastcgiapp文件下接口说明</strong></p> 
  <p><strong>FCGX_Init:</strong>主要是做一些初始化工作。<span style="background-color:rgb(255,255,255);text-indent:28px;"><span style="font-size:16px;"></span></span></p> 
  <p><span style="font-size:16px;"><span style="color:rgb(51,51,51);font-family:arial, '宋体', sans-serif;text-indent:28px;background-color:rgb(255,255,255);"></span></span></p> 
  <div class="article_content clearfix csdn-tracking-statistics" style="padding:0px;margin:0px;"> 
   <div class="htmledit_views" style="padding:0px;margin-bottom:0px;"> 
    <div class="spctrl" style="padding:0px;margin:0px;"></div> 
    <pre><code class="language-cpp">int FCGX_Init(void)
{
    char *p;

    if (libInitialized) {
        return 0;
    }

    FCGX_InitRequest(&the_request, FCGI_LISTENSOCK_FILENO, 0);

    if (OS_LibInit(NULL) == -1) {
        return OS_Errno ? OS_Errno : -9997;
    }

    p = getenv("FCGI_WEB_SERVER_ADDRS");
    webServerAddressList = p ? StringCopy(p) : NULL;

    libInitialized = 1;
    return 0;
}</code></pre> 
    <strong>FCGX_InitRequest:</strong>初始化请求包 
   </div> 
  </div> 
  <pre><code class="language-cpp">int FCGX_InitRequest(FCGX_Request *request, int sock, int flags)
{
    memset(request, 0, sizeof(FCGX_Request));

    /* Should check that sock is open and listening */
    request->listen_sock = sock;

    /* Should validate against "known" flags */
    request->flags = flags;

    request->ipcFd = -1;

    return 0;
}</code></pre> 
  <p><strong>FCGX_Accept_r:</strong>这个函数可以说是fastcgi编程的核心函数了,它首先会接收链接请求,然后填充request结构体。</p> 
  <p>具体代码分析如下:</p> 
  <pre><code class="language-cpp">int FCGX_Accept_r(FCGX_Request *reqDataPtr)
{
    if (!libInitialized) {
        return -9998;
    }

    /* Finish the current request, if any. */
    FCGX_Finish_r(reqDataPtr);

    for (;;) {
        /*
         * If a connection isn't open, accept a new connection (blocking).
         * If an OS error occurs in accepting the connection,
         * return -1 to the caller, who should exit.
         */
        if (reqDataPtr->ipcFd < 0) {
            int fail_on_intr = reqDataPtr->flags & FCGI_FAIL_ACCEPT_ON_INTR;
        <span style="color:#009900;">    </span><strong>/*调用accept函数接收链接*/</strong>
            reqDataPtr->ipcFd = OS_Accept(reqDataPtr->listen_sock, fail_on_intr, webServerAddressList);
            if (reqDataPtr->ipcFd < 0) {
                return (errno > 0) ? (0 - errno) : -9999;
            }
        }
        /*
         * A connection is open.  Read from the connection in order to
         * get the request's role and environment.  If protocol or other
         * errors occur, close the connection and try again.
         */
        reqDataPtr->isBeginProcessed = FALSE;
        
       <span style="color:#009900;"> </span>/*<strong>申请并初始化输入缓冲区</strong>*/
        reqDataPtr->in = NewReader(reqDataPtr, 8192, 0);

        /*<strong>内部调用read方法阻塞接收数据</strong>*/
        FillBuffProc(reqDataPtr->in);
        if(!reqDataPtr->isBeginProcessed) {
            goto TryAgain;
        }
        {
            char *roleStr;
            switch(reqDataPtr->role) {
                case FCGI_RESPONDER:
                    roleStr = "FCGI_ROLE=RESPONDER";
                    break;
                case FCGI_AUTHORIZER:
                    roleStr = "FCGI_ROLE=AUTHORIZER";
                    break;
                case FCGI_FILTER:
                    roleStr = "FCGI_ROLE=FILTER";
                    break;
                default:
                    goto TryAgain;
            }
            reqDataPtr->paramsPtr = NewParams(30);
            PutParam(reqDataPtr->paramsPtr, StringCopy(roleStr));
        }
        SetReaderType(reqDataPtr->in, FCGI_PARAMS);
        if(ReadParams(reqDataPtr->paramsPtr, reqDataPtr->in) >= 0) {
            /*
             * Finished reading the environment.  No errors occurred, so
             * leave the connection-retry loop.
             */
            break;
        }

        /*
         * Close the connection and try again.
         */
TryAgain:
        FCGX_Free(reqDataPtr, 1);

    } /* for (;;) */
    /*
     * Build the remaining data structures representing the new
     * request and return successfully to the caller.
     */
    SetReaderType(reqDataPtr->in, FCGI_STDIN);

    /*<strong>初始化发送缓冲区,FCGX_printF函数内部会调用emptyBufferProc,
    不断把数据通过ipcFd发送给客户端</strong>*/
    reqDataPtr->out = NewWriter(reqDataPtr, 8192, FCGI_STDOUT);
    reqDataPtr->err = NewWriter(reqDataPtr, 512, FCGI_STDERR);
    reqDataPtr->nWriters = 2;
    reqDataPtr->envp = reqDataPtr->paramsPtr->vec;
    return 0;
}</code></pre> 
  <p><strong>FCGX_Finish_r;</strong>主要是清空上次申请的缓冲区</p> 
  <pre><code class="language-cpp">void FCGX_Finish_r(FCGX_Request *reqDataPtr)
{
    int close;

    if (reqDataPtr == NULL) {
        return;
    }

    close = !reqDataPtr->keepConnection;

    /* This should probably use a 'status' member instead of 'in' */
    if (reqDataPtr->in) {
        close |= FCGX_FClose(reqDataPtr->err);
        close |= FCGX_FClose(reqDataPtr->out);

	close |= FCGX_GetError(reqDataPtr->in);
    }

    FCGX_Free(reqDataPtr, close);
}</code></pre> 
  <p>掌握以上内容,基本就可以用fastcgi编程了。fastcgi说到底就是对普通的套接字接口重新做了http协议的封装。整个源码十分简洁清楚。有了fastcgi接口,客户端只要按照http报文格式发送数据,服务器段调用FCGX_printF回复响应包便完成了一个完整的通信了。</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1297988806170976256"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(linux下apache + fastcgi开发 C版本接口说明)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1900865845991632896.htm"
                           title="【leetcode100】括号生成" target="_blank">【leetcode100】括号生成</a>
                        <span class="text-muted">SsummerC</span>
<a class="tag" taget="_blank" href="/search/leetcode100/1.htm">leetcode100</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>1、题目描述数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]2、初始思路2.1思路全排列+筛选2.2犯错点全排列,时间复杂度高,且易读性较差3优化算法3.1思路在构造的过程中直接确保括号的正确匹配:当左括号数量List[str]:res=[]p</div>
                    </li>
                    <li><a href="/article/1900865847073763328.htm"
                           title="C++程序设计语言笔记——抽象机制:泛型程序设计" target="_blank">C++程序设计语言笔记——抽象机制:泛型程序设计</a>
                        <span class="text-muted">钺不言</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B%E7%AC%94%E8%AE%B0/1.htm">C++笔记</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a>
                        <div>0模板可传递实参类型而不丢失信息。在C++中,模板传递实参类型时保留所有类型信息的关键在于正确使用引用和转发机制。以下是几种常见场景的解决方案:1.使用万能引用(UniversalReference)和完美转发通过T&&捕获任意类型的引用(左值/右值),结合std::forward保留原始类型信息:templatevoidwrapper(T&&arg){//完美转发,保留所有类型信息(包括cons</div>
                    </li>
                    <li><a href="/article/1900865719671779328.htm"
                           title="PO、DTO、VO等9大对象划分详解,让你的代码不再“一团糟”" target="_blank">PO、DTO、VO等9大对象划分详解,让你的代码不再“一团糟”</a>
                        <span class="text-muted">码熔burning</span>
<a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a>
                        <div>目录一、PO(PersistentObject)二、DO(DomainObject)三、TO(TransferObject)四、DTO(DataTransferObject)五、VO(ViewObject)六、BO(BusinessObject)七、POJO(PlainOrdinaryJavaObject)八、DAO(DataAccessObject)九、Entity对象转换与使用场景总结何时使用</div>
                    </li>
                    <li><a href="/article/1900865593440006144.htm"
                           title="数据结构---顺序表的基本操作代码块" target="_blank">数据结构---顺序表的基本操作代码块</a>
                        <span class="text-muted">偷吃鱼骨的猫</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%A3%E7%A0%81%E7%AC%94%E8%AE%B0/1.htm">数据结构代码笔记</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                        <div>顺序表的基本操作//定义typedefstruct{ElemType*Elem;//动态数组,存储空间基地址intlength=0;//当前长度}SqList;//顺序表结构类型//初始化StatusInitList(SqList&L){//构造一个空的顺序表L.Elem=newElemType[MaxSize];//为顺序分配一个MAxSize大小的空间if(!L.Elem)//判断是否成功分配</div>
                    </li>
                    <li><a href="/article/1900865215411580928.htm"
                           title="FastAPI安全防护指南:构建坚不可摧的参数处理体系" target="_blank">FastAPI安全防护指南:构建坚不可摧的参数处理体系</a>
                        <span class="text-muted">qcidyu</span>
<a class="tag" taget="_blank" href="/search/fastapi/1.htm">fastapi</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>扫描二维码关注或者微信搜一搜:编程智域前端至全栈交流与成长探索数千个预构建的AI应用,开启你的下一个伟大创意第一章:输入验证体系1.1类型安全革命frompydanticimportBaseModel,PaymentCardNumberfrompydantic.typesimportSecretStrclassUserRequest(BaseModel):username:str=Field(mi</div>
                    </li>
                    <li><a href="/article/1900864837299269632.htm"
                           title="关于支付宝授权用户信息" target="_blank">关于支付宝授权用户信息</a>
                        <span class="text-muted">道系女孩~</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>最近做的一个项目授权支付宝信息进行报名支付以下是流程1、一个首先引进阿里相关配置信息2、因为我这边项目是支持小程序、H5、支付宝登录报名的,我这边只展示支付宝代码哦对啦微信不同应用下unionid是一样的,所以可以将小程序/H5下的视为同一用户,好啦接下来说说支付宝吧3、elseif($data['type']==ActivityUser::TYPE_ALI){list($res1,$info1)</div>
                    </li>
                    <li><a href="/article/1900864710371241984.htm"
                           title="Php关于切换版本" target="_blank">Php关于切换版本</a>
                        <span class="text-muted">道系女孩~</span>
<a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>composer.json文件中"config":{"optimize-autoloader":true,"preferred-install":"dist","sort-packages":true,"secure-http":false,"allow-plugins":{"pestphp/pest-plugin":true},"platform-check":false},中添加"platfo</div>
                    </li>
                    <li><a href="/article/1900864710916501504.htm"
                           title="关于新增字段查询DB:: raw" target="_blank">关于新增字段查询DB:: raw</a>
                        <span class="text-muted">道系女孩~</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>$builder=ExtendedSkus::leftjoin('extend_skus_attributes','extend_skus.id','=','extend_skus_attributes.es_id')->leftJoin('carvehicleseries','carvehicleseries.vs_id','=','extend_skus.vs_id')->leftJoin('</div>
                    </li>
                    <li><a href="/article/1900864456938811392.htm"
                           title="LLM之Colossal-LLaMA-2:源码解读(init_tokenizer.py文件)实现基于源词表的扩展、(init_model.py文件)实现过计算均值扩展模型、(prepare_pretr" target="_blank">LLM之Colossal-LLaMA-2:源码解读(init_tokenizer.py文件)实现基于源词表的扩展、(init_model.py文件)实现过计算均值扩展模型、(prepare_pretr</a>
                        <span class="text-muted">一个处女座的程序猿</span>
<a class="tag" taget="_blank" href="/search/CaseCode/1.htm">CaseCode</a><a class="tag" taget="_blank" href="/search/NLP%2FLLMs/1.htm">NLP/LLMs</a><a class="tag" taget="_blank" href="/search/%E7%B2%BE%E9%80%89%28%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%29-%E4%B8%AD%E7%BA%A7/1.htm">精选(人工智能)-中级</a><a class="tag" taget="_blank" href="/search/Colossal/1.htm">Colossal</a><a class="tag" taget="_blank" href="/search/LLaMA-2/1.htm">LLaMA-2</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a>
                        <div>LLM之Colossal-LLaMA-2:源码解读(init_tokenizer.py文件)实现基于jsonl文件中读取新词列表(新中文词汇)→for循环去重实现词表的扩展(中文标记的新词汇)→保存新的分词模型、(init_model.py文件)实现过计算均值来扩展模型的嵌入层以适应新的词汇表,然后保存扩展后的模型、(prepare_pretrain_dataset.py文件)将原始数据集进行处理</div>
                    </li>
                    <li><a href="/article/1900864458205491200.htm"
                           title="LLMs之Colossal-LLaMA-2:源码解读(train.py文件)基于给定数据集实现持续预训练LLaMA-2—解析命令行参数→初始化配置(分布式训练环境colossalai+训练日志+加速插" target="_blank">LLMs之Colossal-LLaMA-2:源码解读(train.py文件)基于给定数据集实现持续预训练LLaMA-2—解析命令行参数→初始化配置(分布式训练环境colossalai+训练日志+加速插</a>
                        <span class="text-muted">一个处女座的程序猿</span>
<a class="tag" taget="_blank" href="/search/NLP%2FLLMs/1.htm">NLP/LLMs</a><a class="tag" taget="_blank" href="/search/%E7%B2%BE%E9%80%89%28%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%29-%E4%B8%AD%E7%BA%A7/1.htm">精选(人工智能)-中级</a><a class="tag" taget="_blank" href="/search/Colossal-AI/1.htm">Colossal-AI</a><a class="tag" taget="_blank" href="/search/LLaMA-2/1.htm">LLaMA-2</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">大语言模型</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a>
                        <div>LLMs之Colossal-LLaMA-2:源码解读(train.py文件)基于给定数据集实现持续预训练LLaMA-2—解析命令行参数→初始化配置(分布式训练环境colossalai+训练日志+加速插件)→数据预处理(初始化分词器+数据处理器+数据加载器)→模型训练(初始化模型/优化器/学习率调度器/梯度检查点/Flash-Attention/设置数据类型/是否加载预训练模型/从上一次训练点继续训</div>
                    </li>
                    <li><a href="/article/1900863701473357824.htm"
                           title="【JAVA进阶系列】进阶知识 -- Class类 getName()、getCanonicalName()、getSimpleName()、getTypeName()" target="_blank">【JAVA进阶系列】进阶知识 -- Class类 getName()、getCanonicalName()、getSimpleName()、getTypeName()</a>
                        <span class="text-muted">m0_74823658</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>【JAVA进阶系列】进阶知识--Class类getName()、getCanonicalName()、getSimpleName()、getTypeName()方法的异同【1】getName()返回该类对象作为字符串表示的实体(类、接口、数组类、基本数据类型或void)的名称可以理解为返回的是虚拟机中Class对象的表示当动态加载类的时候,会用到该方法的返回值,如:使用Class.forName(</div>
                    </li>
                    <li><a href="/article/1900863449345355776.htm"
                           title="ROS中的三维占用网格地图与八叉树地图详尽解析" target="_blank">ROS中的三维占用网格地图与八叉树地图详尽解析</a>
                        <span class="text-muted">YRr YRr</span>
<a class="tag" taget="_blank" href="/search/ros/1.htm">ros</a><a class="tag" taget="_blank" href="/search/%E5%9C%B0%E5%9B%BE/1.htm">地图</a>
                        <div>ROS中的三维占用网格地图与八叉树地图详尽解析在机器人自主导航与环境感知领域,地图构建与表示是核心技术之一。不同的三维地图表示方法在精度、效率、存储需求等方面各有优劣,直接影响机器人在复杂环境中的表现。本文将以ROS(RobotOperatingSystem,机器人操作系统)为背景,深入探讨两种常用的三维地图表示方法——三维占用网格地图(OccupancyGridMap,简称OGM)和八叉树地图(</div>
                    </li>
                    <li><a href="/article/1900863196722425856.htm"
                           title="llama源码学习·model.py[1]RMSNorm归一化" target="_blank">llama源码学习·model.py[1]RMSNorm归一化</a>
                        <span class="text-muted">小杜不吃糖</span>
<a class="tag" taget="_blank" href="/search/llama/1.htm">llama</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>一、model.py中的RMSNorm源码classRMSNorm(torch.nn.Module):def__init__(self,dim:int,eps:float=1e-6):super().__init__()self.eps=epsself.weight=nn.Parameter(torch.ones(dim))def_norm(self,x):returnx*torch.rsqrt(</div>
                    </li>
                    <li><a href="/article/1900862944485371904.htm"
                           title="跟着黑马学MySQL基础篇笔记(4)-多表查询" target="_blank">跟着黑马学MySQL基础篇笔记(4)-多表查询</a>
                        <span class="text-muted">小杜不吃糖</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>37.多表查询-多表关系介绍多表关系概述项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)多对多一对一一对多(多对一)案例:部门与员工的关系关系:一个部门对应多个员工,一个员工对应一个部门实现:在多的一方建立外键,指向一的一方的主键多对多案例:学生与课程的关系一个学生</div>
                    </li>
                    <li><a href="/article/1900862313326505984.htm"
                           title="全局路径规划器:full_coverage_path_planner完全指南" target="_blank">全局路径规划器:full_coverage_path_planner完全指南</a>
                        <span class="text-muted">段钰忻</span>

                        <div>全局路径规划器:full_coverage_path_planner完全指南项目地址:https://gitcode.com/gh_mirrors/fu/full_coverage_path_planner项目介绍full_coverage_path_planner是一个在ROS(RobotOperatingSystem)环境下开发的开源全局路径规划算法实现,旨在提供全面覆盖的路径规划解决方案。该</div>
                    </li>
                    <li><a href="/article/1900862186322980864.htm"
                           title="如何在飞牛云NAS快速使用Docker打造稳定安全的本地网站并对外可见" target="_blank">如何在飞牛云NAS快速使用Docker打造稳定安全的本地网站并对外可见</a>
                        <span class="text-muted">gkfkfhk</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a>
                        <div>文章目录前言1.Docker下载源设置2.Docker下载WordPress3.Docker部署Mysql数据库4.WordPress参数设置5.飞牛云安装Cpolar工具6.固定Cpolar公网地址7.修改WordPress配置文件8.公网域名访问WordPress前言本文主要介绍如何在飞牛云NAS上利用Docker快速搭建并优化WordPress站点的技巧,并且了解了如何借助cpolar实现内</div>
                    </li>
                    <li><a href="/article/1900861430815584256.htm"
                           title="数据结构-栈基本运算的实现及其应用" target="_blank">数据结构-栈基本运算的实现及其应用</a>
                        <span class="text-muted">Ssaty.</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>第1关:顺序栈的实现本关任务:实现顺序栈的入栈、出栈和取栈顶功能。/*************************************************************顺序存储的栈实现文件更新于2020年4月27日**************************************************************/#include#include#</div>
                    </li>
                    <li><a href="/article/1900861318123024384.htm"
                           title="如何平衡用户需求与商业目标冲突" target="_blank">如何平衡用户需求与商业目标冲突</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E9%9C%80%E6%B1%82%E7%AE%A1%E7%90%86/1.htm">需求管理</a>
                        <div>在商业环境中,平衡用户需求与商业目标至关重要,这是企业成功的关键。有效的方法包括深入理解用户需求、建立用户为中心的设计理念、制定合理的优先级策略、实施敏捷开发流程、建立透明沟通渠道。其中,深入理解用户需求不仅是平衡双方利益的基础,也是企业可持续发展的核心。一、深入理解用户需求深入理解用户需求是化解用户与企业目标冲突的关键步骤。用户需求是产品设计和服务交付的起点,只有准确把握用户需求,企业才能设计出</div>
                    </li>
                    <li><a href="/article/1900861178616279040.htm"
                           title="How to install phpMyAdmin on CentOS 8 / AlmaLinux 8 / RockyLinux 8" target="_blank">How to install phpMyAdmin on CentOS 8 / AlmaLinux 8 / RockyLinux 8</a>
                        <span class="text-muted">Evoxt 益沃斯</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>phpMyAdminisaweb-basedfreeandopen-sourcetoolthatiswritteninPHPtohelpuserstomanagetheirdatabaseeasily.WithphpMyAdmin,userscaneasilycreateandmanagedatabases,importandexportdataandevenexecutingSQLqueries</div>
                    </li>
                    <li><a href="/article/1900861052229316608.htm"
                           title="小凯的疑惑(数论 )" target="_blank">小凯的疑惑(数论 )</a>
                        <span class="text-muted">vir02</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>#includeusingnamespacestd;typedeflonglongll;intmain(){//请在此输入您的代码lla,b;cin>>a>>b;llN=a*b-a-b;cout<<N;return0;}如果a和b互素,那么a*b-a-b是最大无法被表示的金额</div>
                    </li>
                    <li><a href="/article/1900860937989058560.htm"
                           title="聊聊langchain4j的ChatMemory" target="_blank">聊聊langchain4j的ChatMemory</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/langchain4j/1.htm">langchain4j</a>
                        <div>序本文主要研究一下langchain4j的ChatMemoryChatMemorylangchain4j-core/src/main/java/dev/langchain4j/memory/ChatMemory.javapublicinterfaceChatMemory{/***TheIDofthe{@linkChatMemory}.*@returnTheIDofthe{@linkChatMemo</div>
                    </li>
                    <li><a href="/article/1900860939306070016.htm"
                           title="聊聊langchain4j的ChatMemory" target="_blank">聊聊langchain4j的ChatMemory</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/langchain4j/1.htm">langchain4j</a>
                        <div>序本文主要研究一下langchain4j的ChatMemoryChatMemorylangchain4j-core/src/main/java/dev/langchain4j/memory/ChatMemory.javapublicinterfaceChatMemory{/***TheIDofthe{@linkChatMemory}.*@returnTheIDofthe{@linkChatMemo</div>
                    </li>
                    <li><a href="/article/1900860926001737728.htm"
                           title="c++成绩排名" target="_blank">c++成绩排名</a>
                        <span class="text-muted">vir02</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>编写一个学生类,包含学号(string)、姓名(string)和成绩(double)三个私有属性,以及设置姓名、学号和成绩值,获得成绩值,输出姓名、学号和成绩等的公有成员函数。根据输入的人数,定义学生类对象数组,并读入学生信息,然后按照成绩由高低顺序排序并输出。输入格式:第1行输入学生人数n(0#includeusingnamespacestd;classStudent{public:string</div>
                    </li>
                    <li><a href="/article/1900860809546887168.htm"
                           title="聊聊langchain4j的RagAutoConfig" target="_blank">聊聊langchain4j的RagAutoConfig</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/langchain4j/1.htm">langchain4j</a>
                        <div>序本文主要研究一下langchain4j-spring-boot-starter的RagAutoConfigLangChain4jAutoConfigdev/langchain4j/spring/LangChain4jAutoConfig.java@AutoConfiguration@Import({AiServicesAutoConfig.class,RagAutoConfig.class,Ai</div>
                    </li>
                    <li><a href="/article/1900860810809372672.htm"
                           title="聊聊langchain4j的RagAutoConfig" target="_blank">聊聊langchain4j的RagAutoConfig</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/langchain4j/1.htm">langchain4j</a>
                        <div>序本文主要研究一下langchain4j-spring-boot-starter的RagAutoConfigLangChain4jAutoConfigdev/langchain4j/spring/LangChain4jAutoConfig.java@AutoConfiguration@Import({AiServicesAutoConfig.class,RagAutoConfig.class,Ai</div>
                    </li>
                    <li><a href="/article/1900860682568527872.htm"
                           title="聊聊langchain4j的AiServicesAutoConfig" target="_blank">聊聊langchain4j的AiServicesAutoConfig</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/langchain4j/1.htm">langchain4j</a>
                        <div>序本文主要研究一下langchain4j-spring-boot-starter的AiServicesAutoConfigLangChain4jAutoConfigdev/langchain4j/spring/LangChain4jAutoConfig.java@AutoConfiguration@Import({AiServicesAutoConfig.class,RagAutoConfig.c</div>
                    </li>
                    <li><a href="/article/1900860555380453376.htm"
                           title="ollama+qwq小试牛刀" target="_blank">ollama+qwq小试牛刀</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/llm/1.htm">llm</a>
                        <div>序本文主要演示一下ollama运行QwQ-32B模型步骤pullollamapullqwqpullingmanifestpullingc62ccde5630c...100%▕███████████████████████████████████████████████████████████████████████████████████████████████████████▏19GBpulli</div>
                    </li>
                    <li><a href="/article/1900860302405201920.htm"
                           title="独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的" target="_blank">独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的</a>
                        <span class="text-muted"></span>

                        <div>我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营一款独立产品的经验。我之前写过一篇文章,介绍如何用Docker让潜在客户快速体验你的独立产品。有朋友看到这篇文章之后,试用了产品并且给了我新的建议:用Docker环境变量让试用更方便。在此感谢这位xj</div>
                    </li>
                    <li><a href="/article/1900859917632335872.htm"
                           title="Python扑克牌小游戏" target="_blank">Python扑克牌小游戏</a>
                        <span class="text-muted">Small踢倒coffee_氕氘氚</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a>
                        <div>1.游戏规则概述玩家人数:3人牌数:一副扑克牌,共54张(包括大小王)发牌:每人17张牌,剩余3张作为底牌出牌规则:玩家依次出牌,必须出比上家更大的牌型,或者选择不出胜利条件:先出完手中牌的玩家获胜2.游戏框架设计2.1牌型定义classCard:def__init__(self,suit,rank):self.suit=suit#花色:♠,♥,♣,♦self.rank=rank#牌面:3,4,5</div>
                    </li>
                    <li><a href="/article/1900859164641521664.htm"
                           title="SvelteKit 最新中文文档教程(3)—— 数据加载" target="_blank">SvelteKit 最新中文文档教程(3)—— 数据加载</a>
                        <span class="text-muted"></span>

                        <div>前言Svelte,一个语法简洁、入门容易,面向未来的前端框架。从Svelte诞生之初,就备受开发者的喜爱,根据统计,从2019年到2024年,连续6年一直是开发者最感兴趣的前端框架No.1:Svelte以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构建轻量级Web项目。为了帮助大家学习Svelte,我同时搭建了Svelte最新的中文文档站点。如果需要进阶学习,也可以入手我</div>
                    </li>
                                <li><a href="/article/20.htm"
                                       title="矩阵求逆(JAVA)初等行变换" target="_blank">矩阵求逆(JAVA)初等行变换</a>
                                    <span class="text-muted">qiuwanchi</span>
<a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5%E6%B1%82%E9%80%86%EF%BC%88JAVA%EF%BC%89/1.htm">矩阵求逆(JAVA)</a>
                                    <div>package gaodai.matrix;

import gaodai.determinant.DeterminantCalculation;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 矩阵求逆(初等行变换)
 * @author 邱万迟
 *</div>
                                </li>
                                <li><a href="/article/147.htm"
                                       title="JDK timer" target="_blank">JDK timer</a>
                                    <span class="text-muted">antlove</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/schedule/1.htm">schedule</a><a class="tag" taget="_blank" href="/search/code/1.htm">code</a><a class="tag" taget="_blank" href="/search/timer/1.htm">timer</a>
                                    <div>1.java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务 
2.java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务 
3.java.util.Timer.schedule(TimerTask task, long delay,longperiod</div>
                                </li>
                                <li><a href="/article/274.htm"
                                       title="JVM调优总结 -Xms -Xmx -Xmn -Xss" target="_blank">JVM调优总结 -Xms -Xmx -Xmn -Xss</a>
                                    <span class="text-muted">coder_xpf</span>
<a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a>
                                    <div>堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。 
 
典型设置:   
 
  
   
    java -Xmx</div>
                                </li>
                                <li><a href="/article/401.htm"
                                       title="JDBC连接数据库" target="_blank">JDBC连接数据库</a>
                                    <span class="text-muted">Array_06</span>
<a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a>
                                    <div>package Util; 
 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
 
 
public class JDBCUtil { 
 
 //完</div>
                                </li>
                                <li><a href="/article/528.htm"
                                       title="Unsupported major.minor version 51.0(jdk版本错误)" target="_blank">Unsupported major.minor version 51.0(jdk版本错误)</a>
                                    <span class="text-muted">oloz</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>java.lang.UnsupportedClassVersionError: cn/support/cache/CacheType : Unsupported major.minor version 51.0 (unable to load class cn.support.cache.CacheType) 
 at org.apache.catalina.loader.WebappClassL</div>
                                </li>
                                <li><a href="/article/655.htm"
                                       title="用多个线程处理1个List集合" target="_blank">用多个线程处理1个List集合</a>
                                    <span class="text-muted">362217990</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E5%90%88/1.htm">集合</a>
                                    <div>  昨天发了一个提问,启动5个线程将一个List中的内容,然后将5个线程的内容拼接起来,由于时间比较急迫,自己就写了一个Demo,希望对菜鸟有参考意义。。 
 
 


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

public c</div>
                                </li>
                                <li><a href="/article/782.htm"
                                       title="JSP简单访问数据库" target="_blank">JSP简单访问数据库</a>
                                    <span class="text-muted">香水浓</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a>
                                    <div>学习使用javaBean,代码很烂,仅为留个脚印 
 
 

public class DBHelper {

	private String driverName;
	private String url;
	private String user;
	private String password;
	private Connection connection;
	privat</div>
                                </li>
                                <li><a href="/article/909.htm"
                                       title="Flex4中使用组件添加柱状图、饼状图等图表" target="_blank">Flex4中使用组件添加柱状图、饼状图等图表</a>
                                    <span class="text-muted">AdyZhang</span>
<a class="tag" taget="_blank" href="/search/Flex/1.htm">Flex</a>
                                    <div>1.添加一个最简单的柱状图       
?       1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28      
<?xml version= 
"1.0"&n</div>
                                </li>
                                <li><a href="/article/1036.htm"
                                       title="Android 5.0 - ProgressBar 进度条无法展示到按钮的前面" target="_blank">Android 5.0 - ProgressBar 进度条无法展示到按钮的前面</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>在低于SDK < 21 的版本中,ProgressBar 可以展示到按钮前面,并且为之在按钮的中间,但是切换到android 5.0后进度条ProgressBar 展示顺序变化了,按钮再前面,ProgressBar 在后面了我的xml配置文件如下: 
     
[html]  
view plain 
copy       
 
 <RelativeLa</div>
                                </li>
                                <li><a href="/article/1163.htm"
                                       title="查询汇总的sql" target="_blank">查询汇总的sql</a>
                                    <span class="text-muted">baalwolf</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a>
                                    <div>select   list.listname, list.createtime,listcount from dream_list as list ,   (select listid,count(listid) as listcount  from dream_list_user  group by listid  order by count(</div>
                                </li>
                                <li><a href="/article/1290.htm"
                                       title="Linux du命令和df命令区别" target="_blank">Linux du命令和df命令区别</a>
                                    <span class="text-muted">BigBird2012</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>        1,两者区别      
       du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的。他计算的大小就是当前他认为存在的所有文件大小的累加和。 
       </div>
                                </li>
                                <li><a href="/article/1417.htm"
                                       title="AngularJS中的$apply,用还是不用?" target="_blank">AngularJS中的$apply,用还是不用?</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/%24apply/1.htm">$apply</a>
                                    <div>        在AngularJS开发中,何时应该调用$scope.$apply(),何时不应该调用。下面我们透彻地解释这个问题。 
        但是首先,让我们把$apply转换成一种简化的形式。 
        scope.$apply就像一个懒惰的工人。它需要按照命</div>
                                </li>
                                <li><a href="/article/1544.htm"
                                       title="[Zookeeper学习笔记十]Zookeeper源代码分析之ClientCnxn数据序列化和反序列化" target="_blank">[Zookeeper学习笔记十]Zookeeper源代码分析之ClientCnxn数据序列化和反序列化</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a>
                                    <div>ClientCnxn是Zookeeper客户端和Zookeeper服务器端进行通信和事件通知处理的主要类,它内部包含两个类,1. SendThread 2. EventThread, SendThread负责客户端和服务器端的数据通信,也包括事件信息的传输,EventThread主要在客户端回调注册的Watchers进行通知处理 
  
ClientCnxn构造方法 
  
&</div>
                                </li>
                                <li><a href="/article/1671.htm"
                                       title="【Java命令一】jmap" target="_blank">【Java命令一】jmap</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Java%E5%91%BD%E4%BB%A4/1.htm">Java命令</a>
                                    <div>jmap命令的用法: 
  
[hadoop@hadoop sbin]$ jmap
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a </div>
                                </li>
                                <li><a href="/article/1798.htm"
                                       title="Apache 服务器安全防护及实战" target="_blank">Apache 服务器安全防护及实战</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>此文转自IBM. 
Apache 服务简介 
Web 服务器也称为 WWW 服务器或 HTTP 服务器 (HTTP Server),它是 Internet 上最常见也是使用最频繁的服务器之一,Web 服务器能够为用户提供网页浏览、论坛访问等等服务。 
由于用户在通过 Web 浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而 Web 在 Internet 上一推出就得到</div>
                                </li>
                                <li><a href="/article/1925.htm"
                                       title="unity 3d实例化位置出现布置?" target="_blank">unity 3d实例化位置出现布置?</a>
                                    <span class="text-muted">brotherlamp</span>
<a class="tag" taget="_blank" href="/search/unity%E6%95%99%E7%A8%8B/1.htm">unity教程</a><a class="tag" taget="_blank" href="/search/unity/1.htm">unity</a><a class="tag" taget="_blank" href="/search/unity%E8%B5%84%E6%96%99/1.htm">unity资料</a><a class="tag" taget="_blank" href="/search/unity%E8%A7%86%E9%A2%91/1.htm">unity视频</a><a class="tag" taget="_blank" href="/search/unity%E8%87%AA%E5%AD%A6/1.htm">unity自学</a>
                                    <div>问:unity 3d实例化位置出现布置? 
答:实例化的同时就可以指定被实例化的物体的位置,即 position   
Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Object 
这样你不需要再用Transform.Position了, 
  
如果你省略了第二个参数(</div>
                                </li>
                                <li><a href="/article/2052.htm"
                                       title="《重构,改善现有代码的设计》第八章 Duplicate Observed Data" target="_blank">《重构,改善现有代码的设计》第八章 Duplicate Observed Data</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a>
                                    <div>
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusE</div>
                                </li>
                                <li><a href="/article/2179.htm"
                                       title="struts2更改struts.xml配置目录" target="_blank">struts2更改struts.xml配置目录</a>
                                    <span class="text-muted">chiangfai</span>
<a class="tag" taget="_blank" href="/search/struts.xml/1.htm">struts.xml</a>
                                    <div>struts2默认是读取classes目录下的配置文件,要更改配置文件目录,比如放在WEB-INF下,路径应该写成../struts.xml(非/WEB-INF/struts.xml) 
web.xml文件修改如下: 
  
<filter>
<filter-name>struts2</filter-name>
<filter-class&g</div>
                                </li>
                                <li><a href="/article/2306.htm"
                                       title="redis做缓存时的一点优化" target="_blank">redis做缓存时的一点优化</a>
                                    <span class="text-muted">chenchao051</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/pipeline/1.htm">pipeline</a>
                                    <div>  
      最近集群上有个job,其中需要短时间内频繁访问缓存,大概7亿多次。我这边的缓存是使用redis来做的,问题就来了。 
      首先,redis中存的是普通kv,没有考虑使用hash等解结构,那么以为着这个job需要访问7亿多次redis,导致效率低,且出现很多redi</div>
                                </li>
                                <li><a href="/article/2433.htm"
                                       title="mysql导出数据不输出标题行" target="_blank">mysql导出数据不输出标题行</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%87%BA/1.htm">数据导出</a><a class="tag" taget="_blank" href="/search/%E5%8E%BB%E6%8E%89%E7%AC%AC%E4%B8%80%E8%A1%8C/1.htm">去掉第一行</a><a class="tag" taget="_blank" href="/search/%E5%8E%BB%E6%8E%89%E6%A0%87%E9%A2%98/1.htm">去掉标题</a>
                                    <div>当想使用数据库中的某些数据,想将其导入到文件中,而想去掉第一行的标题是可以加上-N参数 
 
如通过下面命令导出数据: 
mysql -uuserName -ppasswd -hhost -Pport -Ddatabase -e " select * from tableName"  > exportResult.txt 
 
结果为: 
 
studentid</div>
                                </li>
                                <li><a href="/article/2560.htm"
                                       title="phpexcel导出excel表简单入门示例" target="_blank">phpexcel导出excel表简单入门示例</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a><a class="tag" taget="_blank" href="/search/phpexcel/1.htm">phpexcel</a>
                                    <div>先下载PHPEXCEL类文件,放在class目录下面,然后新建一个index.php文件,内容如下 
<?php 
error_reporting(E_ALL); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 
  
if (PHP_SAPI == 'cli') 
 die('</div>
                                </li>
                                <li><a href="/article/2687.htm"
                                       title="爱情格言" target="_blank">爱情格言</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E6%A0%BC%E8%A8%80/1.htm">格言</a>
                                    <div> 1) I love you not because of who you are, but because of who I am when I am with you.    我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉。   2) No man or woman is worth your tears, and the one who is, won‘t</div>
                                </li>
                                <li><a href="/article/2814.htm"
                                       title="转 Activity 详解——Activity文档翻译" target="_blank">转 Activity 详解——Activity文档翻译</a>
                                    <span class="text-muted">e200702084</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/1.htm">配置管理</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/1.htm">网络应用</a>
                                    <div>activity 展现在用户面前的经常是全屏窗口,你也可以将 activity 作为浮动窗口来使用(使用设置了 windowIsFloating 的主题),或者嵌入到其他的 activity (使用 ActivityGroup )中。 当用户离开 activity 时你可以在 onPause() 进行相应的操作 。更重要的是,用户做的任何改变都应该在该点上提交 ( 经常提交到 ContentPro</div>
                                </li>
                                <li><a href="/article/2941.htm"
                                       title="win7安装MongoDB服务" target="_blank">win7安装MongoDB服务</a>
                                    <span class="text-muted">geeksun</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                    <div>1.  下载MongoDB的windows版本:mongodb-win32-x86_64-2008plus-ssl-3.0.4.zip,Linux版本也在这里下载,下载地址: http://www.mongodb.org/downloads 
  
2.  解压MongoDB在D:\server\mongodb, 在D:\server\mongodb下创建d</div>
                                </li>
                                <li><a href="/article/3068.htm"
                                       title="Javascript魔法方法:__defineGetter__,__defineSetter__" target="_blank">Javascript魔法方法:__defineGetter__,__defineSetter__</a>
                                    <span class="text-muted">hongtoushizi</span>
<a class="tag" taget="_blank" href="/search/js/1.htm">js</a>
                                    <div>转载自: http://www.blackglory.me/javascript-magic-method-definegetter-definesetter/ 
在javascript的类中,可以用defineGetter和defineSetter_控制成员变量的Get和Set行为 
例如,在一个图书类中,我们自动为Book加上书名符号: 
function Book(name){  </div>
                                </li>
                                <li><a href="/article/3195.htm"
                                       title="错误的日期格式可能导致走nginx proxy cache时不能进行304响应" target="_blank">错误的日期格式可能导致走nginx proxy cache时不能进行304响应</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a>
                                    <div>昨天在整合某些系统的nginx配置时,出现了当使用nginx cache时无法返回304响应的情况,出问题的响应头:    Content-Type:text/html; charset=gb2312   Date:Mon, 05 Jan 2015 01:58:05 GMT   Expires:Mon , 05 Jan 15 02:03:00 GMT   Last-Modified:Mon, 05</div>
                                </li>
                                <li><a href="/article/3322.htm"
                                       title="数据源架构模式之行数据入口" target="_blank">数据源架构模式之行数据入口</a>
                                    <span class="text-muted">home198979</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%85%A5%E5%8F%A3/1.htm">行数据入口</a>
                                    <div>注:看不懂的请勿踩,此文章非针对java,java爱好者可直接略过。 
  
一、概念 
行数据入口(Row Data Gateway):充当数据源中单条记录入口的对象,每行一个实例。 
  
二、简单实现行数据入口 
为了方便理解,还是先简单实现: 
<?php
/**
 * 行数据入口类
 */
class OrderGateway {
    /*定义元数</div>
                                </li>
                                <li><a href="/article/3449.htm"
                                       title="Linux各个目录的作用及内容" target="_blank">Linux各个目录的作用及内容</a>
                                    <span class="text-muted">pda158</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a>
                                    <div>1)根目录“/”     根目录位于目录结构的最顶层,用斜线(/)表示,类似于 
Windows 
操作系统的“C:\“,包含Fedora操作系统中所有的目录和文件。     2)/bin     /bin     目录又称为二进制目录,包含了那些供系统管理员和普通用户使用的重要 
linux命令的二进制映像。该目录存放的内容包括各种可执行文件,还有某些可执行文件的符号连接。常用的命令有:cp、d</div>
                                </li>
                                <li><a href="/article/3576.htm"
                                       title="ubuntu12.04上编译openjdk7" target="_blank">ubuntu12.04上编译openjdk7</a>
                                    <span class="text-muted">ol_beta</span>
<a class="tag" taget="_blank" href="/search/HotSpot/1.htm">HotSpot</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/OpenJDK/1.htm">OpenJDK</a>
                                    <div>获取源码  
 从openjdk代码仓库获取(比较慢) 
 
 安装mercurial Mercurial是一个版本管理工具。   sudo apt-get install mercurial    
 将以下内容添加到$HOME/.hgrc文件中,如果没有则自己创建一个: [extensions] forest=/home/lichengwu/hgforest-crew/forest.py fe</div>
                                </li>
                                <li><a href="/article/3703.htm"
                                       title="将数据库字段转换成设计文档所需的字段" target="_blank">将数据库字段转换成设计文档所需的字段</a>
                                    <span class="text-muted">vipbooks</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a>
                                    <div>        哈哈,出差这么久终于回来了,回家的感觉真好! 
        PowerDesigner的物理数据库一出来,设计文档中要改的字段就多得不计其数,如果要把PowerDesigner中的字段一个个Copy到设计文档中,那将会是一件非常痛苦的事情。</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>