我想解决的问题:

1,到底应该如何把知识总结归纳下来,并能够内化。当面对实际问题时,能够用的上。

2,如何学会商业知识,如何发现商业机会

看了知乎专栏的《不平凡的思考力》,收到很多启发

他提供的三步学习法

1,打开大脑
  • 保持初心,初学者的心态。保持好奇心。Stay hungry, Stay foolish,保持(对知识的)饥渴,保持(对前方道路的)无知

  • 区分信息和知识

    • 知识:知识包括概念,规律,方法论
  • 区分经验和规律

    • 规律:是可以复现结果的原因(条件+方法论)
    • 规律:描述事物的基础本质、普遍属性,描述事物之间的关系。
  • 区分优质劣质

2,放入知识
  • 利用云笔记软件,把知识分类归档
  • 多学习已有的经典知识,节省时间。比自己摸索强,可能需要花点小钱。
  • 建立连接。写下笔记和感悟,标注重点内容。让新知识和旧知识建立连接。
3,使用知识
  • 使用知识是为了解决问题,学习知识提高思考质量

问题分析

1,希望通过方法A实现目标B,结果只达到了现状B‘,而且过程中可能受到了变量C的影响

2,问题的本质是B’ 和B之间差距的原因

3,分析问题原因的方法:改变现状的”透视三棱镜“

  • 校准目标,目标B需要SMART。目标太高是不对的,需要先完成一个小目标。
  • 方法A可能不够好,需要调整。可能是添加新的元素,或者彻底换成其他方法。
  • 以外的变量C可能导致问题,但是C不是很明显能察觉。所以需要通过"象、数、理"来分析,用追问法找到真实的C。

结构化思维

1,结构:组成整体的各部分的搭配和安排(百度百科)

2,结构化分类的方法一:金字塔结构

  • 先明确分解目的,再找分解角度
  • 按MECE原则,分解问题
    • 自上而下,演绎法,按照不同类别逐层细分
    • 自下而上,归纳法,
      • 头脑风暴想出所有方法
      • 把方法归类,分组
      • 理顺关系,分层,去重补缺
  • 根据金字塔原则,给出解决方案

3,结构化分类的方法二:平面切割法

  • 两分法:将一个整体切割成对立又统一的两个部分
  • 三分法:就是在两分法的基础上增加过渡状态
  • 例子:时间管理矩阵,波士顿矩阵,SWOT分析,九宫格,商业模型画布,
  • 个人感受,一维数轴,二维坐标系,都是这样的平面模型

系统化思维

1,系统的概念

  • 系统包括:要素(组成部分),关系,功能,环境

  • 系统性思维:关注要素、关系、整体、外部,关注动态

2,三种基本反馈:正反馈,负反馈,延时;两种基本回路:增强回路,调解回路

3,两种结构:增长上限模型(例如:养鸡场案例),舍本逐末(例如:兼职案例)

我的体会

1,需要不停获取知识,这个就是努力

2,要分类整理下来,要建立联系,要能够理解后,清晰解释讲出来

3,从问题开始。从概念入手,然后再到规律,再到方法论,然后就是利用方法论解决问题。

4,听上去能懂,实际动手时,会有想不到,可能需要刻意练习。至少这个知乎的课程需要反复听几遍。

js的构建,真是让人烦死了。概念层出不穷,实现方法变化多样,而且所有这些东西,都是因为js出生的时候给他的定位,和现在js的任务完全不一样,每项工具,每个知识点,都是为了给他自身打补丁而生的。当然也可以看做是js是个能自我演进的工具。

js现在也需要进行构建,我理解就是把多个js代码合并成一个大文件,然后浏览器加载,并在客户端解释。

1,Node,npm

wiki上说Node最初发布于2009,在V8 chrome内核上封装了消息机制,异步IO等功能,可以让js在服务端运行。V8最早是在2008年发布。那个时候也是iOS,Android刚刚开始流行的时候。

1
2
3
npm init -y
npm install <name> // 安装一个包
npm run <command> // 运行package.json里面的一段shell命令

Node.js文档

npm CLI

2,ES6和模块化

js的es6就是出了一大堆新语法,由浏览器支持js可以实现的新功能。本来是让工具更好用,但是明显增加了很多学习成本。

模块化,js以文件为模块,形成依赖关系,依次加载。这对于C语言来说,这是非常简单的事情,怎么到了js变得这么复杂,事情本身不复杂,但是需要若干工具配合才能完成这件事情,每个工具有一大套配置方法,使用规则。

{ xxx } from module``` 就是各个浏览器要支持的es6的语法,但是现在要转成es5,避免webapp在某些浏览器中不能运行。
1
2
3
4
5
6
7

#### 3,browserify

可以按照node的require的语法,把依赖的每个package打包成一个js

```shell
browserify robot.js > bundle.js // 命令行方式
1
2
var browserify = require('browserify');      //node api方式
var bundle = browserify('./app.js').bundle()

browserify大部分被webpack代替

gulp中使用browserify

4,gulp

任务自动化的工具。通过在项目根目录的 gulpfile.js文件,执行任务

1
2
3
4
5
6
7
8
9
10
11
12
// 代码示例
gulp.task(
'build-js',
gulp.parallel('build-vendor-js', () => {
return Promise.all(
appBundleConfigs.map(config => {
return createBundle(config);
})
);
})
);

5,Babel

Babel是js编译器,可以把所有新语法特性的js转换为es5的语法。

1
./node_modules/.bin/babel src --out-dir lib  #命令行方式

API方式

1
2
3
const babel = require("@babel/core");

babel.transformSync("code", optionsObject);

配置文件.babelrc

Babel文档

javascript最初是没有类、没有模块,且是单线程,大量通过callback方式处理异步。

我感觉乱的地方

  1. 函数可以作为一个变量,能做函数参数,也能作为函数返回值,也能作为对象的属性,变成对象的方法
  2. 对象实例创建的非常简单,就是用个{}就可以,所谓字面量声明。不用先声明类,然后new,最后还得delete
  3. 对象可以任意添加属性
  4. 函数返回的对象,可以直接调用。函数返回的函数可以直接执行
  5. 模块化,各种模块加载协议、方式
  6. 各种生态工具:node,npm,gulp,browserify,babel,webpack,minify
  7. HTML5的新用法,web worker,web component
  8. HTML DOM的接口、事件、各种API,参数接口
  9. 因为是解释性语言,可以对代码的文本做很多扩展,比如JSX
  10. 复杂的异步转同步,Promise,async/await
  11. 继承通过原型链
  12. 作用域靠闭包
  13. this指针可以指定
  14. 很多便利性的语法。比如可以把函数代码写在一个数组中,作为数组元素之一.
  15. 各种灵活性的语法,箭头函数,对象方法
  16. 兼容各种浏览器

知识零碎散乱,不成体系,且变化快。没办法,先学着吧

装饰器,参考文档https://realpython.com/primer-on-python-decorators

Function函数

  • 函数也是object,可以作为参数传递
  • 函数内部还可以定义函数
  • 函数可以作为返回值,传递出去

简单Decorator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def my_decorator(func):
def wrapper(): # 函数内部的函数
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper #函数作为返回值

def say_whee():
print("Whee!")

say_whee = my_decorator(say_whee) #函数作为参数

#python decorator语法糖写法
@my_decorator
def say_whee():
print("Whee!")

decorator包住一个函数,让函数增加新的功能。

原文中包含很多实际例子非常好,计时,调试,限速,注册插件。

类Decorator

@classmethod, @staticmethod, and @property都属于内置decorator。

decorator也可以嵌套

say_whee = my_decorator(say_whee)用decorator把原来的函数,添加功能后,变成了新的函数,只是名字还叫原来的函数。新函数是decorator的内置函数。decorator也是个函数。

python提供语法@decorator就可以实现decorator。

通过这样的python特性,可以实现不修改原来代码的情况下,修改功能。

列表List

1
2
3
squares = []
for i in range(10):
squares.append(i*i)

list comprehension

1
2
squares = [i * i for i in range(10)]

new_list = [expression for member in iterable (if conditional) ]

带条件的list comprehension可以实现map(), filter()的功能

如果不是简单过滤,而是要改变某类值,可以把条件放到前面

new_list = [expression (if conditional) for member in iterable]

词典Dict

定义dict

1
2
3
4
5
6
7
8
d = {
<key>: <value>,
<key>: <value>,
.
.
.
<key>: <value>
}

操作dict

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
#读取
d[key1]

#添加&修改
d[key2]

#删除
del d[key]

#读取
d.get(key1,defaultValue) #可以带默认值,避免raise error

#返回list形式的key-value pair
d.items()

#返回key的列表
d.keys()

#返回values列表
d.values()

#返回值,并删除此项
d.pop(item, defaultValue)

#合并且更新
d.update(d1)

工厂方法Factory Method这个我曾经尝试用过,就是定义一个虚基类,然后定义几个纯虚接口,然后通过if/else来把对应的子类new 出来,然后就开始工作。感觉用处不大,主要是是很多时候其实需求不会增加这么多,我也觉得奇怪,为啥别人的代码都能自我扩展,而我写的东西总是就不能长大呢。这次参考The Factory Method Pattern and Its Implementation in Python重新学一下这个模式。

工厂方法是创建型设计模式,用来创建通用接口的具体实现。

避免大幅的if/elif/else这样的面条代码。(这里我又不同意见,首先你这个接口得能够抽象的出来,其次为了实现这种模式,额外代码也有成本)

总体想法:当一个调用方依赖一个接口去执行一个任务,根据不同参数,有不同的任务实现。自己开发中其实很少用到,但是很多框架代码是用到的,为了能看懂代码,所以必须学会这个模式。

使用Factory Method的场景,替换复杂逻辑代码(大量if/elif/else这样的逻辑),从外部数据创建创建对象,支持某个feature的不同实现,整合相似特性在相同的接口下,整合外部相关服务。

阅读全文 »

python 代码通过模块化的方式组织,modules和package就是基本单元,也是为了代码简单,可重用,可维护

阅读全文 »

商业分析

  1. 如何识别创业机会

产品设计

产品分析
UI设计

软件知识

AI算法
软件工程&架构
开发语言&开发框架&库:
工具链
  • Python

    1. Pyenv
    2. tox
  • Javascript

    1. Node

      1
      const entryPath = require.resolve('../');这里的resolve可以通过package.json中main取得打包后的js的路径和文件名
    2. gulp & Babel

    3. Webpack

中间件
  • Web服务:Nginx
  • 缓存系统:Redis、memcache
  • 数据库系统:Mysql、MongoDB、PostregSQL
  • 容器:docker,k8s
  • 搜索:
  • 消息队列:
系统软件:
  • 操作系统,Linux

    1. linux各种命令,
    2. 各种配置,
  • 数据结构+算法

  • 编译原理

  • 网络协议

硬件

CPU,内存,磁盘,网络

基础知识

数字电路,模拟电路,电路原理

半导体,物理,数学

TL;DR

支持STM32H7芯片的st-link已经修改好,放到我的github 上了(st-link已经禁止外人提交PR了)。这个是在1.6.1的版本基础是进行的修改,供大家参考,欢迎拍砖批评。当然代码中还有些问题,比如只使用了一个Bank,超过1M的bin文件会出问题,但目前至少能使用,其他后续再改。

背景

因为看上STM32H7的高性价比,所以买来一块正点原子的核心板学习一下。ST官方文档中宣称STM32H743的JPEG(640*480)压缩能力能达到16fps,在考虑用H743准备做一个低成本的Camera。

然而调试却不是那么顺利。我平时烧录和调试都用的是st-link,但是st-link不支持STM32H7系列的芯片!

搜到st-link的相关issue:STM32H7xx support,发现这个问题从2018年2月就有人提,到现在2年多还没解决。st-link官方推荐去使用openocd去烧录h7系列??给竞对送用户,我看他们是不想干了吧。

无奈,只好下载openocd去烧录,我对openocd不熟,而且他也很复杂,烧录的程序貌似有问题,而且又烧录几次后,板子不亮了,没有反应了,提示openocd halt Handler HardFault。我以为板子被烧坏了。

阅读全文 »

STM32中有10几个定时器,工作原理很好理解。就是Enable某个定时器,然后对他ARR(auto-reload register)赋值,定时就会根据CLK信号,对计数寄存器做加法,如果加到了ARR中指定的值,则发出中断,CPU就是中断响应处理。

这个定个闹钟,早上闹钟响了,我就开始起床刷牙洗脸,原理上差不多。

但是STM32的timer的计时不是人类的时间,而是对应的CLK时钟信号。大多数是对应APB1的clock时钟,具体需要到数据手册中查看。

如果单单是定时,其实就没必要设置这么多个Timer了。STM32利用GPIO端口结合定时器,可以实现输入捕获,和输出比较。输出比较就是产生PWM脉冲。

PWM可以实现DAC转换,可以驱动电机。电动机可以利用PWM来控制转速。

舵机会指定一个高电平的时间范围,对应着舵机的转动角度,这里通过简单计算就可以把角度和Timer的CCR寄存器的值对应起来。这样改变CCR,就能改变舵机角度。

这里需要制定Timer的channel,就是占用哪一个GPIO口,把这个口接出来就变成了舵机的信号线。

STM32还有很多定时器模式,参数可选,在CubeMX中配置一下即可,使用还是很方便的。

0%