├── android ├── stuff.md ├── .DS_Store ├── assets │ ├── ClassLoader2.jpg │ ├── image-20190620211341946.png │ ├── image-20190702154102448.png │ └── image-20190702170503415.png ├── aac-extra-fragment.md ├── aac-lifecycle-sum-up.md ├── android-proguard.md ├── app-startup.md ├── webview.md ├── change-package-name.md ├── m-v-x.md ├── time-in-android.md ├── shared-preferences.md ├── android-q.md ├── android-dynamic.md ├── shapedrawable.md ├── asm.md ├── dalvik-and-art.md ├── activity-1.md ├── annotation-processor.md ├── androidx.md ├── import-so-libs.md ├── run-dex-directly.md ├── README.md ├── multidex.md ├── aac-paging.md ├── popupmenu.md ├── fragment.md ├── asynctask.md ├── google-io-2019.md ├── progressbar.md ├── dialog-fragment.md ├── r8.md ├── modular-app.md ├── permissions.md ├── aac.md └── rxjava2.md ├── gradle ├── README.md ├── assets │ └── desugar_2x.png ├── transform.md ├── gradle-params.md └── android-common-config.md ├── java ├── arraylist.md ├── jvm │ └── README.md ├── java-8.md ├── treemap.md ├── concurrent │ └── synchronized-and-volatile.md ├── .DS_Store ├── gc.md ├── thread.md ├── memory.md ├── java-7.md ├── lambda.md ├── overview.md ├── basic.md ├── README.md ├── linkedlist.md ├── array.md ├── class.md ├── simpledateformat.md ├── linkedblockingdeque.md ├── countdownlatch.md ├── stack.md ├── linkedhashmap.md ├── cyclicbarrier.md └── arraydeque.md ├── fed ├── js │ ├── es5 │ │ └── README.md │ ├── es6 │ │ └── README.md │ ├── typescript │ │ └── typescript.md │ ├── var-let-const.md │ ├── closure.md │ └── README.md ├── html │ ├── styles.md │ ├── attributes.md │ ├── plan.md │ ├── css-in-html.md │ └── README.md ├── review.md ├── .DS_Store ├── react │ └── README.md ├── README.md ├── css │ └── README.md └── roadmap.md ├── linux ├── command-file.md ├── mmap.md ├── .DS_Store ├── README.md ├── shell │ ├── how-to-write-a-shell-script.md │ ├── awesome-shell-scripts.md │ └── README.md └── commands.md ├── books ├── CoreJava │ ├── README.md │ └── Chap12-泛型程序设计.md ├── 图解Http │ ├── 第6章-HTTP首部.md │ ├── 第8章-确认访问用户身份的认证.md │ ├── 第5章-与HTTP协作的Web服务器.md │ ├── extras │ │ └── 图解Http.mindnode │ │ │ ├── contents.xml │ │ │ ├── viewState.plist │ │ │ ├── QuickLook │ │ │ └── Preview.jpg │ │ │ └── style.mindnodestyle │ │ │ ├── contents.xml │ │ │ └── metadata.plist │ ├── README.md │ ├── 第3章-HTTP报文内的HTTP信息.md │ ├── 第7章-确保Web安全的HTTPS.md │ ├── 第11章-Web的攻击技术.md │ ├── 第10章-构建Web内容的技术.md │ ├── 第2章-简单的HTTP协议.md │ ├── 第4章-返回结果的HTTP状态码.md │ ├── 第1章-了解Web及网络基础.md │ └── 第9章-基于HTTP的功能追加协议.md ├── AndroidHero │ ├── 第5章-Android Scroll分析.md │ ├── README.md │ ├── 第4章-ListView使用技巧.md │ └── 第3章-Android控件架构与自定义控件详解.md ├── ding-tou-shi-nian-cai-wu-zi-you.md ├── js-rzmj.md ├── AndroidArt │ ├── README.md │ ├── 第13章-综合技术.md │ ├── 第12章-Bitmap的加载和Cache.md │ ├── 第14章-JNI和NDK编程.md │ └── 第15章-Android性能优化.md ├── .DS_Store ├── JavaScriptDom编程艺术 │ ├── README.md │ ├── 第1章-JavaScript简史.md │ ├── 第3章-DOM.md │ └── 第2章-JavaScript语法.md ├── assets │ ├── image-20190617161804907.png │ ├── image-20190619113825785.png │ ├── image-20190619232514235.png │ ├── image-20190930110354319.png │ └── image-20190930142851833.png ├── ke-yi-lian-xi.md ├── App研发录 │ ├── 项目管理和团队建设.md │ ├── App竞品技术分析.md │ ├── 高效App框架设计与重构.md │ ├── App开发中的高级技巧.md │ └── README.md ├── zhi-shu-ji-jin-tou-zi-zhi-nan.md ├── xiao-gou-qian-qian.md ├── EffectiveJava │ ├── 第5章-泛型.md │ └── README.md ├── HeadFirstDesignPatterns │ ├── Compound.md │ ├── Flyweight.md │ ├── Strategy.md │ ├── Singleton.md │ ├── Visitor.md │ ├── Memento.md │ ├── Builder.md │ ├── Chain-of-Responsibility.md │ ├── Interpreter.md │ ├── Prototype.md │ ├── Mediator.md │ ├── Iterator.md │ ├── Facade.md │ ├── State.md │ ├── Observer.md │ ├── Decorator.md │ ├── Composite.md │ ├── Adapter.md │ ├── TemplateMethod.md │ ├── Proxy.md │ ├── FactoryMethod.md │ ├── README.md │ ├── Bridge.md │ ├── DesignPrinciple.md │ └── Command.md ├── README.md ├── man-hua-suanfa.md ├── kotlin-in-action.md ├── shen-ru-li-jie-android-1.md ├── bu-shang-ban-ye-you-qian.md └── README 2.md ├── .DS_Store ├── leetcode ├── README.md ├── 344-反转字符串.md └── 434-字符串中的单词数.md ├── others ├── .DS_Store └── sth.md ├── geek-course ├── .DS_Store ├── sjjgysfzm │ ├── 06-linkedlist.md │ ├── 05-array.md │ └── README.md └── tshttp │ └── README.md ├── kotlin ├── scoping-functions.md ├── kotlin-java-interop.md ├── kotlin-android.md ├── kotlin-code-style.md ├── android-ktx.md ├── kotlin-class.md ├── kotlin-jvm-annotations.md └── README.md ├── ds-algorithm-proj ├── src │ └── me │ │ └── yifeiyuan │ │ └── dsalgorithm │ │ ├── Main.java │ │ ├── swordoffer │ │ └── A.java │ │ ├── learn │ │ ├── LearnStack.java │ │ ├── LearnArrayList.java │ │ ├── LearnLinkedList.java │ │ └── LearnArray.java │ │ ├── leetcode │ │ └── Holder.java │ │ └── self │ │ ├── Node.java │ │ ├── MyLinkedStack.java │ │ ├── MyArrayStack.java │ │ ├── MyLinkedQueue.java │ │ ├── MyArrayCircularQueue.java │ │ └── MyArrayQueue.java ├── out │ └── production │ │ └── ds-algorithm-proj │ │ └── me │ │ └── yifeiyuan │ │ └── dsalgorithm │ │ ├── Main.class │ │ ├── self │ │ ├── Node.class │ │ ├── MyArrayQueue.class │ │ ├── MyArrayStack.class │ │ ├── MyLinkedQueue.class │ │ ├── MyLinkedStack.class │ │ └── MyArrayCircularQueue.class │ │ ├── swordoffer │ │ └── A.class │ │ ├── learn │ │ ├── LearnArray.class │ │ ├── LearnStack.class │ │ ├── LearnArrayList.class │ │ ├── LearnLinkedList.class │ │ ├── LearnLinkedList$Node.class │ │ └── LearnLinkedList$LinkedList.class │ │ └── leetcode │ │ └── Holder.class ├── .idea │ ├── misc.xml │ └── modules.xml ├── README.md └── ds-algorithm-proj.iml ├── financing └── README.md ├── ds ├── graph.md ├── queue.md ├── stack.md ├── README.md ├── adt.md ├── hashtable.md ├── tree.md └── array.md ├── algorithm └── README.md ├── flutter ├── flutter-roadmap.md └── README.md └── README.md /android/stuff.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gradle/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /java/arraylist.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /java/jvm/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fed/js/es5/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fed/js/es6/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /linux/command-file.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /books/CoreJava/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fed/html/styles.md: -------------------------------------------------------------------------------- 1 | # 样式 style -------------------------------------------------------------------------------- /linux/mmap.md: -------------------------------------------------------------------------------- 1 | # mmap 2 | 3 | -------------------------------------------------------------------------------- /books/图解Http/第6章-HTTP首部.md: -------------------------------------------------------------------------------- 1 | # 第6章-HTTP首部 -------------------------------------------------------------------------------- /java/java-8.md: -------------------------------------------------------------------------------- 1 | # Java 8 特性 2 | 3 | -------------------------------------------------------------------------------- /java/treemap.md: -------------------------------------------------------------------------------- 1 | # TreeMap 2 | 3 | -------------------------------------------------------------------------------- /books/AndroidHero/第5章-Android Scroll分析.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /books/ding-tou-shi-nian-cai-wu-zi-you.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /books/js-rzmj.md: -------------------------------------------------------------------------------- 1 | # JavaScript 忍者秘笈 2 | 3 | -------------------------------------------------------------------------------- /fed/review.md: -------------------------------------------------------------------------------- 1 | # 前端面试题 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /fed/html/attributes.md: -------------------------------------------------------------------------------- 1 | # 属性 attributes 2 | 3 | -------------------------------------------------------------------------------- /java/concurrent/synchronized-and-volatile.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /books/图解Http/第8章-确认访问用户身份的认证.md: -------------------------------------------------------------------------------- 1 | # 第8章-确认访问用户身份的认证 2 | -------------------------------------------------------------------------------- /books/AndroidArt/README.md: -------------------------------------------------------------------------------- 1 | # Android开发艺术探索 2 | 3 | 主席 4 | 5 | -------------------------------------------------------------------------------- /books/图解Http/第5章-与HTTP协作的Web服务器.md: -------------------------------------------------------------------------------- 1 | # 第5章-与HTTP协作的Web服务器 2 | 3 | 4 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/.DS_Store -------------------------------------------------------------------------------- /leetcode/README.md: -------------------------------------------------------------------------------- 1 | # LeetCode In Java 2 | 3 | 4 | 5 | [344.反转字符串](./344-反转字符串.md) -------------------------------------------------------------------------------- /fed/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/fed/.DS_Store -------------------------------------------------------------------------------- /fed/html/plan.md: -------------------------------------------------------------------------------- 1 | # HTML 学习计划 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /java/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/java/.DS_Store -------------------------------------------------------------------------------- /books/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/.DS_Store -------------------------------------------------------------------------------- /linux/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/linux/.DS_Store -------------------------------------------------------------------------------- /others/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/others/.DS_Store -------------------------------------------------------------------------------- /android/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/android/.DS_Store -------------------------------------------------------------------------------- /geek-course/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/geek-course/.DS_Store -------------------------------------------------------------------------------- /geek-course/sjjgysfzm/06-linkedlist.md: -------------------------------------------------------------------------------- 1 | # 06 | 链表(上):如何实现LRU缓存淘汰算法? 2 | 3 | 4 | 5 | 6 | 7 | 链表 8 | 9 | -------------------------------------------------------------------------------- /java/gc.md: -------------------------------------------------------------------------------- 1 | # Java 的垃圾回收机制 2 | 3 | 4 | 5 | 要搞懂这个需要明确几个点: 6 | 7 | 1. 什么是垃圾? 8 | 2. 该怎么回收垃圾? 9 | 10 | -------------------------------------------------------------------------------- /java/thread.md: -------------------------------------------------------------------------------- 1 | # Thread 2 | 3 | 线程 4 | 5 | 6 | 7 | ### 模型 8 | 9 | 10 | 11 | ### 资料 12 | 13 | -------------------------------------------------------------------------------- /books/JavaScriptDom编程艺术/README.md: -------------------------------------------------------------------------------- 1 | # JavsScript DOM 编程艺术 2 | 3 | 本书的重点:教会读者如何通过 JavaScript 使用 DOM。 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /fed/react/README.md: -------------------------------------------------------------------------------- 1 | # React 2 | 3 | > React is a JavaScript library for building user interfaces. 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /gradle/assets/desugar_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/gradle/assets/desugar_2x.png -------------------------------------------------------------------------------- /android/assets/ClassLoader2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/android/assets/ClassLoader2.jpg -------------------------------------------------------------------------------- /books/AndroidArt/第13章-综合技术.md: -------------------------------------------------------------------------------- 1 | # 第13章-综合技术 2 | 3 | 4 | CrashHandler 5 | 6 | Multidex 7 | 8 | 动态加载 9 | 10 | 反编译以及二次打包 -------------------------------------------------------------------------------- /java/memory.md: -------------------------------------------------------------------------------- 1 | # 内存模型 2 | 3 | 4 | 5 | ![image.png](http://ww2.sinaimg.cn/large/006tNc79ly1g5lh4qcfwyj30u00b4gly.jpg) 6 | 7 | -------------------------------------------------------------------------------- /java/java-7.md: -------------------------------------------------------------------------------- 1 | # Java 7 特性 2 | 3 | 4 | 5 | 6 | 7 | try with resourses 8 | 9 | 10 | 11 | 1_000 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /android/aac-extra-fragment.md: -------------------------------------------------------------------------------- 1 | ### 【AAC 系列五】不务正业的 Fragment 2 | 3 | 4 | 5 | ### 0. 前言 6 | 7 | 8 | 9 | 10 | 11 | ### 1. 不务正业 -------------------------------------------------------------------------------- /kotlin/scoping-functions.md: -------------------------------------------------------------------------------- 1 | # Scoping Functions 2 | 3 | 4 | 5 | - apply 6 | - with 7 | - let 8 | - also 9 | - run 10 | 11 | -------------------------------------------------------------------------------- /android/aac-lifecycle-sum-up.md: -------------------------------------------------------------------------------- 1 | # Lifecycle、LiveData、ViewModel 总结 2 | 3 | 4 | 5 | 6 | 7 | todo 通过学习 Lifecycle LiveData ViewModel 学到了什么? -------------------------------------------------------------------------------- /books/assets/image-20190617161804907.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/assets/image-20190617161804907.png -------------------------------------------------------------------------------- /books/assets/image-20190619113825785.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/assets/image-20190619113825785.png -------------------------------------------------------------------------------- /books/assets/image-20190619232514235.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/assets/image-20190619232514235.png -------------------------------------------------------------------------------- /books/assets/image-20190930110354319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/assets/image-20190930110354319.png -------------------------------------------------------------------------------- /books/assets/image-20190930142851833.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/assets/image-20190930142851833.png -------------------------------------------------------------------------------- /books/ke-yi-lian-xi.md: -------------------------------------------------------------------------------- 1 | # 《刻意练习》 2 | 3 | > 本文 GitHub 地址:https://github.com/AlanCheen/FullStackNotes 4 | > 5 | > 作者:程序亦非猿 6 | 7 | --- 8 | 9 | -------------------------------------------------------------------------------- /android/assets/image-20190620211341946.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/android/assets/image-20190620211341946.png -------------------------------------------------------------------------------- /android/assets/image-20190702154102448.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/android/assets/image-20190702154102448.png -------------------------------------------------------------------------------- /android/assets/image-20190702170503415.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/android/assets/image-20190702170503415.png -------------------------------------------------------------------------------- /linux/README.md: -------------------------------------------------------------------------------- 1 | # Linux 2 | 3 | 4 | 5 | 学 Android 用 Mac 不得不对 Linux 多一些学习,对理解 Android 以及使用 Mac 都有一定帮助。 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /books/图解Http/extras/图解Http.mindnode/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/图解Http/extras/图解Http.mindnode/contents.xml -------------------------------------------------------------------------------- /books/图解Http/extras/图解Http.mindnode/viewState.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/图解Http/extras/图解Http.mindnode/viewState.plist -------------------------------------------------------------------------------- /books/AndroidHero/README.md: -------------------------------------------------------------------------------- 1 | # Android群英传 2 | 3 | 当初买这本书是因为想学习一下自定义View,整本书我都看了,但是主要看第3,5,6,7章,其他的章节比如1,2,11,12,13都浏览了一下,记得当初看这本书看了也就一个多礼拜吧,评价中等,还算是没让我失望吧~~ 4 | 5 | -------------------------------------------------------------------------------- /android/android-proguard.md: -------------------------------------------------------------------------------- 1 | # Proguard 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | 7 | 8 | ## 对代码进行混淆处理 9 | 10 | 11 | 12 | 混淆处理的目的是通过缩短应用的类、方法和字段的名称来减小应用的大小。 13 | 14 | -------------------------------------------------------------------------------- /books/图解Http/extras/图解Http.mindnode/QuickLook/Preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/图解Http/extras/图解Http.mindnode/QuickLook/Preview.jpg -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/Main.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/15. 5 | */ 6 | public class Main { 7 | } 8 | -------------------------------------------------------------------------------- /books/App研发录/项目管理和团队建设.md: -------------------------------------------------------------------------------- 1 | ## 项目管理和团队建设 2 | 3 | 这章我差不多就浏览了一遍,内容很日常化,也就不想多记录什么了,自有体会. 4 | 5 | 1. 不能没有测试团队(赞同!我司没有,深感痛苦 自测测出的bug很少,而且会占用开发大量的时间) 6 | 2. 模块化分工 7 | 3. 每天例会 8 | 4. ... 9 | -------------------------------------------------------------------------------- /books/zhi-shu-ji-jin-tou-zi-zhi-nan.md: -------------------------------------------------------------------------------- 1 | # 《指数基金投资指南》 2 | 3 | > 本文 GitHub 地址:https://github.com/AlanCheen/FullStackNotes 4 | > 5 | > 作者:程序亦非猿 6 | 7 | --- 8 | 9 | 作者:银行螺丝钉 10 | 11 | -------------------------------------------------------------------------------- /java/lambda.md: -------------------------------------------------------------------------------- 1 | # Lambda 表达式 2 | 3 | 4 | 5 | Since Java8 6 | 7 | 8 | 9 | 10 | 11 | ### 资料 12 | 13 | https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html -------------------------------------------------------------------------------- /android/app-startup.md: -------------------------------------------------------------------------------- 1 | # Android 应用的启动时间 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | 7 | 8 | 9 | 10 | ### 资料 11 | 12 | https://developer.android.com/topic/performance/vitals/launch-time -------------------------------------------------------------------------------- /android/webview.md: -------------------------------------------------------------------------------- 1 | # WebView 2 | 3 | 4 | > 迁移语雀 2021-2-22 5 | 6 | 7 | 8 | 9 | ### 资料 10 | 11 | https://developer.android.com/guide/webapps/webview.html#UsingJavaScript 12 | 13 | -------------------------------------------------------------------------------- /books/图解Http/extras/图解Http.mindnode/style.mindnodestyle/contents.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/图解Http/extras/图解Http.mindnode/style.mindnodestyle/contents.xml -------------------------------------------------------------------------------- /books/图解Http/extras/图解Http.mindnode/style.mindnodestyle/metadata.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/books/图解Http/extras/图解Http.mindnode/style.mindnodestyle/metadata.plist -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/swordoffer/A.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.swordoffer; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/16. 5 | */ 6 | public class A { 7 | } 8 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/learn/LearnStack.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.learn; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2019/12/30. 5 | */ 6 | public class LearnStack { 7 | } 8 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/leetcode/Holder.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.leetcode; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/15. 5 | */ 6 | public class Holder { 7 | } 8 | -------------------------------------------------------------------------------- /financing/README.md: -------------------------------------------------------------------------------- 1 | # 理财 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | ROI,投资回报率,经济学名词,指投资后所得的收益与成本间的百分比率。 投资回报率一般可分为总回报率和年回报率。总回报率是不论资金投入时间,直接计算总共的回报率,亦即:总回报率=利润/投入成本。 投资期间的总利润通常包含资本利得与非资本利得性之收益。 12 | 13 | -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/Main.class -------------------------------------------------------------------------------- /books/图解Http/README.md: -------------------------------------------------------------------------------- 1 | # 图解HTTP 2 | 3 | 学习 HTTP 知识可能大家推荐的都是 《HTTP权威指南》,但是那书非常厚,很容易学不下去。 4 | 5 | 而该书非常薄,只有250页,而且有大量的配图,把原本非常抽象的知识表现得很生动,非常容易理解,也便于记忆,这一点我觉得非常棒,也是本书最大的特点。 6 | 7 | 所以,该书对初学者是非常友好的,非常推荐! 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ds/graph.md: -------------------------------------------------------------------------------- 1 | # 图 Graph 2 | 3 | [TOC] 4 | 5 | ### 什么是图? 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | ### 图的分类 14 | 15 | 16 | 17 | - 有向图 18 | - 有向无环图 19 | - 无向图 20 | - 二元决策图 21 | 22 | 23 | 24 | 25 | 26 | ### 资料 27 | 28 | -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/Node.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/Node.class -------------------------------------------------------------------------------- /kotlin/kotlin-java-interop.md: -------------------------------------------------------------------------------- 1 | # Kotlin Java 互操作 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ### 资料 24 | 25 | https://developer.android.com/kotlin/interop -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/swordoffer/A.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/swordoffer/A.class -------------------------------------------------------------------------------- /kotlin/kotlin-android.md: -------------------------------------------------------------------------------- 1 | # Kotlin Android 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 在 Fragment 里初始化一个 ViewModel,可以通过 property delegation 的形式: 10 | 11 | ```kotlin 12 | private val viewModel : FooViewModel by viewModels() 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnArray.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnArray.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnStack.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnStack.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/leetcode/Holder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/leetcode/Holder.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyArrayQueue.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyArrayQueue.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyArrayStack.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyArrayStack.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyLinkedQueue.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyLinkedQueue.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyLinkedStack.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyLinkedStack.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnArrayList.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnArrayList.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnLinkedList.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnLinkedList.class -------------------------------------------------------------------------------- /kotlin/kotlin-code-style.md: -------------------------------------------------------------------------------- 1 | # Kotin Code Style 2 | 3 | 4 | 5 | 6 | 7 | ### 选择好名称 8 | 9 | 10 | 11 | 类的名字: 12 | 13 | 14 | 15 | 方法的名称:通常是动词或者动词短语,说明该方法做什么。 16 | 17 | 18 | 19 | 20 | 21 | ## 资料 22 | 23 | Reference -- 编码规范 24 | 25 | ​ 26 | 27 | -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnLinkedList$Node.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnLinkedList$Node.class -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyArrayCircularQueue.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/self/MyArrayCircularQueue.class -------------------------------------------------------------------------------- /books/xiao-gou-qian-qian.md: -------------------------------------------------------------------------------- 1 | # 《小狗钱钱》 2 | 3 | > 本文 GitHub 地址:https://github.com/AlanCheen/FullStackNotes 4 | > 5 | > 作者:程序亦非猿 6 | 7 | --- 8 | 9 | 10 | 11 | ![d8a344e98a86a6903d4d31d4cba22dce](http://ww1.sinaimg.cn/large/006tNc79ly1g5e9dtvrv3j30t315oq9y.jpg) 12 | 13 | -------------------------------------------------------------------------------- /ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnLinkedList$LinkedList.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/FullStackNotes/HEAD/ds-algorithm-proj/out/production/ds-algorithm-proj/me/yifeiyuan/dsalgorithm/learn/LearnLinkedList$LinkedList.class -------------------------------------------------------------------------------- /books/App研发录/App竞品技术分析.md: -------------------------------------------------------------------------------- 1 | ## App竞品技术分析 2 | 3 | 4 | 利用 **A可以还原被压缩过后的xml (这个对反编译有帮助,暂时还没有尝试) 5 | 6 | ``` 7 | java -jar AXMLPrinter2.jar AndroidManifest.xml 8 | ``` 9 | 10 | 0. 获取最佳服务器 11 | 1. 数据采集 12 | 2. ABTest 13 | 3. Android打包META-INF目录的妙用 14 | 4. 拆分classes.dex 15 | 5. 模块化 热修复 插件化 -------------------------------------------------------------------------------- /java/overview.md: -------------------------------------------------------------------------------- 1 | # Java 2 | 3 | 4 | 5 | 6 | 7 | - **源代码**,`.java` 的文件 8 | - **编译器**,`javac` ,把源文件编译成字节码 ,`.java` —>`.class` (bytecode) 9 | - **虚拟机**,JVM,可以读取以及执行字节码 10 | 11 | 12 | 13 | .java —>javac—>.class —> JVM运行 14 | 15 | 16 | 17 | 源文件被编译器编译后生成了虚拟机可运行的二进制字节码。 18 | 19 | -------------------------------------------------------------------------------- /books/EffectiveJava/第5章-泛型.md: -------------------------------------------------------------------------------- 1 | # 第5章 泛型 2 | 3 | Java 1.5中增加了泛型(Generic) 4 | 5 | ## 第23条 请不要在新代码中使用原生态类型 6 | 7 | 8 | ## 第24条 消除非受检警告 9 | 10 | ## 第25条 列表优先于数组 11 | 12 | ## 第26条 优先考虑泛型 13 | 14 | ## 第27条 优先考虑泛型方法 15 | 16 | ## 第28条 利用有限制通配符来提升API的灵活性 17 | 18 | ## 第29条 优先考虑类型安全的异构容器 19 | 20 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Compound.md: -------------------------------------------------------------------------------- 1 | # 复合模式 2 | 3 | 复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。 4 | 5 | 复合模式在一个解决方案中结合两个或多个模式,已解决一般或重复发生的问题。 6 | 7 | MVC就是一个复合模式。(书中把MVC夸得不行不行的-0-~,称它为 复合模式之王!) 8 | 9 | 多的不说,截一张示意图: 10 | 11 | ![MVC](http://ww4.sinaimg.cn/large/98900c07jw1f669px7n0uj20jg0ew3zy.jpg) 12 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Flyweight.md: -------------------------------------------------------------------------------- 1 | # 蝇量模式 2 | 3 | 如果想让某个类的实例能用来提供许多"虚拟实例",就使用蝇量模式。 4 | 5 | 6 | 用途: 7 | 8 | 1. 当一个类有许多的实例,而这些实例能被同一个方法控制的时候,我们就可以使用蝇量模式. 9 | 10 | 优点: 11 | 12 | 1. 减少运行时对象实例的个数,节省内存. 13 | 2. 将许多"虚拟"对象的状态集中管理. 14 | 15 | 缺点: 16 | 17 | 1. 蝇量模式的缺点在于,一旦你实现了它,那么单个的逻辑实例无法拥有独立而不同的行为. -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Strategy.md: -------------------------------------------------------------------------------- 1 | # 策略模式 2 | 3 | **定义了算法族,分别封装起来,让它们之间可以相互转换,此模式让算法的变化独立于使用算法的客户。** 4 | 5 | 其实就是利用多态的特性,使用面向接口的编程方式来做。 6 | 7 | 特点: 8 | 9 | 1. 定义算法族 10 | 2. 分别封装 11 | 3. 算法可以相互替代 12 | 4. 可以动态切换算法 13 | 14 | 策略模式通常通过定义 一个`Interface`,再写不同的实现类去实现的。 15 | 16 | 体现的设计原则: 开闭原则,针对接口编程 17 | -------------------------------------------------------------------------------- /ds-algorithm-proj/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /gradle/transform.md: -------------------------------------------------------------------------------- 1 | # Transform 2 | 3 | 4 | 5 | Gradle 1.5.0 以及以后提供了 Transform Api ,允许第三方插件在打包 dex 文件之前操作 .class 文件。可以配合字节码操作工具 ASM 来搞事情。 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | ## 资料 26 | 27 | https://www.sensorsdata.cn/blog/20181206-9/ -------------------------------------------------------------------------------- /ds-algorithm-proj/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/change-package-name.md: -------------------------------------------------------------------------------- 1 | # 在 AndroidStudio 里修改包名 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | 7 | 修改包名是个头疼的事情,不过发现了个好办法。 8 | 9 | 10 | 11 | 两个步骤: 12 | 13 | 14 | 15 | 1. 在 Android Studio 中全局替换老包名为新包名,先不修改包名设置,直接全局全文替换,把老包名都去掉,修改完后不需要编译; 16 | 2. 在 Finder 或 终端中进行修改包名操作,该重命名文件夹的重命名,该新增的新增; 17 | 3. 重新回到 AS,重新编译一下就行了。 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/self/Node.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.self; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/16. 5 | */ 6 | public class Node { 7 | 8 | public String value; 9 | public Node pre; 10 | public Node next; 11 | 12 | public Node(String value) { 13 | this.value = value; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /books/EffectiveJava/README.md: -------------------------------------------------------------------------------- 1 | ### EffectiveJava 2 | 3 | 非常棒的JAVA进阶书籍,深入而详细. 4 | 5 | NOTE: 要求很高,实力不够的话,看不懂. 6 | 7 | 8 | - [第2章 创建和销毁对象](./第2章-创建和销毁对象.md) 9 | - [第3章 对于所有对象都通用的方法](./第3章-对于所有对象都通用的方法.md) 10 | - [第4章 类和接口](./第4章-类和接口.md) 11 | - [第5章 泛型(to do)](./第5章-泛型.md) 12 | - [to be continued] 13 | 14 | 15 | 老外的笔记?==》 -------------------------------------------------------------------------------- /fed/README.md: -------------------------------------------------------------------------------- 1 | # FED 前端 2 | 3 | 4 | 5 | - HTML 6 | - CSS,涉及到 Less/Sass 7 | - JavaScript, 8 | - ES5 9 | - ES6 10 | - 框架 11 | - React 12 | - Redux 13 | - Vue 14 | - TypeScript 15 | - Webpack 16 | - Babel 17 | - WebAssembly 18 | - WebGL 19 | - WebAR 20 | - …... 21 | 22 | 23 | 24 | 学习一些 HTML、CSS、JS 基础+Webpack +一个框架基本上就可以干活了。 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /android/m-v-x.md: -------------------------------------------------------------------------------- 1 | # MVX 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | MVX 指的是 Model + View + X 组成的模式。 7 | 8 | 9 | 10 | 1. MVC 11 | 2. MVP 12 | 3. MVVM 13 | 14 | 15 | 16 | ## passive view 17 | 18 | 19 | 20 | ## MVC 21 | 22 | Model-View-Controller 23 | 24 | 25 | ## MVP 26 | 27 | Model-View-Presenter 28 | 29 | ## MVVM 30 | 31 | Model-View-ViewModel 32 | 33 | DataBinding -------------------------------------------------------------------------------- /java/basic.md: -------------------------------------------------------------------------------- 1 | # Java 基础 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ### 基本类型 16 | 17 | 18 | 19 | long int String short char boolean float double 20 | 21 | 22 | 23 | 24 | 25 | Numeric overflow in expression 26 | 27 | 在表达某个数字时,我用了 `5 *1024 * 1024 *1024` ,提示是 numeric overflow ,因为超过 int 的范围了 28 | 29 | ,需要转成 long,可以改成:`5L *1024*1024*1024`,就OK啦。 -------------------------------------------------------------------------------- /fed/js/typescript/typescript.md: -------------------------------------------------------------------------------- 1 | # TypeScript 2 | 3 | 4 | 5 | TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准。 6 | 7 | TypeScript 由微软开发的自由和开源的编程语言。 8 | 9 | TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上。 10 | 11 | 12 | 13 | 14 | 15 | 安装 TypeScript 并验证: 16 | 17 | ```shell 18 | npm install -g typescript 19 | 20 | tsc -v 21 | Version 3.6.3 22 | ``` 23 | 24 | -------------------------------------------------------------------------------- /fed/css/README.md: -------------------------------------------------------------------------------- 1 | # CSS 2 | 3 | 4 | 5 | - 选择器 6 | - id 7 | - class 8 | - 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 盒模型 17 | 18 | ![CSS box-model](http://ww3.sinaimg.cn/large/006tNc79ly1g5gugl2cszg30ew081dfo.gif) 19 | 20 | ## 元素的宽度和高度 21 | 22 | ![Remark](https://www.runoob.com/images/lamp.gif)**重要:** 当您指定一个CSS元素的宽度和高度属性时,你`只是设置内容区域的宽度和高度`。要知道,完全大小的元素,你还必须添加填充,边框和边距。. 23 | 24 | -------------------------------------------------------------------------------- /kotlin/android-ktx.md: -------------------------------------------------------------------------------- 1 | # Android KTX 2 | 3 | > https://developer.android.com/kotlin/ktx 4 | 5 | 6 | 7 | Android KTX 是一组 Kotlin 扩展程序,属于 Android Jetpack 系列。它优化了供 Kotlin 使用的 Jetpack 和 Android 平台 API。Android KTX 旨在让您利用 Kotlin 语言功能(例如扩展函数/属性、lambda、命名参数和参数默认值),以更简洁、更愉悦、更惯用的方式使用 Kotlin 进行 Android 开发。Android KTX 不会向现有的 Android API 添加任何新功能。 8 | 9 | 10 | 11 | handler.postDelay(40){ 12 | 13 | } 14 | 15 | 16 | -------------------------------------------------------------------------------- /books/AndroidArt/第12章-Bitmap的加载和Cache.md: -------------------------------------------------------------------------------- 1 | # 第12章-Bitmap的加载和Cache 2 | 3 | 4 | ### 高效加载 5 | 6 | 1. 加载所需尺寸。通过控制 inSampleSize,即可控制图片采样率,比如取值为2,则宽高都为原来的1/2,则为原图的1/4。 7 | 8 | 可以先将 BitmapFactory.Options.inJustDecodeBounds 设置为 true,获取宽高信息,再计算 inSampleSize,然后再将 inJustDecodeBounds 设置为 false,加载图片。 9 | 10 | 2. 缓存策略 11 | LruCache(Least Recently Used) 最近最少使用 12 | DiskLruCache,分别常被用来做内存缓存,磁盘缓存。 13 | 14 | Lru 算法使用一个 LinkedHashMap 实现 -------------------------------------------------------------------------------- /books/图解Http/第3章-HTTP报文内的HTTP信息.md: -------------------------------------------------------------------------------- 1 | # 第3章-HTTP报文内的HTTP信息 2 | 3 | 4 | 5 | 6 | 用于 HTTP 协议交互的信息被称为 HTTP报文。客户端的叫请求报文,服务端的叫响应报文。 7 | 8 | 9 | 10 | HTTP报文本身是由**多行(用 CR+LF 作换行符)数据构成的字符串文本。** 11 | 12 | 13 | 14 | CR (Carriage Return)是**回车**,LF(Line Feed)是**换行**。关于CR+LF 的小故事可以看一下这个:[[回车 换行](http://www.cppblog.com/prayer/archive/2009/08/19/93854.html)](http://www.cppblog.com/prayer/archive/2009/08/19/93854.html) 15 | 16 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Singleton.md: -------------------------------------------------------------------------------- 1 | # 单例模式 2 | 3 | 单例模式: 用来创建独一无二的只能有一个实例的对象的入场券 4 | 5 | **确保一个类只有一个实例,并提供全局的访问点。** 6 | 7 | 很久以前自己写过一篇关于单例模式的文章--》[听说每个人都会写单例,你会了吗? 8 | ](http://yifeiyuan.me/2015/09/10/%E5%90%AC%E8%AF%B4%E6%AF%8F%E4%B8%AA%E4%BA%BA%E9%83%BD%E4%BC%9A%E5%86%99%E5%8D%95%E4%BE%8B/),这里就不多写了。 9 | 10 | 11 | 另外wiki上写的也是非常棒的,推荐看wiki: 12 | 13 | [Singleton](https://en.wikipedia.org/wiki/Singleton_pattern) 14 | -------------------------------------------------------------------------------- /linux/shell/how-to-write-a-shell-script.md: -------------------------------------------------------------------------------- 1 | # 如何编写一个 Shell 脚本 2 | 3 | 4 | 5 | 可以编写一个 sh 脚本来做成命令,方便执行。 6 | 7 | 8 | 9 | ### 编写可执行命令步骤 10 | 11 | 12 | 13 | 1. 到`bin`目录,`cd /usr/local/bin` 14 | 2. 创建文件,`touch foo` 15 | 3. 编辑文件内容,`vim foo` 16 | 4. 文件内容以`#!/bin/sh`开头 17 | 5. 再输入具体命令内容,保存退出 18 | 6. 提权,`chmod 777 foo` 19 | 7. 完成 20 | 21 | 22 | 23 | 有几个关键点要注意: 24 | 25 | 1. sh 要加执行权限, 26 | 2. sh 要配置到 PATH 环境变量中。 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /linux/shell/awesome-shell-scripts.md: -------------------------------------------------------------------------------- 1 | # Awesome Shell Scripts 2 | 3 | 4 | 5 | 记录一些有用个 Shell Script。 6 | 7 | 8 | 9 | ### Android 10 | 11 | 12 | 13 | 查看当前的 Activity 类名等信息。 14 | 15 | ```shell 16 | #!/bin/sh 17 | adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' 18 | ``` 19 | 20 | 21 | 22 | 查看 SurfaceFlinger 信息 23 | 24 | ```shell 25 | #!/bin/sh 26 | adb shell dumpsys SurfaceFlinger 27 | ``` 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /android/time-in-android.md: -------------------------------------------------------------------------------- 1 | # Android 里的时间 2 | 3 | 4 | 5 | > 迁移语雀 2021-2-22 6 | 7 | 8 | 9 | 10 | ### 计算时间差 11 | 12 | 13 | 14 | 常见于计算时间耗时,可以考虑使用`SystemClock.uptimeMillis()`方法: 15 | 16 | 17 | 18 | ```java 19 | long startTime = SystemClock.uptimeMillis(); 20 | ... 21 | long time = SystemClock.uptimeMillis(); 22 | 23 | long dTime = time - startTime; 24 | ``` 25 | 26 | 27 | 28 | ### 资料 29 | 30 | [SimpleDateFormat](../java/simpledateformat.md) -------------------------------------------------------------------------------- /ds-algorithm-proj/README.md: -------------------------------------------------------------------------------- 1 | # 数据结构与算法 2 | 3 | 4 | 5 | leetcode 目录下是 leetcode 的对应题目的解法代码。 6 | 7 | self 目录下是自己尝试实现数据结构的代码。 8 | 9 | learn 目录下是学习 Java 数据结构或集合类的代码。 10 | 11 | swordoffer 目录下是 剑指offer 的解法代码。 12 | 13 | ## leetcode 14 | 15 | leetcode 子目录: 16 | 17 | - array ,数组的题目 18 | - string,字符串 19 | 20 | 21 | ## swordoffer 22 | 23 | 24 | ## self 25 | 26 | 27 | ## 资料 28 | 29 | LeetCodeAnimation:https://github.com/MisterBooo/LeetCodeAnimation 30 | -------------------------------------------------------------------------------- /books/AndroidHero/第4章-ListView使用技巧.md: -------------------------------------------------------------------------------- 1 | # 第4章 ListView使用技巧 2 | 3 | 4 | 注:使用RecyclerView替代ListView吧! 5 | 6 | 1. ViewHolder模式 复用 Item 7 | 2. `android:divider`设置分割线 8 | 3. `android:scrollbars="none"`隐藏滚动条 9 | 4. `android:listSelector="#0000000"` 可以设置item选中状态 10 | 5. `ListView.setEmptyView()`处理空数据 11 | 12 | 实现具有弹性的ListView,重写 13 | `protected boolean overScrollBy(int,int,int,int,int,int,int ,int maxOverScrollY,boolean)`方法中的`maxOverScrollY`(单位为像素)值,将它设置不为0就可以实现 -------------------------------------------------------------------------------- /java/README.md: -------------------------------------------------------------------------------- 1 | # Java 2 | 3 | 4 | 5 | [TOC] 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ### 集合 - 数据结构 18 | 19 | - [x] [数组-Array](./array.md) 20 | - [ ] [ArrayList](./arraylist.md) 21 | - [ ] [链表-LinkedList](./linkedlist.md) 22 | - [ ] [TreeSet](./treeset.md) 23 | - [ ] [TreeMap](./treemap.md) 24 | - [ ] [ArrayDeque](./arraydeque.md) 25 | - [ ] [LinkedHashMap](./linkedhashmap.md) 26 | 27 | 28 | 29 | TreeSet 排序是用树结构完成,到 Java8实现的是红黑树(red-black tree) -------------------------------------------------------------------------------- /android/shared-preferences.md: -------------------------------------------------------------------------------- 1 | # SharedPreferences 2 | 3 | 4 | > 迁移语雀 2021-2-22 5 | 6 | 7 | 基于 Android API 28 8 | 9 | 共享首选项 10 | 11 | 12 | 13 | 14 | 15 | ## 概述 16 | 17 | 18 | 19 | SharedPreferences 是一个接口,用于访问和修改首选项数据,通过 Editor 接口的 putxxx 和 getxxx 来操作,最终调用 commit 或者 apply 来提交操作。 20 | 21 | 22 | 23 | ## 基本使用 24 | 25 | 26 | 27 | 通过 context.getSharedPreferences(String name,int mode) 可以获取一个 SharedPreferences 实例。 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | ## 资料 36 | 37 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Visitor.md: -------------------------------------------------------------------------------- 1 | # 访问者模式 2 | 3 | 当你想要为一个对象的组合(组合模式)增加新的能力,且封装并不重要时,就使用访问者模式。 4 | 5 | 6 | 用途: 7 | 8 | 1. 当采用访问者模式的时候,就会打破组合类的封装。 9 | 10 | 11 | 优点: 12 | 13 | 1. 允许你对组合结构加入新的操作,而无需改变结构本身。 14 | 2. 想要加入新的操作,相对容易。 15 | 3. 访问者所进行的操作,其代码是集中在一起的。 16 | 17 | 缺点: 18 | 19 | 1. 因为游走的功能牵涉其中,所以对组合结构的改变就更加困难。 20 | 21 | ## 感想 22 | 23 | 才两页纸,没有代码很难理解啊。 24 | 25 | 26 | ## See also 27 | 28 | [Visitor_pattern](https://en.wikipedia.org/wiki/Visitor_pattern) -------------------------------------------------------------------------------- /java/linkedlist.md: -------------------------------------------------------------------------------- 1 | # LinkedList(链表) 2 | 3 | 4 | 5 | ```java 6 | public class LinkedList 7 | extends AbstractSequentialList 8 | implements List, Deque, Cloneable, java.io.Serializable 9 | ``` 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | LRU 算法 18 | 19 | 20 | 21 | ### 特性 22 | 23 | - 双端队列,支持在头部和尾部同时添加或删除元素; 24 | - 支持扩容 25 | 26 | 27 | 28 | ### 主要方法 29 | 30 | 31 | 32 | - `addFirst(E)`, 33 | - `addLast(E)`, 34 | - `removeFirst()`, 35 | - `removeLast()`, 36 | - -------------------------------------------------------------------------------- /algorithm/README.md: -------------------------------------------------------------------------------- 1 | # 算法 2 | 3 | 4 | 5 | 时间复杂度 6 | 7 | 空间复杂度 8 | 9 | 排序算法 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ### 二分法检索 18 | 19 | ### **线性检索和二分检索求 23 的位置** 20 | 21 | ![img](http://ww4.sinaimg.cn/large/006tNc79ly1g5eaqa8l46g30dw099abp.gif) 22 | 23 | #### 线性检索和二分检索求 1 的位置 24 | 25 | ![img](http://ww2.sinaimg.cn/large/006tNc79ly1g5eaplimarg30dw099q4z.gif) 26 | 27 | #### 二分检索树(Binary serach tree) 28 | 29 | ![img](http://ww2.sinaimg.cn/large/006tNc79ly1g5eaopezdyg30ci0aitbs.gif) -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Memento.md: -------------------------------------------------------------------------------- 1 | # 备忘录模式 2 | 3 | 当你需要让对象返回之前的状态时(例如,你的用户请求“撤销”),就使用备忘录模式。 4 | 5 | 6 | 备忘录的目标: 7 | 8 | - 储存系统关键对象的重要状态。 9 | - 维护关键对象的封装。 10 | 11 | 咦,那Activity、Fragment、View的 `onSaveInstanceState` 不就是备忘录模式吗? 12 | 13 | 14 | 用途: 15 | 16 | 1. 备忘录用于存储状态。 17 | 18 | 19 | 优点: 20 | 21 | 1. 将被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚。 22 | 2. 保持关键对象的数据封装。 23 | 3. 提供了容易实现的恢复能力。 24 | 25 | 缺点: 26 | 27 | 1. 储存和回复状态的过程可能相当耗时。 28 | 2. 在Java系统中,其实可以考虑使用序列化机制储存系统的状态。 29 | 30 | -------------------------------------------------------------------------------- /ds-algorithm-proj/ds-algorithm-proj.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /books/App研发录/高效App框架设计与重构.md: -------------------------------------------------------------------------------- 1 | ## 高效App框架设计与重构 2 | 3 | 0. 自定义一些基类(如BaseActivity) 4 | 1. 采取一定的方式在客户端模拟API返回数据,用于测试 5 | 2. 启用Cookie 6 | 3. Http数据要加密 7 | 2. 公共参数可以存放到Header里 8 | 3. 时间校准(返回服务器时间与本地时间比较(非常有必要)) 9 | 4. HTTP请求开启**gzip压缩**来减少传输量(省流量,加快速度),如果用Okhttp,gzip挺简单的,不过需要服务端的支持 10 | 5. 根据网络状况去下载不同尺寸的图片 11 | 6. 急速模式(比如不显示图片,提供开关) 12 | 7. 城市列表**增量更新**(本地保留版本号,与服务器对照,下发需要修改的数据,CURD进行操作) 13 | 8. H5跳转Activity,可以传递一个String,按照约定的协议去解析,再跳转(一般传递Activity的全称,再 key-value来传递参数) 14 | 9. 命名规范和代码规范(我推荐checkstyle) -------------------------------------------------------------------------------- /linux/commands.md: -------------------------------------------------------------------------------- 1 | # Linux 下的命令 2 | 3 | [TOC] 4 | 5 | 6 | 7 | ### 常用命令概述 8 | 9 | 10 | 11 | - `cat`,连接文件并打印到标准输出设备上; 12 | - `read`,输入 13 | - `echo`,输出 14 | - `wc -l filename`,查看文件有多少行内容 15 | - `ps` 查看进程信息 16 | - `du -sh` 展示当前目录文件所占用的`总大小` 17 | - `du -sh *` 展示当前目录`每个文件`占用的大小 18 | - `cd`,切换目录 19 | 20 | 21 | 22 | ### cd 切换目录 23 | 24 | **c**hange **d**irectory 25 | 26 | 1. `cd [dirName]` ,切换到对应的目录,如` cd a`; 27 | 2. `cd ..` ,切换到 上级目录; 28 | 3. `cd -`,切换到上一次所在的目录,非常有用; 29 | 4. `cd ~`,切换到电脑目录 30 | 31 | -------------------------------------------------------------------------------- /books/AndroidArt/第14章-JNI和NDK编程.md: -------------------------------------------------------------------------------- 1 | # 第14章-JNI和NDK编程 2 | 3 | 4 | Java JNI 的本意为 Java Native Interface,它是为了方便 Java调用 C C++等本地代码所封装的一层接口。 5 | 6 | NDK 是 Android 所提供的一个工具集合,通过 NDK 可以在 Android 中更方便地通过 JNI 来访问本地代码,比如 C C++。 7 | 8 | NDK 还提供了交叉编译器,开发人员只需要简单地修改文件就可以生成特定CPU 平台的动态库。 9 | 10 | NDK 的好处: 11 | 12 | 1. 提高代码的安全性。由于so 库反编译比较困难,因此 NDK 提高了 Android 程序的安全性。 13 | 2. 可以很方便地使用目前已有的 C/C++开源库。 14 | 3. 便于平台间的移植。通过 C/C++实现的动态库可以很方便地在其他平台上使用。 15 | 4. 提高程序在某些特定情形下的执行效率,但是并不能明显提升 Android 程序的性能。 16 | 17 | PS:我本身对 NDK 接触不多,也并不感冒,就没多看,感兴趣的请看书。 -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Builder.md: -------------------------------------------------------------------------------- 1 | # 生成器模式 2 | 3 | 使用生成器模式封装一个产品的构造过程,并允许按步骤构造。 4 | 5 | 在Android中比较常见了,比如 Dialog,,另外在EffectiveJava的笔记中也有提到,就不多说了. 6 | 7 | 8 | 9 | 10 | 用途: 11 | 12 | 1. 经常被用来创建组合结构. 13 | 14 | 优点: 15 | 16 | 1. 将一个复杂对象的创建过程封装起来. 17 | 2. 允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同) 18 | 3. 向客户隐藏产品内部的表现 19 | 4. 产品的实现可以被替换,因为客户只看到一个抽象的接口. 20 | 21 | 缺点: 22 | 23 | 2. 与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识. 24 | 25 | 26 | ## See also 27 | 28 | [Builder_Pattern](https://en.wikipedia.org/wiki/Builder_pattern) -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Chain-of-Responsibility.md: -------------------------------------------------------------------------------- 1 | # 责任链模式 2 | 3 | 当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式. 4 | 5 | 6 | 通过责任链模式,可以为某个请求创建一个对象链.每个对象依序检查此请求,并对其进行处理,或者将它传给链中的下一个对象. 7 | 8 | 拿Android来说,View的 `onTouch` 等方法都是使用了责任链模式. 9 | 10 | 11 | 12 | 用途: 13 | 14 | 经常被使用在窗口系统中,处理鼠标和键盘之类的事件(在Android的触摸事件分发) 15 | 16 | 优点: 17 | 18 | 1. 将请求的发送者和接受者解耦 19 | 2. 可以简化你的对象,因为它不需要知道链的结构 20 | 3. 通过改变链内的成员或调动它们的次序,允许你动态地新增或者删除责任 21 | 22 | 缺点: 23 | 24 | 1. 并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端之外(这可以是优点也可以是缺点) 25 | 2. 可能不容易观察运行时的特征,有碍于排除错误 26 | -------------------------------------------------------------------------------- /books/README.md: -------------------------------------------------------------------------------- 1 | # 万般皆下品惟有读书高 2 | 3 | 4 | 5 | [《Head First Java 》](./head-first-java.md) 6 | [《Java 核心技术 卷 1 基础知识 第十版》](./core-java-1-10th.md) 7 | 8 | 9 | [《刻意练习》](./ke-yi-lian-xi.md) 10 | 11 | [《人性的弱点》](./ren-xing-de-ruo-dian.md) 12 | [《小狗钱钱》](./xiao-gou-qian-qian.md) 13 | [《指数基金投资指南》](./zhi-shu-ji-jin-tou-zi-zhi-nan.md) 14 | [《不上班也有钱》](./bu-shang-ban-ye-you-qian.md) 15 | 16 | [《Android 面试宝典》黑马程序员](./android-msbd.md) 17 | [](./) 18 | [](./) 19 | [](./) 20 | [](./) 21 | [](./) 22 | [](./) 23 | [](./) 24 | [](./) 25 | [](./) 26 | [](./) 27 | [](./) 28 | 29 | -------------------------------------------------------------------------------- /java/array.md: -------------------------------------------------------------------------------- 1 | # 数组 2 | 3 | 4 | 5 | 大小已知,不可扩容,内存连续的数据结构。 6 | 7 | 8 | 9 | ### 数组实例化 10 | 11 | ``` 12 | // A 13 | int[] array2 = new int[3]; 14 | // B 15 | int[] array = new int[]{0, 1, 2}; 16 | ``` 17 | 18 | 19 | 20 | A 写法,在实例化的时候*只指定数组大小*,但是不指数组元素。 21 | 22 | B 写法,在实例化时就*指定了元素*,并也确定了*数组的大小*。 23 | 24 | 25 | 26 | ### 数组的复制 27 | 28 | 29 | 30 | 从 A 数组写到 B 数组,或者说是 copy,推荐用系统的 `System.arraycopy` 方法。 31 | 32 | ``` 33 | System.arraycopy(array, 0, array2, 0, array.length); 34 | ``` 35 | 36 | 37 | 38 | 表示从 array 的第 0 个开始 copy 到 array2(从0 开始赋值),copy array.lenth 个元素。 -------------------------------------------------------------------------------- /kotlin/kotlin-class.md: -------------------------------------------------------------------------------- 1 | # Kotlin 里的类 2 | 3 | 4 | 5 | 6 | 7 | ## 类的构造 8 | 9 | 10 | 11 | 构造方法 12 | 13 | init 14 | 15 | 16 | 17 | 18 | 19 | ## 类的继承与接口实现 20 | 21 | 22 | 23 | 默认情况下,一个 Kotlin 的类是不能被继承的: 24 | 25 | 26 | 27 | 如下的代码会报错:`Error:(12, 17) Kotlin: This type is final, so it cannot be inherited from`。 28 | 29 | ```kotlin 30 | class Person{ 31 | 32 | } 33 | 34 | class Student : Person(){ 35 | 36 | } 37 | ``` 38 | 39 | 如果要一个类要可以被继承,则需要加上`open`关键字。 40 | 41 | ```kotlin 42 | open class Person{} 43 | ``` 44 | 45 | 46 | 47 | ## 类的可见性 48 | 49 | 50 | 51 | ## 内部类 -------------------------------------------------------------------------------- /android/android-q.md: -------------------------------------------------------------------------------- 1 | # Android Q 2 | 3 | 4 | > 迁移语雀 2021-2-22 5 | 6 | 7 | > https://developer.android.google.cn/about/versions/pie 8 | 9 | 10 | 11 | ### 适配指南 12 | 13 | 14 | 15 | 16 | 17 | #### 网络安全适配 18 | 19 | 20 | 21 | 在 `res` 目录下新建`xml`文件夹,添加`network_security_config.xml`文件: 22 | 23 | 24 | 25 | 26 | 27 | https://developer.android.google.cn/training/articles/security-config.html 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | ### 资料 36 | 37 | https://developer.android.google.cn/about/versions/pie 38 | 39 | Android 9.0 适配指南 https://juejin.im/post/5d48bfece51d4561f17a5055 -------------------------------------------------------------------------------- /linux/shell/README.md: -------------------------------------------------------------------------------- 1 | # Shell 编程 2 | 3 | 基于 Mac。 4 | 5 | 6 | 7 | ### 编写可执行命令 8 | 9 | 10 | 11 | 1. 到`bin`目录,`cd /usr/local/bin` 12 | 2. 创建文件,`touch foo` 13 | 3. 编辑文件内容,`vim foo` 14 | 4. 文件内容以`#!/bin/sh`开头 15 | 5. 再输入具体命令内容,保存退出 16 | 6. 提权,`chmod 777 foo` 17 | 7. 完成 18 | 19 | 20 | 21 | ### Android 22 | 23 | 24 | 25 | 查看当前的 Activity 类名等信息。 26 | 27 | ```shell 28 | #!/bin/sh 29 | adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' 30 | ``` 31 | 32 | 33 | 34 | 查看 SurfaceFlinger 信息 35 | 36 | ```shell 37 | #!/bin/sh 38 | adb shell dumpsys SurfaceFlinger 39 | ``` 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /books/App研发录/App开发中的高级技巧.md: -------------------------------------------------------------------------------- 1 | ## App开发中的高级技巧 2 | 3 | 同上一章节,关于Crash竟然没写Android具体应该怎么做,却写了一堆数据库代码,真是醉了~ 4 | 然后分析Crash,没什么软用,crash什么的碰到一次,你就知道了,提前看也没什么作用,而且,很多作者自己也根本没弄懂,呵呵. 5 | 6 | 持续集成章节基于Eclipse,Ant,这能看?(反正我是不用Eclipse也不用Ant的直接跳过了) 7 | 单元测试差不多就是讲了有这么东西,然而并不教你怎么做. 8 | 9 | 诶~忍不住又吐槽了~ 10 | 11 | 1. 通过实现**UncaughtExceptionHandler**去捕获异常 12 | 2. 异常分析时出现**Unknown Source**,丢失了文件名和行号,这比较蛋疼,可以在ProGuard文件中增加`-keepattributes SourceFile,LineNumberTable`(umong分析是上传mapping文件,这个方法还有待验证,扩展阅读->[bugly](http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=244) and [精神哥](http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=26)) -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Interpreter.md: -------------------------------------------------------------------------------- 1 | # 解释器模式 2 | 3 | 使用解释器模式为语言创建解释器. 4 | 5 | ![](http://ww3.sinaimg.cn/large/98900c07gw1f6em1ns9a8j20fm07j0t0.jpg) 6 | 7 | 用途: 8 | 9 | 1. 当你需要实现一个简单的语言时,使用解释器. 10 | 2. 当你有一个简单的语法,而且简单比效率更重要时,使用解释器. 11 | 3. 可以处理脚本语言和编程语言. 12 | 4. 可以处理脚本语言和编程语言. 13 | 14 | 15 | 优点: 16 | 17 | 1. 将每一个语法规则表示成一个类,方便于实现语言. 18 | 2. 因为语法由许多类表示,所以你可以轻易地改变或扩展此语言. 19 | 3. 通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的美化或者进行复杂的程序验证. 20 | 21 | 22 | 缺点: 23 | 24 | 1. 当语法规则的数目太大时,这个模式可能会变得非常繁杂.在这种情况下,使用解析器/编译器的产生器可能更合适. 25 | 26 | 27 | ## 小结 28 | 29 | 我觉着吧,跟自己定义一个语法规则类似,对应的不一定要类,可以是行为. 30 | 比如 隐式跳转什么的 -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Prototype.md: -------------------------------------------------------------------------------- 1 | # 原型模式 2 | 3 | 当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式(Prototype Pattern)。 4 | 5 | 6 | ![UML](http://ww4.sinaimg.cn/large/98900c07jw1f6glqr208bj20xc0daq4b.jpg) 7 | 8 | 原型模式允许你通过复制现有的实例来创建新的实例(在Java中,这通常意味着使用`clone()`方法,或者反序列化)。 9 | 10 | 11 | 原型模式的重点在于,客户端的代码在不知道要实例化何种特定类的情况下,可以制造出新的实例。(?不太理解) 12 | 13 | 14 | 用途: 15 | 16 | 1. 在一个复杂的类层次中,当系统必须从其中的许多类型创建新的对象时,可以考虑原型。 17 | 18 | 优点: 19 | 20 | 1. 向客户隐藏制造新实例的复杂性。 21 | 2. 提供客户能够产生位置类型对象的选项。 22 | 3. 在某些环境下,复制对象比创建对象更有效。 23 | 24 | 缺点: 25 | 26 | 1. 对象的复制有时相当复杂。 27 | 28 | ## See also 29 | [Prototype_pattern](https://en.wikipedia.org/wiki/Prototype_pattern) 30 | -------------------------------------------------------------------------------- /java/class.md: -------------------------------------------------------------------------------- 1 | # Class 2 | 3 | 4 | 5 | Class,类,Class 实例表示 Java 中的类和接口。 6 | 7 | 枚举、数组、基础类型、关键字`void` 都表示 **Class 对象**,注解表示**接口**。 8 | 9 | 10 | 11 | Class 没有公开的构造方法,**Class 对象**是由 JVM 调用 ClassLoader (比如 BootstrapClassLoader) 的 `definClass()` 方法来构建的。 12 | 13 | 14 | 15 | Class 对象也是一个对象,比如 `View.class` ,是一个**特殊对象**,表示这个类,某些场景下也能代表这个类的所有实例。 16 | 17 | 18 | 19 | ### 反射 20 | 21 | 通常我们会在使用反射的时候用到 Class 。 22 | 23 | 24 | 25 | 比如我们要获取一个 Class 对象: 26 | 27 | ```java 28 | Class clazz = Class.forName("java.lang.Thread") 29 | ``` 30 | 31 | 32 | 33 | - getDeclaredMethod 34 | - ... 35 | 36 | 37 | 38 | ### 并发 39 | 40 | 并发的某些场景下,我们会锁 Class 对象。 41 | 42 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Mediator.md: -------------------------------------------------------------------------------- 1 | # 中介者模式 2 | 3 | 使用中介者模式来集中相关对象之间复杂的沟通和控制方式。 4 | 5 | 1. 每个对象都会在自己的状态改变时,告诉中介者 6 | 2. 每个对象都会对中介者锁发出的请求作出回应 7 | 8 | 没有中介者的情况之下,所有的对象都需要认识其他对象,也即对象之间是紧耦合的. 9 | 当有了中介者后,对象之间不需要认识,只需要跟中介者打交道,这样一来对象之间就被解耦了. 10 | 11 | 12 | 中介者包含了整个系统的控制逻辑. 13 | 14 | 15 | 用途: 16 | 17 | 1. 中介者常常被用来协调相关的GUI组件 18 | 19 | 这让我想到了Android中的Activity,在Activity中包含了各种View以及Adapter等对象,Activity也包含了整个系统的控制逻辑,那么我想,Activity就是一个中介者吧! 20 | 21 | 优点: 22 | 23 | 1. 通过将对象彼此解耦,可以增加对象的复用性 24 | 2. 通过将控制逻辑集中,可以简化系统维护 25 | 3. 可以让对象之间所传递的消息变得简单而且大幅减少 26 | 27 | 缺点: 28 | 29 | 如果设计不当,中介者本身会变得过于复杂 30 | 31 | 32 | 想想Activity,如果职责一多,两三千行代码,就非常复杂了,缺点也显而易见了 33 | -------------------------------------------------------------------------------- /fed/html/css-in-html.md: -------------------------------------------------------------------------------- 1 | # 在 HTML 中使用 CSS 2 | 3 | 4 | 5 | 6 | 7 | ### 内部样式 8 | 9 | 在 HTML 文件中的 ``标签中编写 ` 19 | 20 | ``` 21 | 22 | 23 | 24 | ### 外部样式 25 | 26 | 27 | 28 | 通过在 head 标签内添加 link 标签来引入外部 CSS 。 29 | 30 | 31 | 32 | ```html 33 | 34 | 35 | 36 | ``` 37 | 38 | 39 | 40 | ### 内联样式 41 | 42 | 当特殊的样式需要应用到个别元素时,就可以使用内联样式。 43 | 44 | ```html 45 |

46 | This is a paragraph 47 |

48 | ``` 49 | 50 | -------------------------------------------------------------------------------- /books/图解Http/第7章-确保Web安全的HTTPS.md: -------------------------------------------------------------------------------- 1 | # 第7章-确保Web安全的HTTPS 2 | 3 | 4 | 5 | SSL 采用 公开密钥加密的加密处理方式。 6 | 7 | #### 共享密钥加密 8 | 9 | 加密和解密同用一个密钥的方式称为共享密钥加密,也被称为 对称密钥加密。 10 | 11 | 加密时必须把密钥发送给对方,那么如何保证安全就是个问题 12 | 13 | #### 公开密钥加密 14 | 15 | 公开密钥加密使用一对『非对称的密钥』。一把叫做私有密钥,另一把叫做公开密钥。 16 | 17 | 发送时,发送公钥加密,解密使用私钥,安全。 18 | 19 | 相对于 共享密钥加密,公开密钥加密更加复杂,所以效率更低。 20 | 21 | 破解:对离散对数进行求值,有希望,但是目前不太现实。 22 | 23 | #### 混合加密 24 | HTTPS 采用混合加密 即 共享密钥加密 和 公开密钥加密 并用。 25 | 26 | 利用两个加密方式各自的有点,使用安全性更高的公开密钥加密来传输共享密钥所使用的密钥,然后使用效率更高的共享密钥加密来进行后续通讯,又安全又快。 27 | 28 | 29 | #### 证书 30 | 31 | 公开密钥加密方式的缺点是:无法证明公开密钥本身就是货真价实的公开密钥。 32 | 33 | 注:本质上来说密钥依然是数据,在传输的过程中,还是可能会遭恶意篡改。 34 | 35 | EV SSL 36 | 37 | 38 | -------------------------------------------------------------------------------- /leetcode/344-反转字符串.md: -------------------------------------------------------------------------------- 1 | # 344.反转字符串 2 | 3 | 4 | 5 | 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 `char[]` 的形式给出。 6 | 7 | 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。 8 | 9 | 你可以假设数组中的所有字符都是 [ASCII](https://baike.baidu.com/item/ASCII) 码表中的可打印字符。 10 | 11 | 12 | 13 | ```java 14 | class Solution { 15 | public void reverseString(char[] s) { 16 | for(int i = 0;i<(s.length+1)/2;i++){ 17 | char tmp = s[i]; 18 | s[i]=s[s.length-1-i]; 19 | s[s.length-1-i]=tmp; 20 | } 21 | } 22 | } 23 | ``` 24 | 25 | 26 | 27 | 执行用时 : 4 ms, 在Reverse String的Java提交中击败了93.67% 的用户 28 | 29 | 内存消耗 : 52 MB, 在Reverse String的Java提交中击败了76.89% 的用户 -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Iterator.md: -------------------------------------------------------------------------------- 1 | # 迭代器模式 2 | 3 | 迭代器模式(Iterator): **提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示**。 4 | 5 | 迭代器模式服务『集合』,为了更好地管理集合。 6 | 7 | 所谓集合(Collection)就是是,**一群对象**,可以放在数组、堆栈、列表、散列表等。 8 | 集合有时候也被称为『聚合』(aggregate)。 9 | 10 | 11 | ## 迭代器的意义与优势 12 | 13 | 1. 我们不需要知道一个集合到底是数组还是列表还是什么其他的结构。 14 | 2. 把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。 15 | 16 | 17 | 18 | ## 要点 19 | 20 | 1. 迭代器允许访问聚合的元素,而不需要暴露它的内部结构。 21 | 2. 迭代器将遍历聚合的工作封装进一个对象中。 22 | 3. 当使用迭代器的时候,我们依赖聚合提供遍历。 23 | 4. 迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多台机制。 24 | 25 | 26 | ## 小结 27 | 28 | Java中已经存在有 `Iterator` 了,大部分情况下,我们不需要自己在写。 29 | 如果要加新的功能,当然还是可以扩展的,比如 `ListIterator`新增了`previous`等方法。 30 | -------------------------------------------------------------------------------- /gradle/gradle-params.md: -------------------------------------------------------------------------------- 1 | # Gradle 传递 参数 2 | 3 | 4 | 5 | 6 | 7 | - `-P` 8 | - `-D` 9 | 10 | 11 | 12 | 通过命令行传递 String 类型的参数时,需要转义符号: 13 | 14 | ```shell 15 | ./gradlew assembleDebug -Dcv="\"字符串需要转义符号\"" 16 | ``` 17 | 18 | 19 | 20 | 在 build.gradle 里可以这样接受参数: 21 | 22 | ```groovy 23 | String customValue = System.properties.getProperty("cv") 24 | ``` 25 | 26 | 27 | 28 | 29 | 30 | ### BuildConfig 参数配置 31 | 32 | 33 | 34 | ```groovy 35 | android { 36 | defaultConfig { 37 | buildConfigField("String", "Author", "\"程序亦非猿\"") 38 | } 39 | } 40 | ``` 41 | 42 | 在 BuildConfig 类中会生成一个属性: 43 | 44 | ```java 45 | public static final String Author = "程序亦非猿"; 46 | ``` 47 | 48 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/learn/LearnArrayList.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.learn; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * Created by 程序亦非猿 on 2020/4/15. 7 | */ 8 | public class LearnArrayList { 9 | 10 | 11 | public static void main(String[] args) { 12 | 13 | ArrayList intList = new ArrayList(); 14 | 15 | 16 | intList.add(1); 17 | intList.add(1,2); 18 | 19 | System.out.println(intList);//1,2 20 | 21 | intList.remove(new Integer(1)); 22 | System.out.println(intList);//2 23 | 24 | // intList.remove(1); 25 | // System.out.println(intList);//1 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /android/android-dynamic.md: -------------------------------------------------------------------------------- 1 | # Android 动态化方案 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | | 方案 | 性能 | 跨平台 | 跨平台 | 稳定性 | 备注 | 7 | | ----------- | ---- | ---------------- | ------ | ------ | ---- | 8 | | H5+WebView | | All | | | | 9 | | Weex | | Android、iOS、H5 | | | | 10 | | ReactNative | | | | | | 11 | | Flutter | | Android、iOS | | | | 12 | | DinamicX | 高 | Android、iOS | | | | 13 | | Mist | | | | | | 14 | | | | | | | | 15 | 16 | 17 | -------------------------------------------------------------------------------- /flutter/flutter-roadmap.md: -------------------------------------------------------------------------------- 1 | # Flutter RoadMap 2 | 3 | 4 | 5 | 6 | 7 | Android 开发先看看这个: 8 | 9 | https://flutter.cn/docs/get-started/flutter-for/android-devs 10 | 11 | 12 | 13 | 了解基本概念。 14 | 15 | 16 | 17 | 18 | 19 | ### Widgets 20 | 21 | 22 | 23 | - Stack 24 | - fit:StackFit.loose 25 | - loose 26 | - expand 27 | - aligment 28 | - AlignmentDirectional.bottomCenter 29 | - children:[] 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | ### 资料 38 | 39 | [Introducing Widget of the Week](https://www.youtube.com/watch?v=b_sQ9bMltGU&list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG) 40 | 41 | [Stack (本周 Flutter 小部件)](https://www.youtube.com/watch?v=liEGSeD3Zt8&feature=push-sd&attr_tag=8yMa1w5psH2Qr2Ww%3A6) -------------------------------------------------------------------------------- /java/simpledateformat.md: -------------------------------------------------------------------------------- 1 | # SimpleDateFormat 2 | 3 | 4 | 5 | ```java 6 | String pattern = "xxx"; 7 | SimpleDateFormat format = new SimpleDateFormat(String pattern); 8 | String time = format.format(new Date()); 9 | ``` 10 | 11 | 12 | 13 | 14 | 15 | - `G` 年代标志符 16 | - `y` 年 17 | - `M` 月 18 | - `d` 日 19 | - `h` 时 在上午或下午 (1~12) 20 | - `H` 时 在一天中 (0~23) 21 | - `m` 分 22 | - `s` 秒 23 | - `S` 毫秒 24 | - `E` 星期 25 | - `D` 一年中的第几天 26 | - `F` 一月中第几个星期几 27 | - `w` 一年中第几个星期 28 | - `W` 一月中第几个星期 29 | - `a` 上午 / 下午 标记符 30 | - `k` 时 在一天中 (1~24) 31 | - `K` 时 在上午或下午 (0~11) 32 | - `z` 时区 33 | 34 | 35 | 36 | 常见的 `pattern`: 37 | 38 | - `yyyy-MM-dd HH:mm:ss` 39 | - `yyyy年MM月dd日 HH时mm分ss秒` 40 | - `yyyy年MM月dd日 HH时mm分ss秒 E ` 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /android/shapedrawable.md: -------------------------------------------------------------------------------- 1 | # Shape Drawable 2 | 3 | 4 | > 迁移语雀 2021-2-22 5 | 6 | 7 | 指 XML 里的 shape 类型。 8 | 9 | 10 | 11 | - stroke 12 | - soild 13 | - 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | ### 虚线背景 22 | 23 | ![image-20190830162151831](/Users/mingjue/Library/Application Support/typora-user-images/image-20190830162151831.png) 24 | 25 | 26 | 27 | ```xml 28 | 29 | 30 | 31 | 36 | 37 | ``` 38 | 39 | 40 | 41 | - dashGap,间隔 42 | - dashWidth,宽度 43 | - width,宽度 -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Facade.md: -------------------------------------------------------------------------------- 1 | # 外观模式(Facade) 2 | 3 | 4 | 外观模式: **提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用**。 5 | 6 | 7 | 或者说:将一个类或数个类的复杂的一切都隐藏在背后,只显露出一个感觉美好的外观。 8 | 9 | 外观模式创建一个接口简化而统一的类,用来包装子系统中的一个或者多个复杂的类,而暴露给客户端的是非常简单的接口,让 **客户端和子系统解耦**。 10 | 11 | 12 | ![类图](http://ww1.sinaimg.cn/large/98900c07jw1f61clnut0gj20g10aodha.jpg) 13 | 14 | ## 特点 15 | 16 | 0. 让接口更简单 17 | 1. 外观提供简化的接口,但依然可以直接使用子系统的类。 18 | 2. 外观可以附加更『聪明的』功能,让子系统更方便。 19 | 3. 外观不只是简化了接口,也 **将客户从组件的子系统中解耦**。 20 | 4. 外观和适配器可以包装许多类,但是外观的意图是 **简化接口**,而适配器的意图是 **将接口转换成不同的接口**。 21 | 22 | 23 | ## 要点 24 | 25 | 1. 需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。 26 | 2. 外观将客户从一个复杂的子系统中解耦。 27 | 3. 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。 28 | 4. 你可以为一个子系统实现一个以上的外观。 29 | -------------------------------------------------------------------------------- /books/图解Http/第11章-Web的攻击技术.md: -------------------------------------------------------------------------------- 1 | # 第11章-Web的攻击技术 2 | 3 | 这一章讲了很多Web的攻击技术,而且每个技术都有详细的例子,非常棒。 4 | 5 | 不过限于篇幅,在这里只记录了攻击技术分类,并没把例子记录下来。 6 | 7 | 8 | 9 | 10 | 11 | ### 针对 Web 的攻击技术 12 | 13 | - HTTP不具备必要的安全功能 14 | - 在客户端即可篡改请求 15 | 16 | ### 因输出值转义不完全引发的安全漏洞 17 | 18 | - 跨站脚本攻击 XSS 19 | 20 | - SQL注入攻击 21 | 22 | - OS命令注入攻击 23 | 24 | - HTTP首部注入攻击 25 | ​ - 首部注入 26 | ​ - 响应截断 27 | 28 | - 邮件首部注入攻击 29 | 30 | - 目录遍历攻击 31 | 32 | - 远程文件包含漏洞 33 | 34 | ### 因设置或设计上的缺陷引发的安全漏洞 35 | 36 | - 强制浏览 37 | - 不正确的错误消息处理 38 | - 开放重定向 39 | 40 | ### 因会话管理疏忽引发的安全漏洞 41 | 42 | - 会话劫持 43 | - 会话固定攻击 44 | - 跨站点请求伪造 45 | 46 | ### 其他安全漏洞 47 | 48 | - 密码破解 49 | - 点击劫持 50 | - Dos 攻击 51 | - 后门程序 -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/State.md: -------------------------------------------------------------------------------- 1 | # 状态模式 2 | 3 | 状态模式: **允许对象在内部状态改变时改变它的行为,对象看起来好像修改它的类。** 4 | 5 | 6 | 状态模式把每个状态都独立成类,并将动作委托到代表当前状态的对象。 7 | 8 | 9 | ![类图](http://ww2.sinaimg.cn/large/98900c07jw1f62rdcmaarj20m8081wfc.jpg) 10 | 11 | 12 | Context需要持有 **所有状态的一个实例**(弹性的代价),通过不同状态来切换状态对象,把行为委托给当前状态的对象,客户端不知道Context内部的状态,跟策略模式不同,策略模式需要客户端去指定策略,而且一般来讲策略模式就只有一个最佳策略,不会存在多个。 13 | 14 | 15 | ## 要点 16 | 17 | 1. 状态模式允许一个对象基于内部状态而拥有不同的行为。 18 | 2. 和程序状态机(PSM)不同,状态模式用类代表状态。 19 | 3. Context会将行为委托给当前状态对象。 20 | 4. 通过将每个状态封装进一个类,我们把以后需要做的任何状态局部化了。 21 | 5. 状态模式和策略模式有相同的类图,但是它们的意图不同。 22 | 6. 策略模式通常会用行为或算法来配置Context类。 23 | 7. 状态模式允许Context随着状态的改变而改变行为。 24 | 8. 状态转换可以由State类或Context类控制。 25 | 9. 使用状态模式通常会导致设计中类的数目大量增加。 26 | 10. 状态类可以被多个Context实例共享。 27 | -------------------------------------------------------------------------------- /android/asm.md: -------------------------------------------------------------------------------- 1 | # ASM 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | ASM是一个通用的 **Java 字节码操作和分析框架**。 它可以**直接以二进制形式用于修改现有类或动态生成类**。 ASM提供了一些常见的字节码转换和分析算法,可以从中构建定制的复杂转换和代码分析工具。 ASM提供与其他Java字节码框架类似的功能,但**侧重于性能**。 因为它的设计和实现是尽可能的小和尽可能快,所以它非常适合在动态系统中使用(但当然也可以以静态方式使用,例如在编译器中)。(官网介绍) 7 | 8 | 9 | 10 | ASM 操作 class 文件,而在 Android 中其实是 dex 文件,不能直接操作 class 文件,所以如果要在 Android 中使用,得配合 gradle 插件以及 gradle 的 transform api 。 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | ## 资料 21 | 22 | 1. [ASM](https://asm.ow2.io/index.html) 23 | 2. [AOP 的利器:ASM 3.0 介绍](https://www.ibm.com/developerworks/cn/java/j-lo-asm30/index.html) 24 | 3. [【Android】函数插桩(Gradle + ASM)](https://cloud.tencent.com/developer/article/1399805) 25 | 4. [Android全埋点解决方案之ASM](https://www.sensorsdata.cn/blog/20181206-9/) -------------------------------------------------------------------------------- /books/JavaScriptDom编程艺术/第1章-JavaScript简史.md: -------------------------------------------------------------------------------- 1 | # 第1章-JavaScript简史 2 | 3 | > Write once,run anywhere. 4 | 5 | JavaScript是一门脚本语言,是解释型语言,需要 Web浏览器进行解释和执行。 6 | 7 | JavaScript 是 Netscapte 公司与 Sun 公司合作开发的。 8 | 9 | JavaScript 与 Java 毫无关系。 10 | 11 | 12 | HTML(超文本标记语言),CSS(层叠样式表)。 13 | 14 | ## DOM 15 | 16 | 什么是 DOM(文档对象模型,Document Object Model)? 17 | 18 | DOM 是一套对文档的内容进行抽象和概念化的方法;所有与 Web 标准相兼容的 Web浏览器都支持它。 19 | 20 | DHTML是 Dynamic HTML(动态 HTML),是描述 HTML CSS 和 JavaScript 技术组合的术语。 21 | 22 | DHTML 背后的含义: 23 | 24 | 1. 利用 HTML 把网页标记为各种元素; 25 | 2. 利用 CSS 设置元素样式和它们的显示位置; 26 | 3. 利用 JavaScript 实时地操控页面和改变样式。 27 | 28 | 利用 DHTML 可以非常容易实现复杂的动画效果。 29 | 30 | 31 | ## 制定标准 32 | 33 | W3C对 DOM 的定义是:“一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地访问和修改文档的内容、结构和样式”。 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /leetcode/434-字符串中的单词数.md: -------------------------------------------------------------------------------- 1 | # 434.字符串中的单词数 2 | 3 | 4 | 5 | 统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。 6 | 7 | 请注意,你可以假定字符串里不包括任何不可打印的字符。 8 | 9 | **示例:** 10 | 11 | ``` 12 | 输入: "Hello, my name is John" 13 | 输出: 5 14 | ``` 15 | 16 | ```java 17 | class Solution { 18 | public int countSegments(String s) { 19 | int count = 0; 20 | boolean lastIsBlank = true; 21 | for (int i = 0; i < s.length(); i++) { 22 | if (s.charAt(i) == ' ') { 23 | lastIsBlank = true; 24 | } else { 25 | if (lastIsBlank) { 26 | count++; 27 | } 28 | lastIsBlank = false; 29 | } 30 | } 31 | return count; 32 | } 33 | } 34 | ``` 35 | 36 | 37 | 38 | 思路:查看之前的字符是否是空格,如果是,则判断已经存在一个字母。 -------------------------------------------------------------------------------- /books/图解Http/第10章-构建Web内容的技术.md: -------------------------------------------------------------------------------- 1 | # 第10章-构建Web内容的技术 2 | 3 | Web使用各种各样的技术,来呈现丰富多彩的内容。 4 | 5 | 6 | 7 | ### Html 8 | 9 | #### CSS 10 | 11 | 层叠样式表;可以指定如何展现HTML 内的各种元素,属于样式表标准之一。 12 | 13 | - 让文档的结构和设计分离,达到解耦的目的。 14 | 15 | ### 动态 Html 16 | 17 | #### JavaScript 18 | 19 | #### DOM 20 | 21 | ### Web应用 22 | 23 | #### CGI 24 | 25 | CGI,通用网关接口,是指 Web 服务器在接收到客户端发送过来的请求后转发给程序的一组机制。 26 | 27 | - Perl 28 | - PHP 29 | - Ruby 30 | - C 31 | 32 | #### Servlet 33 | 34 | JavaEE 的产物,现在应该被淘汰了吧?不太清楚了。 35 | 36 | ### 数据发布的格式及语言 37 | 38 | #### XML 39 | 40 | 可扩展标记语言。 41 | 42 | #### RSS/Atom 43 | 44 | RSS(简易信息聚合,也叫聚合内容)和 Atom 都是发布新闻或博客日志等更新信息文档的格式的总称。 45 | 46 | RSS 还是有在用的。 47 | 48 | #### JSON 49 | 50 | 一种以 JavaScript 的对象表示法为基础的轻量级数据标记语言。 51 | -------------------------------------------------------------------------------- /fed/js/var-let-const.md: -------------------------------------------------------------------------------- 1 | # Var Let Const 2 | 3 | 4 | 5 | 6 | 7 | 用 var let const 尝试定义同一个变量两遍得到的结果: 8 | 9 | **用 var**: 10 | 11 | ```js 12 | var a = 555 13 | var a = 666 14 | console.log(a) 15 | //输出 666 16 | ``` 17 | 18 | **用 let:** 19 | 20 | ```js 21 | let b = 1 22 | let b = 2; 23 | console.log(b) 24 | ``` 25 | 26 | 报错: 27 | 28 | ``` 29 | Uncaught SyntaxError: Identifier 'b' has already been declared 30 | ``` 31 | 32 | 33 | 34 | **用 const:** 35 | 36 | ```js 37 | const c = 1 38 | const c = 2 39 | console.log(c) 40 | ``` 41 | 42 | 报错: 43 | 44 | ```js 45 | Uncaught SyntaxError: Identifier 'c' has already been declared 46 | ``` 47 | 48 | 49 | 50 | ### 总结 51 | 52 | 1. var 可以声明定义一个变量多次,而 let、const 则不行; 53 | 2. 54 | 55 | 56 | 57 | 58 | 59 | 定义变量,**优先使用 const,let 次之,尽量避免使用 var**。 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /ds/queue.md: -------------------------------------------------------------------------------- 1 | # 队列 Queue 2 | 3 | [TOC] 4 | 5 | 6 | 7 | ### 什么是队列? 8 | 9 | 10 | 11 | 队列是`先进先出`(FIFO,First-In-First-Out)的`线性表`。队列只允许在后端(rear)进行插入操作,在前端(front)进行删除操作。通常用`数组`或`链表`来实现。 12 | 13 | 14 | 15 | **注:**队列跟生活中的排队是一个道理,先排队的先出去,只能从队尾排队(插入),从队头出队(删除)。 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ### 队列的分类 24 | 25 | 26 | 27 | 队列可以分为几个: 28 | 29 | 1. `单链队列`,使用链表实现的队列对内存要求比较低(因为内存不连续),`不存在内存伪溢出的问题`,队列长度也没有限制。但插入和读取的时间代价较高。 30 | 2. `循环队列`,循环队列可以更简单防止伪溢出的发生,但队列大小是固定的。 31 | 3. `阵列队列` 32 | 33 | 34 | 35 | 36 | 37 | ### 复杂度 38 | 39 | 40 | 41 | | 算法 | 平均 | 最差 | 42 | | ---- | ------ | ------ | 43 | | 空间 | O(*n*) | O(*n*) | 44 | | 搜索 | O(*n*) | O(*n*) | 45 | | 插入 | O(1) | O(1) | 46 | | 删除 | O(1) | O(1) | 47 | 48 | 49 | 50 | 51 | 52 | ### 资料 53 | 54 | [https://zh.wikipedia.org/wiki/%E9%98%9F%E5%88%97](https://zh.wikipedia.org/wiki/队列) -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/learn/LearnLinkedList.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.learn; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2019/12/30. 5 | */ 6 | public class LearnLinkedList { 7 | 8 | 9 | public static void main(String[] args) { 10 | 11 | Node node1 = new Node(1); 12 | Node node2 = new Node(2); 13 | Node node3 = new Node(3); 14 | 15 | } 16 | 17 | 18 | class LinkedList { 19 | 20 | 21 | Node header; 22 | 23 | Node tail; 24 | 25 | public void add(int value) { 26 | 27 | } 28 | 29 | } 30 | 31 | public static class Node { 32 | 33 | Node next; 34 | int value; 35 | 36 | public Node(int value) { 37 | this.value = value; 38 | } 39 | 40 | Node next() { 41 | return next; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Observer.md: -------------------------------------------------------------------------------- 1 | # 观察者模式 2 | 3 | 观察者模式: 4 | **定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会受到通知,并自动更新。** 5 | 6 | 7 | ![](http://ww3.sinaimg.cn/large/98900c07jw1f5zaullrcij2099060t8v.jpg) 8 | 9 | 出版者(Subject) + 订阅者(Observer) = 观察者模式 10 | 11 | 观察者依赖于主题。 12 | 13 | 14 | ![UML](http://ww4.sinaimg.cn/large/98900c07gw1f5uino6cvoj20rs0bh0ub.jpg) 15 | 16 | **观察者模式提供了一种对象设计,让主题和观察者之间松耦合。** 17 | 18 | 1. 观察者与主题之间依赖于接口,主题不需要知道观察者的具体实现 19 | 2. 可以动态添加删除观察者,对主题没有任何影响 20 | 3. 新增新类型的观察者对主题没有影响,主题的代码不需要修改,而且旧的观察者也不受影响 21 | 4. 观察者与主题都可以独立复用,因为是松耦合 22 | 5. 只要约定的接口不改变,修改主题或观察者任何一方,都不会影响另一方 23 | 24 | 25 | 26 | 比如 EventBus 就是观察者模式。 27 | 注意: **观察者模式会造成内存泄漏,一定要记得取消订阅** 28 | 29 | 30 | 31 | ## See also 32 | [Observer pattern](https://en.wikipedia.org/wiki/Observer_pattern) 33 | [Observer Design Pattern Example](http://javadesign-patterns.blogspot.com/p/page22.html) 34 | -------------------------------------------------------------------------------- /java/linkedblockingdeque.md: -------------------------------------------------------------------------------- 1 | # LinkedBlockingDeque 2 | 3 | 4 | 5 | 6 | 7 | ```java 8 | public static void main(String[] args) { 9 | BlockingQueue queue = new LinkedBlockingDeque<>(); 10 | queue.add("A"); 11 | new Thread(new Runnable() { 12 | @Override 13 | public void run() { 14 | try { 15 | Thread.sleep(1000); 16 | } catch (InterruptedException e) { 17 | e.printStackTrace(); 18 | } 19 | queue.add("B"); 20 | } 21 | }).start(); 22 | try { 23 | System.out.println("take "+queue.take()); 24 | System.out.println("========="); 25 | System.out.println("take " + queue.take()); 26 | } catch (InterruptedException e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | ``` 31 | 32 | 输出A 后停顿一秒再输出 B: 33 | ``` 34 | take A 35 | ========= 36 | take B 37 | ``` 38 | 39 | 40 | -------------------------------------------------------------------------------- /android/dalvik-and-art.md: -------------------------------------------------------------------------------- 1 | # ART and Dalvik 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | ### ART 7 | 8 | > Android Runtime (ART) 是 Android 上的应用和部分系统服务使用的托管式运行时。 9 | 10 | ART 及其前身 Dalvik 最初是专为 Android 项目打造的。作为运行时的 ART 可执行 Dalvik 可执行文件并遵循 Dex 字节码规范。 11 | 12 | ART 和 Dalvik 是运行 Dex 字节码的兼容运行时,因此针对 Dalvik 开发的应用也能在 ART 环境中运作。不过,Dalvik 采用的一些技术并不适用于 ART。 13 | 14 | 15 | 16 | #### AOT 17 | 18 | ART 采用 AOT(ahead of time)技术,也即预编译,会在应用第一次安装的时候就预先把字节码编译成机器码,这样能够加速应用的启动,可以说是用空间换时间。 19 | 20 | 21 | 22 | ART 同时也提升了性能、垃圾回收 23 | 24 | 25 | 26 | **dex2oat**:把 APK 里的 `.dex` 文件转化成 `OAT` 文件,OAT文件是一种 Android 私有的 `ELF` 文件格式,它不仅包含有从 dex 文件翻译而来的本地机器指令,还包含有原来的 dex 文件内容。这使得我们无需重新编译原有的APK 就可以让它正常地在ART里面运行。 27 | 28 | 29 | 30 | ### Dalvik 31 | 32 | 33 | 34 | 在 4.4 以及之前的版本,Android 跑在 Dalvik 虚拟机上,也称 DVM。 35 | 36 | 37 | 38 | ### 资料 39 | 40 | https://source.android.com/devices/tech/dalvik/ 41 | 42 | https://source.android.com/devices/tech/dalvik/jit-compiler -------------------------------------------------------------------------------- /fed/js/closure.md: -------------------------------------------------------------------------------- 1 | # Closure 闭包 2 | 3 | 4 | 5 | A closure is one way of supporting [first-class functions](https://en.wikipedia.org/wiki/First-class_function); it is an expression that can reference variables within its scope (when it was first declared), be assigned to a variable, be passed as an argument to a function, or be returned as a function result. 6 | 7 | 8 | 9 | In JavaScript, if you use the `function` keyword inside another function, you are creating a closure. 10 | 11 | 12 | 13 | Simply accessing variables outside of your immediate lexical scope creates a closure**. 14 | 15 | 16 | 17 | 闭包不一定非要是一个被 return 的函数 18 | 19 | ```javascript 20 | function foo(x){ 21 | 22 | var tmp = 1; 23 | 24 | function adder(x,y){ 25 | return tmp + x + y;//这个其实也是闭包 26 | } 27 | } 28 | ``` 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | https://stackoverflow.com/questions/111102/how-do-javascript-closures-work -------------------------------------------------------------------------------- /gradle/android-common-config.md: -------------------------------------------------------------------------------- 1 | # Android 常用的配置 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | ### 配置 Java 8 12 | 13 | 14 | 15 | ```groovy 16 | android { 17 | ... 18 | // Configure only for each module that uses Java 8 19 | // language features (either in its source code or 20 | // through dependencies). 21 | compileOptions { 22 | sourceCompatibility JavaVersion.VERSION_1_8 23 | targetCompatibility JavaVersion.VERSION_1_8 24 | } 25 | } 26 | 27 | ``` 28 | 29 | ![img](http://ww2.sinaimg.cn/large/006tNc79ly1g50j1ds6xuj31140eoab4.jpg) 30 | 31 | 32 | 33 | Android 中的 Java8 支持: 34 | 35 | - Lambda 表达式 36 | - 函数引用 37 | - 类型注解 38 | - 默认和静态接口函数 39 | - 重复注解 40 | 41 | 42 | 43 | https://developer.android.com/studio/write/java8-support?hl=zh-CN 44 | 45 | 46 | 47 | ### 配置 HttpClient 48 | 49 | 50 | 51 | HttpClient 已经被废弃,但是一些老的库还是会有用,如果要开启则: 52 | 53 | ```groovy 54 | android { 55 | useLibrary 'org.apache.http.legacy' 56 | } 57 | ``` 58 | 59 | -------------------------------------------------------------------------------- /ds/stack.md: -------------------------------------------------------------------------------- 1 | # 堆栈 Stack 2 | 3 | [TOC] 4 | 5 | ### 什么是堆栈? 6 | 7 | 8 | 9 | 堆栈是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合一端(称为栈顶 top)进行加入数据(push)和移除数据(pop)的运算。(入栈出栈都在栈顶) 10 | 11 | 12 | 13 | 按照后进先出(LIFO,Last In First Out)的原理运作。 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 堆栈常用`一维数组`或`链表`来实现。 22 | 23 | 24 | 25 | ### 堆栈的操作 26 | 27 | 28 | 29 | - `入栈`,push,将数据放入栈的顶部; 30 | - `出栈`,pop,将栈顶数据移除; 31 | 32 | 33 | 34 | ### 堆栈的特性 35 | 36 | 37 | 38 | 1. 先进后出,后进先出; 39 | 2. 除了头尾节点之外,每个元素都有一个前驱,一个后继; 40 | 41 | 42 | 43 | ### Java 中的堆栈 44 | 45 | 46 | 47 | Java 中有 Stack 以及 ArrayDeque 可以实现栈的功能,推荐使用 ArrayDeque。 48 | 49 | 50 | 51 | ### 栈的应用 52 | 53 | todo 54 | 55 | - [回溯](https://zh.wikipedia.org/wiki/回溯法) 56 | - [递归](https://zh.wikipedia.org/wiki/递归) 57 | - [深度优先搜索](https://zh.wikipedia.org/wiki/深度优先搜索) 58 | 59 | 60 | 61 | ### 资料 62 | 63 | https://zh.wikipedia.org/wiki/%E5%A0%86%E6%A0%88 -------------------------------------------------------------------------------- /android/activity-1.md: -------------------------------------------------------------------------------- 1 | # Activity 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | ### 启动模式 7 | 8 | 9 | 10 | 11 | 12 | #### Flags 13 | 14 | ##### FLAG_ACTIVITY_REORDER_TO_FRONT 15 | 16 | ```java 17 | Intent intent = new Intent(this, Foo.class); 18 | intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 19 | startActivity(intent); 20 | ``` 21 | 22 | 如果 Activity 已经存在,则会被移动到栈顶,不会新启动一个 Activity。(onNewIntent 会被调用) 23 | 24 | 例如有 A、B、C 三个 Activity,再次启动 B 要变成:A C B 而不是 A B C B 的话,就可以使用它。 25 | 26 | 坑:透明的 Activity 不起作用, 得加上启动模式 singleTask or singleTask。 27 | 28 | 29 | ##### FLAG_ACTIVITY_CLEAR_TOP 30 | 31 | ```java 32 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 33 | ``` 34 | 35 | 如果目标 Activity 存在,则会清除它顶部的所有 Activity,并将 Intent 传递给它,调用 onNewIntent() 。 36 | 37 | A B C D ,启动 B ==> A B , CD 都因为在 B 顶部所以被移除。 38 | 39 | 但是默认情况下这个 B 会被重启,如果不想,则需要加`FLAG_ACTIVITY_SINGLE_TOP` 到 Intent 上。 40 | 41 | https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Decorator.md: -------------------------------------------------------------------------------- 1 | # 装饰者模式 2 | 3 | 装饰者模式: 4 | 5 | **动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。** 6 | 7 | 装饰者模式可以给类 **动态地添加功能,而不需要修改已经存在的类**,类似一个`Wrapper`。 8 | 9 | 装饰者有弹性,非常符合 `开闭原则` 10 | 11 | ## 特点 12 | 13 | 1. 装饰者和被装饰者对象**拥有相同的超类型** 14 | 2. 你可以用一个或多个装饰者包装一个对象 15 | 3. 既然装饰者和被装饰者对象拥有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象替代它 16 | 4. **装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的** 17 | 5. 对象可以在任何时候被装饰,所以可以在运行时动态地不限量地用你喜欢的装饰者来装饰对象 18 | 19 | 20 | ## 装饰者模式的缺点 21 | 22 | **可能会引入大量的类**,导致理解起来并不容易,也可能会使使用者懵逼。 23 | 24 | 可能会出现以下情况: 25 | ``` 26 | D a = new A(new B(new C(new D))); 27 | ``` 28 | 29 | 比较复杂,难以理解。 30 | 31 | ## 具体使用 32 | 33 | Java源码中的`I/O`就是装饰者模式,各种 `XXXStream`、`Reader` 和 `Writer`。 34 | 35 | 比如: 36 | 37 | ``` 38 | BufferedReader reader = new BufferedReader(new FileReader(new File("C:\\testing.txt"))); 39 | ``` 40 | 41 | ## See also 42 | [Decorator Design Pattern Example](http://javadesign-patterns.blogspot.com/p/decorator.html) 43 | -------------------------------------------------------------------------------- /fed/js/README.md: -------------------------------------------------------------------------------- 1 | # JavaScript 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | JS 的问题: 16 | 17 | 1. 语法太灵活导致开发大型 Web 项目困难;解法:TypeScript 18 | 2. 性能不能满足一些场景的需要;解法:Google 的 V8 19 | 20 | 21 | 22 | 23 | 24 | ### TypeScript 25 | 26 | 27 | 28 | ![image-20190724223645739](http://ww1.sinaimg.cn/large/006tNc79ly1g5bb0zs0r4j31pi0bkab7.jpg) 29 | 30 | 31 | 32 | ### Google : V8 33 | 34 | V8 是 Google 推出的 JS 引擎,使用 JIT 技术提升JS 的执行速度。并且成功地使性能提升了数十倍。 35 | 36 | 37 | 38 | 39 | 40 | ### WebAssembly 41 | 42 | WebAssembly 是一份`字节码标准`,以字节码的形式依赖虚拟机在浏览器中运行。 43 | 44 | 注意:`它并不是汇编`,只是看起来像汇编而已。 45 | 46 | 47 | 48 | 可以依赖 Emscripten 等编译器将 C++/Golang/Rust/Kotlin 等`强类型`语言编译成 WebAssembly 字节码(`.wasm` 文件)。 49 | 50 | (JS 不能直接编译成.wasm,因为它是弱类型) 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | ### 优质资料 59 | 60 | 腾讯: 61 | 62 | [WebAssembly 不完全指北](https://juejin.im/post/5d367656f265da1b904c2126) 63 | 64 | https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript -------------------------------------------------------------------------------- /android/annotation-processor.md: -------------------------------------------------------------------------------- 1 | # Android Processor 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | 7 | ### 经验 8 | 9 | ### 配置参数 10 | 11 | 我们可以通过配置 options 来给 processor 传递参数,达到配置 Processor 的目的。 12 | 13 | 在引用了 processor 的项目里配置 javaCompileOptions DSL。 14 | 15 | 例如: 16 | ```grovvy 17 | android { 18 | compileSdkVersion 28 19 | defaultConfig { 20 | ... 21 | javaCompileOptions{ 22 | annotationProcessorOptions{ 23 | //填写键值对,多个用逗号隔开 24 | arguments = [autoRegister:'true'] 25 | } 26 | } 27 | } 28 | buildTypes { 29 | release { 30 | minifyEnabled false 31 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 32 | } 33 | } 34 | } 35 | ``` 36 | 37 | 在 init 方法里接受参数: 38 | ```java 39 | Map options = processingEnv.getOptions(); 40 | if (options.containsKey("autoRegister")) { 41 | autoRegisterFactories = Boolean.parseBoolean(options.get("autoRegister")); 42 | } 43 | ``` 44 | 45 | -------------------------------------------------------------------------------- /kotlin/kotlin-jvm-annotations.md: -------------------------------------------------------------------------------- 1 | # Kotlin Jvm Annotation 2 | 3 | 4 | 为了跟 Java 有更好的互操作性而定义的注解: 5 | 6 | - JvmDefault 7 | - JvmField 8 | - JvmMultifileClass 9 | - JvmName 10 | - JvmOverloads 11 | - JvmStatic 12 | - ... 13 | 14 | 15 | ## JvmOverloads 16 | > Instructs the Kotlin compiler to generate overloads for this function that substitute default parameter values. 17 | 18 | If a method has N parameters and M of which have default values, M overloads are generated: the first one takes N-1 parameters (all but the last one that takes a default value), the second takes N-2 parameters, and so on. 19 | 20 | 指示 kotlin 编译器为带默认参数的函数生成重载函数。如果一个方法有N个参数,其中M个具有默认值,则会生成M个重载:第一个重载使用N-1个参数(除了最后一个具有默认值),第二个重载N-2个参数,依此类推。 21 | 22 | 23 | 适用于: 24 | - 构造方法 25 | - 一般方法 26 | - 静态方法 27 | 28 | 不适用于: 29 | - 抽象方法 30 | 31 | 因为抽象方法没有方法体。 32 | 33 | 34 | 需要注意,在实践过程中发现,该注解不能作用于抽象方法,所以不能用于接口里定义的方法,也不能作用于抽象类里的抽象方法。 35 | 36 | 针对 Java 调用 kotlin 的情况,只能在类里定义方法了。 37 | 38 | 39 | ## 资料 40 | 41 | [Annotation](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-annotation.html) -------------------------------------------------------------------------------- /android/androidx.md: -------------------------------------------------------------------------------- 1 | # AndroidX 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | 7 | 8 | 作为 Jetpack 的一部分,我们正在将 Android 支持库迁移到使用 androidx 命名空间的全新 Android 扩展库。如需了解详情,请参阅 AndroidX 概览。 9 | 10 | Android Studio 3.2 利用一项新的迁移功能来帮助您完成此过程。 11 | 12 | 要将现有项目迁移到 AndroidX,请依次选择 Refactor > Migrate to AndroidX。如果您有任何尚未迁移到 AndroidX 命名空间的 Maven 依赖项,则 Android Studio 编译系统还会自动转换这些项目依赖项。 13 | 14 | 15 | 16 | Android Gradle 插件提供以下可在 `gradle.properties` 文件中设置的全局标记: 17 | 18 | 1. `android.useAndroidX`:当设为 true 时,此标记表示您想立即开始使用 AndroidX。如果缺少此标记,则 Android Studio 会假定此标记已设为 false。 19 | 2. `android.enableJetifier`:当设为 true 时,此标记表示您想要获得相关的工具支持(通过 Android Gradle 插件),以便将现有第三方库当作针对 AndroidX 编写的库进行自动转化。如果缺少此标记,则 Android Studio 会假定此标记已设为 false。 20 | 21 | 22 | 23 | 当您使用 **Migrate to AndroidX** 命令时,这两个标记都会设为 true。 24 | 25 | 26 | 27 | 如果您想立即开始使用 AndroidX 库,而不需要转换现有的第三方库,只需将 `android.useAndroidX` 标记设为 true,并将 `android.enableJetifier` 标记设为 false。 28 | 29 | 30 | 31 | ### 资料 32 | 33 | AndroidX 概览:https://developer.android.com/jetpack/androidx 34 | 35 | 迁移到 AndroidX:https://developer.android.com/jetpack/androidx/migrate -------------------------------------------------------------------------------- /android/import-so-libs.md: -------------------------------------------------------------------------------- 1 | # Android 中引入 so 文件 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | Android Studio 引入 so 文件方法有二。 7 | 8 | 9 | 10 | ### 一 通过 jniLibs 引入 11 | 12 | 13 | 14 | 简单、方便,适合符合 Android Studio 工程目录的项目,比如用 Android Studio 新建的项目。 15 | 16 | 17 | 18 | 1. 在 `src/mian/`目录下新建`jniLibs`文件夹,跟`java`、`res`目录是同级的; 19 | 2. Copy `.so` 文件到`jniLibs`目录; 20 | 3. 编译即可。 21 | 22 | 23 | 24 | 举个🌰: 25 | 26 | ![image-20190702154102448](http://ww4.sinaimg.cn/large/006tNc79ly1g5ccomdbycj30co080jsf.jpg) 27 | 28 | ### 二 通过 libs 引入 29 | 30 | 31 | 32 | 相对复杂,适合非 AndroidStudio 工程项目,比如 Eclipse 结构的项目、自定义了 `sourceSets` 的项目。 33 | 34 | 35 | 36 | 1. 在 module 下新建跟`src`目录*同级*的`libs`目录; 37 | 38 | 2. Copy `.so` 文件到`libs`目录; 39 | 40 | 3. 配置 `sourceSets` : 41 | 42 | 1. ```groovy 43 | android { 44 | 45 | sourceSets{ 46 | main { 47 | ... 48 | jniLibs.srcDirs = ['libs'] 49 | } 50 | } 51 | } 52 | ``` 53 | 54 | 4. 编译。 55 | 56 | 57 | 58 | 举个🌰: 59 | 60 | ![image-20190702170503415](http://ww2.sinaimg.cn/large/006tNc79ly1g5ccomsm28j3090039t94.jpg) 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /books/AndroidHero/第3章-Android控件架构与自定义控件详解.md: -------------------------------------------------------------------------------- 1 | # 第3章 Android控件架构与自定义控件详解 2 | 3 | 1. 整个界面的控件形成一个控件树,上层控件负责下层子控件的测量与绘制,并传递事件,并且每个控件树的顶点都有一个ViewParent对象,所有交互事件都由它控制 4 | 2. findViewById在控件树中以**深度优先遍历**来查找对应元素. 5 | 3. 每个Activity都包含一个Window对象(通常是PhoneWindow),它将DecorView设为整个应用窗口的根View 6 | 4. `requestWindowFeature()`方法一定要在调用`setContentView`之前才有效. 7 | 5. `onResume`之后,系统才将DecorView添加到PhoneWindow并显示. 8 | 9 | 10 | ## View的测量 onMeasure 11 | 12 | **MeasureSpec**,一个32位的int值,高2位为测量的模式,低30位为测量的大小(位运算提高并优化效率) 13 | 14 | 模式|含义|条件 15 | :--:|:--:|:--: 16 | EXACTLY|精确模式|具体值(如30dp)/`match_parent` 17 | AT_MOST|最大值模式|`wrap_content` 18 | UNSPECIFIED|不限制模式|系统/自定义View 19 | 20 | 21 | 0. View默认的`onMeasure`只支持Exactly,所以自定义View如果需要支持`wrap_content`,则需要重写`onMeasure` 22 | 1. 通过`Measpec.getMode/.getSize`可以获取测量模式与数值大小 23 | 2. `setMeasuredDimension(int,int)`完成测量,这之后`getMeasuredHeight`和`getMeasuredWidth`才有值,不然都是0 24 | 25 | 26 | ## View的绘制 onDraw 27 | 28 | `Canvas canvas = new Canvas(bitmap)` 29 | 30 | 1. Canvas的Bitmap与Canvas是紧密联系在一起的,这个过程称为装载画布 31 | 2. 该Bitmap存储所有绘制在Canvas上的像素信息(即canvas.drawXXX()方法都发生在该Bitmap上) 32 | 15. mTouchSlop = ViewConfiguration.getScaledTouchSlop() 33 | 34 | ## ViewGroup的测量与绘制 35 | 36 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Composite.md: -------------------------------------------------------------------------------- 1 | # 组合模式 2 | 3 | 组合(Composite)模式:**允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。** 4 | 5 | 组合模式比较复杂一些,跟迭代器模式配合威力强大。 6 | 7 | ![类图](http://ww1.sinaimg.cn/large/98900c07jw1f62hwemqvcj20xc0ljdhf.jpg) 8 | 9 | 10 | 树形结构: 11 | 12 | ![](http://ww4.sinaimg.cn/large/98900c07jw1f62nmm1sfrj209d08oq33.jpg) 13 | 14 | 带子元素的元素称为 『节点』(node) 15 | 16 | 没有子元素的元素称为 『叶节点』(leaf) 17 | 18 | 包含其他组件的组件为『组合对象』,没有包含其他组件的组件为『叶节点对象』 19 | 20 | **任何一个『节点』和『叶节点』都是一种『组合』。** 21 | 22 | 23 | ## 注意点 24 | 25 | 组合模式让我们能用树型方式创建对象的结构,树里面包含了组合以及个别的对象。 26 | 使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。 27 | 28 | 29 | 使用组合模式的时候,Component需要包含`Leaf`和`Composite`,以致于它们都会包含一些自己不需要的方法,所以可能在不需要的方法里`throw UnsupportedOperationExecption` 或者 返回`null`or`false`。 30 | 31 | 并且这么做,其实是不符合单一职责原则的,但是这么做能换来『透明性』(transparency): **通过让组件的接口同时包含一些管理子节点和页节点的操作,客户就可以将组合和叶节点一视同仁**。也就是说,一个元素究竟是组合还是叶节点,对客户是透明的。 32 | 33 | ## 要点 34 | 35 | 1. 组合模式提供一个结构,可同时包含个别对象和组合对象。 36 | 2. 组合模式允许客户对个别对象以及组合对象一视同仁。 37 | 3. 组合结构内的任意对象成为组件,组件可以是组合,也可以是叶节点。 38 | 4. 实现组合模式时,有许多设计上的折中。你要根据需要平衡透明性和安全性。 39 | 40 | 41 | ## 小结 42 | 43 | 组合最大的优势是:**让客户端更加简单,客户端不需要再操心面对的是组合对象还是叶节点对象,所以不需要写一大堆if语句来保证他们对正确的对象调用了正确的方法。通常,他们只需要对整个结构调用一个方法并执行操作就可以了。** 44 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/self/MyLinkedStack.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.self; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/15. 5 | *

6 | * todo 7 | */ 8 | public class MyLinkedStack { 9 | 10 | private Node top; 11 | 12 | public boolean push(String value) { 13 | Node item = new Node(value); 14 | 15 | if (top == null) { 16 | top = item; 17 | }else{ 18 | item.next=top; 19 | top = item; 20 | } 21 | 22 | return true; 23 | } 24 | 25 | public String pop() { 26 | 27 | if (top == null) { 28 | return null; 29 | } 30 | 31 | String value = top.value; 32 | 33 | if (top.next != null) { 34 | top = top.next; 35 | }else{ 36 | top = null; 37 | } 38 | 39 | return value; 40 | } 41 | 42 | 43 | public static void main(String[] args) { 44 | 45 | MyLinkedStack myArrayStack = new MyLinkedStack(); 46 | 47 | for (int i = 0; i < 6; i++) { 48 | System.out.println(myArrayStack.push("" + i)); 49 | } 50 | 51 | for (int i = 0; i < 7; i++) { 52 | System.out.println(myArrayStack.pop()); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /java/countdownlatch.md: -------------------------------------------------------------------------------- 1 | # CountDownLatch 2 | 3 | 4 | 5 | ### 示例 6 | 7 | ```java 8 | private static void countdownLatchTest() { 9 | 10 | final CountDownLatch latch = new CountDownLatch(2); 11 | 12 | Thread a = new Thread(new Runnable() { 13 | @Override 14 | public void run() { 15 | 16 | try { 17 | Thread.sleep(1000); 18 | } catch (InterruptedException e) { 19 | e.printStackTrace(); 20 | } 21 | System.out.println("thread a done"); 22 | latch.countDown(); 23 | } 24 | }); 25 | 26 | Thread b = new Thread(new Runnable() { 27 | @Override 28 | public void run() { 29 | System.out.println("thread a done"); 30 | latch.countDown(); 31 | } 32 | }); 33 | 34 | a.start(); 35 | b.start(); 36 | 37 | try { 38 | latch.await(); 39 | } catch (InterruptedException e) { 40 | e.printStackTrace(); 41 | } 42 | 43 | System.out.println("All threads are done~"); 44 | } 45 | ``` 46 | 输出: 47 | ``` 48 | thread a done 49 | thread b done 50 | All threads are done~ 51 | ``` 52 | 53 | -------------------------------------------------------------------------------- /flutter/README.md: -------------------------------------------------------------------------------- 1 | # Flutter 2 | 3 | 4 | 5 | State*less* widgets 是不可变的,这意味着它们的属性不能改变 —— 所有的值都是 final。 6 | 7 | State*ful* widgets 持有的状态可能在 widget 生命周期中发生变化,实现一个 stateful widget 至少需要两个类: 1)一个 StatefulWidget 类;2)一个 State 类,StatefulWidget 类本身是不变的,但是 State 类在 widget 生命周期中始终存在。 8 | 9 | 10 | 11 | 语法跟 Java 也类似,有泛型,继承用 extends 12 | 13 | 14 | 15 | ```dart 16 | class FooWidget extends StatefulWidget { 17 | @override 18 | FooWidgetState createState() => FooWidgetState(); 19 | } 20 | 21 | class FooWidgetState extends State { 22 | @override 23 | Widget build(BuildContext context) { 24 | return Text(title:"Fitz"); 25 | } 26 | } 27 | ``` 28 | 29 | 30 | 31 | **提示:** 在 Flutter 的响应式风格的框架中,调用 `setState()` 会为 State 对象触发 `build()` 方法,从而导致对 UI 的更新。 32 | 33 | **提示**: 某些 widget 属性需要单个 widget(child),而其它一些属性,如 action,需要一组widgets(children),用方括号 [] 表示。 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | ### 学习资料 42 | 43 | 44 | 45 | YouTuBe 频道:https://www.youtube.com/flutterdev 46 | 47 | widgets 介绍:https://flutter.cn/docs/development/ui/widgets-intro 48 | 49 | https://github.com/flutter/flutter/wiki/Release-Notes-Flutter-1.5.4 50 | 51 | https://flutter-io.cn/docs 52 | 53 | 54 | 55 | https://groups.google.com/forum/#!forum/flutter-announce 56 | 57 | dart:https://flutter.dev/docs/resources/bootstrap-into-dart -------------------------------------------------------------------------------- /ds/README.md: -------------------------------------------------------------------------------- 1 | # 数据结构 2 | 3 | [TOC] 4 | 5 | > Data Structures 6 | 7 | 8 | 9 | 在计算机科学中,数据结构是`计算中存储、组织数据的方式`。 10 | 11 | 12 | 13 | 数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。 14 | 15 | 16 | 17 | 不同种类的数据结构适合不同种类的应用,部分数据结构甚至是为了解决特定问题而设计出来的。 18 | 19 | 20 | 21 | 22 | 23 | ### 常用数据结构 24 | 25 | 26 | 27 | - 数组 array 28 | - 链表 linked list 29 | 30 | - 单链表,next 31 | - 双向链表,next pre 32 | - 循环链表,尾部指向头部 33 | - 双向循环链表,next pre,尾部也能指向头部 34 | - 栈,stack 先进后出 35 | - 队列,queue 先进先出 36 | - 单队列 37 | 38 | - 顺序队列,数组实现 39 | - 链式队列,链表实现 40 | - 循环队列 41 | - 树 tree 42 | - 图 graph 43 | - 堆积 heap 44 | - 散列表 hash table 45 | 46 | 47 | 48 | ### 一些概念 49 | 50 | 51 | 52 | #### 线性表 53 | 54 | 55 | 56 | 线性表(Linear List),是由 n(n<=0)个数据元素 a[0]....a[n-1]组成的有限序列。 57 | 58 | 其中: 59 | 60 | - 数据元素的个数 n 定义为`表的长度`,长度为0 时称为`空表` 61 | - 将非空线性表记作:a[0],a[1],...,a[n-1] 62 | 63 | 64 | 65 | ##### 线性表的存储结构 66 | 67 | 68 | 69 | - 顺序表 70 | 71 | - 链表 72 | 73 | - 单链表 74 | 75 | - 动态单链表 76 | - 静态单链表 77 | 78 | - 双链表 79 | 80 | - 循环链表 81 | 82 | - 单循环链表 83 | - 双循环链表 84 | 85 | 86 | 87 | **顺序表**是在计算内存中`以数组的形式`保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。 88 | 89 | 90 | 91 | 92 | 93 | ### 资料 94 | 95 | 数据结构:[https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84](https://zh.wikipedia.org/wiki/数据结构) 96 | 97 | -------------------------------------------------------------------------------- /android/run-dex-directly.md: -------------------------------------------------------------------------------- 1 | # 在手机直接运行 Dex 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | ### 步骤 7 | 8 | 1. 编写 Java 文件 9 | 1. vim Hello.java 10 | 2. 生成 class 文件 11 | 1. javac Hello.java 12 | 3. 生成 dex 文件 13 | 1. `$ANDROID_HOME/build-tools/28.0.3/dx --dex --output=classes.dex Hello.class` 14 | 4. push 到手机 sdcard 15 | 1. adb push classes /sdcard/ 16 | 5. 到 sdcard 执行 dex 17 | 1. adb shell 18 | 2. cd sdcard 19 | 3. `dalvikvm -cp classes.dex [className]` ,-cp 是 classpath 的意思,className 是类名 20 | 21 | 22 | 23 | 注: dx 工具可以用来生成 dex 文件 24 | 25 | `dalvikvm -showversion` 查看 dvm 版本 26 | 27 | 28 | 29 | ### 实战记录 30 | 31 | 32 | 33 | vim Hello.java : 34 | 35 | ```java 36 | public class Hello{ 37 | public static void main(String[]args){ 38 | System.out.println("Hello world!"); 39 | }} 40 | ``` 41 | 42 | ```shell 43 | javac Hello.java 44 | 45 | $ANDROID_HOME/build-tools/28.0.3/dx --dex --output=classes.dex Hello.class 46 | ``` 47 | 48 | 49 | 50 | ![image-20190801113216671](http://ww3.sinaimg.cn/large/006tNc79ly1g5k0rvqwalj309m03qjrc.jpg) 51 | 52 | 53 | 54 | 55 | 56 | ![image-20190801114208679](http://ww2.sinaimg.cn/large/006tNc79ly1g5k122jr2zj30c304eq3u.jpg) 57 | 58 | 59 | 60 | 61 | 62 | 如果故意写错 Dex 或者类路径,则会遇到这个错误: 63 | 64 | ![image-20190801114551245](http://ww1.sinaimg.cn/large/006tNc79ly1g5k15xqol0j30j90ckq7r.jpg) 65 | 66 | 67 | 68 | 令人熟悉的 BaseDexClassLoader,吼吼。 69 | 70 | -------------------------------------------------------------------------------- /java/stack.md: -------------------------------------------------------------------------------- 1 | # Stack(栈) 2 | 3 | 4 | 5 | 栈是一种 `LIFO`(last in first out,后进先出)的数据结构,最后 push 进去的元素最先被 pop 出来。 6 | 7 | 8 | 9 | 不过 Stack 的作者更推荐 ArrayDeque 而不是 Stack,实际上也确实很少看到 Stack 的使用。 10 | 11 | 12 | 13 | ### Java Stack 14 | 15 | ```java 16 | public class Stack extends Vector 17 | ``` 18 | 19 | 20 | 21 | 在 Java 里有 Stack,还有 Deque等实现,以 Stack 为例。 22 | 23 | 24 | 25 | Stack 的方法: 26 | 27 | - `push(E)`,*入栈*,把元素放到栈顶; 28 | - `pop()`,*出栈*,取出栈顶元素,这个操作*会把栈顶元素移除*; 29 | - `peek()`,查看栈顶元素,*只是看不会移除*; 30 | - `empty()`,检查站是否为空; 31 | - `search(E)`,搜索,这个得注意, 有点奇怪,返回的数据是从栈顶到那个元素所在的位置的距离(index 从 1 开始); 32 | 33 | 34 | 35 | ```java 36 | public static void main(String[] args) { 37 | 38 | Stack stack = new Stack<>(); 39 | 40 | stack.push(0); 41 | stack.push(1); 42 | stack.push(2); 43 | stack.push(3); 44 | stack.push(4); 45 | //4 栈顶 46 | //3 47 | //2 48 | //1 49 | //0 栈底 50 | //查看栈顶元素,但是不移除 51 | Integer peek = stack.peek(); 52 | System.out.println("peek:"+peek);//4 53 | 54 | //查看栈顶元素,并移除 55 | Integer pop = stack.pop(); 56 | System.out.println("pop:"+pop);//4 57 | 58 | //因为 pop()方法把 4 移除了 59 | System.out.println("peek2:"+ stack.peek());//3 60 | //size 4 61 | System.out.println("size:"+ stack.size());//4 62 | //搜索到 index 为 1,然后从栈顶到 1 的位置是 4-1=3 63 | System.out.println("search 0:"+ stack.search(1));//3 64 | 65 | } 66 | ``` 67 | 68 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Adapter.md: -------------------------------------------------------------------------------- 1 | # 适配器模式(Adapter) 2 | 3 | 4 | 适配器模式:**将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。** 5 | 6 | 适配器非常形象的图: 7 | 8 | ![形象图](http://ww3.sinaimg.cn/large/98900c07jw1f60ibhzrx4j20aj057t8u.jpg) 9 | 10 | 11 | 非常形象的模式,就像生活中的手机充电器,电脑的电源适配器一样。 12 | 13 | ## 使用场景 14 | 15 | 当想使用一个已经存在的类,但是不匹配需求接口的时候,可以考虑使用适配器模式来适配,如果有需要还可以做 **双向适配**,来完成适配。 16 | 17 | ![类图](http://ww4.sinaimg.cn/large/98900c07jw1f60l15wrt4j20u20m8416.jpg) 18 | 19 | 适配器实现Client所需的目标的接口,并包裹一个被适配者的对象,收到方法调用的时候,委托给被适配者,来达到适配的目标。 20 | 21 | 22 | ## 小结 23 | 24 | ### 优势 25 | 26 | 1. 使用对象组合的方式,用修改的接口来包装适配者 27 | 2. 被适配者的任何子类也可以搭配适配器使用 28 | 3. 个人觉得使用适配器最大的好处是 **不需要修改客户端以及被适配者的代码。** 29 | 30 | ### 缺点 31 | 32 | 1. 需要实现所有的方法去完成适配,如果目标非常大,那么工作量也比较大。 33 | 34 | NOTE:之前提到的都是 **对象适配器**,另外还有一种叫做 **类适配器**,不过类适配器需要多重继承去实现(Adapter需要继承Target和Adaptee),而不是组合的方式去实现。 35 | 36 | ### 适配器 装饰者 外观模式的不同: 37 | 38 | 适配器是:**将一个接口转成另一个接口** 39 | 装饰者是:**不改变接口,但加入新的责任** 40 | 外观模式是:**让接口更简单** 41 | 42 | ### 要点 43 | 44 | 1. 当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。 45 | 2. 适配器改变接口以符合客户的期望。 46 | 3. 实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂度而定。 47 | 4. 适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多重继承。 48 | 5. 适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象『包装』起来以简化其接口。 49 | 50 | 51 | ## See also 52 | 53 | [Adapter pattern](https://en.wikipedia.org/wiki/Adapter_pattern) 54 | [Adapter Design Pattern Example](http://javadesign-patterns.blogspot.com/p/adapter-pattern-example.html) 55 | -------------------------------------------------------------------------------- /android/README.md: -------------------------------------------------------------------------------- 1 | # Android 2 | 3 | 4 | 5 | - 💪基础不牢,地动山摇 6 | - [【源码分析】Handler 原理分析](./handler.md) 7 | - [AsyncTask](./asynctask.md) 8 | - 🖼UI工程师 不得不会画的 UI ! 9 | - [ConstraintLayout](./constraintlayout.md) 10 | - [ProgressBar](./progressbar.md) 11 | - [SurfaceView](./surfaceview.md) 12 | - [VideoView](./videoview.md) 13 | - [PopupMenu](./popupmenu.md) 14 | - 🕳谁还不会搞点动画? 15 | - [View Animation](./view-animation.md) 16 | - [Property Animation](./property-animation.md) 17 | - 😭谁还没被 Fragment 给坑过似的? 18 | - [Fragment](./fragment.md) 19 | - [Dialog Fragment](./dialog-fragment.md) 20 | - 🐂🍺与时俱进,不做 out man 之: 深入理解 `Jetpack` 系列 21 | - [【AAC 系列一】Android 应用架构新时代来临!](./aac.md) 22 | - [【AAC 系列二】深入理解架构组件的基石:Lifecycle](./aac-lifecycle.md) 23 | - [【AAC 系列三】深入理解架构组件:LiveData](./aac-livedata.md) 24 | - [【AAC 系列四】深入理解架构组件:ViewModel](./aac-viewmodel.md) 25 | - [【AAC 番外】掌握 DataBinding 理论篇](./databinding.md) 26 | - [【AAC 番外】 掌握 DataBinding 实践篇](./databinding-get-started.md) 27 | - 🤩 站在巨人的肩膀,风景就是好哇 28 | - [【源码分析】Retroift](./retrofit.md) 29 | - [【源码分析】Lottie 实现炫酷动画背后的原理](./lottie.md) 30 | - - 31 | - - 32 | 33 | 34 | 35 | ### 资料 36 | 37 | [Improving App Performance with Benchmarking (Google I/O'19)](https://www.youtube.com/watch?v=ZffMCJdA5Qc&feature=youtu.be) 38 | 39 | [Build a Modular Android App Architecture (Google I/O'19)](https://www.youtube.com/watch?v=PZBg5DIzNww&feature=youtu.be) 40 | 41 | https://www.youtube.com/watch?v=Qxj2eBmXLHg&feature=youtu.be 42 | 43 | -------------------------------------------------------------------------------- /android/multidex.md: -------------------------------------------------------------------------------- 1 | # Multidex 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | App 代码膨胀,可能会遇到问题: 7 | 8 | 9 | 10 | ```java 11 | Conversion to Dalvik format failed: 12 | Unable to execute dex: method ID not in [0, 0xffff]: 65536 13 | ``` 14 | 15 | 16 | 17 | ``` 18 | trouble writing output: 19 | Too many field references: 131000; max is 65536. 20 | You may try using --multi-dex option. 21 | ``` 22 | 23 | 24 | 25 | `65536`,它代表的是单个 Dalvik Executable (DEX) 字节码文件内的代码可调用的*引用总数*。 26 | 27 | 28 | 29 | ### 关于 64K 引用限制 30 | 31 | Android 应用 (APK) 文件包含 [Dalvik](https://source.android.com/devices/tech/dalvik/?hl=zh-cn) Executable (DEX) 文件形式的可执行字节码文件,其中包含用来运行您的应用的已编译代码。Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及您自己代码中的方法。在计算机科学领域内,术语[*千(简称 K)*](https://en.wikipedia.org/wiki/Kilo-)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”。 32 | 33 | 34 | 35 | ```groovy 36 | android { 37 | defaultConfig { 38 | ... 39 | minSdkVersion 21 40 | targetSdkVersion 28 41 | multiDexEnabled true 42 | } 43 | ... 44 | } 45 | 46 | dependencies { 47 | compile 'com.android.support:multidex:1.0.3' 48 | } 49 | ``` 50 | 51 | 52 | 53 | ```java 54 | public class App extends Application { 55 | 56 | @Override 57 | protected void attachBaseContext(final Context base) { 58 | super.attachBaseContext(base); 59 | //install 60 | MultiDex.install(this); 61 | } 62 | } 63 | ``` 64 | 65 | 66 | 67 | ### 资料 68 | 69 | https://developer.android.com/studio/build/multidex?hl=zh-cn -------------------------------------------------------------------------------- /books/man-hua-suanfa.md: -------------------------------------------------------------------------------- 1 | # 《漫画算法——小灰的算法之旅》 2 | 3 | 4 | 5 | ### 第 1 章 算法概述 6 | 7 | 8 | 9 | ### 1.1 算法和数据结构 10 | 11 | 计算机科学领域的算法,它的本质是一些列程序指令,用于解决特定的运算和逻辑问题。 12 | 13 | 14 | 15 | 衡量算法好坏的标准: 16 | 17 | 1. 时间复杂度 18 | 2. 空间复杂度 19 | 20 | 21 | 22 | 算法的应用领域多种多样: 23 | 24 | 1. 运算 25 | 2. 查找 26 | 3. 排序 27 | 4. 最优决策 28 | 5. 面试 29 | 30 | ##### 数据结构 31 | 32 | 数据结构是数据的组织、管理和存储格式, 目的是为了高效地访问和修改数据。 33 | 34 | 35 | 36 | 1. 线性结构 37 | 1. 数组 38 | 2. 链表 39 | 3. 栈 40 | 4. 队列 41 | 5. 哈希表 42 | 2. 树 43 | 1. 二叉树 44 | 2. 二叉堆 45 | 3. ... 46 | 3. 图,更加复杂,多对多的关联关系 47 | 4. 其他 48 | 1. 调表 49 | 2. 哈希链表 50 | 3. 位图 51 | 52 | 53 | 54 | #### 1.2 时间复杂度 55 | 56 | 57 | 58 | 衡量时间复杂度得刨去硬件影响,引入了`基本操作执行次数`这个概念。 59 | 60 | 61 | 62 | 设 T(n)为程序基本操作执行次数的函数(也可以认为是程序的相对执行时间函数),n 为输入规模。 63 | 64 | 65 | 66 | 常见的 4 种: 67 | 68 | - 线性的,例如 T(n) = 3n 69 | - 对数,T(n)=5$log_2{n}$ 70 | - 常数,T(n)=2 71 | - 多项式的,T(n) = 5$n^2$+0.5n 72 | 73 | 74 | 75 | 为了解决在 n 取不同值,相同算法可能有不同结果这个问题,引入了`渐进时间复杂度(asymptotic time complexity)` :==若在函数 f(n),使得当 n 趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称 f(n)是 T(n)的同数量级函数。记作 T(n)=O(f(n)) ,O 为算法的渐进时间复杂度,简称为*时间复杂度*。== 76 | 77 | 因为渐进时间复杂度用大写 O 来表示,所以也被称为`大 O 表示法`。 78 | 79 | 80 | 81 | 如何推导出时间复杂度呢?有如下几个原则; 82 | 83 | 1. `如果运行时间是常数量级,则用常数 1 表示`; 84 | 2. `只保留时间是函数中的最高阶项`; 85 | 3. `如果最高阶项存在,则省去最高阶项前面的系数`; 86 | 87 | 88 | 89 | 其实很简单,如果是常数则用 1,如果不是,则只保留最高阶项并去掉系数(当 n 无穷大时系数什么的的影响都可以被忽略)。 90 | 91 | 92 | 93 | #### 空间复杂度 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /geek-course/sjjgysfzm/05-array.md: -------------------------------------------------------------------------------- 1 | # 05 | 数组:为什么很多编程语言中数组都从0开始编号? 2 | 3 | ### 数组 4 | 5 | 6 | 7 | 数组(Array)是一种*线性表*数据结构。它用一组*连续的内存空间*,来存储一组具有*相同类型*的数据。 8 | 9 | 10 | 11 | 关键点:线性表、连续的内存空间、相同类型。 12 | 13 | 14 | 15 | *线性表*,最多只有前和后两个方向: 16 | 17 | - 数组 18 | - 队列 19 | - 栈 20 | - 链表 21 | 22 | ![img](http://ww3.sinaimg.cn/large/006tNc79ly1g52j5z6iqzj30vq0n5acy.jpg) 23 | 24 | 25 | 26 | 非线性表: 27 | 28 | - 树 29 | - 图 30 | - 堆 31 | 32 | ![img](http://ww2.sinaimg.cn/large/006tNc79ly1g52j91482zj30vq0k7q4w.jpg) 33 | 34 | 35 | 36 | ### 为什么从 0 开始编号呢? 37 | 38 | 39 | 40 | 从数组内存模型来看,数组的“下标”最确切的定义应该是“`偏移`”(offset)。 41 | 42 | 前面也讲到,如果用 a 来表示数组的首地址,a[0] 就是偏移为 0 的位置,也就是首地址,a[k] 就表示偏移 k 个 type_size 的位置,,所以计算 a[k] 的`内存地址`只需要用这个公式: 43 | 44 | ``` 45 | //从 0 开始 46 | a[k]_address = base_address + k * type_size 47 | //从 1 开始 (k-1)需要计算 48 | a[k]_address = base_address + (k-1)*type_size 49 | ``` 50 | 51 | 注:type_size 为类型的 size,比如 int 是 4 字节。 52 | 53 | 54 | 55 | 发现 index 从 1 开始的话,每次访问都会做一次减法计算,对于 CPU 来说就多一个减法指令,性能相对来说更差。 56 | 57 | 58 | 59 | 基础的数据结构性能要做到极致。 60 | 61 | 62 | 63 | 注:可能也是历史原因。 64 | 65 | 66 | 67 | ![img](http://ww3.sinaimg.cn/large/006tNc79ly1g52jstac99j30vq0g4jso.jpg) 68 | 69 | 内存块的首地址为 base_address = 1000。 70 | 71 | 72 | 73 | ### 数组的特点 74 | 75 | - 支持随机访问; 76 | - 删除、插入操作非常**低效**,因为要保证连续性,需要做大量数据搬移的工作,平均复杂度为 O(n); 77 | - 数组**适合查找操作**,根据下标随机访问查找复杂度为O(1),二分法查找(排好序)时间复杂度O(logn); 78 | - 需要预先指定大小,不能扩容; 79 | 80 | 81 | 82 | ### 数组相对容器更适用的场景 83 | 84 | 比如 ArrayList。 85 | 86 | 1. 关注性能或者跟基本类型配合:ArrayList 无法存储基本类型,需要使用包装类,包装拆装有一定性能损耗; 87 | 2. 数据大小已知,且操作简单的情况,不是非得用容器; 88 | 3. 多维数组,`Object[][]`更加直观; -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/TemplateMethod.md: -------------------------------------------------------------------------------- 1 | # 模板方法模式 2 | 3 | 模板方法模式: **在一个方法中定义一个算法的估价,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变方法结构的情况下,重新定义算法的某些步骤。** 4 | 5 | 6 | ![类图](http://ww4.sinaimg.cn/large/98900c07jw1f61gfmlicej20s40p2ae6.jpg) 7 | 8 | 9 | 具体来说: 10 | 11 | 创建一个算法的模板,这个模板其实就是第一个方法(需要定义为`final`)。而这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这样可以确保算法结构保持不变,同时由子类提供部分实现。 12 | 13 | 14 | 模板方法模式用来封装算法。 15 | 16 | 17 | ## Hook 18 | 19 | BONUS TIME! 20 | 21 | `hook()`(钩子)指那些 『默认不做事的方法』,子类可以视情况决定要不要覆盖它们。 22 | 23 | **钩子** 是 『一种被声明在抽象类中的方法,但只有空的或者默认的实现』。 24 | 25 | 钩子的存在,可以让子类有能力对算法的不同点就行挂钩。要不要挂钩,由子类自行决定。 26 | 27 | 其实Hook并不高端,在实际中有很多运用,比如在`BaseActivity`里配置一些东西的时候,留几个有默认返回值的方法做为某个功能的开关,比如:是否能侧滑返回等。 28 | 29 | 30 | ```java 31 | //... 32 | if(canSwipeBack()){ 33 | setupSwipeBack(); 34 | } 35 | //... 36 | protected boolean canSwipeBack(){ 37 | return true; 38 | } 39 | ``` 40 | 41 | ### Hook 的用法&目的 42 | 43 | 1. Hook可以让子类实现算法中的『可选』部分。 44 | 2. 让子类有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应。 45 | 3. 钩子也可以让子类有能力为其抽象类做一些决定。 46 | 47 | 48 | 49 | Java中数组的 `Arrays.sort([])` 方法就是模板方法。 50 | 51 | ## 要点 52 | 53 | 1. 模板方法定义了算法的步骤,把这些步骤的实现延迟到了子类。 54 | 2. 模板方法为我们提供了一种代码复用的重要技巧。 55 | 3. 模板方法的抽象类可以定义具体方法、抽象方法和钩子。 56 | 4. 抽象方法由子类实现。 57 | 5. 钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。 58 | 6. 为了防止子类改变模板方法中的算法,可以将模板方法声明为`final` 59 | 7. 好莱坞原则告诉我们,将决策权放在高层模块中,以便决定如何以及何时调用低层模块。 60 | 8. 你将在真实世界代码中看到模板方法模式的许多变体,不要期待它们全都是一眼就可以被你认出的。 61 | 9. 策略模式和模板模式都封装算法,一个用组合,一个用继承。 62 | 10. 工厂方法是模板方法的一个特殊版本。 63 | 64 | ## 小结 65 | 66 | 模板方法更侧重在『模板』二字,它需要做的是定义一个算法的『大纲』,它的子类去实现的是这个『大纲』里的几个步骤,算法的结构维持不变。 67 | 68 | 模板方法对算法的控制权更大一些,但是由于模板方法使用的是 继承,并且父类中有实现,所以子类会依赖父类中的实现,缺乏了点弹性。 69 | -------------------------------------------------------------------------------- /android/aac-paging.md: -------------------------------------------------------------------------------- 1 | # Paging 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | > The Paging Library helps you load and display small chunks of data at a time. Loading partial data on demand reduces usage of network bandwidth and system resources. 7 | 8 | 9 | 10 | Paging 库,顾名思义,是用来专门处理`分页`的,可以用来处理上拉加载。 11 | 12 | 13 | 14 | ### 添加依赖 15 | 16 | Android X : 17 | 18 | ```groovy 19 | dependencies { 20 | def paging_version = "2.1.0" 21 | 22 | implementation "androidx.paging:paging-runtime:$paging_version" // For Kotlin use paging-runtime-ktx 23 | 24 | // alternatively - without Android dependencies for testing 25 | testImplementation "androidx.paging:paging-common:$paging_version" // For Kotlin use paging-common-ktx 26 | 27 | // optional - RxJava support 28 | implementation "androidx.paging:paging-rxjava2:$paging_version" // For Kotlin use paging-rxjava2-ktx 29 | } 30 | ``` 31 | 32 | Pre-Android X : 33 | 34 | ```groovy 35 | dependencies { 36 | def paging_version = "1.0.1" 37 | 38 | implementation "android.arch.paging:runtime:$paging_version" 39 | 40 | // alternatively - without Android dependencies for testing 41 | testImplementation "android.arch.paging:common:$paging_version" 42 | 43 | // optional - RxJava support 44 | implementation "android.arch.paging:rxjava2:$paging_version" 45 | } 46 | ``` 47 | 48 | 49 | 50 | ### PagedList 51 | 52 | 53 | 54 | 得配合 LiveData Room 或者 RxJava2 。。 55 | 56 | 57 | 58 | ### PagedListAdapter 59 | 60 | 61 | 62 | ### 资料 63 | 64 | https://developer.android.com/topic/libraries/architecture/paging 65 | 66 | 依赖:https://developer.android.com/jetpack/androidx/releases/paging#pre-androidx_dependencies -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/self/MyArrayStack.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.self; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/15. 5 | *

6 | * 用数组实现栈 7 | */ 8 | public class MyArrayStack { 9 | 10 | private String[] items; 11 | private int n;//栈的大小 12 | private int count;//栈内元素的个数 13 | 14 | public MyArrayStack(int n) { 15 | this.items = new String[n]; 16 | this.n = n; 17 | } 18 | 19 | public boolean push(String value) { 20 | //栈满了 21 | if (count == n) { 22 | return false; 23 | } 24 | 25 | items[count] = value; 26 | count++; 27 | return true; 28 | } 29 | 30 | public String pop() { 31 | //栈空了 32 | if (count == 0) { 33 | return null; 34 | } 35 | 36 | String value = items[count - 1]; 37 | count--; 38 | return value; 39 | } 40 | 41 | @Override 42 | public String toString() { 43 | StringBuilder sb = new StringBuilder(); 44 | for (int i = 0; i < count; i++) { 45 | sb.append("," + i); 46 | } 47 | return sb.length() > 0 ? sb.substring(1) : ""; 48 | } 49 | 50 | public static void main(String[] args) { 51 | 52 | MyArrayStack myArrayStack = new MyArrayStack(5); 53 | 54 | for (int i = 0; i < 6; i++) { 55 | System.out.println(myArrayStack.push("" + i)); 56 | } 57 | 58 | System.out.println(myArrayStack); 59 | 60 | for (int i = 0; i < 7; i++) { 61 | System.out.println(myArrayStack.pop()); 62 | } 63 | System.out.println(myArrayStack); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/Proxy.md: -------------------------------------------------------------------------------- 1 | # 代理模式 2 | 3 | > 这一章节的内容较多,笔记比较乱,还是看书好些。 4 | 5 | 代理模式: **为另一个对象提供一个替身或占位符以控制对这个对象的访问。** 6 | 7 | 所谓代理(proxy),就是代表某个真实的对象。 8 | 9 | 代理要做的就是:**控制和管理访问(控制对象访问)** 10 | 11 | why? 是因为Client不知道如何和远程对象沟通。从某方面来看,远程代理控制访问,可以帮忙处理一些细节(比如网络,IPC)。 12 | 13 | ![类图](http://ww1.sinaimg.cn/large/98900c07jw1f62sqklu5rj20m80cegm9.jpg) 14 | (Subject可以是接口) 15 | 16 | 17 | 代理最主要的方法: 18 | 19 | **远程代理**(remote proxy),好比『远程对象的本地代表』;远程代理是 **一种对象,活在不同的Java虚拟机(JVM)堆中**(更一般的说法为,在不同 **地址空间运行的远程对象**) 20 | 21 | PS:在Android中的代理,如 Binder,处理不同进程间IPC,就是在不同的地址。 22 | 23 | 变体代理方法: 24 | 25 | 1. 远程代理 控制访问远程对象。 26 | 2. 虚拟代理控制访问创建开销大的资源(在必要的时候才创建对象,对象创建完了才委托给对象) 27 | 3. 保护代理基于权限控制对资源的访问。 28 | 29 | 本地代表,是一种可以由本地方法调用的对象,其行为会转发到远程对象中。 30 | 31 | 工作原理示意图: 32 | 33 | ![](http://ww3.sinaimg.cn/large/98900c07jw1f62uet9p85j20gt07l3zc.jpg) 34 | 35 | 书中提到了 `RMI` 技术,它将 客户辅助对象称为`stub`(桩),服务器辅助对象称为`skeleton`(g骨架)。 36 | 37 | BONUS: 38 | 39 | - 原语类型(primitive-原来常说的基本类型),传输过程允许的对象类型要注意,自己定义的类的对象需要实现Serializable(Java) 40 | - 当不需要传输的时候,用`transient`来修饰变量。 41 | 42 | 例子让我想起来Android中的 `AIDL`和`Binder`,忽然间懂了好多。 43 | 44 | ## 保护代理 45 | 46 | 可以在运行时动态地创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类。因为实际的代理类是在运行时创建的,我们称这个Java技术为:**动态代理**。大名鼎鼎的 `retrofit` 用的就是动态代理。 47 | 48 | 49 | 动态代理的UML: 50 | 51 | 52 | ![](http://ww3.sinaimg.cn/large/98900c07jw1f65z5ys3pwj20gz09adgm.jpg) 53 | 54 | ## 要点 55 | 56 | 1. 代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。 57 | 2. 远程代理管理客户和远程对象之间的交互。 58 | 3. 虚拟代理控制访问实例化对对象方法的访问。 59 | 4. 代理模式有许多变体,例如:缓存代理、同步代理、防火墙代理和写入时复制代理。 60 | 5. 代理在结构上类似装饰者,但是目的不同。 61 | 6. 装饰者模式为对象加上行为,而代理则是控制访问。 62 | 7. Java内置的代理支持,可以根据需要建立动态代理,并将所有调用分配到所选的处理器。 63 | 8. 就和其他的包装者(wrapper)一样,代理会造成你的设计中类的数目增加。 64 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/self/MyLinkedQueue.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.self; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/16. 5 | *

6 | * todo 7 | */ 8 | public class MyLinkedQueue { 9 | 10 | 11 | private Node head; 12 | private Node tail; 13 | 14 | private int size; 15 | 16 | public MyLinkedQueue() { 17 | } 18 | 19 | //入队 20 | public boolean enqueue(String value) { 21 | 22 | Node item = new Node(value); 23 | 24 | //空 25 | if (size == 0) { 26 | head = item; 27 | } else { 28 | tail.next = item; 29 | } 30 | tail = item; 31 | size++; 32 | 33 | return true; 34 | } 35 | 36 | //出队 37 | public String dequeue() { 38 | 39 | //空队列 40 | if (size == 0) { 41 | return null; 42 | } 43 | 44 | String value = head.value; 45 | //head 指向 next 46 | head = head.next; 47 | 48 | size--; 49 | 50 | return value; 51 | } 52 | 53 | public static void main(String[] args) { 54 | 55 | MyLinkedQueue queue = new MyLinkedQueue(); 56 | 57 | System.out.println(queue.dequeue());//null 58 | 59 | for (int i = 0; i < 6; i++) { 60 | System.out.println(queue.enqueue("" + i)); //6 true 61 | } 62 | 63 | for (int i = 0; i < 6; i++) { 64 | System.out.println(queue.dequeue());//0,1,2,3,5 65 | } 66 | 67 | 68 | for (int i = 0; i < 6; i++) { 69 | System.out.println(queue.enqueue("" + i)); //6 true 70 | } 71 | 72 | for (int i = 0; i < 6; i++) { 73 | System.out.println(queue.dequeue());//0,1,2,3,4,5 74 | } 75 | 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /books/图解Http/第2章-简单的HTTP协议.md: -------------------------------------------------------------------------------- 1 | # 第2章-简单的HTTP协议 2 | 3 | 对 HTTP 协议结构进行讲解。 4 | 5 | 6 | 7 | 8 | ## 客户端和服务端的通信 9 | 10 | 请求访问文本或图像等资源的一端称为**客户端**,而提供资源响应的一端称为**服务端**。 11 | 12 | **请求报文**由 请求方法、请求 URI、协议版本、可选的请求首部字段(headers)和内容实体(body)构成的。 13 | 14 | 图: 15 | 16 | 17 | 18 | 19 | **响应报文**基本上由 协议版本、状态吗、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。 20 | 21 | 图: 22 | 23 | 24 | 25 | 26 | ## HTTP 是不保存状态的协议 27 | 28 | 无状态 ,不保存之前发送过的请求或响应的功能。 29 | 30 | 更快处理大量事务,确保协议的可伸缩性,简单。 31 | 32 | 可以减少服务器的 CPU以及内存消耗。 33 | 34 | 35 | ## 告知服务器意图的 HTTP方法 36 | 37 | | 方法名 | 作用 | 38 | | :-----: | :---------: | 39 | | GET | 获取资源 | 40 | | POST | 传输实体主体 | 41 | | PUT | 传输文件 | 42 | | HEAD | 获得报文首部 | 43 | | DELETE | 删除文件 | 44 | | OPTIONS | 询问支持的方法 | 45 | | TRACE | 追踪路径 | 46 | | CONNECT | 要求用隧道协议连接代理(SSL+TLS) | 47 | 48 | POST 与 GET(也能传输实体的主体) 相似,但POST 的主要目的并不是获取响应的主体内容。 49 | 50 | 很多方法都不怎么用了,PUT DELETE 由于安全原因也不常用了,TRACE 由于容易引发 XST 攻击,就更不会用到了。 51 | 52 | 现在常用的,还是 GET与POST。 53 | 54 | ## 持久连接节省通信 55 | 56 | 由于 HTTP 最开始每次通信都需要重新链接/断开TCP,效率低,通信开销大,速度低。 57 | 58 | #### 持久连接 keep-alive 59 | 60 | 持久链接的特点是:只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。 61 | 62 | 好处:减少了 TCP 连接/断开的开销,减轻服务器负载,提升速度。 63 | 64 | 65 | #### 管线化 pipelining 66 | 67 | 以前发送请求后需要等待并收到响应,才能发送下一个请求。 68 | 69 | 管线化技术可以使得**不需等待就能发送下一个请求**,这样就能做到**并发发送多个请求**了。 70 | 71 | NOTE:**管线化比持久连接还要快**! 72 | 73 | 74 | ## 使用 Cookie 的状态管理 75 | 76 | HTTP 本身是无状态的,但是遇到一些功能,比如登录,那么保存登录状态就不需要每次都重新登录,就显得格外重要。 77 | 78 | 所以引入了 Cookie 技术。 79 | 80 | 服务端发送响应,带`Set-Cookie`的首部字段信息,客户端再次发送请求的时候在首部字段`Cookie`写入,传递给服务端。 -------------------------------------------------------------------------------- /ds/adt.md: -------------------------------------------------------------------------------- 1 | # 抽象数据类型 ADT 2 | 3 | [TOC] 4 | 5 | ### 什么是抽象数据类型? 6 | 7 | 8 | 9 | 抽象数据类型(Abstract Data Type,ADT)是计算机科学中`具有类似行为的特定类别的数据结构的数据模型`;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是间接定义的,通过其上的`可执行的操作`以及`这些操作的效果`的数学约束(与可能的代价)。 10 | 11 | 12 | 13 | 例如,抽象的[堆栈](https://zh.wikipedia.org/wiki/堆疊)(stack)由3个操作定义:推入`push`,弹出`pop`(接受约束:每次弹出返回的是最新被推入且没有被弹出的数据,也就是后进先出),查看堆栈顶端数据`peek`。当分析使用堆栈算法的效率,所有这3个操作用时相同,无论堆栈中包含多少项数据;并且对每项数据栈使用了常量大小的存储。 14 | 15 | 16 | 17 | 抽象数据类型(ADT)是`纯粹理论实体`,`用于简化描述抽象算法`,`分类与评价数据结构`,`形式描述程序设计语言`的`类型系统`。 18 | 19 | 20 | 21 | 一个 ADT 可以用特定数据类型或数据结构实现,在许多程序设计语言中有许多种实现方式;或者用形式规范语言描述。ADT常实现为模块(module):模块的接口声明了对应于ADT操作的例程(procedure),有时用注释描述了约束。 22 | 23 | 24 | 25 | ### 常见的抽象数据类型 26 | 27 | 28 | 29 | - 关联数组 30 | - 复数 31 | - 容器 32 | - 双端队列 33 | - 列表 34 | - Multimap 35 | - 优先队列 36 | - 队列 37 | - 集合 38 | - 堆栈 39 | - 字符串 40 | - 树 41 | 42 | 43 | 44 | ### 接口和实现的分离 45 | 46 | 47 | 48 | 实现于程序时,`抽象数据类型只显现出其接口`,并`将实现加以隐藏`。用户只需关心它的接口,而不是如何实现。未来更可以改变实现的方式。 49 | 50 | 51 | 52 | **抽象数据类型的强处在于对用户隐藏了实现细节,仅公开其接口。这表示抽象数据类型可以用各种方法来实现,只要遵循其接口,就不会影响到用户**。 53 | 54 | 55 | 56 | 在抽象数据类型和数据结构之间,有一个实现上的`微妙差别`。例如,列表的抽象数据类型可以数组为基础、或者使用链表来实现。列表即是一种具良好运算(加入元素、移除元素等等)定义的抽象数据类型。链表是以指针为基础的数据结构,且可用来创建一个列表。链表常用于列表的抽象数据类型。 57 | 58 | 59 | 60 | 同样地,二叉树搜索法的抽象数据结构可以几个方式实现:二叉树、AVL树、红黑树、数组等等。且无须关心其实现,二叉树搜索法总是有相同的运算(插入、移除、查找等等)。 61 | 62 | 63 | 64 | 在面向对象的用语中,抽象数据类型相当于类别;抽象数据类型的实体就相当于对象。某些语言包含了用于宣告抽象数据类型的构造函数。例如,C++ 和 Java 为此提供了类的构造函数。 65 | 66 | 67 | 68 | ### 总结 69 | 70 | 71 | 72 | ADT 不是 数据结构,它们是有差异的。ADT 是更加抽象的一层,一种模型的定义,而各种数据结构基于它来实现。按 Java 是思路来理解,ADT 就是各种定义了操作的接口类,被各种数据结构具体类实现,从而只暴露了公开的接口,隐藏了实现细节。例如,一个具体的数据结构它可以是用数组来实现,也可以用链表来实现,但是它们的抽象数据类型是一样的。 73 | 74 | List(l列表) -> LinkedList (基于链表), ArrayList(基于数组) 75 | 76 | ### 资料 77 | 78 | https://zh.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E8%B3%87%E6%96%99%E5%9E%8B%E5%88%A5 79 | 80 | -------------------------------------------------------------------------------- /android/popupmenu.md: -------------------------------------------------------------------------------- 1 | # PopupMenu 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | > A PopupMenu displays a `Menu` in a modal popup window anchored to a `View`. The popup will appear below the anchor view if there is room, or above it if there is not. If the IME is visible the popup will not overlap it until it is touched. Touching outside of the popup will dismiss it. 6 | 7 | 8 | 9 | PopupMenu 可以以某个 View 为锚点,展示一个菜单栏。 10 | 11 | 12 | 13 | 会根据锚点、Gravity 以及空间展示,并且点击外部会消失。 14 | 15 | 16 | 17 | ### 基础使用教程 18 | 19 | 20 | 21 | 使用步骤: 22 | 23 | 1. `res`目录下 新建 menu 目录 24 | 2. `menu`目录下新建 foo.xml 25 | 3. 构建 PopupMenu,加载菜单 26 | 4. 设置监听 27 | 5. show() 展示 28 | 29 | 30 | 31 | ```xml 32 | 33 |

34 | 35 | 36 | 37 | ``` 38 | 39 | 40 | 41 | ```java 42 | PopupMenu menu = new PopupMenu(this, more, Gravity.BOTTOM); 43 | menu.inflate(R.menu.foo); 44 | menu.setOnMenuItemClickListener(new OnMenuItemClickListener() { 45 | @Override 46 | public boolean onMenuItemClick(final MenuItem menuItem) { 47 | if (menuItem.getItemId() == R.id.report) { 48 | Toast.makeText(MainActivity.this,"Report", Toast.LENGTH_SHORT).show(); 49 | } 50 | return false; 51 | } 52 | }); 53 | menu.show(); 54 | ``` 55 | 56 | 57 | 58 | ### 拖拽(drag-to-open) 59 | 60 | 61 | 62 | ```java 63 | PopupMenu myPopup = new PopupMenu(context, myAnchor); 64 | myAnchor.setOnTouchListener(myPopup.getDragToOpenListener()); 65 | ``` 66 | 67 | 68 | 69 | 可以实现拖拽 anchor 弹出菜单。 70 | 71 | 72 | 73 | ### 修改背景颜色 74 | 75 | 76 | 77 | 修改背景色需要设置主题。 78 | 79 | 80 | 81 | ### 内部原理 82 | 83 | 84 | 85 | 实际上 PopupMenu 的实现依赖于Window(MenuPopupWindow 等) -------------------------------------------------------------------------------- /books/AndroidArt/第15章-Android性能优化.md: -------------------------------------------------------------------------------- 1 | # 第15章-Android性能优化 2 | 3 | Android性能优化主要包括布局优化、绘制优化、内存泄露优化、响应速度优化、ListView优化、Bitmap优化、线程优化以及一些优化建议. 4 | 5 | 实际上每个面都可以扩展很多,书中讲的不太多(篇幅少),需要在实际中多去运用. 6 | 7 | 后面还有MAT的基本使用,我没记,可以去搜,资料不少~ 8 | 9 | ## 布局优化 10 | 11 | 1. 减少布局文件的层级(测量/布局/绘制的时间减少):可以使用RelativeLayout来减少嵌套,从而达到减少层级的目的,另外在**相同层级**的情况下使用LinearLayout(相比于RelativeLayout更高效) 12 | 2. 使用`include`标签复用,`merge`标签降低层级,`ViewStub`来实现懒加载,另外补充一个`Space`可以用来占位 13 | 14 | ## 绘制优化(onDraw) 15 | 16 | 主要是避免执行大量的操作. 17 | 18 | 1. 不要创建新的局部对象,因为onDraw可能会被频繁调用,会在一瞬间产生大量的临时对象,会**导致占用过多内存,系统更加频繁的gc,降低执行效率** 19 | 2. 不要做耗时的任务 20 | 21 | ## 内存泄露优化 22 | 23 | 其实内存泄露有很多种情况,但是书中列举的比较少 24 | 25 | 1. 静态变量导致的内存泄露(比如静态的context,静态的view) 26 | 2. 单例模式持有Activity 27 | 3. 属性动画(repeatCount为无限模式) 28 | 29 | ## ListView和Bitmap优化 30 | 31 | ListView使用viewholder模式,Bitmap在12章有讲,这里不重复. 32 | 33 | 34 | ## 线程优化 35 | 36 | 主要是采用线程池(11章有讲) 37 | 38 | 1. 避免存在大量的Thread 39 | 2. 重用Thread,避免线程创建和销毁所带来的开销 40 | 3. 线程池还能控制最大并发数,避免大量线程因互相抢占系统资源从而导致阻塞 41 | 42 | ## 其他的一些性能优化建议 43 | 44 | 1. 避免创建过多的对象 45 | 2. 不要过多使用枚举(枚举占用的内存空间要比整型的大) 46 | 3. 常量使用 `static final`来修饰 47 | 4. 使用一些Android特有的数据结构,比如`SparseArray`和`Pair`等,它们都具有更好的性能(注:减少了自动装箱和拆箱的消耗) 48 | 5. 适当使用软引用和弱引用 49 | 6. 尽量采用静态内部类(不会持有外部类的实例) 50 | 51 | ## 提高可维护性 52 | 53 | 1. 命名规范 54 | 2. 代码排版 55 | 3. 给非常关键的代码写注释 56 | 4. 代码要有层次性,可扩展 57 | 58 | 59 | ## 其他的资料推荐 60 | 61 | [10-ways-to-improve-your-android-app](http://www.slideshare.net/seamaster29/10-ways-to-improve-your-android-app) 62 | [Android性能优化典范 - 第4季](http://hukai.me/android-performance-patterns-season-4/) 63 | [Android性能优化典范 - 第3季](http://hukai.me/android-performance-patterns-season-3/) 64 | [Android性能优化典范 - 第2季](http://hukai.me/android-performance-patterns-season-2/) 65 | [Android性能优化典范 - 第1季](http://hukai.me/android-performance-patterns/) 66 | 67 | 68 | -------------------------------------------------------------------------------- /ds/hashtable.md: -------------------------------------------------------------------------------- 1 | # 散列表 Hashtable 2 | 3 | [TOC] 4 | 5 | ### 什么是散列表? 6 | 7 | 8 | 9 | 散列表(Hash table,也叫哈希表),是根据`键`(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找数据。 10 | 11 | 这个*映射函数称*作`散列函数`,`存放记录的数组称作散列表`。 12 | 13 | 14 | 15 | 就像我们的通讯录、字典那样,按照首字母作为关键字,并创建一个列表,这样通过首字母查找就方便多了。 16 | 17 | 18 | 19 | #### 基本概念 20 | 21 | - 若关键字为 k,则其值存放在 f(k)的存储位置上,这对应关系 f 称为`散列函数`,按这个思想建立的表为`散列表` 22 | - 不同关键字可能会获得同一个散列地址,这样的现象称为`冲突`(collision)。具有相同函数值的关键字对散列函数来说是同义词。 23 | - 根据散列函数f(k)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“[像](https://zh.wikipedia.org/wiki/像_(數學))”作为记录在表中的存储位置,这种表便称为**散列表**,这一映射过程称为[散列造表](https://zh.wikipedia.org/wiki/散列)或[散列](https://zh.wikipedia.org/wiki/散列),所得的存储位置称[散列地址](https://zh.wikipedia.org/w/index.php?title=散列地址&action=edit&redlink=1)。 24 | 25 | 26 | 27 | 所以 28 | 29 | 30 | 31 | ### 散列函数 32 | 33 | 34 | 35 | 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快定位。 36 | 37 | 1. 直接定址法 38 | 2. 数字分析法 39 | 3. 平方取中法 40 | 4. 折叠法 41 | 5. 随机数法 42 | 6. 除留余数法 43 | 44 | 45 | 46 | Java 中的 `hashCode()`方法就是散列函数。 47 | 48 | 49 | 50 | ### 处理冲突 51 | 52 | 53 | 54 | 不管用什么散列函数,不发生冲突的可能性是非常小的,所以需要对冲突进行处理。 55 | 56 | 常用方法有一下几种: 57 | 58 | 59 | 60 | 1. `开放定址法`, 61 | 2. `单独链表法`,将散列到同一个存储位置的所有元素保存在一个链表中,它还有个很难听的名字“拉链法”。 62 | 3. `双散列`, 63 | 4. `再散列`,在上次散列计算发生冲突时,利用该次冲突的散列函数地址产生新的散列函数地址,直到冲突不再发生,这种方法不易产生“[聚集](https://zh.wikipedia.org/wiki/聚集)”(Cluster),但增加了计算时间。 64 | 5. 建立一个公共溢出区 65 | 66 | 67 | 68 | [聚集](https://zh.wikipedia.org/wiki/聚集)(Cluster,也翻译做“堆积”)的意思是,在函数地址的表中,散列函数的结果`不均匀地`占据表的单元,形成`区块,`造成线性探测产生一次聚集(primary clustering)和平方探测的二次聚集(secondary clustering),散列到区块中的任何关键字需要查找多次试选单元才能插入表中,解决冲突,造成时间浪费。对于开放定址法,聚集会造成性能的灾难性损失,是必须避免的。 69 | 70 | 71 | 72 | Java 中的 HashMap 早期就是用的 单独链表法,Java8 后会有个链表转红黑树的操作。 73 | 74 | 75 | 76 | ### 资料 77 | 78 | https://zh.wikipedia.org/wiki/%E5%93%88%E5%B8%8C%E8%A1%A8 79 | 80 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/self/MyArrayCircularQueue.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.self; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/16. 5 | *

6 | * 7 | * 目前的实现会让费一个位置。 8 | */ 9 | public class MyArrayCircularQueue { 10 | 11 | 12 | private String[] items; 13 | 14 | private int size; 15 | 16 | private int head; 17 | private int tail; 18 | 19 | public MyArrayCircularQueue(int capacity) { 20 | this.size = capacity; 21 | items = new String[capacity]; 22 | } 23 | 24 | public boolean enqueue(String value) { 25 | 26 | //队列满了 27 | if ((tail + 1) % size == head) { 28 | return false; 29 | } 30 | 31 | items[tail] = value; 32 | 33 | tail = (tail + 1) % size; 34 | 35 | return true; 36 | } 37 | 38 | public String dequeue() { 39 | 40 | if (tail==head){ 41 | return null; 42 | } 43 | 44 | String value = items[head]; 45 | head = (head+1)%size; 46 | return value; 47 | } 48 | 49 | 50 | public static void main(String[] args) { 51 | 52 | MyArrayCircularQueue queue = new MyArrayCircularQueue(5); 53 | 54 | System.out.println(queue.dequeue());//null 55 | 56 | for (int i = 0; i < 6; i++) { 57 | System.out.println(queue.enqueue("" + i)); //4 true 2 false 58 | } 59 | 60 | for (int i = 0; i < 6; i++) { 61 | System.out.println(queue.dequeue());//0,1,2,3,null,null 62 | } 63 | 64 | 65 | for (int i = 0; i < 6; i++) { 66 | System.out.println(queue.enqueue("" + i)); //4 true 2 false 67 | } 68 | 69 | for (int i = 0; i < 6; i++) { 70 | System.out.println(queue.dequeue());//0,1,2,3,null,null 71 | } 72 | } 73 | } 74 | 75 | -------------------------------------------------------------------------------- /android/fragment.md: -------------------------------------------------------------------------------- 1 | # Fragment 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | ### 概述 7 | 8 | 9 | 10 | Android 在 Android 3.0(API 级别 11)中引入了 Fragment,主要是为了给大屏幕(如平板电脑)上更加动态和灵活的 UI 设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换 UI 组件的空间更大。利用片段实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成片段,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。 11 | 12 | 13 | 14 | #### 静态添加 15 | 16 | 17 | 18 | 静态添加:在 layout 文件中添加 fragment ,在运行中不能修改。 19 | 20 | 21 | 22 | 例子: 23 | 24 | ```xml 25 | 31 | ``` 32 | 33 | 34 | 35 | 注意事项: 36 | 37 | - fragment 需要一定*唯一*的 id,方法有三: 38 | - 指定 `android:id` 属性 39 | - 指定 `android:tag` 属性 40 | - 如果上述两个都没有用,则需要给 parent 设置 id,否则会报错 `Must specify unique android:id , android:tag, or have a parent with an id .` 41 | 42 | - `android:name`:name 指定 Fragment 全限定的名称。 43 | 44 | 45 | 46 | #### 动态添加 47 | 48 | 49 | 50 | 可以在运行时通过 FragmentTransaction API 添加到 Activity。 51 | 52 | 53 | 54 | ```java 55 | FragmentManager fragmentManager = getFragmentManager(); 56 | FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 57 | ExampleFragment fragment = new ExampleFragment(); 58 | fragmentTransaction.add(R.id.fragment_container, fragment); 59 | fragmentTransaction.commit(); 60 | ``` 61 | 62 | 63 | 64 | #### 添加没有 UI 的 Fragment 65 | 66 | 可以通过 `add(Fragment,String)`方法添加 non-ui fragment。 67 | 68 | 这样的 fragment 可以用作工作线程,也可以有类似 Lifecycle、ViewModel 那种妙用。 69 | 70 | 71 | 72 | Non-ui fragment 不会回调`onCreateView` 。 73 | 74 | ### 资料 75 | 76 | https://developer.android.com/guide/components/fragments?hl=zh-CN 77 | 78 | https://developer.android.com/reference/android/app/Fragment 79 | 80 | https://luboganev.dev/blog/headless-fragments/ -------------------------------------------------------------------------------- /ds/tree.md: -------------------------------------------------------------------------------- 1 | # 树 Tree 2 | 3 | [TOC] 4 | 5 | ### 什么是树? 6 | 7 | 8 | 9 | 树,在计算机科学中是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。 10 | 11 | 12 | 13 | 它是由n(n>0)个有限节点组成一个具有层次关系的[集合](https://zh.wikipedia.org/wiki/集合)。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 14 | 15 | 1. 每个节点都只有有限个子节点或无子节点; 16 | 2. 没有父节点的节点称为*`根节点`*; 17 | 3. 每一个非根节点有且只有一个父节点; 18 | 4. 除了根节点之外,每个子节点可以分为多个不相交的子树; 19 | 5. 树里面没有环路(cycle) 20 | 21 | ![img](https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Treedatastructure.png/300px-Treedatastructure.png) 22 | 23 | 24 | 25 | #### 有关树的概念 26 | 27 | 28 | 29 | 要搞懂树,得先搞懂它的概念。 30 | 31 | 32 | 33 | - `节点的度`:一个节点含有的子树的个数称为该节点的度; 34 | 35 | - `树的度`:一棵树中,最大的节点度称为树的度; 36 | 37 | - `叶节点`或`终端节点`:度为零的节点; 38 | 39 | - `非终端节点`或`分支节点`:度不为零的节点; 40 | 41 | - `父亲节点`或`父节点`:若一个节点含有子节点,则这个节点称为其子节点的父节点; 42 | 43 | - `孩子节点`或`子节点`:一个节点含有的子树的根节点称为该节点的子节点; 44 | 45 | - `兄弟节点`:具有相同父节点的节点互称为兄弟节点; 46 | 47 | - 节点的`层次`:从根开始定义起,跟为第 1 层,跟的子节点为第 2 层,以此类推; 48 | 49 | - `深度`:对于任意节点 n,n 的深度为从根到 n 的唯一路径长,根的深度为 0; 50 | 51 | - `堂兄弟节点`:父节点在同一层节点互为堂兄弟; 52 | 53 | - `节点的祖先`:从根到该节点所经分支上的所有节点; 54 | 55 | - `子孙`:以某节点为根的子树中任一节点都称为该节点的子孙; 56 | 57 | - `森林`:由m(m>0)课互不相交的树的集合称为森林; 58 | 59 | 60 | 61 | 62 | 63 | ### 树的分类 64 | 65 | 66 | 67 | 树有很多种。 68 | 69 | 70 | 71 | - `有序树`:树中任意节点的子节点之间`没有顺序关系`,这种树称为无序树,也称为`自由树`; 72 | - `无序树`:树中任意节点的子节点之间`有顺序关系`,称为有序树; 73 | - `二叉树`:每个节点最多含有两个子树的树称为二叉树; 74 | - `完全二叉树`:对于一颗二叉树,假设其深度为 d(d>1)。除了第 d 层外,其它各层的节点数目均已达最大值,且第 d 层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树; 75 | - `满二叉树`:所有叶节点都在最底层的完全二叉树; 76 | - `平衡二叉树`(AVL树):当且仅当任何节点的两棵子树的高度差不大于 1 的二叉树; 77 | - `排序二叉树`(二叉查找树,Binary Search Tree),也称`二叉查找树`、有序二叉树; 78 | - `哈夫曼树`:带权路径最短的二叉树称为哈夫曼树或最优二叉树; 79 | - `B 树`:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多于两个子树。 80 | 81 | 82 | 83 | ![image-20190829172231211](https://tva1.sinaimg.cn/large/006y8mN6ly1g6go8uq7dmj31wo0i6qoj.jpg) 84 | 85 | WTF。。。 86 | 87 | -------------------------------------------------------------------------------- /books/App研发录/README.md: -------------------------------------------------------------------------------- 1 | # App研发录 2 | 3 | 书的title都取得很高端,但是内容比较一般,特别是讲开发的,知识点分散,又不具体,不深入,差不多就是告诉你有XX东西,很有必要,但是又不教你怎么去做,所以几乎等于没讲啊。(很失望)作者可能在开发领域有挺长的时间,积累了很多开发和管理经验,但是这书的内容不太行,我表示很失望.(针对Android方面,针对个人而言) 4 | 5 | 这里记录一些 **我还觉得还算有用的** 知识点. 6 | 7 | ## 高效App框架设计与重构 8 | 9 | 0. 自定义一些基类(如BaseActivity) 10 | 1. 采取一定的方式在客户端模拟API返回数据,用于测试 11 | 2. 启用Cookie 12 | 3. Http数据要加密 13 | 2. 公共参数可以存放到Header里 14 | 3. 时间校准(返回服务器时间与本地时间比较(非常有必要)) 15 | 4. HTTP请求开启**gzip压缩**来减少传输量(省流量,加快速度),如果用Okhttp,gzip挺简单的,不过需要服务端的支持 16 | 5. 根据网络状况去下载不同尺寸的图片 17 | 6. 急速模式(比如不显示图片,提供开关) 18 | 7. 城市列表**增量更新**(本地保留版本号,与服务器对照,下发需要修改的数据,CURD进行操作) 19 | 8. H5跳转Activity,可以传递一个String,按照约定的协议去解析,再跳转(一般传递Activity的全称,再 key-value来传递参数) 20 | 9. 命名规范和代码规范(我推荐checkstyle) 21 | 22 | ## App开发中的高级技巧 23 | 24 | 同上一章节,关于Crash竟然没写Android具体应该怎么做,却写了一堆数据库代码,真是醉了~ 25 | 然后分析Crash,没什么软用,crash什么的碰到一次,你就知道了,提前看也没什么作用,而且,很多作者自己也根本没弄懂,呵呵. 26 | 27 | 持续集成章节基于Eclipse,Ant,这能看?(反正我是不用Eclipse也不用Ant的直接跳过了) 28 | 单元测试差不多就是讲了有这么东西,然而并不教你怎么做. 29 | 30 | 诶~忍不住又吐槽了~ 31 | 32 | 1. 通过实现**UncaughtExceptionHandler**去捕获异常 33 | 2. 异常分析时出现**Unknown Source**,丢失了文件名和行号,这比较蛋疼,可以在ProGuard文件中增加`-keepattributes SourceFile,LineNumberTable`(umong分析是上传mapping文件,这个方法还有待验证,扩展阅读->[bugly](http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=244) and [精神哥](http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=26)) 34 | 35 | 36 | ## App竞品技术分析 37 | 38 | 39 | 利用 **AXMLPrinter2.jar**可以还原被压缩过后的xml (这个对反编译有帮助,暂时还没有尝试) 40 | ``` 41 | java -jar AXMLPrinter2.jar AndroidManifest.xml 42 | ``` 43 | 44 | 0. 获取最佳服务器 45 | 1. 数据采集 46 | 2. ABTest 47 | 3. Android打包META-INF目录的妙用 48 | 4. 拆分classes.dex 49 | 5. 模块化 热修复 插件化 50 | 51 | ## 项目管理和团队建设 52 | 53 | 这章我差不多就浏览了一遍,内容很日常化,也就不想多记录什么了,自有体会. 54 | 55 | 1. 不能没有测试团队(赞同!我司没有,深感痛苦 自测测出的bug很少,而且会占用开发大量的时间) 56 | 2. 模块化分工 57 | 3. 每天例会 58 | 4. ... 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /books/kotlin-in-action.md: -------------------------------------------------------------------------------- 1 | # 《Kotlin 实战》 2 | 3 | > Kotlin in Action 4 | 5 | 6 | 7 | 8 | 9 | 本书分两部分, 10 | 11 | 1. Kotlin 简介,1~6 章,介绍 Kotlin 的 API 和特性;以及 Java 概念到 Kotlin 的映射; 12 | 2. 拥抱 Kotlin,7~11 章 13 | 14 | 15 | 16 | ## 1 Kotlin:定义和目的 17 | 18 | 19 | 20 | 简洁、安全、务实,与 Java 互操作性。可以写服务器端开发、Android 开发 21 | 22 | 23 | 24 | Elvis 运算符(`?:`) 25 | 26 | 27 | 28 | ### **1.2 Kotlin 主要特征**: 29 | 30 | 31 | 32 | 1. 目标后端、Android 以及任何运行 Java 的地方 33 | 2. **静态类型**,所有表达式在编译期已经确定,静态类型的好处: 34 | 1. **性能**——方法调用速度更快,因为不需要在运行时才来判断调用的是哪个方法; 35 | 2. **可靠性**——编译器验证了程序的正确性,因而运行时崩溃的概率更低; 36 | 3. **可维护性**——陌生的代码更容易维护,因为你可以看到代码中用到的对象的类型; 37 | 4. **工具支持**——静态类型使 IDE 能提供可靠的重构、精确的代码补全以及其他特性 38 | 3. 函数式和面向对象 39 | 4. 免费并开源 40 | 41 | 42 | 43 | kotlin 支持**类型推导**,不需要显式地申明类型,因此大部分静态类型冗长的代码就不复存在了; 44 | 45 | 46 | 47 | 48 | 49 | **函数式和面向对象** 50 | 51 | 函数式编程的核心概念: 52 | 53 | 1. **头等函数**——把函数(一小段行为)当做值使用,可以用变量保存它,把它当做参数传递,或者当做其他函数的返回值; 54 | 2. **不可变性**——使用不可变对象,这保证了它们的状态在其创建之后不能再变化; 55 | 3. **无副作用**——使用的是纯函数。 56 | 57 | 58 | 59 | **函数式编程的好处**: 60 | 61 | 1. **简洁**,函数式风格的代码比相应的命令式风格的代码更加优雅、更简练,因为把函数当做值可以获得更强大的抽象能力,从而避免重复代码; 62 | 2. **多线程安全**,不可变数据结构+纯函数,能保证多线程安全; 63 | 64 | 65 | 66 | Kotlin 支持函数式编程风格,包括: 67 | 68 | 1. **函数类型**,允许函数接受其他函数作为参数,或者返回其他函数; 69 | 2. **lambda表达式**,让你用最少的样板代码方便地传递代码块; 70 | 3. **数据类**,提供了创建不可变值对象的简明语法; 71 | 4. 标准库中包含了丰富的 API 集合,让你用函数式编程风格操作对象和集合; 72 | 73 | 74 | 75 | ## 2 Kotlin 基础 76 | 77 | 78 | 79 | ## 3 函数的定义与调用 80 | 81 | 82 | 83 | 84 | 85 | ## 4 类、对象和接口 86 | 87 | 88 | 89 | 90 | 91 | ## 5 Lambda 编程 92 | 93 | 94 | 95 | ## 6 Kotlin 的类型系统 96 | 97 | 98 | 99 | 100 | 101 | ## 7 运算符重载及其他约定 102 | 103 | 104 | 105 | 106 | 107 | ## 8 高阶函数:Lambda 作为形参和返回值 108 | 109 | 110 | 111 | 112 | 113 | ## 9 泛型 114 | 115 | 116 | 117 | 118 | 119 | ## 10 注解与反射 120 | 121 | 122 | 123 | 124 | 125 | ## 11 DSL 构建 -------------------------------------------------------------------------------- /android/asynctask.md: -------------------------------------------------------------------------------- 1 | # AsyncTask 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | > AsyncTask enables proper and easy use of the UI thread. This class allows you 7 | > to perform background operations and publish results on the UI thread without 8 | > having to manipulate threads and/or handlers. 9 | > 10 | > AsyncTask is designed to be a helper class around {@link Thread} and {@link Handler} 11 | > and does not constitute a generic threading framework. AsyncTasks should ideally be 12 | > used for short operations (a few seconds at the most.) If you need to keep threads 13 | > running for long periods of time, it is highly recommended you use the various APIs 14 | > provided by the java.util.concurrent package such as {@link Executor}, 15 | > {@link ThreadPoolExecutor} and {@link FutureTask}. 16 | 17 | 18 | 19 | AsyncTask ,抽象类, 被设计用于那些 **短时间(几秒)的异步操作拿到结果后需要反馈给UI 线程**的场景。 20 | 21 | 22 | 23 | 如果需要长时间的跑线程的话就不合适。 24 | 25 | 26 | 27 | ### AsyncTask 的常用方法 28 | 29 | 30 | 31 | - `doInBackground(Params)`,异步执行任务时调用,并且接受参数,与Thread的run方法类似,**与其他方法不同的是, 这个方法必须要重写**(抽象方法); 32 | - `onPreExecute` ,在任务开始之前调用,通常可以用来做初始化参数,或者判断网络是否连接; 33 | - `onProgressUpdate`, 在doInBackground中调用publishProgress()触发; 34 | - `onPostExecute` ,doInBackground方法执行完成之后会调用,并接受Result; 35 | - `onCancelled(Result)` ,任务被取消时候调用 36 | - `onCancelled()`, 同上 37 | 38 | 39 | 40 | 一般情况下 AsyncTask 方法的执行顺序是: 41 | 42 | onPreExecute —> doInBackground —> onProgressUpdate —> onPostExecute 43 | 44 | 它们也被称为是 **四大步骤**。 45 | 46 | 47 | 48 | ### 知识点汇总 49 | 50 | 51 | 52 | 1. AsyncTask 只能在主线程创建,因为它内部需要一个运行在主线程的 Handler,这需要主线程的 Looper; 53 | 2. AsyncTask 只能在主线程执行,并且不能被执行两次; 54 | 3. AsyncTask 中只有 `doingBackground`方法是在异步线程执行,其他的都是在主线程; 55 | 4. `AsyncTask.cancel(mayInterruptIfRunning)` 方法调用后并不能直接立即取消,而只是设置了个标记位而已,需要自己配合`isCancelled()`方法使用; 56 | 5. 取消后的 AsyncTask 会回调 `onCancelled(Object)`而不是 `onPostExecute(Object)`; 57 | 6. `推荐配合线程池使用`,因为*某些版本的 AsyncTask 任务是串行的*,一个一个按排序执行,并不支持并发; 58 | 7. AsyncTask 需要是静态内部类型,因为有内存泄露的风险,不要保存 context; -------------------------------------------------------------------------------- /android/google-io-2019.md: -------------------------------------------------------------------------------- 1 | # Google IO 2019 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | [TOC] 6 | 7 | ### ViewBinding 8 | 9 | image-20190909121001851 10 | 11 | 12 | 13 | AS 3.6 会上。 14 | 15 | 16 | 17 | ### Lifecycles 18 | 19 | A way to observe lifecycle events of Fragments and Activities. 20 | 21 | ViewModel- state retained across config changes. 22 | 23 | LiveData - lifecycle-aware observable 24 | 25 | 26 | 27 | 28 | 29 | #### **ViewModel & Saved State** 30 | 31 | 32 | 33 | **Saved State** 34 | 35 | ![image-20190909121059996](https://tva1.sinaimg.cn/large/006y8mN6ly1g6t5240vmtj30re0j0dkw.jpg) 36 | 37 | 38 | 39 | **ViewModel** 40 | 41 | ![image-20190909120558552](https://tva1.sinaimg.cn/large/006y8mN6ly1g6t4wvtom9j319k0fq0yx.jpg) 42 | 43 | 44 | 45 | 两者对比 46 | 47 | ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g6t8gagv5fj312g0cm75u.jpg) 48 | 49 | 50 | 51 | 52 | 53 | ViewModel 跟 SavedState 并不是对立的,两者作用不一样。 54 | 55 | 56 | 57 | 58 | 59 | ### WorkManager 60 | 61 | WorkManager is a background processing library for work that is specifically deferrable,meaning that it doesn't have to be executed right away. 62 | 63 | 64 | 65 | - deferrable 66 | - persistent 67 | - constraint-based 68 | - Backwards compatible 69 | 70 | 71 | 72 | ### Room 73 | 74 | Room is SQLite object mapping library. 75 | 76 | 77 | 78 | 协程支持 79 | 80 | 81 | 82 | ### Paging 83 | 84 | 85 | 86 | Paging is a library to load large lists into RecyclerView lazily. 87 | 88 | 89 | 90 | Error handling... 91 | 92 | 93 | 94 | ### Navigation 95 | 96 | A library to manager in app UI flows. 97 | 98 | 99 | 100 | 101 | 102 | Arch Components 103 | 104 | ### Ref 105 | 106 | [What's New in Architecture Components (Google I/O'19)](https://www.youtube.com/watch?v=Qxj2eBmXLHg&feature=youtu.be) 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/FactoryMethod.md: -------------------------------------------------------------------------------- 1 | # 工厂模式 2 | 3 | 工厂模式分两种模式: 4 | 5 | 1. 工厂方法 6 | 2. 抽象工厂 7 | 8 | 9 | ## 简单工厂 10 | 11 | 使用`new Xxx()`创建对象非常脆弱,缺乏弹性,耦合度高。 12 | 13 | ![](http://ww1.sinaimg.cn/large/98900c07jw1f5zcr70c9ij206u04d3yi.jpg) 14 | 15 | 当具体类需要新增或删除的时候,就必须修改这段代码,非常容易出错,难以维护和更新。 16 | 17 | 所以需要把创建对象的方法封装起来,用“工厂”来负责创建对象。 18 | 19 | 定义Factory: 20 | ![](http://ww3.sinaimg.cn/large/98900c07jw1f5zd1wwkihj208r062dg5.jpg) 21 | 22 | 使用: 23 | 24 | ![](http://ww4.sinaimg.cn/large/98900c07jw1f5zd2n94izj208o072dgd.jpg) 25 | 26 | 27 | 看起来可能只是把代码挪到了另外一个地方,但是其实有不少好处。 28 | 29 | ### 好处 30 | 1. 避免代码重复,可复用,也可服务多个对象 31 | 2. 降低耦合度,增加弹性 32 | 3. 便于维护 33 | 34 | NOTE:它跟静态方法的差别是,静态方法不需要实例化,并且它不能通过继承来改变创建方法的行为。 35 | 36 | oh,另外,其实简单工厂并不是设计模式。 37 | 38 | ## 工厂方法 39 | 40 | 工厂方法模式(FactoryMethod)定义了**一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。** 41 | 42 | 工厂方法通过**让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的 43 | **,所以工厂方法是 **继承,覆盖方法来实现** 44 | 45 | 通常工厂方法模板是这样的: 46 | 47 | ``` 48 | // 返回对象和入参根据实际情况定 49 | abstract Product factoryMethod(String type); 50 | ``` 51 | 52 | 53 | ![](http://ww3.sinaimg.cn/large/98900c07jw1f5zcaul6vcj20ah076gm3.jpg) 54 | 55 | `createPizza`应该是受保护权限 56 | 57 | 在父类`PizzaStore`中定义`createPizza`抽象方法,让子类去实现。 58 | 59 | NOTE:也可以不是抽象方法,提供默认的实现。 60 | 61 | ### 好处 62 | 1. 将‘实例化’从‘使用’中解耦 63 | 2. 易扩展 易维护 64 | 3. 更具弹性 65 | 66 | 67 | 68 | ## 抽象工厂 69 | 70 | 抽象工厂模式:**提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。** 71 | 72 | 73 | 抽象工厂允许**客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么**。这样一来客户就从具体的产品中被解耦。 74 | 75 | 抽象工厂跟工厂方法非常相似,但抽象工厂强调的是**一组产品**,是对组的抽象,需要一个大的接口;工厂方法使用的是类与继承而抽象工厂使用的是**组合**; 76 | 77 | ## 要点 78 | 79 | 1. 所有的工厂都是用来封装对象的创建。 80 | 2. 工厂方法使用继承:把对象的创建委托给子类,将实例化延迟到子类。 81 | 3. 抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。 82 | 4. 所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。 83 | 5. 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。 84 | 85 | ## See also 86 | 87 | [Factory method pattern 88 | ](https://en.wikipedia.org/wiki/Factory_method_pattern) 89 | 90 | [Factory Design Pattern Example 91 | ](http://javadesign-patterns.blogspot.com/p/factory-desig.html) 92 | -------------------------------------------------------------------------------- /books/JavaScriptDom编程艺术/第3章-DOM.md: -------------------------------------------------------------------------------- 1 | # 第3章-DOM 2 | 3 | 4 | ## 文档:DOM 中的 D 5 | D 文档 document ,当创建了一个网页并把它加载到 Web 浏览器中时,DOM 就在幕后生成,它把你编写的网页文档转换为一个文档对象。(加载到内存?) 6 | 7 | ## 对象:DOM 中的 O 8 | 9 | - 用户定义对象 10 | - 内建对象 11 | - 宿主对象 12 | 13 | 最基础的宿主对象: window对象,对应浏览器窗口本身。(类似 Android 的 PhoneWindow?) 14 | 15 | window 对象的属性和方法通常称为 BOM(浏览器对象模型)。 16 | 17 | BOM 提供了如 window.open window.blur 等方法。 18 | 19 | 更重要的是 document 对象。 20 | 21 | 22 | ## 模型:DOM 中的 M 23 | 24 | 模型:某种事物的表现形式。 比如模型火车就代表一列真正的火车。 25 | 26 | DOM 把一份文档表示为一棵树(数学意义上的树,类似二叉树) 27 | 28 | 家谱书模型 非常适合用来表示一份用(X)HTML 语言编写出来的文档。(parent child sibling) 29 | 30 | 节点树。 31 | 32 | ## 节点node 33 | 34 | 节点相当于现实世界组成万物的『原子』。 35 | 36 | 文档是『由节点构成的集合』。 37 | 38 | 节点的类型:元素节点、文本节点和属性节点。 39 | 40 | #### 元素节点(element node) 41 | 42 | 元素节点,DOM 的原子是元素节点。 如 `

`,``。标签的名字就是元素的名字。 43 | 44 | #### 文本节点 (text node) 45 | 46 | `

这里是文本

` 包含文本的就是文本节点,文本节点总是被包含在元素节点的内部。 47 | 48 | #### 属性节点 (attribute node) 49 | 50 | 属性节点用来对元素做出更具体的描述。比如 title href id class 等属性。 51 | 52 | 属性节点总是被包含在元素节点中。 53 | 54 | ## CSS 55 | 56 | 可以通过CSS(层叠样式表)告诉浏览器应该如何显示一份文档的内容。 57 | 58 | 语法: 59 | ``` 60 | selector{ 61 | property:value; 62 | } 63 | 64 | //指定 class 元素 65 | .class{ 66 | 67 | } 68 | 69 | // 指定 id 元素 70 | #id{ 71 | 72 | } 73 | ``` 74 | 75 | CSS 可以继承,比如 body ,不仅作用于那些直接包含在 body 标签里的内容,还将作用于嵌套在 body 元素内部的所有元素。 76 | 77 | ## 获取元素 78 | 79 | 跟 Android 中的 findViewById 获取 View类似 ,JS 中也有方法来获取文档中的元素。 80 | 81 | - getElementById 通过 id 获取,返回唯一的元素 82 | - getElementByTagName 通过标签名获取,如`

`,返回一个对象数组 83 | - getElementByClassName 通过 class 属性来获取,返回一个对象数组;可以指定多个类名 84 | 85 | ## 获取和设置属性 86 | 87 | getAttribute setAttribute 88 | 89 | setAttribute 做出的修改不会反映在文档本身的源代码里。 90 | 91 | DOM的工作模式:先加载文档的静态内容,再动态刷新,动态刷新不影响文档的静态内容。这正是 DOM 的真正威力:对页面内容进行刷新却不需要在浏览器里刷新页面。 92 | 93 | ## 小结 94 | 95 | JS 与 Android 相同,同为一门前端语言,其实有很多类似的设计,可以类比来学习理解。 96 | 97 | 感觉可以把 html中的 body 部分理解为 Android 中的 XML,用来描述网页的布局,标签元素可以理解为 Android 中的 View,CSS 可以理解为 style,这样更容易去理解,虽然可能不是很准确。 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /android/progressbar.md: -------------------------------------------------------------------------------- 1 | # ProgressBar 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | 7 | 8 | ### 常用属性 9 | 10 | 11 | 12 | - `style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"`,设置水平还是转圈等; 13 | - `android:progressDrawable="@drawable/xxx"`,设置进度条的样式; 14 | - `android:progress="20"`,设置进度; 15 | - `android:secondaryProgress=""`,设置次级进度; 16 | 17 | 18 | 19 | ### 自定义 ProgressBar 展示的样式 20 | 21 | 22 | 23 | 1. 新建 `layer-list` 类型的 drawable; 24 | 2. 按需添加 `item`: 25 | 1. `android:id="@android:id/background"` , 背景 26 | 2. `android:id="@android:id/secondaryProgress"`, 27 | 3. `android:id="@android:id/progress"` 28 | 3. 给 progressbar 设置`android:progressDrawable`属性,如 `"@drawable/custom_progress"`; 29 | 30 | 31 | 32 | ```xml 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | ``` 63 | 64 | 65 | 66 | ```xml 67 | 78 | ``` 79 | 80 | -------------------------------------------------------------------------------- /kotlin/README.md: -------------------------------------------------------------------------------- 1 | # Kotlin 2 | 3 | 4 | 5 | Kotlin 开源、静态类型,同时支持面向对象和函数式编程。 6 | 7 | 8 | 9 | Kotlin 是一种与 Android 兼容的语言,它不仅语法简洁、更具表达性,还具备类型安全和空值安全的特性。它与 Java 语言可以无缝互通 10 | 11 | 12 | 13 | 1. 开源 14 | 15 | 2. 静态类型 16 | 17 | 3. 支持面向对象 18 | 19 | 4. 支持函数式编程 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 1. 简洁:大大减少样板代码的数量; 28 | 2. 安全:避免空指针异常等整个类的错误; 29 | 3. 互操作性(interoperability):充分利用 JVM、Android 和浏览器的现有库; 30 | 4. 工具友好:可用任何 Java IDE 或者使用命令行构建。 31 | 32 | 33 | 34 | 35 | 36 | 37 | ### Android 38 | 39 | 40 | startActivity 可能都不会写 41 | 42 | ```kotlin 43 | startActivity(Intent(this,TargetActivity::class.java)) 44 | //或者 45 | startActivity(Intent(MainActivity@this, SecondActivity::class.java)) 46 | ``` 47 | 48 | 49 | 50 | 51 | 52 | ### 学习资料 53 | 54 | 55 | 56 | 1. 使用 Kotlin 开发 Android 应用:https://developer.android.com/kotlin 57 | 2. android kotlin overview: https://developer.android.com/kotlin/overview 58 | 3. Android 开发学 kotlin 速成课:https://developer.android.com/kotlin/learn 59 | 4. 在 Android 开发中开始使用 Kotlin: https://developer.android.com/kotlin/get-started.html#kotlin 60 | 5. Kotlin 学习资源: https://developer.android.com/kotlin/resources 61 | 6. 在线编辑器:https://play.kotlinlang.org/#eyJ2ZXJzaW9uIjoiMS4zLjUwIiwicGxhdGZvcm0iOiJqYXZhIiwiYXJncyI6IiIsImpzQ29kZSI6IiIsIm5vbmVNYXJrZXJzIjp0cnVlLCJ0aGVtZSI6ImlkZWEiLCJjb2RlIjoiLyoqXG4gKiBZb3UgY2FuIGVkaXQsIHJ1biwgYW5kIHNoYXJlIHRoaXMgY29kZS4gXG4gKiBwbGF5LmtvdGxpbmxhbmcub3JnIFxuICovXG5cbmZ1biBtYWluKCkge1xuICAgIHByaW50bG4oXCJIZWxsbywgd29ybGQhISFcIilcbn0ifQ== 62 | 7. code style: https://developer.android.com/kotlin/style-guide 63 | 8. Kotlin GitHub https://github.com/JetBrains/kotlin 64 | 65 | 66 | 67 | 68 | 69 | https://fabiomsr.github.io/from-java-to-kotlin/index.html?nsukey=vFvtsN%2Fd42nIDHK0%2FUgJC7vHmTbEGXNvSRScnS6nsTGgEOtqfXYVGzV5CAEFVG9bFm9etwg4yXJSDf5X8p8VHYh8r8pWrBcUcQanDmMFHXw%2FOtayEo8Ar6eKlssL4tAao8BDjsL2KF39BfbYcypjMY2TJKuE%2FEsUkCU4EbvyJ4QJYNLTfsP2GmSP5L5cRv%2BEdxEm%2BzcKRyaJr8AAzW7dkQ%3D%3D 70 | 71 | 72 | 73 | 74 | 75 | https://juejin.im/post/5d59e9d351882539792c4d7f 76 | 77 | https://juejin.im/post/5d5fccb8f265da03925a4f90 78 | 79 | https://juejin.im/post/5d5c80555188256522360a3d 80 | 81 | -------------------------------------------------------------------------------- /others/sth.md: -------------------------------------------------------------------------------- 1 | # 罗里吧嗦。 2 | 3 | 4 | 5 | ### 关于页面组件化以及动态化的一些思考 6 | 7 | 8 | 9 | Native 开发的痛点: 10 | 11 | 1. **新需求的开发与老需求的迭代都跟客户端应用发版强绑定,周期长**:不管是新需求的开发还是老需求的迭代,开发完毕后依赖应用发版,都不能直接触达用户,需求迭代周期长; 12 | 2. **无法灵活地动态修改样式,UI 定制化成本高**:native 开发完 UI 后,基本就只有一个样式,即便只是换个颜色或字体大小,都需要客户端修改代码,然后发版上线,不灵活也不动态,成本太高; 13 | 14 | 15 | 16 | 为了解决上述的问题,需要引入**组件化**以及**动态化**,组件化用来降低 UI 定制开发的成本,动态化用来解决周期长的问题。 17 | 18 | 在策略上,要**“重后端,轻前端”**,让客户端只做数据绑定的工作,其他剩余的事情都交个后端或其他角色来处理。一个页面长什么样子,用什么组件,组件渲染成什么样子等等,这些在到达客户端之前都应该已经被决定好了。 19 | 20 | 21 | 22 | #### 组件化的实现 23 | 24 | 25 | 26 | **组件化可以用一套各方约定的协议来实现**。这套协议是页面的抽象,它需要描述清楚**一个页面到底长什么样子**,包含一个页面的所有信息,并且提供可配置的灵活性。例如配置某个组件的背景色。 27 | 28 | 29 | 30 | 具体来说它应该需要包含这些信息: 31 | 32 | 1. 组成一个页面所需要的所有的组件的信息,例如组件的类型和组件的标识等; 33 | 2. 组件的布局信息,也即如何用组件搭建该页面; 34 | 3. 组件的信息以及组件要绑定的数据; 35 | 4. 组件的事件信息,例如点击后跳转页面和发送请求的参数信息; 36 | 37 | 38 | 39 | 总结来说需要包含:页面结构、数据、行为。 40 | 41 | 42 | 43 | 44 | 45 | ##### 协议数据的生命周期 46 | 47 | 48 | 49 | 渲染一个页面需要各方通力合作,大概的流程: 50 | 51 | 1. 客户端带参发送请求; 52 | 2. 后端接受请求,查询业务数据; 53 | 3. 转化业务数据为协议数据; 54 | 4. 客户端接受协议数据并解析渲染; 55 | 56 | 57 | 58 | `数据 BizModel ==> ComponentModel ==> 客户端解析 ==> 渲染` 59 | 60 | 61 | 62 | 这涉及到三个角色: 63 | 64 | 1. **后端**:接受前端发送来的请求,然后处理各种业务逻辑,获取数据,最终得到一个数据 Model; 65 | 2. **配置平台**:配置平台接受后端的数据 Model,然后进行处理,转换成一个组件化的协议数据,它包含页面的所有信息数据,例如页面用什么组件、组件如何排布以及组件的事件等,并且它能让客户端直接解析; 66 | 3. **客户端**:负责解析协议以及数据绑定; 67 | 68 | 69 | 70 | ##### 组件化的不足 71 | 72 | 73 | 74 | 1. **不支持复杂的布局**:组件化只能支持简单的组件布局,例如从上至下一次排布。假如要支持错乱的布局排布,用协议很难描述。 75 | 76 | 2. **增量更新难**:组件化协议基本上只能描述特定状态下的页面信息,如果要局部更新 UI 则很困难; 77 | 3. **分页不支持**:类似增量场景,协议也难支持分页模式; 78 | 4. **支持的交互简单**:协议只能抽象简单的交互,例如组件的点击或长按等很简单的交互,复杂的交互很难完美支持; 79 | 5. **组件之间的通信困难**:在协议下组件之间应该是完全解耦的,如果组件之间有互相依赖,那很难实现完美支持; 80 | 81 | 82 | 83 | #### 动态化的实现 84 | 85 | 86 | 87 | 各个客户端约定一系列的 DSL 规则,制定一个模板规则,映射视图,通过下发模板规则来实现动态化。 88 | 89 | 通俗的讲就是通过制定一套模板,后端下发动态的模板,客户端解析然后根据模板渲染 UI。 90 | 91 | 92 | 93 | 例如基于 XML ,这样 Android 可以非常方便的支持。 94 | 95 | 96 | 97 | #### 组件化+动态化的优势 98 | 99 | 100 | 101 | #### 小结 102 | 103 | 组件化+动态化的实现需要**协议**、**服务端配置平台**以及**客户端容器**。 104 | 105 | 协议描述页面,配置平台进行页面配置,客户端实现动态化容器。 106 | 107 | -------------------------------------------------------------------------------- /fed/roadmap.md: -------------------------------------------------------------------------------- 1 | # Web Roadmap 2 | 3 | 4 | 5 | Web 开发学习路线: 6 | 7 | 8 | 9 | HTML -> CSS -> JavaScript 10 | 11 | 12 | 13 | 14 | 15 | ### MDN 教程学习记录 16 | 17 | 18 | 19 | 相比于国内的教程,MDN 的更加权威些。就是访问速度差了点 20 | 21 | 22 | 23 | - [ ] [学习 HTML :指南与教程](https://developer.mozilla.org/zh-CN/docs/Learn/HTML) 24 | - [ ] [HTML 介绍](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML) 25 | - [ ] [HTML入门](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/Getting_started) 26 | - [ ] [Head中有什么?HTML中的元数据](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML) 27 | - [ ] [HTML 文字处理基础 ](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/HTML_text_fundamentals) 28 | - [ ] [创建超链接](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/Creating_hyperlinks) 29 | - [ ] [高级文本排版](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/Advanced_text_formatting) 30 | - [ ] [文档和网站结构](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/Document_and_website_structure) 31 | - [ ] [调试 HTML](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML) 32 | - [ ] [多媒体与嵌入](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Multimedia_and_embedding) 33 | - [ ] [HTML 表格](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Tables) 34 | - [ ] [HTML 表单](https://developer.mozilla.org/zh-CN/docs/Learn/HTML/Forms_and_buttons) 35 | - [ ] [HTML 基础](https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/HTML_basics) 36 | - [ ] [CSS ](https://developer.mozilla.org/zh-CN/docs/Learn/CSS) 37 | - [ ] [JavaScript](https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript) 38 | 39 | 40 | 41 | ### W3school 42 | 43 | https://www.w3school.com.cn/html/html_styles.asp 44 | 45 | - [ ] HTML 基础教程 46 | - [x] HTML 教程 47 | - [x] HTML 简介 48 | - [x] 编辑器 49 | - [x] 基础 50 | - [x] 元素 51 | - [x] 属性 52 | - [x] 标题 53 | - [x] 段落 54 | - [x] 样式 2019.7.31 55 | - [x] 文本格式化 56 | - [x] 引用 57 | - [x] 计算机代码 58 | - [x] 注释 59 | - [x] CSS 60 | - [x] 链接 61 | - [x] 图像 62 | - [ ] 表格 63 | - [ ] 列表 64 | - [ ] 65 | 66 | 67 | 68 | style 标签定义 样式定义 69 | 70 | link 定义资源引用 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /android/dialog-fragment.md: -------------------------------------------------------------------------------- 1 | # DialogFragment 2 | > 迁移语雀 2021-2-22 3 | 4 | 5 | 6 | 相比于 AlertDialog ,Google 更加推荐 DialogFragment ,因为它能更好地处理生命周期、屏幕旋转等 Activity 重建等情况。 7 | 8 | 9 | 10 | DialogFragment 可以完全当成一个 Fragment 来用,重写 onCreateView 然后使用即可。 11 | 12 | 13 | 14 | 15 | 16 | - onCreateView 17 | - onCreateDialog 18 | 19 | 20 | 21 | ### 设置透明背景 22 | 23 | 24 | 25 | 默认情况下 DialogFragment 里的 View 会有个背景(可能是白色)。 26 | 27 | 凡是设置透明度,都是通过 Window 来设置,DialogFragment 本身也依赖于 Window 所以此路亦通。 28 | 29 | 30 | 31 | **方法一,设置 theme**: 32 | 33 | ```xml 34 | 44 | ``` 45 | 46 | 47 | 48 | ```java 49 | @Override 50 | public void onCreate(@Nullable final Bundle savedInstanceState) { 51 | super.onCreate(savedInstanceState); 52 | setStyle(DialogFragment.STYLE_NORMAL, R.style.MyTheme); 53 | } 54 | ``` 55 | 56 | 57 | 58 | **方法二**, 59 | 60 | 在 `onStart()` 方法获取 window,然后调用 `window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));`。 61 | 62 | ```java 63 | @Override 64 | public void onStart() { 65 | super.onStart(); 66 | final Dialog dialog = getDialog(); 67 | if (dialog != null) { 68 | final Window window = dialog.getWindow(); 69 | if (window != null) { 70 | window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 71 | } 72 | } 73 | } 74 | ``` 75 | 76 | 好像并不管用???? 77 | 78 | 79 | 80 | ### BottomSheetDialogFragment 81 | 82 | 83 | 84 | BottomSheetDialogFragment 是 BottomSheet 样式的实现,唯一不同的是它用的 BottomSheetDialog。 85 | 86 | ```java 87 | @Override 88 | public Dialog onCreateDialog(Bundle savedInstanceState) { 89 | return new BottomSheetDialog(getContext(), getTheme()); 90 | } 91 | ``` 92 | 93 | -------------------------------------------------------------------------------- /java/linkedhashmap.md: -------------------------------------------------------------------------------- 1 | # LinkedHashMap 2 | 3 | 4 | 5 | 6 | 7 | 访问顺序对于实现高速缓存的“ 最近最少使用”原则十分重要。例如,可能希望将访问 频率高的元素放在内存中, 而访问频率低的元素则从数据库中读取。当在表中找不到元素项 且表又已经满时, 可以将迭代器加入到表中, 并将枚举的前几个元素删除掉。这些是近期最 少使用的几个元素。 8 | 9 | 10 | 11 | ### 特性 12 | 13 | - 可以构造一个`访问顺序`模式而不是`插入模式`的 LinkedHashMap,实现 LRU 算法。 14 | 15 | 16 | 17 | 18 | ### LinkedHashMap 实现 LRU 算法 19 | 20 | 使用 LinkedHashMap 能够记住访问顺序的这个特性可以实现 LRU 算法。 21 | 22 | 使用这个构造器就可以实现 LRU 算法: 23 | 24 | ```java 25 | public LinkedHashMap(int initialCapacity, 26 | float loadFactor, 27 | boolean accessOrder) 28 | ``` 29 | 30 | 31 | 32 | 链接散列映射将用`访问顺序`, 而不是插入顺序, 对映射条目进行迭代。 每次调用 get 或put, 受到影响的条目`将从当前的位置删除`,`并放到条目链表的尾部`(只有条目在链表中的位 置会受影响, 而散列表中的桶不会受影响。一个条目总位于与键散列码对应的桶中)。 33 | 34 | 35 | 36 | 举个例子: 37 | 38 | ```java 39 | LinkedHashMap lru = new LinkedHashMap<>(16, 0.75f, true); 40 | lru.put("A", "A"); 41 | lru.put("C", "C"); 42 | lru.put("D", "D"); 43 | lru.put("B", "B"); 44 | lru.put("E", "E"); 45 | System.out.printf("-------------\n"); 46 | lru.forEach(new BiConsumer() { 47 | @Override 48 | public void accept(String s, String s2) { 49 | System.out.println("accept() called with: s = [" + s + "], s2 = [" + s2 + "]"); 50 | } 51 | }); 52 | // 53 | System.out.printf("-------------\n"); 54 | lru.get("A"); 55 | lru.get("B"); 56 | lru.get("C"); 57 | lru.get("D"); 58 | lru.get("E"); 59 | lru.forEach(new BiConsumer() { 60 | @Override 61 | public void accept(String s, String s2) { 62 | System.out.println("accept() called with: s = [" + s + "], s2 = [" + s2 + "]"); 63 | } 64 | }); 65 | lru.put("A","A");// A 会再次被放到后面 66 | ``` 67 | 68 | 69 | 70 | 输出的日志是: 71 | 72 | ```java 73 | ------------- 74 | accept() called with: s = [A], s2 = [A] 75 | accept() called with: s = [C], s2 = [C] 76 | accept() called with: s = [D], s2 = [D] 77 | accept() called with: s = [B], s2 = [B] 78 | accept() called with: s = [E], s2 = [E] 79 | -------------//这里输出的已经不是原来的顺序了 80 | accept() called with: s = [A], s2 = [A] 81 | accept() called with: s = [B], s2 = [B] 82 | accept() called with: s = [C], s2 = [C] 83 | accept() called with: s = [D], s2 = [D] 84 | accept() called with: s = [E], s2 = [E] 85 | ``` 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | ### `` -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/learn/LearnArray.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.learn; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2019/12/30. 5 | */ 6 | public class LearnArray { 7 | 8 | 9 | public static void main(String[] args) { 10 | 11 | // accessArray(); 12 | // insertArray(); 13 | deleteArray(); 14 | } 15 | 16 | private static void accessArray() { 17 | int[] array = new int[5]; 18 | 19 | array[0] = 1; 20 | array[1] = 2; 21 | array[2] = 3; 22 | array[3] = 4; 23 | array[4] = 5; 24 | 25 | //for 26 | for (int i = 0; i < array.length; i++) { 27 | System.out.println(array[i]); 28 | } 29 | 30 | //foreach 31 | for (int i : array) { 32 | System.out.println(i); 33 | } 34 | } 35 | 36 | private static void deleteArray() { 37 | int[] array = new int[4]; 38 | 39 | array[0] = 1; 40 | array[1] = 2; 41 | array[2] = 3; 42 | array[3] = 4; 43 | //1 2 3 4,尝试删除 2,变成 1 3 4 44 | 45 | int deleteIndex = 1; 46 | 47 | //元素都往前移动 48 | for (int i = deleteIndex; i < array.length - 1; i++) { 49 | array[i] = array[i + 1]; 50 | } 51 | 52 | array[array.length - 1] = 0;//最后一位数置为 0 53 | 54 | for (int i : array) { 55 | System.out.println(i); 56 | } 57 | 58 | } 59 | 60 | //数组中插入元素,省略了边界条件判断 61 | private static void insertArray() { 62 | int[] array = new int[4]; 63 | 64 | array[0] = 1; 65 | array[1] = 3; 66 | array[2] = 4; 67 | 68 | //1,3,4,0,0 69 | for (int i : array) { 70 | System.out.println(i); 71 | } 72 | 73 | System.out.println("=========="); 74 | 75 | //尝试在 1 3 之间插入 2,变成 1 2 3 4 0 76 | int targetIndex = 1; 77 | int insertValue = 2; 78 | 79 | //从末尾开始,都赋值为前面元素的值,就完成了后移 80 | for (int i = array.length - 1; i > targetIndex; i--) { 81 | array[i] = array[i - 1]; 82 | } 83 | array[targetIndex] = insertValue; 84 | 85 | //1 2 3 4 0 86 | for (int i : array) { 87 | System.out.println(i); 88 | } 89 | } 90 | 91 | 92 | } 93 | -------------------------------------------------------------------------------- /ds-algorithm-proj/src/me/yifeiyuan/dsalgorithm/self/MyArrayQueue.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.dsalgorithm.self; 2 | 3 | /** 4 | * Created by 程序亦非猿 on 2020/4/16. 5 | */ 6 | public class MyArrayQueue { 7 | 8 | 9 | private String[] items; 10 | 11 | //大小 12 | private int size; 13 | 14 | //队头下标 15 | private int head; 16 | 17 | //队尾下标 18 | private int tail; 19 | 20 | public MyArrayQueue(int capacity) { 21 | this.size = capacity; 22 | items = new String[capacity]; 23 | } 24 | 25 | //入队 26 | public boolean enqueue(String value) { 27 | //满 28 | if (tail == size) { 29 | return false; 30 | } 31 | items[tail] = value; 32 | tail++; 33 | return true; 34 | } 35 | 36 | public boolean enqueue2(String value) { 37 | 38 | //队列末尾没有空间了 39 | if (tail == size) { 40 | 41 | //队列满了 42 | if (head == 0) { 43 | return false; 44 | } 45 | 46 | //队列还没满,做数据迁移 47 | for (int i = head; i < tail; i++) { 48 | items[i - head] = items[i]; 49 | } 50 | tail -= head; 51 | head = 0; 52 | } 53 | items[tail] = value; 54 | tail++; 55 | return true; 56 | } 57 | 58 | 59 | //出队 60 | public String dequeue() { 61 | 62 | //空 63 | if (head == tail) { 64 | return null; 65 | } 66 | 67 | String value = items[head]; 68 | head++; 69 | return value; 70 | } 71 | 72 | 73 | public static void main(String[] args) { 74 | 75 | MyArrayQueue queue = new MyArrayQueue(5); 76 | 77 | System.out.println(queue.dequeue());//null 78 | 79 | for (int i = 0; i < 6; i++) { 80 | System.out.println(queue.enqueue("" + i)); //5 true 1 false 81 | } 82 | 83 | for (int i = 0; i < 6; i++) { 84 | System.out.println(queue.dequeue());//0,1,2,3,4,null 85 | } 86 | 87 | 88 | for (int i = 0; i < 6; i++) { 89 | System.out.println(queue.enqueue2("" + i)); //5 true 1 false 90 | } 91 | 92 | for (int i = 0; i < 6; i++) { 93 | System.out.println(queue.dequeue());//0,1,2,3,4,null 94 | } 95 | 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /android/r8.md: -------------------------------------------------------------------------------- 1 | --- 2 | typora-copy-images-to: ./assets 3 | --- 4 | 5 | > 迁移语雀 2021-2-22 6 | 7 | 8 | # R8 9 | 10 | > R8, the new code shrinker from Google 11 | 12 | R8 将脱糖、压缩、混淆、优化和 dex 整合到一个步骤中,从而[显着提高了编译性能](https://www.google.com/url?q=https://android-developers.googleblog.com/2018/11/r8-new-code-shrinker-from-google-is.html&sa=D&ust=1551922493258000&usg=AFQjCNH0N1wuMX645n7giw0wjikzjm3WCA)。R8 是在 Android Gradle 插件 3.3.0 中引入的,对于使用插件 3.4.0 及更高版本的应用和 Android 库项目,R8 现已默认处于启用状态。 13 | 14 | 下图简要介绍了 R8 引入之前的编译流程。 15 | 16 | ![在 R8 之前,ProGuard 是一个与 dex 和脱糖不同的编译步骤。](https://developer.android.com/studio/images/build/r8/compile_with_d8_proguard.png) 17 | 18 | https://developer.android.com/studio/images/build/r8/compile_with_d8_proguard.png 19 | 20 | 21 | 22 | 现在,有了 R8,可以在一个步骤中完成脱糖、压缩、混淆、优化和 dex (D8),如下图所示。 23 | 24 | ![有了 R8,可以在一个编译步骤中执行脱糖、压缩、混淆、优化和 dex。](https://developer.android.com/studio/images/build/r8/compile_with_r8.png) 25 | 26 | https://developer.android.com/studio/images/build/r8/compile_with_r8.png 27 | 28 | 29 | 30 | 请注意,R8 旨在与您现有的 ProGuard 规则配合使用,因此您可能不需要采取任何操作即可从 R8 中受益。但是,由于它对专为 Android 项目设计的 ProGuard 而言是一项不同技术,因此压缩和优化可能会导致移除 ProGuard 可能没有的代码。因此,在这种不太可能的情况下,您可能需要添加其他规则以在编译输出中保留这些代码。 31 | 32 | 33 | 34 | 如果您在使用 R8 时遇到问题,请阅读 [R8 兼容性常见问题解答](https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md),以检查是否有针对您的问题的解决方案。如果没有记录在案的解决方案,请[报告错误](https://issuetracker.google.com/issues/new?component=326788&template=1025938)。您可以停用 R8,为此只需将以下其中一行添加到项目的 `gradle.properties` 文件即可: 35 | 36 | 37 | 38 | ```groovy 39 | # Disables R8 for Android Library modules only. 40 | android.enableR8.libraries = false 41 | # Disables R8 for all modules. 42 | android.enableR8 = false 43 | ``` 44 | 45 | 46 | 47 | **注意**:对于指定编译类型,如果您在应用模块的 `build.gradle` 文件中将 `useProguard` 设为 `false`,Android Gradle 插件会使用 R8 压缩该编译类型的应用代码,无论您是否在项目的 `gradle.properties` 文件中停用 R8 都是如此。 48 | 49 | 50 | 51 | benchmark 52 | 53 | ![img](https://4.bp.blogspot.com/-x9i4xfTJuXw/W-BzxpmeLrI/AAAAAAAAF4w/wo9hNM11PlYRWe5-SJXx9442BcJ4pMCCwCLcBGAs/s1600/1A.png) 54 | 55 | ![img](https://4.bp.blogspot.com/-tuPb9ZeMUYc/W-Bz3OXPOnI/AAAAAAAAF40/qoW3rfe6NQUpEFVDPHqMAAWzVmlJCVY7ACLcBGAs/s1600/2A.png) 56 | 57 | ![img](https://1.bp.blogspot.com/-ABGzNM9hSXA/W-Bz7HAEC_I/AAAAAAAAF44/gajEM4ikxwMUMK7VIg6eWWtkwBlqxMZCQCLcBGAs/s1600/3A.png) 58 | 59 | ### 资料 60 | 61 | https://android-developers.googleblog.com/2018/11/r8-new-code-shrinker-from-google-is.html 62 | 63 | -------------------------------------------------------------------------------- /android/modular-app.md: -------------------------------------------------------------------------------- 1 | # 模块化 App 架构 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | Modular Android App Architecture 7 | 8 | 9 | 10 | ### 为什么要模块化? 11 | 12 | 13 | 14 | 1. 更好的扩展性(scale) 15 | 2. 更好的维护性(maintainability) 16 | 3. 更快的编译速度(faster compilation) 17 | 4. 更快地持续集成(faster CI) 18 | 5. 可以更快地搭建 App,就像玩积木,可以用多个模块快速构建起一个完整的 App; 19 | 6. App 能够多方面受益,例如减少包大小 20 | 21 | 22 | 23 | 当 App 还小,我们能够知道整个 App 的内容,当 App 增长,人员增长,就很难维护同一个工程。 24 | 25 | 如果能够建立独立的模块,那么每个模块都可以独立开发,那么就不需要拥挤在一个工程里了。 26 | 27 | 这样还能带来个好处就是更容易维护,每个人各司其职维护自己负责的代码即可,不会混乱。例如找代码资源等只需要在相关工程里找,明显更简单。 28 | 29 | 模块化还有个好处就是能够提高编译速度,在只有一个工程时,我们修改代码需要编译整个工程,而模块化后只需要编译修改过后的工程。 30 | 31 | 类似的,还能加速我们的 CI。 32 | 33 | 34 | 35 | 当我们把 App 做成模块化后,我们可以从现有的模块中选出几个快速构建起另外一个完整的 App。 36 | 37 | 配合动态下发(Google Player)的能力,App 还可以减少包大小。 38 | 39 | 40 | 41 | ### 如何做到模块化? 42 | 43 | how should we modularize ? 44 | 45 | 46 | 47 | 可以按照`功能划分(feature)`或者`层级划分(layer)`。 48 | 49 | 50 | 51 | #### 功能划分(Feature modularization) 52 | 53 | 54 | 55 | 1. `一个打包工程`,按类型算是 Application 工程,`只负责打包`,它依赖其他功能模块; 56 | 57 | 2. `多个功能模块工程`,每个工程是 library 类型,按照功能区分,例如登录功能、首页或商品详情等等; 58 | 59 | 60 | 61 | 62 | 63 | #### 层级划分(Layer modularization) 64 | 65 | 66 | 67 | image-20190909112222300 68 | 69 | 70 | 71 | ![image-20190909112456443](https://tva1.sinaimg.cn/large/006y8mN6ly1g6t3q6oxfvj30js0cw0xh.jpg) 72 | 73 | 74 | 75 | 76 | 77 | Feature modularization brings you encapsulation and possibility of on-demand delivery. 78 | 79 | Modularization by layer brings you isolation,allows you to isolate your third-party dependencies or the layers in your app,and also brings structure to our app. 80 | 81 | 82 | 83 | 按层分的模块化更加简单,适合小的 App,按功能划分的更加复杂,很适合庞大的 App。 84 | 85 | 其实两者也可以结合,当 App 还小,layer modularization 可以用用,App 大了,再换成 feature modularization 更加合适。 86 | 87 | 88 | 89 | 90 | 91 | image-20190909151031171 92 | 93 | 94 | 95 | 96 | 97 | you should always compare your short-term costs with your long-term benefits and make a proper decision. 98 | 99 | 100 | 101 | ### 资料 102 | 103 | [Build a Modular Android App Architecture (Google I/O'19)](https://www.youtube.com/watch?v=PZBg5DIzNww&feature=youtu.be) 104 | 105 | 106 | 107 | # -------------------------------------------------------------------------------- /books/图解Http/第4章-返回结果的HTTP状态码.md: -------------------------------------------------------------------------------- 1 | # 第4章-返回结果的HTTP状态码 2 | 3 | HTTP状态码负责表示客户端 HTTP 请求的返回结果,标记服务端的处理是否正常、通知出现的错误等工作。 4 | 5 | 6 | 7 | 8 | 状态码以**3为数字和原因短语组成**,如 `200 OK`。 9 | 10 | 状态码的类别: 11 | 12 | | | 类别 | 原因短语 | 13 | | ---- | ---------------------- | ------------- | 14 | | 1XX | Informational(信息性状态码) | 接收的请求正在处理 | 15 | | 2XX | Success(成功状态码) | 请求正常处理完毕 | 16 | | 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 | 17 | | 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 | 18 | | 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 | 19 | 20 | 21 | 状态码数量达60余种,但是常用的大概就14种。 22 | 23 | 做客户端的,还是要稍微了解一下的,有个印象。在做一些需求,比如第三方授权时遇到 401等错误也不至于无从下手;遇到500错误也不会傻乎乎的在找自己的代码哪里写错了。 24 | 25 | 这里简单列举了一下(3XX 的太绕,就不多写了): 26 | 27 | | | 状态码 | 含义 | 28 | | :--------: | :------------------------ | ---------------------------------------- | 29 | | 2XX 成功 | | 请求被正常处理了 | 30 | | | 200 OK | 从客户端发来的请求在服务端被**正常处理**了 | 31 | | | 204 No Content | 服务器接收的请求已处理成功,但在返回的响应报文中**不含实体的主体部分** | 32 | | | 206 Partial Content | 客户端进行了范围请求,服务器成功执行了这部分的 GET 请求(Content-Range) | 33 | | 3XX 重定向 | | | 34 | | | 301 Moved Permanently | 永久性重定向 | 35 | | | 302 Found | 临时性重定向 | 36 | | | 303 See Other | | 37 | | | 304 Not Modified | | 38 | | | 307 Temporary Redirect | 与302的差别是,不会从 POST 变成 GET | 39 | | 4XX 客户端错误 | | 客户端是发生错误的原因所在 | 40 | | | 400 Bad Request | 请求报文中存在语法错误 | 41 | | | 401 Unauthorized | 需要有通过 HTTP 认证的认证信息 | 42 | | | 404 Not Found | 服务器上找不到资源 | 43 | | 5XX 服务器错误 | | 服务器本身发生错误 | 44 | | | 500 Internal Server Error | 服务端在执行请求时发生了错误 | 45 | | | 503 Service Unavailable | 服务端暂时处于超负载或正在进行停机维护,现在无法处理请求。 | 46 | 47 | -------------------------------------------------------------------------------- /books/HeadFirstDesignPatterns/README.md: -------------------------------------------------------------------------------- 1 | # HeadFirstDesignPatterns 2 | 3 | 深入浅出设计模式,非常优秀的设计模式书籍,入门最佳选择。 4 | 5 | NOTE:不过 **该书并没有讲述所有的设计模式** ,还缺少以下设计模式的仔细讲解(相对其他模式,篇幅小很多): 6 | 7 | - 桥接模式 8 | - 生成器模式 9 | - 责任链模式 10 | - 蝇量模式 11 | - 解释器模式 12 | - 中介者模式 13 | - 备忘录模式 14 | - 原型模式 15 | - 访问者模式 16 | 17 | 所以如果要完整学习所有的设计模式,那么还需要阅读其他书籍(该书推荐四人帮的书),不过,尽管如此它依然是一本好书。 18 | 19 | 20 | 设计模式分类(多了就要分类啊): 21 | 22 | ![设计模式分类](http://ww2.sinaimg.cn/large/98900c07jw1f66bcqb59jj20q10ct0vf.jpg) 23 | 24 | 模式:**是在某情境(context)下,针对某问题的某种解决方案。** 25 | 26 | - 情境:就是应用某个模式的情况。这应该是会不断出现的情况。 27 | - 问题:就是你想在某情境下达到的目标,但也可以是某情境下的约束。 28 | - 解决方案:就是你所追求的:一个通用的设计,用来解决约束,达到目标。 29 | 30 | 31 | 与设计模式对立的叫反模式: 32 | 33 | 反模式告诉你如何采用一个不好的解决方案解决一个问题。 34 | 35 | - 开发反模式 36 | - OO反模式 37 | - 组织反模式 38 | - 领域特定 39 | 40 | 建议: 41 | 42 | 1. 不需要严格遵照设计模式,可以适当调整以符合需求 43 | 2. 保持简单 44 | 3. 设计、重构的时候考虑设计模式 45 | 4. 现在不需要,就别做 46 | 5. 可能一直都不需要设计模式 47 | 6. 过度使用设计模式可能导致代码被过度工程化。应该总是用最简单的解决方案完成工作,并在真正需要模式的地方才使用它。 48 | 49 | 50 | ## 感悟 51 | 52 | 设计模式的强大需要在实践中去体会 53 | 54 | 55 | ## 设计模式推荐资料 56 | [HeadFirst设计模式](https://www.amazon.cn/Head-First%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%BC%97%E9%87%8C%E6%9B%BC/dp/B0011FBU34/ref=sr_1_1?ie=UTF8&qid=1469026679&sr=8-1&keywords=%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F) 57 | [设计模式:可复用面向对象软件的基础](https://www.amazon.cn/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6%E4%B8%9B%E4%B9%A6-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%8F%AF%E5%A4%8D%E7%94%A8%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%9F%BA%E7%A1%80-Erich-Gamma/dp/B001130JN8/ref=sr_1_1?ie=UTF8&qid=1469026646&sr=8-1&keywords=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F+%E5%8F%AF%E5%A4%8D%E7%94%A8%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%9F%BA%E7%A1%80) 58 | [wiki:Design Patterns](https://en.wikipedia.org/wiki/Design_Patterns) 59 | [Android源码设计模式解析与实战](https://www.amazon.cn/Android%E6%BA%90%E7%A0%81%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E8%A7%A3%E6%9E%90%E4%B8%8E%E5%AE%9E%E6%88%98-%E4%BD%95%E7%BA%A2%E8%BE%89/dp/B0176QDPUW/ref=sr_1_1?s=books&ie=UTF8&qid=1469026788&sr=1-1&keywords=android+%E6%BA%90%E7%A0%81%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E8%A7%A3%E6%9E%90%E4%B8%8E%E5%AE%9E%E6%88%98) 60 | [EffectiveJava](https://www.amazon.cn/Sun-%E5%85%AC%E5%8F%B8%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%9B%E4%B9%A6-Effective-Java%E4%B8%AD%E6%96%87%E7%89%88-Joshua-Bloch/dp/B001PTGR52/ref=pd_sim_14_3?ie=UTF8&dpID=51bFt0sSAKL&dpSrc=sims&preST=_AC_UL160_SR121%2C160_&psc=1&refRID=2ZABEPEFGX2M1YM5HVZN) 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /java/cyclicbarrier.md: -------------------------------------------------------------------------------- 1 | # CyclicBarrier 2 | 3 | 4 | CyclicBarrier 类实现了一个集结点(rendezvous) 称为障栅(barrier)。考虑大量线程运行 在一次计算的不同部分的情形。 当所有部分都准备好时, 需要把结果组合在一起。当一个线 程完成了它的那部分任务后, 我们让它运行到障栅处。一旦所有的线程都到达了这个障栅, 障栅就撤销, 线程就可以继续运行。 5 | 6 | 障栅被称为是循环的(cyclic), 因为可以在所有等待线程被释放后被重用。在这一点上, 7 | 有别于 CountDownLatch, CountDownLatch 只能被使用一次。 8 | 9 | 当线程做完了一部分事情后,调用 barrier.await() 方法进行等待,等到所有的线程都准备完,都调用了 await 后,就可以认为所有的线程都准备好了 ,此时,barrier action 会执行,然后所有的线程也可以开始执行。 10 | 11 | 12 | 设置屏障,当调用 barrier.await() 方法的线程数量到达限制,就会执行 barrier action。然后线程 13 | 14 | 15 | 例如: 16 | ```java 17 | private static void cyclicBarrier() { 18 | //设定屏障为两个线程 19 | CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() { 20 | @Override 21 | public void run() { 22 | System.out.println("CyclicBarrier run"); 23 | } 24 | }); 25 | 26 | Thread a = new Thread(new Runnable() { 27 | @Override 28 | public void run() { 29 | 30 | System.out.println("A is done."); 31 | //做完了 调用 barrier.await 等待其他线程 32 | try { 33 | barrier.await(); 34 | } catch (InterruptedException e) { 35 | e.printStackTrace(); 36 | } catch (BrokenBarrierException e) { 37 | e.printStackTrace(); 38 | } 39 | //等 B 好了就可以执行了 40 | System.out.println("A after barrier"); 41 | 42 | } 43 | }); 44 | 45 | a.start(); 46 | 47 | Thread b = new Thread(new Runnable() { 48 | @Override 49 | public void run() { 50 | 51 | System.out.println("B is done."); 52 | try { 53 | barrier.await(); 54 | } catch (InterruptedException e) { 55 | e.printStackTrace(); 56 | } catch (BrokenBarrierException e) { 57 | e.printStackTrace(); 58 | } 59 | System.out.println("B after barrier"); 60 | 61 | } 62 | }); 63 | 64 | b.start(); 65 | 66 | try { 67 | a.join(); 68 | b.join(); 69 | } catch (InterruptedException e) { 70 | e.printStackTrace(); 71 | } 72 | 73 | System.out.println("All threads are done."); 74 | } 75 | ``` 76 | 77 | 输出: 78 | ``` 79 | A is done. 80 | B is done. 81 | CyclicBarrier run 82 | B after barrier 83 | A after barrier 84 | All threads are done. 85 | ``` 86 | 87 | 88 | -------------------------------------------------------------------------------- /books/图解Http/第1章-了解Web及网络基础.md: -------------------------------------------------------------------------------- 1 | # 第1章 了解Web及网络基础 2 | 3 | 讲了TCP/IP协议族,分层,如何传输,TCP三次握手,URI&URL等网络基础。 4 | 5 | 6 | 7 | 8 | ## TCP/IP 分层管理 9 | 10 | TCP/IP协议族按层次分别分为以下4层: 11 | 12 | **应用层==>传输层==>网络层==>数据链路层** 13 | 14 | 分层的优势在于,当某块需要改变时,只需要修改一层即可。 15 | 16 | ### 应用层 17 | 18 | 应用层:**决定了向用户提供应用服务时通信的活动**. 19 | 20 | TCP/IP协议族内预存了各类通用的应用服务,如:`FTP` `DNS` `HTTP` 21 | 22 | ### 传输层 23 | 24 | 传输层:**对上层应用层,提供处于网络连接中的两台计算机之间的数据传输**. 25 | 26 | 传输层有两个性质不同的协议:`TCP`和`UDP` 27 | 28 | PS: TCP 可靠 ,UDP 不可靠 后面会讲 29 | 30 | ### 网络层(又名网络互联层) 31 | 32 | 网络层:用来**处理在网络上流动的数据包**. 数据包是网络传输的最小单位。 33 | 34 | 该层规定了通过怎么样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。 35 | 36 | 网络层所起的作用就是在众多的选项内选择一条传输路线。 37 | 38 | PS:IP协议在网络层 39 | 40 | ### 链路层(又名数据链路层,网络接口层) 41 | 42 | 用来处理链接网络的硬件部分。 43 | 44 | 包括控制操作系统、硬件的设备驱动、NIC(网卡)、光纤等。硬件上的范畴都在链路层的作用范围内。 45 | 46 | 47 | ##### 其他知识点 48 | 49 | 发送端从应用层往下走,接收端则往应用层往上走。 50 | 51 | 发送时,数据经过每一层,都会被加上该层的首部信息,接受时,经过每一层,都会被校区该层信息。 52 | 53 | 54 | ## 负责传输的 IP协议 55 | 56 | IP 协议的作用是**把各种数据包传送给对方**。 57 | 58 | 保证确实送到对方的重要条件: 59 | 60 | 1. IP 地址(节点被分配到的地址,可变) 61 | 2. MAC 地址(网卡所属的固定地址,一般不会变) 62 | 63 | IP之间的通信依赖 Mac 地址,IP 地址可以和 MAC 地址配对。 64 | 65 | 66 | 在多台网络设备间中转的时候,采用 ARP 协议(地址解析协议),根据通信方的 IP 地址,反查出对应的 MAC 地址。 67 | 68 | 69 | ## 确保可靠性的 TCP协议 70 | 71 | TCP 位于传输层,提供**可靠的字节流服务**(Byte Stream Service) 72 | 73 | 字节流服务是指 **为了方便传输,将大块数据分割成以`报文段(segment)`为单位的数据包进行管理** 这样能更容易传送大数据。 74 | 75 | ### 可靠性(三次握手) 76 | 77 | TCP的可靠性是因为它采用了**三次握手策略(three-way handshaking)** 78 | 79 | 握手过程中使用了TCP的标志: 80 | - SYN(synchronize) 81 | - ACK(acknowledgement 确认) 82 | 83 | 三次握手的过程: 84 | 85 | 1. 客户端先发送带有 SYN 标志的数据包给对方。(我要给你发数据了) 86 | 2. 接收端收到消息后,回传带有 SYN/ACK 标志的数据包,以示确认。(告诉你,我收到了) 87 | 3. 最后发送端再回传一个带有 ACK 标志的数据包,代表“握手”结束。(我知道你收到了,结束) 88 | 89 | 90 | ## 负责域名解析的 DNS 服务 91 | 92 | DNS 服务是和 HTTP 协议一样位于应用层的协议。**它提供域名到 IP 地址之间的解析服务**(通过域名查找 IP地址,反之亦可) 93 | 94 | ### 分层小结 95 | 96 | | 协议名称 | 所属层 | 97 | | :--: | :--: | 98 | | HTTP | 应用层 | 99 | | DNS | 应用层 | 100 | | IP | 网络层 | 101 | | TCP | 传输层 | 102 | 103 | ## URI和 URL 104 | 105 | URI 统一资源标识符,URL 统一资源定位符。 106 | 107 | URI**就是某个协议方案表示的资源定位的标识符**,协议方案是指**访问资源所使用的协议类型名称**。 108 | 109 | 比如采用 HTTP 协议时,协议方案就是 http。 110 | 111 | URI 协议方案有30种左右: 112 | 113 | - ftp 114 | - http 115 | - ldap 116 | - mailto 117 | - tel 118 | - ... 119 | 120 | URI格式如下: 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /java/arraydeque.md: -------------------------------------------------------------------------------- 1 | # ArrayQueue 2 | 3 | ```java 4 | /** 5 | * Resizable-array implementation of the {@link Deque} interface. Array 6 | * deques have no capacity restrictions; they grow as necessary to support 7 | * usage. They are not thread-safe; in the absence of external 8 | * synchronization, they do not support concurrent access by multiple threads. 9 | * Null elements are prohibited. This class is likely to be faster than 10 | * {@link Stack} when used as a stack, and faster than {@link LinkedList} 11 | * when used as a queue. 12 | * 13 | *

Most {@code ArrayDeque} operations run in amortized constant time. 14 | * Exceptions include {@link #remove(Object) remove}, {@link 15 | * #removeFirstOccurrence removeFirstOccurrence}, {@link #removeLastOccurrence 16 | * removeLastOccurrence}, {@link #contains contains}, {@link #iterator 17 | * iterator.remove()}, and the bulk operations, all of which run in linear 18 | * time. 19 | * 20 | *

The iterators returned by this class's {@code iterator} method are 21 | * fail-fast: If the deque is modified at any time after the iterator 22 | * is created, in any way except through the iterator's own {@code remove} 23 | * method, the iterator will generally throw a {@link 24 | * ConcurrentModificationException}. Thus, in the face of concurrent 25 | * modification, the iterator fails quickly and cleanly, rather than risking 26 | * arbitrary, non-deterministic behavior at an undetermined time in the 27 | * future. 28 | * 29 | *

Note that the fail-fast behavior of an iterator cannot be guaranteed 30 | * as it is, generally speaking, impossible to make any hard guarantees in the 31 | * presence of unsynchronized concurrent modification. Fail-fast iterators 32 | * throw {@code ConcurrentModificationException} on a best-effort basis. 33 | * Therefore, it would be wrong to write a program that depended on this 34 | * exception for its correctness: the fail-fast behavior of iterators 35 | * should be used only to detect bugs. 36 | * 37 | *

This class and its iterator implement all of the 38 | * optional methods of the {@link Collection} and {@link 39 | * Iterator} interfaces. 40 | * 41 | *

This class is a member of the 42 | * 43 | * Java Collections Framework. 44 | * 45 | * @author Josh Bloch and Doug Lea 46 | * @since 1.6 47 | * @param the type of elements held in this collection 48 | */ 49 | public class ArrayDeque extends AbstractCollection 50 | implements Deque, Cloneable, Serializable 51 | ``` 52 | 53 | 54 | 55 | 56 | 57 | 用数组实现的队列。 58 | 59 | ### 特性 60 | - 无限双端队列 61 | 62 | -------------------------------------------------------------------------------- /android/permissions.md: -------------------------------------------------------------------------------- 1 | # Android 运行时权限 2 | 3 | > 迁移语雀 2021-2-22 4 | 5 | 6 | 7 | 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。 8 | 9 | 10 | 11 | 系统权限分为两类:*正常权限*和*危险权限*: 12 | 13 | - **正常权限**不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。 14 | - **危险权限**会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。 15 | 16 | 17 | 18 | 当涉及到危险权限时,需要在**运行时进行申请**,如果不,则会导致 crash。 19 | 20 | 21 | 22 | 处理步骤: 23 | 24 | 1. 检查所需的权限是否已经授权,`ContextCompat.checkSelfPermission()`; 25 | 2. 如果没有则请求,先检查是否被拒绝, 26 | 1. 先通过`shouldShowRequestPermissionRationale()` 检查是否已经被拒绝了,如果返回了`true`,则表示用户在之前我们请求的时候拒绝了,得去设置里,如果`false`则可以`requestPermissions`去请求; 27 | 3. `requestPermissions`请求 28 | 4. 请求结果校验,重写`onRequestPermissionsResult`方法, 29 | 30 | 31 | 32 | ```java 33 | // Here, thisActivity is the current activity 34 | if (ContextCompat.checkSelfPermission(thisActivity, 35 | Manifest.permission.READ_CONTACTS) 36 | != PackageManager.PERMISSION_GRANTED) { 37 | 38 | // Should we show an explanation? 39 | if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 40 | Manifest.permission.READ_CONTACTS)) { 41 | 42 | // Show an expanation to the user *asynchronously* -- don't block 43 | // this thread waiting for the user's response! After the user 44 | // sees the explanation, try again to request the permission. 45 | 46 | } else { 47 | 48 | // No explanation needed, we can request the permission. 49 | 50 | ActivityCompat.requestPermissions(thisActivity, 51 | new String[]{Manifest.permission.READ_CONTACTS}, 52 | MY_PERMISSIONS_REQUEST_READ_CONTACTS); 53 | 54 | // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 55 | // app-defined int constant. The callback method gets the 56 | // result of the request. 57 | } 58 | } 59 | ``` 60 | 61 | 62 | 63 | 是否授权的结果: 64 | 65 | - PackageManager.PERMISSION_GRANTED 66 | - PackageManager.PERMISSION_DENIED 67 | 68 | 69 | 70 | 比如: 71 | 72 | A)请求权限: 73 | 74 | ```java 75 | String[] permissions = { 76 | Manifest.permission.CAMERA, 77 | Manifest.permission.RECORD_AUDIO, 78 | }; 79 | 80 | ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE_PERMISSION); 81 | ``` 82 | 83 | B)接受结果: 84 | 85 | ```java 86 | public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {} 87 | ``` 88 | 89 | 90 | 91 | ### 资料 92 | 93 | https://developer.android.com/training/permissions/requesting?hl=zh-cn 94 | 95 | https://developer.android.com/guide/topics/permissions/overview?hl=zh-cn 96 | 97 | https://developer.android.com/training/permissions/usage-notes?hl=zh-cn#testing 98 | 99 | -------------------------------------------------------------------------------- /books/JavaScriptDom编程艺术/第2章-JavaScript语法.md: -------------------------------------------------------------------------------- 1 | # 第2章-JavaScript语法 2 | 3 | 本章介绍 JS 的基础知识,语句、变量、数组和函数等。 4 | 5 | JavaScript 编写的代码必须通过 HTML/XHTML 文档才能执行。 6 | 7 | 把`