上海马拉松自动签到工具
前端时间写的上海马拉松自动签到工具已经完成很久了,有不少跑友都反映上马抽中了,而我也在经历了8年没中之后,今年很“幸运”的抽中了上海马拉松了,开心之情溢于言表,于是便想写一些内容来记录一下这个过程。
前端时间写的上海马拉松自动签到工具已经完成很久了,有不少跑友都反映上马抽中了,而我也在经历了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的整个继承体系如下:
焦虑的产生焦虑产生来自于恐惧,恐惧是对当下刺激的应激反应,焦虑是对未来刺激的应激反应。当我们在碰到一些严重刺激我们感官的事情时,杏仁核会接收到恐怖和惊惧,那么海马体会把这些感受记录下来。紧接着交叉神经也会启动,血压飙升、心跳加速都可以让你牢牢记住这个经历,如果它是足以对人身造成危险的情况,那么你下次很大概率会自动躲避。 换句话说也就是说,焦虑是保护自己的。 现代社会中,我们不需要再面对大量的恐惧了,但是筑巢本能依然存在,海马体依然保存了相关的能力,今年年初上海的疫情,让我们对基本的衣食住行感到焦虑,因为,平时唾手可得的食物,在疫情期间获取是如此的困难,这些恐惧让我们的海马体记录下来,很长时间内,我们会对未来产生焦虑,这些焦虑是良性的,保证我们生存的本能,在漫长的进化过程中,没有焦虑的人很可能因为没有储存过冬的食物而灭绝,我们能延续到现在,很大程度上是因为祖先适度的焦虑。 焦虑不可能完全消除焦虑的本质是恐惧的提前,是对未来的不确定性的担忧,这就意味着它是不可能被消除的。它不是现代人特有的, 物质极大丰富的年代反而更加剧了这种焦虑,我们看似拥有很多东西,世纪上都是空中楼阁,我们过于依赖外界,这让一切变得不确定,不确定产生焦虑。 面对现实,承认焦虑的存在,我们才有可能和焦虑做朋友。坦诚是一个人最好的品质。特别是对自己坦诚,大部分时候,我们喜欢自欺欺人,坦诚可以让我们面对问题本身,一旦承认了问题的存在,我们才有解决问题的可能,我们才能变得更好,这也是实事求是的来源。 一个焦虑的消失会伴随着另一个焦虑的诞生,就像叔本华说的,人是在无聊和痛苦之间摇摆的动物。