oyaji's Blog
从zhihu上看到的
当年考过GRE之后,下午一个人看电影。买过票之后之后还早,就出去走走。过一十字路口时,遇到一美女,几乎完全就是我的理想型,当时不知道哪来的勇气,就把电影票塞给了她,说,一会儿要去看电影。然后我就跑了。
现在想起来,这些情节已经足够匪夷所思了。我回到电影院,买了邻座的票。电影开场的时候,她居然出现了。和我一同看了电影。之间几乎没有交流。我也是太羞涩了。
看到电影之后一直在路边散步,交谈了很多,她刻意回避一些话题,总是说一些无关痛痒的。路灯下,她的样貌,声音,简直就是完美。
由于当时我考GRE写作,是八月份。学校施工嘈杂,就在外面租了一个月的快捷酒店。当天晚上还没退房。她最后说,不想回学校住,于是我就在同一间快捷酒店帮她开了一间(这情节我自己现在都不相信)。
一开始肯定是各回房间了。大概12点的时候,她突然敲门来,说想聊聊天。我也求之不得,当然当时还没邪念,也答应了。主要是我在说话,她在听,眼睛迷人极了。
一个瞬间,她突然就把我吻住了。拉在床上,我居然还挣扎几次,我都不知道自己当时咋想的,居然想跑。。。当是夏天穿得少,她把手伸进来的时候,我作为一个男人,就忍不住了。接下来发生的事大家应该都清楚了。
要说明两件事:1,没使用套套。她也没要求。并且整个过程太过于主动,完全不给我喘息的机会。2,她是处女。
确切地说应该是一整晚都在纠缠,做了很多次。能想到的姿势都试到了。那确实是我最爽的一夜。到今天也是。中间还下楼买了麦当劳薯条,在她身上涂番茄酱,吃掉,舔掉,当然,都是她要求的。一直到第二天上午快11点。
最后,她说了希望做我女朋友,我还处于梦幻中,当然答应了。之后换了手机号,她还要走了我的邮箱(我最后才知道原因),当天晚上回了学校,她也是。我们不是同一所学校的。
晚上还打了电话,发了短信。最后一条是"我昨天晚上很舒服,很开心,是真的开心,谢谢你,晚安。",这就是最后一条短信。
第二天,她就失踪了,电话关机。我等到下午,有点不对劲。就去了她学校找她。这个时候才知道,她在早上的时候跳楼自杀了。
晚上看到她的邮件,发信时间是凌晨四点:
"谢谢你。你不会知道,见到你的时候,我是准备去自杀的。是你让我多活了一天,这也是我这一生中最快乐的一天。不要记得我。求求你不要记得我。"
我想,我要用这一生去忘记你。
rubygems的淘宝镜像
为什么有这个?
由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败。所以你会与遇到 gem install foo
或 bundle install
的时候半天没有响应,具体可以用 gem install rails -V
来查看执行过程。
如何使用?
$ gem sources --remove http://rubygems.org/ $ gem sources -a http://ruby.taobao.org/ $ gem sources -l *** CURRENT SOURCES *** http://ruby.taobao.org # 请确保只有 ruby.taobao.org $ gem install foo
关于店面选址的若干问题
制作Chrome扩展
请教:有没有哪位高人会制作Chrome扩展
本人主要使用Chrome浏览器,发现其扩展程序非常的方便与实用。(声明:这里不争论不比较Chrome与Firefox浏览器的扩展程序)目前,我安装的扩展程序有:Tasks,Timer,iReader,Google Share button。在享受这些扩展程序的实用与便捷之时,我在想为何不可以为各位实验同仁制作一款(或几款)生物专业方面的Chrome扩展,让一些事情变得简单起来,提高大家都工作效率。比如:
相谈
创业故事:36氪
编者按:创业需要超人的毅力,需要耐心,需要海盗般的勇气,并不是每个人都适合创业。但创业并不像你想象中的那么难,那么神秘,也不需要什么太伟大的创意。Felix Chan的亲身经历就是一个很好的例子。以下是他的创业经历,如果你真想创业了,可以参考36氪的创业指南系列文章《单干》。
一年前我从密苏里农村搬到了旧金山,想要加入创业大军。当时我遇到了一个朋友Zac,他也刚刚搬到湾区,但是刚辞职,打算做点更有趣的事情。我俩决定合伙,一起干点什么。
我们都是初次来到这个城市,没有任何熟人,所以我们决定开发一个手机应用,让人们可以通过手机阅读附近用户的档案。目的是帮助人们“破冰”,认识更多朋友。这是我们第一次创业。我们用了一个星期的时间写出了产品代码,然后产品就上线了。
刚一上线只有5名用户,因为没人知道这个应用。为了推广这个产品,我们决定瞄准各种聚会,因为我们觉得人们经常通过各种聚会交朋友。我们把自己关在一个屋子里,不听地问这样一问题:“我们能给聚会组织者提供什么有价值的东西,这样他们就可以帮我们宣传产品?”
Zac最终想出了一个办法。他建议我们制作一个登记台,参加者可以在上面输入自己的名字,然后立刻就可以得到一个带有名字的胸卡。接着就可以把参加者整合到我们的应用中去。一开始这个想法听上去太幼稚了(要是我妈知道我离家2000公里就是为了打印这种纸质胸卡她会怎么想啊?),我当时都快笑抽了。但经过认真思考,看上去还有谱,于是我们决定试试。
经过一天的工作,我们用300行代码写出了这个软件并进行了调试。我们从Dymo那里定了一台打印机,然后连接到一台戴尔Mini上网本上。然后我们就开始联系活动组织者,让他们相信我们的系统不离谱,并问他能不能让我们帮他们打印胸卡。
他答应尝试我们的系统,那个夜晚给力极了。在笔记本上输入自己的名字,然后立刻能打印出一张胸卡,人们认为那是他们见过的最拉风的事情。那天晚上我们送出了很多卡片,让很多人尝试我们的应用。这是我有生以来第一次做了点儿牛逼的事。
我们继续瞄准活动和打印胸卡。我们买了更多打印机和大量卡片。我们买了一个大号旅行箱,所有东西都装里面,我们带着箱子四处打印活动胸卡。
那种经历挺爽的。不仅有很多人试用我们的手机应用,而且所有参加活动的人都觉得这是他们见过的最给力的胸卡。我觉得我们实际上免费进入了这些收费600美元的科技聚会。很多活动组织者都把最靠前的赞助者摊位给了我们,不收一分钱。有人在自己的聚会上免费给我们做广告。这种广告是最棒的。我们很快就可以把应用送到用户手里,然后和500多用户直接对话。
不幸的是过了一个月之后,我们意识到我们最初的手机应用不给力了。人们不想使用这个产品。他们不想阅读周围用户的档案。这个手机应用没用。
创业就是这么奇怪:天有不测风云。我们的手机应用惨遭失败,但我们的胸卡打印系统一炮走红。聚会组织者每次都求我们去给他们打印胸卡,他们向朋友介绍我们,我们每天都带着胸卡打印机参加各种活动。为了满足不同聚会的要求,我们还对最初的软件开发了不同版本。
我们参加过的活动包括:TechCrunch聚会,Smash Summit,SF Music Tech,Future/Money Tech,ISA,Twitter聚会,FailCon/FailChat,TEDxSoma。你可以在这里看到一些照片:http://imhello.posterous.com/ 。
最后邀请太多了,我们没办法每个都去,应接不暇。这时我们才开窍,这才是人们想要的产品。聚会组织者想用我们的系统,他们发邮件、打电话、发出请求,并想自己的朋友推荐。
当我们的邀请处理不过来时,我们决定对产品收费。我们整合了EventBrite,推出定制功能,并对界面进行了美化。根据活动规模和人力情况,每次我们收费50-300美元。
很快这个胸卡打印软件赚来的钱就可以养活我和我爸妈了。最后我们把这个产品卖给了一家小公司。尽管谈不上数百万的收购,但这次收购让我们有足够多的钱进行二次创业。
我们得到的教训是“胸卡打印系统”这种东西最初听上去可能有点白痴、幼稚,但它会给你带来出乎意料的机会(注:有关无心插柳请参考36氪之前的文章《无心插柳:Gmail作者、FriendFeed创始人Paul Buchheit谈人生偶然性》)。就我们而言,它养活了我们,并且变成一次小型收购。我们在参加聚会时认识了很多朋友和不错的人。很多牛逼的CEO和名人都曾伸手摸过我们那个10块钱的罗技键盘,打印自己的胸卡。我们得到了完全免费的促销和广告。
我觉得每家创业公司都有创新的机会。每家创业公司都可以开发一些附属产品,然后添加到产品中去。我建议如果你发现一些有趣的东西,那篇最初看上去微不足道,你也要不妨一试。或许将来会派上用场。
卖掉胸卡打印系统之后我们决定重新回到我们的手机应用上。我们的新公司叫View。View是一个手机应用,可以“告诉你你需要了解的东西,你在哪儿”。这个应用让我们激动不已,因为在日常生活中非常有用。
我们很快就要推出beta测试版产品了,你可以在这里试试:http://view.io。
感谢阅读。Felix
注:View还没有进入应用商店,你可以发邮件给Felix申请试用,邮件标题注明:felix@view.io。
结束语:怎么样,36氪的读者,看完之后是不是觉得创业并没有那么难?心动不如行动。Go。
via HN 图 brajeshwar
转载时会不会保留36氪的链接呢?我猜会,我猜的对:)
本文链接: 如何仅用300行代码养活自己一年,并将公司卖出?
感动
炊烟起了, 我在门口等你。
夕阳下了, 我在山边等你。
叶子黄了, 我在树下等你。
月儿弯了, 我在十五等你。
细雨来了, 我在伞下等你。
流水冻了, 我在河畔等你。
生命累了, 我在天堂等你。
我们老了, 我在来生等你.........
技术创业
技术背景的创业者由于其秉性容易犯三种错误:“首先,技术人员是非观太强,非黑即白,但在创业中需要学会变通;其次,技术人员总迷信‘技术至上’、‘技术改变世界’这类口号,事实上技术和世界之间,需要经历很多过程,如产品、用户,然后才能到达你的世界;第三,技术人员习惯在存在争议的时候才去沟通,而在创业时,往往等你发现需要争论的时候,一切都晚了——这是我在译言经历的教训,所以保持经常性的、开放性沟通是很有必要的。”
--赵嘉敏
Sed学习笔记
Copyright © 2004,2005, 本文遵从GNU 的自由文档许可证(Free Document License)的条款,欢迎转载、修改、散布。 发布时间:2004年09月20日 最近更新:2005年12月22日,增加小技巧章节。 sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。 可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。 调用sed命令有两种形式:
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
" named.conf |
rails fragement cache
之前介紹過 Page Cache,那是一個將所有動態內容都變成靜態頁面,藉由不經過 CGI ,來達到最大覆載度的技巧。但是他的應用性不夠廣泛,僅限於下面的用途
-
流量超級大的頁面
通常是 index page,一個網站可能有幾百個頁面,但是通常 index page 一個頁面就佔了三到五成的流量,而且 index page 通常每個網站都是一個小時,了不起 15 分鐘更新一次,這個時候用 index page 可以大幅度增加網站覆載度。 -
頁面修改的頻率遠遠小於讀取的頻率
例如 Blog 系統,我可能一天寫一篇文章,但是一天讀取我的 Blog 的人可能有幾千個,這個時候為什麼每次讀取頁面的時候都得去 DB 撈資料,組合,Render 出來呢?還不如用靜態頁面儲存,然後每次修改頁面時都重新產生新的 HTML 即可
但是,如果要利用 Page Cache 做到某些部份的功能實在有點麻煩。像是在同一個頁面裡面,有些地方是很少機會修改,希望能夠 Cache 起來,但是有些地方修改頻率超頻繁,不能夠用 Page Cache 來做。這個時候,我們就可以使用 Partial Cache 的方式來加快速度,在Rails 裡面 Partial Cache 叫做 Fragment Cache。
使用方式如下
在 View 裡面
選定要 Cache 的部份,將他用 cache block 包起來
<% cache do %> 我們要 cache 的 content <% end %>如此,當我們用 production mode 的時候,你就會發現會出現 tmp/cache/你的controller/你的action.cache 這個檔案,也就是 cache 的內容。並且 reload 的時候,那個 block 的 content 都是不變的。
理論上 cache 是 work 的,但是如果你去翻 log 時,你會發現 db 一樣會去做相關的 operation。原因是因為我們並沒有告訴 Rails ,Controller 裡面某段 code 是已經 cache 好的東西,不需要去執行。我們都知道 db 通常是最大的 bottleneck ,如果 cache 沒辦法避免 db operation,那這樣的 cache 也僅僅省去了 render 的時間,並沒有太多幫助。
在 Controller 裡面
為了避免這樣,我們要在 controller 裡面指明,當 Fragment Cache work 時,某些 operation 是可以不用執行的。
unless read_fragment :action => '這個action的名字' 跟 cache 有關的 operation 只要有 cache ,就不需要去執行的 code..... end
如此如果已經 cache 過了, Rails 就會避開這段 code 的執行。
要如何 Expire Cache ?
Expire Cache 也是相當的方便,在 controller 裡面使用 expire_fragment 即可。
expire_fragment :action => '這個action的名字'
以上都是最最最基本的 Fragment Cache 的機制,但是如果只知道這些東西,根本做不了太多事情,我們下次來談談比較實用的 Fragment Cache 機制。
上次介紹了如何使用最基本的 Fragment Cache,現在來加上一些小小的小 trick。上次介紹在 View 裡面要這樣使用Fragment Cache
<% cache do %> 我們要 cache 的 content <% end %>
Cache 會出現在 RailsRoot/tmp/cache/你的host/你的controller/你的action.cache 這個檔案裡面。假設上面的 action 是在 lala controller 的 haha action ,那們上面的寫法跟 下面的寫法效果是一樣的
<% cache(:controller => 'lala' , :action => 'haha' ) do %> 我們要 cache 的 content <% end %>
簡單講,就是最上面的 cache do 寫法算是預設值,寫不寫好像沒差,當這個頁面只有這裡需要 cache 時,這樣寫就很方便。不過如果這個 haha action 會依照後面接的 id 的不同顯示不同的內容時,你可以很直覺的加上 :id 這個選項
<% cache(:controller => 'lala' , :action => 'haha' , :id => params[:id] ) do %> 我們要 cache 的 content <% end %>
Cache 會出現在 RailsRoot/tmp/cache/你的host/你的controller/你的action/這個頁面的id.cache 這個檔案裡面。簡單講,又多了一層以 action 為名的目錄,目錄裡面每個 id 都有自己的 cache file。這樣的作法可以簡單依照變數的不同區分 cache file 。
不過?
但是老實說,到目前為止,這個 fragment cache 用途還是不大。我們一個 Action 只能使用一個 Partial Cache,那如果同一個頁面有兩個以上的地方要 cache 呢?Partial Cache 的概念就是一個網站有很多個 block 可以被許多頁面共用。假設某個頁面有兩個部份要 cache ,一個是 RSS ,另外一個是 Info 這個地方。那我們依照 Rails 聖經本的方法,使用 part 變數供我們使用
<% cache(:controller => 'lala' , :action => 'haha' , :id => params[:id] , :part => 'rss' ) do %> 我們要 cache 的 rss content <% end %> <% cache(:controller => 'lala' , :action => 'haha' , :id => params[:id] , :part => 'info' ) do %> 我們要 cache 的 info content <% end %>
如此,相關的 Cache 會產生在 RailsRoot/tmp/cache/你的host/你的controller/你的action/這個頁面的id.part=rss.cache 還有RailsRoot/tmp/cache/你的host/你的controller/你的action/這個頁面的id.part=info.cache 這兩個 file 裡面。仔細看就知道,他的命名機制就是 id. part=part_name.cache 這樣的寫法。很簡單吧。
到現在 Partial Cache 才從還好變成好用的階段。read_fragment 或是 exprie_fragment 都是使用
:controller => 'lala' , :action => 'haha' , :id => params[:id] , :part => 'info'
這樣的命名機制來操作,不難吧。
還有嗎?
到現在為止,我還沒看過 :part 還不夠的情況,不過如果真的覺得用 controller , action , id , part 都不夠區分你的 cache ,還有最後一招
<% cache(:controller => 'lala' , :action => 'haha' , :id => params[:id] , :part => 'rss' , :part2 => 'rss' , :part3 => 'rss' .... ) do %> 我們要 cache 的 rss content <% end %>
簡單講,其實 :part 只是聖經本這樣寫,所以在 Rails Fragment Cache 機制裡,id 以後的 fragment 命名方式不限制,而且數量不限制,只要你不嫌打字太累,你大可以用幾百層去命名你的 cache 。出來的 cache file 命名規則是這樣 ailsRoot/tmp/cache/你的host/你的controller/你的action/這個頁面的id.part=rss&part2=rss&part3=rss.cache。總之隨便你怎麼命名 :p
后续看到的文章:
×××××××××××××××××
I am using Devise as authenticating solution in Rails and I have a cached fragment :recent_users.
I want this fragment to expire when a new user is registered, changed or removed, so I put in my(manually created) users_controller.rb
class UsersController < ApplicationController cache_sweeper :user_sweeper, :only => [:create, :update, :destroy] ...
But my fragment does not expire when new creates or changes.
My user_sweeper contains basic prescriptions
class UserSweeper < ActionController::Caching::Sweeper observe User def after_save(user) expire_cache(user) end def after_destroy(user) expire_cache(user) end private def expire_cache(user) expire_fragment :recent_users end end
What am I doing wrong?
Problem solved!
I followed this steps and everything works:
$ mkdir app/controllers/users $ touch app/controllers/users/registrations_controller.rb
In registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController cache_sweeper :user_sweeper, :only => [:create, :update, :destroy] end
Problem was that Registrations in Devise is a separate controller.