提交Linux内核Patch

  • Bug修复
  • Git配置
  • Patch生成
  • Patch提交
  • 参考

之前使用QEMU和GDB调试Linux内核(详见Linux/Debug/相关文章),最后使用内核提供的GDB扩展功能获取当前运行进程,发现内核已经不再使用thread_info获取当前进程,而是使用Per-CPU变量。而且从内核4.9版本开始,thread_info也不再位于内核栈底部,然而内核提供的辅助调试函数lx_thread_info()仍然通过内核栈底地址获取thread_info,很明显这是个Bug,于是决定将其修复并提交一个内核Patch,提交后很快就得到内核维护人员的回应,将Patch提交到了内核主分支。

Linux内核Patch提交还是采用邮件列表方式,不过提供了自动化工具。

Bug修复

Bug的原因已经很明确了,先看下问题代码scripts/gdb/linux/tasks.py

def get_thread_info(task):
    thread_info_ptr_type = thread_info_type.get_type().pointer()
    if utils.is_target_arch("ia64"):
        ...
    else:
        thread_info = task['stack'].cast(thread_info_ptr_type)
    return thread_info.dereference()

还是使用的老的流程,通过栈底地址获取thread_info。

从内核4.9版本开始,已将thread_info移到了task_struct(include\linux\sched.h),而且一定是第一个字段:

struct task_struct {
#ifdef CONFIG_THREAD_INFO_IN_TASK
    /*
     * For reasons of header soup (see current_thread_info()), this
     * must be the first element of task_struct.
     */
    struct thread_info      thread_info;
#endif
    ...
}

所以修复很简单,只需要判断task的第一个字段是否为thread_info,如果是,则直接将其返回;如果不是,还是走原先的流程:

$ git diff ./
diff --git a/scripts/gdb/linux/tasks.py b/scripts/gdb/linux/tasks.py
index 1bf949c43b76..f6ab3ccf698f 100644
--- a/scripts/gdb/linux/tasks.py
+++ b/scripts/gdb/linux/tasks.py
@@ -96,6 +96,8 @@ def get_thread_info(task):
         thread_info_addr = task.address + ia64_task_size
         thread_info = thread_info_addr.cast(thread_info_ptr_type)
     else:
+        if task.type.fields()[0].type == thread_info_type.get_type():
+            return task['thread_info']
         thread_info = task['stack'].cast(thread_info_ptr_type)
     return thread_info.dereference()

Git配置

添加用户和Email配置,用于git send-email发送Patch。

这里使用Gmail邮箱服务,在Linux项目.git/config配置中添加如下内容:

[user]
    name = Xi Kangjie
    email = [email protected]
[sendemail]
    smtpEncryption = tls
    smtpServer = smtp.gmail.com
    smtpUser = [email protected]
    smtpServerPort = 587

注意在Google账户配置中允许不够安全的应用登陆,否则后面发送Patch会收到如下警告:

Patch生成

Bug修复后,先检查下代码是否符合规范:

$ ./scripts/checkpatch.pl --file scripts/gdb/linux/tasks.py 
total: 0 errors, 0 warnings, 137 lines checked

scripts/gdb/linux/tasks.py has no obvious style problems and is ready for submission.

没问题就可以写提交日志了:

$ git add scripts/gdb/linux/tasks.py
$ git commit -s

-s自动添加签发人Signed-off-by: Xi Kangjie ,表示该Patch是你创建的,你会对该Patch负责。日志的第一行为简短描述,会成为邮件标题(Subject),之后空一行,添加详细描述,会成为邮件内容,再空一行,添加签发人。

将最近一次提交生成Patch:

$ git format-patch HEAD~                           
0001-scripts-gdb-fix-get_thread_info.patch

再次检查Patch是否符合规范:

$ ./scripts/checkpatch.pl 0001-scripts-gdb-fix-get_thread_info.patch
ERROR: Please use git commit description style 'commit <12+ chars of sha1> ("")' - ie: 'commit c65eacbe290b ("sched/core: Allow putting thread_info into task_struct")'
#10:
- c65eacbe290b (sched/core: Allow putting thread_info into task_struct)

ERROR: Please use git commit description style 'commit <12+ chars of sha1> ("<title line>")' - ie: 'commit 15f4eae70d36 ("x86: Move thread_info into task_struct")'
#11:
- 15f4eae70d36 (x86: Move thread_info into task_struct)

total: 2 errors, 0 warnings, 8 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

0001-scripts-gdb-fix-get_thread_info.patch has style problems, please review.

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.
</code></pre> 
   <p>看来格式有错误,引用的提交描述不符合规范,直接修改Patch文件,再次检查:</p> 
   <pre class="has"><code class="language-go">$ ./scripts/checkpatch.pl 0001-scripts-gdb-fix-get_thread_info.patch
total: 0 errors, 0 warnings, 8 lines checked

0001-scripts-gdb-fix-get_thread_info.patch has no obvious style problems and is ready for submission.
</code></pre> 
   <h1> Patch提交</h1> 
   <p>获取Patch相关维护人员:</p> 
   <pre class="has"><code class="language-go">$ ./scripts/get_maintainer.pl 0001-scripts-gdb-fix-get_thread_info.patch 
Jan Kiszka <jan.kiszka@siemens.com> (supporter:GDB KERNEL DEBUGGING HELPER SCRIPTS)
Kieran Bingham <kieran@bingham.xyz> (supporter:GDB KERNEL DEBUGGING HELPER SCRIPTS)
Xi Kangjie <imxikangjie@gmail.com> (commit_signer:1/1=100%,authored:1/1=100%,added_lines:2/2=100%)
linux-kernel@vger.kernel.org (open list)
</code></pre> 
   <p>发送Patch:</p> 
   <pre class="has"><code class="language-go">$ git send-email --to jan.kiszka@siemens.com --to kieran@bingham.xyz --cc linux-kernel@vger.kernel.org 0001-scripts-gdb-fix-get_thread_info.patch
0001-scripts-gdb-fix-get_thread_info.patch
(mbox) Adding cc: Xi Kangjie <imxikangjie@gmail.com> from line 'From: Xi Kangjie <imxikangjie@gmail.com>'
(body) Adding cc: Xi Kangjie <imxikangjie@gmail.com> from line 'Signed-off-by: Xi Kangjie <imxikangjie@gmail.com>'

From: Xi Kangjie <imxikangjie@gmail.com>
To: jan.kiszka@siemens.com,
        kieran@bingham.xyz
Cc: linux-kernel@vger.kernel.org,
        Xi Kangjie <imxikangjie@gmail.com>
Subject: [PATCH] scripts/gdb: fix get_thread_info
Date: Thu, 18 Jan 2018 21:01:59 +0000
Message-Id: <20180118210159.17223-1-imxikangjie@gmail.com>
X-Mailer: git-send-email 2.13.2

    The Cc list above has been expanded by additional
    addresses found in the patch commit message. By default
    send-email prompts before sending whenever this occurs.
    This behavior is controlled by the sendemail.confirm
    configuration setting.

    For additional information, run 'git send-email --help'.
    To retain the current behavior, but squelch this message,
    run 'git config --global sendemail.confirm auto'.

Send this email? ([y]es|[n]o|[q]uit|[a]ll): y
Password for 'smtp://imxikangjie@gmail.com@smtp.gmail.com:587':
OK. Log says:
Server: smtp.gmail.com
MAIL FROM:<imxikangjie@gmail.com>
RCPT TO:<jan.kiszka@siemens.com>
RCPT TO:<kieran@bingham.xyz>
RCPT TO:<linux-kernel@vger.kernel.org>
RCPT TO:<imxikangjie@gmail.com>
From: Xi Kangjie <imxikangjie@gmail.com>
To: jan.kiszka@siemens.com,
        kieran@bingham.xyz
Cc: linux-kernel@vger.kernel.org,
        Xi Kangjie <imxikangjie@gmail.com>
Subject: [PATCH] scripts/gdb: fix get_thread_info
Date: Thu, 18 Jan 2018 21:01:59 +0000
Message-Id: <20180118210159.17223-1-imxikangjie@gmail.com>
X-Mailer: git-send-email 2.13.2

Result: 250 2.0.0 OK 1516281059 v9sm14814354pfj.88 - gsmtp
</code></pre> 
   <p>提交成功后,就能在<strong>内核邮件列表</strong>中看到自己的邮件[[PATCH] scripts/gdb: fix get_thread_info](https://lkml.org/lkml/2018/1/18/291),以及维护人员的回复[Re: [PATCH] scripts/gdb: fix get_thread_info](https://lkml.org/lkml/2018/1/18/516)。</p> 
   <p>Linux内核被划分成<strong>不同的子系统</strong>,如网络、内存管理等,不同的子系统有<strong>相应的维护人员</strong>,<strong>一个Patch</strong>会首先提交到<strong>子系统分支</strong>,再被<strong>维护人员</strong>提交到<strong>主分支</strong>。</p> 
   <p>我的Patch被提交到了mm-tree(维护人员是Andrew Morton),见mm-commits邮件列表scripts-gdb-fix-get_thread_info.patch added to -mm tree,Andrew Morton确认没问题后,会将Patch发送给Linus Torvalds,见mm-commits[patch 4/6] scripts/gdb/linux/tasks.py: fix get_thread_info,我的Patch还被发送给了stable分支,见stable邮件列表[patch 4/6] scripts/gdb/linux/tasks.py: fix get_thread_info。</p> 
   <p>最终由Linus Torvalds将Patch合并到主分支,scripts/gdb/linux/tasks.py: fix get_thread_info。</p> 
   <p>看到自己的代码在世界的某个角落运转,推动世界向前发展,才是真正的享受。</p> 
   <h1> 参考</h1> 
   <p>文章来自: https://consen.github.io/2018/01/19/submit-linux-kernel-patch/</p> 
   <ul> 
    <li>Submitting patches: the essential guide to getting your code into the kernel</li> 
    <li>The perfect patch</li> 
    <li>Linux kernel patch format</li> 
    <li>git config, git format-patch and git send-email</li> 
    <li>GDB Python API Values From Inferior and Types In Python</li> 
    <li>mm tree</li> 
   </ul> 
  </article> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1274692273543593984"></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内核Patch)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1835502578511736832.htm"
                           title="下载github patch到本地" target="_blank">下载github patch到本地</a>
                        <span class="text-muted">小米人er</span>
<a class="tag" taget="_blank" href="/search/%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2/1.htm">我的博客</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/patch/1.htm">patch</a>
                        <div>以下是几种从GitHub上下载以.patch结尾的补丁文件的方法:通过浏览器直接下载打开包含该.patch文件的GitHub仓库。在仓库的文件列表中找到对应的.patch文件。点击该文件,浏览器会显示文件的内容,在页面的右上角通常会有一个“Raw”按钮,点击它可以获取原始文件内容。然后在浏览器中使用快捷键(如Ctrl+S或者Command+S)将原始文件保存到本地,选择保存的文件名并确保后缀为.p</div>
                    </li>
                    <li><a href="/article/1835495170972413952.htm"
                           title="git - Webhook让部署自动化" target="_blank">git - Webhook让部署自动化</a>
                        <span class="text-muted">大猪大猪</span>

                        <div>我们现在有一个需求,将项目打包上传到gitlab或者github后,程序能自动部署,不用手动地去服务器中进行项目更新并运行,如何做到?这里我们可以使用gitlab与github的挂钩,挂钩的原理就是,每当我们有请求到gitlab与github服务器时,这时他俩会根据我们配置的挂钩地扯进行访问,webhook挂钩程序会一直监听着某个端口请求,一但收到他们发过来的请求,这时就知道用户有请求提交了,这时</div>
                    </li>
                    <li><a href="/article/1835494257746604032.htm"
                           title="MYSQL面试系列-04" target="_blank">MYSQL面试系列-04</a>
                        <span class="text-muted">king01299</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a>
                        <div>MYSQL面试系列-0417.关于redolog和binlog的刷盘机制、redolog、undolog作用、GTID是做什么的?innodb_flush_log_at_trx_commit及sync_binlog参数意义双117.1innodb_flush_log_at_trx_commit该变量定义了InnoDB在每次事务提交时,如何处理未刷入(flush)的重做日志信息(redolog)。它</div>
                    </li>
                    <li><a href="/article/1835490218409553920.htm"
                           title="01-Git初识" target="_blank">01-Git初识</a>
                        <span class="text-muted">Meereen</span>
<a class="tag" taget="_blank" href="/search/Git/1.htm">Git</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                        <div>01-Git初识概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码作用:记录代码内容。切换代码版本,多人开发时高效合并代码内容如何学:个人本机使用:Git基础命令和概念多人共享使用:团队开发同一个项目的代码版本管理Git配置用户信息配置:用户名和邮箱,应用在每次提交代码版本时表明自己的身份命令:查看git版本号git-v配置用户名gitconfig--globaluser.name</div>
                    </li>
                    <li><a href="/article/1835484293607026688.htm"
                           title="【Git】常见命令(仅笔记)" target="_blank">【Git】常见命令(仅笔记)</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/Linux%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Linux学习笔记</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>文章目录创建/初始化本地仓库添加本地仓库配置项提交文件查看仓库状态回退仓库查看日志分支删除文件暂存工作区代码远程仓库使用`.gitigore`文件让git不追踪一些文件标签创建/初始化本地仓库gitinit添加本地仓库配置项gitconfig-l#以列表形式显示配置项gitconfiguser.name"ljh"#配置user.namegitconfiguser.email"123123@qq.c</div>
                    </li>
                    <li><a href="/article/1835400463676174336.htm"
                           title="C++常见知识掌握" target="_blank">C++常见知识掌握</a>
                        <span class="text-muted">nfgo</span>
<a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>1.Linux软件开发、调试与维护内核与系统结构Linux内核是操作系统的核心,负责管理硬件资源,提供系统服务,它是系统软件与硬件之间的桥梁。主要组成部分包括:进程管理:内核通过调度器分配CPU时间给各个进程,实现进程的创建、调度、终止等操作。使用进程描述符(task_struct)来存储进程信息,包括状态(就绪、运行、阻塞等)、优先级、内存映射等。内存管理:包括物理内存和虚拟内存管理。通过页表映</div>
                    </li>
                    <li><a href="/article/1835378901174546432.htm"
                           title="KVM虚拟机源代码分析【转】" target="_blank">KVM虚拟机源代码分析【转】</a>
                        <span class="text-muted">xidianjiapei001</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF/1.htm">虚拟化技术</a>
                        <div>1.KVM结构及工作原理1.1KVM结构KVM基本结构有两部分组成。一个是KVMDriver,已经成为Linux内核的一个模块。负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以及虚拟CPU的运行等。另外一个是稍微修改过的Qemu,用于模拟PC硬件的用户空间组件,提供I/O设备模型以及访问外设的途径。KVM基本结构如图1所示。其中KVM加入到标准的Linux内核中,被组织成Linux中标准</div>
                    </li>
                    <li><a href="/article/1835369316342657024.htm"
                           title="Android shell 常用 debug 命令" target="_blank">Android shell 常用 debug 命令</a>
                        <span class="text-muted">晨春计</span>
<a class="tag" taget="_blank" href="/search/Audio/1.htm">Audio</a><a class="tag" taget="_blank" href="/search/debug/1.htm">debug</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>目录1、查看版本2、am命令3、pm命令4、dumpsys命令5、sed命令6、log定位查看APK进程号7、log定位使用场景1、查看版本1.1、Android串口终端执行getpropro.build.version.release#获取Android版本uname-a#查看linux内核版本信息uname-r#单独查看内核版本1.2、linux服务器执行lsb_release-a#查看Lin</div>
                    </li>
                    <li><a href="/article/1835368019430305792.htm"
                           title="Vue + Express实现一个表单提交" target="_blank">Vue + Express实现一个表单提交</a>
                        <span class="text-muted">九旬大爷的梦</span>

                        <div>最近在折腾一个cms系统,用的vue+express,但是就一个表单提交就弄了好久,记录一下。环境:Node10+前端:Vue服务端:Express依赖包:vueexpressaxiosexpress-formidableelement-ui(可选)前言:axiosget请求参数是:paramsaxiospost请求参数是:dataexpressget接受参数是req.queryexpresspo</div>
                    </li>
                    <li><a href="/article/1835361883645898752.htm"
                           title="编译Windows平台的Nginx+ngx_http_proxy_connect_module" target="_blank">编译Windows平台的Nginx+ngx_http_proxy_connect_module</a>
                        <span class="text-muted">Grovvy_Deng</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a>
                        <div>编译Windows平台的Nginx+ngx_http_proxy_connect_module背景:由于公司的正向出局代理是windows机器。机器上的Squid不稳定,打算替换成nginx+ngx_http_proxy_connect_module实现。通过几天痛苦的尝试,最后参考了github大神项目通过在线CICD工具编译window平台可用的ng。步骤:获取git可识别的patch由于CI</div>
                    </li>
                    <li><a href="/article/1835360363776929792.htm"
                           title="MySQL事务隔离级别和MVCC" target="_blank">MySQL事务隔离级别和MVCC</a>
                        <span class="text-muted">简书徐小耳</span>

                        <div>MySQL事务隔离级别和MVCC参考:https://mp.weixin.qq.com/s/Jeg8656gGtkPteYWrG5_Nw1.MVCC只对读已提交和可重复的读有效果,而未提交读和串行则无意义。2.每条记录都会有trx_id(事务修改记录的id)和roll_pointer是一个指针指向旧版本的undo日志链表(row_id不是必必要的,如果有主键存在就不需要了)3.版本链的头结点就是记</div>
                    </li>
                    <li><a href="/article/1835353345062170624.htm"
                           title="使用input[type=file]遇上的一些问题" target="_blank">使用input[type=file]遇上的一些问题</a>
                        <span class="text-muted">刘圣凯</span>

                        <div>项目遇到一个需要,如下image.png功能大致就是添加图片,展示出来,然后在用户点击提交的时候把图片传给后台,在和后台交涉之后,决定在用户选择图片之后转成formdata传给后台,后台返回一个url,提交的时候将url返回给后台/**转formdata*/varformdata=newFormData();formdata.append("file1",$("#pic")[0].files[0]</div>
                    </li>
                    <li><a href="/article/1835321802851708928.htm"
                           title="华南农业大学C语言oj第八章" target="_blank">华南农业大学C语言oj第八章</a>
                        <span class="text-muted">黑兔子撒</span>
<a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a><a class="tag" taget="_blank" href="/search/C%E8%AF%AD%E8%A8%80/1.htm">C语言</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E5%8D%97%E5%86%9C%E4%B8%9A%E5%A4%A7%E5%AD%A6/1.htm">华南农业大学</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F/1.htm">程序</a>
                        <div>18058一年的第几天时间限制:1000MS内存限制:65535K提交次数:0通过次数:0题型:填空题语言:G++;GCC;VCDescription定义一个结构体类型表示日期类型(包括年、月、日)。程序中定义一个日期类型的变量,输入该日期的年、月、日,计算并输出该日期是一年的第几天。#include  struct DATE { _______________________ }; int da</div>
                    </li>
                    <li><a href="/article/1835285182073106432.htm"
                           title="MySQL日志" target="_blank">MySQL日志</a>
                        <span class="text-muted">沉着冷静2024</span>
<a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><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%BA%93/1.htm">数据库</a>
                        <div>MySQL日志文章目录MySQL日志MySQL三大日志binlog的三种格式redolog和binlog的区别和应用场景为什么崩溃恢复不用binlog而用redolog?redolog如何实现持久化redolog还能做什么?redolog的三种刷盘策略两阶段提交什么是?为什么?两阶段提交过程MySQL三大日志1.undologundolog是InnoDB存储引擎层的日志,实现了事务的原子性,主要用</div>
                    </li>
                    <li><a href="/article/1835282965358276608.htm"
                           title="ajax的同源策略" target="_blank">ajax的同源策略</a>
                        <span class="text-muted">Spring_Bear</span>

                        <div>问题之前帮忙做的广告机器人数据提交的部分,利用ajax的XMLHTTPRequest提交到服务器的时候总是报错,错误类型是不同源。想到浏览器中的同源策略,明白了问题的原因。同源策略简单的说,就是浏览器不允许两个不同源的域名之间交换信息,那么这里就有两个问题。一是,什么信息不允许交换;二是,怎样算不同源。阮一峰的这篇博客浏览器同源政策及其规避方法其实已经介绍得比较清楚。引用一下,第一个问题:目前,如</div>
                    </li>
                    <li><a href="/article/1835270819060740096.htm"
                           title="白嫖Gitee实现远程公告功能和小型文件上传下载" target="_blank">白嫖Gitee实现远程公告功能和小型文件上传下载</a>
                        <span class="text-muted">xu-jssy</span>
<a class="tag" taget="_blank" href="/search/Python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%84%9A%E6%9C%AC/1.htm">Python自动化脚本</a><a class="tag" taget="_blank" href="/search/gitee/1.htm">gitee</a>
                        <div>备注:20240527更新:新增私人令牌下载模式一、准备工作1、打开Gitee网站:Gitee.comhttps://gitee.com/2、获取access_token,用于身份验证登录后点击右上角头像,在下拉菜单中进入个人主页点击左边的个人设置点击左边菜单中的安全设置->私人令牌点击右上角生成新令牌根据提示填写信息,点击提交在弹出的页面复制令牌,注意备份保存3、创建一个仓库用来存放文件可以把远</div>
                    </li>
                    <li><a href="/article/1835219761101893632.htm"
                           title="系统设计DDIA之Chapter 7 Transactions 之防止丢失更新" target="_blank">系统设计DDIA之Chapter 7 Transactions 之防止丢失更新</a>
                        <span class="text-muted">暴躁老哥在线刷题</span>
<a class="tag" taget="_blank" href="/search/SystemDesign/1.htm">SystemDesign</a><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/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/1.htm">系统设计</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/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><a class="tag" taget="_blank" href="/search/DDIA/1.htm">DDIA</a>
                        <div>防止丢失更新涉及处理多个事务并发写入时发生的各种冲突类型。虽然“读已提交”和“快照隔离”等隔离级别管理与读取相关的冲突,但防止丢失更新需要额外的措施来处理写写冲突。丢失更新问题:当两个事务同时读取一个值,对其进行修改,然后将修改后的值写回时,会发生这种问题。一个修改可能会覆盖或“破坏”另一个修改,导致更新丢失。例子包括递增计数器、更新复杂文档,或多个用户同时编辑相同内容。防止丢失更新的解决方案:原</div>
                    </li>
                    <li><a href="/article/1835188875258064896.htm"
                           title="jdbc连接池怎么工作" target="_blank">jdbc连接池怎么工作</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/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>是否是否是否开始初始化DruidDataSource应用程序请求连接ThreadLocal中有连接?返回ThreadLocal中的连接从连接池获取新连接将连接存入ThreadLocal执行SQL操作调用closeAll()是否自动提交?归还连接到连接池从ThreadLocal移除连接保持连接不变结束开始事务操作调用begin()设置自动提交为false执行多个SQL操作事务是否成功?调用commi</div>
                    </li>
                    <li><a href="/article/1835184691901198336.htm"
                           title="【主播日记】凭实力可爱系—这样的花式提醒你爱了吗" target="_blank">【主播日记】凭实力可爱系—这样的花式提醒你爱了吗</a>
                        <span class="text-muted">阿拉小仙儿</span>

                        <div>线上直播,在家办公,从时间层面来讲,确实轻松不少。但是课下讨作业真的是一项巨大的工作量。不要问我有什么智慧,我没有智慧,只有卑微。颤抖着打开钉钉的打卡,鼓起勇气看看孩子们的提交情况。一眼望去,差点晕厥!我敢说如果没有作业,我们都是彼此眼中最可爱的人。然而因为有了作业,我们却成了最熟悉的陌生人。因为良心会痛,所以我只能锁定目标,各个击破。“XXX家长你好!孩子的作业显示没有提交,什么原因呢?”“XX</div>
                    </li>
                    <li><a href="/article/1835147613041684480.htm"
                           title="计算机信息管理本科自考选题推荐" target="_blank">计算机信息管理本科自考选题推荐</a>
                        <span class="text-muted">李哥讲程序开发</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>计算机信息管理专业是一个跨学科的领域,它结合了计算机技术与管理技术,旨在利用计算机完成各类信息管理。以下是一些推荐的自考选题方向:基于SSM的毕业设计管理系统的设计与实现基于SSM大学生校园兼职论坛管理系统基于SSM的家教应聘招聘系统的设计和实现基于SpringBoot住院患者满意度跟踪调查系统的设计与实现基于SpringBoot在线作业提交系统的设计与实现总的来说,这些建议的选题方向覆盖了计算机</div>
                    </li>
                    <li><a href="/article/1835130083975720960.htm"
                           title="撤消操作" target="_blank">撤消操作</a>
                        <span class="text-muted">guanjianhe</span>

                        <div>有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有--amend选项的提交命令尝试重新提交:$gitcommit--amend这个命令会将暂存区中的文件提交。如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。文本编辑器启动后,可以看到之前的提交信息。编辑后保存会覆盖原来的提交信息。例如,你提交</div>
                    </li>
                    <li><a href="/article/1835105377994240000.htm"
                           title="详解 Flink 的常见部署方式" target="_blank">详解 Flink 的常见部署方式</a>
                        <span class="text-muted">文刀小桂</span>
<a class="tag" taget="_blank" href="/search/Flink/1.htm">Flink</a><a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                        <div>一、常见部署模式分类1.按是否依赖外部资源调度1.1Standalone模式独立模式(Standalone)是独立运行的,不依赖任何外部的资源管理平台,只需要运行所有Flink组件服务1.2Yarn模式Yarn模式是指客户端把Flink应用提交给Yarn的ResourceManager,Yarn的ResourceManager会在Yarn的NodeManager上创建容器。在这些容器上,Flink</div>
                    </li>
                    <li><a href="/article/1835073488541544448.htm"
                           title="网上商城项目总结 续" target="_blank">网上商城项目总结 续</a>
                        <span class="text-muted">猫只i</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E5%95%86%E5%9F%8E/1.htm">电子商城</a><a class="tag" taget="_blank" href="/search/%E7%BB%93%E6%9E%84/1.htm">结构</a>
                        <div>前台1.用户登录注册邮箱验证校验用户名是否存在验证码自动登录2.导航条自定义标签库采用异步读取数据(使用gson将集合转换json数据)Redis服务器3.首页热门商品查询展示4.分类列表分页查询5.商品详情用cookie实现浏览记录6.购物车实现商品添加到购物车商品的查询,添加,修改,删除清空购物车7.提交订单添加订单(订单详情)确认订单(易宝支付)8.我的订单9.Fliter定义权限拦截(提交</div>
                    </li>
                    <li><a href="/article/1835066678912839680.htm"
                           title="PyCharm配置及使用Git教程_pycharm配置git(2)" target="_blank">PyCharm配置及使用Git教程_pycharm配置git(2)</a>
                        <span class="text-muted">2401_84182146</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a>
                        <div>文章目录1.安装PyCharm2.安装Git3.在PyCharm中配置Git插件4.连接远程仓库5.Clone项目代码6.将本地文件提交到远程仓库6.1gitadd6.2gitcommit6.3gitpush6.4gitpull7.代码回滚8.分支操作8.1新建分支8.2切换分支8.3合并分支</div>
                    </li>
                    <li><a href="/article/1835052550982823936.htm"
                           title="讲解Linux内核操作系统——进程状态与转换" target="_blank">讲解Linux内核操作系统——进程状态与转换</a>
                        <span class="text-muted">Linux加油站</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/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/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>一.进程控制进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。1.1创建进程UNIX中进程为树状层次结构,Windows下所有进程没有层次结构允许一个进程创建另一个进程,创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程</div>
                    </li>
                    <li><a href="/article/1835048011294666752.htm"
                           title="Spring Cloud+Spring Boot+Mybatis+Java版电子招标采购系统源码 及 功能清单" target="_blank">Spring Cloud+Spring Boot+Mybatis+Java版电子招标采购系统源码 及 功能清单</a>
                        <span class="text-muted">Xiaohong0716</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a>
                        <div>一、立项管理1、招标立项申请功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。2、非招标立项申请功能点:非招标立项申请入口、用户可以保存为草稿、提交。3、采购立项列表功能点:对草稿进行编辑,驳回的立项编辑,在途流程查看。二、项目管理1、采购计划管理功能点:采购计划新增、编辑、删除2、采购过程管理功能点:查询、维护基准价、组建评审小组、项目答疑澄清、文件费保证金审核、供应商报价维护、查看评审</div>
                    </li>
                    <li><a href="/article/1835028667542106112.htm"
                           title="《都市不俗人》:之245 有情人终成眷属" target="_blank">《都市不俗人》:之245 有情人终成眷属</a>
                        <span class="text-muted">古韵撷趣</span>

                        <div>上篇说到,周红在家中为胡姣过生日,虽然说,只是周红爱人周小乐做的几道家常菜,但亲切的感觉却是显而易见的……席中,周红如曾明所料,主动谈及了,胡姣国庆节后一上班就提交上去的《关于加強公司财务部力量》的建议书……周小乐听到爱人周红叙述,公司领导层的反应后,立马意识到,胡姣有升职的可能……周红也很高兴地回应说:12月初的公司职代会后,财务部的基本框架就会定下来……胡姣主动给周红盛了一碗汤,同时真诚地说:</div>
                    </li>
                    <li><a href="/article/1835013394890059776.htm"
                           title="第二次复盘" target="_blank">第二次复盘</a>
                        <span class="text-muted">小小yue</span>

                        <div>本周所学内容中,我掌握最熟练的技能是:文章的结构,尤其是总分总结构,总开头阐述主题,表明总论点。中间部分阐述论点或者是讲故事,支持自己的观点。最后结尾呼应开头升华主题。积累素材做的不够好,平时阅读量少,不太熟悉拆解爆款文章。做的好的地方是每天按时完成作业,第一次大作业虽然没有按规定时间完成,但是班班一直鼓励我,最后也提交了。以后要把每天的课程至少听2遍以上,作业再早一点完成。</div>
                    </li>
                    <li><a href="/article/1834988932056576000.htm"
                           title="一淘返利必须在一淘购买吗?一淘提交订单淘宝付款有返利吗?" target="_blank">一淘返利必须在一淘购买吗?一淘提交订单淘宝付款有返利吗?</a>
                        <span class="text-muted">高省APP珊珊</span>

                        <div>一淘返利并不一定需要在一淘购买商品。一淘作为一个返利平台,它的核心功能是帮助用户通过在指定的合作商家购物后获取返利。即使您在其他平台或实体店购买商品,只要符合一淘的返利规则和条件,您仍然可以享受到相应的返利优惠。因此,在一淘购买商品并非返利的必要条件,但需要确认您的购物行为符合一淘返利的要求。【高省APP】(高佣金领导者)是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,运行三年,稳</div>
                    </li>
                    <li><a href="/article/1834955430602829824.htm"
                           title="离职风波:说好大家一起走,你却最终逗了留" target="_blank">离职风波:说好大家一起走,你却最终逗了留</a>
                        <span class="text-muted">房晓明</span>

                        <div>朋友小刚的公司突然搞了个改革:老板调低了底薪,增加了动态激励的部分。几个老员工对这件事情很不满意,于是约好了一起离职,结果小刚提交了辞职信之后,发现另外几个同事,根本没有提出离职!说好一起到白头,你却偷偷焗了油,这事要怎么办?一、吐槽之后,约定离职提起这场离职风波,还源自于老板去参加了一个培训。培训上的老师说:对于销售,不能给太高的底薪,要采取“低底薪、高提成”的模式来激励销售人员。老板听了这个建</div>
                    </li>
                                <li><a href="/article/74.htm"
                                       title="sql统计相同项个数并按名次显示" target="_blank">sql统计相同项个数并按名次显示</a>
                                    <span class="text-muted">朱辉辉33</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>现在有如下这样一个表: 
A表 
ID Name time 
------------------------------ 
0001 aaa 2006-11-18 
0002 ccc 2006-11-18 
0003 eee 2006-11-18 
0004 aaa 2006-11-18 
0005 eee 2006-11-18 
0004 aaa 2006-11-18 
0002 ccc 20</div>
                                </li>
                                <li><a href="/article/201.htm"
                                       title="Android+Jquery Mobile学习系列-目录" target="_blank">Android+Jquery Mobile学习系列-目录</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/JQuery+Mobile/1.htm">JQuery Mobile</a>
                                    <div>最近在研究学习基于Android的移动应用开发,准备给家里人做一个应用程序用用。向公司手机移动团队咨询了下,觉得使用Android的WebView上手最快,因为WebView等于是一个内置浏览器,可以基于html页面开发,不用去学习Android自带的七七八八的控件。然后加上Jquery mobile的样式渲染和事件等,就能非常方便的做动态应用了。 
  
从现在起,往后一段时间,我打算</div>
                                </li>
                                <li><a href="/article/328.htm"
                                       title="如何给线程池命名" target="_blank">如何给线程池命名</a>
                                    <span class="text-muted">daysinsun</span>
<a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">线程池</a>
                                    <div>        在系统运行后,在线程快照里总是看到线程池的名字为pool-xx,这样导致很不好定位,怎么给线程池一个有意义的名字呢。参照ThreadPoolExecutor类的ThreadFactory,自己实现ThreadFactory接口,重写newThread方法即可。参考代码如下: 
    
public class Named</div>
                                </li>
                                <li><a href="/article/455.htm"
                                       title="IE 中"HTML Parsing Error:Unable to modify the parent container element before the" target="_blank">IE 中"HTML Parsing Error:Unable to modify the parent container element before the</a>
                                    <span class="text-muted">周凡杨</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E8%A7%A3%E6%9E%90/1.htm">解析</a><a class="tag" taget="_blank" href="/search/error/1.htm">error</a><a class="tag" taget="_blank" href="/search/readyState/1.htm">readyState</a>
                                    <div>  
错误:  IE   中"HTML Parsing Error:Unable to modify the parent container element before the child element is closed"      
  
  
现象:  同事之间几个IE 测试情况下,有的报这个错,有的不报。经查询资料后,可归纳以下原因。</div>
                                </li>
                                <li><a href="/article/582.htm"
                                       title="java上传" target="_blank">java上传</a>
                                    <span class="text-muted">g21121</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>我们在做web项目中通常会遇到上传文件的情况,用struts等框架的会直接用的自带的标签和组件,今天说的是利用servlet来完成上传。 
我们这里利用到commons-fileupload组件,相关jar包可以取apache官网下载:http://commons.apache.org/ 
下面是servlet的代码: 
//定义一个磁盘文件工厂
DiskFileItemFactory fact</div>
                                </li>
                                <li><a href="/article/709.htm"
                                       title="SpringMVC配置学习" target="_blank">SpringMVC配置学习</a>
                                    <span class="text-muted">510888780</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a>
                                    <div>spring MVC配置详解 
现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。 
 
  一、Spring MVC环境搭建:(Spring 2.5.6 + Hi</div>
                                </li>
                                <li><a href="/article/836.htm"
                                       title="spring mvc-jfreeChart 柱图(1)" target="_blank">spring mvc-jfreeChart 柱图(1)</a>
                                    <span class="text-muted">布衣凌宇</span>
<a class="tag" taget="_blank" href="/search/jfreechart/1.htm">jfreechart</a>
                                    <div>第一步:下载jfreeChart包,注意是jfreeChart文件lib目录下的,jcommon-1.0.23.jar和jfreechart-1.0.19.jar两个包即可; 
第二步:配置web.xml; 
web.xml代码如下 
<servlet> 
    <servlet-name>jfreechart</servlet-nam</div>
                                </li>
                                <li><a href="/article/963.htm"
                                       title="我的spring学习笔记13-容器扩展点之PropertyPlaceholderConfigurer" target="_blank">我的spring学习笔记13-容器扩展点之PropertyPlaceholderConfigurer</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/Spring3/1.htm">Spring3</a>
                                    <div>PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现。关于BeanFactoryPostProcessor和BeanPostProcessor类似。我会在其他地方介绍。PropertyPlaceholderConfigurer可以将上下文(配置文件)中的属性值放在另一个单独的标准java P</div>
                                </li>
                                <li><a href="/article/1090.htm"
                                       title="java 线程池使用 Runnable&Callable&Future" target="_blank">java 线程池使用 Runnable&Callable&Future</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/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/Runnable/1.htm">Runnable</a><a class="tag" taget="_blank" href="/search/callable/1.htm">callable</a><a class="tag" taget="_blank" href="/search/future/1.htm">future</a>
                                    <div>1. 创建线程池 
ExecutorService executorService = Executors.newCachedThreadPool(); 
  
2. 执行一次线程,调用Runnable接口实现 
Future<?> future = executorService.submit(new DefaultRunnable());
System.out.prin</div>
                                </li>
                                <li><a href="/article/1217.htm"
                                       title="XML语法元素结构的总结" target="_blank">XML语法元素结构的总结</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E6%A0%91%E7%BB%93%E6%9E%84/1.htm">树结构</a>
                                    <div>1.XML介绍1969年   gml (主要目的是要在不同的机器进行通信的数据规范)1985年   sgml  standard generralized markup language1993年   html(www网)1998年  xml   extensible markup language</div>
                                </li>
                                <li><a href="/article/1344.htm"
                                       title="改变eclipse编码格式" target="_blank">改变eclipse编码格式</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F/1.htm">编码格式</a>
                                    <div>1.改变整个工作空间的编码格式 
        改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式。 
        Eclipse->window->preferences->General->workspace-</div>
                                </li>
                                <li><a href="/article/1471.htm"
                                       title="javascript中return的设计缺陷" target="_blank">javascript中return的设计缺陷</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>
                                    <div>代码1: 
<script>
var gisService = (function(window) 
{ 

    return
    {
        name:function ()
        {
            alert(1);
        }
    };

})(this);

gisService.name();
&l</div>
                                </li>
                                <li><a href="/article/1598.htm"
                                       title="【持久化框架MyBatis3八】Spring集成MyBatis3" target="_blank">【持久化框架MyBatis3八】Spring集成MyBatis3</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Mybatis3/1.htm">Mybatis3</a>
                                    <div>pom.xml配置 
Maven的pom中主要包括: 
 
 MyBatis 
 MyBatis-Spring 
 Spring 
 MySQL-Connector-Java 
 Druid 
 applicationContext.xml配置     
<?xml version="1.0" encoding="UTF-8"?>
&</div>
                                </li>
                                <li><a href="/article/1725.htm"
                                       title="java web项目启动时自动加载自定义properties文件" target="_blank">java web项目启动时自动加载自定义properties文件</a>
                                    <span class="text-muted">bitray</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E5%90%AC%E5%99%A8/1.htm">监听器</a><a class="tag" taget="_blank" href="/search/%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84/1.htm">相对路径</a>
                                    <div>创建一个类 
public class ContextInitListener implements ServletContextListener 
使得该类成为一个监听器。用于监听整个容器生命周期的,主要是初始化和销毁的。 
 
类创建后要在web.xml配置文件中增加一个简单的监听器配置,即刚才我们定义的类。 
 

    <listener>
        <des</div>
                                </li>
                                <li><a href="/article/1852.htm"
                                       title="用nginx区分文件大小做出不同响应" target="_blank">用nginx区分文件大小做出不同响应</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>昨晚和前21v的同事聊天,说到我离职后一些技术上的更新。其中有个给某大客户(游戏下载类)的特殊需求设计,因为文件大小差距很大——估计是大版本和补丁的区别——又走的是同一个域名,而squid在响应比较大的文件时,尤其是初次下载的时候,性能比较差,所以拆成两组服务器,squid服务于较小的文件,通过pull方式从peer层获取,nginx服务于较大的文件,通过push方式由peer层分发同步。外部发布</div>
                                </li>
                                <li><a href="/article/1979.htm"
                                       title="java-67-扑克牌的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大" target="_blank">java-67-扑克牌的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>package com.ljn.base;

import java.util.Arrays;
import java.util.Random;

public class ContinuousPoker {

    /**
     * Q67 扑克牌的顺子 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
     * 2-10为数字本身,A为1,J为1</div>
                                </li>
                                <li><a href="/article/2106.htm"
                                       title="翟鸿燊老师语录" target="_blank">翟鸿燊老师语录</a>
                                    <span class="text-muted">ccii</span>
<a class="tag" taget="_blank" href="/search/%E7%BF%9F%E9%B8%BF%E7%87%8A/1.htm">翟鸿燊</a>
                                    <div>一、国学应用智慧TAT之亮剑精神A 
1. 角色就是人格 
    就像你一回家的时候,你一进屋里面,你已经是儿子,是姑娘啦,给老爸老妈倒怀水吧,你还觉得你是老总呢?还拿派呢?就像今天一样,你们往这儿一坐,你们之间是什么,同学,是朋友。 
    还有下属最忌讳的就是领导向他询问情况的时候,什么我不知道,我不清楚,该你知道的你凭什么不知道</div>
                                </li>
                                <li><a href="/article/2233.htm"
                                       title="[光速与宇宙]进行光速飞行的一些问题" target="_blank">[光速与宇宙]进行光速飞行的一些问题</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a>
                                    <div> 
 
     在人类整体进入宇宙时代,即将开展深空宇宙探索之前,我有几个猜想想告诉大家 
    仅仅是猜想。。。未经官方证实 
 
 
     1:要在宇宙中进行光速飞行,必须首先获得宇宙中的航行通行证,而这个航行通行证并不是我们平常认为的那种带钢印的证书,是什么呢? 下面我来告诉</div>
                                </li>
                                <li><a href="/article/2360.htm"
                                       title="oracle undo解析" target="_blank">oracle undo解析</a>
                                    <span class="text-muted">cwqcwqmax9</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>oracle undo解析2012-09-24 09:02:01     我来说两句       作者:虫师收藏    我要投稿 
 
Undo是干嘛用的?         &nb</div>
                                </li>
                                <li><a href="/article/2487.htm"
                                       title="java中各种集合的详细介绍" target="_blank">java中各种集合的详细介绍</a>
                                    <span class="text-muted">dashuaifu</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E5%90%88/1.htm">集合</a>
                                    <div>一,java中各种集合的关系图 Collection       接口的接口     对象的集合  ├ List           子接口   &n</div>
                                </li>
                                <li><a href="/article/2614.htm"
                                       title="卸载windows服务的方法" target="_blank">卸载windows服务的方法</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/service/1.htm">service</a>
                                    <div>卸载Windows服务的方法 
在Windows中,有一类程序称为服务,在操作系统内核加载完成后就开始加载。这里程序往往运行在操作系统的底层,因此资源占用比较大、执行效率比较高,比较有代表性的就是杀毒软件。但是一旦因为特殊原因不能正确卸载这些程序了,其加载在Windows内的服务就不容易删除了。即便是删除注册表中的相 应项目,虽然不启动了,但是系统中仍然存在此项服务,只是没有加载而已。如果安装其他</div>
                                </li>
                                <li><a href="/article/2741.htm"
                                       title="Warning: The Copy Bundle Resources build phase contains this target's Info.plist" target="_blank">Warning: The Copy Bundle Resources build phase contains this target's Info.plist</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/xcode/1.htm">xcode</a>
                                    <div>       
      
http://developer.apple.com/iphone/library/qa/qa2009/qa1649.html 
Excerpt: 
 
 You are getting this warning because you probably added your Info.plist file to your Copy Bundle </div>
                                </li>
                                <li><a href="/article/2868.htm"
                                       title="2014之C++学习笔记(一)" target="_blank">2014之C++学习笔记(一)</a>
                                    <span class="text-muted">Etwo</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/Etwo/1.htm">Etwo</a><a class="tag" taget="_blank" href="/search/Etwo/1.htm">Etwo</a><a class="tag" taget="_blank" href="/search/iterator/1.htm">iterator</a><a class="tag" taget="_blank" href="/search/%E8%BF%AD%E4%BB%A3%E5%99%A8/1.htm">迭代器</a>
                                    <div>        已经有很长一段时间没有写博客了,可能大家已经淡忘了Etwo这个人的存在,这一年多以来,本人从事了AS的相关开发工作,但最近一段时间,AS在天朝的没落,相信有很多码农也都清楚,现在的页游基本上达到饱和,手机上的游戏基本被unity3D与cocos占据,AS基本没有容身之处。so。。。最近我并不打算直接转型</div>
                                </li>
                                <li><a href="/article/2995.htm"
                                       title="js跨越获取数据问题记录" target="_blank">js跨越获取数据问题记录</a>
                                    <span class="text-muted">haifengwuch</span>
<a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a>
                                    <div>js的跨越问题,普通的ajax无法获取服务器返回的值。 
 
  第一种解决方案,通过getson,后台配合方式,实现。 
Java后台代码: 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException { 
String ca</div>
                                </li>
                                <li><a href="/article/3122.htm"
                                       title="蓝色jQuery导航条" target="_blank">蓝色jQuery导航条</a>
                                    <span class="text-muted">ini</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a>
                                    <div>效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/39.htmHTML文件代码: 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery鼠标悬停上下滑动导航条 - 柯乐义<</div>
                                </li>
                                <li><a href="/article/3249.htm"
                                       title="linux部署jdk,tomcat,mysql" target="_blank">linux部署jdk,tomcat,mysql</a>
                                    <span class="text-muted">kerryg</span>
<a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>1、安装java环境jdk: 
    一般系统都会默认自带的JDK,但是不太好用,都会卸载了,然后重新安装。 
   1.1)、卸载: 
     (rpm -qa :查询已经安装哪些软件包; 
       rmp -q 软件包:查询指定包是否已</div>
                                </li>
                                <li><a href="/article/3376.htm"
                                       title="DOMContentLoaded VS onload VS onreadystatechange" target="_blank">DOMContentLoaded VS onload VS onreadystatechange</a>
                                    <span class="text-muted">mutongwu</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a>
                                    <div>1. DOMContentLoaded 在页面html、script、style加载完毕即可触发,无需等待所有资源(image/iframe)加载完毕。(IE9+) 
 
2. onload是最早支持的事件,要求所有资源加载完毕触发。 
 
3. onreadystatechange 开始在IE引入,后来其它浏览器也有一定的实现。涉及以下 document , applet, embed, fra</div>
                                </li>
                                <li><a href="/article/3503.htm"
                                       title="sql批量插入数据" target="_blank">sql批量插入数据</a>
                                    <span class="text-muted">qifeifei</span>
<a class="tag" taget="_blank" href="/search/%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5/1.htm">批量插入</a>
                                    <div>hi, 
  自己在做工程的时候,遇到批量插入数据的数据修复场景。我的思路是在插入前准备一个临时表,临时表的整理就看当时的选择条件了,临时表就是要插入的数据集,最后再批量插入到数据库中。 
   
WITH tempT AS (
SELECT
item_id AS combo_id,
item_id,
now() AS create_date
FROM
a</div>
                                </li>
                                <li><a href="/article/3630.htm"
                                       title="log4j打印日志文件 如何实现相对路径到 项目工程下" target="_blank">log4j打印日志文件 如何实现相对路径到 项目工程下</a>
                                    <span class="text-muted">thinkfreer</span>
<a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</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><a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97/1.htm">日志</a>
                                    <div>最近为了实现统计一个网站的访问量,记录用户的登录信息,以方便站长实时了解自己网站的访问情况,选择了Apache 的log4j,但是在选择相对路径那块 卡主了,X度了好多方法(其实大多都是一样的内用,还一个字都不差的),都没有能解决问题,无奈搞了2天终于解决了,与大家分享一下 
 
 
需求: 
用户登录该网站时,把用户的登录名,ip,时间。统计到一个txt文档里,以方便其他系统调用此txt。项目名</div>
                                </li>
                                <li><a href="/article/3757.htm"
                                       title="linux下mysql-5.6.23.tar.gz安装与配置" target="_blank">linux下mysql-5.6.23.tar.gz安装与配置</a>
                                    <span class="text-muted">笑我痴狂</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a>
                                    <div>1.卸载系统默认的mysql 
 
[root@localhost ~]# rpm -qa | grep mysql 
mysql-libs-5.1.66-2.el6_3.x86_64
mysql-devel-5.1.66-2.el6_3.x86_64
mysql-5.1.66-2.el6_3.x86_64
[root@localhost ~]# rpm -e mysql-libs-5.1</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><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>