[elixir! #0084] 关于 DFA(确定性有限自动机)的那些事儿

2022-02-09
阅读 1 分钟
1.6k
最近在看 编译原理 这本书,感觉是很棒的入门书(指难度由浅入深深深深)。前两章主要是一些概念性的东西,第三章就开始动真格的,上代码上公式了。不自己实现一下,根本就是看得云里雾里的。所以接下来一段时间可能会不定期地更新一些关于我在 编译原理 这本书里看到的东西的实现的文章。

[elixir! #0083] Stream.transform 的用法

2021-12-26
阅读 1 分钟
2.1k
在 elixir 里可以用 Stream 来表示无限长的序列,例如 0,1,2,3... 就可以表示为: {代码...} 如果我们想要计算这个数列中每5个数的和,就可以使用 Stream.transform 函数: {代码...} 它是 Enum.flat_map_reduce 的 Stream 版本。

[elixir! #0082] application controller 应用是如何被载入和启动的

2021-11-28
阅读 5 分钟
2k
熟悉 erlang/elixir 的朋友们应该知道 application 的概念,它是一种特殊的结构,用于启动和停止一个应用。每当我们新建一个 erlang/elixir 项目,也同时新建了一个同名的 应用。在使用依赖库的时候,一般每个依赖库也是一个应用,会在我们运行项目时被载入和启动。

[elixir! #0081] 编译后的 beam code 重建为 erlang 代码

2021-11-24
阅读 2 分钟
3.4k
elixir 或 erlang 或其它运行在 beam vm 上的语言,都会被编译成 .beam 文件。那么能否通过这些文件重建 erlang 代码呢?答案是可以的。

[elixir! #0080] 读 erlang 开发团队博客 之 N 对 1 并行消息的性能优化

2021-11-12
阅读 2 分钟
2.5k
自从 erlang OTP 团队开设技术博客以来,很多高质量的文章让我们有机会能够了解 erlang 内部的各种机制。 譬如最近的这篇 [链接] ,就讲述了在 erlang 虚拟机中是如何对 “N对1” 的进程消息传递进行性能优化的。

Coinbase 开发的 Rosetta API 是什么

2021-10-26
阅读 1 分钟
2.7k
简单来说,在这套协议出现之前,各个区块链项目都使用着自己的 API 接口,大相径庭的接口实现的却是大同小异的功能,给这些软件的对接者带来了很多不必要的工作。

[elixir! #0079] erlang 版本升级 22 -> 24

2021-10-20
阅读 1 分钟
4k
前几天升级了 elixir 版本, 今天想着干脆把 erlang 的版本也升级一下好了。听说 OTP24的性能有很大提升。升级之后一编译,果然又报了好些警告&错误,我们来一一解决。

[elixir! #0078] elixir 版本升级的历程(1.11 -> 1.12)

2021-10-13
阅读 1 分钟
1.6k
然后 elixir 1.12 版本修正了一个关于 behaviour 的bug。之前如果某个 callback 的实现函数没有标注 @impl true 的话是不会有警告的。现在会报:

感悟篇: 阅读 Unix 分时系统的进化

2021-06-04
阅读 2 分钟
2.5k
论文名: The Evolution of the Unix Time-sharing System -- Dannis M. Ritchie

感悟篇: 阅读图灵的论文

2021-06-04
阅读 1 分钟
1.4k
论文名: A. M. Turing (1950) Computing Machinery and Intelligence图灵把计算机的必要组成部分抽象成了三点:存储执行单元控制我的理解是, 存储就是现在的内存和硬盘, 执行单元是 CPU 和指令集, 控制就是程序.既然程序可以实现任意的状态机, 那么在不考虑速度的情况下, 各种计算机都是等价的. 原文如下, 我的解释可能不...

疯狂的 Vue3 之 特殊属性

2021-04-25
阅读 2 分钟
1.2k
同事们在我的疯狂安利之下, 纷纷把 vue3 component 用起来了. 今天又出问题了"这参数怎么传不进去啊?" {代码...} 哦, 我一看也傻了, 没道理啊, 查了半天资料, 原来key 是特殊属性, 不能自定义, 改成别的名字就行了.那么, 还有哪些特殊属性? 它们都有什么用呢?keykey 表示的是在界面更新时一个组件是不是会重新 mount, 如...

疯狂的 Vue3 之 Setup

2021-04-22
阅读 1 分钟
2.3k
之前我们定义的是一个简单的渲染函数, 每当组件需要重新渲染的时候, 它就会被调用. 那么如何去做一些初始设置呢? 这些设置应当只在组件首次加载的时候执行.

啥是 CSRF

2021-04-21
阅读 1 分钟
971
在使用 web server 渲染 html 模板的时候, 突然看到 server 悄咪咪地塞了一个 csrf_meta_tag() 到 html 文件里. 这是啥?

疯狂的 Vue3 之 四个函数写应用

2021-04-21
阅读 2 分钟
4.2k
只用四个函数, 不需要熟悉 JavaScript 各种奇怪的知识, 不需要复杂的配置, 就可以立刻写出比较复杂的前端页面. 一开始我也不相信, 但 Vue3 真的做到了. 而且很神奇的一点是, 在 Vue3 的架构里我发现了很多类似 elixir/erlang 的地方.

遍历语法树的两种方式: prewalk 和 postwalk

2021-02-26
阅读 1 分钟
2.4k
在编辑抽象语法树(AST) 的时候, 我们经常需要遍历整个结构, elixir 标准库中提供了两种遍历方式. 举个例子, 有这样一个 AST: {代码...} quote 后的数据结构是这样: {代码...} 用图像表示的话, 大概就是这样, 有很明显的层级关系:Prewalkprewalk 就是以从外层到内层的顺序, 进行遍历. 注意最后返回的元组里, 第二个参数才...

开始学习多维类型数列(tensor)的计算

2021-02-25
阅读 2 分钟
1.6k
随着GPU 和 TPU 等异构芯片被广泛使用, 俺也逐渐不满足与只使用 CPU 进行计算. 为了刚上时代发展的浪潮, 俺决定学习一下如何写出可以在 GPU 上运行的程序. 最基础的是, GPU 的特性是多核并行计算, 所以需要使用特殊的数据结构, 例如多维数据结构(multidimensional data structures), 又被称为 tensor, 也有翻译为"张量".

感悟篇:如何写好函数式代码

2021-01-25
阅读 4 分钟
1.4k
最近在写代码的时候常常感觉迷茫,到底函数式语言应该如何写代码。immutable 数据结构的好处到底在哪里。为什么我写出来的代码总感觉像是命令式、过程式的。

追求速度的极限 —— 在elixir里使用 :atomics 模块操作 mutable 数据

2020-12-30
阅读 3 分钟
1.6k
在 elixir 中常用的数据结构都是不可变(immutable)的,也就是每次修改实际上是在内存中新建一个数据。不可变数据的好处是可以避免副作用,方便测试,减少bug。缺点也很明显,就是速度慢。

使用 Elixir 推导 Y 组合子

2020-12-29
阅读 2 分钟
1.3k
这里第二个 foo 的地方应该是 foo 这个函数本身被递归调用,然而这个时候 foo 的定义还没有完成。没关系,遇到不知道的东西,就把它作为参数吧。

Advent of code 2020 elixir 解法回顾 (上)

2020-12-14
阅读 7 分钟
2k
网络上有很多有趣的编程题库,其中 Advent of code 近几年收到越来越多人的关注。原因是题目很有趣,结合圣诞节主题,在圣诞节前的25天每天一题。另外不限制编程语言,只需要输入正确答案即可。每做出一题还会得到一颗圣诞树上的小星星,有成就感。今年我使用 elixir 来解题,转眼间已经做了过半的题目,于是写一篇文章...

打工人的总结之——编程的术与道

2020-11-12
阅读 1 分钟
1.4k
记得那年,一个对编程一无所知的年轻人,因为生活所迫,开始用一台小小的 macbook air 自学编程)。和万千学子一样,这个年轻人在学校里也有上 C语言课程,然而每次上机他必定是全班走得最晚的那一个,不是因为用功,只是因为看不懂题目。

[elixir! #0074] 从 child_spec 看回调模式

2020-11-11
阅读 1 分钟
1.3k
回调(callback)是编程中经常会用到的一种模式,在 elixir 中我们通常通过假定一个些模块里面包含了一些符合特定函数签名的函数定义,或者说这个模块实现了某种 behaviour,来进行回调编程。这种编程模式的好处是可以将回调的实现模块进行升级或者替换,而不改变回调的函数签名,从而不破坏调用者的代码。

[elixir! #0073] beam 内置的内存数据库 —— ETS

2020-11-10
阅读 2 分钟
1.3k
在 beam 虚拟机里,进程之间一般通过消息传递来沟通,而消息传递是需要复制而非共享的。在消息体积小,且只在少量的进程之间传播时,是没有什么性能问题的。而如果我们需要在大量进程之间共享大量的数据,那么消息传递就显得十分低效且没有必要了。

[elixir! #0072] 当在午夜写入一个文件时,发生了什么

2020-11-07
阅读 2 分钟
1.2k
在上一篇文章中我们通过 erlang 的 trace 功能了解到了打印字符串是通过消息传递来完成的。那么,同样是属于 IO,写入文件是否也是通过消息传递呢?

[elixir! #0071] 功能强大的消息处理库 ---- Broadway (1)

2020-11-06
阅读 1 分钟
1.3k
互联网产品往往要面对突如其来的巨大请求量,而后端业务能够支持的并发请求数量是有限的。常用的架构是首先让请求进入消息队列,例如 Kafka,RabbitMQ,GooglePubSub 等等。同时后端服务最为消费者分批地从消息队列中获取自己能够处理的消息。

[elixir! #0070] 不死的网络,细数 Beam 集群和 Bitcoin 的类似之处

2020-11-04
阅读 4 分钟
2.2k
经常阅读 ljzn(就是在下)的专栏的朋友们可能知道,他平时最爱两样技术:beam虚拟机和 bitcoin网络。究其原因,可能是两者都在追求构建一个永生的网络集群。目标类似,那么实现方法一定会相似,我们现在就来盘点一些 distributed erlang 和 bitcoin network 究竟有多少类似的地方。

[elixir! #0069] 逃离楚门的世界,在beam虚拟机里做一个tracer

2020-11-04
阅读 2 分钟
1.2k
当你生来是一个beam虚拟机里的进程,你所熟悉的一切是在这个世界上,每个进程可以相互收发消息。你所不知道的事是,每个进程并不是同时执行的,而是由调度器进行调度。

[elixir! #0068] 来去皆消息,使用 StringIO 制造虚拟的 IO 设备

2020-11-03
阅读 1 分钟
1.4k
我们知道几乎每个编程语言都会有打印输出的函数,elixir也不例外,常用的有 IO.puts, IO.inspect, IO.write 等等。 然而你是否知道, 这些函数都可以在增加一个参数在第一位,从而选择不同的IO设备进行读写。

[elixir! #0067] 保存 IEX 的历史记录

2020-10-30
阅读 1 分钟
1.6k
平时使用 iex 进行调试时经常会遇到需要重新打开 iex 的情况,这时候刚才输入的历史内容就全部丢失了。那么如何让 iex 保存历史记录呢?

[elixir! #0066] 打工人的摸鱼之作 —— websocket client 最小实现

2020-10-30
阅读 2 分钟
1.3k
很早之前就对 WebSocket 协议非常感兴趣,今天有空时看了一下 RFC6455, 发现其实是一个很简单的协议。于是尝试着实现了一个客户端。这里摘取一些关键部分的代码。