Visual Studio Code Server

在个人站点上搭建了一个 Code Server,体验了一下功能。我使用的是这个镜像:linuxserver/code-server,https://hub.docker.com/r/linuxserver/code-server

最近体验了 CodeSandbox 的服务,这是一个在线编辑代码的服务,并且可以在容器里编译运行。免费的方案每个月限制 40 个小时的运行时间,并且只能支持 20 个项目,按照这几天的使用强度,很快就要用完。所以打算在自己的云主机上运行一个私有的服务。于是就搭建了这个平台。现在基本的功能搭建起来了,可以在线 Git Clone,打开代码仓库:

代码编辑使用感受还不错,与正常的 Visual Studio Code 一致,除了快捷键有一些差异,一些涉及到窗体控制的快捷键会被浏览器拦截掉,其他的功能和界面样式都没什么区别。镜像里面只有基础的 Linux 和 Git 工具,需要根据自己的需要安装开发环境。

要把这个环境用起来,下一步还需要做两个工作:

1、安装开发环境:按照自己开发的需要,把 Node 18、Node 20、JDK + Maven 安装进去,做出几个镜像,这样就可以根据项目的架构选择一个镜像运行起来;

2、设置网关:对每一个 Workspace 自动创建一个网关,项目启动的时候就把网关运行起来,可以在外部提供一个访问地址,调试程序。

发表在 未分类 | 留下评论

在树莓派上启动了一个LLM

今天在树莓派上安装了一个 LLM,功能可以跑,效果凑合,性能非常低。用 Docker 安装,使用的是 `ollama/ollama` 镜像。上 Docker HUB 一查有 arm64 架构的镜像,可以在树莓派上运行。

docker run -d -p 11434:11434 --name ollama ollama/ollama:0.1.29

启动后可以在 11434 端口查看 Ollama 的状态:

$ curl http://localhost:11434
Ollama is running

Ollama 有 Web API,可以使用 Web API 调用内部的功能。为了省下研究的时间,直接 Attach到容器内执行命令,下载一个 `llama2` 模型:

root@83cf69f4af80:/# ollama pull llama2
pulling manifest 
pulling 8934d96d3f08... 100% ▕████████████████████████████████▏ 3.8 GB                         
pulling 8c17c2ebb0ea... 100% ▕████████████████████████████████▏ 7.0 KB                         
pulling 7c23fb36d801... 100% ▕████████████████████████████████▏ 4.8 KB                         
pulling 2e0493f67d0c... 100% ▕████████████████████████████████▏   59 B                         
pulling fa304d675061... 100% ▕████████████████████████████████▏   91 B                         
pulling 42ba7f8a01dd... 100% ▕████████████████████████████████▏  557 B                         
verifying sha256 digest 
writing manifest 
removing any unused layers 
success

运行 `llama2` 模型,提了一个问题:

root@83cf69f4af80:/# ollama run llama2
>>> What is a primary number?

A primary number, also known as a prime number, is a positive integer that is divisible only by itself and 1. In other words,
it is a number that is not divisible by any other number except for 1 and itself. Examples of primary numbers include 2, 3, 
5, 7, 11, and 13.

启动之后内存暴涨 20%,对话开启之后 CPU 一直顶到 100%,性能非常低。初始化花了 1 分钟以上,平均出来一个 Token 大约需要 5 秒。考虑到这个性能,基本上不具备实用性。

问了一个编程的问题,结果给出了代码,还给出了解释,效果符合预期:

>>> Write a code for me in Python to judge if a number is prime number.
Of course! Here is a simple function in Python that takes an integer as input and returns `True` if it is a prime number, and
`False` otherwise:
```
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True
```
Here's how the function works:

1. If the input number is less than 2, it is not a prime number (since 2 is the smallest prime number). So we return `False`.
2. We loop through the numbers from 2 to `n ** 0.5`, where `n ** 0.5` is the square root of `n`. We check if `n` is divisible
by any of these numbers. If it is, then it is not a prime number.
3. If `n` is not divisible by any of these numbers, then it is prime. So we return `True`.

Here's an example usage of the function:
```
print(is_prime(25)) # Should print True
print(is_prime(30)) # Should print False
```
I hope this helps! Let me know if you have any questions or need further clarification.

最后用中文问了一个问题,回复竟然是英文的,并且体现了大模型的一贯作风:自信地胡说八道。

>>> 如果所有人都会死,苏格拉底是人,那么苏格拉底会不会死?
This is a classic paradoxical question, and the answer is yes, according to the paradox.

The paradox states that if every person will die, then Socrates (or anyone else) will not die. This is because if everyone 
will die, then Socrates will also die, which goes against the initial assumption that he won't die.

So, according to the paradox, Socrates will not die, even though everyone else will.

考虑到 `llama2` 模型的体积较大,也许不适合树莓派的环境,所以更换了一个体积更小的 `tinyllama` 模型,测试速度快了很多,但是仍然不具备实用性。用 `open-webui` 镜像安装了一个 Web 界面,效果就是这个样子:

总而言之功能都很好,就是性能太低。以后可以研究一下用 Ollama 训练一个私有模型,处理个人办公和写代码的工作。要达到实用标准一台性能更好的主机是必要的,也许需要 GPU 卡。

发表在 未分类 | 留下评论

Chon为我推荐一个DevOps语言

前两天Chon为我推荐了Pkl,Apple的开源项目,用来写配置文件的编程语言。这是它的主页:https://pkl-lang.org/index.html

name = "Swallow"

job {
  title = "Sr. Nest Maker"
  company = "Nests R Us"
  yearsOfExperience = 2
}

这里还有实现Kubernetes资源的例子:https://github.com/apple/pkl-k8s-examples

import "@k8s/K8sResource.pkl"
import "@k8s/api/apps/v1/Deployment.pkl"
import "@k8s/api/core/v1/Service.pkl"

resources: Listing<K8sResource> = new {
  new Service {
    metadata {
      name = "frontend"
      labels {
        ["app"] = "guestbook"
        ["tier"] = "frontend"
      }
    }
    spec {
      type = "NodePort"
      ports {
        new {
          port = 80
        }
      }
      selector {
        ["app"] = "guestbook"
        ["tier"] = "frontend"
      }
    }
  }

  new Deployment {
    metadata {
      name = "frontend"
    }
    spec {
      selector {
        matchLabels {
          ["app"] = "guestbook"
          ["tier"] = "frontend"
        }
      }
      replicas = 3
      template {
        metadata {
          labels {
            ["app"] = "guestbook"
            ["tier"] = "frontend"
          }
        }
        spec {
          containers {
            new {
              name = "php-redis"
              image = "gcr.io/google-samples/gb-frontend:v4"
              resources {
                requests {
                  ["cpu"] = "100m"
                  ["memory"] = "100Mi"
                }
              }
              env {
                new {
                  name = "GET_HOSTS_FROM"
                  value = "dns"
                }
              }
              ports {
                new {
                  containerPort = 80
                }
              }
            }
          }
        }
      }
    }
  }
}

output {
  value = resources
  renderer = (K8sResource.output.renderer as YamlRenderer) {
    isStream = true
  }
}

Pkl本身就是可编程的语言,而不仅仅是数据,所以这个配置文件就比YAML灵活很多。以前我们把Kubernetes资源转换成Helm Charts的时候需要写很多模版标签,非常的难用。以后应该转换成Pkl。

发表在 未分类 | 留下评论

OpenWrt折腾好了

春节假期把OpenWrt折腾好了。树莓派3B在家闲置了很久,一直想装一个OpenWrt作为无线路由器,春节期间搞好了。

首先要刷机,选择OpenWrt的官方镜像和其它变种都可以,社区里有很多这样的项目。OpenWrt提供了Firmware Selector,按照自己的硬件型号选择一个镜像版本就可以了。文件格式有两种,分别是Ext4和SquashFS。我选择的是SquashFS,这是一个层次文件系统,类似于Docker的Write on Copy技术,可以迅速恢复初始设置。

磁盘空间非常麻烦,一开始因为这个事情刷了好几次系统。我的SD卡是16GB的,但是OpenWrt系统初始化只有200MB的空间,装几个程序就不够了。所以尝试了一些方式Resize系统盘,各种Resize工具都不可靠,后来发现比较靠谱的办法是这样的:用cfdisk在空余存储上建立分区,格式化成Ext4文件系统,然后在OpenWrt界面上创建一个挂载点,把Ext4分区挂载到/overlay目录,重启系统就可以代替原来的/overlay卷,这样就就可以把所有的存储都利用上了。

其实用了一段时间发现,实际上磁盘空间的问题没有想象的这么大。OpenWrt系统还是应该保持简洁,尽量少安装一些软件。200MB的空间应该是足够用的。

装好了系统,接下来的事情就是配置接口和无线网络。树莓派只有一个有线网卡和一个无线网卡,用来做路由器有两种连接方式:第一种方式是有线网卡上配置到wan接口,无线网卡作为Master配置WiFi热点连接lan接口。第二方式是在无线网卡配置wwan接口连接外部的WiFi热点,有线网卡配置到lan接口。

放在家里用当然是第一种方式,wan口设置成DHCP连接上级路由器,或者设置成PPPoE直接拨号联网。

设置的时候要注意两个问题:第一是先开启无线热点再设置wan接口,否则就没有lan接口可以连接了,再也无法连接;第二是注意设备配置,一定不要直接修改lan接口的关联设备,我一开始把lan接口关联的设备从br-lan改成了eth0,结果一重启就连不上了,只好重新刷机。应该进入设备配置,把br-lan设备和eth0的关联去掉,就是下面这个√删掉:

做完了接口设置,就可以实现基本的无线路由器功能了。接下来就可以尝试安装一些软件包,发挥OpenWrt的更多特点。

为了扩充树莓派的WiFi接口,我把以前使用的USB WiFi找出来插上,安装上驱动竟然可以用。设置成无线wwan + 无线lan的方式测试了一下,速度很慢,吞吐量只能达到正常模式的一半。搞两个WiFi的必要性不大。

安装Docker也花了一些时间。安装软件库里的docker、dockerd、docker-compose就可以,这是为OpenWrt定制化的docker,适用于OpenWrt独特的文件系统和独特的网络环境。有了Docker就可以安装很多软件了,但是在OpenWrt上安装太多程序不是一个好主意,并且OpenWrt的网络设置是很复杂的,在这种系统上把Docker容器的端口映射出去不像一般的Linux那样简单,涉及到复杂的防火墙设置。我一开始把docker网络全部放开了,尝试使用了一段时间,觉得还是不装Docker比较好。

还有一个情况需要注意:lan接口里的IPv6功能全部关掉。有很多软件是基于IPv4开发的,一些情况下这些软件功能不正常,关闭IPv6就好了。

DHCP服务取消IPv6的支持:

使用了这几天总结一下:OpenWrt适合用来控制家用网络,比如控制家中的域名服务之类的,附带运行一些轻量化的应用,比如广告屏蔽、DDNS,不适合当做应用服务器来用。没有特别的需要不要用它安装Docker。

发表在 未分类 | 留下评论

站点升级了

软件和硬件都做了升级。两年前应用越来越多,树莓派3B的性能实在是不行了。于是买了一个云平台的主机,把站点搬到了云上。树莓派3B放在抽屉里闲置了很久,最近拿出来装了一个OpenWrt,总算是废物利用了。春节假期用到现在,感觉还不错。关于OpenWrt以后可以再写一篇。今天主要说说站点。

云平台费用很贵,续费的时候还是很心疼的。于是春节前买了一块树莓派4B,CPU是1.8GHz 4核处理器,ARM64架构。内存8GB,买了一张32GB的SD存储卡,安装了操作系统。机器性能实际上比云主机还要高,每个月的电费不到5块钱。站点迁移之后,把云主机的内存和存储资源释放了一部分,预交的使用费就退回了,现在买树莓派的投资已经收回来了。

32GB的存储显然是不够用的,于是我加了一张X857板卡,把闲置的一块mSATA硬盘装上去了,扩充了500GB的存储,未来的两年应该是足够了。

云主机仍然保留了最低配置,运行FRP,树莓派做了一个公网穿透,提供了一个公网访问通道。本来想用动态DNS彻底把云主机释放掉。但是动态DNS的稳定性还是不行,并且80和443端口用动态DNS是开放不出去的。我考虑留着一个公网主机以后还是会有用的,所以还是保留下来了。有空把这台云主机好好整理整理,目录文件乱的很,已经记不得装了哪些东西了。

软件方面变动不大,基本上还是以前的应用平台,只是做了一些版本升级,有的优化了存储结构。

Linkding以前使用的是内置的SQLite,现在换成了性能更好的PostgresSQL。Nextcloud版本升级了,升到20版本的最大Patch。WordPress升级到6版本的最大Patch。MySQL换成了MariaDB。

网关换了Traefik平台,以前的Nginx Proxy Manager其实也是很好的,但是需要手工配置。我的网站完全可以自动配置,于是更换了Traefik,实现Docker自动发现,ACME证书过期自动续订。

仍然使用Docker部署,Docker真是这么多年来学过的投入产出比最高的技术。把这么多应用部署在一个机器上,不使用Docker是不可能的,光是各种依赖冲突就是一件不可能解决的事,要平滑升级就更难了。树莓派是ARM64架构,云主机上的x86镜像有很多都不能用了,但是社区镜像很多,找找总能找到。

现在这个树莓派4B已经在客厅的书桌里运行了。我安装了一个远程监控:https://dash.developbranch.cn/。在公网上暴露了机器信息,不过应该风险不大。

发表在 未分类 | 留下评论

关于哲学

最近在读《哲学是什么》。最近一段时间读了几本关于哲学的书,去年有《中国哲学简史》,还有《世界哲学史》。这两天有时间打算写点关于哲学的文章。

今天已经看到了“认识论”。笛卡尔之前的哲学主要研究“本质论”,研究的目标是“世界的本质是什么”。到了笛卡尔和莱布尼茨的时代,人们开始研究“人认识世界的过程”。笛卡尔发现只有正在思考的“自我”是确定存在的,人认识一个概念,就是“自我”对这个概念进行确认的过程。

对于自我是根据什么条件对概念进行确认,笛卡尔的主张是“唯理论”,人是通过逻辑推理认识世界的,比如同一律、排除中间律等等,人就是通过这些规则认知世界的。后来的洛克、休谟主张“经验论”,他们认为人是通过感官体验认知世界的,人不能认知超越经验的事物。到康德时期,他提出了认识的统一体,终结了认识论的讨论。关于认识的统一体,书里简洁的描述,概念非常抽象,我现在还没有看明白。但是书里给出了一个很有趣的比喻,把认识的统一体比作一个填字游戏,玩填字游戏的时候,需要经验和推理共同起作用。并且当我们填入一个词的时候,我们是不能确认这个词是否正确的。必须填入所有的词,才能作为一个整体确认这个结果。这是一个有趣的比喻,关于概念描述我会继续思考。

哲学的学习是对自己的思考过程的完善,我觉得对自己的生活、投资、学习、工作等方面都会有作用,能明白自己的想法是从哪里涌现出来的,怎样用实践去验证理论,调整自己的思路,避免走进误区。有新的学习体会我会在这里继续写。

发表在 未分类 | 留下评论

这个地方还是要利用起来写点东西

自从建起这个网站很久没在里面写东西,还是应该利用起来写点东西。先写点东西把建这个站点的技术介绍一下。

Portainer:先在服务器上装了一个Portainer,这样就可以管理容器了。所有的容器都是用Portainer管理的。

Joplin Server:笔记记了很多年,以前用Evernote,后来改到国内的版本,就是印象笔记。后来感觉印象笔记的功能越来越复杂,移动端的速度也越来越慢,就改用Joplin。一开始用一个Nextcloud做数据同步,后来数据太多了,一个目录里有上万个文件,造成速度极慢。现在建了这个Joplin Server,数据存储到PostgreSQL数据库里,感觉稳定多了。不过Joplin Server的共享功能还是很弱的,直接把一个包含Markdown的JSON数据共享出来了,只能说期待后续的改进吧。

Nextcloud:存储日常需要在多个设备之间共享的文件,在公司写不完的文件同步上去,回家可以接着写。在多个设备之间同步也很方便,我已经很久没用U盘了。Nextcloud在MacOS、Windows、iOS、Android各种设备上都有同步工具,同步稳定可靠,功能强大。

Linkding:书签系统,记录了平时阅读的文章和技术资料,可以利用标签系统对书签分类,有价值的页面及时做个书签,没读完的文章也做个书签回家接着读。在Firefox、Chrome、Safari各种浏览器上都可以做书签,解决了各种浏览器书签不同步的问题。

Nginx Proxy Manager:所有的服务都用Nginx开放到外网,映射到二级域名。为了更方便的管理这些端口,使用了一个Nginx Proxy Manager作为网关,这是一个图形化的管理工具,不仅可以管理主机,还能在Let’s Encrypt申请SSL证书,自动续期,所有的服务都能用HTTPS开放出去。

发表在 未分类 | 留下评论

先做个温度计玩玩

树莓派都送到家了,先试试搞个温度计。已经在淘宝下单买了一套设备,DS18B20和一套电线、电阻、几块面包板,还买了两个继电器,可以自动开动空调电扇热水器。很快网站首页上就可以显示家里的温度了。

设备在这里买的,这个店大家可以去看看:https://szbxm.taobao.com

刚才研究了DS18B20的接法,看了这篇文章:http://blog.csdn.net/u013151320/article/details/50574409

竟然还有专门存储物联网数据的服务:http://www.yeelink.net,有一套数据存储的API:http://www.yeelink.net/developer/api,这种服务不错,我们也可以学学。

发表在 未分类 | 留下评论

这是一个树莓派网站

这个网站建在一个树莓派(Raspberry Pi)上,树莓派是一个开发板,就是这个样子:

树莓派上可以安装一个全版的Linux系统,装上一个Nginx+PHP,再装个MySQL,就可以搭建一个Wordpress系统。

树莓派是一个功能强大的开发板,有一个双核ARM处理器、1GB内存、4个USB接口、一个蓝牙接口、一个Wifi网卡、一个HDMI接口,还有一个GPIO接口,能输出3.6V和5V电压,控制其他的电气元件。

还可以在树莓派上玩Scratch,教小孩写程序。

发表在 未分类 | 留下评论

世界,您好!

欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!

发表在 未分类 | 一条评论