记录目的:把这次从注册土耳其 Apple ID、充值土耳其区礼品卡、订阅 ChatGPT Plus,到后续续费注意事项的过程完整整理下来,方便以后自己复盘和继续充值。
说明:这是一次个人实践记录,不是官方教程。不同账号、地区、支付方式、Apple / OpenAI 政策变化,都可能导致流程不同。后续操作前,建议先小额测试,不要一次充值太多。
我当前已经有 ChatGPT Plus,但日常使用,尤其是 Codex / 编程相关需求,感觉 一个 Plus 不太够用。
直接升级到 ChatGPT Pro 5x 可以获得更高额度,但欧洲区 Pro 价格大约是:
Pro:€103 / 月(含 VAT)
其中 VAT 大约 €17.88
所以问题是:
Plus 不够用
Pro 又有点贵
是否可以通过其他地区订阅 Plus,降低月成本?
最后尝试的方案是:
注册土耳其 Apple ID
↓
给土耳其 Apple ID 充值土耳其里拉礼品卡 / 余额
↓
通过 iOS App Store 内购订阅 ChatGPT Plus
↓
后续每月由 Apple 余额自动续费
项目地址:https://github.com/hacdias/webdav
镜像:ghcr.io/hacdias/webdav:latest(推荐)或hacdias/webdav:latest
部署目录:/var/www/webdav/(所有文件集中管理)
/var/www/webdav/
├── docker-compose.yml # Docker Compose 主配置文件
├── config.yml # WebDAV 核心配置文件(用户名、密码、权限等)
├── README.md # 本文档(可直接复制官方 README)
└── data/ # WebDAV 实际存储目录(挂载到容器 /data)
# 1. 更新系统并安装 Docker + Compose
sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose-plugin
# 2. 将当前用户加入 docker 组(无需每次 sudo)
sudo usermod -aG docker $USER
newgrp docker # 或重启终端
# 创建目录
sudo mkdir -p /var/www/webdav/data
sudo chown -R $USER:$USER /var/www/webdav
# 进入目录
cd /var/www/webdav
目标:在 Windows PowerShell 5.1、PowerShell 7、Git Bash 中,按需自动设置代理,并避免 VPN/内网地址被误代理
很多命令行工具会读取以下环境变量来决定是否走 HTTP 代理:
HTTP_PROXY / HTTPS_PROXY(大写)http_proxy / https_proxy(小写)NO_PROXY / no_proxy:指定哪些地址 不走代理(非常关键,防止 VPN 内网被代理坑死)没有“唯一正确”,只有“兼容性”:
http_proxyHTTP_PROXY✅ 最稳做法:
- 在 Bash(Git Bash/WSL):大写 + 小写都设置
- 在 PowerShell/Windows:大写优先,必要时也补小写
否则会出现经典现象:
典型需要 bypass 的范围:
- localhost, 127.0.0.1
- 192.168.0.0/16(家庭/公司内网常见)
- 10.0.0.0/8
- 172.16.0.0/12
https://github.com/RayWangQvQ/naiveproxy-docker
目标是在现有 VPS 上新增一套 NaiveProxy 服务端,而不改动现有 Nginx 对 80/443 的占用关系。最终形态为:
这是当前约束下最简单、失败面最小、维护成本最低的方案。
部署完成后应满足:
When deploying .NET Framework web applications (such as those using Sitecore Helix) on a production or build server, you might encounter a frustrating issue: MSBuild runs successfully with 0 errors, but no files are output to the specified publish directory. This problem often arises when using the minimal Visual Studio Build Tools installation, as opposed to a full Visual Studio IDE setup on a development machine. In this blog post, I'll walk through the symptoms, root cause, and step-by-step resolution based on a real-world scenario. This guide assumes you're working with a .NET Framework 4.8 web project and MSBuild commands for publishing to a file system.
The goal is to make your build server "publish-ready" without installing the full Visual Studio IDE, which is unnecessary (and resource-heavy) on servers.
MSBuild.exe "C:\path\to\YourProject.csproj" /restore /p:Configuration=debug /p:DeployOnBuild=True /p:PublishProfile=Local /p:WebPublishMethod=FileSystem /p:PublishUrl="C:\path\to\publish\folder" /p:TransformConfigFiles=true /p:IncludeSetAclProviderOnDestination=False /v:detailed
WebPublish targets).This guide documents the process of enabling encrypted connections for a local Microsoft SQL Server instance using a self-signed certificate. It includes the steps taken, issues encountered, and their resolutions, based on Microsoft’s official documentation and additional resources. The process is tailored for SQL Server on Windows and assumes administrative access to the server.
SQL Server supports encrypting connections to secure data transmission between clients and the server. Encryption can be enforced for all connections or specific clients, requiring a valid certificate that meets SQL Server’s requirements. For this setup, I used a self-signed certificate due to its simplicity for local testing. The process involves generating and installing the certificate, configuring SQL Server to use it, addressing permission issues, and enabling forced encryption. Below is a detailed account of the steps, challenges, and solutions.
https://www.majorgeeks.com/files/details/system_monitor_ii.html
https://winaero.com/windows-7-desktop-gadgets-for-windows-11/
https://web.archive.org/web/20220427233938/https://winaero.com/windows-7-desktop-gadgets-for-windows-11/
Windows 7 Desktop Gadgets were a beloved feature for many users, offering quick access to tools like calendars, clocks, and system monitors. While Microsoft removed this feature starting with Windows 8, you can bring these gadgets back to Windows 11 using the Gadgets Revived package and enhance your desktop with additional tools like System Monitor II. This blog post walks you through the process of installing Windows 7 Desktop Gadgets and the System Monitor II gadget on Windows 11.
这是一个关于调试的真实故事。一个看似简单的图片服务404问题,最终花费了3天时间才找到根本原因。问题的表象很简单,但背后涉及到Django图片处理、nginx内部重定向、文件系统符号链接以及nginx location优先级等多个技术点的交互。
这个调试过程充分展示了系统性问题排查的重要性,以及当多个技术组件交互时可能产生的复杂性。
在Django图片处理系统中,发现了一个奇怪的现象:
Accept: image/avif → 200 OK ✅Accept: text/html → 404 Not Found ❌同一张图片,仅仅因为客户端Accept头不同,就产生了完全不同的响应结果。
# 支持AVIF的请求
curl -H "Accept: image/avif" "http://localhost:8500/static/images/test.jpg"
# 返回: 200 OK,成功转换为AVIF格式
# 普通浏览器请求
curl -H "Accept: text/html" "http://localhost:8500/static/images/test.jpg"
# 返回: 404 Not Found
deactivate if in a (venv)).Install Build Dependencies
Install the necessary tools and libraries for compiling libavif and its dependencies.
sudo apt update
sudo apt install -y build-essential cmake ninja-build libpng-dev libjpeg-dev yasm pandoc git libaom-dev
Clone the libavif Repository
Download the latest libavif source code from GitHub.
git clone https://github.com/AOMediaCodec/libavif.git
cd libavif
问题概述: 在Vue 3 + Nuxt 3项目中,HTML5 <input type="range"> 元素在拖拽时 event.target.value 始终返回 0,导致音乐播放器进度条无法正常拖拽。本文记录了从问题发现到最终解决的完整调试过程。
在开发一个音乐播放器应用时,我遇到了一个看似简单但实际上非常复杂的问题:
现象:
- 用户拖拽进度条时,@input 和 @change 事件中的 event.target.value 始终返回 '0'
- 进度条视觉上可以拖动,但音频播放位置不会改变
- 点击进度条的特定位置可以正常跳转
技术栈:
- Vue 3.4+ (Composition API)
- Nuxt 3.17+
- TypeScript
- Pinia (状态管理)
- Tailwind CSS
最初的组件实现看起来很标准:
<template>
<input
type="range"
:min="0"
:max="duration"
:value="currentTime"
@input="handleInput"
@change="handleChange"
/>
</template>
<script setup lang="ts">
function handleInput(event: Event) {
const target = event.target as HTMLInputElement
const newTime = parseFloat(target.value) // ❌ 总是返回 0
console.log('Input value:', target.value) // 输出: "0"
emit('seek', newTime)
}
</script>