<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>bakadia (bakadia)</title>
    <link>https://ruby-china.org/bakadia</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>想做各种垂类“工作搭子”，有无推荐或合作</title>
      <description>&lt;p&gt;多年全栈+AI 应用，目前对公司产品升级已有一定成果，不过进度受限于各方面，推进缓慢。所以想参与行业/产品垂类 AI 工作助手 (简单理解：定制 workbuddy) 的研发。特来平台寻求一些资源，非广，支持青岛线下 PK，其他 xx 会议。&lt;/p&gt;

&lt;p&gt;您的收益：
1.了解前沿 ai 应用最新可能性
2.得到能负责产品全生命周期落地能力的伙伴
3.可能有一个 demo 和展示视频
4.更多深入沟通...&lt;/p&gt;

&lt;p&gt;我的收益：
1.提升代码架构和产品能力
2.开阔不同行业认知和前沿风景
3.更稳定/自由的未来选择&lt;/p&gt;

&lt;p&gt;最短路径：
1.如果你有想法，方便说一下在用但是不太好用的小网站 (大平台一般反扒很厉害，纯外部不太好桥接)
2.如果你有产品，可以私聊交流，尝试进行 AI 助手化，保密协议等都接受
3.如果你做产品，可以私聊交谈，对于 AI 应用有较高的经验，抉择避坑能提供一些建议&lt;/p&gt;</description>
      <author>bakadia</author>
      <pubDate>Wed, 21 Oct 2026 15:23:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/44728</link>
      <guid>https://ruby-china.org/topics/44728</guid>
    </item>
    <item>
      <title>微信小程序上传视频后台报错（invalid %-encoding）</title>
      <description>&lt;h2 id="报错信息"&gt;报错信息&lt;/h2&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;F, [2021-06-28T15:45:20.726228 #3647] FATAL -- : [2cfaf5da-b1a0-405b-b0df-2831808cef38] Rack::QueryParser::InvalidParameterError (invalid %-encoding ("file"; filename="file-1624866321926"
Content-Type: text/plain

 ftypisomisomiso2avc1mp4freey@mdatGVJ�\LC?���&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;C&lt;/span&gt;&lt;span class="err"&gt;�����=&lt;/span&gt; &lt;span class="err"&gt;��=%�&lt;/span&gt;
&lt;span class="err"&gt;$8{.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="err"&gt;��$&lt;/span&gt;&lt;span class="na"&gt;S&lt;/span&gt; &lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="err"&gt;�],��&lt;/span&gt;&lt;span class="na"&gt;n_A&lt;/span&gt;&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;P&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;W9&lt;/span&gt;&lt;span class="err"&gt;(�([&lt;/span&gt;&lt;span class="na"&gt;U&lt;/span&gt;&lt;span class="err"&gt;���&lt;/span&gt;&lt;span class="na"&gt;vM&lt;/span&gt;&lt;span class="err"&gt;�|�&lt;/span&gt;&lt;span class="na"&gt;Q&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;                          &lt;span class="err"&gt;���?�&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;�"&lt;/span&gt;
&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;d2&lt;/span&gt;&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="na"&gt;BOree&lt;/span&gt;&lt;span class="err"&gt;�'&lt;/span&gt;&lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="err"&gt;�����&lt;/span&gt;&lt;span class="na"&gt;z&lt;/span&gt;&lt;span class="err"&gt;�0�.5&lt;/span&gt;&lt;span class="na"&gt;J&lt;/span&gt;&lt;span class="err"&gt;����`�&lt;/span&gt;
&lt;span class="err"&gt;�&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;K&lt;/span&gt;&lt;span class="err"&gt;��&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="err"&gt;�����3�))&lt;/span&gt;&lt;span class="na"&gt;:J&lt;/span&gt;&lt;span class="err"&gt;�'&lt;/span&gt;
&lt;span class="na"&gt;F&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;[2021&lt;/span&gt;&lt;span class="na"&gt;-06-28T15:45:20.726312&lt;/span&gt; &lt;span class="na"&gt;#3647&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;FATAL&lt;/span&gt; &lt;span class="na"&gt;--&lt;/span&gt; &lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;query_parser.rb:72:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;rescue&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="na"&gt;parse_nested_query&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;query_parser.rb:60:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;parse_nested_query&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;request.rb:468:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;parse_query&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;rack&lt;/span&gt; &lt;span class="err"&gt;(2.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;rack&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;request.rb:343:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;POST&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="err"&gt;[2&lt;/span&gt;&lt;span class="na"&gt;cfaf5da-b1a0-405b-b0df-2831808cef38&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="na"&gt;actionpack&lt;/span&gt; &lt;span class="err"&gt;(5.0.1)&lt;/span&gt; &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;action_dispatch&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;request.rb:355:in&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="na"&gt;block&lt;/span&gt; &lt;span class="err"&gt;(2&lt;/span&gt; &lt;span class="na"&gt;levels&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="na"&gt;POST&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="涉及gem"&gt;涉及 gem&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;rack&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rails&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="自救过程"&gt;自救过程&lt;/h2&gt;
&lt;p&gt;初看是一个未处理的“%”导致 rack 在解析请求报错了，但是这是一个二进制文件上传，未处理的“%”应该是文件内的，不知道 rack 是怎么解析请求。
&lt;img title=":sweat_smile:" alt="😅" src="https://twemoji.ruby-china.com/2/svg/1f605.svg" class="twemoji"&gt; 于是我尝试写了一个中间件提前截取了 rack 的 env["rack.request.form_vars"]，大致内容如图：&lt;img src="https://l.ruby-china.com/photo/bakadia/49ccc219-82bb-4a06-990d-afcf6c5e2c48.png!large" title="" alt=""&gt;
中间乱码部分是一个视频，提取出来保存.mp4 就可以正常使用了。&lt;/p&gt;

&lt;p&gt;现在有两种路子可以走，用自定义中间件把 env["rack.request.form_vars"] 调整成 rack 能解析的样子。或者用自定义中间件把内容先存到一个 tmp 的文件内，然后把会报错的内容清除，到 controller 再处理。&lt;/p&gt;
&lt;h2 id="测试文件"&gt;测试文件&lt;/h2&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;链接：https://pan.baidu.com/s/1rnYJSQ5wXUO3glZb-_V2wg  提取码：j52c 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="遇到难题"&gt;遇到难题&lt;/h2&gt;
&lt;p&gt;1.怎么调整才能调整成 rack 能解析的模样&lt;/p&gt;

&lt;p&gt;2.先直接存到一个 tmp 文件后，怎么优雅的把多余的内容删除，只保留视频的内容&lt;/p&gt;</description>
      <author>bakadia</author>
      <pubDate>Mon, 28 Jun 2021 16:19:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/41419</link>
      <guid>https://ruby-china.org/topics/41419</guid>
    </item>
    <item>
      <title>新手有关 eml 读取转换问题</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mail'&lt;/span&gt;
&lt;span class="n"&gt;mail_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&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="s1"&gt;'images/tmp.eml'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;
&lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mail_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用了以上方式读取 eml 邮件，拿出来发现 body 编码格式是 7bit，解析困难。&lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&gt;  然后用了几种转码方法都没有成功
并没有把内容转化成 UTF-8，就卡这里了。求问怎么正常转换成 UTF-8，或者直接把 eml 的文件转成 html 或者 txt&lt;/p&gt;</description>
      <author>bakadia</author>
      <pubDate>Wed, 05 Dec 2018 18:52:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/37860</link>
      <guid>https://ruby-china.org/topics/37860</guid>
    </item>
  </channel>
</rss>
