未找到

未发布 Oracle正式发布Java 9,引入新的Java编程组件
by Harriet666 keys 分享 1506566182619
Java SE 9.0于2017年9月21日发布。JDK 9的核心变化就是引入了一种新的Java编程组件,也就是模块,按照Oracle的说法,它是一个可命名的、自描述的代码和数据集合。模块技术的核心目标是减少Java应用和Java核心运行时环境的大小与复杂性。为此,JDK本身进行了模块化,Oracle希望通过这种方式提升性能、安全性和可维护性。

为了支持Java 9的模块,引入一种新的模块化JAR文件形式,按照这种形式会在其根目录中包含一个module-info.class文件。Oracle同时提供了工具,允许我们组合和优化一组模块,形成自定义的运行时镜像(image),这样的镜像不必将整个Java运行时包含进来。模块化所带来的其他变化包括从Java运行时镜像中移除了rt.jar和tools.jar。
Java社区进程(JCP)执行委员会的成员Ben Evans认为最急需重构的应用恰好就是最适合进行模块化的应用。如果你已经备受Lava Flow/God Class/Stovepipe System地狱的折磨,而且你的利益相关方明确知道这一点,那么你可能更容易说服他们进行一次完整的底层重构,通过渐进式的努力形成一个完成的模块解决方案(而不是简单重构并迁移至Java 8)是值得去做的。

Oracle宣布Java 8会是一个长期支持的发布版本,会一直支持到2022年,因此Evans认为很多的应用将会停留在Java 8上,根本不会升级到Java 9。Evans补充说,有些应用可能会让开发和构建工具链使用Java 8版本,而在生产环境使用Java 9的运行时。
对特定类型的应用来说,这是很有帮助的。例如,我曾经见到有的电子商务网站具有非常大的堆空间,其中包含了大约40G的字符串数据。Java 9的ompact Strings技术能够将这种类型的内存使用减半。这反过来又会对GC的性能带来积极的影响。对于有些应用来说(这可能就包括大型的Solr安装环境及类似场景),单单这一项收益就值得将运行时升级到Java 9。

Java 9使用G1作为默认的垃圾收集器,替代了之前默认使用的Parallel GC。Evans对这项变化的评论:
这项变更是很重要的,因为相对于Parallel来说,G1会在应用线程上做更多的事情,而Parallel几乎没有在应用线程上做任何事情,它基本上完全依赖GC线程完成所有的内存管理。这意味着切换到G1将会为应用线程带来额外的工作,从而直接影响到应用的性能。


在很多(甚至可以说大多数)场景中,这种额外的性能损耗都不是什么问题。但是,在这方面,我确实也曾经见过从Parallel切换到G1时,有一定比例的工作负载会引起性能的下降。对于这些应用来说,这种性能下降是无法接受的,所以他们无法切换至G1收集器。随着G1成为默认的收集器,这将会影响到升级至Java 9的每个应用。

JClarity的CEO Martijn Verburg认为大型的代码库需要重构为模块的形式。Verburg给出了一些通用的模块化建议,并且指出了开发人员在采用Java 9模块系统时,需要注意的一些事情:
  • 阅读Paul和Sander的图书“Java 9 modularity”:它是本权威指南,提到了所有需要注意的地方,阐述了模块、包以及JAR之间如何运行的关联关系; 
  • 在模块边界的地方,使用定义良好的接口并且针对这些接口编程; 
  • 不要拆分包(split package),也就是说一个包不要分散到两个模块中。Adopt OpenJDK有个探测工具,我们可以用它来探测已有的代码; 
  • 确保不要存在循环依赖(Jigsaw不允许这样); 
  • 模块在源码的布局上与我们已习惯的方式有所不同,需要确保构建工具能够进行对应的处理; 
  • Jigsaw不支持多版本。
 
按照Verburg的说法,核心要点在于处理循环依赖、拆分包的问题,并确保针对接口进行编码。在尝试使用Jigsaw模块化重构之前,针对已有的代码库,这些工作需要预先完成。他还澄清了一个误解,那就是只有模块化的应用才能在Java 9上运行。

由于误解,在这方面有一种FUD(恐惧、不确定和怀疑)情绪,有人误认为在Java 9上运行的必须是模块化的应用。事实并非如此,我们可以将已有的基于类路径的应用直接在Java 9上运行。这里会有一些新的安全限制,因此我们需要设置一些特定的运行时标记(除非你重构代码,使用更安全的方式来访问Java的内部资源),即便如此,默认的行为也只是警告,而不是完全阻止我们(Java 10的限制会更严格)。

Verburg认为Jigsaw会是一个基石,会让Java的演进更快,这要归功于Mark Reinhold、Alan Bateman、Mandy Chung以及Jigsaw团队的其他成员多年来不知疲倦的工作,正是他们的努力使这一切得以实现。

Java 9还引入了jshell工具。这个命令行环境为Java平台带来了读入-求值-打印-循环(Read-Eval-Print-Loop,REPL)功能。它的目的在于以即时结果和反馈的形式,简化原型的实现并帮助我们探索语言在编码时的可选项。

Verburg和Evans看到Java 9中包含了jShell都非常兴奋,但令他们失望的是,HTTP/2只是作为Java 9的一个孵化模块(incubator module)提供的。鉴于社区对这项特性的兴趣和提供的帮助,Evans认为Oracle应该投入足够的工程资源,将HTTP/2交付为GA版本。

JDK 9完整的变更列表可以在Oracle的站点上查阅。Oracle宣布会按照每六个月一次的节奏进行发布,意味着Java 9是最后一次“keystone”特性驱动的版本发布,这反映出了Oracle目前管理Java的特点。Java下一阶段的演化将会按照更短的发布周期并且会按照更加面向特性的方式来发布。Java是否依然能够在服务端技术中占据领导者地位尚有待观察。
更多资讯点击查看>>>



未发布 CAD DLL发布v12新版本,支持最新版本的DWG - AutoCAD®DWG 2018
by Harriet666 keys 分享 1497431255647
CAD DLL是一个为开发者打造的新版本CAD库,可在支持动态链接库技术的语言中添加CAD功能到应用程序中。
 
【CAD DLL v12点击下载>>>】

最新的CAD DLL 12是一个用于在VC ++、VB和Delphi / C ++ Builder中查看和转换DWG、DXF、HPGL、SVG和其他CAD文件的库。
 
现在,CAD DLL支持最新版本的DWG - AutoCAD®DWG 2018。在此dll的帮助下创建的应用程序可以轻松导入最新的图纸。
 
此外,改进了CAD DLL的导出功能。现在,你可以通过Windows图元文件技术更快地导出文件到DWG和DXF。输出文件的导出速度和质量得到了很大的提高。
 
此外,对于为CNC机床创建应用程序并需要从CAD文件生成G-code的用户来说,现在使用CAD DLL,可以将DWG / DXF到G-code转换功能添加到你的应用程序中。
c48a1812f8604d76a9f7cf789251aaedojpg
CAD DLL 12中包含的改进内容列表:
  • 导入AutoCAD®DWG 2018
  • 通过Windows图元文件(ExportToCADFile)导出DWG / DXF
  • 导出G-code
你可以下载并测试最新版本的CAD DLL>>>
未发布 MailBee.NET Objects撰写邮件教程(一):添加和删除自定义标题
by Harriet666 keys 分享 1501488557962
MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持,简单高效。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。
 
MailBee.NET Objects介绍和试用点击查看>>>
 
本文主要介绍了如何添加和删除自定义标题的代码示例。目前MailBee.NET Objects在线订购享75折优惠正在进行中,欢迎您下载试用版进行运用!

在新邮件中添加自定义标题,可以使用一下代码:
C#
// Create a MailMessage object.
MailMessage msg = new MailMessage();

// Add a header.
msg.Headers.Add("MyHeader", "Some value for my own header", false);

VB.NET
' Create a MailMessage object.
Dim msg As New MailMessage()

' Add a header.
msg.Headers.Add("MyHeader", "Some value for my own header", False)

你可以指定标题的名称和值,如果邮件中已经存在标题,也可以指定是否重写。当覆盖参数设置为true并且具有相同名称的标题已经存在时,它将被覆盖;否则,将添加具有相同名称的另一个标题。
开发人员还可以轻松地从邮件中删除所有自定义标题:
C#
// Remove the non-standard headers from the message.
msg.Headers.RemoveCustomHeaders();

VB.NET
' Remove the non-standard headers from the message.
msg.Headers.RemoveCustomHeaders()
此方法可以删除标准的标题以外的所有标题。你可以在RemoveCustomHeaders方法描述中找到标准标题列表。另一种方法是使用Remove或RemoveAt方法,也能够指定要删除的标题:
C#
// Remove the specified header.
msg.Headers.Remove("X-Special-Header"); 

// Remove the first header.
msg.Headers.RemoveAt(0);

VB.NET
' Remove the specified header.
msg.Headers.Remove("X-Special-Header") 

' Remove the first header.
msg.Headers.RemoveAt(0)
未发布 网络通讯控件PowerSNMP for .NET常见问题合集
by Harriet666 keys 分享 1502788489271
PowerSNMP for .NET是用于监视和控制网络设备创建自定义的SNMP管理器。简单网络管理协议(SNMP)采用线程通信机制,安全强、并且具有编码/解码功能,您可以快速开发定制SNMP应用程序。由于开发此工具需要的资源少,灵活性好,所以便于重新使用和维护。
 
PowerSNMP for .NET试用版下载>>>
 
问:PowerSNMP for .NET与其他SNMP产品有什么不同?
答:最新版本的PowerSNMP产品线增加了新的.NET 2.0重新设计,利用新的.NET环境的强大功能,提供了最先进的Internet Communications组件。包含以下功能:
  • SNMP版本1,2和3包含认证、加密/解密
  • RFC 1155,1157,1158,1213,2578,2579,3417和3418中定义的内置对象、标识符、表格、通知和组
  • MIB解析,自定义MIB文件可用于在源代码中生成C#或VB类
  • MIB编译,自定义MIB文件可用于在运行时生成动态类和对象
  • 可轻松实现多线程应用程序的启动方法
  • EncodedMessage属性,用于轻松调试发送和接收的字节以及会话记录
.NET环境已经发展,用户也是如此。客户正在开发更多的ASP.NET应用程序,更多的控制台应用程序和更多的服务应用程序。缺乏UI、伪阻塞和异步方法与这些环境无关。由于这些原因,PowerSNMP for .NET 4.x设计有以下重点:
  • 改进异步支持:传统的PowerSNMP异步支持提供了一种在工作线程上执行的方法,但这需要一个信号机制来指示何时完成操作。这导致了难以维护的事件驱动代码。通过新的设计,代码占用更少的资源并且更加灵活。
  • 改进.NET 2.0功能:PowerSNMP 4.x已经充分利用了.NET 2.0中引入功能。现在大多数用户已经从.NET 1.x迁移,可以升级PowerSNMP并兼顾兼容性。当然,.NET 1.x产品线仍可在.NET 1.x环境中使 用以支持旧版应用程序。
  • 支持.NET CF(Compact Framework):通过新的设计,全面支持Compact Framework。

问:试用版与许可版本有什么不同?
答:在开发期间,产品“试用”版本和许可版本之间没有区别。
在运行时,没有有效的开发者许可证创建的应用程序将定期显示一条试用消息。除了这个消息之外,功能没有区别。

问:示例是否随产品一起发送?
答:当然。我们发送将CSharp和Visual Basic .NET中的完整应用程序(不仅仅是简单的技术演示)作为Windows应用程序和Web应用程序。
 
问:PowerSNMP是否完全支持从表格中获取值?GetBulk怎么样?
答:以上都支持。PowerSNMP包括高级表格检索方法,完全支持版本2命令(如GetBulk)。
 
问:应用程序如何使用Manager控件?
答:一个典型的应用程序会将所有代理的IP地址存储在网络上,并且会按照时间表从代理收集统计信息。应用程序的地址也可能会被注册到代理以设置陷阱,因此管理员将以异步方式(动态地)通知重要的代理事件。信息将被记录到文件中,并通过用户界面动态显示。
 
问:应用程序如何使用代理控件?
答:假设PC主机正用于控制硬件设备。你可以创建一个代理,被查询时将通过硬件设备的统计信息进行响应。该概念可以扩展到提供由主机收集和提供的任何类型的信息(使用SNMP标准)。
 
问:我可以创建一个作为Microsoft操作系统代理的子代理吗?
答:通常不能。代理商通常使用“知名”端口161进行通信。由于Microsoft的代理将使用此端口,你的应用程序将必须使用非标准端口,并且你的管理器必须配置为检查你的非标准端口(可以在某些情况下进行,但不常见)。
 
问:当我建立VS.NET 2008 Website时,为什么会出现“尝试反序列化一个空的流”的异常?
答:网站为组件许可创建一个App_Licenses.dll,必须与应用程序一起分发。由于一个明显的VS.NET 2008错误,这个dll在64位操作系统编译时是错误的。为了解决这个问题,可以更换2008 Website中的App_Licenses dll。 
 
选项包括:
a)使用相同的控件/组件在相同(许可)机器上编译2005 Website
b)在32位计算机上编译2005或2008 WebSite,前提是该机器也获得许可(Dart Developer许可证允许安装在最多两台机器)
从以上的选项中选一个替换有缺陷的App_Licenses.dlll,并且网站应该在没有问题的情况下构建和部署。不要删除新的dll,否则VS.NET将再次创建错误的dll。
未发布 【教程】Edraw Max(亿图图示):思维导图怎样一次性键入分支内容?
by Harriet666 keys 分享 1502356139814
Edraw Max(亿图图示)作为一款功能齐全,使用方便、快捷的全类型图形图表设计软件,不仅富含丰富的模板和例子,还可以一键轻松导入思维导图的分支内容。本文就教大家具体的操作方法吧!
 
目前Edraw Max(亿图图示)在线订购享75折优惠活动正在进行中,欢迎您下载、购买进行运用!

Edraw Max(亿图图示)v8.7最新版下载地址>>>
 
第一步:选中需要添加分支的主题形状,然后点击“思维导图”菜单栏下的“添加多个主题”;
 
第二步:打开之后,依次输入需要添加的分支内容,按回车键(enter)换行,每一行代表一个主题;
 
第三步:重复以上两步,可以在第二级分支上再一次导入第三级分支;
 
第四步:数据导入之后,可以跟通过“思维导图”下的“布局”对整个思维导图的主题、样式进行调整,同时还可以将数据直接导出为Word、Excel以及文本格式。
未发布 GIS软件开发包Map Suite v10.0发布,支持Windows、Linux和macOS多平台
by Harriet666 keys 分享 1490601341066

Map Suite 10.0新功能

  • 核心功能支持Windows、Linux和macOS多平台。
  • 所有Map Suite产品系列都共享核心API。
  • 删除合并模块并将所需的程序集移动到特定程序包。
  • 创建可在多平台(包括Windows、Linux和macOS)上运行的新产品中心。
  • Map Suite产品托管在NuGet服务器上,而不是Map Suite安装程序。
  • 简化Map Suite许可策略。
  • 按功能拆分MapSuiteCore 9.0程序集。允许将必要的程序集导入到这些项目中。
  • 在Linux上支持ECW文件。
  • 在Linux上支持MrSid和JPEG2000文件。
  • 用于Map Suite产品的BareBone NuGet Package可以创建最小尺寸的应用程序。
  • 用于Map Suite产品的Standard NuGet Package可以让用户更轻松的将现有的9.0项目转移到10.0版本上。

Map Suite 试用版下载>>>

v10.0和v9.0之间的变化

我们努力使安装过程和版本维护变得更加容易,并将所有Map Suite产品重新打包到NuGet软件包中。开发人员可以选择在本地安装引用、通过使用Visual Studio的NuGet管理器进行管理或者为你的团队设置本地NuGet服务器。

更有效率

Map Suite产品可帮助开发人员更有效地创建GIS应用程序。将Map Suite组件运用到你的项目中并进行分享会让你的工作变得更加效率。

跨平台/便携式

在Map Suite 9.0之前,我们一直考虑支持像Linux、MacOS、Android、iOS这样的多平台。然而,基础结构阻止了我们的步伐。如果你已经是使用Map Suite产品的开发人员,你可能知道我们支持Windows(Wpf、WinForms ...)、iOS和Android平台,但在很长一段时间中这是比较困难的。想象这种情况:客户在Windows平台上报告MapSuiteCore中的错误。我们对它进行修复并测试。但这并不是全部的工作。我们还要向iOS和Android团队报告,要求他们解决相同的错误。这是基础结构方面的错误。我们有几个MapSuiteCore分支,它依赖于不同的框架。每次修复bug时,我们需要与其他平台同步。

现在,我们的目标是让Map Suite Core的源代码尽可能便携。借助分离MapSuiteCore的机会,我们可以将现有的功能转换为便携式。本质上来说各平台可以共享相同的源代码。

分离Map Suite Core

在Map Suite 9.0中,我们在名为“MapSuiteCore”和几个扩展的程序集中支持大部分功能。而其他产品则具有基础结构。当你启动项目时,你只能引用包含Map Suite所有功能的“MapSuiteCore”。这无法最小化你的项目。
我们决定按照功能来分离Map Suite Core,例如形状、层数、样式、符号等。你所知道的每个Map Suite功能都可能是一个单独的包。你可以选择性地使用项目所需的软件包,并将应用程序控制在最小。
Map Suite 试用版下载>>>

更简单的试用许可证

认证和许可是NuGet软件包的一个缺点。不过,我们为非注册开发人员制定了一个新策略,你不用注册就可以在有限的时间内评估Map Suite产品。你只需打开Visual Studio,创建一个项目,打开NuGet管理器并输入“MapSuite”。它会返回给你Map Suite支持的全部功能列表。
PS:原始许可证仍与10.0兼容。
第一次运行Map Suite 9.0或更低版本样本的工作流程。 

第一次运行Map Suite 10.0样本的工作流程。

更改命名空间

在Map Suite 9.0和以前版本中,命名空间主要由ThinkGeo.MapSuite.Core和版本命名空间两部分组成,如ThinkGeo.MapSuite.WebEdition。现在ThinkGeo.MapSuite.Core基于它的功能已经分离了,现在我们有:
  • ThinkGeo.MapSuite包含用于构建Map Suite应用程序的常用和基础类,如GeographyUnit、GeoCollection等。
  • ThinkGeo.MapSuite.Drawing包含绘图相关类,如GeoImage、GeoSolidBrush等。
  • ThinkGeo.MapSuite.Layers包含一些基础类,如Layer、FeatureLayer等。
  • ThinkGeo.MapSuite.Shapes包含几何相关类,如PlygonShape、LineShape等。
  • ThinkGeo.MapSuite.Styles包含用于构建地图样式的类,如AreaStyle、LineStyle等。
                                                                                                                     【责任编辑慧都Elyn
未发布 2D/3D文档查看器ABViewer发布v12,大大提高PDF转DWG的速度丨附下载
by Harriet666 keys 分享 1497596728894
ABViewer是一款高质量的2D/3D文档查看器,可提供专业的浏览、编辑和转换功能,支持30多种光栅和矢量图形格式,其中包括AutoCAD DWG, DXF, DWF, Hewlett-Packard HPGL, PLT, HGL, CGM, SVG, IGES/IGS, STEP/STP, STL, 3DS, TIFF, BMP, JPG, GIF等。

【ABViewer 12最新版下载>>>】
ABViewer 12支持AutoCAD®DWG 2018、PDF转DWG速度更快、DWG/DXF转G-code。
ABViewer始终与时俱进,CAD应用程序的新版本ABViewer 12主要用于DWG/DXF和其他2D和3D CAD格式,以及三个主要亮点。

导入AutoCAD®DWG 2018

无论你是在CAD行业工作还是偶尔接收CAD图纸,ABViewer 12始终能够打开所有版本的DWG文件。支持导入最新版本的绘图文件格式 - AutoCAD®DWG 2018。
9e98f9609cea49b4bd3dc4882b979993ojpg

提高PDF转DWG的速度

ABViewer 12中PDF到DWG转换速度大大加快。以前,转换大文件需要很多时间,现在你无需浪费这些时间了。一些文件的转换就在眨眼之间!
bacee89af4214eab84cf49d63cd79b65ojpg

DWG/DXF转换为G-code

许多使用数控机床的人需要从CAD文件中生成G-code。新版本的ABViewer可以实现这个目标。
你可以使用ABViewer创建铣削和切割数控机床的G代码。只需加载你的DWG或DXF文件,调整设置,ABViewer将从你的图纸中生成G-code并将其保存为NC文件格式。
0cb278f4c3bc41e19013d58abc678f9bojpg
 
未发布 MailBee.NET Objects退回邮件教程(二):POP3部分
by Harriet666 keys 分享 1503567760428
MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持,
简单高效。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。

MailBee.NET Objects介绍和试用点击查看>>>
 
 
本文主要介绍了SMTP服务器退回邮件的代码示例。目前MailBee.NET Objects在线订购享75折优惠正在进行中,欢迎您下载试用版进行运用!
 
在上期的SMTP部分中,我们将退回的电子邮件发送到指定的单个电子邮件地址。
 
每封退回的电子邮件都包含失败的电子邮件地址(以及其他信息)。这个失败的地址是我们想知道的。这个任务看起来很简单 - 你需要做的是扫描退回的
邮件以确定地址的典型字段。但是有一个隐藏的危险:每个邮件服务器都有自己的邮件退回格式。虽然它们几乎具有相同的“From”和“主题”字段,但是退回地址可以在邮件的任何位置。MailEnable服务器的典型退回邮件如下所示:
From: POSTMASTER@domain.com
To: jdoe@domain.com
Subject: Message Delivery Failure

MailEnable: Message Delivery Failure.

The following recipient(s) could not be reached: 

Recipient: [SMTP: bill@domain.com] Reason: The message could not be delivered because the domain name (domain.com) does not appear 

to be registered.

函数GetInvalidEmailAddressME()检查邮件是否被退回,并从退回的邮件中提取失败的地址。由于退回邮件格式不同,此功能仅对MailEnable服务器有效。例如,如果你正在使用Communigate Pro服务器,则退回消息如下所示:
From: MAILER-DAEMON@domain.local
To: jdoe@localhost Subject:
Undeliverable mail:

Failed to deliver to ''
 
正如你所看到的,这个退回的邮件与前一个几乎相同。使用哪个服务器并不重要,退回信息总是有From,To和Subject字段,退回信息在其正文中有失败的地址。函数GetInvalidEmailAddressCP()与前一个函数几乎相同; 区别仅在于检查邮件字段并搜索失败的地址。支持尽可能多的退回电子邮件格式至关重要。这就是为什么你需要修改GetInvalidEmailAddress()函数,以适应服务器使用的退回电子邮件格式。
 
注意:在某些情况下,你可能需要扫描退回的电子邮件以获取其他信息。如果由于暂时的问题,退回的邮件到达,则不要删除电子邮件地址:邮箱超过配
额,邮件服务器关闭等。退回邮件可以分为两种类型:硬邮件和软邮件。如果是不存在的帐户或域,则会发生硬性退回。其他故障,如完整的邮箱或暂时
不可用的域,则是软性退回。你可以为数据库中的每个地址进行计算。也许下一次尝试发送邮件到具有一些软性退回的地址时将成功。
 
代码示例:
在此示例中,我们从指定的帐户中检索退回的电子邮件,然后从每个退回的电子邮件中提取失败的电子邮件地址。失败的地址传递给RemoveEmailFromDatabase子程序,该子程序必须从数据库中删除失败的地址。应用程序还会从服务器中删除退回的电子邮件,以避免下次处理。
C#:
// Create POP3 object
Pop3 pop = new Pop3();

// Enable logging to file
pop.Log.Enabled = true;
pop.Log.Filename = @"C:\log.txt";
pop.Log.Clear();

// Connect to POP3 server
pop.Connect("mail.domain.com");
pop.Login("bounce", "secret");

// Download headers and bodies of all messages.
MailMessageCollection msgs = pop.DownloadMessageHeaders(1, -1, -1);
                        
// Loop through all messages in the mailbox
foreach (MailMessage msg in msgs)
{
        string strLine = msg.BodyPlainText;
        Console.WriteLine("From: " + msg.From.Email);
                                
        // Get failed email address
        string str_invalid_email =  GetInvalidEmailAddressME(msg);

        // If str_invalid_email is non-empty then failed email 
        // address was found
        if (str_invalid_email.Length > 0)
        {
                // Remove failed email from database
                RemoveEmailFromDatabase(str_invalid_email);

                // Display invalid adress
                Console.WriteLine("Invalid email: " + str_invalid_email);                

                // Delete bounced email from server to avoid
                // processing it next time
                pop.DeleteMessage(msg.IndexOnServer);
        }
}

// Disconnect from POP3 server
pop.Disconnect();

// The function checks whether the message is bounced and extracts 
// failed address 
// from bounced message. Valid only for MailEnable servers
static string  GetInvalidEmailAddressME(MailMessage msg)
{
        string str_invalid_email = msg.BodyPlainText;

        // Check if this is a bounced message report
        if (msg.Subject.IndexOf("Delivery Failure") == -1)
{ 
                return "";
        }
        if (msg.From.ToString().IndexOf("POSTMASTER") == -1)
        {
                return "";
        }

        // Now we're sure this is a bounced message report
        int i_start;
        i_start = str_invalid_email.IndexOf("SMTP:");

        // Check if bounced message report contains "Recipient:" field
        if (i_start == -1)
        {
                return "";
        }
                        
        // Get failed address
        i_start += 5;
        i_end = str_invalid_email.IndexOf("]",i_start);
        str_invalid_email.Substring(i_start, i_end);
                        
        return str_invalid_email;
}

// The function checks whether the message is bounced and extracts 
// failed address 
// from bounced message. Valid only for Communigate Pro servers
static string  GetInvalidEmailAddressCP(MailMessage msg)
{
string str_invalid_email = msg.BodyPlainText;

        // Check if this is a bounced message report
        if (msg.Subject.IndexOf("Undeliverable mail") == -1) 
        {
                return "";
        }
        if (msg.From.ToString().IndexOf("MAILER-DAEMON") == -1) 
        {
                return "";
        }

        // Now we're sure this is a bounced message report
        int i_start;
        i_start = str_invalid_email.IndexOf("to '<");

        // Check if bounced message report contains 
        // "Failed to deliver to " field
        if (i_start == -1)
        { 
                return "";
        }
                        
        // Get failed address
        i_start += 5;
        i_end = str_invalid_email.IndexOf("]",i_start);
        str_invalid_email.Substring(i_start, i_end);
                        
        return str_invalid_email;
}

// This function must remove (or disable) specified
// email address from mailing list
static void RemoveEmailFromDatabase(string str_invalid_email)
{
// TODO: Add your code here                        
}
 
VB.NET:
Dim pop As New Pop3

' Enable logging to file
pop.Log.Enabled = True
pop.Log.Filename = "C:\log.txt"
pop.Log.Clear()

' Connect to POP3 server
pop.Connect("mail.domain.com")
pop.Login("jdoe", "secret")

' Download headers and bodies for all messages.
Dim msgs As MailMessageCollection = pop.DownloadMessageHeaders(1, -1, -1)

' Loop through all messages in the mailbox
Dim msg As MailMessage
For Each msg In msgs
        Dim strLine As String = msg.BodyPlainText
        Console.WriteLine("From: " + msg.From.Email)

        ' Get failed email address
        Dim str_invalid_email As String = GetInvalidEmailAddressME(msg)

        ' If str_invalid_email is non-empty then failed email 
        ' address was found
        If str_invalid_email.Length > 0 Then
                'Remove failed email from database
                RemoveEmailFromDatabase(str_invalid_email)

                ' Display invalid address
                Console.WriteLine("Invalid email: " & str_invalid_email)

                ' Delete bounced email from server to avoid
                ' processing it next time
                pop.DeleteMessage(msg.IndexOnServer)
        End If
Next
Console.ReadLine()

' Disconnect from POP3 server
pop.Disconnect()

' The function checks whether the message is bounced and extracts 
' failed address 
' from bounced message. Valid only for MailEnable servers
Function GetInvalidEmailAddressME(ByVal msg As MailMessage) As String
        Dim str_invalid_email As String = msg.BodyPlainText

        ' Check if this is a bounced message report
        If msg.Subject.IndexOf("Delivery Failure") = -1 Then
                Return ""
        End If
        If msg.From.ToString().IndexOf("POSTMASTER") = -1 Then
                Return ""
        End If

        ' Now we're sure this is a bounced message report
        Dim i_start As Integer, i_end As Integer
        i_start = str_invalid_email.IndexOf("SMTP:")

        ' Check if bounced message report contains "Recipient:" field
        If i_start = -1 Then
                Return ""
        End If

        ' Get failed address
        i_start += 5
        i_end = str_invalid_email.IndexOf("]", i_start)
        str_invalid_email.Substring(i_start, i_end)

        Return str_invalid_email
End Function

' The function checks whether the message is bounced and extracts 
' failed address 
' from bounced message. Valid only for Communigate Pro servers
Function GetInvalidEmailAddressCP(ByVal msg As MailMessage) As String
        Dim str_invalid_email As String = msg.BodyPlainText

        ' Check if this is a bounced message report
        If msg.Subject.IndexOf("Undeliverable mail") = -1 Then
                Return ""
        End If
        If msg.From.ToString().IndexOf("MAILER-DAEMON") = -1 Then
                Return ""
        End If

        ' Now we're sure this is a bounced message report
        Dim i_start As Integer, i_end As Integer
        i_start = str_invalid_email.IndexOf("to '<")

        ' Check if bounced message report contains 
        ' "Failed to deliver to " field
        If i_start = -1 Then
                Return ""
        End If

        ' Get failed address
        i_start += 5
        i_end = str_invalid_email.IndexOf("]", i_start)
        str_invalid_email.Substring(i_start, i_end)

        Return str_invalid_email
End Function

' This function must remove (or disable) specified
' email address from mailing list
Sub RemoveEmailFromDatabase(ByVal str_invalid_email As String)
        ' TODO: Add your code here                        
End Sub
未发布 Windows Forms界面控件包Essential Studio for Windows Forms发布2017 v4
by Harriet666 keys 分享 1513933983173
Essential Studio for Windows Forms界面控件包含了高性能的Windows应用程序开发中所需的所有控件,如Grids、Charts、Gauges、Menus、Calendars、Editors等等。 到目前为止,我们开发Windows Forms 控件包已达十几年,所以该控件包是功能最齐全的控件集。除此之外,Essential Studio for WinForms还包含了一些特有控件,使您可以为应用程序添加Excel、Word和PDF格式文件的浏览和创建功能。
 
 

计算

数组公式计算
Excel中提供了对数组公式计算的支持。数组公式可以使用数组或一系列数据值执行多个计算,并返回一个或多个结果。这有助于简化公式表达式。例如,“= MAX(B1-C1,B2-C2,B3-C3,B4-C4,B5-C5)”现在可以用阵列公式“{= MAX(B1:B5-C1:C5) }”。

日期时间选择器

支持Office 2016主题
日期时间选择器控件支持Office 2016主题外观。
3cf9009f8fc24e058374276f3d8b158bojpg

DOCIO

增强Word转换成PDF功能
DocIO现在允许将带有行号的Word文档以其原始格式转换为PDF。
22d40794b650427d81577b92c4c5ff14ojpg

GROUP BAR

支持Office 2016主题
支持Office 2016主题外观,用于群组控件。
bc09d0030ed948aaabf990981a6fbd7cojpg

主框架栏管理器

支持Office 2016主题
主框架管理器控件支持Office 2016主题外观。
3e13844290e44422b68013d299856685ojpg

高级月历

支持Office 2016主题
高级月历控件支持Office 2016主题外观。
6f1de36f33ef4222922d703f6a09b2c0ojpg

RIBBON

快速访问工具栏的图标
为快速访问工具栏提供不同的图标,类似于Office多彩主题。
3883de1a67d047de902ef63607f65d54ojpg
定制
RIBBON系统按钮的外观可根据您的需求进行定制。
cbe4006720814c71bf53d4af887c3a0bojpg

电子表格

数组公式计算
Excel中提供了对数组公式计算的支持。数组公式可以使用数组或一系列数据值执行多个计算,并返回一个或多个结果。这有助于简化公式表达式。例如,“= MAX(B1-C1,B2-C2,B3-C3,B4-C4,B5-C5)”现在可以用一个阵列公式“{= MAX(B1:B5-C1:C5) }”。
Single-Cell Array Formula
cce526e4a7b84d659d4c0ef3d8008e40ojpg
Multi-Cell Array Formula
654a1a76fbe64f629c67b0b6408564a0ojpg

XLSIO

增强图像
图表元素(如图例、标题、绘图区和显示单元)的手动布局位置现在可以正确转换为图像。
1b2941b030d74fd28106463dcbc87372ojpg
未发布 轻松审计代码安全性,Windows 10有妙招
by Harriet666 keys 分享 1503998911618
如果你是软件开发人员,又希望自己开发的软件安全性高一点,那么当前的Windows 10企业内部预览版(10.0.16253)中就有一个功能可以做到。
 
它的位置在“设置 – > Windows Defender – > Windows Defender安全中心 – >应用程序和浏览器控制 – >漏洞保护设置”中,你可以为整个系统或特定程序启用自定义漏洞利用设置。其中有很多不同的保护特性并且许多都可以在审计模式下打开。在审计模式下,它不是在出现情况时终止进程,而是将事件写入事件日志。对于管理员,这就意味着其会允许软件继续运行,同时能够使我们意识到这一情况是何时发生的。对于希望通过了解这些情况以此来改进产品的人来说,它其实是提供了一个启用安全功能的附加好处,即无需重新编译(在某些情况下),就能告诉你确切的程序代码在当它在运行时遇到问题的位置。在版本10.0.16253中,可以进行审计的保护特性包括:
 
任意代码保护 - 防止非图像支持的执行代码和代码页修改(例如VirtualAlloc / VirtualProtect创建/修改的代码)
阻止低完整性图像
阻止远程图像
阻止不受信任的字体
代码完整性守护者
禁用Win32k系统调用
不允许子进程
导出地址过滤 - 将功能修补到另一个功能的一个常见方法中的一个步骤
导入地址过滤 - 将功能修补到另一个功能的一个常见方法中的一个步骤
模拟执行
验证API调用(CallerCheck)
验证图像依赖完整性
验证堆栈完整性
 
要充分利用此功能,我们需要安装Windows Performance Toolkit。它是Windows SDK安装程序的安装选项之一。当您启用了您感兴趣的设置后,打开管理命令提示符并浏览到Windows Performance Toolkit目录(通常为Program Files(x86) Windows Kits  {Version}  Windows Performance Toolkit)。您可以通过运行以下两个命令(在替换文件名所需的任何路径之后)启动并开始收集上述漏洞保护设置的跟踪以及解析堆栈跟踪所需的数据:
xperf - “PROC_THREAD + LOADER”-f“wdeg_klogger.etl”
 
xperf -start“WDEG” - “Microsoft-Windows-Security-Mitigations:0xFFFFFFFFFFFFFF:0xFF:'stack'”-f“wdeg_unmerged.etl”
在您运行任何想要收集的方案之后,您可以停止跟踪并将数据与以下内容合并(再次替换文件名所需的任何路径):
xperf -stop -stop“WDEG”-d“wdeg_merged.etl”
 
然后,您可以删除创建的前两个文件,因为此时您将拥有第三个所需的所有数据。您可以在Windows Performance Analyzer(WPA)中打开生成的etl文件,并查看数据。
 
您可以使用wpaPreset文件扩展名保存它,在WPA中加载数据,转到我的预设(在WPA的较新版本中的文件 – >窗口 – >我的存在),选择导入,浏览到保存预设的任何地方,选择它,并双击它以显示视图。另外,您还需要加载符号,以充分利用这一点。您可以在WPA中在File-> Configure Symbols下设置符号; 您需要将其指向msdl.microsoft.com/download/symbols上的Microsoft符号服务器以及您的符号服务器(或您没有符号服务器设置的符号文件的位置)。您可以在加载跟踪时自动配置WPA加载符号,但也可以通过转到文件 – >加载符号来手动加载符号。一旦完成,您将能够轻松地查看堆栈跟踪。它就会像下面这样:
 
以下是在创建上述过程中我为x64控制台应用程序编译的示例代码:
#include #include using namespace std;void* CreateCodeInVirtualMemory(BOOL writable)
{ BYTE code[3] = { 0x33, 0xc0, 0xc3 }; LPVOID result = VirtualAlloc(NULL, sizeof(code), MEM_COMMIT | MEM_RESERVE, writable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE); if (result)
{
  memcpy(result, code, sizeof(code));
} else cout << "VirtualAllocEx failed with error " << GetLastError() << endl; return result;
}void CreateCodeInVirtualMemoryAndExecute(BOOL useWritableMemory)
{ LPTHREAD_START_ROUTINE addr = (LPTHREAD_START_ROUTINE)CreateCodeInVirtualMemory(useWritableMemory); if (addr)
{  DWORD result = addr(NULL);
  cout << "Code at 0x" << hex << (void*)addr << " returned " << result << endl;
} else cout << "NULL address was not executed" << endl;
}void ExecuteIllegalMemory()
{
CreateCodeInVirtualMemoryAndExecute(FALSE);
} 
void PrintOptions()
{
cout << "Enter one of the following options:" << endl;
cout << "1 - Execute Memory Not Marked As Executable" << endl;
cout << "2 - Create Code in Virtual Memory" << endl;
cout << "3 - Create Code in Virtual Memory and Execute" << endl;
cout << "0 - Exit" << endl;
 
}void DecisionLoop()
{ while (true)
{  int selection;
  PrintOptions();
  cin >> selection;  switch (selection)
  {   case 0:    return;   case 1:
    ExecuteIllegalMemory();    break;   case 2:
    CreateCodeInVirtualMemory(TRUE);    break;   case 3:
    CreateCodeInVirtualMemoryAndExecute(TRUE);    break;   default:
    cout << "Invalid input" << endl;
  }
}
}int main()
{
DecisionLoop(); return 0;
}
 
在这里我没有去对它的应用做更多的介绍,但我相信我的抛砖引玉一定能够让更多的人对这一功能产生兴趣。
对于在事件查看器中的应用程序和服务日志中找到的大多数内容,您也可以以相同的方式完成此类操作——单击特定日志的属性,它将具有Provider-Name-Parts / LogName形式的名称。您只需要在xperf命令中使用“Provider-Name-Parts”部分即可。

 近期热门 - 点击最多
  1. python基于asyncio实现 Redis 的异步操作哈希数据写入 / 读取、发布订阅消息中间件
  2. Node.js 打印vite react+go项目目录树
  3. Angular入门:用Signals状态管理和Bootstrap基础样式实现的用户登录注册实例教程
  4. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  5. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  6. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  7. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  8. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别
  9. React Native使用fetch发送http登陆验证请求失败:无法读取set-cookie并显示network request failed
  10. 克服Redux的缺点在React/Native中使用消息队列,pubsub-js更加简洁的组件间通信和状态传递方法

  全端社区 - 最新回复
  1. python基于asyncio实现 Redis 的异步操作哈希数据写入 / 读取、发布订阅消息中间件
  2. Angular入门:用Signals状态管理和Bootstrap基础样式实现的用户登录注册实例教程
  3. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  4. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  5. Node.js 打印vite react+go项目目录树
  6. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  7. Windows与Mac通过git ssh和rsync实现文件共享互传
  8. Windows与Mac通过git ssh和scp实现文件共享互传
  9. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  10. 使用PubSub-JS时ReactNative在后台运行一段时间唤醒后,组件无法scribe到publish的事件,typescript实现一个事件订阅发布组件

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA