Monthly Archive: July 2020

Github中的Javascript学习资源推荐 0

Github中的Javascript学习资源推荐

Github上有很多关于Javascript的学习资源,这些资源有教程,有博客,有源码等等。下面就简单介绍一些我看过的Github上的项目: JavaScript Algorithms and Data Structures 这是一个用JavaScript实现算法和数据结构的项目,更重要的是他还支持中文,想学JavaScript的同学去看看吧。 JavaScript Questions 他列出很多和JavaScript相关的进阶问题,并且给出了答案。同样的,他也支持中文。 clean-code-javascript 我们应该都读过那本很流行的书《代码整洁之道》,这个项目就是把它所涉及的内容应用到JavaScript中。 What the f*ck JavaScript? 这个项目总结了很多好玩或者很奇怪的JavaScript相关的内容。 33-js-concepts 每个JavaScript开发者都需要知道的JavaScript内容 Awesome JavaScript Learning JavaScript学习相关的网址介绍。 Learn-JavaScript 这个项目集合了各种JavaScript的教程 Become-A-Full-Stack-Web-Developer 超过100个全栈开发相关的学习资源 30-seconds-of-code 30s的小代码片段,快速学习和参考。 假如你有更好的项目,可以提出来哦。 参考文章:https://dev.to/junlow/my-favourite-javascript-learning-resources-on-github-4okb

0

使用Python实现一个读书内容提醒

我们通常会发现很难记住我们曾经读过的东西,就像上图所示,随着时间的推移,所读的东西会渐渐忘记,只有不断的复习,才能够真正地把它们记住。有时,我也想不停地去复习他们,但是总是会忘记这件事,要是能有一个系统不断地提醒我做这件事就好了。我想我所遇到的这个问题,应该也是大家平常会遇到的。 其实市面上,也有一些网站可以实现这个功能,比如readwise.io,它就会每天给你发送提醒的邮件。那么我就在想,我们能不能自己也做 一个呢?想到就做吧,正好最近也在学习Python,那就让我们一起来试试看能不能实现这个功能。 首先来看看我们要实现的功能: 从你的数据集中找到笔记和突出显示的内容 把相关的笔记发送到一个指定的邮箱 按照用户定义的时间来发送邮件 首先,我们需要一些数据,这个只能是手动来做了。我使用的是一个PDF软件,他可以得到所有的注释。我把他们简单放到一个excel中,然后在转成Json,下面是一个Json的片段: 下面,我们来创建几个文件来处理相关的操作: Database.py 这个文件非常简单,他使用read_json_data函数加载了保存在本地的数据。这样,我们就可以使用这些数据了 Selector_service.py 这个文件首先我使用我们上面实现的read_json_data来加载数据,并赋值给self.raw_response。这里我们会随机选择三个内容,并把他们保存在self.sampled_object中。对于选中的内容,我们把他们的选中次数增加,以后就可以根据这个选择次数来有权重地进行随机选择。 Parse_content.py 这个类,就是分析我们上面得到的随机的entry,然后把他们存储在一个self.sample_entries中,并通过parse_selected_entries方法来解析他们。我们主要用这个方法来解析选中的entry,然后转成后面email发送的格式。 Mail_service.py MailService就是通过上面的parse_selected_entries得到内容,并把他们存储到self.content中。define_email_parameters就是设置email相关的参数,比如邮件的名字,从谁发的,以及发给谁等等。 这两个方法都是通过run_mailer来调用的,这个应用是通过最下面的run_job函数来开始的。下面就是email发出来的内容: 好了,这样你就可以实现email的发送了。下面唯一一个还要做的事情就是怎样来调用mail_service.py,我们需要一个定时调用这个实现,这里我们使用Cron,它是一个一直运行得process,然后会在特定的时间调用特定的任务,在你的Crontab中加入下面的代码吧: 这段代码的简单解释如下,他会在每天7PM跑一次。具体的参数可以参见https://crontab.guru/ 好了,现在所有的功能就都实现了,下面还有一些内容就交给你来实现了: 现在准备数据是手动的,你可以通过Python来实现自动的解析,或者试下一个web界面,让你自己假如相关的内容,再通过API读取出来等等。 Email的内容其实不是很好,你可以用HTML来实现。 使用has_been_chosen_before 来更好的随机选择内容。 使用NLP来解析这些内容,然后生成一些总结后者概述之类的。 其它你想到的内容 参考文章:https://hackernoon.com/get-the-most-out-of-everything-you-read-using-python-kw1o3uiz

0

用Python实现一个决策树分类器

本文将会介绍如何用Python实现一个决策树分类器。主要包含下面两个方面: 什么是决策树? 使用Python实现决策树 什么是决策树 简单来说,决策树算法把数据按照树的结构分成了一系列决策节点。每一个决策节点都是一个问题,然后可以根据这个问题把数据分成两个或多个子节点。这个数一直往下创建,知道最终所有的数据都属于一个类。创建一个最佳决策的标准就是信息增益。下图就是一个简单的决策树示意图: 使用决策树分类器来train机器学习model就是找到决策树的边界。 通过把feature空间分成多个长方形,决策树可以创建很多复杂的决策边界。下面就是我们使用决策树分类器来训练Sklearn IRIS数据的决策边界示意图。feature空间分别由petal length和petal width组成,后面我们会给出详细的代码: 决策树代码示例 下面就是一个示例代码: 图形化决策树Model决策边界 下面这个代码可以用来创建上面显示的决策边界图,我们需要install mlxtend这个包: 以树的结构来显示决策树 下面是用数的结构来显示结果,我们会使用sklearn tree类中的plot_tree函数,代码如下: 下图就是上面代码显示的结果,注意我们要用plt.subplots(figsize=(10, 10))来让图形大一点,否则显示的图片很小: 好了,简单的Python实现的决策树分类器就介绍到这里了。 参考文章:https://dzone.com/articles/decision-tree-classifier-python-code-example-reski

0

C#中的new修饰符

今天我们和大家介绍一下C#中的new修饰符,注意这个修饰符,不是我们创建class的new哦。 new修饰符的基本介绍 New 修饰符主要要在子类中,当他修饰一个方法或者成员时,就表示,我们在基类中也有同样名字的方法或者成员,这里我们相当于重新建了一个同名的方法或者成员。在调用的时候,也就会覆盖基类的调用。当然我们不加new这个修饰符,也是可以运行得,但是会在编译的时候报警告。我们来来看下面的代码: 这里,我们在基类中也有一个和父类同名的Invoke函数,假如我们这样写,在编译的时候就会出现下面这样的警告: 1>C:\Users\xiaya\source\repos\ToString\ToString\NewModifer.cs(20,21,20,27): warning CS0108: ‘DerivedNewModifer.Invoke()’ hides inherited member ‘NewModifer.Invoke()’. Use the new keyword if hiding was intended. 那么要消除这个警告,我们可以给Invoke函数加上new的修饰符,如下所示: 这样之后,警告就没有了。 子类同名方法的高优先级 到这里,我相信大家还是可以理解的,同名的方法覆盖基类的方法,同步的property,field等等也是可以覆盖基类同名相关内容。下面我们继续来看这个: 这里你会发现编译也会出警告,难道这里的方法也会覆盖同名的int property?是的,C#一个规则写得很清楚,同名的方法其实优先级很高,他可以覆盖对应基类的properties,fields和types。这一点要小心。 1>C:\Users\xiaya\source\repos\ToString\ToString\NewModifer.cs(25,21,25,22): warning CS0108: ‘DerivedNewModifer.x()’ hides inherited member...

如何选择软件工程相关的Metric并据此来设置相关的KPI 0

如何选择软件工程相关的Metric并据此来设置相关的KPI

软件工程的KPI是一个很重要的指标,它可以用来衡量软件团队的performance。因此,他需要比较稳定,并且能够覆盖没一个人所做的工作,最重要的是,可测量的。 因为他是用来展示整个团队的工作的,所以选择正确的metrics来测量很关键,否则就没有用了。 一些我所常见到的错误就是看提交了多少行代码,有多少个commits,甚至deploy了多少次等等。当然,不是所看deploy多少次是有错的,主要还是看你想要观察的是什么(有可能和生产率没有关系) 通常,很多关于KPI的文章都关注了很多metrics,但是很少在现实中能够使用。因此,这篇文章中,我将会选择5个工程师KPI metrics,如下面所示,供大家参考。 从commit到deploy的时间 测试从一个程序的第一个commit的时间,到这个commit被deploy到production的时间是一个最方便的衡量整个开发流程的方法。主要是因为你可以很方便地看看git commit的history就可以得到这个信息。 很多manager都只看user stroy上的时间,比如他会看backlog中你创建一个任务到最后这个任务完成的时间。这里有一个问题,因为一个任务在看板上,并不代码我们开始做这个任务了,有可能是需求还没有明确,spec还没有做好,各种各样的原因。 当然他可以很好的来看看整个产品的流程如何,不过作为一个程序员,我们其实更关注的是开发的流程,而这个流程的起点是开始写代码,而终点是代码deploy到production上。 因此这个metric可能和很多指标相关,我这里举例列出几个: 减少一个新的feature从开始到上线的时间 减少浪费和重做的时间 减少延迟的消耗 提高工程效率 Deploy的频率 其实只有deploy了,这个feature才最终会被用户所感知,所以他和productivity是密切相关的,因为每一次deploy其实都会对应到相关的任务。 当然,发布的特性有时和商业上的项目并不是一一对应的,所以不能单纯使用deploy的频率来测试productivity,但是我们可以用它来衡量下面这些指标: 减少新feature到上线的时间 改建失败的response以及由于bug导致的outage 减轻安全性相关的问题 代码覆盖率 代码覆盖率是用来表示自动化测试所覆盖的代码,这个覆盖率当然越高越好。它其实可以很好的表示代码的质量。当然他也可以用来体现下面的指标: 增加产品/平台的稳定性 减少波动 扩展技术领域 减少功能上线的时间(手动测试需要更多的时间) 减少长时间运行得消耗 Pull Request metrics 帮忙review peer的代码,在这个过程中的讨论其实是很好的衡量合作的指标。Pull...

0

C# 如何 override ToString方法

众所周知,在C#中所有的class和struct都会继承object类。所以,在C#中,每一个object都有一个ToString的方法,他会返回相关的string。比如我们来看一下下面这个例子: 他们的输出如下: 下面我们来看一个类,这个是一个很简单的类,他包含两个property name和Age,这里我们就overrid了ToString的函数,你可以使用任何你想要的方式来重写这个函数,只要return一个string就可以了。 调用的代码如下: 这样就可以显示下面这个输出了: ToString的Override就是这么简单,和别的overide的函数并没有太多的差别,但是他用的非常多,因为我们经常会需要打印一下log,而ToString基本就是我们打印log的首选函数,你不需要定义什么别的函数比如showPersonInfo之类的来返回一个string,只要重写ToString函数就可以了。

0

React Native Camera的新手教程

自从手机有了摄像头之后,我们可以很方便地把生活中的瞬间记录下来。我们可以通过照片和视频来回顾那些美好的瞬间。自然而然,和我们最爱的朋友和家人分享这些照片和视频就成为了一个必然的需求。 所以,在你写一个app的时候,很可能就希望他能支持拍照和拍视频的功能。假如你还不太清楚怎么来实现的,本文就是来简单介绍如何使用React Native实现相关的功能。 预先安装的包: expo-camera:这个包是用来拍照和视频的。 Expo-av: 这个包是用来导入视频并进行播放的。 可以使用下面的命令来安装相关的包: 或者 实现相机的功能 我们可以简单通过下面的代码来把camera组件假如你项目中的一个view里: 加入这个代码之后,应该就可以使用相机了。注意要在真实的设备上运行哦。 我们来看上面这段代码,其实实现很简单,主要分为以下几个部分: 首先来看看Camera组件的实现 <Camera …/> 我们把一个定义好的cameraRef传到了Camera组件的ref prop中。有了这个之后,就可以很方便地调用takePictureAsync(), recordAsync()。。等等。这些方法其实可以帮助我们调用相关的接口来拍照,录视频等等。 onCameraReady(): 这个回调是当相机准备好拍照和录视频时候的调用的。你应该注意,在我们拍照之前要先看看这个方法是不是调用了。 takePicture(): 通过调用takePictureAsync(),我们可以用这个方法来拍照。 recordVideo(): 和上面takePicture类似,通过capture组件中的onLongPress来触发,我们通过调用recordAsync来拍视频。 stopVideoRecording(): 这个方法在用户停止拍视频的时候触发。 switchCamera():这个方法会切换前后的摄像头 cancelPreview():这个方法就是取消照片和视频的预览。 所有的render方法,比如renderCancelPreviewButton(), renderVideoPlayer()就是简单的在你的手机屏幕上render相关的额显示。 在我们render相关的组件的时候,需要有相关的权限,我们是通过组件中的reqeustPermissionsAsync的调用来获取的。这个方法是在useEffect方法中调用的,而这个方法只有在组件初始化的时候调用。 我们也实现了一个简单的条件rendering。这里,只有在preview的情况下,我们才render一个cancel的button去取消照片和视频的preview。我们在录制的时候,才render indicator。只有录制了视频并且有视频的资源的时候,才render...

0

Google DeepMind介绍

DeepMind其实包含两个方面:Google AI业务背后的创新以及其相关的组织。DeepMind是Alphabet(Google母公司)的辅助机构。 DeepMind已经集成到Google的各种工具和产品之中了,当你使用Google Home或者Goolge Assistant的时候,DeepMind无处不在。 Google为什么要收购DeepMind DeepMind是2011年建立的,他的目的是理解所有的知识,并利用这些知识来理解世界上的一切。他的创始人利用神经领域的知识来处理AI的问题。他们的目的是使用大量的计算,然后让这些计算有选择的学习和重塑自己,而不是等待人类来通过物理重塑他们。 AI领域的有些人都被DeepMind的能力所震惊。2012年,Facebook想收购这个组织。但是那个收购夭折了,所以Google插入了一脚,然后在2014年以五亿美元收购了它。在2015年Google公司重构之后,他成为了Alphabet的一个辅助机构。 Google收购DeepMind的最初解释是开启它的人工推理项目。尽管DeepMind的基地仍在英国,伦敦,仍有一个应用小组被发到Google的在加州山景城的总部。这个团队主要是用来协调把DeepMind AI和Google产品相结合的相关工作的。 Google正在用DeepMind干什么呢? DeepMind虽然被收购,但是他追求知识的目的没有改变。基于深刻认识的运行,是AI项目的通用方法。与之相对应的早期的AI比如深蓝计算机,这个计算机是早在1996年就因为击败国际象棋大师Gary Kasparov而闻名。这个计算机在其相关的领域中是非常厉害的,但是可惜的是在这个领域之外则没有什么价值。而DeepMind则是想从事实上获得有用的信息。 DeepMind的人工智能已经知道如何以超过最厉害的人类来进行下棋了。2016年,一个由DeepMind控制的程序AlphaGo横空出世,并取得比简单国际象棋更厉害的成就。现在,Google已经把DeepMind集成到他的搜索和移动电话中,包括Google Home和Android。 Google DeepMind是如何影响你每日的生活的 DeepMind已经在各种各样的Google产品中使用。你所使用的Google产品中,已经有越来越大的概率其中集成了DeepMind。 下面这些产品中应该毫无疑问继承了DeepMind:话语确认,图片确认,谎言探测,垃圾邮件,笔记确认,解释,Google街景地图以及本地搜索。 Google超级精准的语音识别 语音确认,或者PC解读语音命令的能力已经有很长一段时间了。现在很多语音助手比如Siri,Cortana,Alexa已经Google助手已经成为了我们日常生活中不可缺少的部分。 Google语音确认的创新,已经产生了无与伦比的影响。Google已经能够使用AI来让语音确认很好地识别英语,甚至已经很难区分是人还是机器。 假如你已经有了一些Google的产品,比如Android Phone或者Google Home,已经直接影响了我们的生活。每次,你说“OK Google”的时候吗,DeepMind都会尽力来帮助你实现你想要的东西。和Amazon的Alexa相比,它需要八个接收器来识别语言的顺序,而Google Home的DeepMind语言确认框架只需要两个。 Google Home和Assistance语言生成 常规话语融合利用了很多称之为“话语级联”(TTS)的内容。当你使用一个小工具进行话语级联的时候,他会通过数据库把这些话语级联成单词或者句子。这样出来的句子就很生硬,一听就知道不是人说的。 DeepMind是使用一个称之为Wavenet的内容来进行产生语音的,它的目的就是想让语音听起来越来顺耳。WaveNet是基于和人类语音相近的测试,但是他并不利用示例来融合新的声音。相反,他研究人类语音的波形,并找出这个语音波形是怎么样的。这样就使得程序可以使用特定的方言来交流,甚至可以模拟一个人的声音。和其它的TTS框架相比,WaveNet可以模拟出很多正常语音会有的声音,比如类似呼吸,打喷嚏等等,这样就使得声音听起来更加真实。 如果你想看看使用连接语音然后语音创建出来的声音和WaveNet产生声音之间的差别,试试DeepMind就知道了。 Profound Learning/Deep...

0

六个初创公司常犯的财务错误

将经验丰富的企业家和新手区分的重要标准之一就是愿意和承受风险的能力。你可以从世界上最好的企业家身上看到这一点,包括Richard Branson,Arianna Huffington以及我们的马爸爸。 不管你的公司是什么类型和规模,小的公司也好,大的全球性的企业也罢,都有可能犯一些共同的财务方面的错误。 企业家们都很聪明,他们能够快速地解决问题,找到他们的领域的界限并突破他。他们总是在寻找每一个机会来发现自身的短板,并且在未知的领域奋斗。企业家愿意承担风险的趋势随着他们把风险和机遇结合能力的增加而增长。 另外一方面来说,承担风险的渴望使得他们更容易犯错。所以,企业家们总是不停地在犯错误。每一个成功者的背后都有着同样的失败次数。 有些错误可以立即修正,但是和钱相关的错误则很容易让你的生意尽毁。突然的资金链断裂,一个想不到的花费以及债务的迅速积累可以摧毁哪怕是最好的想法。 基于我的经验,这里是六个最大也是最容易犯的财务错误,让我们看看如何才能避免他们: 没有把个人账户和公司账户分开 哪怕你是自由职业者或者企业家,把这两个账户分开都是没有弊端的。 我们知道你认为没有分开的必要是因为不分开实在是太方便了。不过在你开始收费之前就创建一个独立的账号是很有必要的。 我让你在开始就创建是有道理的,因为这样可以让你的企业更加便利,在交税的时候也很方便,甚至可以方便为那些不可预测的未来做一些准备。 一个分开的账户可以让你更好地观察你的商业是否健康。让你企业账户和个人账户分开可以减少你区分它们的花费,也不会不小心在个人生活中是会用商业的基金。 甚至,最坏的情况下,你的商业在未来不太好了,他也不会影响你的信用分。 因此,把你的企业账户和个人账户分开可以确保你可以关注于你企业的增长和安全,不要把他们混合起来,分开他们吧。 为企业花费大笔的(很多时候不需要的)开销 当你开始创业的时候,你总是想什么东西都是最好的,比如最好的电脑,最好的办公室,最好的软件,最好的人才来帮助你把企业做大。 但当你准备做这些花销的时候,一定要好好想想。有些基本的花费是不可避免的,比如注册公司,开发一个网站,参加一个企业活动等等。 在花费任何一分钱之前,都好好想想这些花费能不能给你未来带来任何受益。 一些没有必要的花费,比如办公室的party,团队建设啊,以及很好的工作环境等等并不能提高你公司的成长基础。 在开始的时候,不要去一些流行的CRM上注册,可以先选择一个基本的或者便宜的选择。除了全职员工,可以考虑一些自由职业者,比如到Upwork或者LinkedIn上看看。 因此,早期一定要把钱花在刀口上,只把钱花在那些必须要花的,而不是那些最好有的方面。 无法修复你的信用分 当你学习如何把个人财务和企业财务分开的时候,你的个人信用分会影响你的企业财务状况。信用分的范围如下: 任何情况都不要让你的信用分低于646,假如他低于了这个分数,那么就影响到你在未来得到信用的能力。在早起,当一个投资者决定是否投资的时候,你个人的信用分也很重要。 企业家通常犯的最大的错误就是认为所有的东西都没有问题。当你的创业公司去贷款的时候,这有可能会让你遇到一些问题。所以,好好改进自己的信用分,这很重要。 一些额外的建议: 按时付每一个账单,最好能设置一个自动付款,这样你就不需要每个月都自己付款了。 当使用信用卡的时候了解自己的还款能力,你使用的钱最好不要超过信用能力的三分之一。 为个人花费贷款 很多企业家会把自己的资金投入到企业中,通常都是他们看到了一个新的机遇或者很看好某一刻市场的前景,认为可以赚到钱。 尤其是你企业的早期,你会遇到很多障碍。虽然失败不可避免,但是很多会让我们付出很大的代价。当你为买一辆车贷款或者买房贷款的时候,一个意外的企业花费可能会让你的存款减少。 所以,当你企业增长的时候,不管是在个人还是企业,都尽量的保持少得花销 没有为紧急情况或者停机做准备...

0

如何通过重试来改进你的后端API call

无论你是从Node.js还是浏览器调用一个API Call,连接失败总是会发生。有些request的失败是有效的,也许endpoint有问题,或者客户端发送了一个错误的数据。另外一些则是连接的问题,比如连接到服务器的问题,或者是这之间的某一个节点出现了问题。虽然API和web服务检测可以看到这些问题,但是一个更好的方案也许可以处理这个问题。 解决这个问题,你可以在你的HTPP调用中假如一个重试的机制。这可以让你的API调用成功。有些库,比如got,就支持失败的重试,而另外一些库,比如axios,则需要一个独立的插件。但是假如你的库不支持这个,那么可以参考这篇文章。我们将基于返回的status来决定如何重试一个请求。 重试的基础 决定何时需要重试一个request,我们需要知道正在找寻什么。有很多HTTP status code可以用来检查。这样你的重试机制就根据不同的错误来进行,比如一个网络错误就是很好的重试情况,而别的,比如404错误,则不是一个很好的重试情况。我们的例子中,将会使用408,500,502,503,504,522和524.你也可以检查429,这个错误表示你可能调用了太多request。 下一个问题就是重试的频率。我们从一个小的延迟开始,然后每次都加上额外的延时。我们称之为“退避”。每次重试之间的时间都会不断增加。最终,我们还需要确定在多少次重试之后放弃。  下面是有一个伪码的逻辑 If total attempts > attempts, continue if status code type matches, continue if (now – delay) > last attempt, try request else, return to the...