Org-babel学习记录

基础 匿名代码段 命名的代码块 命名的代码块与结果项是可以分开的,orgmode通过代码块的名称进行匹配 定义参数 参数变量根据对应语言表现方式不同 :var x=0 Header header多行书写便于阅读 内联代码段 4 常用命令 org-babel-execute-buffer 执行buffer的所有代码段

2022-09-28 ·  (🌟Updated: 2022-09-28) · 1 min · 15 words · tomyli

Org-anki, Org与Anki的完美结合

Org-anki Org-anki是一个同步Org中note到Anki的Emacs包,它的实现非常简单灵活,文档书写体验好 安装 (use-package org-anki :commands (org-anki-sync-entry org-anki-sync-all)) 支持的note 基础note 基本的正反两面问答形式,在org中,heading表示问题,内容表示答案 * 我是问题 我就是答案了 填空型note 填空形式,处理格式为 {{…}}, 只关注heading,不关注内容 * 我是问题 {{c1::答案在这}} 嵌套型 其它也是基础型,但是这种功能让org note的组织更加友好,因为有时一个记忆点可能需要多种方式来实现 * 我是问题1 我是答案1 ** 我是问题1 我是问题1的另一种答案 上面的情况会在anki中创建两个基础的card,也就是两个记忆点,好用 常用命令 org-anki-sync-all 同步所有note到anki org-anki-sync-entry 同步当前光标所属的entry到anki org-anki-cloze-dwim 创建填空形式,要选中标题部分区域进行转换 org-anki-browse-entry 在Anki中浏览当前光标下entry的note信息 org-anki-import-deck 从Anki中导入,在Anki中已经存在部分note时,可以先导入到org中,再进行同步 org-anki-delete-entry 删除当前entry org-anki-delete-all 删除所有entry

2022-09-27 ·  (🌟Updated: 2022-09-27) · 1 min · 46 words · tomyli

Apollo不更新配置了?

问题描述 近期改造服务调用,需要使用Apollo配置进行灵活切换,上线后发现有些机器配置生效,有些配置未生效,开发小伙伴反馈此问题发生有一段时间 问题排查 机器排查 对线上机器进行排查,发现有几台机器根本没有拉取新的应用配置 指定问题机器信息 进入到问题机器查看本地Apollo文件信息 ... -rw-rw-r-- 1 mqq mqq 3429 May 19 15:32 main-webapp+default+CoopReader.baipai.switch.properties -rw-r--r-- 1 mqq mqq 1621 Jul 4 15:39 main-webapp+default+CoopReader.switcher.properties -rw-r--r-- 1 mqq mqq 89 Aug 26 11:18 main-webapp+default+CoopReader.personal.menu.properties -rw-r--r-- 1 mqq mqq 3958 Aug 26 15:45 main-webapp+default+CoopReader.common.config.propertie 可以看到文件的最新日期在8月26日 Apollo 服务的问题? 先前小伙伴反应问过运维相关问题,得到的结论是Apollo没有改动,且服务配置不是完全不可用,此方向排除 服务的问题? 从目前得到的信息可以确认是某几台机器上的Apollo client没有去拉取最新的配置信息 为什么没有拉取到最新配置? 先来梳理一下Apollo的使用流程: 业务对Apollo的访问都基于 L5 的方式 目前业务工程使用cloudlevel5.Protocol来获取L5的信息与Apollo Portal进行交互 <dependency> <groupId>com.yuewen</groupId> <artifactId>userbase-l5-system</artifactId> <version>1.0.3.Final</version> </dependency> 为什么业务机没有与Apollo portal交互? 怀疑与出问题的机器获取不到L5信息有关 问题猜测验证 大体知道问题出在哪了,下面就需要进行验证了。最简单的方式就是打印出Apollo的相关日志信息对猜测进行验证,但是目前业务的日志级别设置的 ERROR ,啥也看不到 修改业务日志级别? 现在需要打印aplllo相关的日志级别为 Info ,需要修改Logback中配置如下: <logger name="com.ctrip.framework.apollo" level="info"/> 但是还是需要发版本上线,未免太麻烦,有没有其它办法? Arthas动态修改日志级别 现在已经有非常成熟的线上调试工具了,Arthas就能实现对Logback的动态日志修改,二话不说,直接机器上修改验证 在问题机器上启动arthas java -jar arthas-boot.jar 选择要处理的应用(10384)进入到arthas ...

2022-09-16 ·  (🌟Updated: 2022-09-16) · 1 min · 208 words · tomyli

那些高效的VSCode插件

必备 vscodevim.vim 在VSCode中使用VIM angelo-breuer.clock 在状态栏增加时间显示 redguardtoo.matchit Tag匹配,在代码结构中快速跳转 kahole.magit 类Emacs magit chadalen.vscode-jetbrains-icon-theme 类JetBrains的文件图标 codezombiech.gitignore .ignore文件支持 wmaurer.change-case 快速切换选择单词的格式,支持驼峰,大小写等 lucax88x.codeacejumper 快速跳转到指定字符 NTBBloodbath.doom-one 类Emacs doom-one主题 geeebe.duplicate 复制当前光标中的行,VSCode默认行为增强 usernamehw.errorlens VSCode错误提示增强 zerodind.familiar-java-themes 类Idea主题 vsls-contrib.gistfs Github gist快速查看与编辑 qezhu.gitlink 复制当前文件的仓库地址 trixnz.go-to-method 跳转到指定方法,不包换其它Symbol信息 YuTengjing.open-in-external-app 使用外部应用打开当前文件 tootone.org-mode Emacs org-mode局部支持 mushan.vscode-paste-image 粘贴图片到Markdown Shan.code-settings-sync VSCode配置多终端同步 mybells.someone-github-stars 获取指定Githuber的Star并写入到Markdown TabNine.tabnine-vscode TabNine AI代码完成 VSpaceCode.whichkey VSCode按键修改与提示 Office Viewer(Markdown Editor) - Visual Studio Marketplace Captured On: [2023-05-19 Fri 10:08] ...

2022-09-05 ·  (🌟Updated: 2025-04-27) · 1 min · 162 words · tomyli

用Riggrep进行快速搜索

为什么要学习riggrep? Riggrep快 天下武功,唯快不破 Riggrep聪明 默认会排除 .gitignore/.ignore/.rgignore 文件下的配置和隐藏文件、二进制文件 安装 brew install ripgrep 使用说明 样例所有操作使用 study-sample 仓库,里面是常用语言的入门学习资源,操作文档结构如下: tree ~/github/study-sample /Users/tomyli/github/study-sample |-- LearnBash.sh |-- LearnJava.java |-- README.md |-- commonlisp.lisp |-- learn-emacs-lisp.el |-- learn.nix |-- learnc.c |-- learnclojure.clj |-- learngo.go |-- learnlua.lua |-- learnpython.py |-- learnrust.rs `-- markdown.md 0 directories, 13 files 基本使用 遍历查询 ~/github/study-sample/ 下所有包含 TODO say hello 字符串的结果 rg 'TODO say hello' ~/github/study-sample/ /Users/tomyli/github/study-sample/learnc.c:/* TODO say hello */ /Users/tomyli/github/study-sample/commonlisp.lisp:;; TODO say hello /Users/tomyli/github/study-sample/learnclojure.clj:;; TODO say hello /Users/tomyli/github/study-sample/learn-emacs-lisp.el:;; TODO say hello /Users/tomyli/github/study-sample/LearnBash.sh:# TODO say hello /Users/tomyli/github/study-sample/LearnJava.java: // TODO say hello /Users/tomyli/github/study-sample/learnrust.rs:// TODO say hello 查询到的结果以 文件 维度进行展示,使用 分号 进行分割,分号前为文件路径,分号后为查询匹配到的内容 ...

2022-08-30 ·  (🌟Updated: 2022-10-09) · 3 min · 552 words · tomyli

Spring的RedisTemplate如何与Lettuce进行交互的

问题 SpringWebFlux项目,使用的Redis客户端是Lettuce(基于异步),在Spring中封装了两种操作Redis的模板 RedisTemplate 与 ReactiveRedisTemplate ,正常情况下,异步编程要使用 ReactiveRedisTemplate ,那么可以在项目中使用 RedisTemplate 进行redis的操作吗?为什么? 答案 可以使用 RedisTemplate 在异步代码中进行操作 @Autowried private StringRedisTemplate redisTemplate; String value = redisTemplate.opsForValue().get(key); 追根溯源 先来明确一下应用与Redis的交互流程 Redis交互流程 获取连接 执行命令 返回结果 源码追踪 String value = redisTemplate.opsForValue().get(key); 以下以redis的get命令为例进行解析,get方法是通过 RedisTemplate 的 ValueOperations 属性进行处理的,因为 ValueOperations 是一个接口,要从其实现类 DefaultValueOperations 的get方法进行解析,直接上图 Figure 1: 整体流程图 关键点解析 第1-5步只是为了获取Redis连接 getConnection是为了获取具体的底层redis命令,项目使用Lettuce且为String操作,此处获取的连接为 LettuceStringCommands 第6步是命令执行触发点 它调用了执行DefaultValueOperations.execute(ValueDeserializingRedisCallback)方法调用时方法参数ValueDeserializingRedisCallback的实现方法inRedis,由此转入到真正的命令执行阶段 第9步获取API LettuceConnection获取的是通过调用StatefulConnection.async()方法获取的异步API 第12步进行返回处理 LettuceConnection的doInvoke方法进行了LettuceInvoker的返回处理,在里面看到的是调用了feture.get()方法使用等待的方式来实现了异步转同步的调用 获取连接阶段与执行命令阶段图示 更近一步,可以把 获取连接阶段 与 执行命令阶段 分开来,看图更加清晰 ...

2022-06-01 ·  (🌟Updated: 2022-06-06) · 1 min · 70 words · tomyli

Springwebflux源码学习-服务启动流程

学习目标 理解WebFlux核心组件HttpHandler、WebHandler的创建过程 理解DispatcherHandler如何映射请求url及参数的过程 理解Netty服务的主要启动节点 此次学习的Spring boot版本为2.6.6,对应的Spring webflux版本为5.3.18 入口 Springboot工程入口方法为 SpringApplication.run() ,从此方法开始进行分析。 public static void main(String[] args) { SpringApplication.run(Main.class, args); } 决定启动的web应用类型 整个服务的web应用类型是在构造 SpringApplication 类时进行确定的,具体代码如下: this.webApplicationType = WebApplicationType.deduceFromClasspath(); 判断应用类型的逻辑 org.springframework.web.reactive.DispatcherHandler存在 org.springframework.web.servlet.DispatcherServlet不存在 org.glassfish.jersey.servlet.ServletContainer不存在 即确认webApplicationType为 Reactive if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null) && !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) { return WebApplicationType.REACTIVE; } 创建具体的ApplicationContext 根据webApplicationType(Reactive)确定创建的ApplicationContext为AnnotationConfigReactiveWebServerApplicationContext,此Context支持 @Component 和 JSR-330规范中 @Inject 形式的依赖注解 SpringAplication.createApplicationContext() switch (webApplicationType) { case SERVLET: return new AnnotationConfigServletWebServerApplicationContext(); case REACTIVE: return new AnnotationConfigReactiveWebServerApplicationContext(); default: return new AnnotationConfigApplicationContext(); } 最主要的ApplicationContext.refresh()方法 refresh的Refresh阶段 刷新操作是在 AbstractApplicationContext 类的refresh方法中进行,在调用invokeBeanFactoryPostProcessors方法时会有对controller注解的扫描与处理 ...

2022-05-24 ·  (🌟Updated: 2022-05-30) · 2 min · 351 words · tomyli

开发中会遇到的Maven问题解惑

多模块系统版本控制问题 在开发想保持项目下的所有子模块版本一致,可以使用${rversion}变量 配置父pom <groupId>cn.imcompany</groupId> <artifactId>big-parent</artifactId> <version>${revision}</version> <packaging>pom</packaging> <modules> <module>big-web</module> </modules> <properties> <revision>1.0.0</revision> </properties> 子模块配置 <parent> <groupId>cn.imcompany</groupId> <artifactId>big-parent</artifactId> <version>${revision}</version> </parent> <artifactId>big-web</artifactId> 修改版本方式 直接修改revision变量的值 使用 mvn clean package -Drevision=1.1.0 进行配置 使用revision后Deploy操作不显示正确版本问题 需要配合 Flatten Maven Plugin 即可解决,父pom中需要增加以下配置: <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <updatePomFile>true</updatePomFile> </configuration> <executions> <execution> <id>flatten</id> <phase>process-resources</phase> <goals> <goal>flatten</goal> </goals> </execution> <execution> <id>flatten.clean</id> <phase>clean</phase> <goals> <goal>clean</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 配置指定项目不发布到远程仓库 在新版本的deploy插件已经支持配置,配置skip变量即可 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>3.0.0-M2</version> <configuration> <skip>true</skip> </configuration> </plugin> Reference Maven: POM files without a version in it? - SoftwareEntwicklung Beratung Schulung

2022-04-07 ·  (🌟Updated: 2022-04-08) · 1 min · 85 words · tomyli

Linux代码结构学习

Linux代码结构 准备学习Linux,看源码是少不了的,先对Linux源码有个大体认识(基于linux4.13) 代码主要文件解析 Makefile 这是整个源码的Makefile,里面定义了一系列的变量和规则,比如默认的gcc编译flag。 Documentation/ 项目文档,里面包含了很多关于配置内核、与ramdisk运行等有用的信息。这里面没有不同配置项的帮助信息,这些信息可以在相关子目录的 Kconfig 文件中查看。 arch/ 体系结构相关代码都在这里,还有一部分在include/arch-generic中。每个体系结构在这个目录下都有一个子目录。比如基于x86体系的代码都在 arch/x86 下。另外,这个目录下还包含低级别的内存管理,中断处理,早期初始化,汇编例程等信息。 crypto/ 内核使用的加密API代码。 drivers/ 所有设备相关的信息都在这个目录下。包括视频设备,网卡设备,低级别的SCSI设备。比如网络设备一般是在 drivers/net 目录下。 fs/ 通用的文件系统与其它类型的文件系统代码都在这里。现在的操作系统的根文件系统一般为ext4格式,它的代码在 fs/ext4 下 include/ 所有.c文件中包含的头文件都定义在这个目录下。 init/ 这个目录包含了内核启动的入口文件 main.c ,版本信息文件 version.c 和早期用户空间相关的代码,早期空间代码提供内核出现时的功能,它不需要在内核中进行运行。 ipc/ 进程间通信相关代码,包含共享内存,信号量等信息。 kernel/ 内核级别代码,上层的系统调用代码在这里,还有关于 printk() 代码,调度,信号量处理的代码。 lib/ 内核所有使用的库都在这里。常见的字符串运算,调试库,命令行解析代码等。 mm/ 高级别的内存管理代码。虚拟内存是通过这些库与低级别的体系结构代码(在 arch//mm )一同实现的。这里完成了早期引导内存管理,涉及文件的内存映射,页缓存的管理,内存分配和RAM中页面的交换。 net/ 高级别的网络代码。与低级别的网络进行发包与收包交互。*net/core* 中包含其它网络协议使用的核心代码。net子目录就是特定的网络协议实现。 scripts/ 这里面包含构建内核的脚本文件。 security/ 不同Linux的安全模型代码。 sound/ 声卡及相关代码在这里。 usr/ 该目录包含构建根文件系统映射的cpio格式的文档代码,该文档用于早期的用户空间。

2022-04-06 ·  (🌟Updated: 2022-04-06) · 1 min · 54 words · tomyli

记一次SpringWebflux框架下堆外OOM排查经历

症状 生产环境业务页面打不开,看错误日志是 OutOfDirectMemoryError (OOM)了,详情报错信息如下: 2022-03-21 06:00:00.541 [,] [tafprx-asyrecv_9] ERROR r.c.p.Operators - [error,314] - Operator called default onErrorDropped java.lang.OutOfMemoryError: Direct buffer memory at java.base/java.nio.Bits.reserveMemory(Bits.java:175) at java.base/java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:118) at java.base/java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:317) at io.netty.buffer.PoolArena$DirectArena.allocateDirect(PoolArena.java:632) at io.netty.buffer.PoolArena$DirectArena.newChunk(PoolArena.java:607) at io.netty.buffer.PoolArena.allocateNormal(PoolArena.java:202) at io.netty.buffer.PoolArena.tcacheAllocateSmall(PoolArena.java:172) at io.netty.buffer.PoolArena.allocate(PoolArena.java:134) at io.netty.buffer.PoolArena.allocate(PoolArena.java:126) at io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:395) at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:187) at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:178) at io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:115) at org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer(NettyDataBufferFactory.java:71) at org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer(NettyDataBufferFactory.java:39) at org.springframework.http.codec.json.AbstractJackson2Encoder.encodeValue(AbstractJackson2Encoder.java:236) at org.springframework.http.codec.json.AbstractJackson2Encoder.lambda$encode$0(AbstractJackson2Encoder.java:150) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1815) at reactor.core.publisher.MonoCompletionStage.lambda$subscribe$0(MonoCompletionStage.java:82) at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859) at java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:883) at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2251) at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:143) at reactor.core.publisher.MonoCompletionStage.subscribe(MonoCompletionStage.java:57) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1815) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:199) at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:199) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:284) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1815) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151) 根据报错的堆栈,找到 AbstractJackson2Encoder:236 行,调试发现框架使用的buffer在最后都进行了释放,看着没问题。 ...

2022-03-31 ·  (🌟Updated: 2022-04-13) · 3 min · 615 words · tomyli