Vert.x Java开发指南——第七章 公开Web API

Vert.x 应用开发入门:创建首个Demo Vert.x 是一个开源的、轻量级的事件驱动应用框架,由 Java 编写,它允许开发者使用 Java 以及 JavaScript、Groovy 等支持的语言来构建响应式的应用程序。其核心特性是支持非阻塞I/O操作,能够高效地处理并发事件,适合构建高可扩展性的网络应用。通过Vert.x,开发者可以轻松地在单线程中处理多个并发任务,充分利用现代多核处理器的计算能力。Vert.x 是一个用于构建响应式应用的工具包。它允许开发者以事件驱动的方式编写程序,适合在分布式环境中进行高并发的网络通信。 阅读详情

第七章 公开Web API

版权声明:本文为博主自主翻译,转载请标明出处。 https://blog.youkuaiyun.com/elinespace/article/details/80559368

相应代码位于本指南仓库的step-6目录下

使用我们已经讲到的vertx-web模块公开Web HTTP/JSON API非常简单。我们将使用以下URL方案公开Web API:

  1. GET /api/pages 给出一个包含所有wiki页面名称和标识的文档
  2. POST /api/pages 从一个文档创建新的wiki页
  3. PUT /api/pages/:id 从一个文档更新wiki页面
  4. DELETE /api/pages/:id 删除一个wiki页面

下面是使用HTTPie命令行工具与这些API交互的截图:
在这里插入图片描述

7.1 Web子路由器

我们需要添加新的路由处理器到HttpServerVerticle类。虽然我们可以直接向现有的路由器添加处理程序,但我们也可以利用子路由器的优势来处理。它们允许将一个路由器挂载为另一个路由器的子路由器,这对组织和(或)重用handler非常有用。

此处是API路由器的代码:

Router apiRouter = Router.router(vertx);
apiRouter.get("/pages").handler(this::apiRoot);
apiRouter.get("/pages/:id").handler(this::apiGetPage);
apiRouter.post().handler(BodyHandler.create());
apiRouter.post("/pages").handler(this::apiCreatePage);
apiRouter.put().handler(BodyHandler.create());
apiRouter.put("/pages/:id").handler(this::apiUpdatePage);
apiRouter.delete("/pages/:id").handler(this::apiDeletePage);
router.mountSubRouter("/api", apiRouter); ①

① 这是我们挂载API路由器的位置,因此请求以/api开始的路径将定向到apiRouter。

7.2 处理器

接下来是不同的API路由器处理器代码。

7.2.1 根资源

private void apiRoot(RoutingContext context) {
	dbService.fetchAllPagesData(reply -> {
		JsonObject response = new JsonObject();
		if (reply.succeeded()) {
			List<JsonObject> pages = reply.result()
				.stream()
				.map(obj -> new JsonObject()
					.put("id", obj.getInteger("ID")) ①
					.put("name", obj.getString("NAME")))
				.collect(Collectors.toList());
				response.put("success", true)
					.put("pages", pages); ②
				context.response().setStatusCode(200);
				context.response().putHeader("Content-Type", "application/json");
				context.response().end(response.encode()); ③
		} else {
			response.put("success", false)
					.put("error", reply.cause().getMessage());
			context.response().setStatusCode(500);
			context.response().putHeader("Content-Type", "application/json");
			context.response().end(response.encode());
		}
	});
}

① 我们只是在页面信息记录对象中重新映射数据库记录。

② 在响应载荷中,结果JSON数组成为pages键的值。

③ JsonObject#encode()给出了JSON数据的一个紧凑的String展现。

7.2.2 得到一个页面

private void apiGetPage(RoutingContext context) {
	int id = Integer.valueOf(context.request().getParam("id"));
	dbService.fetchPageById(
			id,
			reply -> {
				JsonObject response = new JsonObject();
				if (reply.succeeded()) {
					JsonObject dbObject = reply.result();
					if (dbObject.getBoolean("found")) {
						JsonObject payload = new JsonObject()
								.put("name", dbObject.getString("name"))
								.put("id", dbObject.getInteger("id"))
								.put("markdown",dbObject.getString("content"))
								.put("html",Processor.process(dbObject.getString("content")));
						response.put("success", true).put("page", payload);
						context.response().setStatusCode(200);
					} else {
						context.response().setStatusCode(404);
						response.put("success", false).put("error","There is no page with ID " + id);
					}
				} else {
					response.put("success", false).put("error",reply.cause().getMessage());
					context.response().setStatusCode(500);
				}
				context.response().putHeader("Content-Type",
						"application/json");
				context.response().end(response.encode());
			});
}

7.2.3 创建一个页面

private void apiCreatePage(RoutingContext context) {
	JsonObject page = context.getBodyAsJson();
	if (!validateJsonPageDocument(context, page, "name", "markdown")) {
		return;
	}
	dbService.createPage(
			page.getString("name"),
			page.getString("markdown"),
			reply -> {
				if (reply.succeeded()) {
					context.response().setStatusCode(201);
					context.response().putHeader("Content-Type","application/json");
					context.response().end(new JsonObject().put("success", true).encode());
				} else {
					context.response().setStatusCode(500);
					context.response().putHeader("Content-Type","application/json");
					context.response().end(new JsonObject()
							.put("success", false)
							.put("error",reply.cause().getMessage()).encode());
				}
			}
	);
}

这个处理器和其它处理器都需要处理输入的JSON文档。下面的validateJsonPageDocument方法是一个验证并在早期报告错误的助手,因此处理的剩余部分假定存在某些JSON条目。

private boolean validateJsonPageDocument(RoutingContext context, JsonObject page, String... expectedKeys) {
	if (!Arrays.stream(expectedKeys).allMatch(page::containsKey)) {
		LOGGER.error("Bad page creation JSON payload: " + page.encodePrettily() + " from " + context.request().
				remoteAddress());
		context.response().setStatusCode(400);
		context.response().putHeader("Content-Type", "application/json");
		context.response().end(new JsonObject()
				.put("success", false)
				.put("error", "Bad request payload").encode());
		return false;
	}
	return true;
}

7.2.4 更新一个页面

private void apiUpdatePage(RoutingContext context) {
	int id = Integer.valueOf(context.request().getParam("id"));
	JsonObject page = context.getBodyAsJson();
	if (!validateJsonPageDocument(context, page, "markdown")) {
		return;
	}
	dbService.savePage(id, page.getString("markdown"), reply -> {
		handleSimpleDbReply(context, reply);
	});
}

handleSimpleDbReply方法是一个助手,用于完成请求处理:

private void handleSimpleDbReply(RoutingContext context, AsyncResult<Void> reply) {
	if (reply.succeeded()) {
		context.response().setStatusCode(200);
		context.response().putHeader("Content-Type", "application/json");
		context.response().end(new JsonObject().put("success", true).encode());
	} else {
		context.response().setStatusCode(500);
		context.response().putHeader("Content-Type", "application/json");
		context.response().end(new JsonObject()
			.put("success", false)
			.put("error", reply.cause().getMessage()).encode());
	}
}

7.2.5 删除一个页面

private void apiDeletePage(RoutingContext context) {
	int id = Integer.valueOf(context.request().getParam("id"));
	dbService.deletePage(id, reply -> {
		handleSimpleDbReply(context, reply);
	});
}

7.3 单元测试API

我们在io.vertx.guides.wiki.http.ApiTest类中编写一个基础的测试用例。

前导(preamble)包括准备测试环境。HTTP服务器Verticle依赖数据库Verticle,因此我们需要在测试Vert.x上下文中同时部署这两个Verticle:

@RunWith(VertxUnitRunner.class)
public class ApiTest {
	private Vertx vertx;
	private WebClient webClient;
	@Before
	public void prepare(TestContext context) {
		vertx = Vertx.vertx();
		JsonObject dbConf = new JsonObject()
			.put(WikiDatabaseVerticle.CONFIG_WIKIDB_JDBC_URL, 					"jdbc:hsqldb:mem:testdb;shutdown=true") ①
			.put(WikiDatabaseVerticle.CONFIG_WIKIDB_JDBC_MAX_POOL_SIZE, 4);
		vertx.deployVerticle(new WikiDatabaseVerticle(),
				new DeploymentOptions().setConfig(dbConf), context.asyncAssertSuccess());
		vertx.deployVerticle(new HttpServerVerticle(), context.asyncAssertSuccess());
		webClient = WebClient.create(vertx, new WebClientOptions()
			.setDefaultHost("localhost")
			.setDefaultPort(8080));
	}
	@After
	public void finish(TestContext context) {
		vertx.close(context.asyncAssertSuccess());
	}
	// (...)

① 我们使用了一个不同的JDBC URL,以便使用一个内存数据库进行测试。

正式的测试用例是一个简单的场景,此处创造了所有类型的请求。它创建了一个页面,获取它,更新它,然后删除它:

@Test
public void play_with_api(TestContext context) {
	Async async = context.async();
	JsonObject page = new JsonObject().put("name", "Sample").put(
			"markdown", "# A page");
	Future<JsonObject> postRequest = Future.future();
	webClient.post("/api/pages").as(BodyCodec.jsonObject())
			.sendJsonObject(page, ar -> {
				if (ar.succeeded()) {
					HttpResponse<JsonObject> postResponse = ar.result();
					postRequest.complete(postResponse.body());
				} else {
					context.fail(ar.cause());
				}
			});
	Future<JsonObject> getRequest = Future.future();
	postRequest.compose(h -> {
		webClient.get("/api/pages").as(BodyCodec.jsonObject()).send(ar -> {
			if (ar.succeeded()) {
				HttpResponse<JsonObject> getResponse = ar.result();
				getRequest.complete(getResponse.body());
			} else {
				context.fail(ar.cause());
			}
		});
	}, getRequest);
	Future<JsonObject> putRequest = Future.future();
	getRequest.compose(
			response -> {
				JsonArray array = response.getJsonArray("pages");
				context.assertEquals(1, array.size());
				context.assertEquals(0, array.getJsonObject(0).getInteger("id"));
				webClient.put("/api/pages/0")
					.as(BodyCodec.jsonObject())
					.sendJsonObject(new JsonObject().put("id", 0).put("markdown", "Oh Yeah!"),
								ar -> {
									if (ar.succeeded()) {
										HttpResponse<JsonObject> putResponse = ar.result();
										putRequest.complete(putResponse.body());
									} else {
										context.fail(ar.cause());
									}
								});
			}, putRequest);
	Future<JsonObject> deleteRequest = Future.future();
	putRequest.compose(
			response -> {
				context.assertTrue(response.getBoolean("success"));
				webClient.delete("/api/pages/0")
						.as(BodyCodec.jsonObject())
						.send(ar -> {
							if (ar.succeeded()) {
								HttpResponse<JsonObject> delResponse = ar.result();
								deleteRequest.complete(delResponse.body());
							} else {
								context.fail(ar.cause());
							}
						});
			}, deleteRequest);
	deleteRequest.compose(response -> {
		context.assertTrue(response.getBoolean("success"));
		async.complete();
	}, Future.failedFuture("Oh?"));
}

这个测试使用了Future对象组合的方式,而不是嵌入式回调;最后的组合(compose)必须完成这个异步Future(指的是async)或者测试最后超时。

快衰落、慢衰落,平坦衰落、频率选择性衰落 目录一、大尺度衰落和小尺度衰落二、平坦衰落和频率选择性衰落1.反射墙、固定天线模型2.相干带宽和时延扩展三、快衰落和慢衰落1.反射墙、运动天线模型2.相干时间和多普勒扩展四、联系总结 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、大尺度衰落和小尺度衰落 移动无线信道的主要特征是信道强度关于时间和频率的变化,大致分两种: 大尺度衰落: . 阅读详情

相关推荐

HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信

本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。

weixin_42632434的博客 415

Vertx入门学习(含代码)

github: https://github.com/vert-x3 官网:http://vertx.io/Vert.x诞生于2011年,当时叫node.x,不过后来因为某些原因改名为Vert.x,目前官网最新版本是4.4.0,官网上介绍Vert.x是一个用于在JVM上构建高效应用程序的工具包,是JVM上的Reative开发套件。说白了,Vert.x就是一堆的jar包,提供了一系列的编程API接口,通过这些API可以实现异步编程。 Vert.x目前是我见过功能最强大、对第三方库依赖最少的Java框架,是一

weixin_44798288的博客 8828

嵌入式电机控制实战:手把手教你实现I/F强拖启动(附仿真代码)

本文详细介绍了嵌入式电机控制中的I/F强拖启动技术,通过参数配置、代码实现和仿真验证的完整流程,帮助开发者掌握永磁同步电机(PMSM)的高效启动方法。文章包含硬件平台搭建、参数整定黄金法则及MATLAB/Simulink仿真验证,适合工业自动化和智能设备领域的工程师参考。

rust6ferris的博客 911

Vert.x(vertx) 简明介绍

摘要 Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步模型能够很大层度的提高系统的并发量。 Vert.x除了异步之外,还提供了非常多的吸引人的技术,比如EventBus,通过EventBus可以非常简单的实现分布...

happyfly的博客 7万+

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 749

Android 的端智能学习路径

基础层:先补齐 Android 进阶(JNI / 性能优化)和 AI 基础概念,无需深入算法开发;核心层:掌握 TFLite 的模型加载、推理、量化,能完成基础端侧推理;落地层:聚焦实战场景(图像 / OCR / 语音),解决工程化问题(模型管理、异常处理);优化层:通过模型量化、硬件加速、工程优化,提升推理性能和用户体验。

hqiangtai的博客 344

Vertx快速入门参考

Vertx学习 什么是vertx? Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统的开销。因此相比较传统的阻塞模型,异步模型能够很大层度的提高系统的并发量。 核心点1:异步模型框架 Vert.x除了异步之外,还提供了非常多的吸引人的技术,比如EventBus,通过EventBus可以非常简单的实现分布式消息,进而为分布式系统调用,微服务奠定基础。除此之外,还

Cherish__it的博客 1万+

SDFCOM_SWC警告深度剖析:从assign短路到时序标注失效的链路追踪

本文深入剖析了SDFCOM_SWC警告的根源,从assign短路到时序标注失效的全链路追踪。通过分析RTL设计中的assign语句陷阱、综合阶段的优化变形以及PrimeTime生成SDF文件的视角,提出了重构RTL设计、警告抑制和SDF生成优化等解决方案,帮助工程师有效避免时序标注问题。

weixin_42519985的博客 363

Vertx学习一:这玩意是到底是个啥

Vertx,融合Java、Ruby、Python等语言的高性能架构,架构师必读 原文链接: http://www.360doc.com/content/18/0203/14/39530679_727432611.shtml 目录: 一、Vert.x简介 二、Vert.x原理解析 三、Vert牛刀小试 四、Vert应用实践 五、辅助工...

lizhou828的专栏 6万+

手把手教你ensp仿真搭建校园网(含防火墙及无线网络)系列(三)校园无线网络AC+AP配置

本系列博客将带你从零开始,使用 华为 eNSP(Enterprise Network Simulation Platform) 仿真搭建一个完整的校园网络,涵盖 核心层、汇聚层、接入层、防火墙安全策略、无线AC+AP组网 等实战场景。无论你是网络初学者还是希望深化实战经验的工程师,都能通过本教程掌握企业级网络的规划、配置与排错技巧。

echo的博客 1357

高频网络协议与编程IO相关面试基本问题和知识点整理

网络IO相关基本高频面试基本问题和知识点整合

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 173万+

IO密集型任务及Vertx框架入门

Vert.x 是一个基于事件驱动的非阻塞框架,适合如下HTTP/TCP等服务器文件上传/下载这类IO密集型的高并发场景。像这种非阻塞的框架,不只有vertx,还有很多。Netty:很多非阻塞框架都是基于Netty实现。Spring WebFlux:类似于Vertx,并且也是基于Netty,与Spring框架强耦合。Play Framework:轻量级的反应式 Web 框架,适合高并发 Web 应用。Akka:基于 Actor 模型的高并发框架,适合分布式系统和容错系统。超重量级。

meethigher的博客 1693

宇瞳杯安防镜头设计

宇瞳杯安防镜头设计

weixin_72050316的博客 1516

Vert.x入门1 —— 《基础概念》

一、什么是Vertx Vert.x 在JVM上构建响应式应用程序的工具包,Vert.x不是框架而是工具包。Vert.x基于Netty项目,该项目是JVM的高性能异步网络库。 此描述中有三个重要点:工具包,响应式和“在JVM上”。 首先,Vert.x是一个工具包。这意味着Vert.x既不是应用程序服务器,也不是容器也不是框架。它也不是JavaScript库。Vert.x是一个普通的旧jar文件,因此Vert.x应用程序是使用此jar 文件的应用程序。Vert.x没有定义打包模型,所有Vert.x 组件都是无聊

ding_wl 2073

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Vert.x - SpringBoot 整合 vertx

一、vertx 前面的文章讲解了 vertx 的简介及 vertx-web 的路由,看过的小伙伴应该对 vertx 有了一定的了解,从前面的演示来看,都是单独使用的 vertx ,对于目前的后端来说 SpringBoot 可是一个非常火热的框架,那如果将 vertx 嵌入 SpringBoot 中不是符合我们的开发习惯了。对于 SpringBoot 来说引入 vertx 就是引入一个普通的组件,并没有什么特别之处。 但是有一个非常坑的地方,就是 vertx 4.1.x 版本和SpringBoot 2.

小毕超博客 8427

SAP B1中文培訓教材_SDK

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

Vertx入门简介

前言 VertX这项技术其实有年头了。笔者本人是非常看好它,当前笔者是一位Java程序员,因为国内基本都是Spring生态。以至于大部分人,没有Spring Boot就不会开发了。这里不是说Spring Boot有什么问题,只是觉得不应该被Spring禁锢我们程序员得思维。 下面带大家来了解VertX。进入之前,请忘记Spring。忘记了Spring你就学会了VertX 注:Vert.X不是替代Spring。它也有它的缺点。具体的利弊自己权衡。如果觉得写的不错,点个赞吧~ 举例 Vert.X和Spring的

铁蛋的博客 1万+

深度学习工具包 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")

Vert.x 响应式 Web 框架介绍使用

一、Vert.x Vert.x 是JVM上构建 响应式 应用的工具。 响应式应用既可以随着工作负载的增长而 扩展 ,又可以在出现故障时 弹性回复 。 响应式应用是 即时响应 的,因为它能有效利用系统资源并保护自身免受错误影响,从而使延迟可控。Vert.x 背靠庞大的响应式模块生态系统,具有编写现代服务所需的一切:全面的Web技术栈,响应式数据库驱动程序、消息队列、事件流、集群支持、指标监控、分布式跟踪等等。 Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储

小毕超博客 6575

响应式编程:Vert.x官网学习

先了解 Vert.x 是什么,官网首页介绍文字可以看出 Vert.x 是由 Eclipse 开发的一个在 JVM 上 Reactive(响应式) 应用程序。Reactive(响应式)编程是什么?响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。例如在命令式编程设置中,a = b + c 意味着在计算表达式时 a 被分配为 b + c 的结果,之后 b 和 c 的值进行修改也不会影响 a 值。

Wayn111的博客 502

Vert.x web模块(八) 一个真实案例

到目前为止,您已经学习了如何使用Oauth2处理程序,但是您会注意到,对于每个请求,您都需要进行身份验证。这是因为处理程序没有状态,并且在示例中没有应用状态管理。尽管对于面向API的端点建议没有状态,例如,对于面向用户的端点使用JWT(我们稍后将介绍这些),我们可以将身份验证结果存储在会话中。Oauth2与JWT混用一个提供者使用jwt tokens作为访问token,在想混合基于客户端认证和API认证,这是符合RFC6740标准且十分有用的。

JflyDragon的博客 738

java之Vertx.web开发

Vertx开发web server

hyly_zhard的博客 1234

Vertx搭建Web服务器

Vertx搭建Web服务器

tjzc1352640的博客 2944

Vertx简介

今天看了一篇很不错的关于Vertx的简介,转载下。         原文链接:http://www.csdn.net/article/2015-12-21/2826533?utm_source=tuicool&utm_medium=referral           Vert.x的由来 Vert.x诞生于2011年,当时叫node.x,不过后来因为某些原因改名位Vert.

chen3749102的专栏 1万+

第一章: Vert.x 异步编程的基础知识

本书这部分的章节将通过使用Vert.x工具包教你异步编程的基本概念。使用Vert.x思考异步操作绝对是可行的(而且很有趣!),我们将探讨Vert.x应用程序的主要构建块。

白石的专栏 4347

vert.x详细介绍,全异步框架

Vert.x是一个基于JVM、轻量级、高性能的应用平台,非常适用于最新的移动端后台、互联网、企业应用架构。Vert.x基于全异步Java服务器Netty,并扩展出了很多有用的特性 github:  https://github.com/vert-x3 介绍: Vert.x诞生于2011年,当时叫node.x,不过后来因为某些原因改名位Vert.x。经过三年多的发展,现在已经到了3.2

远方的行者 4万+

Vert.x ——概述

Vert.x是什么 Vert.x(http://vertx.io/)是一个基于JVM、轻量级、高性能的应用平台,非常适用于最新的移动端后台、互联网、企业应用架构。 Vert.x框架基于事件和异步,依托于全异步Java服务器Netty,并扩展了很多其他特性,以其轻量、高性能、支持多语言开发而备受开发者青睐。 官网是这么说的,Vert.x is a tool-kit for building

新之助的学习之路 5983

vertx框架编程思想

vertx框架编程思想vert.x编程简介:初始化一个vertx实例, 使用一个启动verticle部署多个verticle,每个verticle都有自己的使命,它们公用一个vertx实例, vertx是基于事件驱动,verticle部署时指定接受通知后的下一步操作, 它们之间通过eventbus通信,通过eventbus消息总线异步通知每个verticle进行消息处理; vert.x为ve

sdmjhca的专栏 2097
上一篇: Vert.x Java开发指南——第六章 与第三方的Web服务集成
下一篇: Vert.x Java开发指南——第八章 安全和访问控制
边城白衣
博客等级 码龄14年 106粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值