[elixir! #0065] :io.format 的妙用 ---- 查看数据包的内容

2020-10-28
阅读 1 分钟
1k
在调试一些网络协议,例如 websocket 协议时,数据包的内容通常不是合法的可读字符串,而是包含了各种操作码。那么如何简单地看到数据包里的可读字符呢?

[elixir! #0064] 在2020年继续使用 http 1.0 协议会发生什么

2020-10-27
阅读 1 分钟
1k
HTTP 是目前互联网上最常用的协议,不仅仅应用于访问网页,现在一些内部服务也开始使用 HTTP,例如 gPRC 等等。 其实 HTTP 协议的内部结构非常简单,我尝试写了一个最简单的 HTTP 客户端,功能只有:从 DNS 获取到域名对应的 ip向 ip 发送一个 tcp 消息,内容是一个 HTTP GET 请求的字符串返回收到的回复因为没有解析 he...

[elixir! #0063] 为代码解耦而生的双生子 —— PubSub 与消息队列

2020-10-26
阅读 5 分钟
1.3k
在之前的文章 elixir! #0061 高负载高并发问题的万能钥匙 ---- 队列(queue) 中,我们介绍了如何使用队列来避免 server 在收到多个耗时较长的 call 请求时被阻塞住 mailbox。今天我们再来讨论一下另一种常见的消息传递模式 —— PubSub。

[elixir! #0062] 快速赋值小技巧

2020-10-26
阅读 1 分钟
1.4k
然而,如果我们在编译时并不知道右边列表的长度,应该如何匹配呢?在 elixir 标准库中为我们提供了 destructure/2 这个方便的宏:

[elixir! #0061] 高负载高并发问题的万能钥匙 ---- 队列(queue)

2020-10-23
阅读 6 分钟
1.3k
高负载高并发问题,不仅仅出现在面试中,在日常生活中也很常见,比如周末去热闹的商场吃饭,餐厅们口经常会需要排队取号。可以归纳为“需求”和“资源”的不匹配,多出来的“需求”的不到满足,就需要有合适的机制让这些”需求“进行 等待 或者 撤销。

[elixir! #0060] 玩转外部资源—— Port 入门

2020-10-23
阅读 1 分钟
1.2k
在 erlang 虚拟机中,port 是链接 process 的消息传递世界,与 erlang 虚拟机之外 linux 系统世界的桥梁。在 process 看来,port是一种特殊的资源。

[elixir! #0059] Elixir 是如何获取到 doc 内容的

2020-10-21
阅读 2 分钟
883
标准库的 Code 模块里自带了很多用于处理源文件的函数,其中 Code.fetch_docs 可以直接获取一个模块里全部的 doc 内容:

[elixir! #0058] 使用macro为函数添加参数

2020-10-21
阅读 1 分钟
1.4k
有时我们在修改程序的时候只是希望给旧的函数添加一个参数,我们可以使用macro来简化这一流程。这里是一个简单的例子,我们使用了一个名为 define 的宏,它的作用是添加一个名为 state 的参数到函数里。 {代码...} {代码...} define 宏的实现是这样的: {代码...} 主要的几个点:用 use 来传入我们设定的新参数的名字用...

[elixir! #0057] mix format 一下,代码更规范

2020-10-12
阅读 1 分钟
1.7k
• :inputs - 选择需要被格式化的文件 • :subdirectories - 制定具有单独格式化规则的子文件夹 • :import_deps (a list of dependencies as atoms) - 导入某些依赖的格式化规则 • :export (a keyword list) - 导出某些规则

[elixir! #56] 模块编译顺序

2020-10-11
阅读 2 分钟
1.4k
距离写上一篇文章已经过去了将近1年时间。使用elixir进行元编程的时候,初学者经常会不清楚模块的编译顺序。我们用一个简单的例子来解释一下。 {代码...} 我们定义了一个 M1 模块,它使用了几个 elixir 内置的模块属性:@after_compile M0 表示在 M1 模块编译之后,调用 M0.__after_compile__@before_compile M0 表示在 ...

业余程序员调试开源项目之 Go

2020-10-10
阅读 1 分钟
818
作为一个半业余程序员(工作不稳定,啥都需要做一点),经常需要对接各种奇奇怪怪的项目,文档不全十有八九,所以各种编程语言的调试运行都要懂一点。下面就讲讲常见的编程语言的调试方法。

通过例子来学习 Go 和 Rust ---- RwLock 读写锁

2020-03-06
阅读 3 分钟
2.7k
rust 里和 Mutex 类似,使用RAII(Resource Acquisition Is Initialization)来保证在值被Drop的时候自动解锁。而 go 里依然是需要手动解锁。

通过例子学习 Go 和 Rust ---- Mutex 互斥锁

2020-03-05
阅读 3 分钟
1.7k
互斥锁是并发编程的时候会用到的东西,它表示一份数据不可以被两个进程同时访问. Go {代码...} 举个栗子 {代码...} Rust {代码...} 又举个栗子 {代码...}

通过例子学习 Go 和 Rust ---- IO Reader

2020-03-05
阅读 2 分钟
1.8k
IO操作是咱编程时经常会遇到的,两种语言都提供了通用的Read方法,可以让咱从reader结构体里面读出数据。 Go {代码...} 可以看出在 go 语言里面某个类型是否实现了某个接口,是没有显示标注的,只要函数签名相同,就可以说是实现了这个接口。 a.Read(b)表示把a里面的数据复制到b,并修改a里的已读坐标。 举个栗子 {代码....

通过例子学习 Go 和 Rust ---- 类型与泛型

2020-03-04
阅读 2 分钟
1.4k
这两门语言都是强类型的,不过rust由于其特有的Trait机制,使得咱可以在编写函数的时候不指定参数类型,取而代之只指定类型所具有的Trait。go语言中一般就只针对某种类型来编写函数。

通过例子学习 Go 和 Rust ---- Interface 和 Trait

2020-03-03
阅读 2 分钟
3.5k
Go 的接口(interface)和 Rust 的特征(Trait)是经常被放在一起做比较的概念。咱可以用它们来实现计算不同几何形状的面积和周长的功能。

通过例子学习 Go 和 Rust ---- 指针

2020-03-03
阅读 1 分钟
1.6k
指针表示内存上的一段数据的位置、长度、类型信息。在 Go 和 Rust 里面都可以操作指针,咱用一个最简单的例子来看看它们的异同之处。 Go {代码...} {代码...} 在 go 语言里,参数传入的时候是默认复制一份的,所以不会被修改。除非传入的是指向数据的指针。 Rust 在 Rust 里咱可以实现一样的机制。 {代码...} {代码...}

通过例子学习 Go 和 Rust ---- 闭包

2020-03-03
阅读 1 分钟
1.5k
闭包简而言之,是一段有状态的代码。咱试着用闭包来做一个计数器,每次调用,闭包的状态就加1. Go {代码...} {代码...} Rust 由于编译时我们无法知道闭包的体积,所以用一个Box把它套起来。另外,闭包的具体类型是不可描述的,只能用dyn关键字来通过Trait来描述。 {代码...}

rust代码阅读 之 libsecp256k1 (1)

2020-02-24
阅读 2 分钟
1.5k
在 rust 里, 想要让某个 struct 可以进行某种运算, 例如加法, 只需要实现对应的 Trait 即可, 非常方便. 另外, 每种 Trait 的标识包括名称和类型签名. 一样的名称, 可以有不一样的类型签名.

互联网五十年 之 URI 和 URL

2020-02-24
阅读 1 分钟
1.2k
URI(宇宙资源标识符)是由 T. Berners-Lee 在 1994 年 6 月与 RFC1630 中提出的概念. URL(独特资源标识符) 是 URI 的一种形式.

互联网五十年 之 Socket 的诞生

2020-02-23
阅读 1 分钟
1.4k
A major issue is how to refer to processes in a foreign HOST.... The elements of the name space are called sockets. A socket forms one end of a connection, and a connection is fully specified by a pair of sockets.

互联网五十年 之 ASCII 编码

2020-02-23
阅读 1 分钟
1.5k
1969 年十月16 日, 网络工作组的 Vint Cerf 发布了 RFC20: ASCII format for Network Interchange. 奠定了 ASCII 字符集在网络传输中的地位.

[elixir! 55] DateTime 的正确比较方法

2019-11-01
阅读 1 分钟
1.3k
用 Ecto 的时候通常会自动添加 timestamp(), 它的类型是 DateTime. 在 iex 里面看是这样的: {代码...} 它的本质是一个 Map 结构, 如果直接进行比较, 会不准确: {代码...} 正确的方式可以是先转换为 unix timestamp 再比较: {代码...} 注意, 如果是 native 时间戳(不包含时区), 要先转换成包含时区的 DateTime. {代码...}

[elixir! 54] Plug.Conn.read_body 的配置问题

2019-11-01
阅读 2 分钟
1.1k
此函数有三个配置选项, 根据文档, length: 表示这一次函数调用读取数据的长度; read_length: 表示从底层的 socket 每次读取数据的长度; read_timeout: 表示从底层的 socket 每次读的 timeout.

[elixir! 53] ssh 到 ipv6 地址, 以及如何配置 DNS 到 ipv6

2019-10-31
阅读 1 分钟
6.9k
@和%之间就是服务器的 ipv6 地址.eth0是ipv6 必须要加的一个设备号, 也可能是eth1或eth2之类的.-i命令后面是我们的私钥文件.

[elixir! 52] 使用 PhoenixLiveView 调用 JS 代码

2019-10-30
阅读 1 分钟
1.2k
需求: 新内容出现时滚到到底端 1 定义js钩子代码 {代码...} 2 在 html 元素上引用钩子 {代码...} 很简单地实现了对js 代码的调用.

[elixir! 51] Stream.resource 和 Enum.reduce_while 的用法

2019-10-28
阅读 1 分钟
998
Stream 看个简单的例子, 如何制造一个 stream 源, 并且用 reduce_while 来提取数据. 计算自然数集合中数字的和, 直到遇到不满足条件的数. {代码...}

[elixir! 50] 使用 nginx 为 phoenix 应用做 https 转发

2019-10-25
阅读 2 分钟
1.4k
安装 nginx 之后, 将 /etc/nginx/nginx.conf 修改成: {代码...} 保存后运行 sudo service nginx reload 即可. 注意 nginx 会自动忽略带有下划线 _ 的 http headers. 所以尽量使用 X-My-Header 来定义 headers.

[elixir! 49] 对大文件做哈希运算

2019-10-23
阅读 1 分钟
2k
erlang 的 :crypto 标准库中有内置 :crypto.hash_init/1 :crypto.hash_update/2 和 :crypto.hash_final/1 这三个函数, 帮助我们进行分步的哈希运算.

html 冷门小知识: 描述型列表

2019-10-18
阅读 1 分钟
853
描述型列表 {代码...} dl: description listdt: termdd: description