安装 pip install PyQt5-tools 命令执行后会自动安装 PyQt5-sip PyQt5-tools pyqt5 等库。 PyQt5-tools 包含了 designer.exe 等工具。 SIP 库的作用是为 C 和 C++ 库创建 Python 绑定。 配置 PyCharm 菜单 Settings => Tools => External Too...
分类 软件开发 下的文章
使用 pyinstaller 打包程序为单 exe 应用
一般的程序打包: pyinstaller -F main.py 如果包含 html、js 等文件需要特别处理一下。 待打包示例源代码 main.py: #!/usr/bin/python # -*- coding: UTF-8 -*- # 生成资源文件目录访问路径 def resource_path(relative_path): if getattr(sys, 'frozen', False): # 是否Bundle Resource base_path = sys._MEIPASS else: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) filename = resource_path(os.path.join("web", "mesh.html")) # 访问 html 文件用 filename 就可以了 print(filename) 打包文件: 首先生成 spec 文件: pyi-makespec -F main.py 会生成 main.spec 文件,编辑它: datas 添加 ('web', 'web'),web 文件夹存放了 html、js 等文件,这个文件夹会被打包进去。 # -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['main.py'], pathex=['E:\\projects\\python\\test'], binaries=[], datas=[('web', 'web')], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True ) 开始打包: pyinstaller -F main.spe...
Python 数据类型与条件运算笔记
数据类型 整数、浮点数、字符串(单引号、双引号、三引号、r 标记)、布尔值(True、False)、空值(None)、列表、字典、集合、用户自定义数据类型 字符串 字符串的单引号、双引号基本没有区别。 str 在内存中是用 Unicode 编码的 str 与 bytes 转换 用 ecode() 方法转换为 bytes,用 decode() 方法从 bytes 转换为 str >>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文' 注意 b 前缀(表示 bytes)的用法 函数方法 ord():获取字符的整数表示 chr():把编码转换为对应的字符 len():获取字符串长度 >>> len('中文') 2 >>> len(b'\xe4\xb8\xad\xe6\x96\x87') 6 >>> len('中文'.encode('utf-8')) 6 字符串格式化 %d、%f、%s、%x >>> 'Hi, %s, you have $%d.' % ('Michael', 1000000) 'Hi, Michael, you have $1000000.' >>> '%2d-%02d' % (3, 1) ' 3-01' >>> '%.2f' % 3.1415926 '3.14' >>> 'Age: %s. Gender: %s' % (25, True) 'Age: 25. Gender: True'(注:%s会把任何数据类型转换为字符串) 列表(list) list 是一种有序的集合,可以随时添加和删除其中的元素。 >>> classmates = ['Michael', 'Bob', 'Tracy'] >>> classmates ['Michael', 'Bob', 'Tracy'] >>> len(classmates)(注:元素个数) 3 >>> classmates[0] 'Michael' >>> classmates[1] 'Bob' >>> classmates[-1](注:倒数第一个元素) 'Tracy' >>> classmates[-2] 'Bob' >>> classmates.append('Adam') (注:追加元素到末尾) >>> classmates ['Michael', 'Bob', 'Tracy', 'Adam'] >>> classmates.insert(1, 'Jack')(注:追加元素到某序号之后) >>> classmates ['Michael', 'Jack', 'Bob', 'Tracy', 'Adam'] >>> classmates.pop()(注:弹出末尾元素,不要与队列混淆,况且也没有push方法) 'Adam' >>> classmates ['Michael', 'Jack', 'Bob', 'Tracy'] >>> classmates.pop(1)(注:弹出指定序号元素) 'Jack' >>> classmates ['Michael', 'Bob', 'Tracy'] >>> classmates[1] = 'Sarah'(注:直接给某元素赋值) >>> classmates ['Michael', 'Sarah', 'Tracy'] list 里面的元素的数据类型也可以不同 >>> L = ['Apple', 123, True] list 元素也可以是另一个 list >>> s = ['python', 'java', ['asp', 'php'], 'scheme'] >>> len(s) 4 >>> s[2][1] 'php' 元组(tuple) tuple 和 list 非常类似,但是 tuple 一旦初始化就不能修改,所以,自然也没有 append()、insert() 这样的方法。 可以近似地理解为常量数组。 >>> classmates = ('Michael', 'Bob', 'Tracy') >>> classmates ('Michael', 'Bob', 'Tracy') 只有 1 个元素的 tuple 定义时必须加一个逗号,,来消除歧义: >>> t = (1) >>> t(注:此时t的值是整型数值1,而不是一个元组) 1 >>> t = (1,) >>> t (1,) 字典(dict) 字典在其他语言中也称为 map,使用键-值(key-value)存储,具有极快的查找速度。 为什么 dict 查找速度这么快?因为 dict 的实现原理和查字典是一样的。假设字典包含了 1 万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在 list 中查找元素的方法,list 越大,查找越慢。另一种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。 >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d['Michael'] 95 >>> d['Adam'] = 67 (注:添加新键值对) >>> d {'Adam': 67, 'Tracy': 85, 'Michael': 95, 'Bob': 75} key 是否存在 >>> 'Thomas' in d False >>> d.get('Thomas') (注:返回None) >>> d.get('Thomas', -1) -1 弹出一个键值对(删除) >>> d.pop('Bob') 75 >>> d {'Adam': 67, 'Tracy': 85, 'Michael': 95} 集合(set) set 和 dict 类似,也是一组 key 的集合,但不存储 value。由于 key 不能重复,所以,在 set 中,没有重复的 key。这就是数学中集合的概念了。 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。 重复元素在 set 中自动被过滤: >>> s = set([1, 1, 2, 2, 3, 3]) >>> s {1, 2, 3} >>> s.add(4) >>> s {1, 2, 3, 4} >>> s.remove(4) (注:删除一个元素,不能使用pop(4)) >>> s {1, 2, 3} 两个集合的交集、并集运算 >>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 {2, 3} >>> s1 | s2 {1, 2, 3, 4} 条件运算 if ... elif ... else ... age = 3 if age >= 18: print('adult') elif age >= 6: print('teenager') else: print('kid') if x: (注:只要x是非零数值、非空字符串、非空list等,就判断为True) print('True') for x in ... sum = 0 for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: sum = sum + x print(sum) sum = 0 for x in range(1, 11): sum = sum + x print(sum) while ... sum = 0 n = 1 while n <= 10: sum = sum + n n += 1 print(sum...
QString 与 Qt 文字编码
Unicode Unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的 Unicode 字符分为 17 组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有 65536 个码位,共 1114112 个。 它是方案而不是实际的数据格式,或者说它是一项标准而不是具体编码。旧版本的 Windows 记事本另存中有 Unicode 选项,实际上这里的 Unicode 指的是 UTF-16,一些别的软件中也可能是 UCS-2。也许是微软意识到叫 Unicode 不合适,所以 Win10 中改成了 UTF-16。UTF-32、UTF-16 、UTF-8、UCS-2 等都是 Unicode 编码的实现形式。 UTF-8 UTF(Unicode Transformation Format),通用转换格式。UTF-8 是针对 Unicode 的一种可变长度字符编码。它可以用来表示 Unicode 标准中的任何字符。UTF-8 使用 1 ~ 4 字节为每个字符编码,1 字节的 UTF-8 字符与 ASCII(7 位)是兼容的。 UTF-8 编码规则:如果只有一个字节则其最高二进制位为 0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为 1 的个数决定了其编码的字节数,其余各字节均以 10 开头。 UTF-8 的编码方法决定了它是有字节序并且字节序是明确的。它是以字节为单位传输和处理的,所以不存在多字节数值大小端的问题。所以也就没有大小端的定义。因为是基于 8 位字节的,所以是 -8。 UTF-8 的特征决定了它适宜用于网络数据传输等业务(不用区分大小端字节序),不太适合做存储、字符串分析等(通过 UTF-8 的字节数不太容易得出实际的字符数量)。 UTF-16 UTF-16 比起 UTF-8,好处在于大部分字符都以固定长度的字节 (2 字节) 储存,但 UTF-16 却无法兼容于 ASCII 编码(因为 ASCII 也用两个字节)。在 Unicode 基本多文种平面定义的字符(无论是拉丁字母、汉字或其他文字或符号),一律使用 2 字节储存。而在辅助平面定义的字符,会以代理对(surrogate pair)的形式,以两个 2 字节的值来储存。所以 UTF-16 是两字节或 4 字节的。 UTF-16 与 UCS-2 的关系 UTF-16 可看成是 UCS-2 的父集。在基本多文种平面(Basic Multilingual Plane),UTF-16 与 UCS-2 是一致的,所以有的软件写的是 UCS-2,有的软件写的是 UTF-16,是一样的。但当引入辅助平面字符后,就称不一样了。 GB18030 兼容了 GBK、GB2312。 Latin1 Latin1 是 ISO-8859-1 的别名,有些环境下写作 Latin-1。ISO-8859-1 编码是单字节编码,向下兼容 ASCII,其编码范围是 0x00 - 0xFF,0x00 - 0x7F 之间完全和 ASCII 一致,0x80 - 0x9F 之间是控制字符,0xA0 - 0xFF 之间是文字符号。 QChar 封装了 16-bit Unicode 字符(UTF-16)。 QString 则是由 QChar 形成的字符串,所以 QString 所存储的字符串就是 UTF-16 编码的。 所以不要说某个 QString 字符串是 GBK 编码还是 UTF-8 编码,都不存在的,只能是 UTF-16 编码。 GBK 与 UTF-8 的转换只能在 QByteArray 之间转换,桥梁是 QString,而不是在 QString 之间转换。 小实验 QString str = "中文"; qDebug() << str; qDebug() << qstr2hex(str, true); //utf-16 4E 2D 65 87 qDebug() << str.toUtf8().toHex(' ').toUpper(); //utf-8 E4 B8 AD E6 96 87 qDebug() << str.toLatin1().toHex(' ').toUpper(); //非Latin1,输出“??” QTextCodec::setCodecForLocale(gbk); qDebug() << str.toLocal8Bit().toHex(' ').toUpper(); //GBK D6 D0 CE C4 QTextCodec::setCodecForLocale(utf8); qDebug() << str.toLocal8Bit().toHex(' ').toUpper(); //utf-8 E4 B8 AD E6 96 87 QTextCodec::setCodecForLocale(nullptr); qDebug() << str.toLocal8Bit().toHex(' ').toUpper(); //默认gbk D6 D0 CE C4 输出: "中文" "4E 2D 65 87" "E4 B8 AD E6 96 87" "3F 3F" "D6 D0 CE C4" "E4 B8 AD E6 96 87" "D6 D0 CE C4"...
TortoiseGit 合并过程
将本地的修改 Commit 后,push 到服务器时提示失败。这是可能是因为本地的版本落后于远程版本,服务器上的版本已经被别人抢先一步更新了。这个时候就要做一下合并操作了。所谓的合并可以是合并同一分支(比如上述往 master 分支)的不同版本,也可以是合并不同分支(比如要将 dev 分支合并到 master 分支),查看同一个文件不同版本间的差异并选择两者中的一种或发现新的问题作出新的改动,最后再 commit、push 的过程。 先 Pull,由于我们已经知道本地与服务器两个版本是不同的,所以已经预料到会有问题。 Pull 的时候会自动合并,由于 git 访问不了公司加了密的文件,所以文本文件被当成了二进制文件,自动合并不起作用,只能手动合并。不过即使能正常自动合并,也可能合并出错,毕竟机器还不能完全理解人的意图。 本地文件的图标也会发生变化,感叹号的文件就是有冲突的文件: 点击窗口或菜单中的 Resolve,开始解决冲突的过程。 弹出来冲突文件列表: 由于我使用了 Beyond Compare 做第三方比较/合并工具,所以双击文件就打开了 BC: 同时自动生成了三个文件(应该是 git 生成的,而不是 bc,用内置合并工具时也会生成这几个文件): 编辑器打开冲突文件 .gitignore,可以看到自动合并的痕迹: <<<<<<< HEAD 与 ======= 之间的内容是本地主分支上的内容,>>>>>>> c7877cc893ca1171b829ac7f48187a97befacfdd 是 远程主分支上最新版本 c7877 的内容。两个内容一样,都是相对于上一版本增加的内容。 BC 上面三列分别是 BASE、LOCAL、REMOTE,分别表示上一个版本(感觉可能是共同的祖先),本地版本,远程版本,这三个内容是只读的,改不了。下面的窗口是合并操作的输出,并不是工作区冲突的那个文件的实际内容。 把所有冲突解决掉,commit 然后 push 到服务器。 取消合并: 在 commit 前可以取消合并操作,以使工作区的文件退回到本地最新版本的状态。...
CSS 学习笔记
什么是 CSS CSS 是 Cascading Style Sheets(层叠样式表)的缩写,用于定义如何显示 HTML 中的元素。 如何理解“层叠” 当同一个 HTML 元素被不止一个样式定义时,会使用哪个样式呢? 一般而言,所有的样式会根据下面的规则层叠于一个新的虚拟样式表中: 浏览器缺省设置 外部样式表 引用外部样式表文件: <head> <link rel="stylesheet" type="text/css" href="mystyle.css" /> </head> 内部样式表 样式直接定义在 HTML 文档头部: <head> <style type="text/css"> hr {color: sienna;} p {margin-left: 20px;} body {background-image: url("images/back40.gif");} </style> </head> 内联样式 在元素标签内使用 style 属性定义样式: <p style="color: sienna; margin-left: 20px"> This is a paragraph </p> 按从上到下的顺序,优先级逐渐提升。 CSS 语法 CSS 的基本语法为:selector {property: value;} 在一条定义中,可以有多个选择器,选择器间用逗号隔开(选择器的分组);也可以有多条“属性-值”对,使用分号隔开。 h1,h2,h3,h4,h5,h6 { color: green; font-family: Times, "Times New Roman", serif; } CSS 选择器 id 选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式。id 选择器以 "#" 来定义。 <style type="text/css"> #red { color: red; } #green { color: green; } </style> <p id="red">这个段落是红色。</p> <p id="green">这个段落是绿色。</p> 派生选择器 派生选择器允许你根据文档的上下文关系来确定某个标签的样式。通过合理地使用派生选择器,我们可以使 HTML 代码变得更加整洁。例如下面的样式定义了 id="sidebar" 元素下的 p 元素的样式(注意使用了空格作为分隔符): #sidebar p { font-style: italic; text-align: right; margin-top: 0.5em; } 类选择器 类选择器以一个点号定义,类(class)与 id 的区别是,id 一般在 HTML 中的定义是唯一的。 <style type="text/css"> .center {text-align: center} </style> <h1 class="center"> This heading will be center-aligned </h1> <p class="center"> This paragraph will also be center-aligned. </p> 选择器列表 CSS 选择器用于选择要使用样式的网页元素。 选择器 实例 实例描述 .class .intro 选择 class="intro" 的所有元素 .class1.class2 .name1.name2 选择 class 属性中同时有 name1 和 name2 的所有元素 .class1 .class2 .name1 .name2 选择作为类名 name1 元素后代的所有类名 name2 元素 #id #firstname 选择 id="firstname" 的元素 * * 选择所有元素 element p 选择所有 <p> 元素 element.class p.intro 选择 class="intro" 的所有 <p> 元素 element,element div, p 选择所有 <div> 元素和所有 <p> 元素 element element div p 选择 <div> 元素内的所有 <p> 元素 element>element div > p 选择父元素是 <div> 的所有 <p> 元素 element+element div + p 选择紧跟 <div> 元素的首个 <p> 元素 element1~element2 p ~ ul 选择前面有 <p> 元素的每个 <ul> 元素 [attribute] [target] 选择带有 target 属性的所有元素 [attribute=value] [target=_blank] 选择带有 target="_blank" 属性的所有元素 [attribute~=value] [title~=flower] 选择 title 属性包含单词 "flower" 的所有元素 [attribute|=value] [lang|=en] 选择 lang 属性值以 "en" 开头的所有元素 [attribute^=value] a[href^="https"] 选择其 src 属性值以 "https" 开头的每个 <a> 元素 [attribute$=value] a[href$=".pdf"] 选择其 src 属性以 ".pdf" 结尾的所有 <a> 元素 [attribute*=value] a[href*="w3schools"] 选择其 href 属性值中包含 "w3schools" 子串的每个 <a> 元素 :active a:active 选择活动链接 ::after p::after 在每个 <p> 的内容之后插入内容 ::before p::before 在每个 <p> 的内容之前插入内容 :checked input:checked 选择每个被选中的 <input> 元素 :default input:default 选择默认的 <input> 元素 :disabled input:disabled 选择每个被禁用的 <input> 元素 :empty p:empty 选择没有子元素的每个 <p> 元素(包括文本节点) :enabled input:enabled 选择每个启用的 <input> 元素 :first-child p:first-child 选择属于父元素的第一个子元素的每个 <p> 元素 ::first-letter p::first-letter 选择每个 <p> 元素的首字母 ::first-line p::first-line 选择每个 <p> 元素的首行 :first-of-type p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素 :focus input:focus 选择获得焦点的 input 元素 :hover a:hover 选择鼠标指针位于其上的链接 :in-range input:in-range 选择其值在指定范围内的 input 元素 :indeterminate input:indeterminate 选择处于不确定状态的 input 元素 :invalid input:invalid 选择具有无效值的所有 input 元素 :lang(language) p:lang(it) 选择 lang 属性等于 "it"(意大利)的每个 <p> 元素 :last-child p:last-child 选择属于其父元素最后一个子元素每个 <p> 元素 :last-of-type p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素 :link a:link 选择所有未访问过的链接 :not(selector) :not(p) 选择非 <p> 元素的每个元素 :nth-child(n) p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素 :nth-last-child(n) p:nth-last-child(2) 同上,从最后一个子元素开始计数 :nth-last-of-type(n) p:nth-last-of-type(2) 选择属于其父元素第二个 <p> 元素的每个 <p> 元素 :nth-of-type(n) p:nth-of-type(2) 同上,但是从最后一个子元素开始计数 :only-of-type p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素 :only-child p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素 :optional input:optional 选择不带 "required" 属性的 input 元素 :out-of-range input:out-of-range 选择值超出指定范围的 input 元素 ::placeholder input::placeholder 选择已规定 "placeholder" 属性的 input 元素 :read-only input:read-only 选择已规定 "readonly" 属性的 input 元素 :read-write input:read-write 选择未规定 "readonly" 属性的 input 元素 :required input:required 选择已规定 "required" 属性的 input 元素 :root :root 选择文档的根元素 ::selection ::selection 选择用户已选取的元素部分 :target #news:target 选择当前活动的 #news 元素 :valid input:valid 选择带有有效值的所有 input 元素 :visited a:visited 选择所有已访问的链接 盒子模型 Box Model,盒子模型(也叫框模型)规定了元素框处理元素内容(element content)、内边距(padding)、边框(border) 和外边距(margin) 的方式。在 HTML 文档中,每个元素(element)都有盒子模型,下面是 Box Model 的图示: 元素框的最内部分是实际的内容,直接包围内容的是内边距。内边距呈现了元素的背景。内边距的边缘是边框。边框以外是外边距,外边距默认是透明的,因此不会遮挡其后的任何元素。 外边距可以是负值,而且在很多情况下都要使用负值的外边距。 内边距 padding 元素的内边距在边框和内容区之间。padding 属性接受长度值或百分比值,但不允许使用负值。例如,如果您希望所有 h1 元素的各边都有 10 像素的内边距,只需要这样: h1 {padding: 10px;} 还可以按照上、右、下、左的顺序分别设置各边的内边距,各边均可以使用不同的单位或百分比值: h1 {padding: 10px 0.25em 2ex 20%;} 其中的百分数值是相对于其父元素的 width 计算的。 也通过使用下面四个单独的属性,分别设置上、右、下、左内边距: padding-top padding-right padding-bottom padding-left 边框 元素的边框 (border) 是围绕元素内容和内边距的一条或多条线。 CSS border 属性允许你规定元素边框的样式(border-style)、宽度(border-width)和颜色(border-color)。CSS 规范指出,边框绘制在“元素的背景之上”(元素的背景是内容、内边距和边框区的背景)。有些边框是“间断的”(例如,点线边框或虚线框),元素的背景应当出现在边框的可见部分之间。 外边距 围绕在元素边框的空白区域是外边距。设置外边距的最简单的方法就是使用 margin 属性,这个属性接受任何长度单位、百分数值甚至负值。与内边距类似,margin 属性按按照上、右、下、左的顺序设置。百分数值也是相对于其父元素的 width 计算的。 CSS 定义了一些规则,允许为外边距指定少于 4 个值。规则如下: 如果缺少左外边距的值,则使用右外边距的值; 如果缺少下外边距的值,则使用上外边距的值; 如果缺少右外边距的值,则使用上外边距的值。 换句话说,如果为外边距指定了 3 个值,则第 4 个值(即左外边距)会从第 2 个值(右外边距)复制得到。如果给定了两个值,第 4 个值会从第 2 个值复制得到,第 3 个值(下外边距)会从第 1 个值(上外边距)复制得到。最后一个情况,如果只给定一个值,那么其他 3 个外边距都由这个值(上外边距)复制得到。 外边距合并 当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。 上下合并 当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并。 包含合并 当一个元素包含在另一个元素中时(假设没有内边距或边框把外边距分隔开),它们的上和/或下外边距也会发生合并。 自我合并 假设有一个空元素,它有外边距,但是没有边框或填充。在这种情况下,上外边距与下外边距就碰到了一起,它们会发生合并。 CSS 定位 CSS 尺寸 单位 描述 % 百分比 in 英寸 cm 厘米 mm 毫米 em 1em 等于当前的字体尺寸。 2em 等于当前字体尺寸的两倍。 例如,如果某元素以 12pt 显示,那么 2em 是24pt。 在 CSS 中,em 是非常有用的单位,因为它可以自动适应用户所使用的字体。 ex 一个 ex 是一个字体的 x-height。 (x-height 通常是字体尺寸的一半。) pt 磅 (1 pt 等于 1/72 英寸) pc 12 点活字 (1 pc 等于 12 点) px 像素 (计算机屏幕上的一个点) CSS 颜色 CSS 中的颜色有多种表达方式: 十六进制色 格式为 #rrggbb,按红、绿、蓝各两个数值来排列(每种颜色分量值得范围为:0x00 ~ 0xff)。 如果三种颜色分量两位数值各自重复,那么可以将之缩写。例如 #112233 可以缩写为 #123。 RGB 颜色 格式为 rgb(red, green, blue),颜色分量的值可以是十进制(0 ~ 255)或百分比(0% ~ 100%)。 RGBA 颜色 RGBA 颜色值是 RGB 颜色值的扩展,带有一个 alpha 通道 —— 它规定了对象的不透明度。格式为 rgb(red, green, blue, alpha),不透明度 alpha 的取值范围为 0.0(完全透明) ~ 1.0(完全不透明)。 HSL 颜色 HSL 是颜色的另一种广为使用的表示方法,它是 hue(色相)、saturation(饱和度)、lightness(明度)的缩写。 格式为 hsl(hue, saturation, lightness)。 色相是人眼所能感知的颜色范围,这些颜色分布在一个平面的色相环上,取值范围为: 0° ~ 360°,每个角度可以代表一种颜色。色相值的意义在于,我们可以在不改变光感的情况下,通过旋转色相环来改变颜色。 色彩的饱和度用 0% 至 100% 的值描述了相同色相、明度下色彩纯度的变化。数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从理性(灰度)到感性(纯色)的变化。 色彩的明度的作用是控制色彩的明暗变化,它同样使用了 0% 至 100% 的取值范围。数值越小,色彩越暗,越接近于黑色;数值越大,色彩越亮,越接近于白色。 HSLA 颜色 类似于 RGBA ,增加 alpha 通道后可以定义对象的不透明度。格式为 hsla(hue, saturation, lightness, alpha)。 预定义/跨浏览器颜色名 HTML 和 CSS 颜色规范中定义了 147 种颜色名(17 种标准颜色加 130 种其他颜色)。17 种标准色是 aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, orange, purple, red, silver, teal, white, yellow。 参考资料 W3School - CSS 教程 http://www.w3school.com.cn/css/index.asp 百度百科 - HSL http://baike.baidu.com/link?url=8pwVk9mUQw1QTkRkKanGpPFC7EKyVI_t59BqZWUECHyjPpgtq8foB4LaCfX16FkcydndzFGgXKH8c15Lw9US...
svnadmin 使用笔记
热拷贝备份 将整个库都热拷贝一份出来,包括库的钩子脚本、配置文件等,不包括事务文件(所以可能出现热拷贝后库占用空间变小的情况,是不影响正常使用的);任何时候运行这个脚本都得到一个版本库的安全拷贝,不管是否有其他进程正在使用版本库。热拷贝出来的库可以直接被 SVN 服务器使用,不需要转换。 可以全量备份也可以增量备份。 svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH # --incremental 增量备份选项,只能用于 FSFS 格式的库 svnadmin hotcopy --incremental C:\Repositories\test C:\Backup\test dump 备份 可以全量备份也可以增量备份,可以指定备份的起止版本。 缺点是版本数过大时备份和恢复的时间比较长。 svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]] svnadmin dump C:\Repositories\test > backup.dump svnadmin dump C:\Repositories\test -r 100:200 --incremental > backup_100_200.dump svnadmin create new_repository svnadmin load new_repository < backup.dump 事务(txns [transactions]) SVN 客户端进程异常中止、网络异常等,可能导致文件提交的事务失败,生成的事务文件会继续占用磁盘,可以删除这些意外中止的事务以节省磁盘空间。 列出所有的事务: svnadmin lstxns REPOS_PATH 删除指定的事务: svnadmin rmtxns REPOS_PATH TXN_NAME1 TXN_NAME2 .....
Makefile 简介
make 命令 作用是读入一个名为 Makefile 的文件,然后执行这个文件中指定的指令。 Makefile Makefile 告诉 make 怎样执行一系列的指令去依靠源文件生成一个目标文件。Makefile 中声明了一个依赖关系的列表,这个列表应当包含所有文件(无论是源文件或者目标)作为输入 。 Makefile 文件一般命名为 Makefile 或 makefile ,如果 m 小写有时候可能会出现错误。 $@ 表示当前目标文件的名字 $^ 表示用空格隔开的所有依赖文件 $< 表示第一个依赖文件 驱动的 Makefile 与一般应用程序的 Makefile 有所不同,驱动的 Makefile 要指定内核源代码的位置。 KDIR := /home/matt/linux-3.2.0-psp04.06.00.11 $(MAKE) -C $(KDIR) M=$(PWD) modules $(MAKE) 为自带的变量 -C $(KDIR) 指明跳转到内核源码目录下读取那里的 Makefile M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的 Makefile 方便起见一般都会先定义编译器链接器: CC = gcc LD = gcc 正则表达式表示目录下所有 .c 文件,相当于:SRCS = main.c a.c b.c SRCS = $(wildcard *.c) OBJS 表示 SRCS 中把列表中的 .c 全部替换为 .o,相当于:OBJS = main.o a.o b.o OBJS = $(patsubst %c, %o, $(SRCS)) 可执行文件的名字: TARGET = Hello .PHONE 伪目标,具体含义百度一下一大堆介绍 .PHONY:all clean 要生成的目标文件: all: $(TARGET) 第一行依赖关系:冒号后面为依赖的文件,相当于 Hello: main.o a.o b.o 第二行规则:$@ 表示目标文件,$^ 表示所有依赖文件,$< 表示第一个依赖文件 $(TARGET): $(OBJS) $(LD) -o $@ $^ 上一句目标文件依赖一大堆 .o 文件,这句表示所有 .o 都由相应名字的 .c 文件自动生成 %o:%c $(CC) -c $^ make clean 删除所有 .o 和目标文件: clean: rm -f $(OBJS) $(TARGET) 注意:命令前必须以 tab 键开头,不能是...