2024年5月26日星期日

Tex Shura

对于小红点我确实是真爱了。加了一个铝合金上盖。

蓝牙相比于 Shinobi 升级到了 5.0,希望可以省一些电,之前用 Shinobi 写东西的时候,两节爱老婆高容量版都只能撑不到一周的时间。

键帽虽然还是 ABS,但是变成双色了,摸上去手感好了很多。



这次没有用静音轴来组,而是洛可可R2轴。提前段落、稳定性不错,虽然我很讨厌键盘 HiFi 党但是这货的声音起码不让人讨厌。问题也很大,一个是灯的透光片会掉,虽然 Shura 并没有灯,但起码说明这个设计是有问题的。第二个就是国产轴常见的弹片品控问题,触发不灵敏的臭轴的比例高得离谱。Shura 这个布局用了 66 颗轴,光是触发有问题我就换下来 15 颗。



而且我并没有用游戏键盘的标准来要求,而是顶着蓝牙的延迟,在测试网页上按出来的。考虑到 Tex 家键盘一般都设置了比较高的 debounce time,这批轴里面恐怕能做到抖动时间 20ms 内的都几乎没有。Cherry 做得再矬,除了有段时间青轴臭轴以外,其他大部分时间品控尤其是弹片品质都是有保障的。不用说一包轴做到 20ms 以内的抖动,就算是 1ms 以内的要求,筛掉的比例也应该远远低于 15/66。

这个问题并没有看到有其他人提起来。大多数做测试的视频都是测声音,这让我觉得恶臭无比。天天烧键盘,结果就是烧佩列、烧铝坨坨、烧 gasket、烧麻将音石子音。线性轴整了几百种,而作为键盘最基本的输入功能压根就不管。

我认为作为输入工具,一块键盘应该满足如下要求:1)确认感。无论是段落感还是声音还是震动,总之要有个确认输入的反馈。这一点应该排除掉所有的线性轴,就连 Apple 都知道要做 Force Touch 之类的各种触觉反馈。2)轴心的稳定性。3)耐久。国产轴在轴心和外壳的品控都经常要好于 Cherry,但是唯独弹片的稳定性和耐久和 Cherry 比差距一直是比较大。


[update]

手感和声音反馈的角度来说,和屈蹲弹簧还挺像的,算是机械轴体里面比较独特的取向,也是我比较喜欢的那种。但是触发确实一个大问题,使用的时候还偶尔出现触发不良的情况,目前累计已经换掉了 20 个轴了……

MAC 键帽也到了


2024年5月25日星期六

Apple 给的内存真是吝啬

以前 Macbook Air 8GB 起步,现在 Macbook Pro 的低端型号也变成 8GB 起步了。总看到一些果粉为此辩护,讲真,我理解不了。macOS 对于内存的使用本来就大手大脚,8GB 除了看看爱优腾能干个啥?

我就开一堆网页查资料,用 TexStudio 和 Zotero 写点东西,还没正儿八经开发点啥或者跑点够分量的生产力工具,16GB 的 MBP 就经常是红色的:



当然,后来换了 64GB 的 Mac Studio 就比较正常了:



但无论如何,都和 8GB 够用这个结论不沾边。快 10 年前用的 Thinkpad W541 和 X230 都是 32GB,至此以后除了这台 MBP 就没有用过 32GB 以下的机器,结果都 2024 年了,还有厂商卖 8GB 的笔记本,还有人辩护,也算是奇观了。

arXiv 上传 latex 文件压缩包

用 latex 写论文的时候经常会把引用文献、图片和不同版本的 tex 文件放到一个文件夹下面,而编译 latex 的时候还会生成一堆临时文件。arXiv 上传的时候需要清理不需要的文件,手动做这件事还是比较蛋疼,所以写了一个脚本,编译指定的 tex 文件,并且把使用到的所有文件打包到一个 zip 里面。提交给 arXiv 的时候可以直接提交这个 zip。

import os
import shutil
import subprocess
import re
import zipfile
import shlex

def run_pdflatex(input_tex, times=1):
    for _ in range(times):
        escaped_base_name = shlex.quote(input_tex)
        command = f"pdflatex -recorder -synctex=1 -interaction=nonstopmode {escaped_base_name}"
        subprocess.run(command, shell=True, check=True)

def run_bibtex(base_name):
    escaped_base_name = shlex.quote(base_name)
    command = f"bibtex {escaped_base_name}"
    subprocess.run(command, shell=True, check=True)

def parse_fls_file(fls_file, current_folder):
    used_files = set()
    with open(fls_file, 'r') as file:
        for line in file:
            if line.startswith('INPUT '):
                filename = line[len('INPUT '):].strip()
                # Normalize paths for comparison
                if os.path.isfile(filename):
                    abs_filename = os.path.abspath(filename)
                    if abs_filename.startswith(current_folder) and not re.search(r'\.aux$|\.log$|\.out$|\.toc$', filename):
                        used_files.add(filename)
    return used_files

def create_zip(used_files, zip_filename):
    with zipfile.ZipFile(zip_filename, 'w') as zipf:
        for file in used_files:
            zipf.write(file, os.path.basename(file))

def main(input_tex):
    base_name = os.path.splitext(input_tex)[0]
    fls_file = base_name + '.fls'
    zip_filename = base_name + '.zip'

    # Initial run of pdflatex to generate .aux file
    run_pdflatex(input_tex)

    # Run bibtex to generate .bbl file
    run_bibtex(base_name)

    # Run pdflatex multiple times to ensure references are updated
    run_pdflatex(input_tex, times=2)

    # Read the PWD from the .fls file to determine the current folder
    with open(fls_file, 'r') as file:
        for line in file:
            if line.startswith('PWD '):
                current_folder = line[len('PWD '):].strip()
                break

    # Parse the .fls file to get all used input files
    used_files = parse_fls_file(fls_file, current_folder)
    
    # Ensure .bbl file is included
    bbl_file = base_name + '.bbl'
    if os.path.isfile(bbl_file):
        used_files.add(bbl_file)

    # Create a zip file with all used files
    create_zip(used_files, zip_filename)

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 2:
        print("Usage: python script.py <input.tex>")
        sys.exit(1)
    input_tex = sys.argv[1]
    main(input_tex)

使用方法:

python3 script.py <input>.tex

默认用的编译器是 pdflatex 和 bibtex,如果编译器不同可以自己改。

2024年5月14日星期二

Google 真的挺王八蛋的

老老实实写博客、不给钱、不做垃圾内容农场是吧?那你的索引就等着慢慢被踢掉吧。