Headless Chrome入门

原文地址:Getting Started with Headless Chrome By Eric Bidelman Engineer @ Google working on web tooling: Headless Chrome, Puppeteer, Lighthouse

Headless Chrome在Chrome59中发布,用于在headless环境中运行Chrome浏览器,也就是在非Chrome环境中运行Chrome。它将Chromium和Blink渲染引擎提供的所有现代Web平台功能引入命令行。

它有什么用处呢?

headless浏览器是自动测试和服务器环境的绝佳工具,您不需要可见的UI shell。例如,针对真实的网页进行测试,创建网页的PDF,或者只是检查浏览器如何呈现URL。

0. 开始

最简单的开始使用headless模式的方法是从命令行打开Chrome。如果你已经安装了Chrome59+的版本,可以使用 --headless 标签:

chrome \
  --headless \                   # 在headless模式运行Chrome
  --disable-gpu \                # 在Windows上运行时需要--remote-debugging-port=9222 \
  https://www.chromestatus.com   # 打开URL. 默认为about:blank

注意:若在Windows中运行,则需要在命令行添加 --disable-gpu 。

chrome 命令需要指向Chrome的安装路径。(即在Chrome的安装路径下运行)

1. 命令行功能

在某些情况下,您可能不需要以编程方式编写Headless Chrome脚本。下面是一些有用的命令行标志来执行常见任务。

1.1 打印DOM --dump-dom

将 document.body.innerHTML 在stdout打印出来:

chrome --headless --disable-gpu --dump-dom https://www.chromestatus.com/

1.2 创建PDF --print-to-pdf :

chrome --headless --disable-gpu --print-to-pdf https://www.chromestatus.com/

演示:在chrome安装目录下运行 chrome --headless --disable-gpu --print-to-pdf https://www.baidu.com/

命令行运行

生成PDF文件:C:\Program Files (x86)\Google\Chrome\Application\69.0.3497.81\output.pdf

Headless Chrome入门_第1张图片
生成的pdf文件

1.3 截屏 --screenshot

chrome --headless --disable-gpu --screenshot https://www.chromestatus.com/
 # 标准屏幕大小
chrome --headless --disable-gpu --screenshot --window-size=1280,1696 https://www.chromestatus.com/
 # Nexus 5x
chrome --headless --disable-gpu --screenshot --window-size=412,732 https://www.chromestatus.com/

运行 --screenshot将会在当前运行目录下生成一个 screenshot.png 文件。若想给整个页面的截图,那么会比较复杂。来自 David Schnurr 的一篇很棒的博文介绍了这一内容。请查看 使用 headless Chrome 作为自动截屏工具。

1.4 REPL模式(read-eval-print loop) --repl

在REPL模式运行Headless,该模式允许通过命令行在浏览器中评估JS表达式:

$ chrome --headless --disable-gpu --repl --crash-dumps-dir=./tmp https://www.chromestatus.com/
[0608/112805.245285:INFO:headless_shell.cc(278)] Type a Javascript expression to evaluate or "quit" to exit. >>> location.href
{"result":{"type":"string","value":"https://www.chromestatus.com/features"}} >>> quit
$

注意:使用repl模式时需要添加 --crash-dumps-dir 命令。

2. 在没有浏览器界面情况下调试Chrome

当使用 --remote-debugging-port=9222 运行Chrome时,会启用DevTools协议的实例。该协议用于与Chrome通信并且驱动headless浏览器实例。除此之外,它还是一个类似于 Sublime, VS Code, 和Node的工具,可用于远程调试一个应用。

由于没有浏览器UI来查看页面,因此需要在另一个浏览器中导航到http:// localhost:9222以检查一切是否正常。这将看到一个可查看页面的列表,可以在其中单击并查看Headless正在呈现的内容:

Headless Chrome入门_第2张图片
DevTools远程调试界面

在这里,你可以使用熟悉的DecTools功能来查看、调试、修改页面。若以编程方式(programmatically)使用Headless,该页面的功能更强大,可以用于查看所有的DecTools协议的命令,并与浏览器进行通信。

3. 使用编程模式(Node)

3.1 Puppeteer

Puppeteer 由Chrome团队开发的Node库。它提供了控制headless Chrome的高阶API。类似于 Phantom 和 NightmareJS这样的自动测试库,但它只用于最新版本的Chrome。

除此之外,Puppeteer还可用于截屏,创建PDF,页面导航,以及获取有关这些页面的信息。如果需要快速进行浏览器的自动化测试,建议使用该库。它隐藏了DevTools协议的复杂性,并负责启动Chrome的调试实例等冗余任务。

安装:

npm i --save puppeteer

例子-打印用户代理信息:

const puppeteer = require('puppeteer');

(async() => { const browser = await puppeteer.launch();
  console.log(await browser.version()); await browser.close();
})();

例子-截屏

const puppeteer = require('puppeteer');

(async() => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.chromestatus.com', {waitUntil: 'networkidle2'}); await page.pdf({path: 'page.pdf', format: 'A4'}); await browser.close();
})();

查看 Puppeteer's 文档 学习Puppeteer的更多用法。

3.2 CRI库

相对于Puppeteer's API来说,chrome-remote-interface 是一个低阶的库,推荐使用它更接近底层地直接使用DevTools协议。

打开Chrome

chrome-remote-interface不能打开Chrome,因此需要自己打开Chrome。

在CLI部分,我们使用--headless --remote-debugging-port = 9222手动打开Chrome。但是,要实现完全自动化测试,您可能希望从应用程序中生成Chrome。

使用 child——process 的一种方式:

const execFile = require('child_process').execFile;

function launchHeadlessChrome(url, callback) { // Assuming MacOSx.
  const CHROME = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome';
  execFile(CHROME, ['--headless', '--disable-gpu', '--remote-debugging-port=9222', url], callback);
}

launchHeadlessChrome('https://www.chromestatus.com', (err, stdout, stderr) => {
  ...
});

但是如果你想要一个适用于多个平台的可移植解决方案,那么事情会变得棘手。看看Chrome的硬编码路径吧:(

使用ChromeLaucher

Lighthouse 是测试web应用质量绝佳工具。用于启动Chrome的强大的模块就是在Lighthouse中开发的,现在可以单独使用。 chrome-launcher NPM module 可以找到Chrome的安装路径,设置调试实例,打开浏览器,并且当程序运行完成时关掉它。最棒的是,由于Node,它可以跨平台工作!

默认情况下,chrome-launcher会尝试启动Chrome Canary(如果已安装),但可以更改它以手动选择要使用的Chrome。要使用它,首先从npm安装:

npm i --save chrome-launcher

例子-使用 chrome-launcher 启动Headless模式

const chromeLauncher = require('chrome-launcher'); // 可选: 设置launcher的日志记录级别以查看其输出 // 安装:: npm i --save lighthouse-logger // const log = require('lighthouse-logger'); // log.setLevel('info');

/**
 * 启动Chrome的调试实例
 * @param {boolean=} headless True (default) 启动headless模式的Chrome.
 *     False 启动Chrome的完成版本.
 * @return {Promise} */ function launchChrome(headless=true) { return chromeLauncher.launch({ // port: 9222, // Uncomment to force a specific port of your choice.
 chromeFlags: [ '--window-size=412,732', '--disable-gpu',
      headless ? '--headless' : '' ]
  });
}

launchChrome().then(chrome => {
  console.log(`Chrome debuggable on port: ${chrome.port}`);
  ... // chrome.kill();
});

运行此脚本并没有太大作用,但在任务管理器中应该可以看到Chrome实例已启动,内容为 about:blank 。但是没有浏览器界面。因为是headless模式。

要控制浏览器,我们需要DevTools协议!

检索有关页面的信息

安装:

npm i --save chrome-remote-interface

例子-打印用户代理

const CDP = require('chrome-remote-interface');

...

launchChrome().then(async chrome => { const version = await CDP.Version({port: chrome.port});
  console.log(version['User-Agent']);
});

结果类似于: HeadlessChrome/60.0.3082.0

例子-检查网站是否有应用列表

const CDP = require('chrome-remote-interface');

...

(async function() { const chrome = await launchChrome(); const protocol = await CDP({port: chrome.port}); // Extract the DevTools protocol domains we need and enable them. // See API docs: https://chromedevtools.github.io/devtools-protocol/
const {Page} = protocol; await Page.enable();

Page.navigate({url: 'https://www.chromestatus.com/'}); // Wait for window.onload before doing stuff.
Page.loadEventFired(async () => { const manifest = await Page.getAppManifest(); if (manifest.url) {
    console.log('Manifest: ' + manifest.url);
    console.log(manifest.data);
  } else {
    console.log('Site has no app manifest');
  }

  protocol.close();
  chrome.kill(); // Kill Chrome.
});

})();

例子-使用DOM API提取页面的</h3> <pre><code>const CDP = require('chrome-remote-interface'); ... (async function() { const chrome = await launchChrome(); const protocol = await CDP({port: chrome.port}); // Extract the DevTools protocol domains we need and enable them. // See API docs: https://chromedevtools.github.io/devtools-protocol/ const {Page, Runtime} = protocol; await Promise.all([Page.enable(), Runtime.enable()]); Page.navigate({url: 'https://www.chromestatus.com/'}); // Wait for window.onload before doing stuff. Page.loadEventFired(async () => { const js = "document.querySelector('title').textContent"; // Evaluate the JS expression in the page. const result = await Runtime.evaluate({expression: js}); console.log('Title of page: ' + result.result.value); protocol.close(); chrome.kill(); // Kill Chrome. }); })(); </code></pre> <h1>4. 使用Selenium,W​​ebDriver和ChromeDriver</h1> <p>现在,Selenium打开了一个完整地Chrome的实例,也就是说,换句话说,它是一种自动化解决方案,但并非完全headless。但是,Selenium可以通过一些配置来运行headless Chrome。我建议使用headless Chrome运行Selenium,若你还是想要如何自己设置的完整说明,我已经在下面的一些例子中展示了如何让你放弃。</p> <h2>使用ChromeDriver</h2> <p>ChromeDriver 2.32使用了Chrome61,并且在headless Chrome运行的更好。</p> <h3>安装:</h3> <p><code>npm i --save-dev selenium-webdriver chromedriver</code></p> <h3>例子</h3> <pre><code>const fs = require('fs'); const webdriver = require('selenium-webdriver'); const chromedriver = require('chromedriver'); const chromeCapabilities = webdriver.Capabilities.chrome(); chromeCapabilities.set('chromeOptions', {args: ['--headless']}); const driver = new webdriver.Builder() .forBrowser('chrome') .withCapabilities(chromeCapabilities) .build(); // Navigate to google.com, enter a search. driver.get('https://www.google.com/'); driver.findElement({name: 'q'}).sendKeys('webdriver'); driver.findElement({name: 'btnG'}).click(); driver.wait(webdriver.until.titleIs('webdriver - Google Search'), 1000); // Take screenshot of results page. Save to disk. driver.takeScreenshot().then(base64png => { fs.writeFileSync('screenshot.png', new Buffer(base64png, 'base64')); }); driver.quit(); </code></pre> <h2>使用WebDriverIO</h2> <p>WebDriverIO 是Selenium WebDriver之上的更高阶的API。</p> <h3>安装:</h3> <p><code>npm i --save-dev webdriverio chromedriver</code></p> <h3>例子-chromestatus.com上的CSS filter功能</h3> <pre><code>const webdriverio = require('webdriverio'); const chromedriver = require('chromedriver'); const PORT = 9515; chromedriver.start([ '--url-base=wd/hub', `--port=${PORT}`, '--verbose' ]); (async () => { const opts = { port: PORT, desiredCapabilities: { browserName: 'chrome', chromeOptions: {args: ['--headless']} } }; const browser = webdriverio.remote(opts).init(); await browser.url('https://www.chromestatus.com/features'); const title = await browser.getTitle(); console.log(`Title: ${title}`); await browser.waitForText('.num-features', 3000); let numFeatures = await browser.getText('.num-features'); console.log(`Chrome has ${numFeatures} total features`); await browser.setValue('input[type="search"]', 'CSS'); console.log('Filtering features...'); await browser.pause(1000); numFeatures = await browser.getText('.num-features'); console.log(`Chrome has ${numFeatures} CSS features`); const buffer = await browser.saveScreenshot('screenshot.png'); console.log('Saved screenshot...'); chromedriver.stop(); browser.end(); })(); </code></pre> <h1>5. 更多资源</h1> <p>以下是一些有用的资源,可帮助您入门:</p> <h3>文档:</h3> <ul> <li> DevTools Protocol Viewer - API参考文档</li> </ul> <h3>工具:</h3> <ul> <li> chrome-remote-interface - 包装DevTools协议的节点模块</li> <li> Lighthouse - 用于测试Web应用质量的自动化工具;大量使用协议</li> <li> chrome-launcher - 节点模块,用于启动Chrome,为自动化做好准备</li> </ul> <h3>演示:</h3> <ul> <li>"The Headless Web" - Paul Kinlan关于使用Headless和api.ai的博客文章</li> </ul> <h1>6. FAQ</h1> <h3>6.1 是否需要 --disable-gpu 命令?</h3> <p>仅Windows平台需要。其他平台不需要。--disable-gpu命令是一个临时解决一些错误的方案。在将来的Chrome版本中,不再需要此命令。有关更多信息,请参阅 crbug.com/737678。</p> <h3>6.2 是否需要 <em>Xvfb</em>?</h3> <p>不需要。Headless Chrome不使用窗口,因此不再需要像Xvfb这样的显示服务器。没有它,也可以愉快地运行自动化测试。</p> <p>什么是Xvfb?Xvfb是一种用于类Unix系统的内存显示服务器,它使您能够运行图形应用程序(如Chrome)而无需附加物理显示设备。许多人使用Xvfb运行早期版本的Chrome进行“headless”测试。</p> <h3>6.3 如何创建运行Headless Chrome的Docker容器?</h3> <p>看看lighthouse-ci。它有一个示例 Dockerfile ,它使用node:8-slim作为基本映像,在App Engine Flex上安装+ 运行Lighthouse 。</p> <h3>6.4 Headless Chrome与PhantomJS有什么关系?</h3> <p>Headless Chrome与PhantomJS等工具类似。两者都可用于headless环境中的自动化测试。两者之间的主要区别在于Phantom使用较旧版本的WebKit作为其渲染引擎,而Headless Chrome使用最新版本的Blink。</p> <p>目前,Phantom还提供了比DevTools 协议更高级别的API。</p> <h3>6.5 在哪里提交bugs?</h3> <p>对于Headless Chrome的bugs,请在crbug.com上提交。</p> <p>对于DevTools协议中的错误,请将它们发送到github.com/ChromeDevTools/devtools-protocol。</p> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1248652966433509376"></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">你可能感兴趣的:(Headless Chrome入门)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1881351781347291136.htm" title="StarRocks Lakehouse 快速入门——Apache Iceberg" target="_blank">StarRocks Lakehouse 快速入门——Apache Iceberg</a> <span class="text-muted"></span> <div>导读:StarRocksLakehouse快速入门旨在帮助大家快速了解湖仓相关技术,内容涵盖关键特性介绍、独特的优势、使用场景和如何与StarRocks快速构建一套解决方案。最后大家也可以通过用户真实的使用场景来了解StarRocksLakehouse的最佳实践!ApacheIceberg介绍ApacheIceberg是一种为大规模、复杂数据集设计的开源表格式,这些数据集跨越了PB级别的数据。最初</div> </li> <li><a href="/article/1881333248345305088.htm" title="Xshell常用指令(已经连接到华为鲲鹏服务器)" target="_blank">Xshell常用指令(已经连接到华为鲲鹏服务器)</a> <span class="text-muted">风染yeye</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/1.htm">华为</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>我的使用主要是通过Xshell连接到华为鲲鹏服务器,实现远程登录和管理。通过Xshell,可以直接在本机windows系统下使用华为鲲鹏服务器。此篇适用于入门阶段,只展示了如何在xshell上运行代码文件。常用指令1.help:显示命令的帮助信息。示例:输入help命令可以获取所有Xshell命令的帮助信息。2.pwd:显示当前工作目录的路径。示例:-pwd:显示当前工作目录的路径。3.cd:改变</div> </li> <li><a href="/article/1881321138026508288.htm" title="【音视频SDL2入门】创建第一个窗口" target="_blank">【音视频SDL2入门】创建第一个窗口</a> <span class="text-muted">人才程序员</span> <a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%9F%BA%E7%A1%80%E5%A4%A7%E5%90%88%E9%9B%86/1.htm">音视频基础大合集</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a><a class="tag" taget="_blank" href="/search/c%2B%2B/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/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/%E7%94%A8%E6%88%B7%E7%95%8C%E9%9D%A2/1.htm">用户界面</a><a class="tag" taget="_blank" href="/search/sdl2/1.htm">sdl2</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91%E7%BC%96%E8%A7%A3%E7%A0%81/1.htm">视频编解码</a> <div>文章目录前言创建窗口的流程需要使用的函数1.初始化SDL库2.创建SDL窗口3.获取与窗口关联的表面SDL_FillRect函数介绍4.更新窗口表面5.延迟一定时间6.销毁窗口并退出SDL库示例代码总结前言SDL2(SimpleDirectMediaLayer)是一个跨平台的开发库,旨在为多媒体应用程序(如游戏和视频播放软件)提供低级别的访问接口。SDL2提供了创建窗口、处理输入、播放音频等多种功</div> </li> <li><a href="/article/1881319877461995520.htm" title="burp suite入门使用" target="_blank">burp suite入门使用</a> <span class="text-muted">没有理想的不伤心</span> <a class="tag" taget="_blank" href="/search/%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7/1.htm">常用工具</a><a class="tag" taget="_blank" href="/search/burp/1.htm">burp</a><a class="tag" taget="_blank" href="/search/suite/1.htm">suite</a><a class="tag" taget="_blank" href="/search/web%E6%B8%97%E9%80%8F/1.htm">web渗透</a> <div>burpsuite入门使用REF:参考文章遇到的问题https协议场景访问,可能会失败:证书认证问题burpsuite配置问题REF:ERR_HTTP2_PROTOCOL_ERRORcommonerrors</div> </li> <li><a href="/article/1881312311709331456.htm" title="Kylin入门教程" target="_blank">Kylin入门教程</a> <span class="text-muted">-龙川-</span> <a class="tag" taget="_blank" href="/search/%E4%BB%8B%E7%BB%8D/1.htm">介绍</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">学习笔记</a><a class="tag" taget="_blank" href="/search/kylin/1.htm">kylin</a> <div>引言ApacheKylin是一个开源的分布式分析引擎,提供Hadoop上的多维分析(OLAP)能力,使得超大规模数据集的实时查询和分析成为可能。它通过预计算数据立方体来加速查询,使得复杂查询可以在亚秒级响应。本文将详细介绍Kylin的基本概念、安装与配置、基本操作及高级功能,帮助你全面掌握这款强大的数据分析工具。第一部分:Kylin简介1.1什么是Kylin?Kylin是由eBay开发并捐赠给Ap</div> </li> <li><a href="/article/1881292608580415488.htm" title="全面解析NVIDIA显卡:从入门级到旗舰级显卡详解" target="_blank">全面解析NVIDIA显卡:从入门级到旗舰级显卡详解</a> <span class="text-muted">花千树-010</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/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%99%BA%E8%83%BD%E7%94%B5%E8%A7%86/1.htm">智能电视</a> <div>在选择显卡时,了解不同显卡的性能和适用场景是非常重要的。无论你是预算有限的入门用户,还是追求极致性能的游戏玩家,亦或是专业的内容创作者和深度学习研究人员,NVIDIA都有适合你的显卡。本篇博文将详细列举NVIDIA显卡的各项配置,从低到高逐一整理,并给出适用的使用场景。入门级显卡NVIDIAGeForceGT1030CUDA核心数:384基础频率:1227MHz加速频率:1468MHz显存:2GB</div> </li> <li><a href="/article/1881286682561540096.htm" title="【Git】Git 完全指南:从入门到精通" target="_blank">【Git】Git 完全指南:从入门到精通</a> <span class="text-muted">LuckiBit</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><a class="tag" taget="_blank" href="/search/GitHub/1.htm">GitHub</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/1.htm">版本管理</a><a class="tag" taget="_blank" href="/search/Windows/1.htm">Windows</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/mac/1.htm">mac</a> <div>Git完全指南:从入门到精通Git是现代软件开发中最重要的版本控制工具之一,它帮助开发者高效地管理项目,支持分布式协作和版本控制。无论是个人项目还是团队开发,Git都能提供强大的功能来跟踪、管理代码变更,并保障项目的稳定性与可持续发展。本篇文章从基础命令讲起,逐步深入,帮助你全面了解并掌握Git,最终达到精通。目录Git完全指南:从入门到精通1.Git概述1.1什么是Git1.2Git与其他版本控</div> </li> <li><a href="/article/1881282774992744448.htm" title="如何使用wireshark 解密TLS-SSL报文" target="_blank">如何使用wireshark 解密TLS-SSL报文</a> <span class="text-muted">风清扬-独孤九剑</span> <a class="tag" taget="_blank" href="/search/wireshark/1.htm">wireshark</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>目录前言原理操作前言现在网站都是https或者很多站点都支持http2。这些站点为了保证数据的安全都通过TLS/SSL加密过,用wireshark并不能很好的去解析报文,我们就需要用wireshark去解密这些报文。我主要讲解下mac在chrome怎么配置的,浏览器一定要支持HTTP2。原理获取TLS握手阶段生成的密钥,也就是说通过Chrome浏览器DEBUG日志中的握手信息生成密钥,wiresh</div> </li> <li><a href="/article/1881280090252308480.htm" title="AscendC从入门到精通系列(四)使用Pybind调用AscendC算子" target="_blank">AscendC从入门到精通系列(四)使用Pybind调用AscendC算子</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">人工智能深度学习</a> <div>如果已经通过AscendC编程语言实现了算子,那该如何通过pybind进行调用呢?1Pybind调用介绍通过PyTorch框架进行模型的训练、推理时,会调用很多算子进行计算,其中的调用方式与kernel编译流程有关。对于自定义算子工程,需要使用PyTorchAscendAdapter中的OP-Plugin算子插件对功能进行扩展,让torch可以直接调用自定义算子包中的算子,详细内容可以参考PyTo</div> </li> <li><a href="/article/1881280088973045760.htm" title="AscendC从入门到精通系列(一)初步感知AscendC" target="_blank">AscendC从入门到精通系列(一)初步感知AscendC</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">人工智能深度学习</a> <div>1什么是AscendCAscendC是CANN针对算子开发场景推出的编程语言,原生支持C和C++标准规范,兼具开发效率和运行性能。基于AscendC编写的算子程序,通过编译器编译和运行时调度,运行在昇腾AI处理器上。使用AscendC,开发者可以基于昇腾AI硬件,高效的实现自定义的创新算法。算子开发学习地图:2从helloworld出发感受AscendC2.1使用AscendC写核函数包含核函数的</div> </li> <li><a href="/article/1881277057846013952.htm" title="Web三维CAD绘制一个窗户模型" target="_blank">Web三维CAD绘制一个窗户模型</a> <span class="text-muted"></span> <div>前言本文使用mxcad3d在网页中创建一个简单的三维窗户模型,mxcad3d提供了丰富的三维建模功能和便捷的API,使得创建各种三维模型变得简单方便,最终效果如下图:环境搭建和入门首先学习mxcad的基本使用方法,可通过官方的入门教程来搭建一个最基本的项目模板,依次查看教程:安装Node.js以及VSCode开发工具、创建mxcad开发项目、API文档接口使用说明。压缩包下载解压后需要在项目目录下</div> </li> <li><a href="/article/1881270157452570624.htm" title="出海工具集" target="_blank">出海工具集</a> <span class="text-muted">web前端进阶者</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>群聊分享的一个工具集合,看了几个,感觉有点子用,收藏一波,下面有GitHub的地址;吃水不忘挖井人;GitHub地址分类目录导航Web开发框架或模板Chrome插件开发前端开发后端开发数据库管理对象关系映射(ORM)样式与UI框架原型设计认证与授权支付集成邮件服务网站分析在线客服和反馈服务部署与托管网站管理域名注册文档管理协议生成图标资源字体资源图片视频素材图片视频处理工具屏幕录制短链或长链信息渠</div> </li> <li><a href="/article/1881265357784674304.htm" title="jenkins持续集成入门18 - (Pipeline Script from SCM)流水线项目 用dockerfile-maven-plugin生成docker镜像并push到harbor私有仓库" target="_blank">jenkins持续集成入门18 - (Pipeline Script from SCM)流水线项目 用dockerfile-maven-plugin生成docker镜像并push到harbor私有仓库</a> <span class="text-muted">小哇666</span> <a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA%2F%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86/1.htm">项目构建/代码管理</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/jenkins/1.htm">jenkins</a><a class="tag" taget="_blank" href="/search/harbor/1.htm">harbor</a><a class="tag" taget="_blank" href="/search/ci%2Fcd/1.htm">ci/cd</a> <div>前提或注意事项:adocker远程连接已开启idea集成docker实现远程连接,可视化操作_小哇-CSDN博客bHarbor先建立好一个项目,名称为haiwangcjenkins中建立的项目名要和idea中maven的项目名称保持一致ddockerfile-maven-plugin的权限Jenkins使用docker-maven-plugin进行编译时发现没有权限-if年少有为-博客园正式开始创</div> </li> <li><a href="/article/1881227637767073792.htm" title="如何使用python爬图片" target="_blank">如何使用python爬图片</a> <span class="text-muted">小雨帅</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、说明使用Python爬取图片(或其他类型的文件)通常是为了自动化从互联网上下载图片的过程,这样可以节省人工下载的时间和精力,尤其是在需要大量图片时,下面将介绍两种方法,方法二步骤稍微多些,但可以爬取防爬虫的网站上的图片。二、准备安装python,谷歌浏览器,下载chromedriver,注意chromedriver的版本必须兼容谷歌浏览器,否则在运行python代码时会报错,在windows操</div> </li> <li><a href="/article/1881222338997972992.htm" title="【新人系列】Python 入门(十六):正则表达式" target="_blank">【新人系列】Python 入门(十六):正则表达式</a> <span class="text-muted">Pandaconda</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E4%BA%BA%E7%B3%BB%E5%88%97/1.htm">新人系列</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</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><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%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>✍个人博客:https://blog.csdn.net/Newin2020?type=blog专栏地址:https://blog.csdn.net/newin2020/category_12801353.html专栏定位:为0基础刚入门Python的小伙伴提供详细的讲解,也欢迎大佬们一起交流~专栏简介:在这个专栏,我将带着大家从0开始入门Python的学习。在这个Python的新人系列专栏下,将会</div> </li> <li><a href="/article/1881222341611024384.htm" title="【新人系列】Python 入门(十七):类与对象" target="_blank">【新人系列】Python 入门(十七):类与对象</a> <span class="text-muted">Pandaconda</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E4%BA%BA%E7%B3%BB%E5%88%97/1.htm">新人系列</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/1.htm">面向对象</a><a class="tag" taget="_blank" href="/search/%E7%B1%BB/1.htm">类</a> <div>✍个人博客:https://blog.csdn.net/Newin2020?type=blog专栏地址:https://blog.csdn.net/newin2020/category_12801353.html专栏定位:为0基础刚入门Python的小伙伴提供详细的讲解,也欢迎大佬们一起交流~专栏简介:在这个专栏,我将带着大家从0开始入门Python的学习。在这个Python的新人系列专栏下,将会</div> </li> <li><a href="/article/1881222336938569728.htm" title="【新人系列】Python 入门(十一):控制结构" target="_blank">【新人系列】Python 入门(十一):控制结构</a> <span class="text-muted">Pandaconda</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E4%BA%BA%E7%B3%BB%E5%88%97/1.htm">新人系列</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E6%8E%A7%E5%88%B6%E7%BB%93%E6%9E%84/1.htm">控制结构</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>✍个人博客:https://blog.csdn.net/Newin2020?type=blog专栏地址:https://blog.csdn.net/newin2020/category_12801353.html专栏定位:为0基础刚入门Python的小伙伴提供详细的讲解,也欢迎大佬们一起交流~专栏简介:在这个专栏,我将带着大家从0开始入门Python的学习。在这个Python的新人系列专栏下,将会</div> </li> <li><a href="/article/1881218178797858816.htm" title="2024年Python最新Python爬虫入门教程27:爬取某电商平台数据内容并做数据可视化" target="_blank">2024年Python最新Python爬虫入门教程27:爬取某电商平台数据内容并做数据可视化</a> <span class="text-muted">2401_84584609</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/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a> <div>‘详情页’])csv_writer.writeheader()forpageinrange(1,26):print(f’正在保存第{page}页数据内容===========')url=f’http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-year-2017-0-1-{page}’headers={‘User-Agent’:‘</div> </li> <li><a href="/article/1881216532407709696.htm" title="Python单元测试之道:从入门到精通的全面指南合集" target="_blank">Python单元测试之道:从入门到精通的全面指南合集</a> <span class="text-muted">雅雅酱o</span> <a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>深入探讨Python单元测试的各个方面,包括基本概念、基础知识、实践方法、高级话题,如何在实际项目中进行单元测试,单元测试的最佳实践,以及一些有用的工具和资源。python学习资料、教程分享:一、单元测试重要性测试是软件开发中不可或缺的一部分,它能够帮助我们保证代码的质量,减少bug,提高系统的稳定性。在各种测试方法中,单元测试由于其快速、有效的特性,特别受到开发者们的喜欢。本文将全面介绍Pyth</div> </li> <li><a href="/article/1881214372399869952.htm" title="【新人系列】Python 入门(二十七):Python 库" target="_blank">【新人系列】Python 入门(二十七):Python 库</a> <span class="text-muted">Pandaconda</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E4%BA%BA%E7%B3%BB%E5%88%97/1.htm">新人系列</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/python%E5%BA%93/1.htm">python库</a><a class="tag" taget="_blank" href="/search/%E5%BA%93/1.htm">库</a> <div>✍个人博客:https://blog.csdn.net/Newin2020?type=blog专栏地址:https://blog.csdn.net/newin2020/category_12801353.html专栏定位:为0基础刚入门Python的小伙伴提供详细的讲解,也欢迎大佬们一起交流~专栏简介:在这个专栏,我将带着大家从0开始入门Python的学习。在这个Python的新人系列专栏下,将会</div> </li> <li><a href="/article/1881210590987350016.htm" title="【论文投稿】Spring Boot 开发全攻略:从入门到精通" target="_blank">【论文投稿】Spring Boot 开发全攻略:从入门到精通</a> <span class="text-muted">小周不想卷</span> <a class="tag" taget="_blank" href="/search/%E8%89%BE%E6%80%9D%E7%A7%91%E8%93%9D%E5%AD%A6%E6%9C%AF%E4%BC%9A%E8%AE%AE%E6%8A%95%E7%A8%BF/1.htm">艾思科蓝学术会议投稿</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> <div>目录一、SpringBoot简介与优势二、开发环境搭建三、创建SpringBoot项目四、项目结构剖析五、控制器开发六、服务层设计七、数据访问层构建一、SpringBoot简介与优势SpringBoot是一个基于Spring框架的快速开发框架,旨在简化Spring应用的初始搭建以及开发过程。它通过提供一系列的默认配置和约定,使得开发者能够快速地创建出可独立运行的、生产级别的Spring应用程序,极</div> </li> <li><a href="/article/1881206303423000576.htm" title="Flume 简介01 作用 核心概念 事务机制 安装 配置入门实战" target="_blank">Flume 简介01 作用 核心概念 事务机制 安装 配置入门实战</a> <span class="text-muted">湖中屋</span> <a class="tag" taget="_blank" href="/search/Flume/1.htm">Flume</a><a class="tag" taget="_blank" href="/search/flume/1.htm">flume</a> <div>Flume1.业务系统为什么会产生用户行为日志,怎么产生的用户行文日志:每一次访问的行为(访问、搜索)产生的日志记录用户行为日志的目的:1.商家会精准的给你呈现符合你的个人界面2.商家会给你个人添加用户标签,更加精准的分析埋点等2.flume用来做什么的(采集传输数据的,分布式的,可靠的)ApacheFlume是一个从可以收集例如日志,事件等数据资源,并将这些数量庞大的数据从各项数据资源中集中起来</div> </li> <li><a href="/article/1881200111636246528.htm" title="松散比较(PHP)(小迪网络安全笔记~" target="_blank">松散比较(PHP)(小迪网络安全笔记~</a> <span class="text-muted">1999er</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">网络安全学习笔记</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><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%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!附:完整笔记目录~ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!1.3松散比较(PHP)引子:本章主要介绍一些由PHP自身语言特性可能产生的脆弱性,该内容往往被应用于PHPCTF入门题中,但在PHPWeb开发时也可能被使用。====是php中的比较运算符,用于判断==左右两边的值是否相等。若</div> </li> <li><a href="/article/1881198214359609344.htm" title="04、Redis从入门到放弃 之 数据持久化RDB和AOF" target="_blank">04、Redis从入门到放弃 之 数据持久化RDB和AOF</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/bootstrap/1.htm">bootstrap</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>Redis从入门到放弃之数据持久化RDB和AOFRedis强大的功能很大部分是由于他把数据缓存在内存中,为了使Redis在重启的时候,数据不丢失,就需要已某种方式把数据持久化到磁盘中。Redis持久化的方式有俩种,RDB和AOF。RDB==>RedisDatabaseAOF====>AppendOnlyFile1、RDB①、RDB是以快照的方式对内存中的数据进行存储。即在“”制定的时间间隔内“”将</div> </li> <li><a href="/article/1881192411565191168.htm" title="JavaWeb 开发入门:从基础到应用" target="_blank">JavaWeb 开发入门:从基础到应用</a> <span class="text-muted">大梦百万秋</span> <a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%AD%A6%E7%88%86/1.htm">知识学爆</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>JavaWeb是基于Java技术构建的Web应用开发体系。得益于Java的跨平台性和强大的生态系统,JavaWeb长期以来一直是企业级开发的首选方案之一。本篇博客将从JavaWeb的基本概念、核心技术到实际项目开发,带你全面了解如何利用JavaWeb构建一个动态网站。什么是JavaWeb?JavaWeb是使用Java技术开发Web应用程序的总称,通常包括动态网页、交互式功能和后端逻辑。它支持开发以</div> </li> <li><a href="/article/1881186479162585088.htm" title="Android应用开发入门:从Android Studio环境设置到Java编程基础" target="_blank">Android应用开发入门:从Android Studio环境设置到Java编程基础</a> <span class="text-muted">Python爬虫项目</span> <a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91%E7%B2%BE%E9%80%9A%E6%95%99%E7%A8%8B/1.htm">移动开发精通教程</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/gitee/1.htm">gitee</a><a class="tag" taget="_blank" href="/search/ide/1.htm">ide</a> <div>目录介绍步骤一:设置AndroidStudio环境步骤二:了解AndroidStudio界面步骤三:学习Java编程基础变量和数据类型数组和集合控制流类和方法结论介绍Android应用开发是一个令人兴奋和有趣的领域。如果你对移动应用程序开发感兴趣,并且想要学习如何开始构建自己的Android应用,那么你来对地方了!本篇博客将带你从头开始,介绍如何设置AndroidStudio环境,学习Java编程</div> </li> <li><a href="/article/1881172093379342336.htm" title="如何使用 Python 和 Selenium WebDriver 获取 localStorage" target="_blank">如何使用 Python 和 Selenium WebDriver 获取 localStorage</a> <span class="text-muted">潮易</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</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和SeleniumWebDriver获取localStorage要使用Python和SeleniumWebDriver获取localStorage,您可以遵循以下步骤:###1.安装必要的库首先,您需要安装selenium库。可以通过pip进行安装:```bashpipinstallselenium```###2.下载WebDriver根据您的浏览器类型(如Chrome、Fir</div> </li> <li><a href="/article/1881166163153580032.htm" title="如何快速入门VCU应用层软件开发?(34篇实例讲解+软件开发测试方法+工具使用)" target="_blank">如何快速入门VCU应用层软件开发?(34篇实例讲解+软件开发测试方法+工具使用)</a> <span class="text-muted">汽车电控研习室</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">技术经验分享</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/matlab/1.htm">matlab</a><a class="tag" taget="_blank" href="/search/%E6%B1%BD%E8%BD%A6/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%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a> <div>最近,用一个多月的时间总结了VCU应用层软件开发的基本流程,架构,关键模块的控制策略及Simulink建模方法、测试方法及相关工具的使用。如何快速入门VCU应用软件开发层软件开发,通过本篇文章可以给你答案。文章标题为超链接,可直接点击进入文章阅读。目录一、VCU应用层软件开发流程及架构二、VCU应用层软件开发模块1、输入信号处理2、控制策略模块3、输出信号处理4、标定量设置5、代码生成三、VCU应</div> </li> <li><a href="/article/1881164399310336000.htm" title="技术文档的精髓:规划布局、语言表达与更新维护" target="_blank">技术文档的精髓:规划布局、语言表达与更新维护</a> <span class="text-muted">重庆钢铁侠</span> <a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>本文将从技术文档的规划布局、语言表达以及更新与维护三个方面入手,探讨如何打造一份出色的技术文档,确保信息的系统性、连贯性以及时效性。一:技术文档的规划布局1.1确定文档的整体架构技术文档的规划布局是确保信息呈现系统性和连贯性的关键。首先,需要确定文档的整体架构,这包括章节设置和逻辑顺序。一个好的架构应该能够清晰地指导读者从入门到精通。章节设置:根据文档的目的和受众,合理设置章节。例如,对于深度学习</div> </li> <li><a href="/article/1881135011214716928.htm" title="用python操作浏览器的三种方式_经验 | python 操作浏览器的三种方式" target="_blank">用python操作浏览器的三种方式_经验 | python 操作浏览器的三种方式</a> <span class="text-muted">weixin_39642619</span> <div>第一种:selenium导入浏览器驱动,用get方法打开浏览器,例如:importtimefromseleniumimportwebdriverdefmac():#browser=webdriver.Chrome()#browser=webdriver.Firefox()browser=webdriver.Ie()browser.implicitly_wait(5)browser.get("htt</div> </li> <li><a href="/article/111.htm" title="JAVA基础" target="_blank">JAVA基础</a> <span class="text-muted">灵静志远</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E8%BD%BD/1.htm">加载</a><a class="tag" taget="_blank" href="/search/Date/1.htm">Date</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%B1%A0/1.htm">字符串池</a><a class="tag" taget="_blank" href="/search/%E8%A6%86%E7%9B%96/1.htm">覆盖</a> <div>一、类的初始化顺序 1 (静态变量,静态代码块)-->(变量,初始化块)--> 构造器 同一括号里的,根据它们在程序中的顺序来决定。上面所述是同一类中。如果是继承的情况,那就在父类到子类交替初始化。 二、String 1 String a = "abc"; JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的对象,根</div> </li> <li><a href="/article/238.htm" title="keepalived实现redis主从高可用" target="_blank">keepalived实现redis主从高可用</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>方案说明 两台机器(称为A和B),以统一的VIP对外提供服务 1.正常情况下,A和B都启动,B会把A的数据同步过来(B is slave of A) 2.当A挂了后,VIP漂移到B;B的keepalived 通知redis 执行:slaveof no one,由B提供服务 3.当A起来后,VIP不切换,仍在B上面;而A的keepalived 通知redis 执行slaveof B,开始</div> </li> <li><a href="/article/365.htm" title="java文件操作大全" target="_blank">java文件操作大全</a> <span class="text-muted">0624chenhong</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>最近在博客园看到一篇比较全面的文件操作文章,转过来留着。 http://www.cnblogs.com/zhuocheng/archive/2011/12/12/2285290.html 转自http://blog.sina.com.cn/s/blog_4a9f789a0100ik3p.html 一.获得控制台用户输入的信息    &nbs</div> </li> <li><a href="/article/492.htm" title="android学习任务" target="_blank">android学习任务</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>任务 完成情况 搞清楚带箭头的pupupwindows和不带的使用 已完成 熟练使用pupupwindows和alertdialog,并搞清楚两者的区别 已完成 熟练使用android的线程handler,并敲示例代码 进行中 了解游戏2048的流程,并完成其代码工作 进行中-差几个actionbar 研究一下android的动画效果,写一个实例 已完成 复习fragem</div> </li> <li><a href="/article/619.htm" title="zoom.js" target="_blank">zoom.js</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/oom/1.htm">oom</a> <div>它的基于bootstrap 的 https://raw.github.com/twbs/bootstrap/master/js/transition.js  transition.js模块引用顺序 <link rel="stylesheet" href="style/zoom.css"> <script src=&q</div> </li> <li><a href="/article/746.htm" title="详解Oracle云操作系统Solaris 11.2" target="_blank">详解Oracle云操作系统Solaris 11.2</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/Solaris/1.htm">Solaris</a> <div>当Oracle发布Solaris 11时,它将自己的操作系统称为第一个面向云的操作系统。Oracle在发布Solaris 11.2时继续它以云为中心的基调。但是,这些说法没有告诉我们为什么Solaris是配得上云的。幸好,我们不需要等太久。Solaris11.2有4个重要的技术可以在一个有效的云实现中发挥重要作用:OpenStack、内核域、统一存档(UA)和弹性虚拟交换(EVS)。  </div> </li> <li><a href="/article/873.htm" title="spring学习——springmvc(一)" target="_blank">spring学习——springmvc(一)</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a> <div>Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)实现,能够帮助我们构建像Spring框架那样灵活和松耦合的Web应用程序。   1,跟踪Spring MVC的请求 请求的第一站是Spring的DispatcherServlet。与大多数基于Java的Web框架一样,Spring MVC所有的请求都会通过一个前端控制器Servlet。前</div> </li> <li><a href="/article/1000.htm" title="hdu4342 History repeat itself-------多校联合五" target="_blank">hdu4342 History repeat itself-------多校联合五</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E8%AE%BA/1.htm">数论</a> <div>水题就不多说什么了。 #include<iostream>#include<cstdlib>#include<stdio.h>#define ll __int64using namespace std;int main(){ int t; ll n; scanf("%d",&t); while(t--) </div> </li> <li><a href="/article/1127.htm" title="EJB和javabean的区别" target="_blank">EJB和javabean的区别</a> <span class="text-muted">asia007</span> <a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/ejb/1.htm">ejb</a> <div>EJB不是一般的JavaBean,EJB是企业级JavaBean,EJB一共分为3种,实体Bean,消息Bean,会话Bean,书写EJB是需要遵循一定的规范的,具体规范你可以参考相关的资料.另外,要运行EJB,你需要相应的EJB容器,比如Weblogic,Jboss等,而JavaBean不需要,只需要安装Tomcat就可以了   1.EJB用于服务端应用开发, 而JavaBeans</div> </li> <li><a href="/article/1254.htm" title="Struts的action和Result总结" target="_blank">Struts的action和Result总结</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a><a class="tag" taget="_blank" href="/search/Action%E9%85%8D%E7%BD%AE/1.htm">Action配置</a><a class="tag" taget="_blank" href="/search/Result%E9%85%8D%E7%BD%AE/1.htm">Result配置</a> <div>    一:Action的配置详解:      下面是一个Struts中一个空的Struts.xml的配置文件     <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC &quo</div> </li> <li><a href="/article/1381.htm" title="如何带好自已的团队" target="_blank">如何带好自已的团队</a> <span class="text-muted">bijian1013</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/%E5%9B%A2%E9%98%9F%E7%AE%A1%E7%90%86/1.htm">团队管理</a><a class="tag" taget="_blank" href="/search/%E5%9B%A2%E9%98%9F/1.htm">团队</a> <div>在网上看到博客" 怎么才能让团队成员好好干活"的评论,觉得写的比较好。 原文如下: 我做团队管理有几年了吧,我和你分享一下我认为带好团队的几点: 1.诚信         对团队内成员,无论是技术研究、交流、问题探讨,要尽可能的保持一种诚信的态度,用心去做好,你的团队会感觉得到。 2.努力提</div> </li> <li><a href="/article/1508.htm" title="Java代码混淆工具" target="_blank">Java代码混淆工具</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/ProGuard/1.htm">ProGuard</a> <div>Open Source Obfuscators ProGuard http://java-source.net/open-source/obfuscators/proguardProGuard is a free Java class file shrinker and obfuscator. It can detect and remove unused classes, fields, m</div> </li> <li><a href="/article/1635.htm" title="【Redis三】基于Redis sentinel的自动failover主从复制" target="_blank">【Redis三】基于Redis sentinel的自动failover主从复制</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>在第二篇中使用2.8.17搭建了主从复制,但是它存在Master单点问题,为了解决这个问题,Redis从2.6开始引入sentinel,用于监控和管理Redis的主从复制环境,进行自动failover,即Master挂了后,sentinel自动从从服务器选出一个Master使主从复制集群仍然可以工作,如果Master醒来再次加入集群,只能以从服务器的形式工作。   什么是Sentine</div> </li> <li><a href="/article/1762.htm" title="使用代理实现Hibernate Dao层自动事务" target="_blank">使用代理实现Hibernate Dao层自动事务</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a> <div>都说spring利用AOP实现自动事务处理机制非常好,但在只有hibernate这个框架情况下,我们开启session、管理事务就往往很麻烦。 public void save(Object obj){ Session session = this.getSession(); Transaction tran = session.beginTransaction(); try </div> </li> <li><a href="/article/1889.htm" title="maven3实战读书笔记" target="_blank">maven3实战读书笔记</a> <span class="text-muted">braveCS</span> <a class="tag" taget="_blank" href="/search/maven3/1.htm">maven3</a> <div>Maven简介 是什么? Is a software project management and comprehension tool.项目管理工具 是基于POM概念(工程对象模型) [设计重复、编码重复、文档重复、构建重复,maven最大化消除了构建的重复] [与XP:简单、交流与反馈;测试驱动开发、十分钟构建、持续集成、富有信息的工作区]     功能: </div> </li> <li><a href="/article/2016.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> public class MaxProduct { /** * 编程之美 子数组的最大乘积 * 题目: 给定一个长度为N的整数数组,只允许使用乘法,不能用除法,计算任意N-1个数的组合中乘积中最大的一组,并写出算法的时间复杂度。 * 以下程序对应书上两种方法,求得“乘积中最大的一组”的乘积——都是有溢出的可能的。 * 但按题目的意思,是要求得这个子数组,而不</div> </li> <li><a href="/article/2143.htm" title="读书笔记-2" target="_blank">读书笔记-2</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a> <div>1、反射 2、oracle年-月-日 时-分-秒 3、oracle创建有参、无参函数 4、oracle行转列 5、Struts2拦截器 6、Filter过滤器(web.xml) 1、反射 (1)检查类的结构 在java.lang.reflect包里有3个类Field,Method,Constructor分别用于描述类的域、方法和构造器。 2、oracle年月日时分秒 s</div> </li> <li><a href="/article/2270.htm" title="[求学与房地产]慎重选择IT培训学校" target="_blank">[求学与房地产]慎重选择IT培训学校</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/it/1.htm">it</a> <div>      关于培训学校的教学和教师的问题,我们就不讨论了,我主要关心的是这个问题       培训学校的教学楼和宿舍的环境和稳定性问题       我们大家都知道,房子是一个比较昂贵的东西,特别是那种能够当教室的房子... &nb</div> </li> <li><a href="/article/2397.htm" title="RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系" target="_blank">RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/rman/1.htm">rman</a><a class="tag" taget="_blank" href="/search/filesperset/1.htm">filesperset</a><a class="tag" taget="_blank" href="/search/PARALLELISM/1.htm">PARALLELISM</a> <div>RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系 转 PARALLELISM --- 我们还可以通过parallelism参数来指定同时"自动"创建多少个通道: RMAN > configure device type disk parallelism 3 ; 表示启动三个通道,可以加快备份恢复的速度。 </div> </li> <li><a href="/article/2524.htm" title="简单排序:冒泡排序" target="_blank">简单排序:冒泡排序</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">冒泡排序</a> <div> public void bubbleSort(int[] array){ for(int i=1;i<array.length;i++){ for(int k=0;k<array.length-i;k++){ if(array[k] > array[k+1]){ </div> </li> <li><a href="/article/2651.htm" title="初二上学期难记单词三" target="_blank">初二上学期难记单词三</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/sciet/1.htm">sciet</a> <div>concert 音乐会 tonight 今晚 famous 有名的;著名的 song 歌曲 thousand 千 accident 事故;灾难 careless 粗心的,大意的 break 折断;断裂;破碎 heart 心(脏) happen  偶尔发生,碰巧 tourist 旅游者;观光者 science (自然)科学 marry 结婚 subject 题目;</div> </li> <li><a href="/article/2778.htm" title="I.安装Memcahce 1. 安装依赖包libevent Memcache需要安装libevent,所以安装前可能需要执行 Shell代码 收藏代码" target="_blank">I.安装Memcahce 1. 安装依赖包libevent Memcache需要安装libevent,所以安装前可能需要执行 Shell代码 收藏代码</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make   前面3步应该没有问题,主要的问题是执行make的时候,出现了异常。 异常一: make[2]: cc: Command not found 异常原因:没有安装g</div> </li> <li><a href="/article/2905.htm" title="并发容器" target="_blank">并发容器</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91%E5%AE%B9%E5%99%A8/1.htm">并发容器</a> <div>   通过并发容器来改善同步容器的性能,同步容器将所有对容器状态的访问都串行化,来实现线程安全,这种方式严重降低并发性,当多个线程访问时,吞吐量严重降低。    并发容器ConcurrentHashMap       替代同步基于散列的Map,通过Lock控制。   &nb</div> </li> <li><a href="/article/3032.htm" title="Spring Security(12)——Remember-Me功能" target="_blank">Spring Security(12)——Remember-Me功能</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/Remember+Me/1.htm">Remember Me</a><a class="tag" taget="_blank" href="/search/%E8%AE%B0%E4%BD%8F%E6%88%91/1.htm">记住我</a> <div>Remember-Me功能   目录   1.1     概述 1.2     基于简单加密token的方法 1.3     基于持久化token的方法 1.4     Remember-Me相关接口和实现</div> </li> <li><a href="/article/3159.htm" title="位运算" target="_blank">位运算</a> <span class="text-muted">焦志广</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div> 一、位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。 例如:9&am</div> </li> <li><a href="/article/3286.htm" title="nodejs 数据库连接 mongodb mysql" target="_blank">nodejs 数据库连接 mongodb mysql</a> <span class="text-muted">liguangsong</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/node/1.htm">node</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5/1.htm">数据库连接</a> <div>1.mysql 连接    package.json中dependencies加入     "mysql":"~2.7.0"    执行 npm install      在config 下创建文件 database.js     </div> </li> <li><a href="/article/3413.htm" title="java动态编译" target="_blank">java动态编译</a> <span class="text-muted">olive6615</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/HotSpot/1.htm">HotSpot</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E7%BC%96%E8%AF%91/1.htm">动态编译</a> <div>    在HotSpot虚拟机中,有两个技术是至关重要的,即动态编译(Dynamic compilation)和Profiling。     HotSpot是如何动态编译Javad的bytecode呢?Java bytecode是以解释方式被load到虚拟机的。HotSpot里有一个运行监视器,即Profile Monitor,专门监视</div> </li> <li><a href="/article/3540.htm" title="Storm0.9.5的集群部署配置优化" target="_blank">Storm0.9.5的集群部署配置优化</a> <span class="text-muted">roadrunners</span> <a class="tag" taget="_blank" href="/search/%E4%BC%98%E5%8C%96/1.htm">优化</a><a class="tag" taget="_blank" href="/search/storm.yaml/1.htm">storm.yaml</a> <div>nimbus结点配置(storm.yaml)信息: # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional inf</div> </li> <li><a href="/article/3667.htm" title="101个MySQL 的调节和优化的提示" target="_blank">101个MySQL 的调节和优化的提示</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div> 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多。   2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读取的,它的速度很慢。   3. 使用电池供电的RAM(注:RAM即随机存储器)。   4. 使用高级的RAID(注:Redundant Arrays of Inexpensive Disks,即磁盘阵列</div> </li> <li><a href="/article/3794.htm" title="zoj 3829 Known Notation(贪心)" target="_blank">zoj 3829 Known Notation(贪心)</a> <span class="text-muted">阿尔萨斯</span> <a class="tag" taget="_blank" href="/search/ZOJ/1.htm">ZOJ</a> <div> 题目链接:zoj 3829 Known Notation 题目大意:给定一个不完整的后缀表达式,要求有2种不同操作,用尽量少的操作使得表达式完整。 解题思路:贪心,数字的个数要要保证比∗的个数多1,不够的话优先补在开头是最优的。然后遍历一遍字符串,碰到数字+1,碰到∗-1,保证数字的个数大于等1,如果不够减的话,可以和最后面的一个数字交换位置(用栈维护十分方便),因为添加和交换代价都是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>