2025-01-30 11:13:54
自从DockerHub在国内被墙之后,Docker镜像在国内的拉取一直是一个问题。目前有许多解决方案,比如:使用公开的镜像站、或者通过Cloudflare自建镜像站等等。但是都存在访问不稳定、配置麻烦等问题。
实际上,Github提供的Actions服务器就是在海外,可以通过Actions拉取Docker镜像,并推送到国内的云厂商,实现稳定的访问!
tech-shrimp/docker_image_pusher 库就实现了这个功能!
首先 fork 项目:
到本地,然后基本上根据 README 文档来即可;
需要在 fork 后的仓库的配置中配置 Secrets:
配置完成后直接修改 images.txt
文件即可直接拉取镜像并推送到阿里云的容器仓库!
源码仓库:
2025-01-29 13:49:26
最近DeepSeek如火如荼,由于目前我也有自己搭建个人知识库的需求,因此结合最新的一些技术搭建了一下。主要是包括:
源代码:
环境搭建部分完全使用 Docker:
首先部署 Milvus、然后部署 AnythingLLM 平台,最后注册 SillconFlow 并对平台进行配置。
向量数据库 milvus 的部署比较简单,直接通过 docker-compose 部署即可:
version: '3.5'services: etcd: container_name: milvus-etcd image: quay.io/coreos/etcd:v3.5.16 restart: unless-stopped environment: - ETCD_AUTO_COMPACTION_MODE=revision - ETCD_AUTO_COMPACTION_RETENTION=1000 - ETCD_QUOTA_BACKEND_BYTES=4294967296 - ETCD_SNAPSHOT_COUNT=50000 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd healthcheck: test: ["CMD", "etcdctl", "endpoint", "health"] interval: 30s timeout: 20s retries: 3 minio: container_name: milvus-minio image: registry.cn-hangzhou.aliyuncs.com/jasonkay/minio:RELEASE.2023-03-20T20-16-18Z restart: unless-stopped environment: MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin ports: - "9001:9001" - "9000:9000" volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data command: minio server /minio_data --console-address ":9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 standalone: container_name: milvus-standalone image: registry.cn-hangzhou.aliyuncs.com/jasonkay/milvus:v2.5.4 restart: unless-stopped command: ["milvus", "run", "standalone"] security_opt: - seccomp:unconfined environment: ETCD_ENDPOINTS: etcd:2379 MINIO_ADDRESS: minio:9000 volumes: - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"] interval: 30s start_period: 90s timeout: 20s retries: 3 ports: - "19530:19530" - "9091:9091" depends_on: - "etcd" - "minio"networks: default: name: milvus
镜像使用的是我在阿里云上的,国内也可以直接使用;
使用:
docker-compose up -d
部署即可;
部署成功后,Milvus 的默认账号、密码为:
rootMilvus
可以通过在部署的时候提供配置文件来配置账号密码,也可以部署后通过 Python 脚本部署;
例如:
from pymilvus import MilvusClientclient = MilvusClient( uri='http://localhost:19530', # replace with your own Milvus server address token="root:Milvus")client.update_password('root', 'Milvus', '<your-new-password>', using='default')print(client.list_users())
参考:
在启动 standalone 类型的服务后, Web 界面会有 etcd unhealthy 的报错。
这个是正常现象,忽略即可;
参考:
SiliconFlow 提供了各种大模型的 API,甚至有许多免费的版本;
可以通过下面的链接注册:
链接包含我的邀请码,注册后可额外获得 2000w 的 token 额度。
注册成功后,可以在 API密钥 生成密钥;
保存,后面会用到!
可以通过 Docker 直接部署 AnythingLLM:
export STORAGE_LOCATION=$HOME/workspace/anythingllm && \mkdir -p $STORAGE_LOCATION && \touch "$STORAGE_LOCATION/.env" && \chmod -R 0777 $STORAGE_LOCATION && \docker run -d -p 3001:3001 \--restart=unless-stopped \--name my-anything-llm \--cap-add SYS_ADMIN \-v ${STORAGE_LOCATION}:/app/server/storage \-v ${STORAGE_LOCATION}/.env:/app/server/.env \-e STORAGE_DIR="/app/server/storage" \registry.cn-hangzhou.aliyuncs.com/jasonkay/anythingllm:latest
这里需要注意:
Docker挂载目录需要给权限 0777,否则可能会报错无权限(尤其是root用户操作):
在配置 LLM 提供商
时,需要选择:Generic OpenAI
才能使用我们在 SiliconFlow 中的模型,随后配置:
Qwen/Qwen2.5-7B-Instruct
)在配置向量数据库时,可以直接使用 AnythingLLM 中内嵌的 LanceDB,此时无需配置;
当然,也可以使用我们上面已经部署好的 Milvus 数据库;
此时,只需要配置:
上面配置完成后,即可正常使用对话功能;
但是,如果想要通过上传文档、图片等形成个人知识库,则还需要对数据进行向量化等操作,此时需要加载模型;
在没有挂梯子的情况下,在上传文档时会报错:fetch-failed-on-upload
:
此时大概率是一位模型无法下载;
可以通过手动下载并加载的方式来解决:
参考:
首先,在 <your-anythingllm-path>/models/
目录下创建 Xenova
目录;
随后下载模型压缩包,并上传到这个目录下:
最后解压缩即可:
unzip all-MiniLM-L6-v2.zip
解压缩完成后效果:
root@VM-12-16-debian:~/workspace/anythingllm/models/Xenova# tree ..└── all-MiniLM-L6-v2 ├── config.json ├── onnx │ └── model_quantized.onnx ├── tokenizer_config.json └── tokenizer.json2 directories, 4 files
全部部署完成后,可以创建新的工作区,并且在工作区中创建 thread 进行新的对话;
同时在工作区中也可以上传文档,在对话时,AnythingLLM 会首先根据你的问题,在向量数据库中匹配,随后发给大模型作为 prompt 来生成对应回答!
除了使用 Docker 来部署 AnythingLLM 之外,也提供了桌面的版本;
Desktop 版本和 Web 版的配置非常类似,这里不再赘述!
源代码:
2025-01-17 13:45:11
又是新的一年了,最近放寒假,终于能抽出时间来总结一下2024年、再展望一下2025年!
2024年对我个人来说,是转变极大的一年。
在这一年,我彻底放弃了程序员的职业,转而回家考取体制内,最终在八月份成为了一名家乡大专的计算机专业的老师。
除了职业上的转变,实际上也包含了心态上的转变。
在2024年的上半年,实际上花了很长时间继续去做一些技术上的突破,比如:
但是,后面发现对于技术的热情实际上是有所下降的。
与其说是对于技术的热情有所下降,不如说是更多是想分享知识,而非单纯的研究技术;
当然,除了研究技术之外,上半年也准备了一下考试。
别忘了,我是学电气工程出身的!
为了准备相关的考试,又重新复习了一下电气工程的相关书,包括:
最后也是通过笔试第二、面试第一成功选择了学校的岗位。
有些人可能会奇怪,电气工程专业为啥当上了计算机的老师;
实际上我在去学校报道的时候,正好碰到了计算机学院的院长,然后就被拉到了计算机学院😁,巧了!
八月份入职之前,其实提前准备了一些教师相关的东西,比如:
但实际上刚入职的老师会被要求担任辅导员;
作为初入学校的「しろうと」来说,辅导员的挑战实际上是有的。
对于2024年新入学的学生来说,大致是在06年出生,和我相差大概10岁左右。
但是实际上,辅导员算是一个半管理岗位,为啥说是“半”呢?
因为,每天一睁眼,几十号人的吃喝拉撒基本上都要你管!
但是实际上会有些紧张,这个紧张一方面是:和一群「歳下」 的孩子们接触:
实际上,这些工作和程序员的工作思路是完全不同的事情!
另一方面是:如何正确的引导这些学生?
我自以为,老师和其他相关的职业有一个很大的不同在于:
一个好的老师真的可以拯救学生,而一个不负责任的老师真的也能毁掉无数个学生
我自认为自己还算是一个做事负责任的人吧!
实际上你的言行真的会影响到很多学生、尤其是刚刚成年的学生未来的三观。
但是对于如何做,实际上当时我是毫无头绪的!
但是当时我给自己定下了一个最低的底线:
现在看来,这个底线实际上也并不低!
我第一次接触学生实际上是在新生报道之前。
因为我之前是程序员的缘故,接触过不少云计算相关的内容,所以我的导师王老师让我来带一带竞赛的学生;
实际上这个决定让我首先小范围的接触了几位同学;
对我后面工作的开展获益匪浅;
所以,在还没开学之前就了解了目前这个年龄段的学生脑子里想的是什么,学生的层次、一些学校的规则制度、运行模式等等。
同时也能够小范围的先锻炼锻炼自己的表达能力…
关于竞赛的事情,后文再继续聊~
当新生辅导员的第一件事实际上是为全班的新生建群。
好在我带的班学生都比较积极,基本上一天之内就建好了!
到了24级正式开学的时候,实际上今年一共招了将近900号学生,要对这些学生进行信息采集、确认;
当时在学院楼外面坐了整整两天,说话说的嗓子都要哑了,最后也是顺利的把这些熊孩子给安置好了。
迎新结束之后,马不停蹄的就是学生的军训;
比起我当年的军训,个人觉得00后的军训强度要低太多了;
可能是身体素质整体都下滑,军训还没开始,刚刚站了十几分钟就已经有晕倒的了。
我带的班,军训的两个星期也是请假无数……;
总而言之,身体素质在00后这一代真的堪忧……。
在军训期间,要开一个班会,和班里的同学都见见面。
这也是我第一次以辅导员的身份站在讲台上;
其实刚开始还是有些紧张的,毕竟下面坐着几十个完全不认识的熊孩子;
需要做的实际上是提前准备班会的内容,可以先记在笔记本上,然后带过去讲就行;
后面发现,站上去之后讲的挺自然的,就不紧张了…
当然,现在在上面时间长了,早就没什么感觉了…
在九月底还没到十月份的时候,接到了通知要带几个学生去开封参加比赛,这也是我第一次带学生外出比赛;
比较好的是,来回的路途是由市政府安排的专车接送,所以不需要提前订票了;
但是当时的酒店我们希望能拼房,所以出来不小的问题,就是和我们拼房的人提前3天走了,导致我们无房可拼;
不过后面也是找到了开封市的人社局给解决了;
本次比赛的成绩可以说是非常惨淡:参与了3个赛项,无一获奖!
实际上一个比较关键的原因是:竞赛的学生基本上都是靠自己自学,而没有老师带!
这些学生会浪费大量的时间在寻找学习材料和学习路径上,这是很可怕的事情!
这也让我感受到了,学校的竞赛之路,任重而道远啊!
除了上面的事情之外,实际上还有很多其他的事情,下面就简单列出一部分:
最后想再说一下:
我最开始以为,来到大专的学生大多数是对学习毫无兴趣的学生;
但是后面接触之后我发现,实际上这里大多数学生都来自农村、乡镇(至少我班里只有4、5个是城市户口);
他们先天就没有特别好的教育环境。
以我带的竞赛的一个学生为例:这个学生白天的时候要去干农活、晚上在家做完饭之后,才能抽出时间来学习云计算;
我当时听完之后感觉到挺不可思议的。
当时我还戏称自己是“上山下乡”……
作为一个老师而言,其实最基本的一个工作就是讲课;
分享的经验实际上在之前当程序员的时候是有的,当时有大量的技术分享会,而且我也参与过一次线上的直播分享;
但是实际上对于这些学生的水平,我是拿不准的,不知道这些学生对于知识的掌握程度,这个是很致命的!
好在有个学生掌握的还可以,但是没有老师带,实际上还是挺吃力的,一直在自己部署 OpenStack,对于 Docker、K8S 都不知道是什么;
我也是从 Github、git、一路讲到 Docker!
实际上,如果真正感兴趣、用心学的学生,他的学习能力是惊人的!
最后也是拿了省二等和国家三等奖的成绩。
实际上这个成绩只是个开始,后面还要继续努力!
关于这个试讲,这里说一下。
新入职的老师是不会直接参与讲课的,只有通过了:教研室、系部、学校,三个阶段的试讲才能上课。
试讲的内容是自己选择一门最拿手的课程,然后进行无生试讲,大概 15 分钟左右。
我的试讲内容实际上是云计算,讲的 Docker。
由于没有什么经验,同时备课准备的实际上不是很充分,所以课讲的稀烂……
甚至讲课的状态是我最讨厌的念 PPT 的方式……!
当时主任给我提了很多很实用的整改意见,我这里大概总结了几条:
这里非常感谢主任给我提的这些意见,让我在后面找到了讲课的方向,慢慢摸索出了如何讲课!
实际上还有另外一个问题,就是:当时我刚来的时候就是给参与竞赛的学生讲,但是这些学生实际上水平、学习热情是远远高于一般的学生的!
实际上这也导致了,后面在真正上课的时候,一开始上课的内容实际上学生并不能很好的掌握(甚至部分学生别崩溃)!
后面,由于第一次试讲讲的并不是很好,所以后面又陆陆续续讲了几次试讲,进步其实是很明显的!
在第二次试讲之前,为了锻炼一下自己的讲课能力,参与了一些其他课程的讲授。
主要是几次的新生分享:
第一次是给24级新来的计算机专业的新生讲解目前一些新的主流技术,比如:云计算、大数据、人工智能相关的内容;
第二次是给学校的本科学生讲解:大学时间规划、考研等相关的内容;
相比于第一次分享,第二次是受到学校的另一个学院的院长邀请,形式上也比较正式,是在学校图书馆一楼的报告厅,大概有几百号学生参与;
实际上准备的并不是很充分,但是不知道是不是因为讲的都是自己的经历,反而没什么可紧张的,讲的过程也很顺利。
实际上,在台上看到下面坐着的许多学生心里还是几多感慨:
大概十年前,我和他们是一样的迷茫,不知道自己何去何从,不知道自己要干什么……
所以当时,上台之前,我想做的实际上就是分享自己的经历,包括好的和坏的。让这些学生有所借鉴,能走出属于这些孩子自己的一条路!
同时,由于我是学校计算机社团的指导老师,在后面也给社团讲了一次课(大概2个小时的时间)。
主要是分享(或者说科普)一些计算机相关的内容。
来参与的学生实际上并不只是计算机专业的学生,但是除了基础的 Python 之外,我还是讲了一些其他的内容。
比如:
基本上每次分享,我都要讲上面的一些内容;
尤其是 Github,我觉得如果从事计算机专业,这个网站是必须要知道的!
但是国内很多高校的学生,甚至到毕业都不知道这个网站!
个人觉得,学会并使用 Github 是从事计算机行业最基本的一项内容!
第二次试讲来的比较匆忙,从通知到试讲实际上就间隔了两三天时间。
并且由于和之前第一次试讲间隔了太长的时间,实际上之前试讲的内容都忘的差不多了。
好在 “瘦死的骆驼比马大”!
所以最后还是顺利的拿下了。
当然,当时院长也提出了不少的意见,比如:
十一月底的时候,由于有一位老师提前走了,他这学期有两门课需要我临时带,所以强度突然上来!
当时是周五的晚上通知我,下周一就要上课了!
由于是第一次正式上课,很多规矩都还不清楚,而且当时是临时代课,还不知道之前的内容。
所以花了一些时间将要做的按照先后顺序事情归了一下类:
比较巧的是,我带的其中有一门课,在还没开学的时候,提前备过课,所以可以直接拿过来讲。
所以第一节课实际上马马虎虎,没有讲什么具体的操作内容,主要是对大数据的技术做了一个科普。
但是后面的课程实际上是出了一些小状况的:
1、由于这些学生之前的基础没有打好,所以导致我在讲课的时候,班里一大半的学生根本不知道如何实操!
实际上,使用到的都是一些非常讲的的 Shell 命令!
对于我之前带的竞赛的学生来说是非常简单的,但是对于来上课的普通学生来说,感觉比登天还难!
所以后面又先带着“复习”了一下 Linux 的内容。
2、另外一个状况是:在机房里面,实际上是没有部署相应的软件的,所以学生没办法跟着一起练习!
所以,我专门抽了一个下午的时间,做了一个 VMWare 的镜像给到学生,让学生们可以直接通过这个镜像练习!
最开始我做的是一个无图形界面的系统,但是发现这些学生不会用……
所以没办法,又做了一个 Desktop 版本的……
不管怎么样,最后也是把课、期末考试、教学材料跌跌撞撞的走完了!
虽然比较生涩,但是确实把:
在高强度之下快速的摸清楚了!
第三次试讲是由学校来组织的,来参与的都是新老师,但是还是收获满满。
我由于之前的很多经历,准备的比较充分,所以没什么可紧张的。
但是,在听其他老师试讲的过程中,实际上发现自己和他们还是有非常大的差距的!
尤其是有几个音乐专业的老师,讲的生动形象,我和他们比起来可以说是相形见绌……
并且,我在试讲的时候,写板书写了一分多钟,被评委给吐槽了……
上面是半个学期的一些工作内容。实际上,除了上面列出的一些工作之外,还有很多其他的工作没有列出来。
可以说,虽然是一个新的老师,但是工作还是非常充实的!
下面列一些我觉得这学期工作的时候,比较实用的一些技巧和心得。
这个是我目前为止,基本上离不开的一个东西!
因为辅导员的事情实际上是非常多的,基本上每次开会都要安排十几件事情!
如果没有个待办清单,很多事情都会忘掉!
我之前尝试过一些其他的 TODO 应用,但是感觉还没有小米自带的好用。
小米的待办清单在 Windows 上有 MIUI+
可以同步,但是我用的是 Mac,没有这个软件。
但是有一个 小米云服务
,所以可以曲线救国,用这个!
这里面唯一一个我用的功能就是待办清单!
顺便吐槽一下,MIUI+ 说了好多年适配 Mac 了,到现在还没有做出来……
有的人可能会对辅导员这个职业比较抗拒,但是实际上我倒是觉得这是为数不多比较暖心的工作了…
可能是因为我和这些孩子们的年龄差距不大,所以并没有那么多代沟,所以沟通起来还是比较轻松的。
而且也都经历过学生时代,对于这些学生心里是怎么想的、比较反感的东西实际上是一清二楚的。
当时给自己定的目标就是:
基本上每周六晚上我值班的时候,都会和班里的学生打打篮球。
然后时不时的在班级群里吹吹牛啥的,也挺欢乐。
但是确实,有的事情确实是没有办法,dddd……
对于讲课来说,是一个老师的基本功。
一个感受比较深的点就是:
一定要备课!
一定要备课!
一定要备课!
不备课的课和备过课的课上起来是完全不一样的!
备课的时候,主要是记一下这节课的主要大纲,有哪些重点难点什么的。
然后就是提前准备一些和课程有关的例子,如果不熟悉可以提前先打印出来,然后用笔标注一下。
认真备课之后,讲出来的东西可能才是你想要表达的;
如果不备课,虽然很多东西都是你用到的很基础的内容,当时实际上有的时候也很难讲出来!
我刚来学校的时候,主任和我分享的一句话就是:
备课实际上是备学生,你要了解你上课的班的学生的整体状态!
首先就是做事方面:
很多事情不懂得推脱,基本上只要有能帮忙的地方,都会去揽活来做,把自己搞得比较累。
有些时候如果自己比较忙,实际上是可以拒绝的!
另外就是讲课方面:
基本上现在很多课程都还需要很长的时间备课,同时讲课的能力方面实际上还有很大的进步空间。
心态方面:
很多事情在做的时候,还是会比较急,心态容易出问题。
这可能在未来的工作中还需要进一步沉淀沉淀!
聊完了已经过去的 2024 年,下面是我对于 2025 年的一些规划:
证书:
高校教师资格证 + 普通话证
通过软考中级(软件设计师)
日语N2证书
雅思证书(待定)
跑步:
旅游:
购物:
内容可能不是很多,但是是一些目前我能够想到的东西;
如果后面有新加入的内容,也会再加进来!
最后,祝愿各位在新的一年都能顺顺利利,无限进步!
今年も、よろしくお願いします!
2024-09-11 10:28:56
Excel统计信息中有身份证号,可以通过身份证号直接生成性别列;
例如,B2 列为身份证号所在列,则可以在性别列(如D2列)填写:
=IF(MOD(MID(B2, 17, 1), 2) = 1, "男", "女")
输入后回车计算结果即为性别;
可以下拉直接生成全部结果!
参考:
2024-08-22 10:19:57
我平时看的都是PDF电子书籍,但是之前没有用书籍管理,所以书籍比较乱;
比较有名的书籍管理系统有Calibre,但是Talebook支持OPDS,同时能从豆瓣导入信息,比较好用;
本文介绍了如何部署和配置Talebook;
源代码:
项目地址如下:
DockerHub地址:
B站上也有UP主对Talebook做了介绍:
部署起来也是非常简单,先把镜像拉下来,然后 docker-compose 就行:
docker-compose.yml
version: "3"services: talebook: container_name: talebook image: talebook/talebook:v3.8.1 volumes: - /data/talebook:/data ports: - "80:80" - "443:443" environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai # 调整为『SSR=ON』可开启「服务器端渲染」模式,对于搜索引擎更友好,同时更消耗服务器性能 - SSR=OFF depends_on: - douban-rs-api restart: always douban-rs-api: container_name: douban-rs-api # https://github.com/cxfksword/douban-api-rs image: ghcr.io/cxfksword/douban-api-rs:latest restart: always
配置都比较简单,目录挂载、端口映射直接根据自己的需求修改即可!
基本的配置,上面的B站UP基本上都讲了;
需要注意的是:
配置豆瓣的时候,url 结尾的 /
要删除!否则会无法使用!
参考:
支持 OPDS 的 APP 推荐:
参考:
需要注意的是:
如果要使用 OPDS,需要配置:
参考:
Enjoy!
源代码:
参考:
2024-08-22 10:00:43
阿里云的Docker源没了,本文写了在2024年如何安装Docker、配置DockerHub源;
PS:没想到2024年了,还在写Docker安装的教程…
目前(2024年8月22日),阿里云已不再提供 Docker 源的安装(404了);
腾讯云目前还是提供的,安装教程如下:
Ubuntu的安装如下:
sudo apt-get updatesudo apt-get install ca-certificates curlsudo install -m 0755 -d /etc/apt/keyrings# Debian系统将ubuntu改为debian!sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.asc# Debian系统将ubuntu改为debian!echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt-get update
需要注意的是:如果是Debian系统,需要将上面的ubuntu改为debian即可!
安装:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
众所周知,由于不可抗因素,国内是无法在 DockerHub 上 pull 镜像的,Github 的 ghcr.io 也不行;
下面的网址提供了一些目前可用的镜像站:
以及使用 CF 搭建镜像站的教程:
参考: