掌握 Dojo 工具包,第 8 部分: 明日之星 - DojoX

blowfish:CPP中的河豚加密算法实现 河豚加密算法 Blowfish是一种对称的分组密码,可以用作DES或IDEA的替代产品。 它采用长度可变的密钥,范围从32位到448位,非常适合家庭和出口使用。 Blowfish是Bruce Schneier在1993年设计的,它是现有加密算法的一种快速,免费的替代方案。 从那时起,已经对其进行了大量分析,并且它正逐渐被接受为一种强大的加密算法。 河豚是无专利的,没有许可证,并且可以免费用于所有用途。 关于这个项目 这是加密算法的C ++实现。 如何在您的项目中使用它? 您可以分叉它,并像在项目中使用任何其他源文件一样使用它。 您只需要和文件。 只需根据您的方便修改标题。 如果您使用的是CMake,则工作会容易得多。 您可以将其添加为git子模块。 它将您的项目与该依赖关系隔离开。 # In your project root type these commands git 立即下载

DojoX 是 Dojo 主功能的一个扩展区,可以说是新功能和新想法孵化器。在这里,可以找到很多最新奇的功能组件。本文将和读者一起来探索其中几个比较成熟的组件。

 

 

Dojo 作为最著名的 Ajax 开源项目之一,不仅让 Web 程序员可以免费获得和使用其框架进行 Web 应用的开发,更吸引了大量的开发者对其不断的扩充,开发新的组件。DojoX 就是在这样的开发社区中产生的。DojoX 是一组基于 dojo 的开源项目的集合,这些开源项目具有很好的创意和很高的实用性。这些 DojoX 项目有可能成长为一个稳定的版本保留在 DojoX 中,也有些可能会迁移到 Dojo Core 或者 Dijit 中。本文将对 DojoX 中的项目进行一个总体的概述,并结合实例介绍其中较为有特色的项目,本文主要会介绍 DataGrid,Charting,Gfx/Gfx 3D 和 DojoX Widget。

认识 DojoX

目前 DojoX 项目主要扩展了数据结构与算法、数据处理与通信、实用工具、图形 API 以及 Web UI 等。

涉及到数据结构与算法的项目包括了 DojoX Collections、DojoX Encoding 等。Collections 定义了很多非常有用的数据集合,包括了数组(ArrayList)、二叉树(BinaryTree)、字典(Dictionary)、迭代器(Iterator)、队列(Queue)、有序列表(SortedList)、堆栈(Stack)。这些集合的使用将大大提高程序开发的效率以及程序的质量。Encoding 不仅提供了字符串与字符编码的转换,还提供了对称算法河豚(Blowfish)和 MD5 数字摘要算法等。

DojoX Data、Embed、I/O、JSON、XML、RPC 等扩展了 Dojo 的数据处理与通信能力。其中,Data 项目提供了对更多数据格式的支持,包括了对 csv 文件以及 Google、Picasa 等提供的 API 的支持等等。

DojoX 的图形 API 扩展了 Dojo 的动画效果,并提供了 2D、3D 绘图的支持。DojoX Fx 通过对 dojo core 以及 dojo fx 的扩展提供了多种动画效果;gfx 提供了一系列矢量绘图的方法;而 gfx3d 则提供了一些简单的 3D 绘图 API。

而更加丰富的 Web UI 以及 Web 小部件也是 DojoX 的一大亮点。功能强大的 Grid、实用的 Charting、以及 DojoX Image 和 DojoX Layout 使得基于 dojo 开发的 Web UI 更加丰富。DojoX Widgets 中还提供了更加丰富的小部件可以满足大部分应用开发的需求。

除以上介绍的项目外,DojoX 还收集了很多实用工具,读者可以在 dojo API 网站上获得更多的信息。http://api.dojotoolkit.org/

接下来我们就来体验一下 DojoX 给我们带来的精彩吧

注意:本教程使用的 dojo 版本为 1.2.1,由于 1.2.x 版本里 dojo 以及 dojoX 的部分组件有较大变化,因此本文仅适用于 dojo1.2.x,对于 dojo1.0 的开发者本文仅供参考,部分代码不能正确运行

回页首

DojoX DataGrid

Grid 可能是 DojoX 中最受欢迎的部件,比起普通的 Web 表格部件,Grid 更像一个基于 Web 的 Excel 组件。这使得 Grid 足可以应付较为复杂的数据展示及数据操作。在 dojox1.2 中,dojox.grid 包中新增了 DataGrid 类,该类是对原 Grid 类的强化和替代,之所以叫做 DataGrid,是由于该类与 dojo 的数据操作类 store 无缝整合在一起。而之前的 Grid 需要将 store 对象包装为 model 对象才能使用。下文如果没有特殊声明,所有 Gird 或是 DataGrid 均指新版 DataGrid,而不是 Grid1.0。

图 1 .DojoX DataGrid

图 1 .DojoX DataGrid

我们为什么需要 Grid 呢?下面列出了 Grid 的特性:

  • 用户只需向下拖动滚动条,Grid 即可加载延迟的记录,省去了翻页操作,减少 Web 与服务器交互,提高了性能;
  • 可以任意的增加和删除单元格、行、或者列;
  • 对行进行统计摘要,Grid 可以生成类似于 OLAP 分析的报表;
  • Grid 超越了二维表格的功能,它可以跨行或跨列合并单元格以满足不同的数据填充的需求;
  • 行列冻结功能,使得浏览数据更加灵活方便;
  • Grid 事件采用了钩子机制,我们可以通过 onStyle 钩子完成对样式的更改;
  • 单元格具备富操作,所有的 dijit 部件都可以在单元格中使用,并且单元格可以通过单击转换为编辑状态;
  • 可以为不同的单元格设置不同的上下文菜单;
  • Grid 嵌套,也就是说 Grid 可以在单元格中嵌套其他的 Grid,从而组成更为复杂的应用;

除此之外,Grid 还有具有其他很多特性,例如,非常实用的偶数行上色、灵活的选取功能、自动调整列宽、数据的展开 / 合闭等。

DataGrid 基础

要创建一个 DojoX DataGrid,就需要对 DataGrid 的基本工作过程有一个大致的了解。一个 DataGrid 实例的组成结构如下图所示,DojoX DataGrid 是使用 DataGrid 的基础,因此在使用 Grid 的时候需要加载相关的 dojox 包;一个小部件通常由框架和样式组成,因此,我们需要指定 DataGrid 的样式表并且声明 DataGrid 实例。DataGrid 实例会组合一个 Structure 和一个 Store。Structure 是一个表头及数据模型的定义,而 Store 用于承载数据。

图 2 .DataGrid 组成结构

图 2 .DataGrid 组成结构

下面开始我们的第一个 DataGrid 应用为了在 Web 页面上创建一个 DataGrid 小部件,我们从最基本的二维表格开始。首先我们需要加载一些样式,来保证 DataGrid 能够正常显示,清单 1。

清单 1. 加载样式

 <style type="text/css"> 
 @import "dojox/grid/resources/tundraGrid.css"; 
 @import "dojo/resources/dojo.css"; 
 </style>

此处的 css 文件路径为相对于测试页面的相对路径。

在开始创建 Grid 之前,我们还要引入 Dojo 的基础包 dojo.js,以用来加载其他需要的 dojo 类,并加载 dojo.data.ItemFileReadStore 类以及 dojox.grid.DataGrid 类。接下来我们就可以着手开发第一个 DataGrid 了。首先是布局的定义,如 清单 2

清单 2. 定义布局

 var layout = [ 
		 {field: 'pro_no', name: 'Product Number' }, 
		 {field: 'pro', name: 'Product' }, 
		 {field: 'min_amount', name: 'Minimum Amount' }, 
		 {field: 'max_amount', name: 'Maximum Amount' }, 
		 {field: 'avg_amount', name: 'Average Amount' } 
 ];

这里定义了一个数组 layout,其中每一个成员表示一个列的定义,其中 field 指定了使用的数据项,该取值需要遵循 javascript 变量定义规则;name 为该列显示的名称。接下来是 store 的开发,代码如 清单 3

清单 3. 开发 store

 var sampleData = { 
 identifier: 'pro_no', 
 label: 'pro_no', 
 items: [ 
 {pro_no:'2100', pro:'A Series', min_amount:346, max_amount:931, avg_amount:647}, 
 {pro_no:'2200', pro:'B Series', min_amount:301, max_amount:894, avg_amount:608}, 
 {pro_no:'2300', pro:'C Series', min_amount:456, max_amount:791, avg_amount:532}, 
 {pro_no:'2400', pro:'D Series', min_amount:859, max_amount:2433, avg_amount:1840}, 
 {pro_no:'2500', pro:'E Series', min_amount:459, max_amount:1433, avg_amount:1040} 
 ] 
 }; 
 var jsonStore = new dojo.data.ItemFileReadStore({ data: sampleData });

在这里,我们首先定义一个 JSON 数据 sampleData,这里 identifier 是对于整行的唯一标识,因此在数据中不能出现重复;数组 items 是这个表格所显示的数据,其中数据必须完全符合 JSON 的语法,字符串两端必须使用引号,否则会出现语法错误,保险的办法是所有的值均用引号括住。

接下来,我们就要在网页的 Body 元素中定义 DataGrid 实例了,如 清单 4

清单 4. 定义 DataGrid 实例

 <div id="grid" dojoType="dojox.grid.DataGrid" store="jsonStore"
			 structure="layout" autoWidth="true" ></div>

dojoType 指定了该 Web 部件为 dojox.grid.DataGrid,数据使用 jsonStore,结构为 layout,自动调整宽度。到此,第一个 Grid 就已开发完毕,完整代码如 清单 5

清单 5. 完整代码

 <html> 
 <head> 
 <title>first Grid</title> 
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta> 
 <style type="text/css"> 
 @import "dojox/grid/resources/tundraGrid.css"; 
 @import "dojo/resources/dojo.css"; 
 </style> 
 <script type="text/javascript" src="dojo/dojo.js" djConfig="parseOnLoad: true"></script> 
 <script type="text/javascript"> 
 dojo.require("dojo.data.ItemFileReadStore"); 
 dojo.require("dojox.grid.DataGrid"); 
 var sampleData = {identifier: 'pro_no',label: 'pro_no', 
 items: [ 
 {pro_no:'2100', pro:'A Series', min_amount:346, max_amount:931, avg_amount:647}, 
 {pro_no:'2200', pro:'B Series', min_amount:301, max_amount:894, avg_amount:608}, 
 {pro_no:'2300', pro:'C Series', min_amount:456, max_amount:791, avg_amount:532}, 
 {pro_no:'2400', pro:'D Series', min_amount:859, max_amount:2433, avg_amount:1840}, 
 {pro_no:'2500', pro:'E Series', min_amount:459, max_amount:1433, avg_amount:1040} 
 ]}; 
 var jsonStore = new dojo.data.ItemFileReadStore({ data: sampleData }); 
 var layout = [ 
 {field: 'pro_no', name: 'Product Number' }, 
 {field: 'pro', name: 'Product' }, 
 {field: 'min_amount', name: 'Minimum Amount' }, 
 {field: 'max_amount', name: 'Maximum Amount' }, 
 {field: 'avg_amount', name: 'Average Amount' }]; 
 </script> 
 </head> 
 <body class="tundra"> 
 <div class="heading">First Grid</div> 
 <div id="grid" dojoType="dojox.grid.DataGrid" store="jsonStore"
 structure="layout" autoWidth="true"></div> 
 </body> 
 </html>

在浏览器中运行,效果如下:

图 3. 第一个 Grid 运行结果

图 3. 第一个 Grid 运行结果

DataGrid 开发详解

DataGrid 的创建

在 DataGrid 的开发中,有三种方法创建 DataGrid 实例,第一种是 javascript 创建结构,html 代码创建实例,我们第一个例子就是使用这种方式实现的;

第二种是由 html 代码创建结构及实例,在这种方法中,我们使用 table 标签,定义 Grid 的结构,而省去了在 javascript 中定义 structure 的部分。具体定义方式与标准的 html 书写方式非常类似,定义方式如 清单 6

清单 6. 由 html 代码创建结构及实例

 <table id="gridNode" jsid="grid" dojoType="dojox.grid.DataGrid"
 store="jsonStore" rowsPerPage="20" region="center"> 
 <thead> 
   <tr> 
     <th field="pro_no" >Product Number</th> 
     <th field="pro" >Product</th> 
     <th field="min_amount" >Minimum Amount</th> 
     <th field="max_amount" >Maximum Amount</th> 
     <th field="avg_amount" >Average Amount</th> 
   </tr> 
 </thead> 
 </table>

第三种方式就是采用纯 javascript 的方式定义 DataGrid 实例,清单 7声明网页加载完成后就在 id 为 gridNode 的页面结点上创建一个 DataGrid 实例。

清单 7. 纯 javascript 的方式定义 DataGrid 实例

 dojo.addOnLoad(function(){  // 指定页面加载完毕后执行
 var grid = new dojox.grid.DataGrid({ 
	 query: { pro_no: '*' }, 
	 id: 'grid2', 
	 store: jsonStore, 
	 structure: [ 
		 {field: 'pro_no', name: 'Product Number' }, 
		 {field: 'pro', name: 'Product' }, 
		 {field: 'min_amount', name: 'Minimum Amount' }, 
		 {field: 'max_amount', name: 'Maximum Amount' }, 
		 {field: 'avg_amount', name: 'Average Amount' } 
 ],rowsPerPage: 20 
 	 }, 'gridNode');  // 设置 grid 显示在 id 为 gridNode 的节点下
 grid.startup();  // 启动 grid 
 });

Grid1.2 可以通过这种方式很方便的与 dojo 容器结合在一起,动态创建页面布局。

Structure 详解

DataGrid 不仅可以创建简单的二维表格,还可以通过对 structure 的设计创建复杂的表格应用,同时还可以为每一列进行格式化或是取值。我们将 First Grid 进行简单的修改,得到 清单 8的代码。

清单 8. 修改 First Grid

 function formatAmount(value){ 
	 return '$ ' + value; 
 } 
 function getRange(rowIndex, item){ 
	 if(!item){return '--';} 
	 var grid = dijit.byId('grid'); 
	 var max = grid.store.getValue(item, "max_amount"); 
	 var min = grid.store.getValue(item, "min_amount"); 
	 return max - min; 
 } 
 var subrow1 = [ 
 {field: 'pro_no', name: 'Product Number', rowSpan: 2 }, 
 {field: 'pro', name: 'Product', rowSpan: 2 }, 
 {field: 'min_amount', name: 'Min. Amount',formatter: formatAmount,width: '80px' }, 
 {field: 'avg_amount', name: 'Average Amount',formatter: formatAmount, rowSpan: 2 }, 
 {field: 'range', name: 'Range',get:getRange, rowSpan: 2 } 
 ]; 
 var subrow2 = [ 
	 {field: 'max_amount', name: 'Max. Amount',formatter: formatAmount}, 
 ]; 
 var layout = [subrow1,subrow2];

这里,我们从新定义了 layout,将 layout 分为两个子行,其中子行 1 包含了五个字段,其中 pro_no、pro、avg_amount、range 具有值为 2 的 rowSpan 属性,也就表明这三列跨越了两行。第二行仅有 max_amount 一个字段。同时,我们为三个 amount 字段指定了 formatter 函数,在其数值前添加美元符号。为 range 字段指定了 get 方法来自动获取最大值与最小值的差。

显示效果如下:

图 4. DataGrid 布局示例 1

图 4. DataGrid 布局示例 1

除了 rowSpan 属性外我们还可以使用 colSpan 属性,这两个属性的用法与 html 中的用法一致,并且可以在 html 定义表结构中使用,我们再看这个表头的例子来理解一下 colSpan 的用法。

清单 9. colSpan 的应用

 var structure = [[ 
	 {field: 'type', name: 'Type', rowSpan: 2}, 
	 {field: 'pro', name: 'Product', rowSpan: 2}, 
	 {field: 'Q20071', name: 'Q1',formatter: formatAmount }, 
	 {field: 'Q20072', name: 'Q2',formatter: formatAmount }, 
	 {field: 'Q20073', name: 'Q3',formatter: formatAmount }, 
	 {field: 'Q20074', name: 'Q4',formatter: formatAmount } 
  ],[ 
	 {field: 'Y2007', name: 'Year 2007',formatter: formatAmount, colSpan: 4 } 
 ]];

清单 9的显示效果如下:

图 5. DataGrid 布局示例 2

图 5 . DataGrid 布局示例 2

Store 的使用

DataGrid 使用了 Store 作为数据源,在以上的例子中,我们都是将数据写在 javascript 中然后作为 data 参数值传给 Store 的构造方法。但是在大多数情况下,数据是要动态的通过 Ajax 请求从服务器端获取的,这同样可以通过 Store 来实现。我们仅需要将声明 Store 对象时传入请求的 url 地址即可,如:new dojo.data.ItemFileReadStore({url: 'jsondata.txt' }) 。Store 包括 dojo.data.ItemFileReadStore 和 dojo.data.ItemFileWriteStore 两个类。我们在使用 DataGrid 的编辑功能时需要使用 ItemFileWriteStore 来作为数据源。下面就演示了一个多功能的 DataGrid,这个 Grid 使用外部数据源,可以对单元格进行编辑,并且可以通过右击表头弹出列选菜单。为了页面能够正确,清单 10载入了所需的 CSS。

清单 10. 加载所需 CSS

 <style type="text/css"> 
 @import "dojox/grid/resources/tundraGrid.css"; 
 @import "dijit/themes/tundra/tundra.css"; 
 @import "dojo/resources/dojo.css"; 
 </style>

清单 11的代码引入了所需的 dojo 包,并创建了可编辑的 DataGrid,将其添加到了 id 为 gridNode 的页面节点中。为了使列具有编辑功能只需要在 structure 定义中的表示该列的 JSON 定义中添加值为 true 的 editable 属性。

清单 11. 引入所需 Dojo 包

 <script type="text/javascript" src="dojo/dojo.js" djConfig="parseOnLoad: true"></script> 
 <script type="text/javascript"> 
 dojo.require("dojo.data.ItemFileWriteStore"); 
 dojo.require("dojox.grid.DataGrid"); 
 // 下面两个包用来创建右键弹出菜单
 dojo.require("dijit.Menu"); 
 dojo.require("dojox.widget.PlaceholderMenuItem"); 
 // 使用 dataGrid.txt 中的数据作为填充 DataGrid 的数据
 var jsonStore = new dojo.data.ItemFileWriteStore({ url:'dataGrid.txt'}); 
 var layout = [ 
 {feld: 'emp_no', name: 'Employee Number'}, 
 {field: 'name', name: 'Name', editable: true },  // 该列可编辑
 {field: 'gender', name: 'Gender', editable:true, 
 type:dojox.grid.cells.Select, options:['F','M'] }, // 编辑该列时使用下拉菜单
 {field: 'dept_no', name: 'Deptment Number', editable:true, 
 type:dojox.grid.cells.Select, options:['730','731','732','733','734','735']}, 
 {field: 'bonus', name: 'Bonus', editable: true } 
 ]; 
 dojo.addOnLoad(function(){ 
 var grid = new dojox.grid.DataGrid({ 
 query: { emp_no: '*' },  // 查询字符串
 id: 'grid2',            //DataGrid 的 id 
 autoWidth:true,        // 自动调整宽度
 store: jsonStore,       // 使用 jsonStore 对象
 structure: layout,       // 使用 layout 对象定义的结构
 rowsPerPage: 20,       // 每页读取 20 条记录,保证 Web 浏览器的性能
 headerMenu: gridMenu  // 指定头菜单为 gridMenu 
			 }, 'gridNode'); 
			 grid.startup(); //grid 生效
			 }); 
			 </script>

清单 12定义了菜单 gridMenu 以及承载 DataGrid 的 DIV。

清单 12. 定义菜单

 <body class="tundra"> 
 <div class="heading">Data Grid</div> 
 <div dojoType="dijit.Menu" jsid="gridMenu" id="gridMenu" style="display: none;"> 
 <div dojoType="dojox.widget.PlaceholderMenuItem" label="GridColumns" ></div> 
 </div> 
 <div id="gridNode" style="height:350px;" /> 
 </body>

本例使用了外部数据源 dataGrid.txt,该文件的内容类似于 清单 13

清单 13. dataGrid.txt

 { 	 identifier: 'emp_no', 
	 label: 'emp_no', 
	 items: [ 
     {emp_no:'2100', name:'Matt', gender:'M', dept_no:730, bonus:647}, 
	 {emp_no:'2200', name:'Lisa', gender:'F', dept_no:731, bonus:608}, 
	 {emp_no:'2300', name:'Mick', gender:'M', dept_no:732, bonus:532}, 
	 {emp_no:'2400', name:'John', gender:'M', dept_no:733, bonus:1840}, 
	 {emp_no:'2500', name:'Jan', gender:'M', dept_no:734, bonus:1040}, 
	 {emp_no:'2101', name:'Jeff', gender:'M', dept_no:730, bonus:647}, 
	 {emp_no:'2202', name:'Frank', gender:'M', dept_no:731, bonus:608}, 
	 {emp_no:'2303', name:'Fred', gender:'M', dept_no:732, bonus:532} 
 ]}

运行,结果如下图所示。

图 6. 可编辑的 DataGrid

图 6. 可编辑的 DataGrid

回页首

DojoX Charting

Charting 是基于 DojoX 绘图包的数据可视化组件,包括了 Chart2D 和 Chart3D 来分别绘制 2D 和 3D 的图表。Chart2D 提供多种样式的饼图、柱状图、折线图、面积图、网格等图表。Chart3D 目前仅提供了 3D 柱状图和 3D 圆柱图,并且从社区获取的信息表明由于 IE 上的性能问题导致 Chart3D 的开发暂时搁置。Charting 的应用主要分为如下几个步骤:

  1. 首先引入所需要的 dojox 类,如:
    dojo.require("dojox.charting.Chart2D"); //Chart2D 所需要的 2D 类 
    dojo.require("dojox.charting.Chart3D"); //Chart3D 所需要的 3D 类 
    dojo.require("dojox.charting.themes.PlotKit.blue"); // 样式主题
  2. 第二,声明 Chart 对象,包括了 Chart2D 或 Char3D,
    如:var chart1=new dojox.charting.Charting.Chart2D('chart1');
    这里传入的参数为要在页面中载入 chart1 的元素的 ID,也就是 chart1 显示后的上层标签的 ID;
  3. 使用 Chart 对象的 setTheme 为 Chart 对象设置主题,来保证准确的绘制图表;
  4. 使用 Chart 对象的 addPlot 方法为 Chart 对象添加部件,可以添加多个部件;
  5. 使用 Chart 对象的 addSeries 方法为 Chart 对象添加数据;
  6. 最后,调用 render 方法将 chart 对象添加到页面节点中;

下面我们来看几个应用实例。

2D 饼图

清单 14的代码为 2D 饼图,我们可以看到该实例加载了类 Chart2D 和 themes.PlotKit.blue 对象。chart1 对象声明在 ID 为 char1 的元素下,并被添加了一个 Pie 部件作为默认部件,数据为 3、2、5、1、6、4。

清单 14.2D 饼图

 <script type="text/javascript"> 
 dojo.require("dojox.charting.Chart2D"); 
 dojo.require("dojox.charting.themes.PlotKit.blue"); 
 makeObjects = function(){ 
 var chart1 = new dojox.charting.Chart2D("chart1"); 
 chart1.setTheme(dojox.charting.themes.PlotKit.blue); 
 chart1.addPlot("default", { 
    type: "Pie", 
     font: "normal normal bold 12pt Tahoma", 
     fontColor: "black", 
	 labelOffset: -25, 
	 precision: 0 
	 }); 
  chart1.addSeries("Series A", [3, 2, 5, 1,6,4]); 
  chart1.render(); 
	 }; 
 dojo.addOnLoad(makeObjects); 
 </script> 
……
 <div id="chart1" style="width: 300px; height: 300px;"></div>

运行结果如下:

图 7. 二维饼图示例

图 7. 二维饼图示例

带网格的 2D 面积图

这个例子中我们为 Chart2D 对象添加了两个部件,网格和面积图,如 清单 15。值得注意的是,我们为 chart 添加了两个部件,Plot1 和 Plot2,其中 Plot1 的类型为 Areas,Plot2 的类型为 Grid,我们给 Plot1 添加了三组数据,并没有给 Plot2 添加数据。

清单 15. 网格和面积图

 chart = new dojox.charting.Chart2D("chart2"); 
 chart.setTheme(dojox.charting.themes.PlotKit.orange); 
 chart.addAxis("x", {origin:"max"}); 
 chart.addAxis("y", {vertical: true, leftBottom: true, min: 5000, max: 8000, 
 majorTickStep: 500, minorTickStep: 100}); 
 chart.addPlot("plot1", {type: "Areas", hAxis:"x", vAxis:"y"}); 
 chart.addPlot("plot2", {type: "Grid", hAxis:"x", vAxis:"y"}); 
 data1 = [{x:10,y:7200}, {x:20,y:6800}, {x:30,y:7000}, {x:40,y:6600}, {x:50,y:7000}, 
 {x:60,y:6800}, {x:70,y:7200}, {x:80,y:6600}, {x:90,y:6800}, {x:100,y:7000}]; 
 data2 = [{x:10,y:6800}, {x:20,y:5800}, {x:30,y:6400}, {x:40,y:5600}, {x:50,y:6000}, 
 {x:60,y:6200}, {x:70,y:6600}, {x:80,y:7200}, {x:90,y:6300}, {x:100,y:6000}]; 
 data3 = [{x:10,y:6000}, {x:20,y:6300}, {x:30,y:6800}, {x:40,y:6200}, {x:50,y:6200}, 
 {x:60,y:6600}, {x:70,y:6300}, {x:80,y:6200}, {x:90,y:6000}, {x:100,y:5900}]; 
 chart.addSeries("series B", data2, {plot: "plot1"}); 
 chart.addSeries("series C", data3, {plot: "plot1"}); 
 chart.addSeries("series A", data1, {plot: "plot1"}); 
 chart.render();

运行结果如下:

图 8. 二维面积图示例

图 8 二维面积图示例

巧用折线图进行函数图像的绘制

我们可以使用折线图或者面积图完成函数图像的绘制,原理就是按照一定的步长循环将定义域中将 x,y 值计算出来组成一组数据添加的 Chart2D 对象中,下面这个例子就是使用了折线图绘制了正弦余弦曲线。

清单16绘制正弦余弦曲线

清单 16. 绘制正弦余弦曲线

 dojo.require("dojox.charting.Chart2D"); 
 dojo.require("dojox.charting.themes.PlotKit.blue"); 
 dojo.addOnLoad(function() { 
   var period = 2 * Math.PI; 
   var tick = Math.PI / 180.0; 
   var step = 5*Math.PI / 180.0; 
   var chart = new dojox.charting.Chart2D('chart_area'); 
   chart.setTheme(dojox.charting.themes.PlotKit.blue); 
   chart.addAxis("x", {min: 0, max: period, majorTickStep: tick*30, 
                   minorTickStep: tick*10, minorLabels: false, font: '40px bold'}); 
   chart.addAxis("y", {vertical: true, min: -1.01, max: 1, majorTickStep: 0.5, 
                   minorTickStep: 0.1, minorLabels: false, font: '40px bold'}); 
   chart.addPlot("default", {type: 'Lines'}); 
   chart.addPlot("grid", {type: "Grid", vMinorLines: true}); 
   var series = {'sin' : [], 'cos' : []}; 
   for(var i = 0; i < period; i+=step) { 
      series.sin.push({'x' : i, 'y' : Math.sin(i)}); 
      series.cos.push({'x' : i, 'y' : Math.cos(i)}); 
   } 
 chart.addSeries('sin', series.sin); 
 chart.addSeries('cos', series.cos); 
 chart.render(); 
 });

运行结果如下:

图 9. 正余弦曲线图示例

图 9. 正余弦曲线图示例

3D 柱状图的绘制

使用 Chart3D 与 Chart2D 略有不同,这主要是因为 3D 绘图比 2D 绘图要复杂一些,3D 绘图一个很重要的过程就是坐标变换,以及光照和渲染都是很重要的考虑要点。不过 Chart3D 已经对 gfx3D 进行了封装,我们只需要通过对简单的几个参数的设置就可以完成一个 3D 图表。我们可以从 清单 17中看出 Chart3D 对象的声明比 Chart2D 多了一些参数,这主要是两类,光照与摄像机。光照指的是 3D 物体的周围的光环境,其中 lights 是光源数组,也就是说 3D 物体可以接受多个光源的光照;ambient 为环境光,影响物体的各个立体面;specular 是镜面反射光,这是光源照射物体特定位置发生镜面反射所产生的高光。当然了,你甚至可以不用理解这些参数的意义,在实际使用中多次调整参数以满足自己的使用需求。

清单 17. 3D 绘图

 dojo.require("dojox.charting.Chart3D"); 
 dojo.require("dojox.charting.plot3d.Bars"); 
 dojo.require("dojox.charting.plot3d.Cylinders"); 

 makeObjects = function(){ 
 var m = dojox.gfx3d.matrix; 
 var chart = new dojox.charting.Chart3D("test", 
 {lights:   [{direction: {x: 5, y: 5, z: -5}, color: "white"}], 
	 ambient:  {color:"white", intensity: 2}, 
	 specular: "white"}, 
 [m.cameraRotateXg(10), m.cameraRotateYg(-10), m.scale(0.8), 
 m.cameraTranslate(-50, -50, 0)] 
 ); 
 var plot1 = new dojox.charting.plot3d.Bars(500, 500, {gap: 10, material: "yellow"}); 
 plot1.setData([2,1,2,1,1,1,2,3,5]); 
 chart.addPlot(plot1); 
 var plot2 = new dojox.charting.plot3d.Bars(500, 500, {gap: 10, material: "red"}); 
 plot2.setData([1,2,3,2,1,2,3,4,5]); 
 chart.addPlot(plot2); 
 var plot3 = new dojox.charting.plot3d.Cylinders (500, 500, {gap: 10, material: "#66F"}); 
 plot3.setData([2,3,4,3,2,3,4,5,5]); 
 chart.addPlot(plot3); 
 var plot4 = new dojox.charting.plot3d.Cylinders (500, 500, {gap: 10, material: "#E6F"}); 
 plot4.setData([3,4,5,4,3,4,5,5,5]); 
 chart.addPlot(plot4); 
 chart.generate().render(); 
 }; 
 dojo.addOnLoad(makeObjects);

运行这段代码,显示效果如下:

图 10. 三维柱状图示例

图 10. 三维柱状图示例

这个 3D 柱状图结合了长方体和圆柱体,dojox.charting.plot3d.Bars 是长方体的声明类,new dojox.charting.plot3d. Cylinders 是圆柱体的声明类。

回页首

DojoX Gfx 和 Gfx3D

DojoX Gfx 和 Gfx3D 是 DojoX 中进行绘图的两个包,分别提供了 2D 和 3D 的绘图 API。前面介绍的 DojoX Charting 就是在这两个包的基础上开发的。Gfx 以及 Gfx 3D 是一组矢量绘图 API。对于原生的矢量图形,Gfx 能够支持 SVG、Canvas 和 VML,新版本中又增加了对 Silverlight 的支持。首先,我们来看看 DojoX Gfx 可以做什么。在 dojo 官方网站公布的开发包中有这么几个 Gfx 例子,见下图。可以看出,Gfx 对于简单的 2D 绘图已经绰绰有余了。

图 11.Gfx 绘图

图 11.Gfx 绘图

下面我们就来使用 Gfx 开始绘图。Gfx 绘图的基本步骤可以简单的归为两步:打开一个画布(surface),然后“画”。在绘画之前,我们要例行公事,引入 dojox.gfx 包。然后通过 dojox.gfx 对象的 createSurface 方法建立画布。Surface 提供了很多画笔来进行作画,这里我们介绍几个比较常用的。

  • 线性画笔:使用方法为 surface.createLine(opt),参数包含 x1、y1、x2、y2 四个属性,分别表示起点横纵坐标和终点横纵坐标;
  • 矩形画笔:使用方法为 surface.createRect(opt),参数 opt 是一个 JSON 对象,包括了属性 x、y、width、height,分别表示矩形左上角的横纵坐标以及举行的宽和高;
  • 圆形画笔:使用方法为 surface.createCircle(opt),参数 opt 具有三个属性,分别是圆心横坐标 cx、圆心纵坐标 cy、圆半径 r;
  • 路径画笔:这个是最强大的画笔,可以绘制任意曲线和图形,当然也是使用最复杂的画笔,使用方法为 surface.createPath(path),path 是描绘一组路径的字符串,描绘规则可以参考 SVG 中关于矢量路径的介绍。

除以上介绍的几种外还有点、折线、文字等画笔,并且还提供了组功能,可以使一组图形一起响应事件等。下面就看个简单的例子来加深理解。

清单 18. Gfx 绘图代码

 dojo.require("dojox.gfx"); 
 surface = dojox.gfx.createSurface(dojo.byId("gfx_holder"), 700, 700); 
 surface.createRect({x: 260, y: 260, width: 50, height: 50}).setFill("#AAF"); 
 surface.createLine({x1: 100, y1: 400, x2: 400, y2: 350}) 
	 .setStroke({color:"#9F3",width:5}); 
 surface.createCircle({cx: 200, cy: 200, r: 50}) 
	 .setFill("#FEF").setStroke({color: "#F9A", width: 3}); 
 var path="M153 334 " + 
		"C153 334 151 334 151 334 C151 339 153 344 156 344 " + 
		"C164 344 171 339 171 334 C171 322 164 314 156 314 " + 
		"C142 314 131 322 131 334 C131 350 142 364 156 364 " + 
		"C175 364 191 350 191 334 C191 311 175 294 156 294 " + 
		"C131 294 111 311 111 334 C111 361 131 384 156 384 " + 
		"C186 384 211 361 211 334 C211 300 186 274 156 274"
 surface.createPath(path).setFill("rgb(FF,FF,FF)").setStroke({color:"red",width:3});

清单 18中的代码将在 ID 为 gfx_holder 的 html 标记内添加这个绘图。这段代码中的 setFill 方法和 setStroke 方法分别用来设置填充效果和笔触效果。代码运行结果如下图所示。

图 12. Gfx 简单绘图示例

图 12. Gfx 简单绘图示例

Gfx3D 的工作原理是采用计算机图形学的原理将三维空间中的物体按照透视规则从三维坐标系转换成二维的坐标系然后通过 SVG 等矢量图显示出来。限于浏览器和 javascript 的性能,目前 Gfx3D 仅能绘制较为简单的 3D 物体和空间曲线,还不能绘制复杂的空间曲面以及进行纹理等渲染工作,但是 Gfx3D 足以满足大部分 Web 应用的需要了。Gfx3D 的使用大致分三个步骤:建立画布,在画布上建立视图,在视图上建立 3D 物体。视图上必不可少的要设置光源以及摄像机方位。设置光源可以通过 setLights 方法来设定,摄像机方位则需要使用 dojox.gf3d.maxtrix 对象的 cameraRotateX、cameraRotateY、cameraRotateZ、cameraTranslate 等方法来确定。清单 19在画布上绘制了一个立方体和一个圆柱体。

清单 19. Gfx 3D 绘图

 dojo.require("dojox.gfx3d"); 

 makeObjects = function(){ 
 var surface = dojox.gfx.createSurface("test", 500, 500); 
 var view = surface.createViewport();  // 建立视图
 view.setLights([{direction: {x: 0, y: 0, z: -10}, color: "white"}, 
			 {direction: {x: 10, y: 0, z: -10}, color: "#444"}], 
 {color: "white", intensity: 2}, "white"); 
 var m = dojox.gfx3d.matrix;  // 建立空间
 var l = view.createCube({bottom: {x: 0, y: 0, z: 0}, top: {x: 100, y: 100, z: 100}}) 
		 .setFill({type: "plastic", finish: "dull", color: "lime"});  // 绘制立方体
 view.createCylinder({})   // 绘制圆柱体
    .setTransform([m.translate(200, 100,200), m.rotateZg(60), m.rotateXg(-60)]) 
	 .setStroke("black") 
	 .setFill({type: "plastic", finish: "glossy", color: "red"}); 
 var camera = [m.cameraRotateXg(20), m.cameraRotateYg(20), 
 m.cameraTranslate(-200, -200, 0)]; // 设置摄像机方位
 view.applyCameraTransform(camera); 
 view.render(); 
 }; 
 dojo.addOnLoad(makeObjects);

运行,结果如下图所示。

图 13. Gfx-3D 简单绘图示例

图 13. Gfx-3D 简单绘图示例

其他 DojoX Widget

DojoX 的 widget 包中还提供了更多的小部件,非常的方便易用,本文的最后再来两个餐后甜点,拾色器和鱼眼。拾色器是我们经常会用到的小部件,用 DojoX 生成拾色器非常简单,仅需要 清单 20这一小段代码即可。

清单 20. 拾色器

 <div id="pickerToo" dojoType="dojox.widget.ColorPicker"
 animatePoint="true"
 showHsv="true"
 showRgb="true"
 webSafe="true"
 onChange="alert(this.value)"> 
 </div>

除了这段 javascript 代码,为了能正确的显示拾色器的样式,我们还需要导入它的 css 文件:dojox/widget/ColorPicker/ColorPicker.css。代码中,属性 animatePoint 来确定指针是否有滑动动画,默认为 true;属性 showHsv 表示是否显示 HSV 颜色模式数值;属性 showRgb 表示是否显示 RGB 颜色模式的数值;webSafe 表示是否显示 Web 安全色。清单 20显示效果如下:

图 14 .DojoX 拾色器

图 14 .DojoX 拾色器

鱼眼的实现也很简单,我们需要制作一组图标,命名为 fe1.gif、fe2.gif、fe3.gif 一直到 fe7.gif。我们将它们和页面放在同一文件夹下。然后在网页中书写如 清单 21所示代码。

清单 21. 鱼眼

 <div dojoType="dojox.widget.FisheyeList"
 itemWidth="40" itemHeight="40"
 itemMaxWidth="150" itemMaxHeight="150"
 orientation="horizontal"
 effectUnits="2"
 itemPadding="10"
 attachEdge="center"
 labelEdge="bottom"
 id="fisheye1"> 
 <div dojoType="dojox.widget.FisheyeListItem" id="item1"
 onclick="alert('click on ' + this.label !');" label="Item 1" iconSrc="fe1.gif"> 
 </div> 
 <div dojoType="dojox.widget.FisheyeListItem" label="Item 2" iconSrc="fe2.gif"></div> 
 <div dojoType="dojox.widget.FisheyeListItem" label="Item 3" iconSrc="fe3.gif"></div> 
 <div dojoType="dojox.widget.FisheyeListItem" label="Item 4" iconSrc="fe4.gif"></div> 
 <div dojoType="dojox.widget.FisheyeListItem" label="Item 5" iconSrc="fe5.gif"></div> 
 <div dojoType="dojox.widget.FisheyeListItem" label="Item 6" iconSrc="fe6.gif"></div> 
 </div>

运行,鼠标移上去来看看效果。

图 15.DojoX 鱼眼

图 15 DojoX 鱼眼

回页首

结束语

JavaScript 并不是万能的,同样,使用 JavaScript 开发的 Dojo 也不是万能的,但是为了满足众多开发者的需要,DojoX 提供了非常丰富的选择,并且提供了对 Flash、SilverLight、Google Gear 等组件的支持,使得 Dojo 爱好者们可以开发出更好更强大的 Web 应用。随着 DojoX 项目的不断完善和成熟,Dojo 将给开发者们带来更多的惊喜。

参考资料

学习

获得产品和技术

  • 下载最新版 Dojo 工具包。

讨论

内网(极空间)搭建gitlab跳板机转发端口及域名配置 然后,回头尝试用内网地址+15022 clone,成功,用公网的ip+15222 clone失败,那就是定位到时nginx转发的问题了。首先想到的就是 git clone是通过ssh的22端口进行下载的,那就需要打通22端口,则又配置22端口的nginx转发。然后,我通过ssh命令,做一个端口转发,以实现内网穿透,将服务端口链接到跳板机上。然后穿透到阿里云服务器跳板机的端口,只能内网访问,需要用nginx做个转发,才能用公网ip进行访问。然后,如上,我的80端口,映射15080,22端口映射15022。 阅读详情

相关推荐

分析方法—temporal receptive field(TRF)

总结来说,时间感受野其实就是一个 filter!课程中的描述—.(使用时间感受野与刺激进行卷积来描述)时间感受野一般是听觉计算中使用的,在视觉中,有另一种分析叫做空间感受野(spatial receptive fields)。回归权重(Regression weights)是指在回归分析中用于估计自变量与因变量之间关系的权重或系数。回归分析是一种统计方法,用于建立自变量与因变量之间的关联模型,并通过拟合数据来估计模型中的参数。在简单线性回归中,只有一个自变量与一个因变量之间的关系被建模。

m0_51474171的博客 1604

dojo(三):样式处理

test

TrendGrucee的专栏 8947

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 809

(1)Dojo学习之简单配置

引言 Dojo配置 1 Dojo存在默认配置 2 查看dojo默认配置 3 修改dojo配置 总结1.引言      在前面的文章里面我们介绍了一下AMD规范,什么是AMD规范,我们用AMD规范可以做什么,我们还说了Dojo框架对AMD规范进行了实现,进而开发了一系列的模块让我们进行调用,现在就让我们来学习一下Dojo框架,看看Dojo到底提供给我们什么?在博客中我主要引入ArcGIS API的in

王培晓Carpenter 7466

手把手教你用Wireshark国密版分析TLCP和IPSec协议(附下载地址)

本文详细介绍了Wireshark国密版在TLCP和IPSec协议分析中的实战应用,包括环境配置、协议解析、合规性检查及高级分析技巧。该工具针对商用密码算法(如SM2/SM3/SM4)进行了专项优化,支持GB/T 38636-2020 TLCP和GB/T 36968-2018 IPSec VPN等国家标准,帮助开发者与安全工程师高效完成密评分析任务。

weixin_29325955的博客 555

从零构建:基于OpenCV与人体姿态分析的跌倒检测实战(附完整源码)

本文详细介绍了如何从零构建基于OpenCV与人体姿态分析的跌倒检测系统,包含完整源码与部署指南。通过MediaPipe实时检测33个人体关键点,结合多条件联合判断算法,实现高精度跌倒识别。文章还提供了性能优化技巧、常见问题解决方案以及家用与养老院两种部署方案,帮助开发者快速落地这一计算机视觉应用。

weixin_29085151的博客 240

掌握 Dojo 工具包

Dojo 作为最著名的 Ajax 开源项目之一,不仅让 Web 程序员可以免费获得和使用其框架进行 Web 应用的开发,更吸引了大量的开发者对其不断的扩充,开发新的组件。DojoX 就是在这样的开发社区中产生的。DojoX 是一组基于 dojo 的开源项目的集合,这些开源项目具有很好的创意和很高的实用性。这些 DojoX 项目有可能成长为一个稳定的版本保留在 DojoX 中,也有些可能会迁移到 D

qq_15117745的专栏 907

CKAD-CN 考试知识点分享(2) CronJob

成功创建 CronJobppi,每 5 分钟执行一次计算任务;配置了和;设置,超时自动终止;确保 Pod 不重启;手动创建ppi-testJob 验证功能正常;所有任务要求均已满足。

轻的博客 331

手把手教你Dojo入门

手把手教你Dojo入门 如果仅仅是为了练习Dojo,或者进行测试,可以参考下面的步骤。下面的文件均是在Windows下测试 需要的工具 1 Tomcat服务器:下载地址 选择适合自己的机器型号,即可 2 Dojo的工具包:下载地址  由于dojo toolkit没有测试页面,所以推荐下载下面的那个SDK的 3 浏览器 博主使用的是chrom...

xingoo 691

2025年普通人转向人工智能运维(AIOps)学习建议(附最新技术实践与资源)

AIOps不仅是技术的叠加,更是运维流程的重构。建议通过“学习-实践-反馈”循环,逐步从工具使用者成长为解决方案设计者。如需完整资源链接,可访问上述推荐的优快云博客及GitHub仓库。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 3096

从零打造音乐会级特雷门琴:原理、设计与调试全解析

电子乐器的工作原理通常基于信号生成与调制。特雷门琴作为世界上最早的电子乐器之一,其核心原理是利用射频振荡器和电容传感,将演奏者的手势变化转化为音高与音量信号。这种技术通过外差式混频实现音高控制,并利用压控放大器实现细腻的音量动态,其工程价值在于将抽象的空间位置信息精确映射为连续的音频参数。在音乐制作、声音艺术和交互装置等领域,这类技术为创造独特的演奏体验提供了基础。本文聚焦于如何从电路层面实现一台高稳定性的特雷门琴,详细阐述了从LC振荡器设计、天线场形优化到音色混合检波等关键环节,并分享了基于LTspice

weixin_34046298的博客 171

Dojo 1.6 官方教程:Dojo中的事件

原题:Events with Dojo原文链接: http://dojotoolkit.org/documentation/tutorials/1.6/events/作者: Bran Forbes译者: wangqiang本文将与读者一同深入探究dojo.connect,如何使用Dojo来轻松的绑定DOM事件以及在原生对象上自定义事件。同时我们也将对Dojo

Dojo中文博客 2万+

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制

本文全面解析 Android System UI 的架构设计、功能演进及场景化定制,揭示其作为安卓系统核心交互层的技术特性与生态价值。

学无止境 1584

掌握 Dojo 工具包 总目录

掌握 Dojo 工具包,第 1 部分: Dojo 入门简介 http://www.ibm.com/developerworks/cn/web/wa-lo-dojointro1/index.html 随着富互联网应用程序(Rich Internet Application,RIA)的发展,一批 JavaScript Toolkit 也随之兴起 , Dojo 便是其中的优秀代表,本系列文章将由浅入深带领读者走进 Dojo 的世界。本文作为这个系列的开篇 , 主要讲述了 Dojo 的体系架构以及如何安装

rosonex的专栏 551

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

[Dojo]掌握Dojo工具包

掌握 Dojo 工具包,第 1 部分: Dojo 入门简介 掌握 Dojo 工具包,第 2 部分: XHR 框架与 Dojo 掌握 Dojo 工具包,第 3 部分: Dojo 事件机制 掌握 Dojo 工具包,第 4 部分: Dojo 中的拖拽 掌握 Dojo 工具包,第 5 部分: Dojo 的 UI 组件库 - Dijit 掌握 Dojo 工具包,第 6 部分: Dojo Widge...

weixin_33967071的博客 113

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

300kW变频器带不动负载的系统级诊断方法

变频器带载能力下降是工业驱动系统中典型的性能退化现象,其本质并非单一器件故障,而是整流、逆变、控制及外部耦合环节协同失配的结果。从直流母线电压稳定性这一底层物理约束出发,结合IGBT驱动能力衰减、散热效率下降、V/F曲线失准、电流环参数失调等关键技术点,可实现对‘带不动’问题的精准溯源。该方法强调能量通路完整性分析,覆盖硬件老化(如电容ESR升高、电抗器饱和)、控制偏差(如PI参数错配)与系统耦合缺陷(如电机绝缘劣化、电缆谐振损耗),适用于300kW级大功率变频驱动场景的预防性维护与快速排故。

weixin_34396902的博客 279

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

GPU性能实时监控工具盘点:从nvidia-smi到DCGM+Grafana

在深度学习的训练与推理过程中,GPU的实时状态直接决定任务效率与稳定性。显存泄漏、温度墙降频、GPU利用率虚高、多卡掉线等问题,常常让模型训练陷入瓶颈。理解GPU监控的核心指标——如SM占用率、显存带宽、功耗与温度——是精准定位性能拐点的关键。本文从最基础的NVIDIA命令行工具nvidia-smi出发,逐步介绍终端图形化工具nvtop、可编程的gpustat,以及面向数据中心的DCGM+Prometheus+Grafana监控体系。这些工具能帮助开发者实时捕捉GPU利用率波动、显存占用变化和硬件健康状态,

weixin_33785108的博客 428

dojo ajax 方法参数讲解 dojo.xhrPost

field type description content: Object Contains properties with string values. These properties will be serialized as name1=value2 and passed in the request. error Function: function(response, i...

mojianpo 莫建坡 437

Dojo 国际化简介

介绍 Dojo 的 i18n 包解决了 web 应用程序国际化方面的诸多常见需求和挑战。 它在 Dojo 应用程序中的应用效果最佳,可帮助渲染本地化的部件,包括高级消息、日期和数字格式化等;但如果需要的话,也可以单独使用该模块。 功能 描述 本地化单个部件 每个部件实例都可以有自己的本地化设置,能够在单个应用程序中显示多套本地化数据。如果没有指定,部件将回退使用当前的根区域设置(r...

blocklang的博客 313

ie中如何调试dojo

ie调试dojo

bornonew的博客 1740

Eaglet 开源项目教程

Eaglet 开源项目教程 项目介绍 Eaglet 是一个高效、灵活的开源项目,旨在提供一个轻量级的框架,用于快速开发和部署应用程序。该项目由 Chung Chi300 发起,并在 GitHub 上开源,吸引了众多开发者的关注和贡献。 项目快速启动 环境准备 在开始之前,请确保您的开发环境已经安装了以下工具: Node.js (版本 >= 12.0.0) npm (版本 >= 6.0...

gitblog_00805的博客 518

Dojo学习和常用知识

Dojo 是一个流行的 JavaScript 库,用于开发 Web 应用程序。它提供了许多功能,如 DOM 操作、事件处理、动画效果、数据存储和许多其他实用功能。在今天的 Web 开发中,Dojo 仍然被广泛使用,尤其是在企业级应用程序开发中。下面是一个详细的 Dojo 详解,包括代码实例。

AI时代光年 1754

Dojo 1.6 最新官方教程: Dojo DOM 函数

本文翻译自: Dojo DOM Functions 原作者: Sam Foster 翻译: Siqi (siqi.zhong@gmail.com)   在本教程中,您将学到如何使用Dojo简单地跨平台操作DOM。只需要基本DOM知识和几个Dojo函数,您就能高效地创

Dojo中文博客 1万+
上一篇: Applet初次使用
下一篇: 从头开始学习 Dojo,第 1 部分 开始 Dojo 开发
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值