《我想看到的世界》(A-light-inside)[美]Jeannie-Suk

#源引–关于作者


珍妮 苏克(Jeannie Suk)

韩裔美国人,1973年生于首尔,6岁全家技术移民美国

她在韩国的知名度仅次于女总统朴槿惠
从芭蕾舞逐梦少女到哈佛法学院终身教授
一段关于艺术、人生和法律的长途冒险


耶鲁学士-牛津文学博士-哈佛法学博士-哈佛法学院终身教授

曾梦想成为一名芭蕾舞舞者,后因家庭原因被迫放弃。
91年凭借自身天赋和努力,成功申请上耶鲁。毕业时获得马歇尔奖学金,继而转战牛津大学攻读文学博士。在完成文学博士学位之后,发现法律才是自己愿意为之终身付出的事业,于是她考入哈佛大学法学院…


#发现–《A light inside》


这并不是一碗鸡汤,书中描写了很多作者幼年时期的经历细节以及当时的心路历程,从中可以看出作者母亲的远见卓识以及早年教育对一个人的重要性,或许会对教育孩子有所启发。

作者行文率真,字里行间都透露着真诚,书中不少章节读起来都会忍不住会心一笑。

读到最后,不禁生出敬仰之情。敬仰作者为追求目标拼尽全力,敬仰她追求真我而毫无畏惧,敬仰她的全面(芭蕾舞、钢琴、小提琴、文学、法语、跆拳道)…

她的理想是通过法律,让世界变得更好,对学生倾囊相授,让他们一起来实现不仅仅属于她个人的崇高理想。


亚马逊链接

笔记链接

导图

A light inside overview.png


笔记文字

A Light Inside
1 流放的移民
1.1 去美国,全速驶向未来
1.2 作为一个韩裔,竟不能吃泡菜
1.3 努力一次,就会获得多一点勇气
1.4 在书籍中漫游是最美妙的冒险
1.5 充好电,才能和焦虑这个魔鬼对峙
2 成长的烦恼
2.1 从回忆中创造自己
2.2 学会用沉默表达意见
2.3 但愿你也曾经倾尽全力
2.4 上不了Yale也不要紧
2.5 将自己的爱好和游戏融合在一起
2.6 自由是人生的基石
3 通往自由
3.1 感受全心投入的强烈愉悦感
3.2 完成论文的技巧:每天只写一页半
3.3 找到命中注定要去做的事
3.4 认知不完美,不要有过高期待
3.5 不要让直觉阻碍你前进
3.6 支配工作,而不是让工作支配你
4 在哈佛
4.1 完美靠恐惧而活
4.2 过想要的人生,就是终极礼物
4.3 没有正确答案,只有独立思考
4.4 学习那些让你感到不适的事

【Note】《波西米亚楼》读记

作者: 严歌苓(1958年11月16日-)美籍華人,美國當代著名中文、英文作家,好莱坞专业编剧。 (Link: wiki百科
代表作:《金陵十三钗》、《小姨多鹤》、《少女小渔》等

散文集,收录关于美洲、非洲、中国以及创作的一些见闻与感悟。

感觉文字本身张力不大,但笔下人物给人带来震撼力极大,能给人带来如此触动的真实人物并不多见。合卷之后,一些人物仍历历在目:独自支撑动物收容所的自身难保的美国老太太、在非洲时碰到的用假“中邪”来掩饰偷窃的女佣、半夜查访怀疑作者美国老公买淫的上海老警察、总在暗影聚餐吧冒充熟人赚饭吃的非洲女子等等。

父母的爱情之艰辛,之戛然而止,引人警戒
一句“我爱你,再见了”,写尽911对当事人造成的困扰
尼日利亚园丁在搞砸“菜园”之后不辞而别,凸显这国家人民的小心谨慎

作者是坦率的:故事讲完,不褒不贬,任君品评

《褚时健传》

“回想这么多年来,我自己做的最问心无愧的就是:‘没有庸庸碌碌地生活’”
“我不期望别人在说起我的人生时有多少褒奖,我只希望人家说起我时,会说上一句:‘褚时健这个人,还是做了一些事。’”
——褚时健

不积跬步无以至千里,一屋不扫何以扫天下。
真正从小事做起,精益求精态度的践行者,他之所以能走这么远,按照友人常说的,“必定不是运气”。

想起《苦难辉煌》,苦难并不一定会带来辉煌,但辉煌,必定是由苦难锻造的。

听起来稍显鸡汤,不过这本传记虽说文笔谈不上优美,但确实是王石传记的同一撰写者,文中细节还原或许有一定可信度。

值得一提的是,他背后也俗套地有一位贤内助。

老年丧女,白发人送黑发人的撕心裂肺或许只有当事人能够体会吧。

父亲早逝后,一度辍学,幸有堂兄指引,遂得续造

找准关键点,精益求精,一步一个脚印,才有红塔山的传奇

波澜起伏,一度失女入狱,耳后自困荒山,东山再起,褚橙横空出世

父亲早逝、少年参军、后被打为右派,沉着冷静,脚踏实地,才有再起之势

这不是一部普通的传记,它描写了一个人如何在17年时间里缔造了一个商业王国,然后如何陨落、自困荒山,然后又如何用17年时间走出心理和职业的巨大困局。

正如尼采所言,一个伟大的人格,可以在自己的身上克服这个时代


亚马逊链接


导图:

褚时健传  overview.png


笔记文本:

褚时健传
1 第一篇 早年故事
1.1 第一章 起始
1.1.1 褚姓人家
1.1.2 矣则
1.2 第二章 童年浪花
1.3 第三章 少年故事
1.3.1 年少逝父
1.4 第四章 离家的日子
1.5 第五章 所谓长大
1.6 第六章 思变
2 第二篇 激情的青春十年
2.1 第一章 当上了游击队员
2.2 第二章 战火纷飞
2.3 第三章 迎来解放
2.4 第四章 革命意味着牺牲
2.5 第五章 平静或不平静的生活
2.6 第六章 波澜骤起
3 第三篇 生活的断层
3.1 第一章 跌入生活底层
3.2 第二章 一家人要在一起
3.3 第三章 到了另一个农场
3.4 第四章 新平、新平
3.5 第五章 迅速进入角色
3.6 第六章 戛洒缘分
3.7 第七章 动乱岁月中的平静生活
3.8 第八章 希望的光就要来了
4 第四篇 华彩人生篇章
4.1 第一章 预备
4.2 第二章 完事开头难
4.3 第三章 启动改革
4.4 第四章 出手改革
4.5 第五章 设备之战
4.6 第六章 烟叶的故事
4.7 第七章 内部管理大小事
5 第五篇 行在人生巅峰时期
5.1 第一章 名烟翻番
5.2 第二章 关索坝工程
5.3 第三章 快马加鞭
5.4 第四章 谢幕
5.5 第五章 人生间隙
6 第六篇 果夺锦标
6.1 第一章 是结束,也是开始
6.2 第二章 土地、水和树
6.3 第三章 橙树在长大
6.4 第四章 一年比一年丰收
6.5 第五章 每一条路都指向未来
6.6 第六章 江山无限
这不是一部普通的传记,它描写了一个人如何在17年时间里缔造了一个商业王国,然后如何陨落、自困荒山,然后又如何用17年时间走出心理和职业的巨大困局。 正如尼采所言,一个伟大的人格,可以在自己的身上克服这个时代

《Effective-Java》

经典重读——亚马逊链接


笔记链接


导图:

Effective  Java  overview.png


笔记文本:

Effective Java
1 第2章 创建和销毁对象
1.1 1. 考虑用静态工厂方法代替构造器
1.1.1 优点
1.1.1.1 优势一:有名称
1.1.1.2 优势二:不必在每次调用它们的时候都创建一个新对象
1.1.1.3 优势三:可以返回原返回类型的任何子类型的对象
1.1.1.4 优势四:在创建参数化类型实例时,它们使代码变得更简洁
1.1.2 缺点
1.1.2.1 类如果不含有公有的或者受保护的构造器,就不能被子类化
1.1.2.2 它们与其他静态方法实际上没有任何区别
1.2 2. 遇到多个构造器参数时要考虑用构建器
1.2.1 Builder
1.2.2 与构造器相比的略微优势在于:builder可以有多个可变参数
1.2.3 虽然创建builder的开销在实践中可能不那么明显,但是在某些十分注重性能的情况下,可能就成问题
1.2.4 builder比重叠构造器更冗长,因此只在很多参数时才使用
1.3 3. 用私有构造器或者枚举类型强化Singleton属性
1.3.1 单元素的枚举类型已经成为实现Singleton的最佳方法
1.4 4. 通过私有构造器强化不可实例化的能力
1.4.1 弊端:使得其不能被子类化
1.5 5. 避免创建不必要的对象
1.5.1 对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是构造器,以避免创建不必要的对象
1.5.2 除了重用不可变的对象之外,也可以重用那些已知不会被修改的可变对象
1.5.3 要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱
1.5.4 自己维护对象池只在对象非常重量级时才显得必要,比如数据库连接池,线程池
1.6 6. 消除过期的对象引用
1.6.1 一旦对象引用已经过期,只需清空这些引用即可
1.6.2 缓存导致的内存泄露
1.6.2.1 一种是确认在缓存之外存在对某几个项的键的引用,该项就有意义 ——可以用WeakHashMap代表缓存
1.6.2.2 针对“缓存项生命周期是否有意义”难以确认的情况 ——缓存应该时不时地清除掉没用的项。这项清除工作可以由一个后台线程来完成,或者也可以在给缓存添加新条目时顺便清理(LinkedHashMap类利用它的removeEldestEntry方法可以很容易实现)
1.6.2.3 第三种引发来源是:监听器和其他回调。 确保回调立即被当做垃圾回收的最佳方法是只保存它们的弱引用 weak reference
1.7 7. 避免使用finalizer方法
1.7.1 通常是不可预测的
1.7.1.1 一个对象从不可用开始,到它的终结方法被执行,这段时间是任意长的
1.7.2 使用它有一个非常严重的性能损失
1.7.3 显示的终止方法通常与try-finally结合使用,以确保及时终止
1.7.4 用途:充当安全网、本地对等体
1.7.5 结论:不应该依赖终结方法来更新重要的持久状态
1.7.6 结论:除非是作为安全网,或者是为了终止非关键的本地资源,否则不要使用
2 第3章 对所有对象都通用的方法
2.1 8. 覆盖equals时请遵守通用约定
2.1.1 建议:能不覆盖就不要覆盖
2.1.2 不用覆盖的情形
2.1.2.1 类的每个实例本质上都是唯一的
2.1.2.2 不关心类是否提供了“逻辑相等”
2.1.2.3 超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的
2.1.2.4 类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用
2.1.3 覆盖的约定
2.1.3.1 自反性
2.1.3.2 对称性
2.1.3.3 传递性
2.1.3.4 一致性
2.1.3.5 非空性
2.1.3.5.1 对于任何非null的引用值,x.equals(null)必须返回false
2.1.4 诀窍
2.1.4.1 使用== 检查参数是否为这个对象的引用
2.1.4.2 使用instanceof检查 参数是否为正确的类型
2.1.4.3 把参数转换为正确的类型
2.1.4.4 对于该类中的每个关键域,检查参数中的域是否与该对象中对应的域相匹配
2.1.4.5 是否满足:对称、传递、一致
2.1.4.6 覆盖equals时总要覆盖hashCode
2.1.4.7 不要企图让equals方法过于智能
2.1.4.8 不要将equals声明中的Object对象替换为其他类型
2.2 9. 覆盖 equals时总要覆盖 hashCode
2.2.1 最佳实践:
2.2.1.1 @Override public int hashCode(){ int result = 17; result = 31 result + areaCode; result = 31 result + prefix; result = 31 result + lineNumber; }
2.3 10. 总要覆盖 toString
2.3.1 toString方法应该返回对象中包含的所有值得关注的信息
2.4 11. 谨慎地覆盖clone
2.4.1 通则:永远不要让客户去做任何类库能够替客户完成的事情
2.4.2 最好提供某些其他途径来代替对象拷贝,或者干脆不提供这样的功能
2.4.3 另一个实现对象拷贝的好方法是提供一个拷贝构造器或拷贝工厂
2.4.4 由于它有这么多缺点,有些专家级的程序员干脆从来不去覆盖clone方法,也从来不去调用它,除非拷贝数组
2.5 12. 考虑实现comparable接口
2.5.1 compareTo不但允许进行简单的等同性比较,而且允许执行顺序比较
2.5.2 如果你在编写一个值类,它具有非常明显的内在排序关系,比如按字母顺序、按数值顺序或者按年代顺序,那你就应该坚决考虑实现这个接口
2.5.3 如果一个类有多个关键域,那么你必须从最关键的域开始,逐步进行到所有的重要域
3 第4章 类和接口
3.1 13. 使类和成员的可访问性最小化
3.1.1 信息隐藏 或 封装
3.1.2 尽可能地使每个类或者成员不被外界访问
3.1.3 有一条规则限制了降低方法的可访问性能力:如果方法覆盖了超类中的一个方法,子类中的访问级别就不允许低于超类中的访问级别
3.1.4 注意:长度非零的数组总是可变的,所以,类具有公有的静态final数组域或者返回这种域的访问方法总是会出错
3.2 14. 在公有类中使用访问方法而非公有域
3.2.1 如果类可以在它所在的包的外部进行访问,就提供访问方法
3.2.2 如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质错误
3.2.3 Java类库的反面典型:Point和Dimension,暴露dimension类的内部数据造成了严重的性能问题,而且这个问题依然存在
3.3 15. 使可变性最小化
3.3.1 理由:比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全
3.3.2 使类成为不可变需要遵循五条规则
3.3.2.1 1 不要提供任何会修改对象状态的方法
3.3.2.2 2 保证类不会被扩展
3.3.2.3 使所有的域都是final的
3.3.2.4 使所有的域都成为私有的
3.3.2.5 确保对于任何可变组件的互斥访问
3.3.3 不可变对象的优势
3.3.3.1 不可变对象本质上是线程安全的,它们不要求同步
3.3.3.2 不仅可以共享不可变对象,甚至可以共享它们的内部信息
3.3.3.3 不可变对象为其他对象提供了大量的构件
3.3.3.4 不可变对象真正唯一的缺点是,对于每个不同的值都需要一个单独的对象
3.3.4 使类成为不可变的方法 (绝不允许自身被子类化)
3.3.4.1 1 使类成为final
3.3.4.2 2 让类的所有构造器都变成私有的或者包级私有的,并添加公有的静态工厂来替代公有的构造器
3.3.4.3 静态工厂方法除了允许多个实现类的灵活性之外,这种方法还使得有可能通过改善静态工厂的对象缓存能力,在后续的发行版中改进该类的性能
3.3.4.4 还有许多其他优势,比如,提供一种其他功能的 构造器 ,只需添加第二个静态工厂,并且工厂的名字清楚地表明它的功能
3.3.5 如果你选择让自己的不可变类实现Serializable接口,并且包含一个或多个指向可变对象的域,就必须提供一个显式的readObject或者readResolve方法
3.3.6 除非有很好的理由要让类成为一个可变的类,否则就应该是不可变的
3.3.7 如果类不能被做成不可变的,仍然应该尽可能地限制它的可变性。降低对象可存在的状态数,可以更容易地分析该对象的行为,同时降低出错的可能性
3.4 16. 复合优先于继承
3.4.1 继承是实现代码重用的有力手段,但它并非永远是完成这项工作的最佳工具
3.4.2 与方法调用不同的是,继承打破了封装性
3.4.3 新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回它的结果,这被称为“转发”,新类中的方法被称为转发方法
3.4.4 使用复合的类也被称为包装类,这也正是“装饰模式”
3.4.5 包装类不适合用在回调框架中。 编写转发方法倒是有点琐碎,但是只需要给每个接口编写一次构造器,转发类则可以通过包含接口的包替你提供
3.4.6 只有当子类真正是超类的子类型时,才适合用继承
3.4.7 如果在适合于使用复合的地方使用继承,则会不必要地暴露实现细节。这样得到的API会把你限制在原始的实现上,永远限定了类的性能
3.5 17. 要么为继承而设计,并提供文档说明,要么就禁止继承
3.5.1 说明可覆盖方法的自用性
3.5.2 好的文档应该描述一个给定的方法做了什么,而不是如何做到的
3.5.3 对于为了继承而设计的类,唯一的测试方法就是编写子类
3.5.4 构造器决不能调用可被覆盖的方法
3.5.5 为了继承而设计的类,对于这个类会有一些实质性的限制
3.5.6 对于那些并非为了安全地进行子类化而设计和编写文档的类,要禁止子类化
3.6 18. 接口优于抽象类
3.6.1 现有的类可以很容易被更新,以实现新的接口
3.6.2 接口是定义mixin(混合类型)的理想选择
3.6.3 接口允许我们构造非层次结构的类型框架
3.6.4 接口使得安全地增强类的功能成为可能
3.6.5 通过对你导出的每个重要接口都提供一个抽象的骨架实现类,把接口和抽象类的优点结合起来
3.6.6 抽象类与接口相比有一个明显优势:抽象类的演变比接口的演变要容易得多。如果在后续发行版中,你希望在抽象类中增加新的方法,始终可以增加具体方法,它包含合理的默认实现。然后,该抽象类的所有实现都将提供这个新方法。对于接口,这样做是行不通的
3.6.7 设计公有接口要非常谨慎。接口一旦被公开发行,并且已被广泛实现,再想改变这个接口几乎是不可能的
3.7 19. 接口只用于定义类型
3.7.1 有一种接口被称为 常量接口。这种接口不包含任何方法,它只包含静态final域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。
3.7.2 应该将这种量导出
3.8 20. 类层次优于标签类
3.8.1 缺点
3.8.1.1 充斥着样板代码,包括枚举声明、标签域以及条件语句
3.8.1.2 标签类过于冗长、容易出错,并且效率低下
3.9 21. 用函数对象表示策略
3.9.1 比较器函数代表一种为元素排序的策略
3.9.2 我们在设计具体的策略类时,还需要定义一个策略接口
3.10 22. 优先考虑静态成员类
3.10.1 嵌套类是指被定义在另一个类的内部的类。嵌套类有四种
3.10.1.1 静态成员类
3.10.1.2 非静态成员类
3.10.1.3 匿名类
3.10.1.4 局部类
3.10.2 如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中
4 第5章 泛型
4.1 23. 请不要在新代码中使用原生态类型
4.2 24. 消除非受检警告
4.2.1 要尽可能消除每一个非受检警告
4.2.2 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下才)可以用一个@SuppressWarning(“uncheck”)注解来禁止这条警告
4.3 25. 列表优先于数组
4.3.1 数组与泛型相比,有两个重要不同点
4.3.1.1 1 数组是协变的
4.3.1.2 2 数组是具体化的
4.4 26. 优先考虑泛型
4.4.1 编写自己的泛型会比较困难,但是值得花些时间去学习如何编写
4.5 27. 优先考虑泛型方法
4.5.1 泛型方法就像泛型一样,使用起来比要求客户端转换输入参数并返回值的方法来得更加安全,也更加容易。
4.5.2 就像泛型一样,你应该确保新方法可以不用转换就能使用,这通常意味着要将它们泛型化
4.6 28. 利用有限制通配符来提升API的灵活性
4.6.1 <? Extends E>
4.6.2 <? super E>
4.6.3 PECS 表示: producer-extends, consumer-super
4.6.4 所有的comparable和comparator都是消费者
4.7 29. 优先考虑类型安全的异构容器
5 第6章 枚举和注解
5.1 第30条 用enum代替int常量
5.1.1 因为没有可访问的构造器,枚举类型是真正的final
5.1.2 枚举是实例受控的
5.1.3 它们是单例的泛型化,本质上是单元素的枚举
5.1.4 你可以增加或重新排列枚举类型中的常量,而无需重新编译它的客户端代码,因为导出常量的域在枚举类型和它的客户端之间提供了一个隔离层:常量值并没有被编译到客户端代码中,而是在int枚举模式之中
5.1.5 最终,可以通过调用toString方法将枚举转化成可打印的字符串
5.1.6 除了完善了int枚举模式不足之外,枚举类型还允许添加任意的方法和域,并实现任意接口
5.1.7 将不同的行为与每个枚举常量关联起来:在枚举类型中声明一个抽象的方法
5.1.7.1 pubic enum Operation{ PLUS{double apply(double x, double y){return x + y;}}, MINUS{double apply(double x, double y){return x - y;}}, TIMES{double apply(double x, double y){return x
y;}}, DIVIDE{double apply(double x, double y){return x / y;}}; abstract double apply(double x, double y); }
5.1.7.2 如果给第二版添加新常量,你就不可能会忘记提供apply方法
5.1.8 特定于常量的方法实现可以与特定于常量的数据结合起来
5.1.8.1 pubic enum Operation{ PLUS(“+”) {double apply(double x, double y){return x + y;}}, MINUS(“-“) {double apply(double x, double y){return x - y;}}, TIMES(““) {double apply(double x, double y){return x y;}}, DIVIDE(“/“) {double apply(double x, double y){return x / y;}}; private final String symbol; Operation(String symbol) {this.symbol = symbol;} @Override public String toString(){ return this.sybol;} abstract double apply(double x, double y); }
5.1.9 枚举类型有一个自动产生的valueOf(String )方法,它将常量的名字转变成常量本身
5.1.10 策略枚举
5.1.10.1 嵌套策略枚举之后,枚举中就不需要switch语句或者特定于常量的方法实现了。虽然这种模式没有switch语句那么简洁,但更加安全,也更加灵活
5.2 第31条 用实例域代替序数
5.2.1 永远不要根据枚举的序数导出与它关联的值,而是要将它保存在一个实例域中
5.2.2 ordinal()——大多数程序员都不需要这个方法,它是设计成用于像EnumSet和EnumMap这种基于枚举的通用数据结构的
5.3 第32条 用EnumSet代替位域
5.3.1 枚举类型要用于集合中,没有理由用位域来表示它们
5.4 第33条 用EnumMap代替序数索引
5.4.1 使用EnumMap,运行速度可以与使用序数的程序相媲美,没有不安全的转换,不必手工标注这些索引的输出;计算数组索引时也不可能出错
5.4.2 之所以能与通过序数索引的数组相媲美,是因为EnumMap在内部使用了这种数组
5.4.3 最好不要用序数来索引数组,而要使用EnumMap
5.5 第34条 用接口模拟可伸缩的枚举
5.5.1 虽然无法编写可扩展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型,对它进行模拟
5.6 第35条 注解优先于命名模式
5.6.1 示例
5.6.1.1 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test{ }
5.6.1.2 这种注解称为元注解
5.7 第36条 坚持使用Override注解
5.7.1 能够避免疏漏的 重载
5.8 第37条 用标记接口定义类型
5.8.1 定义:没有包含方法声明的接口,而只是指明一个类实现了具有某种属性的接口
6 第7章 方法
6.1 第38条 检查参数的有效性
6.2 第39条 必要时进行保护性拷贝
6.2.1 假设类的客户端会尽其所能来破坏这个类的约束条件,因此你必须保护性地设计程序
6.2.2 为了保护类的内部信息免受直接访问修改的攻击,对于构造器的每个可变参数进行保护性拷贝是必要的
6.2.3 对与参数类型可以被不可信任方子类化的参数,请不要使用clone方法进行保护性拷贝
6.2.4 虽然替换构造器就可以成功地避免上述攻击,但是改变Period实例仍然是有可能的,因为它的访问方法提供了对其可变内部成员的访问能力 为了防御这种攻击,只需要修改访问方法,使它返回可变内部域的保护性拷贝即可
6.3 第40条 谨慎设计方法签名
6.3.1 谨慎选择方法的名称
6.3.2 不要过于追求提供便利的方法
6.3.2.1 每个方法都应该尽其所能。
6.3.2.2 方法太多会使类难以学习、使用、文档化、测试和维护
6.3.2.3 只有当一项操作被经常使用时,才考虑为它提供快捷方法,如果不能确定,还是不提供为好
6.3.3 避免过长的参数列表
6.3.3.1 相同类型的长参数列表格外有害
6.3.3.2 例如,List接口提供了subList方法,返回子列表的视图(view)
6.3.3.3 解决方法
6.3.3.3.1 1 分解为多个方法
6.3.3.3.2 2 创建辅助类
6.3.3.3.3 3 采用builder模式
6.3.3.4 对参数类型,要优先使用接口而不是类
6.3.3.5 对于boolean参数,要优先使用两个元素的枚举类型
6.4 第41条 慎用重载
6.4.1 对于重载方法的选择是静态的,而对于被覆盖的方法的选择则是动态的
6.4.2 安全而保守的策略是,永远不要导出两个具有相同参数数目的重载方法
6.5 第42条 慎用可变参数
6.5.1 EnumSet类对它的静态工厂使用这种方法,最大限度地减少创建枚举集合的成本。枚举集合为位域提供在性能方面有竞争力的替代方法
6.6 第43条 返回零长度的数组或者集合,而不是null
6.6.1 对于不返回任何元素的调用,每次都返回同一个零长度数组是有可能的,因为零长度数组是不可变的
6.7 第44条 为所有导出的API元素编写文档注释
6.7.1 为了正确地编写API文档,必须在每个被导出的 类、接口、构造器、方法和域声明之前增加一个文档注释
6.7.2 方法的文档注释应该简洁地描述出它和客户端之间的约定
6.7.2.1 precondition
6.7.2.2 postcondition
6.7.2.3 side effect
6.7.2.4 thread safety
6.7.3 可以使用HTML标签
6.7.4 使用{@code}标签
6.7.5 {@literal}
7 第8章 通用程序设计
7.1 第45条 将局部变量的作用域最小化
7.1.1 几乎每个局部变量的声明都应该包含一个初始化表达式
7.1.2 使用for循环,可以大大降低 “剪切-粘贴”错误
7.1.3 使用for循环与使用while相比还有另外一个优势:更简短,从而增强可读性
7.2 第46条 for-each循环优先于传统的for循环
7.2.1 for-each循环不仅让你遍历集合和数组,还让你遍历任何实现Iterable接口的对象
7.2.2 如果你在编写的类型表示的是一组元素,即使你选择不让它实现Collection,也要让它实现Iterable。这样可以允许用户利用for-each循环遍历你的类型
7.2.3 有三种常见情况无法使用for-each循环
7.2.3.1 过滤
7.2.3.2 转换
7.2.3.3 平行迭代
7.3 第47条 了解和使用类库
7.4 第48条 如果需要精确答案,请避免使用float和double
7.4.1 二进制浮点运算
7.4.2 float和double不适合货币计算
7.4.3 使用BigDecimal、int或者long进行
7.5 第49条 基本类型优先于装箱基本类型
7.5.1 装箱类型的合理用处
7.5.1.1 作为集合中的元素、键和值
7.5.1.2 在参数化类型中,必须使用装箱基本类型作为类型参数
7.5.1.3 在反射调用时,必须使用装箱基本类型
7.6 第50条 如果其他类型更合适,则尽量避免使用字符串
7.6.1 字符串不适合代替其他的值类型
7.6.2 字符串不适合代替枚举类型
7.6.3 字符串不适合代替聚集类型
7.6.4 字符串不适合代替能力表
7.7 第51条 当心字符串连接的性能
7.7.1 使用StringBuilder替代
7.8 第52条 通过接口引用对象
7.8.1 如果你养成了用接口作为类型的习惯,你的程序将更加灵活
7.8.2 如果没有合适的接口存在,完全可以用类而不是接口来引用对象
7.9 第53条 接口优先于反射机制
7.9.1 反射
7.9.1.1 丧失了编译时类型检查的好处
7.9.1.2 执行反射访问所需要的代码非常笨拙和冗长
7.9.1.3 性能损失
7.10 第54条 谨慎地使用本地方法
7.10.1 使用本地方法提升性能的做法不值得提倡
7.11 第55条 谨慎地进行优化
7.11.1 优化的弊大于利
7.11.2 要努力编写好的程序而不是快的程序
7.11.3 努力避免那些限制性能的设计决策
7.11.4 要考虑API设计决策的性能后果
7.11.5 为了获得好的性能而对API进行包装,这是一种非常不好的想法
7.12 第56条 遵守普遍接受的命名规则
8 第9章 异常
8.1 第57条 只针对异常的情况才使用异常
8.1.1 基于异常的模式比标准模式要慢得多
8.2 第58条 对可恢复的情况使用受检异常,对编程错误使用运行时异常
8.2.1 受检异常
8.2.2 用运行时异常来表明编程错误
8.3 第59条 避免不必要地使用受检异常
8.4 第60条 优先使用标准异常
8.5 第61条 抛出与抽象相对应的异常
8.5.1 更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常
8.5.2 异常链
8.6 第62条 每个方法抛出的异常都要有文档
8.6.1 单独声明受检异常,使用Javadoc的@throws标记
8.6.2 不要在非受检异常上使用@throws
8.7 第63条 在细节消息中包含能捕获失败的信息
8.7.1 为了捕获失败,异常的细节信息应该包含所有“对该异常有贡献”的参数和域的值
8.8 第64条 努力使失败保持原子性
8.8.1 失败的方法调用应该使对象保持在被调用之前的状态
8.9 第65条 不要忽略异常
8.9.1 空的catch块达不到应有的目的
8.9.2 至少包含一条忽略的说明
9 第10章 并发
9.1 第66条 同步访问共享的可变数据
9.1.1 Java语言规范保证读或者写一个变量是原子性的
9.1.2 volatile修饰符不执行互斥访问,但它可以保证任一线程在读取该域时都将看到最近刚被写入的值
9.1.3 使用volatile时,务必要小心,++操作并不是原子性的
9.1.4 AtomicInt、AtomicLong
9.1.4.1 getAndIncrement
9.1.5 多线程共享可变数据时,每个读或者写数据的线程都必行执行同步
9.2 第67条 避免过度同步
9.3 第68条 executor和task优先于线程
9.3.1 Executor FrameWork中有一个可以替代Timer的东西,即ScheduleThreadPoolExecutor 虽然就Timer更加容易,但executor更灵活。Timer对于长期运行任务时会影响到定时准确性。 如果Timer唯一的线程抛出未被捕获异常,Timer就会停止执行,而executor支持多个线程,并且优雅地从抛出的未受检异常的任务中恢复
9.4 第69条 并发工具优先于wait和notify
9.4.1 既然正确地使用wait和notify比较困难,就应该用更高级的并发工具来代替
9.4.2 concurrent工具分三类:Executor Framework、并发集合 以及 同步器
9.4.2.1 并发集合为标准的集合接口(如List、Queue和Map)
9.4.2.1.1 ConcurrentHashMap出了提供卓越的并发性之外,速度也非常快
9.4.2.1.2 优先使用ConcurrentHashMap而不是Hashtable或者Collections.synchronizedMap
9.4.2.2 有些集合接口已经通过阻塞操作进行了扩展,他们会一直等待可以成功执行为止
9.4.2.2.1 如BlockingQueue
9.4.2.2.2 不出所料,大多数ExecutorService实现(包括ThreadPoolExecutor)都使用BlockingQueue
9.4.2.3 同步器 是一些使线程能够等待另一个线程的对象,允许它们协调动作
9.4.2.3.1 最常用的是CountDownLatch和Semaphore
9.4.2.3.2 对于间歇式定时,应该使用System.nanoTime,更加精准
9.4.2.3.3 传递给Timer方法的executor必须允许创建至少与指定并发级别一样多的线程,否则这个测试就永远不会结束,这就是线程饥饿死锁
9.4.3 使用wait和notify就像用“并发汇编语言”进行编程一样
9.4.4 维护时:一般情况下你应该优先使用notifyAll,而不是notify
9.5 第70条 线程安全性的文档化
9.6 第71条 慎用延迟初始化
9.6.1 除非绝对必要,否则就不要这么做
9.6.2 在大多数情况下,正常的初始化要优先于延迟初始化
9.6.3 如果处于性能考虑需要对实例域使用延迟初始化,就使用双重检查模式
9.7 第72条 不要依赖于线程调度器
9.7.1 任何依赖于线程调度器来达到正确性或者性能要求的程序,很有可能都是不可移植的
9.7.2 不要依赖Thread.yield或者线程优先级。这些设施仅仅对调度器作些按时
9.7.3 线程优先级可以用来提高一个已经能够正常工作的程序的服务质量,但永远不应该用来“修正”一个原本不能正常工作的程序
9.8 第73条 避免使用线程组
10 第11章 序列化
10.1 第74条 谨慎实现Serializable接口
10.1.1 代价
10.1.1.1 降低了改变这个类的实现的灵活性
10.1.1.2 增加了出现Bug和安全漏洞的可能性
10.1.1.3 相关的测试负担增加
10.2 第75条 考虑使用自定义的序列化形式
10.3 第76条 保护性地编写readObject方法
10.4 第77条 对于实例控制,枚举类型优先于readResolve
10.5 第78条 考虑用序列化代理代替序列化实例

【Note】《软件项目管理》概览提要

《软件项目管理》着眼于软件项目的策划、监督、控制;

主要对从项目选择开始,到项目交付整个流程中关键步骤进行释疑解惑,涵盖项目管理(评价、策划、评估、实施)、技术管理(评审、质量控制、敏捷开发)、风险管理(评估、规避、转移)、合同管理成员管理(选择、激励、激励)、团队管理等几个方面


Evernote链接

XMind文档下载

导图

项目管理overview.png


文本

软件项目管理

1 概述
1.1 合同/技术项目管理
1.1.1 可行性研究、策划、实施
1.2 计划、方法、方法学
1.3 分类方式
1.3.1 用户、系统、目标与产品
1.4 设定目标
1.4.1 目标与子目标
1.4.2 有效性度量
1.5 管理控制
1.5.1 瀑布流控制、反馈迭代直至达成目标
2 评价项目与项目集管理
2.1 项目组合管理
2.1.1 新品开发、改进项目
2.1.2 组合优化
2.2 单项目管理
2.2.1 单项目评估
2.2.1.1 技术评估
2.2.1.2 成本效益分析
2.2.1.2.1 评价技术
2.2.1.2.1.1 净利润
2.2.1.2.1.2 回收期
2.2.1.2.1.3 投资回报率
2.2.1.2.1.4 净现值
2.2.1.2.1.5 内部回报率
2.2.1.3 现金流预测
2.2.2 风险评价
2.2.2.1 风险标识与等级
2.2.2.2 风险与净现值
2.2.2.3 风险剖面分析
2.2.2.4 使用决策树
2.3 项目集管理
2.3.1 管理项目集内的资源分配
2.3.2 策略
2.3.3 创建
2.3.3.1 命令(目标)
2.3.3.2 摘要
2.3.3.3 构想
2.3.3.4 蓝图
2.3.4 辅助
2.3.4.1 依赖关系图
2.3.4.2 交付计划
2.4 收益管理
2.4.1 量化收益
3 项目策划概述
3.1 步进式策划概述
3.2 步骤
3.2.1 选择
3.2.2 标识范围和目标
3.2.3 标识基础设施
3.2.4 分析特征
3.2.4.1 驱动因素
3.2.4.2 质量特征
3.2.4.3 用户需求
3.2.4.4 开发方法学与生命周期法
3.2.4.5 整体资源需求估计
3.2.5 标识产品与活动
3.2.5.1 可交付物
3.2.5.2 文档化产品流
3.2.5.3 活动图网络
3.2.6 估算每个活动工作量
3.2.6.1 使活动可控
3.2.7 标识活动风险
3.2.7.1 标识、量化基于活动的风险
3.2.7.2 风险缓解策略与应急措施
3.2.7.3 根据风险调整计划与估计
3.2.8 分配资源
3.2.8.1 根据资源约束修改计划与估计
3.2.9 评审/发布计划
3.2.10 执行、细节策划
4 选择合适的项目方法
4.1 build or buy
4.2 选择方法学和技术
4.3 过程模型的选择
4.4 结构与交付速度
4.5 模型
4.5.1 瀑布模型
4.5.2 螺旋模型
4.5.3 软件原型开发
4.5.4 其它
4.5.4.1 原型收获
4.5.4.2 具象化程度
4.5.4.3 取舍
4.5.4.4 控制变更
4.6 增量式交付
4.6.1 优缺点
4.6.2 交付计划
4.6.3 系统目标
4.6.4 开放的技术计划
4.6.5 增量式计划
4.7 敏捷
4.7.1 水晶方法
4.7.2 Atern
4.7.3 特性驱动
4.7.4 Scrum
4.7.5 XP
5 软件工作量估计
5.1 何处评估
5.1.1 战略策划
5.1.2 可行性研究
5.1.3 项目策划
5.2 过高/过低问题
5.3 软件估计基础
5.3.1 历史数据
5.3.2 工作度量
5.4 估计技术
5.4.1 自底向上
5.4.2 自顶向下
5.4.3 专家判断
5.4.4 类比估计
5.5 功能点分析
6 活动策划
6.1 目的
6.1.1 可行性评估、资源分配、成本核算、动机、协调
6.2 何时
6.2.1 逐步细化
6.3 进度表
6.4 项目与活动
6.4.1 甘特图
6.5 确定活动次序与进度
6.6 网络策划模型
6.7 网络模型的公式化表示
6.8 增加时间维
6.9 正向遍历
6.10 反向遍历
6.11 表示关键路径
6.12 活动缓冲期
6.13 标识关键活动
6.14 活动-箭头网络
7 风险管理
7.1 风险
7.2 分类
7.3 处理框架
7.4 识别
7.5 评估
7.6 策划
7.6.1 接受、规避、降低与缓解、转移
7.7 管理
7.7.1 应急、应对策略
7.8 评价进度风险
7.9 应用PERT技术
7.9.1 活动评估网络图
7.10 蒙特卡洛仿真
7.11 关键链概念
7.11.1 甘特图
8 资源分配
8.1 资源性质
8.2 标识资源需求
8.3 资源调度
8.4 创建关键路径
8.5 计算成本
8.6 特定细节
8.7 发布资源进度表
8.8 成本进度
8.9 调度顺序
9 监督与控制
9.1 创建框架
9.1.1 责任
9.1.2 进展评估
9.1.3 设置检查点
9.1.4 取快照
9.2 收集数据
9.2.1 局部完成报告
9.2.2 红黄绿交通灯报告
9.3 进展可视化
9.3.1 甘特图
9.3.2 延迟图
9.3.3 时间线
9.4 成本监督
9.5 优先级控制
9.5.1 关键路径活动、无自由浮动的活动、少于规定浮动的活动、高风险活动、使用关键资源活动
9.6 使项目回归目标
9.6.1 缩短关键路径、重新评估优先需求、异常计划
9.7 变更控制
9.7.1 规程、维度、职责
10 管理合同
10.1 合同种类
10.2 部署阶段
10.2.1 需求分析、评估计划、邀请投标、评估提议
10.3 典型合同条款
10.4 管理
10.5 验收
11 人员管理
11.1 理解行为
11.1.1 解释主义、实证主义
11.2 组织行为:背景
11.2.1 合适的人、对指导方法择优、薪酬激励
11.3 选择合适人选
11.4 用最好的方法进行教育
11.4.1 培训
11.5 激励
11.5.1 Taylorise模型
11.5.1.1 制造业计件
11.5.2 Maslow需求层次
11.5.2.1 发现个人的需求所处层次
11.5.3 Herzberg双因素理论
11.5.3.1 维护因素、工作热情
11.6 oldham-Hackman工作特征模型
11.6.1 技术多样性、任务鉴别、重要性、自主权、反馈
11.7 压力
11.7.1 任务控制、角色冲突
11.8 健康和安全
11.9 职业道德注意事项
12 团队管理
12.1 组成
12.2 决策制定
12.2.1 心里障碍
12.2.1.1 故障启发、恶性增资、信息超载
12.2.2 小组综合制定
12.2.3 主程序组
12.2.4 敏捷
12.3 组织结构
12.4 合作依赖
12.5 分散或虚拟团队
12.6 沟通风格
12.7 沟通计划
12.7.1 what、who、purpose、when、method、responsibility
12.8 领导能力
13 软件质量
13.1 质量在项目策划中的位置
13.2 重要性
13.2.1 危险程度、不定因素、缺陷累积
13.3 定义
13.4 产品与过程质量管理
13.5 质量管理体系
13.6 能力过程模型
13.7 助力提高技术
13.7.1 增加可见性
13.7.2 过程性结构
13.7.3 检查中间阶段
13.8 测试
13.9 质量计划
(Bob Hunghes & Mike Cotterell 著)

【笔记】《超越感觉--批判性思考指南》

重温
作者:文森特·鲁吉罗 (Vincent Ruggiero)(美)

里面很多论点对很多人来说可能都是常识,不过还是有闪光处的,比如:

  • 25%的人认为自己位列前 1%(实验数据,并不准确)

  • 除非你意识到自己经验的局限性,训练你的思维扩展到超越你熟悉的事物,考察所有相关的观点,并在判断钱先进行理解,否则你就几乎肯定会眼光狭隘,思维贫乏

  • 陈述一种观点,就是告诉他人我们对某事的看法;当需要征引一些东西来支持我们的观点时,很多时候我们不愿意承认,其实我们只能勉强提供一些根本站不住脚的证据

亚马逊链接(我读的这版的翻译很一般)


印象笔记链接


提纲图片:

批评思考overview.png


笔记文字:

批判性思考指南
1 第一篇 背景
1.1 第一章 你是谁
1.2 第二章 什么是批判性思考
1.3 第三章 真理是什么?
1.3.1 究竟始于何处
1.3.1.1 或多或少的程度上,我们视为自己独特视角的看法承受着他人思想和信念的印记
1.3.2 不完善的感知
1.3.3 不完善的记忆
1.3.4 有缺陷的信息
1.3.5 即使最明智的人也会出错
1.3.6 真理是发现的,不是创造的
1.3.7 理解原因和结果
1.3.7.1 时间顺序并不决定因果关系
1.3.7.2 并非所有因果关系都包含强力或必然性
1.3.7.3 需要提高对“自由意志”的警惕
1.3.7.4 因果性经常是复杂的
1.4 第四章 认知意味着什么?
1.4.1 认知的必要条件
1.4.2 检验你自己的知识
1.4.3 我们如何知道
1.4.4 为什么认知是困难的
1.4.5 信仰是一种形式的知识吗
1.4.6 知识的障碍
1.5 第五章 你的观点有多少根据?
1.5.1 可能出错的观点
1.5.2 关于道德问题的观点
1.5.3 专家也会出错
1.5.4 有见识的对无见识的观点
1.5.5 明辨是非地形成观点
1.5.5.1 了解观点是如何形成的
1.5.5.2 抵制把你的观点变成事实的诱惑
1.5.5.3 监控你的思想以防止陷入非批判性默认模式
1.6 第六章 证据是什么?
1.6.1 种类
1.6.2 个人经验
1.6.3 未公开的传说
1.6.4 公开报道
1.6.5 目击者睁眼
1.6.6 名人证言
1.6.7 专家意见
1.6.8 统计资料
1.6.9 调查
1.6.10 正规观察
1.6.11 研究评述
1.6.12 评价证据
1.6.13 充分证据的构成要件是什么
1.7 第七章 什么是论证
1.7.1 论证的组成部分
1.7.2 评价论证
1.7.3 比较困难的论证
2 第二篇 易犯的错误
2.1 第八章 基本问题:“我的更好”
2.1.1 自我中心的人
2.1.2 族群中心的人
2.1.3 控制“我的更好”的思维
2.2 第九章 立场的错误
2.2.1 视角匮乏
2.2.2 无根据的假定
2.2.3 要么/要么观念
2.2.4 盲目遵从
2.2.5 绝对主义
2.2.6 相对主义
2.2.7 支持或反对变化的偏见
2.3 第十章 程序错误
2.3.1 有偏见的证据考量
2.3.2 双重标准
2.3.3 草率的结论
2.3.4 过度概括和刻板成见
2.3.5 过度简单化
2.3.6 事后归因谬误
2.4 第十一章 表达的错误
2.4.1 自相矛盾
2.4.2 循环论证
2.4.3 无意义的陈述
2.4.4 误用权威
2.4.5 错误类比
2.4.6 非理性述求
2.5 第十二章 反应的错误
2.5.1 自动拒绝
2.5.2 转换话题
2.5.3 转移举证责任
2.5.4 “稻草人“
2.5.5 攻击批评者
2.6 第十三章 错误组合
3 第三篇 策略
3.1 第十四章 认识你自己
3.1.1 批判性思考的详细目录
3.1.2 挑战与回报
3.2 第十五章 敏锐地观察
3.2.1 观察人
3.2.2 科学和医学中的观察
3.2.3 应用范围
3.2.4 变得更敏锐
3.2.5 反思你的观察
3.3 第十六章 选择一个议题
3.3.1 基本原则:少是多
3.3.2 如何限定一个议题
3.3.3 发散–收拢
3.4 第十七章 进行探究
3.4.1 处理不确定结果
3.4.2 到何处寻找信息
3.4.3 问题背景
3.4.4 事实和统计资料
3.4.5 关于人的信息
3.4.6 关于英语的信息
3.4.7 期刊、书籍、数据库、摘要检索、互联网
3.4.8 集中与焦点
3.4.9 多少探究才够充分
3.4.10 处理长篇材料
3.5 第十八章 形成判断
3.5.1 评价证据
3.5.2 评价你信息来源的论证
3.5.3 作出重要区分
3.5.4 判断的表达
3.5.4.1 力求一个平衡点
3.5.4.2 处理可能性
3.5.4.3 让主语适当具体
3.5.4.4 让谓语准确
3.5.4.5 限定语
3.5.4.6 避免夸大其词
3.6 第十九章 说服他人
3.6.1 指导原则
3.6.1.1 尊重受众
3.6.1.2 理解听众观点
3.6.1.3 从共同立场开始
3.6.1.4 态度积极
3.6.1.5 尽可能让人理解你的论证
3.6.1.6 承认对方有道理之处
3.6.1.7 不要忽视任何相关事实
3.6.1.8 不要用论证压倒听众
3.6.1.9 集中于最可能起作用的论证
3.6.1.10 不使用无关论证
3.6.1.11 容留时间

【读书笔记】《一生的学习》--印度哲学家--克里希拉穆提

(引自维基百科)–【大中华区局域网用户–百度百科传送门
吉杜·克里希那穆提(英语:Jiddu Krishnamurti)(1895年-1986年),印度哲学家,同时被誉为二十世纪最伟大的灵性导师。他一生中走访过全球超过70个国家演讲,其演讲被辑录成超过80本书,更被翻译成超过50种语言。克里希那穆提是第一位用通俗的语言,向西方全面深入阐述东方哲学智慧的印度哲人。在二十世纪一度对西方哲学、宗教产生过重大的影响。他的一生颇具传奇色彩。被印度的佛教徒肯定为“中观”与“禅”的导师,而印度教徒则承认他是彻悟的觉者。全球多国均设有克里希那穆提基金会和学校,包括美国、欧洲、印度和澳洲,并致力推广克氏的慈悲与当世解脱的理念。

友人引荐,东方哲学导读;


其实Jiddu一生都没有写过一本书,现在流传的一整套书都是他的演讲文集。可能是我愚钝,他的言论,好多现在读来还不太理解。比如:

如果我们受教育只是为了成为科学家,成为死守书本的学者,或者沉迷于某种知识的专家,那么,我们将助长世界上的毁灭与不幸


不过有些观点看起来就比较理想化,比如:

教育,应该帮助我们发现恒久不灭的价值,使我们不至于只依附公式或重复口号;教育应该帮助我们拆除国籍与社会上所竖起的栅栏,而非强化它们


他的关于宗教与国家的观点还是值得一读的,虽说依然比较理想化,但没准不久的将来整体人类观念会进化到接近他所描述的那个level

在悲哀的时候,我们转向所谓的上帝——这只是我们内心的意向而已
教条、奇迹和仪式,这些都无助于精神生活
政府控制教育,根本是一种错误


他推崇了解自我,了解自身从而获得智慧;友人说是与远播日韩的王阳明的“心学”有些联系

真正的教育,乃是帮助个人,使其成熟、自由,绽放爱与善良之花


#下面是整体文档、图片、文字Evernote链接
《一生的学习》

Education and Significance of Life.png


论文求过

【读书笔记】《多余的话》——瞿秋白

曾经的党领袖,在临终前的“谈天”,说自己当领袖是众多“历史的误会”,然而这误会一误就是五年
或许是造化弄人,不过以书中的内容来看,他确实难当此大任
书中说他自己最大的梦想是读书写字、舞文弄墨,然而在历史的转折点他并没有认清现实,急流勇退,这些字越发显得矫情


笔记链接


思维导图图片:

多余的话 overview.png


文字:

《多余的话》——瞿秋白
1 多余的话
1.1 历史的误会
1.1.1 误打误撞学俄文
1.1.2 时势进入政局
1.1.3 党内无人出特,意外变成领袖
1.1.4 旧人无能人,新人未成熟——当领袖五年
1.2 脆弱的二元人物
1.2.1 本心想着:读书写字、舞文弄墨
1.3 我和马克思主义
1.3.1 不做国师,但闻共产主义终极理想
1.3.2 对其学说不感兴趣,只事翻译
1.4 盲动主义和立三路线
1.4.1 过分估量革命形势的盲动主义错误
1.4.2 对立三问题的不敏感
1.5 “文人“
1.5.1 一为文人便无足观
1.5.2 若为戏子,或有所为
1.6 告别
1.6.1 无友寡亲
1.6.2 要磨练自己,要有非常巨大的毅力,去克服一切种种“异己的”意识以至最微弱的“异己的”感情,然后才能从“异己的”阶级里完全跳出来,而在无产阶级里站稳脚跟
1.6.3 我留恋什么?我最亲爱的人,这美丽世界欣欣向荣的儿童。“我的”女儿,以及一切幸福的孩子们
1.6.4 永别了,美丽的世界
2 乱弹
2.1 世纪末的悲哀
2.1.1 病就在于世纪末,病就在于世纪末的悲哀,那是衷心不可救药的无穷无尽的悲哀
2.2 画狗罢
2.2.1 与其绘鬼,不如画狗
2.3 哑巴文学
2.3.1 朗诵运动,听得懂的新文学
2.4 一种云
2.4.1 从春天到夏天,从秋天到冬天,这样一年年过去,淫虐的雨,凄厉的风和肃杀的霜雪更番地来去,一点儿光明也没有。这都是云在作祟
2.4.2 难怪总是漫漫长夜了! 什么时候才黎明呢?
2.5 非洲鬼话
2.6 狗样的英雄
2.7 猫样的诗人
2.8 堂吉诃德时代
2.8.1 中国的《水浒》是一部名贵的文学典籍。模仿的有一万部
2.8.2 英雄所侍候的主人,充其量只是一个青天大老爷,英雄本身又会高明到什么地方去呢?
2.9 苦力的翻译
2.9.1 讽刺违心翻译
2.10 水陆道场
2.10.1 他们爱呢?又要害羞 思想,也要赶走。 出卖着自己的自由, 对着偶像磕头; 讨那一点儿钱, 还带一根锁链。
2.11 财神还是反财神?
2.11.1 财神的神通
2.11.2 狗道主义
2.11.3 红萝卜
2.11.4 ‘‘忏悔“
2.11.5 反财神
2.11.6 小白龙
2.12 《流铁》在巴黎
2.13 谈谈《三人行》
3 散论
3.1 《鲁迅杂感选集》序言
3.2 猪八戒
3.3 美国的真正悲剧
3.4 萧伯纳并非西洋唐伯虎
3.5 慈善家的妈妈
3.6 鬼脸的辩护
3.7 王道诗话
3.8 关于女人
3.9 真假堂吉诃德
3.10 透底
3.11 中国文与中国人
3.12 关于高尔基的书
3.13 ”非政治化“的高尔基
3.14 “美“
3.15 最艺术的国家
3.16 人才易得
3.17 择吉
3.18 《子夜》和国货年
3.19 ”打倒帝国主义“的古典

【读书笔记】《Android开发艺术探索》

这本书对初学者来说还是比较有深度的,知识覆盖面也比较广
虽然可能讲解的重点不一定都是你想看到的,但是对于安卓开发进阶来说是一本不错的总体概览书籍,能够get到一些实用的技能点

前后用了一个星期的时间来看,总体来说比较有参考价值的,阅读起来也没有太大难度

评价:三星半


#链接、图片、笔记文本
下面是印象笔记公开链接、XMind思维导图图片与文字

EverNote链接

图片:

Android开发艺术.png

文字:

Android 开发艺术探索
1 1 Activity生命周期和启动模式
1.1 生命周期
1.1.1 典型周期
1.1.1.1 onStart
1.1.1.1.1 Activity已经可见,但是没有出现在前台
1.1.1.2 onResume
1.1.1.2.1 Activity可见,出现在前台并且开始活动
1.1.1.3 onPause
1.1.1.3.1 可以做一些存储数据、停止动画等工作,但是不能太耗时
1.1.1.4 onStop
1.1.1.4.1 可以做一些重量级工作,但也不能太耗时
1.1.1.4.2 如果新Activity采用了透明主题,那么当前Activity不会回调onStop
1.1.1.5 从Activity A切换到Activity B
1.1.1.5.1 A先执行onPause,B再执行onCreate-onStart-onResume,最后才是A执行onStop
1.1.2 异常周期
1.1.2.1 被系统回收
1.1.2.2 当Activity并不是由我主动点击back键而丧失焦点时,onSaveInstanceState方法就一定会调用
1.1.2.2.1 google工程师们对onSaveInstanceState如此设计就是让其完成对一些临时的、非永久数据存储并进行恢复
1.1.2.2.2 Android的View本身自己就实现了onSaveInstanceState方法,这些控件自己就具有保存临时数据和恢复临时数据的能力
1.1.2.2.2.1 值得一提的是,只有当你给这个wiget在xml中指定id时,它才具有保存数据并且恢复的能力,并且不同的wiget还不能共用这个id,否则会出现数据覆盖的情况。
1.1.2.2.3 onRestoreInstanceState一旦被调用,其参数Bundle savedInstanceState一定是有值的
1.1.2.3 资源不足导致低优先级的Activity被杀死
1.1.2.4 Configuration改变导致的销毁重建
1.1.2.4.1 通过configChanges配置
1.2 启动模式
1.2.1 Activity的LaunchMode
1.2.1.1 standard
1.2.1.1.1 这种模式的Activity默认会进入启动它的Activity所属的任务栈中,但诸如ApplicationContext等Context并没有所谓的任务栈,需要在启动时添加FLAG_ACTIVITY_NEW_TASK,这样启动时就会为它创建一个新的任务栈,此时其实是以singleTask模式启动的
1.2.1.2 singleTop
1.2.1.3 singleTask
1.2.1.3.1 taskAffinity属性,配合singleTask使用,指定Activity运行的任务栈名,是一个字符串,Activity默认的栈名是Application的包名
1.2.1.3.2 singleTask模式的Activity切换到栈顶会导致在它之上的栈内的Activity出栈
1.2.1.4 singleInstance
1.2.2 Activity的Flags
1.2.2.1 FLAG_ACTIVITY_NEW_TASK
1.2.2.2 FLAG_ACTIVITY_SINGLE_TOP
1.2.2.3 FLAG_ACTIVITY_CLEAR_TOP
1.2.2.3.1 带此标记位启动Activity,启动它时,在同一栈中所有位于它上面的Activity都要出栈
1.2.2.3.2 一般会和singleTask启动模式一起出现,如果Activity已经创建,则调用onNewIntent
1.2.2.4 FLAG_ACTIVITY_EXCLUDE_FROME_RECENTS
1.2.2.4.1 相当于xml中声明 android:exludeFromRecents=”true”
1.2.2.4.2 Activity不会出现在历史Activity列表中
1.2.3 IntentFilter匹配规则
1.2.3.1 为了匹配过滤列表,需要同时匹配过滤列表中的action、category、data信息,否则匹配失败。只有一个Intent同时匹配action、category、data才算完全匹配,只有完全匹配才能启动目标Activity。
1.2.3.2 一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity
1.2.3.3 具体细则
1.2.3.3.1 action匹配规则
1.2.3.3.1.1 字符必须完全相同,一个过滤规则中可以有多个action,只要Intent的action能够与其中任意一个相同即可匹配成功
1.2.3.3.1.2 必须含有action项,可以有多个,只要其中一项能在intent-filter中找到匹配项就行
1.2.3.3.2 category匹配规则
1.2.3.3.2.1 可以没有,如果有,则必须全部被包含在intent-filter中
1.2.3.3.2.2 startActivity时默认含有android.intent.category.DEFAULT这个category
1.2.3.3.3 data匹配规则
1.2.3.3.3.1 与action类似
1.2.3.3.3.2 由两部分组成 mimeType和URI
1.2.3.3.3.2.1 URI
1.2.3.3.3.2.1.1 ://:/[][][]
1.2.3.3.3.3 如果为intent指定完整的data,必须调用setDataAndType,不能先setData再setType,因为这两个方法彼此会清楚对方的值
2 2. IPC机制
2.1 简介
2.1.1 缩写: Inter-Process Communication 进程间通信或者跨进程通信
2.1.2 进程与线程
2.1.2.1 线程是CPU调度的最小单元,线程是一种有限的系统资源
2.1.2.2 进程一般指一个执行单元,在PC或移动设备上指一个程序或者一个应用。
2.1.2.3 一个进程中可以只有一个线程,即主线程;在Android里的主线程也叫UI线程,由此引出ANR,线程
2.1.3 不是Android独有,Linux上可以通过命名管道、共享内存、信号量等来进行进程间通信。
2.1.4 Android中最有特色的进程间通信方式就是Binder,也支持socket
2.2 Android中的多进程模式
2.2.1 使用多进程的方法:在AndroidMenifest中指定android:process属性
2.2.1.1 以“:”开头的进程属于当前进程的私有进程,否则为全局进程,其他应用通过ShareUID方式可以和它运行在同一进程中
2.2.2 数据共享的问题
2.2.3 引发的问题
2.2.3.1 静态成员和单例模式完全失败
2.2.3.1.1 运行在不同进程中的四大组件,想通过内存来共享数据都会失败
2.2.3.2 线程同步机制完全失效
2.2.3.3 SharedPreference可靠性下降
2.2.3.4 Application会多次创建
2.3 基础概念
2.3.1 Serializable接口
2.3.1.1 是Java的一个序列化接口,只需在类中声明serialVersionUID标识即可自动实现默认序列化过程
2.3.1.1.1 标识用以辅助序列化与反序列化过程,反序列化时会检查和当前类是否一致(可能类被修改了,如添加了成员)
2.3.1.2 Serializable使用简单,但是含有大量IO操作,开销大
2.3.2 Parcelable
2.3.2.1 只要实现这个接口,一个类的对象就可以实现序列化,并且可以通过Intent和Binder传递
2.3.2.2 系统已经为我们提供了许多实现了Parcelable接口的类,如Intent、Bundle、Bitmap,同时List和Map也可以序列化
2.3.2.3 Parcelable稍显麻烦,但是效率很高
2.3.3 Binder
2.3.3.1 Android特有,可以理解为虚拟的物理设备
2.3.3.2 应用层来说,是客户端和服务端进行通信的媒介
2.3.3.3 主要用在Service中,包括AIDL和Messenger
2.3.3.4 手动实现Binder的步骤
2.3.3.4.1 声明一个AIDL接口,只需继承IInterface(只有一个asBinder方法)
2.3.3.4.2 实现Stub类和Stub类中的Proxy代理类
2.3.3.5 linkToDeath与unlinkToDeath
2.4 Android中的IPC
2.4.1 方式
2.4.1.1 Intent中添加extras
2.4.1.2 Binder跨进程通信
2.4.1.3 ContentProvider支持跨进程
2.4.1.4 网络通信,如socket
2.4.1.5 文件共享
2.4.1.5.1 并发问题
2.4.1.5.2 SharedPreference虽然本质也也是文件,但系统对它的读写有一定的缓存策略,所以不在进程间通信时使用
2.4.2 使用Messenger
2.4.2.1 一种轻量级的IPC方案,底层实现是AIDL
2.4.2.2 使用方法简单,它对AIDL做了封装
2.4.2.3 由于一次处理一个请求,因此在服务端我们不用考虑线程同步的问题(服务端不存在并发执行的情况)
2.4.2.4 实现步骤
2.4.2.4.1 服务端进程
2.4.2.4.2 客户端进程
2.4.3 AIDL
2.4.3.1 服务端
2.4.3.1.1 创建Service
2.4.3.1.2 创建AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明
2.4.3.1.3 在Service中实现这个接口
2.4.3.2 客户端
2.4.3.2.1 绑定服务端Service
2.4.3.2.2 将服务端返回的Binder对象转换成AIDL接口所属的类型
2.4.3.2.3 调用AIDL中的方法
2.4.3.3 AIDL接口的创建
2.4.3.3.1 支持的数据类型
2.4.3.3.1.1 基本数据类型
2.4.3.3.1.2 String CharSequence
2.4.3.3.1.3 ArrayList
2.4.3.3.1.4 HashMap
2.4.3.3.1.5 Parcelable
2.4.3.3.1.6 AIDL
2.4.4 ContentProvider
2.4.4.1 继承ContentProvider,实现六个方法:onCreate、query、update、insert、delete和getType
2.4.4.1.1 onCreate用来创建
2.4.4.1.1.1 在主线程中,不能进行耗时操作
2.4.4.1.2 getType用以返回MIME类型,如果返回null或者 /表示不关注
2.4.4.2 底层看来来像一个SQLite数据库,但其实对底层数据储存没有任何要求,可以使用普通文件,可以采用内存中的一个对象来进行数据存储
2.4.4.3 注册自定义的ContentProvider
2.4.4.3.1 android:authorities是ContentProvider的唯一表示,通过这个属性外部应用就可以访问我们的ContentProvider了,所以必须保证authorities唯一(可以加上包名前缀)
2.4.5 Sockete
2.4.6 Binder连接池
2.4.6.1 可以极大的提高AIDL的开发效率,并且可以避免大量的Service创建
3 3. View事件体系
3.1 基础
3.1.1 位置参数
3.1.1.1 left、right、top、bottom
3.1.1.2 3.0之后添加了x、y、translationX、translationY
3.1.2 MotionEvent与TouchSlop
3.1.3 VelocityTracker、GestureDetector、Scroller
3.1.3.1 获取速度前必须先计算速度
3.1.3.2 这里的速度是指一段时间内手指所滑过的像素
3.1.3.3 不需要使用时,需要调用clear方法来重置并回收内存
3.2 View的滑动
3.2.1 scrollTo、scrollBy
3.2.1.1 只能滑动View的内容,并不能滑动View本身
3.2.2 使用动画
3.2.2.1 将fillAfter属性设置为true可以保持动画结束后的view效果(但是view的四个顶点坐标并没有发生变化)
3.2.3 改变布局参数
3.2.4 比较: scrollTo/ScrollBy操作简单,适合对View内容的滑动 动画:操作简单,主要适用于没有交互的View和实现复杂的动画效果 改变布局参数:操作相对复杂,适用于有交互的View
3.2.5 eg:
3.2.5.1 具有跟手滑动效果的View:只需要重写onTouchEvent方法并处理ACTION_MOVE事件,根据两次滑动之间的距离就可以实现它的滑动。为了实现全屏滑动,需要采用动画的方式来实现(原书P134)
3.3 弹性滑动
3.3.1 使用Scroller
3.3.1.1 配合View的computeScroll方法完成,对View没有丝毫的引用,内部也不含有计时器
3.3.2 通过动画,一帧一帧地更新,设置动画的updateListener实现
3.3.3 使用延时策略
3.3.3.1 使用Handler或View的postDelay方法
3.4 View的事件分发机制
3.4.1 传递规则
3.4.1.1 dispatchTouchEvent
3.4.1.1.1 用来进行事件分发
3.4.1.2 onInterceptTouchEvent
3.4.1.2.1 用来判断是否拦截某个事件
3.4.1.3 onTouchEvent
3.4.1.3.1 dispatchTouchEvent中调用,处理点击事件,返回结果表示是否消耗当前事件
3.4.1.4 关系伪代码
3.4.1.4.1 public boolean dispatchTouchEvent(MotionEvent ev){ boolean consume = false; if(onInterceptTouchEvent(ev)){ consume = onTouchEvent(ev); }else{ consume = child.dispatchTouchEvent(ev); } return consume; }
3.4.1.5 结论
3.4.1.5.1 同一个事件序列内的事件不能分别由两个View同时处理(不包含特殊处理)
3.4.1.5.2 某个View一旦决定拦截,那么这一事件序列都只能由它来处理,并且它的onInterceptTouchEvent不会再被调用
3.4.1.5.3 如果View不消耗除ACTION_DOWN以外的其他事件,那么这个点击事件会小时,父元素的onTouchEvent并不会被调用,最终这些消耗的点击事件会传递给Activity处理
3.4.1.5.4 ViewGroup默认不拦截任何事件
3.4.1.5.5 View没有onInterceptTouchEvent方法
3.4.1.5.6 View的onTouchEvent默认都会消耗事件(返回true),除非是不可点击的(clickable和longClickable同时为false)
3.4.1.5.7 View的enable属性不影响onTouchEvent默认返回值。哪怕一个View是disable状态,只要它的clickable或者longclickable有一个为true,那么它的onTouchEvent就返回true
4 4. View工作原理
4.1 ViewRoot、DecorView
4.1.1 DecorView作为顶级View,一般会包含一个竖直方向的LinearLayout
4.1.1.1 一个是titlebar,一个是content,这也是setContentView所设置的对象
4.1.2 View层的事件都先经过DecorView,然后才传递给我们的View
4.2 MeasureSpec
4.2.1 一个32位的int值,高2位为SpecMode,低30位代表SpecSize
4.3 View工作流程
4.3.1 主要指measure、layout、draw
4.3.1.1 如何在Activity中获取view的宽高?
4.3.1.1.1 Activity#onWindowFocusChanged
4.3.1.1.2 view.post(runnable)
4.3.1.1.3 ViewTreeObserver
4.3.1.1.4 view.measure(int windthMeasureSpec, int heightMeasureSpec)
4.3.1.2 ViewGroup会逐个measure子view
4.3.2 layout过程
4.3.2.1 通过setFrame去设置子元素的四个顶点位置
4.3.3 draw过程
4.3.3.1 View绘制过程是通过dispatchDraw来实现的,dispatchDraw会遍历调用所有字元素的draw
4.4 自定义View
4.4.1 分类
4.4.1.1 onDraw
4.4.1.2 继承ViewGroup
4.4.1.3 继承特定View
4.4.1.4 继承特定ViewGroup
4.4.2 须知
4.4.2.1 让View支持wrap_content
4.4.2.2 如有必要,让其支持padding
4.4.2.2.1 在onDraw中取padding值,加入绘制参数计算
4.4.2.3 尽量不用Handler
4.4.2.4 View中如果有线程或动画,需要及时停止,View#onDetachFromWindow
4.4.2.5 View带有滑动嵌套时,处理好滑动冲突
4.4.3 xml属性扩展
4.4.3.1 1. values目录下创建xml
4.4.3.1.1 eg: <.declare-syleable>
4.4.3.2 2. 在View的构造方法中解析自定义属性的值并处理
4.4.3.2.1 eg: TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleView); mColor = a.getColor(R.styleable.CircleView_circle_color, Color.RED); a.recycle();
4.4.3.3 3. 在布局文件中使用自定义属性
4.4.3.3.1 s
5 5. RemoteViews
5.1 应用
5.1.1 通知栏
5.1.1.1 通过RemoteViews提供的方法来更新视图
5.1.2 桌面小部件
5.1.2.1 定义小部件界面
5.1.2.2 定义配置信息
5.1.2.3 定义实现类
5.1.2.4 在androidManifest中声明小部件
5.1.3 PendingIntent
5.1.3.1 内部的Intent相同,并且requestCode也相同即为相同;其中intent相同只需要ComponentName和intent-filter相同
5.2 内部机制
5.2.1 系统并没有通过binder去支持所有的view操作,仅支持了少量的view(TextView,ImageView等),这是出于效率考虑
5.2.2 提供了一个Action概念,Action实现了Parcelable接口,代表一个View操作;将这些actions放到ArrayList中,统一通过Binder进行通信,提高IPC效率
6 6. Drawable
6.1 分类
6.1.1 BitmapDrawable
6.1.1.1 android:antialias 抗锯齿
6.1.1.2 android:dither 抖动效果,开启这个选项可以让高质量的图片在低质量的屏幕上还能保持较好的显示效果
6.1.1.3 android:filter 是否开启过滤效果。当图片尺寸被拉伸或者压缩时,开启过滤效果可以保持较好的显示效果
6.1.1.4 android:tileMode 平铺模式。有 disable|clamp|repeat|mirror几个选项,开启平铺模式之后gravity属性会被忽略
6.1.2 ShapeDrawable
6.1.2.1 可以通过纯色构造,也可以是具有渐变效果的图形
6.1.2.2 android:shape —— rectangle/oval/line/ring
6.1.2.2.1 line 和ring两个选项必须通过stroke标签来指定线的宽度和颜色等信息
6.1.2.3 表示shape 的四个角度,只使用于矩形shape,这里的角度是指圆角程度,用px表示
6.1.2.4 与solid标签是相互排斥的,其中solid表示纯色填充,而gradient则表示渐变效果
6.1.3 LayerDrawable
6.1.3.1 对应的标签是 ,它表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果
6.1.4 StateListDrawable
6.1.4.1 对应的标签是,也是表示Drawable集合,每个Drawable都对应着View的一种状态
6.1.5 LevelListDrawable
6.1.5.1 ,集合中的每个Drawable都有一个等级的概念(level 0~10000)
6.1.5.2 如果被用来作为ImageView的前景Drawable,那么还可以通过ImageView的setImageLevel方法来切换Drawable
6.1.6 TransitionDrawable
6.1.6.1 ,用于实现两个Drawable之间的淡入淡出效果
6.1.6.2 可以用作View的背景,也可以在ImageView中直接作为Drawable来使用
6.1.7 InsertDrawable
6.1.7.1 ,可以将其他Drawable内嵌到自身当中,当一个View希望自己的背景比自己的实际区域小时可以采用
6.1.8 ScaleDrawable
6.1.8.1
6.1.9 ClipDrawable
6.1.9.1 ,根据自己当前level来裁剪另一个Drawable
6.2 自定义Drawable
6.2.1 通常我们很少自定义Drawable,因为自定义的Drawable无法再xml中使用
7 7. 动画
7.1 View动画
7.1.1 四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation
7.1.1.1 可以通过代码设置,也可用XML
7.1.1.2 既可以是单个动画,也可以由一系列动画组成
7.1.2 自定义View动画
7.1.2.1 方式:继承Animation类,重写initialize和applyTransformation方法,在initialize中做一些初始化工作,在applyTransformation中进行相应的矩阵变换即可,很多时候需要采用Camera来简化矩阵变换过程
7.1.3 帧动画
7.1.3.1 AnimationDrawable 顺序播放一组预先定义好的图片,类似于电影播放
7.1.3.2 帧动画使用比较简单,但是比较容易引起OOM,在使用时应尽量避免使用过多尺寸较大的图片
7.2 View动画的特殊使用场景
7.2.1 LayoutAnimation
7.2.1.1 作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果
7.2.1.2 步骤
7.2.1.2.1 定义LayoutAnimation
7.2.1.2.2 为子元素指定具体入场动画
7.2.1.2.3 为ViewGroup指定android:layoutAnimation属性
7.2.1.2.3.1 对ListView来说,这样Listview的item就具有出场动画了
7.2.1.2.3.2 除了xml指定,还可以通过LayoutAnimationController来实现
7.2.2 Activity切换效果
7.3 属性动画
7.3.1 简介: ValueAnimation、ObjectAnimation、AnimatorSet
7.3.2 使用属性动画
7.3.2.1 属性动画从API 11 才有,可以使用nineoldandroids来兼容老版
7.3.2.2 可以利用代码、XML形式实现 一般会采用代码形式
7.3.3 理解插值器和估值器
7.3.4 属性动画的监听器
7.3.4.1 主要接口:AnimatorUpdateListener和AnimatorListener
7.3.4.2 AnimatorUpdateListener比较特殊,它会对整个动画过程进行监听,动画每播放一帧,onAnimationUpdate就会被调用一次
7.3.5 对任意属性做动画
7.3.5.1 我们对object的属性abc做动画,如果想让动画生效,要同时满足两个条件:
7.3.5.1.1 object必须提供setAbc方法,如果动画的时候没有传递初始值,那么还要提供getAbc方法
7.3.5.1.2 object的setAbc对属性abc所做的改变必须能够通过某种方法反映出来,比如带来UI的改变之类
7.3.5.2 如果无法满足条件
7.3.5.2.1 1. 给你的对象加上get和set方法,如果有权限的话
7.3.5.2.2 2. 用一个类来包装原始对象,间接为其提供get和set方法
7.3.5.2.3 3. 采用ValueAnimator,监听动画过程,自己实现属性的改变
7.3.6 工作原理
7.4 使用动画的注意事项
7.4.1 OOM
7.4.2 memory leak
7.4.2.1 无限循环动画需要在Activity退出时及时停止,否则将导致Activity无法释放从而造成内存泄露
7.4.2.2 兼容性问题
7.4.2.3 View动画的问题
7.4.2.3.1 View动画是对View的影像做动画,不不是真正改变View的状态,有时会出现动画完成后View无法隐藏的现象,即setVisiblity(View.GONE)失效了,这时只要调用View.clearAnimation()清除View动画即可解决此问题
7.4.2.4 不要使用px
7.4.2.5 动画元素交互
7.4.2.5.1 新位置将无法触发单击事件
7.4.2.6 硬件加速
8 8. Window和WindowManager
8.1 简介
8.1.1 Flags参数、Type参数
8.1.2 windowManger提供三个常用方法:添加view、更新View、删除View
8.2 Window的内部机制
8.2.1 Window添加
8.2.1.1 使用到了桥接模式,内部使用WindowManagerGlobal统一委托实现
8.2.1.2 添加过程其实是一次IPC调用,binder模式
8.2.2 Window删除
8.2.3 Window 更新
8.3 Window的创建过程
8.3.1 Activity的Window创建
8.3.1.1 Window对象的创建是通过PolicyManager的makeNewWindow实现的
8.3.1.1.1 Window的具体实现类是PhoneWindow
8.3.1.2 步骤
8.3.1.2.1 如果没有DecorView,创建它
8.3.1.2.2 将View添加到DecorView的mContentParent中
8.3.1.2.3 回调Activity的onContentChanged方法通知Activity视图已经发生改变
8.3.2 Dialog的Window创建
8.3.2.1 创建Window
8.3.2.2 初始化DecorView并将Dialog视图添加到DecorView中
8.3.2.3 将DecorView添加到Window中并显示
8.3.2.3.1 Dialog的context必须使用Activity的,不能使用Application的context;一定要使用的话可以设定Window类型,声明alert权限(见书本P310)
8.3.3 Toast的Window创建
9 9. 四大组件工作过程
9.1 运行状态
9.1.1 除BroadcastReceiver外,其他三个都要在Manifest中注册
9.2 Activity的工作过程
9.2.1 performLauncherActivity最终完成Activity对象的创建和启动过程,并且ActivityThread通过handleResumeActivity方法来调用被启动的Activity
9.2.1.1 1. 从ActivityClientRecord中获取待启动的Activity组件信息
9.2.1.2 2. 通过instrumentation的newActivity方法使用类加载器创建Activity对象
9.2.1.3 3. 通过LoadedApk的makeApplication方法来尝试创建Application对象
9.2.1.4 4. 创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化
9.2.1.5 5. 调用Activity的onCreate方法
9.3 Service工作过程
9.3.1 分类
9.3.1.1 启动状态,用于执行后台计算任务
9.3.1.2 绑定状态,用户其它组件和Service交互
9.3.2 启动过程
9.3.2.1 利用ActivityManagerService
9.3.3 绑定过程
9.3.3.1 当多次绑定同一个Service时,onBind方法只会执行一次,除非Service被终止
9.4 BroadcastReceiver工作过程
9.4.1 注册
9.4.2 发送接受
9.5 ContentProvider
9.5.1 onCreate要先于Application的onCreate执行,这在四大组件中是比较少见的现象
9.5.2 步骤
9.5.2.1 1. 创建ContextImpl和Instrumentation
9.5.2.2 2. 创建Application
9.5.2.3 3. 启动当前进程的ContentProvider并调用其onCreate方法
9.5.2.4 4. 调用Application的onCreate方法
10 10. Android消息机制
10.1 概述
10.1.1 MessageQueue内部是单链表
10.1.2 Handler创建时会采用当前线程的Looper来构建内部消息循环系统
10.2 消息机制分析
10.2.1 ThreadLocal
10.2.1.1 是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储后只有在指定线程中可以获取到数据
10.2.1.2 若数据以线程为作用域且不同线程具有不同的数据副本时,可以考虑采用ThreadLocal
10.2.1.3 另一个使用场景是复杂逻辑下的对象传递
10.2.1.4 实现原理
10.2.1.4.1 set方法: public void set(T value){ Thread currentThread = Thread.currentThread(); Values values = values(currentThread); if(values == null) values = initializeValues(currentThread); values.put(this, value); }
10.2.2 MessageQueue
10.2.2.1 插入和读取,数据结构为单链表
10.2.2.2 读取操作中的next实质上是无限循环
10.2.3 Looper
10.2.3.1 退出:quit、quitSately quit——直接退出Looper; quitSafely——把消息队列中的已有消息处理完毕后才安全退出
10.2.3.2 在子线程中,如果手动为其创建了Looper,那么在所有事情完成后应该调用quit方法来终止Looper,否则这个子线程就会一直处于等待状态
10.2.4 Handler工作原理
10.3 主线程的消息循环
10.3.1 Android的主线程就是ActivityThread
11 11. Android线程和线程池
11.1 概述
11.1.1 AsyncTask底部用到了线程池和Handler
11.1.2 IntentService和HandlerThread则是直接使用了线程
11.1.3 IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出;IntentService作用很想一个后台线程,但是IntentService是一种服务,它不容易被系统杀死从而可以尽量保证任务的执行,直接使用后台线程的话,则很容易被系统杀死;
11.1.4 HandlerThread是一种具有消息循环的线程
11.2 主线程和子线程
11.2.1 主:进程所拥有的线程
11.2.2 子:执行耗时任务
11.3 线程形态
11.3.1 AsyncTask
11.3.1.1 封装了Thread和Handler,但不适合特别耗时的任务
11.3.1.2 泛型参数:Params、Progress、Result
11.3.1.3 核心方法
11.3.1.3.1 onPreExecute()
11.3.1.3.2 doInBackground(Params… params)
11.3.1.3.3 onProgressUpdate(Progress…values)
11.3.1.3.4 onPostExecute(Result result)
11.3.1.4 限制
11.3.1.4.1 必须在主线程中加载
11.3.1.4.2 对象必须在主线程中创建
11.3.1.4.3 execute必行在UI线程调用
11.3.1.4.4 不直接调用核心方法
11.3.1.4.5 兵行、串行的来回改版
11.3.1.5 工作原理
11.3.1.5.1 串行线程池
11.3.1.5.2 Handler切换线程,要求Handler来自主线程
11.3.2 HandlerThread
11.3.2.1 run中通过Looper.prepare()来创建消息队列,并通过Looper.loop()来开启消息循环
11.3.2.2 由于其run方法是一个无限循环,因此当明确不需要再使用HandlerThread时可以通过quit或者quitSafely来终止线程执行
11.3.3 IntentService
11.3.3.1 抽象类,必须建立它的子类才能使用
11.3.3.2 可以执行后台耗时任务,执行完成后自动停止
11.4 线程池
11.4.1 ThreadPoolExecutor
11.4.1.1 参数
11.4.1.1.1 corePoolSize
11.4.1.1.2 maximumPoolSize
11.4.1.1.3 keepAliveTime
11.4.1.1.4 unit
11.4.1.1.5 workQueue
11.4.1.1.6 threadFactory
11.4.1.1.7 RejectedExecutionHandler handler
11.4.2 分类
11.4.2.1 FixedThreadPool
11.4.2.2 CachedThreadPool
11.4.2.3 ScheduledThreadPool
11.4.2.4 SingleThreadExecutor
12 12. Bitmap的加载和Cache
12.1 高效加载
12.1.1 使用BitmapFactory.Options来加载所需尺寸的图片
12.1.1.1 使用inSampleSize设置采样率
12.1.1.2 如何获取采样率
12.1.1.2.1 1. 将inJustDecodeBounds 参数设为true并加载图片
12.1.1.2.2 2. 取出图片原始宽高信息,对应于outWidth和outHeight
12.1.1.2.3 3. 根据采样率规则并结合目标View所需大小计算出采样率inSampleSize
12.1.1.2.4 4. 将inJustDecodeBounds参数设为false,然后重新加载图片
12.2 缓存策略
12.2.1 常用LRU算法:Least Recently Used
12.2.1.1 LruCache实现内存缓存,DiskLruCache充当存储设备缓存
12.2.2 LruCache
12.2.2.1 使用support-v4包中的LruCache兼容性更好
12.2.2.2 是线程安全的
12.2.2.3 引用的几种类别
12.2.2.3.1 强引用
12.2.2.3.2 软引用
12.2.2.3.2.1 内存不足时会被gc
12.2.2.3.3 弱引用
12.2.3 DiskLruCache
12.2.3.1 创建
12.2.3.2 添加
12.2.3.3 查找
12.2.4 ImageLoader的实现
13 13. 综合技术
13.1 使用CrashHandler来获取应用信息
13.1.1 UncaughtExceptionHandler处理crash——记录、上报、用户提醒
13.1.2 使用方法
13.1.2.1 在Application初始化时为线程设置CrashHandler
13.2 multiDex解决方法数越界
13.2.1 1. 在build.gradle中添加multidex配置
13.2.2 2. 在代码中支持multidex功能
13.2.2.1 一、 在manifest中指定Application 为MultiDexApplication
13.2.2.2 二、 让应用继承自MultiDexApplication
13.2.2.3 三、 重写 application中的attachBaseContext方法(因为这个方法在onCreate之前执行)
13.2.3 3. 指定主dex文件所要包含的类——可以通过– main-dex-list指定
13.2.3.1 在build.gradle文件中添加afterEvaluate区域(见书P460)
13.3 动态加载技术
13.4 反编译
14 14. JNI和NDK
15 15. Android性能优化
15.1 性能优化方法
15.1.1 布局优化
15.1.1.1 include标签
15.1.1.2 merge标签
15.1.1.3 ViewStub
15.1.1.3.1 使用时才加载
15.1.1.3.2 暂时不支持merge
15.1.2 绘制优化
15.1.2.1 onDraw要避免执行大量操作
15.1.3 内存泄露优化
15.1.3.1 静态变量导致
15.1.3.2 单例导致
15.1.3.3 属性动画导致
15.1.4 响应速度优化和ANR日志分析
15.1.4.1 进程ANR会在/data/anr目录下创建traces.txt记录
15.1.5 ListView和Bitmap优化
15.1.5.1 避免getView中耗时
15.1.5.2 根据滑动状态来控制任务执行频率
15.1.5.3 BitmapFactory.Options进行采样
15.1.6 线程优化
15.1.6.1 线程池
15.1.7 建议
15.1.7.1 避免过多对象
15.1.7.2 不要过多使用enum
15.1.7.3 const使用static final修饰
15.1.7.4 使用Android特有的数据结构,如SparseArray和Pair,它们都具有更好的性能
15.1.7.5 适当使用软引用和弱引用
15.1.7.6 采用内存缓存和磁盘缓存
15.1.7.7 尽量采用静态内部类,可以避免潜在的由于内部类而导致的内存泄露

【读书笔记】《如何阅读一本书》——莫提默·J·艾德勒-,-查尔斯·范多伦

不愧为《大英百科全书》的编辑指导,书中所论书籍种类,大概把世间大部分的有形书籍都朗阔其中了

想成为一个阅读人吗?老觉得读书慢吗?不知道如何区分书籍的打开方式吗?

在这本书中或许能找到你想要的答案

书中信息含量很大,文末还有大量的阅读推荐(经典导读),我并未逐章看完,或许其中的很多章节在用到的时候可以翻阅,毕竟并不常读诗歌、戏剧等类别的书籍

睿智的你没准早已深谙阅读之法,当然也就不需要再听这些废话了


亚马逊链接

印象笔记链接

图片:

如何阅读一本书overview.png

笔记文本:

如何阅读一本书
1 第一篇 阅读的层次
1.1 一、 阅读的艺术与活力
1.1.1 这些新时代的传播媒体是否能增进我们对自己世界的了解?
1.1.2 主动阅读
1.1.2.1 阅读越主动,效果越好
1.1.2.2 阅读的艺术也在于尽可能掌握住每一种讯息的技巧
1.1.2.3 阅读的目标:为获得资讯而读,以及为求得理解而读
1.1.2.4 阅读就是学习:指导型学习,以及自我发现型学习之间的差异
1.1.2.4.1 要避免这样的错误——以为读的多就是读得好的错误
1.1.2.5 老师的出席与缺席
1.2 二、 阅读的层次
1.2.1 四个层次
1.2.1.1 基础阅读
1.2.1.2 检视阅读
1.2.1.3 分析阅读
1.2.1.4 主题阅读
1.3 三、 阅读的第一个层次:基础阅读
1.3.1 学习阶段的阅读
1.4 四、 阅读的第二个层次:检视阅读
1.4.1 一 有系统的略读
1.4.2 二 粗浅的阅读
1.4.3 阅读的速度
1.4.4 检视阅读的摘要
1.5 五、 如何做一个自我要求的读者
1.5.1 你在阅读时要提出问题来——在阅读的过程中,你自己必须尝试去回答这些问题
1.5.2 如何让一本书真正属于你
1.5.2.1 笔记方法
1.5.3 培养阅读的习惯
1.5.3.1 由许多规则中养成一个习惯
2 第二篇 阅读的第三个层次:分析阅读
2.1 六、 一本书的分类
2.1.1 从一本书的书名中你能学到什么?
2.1.2 实用性vs理论作品
2.1.3 理论性作品的分类
2.2 七、 透视一本书
2.2.1 使用一个单一的句子或最多几句话来叙述整本书的内容
2.2.2 将书中重要篇章列举出来,说明它们如何组织
2.2.3 结构与规划:叙述整本书的大意
2.2.4 驾驭复杂的内容:为一本书拟大纲的技巧
2.2.5 阅读与写作的互惠技巧
2.2.6 发现作者的意图
2.3 八、 与作者找出共通的词义
2.3.1 句子与主旨
2.3.2 找出关键句
2.4 九、 判断作者的主旨
2.4.1 找出主旨
2.4.2 找出论述
2.4.3 找出解答
2.5 十、 公正地评价一本书
2.5.1 受教是一种美德
2.5.2 修辞的作用
2.5.3 暂缓评论的重要性
2.5.4 避免争强好辩的重要性
2.5.5 化解争议
2.5.6 尊重知识与个人观点,在作任何论断之前,都要找出理论基础
2.6 十一、 赞同或反对作者
2.6.1 偏见与公正
2.6.2 判断论点是否正确
2.6.3 判断论述的完整性
2.7 十二、 辅助阅读
2.7.1 相关经验的角色
2.7.2 其他书可以当做阅读时的外在助力
2.7.3 如何运用导读与摘要
2.7.4 如何运用工具书
2.7.5 如何使用字典
2.7.6 如何使用百科全书
3 第三篇 阅读不同读物的方法
3.1 十三、 如何阅读实用型的书
3.1.1 说服的角色
3.1.2 赞同实用书之后
3.2 十四、 如何阅读想象文学
3.2.1 读想象文学的不要
3.2.2 一般规则
3.3 十五、 阅读故事、戏剧与诗的一些建议
3.4 十六、 如何阅读历史书
3.4.1 难以捉摸的失实
3.4.2 历史的理论
3.4.3 历史的普遍性
3.4.4 阅读历史书要提出问题
3.4.5 如何阅读传记与自传
3.5 十七、 如何阅读科学与数学
3.5.1 了解科学这一门行业
3.5.2 阅读科学经典名著的建议
3.5.3 面对数学问题
3.5.4 掌握科学作品中的数学问题
3.6 十八、 如何阅读哲学
3.6.1 哲学家提出的问题
3.6.2 现代哲学与传承
3.6.3 哲学的方法
3.6.4 哲学的风格
3.6.5 阅读哲学的提示
3.6.6 理清你的思绪
3.6.7 如何阅读经书
3.7 十九、 如何阅读社会科学
3.7.1 定义
3.7.2 难易
3.7.3 方法
4 第四篇 阅读的最终目标
4.1 二十、 阅读的第四个层次:主题阅读
4.1.1 主题阅读与检视阅读相结合
4.1.2 五个步骤
4.1.2.1 重点章节
4.1.2.2 共识
4.1.2.3 理清问题
4.1.2.4 界定议题
4.1.2.5 分析讨论
4.1.3 可观的必要性
4.1.3.1 面面俱到,并不预设立场
4.1.4 练习:进步论
4.1.5 如何应用主题书籍
4.1.5.1 启动阅读、建议阅读、指导阅读
4.2 二十一、 阅读与心智成长
4.2.1 好书能给我们什么帮助
4.2.1.1 不能囫囵吞枣
4.2.1.2 书的金字塔
4.2.1.3 生命与心智的成长
这是一本为阅读的人,或是想要成为阅读的人而写的书 针对发展阅读技巧


Powered by KyleCe

Copyright © 2015 - 2019 KyleCe All Rights Reserved.

访客数 : | 访问量 :