月度归档:2023年06月

被滥用的云南十八怪

被滥用的云南十八怪

这次去云南,看到了各种各样奇奇怪怪的“云南十八怪”,让我不得不来吐槽一把。

在没去云南之前,我就知道云南有个“云南十八怪”,在解释云南各种和中原地区差异比较大的生活习惯,但说实话,一直没怎么了解过具体的细节,因为不熟悉。

根据百度百科,云南十八怪是这样的:

你说奇怪不奇怪,云南就有十八怪。
四个竹鼠一麻袋,蚕豆花生数着卖;
袖珍小马多能耐,背着娃娃再恋爱;
四季衣服同穿戴,常年能出好瓜菜;
摘下草帽当锅盖,三个蚊子一盘菜;
石头长在云天外,这边下雨那边晒;
鸡蛋用草串着卖,火车没有汽车快;
小和尚可谈恋爱,有话不说歌舞代;
蚂蚱当作下酒菜,竹筒当作水烟袋;
鲜花四季开不败,脚趾常年露在外。

百度百科

但我在云南当地,见到了各种奇奇怪怪的十八怪,甚至炒酸奶也被编进了十八怪:“酸奶炒着卖”

在 Render.com 上部署 Django 4.2

在 Render.com 上部署 Django 4.2

最近在写 Linux 中国的翻译工具的时候,后端我使用的是 Django,版本则选择了 Django 4.2,Python 3.11。在部署 Django 的时候,我选择使用 Render.com 来部署。 不过,在部署的时候,我遇到了一些问题,Render 官方提供的 Getting Started with Django on Render 会部署错误,所以有了今天这篇文章, 告诉大家如何把最新的 Django 4.2 部署到 Render 上。

初始化项目

Render 没有使用 pip,而是使用 Poetry 来管理 Django 项目的,因此,你需要使用 Poetry 来完成项目的初始化。

poetry init #初始化 Poetry 的 配置文件
poetry add django gunicorn # 添加依赖 Django 和 gunicorn
poetry run django-admin startproject linuxondjango .

初始化项目基本上就是用 Poetry 替代 pip ,这里没有需要针对 Render 特化的部分,就不做过多的介绍。

编写逻辑代码

当你完成了项目的初始化之后,可以编写你自己的业务逻辑代码,这部分不再多讲,可以正常开发使用。

配置项目以支持 Render 的服务端环境。

1. 从环境变量中读取 Secret Key

Django 使用 Secret Key 作为 Session 加密等一些加密场景的 Salt 和 Seed,所以在 Django Admin 创建项目时,会默认生成一个 Session。不过出于安全考虑,最好不要将其放在代码中,而是在服务端生成后,通过环境变量来存储,避免代码泄露后导致的 session 被解密。

你需要在 settings.py 中,添加如下代码,来替代默认的 key。

import os
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY', default='your secret key')

2. 在环境变量中读取 Debug 配置

Render 会自动配置一些环境变量,因此,你可以直接通过判断当前环境上下文来确认当前是否是在 Render 的服务端,如果不在,则配置 Debug 为 True,来解决线上不使用 Debug 模式的需求。

DEBUG = 'RENDER' not in os.environ

3. 从环境变量中读取可用域名

Django 是有域名配置的,非配置域名,无法访问当前应用,因此,你需要在 Render 当中读取域名,来确保可以正常访问。当然,如果你自己配置了自己的域名,也可以直接手动写在 ALLOWED_HOSTS 当中。

ALLOWED_HOSTS = []

RENDER_EXTERNAL_HOSTNAME = os.environ.get("RENDER_EXTERNAL_HOSTNAME")
if RENDER_EXTERNAL_HOSTNAME:
    ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME)

配置 render.yml 来支持 Render BluePrint

你可以直接复制下面的内容,来作为你的项目的启动配置。其中 build.sh 为构建项目的配置。

build.sh

build.sh 当中最重要的是重新安装 Poetry,因为我使用的是 Python 3.11.4, 和 Render 默认的 Python 3.7 不匹配,所以没办法直接用默认的 Poetry,需要自动手动升级 Poetry。

#!/usr/bin/env bash
# exit on error
set -o errexit

pip install --upgrade pip; pip install poetry;  # 重新安装一下最新的 Poetry,因为默认的 Poetry 的版本比较低。
poetry install

python manage.py collectstatic --no-input
python manage.py migrate

render.yml

Render 当中,最重要的是 startCommandPYTHON_VERSION ,startCommand 这里是我使用 gunicorn 来启动 Django 应用,而 PYTHON_VERSION 则是用来设定具体的 Python 版本,这里我根据我自己的需求,选择了 Python 3.11.4。

databases:
  - name: linuxondjango-db
    databaseName: mysite
    user: mysite
    plan: free

services:
  - type: web
    name: linuxondjango
    plan: free
    runtime: python
    buildCommand: "./build.sh"
    startCommand: "gunicorn linuxondjango.wsgi:application"
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: linuxondjango-db
          property: connectionString
      - key: SECRET_KEY
        generateValue: true
      - key: WEB_CONCURRENCY
        value: 4
      - key: PYTHON_VERSION # 这里的 python version 是用来指定 Python 版本的,比如这里我用的是 3.11.4。
        value: 3.11.4

总结

Render 的教程总体来说没啥大问题,但是在一些小的点上,需要你自己简单 Hack 一下,比如需要自己升级一下 Poetry、设定 Python 版本。如果你也在用高版本的 Django & Render,希望这篇文章 可以帮到你。

如何解决 Kindle 在 M1 系列设备上无法访问的问题

如何解决 Kindle 在 M1 系列设备上无法访问的问题

问题

在使用 M1 的时候,我遇到一个很麻烦的问题是 M1 无法识别出我的 Kindle系统无法自动加载 M1 设备,这导致习惯于导入标注并使用 Klib 管理的我来说,等于用 Kindle 的功能不齐全了。

使用 macOS 自带的系统工具,也可以看到系统 Kindle 的磁盘,但无法加载。

磁盘工具的展示

如果使用磁盘工具尝试加载,也会报错 com.apple.DiskManagement.disenter错误-119930872

报错的提示

无法使用系统工具加载。

解决方案

在参考了 jakevin 的分享后,我使用如下方式来解决我的 Kindle 挂载问题。

查询外置设备

执行如下命令,可以使用系统自带的 diskutil 查看目前有哪些磁盘。我在这里补充了 grep,来筛选出只有外置磁盘的设备。

diskutil list | grep external -A2

手动挂载设备

执行如下命令,来手动挂载 Kindle。

sudo mkdir /Volumes/Kindle # 创建一个新的挂载点,挂载 Kindle
sudo mount -t msdos /dev/disk4 /Volumes/Kindle/ # 使用 mount 命令,挂载 /dev/disk4(你根据需要换成你自己的设备。)

一般来说, Kindle 的默认格式化是 fat32 格式,所以用上面的命令就行,但如果你的 Kindle 是 ex-fat 格式,则可以使用如下命令挂载。

sudo /sbin/mount_exfat /dev/disk4 /Volumes/Kindle/ #这里使用的是 mount_exfat。

如此操作,便可以让 M1 识别 Kindle 了。

给你的 console.log 添加一些特定的输出

给你的 console.log 添加一些特定的输出

在写 Node.js 代码时,常常会使用 console.log 来输出内容,以便于调试。但默认的 console.log 只能标准的输出,在很多需要上下文 debug 的时候,可能信息是不足的。除了使用 debugger 以外,你还可以试着改造 console.log

在你的 index.js 顶部添加如下代码,即可实现在使用 console.log 时自动在前面加上时间信息。当然,你也可以实现自己需要的上下文,比如当前的文件、当前的行数等。

console.log = (function() {
  var console_log = console.log;
  return function() {
    var args = [];
    args.push(`${new Date().toLocaleString()}` + ' -> ');
    for(var i = 0; i < arguments.length; i++) {
      args.push(arguments[i]);
    }
    console_log.apply(console, args);
  };
})();

这个函数的逻辑不复杂,对 console.log 进行了覆盖,写如了新的函数,并通过 arguments 将开发者传入的参数重新打印,以确保不丢失开发者传入的参数。

《哆啦A梦:大雄与天空的理想乡》观后感

《哆啦A梦:大雄与天空的理想乡》观后感

我看的动漫不多,哆啦 A 梦、火影、中华小当家。哆啦 A 梦出了大电影,也确实有空,就必然要去看看的。

以下内容包含剧透,如你尚未看此影片且准备去看,建议关掉当前页面,后续看完再回来看本文。

这部电影,如果说让我印象深刻的,大概是以下几点:

回环、价值观

回环

看完整部电影后,我觉得设计最巧妙的便是一开始的蓝色甲虫。在电影的开始,甲虫的出现显得略显无用,似乎也没有在推动剧情的发展。

然而当你看到最后,看到蓝色甲虫竟成了哆啦 A 梦重回人间的锚点,也就不得不感叹这个伏笔有意思,前面蓝色甲虫直奔大雄而去也就有了原因。

挺好。

价值观单一是问题

在普拉多普亚,所有人都是听从三贤人的安排,自然而然,也就要遵循三贤人的价值观。然而,当整个普拉多普亚都是三贤人的价值观的时候,任何违反三贤人的价值观的都成为了错误,甚至要被三贤人的价值观重新洗脑。

如果三贤人真的是贤人,倒也罢了。但三贤人并不是真正意义上的贤人,也不存在绝对意义上的贤人。所以,价值观单一成了问题。

多彩多元的价值观,才能让我们更加开心。

做自己

和上一条接近,如果说,放在自顶向下的角度来看,价值观单一是问题,那么自底向上的便是要做自己,这个自己,是遵从内心的自己,而不是别人告诉你的自己(当然,找到自己的内心是一件很难的事情)。

做自己,才能真正达到完美。如果不是做自己,不过是在和别人眼中的自己做磨合,终究是会磨合的血肉模糊的。

总结

总体来说,可以看,算是合家欢电影,带小朋友去看也没啥问题。不会出现一些奇奇怪怪的事情,影响小朋友的价值观。我这种老朋友,就是去怀念一下自己小时候的哆啦 A 梦罢了。

如何将 Zed 编辑器设置为你的命令行默认编辑器

如何将 Zed 编辑器设置为你的命令行默认编辑器

我最近在使用 Zed 作为我的主要编辑器,在编辑一些命令行文件时,也会使用 Zed 来编辑。但有些时候,一些应用程序的命令会自动调用默认的编辑器,这个时候会默认使用 nano 或者 vim ,而不是 Zed,体验略差。所以我希望将命令行默认的编辑器修改为 Zed 编辑器。

如果需要将 Zed 作为自己的命令行编辑器,首先需要确认 Zed 是否支持等待模式(wait model),在命令行中执行 zed --help,可以看到 Zed 是支持等待模式的。接下来就可以进行后续的步骤来进行测试了。

这里为是在写 Rails 时用到的,因此,我继续使用 rails credentials 来测试。执行如下命令来确认该命令是否可用。

EDITOR="zed --wait" rails credentials:edit

执行后,可以正常唤起,则说明整个链路已经通畅,接下来只需要将其配置在系统的默认环境变量里即可,将如下代码放在 .zshrc 中即可。

export EDITOR="zed --wait"

其他编辑器的命令参考

# Sublime Text
export EDITOR="subl --wait"
# VSCode
export EDITOR="code --wait"
天津车检记录

天津车检记录

买车记录里,我说过,我目前开的车是一辆 2017 年的雪铁龙 C3 XR,按照最新的汽车年检的规定,刚好满 6 年,需要进行年检,于是我又快速体验了一次年检。

如何进行年检?

年检有两种方式

  • 一种是前置预约的检查,可以在 12306 上预约(或者使用平安车主的代检服务),这种往往检查的速度比较快,虽然也要排队,但是排队的长度比较短,只有几辆车。
  • 另一种是直接去检测机构检查,就需要根据实际的情况来排队,运气不好的话,排队好几个小时是很正常的。

如果你要预约,直接在 12306 App 上找到【机动车检验预约】,就可以预约车辆的年检了。

在预约时,你需要选择时间和地点,并准备抵达现场进行预约检查。到达预约检测地点的时候,一定要问一下哪里是 12306 预约通道,不要和大量的未预约车辆一起排队!避免你预约了,但走的是常规排队通道,浪费时间。

通道里有个“12306预约检验通道”的标志来提醒

当你进入预约通道以后,会让你进行一个预检查登记,大概像下面这样,

填写完成以后,从后备箱拿出三脚架,放在前挡风玻璃处,开车排队,并将车辆开上检验通道,你的事情就做完了,接下来只需要把钥匙交给工作人员,工作人员会将你的车开上检验通道,进行检查。

此刻你只需要到办事大厅,缴费、拍照、等结果即可。汽车检查的速度很快,基本上我去交完费,等了 5 分钟,就已经完成检验,领钥匙走人了。

一些 Tips

  1. 年检的时候记得带上你的三脚架,检查的时候会用到。当然,更好的方案是把三脚架就放在后备箱里,别拿出来,避免用的时候没有。
  2. 记得提前预约,真的要好很多。
  3. 记得检查你的交强险状态,如果交强险时间较短,有可能会无法入库(但到底多短算短我也不知道),最好是保持2个月以上吧。

总结

汽车年检比我想象的要简单,之前我听别人讲,汽车年检都要耗费一天,甚至是需要找专人代为检查。一方面可能是因为他们的车辆较老,各项基础设施都已经出现故障,有可能因为故障的原因导致无法完成年检。另一方面,也可能是因为习惯了排队,而不是预约,导致车检的耗时比较长,所以也就不愿意自己去年检了。

Feed 订阅调整说明

Feed 订阅调整说明

本站一直以来,都开放了 Feed 的全文订阅,方便读者阅读,不过由于博客时间较长,文章越来越多,导致 Feed 越来越大,目前已经到达了 1.3 MB

较大的 Feed 文件会导致在进行新读者加载时耗费较多时间,因此,我将 Feed 输出的条目调整为 50 条,内容依旧保持全文开启,以方便使用 Feed 订阅的同学。

调整后,Feed 大小只有 64 KB,加载速度也更快。

如果你希望看到我所有的历史文章,可以直接访问本站的归档页面查看。