2018-09-27-多表联合查询带计数

27 September 2018

场景为多个数据表关联,驱动表与其他表存在一对多的关系,需要查询的数据包含两个表的字段及每条驱动表的数据对应关联表多少条数据的计数。ORM使用的是MyBatis。由于count函数会把数据聚合只剩一条数据,单纯使用count不能解决问题(今天才知道T T)。 最终采用了如下的配置文件。

read more

2018-09-24-中秋加班

24 September 2018

今年中秋公司搞了个编程60小时的活动,实际上是在从周五晚上八点到周一早上八点这块时间内几名同事共同完成一个系统的demo的过程。在这个过程中,有一些感悟想要记录下来。 首先,由于在生产环境部署并且公司的网络限制很严,只能在发布后才能验证,除了前端页面,其他功能几乎无法调试。另外,开发和发布的地方分布在两幢楼,这给开发、验证、修改增加了很多难度。在这个过程中,有效的手段包括查看服务器日志,由于生产环境只有控制台的权限,也只能从网页上查看日志。生产环境采用集群部署,要查看服务器的日志要逐台服务器去查看日志,因为不知道服务被分配到了哪台服务器。这里优先考虑的操作应该为停掉其他服务器,只留一台服务器用于查看服务器日志。开发过程往往由于一些惰性心理,不愿意做出改变,还是希望可以按照正常流程,开发、打包、发包这样的流程走下去,不愿使用一些在流程外却有效的手段,仿佛有一些走出常规就会出事的恐惧感,这是自己的一种心理障碍吧。 另外,开发过程中,需要使用webservice、spring等技术,虽然对这些技术不陌生,以前时间充裕的时候也都编码过,却发现有些以前遇到的问题,只注重解决问题,没有记录下来,也没有明白其中的原理。再次遇到问题,解决的时间还是很长的。在密集开发的过程,一些小问题被放大了。 还有对于开发过程中,有向完美主义的倾向,有时会忽略掉任务的重点。这一点其实也挺拖慢进度的。还是练习太少了吧。对程序逻辑的设计还不够冷静,对业务的生疏加重了逻辑的混乱。写日志的方法应该更通用,但由于日志的字段很多,面对不熟悉的表结构设计,没有时间进一步全面了解,应该尽快先把功能开发出来,再确认关键字段。 以上。

read more

spring项目xml及static方法读取配置文件

18 September 2018

今天在项目中配置webservice,想要将webservice.xml中publish的地址公共部分配置到配置文件中。这个想法来源于MyBatis的配置文件可以通过配置属性来加载配置文件,并访问配置文件中的KV值。通过尝试,在借助spring的配置完成了这个功能。在web.xml中配置

read more

工作记录工具使用

18 September 2018

一直想要寻找一个很好的处理工作待办、总结、规划的工具,使用过trello、asana还有一些todolist软件,都没有坚持下来。近来Quip升级了,好奇想要看看,发现Quip的功能很适合我。 在Quip中:

read more

两种数据处理方式时间对比

17 September 2018

近来工作中遇到了一个数据加载的问题,情况是百万级的数据存储在数据库中,多张表且表之间有关联。现需要使用Java读取表中数据并作关联后生成XML文件。有两种方案备选,一种是将多张表的数据分别读取到内存中,在内存中做关联,第二种是使用left join的方式在SQL层面就查询出数据,通过myBatis的ORM直接映射成Java对象。因为不确定哪一种方式读取的更快,做了如下实验:

read more

新的开始

08 September 2018

博客写过好多次,没有坚持下来过。人生的际遇很难说清,随着年纪增长,越发感到人生时间有限,一晃竟已过去三十余载。这时更想要记录一些东西,因为知道会失去,所以至少留下一点存在过的痕迹吧。

read more

关于工作工具的一些思考

08 September 2018

家中渐渐积累了几件苹果的设备,Macbook air、iPad pro与iPhone。大部分时间都在使用iPhone,偶尔编程会使用Macbook air,偶尔看视频会使用iPad pro。 前段时间在反省记笔记的方法问题,发现看书时还是习惯用笔和纸记笔记,可是又想要用电子产品记笔记,总觉得用电子产品记笔记的效率高。这个问题后来想到了一个可以尝试的方案,思考的时候还是用笔和纸记录,然后用拍照的方式存档在电子设备中。 有了这样的需求,再想想家中吃灰的设备,想了一个分工的方案。鉴于Macbook air已购多年,运行比较缓慢,Macbook air就只做开发之用。iPad pro配上一个键盘,用作文档编辑、日常娱乐之用。在连接键盘的过程中,由于暂时家中没有蓝牙键盘,就找了使用macbook air键盘做iPad外接键盘的方案。几年前用过typeeto,这个软件印象中很好用,可以直接无缝使用macbook的键盘。但现在这个App收费蛮高的。不想使用破解版,所以又查找了其他方案。找到了AirType这个App。这个App是通过web access的方式,连接电脑的键盘和app的键盘。使用效果不如typeeto,但如果仅考虑快速输入文本的话可以满足要求。最好的话iPad pro编辑文本还是配个蓝牙键盘更方便。 有效的使用工具对工作是有帮助的。但重要的还是要勤奋一点啦。

read more

Shell学习积累

16 January 2018

#Shell脚本学习积累 date命令 可以使用date -d解析时间字符串,如date -d ‘20180116’,在此基础上可以加上格式参数输入一定格式的时间,如date -d ‘20180116’ +%Y-%m-%d,这条语句将输出2018-01-16。也可以增加+%s,输出时间对应的UNIX时间戳。 调用函数 调用写好的Shell函数,如result=test $1。result后的等号两边不能有空格。 比较两个字符串的相等。需要使用x“$1” = x句式,等号两边的空格是不可缺少的 函数的返回 在使用test $1这种形式调用函数时,得到的结果是test函数中echo命令后边的内容

read more

Web Cache学习

25 December 2017

Web Cache学习总结 Web Cache在客户端与服务器中间,对服务器响应的页面、文件、图片等进行缓存,再遇到客户端发来的同样的情况,根据情况返回缓存的数据,不需要再从服务器拉取数据。 Web Cache的作用 Web Cache的作用主要是: 减少页面响应延迟 减少网络开销,节省带宽 Web Cache的类型 浏览器缓存 浏览器划分一部分磁盘空间存储用户所见的展现信息。在用户点击后退按钮或者点击之前看过的页面的时候最有用。 代理缓存 代理为成百上千的用户提供服务。大型公司和ISPs经常在防火墙上安装,或作为独立的设备(通常也称为中间件)。 由于代理缓存既不属于客户端也不属于服务端,独立于网络外,请求需要以某种方式路由到它。一种方法时手动设置浏览器的代理;另一方式是使用Interception proxies存在于网络中,将请求重定向到代理上,这样客户端不需要配置代理,甚至不知道代理的存在。代理缓存是一个共享的缓存。在减少延时和网络开销方面能起到很好的作用。 网关缓存 反向代理缓存、替代缓存。网关缓存也是中间件。不是由网络管理员为了减少带宽而创建。而是由web管理者创建,使站点更易扩展、更可靠、提供性能更好的服务。 CDN(content delivery network)也属于网关缓存 Web Cache控制缓存的几个Http header expires(属于freshness) 需要设置一个绝对的GMT时间作为缓存过期的时间 cache-control(属于freshness) max-age 生存的秒数,由expires的绝对时间改为相对时间,更灵活 s-maxage于max-age类似,只对代理缓存起作用 public 标记响应可以被缓存,如果链接是有权限控制的,默认为私有的 private 允许缓存给单独的用户,比如浏览器缓存。共享缓存则不被支持 no-cache 在提供缓存版本前,强制缓存服务向后台发送确认信息 no-store 任何情况下都不存储副本 must-revalidate 告诉缓存必须遵守freshness信息 proxy-revalidate 类似must-revalidate,不同在于只适用于代理缓存 Last-Modified(属于validators) 可以使用这个字段向服务器询问,自从这个时间以后是否有所改变,请求头包含If-Modified-Since字段。 ETag(属于validators) HTTP1.1引入了一个新validator叫做ETag。Tags是服务器生成的唯一标识,每一次展现改变时随之改变。由于服务器控制ETag如何生成,缓存服务器可以通过带有If-None-Match请求来确认展现是否还是原来的。 几乎所有的缓存使用Last-Modified时间作为validators。ETag验证也正在变得流行。 使用Web Cache的几点建议 使用一致的URLs。 使用一个通用的图片库 使缓存存储不经常改变的图片和页面。使用Cache-Control:max-age,赋予一个较大的值。 使缓存能够识别定期更新的页面。设置合适的max-age或过期时间。 如果一个资源(尤其是下供下载的资源)改变了,改变它的名字。这样可以使它在很远的未来过期,仍然保证正确的版本在线。链接到它的额页面则需要一个短的过期时间。 不要改变不必要的文件。如果这样做,所有的东西将有一个错误的Last-Modified时间。 只在必要的时候使用cookies。cookies难于缓存,大多数情况下并不需要,如果必须使用cookie,限制它使用在动态页面上。 使用REDbot检查页面。

read more

React Native 使用ECharts库展示数据的一次尝试

31 October 2017

  ECharts是百度开源的一个图表库,图表类型全面且维护也比较及时。工作上需要在移动端以多种图表的形式展示业务数据,考虑到展示效果并参考其他公司的实现,决定使用ECharts作为图表库在移动端使用。   首先实现的是iOS版,实现这个功能需要使用React Native提供WebVIew组件引入ECharts页面。React Native iOS版的WebView组件是对原生UIWebView的一个封装。由于在以往的开发中,没有涉及很多React Native页面中通过WebView展示复杂页面的场景,这里考虑了几种方案,打算做一个比较。

read more

react native列表展示大量图片性能优化

26 July 2016

首先采用的是React Native自带的组件Image,每一张图片一个Image。发现在列表比较大时内存占用非常高。最后发现用WebView展示图片性能远高于Image,内存占用终于降到了可以接受的范围。在得到最终答案之前,尝试了手动优化。由于ListView中的组件不会被回收,随着列表增大,内存占用随之线性增大。从这方面着手,将不再画面中显示的Image去掉,换成View站位,降低Image组件带来的大的内存消耗。在向上滚动时不断将上面的Image去掉,在向下滚动时,需要将原有的Image设置回来。图片加载和去掉的时机都是ListView中的ScrollView的OnScroll方法控制,通过计算滚动的高度和列表的整体高度,在列表滚至将近底部或顶部时,对列表进行处理和渲染。期间遇到的问题及解决: 列表快速滚动。快速滚动时可能会多次触发图片的渲染,违背了增量加载图片的初衷,带来渲染的性能降低。解决方法:在第一次触发后,增加标志位,仅当这一次增量加载的数据渲染完后,才可以进行下一次渲染。判断是否加载完毕,是通过OnScroll获取到的ScrollView中的列表高度判断的,增加图片及去掉图片的渲染,这个值都会改变。改变后也说明这次列表已经渲染完毕。 ListView刷新。由于ListView中的数据是对数据的引用,如果数据引用的值不变,列表不会刷新。这里还是采用了性能比较低的深拷贝。将需要刷新的项进行深拷贝,触发列表刷新。

read more

Java工程打成jar包在命令行执行运行缓慢问题解决

10 October 2014

一个普通的java工程,用cxf连接webserivice。在eclipse下运行正常,但用eclipse达成jar包,在命令行执行却异常缓慢。

read more

冬夜

02 November 2013

就要入冬了,由于最近感冒总会感到很冷,姑且认为我的冬天已经到来了吧。买了东西从超市冒出来,外面已是各种灯光闪耀了,夜幕降临,雾气弥漫,人们匆忙赶路,不似白天那么悠闲。这让我感到多了些安全感,仿佛可以钻入黑夜,躲避陌生人有意无意的目光。

read more

KVM虚拟机的克隆

17 April 2013

为了做毕设,搭建了Hadoop的集群。因为实验室的机器有限,而且做实验的同学多,实验室采用了在实体机器上安装kvm虚拟机的方式搭建集群。本来的集群有4台机器。实验需要扩展集群。想到了kvm管理中有克隆和迁移的功能。但不清楚具体操作带来的后果。经询问后,记录如下: KVM的克隆是个比较复杂的过程。它是只读的克隆。即在虚拟机A克隆出虚拟机B的过程中,虚拟机B最初的镜像只是一个很小的文件,里面存储了原本A的镜像中的一些映射,当虚拟机B被访问的时候,会根据镜像中的映射向原有的A的镜像拷贝具体的文件过来。这时A的原有镜像是只读的,因为一旦改变,则B中的映射就会失效。在更具体的实现过程中,会产生第三个文件C。用于保持虚拟机A和B都能正常的运行。克隆那一时刻的原有镜像为只读,但虚拟机A和虚拟机B分别在不同的镜像中工作,互不影响。

read more

hadoop集群配置问题及思考

07 April 2013

遇到的问题如下: 网上的帖子一般比较重步骤,每一步都很详细,但没有说明为什么,读者容易因为不知道为什么,而忽视一些问题,安装出错也不知道如何解决。所以写上一些为什么还是必要的。 1.SSH问题 1)集群配置中需要配置Master和Slave间的ssh无密码访问。需要的是master能够无密码访问slave中的每台机器,slave也能无密码访问master。Slave间不需要无密码访问彼此。这是因为hadoop的中心管理机制,master需要向slave传送管理、控制信息,slave需要向master汇报节点的情况等。这期间需要无密码访问,而slave间没有直接的通信。 2)相同用户名和机器名的问题。如果集群中机器的用户名和机器名都相同会造成SSH无密码访问的失败。SSH无密码访问的机制,大概的说是目标机器将公钥传给主机,主机存在文件中,当主机想要访问目标机器时,直接从文件中读取密码,不需要再手动输入。而一台机器可能保存多台机器的公钥,这就需要key来查找。在安装时发现公钥中用“用户名@机器名”的字样。发现如果用户名和机器名完全相同会造成密码查找失败。说明key值可能和用户名和机器名有关。这时需要修改机器名,因为相同的用户名能够简化配置。 3)别名。可以修改/etc/hosts文件,将集群中的机器的ip与一个别名相对应,这样配置时只需记住别名,不需要记住ip。 4)相同用户名。很多安装步骤中都说要创建一个单独的用于hadoop的用户名。相同的用户名可以使配置简单。master和slaves的配置只需要配置ip,不需要再使用用户名@ip的形式。并且ssh时也不再需要用户名@ip的形式,直接ssh <ip>即可。。 5)修改/etc/hosts。修改/etc/hosts会造成ssh无密码访问失效。重启可能能够解决问题。我是重新配置了无密码访问。重启是否起作用下次再试。 2.配置文件问题 必须要配置的几个xml中,<>标签中配置的东西尽量不要有空格。配置地址和端口的地方,地址是已hdfs://开头。

read more

但我相信那旋律是真的

02 November 2012

前几天看微博无意间看到一句台词,出自《八月迷情》,说的是:世人不时地践踏你的梦想,但我相信那旋律是真的,就像有些人相信童话是真的。其实我很容易怀疑,出于时常冒出来的不安全感,从而对很多事首先建立起来的是不相信的感受。也许因为如此,而在看到这句话时有一些久违的感动吧。

read more

ubuntu 挂载虚拟机镜像

23 June 2012

1.losetup /dev/loop10 /…..img (通过losetup -f查看目录名,替代loop10) 2.kpartx -a /dev/loop10 2.mount /dev/mapper/loop10p /mnt/(p为mapper目录下的文件名,替换为具体的文件名)

read more