0%

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
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的不同实现,整合相似特性在相同的接口下,整合外部相关服务。

Read more »

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

Read more »

商业分析

  1. 如何识别创业机会

产品设计

产品分析
UI设计

软件知识

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

    1. Python语言特性
      1. Python import

      2. Python的List和Dict

      3. Python Decorator

      4. 版本管理

        1. pyenv install 3.6.1
          pyenv local 3.6.1 && python -V
          
          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
            2. Flask开发框架
          1.

          * Javascript

          1. JSX
          2. async/await

          ```js
          async/await`为`Promise`的语法糖
          文中会直接使用`async/await`替换`Promise
          let result = await func()
          // => 等价于
          func().then(result => {
          // code here
          })

          // ======

          async function func () {
          return 1
          }
          // => 等价与
          function func () {
          return new Promise(resolve => resolve(1))
          }
  • HTML&CSS

    1. Web Compoment

      https://www.ruanyifeng.com/blog/2019/08/web_components.html

    2. Web 事件, stopPropagation

  • Shell

  • Java

  • C/C++

  • iOS

  • Android

工具链
  • 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。我以为板子被烧坏了。

Read more »

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中配置一下即可,使用还是很方便的。

NVIC

中断就是一种监听方式,响应外部事件

10个内核中断,剩下的是外部中断

抢占优先级,相应优先级

HAL_NVIC_SetPriorityGrouping

IP

IO外部中断

16根外部中断线

EXTI寄存器配置IO口,最多还是16个外部中断,

7个中断服务函数,有公用的

好弱的中断回调处理方式

通过设置触发方式,来决定是普通IO,还是中断响应口

为什么有时钟?

时钟发出时序信号,数据和指令才能才CPU内部流动执行。

任何复杂的东西都是由简单的东西组成的,所以不必害怕,逐一拆解

时钟树

STM32五大时钟源:HSI,HSE,LSI,LSE,PLL

任何一种外设使用前,必先使能其时钟。每种外设在数据通信时都需要时钟,这些时钟都是通过5个主要的源,通过各种分频,倍频,最后得到一个能用的时钟信号。

Systick

内部精准永不停歇的计时器,用于OS。

Systick = 25MHz * N/ (M*P)=25MHz * 432 / ( 25 * 2 ) = 216MHz

频率越高,耗电越高,所以尽可能的降低频率。

外设时钟

外设时钟从Sysclock分频得来,54M,或者108M,然后再根据计数值,产生各种中断。

两种总线

AHB=Advanced High Performance Bus,译作高级高性能总线。如同USB(Universal Serial Bus)一样,也是一种总线接口。AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接

APB(Advanced Peripheral Bus)外围总线。APB主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥

遗漏问题

分频是什么?

PLL是什么?锁相环怎么倍频的?

晶振振荡电路原理?

调压系数

Over-drive