京东云亚瑟路由器TTL刷u-boot升级iStoreOS固件

不知道是否为了区分高低端,现在带 USB 口的路由器几乎没有低于 ¥500 的。考虑到以后可以折腾一下把路由器当 NAS,入了京东云的亚瑟。入了后才知道这东西专为 PCDN 而生,想当个正经的路由器用小问题不少。

因为家里有小朋友,定时断网是必须功能,不想这货居然没有。好在我的这个路由器版本比较老,轻松开启 SSH,经过一整折腾后搞定了定时断网。不想好景不长,路由器在关闭自动升级的情况下给升级到了最新固件。路由器上自己加的东西全部丢失,并且 SSH 后门方法失效。这个路由器要想继续折腾只剩下 TTL 刷机一条路。好在这台路由器的 TTL 刷机方案比较成熟,网上也能找到对应的固件。

刷机过程整体比较简单,但由于缺乏经验,中间走了不少弯路折腾了几天才搞定。下面是一个简单的记录,希望对同样的刷机小白有些帮助。

拆机

  1. 撕开路由器底部胶垫,露出底部的5颗螺丝。用螺丝刀全部拧开。
  2. 路由器顶盖使用卡扣固定。敲开后可以看到顶部还有两个固定螺丝,拧开。注:网上很多拆机教程里没有提到这两颗螺丝,导致折腾很久都没能弄开。
  3. 用力挤压路由器筒壁,使网口缩进外壳。抽出路由器本体完成拆机。

搞定TTL接口

  1. 可以看到主板上4个并排的孔V R T G就是TTL接口。
  2. 去淘宝搜 TTL 探针,用的时候直接插到孔上。
    • 焊接的针脚会抵住外壳导致无法塞回去,到时候还要去掉。
  3. 到网上买个 CH340 的 USB 转串口的转接卡。
  4. 我的转接卡上有 3v 和 5v 的跳线,短接 3v 。
  5. 转接卡和路由器接线时注意:G-G,R-T,T-R 这样接。V不用接。
    • G:接地
    • R:接收
    • T:发送
  6. windows系统没有自带 CH340 的驱动,要去网上找个驱动安上。

刷入 u-boot

  1. 串口转接卡一头连好路由器,另一头插入电脑。
  2. 用网线连接路由器和电脑,并将电脑的 IP 设置为 192.168.10.1
  3. 在电脑的设备管理器中查看转接卡对应的串口名。
  4. putty 连接串口,波特用 15200
  5. 路由器开机,按回车进入 6018# 模式。此时已经可以使用 boot loader 的命令了。
  6. 将 u-boot.mbn 复制到 Tftpd64 同一目录。启动 Tftpd64 。
  7. 中 putty 里敲入如下命令完成刷机
    • tftpboot u-boot.mbn && flash 0:APPSBL && flash 0:APPSBL_1
  8. 看到命令输出里有几个 `OK` 就完成 u-boot 刷机了。

准备 iStoreOS 固件

iStoreOS 是基于 OpenWRT 的一个路由器固件。固件可以从 https://fw.koolcenter.com/Lean/JDC_AX1800_Pro/ 下载到。我们需要下载其中的 *-kernel-rootfs.rar 固件。解压后会有两个 bin 文件。需要使用使用工具将两个文件合并成一个 bin 文件后一起刷入。合并工具可以使用 UBin 。由于没有找到软件的官网,大家还是自行搜索下载吧。

刷入 iStoreOS 固件

  1. 将电脑 IP 设置为 192.168.1.2
  2. 重启路由器并用 putty 重新连接路由器进入 6018# 模式。
  3. 输入命令 httpd 192.168.1.1 启动刷机的 web 服务。
    • 看网上的教程,我以为 u-boot 启动的时候会自动启动刷机的 web 服务。在 u-boot 的 help 里看到 httpd 才知道刷机服务要手动启动。
  4. 使用浏览器打开网页 http://192.168.1.1 进入刷机的 web 界面。
  5. 上传固件开始刷机。刷机成功后会路由器会自动重启。路由器启动后路由器灯为绿色。
  6. 用浏览器重新打开 http://192.168.1.1 ,此时已经可以看到 iStoreOS 的登录界面了。
    • 默认用户名为 root ,密码 password

安装Docker

我使用的 iStoreOS 固件并未集成 Docker 。尝试使用 is-opkg install docker dockerd docker-compose 安装 Docer 套件,提示空间不足,无法安装。查看磁盘信息, Overlay 分区只有几M,几乎无法安装任何东西。查看分区信息, mmcblk0p25 分区有 300M 空间。将 mmcblk0p25 分区里的数据删除,并将 /overlay 数据复制过来。在 iStoreOS 的 挂载点 中将 mmcblk0p25 挂载到 /overlay 。应用并重启路由器后可以看到 /overlay 的空间已经变成 300M 里。

安装好 Docker 后,/overlay 还能剩下大概 27M 的空间,几乎没有空间安装其他软件。考虑到其他软件都会使用 Docker 安装,因此暂不打算对 /overlay 做扩容了。

Vim下Python(Poetry)环境的设置

近期迁移到了 Neovim 。在 Pyright 的加持下,vim的代码补全和错误校验功能已经很接近 IDE 了。在未正确配置 Python 环境的情况下打开 Python 项目,项目里一堆的告警让人很不舒服。

在 vim 中编辑 Python,重要的是 PYTHONPATH 的设置。正确设置 PYTHONPATH 后,Pyright 可以正确的查找到相关的依赖库。我目前的解决方案是使用 direnv

编辑 direnv 通用配置,添加 poetry 初始化函数。

vim $HOME/.direnvrc
layout_poetry() {
  if [[ ! -f pyproject.toml ]]; then
    log_error 'No pyproject.toml found.  Use `poetry new` or `poetry init` to create one first.'
    exit 2
  fi

  local VENV=$(dirname $(poetry run which python))
  export VIRTUAL_ENV=$(echo "$VENV" | rev | cut -d'/' -f2- | rev)
  export POETRY_ACTIVE=1
  PATH_add "$VENV"
}

在 python 项目中添加 direnv 设置

vim .envrc
# 进入 Poetry 环境
layout_poetry
# 设置 PYTHONPATH
export PYTHONPATH="`pwd`/vendor/Model1:`pwd`/vendor/Model2"

在设置好 direnv 后,在 CLI 下进入目录时将设置好环境变量。CLI 下进入对应的项目目录,然后启动 vim/neovim ,Pyright即可正确的找到相关依赖。

参考:

从Vim切换到Neovim

vim作者的离世,让vim的后续发展存在很大的不确定性。加上现在用的vim配置一直有些小问题,其中一些插件的活跃度不够,bug一直无法修复。

近期花了些时间把neovim配置好,从vim切换到neovim。

配置文件: https://github.com/vicalloy/dotfiles/blob/master/.config/nvim/init.lua

  1. 没有使用别人配置好的环境,完全自行配置。
    • 之前也热衷于使用流行的集成配置。实际下来发现不管多受欢迎的配置都会有些不符合自己喜欢的地方。而且一旦遇到问题,很难定位问题。而且现在的插件管理机制已经很完善了,自行配置的门槛低了很多。
    • 不少优秀的vim插件都转由lua实现,只能在Neovim中使用。
  2. GUI界面用的 Neovide 。用 Rust 实现的 Neovim 前端。

使用Docker在Orange Pi上LLM(使用GPU加速)

最初买 Orange Pi 5 的目的之一就是想跑一些 AI 应用。Orange Pi 5 虽带了 NPU,但这颗 NPU 实在太小众,除了官方的 Demo 就没法轻松把 NPU 用起来。近期看到有人用 RK3588 跑LLM,于是把吃灰已久的 Orange Pi 5 拿出来折腾。

Orange Pi 5 使用的是 RK3588 芯片,该芯片配备的 GPU 是 Mali-G610。在 Orange Pi 5 上跑 LLM 用的就是这颗 GPU 。

基本用法

LLM 模型通过 MLC LLM 项目加载运行。在 Orange Pi 5 上通过 OpenCL 实现 GPU 加速,因此要求系统支持 OpenCL 。Orange Pi 5 的官方 Linux 镜像已添加了 OpenCL 支持,因此不用再额外安装驱动。

如果 Orange Pi 5 上已经安装了 Docker 可以使用下面的命令把服务跑起来。7b-f16 的模型会用到 6.xG 的内存,如果你的系统只有4G内存可以试试 3b-f16 的模型。

# 更多镜像见 https://hub.docker.com/r/vicalloy/mlc-llm-rk3588/tags
docker run --rm -it --privileged \
    vicalloy/mlc-llm-rk3588:FlagAlpha-Llama2-Chinese-7b-Chat-q4f16_1

编译自己的Docker镜像

rock5-toolchain 项目中提供了 MLC LLMDockerfile ,可以通过修改 Dockerfile 里的 ARG MODEL 来打包不同的模型。

为了更方便的打包不同的模型,更为了白嫖 Github Actions 服务器,我参考 rock5-toolchain 项目写了自己的 Dockerfile。相比原始的 Dockerfile,我把TVM编译/G610驱动安装等步骤打包在镜像 vicalloy/mlc-llm-rk3588:base 预置 model 的镜像从该镜像继承。要预置不同的模型,只要将对应的模型复制到镜像就好。

对应项目地址:https://github.com/vicalloy/docker-images/tree/main/mlc-llm-rk3588

参考链接:

京东云无线宝(OpenWrt)控制终端定时断网

最近将家里的路由器从 小米 换成了 京东云无线宝 。换完后发现新路由器不支持设备的定时断网了。对于有小朋友的家庭,定时断网可以很好的帮助小朋友控制上网时间。好在新入的这款路由器基于 OpenWrt 开发,经过几天的研究,顺利的搞定了定时断网功能。

开启路由器的SSH

注:2023-10 近期路由器被自动升级了。网上的开门方法全部失效,只能尝试TTL开门了。

开始折腾的第一步是搞定路由器的SSH。SSH登录到路由器后就可以随意折腾了。

由于京东云官方的封堵,不同版本固件的SSH开启方式有所不同。

  1. 1.5.40r2181<= 郑羊羊咩的窝-京东云
  2. r2262< 京东云无线宝r2262之前固件版本开SSH
  3. r2279< 京东云无线宝升级r2262固件后打开SSH

我拿到的这台路由器的固件版本很老,直接采用第一个方法开启SSH。具体方法如下:

登录京东云,打开f12控制台,将下面的代码贴入浏览器控制台并运行。

$.ajax({
    url: "/jdcapi",
    async: false,
    data: JSON.stringify({
        jsonrpc: "2.0",
        id: 1,
        method: "call",
        params: [
            $.cookie("sessionid"),
            "service",
            "set",
            {
                "name": "dropbear",
                "instances": {"instance1": {"command": ["/usr/sbin/dropbear"]}}
            }
        ]
    }),
    dataType: "json",
    type: "POST"
})

设备定时断网方案

OpenWrt系统通常自带 web 管理界面 LuCI ,即使没带也可自行安装。如果有 LuCI ,通过 LuCI 丰富的插件系统,可以轻松的实现上网时间的管控。

京东的这款路由器毕竟不是完整的OpenWrt系统,无法直接安装 LuCI 。为了设备的稳定性,保险起见没有继续折腾 LuCI 。研究后发现京东云路由器的自带的黑明单功能是通过修改设备 /etc/config/wireless 配置文件实现,于是有了下面的方案。

  1. 使用 uci 命令修改 wireless 配置文件,将需要管控的设备加入/移出 Wi-Fi 黑明单。
  2. 使用 crontab 创建定时任务,实现定时控制。
  3. 在路由器的黑明单中无法查看到通过修改 wireless 加入黑明单的设备。但可以通过将设备加入黑名单再移除的方式对设备进行临时解禁。

具体操作步骤

登录路由器

开始路由器的 SSH 登录功能,使用 SSH 客户端登录路由器。用户名为 root ,密码为路由器的管理密码。

ssh root@jdcloudwifi.com

创建将设备加入黑明单的相关脚本

1. 创建目录 /scripts 。我们自己的脚本都将放到该目录。

mkdir -p /scripts 
cd /scripts

2. 将下列脚本复制到 /scripts 目录,并使用命令 chmod +x /scripts/*.sh 为脚本添加可执行权限。

disable-wifi.sh

#!/bin/sh
# 禁止设备连接 Wi-Fi
# 使用 `cat /etc/config/wireless` 查看无线配置。通过 `option ssid` 找到对应的 Wi-Fi 配置项名称。注: 2.4G 和 5G 两个热点都需要配置。 
uci add_list wireless.ath0.maclist="$1"
uci add_list wireless.ath1.maclist="$1"
uci commit wireless
wifi reload

enable-wifi.sh

#!/bin/sh
# 允许设备连接 Wi-Fi
uci del_list wireless.ath0.maclist="$1"
uci del_list wireless.ath1.maclist="$1"
uci commit wireless
wifi reload

disable-tv.sh

#!/bin/sh
# 将 dd:dd:dd:dd:dd:dd 换成需要加入黑名单的设备的 MAC 地址
/scripts/disable-wifi.sh dd:dd:dd:dd:dd:dd

enable-tv.sh

#!/bin/sh
/scripts/enable-wifi.sh dd:dd:dd:dd:dd:dd

3. 执行 crontab -e 编辑系统定时任务。

# 周一到周五,8点关闭电视网络
0 8 * * 1-5 /scripts/disable-tv.sh
# 周一到周五,18点开启电视网络
0 18 * * 1-5 /scripts/enable-tv.sh

九寨沟-若尔盖-四姑娘山

考虑到直飞九寨沟的机票较贵,开车从成都到九寨沟时间又太长,最终选择了飞到九寨沟,再从九寨沟自驾回成都。
相比走环线,异地还车可以节约不少时间,加上减免了异地还车费用,算是个不错的选择。

杭州->成都->黄龙->九寨沟

雨季的九寨沟,天气难料。由于天气原因,一直无法确定飞机的起飞时间。最后晚点3个小时,后半夜到达黄龙机场。

黄龙机场修建在山上,海拔3447。最近的住宿点在12公里外的镇上。深夜到达早过了取车时间,花¥80打车到川主寺镇住宿,第二天又花¥60打车回机场取车。

机场附近有大片的薰衣草,如果时间充足,可以留些时间赏花。

黄龙->九寨沟

第二天一早取车自驾到九寨沟。

九寨沟很美。不过或许是因为对九寨沟有着过高的期待,并没有惊艳。

九寨沟->若尔盖->红原

刚出发的一段沿着河谷行走,两旁是陡峭的崖壁,偶有塌方的痕迹。感谢遇上了个好天气,要是遇上雨天,想必会挺危险。

用手机测了一下九若山垭口的海拔3988。一路的盘山公路。不知是高反还是晕车,车上的一大一小都给晃吐了,以至路上的风景都无心欣赏。

翻过垭口,开始进入若尔盖草原。初夏或许是草原最美的季节,草很绿,上面还开着各色的野花。

红原算是一路上比较大的镇子,镇上停车方便住宿条件还不错,价格也便宜。

红原->四姑娘山->理县

四姑娘山景区主要有三个沟可以游览。出发前还想着要选哪个,回头查了一下才知道根本就没得选。除了毕棚沟,另外两个沟都在四姑娘山的另外一面,要多开好几个小时才能到。

在看过雨崩和亚丁稻城的雪山后,四姑娘山的雪山真的太普通了。水不够漂亮,山上的雪很少,可接近性也不行,到不了雪线。四姑娘山唯一的优点可能就是离成都比较近。

晚上住在理县。理县处于两山峡谷间,土地非常珍贵,导致几乎找不到停车位。即使是酒店也只能提供非常有限的停车位。

理县->成都->杭州

初夏的成都已经很热了,不适合出游。在成都人民公园简单的转了一下就直接出发去机场了。市区严重堵车,驾驶体验非常不好。

Magpie 股价价格提醒工具

项目地址:https://github.com/vicalloy/magpie/

股票工具。设置股票的止损点和营收点,在到达止损点或营收点时发起消息推送。提供一个简易点web服务器用于查看相关股票的当前价格。

注:

用法

编辑规则文件

提醒规则使用 Json 格式进行描述。编辑规则并保存为文件 rule.json 。

[
  {
    "stock_code": "sh000001",
    "stock_name": "上证指数",
    "base_price": 3200,  # 基准价格,用于计算涨幅
    "alarm_price_min": 3100,  # 止损点
    "alarm_price_max": 3400  # 营收点
  },
  {
    "stock_code": "sz000333",
    "stock_name": "美的",
    "base_price": 54,
    "alarm_percentage_min": 0.15,  # 止损点 base_price * (1 - alarm_percentage_min)
    "alarm_percentage_max": 0.15  # 营收点 base_price * (1 + alarm_percentage_max)
  },
]

启动 Web 服务器

docker run --rm \
    -v `pwd`/rules.json:/app/rules.json \
    -p 8000:8000 vicalloy/magpie:latest \
    python -m magpie server -r ./rules.json

在浏览器中访问网址 http://localhost:8000/ 。

检查股价

docker run --rm \
    -v `pwd`/rules.json:/app/rules.json \
    magpie:latest \
    python -m magpie check -r ./rules.json \
    --datasource qq \
    --bark-token $(bark-token) \
    --tg-token $(tg-token) \
    --tg-chat-id $(tg-chat-id)

可以通过设置 crontab 的方式定时执行股价的检查。

备注

10 9,10,11,12,13,14 * * * sudo docker run ....

越来越分裂的世界

感觉近几年整个世界都在变的越来越分裂。

  1. 美国传统精英和特朗普代表的“铁锈”直接的对立。
  2. 美国的政治正确。注:游戏和电影角色越来越丑。
  3. 中国的 5 毛党和恨国党。
  4. 中国的女拳。

世界分裂可能由下面一些原因共同产生

  1. 全球经济不景气。经济快速发展,大家都有钱赚的时候什么问题都容易掩盖。目前中美的发展都遇到了瓶颈。中国要打破瓶颈就必须触碰到美国目前牢牢把握的高科技以及金融霸权。从美国到角度则必须遏制中国的进一步发展。
  2. 上网的人变多来,发声的人变多。之前上网有门槛,上网这件事本身就完成了一轮人员筛选。更少的人更容易达成共识。
  3. 个性化推荐的大行其道,更易形成“信息茧”。人们在各自的“信息茧”里不断强化自己的共识。

就我的感觉,当前中国确实有很多问题(比如过分依赖土地财政等)。这些问题涉及多方势力的博弈,甚至这些问题最终能否妥善解决还是暴雷都存在一定不确定性。单总体而言中国整体还是向上的。

  1. 空气质量整体改善,雾霾天比之前少了很多。
  2. 中国在高端制造业上开始发力。也曾很看不上华为出的手机芯片,却不想华为一步步做到里高端。如果不是美国的制裁,华为的手机芯片还会有更好的发展。
  3. 曾在公司做过几年信息化。从接触到的信息来看,中国对公司的审计每一年都比前一年要更严格。政府也在推动公司的信息化。信息后的结果是信息变的非常透明,不规范的操作变的很难隐藏。

谨慎的乐观的看 Modular 提出的 Mojo 语言

有了 faster-cpython 的前车之鉴,对 Mojo 谨慎的乐观。

宣称将成为 Python 的超集是 Mojo 相比 Codon 等项目最吸引人的一点。Codon类项目虽然宣称是Python的编译器,但实际上砍掉了 Python 所有的动态特性,几乎所有的 Python 库都无法正常使用。对我而言,如果用不了 Python 生态,那这和一个全新的语言又有什么区别。

如果 Mojo 真成为Python的超集,单就比 CPython 性能高出一大截的 Python 编译器就足够吸引人。但细看下来,“成为 Python 超集”可能只是一个美好的愿望,达成的可能性非常小。现在 Mojo 的完成度还非常低,除了支持 Python 风格的语法外,Python还差很远(连 Class 都不支持)。现在版本的 Mojo 支持导入 Python 模块,但导入的 Python 模块是以 Python 对象的方式运行。换句话说就是塞了个 CPython 解释器到 Mojo 里用来执行 Python 代码(是不是立马不高大上了)。

除去 Mojo 吹牛的部分(比如那个比 Python 快 3500 倍),对 Mojo 还是有所期待。Mojo 的创始人有着牛逼哄哄的履历(LLVM & Swift 的作者)。虽然不能完全兼容 Python ,但承诺后期会提供相关的迁移工具。如果 Mojo 的性能和开发体验确实不错,Python库的迁移成本不高,还是会有不少人会自发的将 Python 生态迁移到 Mojo 到。

注:

一个AI公司需要多少人

Stable DiffusionChatGPT 的大火,让沉寂已久的AI世界再次翻红。又开始有人在问,在AI越来越成熟的今天,程序员是否有必要去学算法,投身AI行业。在我看来对程序员而言AI带来的机会更多是如何利用AI带来的能力而不是去创造一个AI。

曾在AI公司待过一段时间,这段经历给我最大的感觉是: AI 行业是一个资本密集型产业,对普通程序员来说没太多的机会。AI的发展对普通程序员带来的最大变化是出现来一批很好用的 API ,可以实现一些以前实现不了的想法。另外就是如何利用新出现的一批AI工具提高自己的工作效率。

为什么不建议普通程序员进入AI行业

简单来说AI行业需要的专业算法人员非常少,且门槛非常高。非算法相关的人员,相对而言门槛又太低。

  1. 常规应用,通用模型已经很成熟了。对于 99.9%人根本不可能构建出一个比开源模型更好的模型。
  2. 模型的性能优化是个体力活,而且随着技术的发展,以后可能不需要手动的性能优化。
  3. 模型的调优需要大量的数据和硬件。数据清洗是和 AI 没关系的纯体力活。参数调优又需要大量的硬件,¥成本普通人(公司)根本承担不起(据说 ChatGPT 训练一次的成本就高达 1 千万美元)。

一个AI公司需要多少人

前面说到AI公司需要的人少,但具体少到什么程度可能会超乎很多人的想象。

OpenAI

OpenAIChatGPT 的母公司),仅2022年,就花费了约5.44亿美元。而与之对应的是”今年1月,OpenAI创始人透露公司员工人数为375人“。关键是这375人里包含了行政等支持人员及数据收集整理人员。

Midjourney

相比 OpenAI ,AI绘图领域的巨头 Midjourney 在人力方面更是做到了极致。Midjourney 总共只有11人:1创始人,1财务,1法务,8研发(其中4人为本科实习生)。

参考