Posts

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

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

支持中文的等宽编程字体:ArgonHan 23-10-28

update on 2024.10 英文字符切换成了 GitHub 出品的 Monaspace Argon 字体,更加美观耐看了。文末截图没有更新。 中英宽度 2:1 的字体推荐 LXGW Bright Code,是霞鹜文楷和 Monaspace Argon 合并的字体。 […] 个人对于字体有严重的强迫症,在过去十年里(以后应该也会)一直在换各种编程字体, …

Python 异步编程 23-09-24

异步编程很难,但却是最近十年所有编程语言在发力的方向。 在面向 CPU 计算的场景下,多线程基本都能吃满 CPU 资源。但是在 IO 场景下,多线程并不能解决问题,大部分时间线程都在等待 IO 调用的返回。 实际上 python 的官方教程里面并没有 async 编程的内容,而是在std lib doc 中网络编程章节介绍了 asyncio 这个 lib,实际上这也是异步编程的最佳使用场景。 …

Java 并发 5-虚拟线程(VirtualThread) 23-09-13

回调和反应式编程都可以实现系统吞吐量有效提升,但是这两种编程模式存在阅读、编写、调试困难的问题,所以实际项目中还是以线程池为主。但是 java 的线程是平台线程,可以理解为并行线程数最多等于 CPU 核数 (macOS 查看核数sysctl hw.physicalcpu hw.logicalcpu),并且存在线程内存占用大,上下文切换耗时高问题,所以在高并发请求中表现不如前面两种模式(spring …

Git 内部原理-对象、分支以及底层命令[翻译] 23-08-06

我们中的许多人每天都在使用 git,但是有多少人知道它的内部是怎么运作的呢? […] 例如我们使用 git commit 时发生了什么?提交(commit)与提交之间保存的是什么?两次提交之间难道只是文件的差异(diff)吗?如果是,这个差异是如何编码的?还是说每次提交都会保存一个当前仓库的完整快照(snapshot)呢?我们使用 git init 时到底发生了什么? …

Rust Error Handling Notes 23-07-22

初学 rust 的时候,上手写代码总是遇到很多不一样的 rust 的Result类型,不同 crate 中的函数返回的Result<T, E>的E都不一样,刚开始都是unwrap或者expect来处理。如果使用try!或者?的话总是编译不通过,还是对 Error 转换和处理不熟练。 […] 在一个方法中,调用不同的函数会返回不同的 error 类型,需要你将这些类型转换成 …

使用 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 使用堆栈帧管理要运行哪个函数以及所有局部变量。挂起协 …

SSH 访问 Windows 的 WSL2 Ubuntu 22-10-30

配置 Windows 和 WSL2,使得能通过其他电脑远程 SSH 到 WSL2 Ubuntu。 […] 之前的电脑配置是 LinuxMint 台式机 + M1 macbook 笔记本。使用 Linux 主要原因是命令行和 Docker. 最近由于二十大,工作 VPN 在 macOS 不让用,只能将台式机安装上 Win10,发现 docker 在 WSL2 运行非常丝滑,这样正好可以 …

云原生 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  …

Scala3 缩进语法总结表 22-02-02

Scala 3 在语法上面新增了一种 Python 的缩进格式,两种格式都可以使用。但是目前部分情况还是需要使用括号。 个人对新语法是支持的。缩进可以极大地提供代码的可读性和整洁,最大的体会就是 SparkStreaming 的 rdd 处理代码,新手容易写出十几个}括号嵌套代码。 当然缺点是缩进不利于代码复制和格式化。 […] 下面是书本上关于 Scala3 的语法对比。注意,两个 …

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. 此外, …

Typescript Comprehensive Cheatsheet 21-08-14

一份详尽的 ts 语法笔记。这周在看组里前端同事的代码,感觉完全还是在写 JS,以我有限的 JS/TS 知识,也知道可以写得更加规范一点。但是一上手开始改,还真是手生。 又重新过了一遍文档,做了一点笔记。

开源与心理健康[翻译] 21-07-08

我一位亲爱的朋友,也是高产的 Redox OS 贡献者 jD91mZM2 在 2021 年 3 月去世了,年仅 18 岁。他参与了 2018、2019 和 2020 年的 Redox OS 夏季代码活动。他在开发 Redox OS 的各个方面都做出了贡献,从内核,到 relibc,到移植程序。他的工作详细介绍可以在Redox OS 新闻中署名为 jD91mZM2 的帖子看到。 这个帖子可能是黑暗 …

买房装修总结 21-05-09

简单记录一下自己买房和装修的一点经验。 […] 自己买房比较离奇,杭州开始实行摇号的半年后,端午节在老家刷微信,看到有个红盘有 6000 多人报名,感觉买房都要开始碰运气了想到了车牌的悲剧,于是返杭后下车就去那个楼盘看了一下,小区旁边在修地铁,看了几眼沙盘,第二天就借钱登记摇号了,没想到第一次就中了。现在回想起就做梦一样。网上关于如何买房的经验特别多,例如杭州房产知识扫盲,上海买房等 …

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% …

Associated Type in Rust 20-09-20

Associated Type and generic diff in rust […] a type Foo = Bar outside is just type alias. most used in generic type. […] like: type Thunk = Box<dyn Fn() + Send + 'static>; …

编程字体推荐 20-08-21

个人对于编程字体有严重的强迫症,几乎每个月都会在X上面搜索“programming font”或者看下 programmingfonts.org上面有没有上新字体。下面总结自己曾经用的比较久的字体,主要是编程字体。 […] Aurulent 下载 […] […] Fira Code 是全网最受欢迎的编程字体,可以说是这个字体让 Ligature …

如何正确地系鞋带 20-08-21

Ian 安全结是登山系鞋带的首选,它越穿越紧,不会松开。解鞋带轻轻一拉即开。而且对称美观,上手简单。值得每个人花十分钟学习。 本篇不仅给出 Ian 安全结示意图,还告诉大家如何让安全结和蝴蝶结水平对称,尽可能美观的秘诀。 […] […] […] 以上是 Ian 结的步骤。下面是重点: […] 无论是 Ian 蝴蝶结还是安全结,如果你发现自己的 …

Java 8 Lambda 笔记 20-08-06

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

基于 MDX 的 web 词典 20-07-01

Mdict 项目是一个糅合了 MDX 词典、ES 例句搜索和 AI 模型翻译的多源搜索功能 Web 词典。特别适合部署在内网中学习使用或者给孩子学习使用。 python 版本增加了一个机器学习模型翻译.rust 版本也有模型,但是还没来得及加。 […] mdict-py 源码 […] Mdict 项目是一个糅合了 MDX 词典、ES 例句搜索和 AI 模型翻译的多源搜索 …

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,版权归作者所有。

DevOps 能力成熟度模型 19-07-24

之前听说过 AWS 的软件工程师是需要自己写需求说明书,前后端代码,测试和上线。还有 instagram 的工程师可以做到 python 的代码提交如果合并到主分支后可以在一个小时内自动部署到生产被用户使用到,感觉这个非常神奇。如果需要做到这个,对组织级与个人都有极高的 devops 能力成熟度要求。 上周代表 CRM 项目通过了信通院的 DevOps 三级认证。感觉提升的空间很大。专门看了一下信 …

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 …

Java 并发 4-线程池与执行器 18-06-13

java thread pool class hierarchy Executor (java.util.concurrent) |---ExecutorService (java.util.concurrent) |---AbstractExecutorService (java.util.concurrent) | |---ForkJoinPool (java.util.concurrent) …

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 Generic 16-05-01

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 AOP 举例 16-01-01

Java AOP: 找到一个最简单的介绍,不怎么想翻译,直接看原文吧: A Simple Introduction to AOP […] 注意,使用注解的方式声明切面时,增加了一个空方法去定义 Pointcut,即: […] class Test{ @Pointcut("execution(* …

Java 并发 1-线程与任务 16-01-01

线程:任务执行的环境,可以理解为传送带。注意任务必须在线程上面被执行。 […] 任务:Runnable/Callable 的实现,可以理解为传送带上面的工序。 […] 资源:线程在处理任务具体工序时需要使用的对象,例如信号量,锁,并发集合。需要注意,任务本身描述也是一个对象(即 Runnable/Callable 子类实例),所以在 Runnable …

Java 并发 2-同步与锁 16-01-01

这三个方法是在 class Object 上面的,也就是所有对象都有这个方法。这里对象就是上一篇中类比的资源,可以当成一个信号量。 Object.wait() to suspend a thread(等价于sem.wait())。将当前线程暂停并释放当前对象锁,直到其他线程调用了当前对象的 notify/notifyAll 方法。 Object.notify() to wake a thread …

Java 并发 3-ThreadLocal 16-01-01

在通常的业务开发中,ThreadLocal 有两种典型的使用场景。 […] 场景 1,ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这样每个线程都可以修改自己所拥有的副本,而不会影响其他线程的副本,确保了线程安全。 […] 场景 2,ThreadLocal 用作每个线程内需要独立保存信息,以便供其他方法更方便地获取该信息的场景。每个线程获 …

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 基础,例如反 …

你的半步,我的天涯 13-08-09

好久没看过爱情电影了,当《山楂树》赚尽眼泪时我没有看,当《那些年》红遍两岸时,我没有看。因为没有选择,看了这部电影。 […] 《HANAMITSUKI》是这个名字,中文名是叫《花水木》。 […] 我努力想记起当中那段让我眼眶湿润的片段,却暂时空白。那些记住的片段永远都是女主角那温情的脸庞和男主人公的眉头紧锁,还有那些飘逸的花瓣,孤独守望的灯塔,蔚蓝的天空和海洋,痛苦的泪 …

写在 2012 岁末 12-12-30

时光如水,哗啦啦又是一年; 岁月如歌,唏哩哩唱不成调。 去年光棍节写了点感慨,最后是“这仍然还是最好的年代,却也是最坏的年代。2011 年的冬天,虽然阳光很好,但风还是有些冷,愿与君共勉,但冷暖自知。” 事实是 2012,冬天更冷。 […] 这会儿坐着回想今年一年,发现对上半年的记忆是一片空白。所有的记忆是从暑假回家开始的。事先没有说,出车站时发了一条短信,五分钟后朱来接我,每次放 …

小城 11-06-23

我不喜欢西安,喜欢一个地方需要时间,而我还找不到理由。我不喜欢因为我仅仅是在这里生活。 […] 我喜欢玉山,因为那里有曾经的我。一个人走在街上,忽然就觉得这一幕好熟悉,分明有一天自己也是这么走着,那天我要去干什么?我已经记不得,甚至有可能是一种幻觉。 一个能让自己产生幻觉的地方,必然是你留下了太多的记忆在那里,留下了太多的不舍和牵挂。 […] 西安没有给我什么,或者说还 …

一点回忆 10-07-24

我想这不是一篇回忆,而是心情。默存说我们年轻时很容易把自己的写作冲动当成一种写作才能。我自知没有如此高雅的才能。但也不想在某一天突然发现自己被时间推着往前走。阿七说长时间的寂寞是所有写作的滥觞。或许我的确是寂寞的吧!一个人走在无人的路上,往事就在街角处看见了…… […] 中考后的第二天,我就说服母亲让我去打工。她在担心之余试图阻止,却用错了方法--总是挖苦我:一定是没考好吧?想躲出去 …