<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hjleochen (RailsUser)</title>
    <link>https://ruby-china.org/hjleochen</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>试寻 Ruby On Rails 远程工作</title>
      <description>&lt;p&gt;原由：&lt;a href="https://ruby-china.org/topics/25631" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics/25631&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最近离开原先创业团队，&lt;/p&gt;

&lt;p&gt;接触 Rails 比较久了，但是一直没在正规军工作过，最近两年用得比较多些，说起来会的比较杂些，也都不深入。&lt;/p&gt;

&lt;p&gt;详细简历：
&lt;a href="http://www.upulife.com/leo/chen.pdf" rel="nofollow" target="_blank"&gt;http://www.upulife.com/leo/chen.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;有些工作机会，但是那天在路上和老婆讨论去处时脑子里面突然冒出 10 多年前读的一句"既然选择了远方“故试寻远程工作
base: 福建，福州。 
谢谢各位。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;好吧，今天喝多了才有发这个帖子。&lt;/p&gt;</description>
      <author>hjleochen</author>
      <pubDate>Sun, 20 Dec 2015 00:58:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/28465</link>
      <guid>https://ruby-china.org/topics/28465</guid>
    </item>
    <item>
      <title>瞎扯创业</title>
      <description>&lt;h3 id="全民创业"&gt;全民创业&lt;/h3&gt;
&lt;p&gt;今年看到所谓的“全民创业，万众创新”的时候心里一颤，对于国家和那些专家的想法非常不解，不知道出于什么考虑、不知道会有多少人入坑，也不知道最后结果会是什么样子。或许这样的政策真能解决一些现在的问题，但是参与过或认真思考过创业的人们多少都知道：创业并没有那么美好。成功率低不说，很多人在创业过程中创造的价值（如果有的话）甚至远不如在他熟悉的岗位上来的多。从政策层面来造这么场运动，真是好坏不明。&lt;/p&gt;

&lt;p&gt;都说百分之九十几的创业都最失败的，百分之多少的小企业在后 5 年内消失。看看我们熟悉的团购、O2O 能活下来、能叫出名字的真是少之又少。无数的人为了心中所谓的梦想，所谓的绝佳点子前赴后继，有投资的烧着投资，没投资的花着自己前面多少年或者父辈多少年的辛苦收入。最终化作昂贵而又无人问津的字节码默默发霉，等待着因没钱续费而被主机服务商擦除。&lt;/p&gt;

&lt;p&gt;“我找到一个痛点”，“我有一个绝佳的点子”，“美团触手还没伸到我们这个城市”，“在大鳄进来前还有最后一个时间窗”，“我们一起开创一个伟大的事业，一起改变世界吧”，IT 从业者大概听的这些话都听的耳朵长老茧了，但是这些真是太诱惑了，很多人最终毅然决然的冲进去了，然后尸骨不存。这些都是真的吗？地雷战、地道战真能打赢反法战争么？你自己的小米加上几杆土枪真能干过几百人的正规军么？大鳄进来前的最后窗口真能保证在他们进来后自己仍然不被拍死么？&lt;/p&gt;

&lt;p&gt;很多行业本已经是个充分竞争的市场，一个人做、十个人做可能还不够好，但是突然拉成千上万的人来做对于社会资源就是巨大的浪费了。最终的结果就是虚假繁荣后的尸横遍野。&lt;/p&gt;

&lt;p&gt;“我们可以精益创业、可以做 Growth hacking”，当全民都是创业者的时候 Growth 谁，又 Hack 什么，Hack 谁呢？朋友圈都是避孕套广告，都是避孕套店铺微分销商的时候，谁还买避孕套啊？&lt;/p&gt;

&lt;p&gt;"我们都很聪明，都很努力，996，9127，一定能成功的。" ，这个世界上还有无数更聪明、更努力的人在黑暗中苦苦挣扎呢，为什么成功的一定是“我们”呢？前段时间看一本书（最近瞎看太多书了忘记哪本了）的序里面有一段很有意思的说法：成功者接受采访的时候一般都会说团队多么聪明，自己多么努力，而不会说成功是运气多么好，因为这样显得没有逼格，事实上成功的运气成分占很大一部分（大意如是，肯定比上面写的说的文明）。好吧，我们很聪明，我们很努力，另外我们受上天眷顾，所以一定会成功。&lt;/p&gt;

&lt;p&gt;淘金热的时候做淘金者的服务也可以啊，君不见我们这么个三线城市无数的破厂房变成了创客空间。无数的 IT 企业化身创业者服务公司想要分一块蛋糕。“他们自己 (指创客空间和创业者) 都不知道怎么赚钱，你们还想从他们身上赚钱？”之前有一位政府创业扶持的评委这么说到。&lt;/p&gt;

&lt;p&gt;有人说“to live is to change the world”，这个世界真有那么多需要我们去改变的么，你想把它变成什么样子？很遗憾您没有出生在乔布斯、比尔盖茨的那个年代，更没能生活在牛顿、麦克斯韦、爱因斯坦的时代，或者您真可以改变世界。&lt;/p&gt;

&lt;p&gt;“梦想总是要有人，万一实现了呢？”，好吧这个我真无法反驳，反而我之前也是这么想的。但关键是你愿意为了这 1 个 outs，All-In 你的青春、健康、财富以及和谐的生活么？ &lt;/p&gt;

&lt;p&gt;关于梦想我们再聊。&lt;/p&gt;
&lt;h3 id="关于梦想"&gt;关于梦想&lt;/h3&gt;
&lt;p&gt;大概 2010 年下半年的时候和一个 20 出头的同事 MM 吃饭的时候人家问我“你的梦想是什么？”当即楞住了，卧槽，梦想！多么遥远的词汇啊。我是梦想是什么呢？&lt;/p&gt;

&lt;p&gt;回到家立即申请一个域名，想好一个网站叫做”理想互助会“，口号“成人达己，成己为人。”，包括发布，找人，股权或收益分配，任务管理。当然了半成品迄今为止仍在我的 Git 服务器上。后来看到个网站叫做“实现” ，真棒啊！我就经常会去看看，给公司找方向的时候还会去一页一页的刷别人的想法。虽然上面有些不错的想法，但是很多都是上面说的”我有一个牛 B 人想法，某某大厂的软件哪做的不好了，我们还有机会“。但是网站还是很好的啊，至少能有些成功案例吧，为什么一直不火呢？&lt;/p&gt;

&lt;p&gt;直到前些天和儿子一起看动画片，我才突然明白这个自我为中心人时代，你的理想关我鸟事，就算和我一样我又为什么要和你一起玩。动画片是这样的：新娘子在结婚的时候在化妆间说”其实婚礼不重要，婚姻才是重要的“，这时候大反派跳出来说：错了，没人关心你的婚姻。你以为外面这几百人今天从那么远的地方赶到这里来是来关心你的婚姻的吗？不不不，你的婚礼才是最重要的“。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;昨天半夜回家突然想扯的，早上发现上面最后一句“你的婚礼才是最重要的”和后面的对不上所以把下面关于自己的一段删除了。
平时不怎么上论坛，RubyChina 算是来的最多的，以上只是个人瞎扯，故放在瞎扯板块。&lt;/p&gt;</description>
      <author>hjleochen</author>
      <pubDate>Sun, 15 Nov 2015 04:52:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/28061</link>
      <guid>https://ruby-china.org/topics/28061</guid>
    </item>
    <item>
      <title>这算特性还是算 Bug？</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;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_by_conditions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_sql&lt;/span&gt;
    &lt;span class="c1"&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="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_sql&lt;/span&gt;
    &lt;span class="c1"&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 ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_sql&lt;/span&gt;
&lt;span class="c1"&gt;#SELECT "users".* FROM "users" WHERE "users"."id" = 1&lt;/span&gt;

&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;test_by_conditions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."id" = 2&lt;/span&gt;

&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;test_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? AND "users"."id" = ? LIMIT 1  [["id", 1], ["id", 2]]&lt;/span&gt;
&lt;span class="c1"&gt;#ActiveRecord::RecordNotFound: Couldn't find User with 'id'=2 [WHERE "users"."id" = ?]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应该是 Arel 继承了前面的条件，似乎是到同一个 arel.scrope 里面去了，应该算是个 Bug 吧。&lt;/p&gt;</description>
      <author>hjleochen</author>
      <pubDate>Fri, 10 Jul 2015 16:48:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/26436</link>
      <guid>https://ruby-china.org/topics/26436</guid>
    </item>
    <item>
      <title>看了下招聘版，小城市用 Ruby 真的没有未来？</title>
      <description>&lt;p&gt;几乎所有的招聘都是大城市的，像我们这种二级省会城市都是没有的。&lt;/p&gt;

&lt;p&gt;去年在本地最大的招聘网站发了个 Rails 的招聘要求很低，近一年了一个投递都没有。&lt;/p&gt;

&lt;p&gt;另外这个网站上只有我们一条 Ruby 相关的招聘信息，Python 少于 5 条（最新数据 3 条）。&lt;/p&gt;

&lt;p&gt;基本都是 Java,PHP 之类的。&lt;/p&gt;

&lt;p&gt;招个人难，想找个相关的工作也难，&lt;/p&gt;

&lt;p&gt;小城市这些技术真的没有未来么？&lt;/p&gt;

&lt;p&gt;看了下日历，学习 Ruby 和 Rails 整 10 年了，基本上都是自己折腾，吐槽下。&lt;/p&gt;</description>
      <author>hjleochen</author>
      <pubDate>Mon, 18 May 2015 23:50:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/25631</link>
      <guid>https://ruby-china.org/topics/25631</guid>
    </item>
    <item>
      <title>the_scrap - 提取了个网页抓取的 Gem</title>
      <description>&lt;p&gt;从之前的项目提取了个抓取的功能，稍微改了下放到 GitHub 上了。&lt;/p&gt;

&lt;p&gt;说来惭愧学习 Ruby&amp;amp;Rails 差不多 9 年了（05 年开始应该，算业余爱好吧）还是第一次写 Gem。&lt;/p&gt;

&lt;p&gt;这两个类用了挺久了，综合了自己的一些需求，满足个人大概 85% 以上的场景需求。&lt;/p&gt;

&lt;p&gt;项目地址：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hjleochen/the_scrap" rel="nofollow" target="_blank"&gt;https://github.com/hjleochen/the_scrap&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Why"&gt;Why&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;网页数据的抓取最基本的工作流程为：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;确定要抓取的起始 URL，如：&lt;a href="https://ruby-china.org/topics" rel="nofollow" target="_blank"&gt;https://ruby-china.org/topics&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;抓取列表信息，一般列表信息按照 tr,li,div,dd 等呈现，每个节点为一条记录，如：上述 URL 中的 CSS Selector 为：".topics .topic"&lt;/li&gt;
&lt;li&gt;提取记录的相关信息，标题，作者，分类，详细页面的 URL 等。&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;/ol&gt;

&lt;p&gt;&lt;strong&gt;在处理以上任务是往往会遇到如下问题：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;源 HTML 无法直接使用，需要进行一些处理&lt;/li&gt;
&lt;li&gt;抓取的条目需要过滤无效数据。&lt;/li&gt;
&lt;li&gt;需要对抓取的各种 URL 进行处理，如：链接或者图片往往不是完整的 URL，需要通过当前页面地址进行合并处理。&lt;/li&gt;
&lt;li&gt;提取的数据需要进行特殊处理。还是 RubyChina 的例子比如帖子阅读次数：".info leader" 下的内容为：   "· 618 次阅读",需要的只是：618&lt;/li&gt;
&lt;li&gt;每个网站都有不同的分页机制，和分页 URL 的规则，处理起来相当麻烦。&lt;/li&gt;
&lt;li&gt;输出过程往往需要将之前提取的单个信息组合成一个对象或者 Hash 等。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;很久之前使用 Perl 进行数据抓取，由于个人 Perl 水平问题和语言上的一些限制，处理起来偏麻烦。后来用了很多 Ruby 写的框架都不是很满意 (Scrubyt 应该是我用过的比较不错的一个）&lt;/strong&gt;
&lt;strong&gt;故根据实际需要慢慢总结形成了现在的方式：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;定义列表和详细页面抓取规则&lt;/li&gt;
&lt;li&gt;需要提取的信息和提取规则通过 Method missing 方式存入 Hash 中。&lt;/li&gt;
&lt;li&gt;规则可以根据需要提取不同属性和数据，Link 的 href 和 IMG 的 src 自动进行 URI.join(current_url) 处理&lt;/li&gt;
&lt;li&gt;实现列表多个节点的 Join 或者返回 Array，如 tags。&lt;/li&gt;
&lt;li&gt;实现多种分页方式支持。&lt;/li&gt;
&lt;li&gt;自动通过抓取列表数据取得的详细页面地址抓取详细信息，并合并到同一个结果记录中。&lt;/li&gt;
&lt;li&gt;抓取的结果为一个 Hash，适当定义名称可以直接使用各种 ORMapping 实现进行入库，无需重新组装。&lt;/li&gt;
&lt;li&gt;使用 Ruby 的 lambda 实现 Html 处理、数据过滤、结果处理等，自定义程度和适应性有所提高 (以上内容属于自我感觉良好，请自动忽略)。&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;p&gt;之前写 READMD.md 的时候就觉得这么简单的两个类写清楚还挺麻烦的，一直没写完整。
听从 &lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt; 的意见完善了下文档。&lt;/p&gt;</description>
      <author>hjleochen</author>
      <pubDate>Tue, 19 Aug 2014 00:53:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/21104</link>
      <guid>https://ruby-china.org/topics/21104</guid>
    </item>
  </channel>
</rss>
