BigBing 技术博客

本周总结13-18-07-2015

部署

本周发现产品环境发布后,自动重启unicorn失败,发现是在老的版本的目录下执行的bundle exec unicorn命令。

eye官网上找到的解决办法: https://github.com/kostya/eye/wiki/Run-ruby-apps-that-use-a-separate-bundle-than-eye-itself

if File.exist? File.join(working_dir, 'Gemfile')
  clear_bundler_env
  env 'BUNDLE_GEMFILE' => File.join(working_dir, 'Gemfile')
end

方法二:手动创建/bin/unicorn

#!/usr/bin/env ruby
require_relative '../config/boot'
load Gem.bin_path('unicorn', 'unicorn')

这样就可以保证Unicorn会和应用使用同样地环境,包括gemfile的依赖

网站安全:

本周发现网站访问有日志:/POST_ip_port.php

简单地方法可以用:DDOS Deflate

搜索:Sphinx的模糊搜索问题

Sphinx通过enable_starmin_infix_len来配置实现英文的模糊搜索,但是这个特性会导致索引过大,同时也会降低搜索性能。 所以,考虑到我做的网站是中文网站,所以就去掉英文模糊搜索功能。详细请看: http://wyeworks.com/blog/2009/4/20/wildcard-search-with-thinking-sphinx

邮件服务:从Postmark切换到Mandrill

本周Postmark邮件服务出现问题,导致网站给用户发送的确认邮件都收不到,用户无法完成注册,这个对网站很致命。 所以我立即换到另外的服务Mandrill,主要原因是Postmark的服务跟不上,可能是时区的原因,我的反馈没有得到及时的解决。 Mandrill上手配置很容易,同时每个月如果少于2000封的话就免费,这个很适合新的网站。 另外补充一句,另外一个选择SendGrid的注册流程比较繁琐,还要验证网站。

资源分享:

同时分享发现的一个简单易懂的CSS layout教程: http://learnlayout.com/

互联网女皇2015互联网趋势报告笔记

读了这篇前Facebook工程师深度解读互联网女皇2015互联网趋势报告对互联网女皇的报告的解析做的摘录和总结,主要是一些觉得对自己比较重要的,以后回头看看给自己提个醒。

  • 中国的防火墙及制度壁垒,让中国的互联网公司有了一些机会。

  • 美国的旅游网站priceline.com非常大,国内的Ctrip和Qunar是否被低估?或者有一个新的旅游网站会爆发?

  • 美国Salesforce也很大,中国在企业服务领域应该还是有很多机会。

  • Netflix很火,是因为有很好的自制内容,中国的自制内容很有机会。

  • ARPU: Average Revenue Per User: 在每个用户上的营收, MAU: Monthly Active User 月活跃用户。

  • 视频广告需要越来越多考虑垂直屏幕,不需要让用户旋转屏幕。

  • 聊天应用已经变成很重要的入口,引导下一步的支付,电商,广告,内容等。

  • Airbnb,Uber还是非常方便的,下次去哪里玩,可以考虑尝试一下。

  • 无人机:DJI,产品Phatom3。有空也来搞一个玩玩。可以先搞个入门级的跟儿子玩。

  • GDP按照购买力配平后,中国已经是第一,美国第二,澳大利亚因高物价排19,这就是澳洲比较囧的地方。

  • 服务业在经济中的占比越来越重要。

  • 员工最在意的福利: 1.培训和职业发展 2.弹性工作时间 3.奖金。

  • 电子商务还会持续发展,美股中概可以持续关注Alibaba,JD, VIPS和聚美优品。

  • Freelancer越来越多,关注网站: upwork,可以找人,也可以找工作。

  • 新产品要点:移动设备的体验要好,多运用社交媒体和新媒体做市场推广,用打分和评价系统保证服务质量

  • 腾讯在中国的霸主地位,微信及支付功能非常强大。

  • 小米的成长很恐怖,产品线逐渐丰富,手机app可以直接订购,回头买上几件,回国带小米。

  • 估计纳斯达克离泡沫还有3-5年的安全期。

2015 Google I/O

今天比较仔细得把2015 Google I/O大会的Keynote看了一遍。作为忠实的Google用户, 还是非常高兴看到Android M, Android Wear, Google Now, Google Pictures这些产品在功能和用户体验上的改进与创新。

同时,作为一位Web开发者,我会重点关注下面这些内容

polymer 1.0是一个用来开发web component的工具,同时他也提供了很多现成的web components,这有可能是接下来的趋势,值得关注。

Firbase: 是Google的用户支持手机App开发的后端服务,可以用户快速大家应用。

Cloud Test Lab: 可以同时测试很多种不同的终端手机的测试平台。

Google cloud platform:Google的云计算平台,包括很多强大的服务。

Cloud messaging:发送消息到浏览器或者手机应用终端,关键还是免费的,值得一试。

去年Cardboard没有吸引到我的注意力,今年又提到了,所以我赶紧搞了一个cardboard体验了一下,这东西还真的挺适合用在教育领域。

印象深刻的还有就是Google多次提到的下一个一百万用户的问题,主要是一些来自落后地区的用户,Google为此,对很多产品进行了优化, 比如允许提前下载youtube视频,Google地图支持脱机使用等,充分体现了Google对用户的关怀和Google作为一家伟大公司的情怀。

慈,俭,不敢为天下先

引自罗辑思维 第121期 丰满理想下的残酷杀戮

节目中推荐了两本跟老子有关的书: 《道可道》 《天堂茶话》

道家有三宝:一曰慈,二曰俭,三曰不敢为天下先

简单说来就是:对人,对钱,对事稍微搂着点

  • 慈:仁慈,对人搂着点
  • 俭:俭朴,对钱搂着点
  • 不敢为天下先:再大再大的好事也不要太兴奋,全身心的扑上去。

一、对世界要抱有充分的好奇心

二、对任何一种新东西,抱有一种小心翼翼试试的心态

三、对任何东西都不要亢奋,不管说的有多好,都不值得亢奋得全身扑上

搞清楚Rails中的eager loading

在Rails中eager loading这词比较抽象,其实就是preloading的意思。就是尽可能把后面需要的数据,通过最少的sql语句一起查询出来,从数据库的角度就是充分利用Join的功能,解决N+1查询的问题。

在Rails中常用下面三个方法来preload数据:

  • #includes
  • #preload
  • #eager_load

实验的时候,建立了下面两个model:

rails g model user name:string email:string

rails g model address country city postal_code street user:references

直接使用joins是不能preload关联的数据:

#只能查出users,使用的是INNER JOIN
User.joins(:addresses).where("addresses.country = ?", "Poland")

Rails使用两种方法来提前加载数据

  1. 使用多条单独的查询获取数据 (例如:#preload
  2. 使用一条LEFT JOIN语句获取数据 (例如:#eager_load)

那么#includes是怎么样的呢?

在Rails3中,#includes会自动根据查询的条件决定采用那种方式:

所以,下面两种情况产生的语句是一样的:

User.includes(:addresses).where("addresses.country = ?", "Poland")
User.eager_load(:addresses).where("addresses.country = ?", "Poland")

实现的逻辑是:#includes通过判断where查询条件中的表名也是addresses,然后把查询代理给了#eager_load

一个特别的需求,如果我要查询出符合条件的user,同时附带该user所有的addresses,这个时候我们就要用到#joins

User.joins(:addresses).where("addresses.country = ?", "Poland").includes(:addresses)

这句的效果和上面两句是类似的,并没有查询出用户的所有地址,有一点区别就是使用的INNER JOIN

User.joins(:addresses).where("addresses.country = ?", "Poland").preload(:addresses)

这条使用#preload会用另外一条单独的语句查询出user的所有addresses

在Rails4中又有什么不同呢?

User.includes(:addresses).where("addresses.country = ?", "Poland")

会抛出SQLite3::SQLException: no such column: addresses.country 异常,所以rails4已经不会自动帮你使用#eager_load方法了。

Rails4中需要显式地用references指定要preload的关联表:

User.includes(:addresses).where("addresses.country = ?", "Poland").references(:addresses)

在rails4中等同于:

User.eager_load(:addresses).where("addresses.country = ?", "Poland")

所以用#preload就是明确指定,让rails单独再发送一条查询语句查询关联表里面的数据,而用#eager_load就是尽可能用一条LEFT JOIN语句搞定。