就像开发一样, 这篇文档如果没有人关心和维护, 里面的内容就会变得老旧, 过时而不再具有参考价值. 所以, 我希望所有看到并喜欢这篇文档的人都一起来维护它. 放心大胆的提交 Pull Request 和 Issue 吧!!
广告日志与标签数据均落在Hive表,并且ES官方提供与Hive的集成。因此,我们首选用Hive向ES写数据。首先,采用ES做数据存储,创建表如下:
add jar /path/elasticsearch-hadoop-2.3.1.jar;
create external table ad_tag (
dvc string
,medias array<string>
,c1_arr array<string>
,week_time string
)
stored by 'org.elasticsearch.hadoop.hive.EsStorageHandler'
tblproperties(
'es.nodes' = '<ip>:9200'
,'es.resource' = 'ad-{week_time}/tag'
,'es.mapping.exclude' = 'week_time');
在设计Hive表结构时,ES的计算UV的distinct count(cardinality
)存在着计算误差;因此,我们按dvc对其他字段做了聚合,UV的计算转换成了ES doc命中数。其中,es.nodes
表示ES的节点,只需配置一个节点即可;es.resource
对应于ES的Index/Type;es.mapping.exclude
在写ES时不会被索引的字段。因我们只有写操作而没有通过Hive查询ES数据,因此并没有设置es.query
。Hive向ES写数据如下:
1.配置
@Bean
public ResourceBundleMessageSource messageSource(){
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("msg");
source.setDefaultEncoding("UTF-8");
source.setFallbackToSystemLocale(false);
return source;
}
这里没有指定localeResolver, 默认会使用AcceptHeaderLocaleResolver,也就是说从request的header中获取Accept-Language
来解析语言。
ResourceBundleMessageSource是多语言翻译的逻辑处理。source.setBasenames("msg")
绑定一个多语言的集合。这里我创建一个叫做msg的集合:
.
2.创建多语言方法
在main下右键创建一个文件夹i18n,然后将其设置为resources类型。在gradle中,可以在build.gradle里添加:
sourceSets {
main {
resources {
srcDir 'src/main/i18n'
}
}
}
然后-New-Resource Bundle. 起一个集合的名字,比如msg, 添加需要的语言包。
在里面添加内容 http://www.cnblogs.com/emldc/
#msg.properties
user.name=default for en_US, I'm {0}
user.age='18'
#msg_en_US.properties
user.name=test, the user's name is {0}.
#msg_fr_FR.properties
user.name=This is french, I'm {0}
#msg_zh_CN.properties
user.name=测试 ,用户名是 '{0}'
3.编写一个controller测试
@Autowired
private MessageSource messageSource;
@ResponseBody
@RequestMapping(value = "/i18n/{name}", method = RequestMethod.GET)
public Map resource(Locale locale,
@PathVariable("name") String name){
Map map = new HashMap();
String[] arr = {name};
String message = messageSource.getMessage("user.name", arr, locale);
String age = messageSource.getMessage("user.age", null, locale);
map.put("username", message);
map.put("age", age);
return map;
}
- java中通过MessageSource来获取配置语言包中内容 http://www.cnblogs.com/ltvnrtj/
-
进行打印
<script language="javascript"> function Print(){ $("#setFormLayout").jqprint(); } </script>
只需要指定打印内容的DIV,我上面表单是包含在ID为setFormLayout、
属性相关
$("#printContainer").jqprint({ debug: false, //如果是true则可以显示iframe查看效果(iframe默认高和宽都很小,可以再源码中调大),默认是false importCSS: true, //true表示引进原来的页面的css,默认是true。(如果是true,先会找$("link[media=print]"),若没有会去找$("link")中的css文件) printContainer: true, //表示如果原来选择的对象必须被纳入打印(注意:设置为false可能会打破你的CSS规则)。 operaSupport: true//表示如果插件也必须支持歌opera浏览器,在这种情况下,它提供了建立一个临时的打印选项卡。默认是true });
从图中我们可以知道
1、一个完整的JS事件流是从window开始,最后回到window的一个过程
2、事件流被分为三个阶段(1~5)捕获过程、(5~6)目标过程、(6~10)冒泡过程
3、在冒泡过程中6比7早触发,也就解释了上面那题,为什么btn1,会比content先触发
然而在有些情况下JS的事件流不会根据上图这个从捕获过程到目标过程到冒泡过程这样去推进的,
DOM Level 捕获事件 冒泡事件 DOM Level 0 不支持 支持 DOM Level 2 支持 支持 DOM Level 3 支持 支持 从表中我们可以知道在DOM Level 0事件的时候是不支持捕获事件的,那么什么是Level 0呢
四、what is DOM Level这一章,我们就来探讨什么是DOM Level,先从DOM Level 0说起,以上面的例子为例,JS部分可以这样改写为:
-
params:字符串或者对象,将使用paramserializer序列化并且作为GET请求的参数。
data:字符串或者对象,作为请求信息数据的数据。 http://www.cnblogs.com/wnvkurt/
headers:对象,字符串或者函数返回表示发送到服务器的HTTP请求头。如果函数的返回值为空,则headers则不发送。函数接受一个配置对象作为参数。
xsrfHeaderName:字符串,填充XSRF令牌的HTTP请求头名称。xsrfCookieName:字符串,含有XSRF令牌cookie的名字。 http://www.cnblogs.com/nerjhw/
transformRequest:函数/函数的数组。转换函数或者一个包含转换函数的数组。转换函数获取http请求体和请求头,并且返回他们的转换版(通常是序列化)。
transformResponse:函数/函数的数组。转换函数或者一个包含转换函数的数组。转换函数获取http响应体和响应头,并且返回他们的转换版(通常是序列化)。
paramSerializer:字符串或者返回字符串的函数。用于编写请求参数(指定为对象)的字符串表示形式的函数。如果指令是字符串,那么将被解释为通过$injector注册的函数,这意味着你能通过注册服务方式创建你自己的序列化程序。默认的序列化是$httpParamSerializer;或者你可以使用$httpParamSerializerJQLike。
-
一般将一个矩阵中的m*n个元素,简称元,数a(ij)的位于矩阵A的第i行,第j列。这个数就被叫做这个矩阵A的(i,j)元。各种的记法就不说了。都是一个东西。明白元。就好。之后就是矩阵是怎么来的。 http://www.cnblogs.com/jvmew/
其实矩阵一开始是用来表示线性方程组。就像上面讲的一样。给一个图式可能就会明白很多。
就是这样,在求解线性方程和快速优化DP方程组的时候都特别有用。矩阵快速幂--就是很强大。
3,矩阵的基本运算。
这个相比于矩阵乘法就很简单了,简单明了, http://www.cnblogs.com/ymwxyt/ 矩阵 这个*讲的很详细,我就简单讲讲。
1)加减法,矩阵做加法的时候,得满足两个矩阵都是m*n的范围。所以。每一位对应相加就好了。