小米AX1800实现科学上网
一直想在家中实现全局科学上网,这样在家里就不需要一直开着各种客户端了,一方面是每个设备科学上网的客户端都还不一样,存在重复配置,另一方面,客户端也会加快电池的消耗,本来打算投资软路由或者旁路由的,经过一番搜索发现小米的AX1800路由器是基于openwrt的,可以通过ShellClash项目在不影响原系统的情况下实现科学上网,这篇文章记录一下安装的经过,理论上所有的openwrt的路由器都可以安装,只要搜索自己路由器的型号,查找ssh登录的方法就行了。
一直想在家中实现全局科学上网,这样在家里就不需要一直开着各种客户端了,一方面是每个设备科学上网的客户端都还不一样,存在重复配置,另一方面,客户端也会加快电池的消耗,本来打算投资软路由或者旁路由的,经过一番搜索发现小米的AX1800路由器是基于openwrt的,可以通过ShellClash项目在不影响原系统的情况下实现科学上网,这篇文章记录一下安装的经过,理论上所有的openwrt的路由器都可以安装,只要搜索自己路由器的型号,查找ssh登录的方法就行了。
前端时间写的上海马拉松自动签到工具已经完成很久了,有不少跑友都反映上马抽中了,而我也在经历了8年没中之后,今年很“幸运”的抽中了上海马拉松了,开心之情溢于言表,于是便想写一些内容来记录一下这个过程。
起因是这样的,上马有个积分的功能,他可以影响正常的抽签(虽然是黑盒,但是有人反馈关系很大)的权重,而积分只能通过,签到,线下比赛,以及跑步获取,前两种好理解,第三种,跑步记录换取积分,需要上马官方合作伙伴数字心动APP来提供数据,然而,数字心动APP只能通过Garmin设备通过,并不支持Apple Watch直接上传(如果支持了,那么也没有这个项目了),于是我想是否能够曲线救国,将记录上传到Garmin,然后再通过Garmin同步到数字心动,这样就可以正常获取积分了。
这周最大的收获是学习了双拼输入法,而且带动了一个同事也开始学习双拼输入法了,还跟我说怎么不早告诉他😂。学习的过程也踩了不少坑,感觉有必要写出来,让后人少走弯路。 为何入坑?最初开始学习双拼是在twitter TL上看到一条双拼的推: 它让我想起了大学时候学习半途而废的经经历,于是想既然这么有价值,我也许应该重新捡起来,毕竟以前vim对我来说也是一座高山,现在也被我征服了。 可能会有小朋友要问了,打字效率对于一个程序员来说真的那么重要吗? 不重要。它只是一个工具,不使用完全没有什么影响,它能帮你做的仅仅是提高一些效率,但是对于大多数人来说可能还不到拼效率的地步,大部分人来说全拼输入法够了,VSCode也够了。你可以举很多例子来反驳,但是都不如亲自试一试,这和学习vim一个道理,而且有反驳的时间,键位也都记住了。 这里,我也想用道德经里的一段话来说明: 上士闻道,勤而行之;中士闻道,若存若亡;下士闻道,大笑之。 假如你是一个想尝试新鲜事物的人,恰巧你也是一个“懒人”,那么我觉得你可以尝试一下双拼输入法,虽然它不能帮你摆脱重码率的困扰,但是至少能比全拼少敲几次键盘,记忆曲线也没五笔那么陡峭,基本上可以做到:1小时记忆键位,1周熟练双拼节奏,1月恢复到全拼的打字速度。
Chrome的标签功能在管理多个标签页时非常好用,但是在标签量更大一些的时候,手动的管理这些标签页就不太方便了,这个时候可以考虑使用chrome扩展来完成这一自动化的操作,特别是对于工作的场景,基本上每天打开的网站都是特定的场景。 Auto-Group Tabs是一个Chrome浏览器插件,用于自动对用户打开的多个标签进行分组,以使它们更容易管理和组织。这个插件还支持配置的导入和导出,可以方便的在多个设备上同步。 安装通过chrome商店:Auto-Group Tabs - Extensions 打开此链接,点击安装即可,如果在商店搜索安装的时候,有多个类似的扩展,注意选择下面这个。 配置和使用
布卢姆分类学 (Bloom’s taxonomy) 是美国教育心理学家本杰明·布鲁姆于1956年在芝加哥大学所提出的分类法,此方法将认知层次分为六个,从低到高依次是:记忆(Remember)、理解(Understand)、应用(Apply)、分析(Analyze)、评估(Evaluate)、创造(Create)。 整个认知层次结构呈金字塔分布,记忆、理解、应用三个低阶思维水平的目标位于塔的底层,而分析、评估、创造三个高阶目标位于塔尖部分,因为它们都需要更高水平的思维技能。 第一层记忆(Remember)记住特定知识,包括一些具体事实、基础概念、术语等,不需要理解所学内容的内在含义,也就是通常说的死记硬背。这类一般是死知识,比如河南省的省会,世界有哪几个大洲构成等等 理解 (Understand)理解所学内容并可以清晰的描述它,而且可以使用自己的话准确复述材料的内容。 这里面包含了三种形势来表明自己对材料的理解:转换:也就是使用自己的话,或者使用和原文不同的方式来阐述它。解释:可以使用自己的理解对它进行说明或者概述,这里需要有一定的抽象能力。推断:预测发展的趋势和后果。 著名的费曼学习法就是通过输出倒逼输入的例子,如果你完全理解了一个内容,那么你就完全可以用非常浅显的语言解释给完全不懂的人听。换句话说,我们应该减少晦涩专业词语的使用,就算使用也要解释清楚其含义,如果我们无法用通俗语言来描述,大概率是自己没有真正理解它。 应用(Apply)举一反三,通过前面的记忆和理解把先前学到的知识迁移到新的情境中去解决一定的实际问题。 对于大部分人来说,可能是卡在这一步,上课时,老师讲得也都听懂了,也听的津津有味,但是老师布置的作业,下课一看傻眼了,根本做不出来。这也是很正常的,因为,对于大部分知识来说,它们并不是死的,而是互相关联的,考察的是综合能力,复杂的知识需要更多的相关的背景知识以及有逻辑思维的大脑。 而且这也要依赖前面的理解,如果理解不够透彻,那么一定做不好这一步。
2022年可以说是非常魔幻的一年了,这一年我刚好三十而立,女儿一岁了,这一年经历了很多,经历了四五月份的封城,经历了十二月份的疫情放开,经历了失望,无意义,还有一些成长,感觉认识自己更多一点了。
不知不觉,成为父亲已经一年有余,这一年,从一个懵懂的小男生变成了一个奶爸,这一年真的经历了太多。肺炎,呕吐,腹泻,还有疫情,买奶粉等等,辛苦是真的辛苦,不过这个小家,多了一些欢声笑语,多了一些不一样的颜色,感觉自己一下子变得柔软起来。 当然,带娃是一...
最近遇到一个spring static bean的坑,我们知道使用Java Config的方式定义一个Bean 非常简单,只需在Configuration的method上加上 @Bean 注解即可。 但是这里有个例外,假如你的Bean不是一个普通的Bean,而是一个BeanFactoryPostProcessor就需要使用static方法来定义这个Bean。 否则你会得到一个警告: @Bean method TestConfig.customEditorConfigurer is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface. This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class. Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details. 也就是说,如果你的bean是一个BFPP,必须定义为static,否则,使用@Autowired, @Resource and @PostConstruct 会有问题。 来看 @Bean注解源码里的注释: 1234567891011121314Special consideration must be taken for @Bean methods that return Spring BeanFactoryPostProcessor (BFPP) types. Because BFPP objects must be instantiated very early in the container lifecycle,they can interfere with processing of annotations such as @Autowired, @Value, and @PostConstruct within @Configuration classes. To avoid these lifecycle issues, mark BFPP-returning @Bean methods as static. For example: @Bean public static PropertySourcesPlaceholderConfigurer pspc() { // instantiate, configure and return pspc ... } By marking this method as static, it can be invoked without causing instantiation of its declaring @Configuration class, thus avoiding the above-mentioned lifecycle conflicts. Note however that static @Bean methods will not be enhanced for scoping and AOP semantics as mentioned above. This works out in BFPP cases, as they are not typically referenced by other @Bean methods. As a reminder, a WARN-level log message will be issued for any non-static @Bean methods having a return type assignable to BeanFactoryPostProcessor. 因为BFPP都需要在在Spring容器的早期进行实例化,因为他们会干扰正常的Bean实例化中处理 @Autowired @Value @PostConstruct ,这篇Blog尝试寻找一下Static Bean背后的原理。
Spring事件驱动Spring 事件驱动的代码都位于spring-context 模块的event包中,主要包括:事件(Event)发布者() Publisher) ,订阅者(Listener)组成。 事件ApplicationEventjava的所有事件对象一般都是java.util.EventObject的子类,Spring的整个继承体系如下: