Magicshui's Blog

Magicshui on Programming && Life

如果哥懂Javascript就可平步青云

我是标题党!

不过,javascript的确是势不可挡,怎么说能?看下面的场景:

冥思苦想半天终于想到了一个牛B的东西(夸张),然后我就草草写完了后台,但是前端的东西郁闷了,之间展示?你把用户当猴耍!现在的网站稍微牛逼哄哄点的那个不是弄点效果,叫做用户体验,用户体验爽了,你的门路就广了。但是现在的用户就像我们家的“江洋一枝花”那样,自从吃过骨头以后再也不搭理馒头了,所以,你必须要使用Javascript做东西。什么自动刷新、自动提示、Modal层都统统加上,不管三七二十一,你还不能让速度慢了,速度慢了,应用就死了~于是我苦苦搜索各种js的代码,这里贴一个,那里粘一下,第二天,上课迟到了~

现在的服务都强调云端,什么叫云端?就是一个字“飘”,所谓常在江湖漂,哪能不挨刀,比如Adobe君的Flash,飘得过火了,被KO了~就此可见,中立的永远是最好的,因为不会有人红眼,“眼是黑的,心是红的;但眼红了,就心黑了”。javascript能够有这个地位,起码对于前段开发是这样,不会javascript就不是一个称职的UI人员

但是,世界在变,前台人员js用爽了以后,有人希望在后端也同样能够使用,毕竟前台后台一家人是很多公司的现状(国内小公司),于是,有人做出了node.js,这个项目很牛B,因为有google助力,采用的V8来做引擎,他的目的是建立迅捷的网络引擎。呜哈哈,看来.NET的压力要大了,因为后端现在都是javascript觊觎的地方了,那天一个不小心我们都是js-er了。但是我觉得这一天还有点时间,因为后端的东西比前端复杂的多,不过不得不说我们又多了一个新选择

如果哥懂得javascript,我就能实现三屏一云,何谓三屏一云,这是微软的口号。现在被我借用下,因为桌面我们能通过widget实现、云端使用node.js,至于移动设备端,领头羊就是webOS。自从Plam被HP收购以后,就变得满面红光,在哪里都要咋呼两下,而webOS也是越做越起劲,打鸡血了,最近的大作就是Enyo,因为他们有Ares,现在为了抵抗牛逼哄哄的苹果和免费为王的Android以及后起之秀WP7,引入了又一位女神Enyo。其实我觉得不就是个伪平台吗,有什么新奇的,但是当我看到它能够在chrome里实现这些东西以后,我就知道,Plam的转机到了,这玩意有料~貌似代码就是html,js,太让人心动了(可惜呀,我不会js)

所以,哥太平凡,如果会javascript,就能够平步青云!

Quora技术构架

现在国内正在上限一个站点,叫知乎,直接是抄袭的Quora。这里Phil Whelan给出了关于Quora技术构架的详解,在一些地方看到,现在的大网站用户量、数据量上去以后,构架就那几个选择,出创新的地方不多,的确,也许解析中的一些东西不新,但是对于我们这些希望以后能够独挡一面的童鞋来说,算是进步台阶上的一个垫脚石吧。

对于Quora,Phil首先说到的就是速度,然后延伸为搜索框、long polling、缓存,然后就是说到了关于服务器软件,云端,编程语言等等

      • 搜索框方面,Quora因为只是为标签、用户名、标题建立了索引,所以,你看到的快速反应时自然地,因为全文检索现在没加入进去,而如果现在加入,估计响应速度就要降几个数量级了。同时,全文检索没有,只是依靠标题来进行相关性的提示,不算是完善,以后改进的重点估计会在这里。
  • long polling,因为我们是Web 2.0的世道,所以什么刷新呀越少越好,自然地、无缝的交互不断被提倡,方式就是使用Ajax来更新,但是,这里就有问题了,局部更新你需要不断http请求,少了还可以,但是多了呢?Phil举个例子,在他们将近1百万的用户中,如果有10万人在线呢?你的服务器需要接受到10万个请求,并且如果一个页面中请求的连接多、请求频繁,服务器负载就不简单控制了。所以,Phil说“使用long polling呀”,恩呢,这就是我一直想要寻求的技术(嘿嘿,我是技术新手,不懂怎么描述它)~设置在50秒内等待请求,极大地减缓了服务器压力,不过你也是最多把它减少10万*n多点,所以,如果你的服务器端软件不行那就嗝屁了
  • 缓存,通过使用缓存能够将动态的网页简单的变成了半静态了,Memcached还是首选,因为后台他们使用的MySql作为数据存储项
  • 负载均衡,使用HAProxy呗
  • 反向代理,Nginx
  • 对了,忘记重点了,他们使用Python作为大部分的构架的主力语言,因为用的多,跨构架多,差点就用ruby,可惜都不熟悉,看来ruby的人气不是一般的旺
  • 而在网页构建方面,他们使用的Amazon S3来保存静态文件,同时遵循了14条快速加载网页的要领:
  • 更少的HTTP请求
    使用内容传输网络
    添加过期头
    Gzip
    头部添加网页风格文件
    底部放置javascript文件
    Avoid CSS Expressions
    外部放置Javascript和CSS
    减少DNS查找(难道是直接10.0.186.1?域名IP换了怎么办?)
    最小化Javascript
    拒绝转向
    删除没用的脚本
    配置ETags
    缓存AJAX

原文地址:http://www.philwhln.com/quoras-technology-examined

MVC步步深入:11

关于数据库的ORM方便,前面的几个例子都是使用的Entity Frame,这个东西比NHibrate起步晚,而且还正在发展壮大中,所以使用的成熟度还有待考验,而微软自己的一个示范项目中,貌似就是使用的NHibrate而非EF,但是我们不能否认EF与微软产品结合的程度要高一些,并且近期EF CTP5的发布算是为这个产品吹鼓东风吧

因为很多概念可能没有介绍过,所以下面先给出完整的代码,以后的几篇文章都是根据这个代码来做解释,当然这是根据微软官方的文章做基础,不是原创。

先说下背景,有这样几个类:Princess, Unicorn, Castle, and LadyInWaiting。其中Princess能够拥有很多Unicorn、Castle以及Ladyinwaiting,但是一个Castle中只能有一个Ladyinwaiting。每一个Castle都是按照位置来做标记,他具有一个符合类型ImaginaryWorld。

完整的Model代码:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Database;
using System.Data.Entity.Infrastructure;
using System.Data.Metadata.Edm;
using System.Data.Objects;
using System.Linq;

namespace Magic.Unicorn
{
    public class Princess : IPerson
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection Unicorns { get; set; }
        public virtual ICollection LadiesInWaiting { get; set; }
    }

    public class Unicorn
    {
        public int Id { get; set; }
        public string Name { get; set; }

        [Timestamp]
        public byte[] Version { get; set; }

        public int PrincessId { get; set; } // FK for Princess reference
        public virtual Princess Princess { get; set; }
    }

    public class Castle
    {
        [Key]
        public string Name { get; set; }

        public Location Location { get; set; }

        public virtual ICollection LadiesInWaiting { get; set; }
    }

    [ComplexType]
    public class Location
    {
        public string City { get; set; }
        public string Kingdom { get; set; }

        public ImaginaryWorld ImaginaryWorld { get; set; }
    }

    [ComplexType]
    public class ImaginaryWorld
    {
        public string Name { get; set; }
        public string Creator { get; set; }
    }

    public class LadyInWaiting : IPerson
    {
        [Key, Column(Order = 0)]
        [DatabaseGenerated(DatabaseGenerationOption.None)]
        public int PrincessId { get; set; } // FK for Princess reference

        [Key, Column(Order = 1)]
        public string CastleName { get; set; } // FK for Castle reference

        public string FirstName { get; set; }
        public string Title { get; set; }

        [NotMapped]
        public string Name
        {
            get
            {
                return String.Format("{0} {1}", Title, FirstName);
            }
        }

        public virtual Castle Castle { get; set; }
        public virtual Princess Princess { get; set; }
    }

    public interface IPerson
    {
        string Name { get; }
    }

    public class UnicornsContext : DbContext
    {
        public DbSet Unicorns { get; set; }
        public DbSet
 Princesses { get; set; }
        public DbSet LadiesInWaiting { get; set; }
        public DbSet Castles { get; set; }
    }

    public class UnicornsContextInitializer
        : DropCreateDatabaseAlways
    {
        protected override void Seed(UnicornsContext context)
        {
            var cinderella = new Princess { Name = "Cinderella" };
            var sleepingBeauty = new Princess { Name = "Sleeping Beauty" };
            var snowWhite = new Princess { Name = "Snow White" };

            new List
            {
                new Unicorn { Name = "Binky" , Princess = cinderella },
                new Unicorn { Name = "Silly" , Princess = cinderella },
                new Unicorn { Name = "Beepy" , Princess = sleepingBeauty },
                new Unicorn { Name = "Creepy" , Princess = snowWhite }
            }.ForEach(u => context.Unicorns.Add(u));

            var efCastle = new Castle
            {
                Name = "The EF Castle",
                Location = new Location
                {
                    City = "Redmond",
                    Kingdom = "Rainier",
                    ImaginaryWorld = new ImaginaryWorld
                    {
                        Name = "Magic Unicorn World",
                        Creator = "ADO.NET"
                    }
                },
            };

            new List
            {
                new LadyInWaiting { Princess = cinderella,
                                    Castle = efCastle,
                                    FirstName = "Lettice",
                                    Title = "Countess" },
                new LadyInWaiting { Princess = sleepingBeauty,
                                    Castle = efCastle,
                                    FirstName = "Ulrika",
                                    Title = "Lady" },
                new LadyInWaiting { Princess = snowWhite,
                                    Castle = efCastle,
                                    FirstName = "Yolande",
                                    Title = "Duchess" }
            }.ForEach(l => context.LadiesInWaiting.Add(l));
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            DbDatabase.SetInitializer(new UnicornsContextInitializer());

            // Many of the code fragments can be run by inserting them here
        }
    }
}