var ptxContext = clockPointers.getContext('2d');
由于画指针的操作每隔一秒都要执行一次,所以这里就写成一个函数,方便传给setInterval调用:
这里主要也是用到三角函数,就不??铝耍??且?⒁?ngel的计算。由于传入的angel是一个百分数,所以要乘以一个圆周,也就是2π,才知道对应的弧度,算出来以后还要减去π/2,因为从上面的坐标图就可以看到,0是位于x轴而不是y轴除,刚好比正常的时钟多了π/2。
最后别忘了调用updatePointers实时更新指针:
setInterval(updatePointers, 1000); updatePointers();这下时钟完全出来了,除了初步熟悉<canvas>绘图API外,还顺便复习了一次三角函数。
中文乱码的问题一直出现在编码设置上,现在在linux中pypyodbc 1.3.3读取GB编码mdb又出现中文字符乱码的问题了,下面来看如何解决。
当前1.3.3版本的pypyodbc在linux系统上面已经可以读取有中文字符的mdb文件,不再出现异常,但是读取的中文字符却全是乱码。
下面是根据一些现象的合理推论:
mdb文件来自于windows系统,其中的中文字符使用GB编码无疑,但linux系统上mdbtools提供的odbc驱动底层已经执行了编码转换,将GB码转换为unicode码,pypyodbc再一次进行转换所以出现了问题。
pypyodbc.connect函数有一个参数unicode_results,在python3版本上默认为True,也就是返回unicode编码的结果集。
odbc底层驱动转换一次编码,pypyodbc再转换一次,悲剧不可避免的出现了。
因此设定connect函数的unicode_results为False,也就是原样返回结果集,然后结果集中的字段名和字段值都需要解码为unicode字符串:
$ python3
>>> conn=pypyodbc.connect('Driver=MDBTools;DBQ=/path/to/Record.mdb', unicode_results=False)
>>> conn.cursor().execute('SELECT * FROM Build').fetchone()[0].decode('UTF-8')
decode(‘UTF-8′)解码成功,说明mdbtools的odbc驱动返回的结果集已经是unicode编码格式。
html表单中的label分显式label和隐式labe,表现上没什么区别,但是对屏幕阅读器的盲人用户来说,就有问题了。
label元素平淡无奇,就是为表单输入元素贴上标签,方便辨识。label有个很重要的属性是for,可以将label与其标识的输入元素绑定在一起,提供更好的操作体验。
显式label
<label for="foo"></label><input type="text" id="foo">
重置和提交按钮,图片按钮以及button元素按钮不用使用显式label,因为它们已经有了隐式标签,如value 和 alt 属性值,button元素的内容。
显式的label对Accessibility是最友好的。
隐式label
将输入元素直接包裹在label标签之内,for属性也可以省略了,甚至输入元素的id也可以省略了。
<label>sometext<input type="text"></label>
IE6不支持隐式label
混合式label
即使用label的for特性,又将输入元素包裹在label之内
<label for="foo"><input type="text" id="foo"></label>
表单显式label和隐式label对屏幕阅读器用户的影响
显式label
也就是说为label元素添加for属性,其属性值与表单控件的id属性值一致。
重置和提交按钮(<input type="reset"/> 、<input type="submit"/>), 图片按钮(<input type="img"/>)以及脚本按钮 (<button></button>)不用使用显式label,因为它们已经有了隐式标签,如value 和 alt 属性值,button元素的内容。
<label for="firstname">First name:</label><input type="text" name="firstname" id="firstname" tabindex="1" />
隐式label
根据HTML 4.01 规范, 通过label 元素包裹 表单控件和label文本可创建”隐式label”。
由于一些浏览器(IE6)不支持隐式label,WCAG2.0不建议使用。
<label>First name: <input type="text" name="firstname" /></label>
另外一种写法,即上面两种方法的结合:
<label for="firstname">First name:
<input type="text" name="firstname" id="firstname" tabindex="1" /></label>
两者的区别
使用屏幕阅读器NVDA和IE9测试发现,屏幕阅读器用户听到的提示内容是不同的:
显式label写法:“fFirst name: 编辑框 空白(或内容)”
隐式label写法:“First name: 文本 First name: 编辑框 空白(或内容)”–两种方法一致,不过最后一种写法在所有浏览器下点击label都无法激活表单控件(笔者demo手误,已更改),强烈不推荐这种写法。
可以看出,nvda会重复label文本内容,屏幕阅读器用户更容易理解显式label写法的提示。
更新:今日看到 HTML5 Accessibility Cho