18 Jul 2015
部署
本周发现产品环境发布后,自动重启unicorn失败,发现是在老的版本的目录下执行的bundle exec unicorn
命令。
eye官网上找到的解决办法:
https://github.com/kostya/eye/wiki/Run-ruby-apps-that-use-a-separate-bundle-than-eye-itself
方法二:手动创建/bin/unicorn
这样就可以保证Unicorn会和应用使用同样地环境,包括gemfile的依赖
网站安全:
本周发现网站访问有日志:/POST_ip_port.php
简单地方法可以用:DDOS Deflate
搜索:Sphinx的模糊搜索问题
Sphinx通过enable_star
和min_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/
29 Jun 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年的安全期。
30 May 2015
今天比较仔细得把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作为一家伟大公司的情怀。
26 May 2015
引自罗辑思维 第121期 丰满理想下的残酷杀戮
节目中推荐了两本跟老子有关的书: 《道可道》 《天堂茶话》
道家有三宝:一曰慈,二曰俭,三曰不敢为天下先
简单说来就是:对人,对钱,对事稍微搂着点
- 慈:仁慈,对人搂着点
- 俭:俭朴,对钱搂着点
- 不敢为天下先:再大再大的好事也不要太兴奋,全身心的扑上去。
一、对世界要抱有充分的好奇心
二、对任何一种新东西,抱有一种小心翼翼试试的心态
三、对任何东西都不要亢奋,不管说的有多好,都不值得亢奋得全身扑上
20 May 2015
在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使用两种方法来提前加载数据
- 使用多条单独的查询获取数据 (例如:
#preload
)
- 使用一条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语句搞定。