GAE app.yaml version number

If you don’t change the version number in app.yaml,your changes will be made live immediately.When you are developing your application and are not formally in production,it is good practice to leave the version number unchanged when you upload new version.

一直都有个疑惑,在 GAE 上部署 App 新版本的时候,app.yaml 里面 version 该怎么设置,为求保险,之前都是依次递增。看到上面这一段明白了,如果不修改,那么会完全覆盖掉 GAE 上当前版本,新版本立即生效,这在进行实时开发的时候非常方便。如果在当前稳定版本的基础上测试新功能开发,最好修改 version number,这样对外跑一个稳定版本,测试版本可以单独跑,互不耽误。测试通过后可以在 versions 设置哪一个作为默认应用版本。

旧博客统计留念

 old blog count

根据雅虎统计,从 2008-04-02 开始,恰好两年时间。

My first Ajax script

<div id = "chatcontent">
    Loading…
</div>
<script>
    function updateMsg(){
        $.ajax( {
            url:"/messages",
            cache:false,
            success:function( html ){
                $("#chatcontent").html( html );
            }
        } );
        setTimeout( ‘updateMsg()’,1000 );
    }
    updateMsg();
</script>

Picky 改动记录二

从 hg 拿到 Picky 最新代码,改了一点点,部署成功。留个记录:

  1. writer.py line 211 添加 try..except,解决不能登录后台。这个好像是 Twitter Search 和 GAE memcache 的问题,好像 Twitter Search 默认只能搜索七天(?)内的 Tweets,这样如果之前在 Twitter 上有链接到博客,memcache 里的 mentions_twitter 不为空,但是时间长以后 mentions_twitter 获取不到 [ ‘results’ ],造成登录后台时候错误,KeyError: ‘results’。
  2. robots.txt 修改 sitemap.xml 为绝对地址,RobotsHandler 生成 robots.txt 的时候没有对 template_values 赋值;
  3. 删除两个主题 sidebar.html、article.html、footer.html 模板里的 Google Ads;
  4. header.html 追加 Google Webmaster Meta 验证;
  5. 更换 Favicon.

PS:刚部署完,就发现 Livid 追加了一个新功能,Tweets:Latest 20 Tweets by @livid,期待已久的功能,目前 hg 里代码还没有更新,回头再更新。准备偷师一下这个 Tweets 的实现,看能不能把腾讯微博的给添加进来。Oh NO,腾讯微博连 RSS 都不支持,WTF!

教训

由于校内更改了状态发布的代码,所以之前的 Fannt2r 失效。今天修改时候由于一个细节问题浪费了不少时间:

  1. 小心中间临时变量名。由于设置了一个函数变量 cookie,而中间又有 cookie 临时缓存,之前都是用 cookie 一个变量,导致变量的值被篡改。所以,中间临时变量名字不要跟函数变量一样,改为 cookie_buf;
  2. 细心耐心的去调试程序。

PS:Python 真的很有爱。

玉树不倒

国务院决定,为表达全国各族人民对青海玉树地震遇难同胞的深切哀悼,2010年4月21日举行全国哀悼活动,全国和驻外使领馆下半旗志哀,停止公共娱乐活动。

为玉树人民默哀。玉树不倒,青海常青。

一日黄山

由于我悲剧的手机线充,去黄山的这两天不敢随意上推,也就无法随时记录这次黄山一日的一些感受想法,下面这些字是回来后回想,些许带着情绪。标题很明显就带着情绪。

  1. 坐车真累,17 号早上 7 点出发,12 点才到汤口,这一路车坐的屁股疼。由于不能手机上网玩,真的很无趣,只有睡觉。所以说,手机在有些时候是打发时间的绝佳武器。
  2. 一路上的风景远观都很不错,很多油菜花,黄灿灿一片非常漂亮。
  3. 往南走,能看到很多跟北方不一样的东西,比如建筑,两层尖顶小楼,应该是南方雨水多带来的特色建筑。
  4. 旅游团订的午餐很烂,而且量很少,我们一桌人几乎都没吃饱。
  5. 导游吃饭前是说先到宾馆,然后再计划下一步是休息还是宏村转转,结果吃了饭把你装上车就跟你耗着,不去宏村就不回宾馆,当然,去宏村的门票要再算。还好老板说给报销,不然估计得在大巴上憋几个小时。
  6. 宏村的设计相当赞,非常的系统化。村子保存的很不错,虽然现在人工修复的痕迹很浓,依然能看出几百年前的样子。
  7. 在宏村想去买点纪念品,但都知道旅游时候买这种东西就是明摆着让人宰,一个木工艺品要价 15,最后 5 块钱入手。
  8. 晚上住宿就是个杯具,先是我们 43 个人被分成两批,说一个宾馆住不下,13 个人出去另一个宾馆,半路上又把我们 13 个人再次劈开,6 个人去一民宅,另外 7 个去另外一小区民宅,完全让导游宰割,你却没啥办法。
  9. 早上 3 点起床,早餐,然后换乘黄山旅游大巴上山,盘山路真险,绝对十八弯。
  10. 缆车上山,开始发现人多,接下来一整天的感受就是人多。
  11. 风景确实很美,只可惜 18 号天公不作美,早上阴天,远景看的不是太清楚。临时充当领队,拍了不少照片,可惜不是自己的相机,还没拿到照片。嗯,在黄山上,真的想要一个相机。
  12. 八点不到的样子,阵雨如期而至。只见满山上都是雨衣,很好很强大。
  13. 雨中感到光明顶,风大,只拍了几张。
  14. 漫长的前山到后山之行,人挨着人,人挤着人,想走快是妄想,想慢走看景也是不可能。就这么“被”走了三公里到迎客松。
  15. 人真多真多!玉屏峰全是人!下山口严重拥堵,据前方导游说中午时分上山的人依然很多,下山和上山的人在黄山狭窄的石道上堵住了。
  16. 人太多,完全没有兴致玩了,排队下山。下山到天都峰路口时候,天气放晴,云雾飘渺,漂亮。
  17. 上山容易下山难,生生走了两个小时,累的腿都要断掉。
  18. 导游安排到一茶楼品茶,还是有不少同事被营销,纷纷出手买茶叶,可惜咱乡下人,不懂品茶,省掉。
  19. 走了一天真累,粗略算下来有 20 里山路,所以回来的车上歪头就睡着了。
  20. 十点半到合肥,打车回到家,洗洗睡吧。

景色真的很不错,只可惜人太多,又下着雨,完全没法去观景,就被挤着走路了。回头跟老婆挑个好时节好天气再去一番。

Update:今早看新闻,发现自己一不小心还参与创造黄山游客记录,四月这种淡季居然赶上五一十一黄金周的人流量了,其实原因很简单,黄山这一天门票半价,我也是上山后听导游说才知道的。

Missing

刚送老婆上车,心里就空落落的。顺着那条破路往家走。

到楼下,不想上去,一个人呆在屋里不好玩,就去老梁那边串门,扯淡到九点,还是得回去。

肯定睡不着,所以就看无聊的肥皂剧。一集、两集,其实我是在等老婆上火车,顺便等我生物钟赶紧到,这样就可以倒头就睡着。

半夜醒来无数次,一个人的被窝太冷。

早上六点半闹钟,我还是习惯性的关掉,然后再眯一会。

可惜眯一会就没人再叫我了,所以我七点二十惊醒,然后飞奔到公司。

老婆赶紧回来。

PHP 里常量和变量的区别

  1. 常量前面没有美元符号($);
  2. 常量只能用 define() 函数定义,而不能通过赋值语句;
  3. 常量可以不用理会变量范围的规则而在任何地方定义和访问;
  4. 常量一旦定义就不能被重新定义或者取消定义;
  5. 常量的值只能是标量。

Delphi ADOTable 增删查改

//添加记录

ADOTable1.AppendRecord([val1,val2]);

//删除记录

 ADOTable1.Filter :='SaleID='''+text+'''';
 ADOTable1.Filtered := true;
 if ADOTable1.RecordCount = 0 then
      begin
          ADOTable1.Filtered := false;
      end;
 else
      begin
          ADOTable1.Filtered := true;
          ADOTable1.Delete;
          ADOTable1.Filtered := false;
      end;

//查找记录

ADOTable1.Filter := 'SaleID='''+text+'''' ;
ADOTable1.Filtered :=True;

//更新记录

ADOTable1.Edit;
ADOTable1.FieldByName('SaleID').Asstring := text;
ADOTable1.Post;