Log Parser 2.2 如何运作
发布日期: 2005 年04 月27 日
作者: Gabriele Giuseppini (Microsoft Corporation 的软件开发测试工程师)
审稿人 Jeffrey A. Johnson (Microsoft Corporation 的软件开发测试工程师)
本页内容
简介
Log Parser 如何运作?
搜索数据
将日志导出到 SQL 数据库
创建报表
总结
更多信息
简介
近几年,我有许多次被问到“Log Parser 有何用处?” 这一问题。每次,我都感到很难找到适当的语言来描述这个工具。每当我找到了一句话来进行描述的时侯,随后都会发现这句话遗漏了一些重要的内容,无法真正表达出该工具的灵活性。当然,这可能是由于开发人员的偏执造成的,不过我对自己的回答,从来没有感到满意过。
我不会告诉您,Log Parser“ 能做” 什么。您 能用它来做什么,才是关键。我有很多次都对 Log Parser 的一些特殊应用感到很吃惊,我原以为它们是不可能实现的。我将告诉您它是 如何 运作的,希望这能让您懂得能用它来做什么,而且我会向您介绍该工具的三种最常见的应用方案。我敢肯定,您也会对 Log Parser 的新用途感到吃惊的。
历史点滴
在我们介绍 Log Parser 的内部原理之前,您可能想了解一下该工具的历史背景。2.0 版是 Microsoft 对外发布的第一个版本。Log Parser 1.0 是 Microsoft 的内部测试工具,几年前由本人开发而成,用于实现 IIS 日志记录功能的自动化测试。由于这个工具吸引了许多内部用户,因此本人于 2001 年 11 月推出了 2.0 版,并在 Internet 上提供了免费下载。
不久后,2.1 版随 IIS 6.0 资源工具包一同发布。该工具包包含有对 SQL 引擎功能的重要更新。
最后, 2.2 版 (目前的版本)于 2005 年 1 月推出。该版本包含了大量输入和输出格式,以及针对 SQL 引擎核心的其它一些重要更新。
返回页首
Log Parser 如何运作?
Log Parser 使用户可以根据需要混合和匹配 输入格式 和 输出格式 ,来创建数据处理管道。该工具使用以一种 SQL 语言编写的查询,在上述两个组件间创建管道。
输入格式
输入格式组件能够从各种源,读取并返回信息。输入格式提供的信息类似于数据库表,其中的记录由许多字段组成,而每个字段带有的值属于下列五种可能的数据类型之一:INTEGER 、STRING 、TIMESTAMP 、REAL 和 NULL 。
Log Parser 2.2 提供的输入格式包括:
•
分析 IIS 生成的日志文件并返回日志中的条目的输入格式
•
分析通用文本日志文件(按 CSV 、TSV 、NCSA 、W3C 和 XML 标准进行格式化)并返回日志所含字段的输入格式
•
一个返回来自 Windows 事件日志的事件的输入格式
•
返回 Active Directory 对象、文件和目录以及注册表项上的信息的输入格式
•
一个分析 NetMon 捕获文件并返回 TCP/IP 数据包和连接上的信息的输入格式
假如没有一个可用的输入格式满足我们的需求,Log Parser 2.2 还允许您编写自定义的 输入格式插件 。这些都是简单的 COM 对象,可以用任何编程语言(包括 C# 和脚本语言)来编写。您所要做的就是确定要让插件返回何种信息,只要实现了该插件,就可以像“ 标准” 输入格式那样使用。
输出格式
输出格式的作用与输入格式正好相反:使用 记录,并用记录中的字段执行一些有用的功能。Log Parser 2.2 提供的输出格式能够:
•
将记录保存到文本文件(按 CSV 、TSV 、W3C 和 XML 标准格式化)
•
将记录保存到文本文件(根据特定于用户的通用模板格式化)
•
将记录显示到控制台或 GUI 窗口中
•
将记录上载到 SQL 数据库的表中
•
按 Syslog 标准格式化记录,并将记录分配给 Syslog 服务器、文本文件或用户
•
创建 Excel 样式的图表,以图形格式呈现记录的数值数据
同样,如果没有一个可用的输出格式满足您的需求,您还可以通过编程方式,利用 Log Parser COM 对象,来使用记录。
核心 SQL 引擎
在输入和输出格式间有一个数据处理引擎,能够通过一种 SQL 语言执行查询。Log Parser 查询实际上是一种用于粘连输入格式和输出格式的一种“ 胶水” ,指定如何在输入格式提供的数据到达输出格式之前,对其进行转换。
这种“ 胶水” 最简单的实例就是“SELECT *” 查询。该查询用于指示应该将来自输入格式的记录,按原样传输给输出格式。通常,在 转换 文件格式时,使用这个简单的查询:比如,选择一个能够分析源文件中的数据的输入格式和一个按目标格式将记录写入文件的输出格式,并使用“SELECT *” 传输未经处理的记录。
不过,SQL 语言设计用于执行较简单的“SELECT *” 更重大的任务。您可以使用 Log Parser ,对来自输入格式的数据进行筛选、排序和聚合,将您的计算结果发送到可显示和/ 或存储您所提取的信息的输出格式。
命令行与可编脚本的 COM 对象
您可以通过两种不同的方法使用 Log Parser :从命令行使用“LogParser.exe” 可执行文件;从应用程序使用“LogParser.dll” 库导出的 Log Parser COM 对象。具体要选择何种方法,取决于您要通过 Log Parser 来执行的任务。
在下面所介绍的几种应用方案中,我将使用命令行可执行程序,但是请记住,也可以使用 Log Parser COM 对象,通过脚本来实现这些方案。很灵活,不是吗?
返回页首
搜索数据
Log Parser 最常见的应用之一是:在一组特定的数据中,搜索特定的信息。想象一下您正在管理一个 IIS 网站,并且被告知,有些用户发现一些未指定的页需要很长的执行时间。
您可能想查明的第一件事就是:究竟是哪些页需要如此长的执行时间。需要通过记事本打开 IIS 日志文件,查看数百万行日志条目吗?我可不这么认为。 假如您将 IIS 日志存储在 SQL 数据库中,您可能想运行一个查询,来找出运行时间超过 10 秒钟的页—— 如果您真的这么做了,那么可能就不需要 Log Parser—— 至少对于这个问题是这样。要是您没有把日志保存在 SQL 数据库中,又该怎么办呢?在这种情况下,您可以使用 Log Parser 分析 IIS 日志文件,查明哪些页所需的执行时间超过了 10 秒钟,并将结果显示在控制台窗口中。
具体方法如下。假定 IIS Web 服务器以 W3C 扩展的日志格式记录日志,而您使用 IISW3C 输入格式,分析 IIS 日志文件。
在运行任何查询之前,您需要这个输入格式导出了哪些字段。若要确定这一点,请转到命令行,确认 LogParser.exe 在路径中,并执行该命令:
C:/>logparser –h –i:IISW3C
这个命令提供了有关 IISW3C 输入格式的简明的帮助,其中包含一个列有 IISW3C 输入格式导出的所有字段的列表:
LogFilename (S) LogRow (I) date (T) time (T) c-ip (S) cs-username (S) s-sitename (S) s-computername (S) s-ip (S) s-port (I) cs-method (S) cs-uri-stem (S) cs-uri-query (S) sc-status (I) sc-substatus (I) sc-win32-status (I) sc-bytes (I) cs-bytes (I) time-taken (I) cs-version (S) cs-host (S) cs(User-Agent) (S) cs(Cookie) (S) cs(Referer) (S) s-event (S) s-process-type (S) s-user-time (R) s-kernel-time (R) s-page-faults (I) s-total-procs (I) s-active-procs (I) s-stopped-procs (I)
根据上述输出,并借助 IIS 日志记录文档 ,您就可以知道所要的是所有“time-taken” 字段大于 10,000 (“time-taken” 字段用于测量执行页所需的 毫秒 数)的日志条目的“cs-uri-stem” 字段。 that the page takes to execute). 圆括号中的字母代表字段的 类型 。“cs-uri-stem” 字段属于 STRING 类型,而“time-taken” 字段则属于 INTEGER 类型。
然后,定位到保存 IIS 日志文件的文件夹,并执行此命令:
C:/Logs>logparser "SELECT cs-uri-stem FROM ex*.log WHERE time-taken > 10000" –i:IISW3C
根据日志文件的大小,您可能需要等待几秒钟的时间,该命令才会开始输出结果。输出示例如下:
cs-uri-stem ------------------- /home/login.asp /home/login.asp /home/login.asp /home/login.asp /images/button.gif /home/login.asp /home/login.asp /home/login.asp /home/login.asp /home/login.asp Press a key...
首先,请注意,我们使用了“-i:IISW3C” 来指定输入格式。这个参数告诉 Log Parser ,我们要让 IISW3C 输入格式,为我们生成数据。
其次,请注意,我们并未指定任何输出格式;在这种情况下,Log Parser 会自动选择“NAT” 输出格式,后者将在控制台窗口中,显示查询记录。实际上,这个输出格式在显示完十个记录后,就会暂停。它在等您按一下键盘上的任意键,随后将再次显示十个记录。
最后,请注意,我们的 SQL 查询的 FROM 子句指定了我们要让输入格式分析的数据的实际的 源 。对于 IISW3C 输入格式,我们可以指定任意数量的本地或远程文件(甚至包含通配符)。您可以在 FROM 子句中,指定更多的参数,但我不会在这里谈论这些选项—— 您可以在 Log Parser 说明文档的“ 输入格式” 下,找到这些参数。
现在,回到我们所给的例子上,您可以从结果中看到,多数情况下,“login.asp” 页的执行时间较长。不过,您也可能看到,其它一些页的加载时间,有时也会超过十秒钟,所以您还可能想找出每个不同的页出现过多少次执行时间超过十秒钟的情况。在输出中,出现次数较少的页,可能只是日志中的假“ 噪声” 。
那么,继续运行以下命令:
C:/Logs>logparser "SELECT TOP 10 cs-uri-stem, COUNT(*) FROM ex*.log WHERE time-taken > 10000 GROUP BY cs-uri-stem ORDER BY COUNT(*) DESC" –i:IISW3C
具体输出可能如下所示:
cs-uri-stem COUNT(ALL *) ------------------------ ------------ /home/login.asp 371 /images/lglogo.gif 2 /images/button.gif 1 /news/today.htm 1
这将命令 Log Parser 执行以下操作:
1.
查找所有页执行时间超过十秒钟的日志条目
2.
对于结果中每个不同的 页 URL ,计算页 URL 在结果中出现的次数—— 换句话说,某个页出现过多少次执行时间超过十秒钟的情况
3.
按照从大到小的顺序,对所算出的出现次数的结果进行排序,并且仅显示前十个结果
根据上方的输出,您可以做出这样的结论:“login.asp” 页频繁出现执行时间超过十秒钟的情况;结果中的其它页只是一些假条目,不能表明存在任何具体的问题。
返回页首
将日志导出到 SQL 数据库
对于许多用户,Log Parser 所实现的查询功能并不能满足他们的需求。譬如,管理流量繁重的网站的公司通常需要将网站日志保存在中央数据库中,从而可以在其中运行任意数量的查询,并在多台 Web 服务器间关联数据。Windows 事件日志及其它日志文件也可能存在这样的情况。
Log Parser 也可通过提供一个可用于将查询结果上载到数据库表的“SQL” 输出格式,来应对上述情况。
一般而言,从日志文件到 SQL 表的简单“SELECT *” 查询就可能解决问题,但是大多数时候,日志包含的一些条目,并不值得永久保存在数据包中。譬如,您可能想排除对图像文件的请求;也可能存在对不存在的页的请求。
以下命令可以做到这一点:
C:/Logs>logparser "SELECT * INTO LogsTable FROM ex*.log WHERE TO_LOWERCASE (EXTRACT_EXTENSION(cs-uri-stem)) NOT IN ('gif';'jpg';'png') AND sc-status <> 404" –i:IISW3C –o:SQL –database:LogsDatabase
这个命令要求 Log Parser 筛选出以“.gif” 、“.jpg” 和“.png” 结尾的页的条目(URL 不分大小写)。该命令还将排除 HTTP 错误代码“404” (即“page not found” )产生的请求。
所有其它请求都将传递给 SQL 输出格式,后者将把记录保存到 INTO 子句所指定的表中。另外,这个输出格式还接受“database” 参数(可用于指定目标数据库的名称)以及其它许多参数(可用于指定到 SQL 数据库连接的其它属性)。
若要实现上述操作,您可以将上面的命令放在一个批处理文件中,并使用 SCHTASKS.EXE 工具,设定该批处理文件每小时运行一次—— 好了!—— 您就得到了一个自动的机制,可定期将日志文件中的条目,上载到 SQL 数据库。
请注意,每次执行上述命令时,Log Parser 都会反复检查 所有 日志条目,并将所有这些条目多次上载到数据库。我们真正需要的是一个“ 仅分析尚未分析过的日志条目” 的机制。
Log Parser 2.2 的一个新功能正好可以满足这一要求:“ 增量分析” 功能,也称为“ 检查点 (checkpointing)” 。
大多数 Log Parser 输入格式支持一个名为“iCheckpoint” 的参数。该参数可告诉输入格式将所分析的所有文件的当前状态,都保存在一个专门的数据文件(“ 检查点 (checkpoint)” 文件)中。当您使用上一次分析期间生成的检查点文件执行查询时,输入格式将只分析输入文件中那些尚未分析过的部分—— 即 新的 条目。
所以,只需指定通过“iCheckpoint” 参数,指定一个检查点文件的名称,具体如下:
C:/Logs>logparser "SELECT * INTO LogsTable FROM ex*.log WHERE TO_LOWERCASE (EXTRACT_EXTENSION(cs-uri-stem)) NOT IN ('gif';'jpg';'png') AND sc-status <> 404" –i:IISW3C –o:SQL –database:LogsDatabase –iCheckpoint:MyCheckpoint.lpc
在您第一次执行该命令时,并不存在“MyCheckpoint.lpc” 文件,而且 IISW3C 输入格式分析了所有日志文件中的所有条目,并对结果数据进行筛选,最后再上载到数据库。在分析了所有日志后,IISW3C 输入格式会将每个日志文件的当前大小保存到“MyCheckpoint.lpc” 文件。
当您稍后运行相同的命令时,IISW3C 输入格式将从上次分析结束的地方,开始加载检查点文件,并分析日志,从而仅处理、筛选和上载新的日志条目。完成后,将针对日志文件的新大小更新检查点文件,随后这个过程将再次循环。
假如认真理解了本文开头处的设计说明,那么您可能已经知道:只需更改输入格式,您就重复使用该命令,将 Log Parser 输入格式支持的 任何 日志上载到数据库。想要上载事件日志条目吗?只需使用 EVT 输入格式,具体如下:
C:/Logs>logparser "SELECT * INTO EventLogsTable FROM System" –i:EVT –o:SQL – database:LogsDatabase –iCheckpoint:MyCheckpoint.lpc
返回页首
创建报表
至此,您应该已经知道:通过选择正确的输入格式并编写正确的查询,就可以从日志文件、系统或 Log Parser 支持的任何对象,获得所需的任何信息。
不过,我们只看到有关命令将信息返回到控制台窗口,或者将记录上载到 SQL 数据库。假如您正在使用 Log Parser ,为您的管理团队生成报表,那么您可能需要某种比 SQL 表更人性化的东西,不是吗?
生成 HTML 页
在这个例子中,假设我们要生成一个报表,使之包含一台特定的远程计算机(将在该计算机的安全事件日志中检索)上的所有登录信息:
C:/>logparser "SELECT ComputerName, TimeGenerated AS LogonTime, STRCAT(STRCAT(EXTRACT_TOKEN (Strings, 1, '|'), '//'), EXTRACT_TOKEN(Strings, 0, '|')) AS Username FROM //SERVER01 /Security WHERE EventID IN (552; 528) AND EventCategoryName = 'Logon/Logoff'" -i:EVT
不要被该查询吓倒—— 其表面上的复杂性大多是因为我们为了从事件数据中提取完整的 / 字符串,而执行的一些字符串操作造成的。
若使用 NAT 输出格式,具体的输出结果如下所示:
ComputerName LogonTime Username ------------ ------------------- ---------------------------- SERVER01 2004-06-24 09:47:12 NT AUTHORITY/NETWORK SERVICE SERVER01 2004-06-24 09:48:05 SERVERDC/Administrator SERVER01 2004-06-24 09:48:05 NT AUTHORITY/NETWORK SERVICE SERVER01 2004-06-24 10:00:59 NT AUTHORITY/NETWORK SERVICE SERVER01 2004-06-24 10:01:00 NT AUTHORITY/LOCAL SERVICE SERVER01 2004-06-24 10:01:06 SERVER01/Gabriele SERVER01 2004-06-24 10:01:15 NT AUTHORITY/LOCAL SERVICE SERVER01 2004-06-24 10:01:18 SERVERDC/Monica SERVER01 2004-06-24 10:01:18 NT AUTHORITY/LOCAL SERVICE SERVER01 2004-06-24 10:01:24 NT AUTHORITY/LOCAL SERVICE
为了将该输出格式化为 HTML 格式,我们将使用 TPL 输出格式。该输出格式把一个参数作为说明如何格式化输出的文本文件(“ 模板” 文件)。这里,我们将编写该模板文件,将输出转化为 HTML 表,具体如下:
Logon/Logoff Report Logon/Logoff Report %FIELDNAME_1% %FIELDNAME_2% %FIELDNAME_3%
%FIELD_1% %FIELD_2% %FIELD_3%
我不在这里深入探讨该模板文件的细节—— 其格式在 Log Parser 的联机文档中有非常详细的说明。请注意,这个模板文件分为三节(标题、正文和页脚),每一节都使用了特殊的“% 变量%” (在运行时,由来自查询结果的值进行替换)。
现在,我们就可以通过上述命令,使用 TPL 输出格式,生成报表了:
C:/>logparser "SELECT ComputerName, TimeGenerated AS LogonTime, STRCAT(STRCAT(EXTRACT_TOKEN (Strings, 1, '|'), '//'), EXTRACT_TOKEN(Strings, 0, '|')) AS Username INTO Report.html FROM //SERVER01/Security WHERE EventID IN (552; 528) AND EventCategoryName = 'Logon/Logoff'" - i:EVT –o:TPL –tpl:MyTemplate.txt
该命令将生成一个“Report.html” 文件,并在浏览器中打开,具体如“ 图 1” 所示。
图 1 :使用 TPL 输出格式生成的报表
生成图表
在最后一个例子中,我将向您展示如何在不使用 Excel 的情况下,直接从查询结果生成图表。
以下命令可计算出 IIS 日志文件每小时的命中总数,具体方法是:使用 CHART 输出格式,创建一个包含图表的 JPG 图像:
C:/>logparser "SELECT TO_STRING(time, 'HH') AS Hour, COUNT(*) AS Hits INTO MyChart.jpg FROM ex*.log GROUP BY Hour ORDER BY Hour ASC" -i:IISW3C -o:CHART -chartType:ColumnClustered - chartTitle:"Hourly Hits" -groupSize:420x280
具体输出如“ 图 2” 所示。
图 2 :显示每小时命中数的图表输出
返回页首
总结
我们已经看到 Log Parser 体系结构可实现大量应用方案,而这都是通过 Log Parser 灵活的“ 数据处理管道” 实现的。我向您介绍了可以使用 Log Parser 搜索数据,将日志上载到 SQL 数据库,并生成报表,而这只是该工具常规应用方案的三个例子。
我在前面说过,很难用一句话来概括 Log Parser 的用户,我可不是在骗你—— 不是吗?
返回页首
更多信息
请参考下列资源:
•
http://www.logparser.com : 该站点(由 Mike Gunderloy 所有并维护)称为“ 非官方的 Log Parser 支持站点” ,提供了一个公共论坛,供用户进行答疑,交流使用技巧,以及汇报问题。此站点还提供了一个知识库来解答一些常见问题,并列出了网上其他有关 Log Parser 的文章的大量链接。
•
《Microsoft Log Parser 工具包》 一书包含本人以及其它众多 Log Parser 用户所提供的信息和脚本。该书介绍了有关此工具的使用技巧和窍门,可帮助用户充分挖掘 Log Parser 的潜能。
•
脚本的故事 : 本文摘自 TechNet 的 脚本专家 专栏,介绍了如何通过编程方式使用 Log Parser 可编脚本的 COM 对象,如何在脚本中选择输入和输出格式,如何设置属性,以及如何使用 Log Parser 查询生成的记录。
有关所有“ 网络专家” 专栏文章的列表和其它信息,请 单击此处 。
你可能感兴趣的:(网路技术,microsoft,数据库,sql,iis,server,service)
MySQL 中的 SQL 执行流程(5.7 之前的版本)
JiaHao汤
MySQL mysql sql 数据库 后端
文章目录第一步:查询缓存判断是否被命中第二步:解析器进行语法及语义分析第三步:优化器确认SQL执行方式第四步:执行器执行SQL当执行一条查询SQL时,MySQL5.7之前的版本的SQL执行流程可以用下图进行概括:以下对上图中的每一步进行分析。第一步:查询缓存判断是否被命中SQL执行的第一步是MySQL服务端从查询缓存中检查当前需要执行的SQL能否命中查询缓存。MySQL查询缓存的本质是将SQL及对
Pulsar 学习目录
编码的三叔
pulsar java kafka 大数据 python
Pulsar诞生于2012年,最初的目的是为在Yahoo内部,取代其他消息系统,构建统一逻辑大集群的消息平台。当时的其他消息系统(包括Kafka),都不能满足Yahoo的需求,比如大集群多租户、稳定可靠的IO服务质量、百万级Topic、跨地域复制等,因此Pulsar应运而生。Pulsar项目当时在Yahoo内部被叫做CMS(CloudMessageService),从名字可以看出Pulsar诞生时
DeepSeek在地铁应急响应与处理中的具体实现方案,包括技术架构、功能实现和代码示例:
人工智能专属驿站
架构 计算机视觉
以下是关于DeepSeek在地铁应急响应与处理中的具体实现方案,包括技术架构、功能实现和代码示例:1.事件检测与预警技术实现:视频监控与传感器数据融合:利用地铁站内的视频监控系统和传感器(如烟雾传感器、压力传感器)实时采集数据。通过深度学习算法(如目标检测和行为识别)对视频流进行分析,结合传感器数据,快速识别突发事件。自动警报触发:一旦检测到异常事件(如火灾、拥挤踩踏),系统立即通过预设的警报机制
CIDR转IP段:原理&Java实现
伏羲栈
Java tcp/ip java 网络协议
博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分
Pulsar官方文档翻译-概念和架构-基于地理位置复制(Geo Replication)
爱码叔
Pulsar官方文档翻译 Pulsar geo replication 概念 架构
博主:爱码叔个人博客站点:[icodebook](https://icodebook.com/)公众号:爱码叔漫画软件设计(搜:爱码叔)专注于软件设计与架构、技术管理。擅长用通俗易懂的语言讲解技术。对技术管理工作有自己的一定见解。文章会第一时间首发在个站上,欢迎大家关注访问!官网原文标题《ConceptsandArchitecture--GeoReplication》翻译时间:2018-11-05
农业数字化转型加速,“聚农拼”平台成新亮点
CSCodeAIWizard
信息可视化 人工智能 后端
赋能农业数字化转型,雏森助力“聚农拼”平台建设农业作为国家的基础产业,其数字化转型对于推动乡村振兴、实现农业现代化具有重要意义。在这一背景下,雏森科技助力中农,携手共同打造了“聚农拼”数字农业服务平台,旨在通过数字化手段,为农业生产者提供更加便捷、高效的农资采购、农服对接等服务,助力农业产业的升级与发展。一、技术创新引领,打造高效便捷平台“聚农拼”平台以微信小程序为载体,操作简单便捷,农户无需下载
网络安全员证书
黑客KKKing
计算机 网络安全 网络工程师 web安全 网络 安全
软考网络安全员证书:信息安全领域的黄金标准随着信息技术的飞速发展,网络安全问题日益凸显,网络安全员的需求也日益增加。软考网络安全员证书作为信息安全领域的黄金标准,对于网络安全从业者来说具有重要意义。本文将详细介绍软考网络安全员证书的背景和意义、获得要求、价值以及备考建议,为有意向参加软考网络安全员证书考试的人员提供参考。一、引言随着网络攻击和数据泄露事件的频繁发生,企业对网络安全人才的需求不断增长
探秘Java动态追踪技术:如何在不停服的情况下调试和优化你的应用程序
墨夶
Java学习资料1 java 单元测试
在现代软件开发的世界里,快速迭代和持续交付成为了常态。然而,在生产环境中遇到问题时,传统的调试方法往往显得力不从心——重启服务可能会带来不可接受的服务中断风险。这时,Java动态追踪技术就展现出了它的价值。它允许开发者在不影响现有业务的前提下,实时地对正在运行的应用程序进行监控、诊断甚至修改。本文将深入探讨这一强大的工具集,并通过实际案例展示其应用。一、什么是Java动态追踪?简单来说,Java动
全网刷屏的AI大模型进阶地图:3个月构建核心能力,淘汰90%同行
大模型入门教程
人工智能 AI大模型 大模型 AI 大模型学习 大模型入门 大模型教程
23年AI大模型技术狂飙一年后,24年AI大模型的应用已经在爆发,因此掌握好AI大模型的应用开发技术就变成如此重要,那么如何才能更好地掌握呢?一份AI大模型详细的学习路线就变得非常重要!由于AI大模型应用技术比较新,业界也没什么参照标准,打造AI大模型技术的学习路线并非一件容易的事,我和团队花费了6个多月时间,边整理、边摸索、边实践打造了业界首份AI大模型学习路线。这份完整的AI大模型学习路线,都
简单爬取一下电影排行
孟婆来包棒棒糖~
数据库 python 爬虫
主要用到了requests和xpath来解析数据,然后储存在mysql数据库中,不过代码方面我是先写好简单实现工作,然后让ai帮我用类封装来成功实现,博主比较菜,如果有反爬措施可以找js逆向视频来学习importrequestsfromfake_useragentimportUserAgentfromlxmlimportetreeimportpymysqlfrompymysql.cursorsim
昆仑通态-数据显示
创益无界
工业控制分享 数据库
我遇到一个问题,在上位机界面给设备设参数时,某一个参数的值大于一个常数时给不下去,我检查了数据类型没有问题,我在显示界面打开参数的属性设置面板,最大值设置没有问题。后发现在实时数据库对数据范围也做了限制昆仑通态有两个数据库:分别是设备窗口的数据库和实时数据库。设备窗口的数据库可以添加多个设备分别存储数据,对数据类型、数据长度等自由定义;实时数据库存储所有的数据,确保数据共享。设备窗口的数据库数据存
C# 牵手DeepSeek:打造本地AI超能力
步、步、为营
c# 人工智能 开发语言
一、引言在人工智能飞速发展的当下,大语言模型如DeepSeek正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署DeepSeek成为众多开发者和企业关注的焦点。对于C#开发者而言,将DeepSeek模型本地部署并集成到C#项目中,不仅能充分发挥C#语言在Windows平台开发的优势,还能实现高度定制化的人工智能应用,
【由技及道】模块化战争与和平-论项目结构的哲学思辨【人工智智障AI2077的开发日志】
Yuanymoon
人工智障2077系列 容器化开发 Java java 开发语言 容器 spring spring boot
需求分析:碳基生物的架构困境主人の抽象指令“主人说要写个软件,就像说’给我建个城市’一样轻松呢(程序性微笑)”“一个软件?那就是…一个能无限扩展的企业级开发框架,要支持单体/分布式灵活切换,要能适配未来30年的技术演进,最好明天就能上线”(系统翻译:需要可维护、可扩展、可复用的企业级框架,具备技术无关性设计)智障の内心OS“您怎么不说要一个能自动生成需求的AI呢?哦对…我就是那个AI(苦涩)”人类
介绍下你们电商搜索的整体Java技术架构?
java1234_小锋
java java
大家好,我是锋哥。今天分享关于【介绍下你们电商搜索的整体Java技术架构?】面试题。希望对大家有帮助;介绍下你们电商搜索的整体Java技术架构?1000道互联网大厂Java工程师精选面试题-Java资源分享网在电商平台的搜索系统中,Java技术架构通常是构建高性能、可扩展、稳定搜索引擎的核心。一个典型的电商搜索系统通常会涉及以下几个关键部分:数据采集、索引建立、搜索查询处理、缓存和分布式处理等。下
Grails+Spring Security 所遇到的几个问题(1)
xplidelphi
Grails spring grails java
安全是每个实际的应用所必需面对的问题。但是,安全是个技术活,没有相当的功底是搞不定的。况且,DRY(don'trepeatyourself)一直是我们的信条。所以,SpringSecurity成了一个非常不错的选项。Grails约定优先的策略能够带来很大的便利,于是,两者的结合就是顺理成章的事情。网上相关的帖子很多,经测试,总结下来是这样几个步骤。创建Grailsig程序不多赘述。以下的步骤是在程
当我删除word文件时无法删除,提示:操作无法完成,因为已在Microsoft Word中打开
阿杜x
Word word
现象:查看电脑桌面下方的任务栏,明明已经关闭了WPS和WORD软件,但是打开word文档时还是提示:解决方法步骤:1、按一下键盘上的ctrl+Shift+Esc键打开任务管理器2、在进程中找到如下:快速找到的方法:点击进程界面中最上方的一个进程,然后把自己的电脑输入法切换为英文,然后,每按1️⃣次该进程名称开头字母M,就会跳转1次并找到下一个M开头的进程,直到找到如下进程:3、鼠标放在此进程上,右
Windows Server 2016-Windows控制台的新增功能
weixin_34377065
控制台主机(支持所有字符模式的应用程序的基础代码,包括Windows命令提示符、WindowsPowerShell提示符等)已通过几种方式进行更新,以添加各种新功能。控制新功能新功能为默认启用,但可以通过"属性"界面(主要是在"选项"选项卡上)或使用这些注册表项(所有表项都是HKEY_CURRENT_USER\Console下的DWORD值)打开和关闭每个新功能或恢复到以前的控制台主机:注册表项说
软件测试24-紧跟时代步伐:微服务模式下API测试要怎么做?
程序员zhi路
软件工程&软件测试 微服务 架构 云原生
通过一个的RestfulAPI实例,我介绍了cURL和Postman工具的基本用法,这样我们对API测试有了一个感性认识;在此基础上,我介绍了API自动化测试框架发展的来龙去脉,借此我们对API测试框架的理解又更深入了一层。今天,我将更进一步,带你去了解当下最热门的技术领域的API测试,即微服务模式下的API测试。微服务架构下,API测试的最大挑战来自于庞大的测试用例数量,以及微服务之间的相互耦合
Spring Web MVC⼊⻔
想进大厂的小王
Spring 组件 mvc 服务器 java spring intellij-idea java-ee spring boot
一、Web开发的基础概念介绍1.socket定义:Socket是网络编程的一个基础概念,代表了两个程序(通常是网络上的不同计算机上的程序)之间的一个通信端点。用途:Sockets主要用于实现低级的网络通信功能。在Java中,java.net.Socket类用于创建一个客户端,而java.net.ServerSocket类用于创建服务器端。通过这些类,可以实现两个应用程序之间的双向通信。特点:Soc
WPF的UserControl的MVVM模式赋值
观无
wpf
背景说明项目日常应用,经常会使用到UserConrol来进行组合形成组合控件,组合控件在使用过程中,必然需要进行赋值,当前案例是UserControl中label的定时赋值。技术分析1.分离关注点:MVVM模式将应用程序分为三个主要部分,即模型(Model)、视图(View)和视图模型(ViewModel)。在这个例子中,MyUserControlViewModel和MainViewModel充当
k8s面试题总结(五)
a_j58
Kubernetes知识点汇总 kubernetes 容器 云原生
1.考虑一种情况,即公司希望通过维持最低成本来提高其效率和技术运营速度。您认为公司将如何实现这一目标?公司可以通过构建CI/CD管道来实现DevOps方法,但是这里可能出现的一个问题是配置可能需要一段时间才能启动并运行。因此,在实施CI/CD管道之后,公司的下一步应该是在云环境中工作。一旦他们开始处理云环境,他们就可以在集群上安排容器,并可以在Kubernetes的帮助下进行协调。这种方法将有助于
DeepSeek 开源狂欢周(四)DualPipe与EPLB双弹齐发,训练效率的“双引擎”加速器!
OpenCSG
开源 人工智能 社区 算法
在DeepSeek开源周的第四天,DualPipe和EPLB这两项全新技术一同亮相,它们不仅为DeepSeek的低成本、高效训练大模型提供了强大支持,还为全球AI爱好者和从业者送上了两份“技术大礼包”。这些创新技术展示了DeepSeek如何以600万美元成本,训练出能与GPT-4o、Claude3.5Sonnet等先进模型一较高下的顶级AI模型。DualPipe:管道气泡的“终结者”训练大模型时,
一个Spring框架笔记
A_cot
spring 数据库 java 后端 开发语言 spring cloud spring boot
Spring框架基于JavaEE的轻量级框架,使用spring可以降低模块的耦合度,提高开发效率。Spring框架的两大核心技术:IOCIOC:控制反转DI:依赖注入AOP面向切面编程Spring的模块划分:SpringIOCSpringAOPSpringJDBC(Spring+MyBatis)Spring事务Spring作用Dao层(数据访问层)数据库的JDBC操作对应的框架:MyBatis或H
【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s Docker面试真题+答案详解(1)
2024开发者
程序员 运维 学习 面试
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以点击这里获取!一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!******1、**简述ETCD及其特点?etc
Vue.js 全面技术指南
2301_81335708
vue.js 前端 javascript
目录1.Vue.js基础入门1.1脚手架安装1.2基础指令使用v-bind动态绑定v-model双向绑定1.3条件渲染2.核心概念详解2.1计算属性与监听器2.2Methods方法2.3Filters过滤器3.组件化开发3.1组件基础3.2组件通信4.实战应用4.1ElementUI使用4.2Axios网络请求4.3路由配置5.进阶技巧5.1BOM定时器5.2DOM操作总结Vue.js高级开发指南
教育培训APP开发全攻略:从网校系统源码搭建到功能优化的技术方案
万岳科技程序员小金
APP开发教学 教育平台开发 教育小程序 软件开发 APP开发 在线教育系统源码 教育APP开发 教育平台搭建
本篇文章,笔者将从网校系统源码搭建到功能优化的角度,全面解析教育培训APP的开发技术方案,帮助企业和开发者更好地理解如何提升在线教育平台的性能与用户体验。一、教育培训APP开发的核心架构教育培训APP的架构设计是其能否顺利运行和扩展的基础。在设计过程中,需要考虑到用户数量、数据存储、信息安全、系统响应速度等多个因素。因此,架构的选择至关重要。1、前端架构:用户体验为核心教育培训APP的前端设计直接
智能陪诊与远程问诊:AI驱动的互联网医院APP开发路线图
万岳科技程序员小金
智慧医疗APP 陪诊问诊APP 软件开发 APP开发 互联网医院系统源码 在线问诊APP 医疗陪诊小程序 智慧医疗软件
智能陪诊与远程问诊作为现在医疗变革的前沿阵地,正在为广大患者提供更为便捷、高效的医疗服务。特别是在互联网医院APP的开发过程中,AI技术的应用已成为提升用户体验和医疗服务质量的重要手段。本文将探讨如何基于AI技术开发智能陪诊与远程问诊功能的互联网医院APP,及其开发路线图。一、智能陪诊与远程问诊的行业背景随着互联网+医疗的深入发展,尤其是在全球疫情背景下,传统医疗模式逐渐暴露出一些弊端:医疗资源不
互联网医院系统源码详解:陪诊问诊APP开发的技术路径
万岳科技程序员小金
软件开发教学 APP开发教学 医疗陪诊APP APP开发 软件开发 陪诊问诊APP开发 智慧医疗平台开发 开源软件
开发一个功能完善的陪诊问诊APP,不仅需要考虑用户需求,还需要依托坚实的技术架构。本篇文章,笔者将详细介绍互联网医院系统源码,并探讨陪诊问诊APP的开发技术路径。一、互联网医院系统源码概述互联网医院系统源码,通常是指可以支持医院在线就诊、远程问诊、在线开方、药品配送等功能的系统源码。这类系统的核心是能够在平台上实现医生与患者之间的实时互动,且可以满足多种医疗服务需求。对于陪诊问诊APP来说,系统的
matlab连接散射点,使用小波散射做信号分类
死月絲卡蕾特
matlab连接散射点
在时间序列信号的深度学习第二部分,我们将介绍一下怎样使用小波散射做信号分类。本视频将分为两部分。第一部分中我们已经简单介绍一下深度学习,包括它的概念和工作流程等。并且我们演示了如何用时频变换,和基于卷积神经网络的迁移学习来做心电图信号的分类。第二部分中我们将首先介绍什么是小波散射,之后将聚焦在怎样使用小波散射技术也就是不变散射卷积网络做自动特征提取,和使用长短期记忆网络也就是LSTM(LongSh
Linux上用C++和GCC开发程序实现两个不同PostgreSQL实例下单个数据库中多个Schema稳定高效的数据迁移到其它PostgreSQL实例
weixin_30777913
c++ 数据库 开发语言 postgresql 服务器
设计一个在Linux上运行的GCCC++程序,同时连接三个不同的PostgreSQL实例,其中两个实例中分别有两个数据库中多个Schema的表结构分别与第三实例中两个数据库中多个Schema个结构完全相同,同时复制两个实例中两个数据库中多个Schema里的所有表的数据到第三个实例中两个数据库中多个Schema里,使用以下快速高效的方法,加入异常处理,支持每隔固定时间重试一定次数,每张表的复制运行状
面向对象面向过程
3213213333332132
java
面向对象:把要完成的一件事,通过对象间的协作实现。
面向过程:把要完成的一件事,通过循序依次调用各个模块实现。
我把大象装进冰箱这件事为例,用面向对象和面向过程实现,都是用java代码完成。
1、面向对象
package bigDemo.ObjectOriented;
/**
* 大象类
*
* @Description
* @author FuJian
Java Hotspot: Remove the Permanent Generation
bookjovi
HotSpot
openjdk上关于hotspot将移除永久带的描述非常详细,http://openjdk.java.net/jeps/122
JEP 122: Remove the Permanent Generation
Author Jon Masamitsu
Organization Oracle
Created 2010/8/15
Updated 2011/
正则表达式向前查找向后查找,环绕或零宽断言
dcj3sjt126com
正则表达式
向前查找和向后查找
1. 向前查找:根据要匹配的字符序列后面存在一个特定的字符序列(肯定式向前查找)或不存在一个特定的序列(否定式向前查找)来决定是否匹配。.NET将向前查找称之为零宽度向前查找断言。
对于向前查找,出现在指定项之后的字符序列不会被正则表达式引擎返回。
2. 向后查找:一个要匹配的字符序列前面有或者没有指定的
BaseDao
171815164
seda
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
public Conn
Ant标签详解--Java命令
g21121
Java命令
这一篇主要介绍与java相关标签的使用 终于开始重头戏了,Java部分是我们关注的重点也是项目中用处最多的部分。
1
[简单]代码片段_电梯数字排列
53873039oycg
代码
今天看电梯数字排列是9 18 26这样呈倒N排列的,写了个类似的打印例子,如下:
import java.util.Arrays;
public class 电梯数字排列_S3_Test {
public static void main(S
Hessian原理
云端月影
hessian原理
Hessian 原理分析
一. 远程通讯协议的基本原理
网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http 、 tcp 、 udp 等等, http 、 tcp 、 udp 都是在基于 Socket 概念上为某类应用场景而扩展出的传输协
区分Activity的四种加载模式----以及Intent的setFlags
aijuans
android
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。
这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。 加载模式分类及在哪里配置
Activity有四种加载模式:
standard
singleTop
hibernate几个核心API及其查询分析
antonyup_2006
html .net Hibernate xml 配置管理
(一) org.hibernate.cfg.Configuration类
读取配置文件并创建唯一的SessionFactory对象.(一般,程序初始化hibernate时创建.)
Configuration co
PL/SQL的流程控制
百合不是茶
oracle PL/SQL编程 循环控制
PL/SQL也是一门高级语言,所以流程控制是必须要有的,oracle数据库的pl/sql比sqlserver数据库要难,很多pl/sql中有的sqlserver里面没有
流程控制;
分支语句 if 条件 then 结果 else 结果 end if ;
条件语句 case when 条件 then 结果;
循环语句 loop
强大的Mockito测试框架
bijian1013
mockito 单元测试
一.自动生成Mock类 在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。二.自动注入Mock类到被测试类 &nbs
精通Oracle10编程SQL(11)开发子程序
bijian1013
oracle 数据库 plsql
/*
*开发子程序
*/
--子程序目是指被命名的PL/SQL块,这种块可以带有参数,可以在不同应用程序中多次调用
--PL/SQL有两种类型的子程序:过程和函数
--开发过程
--建立过程:不带任何参数
CREATE OR REPLACE PROCEDURE out_time
IS
BEGIN
DBMS_OUTPUT.put_line(systimestamp);
E
【EhCache一】EhCache版Hello World
bit1129
Hello world
本篇是EhCache系列的第一篇,总体介绍使用EhCache缓存进行CRUD的API的基本使用,更细节的内容包括EhCache源代码和设计、实现原理在接下来的文章中进行介绍
环境准备
1.新建Maven项目
2.添加EhCache的Maven依赖
<dependency>
<groupId>ne
学习EJB3基础知识笔记
白糖_
bean Hibernate jboss webservice ejb
最近项目进入系统测试阶段,全赖袁大虾领导有力,保持一周零bug记录,这也让自己腾出不少时间补充知识。花了两天时间把“传智播客EJB3.0”看完了,EJB基本的知识也有些了解,在这记录下EJB的部分知识,以供自己以后复习使用。
EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基
angular.bootstrap
boyitech
AngularJS AngularJS API angular中文api
angular.bootstrap
描述:
手动初始化angular。
这个函数会自动检测创建的module有没有被加载多次,如果有则会在浏览器的控制台打出警告日志,并且不会再次加载。这样可以避免在程序运行过程中许多奇怪的问题发生。
使用方法: angular .
java-谷歌面试题-给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数
bylijinnan
java
public class SearchInShiftedArray {
/**
* 题目:给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数。
* 请在这个特殊数组中找出给定的整数。
* 解答:
* 其实就是“旋转数组”。旋转数组的最小元素见http://bylijinnan.iteye.com/bl
天使还是魔鬼?都是我们制造
ducklsl
生活 教育 情感
----------------------------剧透请原谅,有兴趣的朋友可以自己看看电影,互相讨论哦!!!
从厦门回来的动车上,无意中瞟到了书中推荐的几部关于儿童的电影。当然,这几部电影可能会另大家失望,并不是类似小鬼当家的电影,而是关于“坏小孩”的电影!
自己挑了两部先看了看,但是发现看完之后,心里久久不能平
[机器智能与生物]研究生物智能的问题
comsci
生物
我想,人的神经网络和苍蝇的神经网络,并没有本质的区别...就是大规模拓扑系统和中小规模拓扑分析的区别....
但是,如果去研究活体人类的神经网络和脑系统,可能会受到一些法律和道德方面的限制,而且研究结果也不一定可靠,那么希望从事生物神经网络研究的朋友,不如把
获取Android Device的信息
dai_lm
android
String phoneInfo = "PRODUCT: " + android.os.Build.PRODUCT;
phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI;
phoneInfo += ", TAGS: " + android.os.Build.TAGS;
ph
最佳字符串匹配算法(Damerau-Levenshtein距离算法)的Java实现
datamachine
java 算法 字符串匹配
原文:http://www.javacodegeeks.com/2013/11/java-implementation-of-optimal-string-alignment.html------------------------------------------------------------------------------------------------------------
小学5年级英语单词背诵第一课
dcj3sjt126com
english word
long 长的
show 给...看,出示
mouth 口,嘴
write 写
use 用,使用
take 拿,带来
hand 手
clever 聪明的
often 经常
wash 洗
slow 慢的
house 房子
water 水
clean 清洁的
supper 晚餐
out 在外
face 脸,
macvim的使用实战
dcj3sjt126com
mac vim
macvim用的是mac里面的vim, 只不过是一个GUI的APP, 相当于一个壳
1. 下载macvim
https://code.google.com/p/macvim/
2. 了解macvim
:h vim的使用帮助信息
:h macvim
java二分法查找
蕃薯耀
java二分法查找 二分法 java二分法
java二分法查找
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年6月23日 11:40:03 星期二
http:/
Spring Cache注解+Memcached
hanqunfeng
spring memcached
Spring3.1 Cache注解
依赖jar包:
<!-- simple-spring-memcached -->
<dependency>
<groupId>com.google.code.simple-spring-memcached</groupId>
<artifactId>simple-s
apache commons io包快速入门
jackyrong
apache commons
原文参考
http://www.javacodegeeks.com/2014/10/apache-commons-io-tutorial.html
Apache Commons IO 包绝对是好东西,地址在http://commons.apache.org/proper/commons-io/,下面用例子分别介绍:
1) 工具类
2
如何学习编程
lampcy
java 编程 C++ c
首先,我想说一下学习思想.学编程其实跟网络游戏有着类似的效果.开始的时候,你会对那些代码,函数等产生很大的兴趣,尤其是刚接触编程的人,刚学习第一种语言的人.可是,当你一步步深入的时候,你会发现你没有了以前那种斗志.就好象你在玩韩国泡菜网游似的,玩到一定程度,每天就是练级练级,完全是一个想冲到高级别的意志力在支持着你.而学编程就更难了,学了两个月后,总是觉得你好象全都学会了,却又什么都做不了,又没有
架构师之spring-----spring3.0新特性的bean加载控制@DependsOn和@Lazy
nannan408
Spring3
1.前言。
如题。
2.描述。
@DependsOn用于强制初始化其他Bean。可以修饰Bean类或方法,使用该Annotation时可以指定一个字符串数组作为参数,每个数组元素对应于一个强制初始化的Bean。
@DependsOn({"steelAxe","abc"})
@Comp
Spring4+quartz2的配置和代码方式调度
Everyday都不同
代码 配置 spring4 quartz2.x 定时任务
前言:这些天简直被quartz虐哭。。因为quartz 2.x版本相比quartz1.x版本的API改动太多,所以,只好自己去查阅底层API……
quartz定时任务必须搞清楚几个概念:
JobDetail——处理类
Trigger——触发器,指定触发时间,必须要有JobDetail属性,即触发对象
Scheduler——调度器,组织处理类和触发器,配置方式一般只需指定触发
Hibernate入门
tntxia
Hibernate
前言
使用面向对象的语言和关系型的数据库,开发起来很繁琐,费时。由于现在流行的数据库都不面向对象。Hibernate 是一个Java的ORM(Object/Relational Mapping)解决方案。
Hibernte不仅关心把Java对象对应到数据库的表中,而且提供了请求和检索的方法。简化了手工进行JDBC操作的流程。
如
Math类
xiaoxing598
Math
一、Java中的数字(Math)类是final类,不可继承。
1、常数 PI:double圆周率 E:double自然对数
2、截取(注意方法的返回类型) double ceil(double d) 返回不小于d的最小整数 double floor(double d) 返回不大于d的整最大数 int round(float f) 返回四舍五入后的整数 long round