FastCGI编程介绍

CGI(Common Gateway Interface)公共网关接口,是HTTP服务器与其他程序通信的工具。FastCGI是一个long-live型的CGI,支持分布式计算,它将CGI解释器进程保持在内存中并因此获得较高的性能。

FastCGI工作方式是接受Web服务器的请求,以HTTP Request的方式进行响应,实现了应用程序与Web服务器的分离。它的使用需要在Web服务器中安装支持组件,目前支持Apache、Nginx、IIS、Lighttpd等。


优点有:

  • 稳定性,fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑
  • 安全性,fastcgi和宿主的server完全独立,fastcgi怎么down也不会把server搞垮
  • 性能, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说,,逻辑处理可能只有一小部分,大量的图片等静态IO处理完全不需要逻辑程序的参与
  • 扩展性,fastcgi是一个中立的技术标准,完全可以支持任何语言写的处理程序(php、java、python、C++)

FastCGI编程包括四部分:初始化编码、接收请求循环、响应内容、响应结束循环。

[cpp] view plain copy
  1. FCGX_Request request;  
  2. FCGX_Init();  
  3. int sock_fd = FCGX_OpenSocket("10.3.17.75:8003",100);  
  4. FCGX_InitRequest(&request, sock_fd, 0);  
  5. while (FCGX_Accept_r(&request) >= 0) {  
  6.   //get param 1  
  7.   map param_map;  
  8.   for(int i = 0; request.envp[i]; ++i) {  
  9.     string s = request.envp[i];  
  10.     size_t pos = s.find_first_of('=');  
  11.     if (pos > 0 && pos < s.size() - 1) {  
  12.       param_map.insert(make_pair(s.substr(0,pos), s.substr(pos+1)));  
  13.     }  
  14.   }  
  15.   //or 2   
  16.   char * clenstr = FCGX_GetParam("CONTENT_LENGTH", request.envp);  
  17.   //do something  
  18.   FCGX_Stream* fcgi_out = request.out;  
  19.   string output="test";  
  20.   FCGX_PutS(output.c_str(), fcgi_out);  
  21.   //finish  
  22.   FCGX_Finish_r(&request);  




fastcgi中的多线程使用

博客分类: 天天编程
fastcgi 多线程 并发 性能 对比 

0.背景

在项目中加入了等待通讯的内容,所以原来单个请求处理时间增加了。单线程处理的fcgi就会浪费CPU和用户时间,所以需要多线程来处理,减少用户排队时间。

将处理用户请求的部分从单线程变为多线程,需要大概了解改动会不会影响性能。

得到的结论是:多线程和单线程在执行的流程和使用方法几乎一样,所以多线程不会带来额外的负担。

1.单线程的处理步骤

1.1一个简单的单线程fcgi请求

C代码   收藏代码
  1. #include   
  2.   
  3. void main(void)  
  4. {  
  5.     int count = 0;  
  6.     while(FCGI_Accept() >= 0) {  
  7.         printf("Content-type: text/html\r\n");  
  8.         printf("\r\n");  
  9.         printf("Hello world!
    \r\n"
    );  
  10.         printf("Request number %d.", count++);  
  11.     }  
  12.     exit(0);  
  13. }  

1.2进入FCGI_Accept。

进入这个 FCGI_Accept() 方法里面,在文件fcgi_stdio.c里。

C代码   收藏代码
  1. int FCGI_Accept(void)  
  2. {  
  3.     //变量表示是否接收请求。默认为Fasle,不接收请求  
  4.     if(!acceptCalled) {  
  5.         //判断是否为cgi,变量为全局静态的,下次还会用。  
  6.         isCGI = FCGX_IsCGI();  
  7.         //状态改为接收请求。  
  8.         acceptCalled = TRUE;  
  9.         //请求的收尾,将数值清空赋初值。  
  10.         atexit(&FCGI_Finish);  
  11.     } else if(isCGI) {  
  12.         //不是第一次请求,并且是cgi程序。  
  13.         return(EOF);  
  14.     }  
  15.     if(isCGI) {  
  16.         //cgi的初始赋值操作,不关心。  
  17.         ...  
  18.     } else {  
  19.         FCGX_Stream *in, *out, *error;  
  20.         //char** 字符串数组。  
  21.         FCGX_ParamArray envp;  
  22.         //接受请求,这个方法下面介绍  
  23.         int acceptResult = FCGX_Accept(&in, &out, &error, &envp);  
  24.         //接收失败,返回<0,这也是为什么在循环上判断是 while(FCGI_Accept() >= 0)  
  25.         if(acceptResult < 0) {  
  26.             return acceptResult;  
  27.         }  
  28.         //将得到的数据赋值给对应的输出,输入,data。  
  29.         FCGI_stdin->stdio_stream = NULL;  
  30.         FCGI_stdin->fcgx_stream = in;  
  31.         FCGI_stdout->stdio_stream = NULL;  
  32.         FCGI_stdout->fcgx_stream = out;  
  33.         FCGI_stderr->stdio_stream = NULL;  
  34.         FCGI_stderr->fcgx_stream = error;  
  35.         environ = envp;  
  36.     }  
  37.     //结束  
  38.     return 0;  
  39. }  

1.3  FCGX_Accept(&in, &out, &error, &envp)

等待接收请求的方法,在fcgiaoo.c里。

C代码   收藏代码
  1. static FCGX_Request the_request;  
  2.   
  3. int FCGX_Accept(FCGX_Stream **in,FCGX_Stream **out,FCGX_Stream **err,FCGX_ParamArray *envp)  
  4. {  
  5.     int rc;//定义返回的变量。  
  6.     //是否初始化过。  
  7.     if (! libInitialized) {  
  8.         rc = FCGX_Init();  
  9.         if (rc) {  
  10.             return rc;  
  11.         }  
  12.     }  
  13.     //接收数据,下面介绍  
  14.     rc = FCGX_Accept_r(&the_request);  
  15.     //给对应流和数据赋值。  
  16.     *in = the_request.in;  
  17.     *out = the_request.out;  
  18.     *err = the_request.err;  
  19.     *envp = the_request.envp;  
  20.   
  21.     return rc;  
  22. }  

1.4 FCGX_Accept_r(),同在fcgiapp.c里面;

C代码   收藏代码
  1. /* 
  2.  *---------------------------------------------------------------------- 
  3.  * 
  4.  * FCGX_Accept_r -- 
  5.  * 
  6.  *      从http server 接收一个新的请求 
  7.  * Results: 
  8.  *      正确返回0,错误返回-1. 
  9.  * Side effects: 
  10.  * 
  11.  *      通过FCGX_Accept完成请求的接收,创建input,output等流并且各自分配给in 
  12.  *      ,out,err.创建参数数据从FCGX_GetParam中取出,并且给envp。 
  13.  *      不要保存指针和字符串,他们会在下次请求中的FcGX_Finish中被释放。 
  14.  *---------------------------------------------------------------------- 
  15.  */  
  16. int FCGX_Accept_r(FCGX_Request *reqDataPtr)  
  17. {  
  18.     if (!libInitialized) {  
  19.         return -9998;  
  20.     }  
  21.   
  22.     //将当前的reqData完成请求。将内容释放,初始化。  
  23.     FCGX_Finish_r(reqDataPtr);  
  24.     //while  
  25.     for (;;) {  
  26.         //ipcFd 是双方通讯的管道,在上面的FCGX_Finish_r中被赋值-1。  
  27.         if (reqDataPtr->ipcFd < 0) {  
  28.             int fail_on_intr = reqDataPtr->flags & FCGI_FAIL_ACCEPT_ON_INTR;  
  29.             //接收一次请求,传入socket,没有请求会在这里等待。这里面是重点,可是我看不懂。  
  30.             reqDataPtr->ipcFd = OS_Accept(reqDataPtr->listen_sock, fail_on_intr, webServerAddressList);  
  31.             if (reqDataPtr->ipcFd < 0) {  
  32.                 return (errno > 0) ? (0 - errno) : -9999;  
  33.             }  
  34.         }  
  35.         reqDataPtr->isBeginProcessed = FALSE;  
  36.         reqDataPtr->in = NewReader(reqDataPtr, 8192, 0);  
  37.         FillBuffProc(reqDataPtr->in);  
  38.         if(!reqDataPtr->isBeginProcessed) {  
  39.             goto TryAgain;  
  40.         }  
  41.         {  
  42.             //查看请求类型。  
  43.             char *roleStr;  
  44.             switch(reqDataPtr->role) {  
  45.                 case FCGI_RESPONDER:  
  46.                     roleStr = "FCGI_ROLE=RESPONDER";  
  47.                     break;  
  48.                 case FCGI_AUTHORIZER:  
  49.                     roleStr = "FCGI_ROLE=AUTHORIZER";  
  50.                     break;  
  51.                 case FCGI_FILTER:  
  52.                     roleStr = "FCGI_ROLE=FILTER";  
  53.                     break;  
  54.                 default:  
  55.                     goto TryAgain;  
  56.             }  
  57.             //创建存储参数QueryString的空间。  
  58.             reqDataPtr->paramsPtr = NewParams(30);  
  59.             //将请求类型当做key-value加入参数里。  
  60.             PutParam(reqDataPtr->paramsPtr, StringCopy(roleStr));  
  61.         }  
  62.         //将输入流以制定的方式读取(在哪停止,是否需要跳过请求)  
  63.         SetReaderType(reqDataPtr->in, FCGI_PARAMS);  
  64.         //将参数读取写入key=value。  
  65.         if(ReadParams(reqDataPtr->paramsPtr, reqDataPtr->in) >= 0) {  
  66.             //跳出循环,否则等下一次请求。  
  67.             break;  
  68.         }  
  69.   
  70.         //释放这些中间产生的东西。将ipcFd置为-1.  
  71. TryAgain:  
  72.         FCGX_Free(reqDataPtr, 1);  
  73.   
  74.     } /* for (;;) */  
  75.     //将剩下的信息赋值。完成一个请求的开始部分。  
  76.     SetReaderType(reqDataPtr->in, FCGI_STDIN);  
  77.     reqDataPtr->out = NewWriter(reqDataPtr, 8192, FCGI_STDOUT);  
  78.     reqDataPtr->err = NewWriter(reqDataPtr, 512, FCGI_STDERR);  
  79.     reqDataPtr->nWriters = 2;  
  80.     reqDataPtr->envp = reqDataPtr->paramsPtr->vec;  
  81.     return 0;  
  82. }  

1.5 在接收请求之前执行的FCGX_Finish_r(reqDataPtr),在fcgiapp.c里;

C代码   收藏代码
  1. void FCGX_Finish_r(FCGX_Request *reqDataPtr)  
  2. {  
  3.     int close;  
  4.   
  5.     if (reqDataPtr == NULL) {  
  6.         return;  
  7.     }  
  8.   
  9.     close = !reqDataPtr->keepConnection;  
  10.   
  11.     if (reqDataPtr->in) {  
  12.         close |= FCGX_FClose(reqDataPtr->err);  
  13.         close |= FCGX_FClose(reqDataPtr->out);  
  14.     close |= FCGX_GetError(reqDataPtr->in);  
  15.     }  
  16.   
  17.     FCGX_Free(reqDataPtr, close);  
  18. }  

 

基本结束了,只能看懂流程。

二 多线程的请求

2.1多线程请求例子

官网多线程的例子,(http://www.fastcgi.com/devkit/examples/threaded.c)

去掉多余的输出。

 

C代码   收藏代码
  1. #define THREAD_COUNT 20  
  2.   
  3. static int counts[THREAD_COUNT];  
  4.   
  5. static void *doit(void *a)  
  6. {  
  7.     int rc;  
  8.     FCGX_Request request;  
  9.     FCGX_InitRequest(&request, 0, 0);  
  10.     for (;;)  
  11.     {  
  12.         rc = FCGX_Accept_r(&request);  
  13.   
  14.         if (rc < 0)  
  15.             break;  
  16.         FCGX_FPrintF(request.out,  
  17.             "Content-type: text/html\r\n"  
  18.             "\r\n"  
  19.             "FastCGI Hello! "</span><span>);  </span></span></li> <li><span>  </span></li> <li><span>        sleep(2);  </span></li> <li><span>        FCGX_Finish_r(&request);  </span></li> <li><span>    }  </span></li> <li><span>    <span class="keyword">return</span><span> NULL;  </span></span></li> <li><span>}  </span></li> <li><span>  </span></li> <li><span><span class="datatypes">int</span><span> main(</span><span class="keyword">void</span><span>)  </span></span></li> <li><span>{  </span></li> <li><span>    <span class="datatypes">int</span><span> i;  </span></span></li> <li><span>    pthread_t id[THREAD_COUNT];  </span></li> <li><span>  </span></li> <li><span>    FCGX_Init();  </span></li> <li><span>  </span></li> <li><span>    <span class="keyword">for</span><span> (i = 1; i < THREAD_COUNT; i++)  </span></span></li> <li><span>        pthread_create(&id[i], NULL, doit, (<span class="keyword">void</span><span>*)i);  </span></span></li> <li><span>  </span></li> <li><span>    doit(0);  </span></li> <li><span>    <span class="keyword">return</span><span> 0;  </span></span></li> <li><span>}  </span></li> </ol> </div> <h4>2.2和fcgi有关的方法</h4> <p>在main方法里</p> <div class="dp-highlighter"> <div class="bar"> <div class="tools"> C代码   <img class="star" src="http://img.e-com-net.com/image/info8/de46599fd9f24203ad3d22a3a971c850.jpg" alt="收藏代码" width="15" height="14"> </div> </div> <ol class="dp-cpp" start="1"> <li><span><span>FCGX_Init();  </span></span></li> <li><span>Initilize the FCGX library.  This is called by FCGX_Accept()  </span></li> <li><span>but must be called by the user when <span class="keyword">using</span><span> FCGX_Accept_r().  </span></span></li> </ol> </div> <p>在多线程里:</p> <div class="dp-highlighter"> <div class="bar"> <div class="tools"> C代码   <img class="star" src="http://img.e-com-net.com/image/info8/de46599fd9f24203ad3d22a3a971c850.jpg" alt="收藏代码" width="15" height="14"> </div> </div> <ol class="dp-cpp" start="1"> <li><span><span>FCGX_Request request;  </span></span></li> <li><span>FCGX_InitRequest(&request, 0, 0);  </span></li> <li><span><span class="keyword">while</span><span>(){  </span></span></li> <li><span>rc = FCGX_Accept_r(&request);  </span></li> <li><span>FCGX_FPrintF(request.out,<span class="string">""</span><span>);  </span></span></li> <li><span>FCGX_Finish_r(&request);  </span></li> <li><span>}  </span></li> </ol> </div> <h2>3.结束 </h2> <p>刚刚开始用C语言,希望说错的地方大家提出来。</p> </div> <br> <p></p> </div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1297982229766545408"></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">你可能感兴趣的:(http)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1903458696281780224.htm" title=".gitlab-ci.yml 配置文件详解" target="_blank">.gitlab-ci.yml 配置文件详解</a> <span class="text-muted">程序媛夏天</span> <a class="tag" taget="_blank" href="/search/Git/1.htm">Git</a><a class="tag" taget="_blank" href="/search/gitlab/1.htm">gitlab</a><a class="tag" taget="_blank" href="/search/ci%2Fcd/1.htm">ci/cd</a><a class="tag" taget="_blank" href="/search/.gitlab-ci.yml/1.htm">.gitlab-ci.yml</a> <div>个人主页:不爱吃糖的程序媛‍♂️作者简介:前端领域新星创作者、CSDN内容合伙人,专注于前端各领域技术,成长的路上共同学习共同进步,一起加油呀!✨系列专栏:前端面试宝典、JavaScript进阶、vue实战资料领取:前端进阶资料以及文中源码可以在公众号“不爱吃糖的程序媛”领取git工具文档说明:https://docs.gitlab.com/ee/ci/yaml/gitlab_ci_yaml.ht</div> </li> <li><a href="/article/1903456553768382464.htm" title="python八股(—) --FBV,CBV" target="_blank">python八股(—) --FBV,CBV</a> <span class="text-muted">suohanfjiusbis</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/python/1.htm">python</a> <div>引言FBV是面向函数的视图。defFBV(request):ifrequest.method=='GET':returnHttpResponse("GET")elifrequest.method=='POST':returnHttpResponse("POST")CBV是面向类的视图。classCBV(View):defget(self,request):returnHttpResponse("G</div> </li> <li><a href="/article/1903451134085885952.htm" title="使用Ollama部署开源大模型" target="_blank">使用Ollama部署开源大模型</a> <span class="text-muted">好好学习 666</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a> <div>Ollama是一个简明易用的本地大模型运行框架,可以一键启动启动并运行Llama3、Mistral、Gemma和其他大型语言模型。安装MacOS,Windows用户直接在官网下载页下载安装包即可。Linux系统运行如下命令安装curl-fsSLhttps://ollama.com/install.sh|sh使用Usage:ollama[flags]ollama[command]AvailableC</div> </li> <li><a href="/article/1903450696003416064.htm" title="【赵渝强老师】在Docker中运行达梦数据库" target="_blank">【赵渝强老师】在Docker中运行达梦数据库</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93docker/1.htm">数据库docker</a> <div>Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM8在Docker容器中进行部署的镜像文件,下面通过具体的步骤进行演示。视频讲解如下:https://www.bilibili.com/video/BV1yBfB</div> </li> <li><a href="/article/1903448992390377472.htm" title="【2017-2025】Adobe Photoshop【PS】软件下载安装" target="_blank">【2017-2025】Adobe Photoshop【PS】软件下载安装</a> <span class="text-muted">adkjcbqvblq</span> <a class="tag" taget="_blank" href="/search/adobe/1.htm">adobe</a><a class="tag" taget="_blank" href="/search/photoshop/1.htm">photoshop</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a> <div>获取安装包https://pan.baidu.com/s/1NLUthiAyC2chlSEwbf1LRQ?pwd=4ppq1.起源与发展1.1初试啼声AdobePhotoshop的历史可以追溯到1987年,当时由托马斯·诺尔(ThomasKnoll)和他的兄弟约翰·诺尔(JohnKnoll)共同开发。托马斯在父亲的帮助下,开始了图像处理的编程尝试。他们的初始产品是一个用于Mac系统的程序,最初名为</div> </li> <li><a href="/article/1903447983119200256.htm" title="CBNetV2: A Composite Backbone Network Architecture for Object Detection论文阅读" target="_blank">CBNetV2: A Composite Backbone Network Architecture for Object Detection论文阅读</a> <span class="text-muted">Laughing-q</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB/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><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/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E4%BE%8B%E5%88%86%E5%89%B2/1.htm">实例分割</a><a class="tag" taget="_blank" href="/search/transformer/1.htm">transformer</a> <div>CBNetV2:ACompositeBackboneNetworkArchitectureforObjectDetection论文阅读介绍方法CBNetV2融合方式对Assistant的监督实验与SOTA的比较在主流backbone架构上的通用性与更宽更深的网络比较与可变形卷积的兼容在主流检测器上的模型适用性在SwinTransformer上的模型适用性消融实验paper:https://arxi</div> </li> <li><a href="/article/1903447100394369024.htm" title="清华出品DeepSeek教程1-7版:前沿技术学习的黄金资源库" target="_blank">清华出品DeepSeek教程1-7版:前沿技术学习的黄金资源库</a> <span class="text-muted">你好ITgg</span> <a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a> <div>《清华出品DeepSeek教程1-7版:前沿技术学习的黄金资源库》「DeepSeek清华资料」共7册链接:https://pan.quark.cn/s/b8d8760976ca「DeepSeek使用手册大全」链接:https://pan.quark.cn/s/52c234062a2e「DeepSeek资料合集」链接:https://pan.quark.cn/s/71c8604f0e8a「DeepS</div> </li> <li><a href="/article/1903429327760977920.htm" title="HTTP请求过程详解" target="_blank">HTTP请求过程详解</a> <span class="text-muted">酥暮沐</span> <a class="tag" taget="_blank" href="/search/http/1.htm">http</a><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> <div>一、整体流程概述HTTP请求过程从用户输入URL开始,到页面完成渲染结束,主要分为DNS解析、建立连接、发送请求、处理响应、渲染页面、断开连接六个核心阶段。重要:当用户输入URL后,浏览器首先解析域名,通过DNS查询获取服务器IP。接着通过三次握手建立TCP连接,如果是HTTPS还会进行TLS加密协商。然后浏览器发送HTTP请求,服务器处理后返回响应数据。浏览器解析HTML/CSS,构建DOM和渲</div> </li> <li><a href="/article/1903425422058647552.htm" title="输了,腾讯golang一面凉了" target="_blank">输了,腾讯golang一面凉了</a> <span class="text-muted">golang学习记</span> <a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a> <div>本月正值4月,是金三银四的找工作的最佳时机。同时竞争也是很大,因为每年这个时候快要毕业的大学生也进去了找工作的潮水中。今天分享我的一位大佬朋友CC,勇闯腾讯golang的面试经历。这次面试问题的方向主要集中在计算机基础个网络方面。下面是主要问到的问题。第一个,http握手,https证书第二个,操作系统的中断,堆和栈第三个,数据库,乐观锁,悲观锁,acid等TSL四次握手的过程是什么第一次握手首先</div> </li> <li><a href="/article/1903418237362696192.htm" title="栈 力扣hot100热门面试算法题 面试基础 核心思路 背题 滑动窗口最大值 字符串解码 每日温度 柱状图中最大矩形 有效的括号 最小栈" target="_blank">栈 力扣hot100热门面试算法题 面试基础 核心思路 背题 滑动窗口最大值 字符串解码 每日温度 柱状图中最大矩形 有效的括号 最小栈</a> <span class="text-muted">尘土哥</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>栈栈的核心思路:每个数都要进栈or队列,但是要及时维护栈or队列,当某元素没有存在的意义时就删掉,关键是思考栈尾什么时候有用与没用。滑动窗口最大值https://leetcode.cn/problems/sliding-window-maximum/题解链接https://leetcode.cn/problems/sliding-window-maximum/solutions/3067170/d</div> </li> <li><a href="/article/1903412940141293568.htm" title="Linux当中解决apt-get install E: 无法定位软件包问题" target="_blank">Linux当中解决apt-get install E: 无法定位软件包问题</a> <span class="text-muted">wt-cai</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>最近遇到一些问题,记录一下。也给其他人参考解决方案。主要参考该博客:https://blog.csdn.net/qq_36698189/article/details/115607886注意:更换清华源的时候一定要跟自己ubuntu版本相对应,不然可能会有其他问题。还有其他问题,如:1.Linux中使用apt/apt-get时报错:libc6-dev:破坏(依赖):libgcc-9-dev(<9.</div> </li> <li><a href="/article/1903408021506158592.htm" title="DeepSeek 部署指南 (使用 vLLM 本地部署)" target="_blank">DeepSeek 部署指南 (使用 vLLM 本地部署)</a> <span class="text-muted">AGI大模型资料分享员</span> <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/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</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/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a> <div>DeepSeek部署指南(使用vLLM本地部署)本文档将指导您如何使用vLLM在本地部署DeepSeek语言模型。我们以deepseek-ai/DeepSeek-R1-Distill-Qwen-7B模型为例进行演示。1、安装Python环境首先,您需要安装Python环境。访问Python官网:https://www.python.org/根据您的操作系统选择安装包:Python官网提供Windo</div> </li> <li><a href="/article/1903407011526144000.htm" title="同步MySQL数据至Elasticsearch:go-mysql-elasticsearch实战指南" target="_blank">同步MySQL数据至Elasticsearch:go-mysql-elasticsearch实战指南</a> <span class="text-muted">吴镇业</span> <div>同步MySQL数据至Elasticsearch:go-mysql-elasticsearch实战指南go-mysql-elasticsearchSyncMySQLdataintoelasticsearch项目地址:https://gitcode.com/gh_mirrors/go/go-mysql-elasticsearch项目介绍go-mysql-elasticsearch是一个服务,能够自动将</div> </li> <li><a href="/article/1903405871132635136.htm" title="QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图、天地图)" target="_blank">QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图、天地图)</a> <span class="text-muted">信必诺</span> <a class="tag" taget="_blank" href="/search/QGIS/1.htm">QGIS</a><a class="tag" taget="_blank" href="/search/QGis/1.htm">QGis</a><a class="tag" taget="_blank" href="/search/%E5%9C%A8%E7%BA%BF%E5%9C%B0%E5%9B%BE/1.htm">在线地图</a> <div>(方式一)通过"QGis浏览器"加载     1、在QGis软件找到"浏览器"-“XYZTiles”-右键点击"新建连接",如下图                2、在"XYZ连接"窗内,填如下图红框内容。完成后点击"OK"即可。          Google地图服务地址:https://gac-geo.googlecnapps.cn/maps/vt?lyrs=s&x={x}&y={y}&z={</div> </li> <li><a href="/article/1903405114983510016.htm" title="山西中考计算机评分软件" target="_blank">山西中考计算机评分软件</a> <span class="text-muted">SuRuiYuan1</span> <a class="tag" taget="_blank" href="/search/%E5%B1%B1%E8%A5%BF%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%E4%B8%AD%E8%80%83%E8%AF%84%E5%88%86%E8%BD%AF%E4%BB%B6/1.htm">山西信息技术中考评分软件</a> <div>访问网址:https://www.123865.com/s/cPmDjv-mSeBd提取码:zkds下载安装后具体步骤请访问:https://www.123865.com/s/cPmDjv-1SeBd提取码:zkds满分操作步骤:https://www.123865.com/s/cPmDjv-4SeBd提取码:zkds</div> </li> <li><a href="/article/1903404610022862848.htm" title="解决Ubuntu命令“sudo apt-get install”——“ E: 无法定位软件包”问题" target="_blank">解决Ubuntu命令“sudo apt-get install”——“ E: 无法定位软件包”问题</a> <span class="text-muted">Joker 007</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>1.添加镜像源(本文是清华源)。运行代码:sudovim/etc/apt/sources.list添加如下内容:debhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/bionicmainrestricteduniversemultiverse#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/bionicm</div> </li> <li><a href="/article/1903395533653864448.htm" title="Spring系列学习之Spring Messaging消息支持" target="_blank">Spring系列学习之Spring Messaging消息支持</a> <span class="text-muted">m0_74825488</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/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/linq/1.htm">linq</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>英文原文:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-messaging.html目录JMSActiveMQ支持Artemis支持使用JNDIConnectionFactory发送消息接收消息AMQPRabbitMQ支持发送消息接收消息ApacheKafka支持发送消息接收消息Kafka流</div> </li> <li><a href="/article/1903394522579136512.htm" title="DS918 -6.24-25556 引导+安装包:高效稳定的NAS系统解决方案" target="_blank">DS918 -6.24-25556 引导+安装包:高效稳定的NAS系统解决方案</a> <span class="text-muted">咎尉裕Lilah</span> <div>DS918-6.24-25556引导+安装包:高效稳定的NAS系统解决方案【下载地址】DS918-6.24-25556引导安装包本仓库提供的是DS918_6.24-25556引导+安装包,包含所有必要的配套资源。经过亲测,该安装包完全可用,适合需要安装或升级DS918系统的用户使用项目地址:https://gitcode.com/open-source-toolkit/5d54e项目介绍DS918</div> </li> <li><a href="/article/1903394269893292032.htm" title="推荐开源项目:FastAPI Best Architecture — 极致的后端架构设计" target="_blank">推荐开源项目:FastAPI Best Architecture — 极致的后端架构设计</a> <span class="text-muted">蓬玮剑</span> <div>推荐开源项目:FastAPIBestArchitecture—极致的后端架构设计项目地址:https://gitcode.com/gh_mirrors/fa/fastapi_best_architecture项目简介在寻找一款基于FastAPI构建的强大且灵活的后端解决方案吗?那么,你已经找到了——FastAPIBestArchitecture。这是一个遵循前端与后端分离原则的中间件层解决方案,采</div> </li> <li><a href="/article/1903394143804125184.htm" title="在Ubuntu20.04上交叉编译能在Windows上运行的Qt5应用" target="_blank">在Ubuntu20.04上交叉编译能在Windows上运行的Qt5应用</a> <span class="text-muted">daqinzl</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/Ubuntu20.04/1.htm">Ubuntu20.04</a><a class="tag" taget="_blank" href="/search/Qt5/1.htm">Qt5</a><a class="tag" taget="_blank" href="/search/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91/1.htm">交叉编译</a><a class="tag" taget="_blank" href="/search/Windows%E5%BA%94%E7%94%A8/1.htm">Windows应用</a> <div>参考链接:https://blog.csdn.net/Interview_TC/article/details/146050419https://bugreports.qt.io/browse/QTBUG-82592重要设置sudoupdate-alternatives--configx86_64-w64-mingw32-g++选择后缀带posix的,(/usr/bin/x86_64-w64-mi</div> </li> <li><a href="/article/1903388218284371968.htm" title="IP地址怎么加密https访问?" target="_blank">IP地址怎么加密https访问?</a> <span class="text-muted">william082012</span> <a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a><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%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a> <div>HTTPS作为一种通过计算机网络进行安全通信的传输协议,它是在HTTP上建立的SSL/TLS加密层,并对传输数据进行加密。许多网站和在线服务已经转向HTTPS,以确保数据传输的安全性和隐私性。然而,当涉及到通过IP地址直接访问服务时,如何为这些连接添加HTTPS加密成为了一个重要的问题。一、了解SSL证书SSL证书则是实现HTTPS的关键。它是由受信任的证书颁发机构(CA)签发的,用于证明网站的真</div> </li> <li><a href="/article/1903387210934185984.htm" title="详解 SSL(三):SSL 证书该如何选择?" target="_blank">详解 SSL(三):SSL 证书该如何选择?</a> <span class="text-muted">捞起月亮的渔民丁</span> <a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>详解SSL(三):SSL证书该如何选择?在上一篇《详解SSL(二):SSL证书对网站的好处》中,我们知道了在网站部署SSL证书后,不管是对网站本身还是对网站的用户都能够带来许多好处。那么随着HTTPS的普及,市面上也出现了各种不同的SSL证书。并且由于SSL证书的多样性,很多人对于如何选择SSL证书有着很大的困惑。因此,本篇文章将从证书安全级别、域名数量、用户类型这三个方面提供合理性建议。首先,我</div> </li> <li><a href="/article/1903385445627129856.htm" title="SSL证书申请,流程,分类" target="_blank">SSL证书申请,流程,分类</a> <span class="text-muted">thinkhi9999</span> <a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>SSH与SSL应用方向不同,但基于技术都是一样的(公钥和私钥配对)SSL主要用在Browser和Server通信,比如HTTPS=HTTP+SSLSSH是由客户端和服务端的软件组成的,用于computer之间通信,比如我们通过SSH登录远端服务器。有两个不兼容的版本分别是:1.x和2.x。用SSH2.x的客户程序是不能连接到SSH1.x的服务程序上去的。OpenSSH2.x同时支持SSH1.x和2</div> </li> <li><a href="/article/1903383174117912576.htm" title="linux上安装postgresql9.5" target="_blank">linux上安装postgresql9.5</a> <span class="text-muted">crayon-shin-chan</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/postgresql/1.htm">postgresql</a><a class="tag" taget="_blank" href="/search/surprise/1.htm">surprise</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/PostgreSQL/1.htm">PostgreSQL</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>1.查看源版本czy@Mint~$sudoapt-getupdateczy@Mint~$apt-cachemadisonpostgresqlpostgresql|9.5+173ubuntu0.3|http://archive.ubuntu.com/ubuntuxenial-updates/mainamd64Packagespostgresql|9.5+173ubuntu0.3|http://arc</div> </li> <li><a href="/article/1903380395865468928.htm" title="OpenSSL 3.0.2 报 dh key too small 的问题" target="_blank">OpenSSL 3.0.2 报 dh key too small 的问题</a> <span class="text-muted">aseity</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4%E7%BB%8F%E9%AA%8C/1.htm">运维经验</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/svn/1.htm">svn</a> <div>问题复现运行命令curl访问一个https网站,可能会出现"dhkeytoosmall"的问题。>curl-v--insecurehttps://some_web_site*Trying175.21.4.7:443...*Connectedtosome_web_site(175.21.4.7)port443(#0)*ALPN:offersh2,http/1.1*TLSv1.3(OUT),TLSha</div> </li> <li><a href="/article/1903378506373459968.htm" title="详解 SSL:SSL 证书该如何选择?" target="_blank">详解 SSL:SSL 证书该如何选择?</a> <span class="text-muted">网络安全(华哥)</span> <a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%B7%A5%E7%A8%8B%E5%B8%88/1.htm">网络工程师</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><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> <div>我们知道了在网站部署SSL证书后,不管是对网站本身还是对网站的用户都能够带来许多好处。那么随着HTTPS的普及,市面上也出现了各种不同的SSL证书。并且由于SSL证书的多样性,很多人对于如何选择SSL证书有着很大的困惑。因此,本篇文章将从证书安全级别、域名数量、用户类型这三个方面提供合理性建议。首先,我们来了解下SSL证书的类型。目前市场上SSL证书的种类多样,SSL证书可以根据以下三种方式进行分</div> </li> <li><a href="/article/1903370691210702848.htm" title="常见的应用对应的传输层协议和端口号" target="_blank">常见的应用对应的传输层协议和端口号</a> <span class="text-muted">数据链路摸索者</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E8%B7%AF%E5%AE%89%E5%85%A8/1.htm">网路安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>常见的应用对应的传输层协议和端口号如下:服务端口号协议http80TCPhttps443TCPFTP21(控制)TCP20(数据)TCPTFTP69UDPTelent23TCPSSH22TCPSMTP25TCPPOP3110TCPSNMP161UDPNTP123UDPDNS53TCP+UDPDHCP67和68UDPOracle数据库1521TCP终端服务3389TCP</div> </li> <li><a href="/article/1903363127894929408.htm" title="Windows faster whisper GUI-v0.8.5-开源版[AI支持超过100种语言的人声分离/声音转文本字幕]" target="_blank">Windows faster whisper GUI-v0.8.5-开源版[AI支持超过100种语言的人声分离/声音转文本字幕]</a> <span class="text-muted">私人珍藏库</span> <a class="tag" taget="_blank" href="/search/whisper/1.htm">whisper</a><a class="tag" taget="_blank" href="/search/Windows/1.htm">Windows</a><a class="tag" taget="_blank" href="/search/faster/1.htm">faster</a><a class="tag" taget="_blank" href="/search/whisper/1.htm">whisper</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%A3%B0%E5%88%86%E7%A6%BB/1.htm">人声分离</a><a class="tag" taget="_blank" href="/search/%E5%A3%B0%E9%9F%B3%E8%BD%AC%E6%96%87%E6%9C%AC/1.htm">声音转文本</a> <div>WindowsfasterwhisperGUI链接:https://pan.xunlei.com/s/VOLwhsGJ1Rt5b24AhoPL8wvKA1?pwd=vydu#WindowsfasterwhisperGUI-v0.8.5-开源版[AI支持超过100种语言的人声分离/声音转文本字幕]whisperX+faster-whisper+Demucs把模型下载,然后加载模型用就好了,实在不会的</div> </li> <li><a href="/article/1903359345630965760.htm" title="brew mysql client_Mac安装mysqlclient过程解析" target="_blank">brew mysql client_Mac安装mysqlclient过程解析</a> <span class="text-muted">weixin_39630440</span> <a class="tag" taget="_blank" href="/search/brew/1.htm">brew</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/client/1.htm">client</a> <div>尝试在虚拟环境下通过pip安装:pipinstallmysqlclient然后报错:OSError:mysql_confignotfound找到官方文档https://github.com/PyMySQL/mysqlclient-python,解释说安装前需安装另一个模块:brewinstallmysql-connector-c但是报错:查看报错信息,在安装mysql-connector-c前先b</div> </li> <li><a href="/article/1903357455702749184.htm" title="python接口自动化" target="_blank">python接口自动化</a> <span class="text-muted">全世界最帅的男人</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/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> <div>Python是一种非常流行的编程语言,也是许多接口自动化测试框架的首选语言。下面是一个简单的接口自动化测试框架的思路:1.安装必要的库和工具:在Python中,我们可以使用requests库来发送HTTP请求,使用unittest库来编写测试用例,使用HTMLTestRunner库来生成测试报告。此外,我们还需要安装一个代码编辑器,如PyCharm或VSCode。2.创建测试用例:编写测试用例是接</div> </li> <li><a href="/article/30.htm" title="Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor" target="_blank">Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor</a> <span class="text-muted">yangshangchuan</span> <a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E6%8A%BD%E5%8F%96/1.htm">信息抽取</a><a class="tag" taget="_blank" href="/search/HtmlExtractor/1.htm">HtmlExtractor</a><a class="tag" taget="_blank" href="/search/%E7%B2%BE%E5%87%86%E6%8A%BD%E5%8F%96/1.htm">精准抽取</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E9%87%87%E9%9B%86/1.htm">信息采集</a> <div>HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。   HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。 如</div> </li> <li><a href="/article/157.htm" title="java编程思想 -- 多态" target="_blank">java编程思想 -- 多态</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%A4%9A%E6%80%81%E8%AF%A6%E8%A7%A3/1.htm">多态详解</a> <div>一: 向上转型和向下转型 面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人    子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =</div> </li> <li><a href="/article/284.htm" title="[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系" target="_blank">[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/dp/1.htm">dp</a> <div>       对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长....       首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的</div> </li> <li><a href="/article/411.htm" title="storm 自定义 日志文件" target="_blank">storm 自定义 日志文件</a> <span class="text-muted">商人shang</span> <a class="tag" taget="_blank" href="/search/storm/1.htm">storm</a><a class="tag" taget="_blank" href="/search/cluster/1.htm">cluster</a><a class="tag" taget="_blank" href="/search/logback/1.htm">logback</a> <div>Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现: 1. 想要进行一些调试信息的输出 2. 调试信息或者业务日志信息想要输出到一些固定的文件中   不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输</div> </li> <li><a href="/article/538.htm" title="Extjs3 SpringMVC使用 @RequestBody 标签问题记录" target="_blank">Extjs3 SpringMVC使用 @RequestBody 标签问题记录</a> <span class="text-muted">21jhf</span> <div>springMVC使用 @RequestBody(required = false) UserVO userInfo 传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下: (由于使用了父类aaa</div> </li> <li><a href="/article/665.htm" title="一些排错方法" target="_blank">一些排错方法</a> <span class="text-muted">文强chu</span> <a class="tag" taget="_blank" href="/search/%E6%96%B9%E6%B3%95/1.htm">方法</a> <div>1、java.lang.IllegalStateException: Class invariant violation at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228) at o</div> </li> <li><a href="/article/792.htm" title="Swing中文件恢复我觉得很难" target="_blank">Swing中文件恢复我觉得很难</a> <span class="text-muted">小桔子</span> <a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a> <div>       我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间!        用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,</div> </li> <li><a href="/article/919.htm" title="php 文件操作" target="_blank">php 文件操作</a> <span class="text-muted">aichenglong</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6/1.htm">读取文件</a><a class="tag" taget="_blank" href="/search/%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6/1.htm">写入文件</a> <div>1 写入文件 @$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab"); if(!$fp){ echo "open file error" ; exit; } $outputstring="date:"." \t tire:".$tire."</div> </li> <li><a href="/article/1046.htm" title="MySQL的btree索引和hash索引的区别" target="_blank">MySQL的btree索引和hash索引的区别</a> <span class="text-muted">AILIKES</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/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。     可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢</div> </li> <li><a href="/article/1173.htm" title="JAVA的抽象--- 接口 --实现" target="_blank">JAVA的抽象--- 接口 --实现</a> <span class="text-muted">百合不是茶</span> <div>抽象 接口 实现接口   //抽象 类 ,方法   //定义一个公共抽象的类 ,并在类中定义一个抽象的方法体 抽象的定义使用abstract   abstract class A 定义一个抽象类 例如: //定义一个基类 public abstract class A{     //抽象类不能用来实例化,只能用来继承 //</div> </li> <li><a href="/article/1300.htm" title="JS变量作用域实例" target="_blank">JS变量作用域实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E4%BD%9C%E7%94%A8%E5%9F%9F/1.htm">作用域</a> <div><script> var scope='hello'; function a(){ console.log(scope); //undefined var scope='world'; console.log(scope); //world console.log(b); </div> </li> <li><a href="/article/1427.htm" title="TDD实践(二)" target="_blank">TDD实践(二)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/TDD/1.htm">TDD</a> <div>实践题目:分解质因数 Step1: 单元测试: package com.bijian.study.factor.test; import java.util.Arrays; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import com.bijian.</div> </li> <li><a href="/article/1554.htm" title="[MongoDB学习笔记一]MongoDB主从复制" target="_blank">[MongoDB学习笔记一]MongoDB主从复制</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。   事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。 本文介绍MongoDB的主从复制模式,需要指明</div> </li> <li><a href="/article/1681.htm" title="【HBase五】Java API操作HBase" target="_blank">【HBase五】Java API操作HBase</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a> <div>import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.ha</div> </li> <li><a href="/article/1808.htm" title="python调用zabbix api接口实时展示数据" target="_blank">python调用zabbix api接口实时展示数据</a> <span class="text-muted">ronin47</span> <div>zabbix api接口来进行展示。经过思考之后,计划获取如下内容:     1、  获得认证密钥     2、  获取zabbix所有的主机组     3、  获取单个组下的所有主机     4、  获取某个主机下的所有监控项  </div> </li> <li><a href="/article/1935.htm" title="jsp取得绝对路径" target="_blank">jsp取得绝对路径</a> <span class="text-muted">byalias</span> <a class="tag" taget="_blank" href="/search/%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84/1.htm">绝对路径</a> <div>在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下: 一、使用${pageContext.request.contextPath}   代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。 </div> </li> <li><a href="/article/2062.htm" title="Java定时任务调度:用ExecutorService取代Timer" target="_blank">Java定时任务调度:用ExecutorService取代Timer</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是: 如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被</div> </li> <li><a href="/article/2189.htm" title="SQL 优化原则" target="_blank">SQL 优化原则</a> <span class="text-muted">chicony</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div> 一、问题的提出  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统</div> </li> <li><a href="/article/2316.htm" title="java 线程弹球小游戏" target="_blank">java 线程弹球小游戏</a> <span class="text-muted">CrazyMizzz</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a> <div>最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善 这里是提纲 1.线程弹球游戏实现 1.实现界面需要使用哪些API类 JFrame JPanel JButton FlowLayout Graphics2D Thread Color ActionListener ActionEvent MouseListener Mouse</div> </li> <li><a href="/article/2443.htm" title="hadoop jps出现process information unavailable提示解决办法" target="_blank">hadoop jps出现process information unavailable提示解决办法</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/jps/1.htm">jps</a> <div>hadoop jps出现process information unavailable提示解决办法   jps时出现如下信息: 3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 -- </div> </li> <li><a href="/article/2570.htm" title="PHP图片水印缩放类实现" target="_blank">PHP图片水印缩放类实现</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a> <div> <?php class Image{ private $path; function __construct($path='./'){ $this->path=rtrim($path,'/').'/'; } //水印函数,参数:背景图,水印图,位置,前缀,TMD透明度 public function water($b,$l,$pos</div> </li> <li><a href="/article/2697.htm" title="IOS控件学习:UILabel常用属性与用法" target="_blank">IOS控件学习:UILabel常用属性与用法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/UILabel/1.htm">UILabel</a> <div>参考网站: http://shijue.me/show_text/521c396a8ddf876566000007 http://www.tuicool.com/articles/zquENb http://blog.csdn.net/a451493485/article/details/9454695 http://wiki.eoe.cn/page/iOS_pptl_artile_281</div> </li> <li><a href="/article/2824.htm" title="完全手动建立maven骨架" target="_blank">完全手动建立maven骨架</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a> <div>建一个 JAVA 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=App [-Dversion=0.0.1-SNAPSHOT] [-Dpackaging=jar] 建一个 web 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=web-a</div> </li> <li><a href="/article/2951.htm" title="配置清单" target="_blank">配置清单</a> <span class="text-muted">gengzg</span> <a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a> <div>1、修改grub启动的内核版本 vi /boot/grub/grub.conf 将default 0改为1 拷贝mt7601Usta.ko到/lib文件夹 拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹 拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan 拷贝wifiget.sh到bin文件夹,chm</div> </li> <li><a href="/article/3078.htm" title="Windows端口被占用处理方法" target="_blank">Windows端口被占用处理方法</a> <span class="text-muted">huqiji</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等.        这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&</div> </li> <li><a href="/article/3205.htm" title="开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !" target="_blank">开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !</a> <span class="text-muted">天梯梦</span> <a class="tag" taget="_blank" href="/search/mobile/1.htm">mobile</a> <div>CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,</div> </li> <li><a href="/article/3332.htm" title="简单工厂设计模式" target="_blank">简单工厂设计模式</a> <span class="text-muted">hm4123660</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%8E%82%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">工厂设计模式</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/1.htm">简单工厂模式</a> <div>       简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 </div> </li> <li><a href="/article/3459.htm" title="maven笔记" target="_blank">maven笔记</a> <span class="text-muted">zhb8015</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>跳过测试阶段: mvn package -DskipTests 临时性跳过测试代码的编译: mvn package -Dmaven.test.skip=true   maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。   指定测试类 mvn test</div> </li> <li><a href="/article/3586.htm" title="非mapreduce生成Hfile,然后导入hbase当中" target="_blank">非mapreduce生成Hfile,然后导入hbase当中</a> <span class="text-muted">Stark_Summer</span> <a class="tag" taget="_blank" href="/search/map/1.htm">map</a><a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a><a class="tag" taget="_blank" href="/search/reduce/1.htm">reduce</a><a class="tag" taget="_blank" href="/search/Hfile/1.htm">Hfile</a><a class="tag" taget="_blank" href="/search/path%E5%AE%9E%E4%BE%8B/1.htm">path实例</a> <div>最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile</div> </li> <li><a href="/article/3713.htm" title="jsp web tomcat 编码问题" target="_blank">jsp web tomcat 编码问题</a> <span class="text-muted">王新春</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/pageEncode/1.htm">pageEncode</a> <div>今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性: <Connector port="8080" protocol="HTTP/1.1" connectionTi</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>