- 博客(73)
- 资源 (7)
- 收藏
- 关注
原创 软件工程师中中:解除35岁程序员的忧虑
2019年我也33了,离传说中不好找工作的35岁又更近了。说没有焦虑是对自己撒谎,于是我采访了一些人,自己思考了下,写下了这篇文章。先看看大家的态度:色老力衰,不好忽悠,不能带头加班老油条,学不动,加班就是磨洋工关键还是贡献的价值。能不能给业务带来价值找背书基本逻辑就是,比你这个难得多的哥们都搞定了,你这点小事根本不再话下去bat镀镀金,捷径看看你的上...
2019-02-01 14:35:37
4739
原创 用PostMan学习上传图片
一、上传时同时带上文件与其它参数 public JsonResult<void> submitBook(HttpServletRequest req,@RequestParam("picFile") MultipartFile file,Long bookBaseId,String isbn,String name,String author,String publishCo...
2019-01-25 10:44:03
2803
原创 关于'都要'需求的几种实现思路
"对这些操作,我们都要记录日志。"这是服务器软件的常见需求。一、拦截器如果需求的范围可以定位到我们的某些类或方法 ,这种思路比较合适。不同的环境又有不同的实现方法 ,在web应用中可以用Filter,拦截器(spring mvc、struts)。在数据库层像github.pagehelper就是用的org.apache.ibatis.plugin.Intercepts来拦截query方法 来实现分...
2018-05-16 20:18:10
387
原创 Spring的标注Autowired的required参数与自动注入关系是怎样的?
在回答标题问题前,我们先看一下什么时候才会用到required这个参数,如下图:可以看到,就是DefaultListableBeanFactory.getBean方法去调用的,这个方法的作用是实例化对象。在org.springframework.beans.factory.support.doGetBean可以看到这个过程,如下图:创建对象就要去加载关联的对象,而关联的对象有可
2018-02-07 11:00:03
981
原创 spring如何扫描有注释的类
1.加载xml,初始化上下文,以ClassPathXmlApplicationContext为例一般我们给它的构造方法转入1到多个配置文件,来初始化,如:new ClassPathXmlApplicationContext("/spring-context-ioc.xml")new ClassPathXmlApplicationContext(new String[]{"/
2018-01-09 20:23:17
2313
原创 如何用动态字段实现系统的扩展性?
设计系统架构时,我们总是希望一个架构或者说是模型能支持多种业务场景,当然场景是系统范围内的。比如说做商品系统,商品有多种属性,不同类型的商品的属性不一样,怎么用关系型数据库去保存这些不同的属性呢?再比如做CMS时,除了基本的背景、位置、类型、状态等属性一致外,页面不同地方需要的数据结构却是不一样的。 再比如做广告时,不同地方的广告需要用不同属性去区别,而它们又有一些共有的属性,比如类型,名称。
2018-01-05 19:07:31
9796
3
原创 mybatis怎么打印出sql,我被误导了很多年
关于mybatis怎么打印出sql这个问题,可以百度一下,很多答案都有类似这样的答案:就是把java.sql.*,com.ibatis等的日志级别都配置成debug的,也许这么配置与默认的info配置相比真的有效果,把sql打印出来了。可是我今天才发现,打印sql与这些java.sql,com.ibatis包半毛钱关系都没有。至少我调试的mybatis-3.3.0.jar就是这样的
2017-12-28 20:49:19
27840
3
原创 不要欺负我不懂java的volatile
在《java并发编程实战》(Brian Geoetz等著童云兰译)这本书里有对volatile的说明,Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会缓存在寄存器或者对其他处理器不可见的地方,
2017-12-19 19:50:59
329
原创 lucene5.3.1的排序是怎么实现的?
排序有两种方式,在只有一个排序字段的情况下,分别看下这两种方式的实现方式。1.在索引阶段生成排序索引(dvm,dvd):在添加正常的字段后再添加一个该字段的SortedDocValuesField到document,即可按这个字段排序。SortedDocValuesField pathField = new SortedDocValuesField("path", new
2017-12-15 18:39:50
844
原创 智能小车49:atmel328p的pwm调速试验
智能小车的变速怎么实现?arduino uno的芯片atmel328p的引脚可以配置pwm功能。简单来说,这个功能就能调整电流的大小,这样就能控制电机的变速,led不同频率的闪烁。先看下arduino uno的pwm引脚,如下图有六个引脚标有“~”,表示它们可以配置pwm。为什么是3、5、6、9、10、11这6个?先在印制板图里找到这6个引脚的名称分别为:IO3,IO5,IO6,IO9,S
2017-12-13 15:22:05
1065
原创 lucene查询索引的6个步骤
先准备数据源,以两个文件名字符串做为值,保存两个document,如下图:然后以"path:txt"为查询条件,来查询索引文件。我调试发现会有6个步骤。数据主要来源于3个文件,tim、doc、fdt。1.先根据查询字段与词找出该字段所有的term(.tim文件中的terms)2.加载tim文件(seekExact方法中currentFrame.loadBlock
2017-12-04 18:31:07
815
1
原创 HashMap的面试题你能回答几个?
1.HashMap用什么数据结构实现的?答:数组。什么样的数组?答:Node[] table这样的。Node是什么?答:看下图:也就是说这个数组每个元素都是个单向链表。2.HashMap的get过程是?答:先得到key的hash值,再把这个hash值与length-1按位与(取余),得到table数组的下标。取出这个下标值的key,与传入的key比较,如
2017-11-28 09:14:32
8650
4
原创 搜索系统19:lucene索引的五个关键知识点
1.文件锁是怎么实现的?org.apache.lucene.store.NativeFSLockFactory这个write.lock一直为0字节。那它有什么用,怎么判断这个Lock文件就是lucene里定义的锁?如下,判断文件的创建时间是否与之前创建时的时间一致:代码:org.apache.lucene.store.NativeFSLockFactory.Nati
2017-11-21 14:23:08
327
原创 搜索系统18:lucene索引文件结构
1.多文件索引与复合索引的区别2.segments(段)文件3.段元数据.si 保存了索引段的元数据信息4.fnm(域名)文件相当于solr里的schemal.xml文件5.项词典(.TIS、TII)文件lucene老版本的项词典是tis文件,新版本是tim文件,如图:我没在这个文件里找到字段名,可能已经转成了数值。《lu
2017-11-16 13:40:01
1332
原创 智能小车48:不用volatile,编译器会优化什么?
有网友评论了我前面的中断实验的c代码,说全局变量需加上volatile关键字。平时写Java程序也没有用到这个,只知道这个用于多线程,但也不能完全解决多线程并发修改共享变量的问题。这几天我都在思考这个问题,向干了多年嵌入式开发的同学请教,还问了下韦东山老师,然后下文就是我的这个问题的理解。测试两种情况 ,分别给全局变量INTNUM加上volatile和不加volatile,然后在AtmelSt
2017-11-14 11:17:51
520
原创 搜索系统17:HttpClient的网络连接是否被复用了
上文查看是否复用连接的方法有误,当时方法是把route(ip与端口等)传给连接池,相同的请求第二次就能返回相同的对象。这是没错,但相同的对象并不代表复用了Socket(连接)。因为这个对象是org.apache.http.pool.RouteSpecificPool。为了搞明白它与连接的关系,是否复用了连接,还需深入分析下。先查看一下它的结构:一、从Socket到CPoolEntr
2017-11-11 16:29:00
1493
原创 智能小车46:最小系统Atmega328p的中断实验
我居然没有找到Atmega328p的中文资料,这让我做每个实验都要自己去查下英文资料,比较麻烦。这里再多费话一句,为什么我要用Atmega328p做实验,因为这是arduino uno的mcu,代码可以直接移植到arduino上去。在做了arduino实验后,再看看Atmega328p数据手册、avr单片机、电路原理图,可以从底层深刻理解程序。真希望有更多的同学一起来追问和回答这些底层技术问题。好
2017-11-10 20:40:11
4668
2
原创 搜索系统16:从HttpClient学习连接池
一.HttpClient请求的一般过程1.拿连接2.与服务器建立连接(new Socket)3.从服务获取结果4.keepAlive的判断在代码org.apache.http.impl.execchain.MainClientExec里请求结束后(requestExecutor.execute),用策略模式来判断是否keepAliveif (reus
2017-11-08 18:19:46
239
原创 搜索系统15:tomcat如何使用NIO处理网络请求
搜索也需要web服务器,要搜得快,web服务器的性能很重要。本文简要介绍下tomcat的启动与请求处理,以便以后调优使用。我的java基础知识很久没更新了,我对连接池的认识还停留在ServerSocket阶段,以为tomcat还是用的这个呢。一看源码,学到了不少新知识,文中源码来自于tomcat-embed-core8.5.5。一、tomcat启动NIO服务流程1.主线程实例化Http
2017-11-07 15:01:42
296
原创 智能小车45:最小系统(Atmega328p)怎么存数据?
最小系统(Atemga328p芯片)其实是可以存储数据的,在说存数据前先了解下这个芯片有哪些存储器。1.Flash(32K Bytes)就是我们的程序存放的地方,这个最大,但和我们电脑的硬盘有点区别就是程序运行时不可写,只能编程时一次烧录进去。Flash中包含了boot loader,这个后面再学。2.SRAM(2K Bytes)和电脑的内存差不多。不过这个
2017-11-05 13:18:01
2261
原创 搜索系统14:HttpClient怎么有两个超时参数,都该怎么配?
在Java的网络应用中,apache的HttpClient用的很多,比如Solrj中就用的是这个来给服务器发请求。其中有两个超时参数可配置,一个是HttpClientUtil.setConnectionTimeout,另一个是HttpClientUtil.setSoTimeout。通过debug代码发现在类org.apache.http.conn.scheme.PlainSocketFactory
2017-11-03 18:04:28
268
原创 搜索系统13:一个查询从solr到lucene都干了些什么事?
用了solr一段时间后,我想了解下solr是如何包装lucene。因为使用过程中几乎没有遇到直接操作lucene代码的情况,这让我有些迷糊。今天来看看一个solr查询的执行过程,经过debug发现了以下堆栈。再看堆栈顶的方法里的lucene工具类:哈,这就是lucene类了。这个时候就可能产生很多疑问了,solr不是分core/collection么,这里怎么没有体现?so
2017-11-01 18:27:53
185
原创 智能小车44:最小系统其实很简单
今天最终于搭了一个最小系统。敢说最小,因为只需要1个芯片。为了展示烧录程序的效果,加了个电阻和LED灯。但灯闪得太慢,不是程序里写的500毫秒,所以我再加个16m晶振和电阻,提供准确时钟。注意这个电阻为1M,且与晶振要并联。上图:嗯,这个连线有点多,主要是因为ICSP接口需要6条线连接Atmega328p这个芯片。ICSP的接线方式还是要介绍下的,不然程序烧不进芯片。ICSP编程器的6
2017-10-31 08:49:48
660
原创 搜索系统12:从solrj学习负载均衡的实现
我下面分析的solrj的版本是5.3.1,先看一下它的请求处理过程。我们重点分析下这个LBHttpSolrClient.request方法,这个版本中有两个request方法,我这只分析request(final SolrRequest request, String collection)这个方法,通过这个就能看出原理了。先看源码的注释,了解下这个方法的处理过程。Trie
2017-10-30 12:03:54
282
原创 智能小车43:avr溶丝位晶振的设置
我们用AtmelStudio来开发了avr点亮一盏Led的实验,实验中是把程序烧进了arduino uno板,没有什么问题。 这两天我准备用arduino uno的mcu(ATmega328P)来搭建一个最小系统的硬件环境,由于知识储备还不够,不敢从头搭建。我选择了从某宝上买了个HiAvr的板子,这个有原理图,可以拿来学习。下图就是我焊接好的样子。这次还是用《智能小车41:用Atm
2017-10-29 13:05:39
504
原创 智能小车42:openwrt的系统配置与gpio操作
一、openwrt的系统配置openwrt也是基于Linux,因此它与大多数Linux系统一样都有以下配置文件:1./etc/rc.local 该文件是一个shell脚本,是在系统开机之后最后会调用到的脚本。也就是说,当有任何想要开机自启动的程序都可放在这里。2./etc/profile为每个登录用户设置的环境变量 。其中第一句是cat /etc/banner,这个文件内容就是
2017-10-26 08:14:48
1117
原创 智能小车41:用Atmel Studio7开发Arduino uno程序
以前有一篇是用Atmel Studio做arduino汇编程序的,相当于hello world。最近学习avr单片机,发现这个Atmel studio实在比Arduino IDE强大太多了。做为一名专业的程序员,用arduion ide也显得比较业余,毕竟arduino ide的代码不是纯粹的C语言,是经过包装后的高级语言。新建项目,选择atmel studio菜单File->New->Pro
2017-10-24 17:35:04
1554
1
原创 智能小车39:十分钟做个游戏收割机
一、软件准备1.下载arduino idehttps://www.arduino.cc/en/Main/Software?setlang=cn现在最新的是1.8.4 有了代码格式化等新功能,好用了些。可选的板子少了些,以前玩的wemos板子就没法选了。2.编写arduino代码,如下:#include Servo myservo;int pos=0;//信号
2017-10-20 09:07:02
382
原创 智能小车38:晶振原理与串口的使用
一、振荡器的电气原理能够产生振荡电流的电路叫做振荡电路。一般由电阻、电感、电容等元件和电子器件所组成。由电感线圈l和电容器c相连而成的lc电路是最简单的一种振荡电路,其固有频率为f=[sx(]1[]2πlc。 如下图:图里的的电容充放电时间决定了振荡器的频率,这个频率就就是我们电器里的时钟。晶振就是石英材质的振荡器。上面只是原理图,而实际的电路原理图如下:从原理图里可以看出
2017-10-17 10:44:38
613
原创 智能小车37:异常在ARM、JAVA、硬件里的实现
几乎所有编程语言都有异常,可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题,下面给大家分享一下。一、Arm的中断。1.触发异常2.保存现场3.cpu进入异常工作模式,程序指针(pc)跳入异常入口(处理异常的代码地址)a.分辨中断源b.进行逻辑处理c.清理工作4.恢复现场流程图(来源于《2440数据手册》)如下
2017-10-12 21:57:25
477
原创 搜索系统11:协同过滤的数据源和遗留问题
前一文中已经对推荐算法做了个简单的介绍,最常用的就是协同过滤,可分为基于用户的或者基于作品的。我以mahout对这两个算法进行了测试,发现只用这两个算法来完成推荐的工作,还远远不够。这两算法有以下问题待解决:1.数据源的广度和精度。算法需要大量的user_id,product_id,like_num(偏好度)这样的数据,而我们的实际系统并没有这样的数据,实际数据需要转化为这样的数据格式
2017-10-10 17:59:14
284
原创 智能小车36:如何使用存储器NandFlash
之前我写过一篇文章来介绍硬改tp-link路由器,就是更换它的flash。那个时候就发现路由器这种设备硬盘(flash)的容量比内存容量小得多,flash是16MB,内存是64MB。今天买了本嵌入式的教程才知道,存储器的分类是这样的。flash不是硬盘,但可以当个硬盘用。这和我们的pc机的存储设备不一样,如下图:在这之前的程序,要么是在片内内存(4k)里执行的,要么是从sdram执
2017-10-09 08:16:43
323
原创 智能小车35:从汇编指令bne聊起
今天学习韦东山老师的《存储管理器实验》这节课时出现了以下汇编代码,由于没有系统的学习过汇编指令,下面的代码真是不懂。1: ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4cmp r1, r3 @ 判断是否完成:源地址等于Steppingston
2017-10-04 22:48:46
626
原创 智能小车34:汇编与C语言一起玩
长时间写java程序,但从来没去研究main函数是如何执行的,今天学习嵌入式终于知道了原理。之前看过一本30天做一个操作系统这本书,可以通过写个2进制文件来启动系统。然后进化到汇编语言,通过工具把汇编转为二进制一样可以启动系统(虚拟机)。这个系统的执行过程与我们的main函数有什么联系么。做java的同学知道,只要执行java命令自然会执行main函数。做c语言的同学,知道在编译后执行
2017-10-03 13:34:53
535
原创 智能小车34:arduino与arm的汇编程序开发
为了解底层技术,一直就想学习下汇编程序。但以前学习的都是理论,没有在真实环境实践过,时间长了就忘了。目前手头有arduino uno板子与arm 2440板子,分别在这两种平台写了段汇编程序,来理一理真实板子开发汇编程序的流程。一、Arduino汇编程序开发。1.安装和打开Atmel Studio 7.02.新建项目【File-New Project】,选择项目类型为Assembl
2017-10-01 11:05:11
694
原创 搜索系统10:机器学习算法浅析
很多网站都有猜你喜欢,我对淘宝的推荐还是比较满意的。很多算法都可以实现推荐功能,下面来看一看机器学习的算法:1.回归算法。回归的意思大概是,估计这堆数据这个规律,然后找出这个规律,这个过程就是回归。spark的MLlib中有线性回归、逻辑回归、保序回归三种。比如, 假设订单数与价格有f(x)=wx+b这么一个关系(线性模型),那我就收集一大堆订单和订单的价格。但我并不知道w和b这两
2017-09-29 18:14:39
263
原创 智能小车32:安装超声波测距
一、硬件准备1.购买超声波模块一个2.设计超声波安装电路板刚好今天我买的小台锯到了,可以把万能板锯成我想要的尺寸了。另外还要准备电钻给电路板打孔。切割成小切并打孔后就可以安装线与超声波的插座了,我选择了2个4p的排母。在背面需要把这4条线连上,开始用锡连,后来发现太麻烦,还不如连两根线。小车底盘我并没有打孔,而是利用了现成的一道缝,安装上两根铜柱。再把上面的电路
2017-09-18 10:27:35
2153
原创 智能小车31:电路板V1.0安装指南
经过上次惨痛的教训,这次设计的电路板终于能用了,虽然还有小问题。先看一下这次的板子:优点是:1.四个角经过处理不割手了。2.孔径大小比较合适。3.L7805标出了方向。还有的问题是:1.设计的Dc插座没沟通好,孔没留出来2.2p插座没有标安装方向,需对比线路。不过后面我会介绍安装的方向。3.还有空余地方没有利用起来。4.电容标识不标准安装步骤要注
2017-09-13 07:51:12
698
原创 搜索系统7:索引查询方法与评价方法
一、 多条件的查询方法:之前已经介绍过倒排索引的结构。在查单个词的时候比较简单,直接查从索引里找是否有这个词对应的文档列表就行了。但如果条件是and、or、not这样的条件,怎么处理呢?and:对多个条件分别取文档列表后,再取交集。or:对多个条件分别取文档列表后,再取并集。not:对多个条件分别取文档列表后,再取补集。曾经以为这样效率不高,但仔细想想。索引列表压缩后最多也就几
2017-09-11 18:04:29
353
原创 智能小车30:双轴舵机的安装与调试
之前我安装的控制电视的红外发送头是用了一个上下传动的舵机来控制上下的方向,用小车自已的转动控制左右的方向。而红外发射头是绑在舵转盘上的。这当然也能达到控制的目的,但这种绑的方式不容易重复安装,不稳定,还很丑。另外摄像头也无法用这种方式来安装,所以我找到了这样的装置来解决摄像头安装的问题----双轴舵机。红外发射头的单轴安装方式:先看一下双轴舵机的拼装结构:材料:2个舵机、1
2017-09-11 07:56:33
3018
2
DBMS题库研究生考试
2020-04-26
(完整版词根词缀)有了这个根本不用背单词.doc
2020-04-26
jfreechart-1.0.13-demo源码
2010-10-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人