<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>FinnG (printfinn)</title>
    <link>https://ruby-china.org/FinnG</link>
    <description>软件工程师</description>
    <language>en-us</language>
    <item>
      <title>使用 Rails 制作了一个任天堂 Switch 价格追踪网站</title>
      <description>&lt;p&gt;上个月做的&lt;a href="https://ruby-china.org/topics/42477" title=""&gt;Steam 价格追踪&lt;/a&gt;, 这次又花了几周的时间把 Switch 的价格追踪也做了。&lt;/p&gt;

&lt;p&gt;相较于 Steam 的折扣追踪，Switch 这边用了&lt;code&gt;Shrine&lt;/code&gt;做的文件存储 (主要是游戏主图的 variants) 和图片处理，相较于 Active Storage, Shrine 更灵活，更可定制，比如可以做出像&lt;code&gt;/ns_apps/1/image/small-w320.webp&lt;/code&gt;这种漂亮的文件 URL.&lt;/p&gt;

&lt;p&gt;用了&lt;code&gt;pagy&lt;/code&gt;做分页，比之前的 Kaminari 快了，尤其是没有多次查 COUNT.&lt;/p&gt;

&lt;p&gt;任天堂的区分的比较散，不像 Steam 那种可以有直接的 API, 需要 nokogiri 简单爬/解析一下内容，提取出 CODE 之后才能 API 查价，写爬虫和各个市场区交叉索引比较让人崩溃。&lt;/p&gt;

&lt;p&gt;由于网站内容比较简单，几乎没有写任何 JS, 即是是单个游戏的历史价格折线图，也是用了&lt;code&gt;chartkick&lt;/code&gt; gem, 如果没理解错，它里面实际上包了一个&lt;code&gt;chart.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.gametoget.com/ns_apps?locale=zh&amp;amp;ns_mkt=hk&amp;amp;page=1&amp;amp;steam_cc=us" rel="nofollow" target="_blank" title=""&gt;网址在这&lt;/a&gt; , 还欠缺许多功能比如愿望单和打折提醒之类的，喜欢打游戏的 Rails 开发者欢迎提建议&lt;/p&gt;</description>
      <author>FinnG</author>
      <pubDate>Mon, 25 Jul 2022 22:14:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/42549</link>
      <guid>https://ruby-china.org/topics/42549</guid>
    </item>
    <item>
      <title>用 Rails 做了一个追踪 Steam 游戏折扣的网站</title>
      <description>&lt;p&gt;Steam 夏促开始啦！这个月做了一个&lt;a href="https://www.gametoget.com/apps?locale=zh_cn&amp;amp;today_sales=true" rel="nofollow" target="_blank" title=""&gt;Steam 折扣追踪网站&lt;/a&gt;, 主要是用 Sidekiq 和 Faraday 从 Steam 获取价格信息，而后按照语言区域存储到 PostgreSQL 里。做多国分区和多语言支持用到了 Rails-i18n 以及很多 public_send, 目前支持国区、美区和日区。(阿根廷区和土耳其区快来了😂)&lt;/p&gt;

&lt;p&gt;网站有一个今日折扣的筛选，喜欢喜 +1 可以收藏这个页面。&lt;/p&gt;

&lt;p&gt;和 steamdb.info 相比，功能还差得很远，不过码起来很有意思&lt;img title=":laughing:" alt="😆" src="https://twemoji.ruby-china.com/2/svg/1f606.svg" class="twemoji"&gt; 现在基本上是全自动的从 Steam 获取数据。&lt;/p&gt;

&lt;p&gt;(已增加阿根廷、新西兰区支持)&lt;/p&gt;

&lt;p&gt;(增加了一个 Telegram Bot &lt;a href="https://t.me/gtgsteam_bot?do=open_link" rel="nofollow" target="_blank"&gt;https://t.me/gtgsteam_bot?do=open_link&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;(增加欧盟、英国、加拿大、澳大利亚区支持)&lt;/p&gt;</description>
      <author>FinnG</author>
      <pubDate>Fri, 24 Jun 2022 11:12:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/42477</link>
      <guid>https://ruby-china.org/topics/42477</guid>
    </item>
    <item>
      <title>使用 Sorcery 做用户 Authentication 视频小教程</title>
      <description>&lt;p&gt;被 Turbo 和 Devise 的搭配困扰了很久后学习了一下 Sorcery 这个 authentication 的 gem, 没有了 Devise 那么多开箱即用 (Turbo 以前) 的功能，但是也不会带来太多的麻烦。&lt;/p&gt;

&lt;p&gt;小教程基本是根据 Sorcery 里的 Wiki 的基本密码登录的&lt;a href="https://github.com/Sorcery/sorcery/wiki/Simple-Password-Authentication" rel="nofollow" target="_blank" title=""&gt;例子&lt;/a&gt;做的，自己在用的过程中补了一些小坑。&lt;/p&gt;

&lt;p&gt;这个例子还是 monolith 的 app, 如果要前后端分离的话还有其他工作需要做。&lt;/p&gt;

&lt;p&gt;这次换了一个不破音的麦克，而且加了中文字幕。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bilibili.com/video/BV1Tu411v7ce" rel="nofollow" target="_blank" title=""&gt;B 站链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=xBQZLTWI7ak" rel="nofollow" target="_blank" title=""&gt;油管链接&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;欢迎提建议讨论！&lt;/p&gt;</description>
      <author>FinnG</author>
      <pubDate>Sun, 10 Apr 2022 22:18:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/42289</link>
      <guid>https://ruby-china.org/topics/42289</guid>
    </item>
    <item>
      <title>用 Dokku 部署 Rails 应用简洁教程</title>
      <description>&lt;p&gt;以前在自己的内网树莓派上部署过几回 Rails 应用，控制家里的冰箱彩电洗衣机缝纫机旧电脑旧电视&lt;img title=":sweat_smile:" alt="😅" src="https://twemoji.ruby-china.com/2/svg/1f605.svg" class="twemoji"&gt; (主要是热水器和车库门以及一些传感器), 每个 pi 上都要装一遍 rbenv, 经历一系列部署的过程，实在太麻烦。&lt;/p&gt;

&lt;p&gt;在外网上就方便些，自己做的小项目以前一直都是用 Heroku 部署，但是访问量比较少，而且 Heroku 又比较贵，于是就把几个应用放到一个 VPS 上，用 Dokku 来部署，感觉很方便，从零开始也就十几行命令搞定，而且还能配置 HTTPS 的证书和 www&amp;lt;=&amp;gt;apex 的重定向，这点要比 Heroku 还方便，不必付 Heroku 的 7USD 才能拥有证书。在几次部署并查文档之后，自己终于做了一个记录，把最基本的步骤都写到了一起，不用再来回点文档看了。&lt;/p&gt;

&lt;p&gt;因为比较长，而且有代码块，就不全文复制了，想要看看的朋友可以点进去看看。&lt;a href="https://www.railsbay.com/tutorials/deploy-rails" rel="nofollow" target="_blank" title=""&gt;用 Dokku 部署 Rails 应用简洁教程&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;我听说过有的外国开发者在用 Dokku 部署后发生过一些性能问题，进而放弃了是用 Dokku, 不过我的 app 因为访问很少，还没遇到过，如果大伙用 Dokku 遇到了什么坑也欢迎聊聊。&lt;/p&gt;</description>
      <author>FinnG</author>
      <pubDate>Sat, 26 Mar 2022 10:15:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/42259</link>
      <guid>https://ruby-china.org/topics/42259</guid>
    </item>
    <item>
      <title>处理本地时间的小视频教程的第二部分: 为用户添加时区, 及在表单中自动填写用户本地时间</title>
      <description>&lt;p&gt;这个是上一贴&lt;a href="https://ruby-china.org/topics/42016" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/42016&lt;/a&gt;的第二部分，本部分讲了在 Devise user model 中添加一个用户时区，以及按照用户的时区，在生成 time select form 的时候自动按用户本地时间预填写时间。比较适合刚刚入门 Rails 的开发人员观看。Gorails 和 Railscast 都有讲过类似的问题，感兴趣的朋友也可以去搜搜几年前国外开发人员制作的相关视频。如果大家发现本视频有什么问题或错误欢迎指出👏!&lt;/p&gt;

&lt;p&gt;油管 (&lt;a href="https://www.youtube.com/watch?v=SgZInbo5PlY" rel="nofollow" target="_blank"&gt;https://www.youtube.com/watch?v=SgZInbo5PlY&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/SgZInbo5PlY" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;B 站 (&lt;a href="https://www.bilibili.com/video/BV1uF411B7iT" rel="nofollow" target="_blank"&gt;https://www.bilibili.com/video/BV1uF411B7iT&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1uF411B7iT" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;不知道这个 Bose 的蓝牙耳麦为什么老有点小破音，真要搞个好点的麦克了。&lt;/p&gt;</description>
      <author>FinnG</author>
      <pubDate>Wed, 22 Dec 2021 21:23:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/42020</link>
      <guid>https://ruby-china.org/topics/42020</guid>
    </item>
    <item>
      <title>做了一个简单的小视频介绍如何在 View 里显示 local_time 本地时间</title>
      <description>&lt;p&gt;学 Rails 1 年多以来第一次做教学分享小视频，local_time 这个 gem 已经被大家介绍很多次了，很好用很方便。这个视频介绍了 Rails 中遇到的与 local time 和 time zone 相关的小问题，本视频是第一部分，介绍了在 view 里按浏览器本地设置显示时间，而不是以 UTC+0 时区显示的方法。显示 local time 适合 web app 有来自世界各地用户的情况，如果只有本地使用，就只设置 Rails 的 default time zone 就可以了。&lt;/p&gt;

&lt;p&gt;油管：&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/6zZKSyB7Rc0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;B 站：&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1a44y1J7JU" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;(看不见视频可点链接&lt;a href="https://www.youtube.com/watch?v=6zZKSyB7Rc0" rel="nofollow" target="_blank"&gt;https://www.youtube.com/watch?v=6zZKSyB7Rc0&lt;/a&gt;, 或 B 站：&lt;a href="https://www.bilibili.com/video/BV1a44y1J7JU/" rel="nofollow" target="_blank"&gt;https://www.bilibili.com/video/BV1a44y1J7JU/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;还有第二部分 (虽然这个 thoughtbot 已经写过文章了): 在 devise user model 里加入 time_zone 属性，生成 datetime_select 选单的时候自动按用户的时区设置预填充; 以及第三部分，时间的 i18n. 这两部分过两天有空了再做 (已做&lt;a href="https://ruby-china.org/topics/42020" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/42020&lt;/a&gt;). 欢迎大家多提建议！&lt;/p&gt;

&lt;p&gt;视频剪辑用的 iMovie, 也是头一次用，声音可能有点忽大忽小，过两天买个单独的电容麦试试.&lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;如果 local_time gem 有坑也欢迎大家一起来讨论，我是在上周 DHH 发的 Rails 7 blog 的视频中看到他用了这个 gem 才想起来试一试。&lt;/p&gt;</description>
      <author>FinnG</author>
      <pubDate>Tue, 21 Dec 2021 22:55:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/42016</link>
      <guid>https://ruby-china.org/topics/42016</guid>
    </item>
  </channel>
</rss>
