自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

老梁的专栏

一个真诚的程序员

  • 博客(269)
  • 资源 (8)
  • 收藏
  • 关注

原创 Fresco源码解析 - 创建一个ImagePipeline(一)

在Fresco源码解析 - 初始化过程分析章节中,我们分析了Fresco的初始化过程,两个initialize方法中都用到了 ImagePipelineFactory类。ImagePipelineFactory.initialize(context);会创建一个所有参数都使用默认值的ImagePipelineConfig来初始化ImagePipeline。ImagePipelineFactory.i

2019-12-05 17:00:23 11787 5

原创 如何获取 Android 设备的CPU核数、时钟频率以及内存大小

从 Facebook 的开源代码(Device Year Class)抽取了一些 Android 编码中的常用功能 - 获取 CPU 核数、时钟频率、内存大小。

2019-12-05 17:00:15 14679 5

原创 全面介绍Android的MVVM框架 - 数据绑定

本教程是跟着 Data Binding Guide 学习过程中得出的一些实践经验,同时修改了官方教程的一些错误,每一个知识点都有对应的源码,争取做到实践与理论相结合。Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性。

2019-12-05 17:00:09 74908 18

原创 Android Data Binding 的一个bug

跟着官方教程学习数据绑定的用法,功能确实非常强大,这是 Android 向 MVVM 迈出的一大步,也是 Native 的开发方式逐渐向 Web 靠拢的一小步。其中一个绑定方式是直接使用资源数据,例如:android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"官方教程截图:完整版的布局文件如下:<layout xmlns

2019-12-05 17:00:00 11162 3

原创 从Android的角度看Storyboard

由于先入为主的原因,Android 开发者很容易搞混某些 iOS 术语,导致理解上出现偏差。举个栗子,Objective-C 中有一个关键词 interface,虽然 Java中也有 interface,但两者的含义是完全不同的,除此之外,还有很多概念相同,但是叫法不同的术语,比如 Closure(闭包) 在 Objective-C 中称作 Block。如果在学习过程中能够注意到这些不同点,不仅有助

2019-12-05 16:59:59 3628

原创 图解 Retrofit - ServiceMethod

通过 Retrofit + RxAndroid 实践总结,我们已经了解到了 Retrofit 的基本用法,为了知其所以然,我们以图解加源码的方式从 Service Method 入手,逐步解析 Retrofit。首先以官方网站的示例代码为例,看一下一个 Service Method 的组成部分。ServiceMethod 使用了 Builder 模式,先来看 ServiceMethod.Builde

2019-12-05 16:59:24 2478

原创 Kotlin实战之Fuel的高阶函数

Fuel 是一个用 Kotlin 写的网络库,与 OkHttp 相比较,它的代码结构比较简单,但是它的巧妙之处在于充分利用了 Kotlin 的语言特性,所以代码看上去干净利落。OkHttp 使用了一个 interceptor chain 来实现拦截器的串联调用,由于 Java 语言( JDK ≤ 7)本身的局限性,所以实现代码比较臃肿,可读性也不友好。当然,RxJava 再加上 retrola...

2019-12-05 16:58:52 1270

原创 Kotlin 教程之「基本类型」

Kotlin 中,我们可以调用任何变量的成员函数和属性,从这个角度来说,一切皆对象。某些类型可以有特殊的内部表现 - 例如,数字、字符和布尔型在运行时可以表现为基础类型(primitive types),但是对用户来说,他们看上去就是是普通的类。这一章节主要描述 Kotlin 的基本类型:数字、字符、布尔、数组和字符串。数值Kotlin 处理数字的方式与 Java 类似,但不是完全一致。例如...

2019-12-05 10:10:49 293

原创 Android 架构组件设计思想总结

原文地址:https://mp.weixin.qq.com/s/-2z7lAGQ3GeSqFfkPGPWNA转载已获授权Google 为帮助 Android 开发者更快更好地开发 App,推出了一系列组件,这些组件被打包成一个整体,叫作 Android Jetpack,其包含的组件如下图所示:旧 support 包也被整合进了 Jetpack,例如上图 Foundation 模块的 ...

2019-12-04 16:54:20 447

原创 记一个导出超时的排查过程

我做的系统管理后台有一个页面,可以查询或导出数据。查询条件位于页面最顶部,下面有个「查询」按钮,点击之后根据查询条件向后端发起请求,后端返回一个数据列表,页面将其分页展示。这个功能再简单不过,但是「查询」旁边的「导出」却没按常理出牌,导出超时。。。页面查询没毛病,导出却不行,第一反应是不是导出的数据太多,导致查询超时了。看了一下导出 URL(GET 请求),pageSize 是 260,按理说...

2019-11-28 11:52:20 836

原创 尝试 mybatis 返回 map 后的无功而返

mybatis 不熟,掉坑里了,好久才爬出来,记录一下填坑过程。背景很简单,需要统计订单不同状态的数量,很自然想到了用 ORDER BY 来分组,于是写了下面的 SQL(真实 sql 比这个复杂):SELECT status, count(1) FROM job_order WHERE gmt_create >= '2019-11-11 00:00:00'ORDER BY statu...

2019-11-14 02:54:59 232

原创 解决 appcompat 1.1.0 导致 webview crash 的问题

Android SDK 太不让人省心了,正式版本居然也埋雷。前段时间把 support 升级到了 androidx,appcompat 自动升级了新版本 androidx.appcompat:appcompat:1.1.0。简单回归了下功能就发上线了,结果在在 5.1 的系统上发生了大规模的 crash,抛出的异常是找不到资源。java.lang.RuntimeException: Una...

2019-11-08 18:04:44 3036 4

原创 Dart更近一步,Sky会一统江湖吗?

简单来说,Sky engine 是一个图形系统,VDOM 的创建和diff应该也是它负责的,而 Sky framework 则是一个UI库,提供了我们创建 VDOM 时所需的节点元素。mojo 就是 sky 的运行时环境,mojo-sdk 提供了基于 mojo 做二次开发所用到的 API。

2015-05-05 00:30:23 15434 6

原创 Dart是一个怎样的语言?

这几天看到一篇新闻 - 白兼容了?Google 正在为 Android 准备一个去 Java 化的 Dart 应用运行框架,对与新闻的标题和内容无力吐槽,不做评论。但是Google推出 sky 似乎证明了native的开发方式越来越向web方式靠近的趋势,最近比较火的要数 react-native 了,他们的原理是类似的,都是先构造一个 virtual dom tree,然后只更新发生变化的 dom

2015-05-04 02:03:01 23414 9

原创 如何在vi中优雅地使用ex

记得刚开始用vi的时候,只会用:wq或者:q来退出,后来又学会了ZZ,今天上班路上没事做,又把 Learning the Vi & Vim 的 Introducing the ex Editor 过了一遍,又发现了一个退出命令-:x,其实很早以前这些内容都看过,但是由于使用惯性,渐渐地会把一些平时不太用到的命令给遗忘了,其实一个防止遗忘的好办法就是认真总结一下,方便以后查阅。其实当我们在命令模式下按

2015-02-16 19:49:02 2047

原创 用bytecode来看try-catch-finally和return

之前看过一篇关于return和finally执行顺序的文章,仅在Java的语言层面做了分析,其实我倒觉得直接看bytecode可能来的更清晰一点。最近一直在看Java虚拟机规范,发现直接分析bytecode更能加深对Java语言的理解。先看一个只有try-finally,没有catch的例子。try - finallypublic class ExceptionTe...

2014-10-19 22:39:54 3194

原创 一个简单的数据增量更新策略(Android / MongoDB / Django)

我在做个人APP - CayKANJI - 的时候遇到一个问题:怎样增量式地把日语汉字数据地从服务器更新到APP端,即每次用户执行更新操作时,只获取版本高于本地缓存的内容。数据格式为了能够与mongoDB无缝结合,并省去编写后台代码的麻烦,索性就把汉字数据保存成json文件,上传到服务器后,交给web应用去读取并写入数据库。汉字文件就是普通的json格式。...

2014-10-15 22:49:37 5746 1

原创 怎样继承一个内部类

定义一个内部类时,这个内部类会有一个隐式引用(implicit reference)指向外部类的实例。例如下面的代码:class WithInner { class Inner {}}其实,内部类Inner默认会有一个带参数的构造函数,我们通过反射来看一下。import java.lang.reflect.Constructor;import java.lang....

2014-09-19 21:06:28 8997 1

翻译 为什么要使用内部类?

翻译自《Thinking In Java》我们经常会在一个类中定义一个内部类(inner class),这个内部类可以继承也可以实现接口,因为有一个隐式的引用(explicit reference)指向外部类(outer class),所以我们可以直接访问并操作外部类。因此可以认为内部类是外部类的一个窗口。An inner class provides a kind of windo...

2014-09-19 17:36:02 3914

原创 wait / notify / notifyAll 和 synchronized method / block

调用wait, notify, notifyAll的代码必须位于synchronized内,否则系统会抛出IllegalMonitorStateException的异常。首先来了解一下关键字 synchronized。synchronized为了解决共享资源并发访问的为题,Java内置了synchronized关键字来解决线程同步问题。先看下面这个例子,两个不同的线程同时对变...

2014-09-15 20:42:00 2043

原创 Vim -> 边确认边查找替换

进行全局查找替换的时候,可以使用ex的以下命令:%s/which/what/g其中% 表示每一行(everyline)s 表示 substitutewhich 是查找的内容,what是用来替换的内容g 表示 global这样可以快速的实现全局的查找替换功能,但是有时候我们并不想一次性完成所有的替换操作,有可能只想替换一部分。实现这种操作,我们首先想到

2014-08-06 23:48:54 3759

原创 Vim -> 移动光标

MovementCommand前翻一屏Ctrl + F后翻一屏Ctrl + B前翻半屏Ctrl + D后翻半屏Ctrl + U前滚一行Ctrl + E后滚一行Ctrl + Y滚动当前行到屏幕最顶端z[Enter]滚动当前行到屏幕中央z.z-

2014-08-06 18:12:09 1914

原创 python -> lambda与def的区别

lambda可以定义一个匿名函数,而def定义的函数必须有一个名字。这应该是lambda与def两者最大的区别。与Javascript不同的是,python中匿名函数与非匿名函数需要使用不同的语法来定义。这是因为:lambda是一个expression,不是一个statement。lambda is an expression, not a statement.

2014-07-28 11:58:03 6461

原创 python3 -> 函数注释 Function Annotations

Python 3.X新增加了一个特性(Feature),叫作函数注释 Function Annotations它的用途虽然不是语法级别的硬性要求,但是顾名思义,它可做为函数额外的注释来用。Python中普通的函数定义如下:def func(a, b, c): return a + b + c>>> func(1, 2, 3)6添加...

2014-07-28 11:30:34 16543

原创 Python -> 函数式编程的一些基本原则

Coupling: use arguments for inputs and return for outputs

2014-07-28 10:03:39 1949

原创 python中神奇的格式化输出

python一共有两种格式化输出语法,一种是类似于C语言printf的方式,称为 Formatting Expression>>> '%s %d-%d' % ('hello', 7, 1)'hello 7-1'另一种是类似于C#的方式,称为String Formatting Method Calls>>> '{0} ...

2014-07-09 11:59:12 56838

原创 Python中字符串的有趣玩法

反转一个字符串>>> S = 'abcdefghijklmnop'>>> S[::-1]'ponmlkjihgfedcba'这种用法叫做three-limit slices除此之外,还可以使用slice对象,例如>>> 'spam'[slice(None, None, -1)]>>>unicode码与字符(single-character strings)之间

2014-07-08 13:53:35 2522

原创 Python中的不同进制的语法和转换

不同进制的书写方式八进制(Octal) 0o377十六进制(Hex) 0xFF二进制(Binary) 0b11111111不同进制之间的转换python提供了三个内置的函数,可以用来在不同进制间做转换。>>> oct(255), hex(255), bin(255)('0o377', '0xff', '0b11111111')还可以使用int函数,把字符串转成数值>

2014-07-07 11:52:13 3598

原创 css3 -> 多栏布局

在进行多栏布局时,使用bootstrap的栅格系统可以很轻松的实现效果,其实css3本身也提供了多兰布局的功能。比如,我们在一个section标签内填充了很多内容,同时希望内容能够显示成三列,那么可以通过如下css来实现(使用chrome浏览器)。设置分栏的数量section { -webkit-column-count: 3;}根据宽度分栏section { -w

2014-06-01 17:32:12 6382

原创 jQuery -> 获取元素的各种过滤器(filter)

通过顺序来选择顺序选择的过滤器(filter)有:first 第一个元素:last 最后一个元素:even 序号为偶数的元素:odd 序号为奇数的元素:eq(n) 序号等于n的元素 :lt(n)序号小于n的元素 :gt(n)序号大于n的元素如果有如下的表格0even1odd2even3odd4even

2014-05-22 18:18:20 7933 5

原创 jQuery -> 获取兄弟元素

获取指定元素的兄弟元素时,可以使用adjacent sibling combinator (+),其中+的两侧内容都是selector expression.如果要获取下例中所有的 h1的直接兄弟元素h2 Main title Section title Some content... Section title More content...

2014-05-22 17:05:14 4666

原创 jQuery -> 获取孩子节点

jQuery提供了很多方法来获取一个元素的direct descendant(直接后代)。最简单的方式是使用direct descendant combinator (>)例如,如果要获取如下html代码中的直接孩子节点中的a元素,就可以直接使用> 符号jQueryjQuery tutorial使用selector获取$('content > a');

2014-05-22 15:53:23 21459

原创 jQuery -> 获取/设置HTML或TEXT内容

jQuery提供了两个API可以直接用来为元素添加内容。html()text()其中html()是为指定的元素添加html内容text()是为指定的元素添加文本内容两者的区别在于,text中的内容是纯文本,不会被解析为html如果要对如下html代码进行操作使用html()$('p').html('Hello World, I am a

2014-05-22 13:52:27 1882 1

原创 jQuery -> 获取/设置/删除DOM元素的属性

jQuery的属性操作非常简单,下面以一个a元素来说明属性的获取/设置/删除操作jquery.com添加属性$('a').attr('href', 'http://www.jquery.com')添加多个属性$('a').attr({'href':'http://www.jquery.com', 'title':'jquery.com'})获取属性$('a').at

2014-05-22 12:51:48 2730

原创 jQuery -> 克隆DOM元素

jQuery总clone的用法,顺便讲解了end的用法

2014-05-22 12:04:59 14311

原创 软考 -> 网络中各种交换设备

以太网交换机根据数据链路层MAC地址进行帧交换;帧中继网和ATM网都是面向连接的通信网,交换机根据预先建立的虚电路标识进行交换。帧中继的虚电路号是DLCI,进行交换的协议数据单元为“帧”;ATM网的虚电路号为VPI和VCI,进行交换的协议数据单元为“信元”;三层交换机是指因特网中使用的高档交换机,这种设备把MAC交换的高带宽和低延迟优势与网络层分组路由技术结合起来,

2014-05-20 18:52:28 2053

原创 软考 -> 结构化综合布线系统(Structure Cabling System)

结构化布线系统结构化综合布线系统(Structure Cabling System)是基于现代计算机技术的通信物理平台,集成了语音、数据、图像和视频的传输功能,消除了原有通信线路在传输介质上的差别。工作区子系统 Work Location工作区子系统是由终端到信息插座的整个区域。一个独立的需要安装终端设备的区域划分成一个工作区。工作区应支持电话、数据终端、计算机、电视机、监视器以及传感

2014-05-20 17:26:44 3469

原创 软考 -> 子网172.6.32.0/20被划分成子网172.6.32.0/26

为了复习一下计算机知识,响应公司号召参加软考,看书过程中发现好多知识都忘却了。。。比如,下面这道题目,我是真不会啊。如果子网172.6.32.0/20被划分成子网172.6.32.0/26,则下面的结论中正确的是()A. 被划分成62个子网B. 每个子网有64个主机地址C. 被划分成32个子网D. 每个子网有62个主机地址

2014-05-20 15:34:34 8835

原创 jQuery -> 删除/替换DOM元素

删除删除操作非常简单,直接在结果集后链式调用remove()方法即可。例如,要删除以下html脚本中所有的a元素,直接通过$('a'.remove();就可以做到了。 Anchors Anchor Element Anchor Element Anchor Element当然也可以通过向remove传参的形式来过滤选择结果,然后再执行remove操作。$(

2014-05-19 17:22:56 4018

原创 jQuery -> 如何【先创建、再修改、后添加】 DOM元素

如何一气呵成地,on the fly地操作DOM元素呢?例如顺序执行【创建】-> 【修改】-> 【添加】三个动作。由于jQuery支持链式操作,其实就是设计模式的builder模式,所以我们可以把三个操作串在一起来执行。首先创建一个p元素,内容包含一个a元素。$('jQuery')然后为a元素添加一个href属性$('jQuery').find('a').a

2014-05-19 16:57:34 2493

设计模式 可复用面向对象软件的基础

Gof 的经典之作,软件设计师必读,设计模式 面向对象

2009-08-25

UCOS-II内核调度分析(0331版本)

uCOS进阶教程,内容深入浅出,很好很实用。

2009-07-23

uCOSII中文教程

嵌入式学习很好资料。 uCOS操作系统学习的良师益友

2009-07-23

基于OpenGL的贪吃蛇小游戏

基于OpenGL,利用MFC9.0开发的贪吃蛇小游戏 贪吃蛇 游戏

2009-06-19

实用分形图形学 计算机图形学

其中计算机分形图形学中讲述的部分在里面都用数学定理形式给出证明。数学理论代码

2009-05-26

写好代码的是个秘诀 程序员开发宝典

一部很好的编码规范介绍以及如何在平时的编码中养成良好的编码习惯

2009-04-26

自己动手写操作系统 操作系统 LINUX

操作系统,LINUX 自己动手写,名师之作,很好很强大。

2009-04-26

用MFC实现手机串口通信

MFC 实现了通过电脑终端向手机发送AT指令来操作手机各种功能,增加了自动检测端口功能。

2009-04-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除