Promise异步学习
是什么?promise 是一个对象,它可能会在未来的某个时间产生一个值。并且你可以声明
未来获取到值时应该怎么做
如果出现异常怎么做
不论结果如何都要干的事情怎么来的?
回调是怎么回事儿?
article on callbacks错误使用
const getData = function() {
// go fetch data from some API...
// clean it up a bit and return it as an object:
return data
}
const myData = getData()
// 需要注意由于请求数据是异步操作,所以并不会等待获取到数据了,才执行下面这句话。
// 最终结果即使 myData 是undefine
const pieceOfData = myData['whatever']
正确使用
const myData = getData() // if this is refactored to return a Promise...
// 通过Fetch会返回一个Promise对象,我们告 ...
LSP探索
是什么官方定义:https://microsoft.github.io/language-server-protocol/overviews/lsp/overview/
为编程语言实现自动补全、定义跳转或在鼠标悬停时显示文档等功能的支持是一项重大工作。传统上,这项工作必须为每个开发工具重复进行,因为每个工具提供的实现相同功能的API都不同。
LSP的理念就是通过一种协议,与开发工具交流,实现功能。通过中间层,来做到一个语言服务器服务多个开发工具。
怎么用
意识就是开发工具会捕捉一个个事件点,与语言服务器进行交互,比如这里的:打开文档,编辑文档,用户执行定义跳转,关闭文档等。
可以具体看一下定义跳转的交互
请求:
{
"jsonrpc": "2.0",
"id" : 1,
"method": "textDocument/definition",
"params": {
"textDocument": {
"uri": "file:///p%3A/mseng/VSCode/Playgrou ...
SublimeText Web开发
SublimeText Web开发在2024随着LSP和AI发展的越来越完善,SublimeText也可通过各类插件享受到新的福利,最近尝试使用ST4(SublimeText4)作为主开发工具,体验上还是很爽的,所以想给想尝试的朋友一些推荐。
为什么不用Vscode,Jetbrains等主流IDE工具?
老实讲我感觉ST概念比较简单,很快,按钮少,但是功能上IDE肯定更全面,对新人更友善。每个人有自己在意的点,如果喜欢原先的开发工具也完全OK,目前我通过插件将ST改成了一个简略版IDE,对一些基础操作:git,sql,terminal,代码补全,定义/引用查找等功能已经集成的不错了,觉得ST是大家选择开发工具中的一个可选项。
Zed也很不错,不过还不太完善,所以感觉还等一段时间,很期待。
Plugins插件统一通过Package Control下载即可
主题视觉效果看着舒服是很重要的一个点,我目前尝试了:ayn,Material插件,感觉都不错,不过可能有些小细节,希望能自定义一下,比如注释代码的颜色,侧边栏字体大小,滚动块儿样式等等。
可以通过PackageResourceVie ...
Rails N+1
Rails N+1 问题是什么?# Get all posts
posts = Post.all
# For each post, a new author query will be triggered
posts.each do |post|
post.author.name
end
我先获取了所有的帖子,然后想知道每个帖子的作者名称,实际执行时相当于每个帖子都执行了一遍SQL查询这个帖子的作者信息。如果有1000个帖子,则会执行1000条SQL
在什么时候发生?当我们使用Rails的ORM框架操作聚合关系的操作,比如:has_many | belongs_to
这极大的影响了我的系统性能
如何解决?三种方式:Preload,includes,Eager load,joins
PreloadUser.preload(:posts).to_a
# =>
# 查找所有user数据
SELECT "users".* FROM "users"
# 根据上面的users的所有id,再获取对应的posts缓存起来
SELECT "posts".* FROM "posts" WHER ...
Web Server & Application Server解惑
Web Server & Application Server解惑
参考文章与书籍
ruby网络编程
构建你自己的Web服务器
为什么我们需要Ruby中的应用服务器(比如Puma)?
rack探索
Puma 源代码分析
码农翻身2
如果你使用Java或Ruby开发过Web项目,你一定了解过Tomcat和Puma,他们本质上都是一种容器,具有监听端口,返回文件或动态内容的服务。但这样的表述有点儿抽象,SpringBoot 和 Rails 为什么不自己去做所有的事儿?而是需要在内部嵌入这么个玩意儿。我们从历史进程中一点点看。
Web服务器的历史版本1最初Web服务(Web Server)是一个很简单的玩意儿,在端口上监听,解析HTTP请求,把请求对应的文件返回。
实际上只要了解socket编程与HTTP网络协议,就能很简单的制作出一个玩具Web服务器。参考这篇文章:构建你自己的Web服务器。
版本2很常见的一个需求,鉴权操作。我需要通过解析请求,知道对方是谁,并从数据库中查询一下对方是否有权限,我们称为应用服务(Application Server)。
但是版本1中的服务不 ...
求上得中,换工作的小故事
求上得中,换工作的小故事转眼间在程序员这个行业已经工作一年多了,一年前我兴奋的写下:勇闯SAP失败,勇敢转行成功,现在结合这一年来发生的故事,想再写点儿有意思的事儿。
去年入职后,我在一家创业团队里负责java后端开发,工作中遇到的问题都感到新奇。每一天都过的充实开心,在业余时间也会经常看看书,比如: 《码农翻身》,《程序员的职业素养》之类的,我发现作者们都提到了一种优雅的编程语言:ruby,相信大部分人可能都不知道这个名字,而市面上主流的培训机构也没有这门语言的身影,从就业情况来看,在Boss直聘上西安使用它的公司仅有三四个。而使用java的公司已是成百上千。好吧,那看来学习它完全是在浪费时间。但能被这么多优秀的作者说起的语言,肯定不是一个无名之辈吧,我尝试着去了解它。
随着了解的越深,我越发现它的有趣性,但由于国内的资料少,便找来国外的资料教程学习,并翻译出来。发布在了RubyChina上(这是我们目前看到的国内最好的语言社区)。而随着这一路的探索,我也发现了很多意料之外的领域和知识。随着我在社区的活跃,也让很多人看到了我的文章。其中一位就是西安一家公司的大佬,邀请我去他们公司看看 ...
加密算法的演化过程
加密算法的演化过程阶段1(明文):A 和 B在网上聊天,但是双方完全使用明文的方式传输信息,那如果有一天,A问B要游戏账号和密码,B发送了过来,这时候信息一旦被第三个看到,信息直接泄露。
阶段2(对称加密):A 和 B商量一下,以后咱们说话,先通过一个工具加密一下,比如每个字母往后3位,等你收到了信息,再利用工具,把每个字母往前3位,这样就保证信息即便被人看到了,也不知道说什么这个也叫对称加密,即加密和解密来自于一个秘钥。但这里仍有个问题,这个加密解密方法(秘钥)怎么安全让对方知道,别人都知道咱们是怎么加密解密的了,那即使发送的加密信息也没用啊,除非A跑到B他们家,给出秘钥。但全球范围内的通讯,不能这么搞吧。
阶段3(非对称加密):A 和 B又发现了新方法,咱俩一人创建一个公钥和私钥,然后交换对方的公钥,这个公钥即使被人看到了也无所谓,当你要给我发消息时,你用我的公钥进行加密,然后发给我,我在我这里用自己的私钥再解密即可,这样私钥只在我一个人手上,就不担心信息泄露了。这也叫做非对称加密但是用了一段时间后,A和B都感觉和对称加密比起来,非对称加密太慢了,已经严重影响沟通了啊。
阶段4(加 ...
TDD In SpringBoot
参考资料:
文章讲解TDD
视频讲解TDD
测试驱动开发在项目中的实践
TDD的概述代码示例说明这里我根据github的代码,进行简要的说明和讲解,最后我们会自己来写一遍测试。从接口层开始编写测试,从上至下,从接口到数据访问的顺序编写测试Controller层测试@WebMvcTest(controllers = PokemonController.class)
@AutoConfigureMockMvc(addFilters = false)
@ExtendWith(MockitoExtension.class)
public class PokemonControllerTests {
@Autowired
private MockMvc mockMvc;
@MockBean
private PokemonService pokemonService;
@Autowired
private ObjectMapper objectMapper;
}
mockMvc:用来模拟HTTP请求
objectMa ...
2023年度总结
2023年度总结成长二月份入职后,整个生活节奏快了很多,最初是先熟悉公司的系统框架,然后是梳理公司的业务流程,封装一些第三方的接口,后来领导看我熟练后,开始将一些简单的新业务让我来设计去做,我觉得这也算是小型公司锻炼人的一点,因为什么都要做,人员就那么几个,只要自己能力够,很快就能接触核心业务,而业务范围并不会太广。
这期间当然也犯了很多错误,不论是写新的业务还是维护老的代码,感谢领导和老板对我的包容,也因此让我对代码产生敬畏心,有一个好的代码规范十分重要,这体现在各个角落中:命名约定,条件判断,异常处理,代码组织方式上。这是我们在学习时最基本的课程,却也是工作中最重要的一部分,当维护一个有八百行的函数时,改哪里都是心惊肉跳的,每次上线都在心中默默祈祷千万别出问题。
今年没有花太多时间去学那些高大上的技术,因为完全用不到,也越发感受到不要过早将事情复杂化。主要精力还是集中在编写好的代码上,直到现在我才渐渐有意识的使用面向对象思想,其中两点让我印象深刻:异常处理,职责划分。
比如在看代码时,我们都不希望行数过多,因为这代表代码的职责也就越多,往往希望一个函数只做一件事。当函数在做处理并需 ...
Effective Ruby
熟悉Ruby第一条:ruby中的True与False
在Ruby中,除了false和nil,其他值都为true,包括数字0
true和false并不是关键字,而是一个全局常量但不遵守命名规范和赋值规范
不遵守命名规范是因为,它没有以$开头
不遵守赋值规范是因为,无法写ture = something
true.class => TrueClass
false.class => FalseClass
既然不是关键字,true和false就有着对象方法
如false和nil都代表 false,那我们怎么进行区分?
这一点在表示配置信息对象中会贯穿始终,因为false一般代表禁用,nil代表未赋值,使用默认值等。
最简单的方式是 obj.nil? 判断是否为nil
还可以使用 false == obj 来进行判断,在一般常规语言中,我们倾向于把不变量放到左边,但这里我们有着功能性上的考虑,因为false是一个对象,而FalseClass定义了==方法,也就是说这里实际执行为 false.==(obj)。这也太牛逼了。比如一个类也定义了==方法,则可能就会出现混乱的样子,比如 ...

