MyBatis完全使用指南

MyBatis

MyBatis作为一个轻量的SQL映射框架,确实很简单,但是知识点挺多,实际使用中还是会有时想不起来某个标签该怎么写,所以整理了这篇文章,以备查询。由于MyBatis如此简单,使得这一篇文章基本把实际使用中常碰到的事情都涵盖了,包括:

  1. MyBatis中的一些概念
  2. MyBatis包含的内容
  3. SQL映射
  4. 动态SQL

KK笔记:kknotes.com
本文链接地址: MyBatis完全使用指南

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

刨根问底HTTP和WebSocket协议(三)

上篇文章发出来后,有人留言说到HTTP新版的RFC的问题,WebSocket和Socket的区别。本文将先回答这两个问题,然后继续展开WebSocket。在这篇文章将看到:

  1. 关于新的HTTP规范
  2. WebSocket和Socket的区别
  3. WebSocket中数据帧的格式
  4. WebSocket的实现:socket.IO
  5. 使用socket.IO实现一个在线直播系统

KK笔记:kknotes.com
本文链接地址: 刨根问底HTTP和WebSocket协议(三)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

程序世界中这些神秘数字你知道吗

记得大学时看过一本书,上边写到一个撩妹的小技巧:提出和对方玩一个意识游戏,让她心中想一个1到10、对她而言比较有意义的一个数字,然后自己在另一个地方写下一个数字,往往能猜中。这个小技巧利用了人的心理,同时,「程序」其本身本质上就是数字,本文将收集一些有趣的数字,主要以Java语言中的数字为主。给枯燥的生活一些调剂。

KK笔记:kknotes.com
本文链接地址: 程序世界中这些神秘数字你知道吗

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

WebSocket和Socket的区别(WebSocket外传)

当我们探讨两件事物的区别和联系时,我们想探讨些什么?

前段时间写了两篇介绍HTTP和WebSocket的文章,回复中有人说希望了解下WebSocket和Socket的区别。这个问题之前也有想过,自己对此是有大概的答案,可是并不太确定,于是去搜集了些资料(其实就是各种Google),看了很多以前的文档,觉得有些故事十分有趣,整理如下,算是一个外传。

文中图片全来自Google图片搜索,如侵删。

KK笔记:kknotes.com
本文链接地址: WebSocket和Socket的区别(WebSocket外传)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

刨根问底HTTP和WebSocket协议(二)

HTTP vs WebSocket

上篇介绍了HTTP1.1协议的基本内容,这篇文章将继续分析WebSocket协议,然后对这两个进行简单的比较。

WebSocket

WebSocket协议还很年轻,RFC文档相比HTTP的发布时间也很短,它的诞生是为了创建一种「双向通信」的协议,来作为HTTP协议的一个替代者。那么首先看一下它和HTTP(或者HTTP的长连接)的区别。

为什么要用WebSocket来替代HTTP

上一篇中提到WebSocket的目的就是解决网络传输中的双向通信的问题,HTTP1.1默认使用持久连接(persistent connection),在一个TCP连接上也可以传输多个Request/Response消息对,但是HTTP的基本模型还是一个Request对应一个Response。这在双向通信(客户端要向服务器传送数据,同时服务器也需要实时的向客户端传送信息,一个聊天系统就是典型的双向通信)时一般会使用这样几种解决方案:

  1. 轮训,轮询就会造成对网络和通信双方的资源的浪费,且非实时。
  2. 长轮训,客户端发送一个超时时间很长的Request,服务器hold住这个连接,在有新数据到达时返回Response,相比#1,占用的网络带宽少了,其他类似。
  3. 长连接,其实有些人对长连接的概念是模糊不清的,我这里讲的其实是HTTP的长连接(1)。如果你使用Socket来建立TCP的长连接(2),那么,这个长连接(2)跟我们这里要讨论的WebSocket是一样的,实际上TCP长连接就是WebSocket的基础,但是如果是HTTP的长连接,本质上还是Request/Response消息对,仍然会造成资源的浪费、实时性不强等问题。

HTTP的长连接模型

KK笔记:kknotes.com
本文链接地址: 刨根问底HTTP和WebSocket协议(二)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

刨根问底HTTP和WebSocket协议

HTTP vs WebSocket

那天和boss聊天,不经意间提到了Meteor,然后聊到了WebSocket,然后就有了一下对话,不得不说,看问题的方式不同,看到的东西也会大不相同。
A:Meteor是一个很新的开发框架,我觉得它设计得十分巧妙。
B:怎么个巧妙之处?
A:它的前后端全部使用JS,做到了真正的前后端统一;前端浏览器里存有一份后台开放出来的数据库的拷贝,快;使用WebSocket协议来做数据传输协议,来同步前后端的数据库,实现了真正的实时同步。
B:哦?WebSocket是什么东西?真实时?那底层是不是还是轮训?和HTTP的长连接有什么不同?

KK笔记:kknotes.com
本文链接地址: 刨根问底HTTP和WebSocket协议

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

如何设计良好的系统架构(clean code阅读笔记之十)

设计良好的系统

注:正文中的引用是直接引用作者的话,两条横线中间的段落的是我自己的观点,其他大约都可以算是笔记了。

本章讲的是「如何设计良好的系统架构」,读起来比较困难,不论是从结构上还是从文字上。结构上作者从「建设一个城市」开讲,之后花了很大的篇幅讲面向切面编程,最后又加上了几个方法论上的东西。文字上本章作者很多说法使用的单词和其他地方看到的的略有不同。但回过头来看,作者的思想是一脉相承的,整个章节其实只讲了一件事情——隔离。

本文会一直提到一个词「关注」,原文中使用的是concern,表达的是在软件开发中对某个问题的解决方案或者某个模块担任的职责(感觉还是不够贴切)。


本章有一个「结论」的小节,就先把她放上来了,内容在后边的小节里慢慢展开。

结论

  1. 系统整体架构的设计同样需要简洁优雅(作者此处指的是系统各个抽象层面之间要解耦),不然会带来各种各样的坏处;
  2. 在所有的抽象层面上,系统的目的要清晰(此处指的是单一职责,非侵入性)。为了达到这个目的,请使用AOP;
  3. 不论你是在设计一个系统,或者一个单独的模块,永远不要忘记使用最简单的实现

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

iOS开发的那些坑(贰)

当时光流逝,记忆也开始散去,猛然回头却发现自己还在原地。

目前做iOS平台开发有两种语言,这就导致了一个项目组可能同时存在使用Swift和使用OC的开发者,这就导致了对于语言选择的分歧。此外我相信网上大部分的代码块还仍然是OC的,那么如果纯用Swift,有时候就需要把一整段的OC转换成Swift,而重复是邪恶了。同时用过Swift的都知道,OC的那种啰嗦的语法真的很烦人。

To be or not to be, that is the question.

在开发中,我们总是会遇到这样一种情况——我以前遇到过这个问题,可是我也不记得当时是怎么解决的,反正肯定有solution——然后又花了一定的时间去解决这个问题。有时候我们解决了一个问题(或者绕过了一个问题),但是并没有仔细去思考这个问题的由来与你真正的解决方法,这就会导致下次遇到它时还会跳进同一个坑。人不能两次踏入同一条河流,却总是不断地踏入同一个坑。

KK笔记:kknotes.com
本文链接地址: iOS开发的那些坑(贰)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

iOS开发的那些坑

最近重新拿起了iOS的开发,使用OC和Swift混编,碰到了一些比较棘手的问题,在这里记录下来,方便自己以后或他人不再入坑。这篇文章的内容包含:

  1. UITableViewCell的真实结构
  2. 在iOS的环境下使用正则表达式
  3. 如何优雅的隐藏tabbar
  4. 如何修改navigationbar的颜色
  5. 运行时修改使用autolayout的view
  6. navigation controller子view偏移问题
  7. CoreData的使用总结
  8. 解决git的Xcode冲突

1.UITableViewCell的真实结构

目标是想把UITableview在editing模式下的drag按钮去掉,换成自己的样式,但又想保留原生拖动排序的行为,所以研究了很多方法,最后还是找到了UITableViewCell的结构,并将拖动按钮替换。不多说,上代码。


//打印出来的自定义的cell在editing模式下的结构    
(lldb) po self
<QKZhi_iOS.EditingCell: 0x7c148800; baseClass = UITableViewCell; frame = (0 0; 320 56); autoresize = W; layer = <CALayer: 0x7d086b40>>

(lldb) po self.subviews
 5 elements
  - [0] : <UITableViewCellContentView: 0x7d086d10; frame = (38 0; 242 55.5); opaque = NO; gestureRecognizers = <NSArray: 0x7d0882b0>; layer = <CALayer: 0x7d086de0>>
  - [1] : <_UITableViewCellSeparatorView: 0x7d087c40; frame = (15 55; 305 1); layer = <CALayer: 0x7d0852c0>>
  - [2] : <_UITableViewCellSeparatorView: 0x7b163240; frame = (15 55.5; 305 0.5); layer = <CALayer: 0x7b162de0>>
  - [3] : <UITableViewCellEditControl: 0x7b164700; frame = (0 0; 47 56); opaque = NO; layer = <CALayer: 0x7b164950>>
  - [4] : <UITableViewCellReorderControl: 0x7b164d10; frame = (268 0; 52 56); opaque = NO; autoresize = LM; layer = <CALayer: 0x7b164f60>>

(lldb) po self.subviews.last
   Optional<UIView>
    - Some : <UITableViewCellReorderControl: 0x7b164d10; frame = (268 0; 52 56); opaque = NO; autoresize = LM; layer = <CALayer: 0x7b164f60>>

(lldb) po self.subviews.last?.subviews
   Optional<Array<UIView>>
     Some : 1 elements
      - [0] : <UIImageView: 0x7b165130; frame = (15 24; 22 8.5); opaque = NO; userInteractionEnabled = NO; tag = 1; layer = <CALayer: 0x7b165210>>

(lldb)

KK笔记:kknotes.com
本文链接地址: iOS开发的那些坑

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading

如何设计优雅的类结构(clean code阅读笔记之九)

 类结构如何写出优雅的类结构

注:正文中的引用是直接引用作者的话,两条横线中间的段落的是我自己的观点,其他大约都可以算是笔记了。

「Clean Code」这本书从这一章开始文风有些变化,感觉比较乱,很多概念在之前的章节也提到过,因为这本书的某些章节是不同的人编写的,所以这种情况也难免,所以可能会有些小节我会几句话简单带过。

本章讲的是类的组织结构,其实很多这些概念我们在学校里学习OOP时可能都有学到过,有些人可能会觉得讲得比较虚,但文中确实有些细节还是解开了一些之前的疑惑,姑且当做复习面向对象的概念也好。


在前面的章节中详细讨论了命名、方法和数据结构等等这些概念,它们能够帮助我们更好地理解在代码行或者代码块的级别里如何写出简洁优雅。在此基础上,我们还是要在更高的层面上去探究代码简洁之道。在现代的高级语言编程世界里,类是系统的基本组成部分,这章就着重讨论一下如何写出好的类。

KK笔记:kknotes.com
本文链接地址: 如何设计优雅的类结构(clean code阅读笔记之九)

转载须以超链接形式标明文章原始出处和作者信息及版权声明

Continue Reading