关于日本评选 2022 年度汉字和中日关系

闲着和微信群里的朋友聊天,讲到二战的历史,聊起二战时期的日本和现在的日本,有一些感想。

起因其实是日本评出了2022年的年度汉字为“战”。根据 Yahoo 新闻报道,评选理由是乌克兰战争和北朝鲜发射导弹等等因素。

日本 2022 年度汉字为“战”
继续阅读“关于日本评选 2022 年度汉字和中日关系”

在日本生活是怎样的体验

这是个很大的话题,在日本过什么样的生活每个人差异挺大的。

如果不想融入当地,你基本可以完全过中式生活都没有问题。如果想融入当地,则学日语还是很有必要,日本人英语并不真很差,但口语不太行,很多人读书时候都学过英语,但开口比较困难。

房价方面,比国内低。生活方面成本比北京上海略高一丢丢,但因为品质总体不错,个人认为性价比挺高的。城乡差异不大,基础建设的水准还不错,虽然很多都是几十年了,但维护保养还不错。所以哪怕生活在比较偏远的小地方,生活质量和大城市也差异不大。

继续阅读“在日本生活是怎样的体验”

移民移居的项目选择指南

假设我们基于种种的理由,已经想清楚了希望去一个外国居住地生活,或者希望有一个外国居住地作为人生备用方案 Plan B。那么移民移居的项目如何选择就是本文要讨论的重点。

什么是外国身份

先普及一下几个概念:临时/短期逗留权、短期居留权、长期居留权、国籍。

临时/短期逗留权一般指以游客或者商务会议等身份短期访问,短则十来天,长一点的几个月,这种其实不是移民。而且这种签证签发的时候,一般不允许我们有移民倾向,换句话说你确实是短期去一趟,没打算赖着不走。

下面的三种都是移民相关的,我们可以统称为在外国的“身份”。

  1. 短期居留权一般是指获得某个国家签发的工作或者投资或者其他签证(姑且理解为带时效的居住证),可以合法居留,但签证只包含一定时间譬如一年或者两年、三年,到期后要申请续签的,除非后续申请到了长期居留权。
  2. 长期居留权通常为十年以上,甚至为永久居留权,简称永居(日本称永驻)或者绿卡(但不一定是绿颜色哦)。这种福利待遇一般就跟公民无异,唯一缺少的就是没有投票的政治权利。当然永居在少数情况下也存在被剥夺的可能,而国籍多数情况下没这种顾虑。永居并不是成为这个国家公民,所以从国籍上来说你还是原来的国籍。
  3. 国籍则是指成为一个国家的公民,享受作为该国公民的权利,也要承担相应的义务。有的国家允许多重国籍如加拿大、澳大利亚等多数英联邦国家,有的国家默认多重国籍如美国,有的国家不承认多重国籍如日本、新加坡、德国、中国,这些国家往往在你入籍的时候需要提供放弃原有国籍的证明并剪掉你的原有护照。在实践中,也有人虽然为某个不承认多重国籍的国家的公民,但事实上后取得并拥有其他国家国籍的情况,这方面是有一些护照使用方面的小技巧的。
继续阅读“移民移居的项目选择指南”

润前心理建设 – 知道你很忙

如果您觉得移民移居和自己完全没关系,而且虽然听到种种说法,但自己完全没有想法。如果您觉得待在自己所在的国家一切都很好,实在没什么必要考虑移民移居到其他地方…

那么,请关闭这篇文章,下文和您毫无关系。

对于觉得移民移居似乎有必要,但是自己下不了决心,不确定自己是不是要行动的朋友,来,咱们捋一捋思路!

继续阅读“润前心理建设 – 知道你很忙”

Angular 项目升级后,ng-bootstrap 的pagination 组件显示多余的 “(current)”

最近有个项目从 Angular 11 升级到了 Angular 13 (升级过程可以参考这篇文章),其他部分都显示良好,不过在很多数据列表页面出现了页码显示的问题,翻页器 pagination 的当前页码后面跟着个扎眼的 “(current)”,如下图:

通过查看代码,对比 bootstrap 和 ng-bootstrap 源代码,发现原来是版本对应兼容的问题。

项目升级后, bootstrap 版本升为了 4.6.2,而 ng-bootstrap 升为了 12.0.0。而根据 ng-bootstrap 官方文档,版本的对应关系应该是如下:

因此通过将 ng-bootstrap 降级到 11.0.1 问题得到解决。

这个问题的根本原因,在于 bootstrap 新版本中去除了一段代码,见这个 issue:

https://github.com/ng-bootstrap/ng-bootstrap/issues/3870

新版本 ngb 也跟着去掉了包含 (current) 的这段代码,但若依赖项是老版本 bootstrap,里面还有这段代码,那就显示出来了。

用 JHipster 生成的应用的升级小技巧

JHipster的基本介绍就不说了,官方网址是: https://www.jhipster.tech

关于用它生产的应用程序如何进行升级,看这里:https://www.jhipster.tech/upgrading-an-application/

由于它是一个代码生成器,因此每次升级会覆盖原有代码,如果对生产的代码修改得多,那么升级要解决的冲突就多。

因此,第一个要点,就是尽量把自己新增加的业务逻辑写在另外的文件中,尽量少修改生成的那部分代码。所采用的技巧,是 side by side 的方式,具体可以参考:https://www.jhipster.tech/tips/035_tip_combine_generation_and_custom_code.html#pattern-3—side-by-side

第二个要点,具体升级的时候,如果你经常修改 entity 定义(譬如因为字段删改、重命名等导致 .jhipster文件夹下的 json 文件修改)等文件,那么建议升级之前先删除 jhipster_upgrade 分支。换句话说,每次升级都是以当前版本的 entity 定义为基础,如此可以避免很多不必要的 entity 文件相关的冲突。具体解释理由:如果以比较早以前就生成了的 jhipster_upgrade 分支为基础来升级,而这个分支里面留存的 entity 定义又是很早的版本,那么就会生成不一样的 entity 文件,导致需要进行冲突解决。

将 Angular 10 项目升级到 Angular 13

近两年前,将公司部分项目从 Angular 6 升级到 Angular 10,现在因为 Angular 10 已经不再维护,因此继续升级。

除了参考上次升级的原则之外,还有如下要点:

  1. 较大项目往往是用了多种第三方包,具有复杂依赖关系,很多情况下运行 ng update 命令后会在最后 npm install 环节安装不成功。此时可以删掉 package-lock.json 文件,排除本地安装的老版本的库的影响,然后再试。若仍报错,则看看是什么库的依赖冲突,npm install 该库更新的版本。基本上只要细心分析逐个解决,最终都可以成功的。
  2. 善用 npmjs.com 查看各个包的版本信息,本地要查看某个包被哪些包依赖,可以用 npm ls packagename 来看。有时候依赖冲突太多的情况,可以先用 –force 参数强行安装某个库,再解决余下的。
  3. 若项目中引用的第三方库已经不再维护,又找不到可以不改代码直接替换的库,这时候就需要考虑自己 fork 该项目,进行改写,以支持更新版本的 Angular。
  4. 逐个版本升级,按照官方文档(选择高级里面的提示,更详细)逐个确认是否有需要修改的代码。
  5. 尽量每个升级都把项目成功跑起来预览。若项目启动遇到问题,则根据报错进行修改。部分的可能性是 Angular 组件用法修改造成的。也有可能是项目某些组件引入不成功造成的,后者的错误信息往往看起来很可怕,一大片红色,但往往症结所在其实只是某一个简单的点。
  6. 能够成功编译,能够成功运行,不代表升级就完全成功,最后一个环节检查能否成功打包:ng build –configuration production 若无报错,才是真正成功。因为这个环节会有更严格的代码规范检查,可以用 ng lint 来辅助发现需要修复的问题。

真心看着

爱过恨过,也错过
红尘中翻滚
将自己冷眼看着

人世间千般好
终究岁月蹉跎
难免落寞

且要留一些痕
也要暖几个人
終要将轮回了了
岂可将真心付错

在 macOS 上运行 bitcoin client 项目

项目位于 https://github.com/bitcoin/bitcoin 。本文针对 c++ 经验较少的读者。

第一步要点是搭建 c++ 开发环境, macOS 默认的安装是不全的,基本上,常见需要添加的是 automake 和 boost,安装方式: brew install automake boost libevent

然后运行如下:

  1. 运行 ./autogen,这会生成下一步运行 configure 所必需的脚本和配置文件,运行完毕后文件夹下会多出一些文件,如 configure,build-aux 等
  2. 运行 ./configure,这一步会需要用到 c++ 的 boost , libevent 库等,这也是为什么一开始需要安装它们的原因
  3. 运行 make
  4. 运行 make install