暂无个人介绍
最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1 我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“ <…”也是合法的UTF-8。 问题的症结在于,MySQL的“utf8”实际上不是真正的UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。 MySQL一直没有修复
微信上 tison 向我提出了这个问题。我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多个年头了,真的是从一名编程白痴一步步走到现在的。 我在各大技术网站上分享了不少 Java 方面的原创文章,不知道影响了多少初学者,反正文章的留言中经常能看到他们由衷的感谢。现在每天仍然有不少同学(tison 是其中之一)加我微信,问我怎么一路过来的,希望能够把宝贵的经验分享出来,让他们少走一些弯路。 借这个机会,就统一回答下。 既然要快速,咱就没法面面俱到,必须挑重点、讲实用。下面就根据我的实战经验,谈一谈具体的学习过程。 01、准备 学习之路是一项很逆人性的差事,并不
1.前言 Python 中函数的参数类型比较丰富,比如我们经常见到 *args 和 **kwargs 作为参数。初学者遇到这个多少都有点懵逼,今天我们来把 Python 中的函数参数进行分析和总结。 2.Python 中的函数参数 在Python中定义函数参数有5种类型,我们来一一演示它们。 2.1必选参数 必须参数是最基本的参数类型,当你在 Python 函数中定义一个必选参数时,每次调用都必须给予赋值,否则将报错。
redis是互联网分层架构中,最常用的KV缓存,但不少同学仍然不知道,为啥要选择redis。 画外音:与之对比最多的,是memcache。 一、复杂数据结构,选择redis更合适 value是哈希,列表,集合,有序集合这类复杂的数据结构时,会选择redis,因为mc无法满足这些需求。 最典型的场景,用户订单列表,用户消息,帖子评论列表等。 二、持久化,选择redis更合适 mc无法满足持久化的需求,只得选择redis。 但是,这里要提醒的是,真的使用对了redis的持久化功能么? 千万不要把redis当作数据库用: (1)redis的定期快照不能保证数据不丢失; (2)redis
博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时时查看是否有文章更新,而不必每次都跳转到博客上来查看。现在我们就来为博客添加 RSS 订阅功能。 在此之前我们使用了 Django 内置的一些方法实现了一个简单的搜索功能。但这个搜索功能实在过于简单,没有多大的实用性。对于一个搜索引擎来说,至少应该能够根据用户的搜索关键词对搜索结果进行排序以及高亮关键字。现在我们就来使用 django-haystack 实现这些特性。 Django Haystack 简介 django-haystack 是一个专门提供搜索功能的 django 第三方应用,它支持 Solr、
1. 前言 这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题。这里权且称他非典型Spring循环依赖问题。但是我相信我肯定不是第一个踩这个坑的,也一定不是最后一个,可能只是因为踩过的人比较少、鲜有记录罢了。因此这里权且记录一下这个坑,方便后人查看。 正如鲁迅(我)说过,“这个世上本没有坑,踩的人多了,也便成了坑”。 2. 典型场景 经常听很多人在Review别人代码的时候有如下的评论:“你在设计的时候这些类之间怎么能有循环依赖呢?你这样会报错的!”。 其实这句话前半句当然没有错,出
队列理论在我们生活中的应用随处可见,例如机场、海关、银行甚至排队买菜。可以说,只要有排队的地方,就可以应用队列理论进行服务优化。 在计算机领域的架构设计,性能诊断等地方使用队列理论的案例也多不胜举。曾经培训的时候听到过,有牛人可以在不了解具体技术的情况下仅凭队列理论的知识就可以快速定位系统的瓶颈所在。拿一台服务器来讲,分为动态设备和静态设备。CPU和IO子系统属于动态设备,RAM属于静态设备,队列理论只对动态设备适用。今天不打算介绍队列理论的基础知识,而想讨论一下队列理论在PG数据库对于写WAL上的应用。 一个系统的响应时间由两部分决定,等
文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 我们博客功能越来越来完善了,但这也带来了一个问题,我们不敢轻易地修改已有功能的代码了! 我们怎么知道代码修改后带来了预期的效果?万一改错了,不仅新功能没有用,原来已有的功能都可能被破坏。此前我们开发一个新的功能,都是手工运行开发服务器去验证,不仅费时,而且极有可能验证不充分。 如何不用每次开发了新的功能或者修改了已有代码都得去人工验证呢?解决方案就是编写自动化测试,将人工验证的逻辑编写成脚本,每次新增或修改代码后运行一遍测试脚本,脚本自动帮我们完成全部测试工作。 接下来我们将进行两种类型的测试,一种是单元测试,
背景 最近项目中在和第三方进行联调一个接口,我们这边发送http请求给对方,然后接收对方的回应,代码都是老代码。根据注释,对方的SDK中写好的Request类有一个无法序列化的bug,所以这边重新写了一个Request类,基本属性都是相同的,但是重点是有一个属性是静态内部类,还有两个是list属性,类似于下面这样: private List<Order> orders; private AddRequest.Ticket ticket; private List<Payment> payments; 复制代码 AddRequest就是我们自己重写的请求类,他们SDK中的请求类是MixAddR
Mybatis-Generator可自动生成模型,Dao,Mapper代码,但其自带生成的代码存在以下问题: 生成的注释不是我们想要的,我们期望的是根据数据库表,细分生成不同的注释; 分页代码生成缺失,每个公司的分页方式不同,尤其是老久项目或已发布API,不能随意移动,那么如何自适应分页代码生成; Mapper.xml没有按相关代码生成分组; 重复生成代码时,Mapper.xml并非覆盖原始代码,而是对内容进行了追加; 序列化,mybatis-generator内置了SerializablePlugin,但仅对Model,并没有对Example序列化,在一些开发中是不够的; 对服务层代码没有生
将开源开发的方法应用于企业内部可以提高创新能力,缩短产品上市时间,并使员工和客户感到满意。 各行各业、规模各异的公司都在实施内部开源的工作方式,以推动更高水平的开发协作和代码重用。他们的最终目标是提高创新力,缩短上市时间,培养、保留和吸引人才,当然,还有让他们的客户满意。 本文将介绍内部开源和其中的一些重点,还有内部开源可以帮助解决哪些问题。我还会讨论包括指标在内的内部开源流程中的一些组成部分。 什么是内部开源? 内部开源是把开发开源软件中学到的经验教训应用到公司内部开发软件的实践。因为它是在公司环境中完成的,所以内部开源是在公司内部网络中发生的。 在内部开源中,开发人员将会有相应的回报
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。为了提高 Java 编程的技艺,我最近在 GitHub 上学习一些高手编写的代码。下面这一行代码(出自大牛之手)据说可以征服你的朋友,让他们觉得你写的代码很 6,来欣赏一下吧。 IntStream.range(1, 5).boxed().map(i -> { System.out.print("Happy Birthday "); if (i == 3) return "dear NAME"; else return "to You"; }).forEach(System.out::println); 复制代码 我虽然拥有
通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求。然后,控制器调用业务类来处理与业务相关的任务,然后将客户端重定向到逻辑视图名称,该名称由Spring的调度程序Servlet解析,以呈现结果或输出。 这样就完成了典型的请求-响应周期的往返。 今天整理了一下编写Spring MVC控制器的14个技巧,你今天get到了吗?(≧▽≦)/ 1.使用@Controller构造型 这是创建可以处理一个或多个请求的控制器类的最简单方法。仅通过用构造型注释一个类@Controller ,例如: import org.springframework.stereotype.Con
想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名 Java 程序员,我真的是烦透了 NullPointerException(NPE),尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为 null,于是 Java 虚拟机就怒发冲冠地把它抛了出来当做替罪羊。 当然了,我们程序员是富有责任心的,不会坐视不管,于是就有了大量的 null 值检查。尽管有时候这种检查完全没有必要,但我们已经习惯了例行公事。终于,Java 8 看不下去了,就引入了 Opti
一、sudo介绍 sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登陆 和管理时间,同样也提高了安全性。Sudo不是对shell的一个代替,它是面向每个命令的。 它的特性主要有这样几点: § sudo能够限制用户只在某台主机上运行某些命令。 § sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。 § sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为
前端高级进阶:javascript 代码是如何被压缩 前端高级进阶:如何更好地优化打包资源 前端高级进阶:网站的缓存控制策略最佳实践及注意事项 前端高级进阶:在生产环境中使你的 npm i 速度提升 50% 前端高级进阶:使用 docker 高效部署你的前端应用 前端高级进阶:CICD 下的前端多特性分支环境的部署 前端高级进阶:前端部署的发展历程 更多文章: 前端工程化系列 我在 github 上新建了一个仓库 每日一题,每天一道面试题,欢迎交流。 前端面试题小记 前端大厂面经大全集 计算机基础面试题小计 前端一说起刀耕火种,那肯定紧随着前端工程化这一话题。随着 react/vue/ang
之前使用 PM2 管理进程还是挺多的,它是怎么实现的呢?在 PM2 的配置文件中可以设置 exec_model:'cluster' 和 instances 两个属性来设置开启多个进程,PM2 其实主要也是利用 Nodejs Cluster 这个模块来实现了,还有 Egg.js 中的 egg-cluster 模块在启动 Worker 进程时也是使用的 Nodejs Cluster 模块。下面来了解下 Nodejs Cluster 这个模块做了什么? 下面参考了 Nodejs 官网提供的一个 Cluster 代码示例,命名为 app.js 下文会用到这个 Demo。 // app.js con
近日,在深圳举办的ArchSummit全球架构师峰会上,华为GaussDB生态与标准CTO王伟民发表了“IoT大数据场景下华为GaussDB的数据处理实践”主题演讲,分享了大数据场景下华为GaussDB的数据处理实践。 在数据爆炸式增长的时代,企业在进行海量数据分析与处理时面临四大挑战: l 极致的弹性扩缩容能力,满足海量数据处理需求 l 系统具备极高的可用性,满足7 * 24 * 365不间断持续运营诉求 l 具备实时性分析能力,对服务体验、精准的个性化服务要求不断提高 l 基础平台必须对应用开发友好,易管理易运维,满足业务创新加速,且在运维运营、变更等方面具有可视化、智能
作者介绍 朱贤文,成都文武信息技术有限公司创始人,PostgreSQL中国用户会核心组成员,熟悉数据库,存储和集群技术; 成都文武信息技术有限公司是PostgreSQL和GreenPlum数据库服务的专业厂商,主要产品是ECOX集群管理系统和Hunghu Cloud,专门运行数据库的私有云系统,带高端存储功能。公司总部位于天府软件园。公司网站:w3.ww-it.cn 写本文的原因 这两天有两篇专门介绍PostgreSQL的vacuum机制的技术文章,得到了比较热烈和正面的反馈,让用户可以比较清楚地理解和使用这个特性。 我个人觉得有点小遗憾:这两篇文章没有跳出技术的角度,分析为什么会有这
想通过ssh隧道连接远端机器的VNC服务,对ssh -L命令不太熟悉,man ssh后发现3组与隧道(turnnel)相关的参数:ssh -D,ssh -L,ssh -R,一下子就搞糊涂了,所有下决心仔细研究一番。 何谓SSH隧道 隧道是一种把一种网络协议封装进另外一种网络协议进行传输的技术。这里我们研究ssh隧道,所以所有的网络通讯都是加密的。又被称作端口转发,因为ssh隧道通常会绑定一个本地端口,所有发向这个端口端口的数据包,都会被加密并透明地传输到远端系统。 SSH隧道的类型 ssh隧道有3种类型: 动态端口转发(Socks 代理) 本地端口转发 远端端口转发 动态端口转发
数据处理大致可以分成两大类:联机事务处理OLTP(On-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。 OLTP是传统的关系型数据库的主要应用场景,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用场景,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 OLTP 系统强调数据库内存效率,强调内存各种指标的命中率,强调绑定变量,强调并发操作; OLAP 系统则强调数据分析,强调SQL执行时长,强调磁盘I/O,强调分区等。
我们是否一样? 估计很多小伙伴(也包括我自己)都有这种情况,在自学Java语言看书时,关于枚举enum这一块的知识点可能都有点 “轻敌” ,觉得这块内容非常简单,一带而过,而且在实际写代码过程中也不注意运用。 是的,我也是这样!直到有一天我提的代码审核没过,被技术总监一顿批,我才重新拿起了《Java编程思想》,把枚举这块的知识点重新又审视了一遍。 为什么需要枚举 常量定义它不香吗?为啥非得用枚举? 举个栗子,就以B站上传视频为例,视频一般有三个状态:草稿、审核和发布,我们可以将其定义为静态常量: public class VideoStatus { public st
有时候,由于业务的复杂性,在JVM中拼装一些数据,会造成资源的极大浪费。举个例子,从MySQL中查询出一个List,然后在代码里循环查询数据库,进行一些字段的填充。 这种数据组装方式,除了执行效率的问题,往往会有更多的内存占用,对整个JVM计算节点造成了比较大的压力,有时候甚至造成内存溢出。于是,一些比较牛X的开发人员,使用非常复杂的SQL,来把这些耗时的操作,转嫁给数据库。 可怜的数据库,成了最后一道屏障。谁让数据库的配置普遍都比较高呢?活该。 但是可惜的是,数据库完成这些动作,同样要经历耗时的操作。Java线程等的不耐烦了,就会对用户直接返回超时,懵逼的用户会在这种情况下,再次发起重
我们已经成功地开发了一个功能比较完备的个人博客,是时候来总结一下我们的工作了。 在教程的前两篇,我们介绍了如何搭建 django 开发环境,如何创建 django 项目以及 django 应用,这是我们进行 django 项目开发的基础。 第 3、4 篇:讲了 django ORM 的基础操作。ORM 是 django 核心中的核心,不仅 django 自带的应用底层全都依赖于 ORM,大部分使用 django 构建的应用基本也离不开 django ORM 的操作,所以能否熟练掌握 django 的 ORM API
Express 历史悠久相比 Koa 学习资料多一些,其自带 Router、路由规则、View 等功能,更接近于 Web FrameWork 的概念。Koa 则相对轻量级,更像是对 HTTP 的封装,自由度更多一些,官方 koajs/koa/wiki 提供了一些 Koa 的中间件,可以自行组合。 本文重点从 Handler 处理方式、中间件执行机制、响应机制多个维度来看待 Express、Koa 的区别。 Handler 处理方式 这个是 Express、Koa(koa1、koa2)的重点区别: Express Express 使用普通的回调函数,一种线性的逻辑,在同一个线程上完成所有的
中分析并验证了MySQL进行在线创建索引时,不会因为执行时间过长或业务压力较大,在回放增量DML时加锁时间过久而对业务造成严重影响,本文从MySQL 8.0.19源码出发,分析MySQL是如何实现的。同时也确认是否在回放DML时会报duplicate key。 核心处理流程和对象 增量DML处理流程主要在http://row0log.cc中。 /** @file row/row0log.cc Modification log for online index creation and online table rebuild Created 2011-05-26 Marko Make
1. 前言 这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题。这里权且称他非典型Spring循环依赖问题。但是我相信我肯定不是第一个踩这个坑的,也一定不是最后一个,可能只是因为踩过的人比较少、鲜有记录罢了。因此这里权且记录一下这个坑,方便后人查看。 正如鲁迅(我)说过,“这个世上本没有坑,踩的人多了,也便成了坑”。 2. 典型场景 经常听很多人在Review别人代码的时候有如下的评论:“你在设计的时候这些类之间怎么能有循环依赖呢?你这样会报错的!”。 其实这句话前半句当然没有错,
Vim 是 Linux 下一款很常用的文本编辑器,虽然它对初学者而言并不友好,但通过一些插件的配合,它可以被打造成一款很强大的 IDE 。良许曾经介绍过三款很常用的插件,可点击以下链接查看: Vim 编辑器的 3 款实用插件 本文再介绍一款 Vim 编辑器中的一款很强大插件—— VIM Fugitive 。这款插件可以实现你在 Vim 编辑器里直接完成 Git 操作,而无需退出 Vim 。更多 Linux 精选干货电子书,可私聊我 「资料」获取。 这个插件是开源项目,我们可以在以下地址获取源码: 安装方法: cd ~/.vim/bundle git clone vim -u NON
Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的。在这些人的眼里,能够写出那些一般开发者看不懂的高级特性,就是高手,就是大神。 但你要知道,在团队合作里,炫技是大忌。 为什么这么说呢?我说下自己的看法: 越简洁的代码,越清晰的逻辑,就越不容易出错; 在团队合作中,你的代码不只有你在维护,降低别人的阅读/理解代码逻辑的成本是一个良好的品德 简单的代码,只会用到最基本的语法糖,复杂的高级特性,会有更多的依赖(如语言的版本) 该篇是「炫技系列」的第三篇内容,在这个系列里,我将总结盘点一下,我所见过的那些炫技操作。在这里,如果你是 Python 发烧友
很多朋友对前段时间“删库跑路”事件应该还记忆犹新吧, 不仅如此近期的数据泄露问题也是从出不穷, 数据库作为企业核心业务系统的基础设施部分更是重中之重, 热璞数据库HotDB 结合企业数十年的技术沉淀以及在实战中的经验,以用户的视角打造的这份安全技术指南,跟各位一起分享: 一:用户管理 数据库应支持用户身份认证,并确保用户标识具有唯一性,且用户的身份认证信息应进行加密存储,宜采用不可逆加密算法; 用户的口令应具有复杂度要求,长度应少于8位,并包含英文字母大小写、特殊字符及阿拉伯数字等组合,且系统运维管理用户应定期修改登陆口令; 宜设置超时时间,登录用户在超时时间内无操作则自动结束会话; 宜及
《周易》说,形而上者谓之道,形而下者谓之器;降龙十八掌里有履霜坚冰,夕惕若厉等招数;坤卦爻辞中也有含章可贞,或从王事等管理和做人规则。 看完上面几句,大家可能会想,不是说日式管理嘛,怎么说起中国传统哲学了?其实无论是西方的还是日式的管理方法与经验,其理论来源都是中国的哲学思想,无论是德鲁克的任务、责任、实践的管理理论,波特的差异竞争论,哈默尔的核心竞争力,还是明茨伯格的战略和经理人角色,科特的领导与变革,归根到底这只不过是一些管理的方法和手段而已,这些手段和方法,在浩淼的中国传统哲学中都能找到与它们几乎一致的理论,可以说中国的哲学思想是世界管理学的源头活水。 说到日式管理,很多人也都耳熟能
我们首先来回顾一下传统的基于模板引擎的 django 开发工作流: 绑定 URL 和视图函数。当用户访问某个 URL 时,调用绑定的视图函数进行处理。 编写视图函数的逻辑。视图中通常涉及数据库的操作。 在视图中渲染 HTML 模板,返回 HTTP 响应。 其实,基于 django-rest-framework 的 RESTful API 的开发,过程是完全类似的: 绑定 URL 和视图函数。当用户访问某个 URL 时,调用绑定的视图函数进行处理。 编写视图函数的逻辑,根据 HTTP 请求类型,对请求的资源进行相应操作,这个过程通常涉及数据库的操作。 使用约定的资源描述格式(例如 XML 或
1. 前言 RestTemplate 是 Spring 提供的一个调用 Restful 服务的抽象层,它简化的同 Restful 服务的通信方式,隐藏了不必要的一些细节,让我们更加优雅地在应用中调用 Restful 服务 。但是在 Spring 5.0 以后RestTemplate处于维护模式,不再进行新特性的开发,仅仅进行一些日常维护。Spring 建议我们使用同时支持同步、异步和 Stream 的另一个 API —— WebClient 。但是在 Spring MVC 下目前我们还没有更好的选择。 2. RestTemplate 的使用场景 我们在项目中经常要使用第三方的 Rest AP
前言 随着大数据时代的到来,数据信息在给我们生活带来便利的同时,同样也给我们带来了一系列的考验与挑战。本文主要介绍了基于 Apache HBase 与 Google SimHash 等多种算法共同实现的一套支持百亿级文本数据相似度计算与快速去重系统的设计与实现。该方案在公司业务层面彻底解决了多主题海量文本数据所面临的存储与计算慢的问题。 一. 面临的问题 1. 如何选择文本的相似度计算或去重算法? 常见的有余弦夹角算法、欧式距离、Jaccard 相似度、最长公共子串、编辑距离等。这些算法对于待比较的文本数据不多时还比较好用,但在海量数据背景下,如果每天产生的数据以千万计算,我们如何对于这些海
对于稍微大型的 Node 应用,typescript 已经是标配,它为 javascript 提供了强类型的铠甲,有效提高了代码质量。 这里是一个结合 ts 及 koa 快速部署到腾讯云函数计算中的模板。仓库如下 shfshanyue/serverless-template-zh: 中国云厂商 serverless framework 模板及示例 (更快的访问速度) 如果你只想搭建一个博客 使用 Netlify 托管静态网站与持续集成 使用 AliOSS 部署及加速你的静态网站 Github Actions 持续集成简介及实践 使用 Serverless Framework 开发第一个云函
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。 采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。 SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度
数据库加密,作为杀手锏,是数据库底线防守的秘密武器,通过在数据库存储层进行数据加密处理,达到即使数据被黑客盗取也无法解密的效果,从根源上解决数据泄露问题。 近年,市场对于数据库加密产品的需求呈上升趋势,但由于技术门槛极高,国内真正能够提供此类产品的企业本就寥寥无几,尤其针对全球份额排名第二的MySQL数据库,能够对其支持的加密产品一直没有出现。 不同于传统的视图+触发器模式的透明加密方式,本文所提MySQL国密加密产品采用数据库引擎代码改造技术,真正实现数据在存储层的加、解密功能,避免以往加密过程中,数据库文件导入导出的繁琐方法,最大程度减少性能损失。 产品是为用户需求而生,而我们要做的
“xxx拖库”、“xxxx数据泄露”等等层出不穷的安全事件表明,要想根本上解决这种越过网络防护,绕开权控体系,直接复制文件块并异地还原解析的“内鬼”式攻击方式,必须采用存储层的加密技术,确保敏感信息一旦落盘,必须密文存储。随着数据库加密技术在国内市场的兴起,更多数据安全企业的涌入,市面上出现了几种具有代表性的数据库加密技术。 一、前置代理及加密网关技术 1)技术原理 该方案的总体技术思路即在数据库之前增加一道安全代理服务,对数据库访问的用户都必须经过该安全代理服务,在此服务中实现如数据加解密、存取控制等安全策略。然后安全代理服务通过数据库的访问接口实现数据存储。安全代理服务存在于客户端应
Python 版本发展非常快,如今最新的版本已经是 Pyhton 3.9,即便如此,有很多人甚至还停留在 3.6 或者 3.7,连 3.8 还没用上。 很多 Python 3.8 的特性还没来得及了解,就已经成为旧知识了,比如今天要说的海象运算符。 海象运算符是在 PEP 572 被提出的,直到 3.8 版本合入发布。 它的英文原名叫 Assignment Expressions,翻译过来也就是 赋值表达式,不过现在大家更普遍地称之为海象运算符,就是因为它长得真的太像海象了。 1. 第一个用法:if/else 可能有朋友是第一次接触这个新特性,所以还是简单的介绍一下这个海象运算符有什
在上一章,我介绍到了 如何使用 serverless 部署第一个 koa 应用。对于一个后端(Node)项目使用 serverless 的方式要接收巨大的挑战,其中最大的挑战来自于传统的并已完善与成熟的架构。 而对于一个弱存储弱状态的 SSR 项目或者纯前端项目,通过 zeit 或者 netlify 部署是一个更好的选择,然而由于网络原因并不适用于国内。国内也无如 netlify 一样的前端快速部署方案(笔者认为这一点对于国内的云服务商是一个可选的机会),此时 serverless 是一个不错的选择,只需一行命令即可充分利用缓存配置,对象存储服务,CDN 与自动 https 证书。
说在前面 小伙伴们大家好,又是全新的一天。 关于“自学编程的一些常见误区”这个话题其实很早之前就在视频里聊过了。时间过去了大半年,也还是有很多小伙伴会提及各种自学过程中的常见疑惑,所以还是用文字总结一下这几点想法,和大家共勉。 误区1:忽略基础,盲目莽进 基础知识和基础路线真的非常重要,就以Java领域举例,现在的应用框架实在是太多了,五花八门,层出不穷,迭代的速度太快了。但是假如Java SE的基础不牢、网络协议和操作系统不熟,基本的设计模式不了解,那一味地追求学习新框架反而会让自己陷入迷茫与困顿。 基础牢固,应用框架的学习自然就不用惧怕了,很快就能切入核心,掌握原理。而且越时髦的东西
zookeeper不是为高可用性设计的,但它使用ZAB协议达到了极高的一致性。所以它经常被选作注册中心、配置中心、分布式锁等场景。 它的性能是非常有限的,而且API并不是那么好用。xjjdog倾向于使用基于Raft协议的Etcd或者Consul,它们更加轻量级一些。 Curator是netflix公司开源的一套zookeeper客户端,目前是Apache的顶级项目。与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量。Curator解决了很多zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册wathcer和Nod
1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String value) { if ("0".equals(value)) { //todo } else if ("1".equals(value)) { //todo } else { //todo } } 复制代码 脑壳疼!从 Java 语法上无懈可击,但是从业务上却让人无法理解其中 0 和 1 的含义,它们统称为魔法值 。 对于上面的代码
HBase所有的比较器实现类都继承于父类ByteArrayComparable,而ByteArrayComparable又实现了Comparable接口;不同功能的比较器差别在于对父类compareTo()方法的重写逻辑不同。 下面分别对HBase Filter默认实现的七大比较器一一进行介绍。 1. BinaryComparator 介绍:二进制比较器,用于按字典顺序比较指定字节数组。 先看一个小例子: public class BinaryComparatorDemo { public static void main(String[] args) {
这个题目中涉及到了三种解决问题的著名思维方法,它们用于指导我们如何去思考一个事物,但是却没有给出为什么要这样思考。 一直没时间整理,其实这也能够理顺,即使在平时可能做不到用这些方法来分析问题,但了解一下也是可以的。 恰巧今天有空闲去图书馆,我专门想了下,结合自己收集的资料,总结如下。 # 一、首先最通用的是5w1h 即: - when(时间,何时) - where/which(位置,发生区域,哪些,定义范围与边界,比如哪些内容是不包含在内的) - who(参与人,执行人) - why(为什么,原因) - how/how to(策略,方法,方式,具体的过程或行动步骤) - what(内
初衷 Java集合是我们使用最频繁的工具,也是面试的热点,但我们对它的理解仅限于使用上,而且大多数情况没有考虑过其使用规范。本系列文章将跟随源码的思路,分析实现的每个细节,以期在使用时避免各种不规范的坑。在这里,我们会惊艳于开发者优秀的设计,也会感激先辈们付出的艰辛努力,更重要的是知其所以然,少犯错误,写出优秀的代码。 许多人对集合类的理解是暴力的,当需要保存对象时就使用ArrayList,当需要保存键值对时就使用HashMap,当需要不可重复时就使用HashSet,等等。而且使用方式也比较单一:
前言 当我们想要遍历集合时,Java为我们提供了多种选择,通常有以下三种写法: 写法1:for循环 for (int i = , len = strings.size(); i < len; i++) { System.out.println(strings.get(i)); } 写法2:foreach循环 for (String var : strings) { System.out.println(var); } 写法3:Iterator Iterator iterator = strings.iterator(); while (iterator.hasNext(
Collection Collection是List、Queue和Set的超集,它直接继承于Iterable,也就是所有的Collection集合类都支持for-each循环。除此之外,Collection也是面向接口编程的典范,通过它可以在多种实现类间转换,这也是面向对象编程的魅力之一。 方法定义 在阅读源码前,我们可以先自行想象一下,如果我们想封装下数组或链表以方便操作,我们需要封装哪些功能呢?比如:统计大小、插入或删除数据、清空、是否包含某条数据,等等。而Collection就是对这些常用操作进行提取,只是其很全面、很通用。下面我们看看它都提供了哪些方法。
Java集合源码分析系列到此就结束了,关于Set的知识会在这里进行简单的总结,除此之外,则是学习之后的一些感受。 Set概述 Set是一个包含不可重元素的集合,也就是所有的元素都是唯一的。文档说明如下: A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this inte
在 JavaScript 中 ES6 之前我们使用函数(构造器函数)和基于原型来创建一个自定义的类,但这种方式总会让人产生困惑,特别是习惯了 Java、PHP 等面向对象编程的同学来说更加难以理解。 抽象一个类 面向对象编程的基本单位是对象,但对象又是由类实例化的,所以我们第一步需要先知道怎么去声明一个类。 类的声明 类的声明使用 class 关键词,类名与变量、函数等命名规则类似,这里要首写字母大写,类名后跟上一对花括号可以理解为的类的主体,类的主体三部分组成:成员属性、构造函数、成员方法。