lcofjp 程序员,电子爱好者。

关键字,字符串和其他文本值

关键字:

none,normal,red等等,统一关键字在不同属性中含义可能不同,例如letter-spacingfont-style中的normal就不是一个意思。

全局关键字:

  1. inherit: 继承父元素的属性值,有些属性是默认继承父元素的,有些属性默认是不继承的。
  2. initial: 设置成为默认的初始化值,有些属性有默认值,有些属性的默认值由用户代理决定。
  3. unset: 如果这个属性默认是可继承的,则相当于inherit,否则,相当于设置成initial。
    注:Opera Mini 和 <IE11不支持这些关键字

这些关键字可用于所有属性,但是有一个特殊的属性只接受这三个全局关键字:all

all代表除了directionunicode-bidi之外的所有属性,因此,如果你在一个元素上声明了all: inherit,那么就设置了除了directionunicode-bidi之外的所有属性继承其父元素的属性值,例如:

section {color: white; background: black; font-weight: bold;}
#example {all: inherit;}
<section>
  <div id="example">this is a div.</div>
</section>

div不仅继承了section的color,background和font-weight,它继承了section的全部属性值(除去两个例外),或许这正是你想要的,但是如果你仅仅是想继承那些指定的属性,那么还是需要手动指定:

section {color: white; background: black; font-weight: bold;}
#example {color: inherit; background: inherit; font-weight: inherit;}

字符串 Strings

字符串是由单引号或者双引号包裹的任意字符序列,用表示。如果字符串中包含'或者",则需要用不同的引号或者使用转义:

"I've always liked to play with strings."
"It's been said that \"haste makes waste.\""

如果字符串太长在书写的时候需要换行,则需要对换行进行转义,css会去掉这个换行:

"this is the right place \
for a newline."
"this is the right place for a newline."

如果真的需要的字符串中插入换行符,可以在需要换行的地方插入一个Unicode转移符\A

"this is a better place \Afor a newline."

URLs

URL的定义方式:

url(protocol://server/pathname)
url(pathname)

其中括号内的地址可以是绝对的URL地址,也可以是相对的本域名的路径,相对路径是相对于引用其他文件的css文件,而不是html文件。 url与括号之间不能包含空格

body {background: url(http://www.pix.web/picture1.jpg);} /* correct */
body {background: url (images/picture2.jpg);} /* INCORRECT */

图像 Images

图像值用于引用图像,语法表达式为. 通常的就是一个,具体可取以下值:

  • <url>: 引用外部资源的URL标识符,这这里就是图片的URL地址
  • <image-set>: 一组图片,根据条件使用里面的资源,例如一个image-set()可能指定了一个大图片用于桌面布局和一个小图片用于移动端布局,实现接近于picture元素的srcset属性的功能。
  • <gradient>: 指线性或者径向渐变图像,可以是单一的或者重复的。

标识符 Identifiers

有些属性接收用户自定义的某种标识符值,最常见的例子就是生成列表的计数器。其语法表达式为<identifier>,标识符是区分大小写的单词,因此myI

非运行状态分类:

  1. Blocked State,阻塞状态,等待两种类型的事件:
    1. 时间相关事件,延时超时或者到达某个绝对的时间,例如vTaskDelay()
    2. 同步事件,事件由其他任务或者中断产生,例如任务进入阻塞状态等待数据的产生
  2. Suspended State,挂起状态,不常用的状态,通过vTaskSuspend() API进入,通过vTaskResume() 或者 xTaskResumeFromISR() API退出状态
  3. Ready State,没阻塞也没挂起,随时可以运行

xLastWakeTime = xTaskGetTickCount();

vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(250));

BOOKS

  1. Pro CSS3 Layout Techniques

标准

  1. CSS3 Multi-column Layout Module
  2. CSS3 选择符

工具

  1. Modernizr
  2. Autoprefixer

网站

  1. CSS-Tricks

Properties:

  • overflow-wrap/word-wrap: word-wrap是IE的非正式的属性,标准化后命名为overflow-wrap。这个属性有两个主要属性:
    1. normal, 禁止拆分单词进行换行。如果单词显示超过边界,则另起一行进行显示,如果另起一行也不能显示,则单词溢出。
    2. break-word, 单词遇到超出边界则另起一行,如果一整行都不能显示,则把单词进行拆分后换行。
  • word-break: 设置当单词遇到父元素边界时,是否拆分单词进行换行。这个属性的优先级高于overflow-wrap,主要属性值包括:
    1. normal, 英文单词不会被拆分,相关行为见overflow-wrap。
    2. break-all, 英文单词遇到边界溢出则被拆分换行。
    3. keep-all, 中英文都不会被拆分,尤其中文字间不会自动换行。
  • white-space: 处理空白字符的方式,主要取值有三个:
    1. normal, 连续出现的空白字符被合并为1个空白字符,换行也被当做空格。
    2. pre, 保留所有空白字符的原始显示方式,连续出现的空白符不被合并,换行符就是换行符,与<pre>类同。
    3. nowrap, 合并连续的空白符,换行被当做空格。遇到父元素边界不进行换行。
  • text-overflow: 文字溢出父元素边界时的表现,此属性起作用的前提是,元素同时设置了white-space: nowrap; overflow: hidden; 改属性的主要取值如下:
    1. clip, 裁切掉溢出的部分
    2. ellipsis, 当有文字溢出时,在文字末尾显示...,并裁切掉溢出部分。
    3. <string>, 与ellipsis类似,但是显示指定的字符串

git init:初始化git文档库

git add poem.txt: 把poem.txt准备放入文档库

git commit -m '操作备注‘ --author='姓名 邮箱': 提交到文档库。

如果提交之后想修改操作备注和操作者资料,可以:git commit --amend -m '新的操作备注' --author='新的作者信息'

git add命令后面可以使用通配符*,文件目录,或者“.", 点表示当前整个的文件夹及其子文件夹。

查询每行的最后修改者:

  • git blame -L 文件名
  • git blame -L 起始行,结束行 文件名

git mv: 改变文件或者文件夹的名称:

git mv 原文件名 新文件名, 这个指令会更改文件名或者文件夹名,然后把它记录在Git索引,接着执行git commit命令即可更新到文档库

git show HEAD, HEAD可简写为@

git show commit节点:文件名: 查看特定文件的变化

恢复到指定节点

git reset 选项 commit节点标识符或标签

选项:

  • --soft 只有文档库改变,索引和磁盘文件不变
  • --mixed [默认] 文档库以及索引被改变,文件不变
  • --hard 全部都恢复到指定节点的状态
自定义节点标签

git tag 自定义的标签名称 commit节点标识符或标签

删除自定义标签

git tag -d commit节点标签

查看commit节点信息

git log--graph选项:文本模式显示commit演进图, 加--online选项:用最简便的方式显示演进图

比较

比较:指定文件名则比较指定文件,不指定文件名或使用"."则比较所有文件

  1. git diff 文件名: 文件与索引比较(当索引与文档库不同)或与文档库比较(当前的索引与文档库相同)
  2. git diff commit节点1 commit节点2: 比较文档库的两个节点
  3. git diff --cached 文件名: 索引与文档库比较
  4. git diff commit节点 文件名: 文件与某节点比较
  5. git diff --no-index 文件1 文件2: 两个文件比较

取出文档库中的代码 checkout

git checkout commit节点标识符或标签 文件1 文件2 ...: 在指定节点取出文件内容。如果没指定节点,则先从索引中取,如果索引中没有,则到最新的节点中去取,最新的节点没有就去老的节点找

帮助:git xxx --help / git help -a

选取文档元素

  • 通过ID选取元素document.getElementById('id');
    在低于IE8版本的浏览器中,getElementById()对匹配元素的ID不区分大小写,而且也返回匹配name属性的元素
  • 通过name属性选取元素document.getElementByName('name-prop'); => NodeList
    name属性通常用于表单、表单元素、<iframe>和<img>,具有name属性的元素可能不唯一。
    在IE中,getElementByName()也返回id属性匹配指定值的元素。为了兼容,应该小心谨慎,不要将同样的字符串同时用作name和id。
  • 通过标签名选取元素(document|element).getElementsByTagName("p"); => NodeList
    标签名不区分大小写
    节点列表和HTML集合

    getElementByName()和getElementByTagName()都返回NodeList对象,而类似于document.forms的属性为HTMLCollection对象。

    这些对象都是只读的数组对象,他们有length属性,可以像数组一样索引。

    这两个对象是实时反映文档变化的,在迭代更改NodeList对象时,最好先生成一个静态的副本:var snapshot = Array.prototype.slice.call(nodelist, 0);

  • 通过CSS类来选取元素(document|element).getElementByClassName('class1 class2'); => 实时NodeList
    该函数的参数是一个字符串,其中可以包含多个由空格分隔的标识符组成,只有当元素的class属性值包含所有指定的标识符时才匹配,但是标识符的顺序是无关紧要的
    注:IE8及更低版本不支持此函数
  • 通过CSS选择器选取元素
    1. querySelectorAll('selector'); => 非实时NodeList
    2. querySelector('selector'); => element/null
      参考链接:CSS3选择器规范选择器API

文档结构和遍历

  • 作为节点数的文档

    Document对象、Element对象和文档中表示文本的Text对象都是Node对象。Node定义了以下重要属性:
    • parentNode
    • childNodes (NodeList对象)
    • firstChild, lastChild
    • nextSibling, previoursSibling
    • nodeType [9: Document, 1: Element, 3: Text, 8: Comment, 11: DocumentFragment]
    • nodeValue: Text节点或者Comment节点的文本内容
    • nodeName:元素的标签名,以大写形式表示
      例:document.childNodes[0].childNoes[1] === document.firstChild.firstChild.nextSibling
  • 作为元素树的文档

    将文档看作是Element对象树,忽略部分文档:Text和Comment节点。 基于元素的文档遍历属性:
    • firstElementChild, lastElementChild
    • nextElementSibling, previousElementSibling
    • childElementCount (===children.length)
    • children (非标准属性)
      参考链接:文档元素遍历


  1. 创建工程:mbed new your-app-name,这一步要执行一段时间,需要从github上下载最新mbed-os系统和库文件
  2. 新建源文件main.cpp,注意是cpp文件,否则编译会报错,并编辑: cd your-app-name, vim main.cpp
  3. 编译:$ mbed compile -t ARM -m K64F,其中-t是指定工具链,可选的有ARM,GCC_ARM,IAR, -m是你所使用的电路板,查询mbed支持的电路板使用命令:mbed compile -S
  4. 将生成的bin文件拖拽到mbed磁盘,即可运行。

mbed driver API参考:https://os.mbed.com/docs/v5.6/reference/drivers-overview.html

Git项目中的文件和文件夹被分为三类:

  1. 被追踪的(tracked)
  2. 忽略的(ignored)
  3. 不被追踪的(untracked)

一开始的时候,所有的文件都是不被追踪的

  • 删除索引以及文档库中文件,使文件由tracked变为untracked

git rm --cached filename

  • 删除文件并把该文件在索引以及文档库中标记为删除,在commit之后真正删除:

git rm filename

.gitignore文件,可使用*通配符,#开头的是注释,!表示排除,示例:

*.txt
#设置不要忽略note.txt文件
!note.txt
#下面的设置表示忽略整个dxx目录
dxx/
#下面的设置表示忽略目录里面的内容但保留该目录
dir/**
Git的三个配置文件
1~3优先级从高到底 对应选项
1. 文件夹中.git子文件夹内的config文件
2. 登录账号的home directory中的.gitconfig文件 --global
3. Git程序的安装文件夹中的etc/gitconfig文件 --system
  • 设置用户名和邮箱:

git config [--global] user.name 'name'

git config [--global] user.email 'email'

可加--global或者--system指定配置的存储位置,如果不指定则存储在当前的文档库中。

  • 删除配置文件中设置项,使用--unset选项

git config --unset user.name

*可根据配置的存储位置,加入--global或--system选项

  • 配置指令别名

git config [--global|--system] alias.指令别名 '正式的指令和选项'

git config alias.con 'config -l'

git con

  • 删除指令别名:

git config --unset alias.con

从0创建代码库:

git clone git@bitbucket.org:lcofjp/xxx.git
cd miscell
echo "# My project's README" >> README.md
git add README.md
git commit -m "Initial commit"
git push -u origin master

从已有的代码库上传到bitbucket:

Step 1: Switch to your repository's directory

cd /path/to/your/repo

Step 2: Connect your existing repository to Bitbucket

git remote add origin ssh://git@bitbucket.org/lcofjp/xxx.git
git push -u origin master

组合继承(combination inheritance),有时候也叫做伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能保证每个实例都有他自己的属性。下面来看一个例子:

function SuperType(name) {
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
  alert(this.name);
};
function SubType(name, age) {
  //继承属性
  SuperType.call(this, name);
  this.age = age;
}
//继承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() {
  alert(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
alert(instance1.colors);
instance1.sayName();
instance1.sayAge();

var instance2 = new SubType("Greg", 27);
alert(instance2.colors);
instance2.sayName();
instance2.sayAge();

C++语言特性直接支持四种程序设计风格:

  • 过程式程序设计
  • 数据抽象
  • 面向对象程序设计
  • 泛型程序设计

但是,重点不在于对单个程序设计风格的支持,而在于有效地组合它们。对于大多数非平凡的问题而言,最好的(最易维护的、最易读的、最小的、最快的,等等)解决方案通常是这些风格某些方面的组合。

就像计算机领域里的很多重要术语一样,这些术语也有五花八门的叫法流行于计算机业界和学术界的不同领域。例如,我称为“程序设计风格”,其他人可能称之为“程序设计技术”或“范型”。而我更喜欢用“程序设计技术”表示那些特定语言相关的更具体内容。我理想中的语言特性应该能优雅地组合使用,来支持连续统一的程序设计风格和各种各样的程序设计技术。

  • 过程式程序设计:这种风格专注于处理和设计恰当的数据结构。支持这种风格也是C语言(以及Algol、Fortran和很多其他语言)的设计目标。C++对这种风格的支持体现为内置类型、运算符、语句、函数、struct和union等特性。除少数例外,C可以看作C++的子集。与C相比,C++对过程式程序设计的支持更强,这体现在很多额外的语言特性和一个更严格、更灵活且对过程式编程支持更好的类型系统。
  • 数据抽象:这种风格专注于接口的设计以及一般实现细节的隐藏和特殊的表示方式。C++支持具体类和抽象类。一些语言特性可直接用来定义具有私有实现细节、构造函数和析构函数以及相关操作的类。而抽象类则为完全的数据隐藏提供了直接支持。
  • 面向对象程序设计:这种风格专注于类层次的设计、实现和使用。除了允许定义类框架之外,C++还提供了各种各样的特性来支持类框架中的导航以及简化由已有的类来定义新的类。类层次提供了运行时多态和封装机制。
  • 泛型程序设计:这种风格专注于通用算法的设计、实现和使用。在这里,“通用”的含义是,一个算法可以设计成能处理多种类型,只要这些类型满足算法对其实参的要求即可。C++支持泛型编程的主要特性是模板。模板提供了(运行时)参数多态。

【摘自《C++程序设计语言》】

概念1. 变量的作用域

作用域定义了变量的可见性,共有四种作用域:

  1. 函数作用域:只有一种情况,就是函数内的标号,goto语句使用的那个标号,它具有函数作用域,如果在函数内有一个标号,则在整个函数的任何位置都可以访问。(这个与变量的讨论无关)。
  2. 文件作用域:如果一个变量的声明不在任何块以及函数参数列表内,则该变量具有文件作用域。
  3. 块作用域:如果一个变量声明在块内或者声明在函数定义的参数列表中,则该变量具有块作用域。
  4. 函数原型作用域:函数声明的参数列表中的变量声明,具有函数原型作用域。

概念2. 变量的连接类型

在同一个作用域或者不同作用域对一个变量的多次声明被引用到同一变量的过程叫做连接。连接分为三类:

  1. 内部连接:变量声明具有文件作用域且由static存储类型修饰的变量为内部连接类型。
  2. 外部连接:变量声明具有文件作用域并且没有static存储类型修饰,则该变量为外部连接。
  3. 没有连接:函数的参数;块作用域中未用extern存储修饰符的变量 使用extern修饰的变量声明,如果此声明之前有对此变量的声明,则其连接方式与前一个声明相同,如果此声明前没有此变量的其他声明,则此声明为外部连接。 内部连接可以连接到翻译单元内部(相当于同一个源文件内)的变量,外部连接可以连接到整个工程的所有翻译单元以及库中的变量。 如果一个变量没有连接,则在同一个作用域或者命名空间中对此变量的声明不能超过1次。(此规则可以解释局部变量的声明不能多于1个,局部变量没有连接功能,所以多个声明是非法的)

概念3. 外部定义

在函数外面的声明(具有文件作用域)叫做外部声明。

包含初始化的外部声明叫做外部定义。(由此可得出外部定义是外部声明的子集)

外部定义最多只能有一个。

如果一个变量声明具有文件作用域且未被初始化,且未使用存储修饰符或者使用static修饰符,则该声明为不确定的定义(tentative definition) 如果一个翻译单元包含一个或者多个不确定的定义,并且不包该变量的外部定义,则其行为相当于在翻译单元的结尾增加了一个具有文件作用域的相应的类型的并且初始化为0的变量声明。

在同一个作用域内对同一个变量的声明必须具有兼容的数据类型: 假定unsigned char与uint8_t类型是兼容的则:

unsigned char a; 
uint8_t a; //合法 
int b; 
double b; //不合法
int i1 = 1; // definition, external linkage
static int i2 = 2; // definition, internal linkage
extern int i3 = 3; // definition, external linkage
int i4; // tentative definition, external linkage
static int i5; // tentative definition, internal linkage
int i1; // valid tentative definition, refers to pre vious
int i2; // 6.2.2 renders undefined, linkage disagreement
int i3; // valid tentative definition, refers to pre vious
int i4; // valid tentative definition, refers to pre vious
int i5; // 6.2.2 renders undefined, linkage disagreement
extern int i1; // refers to pre vious, whose linkage is external
extern int i2; // refers to pre vious, whose linkage is internal
extern int i3; // refers to pre vious, whose linkage is external
extern int i4; // refers to pre vious, whose linkage is external
extern int i5; // refers to pre vious, whose linkage is internal