ruby/groovy xml builder

两段代码,均输出同样的结果,大家比较以下吧

ruby

require 'rubygems'
require "builder/xmlmarkup"

xm=Builder::XmlMarkup.new(:indent=>2)

puts xm.html{
	xm.head{
		xm.title("History")

	}
	xm.body{
		xm.h1{"Header"}
		xm.p{
			xm.text!("paragraph with ")
			xm.a("a Link","href"=>"http://onestepback.org")
		}
	}
}

groovy

import groovy.xml.MarkupBuilder
def writer=new StringWriter()
def xml=new MarkupBuilder()

xml.html{
	head{
		title("History")
	}
	body{
		h1("Header")
		p("paragraph with"){
			a("a Link",href:"http://onestepback.org")
		}
	}
}

println writer.toString()

xml

<html>
<head>
<title>History</title>
</head>
<body>
<h1>Header</h1>
<p>paragraph with
<a href='http://onestepback.org'>a Link</a>
</p>
</body>
</html>
 
发表在 未分类 | 留下评论

扔掉emacs的时候到了,sublime text2

http://www.sublimetext.com

不错的介绍

http://lucifr.com/139225/sublime-text-2-tricks-and-tips/

windows 常用的几个快捷

ctrl+r 快速定位方法或类

ctrl+shift+p  调用sublime  命令

ctrl+p 切换文件

ctrl+~ 显示控制台

f7 或ctrl+b运行 来自javaeye的讨论 http://www.iteye.com/topic/1119388?page=3

http://istyles.blog.163.com/blog/static/1811003892011828111418654/ 快捷键

增加groovy/nodejs build system

tools-build system -new build system…

创建Groovy.sublime-build

{
“cmd”: ["%GROOVY_HOME%\\bin\groovy.bat","$file"],
“selector”:”source.groovy”
}

{ “cmd”: ["%GROOVY_HOME%\\bin\\groovy.bat","$file"], “selector”:”source.groovy”}

创建JavaScript.sublime-build

{

“cmd”: ["c:\\Program Files\\nodejs\\node.exe","$file"],

“selector”:”source.js”

}

发表在 未分类 | 留下评论

curl通过 ado访问sql server

注意,该代码运行在客户端!

{curl 8.0 applet}
{curl-file-attributes character-encoding = “utf8″}
{import * from CURL.GRAPHICS.ACTIVEX}
{let names:StringArray = {StringArray “code”, “channel”, “channel_count”, “name”,”voltage_standard”,”voltage_upper_limit”}}
{let domains:StringArray = {StringArray “String”,”int”, “int”, “String”,”int”,”int”}}
{let labels:StringArray={StringArray “代码”,”路”,”总路数”,”名称”,”标准”,”上限”}}
{let fields : {Array-of RecordField} = {{Array-of RecordField}}}
{for i:int=0 below names.size do
let domain: Domain = {Domain.from-type {evaluate domains[i]}}
{fields.append {RecordField names[i],domain = domain,caption=labels[i],nullable? = true}}
}
{let cn:ActiveXObject = {ActiveXObject ClsId = |”{00000514-0000-0010-8000-00AA006D2EA4}”|}}
{let cnstr:String = ” Driver=\{SQL Server\};Server=(local);Database=earrow;Uid=sa;Pwd=;” } || SQLServerの場合
{cn.Open cnstr}
{let sql:String = “SELECT code,channel,channel_count,name,voltage_standard,voltage_upper_limit from devices;”}
{let rs:ActiveXObject = {cn.Execute sql}}
{let rds : {Array-of RecordData} = {{Array-of RecordData}}}
{while {rs.EOF} == false do
let rd : RecordData = {RecordData}
{for i:int=0 below fields.size do
||        {output {rs.Fields names[i]}.Value}
let val:any = {rs.Fields names[i]}.Value
{switch fields[i].domain.type
case String do
set rd[ fields[i].name] = val
case int do
set rd[ fields[i].name] = val
}
}
{rds.append rd}
{rs.MoveNext}
}
{rs.Close}
{cn.Close}
{rs.destroy-object}
{cn.destroy-object}
{let rsg : RecordSet = {RecordSet {RecordFields {splice fields}}, {splice rds} } }
{let rg:RecordGrid = {RecordGrid width=16cm, height = 10cm, record-source = rsg,font-family = “宋体” } }
{value rg }

{curl 8.0 applet}{curl-file-attributes character-encoding = “utf8″}{import * from CURL.GRAPHICS.ACTIVEX}

{let names:StringArray = {StringArray “code”, “channel”, “channel_count”, “name”,”voltage_standard”,”voltage_upper_limit”}}
{let domains:StringArray = {StringArray “String”,”int”, “int”, “String”,”int”,”int”}}{let labels:StringArray={StringArray “代码”,”路”,”总路数”,”名称”,”标准”,”上限”}}
{let fields : {Array-of RecordField} = {{Array-of RecordField}}}{for i:int=0 below names.size do    let domain: Domain = {Domain.from-type {evaluate domains[i]}}    {fields.append {RecordField names[i],domain = domain,caption=labels[i],nullable? = true}}}
{let cn:ActiveXObject = {ActiveXObject ClsId = |”{00000514-0000-0010-8000-00AA006D2EA4}”|}}
{let cnstr:String = ” Driver=\{SQL Server\};Server=(local);Database=earrow;Uid=sa;Pwd=;” } || SQLServerの場合{cn.Open cnstr}
{let sql:String = “SELECT code,channel,channel_count,name,voltage_standard,voltage_upper_limit from devices;”}{let rs:ActiveXObject = {cn.Execute sql}}
{let rds : {Array-of RecordData} = {{Array-of RecordData}}}{while {rs.EOF} == false do    let rd : RecordData = {RecordData}    {for i:int=0 below fields.size do||        {output {rs.Fields names[i]}.Value}        let val:any = {rs.Fields names[i]}.Value        {switch fields[i].domain.type         case String do            set rd[ fields[i].name] = val         case int do            set rd[ fields[i].name] = val        }    }    {rds.append rd}    {rs.MoveNext}}{rs.Close}{cn.Close}{rs.destroy-object}{cn.destroy-object}
{let rsg : RecordSet = {RecordSet {RecordFields {splice fields}}, {splice rds} } }
{let rg:RecordGrid = {RecordGrid width=16cm, height = 10cm, record-source = rsg,font-family = “宋体” } }
{value rg }

发表在 未分类 | 留下评论

再来说说curl

是ria 的那个curl (www.curl.com) 了,我关注这个东西很多回了,在这个网站上看不到报价,昨天转到日本网站上,才发现日本的网站才能算是主站. 才发现它的报价

http://www.curlap.com/products/price.html

saas或企业许可是1,500,000 日元 ,折合人民币是12.3万,有点贵,小项目肯定是不行,开发工具pro版本是59800日元,折合人民币是4903.6,一般可以承受.开发版是2.46万,不过限制20个客户端,而且不能商用.非pro的分布是免费的,但需要在线申请

不过curl 还是我见过的最轻量级的ria,无论是语言,还是运行时(虽然有8~9M),开发工具(30M). 运行速度非常快,如果仅仅是本地资源,也不需要许可,但昨天试了一下,一访问网络资源,就需要许可,除非你用localhost.虽然可以申请免费许可,但正规的途径还是要申请商业的许可,这个价格实在太贵了.

在abobe /ms都在拥抱html5的时代,curl还能走多远不得而知,但curl 得确是个不错的东西.符合我对ria 的最起码的认可条件(性能),有空我还是会在localhost玩玩这个东西的

发表在 未分类 | 留下评论

grails 中直接使用sql

即直接使用groovy.sql.Sql ,方法很多,总结一下比较有意思
焦点在于,怎么创建Sql实例,Sql.newInstance 需要连接参数,所以最笨的方法就是从配置中获取
import org.codehaus.groovy.grails.commons.*
class SomeService {

    boolean transactional = true
    def config = ConfigurationHolder.config

    // set up the Sql object
    def sql = groovy.sql.Sql.newInstance(
            config.dataSource.url,
            config.dataSource.username,
            config.dataSource.password,
            config.dataSource.driverClassName)
第二个方法是使用已有的bean dataSource,
利用service或controller 自动注入的特性,
同样的方式也可以得到sessionFactory等对象
class SomeService{
def dataSource
def sql=new groovy.sql.Sql(dataSource)
如果你需要在domain class中,也可以手动获取dataSource

import groovy.sql.Sql
import org.codehaus.groovy.grails.commons.ApplicationHolder
import org.springframework.context.ApplicationContext

ApplicationContext ctx = (ApplicationContext) ApplicationHolder.getApplication().getMainContext();
def dataSource = ctx.getBean('dataSource')
def sql = new Sql(dataSource)

第三种,使用sessionFactory.currentSession.connection

class MyControllerOrMyService {

   def sessionFactory

   def methodname() {
      proc = "sql to call a stored proc"
      def conn = new Sql(sessionFactory.currentSession.connection())
      def result1 = conn.rows(proc)
      def result2 = MyClass.Find("from MyClass where foo='bar'")
      return [result1, result2]
   }
}
 
当然,第四种方法也可以修改为手动获取模式,参考第二种
大凡成功的web framework,如django/rails ,
会拥有一个简单的(通常是activerecord模式)和sql支持很好的orm,
而grails 则可能需要借助hibernate+sql的结合才能做到,
下面同样列出如何使用hibernate的createSQLQuery
def sessionFactory

sessionFactory = ctx.sessionFactory  // this only necessary if your are working with the Grails console/shell
def session = sessionFactory.currentSession 

def query = session.createSQLQuery("select f.* from Foo where f.id = :filter)) order by f.name");
query.addEntity(com.acme.domain.Foo.class); // this defines the result type of the query
query.setInteger("filter", 88);
query.list()*.name;
 
 

以上代码参考stackoverflow等多个网址,不再一一列出出处!
发表在 未分类 | 留下评论

java串口通讯

java comm api 2版本不支持我的usb串口, 3没有for windows 版本,后来使用rxtx,使用的是java comm api的例子代码. 使用的是事件模式.怎么也不通.

java的byte 是有符号的,180就变成-76,一开始觉的这个会不会有问题,google 一下后说write(int)其实就是写无符号byte,但结果还是不行.

到rxtx的网站上一查原来是漏了一句, serialPort.notifyOnDataAvailable(true),还以为给java comm api的例子代码给坑了. 不过回头再看例子代码,原来是自己不小心给删掉了. 乌龙,整整浪费了3小时时间.

事实上有符号byte对通讯发送过程是完全没有影响的,读的时候倒是要注意,不过可以使用DataInputStream包装InputStream,DataInputStream提供了readUnsignedByte(),readUnsignedShort()方法,可以让你避免转换

发表在 未分类 | 留下评论

groovy/grails 资源

groovy/grails 资源

官方网站

groovy.codehaus.org

http://grails.org/

国内

http://groovyq.net/

http://www.groovy.org.cn/blog/

推荐groovy 项目

http://gpars.codehaus.org/ 并发

http://groovy.codehaus.org/Grape 处理依赖的

gradle 构建工具

developerWorks

精通grails系列

http://www.ibm.com/developerworks/cn/java/j-grails/

实战groovy 系列

http://www.ibm.com/developerworks/cn/java/j-pg/

精通Groovy 教程

http://www.ibm.com/developerworks/cn/education/java/j-groovy/index.html

javaeye

《Groovy and Grails Recipes》翻译之旅

http://www.iteye.com/blogs/subjects/Groovy_Grails

实战 groovy

http://www.iteye.com/blogs/subjects/justjavac

csdn

Groovy系列目录

http://blog.csdn.net/hivon/article/details/4256296

blogjava

朝花夕拾——Groovy & Grails

http://www.blogjava.net/BlueSUN/archive/2007/04/23/112978.html

图书

groovy in action 中文翻译1-7章

http://www.groovy.org.cn/blog/wp-content/uploads/2011/08/groovy+in+action_%E4%B8%AD%E6%96%87.pdf

infoq grails 入门指南

http://www.infoq.com/cn/minibooks/grails

http://groovyquan.iteye.com/blog/264209

Beginning Groovy and Grails  From Novice to Professional.pdf

Grails in Action.pdf

Grails Persistence with GORM and GSQL.pdf

Groovy and Grails Recipes.pdf

Groovy for Domain-Specific Languages.pdf

Groovy in Action.pdf

Groovy Programming.pdf

Groovy Recipes Greasing the Wheels of Java.pdf

Programming Groovy Dynamic Productivity for the Java Developer.pdf

The Definitive Guide to Grails, Second Edition.pdf

自行google 皮皮书屋 英文版的都有

Groovy 版本更新说明

http://www.infoq.com/cn/articles/groovy-1.5-new

http://www.infoq.com/cn/articles/groovy-1-6

http://www.infoq.com/cn/news/2010/01/groovy_17_grails_12

发表在 未分类 | 留下评论

正式启动marsx web版本

html/js 是未来,在写了一些原型代码后,我决定正式启动marsx 纯web版本 ,代号是我早期参与过的一个项目 c3.

该版本将基于extjs 3.4/nodejs/mongdb等技术构建 ,详细信息参见 http://code.google.com/p/easynew-c3/

原型截图

发表在 未分类 | 留下评论

ejs的block

ejs的block 使用<%- block_name %>的格式,其中body是默认的,即layout.ejs中定义了<%- body %>,则模板的所有内容均输出在这里. 例子

layout.ejs

<html>
<head>
<%- extrahead %>
</head>
<body>
<%- body %>
</body>
</html>

index.ejs
<% extrahead=”extrahead内容” >

这些都是body

如果extrahead内容很多,建议写在_extrahead.ejs中,然后

<% extrahead=partial(‘_extrahead.ejs’) %>

如果你不想新建一个文件,所以可以利用\n来换行,就是可读性差了些,也可以达到目的

<% extrahead=”<link ref=’stylesheet’ type=’text/css href=’/static/js/themes/default/easyui.css’/>\n<link ref=’stylesheet’ type=’text/css’ href=’/static/js/themes/icon.css’/>\n<script type=’text/javascript’ src=’/static/js/jquery-1.6.min.js’></script>\n<script type=’text/javascript’ src=’/static/js/jquery.easyui.min.js’></script>\n” %>
发表在 未分类 | 留下评论

django 1.4 的staticfiles

staticfiles的引入是件好事,但如果你原来用/js, /css , /images 这样老早的php,asp,asp.net的语言习惯引用js/css/image文件的话就惨了,因为STATIC_URL 必须得提供一个url , /当然不行了, 所以,所有模板页面中的引用都要改
由于引入了staticfiles,默认的静态文件均放在app的static 目录中,如django.contrib.admin 就在django/contrib/admin/static/admin中了,在本地开发时,如果DEBUG是True ,django自动帮你处理了,不用在urls 中添加(r’^js/(?P<path>.*), ‘django.views.static.serve’, {‘document_root’: settings.JS_ROOT})之类的声明了
MEIDA_ADMIN_PREFIX 被淘汰了,这个本来是用来处理django.contrib.admin资源的,而MEDIA_ROOT,MEDIA_URL 则被保留来处理用户上传的数据,其实用户上传的数据还是可能与app相关的
这是我原来我的site_media下的文件夹
project
  site_media
    js
    images
    css
    images
按staticfiles的原则就是
STATIC_ROOT= os.path.join(DIRNAME,’site_media/’)
MEDIA_ROOT =os.path.join(STATIC_ROOT,’uploads/’)
MEDIA_URL=’/uploads/’
IMAGES_ROOT=os.path.join(STATIC_ROOT,’images’)
CSS_ROOT=os.path.join(STATIC_ROOT,’css’)
JS_ROOT=os.path.join(STATIC_ROOT,’js’)
STATIC_URL=’/static/’
STATICFILES_DIRS=((‘images’,IMAGES_ROOT),
(‘css’,CSS_ROOT),
(‘js’,JS_ROOT))
由于uploads是media_url ,在本地开发时,你还需要为其指定
(r’^uploads/(?P<path>.*), ‘django.views.static.serve’, {‘document_root’: settings.UPLOADS_ROOT}),
才行
发表在 未分类 | 留下评论