去RubyInstaller.org官网中下载
双击Ruby安装包 RubyInstaller
,直接下一步操作就可以了。
等安装完成,运行命令:ruby -v
,显示版本号就说明安装成功。
ruby dk.rb init
,将会产生一个配置文件config.yml
;config.yml
文件,将ruby
的安装路径加上,格式是:-+空格+ruby安装目录
,如下:- C:\Program\Ruby\2.2.4
ruby dk.rb install
.下载RubyGems
package:
rubygems.org github.com
解压下载的压缩包;
ruby setup.rb
,等待安装完成;gem -v
,如果打印出版本号,即安装成功. 至此,Ruby的开发环境基本完成,可以愉快的写Hello World
了.
|
|
是指在git源码中
contrib/completion/
目录下的git-completion.bash
和git-prompt.sh
将这两个文件拷贝到指定目录,只要自己知道就好.
在这里直接拷贝至用户目录~.
|
|
|
|
重启终端即可.
]]>本文介绍Hexo利用Travis CI自动化生成并发布,亲测可用.
利用 GitHub账号登录 Travis CI
在项目的设置中开启Build only if .travis.yml is present
这一项.
这个用于操作repo,否则没有权限.
注意:需要安装Ruby,并且需要安装rubygems插件
|
|
在项目根目录创建.travis.yml
文件
|
|
登录travis
|
|
添加变量信息
在项目根目录下执行:
|
|
之后会在.travis.yml
文件中添加下面的信息
这里的
REPO_TOKEN
是变量名,在后面的配置文件中会用到.TOKEN
是上面github生成的Token.
如果之前配置过deploy信息可以略过.
|
|
Push本地的代码至远程仓库,然后,在https://travis-ci.org看项目自动化执行.
原文地址:http://koyasu221b.com/2016/01/23/deploy-hexo-github-pages-by-travis/
]]>去 nodejs.org 根据系统选择性按照教程安装Node。
创建项目文件夹
进入项目文件夹
初始化项目
使用npm命令:npm init
,根据提示完成。
进入项目文件夹,使用Node的包管理命令npm进行安装.
|
|
|
|
gulpfile.js
以常见的Gulp插件为例,如下:
- js代码校验(gulp-jshint)
- 合并js文件(gulp-concat)
- 压缩js代码(gulp-uglify)
- sass的编译(gulp-sass)
- less的编译(gulp-less)
- 压缩css(gulp-minify-css)
- 重命名(gulp-rename)
这些插件的安装命令如下:
|
|
|
|
昨天博客接入了评论系统,使用的是国内的多说。
之前看到过有些利用该评论系统的有浏览器和系统信息的显示,感觉很不错。
所以,也想有这样的效果。
多说如何显示浏览器和系统的信息?
经过查找,利用UAParser.js可以实现。
|
|
可以新建一个css文件,在页面中添加引用。
如自定义显示颜色css请加.this_ua.platform.相关名称(注意大小写)。
这段代码最好放在多说js代码之后,可以放在多说js的下面。
下面两段代码根据需要选择。
正常加载使用这段代码:
|
|
无刷新加载的请使用下面代码:
|
|
|
|
可以将库文件下载到本地添加到主题中。
要先引入jquery库文件。
引入的ua-parser.js
库文件必须在多说embed.js
之后。
推荐加载多说js代码中:
|
|
]]>
最近在搞一个博客,是托管在github和gitcafe上的,利用Hexo生成的。
之后,发现一个问题,显示的分类都是一级的。而我想要的是:能显示多级分类
,层次分明`的那样。
基本主题自带的分类显示都是一级的,如何显示多级?
所以,研究了一下,找到了理想的方法,方法如下:
利用系统的list_categories([categories], [options])辅助函数生成分类列表;
利用css实现样式.
说明:我使用的是jacman主题,以这个主题为例说明。
在主题文件夹下找到layout/_widget/category.ejs
文件,内容如下:
|
|
修改内容,利用上面提到的list_categories([categories], [options])
辅助函数:
|
|
修改样式文件
在主题文件夹下找到source/css/_partial/aside.styl
文件,其他的也可能是source/css/_partial/sidebar.styl
。反正,能在页面显示即可。
添加新的样式,我的如下:
|
|
想实现不同的样式,自己可以修改。
]]>
今天在在清理数据库,是MS SQL Server
,其中用到分离数据库文件。在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错。
此方法是常规惯用的方式,多步骤。
如图所示:
此方法简单粗暴,非常实用,一条SQL
语句就搞定了。
SQL语句实现: EXEC sp_detach_db [DatabaseName]
示例:EXEC sp_detach_db OA
晚上回来就看到有博文说ASP.NET 5
已死,其来源出自于Scott Hanselman的博客,下面是原文。
命名:由于现在
asp.net
已开源,并支持跨平台,这是一种新的实现,而且和asp.net 4.6
是并行关系,不是在4.6的基础上升级,所以不应该沿用之前的命名。已死:由于
asp.net 5
是一种新的实现,不是原来版本的升级,已重命名,所以说,asp.net 5
算是死了。不过,还是有些人习惯叫asp.net 5
。
Naming is hard.
There are only two hard things in Computer Science: cache invalidation and naming things. - Phil Karlton
It’s very easy to armchair quarterback and say that “they should have named it Foo and it would be easy” but very often there’s many players involved in naming things. ASP.NET is a good ‘brand’ that’s been around for 15 years or so. ASP.NET 4.6 is a supported and released product that you can get and use now from http://get.asp.net.
However, naming the new, completely written from scratch ASP.NET framework “ASP.NET 5” was a bad idea for a one major reason: 5 > 4.6 makes it seem like ASP.NET 5 is bigger, better, and replaces ASP.NET 4.6. Not so.
So we’re changing the name and picking a better version number.
REINTRODUCING ASP.NET CORE 1.0 AND .NET CORE 1.0
ASP.NET 5 is now ASP.NET Core 1.0.
.NET Core 5 is now .NET Core 1.0.
Entity Framework 7 is now Entity Framework Core 1.0 or EF Core 1.0 colloquially.
Why 1.0? Because these are new. The whole .NET Core concept is new. The .NET Core 1.0 CLI is very new. Not only that, but .NET Core isn’t as complete as the full .NET Framework 4.6. We’re still exploring server-side graphics libraries. We’re still exploring gaps between ASP.NET 4.6 and ASP.NET Core 1.0.
WHICH TO CHOOSE?
To be clear, ASP.NET 4.6 is the more mature platform. It’s battle-tested and released and available today. ASP.NET Core 1.0 is a 1.0 release that includes Web API and MVC but doesn’t yet have SignalR or Web Pages. It doesn’t yet support VB or F#. It will have these subsystems some day but not today.
We don’t want anyone to think that ASP.NET Core 1.0 is the finish line. It’s a new beginning and a fork in the road, but ASP.NET 4.6 continues on, released and fully supported. There’s lots of great stuff coming, stay tuned!
起名真难
计算机科学中只有两件难事:缓存失效和命名。——Phil Karlton
“他们就该给它起个名字叫Foo,多简单的事” 纸上谈兵说说很容易,但是起名字这件事经常牵扯到很多因素。ASP.NET 作为一个好“牌子”已经有15年了。ASP.NET 4.6是一个受支持的已发布产品,你可以在 https://get.asp.net 获取。
然而,把一个全新的、完全重写的ASP.NET框架命名为 “ASP.NET 5” 不是一个好主意,一个主要原因就是:5 > 4.6 让人觉得 ASP.NET 5 更大、更好,是取代ASP.NET 4.6的。并不是。
所以我们重新命名并选了一个更好的版本号。
隆重介绍 ASP.NET Core 1.0 和 .NET Core 1.0
Entity Framework 7 现在叫做 Entity Framework Core 1.0 或者简称 EF Core 1.0
为什么选1.0?因为它们是全新的。整个.NET Core概念就是全新的。.NET Core CLI 是非常新的东西。(译注:.Net Core Command Line Interface ,将取代DNX)
不仅如此,.NET Core还不像.NET Framework 4.6那样完整。我们仍在完善服务端图形库(server-side grahpics libraries),我们仍在填补ASP.NET Core 1.0和ASP.NET 4.6之间的缺口。
如何选择?
明确一下,ASP.NET 4.6是更成熟的平台。是经过实战(battle-tested)的目前已发布的可以用版本。
ASP.NET Core 1.0则是1.0版本,包括了Web API和MVC,但不包括SinglR和Web Pages。目前还不支持VB和F#。这些都会在将来实现,但目前还没有。
我们不想让人认为ASP.NET Core 1.0是个终点线,它是一个新的起点和新的分支。
ASP.NET 4.6将继续前行,发布并全面受到支持。别走开,更多精彩内容即将呈现。
FROM:Scott Hanselman Blog
]]>数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。
举例:某个存放客户及其有关定单的3NF 数据库就可能有两个表:Customer和Order。Order表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向Customer表里包含该客户信息的那一行。
事实上,为了效率的缘故,对表不进行标准化有时也是必要的。
采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。
举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。
举例,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。
采用26个英文字母(区分大小写)和0-9这十个自然数,加上下划线’_’组成,共63个字符.不能出现其他字符(注释除外).
注意事项:
1) 以上命名都不得超过30个字符的系统限制.变量名的长度限制为29(不包括标识字符@).
2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名.绝对不要在对象名的字符之间留空格.
3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突
4) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性.假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了.
数据库,数据表一律使用前缀
正式数据库名使用小写英文以及下划线组成,尽量说明是那个应用或者系统在使用的.比如:
|
|
备份数据库名使用正式库名加上备份时间组成,如:
|
|
数据表名使用小写英文以及下划线组成,尽量说明是那个应用或者系统在使用的.
相关应用的数据表使用同一前缀,如论坛的表使用cdb前缀,博客的数据表使用supe前缀,前缀名称一般不超过5字
比如:
|
|
备份数据表名使用正式表名加上备份时间组成,如:
|
|
字段名称使用单词组合完成,首字母小写,后面单词的首字母大写,最好是带表名前缀.
如web_user
表的字段:
|
|
表与表之间的相关联字段要用统一名称
如web_user
表里面的userId
和web_group
表里面的userId
相对应
规则:用尽量少的存储空间来存数一个字段的数据.
比如能用int的就不用char或者varchar
能用tinyint的就不用int
能用varchar(20)的就不用varchar(255)
时间戳字段尽量用int型,如created:表示从'1970-01-01 08:00:00'开始的int秒数,采用英文单词的过去式;gmtCreated:表示datetime类型的时间,即形如'1980-01-01 00:00:00'的时间串,Java中对应的类型为Timestamp
所有数据库设计要写成文档,文档以模块化形式表达.大致格式如下:
'-------------------------------------------
' 表名: web_user
' 作者: Aeolus(傻鱼)
' 日期: 2007-04-11
' 版本: 1.0
' 描述: 保存用户资料
' 具体内容:
' UserID int,自动增量 用户代码
' UserName char(12) 用户名字
' ......
'--------------------------------------------
1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引.考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写.
2) 大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上.
3) 不要索引blob/text等字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间.
4) 不要索引常用的小型表
不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了.对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间.
所有sql关键词全部大写,比如SELECT,UPDATE,FROM,ORDER,BY等,所有的表名和库名都要用``包含
如:
SELECT COUNT(*) FROM `cdb_members` WHERE `userName` = 'aeolus';
1) 避免使用触发器
触发器的功能通常可以用其他方式实现.在调试程序时触发器可能成为干扰.假如你确实需要采用触发器,你最好集中对它文档化.
2) 使用常用英语(或者其他任何语言)而不要使用编码或者拼音首字母缩写
在创建下拉菜单、列表、报表时最好按照英语名排序.假如需要编码或者拼音首字母缩写,可以在旁边附上用户知道的英语.
3) 保存常用信息
让一个表专门存放一般数据库信息非常有用.在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息.这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用.
4) 包含版本机制
在数据库中引入版本控制机制来确定使用中的数据库的版本.时间一长,用户的需求总是会改变的.最终可能会要求修改数据库结构.把版本信息直接存放到数据库中更为方便.
5) 编制文档
对所有的快捷方式、命名规范、限制和函数都要编制文档.
采用给表、列、触发器等加注释的数据库工具.对开发、支持和跟踪修改非常有用.
对数据库文档化,或者在数据库自身的内部或者单独建立文档.这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少.
6) 测试、测试、反复测试
建立或者修订数据库之后,必须用用户新输入的数据测试数据字段.最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求.测试需要在把新数据库投入实际服务之前完成.
7) 检查设计
在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库.换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据.
]]>
库名、表名、字段名必须使用小写字母,“_”分割。
库名、表名、字段名必须不超过12个字符。
库名、表名、字段名见名知意,建议使用名词而不是动词。
建议使用InnoDB存储引擎。
存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。
建议使用UNSIGNED存储非负数值。
建议使用INT UNSIGNED存储IPV4。
整形定义中不添加长度,比如使用INT,而不是INT(4)。
使用短数据类型,比如取值范围为0-80时,使用TINYINT UNSIGNED。
不建议使用ENUM类型,使用TINYINT来代替。
尽可能不使用TEXT、BLOB类型。
VARCHAR(N),N表示的是字符数不是字节数,比如VARCHAR(255),可以最大可存储255个汉字,需要根据实际的宽度来选择N。
VARCHAR(N),N尽可能小,因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节,进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。
表字符集选择UTF8。
使用VARBINARY存储变长字符串。
存储年使用YEAR类型。
存储日期使用DATE类型。
存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节。
建议字段定义为NOT NULL。
将过大字段拆分到其他表中。
禁止在数据库中使用VARBINARY、BLOB存储图片、文件等。
表结构变更需要通知DBA审核。
非唯一索引必须按照“idx字段名称字段名称[_字段名]”进行命名。
唯一索引必须按照“uniq字段名称字段名称[_字段名]”进行命名。
索引名称必须使用小写。
索引中的字段数建议不超过5个。
单张表的索引数量控制在5个以内。
唯一键由3个以下字段组成,并且字段都是整形时,使用唯一键作为主键。
没有唯一键或者唯一键不符合5中的条件时,使用自增(或者通过发号器获取)id作为主键。
唯一键不和主键重复。
索引字段的顺序需要考虑字段值去重之后的个数,个数多的放在前面。
ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面。
使用EXPLAIN判断SQL语句是否合理使用索引,尽量避免extra列出现:Using File Sort,Using Temporary。
UPDATE、DELETE语句需要根据WHERE条件添加索引。
不建议使用%前缀模糊查询,例如LIKE “%weibo”。
对长度过长的VARCHAR字段建立索引时,添加crc32或者MD5 Hash字段,对Hash字段建立索引。
合理创建联合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。
合理利用覆盖索引。
SQL变更需要确认索引是否需要变更并通知DBA。
使用prepared statement,可以提供性能并且避免SQL注入。
SQL语句中IN包含的值不应过多。
UPDATE、DELETE语句不使用LIMIT。
WHERE条件中必须使用合适的类型,避免MySQL进行隐式类型转化。
SELECT语句只获取需要的字段。
SELECT、INSERT语句必须显式的指明字段名称,不使用SELECT *,不使用INSERT INTO table()。
使 用SELECT column_name1, column_name2 FROM table WHERE [condition]而不是SELECT column_name1 FROM table WHERE [condition]和SELECT column_name2 FROM table WHERE [condition]。
WHERE条件中的非等值条件(IN、BETWEEN、<、<=、>、>=)会导致后面的条件使用不了索引。
避免在SQL语句进行数学运算或者函数运算,容易将业务逻辑和DB耦合在一起。
INSERT语句使用batch提交(INSERT INTO table VALUES(),(),()……),values的个数不应过多。
避免使用存储过程、触发器、函数等,容易将业务逻辑和DB耦合在一起,并且MySQL的存储过程、触发器、函数中存在一定的bug。
避免使用JOIN。
使用合理的SQL语句减少与数据库的交互次数。
不使用ORDER BY RAND(),使用其他方法替换。
建议使用合理的分页方式以提高分页的效率。
统计表中记录数时使用COUNT(*),而不是COUNT(primary_key)和COUNT(1)。
禁止在从库上执行后台管理和统计类型功能的QUERY。
每张表数据量建议控制在5000w以下。
可以结合使用hash、range、lookup table进行散表。
散表如果使用md5(或者类似的hash算法)进行散表,表名后缀使用16进制,比如user_ff。
推荐使用CRC32求余(或者类似的算术算法)进行散表,表名后缀使用数字,数字必须从0开始并等宽,比如散100张表,后缀从00-99。
使用时间散表,表名后缀必须使用特定格式,比如按日散表user_20110209、按月散表user_201102。
批量导入、导出数据需要DBA进行审查,并在执行过程中观察服务。
批量更新数据,如update,delete 操作,需要DBA进行审查,并在执行过程中观察服务。
产品出现非数据库平台运维导致的问题和故障时,如前端被抓站,请及时通知DBA,便于维护服务稳定。
业务部门程序出现bug等影响数据库服务的问题,请及时通知DBA,便于维护服务稳定。
业务部门推广活动,请提前通知DBA进行服务和访问评估。
如果出现业务部门人为误操作导致数据丢失,需要恢复数据,请在第一时间通知DBA,并提供准确时间,误操作语句等重要线索。
a) MySQL有配置参数lower_case_table_names,不可动态更改,linux系统默认为0,即库表名以实际情况存储,大小写敏感。如果是1,以小写存储,大小写不敏感。如果是2,以实际情况存储,但以小写比较。
b) 如果大小写混合用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。
c) 字段名显示区分大小写,但实际使用不区分,即不可以建立两个名字一样但大小写不一样的字段。
d) 为了统一规范, 库名、表名、字段名使用小写字母。
库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,必须不超过12字符。
a) 用户评论可用表名usercomment或者comment。
b) 库表是一种客观存在的事物,一种对象,所以建议使用名词。
a) 5.5以后的默认引擘,支持事务,行级锁,更好的恢复性,高并发下性能更好,对多核,大内存,ssd等硬件支持更好。
b) 具体比较可见附件的官方白皮书。
a) mysql中的数值类型(不包括整型):
IEEE754浮点数: float (单精度) , double 或 real (双精度)
定点数: decimal 或 numeric
单精度浮点数的有效数字二进制是24位,按十进制来说,是8位;
双精度浮点数的有效数字二进制是53位,按十进制来说,是16 位
一个实数的有效数字超过8位,用单精度浮点数来表示的话,就会产生误差!同样,如果一个实数的有效数字超过16位,用双精度浮点数来表示,也会产生误差
b) IEEE754标准的计算机浮点数,在内部是用二进制表示的,但在将一个十进制数转换为二进制浮点数时,也会造成误差,原因是不是所有的数都能转换成有限长度的二进制数。
即一个二进制可以准确转换成十进制,但一个带小数的十进制不一定能够准确地用二进制来表示。
实例:
同样的字节数,存储的数值范围更大。如tinyint 有符号为 -128-127,无符号为0-255
使用INT UNSIGNED而不是char(15)来存储ipv4地址,通过MySQL函数inet_ntoa和inet_aton来进行转化。Ipv6地址目前没有转化函数,需要使用DECIMAL或者两个bigINT来存储。
例如:
1234567
SELECT INET_ATON('209.207.224.40');3520061480SELECT INET_NTOA(3520061480);209.207.224.40
注意数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示,python、java客户端等不具备这个功能。
a) ENUM,有三个问题:添加新的值要做DDL,默认值问题(将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值),索引值问题(插入数字实际是插入索引对应的值)
实例:
1234567891011121314151617181920212223
drop table if exists t;create table t(sex enum('0','1'));insert into t values(1);insert into t values('3');select * from t;+------+| sex |+------+| 0 || |+------+2 rows in set (0.00 sec)
a) 索引排序问题,只能使用max_sort_length的长度或者手工指定ORDER BY SUBSTRING(column, length)的长度来排序
b) Memory引擘不支持text,blog类型,会在磁盘上生成临时表
c) 可能浪费更多的空间
d) 可能无法使用 adaptive hash index
e) 导致使用where没有索引的语句变慢
VARCHAR(M)
,如果M<256时会使用一个字节来存储长度,如果m>=256则使用两个字节来存储长度。256时会使用一个字节来存储长度,如果m>
a) 使用utf8字符集,如果是汉字,占3个字节,但ASCII码字符还是1个字节。
b) 统一,不会有转换产生乱码风险
c) 其他地区的用户(美国、印度、台湾)无需安装简体中文支持,就能正常看您的文字,并且不会出现乱码
d) ISO-8859-1编码(latin1)使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。即把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题,保存的是原封不动的字节流。
二进制字节流,不存在编码问题
DATETIME和TIMESTAMP都是精确到秒,优先选择TIMESTAMP,因为TIMESTAMP只有4个字节,而DATETIME8个字节。同时TIMESTAMP具有自动赋值以及自动更新的特性。
如何使用TIMESTAMP的自动赋值属性?
a) 将当前时间作为ts的默认值:ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP。
b) 当行更新时,更新ts的值:ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP。
c) 可以将1和2结合起来:ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
a)如果null字段被索引,需要额外的1字节
b)使索引,索引统计,值的比较变得更复杂
c)可用0,’’代替
d)如果是索引字段,一定要定义为not null
采用分布式文件系统更高效
MySQL的查询速度依赖良好的索引设计,因此索引对于高性能至关重要。合理的索引会加快查询速度(包括UPDATE和DELETE的速度,MySQL会将包含该行的page加载到内存中,然后进行UPDATE或者DELETE操作),不合理的索引会降低速度。
MySQL索引查找类似于新华字典的拼音和部首查找,当拼音和部首索引不存在时,只能通过一页一页的翻页来查找。当MySQL查询不能使用索引时,MySQL会进行全表扫描,会消耗大量的IO。
InnoDB的secondary index使用b+tree来存储,因此在UPDATE、DELETE、INSERT的时候需要对b+tree进行调整,过多的索引会减慢更新的速度。
EXPLAIN 语句(在MySQL客户端中执行)可以获得MySQL如何执行SELECT语句的信息。通过对SELECT语句执行EXPLAIN,可以知晓MySQL执 行该SELECT语句时是否使用了索引、全表扫描、临时表、排序等信息。尽量避免MySQL进行全表扫描、使用临时表、排序等。详见官方文档。
会导致全表扫描
下面的表增加一列url_crc32,然后对url_crc32建立索引,减少索引字段的长度,提高效率。
|
|
InnoDB 存储引擎中,secondary index(非主键索引)中没有直接存储行地址,存储主键值。如果用户需要查询secondary index中所不包含的数据列时,需要先通过secondary index查找到主键值,然后再通过主键查询到其他数据列,因此需要查询两次。
覆盖索引的概念就是查询可以通过在一个索引中完成,覆盖索引效率会比较高,主键查询是天然的覆盖索引。
合理的创建索引以及合理的使用查询语句,当使用到覆盖索引时可以获得性能提升。
比如SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主键,适当时候可以将索引添加为index(uid,email),以获得性能提升。
a) 可能导致主从数据不一致
b) 会记录到错误日志,导致日志占用大量空间
因为MySQL进行隐式类型转化之后,可能会将索引字段类型转化成=号右边值的类型,导致使用不到索引,原因和避免在索引字段中使用函数是类似的。
增加很多不必要的消耗(cpu、io、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前段也需要更新。
使用下面的语句来减少和db的交互次数:
|
|
例如微博message,先按照crc32(message_id)将message散到16个库中,然后针对每个库中的表,一天生成一张新表。
因为ORDER BY rand()会将数据从磁盘中读取,进行排序,会消耗大量的IO和CPU,可以在程序中获取一个rand值,然后通过在从数据库中获取对应的值。
假如有类似下面分页语句:
SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;
这种分页方式会导致大量的io,因为MySQL使用的是提前读取策略。
推荐分页方式:
|
|
拒绝使用复杂的SQL,将大的SQL拆分成多条简单SQL分步执行。原因:简单的SQL容易使用到MySQL的query cache;减少锁表时间特别是MyISAM;可以使用多核cpu。
InnoDB表避免使用COUNT(*)操作,计数统计实时要求较强可以使用memcache或者redis,非实时统计可以使用单独统计表,定时更新。
]]>
自己买了个
Raspberry Pi 2
的板子,没有显示器,想利用无线连接通过SSH
连接。无奈之下才上网查了下,发现可以利用shell
命令设置无线连接,于是,就有了以下的内容。
在shell
中输入wpa_cli
命令,进入交互,然后输入以下信息(注:#为注释)
设置相关信息
|
|
退出交互模式
输入q
退出交互模式。
连接网络
使用 dhclient wlan0
命令获取网络地址。
|
|
若要设置 Windows 10 IoT 核心版开发电脑,首先需要安装以下内容:
请确保运行的是 Windows 10(版本 10240)的公共版本或更高版本。可从此处升级。如果已经运行 Windows 10,可通过单击“开始”按钮、键入“winver”并点击 Enter,查找当前版本号。
在此处安装 Visual Studio Community 2015。可从此处下载 Visual Studio Professional 2015
和 Visual Studio Enterprise
2015。
注意: 如果选择安装不同版本的 VS 2015,请确保执行“自定义”安装,并依次选中“通用 Windows 应用开发工具”->“工具和 Windows SDK”复选框。
通过依次选择“帮助”>“关于 Microsoft Visual Studio”验证 Visual Studio 安装。“Visual Studio”的所需版本是 14.0.23107.0 D14Rel
。“用于通用 Windows 应用的 Visual Studio 工具”的所需版本是 14.0.23121.00 D14OOB
。
确保已按照这些说明启用了开发人员模式。
运行 Windows 10 的电脑(在上一步中已准备就绪)
Raspberry Pi 2
5V 微型 USB 电源 - 使用至少 1.0A 电流。如果计划使用多个高耗电 USB 外围设备,请改用电流较高的电源 (>2.0A)。
HDMI 电缆和监视器
以太网电缆
微型 SD 卡读卡器(因为大多数内部 SD 卡读卡器均会出现问题,所以我们建议使用外部 USB 卡读卡器,例如这个或这个)
从 Microsoft 下载中心下载用于 Raspberry Pi 2 的 ISO。
将 ISO 保存到本地文件夹
双击 ISO(IoT 核心版 RPi.iso)。它将自动将其本身作为虚拟驱动器进行装载,以便你可以访问内容。
安装 Windows_10_IoT_Core_RPi2.msi。安装完成后,flash.ffu 将位于 C:\Program Files (x86)\Microsoft IoT\FFU\RaspberryPi2
完成后将弹出虚拟 CD
将微型 SD 卡插入 SD 卡读卡器。
使用 IoTCoreImageHelper.exe 切换 SD 卡。从“开始”菜单搜索“WindowsIoT”,并选择快捷方式“WindowsIoTImageHelper”
该工具将按照显示方式枚举设备。选择希望切换的 SD 卡,然后提供 FFU 的位置并切换映像。
单击任务栏中的“安全删除硬件”图标,然后选择你的 USB SD 读卡器以将其从系统中安全删除。如果未正确执行此操作,可能导致映像损坏。
注意: 如果希望在使用完 Windows 10 IoT 核心版后将其从 SD 卡中删除,请参阅标题为如何从 SD 卡中删除 Windows 10 IoT 核心版?的常见问题部分。
注意: IoTCoreImageHelper.exe 是推荐用来切换 SD 卡的工具。但是,说明可用于直接使用 DISM 命令行工具
插入已准备的微型 SD 卡(插槽在如下所示的电路板的另一侧)。
将网络电缆从本地网络连接到电路板上的以太网端口。请确保开发电脑在同一网络上。
注意: 如果没有本地有线网络,请参阅此处获取其他连接选项。
将 HDMI 监视器连接到电路板上的 HDMI 端口。
将电源连接到开发板上的微型 USB 端口。
连接电源后,Windows 10 IoT 核心版将自动启动。这可能需要几分钟时间。
启动设备后,DefaultApp 将启动并显示 RPi2 的 IP 地址。
遵循此处的 PowerShell 文档,使用 PowerShell 连接到正在运行的设备。也可按照此处的说明使用 SSH 连接到设备。
强烈推荐更新管理员帐户的默认密码。若要执行此操作,请在 PowerShell 连接中发出以下命令:
使用强密码替换 [new password]
:
|
|
此操作完成后,将需要使用 psSession 和新凭据重新建立当前会话。
我们将创建一个简单的 LED 闪烁应用并将 LED 连接到你的 Windows 10 IoT Core 设备。
这是一个有外设的示例。若要更好地了解什么是有外设的模式以及如何将你的设备配置为有外设,请按照此处的说明操作。
另外,还请注意 GPIO API 仅在 Windows 10 IoT Core 上可用,因此该示例无法在你的桌面上运行。
在 Visual Studio 中加载项目
你可以通过在此处下载所有示例的 zip 并导航到 samples-develop\Blinky
,查找此示例的源代码。示例代码可采用 C++ 或 C# 提供,但此处的文档仅详细介绍了 C# 变体。在磁盘上创建文件夹的副本,然后从 Visual Studio 中打开项目。
你将会需要一些组件:
一个 LED(你喜欢的任意一种颜色)
一个 220 Ω 电阻器
一块试验板和几根连接线
我们要将 LED 的一端连接到 RPi2 上的 GPIO 5(JP3 扩展头上的引脚 29),将另一端连接到电阻器,并将电阻器连接到 RPi2 上的 3.3 伏电源。请注意 LED 的正负极非常重要。请确保将较短的腿 (-) 连接到 GPIO 5 并将较长的腿 (+) 连接到电阻器,否则它不会点亮。
下面是 RPi2 的引出线:
使用 Fritzing 制作的图像
下面是使用电路组装的试验板可能样子的一个示例:
使用 Fritzing 制作的图像
我们要将 LED 的一端连接到 MBM 上的 GPIO 5(JP1 扩展头上的引脚 18),将另一端连接到电阻器,并将电阻器连接到 MBM 上的 3.3 伏电源。请注意 LED 的正负极非常重要。请确保将较短的腿 (-) 连接到 GPIO 5 并将较长的腿 (+) 连接到电阻器,否则它不会点亮。
以下是 MBM 上的 JP1 连接器:
使用 Fritzing 制作的图像
下面是使用电路组装的试验板可能样子的一个示例:
使用 Fritzing 制作的图像
应用程序在 Visual Studio 中打开后,在工具栏下拉列表中设置体系结构。如果针对 MinnowBoard Max 进行生成,请选择 x86
。如果针对 Raspberry Pi 2 进行生成,请选择 ARM
。
接下来,在 Visual Studio 工具栏中,单击Local Machine
下拉列表并选择 Remote Machine
此时,Visual Studio 将显示“远程连接”对话框。如果以前使用过 PowerShell 设置设备的唯一名称,可在此处输入该名称(在此示例中,我们使用的是 my-device)。否则,使用 Windows IoT 核心版设备的 IP 地址。输入设备名称/IP 后,选择 None
进行 Windows 身份验证,然后单击“选择”。
可通过导航到项目属性(在解决方案资源管理器中选择“属性”)并在左侧选择 Debug 选项卡来验证或修改这些值:
完成所有设置后,你应可以在 Visual Studio 中按 F5。Blinky 应用将会部署并在 Windows IoT 设备上启动,此时你应会看到 LED 与屏幕上的模拟图像同步闪烁。
恭喜你! 你已控制了 Windows IoT 设备上的一个 GPIO 引脚!
此示例的代码相当简单。我们使用了一个计时器,每当调用“Tick”事件时,都会切换 LED 的状态。
下面说明如何使用 C# 语言设置计时器:
|
|
为了驱动 GPIO 引脚,首先我们需要对其进行初始化。以下是 C# 代码(请注意我们如何在 Windows.Devices.Gpio 命名空间中利用新 WinRT 类):
|
|
让让我们稍稍细分一下此过程:
首先,我们使用 GpioController.GetDefault()
获取 GPIO 控制器。
如果设备没有 GPIO 控制器,则此函数将返回 null
。
然后,我们尝试通过使用 LED_PIN
值调用 GpioController.OpenPin()
来打开引脚。
获取 pin
后,我们会使用 GpioPin.Write()
函数将它设置为默认的关闭状态(高)。
我们还使用了 GpioPin.SetDriveMode()
函数将 pin
设置为以输出模式运行。
在具有GpioOutputPin
实例的访问权限后,没有必要再通过更改引脚状态来打开或关闭 LED。
若要打开 LED,只需将值 GpioPinValue.Low
写入引脚:
|
|
当然,写入 GpioPinValue.High
便会关闭 LED:
|
|
记得我们已将 LED 的另一端连接到了 3.3 伏电源,因此,我们需要将引脚驱动到低位,使电流通过 LED。
]]>本文来源:
微软Windows IoT官网