Talk is Cheap, Show me the Code! <<网站首页文章列表

  • 重温Java设计模式——工厂模式

    零、关于设计模式百度百科如是描述:设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。个人拙见,设计模式就是有经验的程序员在重复解决相似问题的过程中,因“偷懒”的天性而总结出来的一种代码风格。经过一代代程序员的完善和总结,使之更加符合软件设计的几大原则,才形成了现在所谓的23种设计模式。今天介绍的工厂模式相关内容,也不全是在下原创,其中一部分相关解释、定义都是网上搜寻而来,我只是做了一个整理归纳。本篇中工厂模式分为三个应用阶段,层层递进,描述如有不妥还请见谅。--- 一、简单工厂模式 简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。 它由三个部分组成: 1. 工厂类角色:这是本模式的核心,含有简单的商业逻辑和判断逻辑,用来创建实际对象实例。 2. 抽象产品角色:它一般是具体产品继承的父

    设计模式   工厂模式   Java   2019-05-06 浏览(2271) 阅读原文>>
  • 应用算法学习(一)—— TopN算法

    零、应用场景最早接触这个算法,是在看Lucene实现原理相关代码的时候。搜索返回查询结果就是一个很典型的TopN算法应用,获取综合分数最高的前N个结果。搜索场景,通常数据量会在百万级、千万级甚至更多,因此,获取分数最高的前N个结果的性能好坏直接影响搜索体验。获取前N个得分最高的结果,可以有不同的方法:1. 直接对数据(Item)集进行排序,然后截取前N个Item;那么,排序算法会对性能有较大影响。例如快排的时间复杂度在O(n)到O(nn)之间,平均复杂度是O(nlog(n))。2. 对所有Item进行一次遍历,对于遍历每个Item的时候,始终有一个临时结果集来保存当前情况下的可能结果集,当遍历结束时,临时结果集就是最终结果,只要按顺序输出即可。本身遍历比较简单,那么选择临时结果集的数据结构就是算法的关键。我们对临时结果集的数据结构有几个要求: 1. 数据结构本身可以有序输出Item。 2. 可以快速新增一个Item,而且可以保持i中的特性。 3. 可以快速判断是否需要替换Item,且替换之后可以保持i中的特性。--- 一、算法简介Lucene中使用的最小二叉堆,就是满足了上面第二点中提出的要求(堆特性)。 最小二叉堆:父节点不大于其两个子节点,两个子节点直接的大小比较没有要求。堆顶是所有节点中最小的,但是最终整个堆返回的就是前N个最大值。解释: 堆顶最小的目的是,在遍历时,如果发现某个Item的值大于堆顶(找出前N个最大的要求就是,用某个Item替换掉临时结果集中最小的,堆顶始终最小的话就可以很方便判断Item是否可以入堆,而且直接删除被替换的堆顶),则可以替换掉当前堆顶,然后执行节点沉降,以便保持特性。它的时间复杂度为 O(nlog(n))。 主要过程1. 遍历目标集,每次遍历的数据节

    topN   二叉堆   Lucene   搜索引擎   2018-09-20 浏览(2093) 阅读原文>>
  • SpringBoot2从零开始(二)——多数据源配置

    零、前言多数据源配置,一直是大部分企业级开发所要面对的,即使微服务化概念提出来已经有一点时间了。微服务边界定义的好坏,直接影响系统的真实复杂度。所以即使用了提倡微服务的SpringBoot,即使SpringBoot默认约定配置是单数据源的,多数据源整合还是有其存在的必要的。当然,直接将非SpringBoot项目中多数据源配置的配置文件挪过来,稍作修改亦可实现。但是,既然使用了SpringBoot,如果依旧用那种方式,如何体现使用SpringBoot的“优越感”?至少要通过使用SpringBoot提供的诸多便利方式来实现多数据源,方可自称是SpringBoot的脑残粉,啊不,是倡导者,你说是不?---在本章开始之前,有必要了解下MyBatis在SpringBoot下大致的工作过程是怎样的。 一、MyBatis相关类解释 \\\\Mapper或者\\\\Dao+ 这是一个接口类,描述了某个数据访问的相关接口,例如:userMapper是一个tbuser表的数据访问接口。+ com.wj.domain.mapper.UserMapper是这个接口的完整类路径,这里叫做mapperInterface。+ 接口中定义了一些方法接口:int countByExample(UserExpample example)、int deleteByExample(UserExpample example)等等,其中countByExample叫做方法名,它与mapperInterface一同组成了这个方法在某个连接配置中的唯一标示。 org.apache.ibatis.mapping.MappedStatement+ 它表示了Mybatis框架中,XML文件对于sql语句节点的描述信息,包括<select /、<update /、<insert /。+ 在初始化阶段,框架会将XML配置内容转为一个个MappedStatement对象实例。+ 在XML中,mapper.namespace.id可以定位到唯一的一条SQL内容,这就是MappedStatement。所以,mapper.namespace就是前面提到的mapperInterface。同样,在

    SpringBoot   多数据源   MyBatis   2019-07-26 浏览(3473) 阅读原文>>
  • SpringBoot2从零开始(一)——项目启动

    Maven中groupId、artifactId、version+ groupId - the id of the project's group.+ artifactId - the id of the artifact (project)+ version - the version of the artifact under the specified groupA POM requires that its groupId, artifactId, and version be configured. These three values form the project's fully qualified artifact name. This is in the form of ::. As for the example above, its fully qualified artifact name is "com.mycompany.app:my-app:1".--- 开始SpringBoot 2 一、初始化一个web项目访问 [start.spring][startSpring] ,创建快速创建一个SpringBoot2的web项目。Dependencies选择一个Web模块即可,然后点击下方Generate Project alt+回撤按钮。解压下载的zip包,导入的IDE中,我使用是eclipse。在你 的groupId.artifactId目录下找到Application文件,以main方法运行即可快速即启动一个web项目。springboot官方建议的根目录(groupId.artifactId)下,主要有三个package:+ domain:主要存放数据库访问相关对象以及映射类。+ service:业务层代码。+ controller:控制层代码,负责页面访问。当然,如果是多Module项目,另当别论。在controller目录下创建一个FirstController.java文件,增加一个示例接口:javapackage com.wj.springboot2demo.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class FirstController { / @RequestParam 注解有四个参数,均为非必填: defaultValue 指定了参数的默认值 required

    SpringBoot   Web   MyBatis   2019-04-30 浏览(1636) 阅读原文>>
  • 网络模型基础知识(二)——TCP/IP四层模型

    四层模型定义TCP/IP协议,也称TCP/IP协议簇或TCP/IP协议栈,是Internet的基础,也是当今最流行的组网形式。了TCP/IP协议簇包含了许多别的协议。其中比较重要的有SLIP、PPP、IP、ICMP、ARP、TCP、UDP、FTP、DNS、SMTP等。TCP/IP协议并不完全符合OSI的七层参考模型。OSI参考模型是在协议开发之前设计的,具有通用性,但只是理论上的模型,并没有成熟的产品支持;TCP/IP模型则是在协议集已有的情况下建立的,已经成为“实际上的国际标准”,它的每一层都呼叫其下一层所提供的网络来完成自己的需求。--- 网络接口层网络接口层也称为主机到网络层,与OSI参考模型中的物理层和数据链路层相对应,它负责监视数据在主机和网络之间的交换。实际上TCP/IP四层模型本身并未描述该层的协议实现,只是要求能够提供给其上层-网际互联层(也叫网络互连层)一个访问接口,以便在其上传递IP分组。所以这一层使用的接口由参与互联的各个网络使用其自己的物理层和数据链路层协议,然后与TCP/IP的网络接口层进行连接。该层有SLIP、PPP、ARP等协议。+ SLIP(Serial Line Internet Protocol),即串行线路网际协议,简称网际协议。它提供了一种在串行通信线路上封装IP数据报的简单方法,使用户通过电话线和Modem能方便地接入TCP/IP网络。 1. SLIP不支持在连接过程中的动态IP地址分配,通信双方必须事先告诉对方IP地址,这给没有固定IP地址的个人用户上Internet网带来了很大的不便。 2. SLIP帧中无协议类型字段,因此他只能支持Ip协议。 3. SLIP帧中无校验字段,因此链路层上无法检测出传输差错,必须由上层实体或具有纠错能力的MODEM来解决差错问题。+ PPP(Point to Point Protocol),即点对点协议。它是一种有效的点到点通信协

    TCP/IP   网络模型   四层模型   2018-09-15 浏览(2462) 阅读原文>>
  • 搜索引擎进阶——IK扩展之动态加载与同义词

    前言 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。他最初是由林良益老师团队开发并维护的。 IK对应Lucene版本为4.7.2,其实IK针对不同版本的Lucene可以进行定制化的修改以达到适用的目的。 词库动态加载的关键类是org.apache.lucene.analysis.Tokenizer和org.apache.lucene.analysis.util.TokenizerFactory。 同义词扩展的关键类是org.apache.lucene.analysis.synonym.SynonymFilter和org.apache.lucene.analysis.util.TokenFilterFactory。---![图片](https://www.oomabc.com/staticsrc/img/201809/14/1536859583364974be33e584945cf80c52e29ab816a99.jpg) -------- 必要信息解释Term是一个最小搜索单元,Lucene中有个Term和对应的TermQuery;Token应该是分词过程中记录一些分词信息的对象。 然后我特意下载lucene-core-4.7.1进行查看,看到Token这类上面是这么写的:![图片](https://www.oomabc.com/staticsrc/img/201809/14/1536859689260271527901b7f487e83cd4bed7aa909bf.jpg) 我用非常蹩脚的英语水平,大致翻译一下主要内容就是:Token是一种在对文本进行分词时产生的对象,包含分词对象(Term)的词语内容,词语在文本中的开始、结束位置,和一个词语类型(关键字、停用词)字符串。开始、结束位置这两个参数,可以在做文本高亮或者摘要高亮的时候使用。从Lucene的2.9版本开始,Token这个类就不再建议使用了,推荐用Attuibutes这个接口对应的实现类代替。新版本取得分词信息方式如下:javaAnalyzer analyzer new StandardAnalyzer(Version.LUCENE47);String text "利用 Lucene 进行搜索就像建立索引一样也是非常方便的。";TokenStream tokenStream analyzer.tokenStre

    搜索引擎   IK   分词器扩展   Solr   Java   2019-07-24 浏览(3575) 阅读原文>>
  • 为什么会有这个博客以及搭建的简略步骤

    停杯投箸不能食,拔剑四顾心茫然。 问天、不语,问地、无言,问风、不答,问己、心迷。 年轻人初出茅庐刚毕业参加工作那会,入职时同事都会问一句,你是几几年的。 我87年的,去年刚毕业。往往同事也都会感叹一句: 真年轻啊,好好干有前途的。唉,我们都老了,周围都是85后了。其实,他们也是80后,只不过是85前罢了。对当时的我来说确实是前辈老人了。但凡入职新公司或者遇见新同事,这样的场景都会再次发生。只不过,渐渐的,不知哪一年开始,我突然变成了别人眼中的前辈老人,而我所面对的是一群90后小伙子。更可怕的是,我居然丝毫不觉得其中有任何违和感,似乎我已经被动的接受了自己变老的事实。毕竟,这个过程中我也变成了某某哥,虽然只是少数人在叫。可能,正是称呼的改变,让我放松了警惕,才让岁月乘虚而入,在我身上刮了一刀又一刀。要不然呢!我也没办法啊! 刚入职场,我要虚心学习,多像前辈高人请教请教。![图片](https://oomabc.com/staticsrc/img/201810/11/15392418770755ba049989a0f4abcafb7b21692a05978.jpg) 伪前辈登堂入室被人叫哥,意味着我已经由初入职场的小菜鸟成功升级为“中流砥柱”了(原谅我不厚道的笑了)。随着工作经验的积累,个人技术也有了第一次较大的进步。这个过程要感谢不少人,有初入职场遇到的部长老杨;有带我进入更大平台的张总;更有一帮子“不靠谱”的同事,比如追求生活品质的中二队长,比如韩版大帅哥老范,又比如说话跑火车忽悠不负责的熊肿,还有热心的大碴子味的姜老板。还有很多同事都很处得来,他们都在不同时间段对我提供了帮助,所以说,在职场我很幸运。这些积累下来的技术和经验都在我的脑海里,我并没有将之持久化。至少短期内,内存存储不会

    程序员   感想   2019-10-26 浏览(1724) 阅读原文>>
  • 网络模型基础知识(一)——OSI七层参考模型

    OSI在百度百科中的定义是这样写的: OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,从下至上分别是物理层(Physical Layer),数据链路层(Data Link Layer),网络层(Network Layer),传输层(Transport Layer),会话层(Session Layer),表示层(Presentation Layer)和应用层(Application Layer);为方便记忆可以将七层从高到低视为:All People Seem To Need Data Processing。每一个大写字母与七层名称头一个字母相对应。--- 把网络模型进行分层好处1. 把开放系统的信息交换问题分解到一系列容易控制的软硬件模块层。2. 每一层都有明确的功能,有利于明确网络协议的国际标准,避免各层功能混乱。3. 每层利用紧邻的下层所提供的服务提供更高级的增值服务,更容易记住个层的功能。4. 层间的标准接口,方便工程模块化,有利于各不同制造厂家的设备互连。5. 降低了复杂度,使程序更容易修改,产品开发的速度更快。6. 创建了一个更好的互连环境,人们可以很容易的讨论和学习协议的规范细节。 分层原则+ 网络中各结点都有相同的层次+ 不同结点相同层次具有相同的功能+ 同一结点相邻层间通过接口通信+ 每一层可以使用下层提供的服务,并向上层提供服务+ 不同结点的同等层间通过协议来实现对等层间的通信 关于对等层OSI参考模型中处于同一层次的两端就是对等层,每层都利用下一层提供的服务与对等层进行通讯。例如,传输层与对端的传输层就是对等层。 为了使数据分组从源传送到目的地,源端OSI模型的每一层都必须与目的端的对等层进行通信

    TCP/IP   网络模型   OSI   2019-05-23 浏览(2553) 阅读原文>>
  • MarkDown 语法测试并记录

    关于MarkDown Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、内嵌HTML等等),这些功能原初的Markdown尚不具备,它们能让Markdown转换成更多的格式,例如LaTeX,Docbook。Markdown增强版中比较有名的有Markdown Extra、MultiMarkdown、 Maruku等。这些衍生版本要么基于工具,如Pandoc;要么基于网站,如GitHub和Wikipedia,在语法上基本兼容,但在一些语法和渲染效果上有改动。 ©© This is an H1 This is an H1 This is an H2 -------------This is an H2------------- This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing. This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing. - Red- Green- Blue1. Bird 1. sdf 2. asdfsf 1. dsfasdf2. McHale3. Parish- Red- Green- Blue1. Bird 1. sdf 2. asdfsf

    markdown   2018-10-23 浏览(1301) 阅读原文>>
  • Amazon 的推荐算法是否特别优秀

    现在在京东、易迅、亚马逊等看到的主流推荐算法,一般都是基于物品自身相似性(不依赖于用户数据,没有冷启动问题)、基于用户浏览、喜欢、购买等数据的协同过滤推荐(用户纬度和商品纬度)。其实这些推荐算法的核心思路,是很朴素的。 一、基于物品自身相似度。例如衣服A和衣服B,对于它们在分类、价格段、属性、风格、品牌定位等等其他属性纬度的表现,来计算它们之间的相似度,如果相似度高,那么在有用户浏览A的时候,就可以推荐B(实际当然没这么简单)。因为衣服的这些属性是不依赖于用户的,所以解决了系统的冷启动问题,正是不依赖与用户的行为数据,因此比较死板,完全没有个性化的推荐。这个算法的思路很多人都清楚,但是越是简单的算法,要达到好的效果就越是难,特别是推荐这种转化率非常低的算法。商品有几十个属性,对不同分类的商品,并不是所有的属性都是有必要纳入相似度计算的,已经纳入的属性但是重要性也是有区别的,这样一来,光光给不同类别商品筛选必要属性以及设置这些属性在相似度计算中的权重值,就是一项非常浩大的工程了。亚马逊的推荐系统在全球行业中也是最早的,相信他们在这个问题上肯定有自己一套迅速有效的方法。当然要我来说具体是怎么样的,我怎么可能知道呢^^,知道了也不告诉你。 二、基于用户纬度的协同过滤。采集用户的购买(浏览、收藏都行)商品数据,把用户购买的商品列出来,当作用户的属性纬度。例如用户A购买了商品1、2、3、4、5,用户B购买了商品1、2、5、6,那么可以简单的将12345和1256分别作为A和B的属性特征字符串,计算A和B的相似度,经过简单的聚类将用户聚成几个类别(邻居)。假设A和B同属于一个聚类,那么可以称A和B有比较相似的偏好,继而可以将

    亚马逊   协同过滤   推荐算法   2018-09-14 浏览(1403) 阅读原文>>
  • 关于搭建MongoDB Replica Set(副本集)

    以下是我给公司搭建mongoDB副本集的过程,查阅了不少资料,赶紧记录下来,供大家参考。 一、准备三台服务器(三个mongod实例):+ 192.168.100.101:27017+ 192.168.100.102:27017+ 192.168.100.103:27017打算把服务器配置较高的192.168.100.101作为默认的PRIMARY,其它两台作为SECONDARY。 二、给三台服务器分别按装mongoDB 1、下载安装包shell[root@server ~] cd /home/[root@server home] curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x8664-3.2.10.tgz[root@server home] mkdir mongodb[root@server home] tar zxvf mongodb-linux-x8664-3.2.10.tgz -C mongodb/这个时候发现,mongodb文件夹里面还有一个压缩包同名的文件夹,早知道直接解压到home下,重命名了,现在需要到mongodb/mongodb-linux-x8664-3.2.10/目录下把内容copy到上一层shell[root@server home] cd mongodb/mongodb-linux-x8664-3.2.10/[root@server mongodb-linux-x8664-3.2.10] mv ./ ../然后把该空的文件夹删掉即可shell[root@server mongodb] rm -rf ./mongodb-linux-x8664-3.2.10/[root@server mongodb] lltotal 100drwxr-xr-x. 2 root root 4096 Jul 13 13:39 bin-rw-r--r--. 1 root root 34520 Sep 30 2016 GNU-AGPL-3.0-rw-r--r--. 1 root root 16726 Sep 30 2016 MPL-2-rw-r--r--. 1 root root 1359 Sep 30 2016 README-rw-r--r--. 1 root root 35910 Sep 30 2016 THIRD-PARTY-NOTICES将mongodb安装文件复制到/usr/local/目录(这只是我们约定的安装文件目录)shell[root@uat-server home]mv mongodb /usr/local/ 2、配置环境变量修改/etc/profile内容 :shell[root@server ~] vi /etc/profil

    mongoDB   replSet   副本集   2019-02-21 浏览(1932) 阅读原文>>
  • 1  2  3  4 
    blogTest
    分享文章
     
    使用APP的"扫一扫"功能,扫描左边的二维码,即可将网页分享给别人。
    你也可以扫描右边本博客的小程序二维码,实时关注最新文章。