2025-08-22 19:44:59
不知道哪个天才领导想到的主意,让办公室人员轮流去车间打螺丝。美其名曰,了解公司的产品。tnnd,这样的学习机会怎么没有让领导去。这让我想起马云爸爸的一句话
如果拜佛有用,你恐怕连庙门都进不去。如果种地能挣钱,那么农民将无地可种。如果勤劳能致富,即使出去挑个大便💩,你也得请客送礼找关系。如果献血有利于健康,你排一辈子队也轮不到你。如果吃亏是福,那么很多人早就福如东海。
这里我要加一句,如果打螺丝能了解公司产品,那么印度富士康将会有几百万个产品经理🤔。
今天下午我就早早去了车间,进去之前我都不知道自己要干啥,连个 sop 流程操作说明都没有。穿上防护服,带上口罩,进入无尘车间。我被分配一把剪刀✂️,原来我的历史使命是把气体传感器上的导电金属线剪断😂😂😂
这份工作简单粗暴,岗前培训一共五秒钟,我的师傅用了一秒钟给我演示怎么用剪刀,另外四秒我用来沉默。
还好我天资过人,不到十分钟我就摸索出了,一剪刀剪三个金属线的秘籍。从此一发不可收拾,从一点一直剪到了下午五点。他们下午三点半的下午茶时间,我都没有休息。主要是为了早干完,早提桶🪣跑路。其实也是因为防护服不好脱,我怕出去没有权限进不来车间,到时候还得找工头帮忙。多一事不如少一事。加上防护服很热,体液都通过流汗排出去了,也没有上厕所的需求。
我一开始站着剪剪剪,后来感觉还是不舒服,又坐着剪,如此反复,倒是挺 happy。确实比坐在电脑前敲代码舒服一点。关键是不用动脑子,不用试图去了解那些脑残的软件需求,也不需要和人沟通,更不需要跟 ai 解释我要开发什么功能,我唯一需要的就是挥舞我的剪刀,剪剪剪!人剪合一!
感觉比玩 switch 游戏更有成就感,一下午剪了两大塑料筐传感器,我也没有跟旁边的工友说一句话,因为这会影响我出刀的速度!这可比我最近从日本买的哈迪斯游戏快乐多了。哈迪斯只能靠不断挂逼强化自己和武器,而我和我的剪刀一开始就是满级😎
本质上都是割草类的游戏,别提肉鸽这么抽象的名字,剪传感器乐趣更多一些😁而且能让你变得更强。
为了专心修炼,我提前跟下午可能找我的人说明了下午有事,有事晚上处理。也确实手机比较清静下午。只有七牛云的一通电话打扰了我的修行,我以为我的 cdn 又被刷流量欠费了。没想到是七牛云的一个回访,大意是愿意承担我被刷流量的费用,但是要把我之前发的文章 网站七牛 CDN 流量被刷,差点破产 删除。被我婉拒了,一我没有主动要求过费用承担,毕竟也没多少,二我申请cdn的主要目的就是写博客存图片用,我连自由表达的权利都没有了的话,我 cdn 也没必要用了。接完电话,继续剪刀飞扬。
下午五点,所有传感器被我剪完,通关✅✅✅。我便消失在了园区之中,只留下残留我体温的防护服在更衣室摇曳
2025-08-21 16:36:53
在开发公司内部的人事系统,需要新增一个办理入职功能。用于给新入职人员录入基本个人信息,教育经历,工作经历等信息。 同时可以实现一同编辑功能,即 HR 人事只需要录入姓名身份证号,其他个人信息由新入职人员自行填写。(此时新员工还没有内部系统的账号) 即新员工打开一个链接,就能直接编辑个人信息。其他的岗位信息由 HR 人员可以同步编辑。互不影响。
操作流程:
2025-08-19 09:39:15
昨天搞定了 CMYK 图片模式的问题,参考前文 CMYK 印刷展板图片批量生成,Python 程序踩坑记。发现生成的图片文件过大,跟示例图片差了快 3 倍,完全无法接受。 而且图片的 DPI 分辨率也不对,导致打印出来的展板宽高与预期不符。所以将 Python 生成图片的代码又调整了一下参数。
save_kwargs = {
"format": "JPEG",
"quality": 80,
"optimize": True,
"dpi": (150, 150)
}
if icc_profile:
save_kwargs["icc_profile"] = icc_profile
output_img.save(output_path, **save_kwargs)
默认质量 100 生成的图片大小很大, 33M 大小。而从设计那边拿到的示例 JPG 图片只有 13M 大小。 而且肉眼看不出差异。所以,我想能不能设置一个压缩参数来减少图片的大小。
设置之后,生成的图片大小变成了 12M。
由于生成的图片需要送去打印店打印,所以除了宽高的像素数需要按照需求来,同时分辨率也需要一致,才能保证打印出来的展板实际宽度和高度跟预期一致。
从 PhotoShop 中查看图片参数,可以看到:
分辨率是 150,单位为 DPI(每英寸点数,即像素/英寸)。DPI 的英文全称是 Dots Per Inch。DPI 越高,图片越清晰。
而我用 Python 生成的图片默认分辨率是 70 DPI。会导致实际打印出来的展板宽高与需求不符。
解决方法就是在 Save 时,指定 dpi 参数:
"dpi": (150, 150)
为何是两个参数呢?分别表示图片的 水平 DPI(X 方向) 和 垂直 DPI(Y 方向)。
A tuple of two numbers corresponding to the desired dpi in each direction.
设置之后实际宽高就没问题了。之前从没搞过印刷体的图片,以为跟网上图片一样设置好像素宽度就可以了。 没用的知识又增加了 😮💨。
.local/lib/python3.8/site-packages/PIL/Image.py:3176: DecompressionBombWarning: Image size (113886180 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.
warnings.warn(
2025-08-18 18:54:09
公司要打印一批展板,要求生成的图片是 CMYK 模式的图片。但是我用 Golang 搞了半天也无法生成跟设计稿颜色一致的图片, 对比发现生成都是 RGBA 模式的图片,颜色不对。最终使用 Python 的 Pillow 库轻松搞定。折腾了一下午,记录一下心路历程 。
主要用途: 印刷。专门为使用物理油墨在纸张等介质上复制颜色而设计。设计传单、海报、杂志、包装、画册等需要印刷的物料时,最终输出文件 必须是 CMYK 模式 。
而 RGBA 则用于显示屏。
设计的同事用的是 Mac,有几百个 PDF 文件,需要转换成图片,然后再通过程序批量生成展板图片。
没想到用 Mac OS 系统自带的自动工具,可以轻松地实现 PDF 文件批量转 CMYK 的 JPG 图片。 准备用 golang 内置的图片库继续下一步的处理。
发现 golang 的 image 虽然支持 NewCMYK,但是在 Encode 时,却不支持 CMYK 模式。
outputImg := image.NewCMYK(bgBounds)
从文档看 Decode 是支持 CMYK 模式的。
无奈找了半天也没有找到方案,我放弃了,决定试试 Python 的 PIL 库。
首先需要安装 Pillow 库:
pip install pillow
然后,参考下面的使用方式读取 CMYK 图片,并保存。
from PIL import Image, ImageDraw, ImageFont
# 保留原始图片的ICC配置文件
bg_img = Image.open(background_path) # 原图是 CMYK 模式的图片
icc_profile = bg_img.info.get('icc_profile') # 获取ICC配置文件
# 各种处理,省略步骤 ...
# 保存时保留ICC配置文件
save_kwargs = {"format": "JPEG", "quality": 100}
if icc_profile:
save_kwargs["icc_profile"] = icc_profile
output_img.save(output_path, **save_kwargs)
ICC 配置文件包含了颜色空间的信息,确保在不同设备上显示或打印时颜色的一致性。如果不保留ICC配置文件,可能会导致颜色失真或不准确。
一开始,我让 GPT 4.1 根据 golang 的实现重写了一版 Python 的处理程序,但是打开一个 cmyk 模式的图片,作为背景,不进行任何处理,保存之后,存储的图片颜色跟原始的背景颜色不同。下面图片有两组对比颜色,上面一组是使用 ICC 配置文件前生成的图片,下面一组是保留 ICC 配置文件后生成的图片。
让 Claude Sonnet 4 分析了一下,才找到问题:
修改成上面的代码后,存储的图片颜色跟原始的背景颜色一致了。
除了特定专业领域外,嵌入ICC通常只是可选操作。但为了色彩准确性,推荐在出版印刷等场景主动嵌入配置文件。
2025-08-17 10:03:39
感觉每年都要维护一下 Google Play 应用商店里的 Android App 目标 API 级别。这不,最近又收到了 Google Play Console 的更新提醒:
不更新 目标 API 级别,Android 16 的用户就不能下载 App。之前 2023 年处理过一次,参考:
恰好看到一篇 React Native 0.81 新版本的发布文章,里面也提到将支持 Android 16(API 级别 36)。
看来就是 36 了。
Android Studio Narwhal | 2025.1.1 Patch 1
Build #AI-251.25410.109.2511.13752376, built on July 9, 2025
Runtime version: 21.0.6+-13391695-b895.109 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
最好修改时,使用记事本修改下面的配置文件,或者 VSCode 修改。
如果直接打开 Android Studio 修改,这些历史项目会先拉取一堆没有用的依赖,浪费时间。不如一次性通过记事本修改完后,再打开 Android Studio。
Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-8.0-bin.zip'. Reason: java.net.SocketTimeoutException: Read timed out
参考:
替换 gradle\wrapper\gradle-wrapper.properties 中的 gradle 下载链接为国内腾讯云的链接:
#distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip # 注释掉
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.13-bin.zip
注意,需要同时升级 gradle 的版本,否则会报错:
Your build is currently configured to use incompatible Java 21.0.6 and Gradle 8.0. Cannot sync the project.
We recommend upgrading to Gradle version 9.0-milestone-1.
The minimum compatible Gradle version is 8.5.
The maximum compatible Gradle JVM version is 19.
Possible solutions:
- Upgrade to Gradle 9.0-milestone-1 and re-sync
- Upgrade to Gradle 8.5 and re-sync
Build file 'build.gradle' line: 10
Plugin [id: 'com.android.application', version: '8.0.1', apply: false] was not found in any of the following sources:
解决方法参考:
Android Studio 2025 新版本踩大坑, Plugin com.android.application was not found
更新项目的 build.gradle 文件。在项目的 build.gradle 文件中,找到 targetSdkVersion 属性并将其设置为要升级到的目标 API 级别。例如,要将目标 API 级别升级到 33,您需要将 targetSdkVersion 设置为 33。
需求修改的地方:
compileSdk 36
targetSdk 36
不要忘了修改 versionCode 和 versionName
在本机测试时,编译报错:
aapt2.exe E 08-16 20:09:34 5448 11028 LoadedArsc.cpp:94] RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data.
aapt2.exe E 08-16 20:09:34 5448 11028 ApkAssets.cpp:152] Failed to load resources table in APK 'D:\android_sdk\platforms\android-36\android.jar'.
error: failed to load include path D:\android_sdk\platforms\android-36\android.jar.
https://github.com/flutter/flutter/issues/153893
Also re the error this issue is about, if you need immediate unblocking you can either bump your AGP version to 8.1.0 or higher (in the plugins block of
点击右下角的 Android Studio AGP 升级提示,会自动修改 build.gradle 中的版本:
id 'com.android.application' version '8.11.1' apply false
id 'com.android.library' version '8.11.1' apply false
注意,使用国内源 新版本 Android Studio settings.gradle 中切换国内源
解决这个问题,参考:
Unknown Kotlin JVM target: 21, Android Studio 2025
一个好多年不升级的项目,报错:
Cannot use @TaskAction annotation on method AbstractKotlinCompile.execute() because interface org.gradle.api.tasks.incremental.IncrementalTaskInputs is not a valid parameter to an action method.
在 build.gradle 中将 kotlin 版本升级到 1.9.0
ext.kotlin_version = "1.9.0"
2025-08-17 09:54:11
新安装的 Android Studio Narwhal | 2025.1.1 Patch 1 又是一堆问题。
编译时,报错:
Execution failed for task ':app:kaptGenerateStubsDebugKotlin'.
> Error while evaluating property 'compilerOptions.jvmTarget' of task ':app:kaptGenerateStubsDebugKotlin'.
> Failed to calculate the value of property 'jvmTarget'.
> Unknown Kotlin JVM target: 21
这个项目使用是是 Kotlin 1.8,而 1.8 支持的最高 jvmTarget 版本是 17.
Current Kotlin Support: As of Kotlin 1.8 and 1.9, the maximum officially supported jvmTarget is 17.
即便 build.gradle 中指定了 JavaVersion.VERSION_17 和 jvmTarget = '17',都没有用,依旧报错:
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
Settings -> Build, Execution, Deployment -> Build Tools -> Gradle.
"Gradle JDK" 选择 "corretto-17 Amazon Corretto 17.0.13"
实际,我选择的是微软那个 JDK 17。然后就搞定了 👌
(而选择 JetBrains 那个 17 还是会报上面那个错。)
https://stackoverflow.com/questions/78970867/error-appkaptgeneratestubsdebugkotlin-and-unknown-kotlin-jvm-target-21-after