需要做一个垂直搜索引擎,比较了nekohtml和htmlparser 的功能,尽管nekohtml在容错性、性能等方面的口碑好像比htmlparser好(htmlunit也用的是nekohtml),但感觉 nekohtml的测试用例和文档都比htmlparser都少,而且htmlparser基本上能够满足垂直搜索引擎页面处理分析的需求,因此先研究一 下htmlparser的使用,有空再研究nekohtml和mozilla html parser的使用。 html的功能还是官方说得最为清楚,
HTML Parser is a Java library used to parse HTML in either a linear or nested fashion. Primarily used for transformation or extraction, it features filters, visitors, custom tags and easy to use JavaBeans. It is a fast, robust and well tested package.
The two fundamental use-cases that are handled by the parser are extraction and transformation (the syntheses use-case, where HTML pages are created from scratch, is better handled by other tools closer to the source of data). While prior versions concentrated on data extraction from web pages, Version 1.4 of the HTMLParser has substantial improvements in the area of transforming web pages, with simplified tag creation and editing, and verbatim toHtml() method output.
研究的重点还是extraction的使用,有空再研究transformation的使用。
1、htmlparser对html页面处理的数据结构
如图所示,HtmlParser采用了经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode和Tag来描述HTML页面各元素。
Node接口定义了进行树形结构节点操作的各种典型操作方法,包括:
节点到html文本、text文本的方法 :toPlainTextString、toHtml
典型树形结构遍历的方法 :getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText
获取节点对应的树形结构结构的顶级节点Page对象方法 :getPage
获取节点起始位置的方法 :getStartPosition、getEndPosition
Visitor方法遍历节点时候方法 :accept (NodeVisitor visitor)
Filter方法 :collectInto (NodeList list, NodeFilter filter)
Object方法 :toString、clone
org.htmlparser.nodes.AbstractNode :
AbstractNode是形成HTML树形结构抽象基类,实现了Node接口。
在htmlparser中,Node分成三类:
RemarkNode :代表Html中的注释
TagNode :标签节点。
TextNode :文本节点
这三类节点都继承AbstractNode。
org.htmlparser.nodes.TagNode:
TagNode包含了对HTML处理的核心的各个类,是所有TAG的基类,其中有分为包含其他TAG的复合节点ComositeTag和不包含其他TAG的叶子节点Tag。
复合节点CompositeTag:
AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,
HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,
TableHeader,TableRow,TableTag,TextareaTag,TitleTag
叶子节点TAG:
BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,
2、htmlparser对html页面处理的算法
主要是如下几种方式
try { Parser parser = new Parser(); parser.setURL(”http://www.google.com”); parser.setEncoding(parser.getEncoding()); NodeVisitor visitor = new NodeVisitor() { public void visitTag(Tag tag) { logger.fatal(”testVisitorAll() Tag name is :” + tag.getTagName() + ” \n Class is :” + tag.getClass()); }
};
parser.visitAllNodesWith(visitor); } catch (ParserException e) { e.printStackTrace(); }
try {
NodeFilter filter = new NodeClassFilter(LinkTag.class); Parser parser = new Parser(); parser.setURL(”http://www.google.com”); parser.setEncoding(parser.getEncoding()); NodeList list = parser.extractAllNodesThatMatch(filter); for (int i = 0; i < list.size(); i++) { LinkTag node = (LinkTag) list.elementAt(i); logger.fatal(”testLinkTag() Link is :” + node.extractLink()); } } catch (Exception e) { e.printStackTrace(); }
另外htmlparser 还在org.htmlparser.beans中对一些常用的方法进行了封装,以简化操作,例如:
Parser parser = new Parser();
LinkBean linkBean = new LinkBean(); linkBean.setURL(”http://www.google.com”); URL[] urls = linkBean.getLinks();
for (int i = 0; i < urls.length; i++) { URL url = urls[i]; logger.fatal(”testLinkBean() -url is :” + url); }
3、htmlparser关键包结构说明
htmlparser其实核心代码并不多,好好研究一下其代码,弥补文档不足的问题。同时htmlparser的代码注释和单元测试用例还是很齐全的,也有助于了解htmlparser的用法。
3.1、org.htmlparser
定义了htmlparser的一些基础类。其中最为重要的是Parser类。
Parser是htmlparser的最核心的类,其构造函数提供了如下:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)
各构造函数的具体用法及含义可以查看其代码,很容易理解。
Parser常用的几个方法:
Parser parser = new Parser (”http://www.google.com”); for (NodeIterator i = parser.elements (); i.hasMoreElements (); ) processMyNodes (i.nextNode ());
parse (NodeFilter filter):通过NodeFilter方式获取
visitAllNodesWith (NodeVisitor visitor):通过Nodevisitor方式
extractAllNodesThatMatch (NodeFilter filter):通过NodeFilter方式
3.2、org.htmlparser.beans
对Visitor和Filter的方法进行了封装,定义了针对一些常用html元素操作的bean,简化对常用元素的提取操作。
包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。
3.3、org.htmlparser.nodes
定义了基础的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。
3.4、org.htmlparser.tags
定义了htmlparser的各种tag。
3.5、org.htmlparser.filters
定义了htmlparser所提供的各种filter,主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面指定类型的元素进行过滤,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter
3.6、org.htmlparser.visitors
定义了htmlparser所提供的各种visitor,主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor
3.7、org.htmlparser.parserapplications
定义了一些实用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,这几个类也可以作为htmlparser使用样例。
3.8、org.htmlparser.tests
对各种功能的单元测试用例,也可以作为htmlparser使用的样例。
4、htmlparser的使用样例
import java.net.URL;
import junit.framework.TestCase;
import org.apache.log4j.Logger; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.Tag; import org.htmlparser.beans.LinkBean; import org.htmlparser.filters.NodeClassFilter; import org.htmlparser.filters.OrFilter; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.tags.HeadTag; import org.htmlparser.tags.ImageTag; import org.htmlparser.tags.InputTag; import org.htmlparser.tags.LinkTag; import org.htmlparser.tags.OptionTag; import org.htmlparser.tags.SelectTag; import org.htmlparser.tags.TableColumn; import org.htmlparser.tags.TableRow; import org.htmlparser.tags.TableTag; import org.htmlparser.tags.TitleTag; import org.htmlparser.util.NodeIterator; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import org.htmlparser.visitors.HtmlPage; import org.htmlparser.visitors.NodeVisitor; import org.htmlparser.visitors.ObjectFindingVisitor;
public class ParserTestCase extends TestCase {
private static final Logger logger = Logger.getLogger(ParserTestCase.class);
public ParserTestCase(String name) { super(name); } /* * 测试ObjectFindVisitor的用法 */ public void testImageVisitor() { try { ImageTag imgLink; ObjectFindingVisitor visitor = new ObjectFindingVisitor( ImageTag.class); Parser parser = new Parser(); parser.setURL(”http://www.google.com”); parser.setEncoding(parser.getEncoding()); parser.visitAllNodesWith(visitor); Node[] nodes = visitor.getTags(); for (int i = 0; i < nodes.length; i++) { imgLink = (ImageTag) nodes[i]; logger.fatal(”testImageVisitor() ImageURL = ” + imgLink.getImageURL()); logger.fatal(”testImageVisitor() ImageLocation = ” + imgLink.extractImageLocn()); logger.fatal(”testImageVisitor() SRC = ” + imgLink.getAttribute(”SRC”)); } } catch (Exception e) { e.printStackTrace(); } } /* * 测试TagNameFilter用法 */ public void testNodeFilter() { try { NodeFilter filter = new TagNameFilter(”IMG”); Parser parser = new Parser(); parser.setURL(”http://www.google.com”); parser.setEncoding(parser.getEncoding()); NodeList list = parser.extractAllNodesThatMatch(filter); for (int i = 0; i < list.size(); i++) { logger.fatal(”testNodeFilter() ” + list.elementAt(i).toHtml()); } } catch (Exception e) { e.printStackTrace(); }
} /* * 测试NodeClassFilter用法 */ public void testLinkTag() { try {
NodeFilter filter = new NodeClassFilter(LinkTag.class); Parser parser = new Parser(); parser.setURL(”http://www.google.com”); parser.setEncoding(parser.getEncoding()); NodeList list = parser.extractAllNodesThatMatch(filter); for (int i = 0; i < list.size(); i++) { LinkTag node = (LinkTag) list.elementAt(i); logger.fatal(”testLinkTag() Link is :” + node.extractLink()); } } catch (Exception e) { e.printStackTrace(); }
} /* * 测试 用法 */ public void testLinkCSS() { try {
Parser parser = new Parser(); parser .setInputHTML(”
Link Test ”
+ “
”
+ “
”
+ “” + “”);
parser.setEncoding(parser.getEncoding());
NodeList nodeList = null;
for (NodeIterator e = parser.elements(); e.hasMoreNodes();) { Node node = e.nextNode(); logger .fatal(”testLinkCSS()” + node.getText() + node.getClass());
} } catch (Exception e) { e.printStackTrace(); } } /* * 测试OrFilter的用法 */ public void testOrFilter() { NodeFilter inputFilter = new NodeClassFilter(InputTag.class); NodeFilter selectFilter = new NodeClassFilter(SelectTag.class); Parser myParser; NodeList nodeList = null;
try { Parser parser = new Parser(); parser .setInputHTML(”
OrFilter Test ”
+ “
”
+ “
”
+ “”
+ “”
+ “
”
+ “
”
+ “
1 2 ”
+ “
yeeach.com ”
+ “”);
parser.setEncoding(parser.getEncoding()); OrFilter lastFilter = new OrFilter(); lastFilter.setPredicates(new NodeFilter[] { selectFilter, inputFilter }); nodeList = parser.parse(lastFilter); for (int i = 0; i <= nodeList.size(); i++) { if (nodeList.elementAt(i) instanceof InputTag) { InputTag tag = (InputTag) nodeList.elementAt(i); logger.fatal(”OrFilter tag name is :” + tag.getTagName() + ” ,tag value is:” + tag.getAttribute(”value”)); } if (nodeList.elementAt(i) instanceof SelectTag) { SelectTag tag = (SelectTag) nodeList.elementAt(i); NodeList list = tag.getChildren();
for (int j = 0; j < list.size(); j++) { OptionTag option = (OptionTag) list.elementAt(j); logger .fatal(”OrFilter Option” + option.getOptionText()); }
} }
} catch (ParserException e) { e.printStackTrace(); } } /* * 测试对
的解析
*/
public void testTable() {
Parser myParser;
NodeList nodeList = null;
myParser = Parser.createParser(” ” + “
” + “1-11 1-12 1-13 ” + “1-21 1-22 1-23 ” + “1-31 1-32 1-33
”
+ “
” + “2-11 2-12 2-13 ” + “2-21 2-22 2-23 ” + “2-31 2-32 2-33
”
+ “”, “GBK”);
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
try {
nodeList = myParser.parse(lastFilter);
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 0; j < rows.length; j++) { TableRow tr = (TableRow) rows[j]; TableColumn[] td = tr.getColumns(); for (int k = 0; k < td.length; k++) { logger.fatal(”
” + td[k].toPlainTextString()); }
}
} }
} catch (ParserException e) { e.printStackTrace(); } } /* * 测试NodeVisitor的用法,遍历所有节点 */ public void testVisitorAll() { try { Parser parser = new Parser(); parser.setURL(”http://www.google.com”); parser.setEncoding(parser.getEncoding()); NodeVisitor visitor = new NodeVisitor() { public void visitTag(Tag tag) { logger.fatal(”testVisitorAll() Tag name is :” + tag.getTagName() + ” \n Class is :” + tag.getClass()); }
};
parser.visitAllNodesWith(visitor); } catch (ParserException e) { e.printStackTrace(); } } /* * 测试对指定Tag的NodeVisitor的用法 */ public void testTagVisitor() { try {
Parser parser = new Parser( “
dddd ” + “ ” + “ ” + “” + “” + “yeeach.com ” + “”); NodeVisitor visitor = new NodeVisitor() { public void visitTag(Tag tag) { if (tag instanceof HeadTag) { logger.fatal(”visitTag() HeadTag : Tag name is :” + tag.getTagName() + ” \n Class is :” + tag.getClass() + “\n Text is :” + tag.getText()); } else if (tag instanceof TitleTag) { logger.fatal(”visitTag() TitleTag : Tag name is :” + tag.getTagName() + ” \n Class is :” + tag.getClass() + “\n Text is :” + tag.getText());
} else if (tag instanceof LinkTag) { logger.fatal(”visitTag() LinkTag : Tag name is :” + tag.getTagName() + ” \n Class is :” + tag.getClass() + “\n Text is :” + tag.getText() + ” \n getAttribute is :” + tag.getAttribute(”href”)); } else { logger.fatal(”visitTag() : Tag name is :” + tag.getTagName() + ” \n Class is :” + tag.getClass() + “\n Text is :” + tag.getText()); }
}
};
parser.visitAllNodesWith(visitor); } catch (Exception e) { e.printStackTrace(); } } /* * 测试HtmlPage的用法 */ public void testHtmlPage() { String inputHTML = “” + “
” + “Welcome to the HTMLParser website ” + “” + “” + “Welcome to HTMLParser” + “” + “1-11 1-12 1-13 ” + “1-21 1-22 1-23 ” + “1-31 1-32 1-33
” + “” + “2-11 2-12 2-13 ” + “2-21 2-22 2-23 ” + “2-31 2-32 2-33
” + “” + “”; Parser parser = new Parser(); try { parser.setInputHTML(inputHTML); parser.setEncoding(parser.getURL()); HtmlPage page = new HtmlPage(parser); parser.visitAllNodesWith(page); logger.fatal(”testHtmlPage -title is :” + page.getTitle()); NodeList list = page.getBody();
for (NodeIterator iterator = list.elements(); iterator .hasMoreNodes();) { Node node = iterator.nextNode(); logger.fatal(”testHtmlPage -node is :” + node.toHtml()); }
} catch (ParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * 测试LinkBean的用法 */ public void testLinkBean() { Parser parser = new Parser();
LinkBean linkBean = new LinkBean(); linkBean.setURL(”http://www.google.com”); URL[] urls = linkBean.getLinks();
for (int i = 0; i < urls.length; i++) { URL url = urls[i]; logger.fatal(”testLinkBean() -url is :” + url); }
}
}
你可能感兴趣的:(J2EE开发)
第19篇:python高级编程进阶:使用Flask进行Web开发
猿享天开
python从入门到精通 python 开发语言
第19篇:python高级编程进阶:使用Flask进行Web开发内容简介在第18篇文章中,我们介绍了Web开发的基础知识,并使用Flask框架构建了一个简单的Web应用。本篇文章将深入探讨Flask的高级功能,涵盖模板引擎(Jinja2)、表单处理、数据库集成以及用户认证等主题。通过系统的讲解和实战案例,您将掌握构建功能更为丰富和复杂的Web应用所需的技能。目录Flask的深入使用Flask扩展蓝
第18篇:python高级编程进阶:Web开发基础详解
猿享天开
python从入门到精通 python 开发语言
第18篇:Web开发基础内容简介本篇文章将为您介绍Web开发基础的核心概念和实用技能。您将了解Web开发的基本概念和流程,掌握HTTP协议的基础知识,学习如何使用Flask框架构建简单的Web应用,并深入理解路由与视图函数的工作原理。通过丰富的代码示例和实战案例,您将能够快速入门Web开发,搭建自己的第一个Web应用。目录Web开发概述什么是Web开发前端与后端开发Web开发的技术栈HTTP协议基
JPA与存储过程的完美结合
t0_54manong
oracle 数据库 个人开发
在现代的Java开发中,JPA(JavaPersistenceAPI)已经成为ORM(对象关系映射)的首选工具之一。它不仅简化了数据库操作,还提供了强大的功能来与数据库进行交互。今天,我们将探讨如何通过@NamedStoredProcedureQuery注解在JPA中声明和使用数据库存储过程,以实现高效的数据库操作。一、@NamedStoredProcedureQuery注解的使用@NamedSt
Avada 使用教程:从基础到进阶的全面指南
专业WP网站开发-Joyous
Wordpress php
概述在WordPress世界中,选择一个合适的主题对网站的成功至关重要。Avada是其中最受欢迎的选项之一,不仅因为其销售量,更因其功能强大、定制性强和用户友好性。无论你是初学者还是专业的网页开发者,Avada都提供了你所需的工具来构建你心中的网站。本文将详细介绍如何从基础到进阶地使用Avada,为你提供一个超过5000字的全方位指南。第一步:购买与安装购买Avada选择平台:Avada可以在Th
FluentCMS:基于 ASP.NET Core 和 Blazor 技术构建的开源CMS内容管理系统
编程乐趣
asp.net 开源 后端
推荐一个基于ASP.NETCore和Blazor技术构建的、功能完善的开源CMS内容管理系统。01项目简介FluentCMS是一个基于强大的ASP.NETCore和创新的Blazor技术构建的现代内容管理系统(CMS)。FluentCMS设计为快速、灵活且用户友好,它不仅是一个传统的基于内容的CMS,还是一个无头(Headless)CMS,使其非常适合各种应用场景。此项目还在开发中,还有部分问题,
Traceback包【持续更新】
BBluster
python python
Traceback包简介traceback是Python标准库中的一个模块,它提供了一组用于提取、格式化和打印程序执行过程中的堆栈跟踪信息的工具。当程序发生异常且未被捕获时,Python会自动生成一个堆栈跟踪,显示出错的位置和调用栈。这有助于开发者理解和调试程序中出现的问题。主要功能当程序发生异常时,traceback模块可以用来捕获和格式化相关的堆栈信息。这有助于开发者快速定位问题所在。格式化的
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
egzosn
前端 javascript 开发语言 ecmascript
在前端开发中,JavaScript异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如Promise、async/await等),开发者常常会遇到Uncaught(inpromise)error错误。这个错误是由于未正确处理Promise的拒绝(rejection)而导致的,常常出现在异步操作失败的情况下。如果不妥善处理,可能会导致应用的不稳定和用户体验的下降。本文将深入分析Uncaugh
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
egzosn
前端 javascript 开发语言 ecmascript
在前端开发中,JavaScript异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如Promise、async/await等),开发者常常会遇到Uncaught(inpromise)error错误。这个错误是由于未正确处理Promise的拒绝(rejection)而导致的,常常出现在异步操作失败的情况下。如果不妥善处理,可能会导致应用的不稳定和用户体验的下降。本文将深入分析Uncaugh
基于FPGA的DDS设计
Squirrels43
verilog fpga
文章目录目标一、DDS电路核心RTL1.设计一个DDS的核心RTL代码。2.使用Matlab生成DDS的波表ROM3.验证目标二、DDS开发板测试平台1.使用Quartus的SignalTAP观察DDS的输出波形2.导出SignalTAP的捕获数据至电脑(生成List文件)3.用UltraEdit的列操作模式编辑数据格式。(matlab变量定义)4.使用Matlab分析DDS生成的正弦信号的频谱纯
Flask --(2)Flask 框架的诞生
feiyy404
flask
Flask诞生于2010年,是Arminronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用
使用 Tokenizers 分割文本:深入了解与实践
AWsggdrg
python
在开发应用自然语言处理(NLP)模型时,一个常见的需求是将文本拆分为较小的块,通常称为“tokens”。现代语言模型对tokens的数量有限制,因此在处理长文本时,我们需要仔细计算tokens以避免超过限制。本文将介绍如何使用不同的tokenizer来分割文本,并提供实用代码示例。技术背景介绍自然语言处理中的tokenization是指将文本拆分为更小的、可管理的单元,称为tokens。使用tok
LangServe:快速部署和运行LangChain的实用指南
AWsggdrg
langchain python
LangServe:快速部署和运行LangChain的实用指南在AI应用开发领域,LangServe为开发者提供了便利的方式,将LangChain的运行单元和链路部署为RESTAPI。本文将通过技术解析和实战示例,带您深入了解LangServe的强大功能和应用场景。1.技术背景介绍LangServe是一个基于Python的库,整合了FastAPI和Pydantic技术,用于将LangChain的运
VSCode For Web 深入浅出 -- VS Code Server 设计
最近收到了一些来自社区的反馈,希望我能够对VSCodeServer的的设计思路以及内部实现进行一些解析。因此,本篇文章将会对VSCodeServer的原理、架构、使用场景等方面进行一些分析与探讨。什么是VSCodeServerVSCodeServer是一个运行在远程服务器上的VSCode实例,它可以通过浏览器访问,提供了与本地VSCode相同的编辑体验。它基于远程开发扩展所使用的服务器构建,还具备
千万年薪招揽AI大牛!罗福莉加盟小米,将如何改变其大模型战略?
前端
近年来,人工智能(AI)领域发展迅速,其中大模型技术的突破更是引领着新一轮科技浪潮。AI代码生成器作为AI技术的重要应用,也正逐渐改变着软件开发的模式。1月18日,一则重磅消息震惊业界:DeepSeek开源大模型DeepSeek-V2的关键开发者之一罗福莉将加入小米,并可能领导小米大模型团队,年薪高达千万级别。这一举动不仅体现了小米对AI大模型技术的重视,也预示着小米在大模型领域的战略布局将迎来新
Spring Security 入门
后端java
SpringSecurity是Spring框架中一个功能强大且灵活的安全模块。它为应用程序提供了强大的认证和授权功能,同时支持防止常见的安全攻击(如CSRF和会话固定攻击)。在开发Web应用程序时,理解和配置SpringSecurity是保障系统安全的关键。一、SpringSecurity的核心概念认证(Authentication)认证是指验证用户的身份,即确认用户是谁。SpringSecuri
【还没开始】每个前端开发人员都应了解的延迟数据
https://vercel.com/blog/latency-numbers-every-web-developer-s...
vite-plugin-vconsole在windows不生效的原因排查
vitevue3
背景在Vite使用vConsole,方便移动端的本地开发。官方文档见这里:https://github.com/vadxq/vite...。场景复现windows客户端"vite-plugin-vconsole":"^1.1.0""vite":"^2.7.0","vconsole":"^3.9.5",nodev12.18.3yarn1.22.15vite.config.js配置如下:import{
k8s中使用MySQL共享存储_k8s使用NFS做动态存储做mysql容器主从同步
罗-Moline
k8s中使用MySQL共享存储
k8s里面存储一直是比较难搞得,之前做的静态存储,写这篇文档记录一下动态存储创建的过程。使用动态存储的好处是开发者可以更关注自己的开发环境,不用关心后端的资源,还有就是更换存储类型不用做大的改变,只需切换一下storageclassName即可。根据这篇博客来的!谢谢博主!!!https://www.cnblogs.com/00986014w/p/9406962.html我把大致上思路分成三步:1
Vue 全局自适应大小:使用 postcss-pxtorem
前端程序猿i
vue.js postcss 前端
在现代前端开发中,响应式设计已经成为不可或缺的一部分。尤其是在移动设备的普及下,保证网页在各种屏幕尺寸下的显示效果变得尤为重要。Vue.js作为一个流行的前端框架,能够很方便地实现响应式设计。而在这方面,postcss-pxtorem是一个非常有用的工具,它可以将px单位自动转换为rem单位,从而实现更好的自适应布局。本文将介绍如何在Vue项目中使用postcss-pxtorem实现全局自适应大小
使用 Docker 部署 MySQL 服务并实现远程连接
漓°
Docker docker 容器 mysql linux bash
简介DockerDocker是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。容器更多的
可以与 FastAPI 不分伯仲的 Python 著名的 Web 框架
程序员小麦
fastapi python 前端 服务器 excel 开发语言
正如你所理解的,任何领域都不可能停止进步,不断使用相同的工具意味着不思进取。这一点在信息技术领域,尤其是网络开发行业非常明显。关于网络框架,不论是Django和Flask等传统框架还是Python的新型高级框架,一直有着新的框架不断出现,它们正在挤掉传统和成熟的技术,它们特征更好、编码更方便、更简单、更快捷。众所周知的Pythonweb框架Django该网络框架是最流行的Python网络框架之一。
大模型管理工具:Ollama
m0_37559973
大模型 Ollama 大模型管理工具
目录一、Ollama介绍二、Linux安装Ollama2.1一键安装2.2手动安装三、使用Ollama3.1配置模型下载路径3.2运行模型3.3常用命令四、模型管理4.1官方模型库4.2导入自定义模型五、RESTAPI六、WebUI一、Ollama介绍Ollama是一个基于Go语言开发的可以本地运行大模型的开源框架,同时提供RESTAPI管理和使用大模型。二、Linux安装Ollama2.1一键安
第二章 SpringBoot快速开发框架 - Mysql数据源配置
暗夜91
Spring Boot快速开发基础框架 mysql spring boot java
作者简介:作者:暗夜91个人主页:暗夜91的主页如果感觉文章写的还有点帮助,请帮忙点个关注,我会持续输出高质量技术博文。专栏文章:1、集成Swagger,生成API文档2、Mysql数据源配置3、集成Redis4、SpringSecurity+JWT实现登录权限认证5、跨域配置专栏源码:针对该专栏功能,对源码进行整理,可以直接下载运行。源码下载请移步:SpringBoot快速开发框架一、数据源配置
深入剖析C++中cin的原理、应用与进阶实践
stfun
java microsoft 开发语言
一、引言1.1研究背景与目的在C++编程领域,cin作为标准输入流对象,扮演着举足轻重的角色,是实现程序与用户交互的关键工具。它允许程序从标准输入设备(通常是键盘)读取数据,并将其存储到程序变量中,为各类应用程序的开发提供了基础支持。从简单的控制台应用到复杂的系统软件,cin的身影无处不在,例如在学生成绩管理系统中,使用cin读取学生的各科成绩;在财务管理程序里,利用cin获取用户输入的财务数据等
探索Facebook实验项目:Robyn——跨平台应用性能监控框架
周澄诗Flourishing
探索Facebook实验项目:Robyn——跨平台应用性能监控框架去发现同类优质开源项目:https://gitcode.com/在软件开发的世界里,性能监控是确保应用程序顺畅运行的关键一环。Facebook贡献了一个名为的开源项目,旨在提供一个跨平台的应用性能监控框架。本文将带你了解Robyn的核心特性、技术原理及应用场景,帮助你充分利用这个工具提升你的项目效能。项目简介Robyn是一个轻量级的
14天速成小程序开发:第九章 首页banner轮播图效果的实现
雁于飞
14天速成小程序开发 bug uni-app vue 微信小程序 学习 笔记 后端
文章目录前言一、获取数据二、渲染样式三、成果展示四、代码展示1.index.vue页面1.1template1.2script1.3style2.utils.js公共逻辑前言本文将学习调用组件和接口文档实现首页banner轮播图效果的实现一、获取数据二、渲染样式三、成果展示四、代码展示1.index.vue页面1.1template点击右上角“添加到我的小程序”,方便下次找到!0"class="i
Java 封装与继承:面向对象编程的两大支柱
来恩1003
Java 从入门到精通 java 开发语言
Java学习资料Java学习资料Java学习资料引言在Java的面向对象编程(OOP)体系里,封装和继承是极为关键的概念。它们不仅是构建复杂软件系统的基础,也为代码的设计、维护与扩展提供了强大助力。接下来,我们将深入探究这两大支柱的内涵、实现方式及其在实际开发中的价值。封装封装的定义封装是把对象的属性和操作这些属性的方法捆绑在一起,形成一个独立的单元,并尽可能隐藏对象的内部实现细节,只向外部提供必
cascading 入门 (一)
zhumin726
1cascading是什么cascading是一个架构在Hadoop上的API,用来创建复杂和容错数据处理工作流。它抽象了集群拓扑结构和配置来快速开发复杂分布式的应用,而不用考虑背后的MapReduce。Cascading目前依赖于Hadoop提供存储和执行架构,但是CascadingAPI为开发者隔离了Hadoop的技术细节,提供了不需要改变初始流程工作流定义就可以在不同的计算框架内运行的能力。
用C在安卓手机上开发
zhumin726
c语言 安卓
在安卓手机上进行C语言开发需要一些特定的工具和设置。通常,C语言用于编写安卓的底层代码,如性能关键的模块或与硬件直接交互的部分。我们可以使用AndroidNDK(NativeDevelopmentKit)来开发这些部分。以下是如何在安卓手机上使用C进行开发的详细步骤。工具和环境配置1.安装TermuxTermux是一个Android终端仿真器,可以让您在Android设备上运行Linux环境。我们
Python开发接水果小游戏
YhPythonJSCPP
【游戏开发】 【Python】 python 游戏开发 pylash
我研发的Python游戏引擎Pylash已经更新到1.4了。现在我们就来使用它完成一个极其简单的小游戏:接水果。以下是游戏截图:游戏操作说明:点击屏幕左右两边或者使用键盘方向键控制人物移动,使人物与水果接触得分,碰到非水果的物品,如碎玻璃,就会gameover。接下来是详尽的开发过程,篇幅较长,请看官耐心阅读。Pylash项目地址由于本次开发用到了pylash,大家可以先去Github上对引擎进行
HttpClient 4.3与4.3版本以下版本比较
spjich
java httpclient
网上利用java发送http请求的代码很多,一搜一大把,有的利用的是java.net.*下的HttpURLConnection,有的用httpclient,而且发送的代码也分门别类。今天我们主要来说的是利用httpclient发送请求。
httpclient又可分为
httpclient3.x
httpclient4.x到httpclient4.3以下
httpclient4.3
Essential Studio Enterprise Edition 2015 v1新功能体验
Axiba
.net
概述:Essential Studio已全线升级至2015 v1版本了!新版本为JavaScript和ASP.NET MVC添加了新的文件资源管理器控件,还有其他一些控件功能升级,精彩不容错过,让我们一起来看看吧!
syncfusion公司是世界领先的Windows开发组件提供商,该公司正式对外发布Essential Studio Enterprise Edition 2015 v1版本。新版本
[宇宙与天文]微波背景辐射值与地球温度
comsci
背景
宇宙这个庞大,无边无际的空间是否存在某种确定的,变化的温度呢?
如果宇宙微波背景辐射值是表示宇宙空间温度的参数之一,那么测量这些数值,并观测周围的恒星能量输出值,我们是否获得地球的长期气候变化的情况呢?
&nbs
lvs-server
男人50
server
#!/bin/bash
#
# LVS script for VS/DR
#
#./etc/rc.d/init.d/functions
#
VIP=10.10.6.252
RIP1=10.10.6.101
RIP2=10.10.6.13
PORT=80
case $1 in
start)
/sbin/ifconfig eth2:0 $VIP broadca
java的WebCollector爬虫框架
oloz
爬虫
WebCollector主页:
https://github.com/CrawlScript/WebCollector
下载:webcollector-版本号-bin.zip将解压后文件夹中的所有jar包添加到工程既可。
接下来看demo
package org.spider.myspider;
import cn.edu.hfut.dmic.webcollector.cra
jQuery append 与 after 的区别
小猪猪08
1、after函数
定义和用法:
after() 方法在被选元素后插入指定的内容。
语法:
$(selector).after(content)
实例:
<html>
<head>
<script type="text/javascript" src="/jquery/jquery.js"></scr
mysql知识充电
香水浓
mysql
索引
索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。
根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。
大多数存储引擎有更高的限制。MYSQL中索引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关;
MYISAM和InnoDB存储引擎
我的架构经验系列文章索引
agevs
架构
下面是一些个人架构上的总结,本来想只在公司内部进行共享的,因此内容写的口语化一点,也没什么图示,所有内容没有查任何资料是脑子里面的东西吐出来的因此可能会不准确不全,希望抛砖引玉,大家互相讨论。
要注意,我这些文章是一个总体的架构经验不针对具体的语言和平台,因此也不一定是适用所有的语言和平台的。
(内容是前几天写的,现附上索引)
前端架构 http://www.
Android so lib库远程http下载和动态注册
aijuans
andorid
一、背景
在开发Android应用程序的实现,有时候需要引入第三方so lib库,但第三方so库比较大,例如开源第三方播放组件ffmpeg库, 如果直接打包的apk包里面, 整个应用程序会大很多.经过查阅资料和实验,发现通过远程下载so文件,然后再动态注册so文件时可行的。主要需要解决下载so文件存放位置以及文件读写权限问题。
二、主要
linux中svn配置出错 conf/svnserve.conf:12: Option expected 解决方法
baalwolf
option
在客户端访问subversion版本库时出现这个错误:
svnserve.conf:12: Option expected
为什么会出现这个错误呢,就是因为subversion读取配置文件svnserve.conf时,无法识别有前置空格的配置文件,如### This file controls the configuration of the svnserve daemon, if you##
MongoDB的连接池和连接管理
BigCat2013
mongodb
在关系型数据库中,我们总是需要关闭使用的数据库连接,不然大量的创建连接会导致资源的浪费甚至于数据库宕机。这篇文章主要想解释一下mongoDB的连接池以及连接管理机制,如果正对此有疑惑的朋友可以看一下。
通常我们习惯于new 一个connection并且通常在finally语句中调用connection的close()方法将其关闭。正巧,mongoDB中当我们new一个Mongo的时候,会发现它也
AngularJS使用Socket.IO
bijian1013
JavaScript AngularJS Socket.IO
目前,web应用普遍被要求是实时web应用,即服务端的数据更新之后,应用能立即更新。以前使用的技术(例如polling)存在一些局限性,而且有时我们需要在客户端打开一个socket,然后进行通信。
Socket.IO(http://socket.io/)是一个非常优秀的库,它可以帮你实
[Maven学习笔记四]Maven依赖特性
bit1129
maven
三个模块
为了说明问题,以用户登陆小web应用为例。通常一个web应用分为三个模块,模型和数据持久化层user-core, 业务逻辑层user-service以及web展现层user-web,
user-service依赖于user-core
user-web依赖于user-core和user-service
依赖作用范围
Maven的dependency定义
【Akka一】Akka入门
bit1129
akka
什么是Akka
Message-Driven Runtime is the Foundation to Reactive Applications
In Akka, your business logic is driven through message-based communication patterns that are independent of physical locatio
zabbix_api之perl语言写法
ronin47
zabbix_api之perl
zabbix_api网上比较多的写法是python或curl。上次我用java--http://bossr.iteye.com/blog/2195679,这次用perl。for example: #!/usr/bin/perl
use 5.010 ;
use strict ;
use warnings ;
use JSON :: RPC :: Client ;
use
比优衣库跟牛掰的视频流出了,兄弟连Linux运维工程师课堂实录,更加刺激,更加实在!
brotherlamp
linux运维工程师 linux运维工程师教程 linux运维工程师视频 linux运维工程师资料 linux运维工程师自学
比优衣库跟牛掰的视频流出了,兄弟连Linux运维工程师课堂实录,更加刺激,更加实在!
-----------------------------------------------------
兄弟连Linux运维工程师课堂实录-计算机基础-1-课程体系介绍1
链接:http://pan.baidu.com/s/1i3GQtGL 密码:bl65
兄弟连Lin
bitmap求哈密顿距离-给定N(1<=N<=100000)个五维的点A(x1,x2,x3,x4,x5),求两个点X(x1,x2,x3,x4,x5)和Y(
bylijinnan
java
import java.util.Random;
/**
* 题目:
* 给定N(1<=N<=100000)个五维的点A(x1,x2,x3,x4,x5),求两个点X(x1,x2,x3,x4,x5)和Y(y1,y2,y3,y4,y5),
* 使得他们的哈密顿距离(d=|x1-y1| + |x2-y2| + |x3-y3| + |x4-y4| + |x5-y5|)最大
map的三种遍历方法
chicony
map
package com.test;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestMap {
public static v
Linux安装mysql的一些坑
chenchao051
linux
1、mysql不建议在root用户下运行
2、出现服务启动不了,111错误,注意要用chown来赋予权限, 我在root用户下装的mysql,我就把usr/share/mysql/mysql.server复制到/etc/init.d/mysqld, (同时把my-huge.cnf复制/etc/my.cnf)
chown -R cc /etc/init.d/mysql
Sublime Text 3 配置
daizj
配置 Sublime Text
Sublime Text 3 配置解释(默认){// 设置主题文件“color_scheme”: “Packages/Color Scheme – Default/Monokai.tmTheme”,// 设置字体和大小“font_face”: “Consolas”,“font_size”: 12,// 字体选项:no_bold不显示粗体字,no_italic不显示斜体字,no_antialias和
MySQL server has gone away 问题的解决方法
dcj3sjt126com
SQL Server
MySQL server has gone away 问题解决方法,需要的朋友可以参考下。
应用程序(比如PHP)长时间的执行批量的MYSQL语句。执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理。都容易引起MySQL server has gone away。 今天遇到类似的情景,MySQL只是冷冷的说:MySQL server h
javascript/dom:固定居中效果
dcj3sjt126com
JavaScript
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&
使用 Spring 2.5 注释驱动的 IoC 功能
e200702084
spring bean 配置管理 IOC Office
使用 Spring 2.5 注释驱动的 IoC 功能
developerWorks
文档选项
将打印机的版面设置成横向打印模式
打印本页
将此页作为电子邮件发送
将此页作为电子邮件发送
级别: 初级
陈 雄华 (
[email protected] ), 技术总监, 宝宝淘网络科技有限公司
2008 年 2 月 28 日
&nb
MongoDB常用操作命令
geeksun
mongodb
1. 基本操作
db.AddUser(username,password) 添加用户
db.auth(usrename,password) 设置数据库连接验证
db.cloneDataBase(fromhost)
php写守护进程(Daemon)
hongtoushizi
PHP
转载自: http://blog.csdn.net/tengzhaorong/article/details/9764655
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。php也可以实现守护进程的功能。
1、基本概念
&nbs
spring整合mybatis,关于注入Dao对象出错问题
jonsvien
DAO spring bean mybatis prototype
今天在公司测试功能时发现一问题:
先进行代码说明:
1,controller配置了Scope="prototype"(表明每一次请求都是原子型)
@resource/@autowired service对象都可以(两种注解都可以)。
2,service 配置了Scope="prototype"(表明每一次请求都是原子型)
对象关系行为模式之标识映射
home198979
PHP 架构 企业应用 对象关系 标识映射
HELLO!架构
一、概念
identity Map:通过在映射中保存每个已经加载的对象,确保每个对象只加载一次,当要访问对象的时候,通过映射来查找它们。其实在数据源架构模式之数据映射器代码中有提及到标识映射,Mapper类的getFromMap方法就是实现标识映射的实现。
二、为什么要使用标识映射?
在数据源架构模式之数据映射器中
//c
Linux下hosts文件详解
pda158
linux
1、主机名: 无论在局域网还是INTERNET上,每台主机都有一个IP地址,是为了区分此台主机和彼台主机,也就是说IP地址就是主机的门牌号。 公网:IP地址不方便记忆,所以又有了域名。域名只是在公网(INtERNET)中存在,每个域名都对应一个IP地址,但一个IP地址可有对应多个域名。 局域网:每台机器都有一个主机名,用于主机与主机之间的便于区分,就可以为每台机器设置主机
nginx配置文件粗解
spjich
java nginx
#运行用户#user nobody;#启动进程,通常设置成和cpu的数量相等worker_processes 2;#全局错误日志及PID文件#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log inf
数学函数
w54653520
java
public
class
S {
// 传入两个整数,进行比较,返回两个数中的最大值的方法。
public
int
get(
int
num1,
int
nu