<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>oatw (oatw)</title>
    <link>https://ruby-china.org/oatw</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>都 2025 年了还在 Google Adsense 搞小破站，是不是有点儿毛病？</title>
      <description>&lt;p&gt;两个月前搞了一个工具站，因为内容不够丰富，放在 Google Adsense 一直没过审。本来都打算放弃了，今早打开一看，竟然审批过了！&lt;/p&gt;

&lt;p&gt;小破站大概长这样：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apeneer.com" rel="nofollow" target="_blank"&gt;https://apeneer.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apeneer.com/random-generators/animal/" rel="nofollow" target="_blank"&gt;https://apeneer.com/random-generators/animal/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;那么问题来了，2025 年搞工具站还有得赚吗？&lt;/p&gt;

&lt;p&gt;同类产品 SEO 是不是早就抢占饱和了呀？搞长尾低频关键词是不是有生之年也出不了头啊？不搞 SEO 有啥稳定获得自然流量的推广方式呢？&lt;/p&gt;

&lt;p&gt;研究表明 AI 搜索平均减少了近 30% 的自然流量，我是不是该早弃坑，免得浪费生命呀？&lt;/p&gt;

&lt;p&gt;想跟有经验的老哥取取经，谢谢。&lt;/p&gt;</description>
      <author>oatw</author>
      <pubDate>Wed, 02 Jul 2025 10:32:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/44208</link>
      <guid>https://ruby-china.org/topics/44208</guid>
    </item>
    <item>
      <title>社区里的伙伴们有没有在 upwork 上发展的，或者说有这个打算的？</title>
      <description>&lt;p&gt;伙伴们，大家还好吗？身体可安康？心情可美丽？&lt;/p&gt;

&lt;p&gt;回顾自己上班这么多年好像都是为了活着而活着，毕竟只是个小屁民，可腾挪的空间有限。晃晃悠悠许多年，如今岁数也算不小了，慢慢也开始明白自己想要什么样的生活了。&lt;/p&gt;

&lt;p&gt;年前年后一直在考虑做 freelancer 的事情，自认为英文的交流还凑合，所以目前想到 upwork 上试试，也做好了长期吃土的心理准备。介于之前这方面的经验仅限于朋友间拉扯的私活，对一些比较能长期运作下去的方式缺乏经验，所以希望能和社区里有这方面想法的伙伴们随便聊聊，互相启发，当然，如果有大佬愿意指点就更万分感谢了。或者，觉得这路子不靠谱的大佬们，也请来打醒我。&lt;/p&gt;</description>
      <author>oatw</author>
      <pubDate>Mon, 17 Feb 2020 20:28:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/39510</link>
      <guid>https://ruby-china.org/topics/39510</guid>
    </item>
    <item>
      <title>ActiveResource 真的是不太好用啊</title>
      <description>&lt;p&gt;如题，大佬们如果有空随便聊聊使用体会吧，分享点经验。
或者都没人用了？感觉官方的维护好像也不是很积极啊，开了个&lt;a href="https://github.com/rails/activeresource/issues/318" rel="nofollow" target="_blank" title=""&gt;issue&lt;/a&gt;，一直都没人理唉～&lt;/p&gt;</description>
      <author>oatw</author>
      <pubDate>Wed, 16 Oct 2019 17:30:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/39159</link>
      <guid>https://ruby-china.org/topics/39159</guid>
    </item>
    <item>
      <title>非计算机专业程序员补习基础，求推荐书籍。</title>
      <description>&lt;p&gt;各位大佬好！&lt;/p&gt;

&lt;p&gt;我是一个菜鸟程序员，作为非科班出身，自学转行的半吊子，希望能系统的补习一下基础知识。&lt;/p&gt;

&lt;p&gt;这两天在看算法方面的书籍，但是像《算法导论》这样的大砖头真心啃不动，于是先看了一遍《算法图解》，但又感觉太过入门，不够系统，浪费了挺多时间。&lt;/p&gt;

&lt;p&gt;希望有经验的大佬指条明路，推荐一些适合非科班选手&lt;strong&gt;入门 + 进阶&lt;/strong&gt;的图书，能&lt;strong&gt;系统地补习&lt;/strong&gt;一下基础知识。&lt;/p&gt;

&lt;p&gt;个人理解至少需要补习的方向有：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;计算机基础&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据结构 + 算法&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;设计模式&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;......&lt;/p&gt;

&lt;p&gt;请大佬们帮&lt;strong&gt;补充方向 + 列书单&lt;/strong&gt;，跪拜！&lt;/p&gt;</description>
      <author>oatw</author>
      <pubDate>Fri, 19 Jul 2019 16:20:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/38861</link>
      <guid>https://ruby-china.org/topics/38861</guid>
    </item>
    <item>
      <title>在画 Ruby 对象继承关系图时没想通 Kernel singleton_methods 存在的目的还有使用场景，求指点！</title>
      <description>&lt;p&gt;自己画了一个图来表示 Ruby 中对象的继承关系，不确定是不是有疏漏和不正确的地方，路过的前辈如果有空，麻烦帮小弟看看，提前谢过！&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/87db76e2-9df8-4228-98bf-034b29b53636.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;另外，在画这个图的过程中有一个问题没想明白，想请教一下：&lt;/p&gt;

&lt;p&gt;Kernel 定义了很多便利的 instance methods，可以在对象内部或全局作用域下（也是对象内部，只不过是 Object 内部）通过祖先链查找到进行调用，但是我看到 Kernel 还定义了很多 singleton methods，并且和 instance methods 方法名是一样的，比如&lt;code&gt;print&lt;/code&gt;,在继承关系中这些 singleton_methods 貌似是孤立的，在不用其他方式修改 self 的指向时应该只能通过 Kernel.xxx 的形式来调用吧，难道只是为了多提供一种方式来调用类似&lt;code&gt;print&lt;/code&gt;这样的方法？还请了解的大佬帮助指点迷津，介绍下 Kernel 中这些与 instance methods 重名的 singleton methods 存在的意义和使用场景，非常感谢！&lt;/p&gt;

&lt;p&gt;如下是我简单打印的 Kernel 中命名一样的 instance methods 和 singleton methods:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;instance_methods_in_kernel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;private_instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;public_instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;singleton_methods_in_kernel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;singleton_methods_in_kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt; &lt;span class="n"&gt;method_name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;methods_with_the_same_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;instance_methods_in_kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;methods_with_the_same_name&lt;/span&gt; 

&lt;span class="c1"&gt;# =&amp;gt; &lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="ss"&gt;:sprintf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:Array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:Hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:warn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:local_variables&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:require_relative&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:autoload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:autoload?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:raise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:fail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:global_variables&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:__method__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:__callee__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:__dir__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:binding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:require&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:URI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:eval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:iterator?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:block_given?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:catch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:throw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:loop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:Rational&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:Complex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:trace_var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:untrace_var&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:at_exit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:set_trace_func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:select&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:caller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:caller_locations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:fork&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:exit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:sleep&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:gets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:proc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:lambda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:load&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:exec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:exit!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:spawn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:abort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:syscall&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:open&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:printf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:print&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:putc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:puts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:readline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:readlines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:rand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:srand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="ss"&gt;:trap&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>oatw</author>
      <pubDate>Mon, 08 Jul 2019 16:14:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/38810</link>
      <guid>https://ruby-china.org/topics/38810</guid>
    </item>
    <item>
      <title>Vultr 这家的云服务器怎么样，求指教！</title>
      <description>&lt;p&gt;各位大佬好！&lt;/p&gt;

&lt;p&gt;最近准备在外网部署一下自己的博客，基于 rails 开发。&lt;/p&gt;

&lt;p&gt;heroku 免费版给我的感觉有点鸡肋，收费版有点贵，linode 之类的还得绑定信用卡，一番搜索后发现了这个服务商 &lt;strong&gt;&lt;a href="https://www.vultr.com/" rel="nofollow" target="_blank" title=""&gt;vultr&lt;/a&gt;&lt;/strong&gt;，新用户注册会送 50 美元，支持微信支付，日本和新加坡也有机房，感觉比较适合。但是之前没用过它家，有没有大佬之前用过分享点感受，比如会不会被屏蔽，稳不稳定等等。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;或者有没有其他推荐的&lt;/strong&gt;，基本需求如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;不要备案&lt;/li&gt;
&lt;li&gt;不要绑定手机&lt;/li&gt;
&lt;li&gt;不要绑定信用卡&lt;/li&gt;
&lt;li&gt;可微信支付或支付宝支付&lt;/li&gt;
&lt;li&gt;支持 linux 系统，最好是 debian&lt;/li&gt;
&lt;li&gt;vps 也可以，反正个人博客主要还是自己看&lt;/li&gt;
&lt;li&gt;预算一年 200 到 350 人民币&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;谢谢！&lt;/p&gt;</description>
      <author>oatw</author>
      <pubDate>Thu, 13 Jun 2019 09:56:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/38637</link>
      <guid>https://ruby-china.org/topics/38637</guid>
    </item>
    <item>
      <title>昨晚 两 点才睡，就为了发布这个破玩意 (Luda - A lightweight and responsive UI framework for modern web development)</title>
      <description>&lt;p&gt;在这个 UI 框架满天飞的时代，我头脑发热自己也搞了一个。为啥非要自己开发一个呢？&lt;/p&gt;

&lt;p&gt;其实就是觉得有个自己的傍身利器可以省去一些定制开发 UI 的时间，符合自己的习惯和偏好。
毕竟，用不是自己开发的东西做定制，深入源码细节还是需要一些时间的，那一坨一坨的样式变量，望而生畏。。。
而且我特别不理解一些 UI 框架在模块化上的抉择，模块拆分的太过彻底，很多类似的样式都需要为不同的组件一遍一遍设置变量。。。&lt;/p&gt;

&lt;p&gt;自己平时工作中基本上都是 UI、前端一个人承包，公司前端也很缺，所以对那些定制费劲的 UI 框架真的是累觉不爱了，没那么多时间去吸收、跟进它们。
所以我就自己开发了一套，&lt;strong&gt;我清楚我开发的这个 UI 框架注定不会流行，因为融入了很多自己的习惯&lt;/strong&gt;，但我还是抱着试一试的心态在 0.1 版本的时候发了 hacker news,
从一些大神的回复中做了一些提升，就在昨晚，我自己折腾了半宿发了 0.2 版本。&lt;/p&gt;

&lt;p&gt;希望路过的大神们，如果有空的话，顺道瞟两眼，给点建议。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://oatw.github.io/luda/" rel="nofollow" target="_blank" title=""&gt;主页：https://oatw.github.io/luda/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/oatw/luda/" rel="nofollow" target="_blank" title=""&gt;Github: https://github.com/oatw/luda/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;嗯，如果有人感兴趣想试用，我的建议是，1.0 版本前不要用在正经项目中，不正经项目中最好也别用。。。&lt;/p&gt;

&lt;p&gt;谢谢！&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/9f07541a-8520-451c-8cc3-58b7c27b9428.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/585f7eeb-141b-464f-83eb-cf02b71332f7.jpg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>oatw</author>
      <pubDate>Fri, 31 May 2019 09:38:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/38593</link>
      <guid>https://ruby-china.org/topics/38593</guid>
    </item>
  </channel>
</rss>
