Twitter Boostrap2.0发布

作为一个程序员,一直为写出来的页面能用但丑陋而烦恼,直到发现了Twitter开源的Bootstrap。Bootstrap是一组css和js,让你可以做出来比较美观的导航、表单、按钮等,非常适合用来做后台和原型。

可是我第一个用bootstrap写的后台还没有上线,它就做了一次主版本升级,这更新速度也太给力了。

Bootsrap2.0相比于1.4变化很大,并不兼容,css/js的格式都有不少变化,很汗。但粗略看起来2.0似乎更加的规范和丰富。功能更全,样式也更美观,有空的时候升级到2.0吧,在发布前。

Related posts

在SAE运行CodeIgniter

昨天试用了phpfog,今天想起来SAE是一个国内的选择哦,就试用了一下。把CodeIgniter放到SAE下运行的过程记录一下。总的来讲:原始版CodeIgniter在SAE运行需要被阉割。但可以到网上找正式的SAE移植版,会work的更好(感谢@文峰186 提醒)。在普通服务器运行的程序很难直接在SAE运行,反之亦然。准备使用SAE的要想好这一点!

样例见:http://weixiao.sinaapp.com/ci/

CodeIgniter 版本为2.0.2。写的是只有一个controller、一个view、不使用DB的最简单的app,在做了如下“裁剪”后就可以在新浪的SAE环境下运行了。

– function set_magic_quotes_runtime() is forbidden for SAE security @ line 67, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/core/CodeIgniter.php        注释掉,反正SAE就是php5.3    — function flock() is forbidden for SAE security @ line 425, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/core/Output.php        注释掉,不就是cache嘛,而且不上锁也不会死人吧?    — function flock() is forbidden for SAE security @ line 58, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/helpers/file_helper.php        注释掉,不上锁不会死人    — function mysql_pconnect() is forbidden for SAE security @ line 88, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/database/drivers/mysql/mysql_driver.php        删除文件。。。不用它的数据库连接    — function mail() is forbidden for SAE security @ line 56, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/helpers/email_helper.php        删除文件。。。不发邮件    — function apc_delete() is forbidden for SAE security @ line 72, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/libraries/Cache/drivers/Cache_apc.php        删除文件。。。不用apc cache。。。    — function mail() is forbidden for SAE security @ line 1526, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/libraries/Email.php        删除文件。。。不发邮件    — function exec() is forbidden for SAE security @ line 603, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/libraries/Image_lib.php        删除文件。。。不处理图片    — function flock() is forbidden for SAE security @ line 101, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/libraries/Log.php        注释掉。。。不上锁死不了人    — function fsockopen() is forbidden for SAE security @ line 236, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/libraries/Trackback.php        删除文件。。。不用这个lib    — function fsockopen() is forbidden for SAE security @ line 386, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/libraries/Xmlrpc.php        删除文件。。。不用xmlrpc    — function flock() is forbidden for SAE security @ line 365, E:\SDKs\SAE_SDK\apps\/weixiao/1/code/ci/system/libraries/Zip.php        注释掉。。。不锁文件死不了人

—-

2011/5/20 update:加入@文峰186 的提醒

Related posts

CodeIgniter, CakePHP and phpfog

CodeIgniterCakePHP都是使用非常广泛的PHP Web框架。都非常优秀,相信任何一个框架都是能满足需求。只是某个应用场景下哪个框架更好,哪个框架更适合的问题。

  • CakePHP文档很好,但CodeIgniter文档更好。
  • CodeIgniter更简单、核心框架更小。这是双刃剑,好处是运行性能更高、更灵活,坏处是不像CakePHP那么多现成的东西可以拆箱即用。
  • 由于上面两点,CodeIgniter上手更容易,如果你熟悉php、对MVC有了解,那我打赌你可以在两个小时内上手。CakePHP则不行,需要理解的东西比较多。

对于我来讲,php初级水平、主要为兴趣而学习、无特定目的,CodeIgniter更合适。

phpFog是HeroKu模式在php下的克隆,使用非常顺手,10分钟之内就搭起来一个测试站点,域名也配置好了。http://phpfog.lixy.us/,而且访问速度还挺快的,http访问、git访问都不错。再次表达对美国IT环境的羡慕。

Related posts

Eclipse下设置github开发环境

在Windows下的Eclipse里使用github配置过程记录如下。

第一,按照github上的指南配置(http://help.github.com/win-set-up-git/基础的git环境。(留意ssh的pub key等保存到哪里了)

第二,在github上创建一个Repository。

第三,在Eclipse的help菜单里找“Eclipse Marketplaces”,在Market Places里面找egit,安装。

第四,(特别重要)把第一步生成的.ssh目录copy到用户目录下并重命名为ssh,例如我的copy后的目录是C:\user\lxy\ssh\

第五,Eclipse里File菜单,Import,即可从git导入刚添加到git的项目了。

第六,修改,并提交。在项目上点右键–>team–>commit。commit是commit到本机的git库,而push才是同步到github。

 

Related posts

Android学习笔记2:获取手机系统信息

Android程序中如果需要获得手机网络信息、系统软件版本、sim卡信息、手机串号等系统信息,可以沿下面路径寻找:(假定在Activity内调用)

(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);

(WifiManager)this.getSystemService(Context.WIFI_SERVICE)

即,查看Context里面都定义了哪些系统SERVICE,然后用getSystemService()将他们获取到,进而获取相关信息。上面两个分别是获得手机网络、wifi网络的Manager。

Related posts

Android学习笔记1:如何将第三方jar文件打入apk文件?

如果Android程序中使用了非系统提供的lib,那么就需要将对应的第三方Jar文件打包入apk包里,否则程序运行出错。

在Eclipse打包第三方jar入apk包的方法是,以下面方式引用jar文件:

Properties -> Java Build Path -> Libraries -> Add External JARs

Related posts

Redis Presharding

Redis Presharding这篇文章让我倍感新奇。
不在于redis的集群解决方案,因为用redis的人很少,需要redis集群的人更少。

让我感兴趣的是下面两点:

1、作者结合实际情况(每个redis instance只要不到1M的内存),给出了超出常规的解决方案(不是随着规模逐渐增加redis instance,然后解决sharding/resharding的问题。而是从一开始就搞128个instance,服务器硬件增加后迁移instance)。
– 这样的独立思考和创见是最值得崇拜的,不要墨守成规。大胆假设,小心求证嘛。

2、攻克核心之后,你依然会有很多事情要做。
上面的presharding方案足够简单了。但作者在文章后半段依然指出并探讨了“两个key分在两个instance时查询难以处理”、“容错”等问题。

Related posts

不同语言程序员的工作心情

在cnbeta上看到一个有趣的统计:不同语言的源程序中出现fuck的比例

在Google Code上,针对每个程序语言都搜索了一下“fxxk”一词的出现文件的个数X,以及没有出现fuck一词的文件的个数Y,然後放在Excel里求了一下百分比(X/(X+Y) * 100%),做了一个图。结果,JavaScript语言中出现的次数高达0.56%,名列全部语言之首

对於Javascript程序员的这种行为可以理解,因为IE,因为浏览器嘛,我就不多说了

Related posts

转载:Foursquare 长达 11 小时的宕机

转自DBA Notes:Foursquare 长达 11 小时的宕机

“在容量的临界点增加新系统资源,必然导致更多的停机时间” — 不要对系统冗余太乐观

“类似 MongoDB 这样的新事物。。。仅仅能够使用是不够的,系统没出问题一切都好,一旦出了异常。。。” — 我倒不那么保守,因为不会有“一起都准备好”的时候出现。所以只要想清楚了最坏的情况是什么,做好了预案就上吧!

前几天 Foursquare 经历了长达 11 个小时的宕机,没错,11 个小时。网站官方的解释是 Shard 负载不均匀造成后续的连锁反应。很多人都知道 Foursquare 在线的 DB 是 MongoDB,今天又看到 10gen (MongoDB的开发与支持团队)的 Eliot Horowitz 在得到 Foursquare 许可后,通过邮件组详细介绍了宕机的过程:Foursquare outage post mortem,不用说,也有为 MongoDB 辟谣的意味在里面。

读罢 10gen 团队的介绍(或者说解释)之后,发现这是一个很好的研究样本。值得分享。

为了提高响应速度,Foursquare 使用 MongoDB 存储 Check-in 的数据已经有一段时间了。这部分数据的数据库起初跑在一个 66GB 内存的 Amazon EC2 单实例上(全部在内存里),两个月前,出于对容量增长的考虑,迁移到两台 Shard 集群上。每个 Shard 机器都是 66GB 内存,为了冗余,每个 Shard 都有复制到 Slave 实例。迁移的目标是所有的 Check-in 数据都保存在内存中。数据根据 ID 分成 200 个 Shard 分片,两台机器各占一般,也就说联机数据在每台机器上各使用 33GB 的内存。两个月相安无事。

问题来了,因为 Shard 算法导致的数据分散不均衡,其中一台(Shard0)数据增长到 67GB(另外一台 50GB),超过了 66GB 的限制,读写部分分散到磁盘上,性能急剧下降。从而,网站宕机。

首先尝试增加第三台 Shard 机器,上线后开始迁移,读取从三台进行,Shard0 的数据迁移到 5% 的时候,但是写操作还是让 Shard0 宕机了。这个时候发现Shard0 存在数据碎片(data fragmentation),即使数据迁移走,还是会占用原来的内存。每个Check-in 文档大约占用 300 字节,而 MongoDB 是 4KB 的页(Page),也就说十几个文档会填满一个页,而迁移 5% 反而造成了页更加稀疏,并不是将页全部删除。

这个时候已经到了第二天,随着网站全面宕机,技术团队开始用 MongoDB 的 repairDatabase() 功能来对数据库进行压缩,因为数据库太大和 EBS 慢,也因为 repairDatabase() 不能充分利用多核CPU 的能力,这个过程耗费了 4 个小时。之后这 5% 的内存空间终于释放出来,系统重新上线。

随着 Shard0 修复,第三台成功上线,进而添加了更多的 Shard 服务器,现在数据已经更加的均衡,通过在Slave上运行 repairDatabase(),然后将其切换到 Master ,每台 Shard 内存占用缩减到 20GB左右。整个故障时间已经延续了 11 小时之多。

产生问题的主要原因就是系统过载,前面介绍每台 Shard 承载原来 50% 的压力,到了问题发生的时候,单台 Shard 的负载已经超过 Shard 之前的系统负载,这时候已经积重难返了,在容量的临界点增加新系统资源,必然导致更多的停机时间。暴露了 Foursquare 团队在容量规划方面的不足之处,或许也因为业务增长太快了吧。另外,内存碎片化的问题在没有宕机之前,技术团队应该没考虑过这个问题,如果文档的大小超过 4K,碎片化问题就不严重了,这是特定应用场景造成的特定问题。10Gen 现在已经着手研究如何进在线压缩(online compaction)。再次,Shard 键值的顺序和插入顺序是不同的,这造成了迁移数据的时候 Chunk 的迁移不是连续的。

这个过程给我们的启示是:最近 NoSQL 已经成为一个热词,类似 MongoDB 这样的新事物当然值得尝试,但是不能冒进,因为驾驭起来并非易事。仅仅能够使用是不够的,系统没出问题一切都好,一旦出了异常,有足够的技术力量(设想一下 Foursquare 得不到 10gen 团队的支持会如何?) 支持么?在极端情况下如何控制? 如果回答不了这个问题,那么还应该暂缓。最好的办法就是…”等待”。

给我的另一个感慨是 Amazon 在云计算领域已经真的成为一个赢家,而且越来越得到 Web 2.0 Startup的信赖。前面说的 66GB 内存,应该指的是EC2 的 “High-Memory Double Extra Large Instance”,可提供的最大内存是 68.4 GB 。CPU 和内存能力都是可以接受的,存储方面的性能似乎还有点不足,也就是其中的 EBS ,指的是 Amazon Elastic Block storage。

EOF

Related posts

App Inventor试用

Google App Inventor是Google提供给的一套Android开发环境,两大特点:

  • 基于网页(Java的)
  • 可视化编程

我申请了一个帐号,前些日子获批了,利用中秋时间体验了一下。可视化编程,非常简单!不需要任何编程基础,不需要写代码,只要按照教程做就能做出简单的Android程序了。我已经完成一个,并在手机里跑了起来,实现发短信查话费功能。

希望能有更强大的Android IDE出现,这样我这个不会写界面的程序员也能做做客户端开发了。

Related posts