字节码增强技术-Byte Buddy为什么需要在运行时生成代码?Java 是一个强类型语言系统,要求变量和对象都有一个确定的类型,不兼容类型赋值都会造成转换异常,通常情况下这种错误都会被编译器检查出来,如此严格的类型在大多数情况下是比较令人满意的,这对构建具有非常强可读性和稳定性的应用有很大的帮助,这也是 Java 能在企业编程中的普及的一个原因之一。然而,因为起强类型的检查,限制了其他领域语言应用范围。比如在编写一个框架是,通常我们并不知道应用程序定义的类型,因为当这个库被编译时,我们还不知道这些类型,为了能在这种情况下能调用或者访问应用程序的方法或者变量,Java 类库提供了一套反射 API。使用这套反射 API,我们就可以反省为知类型,进而调用方法或者访问属性。但是,Java 反射有如下缺点:
需要执行一个相当昂贵的方法查找来获取描述特定方法的对象,因此,相比硬编码的方法调用,使用 反射 API 非常慢。
反射 API 能绕过类型安全检查,可能会因为使用不当照成意想不到的问题,这样就错失了 Java 编程语言的一大特性。
简介正如官网说的:Byte Buddy 是一个代码生成 ...
简介Antlr4 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。基本上是当前 Java 语言中使用最为广泛的语法生成器工具。Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询;Hadoop生态系统中的Hive、Pig、数据仓库和分析系统所使用的语言都用到了ANTLR;Lex Machina将ANTLR用于分析法律文本;Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR;NetBeans公司的IDE使用ANTLR来解析C++;Hibernate对象-关系映射框架(ORM)使用ANTLR来处理HQL语言。参考2
Antlr4 提供了大量的官方 grammar 示例,包含了各种常见语言,非常全面,提供了非常全面的学习教材。
本文简单介绍一个示例,实现一个简单的计算器功能,这个例子在很多资料中都作为第一个示例,可以算是 Antlr4 的 HelloWorld。
基本概念语法分析器(parser)是用来识别语言的程序,本身包含两个部分:词法分析器(lexer)和语法分析器(parser)。词法分析阶段主要解决的关键词以及各种标 ...
值得学习的C语言开源项目- 1. WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。
下载链接:http://home.tiscali.cz/~cz210552/webbench.html
- 2. Tinyhttpdtinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。
下载链接:http://sourceforge.net/projects/tinyhttpd/
- 3. cJSONcJSON是C语言中的一个JSON编解码器,非常轻量级,C文件只有500多行,速度也非常理想。
cJSON也存在几个弱点,虽然功能不是非常强大,但cJSON的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简 ...
概念什么是HiveHive是基于Apache Hadoop的数据仓库基础架构。Hadoop为商品硬件上的数据存储和处理提供了大规模的横向扩展和容错功能。
Hive旨在简化数据汇总,临时查询和分析大量数据的过程。它提供了SQL,使用户可以轻松地进行即席查询,摘要和数据分析。同时,Hive的SQL为用户提供了多个位置,以集成他们自己的功能以进行自定义分析,例如用户定义函数(UDF)。
Hive不是什么Hive不适用于在线交易处理。 最佳用于传统数据仓库任务。
入门有关设置Hive,HiveServer2和直线的详细信息,请参阅 GettingStarted指南。
有关Hive的书籍列出了一些可能对Hive入门也很有帮助的书籍。
在以下各节中,我们提供有关系统功能的教程。我们首先描述数据类型,表和分区的概念(与传统的关系型DBMS中的概念非常相似),然后借助一些示例来说明Hive的功能。
数据单位按粒度顺序-Hive数据组织为:
数据库:命名空间的作用是避免表,视图,分区,列等的命名冲突。数据库还可以用于对一个用户或一组用户强制实施安全性。
表格:具有相同架构的同类数据单元。一个表的 ...
一、什么情况下会触发fallback方法?名字描述触发fallbackEMIT值传递NOSUCCESS执行完成,没有错误NOFAILURE执行抛出异常YESTIMEOUT执行开始,但没有在允许的时间内完成YESBAD_REQUEST执行抛出HystrixBadRequestExceptionNOSHORT_CIRCUITED断路器打开,不尝试执行YESTHREAD_POOL_REJECTED线程池拒绝,不尝试执行YESSEMAPHORE_REJECTED信号量拒绝,不尝试执行YES
二、fallback方法在什么情况下会抛出异常名字描述抛异常FALLBACK_EMITFallback值传递NOFALLBACK_SUCCESSFallback执行完成,没有错误NOFALLBACK_FAILUREFallback执行抛出出错YESFALLBACK_REJECTEDFallback信号量拒绝,不尝试执行YESFALLBACK_MISSING没有Fallback实例YES
三、hystrix dashboard界面监控参数
四、配置信息(default或HystrixCommandKey ...
java
未读前言本篇讲述了RMI-JNDI注入的利用原理,分析了利用流程;使用了marshalsec反序列化工具去简单的起一个RMI/LDAP服务端对于导致JNDI注入的漏洞代码扩展至com.sun.rowset.JdbcRowSetImpl函数,为fastjson反序列化起一个引子,准备新起一文。分析了java版本变化对于JNDI注入的影响引出了1.8u191之后的版本该如何利用JNDI注入,准备新起一文。提到了LDAP-JNDI注入
JNDIJava命名和目录接口(JNDI)是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。其应用场景比如:动态加载数据库配置文件,从而保持数据库代码不变动等。代码格式如下:
String jndiName= ...;//指定需要查找name名称
Context context = new InitialContext();//初始化默认环境
DataSource ds = (DataSourse)context.lookup(jndiName);//查找该name的数据
这些对象可以存储在不同的命名或目录服务中 ...
java
未读Java中的Stream可以定义为来自源的一系列元素,这些元素支持对它们的聚合操作。这里的源是指向流提供数据的Collection或Array。
Stream保持数据在源中的顺序。该聚合操作或批量操作是操作这让我们很容易和清楚地表达对流元素共同操作。
在继续之前,了解Java 8 Streams的设计方式使得大多数流操作仅返回流是很重要的。这有助于我们创建流操作链。这称为管道内衬。在这篇文章中,我将多次使用该术语,因此请牢记。
1. Java流与集合我们所有人都已经在youtube或其他此类网站上观看了在线视频。当您开始观看视频时,文件的一小部分首先会加载到计算机中并开始播放。开始播放之前,无需下载完整的视频。这称为流式传输。我将尝试将此概念与集合相关联,并通过Streams进行区分。
在基本级别上,集合和流之间的差异与计算事物时有关。甲Collection是一个存储器内数据结构,它包含所有的数据结构目前有-每在Collection元件具有被计算之前它可以被添加到集合中的值。甲流是概念性地固定数据结构,其中的元件上计算需求。这带来了显着的编程优势。这样的想法是,用户将仅从Stream中 ...
“守护进程”(daemon)就是一直在后台运行的进程(daemon)。
本文介绍如何将一个 Web 应用,启动为守护进程。
一、问题的由来Web应用写好后,下一件事就是启动,让它一直在后台运行。
这并不容易。举例来说,下面是一个最简单的Node应用server.js,只有6行。
12345678var http = require('http');http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World');}).listen(5000);
你在命令行下启动它。
123$ node server.js
看上去一切正常,所有人都能快乐地访问 5000 端口了。但是,一旦你退出命令行窗口,这个应用就一起退出了,无法访问了。
怎么才能让它变成系统的守护进程(daemon),成为一种服务(service ...
nginx
未读最近了解下Nginx的Code状态码,在此简单总结下。
先来再回顾一下一个http请求处理流程:
一个普通的http请求处理流程,如上图所示: A -> client端发起请求给nginx B -> nginx处理后,将请求转发到uwsgi,并等待结果 C -> uwsgi处理完请求后,返回数据给nginx D -> nginx将处理结果返回给客户端 每个阶段都会有一个预设的超时时间,由于网络、机器负载、代码异常等等各种原因,如果某个阶段没有在预期的时间内正常返回,就会导致这次请求异常,进而产生不同的状态码。
1)504
504主要是针对B、C阶段。一般nginx配置中会有:
123456789location / { ... uwsgi_connect_timeout 6s; uwsgi_send_timeout 6s; uwsgi_read_timeout 10s; uwsgi_buffering on; uwsgi_buffers 80 16k; ...}
这个代表nginx与上游服务器(u ...
[本文翻译来自 官方OkHttp Wiki](https://github.com/square/okhttp/wiki)
一、CallsHTTP客户端的工作是接受你的request,并产生它的response。这个在理论上是简单的,但在实践中确是很棘手。
1.1 请求每一个HTTP请求中都包含一个URL,一个方法(如GET或POST),和一个请求头列表(headers)。请求还可以含有一个请求体(body):一个特定内容类型的数据流。
1.2 响应每一个HTTP响应中都包含一个状态码(如200代表成功,404代表未找到),一个响应头列表(headers)和一个可选的响应体(body)。
1.3重写请求当你的OkHttp发送一个HTTP请求,你在描述一个高层次的要求:“给我获取这个网址中的这些请求头。”对于正确性和效率,OkHttp发送前会重写你的请求。
OkHttp可以在原先的请求中添加请求头(headers),包括Content-Length, Transfer-Encoding, User-Agent, Host, Connection, 和 Content-Type。除非 ...
