<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[amurocrash的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/amurocrash</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; amurocrash]]></copyright><item><title><![CDATA[读源码（七）—— ejs]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/124125040</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/124125040</guid><author>amurocrash</author><pubDate>Tue, 12 Apr 2022 16:08:18 +0800</pubDate><description><![CDATA[ejs是一个轻量的模板渲染引擎，通过简单的&lt;%%&gt;标签就能实现简单的模板渲染。本文仅针对&lt;%%&gt;和&lt;%=%&gt;两个常用标签进行分析。
入口代码，api保持了与ejs完全一致
const ejs = require('./ejs')

const html = '&lt;%if(test){%&gt;&lt;div&gt;&lt;%=user.firstName%&gt;&lt;/div&gt;&lt;%}else{%&gt;&lt;%=user.lastName%&gt;&]]></description><category></category></item><item><title><![CDATA[Algorithm Review 4 跳表]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/119848847</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/119848847</guid><author>amurocrash</author><pubDate>Sun, 22 Aug 2021 10:26:51 +0800</pubDate><description><![CDATA[跳表的思想起点来自二分搜索，大家都知道一个排好序的数组进行二分搜索是很容易的，就是每次选择中间的数据，看看比要搜索的数据大还是小，大的话就向右搜索，小的话就向左搜索，复杂度是惊人的O(log(n))，比如42 亿个数据中用二分查找一个数据，最多也只需要比较 32 次。
但是对于redis这样的工具来说，会有频繁的插入删除操作，我们知道数组的插入删除操作性能是比较低的，因为需要O(n)次的移动。而对插入删除友好的是链表，只要断开指针前后调一下就好了，但问题是找到需要插入的位置是很麻烦的，需要遍历一遍链表，所以]]></description><category></category></item><item><title><![CDATA[170行写一个vuex]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/118343184</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/118343184</guid><author>amurocrash</author><pubDate>Tue, 29 Jun 2021 21:28:50 +0800</pubDate><description><![CDATA[Vuex源码不多，1000多行，排除各种报错，兼容，语法糖和拓展功能，其实就干了两件事：
1、把外部传入的store对象组织成了一棵树型的数据结构
2、把state和getters的数据变成响应式，保证界面中可以双向绑定
按照这个需求，结合vuex的实现思路自己写了个vuexx，个人一直不太接受vuex3里的面向对象组织形式，深入源码可以看到state和action、mutation等的组织方式是不太一样的，比如state.module.type 和 dispatch(‘module/type’)，太蛋疼了]]></description><category></category></item><item><title><![CDATA[读源码（六）—— Vue响应式]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/111194479</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/111194479</guid><author>amurocrash</author><pubDate>Sat, 19 Dec 2020 22:53:34 +0800</pubDate><description><![CDATA[例子：
&lt;template&gt;
  &lt;div id="app"&gt;
    &lt;img src="../assets/logo.png"&gt;
    &lt;div v-if="flag"&gt;
      {{msg}}
    &lt;/div&gt;
    &lt;div v-else&gt;
      {{msg1}}
    &lt;/div&gt;
    &lt;button @click="change"&gt;change&lt;/button&gt;
 ]]></description><category></category></item><item><title><![CDATA[读源码（五）—— new Vue]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/111193893</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/111193893</guid><author>amurocrash</author><pubDate>Tue, 15 Dec 2020 10:59:05 +0800</pubDate><description><![CDATA[标准Vue HelloWorld的例子（内容简化）：
// main.js
new Vue({
  el: '#app',
  render: h =&gt; h(App)
})

// App.vue
&lt;template&gt;
  &lt;div id="app"&gt;
    &lt;img src="./assets/logo.png"&gt;
    &lt;hello-world&gt;&lt;/hello-world&gt;
  &lt;/div&gt;
&lt;/template&g]]></description><category></category></item><item><title><![CDATA[前端日常tips记录]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/110494264</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/110494264</guid><author>amurocrash</author><pubDate>Wed, 02 Dec 2020 18:29:04 +0800</pubDate><description><![CDATA[持续更新…
一、div嵌套的事件拦截
网上能查到的大多是拦截冒泡，但下面的例子是拦截事件往内部传递，在外部就拦截掉
&lt;div class="outer" @click.capture="outerClick($event)"&gt;
    &lt;div class="inner" @click="innerClick($event)"&gt;&lt;/div&gt;
&lt;/div&gt;

outerClick(event) {
  console.log('outer')
  event.s]]></description><category></category></item><item><title><![CDATA[读源码（四）—— js Promise]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/107131046</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/107131046</guid><author>amurocrash</author><pubDate>Sat, 04 Jul 2020 21:56:07 +0800</pubDate><description><![CDATA[写了一些示例还有仿源码自己实现一个简单的MyPromise，主要内容都在代码注释中：
class PromiseTest {
  static test1() {
    const p = new Promise((resolve, reject) =&gt; {
      // resolve('result1')
      reject(new Error('error1'))
    })

    p.then(result =&gt; {
      console.log(result)
]]></description><category></category></item><item><title><![CDATA[读源码（三）—— Android LruCache]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/105431293</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/105431293</guid><author>amurocrash</author><pubDate>Sat, 11 Apr 2020 13:04:43 +0800</pubDate><description><![CDATA[文章目录Step1、示例Step2、构造函数Step3、增删改查一、增加或修改元素二、访问元素三、删除元素
Step1、示例
考虑用图片来模拟太麻烦，就弄个简单的类吧：
public class LruCacheTestActivity extends DefaultActivity {

    static final String tag = "lru";

    @Override
  ...]]></description><category></category></item><item><title><![CDATA[读源码（二）—— Android AsyncTask]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/105414533</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/105414533</guid><author>amurocrash</author><pubDate>Thu, 09 Apr 2020 19:20:37 +0800</pubDate><description><![CDATA[文章目录Step1、示例代码Step2、创建任务Step3、串行，execute()，并行，executeOnExecutor()Step4、postResultStep Extra、更新进度
这个其实现在已经不怎么用了，而且本身原理不复杂，就简单说一下吧。
老规矩先贴一个调用的代码，然后根据大流程来分析。
Step1、示例代码
public class AsyncTaskTestActivity...]]></description><category></category></item><item><title><![CDATA[读源码（一）—— Android handler机制详解]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/105380703</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/105380703</guid><author>amurocrash</author><pubDate>Wed, 08 Apr 2020 19:45:00 +0800</pubDate><description><![CDATA[预备知识

Java的ThreadLocal，保存线程的“私有”数据，这个不贴参考链接了，比较easy；
Linux的epoll机制，底层真正的消息处理机制，没有消息的时候阻塞不消耗cpu资源，非常复杂但是也非常有趣，参考：https://blog.youkuaiyun.com/shenya1314/article/details/73691088；
享元模式——Message复用，模板模式——hanlder...]]></description><category></category></item><item><title><![CDATA[自己写代码理解Vue的数据双向绑定]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/104309310</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/104309310</guid><author>amurocrash</author><pubDate>Fri, 14 Feb 2020 13:11:14 +0800</pubDate><description><![CDATA[重要代码的作用都写在代码注释中了。
核心点：
1、Object.defineProperty()，相当于给相关属性在取值和赋值时增加proxy，可以执行proxy中的功能，这里就是在get是进行双向绑定
2、Compiler的本质就是遍历html文档，把按照vue规范定的字段找出来做处理。比如{{deep.a}}取出来之后，从vm实例中拿出真实的值把{{deep.a}}替换掉。
&lt;!DOCT...]]></description><category></category></item><item><title><![CDATA[Android programmer成长学习路径]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/80966496</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/80966496</guid><author>amurocrash</author><pubDate>Mon, 09 Jul 2018 11:18:53 +0800</pubDate><description><![CDATA[一、基础



1、C &amp;amp; C++

从Android应用层的要求来说，简单的界面和业务开发的确只需要java基础就够了。但是从Android程序员甚至前端、全栈程序员的要求来说，只会java只懂面向对象不懂内存和指针那就远远不够了。C和C++都是一个大坑，但其实如果先学的java已经有了比较完备的编程思想，其实只要从指针后面开始学习就ok了，C的话还要深入了解一下结构体，函数指针，内存控...]]></description><category></category></item><item><title><![CDATA[使用Cocoapods制作带测试Example的framework]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/79894183</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/79894183</guid><author>amurocrash</author><pubDate>Wed, 11 Apr 2018 16:10:29 +0800</pubDate><description><![CDATA[为了搞这个东西绕了我两天，总算是搞定了，记录一下防止下次再被坑，感慨下还是我家gradle好用~



一、安装cocoapods

sudo gem install cocoapods

很多blog都用的淘宝啥的镜像，自己搞了半天建议还是翻墙直接用原版的，不然版本问题，镜像问题啥的又弄得死去活来。 
一堆控制台刷屏后完成，测试一下：



pod --version

输出版本号表示安装成功~...]]></description><category></category></item><item><title><![CDATA[记录一些常用的adb命令]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/79867995</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/79867995</guid><author>amurocrash</author><pubDate>Mon, 09 Apr 2018 16:06:13 +0800</pubDate><description><![CDATA[手机 to mac

adb pull sdcard/Download/PacketCapture_downcc.apk ~/Downloads



mac to 手机

adb push PacketCapture_downcc.apk /sdcard/



adb挂掉

大部分时候reset adb就好，如果还不行，出现以下错误：  
‘adb.exe start-server’ fail...]]></description><category></category></item><item><title><![CDATA[自己用的Android面试笔试题汇总（持续更新）]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/79850754</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/79850754</guid><author>amurocrash</author><pubDate>Sun, 08 Apr 2018 14:38:55 +0800</pubDate><description><![CDATA[看上去Android开发只是一个app或者sdk的工作内容，但想要做到优秀的话其实要懂的东西还是非常多的。知识体系从底层的操作系统、jvm虚拟机到上层的各种复杂的界面制作，设计模式，架构设计等等，语言要懂java，C，C++，后面可能还要懂kotlin。当然术业有专攻，不同的岗位不同的项目需求应该还是有所区别。本文力求总结这样一份较为全面且有区分度的面试题集合，当然主要还是自己招人用，也欢迎大家提...]]></description><category></category></item><item><title><![CDATA[Android常见文件目录]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/79346993</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/79346993</guid><author>amurocrash</author><pubDate>Thu, 22 Feb 2018 14:12:07 +0800</pubDate><description><![CDATA[Environment.getExternalStorageState:mounted  
Environment.getDownloadCacheDirectory().getPath():/cache  
Environment.getDataDirectory().getPath():/data  
Environment.getExternalStorageDirectory().getP...]]></description><category></category></item><item><title><![CDATA[APK加壳原理简述]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/79103189</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/79103189</guid><author>amurocrash</author><pubDate>Fri, 19 Jan 2018 09:52:36 +0800</pubDate><description><![CDATA[先把核心原理记录一下，代码随后再补。

PRE、dex文件结构知识和加壳原理 
先看下dex文件的基本结构 
 
对于加壳主要关注3个关键字： 
1）checksum  
文件校验码，使用alder32算法，校验文件除了maigc和checksum外余下的所有文件区域，用于检查文件错误。 
2）signature  
使用SHA-1算法hash除了magic ,checksum和signature]]></description><category></category></item><item><title><![CDATA[15个JUnit测试方法教会你常用的RxAndroid套路]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/78914980</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/78914980</guid><author>amurocrash</author><pubDate>Wed, 27 Dec 2017 18:04:18 +0800</pubDate><description><![CDATA[RxJava的概念原理思想这里就不说了，百度可以找到一堆。个人始终坚持讲一堆有的没的，不如看几段实际代码，所以本文就不废话了，不知道RxAndroid怎么用的，下面类里翻具体的测试方法代码就行了，都加上了说明和注释。尤其最后几个模仿网络请求的例子。package com.amuro.corelib;import android.support.test.runner.AndroidJUnit4;
i]]></description><category></category></item><item><title><![CDATA[关于HashMap你要知道的事情]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/78882498</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/78882498</guid><author>amurocrash</author><pubDate>Sat, 23 Dec 2017 22:09:38 +0800</pubDate><description><![CDATA[一、HashMap的定义和重要成员变量public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable 熟悉源码的童鞋会很奇怪，为啥AbstractMap已经实现了Map接口，HashMap还要再实现一遍呢？为啥呢？我™也不知道……直接看HashMap的重要成员变量：]]></description><category></category></item><item><title><![CDATA[Java并发编程学习（四）—— Lock]]></title><link>https://blog.youkuaiyun.com/amurocrash/article/details/78779594</link><guid>https://blog.youkuaiyun.com/amurocrash/article/details/78779594</guid><author>amurocrash</author><pubDate>Wed, 13 Dec 2017 09:25:23 +0800</pubDate><description><![CDATA[一、ReentrantLock

1、Reentrant其实是ReEntrant，可重入的意思。先来个标准例子：



package com.amuro.studythread.chapter4_lock;

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample
{
    publ]]></description><category></category></item></channel></rss>