前端异常监控

为什么要做前端异常监控

  • 有些问题只存在于线上特定的环境
  • 后端错误有监控,前端错误没有监控

基本实现

参考我们nodejs服务层和app的错误上报处理,基本流程为:
触发错误->捕获错误->错误上报->记录日志文件->存入ELK方便查询

  • 错误捕获:

    1. 接口请求error
    2. 全局监听异常
    3. 主动捕获
  • 错误上报:
    这里是需要我们参照app的地方,我们有一个日志服务器专门接收记录日志。

    这里需要我们的上报数据格式和日志服务器一致。

  • 记录日志文件和存入ELK
    我们根据上报的日志数据中两个key生成不同的日志文件,然后将ELK和这个日志文件绑定能够方便我们在kibana上查询。

根据基本流程,可以确定我们每个部分的职责:

  • 前端

    • 报错事件监听
    • 报错处理上报
  • 后端

    • 提供接口收集报错
    • 存储入ELK方便查询

预期问题

  • 前端错误分类
  • 如何查明出错位置
  • 错误如何上报
  • 错误消息数据结构
  • 如何平滑的应用在业务项目中

错误分类

  1. javascript异常
    • 语法错误
    • 运行时错误
    • script文件内错误(跨域和未跨域)
  2. JS文件、CSS文件、img图片等(资源)的404错误(其实是有onerror事件的dom)
  3. promise的异常捕获
  4. ajax请求错误

错误捕获

  1. 主动捕获(try catch / promise catch)
  2. 全局捕获(onerror / addEventListener)

主动捕获

我们在一些运算之后,得到一个期望的结果,然而结果不是我们想要的,这时可以上报一下错误。
基本上主动捕获也就是要求我们调用Logger.error(error, tag, message)(这个是前端监控js文件提供的一个方法)方法主动上报

try catch 捕获

  • 要求程序员在编写代码时,注意基本的异常捕获
  • 自动对JavaScript函数块添加异常捕获利用UglifyJS,使用AST为所有函数加上try catch

try {} catch(err) {}无法捕捉到异步错误和语法错误

自动添加try catch仅能对js文件生效,无法对html文件进行操作。(可以在catch中上报关于代码位置)

全局捕获

onerror事件

/**
  * @param {String}  msg    错误信息
  * @param {String}  url    出错文件
  * @param {Number}  row    行号
  * @param {Number}  col    列号
  * @param {Object}  error  错误详细信息
  */
window.onerror = function (msg, url, row, col, error) {
  console.log('我知道错误了');
  console.log({
    msg,  url,  row, col, error
  })
  return true; // 注意,在返回 true 的时候,异常才不会继续向上抛出error;
};

打印如下:

我知道错误了
{
    msg: "Uncaught ReferenceError: error is not defined", 
    url: "file:///Users/beifeng/Desktop/test.html", 
    row: 25, 
    col: 5, 
    error: ReferenceError: error is not defined at 
}

通过为页面上的 script 标签添加 crossOrigin 属性完成跨域上报,别忘了服务器也设置 Access-Control-Allow-Origin 的响应头。(解决跨域的js脚本错误上报)

通常我们使用window.onerror来捕获js脚本的错误信息。但是对于跨域调用的js脚本,onerror事件只会给出很少的报错信息:error: Script error.这个简单的信息很明显不足以看出脚本的具体错误,所以我们可以使用crossorigin属性,使得加载的跨域脚本可以得出跟同域脚本同样的报错信息:

如果是这样,www.lmj.com的服务器必须给出一个Access-Control-Allow-Origin的header,否则无法访问此脚本。

// 举个例子
// http://localhost:8080/index.html



// http://localhost:8081/test.js
setTimeout(() => {
  console.log(error);
});

onerror事件 是无法捕获到网络异常的错误(资源加载失败,裸奔,图片显示异常等)。当我们遇到 报 404 网络请求异常的时候,onerror 是无法帮助我们捕获到异常的。

window.addEventListener监听error事件

由于网络请求异常不会事件冒泡,因此必须在捕获阶段将其捕捉到才行,但是这种方式虽然可以捕捉到网络请求的异常,但是无法判断 HTTP 的状态是 404 还是其他比如 500 等等,所以还需要配合服务端日志才进行排查分析才可以。





打印如下:

我知道 404 错误了

bubbles:false
cancelBubble:false
cancelable:false
composed:false
currentTarget:null
defaultPrevented:false
falseeventPhase:0
isTrusted:true
path:Array(5) // dom树
  0:img
  1:div
  2:body
  3:html
  4:document
  5:Window
returnValue:true
srcElement:img // 发生错误的dom
target:img
timeStamp:5.545000000000001 // 错误发生的时间(按页面加载时间为0)
type:"error"


bubbles:false
cancelBubble:false
cancelable:true
colno:13 // 列号
composed:false
currentTarget:Window
defaultPrevented:true
error:TypeError: hahahah at file:///home/jhjr/Desktop/%E5%89%8D%E7%AB%AF%E5%BC%82%E5%B8%B8%E7%9B%91%E6%8E%A7/test.html:22:13
  message:"Unexpected identifier" // 错误信息
  stack:"SyntaxError: Unexpected identifier" // 错误栈
eventPhase:0
filename:"file:///home/jhjr/Desktop/%E5%89%8D%E7%AB%AF%E5%BC%82%E5%B8%B8%E7%9B%91%E6%8E%A7/test.html" // 错误文件
isTrusted:true
lineno:22 // 行号
message:"Uncaught TypeError: hahahah"
path:Array(1) // DOM树
returnValue:false
srcElement:Window // 发生错误的dom
target:Window
timeStamp:1005.4350000000001 // 错误发生的时间(按页面加载时间为0)
type:"error"

网上说addEventListener的浏览器兼容性不太好,去Can I use查了一下其实还好.具体看这里addEventListener.

还有一个问题是它的error对象在不同浏览器会有不同的一个体现,这里需要注意下.

promise异常捕获

现代的浏览器其实已经能够支持promise语法了,所以在promise异常捕获这一块我们也还是要注意一下.

  • 人工手动catch捕获(这个是基本的,和try...catch...是一样的).
  • 通过浏览器自带的unhandledrejection事件来监听全局没有catch的promise执行.但是这个的兼容性不是很好,具体可以看下unhandledrejection


new Promise(function(resolve, reject) {
  reject(new Error('haha'))
})

打印如下:

bubbles:false
cancelBubble:false
cancelable:true
composed:false
currentTarget:Window
defaultPrevented:false
eventPhase:0
isTrusted:true
path:Array(1)
promise:Promise // 捕获到的错误promise
reason:Error: haha at http://localhost:3000/promise_error:21:12 at Promise  () at http://localhost:3000/promise_error:20:3  // 其实就是错误栈
  message: "haha"
  stack: "Error: haha↵    at http://localhost:3000/promise_error:21:12↵    at Promise ()↵    at http://localhost:3000/promise_error:20:3"
returnValue:true
srcElement:Window
target:Window
timeStamp:55.190000000000005
type:"unhandledrejection"

异常如何上报

监控拿到报错信息之后,接下来就需要将捕捉到的错误信息发送到信息收集平台上,常用的发送形式主要有两种:

  • 通过 Ajax 发送数据(xhr和jquery)
  • 动态创建 img 标签的形式
    function report(error) {
      var reportUrl = 'http://xxxx/report';
      new Image().src = reportUrl + 'error=' + error;
    }
    

最终选择的还是通过xhr的方式,考虑不想依赖别的script文件。

数据结构

var deviceInfo = {
  "c": "website", // 客户端类别
  "p": "web-mobile-pay", // 客户端包名
  "l": "error", // 日志级别
  "t": new Date().getTime(), // 事件发生时间
  "v": Logger.version, // 客户端版本号
  "uid": userId,
  "ua": navigator.userAgent
};
var logs = [{
  "tag": data.tag || window.location.pathname, // tag 默认为网页路由
  "message": data.message || error.message || '',
  "url": window.location.href,  // 网址
  "filename": data.filename || "",  // 若全局捕获,文件名
  "lineno": data.lineno || 0, // 若全局捕获,行号
  "colno": data.colno || 0, // 若全局捕获,列号
  "domPath": domPath, // 若全局捕获页面dom问题,dom路径
  "element": element.outerHTML || "", // 若全局捕获页面dom问题,出错html代码
  "error": {
    "name": error.name || "",
    "message": error.message || "",
    "stack": error.stack || ""
  },
  uid: userId,
  userName: userName,
  mobile: mobile,
  branchNo: branchNo,
  idNo: idNo,
  clientId: clientId,
  clientName: clientName
}];

{deviceInfo: deviceInfo, logs: logs}

这里参照了我们已有的日志服务的基本数据格式和移动网站的日志上报相关的字段.
主要获取的信息包括:设备信息, 浏览器信息, 用户信息, 错误信息.

如何平滑的应用在业务项目中

自动化添加监听文件

通过gulp的插件gulp-inject查找ejs/html文件中的标签</code>进行插入对应的script脚本。</p> <pre class="has"><code>gulp.task('inject-js', function () { return gulp.src('src/views/**/*.ejs') .pipe(inject(gulp.src(['./src/public/js/*.js']), { starttag: '<head>', endtag: '<title>' })) .pipe(gulp.dest('dist/test')); }); </code></pre> <h3>避免addEventListener重复监听</h3> <ol> <li>通过在window对象上添加一个字段<code>errorListenerStatus</code>来作为error监听的标识。</li> <li>尽量避免在非主文件上去注入script脚本。</li> </ol> <h2>其他问题</h2> <ul> <li> <p><strong>压缩代码无法定位到错误具体位置怎么办</strong><br> sourceMap解析</p> </li> <li> <p><strong>用户行为记录</strong></p> <ul> <li>可以在cookie里记录用户在网站的访问记录</li> <li>对错误发生页面进行页面截屏</li> </ul> <blockquote> <p>不是很好的方式,当时技术上是可以实现的。</p> </blockquote> </li> </ul> <h2>具体代码</h2> <pre class="has"><code>var Logger = { maxRouterNum: 5, getCookie: function (name) { var arr; var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); if ((arr = document.cookie.match(reg))) return decodeURIComponent((arr[2])); else return ''; }, dataStructChange: function (data) { var element = data.srcElement || data.target || {}; var error = data.reason || data.error || {}; var domPath = ''; var router = Logger.getRouter(); // cookie 解析 var cookies = document.cookie ? document.cookie.split('; ').reduce(function (total, currentValue, currentIndex, arr) { var cookieArr = currentValue.split('='); total[cookieArr[0]] = cookieArr[1]; return total; }, {}) : {}; data.path && (domPath = data.path.map(function (item) { return item.nodeName || 'window'; }).join(', ')); var p = Logger.getCookie('package'); var version = Logger.getCookie('version'); var userId = Logger.getCookie('userId'); // 基本数据结构 var deviceInfo = { 'c': 'website', // 客户端类别 'p': p, // 客户端包名 'l': 'error', // 日志级别 't': new Date().getTime(), // 事件发生时间 'v': version, // 客户端版本号 'uid': userId, 'ua': navigator.userAgent }; var logs = [{ 'tag': data.tag || window.location.pathname, // tag 默认为网页路由 'message': data.message || error.message || '', 'url': window.location.href, // 网址 'filename': data.filename || '', // 若全局捕获,文件名 'lineno': data.lineno || 0, // 若全局捕获,行号 'colno': data.colno || 0, // 若全局捕获,列号 'domPath': domPath, // 若全局捕获页面dom问题,dom路径 'element': element.outerHTML || '', // 若全局捕获页面dom问题,出错html代码 'error': { 'name': error.name || '', 'message': error.message || '', 'stack': error.stack || '' }, 'router': router, // 用户访问路径 'cookies': cookies }]; // console.log({deviceInfo: deviceInfo, logs: logs}); return 'deviceInfo=' + JSON.stringify(deviceInfo) + '&logs=' + JSON.stringify(logs); }, // 请求 request: function (data, url) { try { // gulp-replace var requestUrl = Logger.getCookie('env') == 'production' ? 'production' : 'staging'; url = url || requestUrl; // gulp-replace end // 创建异步对象 var xhr = new XMLHttpRequest(); // 设置请求的类型及url xhr.open('post', url, true); // post请求一定要添加请求头才行不然会报错 xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); // 发送请求,此调用可能失败catch xhr.send(data); xhr.onreadystatechange = function () { // 这步为判断服务器是否正确响应 if (xhr.readyState == 4 && xhr.status == 200) { // console.log(xhr.responseText); } }; } catch (e) { console.log(e); } }, errorReport: function (data) { Logger.request(Logger.dataStructChange(data)); }, error: function (error, tag, message) { Logger.errorReport({tag: tag, error: error, message: message}); }, setRouter: function () { var maxNum = Logger.maxRouterNum; var router = sessionStorage.getItem('router'); var routerArr = []; if (router) { // 每个记录之间用|分割 routerArr = router.split('|'); // 只记录最近的5个访问 routerArr.length >= maxNum && (routerArr = routerArr.slice(routerArr.length - maxNum + 1)); } routerArr.push(JSON.stringify({path: window.location.href, date: new Date().getTime()})); sessionStorage.setItem('router', routerArr.join('|')); }, getRouter: function () { var router = sessionStorage.getItem('router'); return router || ''; } }; if (!window.errorListenerStatus) { // 避免多次监听 if (window.addEventListener) { // 所有主流浏览器,除了 IE 8 及更早版本 // 全局error监听 window.addEventListener('error', Logger.errorReport, true); } else if (window.attachEvent) { // IE 8 及更早版本 window.attachEvent('onerror', Logger.errorReport); } // 全局promise no catch error监听 // 支持性不太好,火狐不支持 window.addEventListener('unhandledrejection', Logger.errorReport, true); window.errorListenerStatus = true; } // 用户访问记录 Logger.setRouter(); // 设备信息 // 手机型号, 手机系统 // 浏览器信息 // 浏览器类型 // 错误信息 // 页面路径, 文件名称, 错误行列号, 错误类型, 错误信息, 错误栈(DOM树), 时间戳, // 用户信息 // cookie </code></pre> <h2>传送门</h2> <p><strong>前端监控异常方案</strong><br>如何做前端异常监控?<br>前端代码异常监控</p> <p><strong>前端异常捕获方法</strong><br>前端魔法堂——异常不仅仅是try/catch<br>Capture and report JavaScript errors with window.onerror<br>GlobalEventHandlers.onerror<br>addEventListener() 方法,事件监听</p> <p><strong>平滑应用</strong><br>gulp-inject</p> <p><strong>JavaScript Source Map</strong><br>JavaScript Source Map 详解<br>使用source-map实现对已压缩发布的前端代码的异常捕获与记录<br>source-map</p> <p>Raven.js</p> <p><strong>浏览器截屏</strong><br>html2canvas<br>导出HTML5 Canvas图片,并上传服务器</p> <p><strong>信息获取</strong><br>js获取ip地址,操作系统,浏览器版本等信息,可兼容</p> <p><br><br> 作者:2林子易2<br> 链接:https://www.jianshu.com/p/85d9a2778d80<br> 来源:简书<br> 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1293863898520297472"></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">你可能感兴趣的:(【HTML5+CSS3点滴知识,】)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1895936422515372032.htm" title="自动控制原理题海9.6:线性系统的状态空间分析与综合考研参考题" target="_blank">自动控制原理题海9.6:线性系统的状态空间分析与综合考研参考题</a> <span class="text-muted">FUXI_Willard</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E6%8E%A7%E5%88%B6%E8%80%83%E7%A0%94/1.htm">自动控制考研</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E6%8E%A7%E5%88%B6/1.htm">自动控制</a> <div>《自动控制原理题海与考研指导》习题精选,用于知识点巩固与提升。第九章:线性系统的状态空间分析与综合Example9.37试确定下列二次型函数的定号性:V(x)=2x12+3x22</div> </li> <li><a href="/article/1895936166633467904.htm" title="CAD插件技术真心不难,无非是画点线条,CAD内部能实现的,C#调用acdbmgd.dll和acmgd.dll也能实现" target="_blank">CAD插件技术真心不难,无非是画点线条,CAD内部能实现的,C#调用acdbmgd.dll和acmgd.dll也能实现</a> <span class="text-muted">思杰软件</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>CAD插件看起来很神秘,其实一个合格码农经过几天就能快速掌握。没什么秘密,开发CAD插件和winform一样简单学几个类库用法就是(只是太多人不喜欢知识分享),在CAD里展现界面和winform略有不同(整个项目工程在文章的最后有下载)。学习CAD插件开发的动机是为了薪水,由于公司是做显示屏和触摸屏的,养了一堆CAD的设计工程师拿着8K以上的薪水,当时我做为信息系统开发人员才拿4K,4个人要开发维</div> </li> <li><a href="/article/1895925451742834688.htm" title="跟我一起学Python数据处理(一百零三)之命令行参数解析与云服务应用" target="_blank">跟我一起学Python数据处理(一百零三)之命令行参数解析与云服务应用</a> <span class="text-muted">lilye66</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</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数据处理(一百零三)之命令行参数解析与云服务应用大家好!我写这系列博客的初衷是想和大家一起学习进步。在学习Python数据处理的过程中,我发现其中有很多有趣又实用的知识,所以迫不及待地想和大家分享。接下来,咱们就一起深入学习相关的知识点。一、Python命令行参数解析在Python编程里,有时候我们希望通过命令行给脚本传递额外信息,让脚本根据这些信息执行不同任务。比如有个数据</div> </li> <li><a href="/article/1895924192327561216.htm" title="Unity手机游戏开发:从搭建到发布上线全流程实战" target="_blank">Unity手机游戏开发:从搭建到发布上线全流程实战</a> <span class="text-muted">是Dream呀</span> <a class="tag" taget="_blank" href="/search/Dream%E5%A5%BD%E4%B9%A6%E6%8E%A8%E8%8D%90/1.htm">Dream好书推荐</a><a class="tag" taget="_blank" href="/search/Python%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/1.htm">Python游戏开发</a><a class="tag" taget="_blank" href="/search/unity/1.htm">unity</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F%E5%BC%95%E6%93%8E/1.htm">游戏引擎</a> <div>前言:技术书籍是学习技术知识的重要资源之一。读技术书可以帮助我们学习新技能和知识,技术书籍提供了可靠的、全面的信息,帮助我们快速学习新技能和知识。同时技术书籍有助于保持你的竞争力,因为它们提供了最新的技术知识和实践。这在当今快速发展的技术领域尤为重要,不断学习新知识和技能才能保持竞争力。总之,读技术书对于学习技术知识、提高职业素养和保持竞争力都非常重要。Dream联合金主爸爸给大家送书啦!本期为大</div> </li> <li><a href="/article/1895924191597752320.htm" title="从实例出发,讲解BLE专业调试工具nRF Connect" target="_blank">从实例出发,讲解BLE专业调试工具nRF Connect</a> <span class="text-muted">ZZQ-ZZQ</span> <a class="tag" taget="_blank" href="/search/%E7%89%A9%E8%81%94%E7%BD%91IOT/1.htm">物联网IOT</a><a class="tag" taget="_blank" href="/search/%E7%89%A9%E8%81%94%E7%BD%91/1.htm">物联网</a><a class="tag" taget="_blank" href="/search/nRF/1.htm">nRF</a><a class="tag" taget="_blank" href="/search/Connect/1.htm">Connect</a><a class="tag" taget="_blank" href="/search/ble/1.htm">ble</a> <div>nRFConnect是NORDICSemiconductor提供的一套强大的低功耗蓝牙(BLE)开发工具和应用程序,本文从两个示例着手分析:iBeacon和Eddystone协议的信标Beacon前置知识:什么是信标Beacon?信标(Beacon)是一种基于低功耗蓝牙(BluetoothLowEnergy,BLE)技术的小型无线发射设备,用于广播信号,向附近的智能设备(如智能手机、平板电脑)传输</div> </li> <li><a href="/article/1895920280518324224.htm" title="前沿计组知识入门(二)" target="_blank">前沿计组知识入门(二)</a> <span class="text-muted">tianyunlinger</span> <a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%BB%84/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%AC%94%E8%AE%B0/1.htm">笔记</a> <div>第2页:并行计算与编程硬件:多处理器多内存互连网络系统软件:并行操作系统用于表达和协调并发的编程构造应用软件:并行算法目标:利用硬件、系统和应用软件实现加速(速度提升):Tp=TspT_p=\frac{T_s}{p}Tp=pTs解决需要大量内存的问题第3页:并行算法/公式化并行公式化:并行化串行算法。并行算法:可能与串行算法完全不同。重点:主要讨论如何开发并行公式化。也会涉及一些非串行算法的并行例</div> </li> <li><a href="/article/1895913090067787776.htm" title="AI进化革命:从工具到伙伴的边界突破" target="_blank">AI进化革命:从工具到伙伴的边界突破</a> <span class="text-muted">一整颗红豆</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BDAI/1.htm">人工智能AI</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/1.htm">神经网络</a> <div>欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴,分享实用的技巧️,偶尔还有一些奇思妙想本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创!欢迎评论区留言交流个人主页ZyyOvO各位于晏,亦菲请阅引言破冰:AI正在改写现实规则技术突破实践应用AI核心技术剖析基础支撑技术关键领域技术前沿突破方向技术挑战详解未来技术焦点产业地震:AI重构六大领域医疗健康金融制造业交通与物流教育零</div> </li> <li><a href="/article/1895913091191861248.htm" title="【Linux 进程状态】—— 从创建到消亡的全生命周期" target="_blank">【Linux 进程状态】—— 从创建到消亡的全生命周期</a> <span class="text-muted">一整颗红豆</span> <a class="tag" taget="_blank" href="/search/Linux%E9%A9%BE%E9%A9%AD%E4%B9%8B%E9%81%93/1.htm">Linux驾驭之道</a><a class="tag" taget="_blank" href="/search/%E6%8E%8C%E6%8E%A7%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%89%BA%E6%9C%AF%E4%B8%8E%E5%93%B2%E5%AD%A6/1.htm">掌控操作系统的艺术与哲学</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4%E5%BC%80%E5%8F%91/1.htm">运维开发</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴,分享实用的技巧️,偶尔还有一些奇思妙想本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创!欢迎评论区留言交流个人主页ZyyOvO本文专栏➡️Linux驾驭之道掌控操作系统的艺术与哲学各位于晏,亦菲们请看引言==进程=内核数据结构+自己的代码和数据==系统调用fork函数功能返回值代码层面理解进程状态Linux内核源代码进程状态</div> </li> <li><a href="/article/1895909185166569472.htm" title="基于 langchain+ollama 创建私有化知识库" target="_blank">基于 langchain+ollama 创建私有化知识库</a> <span class="text-muted">大语言模型</span> <a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/1.htm">知识图谱</a><a class="tag" taget="_blank" href="/search/LLM/1.htm">LLM</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/llama/1.htm">llama</a><a class="tag" taget="_blank" href="/search/RAG/1.htm">RAG</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%BA%93/1.htm">知识库</a> <div>本文实现了基于langchain的本地知识库的基本功能,可离线访问。主要使用了Langchain,ChromaDbOllama。概念介绍什么是RAGRAG是retrieval-augmented-generation的缩写,直译中文的意思是检索增强生成,可以简单理解能让训练好的大模型LLM可以结合外部数据,可以补充或者修正大模型返回的答案,提高答案的准确性。LLM有哪些痛点数据陈旧,一旦训练完成无</div> </li> <li><a href="/article/1895908805485588480.htm" title="Maven依赖问题排查" target="_blank">Maven依赖问题排查</a> <span class="text-muted">坎坷er</span> <a class="tag" taget="_blank" href="/search/Maven/1.htm">Maven</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>前言:大家好,我是小熊,25届毕业生,目前在一家满意的公司实习。本篇文章为Maven依赖问题排查,刚开始应该是不全面的,但文章会一直更新的。个人简介:大家好,我是小熊,一个想吃鱼的男人目前状况:25届毕业生,在一家满意的公司实习欢迎大家:这里是CSDN,我用来快速回顾知识准备面试的地方,欢迎来到我的博客背景刚进公司实习,使用svn(类似git代码管理工具)拉取公司项目的时候,遇到找不到依赖的问题,</div> </li> <li><a href="/article/1895908806181842944.htm" title="【自学笔记】Oracle基础知识点总览-持续更新" target="_blank">【自学笔记】Oracle基础知识点总览-持续更新</a> <span class="text-muted">Long_poem</span> <a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Oracle数据库基础知识点总览1.数据库安装与配置2.SQL基础3.PL/SQL基础4.数据库管理5.高级主题总结Oracle数据库基础知识点总览1.数据库安装与配置安装Oracle数据库:下载Oracle安装包,按照向导进行安装。配置监听器:使用netca工具配置监听器,确保客户端可以连接到数据库。创建数据库:使用dbca</div> </li> <li><a href="/article/1895905278877036544.htm" title="DeepSeek怎么用,DeepSeek使用指南最全合集(保姆级教程)" target="_blank">DeepSeek怎么用,DeepSeek使用指南最全合集(保姆级教程)</a> <span class="text-muted">xiecoding.cn</span> <a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a><a class="tag" taget="_blank" href="/search/deepseek%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/1.htm">deepseek使用指南</a><a class="tag" taget="_blank" href="/search/deepseek%E6%80%8E%E4%B9%88%E7%94%A8/1.htm">deepseek怎么用</a><a class="tag" taget="_blank" href="/search/deepseek%E5%85%8D%E8%B4%B9%E6%95%99%E5%AD%A6/1.htm">deepseek免费教学</a><a class="tag" taget="_blank" href="/search/deepseek%E8%B5%84%E6%96%99%E5%90%88%E9%9B%86/1.htm">deepseek资料合集</a> <div>DeepSeek是一款由国内顶尖团队开发的人工智能大模型,旨在为用户提供高效、智能的问答和知识服务。作为国产AI模型的代表,DeepSeek不仅在自然语言处理(NLP)领域表现出色,还在多个应用场景中展现了强大的能力。与ChatGPT等国际知名模型相比,DeepSeek在中文语境下的表现尤为突出,能够更好地理解中文的复杂语义和文化背景。DeepSeek使用资源下载为了方便大家更好地学习和使用Dee</div> </li> <li><a href="/article/1895902252762198016.htm" title="C 语言中的数组与指针:深入剖析与实践应用" target="_blank">C 语言中的数组与指针:深入剖析与实践应用</a> <span class="text-muted">Kurbaneli</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/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>一、引言在C语言的学习旅程中,数组与指针是两个极为重要且强大的概念。它们不仅是C语言高效操作数据的基础,也是C语言能够广泛应用于系统编程、嵌入式开发等领域的关键因素之一。深入理解并熟练掌握数组与指针的使用,对于编写高质量、高性能的C语言程序至关重要。本文将详细介绍C语言中数组与指针的相关知识,并通过丰富的示例代码进行说明。二、数组的基本概念与使用数组的定义:数组是一种构造数据类型,它可以存储多个相</div> </li> <li><a href="/article/1895892918619664384.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/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/go/1.htm">go</a> <div>目录一、字节豆包后端一面面经解析(一)自我介绍(二)实习项目拷打(三)手撕代码(四)C++多态相关问题(五)智能指针相关问题(六)malloc相关问题(七)mmap相关问题(八)多线程相关问题(九)MySQL存储引擎相关问题(十)Redis持久化相关问题(十一)前沿知识相关问题(十二)反问环节二、字节广告后端一面面经解析(一)自我介绍(二)实习项目拷打(三)文件系统相关问题(四)LinuxIO多路</div> </li> <li><a href="/article/1895888128640610304.htm" title="【在Oracle Linux 7 上安装Oracle 19c - 基于ASM存储的单实例数据库】" target="_blank">【在Oracle Linux 7 上安装Oracle 19c - 基于ASM存储的单实例数据库】</a> <span class="text-muted">AllanHwang</span> <a class="tag" taget="_blank" href="/search/Oracle/1.htm">Oracle</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</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/linux/1.htm">linux</a> <div>在OracleLinux7上安装Oracle19c-基于ASM存储的单实例数据库前言环境环境准备阶段配置主机名、网络等安装ORACLE先决条件的软件包修改系统参数安装阶段下载软件安装GRID安装ORACLEDBCA建库使用阶段ASM的启动和暂停自动启停手动启停前言记录Oracle学习过程,形成自己的知识体系。目前有部分操作还不清楚具体原理,后期随着学习的深入,逐渐完善本文档。环境系统:Oracle</div> </li> <li><a href="/article/1895878675828633600.htm" title="前端面试100问!!" target="_blank">前端面试100问!!</a> <span class="text-muted">一只松</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a> <div>面试造火箭,工作拧螺丝!在技术圈毕竟只有百分之一的人能进入BAT,百分之九九的小伙伴只能在普通公司做这普通的事情,厌烦哪些标题党,我们抛开那些高大上的台词,回归到面试的本质。本课程帮助小伙伴们快速梳理知识,不会涉及到具体的很细节的知识点,关注面试本身。公司一般会从以下5个方面考察一个人的能力,本课程的100问是总结了最近2-3年常问的面试题,适合初中级前端工程师。1、HTML(5)和CSS3方面1</div> </li> <li><a href="/article/1895875904412905472.htm" title="path 路径模块" target="_blank">path 路径模块</a> <span class="text-muted">咖啡の猫</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>在Node.js开发中,处理文件路径是一项常见的任务。为了简化路径操作并避免跨平台兼容性问题,Node.js提供了一个名为path的核心模块。本文将详细介绍path模块的基础知识、主要功能以及如何利用它来实现路径操作。什么是path模块?path模块提供了实用工具来处理和转换文件路径,使得开发者能够编写出跨平台兼容的代码。无论是构建动态文件路径还是解析现有路径,path模块都能大大简化这些操作。跨</div> </li> <li><a href="/article/1895875273329537024.htm" title="软考程序员各模块知识点对应的分值分布及考试形式总结" target="_blank">软考程序员各模块知识点对应的分值分布及考试形式总结</a> <span class="text-muted">水瓶丫头站住</span> <a class="tag" taget="_blank" href="/search/%E8%80%83%E8%AF%95/1.htm">考试</a><a class="tag" taget="_blank" href="/search/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/1.htm">排序算法</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>软考程序员考试分为基础知识(综合知识)和应用技术两个科目,各科目满分均为75分,合格标准通常为45分。以下是各模块知识点对应的分值分布及考试形式总结:一、综合知识(上午考试)题型:75道客观选择题(含5道专业英语题),每题1分,总分75分。核心模块及分值(基于近10次考试统计):数据结构和算法(11-13分)重点:顺序表、链表、树、图、排序与查找算法等。计算机系统基础知识(7-11分)包含进制转换</div> </li> <li><a href="/article/1895865566971883520.htm" title="网络安全审计员" target="_blank">网络安全审计员</a> <span class="text-muted">网络安全-老纪</span> <a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>在当今数字化时代,随着信息技术的迅猛发展,网络安全问题日益凸显,成为各行各业不容忽视的重要议题。特别是对于企业、政府机构等组织而言,网络安全不仅关乎数据资产的安全,更与组织的声誉、客户信任乃至法律法规的遵从性紧密相连。因此,网络安全审计员这一角色应运而生,他们在保障网络安全方面发挥着举足轻重的作用。网络安全审计员是负责监督和评估组织网络安全状况的专业人员。他们需具备深厚的网络安全知识,包括但不限于</div> </li> <li><a href="/article/1895856990341623808.htm" title="基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[6]-实现Milvus向量检索+实现自定义关键词调整Embedding模型" target="_blank">基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[6]-实现Milvus向量检索+实现自定义关键词调整Embedding模型</a> <span class="text-muted">汀、人工智能</span> <a class="tag" taget="_blank" href="/search/LLM%E5%B7%A5%E4%B8%9A%E7%BA%A7%E8%90%BD%E5%9C%B0%E5%AE%9E%E8%B7%B5/1.htm">LLM工业级落地实践</a><a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/milvus/1.htm">milvus</a><a class="tag" taget="_blank" href="/search/embedding/1.htm">embedding</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/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/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%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a> <div>基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[6]-实现Milvus向量检索+实现自定义关键词调整Embedding模型0.Milvus与Faiss对比Milvus相对于Faiss的优势主要体现在以下几个方面:在线数据更新与实时搜索:Milvus支持在线的数据更新和实时的向量搜索,这意味着在数据频繁变动的场景下,用户无需重新构建整个索引,从而大大减少了维护成本。相比之</div> </li> <li><a href="/article/1895855099230613504.htm" title="自动控制原理题海9.5:线性系统的状态空间分析与综合" target="_blank">自动控制原理题海9.5:线性系统的状态空间分析与综合</a> <span class="text-muted">FUXI_Willard</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E6%8E%A7%E5%88%B6/1.htm">自动控制</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E6%8E%A7%E5%88%B6%E8%80%83%E7%A0%94/1.htm">自动控制考研</a> <div>《自动控制原理题海与考研指导》习题精选,用于知识点巩固与提升。第九章:线性系统的状态空间分析与综合Example9.29设有连续时间系统(A,b,c)(A,b,c)(A,</</div> </li> <li><a href="/article/1895855098714714112.htm" title="Redis系列之进阶篇(下)" target="_blank">Redis系列之进阶篇(下)</a> <span class="text-muted">可乐不渴了</span> <a class="tag" taget="_blank" href="/search/Redis/1.htm">Redis</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6/1.htm">进阶</a> <div>Redis系列之进阶篇(下)前言上一期我们学习了Redis的一些高级应用,今天我们来继续学习Redis的高级技术。这篇文章主要内容是:布隆过滤器限流GeoHashScan本文所学知识点过多,请做好实践。1.布隆过滤器布隆过滤器是一种高级数据结构,专门用于解决去重和检测某个对象是否存在的问题。布隆过滤器就像一个不怎么精确的set结构,当你使用它的contains方法判断某个对象是否存在时,它可能会误</div> </li> <li><a href="/article/1895852451215503360.htm" title="如何更加优雅提问:浅谈提示词" target="_blank">如何更加优雅提问:浅谈提示词</a> <span class="text-muted">愚戏师</span> <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/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a> <div>询问是一门艺术,如何优雅高效地提问很可能是未来十年每个人的必备素质参考ISO/IEC23894人工智能系统工程标准第一步:理论基础构建目标:通过结构化分析与实践验证,提升提示词设计的精准度、可控性与生成效率一、提示词设计的核心方法论分阶目标拆解基础层:明确任务类型(生成、推理、分类、创作等)逻辑层:定义输出格式(步骤化、代码块、表格、故事体例等)优化层:嵌入约束条件(长度、风格、知识范围、反例排除</div> </li> <li><a href="/article/1895849803166838784.htm" title="互联网产品经理" target="_blank">互联网产品经理</a> <span class="text-muted">西部驯兽师</span> <a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E6%96%B9%E6%B3%95%E8%AE%BA/1.htm">软件工程方法论</a><a class="tag" taget="_blank" href="/search/%E4%BA%A7%E5%93%81%E7%BB%8F%E7%90%86/1.htm">产品经理</a> <div>要成为高级互联网产品经理,需要系统性地构建知识体系、规划职业路径、积累实战经验并建立行业影响力。以下是具体路径和建议:一、知识体系构建1.核心能力模块市场与用户洞察:掌握市场分析工具(SWOT、PESTEL、波特五力模型)。精通用户研究方法(问卷、访谈、用户画像、A/B测试)。学习行为心理学(如《影响力》《思考,快与慢》)。产品设计与技术基础:熟悉产品设计工具(Axure、Figma、墨刀)。理解</div> </li> <li><a href="/article/1895843121216942080.htm" title="sql深入学习" target="_blank">sql深入学习</a> <span class="text-muted">lally.</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>文章目录前言知识学习注释的两种形式字符型注入万能密码布尔盲注报错注入堆叠注入时间盲注二次注入小技巧前言这次学习建立在对数据库有基本的认识,了解基础的增删改查语句,数字型注入和字符型注入的基础上,进一步深入学习知识,并进行实战训练知识学习注释的两种形式#号,url编码用%23替代--空格字符型注入注入字符被引号包裹,需要采取一定的策略绕过,包括or截断,前面引号后面注释等//eq:拼接sql语句查找</div> </li> <li><a href="/article/1895841230877683712.htm" title="后端开发技术栈和知识点的分类,以及按学习顺序推荐的相关书籍" target="_blank">后端开发技术栈和知识点的分类,以及按学习顺序推荐的相关书籍</a> <span class="text-muted">输出输入</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>以下是后端开发技术栈和知识点的分类,以及按学习顺序推荐的相关书籍:1.基础编程语言后端开发通常需要掌握至少一种编程语言,如Java、Python、Go或Node.js。推荐书籍:•Java:•《Java核心技术卷I》:适合Java初学者,涵盖语言基础、面向对象编程、异常处理等内容。•《Java编程思想》:深入讲解Java的核心概念和编程思想。•《EffectiveJava》:Java开发的最佳实践</div> </li> <li><a href="/article/1895839970237673472.htm" title="使用 LangChain 和 Milvus 构建测试知识库" target="_blank">使用 LangChain 和 Milvus 构建测试知识库</a> <span class="text-muted">Python测试之道</span> <a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E6%8F%90%E6%95%88/1.htm">测试提效</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a> <div>LangChain是一个强大的框架,可以与向量数据库(如Milvus)无缝集成,用于构建基于检索的增强生成(RAG)系统。在测试工程师的场景中,可以将测试资产(如需求文档、测试用例、缺陷报告等)存储在Milvus中,然后通过LangChain提供的检索功能快速查询和生成相关内容。功能目标存储测试资产:将需求文档、测试用例和缺陷记录等内容转换为向量表示并存储到Milvus。检索测试资产:根据用户输入</div> </li> <li><a href="/article/1895834171159408640.htm" title="基于问答对的实体识别和意图识别的知识图谱问答推理" target="_blank">基于问答对的实体识别和意图识别的知识图谱问答推理</a> <span class="text-muted">风清扬【coder】</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%88%86%E6%9E%90%E5%A4%84%E7%90%86/1.htm">自然语言分析处理</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/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/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a> <div>问答对数据questionanswer省直医保的参保范围是什么?中央直属、省直属在哈尔滨的机关、事业单位、社会团体及其职工和退休人员。参加省直医保的单位缴费基数如何确定和缴纳?在职职工(以下简称职工)个人月缴费基数按本人上年度月平均工资确定,由单位代扣代缴,用人单位月缴费基数按本单位参保职工个人月缴费基数之和确定。缴费费率:用人单位8%(含生育0.5%)、职工个人2%。缴费方式:用人单位、职工按月</div> </li> <li><a href="/article/1895834044831166464.htm" title="【零代码(低代码)工作流引擎(cube-flowable)】" target="_blank">【零代码(低代码)工作流引擎(cube-flowable)】</a> <span class="text-muted">风清扬【coder】</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8E%E4%BB%A3%E7%A0%81/1.htm">低代码</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">工作流</a><a class="tag" taget="_blank" href="/search/%E4%BD%8E%E4%BB%A3%E7%A0%81/1.htm">低代码</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/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a> <div>cube-flowable工作流引擎简介cube-flowable工作流引擎旨在打造一套零代码、领先、且快速实用的引擎工具,助力开发者在面对工作流开发任务时,除去学习工作流框架知识和API的学习成本且不去关心工作流是什么技术,无需了解学习,安装使用cube-flowable工作流引擎并应用落地。此工作流引擎是零代码或低代码的工作流引擎,安装配置开箱即可使用,完全适用于中国国情的工作流引擎。主要特点</div> </li> <li><a href="/article/1895830896670470144.htm" title="从虚拟dom知识无痛深入vue与react的原理" target="_blank">从虚拟dom知识无痛深入vue与react的原理</a> <span class="text-muted">沐萸木鱼</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>我们都知道像vue、react都有用到虚拟dom,那么虚拟dom到底是什么?框架为什么不直接操作真实dom而要在中间要引入虚拟dom呢?vue和react的虚拟dom又有什么异同呢?我们就从虚拟dom开始讲起,再来逐步引入讲解vue与react的部分原理及其异同,这里会顺便讲解到数据驱动视图及视图驱动数据,顺便明白MVVM、MVC这两种模式,顺便引入相关的八股文知识点,好好阅读这篇文章你会不小心一</div> </li> <li><a href="/article/103.htm" title="SAX解析xml文件" target="_blank">SAX解析xml文件</a> <span class="text-muted">小猪猪08</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>1.创建SAXParserFactory实例 2.通过SAXParserFactory对象获取SAXParser实例 3.创建一个类SAXParserHander继续DefaultHandler,并且实例化这个类 4.SAXParser实例的parse来获取文件     public static void main(String[] args) { //</div> </li> <li><a href="/article/230.htm" title="为什么mysql里的ibdata1文件不断的增长?" target="_blank">为什么mysql里的ibdata1文件不断的增长?</a> <span class="text-muted">brotherlamp</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/linux%E8%BF%90%E7%BB%B4/1.htm">linux运维</a><a class="tag" taget="_blank" href="/search/linux%E8%B5%84%E6%96%99/1.htm">linux资料</a><a class="tag" taget="_blank" href="/search/linux%E8%A7%86%E9%A2%91/1.htm">linux视频</a><a class="tag" taget="_blank" href="/search/linux%E8%BF%90%E7%BB%B4%E8%87%AA%E5%AD%A6/1.htm">linux运维自学</a> <div>我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。 当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。 一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table,所以问题是: ibdata1存了什么? 当你启用了 i</div> </li> <li><a href="/article/357.htm" title="Quartz-quartz.properties配置" target="_blank">Quartz-quartz.properties配置</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/quartz/1.htm">quartz</a> <div>其实Quartz JAR文件的org.quartz包下就包含了一个quartz.properties属性配置文件并提供了默认设置。如果需要调整默认配置,可以在类路径下建立一个新的quartz.properties,它将自动被Quartz加载并覆盖默认的设置。   下面是这些默认值的解释 #-----集群的配置 org.quartz.scheduler.instanceName =</div> </li> <li><a href="/article/484.htm" title="informatica session的使用" target="_blank">informatica session的使用</a> <span class="text-muted">18289753290</span> <a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/log/1.htm">log</a><a class="tag" taget="_blank" href="/search/Informatica/1.htm">Informatica</a> <div>如果希望workflow存储最近20次的log,在session里的Config  Object设置,log  options做配置,save  session log :sessions  run  ;savesessio log for  these runs:20 session下面的source 里面有个tracing </div> </li> <li><a href="/article/611.htm" title="Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误" target="_blank">Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a> <div>Scrapy版本0.14.4 出现问题现象: ERROR: Error downloading <GET http://xxxxx  CRC check failed   解决方法   1.设置网络请求时的header中的属性'Accept-Encoding': '*;q=0'   明确表示不支持任何形式的压缩格式,避免程序的解压</div> </li> <li><a href="/article/738.htm" title="java Swing小集锦" target="_blank">java Swing小集锦</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/java+swing/1.htm">java swing</a> <div>1.关闭窗体弹出确认对话框   1.1   this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);   1.2   this.addWindowListener ( new WindowAdapter () { public void windo</div> </li> <li><a href="/article/865.htm" title="强制删除.svn文件夹" target="_blank">强制删除.svn文件夹</a> <span class="text-muted">随便小屋</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>          在windows上,从别处复制的项目中可能带有.svn文件夹,手动删除太麻烦,并且每个文件夹下都有。所以写了个程序进行删除。因为.svn文件夹在windows上是只读的,所以用File中的delete()和deleteOnExist()方法都不能将其删除,所以只能采用windows命令方式进行删除</div> </li> <li><a href="/article/992.htm" title="GET和POST有什么区别?及为什么网上的多数答案都是错的。" target="_blank">GET和POST有什么区别?及为什么网上的多数答案都是错的。</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/get+post/1.htm">get post</a> <div>     如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历      前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。     这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把G</div> </li> <li><a href="/article/1119.htm" title="谈谈新浪微博背后的那些算法" target="_blank">谈谈新浪微博背后的那些算法</a> <span class="text-muted">aoyouzi</span> <a class="tag" taget="_blank" href="/search/%E8%B0%88%E8%B0%88%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A%E8%83%8C%E5%90%8E%E7%9A%84%E9%82%A3%E4%BA%9B%E7%AE%97%E6%B3%95/1.htm">谈谈新浪微博背后的那些算法</a> <div>本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人云“窥一斑而见全豹”,希望本文的介绍能帮助大家更好的理解微博这样的社交网络应用。 微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针</div> </li> <li><a href="/article/1246.htm" title="Connection reset 连接被重置的解决方法" target="_blank">Connection reset 连接被重置的解决方法</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%AD%97%E7%AC%A6%E6%B5%81/1.htm">字符流</a><a class="tag" taget="_blank" href="/search/%E8%BF%9E%E6%8E%A5%E8%A2%AB%E9%87%8D%E7%BD%AE/1.htm">连接被重置</a> <div>流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置   被重置的代码如下;   客户端代码; package 通信软件服务器; import java.io.BufferedWriter; import java.io.OutputStream; import java.io.O</div> </li> <li><a href="/article/1373.htm" title="web.xml配置详解之filter" target="_blank">web.xml配置详解之filter</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/web.xml/1.htm">web.xml</a><a class="tag" taget="_blank" href="/search/filter/1.htm">filter</a> <div>一.定义 <filter> <filter-name>encodingfilter</filter-name> <filter-class>com.my.app.EncodingFilter</filter-class> <init-param> <param-name>encoding<</div> </li> <li><a href="/article/1500.htm" title="Heritrix" target="_blank">Heritrix</a> <span class="text-muted">Bill_chen</span> <a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%88%B6%E9%80%A0/1.htm">制造</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/1.htm">配置管理</a> <div>作为纯Java语言开发的、功能强大的网络爬虫Heritrix,其功能极其强大,且扩展性良好,深受热爱搜索技术的盆友们的喜爱,但它配置较为复杂,且源码不好理解,最近又使劲看了下,结合自己的学习和理解,跟大家分享Heritrix的点点滴滴。 Heritrix的下载(http://sourceforge.net/projects/archive-crawler/)安装、配置,就不罗嗦了,可以自己找找资</div> </li> <li><a href="/article/1627.htm" title="【Zookeeper】FAQ" target="_blank">【Zookeeper】FAQ</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a> <div>1.脱离IDE,运行简单的Java客户端程序 #ZkClient是简单的Zookeeper~$ java -cp "./:zookeeper-3.4.6.jar:./lib/*" ZKClient    1. Zookeeper是的Watcher回调是同步操作,需要添加异步处理的代码 2. 如果Zookeeper集群跨越多个机房,那么Leader/</div> </li> <li><a href="/article/1754.htm" title="The user specified as a definer ('aaa'@'localhost') does not exist" target="_blank">The user specified as a definer ('aaa'@'localhost') does not exist</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/localhost/1.htm">localhost</a> <div>今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist 最后找原因发现删除操作做了触发器,而触发器里面有这样一句 /*!50017 DEFINER = ''aaa@'localhost' */  原来最初</div> </li> <li><a href="/article/1881.htm" title="javascript中showModelDialog刷新父页面" target="_blank">javascript中showModelDialog刷新父页面</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%88%B7%E6%96%B0%E7%88%B6%E9%A1%B5%E9%9D%A2/1.htm">刷新父页面</a><a class="tag" taget="_blank" href="/search/showModalDialog/1.htm">showModalDialog</a> <div>在页面中使用showModalDialog打开模式子页面窗口的时候,如果想在子页面中操作父页面中的某个节点,可以通过如下的进行:       window.showModalDialog('url',self,‘status...’); // 首先中间参数使用self       在子页面使用w</div> </li> <li><a href="/article/2008.htm" title="编程之美-买书折扣" target="_blank">编程之美-买书折扣</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.Arrays; public class BookDiscount { /**编程之美 买书折扣 书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。 下面用动态规划实现。 哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷</div> </li> <li><a href="/article/2135.htm" title="关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要" target="_blank">关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要</a> <span class="text-muted">chenbowen00</span> <a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/WEB%E5%AE%89%E5%85%A8/1.htm">WEB安全</a> <div>因为近期负责的几个银行系统软件,需要交付客户,因此客户专门请了安全公司对系统进行了安全评测,结果发现了诸如跨站执行脚本,远程执行漏洞以及弱口令等问题。 下面记录下本次解决的过程以便后续 1、首先从最简单的开始处理,服务器的弱口令问题,首先根据安全工具提供的测试描述中发现应用服务器中存在一个匿名用户,默认是不需要密码的,经过分析发现服务器使用了FTP协议, 而使用ftp协议默认会产生一个匿名用</div> </li> <li><a href="/article/2262.htm" title="[电力与暖气]煤炭燃烧与电力加温" target="_blank">[电力与暖气]煤炭燃烧与电力加温</a> <span class="text-muted">comsci</span> <div>       在宇宙中,用贝塔射线观测地球某个部分,看上去,好像一个个马蜂窝,又像珊瑚礁一样,原来是某个国家的采煤区.....       不过,这个采煤区的煤炭看来是要用完了.....那么依赖将起燃烧并取暖的城市,在极度严寒的季节中...该怎么办呢?   &nbs</div> </li> <li><a href="/article/2389.htm" title="oracle O7_DICTIONARY_ACCESSIBILITY参数" target="_blank">oracle O7_DICTIONARY_ACCESSIBILITY参数</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL</div> </li> <li><a href="/article/2516.htm" title="比较全面的MySQL优化参考" target="_blank">比较全面的MySQL优化参考</a> <span class="text-muted">dengkane</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。   1、硬件层相关优化   1.1、CPU相关   在服务器的BIOS设置中,可</div> </li> <li><a href="/article/2643.htm" title="C语言homework2,有一个逆序打印数字的小算法" target="_blank">C语言homework2,有一个逆序打印数字的小算法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>#h1#   0、完成课堂例子 1、将一个四位数逆序打印 1234 ==> 4321 实现方法一: # include <stdio.h> int main(void) { int i = 1234; int one = i%10; int two = i / 10 % 10; int three = i / 100 % 10; </div> </li> <li><a href="/article/2770.htm" title="apacheBench对网站进行压力测试" target="_blank">apacheBench对网站进行压力测试</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/apachebench/1.htm">apachebench</a> <div>   ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。 通过下面的一个简单的例子和注释,相信大家可以更容易理解这个工具的使用。 </div> </li> <li><a href="/article/2897.htm" title="2种办法让HashMap线程安全" target="_blank">2种办法让HashMap线程安全</a> <span class="text-muted">flyfoxs</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/jni/1.htm">jni</a> <div>多线程之--2种办法让HashMap线程安全 多线程之--synchronized 和reentrantlock的优缺点 多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)     HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全.   </div> </li> <li><a href="/article/3024.htm" title="Spring Security(04)——认证简介" target="_blank">Spring Security(04)——认证简介</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/%E8%AE%A4%E8%AF%81/1.htm">认证</a><a class="tag" taget="_blank" href="/search/%E8%BF%87%E7%A8%8B/1.htm">过程</a> <div>认证简介 目录 1.1     认证过程 1.2     Web应用的认证过程 1.2.1    ExceptionTranslationFilter 1.2.2    在request之间共享SecurityContext   1</div> </li> <li><a href="/article/3151.htm" title="Java 位运算" target="_blank">Java 位运算</a> <span class="text-muted">Javahuhui</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div>// 左移( << ) 低位补0 // 0000 0000 0000 0000 0000 0000 0000 0110 然后左移2位后,低位补0: // 0000 0000 0000 0000 0000 0000 0001 1000 System.out.println(6 << 2);// 运行结果是24 // 右移( >> ) 高位补"</div> </li> <li><a href="/article/3278.htm" title="mysql免安装版配置" target="_blank">mysql免安装版配置</a> <span class="text-muted">ldzyz007</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。 2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。 3、my-large.ini是为专用于一个SQL数据</div> </li> <li><a href="/article/3405.htm" title="MFC和ado数据库使用时遇到的问题" target="_blank">MFC和ado数据库使用时遇到的问题</a> <span class="text-muted">你不认识的休道人</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/mfc/1.htm">mfc</a> <div>=================================================================== 第一个 =================================================================== try{ CString sql; sql.Format("select * from p</div> </li> <li><a href="/article/3532.htm" title="表单重复提交Double Submits" target="_blank">表单重复提交Double Submits</a> <span class="text-muted">rensanning</span> <a class="tag" taget="_blank" href="/search/double/1.htm">double</a> <div>可能发生的场景: *多次点击提交按钮 *刷新页面 *点击浏览器回退按钮 *直接访问收藏夹中的地址 *重复发送HTTP请求(Ajax) (1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。 这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法: http://getbootstrap.co</div> </li> <li><a href="/article/3659.htm" title="Java String 十大常见问题" target="_blank">Java String 十大常见问题</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div> 1.字符串比较,使用“==”还是equals()?   "=="判断两个引用的是不是同一个内存地址(同一个物理对象)。   equals()判断两个字符串的值是否相等。   除非你想判断两个string引用是否同一个对象,否则应该总是使用equals()方法。   如果你了解字符串的驻留(String Interning)则会更好地理解这个问题。    </div> </li> <li><a href="/article/3786.htm" title="SpringMVC 登陆拦截器实现登陆控制" target="_blank">SpringMVC 登陆拦截器实现登陆控制</a> <span class="text-muted">xp9802</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a> <div>思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截。   实现方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 </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>