JSGI and Stick

JSGI and Stick   这篇文档将描述一个构建web应用程序的框架(framework),该架构构建在JSGI规范基础上,由多个middleware构成,这里的middleware跟我之前已经形成“思维定势”的middleware不太一样,以前一说中间件,想到的是weblogic、jboss之类的application server,这里的middleware没有那么庞大,他们指的就是一些以特定逻辑来处理web request的函数块。 名词定义: JSGI,JSGI对web application的定义,认为web application就是一个function,接受request参数,返回一个response对象,这是一个纯粹的、具有简洁美的概念,所谓function,就是封装具体功能,让外界只关注输入参数类型和返回结果。能够从这个高度看待web application,确实是搞高。JSGI中,定义application就是由多个模块化的middleware组成,这些middleware能够从外部配置。 Application,JSGI application,我们之前已经介绍,就是一个JavaScript函数,接受request,返回response对象,一个最简单的JSGI application应该看起来这个样子: function(request) { return { status: 200, headers: {}, body: [“Hello World!”] }; }   在JSGI规范中,还定义了一个Application对象,其本身当然包含前面说的application功能,另外还有一些额外的方法、特性。后文所说的application对象,指的都是这个。   Middleware,我们指的是一个JSGI application,它能够包裹住另一个JSGI application。request对象是否、如何传递给被包裹的JSGI application,完全由这个middleware来决定。 一个最简化的、不做任何操作的middleware,仅仅是将request作为参数传递给其包裹的内部application,并且返回结果,看起来应该是下面这个样子(nested是被middleware包裹的其他application,已经预先定义): function(request) { return nested(request); }   Middleware Factory, 中间件工厂,姑且这么直译,就是一个JavaScript函数,其接受一个JSGI application作为参数,然后返回一个middleware function。这有点绕,代码看起来应该这个样子: function(nested) { return function(request) { return nested(request); };

RingoJS 与 Java环境集成

RingoJS本身就是构建于Mozilla Rhino之上,Mozilla Rhino是啥——一个Java实现的JavaScript引擎、执行环境…… 这句话对于外人来说,一定觉得很绕……   Java Integration   Ringo的底层JavaScript Engine——Rhino,可以访问任何装载到JVM环境中的Java Class。这就给了Ringo开发者几乎全部的Java功能,Ringo开发者可以在程序中使用Java的丰富库函数。在Ringo中,我们可以访问Java Class的静态(static)方法,访问常量、创建新的Java对象等等。 常用如下三种方式,将Java类文件或者库(library,jar文件)集成进Ringo: 将相关的Java Class或者library放入运行环境的classpath(Ringo本质是一个Java环境) 将Java library(jar文件)放入Ringo的lib文件夹 将Java library(jar文件)或者java package(文件夹)添加到classpath中(配置classpath) 方法1和2都可以seamlessly集成Java对象,Ringo程序中不需显示指定什么java class或者library被集成…… 当然,Java的library和packages也可以在Ringo程序运行过程中显式添加到classpath中,完成集成,Ringo中使用addToClasspath(pathName)来实现这个功能。addToClasspath只有一个参数:pathName,对应要加入的library或者package的绝对路劲。如果想象引入module一样添加java对象,可以使用module.resolve(pathName)方法: addToClasspath(module.resolve(“./library.jar”)) 添加package: addToClasspath(module.resolve(“./package”));   Best Practice: 通常来说,在Ringo模块中,使用addToClasspath()手工加入需要的library或者package是更优选择,原因如下: 最终用户或者程序员,在下载了你的Ringo package后,不需要修改、配置他们的classpath。 不需要手工copy  library到他们的Ringo lib 文件夹 通过addToClasspath()显式添加library和package,如果路径不正确,会抛出异常提示 Explicity adding specific libraries & packages to the classpath serves as a form of documentation for programmers Examples:

RingoJS的模块管理

模块化管理越来越有意思,刚开始看到RingoJS中有JSGI,我还猜想是否是OSGi的一个实现,后来才知道不是。RingoJS的模块化管理是CommonJS的一个实现,很Young,很Simple。   Modules in Ringo   Ringo实现了CommonJS Modules1.1规范,在Javascript世界中,存在多个可用Module patterns,但是在Ringo的世界里,我们只用这个: 每一个文件就是一个模块,不需要特别的语法申明 任何function或者其他属性,只要你在module(文件)中,attatch到exports对象上,他们就被导出(让外部可见),成为这个模块的导出属性 require(‘foobar’)会返回一个拥有模块所有exposed属性的对象,代表foobar模块   剖析Module   In Ringo,每一个javascript文件都被当做是一个module,Ringo提供导入、导出的实现。 一个简单的例子会让事情变得更明白。下面我们实现一个foobar.js模块(module),我们希望这个模块提供add方法,而不是其内部私有方法adder: // foobar.js varadder = function(a, b) { return a + b; };   exports.add = function(a, b) { return adder(a, b ); };   这样,我们就完成了一个module的实现,我们现在可以在ringo环境中,通过require引入这个模块,然后调用这个模块对外开放的add方法(以下在Ringo命令行中执行, >>是Ringo命令行提示符): >> varfoobar = require(‘foobar’); >>foobar.add(3, 4); 7 而模块(module)中的私有(没有export)的方法,我们不能调用: >> foobar.adder(2, 2);

Oracle FAQ

整理硬盘,N年前整理的一份FAQ:   1. Q: Oracle 的安装复杂么? 我是否可以像安装其他程序一样,通过setup程序来安装Oracle? A: Oracle安装在Windows平台,确实可以通过点击setup程序很顺利的完成安装,但是安装完成后的设置操作需要对Oracle的运行机制有一定了解才能保证你的Oracle合理高效运行; Oracle软件在Unix平台安装相对复杂,虽然Oracle提供了基于Java的安装界面,保证了各平台安装界面的一致;但是要完成在Unix平台的安装,需要了解对应的操作系统补丁安装、内核参数调整;X窗口设置等内容,没有安装经验很难独立完成安装。 2. Q:如何确定当前的Oracle版本? A: 当一个系统中安装有多个版本的ORACLE时,可以按照下面的方法来确定当前的Oracle版本:   1、比较“/etc/oratab”与$ORACLE_HOME环境变量;   2、进入ORACLE数据库中,执行SELECT * FROM V$INSTANCE; 3、执行select * from v$version 3. 什么是Oracle的隐藏参数,都有什么作用? A: Oracle中存在这“大量”的以”_”开头的参数,这些参数需要在Oracle专家的指导下使用,在不充分了解其含义、危害的情况下使用,会带来不可预知的副作用;应该说好的系统不会需要设置这些参数,不要迷信这些隐藏的东西。 4. Oracle都有哪些数据类型? A: CHAR 固定长度字符串 最大长度2000 bytes   VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749   NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes   NVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytes   DATE 日期(日-月-年) DD-MM-YY(HH-MI-SS)   LONG 超长字符串 最大长度2G(231-1) 足够存储大部头著作   RAW

Analyze Oracle Listener Log using RingoJS

分析linstener.log(使用RingoJS) 在listener.log中,会记录每一次建立连接的记录,所以在做Oracle 连接相关的问题分析时候,可能需要对listener.log中建立连接的信息进行统计分析。 一些简单的分析需求,可以使用Linux/Unix shell的一些命令行工具来进行,比如grep,wc等,如果想进行一些复杂的分析(某些时间段、某些IP、某些客户端程序建立连接情况),使用perl、ruby之类的脚本语言,配合regular expression,效果也还好;但是做这种类型的分析其实SQL语句是最强大的,此文就介绍一下将listener.log的信息结构化到关系数据库中,然后利用SQL语句进行分析涉及的相关技术。使用的工具介绍:           RingoJS, javascript解释器,Mozilla使用Java语言实现了一个JavaScript Engine,叫做Rhino,RingoJS是基于Rhino实现的一个工具,常用来和Node.js作对比,都是服务器端JavaScript环境,除了JavaScript语言本身的强大功能外,提供丰富的library,文件IO,网络通讯非常易于实现。           PostgreSQL数据库,Oracle太过庞大了,在我的工作电脑上,已经不再安装Oracle了,PostgreSQL是替代者。           sql-store,RingoJS环境中的ORM组件,用于实现JavaScript对象和关系数据库表的映射。 listener.log的结构: <TIMESTAMP> * <CONNECT_DATA> * <CLIENT_ADDRESS> * <COMMAND> * <SERVICE_NAME> * <RETURN_CODE> 当然,在listener.log中,也存在其他信息,不符合这个格式,那部分信息我们只是显示出来,不存储到数据库中分析。 RingoJS实现: var fs = require('fs'); // 使用ringojs fs(Filesystem)组件,来进行文件读写 // 创建到PostgreSQL的数据库连接var {Store, ConnectionPool} = require("ringo-sqlstore");var store =

Oracle Goldengate Bi-Direction Replication

  环境概述: 本次配置OnStar GoldenGate 双向复制测试环境,环境如下:   Primary 端   机器名 machine1 IP 113.52.185.27 操作系统 SunOS oncnjqsvstph09lz00 5.10 Generic_147440-15 sun4u sparc SUNW,SPARC-Enterprise 数据库版本 Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production PL/SQL Release 11.2.0.2.0 - Production CORE 11.2.0.2.0 Production TNS for Solaris: Version 11.2.0.2.0 - Production NLSRTL Version 11.2.0.2.0 – Production是否RAC2节点RAC是否ASM使用ASM复制实例Onstga1 | onstga2Goldengate 安装目录/oracle/goldengateGoldengate

Copy java Object from diffrent classloader

Tutorial Java环境中,由不同ClassLoader装载的类是不能直接赋值的,So...  Featured Updated Jul 16, 2007 by jeremywa...@gmail.com The Problem Suppose you have one object, built using Classes loaded through one ClassLoader, and another object, built using Classes loaded through a ClassLoader that is independent of the first ClassLoader, and you want the two objects to interact: This scenario does not occur very often

Oracle Advanced Security中数据对称加密的key如何生成并保护

Diffie-Hellman密钥交换 Diffie–Hellman密钥交换(Diffie–Hellman key exchange,简称“D–H”) 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来 加密通讯内容。 Diffie–Hellman密钥交换的同义词包括: Diffie–Hellman密钥协商 Diffie–Hellman密钥建立 指数密钥交换 Diffie–Hellman协议 这个方案首先由Whitfield Diffie和Martin Hellman于1976发布。后来发现这个方案已经在之前几年由英国信号情报部门发明(发明者为Malcolm J. Williamson),但是当时这被列为是机密。2002年,Hellman建议将该算法改名为Diffie–Hellman–Merkle密钥交换以表明Ralph Merkle对于公钥加密算法的贡献(Hellman, 2002)。 虽然Diffie–Hellman密钥交换本身是一个匿名 (无认证)的 密钥交换协议,它却是很多认证协议的基础,并且被用来提供传输层安全协议的短暂模式中的完备的前向安全性。 目录 [隐藏] 1 该协议的历史 2 描述 2.1 图示 3 安全性 3.1 身份验证 4 参见 5 引用 6 外部链接 该协议的历史 Diffie–Hellman密钥交换是1976年在Whitfield Diffie和Martin Hellman的合作下发明的。它是第一个实用的在非保护信道中建立共享密钥方法。它受到了Ralph Merkle的关于公钥分配的工作的影响。John Gill提出了离散对数问题的应用。该方案首先被英国GCHQ的Malcolm Williamson在稍早的几年前发明,但是GCHQ直到1997年才决定将其公开,这时在学术界已经没有了研究这个算法的热潮了。 这个方法被发明后不久出现了RSA,另一个进行公钥交换的算法。它使用了非对称加密算法。 2002年,Martin Hellman写到: 这个系统...从此被称为Diffie–Hellman密钥交换。 虽然这个系统首先是在我和Diffie的一篇论文中描述的,但是这却是一个公钥交换系统,是Merkle提出的概念,因此如果加上他的名字,这个系统实际上应该称为'Diffie–Hellman–Merkle密钥交换'。我希望这个小小的讲坛可以帮助我们认识到Merkle对公钥密码学的同等重要的贡献。 The system...has since become known as Diffie–Hellman key exchange. While that system