Reading view

There are new articles available, click to refresh the page.

被时间拉长的人

丢了一批人物标签给 AI 写人物小传,让它模仿某位小说家的笔法,来给演员交代角色。

你觉得这像谁的手笔?

————

南方的空气里常常有潮湿的味道,像是雨下过以后残留的影子,久久不散。城市白天拥挤喧嚣,夜晚却显得空旷,好像光亮突然被抽走,留下无数未完的句子。在这样的环境里,一个男人行走。他的脚步从不急躁,像对时间有着自己的节奏感,和别人不太一样。

年少的时候,他把自己交给了工业设计。形状、光影、比例,这些东西比人群更让他安心。六年在公司,十年在创业,那些日子像一张张被翻阅过的旧画册,色彩褪去了,但线条还在。产品的生与死,像车站里人群的来去。大多数人只看见成功或失败,他却更在意其中被忽略的细节。

别人眼中的他冷静得过分,总是习惯提前几步想好方向,就像棋局上的布局。但在那层冷静的外壳下,常常闪现一些不合逻辑的柔软时刻。比如一段旋律,随便一盏灯的影子,甚至一个不经意的眼神,足以让他停下手里的笔。理性和浪漫在心里不停打架,谁也没有赢过谁。

他知道自己带着黑暗生活。抑郁的日子像一条看不见的走廊,没有尽头。他学会了靠药物维持稳定,像有人随身带着一块怀表,偶尔瞥一眼,提醒自己仍然存在。那段经历让他对痛苦格外敏感,也让他在与人相处时多了一层隐秘的温柔。他不会轻易表现出来,但在内心深处,对别人的脆弱始终心知肚明。

夜晚经常独自坐在桌前,电脑屏幕的光照在脸上,桌上散落着草图和未完成的文字。那些想法有时像城市里的霓虹一样闪烁不定,无法全部抓住。他清楚其中大部分不会被记住,就像梦醒时遗落的片段。但仍旧一遍一遍画下去,像一种执念,也像是一种呼吸。

在喧闹的城市里,他习惯保持慢半拍的步伐。人群汹涌,他的节奏却像潜水时的心跳,缓慢、克制,不慌不忙。他看似与周围保持着距离,其实心里始终怀有一种模糊的渴望——不是要成为谁,也不是要得到什么,而是想在梦与现实之间找到某种入口。梦与梦之间,总有裂缝。裂缝里偶尔透进光。

对很多人来说,他是个不好接近的人。但真正靠近以后会发现,那些冷漠与安静只是表层,像水面下覆盖着的冰。深处的水仍然温热,流动着。理性、浪漫、痛苦和温柔同时存在,没有谁能完全把它们分开。

这样的人物,像一个在现实里造梦的旅人。他的路从不喧哗,却留下清晰的痕迹。

(*正文及标题均由 AI 完成)

我用 ChatGPT 和 Midjourney 剪掉了蓄满四年的长发

这是我蓄满了四年的长发,原本是打算捐给金丝带的,但我决定放弃了。

一来,捐赠的人太多了,不缺我这一个,它不需要我;

二是,这个活动太热门了,报不上名,我不喜欢凑热闹;

于是,我心里很快就决定了:剪掉,并且要烫卷、染发!

在音乐教室里,筱烨、阿吉和秋秋在上课,我就在旁边用 ChatGPT 写 Prompt,写完之后就丢给 Midjourney 去生成效果图。遇到不满意的,就丢两张我以前的半长发的照片上去,再调整 Prompt 的细节,接着画。

最后,我把这张效果图发给发型师:

虽然这脸型偏硬了,不怎么像我,但这个头发感觉是我想要的。

曲线、松软、紫色挂耳

确定方案之后就直接约时间,一方面要约发型师的时间,他很好约,就在楼下,我随时过去随时可以做;但另一方面,要约收头发的师傅过来,需要由他根据长度把我的头发抽出来。这也是我第一次卖头发,挺新鲜的体验。

首先,我要跟发型师和收头发的师傅一起商量,怎么剪、剪多少、剪到哪里、用什么方法剪。我原本以为就是咔嚓一刀剪了,但其实不是。整个过程里,这位师傅需要非常仔细地把我头发中最长的部份找出来,每次只挑选一小撮,然后用剃刀在距离头皮大约 8-10cm 的位置一点点把头发切断。这样做的目的是,即确保剪下来的头发是满足他收头发的需求,也能确保给发型师留有后续足够的操作空间,还得让头发之间的层次能自然地衔接上。

每次剪下一小撮头发后,他都会仔仔细细地把头发梳几遍,确保没有任何打结,然后放在准备好的毛巾上,平放着。剪之前还特意要把周围的风扇都关掉,万一吹乱了,这些头发都全都没用了。他就这么一遍一遍地重复捏一小撮、切下来、梳顺、平放,如此反复了半个多小时,才终于从我头上抽出来两把共 59g 的长发。

然后就是烫卷和染发。

之所以想这样折腾一下,多少有一点破罐子破摔的心态在,觉得既然这头长发不被需要了,那也就放过自己,不要再被「这件事」困住了,索性趁着这个机会来尝试一下之前没折腾过的事情!

其实我 17 年前也染过一次发,但那时候是因为演《暗恋桃花源》的老导演,为了贴近角色的年龄感,我就去染了一头白发。只不过那个白发染得不成功,黄黄的,加上那会儿我比较消瘦,自己觉得不好看,所以演出结束的第二天我就去剃光头了。所以那次严格来说我不觉得是一次正经的染发体验,毕竟没有顶着这头黄毛生活,勉强能算一次临时的体验。

我当然知道它会掉色,会变成黄毛,会干、会毛躁。

但这不重要,因为我就想试一试。

我紧绷了三十多年,现在崩断了,还不能讨好一下自己,玩一玩吗?玩!

不仅要玩,还要玩得不一样,用 AI 一起玩!

为什么是紫色?因为我喜欢!

虽然我也喜欢绿色,但我也不想染成绿色 😂

朋友说像杨千嬅,像极速拍档的小乔,那也挺好。

最近两周我忽然意识到,我是会因为自己感觉到快乐而感到羞耻的。这是从小根深蒂固的想法。过去我知道,如果我遇到一件好事,一件开心的事,就会有一个声音在警告自己不要乐,不要得意,不要喜形于色,要收起来,不然马上就会招来不幸和倒霉。但我一直认为这是克制和谨慎,是对于能量守恒定律的迷信式的执念,觉得这会儿开心了以后就没有了。

可是,为什么要把开心攒到以后呢?有没有以后都不知道。

筱烨说我的动力来自恐惧,确实,我总有各种恐惧在周围,挥之不去。

但现在我看见它了!我要让我的快乐活过来!我不要快乐羞耻!

尽管我现在还没有什么活力,但起码这个紫色能令我舒服好一阵子!

最后再看一眼,这头蓄了四年的长发和发髻。

我很喜欢这根石纹簪,但我感觉我应该不会再束成这个样子了。

这天色真好。

ChatGPT on macOS客户端app正式面向所有用户开放

OpenAI宣布了适用于 macOS 的 ChatGPT 客户端app正式面向所有用户开放。该应用专为 macOS 系统设计,支持快捷键呼出和多种内容形式的交互。目前仅适用于配备 Apple Silicon(M1 或更高版本)的 macOS 14+,但计划在今年晚些时候登陆 Windows。

ChatGPT on macOS客户端app正式面向所有用户开放最先出现在Justin写字的地方

如何使用 Proxifier 来进行流量代理控制

Proxifier 是一款网络工具软件,可以帮助用户通过代理服务器进行网络访问,实现匿名化、翻墙、加速等功能。支持多种代理协议,规则管理,流量监控和日志记录等功能,提高网络连接的灵活性和智能化。注意 Proxifier 本身并不是一个代理软件,也不是一个 VPN 软件,其作用是控制其他其他软件访问代理的方式。

上一篇文章我提到了可以试用 Proxifier 来解决通过 Shadowsocks 代理访问呢 ChatGPT 频繁出现 Something Went Wrong 的问题,在本文中我们来展开讲一下具体的做法。

1 准备工作

1.1 软件下载

Proxifier 的官方网站是 https://www.proxifier.com/,其正版价格较贵,约 40 美元。不过,较早的 2.x 版本存在破解版。读者可以根据自己的经济状况来选择。

1.2 代理准备

如同开头提到,Proxifer 本身不是一个代理程序,读者应该自己提前准备好代理。这些代理中,无论是 Shadowsocks、V2Ray 还是其他常见的代理程序,都会在客户端本地重建一个 Socks5 代理,这一般都可以在代理客户端程序的配置或者服务器设置中看到。下图给出的是 Shadowsocks-NG 客户端在 macOS 中的系统配置,可以看到程序在本地 (localhost) 的 1086 端口创建了一个 Socks5 代理。

这个代理会被进一步转成 http 代理,从而被浏览器使用,这个转换过程是导致 ChatGPT 链接不稳定的元凶。接下来我们要使用 Proxifier 让 ChatGPT 直接使用 Socks5 代理。

2 设置 Proxifier

2.1 添加代理

我们以知乎上这篇文章为范本简要讲一下设置过程。首先我们需要将现有代理软件提供的 Socks5 服务告知 Proxifier,这通过添加代理服务器实现。

注意一般各种代理软件在本地创建的代理都是无需验证的,我们可以取消验证启用。输入设置之后,可以点击检查确认设置是否正确。

3 设置规则

为了让 ChatGPT 的访问能够通过 Proxifier 访问代理,我们需要配置 Proxifier 的代理规则。

添加代理规则的页面如下:

我们有两种方法引导 ChatGPT 的网络访问:

  1. 我们可以选择下载 ChatGPT Desktop 客户端,然后通过代理规则中应用程序过滤规则找到 ChatGPT 程序,然后让目标主机为空(这意味着所有的目标主机都会服从本规则);
  2. 将应用程序部分置空,然后在目标主机中填入 ChatGPT 访问的域名。经过我的试验发现,填入 chat.openai.com; challenges.cloudflare.com; *.openai.com; 即可。

事实上,因为 Proxifier 能够全局性地处理所有网络访问,因此,第二种方法对于使用 ChatGPT Desktop 的用户来说同样有效。下图是完整代理规则。

至此我们就完成了设置,你可能需要重启浏览器才能能让 Proxifier 成功地引导 ChatGPT 的流量。

使用 Shadowsocks 访问 ChatGPT 频繁出现 Something Went Wrong 问题的解决方法

update at 2023.4.27:

Github 上有人做了一个开源的油猴脚本 KeepChatGPT 可以解决这个问题。在浏览器上这个脚本可以正常使用,但是注入到客户端时(尽管内部仍然是一个浏览器)会出现错误。

update at 2023.4.12:

在 Windows 上这套方法存在一定的问题。可能的原因是 Proxifier 的代理权限有时候会被 Shadowsocks 客户端,也就是 Privoxy 争抢。

由于国情原因我们使用使用 ChatGPT 需要使用各种形式的代理,这时我们肯能会发现在与 ChatGPT 对话的过程中可能会出现下面的错误:

Something went wrong. If this issue presists please contact us through our help center at help.openai.com

这种错误一般在我们再让网页空闲一段时间(通常是一分钟)后再次提问时出现。当然,去 OpenAI 的帮助中心是不会搜到什么有用的信息的。如果你去检索这个问题,你能得到的最好答案是在出现这个页面之后刷新页面,然后回到对话窗口继续对话即可。但是刷新后如果再次出现空闲窗口的情况,这个问题会反复出现,因此你在对话中就不得不反复地刷新页面,再加上每次页面重载你都需要去勾选 Cloudflare 的机器人验证框,这就会极大程度上拖慢我们的速度,影响产品体验。

这个问题是否可能是由于我翻墙访问导致的呢?我使用的翻墙软件是 Shadowsocks,经过一番搜索,一个 Github Issue 的讨论给了我灵感。

讨论地址:https://github.com/shadowsocks/shadowsocks-libev/issues/2149

尽管讨论的题目和 ChatGPT 没有直接关系,但是这个回复提到,Shadowsocks 在构建代理管道时,会在客户端使用 Privoxy 来讲 Socks5 代理转换成 http 代理,进而被浏览器使用。Privoxy 的配置中包含了 Socket 连接时长方面的控制。于是我查看了我本地的 Shadowsocks 使用的 Privoxy 的配置文件,这个文件在 MacOS 中位于 /Users/lena/Library/Application Support/ShadowsocksX-NG/privoxy.config 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
toggle  1
enable-remote-toggle 1
enable-remote-http-toggle 1
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
forwarded-connect-retries 0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
socket-timeout 60

forward 192.168.*.*/ .
forward 10.*.*.*/ .
forward 127.*.*.*/ .
forward [FE80::/64] .
forward [::1] .
forward [FD00::/8] .
forward-socks5 / 127.0.0.1:1086 .

# Put user privoxy config line in this file.
# Ref: https://www.privoxy.org/user-manual/index.html

可以看到 keep-alive-timeoutsocket-timeout 这两个选项设定的超时时间都比较低。我做了下面两个尝试:

  1. 将这两个设置调高,并重启 Shadowsocks,但随后发现 Privoxy 重置了设置文件;
  2. 我手动 kill 掉正在运行的 Privoxy 并且手动使用更新后的 config 文件调起一个新的进程,但是仍然没有解决 Something went wrong 的问题;

至此,我也不想和 Privoxy 纠缠下去,既然问题出在 Socks5 代理转 Http 代理的环节,我们可以使用 Proxifier 这个软件直接使用 Shadowsocks 提供的 Socks5 代理,就可以很好地解决这个问题。

Proxifier 的教程网上非常多,我就不在这篇文章里赘述了。

Proxifier 的使用参加我的文章:如何使用 Proxifier 来进行流量代理控制

在外置硬盘上,加密安装 ubuntu

需求:

  1. 在便携硬盘盒(M.2 SATA/NVME)安装 Linux(Ubuntu/Zorin),以便在不同的电脑上都可以启动使用。
  2. root 级别的系统分区加密(使用 LUKS & LVM)。
  3. 不要把整块硬盘都加密,而是在硬盘上保留一个未加密分区。这样也可以作为普通的移动硬盘使用。

——这篇攻略和是否外置硬盘盒,没多大关系。普通内置硬盘也可以这样加密安装。

最新的 Ubuntu 22.04 之后的版本,在安装界面里自带了 LVM 全盘加密安装的选项。但是并不能满足第 3 条需求。所以还需要一些复杂的手动操作。

安装过程尽量围绕 ubuntu 的图形安装界面,对新人友好。参考并验证了这篇教程。但原文连同 /boot 引导分区也一起加密了,于是在配置上略显繁琐。我觉得加密 /boot 并不是很有必要,做了一些改动。最终的硬盘分区结构为(以 512GB 硬盘为例):

  • 大约 800MB,EFI 引导分区
  • 大约 300GB,LUKS 加密分区。在其中配置 LVM 逻辑分区:
    • 2GB,swap 交换分区
    • 大约 300GB,Ubuntu 系统分区 root /
  • 大约 200GB,普通移动硬盘分区

操作步骤:

下载 Ubuntu,制作 USB 安装盘(过程略)。——然后,强烈建议在整个安装过程之前,在电脑的 BIOS 里,把内置的其它硬盘暂时卸载。

插上移动硬盘和 USB 启动盘。从 U 盘启动电脑,选择 Try Ubuntu。最新的 Ubuntu 22.04 安装程序里,已经内置了所需的 cryptsetup 和 cryptsetup-initramfs 软件包。因此,整个安装过程中,应该不需要连接互联网。

首先,把硬盘预分区。分区软件有很多种,可以用原文的 sgdidk,也可以直接用图形界面下的 Disk 或者 Gparted。在硬盘上创建 GPT 分区表,然后分成:

  • 大约 800MB,EFI 引导分区
  • 大约 300GB,要加密的系统分区
  • 余下的约 200GB 移动硬盘

这些分区都先不用格式化。记住第二个分区的名字,本文假定为 /dev/sda2。

分区成功后,关闭分区软件,打开 Terminal 命令界面,执行 root 权限

sudo -i

将系统分区加密。按提示输入密码,——这个密码,就是以后每次启动时,挂在硬盘用的密码。和安装 Ubuntu 时的用户密码,并不是一回事。

cryptsetup luksFormat --type=luks1 /dev/sda2

解锁刚刚加密的分区:

cryptsetup open /dev/sda2 hd2_crypt

创建逻辑卷组(LVM),然后在其中创建 2GB 的 swap 交换分区,再把剩余的空间创建为系统分区(这两个分区的大小,大家自行调整):

pvcreate /dev/mapper/hd2_crypt

vgcreate ubuntu--vg /dev/mapper/hd2_crypt

lvcreate -L 2G -n swap_1 ubuntu--vg

lvcreate -l 100%FREE -n root ubuntu--vg

然后,运行桌面上的 Ubuntu 安装程序(Terminal 先不要关),在磁盘分区页面,选择 Something else,进行手动分区。

  • 把 /dev/mapper/ubuntu—-vg-root 格式化成 ext4,挂载为系统根目录 /
  • 把 /dev/mapper/ubuntu—-vg-swap_1 设为 swap 交换分区
  • 把 /dev/sda1 设为 EFI 引导分区

点击 Install Now,确认对分区的设置。注意,到了下一步创建用户的界面时,先不要继续。切换回 Terminal 命令行界面,正式安装前,在 GRUB 中启用加密(能看懂下面这些命令的话,也可以直接去编辑相应的文件):

while [ ! -d /target/etc/default/grub.d ]; do sleep 1; done; echo "GRUB_ENABLE_CRYPTODISK=y" > /target/etc/default/grub.d/local.cfg

然后回到创建用户的页面,点击继续,开始安装系统。安装结束后,先不要 restart。而是点击 Continue Testing。

回到 Terminal 命令行界面,chroot 到新装的系统:

mount /dev/mapper/ubuntu----vg-root /target

for n in proc sys dev etc/resolv.conf; do mount --rbind /$n /target/$n; done

chroot /target

mount -a

原文说此时需要(联网)安装 apt install cryptsetup-initramfs;但我用的 ubuntu 安装程序已经自带了,并不需要联网安装软件包。

添加密钥文件相关设置:

echo "KEYFILE_PATTERN=/etc/luks/*.keyfile" >> /etc/cryptsetup-initramfs/conf-hook

echo "UMASK=0077" >> /etc/initramfs-tools/initramfs.conf

创建密钥文件并将其添加到 LUKS

mkdir /etc/luks

dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=512 count=1

chmod u=rx,go-rwx /etc/luks

chmod u=r,go-rwx /etc/luks/boot_os.keyfile

将密钥添加到 boot_os.file 和 Crypttab

cryptsetup luksAddKey /dev/sda2 /etc/luks/boot_os.keyfile

echo "hd2_crypt UUID=$(blkid -s UUID -o value /dev/sda2) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab

更新 Initialramfs 内核映像

update-initramfs -u -k all

此时全部结束。可以重启系统啦。


关于这个硬盘密码:

  • 是用来防止,别人拿到这块硬盘时,无法查看硬盘的文件;
  • 并不能防止,当你登入系统后,因为系统漏洞或操作失误,而造成的入侵;
  • 这个密码,如果忘记了,硬盘里的文件,就再也无法看到了!!(有添加 recovery 的操作,但我觉得没必要);
  • 每次开机启动时,都要输入一次这个密码。所以,虽然密码需要足够复杂,但最好选一个,自己能方便记住,日常使用的方式。

如何修改硬盘密码:

最简单的方式,是在已经启动的移动硬盘系统里,先通过 disk 等分区软件,确认加密分区的名字(这里假设仍然是 /dev/sda2,但实际上不一定了),打开 Terminal 界面,

sudo -i

cryptsetup luksChangeKey /dev/sda2

按照提示,输入旧密码,再输入两遍新密码。最后,更新 initramfs,

update-initramfs -u -k all

就可以了。

❌