学校作业将改用jupyternotebook完成

Author: R.W.Flurando

Tags: jupyter

前言

此前学校作业我一直是用org mode导出为PDF写的。

但这个做法有个问题,就是我只有电脑才可以做作业。

而在学校有很多时候并不能拿出电脑写作业,即便拿出电脑也未必有空来写作业。

由于学校课时的不合理,大多数时间都是碎片化的,几乎只有周末和没课的半天可以在电脑上弄作业,而这时候要是刚好我有什么代码或文章的点子需要实践,作业就没时间弄了。

那么问题就来了,如何在手机上也能写作业。

虽然org有beamer,但是我用的是苹果基本是没法适配。

解决方案

我想来想去,还是决定用jupyter notebook来写。

而且不得不仅用ipython后端,因为只有这个是默认的,其他后端嘛……等我先把这第一步迈稳了再想吧。

这里的好处是双端都可以写,哪怕只有电脑端可以导出也会更舒服,虽然要用python,但是学校作业本身和python也一个档次,谁也别看不起谁。

配置方法

其实目前我也没有弄好,因为要git同步ipynb文件到手机并不方便,最好是服务器上弄jupyterlab服务网页。

那么现在的问题就是怎么在服务器上搭建这样一个服务,搞笑的是jupyter项目大篇幅教你怎么在kubernetes上配置,怎么在自己电脑上安装之类的,却几乎没有提及怎么在各人服务器上使用。

准确说提了,但是详略程度和kubernetes自建比起来简直是打发狗的。

可以看到,jupyter项目的重点受众还是企业和部分研究室,它恨不得给出Windows上逐个点击的截图教程,却不愿为所谓的个人自建模板给出能照着做的使用说明。

一番搜索后,我发现Guix系统根本没打包JupyterHub,那么我们只能用OCI镜像玩了。

官方的OCI镜像就更搞笑了,只含JupyterHub本体,其他部件需要自己安装,那你好歹给个示例的compose文件呀?没有,啥都没有,只有运行本体的说明,然后告诉你可以DockerSpawn,具体怎么联动不提。

最后我在awesome-docker-compose网站上才看到,原来个人自建用的是红帽源代码库网站里的minimal-notebook镜像,也就这个比较方便。

于是我就实验了一下,还真挺好。

具体而言,我们需要映射两个文件夹出来,一个是/home/jovyan/.jupyter,另一个是/home/jovyan/work

映射好我们在容器内运行bash并用jupyter lab password设置密码。

密码我是用的随机60位UTF-8可打印字符,当然你非要用简单密码也行,不过密码简单了可别摆在公网上跑,因为jupyter是可以以运行者的身份执行代码的,吃亏了别怪我没提醒。

默认状态下,你只要这样设置了密码,就不用管什么token了,直接8888访问。

我这里的配置大概是这样的

(simple-service 'oci-jupyter-notebook
                oci-service-type
                  (oci-extension
                    (containers
                       (list
                        (oci-container-configuration
                          (provision "jupyter")
                          (network "<your custom network>")
                          (image "quay.io/jupyter/minimal-notebook:latest")
                          (volumes '("<your folder A>:/home/jovyan/.jupyter"
                                     "<your folder B>:/home/jovyan/work"))
                          (extra-arguments '("--ip" "<your chosen ip>"))
                          (auto-start? #t)
                          (respawn? #t))))))

这里面子网和ip是可选的,如果你完全不知道我在说什么,把这两行删掉用默认分配的就可以了。

我设置了专门的子网和ip地址,是为了反向代理配置起来方便,如果你是直接摆在公网服务器上,用ports端口映射或许更加合适。

如果你也要用子网和固定ip,请参考我这里配置网络

(simple-service 'oci-setup-network
                oci-service-type
                  (oci-extension
                    (networks (list (oci-network-configuration
                                      (name "flurando")
                                      (gateway "172.255.0.1")
                                      (subnet "172.255.0.0/16")
                                      (ip-range "172.255.0.0/24"))))))

首次服务启动后记得先停掉进去设置一下密码再开。

在运行jupyter lab password前你可能需要运行jupyter lab --generate-config来生成配置文件。

请注意,此时我们的服务是跑起来了,但明文,http不带s。

所以需要一个反向代理,租的服务器建议用caddy,这个自动帮你申请证书最方便。

我是在自己电脑上跑的,所以直接用的Cloudflare Tunnel,就是那个cloudflared软件,从隐私的角度看这个产品很糟糕,但学校作业、python更糟糕,谁也别瞧不起谁。

打比方,你用的我那个示例配置,那么就在cloudflare的zero trust one那里设置网络连接器应用程序隧道,照到172.255.0.x的8888端口上。

我这里已经用上了,虽然safari浏览器打开jupyterlab布局很“拮据”,但我相信,这一定能让做作业更方便。

注意事项

只要你要暴露到公网,就必须用强密码,因为jupyter可以直接执行任意代码,切记!这回不是你的脑瘫色图密码,是你整个计算环境的密码。

一定要配置https,没有ssl加密信道,用什么密码都没用,明文传密码,中间七八个路由节点实时分析记录,头都给你卖干净了。

可能的升级

我之后会查查kernel下到什么地方,能不能用volumn挂载持久化kernel的下载,这样我们可能可以下一些插件什么的。

其实我很想用guix kernel,可是那个需要guix环境,目前用的镜像当然没有,算了,等jupyterlab-service-type被大佬实现吧。

感想

这年头什么都碎片化,我也没办法,只能随波逐流感觉。

谁敢信,这个更新卡了我三四周,真是恶心坏了,要是手机能用个简略版的emacs加自动git同步org文件,我打死也不会碰这个jupyter的,py里py气的眼里只有企业。