g5.User.listOrderByDepartment()*.department.unique()
这个语句可以做什么?g5是程序名,User是域名也就是数据库名,department是字段名,这个语句的意思是从User数据库取出所有数据并按department字段排序,单独取出的department这个字段(不要其他字段的数据)并消除重复项目。
按我的理解,Grails不论用list还是用findAll取出来的数据都是一数组列表(Arraylist),其中每一个元素就是一个数据库的记录,在该数组列表中,第一个是用下标0来访问,例如:
def aa=User.findAllByRole('管理员')
aa[0]表示第一个记录,如此类推。
这个*.表示对数组列表中的每一个元素进行点后面的操作,最前面这个例子.department(小写)表示取出department字段的内容,进行这个操作后得到一个新的列表,例子中得到User数据库中所有department的数据,后面的.unique()是对列表进行消除重复项目的操作,这个操作针对已经排好序的列表有作用,没排好序就没有用。
刚好工作中用到此功能,网上找了一下,有很多例子,但在我这都试验不成功,可能是我的RP问题。只好慢慢摸索,将人家的例子改成以下的样子,终于通过了:
首先在包(package)的开头增加输入语句:
import org.codehaus.groovy.grails.commons.ConfigurationHolder
不然后面response.setHeader等子程序将无法解析。其余的代码如下:
response.setHeader("Content-disposition", "attachment; filename=bxmx-list.csv")
response.contentType = "application/vnd.ms-excel" //在这里设置charset多余,csv文件永远都只是ansi格式。
render(text:"序号,姓名,日期,其他字段等\r\n",encoding:"GB2312") //这里encoding是关键,不然excel打开乱码,
// 奇怪的是,记事本打开永远都不乱码。
def outp=Bxmx.findAll() //这里可以查找数据,你可以用findAllBy等其他手段
outp.each{
render(text:it.xuhao+',') //序号是数字,无需转码
render(text:it.name+',',encoding:"GB2312") //姓名是由中文字符的,需要转码
render(text:it.date.format('yyyy-MM-dd')+',') //日期无需转码
.......
render(text:'\r\n')
}
return false
题外话,这个日期格式的转换,我起初在Grails的文档找不到资料,后来才想起在Groovy的网站上找,找到文档后试验时又不小心用了'yy-mm-dd',怎么结果是乱的?可见我是完全不懂java,原来中间那个mm必须是大写。
天正8.2确实支持64位,但这里要的是天正32位以便与acad2006配合。首先在32位系统中安装天正,以便得到TGStart32.exe文件,也可以从这里的附件获取。启用W7的管理员账号,并以此账号登录,将UAC设置成“从不通知”,安装2006,将C:\Program Files (x86)\AutoCAD 2006文件夹的权限设置成Everyone拥有全部权限,尝试运行ACAD,如果不能运行就以管理员身份运行,出现兼容性警告忽略之。安装天正8.2,因为是64位的系统,天正目录里只有TGStart64.exe作为启动文件,将TGStart32.exe复制入同一目录,并使得桌面图标指向此文件。修改注册表,用记事本将下面文字存成.reg后缀的文件并合并到注册表中:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tangent\TArch\8.0]
"Location"="C:\\Tangent\\TArch8"
"SetupLocation"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tangent\TArch\8.0\License]
"Mode"=dword:00000000
"Server"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Tangent\TArch\8.0\InitFlag]
"InitStart18"=dword:00000000
"InitStart18.1"=dword:00000000
上面的Mode的值要根据实际情况作修改:0-试用版;1-单机锁;2-网络授权。
其实这些信息在安装天正时都设置在HKEY_LOCAL_MACHINE\SOFTWARE\Tangent\TArch\8.0 ,而现在我们使用TGStart32.exe,相应的注册信息得手工搬过来。运行天正,试用一下。正常后注销管理员账号重新登录到常用账号,停用管理员账号,将UAC恢复到默认值,把桌面的ACAD2006和天正8的图标设置成“以管理员身份运行此程序”(在“属性”、“兼容性”里面设置)。再测试运行一下。
不知道在哪里插入附件,只好存到dbank,下面是链接:
http://dl.dbank.com/c08wypiui9
单位要开发web程序,我对PHP、JAVA一点也不懂,临急抱佛脚上网找了一下,说Grails开发如何快速,云云。试用了一下,几分钟就利用scaffold (脚手架) 开发了一个程序,可惜出来的效果是全英文,数据库字段也不接受中文。网上跟汉化字段、改字段显示方面有关的文章、帖子没有,只好买了省科技书店唯一的一本Grails方面的书,但照书操作修改i18n里面的中文信息,没有效果,我感觉是我的版本跟书上介绍的版本不同所致,因为我用的是最新版1.3.7。好在书上有一条经验帮了我,它说可以生成scaffold 的所有代码来分析,我其实不懂Groovy语言,不过勉强编程还有点底,仔细分析之下看到如何利用i18n“汉化”scaffold生成的界面。
附:Grails版本:1.3.7
我用NetBeans6.9作为IDE的,NetBeans对Grails支持已经很不错了。NetBeans打开工程名称后,一般i18n的文件存放在“消息包”里面,找到并打开 messages_zh_CN.properties 文件,NetBeans自动会帮你处理一切unicode转码问题。将下面几行加入到该文件中,用于汉化scaffold的按钮与提示:
default.create.label=新建记录 {0}
default.edit.label=编辑 {0}
default.home.label=主页
default.list.label={0} 明细列表
default.new.label=新建 {0} 记录
default.show.label=显示 {0}
default.button.create.label=新建保存
default.button.delete.label=删除
default.button.delete.confirm.message=你确定要删除吗?
default.button.edit.label=编辑
default.button.update.label=更改
default.created.message=新建了
default.deleted.message=删除了
default.updated.message=更新了
紧接着还要对数据库字段的标题进行汉化,例如有一个数据库表叫Student,数据库的一张表在Grails里面叫Domain(域),表里面有姓名name、学号sid、性别gender等字段,那还要在该文件加入如下信息(注意student已经改为小写,这里要遵从Grails的大小写原则并且大小写敏感,特别是字段名,不能以大写开头):
student.label=学生信息
student.name.label=姓名
student.sid.label=学号
student.gender.label=性别
附:Student.groovy文件的原始内容,以便读者对照参考:
class Student {
String name //姓名
String sid //学号
String gender //性别
static constraints = {
}
}
2011/2/25 更改:default.edit.label=编辑 改成 default.edit.label=编辑 {0} ,这个{0}显示的是数据库名,在这里是学生信息,英文就是student。
XP时代,当单位有几千台计算机时,按组织结构给它们分成几十个工作组,浏览网上邻居时,先浏览展开工作组,再浏览某工作组里面的计算机,这已经成为习惯了。但WINDOWS 7 的就不同了,它浏览网上邻居居然是自动搜索所有的计算机,而且不管什么工作组全部搜进来,由于我们这里计算机太多,找起来很不方便。虽然使用上帝模式 "网上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}" 可以建立一个图标浏览本工作组的计算机,但其他工作组怎办呢?虽然直接在地址栏输入 \\计算机名 确实能找到该计算机,但也没有人记得住这么多机器名啊。
[转帖}在“网络”的界面中,右键点击空白的位置,在右键菜单中,将“分组依据”改为“工作组”,然后点击“查看”-〉“折叠所有组”。
单位要搞VPN,dns的优先级成为问题。vpn有本身的dns,而公众网的DNS总是劫持了,一旦解析内部网机器就劫持到一个“找不到”页面。如何提升vpn的dns的优先级呢?在网上找了很久,终于找到答案,原来这个是网卡的优先级问题,多个网卡也有这种情况。在“网络连接”窗口,有个“高级”下拉菜单,里面有“高级设置”菜单项,在“高级设置”窗口,可以设置网卡的访问顺序。还可以设置服务、协议的绑定。
XP中安装了IPV6后,不像Vista和7那样有一些默认的路由设置,结果是从Vista可以PING通XP,Xp不能PING通Vista。XP德route命令不支持IPV6,所以只能使用下面命令:
netsh interface ipv6 add route fe80::/64 "本地连接" metric=256
本人是小白,不当之处请指正。执行上面命令后可以PING通了。
vs2002真的很难找,bt、电驴搜索、翻版光碟市场都找遍了,就是找不到。
用vs2003为acad2006开发的ARX,不能用appload加载,会显示加载失败,只能用ARX命令载入,但显示不兼容警告。有什么办法使acad认为这是vs2002开发的,从而成功加载呢?
网上找到了这篇文章
Peering Inside the PE: A Tour of the Win32 Portable Executable File Format
http://msdn.microsoft.com/en-us/library/ms809762.aspx对我帮助很大。
用vs2003开发的ARX,dumpbin显示连接器(linker)的版本是7.10,而用vs2002开发的就显示7.00。下面就是7.10改7.00的方法:
打开命令提示符窗口,用dos命令 debug <arx文件名> ,把要改的arx文件装入到debug程序中,按d回车,debug一般把文件装入到0x0100起始的地址中(下面的数字如没有特殊指定一般都是十六进制)),d命令显示8行,也就是0100至017f,头两个字母肯定是“4D 5A”,也就是“MZ”,请注意013c-013f这4个字节,就是PE信息块地址,从我这个例子上看是0108,如图一所示。
这个0108还要加上debug的起始地址100就是0208才是真正的地址。键入debug命令D 0208,可以看到如图二的情景:
图二中,头两个字母一定要是PE,“50 45”,在距离0208地址0x14的地方有两个字节,表示PE文件头可选信息块的大小,其实所谓可选块已经是必有的啦。在我这个例子中是E0,其实只要不是0就行。在距离0208(PE信息头)0x18的地方,就是PE可选信息块的起始地址,那里必定是两个字节0b、01,是个标志,请注意,紧跟着就是连接器(Linker)的版本了,一共有两个字节,头字节是主版本号,第二个字节是次版本号,在我这里是0220行的第三、第四个数:07和0a。只要将0a改为00就行了。在我这里输入debug命令 E 223回车,系统提示0A,输入00回车。改好后输入debug命令w回车把文件保存。到2006中载入该arx程序,通过。当然只是不显示不兼容警告而已,要是程序真有不兼容的情况那还是会发生的。
从网上找到最多的方法是:
ifconfig eth0 down
ifconfig eth0 hw ether 00:34:56:78:90:12
ifconfig eht0 up
其实,这个只能临时改变MAC地址,重起系统后又变回去。
ifconfig存放在sbin里,单独使用可以查看mac地址。
后来找到一法:在 /etc/rc.d/init.d 文件夹下的 network 文件中加入一行:
ifconfig eth0 hw ether 00:34:56:78:90:12
就可以永久地改变MAC地址。
由于购买了新服务器,需要迁移Acad许可服务程序到新的服务器上,该程序存放在安装光盘的S:\Bin\acadFeui\support\nlm文件夹上,名称叫NLM.msi,可惜在很多机器上安装不了,一安装就出错。虽然在我的XP上安装成功,但在我这里所有的服务器上安装都失败,可能是nlite惹得祸。在网上找到方法:
把C:\Program Files\Autodesk Network License Manager文件夹的所有文件复制到新机器,特别是以下四个文件:
adskflex.exe
lmgrd.exe
lmtools.exe
lmutil.exe
运行lmtools.exe,转至“Config Services”页,配置好lmgrd路径、licence文件位置等,保存Services,并使用Services,且让它自动启动,最关键的前提条件是,新机器的IP地址和MAC地址要设置成与旧机器一样,这样许可服务程序就迁移成功了。