Migrate Microsoft SQL Server to MySQL Database

最近完成了一个小项目的数据库迁移,从微软SQL Server 2016迁移到MySQL 8。过程没什么复杂,只是需要注意一下数据类型和SQL语法的转换。

1 环境

原数据库是SQL Server 2016。迁移的目标环境,操作系统为Debian 11,安装了MySQL 8。

2 还原SQL Server数据库备份

拿到手的是SQL Server数据库备份,需要还原出来再迁移。幸好微软推出了SQL Server的Linux版,而且官方提供了可用于开发测试的Docker镜像,几个步骤就部署并还原好SQL Server数据库。

参考资料:

1)在Debian上安装Docker的官方教程:

2)运行SQL Server 2019 Docker镜像的官方教程:

3)SQL Server 2019的微软官方Docker镜像:

3 MySQL的准备

由于SQL Server的数据库表名不区分大小写,MySQL为了兼容相关SQL语句,也需要设置表名不区分大小写。即设置MySQL的参数lower_case_table_names=1,MySQL在存储和查询时,都把表名转为小写后再执行处理。

这里最麻烦的是,如果MySQL原来设置了lower_case_table_names=0(一般Linux上安装MySQL的默认值),需要把data文件夹清空,更新设置后重新初始化MySQL的数据。如果直接更改该值,MySQL重启后会报错。

关键的操作步骤:

1)修改MySQL的配置文件(Debian的默认路径为:/etc/mysql/mysql.conf.d/mysql.cnf),在[mysqld]节点下,加入一行lower_case_table_names=1

2)重新初始化MySQL(已有数据库的话,先做好备份,初始化后再还原),先清空数据文件夹(Debian的默认路径:/var/lib/mysql),然后执行以下命令:

mysqld --user=root --initialize --lower-case-table-names=1

初始化成功后,root用户的密码会记录在/var/log/mysql/error.log

4 迁移数据库定义

即导出原数据库表的create语句。一般推荐使用MySQL Workbench的Migration功能,官方文档如下:

但是我所安装的MySQL Workbench不能连接到Docker部署的SQL Server,所以使用了已安装的HeidiSQL,导出原数据库表的create table语句,然后手工修正为MySQL的语法。一些修改操作如下:

  • 修正字符编码,特别是设置了COLLATE的,需求改为COLLATE utf8mb4_0900_ai_ci
  • 修正默认值设置,例如DEFAULT '(0)'改为DEFAULT '0'DEFAULT getDate()改为DEFAULT CURRENT_TIMESTAMP
  • 自增型字段会被忽略,需要加上AUTO_INCREMENT
  • 字段类型转换,例如NVARCHAR改为VARCHARBIT改为TININY(1)MONEY改为DECIMAL(19,4)
  • 需要补上索引设置。

5 迁移数据库的数据

即导出所有数据的insert语句,然后在目标数据库利用source命令进行导入。一般也是推荐使用MySQL Workbench操作,不用担心语法和数据类型的问题。

我使用了DBeaver导出所有表的insert语句,然后手工修正为MySQL语法。需要注意:

  • 一般一条insert语句包含10000行数据,已提高导入时的效率。
  • 所有表名以数据库名.dbo开头的,都改为以数据库名开头。
  • 列名以中括号“[]”括住的,要改为“`”。

6 修改程序的SQL语句

主要是把SQL Server的语法,改为MySQL的语法。总结如下:

  • TOP改为LIMIT
  • getDate()改为CURRENT_TIMESTAMP
  • 去掉表名前的dbo.
  • WITH(NOLOCK)的处理。SQL Server加了WITH(NOLOCK)的语句,如果MySQL的InnoDB设置innodb_autoinc_lock_mode=0,需要特殊处理该语句,否则直接去掉WITH(NOLOCK)

关于InnoDB的设置说明如下:

Solve Spring Annotation not Working While Service Method is Called Internally

当Service方法被内部调用时,Spring注解会失效。就是Spring的Service类,如果public方法加上注解,类内部的其它方法使用this调用该方法,会导致注解失效。

例如Spring的Service实现类如下:

@Service("userService")
class UserServiceImpl implements UserService{
    
    @Override
    @Cacheable(CacheNames="USER_CACHE", key="#userId")
    public User getUser(String userId){
        // do something
    }

    @Override
    public String getUserName(String userId) {
        User u = this.getUser(userId); // getUser方法的@Cacheable注解失效了
        return u == null ? "" : u.getName();
    }
}

原因是this引用的对象没有被Spring代理,调用该对象的public方法时,Spring不能处理相关注解。

解决方法很简单,就是使用Spring代理过的对象,代替this。然后只需解决如果获取该Service类被Spring代理过的对象。

1 循环依赖

就是自己注入自己。在Service类定义一个自身对象的属性,让Spring装配时把自己注入到自己。虽然Spring 5(具体版本待查证)声称解决了循环依赖的问题,但是Spring Boot 2.6.0开始默认设置不允许循环依赖。循环依赖是一个古老的问题,一样认为要避免。所以此方法不推荐

1)先设置

# Spring Boot 2.6.0之后,允许循环依赖
spring.main.allow-circular-references = true

2)上面的例子改为

@Service("userService")
class UserServiceImpl implements UserService{
    
    @Autowired
    private UserService self; // 自己注入自己
    
    @Override
    @Cacheable(CacheNames="USER_CACHE", key="#userId")
    public User getUser(String userId){
        // do something
    }

    @Override
    public String getUserName(String userId) {
        User u = self.getUser(userId); // 用self代替this,注解生效
        return u == null ? "" : u.getName();
    }
}

2 获取装配后的自己

避免Bean的循环依赖,主要思路是,在Bean装配完成后,再获取被Spring代理的自己。至于怎样获取,实现方法是多种多样的。

方法1,从Bean容器中获取自己。即:

UserService self = applicationContext.getBean("userService");

至于怎么获取Bean容器applicationContext,方法也是多样的。

方法2,开启AspectJ自动代理来获取自己。

详细参考:一个Spring AOP的坑!很多人都犯过!

要注意,AspectJ自动代理不只是解决本文档的问题,需考虑是否会带来未知的问题。

开启AspectJ自动代理的方法有多种,这里列出三种:

1)在启动类添加注解:

@EnableAspectJAutoProxy(proxyTargetClass=true, exposeProxy=true)

2)Spring增加配置:

<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true" />

3)Spring Boot的配置文件增加配置:

# 开启AspectJ自动代理
spring.aop.auto=true
# 开启CGLIB代理
spring.aop.proxy-target-class=true

然后就可以在当前Service类的方法中,通过类似的代码调用自身的方法,且能保证该方法的注解正常执行:

User u = ((UserService) AopContext.currentProxy()).getUser(userId);

方法3,延迟执行自己注入自己。

很简单,就是使用@Lazy注解,达到Bean初始化不执行自己注入自己,避免循环依赖的错误。我记得解决Spring 2.x循环依赖的问题时,也是采用延迟注入的配置。此方法写的代码最少,目前倾向采用这种方法。于是,上面的代码改为:

@Service("userService")
class UserServiceImpl implements UserService{
    
    @Lazy
    @Autowired
    private UserService self; // 延迟自己注入自己
    
    @Override
    @Cacheable(CacheNames="USER_CACHE", key="#userId")
    public User getUser(String userId){
        // do something
    }

    @Override
    public String getUserName(String userId) {
        User u = self.getUser(userId); // 用self代替this,注解生效
        return u == null ? "" : u.getName();
    }
}

Getting Started with Green Coffee Roasting

注意:本文涉及电工改造,需要拆解爆米花机和接电线。如果对电工操作不熟悉,或有任何疑问,请勿胡乱操作。

一 背景

为了节省喝咖啡的成本,入坑了手冲咖啡(毕竟新鲜咖啡豆比店里一壶咖啡便宜)。同样也是贪便宜,入坑了烘培咖啡豆,毕竟咖啡生豆的价格更便宜。后来发现钱能省,但成本(时间、器材、技术)不能省。

但是玩过了,收获还是满满的。就像为什么要看程序源码一样。

二 烘豆的总结

优点:

  1. 咖啡生豆的存储期限比烘好的咖啡豆要长。生豆保存得好,一年是没问题的。烘好的咖啡豆,几个星期到一个月就能感受到香味、风味的流失。

  2. 咖啡生豆更便宜。入手了云南的生豆为为烘豆练习(仅推荐作为练习不建议作为“口粮”),34rmb/kg,平摊到每杯手冲咖啡,跟滤纸成本一个档次。进口的咖啡生豆,也只是烘好的咖啡豆的1/4,或者更低。

  3. 能更多地感受一杯咖啡的整个过程。非常适合对咖啡充满喜爱和热情的人。

缺点:

  1. 麻烦。包括,需要学习和掌握技巧、需要花时间去烘豆、需要购买设备且要考虑存放的空间……

  2. 出品可能不够稳定。咖啡店都是商用机器,玩曲线(烘豆过程的温度与咖啡豆变化过程记录),出品比较稳定。

  3. 不是每个喝咖啡的人都喜欢折腾。

三 烘豆的方式

主要是热源与器具。

热源一般是明火和电热两种。明火主要选择瓦斯炉。电热一般是配合器具的加热方式,反正有电就能烘。城里人嘛,选择电热相对安全和方便。

器具有太多的选择。比如:手网(比较费手)、陶锅(新手劝退)、手摇烘豆机(一般配合明火)、热风式爆米花机(需要改装)、空气炸锅(看不见咖啡豆的变化)、带旋转烤笼和内置风扇的烤箱(需要解决银皮和排烟)、小奶锅(需要技巧)等等。还有专门的机器,一步到位解决所有问题,只是价格相对比较贵(入门级的烘豆机,1000rmb左右吧)。

油管上很多是手摇烘豆+明火,而且主要是宝岛的up主。B站则有较多改装爆米花机的up主。近期,九阳的旋转小烤箱成为改造热门。

最后,我选择的是热风式爆米花机(也是下文要介绍的),并进行简单改装。主要是B站有改装教程,改装过程也简单,成本相对较低。虽然一锅只能烘50g生豆,能满足自身需求。

四 烘豆过程的问题

  1. 加热温度要可调。

  2. 烘豆机的风力要可调。

  3. 测量烘豆机能承载的生豆量。

  4. 测量烘豆过程的温度。

  5. 烘豆过程要可以观察,以便根据豆子的颜色进行烘培参数(温度、时间等)的调整。

  6. 收集银皮,避免银皮乱飞。银皮是指残留在咖啡生豆外表的一层薄薄的皮。烘豆过程中,热风会把银皮吹出。

  7. 烘豆结束要立刻给咖啡豆降温。

五 参考视频

  1. 爆米花机本体改造,参考这个:
  1. 玻璃管和银皮收集方案,参考这个视频

六 设备清单

  1. 热风式爆米花机,功率1100W。关键词参考:B301、winghang、永恒。参考价:50rmb。 用于烘豆。

  2. 可控硅电子调压器,220V,3000W,带电源插座。参考价:25rmb。 插上爆米花机电源,即可实现调温,不用改装。

  3. 可调直流稳压电源,3-24V,2A,送母头。参考价:15rmb。 需要改装,连接到风扇电机,实现风力调节。

  4. 电子数显温度计,[902推拉开关]主机 + 1米线。参考价:15rmb。 这个建议选择探针式,并且耐高温300度。爆米花机的热风,能达250摄氏度。

  5. 304不锈钢排烟管变径接头,8变7。就是直径8cm转直径7cm,需要两个。参考价:8rmb/个。 用于套在玻璃管两头,一头插在爆米花机,另一头接上茶漏,用于收集银皮。

  6. 高硼硅玻璃管,80mm100mm5mm。即外径80mm,长度100mm,管壁厚度5mm。参考价:15rmb。 用于观察生豆的烘焙变化。

  7. 卤料过滤网,304不锈钢,直径8cm。参考价:12rmb。 顶部排风,并实现银皮收集。

  8. 304不锈钢卡箍,直径60~89cm,两个。参考价:1.5rmb/个。 连接爆米花机、玻璃管和卤料过滤网。需要使用铁皮剪刀修改。

  9. 其它工具:电烙铁、焊锡、十字螺丝刀、Y型螺丝刀、铁皮剪刀等。

七 烘焙技巧

这个方案受限于爆米花机,最多能吹动60g生豆。一般称60g生豆,挑出瑕疵豆,烘完后,大概50g熟豆。

最大风速时,温度最高170°C左右。想要温度升高,需要在温控最高的基础上,降低风速,能上去250°C。

烘豆时,最好先参考别人关于相同咖啡豆的烘焙曲线。一般下豆后,从温度100°C左右,逐渐上升到200°C左右,然后一爆、一爆密集、二爆等过程。一般手冲的话,一爆到一爆完结之间是浅烘到中烘,确定选择哪个烘焙程度来决定下豆时间。整个过程控制在10分钟左右。烘焙过程,我还是新手,B站有很多大佬的视频可以参考。有疑问的话,大佬们也会回复。反正就是要多试、多交流。

烘豆结束,我直接关闭加热,直接最大风速给豆子降温。目前冬天的效果还可以,但夏天的话就不知道怎样。

另外,试过失败的案例:

1)第一次没有控制好温度,最高上去250°C,还弄得冒烟才下豆,总体时间15分钟,然后豆子都是乌黑油亮,就是烤糊了。

2)试过参考“三豆客 Q5”的 3 分钟快速烘焙,但是爆米花机的温度没那么高,所以整个过程 200°C 左右。然后为了一爆而拖到在 10 分钟下豆。虽然达到了中烘的外表,但是豆子出现点状出油,后面还出现油臭味,也算是失败。

目前烘了 4 、5 次,虽然达到能喝的程度,但是离好喝还有一段距离。

八 后续升级

B站的大佬会改造得很疯狂,但是我觉得最重要还是关注烘焙过程。如果要升级,实现更大的烘焙量,可以考虑换个爆米花机。例如:北欧欧慕NBM001,采用底部直吹的方式,发热功率是1400W,据说可以吹起100g生豆。但是相关的两个调压器和风扇调压改造都得重新研究。

Fresh Ground Coffee for Traveling

去年喝上了现磨的手冲咖啡,就想,是否可以带着去旅游,想喝就喝呢?但是带上全套装备,也是痛苦。于是精简了一下装备。在可以获取热水的情况下,目前有以下方案:

1)精简手冲版

装备:咖啡豆、手摇磨豆机、咖啡豆勺子、手冲壶、弹簧滤杯、滤纸、保温杯。

咖啡豆、手摇磨豆机、滤纸,都是不能精简了。

为了精简电子秤,用了咖啡豆勺子来判断咖啡豆重量,也可以提前把豆子称好分包。保温杯是已知容量的,也可以使用带刻度杯子,电子秤就更加不用带了。但是后来入手了个迷你电子秤,非常好用。

滤杯使用了弹簧版,超级省空间,但是牺牲了品质(弹簧滤杯没有保温效果)。网上也有硅胶版V60 、露营版(金属材质)V60,都可以考虑。

没有温度计,水温只能凭感觉。水烧开后,可以用杯子轮流倒一下来降下温。其实,带上温度计也不重、不占空间。

手冲壶确实很难精简。网上有短嘴版(搜关键字:仙德曼),但是塑料材质,不敢买。也有硅胶便携版(关键词:OE Pico Pitcher),但是有点贵。其实手冲壶,主要是控制水流,形成稳定水柱。实在不行,可以用随行杯来代替。甚至用一次性纸杯,在杯口折个角来导水。

2)法压壶版

装备:咖啡豆、手摇磨豆机、咖啡豆勺子、旅行法压壶、保温杯。

法压壶能省去手冲壶、滤杯、滤纸,但是一般法压壶都比较大,所以要选旅行版。

3)双杯手冲版

装备:咖啡豆、手摇磨豆机、咖啡豆勺子、两个杯子、弹簧滤杯、滤纸。

由于采用两个杯子的手冲法,可以不用带手冲壶(那细长的壶嘴太占地方了)。两个杯子的话,可以考虑能叠一起的(比如把迷你保温杯放在普通水壶里),更省空间。

具体冲煮方法:

4)现磨挂耳包

装备:咖啡豆、手摇磨豆机、咖啡豆勺子、手冲壶、杯子、挂耳包滤袋。

就是挂耳包滤袋代替了滤杯和滤纸。其实这个方案,手冲壶也可以省了。当然,成品的风味肯定不如手冲。

5)其它器具版

装备:咖啡豆、手摇磨豆机、咖啡豆勺子、其它器具。

这个方案需要更多的预算,比如爱乐压、Wacaco Cuppamoka 、Cafflano Go Brew 等。

Start My Brewing Coffee Manually Journey

国内的新冠肺炎(COVID-19)疫情得到控制后,经常光顾的咖啡店不提供单品咖啡(手冲或虹吸)了。老板让我自己冲煮,并建议使用爱乐压。就这样,硬是开启了手冲咖啡之旅。参考了网上的经验分享,整理了这个“贴地”(廉价)手冲入门套装。

参考文章:

装备清单:

1)手摇磨豆机:泰摩 栗子C。

当前价格:150rmb~250rmb。优点是便宜、钢芯、出粉还算OK。缺点是相对较重、摇杆与盖子一体、接粉杯与机身不好拧上。在价格面前,这些缺点都可以接受了。另外国产有几品牌的手磨都是比较适合入门:匿名、汉匠等。

2)滤杯:树脂V60 01。

某宝或拼夕夕入手一个树脂材质V60 01,即一到两人份量版。价格15rmb~20rmb。正如人家说,反正是照抄别人的模具,入门就图个便宜。优点是预热和保温的效果都比较好、大师级比赛也会用这个。缺点是相对比较占地方。旅行的话,可以考虑弹簧版,日本那边比较流行。但是弹簧的没什么保温了,出品确实会差点。

3)滤纸:随便买的。

要对应滤杯版本,即V60 01。40片,10rmb。要看看评价,尽量选没有异味的。

4)分享壶:用杯子代替。

一般只有自己喝的话,可以不考虑这个。家里有个容量220ml左右的迷你保护壶(不锈钢材质),刚好够我一次的份量。也可以冲好咖啡,拿到公司再喝。这个保温壶售价50rmb左右,我的是礼品,算是免费了。另外,后来有时会跟同事分享,也要做冷泡咖啡,就入手了个带盖子、有刻度的玻璃水杯,容量350ml,10rmb~20rmb。

5)细口壶、手冲壶:找便宜的买。

网上很多,容量250ml,304不锈钢材质,15rmb~25rmb。最好选带盖子的,更好控制水流。有大师建议买那种直接烧水的手冲壶。因为烧好的热水再倒进手冲壶,会降低水温和浪费时间。这里追求便宜的,就不考虑了。

6)电子秤:普通厨房电子秤。

做烘培时,入手了个称材料用的电子秤,精确到g,25rmb。入门级的,也不追求什么。除了用来称咖啡豆,也可以用来控制注入的水量。当然,预算充足的话,建议买专用的咖啡秤,精确到0.1g,且自带计时功能。

7)温度计:探针型温度计。

买了明高et598,25rmb,凑合用的。优点:便宜。缺点:插进细口壶时不能固定,要手拿着。一般手冲的水温是90°C左右。

8)水:过滤后的自来水。

家里有碧然德滤水壶,可以过滤自来水。热水是用普通家用烧水壶烧开的。反正没有用桶装水之类。一般水不要太硬就行。另外,滤水壶,即使在平常生活,也推荐。过滤后的水,水垢明显减少。

9)咖啡豆:网上或咖啡店购买。

最最最重要的,当然是咖啡豆!刚好公司附近有家咖啡店自己烘培豆子。新鲜烘培出来的豆子香气非常强烈,是手冲的动力来源。某宝有店铺也出售新鲜烘培的咖啡豆,说是下单后才炒豆的,也可以。

总结:

最后,说下成本。以前上馆子喝一壶手冲咖啡(240~300ml),一般是30rmb。自己手冲的话,成本主要在咖啡豆。目前一次13g 豆,冲出208ml左右的咖啡,一般豆子成本是3rmb~7rmb,巨便宜!上面那些一次性投入的装备(除了滤纸,不过滤纸也不贵),在多次手冲后,其实都不算什么了。

Play the Third-Order Rubik's Cube

孩子在国庆长假报了魔方培训班(练字班送的课程)。为了辅导孩子,到B站自学了魔方的入门教程。这个教程不是最快的,也没有说明原理,但是比较容易操作和记忆。整理下来,方便以后再用吧。

教程视频:

魔方示意图:

左面 左边 中间 右边 右面
3LT 3MT 3RT 上面(黄色面)
3LL 3L 3M 3R 3RR 正面,第3层
2LL 2L 2M 2R 2RR 正面,第2层
1LL 1L 1M 1R 1RR 正面,第1层
1LB 1MB 1RB 底面(白色面)

基本定位:

第2层中间黄色,朝上。同时,第2层中间白色,朝底。

基本操作:

  1. 推:右手把正面3个层的右边往上面推,或者左手把正面3个层的左边往上面推。
  2. 回:右手把正面3个层的右边往底面推,或者左手把正面3个层的左边往底面推。
  3. 拨:右手把正面第3层往左面拨,或者左手把正面第3层往右面拨。
  4. 扭:右手把正面整个面往左面扭,或者左手把正面整个面往右面扭。

操作步骤:

  1. 基础操作: 1.1. 黄色面造白色兰花。把黄色面3M、2L、2R、1M,都弄成白色,且不用考虑是否对齐。 1.2. 转成白色面十字架。黄色面朝上,随便找一面为正面,拨动第3层,使3M与2M同色,左手或右手“扭”两次。

  2. 还原第1层(包括底层,白色面) 2.1. 此时所有正面的2M与1M同色。 2.2. 若3RR白色,拨动第3层成3R与2M同色,然后右手“推拨回”。3L的同理。 2.3. 若3RT白色,拨动第3层成3R与2M同色,然后右手“推拨拨回”,再重复2.3。3L的同理。

  3. 还原第2层 3.1. 此时所有正面的2M与第1层同色。 3.2. 拨动第3层,找3M、2M、第1层同色(呈倒T)且3M的上面不是黄色。若3M要到2R去,右手“拨推拨回”。若3M要到2L去,左手“拨推拨回”。再按2.2操作。

  4. 还原上面(只是黄色面) 4.1. 此时所有正面的第2层与第1层同色。以下操作需注意方向,但不用考虑正面第3层的颜色。 4.2. 上面(黄色面)出现以下黄色组合时,操作:左扭,右推拨回,左拨,右扭。直到出现4.3的图案,再按4.3操作。

  • 反L:3M,2L,2M
  • 一横:2L,2M,2R 4.3. 上面(黄色面)出现以下黄色组合时,注意方向但不用考虑正面第3层的颜色,右手“推拨回拨推拨拨回”。不断重复此步骤,直到上面全为黄色。
  • 十字:3M,2L,2M,2R,1M
  • 金鱼:3M,2L,2M,2R,1L,1M
  • 坦克:3M,3R,2L,2M,2R,1M,1R
  • 蝴蝶:3M,3R,2L,2M,2R,1L,1M
  1. 还原第3层 5.1. 拨动第3层,找到一个正面只有3M不同色的,放在左面,执行操作:右推拨回,左拨,右回,左扭,右推推,左拨,右回,左拨,右推拨回,右扭。 5.2. 此时有一面完整的,作为背面。左手“推拨回拨推拨拨回”,再执行4.3,完成。

Cold brew Tea

以前一直不知道,原来茶是可以冷泡的。做法简单,非常适合夏天饮用。网上整理的资料如下:

茶叶与水的比例:

茶叶:水 = 1g:100ml

茶叶品种与冲泡时间:

  • 白茶/绿茶,4 ~ 6 小时
  • 乌龙茶,8 ~ 10 小时
  • 红茶,20 ~ 24 小时
  • 发酵程度高的茶,20 ~ 24 小时

冲泡方法:

选不要比较浓的茶,用凉白开、矿泉水、直饮水等,按比例放好后放到冰箱冷藏。到达泡茶时间后,过滤茶叶,再放到冰箱,可以冷藏一到三天。

另外,有些茶叶的外包装会详细说明该茶叶的冷泡方法,可以参考。

最近一直在做冷泡茉莉绿茶,加上蜂蜜,就是茉莉蜜茶了。虽然相比某品牌的茉莉茶饮料,会有明显的茶涩味,但是无添加,更健康。

Running Mobile Phone without Battery

关于如何把手机改装成无电池运行,已经研究好久了。当时的想法是,无电池运行的手机,可以长期使用外部供电而不怕内部电池损坏,从而实现很多的玩法。例如迷你服务器、录像监控等。但是实现后,发现还是那个经验教训:做得到不一定能做好,专业的事情还是交给专业的设备。Anyway,还是记录一下实现的过程。

首先,以下操作具有一定的危险性!锂电池包装破损的话,一接触到空气就会着火。

总的来说,实现方法有两个,但原理都是一样。具体可以参考这两个文章:

原理

都是把手机电池(不管是可拆卸的或不可拆卸的),分解为电池保护板和锂电池两部分,然后用外部电源代替锂电池。注意接线的正负极不要接反。

方案一

用超级电容代替锂电池,手机充电口再接5V 2A以上的充电器。

所需电容: 法拉电容组合型5.5V 1.0F(可给手机亮屏续航4秒)

优点:电容可以在手机断电时,保持一定的亮屏时间。

缺点:每次开机前,手机要接上充电器,先给电容充电(起码30秒)。另外,手机充电口接上充电器,就不能接外部设备了(但是有的手机可以接扩展接头)。

方案二

用5V 2A以上的充电器代替锂电池。

优点:开机快,接电就能开机。而且手机充电口空出来,可以接其它设备。

缺点:充电器一定要接稳,线一松就会断电,手机关机。

最后,对于目前的手机,最好还是使用5V 3A以上的充电器充电,否则会导致不能开机,或者死机。

Play with ESP8266 Development Board

这个周末,把N年前买的,都是基于ESP8266的小板子(ESP-01和基于ESP-12E的NodeMCU)拿出来玩了下,发现还有可玩性。主要是刷上MicroPython,就带来更多玩法。以前写过相关的Blog文,现在看着,觉得没用,于是重写一篇。

1. ESP8266硬件

可以简单理解为支持2.4GHz WiFi的廉价、低功耗芯片。详细的特点,参考官方文档:

官方Wiki,基本想了解的都可以在这里找到:

ESP8266的硬件家族介绍:

有人做了个对比:

简单来说,一般入门的,推荐购买NodeMCU或者D1 Mini这种带USB转TTL芯片的,接上电脑就可以开发了。像ESP-01这种简单且廉价的,最好作为硬件项目的模块来用,普通玩家不要像我这样贪便宜去购买。因为开发时,ESP-01需要USB转TTL来连电脑,实际使用时也需要3.3V的电源来启动。

2. 选择固件(Firmware)

还是先看官方WiKi的介绍:

能玩的固件,有3个:

1)AT命令固件(AT-Command firmware),适合ESP-01这种作为模块嵌入到硬件项目。其它硬件使用AT命令操控ESP8266来使用WiFi联网。

2)NodeMCU固件,基于Lua语言的,NodeMCU官方网站有简单介绍。另外,其固件需要从定制网站选择模块,build完后,会发Email并提供下载。

3)MicroPython,基于Python3语法作为开发语言的固件。一般需要2MB以上空间,NodeMCU板基于ESP-12E,内部空间(flash)是4MB,可以刷最新版本。ESP-01内部空间只有1MB,能刷v1.12或以下的版本,或者刷定制针对1MB的定制版。但是ESP-01运行MicroPython不稳定,网上有说是硬件的问题。所以ESP-01最好不要刷MicroPython。

3. 刷入固件

不管刷什么固件,都是一样的操作。先下载固件文件,再安装刷机工具。刷固件前,先擦除所有数据,再刷固件。网上有很多教程,包括不同操作系统,图形化工具或者命令行操作。下面以Ubuntu为例,默认连接在/dev/ttyUSB0,使用esptool.py作为工具操作。

sudo apt update
sudo apt install python3-pip
sudo pip3 install esptool #安装esptool.py
sudo esptool.py --port /dev/ttyUSB0 erase_flash #擦除所有数据
sudo esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 firmware_file_name.bin #刷入固件

4. 调试系统

命令行调试的话,Windows上可以用PuTTY(需要装对应TTY驱动),Linux(例如Ubuntu)上可以用minicom或者screen命令连上去。

screen命令的格式是screen -S 名称 /dev/接口名称 波特率,其中名称是方便暂时断开后再进入,即如下:

sudo screen -S esp /dev/ttyUSB0 115200

minicom命令,可以设置参数,直接连上,如下:

sudo minicom -D /dev/ttyUSB0 -b 115200

也可以不设参数,直接使用sudo minicom,进去后设置。具体操作是 -> 按[Ctrl] + [A] -> 按[Z] -> 按[O],即选择“cOnfigure Minicom..O” -> 选“Serial port setup” -> 弹出菜单按如下设置:

+-----------------------------------------------------------------------+
| A -    Serial Device      : /dev/ttyUSB0                              |
| B - Lockfile Location     : /var/lock                                 |
| C -   Callin Program      :                                           |
| D -  Callout Program      :                                           |
| E -    Bps/Par/Bits       : 115200 8N1                                |
| F - Hardware Flow Control : No                                        |
| G - Software Flow Control : No                                        |
|                                                                       |
|    Change which setting?                                              |
+-----------------------------------------------------------------------+

-> 选“Save setup as dfl”,回车 -> 选“Exit”,回车 然后就进入控制台了。

5. 开发工具

一般推荐ESPlorer,基于Java的开源图形化开发工具。该工具比较全面,三个固件都支持,可以用来做调试,也可以做开发,上传文件。本来想写下一些基本测试代码,比如连上WiFi之类,但是该工具都提供了对应的按钮,啥都不用写了。

crDroid for Redmi K30 5G

XDA论坛上看了很久,Android 11就只有crDroid有官方支持。加上Resurrection Remix OS用得真不爽,主要是自动杀进程,而且不分前后台。于是五一假期狠下心刷上crDroid,用了一段时间,很爽!流畅、不杀进程、支持国产支付app的指纹,续航还行。

1. 相关下载

1.1. crDroid ROM

当前版本是7.5。注:目前此ROM版本处于无人维护状态! 官网不仅可以下载ROM,还提供小米官方固件(欧版MIUI)、Recovery、OpenGapps等的链接:

1.2. 欧版MIUI

目前最新版是12.1.8,据说今年6月会推出12.5适配。当然,这不是重点。

在以下地址,找到xiaomi.eu_multi_HMK305G_V12.1.8.0.RGICNXM_v12-11.zip并下载。

1.3. Recovery

crDroid推荐的Recovery是OrangeFox。界面跟Twrp非常不同,感觉更像是文件管理器,但功能还是一样。

在以下地址,下载文件OrangeFox-picasso-stable@R11.1_1.7.zip

1.4. Margisk

目前几乎是获取root权限的唯一方案。下载地址:

要注意,从Margisk 22开始,root安装包和root管理工具,都合并为一个apk文件。root系统时,只需用Recovery刷入该apk文件。

1.5. Gapps

由于OpenGapps的Android 11版还没正式发布(当前处于测试),所以我选用NikGApps。下载链接:

一般选在Core版就可以了。值得注意的是,如果要开启Google Assistant(Google助手),需要把Google Velvet(即Google搜索)安装为系统App。NikGApps提供了对应的Addons(文件名为:NikGapps-Addon-11-Velvet-signed.zip),可以通过Recovery直接刷入系统。

2. 刷机过程

2.1. 解锁及刷Recovery

都是常识性操作。刷Recovery后,最好先备份当前系统。

2.2. 备份数据

钛备份不再更新了,推荐使用OAndBackupX备份App及数据。可通过F-Droid安装:

还有联系人和短信的备份,不再赘述。

2.3. 刷机步骤

按刷机顺序排列,crDroid的方案是:OrangeFox -> 欧版MIUI -> crDroid -> Margisk -> OpenGapps。我的方案只是用NikGApps替换OpenGapps。另外,最好先“双清”再开刷。

3. 初始设置

3.1. 去掉WiFi和信号出现“x”符号

需要使用adb执行以下命令:

adb shell settings put global captive_portal_mode 0
adb shell settings put global captive_portal_https_url https://www.google.cn/generate_204

命令执行成功后,手机开启飞行模式,然后关闭飞行模式,即可解决。

参考:https://www.uso.cn/post/view/47990

3.2. 开启Google Assistant(可选)

初次进入系统后,不插入SIM卡,语言选English(US)。安装Google Assistant并设置开启。成功后,再插入SIM卡,并设语言为中文。


更新 2023-06-22

1. 针对此机的crDroid 9(Android 13)终于有人维护。

详见:https://crdroid.net/picasso/9

刷机时注意:

  • 需要“双清”数据后全新刷入。
  • 需要更新对应的Firmware和Recovery。

2. GMS耗电的问题。

原因:可能是Android的安全补丁一直没更新,Google Play服务会不断尝试后台下载更新,但非Pixel手机会下载失败。

  • 解决方案1,执行以下命令:(参考来源:https://www.v2ex.com/t/902344)

    pm disable com.google.android.gms/.chimera.GmsIntentOperationService
    
  • 解决方案2,使用Magisk模块“Universal GMS Doze”。

    • 项目地址:https://github.com/gloeyisk/universal-gms-doze
    • 该项目是把GMS改为可设置“电池优化”。但试了没效果

3. ROOT方案。

旧的ROOT方案是使用Magisk。隐藏ROOT是开启Zygisk,再安装Shamiko模块(Shamiko发布地址)。缺点是容易被应用检测到,导致不能适应,例如国内的各大银行app。

新的ROOT方案是使用KernelSU。内核集成ROOT功能,只需安装KernelSU管理应用即可使用(KernelSU发布地址)。缺点是需要内核支持,可玩模块也没那么多。优点是隐蔽性强,几乎不被检测到。

4. system_server高占用CPU。

在crdroid 9.10到9.12都出现,直接导致手机电量消耗过快,而且偶然出现。目前只能通过重启系统解决。

5. 卡屏。

一般是切换应用时“卡屏”,就是屏幕画面不变,且不接收任何输入。一般等几秒就恢复。“阿里系”的应用,例如“支付宝”、“淘宝”,切换时最容易出现。