Code | tags

Python 结构化日志设置[翻译] 25-07-06

在日常开发中,python 项目常用的 log 方法就是 logger.info(f"xxx failed, {user=}, {filename=}"), 这样的日志包含一定的信息,在大多数情况下是够用的,但是在大型、可观测性要求较高的情况,还需要更多的上下文信息才能定位问题,例如,这个日志属于哪个请求,如果日志里面充满了相同用户的不同文件名称的日志,还是无法定位上一步某个关 …

Golang 错误处理和日志 25-05-11

Go 语言的错误处理和日志规范。 […] package myerrors import "errors" // Err 前缀 var ErrNotFound = errors.New("not found") // 或者自定义一个错误类型 实现 Error() 方法用于 error wrap // 一般是 Error 结尾 type …

Golang 编程初体验 25-05-05

总结一下最近使用 golang 写了几个简单的工具和项目的初体验。总体来说 golang 在语法设计上面是非常糟糕的,个人非常不喜欢,但是在运行时和标准库上面,确实解决了之前编程语言的很多痛点,所以目前 golang 确实在业务项目蚕食 Java 的地盘。但是!JVM + Kotlin 还是目前最好的业务技术栈,如果不需要计算性能的话,有了 typing 提示后 web 上面 Python 也是很 …

Modern Javascript Features 25-01-12

一些很甜的 JS 语法糖。 […] 当值为 nullish 时使用默认值。注意,nullish 和 truthy 不一样。 nullish: null or undefined. […] const foo = null ?? 'default string'; console.log(foo); // Expected output: …

油猴脚本开发笔记 24-09-07

以前都是用别人的油猴脚本,这次自己开发了一个自动化脚本,记录一些笔记。 […] 直接油猴编辑器里面编写代码实际体验很差,包括代码补全等,理想的方式应该是在 vs code 开发,让 chrome 实时获取本地脚本。 […] // ==UserScript== // @name DevInLocal // @namespace …

在 CI 环境配置 puppeteer 以及 bun 的使用 24-08-11

在流水线 CI-CD 环境中打包部署 puppeteer 服务的一些注意事项。 […] puppeteer 新版推荐使用配置文件(.puppeteerrc.js),而不是 .npmrc 环境变量。配置方式参考:https://pptr.dev/guides/configuration/ […] npm mirror 的二进制文件下载地址、web url 地址、npm 包 …

Pydantic v2 Sqlalchemy v2 项目开发总结 24-08-10

最近使用 fastapi pydantic(v2) sqlalchemy(v2) 写了一个两千行左右的 API 项目,这是第一次面向 class 写 python 项目,和以前使用 requests、pandas 写数据处理脚本有很大区别,特别是 sqlalchemy 第一次使用,看文档内容非常多,在和 pydantic 的 schema 相互转换遇到很多问题,所以做一个笔记。 …

Java Vector Api 和 Elasticsearch 性能提升 23-11-18

OpenJDK project panama 中一个重点功能就是 vector api,可以显著提升矩阵计算密集型程序的性能,例如在图形计算、机器学习、大规模计算(Lucene)等。 […] CPU 的每个处理单元一次运算只能计算一个值,这个值成为标量值(scalar value)。处理单元需要 0 或多个周期(即 CPU 频率)完成一次操作计算。现代 CPU 包含多个核心,每个核心 …

Python @contextmanager 的使用 23-11-05

日常开发中使用这个注解的情况比较少,今天发现其实有一个临时环境变量设置的使用方式。

使用 OpenPyXL 读写 excel 大文件 23-05-07

使用 python OpenPyXL 读写 excel 大文件时,有专门的 read_only write-only 模式来提升读写效率。 […] from openpyxl import load_workbook wb = load_workbook(filename='large_file.xlsx', read_only=True) ws = …

Kotlin Coroutine 23-04-30

A coroutine is an instance of suspendable computation. 协程是可被挂起的计算的实例。换句话说协程是一个对象,这个对象保存着一段可以切换线程的任务 + 当前执行的状态两部分信息。 日常涉及协程的编码,主要是描述协程的任务和管理多个协程的生命周期、异常处理等。 […] Kotlin 使用堆栈帧管理要运行哪个函数以及所有局部变量。挂起协 …

云原生 Java 开发框架 Quarkus 学习笔记 22-07-09

MicroProfile 是一个微服务的平台定义,目标是针对微服务架构优化企业 Java 开发。由于 JavaEE 的标准更新越来越慢,跟不上 Web 技术与 K8S 的发展,于是一组供应商(包括 Tomitribe)决定创建 MicroProfile, 这是一个优化的微服务架构平台,在 2016 年加入 Eclipse 基金会。 MicroProfile是一组规范, …

Git 的 detatched Head 模式和解决问题方法 22-03-09

有时候 commit 完代码后git push会遇到下面的错误 […] To push the history leading to the current (detached HEAD) 错误提示说当前 HEAD 没有指向任何分支,但是你记得明明有指向一个分支的 […] 1、假设你当前在 master 分支,且有两次提交 […] Prj on  …

Python Tips for Impatient Dev 22-01-31

py3.6 开始,推荐使用 f-string,不要使用 %s或者 "".format().如果接收用户输入,使用 Template 做安全校验。 在 python f-string 中可以通过变量或者表达式后面加=实现打印变量名或者表达式: […] print(f'{v=}') # 等价 print(f'v={v}') …

使用 Happypack 优化 webpack 打包速度 21-09-12

一个 ionic app 本地编译需要 8 分钟,提交到流水线编译耗时需要近 40 分钟,从日志看到 webpack 打包步骤耗时最严重。 […] 初步判断是流水线使用的容器 CPU 性能较弱或者存储 mount 性能导致的。找流水线同事支持配置了一个纯内存编译流水线,发现还是很慢。接下来使用 webpack 的插件speed-measure-webpack-plugin监控性能。 …

在 Githook 中调用 Nodejs 脚本 21-08-22

如何在 githook 中调用 nodejs 脚本。主要踩坑在于不知道如何在 bash 中获取 node 脚本返回值,搜了好大一圈。 […] 微服务模式开发中,每个小组维护自己的应用,通过一个 nginx 入口反向代理所有的子应用,向用户开放一个站点.nginx 应用中需要维护各个子应用的代理,即 ng.conf 中的 location. 此外, …

Tour of Rusts Standard Library Traits[翻译] 21-04-11

关于 rust trait 非常好的介绍,比 rust book 详细,系统。 […] Have you ever wondered what’s the difference between: […] Or ever asked yourself the questions: […] Well then this is the article …

Python 如何实现一个拼写检查器[翻译] 20-10-25

谷歌 AI 负责人 norvig 在 07 年写的如何实现一个拼写纠正器的经典博文How to Write a Spelling Corrector. 上面的链接已经是 16 年更新过了,程序也更新到了 python3. 中文版的翻译 如何实现一个拼写纠正器 还是基于 07 年版本的。 […] 博文最有意思的地方是大牛记录了如何在飞机上面没有网络的条件下徒手写一个准确率超过 70% …

Java 8 Lambda 笔记 20-08-06

Java 是 OOP 语言,使用对象封装。由于函数不是一等公民,无法在方法中传递函数/方法。在 Java 8 之前,使用匿名类表示行为: […] // 监听器接口 public interface ActionListener { void actionPerformed(ActionEvent e); } // …

Python 4 道笔试题 20-06-04

4 道常见的 python 面试题和解答,以及一些 python 陷阱的链接。 […] def change(v): v[1] = 4 return v a = [1, 2, 3] print(change(a)) print(a) 题目 2 def append1(x=[]): x.append(1) return x def now(n=time.time()): …

Scala Python 文件读取跳过转义字符 20-06-04

在文件读取的时候,会遇到非法转义字符,导致文件按行读取失败。此时可以通过忽略转义字符来解决。本文记录了 scala 和 python 的方法。 […] 有 50G 的服务器日志,拆分为几千个 txt 文件,编码是 utf8,使用 scala 和 python 按行处理: […] def main(args: Array[String]): Unit = { for …

Matplotlib 图例中文乱码解决方案 20-05-01

很久以前写的一个答案,四年来一直有人评论感谢,说只有我的方法是有效的。非常意外也很高兴。也放到博客中里备份吧。 zhihu.com

Rust Ownerships Lifetimes 教程 20-02-22

some notes on rust ownership,reference,string and &str, and lifetimes […] //heap and stack: stack is store data that known,fixed size. //memory manager keeping track of what parts of code …

SpringBoot & Rust 应用的 Dockerfile 优化 20-02-03

记录 spring boot 和 rust 项目的 Dockerfile 的最佳实践。 […] spring.io 提供了一个 boot 应用的Dockerfile指导。 不过有个问题,这个 Dockerfile 使用的 maven 是项目源码里面 copy 过去的。在一般企业项目中这么做显然不规范,直接使用 maven 基础镜像更合理。 […] Dockerfile …

Docker CMD ENTRYPOINT 区别 20-02-02

记录 docker 中 exec form 和 shell form 的区别,CMD 和 ENTRYPOINT 区别,以及最佳实践。 […] # exec form <instruction> ["executable", "param1", "param2", ...] # shell form …

Scala uniform access principle 20-01-31

虽然代码写的很水,但是我对各种编程语言一直比较感兴趣。除了工作中使用的 Java 之外,自己也了解 Python,Groovy,Scala,Kotlin,Clojure,Go,Rust.其中 Python 和 Scala 在工作中也偶尔使用。了解不同的编程语言语法对于编程思维的影响还是蛮有意思的。 例如,只会 Java 的开发者可能没有听过模式匹配 (pattern match). …

Highlights in Scala for Impatient 2nd 20-01-15

key points in scala-for-impatient 2nd book, best book for java developer to use scala in a rush. scala-for-impatient 章节摘要,这本书对于 Java 开发者快速上手 Scala 帮助很大。

Rust Packages Crates Mod Notes 20-01-12

初学 rust 对于项目的 package 和 crate 的关系,module 和文件的关系有点理不清。做了一点笔记。 […] A Cargo.toml is a package. and must have a package name, defined in [package] table: […] [package] name = …

Git 常用命令备忘录 19-09-01

记录日常开发中偶尔会遇到的但是总是记不住的 git 命令。 以下技巧都来自于oh shit git 和 stackoverflow,版权归作者所有。

Scala Collection Tips 19-05-19

scala collection 提供了一整套独立于 Java 的高性能集合,使用上非常灵活,所以需要清楚一些常用的方法: […] //reduce 是一个二元函数,遍历整个集合 List(1, 3, 5).reduceLeft(_ + _) // == ((1+3)+5) //reduceRight start from end of the collection //also …

使用 GTmetrix 对前端静态资源图片优化[翻译] 19-05-19

GTmetrix 是一个前端页面测试的网站,可以发现你的站点哪些资源加载速度较慢,并针对性的优化。本文包含如何使用 GTmetrix 优化网站图片性能。 source:How to Optimize Images: A Practical Guide

Spring FactoryBean and ContextAware 19-05-16

理解 Spring 的 FactoryBean 和 ContextAware 接口。 […] 一句话就是 FactoryBean 用于返回其他对象实例的,而不是自身类型的实例。 […] public class Tool { private int id; // standard constructors, getters and setters } public …

通过例子学习 Clojure 19-05-13

这份笔记试图打造最强的 clojure 小抄,keep refactoring it…

理解 Elasticsearch Query DSL 中的 JSON 结构 19-05-01

理解 ES 搜索中 JSON DSL 有助于自己写 JSON 查询,特别是手写复杂嵌套 json。 […] { "mappings": { "_doc": { "properties": { "city": { "type": "text", "fields": { …

Useful Scala Code Snippets 19-04-26

多个 map 合并,key 相同时则 value 相加

Scala Future 19-04-21

some notes on scala future, includes: […] import java.time._ import scala.concurrent._ import ExecutionContext.Implicits.global Future { Thread.sleep(10000) println(s"This is the future at …

Spring Cache Notes 19-04-18

spring 的缓存一些技巧和陷阱 […] spring 的缓存

Spring Boot Notes 19-04-14

一些容易忘记的 spring boot 知识要点。 […] 注意,.yaml 和.yml 文件没任何区别。 […] @SpringBootApplication // <=等价=> @Configuration @ComponentScan @EnableAutoConfiguration 自动配置 spring 的自动配置依赖以下注解: …

Pattern Matching Anonymous Function 19-03-31

Scala 中很多使用 if 的地方都可以用 match case 来替换。常见的就是下面的这种写法: […] val res = msg match { case it if it.contains("H") => "Hello" case _ => "Other" } //更常见的用法是去匹配参数的模式: case …

Scala Type Class 19-03-31

scala type class notes: 关于 scala type class 非常好的文章 […] //scala 没有专门的 type class 语法,而是借助 trait + implicit + context bound 来实现的, //所以很多时候识别 type class 比较困难。 //type class 由三部分构成 //1. type class: 即 …

Scala 学习笔记 19-03-31

some notes on scala, includes: […] 目前用 sbt 的项目比较少,maven 的更多。而且 sbt 烧 cpu. maven 项目使用 scala 参考我的 gist:scala_maven_pom.xml […] 学习 scala 可以使用 scala 插件的 worksheet,这是一个基于脚本互动的 REPL. 本文后面的代码全部 …

使用 Redis 的 hash 优化内存使用[翻译] 19-03-31

使用 redis 的 hash 优化内存使用 […] 场景:有 3 亿张图片放在对象存储 (DELL ECS/AMAZON EC2) 上面,现在需要保存图片的 id->用户 id 的映射。最直接的思路是: […] set "media:1155220" "user1" set "media:1155221" …

Scala 2 Implicit 19-03-30

//隐式参数是在调用时可以自动填充的参数,需要在调用范围内(scope) 有一个隐式变量可供填充。 def addInt(i:Int)(implicit n: Int) = i + n //需要提供一个隐式变量 n implicit val sn = 1 addInt(2) // 3 //如果有两个满足类型的隐式变量,则在编译 addInt(2) 时报错 //scala …

使用 travis 自动发布 markdown 到博客 19-03-30

如何使用 github pages 和 github actions 构建静态个人博客站点 […] 更新:github 开放 action 功能后,travis-ci 已经没有必要了,目前博客使用 zhimoe 仓库管理源码,使用 action 编译后将 public 目录同步到 zhimoe.github.io 仓库的 gh-pages 分支。 注意,由于使用了 jsdelivr …

WSL 配置 Docker 环境 19-01-01

使用 wsl,MobaXterm,cmder,docker 打造可视化的 linux 开发环境 […] 离不开 Windows 的理由很多,作为后端开发需要使用 linux 的情况也很多,双系统总归是不方便,而且 linux 下的 GUI 体验也没用 Win 10 好。 如果使用虚拟机,那么文件交换和网络等各种问题也需要解决,对系统的内存要求也更高一些。 …

Neo4j 入门 18-12-01

neo4j 是目前排名最高的图数据库,分为商业和社区版本,社区版只支持单机,而且查询的运行时 (runtime) 不同 (cypher runtime:interpreted(社区版),slotted(企业版)). 数据库排名可以在 https://db-engines.com/en/ranking/graph+dbms 查看,下一代最有前景的开源图数据库是 dgraph,目前还积极开发中,生产未 …

Jupyter Notebook Install New Package[翻译] 18-11-01

在 pycharm 写代码中如果使用到新的 package,例如numpy,只需要输入import numpy 然后 ALT+ENTER 在提示中选择 install new package 即可。 […] 在 notebook 中,网上的教程都说是!pip install numpy. 但是这个可能有坑。究其原因是因为: […] 通过 bash …

Spark Basic 18-03-31

大数据计算和普通的程序并无本质区别:数据输入=>计算=>输出和结果的持久化。这里的挑战在于计算的效率和容错性。由于数据输入巨大,计算的效率是基本的要求。为了在通用硬件上高效完成大量计算,唯一的途径就是将计算任务拆分分布式计算。这就引出了新的问题:分布式计算资源的管理(Mesos,YARN),分布式计算失败后的恢复(容错性)(Spark RDD),以及分布式的数据输入和保存( …

Java 单元测试如何 Mock 有参数的 void 方法 17-04-23

测试中如果遇到被测试方法调用 void 方法,在 Mockito 中改如何处理? […] 假设有如下的服务依赖: […] @Service class DepositSvc { @Autowired private AccountSvc accSvc; public List<Account> dps(String user) { …

Java Stream Write Reader notes 16-03-01

上次总结了 java 中不同读写文件的方法,这次总结一下基本的 IO 流。网上的总结大部分是以 Stream 和 Reader、Writer 来介绍的。这次从封装层次来介绍。 […] […] 首先理解计算机文件格式都是二进制数据,例如文本,图片,视频,音频等,但是文本非常特殊,所以单独有一类封装设计。 对于非文本类的文件,一般是读取字节 (stream),而对于文本类文 …

Java 6/7/8 中文件读写 16-02-01

如何在 Java 中读写文件,这里保留 Java6/7 版本,但是你永远不应该使用它们,优先使用 Path、Files、Paths 三个类。 资料:Reading and writing text files […] 不要用 File 对象,改用 Path 对象,该对象既表示文件路径,也表示文件文本(应该认为文件也是路径的一部分),对于以前的 File, …

Java 动态代理 16-01-01

Java 动态代理机制分析及扩展,更深入的一篇:java 设计模式 - 动态代理模式 […] 相比 静态代理,动态代理具有更强的 灵活性,因为它不用在我们设计实现的时候就指定 某一个代理类来代理哪一个被代理对象,我们可以把这种指定延迟到程序运行时由 JVM 来实现。 […] 动态代理类接口,接口规范方法。 […] package …

Java 注解和注解处理器 16-01-01

注解是 jdk1.5 出现的,但是自定义处理注解的功能是 1.6 才有的。Element 等关于注解源码抽象的支持类都是 1.6 出现的。 […] annotation processing integrated into javac compiler since Java 6.0, known as pluggable annotation processing. compiler …

Java-==-and-equals 16-01-01

samples code and notes on java == and equals

Java类加载过程和子类重写父类方法的调用 16-01-01

最近非常火的一道携程面试题 Java […] public class Base { private String baseName = "base"; public Base() { callName(); } public void callName() { System.out.println(baseName); } static class Sub …

单例模式和序列化 16-01-01

Java 单例模式的各种写法和序列化 参考资料 […] public class Singleton { private static Singleton instance = null private Singleton (){} public static Singleton getInstance() { if(instance == null) instance = new …

理解 Gradle build 脚本结构与语法 16-01-01

在看这个之前,希望你有用 ant 或者 maven 的使用经验,还有,对 groovy 的语法有一个简单的了解,不懂也没关系,下面会介绍。 理解 gradle 文件的前提是理解一个重要的 groovy 概念 – closure […] 一个 closure 是一个定义在 groovy 文件中的{}代码块,这个代码块类似 js 中的匿名函数,它可以被赋值给变量,可以被调用, …

Java 新手如何学习 SpringMVC 框架 15-08-21

知乎回答备份,原答案写于 15 年 6,404 人赞同了该回答 […] 4 年之后感觉自己当年写的真好。O(∩_∩)O 哈哈~ […] 评论里面有人写到现在都用 spring boot,个人觉得 boot 只要搞清楚一个 autoconfig 就懂了小半了。 […] 学习框架的同时还是需要针对性地深入学习一些 Java 基础,例如反 …