Electronic Joint Business

Solution for E-Business

java

Hazelcast 简介

Hazelcast 是一个开源的内存数据网格(IMDG)解决方案,它提供了可伸缩的分布式内存计算,对提高应用性能来说,Hazelcast 公认是最快且最具可扩展性的途径。特别是, 它提供大家十分熟悉的 Java 接口如 Map, Queue, ExecutorService, Lock, JCache 等的分布式实现,使得分布式计算变得更为简单。比如通过 Map 接口提供了内存键值存储,在保持了友好性的同时,还获得 NoSQL 的诸多优势的同时,提高了生产力。

除了分布式内存数据结构,Hazelcast 还提供一整套方便的 API 来访问集群中的 CPU 从而得到最快的处理速度。Hazelcast 设计目标之一是轻量化、便于使用。 因此 Hazelcast 的分发包只有一个紧凑的库 (JAR)文件,除了 Java 它不依赖其他东西,因此很容易将它插入解决方案中,从而得到分布式数据结构和分布式计算的能力。

Hazelcast is highly scalable and available. Distributed applications can use Hazelcast for distributed caching, synchronization, clustering, processing, pub/sub messaging, etc. Hazelcast is implemented in Java and has clients for Java, C/C++, .NET as well as REST. Hazelcast can also speak memcache protocol. It also plugs in to Hibernate and can easily be used with any existing database system.

If you are looking for In-Memory speed, elastic scalability and the developer friendliness of NoSQL, Hazelcast is a great choice for you.

 

, , ,

用 RapidMiner 进行情感分析 (一)

RapidMiner(社区版,AGPL)是一个免费的开源分析工具,由于其灵活性和鲁棒性,它也成为了一个优秀的原型平台。RapidMiner 提供了一整套完整的算法,允许你快速切换来尝试不同的模型。 使用 RapidMiner 无需编码,但也提供了 R 语言和 Groovy 插件。RapidMiner 基于 Java 的,所以可以在任何平台上运行。这里我会演示如何用监督学习(Supervised learning)来创建一个人气模型以展示其灵活性。

本文将对 RapidMiner 做一个基本介绍,所以我会详细介绍每一个步骤如何进行。

在机器学习(Machine learning)领域,监督学习(Supervised learning)、非监督学习(Unsupervised learning)以及半监督学习(Semi-supervised learning)是三类研究比较多,应用比较广的学习技术,wiki 上对这三种学习的简单描述如下:

  • 监督学习:通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如分类。
  • 非监督学习:直接对输入数据集进行建模,例如聚类。
  • 半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数。

由于本文将使用监督学习,首先我们需要一组标签数据。这里我们将使用康奈尔大学 Pang 和 Lee 所提供movie review data,大小为 2K. 同时你还可以在该站点上找到不少在情感分析方面很有价值的论文。

本文处理记录所用的 RapidMiner 版本为 5.2.017,并带有文字处理扩展插件。 Java 版本为 1.6。本系列分为两部分,在第一部分中重点将放在展示如何构建一个人气模型。您可以点击屏幕截图来查看大图。

>>> 阅读全文

 

, , ,

Scala 指南

一种可伸缩语言

Scala 是一种函数对象混合的语言,具有一些强大的优点:

首先,Scala 可编译为 Java 字节码,这意味着它在 JVM 上运行。除了允许继续利用丰富的 Java 开源生态系统之外,Scala 还可以集成到现有的 IT 环境中,无需进行迁移。
其次,Scala 基于 Haskell 和 ML 的函数原则,大量借鉴了 Java 程序员钟爱的面向对象概念。因此,它可以将两个领域的优势混合在一起,从而提供了显著的优点,而且不会失去我们一直依赖的熟悉的技术。
最后,Scala 由 Martin Odersky 开发,他可能是 Java 社区中研究 Pizza 和 GJ 语言的最著名的人,GJ 是 Java 5 泛型的工作原型。而且,它给人一种 “严肃” 的感觉;该语言并不是一时兴起而创建的,它也不会以同样的方式被抛弃。
Scala 的名称表明,它还是一种高度可伸缩 的语言。我将在本系列的后续文章中介绍有关这一特性的更多信息。

下载并安装 Scala

可以从 Scala 主页 下载 Scala 包。截止到撰写本文时,最新的发行版是 2.6.1-final。它可以在 Java 安装程序版本 RPM 和 Debian 软件包 gzip/bz2/zip 包中获得,可以简单地将其解压到目标目录中,而且可以使用源码 tarball 从头创建。(Debian 用户可以使用 “apt-get install” 直接从 Debian 网站上获得 2.5.0-1 版。2.6 版本具有一些细微的差异,所以建议直接从 Scala 网站下载和安装。)

>>> 阅读全文

 

, , , , ,

Spark,一种快速数据分析替代方案

Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。

Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。

尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。

Spark 集群计算架构
虽然 Spark 与 Hadoop 有相似之处,但它提供了具有有用差异的一个新的集群计算框架。首先,Spark 是为集群计算中的特定类型的工作负载而设计,即那些在并行操作之间重用工作数据集(比如机器学习算法)的工作负载。为了优化这些类型的工作负载,Spark 引进了内存集群计算的概念,可在内存集群计算中将数据集缓存在内存中,以缩短访问延迟。

Spark 还引进了名为 弹性分布式数据集 (RDD) 的抽象。RDD 是分布在一组节点中的只读对象集合。这些集合是弹性的,如果数据集一部分丢失,则可以对它们进行重建。重建部分数据集的过程依赖于容错机制,该机制可以维护 “血统”(即充许基于数据衍生过程重建部分数据集的信息)。RDD 被表示为一个 Scala 对象,并且可以从文件中创建它;一个并行化的切片(遍布于节点之间);另一个 RDD 的转换形式;并且最终会彻底改变现有 RDD 的持久性,比如请求缓存在内存中。

>>> 阅读全文

 

, , , , ,

Hadoop 技术手册 (二) 体验 Hadoop 平台

文章评价:
在上一篇文章中,我们概括介绍了 Hadoop 的各个组件,但是留下的困惑之一就是 “我要如何运行这些软件呢?”。本文将利用 Cloudera 网站提供一个免费的 Hadoop 发行版 CDH 来运行一些示例,使得你对 Hadoop 各个组件有深入的了解。

特别值得一提的是,Hadoop 可以通过 Sqoop 非常好地整合 Informix 和 DB2 数据库。 Sqoop 是全球领先的用于在 Hadoop 和关系数据库之间进行数据迁移的开源实现。它使用 JDBC 来读写 Informix、DB2、MySQL、Oracle 等其他数据源。此外还提供了几个优化的数据库适配器,包括 Netezza 和 DB2。

运行简单的 Hadoop, Hive, Pig, Oozie 和 Sqoop 示例
在上一篇文章中,你已经学习了 Hadoop 的介绍和定义,现在是该实践的时候了。要运行本文的例子,你只要从 Cloudera 网站下载支持 VMware、virtual box 等的镜像文件就可以开始进行 MapReduce 了!我们假定你有一台 64位电脑,并有某种流行的虚拟软件。大多数的虚拟软件中都提供了免费下载。当您试图启动 64位的镜像时,你可能会遇到有关 BIOS 设置的报错。图 1-1 显示了需要在 BIOS 修改的设置 (基于 Thinkpad 电脑)。进行更改时,请务必小心。

示例中所使用的数据实在不能称为 BigData。但是本文的目的不是让你用一台笔记本电脑来和一个庞大的文件交火,而是关注数据源、map-reduce 作业这些有趣的问题,并答疑解惑。

下载 Hadoop 虚拟镜像
我们强烈建议您使用 Cloudera 提供镜像来运行这些示例。 Hadoop 是一个解决问题的技术。 Cloudera 的虚拟镜像包让你不用处理繁杂的配置工作,只需专注于大数据本身的问题。如果你坚持要自己配置所有的组件,那 Hadoop 本身就成为一个问题,而不是解决方案了。

>>> 阅读全文

 

, , , , , , , , , , ,

LLVM 简介

本文将讨论让 LLVM 成型的一些设计策略。LLVM 是个一揽子项目(a umbrella project),用于支持和开发一系列紧密相关的底层工具组件(例如汇编器、编译器、调试器等等),从设计之初,LLVM 就考虑兼容现在广泛使用的 Unix 系统工具。 起初 “LLVM” 这个名字是个缩写,现在则是这个一揽子项目的品牌。虽然 LLVM 提供了独特的功能,并因其强大的工具而闻名(例如 Clang 编译器, 一个比 GCC 更强大的 C/C++/Objective-C 编译器),但真正让 LLVM 有别于其他编译器的地方是在其内部架构。

从诞生之初(2000年12月),LLVM 就被设计成一组具有定义良好接口的、可重用的库。当时,开源的编程语言的实现通常按专用工具来设计的,一般只能不可分割地运行(monolithic executables)。比方说,很难从类似 GCC 这样的静态编译器中将解析器分离出来用在静态分析或者重构。而脚本语言大多都提供了将运行时或解释器嵌入大型应用的方法,该运行时也是一个完整的、不可分割的可以被嵌入或者单独使用的代码块。不同语言实现项目之间根本无法重用部件,代码也很难共享。

除了编译器本身的组成外,围绕流行语言的社区往往呈现出很强的两极化倾向:有些实现提供了传统的静态编译器(如 GCC, Free Pascal 和 FreeBasic), 而有的实现则以解释器或JIT(Just-In-Time)编译器的形式提供了运行时编译器。但是很少有实现同时提供两者,即使有的话,两者也极少共享代码。

过去十多年中,LLVM 慢慢改变了这种困境。现在,LLVM 被作为一个通用的基础框架实现了很多静态编译或运行时编译的语言(例如,GCC 支持的语言族、Java、.NET、Python、Ruby、Scheme、Haskell、D语言以及许多的知名度稍低的语言)。它也取代了很多专用编译器,像苹果公司 OpenGL 栈中的运行时特化引擎(runtime specialization engine)以及 Adobe 公司 After Effects 产品中的图形处理库。最后,LLVM 也用来创建各种新产品,最出名的应该算是 OpenCL GPU 编程语言和运行时了。

传统编译器设计简介
传统的静态编译器设计(如大多数 C 编译器)中采用的最普遍的方案就是三阶段编译,该设计主要由三个组件组成,分别是前端、优化器和后端(如图1-1所示)。前端负责解析源代码,检查错误,并构建语言相关的抽象语法树(AST)。AST 可根据情况转换为便于优化的新表示方式, 优化器和后端针对这种新表示而运行。

>>> 阅读全文

 

, , , , , ,

Hadoop 技术手册(二) 用 Map/Reduce 进行大数据分析

当今社会是数据的时代。2001 年,Google 发布图像搜索功能时,只有 2.5 亿个图像被索引, 10 年间,这个搜索功能已经可以检索超过 100 亿个图像。现在每分钟有 35 小时时长的视频被上传到 YouTube。而 Twitter 平均每天要处理 5500 万 tweet。数据的增加,很快就超过单一计算机的处理能力。基于集群的分布式并行编程能够让软件与数据同时运行在一个网络内彼此相连的许多计算机上。这样的分布式并行环境的最大优点是可以很容易的通过增加计算机来扩充新的计算结点,并由此获得不可思议的海量计算能力, 同时又具有相当强的容错能力,某一计算节点失效也不会影响计算的正常进行以及结果的正确性。

Google 使用了运行在 GFS ( Google File System ) 分布式文件系统上的, 名为 MapReduce 的编程模型进行分布式并行编程,为全球亿万用户提供搜索服务。而 Hadoop 项目正是受到了 MapReduce 和 Google File System(GFS) 的启发,2005 年秋天, Hadoop 被作为 Lucene 的子项目 Nutch 的一部分正式引入。 在 2006 年 3 月份,Map/Reduce 和 Nutch Distributed File System (NDFS) 正式被纳入 Hadoop 的项目中。

Hadoop 实现了 Google 的 MapReduce 编程模型,提供了简单易用的编程接口,它也提供了自己的分布式文件系统 HDFS,与 Google 不同的是,Hadoop 是开源的,任何人都可以使用这个框架来进行并行编程。如果说分布式并行编程的难度足以让普通程序员望而生畏的话,开源的 Hadoop 的出现极大的降低了它的门槛,读完本文,你会发现基于 Hadoop 编程非常简单,利用该框架能够轻松编写出可以处理海量数据(TB级的数据集)的应用程序,并能稳定地,可容错地运行在由上千个节点组成的硬件集群上,然后在短时间内完成海量数据的计算。

概念
一个 MapReduce 作业(job) 通常会将输入的数据集分割成独立的数据块 (chunk),然后交由 map 任务以完全并行的方式进行处理。框架负责对 map 的输出进行排序,并作为 reduce 任务的输入。作业的输入和输出一般都保存在文件系统中。该框架还负责任务的调度与监测,并重新执行失败的任务。

通常来说,Hadoop 的计算节点和存储节点是同一节点,也就是说 MapReduce 框架和 Hadoop 分布式文件系统 (HDFS) 在相同的节点上运行。这种配置让框架可以有效地将任务调度给存有数据的节点,从而使得整个群集获得了非常高的总带宽。

>>> 阅读全文

 

, , , ,

Scala语言编程指南 (一)

文章评分:

Scala设计初衷
Java 语言已经是有一定年头的语言了,随着 C#,Ruby 等新的语言的出现,Java 的语法显得臃肿且平庸,和这些新兴语言相比,其开发效率并不十分突出。程序开发者想要一种更精炼和更灵活的语言去提高他们的生产效率。这也是如今所谓的 Ruby, Python 这样的脚本(Script)语言大行其道的原因之一。

当 Java 开始老朽不堪的时候,其虚拟机(JVM)的性能却得到大众的认可,JVM 的性能优化做得较为到位,因此许多程序开发者相信使用基于 JVM 的新语言是正确的前进道路。为此 Sun 雇佣了 JRuby 和 Jython (Ruby 和 Python 在 JVM 上的实现)的主要开发者。而 Scala 的出现对于 Java 开发者来说提供了一门更加新式的语言。

值得一提的是 Scala 开始为针对 JVM 设计的,但是随着 Scala 的发展,它也可以运行在 .NET 的 CLR 虚拟机上。当我们讨论有关 Scala 语法时,它们大致也能应用于 .NET 之上。

Scala 简介
Scala 是一种多范式的语言,因为 Scala 既支持面向对象编程,也支持函数式编程。它在拥有简洁,优雅,灵活的语法的同时,也提供了一个久经考验的静态类型系统和惯用语法,所以从小巧的解释性脚本到大型的复杂系统它都可以胜任。无独有偶,Microsoft 资助的大学项目 Nemerle 也走了同一条道路。

>>> 阅读全文

 

, , , , ,

Java内部类释疑 之一

内部类(Inner class),本质上就是定义在一个类内部的类,它扮演着其外部类(enclosing class)成员的角色。内部类有两种类型,静态内部类和非静态内部类。正如其名字所示,它们的差异在于,静态内部类与外部类相关联,扮演着静态成员的角色,而非静态内部类与外部类的对象相关联。我们后面会继续探讨这两种内部类。内部类是编译器层面的把戏,它会将内部类转换为普通class文件,并用奇怪的名字命名,对于虚拟机来说,普通类和内部类的class文件并无任何区别。

第三条路线
当你设计类的层级的时候,总是在考虑类之间的关联。这种关联不是总可以被定义为”is a”和”has a”关联。”is a” 关联代表着一种继承关系,子类是父类的一种(is a)。例如下面的员工/经理的例子:

class Employee {
  private String name;
  private Date dateHire;
  …..
  …..
  public float getSalary() {
  }
  …
}

接下来是Manager类。

Class Manager extends Employee {
  private Employee[ ] subOrdinates;
  ….
  public Employee[ ] getSubOrdinates() {
    return subOrdinates;
  }
}

Manager类继承了Employee类,因此它是”is a”关联,即Manager类型的对象同时也是Employee类型。

面向对象设计的另一种关联是”has a”关联。在设计策略上,这种包容关系的设计要比继承关系常见得多。例如Company类的对象可以包含Employee类和Manager类对象和其他对象。

>>> 阅读全文

 

,

JackRabbit (一) JCR的前世今生

[b]题记[/b]

写这系列有点老调重弹的味道,比如ahuaxuan已经在他的博客里对于JackRabbit 1.0做了很详细的阐述。之所以再写,是因为JCR推出了JCR 2.0,个人觉得有必要将一些新的特性再罗列一下。

[b]问题提出[/b]

存取各种信息对于任何应用程序来说非常平常,大多数时候我们会把数据保存在关系数据库中。数据库处理规范数据类型十分在行,但是在处理如图像、文档等二进制数据时却不是那么得心应手。

尽管可以用文件系统作为替代——而且它们还提供了更好的性能。但它们既没有提供用于搜索信息的查询语言,也没有提供表示关系或事务的概念。

>>> 阅读全文

 

, ,

Groovy 1.0 用户指南 (三) 类和闭包

Groovy 的语法是始终围绕灵活性这个特性进行设计的 。灵活性是更有效地开发代码的主要因素。Groovy 语言是建立在总有一天 Java 平台要包括一种敏捷开发语言这一信念上的 (Richard Monson-Haefel),因此, Groovy 除了是种面向过程和面向对象的语言外,它还包含了实现函数式编程一些东西。

函数编程
我们知道例如Lisp、Scheme、Haskell、ML (或其他一些语言)采用了函数式编程。但“到底什么是函数式编程 (FP)?”不幸的是,即使是函数程序员他们自己也很难对 FP 究竟是什么有个一致的认识。

David Mertz 认为函数式编程粗略地描绘为至少具有以下几个特征:

  • 函数是第一类(对象)。即,可以对“数据”进行的每样操作都可以使用函数本身做到(例如将一个函数传递给另一个函数)。
  • 将递归用作主要的控制结构。在某些语言中,不存在其它“循环”构造。
  • 重点集中在列表 Litt 处理(例如Lisp )。列表经常和子列表的递归一起使用以替代循环。
  • “纯”函数语言能够避免副作用。这不包括在命令语言中最普遍的模式,即指定第一个,然后将另一个值指定给同一个变量来跟踪程序状态。
  • FP 不鼓励或根本不允许出现 语句,取而代之是使用表达式求值(换句话说,即函数加上自变量)。在很纯粹的情况下,一个程序就是一个表达式(加上支持的定义)。
  • FP 关心的是计算 什么而不是 如何计算。
  • 许多 FP 利用了“更高等级”函数(换句话说,就是函数对一些函数操作,而这些函数又对其它函数操作)。
  • 函数编程的提倡者认为所有这些特征都导致更快速的开发更短以及错误更少的代码。而且,计算机科学、逻辑和数学领域的高级理论学家发现证明函数语言和程序的正式性能比命令语言和程序容易得多。


    在字节码水平,Groovy 类是真正的 Java 类。Groovy的类与Java类相似:

    >>> 阅读全文

     

    , ,

    手工打造JVM

    本文所介绍虚拟机被应用到一个真正的项目中:墨菲斯 – Silverlight 1.1的原型。在本文的附件中的演示讲解了虚拟机是如何工作,你也可以阅读附件中的源代码。不过注意,这儿的实现和任何既有的商业实现都不尽相同。为了节约时间,只要JVM规格书没有详细说明的,我们就采用最简单的方式加以实现。

    JVM的各个部分

    类文件结构
    这个JVM首先就需要个能将各个Java类组合起来的应用,所以谈任何类之前,首先就得定义一个结构“JavaClassFileFormat.”

    struct  JavaClassFileFormat
         {
             u4 magic;
             u2 minor_version;
             u2 major_version;
             u2 constant_pool_count;
             cp_info **constant_pool; //[constant_pool_count-1];
             u2 access_flags;
             u2 this_class;
             u2 super_class;
             u2 interfaces_count;
             u2* interfaces; //[interfaces_count];
             u2 fields_count;
             field_info_ex *fields; //[fields_count];
             u2 methods_count;
             method_info_ex* methods; //[methods_count];
             u2 attributes_count;
             attribute_info** attributes; //[attributes_count];
         };

    我们看到标有注释的地方,还定义了一些其他的结构,他们用来表示类文件的常量池(类文件中使用的常量)、字段、方法和属性,这儿我们先列出其定义,稍后再详细解释。

    struct cp_info
         {
             u1 tag;
             u1* info;
         };
     
         struct field_info
         {
             u2 access_flags;
             u2 name_index;
             u2 descriptor_index;
             u2 attributes_count;
             attribute_info* attributes; //[attributes_count];
         };
         
         struct method_info
         {
             u2 access_flags;
             u2 name_index;
             u2 descriptor_index;
             u2 attributes_count;
             attribute_info* attributes; //[attributes_count];
         };
         
         struct attribute_info
         {
             u2 attribute_name_index;
             u4 attribute_length;
             u1* info;//[attribute_length];
         };

    现在要做的是把类文件按字节读到内存中,再用JavaClass对象解析这些原始字节,逐一确定字段、方法、异常表等等。JavaClass类表示一个类在内存中的结构化形式。它有一个指针,指向所加载的类文件的原始字节流。

    >>> 阅读全文

     

    , ,

    Groovy 1.0 语法指南 (一) 语法特性

    前言

    Groovy 是基于 JRE 的脚本语言( Script ),是由James Strachan 和 Bob McWhirter 这两位天才发明的,(JSR 241 2004 年 3 月)。和Perl,Python等等Script的设计初衷一样,作者希望Groovy能快速简洁地完成一些工作:如访问数据库以编写报告,编写单元测试用例(Unit Test Case),快速实现产品原型(ProtoType) 等等。由于Groovy 1.0和我(ray_linn) 之前发布的Groovy系列(基于1.0 JSR)有较大区别,请有转载的朋友自行更新。

    同时为了降低学习曲线,Groovy 的语法和Java 近似,并吸收了 Ruby,Python 和SmallTalk 的一些特点,因此 Groovy 在某些场合可以扮演一种 “咖啡伴侣”的角色。那么Groovy 和 Java 相比,有什么变化呢? Groovy 和大部分Scripts一样:

  • 不用编译,通过解释运行。
  • 允许动态类型。
  • 合成结构容易。
  • 所以Groovy 是一种特别容易学习和使用的语言.

    我们先借用IBM Groovy教程中的例子,下面的代码利用了Freemarker模板引擎来创建一个Template对象,然后将内容打印到标准输出。例(1)是Java代码,例(2)是Groovy代码。可以看到二者非常的类似。

    >>> 阅读全文

     

    , , ,

    MongoDB 开发手册 (二) 连接串和mongo操作台概述

    数据库连接
    MongoDB是数据库服务器,它可以在前台或者后台运行并等待用户连接。因此,当你启动MongoDB的时候,你会看到这样的字句:

    ~/$ ./mongod
    #
    # some logging output
    #
    Tue Mar  9 11:15:43 waiting for connections on port 27017
    Tue Mar  9 11:15:43 web admin interface listening on port 28017

    这时屏幕会暂停输出,但并未死机,它会在27017端口上侦听用户的连接。一旦用户连接上数据库并开始发送命令,它又会再次记录它所做的一切。任何一款MongoDB驱动或者Mongo操作台都可以用来连接数据库。

    不能通过在浏览器输入”http://localhost:27017″来连接MongoDB,数据库不能通过27017端口上的HTTP协议来存取。

    标准连接串格式
    这儿介绍的URI schema不一定为所有的驱动程序所支持,你可以参考相关的驱动程序文档以获知该驱动支持多少种标准连接URI。所有的驱动都支持某种指定连接格式的替代方式,如果该格式不被支持。

    mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/database]
    • mongodb://是必选的前缀,表明该字串是标准的连接格式
    • username:password@是可选项,如果指定了该项,驱动程序在连接数据库服务器之后,尝试用它连接数据库。
    • host1是URI中唯一的必选项,表明所连接的服务器地址。
    • :portX是可选项,未指定的话默认为27017。
    • /database是要登录的数据库名称,只有指定了username:password@之后,该项才有意义,如果未指定,默认将连接到”admin”数据库。

    你可以在URI中指定多个主机连以便连接到同步复制对或同步复制集(replica pairs/sets). 下面是一些例子:

    >>> 阅读全文

     

    , , , ,

    利用Base64在XML中存储BLOB

    文章评价:
    在一些 XML 的应用中,例如 SOAP,除了复杂的数据类型外,还可能包括图像、声音等多媒体数据。通常的处理办法是通过序列化的Java对象为载体进行传输,或者将图像、声音等数据包含在外部实体中,如果能将这些大型二进制对象存储在XML文件中,则处理起来会有很大的便利性。

    这里我们将以图像为例子讨论在 XML 中存储传输 BLOB 数据的方法。
    Base64算法详解
    Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。如例1所示:

    字符串“张3”
    11010101   11000101    00110011

    转换成Base64

    00110101   00011100     00010100     00110011

    即把8位的字节连成一串110101011100010100110011 然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。

    让我们来看看实际结果:

    >>> 阅读全文

     

    , , , ,

    Previous Posts