Skip to content

zongwu's blog

Category: blog

Scotty web framework 源码初探

scotty 是一款非常容易上手的、构建在 WAI/Wrap 之上的 Haskell web frameowrk,官方文档的 start 例子:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty

import Data.Monoid (mconcat)

main = scotty 3000 $
    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

编译运行即可体验简单的 web 应用。

WriterT 相关源码分析

看完ReaderT源码,接着来分析WriterT的源码。

示例

先看一个超级简单的例子:

import Control.Monad
import Control.Monad.Trans.Writer

data LogEntry = LogEntry { msg :: String } deriving (Eq, Show)

calc :: Writer [LogEntry] Integer
calc = do
    tell [LogEntry "Start"]
    let x = sum [1 .. 10000000]
    tell [LogEntry (show x)]
    tell [LogEntry "done"]
    return x
    
test = execWriter calc
test2 = runWriter calc

test执行结果:

[LogEntry {msg = "Start"},LogEntry {msg = "50000005000000"},LogEntry {msg = "done"}]

[翻译]ReaderT 设计模式

讲解工程实践中为什么需要 ReaderT 模式比较清晰的文章,就翻译了一下。原文见这里

在工程实践中,一些语言比如 Java 通过设计模式用来解决某些常见的场景问题。Haskell 语言没有这类设计模式,它通过语言层面的特性解决这些问题。 然而,我相信仍然有一些关于程序结构的高级指导的空间,我将其松散地称为 Haskell 设计模式。 这次描述的模式被称为 ReaderT 模式 。我将其用作 Yesod 框架 Handler 类型设计的基础。

至今我们仍未得知那些平行宇宙里的小白鼠们是否懂得信息论

问题

假设现在有1000瓶药水,其中一瓶是毒药,服用后一小时发作身亡。毒药可以无限稀释,并且混合药水花费的时间可以忽略,那么给定一小时你需要至少几只小白鼠来找到毒药?

一直以来,小白鼠们为生物医学科研和制药行业贡献太多。

REST 以及 RESTful 辨析

REST概念提出到现在已经20年了,业界的主流实践采纳借鉴了其部分原则,但与其最核心的架构设计渐行渐远。

实际上那个去中心化的、面向全世界开放的万维网时代正在落幕,构建在其基础之上的REST架构思想,也无可避免地被冷落或者被误解。

adsf-vm

官方给出的定义是:

Manage multiple runtime versions with a single CLI tool

大家在日常开发时,经常遇到需要对同一个编程语言/框架安装不同版本的情况,比如 python 2/3 ,ruby 1.8/1.9,scala 2.11/2.12/... ,gradle 4.x/5.x 等等。虽然已经有pyenv,rvm,sdkman 等等针对这些语言进行多版本的管理,方便不同版本的环境切换,但是:

一致性模型

基本概念

正确性(Correctness)

一个系统是由一个状态和一些转换该状态的操作组成的。当系统运行时,它通过一些操作记录从一个状态转换到另一个状态。

Rust mio库源码情景分析

mio 是 Metal IO,Rust语言生态比较底层的I/O库,官网的介绍:

Mio is a lightweight I/O library for Rust with a focus on adding as little overhead as possible over the OS abstractions.

mio目前已经发布了v0.6.19版本,这次分析代码版本选择 master分支,commit id 14f37f283576040c8763f45de6c2b2bbcb82436d

我们从官方自带的example进行源码跟踪分析。

最简单的内网导航网站

随着业务系统的增长,运维工具的增多,我们经常需要访问监控页面、ssh登录机器,需要记住很多常用信息,但是这些信息不值得占用宝贵的大脑资源,只需要存储下来用的时候访问即可。 我们需要一个超简单的导航网站。

如何最简单地实现一个静态的网站?不要任何多余的东西。

最好几行代码实现服务,向外提供一个html文件访问服务。新增内容时候,只需要添加到html文件即可。

《从0到1》读书笔记

市面上大把的书教你如何变得优秀:如何成为优秀的人,如何创立优秀的公司。

这本书谈的是卓越。

优秀是大众看得到的,显而易见的好,但卓越一开始是反直觉的,而且很难,直到最后的结果太强大,大家不得不接受。

如果你照搬他们(比尔盖茨,拉奇佩里,扎克伯格)的成果,你就不是在向他们学习。

画家齐白石也有过类似的话:

学我者生,似我者死。

模仿大师的产品,是没有前途的。要模仿学习的的是他们的思考方式。

高性能OLAP调研

业界有没有面向亿级数据多维度组合查询能够亚秒级响应的系统?

到底是谁的All In

3周了,朋友圈还是陆续有创业者转发这篇文章。

https://mp.weixin.qq.com/s/-PZ-NtXAfg2jNEmvKN5OBQ

很可惜这篇文章出现了严重的定位错误。

如果文章名字叫《不能All in 的人别去创业》讲给创业CEO听的,倒是贴切。

但讲给创业公司的所有员工听,那只能说是认识上犯了很大的错误。

软件工程的手工艺时代

目前的软件设计/软件架构非常依赖个人经验。

基本上是从个人经验出发定义问题,分析问题抽象模型然后做决策,不具备普适性更不能形式化证明,不能流程化,没有坚实的系统化的理论指导。

很多人喜欢谈架构,在架构设计上争高低,但大部分都是谈论基于自己经验的认知甚至都没有对当前问题做统一定义。

HanLP vs LTP 对比

两个NLP库对比

HanLP https://github.com/hankcs/HanLP 自然语言处理库。

LTP https://github.com/HIT-SCIR/ltp 哈工大 语言技术平台(Language Technology Platform,LTP)。

一加3T Root

预备

安装adb,直接安装 android sdk 即可。配置adb所在目录到环境变量

下载TWRP的 recoveryhttps://dl.twrp.me/oneplus3t/twrp-3.1.1-2-oneplus3t.img.html 保存为 twrp-oneplus3.img

下载SuperSU https://download.chainfire.eu/1021/SuperSU/SR3-SuperSU-v2.79-SR3-20170114223742.zip 保存为 sr3-superSU.zip

进入到 twrp-oneplus3.img sr3-superSU.zip 所在目录,方便执行命令。

数据抽象

SICP在第二章(构造数据抽象)中提出了一个问题:
数据究竟意味着什么?
书中的答案是:数据是一组适当的选择函数和构造函数。
(这里的适当的是指那些能够刻画数据本质特征的)
也即是:数据是函数

业务模块无耦合通信协议的设计

定义

模块:独立提供特定业务功能的完整体,这里并不指代无业务的基础组件
主客户端:接入各个模块的容器App
通信解释器:实现了本文定义的通信协议的组件

问题

虽然目前我们已经在代码组织形式上拆分了出了各个module,避免了代码级别的到处复制,在主客户端组合了每一个业务模块,但是目前的模块化依然存在诸多问题: