自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 收藏
  • 关注

原创 读源码(七)—— ejs

ejs是一个轻量的模板渲染引擎,通过简单的<%%>标签就能实现简单的模板渲染。本文仅针对<%%>和<%=%>两个常用标签进行分析。入口代码,api保持了与ejs完全一致const ejs = require('./ejs')const html = '<%if(test){%><div><%=user.firstName%></div><%}else{%><%=user.lastName%>&

2022-04-12 16:08:18 660

原创 Algorithm Review 4 跳表

跳表的思想起点来自二分搜索,大家都知道一个排好序的数组进行二分搜索是很容易的,就是每次选择中间的数据,看看比要搜索的数据大还是小,大的话就向右搜索,小的话就向左搜索,复杂度是惊人的O(log(n)),比如42 亿个数据中用二分查找一个数据,最多也只需要比较 32 次。但是对于redis这样的工具来说,会有频繁的插入删除操作,我们知道数组的插入删除操作性能是比较低的,因为需要O(n)次的移动。而对插入删除友好的是链表,只要断开指针前后调一下就好了,但问题是找到需要插入的位置是很麻烦的,需要遍历一遍链表,所以

2021-08-22 10:26:51 167

原创 170行写一个vuex

Vuex源码不多,1000多行,排除各种报错,兼容,语法糖和拓展功能,其实就干了两件事:1、把外部传入的store对象组织成了一棵树型的数据结构2、把state和getters的数据变成响应式,保证界面中可以双向绑定按照这个需求,结合vuex的实现思路自己写了个vuexx,个人一直不太接受vuex3里的面向对象组织形式,深入源码可以看到state和action、mutation等的组织方式是不太一样的,比如state.module.type 和 dispatch(‘module/type’),太蛋疼了

2021-06-29 21:28:50 131

原创 读源码(六)—— Vue响应式

例子:<template> <div id="app"> <img src="../assets/logo.png"> <div v-if="flag"> {{msg}} </div> <div v-else> {{msg1}} </div> <button @click="change">change</button>

2020-12-19 22:53:34 175

原创 读源码(五)—— new Vue

标准Vue HelloWorld的例子(内容简化):// main.jsnew Vue({ el: '#app', render: h => h(App)})// App.vue<template> <div id="app"> <img src="./assets/logo.png"> <hello-world></hello-world> </div></template&g

2020-12-15 10:59:05 101

原创 前端日常tips记录

持续更新…一、div嵌套的事件拦截网上能查到的大多是拦截冒泡,但下面的例子是拦截事件往内部传递,在外部就拦截掉<div class="outer" @click.capture="outerClick($event)"> <div class="inner" @click="innerClick($event)"></div></div>outerClick(event) { console.log('outer') event.s

2020-12-02 18:29:04 195 3

原创 读源码(四)—— js Promise

写了一些示例还有仿源码自己实现一个简单的MyPromise,主要内容都在代码注释中:class PromiseTest { static test1() { const p = new Promise((resolve, reject) => { // resolve('result1') reject(new Error('error1')) }) p.then(result => { console.log(result)

2020-07-04 21:56:07 177

原创 读源码(三)—— Android LruCache

文章目录Step1、示例Step2、构造函数Step3、增删改查一、增加或修改元素二、访问元素三、删除元素Step1、示例考虑用图片来模拟太麻烦,就弄个简单的类吧:public class LruCacheTestActivity extends DefaultActivity { static final String tag = "lru"; @Override ...

2020-04-11 13:04:43 149

原创 读源码(二)—— Android AsyncTask

文章目录Step1、示例代码Step2、创建任务Step3、串行,execute(),并行,executeOnExecutor()Step4、postResultStep Extra、更新进度这个其实现在已经不怎么用了,而且本身原理不复杂,就简单说一下吧。老规矩先贴一个调用的代码,然后根据大流程来分析。Step1、示例代码public class AsyncTaskTestActivity...

2020-04-09 19:20:37 130

原创 读源码(一)—— Android handler机制详解

预备知识Java的ThreadLocal,保存线程的“私有”数据,这个不贴参考链接了,比较easy;Linux的epoll机制,底层真正的消息处理机制,没有消息的时候阻塞不消耗cpu资源,非常复杂但是也非常有趣,参考:https://blog.csdn.net/shenya1314/article/details/73691088;享元模式——Message复用,模板模式——hanlder...

2020-04-08 19:45:00 224

原创 自己写代码理解Vue的数据双向绑定

重要代码的作用都写在代码注释中了。核心点:1、Object.defineProperty(),相当于给相关属性在取值和赋值时增加proxy,可以执行proxy中的功能,这里就是在get是进行双向绑定2、Compiler的本质就是遍历html文档,把按照vue规范定的字段找出来做处理。比如{{deep.a}}取出来之后,从vm实例中拿出真实的值把{{deep.a}}替换掉。<!DOCT...

2020-02-14 13:11:14 153

原创 Android programmer成长学习路径

一、基础1、C &amp; C++从Android应用层的要求来说,简单的界面和业务开发的确只需要java基础就够了。但是从Android程序员甚至前端、全栈程序员的要求来说,只会java只懂面向对象不懂内存和指针那就远远不够了。C和C++都是一个大坑,但其实如果先学的java已经有了比较完备的编程思想,其实只要从指针后面开始学习就ok了,C的话还要深入了解一下结构体,函数指针,内存控...

2018-07-09 11:18:53 443

原创 使用Cocoapods制作带测试Example的framework

为了搞这个东西绕了我两天,总算是搞定了,记录一下防止下次再被坑,感慨下还是我家gradle好用~一、安装cocoapodssudo gem install cocoapods很多blog都用的淘宝啥的镜像,自己搞了半天建议还是翻墙直接用原版的,不然版本问题,镜像问题啥的又弄得死去活来。 一堆控制台刷屏后完成,测试一下:pod --version输出版本号表示安装成功~...

2018-04-11 16:10:29 599

原创 记录一些常用的adb命令

手机 to macadb pull sdcard/Download/PacketCapture_downcc.apk ~/Downloadsmac to 手机adb push PacketCapture_downcc.apk /sdcard/adb挂掉大部分时候reset adb就好,如果还不行,出现以下错误: ‘adb.exe start-server’ fail...

2018-04-09 16:06:13 247

原创 自己用的Android面试笔试题汇总(持续更新)

看上去Android开发只是一个app或者sdk的工作内容,但想要做到优秀的话其实要懂的东西还是非常多的。知识体系从底层的操作系统、jvm虚拟机到上层的各种复杂的界面制作,设计模式,架构设计等等,语言要懂java,C,C++,后面可能还要懂kotlin。当然术业有专攻,不同的岗位不同的项目需求应该还是有所区别。本文力求总结这样一份较为全面且有区分度的面试题集合,当然主要还是自己招人用,也欢迎大家提...

2018-04-08 14:38:55 672

转载 Android常见文件目录

Environment.getExternalStorageState:mounted Environment.getDownloadCacheDirectory().getPath():/cache Environment.getDataDirectory().getPath():/data Environment.getExternalStorageDirectory().getP...

2018-02-22 14:12:07 431

原创 APK加壳原理简述

先把核心原理记录一下,代码随后再补。PRE、dex文件结构知识和加壳原理 先看下dex文件的基本结构 对于加壳主要关注3个关键字: 1)checksum 文件校验码,使用alder32算法,校验文件除了maigc和checksum外余下的所有文件区域,用于检查文件错误。 2)signature 使用SHA-1算法hash除了magic ,checksum和signature

2018-01-19 09:52:36 2806

原创 15个JUnit测试方法教会你常用的RxAndroid套路

RxJava的概念原理思想这里就不说了,百度可以找到一堆。个人始终坚持讲一堆有的没的,不如看几段实际代码,所以本文就不废话了,不知道RxAndroid怎么用的,下面类里翻具体的测试方法代码就行了,都加上了说明和注释。尤其最后几个模仿网络请求的例子。package com.amuro.corelib;import android.support.test.runner.AndroidJUnit4;i

2017-12-27 18:04:18 326

原创 关于HashMap你要知道的事情

一、HashMap的定义和重要成员变量public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 熟悉源码的童鞋会很奇怪,为啥AbstractMap已经实现了Map接口,HashMap还要再实现一遍呢?为啥呢?我™也不知道……直接看HashMap的重要成员变量:

2017-12-23 22:09:38 1206

原创 Java并发编程学习(四)—— Lock

一、ReentrantLock1、Reentrant其实是ReEntrant,可重入的意思。先来个标准例子:package com.amuro.studythread.chapter4_lock;import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample{ publ

2017-12-13 09:25:23 236

原创 Java并发编程学习(三)——线程通信

一、wait and notify1、先看一个最low的线程通信例子package com.amuro.studythread.chapter3_communication;import java.util.ArrayList;import java.util.List;public class CommLowestVer{ public static void main(String[

2017-12-12 09:33:30 179

原创 Java并发编程学习(二)—— 对象及变量的并发访问

一、synchronized1、synchronized取得的都是对象锁,而不是把一段代码或方法当做锁。package com.amuro.studythread.chapter_2_concurrent_access;public class SynchronizedBase{ public static void main(String[] args) { Sy

2017-12-10 11:40:59 170

原创 Java并发编程学习(一)——标准Thread

1、虽然System.out.println内部是加了锁的,但是如果System.out.println(i- -),依然是线程不安全的,因为有的JVM,i- -需要三步才能完成。2、通过interrupt方法停止线程public class IntteruptStop{ public static void main(String[] args) { try

2017-12-07 14:58:30 225

原创 JavaScript设计模式(二)

JavaScript设计模式(二)

2017-12-06 16:36:10 420

原创 JavaScript设计模式(一)

Intro一直很感兴趣对于JavaScript这样的动态类型语言,没有强类型也没有接口要怎么通过设计模式写出优雅的代码。这次一口气读完了腾讯出的一本关于JS设计模式的书,非常有启发,这里写一个小的系列给大家分享。还是那句话,设计是为了更好的解决问题,而不是为了设计而设计,所以重要的是理解思想,而不是当成一个模板去套。毕竟设计模式会带来性能的损耗和他人阅读代码学习成本的上升,如非必要,勿增实体,

2017-12-05 17:37:00 447

原创 教你写Http框架(三)

一拖拖一年系列…… Orz 其实发这篇是因为最近正好有机会写了个小的http框架,其实根本都不能叫框架,就是个工具类,不过呢,经过几年的磨练我也深刻的感受到了一点:设计是个好东西,但是设计过度却是一个魔鬼。看多了Android的源码会感受到其实设计时度的把握可能比设计本身还重要,比如800多k的一个View类,如果用设计模式强行设计重构的话,估计能写出来几百个文件吧。把理论用到实践中是技术,但是这

2017-11-22 17:25:35 483

原创 Android热修复之QQ空间与QFix方案

前文介绍了阿里的Hotfix,它的热修复思路是粗暴的底层方法指针的替换,今天我们来看看另一种思路,也就是QQ空间团队提供的热修复方案。要理解这个方案的思想,先要理解dex分包技术,这类文章很多,大家可以自己google研究学习,这里通过简单分析一下Android ClassLoader的源码来说一下这个问题。我们知道除了BootClassLoader外,Android主要提供了两个ClassLoa

2017-10-23 10:53:20 866

原创 Java层热修复框架实践

结合上一篇研究的内容,我们在这一篇实现一个简单的HotFix框架。上一篇有一个重要的内容没有讲,就是在实现方法的替换后,原来的方法中的内存就会被覆盖,如果我们还想要调用原来的方法怎么办呢?所以我们需要找个地方把原来的方法存起来,不过在具体实现的时候,会遇到一个问题,就是 Java的非static,非private的方法默认是虚方法,在调用这个方法的时候会有一个类似查找虚函数表的过程:mirror::

2017-10-09 08:39:33 634

原创 Android热修复之AndFix原理探索(黑科技热修复的Java层实现)

最近研究了一下阿里的AndFix框架,原理本身不复杂,但是深入探索后发现热修复这块原来有很多底层的知识和黑科技值得挖掘的,故形成本篇blog和大家分享。而AndFix框架本身的使用和集成可直接根据github的README来做,这里就不赘述了。AndFix项目地址:https://github.com/alibaba/AndFix先简单说说AndFix的原理,官方的图直接拉过来:总结起来就一句话

2017-09-30 08:53:43 714 1

原创 Algorithm Review 3 二分搜索树

前面两篇讲的排序,熟悉算法应用的童鞋都知道,排序其实是很多算法的子过程,也就是说很多算法在执行自己前,都要先对数据进行排序,才能发挥算法的核心优势。所以排序说完了,下面就要说算法的一个核心应用,搜索。一、二分查找法 二分查找法的思想非常朴实和经典,可以想象一样比如我们猜别人的年龄,一开始肯定是根据他的长相外貌特征,说一个大概的数字,如果对方说不对,那我们一定会追问对方是大了还是小了,而说出来的第一

2017-05-07 13:41:16 428

原创 Algorithm Review 2 堆排序

这一篇讲一讲堆排序。一、复习二叉堆 二叉堆是完全二叉树或者是近似完全二叉树。完全二叉树:只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。 (如果完全没有二叉树数据结构概念的童鞋建议先去学习下再来看)二叉堆满足两个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆

2017-05-05 16:03:15 319

原创 Algorithm Review 1 基础排序算法

整天做上层架构设计和写界面,把计算机最重要的算法与数据结构都忘得差不多了。所以从这篇开始系统地复习常见的算法与数据结构,这里会暂时抛弃Java,用C++来做,因为即使是Android系统,算法实现也大多是通过C或者C++编译成so来实现的。对于算法的描述我会尽量抛弃复杂的理论描述,尽量用大白话来让大家好理解。 第一篇是关于普通数组排序的,默认排序都是从小到大~一、冒泡排序 算法复杂度n^2

2017-04-17 09:53:37 444

原创 C语言实现面向对象

无意间在复习C的时候想到了这个主题,于是翻了点资料实现了一下,纯练手。//// main.c// individual_test//// Created by Amuro on 2016/12/28.// Copyright © 2016年 Amuro. All rights reserved.//#include <stdio.h>#include <stdlib.h>/**

2017-01-05 10:52:58 505

原创 J2EE学习笔记(四)

艾玛,记性真是差的要哭了,继续MySQL。子查询和连接的memento回头补,先上代码/**************以下是示例代码********************/ 子查询是指在另一个查询语句中的SELECT子句。例句:SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);其中,SELECT * FROM t1 …称为Outer

2016-12-22 17:16:14 337

原创 理解AIDL原理以及系统生成的源码

工具好用,但是会有一个缺点,就是会让你不得不依赖说明书。对于我这个记忆力很差的人来说,每次使用工具都要去翻说明书是一件极其痛苦的事情,而且还有很多坑会忘记怎么填。基于此,我很多时候会觉得不如自己去理解一下工具制造的方法,然后自己造一个好了,好像我的大脑是对这种东西印象特别深刻,所以下次遇到问题我写个工具直接用的效率,比查说明书再重新趟一遍坑要高不少。今天,我要把aidl这个工具给拆了。Part

2016-12-16 15:31:17 957

原创 J2EE学习笔记(三)

最近这几篇都是MySQL~~~~$.找了个64位5.5版本的下载地址,mark一下 http://dev.mysql.com/downloads/file/?id=457403$.启动与关闭MySQL服务(默认环境变量已经配置好MySQL安装目录的bin文件夹) 1.管理员cmd 2.net start mysql 3.net stop mysql$.登录和退出 登录 mysql -uu

2016-12-01 17:30:10 407

原创 J2EE学习笔记(二)

$.JavaBean JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性(set和get方法)。 典型案例:public class User{ private String name; private String pass

2016-11-28 15:23:17 334

原创 J2EE学习笔记(一)

零碎的记录一些重要但容易遗忘的point,感觉上帝就没给我点这个记忆力的技能……$. WEB-INF目录详解 WEB-INF目录客户端无法访问,只有服务器可以访问; classes文件夹,放置.class文件; lib文件夹,放置项目需要的jar包; web.xml,项目部署文件;$. web.xml中配置首页(直接url项目名称就能打开的页面)<welcome-file-list>

2016-11-23 17:19:21 466

原创 横竖横ScrollView嵌套时滑动冲突解决

以前其实解决过类似的问题,当时是ViewPager嵌套的冲突问题,没有做记录,所以这次又费力研究半天,想想还是把代码和思路记录下来方便以后参考。关于安卓的TouchEvent事件分发机制可以参考我之前写的blog,这里不再多说: http://blog.csdn.net/amurocrash/article/details/48729313首先是最外层的HorizontalScrollView(后

2016-11-08 15:51:10 1585

原创 轻量级多线程断点续传下载框架

我又来了,一个月写了三个小框架我也是屌屌的。一般的小项目,遇到下载的问题时都是简单的开一个线程然后通过流的方式来实现。少量的下载,文件也比较小的的时候,这样的方式都是OK的。但是如果真要做一款下载为主要功能的app的时候,或者项目中涉及大量下载任务的时候,首先,单线程下载速度慢的感人,其次,用户想要自由的暂停一些任务开始一些任务,而不是开始了就停不下来,另外,即使用户退出了,下次再点击下载的时候,如

2016-11-08 11:04:22 1641

空空如也

空空如也

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

TA关注的人

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