<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>spike76 (spike76)</title>
    <link>https://ruby-china.org/spike76</link>
    <description>Read the god damn error message!</description>
    <language>en-us</language>
    <item>
      <title>运动级回旋镖指南</title>
      <description>&lt;p&gt;我经常在 v 站上看到类似这样标题的贴子：＂大家一个人的时候都在干什么＂，＂放假一个人无聊怎么办＂，＂有什么适合社恐的运动＂，＂如何给自己培养个爱好＂．当你有这样的思考时，不妨考虑下运动级回旋镖．开胃视频，Big U 演示&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/ieBg_5s1B9I" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="注意危险"&gt;注意危险&lt;/h2&gt;
&lt;p&gt;运动级回旋镖的材料通常比较硬，有一定的危险性，因此要求玩的场地中人够少，保证飞行轨迹内都无人最好。我自己接镖时都被打断过几次指甲。&lt;/p&gt;
&lt;h2 id="看起来很简单"&gt;看起来很简单&lt;/h2&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=1Wy4y1373m" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;
即使我把所有的技巧告诉他们，很多人也协调不了自己的肌肉和神经，出手不让镖撞地已经超过三分之一的人了，不冲高俯冲已经超过 80% 的人。&lt;/p&gt;

&lt;p&gt;也许有人还觉运动量不是很大，不够锻炼人。就我教人的经验来说，成年男玩家玩一只 20 米的入门镖，不超过 30 分钟手臂会很累，大部分人在十投之内肩膀就会有些累了。我自己有一只 60 米级别的木镖，也是唯一一支我需要助跑玩的镖，冬天大概 10 分钟左右就能玩出汗。&lt;/p&gt;

&lt;p&gt;关于演示视频中的人，Serge Paulin, 是顶级玩家，也是镖界的收藏家，准头很高，技巧满级。其实视频中他已经跳步拧腰了，说明已经开始用腰力了，普通玩家很难驾驭这种镖。&lt;/p&gt;
&lt;h3 id="基本技巧"&gt;基本技巧&lt;/h3&gt;
&lt;p&gt;极简说明一下回旋镖的基础技巧，仅供参考。实际上买正儿八经的回旋镖，都会给你说明手册。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;手腕发力，加速旋转&lt;/li&gt;
&lt;li&gt;投掷时竖直略带倾角，倾角 (投掷时镖身与垂直线的倾斜角度) 通常在 0~30 度之间，具体需要看镖和风力调整，当倾角过大时镖会窜高，过小时会提前坠地&lt;/li&gt;
&lt;li&gt;仰角 (出手位置与水平线的夹角), 通常在 0 ~ 15 之间，具体看镖&lt;/li&gt;
&lt;li&gt;风角，通常是迎风向右 40~80 度，具体看风的大小和镖的落点调整，风大减少风角
一般人经常犯的错误就是横着投，这时倾角过大，镖的升力会很大，于是就会导致镖快速冲高，然后耗尽动力再俯冲坠地，容易导致镖的损坏，也容易伤人。镖的飞行轨迹的漂亮与否在于是否飞得足够圆，漂亮的轨迹同时意味着滞空时间长，落点容易预判，最终的滑翔速度平稳，容易接住。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="关于"&gt;关于"运动级"&lt;/h2&gt;
&lt;p&gt;这个词其实是相对于"玩具镖"来说的，即淘宝上经常看到的泡沫三页，或者一些塑料材质的镖，通常距离近 (10 米内), 不需要太大力气。我经常在广场或者草地上看见小孩子玩，遗憾的是，即使是玩具镖，90% 的人也不太会玩。对于运动级的镖，也有不同的种类，常见的"澳圆"类型，距离在 20 ~ 50m 之间。材质一般是航空木，也有特种玻璃和碳做的，无论哪种材质，都需要足够的力气和技巧，同时都有一定的危险性。&lt;/p&gt;
&lt;h2 id="回旋镖的主要类型(根据比赛类型来划分)"&gt;回旋镖的主要类型 (根据比赛类型来划分)&lt;/h2&gt;&lt;h3 id="澳洲圆(简称"&gt;澳洲圆 (简称"澳圆")&lt;/h3&gt;
&lt;p&gt;国内能买到的镖基本都属于这个类型，各种距离都有 (国内一般是 20~50, 国外有更远的), 相对与其他类型更简单，很适合娱乐 . 先给几个视频&lt;/p&gt;

&lt;p&gt;马拉松（g11 玻璃)&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1ft4y1w7xZ" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&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/QDRZelKbGSg" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&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/I8JusWv4P6M" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;其实要把 50 米这个级别的镖投出大圆的轨迹是挺难的 (其中蜻蜓 2 号是 70 的级别，马拉松更远), 通常会用到腰胯的力量，投掷时会把半边身体甩出去。准头不够还需要预判落点，跑步拦截。这个距离的镖一旦接住成就感爆棚。大部分初学者在前期练镖的时候都不是手累，而是腿累，就是因为需要不断跑动接镖。&lt;/p&gt;
&lt;h3 id="速接(fast catch)"&gt;速接 (fast catch)&lt;/h3&gt;
&lt;p&gt;速接赛规则就是在 20 米的圆内最短时间内完场五次投接。因此这类镖距离近，速度快。但非常吃力，给一个速接练习镖的视频：&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//player.bilibili.com/player.html?bvid=1D34y1g74C" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt; 
我自己玩速接比较少，一是因为很费腰力，二是我不爱带手套，接镖容易怂。大家可能看着视频里不咋快，真自己上场了，镖撞过来需要莫大的勇气伸手去接的。&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/XbYb_bXrqtQ" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="MTA(最长滞空时间)"&gt;MTA(最长滞空时间)&lt;/h3&gt;
&lt;p&gt;特点是往上扔，滞空时间从几十秒到几分钟不等，夏天遇上热气流能在地上追镖几分钟。视频看起来很简单，实际很难，出手失误眼睛没跟上的话镖就看不见了：&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/1z14FVv2T0M" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="LD(长距离)"&gt;LD(长距离)&lt;/h3&gt;
&lt;p&gt;距离在 90 米~150+, 一般都是钩子形状，非常难，由于太远视频里几乎看不见。&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/44B048cxYAg" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="其他"&gt;其他&lt;/h3&gt;
&lt;p&gt;除了以上几种，回旋镖里还有耐力镖，花式镖，和杂耍镖，很多都能能从澳圆镖和速接镖中衍生出来，所以不做详细介绍。&lt;/p&gt;
&lt;h2 id="镖的调节(tune)"&gt;镖的调节 (tune)&lt;/h2&gt;
&lt;p&gt;这是个挺高级的概念，这里只做简要介绍。指的是用简易方法来改装镖，比如向上或向下掰动镖翼，从而修改镖翼的二面角，改变镖的轨迹; 拧转镖翼，可以减小或增大镖的升力。在镖翼上配重，增加镖的抗风性能。其他还有诸如打孔，开槽等方式也有效果，但不可逆。顺带提一嘴，有一种低空镖，飞行轨迹极低，甚至有时能贴地飞行，就可以靠 tune 实现。&lt;/p&gt;
&lt;h2 id="回旋镖在国内外的发展状况"&gt;回旋镖在国内外的发展状况&lt;/h2&gt;
&lt;p&gt;"锅比碗大"(简称"锅大") 在 20 年前把回旋镖运动引入的国内，是国内的第一家镖店。这 20 年来虽然有了一批核心镖友，但依然是一门非常冷门的运动，我在锅大的售后群里观察下来，感觉国内会玩的不会超过一千号人。一个是场地原因，国内非常难找足够大且人少的场地。另一个运动门槛，一只 20 米的入门镖，即使有说明书 (国内的镖店都会送简易说明书), 但在没人指导的情况下，大部分人在前两天的训练中就会放弃。三就是推广不够了，我遇到过相当一部分人从来没听说过"回旋镖", 还有很多人是只见过儿童镖，认为回旋镖只是一种儿童玩具，从来没有想过会有飞那么远的镖存在。&lt;/p&gt;

&lt;p&gt;我自己也在脸书的回旋镖群组混，观察下来的结果是，欧美，印度，印尼，巴西玩的人要比国内玩的多很多，大佬级别的人物非常多。B 站回旋镖播放最多的视频就是 Logen 的表演视频，印度那边有的高中甚至会教回旋镖，印尼和巴西的一些老哥也做非常有特色的镖。&lt;/p&gt;
&lt;h2 id="镖店"&gt;镖店&lt;/h2&gt;
&lt;p&gt;目前淘宝上有三家自己做镖的店：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;锅比碗大。公认的国内第一，无论是上漆，用料，还是飞行轨迹，性能，都是上乘，可供选择镖型也多，还有国内唯一的自产 fast catch. 唯一的劣势是价格，比其他的店贵一到两倍。&lt;/li&gt;
&lt;li&gt;澳洲风情。便宜，飞行轨迹不错，也有远款。硬伤是上漆。总之还是很有性价比&lt;/li&gt;
&lt;li&gt;云海盘龙。便宜，有些款外形很有特色，非常吸引人。但大部分距离偏近&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;还有一家专做进口镖生意的店 (咸鱼，淘宝同名，但很多货在咸鱼上):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;简单的真回旋镖。PP, g11 玻璃，航空碳，各种材质的镖都有。从 15 米，到 90 米的镖也有。在他这基本能找到适合各类玩家的镖。老板人很耿直，很好说话。他还是世界顶级碳镖制作者 James Hoy 的朋友，通过他买碳镖要比在 boomerangman 上便宜一截。我在玩的时候如果遇见一些感兴趣的新人，会推荐他店里的一些三页四页，便宜，轨迹不错，很容易上手，而且距离比玩具镖远很多&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="最后"&gt;最后&lt;/h2&gt;
&lt;p&gt;回旋镖目前在国内是一门非常小众的运动，基本只要会玩，就是这一行的元老了。另外，回旋镖对一般人，尤其是小朋友的吸引力真是巨大，我经常遇到一家四五口人围着站我旁边看，然后上来轮着问。最多一次是几个家庭十几个人围着观摩。还遇到好几次有些老哥跑过来，说这个是他小时候的梦想，特别想玩，拜托让他试试.......总之，只要会玩，基本就是场地上的最亮的仔了.
最后如果有感兴趣想看其他镖的效果的话，可以关注微信视频号"喵十三郎", 不定期更新自己的和国外大佬的玩镖视频。写完撒花，欢迎提问&lt;/p&gt;</description>
      <author>spike76</author>
      <pubDate>Fri, 16 Feb 2024 23:15:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/43589</link>
      <guid>https://ruby-china.org/topics/43589</guid>
    </item>
    <item>
      <title>又踩了个 open-uri 的坑，老库的 API 有时候真是摸不着头脑</title>
      <description>&lt;h3 id="遭遇的问题"&gt;遭遇的问题&lt;/h3&gt;
&lt;p&gt;ruby 2.7，一段简单的代码，用 open-uri 通过代理去请求百度。此时运行正常&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"open-uri"&lt;/span&gt;
&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://www.baidu.com"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;proxy: &lt;/span&gt;&lt;span class="s2"&gt;"your_proxy"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当我想加个 user-agent 的请求头时，自然很容易想到在 open 里再加个选项，变成&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"open-uri"&lt;/span&gt;
&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://www.baidu.com"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;proxy: &lt;/span&gt;&lt;span class="s2"&gt;"your_proxy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"User-Agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"new_agent"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时报错：&lt;code&gt;ArgumentError (unrecognized option: User-Agent)&lt;/code&gt;
很早之前我就用 open-uri 做过一样的功能，当时确实成功修改了 User-Agent，为啥这次不行了勒。难道还跟大小写有关？？？&lt;/p&gt;
&lt;h3 id="处理过程"&gt;处理过程&lt;/h3&gt;
&lt;p&gt;先看看 api 文档，方法签名是这样的&lt;code&gt;open(*rest, &amp;amp;block)&lt;/code&gt; ，感觉这个签名没啥有用的信息，完全摸不着头脑。。。于是直接看源码，找到了这个&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;OpenURI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_options&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# :nodoc:&lt;/span&gt;
  &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="no"&gt;Symbol&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;
    &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="no"&gt;Options&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;k&lt;/span&gt;
      &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"unrecognized option: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;Options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;:proxy&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:proxy_http_basic_authentication&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;太长省略&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当 options 的键是 Symbol 时，会检查该键是否在 Options 定义的内容中。推断把键改成 String 应该就 ok 了，于是写成这样&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://www.baidu.com"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;proxy: &lt;/span&gt;&lt;span class="s2"&gt;"your_proxy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"User-Agent"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"new_agent"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;果然不报错了。。。这里的选项根据键的类型分成了两类，Symbol 类的有功能意义，String 类的会被当做 http 的 header。这种特性应该会在文档里有表述，于是又回头看文档，找到了这句话&lt;code&gt;Each option with a string key specifies an extra header field for HTTP. I.e., it is ignored for FTP without HTTP proxy. The hash may include other options, where keys are symbols&lt;/code&gt;
是我大意了啊&lt;/p&gt;
&lt;h3 id="为什么是“又”"&gt;为什么是“又”&lt;/h3&gt;
&lt;p&gt;因为之前就踩过另一个 open-uri 的坑，线下多次用 open 请求不同的图片文件，都返回的是 Tempfile 对象，于是按文件对象继续处理。上线运行一段时间，报错：StringIO 对象没有某某方法。原来 open 在请求小文件的时候返回 StringIO 对象。。。这个特性我都没有找到对应的文档&lt;/p&gt;</description>
      <author>spike76</author>
      <pubDate>Tue, 06 Jul 2021 20:42:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/41455</link>
      <guid>https://ruby-china.org/topics/41455</guid>
    </item>
    <item>
      <title>使用条件请求，服务器日志显示返回 200，但客户端接收为 304</title>
      <description>&lt;p&gt;一段很简单的代码 (rails 6)&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
    &lt;span class="vi"&gt;@subjects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stale?&lt;/span&gt; &lt;span class="vi"&gt;@subjects&lt;/span&gt;
      &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;plain: &lt;/span&gt;&lt;span class="s1"&gt;'stale'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行&lt;code&gt;curl -i 'http://127.0.0.1:3000/'  -H 'If-None-Match: W/"bfd6f8bb9d7c5c210ab13b06a5cfcde1"' -H 'If-Modified-Since: Thu, 02 Apr 2020 08:01:57 GMT' --compressed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;由于 if-modified-since 时间早于&lt;a href="/subjects" class="user-mention" title="@subjects"&gt;&lt;i&gt;@&lt;/i&gt;subjects&lt;/a&gt;中最大的 updated_at, 所以会执行&lt;code&gt;render plain: 'stale', status: 200&lt;/code&gt;，IDE 中看到日志也是&lt;code&gt;Completed 200 OK in 15ms&lt;/code&gt;
，断点执行 response.status 返回也是 200，但 curl 中的响应结果却是 304，如下&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 304 Not Modified
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
ETag: W/"bfd6f8bb9d7c5c210ab13b06a5cfcde1"
Last-Modified: Fri, 03 Apr 2020 02:06:29 GMT
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: a42b9511-1df3-490b-8230-f6400fa92d1b
X-Runtime: 0.515872
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 charlse 抓包确实是 304。&lt;/p&gt;

&lt;p&gt;但如果把&lt;code&gt;render plain: 'stale', status: 200&lt;/code&gt;中的 status 改为 201 或其他值，同样的 curl 请求返回的结果就是设置的值。&lt;/p&gt;

&lt;p&gt;想不通。求助大佬们&lt;/p&gt;</description>
      <author>spike76</author>
      <pubDate>Fri, 03 Apr 2020 11:18:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/39697</link>
      <guid>https://ruby-china.org/topics/39697</guid>
    </item>
    <item>
      <title>类 extend module 后，类变量的查询问题</title>
      <description>&lt;p&gt;昨天遇到的一个奇怪的问题，一直搞不清楚原因。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Foo&lt;/span&gt;
  &lt;span class="vc"&gt;@@foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'foo'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;显示[:@@foo]&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variable_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"@@foo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="c1"&gt;#报错: uninitialized class variable @@foo in #&amp;lt;Class:A&amp;gt; (NameError)  Did you mean?  @@foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么 class_variables 都能看到&lt;code&gt;@@foo&lt;/code&gt;变量，但&lt;code&gt;class_variable_get&lt;/code&gt;却拿不到，而且错误信息中的 &lt;code&gt;Did you mean?  @@foo&lt;/code&gt;也说明内部确实有&lt;code&gt;@@foo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;将代码改成&lt;code&gt;A include Foo&lt;/code&gt;后，&lt;code&gt;A.singleton_class.class_variables&lt;/code&gt;返回空数组，但&lt;code&gt;A.singleton_class.class_variable_get("@@foo")&lt;/code&gt;却能返回 foo&lt;/p&gt;</description>
      <author>spike76</author>
      <pubDate>Mon, 16 Mar 2020 16:05:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/39618</link>
      <guid>https://ruby-china.org/topics/39618</guid>
    </item>
  </channel>
</rss>
