├── .gitignore ├── .gometalinter.json ├── LICENSE ├── Makefile ├── README.md ├── docs ├── career │ ├── OKR组织敏捷目标和绩效管理 │ │ ├── OKR制定模板.png │ │ ├── OKR季中盘点模板.png │ │ ├── OKR季末闭关评分.png │ │ ├── OKR组织敏捷目标和绩效管理.md │ │ ├── OKR要点.png │ │ ├── 层级OKR.png │ │ ├── 李彦宏OKR.png │ │ └── 组织目标管理阶段.png │ ├── give_and_take.md │ ├── index-1.html │ ├── the_effective_engineer.md │ ├── 光速成长.md │ ├── 向上管理.md │ ├── 大厂晋升指南 │ │ ├── OKR.png │ │ ├── p7要求.png │ │ ├── wbs分解.png │ │ ├── 三段分解法.png │ │ ├── 做事方法.png │ │ ├── 大厂晋升指南.md │ │ ├── 漏斗模型.png │ │ ├── 答辩why.png │ │ ├── 管理.png │ │ └── 金字塔原理.png │ ├── 成功动机与目标.md │ ├── 沟通的方法 │ │ ├── 四种沟通风格.png │ │ └── 沟通的方法.md │ ├── 番茄工作法.md │ ├── 知乎职人觉醒.md │ ├── 知识变现.md │ ├── 程序员的自我修养.md │ ├── 聆听沟通学.md │ ├── 职场动物进化手册.md │ ├── 职场解释系.md │ ├── 请停止无效努力.md │ ├── 软技能.md │ ├── 高效15法则.md │ └── 高效清单工作法.md ├── code │ ├── codelife_不止代码.md │ ├── work_with_legacy_code.md │ ├── 代码大全.md │ ├── 代码的未来.md │ ├── 基本功.md │ ├── 敏捷技能修炼.md │ ├── 程序员应该知道的97件事.md │ ├── 编写可读代码的艺术.md │ ├── 编程匠艺.md │ └── 领域驱动设计.md ├── database │ ├── MySQL是怎样运行的从根上理解MySQL │ │ ├── 1-6Mysql服务器处理客户端请求.png │ │ ├── MySQL是怎样运行的从根上理解MySQL.md │ │ └── 隔离级别.png │ ├── Mysql技术内幕InnoDB存储引擎.md │ ├── getting_started_with_impala.md │ ├── mysql必知必会.md │ ├── mysql性能调优与架构实践.md │ ├── redis实战.md │ ├── redis深度历险核心原理和应用实践 │ │ ├── book.md │ │ ├── intset.png │ │ ├── listpack.png │ │ ├── quicklist.png │ │ ├── quicklist1.png │ │ ├── radix-tree.png │ │ ├── skiplist.png │ │ └── ziplist.png │ ├── redis设计与实现.md │ ├── 七周七数据库.md │ ├── 深入浅出mysql.md │ └── 高性能mysql第三版.md ├── debug │ ├── Effective_Debugging.md │ └── 软件调试修炼之道 │ │ └── book.md ├── devops │ ├── 玩转Kubernets-CloudMan.md │ └── 第一本docker书.md ├── frontend │ ├── CSS_The_Missing_Manual.md │ ├── es6标准入门.md │ ├── jquery_pocket_reference.md │ ├── reactjs_小书.md │ └── 深入理解bootstrap.md ├── golang │ ├── 1_the_go_programming_lauguage.md │ ├── 2_the_go_programming_lauguage.md │ ├── 3_the_go_programming_lauguage.md │ ├── advanced-go-programming-book │ │ ├── advanced-go-programming.md │ │ ├── grpc.png │ │ ├── init_order.png │ │ └── snowflake.png │ ├── build-web-application-with-golang.md │ ├── building-microservices-with-go │ │ ├── async.png │ │ ├── book.md │ │ ├── circuit.png │ │ ├── microservice.png │ │ ├── pull.png │ │ └── push.png │ ├── building_restful_web_services_with_go │ │ ├── book.md │ │ ├── flag.png │ │ ├── gorestful_demo │ │ │ ├── dbutils │ │ │ │ ├── init-tables.go │ │ │ │ └── models.go │ │ │ ├── railAPI │ │ │ │ └── main.go │ │ │ ├── railAPIGin │ │ │ │ └── main.go │ │ │ └── railapi.db │ │ ├── jwt.png │ │ ├── oauth2.png │ │ └── urlshortener │ │ │ ├── main.go │ │ │ ├── main_test.go │ │ │ ├── models │ │ │ └── models.go │ │ │ └── utils │ │ │ └── encodeutils.go │ ├── concurrency-in-go │ │ ├── channel1.png │ │ ├── channel2.png │ │ ├── concurrency_in_go.md │ │ ├── decision_tree.png │ │ └── join_point.png │ ├── go-build-web-applications │ │ ├── module1 │ │ │ └── go-build-web-applications │ │ │ │ ├── go-build-web-applications.md │ │ │ │ ├── main.go │ │ │ │ ├── templates │ │ │ │ ├── blog.html │ │ │ │ └── index.html │ │ │ │ └── test.py │ │ └── module2 │ │ │ └── main.go │ ├── go101 │ │ ├── book.md │ │ └── channel.png │ ├── go_in_action(go语言实战).md │ ├── go语言学习笔记源码剖析.md │ ├── go语言学习笔记语言详解.md │ ├── go语言编程.md │ ├── go语言编程之旅 │ │ ├── go语言编程之旅.md │ │ ├── tcpchat │ │ │ ├── client.go │ │ │ └── server.go │ │ └── websocket │ │ │ ├── client.go │ │ │ └── server.go │ ├── go语言高并发与微服务实战.md │ ├── main_init.png │ ├── network-programming-with-go │ │ └── book.md │ └── the_way_to_go │ │ └── book.md ├── index.md ├── java │ └── java-basic-introduction.md ├── lecture │ ├── Gopher │ │ ├── Concurrency_Patterns_in_Go.md │ │ ├── Go_Error │ │ │ ├── codes.png │ │ │ ├── contextapi.png │ │ │ ├── contextbest.png │ │ │ ├── error.png │ │ │ └── go业务基础库之Error&Context.md │ │ ├── Go同步和并发设计模式 │ │ │ ├── bug.png │ │ │ ├── channel.png │ │ │ ├── happen-before.png │ │ │ ├── mutex_happen.png │ │ │ ├── note.md │ │ │ └── waitgroup_happen.png │ │ ├── Go在花椒直播业务场景下的微服务应用 │ │ │ └── note.md │ │ ├── 哔哩哔哩的go微服务实战 │ │ │ ├── note.md │ │ │ ├── 业务.png │ │ │ ├── 容错.png │ │ │ ├── 超时.png │ │ │ ├── 降级.png │ │ │ ├── 限流.png │ │ │ └── 隔离.png │ │ └── 基于Go语言的大规模微服务框架设计 │ │ │ └── note.md │ ├── MIT6.824分布式系统工程 │ │ ├── codes │ │ │ ├── README.md │ │ │ └── lab1 │ │ │ │ └── lab1.md │ │ ├── images │ │ │ ├── 3_gfs.png │ │ │ ├── 4-0.jpeg │ │ │ ├── 4-1.jpeg │ │ │ └── 6_7_raft.png │ │ ├── paper │ │ │ ├── README.md │ │ │ └── The_Google_File_System.pdf │ │ ├── readme.md │ │ └── tutorial.md │ ├── readme.md │ ├── 技术演讲 │ │ ├── 左耳朵耗子-我这技术二十年.md │ │ └── 技术答辩.md │ └── 网课 │ │ ├── 300分钟吃透分布式缓存 │ │ ├── 300分钟吃透分布式缓存.md │ │ ├── feed.png │ │ ├── redis_dict.png │ │ ├── redis数据结构.png │ │ ├── 微博分布式redis.png │ │ ├── 微博多区数据一致性案例.png │ │ ├── 海量计数服务架构.png │ │ └── 缓存架构设计考量点.png │ │ ├── DDD实战课 │ │ ├── DDD与中台.png │ │ ├── DDD分层架构.png │ │ ├── DDD实战课.md │ │ ├── 服务的组合和封装.png │ │ ├── 聚合设计.png │ │ ├── 通用语言设计.jpg │ │ └── 领域.png │ │ ├── java并发编程78讲 │ │ ├── cpu_cache.png │ │ ├── java并发编程78讲.md │ │ ├── 主内存工作内存.png │ │ ├── 线程池参数.png │ │ └── 线程状态.png │ │ ├── linux性能优化 │ │ ├── IO性能指标.png │ │ ├── IO排查.png │ │ ├── IO根据工具查指标.png │ │ ├── IO根据指标找工具.png │ │ ├── cpu指标原理.png │ │ ├── linux性能优化.md │ │ ├── tcpdump过滤表达式类.png │ │ ├── tcpdump选项类.png │ │ ├── 内存分析过程.png │ │ ├── 内存性能指标.png │ │ ├── 内存根据工具查指标.png │ │ ├── 内存根据指标找工具.png │ │ ├── 根据工具查指标.png │ │ └── 根据指标找工具.png │ │ ├── 中间件核心技术与实战 │ │ ├── rocketmq顺序消费优化.jpg │ │ ├── 中间件核心技术与实战.md │ │ ├── 分布式中间件.png │ │ ├── 数据隔离机制.jpg │ │ └── 消息中间件对比.png │ │ ├── 分布式技术原理与实战45讲 │ │ ├── 分布式技术原理与实战.md │ │ └── 系统监控.png │ │ ├── 李智慧高并发架构实战课 │ │ └── 高并发架构实战课.md │ │ ├── 架构设计面试精讲 │ │ ├── SLA.png │ │ ├── 应急处理.png │ │ ├── 断路器.png │ │ └── 架构设计面试精讲.md │ │ ├── 深入理解sentinel │ │ └── 深入理解sentinel.md │ │ └── 高并发系统设计40问 │ │ ├── 监控指标.png │ │ ├── 硬件延迟.png │ │ ├── 系统可用性.png │ │ ├── 阿里系统分层规约.png │ │ └── 高并发系统设计40问.md ├── network │ ├── beejs_guide_to_network_programming.md │ └── tcp_ip详解卷一 │ │ ├── arp.jpeg │ │ └── tcp_ip详解卷一.md ├── psychology │ ├── 一切都是童年的错吗.md │ ├── 亲密关系.md │ ├── 反脆弱.md │ ├── 情商.md │ ├── 拖延心理学.md │ ├── 改变心理学的40项研究.md │ ├── 活出最乐观的自己.md │ ├── 积极心理学.md │ ├── 自控力-和压力做朋友.md │ ├── 自控力-实操篇.md │ ├── 自控力.md │ ├── 超越自卑.md │ └── 逆商.md ├── python │ ├── Python_Microservices_Development.md │ ├── clean_python.md │ ├── fluent_python.md │ ├── high_performance_python.md │ ├── python_网络编程.md │ └── python网络编程_linux.md ├── startup │ ├── hello_startup.md │ ├── 斯坦福公开课-如何创业.md │ ├── 精益创业.md │ └── 运营其实很简单.md ├── unix_linux │ ├── Linux高性能服务器编程 │ │ ├── Linux高性能服务器编程.md │ │ ├── epoll_proactor.png │ │ ├── half-sync_half-reactive.png │ │ ├── io_diff.png │ │ ├── io_library.png │ │ ├── leader_followers.png │ │ ├── pipe.png │ │ ├── proactor.png │ │ ├── process_pool.png │ │ ├── pthread_jon_retval.png │ │ ├── reactor.png │ │ ├── time_order.png │ │ ├── time_wheel.png │ │ ├── timeo.png │ │ └── xinetd.png │ ├── unix编程艺术.md │ └── unix网络编程卷一.md ├── 互联网 │ ├── 我的互联网方法论-周鸿祎.md │ └── 用户思维.md ├── 健康 │ ├── 程序员健康指南.md │ ├── 隐性疲劳.txt │ └── 鼻炎.md ├── 写作 │ └── 刷屏文案写作技巧.md ├── 分布式 │ ├── Kafka权威指南.md │ ├── 分布式框架原理与应用.md │ ├── 大规模分布式存储系统.md │ ├── 深入分布式缓存从原理到实践.md │ ├── 深入理解Kafka核心设计与实践原理 │ │ ├── 1-1kafka体系结构.png │ │ ├── 2-1生产者客户端的整体架构.png │ │ ├── 5-1日志关系.png │ │ ├── 5-22磁盘IO流程.png │ │ ├── 5-23非零拷贝技术.png │ │ ├── 5-24零拷贝技术.png │ │ ├── 5-3日志v0版本.png │ │ ├── 5-4日志v1版本.png │ │ ├── 5-7消息v2.png │ │ ├── 6-7时间轮.png │ │ ├── 6-8多层时间轮.png │ │ ├── 消费者与消费组.png │ │ └── 深入理解Kafka核心设计与实践原理.md │ └── 超大流量分布式系统架构解决方案.md ├── 区块链 │ └── 区块链技术指南(blockchain_guide).md ├── 开发工具 │ ├── Mastering_vim.md │ ├── learn_vim_the_hard_way.md │ ├── mastering_vim_quickly.md │ ├── practical_vim │ │ ├── practical_vim.md │ │ └── t.py │ ├── pro_git.md │ ├── vim8文本处理实战 │ │ ├── vim-commenter │ │ │ ├── autoload │ │ │ │ └── commenter.vim │ │ │ ├── ftplugin │ │ │ │ └── python.vim │ │ │ └── plugin │ │ │ │ └── commenter.vim │ │ └── vim8文本处理实战.md │ └── wizardsusevim.md ├── 思维认知 │ ├── 专注力_化繁为简的惊人力量.md │ ├── 为什么精英这样用脑不会累.md │ ├── 刻意练习.md │ ├── 如何想到又做到.md │ ├── 如何高效记忆.md │ ├── 学习之道.md │ ├── 学习力.md │ ├── 批判性思维工具.md │ ├── 科学学习.md │ ├── 程序员的思维修炼(开发认知潜能的九堂课).md │ ├── 认知天性.md │ ├── 超效率手册.md │ └── 高效程序员的45个习惯.md ├── 搜索引擎 │ └── Elasticsearch实战 │ │ ├── book.md │ │ └── 查询选择.png ├── 源码阅读_sourcecode │ ├── README.md │ ├── c │ │ ├── libev.md │ │ └── unpv13e_unix网络编程.md │ ├── go │ │ ├── builtin │ │ │ ├── container │ │ │ │ └── ring.go │ │ │ ├── context.go │ │ │ └── ratelimit │ │ │ │ ├── .golangci.yml │ │ │ │ ├── internal │ │ │ │ └── clock │ │ │ │ │ ├── clock.go │ │ │ │ │ ├── interface.go │ │ │ │ │ ├── real.go │ │ │ │ │ └── timers.go │ │ │ │ ├── leaky_bucket.go │ │ │ │ ├── main.go │ │ │ │ ├── ratelimit.go │ │ │ │ ├── ratelimit_test.go │ │ │ │ ├── readme.md │ │ │ │ └── throttle.go │ │ ├── concurrent-map │ │ │ └── main.go │ │ ├── fastid │ │ │ └── main.go │ │ ├── fatih_pool │ │ │ └── main.go │ │ ├── future │ │ │ └── main.go │ │ ├── go-cache │ │ │ └── main.go │ │ ├── graphite-golang │ │ │ ├── README.md │ │ │ ├── example │ │ │ │ └── main.go │ │ │ ├── graphite.go │ │ │ └── metric.go │ │ ├── hystrix-go │ │ │ ├── hystrix-go.png │ │ │ ├── hystrix │ │ │ │ ├── circuit.go │ │ │ │ ├── hystrix.go │ │ │ │ ├── hystrix_test.go │ │ │ │ ├── logger.go │ │ │ │ ├── metric_collector │ │ │ │ │ ├── default_metric_collector.go │ │ │ │ │ └── metric_collector.go │ │ │ │ ├── metrics.go │ │ │ │ ├── pool.go │ │ │ │ ├── pool_metrics.go │ │ │ │ ├── rolling │ │ │ │ │ ├── rolling.go │ │ │ │ │ └── rolling_timing.go │ │ │ │ └── settings.go │ │ │ └── readme.md │ │ ├── net_http │ │ │ └── readme.md │ │ ├── patrickmn_gocache │ │ │ ├── main.go │ │ │ └── read.md │ │ ├── rafaeldias_async │ │ │ ├── main.go │ │ │ └── read.md │ │ ├── redigo_read │ │ │ ├── commmandinfo.go │ │ │ └── main.go │ │ ├── retry-go │ │ │ ├── README.md │ │ │ ├── main.go │ │ │ └── options.go │ │ └── statsd │ │ │ ├── README.md │ │ │ ├── conn.go │ │ │ ├── example │ │ │ └── main.go │ │ │ ├── options.go │ │ │ └── statsd.go │ └── python │ │ ├── PyMySQL_read.py │ │ ├── collections_read.py │ │ ├── pystatsd_read.py │ │ ├── redispy_read.py │ │ └── wsgiref_read.py ├── 系统设计system_design │ └── Grokking_System_Design │ │ ├── Grokking_System_Design.md │ │ ├── crawler_system.png │ │ ├── instagram_db.png │ │ ├── newsfeed_system.png │ │ ├── ticket_book.png │ │ └── twitter_schema.png ├── 网站架构微服务 │ ├── 2_design_data_instensive_application.md │ ├── 3_design_data_instensive_application.md │ ├── Prometheus监控实战.md │ ├── clean_architecture.md │ ├── design_data_instensive_application.md │ ├── microservices_patterns_微服务架构设计模式 │ │ ├── book.md │ │ ├── ddd.png │ │ └── 定义系统操作.png │ ├── web_scalavility_for_startup_engineers.md │ ├── 从0开始学架构 │ │ ├── CAP.png │ │ └── 从0开始学架构.md │ ├── 微服务实战.md │ ├── 微服务设计.md │ ├── 架构图.md │ └── 架构学习.md ├── 软件工程_项目管理 │ ├── 人月神话.md │ ├── 代码之殇.md │ ├── 修改软件的艺术.md │ ├── 构建之法_现代软件工程.md │ ├── 解析极限编程-拥抱变化.md │ └── 项目管理修炼之道.md ├── 运维 │ ├── linux集群和自动化运维.md │ └── python自动化运维.md └── 金融理财 │ ├── 一小时漫画资产配置实战法.md │ ├── 价值投资训练营.md │ ├── 基金定投-让财富滚雪球.md │ ├── 定投十年.md │ ├── 指数基金投资日志.md │ ├── 程序员的个人财富课.md │ ├── 穷查理宝典.md │ ├── 聪明的定投.md │ ├── 资产配置攻略构建长效的投资体系.md │ ├── 迈出投资第一步 │ ├── 资产配置.png │ └── 迈出投资第一步.md │ └── 雪球三分法靠科学体系取得长期胜利.md ├── mkdocs.yml ├── requirements.txt └── tolearn.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .tmp 3 | 4 | # Git 5 | *.orig 6 | *.BACKUP.* 7 | *.BASE.* 8 | *.LOCAL.* 9 | *.REMOTE.* 10 | 11 | # media 12 | *.mp4 13 | *.mov 14 | *.avi 15 | 16 | # python 17 | __pycache__/ 18 | *.py[cod] 19 | *$py.class 20 | .python-version 21 | 22 | # vim 23 | .vimrc 24 | .lvimrc 25 | .*.sw[a-z] 26 | *.un~ 27 | Session.vim 28 | 29 | # cache 30 | .cache 31 | .tmp 32 | .idea 33 | 34 | # mkdocs 35 | site/ 36 | 37 | # vscode 38 | .vscode/ 39 | 40 | # pytest 41 | .pytest_cache/ 42 | .tern-port 43 | -------------------------------------------------------------------------------- /.gometalinter.json: -------------------------------------------------------------------------------- 1 | { 2 | "Exclude": ["exported \\w+ (\\S*['.]*)([a-zA-Z'.*]*) should have comment or be unexported"] 3 | } 4 | 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 PegasusWang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | push: 2 | git push origin master 3 | 4 | serve: 5 | mkdocs serve 6 | 7 | publish: 8 | # if conflict, delete gh-pages branch and site dir 9 | git push origin master 10 | mkdocs gh-deploy --ignore-version 11 | 12 | clean: 13 | rm -rf site 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PegasusWang 的读书杂记 2 | 3 | > Stay Hungry Stay Foolish. 4 | 5 | 看了就忘,还是简单记一点吧。多读几遍计算机领域最经典的好书,比泛泛地翻阅各种杂书效果好(质量胜过数量)。 6 | 7 | ### 本电子书制作和写作方式 8 | 使用 mkdocs 和 markdown 构建,vim 编写,使用 Python-Markdown-Math 完成数学公式。 9 | markdown 语法参考:http://xianbai.me/learn-md/article/about/readme.html 10 | 11 | 安装依赖: 12 | ```sh 13 | # 方式1: 14 | pip install mkdocs # 制作电子书, http://markdown-docs-zh.readthedocs.io/zh_CN/latest/ 15 | # https://stackoverflow.com/questions/27882261/mkdocs-and-mathjax/31874157 16 | pip install https://github.com/mitya57/python-markdown-math/archive/master.zip 17 | 18 | # 推荐方式2: 19 | pip install -r requirements.txt 20 | ``` 21 | 22 | 编写并查看: 23 | ```sh 24 | mkdocs serve # 修改自动刷新浏览器,浏览器打开 http://localhost:8000 访问 25 | # 数学公式参考 https://www.zybuluo.com/codeep/note/163962 26 | # 图片最好压缩再放到仓库(不过不建议放非文本文件) 27 | mkdocs gh-deploy # 部署到自己的 github pages, 如果是 readthedocs 会自动触发构建 28 | ``` 29 | 30 | ### 访问: 31 | 32 | [https://pegasuswang.readthedocs.io/zh/latest/](https://pegasuswang.readthedocs.io/zh/latest/) 33 | 34 | [https://pegasuswang.github.io/booknotes/](https://pegasuswang.github.io/booknotes/) 35 | -------------------------------------------------------------------------------- /docs/career/OKR组织敏捷目标和绩效管理/OKR制定模板.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/OKR组织敏捷目标和绩效管理/OKR制定模板.png -------------------------------------------------------------------------------- /docs/career/OKR组织敏捷目标和绩效管理/OKR季中盘点模板.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/OKR组织敏捷目标和绩效管理/OKR季中盘点模板.png -------------------------------------------------------------------------------- /docs/career/OKR组织敏捷目标和绩效管理/OKR季末闭关评分.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/OKR组织敏捷目标和绩效管理/OKR季末闭关评分.png -------------------------------------------------------------------------------- /docs/career/OKR组织敏捷目标和绩效管理/OKR要点.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/OKR组织敏捷目标和绩效管理/OKR要点.png -------------------------------------------------------------------------------- /docs/career/OKR组织敏捷目标和绩效管理/层级OKR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/OKR组织敏捷目标和绩效管理/层级OKR.png -------------------------------------------------------------------------------- /docs/career/OKR组织敏捷目标和绩效管理/李彦宏OKR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/OKR组织敏捷目标和绩效管理/李彦宏OKR.png -------------------------------------------------------------------------------- /docs/career/OKR组织敏捷目标和绩效管理/组织目标管理阶段.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/OKR组织敏捷目标和绩效管理/组织目标管理阶段.png -------------------------------------------------------------------------------- /docs/career/give_and_take.md: -------------------------------------------------------------------------------- 1 | # 1.丰厚的回报 2 | 3 | 社会互动的三种基本风格:付出、获取、互利 4 | 付出究竟是不是有效的,取决于情境。纯粹的零和游戏和胜负关系中,付出很少能带来回报。 5 | 成功的关键在于利用付出带来的好处,同时将那些坏处的影响减到最小 6 | 成功的付出者在四个关键领域都有着独特的互动方式:构建网络、合作、评价和影响力。 7 | 8 | # 2.孔雀和熊猫(付出者、获取者、和互利者是如何建立人际网络的) 9 | 10 | 11 | 12 | 响影他人有两种基本的方法:建立支配和获得声望。 13 | -------------------------------------------------------------------------------- /docs/career/光速成长.md: -------------------------------------------------------------------------------- 1 | 沟通: 2 | 3 | 1. 向对方多提问(非盘问) 4 | 2. 模仿对方的言行举止 5 | 3. 开放的沟通环境 6 | 4. 拆屋效应:先提出很大要求,再提出较小要求,留有还价的余地的做法。比如期望薪资是8k,应该要到10k或者12k,之后可能折中到9k 7 | 5. 炮灰战略:如果希望对方在两个商品中选比较贵的那个,可以提供第三个选项让人对比较贵的那个有种『捡到便宜』的感觉。 8 | 9 | 10 | Fault Finder => Benefit Finder 11 | SBI反馈工具, Situation(情景界定), Behavior(行为描述),Impact(行为影响)。正面返回和改进型反馈 12 | - Situation情景:时间、地点、情况 13 | - Behavior行为:对方说了什么、做了什么 14 | - Impact影响:对工作的影响、对用户的影响、对周围同事的影响 15 | 16 | 自证预言:先入为主的判断,无论正确与否都会或多或少影响人们的行为,以至于这个判断最后真的实现。 17 | 18 | 19 | 增加曝光: 20 | - 汇报 21 | - 分享 22 | - 多参加跨部门沟通/项目 23 | - 参加公司俱乐部、兴趣小组等 24 | 25 | 26 | 跳槽之前: 27 | - 希望通过跳槽达成什么。钱和机遇(优先级和风险) 28 | - 可以预测的一两年之内,是否有希望升职 29 | - 跳槽的话,希望做什么 30 | - 如果暂时不跳槽,留下来,替方案是什么 31 | - 目前是否已经把工作上的业务吃透了 32 | - 在这家公司还有啥没学到的,补齐知识架构和体系,需要多久 33 | - 为下一份工作还有什么要准备的 34 | 35 | 36 | 盖洛普的Q12,是指以下12个问题: 37 | 38 | 1.我知道公司对我的工作要求吗? 39 | 40 | 2.我有做好我的工作所需要的材料和设备吗? 41 | 42 | 3.在工作中,我每天都有机会做我最擅长做的事吗? 43 | 44 | 4.在过去的七天里,我因工作出色而受到表扬吗? 45 | 46 | 5.我觉得我的主管或同事关心我的个人情况吗? 47 | 48 | 6.工作单位有人鼓励我的发展吗? 49 | 50 | 7.在工作中,我觉得我的意见受到重视吗? 51 | 52 | 8.公司的使命目标使我觉得我的工作重要吗? 53 | 54 | 9.我的同事们致力于高质量的工作吗? 55 | 56 | 10.我在工作单位有一个最要好的朋友吗? 57 | 58 | 11.在过去的六个月内,工作单位有人和我谈及我的进步吗? 59 | 60 | 12.过去一年里,我在工作中有机会学习和成长吗? 61 | -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/OKR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/OKR.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/p7要求.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/p7要求.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/wbs分解.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/wbs分解.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/三段分解法.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/三段分解法.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/做事方法.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/做事方法.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/漏斗模型.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/漏斗模型.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/答辩why.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/答辩why.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/管理.png -------------------------------------------------------------------------------- /docs/career/大厂晋升指南/金字塔原理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/大厂晋升指南/金字塔原理.png -------------------------------------------------------------------------------- /docs/career/沟通的方法/四种沟通风格.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/career/沟通的方法/四种沟通风格.png -------------------------------------------------------------------------------- /docs/career/番茄工作法.md: -------------------------------------------------------------------------------- 1 | # 1.一次只做一件事 2 | 3 | 什么是番茄工作法?简单说,就是列出你当天要做的事,设置25分钟闹钟,然后从第一件事开始。此外还要有每日回顾、做每日承诺、控制中断、预估要花的工夫等。这本书中我会以自己为例,向你展示如何使用番茄工作法,包括如何记录活动,以及如何挑出最重要的任务。 4 | 5 | 6 | # 2. 背景 7 | 8 | 大脑结构的四个层次: 9 | 脑干:条件反射机制 10 | 边缘系统:长期记忆,同事负责处理奖励信号。涉及情感和社会关系 11 | 皮层: 认知和思考 12 | 额叶: 发明创新、计划协商 13 | 14 | 有一种精神状态称为“心流”,它具有以下特点:明确的目标、集中、专注、自我意识消失、时间感扭曲、直接和即时反馈、能力水平与面对挑战的平衡、个人控制感、工作本身的内在奖励、行为与认知的合一。 15 | 16 | 有三个导致拖延的明显原因:压力来自内部,而治疗的良方是找到项目的起跑线。 17 | - 其他人强迫你做一些事,违背你的意志; 18 | - 你给自己压力,想要有完美的表现; 19 | - 害怕犯错误或受批评。 20 | 21 | 《解析极限编程:拥抱变化》Extreme Programming Explained:Embrace Change 22 | 23 | # 3. 方法 24 | 番茄工作法的一天具有5个阶段: 25 | - 计划: 在一天的开始选择最重要的活动,填写到"今日待办"。当天的自我承诺 26 | - 跟踪:确定活动后,开始番茄钟。收集过程指标,比如中断次数 27 | - 记录:将当天收集的数据归档,写入记录表格。如果跟踪了中断次数,记录下来。 28 | - 处理:从记录的原始信息中提取有用信息 29 | - 可视化:将信息以某种方式组织起来,从中找到改进流程的思路。 30 | 31 | 戴明虚幻:一个解决问题的周期流程。基于『假设-实验-评估』的科学方法,分为4步骤: 32 | - 计划:定义预期的结果,以及达成它所需要的流程。 33 | - 执行:实行该流程 34 | - 评估:对流程进行衡量,比较实际结果与预期结果,找出差距 35 | - 应用:对差距进行分析,找出问题根源,以图改进 36 | 37 | 不要在番茄钟进行中切换到另一项活动。如果番茄钟进行一半,你当前的工作已经完成,就用剩下的时间进行“过度学习”。例如我提前做完这件事,就会再回顾一下所做的或重复一下所学的,看看刚才的工作是否可以改进,或透过字里行间发现新结论……直到番茄钟响铃。 38 | 39 | # 4. 中断 40 | 41 | 番茄钟期间的中断有以下两种形式。 42 | 43 | - 第一种是自己造成的“内部中断”。具体地说,是直觉向心智发出信号,告诉自己去做当前专注活动以外的事情。 44 | - 处理方式:记入待办之后处理,大多是重要不紧急的事情 45 | - 第二种是别人造成的“外部中断”。有人找你询问或请你帮忙,并且等你答复。接下来我们看,对于这两类中断,番茄工作法都有相应的处理策略。 46 | - 处理方式:告知(我手头有事);协商(某某时间再帮你做行吗);计划(写下活动名称,稍后为它计划番茄钟);答复 47 | 48 | 49 | # 5. 预估 50 | 认为自己能做的和实际做到的相对应。 51 | 52 | 如果事前预估与实际所花工夫之间经常不一致,有以下两种可能的原因: 53 | - 做预估的方法或能力有待改进; 54 | - 工作开始后,又出现新情况、新问题,使得环境发生改变。 55 | 56 | # 6. 应变 57 | 58 | 番茄钟必须是原子的,如果经常遇到中断,缩小每个番茄钟的时间。 59 | 优先级淘汰赛 60 | 61 | # 7. 团队 62 | 63 | -------------------------------------------------------------------------------- /docs/career/知乎职人觉醒.md: -------------------------------------------------------------------------------- 1 | 应届生的必备素质: 2 | - 思考能力 3 | - 主动性:手头工作做完后要及时反馈。超出预期才能给人惊喜 4 | - 信息收集能力 5 | - 团队协作能力 6 | - 抗压能力 7 | - 兴趣 8 | - 职业技能 9 | - 善于总结 10 | - 写作能力 11 | 12 | 13 | 情绪、表达、逻辑、倾听 14 | 通用的技能和能力: 15 | 人际沟通能力、分析解决问题的能力、项目管理能力、销售技能、团队建设和领导力 16 | 17 | 冷邮件(给初次认识的人发邮件): 18 | 1. 越短的邮件越容易得到回复。 19 | 2。 别说你自己的事,这事和他有什么关系 20 | 3。 让他可以很容易回复并帮助你 21 | 22 | 金字塔原理:中心明确、分层叙事、逐层铺开: 23 | - 先用『战地记者』原理过滤下自己想表达的内容,唯一的一个中心 24 | - 分析邮件接受者对这个中心点的理解程度 25 | - 描述中心点最直接相关的一层信息(我有什么资源可以做?怎么做的?出现了什么结果) 26 | - 继续描述直接信息的『直接信息』,比如附件、图表。不能以一种干扰阅读的方式出现(比如日志、操作记录) 27 | 28 | 邮件格式:段首对齐;段末对齐;手动空行;适当间距。 29 | 确保自己写的东西对方能看懂,比如不要使用对方不明白的专业术语 30 | 31 | 32 | 高质量的会议记录: 33 | - 会议议题 34 | - 信息分享 35 | - 方案讨论 36 | - 形成决议 37 | - 执行分工 38 | 39 | 四个原则: 40 | - 匹配原则 41 | - 目的原则 42 | - 负责原则 43 | - 一致原则 44 | 45 | 46 | 相互配合需要解决的问题:有效沟通、明确需求、设置最后期限、反馈时间线 47 | 48 | 49 | 50 | 跳槽: 51 | 价值首选:基层看待遇,中层看平台,高层看资源 52 | 市场价值:能力;人才池的大小和稀缺性 53 | -------------------------------------------------------------------------------- /docs/career/知识变现.md: -------------------------------------------------------------------------------- 1 | ## 如何提升写作能力 2 | - 第一个密码不是多写,而是确定写作的质量标准(方向、类型、对标高手、输出质量、达到何种标准对外分享) 3 | - 多看。看真正优秀的写作者;看不同类型 4 | - 多想。不近指出本质的问题,提供合适的方法。深度思考是对基础概念做出明确的定义 5 | 6 | ## 如何提升专业能力 7 | - 构建专业知识地图,动态更新知识树 8 | - 取得相关资质 9 | - 不断积累案例 10 | - 达到一定年限 11 | - 尝试撰写专业书籍 12 | - 通过社交网络建立个人品牌 13 | 14 | ## 7步打造斜杠青年 15 | - 清晰定义你的个人品牌。方向和个人品牌的标准 16 | - 到目标领域的牛人对标 17 | - 评估别人哪些优势是你无法模仿的 18 | - 依据成功人士经验,细化标准。质量要求 19 | - 傍大款和做爆款 20 | - 围绕个人品牌第一步做长期计划 21 | - 给个人品牌计划设置验证点 22 | 23 | ## 人际网络 24 | - 分析: 九宫格黄金人脉图 25 | - 分类: 重要程度和关系亲疏进行 ABC 分类 26 | - 过滤:不同的生命阶段朋友是动态的 27 | - 经营:朋友圈点赞互动、先下聚会 28 | -------------------------------------------------------------------------------- /docs/career/程序员的自我修养.md: -------------------------------------------------------------------------------- 1 | 职业生涯 2 | 3 | # 1. 写给年轻程序员的启示 4 | 5 | 1. 正确认识自己。 6 | 2. 比一般人更努力 7 | 3. 适时建立个人权威。合适的时机去表现自己。积累实力,并在恰当的时候展现 8 | 4. 遵循最佳实践 9 | 5. 保持好奇心并勇于探索新事物 10 | 6. 抛开代码与人沟通 11 | 7. 为优秀的人工作 12 | 8. 生活、睡眠、旅行 13 | 9. 相信自己的天赋和创造力。阅读优秀书籍;记录和收集;尝试动手 14 | 15 | # 2. 职场经验 16 | 17 | 1. 你的薪酬和工作量无关。是否可以被替代 18 | 2. 尽可能持续做一件事 19 | 3. 变化 20 | 4. 声誉非常重要。严谨的习惯 21 | 5. 理解沟通的意义 22 | 6. 右脑将是你成功的关键。 23 | 7. 不要轻易说简单或者不可能 24 | 8. 不应该总是单打独斗 25 | 9. 你的能力显而易见。解决技术难题,提出解决方案,优雅完善的代码。大量实践,持续学习,勤于思考 26 | 27 | # 3. 如何找到一名靠谱程序员 28 | 29 | 1. 简历看人。不要有错别字;经验是否匹配 30 | 2. 给面试者 10 分钟介绍自己最擅长的 31 | 3. 基础打牢了么? 32 | 4. 技术深度够么 33 | 5. 适合企业文化 34 | 6. 行为面试法 35 | 7. 给他们一个虚拟任务 36 | 37 | # 4. 每个程序员都应该了解的一件事 38 | 39 | 自我营销。 40 | 41 | 1. 读与技术无关的书。自传、人文、经济、历史、艺术 42 | 2. 会写文档。 43 | 3. 学会包装。知道什么是优秀的;精心制作 44 | 4. 尝试多讲。敢说;让说的和你想的一致。有意识锻炼讲话能力 45 | 5. 建立社会化联系。分享自己的经验和想法 46 | 47 | # 5. 程序员的烦恼 48 | 49 | 1. 是否留在一线城市?买房会给你带来快乐吗 50 | 2. 小公司做得杂 51 | 3. 创建公司危机感。 52 | 4. 技术单一。先学好一门 53 | 54 | # 6. 年轻程序员的建议 55 | 56 | 1. 尽早确定想做的事情。坚定目标并且持续努力的人 57 | 2. 一万小时定律 58 | 3. 提高工作效率。加快工作节奏;借助工具完成任务 59 | 4. 简明的沟通方式 60 | 5. 持续学习 61 | 6. 学会控制情绪。对事不对人 62 | 7. 让最优秀的人围绕在你身边 63 | 8. 善于归纳和表达 64 | 9. 掌握英语 65 | 10. 睡眠充足 66 | 67 | 68 | 实践与认知 69 | 70 | # 突破程序员思维 71 | 72 | 1. 什么是程序员思维。人的思维+编程思维 73 | 74 | - 长期不间断编程实践 75 | - 持续学习和借鉴 76 | - 学会反思,像专家一样思考 77 | 78 | 2. 突破程序员思维 79 | 80 | - 透过技术问题发现问题本质。反复追问一件事情的原因 81 | - 像专家一样给出意见。 82 | - 杂学获得不同视角 83 | - 找回创造力。每天进行阅读,每周写一篇博客记录自己想到的东西。记录想法 84 | 85 | # 重构-系统改善之道 86 | 87 | 1. 从构建工具开始。引入构建工具或者构建脚本,一切需要手动的都应该工具来完成 88 | 2. 让自动化成为重构的保障。 89 | 3. 代码级别的重构。识别坏味道 90 | 4. 基于微服务的重构 91 | 92 | # 这样就好 93 | 94 | - 不盲目使用新技术 95 | - 避免过度设计 96 | - 不在项目中技术镀金 97 | 98 | # 走出软件开发原则 99 | 100 | - 面向对象 101 | - 测试非常重要 102 | - 层出不穷的方法论 103 | 104 | # 无法写出易读的代码 105 | 106 | - 代码本身就是难以阅读的 107 | - 推行模式而不是建立规范 108 | - 深入理解并尊重你用的框架 109 | - 不要过多使用技巧 110 | - 设计复审和代码审查很重要 111 | - 架构师应该活跃于整个阶段 112 | - 小比大好 113 | 114 | 个人发展 115 | 116 | # 优秀程序员的共同特质 117 | 118 | - 至少深入理解一门编程语言。使用哲学;语言特性;局限;缺陷;未来 119 | - 严谨好学 120 | - 现实主义者。权衡;完成即是价值;尊重流程,但会灵活运用。 121 | - 从失败中学习。面对失败的勇气,并从中获得进步 122 | - 熟练打字;使用和发明工具; 123 | - 善于发现和改造轮子。搜索引擎;社交网络;善于提问;快速上手 124 | - 切分工作;利用好碎片时间 125 | - 软技能;语言表达;倾听;领导者;指导他人;持续学习;谦逊;尊重 126 | - 有优秀的伙伴; 127 | - 对生活充满激情 128 | 129 | # 专家和普通人的区别在于觉察力 130 | 131 | - 真正理解和解决问题 132 | - 最优秀的方案来自于无与伦比的觉察力 133 | 134 | # 程序员创业的坑 135 | 136 | - 不擅长的领域 137 | - 不具操作性的商业计划 138 | - 参与者太多或者太少 139 | - 研发周期长,没特色 140 | - 忽略市场 141 | - 没有和用户维持关系 142 | - 过分信任专家或者对用户言听计从 143 | 144 | -------------------------------------------------------------------------------- /docs/career/聆听沟通学.md: -------------------------------------------------------------------------------- 1 | # 1 改变自己,走出困境 2 | 3 | 界定困境 4 | 解决问题从自身做起:假定你能通过改弦易辙来改善局面,克服绝望情绪,以积极、乐观的心态认定自己能够单方面改善局面。 5 | 6 | 对付偏执的人: 7 | 表达同理心、示弱(清楚说出自己的感受)、提出一个具体的解决方案 8 | 9 | 改变你说话的方式: 10 | 节奏:加快还是减慢 11 | 音量:提高还是降低音量 12 | 打断:你打断了对方,还是对方打断你 13 | 停顿:在回答对方之前,你是否能等一等,稍作沉默 14 | 15 | 16 | 超越谈话; 17 | - 更换玩家。另找相关沟通对象 18 | - 设计一套清晰明确的制度来管理分工 19 | - 单方面改变 20 | - 反思自己的情绪 21 | - 离开环境摆脱困难 22 | 23 | 解决困境的关键不在于归咎于谁,而在于如何改进。 24 | 25 | # 2 换位思考 26 | 27 | 改变思维方式 28 | 变通思维 29 | 拓宽视野 30 | 转换视角 31 | 从对方的视角看待困境 32 | 33 | # 3 克服自己的防御心理:推倒防御工事 34 | -------------------------------------------------------------------------------- /docs/career/职场动物进化手册.md: -------------------------------------------------------------------------------- 1 | 职场斗争的原因,多半是员工对产出的计算失误所导致。 2 | 公司的管理本质上来说就是防范内部威胁的。 3 | 4 | 你能进化成什么动物,取决于两个条件: 5 | - 你是否服从主管权威 6 | - 你是否有足够的工作能力 7 | 8 | 每一只动物自由裁量权不一,同样的事情别的动物做了无所谓,你做了可能就是灭顶之灾。职场中不存在公平,有的只是角色定位。 9 | 同样的劳动量的工作价值并不等同: 10 | - 面子活(形象工程)。平步青云之路 11 | - 日常工作。无升职之喜,也无解雇之忧 12 | - 垃圾工作。垃圾员工 13 | - 陷阱工作。烂摊子。极度危险 14 | 15 | 工作价值: 【老板关注度+工作重要度+高管关注度+主管关注度+对公司有影响的动物关注度】* 独立活动或互动活动系数*期望值系数 16 | 17 | -------------------------------------------------------------------------------- /docs/career/职场解释系.md: -------------------------------------------------------------------------------- 1 | 技能软:过去;现在;将来 2 | 3 | - 自我认识 4 | - 情绪管理 5 | - 当众演讲 6 | - 团队合作 7 | - 谈判技巧 8 | - 管理技能 9 | - 领导技能 10 | 11 | 职场高效能人士: 12 | - 写好工作计划 13 | - 管理好时间 14 | 15 | 职场营销: 16 | - 多参加公司内外的业务活动 17 | - 在工作中取得良好业绩 18 | - 专业刊物发表文章 19 | - 出席业界高规格会议 20 | - 社交媒体对业界事务发表评论 21 | - 专业人士社交网络 22 | 23 | 第一印象:长相、衣着、言谈、举止 24 | 25 | 26 | 有效的职场沟通: 27 | 交易对手的本质: 28 | - 他是什么样的人 29 | - 他是怎么做事的 30 | - 他是怎么做人的 31 | 32 | 了解对手沟通风格 33 | - 主导型:强势风格,多是命令和要求式。以尽快完成任务为导向,直接干脆,只问结果。需要迅速搞定一件事 34 | - 分析型:重视数据和逻辑。需要有耐心、准备工作做足了。 35 | - 和蔼型: 客气,和什么人都能合得来是其目标,不得罪人。重视礼节,给足面子 36 | - 表达型: 健谈。学会聆听,不要着急发表意见 37 | 38 | 了解交易对手的管理风格 39 | 40 | 41 | 升职模型: 42 | - 正确专业的工作态度,积极主动承担更多工作 43 | - 硬技能。技术上不断进步并且和帮助公司提高效率和产能 44 | - 软技能。公司内外和利益攸关方进行坦率沟通,有效地团队合作。有领导风范,妥善处理各种冲突 45 | - 业绩好,有能量化的贡献 46 | - 对公司忠诚。积极发表自己的意见,关心公司现状和发展方向。想着公司核心利益,个人职业发展和公司命运联系 47 | - 跟对老板 48 | -------------------------------------------------------------------------------- /docs/career/高效15法则.md: -------------------------------------------------------------------------------- 1 | # 1.数字 1440 的力量 2 | 1440 分钟 3 | 4 | # 2.确立要事的优先地位 5 | 6 | 关注什么以及如何去实现 7 | 8 | 9 | 10 | # 8. 会议缩减法 11 | 琐事定律:组织通常将大多数时间花在琐碎的小事上。 12 | 无会议周三 13 | 14 | 高效会议议程: 15 | - 与会者寻求意见 16 | - 明确指出会议的目的 17 | - 尽可能列出议题,让参会人员做决定 18 | - 将每个议程安排的预估时间标注在议程之后,以便与会者掌握会议进度 19 | 20 | 21 | 站着开会效率更高 22 | 开会不要带手机 23 | 24 | 25 | 80/20 法则;哪些任务回报最大。超额回报的少数事情。重要的事情做到极致,不重要的不做。 26 | 『限制理论』:确定阻碍取得目标结果的直接因素 27 | 28 | 问自己三个问题: 放弃、分派或是重新设计任务 29 | 判断工作价值 30 | - 放弃:我可以放下什么,那些事情可以不做 31 | - 分派:哪些工作可以分配给下属;哪些可以外包 32 | - 重新设计:换种节省时间的方式继续做 33 | 34 | 35 | 专注你擅长的领域,其他工作派人去做 36 | 37 | 38 | 39 | 如果完成一件事少于5分钟,应该立即去做。 40 | -------------------------------------------------------------------------------- /docs/career/高效清单工作法.md: -------------------------------------------------------------------------------- 1 | 2 | # 如何创建待办事项清单 3 | 4 | (发现和我自己探索出来的比较类似😄,个人一直用的teambition) 5 | 6 | - 从任务中分离出当前任务 7 | - 根据期望的结果确定任务(写出来某件事的原因) 8 | - 将项目分解成单个任务(分而治之) 9 | - 设定每个任务截止时间(deadline 可以提升表现,集中在重要任务上) 10 | - 当前任务的数量限制为7个 11 | - 按照项目、类型和地点组织任务 12 | - 修剪多余的任务清单(愿望,含义不明确的任务,琐碎的任务,承诺和决心) 13 | - 估算完成每项任务所需要的时间(我们倾向于乐观估计) 14 | - 使用主动动词引导每项任务,正确的动词激励你行动,而如探索,计划和了解这类动词就不如具体的动词有效。 15 | - 注意那些任务会受到他人影响 16 | 17 | # 如何维护待办事项清单系统 18 | 19 | - 建立微任务批处理清单。把一堆可以几分钟完成的琐事,集中起来批处理 20 | - 保持警觉,不被任务压垮 21 | - 按照场景定义待办事项清单 22 | - 每周回顾。评估进度,审视优先级 23 | - 更新目标清单。写下来的目标更有可能坚持,具体的目标是可以追踪的 24 | - 避免在方法论上犹豫不决(番茄工作法,时间盒,GTD 等) 25 | - 构建适合你的系统(依照你的工作流程和环境)基本要素:截止日期,优先级,细节信息,任务分离 26 | - 保持一致 27 | 28 | 使用清单目的不是确保你完成了所有工作,而是确保你将有限的精力和时间集中在最重要的工作上。 29 | 30 | 提高工作效率不是为了让自己忙碌,而是根据短期目标和长期目标做去做该做的事情。 31 | -------------------------------------------------------------------------------- /docs/code/codelife_不止代码.md: -------------------------------------------------------------------------------- 1 | 阿里的一本小册子 2 | 3 | # 李运华:写技术代码如何精进 4 | 5 | Do more. 6 | 7 | - 熟悉更多业务,不管是不是你负责的。熟悉更多代码,不管是不是你写的。 8 | - 熟悉端到端(前到后) 9 | - 自学 10 | 11 | Do Better 12 | 13 | - 你负责的系统,总有不合理可以改进的。识别出来,给出解决方案,然后像主管提出。只要有一次落地了,就是你的机会。 14 | 15 | Do exercise 16 | 17 | - 光看不用效果差。 18 | - Learning: 注意系统化。不能只通过网上临时性学习 19 | - Trying: 自己写测试程序 20 | - Teaching: 传授和分享 21 | 22 | 23 | # 毕业三年,为何技术能力相差越来越大 24 | 25 | 知识+逻辑=能力 26 | 27 | 好的逻辑从哪里来:实践和复盘 28 | 29 | 30 | # 青春饭 31 | 32 | 3-5年:熟练工。基础知识学习。管好自己、执行严格的学习计划、工作质量高了就能得到认可 33 | 34 | 5-10年:自身竞争力是否符合年龄所应该具备的。团队贡献者。Team leader(TL) 35 | 36 | 37 | # 技术变化快,如何不被淘汰 38 | 39 | 无法定位自己在分工体系中的位置,处理不好自身与技术、业务的关系所致。 40 | 战术勤奋掩盖战略懒惰。 41 | 42 | - 业务领域与功能 43 | - 服务能力。正确性、可用性、大规模。将学习与具体业务场景结合起来 44 | 45 | 架构: 46 | 47 | - 组织业务 48 | - 组织技术 49 | - 组织人员 50 | - 组织全局,对外输出 51 | 52 | 53 | # 加班越久,故障越多,如何跳出恶性循环 54 | 55 | - 需求细化 56 | - 随时拥抱用户 57 | - 重点跟进质量管理和运营 58 | - 保证发布成功率 59 | 60 | 61 | # 技术面试脱颖而出 62 | 63 | - 技能。很好完成而不是紧紧完成工作 64 | - 潜力:面向未来。容易评价:对计算机相关的知识体系是否完整 65 | - 软实力:执行力、性格、领导力。 66 | 67 | 团队要不听加入更好的同学,才能变强大。 68 | 69 | 70 | # 技术人如何不断成长 71 | 72 | - 经验丰富,知识体系完整。找到标杆 73 | - 保持良好的习惯,不忘总结和提升。周报:到底每周收获了什么? 74 | 75 | 76 | # 使用开源项目的正确姿势 77 | 78 | 如何选一个开源项目? 79 | 80 | - 聚焦是否满足业务 81 | - 是否成熟。版本号,越高越好,至少1.x以上的;使用公司的数量;社区活跃度 82 | - 运维能力。日志是否齐全;是否有命令行、管理控制台等维护工具;故障检测和恢复能力,报警、倒换等 83 | 84 | 如何使用开源方案? 85 | 86 | - 深入研究,仔细测试 87 | - 看设计文档,了解设计原理 88 | - 识别出关键配置项 89 | - 多种场景性能测试 90 | - 压测,观察 cpu、内存,磁盘 io 等波动 91 | - 故障测试:kill、断电、拔网线、重启、倒换 92 | 93 | - 小心应用,灰度发布。先在非核心业务上 94 | 95 | - 做好应急,以防万一 96 | 97 | 98 | 如何基于开源项目二次开发? 99 | 100 | - 保持纯洁、加以包装 101 | - 发明你要的轮子 102 | -------------------------------------------------------------------------------- /docs/code/基本功.md: -------------------------------------------------------------------------------- 1 | # 1章:软件过程 2 | 会编程 != 会开发软件 3 | 4 | # 2章:软件系统设计 5 | 软件设计的三个基本手段:分解、层次化、抽象 6 | 7 | # 3章:高质量编程 8 | 编程风格约定 9 | 高质量程序语句:直截了当说明意图;少使用临时变量;避免使用相似代码 10 | 高质量函数原型:DRY;降低复杂性;隐含数据;改进型能;集中控制;隐含数据结构;分隔复杂操作 11 | 按照输入,修改、输出的顺序排列参数 12 | 高质量函数编程 13 | 高质量程序结构:模块化;模块关系清晰;每个模块只做一件事; 14 | 经验法则:检查程序清晰性;重写质量查的程序 15 | 16 | # 4章:程序代码复查 17 | 建立检查表 18 | 19 | # 5章:调试与优化 20 | 21 | # 6章:程序质量保证 22 | 23 | 24 | # 7章:程序文档 25 | 先写文档,后写代码 26 | 常见缺陷:滥用缩略语;不遵守文法;交代不明;眉目不清; 27 | 28 | 29 | # 8章:版本控制 30 | 31 | 32 | # 9章:软件质量控制 33 | 缺陷统计 34 | 常规手段:文档模板;编程风格约定;缺陷复查;写调试记录;读调试记录;写开发总结 35 | 质量要求具体化:坚持『定义清楚明确的质量要求,执行单一的质量标准』是真正质量管理的根基 36 | 37 | # 10章:团队协作基本功 38 | 任何不能改善产品的工作,都是浪费时间或者是偏离方向的 39 | -------------------------------------------------------------------------------- /docs/code/敏捷技能修炼.md: -------------------------------------------------------------------------------- 1 | # 1.意图导向编程 2 | 意图导向编程是指:先假设当前这个对象中已经有了一个理想方法,它可以准确无误完成你想做的事情,而不是直接盯着每一点要求编写代码。 3 | · 4 | # 2.分离构造和使用 5 | 任何时候引用对象,都应该封装它涉及的具体实现。 6 | 将对象的创建和使用分离开 7 | 8 | # 3.代码未动,测试先行 9 | 考虑代码的测试性刻意创建出一个更好的设计方案。 10 | 11 | 12 | # 4. Shalloway 法则和 Shalloway 原则 13 | 如果代码中有 N 个地方需要修改,并且 N > 1 ,Shalloway 最多只能找到其中的 N-1 个地方。 14 | 15 | 冗余(具备相似或者重复的特征)的种类: 16 | - 复制粘贴 17 | - 幻数 18 | - 其他类型:冗余行为、冗余信息、冗余实现 19 | 20 | # 5. 封装 21 | 所有隐藏起来的部分,我们都是可以改变的 22 | 把困难封装起来 23 | 24 | # 6. 面向接口的设计 25 | 专注于对象所提供的服务或模块的职责,而不是他们的具体实现。 26 | 接口是与其他实体(可能是一个方法、类、一个模块、或一段程序)交互的方式, 常见形式: 27 | - 一个对象可调用方法的集合 28 | - 一种协议(FTP等) 29 | - 一种程序接口,比如 web 服务 30 | 31 | 接口约定:每个接口都应当具备明确的约定,包含前置条件和后置条件。 32 | - 前置条件:开始执行某种操作时,认为肯定正确的东西。 33 | - 后置条件:操作结束时,应该完成的东西 34 | 35 | 接口三大定律: 36 | - 实现应当正确完成它的方法宣称的事情(对应功能测试) 37 | - 接口的实现不得损害系统(对应能力测试) 38 | - 如果不能实现相关职责,必须通知相关调用者,使用错误代号或者异常(负面功能测试) 39 | 40 | 委派优于继承 41 | 42 | # 7. 验收测试驱动开发 43 | 44 | - 通过用户界面创建一个调用业务规则的事务 45 | - 开发一个用户界面,并通过这个界面直接董啊用业务规则 46 | - 通过某种语言的单元测试框架实现测试 47 | - 通过自动化的测试用例直接与业务规则模块交互 48 | 49 | # 8. 避免过度设计或者设计不足 50 | 这种的办法:花足够多的时间提高代码质量,但别花一秒时间去做你目前根本不需要要的功能 51 | 52 | 代码质量病理学,五种常见的质量分类 53 | - 内聚:内聚涉及两个概念:高内聚的类(内部功能相互关联度搞);内聚的方法(只做一件事) 54 | - 适当耦合:对象之间的关系定义良好 55 | - 没有冗余:在一个地方修改了代码,在别的地方也必须做出相应的改变 56 | - 可读性:表露意图 57 | - 封装:病理特征:你必须知道正在使用的内部代码是什么,否则无法正确使用它 58 | 59 | # 9. 持续集成 60 | 持续集成意味着每次代码改动结束,就要立即把这个改动提交到主干并把这件事通知到所有人,把改动合并到他们的分之。 61 | 62 | # 10. 共性和可变性分析 63 | 共性分析:识别由于其所在环境或者具备的功能相互牵连,关联在一起的因素 64 | 可变性分析:只有在给定共性的前提下,可变性才有意义。由具体类型实现 65 | 共性分析涉及问题领域的概念层面,可变性分析涉及实现层面(具体用例)。 66 | 两个简单的问题帮助找出概念和变体: 67 | - 这是概念还是实现? 68 | - 如果它是概念,它的变体是什么?如果它是实现,它是什么的变体? 69 | 70 | 分析矩阵:针对问题领域的概念模型设计 71 | - 1.选择一个将要描述的特定用例 72 | - 2.列出完成这个用例所需要的步骤,把第一步放在最上面,后面的步骤依次排列 73 | - 3.在每个步骤的左边创建一列 74 | - 4.把每一个步骤的概念和意义写在左边的列里 75 | 76 | 77 | # 11. 以开闭原则为目标的重构 78 | 软件中的实体(类、模块、函数等),应该满足对扩展是开放的,对修改是封闭的 79 | 组织代码最基本和通用的方法:使用具备良好粒度的函数 80 | 81 | 82 | # 12. 需求与功能接口 83 | 函数和方法的迪米特法则: 一个方法M存在一个对象 O 中,对象 O 的 M 方法只引用下面几种对象的方法: 84 | - 对象 O 的其他方法 85 | - M 的参数 86 | - 在M 方法中被实例化的对象 87 | - O 所包含的子对象 88 | - 任何 O 可以访问的全局变量 89 | 90 | # 13. 何时以及如何使用继承 91 | 优先使用组合而非继承 92 | 通过继承来隐藏变量,而不是代码复用 93 | 94 | # 高质量代码(容易理解、可以测试、便于修改): 95 | 96 | #### 内聚 97 | - 描述:类或者方法中的所有元素都相互关联,不含有不相关的元素 98 | - 原则:单一职责原则、关注点分离 99 | - 实践:意图导向编程、测试先行、共性和可变性分析 100 | - 病理症状:臃肿的类(太多职责)、冗长方法(包含多个功能)、难以命名(内聚性不强、不好命名) 101 | - 测试中的迹象:臃肿的测试用例、多个原因导致测试失败 102 | 103 | #### 耦合(一个给定实体与其他实体之间的依赖是符合逻辑、显而易见和最小化的) 104 | 105 | - 描述: 106 | - 本体耦合:一种类型和另一种已存在的类型发生关联,比如 ClassA 的方法返回了 ClassB 的一个引用 107 | - 表象耦合:一种类型与另一种类型的接口发生关联的时候。 108 | - 继承耦合:派生类和基类之间的关联关系,基类发生变化,子类也会发生变化 109 | - 子类耦合:关联到某个类型具备多态的时候 110 | 111 | - 原则:开闭原则 112 | - 实践:封装,仅在需要的时候暴露细节;针对接口设计;继承是针对可插入性(系统应该能比较容易把一个类抽出去,同时将另一个同样接口的类加进来) 113 | - 病理症状:边界效应 114 | - 测试中的迹象:缓慢复杂的测试;大量的测试准备 115 | 116 | 117 | #### 冗余 118 | - 描述:任何东西,只要它有可能变化,就改在系统中找到一个单独且唯一的地方放起来。 119 | - 原则:一种规则对应一个地方;DRY;shalloway法则 120 | - 实践:出现冗余后马上重构;测试先行 121 | - 病理症状:多个客户端发现重复 122 | - 测试中的迹象:测试中的冗余 123 | 124 | 125 | #### 封装 126 | - 描述:把能藏的东西都藏起来(数据、状态、行为、类型、内存分配、使用顺序、接口、实体、子系统) 127 | - 原则:封装所有的变化 128 | - 实践:原则上都应该封装,确实有需要的时候暴露细节 129 | - 病例症状:系统无法继续维护 130 | - 测试中的迹象:粗粒度测试 131 | -------------------------------------------------------------------------------- /docs/code/程序员应该知道的97件事.md: -------------------------------------------------------------------------------- 1 | 1. Act with prudence:  关注技术债 2 | 2. Appply Functional Programming Principles 3 | 3. Ask, "what would the User do"?: 观察用户操作 4 | 4. Automate your coding standard: 5 | 5. Beauty is in Simplicity: 代码可读性,可维护性,部署速度, 6 | 6. Before you refactor: 保证测试;避免重写一切;多次增量改变;确保现有测试通过;不要带入个人偏好;不要盲目追求新技术; 7 | 7. Beware the share:检查上下文 8 | 8. The boy scout rule: 每次代码仓库要更干净 9 | 9. Check your code first before looking to blame others 10 | 10. Choose tools with care 11 | 11. Code in the language of the domain: 代码更好反映出领域模型 12 | 12. Code is Design 13 | 13. Code layout matters: Easy to scan; Expressive layout; Compact format 14 | 14. Code Reviews: 目的是为了共享知识和建立共同的编程原则;评论一件要有建设性,而不是刻薄。不同的人可以有不同的关注点(异常、文档、函数功能) 15 | 15. Coding with reason: 16 | 16. A comment on Comments: 17 | 17. Comment only what the code cannot say. 18 | 18. continuous learning 19 | 19. Convenience Is Not an -ility: 不要因为方便而设计复杂的api 20 | 20. Deploy early and Often: 21 | 21. Distinguish Business Exceptions from Technical: 22 | 22. Do lots of Deliberae Practice: 挑战超出现有能力的练习,尝试、分析并且纠正 23 | 23. Domain-Specific Languages 24 | 24. Don't be afraid to break things 25 | 25. Don't be cute with your test data: when writing any text in your code(comments, logging,dialogs,test data),always ask yourself how it will look if it becomes public. 26 | 26. Don't Ignore That Error: 27 | 27. Don't just learn the language, understaned it's culture 28 | 28. Don't Nail your program into the upright position: 不要让用户看到异常报告。 29 | 29. Don't rely on 'magic happens here' 30 | 30. Don't Repeat Yourself 31 | 31. Don't touch that code 32 | 32. Encapsulate Behavior, Not just State 33 | 33. Floating-Point Numbers Aren't Real 34 | 34. Fulfill yur amtibions with open source 35 | 35. The golden Rule of Api Designn:仅仅为api写单元测试还不够,还要为使用用你的api的代码写单元测试。 36 | 36. The Guru Myth 37 | 37. Hard Work Does Not Pay off: act like a professional: prepare, effect, observe, reflect, and change. 38 | 38. How to use a bug tracker: bug report:如何复现;期望行为;实际行为。 39 | 39. Improve Code by Removing it. 40 | 40. Install me 41 | 41. Interprocess communication affects application response time: 42 | 42. Keep the build clean. 43 | 43. Know how to use command line tools 44 | 44. Know Well More Than two programming languages 45 | 45. Know Your IDE 46 | 46. Know Your Limits: 不同介质访问速度,不同算法的时间复杂度。 47 | 47. Know Your Next commit: 不要向代码库提交你的 guesswork 48 | 48. Large, Interconnected data belongs to a database 49 | 49. Learn Foreign Languages 50 | 50. Learn to estimate: estimate, target and commitment. 51 | 51. Learn to Say, 'hello, world' 52 | 52. Let your project speak for itself. 53 | 55. Make Interfaces Easy to use correctly and hard to use incorrectly. 54 | 56. Make the Invisible More Visible. 55 | 57. Message Passing Leads to Better Scalability in Parallel Systems. 56 | 58. A message to the future 57 | -------------------------------------------------------------------------------- /docs/code/领域驱动设计.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/code/领域驱动设计.md -------------------------------------------------------------------------------- /docs/database/MySQL是怎样运行的从根上理解MySQL/1-6Mysql服务器处理客户端请求.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/MySQL是怎样运行的从根上理解MySQL/1-6Mysql服务器处理客户端请求.png -------------------------------------------------------------------------------- /docs/database/MySQL是怎样运行的从根上理解MySQL/隔离级别.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/MySQL是怎样运行的从根上理解MySQL/隔离级别.png -------------------------------------------------------------------------------- /docs/database/Mysql技术内幕InnoDB存储引擎.md: -------------------------------------------------------------------------------- 1 | # 1. Mysql 体系结构和存储引擎 2 | 3 | mysql 是单进程多线程架构,支持插件式的表存储引擎,存储引擎基于表而不是数据库。 4 | 5 | ### 1.3 MySQL存储引擎: 6 | 7 | ##### InnoDB 8 | 支持事务,面向在线事务处理(OLTP)应用,特点是行锁设计,支持外键,非锁定读。 9 | 使用多版本并发控制(MVCC)获得高并发性。 10 | 表中数据的存储,采用聚集(clustered)方式,因此每张表的存储都是按照主键的顺序存放。 11 | 12 | ##### MyISAM 13 | 不支持事务、表锁设计,支持全文索引,主要面向OLAP数据库应用。 14 | 15 | ##### NDB 16 | 集群存储引擎,join操作在数据库层完成,不是在存储引擎层,复杂连接需要巨大网络开销 17 | 18 | ##### Memory 19 | 存放内存中,适用于临时表,默认是哈希索引 20 | 21 | ##### Archive 22 | 只支持 insert select 操作,告诉插入和压缩功能 23 | 24 | 25 | # 2. InnoDB 存储引擎 26 | 27 | 多线程模型: 28 | 29 | - Master Thread: 主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性 30 | - IO Thread: InnoDB中大量使用了AIO(Async IO)处理IO请求 31 | - Purge Thread: 回收已经使用并分配的 undo 页 32 | - Page Cleaner Thread: 将之前版本中脏页的刷新操作都放入到单独的线程中来完成,减轻master工作压力 33 | 34 | (关于linux 内存管理:https://blog.csdn.net/gatieme/article/details/52384636 ,内存被细分为多个页面帧, 页面是最基本的页面分配的单位 ) 35 | 36 | 内存: 37 | 38 | - 缓冲池:缓冲池技术提升性能(协调磁盘与cpu速度鸿沟) innodb_buffer_pool_size,新版可以有多个缓冲池 39 | - LRU List, Free List, Flush List: 管理内存区 40 | 41 | Checkpoint 技术: 42 | 为了避免数据丢失问题,当前事务数据库系统普遍使用了Write Ahead Log 策略,当事务提交时,先写重做日志,再修改页。 43 | 当由于发生宕机导致数据丢失时,通过重做日志完成数据恢复。 (Durability持久性) 44 | Checkpoint 技术解决了几个问题: 45 | 46 | - 缩短数据库恢复时间 47 | - 缓冲池不够用时,将脏页刷新到磁盘 48 | - 重做日志不可用时,刷新脏页 49 | 50 | 当数据库宕机,数据库不需要重做所有日志,因为checkpoint 之前的页都已经刷新回磁盘,只需要对 checkpoint 51 | 后的重做日志进行恢复,这样就大大缩减了恢复时间。 52 | 53 | InnoDB 通过LSN(Log Sequence Number) 来标记版本。 54 | InnoDB 中两种Checkpoint: 55 | 56 | - Sharp Checkpoint: 发生在数据库关闭时将所有的脏页都刷新回磁盘,默认 57 | - Fuzzy Checkpoint: 只刷新一部分 58 | 59 | Maste Thread 实现可以参考书中的示例伪代码 60 | 61 | InnoDB 关键特性: 62 | 63 | - 插入缓冲(Insert Buffer) 64 | - 两次写(Double Write) 65 | - 自适应哈希索引(Adaptive Hash Index) 66 | - 异步IO(Async IO) 67 | - 刷新邻接页(Flush Neighbor Page) 68 | 69 | 延伸阅读,主要是了解B树: 70 | B-Tree: 多叉平衡查找树 71 | 72 | - https://zh.wikipedia.org/wiki/B%E6%A0%91 73 | - https://blog.csdn.net/v_JULY_v/article/details/6530142 74 | -------------------------------------------------------------------------------- /docs/database/getting_started_with_impala.md: -------------------------------------------------------------------------------- 1 | # 1. Why Impala 2 | 3 | flexibliity for your big data flow 4 | high-performance analytics 5 | exploratory business intelligence 6 | 7 | extrac-transform-load(ETL) 8 | BI: Business intelligence 9 | 10 | # 2. Getting Up and Running with Impala 11 | 12 | Cloudera live demo 13 | 14 | A view is an alias for a longer query, and takes no time or storage to set up 15 | 16 | # 3. Impala for the database developer 17 | 18 | OLTP-style(online transaction processing) 19 | 20 | impala implements SQL-92 standard features for queries, with som enhancements from later SQL standards 21 | Hadoop Distributed File System(HDFS) 22 | 23 | - Impala currently doesn't have OLTP-style data manipulation language (DML) such as DELETE or UPDATE. 24 | - Impala also does not have indexes, constraints or foreign keys. 25 | - No transactions 26 | 27 | impala can very effeciently perform full table scans of large tables. 28 | 29 | 30 | HDFS Storage Model: 31 | CDH: Cloudera Distribution with Hadoop 32 | Parquet File Format: binary file format 33 | 34 | # 4. Common Developer Tasks for Impala 35 | 36 | ETL(Extract-trnasform-load) 37 | 38 | Make sure always close query handles when finished(release memory) 39 | JDBC or ODBC 40 | 41 | with Impala, the biggest I/O savings com from using partitioned tables and choosing the most appropriate file format 42 | 43 | Impala partitioned tables are just HDFS directories 44 | UDF(user defined functions) 45 | -------------------------------------------------------------------------------- /docs/database/redis深度历险核心原理和应用实践/intset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/redis深度历险核心原理和应用实践/intset.png -------------------------------------------------------------------------------- /docs/database/redis深度历险核心原理和应用实践/listpack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/redis深度历险核心原理和应用实践/listpack.png -------------------------------------------------------------------------------- /docs/database/redis深度历险核心原理和应用实践/quicklist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/redis深度历险核心原理和应用实践/quicklist.png -------------------------------------------------------------------------------- /docs/database/redis深度历险核心原理和应用实践/quicklist1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/redis深度历险核心原理和应用实践/quicklist1.png -------------------------------------------------------------------------------- /docs/database/redis深度历险核心原理和应用实践/radix-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/redis深度历险核心原理和应用实践/radix-tree.png -------------------------------------------------------------------------------- /docs/database/redis深度历险核心原理和应用实践/skiplist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/redis深度历险核心原理和应用实践/skiplist.png -------------------------------------------------------------------------------- /docs/database/redis深度历险核心原理和应用实践/ziplist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/database/redis深度历险核心原理和应用实践/ziplist.png -------------------------------------------------------------------------------- /docs/database/七周七数据库.md: -------------------------------------------------------------------------------- 1 | 4. Hbase 2 | 3 | 在线分析处理系统,擅长扫描巨大数据集。作为后台日志和查询系统。 4 | 5 | Hbase 基于 hadoop(提供了分布式文件系统和 mapreduce计算能力) 6 | 7 | 键可以是任意字符串,每个键映射到一行数据。行本身也是一个映射表,其中的键称为列,值就是未解释的字节数组。 8 | 列按照列族分组,所以列的完全名称包含两部分:列族名称和列限定符,通常用冒号连接。 9 | 10 | 行键和列名组合(包括列族和限定符)形成了定位数据的地址。 11 | -------------------------------------------------------------------------------- /docs/database/高性能mysql第三版.md: -------------------------------------------------------------------------------- 1 | # 1章:MySQL 架构与历史 2 | 3 | 读锁(共享锁) 4 | 写锁(排他锁) 5 | 6 | 原子性:一个事务必须被视为一个不可分割的最小工作单元 7 | 一致性:数据库总是从一个一致性的状态转换到另外一个一致性的状态。 8 | 隔离性:一个事务所做的修改在最终提交以前,对其他事务是不可见的。 9 | 持久性:一旦事务提交,其所做的修改就会永久保存到数据库中 10 | 11 | 四种隔离级别: 12 | - READ UNCOMMITTED(未提交读): 事务中的修改,及时没有提交,对其他事务也都是可见的。 13 | 事务可以读取未提交的数据(脏读)。这个级别会导致很多问题,一般不用 14 | - READ COMMITTED(提交读):一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。 15 | - REPEATABLE READ(可重复读,mysql默认级别):解决了脏读问题,保证同一个事务中多次读取同样记录的结果都是一致的。无法解决幻读的问题 16 | - SERIALIZABLE(可串行化):最高的隔离级别,通过强制事务串行执行,解决了幻读问题。会在读取的每一行数据上都加锁。 可能导致大量的超时和锁征用问题 17 | 18 | 多版本并发控制(MVCC),典型的有乐观并发控制和悲观并发控制。 19 | 20 | 选择不同的存储引擎: 21 | - 事务:InnoDB 是目前最稳定并且经过检验的选择 22 | - 备份:如果需要在线热备份,InnoDB 就是最基本的选择 23 | - 崩溃恢复 24 | 25 | # 2 Mysql 基准测试 26 | 27 | 绘图:gnuplot,或者 R 绘图 28 | 29 | 集成式测试工具:ab, http_load, JMeter 30 | 单组件式测试工具:mysqlslap, sql-bench, super Smack, Database Test Suite, sysbench, mysql 内置benchmark 函数 31 | 32 | 33 | # 3 服务器性能剖析 34 | 专注于测量服务器的时间花费在哪里,性能即响应时间。 35 | 36 | 性能剖析(profiling): 测量任务花费的时间,然后对结果进行统计排序 37 | 38 | # 4 Schema与数据类型优化 39 | 40 | ### 4.1 选择优化的数据类型 41 | 42 | - 更小的通常更好 43 | - 简单就好:应该使用mysql内置类型而不是字符串来存储日期和时间;应该用整型存储IP地址。 44 | - 尽量避免 NULL 45 | 46 | 两种整型数字:整数和实数 47 | 48 | ### 4.2 Mysql Schema 设计中的陷阱 49 | - 太多的列 50 | - 太多的关联 51 | - 全能的枚举 52 | - 变相的枚举 53 | 54 | ### 4.3 范式和反范式 55 | 完全的范式化和反范式化都是只有实验室才有的东西。通常使用部分范式化,缓存表和其他技巧。 56 | 57 | ### 4.4 缓存表和汇总表 58 | 缓存表、汇总表、影子表 59 | 60 | ### 4.5 加快 ALTER TABLE操作 的速度 61 | 两种技巧: 62 | - 先在一台不提供服务的机器上执行 ALTER TABLE 操作,然后和提供服务的主库切换 63 | - 影子拷贝:用要求的表结构创建一个和源表无关的新表,然后通过重命名和删表操作交换两张表 64 | 65 | 66 | # 5. 创建高性能的索引(key) 67 | 68 | ### 5.1 索引基础 69 | mysql 支持的索引类型: 70 | 71 | B-Tree索引: 72 | - 适用于全键值,键值范围或键前缀查找(最左前缀) 73 | - 限制: 74 | - 如果不是按照索引的最左列开始查找,则无法使用索引 75 | - 不能跳过索引中的列 76 | - 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找 77 | 78 | 哈希索引:基于哈希表实现,只有精确匹配索引所有列的查询才有效 79 | 80 | 空间数据索引(R-Tree): 地理数据存储 81 | 82 | 全文索引 83 | 84 | ### 5.2 索引的优点 85 | - 减少服务器需要扫描的数据量 86 | - 避免排序和临时表 87 | - 将随机 I/O 变为 顺序 I/O 88 | 89 | 三星原则: 90 | - 索引将相关的记录放到一起获得一星 91 | - 索引中的数据顺序和查找中的排序顺序一致则获得两星 92 | - 如果索引中的列包含了查询中需要的全部数据列则获得三星 93 | 94 | ### 5.3 高性能的索引策略 95 | 96 | - 独立的列:如果查询中的列不是独立的,就无法使用索引。独立的列是指索引列不能是表达式的一部分,也不能是函数参数。 97 | - 前缀索引和索引选择性:选择性越高查询效率越高。mysql无法使用前缀索引 order by 和 group by 98 | 99 | 聚簇索引:InnoDB 的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行 100 | 使用InnoDB 应该尽可能按照主键顺序插入数据,并且尽可能使用单调增加的聚簇键的值来插入新行。 101 | 102 | 只有当索引的列顺序和order by 子句的顺序完全一致,并且所有列的排序方向都一样时,mysql 才能 103 | 使用索引来对结果做排序。如果查询需要关联多张表,则只有当order by 子句引用的字段全部为第一个表时, 104 | 才能使用索引做排序。 105 | 106 | mysql 的唯一限制和主键限制都是通过索引实现的,尽量不要创建重复的索引。 107 | 108 | InnoDB 在二级索引上使用共享(读)锁,但访问主键索引需要排他(写)锁。 109 | mysql 使用某个索引进行范围查询,也就无法再使用另一个索引(或者该索引的后续字段)进行排序了。 110 | 尽量将需要做范围查询的列放到索引的后边,以便优化器能使用尽可能多的索引列。 111 | 112 | 113 | # 6 查询性能优化 114 | 115 | ### 6.2 慢查询基础:优化数据访问 116 | - 查询不需要的记录。不需要的行(应该使用limit)或者多余的列(不要 select *) 117 | - mysql是否扫描额外的记录,最简单衡量查询开销的三个指标:响应时间、扫描的行数、返回的行数 118 | 119 | ### 6.3 重构查询方式 120 | - 衡量是使用一个复杂查询还是多个简单查询 121 | - 切分查询 122 | - 分解关联查询,对每个表进行一次单表查询,然后将结果在程序中进行关联 123 | 124 | ### 6.7 优化特定类型的查询 125 | 快速、精确和实现简单,三者只能满足两者 126 | 127 | - 确保 ON 或者 USING 子句中的列上有索引; 128 | - 确保任何的GROUP BY 和ORDER BY 中的表达式只涉及到一个表中的列 129 | 130 | 131 | # 7 Mysql 高级特性 132 | ### 分区表 133 | 134 | ### 视图 135 | 视图本身是一个虚拟表,不存放任何数据 136 | 137 | ### 外键 138 | 139 | ### 在Mysql 内部执行代码 140 | 存储过程,触发器,事件,游标 141 | 142 | ### 查询缓存 143 | 缓存完整的 select 查询结果,命中缓存直接返回结果,跳过了解析、优化和执行阶段。对应用程序透明 144 | 什么情况下使用和服务器压力模型有关,高并发压力环境中查询缓存会导致系统性能下降,甚至僵死。 145 | 146 | 147 | # 8 优化服务器配置 148 | -------------------------------------------------------------------------------- /docs/devops/第一本docker书.md: -------------------------------------------------------------------------------- 1 | # 3. 启动 docker 2 | 3 | 4 | docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 5 | 6 | 7 | # 4. 使用 docker 镜像和仓库 8 | 9 | 10 | 构建 docker image。docker build 方式。 11 | 12 | # 当前的文件夹叫做 build context,docker 在构建镜像时将构建上下文和上下文中的文件和目录上传到 Docker 守护进程 13 | mkdir static_web 14 | cd static_web 15 | touch Dockerfile 16 | 17 | 18 | # Veersion: 0.0.1 19 | FROM ubuntu:14.04 20 | MAINTAINER WNN 'pegasuswang@qq.com' 21 | RUN apt-get update && apt-get install -y nginx 22 | RUN echo 'Hi, I am your container' \ 23 | > /usr/share/nginx/html/index.html 24 | EXPOSE 80 25 | 26 | 每条指令都会创建一个新的镜像层并对镜像进行提交,中间如果某条指令失败了,也能得到一个镜像,可以用来调试。 27 | 28 | # cd static_web 29 | docker build -t="wnn/static_web" . 30 | docker build --no-cache -t="wnn/static_web" . 31 | docker run -d -p 80 --name static_web wnn/static_web nginx -g "daemon off;" 32 | docker run -d -p 8000:80 --name static_web wnn/static_web nginx -g "daemon off;" 33 | 34 | 35 | 常用 dockerfile 命令: 36 | 37 | EXPOSE, ENTRYPOINT, ADD, COPY, VOLUME, WORKDIR, USER, ONBUILD, LABEL, STOPSIGNAL, ARG 38 | ENV 39 | 40 | CMD: 指定容器启动时要运行的命令,RUN 是指定构建时要运行的命令。CMD ["bin/true"] 41 | 命令行中指定的命令会覆盖掉 Dockerfile 中的 CMD。 只能制定一个,多个只会执行最后一个。 42 | 43 | 44 | ENTRYPOINT: 类似CMD,但是不容易 在容器启动时被覆盖。实际上 docker run命令行中指定的任何参数都会被当做参数 45 | 再次传递给ENTRYPOINT指令中指定的命令。 ENTRYPOINT ["/usr/sbin/nginx"] 46 | 47 | 48 | WORKDIR: 从镜像创建新 容器时,在容器内部设置一个工作目录,ENTRYPOINT/CMD 指定的程序会在这个目录下运行。WORKDIR 49 | /opt/webapp 50 | 51 | ENV: 在镜像构建过程中 设置环境变量。 ENV RVM_PATH /home/rvm/ ,之后的 RUN 命令都可以使用这个环境变量。 52 | 53 | 54 | USER: 指定该镜像会以什么样的用户运行。 默认 root 55 | - USER user 56 | - USER user:group 57 | - USER uid 58 | - USER uid:gid 59 | 60 | 61 | VOLUME: 基于镜像创建的容器添加卷。一个卷可以存在于一个或者多个容器内特定的目录,这个目录可以绕过联合文件系统, 62 | 提供如下共享数据或者对数据进行持久化的功能。允许多个容器共享这些内容,及时删除了最后一个使用卷的容器,卷中数据也会持久保存。 63 | VOLUME ["opt/project"] 这条命令将会基于此镜像创建的任何容器创建一个名为 /opt/project 的挂载点。 64 | 65 | 66 | ADD: 用来将构建环境下的文件和目录复制到镜像中。会自动解开归档文件(gzip,bzip2,xz) 67 | ADD会是的构建缓存变得无效, 使得后续指令无法继续使用之前的构建缓存。 68 | 69 | 70 | COPY: 类似 COPY,只关心在构建上线文中复制本地文件,不会做文件提取和解压工作。 COPY conf.d /etc/apache2/ 71 | 72 | 73 | LABEL: 为 docker 镜像添加元数据,键值对形式。LABEL version="1.0" 通过docker inspect 查看 74 | 75 | 76 | STOPSIGNAL: 停止容器的时候发送什么信号给容器,必须是内核中合法信号名称或者数字 77 | 78 | 79 | ARG: docker build 命令运行时传递给构建运行时的变量。通过 docker build --build-arg build=1234 这种形式传递进去 80 | 有一些预定义变量等。 81 | - HTTP_PROXY 82 | - NO_PROXy 83 | 84 | 85 | ONBUILD: 为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被执行。 86 | 87 | 88 | 从容器运行registry: docker run -p 5000:5000 registry:2 89 | 90 | 91 | # 5 在测试中使用 docker 92 | 93 | 94 | 重点是 docker 网络连接的几种方式: Docker Networking, Docker链接 95 | 96 | 97 | # 6 使用 docker 构建服务 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/frontend/CSS_The_Missing_Manual.md: -------------------------------------------------------------------------------- 1 | # 1. HTML and CSS 2 | HTML to Forget: 3 | - 不要用 `` 控制字体显示,用css 4 | - 不要用 b, i标签强调文本 5 | - 不要用table 来布局 6 | - 不要滥用 `
` 7 | -------------------------------------------------------------------------------- /docs/frontend/深入理解bootstrap.md: -------------------------------------------------------------------------------- 1 | ## 1.基础 2 | 3 | css 选择器: 4 | 属性选择器: [attr=value] 5 | 子选择器: .table > thread 6 | 兄弟选择器:.vav-pills >li+li(临近兄弟) .article h1 ~p(普通兄弟) 7 | 伪类::hover :focus :first-child :last-child :nth-child 多个伪类可以一起用 8 | 9 | ## 2.整体架构 10 | - css 12栅格系统 11 | - 基础布局组件,比如排版、代码、表格、按钮、表单等 12 | - jQuery 13 | - 响应式设计 14 | - css 组件 15 | 16 | 栅格系统: 17 | 平分 12 份。 18 | 栅格系统工作原理如下: 19 | - row 必须包含在 .container 中,以便为其赋予合适的对齐方式和内边距 20 | - 使用 row 在水平方向上创建一组 column 21 | - 具体内容应该放置在 column 内,而只有column 可以作为 column 的直接子元素 22 | - 使用 .row .col-sx-4 这种样式快速创建栅格布局 23 | - 通过设置 padding 创见 column 之间的间隔 24 | - 栅格系统中的列是通过指定 1 -12 的值表示其跨越的范围的 25 | 26 | 设计思想: 27 | AO模式。A表示append,O是overwrite。不同名样式叠加,同名样式后面覆盖前面的。 28 | css 八大类型样式: 29 | - 基础样式 30 | - 颜色样式 primary success info warning dangeer ,定义规则是 组件名称-颜色类型 31 | - 尺寸样式:一般4种:超小(xs),小型(sm),普通,大型(lg) 32 | - 状态样式:一些可以点击的元素: active 。注意嵌套元素样式 33 | - 特殊样式:特定类型的组建一般只使用某一种或者几种固定的元素 34 | - 并列元素样式 35 | - 嵌套子元素样式 36 | - 动画样式 37 | 38 | 先从高度等层面考虑这些问题 39 | 40 | js 插件系统: 41 | 检测规则 42 | 43 | 44 | ## 3. css 布局 45 | 46 | 47 | 48 | ## 4. css 组件 49 | 50 | 51 | ## 5. JavaScript 插件 52 | - 动画过度效果:transition.js 53 | - 模态弹窗: modal.js modals.sass。 声明式用法和 javascript 用法 54 | - 下拉式菜单:dropdown.js 55 | - 滚动侦测:scrollspy.js 56 | - 选项卡:tab.js 57 | - 提示框:tooltip.js 58 | - 弹出框:popover.js。默认触发事件是 click 59 | - 按钮:button.js 60 | - 折叠:collapse.js。手风琴风格(accortion) 61 | - 轮播:carousel.js 62 | - 自动定位浮标 affix.js 63 | 64 | 65 | # 7. Win8 磁贴组件开发 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /docs/golang/advanced-go-programming-book/grpc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/advanced-go-programming-book/grpc.png -------------------------------------------------------------------------------- /docs/golang/advanced-go-programming-book/init_order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/advanced-go-programming-book/init_order.png -------------------------------------------------------------------------------- /docs/golang/advanced-go-programming-book/snowflake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/advanced-go-programming-book/snowflake.png -------------------------------------------------------------------------------- /docs/golang/building-microservices-with-go/async.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building-microservices-with-go/async.png -------------------------------------------------------------------------------- /docs/golang/building-microservices-with-go/circuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building-microservices-with-go/circuit.png -------------------------------------------------------------------------------- /docs/golang/building-microservices-with-go/microservice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building-microservices-with-go/microservice.png -------------------------------------------------------------------------------- /docs/golang/building-microservices-with-go/pull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building-microservices-with-go/pull.png -------------------------------------------------------------------------------- /docs/golang/building-microservices-with-go/push.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building-microservices-with-go/push.png -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building_restful_web_services_with_go/flag.png -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/gorestful_demo/dbutils/init-tables.go: -------------------------------------------------------------------------------- 1 | package dbutils 2 | 3 | import "log" 4 | import "database/sql" 5 | 6 | const train = ` 7 | CREATE TABLE IF NOT EXISTS train ( 8 | ID INTEGER PRIMARY KEY AUTOINCREMENT, 9 | DRIVER_NAME VARCHAR(64) NULL, 10 | OPERATING_STATUS BOOLEAN 11 | ) 12 | ` 13 | 14 | const station = ` 15 | CREATE TABLE IF NOT EXISTS station ( 16 | ID INTEGER PRIMARY KEY AUTOINCREMENT, 17 | NAME VARCHAR(64) NULL, 18 | OPENING_TIME TIME NULL, 19 | CLOSING_TIME TIME NULL 20 | ) 21 | ` 22 | const schedule = ` 23 | CREATE TABLE IF NOT EXISTS schedule ( 24 | ID INTEGER PRIMARY KEY AUTOINCREMENT, 25 | TRAIN_ID INT, 26 | STATION_ID INT, 27 | ARRIVAL_TIME TIME, 28 | FOREIGN KEY (TRAIN_ID) REFERENCES train(ID), 29 | FOREIGN KEY (STATION_ID) REFERENCES station(ID) 30 | ) 31 | ` 32 | 33 | func Initialize(dbDriver *sql.DB) { 34 | statement, driverError := dbDriver.Prepare(train) 35 | if driverError != nil { 36 | log.Println(driverError) 37 | } 38 | // Create train table 39 | _, statementError := statement.Exec() 40 | if statementError != nil { 41 | log.Println("Table already exists!") 42 | } 43 | statement, _ = dbDriver.Prepare(station) 44 | statement.Exec() 45 | statement, _ = dbDriver.Prepare(schedule) 46 | statement.Exec() 47 | log.Println("All tables created/initialized successfully!") 48 | } 49 | -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/gorestful_demo/dbutils/models.go: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building_restful_web_services_with_go/gorestful_demo/dbutils/models.go -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/gorestful_demo/railAPIGin/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "database/sql" 5 | "log" 6 | "net/http" 7 | 8 | "github.com/gin-gonic/gin" 9 | _ "github.com/mattn/go-sqlite3" 10 | ) 11 | 12 | // DB Driver visible to whole program 13 | var DB *sql.DB 14 | 15 | // StationResource holds information about locations 16 | type StationResource struct { 17 | ID int `json:"id"` 18 | Name string `json:"name"` 19 | OpeningTime string `json:"opening_time"` 20 | ClosingTime string `json:"closing_time"` 21 | } 22 | 23 | // GetStation returns the station detail 24 | func GetStation(c *gin.Context) { 25 | var station StationResource 26 | id := c.Param("station_id") // 获取路径参数 27 | err := DB.QueryRow("select ID, NAME, CAST(OPENING_TIME as CHAR), CAST(CLOSING_TIME as CHAR) from station where id=?", id).Scan(&station.ID, &station.Name, &station.OpeningTime, &station.ClosingTime) 28 | if err != nil { 29 | log.Println(err) 30 | c.JSON(500, gin.H{ 31 | "error": err.Error(), 32 | }) 33 | } else { 34 | c.JSON(200, gin.H{ 35 | "result": station, 36 | }) 37 | } 38 | } 39 | 40 | // CreateStation handles the POST 41 | func CreateStation(c *gin.Context) { 42 | var station StationResource 43 | // Parse the body into our resrource 44 | if err := c.BindJSON(&station); err == nil { 45 | // Format Time to Go time format 46 | statement, _ := DB.Prepare("insert into station (NAME, OPENING_TIME, CLOSING_TIME) values (?, ?, ?)") 47 | result, _ := statement.Exec(station.Name, station.OpeningTime, station.ClosingTime) 48 | if err == nil { 49 | newID, _ := result.LastInsertId() 50 | station.ID = int(newID) 51 | c.JSON(http.StatusOK, gin.H{ 52 | "result": station, 53 | }) 54 | } else { 55 | c.String(http.StatusInternalServerError, err.Error()) 56 | } 57 | } else { 58 | c.String(http.StatusInternalServerError, err.Error()) 59 | } 60 | } 61 | 62 | // RemoveStation handles the removing of resource 63 | func RemoveStation(c *gin.Context) { 64 | id := c.Param("station-id") // 路径参数 65 | statement, _ := DB.Prepare("delete from station where id=?") 66 | _, err := statement.Exec(id) 67 | if err != nil { 68 | log.Println(err) 69 | c.JSON(500, gin.H{ 70 | "error": err.Error(), 71 | }) 72 | } else { 73 | c.String(http.StatusOK, "") 74 | } 75 | } 76 | 77 | func main() { 78 | var err error 79 | DB, err = sql.Open("sqlite3", "./railapi.db") 80 | if err != nil { 81 | log.Println("Driver creation failed!") 82 | } 83 | dbutils.Initialize(DB) 84 | r := gin.Default() 85 | // Add routes to REST verbs 86 | r.GET("/v1/stations/:station_id", GetStation) 87 | r.POST("/v1/stations", CreateStation) 88 | r.DELETE("/v1/stations/:station_id", RemoveStation) 89 | r.Run(":8000") // Default listen and serve on 0.0.0.0:8080 90 | } 91 | -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/gorestful_demo/railapi.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building_restful_web_services_with_go/gorestful_demo/railapi.db -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/jwt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building_restful_web_services_with_go/jwt.png -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/oauth2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/building_restful_web_services_with_go/oauth2.png -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/urlshortener/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | 6 | "github.com/narenaryan/models" 7 | ) 8 | 9 | func main() { 10 | db, err := models.InitDB() 11 | if err != nil { 12 | log.Println(db) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/urlshortener/main_test.go: -------------------------------------------------------------------------------- 1 | package main_test 2 | 3 | import ( 4 | "net/http" 5 | "testing" 6 | ) 7 | 8 | func TestGetoOriginalURL(t *testing.T) { 9 | response, err := http.Get("http://localhost:8000/v1/short/1") 10 | if http.StatusOK != response.StatusCode { 11 | t.Errorf("Expected response code %d. Got %d\n", http.StatusOK) 12 | } 13 | if err != nil { 14 | t.Errorf("encoutered an error:", err) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/urlshortener/models/models.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "database/sql" 5 | 6 | "log" 7 | 8 | _ "github.com/lib/pq" 9 | ) 10 | 11 | // go get github.com/lib/pq 12 | 13 | func InitDB() (*sql.DB, error) { 14 | var err error 15 | db, err := sql.Open("postgres", "postgres://naren:passme123@localhost/mydb?sslmode=disable") 16 | if err != nil { 17 | return nil, err 18 | } else { 19 | // Create model for our URL service 20 | stmt, err := db.Prepare("CREATE TABLE WEB_URL(ID SERIAL PRIMARY KEY, URL TEXT NOT NULL);") 21 | if err != nil { 22 | log.Println(err) 23 | return nil, err 24 | } 25 | res, err := stmt.Exec() 26 | log.Println(res) 27 | if err != nil { 28 | log.Println(err) 29 | return nil, err 30 | } 31 | return db, nil 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /docs/golang/building_restful_web_services_with_go/urlshortener/utils/encodeutils.go: -------------------------------------------------------------------------------- 1 | // base62 algorithm 2 | 3 | package base62 4 | 5 | import ( 6 | "log" 7 | "math" 8 | "strings" 9 | ) 10 | 11 | /* 12 | 13 | def get_table(): 14 | table1 = [chr(ord('a') + i) for i in range(26)] 15 | table2 = [chr(ord('A') + i) for i in range(26)] 16 | table3 = [str(i) for i in range(10)] 17 | table = table1 + table2 + table3 # 62 进制表 18 | return table 19 | 20 | */ 21 | 22 | const base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 23 | const b = 62 24 | 25 | // ToBase62 encodes the given ID to a base62 string 26 | func ToBase62(num int) string { 27 | r := num % b 28 | res := string(base[r]) 29 | div := num / b 30 | q := int(math.Floor(float64(div))) 31 | for q != 0 { 32 | r = q % b 33 | temp := q / b 34 | q = int(math.Floor(float64(temp))) 35 | res = string(base[int(r)]) + res 36 | } 37 | return string(res) 38 | } 39 | 40 | // ToBase10 decodes a given base62 string to datbase ID 41 | func ToBase10(str string) int { 42 | res := 0 43 | for _, r := range str { 44 | res = (b * res) + strings.Index(base, string(r)) 45 | } 46 | return res 47 | } 48 | 49 | func test() { 50 | x := 100 51 | base62String := base62.ToBase62(x) 52 | log.Println(base62String) 53 | normalNumber := base62.ToBase10(base62String) 54 | log.Println(normalNumber) 55 | } 56 | -------------------------------------------------------------------------------- /docs/golang/concurrency-in-go/channel1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/concurrency-in-go/channel1.png -------------------------------------------------------------------------------- /docs/golang/concurrency-in-go/channel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/concurrency-in-go/channel2.png -------------------------------------------------------------------------------- /docs/golang/concurrency-in-go/decision_tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/concurrency-in-go/decision_tree.png -------------------------------------------------------------------------------- /docs/golang/concurrency-in-go/join_point.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/concurrency-in-go/join_point.png -------------------------------------------------------------------------------- /docs/golang/go-build-web-applications/module1/go-build-web-applications/templates/blog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | {{.Title}} 8 | 9 | 10 |

{{.Title}}

11 |

{{.Content}}

12 |
13 | {{.Date}} 14 |
15 | {{range .Comments}} 16 |
17 |
18 | Comment by {{.Name}} ({{.Email}}) 19 |
{{.CommentText}} 20 |
21 |

Edit

22 |
23 | 24 | 25 | 26 | 27 | 28 |
29 |
30 |
31 | {{end}} 32 | 33 | {{if .Session.Unauthenticated}}
35 |
36 |
37 |
38 |
39 |
40 |
41 | {{end}} 42 | 43 | 44 | 61 | 62 | -------------------------------------------------------------------------------- /docs/golang/go-build-web-applications/module1/go-build-web-applications/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 |

Homepage

{{range .}} 11 | 12 |
13 | {{.Title}} 14 |
15 | 16 |
17 | {{.TruncateText}} 18 |
19 | 20 |
21 | {{.Date}} 22 |
{{end}} 23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/golang/go-build-web-applications/module1/go-build-web-applications/test.py: -------------------------------------------------------------------------------- 1 | import requests 2 | url = 'http://127.0.0.1:9000/api/comments' 3 | resp = requests.post( 4 | url, 5 | data={ 6 | "name": "wnn", 7 | "email": "wnn@qq.com", 8 | "comments": "comment", 9 | "page_id":"2" 10 | } 11 | ) 12 | print(resp.text) 13 | -------------------------------------------------------------------------------- /docs/golang/go-build-web-applications/module2/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "log" 5 | "net/http" 6 | ) 7 | 8 | func main() { 9 | http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 10 | w.Write([]byte(` Chat Let's chat! `)) 11 | }) // start the web server 12 | if err := http.ListenAndServe(":8080", nil); err != nil { 13 | log.Fatal("ListenAndServe:", err) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /docs/golang/go101/channel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/go101/channel.png -------------------------------------------------------------------------------- /docs/golang/go语言学习笔记源码剖析.md: -------------------------------------------------------------------------------- 1 | # 13 准备 2 | 3 | 基于Go 1.5.1,测试环境为Linux AMD64,且不包含32位内容。 4 | 5 | 6 | # 14 引导 7 | 8 | 事实上,编译好的可执行文件真正的执行入口并非我们所写的main.main函数,因为编译器总是会插入一段引导代码,完成诸如命令行参数、运行时初始化等工作,然后才会进入用户逻辑。 9 | 10 | 用使 gdb 调试器进入入口 11 | 12 | 13 | # 15 初始化 14 | 15 | - 所有init函数都在同一个goroutine内执行。 16 | - 所有init函数结束后才会执行main.main函数。 17 | 18 | 19 | # 16 内存分配 20 | 21 | 22 | Go编译器支持逃逸分析(escape analysis),它会在编译期通过构建调用图来分析局部变量是否会被外部引用,从而决定是否可直接分配在栈上。 23 | 编译参数-gcflags"-m"可输出编译优化信息,其中包括内联和逃逸分析。 24 | 25 | 26 | # 17 垃圾回收 27 | 28 | 大事记: 29 | 30 | - 2014/06,Go 1.3:并发清理。 31 | - 2015/08,Go 1.5:三色并发标记。 32 | 33 | 注意:此处所说并发,是指垃圾回收和用户逻辑并发执行。 34 | 35 | 按官方说法,Go GC的基本特征是“非分代、非紧缩、写屏障、并发标记清理”。 36 | 37 | 与之前版本在STW(Stop the world)状态下完成标记不同,并发标记和用户代码同时执行让一切都处于不稳定状态。用户代码随时可能修改已经被扫描过的区域,在标记过程中还会不断分配新对象,这让垃圾回收变得很麻烦。 38 | 39 | 究竟什么时候启动垃圾回收?过早会严重浪费CPU资源,影响用户代码执行性能。而太晚,会导致堆内存恶性膨胀。如何正确平衡这些问题就是个巨大的挑战。 40 | 41 | 所有问题的核心:抑制堆增长,充分利用CPU资源。为此,Go引入一系列举措。 42 | 43 | 三色标记和写屏障、控制器、辅助回收 44 | 45 | 46 | # 18 并发调度 47 | 48 | 49 | +--------------------sysmon---------------//------+ 50 | | | 51 | | | 52 | +---+ +---+-------+ +--------+ +---+---+ 53 | go func() ---> |G| ---> |P|local| <===balance===> |global| <--//--- |P|M| 54 | +---+ +---+-------+ +--------+ +---+---+ 55 | | | | 56 | | +---+ | | 57 | +----> |M| <---findrunnable---+---steal<--//--+ 58 | +---+ 59 | | 1. 语句go func() 创建G 60 | | 2. 放入P本地队列(或平衡到全局队列) 61 | +---execute<-----schedule 3. 唤醒或新建M执行任务 62 | | | 4. 进入调度循环schedule 63 | | | 5. 竭力获取待执行G任务并执行 64 | +-->G.fn-->goexit--+ 6. 清理现场,重新进入调度循环 65 | 66 | 67 | 68 | 69 | 本节介绍与任务执行有关的几种暂停操作: 70 | 71 | Gosched: 可被用户调用的runtime.Gosched将当前G任务暂停,重新放回全局队列,让出当前M去执行其他任务。我们无须对G做唤醒操作,因为它总归会被某个M重新拿到,并从“断点”恢复。 72 | 73 | gopark:与Gosched最大的区别在于,gopark并没将G放回待运行队列。也就是说,必须主动恢复,否则该任务会遗失。 74 | 75 | notesleep:相比gosched、gopark,反应更敏捷的notesleep既不让出M,也就不会让G重回任务队列。它直接让线程休眠直到被唤醒,更适合stopm、gcMark这类近似自旋的场景。 76 | 77 | 78 | Goexit:用户可调用runtime.Goexit立即终止G任务,不管当前处于调用堆栈的哪个层次。在终止前,它确保所有G.defer被执行。 79 | 80 | stopTheWorld:用户逻辑必须暂停在一个安全点上,否则会引发很多意外问题。因此,stopTheWorld同样是通过“通知”机制,让G主动停止。比如,设置“gcwaiting=1”让调度函数schedule主动休眠M;向所有正在运行的G任务发出抢占调度,使其暂停。 81 | 82 | 考参:G-P-M 模型。 83 | -------------------------------------------------------------------------------- /docs/golang/go语言编程之旅/tcpchat/client.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "io" 5 | "log" 6 | "net" 7 | "os" 8 | ) 9 | 10 | func main() { 11 | conn, err := net.Dial("tcp", ":2020") 12 | if err != nil { 13 | panic(err) 14 | } 15 | done := make(chan struct{}) 16 | 17 | go func() { 18 | io.Copy(os.Stdout, conn) 19 | log.Println("done") 20 | done <- struct{}{} 21 | }() 22 | 23 | mustCopy(conn, os.Stdin) 24 | conn.Close() 25 | <-done 26 | 27 | } 28 | 29 | func mustCopy(dst io.Writer, src io.Reader) { 30 | if _, err := io.Copy(dst, src); err != nil { 31 | log.Fatal(err) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /docs/golang/go语言编程之旅/tcpchat/server.go: -------------------------------------------------------------------------------- 1 | // 聊天室 demo 2 | package main 3 | 4 | import ( 5 | "bufio" 6 | "fmt" 7 | "log" 8 | "net" 9 | "strconv" 10 | "time" 11 | ) 12 | 13 | func main() { 14 | // tcp server 监听 15 | listener, err := net.Listen("tcp", ":2020") 16 | if err != nil { 17 | panic(err) 18 | } 19 | 20 | go broadcaster() 21 | 22 | for { 23 | conn, err := listener.Accept() 24 | if err != nil { 25 | log.Println(err) 26 | continue 27 | } 28 | go handleConn(conn) 29 | } 30 | } 31 | 32 | var ( 33 | enteringChannel = make(chan *User) // 记录新用户到来 34 | leavingChannel = make(chan *User) // 离开用户通过该 channel 等级 35 | messageChannel = make(chan string, 8) // 广播用户普通消息. 8 需要自测调整 36 | ) 37 | 38 | // 广播消息:1.新用户进来 2.用户普通消息 3.用户离开 39 | func broadcaster() { 40 | users := make(map[*User]struct{}) 41 | for { 42 | select { 43 | case user := <-enteringChannel: 44 | users[user] = struct{}{} 45 | case user := <-leavingChannel: 46 | delete(users, user) 47 | close(user.MessageChannel) // 避免 goroutine 泄露 48 | case msg := <-messageChannel: 49 | // 给所有在线用户发送消息 50 | for user := range users { 51 | user.MessageChannel <- msg 52 | } 53 | } 54 | } 55 | } 56 | 57 | type User struct { 58 | ID int 59 | Addr string 60 | EnterAt time.Time 61 | MessageChannel chan string // 当前用户发送消息的通道 62 | } 63 | 64 | func (u *User) String() string { 65 | return fmt.Sprintf("User:[%d]", u.ID) 66 | } 67 | 68 | var i int 69 | 70 | func GenUserID() int { 71 | i++ 72 | return i 73 | } 74 | 75 | func handleConn(conn net.Conn) { 76 | defer conn.Close() 77 | 78 | user := &User{ 79 | ID: GenUserID(), 80 | Addr: conn.RemoteAddr().String(), 81 | EnterAt: time.Now(), 82 | MessageChannel: make(chan string, 8), 83 | } 84 | 85 | // 新开一个 goroutine 给用户发送消息 86 | go sendMessage(conn, user.MessageChannel) 87 | 88 | // 给当前用户发送欢迎消息,然后向所有用户告知新用户到来 89 | user.MessageChannel <- "Welcome, " + user.String() 90 | messageChannel <- "user:" + strconv.Itoa(user.ID) + " has enter" 91 | 92 | // 记录到全局用户列表 93 | enteringChannel <- user 94 | 95 | // 循环读取用户输入 96 | input := bufio.NewScanner(conn) 97 | for input.Scan() { 98 | messageChannel <- strconv.Itoa(user.ID) + ": " + input.Text() 99 | } 100 | 101 | if err := input.Err(); err != nil { 102 | log.Println("读取错误:", err) 103 | } 104 | 105 | // 用户离开 106 | leavingChannel <- user 107 | messageChannel <- "user:" + strconv.Itoa(user.ID) + " has left" 108 | } 109 | 110 | func sendMessage(conn net.Conn, ch <-chan string) { 111 | for msg := range ch { 112 | fmt.Fprintln(conn, msg) 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /docs/golang/go语言编程之旅/websocket/client.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "time" 7 | 8 | "nhooyr.io/websocket" 9 | "nhooyr.io/websocket/wsjson" 10 | ) 11 | 12 | func main() { 13 | ctx, cancel := context.WithTimeout(context.Background(), time.Minute) 14 | defer cancel() 15 | 16 | c, _, err := websocket.Dial(ctx, "ws://localhost:2021/ws", nil) 17 | if err != nil { 18 | panic(err) 19 | } 20 | defer c.Close(websocket.StatusInternalError, "client内部错误") 21 | 22 | err = wsjson.Write(ctx, c, "hello websocket server") 23 | if err != nil { 24 | panic(err) 25 | } 26 | 27 | var v interface{} 28 | err = wsjson.Read(ctx, c, &v) 29 | if err != nil { 30 | panic(err) 31 | } 32 | 33 | fmt.Printf("接收到服务端响应: %v\n", v) 34 | c.Close(websocket.StatusNormalClosure, "") 35 | } 36 | -------------------------------------------------------------------------------- /docs/golang/go语言编程之旅/websocket/server.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "log" 7 | "net/http" 8 | "time" 9 | 10 | "nhooyr.io/websocket" 11 | "nhooyr.io/websocket/wsjson" 12 | ) 13 | 14 | func main() { 15 | http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { 16 | fmt.Fprintln(w, "HTTP, hello") 17 | }) 18 | 19 | http.HandleFunc("/ws", func(w http.ResponseWriter, req *http.Request) { 20 | conn, err := websocket.Accept(w, req, nil) 21 | if err != nil { 22 | log.Println(err) 23 | return 24 | } 25 | 26 | defer conn.Close(websocket.StatusInternalError, "内部出错!") 27 | 28 | ctx, cancel := context.WithTimeout(req.Context(), time.Second*10) 29 | defer cancel() 30 | 31 | var v interface{} 32 | err = wsjson.Read(ctx, conn, &v) 33 | if err != nil { 34 | log.Println(err) 35 | return 36 | } 37 | log.Printf("接收到客户端: %v\n", v) 38 | 39 | err = wsjson.Write(ctx, conn, "Hello WebSocket Client") 40 | if err != nil { 41 | log.Println(err) 42 | return 43 | } 44 | conn.Close(websocket.StatusNormalClosure, "") 45 | }) 46 | log.Fatal(http.ListenAndServe(":2021", nil)) 47 | 48 | } 49 | -------------------------------------------------------------------------------- /docs/golang/go语言高并发与微服务实战.md: -------------------------------------------------------------------------------- 1 | # 13 综合实战:秒杀系统的设计与实现 2 | 3 | 秒杀系统三个问题: 4 | 5 | - 瞬时大并发 6 | - 超卖 7 | - 性能问题 8 | 9 | 解决方案: 10 | 11 | - 数据尽量少。减少 cpu 使用 12 | - 请求尽量少 13 | - 路径尽量短:减少中间服务节点数 14 | - 依赖尽量少: 对系统进行分级并且根据级别降级 15 | - 避免单点:无状态化 16 | 17 | 缓存、异步、限流。静态页面、cdn、限流和熔断、降级 18 | -------------------------------------------------------------------------------- /docs/golang/main_init.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/golang/main_init.png -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ../README.md -------------------------------------------------------------------------------- /docs/java/java-basic-introduction.md: -------------------------------------------------------------------------------- 1 | # 1. 入门 2 | 3 | 4 | ```java 5 | class HelloWorld { 6 | public static void main(String [] args) { 7 | System.out.println("hello"); 8 | } 9 | } 10 | ``` 11 | 12 | classpath 环境变量:java虚拟机需要运行一个类,会在定义的路径中寻找所需要的class文件 13 | 自动设置为当前目录。 14 | 15 | 16 | java sourcecode -> class字节码文件(javac compile) -> jvm 将字节码文件加载到内存(类加载器) -> 执行 17 | 18 | 19 | ### package 20 | 21 | java 通过包组织类,声明用 package 22 | 23 | import package.class 24 | import package.* // import all classs 25 | java.util java.net java.io java.awt java.sql 26 | 27 | 28 | ### JVM java virtual Machine 29 | 30 | 解释自己的指令集(字节码)到 cpu 的指令集或者 os 的系统调用,jvm 只关心 class file。 31 | 类文件的组成包括 JVM 指令集,符号表以及一些补助信息。 32 | 33 | ### JRE java runtime environment 34 | 35 | jre 目录有 bin and lib, 可以认为 bin 里就是 jvm, lib 市 jvm 需要的一些类库 36 | 37 | ### JKD java development kit 38 | 39 | java 开发工具包。 jkd 包含 jre, jre 包含 jvm 40 | 41 | 42 | # 2. java 基础 43 | 44 | 类或者接口用大骆驼命名法(Student, StudentName),方法和变量小骆驼(dogName). 45 | 46 | 常量全部大写。(STU_NAME) 47 | 48 | 单行注释 // 多行 /* */ 文档注释(javadoc) 49 | 50 | 51 | 原码:二进制定点表示法 52 | 53 | 反码:正数反码和源码相同,负数的反码是对齐源码逐位取反,但符号位除外 54 | 55 | 补码:正数补码与原码相同,负数补码是其反码末尾加1. 56 | 57 | 58 | 计算机操作的时候, 都是用数据对应的补码来计算的。 59 | 60 | 类型: 61 | 62 | 基本数据类型:数值(byte,short,int,long,float,double);字符(char);布尔(boolean) 63 | 64 | 引用数据类型:类(class); 接口(interface); 数组;枚举类型(enum);注解(Annotation) 65 | 66 | 方法重载:同一个类中允许多个同名方法,只要他们的参数个数或者参数类型不同即可。与返回值类型无关 67 | 68 | 69 | 数组: int[] arr = new int[3]; int[] arr = new int[]{1,2,3} or int[] arr = {1,2,3} 70 | 71 | 包装类:Byte,Short,Int,Long,Float,Double; 大数类:BigInteger, BigDecimal; 字符类:Character 72 | 73 | 74 | # 3。 面向对象 75 | 76 | 封装:属性和行为封装,对外隐藏细节。隔离变化、便于使用、复用性和安全性。 77 | 78 | 继承:扩展类功能,复用性和开发效率。使用 extends继承。java 只允许单继承(继承单个类) 79 | - 子类可以直接访问父类中的非私有属性和行为 80 | - 子类无法继承父类中私有的内容 81 | 82 | 83 | 多态:重写父类方法表现不同行为。子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表和返回值类型. 84 | 85 | java 中方法永远传递值,但是如果是引用类型,传递的就是对象的引用。 86 | 87 | super关键字:用于访问父类的成员变量、方法、和构造方法。 88 | 89 | 90 | - 区分重载(同一个类中同名不同参) 91 | - 重写or 覆盖(override),子类覆盖父类方法 92 | - 无法覆盖父类中的私有方法 93 | - 无法覆盖父类中 static 方法 94 | - 覆盖时,子类方法权限一定要大于等于父类方法权限(更开放权限) 95 | 96 | 子类构造函数默认会执行父类的构造函数,第一行有一个默认的隐士语句:super(). 97 | super() 语句必须要定义在子类构造函数的第一行,父类的初始化动作要先完成。 98 | 99 | final: 可以修饰类(不可被继承)、变量(常量,只能被赋值一次)、 方法(不可以被覆盖)。 100 | 101 | 静态绑定:方法被static/private/final 三个关键字其中之一修饰,执行的静态绑定。 102 | 103 | 多态:允许一个父类类型的变量引用一个子类类型的对象。父类或接口的引用指向或者接收自己的子类对象。 104 | 提高了扩展性,前期定义的代码可以使用后期的内容,但是不能使用后期子类*特有*的内容 105 | 106 | instanceof: 用于判断对象的具体类型,只能用于引用数据类型判断。通常在向下转型前用于健壮性判断。. 107 | if (a instanceof Cat) 108 | 109 | 110 | - 成员变量:编译和运行时都参考等号左边。 111 | - 成员函数:编译看左边, 运行看右边。 动态绑定 112 | - 静态函数: 编译和运行都看左边 113 | -------------------------------------------------------------------------------- /docs/lecture/Gopher/Concurrency_Patterns_in_Go.md: -------------------------------------------------------------------------------- 1 | 地址: https://www.youtube.com/watch?v=rDRa23k70CU 2 | 3 | # Go's concurrency toolset 4 | 5 | - goroutines 6 | - channels 7 | - select 8 | - sync package 9 | -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go_Error/codes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go_Error/codes.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go_Error/contextapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go_Error/contextapi.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go_Error/contextbest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go_Error/contextbest.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go_Error/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go_Error/error.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go_Error/go业务基础库之Error&Context.md: -------------------------------------------------------------------------------- 1 | https://www.youtube.com/watch?v=N_00d3qUfQY 2 | 3 | go业务基础库之Error&Context 4 | 5 | 6 | # Error-Background 7 | 8 | - 错误检查和打印 9 | - 分层开发导致处处打印 10 | - 难以获取堆栈关联 11 | - 根因丢失 12 | 13 | - 业务错误处理 14 | - API 中逻辑标识处理 15 | - API 中错误消息展示 16 | - API 中业务的 Hint 数据 17 | 18 | 19 | # Error-Handle Error 20 | 21 | - 追加上下文 22 | - WithStack/Warp 来保存堆栈 23 | - WithMessage 来定义消息 24 | 25 | ```go 26 | // github.com/pkg/errors 27 | _, err := ioutil.ReadAll(r) 28 | if err != nil { 29 | return errors.Wrap(err, "read failed") 30 | } 31 | ``` 32 | 33 | - 根因追踪 34 | - Cause 获取根因,用于 Sentinel errors 逻辑处理 35 | 36 | 37 | 38 | # Error-Best practice 39 | 40 | 41 | ![](./error.png) 42 | 43 | - 集中处理错误,errorgroup 44 | - 容易用错返回的context 45 | - 扇出没有控制 46 | - 业务代码容易 panic 47 | 48 | # Error-Handle Error 49 | 50 | ![](./codes.png) 51 | 52 | # Context-Background 53 | 54 | - 超时 & 取消 55 | - 业务库从无到有 56 | - 可用性:超时 57 | - 可用性:取消 58 | 59 | - 元数据传递 60 | - 同进程:同步生命周期传递 61 | - 同进程:异步生命周期传递 62 | - 跨进程:网络传递 63 | 64 | # Context-Context With API 65 | 66 | ![](./contextapi.png) 67 | 68 | ![](./contextbest.png) 69 | -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go同步和并发设计模式/bug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go同步和并发设计模式/bug.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go同步和并发设计模式/channel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go同步和并发设计模式/channel.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go同步和并发设计模式/happen-before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go同步和并发设计模式/happen-before.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go同步和并发设计模式/mutex_happen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go同步和并发设计模式/mutex_happen.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go同步和并发设计模式/waitgroup_happen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/Go同步和并发设计模式/waitgroup_happen.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/Go在花椒直播业务场景下的微服务应用/note.md: -------------------------------------------------------------------------------- 1 | https://www.youtube.com/watch?v=oejfsK3d2o0 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/lecture/Gopher/哔哩哔哩的go微服务实战/note.md: -------------------------------------------------------------------------------- 1 | # 微服务演进 2 | 3 | 巨石架构:部署难;升级痛苦 4 | 5 | 步骤: 6 | 7 | - 梳理业务边界。 8 | - 拆分服务,周边业务(观看历史,收藏)。 9 | - 保持 API 兼容 10 | - 让相关方迁移,请人家吃烧烤 11 | 12 | ![业务](业务.png) 13 | 14 | - 资源隔离部署 15 | - 不要和老代码一同部署 16 | 17 | - 内外网服务隔离 18 | 19 | - RPC框架(基于netrpc改造,加上context/超时) 20 | - 序列化(GOB)。语言统一 21 | - 上下文管理(超时控制)。一堵就挂掉 22 | - 拦截器(鉴权,统计,限流) 23 | - 服务注册(zookeeper) 24 | - 负载均衡(客户端) 25 | 26 | - API Gateway 27 | - 统一&聚合协议 28 | - errgroup 并行调用 29 | - 业务隔离 30 | - 熔断,降级,限流等高可用 31 | 32 | 33 | # 高可用 34 | 35 | - 隔离 36 | 37 | ![](隔离.png) 38 | 39 | - 超时 40 | 41 | ![](超时.png) 42 | 43 | - 限流 44 | 45 | ![](限流.png) 46 | 47 | - 降级 48 | 49 | ![](降级.png) 50 | 51 | - 容错(netflix java 代码改写) 52 | 53 | ![](容错.png) 54 | 55 | 56 | 57 | # 中间件 58 | 59 | - databus (基于kafka) 60 | - canal (mysql replication) 61 | - bilitw (基于 twemproxy) 62 | - bfs (facebook haystack, opencv) 63 | - config-service 64 | - dapper (google dapper) 65 | 66 | 67 | # 持续集成和交付 68 | 69 | - 语义化版本控制 70 | - 微服务 71 | 72 | # 运维体系 73 | 74 | 75 | # 内容: 76 | 77 | - https://www.youtube.com/watch?v=wC-EIYJw4nk 78 | -------------------------------------------------------------------------------- /docs/lecture/Gopher/哔哩哔哩的go微服务实战/业务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/哔哩哔哩的go微服务实战/业务.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/哔哩哔哩的go微服务实战/容错.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/哔哩哔哩的go微服务实战/容错.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/哔哩哔哩的go微服务实战/超时.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/哔哩哔哩的go微服务实战/超时.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/哔哩哔哩的go微服务实战/降级.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/哔哩哔哩的go微服务实战/降级.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/哔哩哔哩的go微服务实战/限流.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/哔哩哔哩的go微服务实战/限流.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/哔哩哔哩的go微服务实战/隔离.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/Gopher/哔哩哔哩的go微服务实战/隔离.png -------------------------------------------------------------------------------- /docs/lecture/Gopher/基于Go语言的大规模微服务框架设计/note.md: -------------------------------------------------------------------------------- 1 | 基于Go语言的大规模微服务框架设计 2 | 3 | 4 | 5 | 标志性框架: 6 | 7 | - Web 服务框架:MVC 架构 (ASP.Net, Rails) 8 | - Web 服务框架:SaaS 与 RESTful (Sinatra) 9 | - 微服务框架: RPC服务(Thrift) 10 | - 微服务架构:容器化与FaaS (Serveless, Istio) 11 | 12 | 13 | 大型微服务框架设计要点: 14 | 15 | - 屏蔽业务无关通用技术细节 16 | - 功能:服务治理,虚拟化,水平扩容,问题定位,性能压测,系统监控,兼容遗留系统。。。 17 | - 工具链:项目模板,代码生成器,文档生成器,发布打包脚本。。 18 | - 设计风格:interceptors,组合模式,依赖注入 19 | 20 | - 让不可靠调用变得可靠 21 | - rpc调用 - 函数调用 22 | - 访问基础服务 - 访问本地存储 23 | - 服务拆分/合并- 类拆分/合并 24 | 25 | 26 | - https://www.youtube.com/redirect?redir_token=M8Xqv9W1kEn6KadyOmxGSnQcLrh8MTU2NjE4NTkxMUAxNTY2MDk5NTEx&q=https%3A%2F%2Fgithub.com%2Fgopherchina%2Fconference&event=comments&stzid=UgwebnM0VQWV5JiWpgd4AaABAg.8wLkBHZICb78wM1YSOcPap 27 | - https://github.com/gopherchina/conference 28 | -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/codes/README.md: -------------------------------------------------------------------------------- 1 | # MIT 6.824 分布式系统工程代码参考 2 | 3 | - https://github.com/WenbinZhu/mit-6.824-labs 4 | - https://github.com/chaozh/MIT-6.824 5 | - https://segmentfault.com/a/1190000020548214 6 | -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/codes/lab1/lab1.md: -------------------------------------------------------------------------------- 1 | # Lab 1 MapReduce 2 | 3 | - https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 4 | - https://pdos.csail.mit.edu/6.824/papers/mapreduce.pdf 5 | 6 | 参考: 7 | 8 | - [Journey to MIT 6.824 - Lab 1 MapReduce](https://medium.com/codex/journey-to-mit-6-824-lab-1-mapreduce-ebe58800ef9e) 9 | 10 | - src/mr/coordinator.go to add the logic to maintain the status 11 | - src/mr/worker.go to add the logic to execute each map/reduce job. 12 | - src/mr/rpc.go to add the RPC calls argument and reply contract 13 | -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/images/3_gfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/MIT6.824分布式系统工程/images/3_gfs.png -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/images/4-0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/MIT6.824分布式系统工程/images/4-0.jpeg -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/images/4-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/MIT6.824分布式系统工程/images/4-1.jpeg -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/images/6_7_raft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/MIT6.824分布式系统工程/images/6_7_raft.png -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/paper/README.md: -------------------------------------------------------------------------------- 1 | MIT 6.824 分布式系统工程论文,不放到版本库里了。 2 | 3 | - http://nil.csail.mit.edu/6.824/2020/schedule.html 课程表,课程表包含 youbute 视频链接,讲义和论文pdf地址,可以自行下载论文 pdf 4 | -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/paper/The_Google_File_System.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/MIT6.824分布式系统工程/paper/The_Google_File_System.pdf -------------------------------------------------------------------------------- /docs/lecture/MIT6.824分布式系统工程/tutorial.md: -------------------------------------------------------------------------------- 1 | 入门分布式系统资料: 2 | 3 | - https://zhuanlan.zhihu.com/p/338161857 深度探索分布式理论经典论文 4 | - http://duanple.com/?p=170 分布式系统领域经典论文翻译集 5 | 6 | - https://jishuin.proginn.com/p/763bfbd66f90 7 | - https://www.qtmuniao.com/2021/05/16/distributed-system-material/ 分布式系统学习资料汇总 8 | - https://strikefreedom.top/distributed-transaction-theorems-uncovering 分布式事务/系统之底层原理揭秘 9 | - https://www.hitzhangjie.pro/blog/2021-07-01-%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E5%B7%A5%E7%A8%8B%E5%B8%88roadmap/ 分布式系统工程师roadmap 10 | - https://www.the-paper-trail.org/post/2014-08-09-distributed-systems-theory-for-the-distributed-systems-engineer/ 11 | 12 | -------------------------------------------------------------------------------- /docs/lecture/readme.md: -------------------------------------------------------------------------------- 1 | # 计算机名校课程 2 | 3 | 可以坚持看一些计算机名校的公开课,提升视野 4 | 5 | - https://juejin.im/post/5daea6dcf265da5ba7453c74 6 | - https://www.jianshu.com/p/8f2646a825e8 7 | - https://github.com/apachecn/awesome-cs-courses-zh 8 | -------------------------------------------------------------------------------- /docs/lecture/技术演讲/左耳朵耗子-我这技术二十年.md: -------------------------------------------------------------------------------- 1 | # 两个重要阶段 2 | 3 | - 20-30岁。努力学习阶段。把时间花在解决问题上。一定要练就的技能:解决大多数人不能解决的问题。蛮干没有前途 4 | - 30-40岁。中坚力量。 5 | 6 | # 三条路 7 | 8 | - 职场。去顶尖公司。真正的创业公司(技术体系已经形成) 9 | - 经历 10 | - 自由。 11 | 12 | # 重要的标志-Leadership 13 | 14 | - 两个能力。 15 | - 高效学习能力。基础扎实,英文,前沿思考,问题和技术本质,善于思辨,独立思考 16 | - 解决问题的能力。犯过很多错误,能够防火而不是救火 17 | 18 | - 两个标志 19 | - 帮人解问题。你能告诉大家这件事该怎么办? 20 | - 被人依赖。大多人在关键决定找你咨询 21 | 22 | # 学习金字塔 23 | 24 | 教授他人是吸收率最高的学习方式 25 | 26 | # 学无止境 27 | 28 | 基础非常重要,一通百通。 29 | 30 | # 如何让自己有竞争力 31 | 32 | 特长、兴趣、勤奋、环境 33 | 34 | 35 | # 软件工程三个核心 36 | 37 | - 服务SLA。高可用系统;自动化运维 38 | - 能力和资源重用。软件模块的重用;运行环境和资源的重用 39 | - 过程自动化。软件生产流水线;软件运维自动化 40 | 41 | # 提高性能 42 | 43 | - 加缓存。缓存系统:缓存分区;更新;命中 44 | - 负载均衡。网关系统:负载均衡;服务路由;服务发现 45 | - 异步调用。异步系统:消息队列;消息持久;异步事务 46 | - 数据镜像。数据镜像: 数据同步;读写分离;数据一致性 47 | - 数据分区。分区策略;数据访问层;数据一致性 48 | 49 | # 稳定性 50 | 51 | - 服务拆分。服务治理:调用;依赖;隔离 52 | - 服务冗余。服务调度:弹性伸缩;故障迁移;服务发现 53 | - 限流降级。限流降级:异步队列;降级控制;服务熔断 54 | - 高可用架构。多租户系统;灾备多活;高可用服务 55 | - 高可用运维。全栈监控;DevOps;自动化运维 56 | 57 | # 软件和能力重用 58 | 59 | - 业务抽象。软件抽象:模型抽象;流程抽象;数据抽象; 60 | - 单一简化。简化系统:KISS原则;单一职责;高内聚 61 | - 解耦合。微服务化;标准协议;反转控制 62 | - 平台化。PaaS平台:中间件;中台系统;API 接口 63 | - 标准化。系统标准:协议方法;规则约定;取舍原则 64 | 65 | # 状态/数据调度 66 | 67 | Google IO 《Transaction Across DataCenter》 68 | 69 | # 服务划分原则 70 | 71 | 《领域驱动设计》限界上下文。有明显边界限定的特定职责,大家不会超过这个边界干涉对方。 72 | 73 | - 单一职责。相同原因变化的东西放到一起,因为不同原因变化的分离开 74 | - 自治性。一个微服务可以无依赖地对外提供服务 75 | - 隔离关键和重要业务。关键和重要业务和不重要的隔离,有利用系统稳定性 76 | - 事务和数据一致性边界。把需要完整事务或者有数据一致性耦合的功能据合在一起 77 | - 隔离变化。把一些高度变化不可控的拆分出去,保证关键业务稳定性 78 | - 与组织结构相匹配。服务边界和组织结构应该是匹配的 79 | - 按团队大小。8-16 人团队维护一个系统 80 | 81 | # 14 条 Leadership Principle 82 | 83 | - 客户第一 84 | - 主人翁精神 85 | - 创新和简化 86 | - 做正确的决定 87 | - 好奇求知 88 | - 招最好的人 89 | - 坚持高标准 90 | - 富有大局观 91 | - 行动派 92 | - 节俭 93 | - 赢得他人信任 94 | - 关注细节 95 | - 敢于谏言,服从大局 96 | - 结果驱动 97 | 98 | # 更多企业文化 99 | 100 | - 信条文化(Tenets Culture) 101 | 102 | - 工程师文化 - 自动化和简化 103 | - 至少减少 20% 支持性工作和人员 104 | - 小团队全栈工程师文化 105 | - Principle Talk 106 | - 强大的员工调查表 107 | - 大量自动化工具 108 | 109 | - 产品文化 110 | - Happy Case 111 | - Working Backwards 112 | - Web Service Everything 113 | - T-Shirt Size Estimation 114 | 115 | - 员工内部转岗文化 116 | 117 | # Amazon 企业文化 118 | 119 | - Eat your own Dog Food 120 | - Celebrate the Simplification and Automation 121 | - Operational Excellence - No " Kitchen Sink" Approach 122 | - Tenets Culture - Every team, product, department has the its tenets 123 | - Focus on SLA - define the key metrics of each services 124 | - Working Backwards 125 | - Write 3 Docs - Press Release, User Manual, FAQ 126 | - NO pictures or diagrams, limited to two pages. 127 | 128 | # 技术研发 129 | 130 | - 全栈文化。技术团队按照产品功能分工(开发做所有事,包括测试和运维) 131 | - 单分支开发 132 | - 服务化和运维优先 133 | - 自动化和简化 134 | - On Call 文化 135 | - 每年工作计划一半以上是技术需求 136 | -------------------------------------------------------------------------------- /docs/lecture/网课/300分钟吃透分布式缓存/feed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/300分钟吃透分布式缓存/feed.png -------------------------------------------------------------------------------- /docs/lecture/网课/300分钟吃透分布式缓存/redis_dict.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/300分钟吃透分布式缓存/redis_dict.png -------------------------------------------------------------------------------- /docs/lecture/网课/300分钟吃透分布式缓存/redis数据结构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/300分钟吃透分布式缓存/redis数据结构.png -------------------------------------------------------------------------------- /docs/lecture/网课/300分钟吃透分布式缓存/微博分布式redis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/300分钟吃透分布式缓存/微博分布式redis.png -------------------------------------------------------------------------------- /docs/lecture/网课/300分钟吃透分布式缓存/微博多区数据一致性案例.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/300分钟吃透分布式缓存/微博多区数据一致性案例.png -------------------------------------------------------------------------------- /docs/lecture/网课/300分钟吃透分布式缓存/海量计数服务架构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/300分钟吃透分布式缓存/海量计数服务架构.png -------------------------------------------------------------------------------- /docs/lecture/网课/300分钟吃透分布式缓存/缓存架构设计考量点.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/300分钟吃透分布式缓存/缓存架构设计考量点.png -------------------------------------------------------------------------------- /docs/lecture/网课/DDD实战课/DDD与中台.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/DDD实战课/DDD与中台.png -------------------------------------------------------------------------------- /docs/lecture/网课/DDD实战课/DDD分层架构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/DDD实战课/DDD分层架构.png -------------------------------------------------------------------------------- /docs/lecture/网课/DDD实战课/服务的组合和封装.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/DDD实战课/服务的组合和封装.png -------------------------------------------------------------------------------- /docs/lecture/网课/DDD实战课/聚合设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/DDD实战课/聚合设计.png -------------------------------------------------------------------------------- /docs/lecture/网课/DDD实战课/通用语言设计.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/DDD实战课/通用语言设计.jpg -------------------------------------------------------------------------------- /docs/lecture/网课/DDD实战课/领域.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/DDD实战课/领域.png -------------------------------------------------------------------------------- /docs/lecture/网课/java并发编程78讲/cpu_cache.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/java并发编程78讲/cpu_cache.png -------------------------------------------------------------------------------- /docs/lecture/网课/java并发编程78讲/主内存工作内存.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/java并发编程78讲/主内存工作内存.png -------------------------------------------------------------------------------- /docs/lecture/网课/java并发编程78讲/线程池参数.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/java并发编程78讲/线程池参数.png -------------------------------------------------------------------------------- /docs/lecture/网课/java并发编程78讲/线程状态.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/java并发编程78讲/线程状态.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/IO性能指标.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/IO性能指标.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/IO排查.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/IO排查.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/IO根据工具查指标.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/IO根据工具查指标.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/IO根据指标找工具.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/IO根据指标找工具.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/cpu指标原理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/cpu指标原理.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/tcpdump过滤表达式类.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/tcpdump过滤表达式类.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/tcpdump选项类.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/tcpdump选项类.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/内存分析过程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/内存分析过程.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/内存性能指标.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/内存性能指标.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/内存根据工具查指标.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/内存根据工具查指标.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/内存根据指标找工具.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/内存根据指标找工具.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/根据工具查指标.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/根据工具查指标.png -------------------------------------------------------------------------------- /docs/lecture/网课/linux性能优化/根据指标找工具.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/linux性能优化/根据指标找工具.png -------------------------------------------------------------------------------- /docs/lecture/网课/中间件核心技术与实战/rocketmq顺序消费优化.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/中间件核心技术与实战/rocketmq顺序消费优化.jpg -------------------------------------------------------------------------------- /docs/lecture/网课/中间件核心技术与实战/分布式中间件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/中间件核心技术与实战/分布式中间件.png -------------------------------------------------------------------------------- /docs/lecture/网课/中间件核心技术与实战/数据隔离机制.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/中间件核心技术与实战/数据隔离机制.jpg -------------------------------------------------------------------------------- /docs/lecture/网课/中间件核心技术与实战/消息中间件对比.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/中间件核心技术与实战/消息中间件对比.png -------------------------------------------------------------------------------- /docs/lecture/网课/分布式技术原理与实战45讲/系统监控.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/分布式技术原理与实战45讲/系统监控.png -------------------------------------------------------------------------------- /docs/lecture/网课/架构设计面试精讲/SLA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/架构设计面试精讲/SLA.png -------------------------------------------------------------------------------- /docs/lecture/网课/架构设计面试精讲/应急处理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/架构设计面试精讲/应急处理.png -------------------------------------------------------------------------------- /docs/lecture/网课/架构设计面试精讲/断路器.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/架构设计面试精讲/断路器.png -------------------------------------------------------------------------------- /docs/lecture/网课/深入理解sentinel/深入理解sentinel.md: -------------------------------------------------------------------------------- 1 | # 01 一次服务雪崩的排查经历 2 | 3 | - Jedis 抛出 Read time out 的原因:由于缓存的 value 字符串太长,网络传输数据包大,导致 Jedis 执行 get 命令耗时长。 4 | - 服务 A 出现 RPC 调用超时的原因:业务代码的缺陷、并发量的突增,以及缓存设计缺陷导致 Jedis 读操作耗时长,导致服务 B 接口执行耗时超过 3 秒,从而导致服务 A 远程 RPC 调用超时。 5 | - 服务 A 出现服务 B 拒绝请求异常的原因:服务 A 调用超时触发 dubbo 超时重试,原本并发量就已经很高,加上耗时的接口调用,服务 B 业务线程池的线程全部处于工作状态,服务 B 已经高负荷运行,而 Dubbo 的超时重试又导致服务 B 并发量翻倍,简直雪上加霜,服务 B 处理不过来只能拒绝执行服务 A 的请求。 6 | - 服务 A 奔溃的原因:服务 B 的不可用导致服务 A 处理不过来客户端发来的请求,而服务 A 又没有拒绝客户端的请求,客户端请求源源不断,最后服务 A 请求堆积,导致 SocketChannel 占用的文件句柄达到上限,服务 A 就奔溃了。 7 | 8 | # 02 为什么需要服务降级以及常见的几种降级方式 9 | 10 | 常见的服务降级实现方式有:开关降级、限流降级、熔断降级。 11 | 12 | - 限流降级: 直接拒绝;匀速排队;冷启动 13 | - 熔断降级 14 | - 在每秒请求异常数超过多少时触发熔断降级 15 | - 在每秒请求异常错误率超过多少时触发熔断降级 16 | - 在每秒请求平均耗时超过多少时触发熔断降级 17 | - 开关降级。人工开关(配置中心或者redis)。或者定时服务分时段开启 18 | 19 | # 03 为什么选择 Sentinel,Sentinel 与 Hystrix 的对比 20 | 21 | Sentinel Hystrix 22 | 隔离策略 信号量隔离 线程池隔离/信号量隔离 23 | 熔断降级策略 基于响应时间或失败比率 基于失败比率 24 | 实时指标实现 滑动窗口 滑动窗口(基于 RxJava) 25 | 规则配置 支持多种数据源 支持多种数据源 26 | 扩展性 多个 SPI 扩展点 插件的形式 27 | 基于注解的支持 支持 支持 28 | 限流 基于 QPS,支持基于调用关系的限流 有限的支持 29 | 流量整形 支持慢启动、匀速器模式 不支持 30 | 系统负载保护 支持 不支持 31 | 控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善 32 | 常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC 等 Servlet、Spring Cloud Netflix 33 | 34 | # 04 Sentinel 基于滑动窗口的实时指标数据统计 35 | 36 | ```java 37 | public class MetricBucket { 38 | /** 39 | * 存储各事件的计数,比如异常总数、请求总数等 40 | */ 41 | private final LongAdder[] counters; 42 | /** 43 | * 这段事件内的最小耗时 44 | */ 45 | private volatile long minRt; 46 | } 47 | ``` 48 | 49 | # 05 Sentinel 的一些概念与核心类介绍 50 | 51 | - 资源:资源是 Sentinel 的关键概念。资源,可以是一个方法、一段代码、由应用提供的接口,或者由应用调用其它应用的接口。 52 | - 规则:围绕资源的实时状态设定的规则,包括流量控制规则、熔断降级规则以及系统保护规则、自定义规则。 53 | - 降级:在流量剧增的情况下,为保证系统能够正常运行,根据资源的实时状态、访问流量以及系统负载有策略的拒绝掉一部分流量。 54 | 55 | 56 | # 16 Sentinel 动态数据源:规则动态配置 57 | 58 | - sentinel-datasource-extension:定义动态数据源接口、提供抽象类 59 | - sentinel-datasource-redis:基于 Redis 实现的动态数据源 60 | - sentinel-datasource-zookeeper: 基于 ZooKeeper 实现的动态数据源 61 | 62 | 63 | # 19 Sentinel 集群限流的实现(下) 64 | 65 | sentinel-core 模块的 cluster 包下定义了实现集群限流功能的相关接口: 66 | 67 | - TokenService:定义客户端向服务端申请 token 的接口,由 FlowRuleChecker 调用。 68 | - ClusterTokenClient:集群限流客户端需要实现的接口,继承 TokenService。 69 | - ClusterTokenServer:集群限流服务端需要实现的接口。 70 | - EmbeddedClusterTokenServer:支持嵌入模式的集群限流服务端需要实现的接口,继承 TokenService、ClusterTokenServer。 71 | 72 | 73 | TokenService 接口的定义如下: 74 | 75 | ``` 76 | public interface TokenService { 77 | TokenResult requestToken(Long ruleId, int acquireCount, boolean prioritized); 78 | TokenResult requestParamToken(Long ruleId, int acquireCount, Collection params); 79 | } 80 | ``` 81 | -------------------------------------------------------------------------------- /docs/lecture/网课/高并发系统设计40问/监控指标.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/高并发系统设计40问/监控指标.png -------------------------------------------------------------------------------- /docs/lecture/网课/高并发系统设计40问/硬件延迟.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/高并发系统设计40问/硬件延迟.png -------------------------------------------------------------------------------- /docs/lecture/网课/高并发系统设计40问/系统可用性.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/高并发系统设计40问/系统可用性.png -------------------------------------------------------------------------------- /docs/lecture/网课/高并发系统设计40问/阿里系统分层规约.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/lecture/网课/高并发系统设计40问/阿里系统分层规约.png -------------------------------------------------------------------------------- /docs/network/beejs_guide_to_network_programming.md: -------------------------------------------------------------------------------- 1 | little book http://beej.us/guide/bgnet/ 2 | -------------------------------------------------------------------------------- /docs/network/tcp_ip详解卷一/arp.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/network/tcp_ip详解卷一/arp.jpeg -------------------------------------------------------------------------------- /docs/network/tcp_ip详解卷一/tcp_ip详解卷一.md: -------------------------------------------------------------------------------- 1 | # 3 IP 协议 2 | 3 | ### 3.5 子网掩码: 4 | 5 | 网络号--子网号--主机号 6 | 7 | 为什么需要子网掩码:除了 ip 地址,还需要知道有多少比特用于子网号和主机号。掩码就是用来获取这个界限。 8 | 掩码是一个32bit 值,其中值为1 的比特留给网络号和子网号,为0的留给主机号。 9 | 10 | # 4 ARP 协议 11 | 12 | 可以用 arp -a 查看arp 告诉缓存。 13 | 14 | ![](./arp.jpeg) 15 | -------------------------------------------------------------------------------- /docs/psychology/反脆弱.md: -------------------------------------------------------------------------------- 1 | # 1.心态决定一切 2 | 3 | "稀缺心态" 是如何阻碍穷人变得富有的: 4 | - 忽略长期投资(教育、健康、理财)的重要性-管窥效应 5 | - 借用-透支未来 6 | - 消耗带宽(能同时处理多件事情的容量) 7 | 8 | 摆脱稀缺心态: 9 | - 节约带宽:减少生活琐事。严格遵循时间表,固定时间做相同的事情 10 | - 不要透支 11 | - 每天多做重要但不紧急的事情:设置提醒 12 | 13 | 大量心理研究证实,完美主义心态会导致焦虑和抑郁。 14 | 发展性思维和固定性思维。 15 | 16 | # 2.做一个会折腾的人 17 | 18 | 心流(Flow) 19 | 20 | 折腾有趣的事情 21 | 盖洛普优势识别器 22 | 23 | 砍掉可以做但不应该做的事情。 24 | 缩减和极致 25 | 关键问题就是大局和焦点的结合 26 | 提出好问题才能找到好答案 27 | 28 | 所谓迎难而上解决问题,态度上要乐于沟通,手段上要穷尽一切可能。 29 | 穷人手里有多少资源才敢做多大事,富人先想到要做一件什么事情,目标定下来后,考虑怎样筹措资源。 30 | SWOT分析:S(Strengths), W(Weaknesses), O(Opportunities), T(Threats) 31 | 32 | # 3.不平庸的活法 33 | 34 | 稳定的自我价值感不会因为外界否认或者质疑改变。 35 | 36 | # 4.所谓强大,就是能管好自己的情绪 37 | 38 | 心理成熟的5大标志: 39 | - 感受情绪,不假装掩盖 40 | - 判断的独立 41 | - 决定的独立 42 | - 经济的独立 43 | - 有边界感 44 | 45 | # 5. 人一生能只爱一个人吗 46 | 47 | 对的婚姻有一个基础,三观比较一致。 48 | 健康、长期、稳定的关系通常是『友伴行』而不是『激情型』 49 | 50 | 我们为何在关系中找不到存在感: 51 | - 重复早期经历中的伤口 52 | - 对身边人、事情的不合理认知 53 | - 对人的绝对化要求 54 | - 夸大挫折的后果 55 | - 对人的评价以偏概全 56 | 57 | 58 | # 6. 有什么样的父母,就有什么样的"复印件" - 孩子 59 | -------------------------------------------------------------------------------- /docs/psychology/情商.md: -------------------------------------------------------------------------------- 1 | 看了戈尔曼写的的《情感智商》,受到不少启发。一直都是一个情商很低的人,表现在不善交际、自我情绪管理不好等方面。之前低情商一直给我带来一些人际和情绪方面的困扰,这本书也给出了一些答案。 2 | 3 | ___ 4 | ####什么是情商? 5 | 戈尔曼在这本书中提到了关于情商的五个方面: 6 | 1. 了解自我。自我觉知:当某种情绪刚一出现时便能察觉乃情感智商的核心。监控情绪时时刻刻变化的能力是自我理解与心理领悟力的基础对。对自我的情绪有更大的把握性就能更好地指导自己的人生,更准确地决策婚姻、职业之类。 7 | 2. 管理自我。调控自我的情绪,使之适时适地适度。这种能力建立在自我觉知的基础上。是如何有效摆脱焦虑、沮丧、激怒、烦恼等因失败而产生的消极情绪侵袭的能 力。这一能力的低下将使人总是陷于痛苦情绪的漩涡中;反之,这一能力高者可从人生的挫折和失败中迅速跳出,重整旗鼓,迎头赶上。 8 | 3. 自我激励。服从于某目标而调动、指挥情绪的能力。要想集中注意力、自我激励、自我把握、发挥创造性, 这一能力必不可少。任何方面的成功都必需有情绪的自我控制,延迟满足,压抑冲动。能够自我激励,积极热情地投入,才能保证取得杰出的成就。具备这种能力的人,无论从事什么行业都更有效率、更富于成效。 9 | 4. 识别他人情绪。移情,是在情感的自我觉知基础上发展起来的又一种能力,是最基本的人际关系能力。具有移情能力的人能通过细微的社会信号,敏锐地感受到他 人的需求与欲望。这一能力更能满足如照料、教育、销售或管理职业类的要求。 10 | 5. 处理人际关系。大体而言,人际关系艺术就是调控与他人的情绪反应的技巧。人际关系能力可强化一个人的受社会欢迎程度、领导权威、人际互动的效能等。擅长处理人际关系者,凭借与他人的和谐关系即可事事顺利,他们也就是所谓社会明星。 11 | 12 | 仔细反思了一下,发现之前无论是自我觉知还是人际处理,没有能做好的。自我管理做不好容易导致悲观、焦虑等情绪,人际关系不和谐会有强烈的孤独感,而自我激励水平低则很难从负面情绪中恢复出来。低情商无疑会严重影响一个人的幸福感。 13 | 14 | ___ 15 | ####江山易改,本性难移? 16 | 随着技术手段的进步,研究人员可以从神经结构、解剖学等角度研究人的心理状态,毕竟从本质上来说,人类的思维活动也是细胞理化反应的结果。基本上,所有的情绪都是进化配置好的程序,是驱动我们应付环境、即刻行动的反应冲动。比如,愤怒时血液涌向手部,便于抓住武器,击打敌人。此时心率加快,肾上腺素类激素分泌猛增,以产生强大的能量,应付激烈的行动;爱、温柔、性满足则激活副交感神经系统,在生理反应上 刚好与恐惧和愤怒引发的“战斗或逃跑”反应相反。副交感神经系统主要是“放松反应”,使机体整个处于一种平静和满足的状态,乐于合作、配合;悲哀的主要功能是帮助调适严重的失落感,诸如最亲近的人逝去或重大失败等。 17 | 人的性格当然和基因有关,有些人生来较为乐观,而有些倒霉蛋却比较悲观。但是好在**大脑的神经通路具有极大可塑性,所以改变性格是可行的**,人的情感经验很大一部分来源于年幼时情感经验的习得,如果年幼时不注重情商的培养,成年后人就有可能会有情商缺陷(成年后大脑仍是可塑的)。所以人的情商一部分取决于基因,而很大一部分是后天习得的。根据发展心理学的观点,人的性格在出生时有四种基本类型:羞怯,胆大,乐观和忧郁,并随着后天环境的影响而形成多种人格特质。但是可悲的是,大部分学校和家庭的教育对这方面的培养教育不够重视。情商有别于学术等智力能力,但是对个人生活的成败具有决定性因素。(贝尔实验室的科学家们情商高的人更成功,有统计结论证实) 18 | 19 | ___ 20 | ####你认识自己吗? 21 | 情商的首要能力是自我管理能力,要有自我觉知,觉知自我的情绪并意识到自我对此情绪的看法。在处理自我的情绪时,一般有三种类型的人: 22 | 1. 自我觉知型。这种人是人格健全的人,有积极的人生观。一旦情绪低落,不会辗转反侧,而是努力跳出重围。 23 | 2. 沉溺型。总是被卷入自己情绪的狂潮中,无力自拔,听凭情绪的主宰;情绪多变,反复无常,而又不自知,陷溺其中不知所以然;一任自我沉溺于恶劣情绪中,无力也无能摆脱;常常处于情绪失控状态中,自感被压倒击溃。(情绪失控与神经系统短路有关,边缘系统的杏仁核控制了神经系统) 24 | 3. 认可型。对自我的感受了解得一清二楚,但接受认可自己的情绪,并不打算去改变。这一类型还可划分为两种亚型:乐天知命型,总是高高兴兴,自然不愿也没必要去改变;悲观绝望型,虽然清晰地认识到自我的情绪状态,而且明知是不良情绪,但采取 “不抵抗主义”,无论自己有多么烦恼悲伤,就是无所作为抑郁症患者是这一类人的典型,束手待毙于自己的绝望痛苦中。 25 | 26 | 面对消极情绪,要学会想办法跳出来,拥有一个健全的人格。当然改变自己是相当困难的,比如我这种不是特别外向开朗的人,想要变得活泼开朗是很困难的,但是逐渐改变自己的性格特征确实有可能的,即使对成年人也是,成年人的大脑仍然是可塑的,要做的就是不断改变自己的认知。消极情绪会损伤大脑和身体健康,对自身情绪首先要做到自我知觉,认识到情绪产生的原因,尝试用不同的解释来认识自己的情绪(认知重构),并能够积极采取适当措施跳出消极情绪的影响。实际上之前我有数次情绪失控经历,且都是针对父母,情绪处理有不少问题。这一年来看了很多书,不断学习各种技巧来尝试改变自己,确实有成效。比如写东西记录自己内心状态,定期与之前的状态比较,养成一些好习惯等。 27 | 28 | ____ 29 | ####社交技能 30 | - 移情。感人之所感,知人之所感。90%以上的情感是非言语表达的,要学会体察别人的情感并作出正确的反应,情绪的同步协调往往决定交往成功与否。 31 | - 展示情感。情绪感染力,使别人感到舒服自在。 32 | - 社交网络,包括交流网络,专业技术网络,信任网络。 33 | 34 | ___ 35 | ####家庭和学校的责任 36 | 之前说过,一个人的情商水平很大一部分受到年幼时情感经验的影响(甚至是恋爱心理)。这里不得不提一个[糖果实验(延迟满足实验)](http://baike.baidu.com/view/368968.htm),大致内容就是给一群孩子糖果但是告诉他们等实验者回来才可以吃,结果有些孩子抵制住了诱惑但是有些没有,十几年的跟踪调查发现抵制住诱惑的孩子普遍更加成功,能延迟满足的孩子容易抵制以后的各种诱惑,达到自己的目标。(以后有娃娃了也试试*\(^o^)/*) 37 | 有时候,从一个人年幼时的情感经验就可以预测一个人成年后的生活、工作、婚姻等状况(一个牛掰的心理学家通过对吵架夫妻体态的细致观察可以预测他们离不离婚的正确率达94%)。家庭和学校对于人的成长起了不可估量的作用,一般说来,擅长情感教育的父母孩子的神经功能发育就比较完善,而不注重情感教育则可能导致孩子成年后缺乏社交技能,性格自卑敏感,孤独症,焦虑症,缺乏安全感等很多不良情感。 38 | 所以为人父母一定要注重孩子情商的培养,包括孩子的爱心、责任心、自信心、表达能力、社交能力、情绪处理能力等,拥有这些能力对于人的成长成功有很大益处。学校也不仅仅是教授知识的地方,也应该开设相应的课程培养孩子的情感智商。 39 | 40 | ___ 41 | ######参考 42 | [<<情感智商>>](http://book.douban.com/subject/4929897/) 43 | 作者丹尼尔.戈尔曼,哈佛大学心理学博士,现为美国科学促进协会(AAAS)研究员。 44 | -------------------------------------------------------------------------------- /docs/psychology/自控力-和压力做朋友.md: -------------------------------------------------------------------------------- 1 | # 1. 改变我们的思维模式:什么是压力?压力真的都是负担吗? 2 | 3 | - 感受到压力时,承认压力的存在 4 | - 欢迎压力,意识到它是对你在意事物的反应 5 | - 运用压力给你的能量,而不是试图耗费它管理压力。 6 | 7 | 最有效的思维干预:1.学习新观点;2 练习,鼓励自己采纳和应用新思维。3.提供机会,和别人分享该观点 8 | 9 | # 2. 迎难而上:身处困境,压力是可以依靠的资源,而非要消灭的敌人 10 | 11 | 战逃反应 12 | 13 | 心流模式表现出挑战反应迹象。 14 | 15 | 催产素的强大作用 16 | 17 | 压力反应帮你应对挑战、与人联结、学习和成长。 18 | 19 | # 3. 压力和意义成正比:有意义,意味着有压力 20 | 21 | 在压力时刻反思你的价值观能帮你更好应对它。当压力来袭,记起价值观,问问自己在这个时刻,它能如何引导你。 22 | 23 | 你和在乎的人如何谈论压力至关重要 24 | 25 | 逃避压力,会引起联结感和归属感的下降。 26 | 27 | # 4. 全身心投入:拥抱焦虑能帮助你更好应对挑战 28 | 29 | 转换压力,变紧张为兴奋。 30 | 31 | 社会压力测试。 32 | 33 | 转化压力,变恐惧为挑战。 34 | 35 | # 5. 内在联结:压力使人更具关怀性,提升抗挫力 36 | 37 | 转换压力:变自我关注为更宏大的目标 38 | 39 | # 6. 幸福成长:痛苦使你坚强 40 | 41 | 思维干预,反思一个困难状况的益处。 42 | 43 | 经历困难后的积极改变: 44 | 45 | - 自我成长感。你用什么优势帮助自己解决了问题? 46 | - 更加感恩。 47 | - 灵魂成长。智慧或者见识有么有增长 48 | - 强化社会联结与他人关系 49 | - 识别新的可能性和人生方向 50 | 51 | 人们以更接纳的态度看待过去的苦难,会变得更快乐,更有毅力,更少抑郁。 52 | 53 | # 7. 最后的反思 54 | 55 | 当以下三种情况存在时,压力最可能有害: 56 | 57 | - 你感觉无法应对压力 58 | - 压力使你与别人孤立 59 | - 压力完全无意义,还违背你的意愿 60 | 61 | 我想在压力中如何成长? 62 | -------------------------------------------------------------------------------- /docs/psychology/自控力.md: -------------------------------------------------------------------------------- 1 | # 1. 我要做,我不要,我想要:什么是意志力?为什么意志力至关重要 2 | 3 | 4 | 训练大脑,能够增强意志力。(挑战我不要) 5 | 6 | 冥想:5分钟训练大脑冥想。 7 | 8 | 1. 原地不动,安静坐好 9 | 2. 闭上眼睛。吸气时脑海默念『吸』,呼气时在脑海默念『呼』。当你发现走神的时候,重新将注意力集中到呼吸上 10 | 3. 感受呼吸,弄清自己怎么走神的。专注于呼吸本身,如果走神了重新将注意力集中到呼吸上 11 | 12 | 13 | # 2. 意志力的本能:人生来就能抵制奶酪蛋糕的诱惑 14 | 15 | 通过呼吸实现自控。将呼吸频率降低到每分钟 4-6次(但不要憋气),也就是每次呼吸10-15秒。有助于调整到自控力状态 16 | 17 | 5分钟的『绿色锻炼』就能减缓压力,改善身心。林中漫步,简单的伸展运动,出去走走。 18 | 19 | 睡个好觉。补觉、打盹都可以减少睡眠不足的危害。 20 | 21 | 视图控制所有思想也会带来生理负担,放弃对意志力的完美控制。从压力和自控力中恢复的最佳途径就是放松。 22 | 23 | 激发"生理学放松反应":躺下来,枕头垫着膝盖,腿稍微抬起(或者选择一个你舒服的姿势)。闭上眼睛,做几次深呼吸, 24 | 感觉你的腹部有起浮。保持5-10分钟,除了呼吸什么都不用想的状态。如果担心睡着,订好闹钟。 25 | 26 | # 3. 累到无力抵抗:为什么自控力和肌肉一样有极限? 27 | 28 | 人早晨意志力最强。 29 | 30 | 自控力就像肌肉。 31 | 32 | 意志力训练:控制自己以前不会去控制的小事,训练自控力肌肉。 33 | 在一些小事情上持续自控会提高整体意志力。比如改变姿势,戒掉甜食,记录支出情况。 34 | 35 | 自控力肌肉锻炼模式: 36 | 37 | - 增强『我不要』的力量:不随便发誓(不说某些口头禅)、用另一只手吃饭等 38 | - 增强『我想要』的力量:每天都做一些事(但不是你已经在做的事情),用来养成习惯和不再找借口。冥想5分钟,每天找到一个家里要扔掉或者再利用的东西 39 | - 增强『自我监控』能力:认真记录一件你平常不关注的事情,可以是你的支出、饮食,上网看电视的时间。铅笔和纸就够了。 40 | 41 | # 4. 容忍罪恶:为何善行之后会有恶行 42 | 43 | 克服"明日复明日"的想法:当你想改变某种行为的时候,试着减少行为的变化性,而不是减少那种行为。 44 | 45 | 光环效应:省钱不再是买到便宜的东西,而是在支出限额内买到便宜的东西。 46 | 47 | 取消许可,牢记理由。 48 | 49 | # 5. 大脑的弥天大谎:为什么我们误把渴望当幸福 50 | 51 | 多巴胺会促使人们期待得到奖励,但不能感觉到获取奖励时的快乐。 52 | 53 | # 6. 那又如何:情绪低落为何会使人屈服于诱惑 54 | 55 | 压力之下,人更容易受到诱惑。 56 | 57 | 有效的解压方式:锻炼或体育活动、祈祷或宗教活动、阅读、音乐、家人朋友相处、按摩、外出散步、冥想、做瑜伽、有创意的爱好。 58 | 59 | 无效的解压方式:赌博、购物、抽烟、喝酒、暴饮暴食、玩游戏、上网、看电视或电影。 60 | 61 | 有效的缓解压力方式可以增加大脑改善情绪的化学物质,减少压力荷尔蒙 62 | 63 | “恐惧管理”:带来的不是诱惑,而是拖延。 64 | 65 | “那又如何”效应:从放纵、后悔到更严重的放纵的恶性循环。 66 | 67 | 失败的时候,请原谅自己(自我谅解)。面对挫折,同情自我,以免让罪恶感再次放弃抗争。 68 | 69 | - 你感觉如何?你怎样描述这种感觉 70 | - 你只是个凡人。 71 | - 你会跟朋友说什么 72 | 73 | 乐观的悲观主义者更可能成功。如果能预测自己什么时候、会如何受到诱惑和违背承诺,想象一个不让自己放弃抗争的具体方法,你就更可能拥有坚定的决心。 74 | 75 | # 7. 出售未来:及时享乐的经济学 76 | 77 | 延时折扣:宁愿放弃未来的幸福,也要选择即刻的快感。 78 | 79 | 神经科学家发现,10分钟能在很大程度上改变大脑处理奖励的方式。“10分钟延迟法则”来增强你的自控力。 80 | 在这10分钟里, 81 | 82 | 83 | - 做好拒绝诱惑的准备。在未来的自己被诱惑之前,提前做出选择。在对不健康食品,先打包一份健康午餐。 84 | - 让改变偏好变得更难。制造延迟或者设置障碍,给自己一些时间应对诱惑。比如购物不要带信用卡,只带你想花掉数额的现金。 85 | 闹钟放到另一头,想要关闭闹钟就要起床。 86 | - 激励未来的自己。 87 | 88 | 人在思考现在的自己和未来的自己时候,激活的是大脑不同部分。 89 | 90 | # 8. 传染:为什么意志力会传染? 91 | 92 | 个人选择很大程度上受到他人想法、意愿和行为的影响。坏习惯和积极的改变都能像细菌一样传播,没人可以完全不受影响。 93 | 94 | 我们的行为会受到社会认同的巨大影响。 95 | 96 | 感染自控力:给自己树立一个榜样。问问自己:为什么那个人意志力那么强? 97 | 98 | 99 | # 9. 别读这章:“我不要”力量的局限性 100 | 101 | ”不要想白熊“。 ”我不要”的力量洪灾涉及思想、情感的内心世界,它就会失效。 102 | 压抑人的本能,就会出现“讽刺性反弹”。放弃自控,把想法表达出来,一旦你把压抑的想法表达出来,这个想法就不太容易被激活了。 103 | 104 | 105 | 直面欲望,但是不要付诸行动: 106 | 107 | - 承认自己脑海中的欲望,以及渴望某种事情的感觉 108 | - 不要马上试着转移注意力或者与之争论。接受这种想法或者感觉,提醒自己“白熊现象”和“反弹理论” 109 | - 退一步考虑,意识这种想法和感觉并不受你控制,但你可以选择是否将这些想法付诸实践 110 | - 记住你的目标,提醒自己预先作出的承诺。 111 | 112 | 对内接受自我,对外控制行动。不要试图控制自己的心理活动。认识自我、关心自我和提醒自己真正重要的事物,是自我控制的基石。 113 | 选择自己相信什么,自己想要做什么。 114 | 115 | 116 | 意志力实验: 117 | 118 | - 忠于你的感受,但别轻信你的所有想法。当产生不快的想法时,将注意力转移到身体上,然后专注于呼吸,想象这些想法像浮云一样逐渐淡去 119 | - 直面自身欲望,但不要付诸行动。欲望来袭时,注意到它,但是不要马上试着转移注意力或与之争论。提醒自己“白熊现象”和“反弹现象",记住真正重要的的目标 120 | - 驾驭冲动。当冲动一直存在时,与这些生理上的感觉共处,像驾驭海浪一样驾驭它,不要试图摆脱它,但也不要将冲动付诸行动。 121 | -------------------------------------------------------------------------------- /docs/psychology/逆商.md: -------------------------------------------------------------------------------- 1 | # 1 人生就是在攀越一个又一个逆境 2 | 3 | 逆商以三种形式呈现出来: 4 | 5 | - 作为一种新的概念框架,用于理解和提升成功的各个因素 6 | - 作为系列衡量方法,评估人对逆境的反应模式 7 | - 作为具有科学依据的工具,改善人们应对逆境的模式,提升个人效能和职业效能 8 | 9 | 放弃者,扎营者和攀登者 10 | -------------------------------------------------------------------------------- /docs/python/clean_python.md: -------------------------------------------------------------------------------- 1 | 《Clean Python》 2 | -------------------------------------------------------------------------------- /docs/python/python网络编程_linux.md: -------------------------------------------------------------------------------- 1 | 2 | # 获取服务器 cpu 使用情况代码 3 | 4 | ```py 5 | # 返回服务器信息(udp) server 6 | import socket 7 | import psutil 8 | 9 | 10 | def do_cpu(): 11 | data = str(psutil.cpu_percent(0)) + '% \n' 12 | count = 0 13 | for process in psutil.process_iter(): 14 | data = data + process.name() 15 | data = data + ',' + str(process.pid) 16 | cpu_usage_rate_process = str(process.cpu_percent(0)) + '% ' 17 | data = data + ',' + cpu_usage_rate_process + '\n' 18 | count += 1 19 | if count == 10: 20 | break 21 | return data 22 | 23 | 24 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 25 | s.bind(('127.0.0.1', 8090)) 26 | print("bind udp on 8090...") 27 | 28 | while True: 29 | info, addr = s.recvfrom(1024) 30 | data = do_cpu() 31 | s.sendto(data.encode('utf-8'), addr) 32 | print("The client is", addr) 33 | print("Sended CPU data is:", data) 34 | ``` 35 | 36 | ```py 37 | # client 获取 cpu 占用信息 38 | import socket 39 | 40 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 41 | s_addr = ('127.0.0.1', 8090) 42 | s.sendto(b'CPU info', s_addr) 43 | data_b, addr = s.recvfrom(1024) 44 | 45 | if addr == s_addr: 46 | data_s = data_b.decode('utf-8') 47 | data_list = data_s.split('\n') 48 | print("Cpu usage rate is ", data_list[0]) 49 | print('% - 20s % -5s % -10s' % ('name', 'pid', 'cpu usage')) 50 | data_list = data_list[1:-1] 51 | for xx in data_list: 52 | yy = xx.split(',') 53 | print('% - 20s % -5s % -10s' % (yy[0], yy[1], yy[2])) 54 | 55 | s.close() 56 | ``` 57 | -------------------------------------------------------------------------------- /docs/startup/hello_startup.md: -------------------------------------------------------------------------------- 1 | 《Hello Startup》作者 Yevgeniy Brikman 以技术人员的视角,从产品、技术、团队文化角度讲述了作者的经验。书中还有众多明星创业公司CTO和工程师的采访,想加入创业公司的工程师可以参考下。 2 | 3 | ## 1.Why Startups 4 | 1. Product: technology. 5 | 2. Environment: extremely uncertain. 6 | 3. Goal: massive growth. 7 | 4. Mode of operation: search. 8 | 9 | 10 | ## 2.Startup Ideas 11 | 1. Copy 12 | 2. Transform 13 | 3. Combine 14 | 15 | 1. Give yourself plenty of time 16 | 2. Keep an idea journal 17 | 3. Work on the problem 18 | 4. Get away from work 19 | 5. Add constraints 20 | 6. Look for pain points 21 | 7. Talk to others 22 | 23 | 24 | How to find customers ? 25 | 1. Validate the problem. 26 | - Frequency: Does the problem your're solving occur often? 27 | - Density: Do a lot of people face this problem? 28 | - Pain: Is the problem just an annoyance, or something you absolutely must resolve? 29 | Market Sizing: Advertising, Competition, Community, Market research and reports, Product data 30 | Talking to real customsers : 31 | 32 | 2. Validate the MVP. 33 | 3. Validate the product. 34 | 35 | ## 3. Product Design 36 | What you're building ,who you're doing it for , why it's worth doing. 37 | 38 | Emotional DESIGN: Be considerate, Be responsive, Be forgiving, Simplicity, Usability testing 39 | VIsual DESING: 1.Copywriting 2. Design reuse 3. Layout 4.Typography 5.Contrast and repetition 6.Colors 40 | THE MVP: central assumption -> testable hypothesis -> smallest experiment -> analyze the results -> repeat1 41 | Types OF MVPS: Landing page, Explainer video, crowdfunding(众筹), Piecemeal MVP 42 | Buy THE MVP: 43 | 44 | ## 4. Data and Distribution 45 | -------------------------------------------------------------------------------- /docs/startup/精益创业.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/startup/精益创业.md -------------------------------------------------------------------------------- /docs/startup/运营其实很简单.md: -------------------------------------------------------------------------------- 1 | # 1 窥探运营大门 2 | 3 | 岗位分类: 4 | 通用类/复合类;用户类;渠道类;内容类 5 | 6 | 新媒体:头条、微博、微信等数字化新型媒体 7 | 8 | 社区平台:知识型、垂直型、辅助型 9 | 社交平台:零关系;弱关系;强关系 10 | 11 | # 2 连接用户 12 | 用户来源;用户金字塔;用户成本;用户生命周期 13 | 14 | 入口:用户了解产品的渠道,承接口是通过入口展现给用户的产品 15 | 流量入口:核心卖点与领域;目标群体;可用和不可用渠道;渠道和产品关联程度;制定入口运营策略和渠道开发策略 16 | 17 | 用户分级:性别、使用频次、使用行为、使用情况、依赖程度等(统计工具、数据埋点、用户跟踪) 18 | 19 | 连接用户:用户访谈、行为观察、线上交流、融入交流等。 20 | 提炼需求:分析需求,提炼核心需求,整理需求,验证需求。 21 | 22 | 用户生命周期:尝试、行为、热衷、放弃 23 | 用户体系关联:用户等级、权限展现、权限配置、权限成本 24 | 25 | # 3 锻造产品 26 | 内容为王,产品生命周期;产品和用户;运营优化产品 27 | 28 | 产品生命周期(PLC): 产品研发期到产品衰败期。 29 | - 建设期: 产品定位、用户群体、典型使用行为。种子用户 30 | - 引入期: 投入市场但是未获得肯定。用户反馈收集、用户维护、渠道体系建立、推广方案及运营方案制定等。 31 | - 成长期: 产品获得市场和用户认可。专人专事。企业追求ROI。积分、消费体系,用户流失预警和用户召回体系 32 | 处理用户数据、收集用户反馈、了解竞品数据、分析市场环境、开拓运营渠道、调整渠道体系、建立运营体系。 33 | - 成熟期: 围绕盈利点和用户需求。挖掘需求延长产品生命周期 34 | - 衰败期: 重新寻找需求改进产品还是转而开发新产品。 35 | 36 | 37 | # 4 打造内容 38 | 内容为王;内容策略 39 | 40 | 41 | # 5 运筹帷幄 42 | 运营节奏曲; 43 | 44 | 运营方法论的优点: 定位、数据、目标、运营策略、风险、成本 45 | 46 | 47 | # 6 掌握运营技能 48 | 推广技能;营销技能;运营技能 49 | 50 | 推广技能:免费(社交、平台传播);付费(广告)。PPC(Pay per click), DSP(Demand-Side Platform),SMO(Social Media Optimization), EDM(Email Direct Marketing), SEM(Search Engine Marketing) 51 | 52 | 营销技能:事件、品牌、产品】广告深度、市场营销等 53 | 54 | 运营技能: 55 | - 数据分析:目的、准备、处理、分析、报告 56 | - 整合能力:渠道、内部协调 57 | 58 | 59 | # 7 社群运营 60 | -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/epoll_proactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/epoll_proactor.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/half-sync_half-reactive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/half-sync_half-reactive.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/io_diff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/io_diff.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/io_library.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/io_library.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/leader_followers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/leader_followers.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/pipe.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/proactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/proactor.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/process_pool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/process_pool.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/pthread_jon_retval.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/pthread_jon_retval.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/reactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/reactor.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/time_order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/time_order.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/time_wheel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/time_wheel.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/timeo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/timeo.png -------------------------------------------------------------------------------- /docs/unix_linux/Linux高性能服务器编程/xinetd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/unix_linux/Linux高性能服务器编程/xinetd.png -------------------------------------------------------------------------------- /docs/unix_linux/unix编程艺术.md: -------------------------------------------------------------------------------- 1 | # 6. 透明性 2 | 3 | ### 6.1 透明性和可显性 4 | 透明的:软件系统没有阴暗的角落和隐藏的深度 5 | 可显的:软件系统所包含的功能是为了帮助人们对软件建立正确的『做什么、怎样做』的心理模型而设计 6 | 7 | ### 6.2 为透明性和可显性设计 8 | 透明性之禅:追求代码的透明,最有效的方法是不要在具体操作的代码上叠放太多抽象层 9 | 为透明和可显性编码: 10 | - 调用层次最好不要超过4层 11 | - 代码是否有强大、明显的不变性质 12 | - 每个 api 中的各个函数的定义是否正交 13 | - 是否存在一些顺手的关键数据结构或全局唯一的记录器,捕获了系统的高级状态 14 | - 程序的数据结构或分类和他们代表的外部实体之间是否存在清晰的一对一映射 15 | - 是否容易找到给定函数的代码部分,多少精力能读懂? 16 | - 代码增加了特殊情况还是避免了特殊情况 17 | - 代码中有没有硬编码幻数 18 | -------------------------------------------------------------------------------- /docs/互联网/我的互联网方法论-周鸿祎.md: -------------------------------------------------------------------------------- 1 | ####红衣教主-周鸿祎 2 | 虽然现在不怎么用360了,但是周董的书还是值得看看滴。 3 | 熟悉360的朋友应该知道周鸿祎,奇虎公司董事长,知名天使投资人。周鸿祎在互联网界可以说是树敌众多,和百度抢搜索,和腾讯『3Q大战』,推出免费杀毒威胁传统杀毒厂商......周鸿祎几乎跟所有业内大佬干过架,可以说是中国互联网的搅局者。周最开始因为自己的流氓软件肆虐,也有人叫他流氓软件之父。但是不管怎样,360的成功也有目共睹,周总自有他一套做产品的方法。 4 | 5 | ____ 6 | ####互联网时代 7 | > 没有人能够打败趋势 8 | 9 | 互联网时代催生了一批伟大的公司,极大地改变了人们的生活方式。也对一些传统行业造成了很大冲击,最典型的就是电商对传统零售业的冲击,传统行业利用信息差赚钱变得越来越困难。传统行业如果不能抓住趋势适当转型,就有可能面临被淘汰的风险。互联网也有它自己的发展规律,最近很流行一种说法就是『互联网思维』。互联网产品不受物理空间限制等特点聚集了传统行业难以想象的用户基数,使得用户边际成本接近于0,所以可以提供免费的服务。当初360推出免费杀毒软件时,断送了很多公司每年几亿的收入,惹怒了众多传统杀毒厂商,周也成为很多人的攻击对象。但是这就是趋势,免费的趋势,果然360的免费杀毒短时间内就有了几亿用户,把传统杀毒厂商挤了下去。前段时间高德地图宣布免费后,百度地图立马跟进,不仅宣布免费,还把之前的费用退还。这是很聪明的做法,看不准趋势只有被淘汰的命运,就像当年的网景公司,在微软利用windows的垄断优势用IE绞杀网景时,网景依然对浏览器收取高价,最终被历史淘汰,这位浏览器的先行者最后却只有被遗忘的命运。 10 | 11 | ____ 12 | ####商业模式 13 | > 商业模式不是赚钱模式 14 | 15 | 周总在这本书中说到,商业模式包含四部分: 16 | - 产品模式。在互联网里做大的公司,都是产品驱动型的公司。所有的商业模式都要建立在产品模式的基础上,没有产品和对用户的思考,公司不可能做大。所以,你提供的产品是什么?能为用户创造什么样的价值?你的产品解决了哪一类用户的什么问题?这些都是创业者需要思考的。 17 | - 用户模式。一定要找到对产品需求最强烈的目标用户。如果你说自己的产品是普世的产品,是放之四海而皆准的产品,说明你没有认真思考过。(成功的产品如YY语言,UC浏览器) 18 | - 推广模式。你要以怎样的方式接近目标用户群。真正的推广模式不是砸钱,而是要根据你的用户群和产品,去设计相应的推广方法。 19 | - 盈利模式。通过产品活的巨大用户基数,在此前提下考虑获取收入。商业计划书里的收入模式基本不靠谱。(google的AdWords模式) 20 | 目前护理网盈利模式有三种:直接卖东西,卖真实的产品(电商);广告收入(视频,搜索公司等);以网游为代表的增值服务(会员服务等) 21 | 22 | > 没有用户价值,就没有商业价值。不要满脑子想着赚几个小钱。 23 | 24 | ___ 25 | ####用户至上,体验为王 26 | > 我发现在我的互联网生涯里,无论我搞什么,一开始都是不理解、不屑,甚至是嘲笑。-周鸿祎 27 | 28 | - 超出预期的才叫用户体验。 29 | - 体验的基础是用户需求。 30 | - 细节决定成败。 31 | - 聚焦一个点。 32 | - 大道至简。 33 | 你会发现,用360的基本是小白用户,360也明显是锁定了广大不是计算机专业人士的小白群体。很多稍微懂点计算机的人就是360黑。但是360这么大的装机量,应该说是非常成功的。周说自己是360的首席体验官,不断从用户角度思考去改善产品。总之,能解决问题的产品就是好产品。 34 | 35 | ___ 36 | ####颠覆式创新 37 | 周提到了三种创新形式: 38 | - 真正的发明创造。这种形式很难发生,不是每个人都能成为爱迪生。 39 | - 商业模式上的创新。贵的做成便宜的,收费做成免费的。 40 | - 体验上的创新。复杂的变成简单的,笨重的变成便携的。 41 | 商业历史上对市场格局的颠覆,大多是商业模式上的创新和用户体验上的创新,怎样去满足人性。360从一开始就推出免费安全软件,后来推出免费杀毒,成为中国互联网安全行业的老大。免费的本质就是一种商业模式上的颠覆。360的产品也充分考虑到了广大小白用户,用最简单的操作帮助用户管理电脑。 42 | 43 | ___ 44 | ####互联网方法论 45 | 总结一下书中提到的: 46 | - 微创新,从小处着眼。 47 | - 不要一开始就平台化思维,先把自己最重要的做好。 48 | - 口碑。靠好的用户体验积累口碑。 49 | - 创新需要土壤。 50 | - 容忍失败。创新99%都要失败,网上很多成功学在误导人。现在大公司抄袭小公司,小公司抄袭美国。 51 | - Think different. 52 | - 战略要落实到产品。想法未必是可行的。 53 | - 互联网产品秘籍:产品要有一个灵魂;不断运营,持续打磨;先把一个点做到极致。 54 | - 做产品需要“现场力”。你喜欢不代表用户喜欢,你的需求不代表用户的需求。 55 | - 强需求与若需求。像小白一样思考。 56 | - 建设一支优秀团队:不以发财为目标;激励机制;新老更替。 57 | 58 | ___ 59 | ####最后 60 | 曾经看到过一句话叫做“成功了屁都是经验,失败了经验都是屁”,虽然是调侃,不过也确实是这样。我们只看到了很多产品今日的成功,却忽视了背后大量的失败。成功的产品总是有些共性的,像是产品体验、微创新等。做产品的互联网人可以看看这本书,看看一个老江湖的启示。 61 | 62 | ___ 63 | #####参考 64 | [<<我的互联网方法论>>](http://book.douban.com/subject/25928983/)-作者周鸿祎,360公司董事长、知名天使投资人。 65 | [周鸿祎过时了吗?](http://book.douban.com/review/6954077/) 66 | -------------------------------------------------------------------------------- /docs/互联网/用户思维.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/互联网/用户思维.md -------------------------------------------------------------------------------- /docs/健康/程序员健康指南.md: -------------------------------------------------------------------------------- 1 | # 1. 做出改变 2 | 3 | 习惯三要素: 4 | 5 | - 暗示信号 6 | - 惯例行为 7 | - 奖赏 8 | 9 | 10 | # 2. 努力健康起来 11 | 12 | 学习新事物之前或者之后进行体育锻炼,能帮你巩固记忆。 13 | 散步是一种很好的方式。 14 | 15 | 16 | # 3. 努力健康起来 17 | 18 | - 每小时进行5分钟的活动,可以降低很多致命疾病的风险。 19 | - 多调整姿势,每次坐着不要超过20分钟,但是站着也不要超过20分钟。经常调整姿势 20 | 21 | # 4. 灵活饮食方案 22 | 23 | - 均衡营养胜过特殊饮食。一日五蔬果计划 24 | 25 | 26 | # 5. 预防头痛和眼部疲劳 27 | 28 | - 脸和屏幕距离应该在 51-101cm 之间 29 | - 显示器亮度不要和周围环境差别太大 30 | 31 | 电脑视觉综合症(cvs): 32 | 33 | - 经常眨眼 34 | - 眼部锻炼。20-20-20法则,工作20分钟,看看20英尺(6米)远的物体,看20秒 35 | - 注意休息 36 | 37 | # 6. 预防背痛 38 | 39 | 通过运动改善背部肌肉。普拉提或者瑜伽 40 | 41 | 人体工学设备: 42 | 43 | - 身体要有支撑。调整椅子高度,给背部适当支撑。髋部和膝盖保持同一个水平线,手肘和手腕保持统一水平线 44 | - 平均分配身体重量 45 | - 脊椎有支撑 46 | - 双脚着地 47 | 48 | 仍然不要久坐 49 | 50 | # 7. 预防手腕疼痛 51 | 52 | - 相关瑜伽课程 53 | - 压力山大疗法 54 | - 不使用手腕垫,敲击键盘的时候手腕略高于指关节 55 | - 用护腕限制身体动作 56 | 57 | # 8. 让锻炼贴近生活 58 | 59 | 番茄工作法:休息间隔进行任意一项锻炼活动。 60 | 61 | 记录锻炼日志 62 | 63 | - 内容具体 64 | - 坚持记录 65 | - 阅读日志 66 | 67 | # 9. 到户外思考 68 | 69 | - 摄入维生素 D 70 | - 增强免疫系统 71 | - 充足的睡眠。7-9小时 72 | - 足量水分 73 | - 避免使用抗生素 74 | - 使用发酵食品 75 | - 每天10分钟日光浴 76 | - 减少室内久坐 77 | - 对抗感冒 78 | - 勤洗手 79 | - 清洁办公桌 80 | - 不要触摸脸部 81 | - 经常户外活动 82 | 83 | # 10 重构健康 84 | 85 | - 热身避免受伤 86 | - 参加一些需要复杂肢体动作的运动 87 | 88 | # 11 组起队来 89 | 90 | - 传递信息。与别人讨论健康话题 91 | - 为健康投资 92 | - 运动小组。你的热情也许会成为别人最大的动力来源 93 | 94 | 95 | # 12 健康的程序员 96 | 97 | - 持续进步 98 | - 建立群体习惯 99 | - 坚持迭代和改变 100 | -------------------------------------------------------------------------------- /docs/健康/隐性疲劳.txt: -------------------------------------------------------------------------------- 1 | BOOX读书笔记 | <<隐性疲劳>> 2 | null 3 | 具有最强的抗疲劳效果的成分——“咪唑二肽” 4 | 时间:2022-02-25 09:09 5 | 【原文】对每一种都进行了严格的最终试验之后,被认定具有抗疲劳效果的仅有4种。 6 | 这4种成分就是“柠檬酸”“辅酶Q10”“苹果多酚”,以及“咪唑二肽” 7 | 【批注】 8 | 【页码】20 9 | ------------------- 10 | 在消耗剧烈的地方精准地发挥作用 11 | 时间:2022-02-25 09:15 12 | 【原文】极其有益的东西,因此基因特意被设计成这个样子的。 13 | 【批注】 14 | 【页码】22 15 | ------------------- 16 | 从哪里摄取咪唑二肽比较好呢? 17 | 时间:2022-02-25 09:16 18 | 【原文】在超市等处就能轻而易举买到的食材之中,咪唑二肽含量最为丰富的食材,就是“鸡胸肉” 19 | 【批注】 20 | 【页码】22 21 | ------------------- 22 | 柠檬酸也有抗疲劳效果 23 | 时间:2022-02-25 09:18 24 | 【原文】当人因为不曾补充营养就进行激烈的运动或者加班而感到疲劳的时候,柠檬酸特别有效。对于这种疲劳,通过摄取柠檬酸,就能令柠檬酸循环在短时间内被激活。之所以在运动会等场合中使用柠檬酸,也是因为这种速效 25 | 【批注】 26 | 【页码】24 27 | ------------------- 28 | 柠檬酸也有抗疲劳效果 29 | 时间:2022-02-25 09:18 30 | 【原文】如果想要用柠檬酸减轻疲劳,标准是1天吃2个咸梅干,或者2个柠檬,黑醋的话就喝满满一大匙。 31 | 不过,柠檬酸不能保护自主神经免受活性氧的危害。仅靠摄入柠檬酸来抗击“隐性疲劳”可以说是很困难的。 32 | 柠檬酸依旧是要借助咪唑二肽的力量,两种合起来同时摄入,才能够期待它们发挥进一步的抗疲劳效果。 33 | 摄入抗疲 34 | 【批注】 35 | 【页码】24 36 | ------------------- 37 | “睡眠负债”也是隐性疲劳的原因之一 38 | 时间:2022-02-25 09:21 39 | 【原文】看到打鼾的人,人们也许会想到这是“正在酣睡呢”之类的,实际上正相反,鼾声是“不好的睡眠”的代表性信号。 40 | 【批注】 41 | 【页码】26 42 | ------------------- 43 | 提高睡眠质量的五个方法 44 | 时间:2022-02-25 09:25 45 | 【原文】结果证实了晚霞色的灯光更能令自主神经处于副交感神经占据优势地位的状态,也会更顺利地进入睡眠状态。 46 | 【批注】 47 | 【页码】28 48 | ------------------- 49 | 选择寝具时要重视尺寸 50 | 时间:2022-02-25 09:27 51 | 【原文】。要想知道适合自己的高度,首先从侧面拍一张头枕在枕头上睡觉的照片。接着把这张照片竖起来,如果此时自己的姿态看上去就和笔直站立时的姿态一样,这就是尺寸最合适的枕头。如果下巴看上去仿佛伸出来了一般,可以说枕头是偏矮的,如果看上去像是低着头,那么枕头就是偏高了 52 | 【批注】 53 | 【页码】29 54 | ------------------- 55 | 集中注意力工作反而没效率?! 56 | 时间:2022-02-25 09:30 57 | 【原文】。像这样集中注意力之后,由于使用过的脑的部位产生了消耗,表现也一下子下降了。而且,这种消耗只有借助睡眠才能恢复。 58 | 【批注】 59 | 【页码】30 60 | ------------------- 61 | 脑在无意识地整理记忆 62 | 时间:2022-02-25 09:33 63 | 【原文】这叫作“给记忆贴标签”,我们就是这样无意识地整理信息并收入脑内。 64 | 如果你被问到“请说出30个迄今为止成为你朋友的人”,你的脑海中会浮现出像小学时代、初中、高中、大学、进入社会后、篮球部、网球同好会、公司的岗位之类的“归类”,并在各种分类中列举出你的朋友吧。“小学时代”“篮球部”这样的归类,正相当于记忆的标签。 65 | 并且,给记忆贴标签,如果是有意识地这么做,可能效率会更高。 66 | 【批注】 67 | 【页码】32 68 | ------------------- 69 | 提高超认知功能,养成使用整个脑部的习惯 70 | 时间:2022-02-25 09:34 71 | 【原文】观地看待自己正在说的内容和自己的面部表情,考虑是否与现场的氛围相配,这种行为就相当于超认知。在这种场合下,尽管周围的人已经彻底厌烦了,自己却还在继续自吹自擂,像这样的人可以说是超认知功能很差的了 72 | 【批注】 73 | 【页码】33 74 | ------------------- 75 | 最好饭后就躺下“变成牛” 76 | 时间:2022-02-25 09:43 77 | 【原文】但是根据现代医学,我们已经明白,饭后30分钟内,静静地休息会减少身体的负担,饭后休息才是正确的做法。 78 | 【批注】 79 | 【页码】36 80 | ------------------- 81 | 最好饭后就躺下“变成牛” 82 | 时间:2022-02-25 09:43 83 | 【原文】关于饮食还有一点要补充,要避免在吃早饭之前运动。在自主神经醒来之前就开始运动,无法很好地控制血流和心搏,很容易就可能引发心肌梗死。在早晨轻微运动一下,并非不良习惯,这么做即使在增加血清素的分泌量方面也是有效的,不过呢,清晨还是先晒晒太阳,吃完早餐休息30分钟之后再开始运动比较好。 84 | 【批注】 85 | 【页码】36 86 | ------------------- 87 | -------------------------------------------------------------------------------- /docs/健康/鼻炎.md: -------------------------------------------------------------------------------- 1 | 苍耳子茶 2 | 辛夷花煲鸡蛋 3 | 五指毛桃排骨汤 4 | -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/1-1kafka体系结构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/1-1kafka体系结构.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/2-1生产者客户端的整体架构.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/2-1生产者客户端的整体架构.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/5-1日志关系.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/5-1日志关系.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/5-22磁盘IO流程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/5-22磁盘IO流程.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/5-23非零拷贝技术.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/5-23非零拷贝技术.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/5-24零拷贝技术.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/5-24零拷贝技术.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/5-3日志v0版本.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/5-3日志v0版本.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/5-4日志v1版本.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/5-4日志v1版本.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/5-7消息v2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/5-7消息v2.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/6-7时间轮.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/6-7时间轮.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/6-8多层时间轮.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/6-8多层时间轮.png -------------------------------------------------------------------------------- /docs/分布式/深入理解Kafka核心设计与实践原理/消费者与消费组.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/分布式/深入理解Kafka核心设计与实践原理/消费者与消费组.png -------------------------------------------------------------------------------- /docs/分布式/超大流量分布式系统架构解决方案.md: -------------------------------------------------------------------------------- 1 | # 1. 大规模服务化架构 2 | 3 | Google Dapper 论文,分布式链路跟踪四个关键设计目标 4 | 5 | - 服务性能损耗 6 | - 业务代码低侵入 7 | - 监控界面可视化 8 | - 数据分析准实时 9 | 10 | # 2. 全链路压测 11 | 12 | - 评估扩容数量 13 | - 验证系统容量是否能够有效支撑流量峰值 14 | 15 | 16 | # 3 . 削峰填谷--流控方案 17 | 18 | ### 3.1 为何需要限流 19 | 20 | - 扩容 21 | - 静态化(cdn) 22 | - 限流 23 | - 缓存 24 | - 队列 25 | 26 | CDN(缓存静态数据) -> 读系统(多级缓存) -> 写系统(削峰限流) -> DB 27 | 28 | ### 3.2 限流方案 29 | 30 | 池化技术(连接池、线程池、对象池):通过计数器算法限制全局并发数。 31 | 32 | - 令牌桶算法(Token Bucket) 33 | - 漏桶算法(Leaky Bucket) 34 | - 计数器算法: 单位是时间内计数并且和阈值不断比较 35 | 36 | Guava 是 google 提供的 Java Api。 37 | Nginx 配置限流 limit_req_zone 38 | 39 | ### 3.3 基于时间片的削峰方案 40 | 41 | - 活动分时间段实现削峰。业务角度,抢购时间段分为多次 42 | - 通过答题验证实现削峰 43 | 44 | ### 3.4 基于消息队列的解耦、削峰、最终一致性方案 45 | 46 | 47 | # 4. 大促抢购核心技术难题--读写优化方案 48 | 49 | ### 4.1 缓存技术简介 50 | 51 | - 本地缓存. Java Ehcache。多级缓存。GuavaCache + Redis。 52 | - 问题:占用系统内存。数据一致性问题 53 | - 分布式缓存 54 | 55 | ### 4.2 高性能分布式缓存 redis 56 | 57 | - hash 算法 58 | - 一致性哈希 59 | - 分槽算法 60 | 61 | 62 | ### 4.3 同一热卖商品高并发读取难题 63 | 64 | 单点瓶颈,热 key 都落到了同一个 slot 上。 65 | 66 | - 多级缓存方案。 67 | - 本地缓存(localcache)+分布式缓存的多级缓存方案。off-heap手段规避资源占用较高和频繁 GC 等问题。 68 | - 被动更新: 缓存过期,重新执行回源操作。注意避免失效之后的缓存击穿问题引起雪崩,使用 singleflight 模式或者限制一个线程访问 69 | - 主动更新:基于消息队列,修改数据后通过消息队列,所有订阅者消费并且更新本地缓存 70 | - RedisCluster 模式一主多从读/写分离方案 71 | 72 | 缓存穿透,通过日志等,自动上报和发现热点,实施热点保护。 73 | 74 | ### 4.4 同一热卖商品高并发写难题 75 | 76 | Mysql InnoDB 行锁问题。悲观锁(性能差)和乐观锁(增加 version 字段) 77 | 78 | 在关系数据库之外进行热卖商品的库存扣减操作。使用分布式锁会比较重。有以下两种方式: 79 | 80 | - 基于乐观锁实现库存扣减。 WATCH/MULTI/EXEC 命令结合即可实现乐观锁效果。 81 | - 结合 lua 脚本实现库存扣减。 redis执行 EVAL/EVALSHA 把它当做单条命令在执行,操作原子。扣减成功后,可以写入到消息队列实 82 | 现削峰,保证写入到数据库的流量可控。 83 | 84 | ```lua 85 | local sku = KEYS[1] -- 目标 SKU 86 | local num = tonumber(ARGV[1]) -- 需要扣减的数量 87 | local stock = tonumber(redis.call('GET', sku)) -- 获取目标 SKU 的库存 88 | local result = 0 89 | if (stock >= num) then 90 | redisl.call('DECRBY', sku, num) -- 原子扣减库存 91 | result = 1 92 | end 93 | return result 94 | ``` 95 | 96 | # 5. 分库分表方案 97 | 98 | sharding 中间件主要基于 Proxy 架构和应用集成架构两大类。 99 | 常见的 sharding 中间件 Cobar,MyCat,TDDL,Shark 100 | 101 | # 附录 102 | 103 | 大促备战: 104 | 105 | - 线上全链路压测:容量规划,挖掘系统性能短板 106 | - 常规配置检查:连接池、线程池配置 107 | - 数据库索引检查,防止出现慢查询 108 | - 黄金链路的限流、降级、熔断检查:根据压测结果及时调整相关阈值 109 | - 缓存项检查:热点数据优先缓存命中。热点key 应该尽早加入本地缓存,避免分布式缓存出现单点瓶颈 110 | - 故障红蓝演练:人为模拟故障验证相关预案是否充分有效,提升应急处理能力 111 | - 核心存储系统、中间件巡检:容灾性、容错性,资源检查 112 | - 异步化改造:哪些业务可以同步改为异步提升性能 113 | - 监控检查:验证监控的范围是否全面,避免系统成为脱缰野马 114 | 115 | 116 | async-profiler 开源 java 性能分析工具。火焰图分析性能瓶颈 117 | -------------------------------------------------------------------------------- /docs/开发工具/practical_vim/t.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding:utf-8 -*- 3 | 4 | 5 | if __name__ == '__main__': 6 | pass 7 | -------------------------------------------------------------------------------- /docs/开发工具/pro_git.md: -------------------------------------------------------------------------------- 1 | # 3: 分之 2 | 提交的时候会保存一个 commit 对象:它包含一个指向暂存内容快照的指针,作者和相关信息,以及一定数量(也可能没有)指向该提交对象直接祖先的指针。 3 | 分之:本质上是一个指向 commit 对象的指针,新建一个分之就是创建一个新的分之指针。git 鼓励多用分之,创建和销毁非常廉价。 4 | git 保存一个名为 HEAD 的特殊指针,它是一个指向你正在工作中的本地分之的指针(用来区分在哪个分之工作) 5 | Fast Forward: 如果顺着一个分之可以到达另一个分之,git 在合并两者的时候只会简单地把指针前移,没有分歧需要解决,这个过程叫做快进(fast forward)。 6 | merge commit: 如果有分叉,将合并的结果作为一个新的快照,然后创建一个指向它的commit 7 | git push [远程名] [本地分之]:[远程分支] 8 | 9 | 合并(merge)与衍合(rebase): 10 | rebase: 一个分之里提交的改变在另一个分之里重放一遍。 11 | 原理:回到两个分之(你所在的分之和你要rebase进去的分之)的"共同祖先",提取你所在分之每次提交产生的差异(diff),把这些差异分别保存在临时文件里,然后从当前分之 12 | 转换到你需要 rebase 的分之,依序施用每一个diff 文件。按照每行发生的顺序重演发生的改变。 13 | git rebase [主分支] [特性分之] 会先检出特性分之,然后在主分支上重演。 14 | 15 | rebase 黄金定律:永远不要rebase 那些已经推送到公共仓库的更新。(rebase实际上抛弃了一现存的commit 而创造了一些类似的不同的新的 commit) 16 | 如果把rebase 当成一种在推送之前清理提交历史的手段,而且仅仅rebase 那些永远不会公开的commit,就不会有任何问题。 17 | 18 | # 4: 服务器上的 Git 19 | 四种协议:本地协议;ssh协议;git协议;http协议 20 | 21 | 22 | # 5:分布式 Git 23 | 本章讲了不同大小团队使用 git 的工作流 24 | 25 | 为项目做贡献: 26 | 如何撰写提交说明,保持一行。 27 | 不要多余空白字符 28 | 每次提交限定与完成一次逻辑功能,适当分解为多次小更新。 29 | rewind (回退) 30 | 31 | 32 | # 6: 项目的管理 33 | 34 | rebase 和 cherry-pick: 35 | cherry-pick 类似于针对某次特定提交的 rebase 36 | 37 | 38 | # 7: git 工具 39 | 交互式暂存: git add -i 40 | 41 | stash(储藏):git stash apply stash@{2} 42 | 43 | 改变最近一次提交说明:git commit --amend 修改提交信息,但是不要在最近一次提交被推送后还去修改 44 | 修改多个提交说明: git rebase -i (注意千万不要涵盖你已经push到中心服务器的提交) 45 | 46 | 核弹级选项:filter-branch: 比如错误提交了二进制文件或者密码配置文件。会大面积修改提交历史,不要在公开项目搞。 47 | 48 | 使用 Git 调试: 49 | git blame 50 | git bisect 二分查找 51 | 52 | 子模块: 53 | git submodule add git://github.com/XXXX XXXX 54 | 55 | 56 | # 8: 自定义 Git 57 | 58 | 配置代码merge 和diff 工具 59 | 60 | 61 | Git 挂钩:客户端和服务器端 62 | 在 .git/hooks 下的可执行文件,刻意激活该挂钩脚本 63 | 64 | 65 | # 9: Git 与其他系统 66 | git svn : 桥接工具 67 | 68 | # 10: Git 内部原理 69 | 本质上 git 是一套内容须知(content-addressable)文件系统 70 | 如何清理误假如的大文件 71 | -------------------------------------------------------------------------------- /docs/开发工具/vim8文本处理实战/vim-commenter/autoload/commenter.vim: -------------------------------------------------------------------------------- 1 | " if comment_str exists 2 | function! g:commenter#HasCommentStr() 3 | if exists('g:commenter#comment_str') 4 | return 1 5 | endif 6 | echom "vim-commenter doesn't work for filetype " . &ft . " yet" 7 | return 0 8 | endfunction 9 | 10 | " 检测一个行区间中的最小缩进数 11 | function! g:commenter#DetectMinIndent(start, end) 12 | let l:min_indent = -1 13 | let l:i = a:start 14 | while l:i <= a:end 15 | if l:min_indent == -1 || indent(l:i) < l:min_indent 16 | let l:min_indent = indent(l:i) 17 | endif 18 | let l:i += 1 19 | endwhile 20 | return l:min_indent 21 | endfunction 22 | 23 | 24 | function! g:commenter#InsertOrRemoveComment(lnum, line, indent, is_insert) 25 | " 处理无缩进的情况 26 | let l:prefix = a:indent > 0 ? a:line[:a:indent-1] : '' 27 | if a:is_insert 28 | call setline(a:lnum, l:prefix . g:commenter#comment_str . a:line[a:indent:]) 29 | else 30 | call setline( 31 | \ a:lnum, l:prefix . a:line[a:indent+len(g:commenter#comment_str):]) 32 | endif 33 | endfunction 34 | 35 | function! g:commenter#ToggleComment(count) 36 | if !g:commenter#HasCommentStr() 37 | return 38 | endif 39 | let l:start = line('.') 40 | let l:end = l:start + a:count - 1 41 | if l:end > line('$') " stop at enf of file 42 | let l:end = line('$') 43 | endif 44 | 45 | let l:indent = g:commenter#DetectMinIndent(l:start, l:end) 46 | let l:lines = l:start == l:end ? 47 | \ [getline(l:start)] : getline(l:start, l:end) let l:cur_row = getcurpos()[1] 48 | let l:cur_col = getcurpos()[2] 49 | let l:lnum = l:start 50 | if l:lines[0][l:indent:l:indent+len(g:commenter#comment_str)-1] ==# 51 | \ g:commenter#comment_str 52 | let l:is_insert = 0 53 | let l:cur_offset = -len(g:commenter#comment_str) 54 | else 55 | let l:is_insert = 1 56 | let l:cur_offset = len(g:commenter#comment_str) 57 | endif 58 | for l:line in l:lines 59 | call g:commenter#InsertOrRemoveComment(l:lnum, l:line, l:indent, l:is_insert) 60 | let l:lnum += 1 61 | endfor 62 | call cursor(l:cur_row, l:cur_col+l:cur_offset) 63 | endfunction 64 | 65 | " Toggle comment 66 | " function! g:commenter#ToggleComment() 67 | " if !g:commenter#HasCommentStr() 68 | " return 69 | " endif 70 | " let l:i = indent('.') 71 | " echo l:i 72 | " let l:line = getline('.') 73 | " let l:cur_row = getcurpos()[1] 74 | " let l:cur_col = getcurpos()[2] 75 | " " 处理无缩进情况 76 | " let l:prefix = l:i > 0 ? l:line[:l:i-1] : '' 77 | " if l:line[l:i:l:i+len(g:commenter#comment_str)-1] == g:commenter#comment_str 78 | " call setline('.', l:prefix . l:line[l:i+len(g:commenter#comment_str):]) 79 | " let l:cur_offset = -len(g:commenter#comment_str) 80 | " else 81 | " call setline('.', l:prefix . g:commenter#comment_str . l:line[l:i:]) 82 | " let l:cur_offset = len(g:commenter#comment_str) 83 | " endif 84 | " call cursor(l:cur_row, l:cur_col+l:cur_offset) 85 | " endfunction 86 | " 87 | -------------------------------------------------------------------------------- /docs/开发工具/vim8文本处理实战/vim-commenter/ftplugin/python.vim: -------------------------------------------------------------------------------- 1 | let g:commenter#comment_str = '# ' 2 | -------------------------------------------------------------------------------- /docs/开发工具/vim8文本处理实战/vim-commenter/plugin/commenter.vim: -------------------------------------------------------------------------------- 1 | " nnoremap gc :call g:commenter#ToggleComment() 2 | 3 | 4 | " v:count1 表示获取命令的数字,并且默认1。:help v:count 5 | " < Note: The is required to remove the line range that you 6 | " get when typing ':' after a count. 7 | nnoremap gc :call g:commenter#ToggleComment(v:count1) 8 | 9 | 10 | " 或者通过可视模式的多行选择实现多行注释 11 | " 12 | " vnoremap gc :call g:commenter#ToggleComment( \ line("'>") - line("'<")+1) 13 | -------------------------------------------------------------------------------- /docs/开发工具/wizardsusevim.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 技巧:如何映射命令自动编辑完成配置之后 source 4 | 5 | " Make easy editing and sourcing vimrc 6 | command! RefreshConfig source $MYVIMRC echo "Refreshed vimrc!" 7 | " ev for editing vimrc 8 | :nnoremap ev :vsplit $MYVIMRC 9 | " sv for sourcing vimrc 10 | :nnoremap ev :RefreshConfig 11 | 12 | 13 | ## copy, pasting and vim Registers 14 | 15 | - yank and put 16 | - using resgisters 17 | 18 | set clipboard+=unnamedplus "neovim use system clipboard 19 | set clipboard=unnamed "use system clicpboard 20 | 21 | 22 | ## undo and redo 23 | 24 | 25 | undo: u 26 | redo: ctrl + r 27 | 28 | 29 | ## Inserting Text 30 | aio 31 | 32 | gi: puts you in the insert mode at the last place you left insert mode 33 | 34 | - ctrl+h 删除上一个字符 35 | - ctrl+w 删除 上一个 word 36 | - c-u 删除上一行 37 | - " paste from the unnamed register 38 | 39 | 40 | ## Visual Mode 41 | 42 | - v : character wise 43 | - V : line wise 44 | - ctrl+v: block wise 45 | 46 | 47 | ## More command Mode 48 | 49 | :s (substitute) 50 | :{range}s/{pattern}/{replace}/{flags} 51 | 52 | 53 | ## Splitting Windows 54 | 55 | 如何映射快捷键 56 | 57 | nnoremap h 58 | 59 | 60 | ## Tabs 61 | 62 | gt/gT/tabonly 63 | 64 | ## Moving Around Files 65 | 66 | - go back to the jumplist 67 | - or move forward within the jumplist 68 | - g; to go back the changelist 69 | - g, to go forward the changelist 70 | - %: bewteen matching brackets 71 | - gg/G 72 | 73 | 74 | ## Multifile Editing 75 | 76 | args 77 | multiple cursors 78 | 79 | 80 | ## Configuring Vim 81 | 82 | #### how do you configure Vim 83 | - use Ex commands in command line mode 84 | - Using a vim congiguration file 85 | - Through a set of limited command line options 86 | 87 | 88 | ## 持久化配置 89 | 90 | ".vimrc demo 91 | 92 | set nocompatible 93 | filetype plugin indent on 94 | syntax enable 95 | 96 | map: recursive mapping. 97 | noremap: non-recursive mapping。几乎大部分场景都是使用非递归映射 98 | 99 | 100 | ## 定义自己的命令 101 | 102 | command! RefreshConfig source $MYVIMRC 103 | " then use :RefreshConfig ex command souce vimrcfile 104 | 105 | 106 | ## Leader Key 107 | 108 | 为什么需要 leder key?键盘上按键就那么多,要防止快捷键冲突,可以加上前缀 leader。 109 | 110 | " default leader key is \, hard to type。通常用空格或者逗号替换 111 | let mapleader = "," 112 | let mapleader = "\" 113 | 114 | 115 | ## Extending Vim With Plugins 116 | 117 | - 安装插件管理器 118 | - 增加必要配置到vimrc 119 | - 添加需要的插件配置 120 | - 使用命令安装、更新或者删除插件 121 | 122 | - 常用插件推荐 123 | 124 | 125 | ## 自定义colorscheme 126 | colorschem 或者插件 127 | -------------------------------------------------------------------------------- /docs/思维认知/专注力_化繁为简的惊人力量.md: -------------------------------------------------------------------------------- 1 | # 1章:如何专注于至关重要的20% 2 | 二八定律 3 | 将 80% 的注意力集中在你的优势上,专注于积极事件 4 | 5 | # 2章:如何专注于你的第一个目标 6 | 如何设定 SMART 目标 7 | 大目标分解 8 | 写下排名前三的目标: 9 | 1. 明确了解现在的实际情况,越具体越好 10 | 2. 过去你所做的什么事情造成了现在的局面 11 | 3. 为了活的想要的结果,你做了那些不一样的事情 12 | 4. 为了保证你可以做到上一步的事情,你需要拥有些什么,或者需要做什么 13 | 5. 你需要哪些资源(时间、金钱、他人帮助)?如何获取这些资源?你需要为此放弃某些事情吗? 14 | 6. 做些不一样的事情,并且对这些事情的效果持续评估。如果无效,考虑做其他事情,直到你的目标实现 15 | 16 | 绘制目标地图,设置时间期限 17 | 18 | # 3章:如何专注时间模式以取得成功 19 | 20 | 21 | # 4章:克服专注障碍 22 | 摆脱没给你带来很好回报的 80% 的事情,做最重要的事情 23 | 24 | 摆脱不太重要的 80%: 25 | - 删除或减少(不重要的会议、处理文书、邮件) 26 | - 分配任务 27 | 28 | 将任务分解之后再做 29 | 30 | 创造心流: 31 | - 1.选一个刚好在你的能力范围之内或者刚刚超出能力范围的任务。 32 | - 2.确保任务包含及时反馈 33 | - 3.创造一个注意力分散点尽量少的环境 34 | 35 | # 5章:专注于已经奏效的事情 36 | 37 | 38 | # 6章:如何战胜拖延 39 | 任务越小,越容易完成 40 | 具象化 41 | 42 | # 7章:如何利用『第二自我』策略 43 | 44 | # 8章:如何管理其他人 45 | 我们通过训练他人以使自己获得正确的对待 46 | 47 | # 9章:如何专注于语言以取得非同寻常的效果 48 | 融洽的关系基于相似性或者对于彼此相似性的感知 49 | 表象系统(视频、听觉、感觉) 50 | 用先跟后带的方式引导对话,非常有利于建立良好的关系。 51 | - 完善你的跟进方式。后退一步,和对方保持步调一致,然后小心地慢慢向前。最终你把双方的谈话引导到有利于自己目标的方向上 52 | - 用重新架构的力量说服他人。用不同的方式看待事物。重组 53 | - 用比喻和故事来专注于你的交谈。练习使用比喻 54 | - 使用『三问』技巧消除对立。反对他人观点之前,至少提出三个问题,帮助你了解他们的真实意图 55 | - 如何打破僵局。将观点在此基础上进行一级或者多级倒推,直到来到自己观点和对方一致的地方,然后再得出其他可选的做法 56 | - 因为你同意,所以他们提出反对(如何应对极性反应)。给他们一些选择,然后选择其中之一;正话反说 57 | - 58 | 听从建设性内心引导,而不是严格自我批判 59 | 60 | # 10章:如何建立信息专注 61 | 62 | 消音耳机 63 | 有目的地消费信息 64 | 65 | # 11章:如何战胜堆积如山的文案工作 66 | 归档 67 | 清单 68 | 69 | # 12章:驯服邮件怪兽 70 | 71 | # 13章:掌控会议和社交 72 | 你是否真的需要出席会议 73 | 你们是否都知道会议的目的 74 | 是否有日程和时间限制 75 | 会议中所做的决议是否清晰 76 | 保持简单 77 | 是否已经设定基本准则 78 | 79 | # 14章:应对最后期限和多项任务 80 | 81 | 3D 准则: 82 | - 跳过(delete): 如果这一步骤你觉得无关紧要 83 | - 委派(delegate):如果其他人比你做的更快更好或节约成本,并且这是在你的 20% 之外 84 | - 执行(Do): 85 | 86 | 监控你的进展:不要急于追究责任。问题发生时人们很容易立即想到谁的过失引发了问题,而不是应该怎样解决问题。 87 | - 现在能做什么来解决问题? 88 | - 谁是解决问题的最佳人选? 89 | - 我们怎样避免问题再次发生? 90 | 91 | # 15章:如何保持新发现的注意力 92 | 健康和健身 93 | 家庭关系 94 | 友谊 95 | 96 | # 16章:目标突破经验 97 | 障碍: 98 | 网瘾 99 | 旧习惯很难改变 100 | 挫折是难免的 101 | 102 | # 17章:有条不紊实现所有目标 103 | 1. 分析你的80/20时间 104 | 2. 设置你的第一个目标。绘制目标地图 105 | 3. 检查并改变你的时间模式 106 | 4. 战胜常见障碍 107 | 5. 利用已经见效的方法。专注于利用自己的优势 108 | 6. 克服最终拖延的毛病 109 | 7. 使用第二自我策略 110 | 8. 通过影响他人获得支持和帮助 111 | 9. 专注于你的语言 112 | 10. 创造信息专注 113 | -------------------------------------------------------------------------------- /docs/思维认知/为什么精英这样用脑不会累.md: -------------------------------------------------------------------------------- 1 | 本书主要是讲如何将脑科学的一些研究成果应用到日常工作中去。 2 | 3 | # 1 多巴胺工作术 自由控制幸福物质 4 | 5 | 多巴胺工作术7个步骤: 6 | 7 | - 设定目标。设定一个个难度适中的小目标(里程碑),目标要难度适中,有难度但是有实现的希望。 8 | - 想象目标实现时候自己的样子(心理对照) 9 | - 反复确认目标(比如可以贴在墙上) 10 | - 快乐地行动。转换成积极的思维方式,并且用语言表述出来 11 | - 实现目标后给自己奖赏(比如吃一顿美食)。无论是来自别人还是自己的赞美与奖赏 12 | - 马上设定更高的目标(不要止步不前)。人脑喜欢挑战 13 | - 重复前面的成功过程 14 | 15 | 多巴胺喜欢『变化』和『新奇』 16 | 17 | 工作开始之前,把时间目标->获得奖励引入工作,工作会变得像游戏一样轻松 18 | 19 | 适当运动是刺激多巴胺分泌最简单有效的方法。补充富含酪氨酸(肉、牛奶、杏仁、花生等),维生素 B6(香蕉、牛奶、金枪鱼等) 20 | 21 | 分泌过多可能导致『依赖症』,购物、赌博、吸毒等 22 | 23 | # 2 去甲肾上腺素工作术 "恐惧"和"压力"可以提高工作效率 24 | 25 | 精神压力使用得当,可以提高专注力。但是只能短期使用 26 | 27 | 两种动机:一种是『回避不快』,一种是『追求快感』 28 | 29 | - 去甲肾上腺素型动机:为了逃避恐惧、批评、责骂而努力(短期) 30 | - 多巴胺型动机:为了追求快乐、表扬而努力(长期) 31 | 32 | 应对不喜欢的工作: 33 | 34 | - 借助去甲肾上腺素的效果,迅速将不喜欢的工作做完 35 | - 重构工作法,积极的思维方式 36 | - 完成工作给自己奖赏 37 | - 拒绝不喜欢的工作 38 | 39 | 人即使快乐地工作也会产生精神压力,注意不要工作过度。休息的时候尽量忘掉工作,减少看手机的时间和次数。 40 | 41 | # 3. 肾上腺素工作术 把愤怒和兴奋变成朋友 42 | 43 | 肾上腺素可以提高身体机能。 44 | 深呼吸可以平息过度紧张、兴奋。 45 | 46 | # 4. 血清素工作术 利用治愈物质提高上午的工作效率、转换心情 47 | 48 | 早起后的几个小时效率最高。 49 | 拉开窗帘睡觉. 50 | 51 | 提高血清素活力的方法: 52 | 53 | - 日光浴 54 | - 有节奏的运动 55 | - 咀嚼 56 | 57 | 高效转换心情的方法: 58 | 59 | - 外出吃午餐 60 | - 边散步边思考 61 | - 深呼吸(腹肌呼吸法) 62 | - 大声朗读 63 | - 简单的运动(扭脖子) 64 | - 组合运动和呼吸 65 | - 把提高血清素活力变成一种习惯 66 | 67 | 锻炼血清素神经,预防抑郁症。 68 | -------------------------------------------------------------------------------- /docs/思维认知/如何想到又做到.md: -------------------------------------------------------------------------------- 1 | 三类行为,七大武器: 2 | 3 | 自动行为:无意识的,根本没想到要改变的不良行为 4 | 5 | 冲动行为:有意识,但因为上瘾很难改变的不良行为 6 | 7 | 常见行为:有意识,也想改变,就是没有持续改变动力的不良行为 8 | 9 | 10 | 11 | ## 阶梯模型:整合步骤、目标与梦想 12 | 13 | 把大目标切割成小步骤。小步骤可以提高成功的概率。 14 | 15 | 16 | ## 社交磁力:让他人成为推动自己改变的力量 17 | 18 | 在社群中找到榜样的力量、找到归属感。这就是社群的力量,它可以帮助我们和他人来实现持续的改变。 19 | 20 | ## 要事为先:找到对自己最重要的那件事 21 | 22 | 23 | ## 极度容易:越简单,越能坚持到底 24 | 25 | 把事情变得真正容易,可以让我们更有可能坚持下去。 26 | 27 | 28 | ## 行为在前:行为改变了,意识也会随之改变 29 | 30 | 31 | 要想改变,应该反过来。也就是,要先改变自己的行为,思想才会随之改变。 32 | 33 | ## 致命吸引:极度诱惑能让你无法克制地坚持下去 34 | 35 | 把一件事变得有吸引力,可以让我们不停地做下去,就像玩游戏一样。 36 | 37 | ## 反复铭刻:把行为变成习惯,将习惯设为默认 38 | 39 | 如果我们反复看到、听到或闻到某种东西,大脑就会存储相应的信息,让我们无须思考地迅速认出它、检索它。比如,如果我们走相同的路线去上班,大脑就会储存这个信息,让我们每天不用特意记住怎么走,就能径直到达工作地点。 40 | 41 | 把事情变成惯例,把它铭刻到大脑里,我们就更容易坚持做下去。 42 | -------------------------------------------------------------------------------- /docs/思维认知/如何高效记忆.md: -------------------------------------------------------------------------------- 1 | # 2: 认识你的记忆:什么是记忆 2 | 3 | 三个阶段: 4 | 读取或编码 5 | 存储 6 | 检索 7 | 8 | 长期记忆三种类型: 9 | 1.程序记忆 10 | 2.语义记忆 11 | 3.情景记忆 12 | 13 | 测量记忆: 14 | 回忆 15 | 识别 16 | 再学习 17 | 18 | 19 | # 3:记忆如何运行 20 | 21 | 遗忘:衰退说、压抑说、扭曲说、干扰说、检索说 22 | 23 | # 4:记忆的原则 24 | 使内容有意义: 25 | 熟悉 26 | 韵律 27 | 规律:内容结构 28 | 29 | 组织: 30 | 序列位置效应:项目顺序影响记忆难易程度。复杂项目排在列表结尾 31 | -------------------------------------------------------------------------------- /docs/思维认知/批判性思维工具.md: -------------------------------------------------------------------------------- 1 | 批判性思维:建立在良好判断的基础上,使用恰当的评估标准对事物的真实价值进行判断和思考。分析、评估、创造性。 2 | 3 | # 1章:成为公正的思考者 4 | 批判性思维的强弱:公正性。目的、证据、结论、意义和观点 5 | 公正性需要什么:平等对待每一种观点。思维谦逊。思维的勇气。换位思考。思维正直。思维坚毅。对推理的信心。思维自主 6 | 7 | # 2章:批判性思维前四个阶段 8 | 9 | 鲁莽的思考者 10 | 质疑的思考者 11 | 初始的思考者 12 | 练习中的思考者 13 | 高级的思考者 14 | 完善的思考者 15 | 16 | # 3章:自我理解 17 | 大脑的三个基本功能:思维、感受和需求 18 | 19 | # 4章:思维的组成 20 | 思维元素的组成: 21 | 22 | 悬而未决的问题 23 | 信息 24 | 解释和推理 25 | 概念 26 | 假设 27 | 结果和意义 28 | 观点 29 | 目的 30 | 31 | 区分推论和假设: 32 | 推论:个体根据一些正确或者看似正确的命题归纳总结,得出结论的过程 33 | 假设:我们认为理所当然是推理前提的信息 34 | 35 | 形成假设的过程常常是无意识的。 36 | 37 | # 5章:思维标准 38 | 39 | 清晰性: 你能详细描述那个观点吗?你能换个方式表达吗?你能图解吗?能举个例子吗 40 | 准确性: 真的吗?如何确定正确性。质疑 41 | 精确性: 你能给出更多细节吗? 42 | 相关性:这个观点是怎样与问题相连的. 43 | 深度: 如何考虑这个问题中的难点的?如何处理问题中最重要的因素的 44 | 广度: 从。。。的角度看问题会怎样 45 | 逻辑性:真的有道理吗?这是根据你的论据推断出来的吗?如何从证据中得出这个推论 46 | 重要性: 这些观点或者概念中的哪一个是最重要的?关注真正重要的问题 47 | 公众性: 公平思考,根据推理论证得出结论 48 | 49 | 根据证据做出推断;检查每项推理的一致性;确认推理的前提假设;确认你的推理具有逻辑性 50 | 51 | 52 | # 6章:培养良好思维的提问 53 | 54 | 三种问题类型: 55 | 单体系问题 56 | 无体系问题 57 | 多体系问题 58 | 59 | 基于事实的提问 60 | 基于偏好的提问 61 | 基于判断的提问 62 | 63 | 苏格拉底式提问:确定问题优先级 64 | 65 | # 7:掌握思维,掌握内容 66 | -------------------------------------------------------------------------------- /docs/思维认知/科学学习.md: -------------------------------------------------------------------------------- 1 | # A 归纳类比 Analogy, 发现共通原理 2 | 3 | # B 归属感 Belonging, 消除焦虑,融入集体 4 | 5 | # C 对比组合 Contrasting Cases, 辨别关键信息 6 | 7 | # D 刻意练习 Deliberate Practice,专家养成之路 8 | 9 | # E 详细阐释 Elaboration,让记忆更有意义 10 | 建立新信息和已知信息的关联: 11 | - 准确且相关的解释 12 | - 组块化 13 | - 与结构清晰的知识相融合 14 | 15 | # F 反馈 Feedback, 自我提升的明镜 16 | 17 | 反馈强度:没有反馈 正确 错误 指出具体差距 详细描述问题 信息过载 18 | 19 | 有利于学习者追根溯源的反馈信息:具体准确,实际恰当,易于理解,不丢面子,存在改进空间 20 | 21 | # G 自我生成 Generation, 创建持久记忆 22 | 23 | - 难度适宜 24 | - 强化线索到记忆之间的路径 25 | - 间隔再联系 26 | 27 | # H 实践体验 Hands On , "动"用身体的智慧 28 | 29 | # I 想象玩耍 Imaginative Play, 锻炼认知控制 30 | 31 | # J 适时讲解 Just-in-Time Telling, 通过铺垫体验,让讲解更具意义 32 | 33 | # K 知识与创新 Knowledge, 论述知识学习中的高效与创新 34 | 35 | # L 倾听与共享 Listening and Sharing, 协作学习效果好 36 | 37 | - 共享注意力 38 | - 倾听 39 | - 共享: 相同的目标;分享自己的想法 40 | - 协调 41 | - 换位思考 42 | 43 | # M 动手创造 Making, 创造中培养兴趣,实践中获得真知 44 | 45 | - 让学习工具更容易获取 46 | - 将反馈与借鉴的机会设计到过程之中 47 | - 为目标设定和学习提供充足的资源 48 | 49 | 优质项目式学习的4个条件: 50 | 51 | - 合适的学习目标 52 | - 充足的学习资源 53 | - 多次反馈与修改的机会 54 | - 鼓励原创与支持交流的社交环境 55 | 56 | # N 规范 Norms ,培养学习的游戏规则 57 | 58 | # O 观察 Observation, 外募于形,内感于心 59 | 60 | 心理理论与镜像效应 61 | 62 | # P 参与 Participation,加入游戏 63 | 64 | 三个辅助初期学习的核心因素: 实践社群,社交调解,辅助支架 65 | -------------------------------------------------------------------------------- /docs/思维认知/认知天性.md: -------------------------------------------------------------------------------- 1 | 本书主要介绍了一些认知心理学领域的研究成果如何运用在学习中。 2 | 3 | # 2 学习的本质:知识链和记忆结 4 | 5 | 间隔式重复检索有利于长期记忆。有时间间隔的练习会改善记忆。 6 | 检索时付出的认知努力越大,记忆效果越好。 7 | 测验比重复阅读更能将知识迁移到新的背景或问题中 8 | 9 | # 3. 后刻意练习时代的到来 10 | 频繁的集中式练习只会产生短期记忆。只有当练习被分散安排在有间隔的培训里,才更有效。 11 | 多样化练习促进知识的活学活用 12 | 13 | # 4. 知识的滚雪球效应 14 | 15 | 编码-> 巩固 ->检索 16 | 17 | 学习中必须要做哪些努力: 18 | - 重新巩固记忆 19 | - 打造心智模型 20 | - 举一反三 21 | - 构建概念学习 22 | - 学习迁移 23 | 24 | 25 | # 5 打造适合自己的心智模型 26 | 27 | 实践和测验才能暴露学习漏洞。回答抽认卡,同伴教学法 28 | 29 | # 6 选择适合自己的学习风格 30 | 31 | - 自己把握。探索 32 | - 接受成功智力的概念。不要局限在自己的学习风格中 33 | - 把专场看作处在不断发展的状态中,动态检测当成一种学习方法 34 | - 主动学习方法,例如检索学习、有间隔的练习和穿插练习 35 | - 不要凭感觉做事。小测验,同伴互评 36 | - 认知努力越多,学得越深刻 37 | - 提取基本原则,构建结构。如果是案例学习者,一次学习多个案例,问自己案例的相同不同之处,不同到需要不同的解决方法,还是相同到 可以用普遍方法应对。 38 | - 把你的想法和想要得到的能力分解成各个组成部分 39 | - 核心概念组合成框架 40 | - 结构无处不在,提取规则整合到结构里 41 | 42 | # 7 终身学习者基本的基本 43 | 44 | 像专家一样思考:自律、勇气和成长心态这些素质才让人敢想敢做,具备创造力和毅力,获得更多学问和成功。 45 | 46 | 学习执行力比学习技巧更重要:专家级的表现需要刻意练习 47 | 48 | 掌握适合自己的记忆方法:视觉化 49 | 50 | 努力学习可以改变大脑 51 | 52 | # 8 写给大家的学习策略 53 | 54 | 学生: 55 | 56 | - 练习从记忆中检索知识 57 | - 有间隔地安排检索练习 58 | - 学习时穿插不同类型的问题 59 | - 细化。把资料和已知的东西联系起来,用自己的语言给别人解释。为资料提供一种比喻或形象解释。 60 | - 生成。在得到答案或者解决方案之前,尝试自己解答疑问或者解决问题 61 | - 学习小结。反思学到了什么 62 | - 助记手段 63 | 64 | 教师 65 | 66 | - 透明度。测验效应、合意困难。提出问题,自主思考 67 | - 分组测验。探索和理解 68 | - 自由回忆。每天结束后把能记住的所有课程内容写出来 69 | - 总结表。每周上交一份清单,以某些角度理解前一周的资料,配上核心概念、箭头和图形。 70 | - 学习小结。 71 | - 给学习分层。(布鲁姆分类学) 72 | 73 | -------------------------------------------------------------------------------- /docs/思维认知/超效率手册.md: -------------------------------------------------------------------------------- 1 | [超效率手册](https://book.douban.com/subject/26703731/) 2 | 3 | # 1 克服拖延症 4 | 1. 周/日目标 5 | 6 | 2. 限定时间 7 | 8 | 3. 分解任务: 大任务是滋生拖延的温床。分解没有明确截止时间的任务 9 | 10 | 4. 短跑理论:意志力有限 11 | 12 | 5. 日程校对:对待办事项有充分信任的时候所做的事 13 | 14 | 6. 加强自律:意志力训练 15 | 16 | 7. 使用咒语:常对自己重复说的话 17 | 18 | 8. 根除潜在绊脚石:检验激发你内心积极性的目标和愿望 19 | 20 | 9. 动力催化剂:目标列表放到桌面;公开承诺;便利贴 21 | 22 | 10. 搅拌:生产垃圾的艺术 23 | 24 | 11. 营造一个不会分心的工作场所:关掉电脑通知;清理书桌无用东西;禁止打扰标签;让人们知道你的专注时间 25 | 26 | 12. 拒绝应该: 把跟目标无关的『应该做』归入不去做 27 | 28 | 13. 预备、射击、瞄准:先行动,然后纠正方法。早收到反馈 29 | 30 | 14. 摒弃拖延恶习:摒弃和压缩恶习 31 | 32 | # 2 做事更有条理 33 | 34 | 15. 条理性是一种技能:专门的设计和保持 35 | 36 | 16. 少点混乱,少点压力:物理环境让你的事物排列有序;任务和待办 37 | 38 | 17. 捕捉装置:随时记录待办 39 | 40 | 18. 给所有东西规定放置的地方 41 | 42 | 19. 简单的组织系统:项目、任务、活动 43 | 44 | 20. 简单的组织系统:项目,有共同目标的多个任务的集合 45 | 46 | 21. 简单的组织系统:任务,具体要去做的事情 47 | 48 | 22. 简单的组织系统:活动,一些只能在特定时间干的事情 49 | 50 | 23. 写出你的目标 51 | 52 | 24. 分支法:归类 53 | 54 | 25. 通信记录: 55 | 56 | 26. 做你承诺过的事情 57 | 58 | 27. 整齐 VS 有条理: 59 | 60 | 28. 阅读笔记:活页夹笔记 61 | 62 | 29. 数字条理性:文件归档、清理 63 | 64 | # 3 保持活力 65 | 66 | 30. 晨礼:醒来后30-60 分钟持续不断进行的一系列活动,避免过度脑力活动 67 | 68 | 31. 休假一天:过度劳累和拖延也有关系 69 | 70 | 21.日常运动:有限的是精力,不是时间 71 | -------------------------------------------------------------------------------- /docs/思维认知/高效程序员的45个习惯.md: -------------------------------------------------------------------------------- 1 | # 1. 敏捷-高效软件开发之道 2 | > 个体和交互胜过过程和工具 3 | > 可工作的软件胜过面面俱到的文档 4 | > 客户协作胜过合同谈判 5 | > 响应变化胜过遵循计划 6 | > 虽然右项也有价值,但我们认为左项具有更大的价值。 7 | > 敏捷宣言作者,2001年版权所有。 8 | 9 | 敏捷开发就是在一个高度协作的环境中,不断地使用反馈进行自我调整和完善。 10 | 11 | # 2. 态度决定一切 12 | - 1.做事:指责不会修复 bug 13 | - 2.欲速则不达:拙劣的代码工人会这样不假思索地改完代码,然后快速转向下一个问题。不要坠入快速的简单修复之中。要投入时间和精力保持代码的整洁、敞亮。 14 | - 3.对事不对人:引导性地提出一个疑问,让他们自己意识到问题。你不需要很出色才能起步,但是你必须起步才能变得很出色。 15 | - 设定最后期限;设立仲裁人;支持已经做出的决定 16 | - 4.排除万难,奋勇前进: 17 | 18 | # 3. 学无止境 19 | - 5.跟踪变化 20 | - 6.对团队投资:一个学习型的团队才是好的团队 21 | - 7.懂得丢弃:学习新东西,抛弃旧的东西 22 | - 8.打破沙锅问到底:多问为什么 23 | - 9.把握开发节奏:许多的敏捷技巧来源于时间盒——设定一个短时的期限,为任务设定不能延长的最终期限。 24 | 25 | # 4.交付用户想要的软件 26 | - 10.让客户做决定:开发者(及项目经理)能做的一个最重要的决定就是:判断哪些是自己决定不了的,应该让企业主做决定 27 | - 11.让设计指导而不是操纵开发。设计满足需求即可。CRC(类—职责—协作)卡片:类名;职责(它应该做什么);协作者(要完成工作与其他什么对象一起工作) 28 | - 12:根据需要选择技术 29 | - 13.保持可以发布:已提交的代码应该随时可以行动 30 | - 14.提早集成,频繁集成 31 | - 15.提早实现自动化部署 32 | - 16.使用演示获得频繁反馈 33 | - 17.使用短迭代,增量发布 34 | - 18.固定的价格就意味着背叛承诺 35 | 36 | # 5.敏捷反馈 37 | - 19.守护天使:编写能产生反馈的代码:测试是可重复的;测试边界条件;不要放过失败的测试用例 38 | - 20.先用它再实现它:TDD 39 | - 21.不同环境就有不同问题 40 | - 22.自动验收测试 41 | - 23.度量真实的进度:待办 42 | - 24.倾听用户声音 43 | 44 | # 6.敏捷编码 45 | 46 | - 25.代码要清晰地表达意图。清晰度应该排在效率之前 47 | - 26.用代码沟通 48 | - 27.动态评估取舍 49 | - 28.增量式编程 50 | - 29.保持简单。开发可以工作的、最简单的解决方案 51 | - 30.编写内聚的代码:内聚性用来评估一个组件(包、模块或配件)中成员的功能相关性。内聚程度高,表明各个成员共同完成了一个功能特性或是一组功能特性。内聚程度低的话,表明各个成员提供的功能是互不相干的。 52 | - 31.告知,不要询问:面向过程的代码取得信息,然后做出决策。面向对象的代码让别的对象去做事情。命令与查询相分离模式 53 | - 32.根据契约进行替换: is-a has-a 54 | 55 | # 7.敏捷调试 56 | 57 | - 33 记录问题解决日志 58 | - 34 警告就是错误 59 | - 35 对问题各个击破 60 | - 36 报告所有的异常:处理或是向上传播所有的异常 61 | - 37 提供有用的错误信息 62 | - 63 | # 8.敏捷写作 64 | 65 | - 38 定期安排会面时间:站立会议 66 | - 39 架构师必须写代码 67 | - 40 实行代码集体所有制 68 | - 41 成为指导者 69 | - 42 允许大家自己想办法 70 | - 43 准备好后再共享代码 71 | - 44 做代码复查 72 | - 45 及时通报进展与问题。发布进展状况、新的想法和目前正在关注的主题。不要等着别人来问项目状态如何。 73 | - 74 | # 9.尾声:走向敏捷 75 | 76 | - 9.1 只要一个新的习惯 77 | - 9.2 拯救濒临失败的项目 78 | - 9.3 引入敏捷:管理者指南:从立会开始(见第148页习惯38)。这可以让团队有机会进行彼此讨论,并对一些重大问题达成共识。把之前相对孤立的架构师带到团队中,并让他们参与到日常开发工作(见第152页习惯39)。开展非正式的代码复查(见第165页习惯44),并做出计划,让客户与用户也参与到项目中来(见第45页习惯10)。 79 | - 9.4 引入敏捷:程序员指南举例来说,从单元测试开始是一个不错的选择。可以先针对自己的代码开始使用。在短时间之内(几周甚至更少),就可以看到代码质量提升了——减少了错误的数目,提高了质量,健壮性也有所提升。你下午5点就可以下班回家,而且所有的任务都可以顺利完成——不必担心半夜被电话叫醒,去修复bug。旁边的开发人员想知道你是如何做到的,而且消息也渐渐传开了。整个团队现在都想尝试这些新奇的习惯,而不需要你努力去说服他们。 80 | -------------------------------------------------------------------------------- /docs/搜索引擎/Elasticsearch实战/查询选择.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/搜索引擎/Elasticsearch实战/查询选择.png -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/c/libev.md: -------------------------------------------------------------------------------- 1 | # libev 2 | 3 | http://oserror.com/backend/libev-analysis/ 4 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/c/unpv13e_unix网络编程.md: -------------------------------------------------------------------------------- 1 | unpv13e 环境搭建 2 | ========================= 3 | 4 | UNIX网络编程 卷1:套接字联网API(第3版)源代码 5 | 6 | 一、下载源代码及相应头文件和库文件 7 | 8 | 9 | 下载链接: http://download.csdn.net/detail/qq_19175749/9855681 10 | 也可在作者提供的网站下载:www.unpbook.com获得 11 | 或也可在图灵网站获得:www.turingbook.com获得 12 | 13 | `git clone https://github.com/DingHe/unpv13e.git` 14 | 15 | 二、解压unpv13e.tar.gz: 16 | 17 | tar -xvf unpv13e.tar.gz 18 | 19 | 三、依次执行以下命令编译代码得到一个libunp.a库文件: 20 | 21 | cd unpv13e 22 | ./configure 23 | cd lib 24 | make 25 | 26 | 四、复制文件libunp.a到usr/src目录下(其他目录也可以,仅以示例): 27 | 28 | sudo cp libunp.a /usr/lib 29 | 30 | 五、在lib目录中找到unp.h和config.h两个头文件复制到与源代码同目录下(其他路径也可以,但需要修改源文件中引用unp.h和config.h头文件的路径,仅以示例); 31 | 32 | 六、编译程序时要以-lunp参数方式指定程序需要依赖的库(unplib.a),如编译daytimetcpcli.c文件: 33 | 34 | gcc daytimetcpcli.c -o daytimetcpcli -lunp 35 | gcc tcpserv01.c -o tcpserv01 -lunp 36 | 37 | 直接用 make 生成。 38 | 39 | `make tcpserv01` 40 | 41 | 七、运行程序。 42 | 43 | 44 | # 简易搭建步骤 45 | 46 | ```bash 47 | # clone code 48 | git clone https://github.com/DingHe/unpv13e.git 49 | 50 | cd unpv13e 51 | ./configure 52 | cd lib 53 | make 54 | 55 | cd .. 56 | cp libunp.a /usr/local/lib/ 57 | 58 | cd ./tcpcliserv 59 | make all 60 | ``` 61 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/internal/clock/clock.go: -------------------------------------------------------------------------------- 1 | package myclock 2 | 3 | import ( 4 | "container/heap" 5 | "sync" 6 | "time" 7 | ) 8 | 9 | type Mock struct { 10 | sync.Mutex 11 | now time.Time 12 | timers Timers 13 | } 14 | 15 | func NewMock() *Mock { 16 | return &Mock{now: time.Unix(0, 0)} 17 | } 18 | 19 | func (m *Mock) Add(d time.Duration) { 20 | m.Lock() 21 | 22 | end := m.now.Add(d) 23 | for len(m.timers) > 0 && m.now.Before(end) { 24 | t := heap.Pop(&m.timers).(*Timer) 25 | m.now = t.next 26 | m.Unlock() 27 | t.Tick() 28 | m.Lock() 29 | } 30 | m.Unlock() 31 | nap() 32 | } 33 | 34 | func (m *Mock) Timer(d time.Duration) *Timer { 35 | ch := make(chan time.Time) 36 | t := &Timer{ 37 | C: ch, 38 | c: ch, 39 | mock: m, 40 | next: m.now.Add(d), 41 | } 42 | m.addTimer(t) 43 | return t 44 | } 45 | 46 | func (m *Mock) addTimer(t *Timer) { 47 | m.Lock() 48 | defer m.Unlock() 49 | heap.Push(&m.timers, t) 50 | } 51 | 52 | func (m *Mock) After(d time.Duration) <- chan time.Time { 53 | return m.Timer(d).C 54 | } 55 | 56 | func (m *Mock) AfterFunc( d time.Duration, f func() ) *Timer { 57 | t := m.Timer(d) 58 | go func() { 59 | <-t.c 60 | f() 61 | }() 62 | nap() 63 | return t 64 | } 65 | 66 | func (m *Mock) Now() time.Time { 67 | m.Lock() 68 | defer m.Unlock() 69 | return m.now 70 | } 71 | 72 | func (m *Mock) Sleep( d time.Duration ) { 73 | <-m.After(d) 74 | } 75 | 76 | // Timer represents a single event. 77 | type Timer struct { 78 | C <-chan time.Time 79 | c chan time.Time 80 | next time.Time 81 | mock *Mock 82 | } 83 | 84 | func (t *Timer) Next() time.Time { 85 | return t.next 86 | } 87 | 88 | func (t *Timer) Tick() { 89 | select { 90 | case t.c <- t.next: 91 | default: 92 | } 93 | nap() 94 | } 95 | 96 | // Sleep momentarily so that other goroutines can process. 97 | func nap() { time.Sleep(1 * time.Millisecond) } 98 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/internal/clock/interface.go: -------------------------------------------------------------------------------- 1 | package myclock 2 | 3 | import "time" 4 | 5 | // 方便做 time mock 6 | type Clock interface { 7 | AfterFunc(d time.Duration, f func()) 8 | Now() time.Time 9 | Sleep(d time.Duration) 10 | } 11 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/internal/clock/real.go: -------------------------------------------------------------------------------- 1 | package myclock 2 | 3 | import "time" 4 | 5 | type clock struct{} 6 | 7 | func New() Clock { 8 | return &clock{} 9 | } 10 | 11 | func (c *clock) After(d time.Duration) <-chan time.Time { return time.After(d) } 12 | 13 | func (c *clock) AfterFunc(d time.Duration, f func()) { 14 | // TODO maybe return timer interface 15 | time.AfterFunc(d, f) 16 | } 17 | 18 | func (c *clock) Now() time.Time { return time.Now() } 19 | 20 | func (c *clock) Sleep(d time.Duration) { time.Sleep(d) } 21 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/internal/clock/timers.go: -------------------------------------------------------------------------------- 1 | package myclock 2 | 3 | type Timers []*Timer 4 | 5 | func (ts Timers) Len() int { return len(ts) } 6 | 7 | func (ts Timers) Swap(i, j int) { 8 | ts[i], ts[j] = ts[j], ts[i] 9 | } 10 | 11 | func (ts Timers) Less(i, j int) bool { 12 | return ts[i].Next().Before(ts[j].Next()) 13 | } 14 | 15 | func (ts *Timers) Push(t interface{}) { 16 | *ts = append(*ts, t.(*Timer)) 17 | } 18 | 19 | func (ts *Timers) Pop() interface{} { 20 | t := (*ts)[len(*ts)-1] 21 | *ts = (*ts)[:len(*ts)-1] 22 | return t 23 | } 24 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/leaky_bucket.go: -------------------------------------------------------------------------------- 1 | package limiter 2 | 3 | import ( 4 | "sync/atomic" 5 | "time" 6 | "unsafe" 7 | ) 8 | 9 | // 参考:https://github.com/uber-go/ratelimit 10 | type LeakyBucketLimiter interface { 11 | Take() time.Time 12 | } 13 | 14 | type state struct { 15 | last time.Time 16 | sleepFor time.Duration 17 | } 18 | 19 | type leakyBucketLimiter struct { 20 | state unsafe.Pointer 21 | perRequest time.Duration // perRequest = 1s / rate,每个请求间隔 1s/perRequest 22 | maxSlack time.Duration 23 | } 24 | 25 | func NewLeakyBucketLimiter(rate int) LeakyBucketLimiter { 26 | l := &leakyBucketLimiter{ 27 | perRequest: time.Second / time.Duration(rate), 28 | maxSlack: -10 * time.Second / time.Duration(rate), 29 | } 30 | initialState := state{ 31 | last: time.Time{}, 32 | sleepFor: 0, 33 | } 34 | atomic.StorePointer(&l.state, unsafe.Pointer(&initialState)) 35 | return l 36 | } 37 | 38 | func (t *leakyBucketLimiter) Take() time.Time { 39 | newState := state{} 40 | taken := false 41 | for !taken { 42 | now := time.Now() 43 | 44 | preStatePtr := atomic.LoadPointer(&t.state) 45 | oldState := (*state)(preStatePtr) 46 | 47 | newState = state{} 48 | newState.last = now 49 | 50 | if oldState.last.IsZero() { // 首次请求 51 | taken = atomic.CompareAndSwapPointer(&t.state, preStatePtr, unsafe.Pointer(&newState)) 52 | continue 53 | } 54 | newState.sleepFor += t.perRequest - now.Sub(oldState.last) 55 | if newState.sleepFor < t.maxSlack { 56 | newState.sleepFor = t.maxSlack 57 | } 58 | if newState.sleepFor > 0 { 59 | newState.last = newState.last.Add(newState.sleepFor) 60 | } 61 | taken = atomic.CompareAndSwapPointer(&t.state, preStatePtr, unsafe.Pointer(&newState)) 62 | } 63 | 64 | time.Sleep(newState.sleepFor) // 阻塞sleep 65 | return newState.last 66 | } 67 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "time" 6 | 7 | 8 | "github.com/op/go-logging" 9 | "golang.org/x/time/rate" 10 | ) 11 | 12 | var log = logging.MustGetLogger("example") 13 | 14 | // Example format string. Everything except the message has a custom color 15 | // which is dependent on the log level. Many fields have a custom output 16 | // formatting too, eg. the time returns the hour down to the milli second. 17 | var format = logging.MustStringFormatter( 18 | `%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.4s} %{id:03x}%{color:reset} %{message}`, 19 | ) 20 | 21 | func main() { 22 | 23 | backend1 := logging.NewLogBackend(os.Stderr, "", 0) 24 | backend2 := logging.NewLogBackend(os.Stderr, "", 0) 25 | backend2Formatter := logging.NewBackendFormatter(backend2, format) 26 | backend1Leveled := logging.AddModuleLevel(backend1) 27 | backend1Leveled.SetLevel(logging.ERROR, "") 28 | logging.SetBackend(backend1Leveled, backend2Formatter) 29 | 30 | r := rate.Every(1) 31 | limit := rate.NewLimiter(r, 10) 32 | for { 33 | if limit.AllowN(time.Now(), 8) { 34 | log.Info("log:event happen") 35 | } else { 36 | log.Info("log:event not allow") 37 | } 38 | 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/ratelimit_test.go: -------------------------------------------------------------------------------- 1 | package myratelimit 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | "time" 7 | ) 8 | 9 | func TestRateLimit(t *testing.T) { 10 | rl := New(100) // per second 11 | 12 | prev := time.Now() 13 | for i := 0; i < 10; i++ { 14 | now := rl.Take() 15 | fmt.Println(i, now.Sub(prev)) 16 | prev = now 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/readme.md: -------------------------------------------------------------------------------- 1 | # 限流器,令牌桶 go 实现 2 | 3 | https://github.com/uber-go/ratelimit 4 | 5 | ```go 6 | import ( 7 | "fmt" 8 | "time" 9 | 10 | "go.uber.org/ratelimit" 11 | ) 12 | 13 | func main() { 14 | rl := ratelimit.New(100) // per second 15 | 16 | prev := time.Now() 17 | for i := 0; i < 10; i++ { 18 | now := rl.Take() 19 | fmt.Println(i, now.Sub(prev)) 20 | prev = now 21 | } 22 | 23 | // Output: 24 | // 0 0 25 | // 1 10ms 26 | // 2 10ms 27 | // 3 10ms 28 | // 4 10ms 29 | // 5 10ms 30 | // 6 10ms 31 | // 7 10ms 32 | // 8 10ms 33 | // 9 10ms 34 | } 35 | ``` 36 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/builtin/ratelimit/throttle.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "time" 5 | 6 | "go.uber.org/atomic" 7 | ) 8 | 9 | type Throttle struct { 10 | maxNum atomic.Int64 11 | intervalSeconds int64 12 | throttleNum atomic.Int64 13 | } 14 | 15 | func NewThrottle(maxNum, intervalSeconds int64) *Throttle { 16 | throttle := &Throttle{ 17 | intervalSeconds: intervalSeconds, 18 | } 19 | throttle.maxNum.Store(maxNum) 20 | throttle.start() 21 | return throttle 22 | } 23 | 24 | func (t *Throttle) start() { 25 | go func() { 26 | ticker := time.NewTicker(time.Duration(t.intervalSeconds) * time.Second) 27 | for { 28 | select { 29 | case <-ticker.C: 30 | t.throttleNum.Store(0) 31 | } 32 | } 33 | }() 34 | return 35 | } 36 | 37 | func (t *Throttle) Throttle() bool { 38 | curNum := t.throttleNum.Add(1) 39 | if curNum > 0 && curNum <= t.maxNum.Load() { 40 | return true 41 | } 42 | return false 43 | } 44 | 45 | func (t *Throttle) SetMaxNum(maxNum int64) { 46 | t.maxNum.Store(maxNum) 47 | } 48 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/future/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | // package myfuture 4 | 5 | import ( 6 | "context" 7 | "errors" 8 | "fmt" 9 | 10 | pkgErrors "github.com/pkg/errors" 11 | ) 12 | 13 | type Func func() error 14 | 15 | type Future struct { 16 | ch chan struct{} 17 | fn Func 18 | err error 19 | } 20 | 21 | func New(fn Func) *Future { 22 | f := &Future{ 23 | ch: make(chan struct{}), 24 | fn: fn, 25 | } 26 | f.start() 27 | return f 28 | } 29 | 30 | func (f *Future) start() { 31 | go func() { 32 | defer func() { 33 | if rval := recover(); rval != nil { 34 | if err, ok := rval.(error); ok { 35 | f.err = pkgErrors.WithStack(err) 36 | } else { 37 | rvalStr := fmt.Sprint(rval) 38 | f.err = pkgErrors.WithStack(errors.New(rvalStr)) 39 | } 40 | } 41 | close(f.ch) 42 | }() 43 | 44 | f.err = f.fn() 45 | return 46 | }() 47 | } 48 | 49 | func (f *Future) Get(ctx context.Context) error { 50 | select { 51 | case <-ctx.Done(): 52 | return ctx.Err() 53 | case <-f.ch: 54 | return f.err 55 | } 56 | } 57 | 58 | func (f *Future) Done() bool { 59 | select { 60 | case <-f.ch: 61 | return true 62 | default: 63 | return false 64 | } 65 | } 66 | 67 | /* 68 | func GetSomeData(ctx context.Context) (int, error) { 69 | return 1, nil 70 | } 71 | 72 | var ctx context.Context 73 | var rv int 74 | f := future.New(func() error { 75 | var err error 76 | rv, err = GetSomeData(ctx) 77 | return err 78 | }) 79 | err := f.Get(ctx) 80 | 81 | fmt.Println(rv) 82 | */ 83 | func GetSomeData(ctx context.Context) (int, error) { 84 | // return 1, nil 85 | return 0, errors.New("fake") 86 | } 87 | 88 | func testOne() { 89 | // NOTE: 这里其实 Future 没有给出参数和返回值,用的都是外部闭包变量的,可以避免各种 interface 操作 90 | // 参数和返回值都应该放到闭包变量 91 | ctx := context.Background() 92 | var rv int 93 | f := New(func() error { 94 | var err error 95 | rv, err = GetSomeData(ctx) 96 | return err 97 | }) 98 | err := f.Get(ctx) 99 | fmt.Println(rv, err) 100 | } 101 | 102 | func main() { 103 | testOne() 104 | } 105 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/graphite-golang/README.md: -------------------------------------------------------------------------------- 1 | # graphite-golang 代码阅读 2 | 3 | https://github.com/marpaia/graphite-golang 4 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/graphite-golang/example/main.go: -------------------------------------------------------------------------------- 1 | // TODO 机器上测试一下 2 | package main 3 | 4 | import ( 5 | "flag" 6 | "fmt" 7 | "log" 8 | graphite "test/source_code_read/graphite-golang" 9 | ) 10 | 11 | func main() { 12 | var host = flag.String("host", "localhost", "Input Your Name") 13 | var port = flag.Int("port", 2333, "Input Your Name") 14 | flag.Parse() 15 | fmt.Println(*host, *port) 16 | 17 | g, err := graphite.NewGraphite(*host, *port) 18 | if err != nil { 19 | log.Print(err) 20 | } 21 | 22 | log.Printf("Loaded Graphite connection: %#v", g) 23 | g.SimpleSend("stats.graphite_loaded", "1") 24 | } 25 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/graphite-golang/metric.go: -------------------------------------------------------------------------------- 1 | // Package mygraphite provides ... 2 | package mygraphite 3 | 4 | import ( 5 | "fmt" 6 | "time" 7 | ) 8 | 9 | type Metric struct { 10 | Name string 11 | Value string 12 | Timestamp int64 13 | } 14 | 15 | func NewMetric(name, value string, ts int64) Metric { 16 | return Metric{ 17 | Name: name, 18 | Value: value, 19 | Timestamp: ts, 20 | } 21 | } 22 | 23 | // 协议比较简单,就是 "name value timestamp" 24 | func (m Metric) String() string { 25 | return fmt.Sprintf("%s %s %s", m.Name, m.Value, time.Unix(m.Timestamp, 0).Format("2006-01-02 15:04:05")) 26 | } 27 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix-go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/源码阅读_sourcecode/go/hystrix-go/hystrix-go.png -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix/hystrix_test.go: -------------------------------------------------------------------------------- 1 | package myhystrix 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | ) 7 | 8 | func TestDo(t *testing.T) { 9 | err := Do("test", func() error { 10 | // call service 11 | fmt.Println("call") 12 | return nil 13 | }, func(err error) error { 14 | return nil 15 | }) 16 | fmt.Println(err) 17 | } 18 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix/logger.go: -------------------------------------------------------------------------------- 1 | package myhystrix 2 | 3 | type logger interface { 4 | Printf(format string, items ...interface{}) 5 | } 6 | 7 | type NoopLogger struct{} 8 | 9 | func (l NoopLogger) Printf(format string, items ...interface{}) {} 10 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix/metric_collector/metric_collector.go: -------------------------------------------------------------------------------- 1 | package metricCollector 2 | 3 | import ( 4 | "sync" 5 | "time" 6 | ) 7 | 8 | // MetricCollector represents the contract that all collectors must fulfill to gather circuit statistics. 9 | // Implementations of this interface do not have to maintain locking around thier data stores so long as 10 | // they are not modified outside of the hystrix context. 11 | type MetricCollector interface { 12 | // Update accepts a set of metrics from a command execution for remote instrumentation 13 | Update(MetricResult) 14 | // Reset resets the internal counters and timers. 15 | Reset() 16 | } 17 | 18 | type MetricResult struct { 19 | Attempts float64 20 | Errors float64 21 | Successes float64 22 | Failures float64 23 | Rejects float64 24 | ShortCircuits float64 25 | Timeouts float64 26 | FallbackSuccesses float64 27 | FallbackFailures float64 28 | ContextCanceled float64 29 | ContextDeadlineExceeded float64 30 | TotalDuration time.Duration 31 | RunDuration time.Duration 32 | ConcurrencyInUse float64 33 | } 34 | 35 | type metricCollectorRegistry struct { 36 | lock *sync.RWMutex 37 | registry []func(name string) MetricCollector // func list 38 | } 39 | 40 | var Registry = metricCollectorRegistry{ 41 | lock: &sync.RWMutex{}, 42 | registry: []func(name string) MetricCollector{ 43 | newDefaultMetricCollector, 44 | }, 45 | } 46 | 47 | func (m *metricCollectorRegistry) InitializeMetricCollectors(name string) []MetricCollector { 48 | m.lock.RLock() 49 | defer m.lock.RUnlock() 50 | metrics := make([]MetricCollector, len(m.registry)) 51 | for i, metricCollectorInitializer := range m.registry { 52 | metrics[i] = metricCollectorInitializer(name) 53 | } 54 | return metrics 55 | } 56 | 57 | func (m *metricCollectorRegistry) Register(initMetricCollector func(string) MetricCollector) { 58 | m.lock.Lock() 59 | defer m.lock.Unlock() 60 | 61 | m.registry = append(m.registry, initMetricCollector) 62 | } 63 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix/pool.go: -------------------------------------------------------------------------------- 1 | package myhystrix 2 | 3 | //用了一个简单的令牌算法,能得到令牌的就可以执行后继的工作,执行完后要返还令牌。得不到令牌就拒绝,拒绝后调用用户设置的callback方法,如果没有设置就不执行。 4 | type executorPool struct { 5 | Name string 6 | Metrics *poolMetrics // TODO 7 | Max int 8 | Tickets chan *struct{} 9 | } 10 | 11 | func newExecutorPool(name string) *executorPool { 12 | p := &executorPool{} 13 | p.Name = name 14 | p.Metrics = newPoolMetrics(name) 15 | p.Max = getSettings(name).MaxConcurrentRequests 16 | 17 | p.Tickets = make(chan *struct{}, p.Max) 18 | for i := 0; i < p.Max; i++ { 19 | p.Tickets <- &struct{}{} 20 | } 21 | return p 22 | } 23 | 24 | // 令牌用完是要返还的 25 | func (p *executorPool) Return(ticket *struct{}) { 26 | if ticket == nil { 27 | return 28 | } 29 | p.Metrics.Updates <- poolMetricsUpdate{ 30 | activeCount: p.ActiveCount(), 31 | } 32 | p.Tickets <- ticket 33 | } 34 | 35 | func (p executorPool) ActiveCount() int { 36 | return p.Max - len(p.Tickets) 37 | } 38 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix/pool_metrics.go: -------------------------------------------------------------------------------- 1 | package myhystrix 2 | 3 | import ( 4 | "sync" 5 | "test/source_code_read/hystrix-go/hystrix/rolling" 6 | ) 7 | 8 | type poolMetrics struct { 9 | Mutex *sync.RWMutex 10 | Updates chan poolMetricsUpdate 11 | 12 | Name string 13 | MaxActiveRequests *rolling.Number 14 | Executed *rolling.Number 15 | } 16 | 17 | type poolMetricsUpdate struct { 18 | activeCount int 19 | } 20 | 21 | func newPoolMetrics(name string) *poolMetrics { 22 | m := &poolMetrics{} 23 | m.Name = name 24 | m.Updates = make(chan poolMetricsUpdate) 25 | m.Mutex = &sync.RWMutex{} 26 | 27 | m.Reset() 28 | go m.Monitor() 29 | return m 30 | } 31 | 32 | func (m *poolMetrics) Reset() { 33 | m.Mutex.Lock() 34 | defer m.Mutex.Unlock() 35 | m.MaxActiveRequests = rolling.NewNumber() 36 | m.Executed = rolling.NewNumber() 37 | } 38 | 39 | func (m *poolMetrics) Monitor() { 40 | for u := range m.Updates { 41 | m.Mutex.RLock() 42 | 43 | m.Executed.Increment(1) 44 | m.MaxActiveRequests.UpdateMax(float64(u.activeCount)) 45 | 46 | m.Mutex.RUnlock() 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix/rolling/rolling.go: -------------------------------------------------------------------------------- 1 | package rolling 2 | 3 | import ( 4 | "sync" 5 | "time" 6 | ) 7 | 8 | // Number tracks a numberBucket over a bounded number of 9 | // time buckets. Currently the buckets are one second long and only the last 10 seconds are kept. 10 | type Number struct { 11 | Buckets map[int64]*numberBucket // 时间戳(秒)对应的 numberBucket 12 | Mutex *sync.RWMutex 13 | } 14 | 15 | type numberBucket struct { 16 | Value float64 17 | } 18 | 19 | func NewNumber() *Number { 20 | r := &Number{ 21 | Buckets: make(map[int64]*numberBucket), 22 | Mutex: &sync.RWMutex{}, 23 | } 24 | return r 25 | } 26 | 27 | func (r *Number) getCurrentBucket() *numberBucket { 28 | now := time.Now().Unix() 29 | var bucket *numberBucket 30 | var ok bool 31 | 32 | if bucket, ok = r.Buckets[now]; !ok { 33 | bucket := &numberBucket{} 34 | r.Buckets[now] = bucket 35 | } 36 | return bucket 37 | } 38 | 39 | func (r *Number) removeOldBuckets() { 40 | now := time.Now().Unix() - 10 41 | for timestamp := range r.Buckets { 42 | if timestamp <= now { 43 | delete(r.Buckets, timestamp) 44 | } 45 | } 46 | } 47 | 48 | // Increment increments the number in current timeBucket. 49 | func (r *Number) Increment(i float64) { 50 | if i == 0 { 51 | return 52 | } 53 | r.Mutex.Lock() 54 | defer r.Mutex.Unlock() 55 | 56 | b := r.getCurrentBucket() 57 | b.Value += i 58 | r.removeOldBuckets() 59 | } 60 | 61 | // UpdateMax updates the maximum value in the current bucket. 62 | func (r *Number) UpdateMax(n float64) { 63 | r.Mutex.Lock() 64 | defer r.Mutex.Unlock() 65 | 66 | b := r.getCurrentBucket() 67 | if n > b.Value { 68 | b.Value = n 69 | } 70 | r.removeOldBuckets() 71 | } 72 | 73 | // Sum sums the values over the buckets in the last 10 seconds. 74 | func (r *Number) Sum(now time.Time) float64 { 75 | sum := float64(0) 76 | 77 | r.Mutex.RLock() 78 | defer r.Mutex.RUnlock() 79 | 80 | for timestamp, bucket := range r.Buckets { 81 | if timestamp >= now.Unix()-10 { 82 | sum += bucket.Value 83 | } 84 | } 85 | return sum 86 | } 87 | 88 | // Max returns the maximum value seen in the last 10 seconds. 89 | func (r *Number) Max(now time.Time) float64 { 90 | var max float64 91 | 92 | r.Mutex.RLock() 93 | defer r.Mutex.RUnlock() 94 | 95 | for timestamp, bucket := range r.Buckets { 96 | if timestamp >= now.Unix()-10 { 97 | if bucket.Value > max { 98 | max = bucket.Value 99 | } 100 | } 101 | } 102 | return max 103 | } 104 | 105 | func (r *Number) Avg(now time.Time) float64 { 106 | return r.Sum(now) / 10 107 | } 108 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/hystrix/rolling/rolling_timing.go: -------------------------------------------------------------------------------- 1 | package rolling 2 | 3 | import ( 4 | "math" 5 | "sort" 6 | "sync" 7 | "time" 8 | ) 9 | 10 | type timingBucket struct { 11 | Durations []time.Duration 12 | } 13 | 14 | type Timing struct { 15 | Buckets map[int64]*timingBucket 16 | Mutex *sync.RWMutex 17 | 18 | CachedSortedDurations []time.Duration 19 | LastCachedTime int64 20 | } 21 | 22 | func NewTiming() *Timing { 23 | r := &Timing{ 24 | Buckets: make(map[int64]*timingBucket), 25 | Mutex: &sync.RWMutex{}, 26 | } 27 | return r 28 | } 29 | 30 | type byDuration []time.Duration 31 | 32 | func (c byDuration) Len() int { return len(c) } 33 | func (c byDuration) Swap(i, j int) { c[i], c[j] = c[j], c[i] } 34 | func (c byDuration) Less(i, j int) bool { return c[i] < c[j] } 35 | 36 | func (r *Timing) SortedDuration() []time.Duration { 37 | r.Mutex.RLock() 38 | t := r.LastCachedTime 39 | r.Mutex.RUnlock() 40 | 41 | if t+time.Duration(1*time.Second).Nanoseconds() > time.Now().UnixNano() { 42 | return r.CachedSortedDurations 43 | } 44 | var durations byDuration 45 | now := time.Now() 46 | r.Mutex.Lock() 47 | defer r.Mutex.Unlock() 48 | 49 | for timestamp, b := range r.Buckets { 50 | if timestamp >= now.Unix()-60 { 51 | for _, d := range b.Durations { 52 | durations = append(durations, d) 53 | } 54 | } 55 | } 56 | sort.Sort(durations) 57 | r.CachedSortedDurations = durations 58 | r.LastCachedTime = time.Now().UnixNano() 59 | return r.CachedSortedDurations 60 | } 61 | 62 | func (r *Timing) getCurrentBucket() *timingBucket { 63 | r.Mutex.RLock() 64 | now := time.Now() 65 | bucket, exists := r.Buckets[now.Unix()] 66 | r.Mutex.RUnlock() 67 | 68 | if !exists { 69 | r.Mutex.Lock() 70 | defer r.Mutex.Unlock() 71 | 72 | r.Buckets[now.Unix()] = &timingBucket{} 73 | bucket = r.Buckets[now.Unix()] 74 | } 75 | return bucket 76 | } 77 | 78 | func (r *Timing) removeOldBuckets() { 79 | now := time.Now() 80 | for timestamp := range r.Buckets { 81 | if timestamp <= now.Unix()-60 { 82 | delete(r.Buckets, timestamp) 83 | } 84 | } 85 | } 86 | 87 | func (r *Timing) Add(duration time.Duration) { 88 | b := r.getCurrentBucket() 89 | r.Mutex.Lock() 90 | defer r.Mutex.Unlock() 91 | 92 | b.Durations = append(b.Durations, duration) 93 | r.removeOldBuckets() 94 | } 95 | 96 | // 百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数,以Pk表示第k百分位数。 97 | func (r *Timing) Percentile(p float64) uint32 { 98 | sd := r.SortedDuration() 99 | length := len(sd) 100 | if length <= 0 { 101 | return 0 102 | } 103 | pos := r.ordinal(len(sd), p) - 1 104 | return uint32(sd[pos].Nanoseconds() / 1000000) 105 | } 106 | 107 | func (r *Timing) ordinal(length int, percentile float64) int64 { 108 | if percentile == 0 && length > 0 { 109 | return 1 110 | } 111 | 112 | return int64(math.Ceil((percentile / float64(100)) * float64(length))) 113 | } 114 | 115 | // Mean computes the average timing in the last 60 seconds. 116 | func (r *Timing) Mean() uint32 { 117 | sd := r.SortedDuration() 118 | var sum time.Duration 119 | 120 | for _, d := range sd { 121 | sum += d 122 | } 123 | 124 | length := int64(len(sd)) 125 | if length == 0 { 126 | return 0 127 | } 128 | return uint32(sum.Nanoseconds()/length) / 1000000 129 | } 130 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/hystrix-go/readme.md: -------------------------------------------------------------------------------- 1 | # hystrix-go 源码阅读 2 | 3 | 流程图: 4 | 5 | ![](./hystrix-go.png) 6 | 7 | 先自上而下阅读,看看流程是如何走的,然后剖析内部的每个关键实现。 8 | 9 | - https://www.cnblogs.com/li-peng/p/11050563.html 10 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/net_http/readme.md: -------------------------------------------------------------------------------- 1 | # go 内置 net/http 代码阅读 2 | 3 | 看一下内置的 http server 如何实现的 4 | 5 | ```go 6 | package main 7 | 8 | import ( 9 | "net/http" 10 | "log" 11 | ) 12 | 13 | func myHandler(w http.ResponseWriter, r *http.Request) { 14 | fmt.Fprintf(w, "Hello there!\n") 15 | } 16 | 17 | func main(){ 18 | http.HandleFunc("/", myHandler) // 设置访问路由 19 | log.Fatal(http.ListenAndServe(":8080", nil)) 20 | } 21 | ``` 22 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/patrickmn_gocache/read.md: -------------------------------------------------------------------------------- 1 | # 代码阅读 2 | 3 | https://github.com/patrickmn/go-cache 4 | 5 | ```sh 6 | go get github.com/patrickmn/go-cache 7 | ``` 8 | 9 | # 进程缓存使用场景 10 | 11 | 除了使用 redis 等内存缓存之外,有时候还需要单机 cache 场景(不用和 redis server 进行网络请求了)。 12 | 举一个例子就是像是微博这种服务,对于一些超高热点数据(比如某明星又出轨),缓存的 key 会集中在某台 redis 13 | 上,很多个服务集中请求某台 redis 导致其压力过高。这个时候可以使用单机 cache,直接换存到服务进程内存中,连 redis 14 | 不用请求了,同时将压力分散到多个服务上,缓解缓存服务器压力。这个是一个很典型的使用场景(需要保证一致性,一般是先从 redis 15 | 拉过来再缓存到进程内存)。 16 | 17 | 注意:该场景下不同机器的缓存不一致的问题。 18 | 19 | # go-cache 20 | 21 | star 数量较高,也比较稳定了。实现了 goroutine 安全的 map[string]interface{},包含超时。支持序列化到文件并且重新加载 22 | 23 | 示例代码: 24 | 25 | ```go 26 | import ( 27 | "fmt" 28 | "github.com/patrickmn/go-cache" 29 | "time" 30 | ) 31 | 32 | func main() { 33 | // Create a cache with a default expiration time of 5 minutes, and which 34 | // purges expired items every 10 minutes 35 | c := cache.New(5*time.Minute, 10*time.Minute) 36 | 37 | // Set the value of the key "foo" to "bar", with the default expiration time 38 | c.Set("foo", "bar", cache.DefaultExpiration) 39 | 40 | // Set the value of the key "baz" to 42, with no expiration time 41 | // (the item won't be removed until it is re-set, or removed using 42 | // c.Delete("baz") 43 | c.Set("baz", 42, cache.NoExpiration) 44 | 45 | // Get the string associated with the key "foo" from the cache 46 | foo, found := c.Get("foo") 47 | if found { 48 | fmt.Println(foo) 49 | } 50 | 51 | // Since Go is statically typed, and cache values can be anything, type 52 | // assertion is needed when values are being passed to functions that don't 53 | // take arbitrary types, (i.e. interface{}). The simplest way to do this for 54 | // values which will only be used once--e.g. for passing to another 55 | // function--is: 56 | foo, found := c.Get("foo") 57 | if found { 58 | MyFunction(foo.(string)) 59 | } 60 | 61 | // This gets tedious if the value is used several times in the same function. 62 | // You might do either of the following instead: 63 | if x, found := c.Get("foo"); found { 64 | foo := x.(string) 65 | // ... 66 | } 67 | // or 68 | var foo string 69 | if x, found := c.Get("foo"); found { 70 | foo = x.(string) 71 | } 72 | // ... 73 | // foo can then be passed around freely as a string 74 | 75 | // Want performance? Store pointers! 76 | c.Set("foo", &MyStruct, cache.DefaultExpiration) 77 | if x, found := c.Get("foo"); found { 78 | foo := x.(*MyStruct) 79 | // ... 80 | } 81 | } 82 | ``` 83 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/redigo_read/commmandinfo.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "strings" 5 | ) 6 | 7 | const ( 8 | connectionWatchState = 1 << iota 9 | connectionMultiState 10 | connectionSubscribeState 11 | connectionMonitorState 12 | ) 13 | 14 | type commandInfo struct { 15 | // Set or Clear these states on connection. 16 | Set, Clear int 17 | } 18 | 19 | var commandInfos = map[string]commandInfo{ 20 | "WATCH": {Set: connectionWatchState}, 21 | "UNWATCH": {Clear: connectionWatchState}, 22 | "MULTI": {Set: connectionMultiState}, 23 | "EXEC": {Clear: connectionWatchState | connectionMultiState}, 24 | "DISCARD": {Clear: connectionWatchState | connectionMultiState}, 25 | "PSUBSCRIBE": {Set: connectionSubscribeState}, 26 | "SUBSCRIBE": {Set: connectionSubscribeState}, 27 | "MONITOR": {Set: connectionMonitorState}, 28 | } 29 | 30 | func init() { 31 | for n, ci := range commandInfos { 32 | commandInfos[strings.ToLower(n)] = ci // 保留一份小写命令的映射 33 | } 34 | } 35 | 36 | func lookupCommandInfo(commandName string) commandInfo { 37 | if ci, ok := commandInfos[commandName]; ok { 38 | return ci 39 | } 40 | return commandInfos[strings.ToUpper(commandName)] 41 | } 42 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/retry-go/README.md: -------------------------------------------------------------------------------- 1 | # go 重试 2 | 3 | 源码:https://github.com/avast/retry-go 4 | 5 | # 简单实现 6 | 7 | 一个简单的重试 go 函数可以这么实现 8 | 9 | ```go 10 | func Retry(fn func() error, attempts int, sleep time.Duration) error { 11 | if err := fn(); err != nil { 12 | if s, ok := err.(stop); ok { 13 | return s.error 14 | } 15 | 16 | if attempts--; attempts > 0 { 17 | // logger.Warnf("retry func error: %s. attemps #%d after %s.", err.Error(), attempts, sleep) 18 | fmt.Printf("retry times[%d], sleep[%v]\n", attempts, sleep) 19 | time.Sleep(sleep) 20 | return Retry(fn, attempts, 2*sleep) 21 | } 22 | return err 23 | } 24 | return nil 25 | } 26 | 27 | type stop struct { 28 | error 29 | } 30 | 31 | func NoRetryError(err error) stop { 32 | return stop{err} 33 | } 34 | ``` 35 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/statsd/README.md: -------------------------------------------------------------------------------- 1 | # statsd client 源码 2 | 3 | https://github.com/alexcesaro/statsd/tree/v2.0.0 4 | 5 | # 简介 statsd 6 | 7 | https://github.com/longtian/introduction-to-statsd 8 | 9 | StatsD 的协议其实非常简单,每一行就是一条数据。 10 | 11 | ``` 12 | :| 13 | ``` 14 | 15 | 以监控系统负载为例,假如某一时刻系统 1分钟的负载 是 0.5,通过以下命令就可以写入 StatsD。 16 | 17 | ``` 18 | echo "system.load.1:0.5|g" | nc 127.0.0.1 8251 19 | ``` 20 | 21 | 结合其中的 system.load.1:0.5|g,各个部分分别为: 22 | 23 | 指标名称 metric_name = system.load.1 24 | 指标的值 metric_value = 0.5 25 | 指标类型 metric_type = g(gauge) 26 | 27 | 指标名称:指标命名没有特别的限制,但是一般的约定是使用点号分割的命名空间。 28 | 指标的值:指标的值是大于等于 0 的浮点数。 29 | 指标类型: 30 | 31 | - gauge : 一维变量,可增可减。比如 cpu 使用率 32 | - counter: 累加变量。 33 | - ms: 记录执行时间。比如请求响应时间是 12s。 `echo "request.time:12|ms" | nc 127.0.0.1 8251` 34 | - set: 统计变量不重复的个数。比如在线用户。`echo "online.user:9587|s" | nc 127.0.0.1 8251` 35 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/statsd/example/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "log" 6 | mystatsd "test/source_code_read/statsd" 7 | ) 8 | 9 | var addr = flag.String("addr", ":8125", "Input Your statsd addr") 10 | 11 | // ./example --addr=127.0.0.1:8125 12 | func main() { 13 | flag.Parse() 14 | c, err := mystatsd.New( 15 | mystatsd.Address(*addr), 16 | ) 17 | if err != nil { 18 | log.Print(err) 19 | } 20 | defer c.Close() 21 | 22 | for i := 0; i < 100; i++ { 23 | c.Increment("foo.bar.10_228_100_3.stats") 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/go/statsd/statsd.go: -------------------------------------------------------------------------------- 1 | // Package mystatsd provides ... 2 | package mystatsd 3 | 4 | import "time" 5 | 6 | type Client struct { 7 | conn *conn // 发送 8 | muted bool 9 | rate float32 10 | prefix string 11 | tags string 12 | } 13 | 14 | func New(opts ...Option) (*Client, error) { 15 | conf := &config{ 16 | Client: clientConfig{ 17 | Rate: 1, 18 | }, 19 | Conn: connConfig{ 20 | Addr: ":8125", 21 | FlushPeriod: 100 * time.Millisecond, 22 | MaxPacketSize: 1440, 23 | Network: "udp", // 默认 udp 24 | }, 25 | } 26 | for _, o := range opts { 27 | o(conf) 28 | } 29 | conn, err := newConn(conf.Conn, conf.Client.Muted) 30 | c := &Client{ 31 | conn: conn, 32 | muted: conf.Client.Muted, 33 | } 34 | if err != nil { 35 | c.muted = true 36 | return c, err 37 | } 38 | 39 | c.rate = conf.Client.Rate 40 | c.prefix = conf.Client.Prefix 41 | c.tags = joinTags(conf.Conn.TagFormat, conf.Client.Tags) 42 | return c, nil 43 | } 44 | 45 | // 以下基本都是调用 conn.metric 方法了 46 | func (c *Client) Count(bucket string, n interface{}) { 47 | if c.skip() { 48 | return 49 | } 50 | c.conn.metric(c.prefix, bucket, n, "c", c.rate, c.tags) 51 | } 52 | 53 | func (c *Client) skip() bool { 54 | return c.muted || (c.rate != 1 && randFloat() > c.rate) 55 | } 56 | 57 | func (c *Client) Increment(bucket string) { 58 | c.Count(bucket, 1) 59 | } 60 | 61 | func (c *Client) Gauge(bucket string, value interface{}) { 62 | if c.skip() { 63 | return 64 | } 65 | c.conn.gauge(c.prefix, bucket, value, c.tags) 66 | } 67 | 68 | func (c *Client) Timing(bucket string, value interface{}) { 69 | if c.skip() { 70 | return 71 | } 72 | c.conn.metric(c.prefix, bucket, value, "ms", c.rate, c.tags) 73 | } 74 | 75 | func (c *Client) Histogram(bucket string, value interface{}) { 76 | if c.skip() { 77 | return 78 | } 79 | c.conn.metric(c.prefix, bucket, value, "h", c.rate, c.tags) 80 | } 81 | 82 | // 简化发送 timing 83 | type Timing struct { 84 | start time.Time 85 | c *Client 86 | } 87 | 88 | func (c *Client) NewTiming() Timing { 89 | return Timing{start: now(), c: c} 90 | } 91 | 92 | func (t Timing) Send(bucket string) { 93 | t.c.Timing(bucket, int(t.Duration()/time.Millisecond)) 94 | } 95 | 96 | func (t Timing) Duration() time.Duration { 97 | return now().Sub(t.start) 98 | } 99 | 100 | func (c *Client) Unique(bucket string, value string) { 101 | if c.skip() { 102 | return 103 | } 104 | c.conn.unique(c.prefix, bucket, value, c.tags) 105 | } 106 | 107 | // flush client's buffer 108 | func (c *Client) Flush() { 109 | if c.muted { 110 | return 111 | } 112 | c.conn.mu.Lock() 113 | c.conn.flush(0) 114 | c.conn.mu.Unlock() 115 | } 116 | 117 | func (c *Client) Close() { 118 | if c.muted { 119 | return 120 | } 121 | c.conn.mu.Lock() 122 | c.conn.flush(0) 123 | c.conn.handleError(c.conn.w.Close()) 124 | c.conn.closed = true 125 | c.conn.mu.Unlock() 126 | } 127 | -------------------------------------------------------------------------------- /docs/源码阅读_sourcecode/python/pystatsd_read.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | """ 5 | 各种web应用都需要打点来监控各种指标,增加报警等。 6 | 7 | pystatsd 源码阅读, statsd 的 python 客户端 8 | https://github.com/jsocol/pystatsd 9 | https://statsd.readthedocs.io/ 10 | 11 | 预备基础: 12 | - socket 编程,tcp 和 udp 发送数据 13 | - statsd 协议:非常简单的协议, https://github.com/b/statsd_spec 14 | """ 15 | -------------------------------------------------------------------------------- /docs/系统设计system_design/Grokking_System_Design/crawler_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/系统设计system_design/Grokking_System_Design/crawler_system.png -------------------------------------------------------------------------------- /docs/系统设计system_design/Grokking_System_Design/instagram_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/系统设计system_design/Grokking_System_Design/instagram_db.png -------------------------------------------------------------------------------- /docs/系统设计system_design/Grokking_System_Design/newsfeed_system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/系统设计system_design/Grokking_System_Design/newsfeed_system.png -------------------------------------------------------------------------------- /docs/系统设计system_design/Grokking_System_Design/ticket_book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/系统设计system_design/Grokking_System_Design/ticket_book.png -------------------------------------------------------------------------------- /docs/系统设计system_design/Grokking_System_Design/twitter_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/系统设计system_design/Grokking_System_Design/twitter_schema.png -------------------------------------------------------------------------------- /docs/网站架构微服务/Prometheus监控实战.md: -------------------------------------------------------------------------------- 1 | # 1. 监控简介 2 | 3 | 指标是软件或硬件组件属性的度量。为了使指标有价值,我们会跟踪其状态,通常记录一段时间内的数据点。这些数据点称为观察点(observation),观察点通常包括值、时间戳,有时也涵盖描述观察点的一系列属性(如源或标签)。观察的集合称为时间序列。 4 | 5 | 指标的类型: 6 | 7 | - 测量型(gauge)。上下增减的数字,比如cpu/内存/磁盘,用户访问数 8 | - 计数型(counter):随着时间只增不减的数字。比如运行时间、登陆次数 9 | - 直方图(histogram): 对观察点进行采样 10 | 11 | 百分位数: 度量的是占总数特定百分比的观察点的值。比如50百分位数(或p50)。对于中间数(已排好序的数据)来说,50%的值低于它,50%高于它。 12 | 13 | 监控方法论: 14 | 15 | - USE: 使用率(Utilization), 饱和度(Saturation),错误(Error) 16 | - google的4 个黄金指标:延迟、流量(qps等)、错误、饱和度 17 | 18 | 19 | # 2. Prometheus 简介 20 | 21 | Prometheus称其可以抓取的指标来源为端点(endpoint)。端点通常对应单个进程、主机、服务或应用程序。为了抓取端点数据,Prometheus定义了名为目标(target)的配置 22 | 23 | # 3. 安装和启动 Prometheus 24 | 25 | `brew install prometheus` 26 | 27 | 28 | # 4. 监控主机和容器 29 | 30 | 31 | -------------------------------------------------------------------------------- /docs/网站架构微服务/microservices_patterns_微服务架构设计模式/ddd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/网站架构微服务/microservices_patterns_微服务架构设计模式/ddd.png -------------------------------------------------------------------------------- /docs/网站架构微服务/microservices_patterns_微服务架构设计模式/定义系统操作.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/网站架构微服务/microservices_patterns_微服务架构设计模式/定义系统操作.png -------------------------------------------------------------------------------- /docs/网站架构微服务/web_scalavility_for_startup_engineers.md: -------------------------------------------------------------------------------- 1 | 2 | > Everything Should Be Made as Simple as Possible, But Not Simpler. - Albert Einstein 3 | 4 | 我觉得编写软件的过程就是和和复杂度斗争的过程,无论是编写传统的pc软件还是web应用。 5 | 6 | ## 简单 7 | 软件天然错综复杂,当你衡量一个东西是否过于简单的时候,首先回答是对谁而言以及对什么时候而言。对于工程师而言,简单是让别的工程师以一种最容易的方式使用你的方案。 8 | 9 | - 隐藏复杂与构建抽象:软件变庞大之后很难一窥全貌,无法保持简单,但是可以保持局部简单。达到局部简单的主要方式实在设计和实现两个方面上,任何单个的类、模块、应用的设计目标和工作原理能被快速理解,而不需要深入到里头的细节。添加抽象层,隐藏复杂性。 10 | - 避免过度设计:好的设计是能在后期不断添加新的功能特性,而不是一开始就开发一个大系统。每次进行软件设计的时候问题自己,这个设计是否可以更简单而且在将来依然可以保持弹性?斟酌权衡 11 | - 尝试测试驱动开发:在某些方法上搞TDD可以获得一个全新的视角。TDD能然你避免写冗余的无用代码,同事单元测试用例可以被当做文档,暂时代码的意图、用法、期望结果等。同时TDD能然你以使用者的角度看待接口,从而简化API。无论是否使用TDD,你都要以用户(使用API)的人的视角思考,提高接口易用性。 12 | - 从软件设计的简化范例中学习:Grails,Hadoop,Google Maps API。 13 | 14 | ## 低耦合 15 | 低耦合对系统的健康和伸缩至关重要。 16 | - 促进低耦合:小心管理依赖,类之间、模块之间、应用之间的以依赖。类应该只有一个目的,是最小的抽象粒度,尽量少暴露类的内部信息。 17 | - 避免不必要的耦合:尽可能多隐藏,少暴露。画系统设计图可以暴露循环依赖,一个良好的模块架构图应该看起来像一棵树(有向无环图),而不是社交网络图。 18 | - 低耦合范式:通过阅读别人的代码吸取经验。比如unix的命令行及管道的设计。 19 | 20 | ## DRY 21 | 软件开发工程中低效的地方有很多,代码重复、缺乏自动化的重复(部署、测试、配置等)、大量复制粘贴代码、不必要的重复发明轮子等,“代码不会用第二次就凑合一下”的态度 22 | - 复制粘贴代码:使用抽象,组合继承等消除重复,使用设计模式、共享类库等消除重复。 23 | 24 | ## 基于约定编程 25 | 基于约定编程或者说基于接口编程,是将客户端代码和功能提供者代码解耦的重要方式。让客户端依赖于约定编程。 约定在不同层次有不同的意义,比如低层次就是方法和函数的签名,高层次可以是web服务的文档。HTTP协议就是个注明的例子。 26 | 27 | 28 | ## 画架构图 29 | 有些时候需要做前期设计,可以帮助自己和他人更好了解设计。 30 | - 用例图:定义系统用户是谁,可以做哪些操作。 31 | - 类图:接口、类、关键方法名和它们之间的关系,展现类、接口及其交互关系。 32 | - 模块图:模块之间的依赖和交互,可以是一个包或者组件。 33 | 34 | ## 单一职责 35 | 类应该只有一个职责。 36 | -改善单一职责:类的代码不过长,确保类的以来不超过5个接口/类,确保一个类有一个明确的目标,能用一句话总结类的职责作为注释。 37 | 38 | ## 开闭原则 39 | 需求变更或者增加新功能时,你不需要修改现有代码。想扩展开放,对修改关关闭。MVC就是个好例子。重构代码分解任务并能复用。 40 | 41 | ## 依赖注入 42 | 一种降低耦合并且改善开闭特性的技术。依赖注入对类需要创建的对象提供一个引用实例,而无需类自己创建依赖对象。一般是把类需要的对象当成一个参数传递进去。这样类就能聚焦自己的主要职责,无需知道谁来提供依赖的实例。比如我们要实现一个播放器类,播放器必须有CD才能播放,我们可以在构造函数中把CD的实例作为构造函数的参数传递进去。 43 | 44 | ## 控制反转(IOC) 45 | IOC是一种从类中移除职责的方法,从而使类更简单,与系统其他部分更少耦合。就是你的类实例不必知道自己何时被创建、被谁使用、自己的依赖又是如何被创建的。你的类是一个插件,外部决定这些类什么时候被创建,如何被使用。 46 | 47 | ## 为伸缩性设计 48 | 49 | 伸缩性方案可以被浓缩成三个基本设计方法: 50 | 51 | - 增加副本:同一组件重复部署到多态服务器,最适用于无状态的服务,有状态的服务难以用这种方式伸缩。该方案需要找个方法同步状态。 52 | - 功能分割: 基于功能将系统分隔成独立的子系统,常用于底层。 53 | - 数据分片: 在每台服务器上只部署一部分数据,无共享架构,每个节点完全自治,几乎有无限的伸缩性。但是也是代价最高、最昂贵的技术,难点在于要访问数据需要找到数据所在的分区服务器,如果一个查询在涉及分区,实现会变得低效和困难。 54 | 55 | 56 | ## 自愈设计 57 | 设计系统要考虑高可用和系统自愈能力,设计一个伸缩性架构必须把各种失效状态视为常态,而不是特殊对待,要不停地想哪里会出错,出错后怎么办。系统能在最短时间内恢复,并且能自动化完成,就是自愈。 58 | -------------------------------------------------------------------------------- /docs/网站架构微服务/从0开始学架构/CAP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/网站架构微服务/从0开始学架构/CAP.png -------------------------------------------------------------------------------- /docs/网站架构微服务/架构图.md: -------------------------------------------------------------------------------- 1 | # 架构图 2 | 3 | ## 如何画好一张架构图?https://cloud.tencent.com/developer/article/2399135 4 | 5 | 架构图 = 架构的表达 = 架构在不同抽象角度和不同抽象层次的表达,这是一个自然而然的过程。 6 | 不同的抽象角度去做好架构分类:业务架构、应用架构、技术架构、代码架构、数据架构 7 | 8 | - 系统级,即整个系统内各部分的关系以及如何治理:分层。 9 | - 应用级,即单个应用的整体架构,及其与系统内单个应用的关系等。 10 | - 模块级,即应用内部的模块架构,如代码的模块化、数据和状态的管理等。 11 | - 代码级,即从代码级别保障架构实施。 12 | 13 | ## 前阿里 P9 教你如何画好一张架构图 14 | https://www.bilibili.com/video/BV1764y1a7PD/ 15 | 16 | 17 | # 工具(processon等有很多模板可以学习和使用) 18 | 19 | 系统架构图、部署架构图、网络架构图、技术架构图(优质架构图)https://www.processon.com/view/63e2ef687124f67e79af17d2 20 | 21 | 22 | # 数据图 23 | 可以用 echarts 的一些工具制作比如比例图、柱状图等 24 | https://echarts.apache.org/examples/zh/editor.html?c=dataset-link 25 | -------------------------------------------------------------------------------- /docs/网站架构微服务/架构学习.md: -------------------------------------------------------------------------------- 1 | # 架构学习 2 | 3 | 架构视频 4 | https://github.com/PegasusWang/System-Design 5 | -------------------------------------------------------------------------------- /docs/软件工程_项目管理/人月神话.md: -------------------------------------------------------------------------------- 1 | 布鲁克斯定律: 2 | 向一个已经延误的项目增加人手,只会使项目更加延误。 3 | 4 | 减少交流的方法是人力划分和限定职责范围 5 | 6 | 没有银弹。 7 | 现代软件系统中无法避免的内在特性: 8 | - 复杂度 9 | - 一致性 10 | - 可变性 11 | - 不可见性 12 | 13 | 推动力: 14 | - 高级语言 15 | - 分时 16 | - 统一编程环境 17 | 18 | 银弹的希望: 19 | - 高级语言 20 | - 面向对象 21 | - 层次化 22 | - 人工智能 23 | - 专家系统 24 | - 自动编程 25 | - 可视化编程 26 | - 程序验证 27 | - 环境和工具 28 | - 工作站 29 | - 购买和自行开发 30 | - 需求精炼和快速原型(不断抽取和细化产品需求) 31 | - 增量开发-增长 32 | - 卓越的设计人员 33 | 34 | 团队组织的目标是为了减少不必要交流和协作量。为了减少交流组织包括了人力划分和限定职责范围。 35 | 慢性进度偏离是士气杀手,如果错过了一个 deadline,确保指定下一个 deadline 36 | 对于项目的成功而言,项目人员的素质、人的组织管理比使用的工具和采用的技术方法更重要 37 | 38 | 软件工程的特殊问题: 39 | - 如何把一系列程序设计和构建成系统 40 | - 如何把程序或者系统设计成健壮的、经过测试的、文档化的、可支持的产品 41 | - 如何维持对大量复杂性的控制 42 | 43 | -------------------------------------------------------------------------------- /docs/软件工程_项目管理/代码之殇.md: -------------------------------------------------------------------------------- 1 | 六西格玛:结构化的问题解决系统 2 | 界定、测量、分析、改进、控制 3 | 4 | 有损于客户价值的浪费: 5 | 过量生产 6 | 运输 7 | 多余动作 8 | 等待 9 | 过程不当 10 | 库存 11 | 缺陷 12 | 13 | 软件度量准则: 14 | - 1.不要想着怎么度量,而是度量什么 15 | - 2.不要对中间环节进行过多度量分析,只对其期望结果进行度量分析 16 | - 3.不要知识收集数据,使用度量分析解决关键问题。 17 | - 4.不要使用度量分析做决定,而是使用度量分析使你明白需要做出个决定。 18 | - 5.不要只对原生度量进行比较,要有一些基准和返利,他们提供了参照细节。 19 | 20 | bug 剖析,报告 bug 的基本要求: 21 | - 简略的标题 22 | - 指派给谁 23 | - 重现步骤(包含运行环境,配置等信息) 24 | - 优先级 25 | - 严重程度 26 | - 解决方案 27 | 28 | 缩短开发周期: 29 | 1.确定开发周期耗时多长 30 | 31 | 32 | 33 | # 4章:跨越工种 34 | 35 | 36 | 37 | # 7章:职业生涯历险记 38 | 与人多沟通:接近客户,了解他们所思所想 39 | 选择好的功能来做(重要功能): 发现一些新冒出来的功能需求;成为重要功能的后备开发人员 40 | 41 | 养成习惯: 42 | - 好奇 43 | - 心存感激 44 | - 快速响应。请求你帮助的人快速响应 45 | 46 | 快速走向正轨: 47 | - 全面认识自己。你的入门槛和长远局限性 48 | - 建立你的支持团队。熟悉关键人物和价值主张 49 | - 延长蜜月期 50 | - 学习一下『绳』原理:团队合作的基础原理,融入这个团队 51 | - 开始探索:选择和你密切相关且紧迫的项目,深入探索。 52 | 53 | # 8章:自我完善 54 | 一旦你进入入门级别,智商和办事效率就难以对人才的优劣做出区分了,长远来看,你的沟通技能和自律能力才决定你的成败。 55 | 时间管理要点: 56 | - 消除干预、避免三心二意 57 | - 将任务委托给其他团队成员 58 | - 以优先级和重要程度为出发点 59 | 60 | 影响上司: 61 | - 想好你要取悦谁,安抚谁,不在乎谁 62 | - 投其所好,消除风险 63 | - 先讲存在的问题,再讨论解决方案 64 | 65 | 沟通的基础: 66 | 初级和高级工程师的主要差别在于影响力和感染力,主要的驱动力是高超的沟通技能。 67 | 引起关注: 68 | - 简明。必要的背景,指出要点。突出重点 69 | - 扼要。盯住你想表达的东西 70 | - 简单。 71 | - 条理清晰。 72 | - 谦恭。 73 | - 流畅 74 | 75 | 向别人提出反对意见时,回应他人的意见建议时,可以提出三个基本问题: 76 | - 什么是对的? 77 | - 哪些地方可以做得更好 78 | - 还有什么建议吗? 79 | 把重点放在方法或成果上面,而不是放在某个人身上,人是很难变的,但是可以改变他们的方法及成果 80 | 你的反馈和你的才学无关,能收受者带来帮助才是要义 81 | 82 | 83 | 捅娄子了: 84 | - 负责任。承认 85 | - 深入理解缺漏原因,不要越高越糟糕 86 | - 寻求他人帮助改正错误 87 | - 确保类似事件不再发生 88 | 89 | # 9章:成为管理者,而不是邪恶的化身 90 | 不要抱怨任何事情,除非你已经找到了建设性的改进意见 91 | 只要度量用于跟踪团队的和产品的进度,以便达到明确而公认的目标(比如绩效、会规律、发现和修复吕、解决客户问题所用的天数),那就有价值 92 | 优秀开发人员的特质: 93 | - 知道正在做什么。刨根问底 94 | - 不相信魔法。知道代码怎样工作的 95 | - 了解客户和业务。优秀的开发者知道事情的实质,能够分出轻重缓急并做出恰当权衡 96 | - 把客户和团队放在优先于自己的位置 97 | - 不妥协的精神和道德规范:如何完成工作、如何与人交流 98 | - 杰出的人际沟通技能。友好相处、尊重别人、跟人进行清晰、有效和恰当沟通。 99 | - 广泛的支持网络。 100 | 101 | 两种面试问题是有价值的: 102 | - 暴露应聘者性格特征的问题 103 | - 展示应聘者如何展开工作的问题 104 | 105 | 人才流动: 106 | - 持续补充新人 107 | - 灌输信息分享 108 | - 塑造组织结构和角色以创造成长机会 109 | - 为老员工找到新挑战 110 | 111 | 优秀的管理者: 112 | - 确保员工能够工作 113 | - 关心员工,尊重和效力 114 | - 定义清晰的目标、优先级和界限 115 | - 为人民服务 116 | 117 | -------------------------------------------------------------------------------- /docs/软件工程_项目管理/修改软件的艺术.md: -------------------------------------------------------------------------------- 1 | # 1 有些事情不对劲 2 | 3 | 瀑布模型促进了难以维护的软件的产生 4 | 5 | # 2 逃出混乱 6 | 7 | 三个导致低成功率核心因素: 8 | 9 | - 代码变更 10 | - bug 修复 11 | - 复杂度控制o 12 | 13 | # 3 聪明人,新想法 14 | 15 | 用敏捷替代传统的瀑布开发 16 | 17 | # 4 9个实践 18 | 19 | 黄金法则:对待别人就像你希望别人对待你一样。 20 | 21 | 若要成为一个实践,必须 22 | 23 | - 在多数情况下产生价值 24 | - 容易学习并且传授 25 | - 简单易行 26 | 27 | 9个实践:(构建可验证的代码行为) 28 | 29 | - 在问如何做之前先问做什么,为什么做,给谁做 30 | - 小批次构建 31 | - 持续集成 32 | - 协作 33 | - 编写整洁代码 34 | - 测试先行 35 | - 用测试描述行为 36 | - 最后实现设计 37 | - 重构遗留代码 38 | 39 | # 5 实践1:在问如何做之前先问做什么,为什么做,给谁做 40 | 41 | 客户和客户服务经理都不应该指挥开发者如何做某件事。 42 | 我们希望业务规则自然而然地被我们软件模型中的对象所表现出来,成为问题域。 43 | 44 | 45 | 需求文档的替代品是什么? 46 | 故事是包含如下内容的一句话; 47 | 48 | - 某个东西是什么 49 | - 为什么会有某个东西 50 | - 这个东西给谁做的 51 | 52 | 把验收标准自动化: 53 | 54 | - 功能是做什么的 55 | - 功能什么时候工作 56 | - 什么时候可以继续前进 57 | 58 | 产品负责人的7个策略: 59 | 60 | - 成为特定领域专家。对产品做什么有深刻理解,构建产品之前通过实例帮助理解 61 | - 在开发过程中探索。探索更好的解决方案 62 | - 帮助开发者理解为什么和为了谁 63 | - 描述你想要什么?而不是怎么做 64 | - 及时回答问题 65 | - 消除依赖。订好优先级,保证所有依赖都有足够的预留时间 66 | - 支持重构 67 | 68 | 69 | 编写更好的用户故事7个策略: 70 | 71 | - 把它当做一个占位符(用户故事无法取代需求文档) 72 | - 关注什么:用户故事关注一个功能做什么,而不是如何做? 73 | - 把『谁』人格化 74 | - 知道为什么会有一个功能需求 75 | - 开始时简单,日后加强。增量式设计和开发,重构和演进式设计 76 | - 注意边界情况。快乐路径,次要路径,异常路径,错误路径 77 | - 使用验收标准。通过一组验收测试来描述,帮助开发者原理过度开发 78 | -------------------------------------------------------------------------------- /docs/软件工程_项目管理/构建之法_现代软件工程.md: -------------------------------------------------------------------------------- 1 | # 6. 敏捷流程 2 | 3 | - FDD(Feature Driven Design) 4 | - Scrum 5 | - XP 6 | - TDD 7 | 8 | # 7. MSF 9 | Microsoft Solution Framework, MSF。 MSF没有像敏捷那样搞一个宣言,但是它也有一套思想框架—9条基本原则[注释1],下面来分别讨论。 10 | 11 | - 1. 推动信息共享与沟通(Foster open communications) 12 | - 2. 为共同的远景而工作(Work toward a shared vision) 13 | - 3. 充分授权和信任(Empower team members) 14 | - 4. 各司其职,对项目共同负责(Establish clear accountability and shared responsibility) 15 | - 5. 交付增量的价值(Deliver incremental value) 16 | - 6. 保持敏捷,预期和适应变化(Stay agile, expect and adapt change) 17 | - 7. 投资质量(Invest in quality) 18 | - 8. 学习所有的经验(Learn from all experiences) 19 | - 9. 与顾客合作(Partner with internal and external customers) 20 | 21 | 22 | # 8. 需求分析 23 | 软件需求:获取和引导需求;分析定义需求;验证需求;在软件产品的生命周期中管理需求; 24 | 25 | 常用的用户调研方法:焦点小组;深入面谈;卡片分类;调查问卷;用户日志研究;人类学调查;眼动跟踪研究;快速原型调研;A/B测试 26 | 27 | NABCD 模型: 28 | - N(Need,需求):创意解决了用户什么需求 29 | - A(Approach, 做法): 有什么独特的招数来解决用户的痛苦。可以是技术上的、商业模式上的、地域的、行业的、人脉的、行业的、成本上的。 30 | - B(Benefit, 好处): 产品或服务给用户带来什么好处呢? 31 | - C(Competitors, 竞争): 市场多大,竞争对手。有先发优势也有后发优势。我方优势和劣势 32 | - D(Delivery, 推广): 怎样把产品交到用户手中? 33 | 34 | 功能的定位和优先级:杀手功能(core)/外围功能(Context); 必要需求(Mission Critical)/辅助需求(Enabling)。 35 | 对不同功能有哪些办法呢? 36 | - 维持: 最低成本维持此功能 37 | - 抵消:快速达到足够好,和对手差不多 38 | - 优化:大力气做到并保持行业最好 39 | - 差异化:产生同类产品比不了的功能或优势(我有人无的优势,或者一个数量级以上的优势) 40 | - 不做:砍掉 41 | 42 | 实现的复杂程度由两个因素决定: 43 | - 需求的复杂程度:程序员是第几次实现类似需求? 44 | - 技术的复杂程度:程序员是第几次用这个技术实现 45 | 46 | 47 | # 12 用户交互设计 48 | 降低用户的认知阻力。软件工程师往往以掌握认知阻力大的工具而自豪(比如命令行操作,VI/Emacs等),但是大多数用户的心理是要 49 | 躲避认知阻力。 50 | 51 | 评价标准: 52 | - 尽快提供可感触的反馈系统状态 53 | - 系统界面符合用户的现实惯例。(避免给用户带来惊奇) 54 | - 用户有控制权 55 | - 一致性和标准化 56 | - 适合各种类型用户 57 | - 帮助用户识别、诊断并修复错误 58 | - 有必要的提示和帮助文档 59 | 60 | 61 | # 13 软件测试 62 | 内部/外部公开测试(Alpha/Beta Test) 63 | 64 | 设计测试用例: 65 | - 等价类划分 66 | - 边界值条件 67 | - 常见错误,经验推测 68 | 69 | 70 | # 14 质量保障 71 | 72 | 软件质量=程序质量+软件工程质量 73 | 74 | 程序质量:外在功能的质量 75 | 软件工程质量:功能、成本、时间。可见性、风险控制、成本控制、指标完成状况 76 | 77 | CMMI(Capacity Maturity Model Inte-grated, 能力成熟度模型集成) 78 | 79 | # 15 稳定和发布阶段 80 | 81 | # 17 人、绩效和职业道德 82 | 83 | RASCI模型: 84 | R:Responsible,负责把具体事情做好。 85 | A:Accountable,对任务负全责,有批准的权力。 86 | S:Support,对任务提供支持,辅助任务的完成。 87 | C:Consulted,咨询,拥有完成项目所需的信息或能力的角色。 88 | I:Informed,知会者,应该事后及时通知结果的角色。 89 | 90 | P={做事的,不做事的,不让别人做事的,P4=做假的事的,P5=假装做事的} 91 | -------------------------------------------------------------------------------- /docs/软件工程_项目管理/解析极限编程-拥抱变化.md: -------------------------------------------------------------------------------- 1 | xp 中包含了5个指导开发的价值观: 2 | 3 | - 沟通:每当你遇到一个问题,首先问自己这个问题是不是缺乏沟通引起的,你需要什么样的沟通来解决该问题? 4 | - 简单:简单而又可能有效 5 | - 反馈:知道得越早,就可以调整得越早 6 | - 勇气:面对恐惧 7 | - 尊重:同时提高软件开发的人性和生产率 8 | 9 | 10 | 原则: 11 | - 人性化:成为一名优秀的开发者需要什么:基本安全、成就感、归属感、成长、亲切感 12 | - 经济学:解决最高优先级的业务需求会使项目的价值最大化。金钱的时间价值 13 | - 互惠互利:自动化测试、消除复杂性、选择一致的名称 14 | - 自相似性: 15 | - 改进:做到你今天所能做到的最好 16 | - 多样性:团队需要多样性 17 | - 反省: 18 | - 流:频繁部署 19 | - 机遇 20 | - 冗余:困难的问题应该用不同的方法解决 21 | - 失败:失败如果能产生知识,就是有价值的。失败好过无休止的争论 22 | - 质量:用一些小的安全的步骤来高效实现大的改变 23 | - 婴儿步:小步前进 24 | - 接受责任:责任不能被指定,只能被接受 25 | 26 | # 7章 基本实践: 27 | - 坐在一起 28 | - 完整团队:将拥有项目成功所必须的各种技能和视角的人都包含进团队 29 | - 信息工作空间: 30 | - 充满活力工作 31 | - 结对编程:结对,分析、设计、测试。 32 | - 结对与个人空间:注意个人距离;防止异性情感; 33 | - 故事:使用客户可见的功能单元进行计划。在故事生命周期早期很早就就进行估算 34 | - 周循环:一次计划一周的工作 35 | - 季度循环: 36 | - 松弛 37 | - 10分钟构建 38 | - 持续集成 39 | - 测试优先编程: 测试-》编码-》重构-》测试-》编码-》重构 40 | - 增量设计:尽早做大的决策和推迟所有小的决策 41 | 42 | # 8章:启程 43 | - 为实践绘图 44 | 45 | # 9章:扩展实践 46 | - 真实客户参与:将那些生活或业务受到开发系统影响的人纳入到团队中 47 | - 增量部署: 48 | - 团队连续性:将搞笑的团队凝聚在一起。将人抽象成物品:即插即用的编程单位。不能忽略关系和信任 49 | - 收缩团队: 50 | - 根源分析:每次开发发现一个缺陷,都要同时排除这个缺陷和产生它的原因。对为什么发生问题提出5个疑问: 51 | - 为什么我们会遗漏这个缺陷 52 | - 为什么我们不知道 53 | - 为什么他不是这个团队中的一部分 54 | - 为什么没有其他人知道如何维护 55 | - 为什么不是管理上优先考虑的事情 56 | - 共享代码:集体所有制 57 | - 代码和测试: 58 | - 单一代码库 59 | - 每日部署 60 | 61 | # 10章:完成 XP 团队 62 | 63 | 64 | # 11章:约束理论 65 | 66 | 约束理论:认为任何一个系统在某一时间只存在一个约束(偶尔两个),要提高系统的整体吞吐率,首先要找到那个约束。 67 | 68 | # 12章:计划:管理范围 69 | 事情进展不顺利的时候就是我们最需要坚持价值观和原则的时候,同时修改我们已有的实践去尽可能地保持效率。 70 | 71 | # 13章:尽早测试、经常测试、自动测试 72 | 缺陷成本递增率(DCI):越早发现缺陷,所需的花费就越少 73 | 74 | # 14章:时间的价值 75 | 增量设计 76 | 77 | # 15章:增大XP规模 78 | - 人数:大问题转化为小问题;应用简单的解决方案;如果还有问题应用复杂的解决方案 79 | - 投资: 80 | - 时间:自动化测试和增量设计 81 | - 问题的复杂性: 82 | - 解决方案的复杂性:分解复杂性,同时持续交付 83 | - 故障的后果: 84 | -------------------------------------------------------------------------------- /docs/运维/linux集群和自动化运维.md: -------------------------------------------------------------------------------- 1 | # 1 系统架构设计的构架基础 2 | 3 | 1.1 术语 4 | 5 | pv:page view 网站被访问的页面数量 6 | uv: unique visitor 独立访问 7 | 8 | 9 | # 2 生产环境下的 shell 和 python 脚本 10 | -------------------------------------------------------------------------------- /docs/运维/python自动化运维.md: -------------------------------------------------------------------------------- 1 | 笔者虽然不做运维,大部分时间关注业务代码和工程,但是了解一些运维工具对于排插问题还是有帮助的。稍微记录一下,至少碰到问题了知道有啥工具。 2 | 3 | 4 | ## 1章:系统基础信息模块详解 5 | 6 | 通过第三方模块获取服务器的基本性能、块设备、网卡接口、网络地址库等信息。 7 | 8 | ### 1.1 系统性能模块psutil:获取系统性能信息、内存信息、磁盘信息、网络信息、用户信息等。 9 | ### 1.2 IP地址处理模块IPy: 处理IP地址,网段等。 10 | ### 1.3 DNS处理模块dnspython: 实现dns服务监控以及解析结果的校验,替代nslookup及dig等工具。比如查询CNAME记录等。DNS解析可以做简单的负载均衡。 11 | 12 | ## 2章:业务服务监控详解 13 | 14 | ### 2.1 文件内容差异比对方法:difflib模块。也可以用diff工具,meld等。 15 | ### 2.2 文件与目录差异对比方法:filecmp。meld也可以进行目录比较。 16 | ### 2.3 邮件发送模块:smtplib。笔者经常使用flask_mail插件和pandas给运营人员生成报表,还是相当方便的。 17 | ### 2.4 探测web服务质量: pycurl。我觉得可能用http,curl,requests等更方便。 18 | 19 | ## 3章:定制业务质量报表详解 20 | 21 | ### 3.1 数据报表之Excel操作模块;XlsxWriter,笔者更常使用pandas,处理报表excel等比较方便,pandas.DataFrame提供了很多功能。 22 | ### 3.2 Python与rrdtool的结合模块:python-rrdtool,rrdtool(round brobin database)工具为环状数据库的存储格式,round robin是一种处理定量数据及当前元素指针的技术。 比如实现网卡流量图绘制,很多监控工具都用到了该工具。 23 | ### 3.3 生成动态路由轨迹: scapy 强大的交互式数据包处理程序,能对数据包进行伪造或者解包,包括发送数据包、包嗅探、应答和反馈匹配等功能。比如使用traceroute函数实现生成路由轨迹图。 24 | 25 | ## 4章:Python与系统安全 26 | #### 4.1 构建集中式的病毒扫描机制:pyClamad,让python直接使用ClamAV病毒扫描守护进程clamd。 27 | #### 4.2 实现高效的端口扫描器:高危端口暴露在网站有被入侵风险。使用python-nmap实现高效的端口扫描。 28 | 29 | 30 | ## 5章:系统批量运维管理器pexpect 31 | pexpect可以理解成Linux下的expect的python封装,通过pexpect可以实现对ssh、ftp、passwd、telnet等命令的自动交互,而无需人工干涉达到自动化的目的。 32 | 核心组建包括spawn类、run函数以及派生类pxssh等。 33 | - spawn: 启动和控制子应用程序 34 | - run:调用外部命令的函数,可以同时获得命令的输出结果及命令的退出状态。 35 | - pxssh类:操作ssh 36 | 37 | ## 6章:系统批量运维管理器paramiko 38 | paramiko是基于python实现的ssh2远程安全连接,支持认证及密钥方式,可以实现远程命令执行,文件传输、中金ssh代理等功能,相对于pexpect封装的层次更高,更贴近ssh协议的功能。paramiko包含俩核心组件,SSHClient类和SFTPClient类。 39 | - SSHClient类:ssh服务会话的高级表示,封装了传输(transport)、通道(channel)及SFTPClient的校验、建立的方法,通常用于执行远程命令。 40 | - SFTPClient类:SFTP客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,比如文件上传、下载、权限、状态等操作。 41 | 42 | 43 | ## 7章:系统批量运维管理器Fabric详解 44 | Fabric基于python实现的ssh命令行工具,简化了ssh的应用程序部署及系统管理任务,提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行、文件上传、下载及完整执行日志输出等功能。详细使用还是看官方文档,典型使用场景有文件上传与校验、环境部署、代码发布。 45 | 46 | 47 | ## 9章:集中化管理平台Ansible详解 48 | Ansible一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台。Ansible提供了一个在线Playbook分享平台,汇聚了各类常用功能的角色。Ansible配置文件以YAML格式存在。 49 | 50 | ## 10章:集中化管理平台Saltstack详解 51 | Saltstack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,可以理解成简化版的puppet。 52 | 53 | 54 | ## 11章:统一网络控制器Func详解 55 | Fedora Unified Network Controller:Fedora平台统一构建的网络控制器。 56 | 57 | ## 12章:Python大数据应用详解 58 | -------------------------------------------------------------------------------- /docs/金融理财/一小时漫画资产配置实战法.md: -------------------------------------------------------------------------------- 1 | # 鸡蛋不要放在同一个篮子里 2 | 3 | 什么是资产配置:规划-实施-优化管理 4 | 5 | # 第1章: 为什么要做资产配置 6 | 7 | 风险和收益当中找到平衡 8 | 9 | 资产配置的目的:工作分身术;储存劳动力;跑赢通胀;实现财富自由 10 | 11 | 12 | # 第2章: 普通人可以配置什么资产 13 | 14 | - 金融工具使用说明书。幸存者偏差;认识自己(风险承受能力);慎用杠杆;降低费率;复利奇迹;参与正和游戏 15 | - 股票。做一个价值投资者 16 | - 基金。指数基金 17 | - 货币和债券(风险平衡器). 18 | - 保险 19 | - 资产小配件。房地产;黄金(少量仓位对冲特殊时期风险);银行理财;期货 20 | 21 | 22 | # 第3章: 资产配置要做哪些准备 23 | 24 | - 会下金蛋的鸡。开源节流 25 | - 储蓄需要想象力。棉花糖实验(家庭背景;父母学历;社会关系;智商情商) 26 | - 普通人要存哪些钱。六个罐子存钱法 27 | - 资产储蓄罐。购买资产。生钱资产、耗钱资产、其他资产 28 | - 教育储蓄罐。学习就是最好的投资 29 | - 玩乐储蓄罐 30 | - 梦想储蓄罐 31 | - 赠予储蓄罐。社交;捐赠 32 | - 别让钱闲着。宽基指数基金定投。目标止盈法;估值止盈法;市场情绪法 33 | 34 | 35 | # 第4章: 资产配置的目标与策略 36 | - 以人生价值为目标。 37 | - 事件(一生希望达到的成就); 38 | - 金额(4%法则)。 家庭年开销/4% = 财富自由所需资产 39 | - 时间 40 | - 平衡风险和收益 41 | - 羊群效应 42 | - 有效前沿曲线。预期收益率相同的情况下,选择风险最低组合;风险相同情况下,选择预期收益率最高的组合。 43 | - 投资大师的资产配置 44 | - 均值方差模型证明了,分散到不相关的资产上,可以有效降低风险、增加收益 45 | - 格雷厄姆:股债各 50% 46 | - 约翰博格:60%指数基金、40%债券基金 47 | - 大卫斯文森:70%股权类(美股、新兴市场、海外发达国家市场、房地产信托基金)、30%固定收益。无论什么类型比例不超过30% 48 | - 威廉伯恩斯坦(《有效资产管理》):25%美股,25%小盘股,25%海外发达国家市场,30 年期国债 49 | - 麦嘉华:25%股票、25%黄金、25%现金和债券、25%房地产 50 | - 巴菲特:获取更多优质公司股权然后长期持有。投资指数基金 51 | - 核心卫星策略。 52 | 53 | 54 | # 第5章:不同阶段,不同的资产配置 55 | 56 | - 牛市与熊市的资产配置-动态再平衡 57 | - 一般来说,股债呈负相关。随着时间推移,比例会发生变化,就要进行动态再平衡。调整比例而不是金额 58 | - 动态再平衡策略(逆向投资思维):高抛低吸;降低风险;克服人性;超额回报 59 | - 定期再平衡:半年或者一年。太长会增加风险,太短会增加交易成本 60 | - 波动幅度再平衡:涨跌 15% 或 20% 进行一次再平衡比较合适。幅度太大达不到也增加风险,幅度太小容易增加交易成本 61 | - 时间和波动幅度结合,不管是时间或者波动幅度达标,都可以动态再平衡,至少保证每年平衡一次。 62 | - 动态再平衡不一定是最好的策略,但永远不会错 63 | - 经济周期中的资产配置-全天候投资策略 64 | - 信贷扩张收缩周而复始形成短期经济周期。主要由央行控制,每个周期能持续 5-8 年 65 | - 桥水基金全天候投资策略:简化版策略:40%长期国债,30%股票,15%中期国债,7.5%大宗商品,7.5%黄金。至少每年动态平衡一次 66 | - 人生周期中的资产配置-越长大越稳定 67 | - 年纪越大,能承受的风险越小,应该在资产配置中选择更多低风险产品 68 | - 越早接触资产配置越好;不要在努力赚钱的时候偷懒;理性进行资产皮遏制,不要随意增加自己的风险窗口 69 | 70 | # 第6章: 财富自由的秘密 71 | - 不要亏钱。尽量避免亏损 72 | - 神奇的能力圈。清楚自己的能力圈,在能力圈内做出决策,可以有效减少亏损 73 | - 安全边际。价格与价值的距离 74 | - 获得超额收益 75 | - 智能定投。不定期也不定额,低位多投,高位少投,实现利润最大化 76 | - 分批买入。平均仓位法;递增仓位法(价格越低,买入资金越多) 77 | 78 | # 最后的建议 79 | - 目标坚定且清晰。财务目标。事件、金钱、时间一个不能少 80 | - 不要亏钱。防守比进攻重要,只要不亏钱就能活下来 81 | - 不被情绪影响。一旦执行了储蓄、资产配置比例一级止盈或者分批买入节点,就要严格执行,不要被情绪影响清晰更改计划 82 | - 现金流很重要 83 | - 不要在意波动。必须要忍受短期不确定性 84 | - 要有耐心。市场周期和逆向操作的痛苦。热情高涨不出手,悲观绝望有勇气踏入市场。不管买入卖出,耐心等待合适时机 85 | - 兼顾生活。投资赚钱是为了更好地生活。不要选择超过风险承受能力的资产 86 | - 学会花钱。投资于体验、时间,别人收获幸福感才是赚钱的意义 87 | - 坚持给予。 88 | - 永不止步。为了兴趣和热爱 89 | - 保持行动力。现在就去做 90 | -------------------------------------------------------------------------------- /docs/金融理财/价值投资训练营.md: -------------------------------------------------------------------------------- 1 | # 价值投资训练营:从入门到进阶 2 | 3 | https://www.youtube.com/playlist?list=PLqMI_4px2qmtvdRjWt2t9rg_r87Elu0gN 4 | -------------------------------------------------------------------------------- /docs/金融理财/基金定投-让财富滚雪球.md: -------------------------------------------------------------------------------- 1 | 选择高波动、高成长、高景气的行业基金。传媒、家电、医药、信息技术、银行、证券。 2 | 3 | 回撤止盈法。 4 | 5 | 最佳区间:先跌后涨(微笑曲线),适合定投的好时机。 6 | -------------------------------------------------------------------------------- /docs/金融理财/定投十年.md: -------------------------------------------------------------------------------- 1 | # 1 定投前的准备 2 | 3 | 养成三个好习惯: 4 | 5 | - 把每个月开支分成4份,避免早早花完 6 | - 记账 7 | - 做好预算 8 | 9 | 为物品贴上生命标签,一杯星巴克咖啡=3小时生命,一件大衣=300小时生命,再问自己值不值。 10 | 刚毕业租房找离公司近的,节省时间提升自己。 11 | 12 | - 可选消费降级 13 | - 必须消费走量 14 | - 聚焦主业 15 | - 定期检查 16 | 17 | 18 | # 2 定投 19 | 20 | 不要去预测市场 21 | 22 | # 3 多少钱才能自由 23 | 24 | 教育的投资回报率是巨大的 25 | 26 | 财务自由的4%法则。 27 | 28 | 持有优质的的,可以抵抗通货膨胀的资产。 29 | 30 | # 4 投资必备的基础知识 31 | 32 | 定投就是定期把人力资产转换为可以产生现金流的金融资产。 33 | -------------------------------------------------------------------------------- /docs/金融理财/指数基金投资日志.md: -------------------------------------------------------------------------------- 1 | # 1. 指数基金:散户上班族的投资神器 2 | 3 | 投资原则:收益和风险成正比;人弃我取,人取我弃;闲钱投资、理性投资。 4 | 5 | 基金投资者的收益,只有三成是由基金业绩决定的,其余七成都是由投资者的申赎行为决定。 6 | 7 | # 2. 指数基金到底是什么? 8 | 9 | FOF(Fund of Funds): 投资其他基金的基金。 10 | 11 | ETF(Exchange Traded Funds): 交易型开放式指数证券投资基金。 12 | 13 | 投资基金的费用: 14 | 15 | - 运作费。包括管理费、托管费、指数授权费 16 | - 交易费。申购赎回费和销售服务费 17 | 18 | 性价比: ETF > 普通指数基金 > 指数基金(smart beta) 19 | 20 | # 3. 投资指数基金必备能力 21 | 22 | # 4. 挑选基金时,到底在选什么? 23 | 24 | - 选择优秀指数。消费、医药 25 | - 选择优秀基金 26 | 27 | 高费率是基金投资者的毒药。同类指数基金,一定要选择费率最低的。 28 | 29 | 影响指数三大因素:初始投资时的股息率、投资期内的市盈率变化、投资期内的盈利增长率。 30 | 31 | - 股息率。选择指数基金时,股息率越高,指数基金越可能被低估 32 | - 市盈率。长期看,市盈率在一定范围内周期性变化。 33 | - 盈利。等待均值回归 34 | 35 | # 5. 十年十倍的指数基金定投策略 36 | 37 | 基金亏损两个主要原因就是追高买入和频繁申购赎回。 38 | 如果市场明显高估,长期看不可持续,规避倒 v 形反转,暂停定投也是理性选择。 39 | 40 | 定投常见策略: 41 | 42 | - 均线定投法 43 | - 市值定投策略(价值平均)。跌了多投,涨了少投 44 | - 定投高波动指数基金。选择规模大的、波动也大的 45 | 46 | 主动投资和被动投资并举,在一些专业性或者龙头效应更强的行业,适合主动基金发挥,比如医药、军工、地产。 47 | 48 | 定投是反人性的,越跌越买,短期受损会在长期价值投资得到补偿。 49 | 50 | - 持有多少基金最优。4 到 10 只,单只最好不要超过 25%。买太多了管理不过来 51 | - 先卖亏的,还是先卖赚钱的。有些人喜欢卖掉赚了钱的,但是主动基金卖出赚钱的,犯错概率更高。 52 | - 基金组合两层意义。组合投资不是买更多基金,而是不同的买不同投资标的,降低基金之间的相关性 53 | - 通过资产配置控制最大回撤。 54 | 55 | 建立自己的投资体系,做好投资组合。 56 | 57 | - 什么是组合?考虑相关性,而不是个数 58 | - 基准投资组合60/40。卖高买低,维持比例,动态平衡 59 | - 价值投资经典书籍。《聪明的投资者》《投资最重要的事》《安全边际》《富爸爸穷爸爸》《资产配置投资实践》《资产配置手册》 60 | 61 | # 6. 风险控制:陷阱和馅饼 62 | 63 | 如何做好风险控制? 64 | 65 | - 分散风险。建立投资组合,分散投资 66 | - 闲钱投资。需要割肉的不要投。如果亏损期间需要割肉,就成了永久亏损。 67 | - 规模大的基金公司。规模大靠谱,不要追新 68 | - 定投规避风险。止盈不用止损。后期控制最大回撤 69 | - 定投不能中断。否则难以在熊市积累筹码,但是熊市坚持定投需要很强的耐力,甚至忍受长期亏损 70 | 71 | # 7. 理性投资的深度思考 72 | 73 | 低估值指数轮动。 74 | 75 | - 股票(权益资产) 76 | - 债券(固定收益资产) 77 | - 房地产 78 | - 现金 79 | 80 | 基金投资,越勤奋可能亏钱越多,频繁交易手续费都给基金公司赚了。 81 | 82 | - 失败是成功之母。思考两种不同结果 83 | - 交易费用导致亏损。相同标的,一定要选择费率最低的。 84 | 85 | 投资是反人性的。定投坚持不简单 86 | 87 | - 70% 投资者亏钱。喜欢追涨杀跌 88 | - 刺激反应相容性原则(西蒙原则),人们希望收到的反馈是他们所希望的,否则人就会犯错。涨了可能是高估,跌了是低估 89 | - 低估买入,高估卖出。 90 | - 学会反省。 91 | - 制定投资纪律,严格执行。推荐智能定投 App 严格执行计划 92 | - 追随正确的人(基金经理) 93 | - 不断学习。无论是技术还是心理上,都需要不断学习,认请底层逻辑才能游刃有余,坚持你的投资逻辑 94 | 95 | 要想抄底不死,先确保本金安全。 96 | -------------------------------------------------------------------------------- /docs/金融理财/穷查理宝典.md: -------------------------------------------------------------------------------- 1 | 五何原则:何人因何故在何时何地做了何事 2 | 3 | 规模优势(信息优势) 4 | 5 | 年轻人在工作中应该追求什么:同时满足这三个原则几乎不可能,但应该努力尝试: 6 | - 别兜售你自己不会购买的东西 7 | - 别为你不尊敬和钦佩的人工作 8 | - 只跟你喜欢的人同事 9 | 10 | 想说服一个人,从这个人的利益出发是最有效的 11 | 如果想要说服他人,要诉诸利益,而不是诉诸理性 12 | 13 | 人类误判心理学: 14 | 15 | -------------------------------------------------------------------------------- /docs/金融理财/聪明的定投.md: -------------------------------------------------------------------------------- 1 | # 3. 定投品种 2 | 3 | 市盈率(PE) = 总市值/过去 4 个季度归属于母公司的利润。比如pe是 5,保持利润不变 5 年收回成本。 4 | pe 越小说明收回投资的时间越短,估值越低。 5 | 6 | 市净率(PB)=总市值/归属母公司股东权益合计。pb=2 说明你花了 2 元,买了公司 1 元的净资产。 7 | 8 | 股息率=上一年每股现金分红/股价。 9 | 10 | ROE(净资产利润率)。 个股 ROE=税后净利润/所有者权益的平均x100%。 定投高 ROE 指数,高 ROE 为指数上涨奠定了基础。 11 | 12 | 中国股市牛短熊长,定投低估值PE,高ROE 的品种,长期下跌可以积累筹码。 13 | 14 | 收益率最高的是增强型指数基金,不管是沪深 300 还是中证 500,说明 A 股市场有效性不强。不像美股的长牛 15 | 16 | 宽基指数中的沪深 300,中证 500,行业指数中的低PE 银行,高 ROE 中的医药和食品是定投的较好品种。 17 | 18 | 19 | # 4. Smart Beta 指数基金 20 | 21 | 基金收益率超过了指数,超越部分的收益就叫做 alpha 收益,而随着指数上涨的这部分收益就是 beta 收益。 22 | Smart Beta 就是定义了一系列的影响因子。 23 | 24 | - 基本面 50 25 | - 上证 50AH 优选 26 | - 央视 50 财经指数 27 | - 沪深 300价值指数。从沪深 300 指数的 300 只成分股选取了 1000 只价值因子最高的股票 28 | - 中证 500 行业低波动 29 | - 深证 F60,F120 30 | - 红利指数。上证红利、深证红利、中证红利、标普红利 31 | - 中证腾讯济安价值 100. 似乎没跑过大盘 32 | - 淘金 100 指数。 33 | 34 | 综合比较,表现较好的是基本面 50(000925)和 300 价值指数(000919) 35 | 36 | 37 | # 5. 主动基金和 QDII 基金 38 | 39 | 冠军魔咒:当年的主动基金冠军往往下一年跑输市场。如果真有常胜将军,大家都去买第一名的基金了。 40 | 41 | - 看长期表现。至少要上亿规模,但是超过百亿元也难表现出色 42 | - 基金经理。主动型基金依赖基金经理的决策 43 | - 基金公司。规模大,成立时间长 44 | - 基金季报、年报 45 | - 评级。晨星网、天天基金网,筛选高评级基金 46 | - 基金规模。太小和太大都不好 47 | 48 | QDII (Qualified Domestic Institutional Investor, 合格境内机构投资者),可以购买美国标普 500,纳斯达克指数基金。 49 | 50 | 51 | # 6. 什么时候开始定投 52 | 53 | 股市跌得越低,定投越合适。微笑曲线能给投资者带来不错的收益。 54 | 长期定投,周定投和月定投收益差异不大,关键是要长期坚持。 55 | 56 | # 7. 何时赎回 57 | 58 | A 股定投一定要止盈。A 股是一个牛短熊长、暴跌暴涨的不成熟股市。如果不止盈,后期最大回撤可能会让投资者损失惨重。 59 | 60 | 两种估值止盈法:估值偏高止盈;收益率到了阈值。 61 | 62 | 收益率阈值清仓法:定了一定阈值可以逐步清仓。止盈后一般还需要继续定投 63 | 64 | (个人感觉止盈也很难,或者可以尝试回撤止盈法,防止踏空牛市,如果触发了最大回撤跌幅,就一把或者分批卖了) 65 | 66 | # 8. 手工和自动定投 67 | 68 | 场外交易如果是 15:00 之前交易,按照当天净值计算,过了15:00 按照次日净值计算。 69 | 70 | 建议场外用 App 执行自动扣款定投,手动执行不容易坚持下来,尤其是在熊市很考验耐性和心理。 71 | App 智能定投自动扣款更容易坚持定投纪律,规避人性的弱点。 72 | 73 | # 9. 估值定投法 74 | 75 | 中国股市平均牛熊周期在 5 年左右。可以根据 5 年的 pe 百分位。 76 | (话说天弘基金的大数据统计-《指数基金投资至简》,散户平均持有不超过仨月,能坚持数年定投的少之又少,还是要放平心态) 77 | 78 | # 10. 技术指标定定投策略 79 | 80 | 均线定投策略还是比较靠谱的。 81 | 82 | # 11. 价值平均策略 83 | 84 | 价值平均:每次定投通过增减投资金额,维持投资后的价值线性增加。涨的时候少投,跌的时候多投。 85 | 86 | # 12. 有限价值平均策略 87 | 88 | 设定一个阈值,最高定投金额设置为 5 倍的起始投资额。更适合A 股定投。 89 | 有限的意思在于,如果跌幅过大,按照价值平均策略,需要投入非常多的金额补仓,可能超过投资者当月定投的承受能力, 90 | 所以设置一个最大的定投阈值,比如最大是起始金额的 2 倍。 91 | 92 | # 13. 抗通胀的策略修正 93 | 94 | 考虑通胀,在有限价值平均策略的基础上,增加一定的百分比。 95 | (个人用的蛋卷基金的 App,发现有考虑通胀水平的智能定投) 96 | 97 | # 14. 赎回之后的处理 98 | 99 | - 增量资金继续定投,存量资金买固定收益产品,比如货币基金,债券,分级 A 等,适合股市高估的情况下。(股债轮动) 100 | - 赎回后的存量资金分成若干份,加上每个月的增量资金做个定投。适合股市没那么高估的。(继续定投低估的) 101 | 102 | 这里有定投和分批建仓的区别,赎回之后手握一大笔现金分批买入其实不是定投,可以认为是分批建仓。定投基本是发工资才买, 103 | 没有太多现金储备。 104 | 105 | # 15. 定投实战案例 106 | 107 | 股债再平衡策略。两个品种的相关度越低越好,最好是负相关(防止要涨都涨,要跌都跌)。高抛低吸原理,不断轮动 108 | 109 | 蛋卷基金的智能定投,就是自动计算、自动扣款的 价值平均策略。推荐使用“上涨少投,下跌多投”的智能定投策略。 110 | 可以设置最大的定投金额是原始金额的(2-10倍)。一般可以设定使用计划初始定投资金的 60%-80% 111 | 定投,防止下跌增加金额之后不够用的。剩下的钱可以考虑放到货币基金。 112 | 113 | 智能定投品种:长期收益和 ROE 正相关。分散投资几个稳定 ROE 较高的,食品、家电、医药、银行等还是可取的。 114 | 115 | # 16. 定投工具 116 | 117 | 制作定投回测模板:通达信导出到 excel。书中给出了一个excel 模板 118 | 119 | 年化收益率计算公式。学会计算收益和年化收益。 120 | 121 | # 17. 开源节流 122 | 123 | - 天时:好行业和好公司。点面结合,大小公司都经历。快速成长的行业 124 | - 地利:喜欢的职业。真正喜欢才能做得好 125 | - 人和:有能力。有能力才能把握住机会。扮演两个角色,一个是汇报的,一个是听汇报的。 126 | 127 | 一定要考虑止盈,越往后期,回撤影响越大。(如果遇到连续 下跌,考虑是不是熊市来了?要分批止盈么?) 128 | -------------------------------------------------------------------------------- /docs/金融理财/迈出投资第一步/资产配置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PegasusWang/booknotes/8576a9fc9ffc6afd257b4a616c830404c58ffd45/docs/金融理财/迈出投资第一步/资产配置.png -------------------------------------------------------------------------------- /docs/金融理财/雪球三分法靠科学体系取得长期胜利.md: -------------------------------------------------------------------------------- 1 | # 资产配置的重要性 2 | 3 | 长远看,大于 90%的投资收益都来源于成功的资产配置,只有 10% 是由择时和标的的选择决定的。 4 | 5 | - 抓牛基容易高位站岗。资产配置看中的是波动率和相关性 6 | - 遇到波动会拿不住。 7 | - 押注单一资产风险高 8 | 9 | 10 | # 如何实现资产配置 11 | 12 | 雪球三分法:资产分散、市场分散、时间分散 13 | 14 | - 为什么基于这三个维度。差异化、风险对冲。多元配置 15 | - 资产分散:现金、债券、股票、商品。低相关性 16 | - 市场分散。不同经济体 17 | - 时间分散。每月现金流分散投资。定投 18 | 19 | # 从 0-1 搭建属于自己的投资组合 20 | 21 | 五步骤: 22 | 1. 3 个问题理清投资目标 23 | 2. 确定大类资产配置比例 24 | 3. 选择每类资产的基金和配比 25 | 4. 一键买入配置方案 26 | 5. 再平衡对持仓跟踪和评估 27 | 28 | - 选择哪些底层资产。简化版:A股、美股、中债、黄金 29 | - 如何配置大类资产权重。比如全天候策略 30 | - 30%股票 + 55%债券+7.5黄金 + 7.5大宗商品 + 每年一次再平衡 31 | - 选择哪种基金完成配置。先锁定 beta,再追求 alpha 收益。 32 | - 定期再平衡。当比例偏离初始计划进行调整。降低风险同时提升收益 33 | 34 | # 三分法小程序 35 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs==1.4.1 2 | python-markdown-math==0.6 3 | mdx_truly_sane_lists==1.2 4 | -------------------------------------------------------------------------------- /tolearn.md: -------------------------------------------------------------------------------- 1 | # libevent 2 | https://aceld.gitbooks.io/libevent/content/ 3 | https://github.com/libevent/libevent 4 | 5 | 6 | # libev 7 | https://github.com/enki/libev 8 | http://software.schmorp.de/pkg/libev.html 9 | https://segmentfault.com/a/1190000006173864 10 | http://oserror.com/backend/libev-analysis/ 11 | http://luohaha.github.io/Chinese-uvbook/index.html 12 | 13 | # gevent 14 | http://www.cnblogs.com/xybaby/p/6370799.html 15 | 16 | # 微服务 17 | 18 | # 消息队列 19 | 20 | # 中间件 21 | 22 | # 领域驱动设计 23 | --------------------------------------------------------------------------------