HP UX默认shell是POSIX,很不好用,果断换成bash!
- 确认HP UX版本和架构
运行uname -a,会显示版本号(比如B.11.31)和架构(比如ia64),然后去下面的地址搜bash
http://hpux.connect.org.uk/hppd/hpux/
下载与自己版本号与架构相同的bash版本,注意同时还要下载其依赖组件gettext、libiconv和termcap,这些在bash的Runtime dependencies里都有,依次下下来; - 将这四个gz文件解压,得到四个depot文件,上传到服务器(比如/tmp/bash目录下),安装这些组件。最好是按照下面的顺序来:
#swinstall –s /tmp/bash/gettext-0.18.1.1-ia64-11.31.depot
#swinstall –s /tmp/bash/libiconv-1.13.1-ia64-11.31.depot
#swinstall –s /tmp/bash/termcap-1.3.1-ia64-11.31.depot
#swinstall –s /tmp/bash/bash-4.1.007-ia64.11.31.depot
注意在swinstall –s命令后面必须输入depot文件的full path!
swinstall可能有些童鞋不会用,命令敲进去之后会显示一个guide,按回车进入主窗口,在要装的包位置按下空格,反白显示之后再按m,然后Tab键将光标移到菜单,选择Action->Install->OK->Done。 - 将默认shell改为bash。修改/etc/shells文件如下:
/sbin/sh
/usr/bin/sh
/usr/bin/rsh
/usr/bin/ksh
/usr/bin/rksh
/usr/bin/csh
/usr/bin/keysh
/usr/local/bin/bash
然后执行chsh root /usr/local/bin/bash,或者把root换成你想要更改bash的用户,就可以了。如果没有修改/etc/shells文件,就会得到一个invalid shell的错误。
EDM就是Entity Data Model,是EF的主要操作对象。在我理解,EDM是对数据库表的持久化和实体映射。M$提供的两个ORM技术,Linq2SQL和EF,目前大家还是用自底向上(先建表后映射实体类)的设计方法。其实我也是比较倾向于这么做的,画ER图然后往下layout的操作,我不是很感冒。。。。
在Visual Studio里创建一个EDM是非常方便的,提供了一个专门的designer,这个方法在网上也很常见,基本上也没有什么特别需要设置的地方。在创建EDM完毕之后,还是有个比较重要的事情要做,那就是把Entity Set Name改为复数形式,以及把one - many这种关系的one端的navigation properties名字也改为复数,这在后面的coding中会带来相当大的便利。
在VS的解决方案管理器中,打开EDM的方法似乎只有设计器,如果想看一看它的raw编码,可以右键->Open with->XML Editor。据说看懂这个玩意能够带来升级的EF理念,who knows....
这其中的SSDL、CSDL和C-S Mapping的内容都是极端重要的。
EDM中也会有数据库视图,这些视图都是只读的,即没有Insert、Update和Delete命令。
EF会自动为model生成一些实体类,这些实体类就是向model做查询用的。
OK,这就是目前我所了解的EDM。
一条Linq语句,比如下面用于返回一个Dinner对象集合的查询
private NerdDinnerDataContext db = new NerdDinnerDataContext(); public IQueryable<Dinner> FindUpcomingDinners() { return from dinner in db.Dinners where dinner.EventDate > DateTime.Now orderby dinner.EventDate select dinner; }
这条“select”只有当它在的数据被访问或者迭代,又或者是ToList()方法被调用的时候,才会真正向数据库提交。该函数必须返回IQueryable<>类型,这样方便于我们应用点连接式Linq查询,来筛选结果集中的数据。
下面我们来看看如何利用它来实现MVC的分页机制。
我们按照设定的pageSize对数据进行服务端分页,实际上就是把结果集进行窗口筛选,然后回送给用户。
public ActionResult Index(int? page) { const int pageSize = 10; var upcomingDinners = this.dinnerRepository.FindUpcomingDinners(); var paginatedDinners = upcomingDinners.Skip((page ?? 0) * pageSize) .Take(pageSize) .ToList(); return View(paginatedDinners); }
从Model传递过来的结果集,通过Skip()和Take()两个动作,筛选出我们需要的那一页结果。注意这个查询是会被进行优化的。
要想访问某一页,需要在URL中以?参数的形式给出,比如/Dinners?page=1。但这样做并非SEO最优,我们还需要将其转换成常规URL,并且将参数嵌入进去。为此,MVC强大的路由功能就派上用场了。在Global.asax的后台代码中,加入这条路由的注册:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "UpcomingDinners", "Dinners/Page/{page}", new { controller = "Dinners", action = "Index" } ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); }
这样就可以将?参数转化为URL的一部分,至此,分页就搞定了。


