毛毛的梦 - 记录 https://www.maodream.com/tag/%E8%AE%B0%E5%BD%95/ 上海之行航拍照片 https://www.maodream.com/archives/197/ 2024-09-15T18:01:00+08:00 前言 2024年,中考完后的那个暑假,我和朋友Eric Eric的主页 来到了中国的国际化大都市——上海,在这里度过了五天时间。上海这座魔幻的城市给我们留下了许多深刻的印象,在这一次旅途中,我们也在浦东新区拍下了许多好看的照片。{dotted startColor="#ff6c6c" endColor="#1989fa"/} 写了一个能让各位知道我睡没睡着的网页 https://www.maodream.com/archives/192/ 2024-07-02T20:11:00+08:00 {alert type="warning"}这个项目已过时船新升级!全方位视奸,包括但不限于我在听的歌、家中灯的开关和电脑运行的程序,甚至还能直接和我互动!!详见: 全方位视奸·睡似了吗? 重生版 网址: maao.cc/project-sleepy {/alert}前言  因为中考完后的假期太闲,我又算是个比较爱睡觉(小睡)的人,所以基本上每天都处在睡着->醒来->睡着->醒来的循环中。朋友们喜欢留言找我,但一两条通知没法吵醒我,直接打电话又有些唐突。于是我决定写一个网页,来让访问网页的各位看到我是活着的还是似着的(){dotted startColor="#ff6c6c" endColor="#1989fa"/}  首先实现思路就是后端给两个接口。一个切换状态(switch)接口,当带 status=1 参数请求时,将状态更改为醒着(awake);当带 status=0 参数请求时,将状态更改为梦中(sleeping)。对于切换状态接口,任何操作都必须带上正确的 secret 密钥参数,否则直接返回 Invalid secret.。第二个接口是查询状态(query)接口,无需任何参数,请求接口后直接返回当前状态。前端请求查询状态(query)接口后,即可显示当前状态。更改状态使用快捷指令发送get请求。{dotted startColor="#ff6c6c" endColor="#1989fa"/}  最终成功实现了想要的效果: https://maao.cc/sleepy/{bilibili bvid="BV1fE421A7PE" page=""/} 大陆用户使用国际版支付宝 https://www.maodream.com/archives/163/ 2024-04-30T00:40:00+08:00 前言  事情的起因是一天闲着没事,偶然刷到了一则帖子,才得知原来大陆用户是可以申请开通支付宝国际版的。  支付宝国际版相比标准版界面更加简洁、直观、高端大气上档次,很适合只用几个常用的功能,又不喜欢花里胡哨的用户。{dotted startColor="#ff6c6c" endColor="#1989fa"/}  首先进入支付宝客服中心,接入人工客服,然后直接和对方说出要求(想切换到支付宝国际版),对方会转接给「相应工作人员」处理。  转接后再次描述自己的需求,会用对一些功能有影响为理由最后挽留一下。这时候表达自己能接受,他们就会直接提交申请。 (有人说自己尝试,对面本来不同意,说了句求求你之类的话就同意了。这可能因人而异,只要非常坚定要切换就行)   我是工作日中午提交的申请,三个小时左右就通过了,效率还算快。  根据收到的短信的指引切换至国际版后,就能拥有一个简洁的支付宝了。还可以切换支付宝语言为英语,体验更纯正的「国际版」。{dotted startColor="#ff6c6c" endColor="#1989fa"/}  切换到国际版后,有了新的绑定银行卡界面,支持 Visa / Mastercard / Diners Club / Discover / JCB / 银联  但是似乎因为实名认证的方式,切换到国际版支付宝似乎并没有对绑定国际银行卡有加成,还是没法绑定超过两张国际银行卡,会提示所谓的环境不安全。 给常联系页面加了个英文 https://www.maodream.com/archives/129/ 2024-01-13T23:53:00+08:00   因为自己有时候可能会和一些外国友人交流,所以挺早之前就想给自己的常联系页面加一个英语,但是一直没去行动。我认识一个来自埃及的朋友,之前经常和他一起打游戏啥的,但是三个多月前,他突然就没任何动静了。我问了很久,他也没回复。终于半个月前(这半个月没怎么上线),他回复了我:  这次经历教会了我们,好朋友之间还是要留下足够多的联系方式。刚好最近不是很忙,就抽出时间给我的联系页加了一个英文的选项:( https://maao.cc/global )  我选择是将中文和英文分成两个单独的子目录,访问网站首页时,自动检测用户的语言,跳转到对应的语言目录。实现起来非常简单,只需要15行代码(不完全遵守规范的话,还可以更少):<!DOCTYPE html> <html> <head> <title>maao.cc</title> <script> var userLang = navigator.language || navigator.userLanguage; if (userLang === 'zh-CN') { window.location.href = '/cn'; } else { window.location.href = '/global'; } </script> </head> </html>  这样,访问首页就会自动判断,将用户引导至合适的语言。当用户的语言是 zh-CN (简体中文)时,就自动跳转到https://maao.cc/cn 是其他语言时,就跳转到https://maao.cc/global  当然,如果识别出错或者只是想看看另一种语言的页面的话,我也做了一个区域选择器(Region Selector 有点模仿任天堂官网那意思): https://maao.cc/regionselector 因为一般来说大部分简体中文访问者不会打开这个页面,所以在这里我是把英文放在第一个。  同时,我也将常联系站(maao.cc)的境外流量接入了上一篇文章提到的Amazon CloudFront(详见 本站的境外网络访问优化记录 - 毛毛的梦 ),现在全球连接速度都嘎嘎快 本站的境外网络访问优化记录 https://www.maodream.com/archives/104/ 2023-12-16T21:39:00+08:00   毛毛的梦是我的一个个人博客网站,由于我是中国人,网站主要访客在中国大陆,所以网站服务器也自然是在国内。同时为了提升国内各地区访问者的体验,我使用了阿里云的DCDN全站加速服务,通过分布在各地的缓存服务器来加快连接速度,减轻源服务器压力,同时还能在一定程度上避免网络攻击。经过优化后,大陆地区的访问速度确实快多了,但是由于阿里云全站加速服务是按流量收费的,而境外的流量费和大陆的不一致,境外要比大陆贵得多(如图)  一般来说境外的攻击比国内要更多,再加上成本原因,最终还是选择只加速大陆地区。设置只加速大陆地区后,境外访问者将会被解析到位于上海的服务器,并且算作国内流量。这样的好处是能大大降低成本,但同时坏处也显而易见,境外地区的访问者就不会有非常优秀的体验。   虽然我网站的境外访客不算多,但是也并不是完全没有。为了照顾到他们的体验,我还是决定使用境外CDN服务。但阿里云的肯定不行,主要原因还是攻击多并且流量费太贵。不过好在我的域名使用阿里云的DNS云解析服务,可以通过简单的配置来实现让不同地区的访问者被解析到不同的服务器。这意味着我可以让国内的访问者使用阿里云的全站加速服务,而让境外的访问者被引导至另一个服务商。  接下来就是寻找一个合适的境外CDN服务提供商。我首先想到的是Akamai,作为全球最大、历史最久的的分布式计算平台之一,Akamai有着非常不错的口碑,并且一直为IBM、Adobe等大公司提供稳定的服务。然而经过我的一些了解,Akamai主要方向似乎是帮助团队和公司,对个人开发者并不是非常友好。  我又去找了亚马逊AWS(Amazon Web Services),亚马逊有CDN业务,他们叫做Amazon CloudFront。Amazon CloudFront有永久免费套餐,每月有1TB的免费出站流量,这对于我这样一个小站来说是完完全全足够了的。  我先注册了AWS账号,选择Amazon CloudFront免费套餐,AWS要求我提供银行卡信息来绑定自动扣款。我刚好有一张中信银行的Visa白金借记卡(持卡人是我本人,因为是借记卡,所以未成年人也可以办),但是激活的时候,柜台的工作人员和我说因为国家反诈要求,这种新办的外币卡需要等待一段时间才能完全可用。我之前也尝试过绑定Paypal和Apple Pay,但是都失败了,说明在解锁之前确实不行。不过我还是抱着试一试的心态,填入了我的银行卡信息:  到了下一步,似乎是通过验证了?接下来要求我验证我的手机号:  验证通过后,到了选择支持计划的页面,我可以选择支付一笔费用升级到更高级的支持计划,会有专业人员来帮助我解决我的问题。但是对于我这种个人开发者,还是选择自食其力:  点击完成注册后,提示我成功激活了我的AWS账户:  看来这张还没有解锁的卡也能通过验证(我还尝试过使用这张卡开通Cloudflare for Saas,也成功了)  进入Amazon CloudFront控制台,点击“创建 CloudFront 分配”  先将我的DIgicert SSL安全证书导入到美国东部(弗吉尼亚北部)区域(us-east-1)  创建完CloudFront分配后,我得到了CNAME解析域名。接下来登录到阿里云云解析DNS配置页面,点击添加记录,主机记录填写www,解析请求来源选择境外(即向除中国内地以外的其他国家和地区,返回设置的记录值),记录值填入刚得到的分配域名:  稍等片刻,使用工具检测解析,确认解析设置生效:  接下来,请求我「身在境外的朋友」帮忙打开我的网站,看看是否有效:  提示网站使用了不受支持的协议,看来是某个地方配置有问题。我搜索了一下,发现似乎并没有人和我遇到同样的错误。于是我便开始了漫长的摸索...  后来我通过搜索,找到了亚马逊云服务官方在知乎发布的一篇文章:《 技术干货 | 手把手教你排查 Amazon CloudFront 常见配置问题 》,在这篇文章里,提到了一个问题:“中国区 CloudFront 直接访问CloudFront 生成的 url,返回 403”,在这里给出的原因是:“中国区访问 CF 分发的时候,只能用客户自己的已经备过案的域名访问,不可以用 http://xxx.cloudfront.cn 的域名访问”:  这段话看得我云里雾里,我百思不得其解,经过了一段时间的“头脑风暴”后,我得出了这样一个结论:上文提到的CloudFront分配给我的域名“d342janx8v6j2q.cloudfront.net”,是相当于分配给我的一个子域名... 我作为国际AWS用户,可以使用这个域名来建立网站,并让访客用这个域名来访问我的网站。我注意到,点击分配域名旁的复制按钮,复制下来的是“https://d342janx8v6j2q.cloudfront.net”,而不是“d342janx8v6j2q.cloudfront.net”:  如果这个域名只是用于CNAME解析,那么不应该将https前缀也复制进来。并且,直接访问“https://d342janx8v6j2q.cloudfront.net”,能显示出403页面。这说明这个“分配域名”不止是用于CNAME解析。于是我尝试知乎原文的解决方法,将www.maodream.com添加进“备用域名”:  应用更改后,果然能连接上了:  于是我将AWS控制台切换到了英文,发现“分配域名”的原文是“Distribution domain name”:  这里的“Distribution”翻译到中文确实是“分配”,但是Distribution是CloudFront里的一个概念,有点像是“实例”,如果直接翻译成分配,很容易让人理解成是分配的域名。看来AWS的翻译质量还是不咋地,索性直接留在英文界面。  虽然现在网站是能连接上了,但并没有显示出正常的网页,而是得到了一个来自CloudFront的403错误,大意是CloudFront的边缘服务器无法连接到源站。这就麻烦了,因为可能引起这种问题的原因有很多。我搜索了一下,似乎还是没有人遇到同样的问题,看来又得自己慢慢摸索了...  我尝试多刷新几次,然后去查看源服务器上的网站日志,发现根本没有新记录。这说明CloudFront的服务器与我的服务器根本就没有建立连接,于是去看源站配置。源站域名这个地方,因为不能填IP地址,我就填的www.maodream.com(我以为是回源host)。但是我又突然想起来,它不能填IP地址,但是可以填CNAME解析的域名啊。  于是我把绑定我源服务器IP的域名填了进去,保存。等一段时间生效后,再次打开网站,居然就稀里糊涂地成功了:  后来我才意识到,这里不是回源host,填写的是源站信息,而不是源站域名(当时中文界面,这里叫做“源域”,解释是“选择 AWS 源,或者输入源的域名。”,看来这翻译质量是真不咋地)。而且,我的www.maodream.com这个域名在海外是解析到CloudFront的,相当于CloudFront自己把自己当源服务器访问,那肯定是有问题的。  现在,本站境外加速服务就由Amazon CloudFront提供,成功实现了国内和境外“一片绿”的美好景象:  境外区域也得到加速后,来自全球的访问者就都能得到一个好的访问体验了。那这次境外网络访问优化就算圆满成功了!! 在Windows 11上启用安卓子系统(WSA) https://www.maodream.com/archives/77/ 2023-12-03T16:27:00+08:00 导言  贵阳市中考有一项是英语听力口语能力测试,总分30,计入中考分数。为了做好考试的准备,我们每周末都有一次练习,是手机上的软件,叫“ E听说中学 ”(科大讯飞的,七八岁的时候很喜欢的一家公司)    这个练习软件好是好,可是用手机的话必须时刻挂在前台,在电脑上用模拟器low了些,刚好最近对WSA子系统有些感兴趣,加上我电脑的系统是Windows11,干脆就趁这个机会尝试来配置一下Android子系统。{dotted startColor="#ff6c6c" endColor="#1989fa"/}{alert type="info"}以下步骤参考知乎用户“塞尔达斗恶龙”的文章:Windows 11 安卓子系统安装教程 https://zhuanlan.zhihu.com/p/637883437 {/alert}  打开微软商店解析工具: https://store.rg-adguard.net 输入 https://www.microsoft.com/store/productid/9p3395vx91nr ,在右侧下拉框中选择“Slow”,随后点击“✔”  解析出来后,拉到页面最底部,点击最新的后缀名为“.msixbundle”的文件,下载。因为是用的微软的服务器,下载速度算比较快。  下载完成后,在开始菜单中搜索“Powershell”,点击“以管理员身份运行”  打开后,执行 Add-AppxPackage <文件路径>(例如 Add-AppxPackage "C:\Users\WinMEMZqwq\Downloads\MicrosoftCorporationII.WindowsSubsystemForAndroid_2310.40000.2.0_neutral_~_8wekyb3d8bbwe.Msixbundle" ) 开始安装WSA子系统  部署完成后,我尝试直接打开apk文件,但是并没有程序关联,WSA又是UWP程序,没法手动选择。 于是又回到塞尔达斗恶龙大佬的教程,才得知原来想在子系统中安装程序没有那么容易,需要用到adb工具。不过好在我有过一些Android开发的工具,有一些adb的经验,而且adb安装其实很简单,一句命令就能搞定。 写到一半发现,其实可以直接把安装包放进共享文件夹里,没必要像原教程里用ADB那么麻烦   首先打开“适用于 Android™ 的 Windows 子系统”  点击侧边栏中的“高级设置”,展开“实验性功能”,启用“共享用户文件夹”(如果你担心共享整个用户文件夹会影响宿主机中的数据安全,可以像我一样点击“更改文件夹”,并为子系统专门设置一个共享文件文件夹)  接下来,返回侧边栏中的“系统”,点击“文件”右侧的超链接图标。  此时Android子系统将会启动,耐心等待启动完成后(大约半分钟),会进入子系统中的“文件”应用(浓浓的AOSP风,熟悉的Google文件极客)  与Windows宿主机的共享文件夹就在根目录下的“Windows”文件夹中,打开文件夹,直接点击安装包安装即可。  安装完成后,就能在Windows宿主机的开始菜单中看到刚安装的程序了,直接打开,因为子系统刚才已经启动,所以再打开其他应用速度很快。  可以看到,子系统中的程序以窗口的形式独立存在,使用起来的感受就像原生Windows应用一样。  输入账号密码登录后,就能和在手机上一样参加练习了。 收到了内蒙古的朋友寄过来的一张明信片 https://www.maodream.com/archives/75/ 2023-11-26T12:44:00+08:00 感觉很有意义{dotted startColor="#ff6c6c" endColor="#1989fa"/} 准备做一个文章更新自动短信推送 https://www.maodream.com/archives/53/ 2023-11-15T21:00:00+08:00 导言  这两天生病在家,刚好闲着没事干,准备整个自动推送文章更新。推送方式上,考虑到访问我的网站的用户大多用的是手机,虽然邮件的推送成本极低,但是转化率不高。而且手机短信通知要比邮件方便一些,也有着不错的转化率,所以决定先开发短信推送,邮件推送先搁着。{dotted startColor="#ff6c6c" endColor="#1989fa"/}  现在的想法是用阿里云的短信发送接口。前端写一个页面,输入接收推送的手机号,发送验证码申请提交到后端,通过某种加密方式鉴权,鉴权通过后后端请求阿里云API发送短信。前端再输入收到的验证码,验证通过后把手机号写入数据库。  验证码短信的内容想好了,是:{alert type="info"}  【毛毛的梦】验证码:6位验证码。您正在申请订阅文章更新通知。{/alert}  等到每次文章一更新,就去阿里云发短信给数据库里所有的手机号。消息内容目前定下来是:{alert type="info"}  【毛毛的梦】新文章更新,标题:标题。链接:链接{/alert}  现在只是新建了个计划,开发也处于新建文件夹阶段,给自己定的完成时间是三周以内,慢慢写吧。{dotted startColor="#ff6c6c" endColor="#1989fa"/}2023.11.17 9:26更新:  模板全部审核通过了,就等着开发了2023.11.16 10:47更新:  目前进展:Python后端接口已完成2023.11.16 9:18更新:  通知消息模板人工咨询工单回复了,说建议我在申请备注中提供一个完整的不带变量的模版示例,我只能说...瞎吗...2023.11.15 23:05更新:  修改过后的验证码消息模板过了,但是通知消息模板还是没过,审核意见是什么“根据您提供的链接https://www.maodream.com/archives/,核实功能内容太少,无法判断实际内容  我的archives目录下是文章,我只是用这个链接合成一下,他不会把archives当做一个实际页面了吧...2023.11.15 22:36更新:  验证码消息模板也没过,本来想用“您正在申请订阅「毛毛的梦」文章更新通知。”的,但是阿里云提示不能使用特殊符号,只能作罢。说实话有点小可惜,我觉得「直角引号」还挺好看的。  也想吐槽一下阿里云,为什么不直接禁止输入特殊符号,还要靠人工审核才提示,有点浪费时间...2023.11.15 22:17更新:  短信通知的消息模板没通过审核,阿里云说是title变量的内容不明确,可我觉得原本写的“新文章:标题”挺明确的啊。没办法,只能修改成“新文章更新,标题:标题。” 记录一次在Ubuntu下的Linux内核升级 https://www.maodream.com/archives/17/ 2023-10-22T14:07:00+08:00 导言  新网站刚建起来,总要写点什么。一个网站的第一篇文章不需要有多惊艳,一件小事也可以作为成功的开头。刚好我家中的Ubuntu Server服务器内核该升级了,就简单记录一次内核升级操作吧。{dotted startColor="#ff6c6c" endColor="#1989fa"/}电脑系统环境:Windows 11服务器系统环境:Ubuntu Server 22.04.3 LTS{dotted startColor="#ff6c6c" endColor="#1989fa"/}{alert type="warning"}警告:内核更新操作具有一定风险,建议您在执行操作前备份好重要数据{/alert}  开始之前推荐一个小众SSH软件: URLSSH 我个人觉得还算不错,有Mac和Windows版,界面很简洁。这家公司还有一个产品叫做URLOS,应该和宝塔面板差不多,我两年前就买过,有机会出个评测。  登录到服务器,查看内核版本。  查看内核版本有两种方法,最简单的一种是在刚登录SSH时的信息中查看:  Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-87-generic x86_64)  加粗部分即为内核版本  或者在SSH中执行 uname -r  maomao@mao-server-gz:~$ uname -r   5.15.0-87-generic   加粗部分即为内核版本  执行 sudo apt update 更新软件包列表  执行 sudo apt install linux-image   在输出结果中找到最新版本匹配的内核,如 linux-image-6.2.0-35-generic   执行 sudo apt install linux-image-6.2.0-35-generic   输入Y继续  执行 sudo reboot 重启服务器,并等待服务器重启完成  重启完成后,重新登录SSH,执行 uname -r 查看新的内核版本  至此,升级操作完成。