luvit

libuv是node js 支持windows平台的产物,在unix用使用libev,而在windows下,则使用iocp. 最近基于libuv开发的c++版本和lua版本也出现了,分别是 node.nativeluvit

从这里的评测看起来 ,node.native/luvit 都高出nodejs一点点,看起来还是语言的差异化造成的.当然,目前的node.native/luvit的状态还不能完全下这个结论

发表在 未分类 | 留下评论

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” %>
发表在 未分类 | 留下评论