Ubuntu Server 折腾小记

家里有一台笔记本做个人服务器。笔记本只有一个硬盘位,放置的是128G SSD硬盘,通过USB 3.0接口外接一块3T的硬盘做文件存储。新买了一块1T硬盘,替换SSD和存储,3T的硬盘做备份。不仅提高机器工作的稳定性,还能减少房间各种线。

此前系统安装的是 Ubuntu 18.04 桌面版,新的系统在 Debian 和 Ubuntu Server 之间纠结好久之后,最后选择了 Ubuntu Server 。主流的 Linux 桌面版和服务器版,差不多都使用过,而且都用过比软长的时间。Ubuntu的Server版是第一次用,安装和配置都大同小异。安装完后要做的工作也就那么几个,不过还是发现了一些不同,所以做了如下笔记。
继续阅读“Ubuntu Server 折腾小记”

回首2018

今天是2018年最后一个月的第一个周日,也是深圳天气变冷的第一天。有一句话是这样说的,“你能看到多远的过去,就能看到多远的未来”。现在的我有些懒了,平时虽然有总结,但再不像以前常常去记录。对于即将过去的2018,我有太多想说想写,一时间又不知道从哪里开始。

2018年是折腾的一年,它比以往任何时候都要折腾。怀着对未来一博的心态,我和小伙伴们做了一些尝试。那几个月里大家都很辛苦,对除吃饭睡觉就是做事情。最后突破重重困难,做出了自己的东西。供应链金融,在17年-18年,都很火的一年。很多团队和企业都在做这个。最终的结果是残酷的,和同行相比,没有优势,资源缺乏。也是从这一个经历,我深刻认识到,做成一件事,技术、业务、资源要能相互匹配才可能成功。

人总是经历了才会成长,虽然2018年的尝试以失败告终,但是对个人来说还是收获不少的。我之前一直做金融支付相关的,做完供应链金融,对它的业务也算是有了解,在后续的工作中,有几家公司看上了我这个经历。虽然最终没有选择他们,但也算是对那几个月的自己一些安慰吧。而且在中间发生的一些小故事,使我在职场生涯中受益。
继续阅读“回首2018”

实现 MySQL Top 函数【原创】

需求:查询数据,根据字段分组,取出分组后每组的前N条记录。
如果是在SQL Server中,可以使用top,取前N条记录。但是在MySQL是不支持的。网上说的比较多的是用limit N,虽然可以取到前N条,但那是分组后的N条,不是每组N条数据,所以不符合需求,排除。还有一种是使用union把多个结果连接起来,这种方法需要提前知道有分多少组,而且不适合分组太多的场景,排除。

我的实现思路:
1.查出分组后的数据。
2.使用原表数据和分组后的数据连接起来。
3.按组生成序列(从0开始)。
4.根据序列编号做为条件,找出前N条数据。
继续阅读“实现 MySQL Top 函数【原创】”

从SQL查询结果随机取一条数据

最近工作中会涉及复杂的SQL语句,还是挺有意思的。以前想写没有应用场景,现在正好可以多锻炼锻炼。我觉得在实际开发中,程序代码并不是最难的,最难的还是SQL。SQL逻辑性最强,而且还要很清楚表设计,业务场景。特别是复杂的业条场景下提炼数据,要考虑到功能,性能,是否会锁表。
需求:有一张表保存诺干条广告信息。当APP启动时,根据登录用户所在的区域,随机取出一条广告返回,作为启动页。

数据库:MySQL
刚开始,我的做法是:

select floor(max(startPageId) * rand()) from ghome.ghome_startpage_info where 1=1 and status!='00';

startPageId是自动增长的Integer型
其他where条件不贴出来了。这句意思是,查询符合条件的数据,根据 max 函数找出结果最大的,乘以 rand 函数随机生成的一个小于1的数,再用 floor 去掉小数位。得出一个 randId。
继续阅读“从SQL查询结果随机取一条数据”

WebDAV挂载/映射

一直使用NextCloud做私有云,电脑手机同步共享资料,很是方便。服务器放在家里,在家共享文件一直始用Samba。使用Samba写入的文件,不能被记录在NextCloud中,无法在外网同步,所以需要新的解决方案。NextCloud是支持WebDAV协议的,在手机上,我可以用第三方资源管理器做NextCloud客户端,那么在电脑上,该如何映射呢?

Windows解决方案

打开运行,输入cmd,在控制台输入:

net use Y: https://cloud.wangzhengzhen.com/remote.php/webdav  /user:qizheng /persistent:YES password



继续阅读“WebDAV挂载/映射”

[原创]通用验证工具2.0

两年前,我在这里发布了”JAVA通用验证工具”,并开源共享到 github 上。在之后的项目中,也是有使用的,算得上是经历了线上的考验。与其他如:Spring Validator,Apache Validator相比,主要有几个优点:
1.无第三方依懒引入,更轻量更容易扩展。
2.对于JAVA对象支持分组,根据不同业务场景验证必要字段。
3.对Android提供独立支持,验证返回资源引用ID。
继续阅读“[原创]通用验证工具2.0”

MySQL事务与锁

好久没认真看数据库这块了,工作后主要凭经验和规范避免事务与锁的问题,想想还是有必要整理一下的。工作时间很多都花在沟通上。条理清晰地把一个东西表达出来,让对方准确接收信息,是一项必不可少的核心能力。本篇所有资料都收集于网上,末尾贴出参考链接。

一、事务的基本要素(ACID)

1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
继续阅读“MySQL事务与锁”

JVM之ClassLoader

1.BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等,可通过如下程序获得该类加载器从哪些地方加载了相关的jar或class文件。
2.Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。
3.App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。


继续阅读“JVM之ClassLoader”

Nginx启用php支持

在apache中启用php很简单,apache有phpmodule模块,集成进去就OK。在nginx中启用php支持稍有些不同。

1、nginx的worker进程直接管理每一个请求到nginx的网络请求。

2、对于php而言,由于在整个网络请求的过程中php是一个cgi程序的角色,所以采用名为php-fpm的进程管理程序来对这些被请求的php程序进行管理。php-fpm程序也如同nginx一样,需要监听端口,并且有master和worker进程。worker进程直接管理每一个php进程。

3、关于fastcgi:fastcgi是一种进程管理器,管理cgi进程。市面上有多种实现了fastcgi功能的进程管理器,php-fpm就是其中的一种。再提一点,php-fpm作为一种fast-cgi进程管理服务,会监听端口,一般默认监听9000端口,并且是监听本机,也就是只接收来自本机的端口请求,所以我们通常输入命令 netstat -nlpt|grep php-fpm 会得到:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1057/php-fpm
这里的127.0.0.1:9000 就是监听本机9000端口的意思。
继续阅读“Nginx启用php支持”

微服务 – Spring Cloud 2.0

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud 2.0 正式版发布已有一段时间,这次写了一个Demo方便入门学习和测试。

学习Spring Cloud前需要对Spring Boot有所了解,可以去查找相关资料。该Demo是用IntelliJ IDEA创建的,共分为6个模块,主要展示一些基本功能。

继续阅读“微服务 – Spring Cloud 2.0”