我有一台2013的iMac，因为不能升级最新macos，而且用macos也慢所以就只安装了windows 11 今天想安装wsl的时候提示没有开启虚拟化，但查了一个这个cpu是支持虚拟化的 但是imac没有bios，设置不了，只能用第三方refind的引导程序来修改配置。 可是使用refind引导后发现win11启动不了，提示： Stop code:KMODE_EXCEPTION_NOT_HANDLED(0x1E) What failed: AppleMNT.sys 查了一个AppleMNT.sys作用是让Windows支持访问macos的文件系统，对我来说没用 解决办法是把 system32/drivers/AppleMNT.sys 文件改名后就可以正常启动系统，而且也支持虚拟化。 缺点是Windows中的bootcamp不能打开控制面板，不过无所谓，我只有windows，所以bootcamp没用。 还有安装refind有个简单的办法 ，通过geniusdisk访问efi分区复制文件，再通过它的“设置UEFI BIOS启动项” 修改启动文件 \EFI\refind\refind_x64.efi 这里注意，如果想还原的话改回 \EFI\Microsoft\Boot\bootmgfw.efi 既可。 还有如果是在命令行操作的话有个注意的点： 下面这个必须在cmd下运行命令，不要在powershell, 这两个有区别 bcdedit /set {bootmgr} path \EFI\refind\refind_x64.efi
Error in Antigravity - Not Generating Commit Message 解决办法
最近使用 Antigravity 自动生成Commit Message 会出错 Yup definitely broken… Error generating commit message: [unknown] error grabbing LLM response: stream error 很多人也有同样的问题，但官方都没修复。不知道是网络问题还是bug导致的。毕竟在国内都是魔法上网用的！ https://discuss.ai.google.dev/t/error-in-antigravity-not-generating-commit-message/114550/178 但这两天特别频繁，最后完全用不了了！ 手写Commit Message太麻烦，后来想到可以用 Workflows 解决，也是挻方便的！ Description Git Commit Content --- description: Automatically stage all changes and commit with a generated message --- 1. Stage all current changes in the repository. Run `git add .` 2. Generate a commit message following the Conventional Commits specification,written in Simplified Chinese. Ask: "Write a concise commit message summarizing the changes." 3. Create the commit using the generated message. Run `git commit -m "[generated commit message]"` 使用方法：在聊天窗口输入/后选择这个workflows既可！
背景 DJI无人机（如Phantom、Mavic、Spark或Inspire）在视频录制过程中意外关机可能导致视频文件损坏，无法播放。 用户手册建议：将Micro-SD卡放回相机，重启相机并等待约30秒以恢复视频文件。此方法有时有效，但有时文件仍损坏。 损坏文件类型 MP4格式损坏文件：文件开始有'ftyp'和'moov'原子，后跟'mdat'原子，但'mdat'包含新的'ftyp'、'moov'和'mdat'原子，形成有效的MP4视频文件。可通过跳过初始原子和'mdat'头部来修复。 原始H.264 NAL单元文件：文件不包含MP4格式数据，仅包含以4字节大小字段引导的原始H.264 NAL单元序列。修复后为".h264"格式，可能需要特定播放器播放。 尾部损坏的MP4文件：文件开始正常，但尾部数据可能不正确，导致文件未正确“完成”。修复后同样为".h264"格式。 免费修复工具 下载djifix Mac OS X： 下载"djifix"。 打开"Terminal"，使用命令 chmod +x djifix、./djifix 文件名运行程序。 Windows： 下载"djifix.exe"，移动到待修复文件同一文件夹。 打开"Cmd"，使用命令djifix 文件名运行程序。 常见问题解答（FAQ） 修复视频可能丢失最后几秒，特别是突然断电时。 修复文件后，如果文件以".h264"结尾，可能需要特定播放器播放。 如果修复文件无法播放，尝试重新运行"djifix"，选择不同的视频格式代码。 ".h264"文件可使用"ffmpeg"或"MiroVideoConverter"转换为".mp4"。 其他注意事项 如果视频文件很小（小于10MB），可能只包含极短的视频片段，修复价值不大。 命令示例 在Mac上运行：cd Movies、chmod +x djifix、./djifix 编译源代码：cc -O -o djifix djifix.c 使用ffmpeg转换：ffmpeg -i DJI_XYZW-repaired.h264 -c copy DJI_XYZW-repaired.mp4
目前最简单的方法是通过microG这个项目，然后就可以安装 Google Play Store 或者用aurora store 替代 版本更新 2025年4月 v0.3.7.250932 (只列出重点的更新): 修正了第三方登录Google的问题! (例如chatgpt可以用了!) 修复 HMS 地图相关问题 (应该解决了Google map的时候各种奇怪的问题) 初步支持人脸检测 API 其它:支持企业账号(需要手动在开启)等 如果你只是为了安装facebook,google play,google map，正常收到消息通知,不使用googlepay等服务，那么microG这个方案是非常完美！ 先介绍一下 microG Project 这个项目 MicroG 项目是一个开源项目，旨在重新实现 Google 在 Android 系统中的专有应用程序和库，以支持自由软件社区的需求。简单来说，它的作用可以概括为以下几点： 自由软件支持：由于 Android 核心操作系统虽然是开源的，但很多核心应用和库并不是，MicroG 项目提供了一个自由软件版本的 Google 核心库和应用，使得用户可以不依赖 Google 的专有服务。 隐私保护：MicroG 允许用户减少或监控发送到 Google 的数据，这对于注重隐私的用户来说是一个重要的优点。 兼容性扩展：一些流行的开源应用程序需要 Google 的专有库才能运行，MicroG 项目通过提供这些库的自由软件版本，扩展了这些应用程序的兼容性。 老旧设备优化：对于老旧的 Android 设备，使用 MicroG 可以提高电池续航，因为它们不需要运行 Google 的全套服务。 测试和虚拟基础设施：MicroG 不仅可以在真实设备上使用，还可以在测试模拟器中替代 Google 工具，甚至用于虚拟移动基础设施 microG 提供了以下组件： Service Core (GmsCore)：一个库应用，提供运行依赖于 Google Play 服务或 Google Maps API 的应用所需的功能。 Services Framework Proxy (GsfProxy)：一个小工具，允许使用 Google Cloud Messaging 服务的应用正常运行。 Unified Network Location Provider (UnifiedNlp)：一个库，提供基于 Wi-Fi 和蜂窝塔的地理定位服务。 Maps API (mapsv1)：一个系统库，提供与已弃用的 Google Maps API (v1) 相同的功能。 Store (Phonesky)：一个前端应用，提供访问 Google Play 商店的功能，目前还在早期开发阶段。 microG官网下载 Download - microG Project 这次用于鸿蒙系统的只需要下载： 1、microG Services microg/GmsCore (com.google.android.gms-*-hw.apk) 也可以不安装 Play 用 aurora store 替代，但有些App会检测 Play 是否安装，这时候就需要安装 microG Companion 这个来欺骗这些 App 2、microG Companion microg/GmsCore (com.android.vending-*-hw.apk) 注意都是下载 hw 结尾的文件，* 号代表不同版本，下载最新即可 华为的应用市场也可以搜索到，用名字直接搜索即可 3、应用商店 google play sotre 这个自行找,我是在这里下载 apkmirror aurora store Aurora 官网下载 microG Services 安装后没有图标，需要在应用管理里面找到后点击右上角齿轮才可以进去 刚安装完后就会弹出设置界面，进去“自我检查” 一个个勾上，然后点击 “Google 账号” 登录自己账号
最近练听力，找到 englishpod 的 mp3，非常不错，但是缺少同步字幕，所以用openai的whisper来转换 但是官方的 whisper 每次只处理30s，需要分片处理，所以找到了 Whisper Jax 声称速度更快，而且不需要自己处理分片的问题。 import jax import jax.numpy as jnp import os import time import json import magic from whisper_jax import FlaxWhisperPipline def get_mp3_files(directory): total_files = 0 print(f"scanning files...") for root, dirs, files in os.walk(directory): for file in files: mime = magic.Magic(mime=True) if mime.from_file(os.path.join(root, file)) == 'audio/mpeg': total_files += 1 yield os.path.join(root, file) print(f"Total files: {total_files}") def mp3_to_text(directory): pipeline = FlaxWhisperPipline("openai/whisper-large-v2", dtype=jnp.bfloat16) for mp3_file in get_mp3_files(directory): print(f"Processing file: {mp3_file}") txt_file = os.path.splitext(mp3_file)[0] + '.txt' if os.path.isfile(txt_file): print(f"Skipping file: {mp3_file}") continue start_time = time.time() text = pipeline(mp3_file, task="translate", language="chinese",return_timestamps=True) text_length = len(text['text']) # 获取转录文本的长度 print(f"Text length: {text_length} characters") end_time = time.time() print(f"Processed in {end_time - start_time} seconds") with open(txt_file, 'w') as f: f.write(json.dumps(text)) start_time = time.time() mp3_to_text('/data/englishpod') end_time = time.time() print(f"Total time: {end_time - start_time} seconds")
使用这个工具 https://github.com/vzhd1701/evernote-backup 备份步骤1 如果是印象笔记要注意的是需要加入 --backend china 参数 ./evernote-backup.exe init-db --backend china Logging in to Evernote... Username or Email: king@gmail.com Password: Enter one-time code (+XX XXX XXXX 2010): 638303 Authorizing auth token, china backend... Successfully authenticated as king! Current login will expire at 2024-07-09 07:31:21. Initializing database en_backup.db... Reading database en_backup.db... Successfully initialized database for king! 备份步骤2 ./evernote-backup.exe sync Reading database en_backup.db... Authorizing auth token, china backend... Successfully authenticated as king! Current login will expire at 2024-07-09 07:31:21. Syncing user notebooks... [####################################] 60931/60931 2267 note(s) to download... Downloading 2267 note(s)... [####################################] 2267/2267 Updated or added notebooks: 96 Updated or added notes: 2267 Expunged notebooks: 38 Expunged linked notebooks: 0 Expunged notes: 660 Synchronization completed! 备份步骤3 ./evernote-backup.exe export ./ Reading database en_backup.db... Exporting notes... [####################################] 96/96 All notes have been exported!
GPT输入和输出的长度都是有限制的，OPENAI的GPT4是8K，azure的是32K 这个长度限制要注意是指 输入的 prompt + 模型返回的。 调用接口的时候为了更准确的拆分长文本，需要计算token数量，但是不同版本的GPT用的编码方式不一样，所以计算token数量的方式也是不一样的。官方有python的库可以用，但其它语言的就需要找到合适的。 不同版本用的编码方式不一样： cl100k_base：gpt-4, gpt-3.5-turbo, text-embedding-ada-002 p50k_base：Codex models, text-davinci-002, text-davinci-003 r50k_base (or gpt2)：GPT-3 models like davinci 官方GPT-3的在线计算工具 https://platform.openai.com/tokenizer Tiktokenizer 在线工具 https://tiktokenizer.vercel.app/ gpt-tokenizer 截图，点击这里访问 支持cl100k_base and p50k_base 编码的库（也就是GPT-4和GPT-3.5） Javascript: https://github.com/niieani/gpt-tokenizer https://www.npmjs.com/package/gpt-tokenizer Python https://github.com/openai/tiktoken Java https://github.com/knuddelsgmbh/jtokkit .NET/C# https://github.com/dmitry-brazhenko/SharpToken https://github.com/aiqinxuancai/TiktokenSharp
下面方法其实是调用mount_ntfs命令实现的，但Ventura开始，这个命令被苹果删除了。 劝大家尽量用exfat吧，别折腾了。 我移动盘主要是因为需要在其它设备上操作，所以用ntfs兼容性是最好的。 由于版权问题，在macos写操作ntfs是一个折腾的事情，系统升级为monterey后之前用的开源工具已经不能使用。 而且之前通过fstab的方式也不管用。只能用下面的方式手动挂载： 1、先在 磁盘工具 中把对应的盘 卸载 2、打开命令行工具 diskutil list 找到对应磁盘的分区，把最右边那一列的名称复制一下。 sudo mkdir /Volumes/oDisk 创建目录，名称随意和下面的对应起来就可以了。 sudo mount -t ntfs -o rw,auto,nobrowse /dev/disk2s3 /Volumes/oDisk 上面的disk2s3换成你自己的。 3、在finder中前往文件夹 /Volumes/oDisk 4、enjoy it 另外，如果发现有的文件显示是灰色，不能访问可以通过下面方法解决 xattr -d -r com.apple.FinderInfo /Volumes/oDisk/*
Hyperf Swoole 使用阿里云OSS官方PHP OSS SDK由于SWOOLE_HOOK_CURL 导致的Bug
Swoole4.5.7 + hyperf 用阿里云上传文件的时候莫名奇妙的异常 Oss\Core\OssException: : RequestId: 找了好久才定位到是SWOOLE_HOOK_CURL导致的问题，于是 检查 bin/hyperf.php ! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', SWOOLE_HOOK_ALL); 配置是对的，根据Swoole官方文档 SWOOLE_HOOK_ALL：打开所有类型但不包括CURL https://wiki.swoole.com/wiki/diff/?id=993&version=0&compare=current 然后发现一个好心人做了一个兼容组件 https://github.com/Reasno/swoole-aliyunoss-addon 安装后再把SWOOLE_HOOK_CURL打开 ! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', SWOOLE_HOOK_ALL | SWOOLE_HOOK_CURL) 错误却变成了 string(106) "MissingContentLength: You must provide the Content-Length HTTP header. RequestId: 5FC048380D92D938376A214A" 这种情况不用定位了，还是换个Swoole版本看看效果，先删除swoole-aliyunoss-addon composer remove swoole-aliyunoss-addon 然后把Swoole升级到4.5.8问题依旧 最后把Swoole降级到4.5.2问题解决 看了官方文档 https://wiki.swoole.com/#/runtime?id=swoole_hook_all 从 v4.5.4 版本起，SWOOLE_HOOK_ALL 包括 SWOOLE_HOOK_CURL 原来是这样.... 如果版本高于4.5.4使用下面这个就可以解决问题了 ! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', SWOOLE_HOOK_ALL ^ SWOOLE_HOOK_CURL) 还有一个解决方案就是使用支持hook curl的php oss sdk https://packagist.org/packages/starfalling/aliyun-oss-php-sdk
旁路由部署好后，问题来了，设备要手动设置网关地址，很不方便 例如我的主路由IP是192.168.1.1 旁路由是192.168.1.10 因为DHCP服务器在主路由上，所以获取到的网关都是主路由IP 这时候可以通过 dnsmasq 解决这个问题 在主路由OPENWRT里面编辑 vim /etc/dnsmasq.conf 在最后面添加 dhcp-option=3,192.168.1.10 dhcp-option=6,192.168.1.10 这样主路由的DHCP在分配IP的时候会把网站和DNS分配为192.168.1.10