<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Clifnich]]></title><description><![CDATA[新知、旧闻和工程经验]]></description><link>https://blog.youkuaiyun.com/Clifnich</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Clifnich]]></copyright><item><title><![CDATA[MySQL 5.5 -＞ 5.7 升级]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/109007185</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/109007185</guid><author>Clifnich</author><pubDate>Sun, 11 Oct 2020 04:33:11 +0800</pubDate><description><![CDATA[三季度我们获得了一台新的阿里云实例，我们准备用它来安装数据报表系统，这样成员们都可以通过这台机器的服务来实时获得我们的业务数据。数据源是老机器上的 MySQL 5.5. 由于该新实例和老实例在不同区域，建立 VPC 需要流量费用[1]，我们决定开端口通过互联网把两台机器连接起来。为了对冲由此带来的安全等级降低，我们在建立连接之前先把数据库给升级了。这篇文章介绍升级的操作过程，以及我们的调研细节。
升级过程
我们在虚拟机上尝试通过 APR 升级数据库[2] 失败了，后来发现通过把 Ubuntu 14 升级成 ]]></description><category></category></item><item><title><![CDATA[单元测试解耦数据库 - 依赖注入和 Mockito]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/106469471</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/106469471</guid><author>Clifnich</author><pubDate>Mon, 01 Jun 2020 11:44:26 +0800</pubDate><description><![CDATA[单元测试与数据库结偶 - 依赖注入和 Mockito
基本背景
团队开发任务中涉及一个移动应用的 Java 后端，以增删查改 (CRUD) 为主，附加一些其他的服务逻辑。系统的持久层是用一些以 DAO 做名字结尾的类构成的。每一个 DAO 里面实现了增删查改的具体实现，一般模式是获得一个 Hibernate Session，运行 SQL Query，再把结果组织一下返回给客户端。
由于 DAO 类的这种开发模式，运行 JUnit 单元测试的时候需要环境中有一个配置好的 MySQL 实例，这极大限制了代码包持]]></description><category></category></item><item><title><![CDATA[通过依赖注入解决的小程序启动问题]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/105727641</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/105727641</guid><author>Clifnich</author><pubDate>Fri, 24 Apr 2020 11:54:02 +0800</pubDate><description><![CDATA[这篇文章通过一个实际工作的例子说明“依赖注入”的一个具体作用，欢迎大家点评。
基本背景
微信小程序启动时会生成一个 App 对象，开发者在各个页面中可以通过 getApp() 方法来调用到它，所以它有共享数据的作用。小程序的启动从 App.onLaunch() 函数开始，在这个函数运行结束以后，getApp() 才可以顺利调用。
小程序提供的 HTTP 网络接口 wx.request 承接了 HT...]]></description><category></category></item><item><title><![CDATA[WebSocket 简单搭建]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/104259969</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/104259969</guid><author>Clifnich</author><pubDate>Tue, 11 Feb 2020 11:23:10 +0800</pubDate><description><![CDATA[WebSocket 是在 HTTP 更上一层的通信协议，适合对于实时通信要求比较高的场景。比如微信聊天，当用户还在 APP 停留的时候，有消息就要能够接受到。服务器是一个被动接收请求再回复的技术，如果要让客户端在信息刚产生的时候就收到的话，就需要客户端不断地请求。这种 polling 的方法比较消耗资源。
WebSocket 通过订阅和分发的模式实现了实时通信，下面我们提供一个代码库来搭建一个简单...]]></description><category></category></item><item><title><![CDATA[落乎团队的远程开发协作方法]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/104209998</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/104209998</guid><author>Clifnich</author><pubDate>Fri, 07 Feb 2020 14:44:05 +0800</pubDate><description><![CDATA[落乎工作室 成立于 17 年底，致力于服务有落户上海需求的留学生。在所有成员都是挤出业余时间来贡献的条件下，到 2020 年我们已经累计有过万的用户，正常工作时间的日活也能有 100-200. 这两年中我们增加了一些成员，现在大家分布在全球 3 个时区，个人觉得在这种情况下还能保持生产力是很不容易的，所以想把试过、有效果的工作方法和读者朋友们分享。而且正巧最近由于种种原因，很多人不得不远程工作，希...]]></description><category></category></item><item><title><![CDATA[程序中的时间处理和 Java Calendar]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/103210011</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/103210011</guid><author>Clifnich</author><pubDate>Sat, 23 Nov 2019 02:52:39 +0800</pubDate><description><![CDATA[当你的业务逻辑涉及多时区的时候，时间的处理就会变得比较麻烦。平时我们算时差就有一些障碍，更不用说在讲究精确的计算机世界了。有些地方的时差会变，比如美国有夏令时 (Day Time Saving Off) 和冬令时 (Day Time Saving On)，夏令时的时候美国东部和中国是 12 个小时时差，冬令时的时候就变成了 13 个小时。
面对这些不确定性，找到一个不变的基准就非常重要，计算机世界...]]></description><category></category></item><item><title><![CDATA[常用 Vim 配置和命令]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/102965877</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/102965877</guid><author>Clifnich</author><pubDate>Fri, 08 Nov 2019 02:44:44 +0800</pubDate><description><![CDATA[将制表符（tab）转换成四个空格
四个空格可以保证代码、文件在不同系统上都能够呈现类似的排版。我们可以在 ~/.vimrc 中加入如下内容。
set ts=4 sw=4

这个配置来自 StackExchange，点击前往。

...]]></description><category></category></item><item><title><![CDATA[Ubuntu/Linux 实用命令]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/102951812</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/102951812</guid><author>Clifnich</author><pubDate>Thu, 07 Nov 2019 11:38:25 +0800</pubDate><description><![CDATA[检查端口使用情况
sudo lsof -i -P -n | grep LISTEN 


]]></description><category></category></item><item><title><![CDATA[VirtualBox 实用指南]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/102694039</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/102694039</guid><author>Clifnich</author><pubDate>Wed, 23 Oct 2019 01:28:38 +0800</pubDate><description><![CDATA[学习工作中积累了一些 VirtualBox 的使用指南，这里写一个总结。
克隆虚拟机、和主机共享文件夹
这份手册 对于 Ubuntu 16.04 上的这些设置有比较详细的说明。
拓展存储空间
虚拟机磁盘不够了，需要先从主机给它分配更多空间，然后把这部分空间合并到原有的分区中。
这篇文章介绍 Mac 上的具体操作
这篇文章介绍 Windows 上的具体操作

...]]></description><category></category></item><item><title><![CDATA[Docker 简单命令]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/102101149</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/102101149</guid><author>Clifnich</author><pubDate>Fri, 04 Oct 2019 22:52:29 +0800</pubDate><description><![CDATA[列出所有镜像
$ docker images

关闭所有镜像
$ docker stop $(docker ps -q)

在 busybox 镜像中运行 echo 命令
$ docker run -it busybox echo "hello from docker"


]]></description><category></category></item><item><title><![CDATA[微信客服信息解密]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/101513060</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/101513060</guid><author>Clifnich</author><pubDate>Fri, 27 Sep 2019 09:50:10 +0800</pubDate><description><![CDATA[官方给的代码示例只处理 XML 数据，有网友问 JSON 怎么办。这篇博文给出一下加密的例子，读者可以看到，只要稍作修改即可：
	public String decryptMsg(String msgSignature, String timeStamp, String nonce, String postData)
			throws AesException {

		// 密钥，公众账号的a...]]></description><category></category></item><item><title><![CDATA[关系型数据库设计注意点]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/100882431</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/100882431</guid><author>Clifnich</author><pubDate>Mon, 16 Sep 2019 12:26:52 +0800</pubDate><description><![CDATA[避免冗余
冗余在不经意间就会发生。受登记表格的影响，可能会想在一张数据表里存放比较多的内容。比如要做一个学生宿舍借钥匙的数据表的话，会有如下设计：
mysql&gt; desc key_loans;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | ...]]></description><category></category></item><item><title><![CDATA[luowho 团队的 Git 实用手册]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/95328780</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/95328780</guid><author>Clifnich</author><pubDate>Wed, 10 Jul 2019 13:37:16 +0800</pubDate><description><![CDATA[说是手册，其实就是一些 git 使用中的心得，放在这里跟大家分享讨论一下，欢迎批评指导。
彭书记的 merge master 大法
// 要 merge master 分支的时候，参考彭书记的方法可以逐步解决可能出现的冲突
$ git checkout master
$ git pull --rebase
$ git checkout issue-branch
$ git rebase maste...]]></description><category></category></item><item><title><![CDATA[2019 江苏省高考作文 | 美国多样性]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/93482244</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/93482244</guid><author>Clifnich</author><pubDate>Mon, 24 Jun 2019 13:44:59 +0800</pubDate><description><![CDATA[2019 江苏省高考作文
试题内容：
根据以下材料，选取角度，自拟题目，写一篇不少于800字的文章；除诗歌外，文体自选。
物各有性，水至淡，盐得味。水加水还是水，盐加盐还是盐。酸甜苦辣咸，五味调和，共存相生，百味纷呈。物如此，事犹是，人亦然。
作答。
美国多样性
从“五月花”号开始，北美大陆接收了从世界各地到来的移民，首先是从欧洲过来的一些穷苦人民，包括英法、西班牙、德国，还有非洲贩卖过来的黑奴。...]]></description><category></category></item><item><title><![CDATA[Union Find 和一道谷歌面试题]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/86399153</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/86399153</guid><author>Clifnich</author><pubDate>Sun, 13 Jan 2019 05:58:10 +0800</pubDate><description><![CDATA[复习经历
继续按照主题刷题。最近一次的中心内容是 union-find 这种数据结构。选择它的原因是我在一次谷歌面试中被问到了这个题，而且当时没有回答出来，这就刺激了我一定要把 union-find 搞懂的愿望。我并不是完全不懂这个数据结构，在斯坦福在 Coursera 中的 Algorithm Specialization 里 Tim Roughgarden 教授讲过的，我也动手实现过。只是这段...]]></description><category></category></item><item><title><![CDATA[BFS · 广度优先搜索]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/85231558</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/85231558</guid><author>Clifnich</author><pubDate>Thu, 27 Dec 2018 07:31:51 +0800</pubDate><description><![CDATA[为什么有这篇文章
近半年经常刷题，也参加了同学们自行组织的刷题会，到写这篇文章为止 leetcode 已经 AC 了 77 道题目了。时常的总结是必要的，而分享知识不仅能帮助自己树立知识脉络，更能帮助到大家，为学习算法的同学们提供一种参考的思路。
广度优先搜索概要
广度优先搜索（BFS）是在搜索中首先将所处位置的直接邻居访问一遍，再进入下一层重复之前操作的一种搜索。这种算法需要维护一个队列。队列有...]]></description><category></category></item><item><title><![CDATA[微信小程序互相跳转的参数传递]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/84407689</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/84407689</guid><author>Clifnich</author><pubDate>Sat, 24 Nov 2018 03:45:37 +0800</pubDate><description><![CDATA[背景
业务中产生了跳转到别的小程序的需求，传递参数能够使得这种交互功能更强大，因为很多东西因此能够定制化。微信小程序官方文档 是支持小程序之间的互相跳转以及参数传递的，具体说明写在这里。
微信的文档告诉了我们如何传参数，如图

然而问题出在目标小程序如何获取这份数据。仅仅写明在 App.onLauch 或者 App.onShow 中获取是不够的。获取参数的方法最直观的，就是在上述两个方法里放置输入...]]></description><category></category></item><item><title><![CDATA[网络应用的托管设置以及Nginx反向代理]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/80726909</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/80726909</guid><author>Clifnich</author><pubDate>Mon, 18 Jun 2018 21:49:34 +0800</pubDate><description><![CDATA[网络应用是什么

我们都知道什么是app, 就是手机上的一个软件，点开就有很多功能可以使用，这种类型的软件我们称之为“移动应用“（mobile application）；而当你打开浏览器浏览各种网页、进行各种操作的时候，你就是在使用网络应用（web application）. 网络应用的很多功能依赖于和服务器的交互，大致的过程是你通过浏览器里看到的页面请求一些信息，然后浏览器告诉操作系统：“你帮我...]]></description><category></category></item><item><title><![CDATA[screen 命令和 shell 脚本基础]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/80458344</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/80458344</guid><author>Clifnich</author><pubDate>Sat, 26 May 2018 00:00:36 +0800</pubDate><description><![CDATA[问题背景

如果你要运行一个时间很长的 job 你会怎么办？这个问题可以转变为当一个任务运行时间非常长，你如何保证操作系统不自动中断它。答案取决与运行环境，如果是台式机 + windows 的桌面系统就注意一下人离开的时候锁屏，而不要注销用户或者关机即可；而当你使用 Mac 或者远程连接 Linux 的时候要如何处理？我做过一件很傻的事情就是即使要从宿舍走到图书馆也一直把屏幕开着，本想着校园里处处...]]></description><category></category></item><item><title><![CDATA[Python 数组与 RGB 颜色的关系]]></title><link>https://blog.youkuaiyun.com/Clifnich/article/details/80143594</link><guid>https://blog.youkuaiyun.com/Clifnich/article/details/80143594</guid><author>Clifnich</author><pubDate>Sun, 29 Apr 2018 16:04:54 +0800</pubDate><description><![CDATA[实验的前提条件本文会出现一些编程实验，有兴趣实践的读者需要首先确保自己的开发环境安装了Numpy 和 cv2 包，如果没有的话，可以通过：pip install numpy
pip install cv2来进行安装。语境中的Python数组数组是Python 语言原生支持的数据结构，直接用方括号声明即可，如：arr = [1,2,3,4,5]为了方便数组的创建，Python 支持递推表达式等优雅的写]]></description><category></category></item></channel></rss>