开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

Laravel思维导图之Laravel入门指南

4张思维导图看 Laravel 入门指南。
精进吧Aaron 发布于 14小时前 阅读 98 点赞 1

Java 实现长图文生成

实现一个用于生成微博长图文样式的包装类
六月依 发布于 3天前 阅读 617 评论 1 点赞 2

PowerShell 中 function 返回值的陷阱

问题描述 PS 中的 function 使用起来非常自由,但它会对返回值做一种奇怪的处理。 我们一起来看下面这段代码,你认为这个 function 的返回值是什么类型? function TestReturn () { $ls = [System.Collections.Generic.List[int]]::new() $ls.Add(1) return $ls } $(TestReturn).GetType() 喂!这怎么看都是返回了一个 List<int> 吧? 但是你运行之后得到的结果是这样的: 啊!!!我 List<int> 呢??? 然后当我们“天真地”将这个返回值当作一个 List<int> 使用时,大概会得到一个: “Method invocation failed because [System.Int32] does not contain a method named 'xxx'.” 原因分析 不止 List<int> 会这样, Queue<int> 以及其他常用的泛型/非泛型集合、甚至 Array 都是副德性……那我们大概可以进一步推测:所有 collection 都是这德性(欢迎读者验证并评论)。 具体原因不明,大概只有 PS 的设计者能解释了吧。 我推测与它对于多个返回值的处理有关(http://www.pstips.net/powershell-specify-return-value-from-function.html),这个设计的逻辑感觉就像是: “多个返回值变成一个 Object[],只包含一个 item 的 collection 返回值会变成一个 it...
RareH 发布于 4天前 阅读 105

Spring data 如何定义默认时间与日期

需求是这样的: 1. 创建时间与更新时间只能由数据库产生,不允许在实体类中产生,因为每个节点的时间/时区不一定一直。另外防止人为插入自定义时间时间。 2. 插入记录的时候创建默认时间,创建时间不能为空,时间一旦插入不允许日后在实体类中修改。 3. 记录创建后更新日志字段为默认为 null 表示该记录没有被修改过。一旦数据被修改,修改日期字段将记录下最后的修改时间。 4. 甚至你可以通过触发器实现一个history 表,用来记录数据的历史修改,详细请参考作者另一部电子书《Netkiller Architect 手札》数据库设计相关章节。
neo-chen 发布于 4天前 阅读 210 评论 1

开源中国全球专享福利,云栖大会购票大返现!

开源中国为大家带来了全网专享福利!开源中国的会员复制优惠码,在购票时填入,就可以在云栖大会现场开源中国展台处领取现金福利哦!先到先得,赶紧把这个消息传递给好朋友吧,我们云栖大会见!
阿里云栖大会

曲线点抽稀算法-Python实现

## 何为抽稀 >在处理矢量化数据时,记录中往往会有很多重复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不光滑或不符合标准。因此要通过某种规则,在保证矢量曲线形状不变的情况下, 最大限度地减少数据点个数,这个过程称为抽稀。 通俗的讲就是对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度保持原有形状。比较常用的两种抽稀算法是:道格拉斯-普克(Douglas-Peuker)算法和垂距限值法。 ## 道格拉斯-普克(Douglas-Peuker)算法 Douglas-Peuker算法(DP算法)过程如下: * 1、连接曲线首尾两点A、B; * 2、依次计算曲线上所有点到A、B两点所在曲线的距离; * 3、计算最大距离D,如果D小于阈值threshold,则去掉曲线上出A、B外的所有点;如果D大于阈值threshold,则把曲线以最大距离分割成两段; * 4、对所有曲线分段重复1-3步骤,知道所有D均小于阈值。即完成抽稀。 这种算法的抽稀精度与阈值有很大关系,阈值越大,简化程度越大,点减少的越多;反之简化程度越低,点保留的越多,形状也越趋于原曲线。 下面是Python代码实现: ```python # -*- coding: utf-8 -*- """ -----------------...
j_hao104 发布于 4天前 阅读 819 评论 1 点赞 2

springboot构建spring cloud 微服务项目 搭建ARTHUR框架分享

在此分享下本人最近搭建的一个springcloud微服务项目,包括注册中心、配置中心、熔断器、turbine熔断器集中监控中心、fegin、前后端负载均衡、swagger2、网关bus动态修改配置等等。项目只是初步搭建,之后还会加入各种好玩的技术,会不定期更新,感兴趣的可下载进行研究交流,微服务的明天会更好。 github arthur https://github.com/ArthurFamily/arthur.git config https://github.com/ArthurFamily/config-center.git 码云 https://git.oschina.net/ArthurFamily/arthur.git https://git.oschina.net/ArthurFamily/config-center.git (注:配置文件通过git项目读取,放到一个项目中读取超过5分钟才会有响应,经测试不是网络原因,配置文件单独放置一个项目没有问题。) <modules> <!-- 注册中心与配置中心使用jhipster2.6.0 --> <module>arthur-eureka</module> <!-- 配置中心 --> <module>arthur-config-center</module> <!-- 集中监控断路器仪表盘 --> <module>arthur-monitor-turbine</module> <!-- zuul网关 --> <module>arthur-gateway</module> <!-- 后台管理之服务网管理 --> <module>arthur-manage-serviceWeb</modu...
ooTll 发布于 5天前 阅读 368 评论 7 点赞 1

深入浅出设计模式——从球赛中悟装饰者模式

装饰者模式,主要用来动态的给一个对象添加一些额外的功能,同时又不改变它的结构。就为对象增加功能这方面,装饰者模式比使用类的继承更加灵活。
珂jack 发布于 6天前 阅读 447 评论 2

SpringBoot定时任务及Cron表达式详解

讲解如何使用SpringBoot定时任务,并通过源码说明如何使用多线程处理各定时任务。 详细说明cron表达式用法。
珂jack 发布于 2周前 阅读 967 评论 5 点赞 3 打赏 1

PHP实现依赖注入

控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征。控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。
o0无忧亦无怖 发布于 2周前 阅读 1968 评论 36 点赞 8

macOS自带Python2.7删除之后的悲剧

The plug-in or one of its prerequisite plug-ins may be missing or damaged and may need to be reinstalled.报错解决
她吃西红柿 发布于 2周前 阅读 642 评论 4

深入浅出设计模式——从球赛中悟观察者模式

观察者模式,主要用来处理对象的一对多的关系,一个主题(Subject),多个观察者(Observer),当主题发生变化时观察者会及时得到通知。
珂jack 发布于 2周前 阅读 462 评论 3 点赞 1 打赏 3

Java使用Hutool实现AES、DES加密解密

在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。
路小磊 发布于 2周前 阅读 2402 评论 21 点赞 9

SQL注入详解

日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些常用的攻击技术和防范策略。 SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。
暴雪首席执行官 发布于 2周前 阅读 3690 评论 20 点赞 4

Ruby 程序员学习 laravel 框架笔记 (1)-php 开发环境安装

我是一名ruby on rails程序员,想学习一下laravel这个php的web mvc框架。 我手头上有一台macbook。 我现在把这个学习过程记录下来。 首先是安装环境,要先使用laravel框架之前,必须要先安装php的开发环境。 #### 1. 安装php 安装的php版本最好就是7以上吧,我是用homebrew来安装的。 你可以用以下的命令来搜索一下可以安装的php版本。 ``` bash brew search php ``` 最后我用下面这条命令来安装php71。 ``` bash brew install homebrew/php/php71 ``` ![](https://rails365.oss-cn-shenzhen.aliyuncs.com/uploads/photo/image/270/2017/0ee621b4fb8c51c9bfe971e0da4048da.png) #### 2. 安装composer composer是php界用来管理包的,相当于ruby中的gem。 在mac下安装composer也蛮简单的,只要一条命令即可。 ``` brew install composer ``` 如果不是在mac下安装,那应该要到composer的官网去下载composer的可执行文件,容易放到$PATH中。 https://getcomposer.org/download/ > 我之前在服务器上就是这么做的,因为由于网速等原因下载下来好慢,我就把composer的可执行文件用浏览器下载完,然后scp到服务器中。 ``` bash sudo mv composer.phar /usr/local/bin/composer sud...
随风飘落而去 发布于 2周前 阅读 97

浅谈Java的Fork/Join并发框架

粗略记录对Fork/Join的理解以及基本用法。
珂jack 发布于 3周前 阅读 2240 评论 5 点赞 6 打赏 1

SpringBoot开发案例之整合Dubbo提供者(二)

![00.jpg](https://blog.52itstyle.com/usr/uploads/2017/07/1329278006.jpg) 大家有没有注意到,上一篇中提供者,暴露接口的方式?混搭。springboot本身接口实现使用了注解的方式,而Dubbo暴露接口使用的是配置文件的实现方式,即如下: ## 代码 ```java import org.springframework.stereotype.Service; //注意这里使用的是spring的注解 @Service("userService") public class UserServiceImpl implements IUserService { @Override public void saveUser(User user) { System.out.println("保存用户:"+user.getUsername()); } } ``` ## 配置 ```xml ``` 如果以上使用spring注解,我们必须开启扫描: ```java @ComponentScan(basePackages={"com.itstyle.dubbo"}) ``` 当然,如果你不想使用注解,全配置实现: ```java ``` 好吧,其实在这个注解走天下的年代,显然配置已经落后了半个世纪,下面是全注解实现: 首先我们要在dubbo.xml配置以下代码: ```xml ``` 修改UserServiceImpl.java: ```java import com.alibaba.dubbo.config.annotation.Service; import com.itstyle.dubbo.domain.User; import com.itstyle.dubbo.service.IUserService; //这里引用阿里巴巴的注解...
小柒2012 发布于 3周前 阅读 594 评论 3

使用Spring自定义注解实现任务路由

在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器。其本质就是通过外部参数进行一次路由和Spring mvc做的事情类似。简单看了Spring mvc的实现原理之后,决定使用自定义注解的方式来实现以上功能。 ### 自定义TaskHandler注解 ```java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface TaskHandler { String taskType() default ""; } ``` 以上定义了任务处理器的注解,其中@Component表示在spring 启动过程中,会扫描到并且注入到容器中。taskType表示类型。 ### 任务处理器定义 ```java public abstract class AbstractTaskHandler { /** * 任务执行器 * * @param task 任务 * @return 执行结果 */ public abstract BaseResult execute(Task task); } ``` 以上定义了一个任务执行的处理器,其他所有的具体的任务执行器继承实现这个方法。其中Task表示任务的定义,包括任务Id,执行任务需要的参数等。 ### 任务处理器实现 接下来,我们可以实现一个具体的任务处理器。 ```jav...
wangyan9110 发布于 3周前 阅读 3336 评论 8 点赞 8

堆在java中的应用--PriorityQueue

堆排序 优先队列 应用场景
xpbob 发布于 3周前 阅读 377 评论 10 点赞 1

二维码服务拓展(支持logo,圆角logo,背景图,颜色配置)

zxing 提供了二维码一些列的功能,在日常生活中,可以发现很多二维码并不仅仅是简单的黑白矩形块,有的添加了文字,加了logo,定制颜色,背景等,本片博文则着手于此,进行基础服务的拓展
六月依 发布于 4周前 阅读 650 评论 1

Java学习路线图

JAVA学习路线图,特此声明; 仅希望对热爱JAVA学习有所帮助 如若转载或者使用本图,请注明出处,避免后期出现版权问题,谢谢!!!   JAVA学习路线图 此乃是java攻城狮的学习路线图,由简到繁,由易到难,一步步的学习,最后成为 JAVA攻城狮。希望对大家的学习有所帮助 阶段一   1:学习HTML     2:学习CSS    3:Javascript    4:jquery    5:xml解析   6:Bootstrap      阶段二   7:JAVAse基础      8:mysql数据库     9:Powerdesigner   10:JDBC    11:JAVAWEB        阶段三 12:oracle         13:struts2         14:Hibernate       15:Spring 阶段四 16:Maven         17:SpringMVC      18:MyBatis
Java程序员-10 发布于 4周前 阅读 2246 点赞 9

eclipse 设置注释模板详解,与导入模板方法介绍总结

在开发中进入项目组,一定要先问下项目经理,有没有这个代码注释模板,然后倒入到你的eclipse 中,还有注意设置 utf-8 。下面就是导入注释模板的方法: 1.设置UTF-8 在 windows  下的 preference  的 General 的 workspace 下面更改! 2.导入你们项目组的 注释模板 打开Window->Preferences->Java->Code Style->Code Templates 点击import 导入你模板即可! 3.接下来修改这个模板基本信息 关于这个配置文件的详细解释可以浏览其他网址: http://www.cnblogs.com/senzjx/archive/2009/09/21/1570950.html
橙子hhh 发布于 5小时前 阅读 4

POJ 1979 搜索 水题

题意:给你一个row*col的矩阵,上面的'#'代表你不能走的地方,'.'表示你能走的地方,'@'表示你的起点,问你最多能走多少格。   dfs #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <queue> #define LL long long int const MAX = 1e6 + 1; int const INF = 1 << 30; double const EPS = 0.00000001; using namespace std; int mp[20][20], n, m, ans = 0, dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; char s[21]; void dfs(int x, int y){ mp[x][y] = 0; for (int k = 0; k < 4; k++){ int nx = x + dir[k][0], ny = y + dir[k][1]; if (nx >= 0 && ny >= 0 && nx < n && ny < m && mp[nx][ny]){ ans++; dfs(nx, ny); } } } int main(){ freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); int x, y; while (scanf("%d%d", &m, &n), n + m){ for (int i = 0; i < n; i++){ scanf("%s", s); for (int j = 0; j < m; j++){ mp[i][j] = (s[j] == '#' ? 0 : 1)...
阿豪boy 发布于 6小时前 阅读 3

java 多线程快速入门

这里将了解以下信息: 1.线程与进程 2.为什么要使用多线程? 3.多线程应用场景 4.多线程创建方式 5.线程生命周期 6.面试总结 一、线程与进程         每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。         使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。         如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换,更多的线程需要更多的内存空间,线程的中止需要考虑其对程序运行的影响。通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。     总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径。 二、为什么要使用多线程?     比如搬运东西,如果一个人一小时只能般一块砖,那么1...
橙子hhh 发布于 4小时前 阅读 2

学习Java分为几个阶段,分别是什么?

多年前我自学的时候是很茫然,上网问问题,总是一堆外行的人说很难啊,你需要这样需要那样,不然就是,一堆人说一些空话,多看多写,买好书,我很无语,除了这些就没有自己的一些想法吗?  首先很多人认为学JAVA要C的基础,但是实际上不用,学开车,我不想先学骑自行车,没有必要。 第一阶段:  1. JAVA语法和基础,包括循环。。和类的相关内容,如实现,继承什么的  2. 你需要掌握几个重点的集合,List接口的两个子类LinkedList,ArrayList;然后是Map几口的两个子类HashMap,HashTable;Set接口 掌握List后学Set就容易了;掌握Collection和Collections的区别  3. 掌握IO一章,重点的几个流 InputStream,OuputStream;BufferedReader,BufferedWrite;  ObjectInputStream, ObjectOutputStream,,PrintWriter,FileReader,FileWriter了解JAVA的序列化,掌握JAVA的File类  4. JDBC非常重要,重点掌握Connection,PreparedStatement, Statement,ResultSet,  其他的可以在学习或项目中如果碰到再学,但早期重点掌握前面几个,其他了解足够,  数据库建议新手用MySql,下载Navicat for MySQL管理工具  5.如果你想快速上手的话,那么你需要跳过这些,  包括:线程,网络...
Java程序员-10 发布于 4周前 阅读 461

73款阿里巴巴开源软件详解!

详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
阿里巴巴

Python try except finally返回数据的问题

记录代码的小坑,代码异常时return数据的处理
头号土匪 发布于 2周前 阅读 5

qt之qml简单示例并加载到C++程序中,视图、场景、项、撤消、重做的实现

新学习了一些类,QGraphicsView,QGraphicsScene,QGraphicsItem,QUndoStack等等,下面是具体的运用实例,也算是在上一篇实例程序上的扩展学习吧,以后也可能会在此程序上增加更多的内容吧,
蓝栩液枫 发布于 2个月前 阅读 14

Java开发GUI之FlowLayout流布局

FlowLayout应用。
珲少 发布于 2个月前 阅读 9

1.2指令系统

(1)指令集体系分类:堆栈,累加器,寄存器集。 (2)CISC:复杂指令集计算机:进一步增强原有指令的功能,用更为复杂的新指令取代优先由软件子程序完成的功能,实现软件功能的硬化,导致机器的指令系统越来越庞大而复杂。 RISC:精简指令集计算机:通过减少指令总数和简化指令功能,降低硬件设计的复杂度,是指令能单周期执行,并通过优化编译,提高指令执行速度,采用硬线控制逻辑,优化编译程序。关键技术:重叠寄存器窗口技术,优化编译技术,超流水及超标量技术,硬布线逻辑与微程序相结合在微程序技术中,超长指令字技术(VLIW)。 (3)指令控制方式:顺序方式,重叠方式,流水方式。 顺序方式:各条机器指令之间顺序串行的执行,执行完一条指令后才取下一条指令,而且每条机器指令内部的各个微操作也是顺序串行的执行。 重叠方式:在解释第k条指令的操作完成之前,就开始解释第k+1条指令。 流水方式:模仿工业生产过程的流水线而提出的一种指令控制模式,把并行性和并发性嵌入到计算机系统里,把重复的顺序处理的过程分解为若干子过程,每个工程能在专门的独立模块上有效的并行工作。 流水线种类:(级别)部件级,处理机级,系统级;(功能)单功能,多功能流水线;...
一个小妞 发布于 2个月前 阅读 9

ubuntu-16.04 安装虚拟机工具时报错

open-vm-tools packages are available from the OS vendor and VMware recommends  using open-vm-tools packages. See http://kb.vmware.com/kb/2073803 for more  information. Do you still want to proceed with this installation? [no] 
蜗牛奔跑 发布于 2个月前 阅读 20

Java核心技术点之集合框架

概述 Java集合框架由Java类库的一系列接口、抽象类以及具体实现类组成。我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据。集合类型就是容纳这些对象的一个容器。也就是说,最基本的集合特性就是把一组对象放一起集中管理。根据集合中是否允许有重复的对象、对象组织在一起是否按某种顺序等标准来划分的话,集合类型又可以细分为许多种不同的子类型。 Java集合框架为我们提供了一组基本机制以及这些机制的参考实现,其中基本的集合接口是Collection接口,其他相关的接口还有Iterator接口、RandomAccess接口等。这些集合框架中的接口定义了一个集合类型应该实现的基本机制,Java类库为我们提供了一些具体集合类型的参考实现,根据对数据组织及使用的不同需求,只需要实现不同的接口即可。Java类库还为我们提供了一些抽象类,提供了集合类型功能的部分实现,我们也可以在这个基础上去进一步实现自己的集合类型。 Collection接口 迭代器 我们先来看下这个接口的定义: public interface Collection<E> extends Iterable<E> 首先,它使用了一个类型参数;其次,它实现了Iterable<E>接口,我们再来看下Iterable<E>接口的定义: public interface...
Java程序员-10 发布于 1个月前 阅读 147

Java 实现长图文生成

实现一个用于生成微博长图文样式的包装类
六月依 发布于 3天前 阅读 617 评论 1 点赞 2

曲线点抽稀算法-Python实现

## 何为抽稀 >在处理矢量化数据时,记录中往往会有很多重复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不光滑或不符合标准。因此要通过某种规则,在保证矢量曲线形状不变的情况下, 最大限度地减少数据点个数,这个过程称为抽稀。 通俗的讲就是对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度保持原有形状。比较常用的两种抽稀算法是:道格拉斯-普克(Douglas-Peuker)算法和垂距限值法。 ## 道格拉斯-普克(Douglas-Peuker)算法 Douglas-Peuker算法(DP算法)过程如下: * 1、连接曲线首尾两点A、B; * 2、依次计算曲线上所有点到A、B两点所在曲线的距离; * 3、计算最大距离D,如果D小于阈值threshold,则去掉曲线上出A、B外的所有点;如果D大于阈值threshold,则把曲线以最大距离分割成两段; * 4、对所有曲线分段重复1-3步骤,知道所有D均小于阈值。即完成抽稀。 这种算法的抽稀精度与阈值有很大关系,阈值越大,简化程度越大,点减少的越多;反之简化程度越低,点保留的越多,形状也越趋于原曲线。 下面是Python代码实现: ```python # -*- coding: utf-8 -*- """ -----------------...
j_hao104 发布于 4天前 阅读 819 评论 1 点赞 2

Laravel思维导图之Laravel入门指南

4张思维导图看 Laravel 入门指南。
精进吧Aaron 发布于 14小时前 阅读 98 点赞 1

Spring data 如何定义默认时间与日期

需求是这样的: 1. 创建时间与更新时间只能由数据库产生,不允许在实体类中产生,因为每个节点的时间/时区不一定一直。另外防止人为插入自定义时间时间。 2. 插入记录的时候创建默认时间,创建时间不能为空,时间一旦插入不允许日后在实体类中修改。 3. 记录创建后更新日志字段为默认为 null 表示该记录没有被修改过。一旦数据被修改,修改日期字段将记录下最后的修改时间。 4. 甚至你可以通过触发器实现一个history 表,用来记录数据的历史修改,详细请参考作者另一部电子书《Netkiller Architect 手札》数据库设计相关章节。
neo-chen 发布于 4天前 阅读 210 评论 1

Spring思维导图,让Spring不再难懂(mvc篇)

>写在前面 生活就像海洋,只有意志坚强的人才能到达彼岸。已经很久没有发文章了呀,想必大家都挂念我了,哈哈。 温故而知新,今天一起来复习一下spring mvc的内容吧。 >spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。 ![原理.png](http://upload-images.jianshu.io/upload_images/4120002-9409cf62de5e6d39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * (1) Http请求:客户端请求提交到DispatcherServlet。 * (2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。 * (3) 调用处理器:DispatcherServlet将请求提交到Controller。 * (4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。 * (6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 * (8) Http响应:视图负责将结果显示到客户端。 >主要注解 ![spring mvc注解....
java思维导图 发布于 1个月前 阅读 10967 评论 29 点赞 35

Golang依赖管理工具:glide从入门到精通使用

## 介绍 不论是开发Java还是你正在学习的Golang,都会遇到**依赖管理**问题。Java有牛逼轰轰的Maven和Gradle。 Golang亦有godep、govendor、glide、gvt、gopack等等,本文主要给大家介绍[gilde](https://github.com/Masterminds/glide)。 glide是Golang的包管理工具,是为了解决Golang依赖问题的。 为什么需要glide? 原因很简单,Go 语言原生包管理的缺陷。罗列一下golang的 get 子命令管理依赖有很多大缺陷: * 能拉取源码的平台很有限,绝大多数依赖的是 github.com * 不能区分版本,以至于令开发者以最后一项包名作为版本划分 * 依赖 列表/关系 无法持久化到本地,需要找出所有依赖包然后一个个 go get * 只能依赖本地全局仓库(GOPATH/GOROOT),无法将库放置于局部仓库($PROJECT_HOME/vendor) ## 安装 ### Golang环境设置 采用vendor目录特性,Go 1.5 做为试验特性加入(需要指定 GO15VENDOREXPERIMENT=1 环境变量),并在 Go 1.6 正式引入的一个概念。多数 go 依赖解决方案都基于它的。GO15VENDOREXPERIMENT 是 Go 1.5 版本新增的一个环境变量,如果将值改为 1 则表示启用。它可以将项目根目录名为 vendor 的目录添加到 Go 的库搜寻路径中,实现一个局部依赖的效果...
梦朝思夕 发布于 1个月前 阅读 3030 评论 22 点赞 7

Java后端程序员1年工作经验总结

java后端1年经验和技术总结(1) 1.引言   毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西。这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统维护和发布当救火队员的苦恼。遂决定梳理一下自己所学的东西,为大家分享一下。   经过一年意识到以前也有很多认识误区,比如:   偏爱收集,经常收集各种资料视频塞满一个个硬盘,然后心满意足的看着容量不行动。   不重基础,总觉得很多基础东西不需要再看了,其实不懂的地方很多,计算机程序方面任何一个结果都必有原因,不要只会用不知道原理,那是加工厂出来的。现在ide查看代码那么方便,ctrl+点击就进入了JDK查看实现细节。   好高骛远,在计算机基础不牢固的情况下,总想着要做架构,弄分布式,搞大数据之类。   不重视性能,只求能实现功能,sql查询是不是可以优化,是否有算法妙用,大对象是否要清除。   不重视扩展性,模块之间紧密耦合,常用方法不提取成工具类,调用关系混乱等问题。   ……   本文重点不在这些,故只列举了一小部分,下面进入正题。 2.语法基础  2.1 Java类初始化顺序   这是所有情况的类初始化顺序,如果实...
Java程序员-10 发布于 5天前 阅读 403 点赞 2

SQL注入详解

日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些常用的攻击技术和防范策略。 SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。
暴雪首席执行官 发布于 2周前 阅读 3690 评论 20 点赞 4

springboot构建spring cloud 微服务项目 搭建ARTHUR框架分享

在此分享下本人最近搭建的一个springcloud微服务项目,包括注册中心、配置中心、熔断器、turbine熔断器集中监控中心、fegin、前后端负载均衡、swagger2、网关bus动态修改配置等等。项目只是初步搭建,之后还会加入各种好玩的技术,会不定期更新,感兴趣的可下载进行研究交流,微服务的明天会更好。 github arthur https://github.com/ArthurFamily/arthur.git config https://github.com/ArthurFamily/config-center.git 码云 https://git.oschina.net/ArthurFamily/arthur.git https://git.oschina.net/ArthurFamily/config-center.git (注:配置文件通过git项目读取,放到一个项目中读取超过5分钟才会有响应,经测试不是网络原因,配置文件单独放置一个项目没有问题。) <modules> <!-- 注册中心与配置中心使用jhipster2.6.0 --> <module>arthur-eureka</module> <!-- 配置中心 --> <module>arthur-config-center</module> <!-- 集中监控断路器仪表盘 --> <module>arthur-monitor-turbine</module> <!-- zuul网关 --> <module>arthur-gateway</module> <!-- 后台管理之服务网管理 --> <module>arthur-manage-serviceWeb</modu...
ooTll 发布于 5天前 阅读 368 评论 7 点赞 1

深入浅出设计模式——从球赛中悟装饰者模式

装饰者模式,主要用来动态的给一个对象添加一些额外的功能,同时又不改变它的结构。就为对象增加功能这方面,装饰者模式比使用类的继承更加灵活。
珂jack 发布于 6天前 阅读 447 评论 2

Java后端程序员1年工作经验总结

java后端1年经验和技术总结(1) 1.引言   毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西。这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统维护和发布当救火队员的苦恼。遂决定梳理一下自己所学的东西,为大家分享一下。   经过一年意识到以前也有很多认识误区,比如:   偏爱收集,经常收集各种资料视频塞满一个个硬盘,然后心满意足的看着容量不行动。   不重基础,总觉得很多基础东西不需要再看了,其实不懂的地方很多,计算机程序方面任何一个结果都必有原因,不要只会用不知道原理,那是加工厂出来的。现在ide查看代码那么方便,ctrl+点击就进入了JDK查看实现细节。   好高骛远,在计算机基础不牢固的情况下,总想着要做架构,弄分布式,搞大数据之类。   不重视性能,只求能实现功能,sql查询是不是可以优化,是否有算法妙用,大对象是否要清除。   不重视扩展性,模块之间紧密耦合,常用方法不提取成工具类,调用关系混乱等问题。   ……   本文重点不在这些,故只列举了一小部分,下面进入正题。 2.语法基础  2.1 Java类初始化顺序   这是所有情况的类初始化顺序,如果实...
Java程序员-10 发布于 5天前 阅读 403 点赞 2

成为Java顶尖程序员 ,看这11本书就够了

学习的最好途径就是看书 "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处: 1、能出版出来的书一定是经过反复的思考、雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料 2、对着书上的代码自己敲的时候方便 "看完书之后再次提升自我的最好途径是看一些相关的好博文",我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自己的学习方法,就不再扯下去了。 很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书(每本书的作者会加粗标红),其中绝大多数都是我自己平时在看的书,也算是我对于平时读的书做一个小总结和读后感吧。 目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客。这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是: 1、开篇点明该设计模式的定义 2、图文并茂讲解该设计模式中的结构 3、以详细的代码形式写一下该种设...
Java程序员-10 发布于 4天前 阅读 370 点赞 1

10种简单的Java性能优化

你是否正打算优化hashCode()方法?是否想要绕开正则表达式?Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧。 最近“全网域(Web Scale)”一词被炒得火热,人们也正在通过扩展他们的应用程序架构来使他们的系统变得更加“全网域”。但是究竟什么是全网域?或者说如何确保全网域? 扩展的不同方面 全网域被炒作的最多的是扩展负载(Scaling load),比如支持单个用户访问的系统也可以支持10 个、100个、甚至100万个用户访问。在理想情况下,我们的系统应该保持尽可能的“无状态化(stateless)”。即使必须存在状态,也可以在网络的不同处理终端上转化并进行传输。当负载成为瓶颈时候,可能就不会出现延迟。所以对于单个请求来说,耗费50到100毫秒也是可以接受的。这就是所谓的横向扩展(Scaling out)。 扩展在全网域优化中的表现则完全不同,比如确保成功处理一条数据的算法也可成功处理10条、100条甚至100万条数据。无论这种度量类型是是否可行,事件复杂度(大O符号)是最佳描述。延迟是性能扩展杀手。你会想尽办法将所有的运算处理在同一台机器上进行。这就是所谓的纵向扩展(Scaling up)。 如果天上能掉馅饼的话(当然这是不可能的),我们或...
Java程序员-10 发布于 5天前 阅读 262

Java集合的小抄——Java初学者必备

在尽可能短的篇幅里,将所有集合与并发集合的特征,实现方式,性能捋一遍。适合所有”精通Java”其实还不那么自信的人阅读。 List ArrayList 以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。 按数组下标访问元素–get(i)/set(i,e) 的性能很高,这是数组的基本优势。 直接在数组末尾加入元素–add(e)的性能也高,但如果按下标插入、删除元素–add(i,e), remove(i), remove(e),则要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。 LinkedList 以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。 按下标访问元素–get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。 插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作–add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动。 CopyOnWriteArrayList 并发优化的ArrayList。用CopyOnWri...
Java程序员-10 发布于 5天前 阅读 242 点赞 1

开源中国全球专享福利,云栖大会购票大返现!

开源中国为大家带来了全网专享福利!开源中国的会员复制优惠码,在购票时填入,就可以在云栖大会现场开源中国展台处领取现金福利哦!先到先得,赶紧把这个消息传递给好朋友吧,我们云栖大会见!
阿里云栖大会

Java的21个核心技术点,你知道吗?

写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经验,能让大家更好学习和使用Java。   这次介绍的主要内容是和J2SE相关的部分,另外,会在以后再介绍些J2EE相关的、和Java中各个框架相关的内容。   经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容。 1. JVM相关(包括了各个版本的特性)   对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的。   JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。我在面试有超过3年Java经验的开发者的时候, JVM几乎就是一个必问的问题了。当然JVM不是唯一决定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。   在JVM这个大类中,我认为需要掌握的知识有: JVM内存模型和结构 GC原理,性能调优 调优:Thread Dump, 分析内存结构 ...
Java程序员-10 发布于 6天前 阅读 314

Java学习路线图

JAVA学习路线图,特此声明; 仅希望对热爱JAVA学习有所帮助 如若转载或者使用本图,请注明出处,避免后期出现版权问题,谢谢!!!   JAVA学习路线图 此乃是java攻城狮的学习路线图,由简到繁,由易到难,一步步的学习,最后成为 JAVA攻城狮。希望对大家的学习有所帮助 阶段一   1:学习HTML     2:学习CSS    3:Javascript    4:jquery    5:xml解析   6:Bootstrap      阶段二   7:JAVAse基础      8:mysql数据库     9:Powerdesigner   10:JDBC    11:JAVAWEB        阶段三 12:oracle         13:struts2         14:Hibernate       15:Spring 阶段四 16:Maven         17:SpringMVC      18:MyBatis Java学习交流QQ群:184625948  禁止闲聊,非喜勿进!
Java程序员-10 发布于 4天前 阅读 308

Java学习之路——不走弯路,就是捷径

1.如何学习程序设计? Java是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此境界?我想是因为编程语言之间有共通之处,领会了编程的精髓,自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。 1.1 培养兴趣 兴趣是能够让你坚持下去的动力。如果只是把写程序作为谋生的手段的话,你会活的很累,也太对不起自己了。多关心一些行业趣事,多想想盖茨。不是提倡天天做白日梦,但人要是没有了梦想,你觉得有味道吗?可能像许多深圳本地农民一样,打打麻将,喝喝功夫茶,拜拜财神爷;每个月就有几万十几万甚至更多的进帐,凭空多出个"食利阶层"。你认为,这样有味道吗?有空多到一些程序员论坛转转,你会发现,他们其实很乐观幽默,时不时会冒出智慧的火花。 1.2 慎选程序设计语言 男怕入错行,女怕嫁错郎。初学者选择程序设计语言需要谨慎对待。软件开发不仅仅是掌握一门编程语言了事,它还需要其他很多方面的背景知识。软件开发也不仅仅局限于某几个领域,而是已经渗透到了各行各业几乎每一个角落。 如果你对硬件比较感兴...
Java程序员-10 发布于 6天前 阅读 243

深入浅出设计模式——从球赛中悟装饰者模式

装饰者模式,主要用来动态的给一个对象添加一些额外的功能,同时又不改变它的结构。就为对象增加功能这方面,装饰者模式比使用类的继承更加灵活。
珂jack 发布于 6天前 阅读 447 评论 2

回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议

其实本来真的没打算写这篇文章,主要是我得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来。我自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的。 但是,最近问我的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了。 其实之前我写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习这个话题上,而且会尽量写出一些干货。 第一个问题:阿里面试都问什么? 这个是让我最头疼的一个问题,也是群里的猿友们问的最多的一个问题。 说实话,我只能隐约想起并发、JVM、分布式、TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住。而且就算我记住了,也告诉你了,你也背会了,但我觉得,在面试中,你被问到一模一样问题的可能性依然很小。 甚至,就算你运气好被问到了,你也照着背下来了,也不一定就能对你的面试起到正面的作用,因为面试官万一多问一句,你可能就露馅了,那还不如干脆点说不会更好。 我参加的是阿里的社招面试,而社招不同于校招,...
Java程序员-10 发布于 6天前 阅读 234 评论 1

成为Java高手的25个学习要点

想要精通Java,成为Java高手,需要不断的学习和积累。本文给出了Java学习过程中需要注意的25个学习目标,希望可以给您带来帮助。 1. 你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class、object、interaction以及statediagrams。 2. 你需要学习Java语言的基础知识以及它的核心类库(collections、serialization、streams、networking、multithreading、reflection、event、handling、NIO、localization以及其他)。 3. 你应该了解JVM、classloaders、classreflect以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。 4. 如果你将要写客户端程序,你需要学习Web的小应用程序(applet),必需掌握GUI设计的思想和方法,以及桌面程序的SWING、AWT、SWT。你还应该对UI部件的JavaBEAN组件模式有所了解。JavaBEANS也被应用在JSP中以把业务逻辑从表现层中分离出来。 5. 你需要学习Java数据库技术,并且会使用至少一种persistence/ORM构架,例如Hibernate、JDO、CocoBase、TopLink、InsideLiberator(国产JDO红工厂软件)或者iBatis。 6. 你还应该了解对象关系的阻抗失配的含义以及它是如何影...
Java程序员-10 发布于 4天前 阅读 223

写给自己的Java程序员学习路线图

如下是我做开发这几年经常使用一些技术和工具,当然这些技术也都是需要加强的(有些是我一直使用的,不过不深入,有些内部的原理等等不是很清楚) 前端部分:        1)HTML:网页的核心语言,构成网页的基础        2)CSS:使网页更加丰富多彩灿烂的利器        3)JavaScript:使网页动起来的根本,加强了网页和用户之间的交互        4)HTML DOM:换一种更加形象化的角度来看待网页,让我们更加方便的控制网页        5)HTML BOM:与浏览器交互不可或缺的工具        6)JavaScript库,主要是:jQuery及其插件、YUI及其插件,使编写网页更加的方便快捷和健壮的强大工具        7)AJAX:异步提交,增强了用户使用网页的良好交互体验        8)JSON: 比 XML 更小、更快,更易解析的数据传输工具        9)FLEX:提供丰富多彩的动画效果        10)普元工作流:更加清晰明了的帮助用户处理业务流程上面的工作        11)JSP:Servlet的展示层,使网页逻辑与网页设计的显示分离        12)JSTL:加强和简化了JSP页面的开发        13)EL:使JSP页面写起来更加简单 后台部分: ...
Java程序员-10 发布于 6天前 阅读 306

Java项目经验——程序员成长的钥匙

Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发方法 没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧,别人告诉你要实现什么,你就用代码堆砌来实现别人的要求!你必须学会从整个项目的角度去思考!你必须学会假如你是项目经理,你该如何思考!你必须学会假如你是架构师,你该如何思考!你必须掌握针对某个特定问题领域的分析方法! 关于基础知识:你可以看看这些名词或知识点,看是否能说出个一二三四来。 JavaSE ----基本语法、数据类型、操作符等:int、long、Integer、Long、if、else、for、while ----面向对象:class(类)、Object(对象)、instance(实例)、state(状态)、behavior(行为)、field、method、new、可见性(访问控制)、attribute、property、package、import、static variable、class variable、instance variable、heap、method area、stack、GC(垃圾回收)、override、overload、对象转型(casting)、多态、this、super ----异常处理:理解编译期错误和运行...
Java程序员-10 发布于 4天前 阅读 243

Java进阶之路——从初级程序员到架构师,从小工到专家

怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题。希望这篇文章会是你看到过的最全面最权威的回答。 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的。下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法。  1-1 常用数据结构 数组、链表、堆、栈、队列、Hash表、二叉树等 1-2 算法思想 算法时间复杂度和空间复杂度的分析计算 算法思想:递推、递归、穷举、贪心、分治、动态规划、迭代、分枝界限 1-3 经典算法 经典排序:插入排序、冒泡排序、快排(分划交换排序)、直接选择排序、堆排序、合并排序 经典查找:顺序查找、二分查找、二叉排序树查找 1-4 高级数据结构 B+/B-数、红黑树、图等 1-5 高级算法 图的深度优先搜索、图的广度优先搜索、拓扑排序、Dijkstra算法(单源最短路径)、霍夫曼编码、辗转相除法、最小生成树等   二:Java语言基础 诞生不过二十余年的Java语言凭借其跨平台、面向对象、适合于分布式计算的特性,广泛应用...
Java程序员-10 发布于 6天前 阅读 255 点赞 1

假如时光倒流,我会这么学习Java

回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般, 但是分享下我的心得,估计也能帮大家少走点弯路。 [入门] 我在2001年之前是C/C++阵营, 有C和面向对象的基础, 后来转到Java ,发现没有指针的Java真是好简单, 另外Java 的类库好用的让人哭啊。 后来我就看《Thinking in Java》 ,《 Java 核心技术 》, 感觉也不吃力。 如果我之前没学过别的语言,或者半路出家转到计算机行业, 我不会先看上面那两本, 相反我会选《Head First Java》, 这本书非常适合零基础的小白, 读起来轻松搞笑, 不信你看看第一页 但是光看书也挺无趣的,不妨和视频结合着看, 我觉得传智播客的Java基础视频很不错 (唉, 给传智打了个广告), 网上一搜就有,真搜不到就来我的QQ群里吧(群号码:523047986) 注意:视频的好处就是能看到敲代码的过程, 代码是活的, 这点很爽。 如果视频只是按PPT讲编程, 果断扔掉。 书也有书的好处,能写成书的, 肯定是作者经过系统化思考,梳理才能形成的东西, 所以系统性比较强。 书还有其他优点, 例如可以随便的翻, 找到重点反复的看。 所以混合着看经典书+优秀的视频 应该是最好的入门。 Java 入门, 我不会去上培训班,白白浪费钱 ,自...
Java程序员-10 发布于 1周前 阅读 341

假如时光倒流,我会这么学习Java

回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般, 但是分享下我的心得,估计也能帮大家少走点弯路。 [入门] 我在2001年之前是C/C++阵营, 有C和面向对象的基础, 后来转到Java ,发现没有指针的Java真是好简单, 另外Java 的类库好用的让人哭啊。 后来我就看《Thinking in Java》 ,《 Java 核心技术 》, 感觉也不吃力。 如果我之前没学过别的语言,或者半路出家转到计算机行业, 我不会先看上面那两本, 相反我会选《Head First Java》, 这本书非常适合零基础的小白, 读起来轻松搞笑, 不信你看看第一页 但是光看书也挺无趣的,不妨和视频结合着看, 我觉得传智播客的Java基础视频很不错 (唉, 给传智打了个广告), 网上一搜就有,真搜不到就来我的QQ群里吧(群号码:523047986) 注意:视频的好处就是能看到敲代码的过程, 代码是活的, 这点很爽。 如果视频只是按PPT讲编程, 果断扔掉。 书也有书的好处,能写成书的, 肯定是作者经过系统化思考,梳理才能形成的东西, 所以系统性比较强。 书还有其他优点, 例如可以随便的翻, 找到重点反复的看。 所以混合着看经典书+优秀的视频 应该是最好的入门。 Java 入门, 我不会去上培训班,白白浪费钱 ,自...
Java程序员-10 发布于 3天前 阅读 211

Java集合框架综述

最近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们的程序;另一方面是学习借鉴JDK是如何实现了这么一套优雅高效的类库,提升编程能力。 在介绍具体适合类之前,本篇文章对Java中的集合框架做一个大致描述,从一个高的角度俯视这个框架,了解了这个框架的一些理念与约定,会大大帮助后面分析某个具体类,让我们开始吧。 集合框架(collections framework) 首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。Java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。 其实说白了,可以把一个集合看成一个微型数据库,操作不外乎“增删改查”四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这个类了。 设计理念 主要理念用一句话概括就是:提供一套“小而美”的API。API需要对程序员友好,增加新功能时能让程序员们快速上手。 为了保证核心接口足够小,最顶层的接口(也就是Collection与Map接口)并不会区分该集合是否可变(mutability),是否可更改...
Java程序员-10 发布于 5天前 阅读 142

学习Java分为几个阶段,分别是什么?

多年前我自学的时候是很茫然,上网问问题,总是一堆外行的人说很难啊,你需要这样需要那样,不然就是,一堆人说一些空话,多看多写,买好书,我很无语,除了这些就没有自己的一些想法吗?  首先很多人认为学JAVA要C的基础,但是实际上不用,学开车,我不想先学骑自行车,没有必要。 第一阶段:  1. JAVA语法和基础,包括循环。。和类的相关内容,如实现,继承什么的  2. 你需要掌握几个重点的集合,List接口的两个子类LinkedList,ArrayList;然后是Map几口的两个子类HashMap,HashTable;Set接口 掌握List后学Set就容易了;掌握Collection和Collections的区别  3. 掌握IO一章,重点的几个流 InputStream,OuputStream;BufferedReader,BufferedWrite;  ObjectInputStream, ObjectOutputStream,,PrintWriter,FileReader,FileWriter了解JAVA的序列化,掌握JAVA的File类  4. JDBC非常重要,重点掌握Connection,PreparedStatement, Statement,ResultSet,  其他的可以在学习或项目中如果碰到再学,但早期重点掌握前面几个,其他了解足够,  数据库建议新手用MySql,下载Navicat for MySQL管理工具  5.如果你想快速上手的话,那么你需要跳过这些,  包括:线程,网络...
Java程序员-10 发布于 5天前 阅读 132 点赞 1

一位资深程序员大牛给予Java初学者的学习路线建议

Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。   在大家看之前,我要先声明两点。1、由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。   如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学。   一、Java基础首先去找一个Java的基础教程学一下,这里可以推荐一个Java学习交流的QQ群(群号码:523047986)你可以到这个群里找相应的视频教程。学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下...
Java程序员-10 发布于 5天前 阅读 146

Java项目经验——程序员成长的钥匙

Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发方法 没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧,别人告诉你要实现什么,你就用代码堆砌来实现别人的要求!你必须学会从整个项目的角度去思考!你必须学会假如你是项目经理,你该如何思考!你必须学会假如你是架构师,你该如何思考!你必须掌握针对某个特定问题领域的分析方法! 关于基础知识:你可以看看这些名词或知识点,看是否能说出个一二三四来。 JavaSE ----基本语法、数据类型、操作符等:int、long、Integer、Long、if、else、for、while ----面向对象:class(类)、Object(对象)、instance(实例)、state(状态)、behavior(行为)、field、method、new、可见性(访问控制)、attribute、property、package、import、static variable、class variable、instance variable、heap、method area、stack、GC(垃圾回收)、override、overload、对象转型(casting)、多态、this、super ----异常处理:理解编译期错误和运行...
Java程序员-10 发布于 1周前 阅读 284 点赞 1

从程序员到CTO的Java技术路线图

在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了。但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平。    Java程序员 高级特性               反射、泛型、注释符、自动装箱和拆箱、枚举类、可变               参数、可变返回类型、增强循环、静态导入         核心编程              IO、多线程、实体类、              集合类、正则表达式、              XML和属性文件              图形编程              AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace         网路编程             Applet、Socket/TCP/UDP、NIO、RMI、CORBA        Java语法基础            类、抽象类、接口、最终类、静态类、匿名类、内部类、异常类、编码规范       Java开发环境           JDK、JVM、Eclipse、Linux Java核心编程技术 Java,设计而又非常精巧的语言。学习Java,须从Java开发环境开始,到Java语法,再到Java的核心API。        ...
Java程序员-10 发布于 5天前 阅读 118

java 多线程快速入门

这里将了解以下信息: 1.线程与进程 2.为什么要使用多线程? 3.多线程应用场景 4.多线程创建方式 5.线程生命周期 6.面试总结 一、线程与进程         每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。         使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。         如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换,更多的线程需要更多的内存空间,线程的中止需要考虑其对程序运行的影响。通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。     总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径。 二、为什么要使用多线程?     比如搬运东西,如果一个人一小时只能般一块砖,那么1...
橙子hhh 发布于 4小时前 阅读 2

eclipse 设置注释模板详解,与导入模板方法介绍总结

在开发中进入项目组,一定要先问下项目经理,有没有这个代码注释模板,然后倒入到你的eclipse 中,还有注意设置 utf-8 。下面就是导入注释模板的方法: 1.设置UTF-8 在 windows  下的 preference  的 General 的 workspace 下面更改! 2.导入你们项目组的 注释模板 打开Window->Preferences->Java->Code Style->Code Templates 点击import 导入你模板即可! 3.接下来修改这个模板基本信息 关于这个配置文件的详细解释可以浏览其他网址: http://www.cnblogs.com/senzjx/archive/2009/09/21/1570950.html
橙子hhh 发布于 5小时前 阅读 4

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

POJ 1979 搜索 水题

题意:给你一个row*col的矩阵,上面的'#'代表你不能走的地方,'.'表示你能走的地方,'@'表示你的起点,问你最多能走多少格。   dfs #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <queue> #define LL long long int const MAX = 1e6 + 1; int const INF = 1 << 30; double const EPS = 0.00000001; using namespace std; int mp[20][20], n, m, ans = 0, dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; char s[21]; void dfs(int x, int y){ mp[x][y] = 0; for (int k = 0; k < 4; k++){ int nx = x + dir[k][0], ny = y + dir[k][1]; if (nx >= 0 && ny >= 0 && nx < n && ny < m && mp[nx][ny]){ ans++; dfs(nx, ny); } } } int main(){ freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); int x, y; while (scanf("%d%d", &m, &n), n + m){ for (int i = 0; i < n; i++){ scanf("%s", s); for (int j = 0; j < m; j++){ mp[i][j] = (s[j] == '#' ? 0 : 1)...
阿豪boy 发布于 6小时前 阅读 3

学习Java8函数式编程(二)

本篇博客会带领大家认识神奇的Lambda表达式。刚开始看见Lambda表达式的时候,我的头上顶着一个大大的问号。其实Lambda表达式并不难,待我慢慢讲解。
cnbo 发布于 6小时前 阅读 1

springmvc 重定向传递参数

springMVC 重定向是 有 方法可以 传递参数的, 以前 都是 丢进去session里面。这样也是可以的。 可是 springMVC 有了的话,直接使用更好。 重定向的时候 ``` addAttribute(key,value) 是 设置的参数 评价到url中,类似于 get 请求拼接参数一样的。 而 addFlashAttribute(key,value) 原理是 使用session 来做的。 其实是将 参数 放入了一个map 里面, 即 FlashMap 。只是参数隐藏了,不用拼接url的。而是放入了 Model 里面了 ```
之渊 发布于 7小时前 阅读 1

微信公众号H5支付遇到的那些坑

## 简史 官方文档说的很清楚,商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程。 当然,最近微信支付平台也加入了纯H5支付,也就是说用户可以在微信以外的手机浏览器请求微信支付的场景唤起微信支付。 当然,今天的主角是微信公众号支付,其实也不一定非在公众号中打开,只要在微信中打开就可以使用。 ## 实现 项目使用的springboot微服务来实现,以下都是简单的伪代码实现,具体逻辑见[码云](https://git.oschina.net/52itstyle/spring-boot-pay "码云")。 ## Main 其实就是一个初始化下单操作,前台业务逻辑在这就不展示了,这个就是接收前台参数的方法: ```java @RequestMapping("/pay") public String pay(Product product,ModelMap map) { logger.info("H5支付(需要公众号内支付)"); String url = weixinPayService.weixinPayMobile(product); return "redirect:"+url; } ``` 产品实体Bean: ```java /** * 产品订单信息 * 创建者 科帮网 * 创建时间 2017年7月27日 */ @Data @NoArgsConstructor @AllArgsConstructor public class Product implements Serializable { private static final long serialVersion...
小柒2012 发布于 8小时前 阅读 4

POJ 3070 简单快速幂

. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define LL long long int const MAX = 1e6 + 1; int const INF = 1 << 30; double const EPS = 0.00000001; using namespace std; int mod = 10000; struct Mat { int m[2][2]; }; Mat operator * (Mat& a, Mat& b){ Mat res; res.m[0][0] = (a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[1][0]) % mod; res.m[0][1] = (a.m[0][0] * b.m[1][0] + a.m[0][1] * b.m[1][1]) % mod; res.m[1][0] = (a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[1][0]) % mod; res.m[1][1] = (a.m[1][0] * b.m[1][0] + a.m[1][1] * b.m[1][1]) % mod; return res; } Mat pow_mod(Mat a, int n){ if (n == 1) return a; Mat ans = pow_mod(a, n >> 1); ans = ans * ans; if (n & 1) ans = ans * a; return ans; } int main(){ int n; Mat a; a.m[0][0] = a.m[0][1] = a.m[1][0] = 1; a.m[1][1] = 0; while (scanf("%d", &n), n + 1){ printf("%d\n", n ? pow_mod(a, n).m[0][1] : 0); } return...
阿豪boy 发布于 9小时前 阅读 4

SpringBoot笔记7:WebMvcConfigurerAdapter 常用配置

@Component @Configuration public class WebConfig extends WebMvcConfigurerAdapter { Logger logger= LoggerFactory.getLogger(this.getClass()); //使用阿里 FastJson 作为JSON MessageConverter @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter4 converter = new FastJsonHttpMessageConverter4(); FastJsonConfig config = new FastJsonConfig(); config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,//保留空的字段 SerializerFeature.WriteNullStringAsEmpty,//String null -> "" SerializerFeature.WriteNullNumberAsZero);//Number null -> 0 converter.setFastJsonConfig(config); converter.setDefaultCharset(Charset.forName("UTF-8")); converters.add(converter); } //注册自定义的拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); } //处理业务抛...
HGMrWang 发布于 11小时前 阅读 5

eclipse跑起来还是报Java.lang.OutOfMemoryError: PermGen space。

项目 比较大,包有点多,,,刚开始的时候, eclipse 导入项目的时候,爆 OutOfMemoryError 。 然后 调大了 eclipse的 安装目录里卖的 ini 文件, 可是 使用 eclipse 里面的 Tomcat 同时启动两个项目的时候 出现了 Java.lang.OutOfMemoryError: PermGen space。 百度了一下 ,,, 要在 eclipse run 里面配置的, 我还以为要在 Tomcat 的 里面配置呢。 点击“Run” – “Run Configurations…”,选中Tomcat Server,进入Arguments分页,在VM arguments中加入提升初始分配空间的参数 。
之渊 发布于 12小时前 阅读 4

集合框架

1.HashSet集合框架 hashSet集合的添加方法上次已经讲过了,我们接下来要在maven工程下来讲其他的一些方法了: 如上图,把环境弄好。 写个循环来测试一下能否存储值: 其运行结果如: 其实我们自己写的hashSet的添加方法的objs数组长度只定义为了10,这是不太够的,我最好都要给定到1000,或者更多一点。这个长度定大一点,集合的运行速度就会更加快一点。 哈希集合的特点在于检索速度非常快,链表数组删除、修改比较灵活方便、然后就是数组集合的添加比较快。其中数组集合和链表集合是有序集合,而哈希集合是无序集合,它添加进去的【学Java,到凯哥学堂kaige123.com】数据的顺序是打乱的。哈希集合的特点在于检索速度非常快,我们这里有junit来测试一下它的检索速度到底怎么样,先把junit的依赖加进来: 然后,我们写个junit的测试案例代码,测试一下ArrayList和HashSet两种集合的检索时间的差别: 由上图,我们可以看出,ArrayList的检索速度和HashSet的检索速度比起来简直是太慢了。 自己写一个检索方法: 哈希里面存储数据时用到的是链表集合的方式,我们在检索一个集合中有没有该数据时,要先把这个数据的hash值计算出来,找到相应的位置,然后再到对应位置下的单链里...
凯哥学堂 发布于 13小时前 阅读 7

JVM - 类文件结构

class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,没有空隙和分隔符。当遇到需要占用8位以上的空间时,按照高位在前的方式分割成若干个8位字节存储。 class文件中只有两种数据类型:无符号数和表。 无符号属于基本的数据类型,以u1、u2、u4、u8来代表1个字节、2个字节、4个字节和8个字节的无符号数。无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串常量。 表是由多个无符号数或者其他表作为数据项构成的符合数据类型,所有表习惯性的以”_info“结尾。整个class文件本质就是一张表,由多个数据项构成: 魔数:u4,CAFEBABE Class文件的版本号:u2次版本号,u2主版本号,java版本号从45开始。高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式未发生改变,虚拟机也必须拒绝超过版本号的Class文件。 常量池:由于数量不固定,常量池前放置u2类型的数据,代表常量池计数值,这个容量计数值从1开始。设计者将0项常量空出来是为了满足后面某些指向常量池的索引值的数据在特殊情况下需要表达”不引用任何一个常量池项目“的含义。对于其他表类型都是从0开始。 常...
itititit 发布于 13小时前 阅读 6

c语言struct结构体

c语言struct结构体
蜗牛奔跑 发布于 13小时前 阅读 4

tp 多表查询与if显示

$user_id = session('uid'); $data['user_id'] = $user_id; $appointment = M('appointment'); $count = $appointment->join('tb_order ON tb_appointment.order_id = tb_order.order_id')->where($data)->count(); $Page = new \Think\Page($count,15); $Page->setConfig('header', '<li class="rows"> '.getLanguage('第').'<b>%NOW_PAGE%</b>'.getLanguage('页').'/'.getLanguage('共').'<b>%TOTAL_PAGE%</b>'.getLanguage('页').'</li>'); $Page->setConfig('prev', getLanguage('上一页')); $Page->setConfig('next', getLanguage('下一页')); $Page->setConfig('last', getLanguage('末页')); $Page->setConfig('first', getLanguage('首页')); $Page->setConfig('first', getLanguage('首页')); $Page->setConfig('theme', '%FIRST%%UP_PAGE%%LINK_PAGE%%DOWN_PAGE%%END%%HEADER%'); $Page->rollPage=8; $show = $Page->show(); $list = $appointment->join('tb_order ON tb_appointment.order_id = tb_order.order_id')->where($data)->limit($Page->firstRow.','.$Page->listRows)->order('date desc...
wenjin312 发布于 13小时前 阅读 1

HDU 1944 && 1536 SG NIM 博弈

题意:首先输入K 表示一个集合的大小 之后输入集合 表示对于这对石子只能去这个集合中的元素的个数 之后输入一个m 表示接下来对于这个集合要进行m次询问  之后m行 每行输入一个n 表示有n个堆 每堆有n1个石子 问这一行所表示的状态是赢还是输 如果赢输入W否则L 234ms #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 10001 int f[N], sg[N]; bool mex[N]; void get_sg(int t, int n){ int i, j; memset(sg, 0, sizeof(sg)); for (i = 1; i <= n; i++){ memset(mex, 0, sizeof(mex)); // 对于属于g(x)后继的数置1 for (j = 0; j < t && f[j] <= i; j++) mex[sg[i - f[j]]] = 1; // 找到最小不属于该集合的数 for (j = 0; j <= n; j++) if (!mex[j]) break; sg[i] = j; } } int main(){ int k, m, n, i, t, temp; while (scanf("%d", &k) && k){ for (i = 0; i < k; ++i) scanf("%d", &f[i]); sort(f, f + k); get_sg(k, N); scanf("%d", &m); while ...
阿豪boy 发布于 13小时前 阅读 3

同步工具类 -- CyclicBarrier

一、概述 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point),也可以称为 栅栏;与 CountDownLatch 类相似,但是它有一些特殊性让它成为更强大的类。 特点:栅栏用于等待其它线程,且会阻塞自己当前线程;           所有线程必须同时到达栅栏位置后,才能继续执行; CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量。当其中一个线程到达确定点,它会调用await() 方法来等待其他线程。当线程调用这个方法,CyclicBarrier阻塞线程进入休眠直到其他线程到达。当最后一个线程调用CyclicBarrier 类的await() 方法,它唤醒所有等待的线程并继续执行它们的任务。 二、应用场景 需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier。 三、实现 eg1:赛跑时,等待所有人都准备好时,才起跑 import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * 赛跑时,等待所有人都准备好时,才起跑 */ public class Runner implements Runnable{ private CyclicBarrier cyclicBarrier; private String name; public Runner(CyclicBar...
pan_1308 发布于 13小时前 阅读 4

springmvc 不指定访问路径后缀都会匹配的

今天 玩 springMVC 发现一个特别有意思的 地方。 比如我这个项目, springMVC 匹配的路径 是 / 全路径,没有 和一般的项目一样,指定访问的 前后缀 比如: ``` springMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath*:config/main/spring-mvc.xml 1 springMVC / ``` 然后我再 访问的时候,,, 比如有一个 conller 方法: 匹配的路径是 : ``` @RequestMapping({ "/index", "/" }) ``` 我以为 它会匹配 / 和 index . 可是如果我输入 /indexaaa 这样的 /index* 就会爆 404 错误。 如果 我 输入 /index.sss 这样的 /index.* 这样的 去访问 大部分是 匹配的还是 /index这个方法,可以匹配到的。 但是有一点,,, 如果是 /index.html 或者 /index.jsp 这样的就会 去访问 根目录下的 对应 index.jsp 或者 index.html 文件了,,,有就返回,没有就爆404 。。。 或者 /index/* 也匹配不到的 。 这个就是 springMVC 路径映射的 一个 特点吧,,, 难怪 一般项目 spring mvc 都指定了 /*.html , /*.do 这样的后缀,,, 刚开始 还以为的是为了 统一 管理后期好维护,,,估计 也是 因为 匹配的规则 的原因吧。...
之渊 发布于 13小时前 阅读 2

phantomjs字体设置(Ubuntu)

phantomjs字体设置(Ubuntu)
colin_86 发布于 14小时前 阅读 3

10分钟教你用会Shiro

前言 欢迎来到Apache Shiro 10分钟之旅! 希望通过这个简单、快速的示例,可以让你对应用程序中使用Shiro有个深入的了解。嗯,10分钟你应该可以搞定它。 概述 Apache Shiro是什么? Apache Shiro一个功能强大,使用简单的Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案。 实际上,Shiro的主要功能是管理应用程序中与安全相关的全部,同时尽可能支持多种实现方法。Shiro是建立在完善的接口驱动设计和面向对象原则之上的,支持各种自定义行为。Shiro提供的默认实现,使其能完成与其他安全框架同样的功能,这不也是我们一直努力想要得到的吗! 那么Apache Shiro能用来做什么呢? 很多,很多,嘿嘿。但是不在快速指南中做介绍,如果你想知道,那怎么办呢?去这里找寻你的答案吧。当然如果你还想知道我们什么时候,以及为什么要"创造"Shiro,去看看Shrio的历史和使命吧。 OK,现在让我们动手做点儿什么吧。 注:Shiro可以在任何环境下运行,小到最简单的命令行应用,大到大型的企业应用以及集群应用。但是我们准备在快速指南中使用最最简单的main方法的方式,让你对Shiro的API有个感官的认识。 下载 确保已经安装了JDK1.5+和Maven2.2+ 去...
孤独成性 发布于 14小时前 阅读 9

Laravel思维导图之Laravel入门指南

4张思维导图看 Laravel 入门指南。
精进吧Aaron 发布于 14小时前 阅读 98 点赞 1

classloader总结

classloader基础知识 1、三类classloader 1.1、BootStrapClassLoader,该classloader为顶级类加载器,加载java的核心类库(jre/lib),通过URL[] urls = Launcher.getBootstrapClassPath().getURLs();可以获取到所加载类包: file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/resources.jar file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/rt.jar file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/sunrsasign.jar file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/jsse.jar file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/jce.jar file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/charsets.jar file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/jfr.jar file:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/classes   1.2、ExtClassLoader,称为扩展加载起,加载java扩展类库(jre/lib/ext),可以通过 URL[] urls = ((U...
白中墨 发布于 14小时前 阅读 5

快速了解人工智能结晶之语音转换文字

科技解放生产力,人工智能的应用如今是大热,那么今天就来给各位介绍一下IBM在这方面的一个小的尝试,语音转换文字。咱们来看一看相较于传统的转换,结合Watson的IBM是如何做到让识别率飙升的。
IBM Bluemix

曲线点抽稀算法-Python实现

## 何为抽稀 >在处理矢量化数据时,记录中往往会有很多重复数据,对进一步数据处理带来诸多不便。多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不光滑或不符合标准。因此要通过某种规则,在保证矢量曲线形状不变的情况下, 最大限度地减少数据点个数,这个过程称为抽稀。 通俗的讲就是对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度保持原有形状。比较常用的两种抽稀算法是:道格拉斯-普克(Douglas-Peuker)算法和垂距限值法。 ## 道格拉斯-普克(Douglas-Peuker)算法 Douglas-Peuker算法(DP算法)过程如下: * 1、连接曲线首尾两点A、B; * 2、依次计算曲线上所有点到A、B两点所在曲线的距离; * 3、计算最大距离D,如果D小于阈值threshold,则去掉曲线上出A、B外的所有点;如果D大于阈值threshold,则把曲线以最大距离分割成两段; * 4、对所有曲线分段重复1-3步骤,知道所有D均小于阈值。即完成抽稀。 这种算法的抽稀精度与阈值有很大关系,阈值越大,简化程度越大,点减少的越多;反之简化程度越低,点保留的越多,形状也越趋于原曲线。 下面是Python代码实现: ```python # -*- coding: utf-8 -*- """ -----------------...
j_hao104 发布于 4天前 阅读 819 评论 1 点赞 2

PHP实现依赖注入

控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征。控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。
o0无忧亦无怖 发布于 2周前 阅读 1968 评论 36 点赞 8

Java使用Hutool实现AES、DES加密解密

在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。
路小磊 发布于 2周前 阅读 2402 评论 21 点赞 9

SQL注入详解

日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些常用的攻击技术和防范策略。 SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。
暴雪首席执行官 发布于 2周前 阅读 3690 评论 20 点赞 4

使用Spring自定义注解实现任务路由

在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器。其本质就是通过外部参数进行一次路由和Spring mvc做的事情类似。简单看了Spring mvc的实现原理之后,决定使用自定义注解的方式来实现以上功能。 ### 自定义TaskHandler注解 ```java @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface TaskHandler { String taskType() default ""; } ``` 以上定义了任务处理器的注解,其中@Component表示在spring 启动过程中,会扫描到并且注入到容器中。taskType表示类型。 ### 任务处理器定义 ```java public abstract class AbstractTaskHandler { /** * 任务执行器 * * @param task 任务 * @return 执行结果 */ public abstract BaseResult execute(Task task); } ``` 以上定义了一个任务执行的处理器,其他所有的具体的任务执行器继承实现这个方法。其中Task表示任务的定义,包括任务Id,执行任务需要的参数等。 ### 任务处理器实现 接下来,我们可以实现一个具体的任务处理器。 ```jav...
wangyan9110 发布于 3周前 阅读 3336 评论 8 点赞 8

Golang依赖管理工具:glide从入门到精通使用

## 介绍 不论是开发Java还是你正在学习的Golang,都会遇到**依赖管理**问题。Java有牛逼轰轰的Maven和Gradle。 Golang亦有godep、govendor、glide、gvt、gopack等等,本文主要给大家介绍[gilde](https://github.com/Masterminds/glide)。 glide是Golang的包管理工具,是为了解决Golang依赖问题的。 为什么需要glide? 原因很简单,Go 语言原生包管理的缺陷。罗列一下golang的 get 子命令管理依赖有很多大缺陷: * 能拉取源码的平台很有限,绝大多数依赖的是 github.com * 不能区分版本,以至于令开发者以最后一项包名作为版本划分 * 依赖 列表/关系 无法持久化到本地,需要找出所有依赖包然后一个个 go get * 只能依赖本地全局仓库(GOPATH/GOROOT),无法将库放置于局部仓库($PROJECT_HOME/vendor) ## 安装 ### Golang环境设置 采用vendor目录特性,Go 1.5 做为试验特性加入(需要指定 GO15VENDOREXPERIMENT=1 环境变量),并在 Go 1.6 正式引入的一个概念。多数 go 依赖解决方案都基于它的。GO15VENDOREXPERIMENT 是 Go 1.5 版本新增的一个环境变量,如果将值改为 1 则表示启用。它可以将项目根目录名为 vendor 的目录添加到 Go 的库搜寻路径中,实现一个局部依赖的效果...
梦朝思夕 发布于 1个月前 阅读 3030 评论 22 点赞 7

Spring思维导图,让Spring不再难懂(mvc篇)

>写在前面 生活就像海洋,只有意志坚强的人才能到达彼岸。已经很久没有发文章了呀,想必大家都挂念我了,哈哈。 温故而知新,今天一起来复习一下spring mvc的内容吧。 >spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。 ![原理.png](http://upload-images.jianshu.io/upload_images/4120002-9409cf62de5e6d39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * (1) Http请求:客户端请求提交到DispatcherServlet。 * (2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。 * (3) 调用处理器:DispatcherServlet将请求提交到Controller。 * (4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。 * (6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 * (8) Http响应:视图负责将结果显示到客户端。 >主要注解 ![spring mvc注解....
java思维导图 发布于 1个月前 阅读 10967 评论 29 点赞 35

java lambda方法引用总结——烧脑吃透

lambda是java8的新特性,基本使用比较容易理解,但有一个环节遇到了坎儿,那就是方法引用,尤其是类的实例方法引用,烧脑之后总结一下。 在需要函数参数的方法中,我们可以把另一个同类型的方法直接传入,这称为方法引用的绑定。类似于C语言中的函数指针。 lambda表达式可以替代方法引用;或者说方法引用是lambda的一种特例,方法引用不可以控制传递参数。 ### 4.1) 构造器引用 ```java private Person construntorRef(Supplier sup){ Person p=sup.get(); return p; } @Test public void testConstructorRef(){ Person p=construntorRef(Person::new); System.out.println(p); } ``` 需要有无参的构造器。 ### 4.2) 静态方法引用 ```java private static void print(String s){ System.out.println(s); } @Test public void testStaticRef(){ Arrays.asList("aa","bb","cc").forEach(TestMethodReference::print); } ``` so easy,只要静态方法的参数列表和FI需要的参数一致就可以。 ### 4.3) 成员方法引用 ```java @Test public void testMemberMethodRef(){ Arrays.asList("aa","bb","cc").forEach(System.out::println); } ``` so easy,只要成员方法的参数列表和FI需...
polly 发布于 2个月前 阅读 3899 评论 21 点赞 8

现代c++开发利器folly教程系列之:dynamic

一、前言        用过python、php等动态类型语言的人肯定对动态数据类型不陌生。对于定义时不确定、运行时才确定的数据类型,使用动态类型是非常方便的。c++是一门不折不扣的静态类型语言,那么是否就无缘享受“动态”类型的好处了呢?不尽然。folly为我们提供了dynamic类型,从一定程度上实现了c++中的“动态”数据类型,为什么说是“一定程度上”呢,因为dynamic类型只支持c++中的基本类型(部分)和复合类型(array和map),不支持自定义类型。你可能会把dynamic和boost::any或std::any(将在c++17中支持)进行对比,但是其实它们没有可比性,首先是它们的实现原理不同。boost::any虽然可以盛放任何类型,但是它在实现上是用继承的方式进行了类型擦除,因此在还原类型时,需要程序员自己显示的提供类型信息,这也是boost::any的缺点之一。而dynamic虽然代表的类型有限,但是dynamic本身可以记住类型,便于赋值和还原。因此,dynamic不是boost::any的替代品,更像是一种补充,如果非要类比的话,dynamic和boost::variant更为相似。 二、类型支持       如前文所述,dynamic可以盛放的类型是有限的,它可以盛放部分基本类型、字符串类型、数组类型和OBJECT(本质为m...
黑客画家 发布于 4个月前 阅读 2661 评论 8 点赞 2

Java泛型总结

什么是泛型 --- 泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr14的实现。 泛型机制将类型转换时的类型检查从运行时提前到了编译时,使用泛型编写的代码比杂乱的使用object并在需要时再强制类型转换的机制具有更好的可读性和安全性。 泛型程序设计意味着程序可以被不同类型的对象重用,类似c++的模版。 泛型对于集合类尤其有用,如`ArrayList`。这里可能有疑问,既然泛型为了适应不同的对象,`ArrayList`本来就可以操作不同类型的对象呀?那是因为没有泛型之前采用继承机制实现的,实际上它只维护了一个`Object`对象的数组。结果就是对List来说它只操作了一类对象`Object`,而在用户看来却可以保存不同的对象。 泛型提供了更好的解决办法——类型参数,如: ```js List list = new ArrayList(); ``` 这样解决了几个问题: 1 可读性,从字面上就可以判断集合中的内容类型; 2 类型检查,避免插入非法类型。 3 获取数据时不在需要强制类型转换。 泛型类 --- ```java public class Pair{ private T field1; } ``` 其中 `` 是类型参数定义。 使用时:`Pair p = new Pair();` 此时类内部的`field1`就是字符串类型了。 如果引用多个类型,可以使用逗号...
polly 发布于 4个月前 阅读 5016 评论 8 点赞 17

SSM(十一) 基于dubbo的分布式架构

![dubbo.jpg](https://ooo.0o0.ooo/2017/04/06/58e649d664665.jpg) # 前言 现在越来越多的互联网公司还是将自己公司的项目进行服务化,这确实是今后项目开发的一个趋势,就这个点再凭借之前的`SSM`项目来让第一次接触的同学能快速上手。 # 浅谈分布式架构 `分布式架构`单看这个名字给人的感觉就是高逼格,但其实从历史的角度来分析一下就比较明了了。 > 我们拿一个电商系统来说: ## 单系统 ![E65B5547-AF84-4D31-836D-72892C7AC7EA.png](https://ooo.0o0.ooo/2017/04/06/58e651937130f.png) 对于一个刚起步的创业公司项目肯定是追求越快完成功能越好,并且用户量也不大。 这时候所有的业务逻辑都是在一个项目中就可以满足。 ## 垂直拆分-多应用 ![QQ20170406-230056@2x.jpg](https://ooo.0o0.ooo/2017/04/06/58e65856cf18a.jpg) 当业务量和用户量发展到一定地步的时候,这时一般会将应用同时部署到几台服务器上,在用户访问的时候使用`Nginx`进行反向代理和简单的负载均衡。 ## SOA服务化 当整个系统以及发展的足够大的时候,比如一个电商系统中存在有: * 用户系统 * 订单系统 * 支付系统 * 物流系统 等系统。 如果每次修改了其中一个系统就要重新发布上线的话那么耦合就...
crossoverJie 发布于 4个月前 阅读 4508 评论 9 点赞 10

Google Protobuf 协议+Socket实现异步登录

> 背景:公司登录基础服务是C开发,业务是Java开发,需要Java调用C的服务验证登录、获取登录信息 > 实现方式: * 交互通过发送Socket通讯,socket连接池,Google Protobuf 协议,发送心跳保持TCP连接 * 自定义ExecutorCompletionService,实现一个包含Map>> https://github.com/shawntime/shawn-common-utils/tree/master/src/main/java/com/shawntime/common/socket ### Google Protobuf 协议定义 定义.proto文件:头文件(head_outer_class.proto)、登录(login_logic.proto)、心跳(login_proxy.proto) * 字段类型:bool,int32,float,double,string * 支持消息嵌套 * 支持enum * 索引号要按顺序指定 * 字段前缀:required:必须的;optional:可选的;repeated:可以重复的 ``` package qiqi; enum ENUM_HEAD_TYEP { enum_cs_head_type_cs = 0x1; //0x1表示CSHead enum_cs_head_type_sc = 0x2; //0x2表示SCHead enum_cs_head_type_ss = 0x3; //0x3表示SSHead }; enum ENUM_CS_HEAD_COMMAND { enum_cs_head_cmd_medal = 0x1; //勋章系统 enum_cs_head_cmd_login = 0x2; //登录系统 enum_cs_head_cmd_guild = 0x3; //公会推荐 enum_cs_head_cmd_user_info = 0x4; //用户信息 };...
shawntime 发布于 5个月前 阅读 2604 评论 11 点赞 1

Python进阶篇二:Python模块

Python的强大之处有许多,其中重要的一点就是Python包含许多的第三方库。因此,懂得如何制作、导入自制模块或第三方模块就显得非常重要。此外,熟悉python模块的查看方式有利于编程者缩短python语言的学习使用时间。本文从python模块的制作、导入、查看和使用入手,重点介绍在WINDOWS环境下如何处理和使用python模块。最后一部分介绍一些python常用的模块供读者参考。
SamYjy 发布于 5个月前 阅读 2275 点赞 3

花十分钟时间给JFinal写了个talent-aio插件。。。

本人 JFinal脑残粉,最近公司几个项目都需要跟硬件交互,这就得用到长连接,之前一直没接触过该领域,本来还想花时间研究下netty,讲真挺难啃的,找资料的时候翻到 talent-aio,略微了解发现似乎学习成本极低,没想到作者本人也极其nice,解答我这个门外小伙子好多个问题,顺利用上此框架,刚好解了我的燃眉之急。 什么是 talent-aio? talent-aio是基于java aio实现的即时通讯框架,源于作者另一个久经考验的talent-nio框架,但在易用性、性能及代码可读性方面又远远超越了talent-nio。 顺便放上传送门:https://my.oschina.net/talenttan/blog/863545 废话不说,下面正题: 下载talent-aio的demo,demo极其简单,主要还是看HelloAbsAioHandler这个类的编码协议,剩下的就是看Aio的类了,api 貌似都在这。具体不介绍了,上面有链接,要注意的是Client端与Server端协议要一致。在这里说下我之前踩的坑,比如talent-aio的demo代码中的协议是有header的,Server端对客户端没有要求,但必须遵循交互协议,所以若是你用百度出来的socket实例连Server要注意,这里我们用回本身提供的Client代码就可以了。 导入talnet-aio依赖。 <dependency> <groupId>com.tale...
小徐同学 发布于 5个月前 阅读 6783 评论 27 点赞 27 打赏 1

长URL转短连接的简单设计与实现

非常多的时候,我们不想在分享的时候采用长长的链接,主要的原因有: URL太长占显示空间、难于输入,转成二维码点点小,难于识别 长的URL提供的信息太多,不利于信息安全,甚至容易造成倒库 其他理由...... 今天的理由不是重点,重点是如何用一点点代码实现这个短链接的生成。 我们的注意点有: 生成的短链接地址长度可调整,毕竟不能因为4位、5位、6位的长度变化就让我们重新写一套程序 要有防冲突处理机制,不能因为算法导致两个长链接地址生成的短地址一样就把前一个覆盖掉 有时候,一个地址用过之后觉得不需要使用了,哪么这个地址失效之后,短地址可以有效收回。 首先设计接口 /** * Created by luoguo on 2017/3/16. */ public interface UrlShortener { /** * 设置产生短链接长度 * @param length * @return */ void setLength(int length); /** * 返回短链接长度 * @return */ int getLength(); /** * 返回指定地址对应的短链接 * @param url * @return */ String get(String url); /** * 存储对应关系 * @param url * @param shortUrl */ voi...
悠悠然然 发布于 5个月前 阅读 5000 评论 38 点赞 4

使用 Elastic Stack 来监控和调优 Golang 应用程序

Golang 因为其语法简单,上手快且方便部署正被越来越多的开发者所青睐,一个 Golang 程序开发好了之后,势必要关心其运行情况,今天在这里就给大家介绍一下如果使用 Elastic Stack 来分析 Golang 程序的内存使用情况,方便对 Golang 程序做长期监控进而调优和诊断,甚至发现一些潜在的内存泄露等问题。   Elastic Stack 其实是一个集合,包含 Elasticsearch、Logstash 和 Beats 这几个开源软件,而 Beats 又包含 Filebeat、Packetbeat、Winlogbeat、Metricbeat 和新出的 Heartbeat,呵呵,有点多吧,恩,每个 beat 做的事情不一样,没关系,今天主要用到 Elasticsearch、Metricbeat 和 Kibana 就行了。   Metricbeat 是一个专门用来获取服务器或应用服务内部运行指标数据的收集程序,也是 Golang 写的,部署包比较小才10M 左右,对目标服务器的部署环境也没有依赖,内存资源占用和 CPU 开销也较小,目前除了可以监控服务器本身的资源使用情况外,还支持常见的应用服务器和服务,目前支持列表如下: Apache Module Couchbase Module Docker Module HAProxy Module kafka Module MongoDB Module MySQL Module Nginx Module PostgreSQL Module Prometheus Module Redis Modu...
Medcl 发布于 6个月前 阅读 2580 评论 18 点赞 13

聊聊Java的泛型及实现

和C++以模板来实现静多态不同,Java基于运行时支持选择了泛型,两者的实现原理大相庭径。C++可以支持基本类型作为模板参数,Java却只能接受类作为泛型参数;Java可以在泛型类的方法中取得自己泛型参数的Class类型,C++只能由编译器推断在不为人知的地方生成新的类,对于特定的模板参数你只能使用特化。在本文中我主要想聊聊泛型的实现原理和一些高级特性。
suemi94 发布于 6个月前 阅读 2794 评论 11 点赞 5

C#开发人员应该知道的13件事情

本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助。 1. 开发过程 开发过程是错误和缺陷开始的地方。使用工具可以帮助你在发布之后,解决掉一些问题。 编码标准 遵照编码标准可以编写出更多可维护的代码,特别是在由多个开发人员或团队编写和维护的代码库中。例如FxCop,StyleCop和ReSharper等,就是常用的实施编码标准的工具。 开发人员:在压缩代码之前,请使用工具仔细检查是否违反了标准,并且对结果进行分析。使用工具发现的代码路径问题,不比你预期的少。 代码审查 代码审查和结对编程是任务开发人员审查他人编写的源代码的常见做法。通过这些方式希望能够检查出作者的错误,如编码错误或实现错误。 代码审查是一个很有价值的做法,但是它依赖于人类,易犯错误,所以很难扩展。 静态分析 静态分析工具会在不运行代码的情况下分析代码,在不需要编写测试用例的情况下,查找违反编码标准或存在缺陷的问题。它们能有效地找到问题,但你需要选择出那些能够定位出有价值问题的工具,找出有价值的问题。C#静态分析工具包括Coverity,CAT.NET和Visual Studio代码分析。 动态分析 动态分析工具在运行时分析代码,帮助你查找缺陷,如安全漏洞,性能和并发...
葡萄城控件技术团队 发布于 6个月前 阅读 2896 评论 16 点赞 9

匈牙利算法,KM算法详解及java实现

匈牙利算法,KM算法详解及java实现;2016华为软件精英挑战赛,思路总结之KM算法求解指派问题;
husthang 发布于 6个月前 阅读 2182 评论 7 点赞 4 打赏 1

Java借助CountDownLatch完成异步回调

public class AsyncDemo { private static void doSomeTask() { System.out.println("Hello World"); } private static void onCompletion() { System.out.println("All tasks finished"); } public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); final CountDownLatch latch = new CountDownLatch(2); executor.execute(new Task(latch)); executor.execute(new Task(latch)); executor.execute(() -> { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } onCompletion(); }); executor.shutdown(); } private static class Task implements Runnable { /** * CountDownLatch 是JDK提供的一个简单的线程监测工具 * 基于简单的计数,调用countDown()方法表明当前线程已经终止 * 在监测线程中调用await()方法,该方法会一直挂起直到所有其它线程终止...
Acce1erator 发布于 7个月前 阅读 1708 评论 2
顶部