Guia de Desenvolvimento Laravel-铂 1个
使用AWS Mobile构建React Native应用-第1部分-身份验证
笔记本电脑上Windows 10上VirtualBox上的BunsenLabs
Golang的pprof,生成和读取配置文件-第1部分
使用AWS Lambda的2年
使用Istanbul增加代码覆盖率
在.NET Standard 2.0中从PDF提取文本
在.NET Standard 2.0中从PDF提取文本

从PDF提取文本是常见的数据处理任务之一。 在这个故事中,我们将看一下如何使用Aspose.PDF for .NET从整个PDF文档中提取文本的示例。 使用此库有一些优点: 它是具有本机核心的.NET / .NET Standard 2.0,Java和Android平台的单个跨平台API,因此您不需要其他依赖项。 从/到PDF的大量数据转换器; 广泛的编辑PDF功能以及其他功能,如签名,加密,打印等; 在此示例中,我们在Visual Studio 2017中使用了标准模板“控制台应用程序(.NET Core)”。 请注意,Aspose.PDF是商业产品,但是您可以在此处获得临时许可。 从PDF提取文本的最简单方法是使用PdfExtractor类。 为了提取文本,我们需要完成以下步骤: 创建一个PdfExtractor类的对象 使用BindPdf()方法绑定输入的PDF文件。 调用ExtractText()方法将所有文本提取到内存中。 调用GetText()方法。 PdfExtractor还可以将文本提取到单独的文件中。 要使用此功能,我们需要使用HasNextPageText()方法的check返回值运行while循环,并使用GetNextPageText()方法获取文本。 所以,让我们开始吧。 在此示例中,使用了命令行解析器库来解析命令行参数。 因此,此控制台应用程序的实现非常简单: 以下代码片段显示了命令行选项的类: 结论 本文考虑了一个简单的示例,但是.NET库的Aspose.PDF也具有用于更复杂情况的工具。 要了解更多信息,请遵循《开发人员指南》或对本文发表评论。

伟大的印度开发者峰会我的分支机构– Ramesh Rao –中
伟大的印度开发者峰会我的分支机构– Ramesh Rao –中

GIDS一直是一个有趣的地方,我将通过这篇文章尝试捕获GIDS的16届峰会。 我们不是科学家。 我们不是工程师;我们不是工程师。 我们是讲故事的人。 看到所有开发人员,我们自己的“ Dosa Lover” Scott Davis的心跳,总是很棒的。 Scott最初遇到的一个问题实际上引起了每个开发人员的共鸣,当他们开始进行编码时,他们陷入“等待一分钟! 我该如何命名这个变量/方法/类” ; 他提到即使我们每天都这样做,我们还是对命名有过分的恐惧。 事实证明,命名总是很容易出错。 之后,Scott接触了我一直以来最喜欢的话题,即单元测试。 进入这部分讨论的途径非常了不起,他敦促我们所有人按照维基百科上“计算机科学家”中所述的正式定义进行操作。 计算机科学家的主要目标是开发(和验证)模型(本质上通常是数学模型),以估计基于计算机的系统(处理器,程序,计算机与人的交互,计算机与其他计算机的交互等)的特性。发现允许改善性能(更快,更好,更便宜等)的设计的首要目标。 然后是(这张)著名的幻灯片,上面有这句话 “您怎么称呼不编写单元测试的程序员-计算机伪科学家” 。 验证是基本目标,对于遵循上述定义至关重要,而对于验证则不可避免地要进行单元测试。 斯科特继续前进,为我们指出了“软件工程师”的 Wiki定义,该定义与计算机科学家相似。 在无数关于代码覆盖率的幻灯片之后,Scott敦促我们忽略覆盖率数字,并要求我们专注于热图,以描述代码库中的问题。 他提到我们倾向于跟踪易于跟踪的数字,而不是跟踪重要的数字。 在Agile 2015上停止使用用户故事并开始使用假设— Jim Benson 斯科特(Scott)研究了开发人员的第二个基本问题,即估算,该记录在所有工程流中一直存在错误,因此我们的流也不例外。 他谈到了规划谬误,以使我们了解乐观估计。 敏捷的节奏和凝聚力的敏捷团队中日常站立的重要性,是斯科特给我们的最后一点。 斯科特说,如果只有我们可以写假设代替用户故事,事情就会变得完全不同,而且情况会更好。 Redux:网络功能编程 帕蒂克·帕特尔(Partik Patel) 会议介绍了Facebook Flux的体系结构和设计原则 Redux是最流行的Flux实现。 他补充说: “ Redux确实可以与Angular一起使用,它并不直接依赖于 React , 但是它们之间的相互作用是无缝的,它们共享共生关系” 。 Redux以不变的方式帮助维持应用程序中的状态,是的,可能会有喊叫声,这是什么不变的方式,为什么呢? 那是因为对于任何创建一个庞大的Web应用程序的人来说,状态管理都像下面这样: Flux Architecture提供了一种具有一种绑定方式的顶部驱动方法,这意味着状态更改从顶部的动作向下倾斜到底部。 Action,Reducer和Store都是Redux战场中的组件,可满足以下目的: 动作 这些是我们应用程序中的动作 。 它们可以由用户或服务器端发起。 […]

使用实体框架核心在Xamarin中进行数据持久化
使用实体框架核心在Xamarin中进行数据持久化

得益于.Net Standard 2和.Net Core,我们可以利用Entity Framework Core的惊人潜力。 它是一个ORM(对象关系映射器),允许以可移植且有效的方式操作数据库。 本指南说明如何在Xamarin Forms应用程序中使用Entity Framework Core将数据持久存储在设备上。 介绍 微软将实体框架核心定义为: 实体框架(EF)核心是流行的实体框架数据访问技术的轻量级,可扩展和跨平台版本。 因此,基本上,这是一个对象关系映射器(简称ORM)。 除此之外,EF Core 2.0版与Xamarin平台和.Net标准2.0兼容。 因此,我们可以为iOS,Android和其他Xamarin目标编写单个持久性代码库。 还有什么 !。 如果您还没有听说过这项技术,那么我真的建议您借助互联网上提供的大量文档来阅读它。 本指南不是EF Core的深入指南,仅专注于将其添加到Xamarin应用程序中。 您可以在此处获得初始代码以关注本文。 IT由主/详细应用组成,该应用显示了从免费JSON API获取的Post对象列表。 当用户单击列表上的项目时,将显示其详细信息视图。 该应用程序使用mvvm和IoC原理。 如果您对这些词感到好奇,可以在这里按照我之前的指南进行操作。 每次出现列表视图时,我们都尝试调用JSON API,然后将结果替换为获取的数据。 当前的实现不会将获取的数据持久保存在设备上。 因此,如果我们以离线模式启动该应用程序,则不会显示任何数据。 我们将通过使用EF Core持久保存获取的数据来解决此问题。 准备好了 ? 去🏃 添加EF Core软件包 在编写任何EF Core代码之前,我们需要首先添加两个NuGet包。 从逻辑上讲,第一个是Microsoft.EntityFrameworkCore ,第二个是Microsoft.EntityFrameworkCore.Sqlite 。 第一个包允许使用EF Core API,而第二个包允许使用带有EF Core的SQLite数据库。 SQLite是一种在移动平台(iOS,Android,UWP)上使用的数据库技术,并且在PC和macOS上也可用。 因此,在Xamarin.Forms应用程序的上下文中,自然使用SQLite。 Microsoft.EntityFrameworkCore.Sqlite称为SQLite的数据库提供程序,由Entity Framework Core项目正式维护。 […]

实体框架:提高绩效
实体框架:提高绩效

当添加或修改大量记录(10³和更多)时,实体框架的性能远非完美。 原因是框架的体系结构特性,以及生成的SQL的非最佳性。 向前迈进,我可以揭示通过绕过上下文保存数据可以极大地减少执行时间。 让我们考虑如何改善EF性能。 1.使用实体框架的标准方法进行插入/更新 让我们从插入开始。 将新记录添加到数据库的标准方法是将它们添加到上下文中,随后进行保存: context.Orders.Add(order); context.SaveChanges(); 每次Add方法的调用都会导致对DetectChanges内部算法的“昂贵”(就执行而言)调用。 该算法扫描上下文中的所有实体,将每个属性的当前值与上下文中存储的源值进行比较,并更新实体之间的链接,等等。直到EF6发行,在将实体添加到其中时禁用DetectChanges内容是提高性能的最流行方法: context.Orders.Add(order)); context.Configuration.AutoDetectChangesEnabled = true; context.SaveChanges(); 另外,不建议在上下文中存储成千上万个对象,也不建议通过保存上下文将数据保存在块中,并为每个N个对象创建一个新的上下文,如此处所示。 最后,在EF 6中引入了优化的AddRange方法。该方法将性能提高到Add + AutoDetectChangesEnabled绑定级别: context.Orders.AddRange(orders); context.SaveChanges(); 不幸的是,上面列出的方法不能解决核心问题,即:在将数据保存到DB的过程中,将为每个新记录生成一个单独的INSERT查询! 插入[dbo]。[顺序]([日期],[数字],[文本]) 值(@ 0,@ 1,NULL) Update的情况相同。 如下代码: var orders = context.Orders.ToList(); // ..写入新数据 context.SaveChanges(); 导致对每个修改的对象执行单独的SQL查询: 更新[dbo]。[订单] SET [文字] = @ 0 在哪里[[Id] = @ 1) 在最简单的情况下,EntityFramework.Extended可以帮助: //将状态为1的所有任务更新为状态2 context.Tasks.Update( t => t.StatusId == […]

如何从自定义图像构建图层?
如何从自定义图像构建图层?

在我这一方面,研究机制的案例是构建覆盖可见区域的热图。 由于要获得3D地球中实际可见的区域非常棘手,因此我至少在某种程度上已经失败了,因此我决定看一下TiledImageLayer在Web World Wind中是如何实现的,同时,我发现内部使用的机制实际上可用于包含图像的任何层。 第一个重要部分是查看图层中的TiledImageLayer。 TiledImageLayer基于与当前距地球的距离相关的扇区创建用于检索和缓存图像的抽象。 为了检索相关区域的图像,使用了内部方法restoreTileImage。 / ** *检索指定图块的图像。 子类应重写此方法才能进行检索, *计算或创建图像。 * @param {DrawContext} dc当前绘制上下文。 * @param {ImageTile} tile为其检索资源的tile。 * @param {Boolean} preventRedraw为true时,成功抑制图像时抑制重绘事件的产生 *检索,否则为false。 * @受保护 * / TiledImageLayer.prototype.retrieveTileImage = 函数 (直流,平铺,抑制重新绘制){ 每当视图变化足够大时,都会调用retrieveTileImage函数。 此方法接收当前图形的上下文,它要求的区域作为图块,以及我们是否不应在此上下文中重绘。 这是该方法的默认实现: 如果 ( 此 .currentRetrievals.indexOf(tile.imagePath)<0){ 如果 ( 此 .absentResourceList.isResourceAbsent(tile.imagePath)){ 回报 ; } var url = this .resourceUrlForTile(tile, this .retrievalImageFormat), 图片= […]

使用WPF自定义控件—第II部分模板和触发器(如何学会停止担心和喜欢xaml)
使用WPF自定义控件—第II部分模板和触发器(如何学会停止担心和喜欢xaml)

在之前的博客中,我分享了我的幼稚,第一次尝试拼凑一个切换按钮,该切换按钮在按下时会更改其内容。 例如… 错误的方式(至少对于View是…) 我最初的方法是避开难看的xaml并编写一些C#类并将状态和行为绑定到最小的xaml。 这是使用INotifyPropertyChanged的规范,轻量级的绑定技术,它非常适合绑定View 模型 ,但对于View,在xaml中实现它要优雅得多。 尽管这是构建视图的错误方法,但这仍然是一个很好的学习方法,因为这些技术对于构建视图模型至关重要。 正确的方式 完成这项工作后,我便着手进行重构以包含我在此过程中学到的概念。 最小化后面的查看代码 首先,我删除了要替换的所有CLR元素。 剩下的结构要简单得多…… 尽管我仍然需要自动化功能,因为我有一个按钮可以被另一个按钮操作,但是View现在要简单得多。 StaticButton类型仅具有Options和and InitialState属性,并且不实现INotifyPropertyChanged因为不需要动态绑定:这些值由xaml解析器复制一次。 现在的目标是在xaml中实现所有UI行为。 样式,触发器和控制模板 WPF提供了通过样式和模板来自定义标准控件的外观所需的所有功能。 样式基本上是一个带有一堆设置器的对象,将在使用控件上执行以设置其属性。 它还包含触发器,这些触发器将基于某些状态事件调用设置程序。 因此,让我们添加一个样式触发器来更改按钮的内容并在选中时查看。 令人失望:不起作用。 优先顺序 有几个问题: 内容是在标记中设置的,它将覆盖样式中的所有设置 该按钮在选中时已经具有更改颜色的默认行为,因此需要覆盖此行为。 第一个很容易修复,只需从标记中删除内容,然后为样式的默认(未选中)状态添加设置器即可。 好的,这固定了内容部分…… 第二个问题是一罐蠕虫。 所有控件都有一个ControlTemplate并且无法覆盖其中定义的行为的特定方面。 ControlTemplate将通过特定事件设置为特定值的任何属性优先于Style和标记中设置的值。 如您所见, IsChecked背景色就是其中之一。 更改此设置的唯一方法是创建一个自定义ControlTemplate ,该ControlTemplate支持所有现有行为以及所需的自定义。 注意1:在样式中设置的任何触发器,如果​​其ControlTemplate在相同事件上具有设置了相同属性的触发器,则将被忽略。 这是由于命令优先级。 根据MSDN,样式触发器的优先级高于ControlTemplate触发器。 但是,我观察到的行为是完全相反的。 注意2:在编写本文时,无法覆盖ControlTemplate的一部分,您必须创建一个完整的新模板并对所有相关行为负责。 自定义控制模板 说了这么多,实际上很容易获得默认模板的副本并进行编辑。 在VS 2013中,转到“属性”窗口(在xaml中选择了按钮),然后在“杂项”部分中的“模板”属性右侧单击一个小的神秘框。 然后选择转换为新资源,模板的副本将被写入xaml的Window.Resources部分。 还将对模板的引用拖放到标签中。 然后,您可以查看触发器并可以修改所需的对象(在本例中为IsChecked 。 如此处所述,模板需要具有根FrameworkElement,在默认情况下,这是Border。 似乎根元素充当模板中目标的代理,因此,如果要设置按钮的Background属性,则可以通过设置模板根元素的Background属性来实现。 您可以在上面的触发器中看到这一点。 无论如何,好的:可以。 Visual Studio将模板添加到了窗口资源字典中,并为其提供了ToggleButtonControlTemplate1的x:Key […]

Google对话的本地化操作
Google对话的本地化操作

此时,您应该可以在项目边栏中看到新的语言环境。 对项目进行更改时,所做的更改将应用​​于选定的语言环境。 因为我的项目已经针对“ en”语言环境创建,所以在这里我选择了“ it”,以便我可以调整实体和意图以使其适合意大利语言环境。 我们将开始修改意图,以便意大利用户在使用我的应用程序时获得个性化的体验。 我将从为项目打开默认的欢迎意图开始。 我的“ zh-cn”本地的文字回复为: 现在,我们正在编辑“ it”语言环境的意图,我们可以继续针对意大利语进行自定义: 我的项目中还有一个名为learning.chord的意图-为此,我将继续对“ it”语言环境再次执行相同的操作,并调整意大利语的可接受用户表达式: 您需要确保调整所有文本以用于响应,接受的表达式以及充当项目中所选区域设置的输入或输出形式的任何其他内容。 完成后,这将足以满足您的项目的要求,以支持DialogFlow内部包含的逻辑的不同语言环境。 但是,如果您使用的是DialogFlow外部的逻辑(例如firebase云函数),则还需要在此代码内添加一些语言环境检查。 为了从代码中的逻辑中获得本地化的响应,有两种不同的实现方法,在本文中,我们将研究在npm上使用i18n库。 您可以按照链接上的步骤操作,将此包添加到您的项目中。 为了在我们的应用程序中使用本地化的字符串,我们将需要为每个本地化提供不同的字符串文件。 我们将这些内容放置在Google Project目录中我们操作内的locales目录中。 因为我们将在我们的应用程序中进行英语和意大利语本地化,所以我为每个应用程序创建了一个json文件。 这些json文件中的每个文件都包含一个用于检索语言环境字符串的KEY以及一个用于指定键的VALUE 。 这是我的it-IT.json和en-US.json文本文件的内容: 现在我们已经在应用程序中为字符串定义了两个语言环境文件,我们可以继续在项目中使用它们了! 我们将需要包含对i18n的引用并在我们的.js文件中进行配置: const i18n = require('i18n'); i18n.configure({ 语言环境:['en-US','it-IT'], 目录:__dirname +'/ locales', defaultLocale:“ zh-CN” }); 如上所述,在配置过程中,我们需要定义三件事: 项目支持的语言环境。 这些必须与我们的区域设置文本文件的名称匹配。 相对于我们要在其中执行配置的文件的位置,存储区域设置文本文件的目录。 我们希望将其用于项目的默认语言环境-最好将其定义为后备。 现在在我们的项目中设置了i18n,我们可以继续使用它。 我们需要首先设置希望我们的i18n实例使用的语言环境。 幸运的是,Dialogflow sdk为我们提供了一种可用于获取当前用户的语言环境的方法。 然后,我们可以使用它来分配i18n使用的语言环境: const app = new ApiAiApp({request,response}); i18n.setLocale(app.getUserLocale()); […]

在Aurelia中实施MVVM
在Aurelia中实施MVVM

欢迎阅读本系列的第3部分,该系列回顾了Brian Noyes撰写的Pluralsight课程Aurelia基础知识。 Brian是专业技术解决方案开发公司Solliance的CTO和架构师。 Brian是Microsoft区域总监和MVP,专门研究富客户端技术,以及使用WCF和ASP.NET Web API构建支持它们的服务。 您可以通过他的博客(http://briannoyes.net)关注Brian。 同样在本系列中: 第1部分-Aurelia先决条件 第2部分-入门 第3部分-实现MVVM 第4部分-使用依赖注入 关注点分离 MVVM代表Model-View-ViewModel。 它主要是关于设法实现关注点的良好分离。 布赖恩用类比的方法来分离关注点。 您是根据衣服类型将衣服分成几堆的人吗? 还是只是把所有东西都放在一起? 您一开始不整理衣服就节省了一些时间。 但是,当您需要穿衣服时,需要花费更多的时间才能找到想要的东西。 Brian展示了HTML和JavaScript的示例,没有任何关注点。 结构,交互逻辑和UI元素访问都发生在同一文件中,这使得很难理解应该去哪里。 从长远来看,花点时间组织代码可以节省大量时间和精力。 使用MVVM模式和诸如Aurelia之类的框架,我们可以很好地分离关注点。 MVVM的目标和优势 Brian解释了以下目标: 可维护性 可测性 可扩充性 MVVM关键概念 MVVM是用于构造客户端代码的体系结构,它是MVC模式的派生产品。 也许MVC与MVVM之间的主要区别在于,视图与MVVM中的viewModel之间正在进行交互。 在MVC中,视图和控制器通常具有不同的生存期,但MVVM却并非如此。 同样在MVC中,不同元素之间的交互通常是通过方法调用来完成的。 而是将MVVM设计为用于丰富的数据绑定系统。 MVVM模式责任 Brian从模型开始讨论了MVVM模式中每个元素的职责: 模型 该模型包含客户端数据结构。 它可以具有计算的属性和验证逻辑。 视图 视图是用户在屏幕上看到的内容的结构定义。 它还包含ViewModel上属性和方法的绑定,这些通常是HTML属性。 视图模型 ViewModel的主要职责是向视图提供数据以进行表示和操作。 它还封装了交互逻辑。 Brian展示了ViewModel的示例,该模型允许模型直接与视图一起使用。 他称其为直接暴露模型对象。 我们还看到了一些包装模型数据的示例。 这不是模型和视图之间的精确映射,因为我们在ViewModel中还有其他数据集。 Brian给出的示例是: 一个基于其他模型数据设置的boolean showCustomerAlert 订单集合,其中每个订单由许多模型数据组成 最后,我们看到一个客户端状态示例: […]

适用于Mac OS的Vulkan vs Metal
适用于Mac OS的Vulkan vs Metal

这是我正在编写的一系列文章的序言,其中涉及通过MoltenVK使用Vulkan作为macOS上的渲染API,包括如何在Xcode中进行设置以及如何构建和运行基本的渲染器。 我希望展示它既可行又有价值,并帮助您入门。 简而言之,是的,您可以将Vulkan用于下一个图形项目,目标macOS,而不必担心供应商锁定或必须编写两个单独的渲染引擎。 Vulkan vs Metal戏剧 跨平台渲染API早已使用OpenGL。 如果您尚未使用它,那就知道它很糟糕。 它充满了遗留的废纸as,可作为巨型状态机运行,否则将成为过时的笨蛋。 (尝试在macOS上进行任何高级操作特别令人不快。) 支持OpenGL的人Khronos决定是时候构建现代GPU API了,以利用新的设备功能并清除问题。 是! 苹果公司考虑使用Vulkan。 一会儿。* 就像在《指环王》中那一刻,只要将金戒指扔进熔岩坑就可以永远消灭邪恶的那一刻一样,但人类的贪婪和自尊心却被阻挠了。 苹果公司认为做自己的事情会更酷,因此将其命名为Metal,而全世界都没有一个好的跨平台图形API的希望就落空了。 然后有人说,操,让我们在Metal上做Vulkan,MoltenVK诞生了。 MoltenVK最初是一个商业项目,但此后一直免费且开源(感谢Valve的捐赠?)。 不久之后,Apple弃用了OpenGL支持,或多或少迫使人们使用Metal。 还是他们希望如此! * [编辑]感谢 Fedy 指出Metal的发布早于Vulkan的发布。 通过我的拼凑,Khronos Group(可能包括Apple成员)正在讨论新的API,Apple与Metal脱颖而出。 Khronos将其投入使用,AMD捐赠了Mantle来加快速度。 苹果本来要先与《金属》一起推向市场,但目前尚不清楚苹果公司将在多大程度上参与其中。 尽管* GL的参与暗示他们会的,但也许从未期望他们这样做。 Vulkan on Metal是否可行? 在另一个兼容的API上运行一个图形API似乎并不理想。 我知道至少有一家公司通过了这一想法(作为OpenGL的替代品),因为它很复杂。 但是实际上,它非常干净。 这是因为MoltenVK充当Vulkan的第0层驱动程序。 从您的应用程序的角度来看,它是完全透明的。 一旦将其作为(静态或动态)库包含在内,您就不再与之交互。 所有客户端代码都直接与Vulkan交互,就像在其他平台上一样。 您不与MoltenVK或Metal互动,仅与Vulkan互动。 一种API来统治它们。 MoltenVK的运行方式与任何其他Vulkan驱动程序相同,不同之处在于MoltenVK会将命令转换为Metal,并将Metal Talks转换为GPU。 性能? 如果有性能问题,我似乎还没有。 同上的错误和兼容性问题。 我并不是说这种集成是完美无缺的,但是确实可以说是开箱即用的。 MoltenVK是一个活跃的项目,因此任何问题都可能得到解决。 它也是开源的,这意味着您不必等待修复程序,您可以自己进行修复。 除此之外,我还没有建立任何基准来直接比较这两种方法。 我将来可能会。 当然,您可以只使用Metal。 Metal […]