Versun

对待生命,不妨大胆一点,因为我们终将失去它



苹果设备使用 VPN 的安全问题

2025-03-10
直到今天我才发现 iOS/iPad OS 的网络架构设计并不是想象中的那样安全,具体如下...

提高专注力的方法

2025-03-10
很多方法其实都是显而易见的,但有时候就是会忘记,因此做个小记

1. 不要多线任务
2. 专门的位置/地点,提前布置好环境,关闭手机提醒并翻转手机(屏幕向下),关闭无关的浏览器标签
3. 预期管理,使用番茄钟,只需专注25分钟即可,有结束时间,所以大脑压力不大
4. 休息期间,不要做任何其它事,防止注意力遗留到下一个任务钟,比如工作的时候沉浸在上一个短视频里
5. 一个长休息后,可以切换到简单的或者有趣些的任务,或者自主进入沉沦时间
6. 训练大脑在工作时,抵制快餐式的刺激,比如短视频、信息提醒等,每一次抑制,都是一次加强专注力的训练
7. 规律作息、健康饮食、每日锻炼

SQ3R 阅读法

2025-03-08
刚刚在看  Reading Assignments: Crash Course Study Skills #2 视频时,了解到 SQ3R 阅读法,故做个小结:
SQ3R是指 Survey, Question, Read, Recite and Review
具体方法如下
Survey:先快速浏览文章,注意标题、小标题、加粗字、总结等,建立基本框架
Question:开始阅读前,写下你想了解或者预览后的问题,方便在阅读时抓取我们需要的东西,而不是尝试了解所有东西
Read:开始阅读,寻找问题的答案,如有必要,可做笔记
Recite:尝试不看原文进行回忆或者复述或者写下摘要
Review:回顾笔记,检查是否了解所有重点,定期复习

我在平时的阅读中,基本都会先快速浏览,判断是否有必要阅读,然后就直接开始阅读。
所以每次阅读完并没有很大的收获,反而会再次阅读,挑选我认为值得记录的语句,然后笔记或者发博文,这无形中浪费了很多阅读时间。

解决方法就是在快速浏览后,添加一个 Question 动作,记下你想从这篇文章中了解到问题,带着问题进行阅读,这样阅读完一遍就能完成拆解,更有效率

分享 Deta Surf 邀请链接

2025-03-07
Deta Surf 是一款默默无闻的 AI 浏览器,类似 Arc,但 AI 集成体验好很多
目前还在公测中,昨天(3月6号)刚放出的邀请功能,可至多邀请5位,先到先得咯
>> 邀请链接 <<
ps: 激活后你也可以在设置里创建邀请链接哈,欢迎在下方留言共享

XONSH:Python 驱动的 shell

2025-03-07
Xonsh 是一款现代、全功能、跨平台的 Python shell。它的语言是 Python 3.6+ 的超集,并添加了 Bash 和 IPython 中常用的shell命令。它适用于所有主流系统,包括 Linux、OSX 和 Windows。Xonsh 适合专家和新手日常使用

简单说就是 Xonsh = Python + Bash + IPython command
说实在的,我无法想象会有多少脏活累活要做,这工作量有点恶心。。。。敬佩开发者

QwQ-32B是最具性价比的模型

2025-03-07
阿里巴巴这次发布的 QwQ-32B 模型意义重大,一个可以直接在 macbook 上运行的推理模型,想不到来的这么快!

话不多说,我直接将上次只有 o3-mini 通过测试的代码问题在官方的 Chat 中进行测试。
首先为了对比,我使用前千问的最强模型 Qwen2.5-Max 进行测试,不出意外,掉入陷阱。
然后使用 QwQ-32B 进行测试,完美解决,成功指出了代码中隐性逻辑,避开了陷阱:
经过仔细检查,代码是正确的,没有发现错误。以下是验证过程的总结:

### 代码逻辑分析
1. **初始条件检查**:
   ```ruby
   return false unless publish? && send_newsletter?
   ```
   - 此条件确保只有当文章状态为发布(`publish?`)且 `send_newsletter` 为 `true` 时,才会继续后续检查。这符合注释中提到的发送邮件的条件。

2. **状态变化检查**:
   ```ruby
   became_published = saved_change_to_status? && status_previously_was != "publish"
   ```
   - 此条件判断文章状态是否从非发布状态变为发布状态。若满足,则 `became_published` 为 `true`。

3. **最终返回逻辑**:
   ```ruby
   became_published || saved_change_to_send_newsletter?
   ```
   - 如果文章状态从非发布变为发布(`became_published` 为 `true`)或 `send_newsletter` 从 `false` 变为 `true`(`saved_change_to_send_newsletter?` 为 `true`),则返回 `true`,触发邮件发送。

---

### 可能的疑问点
- **新建文章时 `saved_change_to_status?` 的行为**:
  - 在 Rails 中,新记录的 `saved_change_to_status?` 会返回 `true`(因初始值为 `nil`),因此案例4的条件会被正确触发。

- **`send_newsletter` 未变化时的处理**:
  - 代码确保只有在 `send_newsletter` 变为 `true` 或状态变为发布时才触发,未变化时返回 `false`,符合注释要求。

---

### 结论
代码逻辑完全符合注释中的描述和案例要求,**未发现错误**。所有条件和案例均被正确覆盖。

正如 @karminski3 所说的,QwQ-32B 是目前我们单机能部署的最具性价比的模型了!
心动了,是时候攒钱换 Mac Studio 了


DiffRhythm 模型

2025-03-06
国内的 ASLP-Lab 推出的开源音乐生成模型 DiffRhythm,只需提供歌词和音乐风格片段,就可以生成一首完整带人声的音乐,支持中英文,虽然人声还有点电音感,但整体效果相当可以了。
官网下方有Demo,我的音乐梦指日可待了!

我的英语学习之旅小结

2025-03-06
为什么要写这篇博文呢?
因为我在连续学习了66天后,学习的动力和欲望开始降低,且进步效果并不明显(毕竟只有66天,才刚刚开始)
所以我需要给自己一个交代,记录下学习的痕迹,否则真的要交代在这了。

我的学习方法其实很简单,那就是大量的英语阅读和听力,使用的软件是 LingQ,以下是我的学习进度统计:
LingQ Stats

总共阅读了 20.4 万字,其中认识的单词有 7501 个,标记了 3174 个新单词,学习了 51 个新单词。
阅读时间总共是 71 小时,平均每天 1 小时。
听力时间总共是 22.7 小时,平均每天半小时。

综上,看似学习了 66 天,其实时间也就 71 + 22.7 = 93.7 小时,也就近 4 天左右的时间,也难怪效果不明显。
但值得表扬的是,2025年到目前为止,每天都抽出时间学习英语,包括周末,慢慢养成了这个习惯。

所以我接下来应该要做的事:
1. 争取每天 2 小时在英语学习上
2. 要多听,最好能每天 1 小时的听力时间
3. 尽量少“坚持”,多样化去学习,多找些有趣的文章去看

期待下一次小结能有所进步

填坑记: Active Storage 图片在邮件中的显示问题

2025-03-05
今天在发送 Newsletter 时,发现邮件中的图片破损无法显示,很奇怪,因为相关代码是照搬 rss 的生成代码的:
article.content.to_s
content 是富文本,所以 to_s 是 html 代码,但 rss 阅读器就可以显示图片,但邮件里却无法显示图片。

于是,我打开浏览器的开发者工具查看,发现了端倪:
rss 阅读器的图片地址是绝对地址,所以能正确解析:
rss-img

邮件里的地址是相对地址,所以解析到了邮箱服务商的主机:
newsletter-img

但代码一样,为什么结果不一样呢,随即我查看了博客生成的 feed 文件,发现生成的 img 地址也是相对地址:
feed-xml

所以,结果很明显,众多的 rss 阅读器自动对相对地址补充了主机信息,避免了类似的问题。

既然找到了问题,那么解决方案就是,直接修改 active storage blob 的 html 模版代码,添加主机信息即可:
# 修改前:
<%= image_tag url_for(blob) %>
# 修改后:
<%= image_tag "#{site_settings[:url]}#{url_for(blob)}" %>
完成。

给博客添加网站分析功能

2025-03-05
前两天刚说要给博客加功能,这不就来了嘛,内置了基础的网站分析功能,并可公开访问
大部分博主几乎都是使用第三方的网站分析,比如 Google Analytics、 Plausible、Umami、Posthog、Matomo 等。
但有几个问题比较难解决:
1. 需要加载第三方的 js 代码
2. 如果安装了类 uBlock 插件,则脚本会被阻止
3. 隐私和维护问题

综上,在VersunCMS上集成该功能刻不容缓,所幸有一个针对 Rails 编写的网站分析包:ankane/ahoy,非常简易好用,步骤如下:
1. 添加包到 Gemfile
gem "ahoy_matey"
然后执行命令安装
bundle install
rails generate ahoy:install
rails db:migrate
2. 添加事件跟踪代码到 app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  after_action :track_action
 #.....
  protected

  def track_action
    ahoy.track "Viewed", request.path_parameters
  end
3. 添加 Analytics 控制器
rails g controller analytics index
控制器代码如下
class AnalyticsController < ApplicationController
  def index
    @total_visits = Ahoy::Visit.count
    events = Ahoy::Event.where(name: "Viewed").where("properties->>'slug' IS NOT NULL")

    # 统计访问量并按数量排序,只取前10篇
    visits_count = {}
    events.each do |event|
      visits_count[event.properties] ||= 0
      visits_count[event.properties] += 1
    end
    @visits_by_path = visits_count.sort_by { |_, count| -count }.first(10).to_h

    @referrers = Ahoy::Visit.group(:referrer)
                            .count
                            .reject { |k, _| k.nil? }
                            .sort_by { |_, count| -count }
                            .to_h

    @browsers = Ahoy::Visit.group(:browser)
                           .count
                           .sort_by { |_, count| -count }
                           .to_h

    @operating_systems = Ahoy::Visit.group(:os)
                                    .count
                                    .sort_by { |_, count| -count }
                                    .to_h

    @devices = Ahoy::Visit.group(:device_type)
                          .count
                          .sort_by { |_, count| -count }
                          .to_h
  end
end
4. 修改视图文件 app/views/analytics/index.html.erb
<h3>Website Analytics</h3>
<div class="total-visits">
  <h4>Total Views: <%= @total_visits %></h4>
</div>
<div style="display: flex; justify-content: space-between;">
  <div>
    <p>Pages</p>
    <% @visits_by_path.each do |path_data, count| %>
        <%= count %> <>
        <%= path_data['slug'] %><br>
    <% end %>
  </div>
  <div>
    <p>Referrers</p>
    <% @referrers.each do |referrer, count| %>
        <%= count %> <>
        <%= referrer %><br>
    <% end %>
  </div>
</div>
<hr>
<div style="display: flex; justify-content: space-between;">
  <div>
    <p>Browsers</p>
    <% @browsers.each do |browser, count| %>
        <%= count %> <>
        <%= browser %><br>
    <% end %>
  </div>
  <div>
    <p>OS</p>
    <% @operating_systems.each do |os, count| %>
      <%= count %> <>
      <%= os %><br>
    <% end %>
  </div>
  <div>
    <p>Devices</p>
    <% @devices.each do |device, count| %>
      <%= count %> <>
      <%= device %><br>
    <% end %>
  </div>
</div>
最后将 analytics 的路径添加到 routes 文件里即可
get "/analytics" => "analytics#index"
效果如下,非常简朴,但个人使用,就不追求样式了
https://versun.me/analytics