加入我们的团队,成为我们的教练!
Angular 2和Meteor 1.3 —敌还是友?
使用React Native和AWS Amplify进行用户身份验证(第2部分-应用程序布局)
Scala中的隐式机制
Docker基础
矮人基金会2018年夏季实习
如果没有损坏,请不要修复。 还是什么?
如果没有损坏,请不要修复。 还是什么?

当我答应写关于如何减少开发人员工作日的摩擦时,我相信大多数人希望我专注于非开发人员应该做的事情,以改善开发人员的工作寿命。 但是,让我们面对现实吧,导致摩擦, 糟糕的遗留代码的主要原因是我们自己的错。 毕竟,开发人员编写了糟糕的代码。 因此,让我们集中精力解决该问题。 软件开发人员有一种自然的倾向,那就是不使用已经起作用的代码。 毕竟,传统观点告诉我们,尝试修复有效的方法是一个坏主意。 即使在软件开发世界中,这种传统智慧通常也很有意义。 任何更改都涉及风险因素,除非您需要,否则您当然不希望冒险引入错误。 另一方面,我们需要考虑不更改代码的风险。 这种风险经常被忽略,因此我很高兴马丁·福勒(Martin Fowler)在其《 重构 》第二版的最新文章中提醒我们,他在与肯特·贝克(Kent Beck)合作时印象深刻,因为, […]真正脱颖而出的一件事是他[]​​不断修改代码库以保持其健康的方法[…] 我强烈建议认真的软件开发人员挖掘这两位专家(Martin Fowler和Kent Beck)的智慧,以便理解为什么不连续修剪的代码实际上会腐烂 。 以我的拙见,不断修改代码有很多原因。 例如,新的要求导致现有代码妨碍更改,或者随着时间的流逝,您对要解决的基本问题变得更加明智。 简而言之:当您变得更聪明时,请运用这种智慧不断改进您的代码。 如果您不继续修剪代码,如果您推迟重构所需的时间太长,那么您将得到无法管理的代码,希望您可以从头开始重写。 从头开始重写可能是唯一可行的选择,但是您可能仍然不得不将时间集中在其他地方。 不要误会我的意思。 我编写的代码无需更改就可以多年运行。 在极少数情况下,不要仅仅出于原理性考虑而更改代码。 总之,即使在代码正常工作的情况下,如果编写代码的方式不再足够好,您也应该对其进行更改。

为什么Ruby on Rails如此受欢迎?
为什么Ruby on Rails如此受欢迎?

毫无疑问,Ruby on Rails(又称“ RoR”或简称“ Rails”)是当今最需要的Web应用程序框架之一。 该模型视图控制(MVC)框架使用Ruby编写,为开发人员提供了数据库,Web服务和Web页面的默认结构。 它还有利于使用Web标准(例如JSON或XML)进行数据传输,以及使用HTML,CSS和Javascript(用于用户接口)以及最佳实践(例如编写RESTful代码)。 该框架最初于2004年作为开源发布,在2006年苹果宣布将RoR与Mac OS X v10.5“ Leopard”一起发布时达到了一个里程碑。在获得TIOBE的“ 2006编程语言”称号后,Node的发布2009年和2010年的.js和AngularJS似乎是Ruby编程语言的终结。 当我们进入2017年时,您可能会想,“为什么Ruby on Rails如此受欢迎?”世界上一些顶级公司(例如Airbrb,Github和Groupon)已经采用了该技术,并且不难理解为什么。 1. Rails已满堆 与HTML / CSS,Javascipt和Python等其他语言不同,Rails涵盖了前端和后端开发。 RoR开发人员可以构建完整的Web应用程序而无需依赖其他资源(同时学习其他语言),这使其在新兴公司中很受欢迎。 2. Rails建立在Ruby(一种动态且面向对象的语言)上 这个对程序员友好的框架消除了“ lam脚”的任务,使开发人员有更多时间专注于最酷的事情。 从处理数据库连接(再见SQL)到处理Ajax更新,Rails都将开发人员放在首位。 3. Rails缩短了上市时间 Ruby on Rails开发迅速。 Ruby“宝石”使用户管理和社交供稿等通用功能易于集成,非常适合CRM,CMS或电子商务系统。 4. Rails有一个很棒的在线社区 Ruby on Rails社区是目前最活跃的社区之一。 几乎每周的每一天,每个主要城市都会举行大量的会议和聚会。 这样可以轻松地为您的任何项目找到帮助。 在这个对初学者友好的框架上,还有很多在线资源可供选择。 如果您正在寻找一个优秀的Ruby on Rails开发人员(现场或远程),或者准备开始使用此令人兴奋的技术构建的第一个项目,那不外乎techsuitenyc.com。 Samuel Corso是TechSuite的首席执行官。 他热衷于将优质技术带给商业领袖和企业家。

在Rails中使用Twilio的SMS两要素身份验证重置密码
在Rails中使用Twilio的SMS两要素身份验证重置密码

源代码: https : //github.com/glassjoseph/grab_bag/commit/db99da38db313ac9f5b749e810f9237bbb036550 注意:本教程假定您的Rails应用程序具有适当的身份验证系统。 如果没有,请参考下面的视频来手动进行身份验证过程。 ConfirmationSender模型:进行此过程所需的第二个模型是ConfirmationSender。 第3行调用您先前创建的generate方法,并将其存储到名为Verification_code的本地变量。 请注意,第4行上的用户的Verification_code列正在由上述变量更新。 此时,您应该运行迁移以使用带有字符串数据类型的verify_code列更新用户模型。 第5行在我们现在将创建的MessageSender类上调用send_code方法。 MessageSender模型:创建MessageSender模型。 在其中,创建一个send_code方法。 为了使此方法正常工作,所有用户必须在数据库中存储一个有效的电话号码。 创建按钮以更新密码:在视图中,为用户创建按钮以开始密码重置过程。 然后在您的路由文件中为按钮创建相应的路由。 在下面的示例代码片段中,路由嵌套在用户下方。 这是我的应用程序的一种设计选择,不是必需的。 密码控制器:使用更新操作创建一个密码控制器,以容纳send_confirmation方法,然后将用户重定向到我们现在将创建的确认控制器。 确认控制器:在新创建的确认控制器中,创建一个新操作为当前用户呈现表单。 您还需要创建相应的路由。 在视图中,输入以下文本以创建一个表单,供用户输入其验证码。 用户提交表单后,他们将在确认控制器中点击创建动作。 如果验证码正确,则会创建一个经过身份验证的会话,并将用户重定向到表单以创建新密码。 如果不正确,将再次呈现验证表单。 返回密码控制器:创建一个编辑操作,该操作设置当前用户并呈现一个供用户输入新密码的表单。 经认证? 此方法可确保用户仅在先前输入正确的验证码后才能到达编辑路径。 还需要创建相应的编辑/更新路径(第21/22行)。 仍在密码控制器中,创建一个更新方法,以检查密码字段是否正确填写。 如果是这样,则用户密码将通过密码参数进行更新。 结论:完成上述所有步骤之后,我们的用户现在应该使用Twilio的SMS两因素身份验证过程输入新密码。

好消息! 您不再需要手动生成文档
好消息! 您不再需要手动生成文档

没有人喜欢手工制作文档。 这需要太多时间。 很难使用正确的表格。 这简直无聊。 但是,生产最新的文档至关重要。 大多数前端开发人员都不了解后端开发,因此您的API文档为他们以及计划使用您的应用程序的任何其他人员提供了有关后端工作方式的重要信息源。 但是,尽管我们都知道这一点,但大多数后端开发人员仍无法可靠地生成文档……而我们自己的开发人员也不例外。 在本文中,我们将引导您完成自己的工作,以可靠地生成API文档,以及如何开发一个简单,逐步的过程来自动生成我们的文档-您现在可以部署该过程。 当我们开始为公司StartupCraft Inc.开发多种产品时,我们采用了标准的文档编制流程。 每次我们的后端开发人员发布新功能时,他们都必须手动更新其文档,并将更改通知我们的前端工程师。 但是我们一直处于紧缩模式。 我们的API处于不断变化的状态。 我们的后端不断更新。 而且由于我们的后端工程师对关键任务,时间敏感型开发不知所措,因此他们通常缺乏维护文档的带宽。 结果是:我们的前端开发人员总是落伍,他们开始每天与我们的后端工程师联系,以简要了解任何未记录的更改。 我们知道我们不能走这条路。 在StartupCraft Inc.,我们创建了干净,高效,高效的工作流程,而我们的文档编制过程却混乱,低效且无效率。 我们的环境变得难以在其中工作,而且它与我们的价值观不符。 因此,我们着手为自己的内部运营创建一个原始的解决方案,并帮助像您一样遭受类似挑战的社区成员。 在我们尝试解决方案之前,这里是我们的技术堆栈。 我们正在将SPA(单页应用程序)和API视为独立的应用程序进行审查,并且在前端使用React和Ember,在后端使用Rails API。 首先,我们只是颠倒了现有的手动流程。 我们只是要求后端开发人员在实际实现每个功能之前先创建它们的文档。 此修复程序很有前途。 我们使用Apiary作为API文档,让后端工程师可以模拟文档,而前端工程师可以在不做任何调整的情况下将它们用作真实的API。 在我们的后端工程师完成了功能的实际逻辑之后,所有前端工程师要做的就是将端点从模型更改为真实模型。 但是我们也遵循JSON API规范,这使得在纸上难以构建功能的完整结构。 我们试图通过使用通用格式来解决此问题,但即使如此,也需要进行实质性调整和许多交换问题。 最终,我们不得不放弃这个解决方案,并承认一个硬道理-手动文档编制总是太复杂了,因此总是失败。 从这一认识出发,我们决定通过开发一个完全自动化的文档生成过程来简化该过程。 我们开始研究,并迅速发现了有希望的领先者。 我们注意到开发人员通常首先看测试,因为测试为每个特定功能提供了最相关的示例。 而且,测试自然会与大量其他流程建立联系,开发人员在构建功能时已经必须运行测试。 意识到这一点,解决方案就变得显而易见了-我们只需要找到一种方法即可自动从测试过程中生成文档。 这种认识使我们找到了一个很棒的宝物,RSpec API Doc Generator。 有了这个令人惊叹的库,我们迅速建立了一个过程,只需四个简单的步骤即可自动从测试套件中生成文档: 将正确的宝石添加到gemfile 初始化和配置gem 从测试生成文档 发布文档 这四个步骤立即解决了我们在文档编制方面的难题,我们认为它也可能解决您的难题。 因此,让我们深入了解自动化文档编制过程中的每个步骤,并向您展示如何尝试该解决方案。 请注意,为简洁起见,我们将不介绍底层的应用程序体系结构。 但是要测试我们的过程,只需执行以下步骤: 从头开始创建一个新项目,或仅使用此示例项目。 在此处找到此示例项目的Apiary文档。 如果需要在Apiary上创建新的API,请单击此处,注册一个新帐户,然后选择“在API蓝图中启动API”选项。 创建API后,将其连接到GitHub […]

持续安全地升级Laravel
持续安全地升级Laravel

由于我们通常优先考虑向产品添加新功能,因此通常不考虑升级框架。 但是,如果长时间不升级框架,则升级框架将成为一场噩梦。 从旧版本过渡到最新版本不仅是一项艰巨的工作,而且由于进行了大量更改,因此很危险。 在本文中,我将向您展示如何使用Laravel Shift轻松安全地升级Laravel。 大跳是一场噩梦 去年,我们将Lumen 5.1应用程序升级到Laravel 5.6,这是很多工作。 首先,我们必须将PHP 5.6升级到PHP 7.2,因为Laravel不再支持它。 升级PHP后,我们注意到PHPUnit 4不支持PHP 7,因此我们也尝试对其进行升级。 但是,Lumen 5.1仅支持PHPUnit 4 –因此,我们最终同时升级了Laravel和PHPUnit。 经过艰苦的工作,我们创建了一个巨大的请求,其中包含太多更改的文件。 几乎不可能审查所有更改。 从这次经验中,我向自己保证将在发布较新版本时尽快升级该框架。 但是,一件好事是我们编写了许多单元和集成测试。 即使出现问题,我们也可以在发布产品之前注意到它。 Laravel Shift是你的朋友 升级到Laravel 5.6后,出现了5.7版。 这次我们使用Laravel Shift进行了升级,从而节省了大量时间。 Laravel Shift是一项服务,可扫描您的Laravel应用程序并自动创建拉动请求以升级Laravel。 您所要做的只是选择一个存储库并支付一些钱。 就我而言,它仅花费9美元,但价格取决于您应用程序的Laravel版本。 一两分钟后,您会收到一条拉动请求,上面有非常详细的注释。 您需要查看更改的文件,检查Shift中的注释,运行composer update并确认所有测试均通过。 特别是,您应该仔细检查与Laravel默认值不同的配置文件。 以我为例,只花了几个小时就升级了我的Laravel应用程序。 超级简单! 我使用Shift升级了三个应用程序。 感谢JMac创建如此出色的服务! 编写测试 Laravel Shift是一项超级有用的服务,但并不完美。 它可能会破坏某些现有功能。 但是,您可以在正式发布之前注意到这一点,并且如果您拥有测试代码,则可以更加放心。 因此,每次实现新功能时编写测试非常重要。 错误监控 即使编写测试,也几乎不可能涵盖所有情况。 因此,监视应用程序错误也很重要。 就我而言,我使用Sentry进行错误监视。 将Sentry安装到Laravel应用程序非常简单。 当应用程序中引发异常时,Sentry将向您发送通知。 您可以修复错误或回滚发行版。

流行的排序算法
流行的排序算法

在计算机科学中,排序算法是一种将列表中的元素按特定顺序放置的算法。 几乎所有从计算机发出的列表都按某种顺序排序,并且计算机内部还有许多用户看不到的排序列表。 已设计出许多巧妙的算法来有效地将值排序。 以下是一些流行的排序算法: 气泡排序 冒泡排序 -冒泡排序(有时也称为沉没排序)是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻项,并以错误的顺序交换它们。 重复通过列表,直到不需要交换为止,这表明列表已排序。 该算法是一种比较排序,以较小元素“冒泡”到列表顶部的方式命名。 尽管该算法很简单,但是即使与插入排序相比,它对于大多数问题而言仍然太慢且不切实际。 合并排序 -合并排序(也通常拼写为mergesort)是一种高效的,基于通用的,基于比较的排序算法。 大多数实现会产生稳定的排序,这意味着实现会保留排序后的输出中相等元素的输入顺序。 Mergesort是由John von Neumann于1945年发明的分而治之算法。 从概念上讲,合并排序的工作方式如下: 1)将未排序的列表划分为n个子列表,每个子列表包含1个元素(将1个元素的列表视为已排序)。 2)重复合并子列表以产生新的排序子列表,直到仅剩1个子列表为止。 这将是排序列表。 合并排序复杂度 最糟糕的复杂度: n * log(n) 平均复杂度: n * log(n) 最佳复杂度: n * log(n) 空间复杂度: n 方法:合并 稳定:是的 选择排序 选择排序 -选择排序是一种排序算法,特别是就地比较排序。 该算法将输入列表分为两部分:已排序项目的子列表,该列表从左到右在列表的前部(左侧)建立;剩下的要排序项目的子列表,它们占据了列表的其余部分。清单。 最初,已排序的子列表为空,未排序的子列表为整个输入列表。 该算法通过在未排序的子列表中找到最小(或最大,取决于排序顺序)元素,将其与最左边的未排序元素交换(交换)(按排序顺序排列),并将子列表边界向右移动一个元素来进行。 堆排序 – 堆排序是一种基于比较的排序算法。 可以将Heapsort视为一种改进的选择排序:类似于该算法,它将输入划分为已排序区域和未排序区域,并通过提取最大元素并将其移至已排序区域来迭代地缩小未排序区域。 改进包括使用堆数据结构而不是线性时间搜索来找到最大值。 尽管在大多数机器上实践中比起快速实施的快速排序要慢一些,但它具有更有利的最坏情况O(n log n)运行时的优点。 堆排序算法涉及通过首先将其变成最大堆来准备列表。 然后,该算法将列表的第一个值与最后一个值重复交换,将堆操作中考虑的值范围减小一个,然后将新的第一个值筛选到其在堆中的位置。 重复此过程,直到所考虑的值的范围为一个值的长度。 这些步骤是: […]