<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>mimosa (Howl王)</title>
    <link>https://ruby-china.org/mimosa</link>
    <description>┬─┬ノ❨°_°ノ❩ ..persecution mania</description>
    <language>en-us</language>
    <item>
      <title>利用 Postgres Pub/Sub机制，透过 EventSource 推送通知</title>
      <description>&lt;ul&gt;
&lt;li&gt;随便玩玩让大家见笑了&lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;/li&gt;
&lt;li&gt;前端需要解决的问题，用户开过个 tab 占用连接

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://l.ruby-china.com/photo/mimosa/a3f1ebda-0052-4256-b1bd-fb8c0c7c2639.png!large" title="" alt=""&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;用 BroadcastChannel 和 SharedWorker

&lt;ul&gt;
&lt;li&gt;&lt;img src="https://l.ruby-china.com/photo/mimosa/7fc15b86-43c8-401d-8d19-b3cec8d6dba6.png!large" title="" alt=""&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/worker.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部分后端代码：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app/controllers/stream_controller.rb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;models/concerns/notifiable.rb&lt;/code&gt; 当然也可以用 Postgres 的 trigger 和 function 实现&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在页面中调用 SharedWorker 进行 SSE 连接，打开多个标签页只需保持一个连接&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SharedWorker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EventsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;StreamController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
    &lt;span class="n"&gt;on_stream&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="no"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on_notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;interval: &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;event: &lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:ping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'hearbeat'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;)&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;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:events&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;only: &lt;/span&gt;&lt;span class="sx"&gt;%i[index]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;constraints: &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;request&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'HTTP_ACCEPT'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'text/event-stream'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;收到的 MessageEvent data&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UPDATE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fffb5065-80ca-4d75-bcb2-d946693196de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"columns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DELETE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fffb5065-80ca-4d75-bcb2-d946693196de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"columns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INSERT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fffb5065-80ca-4d75-bcb2-d946693196de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"columns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;ul&gt;
&lt;li&gt;代码：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# typed: false&lt;/span&gt;
&lt;span class="c1"&gt;# frozen_string_literal: true&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StreamController&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="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;ActionController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Live&lt;/span&gt;

  &lt;span class="kp"&gt;private&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_stream&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;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;set_stream_headers&lt;/span&gt;

    &lt;span class="c1"&gt;# https://www.wjwh.eu/posts/2018-10-29-double-hijack.html&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'rack.hijack'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="no"&gt;Thread&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;perform_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;nothing: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;perform_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SSE&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;stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;retry: &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;event: &lt;/span&gt;&lt;span class="s1"&gt;'open'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="no"&gt;ActionController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Live&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ClientDisconnected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Errno&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;EPIPE&lt;/span&gt;
    &lt;span class="n"&gt;sse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;
  &lt;span class="k"&gt;ensure&lt;/span&gt;
    &lt;span class="n"&gt;sse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_stream_headers&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Connection'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'keep-alive'&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'text/event-stream'&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Cache-Control'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'no-cache'&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Last-Modified'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;httpdate&lt;/span&gt; &lt;span class="c1"&gt;# Disables eTag middleware buffering&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'X-Accel-Buffering'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'no'&lt;/span&gt; &lt;span class="c1"&gt;# Disable buffering for nginx&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;hr&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# typed: false&lt;/span&gt;
&lt;span class="c1"&gt;# frozen_string_literal: true&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Notifiable&lt;/span&gt;
  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;

  &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;after_commit&lt;/span&gt; &lt;span class="ss"&gt;:notify_callbacks&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;class_methods&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;interval: &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;channel: &lt;/span&gt;&lt;span class="kp"&gt;nil&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;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="s1"&gt;'No block given'&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;

      &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;
      &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt; &lt;span class="n"&gt;sanitize_sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"LISTEN &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;hearbeat_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;

      &lt;span class="kp"&gt;loop&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raw_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait_for_notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;channel_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
          &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="no"&gt;MultiJson&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;symbolize_keys: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;channel_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;hearbeat_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;
          &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;ping: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="n"&gt;hearbeat_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&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;ensure&lt;/span&gt;
      &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt; &lt;span class="n"&gt;sanitize_sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"UNLISTEN &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&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;def&lt;/span&gt; &lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'UPDATE'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:columns&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;empty?&lt;/span&gt;

    &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt; &lt;span class="n"&gt;sanitize_sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"NOTIFY &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, '&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;MultiJson&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;delegate&lt;/span&gt; &lt;span class="ss"&gt;:table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:primary_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:connection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:sanitize_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:connection_pool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: :class&lt;/span&gt;

  &lt;span class="kp"&gt;private&lt;/span&gt;

  &lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="n"&gt;table_name&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;notify_callbacks&lt;/span&gt;
    &lt;span class="n"&gt;notify&lt;/span&gt; &lt;span class="n"&gt;event_payload&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_payload&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;key: &lt;/span&gt;&lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;value: &lt;/span&gt;&lt;span class="nb"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="ss"&gt;columns: &lt;/span&gt;&lt;span class="n"&gt;previous_changes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_type&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destroyed?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'DELETE'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;previously_new_record?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'INSERT'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'UPDATE'&lt;/span&gt;&lt;span class="p"&gt;))&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;hr&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;STATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Subscribe to the event source at `uri` with exponential backoff reconnect.&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;retryTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evtSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;withCredentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;evtSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&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="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;evtSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&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="nf"&gt;setConnectedStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;retryTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`connected to event stream at &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;evtSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&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="nx"&gt;evtSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Disconnect the channel&lt;/span&gt;
      &lt;span class="nf"&gt;setConnectedStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;retryTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;retryTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retryTime&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`connection lost. attempting to reconnect in &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;s`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)());&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Set the connection status: `true` for connected, `false` for disconnected.&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setConnectedStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Subscribe to server-sent events.&lt;/span&gt;
&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>mimosa</author>
      <pubDate>Tue, 05 Dec 2023 15:37:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/43500</link>
      <guid>https://ruby-china.org/topics/43500</guid>
    </item>
    <item>
      <title>[上海][2018年03月20日] Ruby 聚会召集</title>
      <description>&lt;p&gt;时间：2018 年 03 月 20 日 (周二) 19:00 - 21:00&lt;/p&gt;

&lt;p&gt;地点：上海四行仓库创意科技园区 2 楼中庭（光复路 1 号）8 号线，12 号线曲阜路站。
地图：&lt;a href="https://ditu.amap.com/dir?from%5Badcode%5D=310106&amp;amp;from%5Bname%5D=%E6%9B%B2%E9%98%9C%E8%B7%AF(%E5%9C%B0%E9%93%81%E7%AB%99)&amp;amp;from%5Bid%5D=BV10039914-from&amp;amp;from%5Bpoitype%5D=150500&amp;amp;from%5Blnglat%5D=121.471543%2C31.242307&amp;amp;from%5Bmodxy%5D=&amp;amp;to%5Bid%5D=B0FFHCQOUY-to&amp;amp;to%5Bname%5D=%E4%B8%8A%E6%B5%B7%E5%A4%A7%E9%99%86%E9%93%B6%E8%A1%8C%E4%BB%93%E5%BA%93&amp;amp;to%5Blnglat%5D=121.471557%2C31.240357&amp;amp;to%5Bmodxy%5D=121.471557%2C31.240357&amp;amp;to%5Bpoitype%5D=110200&amp;amp;to%5Badcode%5D=310106&amp;amp;type=walk&amp;amp;policy=0&amp;amp;dateTime=now" rel="nofollow" target="_blank" title=""&gt;https://ditu.amap.com/place/B0FFFDZ1NY&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="主题："&gt;主题：&lt;/h2&gt;&lt;h4 id="《也说RubyJIT》"&gt;《也说 RubyJIT》&lt;/h4&gt;
&lt;p&gt;讲师：&lt;a href="/falm" class="user-mention" title="@falm"&gt;&lt;i&gt;@&lt;/i&gt;falm&lt;/a&gt; 侯俊杰，[薄荷🌿]&lt;/p&gt;
&lt;h4 id="《基于web项目的小程序 webview 实践》"&gt;《基于 web 项目的小程序 webview 实践》&lt;/h4&gt;
&lt;p&gt;讲师：&lt;a href="/dadadada2x" class="user-mention" title="@dadadada2x"&gt;&lt;i&gt;@&lt;/i&gt;dadadada2x&lt;/a&gt; 马世佳，[爱燃烧]&lt;/p&gt;
&lt;h2 id="如何报名参加"&gt;如何报名参加&lt;/h2&gt;
&lt;p&gt;座位有限，建议提前报名。
&lt;img src="https://l.ruby-china.com/photo/2018/bae023a6-b6c8-4931-9d43-06b83c7fc72e.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/f3aa4bdc-4c88-418f-9048-03d9c3b808e7.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/deac38ac-c1bc-4531-b4c7-634c76115616.jpg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Tue, 13 Mar 2018 16:19:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/35225</link>
      <guid>https://ruby-china.org/topics/35225</guid>
    </item>
    <item>
      <title> [上海][2017年06月20日] Ruby 聚会召集</title>
      <description>&lt;p&gt;时间：2017 年 06 月 20 日 (周二) 19:00 - 21:00&lt;/p&gt;

&lt;p&gt;地点：联合创业办公室 P2, 江宁路 77 号 7 楼，美琪大戏院西侧。
地图：&lt;a href="http://ditu.amap.com/place/B0FFGT41G2" rel="nofollow" target="_blank"&gt;http://ditu.amap.com/place/B0FFGT41G2&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="主题："&gt;主题：&lt;/h2&gt;&lt;h4 id="FeatureToggle 在实践中的应用"&gt;FeatureToggle 在实践中的应用&lt;/h4&gt;
&lt;p&gt;讲师：&lt;a href="/holysoros" class="user-mention" title="@holysoros"&gt;&lt;i&gt;@&lt;/i&gt;holysoros&lt;/a&gt; 李斌，&lt;a href="https://ruby-china.org/topics/31550" title=""&gt;居乐屋&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="Shadowsocks的Go实现代码研究。（此楼免费转让）"&gt;Shadowsocks 的 Go 实现代码研究。（此楼免费转让）&lt;/h4&gt;
&lt;p&gt;讲师：&lt;a href="/ericguo" class="user-mention" title="@ericguo"&gt;&lt;i&gt;@&lt;/i&gt;ericguo&lt;/a&gt; 过纯中，&lt;a href="https://ruby-china.org/topics/33115" title=""&gt;Faria Rails Developer&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="如何报名参加"&gt;如何报名参加&lt;/h2&gt;
&lt;p&gt;建议提前报名，以便提前准备零食饮料。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/b2956864-07f3-46c8-9387-56a359abfd8b.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Fri, 09 Jun 2017 18:42:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/33197</link>
      <guid>https://ruby-china.org/topics/33197</guid>
    </item>
    <item>
      <title> [上海][2017年03月07日] Ruby 聚会召集</title>
      <description>&lt;p&gt;时间：2017 年 03 月 07 日 (周二) 19:00 - 21:00&lt;/p&gt;

&lt;p&gt;地点：Autodesk（欧特克）, 浦电路 399 号 A 栋 1 楼&lt;br&gt;
地图：&lt;a href="http://ditu.amap.com/place/B00155MV7E" rel="nofollow" target="_blank"&gt;http://ditu.amap.com/place/B00155MV7E&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="主题："&gt;主题：&lt;/h2&gt;&lt;h4 id="DevOps in Strikingly: From Zero to Production :tv:"&gt;DevOps in Strikingly: From Zero to Production &lt;a href="http://www.tudou.com/programs/view/_lB0uX__P5k" rel="nofollow" target="_blank" title=""&gt;&lt;img title=":tv:" alt="📺" src="https://twemoji.ruby-china.com/2/svg/1f4fa.svg" class="twemoji"&gt;&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;讲师：Olov Pettersson, Senior DevOps Engineer &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;主要是讲 Strikingly 如何从零构建，由代码到生产环境的 DevOps 流程和基础设施。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="基于 nginx nchan 高效实现 Web 实时通信  :tv: :paperclip:"&gt;基于 nginx nchan 高效实现 Web 实时通信  &lt;a href="http://www.tudou.com/programs/view/ZNjV9X2hx4A" rel="nofollow" target="_blank" title=""&gt;&lt;img title=":tv:" alt="📺" src="https://twemoji.ruby-china.com/2/svg/1f4fa.svg" class="twemoji"&gt;&lt;/a&gt; &lt;a href="https://l.ruby-china.com/photo/2017/2af8a6feda57fcbea81981e2660c4a15.pdf" rel="nofollow" target="_blank" title=""&gt;&lt;img title=":paperclip:" alt="📎" src="https://twemoji.ruby-china.com/2/svg/1f4ce.svg" class="twemoji"&gt;&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;讲师：&lt;a href="/vincent" class="user-mention" title="@vincent"&gt;&lt;i&gt;@&lt;/i&gt;vincent&lt;/a&gt; 🌿薄荷科技 CTO&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;一种轻量级、高性能、高并发和跨语言解决方案 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="MIDORI FROM SCRATCH :tv: :paperclip:"&gt;MIDORI FROM SCRATCH &lt;a href="http://www.tudou.com/programs/view/YmVDkK0lxRQ" rel="nofollow" target="_blank" title=""&gt;&lt;img title=":tv:" alt="📺" src="https://twemoji.ruby-china.com/2/svg/1f4fa.svg" class="twemoji"&gt;&lt;/a&gt; &lt;a href="https://l.ruby-china.com/photo/2017/26fd7fb74da9189a7c934156088a3358.pdf" rel="nofollow" target="_blank" title=""&gt;&lt;img title=":paperclip:" alt="📎" src="https://twemoji.ruby-china.com/2/svg/1f4ce.svg" class="twemoji"&gt;&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;讲师：&lt;a href="/dsh0416" class="user-mention" title="@dsh0416"&gt;&lt;i&gt;@&lt;/i&gt;dsh0416&lt;/a&gt; (东仙队长)，年轻有为&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lightweight, Flexible and Fast Ruby Web Framework&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="如何报名参加"&gt;如何报名参加&lt;/h2&gt;
&lt;p&gt;此次活动是开放活动，不需要提前报名，如果你感兴趣，按时到场即可。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;感谢 &lt;a href="/autodesk" class="user-mention" title="@autodesk"&gt;&lt;i&gt;@&lt;/i&gt;autodesk&lt;/a&gt; 提供场地，小食及饮料。&lt;/p&gt;

&lt;p&gt;短驳图：&lt;em&gt;地铁 4 号线，浦电路站 3 号出口，步行约 100 米。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/e189006146c5a174432941d8644506fd.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Tue, 28 Feb 2017 13:27:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/32404</link>
      <guid>https://ruby-china.org/topics/32404</guid>
    </item>
    <item>
      <title>[上海] Autodesk 2017 春季招聘 (Ruby 职位)</title>
      <description>&lt;h3 id="公司介绍："&gt;公司介绍：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Autodesk 正在努力帮助解决世界上最复杂的设计问题，从紧迫的生态挑战到开发可扩展的智能基础设施；我们的设计工具在阿凡达等电影中展现了令人惊叹的视觉效果。你可能没有意识到这些，但 Autodesk 无处不在。如果你曾经驾驶过一辆时尚的汽车，欣赏过像上海中心这样高耸的摩天大楼，或者看过一部好电影，那么你就已经经历过 Autodesk 的客户可以用我们的软件来做过的那些事。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="位置：上海"&gt;位置：上海&lt;/h3&gt;&lt;h3 id="职称：首席软件工程师"&gt;职称：首席软件工程师&lt;/h3&gt;&lt;h3 id="职位描述："&gt;职位描述：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;加入 Autodesk，您将成为产品团队重要的一部分，帮助塑造长期的公司战略，以确保 Autodesk 在 BIM360 领域的领先地位。您将参与涵盖大量新产品和技术的关键项目，但主要侧重于构建和开发基于云和 Web 的企业系统。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="职责："&gt;职责：&lt;/h3&gt;
&lt;blockquote&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;为技术决策和文档审核提供支持。&lt;/li&gt;
&lt;li&gt;为产品、流程的改进以及开发实践的改进做出贡献。&lt;/li&gt;
&lt;li&gt;与美国和全球其他地点的各工程师团队密切合作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id="要求："&gt;要求：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;计算机科学或相关领域的学士或硕士学位，或拥有相关经验。&lt;/li&gt;
&lt;li&gt;5~10 年的工作经验，至少 3 年的 Web 和云开发经验。&lt;/li&gt;
&lt;li&gt;深入了解面向对象和函数式设计理念。&lt;/li&gt;
&lt;li&gt;拥有 JavaScript（ES6）和/或 Ruby 编程语言的经验。&lt;/li&gt;
&lt;li&gt;熟悉 ReactJS 和/或 AngularJS 前端框架。&lt;/li&gt;
&lt;li&gt;熟悉 Ruby On Rails 和/或 Node.JS 后端编程技术。&lt;/li&gt;
&lt;li&gt;对软件开发流程有很好的了解，有敏捷开发经验者优先。&lt;/li&gt;
&lt;li&gt;有良好的口头和书面的英语能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3 id="待遇"&gt;待遇&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;年薪 30W~50W，年终奖，五险一金，另有补充公积金和补充医疗保险，弹性工作&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="联系"&gt;联系&lt;/h3&gt;
&lt;p&gt;联系人：Jenny Lu &lt;u&gt;jenny.lu@autodesk.com&lt;/u&gt; &lt;u&gt;021-38653285&lt;/u&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Tue, 21 Feb 2017 19:33:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/32354</link>
      <guid>https://ruby-china.org/topics/32354</guid>
    </item>
    <item>
      <title>How to connect Docker to CoreOS in Veertu</title>
      <description>&lt;h2 id="Why CoreOS?"&gt;Why CoreOS?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;CoreOS has become the preferred distro for Docker. You can download the &lt;a href="https://stable.release.core-os.net/amd64-usr/current/coreos_production_iso_image.iso" rel="nofollow" target="_blank" title=""&gt;Stable ISO&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="Why Veertu?"&gt;Why Veertu?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Like xhyve, Veertu takes advantage of the Hypervisor.framework that was introduced in OS X 10.10, which brings Type 1 hypervisor technology (direct, host-level access to hardware) to OS X. You can download it in the &lt;a href="https://d2sje6b9huarvp.cloudfront.net/VeertuDesktop.dmg" rel="nofollow" target="_blank" title=""&gt;CloudFront&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Start the CoreOS image.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;                Set a password for user &lt;code&gt;core&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;core@localhost ~ &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;passwd core
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get the ip address&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;core@localhost ~ &lt;span class="nv"&gt;$ &lt;/span&gt;ip route
default via 192.168.64.1 dev ens3  proto dhcp  src 192.168.64.X  metric 1024 
172.17.0.0/16 dev docker0  proto kernel  scope &lt;span class="nb"&gt;link  &lt;/span&gt;src 172.17.0.1 
192.168.64.0/24 dev ens3  proto kernel  scope &lt;span class="nb"&gt;link  &lt;/span&gt;src 192.168.64.X 
192.168.64.1 dev ens3  proto dhcp  scope &lt;span class="nb"&gt;link  &lt;/span&gt;src 192.168.64.X  metric 1024
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ssh into CoreOS&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh core@192.168.64.X &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;UserKnownHostsFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/null &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install CoreOS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Get your public SSH key&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate a crypted password&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl passwd &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;cloud-config.yml&lt;/code&gt; file to upgrade CoreOS, add your ssh key and open the docker socket when CoreOS starts:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;core@localhost ~ &lt;span class="nv"&gt;$ &lt;/span&gt;vi cloud-config.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;#cloud-config&lt;/span&gt;

&lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;core&lt;/span&gt;
    &lt;span class="na"&gt;passwd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# paste your a crypted string to here&lt;/span&gt;
    &lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sudo&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
    &lt;span class="c1"&gt;# include one or more SSH public keys&lt;/span&gt;
    &lt;span class="na"&gt;ssh-authorized-keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="c1"&gt;# paste your a public SSH key to here&lt;/span&gt;

&lt;span class="na"&gt;coreos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-tcp.socket&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;start&lt;/span&gt;
      &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;[Unit]&lt;/span&gt;
        &lt;span class="s"&gt;Description=Docker Socket for the API&lt;/span&gt;
        &lt;span class="s"&gt;[Socket]&lt;/span&gt;
        &lt;span class="s"&gt;ListenStream=2375&lt;/span&gt;
        &lt;span class="s"&gt;Service=docker.service&lt;/span&gt;
        &lt;span class="s"&gt;BindIPv6Only=both&lt;/span&gt;
        &lt;span class="s"&gt;[Install]&lt;/span&gt;
        &lt;span class="s"&gt;WantedBy=sockets.target&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker.service&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the CoreOS to /dev/sda with our cloud config:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;core@localhost ~ &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;coreos-install &lt;span class="nt"&gt;-d&lt;/span&gt; /dev/sda &lt;span class="nt"&gt;-c&lt;/span&gt; cloud-config.yml
core@localhost ~ &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Usage and check&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set the docker host&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp://192.168.64.X:2375
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check if it works&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker info
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sharing folder on your Mac&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install Add-ons.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;ssh-copy-id osxfuse sshfs
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auto Login without a password.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_rsa.pub core@192.168.64.X &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;UserKnownHostsFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/null &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mount remote file systems over ssh.&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; &amp;lt;username&amp;gt;
&amp;lt;username&amp;gt;:&lt;span class="k"&gt;********&lt;/span&gt;:&amp;lt;uid&amp;gt;:&amp;lt;gid&amp;gt;::0:0:Mimosa:/Users/mimosa:/usr/local/bin/fish
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Documents/veertu
&lt;span class="nb"&gt;sudo &lt;/span&gt;sshfs &lt;span class="nt"&gt;-o&lt;/span&gt; allow_other,defer_permissions,reconnect,uid&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;uid&amp;gt;,gid&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;gid&amp;gt;,volname&lt;span class="o"&gt;=&lt;/span&gt;veertu core@192.168.64.X:./ ~/Documents/veertu
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>mimosa</author>
      <pubDate>Thu, 12 Jan 2017 07:54:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/32109</link>
      <guid>https://ruby-china.org/topics/32109</guid>
    </item>
    <item>
      <title>ActionCable 的简易测试</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/2242f9465b460b53ec6fb9fd554d3fae.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;安装 websocket 命令行客户端：

&lt;ul&gt;
&lt;li&gt; &lt;code&gt;npm install -g wscat&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;连接服务器（可通过 &lt;code&gt;cookies.signed&lt;/code&gt; 和 &lt;code&gt;request.authorization&lt;/code&gt; 进行认证）：

&lt;ul&gt;
&lt;li&gt; &lt;code&gt;wscat -c wss://echo.g-secret.com/cable -H 'Authorization:Token token=8A5A93D8-55EC-429E-9C66-B76CC74F23E5'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;订阅频道：

&lt;ul&gt;
&lt;li&gt; 发送：&lt;code&gt;{"command":"subscribe","identifier":"{\"channel\":\"NotificationsChannel\"}"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; 返回：

&lt;ul&gt;
&lt;li&gt; &lt;code&gt;{"identifier":"{\"channel\":\"NotificationsChannel\"}","type":"confirm_subscription"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;{"identifier":"{\"channel\":\"NotificationsChannel\"}","message":{"message":"当前连接数: 1"}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;发送消息：

&lt;ul&gt;
&lt;li&gt; 发送：&lt;code&gt;{"command":"message","identifier":"{\"channel\":\"NotificationsChannel\"}","data":"{\"message\":\"你好~~\",\"action\":\"speak\"}"}&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;返回： &lt;code&gt;{"identifier":"{\"channel\":\"NotificationsChannel\"}","message":{"message":"你好~~","action":"speak"}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; 发送：&lt;code&gt;{"command":"message","identifier":"{\"channel\":\"NotificationsChannel\"}","data":"{\"action\":\"count\"}"}&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt; 返回：&lt;code&gt;{"identifier":"{\"channel\":\"NotificationsChannel\"}","message":{"message":"当前连接数: 1"}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;退订：

&lt;ul&gt;
&lt;li&gt; 发送：&lt;code&gt;{"command":"unsubscribe","identifier":"{\"channel\":\"NotificationsChannel\"}"}&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt; 什么也不会返回&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# -*- encoding: utf-8 -*-&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotificationsChannel&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationCable&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Channel&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;subscribed&lt;/span&gt;
    &lt;span class="n"&gt;stop_all_streams&lt;/span&gt;
    &lt;span class="n"&gt;stream_from&lt;/span&gt; &lt;span class="n"&gt;channel_id&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;unsubscribed&lt;/span&gt;
    &lt;span class="n"&gt;stop_all_streams&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;ActionCableWorker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perform_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;count&lt;/span&gt;
    &lt;span class="n"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="ss"&gt;message: &lt;/span&gt;&lt;span class="s2"&gt;"当前连接数: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;ActionCable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;private&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;channel_id&lt;/span&gt;
      &lt;span class="s2"&gt;"notifications:&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;'public'&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="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>mimosa</author>
      <pubDate>Mon, 26 Dec 2016 22:39:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/32007</link>
      <guid>https://ruby-china.org/topics/32007</guid>
    </item>
    <item>
      <title>[上海][2016年12月20日] Ruby 聚会召集</title>
      <description>&lt;p&gt;时间：2016 年 12 月 20 日 (周二) 19:00 - 21:00&lt;/p&gt;

&lt;p&gt;地点：Strikingly（上线了）, 杨浦区大学路 248 号 16 楼&lt;br&gt;
地图：&lt;a href="http://ditu.amap.com/place/B0FFGBZBLV" rel="nofollow" target="_blank"&gt;http://ditu.amap.com/place/B0FFGBZBLV&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="主题：Learning from Java, a practical way to scale Rails"&gt;主题：&lt;a href="https://speakerdeck.com/fdutey/large-scale-rails-applications" rel="nofollow" target="_blank" title=""&gt;Learning from Java, a practical way to scale Rails&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;讲师：Florian Dutey, Senior Ruby Developer @ Strikingly&lt;/p&gt;

&lt;p&gt;&lt;img src="//avatars0.githubusercontent.com/u/15645?v=3&amp;amp;s=400" title="" alt=""&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;曾在 RubyConf Taiwan 2016 上分享过 Lite 版，这才带来 Pro 版&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="如何报名参加"&gt;如何报名参加&lt;/h2&gt;
&lt;p&gt;此次活动是开放活动，不需要提前报名，如果你感兴趣，按时到场即可。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;感谢 Strikingly 提供供场地，小食及饮料。&lt;/p&gt;

&lt;p&gt;短驳图：&lt;em&gt;地铁 10 号线（新江湾城方向），江湾体育场站 1 号出口，步行约 700 米。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2016/d8400b7fe94092e9cc718b39f72b55ef.jpg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Mon, 12 Dec 2016 14:42:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/31885</link>
      <guid>https://ruby-china.org/topics/31885</guid>
    </item>
    <item>
      <title>Crystal 随便玩玩</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestClass&lt;/span&gt;
  &lt;span class="n"&gt;getter&lt;/span&gt; &lt;span class="ss"&gt;:value&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@value&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Int32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mixedA&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Int32&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mixedB&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Int32&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mixedA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mixedB&lt;/span&gt;&lt;span class="p"&gt;))&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;pre class="highlight shell"&gt;&lt;code&gt;icr&lt;span class="o"&gt;(&lt;/span&gt;0.19.4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; a &lt;span class="o"&gt;=&lt;/span&gt; TestClass.new&lt;span class="o"&gt;(&lt;/span&gt;123&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;TestClass:0x10432bfd0&amp;gt;&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;TestClass:0x10432bf80 @value=123&amp;gt;&lt;/span&gt;
icr&lt;span class="o"&gt;(&lt;/span&gt;0.19.4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; b &lt;span class="o"&gt;=&lt;/span&gt; TestClass.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"123"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;TestClass:0x10c929fd0&amp;gt;&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;TestClass:0x10c929f70 @value=123&amp;gt;&lt;/span&gt;
icr&lt;span class="o"&gt;(&lt;/span&gt;0.19.4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; a.value &lt;span class="o"&gt;==&lt;/span&gt; b.value
&lt;span class="c"&gt;#&amp;lt;TestClass:0x1066fdfd0&amp;gt;&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;icr&lt;span class="o"&gt;(&lt;/span&gt;0.19.4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://www.crystalforrubyists.com/book/index.html" rel="nofollow" target="_blank" title=""&gt;Crystal for Rubyists&lt;/a&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Wed, 26 Oct 2016 13:20:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/31441</link>
      <guid>https://ruby-china.org/topics/31441</guid>
    </item>
    <item>
      <title>[上海][2016年11月1日] Ruby 聚会召集</title>
      <description>&lt;p&gt;时间：2016 年 11 月 1 日 (周二) 19:00 - 21:00&lt;/p&gt;

&lt;p&gt;地点：GuruDigger Office &amp;amp; 0x65 Geek Space, 成都北路 493 弄 12 号后门（人民广场地铁站 11 号口出，步行 400 米左右）&lt;br&gt;
百度地图：&lt;a href="http://j.map.baidu.com/f-dO1" rel="nofollow" target="_blank"&gt;http://j.map.baidu.com/f-dO1&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;请注意这次聚会的地点是在  GuruDigger Office &amp;amp; 0x65 Geek Space，不是在 Costa，千万别走错地方！&lt;/p&gt;
&lt;h2 id="主题： 分享 如何打造 Web 框架（em-midori）"&gt;主题：分享 如何打造 Web 框架（&lt;a href="https://github.com/heckpsi-lab/em-midori" rel="nofollow" target="_blank" title=""&gt;em-midori&lt;/a&gt;）&lt;/h2&gt;
&lt;p&gt;speaker: &lt;a href="/dsh0416" class="user-mention" title="@dsh0416"&gt;&lt;i&gt;@&lt;/i&gt;dsh0416&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="如何报名参加"&gt;如何报名参加&lt;/h2&gt;
&lt;p&gt;此次活动是开放活动，不需要提前报名，如果你感兴趣，按时到场即可。&lt;/p&gt;

&lt;p&gt;感谢蔡老板提供供场地，请各位到场的同学在点杯饮料（🍭也行）支持一下。&lt;/p&gt;

&lt;p&gt;0x65 Geek Space 一瞥&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/c3fdf76dbbc24bfd5e02bc688dc886b6.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;地图&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/b28fb71cfb6d4279c890e95bd54c176b.jpg" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Mon, 24 Oct 2016 15:28:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/31421</link>
      <guid>https://ruby-china.org/topics/31421</guid>
    </item>
    <item>
      <title>谁能帮俺找回那一毫秒？[已解决]</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;236.123&lt;/span&gt; &lt;span class="c1"&gt;# 已播放(毫)秒数&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"%H:%M:%S.%L"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 转换成时间轴&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"00:03:56.122"&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Time&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="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_f&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beginning_of_day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_f&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 还原&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;236.122&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&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="nf"&gt;sec_to_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_d&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"%H:%M:%S.%L"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;time_to_sec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Time&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="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beginning_of_day&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;236.123&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sec_to_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 00:03:56.123&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;time_to_sec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 236.123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>mimosa</author>
      <pubDate>Mon, 13 Jun 2016 12:01:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/30264</link>
      <guid>https://ruby-china.org/topics/30264</guid>
    </item>
    <item>
      <title>一个基于正则的分类器。</title>
      <description>&lt;p&gt;很早之前实现的，不知道有没有更好的支持&lt;strong&gt;同义词映射&lt;/strong&gt;的&lt;u&gt;词频统计&lt;/u&gt;方案。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;YAML&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./tag_synonyms.yml'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"this is ruby run ubuntu is github ruby, ror is rails rails4 rails5 ror3"&lt;/span&gt;

&lt;span class="no"&gt;TagClassifier&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;text&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# =&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"ruby on rails"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="s2"&gt;"ruby"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s2"&gt;"github"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s2"&gt;"ubuntu"&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;ul&gt;
&lt;li&gt;
&lt;p&gt;同义词映射表 &lt;code&gt;tag_synonyms.yml&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ubuntu&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;centos&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redhat&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;ruby on rails&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ror&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;rails&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ruby&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;java&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;python&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;foreman&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pry&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;node.js&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;node-js&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;nodejs&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;openssh&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;debian&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;amazon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;过滤器 &lt;code&gt;tag_classifier.rb&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# -*- encoding: utf-8 -*-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;class TagClassifier&lt;/p&gt;

&lt;p&gt;def initialize(text)
    &lt;a href="/text" class="user-mention" title="@text"&gt;&lt;i&gt;@&lt;/i&gt;text&lt;/a&gt; = text
    &lt;a href="/words" class="user-mention" title="@words"&gt;&lt;i&gt;@&lt;/i&gt;words&lt;/a&gt; = {}
  end&lt;/p&gt;

&lt;p&gt;def classify(tags, name=nil)
    return(&lt;a href="/words" class="user-mention" title="@words"&gt;&lt;i&gt;@&lt;/i&gt;words&lt;/a&gt;) unless &lt;a href="/text.to_s.size" class="user-mention" title="@text.to_s.size"&gt;&lt;i&gt;@&lt;/i&gt;text.to_s.size&lt;/a&gt; &amp;gt;= 3&lt;/p&gt;

&lt;p&gt;tags.map do |tag|
      if tag.is_a?(Hash)
        term = tag.flatten(2)
        tag = term[0]
      end&lt;/p&gt;

&lt;p&gt;count = scan(term || tag)&lt;/p&gt;

&lt;p&gt;if count &amp;gt; 0
        keyword = name || tag
        &lt;a href="/words" class="user-mention" title="@words"&gt;&lt;i&gt;@&lt;/i&gt;words&lt;/a&gt;[keyword] = count
      end
    end
    return Hash[&lt;a href="/words.sort_by" class="user-mention" title="@words.sort_by"&gt;&lt;i&gt;@&lt;/i&gt;words.sort_by&lt;/a&gt; { |tag, rank| rank }.reverse] unless &lt;a href="/words.empty" class="user-mention" title="@words.empty"&gt;&lt;i&gt;@&lt;/i&gt;words.empty&lt;/a&gt;?
    &lt;a href="/words" class="user-mention" title="@words"&gt;&lt;i&gt;@&lt;/i&gt;words&lt;/a&gt;
  end
  alias :split :classify&lt;/p&gt;

&lt;p&gt;private
    def scan(term)
      term = term.join('|') if term.is_a?(Array)
      &lt;a href="/text.scan" class="user-mention" title="@text.scan"&gt;&lt;i&gt;@&lt;/i&gt;text.scan&lt;/a&gt;(/#{term}/i).count
    end
end&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>mimosa</author>
      <pubDate>Mon, 28 Sep 2015 22:56:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/27509</link>
      <guid>https://ruby-china.org/topics/27509</guid>
    </item>
    <item>
      <title>さくらのVPS</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/b47cd2c5f8cd9ef7b36d920f61df0143.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; 2 周的试用期内，会限制带宽（2M）。&lt;/li&gt;
&lt;li&gt; 目前已是正式使用了。&lt;/li&gt;
&lt;li&gt; &lt;a href="http://serverbear.com/benchmark/2015/09/04/Ld6an1tbrsadam8j" rel="nofollow" target="_blank" title=""&gt;Benchmark Report&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>mimosa</author>
      <pubDate>Fri, 04 Sep 2015 11:30:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/27189</link>
      <guid>https://ruby-china.org/topics/27189</guid>
    </item>
    <item>
      <title>这个网站是什么语言开发的？</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/2014/2bb246a61a52004d1739791585e8a1d9.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这个是如何做到的？&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Mon, 24 Mar 2014 15:38:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/18132</link>
      <guid>https://ruby-china.org/topics/18132</guid>
    </item>
    <item>
      <title>简单包装了一下 Emoji, Auto Link, Sanitize.clean</title>
      <description>&lt;h2 id="simple_format"&gt;simple_format&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Translate emoji name or unicode to HTML images.&lt;/li&gt;
&lt;li&gt;Auto Link url and email.&lt;/li&gt;
&lt;li&gt;Clean HTML elements and attributes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Add &lt;code&gt;simple_format&lt;/code&gt; to your Gemfile.&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'simple_format'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="Usage"&gt;Usage&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'simple_format'&lt;/span&gt;
&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"This is a &amp;lt;span src='error'&amp;gt;:ruby:&amp;lt;/span&amp;gt; &amp;lt;script type='text/javascript'&amp;gt;alert('Formater');&amp;lt;/script&amp;gt;.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt; Test Auto Link www.ruby-china.com&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;mail@domain.com&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Test Emoji tag &amp;lt;a href=':cat:'&amp;gt;🍀&amp;lt;/a&amp;gt;:ruby-china:."&lt;/span&gt;
&lt;span class="no"&gt;SimpleFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Emoji, Auto Link, Sanitize.clean&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;return&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;This is a &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;\"error\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;:ruby:&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; alert('Formater');.&lt;span class="nt"&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt; Test Auto Link &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"http://www.ruby-china.com\"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;\"_blank\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;www.ruby-china.com&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"mailto:mail@domain.com\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;mail@domain.com&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;Test Emoji tag &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"&amp;amp;lt;img%20class=%22emoji%22%20src=%22//l.ruby-china.com/assets/emojis/cat.png%22%20width=%2264%22%20height=%2264%22%20/&amp;amp;gt;\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;\"emoji\"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;\"//l.ruby-china.com/assets/emojis/four_leaf_clover.png\"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;\"64\"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;\"64\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;:ruby-china:.
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;SimpleFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;auto_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;return &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;This is a &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'error'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;:ruby:&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;'text/javascript'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Formater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; Test Auto Link &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;'http://www.ruby-china.com'&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;'_blank'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;www.ruby-china.com&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;'mailto:mail@domain.com'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;mail@domain.com&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;Test Emoji tag &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;':cat:'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;🍀&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;:ruby-china:.
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;SimpleFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace_emoji_with_images&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Default img size is 64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;return&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;This is a &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'error'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;:ruby:&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;'text/javascript'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Formater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;.\n\n Test Auto Link www.ruby-china.com\n\nmail@domain.com\n\nTest Emoji tag &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;'&amp;lt;img class=\"emoji\" src=\"//l.ruby-china.com/assets/emojis/cat.png\" width=\"24\" height=\"24\" /&amp;gt;'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;\"emoji\"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;\"//l.ruby-china.com/assets/emojis/four_leaf_clover.png\"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;\"24\"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;\"24\"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;:ruby-china:.
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;SimpleFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;elements: &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="ss"&gt;attributes: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;all: &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;}})&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"This is a :ruby: alert('Formater');.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt; Test Auto Link www.ruby-china.com&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;mail@domain.com&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Test Emoji tag 🍀:ruby-china:."&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>mimosa</author>
      <pubDate>Fri, 28 Feb 2014 10:38:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/17557</link>
      <guid>https://ruby-china.org/topics/17557</guid>
    </item>
    <item>
      <title>AnsjSeg (中文分词) for jRuby</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/mimosa/ansj_seg-jruby" rel="nofollow" target="_blank"&gt;https://github.com/mimosa/ansj_seg-jruby&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Usage"&gt;Usage&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'ansj_seg'&lt;/span&gt;

&lt;span class="s2"&gt;"Ruby China，对！没错！这里就是 Ruby 社区，目前这里已经是国内最权威的 Ruby 社区，拥有国内所有资深的 Ruby 工程师。"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_tags&lt;/span&gt; &lt;span class="c1"&gt;# or (String).to_seg&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ruby"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"china"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"没错"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"这里"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"社区"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"目前"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"已经"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"国内"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"权威"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"拥有"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"所有"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"资深"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"工程师"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>mimosa</author>
      <pubDate>Tue, 17 Sep 2013 08:40:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/14172</link>
      <guid>https://ruby-china.org/topics/14172</guid>
    </item>
    <item>
      <title>[杭州] 30k/月，找 Ruby freelancer，共同完成初创项目。</title>
      <description>&lt;h3 id="要求："&gt;要求：&lt;/h3&gt;
&lt;p&gt;来杭共同办公，包吃包住，保证单人单间，洗澡洗衣都没问题；&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sinatra&lt;/em&gt; + &lt;em&gt;Mongoid&lt;/em&gt; 开发一款初创产品；&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bootstrap&lt;/em&gt; 、 &lt;em&gt;jQuery&lt;/em&gt; 必须没的说~&lt;/p&gt;

&lt;p&gt;我们目前是 UI + Rubyist 简配~&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;有兴趣的 + 我 Q： &lt;strong&gt;28315&lt;/strong&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;工作地点：杭州滨江区白马湖生态创意城。&lt;/p&gt;

&lt;p&gt;PS： &lt;strong&gt;我们也备有少量期权，欢迎伙伴 + 入~&lt;/strong&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Sun, 18 Aug 2013 00:20:50 +0800</pubDate>
      <link>https://ruby-china.org/topics/13407</link>
      <guid>https://ruby-china.org/topics/13407</guid>
    </item>
    <item>
      <title>Grape 实现：手机、IP、地址 查询 GEO</title>
      <description>&lt;h2 id="通过 Grape 实现的简易 手机、IP、地址 查询地址（GEO）"&gt;通过 Grape 实现的简易 手机、IP、地址 查询地址（GEO）&lt;/h2&gt;
&lt;hr&gt;

&lt;p&gt;&lt;a href="http://geo.shou65.com/?loc=113.140.219.74" rel="nofollow" target="_blank" title=""&gt;IP 地址&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;code&gt;geoplugin.net&lt;/code&gt; 获取 IP 的 GEO；&lt;/li&gt;
&lt;li&gt; &lt;code&gt;translate.google.com&lt;/code&gt; 翻译成中文&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;city:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"西安"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;region:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"陕西"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;country:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"中国"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;latitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;34.258301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;longitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;108.928596&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;&lt;a href="http://geo.shou65.com/?loc=18016245161" rel="nofollow" target="_blank" title=""&gt;手机号&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;通过 &lt;code&gt;redis-server&lt;/code&gt; 查询号码段；&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;maps.googleapis.com&lt;/code&gt; 获取 GEO；&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;provide:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"上海电信"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;mobile:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"18016245161"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;location:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"中国上海"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;city:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"上海"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;region:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"上海市"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;country:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"中国"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;latitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;31.230393&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;longitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;121.473704&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;&lt;a href="http://geo.shou65.com/?loc=%E5%87%AF%E7%BF%94%E5%B0%8F%E5%8C%BA" rel="nofollow" target="_blank" title=""&gt;凯翔小区&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;maps.googleapis.com&lt;/code&gt; 获取 GEO；&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;location:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"中国上海市徐汇区龙漕路凯翔小区 邮政编码: 200231"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;street:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"龙漕路"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;district:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"徐汇区"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;city:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"上海"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;region:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"上海市"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;country:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"中国"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;latitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;31.170198&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;longitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;121.439336&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;源码：&lt;code&gt;https://github.com/mimosa/geocoder&lt;/code&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Tue, 02 Jul 2013 15:40:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/12186</link>
      <guid>https://ruby-china.org/topics/12186</guid>
    </item>
    <item>
      <title>猜猜，这能干啥~</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/1b32c113cb37b7bddccfd39111443873.jpg" title="" alt=""&gt;
&lt;img src="//l.ruby-china.com/photo/c99c1213887e01890fac277581f20144.jpg" title="" alt=""&gt;
&lt;img src="//l.ruby-china.com/photo/bb6daaf6ee5f2cbe0f58f4394742f47f.jpg" title="" alt=""&gt;
&lt;a href="https://gist.github.com/mimosa/5150484" rel="nofollow" target="_blank"&gt;https://gist.github.com/mimosa/5150484&lt;/a&gt;&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Wed, 13 Mar 2013 18:16:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/9389</link>
      <guid>https://ruby-china.org/topics/9389</guid>
    </item>
    <item>
      <title>[上海] 出 年会奖品 NEXUS7~</title>
      <description>&lt;p&gt;包装都在，因购买了 免息 mini，&lt;strong&gt;1200&lt;/strong&gt;，不包邮，地铁面交优先，本人在&lt;strong&gt;江苏路地铁站&lt;/strong&gt; 附近上班~&lt;/p&gt;

&lt;p&gt;Q 号：28315&lt;/p&gt;</description>
      <author>mimosa</author>
      <pubDate>Tue, 05 Feb 2013 15:43:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/8612</link>
      <guid>https://ruby-china.org/topics/8612</guid>
    </item>
  </channel>
</rss>
