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/1948102334181601280.htm"
                           title="sentinel授权规则" target="_blank">sentinel授权规则</a>
                        <span class="text-muted"></span>

                        <div>授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式白名单:来源在白名单内的调用者可以访问黑名单:来源在黑名单的调用者不允许访问例如,我们只允许从网关来的请求访问order-service,那么流控应用就填网关名称sentinel是通过RequestOriginParser这个接口的ParseOrigin来获取请求来源的,我们可以实现这个接口,重写方法,尝试从request中获取一个名为or</div>
                    </li>
                    <li><a href="/article/1948102282088345600.htm"
                           title="方南的余生日记2022-09-08" target="_blank">方南的余生日记2022-09-08</a>
                        <span class="text-muted">方南一路向东南西北</span>

                        <div>今天又加班···加班干啥,加班开会···开什么会,批斗大会。没有胖球比赛和LPL比赛和cba的日子里,我重新开始看起了足球比赛,也是不挑,什么意甲英超德甲,CCTV5转播哪场我就看哪场。比较有趣的事,有时候突然看见一个熟悉球员,会很惊讶:天呐!他尽然还在踢,还没有退役嘛?!但转念一想,伊布都还在踢呢···谁能老的过他啊老当益壮,挺好的。</div>
                    </li>
                    <li><a href="/article/1948102207933050880.htm"
                           title="npm报错npm ERR! A complete log of this run can be found in" target="_blank">npm报错npm ERR! A complete log of this run can be found in</a>
                        <span class="text-muted">leese233</span>
<a class="tag" taget="_blank" href="/search/1024%E7%A8%8B%E5%BA%8F%E5%91%98%E8%8A%82/1.htm">1024程序员节</a>
                        <div>网上有很多解决的办法,有的是删除node_modules从新npminstall.还有的解决办法是删除npm的缓存,但是这个报错还有一种根本性的原因–node版本太低,如果node的版本太低,而项目需求的版本较高,就有可能报这个错误,而且如果版本太低像删除node_modules从新npminstall也是没有用的,我遇到的就是这种问题,然后将node卸载从新安装高版本npminstall就不会遇</div>
                    </li>
                    <li><a href="/article/1948102027871580160.htm"
                           title="web前端进阶之Javascript设计模式面向对象篇" target="_blank">web前端进阶之Javascript设计模式面向对象篇</a>
                        <span class="text-muted">jia林</span>

                        <div>前言:在此说明Javascript设计模式所讲内容和知识点来自双越老师(wangEditor富文本开源作者)的视频,内容通俗易懂,受益匪浅,结合自己的学习心得整理成笔记,与大家分享,愿在前端的道路上越走越远.....从“写好代码”到“设计代码”的过程,不仅是技术的提升,更是编程思维的提升,而这其中最关键的就是设计模式,是否理解并掌握设计模式,也是衡量程序员能力的标准之一。学习前提使用过jquery</div>
                    </li>
                    <li><a href="/article/1948101703366668288.htm"
                           title="BERT 的“池化策略”" target="_blank">BERT 的“池化策略”</a>
                        <span class="text-muted">AI扶我青云志</span>
<a class="tag" taget="_blank" href="/search/bert/1.htm">bert</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a>
                        <div>为什么在BERT的config.json中会出现池化层(pooling)相关的参数。这个问题其实触及了BERT输出与下游任务之间的桥梁设计,也是你理解BERT在实际应用中如何工作的关键环节。首先明确:BERT的原始Transformer模块没有传统的池化层BERT是基于Transformer构建的,Transformer输出的是:sequence_output:Tensorofshape(batc</div>
                    </li>
                    <li><a href="/article/1948100569587576832.htm"
                           title="服务器被攻击IP地址是哪里的?如何预防攻击?" target="_blank">服务器被攻击IP地址是哪里的?如何预防攻击?</a>
                        <span class="text-muted"></span>

                        <div>总所周知,现在国内的大进犯大多都来自海外,由于国外的进犯成本比国内会低许多,一旦发起了进犯,并不容易找到进犯的源头。国外的家用带宽能到达千M口,咱们国内的百M口,相当于一只外国肉鸡能顶我们国内好几台肉鸡,那这个量是不得了的,并且国内的网站简直很少有国外用户访问,现在封海外是国内的一大趋势。UDP进犯是什么:UDP进犯全称:UDP吞没进犯(UDPFloodAttack)。UDP吞没进犯是导致主机拒绝</div>
                    </li>
                    <li><a href="/article/1948100443359997952.htm"
                           title="element-ui 多级树形表格加多选的效果" target="_blank">element-ui 多级树形表格加多选的效果</a>
                        <span class="text-muted">一个很哇塞的爷们</span>
<a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a>
                        <div>实现多级表格加多选的效果父级表格点击具有全选、全不选的功能,点击部分子级表格,父级表格实现半选中的状态template页面展示部分://表头单元格的style的回调方法,也可以使用一个固定的Object为所有表头单元格设置一样的Style。data数据部分:data(){return{renderDynamic:[{id:1,parentId:0,date:"2016-05-02",name:"王</div>
                    </li>
                    <li><a href="/article/1948100064748564480.htm"
                           title="这才是你需要了解的时序数据库 Apache-IoTDB 源码解析之系统架构!" target="_blank">这才是你需要了解的时序数据库 Apache-IoTDB 源码解析之系统架构!</a>
                        <span class="text-muted">AI科学小老师</span>

                        <div>个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈1.系统架构1.1系统简介以上示意图可能非常简单,但我觉得足够表明一个整体架构。当一台设备、一辆车连接到协议网关后,便开始了真正的收发数据。一般通信的方式都是基于tcp,搞一段二进制协议,所以协议网关基本要做的工作就是完成对连接的管理、完成对数据的收发及编解码。当数据完成编解码之后一般会发往消息队列当中,一般都是Kafka之中。用来</div>
                    </li>
                    <li><a href="/article/1948098805782081536.htm"
                           title="python里class转换_python实现class对象转换成json/字典的方法" target="_blank">python里class转换_python实现class对象转换成json/字典的方法</a>
                        <span class="text-muted">八决子</span>
<a class="tag" taget="_blank" href="/search/python%E9%87%8Cclass%E8%BD%AC%E6%8D%A2/1.htm">python里class转换</a>
                        <div>python实现class对象转换成json/字典的方法发布于2016-03-2808:05:44|153次阅读|评论:0|来源:网友投递Python编程语言Python是一种面向对象、解释型计算机程序设计语言,由GuidovanRossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块</div>
                    </li>
                    <li><a href="/article/1948098301345722368.htm"
                           title="时序数据库 Apache-IoTDB 源码解析之系统架构(二)" target="_blank">时序数据库 Apache-IoTDB 源码解析之系统架构(二)</a>
                        <span class="text-muted">zhoumouren88</span>
<a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a>
                        <div>上一章聊到时序数据是什么样,物联网行业中的时序数据的特点:存量数据大、新增数据多(采集频率高、设备量多)。详情请见:时序数据库Apache-IoTDB源码解析之前言(一)打一波广告,欢迎大家访问IoTDB仓库,求一波Star。这一章主要想聊一聊:物联网行业的基本系统架构,及使用数据库遇到的需求与挑战IoTDB的功能特点及系统架构车联网因为本人是在做车联网行业,所以对这个行业的信息了解更深入一些,能</div>
                    </li>
                    <li><a href="/article/1948098048496300032.htm"
                           title="Class14参数管理" target="_blank">Class14参数管理</a>
                        <span class="text-muted">Morning的呀</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>importtorchfromtorchimportnn#定义2个线性层+1个ReLU激活函数net=nn.Sequential(nn.Linear(4,8),nn.ReLU(),nn.Linear(8,1))#输入向量形状为(2,4)X=torch.rand(size=(2,4))#传入网络net(X)#打印第3个模块的参数字典print(net[2].state_dict())#查看第3层的偏</div>
                    </li>
                    <li><a href="/article/1948098049121251328.htm"
                           title="Class15自定义层" target="_blank">Class15自定义层</a>
                        <span class="text-muted">Morning的呀</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>importtorchimporttorch.nn.functionalasFfromtorchimportnn#定义类继承自nn.ModuleclassCenteredLayer(nn.Module):#构造函数def__init__(self):#调用父类构造函数super().__init__()#定义前向传播函数defforward(self,X):#每个元素减去整个张量的平均值retur</div>
                    </li>
                    <li><a href="/article/1948097922155474944.htm"
                           title="Class10代码实现" target="_blank">Class10代码实现</a>
                        <span class="text-muted">Morning的呀</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a>
                        <div>Class10代码实现importtorchfromtorchimportnnfromd2limporttorchasd2l#定义丢弃法函数#X:输入张量#dropout:丢弃概率(0~1)defdropout_layer(X,dropout):#丢弃概率在0-1之间assert0dropout:对每个位置判断是否保留#float():将布尔类型转换为浮点类型mask=(torch.rand(X.</div>
                    </li>
                    <li><a href="/article/1948097669536739328.htm"
                           title="Linux下防御DDOS攻击的操作梳理" target="_blank">Linux下防御DDOS攻击的操作梳理</a>
                        <span class="text-muted">寰宇001</span>

                        <div>DDOS介绍DDOS的全称是DistributedDenialofService,即"分布式拒绝服务攻击",是指击者利用大量“肉鸡”对攻击目标发动大量的正常或非正常请求、耗尽目标主机资源或网络资源,从而使被攻击的主机不能为合法用户提供服务。DDOS攻击的本质是:利用木桶原理,寻找利用系统应用的瓶颈;阻塞和耗尽;当前问题:用户的带宽小于攻击的规模,噪声访问带宽成为木桶的短板。可以参考下面的例子理解下</div>
                    </li>
                    <li><a href="/article/1948097669922615296.htm"
                           title="DPDK Sample Applications User Guides(42)Eventdev管道示例应用程序" target="_blank">DPDK Sample Applications User Guides(42)Eventdev管道示例应用程序</a>
                        <span class="text-muted">超帅浩浩</span>
<a class="tag" taget="_blank" href="/search/Sample/1.htm">Sample</a><a class="tag" taget="_blank" href="/search/Applications/1.htm">Applications</a><a class="tag" taget="_blank" href="/search/User/1.htm">User</a><a class="tag" taget="_blank" href="/search/Guides/1.htm">Guides</a><a class="tag" taget="_blank" href="/search/DPDK/1.htm">DPDK</a><a class="tag" taget="_blank" href="/search/eventdev/1.htm">eventdev</a><a class="tag" taget="_blank" href="/search/pipeline/1.htm">pipeline</a>
                        <div>官方文档查看地址:http://doc.dpdk.org/guides/sample_app_ug/eventdev_pipeline.htmlPDF下载地址:https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-sample-applications-user-guide.h</div>
                    </li>
                    <li><a href="/article/1948097543183331328.htm"
                           title="通信方式与交换方式详解" target="_blank">通信方式与交换方式详解</a>
                        <span class="text-muted">两圆相切</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E8%A7%84%E5%88%92%E8%AE%BE%E8%AE%A1%E5%B8%88/1.htm">网络规划设计师</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>通信方式与交换方式是通信网络中的核心概念,分别定义了数据传输的基本模式(通信方向与同步机制)和网络节点间的转发策略(路径选择与资源分配)。理解两者的分类与特性,对网络设计、协议选型及性能优化至关重要。一、通信方式(CommunicationModes)通信方式描述数据在传输过程中方向性和同步性的特征,决定了终端设备间的交互模式。1.1按传输方向分类类型定义核心特性典型场景单工通信数据仅能沿单一固定</div>
                    </li>
                    <li><a href="/article/1948097055507410944.htm"
                           title="心底有神药" target="_blank">心底有神药</a>
                        <span class="text-muted">桦楗</span>

                        <div>图片来自网络(侵删)一早,刚到办公室,老父亲就打来电话。电话中,很是兴奋,原来他老人家已经在小区散步多时了。这够让我意外的。更让我意外的是,老父亲电话中说,这次配制的中药有奇效,才吃四副就可以出门了,估计将剩下那六副吃完,病也许就好了。搁下电话,我半晌没回过神来。老父亲患病21年了,得了无特效之药的“矽肺病”,过冬犹过关。尤其是前年,毫不意识的在ICU住了5天,半梦半醒的又住了5天,走出ICU还住</div>
                    </li>
                    <li><a href="/article/1948097056774090752.htm"
                           title="Lamada表达式的一些使用范例" target="_blank">Lamada表达式的一些使用范例</a>
                        <span class="text-muted">singlezero</span>

                        <div>最近一直在看Lamada表达式,在开发中使用后现在真的越看越顺眼,这种函数式编程思维只要初窥门径,简直就停不下来,然后花了点时间做了一个使用总结范例,有不全面或是不对的请给位大佬指出,咱们一起探讨.importcom.google.common.collect.Lists;importcom.google.common.collect.Maps;importorg.junit.Before;imp</div>
                    </li>
                    <li><a href="/article/1948097058091102208.htm"
                           title="粘的ScalersTalk第七轮新概念朗读持续力训练Day 76 211229" target="_blank">粘的ScalersTalk第七轮新概念朗读持续力训练Day 76 211229</a>
                        <span class="text-muted">粘_NIAN</span>

                        <div>练习材料:Lesson76AprilFoolsDay'Toendourspecialnewsbulletin,'saidthevoiceofthetelevisionannouncer,'wearegoingovertothemacaronifieldsofCalabria.Macaronihasbeengrowninthisareaforoversixhundredyears.Twoofthel</div>
                    </li>
                    <li><a href="/article/1948096413711790080.htm"
                           title="晚间黄金分析" target="_blank">晚间黄金分析</a>
                        <span class="text-muted">青色信物</span>

                        <div>2021年2月4日(周四)黄金TD行情分析:黄金TD方面,日内黄金整体是震荡行情,最高测试381附近,最低测试377.15附近,止损上方黄金多单小幅度获利;日线方面收取一根实体大阴柱,布林呈现向下运行发展,MACD死叉持续放量,上方关注承压点385附近,下方支撑377;4小时线方面收取一根实体阳柱,布林向下开口发展,MACD死叉形成并递增放量,上方关注384附近;下方支撑位378;小时线方面收取一</div>
                    </li>
                    <li><a href="/article/1948096283759669248.htm"
                           title="探讨应用层网络协议栈设计-基础篇(一)" target="_blank">探讨应用层网络协议栈设计-基础篇(一)</a>
                        <span class="text-muted">橙子味虾片</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a>
                        <div>本篇想从这几个方向聊:整套系统它的受众业务,为何要探讨和学习网络协议栈开发基础知识,各模块角色的定位,为什么要设计这几个模块如何进行设计框架、工作线程模式、各模块如何高效协作本篇探讨和可学习的知识点:基础模块定位线程竞争处理负载均衡设计工作模式设计快慢的分离为什么开启本篇文章:应用层网络协议栈的开发,它是一套通用的解决网络需求的系统,网络需求指的是对网络数据的监控、审计、研判、提取、防护、可视等;</div>
                    </li>
                    <li><a href="/article/1948095779038097408.htm"
                           title="Vue的ubus emit/on使用" target="_blank">Vue的ubus emit/on使用</a>
                        <span class="text-muted">搞个项目</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>这段代码是Vue.js组件中的mounted生命周期钩子函数,主要作用是监听一个名为“macSelectData”的全局事件。具体行为如下:分步解释:mounted()生命周期钩子当组件被挂载到DOM后,Vue会自动调用mounted()方法。这里常用于初始化操作,比如数据请求、事件监听等。this.$bus.on("macSelectData",this.open)this.$bus:通常指通过</div>
                    </li>
                    <li><a href="/article/1948095148885864448.htm"
                           title="Android Gson复杂数据结构(如Map、List)的序列化逻辑原理剖析" target="_blank">Android Gson复杂数据结构(如Map、List)的序列化逻辑原理剖析</a>
                        <span class="text-muted"></span>

                        <div>一、复杂数据结构序列化概述1.1复杂数据结构处理的重要性在Android开发中,JSON数据往往包含复杂数据结构,如Map、List等。Gson作为常用的JSON处理库,其对复杂数据结构的序列化能力至关重要。准确处理这些结构能确保数据在网络传输、本地存储等场景下保持完整的语义和结构,避免数据丢失或格式错乱。1.2核心处理流程Gson对复杂数据结构的序列化主要包含以下步骤:类型识别:确定待序列化对象</div>
                    </li>
                    <li><a href="/article/1948095022616342528.htm"
                           title="深入理解 UniApp:跨平台开发的终极解决方案" target="_blank">深入理解 UniApp:跨平台开发的终极解决方案</a>
                        <span class="text-muted"></span>

                        <div>深入理解UniApp:跨平台开发的终极解决方案一、UniApp概述:重新定义跨平台开发(一)UniApp的诞生背景在移动互联网高速发展的今天,多端适配成为开发者面临的主要挑战。传统开发模式下,针对iOS、Android、微信小程序、H5等不同平台需要编写多套代码,开发成本高且维护困难。DCloud公司于2019年推出的UniApp,正是为了解决这一行业痛点而生。它基于Vue.js语法规范,实现了"</div>
                    </li>
                    <li><a href="/article/1948094392862568448.htm"
                           title="如何防止重复提交订单?" target="_blank">如何防止重复提交订单?</a>
                        <span class="text-muted">天天摸鱼的java工程师</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>如何防止重复提交订单?作者:Java后端开发工程师一、背景介绍:为什么会产生重复提交?在电商平台中,用户提交订单是一个非常敏感的动作。这通常涉及:库存扣减优惠券核销支付下单消息发送但用户总喜欢:点两次“提交订单”按钮网络卡顿时刷新页面使用浏览器回退再次提交结果就是:重复提交订单,造成资源浪费,甚至业务损失!二、问题分析:重复提交的常见场景场景示例用户行为多次点击按钮、浏览器刷新接口幂等性差接口无幂</div>
                    </li>
                    <li><a href="/article/1948094266559492096.htm"
                           title="如何将电商单体应用拆分为微服务?拆分粒度如何权衡?" target="_blank">如何将电商单体应用拆分为微服务?拆分粒度如何权衡?</a>
                        <span class="text-muted">天天摸鱼的java工程师</span>
<a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>如何将电商单体应用拆分为微服务?拆分粒度如何权衡?引言:在电商行业高速发展的今天,系统扩展性和交付速度成为核心竞争力。许多企业初期采用单体架构快速上线,但随着业务规模扩大,单体应用逐渐成为制约发展的瓶颈。你是否也面临这样的挑战:代码库臃肿不堪、发布周期越来越长、局部故障导致全局瘫痪、技术栈升级举步维艰?作为一名有8年开发经验的Java工程师,我曾主导多个大型电商系统的微服务拆分。今天我将分享从业务</div>
                    </li>
                    <li><a href="/article/1948094139753099264.htm"
                           title="七年老码农掏心窝:你踩过的 ThreadLocal 坑,我替你填了 3 遍" target="_blank">七年老码农掏心窝:你踩过的 ThreadLocal 坑,我替你填了 3 遍</a>
                        <span class="text-muted">天天摸鱼的java工程师</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>
                        <div>工作一年踩坑记:我终于搞懂了ThreadLocal这玩意儿大家好,我是那个在多线程坑里摸爬滚打了七年的菜鸡程序员。上周写接口时遇到个诡异问题:两个线程同时操作一个日期格式化工具类,结果返回的时间居然串了!老员工丢给我一句“用ThreadLocal啊”,当时我心里直犯嘀咕:这玩意儿听起来像“线程本地变量”,但到底怎么用?为啥能解决线程安全?今天就把我啃源码、查资料、踩坑无数的心得掰碎了讲,咱用人话聊</div>
                    </li>
                    <li><a href="/article/1948092878291005440.htm"
                           title="uni-app跨平台开发知识点总结" target="_blank">uni-app跨平台开发知识点总结</a>
                        <span class="text-muted"></span>

                        <div>uni-app简介uni-app概述:uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。uni-app由来:是为了解决跨平台开发的问题。在移动应用开发中,不同平台(如iOS、Android)有不同的开发语言和技术栈,这导致开发者</div>
                    </li>
                    <li><a href="/article/1948092860670734336.htm"
                           title="「傅体书画」傅继英书法作品分享:花晨月夕,茶半香初 67*137CM 2021.12.12" target="_blank">「傅体书画」傅继英书法作品分享:花晨月夕,茶半香初 67*137CM 2021.12.12</a>
                        <span class="text-muted">傅继英艺术馆</span>

                        <div>「傅体书画」傅继英书法作品分享:花晨月夕,茶半香初67*137CM2021.12.12「傅体书画」傅继英书法作品分享:花晨月夕,茶半香初67*137CM2021.12.12「傅体书画」傅继英书法作品分享:花晨月夕,茶半香初67*137CM2021.12.12「傅体书画」傅继英书法作品分享:花晨月夕,茶半香初67*137CM2021.12.12「傅体书画」傅继英书法作品分享:花晨月夕,茶半香初67*</div>
                    </li>
                    <li><a href="/article/1948092605229232128.htm"
                           title="美欧通胀爆表!老美放低姿态示好沙特,油价要降下来啦?" target="_blank">美欧通胀爆表!老美放低姿态示好沙特,油价要降下来啦?</a>
                        <span class="text-muted">李云飞</span>

                        <div>作者:李云飞|来源:原创一位久经商场的创业老司机,关注我,每天分享一点财富干货,让你的人生少走弯路。美国和沙特、阿联酋等一些中东大国召开了一场重要的会议。这次会议成为了全世界关注的焦点,更是各路资本密切关注的对象。这是一场什么会议这么重要呢?再说这次会议主要的内容又是什么呢?不用我说,大家用脚趾头都能够猜出来,那肯定就是商讨中东石油加量供应的问题。现在美国是真的急了。我们来看一组数据:美国6月份C</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>