Tag: ability
能力
学习能力
我对学习能力的定义是: 将输入(知识,行为,信息等)内化成认知记忆,并能转换输出的能力。
也许定义得并不准确,但每个人对事物的理解都不相同,上面只是我的理解。
并且,我需要更深入的理解:
学习一定要有输入,不可能无中生有,输入不一定来自外界,内省已有的东西也算输入 学习一定能够输出,输出的方式有很多,文字,演讲,行为等,如果无法清晰地输出,那说明学习不到位 学习会构建认知记忆,一定会在大脑留下什么,不管是神经元的连接,还是细胞的改变,并且长期有效 学习不能全部吸收,需要有过滤器,这个过滤器就是做人做事的原则。
输入 输入有很多种方式,比如被动灌输(音视频,被授课),主动输入(阅读,搜索)。
当然,主动输入的效果会好些,我比较喜欢阅读。
快速阅读 什么时候能用快速阅读? 我之前觉得快速阅读要区分对象,能够使用快速阅读的对象才能用(比如工具类书籍:励志成长类,社科普及类)。 《快速阅读术》里面也有提过选择快速阅读的书籍。 不过,读得越来越多、越来越快之后,我发现理解能力是会提升的,只是非常费脑。
不过,为了享受一部文学作品,就可以慢下来。
如何快速阅读 建立书籍索引:通过浏览目录,甚至全书的小标题,分析作者的协作思路 划重点:每个小标题下的内容用一句话总结,一句话不行就2句话 输出精简复制版笔记,这份笔记就是对书籍内容的高度概括 输出自己的感悟,根据概括联系自身情况,输出更多文章,变成自己的知识 如果有纸质书籍当然好,可以手写。否则,电子版书籍用平板或电脑,需要大一些的屏幕,才能快速浏览。
Tag: cloud
Tag: front
Web
Servlet3.0可以读取META-INF/resources下的资源
对于前后端一体应用,可以将前端打包后放在 META-INF/resources 下,servlet可以直接渲染。
验证 建一个简单的SpringBoot项目。
TODO
自动化打包插件 可以通过maven插件调用node打包,直接放进去。
Tag: grpc
Java
Grpc练习
练习下Grpc使用。
proto和Service定义 src/main/proto/AgentModel.proto
模型定义2个实体,参数和返回值。
syntax = "proto3"; option java_package = "com.jimo.grpc"; message AgentInfo { string name = 1; sint32 index = 2; } message ReportResponse { bool ok = 1; string msg = 2; } src/main/proto/AgentService.proto
在服务这边就定义一个report方法。
syntax = "proto3"; option java_package = "com.jimo.grpc"; import "AgentModel.proto"; service Agent { rpc report(AgentInfo) returns (ReportResponse) {} } 编译 加入maven插件,同时编译proto文件和grpc。
<extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.2</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact>com.
Tag: hugo
Hugo
Hugo递归遍历目录生成文件列表
建一个partials/walk-dir.html,里面递归调用
{{ $path := . }} <ul> {{range (readDir $path) }} <li> {{.Name}} {{if .IsDir}} {{ partial "walk-dir.html" (path.Join $path .Name) }} {{end}} </li> {{end}} </ul> 再建一个shortcodes/list-dir.html 来调用
{{ $path := .Get "path" }} {{ partial "walk-dir.html" $path }} 最后,使用
效果
Hugo
Hugo使用技巧
如何引用站内文章 下面的 \\去掉
{{< ref "blog/post.md" >}} => https://example.com/blog/post/ {{< ref "post.md#tldr" >}} => https://example.com/blog/post/#tldr:caffebad {{< relref "post.md" >}} => /blog/post/ {{< relref "blog/post.md#tldr" >}} => /blog/post/#tldr:caffebad {{< ref "#tldr" >}} => #tldr:badcaffe {{< relref "#tldr" >}} => #tldr:badcaffe 新窗口打开链接 根据文档:https://gohugo.io/getting-started/configuration-markup#blackfriday
以前默认的markdown解析引擎是 blackfriday,现在换成了 GoldMark。 但是没发现 GlodMark有配置 a标签 blank的属性,所以暂时用 blackfriday。
[markup] defaultMarkdownHandler = 'blackfriday' [markup.blackFriday] hrefTargetBlank = true 会在命令行收到弃用的警告:
markup.defaultMarkdownHandler=blackfriday is deprecated and will be removed in a future release. See https://gohugo.
Tag: java
Java
Grpc练习
练习下Grpc使用。
proto和Service定义 src/main/proto/AgentModel.proto
模型定义2个实体,参数和返回值。
syntax = "proto3"; option java_package = "com.jimo.grpc"; message AgentInfo { string name = 1; sint32 index = 2; } message ReportResponse { bool ok = 1; string msg = 2; } src/main/proto/AgentService.proto
在服务这边就定义一个report方法。
syntax = "proto3"; option java_package = "com.jimo.grpc"; import "AgentModel.proto"; service Agent { rpc report(AgentInfo) returns (ReportResponse) {} } 编译 加入maven插件,同时编译proto文件和grpc。
<extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.2</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact>com.
Java
Java instanceof List<T>
其实这是一个很简单的问题,在Java中,通常我们要判断一个对象是不是某种类型,会用 instanceof 关键字。
但遇到带有泛型的 List<T> 是不能直接使用,这时候怎么办呢?
我会写出下面的代码:
if(a instanceof A){ A a1 = (A)a; } if(a instanceof List && !((List<?>)a).isEmpty() && ((List<?>)a).get(0) instanceof A){ List<A> list = (List<A>)a; } 没问题,就是会有警告,而且这种方式在List没有元素时就不行.
另外一种方式侵入性较高,就是对List进行继承,确定一个泛型:
public class ListA extends ArrayList<A> { } ListA listA = new ListA(); listA.add(new A()); assert listA instanceof ListA; 目前还没想到更好的办法,欢迎补充。
Java
Java Agent如何调试
做agent开发必备调试技巧:如何在IDEA里debug agent代码。
我们知道,agent一般是增强代码功能,常用的方式就是提供一个agent的jar包,应用通过 -javaagent:xxx-agent.jar这样启动。
java -javaagent:D:\agent\aweson-agent.jar -jar app.jar 使用起来简单,但开发起来就会遇到一个问题:如何调试?
总不能靠输入输出吧,当然不需要,比较IDEA还是很强大的。
先写一个简单的agent 建一个子模块 method-agent,这很重要。
我们以一个例子来演示:agent拦截类的方法,前后加入一句开始结束输出。
通过maven插件生成 MANIFEST.MF 的定义:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Premain-Class>com.jimo.MethodAgent</Premain-Class> <!-- <Agent-Class>com.jimo.MethodAgent</Agent-Class>--> <Can-Redefine-Classes>true</Can-Redefine-Classes> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> 我们只拦截自己写的类, 这里用到了 javassist 来增强类。
<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.29.0-GA</version> </dependency> import javassist.*; import java.io.IOException; import java.lang.instrument.Instrumentation; public class MethodAgent { public static void premain(String agentArgs, Instrumentation inst) { System.
Tag: javaagent
Java
Java Agent如何调试
做agent开发必备调试技巧:如何在IDEA里debug agent代码。
我们知道,agent一般是增强代码功能,常用的方式就是提供一个agent的jar包,应用通过 -javaagent:xxx-agent.jar这样启动。
java -javaagent:D:\agent\aweson-agent.jar -jar app.jar 使用起来简单,但开发起来就会遇到一个问题:如何调试?
总不能靠输入输出吧,当然不需要,比较IDEA还是很强大的。
先写一个简单的agent 建一个子模块 method-agent,这很重要。
我们以一个例子来演示:agent拦截类的方法,前后加入一句开始结束输出。
通过maven插件生成 MANIFEST.MF 的定义:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Premain-Class>com.jimo.MethodAgent</Premain-Class> <!-- <Agent-Class>com.jimo.MethodAgent</Agent-Class>--> <Can-Redefine-Classes>true</Can-Redefine-Classes> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> 我们只拦截自己写的类, 这里用到了 javassist 来增强类。
<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.29.0-GA</version> </dependency> import javassist.*; import java.io.IOException; import java.lang.instrument.Instrumentation; public class MethodAgent { public static void premain(String agentArgs, Instrumentation inst) { System.
Tag: maven
Java
Maven打Fat Jar的一些问题
总是忘记maven-shade插件的配置,这里记录一下。
见文档.
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.jimo.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> Invalid signature file digest for Manifest main attributes 有时我们在打完jar包运行会报错:
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source) at sun.security.util.SignatureFileVerifier.process(Unknown Source) at java.util.jar.JarVerifier.processEntry(Unknown Source) at java.
Tag: motor
Tag: patent
谈人生
如何写专利
从专利的分类出发 专利分为发明、实用新型、外观设计三种类型:
1.发明是指对产品、方法或者其改进所提出的新的技术方案。
2.实用新型是指对产品的形状、构造或者其结合所提出的适于实用的新的技术方案。
3.外观设计是指对产品的形状、图案或者其结合以及色彩与形状、图案的结合所作出的富有美感并适于工业应用的新设计。
实用新型看起来是对实物的改进,我对汽车和火箭的改进意见挺多的,但显然公司不会允许我提。 外观设计也不用考虑了。 只剩下发明专利,对象只剩下产品和方法。
产品范围很广,软件也可以算产品吧,但方法才是我主要考虑的。
如果是产品,那就要创造新的产品,或者对旧产品的改进。
回到计算机行业
就是新的算法,或旧算法的改进。
改进的意思是至少有一个方面比原来更好。
算法还是方法 回到算法,评估算法一般用时间和空间复杂度,这样还是挺狭隘的。
那还是用方法吧,评估方法有些什么标准呢?在此之前,还是搞清楚什么是方法吧。
方法就是普世的算法,用来解决世间一切问题的步骤,既然是步骤,就会有1、2、3、4、5,有分支、循环等结构,这不就构成程序了?
所以,方法 == 程序。
方法在不同学科里有不同内容:
心理学的方法有问卷、访谈、智力测验、人格测验等 科学的方法有理论模型、数学模型 哲学的方法就是规律和“道” 方法看起来是理论上的,就是想法,思维,但有用的方法一定是可以落地的,可以实践的。
因此,用算法来描述方法是很严谨的方式。
那现在回顾一下大学课本里算法的定义:
有穷性:算法一定能在有限步后终止 确切性:每一步都有明确定义 输入项:0或多个输入 输出项:1或多个输出,没有输出就没意义 可行性:每个步骤都是可以执行的 常用算法 想不到新的方法,可以看看旧的方法,就从算法下手吧,看看巨人的肩膀上还站不站的下人。
排序:那十几种排序算法,比如基数、桶排序 压缩:zip 最短路径:迪杰斯特拉,A* 相似度:欧几里得距离,关联分析,协同过滤 编码:BCD,霍夫曼编码,hash 安全:RSA,对称加密, 随机算法 AI算法就不谈了,估计没几个人懂。
事实上,这些算法都是数学运算。
如何评估方法 一个优秀的专利一定在某个方面更加优秀,问题是哪些方面?
算法的判断标准很简单:时空。
在保证正确性的基础上,一个优秀的算法确实很牛逼,难怪工资那么高。
同理,放大普世的方法上,评判标准也是时间和空间。
我们一直说:更高、更快、更强!
高是空间,快是时间,强嘛,就是又高又快了。
追求空间小、时间快并不是绝对的,有时会反过来,比如空间戒指这东西,你肯定希望越大越好,而快乐的时间,当然越长越好啦。
谁让我们是3维生物,空间时间就让我们满足了。
除了空间时间,还有一些指标看起来不那么好分类,比如:安全性,精确度,甚至经常被忽视的:用户体验。
像自动化、方便性、等待时长,都可以放到用户体验里。
还有一点很重要: 专利法规定予以保护的是技术方案不是功能,因此需要给出实现某种功能的具体技术方案,不能仅仅阐述功能。
思路举例 分为4种思路:
创造一个新的方法,解决一个新的问题,你可以随意发挥,假如这个问题只有你遇到 创造一个新的方法,解决一个旧的问题,需要对比旧方法,取得哪些提升 改进一个旧的方法,解决一个旧的问题,需要对比旧方法,取得哪些提升 改进一个旧的方法,解决一个新的问题,这其实是一个迁移,也不可能完全不变的迁移,和1差不多 关于创造新的方法,很难是完全从0开始,所以我们讨论的多的,还是改进。
改进有哪些实操方法呢? 无非增删改。
增加:比如以前这个算法只有单机版,现在你改为分布式,就是个创新点 删除/修改:删除多余步骤,不过一般不可能只删不改,所以属于优化步骤 关于迁移能力,甚至可以跨学科解决问题。
Tag: protobuf
Java
Grpc练习
练习下Grpc使用。
proto和Service定义 src/main/proto/AgentModel.proto
模型定义2个实体,参数和返回值。
syntax = "proto3"; option java_package = "com.jimo.grpc"; message AgentInfo { string name = 1; sint32 index = 2; } message ReportResponse { bool ok = 1; string msg = 2; } src/main/proto/AgentService.proto
在服务这边就定义一个report方法。
syntax = "proto3"; option java_package = "com.jimo.grpc"; import "AgentModel.proto"; service Agent { rpc report(AgentInfo) returns (ReportResponse) {} } 编译 加入maven插件,同时编译proto文件和grpc。
<extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.6.2</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact>com.
Tag: raft
Tag: servlet
Web
Servlet3.0可以读取META-INF/resources下的资源
对于前后端一体应用,可以将前端打包后放在 META-INF/resources 下,servlet可以直接渲染。
验证 建一个简单的SpringBoot项目。
TODO
自动化打包插件 可以通过maven插件调用node打包,直接放进去。
Tag: shade
Java
Maven打Fat Jar的一些问题
总是忘记maven-shade插件的配置,这里记录一下。
见文档.
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.jimo.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> Invalid signature file digest for Manifest main attributes 有时我们在打完jar包运行会报错:
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source) at sun.security.util.SignatureFileVerifier.process(Unknown Source) at java.util.jar.JarVerifier.processEntry(Unknown Source) at java.
Tag: shardingsphere
Database
ShardingSphere proxy原理
代理分为前端和后端。
类 MetaDataContextsBuilder会根据配置文件构建数据的上下文,其中包括 前端和后端数据库类型。
调用流程 FrontendChannelInboundHandler
@Override public void channelRead(final ChannelHandlerContext context, final Object message) { if (!authenticated) { authenticated = authenticate(context, (ByteBuf) message); return; } ProxyStateContext.execute(context, message, databaseProtocolFrontendEngine, connectionSession); } 然后采用JDBC代理 JDBCOKProxyState,这里使用了一个异步线程去处理。
@Override public void execute(final ChannelHandlerContext context, final Object message, final DatabaseProtocolFrontendEngine databaseProtocolFrontendEngine, final ConnectionSession connectionSession) { CommandExecutorTask commandExecutorTask = new CommandExecutorTask(databaseProtocolFrontendEngine, connectionSession, context, message); ExecutorService executorService = determineSuitableExecutorService(context, databaseProtocolFrontendEngine, connectionSession); executorService.execute(commandExecutorTask); } CommandExecutorTask
private boolean executeCommand(final ChannelHandlerContext context, final PacketPayload payload) throws SQLException { CommandExecuteEngine commandExecuteEngine = databaseProtocolFrontendEngine.
Database
ShardingSphere开发者编译指南
需要对接ShardingSphere(后简称SS)做一些开发,所以要编译这个庞大的项目。
环境 文档, 注意一点就是开启git的长文件名,不然clone到一半发现失败了。
git config --global core.longpaths true 编译 文档
因为SS使用了Antlr,需要全局编译才能触发Antlr插件,否则这部分代码编译不到。使用 release的profile。
mvn install -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -Drat.skip=true -Djacoco.skip=true -DskipITs -DskipTests -Prelease 运行调试 SS的代码有200多个模块,分得非常细,我这边主要对接 proxy端,所以可以一眼发现 proxy模块。
对应的启动类位于 shardingsphere-proxy-bootstrap模块的 Bootstrap 类。
要调试的话,将 resources/conf/server.yaml 里面修改一些配置:
因为我只是本地调试其他功能,所以不需要集群模式,关于完整模式请看文档.
下面是配置SS的用户名和密码,这里配了2个用户,root和sharding。
mode: type: Memory rules: - !AUTHORITY users: - root@%:root - sharding@:sharding provider: type: ALL_PERMITTED 然后是数据源的配置,修改 conf/config-sharding.yaml:
因为这里不需要分片,所以只配了一个mysql实例,逻辑数据库名称是db,mysql里的数据库是 ds01.
databaseName: db dataSources: ds01: url: jdbc:mysql://localhost:3306/ds01 username: root password: 123456 因为需要用到mysql,这里用docker在本地起一个:
docker run --name mysql-ds01 -d -e MYSQL_DATABASE=ds01 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:5.
Tag: skill
技能-基础技能
盲打技能
在目前的计算机发展阶段,打字依然是计算机最主流的输入方式之一。离以后的脑机交互成熟还有不远距离。
打字更是编程最基础的技能。
打字的技能会形成肌肉记忆,即便很久不练也不会退步。
为什么要练习盲打? 即便是打字这么简单的事情,也是要给自己一个理由去做的。
有一天,我发现有的人在打字时,不停地低头看键盘,效率和正确性都很低,我觉得特别丑陋。 然后我发现自己也好不到哪去,我决定改变它。
所以,理由很普通:
打字快很酷,特别是配上青轴的机械键盘(要有底气在公司使用) 打字快有助于提高效率 怎么练习盲打? 推荐一个网站:https://www.keybr.com/
这个网站通过循序渐进地训练,从零开始,可以看到自己每个键位的错误率和速度,分析指标非常多。
除了偶尔会崩溃。
通过 https://www.keybr.com/high-scores 查看那些高手。
根据排行榜,你的平均速度能稳定在80WPM,就有机会上榜。
你可以分享自己的练习主页, 我的练习主页是 : https://www.keybr.com/profile/n5gaxhw
最终成效如何? 我练习了一个多月,从最开始的 30WPM提升到 43.4WPM。是,我确实很菜的样子,但我不慌,这才是基础技能而已。
当然这是平均速度,现在平均速度我能稳定在 50-60,只是之前太差拉低了平均值。
但即便是这样,依然超过了 74%的人。
我觉得这个速度已经足够应付目前编码速度,所以暂时停下来了。
但追求更快更强的心不会停止,欢迎来战。