关于读书笔记:王爽汇编语言第4版读书笔记第910章

写这个系列文章的次要目标是记录书中重要的知识点,并和大家分享一些集体了解与实际。因为笔记中的知识点比拟零散,而书中零碎的介绍了一个 x86-16 处理器在实模式下的工作原理以及如何应用汇编语言与其进行“沟通”,所以举荐想要零碎学习的敌人们去学习这本书。当咱们把握了实模式的工作原理之后,就能够进一步钻研起初呈现的其余运行模式(如保护模式)。除此之外,相熟汇编语言有助于咱们把握下层语言(如 C)的执行原理,因为它们都要对汇编(机器码)进行形象,而汇编程序就是基于 CPU 的执行机理写进去的。 第九章转移行为分类段内转移(只批改 IP, 依据转移的范畴不同又分为:短转移 和 近转移)段间转移(同时批改 CS 和 IP)jmp 指令的两种实现差别在个别的汇编指令中,立刻数不管示意一个数据还是内存单元的偏移地址,都会在对应的机器指令中呈现。基于转移的间隔——指令中不蕴含目标地址,而蕴含的是位移量(向前或向后挪动的间隔) 长处,可浮动拆卸,即位移量不变的状况下,这段程序可在任何中央执行基于要转移的目标地址以上两个维度的汇总 基于转移的间隔(间接转移)基于要转移的目标地址(间接转移)段内转移jmp short Labeljmp Label、jmp near ptr Labeljmp 某一非法16位寄存器——将寄存器中的内容写入 IPjmp word ptr 地址——转移到目标偏移地址段间转移 jmp far ptr Label(注:它也可能实现段内转移的成果)jmp dword ptr 地址(h_word=段地址,l_word=目标偏移地址)jmp short Label: 翻译成的机器码为 EB??H , ?? 代表 8 位的位移量(这种形式是短转移) 实质为:IP = IP + 8位的位移量 【重点(容易被疏忽):CPU 在执行该指令时,是应用这个位移量来计算 IP 的】- short 指明此处的位移为 8 位位移,范畴是 -128~127, 用【补码】示意- 8位的位移量 = 标号处的地址 - jmp指令后的第一个字节的地址,编译器在【编译时】算出为什么是 jmp 指令后的第一个字节的地址aj?为什么这么设计呢?因为取址之后(执行之前)IP寄存器中的地址会被设置为该地址aj,这样在执行转移指令时,能够直接参与目标偏移地址的计算! 编译时:disp=as-aj, 执行指令时:IP(as) = IP(aj) + disp(位移量) 即间接实现该指令的性能jmp near ptr Label(近转移,实质与短转移雷同,区别仅仅是它反对16位的位移量)jmp far ptr Label(远转移) ...

April 3, 2023 · 3 min · jiezi

关于读书笔记:博弈论-人生何处不博弈

学而不思则罔,思而不学则殆。 —— 孔子 微信公众号已开启,菜农曰,没关注的同学们记得关注哦! 本篇带来的是蒋文华老师编写的《博弈论:每个人都能成为决策高手》 什么是博弈?字面形容中,博弈由两个字形成:博 和 弈。博弈是一种单方(多方)的反抗(较量),反抗总是在肯定的规定下进行,参与者必然会思考利用相应的策略(计策),并尽可能让本人获胜。 博弈论设计甚广,后续倒退基本上沿着以下4个方面开展: 对 纳什平衡 的弱化(或一般化)钻研对 纳什平衡 的精炼(或筛选)钻研对 博弈论 的根本假如的深入研究对 博弈论 的利用钻研事实上,博弈论早已从单纯对经济问题的钻研倒退成为对社会问题的钻研,并且在经济学以外的政治学、社会学、管理学等泛滥畛域都失去了广泛应用。 基于博弈论的重要性,小菜针对 《博弈论》 一书进行了笔记摘要,置信博弈论将成为解释抵触、建设单干、增进信赖、促成社会经济倒退的重要实践。 文中讲述了多种博弈模型,贴近生活也回味无穷。 一、概览1)博弈类型和结构化思维迷信的终点是分类,只有通过分类能力辨别事物之间的不同。 衣服会进行分类,书籍会进行分类,甚至身高、支出、智商等都可能进行分类。有了分类,事物才会变得有序。 博弈的分类有两种 动态博弈 和 动静博弈齐全信息博弈 和 不齐全信息博弈动态博弈和动静博弈动态博弈是指在博弈中,参与者同时抉择或虽非同时抉择单后行动者并不知道先行动者采取了什么具体口头(尽管在物理工夫上不是同时的,然而在逻辑工夫上是同时的)动静博弈是指在博弈中,参与者的口头有先后顺序,且后行动者可能察看到先行动者所抉择的口头以上推演到理论生存中: 石头剪刀布、招标流动就是 动态博弈 棋牌游戏、拍卖就是 动静博弈 有个实实在在的例子: 每个学校在课程完结后,都会要求学生给老师的课程评分,老师也须要对学生的问题评分,如果学生先评分,那么可能会影响到老师做出问题评分,如果老师先评分,那么可能也会影响到学生做出课程评分。那么这样一来,老师和学生之间就会互相牵制,难以确保评分真实有效。因而就会采取窃密的形式,学生先评分,然而对老师窃密,老师在进行学生问题评分后的一段时间能力看到学生对本人的评分。而这就是一种 动态博弈两者区别: 动态博弈 的参与者只能根据对对手策略或口头的设想做决策,比方 "石头剪刀布" 的游戏,你只能设想着对方会出"石头",而后你决定出"步"。 动静博弈 的参与者则是根据对手的理论抉择做决策。 齐全信息博弈与不齐全信息博弈齐全信息博弈 是指在博弈过程中,每个参与者对其余参与者的类型、策略空间以及损益函数的信息都有精确的理解。不齐全信息博弈 就是与齐全信息博弈相同,总有一些信息不是所有参与者都晓得的。以上推演到理论生存中: 教育、医疗和金融就是 不齐全信息博弈 相比之下,齐全信息博弈 少之又少,实在反映:生存原本就是不偏心的 结构化思维当某样货色能够从两个及以上不同的维度进行分类的时候,如果把两个维度组合在一个立体上,就能够构建出一种结构化的组合形式。 将下面说到4种博弈类型进行组合,咱们能够失去: 2)扩大认知纳什平衡平衡是指所有博弈参与者的最优策略组合。 纳什平衡的释义就是:给定你的策略,我的策略就是对我而言最好的策略(或之一);给定我的策略,你的策略也是对你的来说最好的策略(或之一),单方在对方给定的策略下曾经没有积极性调整本人已选的策略。 简言之:单方到了冷热化的底部,没有人违心偏离本人给定的策略状态 策略探索策略的三大属性: 策略的完整性策略必须是残缺的,意味着参与者把所有可能的状况都加以充分考虑,没有任何遗落(需长于利用分类,穷尽法) 策略的多样性策略总是多样的,意味着你其实有很多个策略能够抉择(A、B打算,留有一手,有恃无恐) 策略的不可察看性策略不同于口头,口头是具体的做法,策略是对口头的料想。依据一个人的行为来揣测一个人的策略有可能是错的(你认为的总是你认为的) 应急预案四因素残缺又清晰的信息分类,不能有脱漏责任到人的明确规定,遇到状况不能没有负责人提前准备好具体又可行的口头计划,让大家提前晓得怎么应答时效性,让大家晓得每一种口头的具体工夫要求一般来说,策略依靠四个相干的认知因素:多种多样的常识与教训,丰盛和全面的想象力,出奇甚至超强的分割构建能力,在事实条件下梳理与过滤策略可操作性的能力。感性假如感性是一个十分宽泛而又很难界定的概念 现实的三个规范: 偏好的齐备性和情境感性人对A、B的偏好肯定是基于某一特定的情境而言的。好比一个例子:发售一本杂志,杂志具备了电子版和印刷版,那么如何定价比拟正当? 计划A: 电子版 59 美元印刷版+电子版套餐 125 美元基于这种套餐,试验后果有 68% 的人数抉择电子版,而组合版只有 32% ...

August 21, 2022 · 2 min · jiezi

关于读书笔记:Spring源码之容器的基本实现

开篇本文次要基于SpringFramework5.2.0.RELEASE版本,源码的下载步骤在别的文章中曾经讲过,这里就不再赘述。 容器的根本用法咱们先创立一个简略的示例来看一下容器的根本用法。 创立一个简略的 Java Bean。 /** * @author 神秘杰克 * 公众号: Java菜鸟程序员 * @date 2022/3/15 * @Description 简略的bean实例 */public class MyTestBean { private String testStr = "testStr"; public String getTestStr() { return testStr; } public void setTestStr(String testStr) { this.testStr = testStr; }}创立一个简略 Spring 配置文件。 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myTestBean" class="cn.jack.MyTestBean"/></beans>ok,编写一个测试类进行测试。 /** * @author 神秘杰克 * 公众号: Java菜鸟程序员 * @date 2022/3/15 * @Description 测试类 */@SuppressWarnings("deprecation")public class BeanFactoryTest { @Test public void testSimpleLoad(){ final BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml")); final MyTestBean myTestBean = (MyTestBean) beanFactory.getBean("myTestBean"); assertEquals("testStr",myTestBean.getTestStr()); }}运行之后能够看到执行胜利,示例就这么简略。 ...

March 21, 2022 · 7 min · jiezi

关于读书笔记:Go语言设计与实现读书笔记第一部分

1.1 调试源代码1.1.1 编译源码下载Go1.4并装置到~/go1.4门路下(Go从1.5之版本开始实现自举,编译须要用到1.4版本。~/go1.4是编译时默认的读取门路,能够通过设置环境变量$GOROOT_BOOTSTRAP来指定): 官网:Downloads - The Go Programming Language 国内镜像:Go下载 - Go语言中文网 - Golang中文社区 批改源码,比方在fmt/print.go的Println函数打印时多加一句: /usr/local/go/src/fmt/print.go: ...273 func Println(a ...interface{}) (n int, err error) {274 println("hisoka")275 return Fprintln(os.Stdout, a...)276 }...切换到go的装置门路里的src目录(不可省略,否则报错),运行make.bash脚本: % cd /usr/local/Cellar/go/1.17.5/libexec/src% sudo ./make.bashBuilding Go cmd/dist using /Users/hisoka/go1.4. (go1.14 darwin/amd64)Building Go toolchain1 using /Users/hisoka/go1.4.Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.Building Go toolchain2 using go_bootstrap and Go toolchain1.Building Go toolchain3 using go_bootstrap and Go toolchain2.Building packages and commands for darwin/amd64.---Installed Go for darwin/amd64 in /usr/local/Cellar/go/1.17.5/libexecInstalled commands in /usr/local/Cellar/go/1.17.5/libexec/bin写个Hello World程序验证下成果: ...

December 30, 2021 · 1 min · jiezi

关于读书笔记:深入理解计算机系统读书笔记1高速缓存

开篇语:作为一个程序猿/媛,可能意识到高速缓存的存在,可能充沛高速缓存,热数据,可能将程序的性能晋升一个数量级。速度与存储大小成反比,速度与空间只能2选一,或者取其中的某个平衡点高速缓存工作示意图:CPU性能晋升的老本远低于晋升主存解决了速度的老本读写速度比照:L1缓存≈寄存器读写速度的3倍--逻辑核独占L1缓存L2缓存读写速度约为L1缓存的3~5倍--物理核独占,逻辑核共享L3读写速度约为L2缓存读写速度的4~5倍--所有物理核共享内存的读写速度约为L3的5倍左右存储器层次结构:

December 26, 2021 · 1 min · jiezi

关于读书笔记:思考致富-拿破仑希尔-小卜笔记

给人感觉似懂非懂,看来要再细读一遍,有很多原理,理论总结来说就是要先定下本人的指标,而后制订打算,口头起来,不要犹豫不要胆怯,保持向着指标进发。进发过程中要通过各种形式帮忙本人后退,比方智囊团等办法。从本人来说,17年至今,制订了许多指标,一一实现,每年读36本书,减肥,静止健身,每周三次100个俯卧撑,每天点滴记录日记,人总是一个含糊的感觉,感觉提高很大,又感觉没怎么提高,很神奇。不过本人定下的都是小指标,不是从大的指标下拆分下来的,明天开始制订一个大指标,拆分成小指标来一一实现。将致富欲望转换成等量经济收益的办法,由6个明确而实用的步骤组成。(1)在头脑里确定你渴望失去的精确金钱数量。仅仅说“我想要许多钱”是不够的,要指出具体数额(指标明确性有其心理方面的理由,下一章咱们将探讨这个问题)。(2)确定为了失去想要的钱,你打算付出多少代价(世上基本没有“劳而不获”这种事)。(3)为你打算占有所渴望的金钱提出一个明确时限。(4)为执行欲望指标制订一个明确打算,而后立刻贯彻这一打算,无论是否做好了筹备。(5)为你打算取得的金钱数额写一句表述清晰、精确的话,为它的实现指明时限,阐明为了失去这些钱你打算付出什么,并清晰形容你积攒下这些钱的打算。(6) 大声将写出的话读出来,每天读两遍,行将上床就寝之前一遍,早上起床时再读一遍。朗诵时,要看到、感觉到并置信本人曾经领有那笔钱。你能够将那些最适于本身须要的批示付诸行动。如果还没有将打算写进去,当初还来得及。保持想法。只管公司的劲敌千方百计阻挡西南航空公司进军航空业,然而,踊跃的进取心态激励他们在3年多的官司中、在毫无经营收入的状况下,始终没有放弃。想想乘客须要什么,而后满足他们的须要。采取积极行动,战败后退途中的艰难——即便战斗曾经打响,也要想方法战而胜之。始终迎接新机遇的到来。一旦呈现新机遇,就要采取踊跃的口头去抓住它们。养成坚忍不拔的习惯只须要通过4个简略步骤。实现这些步骤不须要你有过人的智力,不须要非凡的受教育程度,也不须要多少工夫或精力。这些关键步骤是:1. 以火热欲望作为实现能源的明确目标。2. 不停地用口头体现进去的明确打算。3. 所有消极或不良影响均无奈攻破的思维堡垒,这些影响包含亲戚、敌人和熟人的消极暗示。4. 结交一个或多个能激励你将打算和志愿贯彻到底的人。所有成就、所有辛苦所得的财产,最后都不过源于一种想法!如果你为承受胜利秘诀做好了筹备,那么你就领有了秘诀的一半,当另一半进入你的脑海时,你一眼便能认出它来。在第六感的帮忙下,对于即将来临的危险,你会适时失去正告以避开危险,还能及时发现并抓住机遇你首先要钻研、剖析并理解未来必须毁灭的3个敌人,它们就是犹豫、狐疑和恐怖!想法消极的人希图压服托马斯·A·爱迪生,说他不可能制作出一台能记录并再现人声的机器。他们说:“因为以前素来没有人造出过这样的机器。”爱迪生没有置信他们。他晓得,头脑能想出什么、置信什么,人就能造出什么;使他超脱于芸芸众生之上的正是常识。

November 8, 2021 · 1 min · jiezi

关于读书笔记:褚时健传-小卜笔记

读完了《褚时健传》,感觉褚老的那种折腾劲是与生俱来的,即便经验了人生重大挫折,大起大落,也能挺过去,七十多岁再次守业,一个橙子也能胜利?咱们年轻人为啥不去折腾呢?这不,我就来写知乎了。以下就是我整顿的书中的一些经典文字。要想做成一件事件,必须让相干各方可能利益均衡,都能从中获利。褚时健认为,做生意不能只想着让本人赚钱,适当让利,经常会取得更大的利益。而利益均衡也成了日后领导他在经营中做出决策的重要思路。“企业就是要挣钱的。”这是他从一开始就确定的想法。大略每个做事的人都会有一个最后的疑难:“为什么做这件事?”除了根本的生存,更高一层的意义在哪里?褚时健在糖厂期间,从根本的“把事件做好”而看到“做好”后的意义:对社会的、对政府的、对一般老百姓的。这种意义让他落实到了一点:企业的实质就是逐利。企业有了利润,能力实现本人的社会意义。第一车间,不光要有好的设施,还要保障原材料也要更好,因而把种植烟叶的农田设定为第一车间,保障了更好的原材料。把每一步都做到更好,能力生产出一流的烟。做软件做工程不也是这样么,每一步都做好,后果才是好的,同时还有pdca,打算,执行,监控,收尾一些列操作保障每一步都是最好的。从1981年褚时健引进第一台英国卷烟设施开始,他的视线曾经具备了国际化的高度。随着玉溪卷烟石的崛起,褚时健的国际化思路也在一直地调整。从引进国外设施、学习国外技术,到向国外销售香烟、出口创汇,再到输入技术、建设海内生产基地创收外汇,在不到10年的工夫里,褚时健曾经从烟草行业的无名英雄成为“亚洲第一,世界第三”企业的领导者。只有一直的学习提高,引进国外的先进技术,实际学习,再反向输入国外,其实就是一直学习不断进步的过程,只不过没有几人能过做到的,所以保持下总会有播种以及提高。昆明都还没有IMAX(巨幕电影),两人就想在玉溪也搞一家电影院。褚时健一点不排挤他们的想法,相同搬了椅子和两个人一起坐到桌子边,在纸上把电影院的客流量、一张电影票的分成、电费、人工、装修、五年的折旧,林林总总全副算了一遍。最初三人得出结论,在玉溪建一间电影院是齐全能挣钱的,褚时健也违心拿出钱来投资。做任何事不能糊里糊涂,不能说这个赚钱,那个赚钱,都要去做。稀里糊涂到最初盈还是亏都不晓得。简约,精密到角落的数字。看得出来,褚时健是用细到不能再细的条文束缚农户们必须往工厂化治理的方向上走,行也得行,不行也得行。监管到细节,每次施肥多少ml,掉落几个果子扣出多少钱等等,真是细节决定成败,把控好每个细节才是成败的要害。每做一件事都把他晓得最好,每一步骤每一流程都认真斟酌思考,把控好每一个环节才是最终胜利的要害。

November 7, 2021 · 1 min · jiezi

关于读书笔记:心安即是归处季羡林-小卜笔记

很久以前读了这本书,简略记录了一些内容,巨匠老年之后的心态是真的好。形容在延吉吃了一条鱼,鞭挞当初学术界以及官场溜须拍马的景象,然而几千年下来不都这么做的么?史记,三言二拍等等形容有时候尽管鞭挞了这个景象,可是何尝不是教诲人们学习这一套呢?写进去便有人可能学习,呵呵。我一贯主张,对小孩子和小动物这些弱者,入手打就是立功。我常说,一个人如果自认还有一点力量、一点权威的话,该当向敌人和好人施展,不论他们多强多大。向弱者发泄,算不上英雄汉。有人说“九十九分怠惰,一分神来(属于蠢才的领域)”。我认为,这个百分比应该纠正一下。七八非常的怠惰,二三十分的蠢才(能力),我感觉更符合实际一点。我丝毫也没有贬斥怠惰的意思。无论干哪一行的,没有怠惰,一事无成。我只是感到,如果没有能力而只靠怠惰,一个人倒退的极限是有限度的。突出的是因地而异,“地”指的首先是西方和东方。在西方,比如说中国和日本,提到本人的文章或著述,必须说是“拙作”或“拙文”。在东方各国语言中是找不到相当的词儿的。尤有甚者,甚至可能产生误会。中国人请客,发请柬必须说“洁治菲酌”,不理解西方习惯的西方人就会满腹疑团:为什么单单用“不丰硕的宴席”来请客呢?日本人送人礼品,往往写上“粗品”二字,西方人又会问:为什么不必“精品”来送人呢?在东方,对老师,对敌人,必须说真话,会多少,就说多少。如果你说,这个只会一点点儿,那个只会一星星儿,他们就会信以为真;在西方则不会。这有时会很危险的。至于吹牛之流,则为东西方同样所不齿,不在话下。

November 6, 2021 · 1 min · jiezi

关于读书笔记:金字塔原理-巴巴拉明托-小卜笔记

这本书次要是给大家总结了如何输入一段文字,如何把常识通过文字写进去,以下就是我整顿的读书笔记,以及最初本人的一部分分享。为什么用金字塔构造 归类分组,将思维组成金字塔:在书写或者表白的时候,须要把想要表白的货色归类分组,构建成一个金字塔。例如去买货色,买香蕉苹果能够归类为水果,土豆胡萝卜归类为蔬菜。自上而下表白,论断后行:表白的时候要自上而下,先要说出论断。这样大家才可能立即明确你要表白什么,否则如果不依照自上而下,对方很可能不能立即明确你要表白的重点是什么,到底要说什么。自下而上思考,总结概括:从底层开始,将句子依照逻辑程序组成段落,段落组成章节,章节组成残缺的文章。某几个具备逻辑关系的句子组成同一个段落,其中能够将这几个句子概括表达出来;而后会整理出来几个段落,这几个段落可能独特组成某一个章节的繁多思维,就行了一个章节;进一步的,章节再次概括归类造成了整个文章的主题思想。文章中的思维,须要合乎一个规定:纵向,任一档次的思维必须是下一层思维的概括;横向,每个组中的思维必须属于同一逻辑,每组中的思维必须依照逻辑程序组织。逻辑程序:工夫,空间,水平(重要性)。金字塔外部的构造(外部逻辑关系) 纵向关系,引起读者疑难并答复疑难,在视觉上使纵向的疑难-答复式对话关系清晰化。你的每一个表述都该当引发读者的疑难,而你也必须在这一表述之下的档次上,在横向上一一答复读者的疑难。横向关系,表述必须具备明确的演绎或演绎关系,但不可既具备演绎关系,又具备演绎关系。演绎性思维组是由几个承前启后的阐述组成的。第一个思维是对世界上的某种景象的表述,第二个思维是对第一个阐述句的主语或谓语所做的表述,第三个思维则阐明了以上两种状况同时在世界上存在时所隐含的意义。例如:所有的人都会死。苏格拉底是一个人。 因而苏格拉底会死。演绎关系,演绎性阐述中的思维能够相互关联,关键在于你能够用同一个名词示意思维组中的所有思维,比方反对的起因、拥护的起因、步骤、问题等。序言的构造,序言以讲故事的模式通知读者,对于你正在探讨的主题他已 经理解或将要理解的相干信息,从而引起读者的疑难,这个疑难也是整 篇文章将要答复的问题。如何构建金字塔 自上而下法(最容易的形式),首先构思出主题,依据主题构想出次要疑难,一一写出疑难的答复,再阐明该主题的背景起因,提出一些产生疑难的抵触,疏导读者针对抵触产生疑难(后面构想出的次要疑难),进而在答复这些疑难。沿着金字塔持续向下思考,是否会产生新疑难,并一一答复,针对为什么的状况要答复具体起因,仍然依照金字塔向下思考,丰盛内容。自下而上法(当没有想分明无奈构建金字塔顶部),首先列出所有要点以及问题,再找出各个要点/问题的逻辑关系(因果关系),针对这些要点问题总结演绎出起因,得出结论。初学者注意事项,先尝试自上而下法;序言先写背景,将背景作为序言的终点,背景、抵触、疑难和答复;首先思考序言,不要省略这一步,要防止开始论证时还在想背景或抵触;将背景放到序言中,首先通知读者你的背景,而不是到文章主题中;要害句档次上应用归纳推理比应用演绎推理更容易使读者承受你的观 点,因为归纳法更易于了解。序言的具体写法 序言的故事构造,讲故事的时候能够吸引读者趣味,为了让读者抛开其余思维,专一于你的话题。引入背景的机会,即可能将你锁定在特 定的工夫和空间,从而为讲故事做好筹备。当读者批准你的观点后,引发了读者的回应,为什么给我讲这个?进而引出背景中的抵触。“抵触”相似于讲故事时推动情节倒退的因素,可能促 使读者提出“疑难”。序言该当采纳“背景—抵触—疑难—解决方案”的构造。序言的目标是“提醒”读者而不是“通知”读者某些信息。序言必须蕴含故事所须要的3个因素,即“背景”“抵触”和“答案”。序言的常见模式,收回批示式(针对“咱们应该做什么”或“咱们应该如何做”等 问句)。申请反对式(针对“咱们是否应该这样做”等问句)。 解释做法式(针对“咱们应该如何做”等问句)。比拟抉择式(针对“咱们应该做什么”等问句)。演绎推理与归纳推理 演绎推理的步骤,论述世界上已存在的某种状况;论述世界上同时存在的相干状况,如果第二则表述是针对的 是第一则表述的主语或谓语,那么就阐明这两则表述是相干的;阐明这两种状况同时存在时隐含的意义。也能够是另外一种步骤:呈现的问题或存在的景象;产生问题的本源、起因;解决问题的计划。归纳推理,进行归纳推理时,大脑首先要发现若干事物(思维、事件、事实)的共性,而后将其归结到一起,加以阐明。正确定义一组思维。利用归纳法时,必须具备以下两项次要技能:找到一个可能示意该组所有思维共性的名 词。辨认并剔除该组思维中与其余思维不相称(不属同类、无独特 点)的思维。演绎推理与归纳推理的区别:演绎推理,第二点是对第一点主语或谓语的阐述。归纳推理,同组中的思维具备某种共性。应用逻辑程序 工夫程序,依照工夫程序组织的一组思维中,要依照行 动的程序(第一步、第二步、第三步......),顺次表述达到某一后果必 须采取的口头。另外步骤不宜过多,最多五个,多了他人看着也烦,也不容易看懂。主题句是要达到的后果,表述思维的程序与采取行动的程序(第一步、第二步、第三步)统一。构造程序就是当你应用示意图、地图、图画或照 片设想某事物时的程序。创立逻辑构造,建设起构造后,就能够依照自上而下、从左向右的程序来逐个形容各个局部了。在解决逻辑构造时常常会设想一下与之相干的逻辑过程,尤其 是在对已有构造提出批改倡议时。也能够用构造程序的概念查看在分组过程中是否有逻辑谬误。水平程序,也称重要性程序。这是你对一组因 为具备某种独特特点而汇集在一起的事物进行陈说或剖析时采纳的顺 序,比方3个问题、4个起因、5个因素等。表白者经常会将思维简略罗 列出来,不足深刻思考。首先创立分组,将所有具备该个性的问题列入一组。而后,在每组中,根 据各个问题具备该个性的水平高下排序——该个性最显著的问题排在第 一位,即先强后弱,先重要后主要。分别、调整不失当的分组一个假设的分组,辨识其正确的分组根底,能够帮忙你更清晰地表白本人实在的思维。概括各组思维 总结句防止应用“不足思维”的句子,“不足思维”的句子对读者而言枯燥无味,难以继续吸引读者的留神 力,不能疏导读者持续往下读,读者可能根本无法理解你想表白的思维。概括口头性思维(介绍采取的口头、行为、步骤、流程)时,应 阐明采取行动后的“后果”(成果、达到的指标)。概括描述性思维(介绍背景、信息)时,应阐明这些思维所具备 的“共同点的含意”(共同点的意义)。阐明采取行动的后果/指标,比如说解决策略问题,能够批改为指定明确的长期策略。在表述口头、步骤、流程等时,最简略的理顺思路的办法,就是设想本人的确采取了这些口头,而后依据实现这些口头将产生的后果批改各个步骤的措辞,使之更明确、更具体。找出各论断之间的共性,找出将这些思维分割在一起的构造上的共性。寻找这些思维间更亲密的分割。实现演绎跃进,概括出主题思想。界定问题 界定问题的框架,将问题开展,确定你的解决方案处于哪一阶段(曾经提出了,还是曾经被承受了)。提出适当的疑难。查看序言是否阐明了界定的问题。查看金字塔是否答复了疑难。开展问题的各因素,问题的四个因素:切入点/尾声。困扰/困惑。现状(R1,非冀望后果)。 指标(R2,冀望后果)。挖掘读者的疑难,不晓得如何将R1转化为R2。晓得如何将R1转化为R2,但不确定是否正确。晓得将R1转化为R2的正确计划,但不晓得如何施行。晓得将R1转化为R2的计划,并且曾经施行,但在施行过程中发 现计划行不通。制订了好几个解决方案,但不晓得选哪一个。开始写序言,定问题的框架大多会依照逻辑程序列出问题的各形成因素,这样能够很容易地把这些因素用在序言中。只有遵循从左到右再向下的准则即可,读者最初看到的通常是抵触局部。结构化分析问题 从信息材料动手,无论客户存在什 么问题,都从剖析全公司或全行业动手。读书笔记 从书中失去了什么 如何输入本人的思维 如何构建思维,将其变为金字塔 自上而下 自下而上 输入的内容之间的关系 横向 纵向 发现问题 解决问题 提出思路 逻辑程序 。 工夫程序 。 构造程序 。 水平程序和本人的关系 。 很少书写 。 更多表白 。 如何表白 表白什么 。上面这个是读完这本书的最初总结写了一段,整理出来,算是学习的一个阶段的输入。        明天是浏览《金字塔原理》的第七天,也是跟着大大们一起的第一本书,依照第七课要求,输入下笔记,以及本人的一些思路。        首先说说这本书,次要给我这样个小白讲述了如何去书写出一本书的形式办法,如何依照金字塔的形式自上而下或者自下而上的构建出金字塔的模式,书写过程中的如何可能吸引读者的技巧。其实也是如何构思本人的思考形式,把本人要思考的一些问题逐层自上而下合成,或者头脑风暴进去的货色归类,自下而上总结,不肯定是书写,兴许是本人做事学习的形式办法,比方你想要买股票基金,必定要首先去学习股票基金基础知识,自下而上的搭建进去一套适宜本人的炒股养基的办法,这个只能是边摸索边总结。        其次在说说和本人的关系,以前读书很多时候都是大段大段的copy到本人的有道云笔记上,顶多本人写点小的针对copy过去内容的总结,这次变了,依照宽广老师的形式,读了这本书,尽管还没有读完,然而曾经开始书写这段不晓得大家是否读起来不晓得是不是有些无聊的货色。其实把书中学习到的常识,总结起来用到理论过程中,终归是好的,有益于本人的。        最初聊聊如何用,其实这是最重要的,书里有很多技巧,什么自上而下,自下而上,逻辑程序,都非常根底,写这段之前,列出要写的要点,并把他们归类分组,列出提纲,每段讲哪些内容,依照什么程序输入?可是我很少写货色,所以感觉更加适宜我的是一些面对面沟通的场景,实际上是统一的,在和他人沟通前,也要整顿下本人要说的要点,把要沟通的内容归类,依照何种程序去与对方沟通,是依照工夫程序,构造程序还是水平程序呢?每次能够依照不同的形式尝试去沟通,去理论的体验下到底用哪种形式更适宜本人,书上写的不肯定都对,然而试验过去才晓得它到底对不对是么?        这是第一次输入了这么多文字,心愿不是最初一次,后边没事写写,在忙乱中静下心来去思考,每天进步一点本人,一年后便是1.01的365次方倍的本人了。 ...

November 4, 2021 · 1 min · jiezi

关于读书笔记:如何阅读一本书莫提默J-艾德勒-查尔斯范多伦

十分不错的书,咱们很多人理论都不会读书,这是一本训练如何浏览的书籍,倡议多读几遍,以下是我画的思维导图,明天就不怎么是文字版了。 浏览历史的两个要点是:第一,对你感兴趣的事件或期间,尽可能浏览一种以上的历史书。第二,浏览历史时,不只有关怀在过来某个工夫、地点真正产生了什么事,还要读懂在任何时空之中,尤其是当初,人们为什么会有如此这般口头的起因。

November 3, 2021 · 1 min · jiezi

关于读书笔记:价值我对投资的思考张磊-小卜笔记

张磊作为投资界的大神,写进去的货色还是须要本人细细去读去了解的,兴许一遍并不能齐全了解,须要多来几遍。咱们几个守业搭档还有一些独特的特点:第一,素来都不晓得怎么赚钱,但善于学习;第二,素来都不感觉有什么货色是学不会的,在学习上十分违心花工夫,一直吐故纳新;第三,在实践中学习,边学边干,边干边学;第四,热衷于推心置腹地分享,发表本人实在的想法和意见,不去争执谁是对的,而是去争执什么是对的;第五,热爱读书,遇到一本好书便彼此分享读书心得,举办围炉夜话和读书沙龙。实体经济是国家倒退的基本,而先进的制造业则是强振实体经济的要害。就像福耀团体董事长曹德旺所说:“扭转这个世界的,肯定是制造业。”所以,一旦科技与制造业相结合,就能够实现传统产业的再造新生,帮忙制造业等传统产业继续一直地发明价值。“最好的技术不是颠覆,而是激发实体产业的微小潜能”这一重要命题。正如周胜馥所说:“每个年代都有不同的机会,咱们这个时代最大的机会,就是挪动互联网。”格局观。最大的实质上的区别就是格局观,就是看他有没有格局,看事件是不是久远,能不能从久远的视角掂量本人。同时,格局观不光在于看事件是否久远,还在于是否看清事件的实质,是否看清人的实质,对组织是否有通透的了解,这些都反映出一个人的格局。到最初,投资人比的是品质和心性,企业家比的是品质和格局观。建设了一个本人的剖析框架(framework),这个剖析框架最早叫人与生意,咱们想投资坏蛋、好生意;起初进化到人、生意和环境,咱们会将人与生意放到环境中去考量;最初咱们的剖析框架又拓展为人、生意、环境和组织,咱们会进一步思考它是什么样的组织。在少数人都醉心于“即时满足”(Instant Gratification)的世界里时,懂得“提早满足”(Delayed Gratification)情理的人,曾经先胜一筹了。永远不要把买入老本当作卖出的决策依据。期待在投资中是一项极具挑战又极有价值的事件,有时候须要期待1年,有时候须要期待10年。期待也是一种被动,期待不是什么都不做,放弃急躁期待的最好做法就是对无关的事件连想都不要想,始终分明什么是该做的、什么是不该做的。价值投资者还要有一个重要涵养,就是不要做机械的价值投资。那么什么是机械的价值投资?简言之就是机械地长期持有、机械地寻找低估值、机械地看基本面。怎么了解机械地长期持有、机械地寻找低估值、机械地看基本面。首先,长期持有只是后果,而不是目标。长期持有只是价值投资的某种外在表现形式,有些价值的实现须要工夫的积攒,有些价值的实现只须要环境的重大变动,所以不能说长期持有就是价值投资,非长期持有就不是价值投资。其次,购买低估值的股票并不是价值投资回报的继续起源,企业继续发明价值才是。特地是在以后的市场状况下,很难找到账面价值低于外在价值的投资标的。比寻找低估值更重要的是了解这只股票为什么被低估,是否从更高的维度上发现长期被低估的股票。最初,很多时候基本面投资往往是趋势投资,是看行业的基本面或经济的周期性,实质上也是博弈性的。咱们所了解的价值投资,不仅仅要看到生意的宿命论,还要关注创业者的主观能动性,关注环境、生态的变动,这些都会扭转生意的属性。因而,价值投资的前提是对公司进行长期的、动静的估值,寻找继续发明价值的确定性因素。

November 2, 2021 · 1 min · jiezi

关于读书笔记:钱七步创造终身收入托尼罗宾斯-小卜笔记

这本书非常不错,理财入门级别书籍,简略容易上手,我其实就是读了一些理财书开始的购买一些基金的,收益还不错,留神不要买股票不要买股票。主题是托尼·罗宾斯的专长,他钻研了30多年,总结出做好三大决策关系到你人生的最大幸福。第一,关注什么。你关注的是你失去的还是你失去的,你能管制的还是你不能管制的。第二,有什么意义。意义就等于情绪,情绪就等于生命。有意义你才有激情,有激情才是真正的生命。第三,要做什么。关注带来意义,意义带来激情,激情激发状态,状态激发口头——继续的口头,口头最终带来扭转,从此扭转你的人生。取得足够多财产的秘诀很简略:找到一条路,让本人能为别人做得更多,比其他人做得都多。让本人变得更有价值。做得更多,给予更多,承当更多,服务更多,你总有机会赚得更多各种新技术不断涌现,让金融体系更加欠缺,但设计这个金融体系的目标如同不是帮忙咱们让本人手里的钱增值更多,而是让咱们手里的钱变得更少,跑到他人腰包里的钱更多。预测是终极力量!失败者预先才做出反馈,领导者事先就能做出预测。失去一种后果的最好和最快的办法就是找到一个楷模,这个楷模曾经做成了,你只有模拟他的行为就行了。全力以赴地寻找那些卓越人士的过人之处。为了找到一种卓有成效的策略,你必须去找那些做得最优良的人,他们的胜利久经考验。你如果追寻他们的策略,播下了同样的种子,就会播种同样的果实。咱们往往从失败的人身上学习!你有多少次是从夫妻关系十分蹩脚的人那里寻求搞好夫妻关系的倡议的?你有多少次是向一个始终为超重而挣扎的人寻求保持身材的倡议的?有多少人接管的信息反而强化了他们永远无奈扭转本人身材的错误想法?为什么要听这种只有副作用的信息?因为没方法,他们四周都是那些身材不好的敌人或者家人。咱们寻求投资理财的倡议也是同样的状况。咱们向那些并没有真正积攒到相当多财产的人求教,因此失去的投资倡议不是良药而是毒药,它们只会让本人陷入劫难。这只会增强你原来的信念,用什么方法都没用。其实,基本不是用什么办法都没用,只是因为你学习的是那些不胜利的人的不胜利的策略,谬误的策略,而这些策略是有效的。第一步:当初就做出你毕生最重要的财务决策吧!当初就决定成为一名投资者,而不只是一名消费者吧。要做到这些,你只须要决定从工资收入中拿出一部分钱,坚定不花,用它来做储蓄和投资,这些钱只是为了你和你的家庭创立更加美妙的将来,而不为其余任何人。分明的晓得本人财产自在须要多少钱?我的是400万。 读完书后有11个问题,也是我本人的解答,你的答案是什么呢?你有没有花工夫好好排汇后面12篇简短访谈外面的精髓?要晓得我拜访的这12集体都是世界上投资理财的最强大脑,都称的上是有史以来最平凡的投资巨匠。谁是“宇宙投资巨匠”,他取得了什么样的投资收益,和包含沃伦·巴菲特在内的其余任何人相比怎么样?如果你想的话,怎么能跟他一起投资?--卡尔·瑟雷安·伊坎,比巴菲特高出总计均匀50%的盈利,寻找能力强的的经理人治理的公司的股票你从耶鲁大学的戴维·斯文森、摩根大通资产治理团体的首席执行官玛丽·卡拉汉·厄道斯那里,对于资产配置你学到了什么货色?--不要让任何一类投资占比超过30%,必须要扩散投资,长期投资,定期调整从指数基金巨匠约翰·博格那里,从末日博士麦嘉华那里,你学到了什么?--尽量抽离感情因素,如果抽离不了就读几本坚持到底的书籍。扩散投资,不要适度交易,长期持有,急躁期待机会买入。不要置信理财投资广告。投资低成本指数。你有没有体会巴菲特当初举荐给所有人的简略投资策略,包含他的妻子和他的遗产信托基金?--长期持有投资指数基金。你有没有深刻领会如何抓住危险—收益不对称的投资机会的重要性?--同下一个问题你有没有充沛了解保罗·都铎·琼斯给你讲的那个价值10万美元工商管理硕士的一堂课,收益—危险不对称比例起码不少于5∶1,而且总要借助于大趋势的力量?--肯定要适应趋势,不要逆向投资,如果始终在200日平均线上运行的忽然跌破了200日平均线,则立即卖掉。5:1是靠1美元的危险去拼5美元的盈利,这样即便80%时候是错的,也可能不亏钱,然而个别不会在80%时候都是谬误的。你有没有认真观看瑞·达利欧制作的视频《经济机器是如何运行的?只用30分钟就能轻松把握》?--读了两遍,了解了你深刻领会凯尔·巴斯让你投资相对不会亏损的投资之道了吗?还记得5美分硬币的投资威力吗?投资5美分硬币,美国政府永远确保你的投资相对不会亏损,而且你会有20%~30%的潜在上行收益。--找到不会亏损投资,必然会盈利,肯定要留神危险,把危险升高到最低甚至没有危险。你深刻理解查尔斯·施瓦布讲的内容外围了吗?你深刻理解约翰·邓普顿爵士的投资秘诀了吗?你要是真懂了,市场就会继续一直地送给你大礼,前提是你可能明确,最坏的市场环境是你最好的投资机会,在整个世界就要“完了”的时候,可能放弃最乐观的投资态度,就像“二战”,就像拉丁美洲通货膨胀,就像美国20世纪30年代的经济大萧条,就像“二战”之后的日本?你有没有深刻理解约翰·邓普顿爵士真正的外围策略投资哲学,这让他成为历史上第一个进军国内投资的亿万富翁?--在大家全副都恐怖的时候就是入场的机会,然而要留神,这个时候真的是大家都恐怖么?卖出就是你找到更好的投资机会,而且还要比以后的价格便宜一半。扩散投资,长期持有。你明天会采取什么口头,像这些万里挑一的投资巨匠那样去投资?--曾经持续一年半把工资的一部分投入到指数基金了,还再购买一些低估的优良的股票,继续的一直批改本人的实践。

November 1, 2021 · 1 min · jiezi

关于读书笔记:驾驭周期自上而下的投资逻辑乔治达格尼诺-小卜笔记

与消费者幸福感有间接分割的最重要的指标是每个月公布的就业人数报告。就业人数的强劲增长意味着经济的走强,消费者支出的减少会刺激他们的生产。就业人数增长的放缓则意味着消费者因为支出增长幅度的降落而不违心过多收入,他们会在生产上变得更加小心谨慎。当失业率维持在一个绝对稳固的低点时,阐明目前的劳动力紧缺,经济的扩张靠近于饱和的状态。因为当先指标对经济具备疏导作用,所以当先指标增长幅度的变动同样当先于同步指标增长幅度的变动。当当先指标综合指数的增速开始放缓的时候,同步指数的增速将在若干个月之后呈现降落。另一方面,当当先指数开始减速上涨时,同步指数的增速也将在若干个月之后呈现上涨。当先指标(例如:货币供应)在上涨大概两年之后,同步指标(例如:工业生产)才会呈现上涨。 落后指标(例如:利率)在工业生产指标持续增长的1.5~2年之后才会开始上涨。当先指标(例如:货币供应)达到其峰值的几个月之后,落后指标才会呈现上涨。当先指标(例如:货币供应)的增速呈现降落1年,或者1.5~2年当前,经济增速将会呈现放缓的迹象(例如:工业生产)。工业生产的增速降落几个月后,落后指标(例如:利率)的增速才会降落。落后指标(例如:利率)上涨速度的升高,会通过几个月之后当先指标(例如:货币供应)的上涨失去体现。经济周期第一阶段的次要特色能够演绎为以下几点: 货币供应的增长呈疾速回升之势。美元的环境失去改善。美元贬值。股票市场处于上涨之中。尽管生产、销售、支出和待业的增长状况使得经济处于稳固和回升的阶段,然而增长速度依然位于其增长后劲程度之下。企业的利润触底之后开始反弹。大宗商品继续走弱并最终见底。短期利率继续上涨并最终见底。长期利率继续上涨并最终见底。通货膨胀继续降落并最终见底。只管短期利率和长期利率具备独特的周期反转点,然而短期利率要比长期利率的稳定幅度更大。正因为如此,短期利率的稳定对于投资者判断货币市场环境及其趋势来说是个十分实用的信号。 经济周期第二阶段的次要特色能够演绎为以下几点。 货币供应继续疾速减少并见顶。美元放弃强势并见顶。股票市场持续上涨并见顶。通过产量、销售额、支出和就业率的增长状况进行掂量的经济将会在其增长后劲程度之上快速增长。企业的利润疾速减少。大宗商品价格强势上涨。短期利率上涨。长期利率上涨。通货膨胀回升。7.经济周期第三阶段的次要特色能够演绎为以下几点。 货币供应增速继续降落。美元走势绝对疲软。美元升值。股票市场朝气蓬勃。股票市场走弱。通过产量、销售额、支出和就业率的增长状况进行掂量的经济将会加速,并且最终位于其长期增长后劲程度之下。企业利润增长见顶后开始降落。大宗商品价格见顶后开始降落。短期利率见顶后开始降落。长期利率见顶后开始降落。通货膨胀继续上涨后开始降落。经济周期第四阶段的次要特色能够演绎为以下几点。 货币供应增速继续降落,只有短期利率见顶,货币供应就会减少。美元走势先抑后扬。股票市场尽管持续低迷,然而会逐步向好。通过产量、销售额、支出和就业率的增长状况进行掂量的经济将会继续上行。企业利润继续降落。大宗商品价格疲软。短期利率降落。长期利率降落。通货膨胀降落。收益率曲线反映的是长期利率和短期利率之间的差。短期利率低于长期利率意味着银行发放贷款的志愿是十分强烈的;此外,这还是美联储施行宽松货币政策的信号。当收益率曲线的走势比拟平坦时,阐明长期利率和短期利率之间的差在降落,美联储正在施行收紧的货币政策;因而,因为贷款者并没有很强的志愿去满足借款者对资金的需要,所以经济的增速会十分迟缓。为了与金融周期的趋势和所处阶段保持一致,投资者须要跟踪M1、M2、M3和MZM的变动状况,因为货币供应的增长幅度会通知你经济将要产生什么。如果货币供应开始疾速减少,则表明美联储的这一动作是产生在经济增长十分迟缓的期间,投资者该当预期经济将在将来1~2年内走强。如果货币供应以靠近15%的速度增长,那么经济将在将来变得十分强劲。对于投资者来说,股票会因为流动性的疾速减少而体现十分坚挺。货币供应增长见底大概两年之后,经济的增长也将触底。当经济的增长见底大概两年之后,短期利率和长期利率开始上涨。紧跟着短期利率和长期利率上涨而来的是货币供应增速的放缓,货币供应增长见顶。货币供应增长的高峰过后,经济增长见顶。在货币供应增速降落2~3年后,利率见顶也随之降落。而利率的上涨也将导致货币供应的快速增长。“利率的上涨导致股票市场处于高风险”这样的内容。实际上,这种模式的表述是不精确的。这是因为,货币老本的回升导致企业和消费者借款志愿的降落,进而导致经济体系中流动性总量的降落,因而,理论影响股票市场的因素是货币供应增速的降落。利率的上涨导致了债券价格的上涨;换句话说,长期利率上涨,债券价格上涨。因为息票的利率是由借款人在合同中确定的,因而,长期利率的上涨会导致债券价格的上涨,反之,长期利率的上涨会导致债券价格的上涨。流动性也是投资者买入或者卖出债券的时候该当思考的重要因素。什么时候才是买进债券的最佳时机呢?答案是,当经济和所有的指标因为货币供应和大多数当先指标的继续降落而放缓或者上涨时。当经济增长位于或者低于其长期均匀增长率之下,以及通货膨胀保持稳定或者开始上涨的时候,债券的价格上涨。当货币供应快速增长和通货膨胀压力凸显造成强劲的经济环境和日益加剧的通货膨胀时,债券的收益率会上涨,因而,这个阶段并不是投资债券的最佳时机。个别状况下,价格翻新高的股票回调的低点通常位于前一个低点和高点之间50%以上的地位。趁势而为才是投资的正确形式。将货币供应增长和股票价格视为当先指标、工业产品指数视为同步指标,将通货膨胀、利率和大宗商品价格的增长视为落后指标

October 31, 2021 · 1 min · jiezi

关于读书笔记:战胜华尔街-彼得林奇-小卜笔记

以下是我之前读这本书整理出来的一些自认为比拟重要的内容,简略易懂的,想要理财学习的能够看看,个人感觉十分不错。1.投资很乏味、很刺激,但如果你不下功夫钻研基本面的话,那就会很危险。2.作为一个业余投资者,你的劣势并不在于从华尔街投资专家那里取得所谓业余投资倡议。你的劣势其实在于你本身所具备的独特常识和教训。如果充分发挥你的独特劣势来投资于本人充沛理解的公司和行业,那么你必定会战胜那些投资专家。3.过来30多年来,股票市场被一群业余机构投资者所主宰,然而与个别人的想法正好相同,我认为这反而使业余投资者更容易获得更好的投资业绩。业余投资者尽能够疏忽这群业余机构投资者,照样战败市场。4.每只股票前面其实都是一家公司,你得弄清楚这家公司到底是如何经营的。5.经常出现这样的事:短期而言,比方好几个月甚至好几年,一家公司业绩体现与其股价体现息息相关;然而长期而言,一家公司业绩体现必定与其股价体现是齐全相干的。弄清楚短期和长期业绩体现与股价体现相关性的差异是投资赚钱的要害。同时,这一差异也表明,急躁持有终有回报,抉择胜利企业的股票方能获得投资胜利。6.你得弄清楚你持股的公司基本面到底如何,你得搞明确持有这只股票的理由到底是什么。不错,孩子究竟会长大,然而股票并非终究会上涨。7.想着一旦赌赢就会大赚一把,于是大赌一把,后果往往会大输一把。8.把股票看作你的孩子,然而养孩子不能太多,投资股票也不能太多,太多你就基本关照不过去了。一个业余投资人,即便利用所有能利用的业余时间,最多也只能钻研追踪8~12只股票,而且只有在条件容许的状况下能力找到机会进行买入卖出操作。因而,我倡议业余投资者在任何时候都不要同时持有5只以上的股票。9.如果你怎么也找不到一只值得投资的上市公司股票,那么就远离股市,把你的钱存到银行里,直到你找到一只值得投资的股票。10.永远不要投资你不理解其财务状况的公司股票。让投资者赔得很惨的往往是那些资产负债表很差的烂股票。在买入股票之前,肯定要先检查一下公司的资产负债表,看看公司是否有足够的偿债能力,有没有破产危险。11.避开那些热门行业的热门股。冷门行业和没有增长的行业中的卓越公司股票往往会成为最赚钱的大牛股。12.对于小公司股票来说,你最好躲在一边急躁期待,等到这些小公司开始实现盈利时,再思考投资也不迟。13.如果你打算投资一个正处于窘境之中的行业,那么肯定要投资那些有能力渡过难关的公司股票,而且肯定要等到行业呈现复苏的信号。不过,像生产赶马车鞭子和电子管这样的行业是永远没有复苏的心愿了。14.如果你在1只股票上投资1000美元,即便全副亏光也最多不过是亏损1000美元,然而如果你急躁持有的话,可能就会赚到1000美元甚至50000美元。业余投资者齐全能够集中投资少数几家优良公司的股票,但基金经理人则依据规定不得不扩散投资。业余投资者持有股票数目太多就会丢失绝对于业余机构投资者可能集中投资的劣势。只有找到几只大牛股,集中投资,业余投资者一辈子在投资上破费的工夫和精力就远远物超所值了。15.在任何一个行业,在任何一个中央,平时留心察看的业余投资者就会发现那些卓越的高成长公司,而且发现工夫远远早于那些业余投资者。16.股市中常常会呈现股价大跌,就如同东北地区酷暑时候常常会呈现暴风雪一样。如果当时做好充分准备,基本不会受到什么侵害。股市大跌时那些没有当时筹备的投资者会吓得胆战心惊,慌忙高价割肉,逃离股市,许多股票会变得非常便宜,对于当时早做筹备的投资者来说反而是一个高价买入的绝佳机会。17.每个人都有投资股票赚钱所须要的常识,但并非每个人都有投资股票赚钱所须要的胆略,有识且有胆能力在股票投资上赚大钱。如果你在股市大跌的恐慌中很容易受他人影响,吓得连忙抛掉手中所有的股票,那么胆大怕跌的你最好不要投资股票,也不要投资股票型基金。18.总是会有事让人放心。不要为周末报刊上那些危言耸听的剖析评论而焦虑不安,也不要理睬最近新闻报道中的乐观预测舆论,不要被吓得放心股市会崩盘就匆忙卖出。释怀,天塌不下来。除非公司基本面好转,否则坚定不要恐慌胆怯而抛出手中的好公司股票。19.基本没有任何人可能提前预测出将来利率变动、宏观经济趋势以及股票市场走势。不要理睬任何对将来利率、宏观经济和股市的预测,集中精力关注你投资的公司正在产生什么变动。20.如果你钻研了10家公司,你就会找到1家远远高于预期的好公司。如果你钻研了50家公司,你就会找到5家远远高于预期的好公司。在股市中总会有让人惊喜的意外发现,那就是业绩体现良好却被业余机构投资者漠视的好公司股票。21.不钻研公司基本面就买股票,就像不看牌就打牌一样,投资赚钱的机会很小。22.当你持有好公司的股票时,工夫就会站在你这一边;持有工夫越长,赚钱的机会就越大。急躁持有好公司股票终将有好回报,即便错过了像沃尔玛这样的优良公司股票前5年的大涨,将来5年内长期持有依然会有很好的回报。然而如果你持有的是股票期权,工夫就会站在你的对立面,持有工夫越长,赚钱的机会越小。23.如果你有胆量投资股票,却没有工夫也没有趣味做功课钻研基本面,那么你的最佳抉择是投资股票型基金。你应该扩散投资于不同的股票基金。基金经理的投资格调可分为成长型、价值型、小盘股、大盘股等,你应该投资几种不同格调的股票投资基金。留神:投资于6只投资格调雷同的股票基金并非扩散投资。投资者在不同基金之间换来换去,就会付出微小的代价,得领取很高的资本利得税。如果你投资的一只或几只基金业绩体现不错,就不要轻易摈弃它们,而要坚定长期持有。24.长期而言,投资于一个由精心筛选的股票或股票投资基金形成的投资组合,业绩体现必定要远远胜过一个由债券或债券基金形成的投资组合,然而投资于一个由胡乱筛选的股票形成的投资组合,还不如把钱放在床底下更平安。

October 29, 2021 · 1 min · jiezi

关于读书笔记:我的经验与教训苏世民-小卜笔记

1.“最初,你当初有责任在公开场合发表本人的意见。当看到能够纠正的谬误时,你要大胆地说进去,不要退缩,因为这是一些人的社会责任。我是其中一个,你当初也是其中一个。”2.我发现问题越难,竞争就越无限。如果问题很简略,那么违心帮忙解决的人总会很多。但如果问题很辣手,大家都避之唯恐不迭。能够解决此类问题的人十分常见。有难题的人会找你,出大价格让你解决问题。为人所不为,为人所不能,以此建设本人的名誉。对于两个试图寻求冲破的企业家来说,解决困难问题将成为自我证实的最佳形式。为人所不能,体现出本人的价值能力脱引而出一炮而红,容易做的必然趋之若鹜,难度越大无能的人越来越少3.胜利就是充分利用你无奈预测的那些常见的机会,但抓住这样机会的前提是你必须时刻放弃凋谢的思维、高度的警惕和壁垒森严的姿势,并违心承受重大改革。抓住机会,必须放弃凋谢的思维,敏锐的洞察,还得有重大扭转。4.作为营销人员,我学到,仅靠一次采购是不行的。你对事物存在信念,但并不能保障其他人也这样。你必须一遍又一遍地采购你的愿景。大多数人不喜爱扭转,你必须用你的论点和集体魅力压倒他们。如果你置信你采购的货色,对方却回绝,你应该假如他们并没有齐全了解,所以你要再给他们一次机会。采购的时候,对方不承受阐明对方没了解,所以须要屡次采购直至其了解了,那么也就采购胜利给了。5.没有人能一帆风顺,能力再弱小的人也会碰壁,要害是要解决遇到的问题,剖析起因如何解决。制订相应的解决方案并动摇执行。我必须畏缩不前,百折不回!针对后面的问题,剖析他人回绝的起因,批改计划,防止再次被回绝,肯定要复盘。处于窘境中的人往往只专一于他们本人的问题,而使本人脱困的路径通常在于解决他人的问题。解决他人的问题才是正解。6.如果办公室不完满,我是不会罢休的。领有漂亮的办公空间,吸引最优良的人才,让客户对咱们的能力更有信念,这些回报要远远超过领取额定费用来实现交易的老本。要想取得本人想要的货色,最好的办法就是先弄清楚能提供给你这个货色的人想要什么。我打消了业主对租金降落的担心,于是失去了我想要的办公空间。想要达到肯定的目标,要发现对方需要,解决了对方的问题,你的想法也快实现了。7.但有时你就是须要承担责任,开出支票。你必须通知客户失误在你,因为如果你不这样做,他们就再也不会置信你。做事必须要有肯定的担当否则失信了就再也无法挽回他人对你的信赖了。我把摩根大通的做法通知了他,并问他花旗能不能代替摩根大通,为黑石提供信贷。维克拉姆毫不犹豫地许可了。咱们在艰难时刻反对了他,他也十分乐意提供帮忙。生命之旅是漫长的,在别人须要的时候施以援手,这一偶尔的善举往往会以最出其不意的形式回报你,因为每个人都永远不会遗记那些在艰巨时刻扶危济困的敌人。所以如果在本人工夫容许的状况下他人须要帮忙的时候就多帮忙一下,不是必须要有回报,帮忙他人兴许还能帮本人进步深入呢。8.我通知肯恩不要放心,资产估值走低只是纸面上的。股市会复原的。咱们有本人的投资算法和实践。如果咱们还置信这些实践,就必须持续致力并放弃急躁。做所有事都要有准则,打算行事。9.如果有人要求你提供新产品,那么这个人是地球上对这一产品惟一感兴趣的人的概率是零。如果有人向你提出这样的要求,那么这背地可能代表了一个微小的机会。那些提出要求的人并不知道,他们只是在关注本人的需要。然而,如果这些需要具备合理性,而你又设计了满足这些需要的正确产品,那就能够对这种产品进行大范畴推广,而你的竞争对手只能好奇你是怎么找到解决方案的。很多机会就在身边,要多发现身边人最须要的是什么,遇到的问题是什么?以及如何帮忙他们解决问题,解决完问题那么生意可能就来了。10.黑石抉择不进行投资,错失了良机,我永远不会遗记这个失误——如果咱们进行了投资,过后1亿美元的投资最终就会增长到80亿美元以上。我始终心愿有一天,黑石能够灵便地为像迈克这样的企业家提供投资,抓住那些与传统私募股权模式不同的投资机会。于是咱们成立了一只新基金,命名为“战略性投资机会基金”,这只基金是我长期以来寻求的投资策略平台。遇到的问题后,找到问题的起因,针对起因提出解决方案。11.世界首领与其余任何人都没有什么不同。如果你议论困扰他们的问题,并提出一些有用的倡议,他们就会聆听,无论这个人是民主党人还是共和党人、王子还是总理。无论是谁遇到困扰的问题,都冀望失去他人的帮忙。12.团队的外围是人才和常识,而不是政治。这个团队不用同意总统的所有口头或观点,但能够参加时事,为解决问题提供建设性计划,为美国的经济倒退做出奉献。这真的是特朗普么?还是我的音讯渠道感觉他是个小丑。13.以下是我辨认市场顶部和底部的简略规定: 1.市场顶部绝对容易辨认,买家通常会越发自负并且深信“这次必定跟以往不一样”。但通常状况下,事实并非如此。 2.市场总会充斥着过剩的绝对便宜的债权资本,为热门市场的收买和投资提供资金。在某些状况下,贷款人甚至不会收取现金利息,同时还会升高或勾销执行贷款限度条件。与历史平均水平相比,杠杆程度迅速攀升,借款总量有时高达抵押资产净值的10倍,甚至更多。这时,买家开始违心承受过于乐观的会计调整和财务预测,以证实承当高额债权的合理性。可怜的是,一旦经济增长加速或经济下滑,大多数预测往往不会成为事实。 3.市场触顶的指标是身边赚到大钱的人数。宣称体现优异的投资者数量随市场的走高而增长。信贷条件宽松,各类市场纷纷上扬,没有任何既定投资策略或流程的人都能“无心中”赚到钱。但在强劲市场中赚钱往往是过眼云烟。相比之下,即便市场局势产生逆转,聪慧的投资者还是能够凭借严格的自我束缚和健全的危险评估取得良好回报。 这两段时书结尾的局部,是全书的精髓局部,总结在这里: 1 保持成长就要一直提出问题,预测事件、审时度势,被动寻求提高和改革。 2 优良的企业文化兼具规模劣势和小公司的灵魂,员工能够自在表白想法。 3 不断创新,能力永远不被淘汰。 4 为了取得成功,你必须有勇气突破边界,进军本人无权进入的行业和畛域。 5 审慎做出决策:每一个渺小的行为都有可能对其他人造成深远的影响,无论好坏。 6 对企业进行精英治理,谋求卓越、放弃凋谢、坚守诚信,并极力聘用领有同样信念的人。 7 守业的三项根本测试:你的构想必须足够巨大,企业的产品或服务应该是举世无双的,机会必须是正确的。 8 企业的所有因素都互相关联。企业如果要取得成功,那么每一个部门既须要独立运行,又须要与其余部门顺利合作。零碎中任何一环呈现问题都有可能造成亏损或破产。 9 守业的重要论断:创建和经营小企业的难度和大企业相差无几。一个企业的创建,无论规模大小,都有一个从无到有的过程,你会接受雷同的经济负担和心理压力。筹集资金并找到适合人才的难度也同样大。在同样的艰难和压力背后,要确保守业胜利,惟一的方法就是全身心的投入。 10 企业“八九十”人才观:得8分的人是工作执行者,得9分的人十分善于执行和制订一流策略。如果公司都是9分人才,就能够获得成功。但10分人才,毋庸失去指令,就能被动发现问题、设计解决方案,并将业务推向新的方向。10分人才可能为企业带来源源不断的收益。 我不仅学会了应答危机,而且学会了为本人和客户制作危机,并以此为契机引发改革、改变现状,达到因破而立的目标。 如果领导个人不心愿呈现倦怠情绪,那么在公司的能源、智力和竞争力尚未达到高峰时,就要着手进行接班人的造就,以确保生机和能源永续不竭。 教育是通往更加美好生活的阶梯。良好的教育能够改善受教育者的人生。咱们每个人不仅有责任学习和传承常识,还有责任改良和倒退常识,让常识对后辈更有用、更有影响力。 建设和流传弱小的公司文化既是企业倒退的应有之义、必要之举,也可能是任何企业家和创始人所面临的最大挑战之一,但如果能找到正确的办法,打造企业文化也是最令人称心如意的事件之一。

October 27, 2021 · 1 min · jiezi

关于读书笔记:海龟交易法则读书笔记

《海龟交易法令》读书笔记前言同样是评论举荐的一本书,理论看了一下的确挺不错的,作者讲述了如何用系统分析进行投资,以及投资当中如何设置止损线,如何止盈等等,当然对于作者的图表法粗略看看就行,漂亮国的股票和市场都是非常成熟,咱们只须要学习如何利用“海龟交易法”以及如何造就投资属于本人的投资从策略则即可。 另外,让作者走上投机路线的第一本书就是《股票作手回忆录》,因为非常崇拜利弗莫尔所以对于投机有了趣味。这里也举荐读者看看这本书。 举荐语海龟交易法令是作者通过亲身经历之后一套投资零碎法令,尽管依照古代的眼光来看曾经非常过期了,然而这本书的重点不在于交易法令,而是在于作者对于市场的剖析以及人的心理剖析,这是值得每一个人学习内容,也是书中真正值得学习和理解的内容。 资源链接链接:https://pan.baidu.com/s/1yOFQ... 提取码:4u54 --来自百度网盘超级会员V6的分享集体评估 投资的策略总是须要随机应变的,而领有和把握一套本人的投资策略也是非常有必要的,如果你和趋势做敌人,趋势会帮你带来财产,然而如果你没有坚守你的策略,趋势往往会朝你最不心愿的方向倒退,压服本人做正确的交易不难,然而压服本人坚韧不拔的在正确交易上保持很难,一旦本人的投资超过了本人的危险抵制,就要缩紧的钱包和开销,并且及时从谬误的交易当中脱身。 《海龟交易法令》说的是所有的投资都要付出代价,作为一个投资者肯定要有本人清晰的头脑。 海龟交易法令原版海龟交易法令尽管海龟交易法令在古代曾经齐全不实用了,然而在思维下面还是十分具备参考价值的,另外,零碎必须要时刻更新紧跟时代才不会生效,同时因为各种效应关系,一旦你的零碎被人模拟或者参考,它将会逐步生效。 原版的海龟交易法令在书本的最初一节,如果感觉这本书讲的零碎十分复杂和难以了解能够间接看书本的最初一章内容。 是什么?海龟交易法令是依据一套实践为领导的投资方针,蕴含危险,机会,投资策略,登场策略,心理博弈,预期差别和系统分析等几个方面,目标是为了疏导投资者作具备投资冀望的交易。 海龟培训要点把握劣势:寻找一个正期望值的策略治理危险:一旦投资超过危险,立刻止损坚韧不拔:一旦确定本人的策略就动摇的执行,孤身作战简单明了:抓住每一个趋势,趋势会是你的敌人情绪陷阱在投资和交易的过程,人最容易受到上面的感情所影响,所有的市场交易都脱离不了上面这几点: 心愿:购买之后,立即上涨失望:抉择有误,始终在赔钱贪婪:赚翻了,我要加仓恐怖:再也不碰了 人一旦陷入了情绪陷阱是很难脱离进去的,人类胆怯的是未知以及预期落差,未知指的是将钱投入进去之后不晓得市场的运行,而预期落差则是在事态朝着本人最不想看到的方向倒退的时候呈现。 非理性效应在《海龟交易法令》一本书中提到了各种效应的机制,上面这些效应是投资过程中须要小心如下的内容,这里集体的整体概括是非理性效应: 损失讨厌:对于损失强烈讨厌,不赔钱比不赚钱更重要缄默老本:更器重曾经投入的,而不是将来投入的处理效应:过早兑现收益然而过晚的止损近期偏好:更器重近期数据,而不看历史的数据潮流效应:跟风效应崇奉小数法令:从小道消息盖棺定论。交易者,投机商,帽客“海龟交易时代”根本的角色就是交易者,投机商和帽客,当然这些都曾经是历史了,然而理解下历史也挺有意思的。 这三者其实是相互牵制的关系,尽管实质上都是在交易,然而所站的角度各不相同。书中讲的是期货交易,所以会存在多方,并且期货是存在做多和做空的,而股票则不行。 交易者的角度是在对冲交易时候紧盯着汇率,让汇率在本人构想的角度浮动,所做的交易都是为了升高危险。 而帽客则是心愿汇差的稳定,比方在和平的期间,通过汇率的疾速变动赚保证金等等。 投机者则是咱们常见的投机交易,即买入做多,低买高卖,或者借贷买入,高价赎回,高贷低还。 作者的实际令人讥刺的是在海龟的第一次模仿实战、中受海龟交易法令培训的所有人当中只有作者保持了海龟交易法令并且在适合的理论低点买入高点卖出,然而奇怪的是和作者一起上课学习海龟交易法令的同学都在交易的过程中都没有抵制住心理上的博弈。 从作者的集体感悟也能够看出,其实投机交易少数人是亏钱的,多数人能够“蹭”一点利益,并且如果没有天才,少数人只能通过一直的学习和察看钻研能力把握到投资的技巧,当然和有天才的人也是在一直的察看和思考中学习进不到,然而人和人下限是不一样的。 海龟的投资形式海龟的投资形式考究的是趋势的交易,趋势的交易则十分的考究机会,在机会不成熟的时候交易,不管怎么投入都是亏损,然而一旦依据趋势进行交易,则无论什么时候入场都是赚的,当然剖析趋势是最难的一个点,并且一旦失去趋势要立即止损。海龟交易的形式并不是在相对“赚”的点上进行投入,甚至30天外面又20天是在亏钱,这时候能顶住压力的人才能最终赚钱。最初,如果适应趋势,趋势将会是你的敌人。 历史教训须要留神的是永远不要妄想当初会和历史截然不同,然而当初的市场规律能够从过来觉察,因为正如几次金融危机一样人类总是在反复犯同样的谬误,剖析历史是非常重要的,一个合格的投资者要学会从历史教训和走势图中看到市场的变化规律。 尽管市场总是存在着不可知和变动性,然而从历史教训中预测出一个期望值为正的交易非常重要。 危险管制危险管制也是书中重要的一节内容,很多的投资者都是将钱投进市场开始祷告,但市场的走向和他们的想法不符的时候,这时候恐怖和忧愁会代替大脑思考,此时人曾经失去了根本的判断,任凭感情和本人的心田的臆测,所以设置一个危险的管制是很有必要的。 危险管制意味着在本人亏损的时候毫无犹豫的跳进去, 一旦超过本人的危险管制范畴不论市场如何利好,哪怕市场是一个正期望值的市场,此时也要尽快退出,因为一旦超过危险之后,感性的思考会被理性左右,和《股票做手回忆录》相似,在作者走投无路的时候,本人无论又多少天才和本事,也会被破产这两个字影响本人的情感判断。 压服本人做正确投资比压服本人早早退出要容易太多。 利用零碎投资法令作者在本书的后文应用了大量的零碎和曲线分析法,比方支撑点和突破点等专业术语,集体认为单靠书中的寥寥几笔是不能齐全阐明的,并且内容也不是必须的,这里集体参考了更多的是对于作者对于投资者的心理剖析动手,比方在什么时候应该静静期待,以及找到本人心理能接受的危险以及寻找失去趋势的机会,对于零碎的剖析所有剖析都是建设在一套正当的投资机制和危险管理机制之下的。作者已经也在一天之内亏损本人的所有财产并且没有任何的反馈机会。所以市场有危险,入市须审慎。 总结总之《海龟交易法令》这本书是一本读完相对会有播种的书,这本书能帮你理解一个零碎的投资规定,建设一份属于本人的投资策略以及危险控制策略是十分重要的,也是这本书所要传播的重点。 写在最初最近忙着写技术文,这篇读书笔记也拖了比拟久....

August 22, 2021 · 1 min · jiezi

关于读书笔记:从零开始学架构读书笔记2

零碎泛指由一群有关联的个体组成,依据某种规定运作,能实现个别元件不能独自实现的工作的群体 关联:零碎是由一群有关联的个体组成的,没有关联的个体堆在一起不能成为一个零碎规定:零碎内的个体须要依照指定的规定运作,而不是单个个体各自为政。规定规定了零碎内个体分工和合作的形式能力:零碎能力与个体能力有实质的差异,零碎能力不是个体能力之和,而是产生了新的能力软件模块(Module)是一套统一且相互有严密关联的软件组织,它蕴含程序和数据结构两局部。古代软件开发往往利用模块作为合成的单位。模块的接口表白了由该模块提供的性能和调用它时所须要的元素。模块是可能离开被编写的单位,这使得它们可再用,并容许开发人员同时合作,编写及钻研不同的模块软件组件定义为自蕴含的,可编程的,可重用的,与语言无关的软件单元,软件组件能够很容易地被用于组装应用程序模块和组件都是程序的组成部分,只是从不同的角度拆分零碎而已。从逻辑的角度来拆分后失去的单元就是“模块”,从物理的角度来拆分零碎失去的单元就是“组件”;划分模块的次要目标是职责拆散,划分组件的次要目标是单元复用7.软件框架(Software Framework)通常指的是为了实现某个业界规范或实现特定根本工作的软件组件标准,也指为了实现某个软件组件标准时,提供标准所要求之根底性能的软件产品

August 2, 2021 · 1 min · jiezi

关于读书笔记:从零开始学架构读后笔记1

软件架构是指软件系统的顶层构造,架构设计的目标是为了解决软件复杂度。通过架构设计的三准则(适合准则,简略准则,演变准则)及实现办法来解决这个问题不同的公司应用不同的架构,每个架构的针对点也不一样,比照本人的业务简单点,参考类似的计划架构设计并不是要八面玲珑,不须要每个架构都具备高性能,高可用,高扩大等特点,而是要辨认出简单点,而后有针对性地解决问题

August 1, 2021 · 1 min · jiezi

关于读书笔记:我的读书方法论二

我的读书方法论(二)前言: 写这篇文章就和电影拍续集一样,不晓得如何下手,看了下第一篇的公布工夫竟然过来了整整6个月,真的是过得太快了。往年的成长还是挺可观的,岂但激发斗志看了很多书,更文也是前几年加起来的总和,之前始终躺在地上当咸鱼,当初感觉就像牛天天想着去耕田。。。。。扯远了,这篇文章回到方法论这三个字,说说我是怎么做到疾速读书的。 概述:我是读书机器?其实都是游刃有余,我会介绍一下我集体保持看上来书的办法记笔记的办法,markdown的介绍,以及集体习惯的模板格局。有道云记笔记的“骚操作”,以及One-note神器的介绍(如果感觉是软广倡议提醒跳过)怎么保持把书看上来。如何给本人列购书清单。目录构造:充当思维导图用了: 集体感想: 介绍注释之前,先扯些有的没的(锤) 我是读书机器? 的确是,共事在午休的时候我在看书,共事在刷手机的时候我在看书,共事摸鱼的时候我也在摸鱼,其实我也不是天生爱看书,只是真的不晓得除了看书还能干嘛,我是属于还算比拟能自律的人吧,比方我想要跑步的时候就会去跑步,我不想跑步的时候就会坐在家里看视频学习,我没有什么强制本人要做的事件,然而往年也给本人定了不小的指标,一年看40本书,当然当初曾经实现了。 在我看来每一个人爱看书的人多少都是有本人独立世界的人,他们不会追随公众自在的口头,而是会静下心来思考本人 真正须要什么,当然这里太贬低了读书人,然而的确是集体的实在想法。 我的确是读书机器,很心愿未来能有属于本人的书。 我是怎么保持的? 高中的时候爱看小说,加上集体特地厌恶手机看小说,屏幕那么大点看着还累,索性把实体书买来看,那时候非常喜爱江南的龙族,又贵又老厚一本了,然而摸着纸张的感觉特地带感,慢慢地我喜爱上这种纸上浏览沉浸于书的世界的感觉,接着我变本加厉的买书看书,甚至书店老板见到我的第一句就是:“你又来了啊,明天又到了不少新书,你看看要不要买一本(黑心学校书店老板书贵的要死)”,前面买那种一本本的“老夫子”和“阿衰”的漫画分给同学看,带坏了不少同学(这里向高中同学道个歉),起初我变得只喜爱纸质书,而且变得喜爱看书。 在大学,我的第一本技术书是谭浩强的C语言,当年看的非常苦楚,我在想一本书竟然还能够写的这么艰涩难懂,索性去看了视频,于是我一步步用视频加上手写笔记自学走到当初码农搬砖的岗位(大学有想过学日语,然而学了个五十音就放弃了,尽管凭多年看动漫能听懂不少对话)。这段时间其实次要是视频为主,看的书也少,慢慢地我不再有强烈的读书欲望。 起初抱起书是发现自己底子太薄了,的确太薄了,常识学得快根底就不深,意识到这一点我立马把《JAVA编程思维》细读了一遍,天知道我过后为什么要迫害本人,看不懂然而看得津津乐道,很多代码照着敲也看不懂,当初看来是看太早了,根底不够就去深刻,后果把本人埋进坑里,不过也有坏事,就是找回了高中看书的感觉,前面找了些好懂的书补根底,这种学习和他人交给你是不一样的,当然这种学习效率可能不见得很高,更多是要能反刍成本人的教训并且要能够说进去才是最好的。 读书习惯往年转变很大,因为我发现书是多数能够间接用零碎的学习形式,所以立马定了打算系统性的学习,收效不错,有了目标的学习你会发现看书也变得很有能源,兴许高中热爱读书也是因为我特地喜爱漫游设想世界才十分喜爱读书吧。 另外,咱们很难看进书是咱们出学校只会潜意识认为:常识学习变简略了,咱们变得急功近利和塌实什么事也不想干也是这个起因,不是你的感觉事件办不到了,而是你的大脑能够解放了能够天天偷懒。 最初,一路保持下来的一个很重要的起因是:我想扭转本人,我不想把工夫节约在他人身上,我想丰盛本人的大脑并且真正把工夫留给本人。这很像《自控力》提到了的一种自控办法:我不想,我要做,我想要。 举荐一些书: 读书笔记汇总外面的书品质参差不齐,为了让各位更好的进入书的世界,这里举荐一些集体近半年的好书举荐,当然必定不须要全看,每一类选一本集体都感觉非常值得看: 理财类:《小狗钱钱》(1和2)、《散步华尔街》、《穷爸爸与富爸爸》、《穷查理宝典》、《股票作手回忆录》 工夫治理:《小强升职记》、《工夫投资法》、《奇异的毕生》 自律:《自控力》、《意志力》、《微习惯》、《掌控习惯》、《奇异的毕生》(工夫管理法,自律的巅峰)、《高效人士的7个法令》 心理:《社会心理学》(的确看得少前面得增强一下了) 人文:《人类简史》和《将来简史》、《飘》、《嫌疑人X的献身》、《解忧杂货铺》、《白夜行》、《活着》 科幻:《三体》、《漂泊地球》 漫画:《爆漫王》、《声之形》、《食戟之灵》 读书笔记:《如何浏览一本书》、 其余:《万万没想到》(博客出书,真艳羡)、《小王子》、《和平与战争》(苏联电影牛) 经济学:《手把手教你读财报》(唐朝) 技术书:《Effective Java》、《重构》、《代码简洁之道》、《Head FIrst设计模式》、《程序员的职业素养》 怎么保持把书看上来 这个对多少人有用不分明,我只能说一下我集体是如何“逼”本人看书的。 1. 买下来 很简略,掏银子呗,最好的方法就是为常识付费,看完书间接卖回去回血,用代价去激发读书的激情。 2. 随时带在身上 买下书来之后放在角落吃灰?很多人包含我也是常常会这样做,那么这种时候其实只有惟一的方法就是用身材去“感触”,我当初每天上下班背至多两本,一本专业书和一本个人成长的书(心理,理财,思考类的书籍),如果精力短缺,我会抉择看技术书,如果我不想看技术书我会抉择看一些简略好了解的书,这里会有人问:你在路上看书你怎么记住书里的内容的呀?这个放到前面再讲,总之如果你不想买来书放着吃灰,最好就是带身上。 3. 营造读书的气氛 这个很简略,最间接的方法就是去人多点的图书馆,当然对于上班族或者特地难做到,然而外面的环境会让你情不自禁的想找本书看看,很适宜造就读书习惯。 另外,读书环境最好只有一本书给你,其余什么都不须要,只会烦扰你的眼帘,让你转移注意力。 保持读书集中注意力是锤炼意志力的一种好方法。 4. 高强度浏览 换做以前我可能会举荐你每天看几页,然而本人试验的时候因为人的迁延心理很可能又变成书架装饰物,所以这里举荐一招“高强度浏览”,即不要想着学货色,你的指标是看完,你能够只粗略的扫一眼,遇到感兴趣的先折起来,遇到不感兴趣的间接跳过,用最短的工夫读完它,这样会让你有一种工作实现的感觉,记住这个感觉,接着再反复一遍,然而逐步加快速度,仍然把眼光停留在你感兴趣的点,如此重复,你会发现看书和看剧一样能够非常轻松。 ...

August 1, 2021 · 1 min · jiezi

关于读书笔记:驾驭周期-读书笔记

与消费者幸福感有间接分割的最重要的指标是每个月公布的就业人数报告。就业人数的强劲增长意味着经济的走强,消费者支出的减少会刺激他们的生产。就业人数增长的放缓则意味着消费者因为支出增长幅度的降落而不违心过多收入,他们会在生产上变得更加小心谨慎。当失业率维持在一个绝对稳固的低点时,阐明目前的劳动力紧缺,经济的扩张靠近于饱和的状态。因为当先指标对经济具备疏导作用,所以当先指标增长幅度的变动同样当先于同步指标增长幅度的变动。当当先指标综合指数的增速开始放缓的时候,同步指数的增速将在若干个月之后呈现降落。另一方面,当当先指数开始减速上涨时,同步指数的增速也将在若干个月之后呈现上涨。当先指标(例如:货币供应)在上涨大概两年之后,同步指标(例如:工业生产)才会呈现上涨。● 落后指标(例如:利率)在工业生产指标持续增长的1.5~2年之后才会开始上涨。● 当先指标(例如:货币供应)达到其峰值的几个月之后,落后指标才会呈现上涨。● 当先指标(例如:货币供应)的增速呈现降落1年,或者1.5~2年当前,经济增速将会呈现放缓的迹象(例如:工业生产)。● 工业生产的增速降落几个月后,落后指标(例如:利率)的增速才会降落。● 落后指标(例如:利率)上涨速度的升高,会通过几个月之后当先指标(例如:货币供应)的上涨失去体现。经济周期第一阶段的次要特色能够演绎为以下几点:● 货币供应的增长呈疾速回升之势。● 美元的环境失去改善。美元贬值。● 股票市场处于上涨之中。● 尽管生产、销售、支出和待业的增长状况使得经济处于稳固和回升的阶段,然而增长速度依然位于其增长后劲程度之下。● 企业的利润触底之后开始反弹。● 大宗商品继续走弱并最终见底。● 短期利率继续上涨并最终见底。● 长期利率继续上涨并最终见底。● 通货膨胀继续降落并最终见底。只管短期利率和长期利率具备独特的周期反转点,然而短期利率要比长期利率的稳定幅度更大。正因为如此,短期利率的稳定对于投资者判断货币市场环境及其趋势来说是个十分实用的信号。经济周期第二阶段的次要特色能够演绎为以下几点。● 货币供应继续疾速减少并见顶。● 美元放弃强势并见顶。● 股票市场持续上涨并见顶。● 通过产量、销售额、支出和就业率的增长状况进行掂量的经济将会在其增长后劲程度之上快速增长。● 企业的利润疾速减少。● 大宗商品价格强势上涨。● 短期利率上涨。● 长期利率上涨。● 通货膨胀回升。经济周期第三阶段的次要特色能够演绎为以下几点。● 货币供应增速继续降落。● 美元走势绝对疲软。美元升值。● 股票市场朝气蓬勃。股票市场走弱。● 通过产量、销售额、支出和就业率的增长状况进行掂量的经济将会加速,并且最终位于其长期增长后劲程度之下。● 企业利润增长见顶后开始降落。● 大宗商品价格见顶后开始降落。● 短期利率见顶后开始降落。● 长期利率见顶后开始降落。● 通货膨胀继续上涨后开始降落。经济周期第四阶段的次要特色能够演绎为以下几点。● 货币供应增速继续降落,只有短期利率见顶,货币供应就会减少。● 美元走势先抑后扬。● 股票市场尽管持续低迷,然而会逐步向好。● 通过产量、销售额、支出和就业率的增长状况进行掂量的经济将会继续上行。● 企业利润继续降落。● 大宗商品价格疲软。● 短期利率降落。● 长期利率降落。● 通货膨胀降落。 收益率曲线反映的是长期利率和短期利率之间的差。短期利率低于长期利率意味着银行发放贷款的志愿是十分强烈的;此外,这还是美联储施行宽松货币政策的信号。当收益率曲线的走势比拟平坦时,阐明长期利率和短期利率之间的差在降落,美联储正在施行收紧的货币政策;因而,因为贷款者并没有很强的志愿去满足借款者对资金的需要,所以经济的增速会十分迟缓。为了与金融周期的趋势和所处阶段保持一致,投资者须要跟踪M1、M2、M3和MZM的变动状况,因为货币供应的增长幅度会通知你经济将要产生什么。如果货币供应开始疾速减少,则表明美联储的这一动作是产生在经济增长十分迟缓的期间,投资者该当预期经济将在将来1~2年内走强。如果货币供应以靠近15%的速度增长,那么经济将在将来变得十分强劲。对于投资者来说,股票会因为流动性的疾速减少而体现十分坚挺。货币供应增长见底大概两年之后,经济的增长也将触底。当经济的增长见底大概两年之后,短期利率和长期利率开始上涨。紧跟着短期利率和长期利率上涨而来的是货币供应增速的放缓,货币供应增长见顶。货币供应增长的高峰过后,经济增长见顶。在货币供应增速降落2~3年后,利率见顶也随之降落。而利率的上涨也将导致货币供应的快速增长。“利率的上涨导致股票市场处于高风险”这样的内容。实际上,这种模式的表述是不精确的。这是因为,货币老本的回升导致企业和消费者借款志愿的降落,进而导致经济体系中流动性总量的降落,因而,理论影响股票市场的因素是货币供应增速的降落。利率的上涨导致了债券价格的上涨;换句话说,长期利率上涨,债券价格上涨。因为息票的利率是由借款人在合同中确定的,因而,长期利率的上涨会导致债券价格的上涨,反之,长期利率的上涨会导致债券价格的上涨。流动性也是投资者买入或者卖出债券的时候该当思考的重要因素。什么时候才是买进债券的最佳时机呢?答案是,当经济和所有的指标因为货币供应和大多数当先指标的继续降落而放缓或者上涨时。当经济增长位于或者低于其长期均匀增长率之下,以及通货膨胀保持稳定或者开始上涨的时候,债券的价格上涨。当货币供应快速增长和通货膨胀压力凸显造成强劲的经济环境和日益加剧的通货膨胀时,债券的收益率会上涨,因而,这个阶段并不是投资债券的最佳时机。个别状况下,价格翻新高的股票回调的低点通常位于前一个低点和高点之间50%以上的地位。趁势而为才是投资的正确形式。将货币供应增长和股票价格视为当先指标、工业产品指数视为同步指标,将通货膨胀、利率和大宗商品价格的增长视为落后指标

May 12, 2021 · 1 min · jiezi

关于读书笔记:如何有效读一本书读书笔记

《如何无效读一本书》读书笔记 前言 这段时间因为搬家和安排家具,根本没怎么看书,安置好之后,又从新开启了读书打算,这次看的一本书讲的是读书办法相干的内容,集体从中还是有不少的成长的,并且书中作者的某些做法居然本人也在做,这本书是一本比拟有意思的书。须要留神的是作者是个日本人,有些章节的参考价值不大,所以只筛选了合乎“国情”的一些内容作为笔记。 简介: 这本书是一本实用方面的书,次要讲作者的浏览习惯,以及读书笔记的记录办法,从筛选图书到读书,最初从书中提取笔记并且产出本人的思维,通过各种举证像读者“安利”本人的读书和学习形式,同时利用循序渐进的形式,像读者介绍了如何从零开始爱上编写读书笔记。在作者的观点当中,无效读书的外围就是 读书日记。通过日记不仅能够节俭重读的工夫,并且每看一遍笔记都会有新的播种。 举荐指数3星:如果你喜爱纸质书,那这本书很值得参考,然而如果平时喜爱手机看书,或者只喜爱电子书,这本书的意义和价值不大,作者是个日本人,所以很多习惯和国人不一样,看书的时候请了解一下。 另外,如果你像我一样喜爱买二手书,也是不是特地举荐看的。因为这本书举荐的形式根本都是要对原来的书一样“动手脚” 内容摘要 这本书集体的笔记形式: - 边看边应用便当贴的形式进行比拟,记录本人感兴趣的话语- 第二遍回顾本人的便当贴,联合贴上的页码,回顾内容- 写下这篇文章,归档本人学习的内容和读书感想。造成本人的读书笔记通过了下面的步骤之后,就有了上面的思维导图笔记,上面是思维导图的局部笔记,讲真思维导图还是蛮香的,能疾速构建本人的常识笔记的网络,尽管我并不厌恶码字,然而思维导图更加促成思考。 思维导图连贯:思维导图 无法访问的试试间接拜访URL:https://share.mubu.com/doc/Jn...上面的局部是依据这本书的各个章节说下集体的感想 无效读书 在这本书的最结尾,应用“无效读书”的话题,通过各种例证阐明一个读书笔记的重要性,同时对于读书来说,最重要的不是看什么书和看书的播种,最重要的是看书的指标和想要从书中学到多少有用的内容。这样才是最重要的,同时重读读书笔记也是很重要的一件事,好好写好一份读书笔记就更加重要了。 对于书本当中提到的读书的五个步骤,集体大抵演绎为:选 -> 购 -> 读 -> 记 -> 活。从最开始的选出一本适宜本人的好书到最初活用书中的常识,造成本人的了解。 值得注意的是,人的大脑是一块不定时格式化的磁盘,所以对于重要的事件,集体十分举荐买一个小本子带在身上,在下面记录重要和紧急的事件十分有用。同时不须要留神格局,相似随身携带的草稿纸,写满一本之后,找一个鞋盒收进去,塞到床底下,等哪天想起来打开看看,必定会对过后记笔记的本人唏嘘不已。 购书清单 集体的购书清单通常在他人的博客举荐上,或者通过豆瓣上高评估的作品,这样大概率都不会踩坑。这里也要说一句一本书的起名太重要了,很多好书其实自身是因为一个不太“好听”的名字而没有知名度。集体还偏向于依照封面去选书,一个难看封面的实体书会减少我浏览的趣味。 购书清单这部分集体倡议跳读,因为基本上喜爱读书的人都有本人的一套购书习惯,没有必要去照着作者的思路去实现,集体对这一部分保持中立的态度,购书齐全看本人。 同时这一个章节也是跳读的,这部分的内容集体认为更加适宜日本的生活习惯。日本当初还有保留浏览报纸习惯,而国内当初读书却越来越趋近于网络看书,所以购书清单集体保持中立的意见,书中提到的激动买书集体常常做,不过集体当初通常都是买的二手书,高价买入而后再卖回去,循环利用,这样我的书架永远都有很多书然而永远都只有那么多书,这里还是要说一句二手书还是很香的存在。 近几年来有些声音是探讨纸质书的必要性,我认为还是有必要的,这种情景总是让我想起《三体》最初局部罗辑把人类文明刻在石头上才得以流传,这真的是一个文化的悲痛! 这里有一个值得学习的点就是学习报纸的排版形式,尽管报纸上稀稀拉拉的写满了文字,然而基本上没有多少人会恶感报纸的排版形式,报纸的排版是一个非常值得学习的学识,对于喜爱纸质笔记的人来说,学习报纸的排版形式算是比拟推崇的。火锅式读书法 书中的火锅式是一个生僻字,懒得记忆的我间接叫了火锅式读书法。 对于火锅记忆法,简略了解就是造成本人的标记模式,创立本人的标记习惯,比方作者习惯一本书读三遍并且给书折角并且对于段落进行标记。我不太喜爱这种形式,我尽管不是特地顾惜书的人,然而我拿到的书根本不会让他脏乱,如果书呈现折痕,我也会比拟疼爱。折角对于我来说,并不能造成强烈的揭示作用。因为有时候会呈现误折角,所以在我的个人观点来看,作者的读书形式对我来说参考意义不大。对于火锅式读书法的另一个特点就是重读,重读能够是段落,笔记,也能够是全文,依据过后的情绪重读也有可能,我是比拟懒得,对于一本书能一遍看懂就一遍看懂,看不懂也之后很长时间之后偶然翻一翻,所以我喜爱 一遍读懂一本书。这种想法或者会受到很多人的拥护,然而短暂的读书习惯。让我不再想起读一遍曾经读过的书。(当然技术书籍和专业书籍除外,这类书籍我会重复去看) 火锅式读书法对于读者来说能排汇多少齐全看集体,这本书在前言局部也说了,作者是个日本人,必然有日本人的思维习惯和生活习惯。很多读书办法在中国其实是走不通的。 广告局部 这本书让我比拟在意的局部最初一个点就是作者的广告局部,作者竟然用了十多种的笔来做笔记,在我看来不是很能了解。所以对于这部分的感触,集体在思维导图列举的局部是集体可能会有动向购买的辅助工具,也算是吃到了安利。 便携浏览架:集体有一个nice202d 的浏览架,理论体验十分棒,架在桌子上加一个台灯很有读书的气氛。当然也比拟贵。同时比拟沉,适宜放家里。买一个便携浏览架是看书之后才有的想法,因为有时候拿出书本记笔记的时候,书会本人合上十分恼火,一个夹书的工具对我来说很有必要玻璃镇纸:压书神器票夹:让书摊开最简略的工具,对于书本的挫伤也是最大的钢笔:尽管我字丑,然而我比拟喜爱钢笔的外观以及写字的感触。便当贴:便当贴挺好的,不过淘宝买的便当贴老是本人掉,下次买国誉的试一试三菱黑白铅笔:做笔记感觉不错,各种色彩很醒目。当然也比拟贵不得不说,文具这一块日本齐全是霸主的位置,国内还须要好好致力。集体感悟 这本书精确来说就是作者的经验之谈,作者在反复强调调用趣味和简略记录来让本人保持写读书笔记,并且一次次的“安利”读书笔记的妙用。我的无效读书伎俩是无时无刻把书摆到离本人最近的地位。让本人能够随时碰到,同时只有是休息时间就拿进去翻一翻,这样能够激发我的趣味。书中对于重读这部分是集体须要改良的局部,因为我发现自己很少去回顾以前的内容,总是在须要的时候焦急找,这样挺不好的,后续会制订集体的复习计划,"重读"本人以前的记录。 集体比拟认同的局部是作者对于为什么要写读书笔记,讲到了人连昨天吃的饭都会遗记,不要指望人能够融入多少常识,写的十分实在,因为很多人甚至连刚刚想起的事件都会马上遗记。另外集体还比拟认同作者的信息一元化的观点,我的观点也是信息一元化,集体不善于整顿,同时比拟自在放荡(家里很乱就能够看出)。所以我的形式根本也是依照时间轴的程序记录,这种记录形式对我的作用一方面是能够很快的查找,因为一个月一个月翻,总能翻到想要的内容。这种简略疾速的形式,不仅让我只须要关注每一个月该干什么,同时能够关注到每一个月干了什么。比方这个月搬家找房子节约了很多工夫,产出少了,从月份记录中显著就能够看出。 最初说下我对无效读书的认识,所谓无效读书最根本的还是要调动趣味,集体观点认为很多人其实不适宜看书,更适宜有人讲书中的内容给他听,至于为什么有的人读书想睡觉,其实这其中有肯定的科学依据,以前翻材料的时候有过理解,然而起初忘了,总之就是对于因为大脑的思考开释的劳动信号。这里其实简略设想一下为什么很多人喜爱看各种网文和小说,一方面生存的压力之下很难集中精力,下班拥挤的公交地铁上,网文正好既能够补充这段空档,所以很多人喜爱看网文,然而遇到须要大脑思考的内容,大脑会因为爱护机制开释劳动信号,从而造成催眠的成果。 总之,不论模式如何,无效读书的最终法令还是造成集体记录和感悟。如果想要晓得我的读书观点和习惯,能够看看往期读书方法论的文章,心愿对你有帮忙: 文章链接:读书方法论(一) 总结: 我的读书笔记比拟自在,没有什么条条框框和格局,只有是记录自身就会让我很开心,尽管品质可能不如人意,哈哈,然而真心倡议每一位读者好好思考下你的工作和人生经验留下了多少回顾,我集体喜爱用照片去回顾,喜爱每天记录本人的生存去回顾,能够看到过来那个“傻傻”的本人,后续打算看看小王子和工夫治理方面的书籍,人不知;鬼不觉21年过来4分之一,工夫过得太快了,搬家之后,要多多读书和空虚本人,明天的读书笔记分享就到这了。 另外,这次搬家搬了20多本书,下决心买了一块大的墨水屏幕,Ireader smart2,为了避免有人说我安利,我这里间接截个图:(不要问为什么要花1800大洋去买一个“电子垃圾”,买Ipad它不香么这种话。我只想说:谁用谁晓得)

March 26, 2021 · 1 min · jiezi

关于读书笔记:前方的路读书笔记

1. 整体来说,这本书到底在谈些什么?找出书的主题,作者如何顺次倒退这个主题,如何逐渐从外围主题合成出隶属的要害议题来。以工夫程序来展示 2004 年到 2014 年两头 10 年的一些想法、本人其中读的书,接触到的人,以及随着工夫变动,关注点与思维的变动。 2. 作者细部说了什么,怎么说的?找出注要的想法、申明与论点这些作者想要传播的信息。全书目录2004 年 期待戈多体制与共性奥维尔上海下雪了2005 年 春天,想起海子比尔盖茨和理查德斯托曼了不起的盖茨比提高与贫苦罗马假日漂亮心灵的永恒阳光歌词曾国藩家书黄仲则2006 年 屈原《渔父》历史过程学科与采矿生命中那些虚无的期待梵高的星星为什么如此亮堂卡尔维诺《树上的男爵》复仇者 V托马斯林奇《殡葬人手记》喜好读书的匪徒黑客帝国卡尔维诺《看不见的城市》技术类业余和思维类业余冬天有没有蟋蟀月圆之夜2007 年 骆一禾《世界的血》记者是这样被打死的弱与力自在流动的世界春天的校园美国电视剧《英雄》草地上的夜医科毕业生到哪里去了?权证的骗局《波士顿法律》中的一个案例世界上最稀缺的资源为什么给好人辩护?Deniele Matioli 眼中的上海Book People Mailling List 发表敞开中国图书出版业2008 年 Life is short暴力的本源苏州扫墓A Lonely Driffer Off To See The World一个寻找作者的读者鲁迅是乐观主义者吗?十年互联网和改造社会《绍兴晚报》的“每月悲情”研究生齐全求生手册2009 年 经济学是无用的AIG 副总裁的辞职信油画《春天来了》硕士学位的升值向秀《思旧赋》Uninx40 岁的感想小说《追踪恐龙的人》现代人为什么焦虑?所有皆有可能我为什么喜爱编程对于唐家岭为什么我不喜爱现行的版权制度对于杨宪益学生决定,还是做决定我要翻译 Paul Graham 了2010 年 为什么要容忍谬误舆论?网络时代的音乐家生存指南如何让员工终于公司?放弃愚昧六六的《心术》被回绝,也是一种必定什么是边际2011 年 IETF:互联网精力的榜样漂亮新世界詹宏志人生只有 900 个月论文的版权属于谁?Michael S.Hart 逝世了乔布斯的辞别活着的三个理由放弃简略:留念丹尼斯里奇苦楚造就性情,兴许还造就产品禅与摩托车培修艺术2012 年 胡适的三个主义失败的总和Linus Torvalds 自传2013 年 苹果公司与分工原理嫡的社会学意义向着将来而生—《黑客与画家(精装本)》序言2014 年 技术有什么将来?上面是各个文章划的笔记前言: 每个人的生存都是一条通向本身的路线。每个人的真正职责只有一个:找到自我。而后在心中坚守毕生,全心全意,永不平息。期待戈多 戈多象征着命运,或者说,象征着可能扭转你的命运的一个人、一件事、一个机会。流浪汉期待的其实不是戈多,而是期待命运被扭转。很惋惜,他们等不到每个人都在期待戈多,期待好运来临和人生转折。它会到来吗?人生的悲痛就在于,大多数时候,命运其实早已注定,戈多不回来。你不得不徒劳的等上来,本人坑骗本人说,兴许今天就会有扭转产生,这样能力免于失望。体制与共性 体制就是要克制活着毁灭共性。共性强的人在体制内,往往很难有好的倒退,甚至很难生存下来。一个古代的人,一方面自我意识空前强烈,强调共性和自我价值,另一方面,又无比依赖日益机械化、标准化的工业社会,须要这个社会为他提供生活资料,同时承受社会为他安顿的角色。其实,大多数人的共性,是注定没有机会现显露出来的,因为社会不容许你有共性。在咱们的生命里,遵从社会的须要远远重要于遵从本人的须要。从根本上看,咱们大多数人都彼此雷同,是工业社会这部剧大机器上的一个标准化整机罢了。奥威尔 他说本人信奉社会主义,但他对社会主义的解释始终在变动他认为本人是一个社会主义者,但又强烈拥护斯大林式的社会主义,尤其拥护极权主义统治。这种思维贯通在他当前的所有作品中,也成为了他为之创作的主题。猪的口号是:所有的动物生而平等,然而有些动物比其余动物更平等一些。奥威尔已经这样写道:一个人如果将他本人形容的很好的话,他十有八九是在扯谎,因为任何生命从外部扫视都只不过是一系列的失败。了不起的盖茨比 他爱的是本人的幻梦,戴西只是那个幻梦的化身,后果越陷越深,直至丧命。提高与贫苦 经济倒退不肯定会缓解贫苦,反而可能加剧贫苦,物质提高不仅不能解脱贫苦,实际上它产生贫苦。尽管经济反动使生产力回升,但它不肯定是在底部对社会构造起作用,把整个社会都贬低,反而如同一个微小的楔子,在社会的中部穿过来。那些在决裂点上的人们处境回升了,然而那些在决裂点以下的人们被压碎了罗马假日 公主遇见独身的乔,来到他住的公寓,不了解他的生存为什么如此清苦,竟然小到连厨房都没有。公主问乔:你喜爱这种单身汉的生存,每顿饭都要到里面吃?乔的答复是我能想到的最佳答复,他说:人生不可能样样如意。Life isn’t always what ones likes.曾国藩家书 盖世人读书,第一要有志,第二要有识,第三要有恒。 有志则断不甘为上流有识则知学识无尽,不敢以一得自足,如何河伯之观海,如井蛙之窥天,皆无识者也有恒则断无不成之事历史过程 什么叫历史过程?就是无奈防止的就义。一个英国历史学家说:历史波及的只是一个民族生存的极小局部。人民的大部分生存,过来和将来都不会有文字记录。学科与挖矿 忽然想到一个比喻:抉择业余就如同挖矿一样有的矿是新矿,埋藏浅,品尝高,容易开采和出成绩。新兴学科(比方计算机科学)大略就是这样的矿有的矿是老矿,曾经开采了几十年甚至上百年,容易采集的矿石都曾经挖掉了,剩下的矿石埋藏深,品尝差,采集难度大。要取得同样的成绩,要比以前多花成倍的气力。比方历史不同的学科也有本人的价值,然而年轻人抉择不同的学科,会有截然不同的后果。抉择计算机,25 岁就能取得成绩;抉择历史学,兴许要到 45 岁。而成绩往往和待遇分割在一起,早出成绩 20 年,对人身过的影响不堪称不大。卡尔维诺《树上的公爵》 ...

March 5, 2021 · 1 min · jiezi

关于读书笔记:代码简洁之道读书笔记

《代码简洁之道》读书笔记前言: 这本书算是一本编程必读书,对于如何优化本人的代码很有帮忙。这本书看了有将近一周的工夫,更多工夫花在了实际代码下面,依照书中给出的倡议去思考和优化本人的代码,发现其中的过程其实是十分高兴的,这次的读书笔记介绍一下从这本书中学到了那些内容。 文章目标:致力写出简洁的代码是程序员的基本素质,时刻关注各个细节把简略的事件做到极致,才有能力做更有挑战的事件收集《代码简洁之道》的书籍基本知识和内容点,回顾书籍集体认为比拟重要的内容。利用思维导图总结整个书籍的大抵内容(导图内容较为宏大)简述: 作者通过最简略的为什么要编写代码到编写简洁代码的一些倡议,从最简略的命名标准逐步扩大到办法,类,零碎,到最终利用一个理论的案例讲述作者亲身经历的一次代码重构体验,在难易度和节奏的把控比拟到位,不须要放心一上来就是简单的实践,十分具备条理。 这本书的内容比拟重要的是在于实战,提供大量代码和阐明进行迭进式革新(尽管看的想睡觉),如果当做实践书去看把这本书简略扫一遍其实毫无意义。同时这本书全书围绕着“简洁”两个字,用了大量的案例和理论教训举证各种程序员写代码容易犯的谬误,略微看看就能够看到很多倡议“很像”本人平时写代码的做法。 举荐水平:强烈推荐,程序员必读书之一,作者提供了很多的倡议如何写出整洁的代码,同时给出代码实战怎么解决代码。 如果想要看实战代码改良局部,能够查看附录B对于SerialDate这个类是如何进行迭进和革新的,对于学习改进代码非常有帮忙。 最大的问题可能还是本书没有配套的源代码。书中许多对于代码的优化思路在浏览的时候不易了解作者思路思维导图:因为这本书的笔记单靠一篇文章很难梳理完,为了节俭阅读文章的工夫集体将书本的内容提炼笔记和重点精简为思维导图,读者能够按需参考思维导图浏览: https://share.mubu.com/doc/2o... 幕布思维导图 书籍内容分析:重点浏览:上面列出几个比拟重要的点,这里去掉了前面几章对于代码的迭进相干章节,留神这些内容比拟重要,然而苦于找不到现成代码所以没有列入思考范畴(用纸看代码尽管能够然而非常苦楚并且难以了解,集体认为效率太低),所以只列出后面倡议的局部以及最终的总结局部。 PS:上面的内容摘录自思维导图第三章:函数 重点 时刻放弃参数的数量管制函数要返回冀望的内容,运行冀望的行为防止副作用的办法取个好名是好办法的关键步骤简介 介绍如何写出更加简略并且令人夸赞的好办法函数式封装的第一个步骤,时刻练习如何写出好的函数第四章:正文 重点 写出好代码才是要害,先写出好简洁代码,再思考写好正文最好的状态是代码自身就能诠释正文致力写出简略易懂的好正文好正文不仅能够让阅读者了解,还能够让阅读者学到新常识简介 写一个正文容易,然而写好一个正文不容用。程序员因为各种“借口”懒得写正文如果你的代码足够具备表达力,就不须要正文,否则请加上你的正文第七章:异样解决 重点 异样解决的一些技巧 用独自的办法进行try/catch从大的异样到细化异样不要返回Null值异样须要作为繁多职责对待,而不是和办法捆绑简介第九章:单元测试 重点 测试单元:一个测试一个断言,测试单元尽可能简短FIRST准则 F:疾速 测试能够疾速进行I:独立 测试之间互相独立R:可反复 测试在任何环境都能够通过S:自足验证 存在布尔值输入,能够验证本人的后果T:及时 测试要及时进行编写简介 学习应用TDD测试驱动开发的模式单元测试是十分重要并且必要的 测试的益处整洁的测试TDD的三大定律 编写不能通过的测试代码之前,不编写生产代码只编写刚好无奈通过的单元测试只编写刚好足以通过测试的生产代码第十章:类 重点 大量的大类并不一定比大量小类好治理用尽可能少的类和办法实现目标类不应该有太多的权责和烦扰简介 要害内容在于类的权责拆分 当失去内聚的时候就想方法拆分生存形象:你是要一个装任何货色的百宝箱还是一个布满各种放个的工具箱第十七章:滋味和启发 #重点 重点 总结全书的一些要点回顾全书的重点内容简介 十分重要的一个章节,用一个章节概括了全书的一些重要内容能够从最初一章确定全书要浏览的局部作者的核心思想:从头到尾认真仔细浏览下来,做了很多的笔记,上面就集体了解说一下作者的几个核心思想: 繁多职责:不论编写简略还是简单的代码,都须要关注权责的拆分。简洁:要想尽一切办法致力优化本人的代码,养成一个良好的编程习惯。迭进:作者通过大量的案例和代码表白对于代码是如何一步步进行迭代改良的,要一直的思考和改进正文:好正文真的十分十分重要,尽管正文这一章其实更像是作者的吐槽和抱怨批评精力:不在乎程度的高下,敢于去重构代码,并且检查和思考重构:看似每一个无关紧要的细节的改变对于零碎构建产生的魔力变动序章序章能够明确作者写这本书的用意,作者激励读者对于代码提出挑战,并提出了如下的观点: 神在细节之中5S哲学 整顿:命名标准整顿:每段代码在期待的中央分明:正文和解决利用diamante清洁:组织构造清晰身美:乐于改良首章要有代码作者在第一章不是上来就介绍如何编写好代码或者一些技巧,而是探讨提倡的AI编程(其实很早就有这个概念了)以及编写代码的重要性,上面记录书中提出的对于编写代码的一些态度,集体了解是作者对代码存在极致的谋求,所以结尾便激励读者要写出 整洁的代码: 代码永存,必须要要有代码勒布朗法令:稍后等于永远不做不要把烂代码归咎为外因好代码的前提 果决敢绝,就事论事,没有犹豫和无用细节表面或者举止令人愉悦,柔美与雅致滋味和启发集体倡议工夫比拟紧迫或者想要简略理解全书大抵内容的,间接去浏览最初一个章节“滋味与启发”,本局部内容间接介绍了全书的一些核心理念,相当如作者给你做了一次总结,十分良心。倡议重点浏览本章节的内容,外面用了十分多的小点介绍了一些平时编写简洁代码的倡议。 附录局部内容:附录的内容比拟容易被疏忽,尽管是对于并发模块和测试检测异样做了一个入门的介绍。这部分作者讲了集体亲身经历调优并发代码的故事比拟有意思。附录局部摘录这里记录附录局部对于如何计算线程的门路数量笔记 如何计算门路数量:假如有N个指令和T个线程,将会产生T*N个步骤 假如有步骤AB和线程12,将会有如下的状况: 1122、1212、1221、2112、2211、2121 他们的特色是:每个T会呈现N次,因为不论程序如何执行,执行必定会被执行实现 这样就引出一个公式: (N*T)! / N!^T (!为阶乘操作) 举例:对于有2个步骤和2个线程的代码, 带入公式可得:(2*2)! / (2!)^2 = 24 / 4 = 6 将会呈现6种状况 ...

February 19, 2021 · 1 min · jiezi

关于读书笔记:小狗钱钱读书笔记

《小狗钱钱》读书笔记前言:小狗钱钱算是真正意义上集体第一本理财书,作者用故事向读者讲述理财,不论是学习还是单纯当一个故事去看,集体都感觉作者十分有教育意义。这本书和《穷爸爸与富爸爸》一样是对理财的启蒙书,然而他的“下部”更多的是探讨活着的意义,以及好好做人等一些方面的情理。 举荐指数:这本书不论什么年龄段都十分有启发意义,用一个相似童话般的故事,通知人们理财和做人的情理,咱们没有配角那边侥幸而微妙的事件,然而的确能够通过口头来扭转本身。 思维导图:上面是集体的思维导图笔记,这次没有参考他人怎么写的,齐全依照本人的想法进行: 【https://share.mubu.com/doc/3T...】 幕布笔记 复读:上面的内容其实和看书一样了,不喜爱就跳过吧。大抵讲了下集体读书的记忆。为什么要复读,一方面本人切实是喜爱这本书,另一方面是记录一下心愿当前还能怀着感谢的情绪回想起来,就和书中所讲的一样,重要的不是你想要做什么,而是你做过什么。 本书分为高低两部,上部讲述如何造就“甜甜圈”的外圈,而下部则通知读者要丰盛“甜甜圈”的核心,因为最重要的往往是看不见的,许多人具备类似的‘圆圈’,但他们的‘圆孔’却各不相同。 以下内容全凭记忆复述。=-= 上部:吉娅在一个由本来的富人转为濒临破产的中产家庭,父母因为经济拮据常常争吵,每天一直的埋怨和压抑笼罩着吉娅的家庭,而吉娅则始终想要逃离这种家庭,同时认为本人去美国的幻想永远不会实现。 某一天在吉娅的院子里躺着一条受了轻伤的小狗,吉娅因为同情心申请父母收容,父母在软磨硬泡之下终于许可收容,然而正是这条小狗,改写了吉娅一家的将来。而父亲为小狗称之为“钱钱”,也是故事的开始。因为在将来“钱”真的像“小狗”一样凑近吉娅一家。 关照“钱钱”一段时间之后,某一天吉娅救下不小心掉入水中的“钱钱”,钱钱在被救起之后,居然闭口谈话,并且通知吉娅它能够帮忙吉娅实现本人的幻想,同时扭转家庭情况。然而前提是吉娅真的想要扭转 “钱钱”通知吉娅首先筹备“幻想相册”和“胜利日记”,还有一个“幻想储蓄罐”,“幻想相册”记录本人最想做的十件事件,并且从中筛选三件最重要的事件。吉娅用筛选了下了去美国,买笔记本、帮忙父母解脱负债。钱钱通知吉娅每天须要把本人的每一份零花钱分成三份,把一半以上放入储蓄罐外面作为启动资金(集体了解),剩下一小半,一大半投入到本人的幻想,留下最初一部分,作为本人的零花钱。(事实证明,如果从小时候养成存钱和布局资产的习惯,大部分人在工作当前,根本都会有不错的启动资金。当然我没做到,哈哈) 妈妈晓得吉娅幻想并且据说储蓄罐的事件之后讥笑吉娅存钱的速度,实现幻想早就成为老奶奶了,而吉娅因为自尊心大哭一场,并且更加下定决定要实现本人的去美国读书的幻想,而小狗钱钱则说:在你实现幻想的路线上会有有数的人来阻止你本人,有时候甚至会是本人最亲的人。 吉娅受挫之后,信心想方法挣钱达成幻想,然而她发现没有任何思路,三思而行之下,她鼓起勇气找到堂兄,在堂兄数数落成只会玩洋娃娃的小女孩之后,还是给了吉娅倡议,讲述本人卖面包赚钱的事件,并且通知吉娅赚钱的机会往往在人们最须要同时他们最不违心做的事件下面。同时也通知吉娅要去寻找本人想做并且对工作能充满热情的工作形式,因为堂兄就是因为喜爱面包所以他很乐意为别人送本人青睐的面包。吉娅在间断好几天的思考之后,发现了帮街坊“遛狗”这一条路,同时发现“”,就这样吉娅意识了更多的人。 吉娅“遛狗”一段时间之后,“钱钱”的原客人金学生派人找到吉娅一家,并且心愿吉娅能带“钱钱”见他,吉娅起初胆怯会谈话的“钱钱”被人夺走,然而还是捡了金学生,然而金学生和吉娅想的不一样,是一个富裕常识和亲和的富人,然而因为车祸无奈自由行动,钱钱是金学生的上一家客人,因为车祸导致钱钱走失,吉娅讲述本人关照钱钱的经验收到金学生的青睐,并且许可有偿让吉娅每周带钱钱来探访他,吉娅当然欣然接受。 在吉娅打工之路一直扩大的时候,钱钱在某一天问吉娅是否有记录胜利日记,吉娅说本人因为琐事遗记写,受到钱钱的正告,不论产生任何事件,都不要遗记写胜利日记,如果不去写胜利日记,那么胜利只会离吉娅越来越远,很多人十分致力却素来记不住本人做过什么,他们逐步偏离本人的指标,遗记本人的幻想。(和想要减肥是一个情理)。 吉娅和金学生分享胜利笔记和幻想相册,让金学生很感兴趣,金学生和吉娅讲了一个“鹅”的故事,揭示吉娅要造就本人的“鹅”,同时不要让他人夺走或者杀死本人的“鹅”。吉娅从金学生学到了很多情理。 吉娅的“遛狗”事业不断扩大,然而因为须要的遛狗的人越来越多,吉娅逐步力不从心,吉娅在堂兄的倡议之下,找到本人的好敌人为本人遛狗,并且从敌人的“工资”当中抽取一部分作为“举荐费”,吉娅起初感觉很愧疚,因为本人没有工作却要从本人敌人的那里失去报酬,而金学生开导了她,通知她说你为你的敌人提供的金点子,不仅让你能够赚钱,也让你的敌人赚到了钱,而你的敌人也很乐意为你工作,这是你应得的。 吉娅和堂兄以及小伙伴意识了贵妇,而在探险的过程中胜利守住了财产,贵妇为了回报吉娅等小伙伴,提议一起建设一个基金小队,一起投资购买股票和基金,妇人提议购买购买基金的办法,要购买跨国公司的股票,并且要做好长期持有的筹备。在他们刚开始购买股票的半年,基金大跌,此时堂兄感觉基金要亏钱想要取出来然而被阻止了,又过了半年之后,基金翻倍了,此时堂兄想要把利润取出来庆贺一下,也被贵妇阻止了,而此吉娅和搭档们分享了“鹅”的故事受到了大伙们的欢送,同时贵妇举荐吉娅去学校把理财的观点流传给学校,想让吉娅下台进行演讲。 吉娅因为胆怯上台演讲,而钱钱让吉娅去看胜利日记,吉娅通过日记胜利的解脱了心田的恐怖,同时在小伙伴和父母街坊的反对下,吉娅更是十分棒的分享了本人的经验,杰出的实现了演讲。 故事到这里差不多就告一段落了,至此是集体回顾的全部内容,比方金学生帮忙吉娅父母托付了负债问题,而吉娅和父母谈心之后,父亲分明本人想要做的事件之后,进来守业。 到上部的最初,小狗钱钱说当前再也不能谈话了,钱钱通知吉娅说你失去某样货色的时候,必然会失去一些货色,然而永远不要去思念曾经失去的货色的,而是要好好想想本人当初领有的货色。 下部:下部我感觉有必要认真品尝一下,下部集体认为是作者所认知的做人的正确准则,同时用故事通知咱们嫉妒是如何让一个人变得狭窄,讥笑别人的毛病最初给吉娅造成多大的麻烦,国王硬币的正反面给人带来的思考,吹牛傲慢的人是如此的无知和有力,只管他们说的话有时候很有情理,然而并不能覆盖软弱和无知,通知读者不论你的对手如许弱小,都要想尽办法克服“失败”的恐怖,吉娅在“外在”形象丰盛的同时,也带来了不少问题。第二部次要讲了吉娅的个人成长。还是非常有意思的。 精句摘录:许多人具备类似的‘圆圈’,但他们的‘圆孔’却各不相同。在你的生命中没有什么比寻找红色石头更重要的事件了。如果不去寻找,当然能够防止很多危险与问题,可你也将无奈取得你原本可能失去的幸福。哪里都有可恶的人,当然也有不那么可恶的人。不可能所有人都是敌对的。这不以人的意志为转移。有些人连本人都不喜爱,因此也不会去喜爱他人。取决于你怎么想。如果你只想着本人将要失去一些货色,那就必定会苦楚。但如果你更多地想到咱们在一起经验过那么多美妙的事件,高兴和感谢之情就会占据下风。感悟: “永远不要杀死你的鹅”是我认为能从书中学到的最好的货色,同时“甜甜圈”和“红色石头”,是须要一直思考的,我从这本书外面学到了许多对本人有用的货色。 胜利日记和常识的笔记是很重要的,如果咱们要晓得本人的常识是否正确,以及本人做的事件是否正确,那么最好的形式无疑就是分享进来,分享给你的敌人和家人,让他们用他们的思考去对待这件事。如果你做的事件失去大多数人的认可。 永远记住在过上本人想要生存的路线上,人永远都不是孤单的。 总结:集体还是很喜爱小狗钱钱这本书的。我时常会想起这本书的故事,想起吉娅和小狗钱钱,我也时常在思考本人脑海的伟人和侏儒,我也在反抗侏儒,站在伟人的肩膀上思考。

January 23, 2021 · 1 min · jiezi

关于读书笔记:代码整洁之道读书笔记

代码整洁之道更有意义的命名废话是另一种没意义的辨别。假如你有一个 Product 类。如果还有一个 ProductInfo 或ProductData类,那它们的名称尽管不同,意思却无区别。Info和Data就像a、an和the一样,是意义含混的废话应用读得进去的名称:人类长于记忆和应用单词。大脑的相当一部分就是用来包容和解决单词的。单词能读得进去。人类进化到大脑中有那么大的一块中央用来解决语言,若不善加利用,切实是种羞耻窃以为单字母名称仅用于短办法中的本地变量。名称长短应与其作用域大小绝对应::类名和对象名:应该是名词或名词短语::,如Customer、WikiPage、Account和AddressParser。防止应用Manager、Processor、Data或Info这样的类名。类名不该当是动词::办法名:该当是动词或动词短语::,如postPayment、deletePage或save。属性拜访器、修改器和断言应该依据其值命名,并依Javabean规范[10]加上get、set和is前缀取好名字最难的中央在于须要良好的形容技巧和共有文化背景。与其说这是一种技术、商业或治理问题,还不如说是一种教学问题。其后果是,这个畛域内的许多人都没能学会做得很好函数::函数的第一规定是要短小。第二条规定是还要更短小::。我无奈证实这个断言。我给不出任何证实了小函数更好的钻研后果。我能说的是,近40年来,我写过各种不同大小的函数。我写过令人憎恨的长达3000行的厌物,也写过许多100行到300行的函数,我还写过20行到30行的。通过漫长的试错,教训通知我,函数就该小::函数应该做一件事。做好这件事。只做这一件事。::要判断函数是否不止做了一件事,还有一个办法,就是看是否能再拆出一个函数,该函数不仅只是单纯地从新诠释其实现参数: ::最现实的参数数量是零::(零参数函数),其次是一(单参数函数),再次是二(双参数函数),应尽量避免三(三参数函数)。有足够非凡的理由能力用三个以上参数(多参数函数)。有两个参数的函数要比一元函数难懂,对于一元函数,函数和参数该当造成一种十分良好的动词/名词对模式。例如,write(name)就相当令人认同。不论这个“name”是什么,都要被“write”。更好的名称大略是writeField(name),它通知咱们,“name”是一个“field”标示参数:::标识参数俊俏不堪。向函数传入布尔值几乎就是骇人听闻的做法::。这样做,办法签名立即变得复杂起来,大声发表本函数不止做一件事。如果标识为true将会这样做,标识为false则会那样做!在代码清单3-7中,咱们别无选择,因为调用者曾经传入了那个标识,而我想把重构范畴限度在该函数及该函数以下范畴之内。办法调用render(true)对于可怜的读者来说依然摸不着头脑。卷动屏幕,看到render(Boolean isSuite),稍许有点帮忙,不过依然不够。应该把该函数一分为二:reanderForSuite( )和renderForSingleTest( ) “Try/catch代码块俊俏不堪。它们搞乱了代码构造,把错误处理与失常流程一概而论。最好把try和catch代码块的主体局部抽离进去,另外形成函数。“函数应该只做一件事。错误处理就是一件事。因而,处理错误的函数不该做其余事。这意味着(如上例所示)如果关键字try在某个函数中存在,它就该是这个函数的第一个单词,而且在catch/finally代码块前面也不该有其余内容”别反复本人:反复可能是软件中所有邪恶的本源。许多准则与实际规定都是为管制与打消反复而创立写代码和写别的货色很像。在写论文或文章时,你先想什么就写什么,而后再打磨它。初稿兴许简陋无序,你就斟酌斟酌,直至达到你心目中的样子。我写函数时,一开始都简短而简单。有太多缩进和嵌套循环。有过长的参数列表。名称是随便取的,也会有反复的代码。不过我会配上一套单元测试,笼罩每行俊俏的代码。大师级程序员把零碎当作故事来讲,而不是当作程序来写 正文正文的失当用法是补救咱们在用代码表白用意时遭逢的失败。留神,我用了“失败”一词。我是说真的。正文总是一种失败。咱们总无奈找到不必正文就能表白自我的办法,所以总要有正文,这并不值得庆祝我为什么要竭力贬斥正文?因为正文会扯谎。也不是说总是如此或无意如此,但呈现得切实太频繁。正文存在的工夫越久,就离其所形容的代码越远,越来越变得全然谬误。起因很简略。程序员不能保持保护正文实在只在一处中央有:代码。只有代码能忠诚地通知你它做的事。那是惟一真正精确的信息起源。所以,只管有时也须要正文,咱们也该多花心思尽量减少正文量

November 29, 2020 · 1 min · jiezi

读书笔记数学之美下

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 文章中的数学公式若无法正确显示,请参见:正确显示数学公式的小技巧 本文为《数学之美》的读书笔记。 第19章 谈谈数学模型的重要性数学很重要第20章 谈谈最大熵模型思想:对一个随机事件的概率分布进行预测时,我们的预测应当满足全部已知条件,而对未知的情况不要做任何主观假设。$$P(d|x_1,x_2,...,x_{20}) = \frac{1}{Z(x_1,x_2,...,x_{20})} e^{\lambda_1 (x_1,d)+ \lambda_2(x_2,d)+ ... + \lambda_{20}(x_{20},d)}$$归一化因子:$$Z(x_1,x_2,...,x_{20}) = \sum{e^{\lambda_1 (x_1,d)+ \lambda_2(x_2,d)+ ... + \lambda_{20}(x_{20},d)}}$$第21章 拼音输入法的数学原理语言模型第22章 自然语言处理的教父马库斯和他的优秀弟子们人物传记第23章 布隆过滤器本质和哈希表一样,区别是映射函数精心设计过,在可接受的冲突率前提下,减少了内存的占用。第24章 贝叶斯网络(信念网络)马尔科夫链假设依赖关系是一维的,所以建立一维的链。但实际问题很复杂,很多依赖关系不能用链上的状态转移描述,需要用图描述。为了计算方便,依旧保持马尔科夫假设成立,即每一个状态只与和它直接相连的状态有关。第25章 条件随机场、文法分析及其它条件随机场:在隐马尔科夫模型中,$x_1,x_2,...$ 为观测值,$y_1,y_2,...$ 为隐状态,$x_i$ 只与 $y_i$ 有关。而条件随机场中,$x_i$ 与 $y_i$、$y_{i-1}$、$y_{i+1}$ 都有关。可以认为条件随机场是一种特殊的概率图模型。仍遵守马尔科夫假设。条件随机场是无向图。条件随机场通常用最大熵模型建模:$$P(x_1,x_2,..,x_n,y_1,y_2,...,y_m) = \frac{e^{f_1+f_2+...+f_k}}{Z}$$第26章 Viberti 算法隐马尔科夫模型可以转换为篱笆网络。Viberti 使用动态规划思想在这个网络中求最短路径。第27章 期望最大化算法第28章 逻辑回归和搜索广告搜索广告的发展:竞价排名 -> 预测用户点击 -> 全局优化预测广告点击率一般用逻辑回归做第29章 各个击破算法和 Google 云计算的基础MapReduce第30章 Google 大脑和人工神经网络人工神经网络人工神经网络与贝叶斯网络的关系: 有向图,且遵从马尔科夫假设训练方法相似对于很多模式分类问题,两种方法效果相近Google 大脑:分布式的人工神经网络第31章 大数据的威力数据很重要

August 17, 2019 · 1 min · jiezi

读书笔记数学之美中

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 文章中的数学公式若无法正确显示,请参见:正确显示数学公式的小技巧 本文为《数学之美》的读书笔记。 第 8~18 章介绍搜索引擎的内容与《这就是搜索引擎》相近,先跳过,有时间再补。

August 17, 2019 · 1 min · jiezi

高级程序设计第7章函数表达式

函数表达式函数表达式是JavaScript中的一个既强大又容易令人困惑的特性。 定义函数表达式的方法1.函数声明 function functionName(arg0,arg1,arg2){ //函数体}先有function关键字,然后是函数的名字,就是指定函数名的方式。他还有一个重要特征就是<font color="red">函数声明提升</font>意思是在执行代码之前会先读取函数声明。(意味可以将函数声明放在调用它的语句后面)如下: sayHi()function sayHi(){ alert("Hi!");}2.函数表达式 函数表达式有几种不同的语法形式,下面是最常见的一种。 var functionName=function(arg0,arg1,arg2){ //函数体}创建一个函数并将它赋值给变量functionName,创建的函数叫做<font color="red">匿名函数</font>,因为function关键字后面没有标识符。(匿名函数也叫做<font color="red">拉姆达函数</font>) 匿名函数的name属性是空字符串。 递归递归函数是在一个函数通过名字调用自身的情况下构成的如下: function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); }}1.arguments.callee是一个指向正在执行的函数的指针,因此可以用来实现对函数的<font color="red">递归调用</font>如下: function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); }}用arguments.callee代替函数名,可以确保无论怎样调用函数都不会出问题。但是在<font color="red">严格模式</font>下访问arguments.callee属性会出错。可以使用命名函数表达式来达到相同的结果。如下: var factorial=(function f(num){ if(num<=1){ return 1; }else{ return num*f(num-1); }}这种方式在严格模式和非严格模式都可以使用。 闭包闭包是指有权访问另一个函数作用域的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数。如下: function init(){ var name="Mike"; function displayName(){ alert(name); } displayName();}init()init()函数创建了一个局部变量name和一个名为displayName()的函数。displayName()函数是定义在init()里面的内部函数,仅在该函数体内使用。displayName()没有自己的局部变量,然而它可以访问到外部函数的变量,所以displayName()可以使用父函数init()中声明的变量name。 注意:由于闭包会携带它的函数作用域,因此会比其它函数占用更多内存。过度使用闭包可能会导致内存占用过多。this在全局函数中,this等于window,而当函数作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向window 如果在通过call()或apply()改变函数执行环境的情况下,this就会指向其它对象。

July 1, 2019 · 1 min · jiezi

读书笔记概率论与数理统计下

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 文章中的数学公式若无法正确显示,请参见:正确显示数学公式的小技巧 本文为概率论与数理统计的笔记。 11. 第十一周11.1 总体,样本11.2 常用统计量 样本均值:$\overline{X} = \frac{1}{n} \sum_{i=1}^{n} X_i$样本方差:$S^2 = \frac{1}{n-1} \sum_{i=1}{n}(X_i - \overline X)^2$样本 $k$ 阶矩:$A_k = \frac{1}{n} \sum_{i=1}^{n} X_i^k$样本 $k$ 阶中心矩:$B_k = \frac{1}{n} \sum_{i=1}^{n} (X_i-\overline X)^k$11.3 抽样分布 正态分布$\chi^2$ 分布(卡方分布) 定义:n个服从标准正态分布 $N(0,1)$ 的随机变量相互独立,则称 $\chi^2 = \sum_{i=1}^{n} X_i^2$ 服从自由度为 $n$ 的 $\chi^2$ 分布,记为$\chi^2 \sim \chi^2(n)$概率密度:$f_n(x) = \left \{\begin{matrix} \frac{2}{2\Gamma(n/2)}(\frac{n}{2})^{\frac{n}{2}-1}e^{-\frac{x}{2}} & ,x>0 \\ 0 & ,x \leq 0 \end {matrix} \right.$,其中 $\Gamma(\alpha) = \int_{0}^{+\infty} x^{\alpha-1}e^{-x}dx$性质: ...

June 13, 2019 · 2 min · jiezi

读书笔记概率论与数理统计中

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 文章中的数学公式若无法正确显示,请参见:正确显示数学公式的小技巧 本文为概率论与数理统计的笔记。 8. 第八周8.1 期望 离散型:$E(X) = \sum_{k=1}^{+\infty} x_k p_k$连续型:$E(X) = \int_{-\infty}^{+\infty} xf(x)dx$若 $Y = g(X)$,则: 离散型:$E(Y) = E(g(X)) = \sum_{k=1}^{+\infty} g(x_k)p_k$连续型:$E(Y) = E(g(X)) = \int_{-\infty}^{+\infty} g(x_k)p_k$若 $Z = h(X,Y)$,则 二元离散型:$E(Z) = E(h(X,Y)) = \sum_{k=1}^{+\infty} h(x_i,y_j)p(x_i,y_j)$二元连续型:$E(Z) = E(h(X,Y)) = \int_{-\infty}^{+\infty} \int_{-\infty}^{+\infty} h(x,y)f(x,y)dxdy$性质: $E(cX) = cE(X)$,$c$ 为常数$E(X+Y) = E(X) + E(Y)$$E(XY) = E(X)E(Y)$,当 $X$ 与 $Y$ 相互独立8.2 方差 方差:$D(X) = Var(X) = E\{[X-E(X)]^2\}$标准差(均方差):$\sigma(X) = \sqrt{D(X)}$离散型:$D(X) = \sum_{i=1}^{+\infty} [x_i - E(X)]^2 p_i$连续型:$D(X) = \int_{-\infty}^{+\infty} [x-E(x)]^2 f(x)dx$性质: ...

June 13, 2019 · 1 min · jiezi

读书笔记概率论与数理统计上

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 文章中的数学公式若无法正确显示,请参见:正确显示数学公式的小技巧 本文为概率论与数理统计的笔记。 1. 第一周1.1 样本空间随机试验的所有可能$S = \{e\}$1.2 事件和事件:$A \cup B$积事件:$A \cap B$、$AB$差事件:$A-B$对立事件:$\overline{A}$1.3 常用公式$\overline{A} \cap \overline{B} = \overline{A \cup B}$、$\overline{A} \cup \overline{B} = \overline{A \cup B}$$P(A\overline{B}) = P(A-B) = P(A)-P(AB)$加法公式:$P(A \cup B) = P(A) + P(B) - P(AB)$、$P(A \cup B \cup C) = P(A) + P(B) + P(C) - P(AB) - P(BC) - P(AC) + P(ABC)$2. 第二周2.1 古典概型(等可能概型)抽球问题:N个球,其中a个白球,b个黄球,不放回抽n次,球恰好k个白球概率 $$ P = \frac{C_a^k \cdot C_b^{n-k}}{C_{a+b}^n} $$ ...

June 13, 2019 · 3 min · jiezi

读书笔记Effective-C09杂项

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 9. 杂项9.1 条款53:不要轻易忽视编译器的警告也不要依赖编译器给你指出错误,因为不同的编译器对错误的敏感度是不同的。9.2 条款54:让自己首席包括TR1在内的标准程序库C++的一些扩展特性会在TR1,虽然这些特性随着C++标准版本的更新逐渐合并到标准中.9.3 条款55:让自己熟悉BoostBoost是一个C++开发者社群,由C++委员会创建,它是C++新特性的试验场,TR1的许多扩展特性是从Boost提交的。

May 22, 2019 · 1 min · jiezi

读书笔记Effective-C08定制new和delete

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 8. 定制new和delete8.1 条款49:了解new-handler的行为 new-handler相当于new的异常处理函数。new申请内存发生异常,调用new-handler处理,处理完了之后继续尝试new,如果还是出错,继续调用new-handler,以此反复。//标准库对于new-handler是这么写的://new_handler被定义成一个函数指针//set_new_handler函数的参数是个指针,指向new无法分配足够内存时应该调用的函数;//set_new_handler函数的返回值是个指针,指向set_new_handler之前设置的new_handler函数namespace std { typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw();}//可以这样使用set_new_handlervoid oufOfMem(){ std::cerr << "Unalbe to new\n"; std::abort();}int main(){ std::set_new_handler(outOfMem); int * pBigArray = new int[10000000000L];}一般来说,new-handler函数会做以下事情的某几件: a. 让更多内存可被使用。使得再次尝试new能成功。b. 安装另一个new-handler。使用更强力的new-handler处理。c. 卸载new-handler。实在不行,卸载new-handler使new抛出异常。d. 抛出bad_alloc的异常。e. 退出程序。abort()或exit()。8.2 条款50:了解new和delete的合理替换时机这部分讲的是:如果你觉得编译器自带的new和delete不好用,应该怎么写一个自定义的函数替换。作者自己也提到了,要自定义new和delete不是简单写个函数就好了,内存的申请和释放会涉及到计算机体系架构中比较底层的东西,比如"内存对齐"。所以重头开始写new和delete是比较复杂的,可以买现成的商业产品,或者在开源代码上修改。8.3 条款51:编写new和delete时需要固守常规条款50已经说明了,自定义new和delete比较复杂,非必要不建议重写。这部分讲了自定义new和delete时需要注意的事项: operator new应该内含一个无穷循环,并在其中尝试分配内存,分配不了,调用new-handler。operator new对0 bytes的内存申请,也需要正常返回指针。operator delete应该在收到null指针时不做任何事。8.4 条款52:写了placement new也要写placement deleteWidget* pw = new Widget//这句话中总共有2个函数被调用:1.operator new分配内存;2.Widget的构造函数//当调用Widget构造函数发生异常时,需要delete掉第一步new出来的内存//如果使用C++自带的new和delete,这个情况不需要用户考虑;如果是自定义new和delete,需要用户考虑

May 22, 2019 · 1 min · jiezi

读书笔记Effective-C07模板与泛型

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 7. 模板与泛型7.1 条款41:了解隐式接口和编译期多态//不用模板的写法class Widget { Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap(Widget& other); ...};void doProcess(Widget& w) { if (w.size() > 10; && w!= ...) { Widget temp(w); temp.normalize(); temp.swap(w); }}//w支持的接口是类型Widget决定的,这称为"显式接口"。//Widget类里面的virtual函数是在运行期确定具体调用哪个函数,这称为"运行期多态"。//使用模板的写法template<typename T>void doProcessing(T& w) { if (w.size() > 10 && w != ...) { T temp(w); temp.normalize(); temp.swap(w); }}//w支持的接口,是由w所参与执行的操作所决定的,比如例子中的w需要支持size()、normalize()、swap()、拷贝构造、不等比较。这称为"隐式接口"。//w所参与执行的操作,都有可能导致template的具现化,使函数调用得以成功,具现化发生在编译期。这称为"编译期多态"。7.2 条款42:了解typename的双重意义//第一重意义template<class T> class Widget;template<typename T> class Widget;//上面两句话效果完全一样//第二重意义//考虑一个例子template<typename C>void print2nd(const C& container) { C::const_iterator* x; //bad,不加typename被假设为非类型,理由见下面注释 ...}//一般,我们认为C::const_iterator指的是某种类型,但是存在一种逗比情况://C是一个类,const_iterator是这个类的int型的成员变量,x是一个int型的变量,那么上面一句话就变成了两个int的相乘。//正因为有这种歧义情况的存在,C++假设不加typename的"嵌套从属名称"是非类型。//应该这么写template<typename C>void print2nd(const C& container) { typename C::const_iterator* x; //ok,告诉编译器,C::const_iterator是类型 ...}7.3 条款43:学习处理模板化基类内的名称//基类template<typename T>class MsgSender {public: ... void sendClear(const MsgInfo& info); ...};//派生类template<typename T>class LoggingMsgSender : public MsgSender<T> {public: void sendClearMsg(const MsgInfo& info) { sendClear(info); //bad,理由见下方注释 }}//编译器遇到LoggingMsgSender类时,不知道要继承哪种MsgSender类,所以编译器不知道sendClear这个函数是MsgSender类里继承下来的成员方法,还是类外面的全局的函数。//为什么说不同的MsgSender类不一定有sendClear成员方法呢?因为C++允许template的特化,比如我在下面写了一个特化的类,这个特化的类为空类,就没有sendClear成员方法。template<>class MsgSender<CompanyZ> { };//解决这个问题的方法,本质就是告诉编译器,sendClear函数的来源。具体来说,有三种方法://方法1template<typename T>class LoggingMsgSender : public MsgSender<T> {public: void sendClearMsg(const MsgInfo& info) { this->sendClear(info); //ok,告诉编译器,sendClear函数是类内的成员方法 }}//方法2template<typename T>class LoggingMsgSender : public MsgSender<T> {using MsgSender<T>::sendClear; //先声明,告诉编译器,如果遇到sendClear函数,则视为类内的成员方法进行编译public: void sendClearMsg(const MsgInfo& info) { sendClear(info); //ok }}//方法3template<typename T>class LoggingMsgSender : public MsgSender<T> {public: void sendClearMsg(const MsgInfo& info) { MsgSender<T>::sendClear(info); //ok,告诉编译器,sendClear函数是类MsgSender<T>内的成员方法 }}//方法3不太好的地方是,假如sendClear()是virtual函数,这种写法会把它的多态性破坏;方法1和方法2则不会破坏。7.4 条款44:将与参数无关的代码抽离templates编译器对template的处理,实际上是对所有可能的template具现出具体代码//模板类template<typename T, std::size_t n>class SquareMatrix {public: ... void invert(); //该函数与template无关}//使用SquareMatrix<double, 5> sm1;SquareMatrix<double, 10> sm2;sm1.invert();sm2.invert();//这个例子中,invert()函数与template无关,但它被编译器生成了两份,造成重复。作者认为将与参数无关的代码抽离templates,可以避免编译器产生这类的重复代码;但我觉得有时候要达到这个目的,会造成代码可读性和编写效率的下降,实际使用时还是要权衡。7.5 条款45:运用成员函数模板接受所有兼容类型假设派生类D继承于基类B,由B具现化的模板类和由D具现化的模板类,并不能相互转换。以代码表述:class B {...};class D : public B {...};template<typename T>class SmartPtr {public: SmartPtr(T* realPtr); ...}//使用SmartPtr<B> pt1 = SmartPtr<D>(new D); //bad,SmartPtr<B>与SmartPtr<D>没有继承关系来使得他们相互转换//解决方法template<typename T>class SmartPtr {public: SmartPtr(T* realPtr); template<typename U> SmartPtr(const SmartPtr<U>& other); //建立一个泛化拷贝构造函数,来解决上面的问题 ...}//当然,对于赋值函数也可以这么操作7.6 条款46:需要类型转换时,请为模板定义非成员函数这条把条款24扩充到模板类上。template<typename T>class Rational {public: ... Rational(const T& numerator, const T& denominator); Rational(sonst T& num); const T numerator() const; const T denominator() const;}const Rational<T> operator* (const Rational<T>& lhs, const Rational<T>& rhs) { ...}//使用Rational<int> lhs(1, 9);Rational<int> result;result = lhs * 2; //bad,template的推导不考虑隐式类型转换,编译器猜不出T是什么result = 2 * lhs; //bad,template的推导不考虑隐式类型转换,编译器猜不出T是什么//解决方法template<typename T>class Rational {public: ... Rational(const T& numerator, const T& denominator); Rational(sonst T& num); const T numerator() const; const T denominator() const; friend const Rational operator*(const Rational& lhs, const Rational& rhs) { //这里要把类外面operator*实现的代码拷贝一份到这里 ... } //在类内声明friend函数,使编译器在类初始化时可以先具现出: //"const Rational<int> operator* (const Rational<int>& lhs, const Rational<int>& rhs)"};const Rational<T> operator* (const Rational<T>& lhs, const Rational<T>& rhs) { ...}//使用Rational<int> lhs(1, 9);Rational<int> result;result = lhs * 2; //ok,由于friend函数带来的具现化,编译器执行到这里时,具现化好的函数中,已经有满足需要的了,不需要推导Tresult = 2 * lhs; //ok,由于friend函数带来的具现化,编译器执行到这里时,具现化好的函数中,已经有满足需要的了,不需要推导T7.7 条款47:使用traits classes表现类型信息STL中广泛使用traits classes来标记容器属于哪一类容器(比如"可随机访问容器":vector、deque等)7.8 条款48:认识template元编程(TMP)所谓元编程,是执行于编译器内的程序,C++以template实现元编程。优点:a. 完成一些以前不可能完成的任务;b. 将工作从运行期转移到编译期(比如之前在运行期才找到的错误可以在编译期找到)。缺点:编译时间变长。TMP不同于"正常化的"C++,还没有完全被C++标准支持,普通用户可以暂时不用了解。

May 22, 2019 · 2 min · jiezi

读书笔记Effective-C06继承与面向对象

6. 继承与面向对象6.1 条款32:确定你的public继承是is-a关系public继承的子类对象需要保证可以被视作父类对象来调用函数。class Person {...};class Student : public Person {...};void eat(const Person& p);void study(const Student& s);eat(p); // okeat(s); // ok,Student可以视作Person调用函数study(s); //okstudy(p); //error,Person不能视作Student6.2 条款33:避免遮掩继承而来的名称int x; //global变量void someFunc() { double x; //local变量 std::cin >> x; //local变量的x遮掩了global变量的x,实际起作用的是local变量的x}//定义基类class Base {private: int x;public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2(); void mf3(); void mf3(double); ...};//定义派生类class Derived : public Base {public: virtual void mf1(); void mf3(); void mf4(); ...};//使用Derived d;int x;...d.mf1(); //ok,调用Derived::mf1d.mf1(x); //bad,因为Derived::mf1遮掩了Base::mf1d.mf2(); //ok,调用Base::mf2d.mf3(); //ok,调用Derived::mf3d.mf3(x); //bad,因为Derived::mf3遮掩了Base::mf3//解决方法1//定义派生类class Derived : public Base {public: using Base::mf1; //让基类中名为mf1和mf3的所有东西在此作用域内可见 using Base::mf3; virtual void mf1(); void mf3(); void mf4(); ...};//使用Derived d;int x;...d.mf1(); //ok,调用Derived::mf1d.mf1(x); //ok,调用Base::mf1d.mf2(); //ok,调用Base::mf2d.mf3(); //ok,调用Derived::mf3d.mf3(x); //ok,调用Base::mf3//解决方法2//定义基类class Base {public: virtual void mf1() = 0; virtual void mf1(int); ...};//定义派生类class Derived : public Base {public: virtual void mf1() { Base::mf1(); } // 转交函数 ...};//使用Derived d;int x;...d.mf1(); //ok,调用Derived::mf1d.mf1(x); //bad,因为Base::mf1被遮掩,且Base::mf1(int)没有被转交6.3 条款34:区分接口继承和实现继承如下代码所示,有3类继承关系: ...

May 21, 2019 · 2 min · jiezi

JavaScript高级程序设计第3版读书笔记-第11章-DOM拓展

尽管DOM作为API已经非常完善了,但为了实现更多功能,仍然会有一些标准或专有的拓展。2008年之前,浏览器中几乎所有的拓展都是专有的,此后W3C着手将一些已经成为事实标准的专有拓展标准化,并写入规范中。对DOM的两个主要拓展是Selectors API (选择API)和HTML5。这两个拓展都源自开发社区,而将某些常见做啊及API标准化,一直是众望所归。选择符APIjQuery的核心就是通过CSS选择符查询DOM文档取得元素的引用,从而抛开了getElementById() 和 gettElementByTagName()。Selectors API 是又W3C发起制定的一个标准,致力于让浏览器原生支持CSS查询。所有实现这一功能的JavaScript库都会写一个基础的CSS解析器,然后再使用已有的DOM方法查询文档并找到匹配的节点。而把这个功能变成原生API之后,解析和树查询操作可以在浏览器内部通过编译后的代码完成,极大改善了性能。querySelector()方法querySelector()方法接收一个CSS选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null。// 取得body元素var body = document.querySelector("body");// 取得ID为“myDiv”的元素var myDiv = document.querySelector("#myDiv");// 取得类为"selected"的第一个元素var selected = document.querySelector(".selected");// 取得类为"button"的第一个图像元素var selected = document.querySelector("img.button");如果传入了不支持的选择符,会抛出错误。querySelectorAll()方法和上面类似,但返回的不仅仅是匹配的第一个元素,而是一个NodeList的实例,如果没有匹配,NodeList就是空的。// 取得某div中所有em元素var ems = document.getElementById("myDiv").querySelectorAll("em");// 取得类为“selected”的所有元素var selected = document.querySelectorAll(".selected");// 取得所有p元素中的所有strong元素var strongs = document.querySelectorAll("p strong");取得返回NodeList中的每一个元素,可以使用item()方法,也可以使用方括号语法。matchesSelector()方法Selector API Level2 规范为Element类型新增了一个matchesSelector()方法。接收一个参数,即CSS选择符,如果调用元素与该选择符匹配返回true,否则返回false。截止2011年年中,还没有浏览器支持该方法,不过有一些实验性的实现。因此如果你想使用这个方法,最好编写一个包装函数:function matchesSelector(element, selector) { if (element.matchesSelecotr) { return element.matchesSelecotr(selector) } else if (element.msMatchesSelecotr) { return element.msMatchesSelecotr(selector) } else if (element.mozMatchesSelecotr) { return element.mozMatchesSelecotr(selector) } else if (element.webkitMatchesSelecotr) { return element.webkitMatchesSelecotr(selector) } else { throw new Error("Not supported."); }}元素遍历对于元素间的空格,IE9及之前版本不会返回文本节点,而其他所有浏览器都会返回文本节点。为了弥补这一差异,而又同时保持DOM规范不变,Element Traversal 规范新定义了一组属性。 ...

May 21, 2019 · 3 min · jiezi

读书笔记Effective-C03资源管理

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 3. 资源管理3.1 条款13:使用"资源管理类"管理资源对于 new 出来的对象,某些意外情况下 delete 没有被执行(代码遗漏、鲁棒性低或者出现异常),导致资源泄漏。作者建议使用智能指针管理 new 出来的对象。auto_ptr在拷贝或者赋值时,新指针获得资源拥有权,旧指针变为null。std::auto_ptr<Investment> pInv1(createInvestment()); //pInv1获得资源拥有权std::auto_ptr<Investment> pInv2(pInv1); //pInv2获得资源拥有权,pInv1变nullpInv1 = pInv2; //pInv1获得资源拥有权,pInv2变nullshared_ptr使用计数的方式来确定有哪些指针在使用该资源,计数为0释放资源。它的拷贝和赋值则没有auto_ptr的那个问题。3.2 条款14:在资源管理类中小心拷贝行为接3.1,在某些不适用"智能指针"的场景,需要自定义"资源管理类"来管理资源,作者建议需要考虑下这个类的拷贝和赋值。3.3 条款15:在"资源管理类"中提供对原始资源的访问在3.1,我们使用智能指针管理对象,此时指针类型是std::auto_ptr<Investment>,但如果有个函数需要类型为Investment*的参数怎么办呢?智能指针有.get()函数可以显式转换成原始指针;它们也重载了operator->和operator*,可以隐式转换。类似的,自定义的"资源管理类"也需要考虑显示转换和隐式转换,提供对原始资源的访问。3.4 条款16:成对使用new和delete时要采取相同形式简单来说,就是new出来的对象要用delete释放,new []出来的对象要用delete []释放。new出来的对象如果使用delete []释放,将导致未定义的行为;new []出来的对象如果用delete释放,很可能只释放了数组的第一个元素。3.5 条款17:以独立语句将对象置入智能指针//假设有下面这个函数,它有两个参数,调用该函数时,会做下面三件事://a. 调用new Widget//b. 执行shared_ptr的构造//c. 执行priority()////执行顺序是未定义的,可能为a->b->c,也可能a->c->b等等。注意,当顺序为a->c->b,且priority()抛出异常时,资源泄漏。processWidget(std::shared_ptr<Widget>(new Widget), priority());//解决方法:别偷懒,写成两句话std::shared_ptr<Widget> pW(new Widget);processWidget(pW, priority());

May 19, 2019 · 1 min · jiezi

读书笔记Effective-C02构造析构赋值

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles,不允许转载~ 2. 构造/析构/赋值2.1 条款05:C++会自动编写default构造、拷贝构造、析构、赋值函数//你以为你写了个没有代码的空类class Empty{};// 实际上,C++自动生成了很多函数class Empty{public: Empty() {...} //默认构造函数 Empty(const Empty& rhs) {...} //拷贝构造函数 ~Empty() {...} //析构函数 Empty& operator=(const Empty& rhs) {...} //赋值函数};2.2 条款06:声明为private防止自动生成的函数被使用//把拷贝构造函数和赋值函数声明为private类型,防止被使用class Empty {public: ...private: ... Empty(const Empty&); Empty& operator=(const Empty& rhs);};2.3 条款07:使用多态特性时,基类的析构函数必须为virtual //一个多态的场景 class TimeKeeper { //计时器(基类) public: TimeKeeper(); virtual ~TimeKeeper(); ... }; class AtomicClock: public TimeKeeper {...} //原子钟 class WristWatch: public TimeKeeper {...} //腕表 //往往这么使用多态特性 TimeKeeper* ptk = getTimeKeeper(); ... delete ptk;上面是使用多态的一个场景,当delete ptk时,因为ptk是TimeKeeper类型,如果基类析构函数不是virtual,那么ptk的析构时只调用基类析构函数,析构不正确;使用virtual ~TimeKeeper();保证ptk析构时调用正确的子类析构函数 ...

May 19, 2019 · 1 min · jiezi

JavaScript高级程序设计第3版读书笔记-第8章-BOM

ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那么BOM(浏览器对象模型)则无疑才是真正的核心。W3C为了把浏览器中JavaScript最基本的部分标准化,已经将BOM的主要方面纳入了HTML5规范中window对象BOM 的核心对是window,它表示浏览器的一个实例。在浏览器中window对象既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,因此有权访问parseInt()等方法全局作用域所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法。定义全局变量与直接在window对象上定义属性还是有一点差别:全局变量不能通过delete操作符删除,而直接定义在window对象上的属性可以var age = 29;window.color = "red";// 在IE < 9 时抛出错误,在其他浏览器里返回 falsedelete window.age;// 在IE < 9 时抛出错误,在其他浏览器里返回 truedelete window.color;console.log(window.age); // 29console.log(window.color); // undefined全局环境下使用var语句添加的window属性有一个名为[[Configruable]]的特性,这个特性的值被设置为false,因此不可通过delete删除。IE8及更早版本在遇到使用delete删除window属性的语句时,不管该属性最初如何创建的,都会抛出错误,以示警告。尝试访问未声明的属性会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变量是否存在// 这里会抛出错误 oldValue 未定义var newValue = oldValue;// 这里不会抛出错误,因为这是一次属性查询// newValue的值是 undefinedvar newValue = window.oldValue;窗口关系及框架如果页面中包含框架,则每个框架都拥有自己的window对象,并且保存在frames集合中。在frames集合中,可以通过数值索引(从0开始,从左至右,从上到下)或者框架名称来访问相应的window对象。每个window对象都有一个name属性,其中包含框架的名称。<html> <head> <title> Frameset Example</title> </head> <frameset rows="160, *"> <frame src="frame.htm" name="topFrame"> <frameset cols="50%, 50%"> <frame src="anotherframe.htm" name="leftFrame"> <frame src="yetanotherframe.htm" name="rightFrame"> </frameset> </frameset></html>可以通过window.frames[0]或者window.frames["topFrame"]来引用上方的框架,不过最好使用top而非window。例如 top.frames[0]top对象始终指向最高(最外层)的框架,也就是浏览器窗口。与top相对的另一个window对象是parent。parent(父)对象始终指向当前框架的直接上层框架。在某些情况下parent有可能等于top,但在没有框架的情况下,parent一定等于top。此时他们都是window窗口位置用来确定和修改window对象位置的属性和方法有很多。 IE, Safari, Opera, Chrome 都提供了screenLeft 和 screenTop属性,分别用于表示相对屏幕左边和上边的位置。Firefox 则在 screenX 和 screenY 属性中提供相同的窗口位置信息, Safari, Chrome也同时支持这两个属性。Opera虽然支持 screenX 和 screenY 属性,但与 screenLeft 和 screenTop 并不对应,因此建议大家不要在 Opera中使用。使用下列代码可以跨浏览器取得窗口左边和上边的位置// 确定 screenLeft 和 screenTop 属性是否存在// 存在,是在 IE, Safari, Opera, Chrome// 否则,是在 Firefox中var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;在IE Opera 中,返回的是页面到屏幕边缘的距离(不包括浏览器的工具栏等),而 Chrome Firefox Safari 返回的是浏览器到屏幕边缘的距离(包括浏览器的工具栏等)。更让人抓狂的是, Firefox Safari Chrome 始终返回页面中每个框架的 top.screenX top.screenY 值。即使在页面由于被设置了外边距发生偏移的情况下,相对于window对象使用top.screenX top.screenY每次也都会返回相同的值。而IE Opera则会给出框架相对于屏幕辩解的精确坐标值。最终结果是无法在跨浏览器的条件下取得窗口左边和上边的精确坐标值。使用moveTo() 和 moveBy()方法,倒是有可能将窗口的精确地移动到一个新位置。这两个方法都接受两个参数// 将窗口移动到屏幕左上角window.moveTo(0, 0);// 将窗口向下移动100像素window.moveBy(0, 100);// 将窗口移动到(200, 300)window.moveTo(200, 300);// 将窗口向左移动50像素window.moveBy(-50, 0);需要注意的是,这两个方法可能会被浏览器禁用;而且在Opera和IE7+中默认就是禁用的。这两个方法都不适用于框架,只能对最外层的window对象使用。窗口大小跨浏览器确定一个窗口的大小不是一件简单的事情。 ...

May 16, 2019 · 3 min · jiezi

JavaScript高级程序设计第3版读书笔记-第7章-函数表达式

定义函数表达式的方式有两种: 函数声明。它的重要特征就是 函数声明提升(function declaration hoisting) 即在执行代码之前会先读取函数声明。这就意味着可以把函数声明放在调用它的语句后面。函数表达式。// 函数声明function functionName(params) { ...}// 函数表达式有几种不同的方式,下面是最常见的一种var functionName = function(params) { ...}上面这种形式看起来好像是常规的变量赋值语句。而右边这种形式创建的函数叫做 匿名函数 (anonymous function)(有时候也叫 拉姆达函数 lambda),因为function关键字后面没有标识符。函数表达式与其他表达式一样,在使用前必须先赋值,否则会导致出错。sayHi(); // 错误,函数还不存在var sayHi = function () { console.log('Hi!');};表面上看,下面的代码没有问题,condition为true时,使用一个定义,否则使用另一个定义。实际上,在ECMAScript中属于无效语法,JavaScript引擎会尝试修正错误,将其转换为合理状态。但问题是浏览器尝试修正错误的做法并不一致。大多数浏览器会返回第二个声明,忽略condition的值;Firefox会在condition为true的时候返回第一个声明。因此这种做法很危险,不应该出现在你的代码中。// 不要这样做!if (condition) { function sayHi() { console.log('Hi!'); }} else { function sayHi() { console.log('Yo!'); }}上述代码改为函数表达式就没有问题// 可以这样做var sayHi;if (condition) { sayHi = function() { console.log('Hi!'); }} else { sayHi = function() { console.log('Yo!'); }}能够创建函数再赋值给变量,也就能把函数作为其他函数的返回值。createComparisonFunction() 就返回了一个匿名函数。function createComparisonFunction (propertyName) { return function (object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } }}在把函数当成值来使用的情况下,都可以使用匿名函数。不过,这并不是匿名函数唯一的用途。递归递归函数是在一个函数通过名字调用自身的情况下构成的// 经典的递归阶乘函数function factorial (num) { if (num <= -1) { return 1; } else { return num * factorial(num - 1); }}虽然递归阶乘函数表面看没有什么问题,但下面的代码却可能导致它出错// 把factorial() 函数保存在变量anotherFactorial中var anotherFactorial = factorial;// 将factorial设置为null// 现在指向原始函数的引用只剩下anotherFactorialfactorial = null;// 原始函数必须执行factorial()// 但factorial不再是函数,所以导致出错anotherFactorial(4); // throw error!可以使用 arguments.callee (指向正在执行函数的指针)实现函数的递归调用// 非严格模式function factorial (num) { if (num <= -1) { return 1; } else { return num * arguments.callee(num - 1); }}但在严格模式下不能通过脚本访问 arguments.callee,会导致出错。可以使用命名函数表达式来达成相同的结果var factorial = (function f(num) { if (num <= -1) { return 1; } else { return num * f(num - 1); }})闭包匿名函数 和 闭包 是两个概念,容易混淆。 闭包 是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,仍以前面的 createComparisonFunction() 函数为例function createComparisonFunction (propertyName) { return function (object1, object2) { // 下面两行代码访问了外部函数中的变量propertyName // 即使这个内部函数被返回了,而且是在其他地方被调用了 // 它仍然可以访问变量 propertyName var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } }}上述例子,即使内部函数被返回了,在其他地方调用,它仍然可以访问propertName。因为这个内部函数的作用域链中包含 createComparisonFunction() 的作用域。要搞清楚其中细节,必须从理解函数被调用的时候都会发生什么入手。第4章介绍过 作用域链。当某个函数被 调用 时会发生下列事情: ...

May 15, 2019 · 5 min · jiezi

读书笔记Effective-C01让自己习惯C

1. 让自己习惯C++1.1 条款01:视C++为语言联邦1.1.1 C++的发展: 阶段1:C with Classes;阶段2:加入异常(exceptions)、模板(templates)、STL库;阶段3:过程形式 + 面向对象形式 + 函数形式 + 泛型形式 + 元编程形式1.1.2 如何使用:视为四个次语言的组合 C。最基础的C。面向对象的C。C with Classes。Template C++。泛型编程,更深奥的还有模板元编程(TMP),但一般人用不到。STL。作者认为STL有自己的一套规约,可以单独拎出来。1.2 条款02:尽量以const, enum, inline替换 #define1.2.1 #define用于常量的场景 缺点: a. #define定义的常量导致编译出错时,出错提示不友好;b. #define无视作用域(scope),无封装性。解决: a. 大多数情况可以用const替换;b. 旧编译器对类内static const语法较苛刻,此时可用enum替换#define。1.2.2 $define用于宏(函数)的场景 缺点: a. 需要注意括号的使用,给自己添麻烦;b. #define无视作用域(scope),无封装性。解决:使用inline函数。1.3 条款03:尽可能使用const原因:让编译器辅助对常量/常量函数的错误使用。1.3.1 const常量 const char* p = ...; // p可改变,*p不可改变char const * p = ...; // 同上,有些人会这么写char* const p = ...; // p不可改变,*p可改变const char* const p = ...; // p不可改变,*p不可改变const std::vector<int>::iterator iter = ...; // iter不可改变,*iter可改变std::vector<int>::const_iterator iter = ...; // iter可改变,*iter不可改变const Rational operator* (const Rational& lhs, const Rational& rhs); // 用于避免出现 (a * b) = c 这样的代码1.3.2 const函数 ...

May 15, 2019 · 1 min · jiezi

JavaScript高级程序设计第3版读书笔记-第6章-面向对象的程序设计

面向对象(Object-Oriented, OO)的语言有一个标志,它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScript中没有类的概念,因此它的对象也与基类的语言中的对象有所不同ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。” 我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以是数据或者函数每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章讨论的原生类型,也可以是开发者定义的类型理解对象// 创建对象,赋给属性var person = new Object();person.name = "Nicholas";person.age = 29;person.job = "Sofware Engineer";person.sayName = function() { alert(this.name);}// 字面量方式创建对象var person = { name: "Nicholas", age: 29, job: "Sofware Engineer", sayName: function() { alert(this.name); }}属性类型ECMAScript中有两种属性:数据属性和访问器属性数据属性数据属性包含一个数值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性 [[Configurable]] 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前述例子中那样直接在对象定义的属性,它们这个特性默认值为true[[Enumerable]] 表示能否通过for-in循环返回属性。前述例子这个特性默认为true[[Writable]] 表示能否修改属性的值。前述例子这个特性默认为true[[Value]] 包含这个属性的数据值。读取属性值得实惠,从这个位置读;写入属性值得实惠,把新值保存在这个位置。这个特性的默认值为undefined要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。 主要接收三个参数:属性所在的对象,属性的名字和一个描述符对象。描述符(descriptor)对象的属性必须是:configurable,enumerable,writalbe和value。设置其中的一或多个值,可以修改对应的特性值var person = {};// 创建了一个name属性,它的值"Nicholas"是只读的。Object.defineProperty(person, "name", { writable: false, value: "Nicholas"});console.log(person.name); // "Nicholas"// 在非严格模式下,赋值操作会被忽略// 而在严格模式下,会导致错误person.name = "Greg";console.log(person.name); // "Nicholas"把configurable设置为false,表示不能从对象中删除属性。如果对这个属性调用delete,则在非严格模式下什么也不会发生,而在严格模式下会导致错误一旦把属性定义为不可配置的,就不能再把它变回可配置了。此时再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误var person = {};Object.defineProperty(person, "name", { configurable: false, value: "Nicholas"});// 抛出错误Object.defineProperty(person, "name", { configurable: true, value: "Nicholas"})可以多次调用Object.defineProperty()方法修改同一个属性,但在把configurable特性设置为false之后就会有限制了。调用Object.defineProperty()如果不指定,configurable,enumerable,writalbe 特性的默认值都是false。多数情况下,没有必要利用Object.defineProperty()方法提供的高级功能。访问器属性访问器属性不包含数据值,它们包含一对getter和setter函数(不是必须的)在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据访问器属性有如下4个特性: ...

May 14, 2019 · 8 min · jiezi

JavaScript高级程序设计第3版读书笔记-第5章-引用类型-中

RegExp类型ECMAScript通过regExp类型来支持正则表达式每个正则表达式都可带有一或多个标志(flags)g:表示全局模式(global),即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写m表示多行模式(multiline),即在到达一行文本末尾时还会继续查找下一行中是否存在于模式匹配的项// 匹配字符串中所有“at”的实例var pattern1 = /at/g;// 匹配第一个"bat"或"cat",不区分大小写var pattern2 = /[bc]at/i;// 匹配所有以"at"结尾的3个字符的组合,不区分大小写var pattern3 = /.at/gi;模式中使用的所有元字符都必须转义:( [ { ^ $ | ) ? * + . ] }使用RegExp构造函数,两个参数都必须是字符串,所有元字符都要双重转义// 匹配第一个"bat"或"cat", 不区分大小写var patter1 = /[bc]at/i;// 匹配第一个"[bc]at", 不区分大小写var pattern2 = /\[bc\]at/i;// 匹配所有以"at"结尾的3个字符的组合,不区分大小写var pattern3 = /.at/gi// 匹配所有".at",不区分大小写var pattern4 = /\.at/gi;// 使用RegExp构造函数,所有元字符都要双重转义// 两个参数都必须是字符串var pattern4 = new RegExp("\\.at", "i");RegExp实例属性RegExp的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息 global 布尔值 表示是否设置了g标志ignoreCase 布尔值 表示是否设置了i标志lastIndex 整数 表示开始搜索下一个匹配项字符位置,从0算起multiline 布尔值 表示是否设置了m标志source 正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回var pattern1 = /\[bc\]at/i;console.log(pattern1.global); // falseconsole.log(pattern1.ignoreCase); // trueconsole.log(pattern1.multiline); // falseconsole.log(pattern1.lastIndex); // 0console.log(pattern1.source); // "\[bc\]at"RegExp实例方法exec() 专门为捕获组而设计的,接收一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null返回的数组虽然是Array的实例,但包含两个额外的属性:index和inputindex表示匹配项在字符串中的位置input表示表达式的字符串即使在模式中设置了全局标志(g),exec()每次也只会返回一个匹配项,不设置g的时候,每次都返回第一个匹配项,设置了g的情况下,每次调用exec()则都会在字符串中继续查找新匹配项var txt = "mom and dad and baby";var pattern = /mom( and dad( and baby)?)?/gi;var matches = pattern.exec(txt);console.log(matches); // ["mom and dad and baby", " and dad and baby", " and baby", index: 0, input: "mom and dad and baby", groups: undefined]test() 接收字符串参数,匹配返回true不匹配返回falsevar txt = "000-00-0000";var pattern = /\d{3}-\d{2}-\d{4}/;if (pattern.test(txt)) { alert("The pattern was matched.");}toString() toLocaleString() 都会返回正则表达式的字面量,与创建表达式的方式无关valueOf() 返回正则表达式本身RegExp构造函数属性Function类型基本包装类型单体内置对象

May 9, 2019 · 1 min · jiezi

JavaScript高级程序设计第3版读书笔记-第5章-引用类型

Object类型创建对象的方法一个new Object(),另一个是对象字面量表示法字面量表示法的最后一个属性不能添加逗号,这样会在IE7以前和Opera中导致错误属性名会自动转换为字符串属性名中包含关键字、保留字会报错通常,除非必须使用变量来访问属性,否则我们建议使用点表示法// 这里所有的属性名都会自动转为字符串var person = { "name": "Nicholas", age: 29, 5: true}// 不会报错,但这个属性不能使用person.name的方式person["first name"] Array类型Date类型RegExp类型Function类型基本包装类型单体内置对象

May 7, 2019 · 1 min · jiezi

JavaScript高级程序设计第3版读书笔记-第4章-变量作用域和内存问题

基本类型和引用类型的值ECMAscript变量包含 基本类型值和引用类型值基本类型值值的是基本数据类型:Undefined, Null, Boolean, Number, String引用类型值是保存在内存空间中的对象,与其他JavaScript不允许直接访问内存中的位置,即不能直接操作对象的内存空间,在操作对象时,实际上是在操作对象的引用而不是实际的对象;为此,引用类型的值是按引用访问的在很多语言中,字符串以对象 的形式来表示,因此被认为是引用类型的,ECMAScript放弃了这一传统动态的属性引用类型的值可以为其添加属性和方法,也可以改变和删除属性和方法基本类型值不行var person = new Object();person.name = "Nicholas";alert(person.name); // "Nicholas"var person = "Nicholas";person.age = 27;alert(person.age); // undefined复制变量值在从一个变量复制向另一个变量复制值时,基本类型值和引用类型值存在不同基本类型值会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,两个变量可以参与任何操作而不会互相影响引用类型也会复制一个副本放到新变量中,但这个副本实际上是一个指针,这个指针指向存储在堆中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象,因此改变其中一个变量,就会影响另一个变量var obj1 = new Object();var obj2 = obj1;obj1.name = "Nicholas";alert(obj2.name); // "Nicholas"传递参数ECMAscript中所有函数的参数都是按值传递的,即把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即为命名参数,或者用ECMAScript的概念来说,就是函数的arguments对象中的一个元素)在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数外部可以把ECMAScript的参数想象成局部变量// 参数num是函数的局部变量// 调用这个函数时,变量count作为参数被传递给函数,是将count的值20复制给参数num// 在函数内部,参数num的值加上了10,但不会影响函数外部的count变量,count和num互不影响function addTen(num) { num += 10; return num;}var count = 20;var result = addTen(count);alert(count); // 20, 没有变化alert(result); // 30// 以下为个人理解,原著表述不清楚不能直观理解// 传递给参数obj的实际上是指向person对象内存地址(指针),是将地址复制了一个副本赋值给了参数obj// 当在函数内部为obj添加name属性后,函数内部根据地址操作了内存中的相应对象,函数外部的person也将有反映// 因为person指向的对象在堆内存中只有一个,而且是全局对象function setName(obj) { obj.name = "Nicholas";}var person = new Object();setName(person);alert(person.name); // "Nicholas"// 下列代码,直觉认为会alert出"Greg",但却是"Nicholas"// 因为传递给参数obj的只是指针的副本,当函数内重新给obj赋值的时候,实际上是将一个新的Object对象的指针赋给obj// 此时操作obj影响的是新的Object对象,而person对象不受影响// obj指向的新Object对象在函数执行完后会立即销毁function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg";}var person = new Object();setName(person);alert(person.name); // "Nicholas"

May 7, 2019 · 1 min · jiezi

JavaScript高级程序设计第3版读书笔记-第12章

第1章 JavaScript 简介虽然JavaScript和ECMAScript通常被人们用来表达相同的含义,但JavaScript的含义比ECMA-262要多得多一个完整的JavaScript由三个不同部分组成 核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM)第2章 在HTML中使用JavaScript<script>定义了6个属性 async 可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作charset 可选。表示通过src属性指定的代码的字符集。大多数浏览器会忽略它,属性很少用到defer 可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。language 已废弃。src 可选。type 可选。可以看成language的代替属性;表示脚本语言的内容类型(也称为MIME类型)虽然 text/javascript 和 text/ecmascript 都已经不被推荐使用,但人们一直以来使用过的都还是 text/javascript。实际上,服务器在传送JavaScript文件时使用的MIME类型通常是 application/x-javascript, 但在type中设置这个值却可能导致脚本被忽略。另外在非IE浏览器中还可以使用以下值:application/javascript 和 application/ecmascript。考虑到约定俗称和最大限度的浏览器兼容性,目前依旧还是text/javascript、不过这个属性并不是必须的,如果没有指定这个属性,其默认值仍为 text/javascript在XHTML中的用法 这种格式在所有现代浏览器中都可以正常使用,虽然有几分hack的味道,但他能通过XHTML验证,而且对XHTML之前的浏览器也会平稳退化<script>//<![CDATA[ function demo(a, b) { ... } //]]></script>文档模式 对于标准模式,可以通过使用下面任何一种文档类型来开启<!-- HTML 4.01 严格型 --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><!-- XHTML 1.0 严格型 --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/xhtml1-strict.dtd"><!-- HTML 5 --><!DOCTYPE html><noscript>元素 浏览器不支持脚本或被禁用时显示<html> <head> <title>Example</title> </head> <body> <noscript> <p>本页面需要浏览器支持(启用)JavaScript</p> </noscirpt> </body></html>

May 6, 2019 · 1 min · jiezi

JavaScript高级程序设计第3版读书笔记

第1章 JavaScript 简介虽然JavaScript和ECMAScript通常被人们用来表达相同的含义,但JavaScript的含义比ECMA-262要多得多一个完整的JavaScript由三个不同部分组成 核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM)第2章 在HTML中使用JavaScript<script>定义了6个属性 async 可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作charset 可选。表示通过src属性指定的代码的字符集。大多数浏览器会忽略它,属性很少用到defer 可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。language 已废弃。src 可选。type 可选。可以看成language的代替属性;表示脚本语言的内容类型(也称为MIME类型)虽然 text/javascript 和 text/ecmascript 都已经不被推荐使用,但人们一直以来使用过的都还是 text/javascript。实际上,服务器在传送JavaScript文件时使用的MIME类型通常是 application/x-javascript, 但在type中设置这个值却可能导致脚本被忽略。另外在非IE浏览器中还可以使用以下值:application/javascript 和 application/ecmascript。考虑到约定俗称和最大限度的浏览器兼容性,目前依旧还是text/javascript、不过这个属性并不是必须的,如果没有指定这个属性,其默认值仍为 text/javascript在XHTML中的用法 这种格式在所有现代浏览器中都可以正常使用,虽然有几分hack的味道,但他能通过XHTML验证,而且对XHTML之前的浏览器也会平稳退化<script>//<![CDATA[ function demo(a, b) { ... } //]]></script>文档模式 对于标准模式,可以通过使用下面任何一种文档类型来开启<!-- HTML 4.01 严格型 --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><!-- XHTML 1.0 严格型 --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/xhtml1-strict.dtd"><!-- HTML 5 --><!DOCTYPE html><noscript>元素 浏览器不支持脚本或被禁用时显示<html> <head> <title>Example</title> </head> <body> <noscript> <p>本页面需要浏览器支持(启用)JavaScript</p> </noscirpt> </body></html>第3章 基本概念函数名不能使用关键字(typeof不行但typeOf可以,区分大小写)标识符就是指变量、函数、属性的名字,或者函数的参数。 ...

May 3, 2019 · 1 min · jiezi

读书笔记-how to solve it

作者花了大半篇幅试图让读者去记忆一个事:对所求问题是否认真仔细的看懂了它的前提,条件,要求。并不断在重复这件事,这本书更像是给教师看的,里面很是细心阐述了对待学生教师应该如何去做。但是对于非教师的人也是可以学到不少东西。这本书看起来不会让人感觉有压力,因为你可以很轻易的从他的文字与你曾经解题的方法、思路来产生共鸣。但是就像老生常谈的事一样,道理虽然人人都懂,也知道是正确的,但是最后真正能坚持并做到的没几个一样。不过这本书还是为我打开了一些思路,最少我希望自己在读书时代是希望能阅读到这本书的,那样我可能当时面对题目就不会那样迷惘不知所措了。学习点:面对问题时,首先要仔细阅读它给出的条件和问题,不能在没看清题目下急于解题,这是愚者的做法。然后大多数问题能使用类比法,根据过往解决相似问题的经历来同样解决他。面对不确定的一些条件,可以化大为小,把他拆分为几个简单的小条件,并再次组合在一起来应用。最后在解决完问题后,先别急于放下题目转到别的问题,而是要注重复习思考解题思路。不爱再思索的人,必定不善思索。多思出上策。

March 18, 2019 · 1 min · jiezi

第2章 数据模型与查询语言

第2章 数据模型与查询语言1.关系模型与文档模型现在用的最多的数据模型是SQL,即关系模型,数据被组织成关系(SQL中称作表),其中每个关系是元组(SQL中称作行)无序集合。1.1.NoSQL的诞生NoSQL被重新解释为:Not Only SQL。采用NoSQL数据库的背会有几个驱动因素,包括:需要比关系数据库更好的可扩展性,包括非常大的数据集或非常高的写入吞吐量。相比商业数据库产品,免费和开源软件更受偏爱关系模型不能很好地支持一些特殊的查询操作受挫于关系模型的限制性,渴望一种更具多动态性与表现力的数据模型。不同的应用程序有不同的需求,一个用例的最佳技术选择可能不同于另一个用例的最佳技术选择。1.2.对象关系不匹配举例如果要保存一个人的简历,包括个人信息,学历,地址,网址,工作经历等等,如果用关系型数据库就需要很多张表来保存,用一个user_id来串起来。如果用NoSQL,就可以直接用一个json对象来保存起来。Json表示比多表模式具有更好的局部性,如果在关系型示例中获取简历,那需要执行多个查询,或者在User表与其下属表之间混乱地执行多路连接。1.3.多对一和多对多的关系一对多的好处是:避免歧义易于更新,名称只存储在一个地方,如果需要更改,很容易进行全面更新。本地化支持,当网站翻译成其他语言时,标准化的列表可以被本地化,使得地区和行业可以使用用户的语言来显示。更好的搜索。也会有好多对多的情况,好处跟一对多基本一致。该处说的多对一和多对多都是基于关系数据库的。1.4.文档数据库是否在重蹈覆辙最早的数据模型是一个层次模型,它与文档数据库使用的JSON模型有一些相似之处,它将所有数据表示为嵌套在记录中的记录数。但是该模型能处理好一对多的关系,却很难处理多对多的情况,开发人员必须复制数据到另一个记录中。于是,人们提出了两种方案来解决层次模型的局限性:关系模型(就是现在的SQL),和网络模型(已经变的冷门)1.4.1.网络模型网络模型是层次模型的推广,层次模型的树结构中,每条记录只有一个父节点,在网络模型中,每条记录可以能有多个父节点。网络模型中,访问记录的唯一方法是跟随从根记录起沿这些链路所形成的路径,这被称为访问路径。这种访问方式使得查询和更新数据库的代码变得复杂不灵活。无论是分层还是网络模型,如果你没有所需数据的路径,就会陷入困境。你可以改变访问路径,但是必须浏览大量手写数据库查询代码,并重写来处理新的访问路径。这么难用,被淘汰是必然的。1.4.2.关系模型关系模型中,一个关系(表)只是一个元组(行)的集合。可以通过指定某些列作为匹配关键字来读取特定行,你可以在任何表中插入一个新的行,而不必担心与其他表的外键关系。关系模型的一个关键洞察是:只需构建一次查询优化器,随后使用该数据库的所有应用程序都可以从中受益。1.4.3.与文档数据库相比一方面:文档数据库还原为层次模型:在其父记录中存储嵌套记录,而不是在单独的表中。另一方面:在表示多对一和多对多的关系时,关系数据库和文档数据库并没有根本的不同:在这两种情况下,相关项目都被一个唯一的标识符引用,这个标识符在关系模型中被称为外键,在文档模型中被称为文档引用。1.5.关系型数据库与文档型数据库在今日的对比这两者进行比较时,可以考虑许多方面的差异,比如:容错属性,处理并发性等,本章只关注数据模型的差异。文档数据模型:架构更灵活性,因局部性而拥有更好的性能,以及对于某些应用程序而言更接近应用程序使用的数据结构。关系数据模型:为连接提供更好的支持,以及支持多对一和多对多的关系。1.5.1.哪个数据库模型更方便些代码?很难说在一般情况下那个数据模型让应用程序代码更简单,它取决于数据项之间存在的关系种类。对于高度相联的数据,选用文档模型是糟糕的,选用关系模型是可以接受的。3.图数据模型如果程序大多是一对多关系或记录之间不存在关系,用文档类型更好。如果有多对多关系,可以使用关系数据库,如果多对多的情况很复杂,可以使用图数据模型。一个图由两个对象组成:顶点(也成为节点或实体),和边(也成为关系或弧),多种数据可以被建模为一个图形。3.1.图属性在属性图模型中,每个顶点(vertex)包括:唯一的标识符一组出边(outgoing edges)一组入边(ingoing edges)一组属性(键值对)每条边(edge)包括:唯一标识符边的起点/尾部顶点边的终点/头部顶点描述两个顶点之间关系类型的标签一组属性(键值对)3.2.Cypher查询语句Cypher是属性图的声明式查询语句,为Neo4j图形数据库而发明。3.3.SQL中的图查询也可以在关系数据库中表示图数据,这样通过sql也能查询,但是这样存在很大的一些困难,在关系数据库中,你通常会事先知道在查询中需要哪些连接,而在图查询中,连接的数量事先并不确定,只有在找到待查询的顶点之前,遍历可变数量的边。3.4.三元组存储的SPARQL在三元组存储中,所有信息都以非常简单的三部分形式存储:主语,谓语,宾语。例如:三元组(吉姆,喜欢,香蕉)

March 17, 2019 · 1 min · jiezi

心如止水•精读:『批判性思维』- 让讨论持续进行的七大方法

继续来谈《学会提问》这本书。上次谈到,批判的目的并不是否定,而是一种高效的认知方法。刨根问底的批判式讨论,并不是每个人都可以接受的。我们都希望讨论能够获得建设性的成果,而不是惹怒别人,然后草草收场。所以让讨论在友好的氛围中持续下去,是非常重要的。书中从三个方面,提供了七种方法,启发甚大。我重新把书中的内容按照结构进行了梳理,以方便大家对照参考。原则让别人意识到,你的本意是好的,并没有任何攻击的意思,只是想更好的了解某一个问题。基于以上原则,要从三个角度来改进交流的方法。减少攻击性明确自己的态度是探究和学习而不是舌战。保持平静的情绪:即使好奇心再强,也要表现的平静,不温不火。给与别人尊重:表情和肢体动作都要表现出谦恭,要让别人有被尊重的感觉。让别人认为,正是由于他的博学和专业,你才来问他。给予别人肯定先要表达肯定,求同存异:即使有问题,也要先要表达肯定的部分。比如,我好像听说过这个观点;您的某个说法我是赞同的。试图融合双方观点,达成共识:试着把别人满意的理解,和你满意的理解放在一起,融合成新结论,也许双方都可以接受。聚焦重点面对否定,仔细询问:问一问别人,为什么他会认为你的看法是不堪一击的,证据在哪里?打破僵局,找到关键:想想别人有没有什么证据 能让他改变他的观点。(如果有的话,那么思路就被打开了,可以继续找证据。)寻找证据,避免空谈:提议暂停讨论,先尽可能的寻找支持自己结论的证据。更多文章:心如止水•精读 名人写日记是为了出自传方便吗?心如止水•速读 《微习惯》:如何才能坚持学习养成习惯?这本书的思路很有启发。心如止水•精读 《情绪急救》:人的区别在于如何与失败相处心如止水•精读 GTD四年反思:也许,我错怪了混乱心如止水•速读 《好好学习:个人知识管理精进指南》心如止水•精读 没钱没势的人如何创业?

February 26, 2019 · 1 min · jiezi

心如止水•精读:十分冤枉的『批判性思维』

“批判性思维”给很多人的第一印象就是“找茬”,“否定一切”,“尖酸刻薄”。一开始的时候我也有这种感觉,不过也觉得怪怪的,好多大学都有这项课程,显然不是教学生做一个“尖酸刻薄”的人。那么批判性思维到底是什么呢?在中国,批判性思维在教育中的重要性多年来一直被忽视。缺乏批判性思维,不会提问题,正是中国学生最大的问题。 - 翟晋玉(中国教师报新闻部主任,《幼儿教育周刊》主编)批判是过程,不是目的此“批判”非彼“批判”查一下字典你可以发现“批判”其实是有两种意思。一是:对反动思想进行有理有据的分析,从而加以否定;二是:分析评判。显然,这里的批判肯定不是革命语境下的“否定”,而是“分析评判”。还是要用大白话总结一下:“批判性思维”是一套系统化找靠谱观点的方法。如果不想让人产生误解,可以用“理性思考”来代替“批判性思维”,这一说法。为什么过程非要“找茬”?你的这种感觉是对的,“批判性思维”的主要方法就是“找茬”。“找茬”是过程,不是目的。想一下,如果你在做一道语法判断题,你是偏向于找到错误,还是偏向于赞美他呢?我想只要是考过试的人都知道,大多数时候会采用第一种方法。因为无论一个句子,其它地方有多么完美,只要有一个地方有错误,那么这道题肯定就是错了。也就是说,要想找到正确的答案,最高效的方法就是先把错误的给排除掉。学习批判性思维有什么用?当要做出一个决定的时候,经常会接收到各种的信息,别人给你的建议,网上的各种资料。这些信息经常是矛盾的,我们该信哪些建议呢?什么才是好的建议?批判性思维就是一套“寻找好观点”的方法,让你在嘈杂纷乱的世界中,能听到那些真正好的建议。让你不再是被动的接受信息,而是用一套犀利的眼光去审视信息,找到那些真正有用的“金子”。为什么不直接听专家的呢?因为在社会生活的很多领域中“专家建议”,其实并不靠谱。如果一道数学题,物理题不会做了,找到专家问一问,答案会很一致,不会有任何问题。但是如果你想要理财炒股票;想管理好你的团队;或者说你生病了,想请医生进行诊断;想更好的处理自己的人际关系,想让自己能更自律,更充分的利用好时间。等等等等。这些涉及到社会和人的领域,少有一致性高,可靠的理论。因为影响因素实在是太多,太复杂了,所以你经常会听到矛盾的专家建议。这个时候,批判性思维就派上用场了。虽然你不是专家,也不知道谁是真的专家,对于某一行业的细节了解不多。但逻辑是大道,是通用的。批判性思维就像一面照妖镜,筛选出那些不靠谱的观点,找到真正对你有帮助的。可以说是防坑防骗必备了。闻过则喜人类有一种天性,就是本能的排斥与自己相反的观点和价值观。只要涉及到与人相关的领域,影响因素都非常复杂,听一下不同的观点,对我们的行动是十分有帮助的。虽然大多数人都觉得应该虚心听取别人的建议,但是知易行难,真正做到的人并不多。如果你想做到“闻过则喜”,那么批判性思维是一个很好的帮手;因为批判性思维是一套系统的评价标准,不会受到我们主观情绪的影响而变来变去。我管理公司是靠“发问” , 不是靠“ 回答” 。 问答会启动对话, 对话会刺激创新。 如果你想要一个创新文化, 那就多发问。—— 谷歌CEO施密特让讨论进行下去并不是每个人都愿意接受询问和聆听异议。比如, 常常有被问的人这样来一句: “ 你怎么单单就盯上了我呢? ” 让批判性探询的过程就此中止, 没了下文。 每个人对于批评的接受程度是不一样的,为了让批判性思维更好的发挥它的作用,掌握交流的技巧是非常关键的。我们要让谈话顺利进行以获得建设性的结果,推进事情的发展,而不是迫使对方关闭对话渠道。如果你不改变问问题的方式, 你永远都不会成功。—— 现代管理之父德鲁克尾巴那么具体的策略又是怎么样的呢?该怎么样学习批判性思维呢?《学会提问》是一本著名的批判性思维入门书籍,广受好评,已经出到第十版了。看过前言之后,我就感觉这是一本值得精读的好书,现在看来我没有想错。读下去,继续在书中寻找答案吧。版权声明该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:2531574300,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。是读书笔记,但是并无大段摘抄,示例和论述逻辑大多是自己想的。查了一下版权相关资料资料,感觉还是有脸加版权声明的。更多文章:心如止水•精读 名人写日记是为了出自传方便吗?心如止水•速读 《微习惯》:如何才能坚持学习养成习惯?这本书的思路很有启发。心如止水•精读 《情绪急救》:人的区别在于如何与失败相处心如止水•精读 GTD四年反思:也许,我错怪了混乱心如止水•速读 《好好学习:个人知识管理精进指南》心如止水•精读 没钱没势的人如何创业?

February 24, 2019 · 1 min · jiezi

猫叔产品读记 | 爆款车厘子、重做消费品、旅游大数据(1期)

本博客 猫叔的博客,转载请申明出前言本系列主要是猫叔对互联网相关产品(兼任产品经理)路上的视野扩展与信息记录,每日三篇,记录分享。爆款车厘子的自由卖相好看、色泽鲜艳的车厘子正是春节期间讨喜的送礼热门货之一。近日一篇刷屏文章《26岁,月薪一万,吃不起车厘子》,让这种水果一夜“爆红”。智利农业部乐观预计,本次出口季销售成绩有望实现17%的增长,而中国人的春节消费成了智利果农今年(2018)最大的期盼。“中国热”(China craze)也成了智利财经媒体经常出现的热门词汇。中国进口车厘子82%来自智利国际果蔬协会报告认为,“智利车厘子85%以上是出口到中国,剩下15%是由于品质没有达到中国市场的需求。”根据百果园2018春节水果销售报告,在2018年2月13日-23日期间,车厘子稳居水果销售榜冠军,并且在北方和南方都成为最受欢迎的水果。而在今年春节前夕,2019年1月18日-28日期间内,车厘子在该平台的销售额就接近1亿元。爆款离不开砸钱营销曾经被美国禁止进口的墨西哥鳄梨,在公关公司的包装下改名“牛油果”(Avocado),宣传强调其“低脂健康”的特性和丰富的营养价值。终于,这种曾经被人嫌弃难吃的水果一跃成为超级“爆款”,成为健身人士、时尚达人们的最爱。智利车厘子(Cherries from Chile)的品牌形象打造,离不开智利水果出口商协会(ASOEX)的统一协调。这个机构将全行业上下整合到一起,从智利樱桃生产商、出口商、智利政府到中国进口商、分销商和零售商,都在为打造智利水果的整体形象努力。ASOEX耗资500万美元(约合人民币3370万元),专门针对中国市场启动了名为“幸福正当红”的营销活动。每日经济新闻记者注意到,这个活动从2016年起每年11月固定举办,持续时间39天。三年来,该活动在国内覆盖的城市从36城扩展至65城,除了北上广深等一线城市以外,这个营销活动还特别注重对二三线城市(特别是区域中心城市)的经营。据ASOEX自己的估算,这项营销活动在国内覆盖的人群达2.08亿人。ASOEX营销总监卡瓦哈尔表示,“中国文化注重团聚、分享和健康生活的价值,而我们的高品质水果能点亮中国人冬天的餐桌。当然,我们的最终目标是让中国消费者平时也能有购买车厘子的习惯,而不是仅仅依靠春节行情。”“车厘子自由”还有多远?据国际果蔬协会报道,业内人士预估,以往近70%的智利进口车厘子会进入批发市场分销;而在2019年,该比例下降到50%左右。越来越多的车厘子是由大型零售渠道或电商平台直接对接智利方面收购,中间环节的减少,自然有利于降低消费者到手的价格。中国所有消费品都值得重做一遍1、88-93一代崛起,消费圈层重构特性1、完全的第一代网民,是真正触网人群特性2、深受偶像影像特性3、身份认同标签找补相关结论:a、黄金人生期的88后具有巨大潜在购买力,尤其是代偿机制作用之下,通过金钱购买存在感成为可能。b、技术的普世便捷性,让技术和数字化成为新一代购物者毛细血管。c、偶像新变种,KOL的力量被低估了。d、延迟满足反越来越弱的一代,及时交互反馈越来越重要2、2019,新消费品牌机会在哪里?规则1、新消费品牌必须具有自己的粉丝系统规则2、新媒体公司规则3、参数型公司,局部堆量规则4、产品重做3、产品重做6条秘籍秘籍1、场景深度转化法则——试着看看,你的售卖场景变了,你的生意有没有变成一个新的生意机会。秘籍2、低维进阶高维法则——玩过文明这个游戏的人都知道,谁优先构建起比竞争对手高阶的工业体系,谁就具备了护城河与壁垒。消费品赛道很多领域都存在着这样的新旧转换机会。秘籍3、平台红利迁移法则——利用渠道红利的变化,不断改变自己的商业模式非常重要。秘籍4、产品矛盾冲突法则——重构的生意也是寻找旧产品和新用户的矛盾点。秘籍5、技术变革法则——在你所属的细分领域中,到底有没有新的技术来促使这个生意进行进化。秘籍6、低阶到高阶、高阶到低阶法则4、给品牌创业者2019年分享的话创业是最佳的自我成长方式,创业者质变的代价就是极度痛苦。创业者的自我反思是把经验内化成原则的关键,每个创业者都应该定期反思,这也是释放焦虑情绪的重要途径。创业者的自我舒适度很重要,亲密关系和自我舒适度密切相关,自我舒适度低的时候做事容易拧巴。如果人生的快乐也可以部分源自各种小确幸,而不仅仅是永不满足的功成名就,创业者的心会更沉,做出的公司会更有质感。创业者先要把自己擅长的事情做到极致,但公司从1到100的过程中,还是要持续跳出舒适区,持续学习新东西,找合伙人永远不能代替对未知领域的学习。如果更谦卑和更有耐心,创业者对自己,团队,客户,生态伙伴会有更多悲悯,也会更从容。关于旅游大数据产品规划及设计全域旅游是将特定区域作为完整旅游目的地进行整体规划布局、综合统筹管理、一体化营销推广,促进旅游业全区域、全要素、全产业链发展,实现旅游业全域共建、全域共融、全域共享的发展模式。旨在推动旅游业由”景区旅游”向”全域旅游”发展模式转变,推动旅游业创新、协调、绿色、开放、共享发展,促进旅游业转型升级、提质增效,构建新型旅游发展格局。参考从海南全域旅游建设角度出发,谈谈旅游大数据产品规划及设计茶饮品牌估值几十亿,潮牌月入五亿,为什么中国所有的消费品都值得重做一遍?一颗卖6元,月薪上万也吃不起车厘子?网友哭穷,这个小国却笑着数钱公众号:Java猫说现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。

February 13, 2019 · 1 min · jiezi

《CSS设计指南》读书笔记

前言代码网址:http://www.stylinwithcss.com/第一章 HTML标记与文档结构1.html的含义HTML 标记内容的目的是为了赋予网页语义(semantic)。就是要给你的网页内容赋予某些用户代理(user agent)能够理解的含义。用户代理:浏览器、给视障用户朗读网页的屏幕阅读器,以及搜索引擎放出的 Web 爬虫都是用户代理,它们需要显示、朗读和分析网页。2.闭合标签与自闭合标签的区别闭合标签包含的是会显示的实际内容,而自闭合标签只是给浏览器提供一个对要显示内容的引用。浏览器会在 HTML 页面加载的时候,额外向服务器发送请求,以取得自闭合标签引用的内容。3.alt属性的作用视障用户使用的屏幕阅读器会大声读出 alt 属性的内容,因此一定要给<img>标签的这个 alt属性添加让人一听(或一看)就能明白的内容。4.搜索引擎关键词来源title>h15.段落的作用段落用于标记主要的文本内容,是所有文本元素中出场率最高的一个。简言之,只要有不适合放在其他文本标签中的文本,都可以把它放一个段落里面。6.<!DOCTYPE html>含义是一种简化的 DOCTYPE,这一行就是为了声明:“以下是一个 HTML 文档。”7.html标签<html>标签,也就是所谓的根级标签,<html>标签只有两个直接的子标签:<head>和<body>。8.head标签帮助浏览器理解页面的信息都包含在<head>标签中9.划重点无论你想了解哪个 HTML 元素,第一个要问的问题都应该是:它是块级元素,还是行内元素?知道了这一点之后,就可以在编写标记的时候,预想到某个元素在初始状态下是如何定位的,这样才能进一步想好将来怎么用 CSS 重新定位它。10.blockquote引用,使用cite标签包含作者姓名。11.关于domDOM 是文档对象模型,从浏览器的视角来观察页面中的元素以及每个元素的属性,由此得出这些元素的一个家族树2019.01.20 看了这本书的第一章,感觉大部分以前都已经了解,不过也有收获。先看了一遍第一章然后作的笔记,做笔记的时候忘记了自己感兴趣内容的地方,不得不重新开头看一遍。下次注意标记。

January 20, 2019 · 1 min · jiezi

《你不知道的JavaScript》 (下) 读书笔记

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅;不错,下册的知识点就这么少,非常不推介看下册;第三章 代码组织子类构造器有个 ES6 子类构造器的限制是:子类构造器中调用 super() 之后才能访问 this;具体原因比较复杂,不过可以归结为初始化你的实例 this 的实际上是父构造器。在 ES6 之前正好相反,this 对象是由子类构造器创建的,然后在子类的 this 上下文中调用父类构造器;class Foo { constructor() { this.a = 1 }} class Bar extends Foo { constructor() { this.b = 2 // 报错,this不允许在super()之前调用 super() // 交换上一句位置 }}

January 8, 2019 · 1 min · jiezi

《你不知道的JavaScript》 (上) 读书笔记

本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅;第一部分 作用域和闭包第二章 词法作用域词法查找全局变量会自动成为全局对象(浏览器中是 window) 的属性,因此是不可以直接通过全局对象的此法名称,而是间接地通过全局对象属性的应用来对其进行访问 window.a,通过这种方法可以访问那些被同名变量所遮蔽的全局变量。但是如果非全局的变量如果被遮蔽了,无论如何都无法被访问到。欺骗词法如果词法作用域完全由写代码期间函数所生命的位置来定义,那么可以通过几种方法来欺骗(修改)词法作用域,比如 eval、with 但是要注意:欺骗词法作用域会导致性能下降。因为JS引擎会在编译阶段进行性能优化,其中有些优化依赖于能够根据代码的词法进行静态分析,并预先确定所有变量和函数的定义位置,才能在执行过程中快速找到标识符。但是如果引擎在代码中找到 eval、with ,就会完全不做任何优化。第三章 函数作用域和块作用域函数作用域包装函数的声明以 function 关键字开始,那么就是函数声明,而下面这个例子是以 (function 开始,那么就是函数表达式:const a = 1; function foo() { // 函数声明 const a = 4; console.log(a);} (function foo() { // 函数表达式 const a = 3; console.log(a);}())console.log(a);所以上面的 IIFE 将会被当做函数表达式而不是一个函数声明来处理;函数声明和函数表达式之间最重要的区别是他们的名称标识符会绑定在何处。函数声明的名称标识符 foo 会被绑定在所在作用域中,可以直接通过 foo() 来调用;而函数表达式的 foo 被绑定在函数表达式只剩的函数中而不是所在作用域中;同时,即使是具名的函数表达式,名称标识符在赋值之前也无法在所在作用域中使用。try/catch 结构的 catch 分句中具有块级作用域。第四章 提升编译器函数声明会被提升,而函数表达式不会被提升。函数优先函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量。foo() // 1var foo function foo() { console.log(1)} foo = function() { console.log(2)}函数声明 foo 会首先被提升,然后打印出 1,后面的 var 声明会被认为是重复声明而被忽略;但是注意如果后面出现同名函数声明,则会覆盖前面的:foo() // 2function foo() { console.log(1) }function foo() { console.log(2) }第二部分 this和对象原型第一章 关于thisthis到底是什么this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用,并不是在编写时绑定。当一个函数被调用时,会创建一个执行上下文,它包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息,this 就是这个记录的一个属性,会在函数执行的过程中用到。判断this我们可以根据优先级来判断 this:new 绑定: 函数是否是在 new 中调用,如果是的话, this 绑定的是新创建的对象;var bar = new foo()显式绑定: 函数是否通过 call、apply 或者硬绑定调用,如果是的话,this 绑定的是指定的对象;var bar = foo.call(obj)隐式绑定: 函数是否在某个上下文对象中调用,如果是的话 this 绑定的是那个上下文对象;var bar = obj.foo()默认绑定: 如果都不是的话,在严格模式下绑定到 undefined ,非严格模式绑定到全局对象;var bar = foo()例外被忽略的情况: 比如把 null、undefined 作为 this 的绑定对象传入 call、apply、bind ,那么这些值在调用时会被忽略,实际应用的是默认绑定;箭头函数: 箭头函数根据外层作用域来决定 this,且箭头函数的绑定无法被修改,new 也不可以; ...

January 8, 2019 · 1 min · jiezi

《你不知道的JavaScript》 (中) 读书笔记

本书属于基础类书籍,一次会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅;第一部分 类型和语法第二章 值43.toFixed(3)// 报错: Invalid or unexpected token43..toFixed(3)// “43.000"这是因为42.toFixed(3)这里因为.被视为常量42的一部分,所以没有.属性访问运算符来调用toFixed方法。而42..toFixed则没有问题。第四章 强制类型转换JSON.stringify在对象中遇到undefined、function、symbol时会自动将其忽略,在数组中则会返回null,比如:JSON.stringify([1, 23, 4, null, undefined, function(){ return 123 }])// “[1,23,4,null,null,null]“JS中的假值 undefined、null、false、+0、-0、NaN、““除了空字符串外的所有字符串都是真值所有对象都是真值关于真假值的判断:new Boolean(false) // truenew Number(0) // truenew String(””) // trueBoolean(“false”) // trueBoolean(“0”) // trueBoolean(”’’”) // trueBoolean([]) // trueBoolean({}) // trueBoolean(function() {}) // true第五章 语法结果值语句都有个结果值:赋值表达式 b = a 的结果值是a的值规范定义 var 的结果值是 undefined代码块 { … } 的结果值是其最后一个语句表达式的结果标签语句{ foo: bar() } 这里的 foo 是标签语句,带标签的循环跳转可以使用 continue\break 来实现执行标签所在循环的下一轮循环或跳出标签所在循环;foo: for (var i = 0; i < 4; i++){ for (var j = 0; j < 4 ; j++){ if ((i * j) === 3){ console.log(‘stoping’, i, j) break foo; } console.log(i, j) }}// 0 0// 0 1// 0 2// 0 3// 1 0// 1 1// 1 2// stoping 1 3这里的 break foo 不是指跳转到标签 foo 所在位置继续执行,而是跳出标签 foo 所在的循环/代码块,继续执行后面的代码。因此这里的标签语句并非传统意义上的 goto;关联运算符有优先级,那么如果多个相同优先级的运算符同时出现,执行的顺序就和关联顺序有关了,JS默认的执行顺序是从左到右,但是有时候不是,比如:? : 三元运算符是右关联,比如? : ? : ,其实是? : (? :) 这样的顺序= = 连等是右关联,比如 a=b=c=2,其实是 (a=(b=(c=2)))函数参数像函数传递参数时,arguments 数组中对应单元会和命名参数建立关联(linkage)以得到相同的值;相反,不传递参数就不会建立关联:function foo(a){a=42console.log(arguments[0])}foo(2) // 42foo() // undefined注意:严格模式没有建立关联一说;try…finallyfinally 中的代码总是会在 try 之后执行,即使 try 中已经 return 了,如果有 catch 的话则在 catch 之后执行;function foo(){ try{ return(‘returned’) } finally { console.log(‘finally’) }}console.log(foo())// finally// returned如果 finally 中抛出异常,函数会终值,如果之前 try 中已经 return 了返回值,则返回值会被丢弃;finally 中的 return 会覆盖 try 和 catch 中 return 的返回值;finally 中如果没有 return,则会返回前面 return 的返回值;switchswitch 中的 case 执行的匹配是 === 严格相等的,也就是说如果不是 true,是真值也是不通过的:switch(true) { case (‘hello’ || 10): console.log(‘world’) // 不会执行 break; default: console.log(’emmm’)}// emmm所以这里的字符串即使是真值,也是不被匹配,所以可以通过强制表达式返回 Boolean 值,比如 !!(‘hell0’ || 10)default 是可选的,无需放在最后一个,且并非必不可少:switch(10){ case 1: case 2: default: console.log(‘hello’) case 3: console.log(3) break; case 4: console.log(4)}// hello// 3上面这个例子的逻辑是:首先找匹配的 case,没找到则运行 default,因为其中没有 break,所以继续执行 case 3 中的代码,然后 break;附录全局 DOM 变量由于浏览器历史遗留问题,在创建带有 id 属性的 DOM 元素的时候也会创建同名的全局变量:<div id=‘foo’><div><scripts> console.log(foo) // 打印出DOM元素</scripts>所以说 HTML 中尽量少用 id 属性…第二部分 异步和性能第一章 异步:现在和将来异步控制台某些浏览器的 console.log 并不会把传入的内容立即输出,原因是在许多程序(不只是JS)中,I/O 是非常低速的阻塞部分,所以,从页面UI的角度来说,浏览器在后台异步处理控制台 I/O 能够提高性能,这时用户可能根本意识不到其发生。var a = { b: 1 }console.log(a)a.b++这时候控制台看到的是 a 对象的快照 {b:1},然而点开看详情的话是 {b:2} ;这段代码在运行的时候,浏览器可能会认为需要把控制台 I/O 延迟到后台,这种情况下,等到浏览器控制台输出对象内容时,a.b++ 可能已经运行,因此会在点开的时候显示 {b:2},这是 I/O 的异步化造成的。如果遇到这种情况:使用JS调试器中的断点,而不要依赖控制台输出;把对象序列化到一个字符串中,以强制执行一次快照,比如通过 JSON.stringify;第三章 Promise回调未调用如果 Promise 状态一直未改变,怎么得到通知呢,这里可以使用 Promise.race 竞态,如果在设置时间内还未返回,那么 Promise 将会被 reject;function timeoutPromise(delay) { return new Promise((resolve, reject) => { setTimeout(() => { reject(‘Timeout!’) }, delay) })} Promise.race([foo(), timeoutPromise(3000)]) .then(() => console.log(‘Promise 及时完成’)) .catch(() => console.log(‘Promise 超时了’))第四章 生成器输入和输出function* foo(x) { return x * (yield ‘hello’)}const it = foo(6) let res = it.next()res.value // hello res = it.next(7)res.value // 42可以看到第一个 next 并没有传参,因为只有暂停的 yield 才能接受这样一个通过 next 传递的参,而在生成器刚生成还没有 next() 这时候还没有暂停的 yield 来接受这样一个值,所以会默默丢弃传递给第一个 next 的任何参数。生成器中的 Promise 并发function* foo() { const r1 = yield request(‘http://some.url.1’) const r2 = yield request(‘http://some.url.2’)}这种方式的两个请求是串行的,yield 只是代码中一个单独的暂停点,不能同时在两个点上暂停,如果希望并行的发送,那么考虑:function* foo() { const p1 = request(‘http://some.url.1’) const p2 = request(‘http://some.url.2’) const r1 = yield p1 const r2 = yield p2} ...

January 6, 2019 · 2 min · jiezi

读书笔记(06) - 语法基础 - JavaScript高级程序设计

写在开头本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了。答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章。对此,笔者换了随机阅读的方式,哪章感兴趣了或者想补知识点,再去翻阅对应的章节。当然目录还是要翻的。工作生活节奏太快,知识太多,时间与知识的增长成反比,求全不如求专,也许不能看完全书,但至少掌握所需知识点。思维导图是个好东西,一图流。语法标识符由字母,下划线_,美元符号$,数字组成第一个字符不能是数字注意不要使用关键字作标识符对象属性[]号写法可不遵循标识符规则 obj[123] = 123数据类型数据类型共有10个,ES5有7个,3个为ES6新增number/boolean/string/undefined/object/null/function/symbol/set/map判断类型可用typeof判断对象为何种引用类型可用instanceofundefined与nullundefined (使用var声明但未初始化)null (空对象指针)undefined == null // trueNaNNaN表示本来应返回一个数值,结果未正确返回NaN不等于任何值,且不等于自身用isNaN()可判断是否为NaN数值转换Number() 转型函数参数值结果true1false0null0undefinedNaN’‘0'168'168'168hello’NaN’hello’NaNTIPS:参数值为一个对象,则先调用valueOf(), 没有再调用toString(), 然后遵循上述规则parseInt()第一个参数为转换的值第二个参数为转换的进制会尝试解析字符串前面的数字(不同于Number())parseInt(‘168hello’) -> 168parseFloat()第一个小数点有效,忽略后面小数点的解析会尝试解析字符串前面的数字忽略前导0,只支持10进制,没有第二个参数 (不同于parseInt())parseFloat(‘520.13.14’) -> 520.14字符串转换toString() 方法大多数数据类型拥有toString()方法,可在参数中指定转换进制null/undefined 没有toString()方法String() 转型函数如果参数值有toString()方法,则调用toString()方法null 转为 “null"undefined 转为 “undefined"函数 function不支持重载后定义的函数会覆盖之前参数数组对象:arguments语句if…else…do…while… 后测试循环,不同于while/for前测试循环whileforfor…in… 遍历对象属性label 与 break/continue 合用switch…case… case 全等判断with 将代码作用域设置到特定的对象中switch…casecase 判断时是全等判断,不会进行类型转换case 值不一定是常量,可以是变量,甚至是表达式case ‘hello’ + ‘word’;case num < 10;labellabel语句允许在代码中添加标签,label与break/continue联合使用,可返回代码指定位置var num = 0;outermost:for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { if ( i== 5 && j == 5) { break outermost; // 退出循环(因为outermost定义的位置在最外层) // 普通的break只能跳出一层循环 } }}withwith语句的作用是将代码的作用域设置到一个特定的对象// window.location 对象为例子with(location) { var url = href; // location.href}操作符一元操作符布尔运算符算数运算符关系运算符条件运算符赋值预算符逗号运算符一元操作一元操作符指的是只能操作一个值的操作符递增++递减–后置:语句被求值后执行自身赋值var a = 2;var b = 20;var c = a– + 20; // 后置运算 c: 22, a: 1布尔运算符逻辑非!!! 功能等于 Boolean() 转型函数逻辑与 &&第一参数是对象,返回第二个参数第一个参数为null/NaN/undefined, 则直接返回第一个参数逻辑或 ||规则与逻辑与相同,不同的是只要第一个参数成立则不会进行后续运算TIPS:逻辑与或都属于短路运算,并不一定返回true/false,参数未声明可能会报错或赋值不成功算数运算符+, -, *, /, % 关系运算符<, >, <=, >=, ==, ===, !=, !===两个参数都是数值,进行值比较两个参数都是字符串,进行字符编码比较(大写字母的字符编码小于小写字母)一个参数是数值,则转为数值比较一个参数是对象,则先调用其valueOf(),没有valueOf()再调用toString()=== 全等会进行值与类型的比较null == undefined // true条件运算符三元表达式var score = 90;var achie = score > 90 ? ‘优秀’ : ‘再接再厉’;逗号操作符逗号操作符可以在一条语句执行多个操作,常用于变量初始化TIPS: 用于赋值时,逗号操作符会返回表达式最后一项的值var name = ‘KenTsang’, age = 28, job = ‘Developer’;详解逗号表达式,可移步笔者的文章:《一道JS面试题引发的血案》。if-else/switch-case/?:/&&/||可移步笔者的文章: 《JS中 if/ if…else替换方式》参考文档《JavaScript高级程序设计》作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。 ...

December 26, 2018 · 1 min · jiezi

读书笔记(05) - 事件 - JavaScript高级程序设计

HTML依托于JavaScript来实现用户与WEB网页之间的动态交互,接收用户操作并做出相应的反馈,而事件在此间则充当桥梁的重要角色。日常开发中,经常会为某个元素绑定一个事件,编写相应的业务逻辑,在元素被点击时执行,并反馈到用户操作界面。这个过程中,事件就像一个侦听器,当点击动作发生时,才会执行对应的程序。这种模式可称之为观察员模式。接下来就讲讲DOM事件相关知识。何为事件事件就是用户或浏览器自身执行的某种动作常用的DOM事件有click/mouseover/mouseout/keyup/keydown等。事件流事件流描述的是从页面中接收事件的顺序HTML描述的是一个DOM文档结构,而事件流所描述的是DOM文档节点接收事件顺序。而事件流有两种事件模式,捕获/冒泡,两者所描述的事件传递顺序对立相反。事件模式:捕获与冒泡冒泡事件冒泡:事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)规范要求事件冒泡到document对象,而浏览器则会将事件一直冒泡到window对象。所有浏览器都支持事件冒泡(包括IE9以下)。捕获事件捕获:(与事件冒泡相反)事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件与冒泡一样,虽然规定事件应该从document对象开始传播,但浏览器普遍都是从window对象开始捕获。IE9以下不支持事件捕获DOM 事件流"DOM2级事件"规定事件流包括三个阶段,顺序进行事件捕获阶段处于目标阶段事件冒泡阶段TIPS: 实际的目标元素在捕获阶段不会接收到事件,在处于目标阶段时接收事件发生处理,并被看成是冒泡阶段的一部分。尽管"DOM2级事件"规范明确要求捕获阶段不会涉及事件目标,但浏览器会在捕获阶段触发事件对象上的事件。 事件处理程序响应某个事件的函数方法,我们称之为事件处理程序(或事件侦听器)window.onclick = function() { //…}// 这里的function(){}就是事件处理程序HTML事件处理程序HTML中元素支持的事件,可以使用一个同名的HTML特性来指定,而这个特性的值就是js能执行的代码或表达式。写法上可以看出类似HTML中id/type/class等属性的写法,都是on+’…‘缺点:HTML是结构层(显示层),而JavaScript是行为层(业务层)。在显示层上去编写业务逻辑代码处理,会使得HTML与JavaScript代码耦合过于紧密,不好维护。DOM级别一共可以分为四个级别:DOM0级、DOM1级、DOM2级和DOM3级。而DOM事件分为3个级别:DOM 0级事件处理程序,DOM 2级事件处理程序和DOM 3级事件处理程序。DOM 1级中没有规范事件的相关内容,所以没有DOM 1级事件处理。DOM0 级事件处理程序每个元素(HTML元素)都有自己的事件处理程序属性,属性名通常以on开头,例如onclick/onmouseover。为这个属性的值设置一个函数,就可以指定事件处理程序。而将其属性值赋值为null,则完成解绑。(同个元素无法绑定多个同名事件)var myBtn = document.getElementById(‘myBtn’);// 为myBtn绑定事件处理程序, 只能绑定一个myBtn.onclick = function() { alert(‘Hello world!’);}// 解绑myBtn.onclick = null;DOM2 级事件处理程序"DOM2级事件"定义了两个方法,addEventListener()/removeEventListener(),用于为元素绑定和解绑事件。(可绑定多个事件,区别于DOM0级/HTML仅能绑定一个)。el.addEventListener(eventName, callBack, useCapture)eventName: 事件名称callBack: 回调函数,当事件触发时,函数会传入一个参数event,为当前的事件对象useCapture: 默认是false,代表事件句柄在冒泡阶段执行, true则代表在捕获阶段执行var myBtn = document.getElementById(‘myBtn’);var handleClick = function() { alert(‘Hello world!’);}// 绑定事件处理程序myBtn.addEventListener(‘click’, handleClick, false);// 解绑myBtn.removeEventListener(‘click’, handleClick);TIPS:DOM2级事件处理程序,解绑时function必须与传入addEventListener相同// 绑定myBtn.addEventListener(‘click’, function() { // 匿名函数});// 解绑myBtn.removeEventListener(‘click’,function() { // 匿名函数});// add/remove 分别绑定了两个匿名函数(函数为引用类型),所以两个函数并不相同,所以无法成功解绑TIPS:绑定多个事件处理程序时,执行顺序按绑定顺序执行myBtn.addEventListener(‘click’, function() { // step1…})myBtn.addEventListener(‘click’, function() { // step2…})// 执行顺序:step1 -> step2浏览器支持情况:IE9以下不支持DOM2级事件处理程序IE 事件处理程序IE9以下不支持DOM2级事件,但IE提供了与DOM2级事件类似的两个方法,attachEvent()/detachEvent,IE9以下不支持事件捕获,所以attachEvent仅支持冒泡阶段触发,只接收两个参数(eventName, function)。// 绑定myBtn.attachEvent(‘onclick’, handleClick);// 解绑myBtn.detachEvent(‘onclick’, handleClick);TIPS:解绑时function必须与传入attachEvent相同,这点与DOM2级事件相同与DOM0级的区别,DOM0级事件处理在元素的作用域运行,而attachEvent事件处理在全局,this指向window绑定多个事件处理程序时,执行顺序按绑定顺序逆反执行(与DOM2级相反)myBtn.attachEvent(‘click’, function() { // step1…})myBtn.attachEvent(‘click’, function() { // step2…})// 执行顺序:step2 -> step1Event 事件对象常见应用event.preventDefault()阻止默认事件event.stopPropagation()阻止事件流发生传递(冒泡/捕获)event.stopImmediatePropagation()阻止剩余事件处理函数的执行,并阻止当前事件在事件流上传递event.currentTarget当前绑定事件的元素event.target当前触发事件的元素event.stopPropagation()与.stopImmediatePropagation()的区别同个元素绑定多个同名事件时,stopImmediatePropagation不仅阻止了冒泡,而且会阻止后续事件的执行,可以理解为加强版的stopPropagationmyBtn.addEventListener(‘click’, function(event) { // step1; event.stopImmediatePropagation();})myBtn.addEventListener(‘click’, function(event) { // step2; // 我被stopImmediatePropagation阻止掉了!!!})currantTarget与target的区别事件处理程序内部,this等于currentTarget(当前绑定事件的元素),而target(当前触发事件的元素)// currentTarget == targetmyBtn.addEventListener(‘click’, function(event) { event.target == event.currentTarget; // true -> myBtn})// currentTarget != target 捕获/冒泡document.body.addEventListener(‘click’, function(event){ event.target == event.currentTarget; // false // event.target -> myBtn // event.currentTarget -> body})内存与性能WEB网页是运行在浏览器客户端的,而计算机分配给浏览器的内存及CPU占用是有限制的。虽说浏览器引擎不断地发展优化,但是内存占用多了, 性能不免会损耗。内存为元素指定事件绑定程序,事实上是赋值了一个函数方法,而函数在javaScript中是一种引用类型的数据格式,既然是数据那就需要用到内存储存。函数创建多了,消耗掉内存。性能为元素指定事件绑定程序,首先需要对DOM进行查询,找出要绑定事件的元素。而这也会造成DOM元素的访问次数增加。DOM的操作一直是网页性能的一个优化点。了解完事件绑定带来内存跟性能的原理,我们来看一个例子,例如我们有一个ul>li的列表,要监听每一个li的点击事件,并触发事件处理程序。单独绑定的话,10个li就要对DOM元素查询10次,创建的匿名函数就有10个(当然可以共同创建同个函数引用),如果还有20个,30个,100个,那么这种为每个li元素单独绑定事件的方法,绝对不是最优解。这就引出下面的优化方案:“事件委托”。事件委托(事件代理)对"事件处理程序绑定过多"的问题,最好的解决方案就是"事件委托"。它的原理是利用了事件流的"冒泡"机制,事件目标元素会把事件向上层传递,直到document(浏览器会传到window),所以父级节点是可以接收子节点的事件传递。以刚刚ul>li的例子,li有很多个, 但它们有一个共同的父节点ul。li的点击事件会冒泡到ul,因此我们可以在ul上绑定一个事件处理程序,处理所有li的点击事件,然后通过event.target可以确定触发事件的元素。var ulParent = document.getElementById(‘parent’);ulParent.addEventListener(‘click’, function(event) { var taget = event.target; })通过"事件委托"减少了DOM元素的查询,以及多个函数的内存占用,而且还有一个好处,当我们的li是动态的,增加和移除时,都无需再做绑定和解绑事件操作,因为它都会冒泡到父级节点。移除多余的事件绑定文档中移除了绑定了事件的DOM元素,如innerHTML/removeChild()/replaceChild()等可以对DOM进行替换,而移除的DOM元素原先所绑定的事件处理程序,并不能有效被浏览器垃圾回收,所以占用一直存在。所以建议在移除某个DOM元素时,如果其绑定了事件处理程序,需手动解除绑定,释放内存。自定义事件除了为元素绑定支持的事件以外,我们还可以通过Event/CustomEvent来创建开发者自定义事件。两者不同的是CustomEvent可传递一个Object对象来传输数据。// Eventvar eve = new Event(‘custome’);// CustomeEvent 可传参数var eve = new CustomeEvent(‘custome’, { name: ‘KenTsang’, age: 28});// 为DOM元素添加事件监听ele.addEventListener(‘custome’, function() { console.log(‘custome’);})// 触发ele绑定的自定义事件ele.dispatch(eve);事件这块还剩下一部分知识点,后续文章会再就模拟事件这块知识点进行拆分详解。天冷了,更文不易,望大家多多点赞。《JavaScript高级程序设计》作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。 ...

December 10, 2018 · 1 min · jiezi

读书笔记(04) - 错误监控 - JavaScript高级程序设计

错误类型即时运行错误 (代码错误)资源加载错误常见的错误类型1. 类型转换错误建议使用全等===操作符2.数据类型错误建议加强类型判断// 数组倒序function reverseSort(value) { if (value instanceof Array) { // 使用instanceof验证数据类型 // (基础类型用typeof, 引用类型用instanceof) value.sort(); value.revere() }}3. 通信错误url参数编码错误造成,建议使用encodeURIComponent()对url参数数据进行编码// 错误的url参数// http://www.xxx.com/?redir=http://www.xxx.com?a=b&c=d// 针对redir后面的参数字符串进行编码// 封装一个处理方法(摘自书中代码)function addQueryStringArg(url, name, value) { if (url.indexOf(’?’) < 0) { url += ‘?’; } else { url += ‘&’; } url += encodeURIComponent(name) + “=” + encodeURIComponent(value); return url;}错误的捕获方式针对即时运行错误try-catch(代码可疑区域可增加try-catch)window.onerror (全局监控js错误异常)1. try-catchtry { // 可能会导致错误的代码} catch (error) { // 错误发生时处理 console.log(error.message);} finally { // 一定会执行(无论是否发生错误)}TIPS: 使用了finally,try跟catch的return语句都会被忽略function testFinally() { try { return 2; } catch (error) { return 1; } finally { return 0; }}// testFinally 最终返回 0TIPS: try-catch只能捕获同步运行的代码错误,无法检测语法和异步错误(语法可借助ESlint工具在开发阶段提示解决)2. window.onerror遵循DOM0级事件,window.onerror事件处理程序不会创建event对象,但可以接收三个参数message(错误信息), url(错误文件url), line(行号)window.onerror = function(message, url, line){ console.log(message, ulr, line);};在事件处理程序中返回false,可以阻止浏览器报告错误的默认行为window.onerror = function(message, url, line) { return false;}针对资源加载错误object.onerrorperformance.getEntries()Error事件捕获 (全局监控静态资源异常)1. object.onerror如script,image等标签src引用,会返回一个event对象TIPS: object.onerror不会冒泡到window对象,所以window.onerror无法监控资源加载错误var img = new Image();img.src = ‘http://xxx.com/xxx.jpg';img.onerror = function(event) { console.log(event);} 2. window.performance.getEntires()适用高版本浏览器,返回已成功加载的资源列表,然后自行做比对差集运算,核实哪些文件没有加载成功var result = [];window.performance.getEntries().forEach(function (perf) { result.push({ ‘url’: perf.name, ’entryType’: perf.entryType, ’type’: perf.initiatorType, ‘duration(ms)’: perf.duration });});console.log(result);3. Error事件捕获window.addEventListener(’error’, function(error){ //…(全局监控静态资源异常) console.log(error);})跨域的js错误捕获一般涉及跨域的js运行错误时会抛出错误提示script error,但没有具体信息(如出错文件,行列号提示等), 可利用资源共享策略来捕获跨域js错误客户端:在script标签增加crossorigin属性(客户端)服务端:js资源响应头Access-Control-Allow-Origin: *错误上报Ajax请求 (会有跨域问题)动态创建Image标签 (兼容完美,代码简洁,需要注意浏览器url长度限制)Image标签(new Image()).src= ‘http://xxx.com/error?code=1002'上报频率错误信息频繁发送上报请求,会对后端服务器造成压力。项目中我们可通过设置采集率,或对规定时间内数据汇总再上报,减少请求数量,从而缓解服务端压力。// 借鉴别人的一个例子Reporter.send=function(data) { // 只采集30% if(Math.random() < 0.3) { send(data); // 上报错误 }}*参考文档《JavaScript高级程序设计》《如何优雅处理前端异常》作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。 ...

December 6, 2018 · 1 min · jiezi

读书笔记(03) - 性能 - JavaScript高级程序设计

作用域链查找作用域链的查找是逐层向上查找。查找的层次越多,速度越慢。随着硬件性能的提升和浏览器引擎的优化,这个慢我们基本可以忽略。除了层级查找损耗的问题,变量的修改应只在局部环境进行,尽量避免在局部环境下去操作修改父级变量的值。(react/vue 单向数据流的数据传输方式)优化方法:声明一个变量存储引用(该方法应用甚多)不必要的属性查找// 未优化(window.location.href 3*2 6次)var query = window.location.href.substring(window.location.href.indexOf(’?’);// 优化后(3次,以后多次调用url,查询次数不会增加)var url = window.location.href;var query = url.substring(url.indexOf(’?’)url = null函数里面声明的变量,在函数调用栈执行后退出时,会自动清除引用。而全局变量和闭包则会与之相反,继续保存,所以使用用后需手动标记清除,以免造成内存泄漏。优化循环减值迭代简化终止条件简化循环体使用后测试循环减值迭代日常应用不多,与增值迭代的区别,就在i存储的值。减值迭代i的值不断在变小,存储的空间也在变小。但在前端极少需要遍历上万次上亿次的数据,上千上百都很少,所以这个优化可忽略。而且我们遍历的顺序一般都是从数组头部开始,所以增值迭代应用的更多。// 增值迭代(用的较多)for(var i = 0; i < len; i++) { //…}// 减值迭代for(var i = len - 1; i >= 0 ; i–) { //…}简化终止条件 (常用)终止条件应该是一个固定值判断,应避免在终止条件上做其他运算(属性查找等)。// 未优化,每次循环都会去计算数组长度var arr = [‘HTML’, ‘CSS’, ‘JavaScript’];for (var i = 0; i < arr.length; i++) { //…}// 优化后for (var i = 0, len = arr.length; i < len; i++) { //…}// 声明了一个变量len用于储存数组长度,只会计算一次简化循环体循环体的代码应该着重于只需要遍历处理的代码,其他无关代码应放置到循环体外面。后测试循环最常用的for循环和while循环都是前测试循环。而do-while这种后测试循环,可以避免最初终止条件的计算,因此运行更快。前测试循环(for/while),可能一次都不会执行循环体后测试循环(do…while),至少执行一次用确定索引值更快// for循环遍历var arr = [‘HTML’, ‘CSS’, ‘JavaScript’];for (let i = 0, len = arr.length; i < len; i++) { arr[i];}// 确定索引值arr[0]; arr[1]; arr[2];其他原生方法较快(Math)switch语句较快 (多个if情况下)位运算符较快TIPS: 判断优化,最可能的到最不可能的顺序组织(if/switch)最小语句数符合 write less, do more 的代码追求多个变量声明合并// 多个var声明var name = ‘KenTsang’;var age = 28;var job = ‘Developer’;// 合并一个var声明var name = ‘KenTsang’, age = 27, job = ‘Developer’;插入迭代值// 优化前var name = value[i];i++;// 优化后var name = value[i++];数组/对象字面量创建引用类型可以使用构造函数和字面量两种方式,不过日常习惯都使用字面量,因为语句更简洁,写起来更像数据封装。// 字面量var arr = [1, 2, 3, 4];var obj = { name: ‘KenTsang’}// 构造函数var arr = new Array(1, 2, 3, 4);var obj = new Object();obj.name = ‘KenTsang’;DOM优化交互最小现场更新现场更新:一旦你需要访问的 DOM 部分是已经显示的页面的一部分,那么你就是在进行一个现场更新文档片段文档片段相当一个临时的占位符,只有片段中的内容会被添加到DOM上,片段本身并不会被添加。// 代码片段标签var ele = document.getElementById(‘ul’);var fragment = document.createDocumentFragment();var browsers = [‘Firefox’, ‘Chrome’, ‘Opera’, ‘Safari’, ‘IE’];browsers.forEach(function(browser) { var li = document.createElement(’li’); li.textContent = browser; fragment.appendChild(li);});// 只会操作一次DOMele.appendChild(fragment);innerHTML合并插入代码一次性设置innerHTML。// 优化前:操作多次DOMvar list = document.getElementById(“myList”);for (var i=0; i < 10; i++) { list.innerHTML += “<li>Item " + i + “</li>”;}// 优化后:操作一次DOMvar innerHtml = ‘’;for (var i = 0; i < 10; i++) { innerHtml += ‘<li>Item’ + i + ‘</li>’;}list.innerHTML = innerHtml;事件代理(事件委托)通过事件流——冒泡机制实现代理,子元素事件触发冒泡到父元素,由父元素绑定一个事件进行统一处理,避免多个事件绑定影响性能。<ul class=“list”> <li class=“item”>HTML</li> <li class=“item”>CSS</li> <li class=“item”>JavaScript</li></ul>var listEle = document.getElementById(’list’);listEle.addEventListener(‘click’, function(event) { if (event.target.className.indexOf(‘item’) > -1) { console.log(event.target.innerHTML); }})// jquery$(’#list’).on(‘click’, ‘.item’, function(event){ console.log($(this).html());})注意HTMLCollection任何时候要访问 HTMLCollection,不管它是一个属性还是一个方法,都是在文档上进行一个查询,这个查询开销很昂贵。// 一个死循环例子<a href=”">link</a> var existLinkEle = document.getElementsByTagName(‘a’);for (var i = 0; i < existLinkEle.length; i++) { console.log(i); var linkEle = document.createElement(‘a’); document.body.appendChild(linkEle);}// body会不断地插入a标签因为existLinkEle.length每次循环都会重新计算页面a节点的数量,而得到的值一直递增。// 优化(一个变量存储引用)var len = existLinkEle.length;for (var i = 0; i < len; i++) { //…}返回HTMLCollection对象情况有:document.getElementByTagName()。获取元素的childNodes属性获取元素的attributes属性document.forms,document.images等参考文档《JavaScript高级程序设计》作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。 ...

December 4, 2018 · 2 min · jiezi

读书笔记(02) - 可维护性 - JavaScript高级程序设计

编写可维护性代码可维护的代码遵循原则:可理解性 (方便他人理解)直观性 (一眼明了)可适应性 (数据变化无需重写方法)可扩展性 (应对未来需求扩展,要求较高)可调试性 (错误处理方便定位)命名方式变量取名多为为名词,方法取名多为为动词// 变量名car, person;// 方法名getName, isEnable;解耦功能过于依赖,代码耦合过紧,不利于维护。而通过解耦能让我们更专一地处理特定功能业务的开发,也方便我们开发中调试,从复杂的耦合依赖中抽离出来。解耦优势:代码复用,单元测试。解耦原则:HTML/JavaScript解耦(结构层/行为层的解耦)CSS/JavaScript解耦 (样式层/行为层的解耦)应用逻辑/事件处理程序解耦应用逻辑/事件处理程序解耦合的原则:勿将event对象传给其他方法;只传来自event对象中所> 需的数据任何可以在应用层面的动作都应该可以在不执行任何事> 件处理程序的情况下进行;任何事件处理程序都应该处理事件,然后将处理转交给应用逻辑// 一个事件解耦的例子var pwdInput = document.getElementById(‘password’);// 回车事件pwdInput.addEventListener(‘keyup’, function(event){ if (event.keyCode == 13) { validatePassword(event.target.value); }})// 失焦事件pwdInput.addEventListener(‘blur’, function(event) { validatePassword(event.target.value);})// 业务应用单独封装到一个方法里面,多处复用/单元测试皆可function validatePassword(pwd) { if (!pwd) { alert(‘密码不能为空!’); } }对象所有权JavaScript中是通过原型链来实现继承,而原型继承的一个特点就是原型上定义的属性方法,可以被多个实例共享使用。对象维护原则:不要为实例或原型添加属性不要为实例或原型添加方法不要重定义已存在的方法需要修改对象时:创建包含所需功能的新对象,并用它与相关对象进行交互创建自定义类型,继承需要进行修改的类型,然后可以自定义类型添加额外功能全局变量引申命名空间var name = ‘KenTsang’;function sayName () { console.log(name);}var MyApp = { name: ‘KenTsang’, sayName: function() { console.log(this.name); } skill: { html: 80, css: 80, js: 80 }}MyApp.skill.js // 80虽然减少程序员输错代码造成修改全局变量的几率,但依旧可以修改到全局变量,而且增加了代码量。常用null比较误区TIPS: null可同时判断null/undefined,可用来判断对象属性是否存在。使用null作判断无法进行充分的类型检查。// 错误用法function sortArrays(values) { if (values != null) { // 非数组类型就会报错,因为sort方法只有Array才具备 values.sort(); }} // 正确用法if (values instanceof Array) { value.sort();}使用null比较的代码,替换原则:如果值应为一个引用类型,使用instanceof操作符检查其构造函数如果值应为一个基本类型(值类型),使用typeof检查其类型如果是希望对象包含某个特点的方法名,则使用typeof操作符确保指定名字的方法存在于对象上// 值类型 (Number, String, Boolean)typeof value == ‘string’;// 引用类型 (Array, Object, Function)value instanceof Array;// 对象方法 (Object.property)typeof person.getName == ‘function’常量应用var CONSTANS = { INVALID_VALUES_MSG: “Invalid value!”, INVALID_VALUE_URL: “/erros/invalid.php”}CONSTANS.INVALID_VALUES_MSG // “Invalid value!“常量应用原则:重复值——多处地方引用的值 (CSS类名/后端返回的状态码)。用户界面字符串——显示给用户的字符串 (国际化, 替换为对应的语言包文件)URLs——公共地方存放所有的URL (测试API的URL/上线API的URL)任何可能会更改的值 (通常是环境/语言配置上的修改)redux/vuex的actionType判断的应用,也是常量应用常见的场景。好处就是引用时拼写错误会直接抛出变量引用错误,而直接用字符串值判断,则不会抛出错误,不利于调试。// redux-reducer.js文件中应用常量import { ADD_TODO_ITEM, DELETE_TODO_ITEM} from ‘./actionTypes’const defaultState = { inputValue: ‘’, list: []};export default (state = defaultState, action) => { let newState = JSON.parse(JSON.stringify(state)); switch (action.type) { case DELETE_TODO_ITEM: newState.list.splice(action.value, 1); break; case ADD_TODO_ITEM: if (newState.inputValue.trim().length) { newState.list.push(newState.inputValue); } newState.inputValue = ‘’; break; } return newState;}参考文档《JavaScript高级程序设计》作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。 ...

December 3, 2018 · 1 min · jiezi

读书笔记(01) - JSON - JavaScript高级程序设计

JSON与JavaScript对象JSON是一种表示结构化数据的存储格式,语法格式上与JavasScript对象有些类似。TIPS: 与JavaScript对象的格式区别不支持变量、函数或对象实例字符串,属性名必须使用双引号无需定义变量存储引用// JSON对象{ “name”: “KenTsang”, “age”: 27, “job”: “Developer”}// js对象(该对象将作在后续例子引用)let person = { name: ‘KenTsang’, age: 27, job: ‘Developer’}ES5定义了一个全局对象JSON,IE8+以上支持,该对象提供来stringify和parse两个方法用于JSON数据解析和序列化。stringify()stringify用于把JavaScript对象序列化JSON字符串,在序列化JavaScript对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined的任何属性也都会被跳过。JSON.stringify( value: Object, replace: Array | function(key,value) {}, space: number | string)该方法接受三个参数参数:接收传入的js对象参数:过滤器(数组/函数)参数:字符串缩进(数值/字符串)参数2 - 过滤器TIPS1: 过滤器是一个数组时,序列化结果只包含数组中列出的属性let result = JSON.stringify(person, [“name”, “job”]);// 输出结果// {“name”:“KenTsang”,“job”:“Developer”}TIPS2: 过滤器是一个函数时(替换函数)var jsonStr = JSON.stringify(Person, function(key, value){ if (key == ‘age’) { return ‘secret’; } else { return value; }})// 输出结果// {“name”:“KenTsang”,“age”:“secret”,“job”:“Developer”}如果替换函数返回的是undefined,则该属性不会被包含在序列化结果中。参数3 - 字符串缩进用于控制序列化结果中的缩进和空白符,输出序列结果带缩进格式,方便预览查看。实际应用开发不多。为数值时,表示每个级别缩进的空格数(最大10)为字符串时,则作为缩进字符(替换默认的空格,最大10个字符)let result = JSON.stringify(person, null, ‘–’);// 输出结果/{–“name”: “KenTsang”,–“age”: 27,–“job”: “Developer”}/toJSON()方法应对更复杂的一些需求,我们可以通过toJSON()对某些对象进行自定义序列化的需求。let person = { name: “KenTsang”, age: 27, job: ‘Developer’, toJSON: function() { return { “name”: “KT”, “age”: “2*”, “job”: “DP” } }};let result = JSON.stringify(person);// 输出结果// {“name”:“KT”,“age”:“2*”,“job”:“DP”}TIPS: 序列化顺序如果存着toJSON方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步的值。对第(2)步返回的每个值进行相应的序列化。如果提供了第三个参数,执行相应的格式化。– 摘自《JavaScript高级程序设计》–parse()parse用于把JSON字符串解析成JavaScript对象JSON.parse(text: string, reviver: function(key, value) {})该方法接受三个参数参数:接收传入的json字符串参数:还原函数还原函数返回undefined, 结果中删除相应的键返回其它值,则将值插入到结果中let Person = { name: “KenTsang”, age: 27, job: “Developer”, birth: new Date(1991, 3, 19)};var jsonStr = JSON.stringify(Person);var jsObj = JSON.parse(jsonStr, function(key, value) { if (key == ‘birth’) { return new Date(value); } else { return value); }});jsObj.birth.getFullYearh(); // 输出结果: 1991例子中通过还原函数,重新实例一个Date对象,所以可以用到getFullYear()方法。参考文档《JavaScript高级程序设计》作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。 ...

December 2, 2018 · 1 min · jiezi

你凭什么做好互联网

虽然这本书是写给创业者的,但是值得每个有追求的程序员读一读旁观他人审视自我尽早想明白自己以后做什么几点建议:平时上课学到的东西多思考一下,应用场景在哪里…多思考别人的产品尝试自己做个App或者网站开源、分享尝试自己运营一个微博或者微信公众号等考有用的证,通过率越低的证、价值越高找合适的企业实习简历怎么写感性描述不重要不要有错别字不要过渡包装自己态度端正简历的设计要用最简单的图形和文字不要照本宣科教科书具有一定的时限性,以及一定的理想主义的前置条件一个成功的人,一个失败的人,你去对比他们的成功和失败的原因,可能90%都是同一个含义的不同表达而已牵强附会、正确的废话文章特点:类似“成功的二十个要诀,失败的十五个原因”等,数字很大、内容很丰富的总结文个别媒体为了取悦用户拿小概率事件来吸引眼球年轻人进入职场最容易犯的两个错误:被各种厚黑学和无脑电视剧洗脑,认为企业都是要讲关系、背景,要谨小慎微被各种高大上的企业媒体宣传蒙蔽了。如什么弹性工作、自主时间、各种丰厚福利和成长机会等多看书多读书多度一些技术原理、基本理论的书关于商业、市场行业发展的书我们必须努力往前看,不能迷信于书本挑错的逻辑职场上所谓技术不好的问题的原因:年代久远,菜鸟的产品需求迭代的产物所谓正确的架构存在着你所不知道的坑技术演进中的印迹侧重点不同的考量问题资源紧缺的作品作为新人你可以做什么?1.尽可能更完整的了解系统2.从一个你最有把握,结构最简单的地方入手,优化它,一个一个解决3.轻易不要谈重构。架构的原则:适度灵活,简单至上。只是站出来喊这些垃圾那些垃圾,只能暴露你的浅薄和无知走出心里舒适区多参与分享,上台演讲,能够克服演讲恐惧,对未来的工作和个人发展绝对大有帮助多接触不同的人群,了解不同领域的信息力所能及地去尝试做一些不同的事情,并尽量做好适当学一点无聊没意义的东西进入和浏览一些不同类型的社区,观察和参与一些职场人士的讨论不要轻易给自己定性不断反思自己,适合什么,不适合什么,喜欢什么,不喜欢什么,要认清自己的内心看未来,看方向,要知道未来在哪里选择Offer时不要被描述所迷惑很多时候,你以为自己想做的,不过是因为很多人都觉得好有些领域可能几年前还很热门,但是现在已经显著过热了所有已有的经验都是有价值的,但是不代表说你不可以换别的试试任何时候,都不要让自己停步,必须保持学习,保持饥渴,没有好奇心,没有敏感度,就没有未来思维方式也是生产力谈谈信息不对称,互联网时代一个巨大的谎言:信息是公开透明的。很遗憾,这不是真的:一些非常有价值的信息资源并不在互联网流传,每个行业都有自己的小圈子互联网中一些非常有价值的信息往往也是混杂在大量垃圾无效信息里,甄别技术难度极高,而且碎片化严重提升信息甄别能力:阅读量和优质的阅读来源保持好奇心和敏感正确的逻辑及科学常识善于利用第三方数据平台求证商业分析的思维养成第一,看数据,将商业逻辑拆解,分解出显性指标,逐一优化,但仍需关注隐形指标第二,琢磨人性机会来自于担当能力与成长怎样提一个好问题?做好足够的准备和思考,再去问问题正确的搜索方法结构化思维,排除法,层进法提问敏感度,好奇心反推、逆证归纳与总结对问题的描述,对解决方案的效果评估,要有条理、有逻辑,不但要定性,而且要定量,要精准描述,完整记录。面临多个解决方案来处理的技术问题,要学会分辨评估每个解决方案的作用和效果,而不是说,反正把问题解决了就可以。分类是一种能力,特别是涉及多个维度的组合,非常考验对业务的理解能力,能够寻找正确的维度组合,数据和信息的价值才能最优化。从最原始的信息中寻找灵感和规律,这种看上去最没有技术含量的工作最能体现出你的思考能力。培养新人和锻炼新人,对于非重要和非紧急的工作,尽量给他们足够自由发挥的空间。取舍之道在互联网时代,时间成本是最大的成本,所以,我们要以工期来反推设计,剪裁需求。技术人员应该明白应用场景的边界在哪里,有针对性地取舍,这样技术方案就可以变的简单,研发陈本就会降低。从用户层面,不要试图讨好所有人,要明确核心用户群体的诉求,有所取舍,让一部分人惊喜,另一部分人离开,比平庸的四处讨巧的产品可能更好。分享即学习分享、表达能看的境界:让别人完整清楚地明白你所表达的真实意图和内容。让别人相信你所表达的内容的真实性。让别人受你的感染,拥护支持你的主张。针对第一个境界的建议:准备充分,提前默演明确目标、有的放矢背景铺垫、换位思考适度进补、不要贪求切记夸夸其谈产品和技术沟通的一些建议第一要旨:产品人员在提出需求时,应该明确告诉开发人员,其需求的目标是什么在符合第一要旨的前提下,开发人员应该能参与需求的讨论研发人员的参与意识强,对产品的热爱度和积极性会提高加深丢需求目标的理解,减少开发过程中因理解歧义做无用功或不符合需求的状况有可能提供目标一致,且实现成本更低的方案第二要旨:产品人员应该给出所有功能需求的流程图和结构图第三要旨:具体视图设计的三要素界面元素数据逻辑操作逻辑

October 7, 2018 · 1 min · jiezi

极客时间专栏陈皓《左耳听风》笔记二

专栏《高效学习系列》精华笔记主动学习与被动学习你听别人讲,或是自己看书,或是让别人演示给你,这些都不能让你真正获得学习能力,因为你是在被别人灌输,在听别人说。只有你开始自己思考,开始自己总结和归纳,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力。学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,你只是在机械地重复某件事,而不会有质的成长的。深度学习十分重要应该怎样进行深度学习呢?下面几点是关键。高质量的信息源和第一手的知识。把知识连成地图,将自己的理解反述出来。不断地反思和思辨,与不同年龄段的人讨论。举一反三,并践行之,把知识转换成技能。换言之,学习有三个步骤知识采集。信息源是非常重要的,获取信息源头、破解表面信息的内在本质、多方数据印证,是这个步骤的关键。知识缝合。所谓缝合就是把信息组织起来,成为结构体的知识。这里,连接记忆,逻辑推理,知识梳理是很重要的三部分。技能转换。通过举一反三、实践和练习,以及传授教导,把知识转化成自己的技能。这种技能可以让你进入更高的阶层。我觉得这是任何人都是可以做到的,就是看你想不想做了。学习是为了找到方法和原理学习不仅仅是为了找到答案,而更是为了找到方法。只有掌握解题的思路和方法,你才算得上拥有解决问题的能力。学习不仅仅是为了知道,而更是为了思考和理解。在学习的过程中,我们不是为了知道某个事的表面是什么,而是要通过表象去探索其内在的本质和原理。在学习的过程中,我们要不断地问自己,这个技术出现的初衷是什么?是要解决什么样的问题?为什么那个问题要用这种方法解?为什么不能用别的方法解?为什么不能简单一些?……拥有正确的学习观念:学习不仅仅是为了找到答案,而更是为了找到方法;学习不仅仅是为了知道,而更是为了思考和理解;学习不仅仅是为了开拓眼界,而更是为了找到自己的未知,为了了解自己;学习不仅仅是为了成长,而更是为了改变自己,改变自己的思考方式,改变自己的思维方式,改变自己与生俱来的那些垃圾和低效的算法。端正的学习态度和正确的学习观念,是高效学习的第一步,拥有这两者一定可以让你事半功倍。挑选知识和信息源如果你觉得用百度搜中文关键词就可以找到自己想要的知识,那么你一定远远落后于这个时代了。如果你用 Google 英文关键词可以找到自己想要的知识,那么你算是能跟得上这个时代。如果你能在社区里跟社区里的大牛交流得到答案,那么你算是领先于这个时代了。你的信息源要有下面几个特质。应该是第一手资料,不是被别人理解过、消化过的二手资料。尤其对于知识性的东西来说,更是这样。应该是原汁原味的,不应该是被添油加醋的。应该是有佐证、有数据、有引用的,或是有权威人士或大公司生产系统背书的资料。应该是被时间和实践检验过的,或是小心求证过的,不是拍脑袋野路子或是道听途说出来的资料。应该是加入了一些自己的经验和思考,可以引发人深思的,是所谓信息的密集很大的文章。注重基础和原理我说过,很多人并不是学得不够快,而他们的基础真的不行。基础不行,会影响你对事物的理解,甚至会让你不能理解为什么是这样。当你对事物的出现有不理解的东西时,通常来说,是因为你的基础知识没有跟上。使用知识图画知识图的方式可以让你从一个技术最重要最主干的地方出发开始遍历所有的技术细节,也就是画地图的方式。如果你不想在知识的海洋中迷路,你需要有一份地图,所以,学习并不是为了要记忆那些知识点,而是为了要找到一个知识的地图,你在这个地图上能通过关键路径找到你想要的答案。系统地学习在学习某个技术的时候,可以使用一个学习模板。只有把这个学习模板中的内容都填实了,我才罢休。这个模板如下。这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题。这个问题非常关键,也就是说,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念。这个技术的优势和劣势分别是什么,或者说,这个技术的 trade-off 是什么。任何技术都有其好坏,在解决一个问题的时候,也会带来新的问题。另外,一般来说,任何设计都有 trade-off(要什么和不要什么),所以,你要清楚这个技术的优势和劣势,以及带来的挑战。这个技术适用的场景。任何技术都有其适用的场景,离开了这个场景,这个技术可能会有很多槽点,所以学习技术不但要知道这个技术是什么,还要知道其适用的场景。没有任何一个技术是普适的。注意,所谓场景一般分别两个,一个是业务场景,一个是技术场景。技术的组成部分和关键点。这是技术的核心思想和核心组件了,也是这个技术的灵魂所在了。学习技术的核心部分是快速掌握的关键。技术的底层原理和关键实现。任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。可以参看我在 CoolShell 上写的 Docker 底层技术那一系列文章。已有的实现和它之间的对比。一般来说,任何一个技术都会有不同的实现,不同的实现都会有不同的侧重。学习不同的实现,可以让你得到不同的想法和思路,对于开阔思维,深入细节是非常重要的。基本上来说,如果你按照我上面所提的这 6 大点来学习一门技术,你一定会学习到技术的精髓,而且学习的高度在一开始就超过很多人了。如果你能这样坚持 2-3 年,我相信你一定会在某个领域成为炙手可热的佼佼者。举一反三我认为,人与人最大的差别就是举一反三的能力。那些聪明的或者是有经验的人举一反三起来真是太令人惊叹。我觉得一个人的举一反三能力,可以分解成如下三种基本能力。联想能力。这种能力的锻炼需要你平时就在不停地思考同一个事物的不同的用法,或是联想与之有关的别的事物。对于软件开发和技术学习也一样。抽象能力。抽象能力是举一反三的基本技能。平时你解决问题的时候,如果你能对这个问题进行抽象,你就可以获得更多的表现形式。抽象能力需要找到解决问题的通用模型,比如数学就是对现实世界的一种抽象。只要我们能把现实世界的各种问题建立成数据模型(如,建立各种维度的向量),我们就可以用数学来求解,这也是机器学习的本质。自省能力。所谓自省能力就是自己找自己的难看。当你得到一个解的时候,要站在自己的对立面来找这个解的漏洞。有点像左右手互博。这种自己和自己辩论的能力又叫思辨能力。将自己分裂成正反方,左右方,甚至多方,站在不同的立场上来和自己辩论,从而做到不漏过一个 case,从而获得完整全面的问题分析能力。在这方面,我对自己的训练如下。对于一个场景,制造出各种不同的问题或难题。对于一个问题,努力寻找尽可能多的解,并比较这些解的优劣。对于一个解,努力寻找各种不同的测试案例,以图让其健壮。老实说,要获得这三种能力,除了你要很喜欢思考和找其它人来辩论或讨论以外,还要看你自己是否真的善于思考,是否有好奇心,是否喜欢打破沙锅问到底,是否喜欢关注细节,做事是否认真,是否严谨……归纳和总结对自己的知识进行总结和归纳是提高学习能力的一个非常重要的手段。这是把一个复杂问题用简单的语言来描述的能力。我们把学到的东西用自己的语言和理解重新组织并表达出来,本质上是对信息进行消化和再加工的过程,这个过程可能会有信息损失,但也可能会有新信息加入,本质上是信息重构的过程。我们积累的知识越多,在知识间进行联系和区辨的能力就越强,对知识进行总结和归纳也就越轻松。而想要提高总结归纳的能力,首先要多阅读,多积累素材,扩大自己的知识面,多和别人讨论,多思辨,从而见多识广。我们需要注意的是,如果只学了部分知识或者还没有学透,就开始对知识进行总结归纳,那么总结归纳出来的知识结构也只能是混乱和幼稚的。因此,学习的开始阶段,可以不急于总结归纳,不急于下判断,做结论,而应该保留部分知识的不确定性,保持对知识的开放状态。当对整个知识的理解更深入,自己站的位置更高以后,总结和归纳才会更有条理。总结归纳更多是在复习中对知识的回顾和重组,而不是一边学习一边就总结归纳。做总结归纳的方法:把你看到和学习到的信息,归整好,排列好,关联好,总之把信息碎片给结构化掉,然后在结构化的信息中,找到规律,找到相通之处,找到共同之处,进行简化、归纳和总结,最终形成一种套路,一种模式,一种通用方法。要训练自己这方面的能力,你需要多看一些经典的方法论图书,看看别人是怎样总结和归纳知识的。你可以在一开始模仿并把自己的理解的知识给写出来,写博客会是一种很好的方式。另外一种更好的方式是讲一遍给别人听。总之,你需要把你总结归纳的知识公开出来,给别人看,接受别人的批评和反馈,这样你才能成长得更快。其实,我也在锻炼这样的能力。读文档还是读代码书和文档是人对人说的话,代码是人对机器说的话(注:代码中有一部份逻辑是控制流程的逻辑,不是业务逻辑)。所以,如果你想知道人为什么要这么搞,那么应该去看书(像 Effective C++、Code Complete、Design Pattern、Thinking in Java 等),看文档。如果你要知道让机器干了什么?那你应该看代码!(就像 Linus 去看 zlib 的代码来找性能问题。)因此,我认为都比较重要,关键看你的目的是什么了。如果你想了解一种思想,一种方法,一种原理,一种思路,一种经验,恐怕,读书和读文档会更有效率一些,因为其中会有作者的思路描述。像 Effective C++ 之类的书,里面有很多对不同用法和设计的推敲,TCP/IP 详解里面也会有对 TCP 算法好坏的比较……这些思维方式能让你对技术的把握力更强,而光看代码很难达到这种级别。(现在你知道什么样的书是好书了吧 ;-))如果你想了解的就是具体细节,比如某协程的实现,某个模块的性能,某个算法的实现,那么你还是要去读代码的,因为代码中会有更具体的处理(尤其是对于一些 edge case 或是代码技巧方面的内容)。从学习的过程中,我们来分析一下看代码和看书这两个活动。人对新事物的学习过程基本都是从“感性认识”到“理性认识”的。如果你是个新手,那应该多读代码,多动手写代码,因为你需要的是“感性认识”,这个时候“理性认识”你体会不到。一是因为,你没有切身的感受,即便告诉你 Why 你也体会不到。另一方面,这个阶段,你要的不是做漂亮,而是做出来。所以,在新手阶段,你会喜欢 GitHub 这样的东西。如果你是个老手,你有多年的“感性认识”了,那么你的成长需要更多的“理性认识”。因为这个阶段,一方面,你会不满足于做出来,你会想去做更牛更漂亮的东西;另一方面,你知道的越多,你的问题也越多,你迫切地需要知道 Why!这时,你需要大量地找牛人交流(读牛人的书,是一种特殊的人与人的交流),所以,这个阶段,你会喜欢读好的书和文章。然而,对于计算机行业这个技术创新能力超强、技术种类繁多的行业来说,我们每个人都既是新手,也是老手。如何阅读源代码在阅读代码之前,我建议你需要有下面的这些前提再去阅读代码,这样你读起代码来会很顺畅。基础知识。相关的语言和基础技术的知识。软件功能。你先要知道这个软件完成的是什么样的功能,有哪些特性,哪些配置项。你先要读一遍用户手册,然后让软件跑起来,自己先用一下感受一下。相关文档。读一下相关的内部文档,Readme 也好,Release Notes 也好,Design 也好,Wiki 也好,这些文档可以让你明白整个软件的方方面面。如果你的软件没有文档,那么,你只能指望这个软件的原作者还在,而且他还乐于交流。代码的组织结构。也就是代码目录中每个目录是什么样的功能,每个文档是干什么的。如果你要读的程序是在某种标准的框架下组织的,比如:Java 的 Spring 框架,那么恭喜你,这些代码不难读了。阅读代码的方法如下。一般采用自顶向下,从总体到细节的“剥洋葱皮”的读法。画图是必要的,程序流程图,调用时序图,模块组织图……代码逻辑归一下类,排除杂音,主要逻辑才会更清楚。debug 跟踪一下代码是了解代码在执行中发生了什么的最好方式。对了,阅读代码你需要一个很好的 IDE。我记得以前读 C 和 C++ 代码时,有一个叫 source insight 的工具就大大提高了我的代码阅读效率。说白了就是可以查看代码间相互的调用 reference 的工具,这方面 Visual Studio 做得是非常好的。如何面对枯燥的知识如果你发现有些知识太过于枯燥,那么可以通过下面的方法解决。这个知识对于你来说来太高级了,你可能不知道能用在什么地方。人的认知是从感性认识向理性认识转化的,所以,你可能要先去找一下应用场景,学点更实用的,再回来学理论。学习需要有反馈,有成就感,带着相关问题去学习会更好。当然,找到牛人来给你讲解,也是一个很不错的手段。如何面对大量知识我给你的建议是,一点一点学,一口一口吃。你可以使用我前面说过的那些方法,注重基础,画知识图,多问为什么,多动手,然后坚持住,哪怕你每周就学一个知识点,你一年也可以学到 50 个知识点。只要你在进步,总有一天可以把这些知识学到手的。当然,你的目的不是学完这些知识,因为学无止境,你永远也学不完,所以你在学习时,一定不要学在表面上,一定要学到本质,学到原理上,那些东西是不容易变的,也是经得住时间考验的。把学习当成投资,这是这个世界上回报最好的投资。带着问题去学习,带着要解决的东西去学习,带着挑战去学习,于是每当你解决了一个问题,做了一个功能,完成了一个挑战,你就会感到兴奋和有成就感。这样,你也就找到了源源不断的学习驱动力。把你学习的心得、过程、笔记、代码分享出来,找到和你一同学习的人,因为一个人长跑很辛苦,有人同行就会好很多,就算没有人同行,你的读者,你的观众也会为你鼓励叫好,这些也是让你持续前行的动力。其它几个实用的技巧:用不同的方式来学习同一个东西。比如:通过看书,听课,创建脑图,写博客,讲课,解决实际问题,等等。不要被打断。被打断简直就是学习的天敌,所以,你在学习的时候,最好把手机设置成勿扰模式放在一边,然后把电脑上的所有通知也关掉,最好到一个别人找不到你的地方。总结压缩信息。当你获得太多的信息时,你需要有一个“压缩算法”。我常用的压缩算法是只关心关键点,所以,你需要使用表格、图示、笔记或者脑图来帮助你压缩信息。把未知关联到已知。把你新学的知识点关联到已知的事物上来。比如,你在学习 Go 语言,你就把一些知识关联到自己已经学过的语言上比如 C 和 Java。通过类比,你会学得更扎实,也会思考得更多。用教的方式来学习。你想想,如果你过几天要在公开场合对很多人讲一个技术,那么这个压力会让你学得更好。因为要教给别人,所以,这么高的标准需要你不但要把自己已掌握的东西学好,还要把周边的也一并学了,才可能做到百问不倒。你才敢去教别人,不是么?(试试教 6 岁的孩子编程,如果你掌握了这种技能,那么你一定是把知识吃得非常透彻了。)学以致用。把学到的东西用起来,没有什么比用起来能让你的知识更巩固的了。在实践中,你才会有更为真实的体会,你才会遇到非常细节和非常具体的问题,这些都会让你重新思考,或深化学习。不要记忆。聪明的人不会记忆知识的,他们会找方法,那些可以推导出知识或答案的方法。这也是为什么外国人特别喜欢方法论。多犯错误。犯错会让你学得到更多,通过错误总结教训,你会比没有犯过错的人体会得更深。但是千万不要犯低级错误,也不要同一个错误犯两次。推荐阅读:极客时间专栏陈皓《左耳听风》笔记一你凭什么做好互联网极客时间专栏《朱赟的技术管理课》的学习笔记东大教授教我的学习法谈职业生涯——读《程序员的自我修养》 ...

October 7, 2018 · 1 min · jiezi