Ruby元编程实战
Json解析成对象,将属性动态定义方法module ActsAsField
def self.included(base_class)
base_class.instance_variable_set(:@all_fields, [])
base_class.include Instance_Methods
base_class.extend Class_Methods
end
module Class_Methods
# 声明变量信息,并自动生成实例方法
def field(name, path)
instance_variable_get(:@all_fields) << name.to_sym
define_method(name.to_sym) do
case path
when String
data.dig(*path.split('.').map(&:to_sym))
when Proc
...
RSpec 测试示例与技巧说明
RSpec 测试示例与技巧说明本文档整理了多个 RSpec 测试示例,并详细说明了每个示例中使用的技巧和代码示例。这些示例涵盖了常见的测试场景,包括基本断言、异常处理、状态变化、依赖注入、以及使用 spy 和 double 进行测试。
目录
基本断言
异常处理
状态变化
依赖注入与 double
使用 spy 进行测试
模拟日期和时间
基本断言示例代码RSpec.describe 'Assertion' do
describe 'expect equality' do
it do
foo = 1
expect(foo).to eq(1)
end
it do
foo = [1, 2, 3]
expect(foo).not_to equal([1, 2, 3])
end
end
describe 'expect Truthiness' do
it { expect(1 + 1 == 2).to be true }
end
describe 'match a ...
位运算 & (与)实际应用
疑问?
在linux系统中,我们经常使用chmod进行文件权限修改(读,写,执行)
比如我要对some.sh赋予权限: chmod u=rwx,g=rx,o=x some.sh
u=rwx:
u 表示文件所有者(user)。
rwx 表示读(r)、写(w)和执行(x)权限。
这意味着文件所有者将拥有读、写和执行权限。
g=rx:
g 表示文件所属组(group)。
rx 表示读(r)和执行(x)权限。
这意味着文件所属组将拥有读和执行权限,但没有写权限。
o=x:
o 表示其他用户(others)。
x 表示执行权限。
这意味着其他用户将只有执行权限,没有读和写权限。
可以看到我们分别对文件所属人,文件所属组,其他用户赋予了读,写,执行的权限,那这些信息实际存储是什么样子的呢?难道是一个数组?
u: [r, w, x], g: [r, x], o: [x]
这种看起来最直观,但有没有更优雅的方式,比如用一个数字就能表示所有的权限信息,u: 7, g: 5, o: 1,经常用这个命令的人知道,上述的写法可以使用chmod 751 some.sh直接表示
那为什么我通 ...
Zed动态查询
尝试过nvim的人应该都对telescope这种文件查询风格很喜欢,当在输入时能自动进行重新查询,并通过上下键进行翻阅
我目前在使用另一款编辑器Zed,它目前内置的查询并无法做到类似的操作。但通过内置的Terminal+fzf+bat+rg也能做到类似的效果
fish function
function search_and_edit
# 使用rg进行文件搜索,并使用fzf进行预览
set -l selected_file (rg --column --hidden --line-number --no-heading --color=always --smart-case --glob '!**/.git/' --glob '!**/node_modules/' . | fzf --ansi --delimiter : --preview 'bat --style=numbers,changes,header --color=always --highlight-line {2} {1}' --preview-windo ...
Electron分享
背景
我想开发一个桌面应用,可以记录任务待办,统计完成情况,计时器(番茄钟),系统通知等功能,其中前三点都可以通过Web开发完成,而系统通知功能(底层交互)无法满足。所以想在2024用最小的努力开发一个小APP。最好一次开发,跨端使用,在Windows和Mac上都能用。
最终我确定了Electron
结果分享:https://github.com/GengCen-Qin/tomato-todo
是什么?
官方文档
官方地址:https://www.electronjs.org/zh/docs/latest/tutorial/quick-start
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。
简单来说就是:如果你会前端开发,通过Electron可以开发出跨平台应用。通过 Chromium(用于显示网页)和 Node ...
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插件,感觉都不错,不过可能有些小细节,希望能自定义一下,比如注释代码的颜色,侧边栏字体大小,滚动块儿样式等等。
可以通过PackageResource ...
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
# =>
SELECT "users".* FROM "users"
SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1)
在默认情况下,includes也是这么 ...
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中的服务不 ...