<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>xiaohuxu (许小虎)</title>
    <link>https://ruby-china.org/xiaohuxu</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Ruby 和 Golang 的 RPC</title>
      <description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;项目中有 ruby 和 golang，导致两者直接的代码需要相互调用。我们大部分的代码使用的 http 的 rest，但是感觉不太自然。
参加 GOPHER 大会后，看到很多人使用 GRPC。看了文档后感觉有点复杂，我们项目简单，人员少。暂时没有必要用，我们暂时选择了相对简单的 hprose。&lt;/p&gt;
&lt;h3 id="ruby客户端"&gt;ruby 客户端&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;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="s2"&gt;"hprose"&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"uuidtools"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调用&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'hprose'&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;HproseClient&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="s1"&gt;'http://127.0.0.1:8080/rpc'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'World'&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="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="golang服务端"&gt;golang 服务端&lt;/h3&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"github.com/hprose/hprose-golang/rpc"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; 

    &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewHTTPService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 

    &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 

    &lt;span class="n"&gt;beego&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/rpc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt; 

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Hello "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"!"&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="结束语"&gt;结束语&lt;/h3&gt;
&lt;p&gt;以上主要想记录一下现在的想法，😄&lt;/p&gt;</description>
      <author>xiaohuxu</author>
      <pubDate>Wed, 03 May 2017 10:52:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/32917</link>
      <guid>https://ruby-china.org/topics/32917</guid>
    </item>
    <item>
      <title>GIF 图片转视频</title>
      <description>&lt;h2 id="缘由"&gt;缘由&lt;/h2&gt;
&lt;p&gt;网站的 GIF 图片比较的多，但是 GIF 图片，大小比较大，特别是在 WAP 上，非常吃流量。为了和运营商做斗争，研究了一下。对于我这种不是图片相关的人来说，遇到很多的坑，和大家说道说道。&lt;/p&gt;
&lt;h2 id="技术"&gt;技术&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;  ffmpeg + imagemagic&lt;/li&gt;
&lt;li&gt; html5 video&lt;/li&gt;
&lt;li&gt; js&lt;/li&gt;
&lt;li&gt; ruby(或者 go)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="GIF转化"&gt;GIF 转化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 使用的主要是 ffmpeg 的命令
&lt;code&gt;ruby
ffmpeg -i input.gif -pix_fmt yuv420p  -movflags +faststart -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="视频播放"&gt;视频播放&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 使用 js 的 scroll 事件，在滚动区域内播放。由于 mp4 在播放的时候才下载资源，可以有效的减少网站资源的下载。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="传说中的坑"&gt;传说中的坑&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; 在 ios 中，浏览器播放视频会默认全屏，无法修改这个默认动作。&lt;/li&gt;
&lt;li&gt; 由于版权的原因，firefox 对 h264 (libx264) 的支持不够友好，简单的使用转化命令，firefox 无法成功播放。
&lt;code&gt;ruby
ffmpeg -i input.gif  output.mp4
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; 顺带说一下，imagemagic 的 crop 命令，在裁减 GIF 图片的时候必须加上+repage 参数，不然 GIF 大小不会改变。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="结果"&gt;结果&lt;/h2&gt;
&lt;p&gt;GIF 图片的图片大小一般要减少一半以上，可以在网站上播放。缺点就是在 ios(浏览器上) 无法自动播放，必须手动播放&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://trac.ffmpeg.org/wiki/Encode/H.264" rel="nofollow" target="_blank" title=""&gt;ffmpeg+H.264&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="结束"&gt;结束&lt;/h2&gt;</description>
      <author>xiaohuxu</author>
      <pubDate>Wed, 30 Dec 2015 16:26:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/28571</link>
      <guid>https://ruby-china.org/topics/28571</guid>
    </item>
  </channel>
</rss>
