首页
影视
壁纸
留言
关于
今日热榜
推荐
音乐解锁
听歌
阅读器
听歌2
小乞丐
摸鱼
Search
1
Navicat Premium for Mac 中文破解版 (强大的数据库管理工具)
9,647 阅读
2
植物大战僵尸中文版 for Mac (兼容 M1系统) 中文版
5,774 阅读
3
CleanMyMac X 4.15.2 中文破解版 (Mac优化清理工具)
3,303 阅读
4
PDF Expert 中文破解版 (好用的PDF编辑器)
3,050 阅读
5
Parallels Desktop 17 中文版 (PD虚拟机无限试用版本)
2,824 阅读
生活杂记
macOS
编程技术
奇技淫巧
音乐
视频
δ
Search
标签搜索
python
漫画
php
mac
redis
mysql
mac 软件
macOS
音乐
极客爱情
数据库
游戏
吊打面试官
2.0
面试
罗小黑
linux
纯音乐
使用教程
B站
Kain
累计撰写
210
篇文章
累计收到
26
条评论
首页
栏目
生活杂记
macOS
编程技术
奇技淫巧
音乐
视频
δ
页面
影视
壁纸
留言
关于
今日热榜
推荐
音乐解锁
听歌
阅读器
听歌2
小乞丐
摸鱼
搜索到
68
篇与
的结果
2020-06-25
一封给我这个新人软件工程师的信
本文翻译自 A letter to myself as a fresh software engineer - florio.dev亲爱的我,你刚结束你漫长的学业,并且已经准备好开始你在 IT 领域的事业了。我什么也不能改变,但我向你保证,这将会是一场有趣的旅途。我写这封信,是想要给你一些能帮助你更好地在这一专业发展的建议。在接下来的几年里,只靠你自己是学不到太多东西的,这是我希望一开始就有人能给予我关于我职业生涯的忠告。这些建议并没有按照任何标准进行排序,它们对你来说,都同等重要。心静方能成事成为一个好软件工程师的道路是很漫长的。心急吃不了热豆腐,不要只是因为你没办法找到一条成功的捷径就放弃。多用些时间来学习,并在你感兴趣的领域中逐渐变得优秀。永远要记住,这是一场马拉松,而不是短跑。谦虚与愚蠢做个谦虚的人总是好的... 嗯,或许这也应该是最基本的。即使在你经历了很多之后,别人身上总有你能学习的东西。但是这并不代表所有人都比你高一等。你也必须尊重你自己和你的专业技能。当你连自己都不尊重的时候,这就不叫做谦虚了,而是愚蠢。自己永远是最大的敌人总是拿自己和别人比较是完全没有意义的。在你的职业生涯中,总有人会比你更加优秀;而这个比你更优秀的人,也会比另一个人要弱。没有最好,只有更好,我想你应该明白我的意思了。只要把自己做到最好就行了。如果你认为某一个工程师比你更加优秀,那么向他 / 她学习。只要坚持做到最好,最终你也会成为他人的榜样。尊重人,而不是头衔在你的职业生涯中,你会遇到各种非凡的专业人士。但最重要的是,你会遇到各种非凡的人。尊重他人,是要尊重他人最本质的样子,尊重他们自己,而不是他们被赋予的头衔。如果甲是一个首席高级工程架构师,那也并不代表他会比一个初级软件开发者乙更值得尊重。脱离你的 “舒适圈你的事业充满了十字路口,你有非常多的选择,但一切都归结于 —— 你选择呆在你的 “舒适区”,还是走出这个 “舒适区”。希望是在数十年之后,你或许会满足于你现在所成就的,并且想要给自己更加安逸的生活。在那一刻到来之前,请尝试走出你的 “舒适区”。这会让你成为一个更有成就的专业人士,也会让你对自己的事业感到更加满意。记住,美好的事情总发生在 “舒适区” 之外。放下键盘,展开白板当你要为你的程序设计一个新功能,或是一个全新的系统时,不要急着按下键盘开始写代码。作为一名软件工程师,你需要训练的是你思考的大脑而不是敲打键盘的手指。行动前须三思。好的程序都是从一个 “白板” 开始,放下键盘,先想想你应该要怎么实现这些功能。如果有一个共同工作的伙伴来挑战你的想法,那就再好不过了。我所谓的 “白板” 指的是 “任何能帮助你思考的事物”,它可以是一支笔、一张纸,或者一个笔记应用,诸如此类。产出的是价值而并非代码请不要被 “非自主发明综合症” 所影响, 重复造轮子是没有意义的。要避免在已经被解决的问题上浪费时间。如果你只需要将一些现有的工具组合在一起就能简单地达成目标,那就这么做吧!作为一名软件工程师,你应该下功夫的是你产品的价值,而并非代码。学会生活在 IT 领域,人们太容易把所有的注意力都放在工作上了。但对于大多数人来说,这并不只是工作,更多的是出于激情。工作固然重要,但是记住,生活更加重要。过一个有意义、丰富多彩的人生,多去运动、读书、找些自己的嗜好、旅行,去看看我们生活的美好的世界。和朋友外出闲逛,找到你人生的另一半,将你能给予的所有的爱、关怀与支持都献给他 / 她。你会惊奇地发现,你多彩的生活会让你成为一个更棒的 “专业人士”。这就是所有我能给予你的忠告了,我仍然有许多东西要学。最后一件事:享受这旅程!爱你,来自 (一个阅历更加丰富的) 你。原文地址:https://www.florio.dev/20200328-letter-to-myself/
2020年06月25日
105 阅读
0 评论
0 点赞
2020-03-19
HTTP API 设计指南
HTTP API 设计指南翻译自 HTTP API Design Guide https://github.com/interagent/http-api-design前言这篇指南介绍了大量的 http + json 的api设计风格,最初摘录自heroku平台的api设计指引 Heroku 平台 API 指引.这篇指南除了当前那些API,同时也适用于heroku平台新集成的api,我们希望那些在heroku之外的api设计者也感兴趣!我们的目标是一致性,专注业务逻辑同时避免设计上的空想,我们一直在寻找一种良好的,统一的,显而易见的API设计方式,未必只有一种方式。我们假设你熟悉基本的 http+json api 设计方式,但是,不一定包含在此篇指南里面的所有内容。内容返回合适的状态码提供全部可用的资源在请求的body体使用JSON数据提供资源的唯一标识提供标准的时间戳使用ISO8601的国际化时间格式使用统一的资源路径路径和属性要用小写字母嵌套外键关系支持方便的无id间接引用构建错误信息支持Etags缓存用id来跟踪每次的请求按范围分页显示速度限制状态指定可接受头信息的版本提供机器可读的JSON概要提供人类可读的文档提供可执行的示例描述稳定性要求传输通道安全使用友好的JSON输出返回合适的状态码为每一次的响应返回合适的HTTP状态码. 成功的HTTP响应应该使用如下的状态码:200: GET请求成功, 以及DELETE或PATCH 同步请求完成201: POST 同步请求完成202: POST, DELETE, 或 PATCH 异步请求将要完成206: GET 请求成功, 这里只是一部分状态码: 更多对于用户请求的错误情况,及服务器的异常错误情况,请查阅完整的HTTP状态码HTTP response code spec。提供全部可用的资源提供全部可显现的资源 (例如. 这个对象的所有属性) 不用考虑全部可能响应的状态码,总是在响应码为200或是201时返回所有可用资源, 包含 PUT/PATCH 和 DELETE请求, 例如:$ curl -X DELETE \ https://service.com/apps/1f9b/domains/0fd4 HTTP/1.1 200 OK Content-Type: application/json;charset=utf-8 ... { "created_at": "2012-01-01T12:00:00Z", "hostname": "subdomain.example.com", "id": "01234567-89ab-cdef-0123-456789abcdef", "updated_at": "2012-01-01T12:00:00Z" }当请求状态码为202时,不返回所有可用资源,e.g.:$ curl -X DELETE \ https://service.com/apps/1f9b/dynos/05bd HTTP/1.1 202 Accepted Content-Type: application/json;charset=utf-8 ... {}在请求的body体使用JSON数据在 PUT/PATCH/POST 请求的body体使用JSON格式数据, 而不是使用 form 表单形式的数据. 这里我们使用JSON格式的body请求创建对称的格式数据, 例如.:$ curl -X POST https://service.com/apps \ -H "Content-Type: application/json" \ -d '{"name": "demoapp"}' { "id": "01234567-89ab-cdef-0123-456789abcdef", "name": "demoapp", "owner": { "email": "username@example.com", "id": "01234567-89ab-cdef-0123-456789abcdef" }, ... }提供资源的唯一标识在默认情况给每一个资源一个id属性. 用此作为唯一标识除非你有更好的理由不用.不要使用那种在服务器上或是资源中不是全局唯一的标识,比如自动增长的id标识。返回的唯一标识要用小写字母并加个分割线格式 8-4-4-4-12, 例如.:"id": "01234567-89ab-cdef-0123-456789abcdef"提供标准的时间戳提供默认的资源创建时间,更新时间 created_at and updated_at ,e例如:{ ... "created_at": "2012-01-01T12:00:00Z", "updated_at": "2012-01-01T13:00:00Z", ... }这些时间戳可能不适用于某些资源,这种情况下可以忽略省去。使用ISO8601的国际化时间格式在接收的返回时间数据时只使用UTC格式. 查阅ISO8601时间格式,例如:"finished_at": "2012-01-01T12:00:00Z"使用统一的资源路径资源命名使用复数形式为资源命名,而不是在系统中有争议的一个单个资源 (例如,在大多数系统中,给定的用户帐户只有一个). 这种方式保持了特定资源的统一性.形为好的末尾展现形式不许要指定特殊的资源形为,在某些情况下,指定特殊的资源的形为是必须的,用一个标准的actions前缀去替代他, 清楚的描述他:/resources/:resource/actions/:action例如./runs/{run_id}/actions/stop路径和属性要用小写字母使用小写字母并用-短线分割路径名字,并且紧跟着主机域名 e.g:service-api.com/users service-api.com/app-setups同样属性也要用小写字母, 但是属性名字要用下划线_分割,以至于这样在javaScript语言中不用输入引号。 例如.:service_class: "first"嵌套外键关系序列化的外键关系通常建立在一个有嵌套关系的对象之上, 例如.:{ "name": "service-production", "owner": { "id": "5d8201b0..." }, ... }而不是这样 例如:{ "name": "service-production", "owner_id": "5d8201b0...", ... }这种方式尽可能的把相关联的资源信息内联在一起,而不用改变响应资源的结构,或者展示更高一级的响应区域, 例如:{ "name": "service-production", "owner": { "id": "5d8201b0...", "name": "Alice", "email": "alice@heroku.com" }, ... }支持方便的无id间接引用在某些情况下,为了方便用户使用接口,在末尾提供用id标识资源,例如,一个用户想到了他在heroku平台app的名字,但是这个app的唯一标识是id,这种情况下,你想让接口通过名字和id都能访问,例如:$ curl https://service.com/apps/{app_id_or_name} $ curl https://service.com/apps/97addcf0-c182 $ curl https://service.com/apps/www-prod不要只接受使用名字而剔除了使用id。构建错误信息在网络请求响应错误的时候,返回统一的,结构化的错误信息。要包含一个机器可读的错误 id,一个人类能识别的错误信息 message, 根据情况可以添加一个url ,告诉客户端关于这个错误的更多信息以及如何去解决它。例如:HTTP/1.1 429 Too Many Requests{ "id": "rate_limit", "message": "Account reached its API rate limit.", "url": "https://docs.service.com/rate-limits" }把你的错误信息格式文档化,以及这些可能的错误信息ids 让客户端能获取到.支持Etags缓存在所有请求响应中包含一个ETag头,比如,标识出返回资源的指定版本. 用户能够根据他们提供的头信息If-None-Match,在随后的请求中检查出那些无效的。用id来跟踪每次的请求在每一个API响应中要包含一个Request-Id头信息, 通常用唯一标识UUID. 如果服务器和客户端都打印出他们的Request-Id, 这对我们的网络请求调试和跟踪非常有帮助.按范围分页对于服务器响应的大量数据我们应该为此分页。使用Content-Range 头传递分页请求的数据.这里有个例子详细的说明了请求和响应头、状态码,限制条件、排序以及分页处理:Heroku Platform API on Ranges.显示速度限制状态客户端的访问速度限制可以维护服务器的良好状态,进而为其他客户端请求提供高性的服务.你可以使用token bucket algorithm技术量化请求限制.为每一个带有RateLimit-Remaining响应头的请求,返回预留的请求tokens。指定可接受头信息的版本在开始的时候指定API版本,使用Accepts头传递版本信息,也可以是一个自定义的内容, 例如:Accept: application/vnd.heroku+json; version=3最好不要给出一个默认的版本, 而是要求客户端明确指明他们要使用特定的版本.减少路径嵌套在一些有父路径/子路径嵌套关系的资源数据模块中, 路径可能有非常深的嵌套关系, 例如:/orgs/{org_id}/apps/{app_id}/dynos/{dyno_id}推荐在根(root)路径下指定资源来限制路径的嵌套深度。使用嵌套指定范围的资源,例如在下面的情况下,dyno属性app范围下,app属性org范围下:/orgs/{org_id} /orgs/{org_id}/apps /apps/{app_id} /apps/{app_id}/dynos /dynos/{dyno_id}提供机器可读的JSON概要提供一个机器可读的概要恰当的表现你的API.使用prmd管理你的概要, 并且确保用prmd verify验证是有效的。提供人类可读的文档提供人类可读的文档让客户端开发人员可以理解你的API。如果你用prmd创建了一个概要并且按上述要求描述,你可以很容易的生成所有结节使用prmd doc的Markdown文件。除此之在详细信息的结尾,提供一个关于如下信息的API摘要:验证授权,包含获取及使用验证tokens.API 稳定性及版本控制, 包含如何选择所需要的版本.一般的请求和响应头信息.错误信息序列格式.不同语言客户端使用API的例子.提供可执行的示例提供可执行的示例让用户可以直接在终端里面看到API的调用情况,最大程度的让这些示例可以逐字的使用,以减少用户尝试使用API的工作量。例如:$ export TOKEN=... # acquire from dashboard $ curl -is https://$TOKEN@service.com/users如果你使用prmd生成Markdown文档, 你会自动获取一些示例在结点处。描述稳定性描述您的API的稳定性或是它在各种各样节点环境中的完备性和稳定性例如. 带有 原型/开发版/产品等标签.更多关于可能的稳定性和改变管理的方式,查看 Heroku API compatibility policy一旦你的API宣布产品正式版本及稳定版本时, 不要在当前API版本回退做一些不兼容的改变。如果你需要回退做一些不兼容的改变,请创建一个新的版本的API。要求传输通道安全要求在传输通道安全的情况下访问API,这点没什么可解释的了. 因为这不值得去争辩在什么时候使用传输通道安全访问API是好的,什么时候是不好的,只需要记住在访问API时,使用安全传输通道就行了。使用友好的JSON输出用户在第一次看到你的API使用情况,很可能是在命令行下使用curl进行的。友好的输出会让他们非常容易的理解你的API,为好开发者们的方便,打印友好的JSON输出, 例如:{ "beta": false, "email": "alice@heroku.com", "id": "01234567-89ab-cdef-0123-456789abcdef", "last_login": "2012-01-01T12:00:00Z", "created_at": "2012-01-01T12:00:00Z", "updated_at": "2012-01-01T12:00:00Z" }而不是这样 例如:{"beta":false,"email":"alice@heroku.com","id":"01234567-89ab-cdef-0123-456789abcdef","last_login":"2012-01-01T12:00:00Z", "created_at":"2012-01-01T12:00:00Z","updated_at":"2012-01-01T12:00:00Z"}记住要在每行尾部包含一个换行,这样那些使用终端测试API的输出不会被遮挡住。对于大多数的API友好的响应数据输出总会有更好的表现,你可能受到过不友好打印数据API的影响(例如:非常高的流量占用) 或者是在一些客户端上不能工作 (例如:一个随意编写的程序).译者注好久没更新了...
2020年03月19日
138 阅读
0 评论
0 点赞
2016-08-17
中文文案排版指北
中文文案排版指北统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。Other languages:EnglishChinese TraditionalChinese Simplified目录空格中英文之间需要增加空格中文与数字之间需要增加空格数字与单位之间需要增加空格全角标点与其他字符之间不加空格-ms-text-autospace to the rescue?标点符号不重复使用标点符号全角和半角使用全角中文标点数字使用半角字符遇到完整的英文整句、特殊名词,其內容使用半角标点名词专有名词使用正确的大小写不要使用不地道的缩写争议链接之间增加空格简体中文使用直角引号工具谁在这样做?参考文献空格「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。与大家共勉之。」——vinta/paranoid-auto-spacing中英文之间需要增加空格正确:在 LeanCloud 上,数据存储是围绕 AVObject 进行的。错误:在LeanCloud上,数据存储是围绕AVObject进行的。在 LeanCloud上,数据存储是围绕AVObject 进行的。完整的正确用法:在 LeanCloud 上,数据存储是围绕 AVObject 进行的。每个 AVObject 都包含了与 JSON 兼容的 key-value 对应的数据。数据是 schema-free 的,你不需要在每个 AVObject 上提前指定存在哪些键,只要直接设定对应的 key-value 即可。例外:「豆瓣FM」等产品名词,按照官方所定义的格式书写。中文与数字之间需要增加空格正确:今天出去买菜花了 5000 元。错误:今天出去买菜花了 5000元。今天出去买菜花了5000元。数字与单位之间需要增加空格正确:我家的光纤入户宽带有 10 Gbps,SSD 一共有 20 TB。错误:我家的光纤入户宽带有 10Gbps,SSD 一共有 10TB。例外:度/百分比与数字之间不需要增加空格:正确:今天是 233° 的高温。新 MacBook Pro 有 15% 的 CPU 性能提升。错误:今天是 233 ° 的高温。新 MacBook Pro 有 15 % 的 CPU 性能提升。全角标点与其他字符之间不加空格正确:刚刚买了一部 iPhone,好开心!错误:刚刚买了一部 iPhone ,好开心!-ms-text-autospace to the rescue?Microsoft 有个 -ms-text-autospace.aspx) 的 CSS 属性可以实现自动为中英文之间增加空白。不过目前并未普及,另外在其他应用场景,例如 OS X、iOS 的用户界面目前并不存在这个特性,所以请继续保持随手加空格的习惯。标点符号不重复使用标点符号正确:德国队竟然战胜了巴西队!她竟然对你说「喵」?!错误:德国队竟然战胜了巴西队!!德国队竟然战胜了巴西队!!!!!!!!她竟然对你说「喵」??!!她竟然对你说「喵」?!?!??!!全角和半角不明白什么是全角(全形)与半角(半形)符号?请查看维基百科词条『全角和半角』。使用全角中文标点正确:嗨!你知道嘛?今天前台的小妹跟我说「喵」了哎!核磁共振成像(NMRI)是什么原理都不知道?JFGI!错误:嗨! 你知道嘛? 今天前台的小妹跟我说 "喵" 了哎!嗨!你知道嘛?今天前台的小妹跟我说"喵"了哎!核磁共振成像 (NMRI) 是什么原理都不知道? JFGI!核磁共振成像(NMRI)是什么原理都不知道?JFGI!数字使用半角字符正确:这件蛋糕只卖 1000 元。错误:这件蛋糕只卖 1000 元。例外:在设计稿、宣传海报中如出现极少量数字的情形时,为方便文字对齐,是可以使用全角数字的。遇到完整的英文整句、特殊名词,其內容使用半角标点正确:乔布斯那句话是怎么说的?「Stay hungry, stay foolish.」推荐你阅读《Hackers & Painters: Big Ideas from the Computer Age》,非常的有趣。错误:乔布斯那句话是怎么说的?「Stay hungry,stay foolish。」推荐你阅读《Hackers&Painters:Big Ideas from the Computer Age》,非常的有趣。名词专有名词使用正确的大小写大小写相关用法原属于英文书写范畴,不属于本 wiki 讨论內容,在这里只对部分易错用法进行简述。正确:使用 GitHub 登录我们的客户有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。错误:使用 github 登录使用 GITHUB 登录使用 Github 登录使用 gitHub 登录使用 gイんĤЦ8 登录我们的客户有 github、foursquare、microsoft corporation、google、facebook, inc.。我们的客户有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。我们的客户有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。我们的客户有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。我们的客户有 gイんĤЦ8、キouЯƧquムгє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。注意:当网页中需要配合整体视觉风格而出现全部大写/小写的情形,HTML 中请使用标准的大小写规范进行书写;并通过 text-transform: uppercase;/text-transform: lowercase; 对表现形式进行定义。不要使用不地道的缩写正确:我们需要一位熟悉 JavaScript、HTML5,至少理解一种框架(如 Backbone.js、AngularJS、React 等)的前端开发者。错误:我们需要一位熟悉 Js、h5,至少理解一种框架(如 backbone、angular、RJS 等)的 FED。争议以下用法略带有个人色彩,既:无论是否遵循下述规则,从语法的角度来讲都是正确的。链接之间增加空格用法:请 提交一个 issue 并分配给相关同事。访问我们网站的最新动态,请 点击这里 进行订阅!对比用法:请提交一个 issue 并分配给相关同事。访问我们网站的最新动态,请点击这里进行订阅!简体中文使用直角引号用法:「老师,『有条不紊』的『紊』是什么意思?」对比用法:“老师,‘有条不紊’的‘紊’是什么意思?”工具仓库语言vinta/paranoid-auto-spacingJavaScripthuei90/pangu.nodeNode.jshuacnlee/auto-correctRubysparanoid/space-loverPHP (WordPress)nauxliu/auto-correctPHPhotoo/pangu.vimVimsparanoid/grunt-auto-spacingNode.js (Grunt)hjiang/scripts/add-space-between-latin-and-cjkPython谁在这样做?网站文案UGCApple 中国YesN/AApple 香港YesN/AApple 台湾YesN/AMicrosoft 中国YesN/AMicrosoft 香港YesN/AMicrosoft 台湾YesN/ALeanCloudYesN/A知乎Yes部分用户达成V2EXYesYesSegmentFaultYes部分用户达成Apple4usYesN/A豌豆荚YesN/ARuby ChinaYes标题达成PHPHubYes标题达成参考文献Guidelines for Using Capital LettersLetter case - WikipediaPunctuation - Oxford DictionariesPunctuation - The Purdue OWLHow to Use English Punctuation Corrently - wikiHow格式 - openSUSE全角和半角 - 维基百科引号 - 维基百科疑问惊叹号 - 维基百科
2016年08月17日
112 阅读
0 评论
0 点赞
2016-07-22
Material Design
“设计是创造的艺术,我们的目标就是要满足不同的人类需要。人们的需要会随着时间发展,我们的设计,实践,以及理念也要随之提升。我们在自我挑战,为用户创造了一个可视化语言,它整合了优秀设计的经典原则和科学与技术的创新。这就是Material Design。”简介Material design的设计规范细致入微,需要消化好一阵子。越读越感受到它的妙处,假如每个细节都严格遵照Material design的思想来设计,哪怕你不是设计人员,你的产品也一定不会难用和难看。当然,作为设计师,要求就更高了。设计文档本身,就提供了一种很好的方式,帮你从各个角度思考和构建自己产品的规范。但在这之前,先要好好整理一下学习笔记。要打破规矩,必先掌握规矩。在线阅读Material Design 中文版.pdf
2016年07月22日
117 阅读
0 评论
0 点赞
2016-07-21
全面的常用正则表达式大全
一、校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 8 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$ 9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$ 12 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$ 13 非负整数:^\d+$ 或 ^[1-9]\d*|0$ 14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$ 15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ 16 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ 17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ 二、校验字符的表达式 1 汉字:^[\u4e00-\u9fa5]{0,}$ 2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 3 长度为3-20的所有字符:^.{3,20}$ 4 由26个英文字母组成的字符串:^[A-Za-z]+$ 5 由26个大写英文字母组成的字符串:^[A-Z]+$ 6 由26个小写英文字母组成的字符串:^[a-z]+$ 7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$ 9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ 11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止输入含有~的字符:[^~\x22]+ 三、特殊需求表达式 1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? 3 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ 4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$ 6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7} 7 身份证号(15位、18位数字):^\d{15}|\d{18}$ 8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ 9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$ 11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 12 日期格式:^\d{4}-\d{1,2}-\d{1,2} 13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$ 14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ 15 钱的输入格式: 16 1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$ 17 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$ 18 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$ 19 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$ 20 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$ 21 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$ 22 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 23 8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 24 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里 25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ 26 中文字符的正则表达式:[\u4e00-\u9fa5] 27 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)) 28 空白行的正则表达式:\n\s*\r (可以用来删除空白行) 29 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力) 30 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式) 31 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始) 32 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字) 33 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用) 34 IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
2016年07月21日
101 阅读
0 评论
0 点赞
命令行的艺术
2016年07月21日
92 阅读
0 评论
0 点赞
2016-07-21
命令行的艺术必读基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统更多资源免责声明授权条款熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。这篇文章是许多作者和译者共同的成果。这里的大部分内容首次出现于 Quora,但考虑到这里的人们都具有学习的天赋且乐于接受别人的建议,使用 Github 来做这件事是更佳的选择。如果你在本文中发现了错误或者存在可以改善的地方,请果断提交 Issue 或 Pull Request!(当然在提交前请看一下必读节和已有的 PR/issue)。必读涵盖范围:这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处。本文致力于做到覆盖面广(尽量包括一切重要的内容),具体(给出最常见的具体的例子)以及简洁(避免不必要的,或是可以在其他地方轻松查到的细枝末节)。每个技巧在特定情境下或是基本的,或是能显著节约时间。本文为 Linux 所写,除了仅限 OS X 系统节。其它节中的大部分内容都适用于其它 Unix 系统或 MacOS 系统,甚至 Cygwin。本文关注于交互式 Bash,尽管很多技巧也适用于其他 shell 或 Bash 脚本。本文包括了“标准的”Unix 命令和需要安装特定包的命令,只要它们足够重要。注意事项:为了能在一页内展示尽量多的东西,一些具体的信息会被间接的包含在引用页里。聪明机智的你如果掌握了使用 Google 搜索引擎的基本思路与命令,那么你将可以查阅到更多的详细信息。使用 apt-get/yum/dnf/pacman/pip/brew(以及其它合适的包管理器)来安装新程序。使用 Explainshell 去获取相关命令、参数、管道等内容的解释。基础学习 Bash 的基础知识。具体来说,输入 man bash 并至少全文浏览一遍; 它很简单并且不长。其他的 shell 可能很好用,但 Bash 功能强大且几乎所有情况下都是可用的 ( 只学习 zsh,fish 或其他的 shell 的话,在你自己的电脑上会显得很方便,但在很多情况下会限制你,比如当你需要在服务器上工作时)。学习并掌握至少一个基于文本的编辑器。通常 Vim (vi) 会是你最好的选择,因为在终端里进行随机编辑 Vim 真的毫无敌手,哪怕是 Emacs、某大型 IDE 甚至时下非常流行的编辑器。学会如何使用 man 命令去阅读文档。学会使用 apropos 去查找文档。了解有些命令并不对应可执行文件,而是Bash内置的,可以使用 help 和 help -d 命令获取帮助信息。学会使用 > 和 < 来重定向输出和输入,学会使用 | 来重定向管道。明白 > 会覆盖了输出文件而 >> 是在文件末添加。了解标准输出 stdout 和标准错误 stderr。学会使用通配符 * (或许再算上 ? 和 [...]) 和引用以及引用中 ' 和 " 的区别。熟悉 Bash 任务管理工具:&,ctrl-z,ctrl-c,jobs,fg,bg,kill 等。了解 ssh,以及学会通过使用 ssh-agent,ssh-add 等命令来实现基本的无密码认证。学会基本的文件管理:ls 和 ls -l (了解 ls -l 中每一列代表的意义),less,head,tail 和 tail -f (甚至 less +F),ln 和 ln -s (了解硬链接与软链接的区别),chown,chmod,du (硬盘使用情况概述:du -hs *)。 关于文件系统的管理,学习 df,mount,fdisk,mkfs,lsblk。知道 inode 是什么(与 ls -i 和 df -i 等命令相关)。学习基本的网络管理:ip 或 ifconfig,dig。熟悉正则表达式,以及 grep/egrep 里不同参数的作用,例如 -i,-o,-v,-A,-B 和 -C,这些参数是值得学习并掌握的。学会使用 apt-get,yum,dnf 或 pacman (取决于你使用的 Linux 发行版)来查找或安装软件包。并确保你的环境中有 pip 来安装基于 Python 的命令行工具 (接下来提到的部分程序使用 pip 来安装会很方便)。日常使用在 Bash 中,可以使用 Tab 自动补全参数,使用 ctrl-r 搜索命令行历史(在按下之后,键入便可以搜索,重复按下 ctrl-r 会在更多匹配中循环,按下 Enter 会执行找到的命令,按下右方向键会将结果放入当前行中,使你可以进行编辑)。在 Bash 中,可以使用 ctrl-w 删除你键入的最后一个单词,使用 ctrl-u 删除整行,使用 alt-b 和 alt-f 以单词为单位移动光标,使用 ctrl-a 将光标移至行首,使用 ctrl-e 将光标移至行尾,使用 ctrl-k 删除光标至行尾的所有内容,使用 ctrl-l 清屏。键入 man readline 查看 Bash 中的默认快捷键,内容很多。例如 alt-. 循环地移向前一个参数,以及 alt-* 展开通配符。你喜欢的话,可以键入 set -o vi 来使用 vi 风格的快捷键,而 set -o emacs 可以把它改回来。为了方便地键入长命令,在设置你的编辑器后(例如 export EDITOR=vim),键入 ctrl-x ctrl-e 会打开一个编辑器来编辑当前命令。在 vi 模式下则键入 escape-v 实现相同的功能。键入 history 查看命令行历史记录。其中有许多缩写,例如 !$(最后键入的参数)和 !!(最后键入的命令),尽管通常被 ctrl-r 和 alt-. 取代。回到上一个工作路径:cd -如果你输入命令的时候改变了主意,按下 alt-# 来在行首添加 #,或者依次按下 ctrl-a, #, enter。这样做的话,之后你可以很方便的利用命令行历史回到你刚才输入到一半的命令。使用 xargs ( 或 parallel)。他们非常给力。注意到你可以控制每行参数个数(-L)和最大并行数(-P)。如果你不确定它们是否会按你想的那样工作,先使用 xargs echo 查看一下。此外,使用 -I{} 会很方便。例如: find . -name '*.py' | xargs grep some_function cat hosts | xargs -I{} ssh root@{} hostnamepstree -p 有助于展示进程树。使用 pgrep 和 pkill 根据名字查找进程或发送信号(-f 参数通常有用)。了解你可以发往进程的信号的种类。比如,使用 kill -STOP [pid] 停止一个进程。使用 man 7 signal 查看详细列表。使用 nohup 或 disown 使一个后台进程持续运行。使用 netstat -lntp 或 ss -plat 检查哪些进程在监听端口(默认是检查 TCP 端口; 使用参数 -u 检查 UDP 端口)。有关打开套接字和文件,请参阅 lsof。使用 uptime 或 w 来查看系统已经运行多长时间。使用 alias 来创建常用命令的快捷形式。例如:alias ll='ls -latr' 使你可以方便地执行ls -latr命令。在 Bash 脚本中,使用 set -x 去调试输出,尽可能的使用严格模式,使用 set -e 令脚本在发生错误时退出而不是继续运行,使用 set -u 来检查是否使用了未赋值的变量,使用 set -o pipefail 严谨地对待错误(尽管问题可能很微妙)。当牵扯到很多脚本时,使用 trap。一个好的习惯是在脚本文件开头这样写,这会使它检测一些错误,并在错误发生时中断程序并输出信息: set -euo pipefail trap "echo 'error: Script failed: see failed command above'" ERR在 Bash 脚本中,子 shell(使用括号 (...))是一种组织参数的便捷方式。一个常见的例子是临时地移动工作路径,代码如下: # do something in current dir (cd /some/other/dir && other-command) # continue in original dir在 Bash 中,要注意其中有许多形式的扩展。检查变量是否存在:${name:?error message}。例如,当 Bash 脚本需要一个参数时,可以使用这样的代码 input_file=${1:?usage: $0 input_file}。数学表达式:i=$(( (i + 1) % 5 ))。序列:{1..10}。截断字符串:${var%suffix} 和 ${var#prefix}。例如,假设 var=foo.pdf,那么 echo ${var%.pdf}.txt 将输出 foo.txt。使用括号扩展({...})来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用,例如 mv foo.{txt,pdf} some-dir(同时移动两个文件),cp somefile{,.bak}(会被扩展成 cp somefile somefile.bak)或者 mkdir -p test-{a,b,c}/subtest-{1,2,3}(会被扩展成所有可能的组合,并创建一个目录树)。通过使用 <(some command) 可以将输出视为文件。例如,对比本地文件 /etc/hosts 和一个远程文件: diff /etc/hosts <(ssh somehost cat /etc/hosts)了解 Bash 中的“here documents”,例如 cat <<EOF ...。在 Bash 中,同时重定向标准输出和标准错误,some-command >logfile 2>&1。通常,为了保证命令不会在标准输入里残留一个打开了的文件句柄导致你当前所在的终端无法操作,添加 </dev/null 是一个好习惯。使用 man ascii 查看具有十六进制和十进制值的ASCII表。man unicode,man utf-8,以及 man latin1 有助于你去了解通用的编码信息。使用 screen 或 tmux 来使用多个屏幕,当你在使用 ssh 时(保存 session 信息)将尤为有用。另一个轻量级的解决方案是 dtach。ssh 中,了解如何使用 -L 或 -D(偶尔需要用 -R)去开启隧道是非常有用的,例如当你需要从一台远程服务器上访问 web。对 ssh 设置做一些小优化可能是很有用的,例如这个 ~/.ssh/config 文件包含了防止特定环境下断开连接、压缩数据、多通道等选项: TCPKeepAlive=yes ServerAliveInterval=15 ServerAliveCountMax=6 Compression=yes ControlMaster auto ControlPath /tmp/%r@%h:%p ControlPersist yes部分其他的关于 ssh 的选项是安全敏感且应当小心启用的。例如在可信任的网络中:StrictHostKeyChecking=no,ForwardAgent=yes考虑使用 mosh 作为 ssh 的替代品,它使用 UDP 协议。获取文件的八进制格式权限,使用类似如下的代码: stat -c '%A %a %n' /etc/timezone使用 percol 或者 fzf 可以交互式地从另一个命令输出中选取值。使用 fpp(PathPicker)可以与基于另一个命令(例如 git)输出的文件交互。将 web 服务器上当前目录下所有的文件(以及子目录)暴露给你所处网络的所有用户,使用:python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)或python -m http.server 7777 (使用端口 7777 和 Python 3)。以某种权限执行命令,使用sudo(root 权限)或sudo -u(其他用户)。使用su或者sudo bash来启动一个以对应用户权限运行的 shell。使用su -模拟其他用户的登录。文件及数据处理在当前路径下通过文件名定位一个文件,find . -iname '*something*'(或类似的)。在所有路径下通过文件名查找文件,使用 locate something (但请记住 updatedb 可能没有对最近新建的文件建立索引)。使用 ag 在源代码或数据文件里检索(比 grep -r 更好)。将 HTML 转为文本:lynx -dump -stdinMarkdown,HTML,以及所有文档格式之间的转换,试试 pandoc。如果你不得不处理 XML,xmlstarlet 宝刀未老。使用 jq 处理 JSON。使用 shyaml 处理 YAML。Excel 或 CSV 文件的处理,csvkit 提供了 in2csv,csvcut,csvjoin,csvgrep 等工具。关于 Amazon S3,s3cmd 很方便而 s4cmd 更快。Amazon 官方的 aws 以及 saws 是其他 AWS 相关工作的基础。了解如何使用 sort 和 uniq,包括 uniq 的 -u 参数和 -d 参数,详见后文单行脚本节。另外可以了解一下 comm。了解如何使用 cut,paste 和 join 来更改文件。很多人都会使用 cut,但几乎都不会使用 join。了解如何运用 wc 去计算新行数(-l),字符数(-m),单词数(-w)以及字节数(-c)。了解如何使用 tee 将标准输入复制到文件甚至标准输出,例如 ls -al | tee file.txt。了解语言环境对许多命令行工具的微妙影响,包括排序的顺序和性能。大多数 Linux 的安装过程会将 LANG 或其他有关的变量设置为符合本地的设置。意识到当你改变语言环境时,排序的结果可能会改变。明白国际化可能会使 sort 或其他命令运行效率下降许多倍。某些情况下(例如集合运算)你可以放心的使用 export LC_ALL=C 来忽略掉国际化并使用基于字节的顺序。了解 awk 和 sed 关于数据的简单处理的用法。例如,将文本文件中第三列的所有数字求和:awk '{ x += $3 } END { print x }'. 这可能比同等作用的 Python 代码快三倍且代码量少三倍。替换一个或多个文件中出现的字符串: perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt使用 repren 来批量重命名,或是在多个文件中搜索替换。(有些时候 rename 命令也可以批量重命名,但要注意,它在不同 Linux 发行版中的功能并不完全一样。) # Full rename of filenames, directories, and contents foo -> bar: repren --full --preserve-case --from foo --to bar . # Recover backup files whatever.bak -> whatever: repren --renames --from '(.*)\.bak' --to '\1' *.bak # Same as above, using rename, if available: rename 's/\.bak$//' *.bak根据 man 页面的描述,rsync 真的是一个快速且非常灵活的文件复制工具。它通常被用于机器间的同步,但在本地也同样有用。它同时也是删除大量文件的最快方法之一:mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir使用 shuf 从一个文件中随机选取多行。了解 sort 的参数。处理数字方面,使用 -n 或者 -h 来处理可读性数字(例如 du -h 的输出)。明白键的工作原理(-t 和 -k)。例如,注意到你需要 -k1,1 来仅按第一个域来排序,而 -k1 意味着按整行排序。稳定排序(sort -s)在某些情况下很有用。例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用 sort -k1,1 | sort -s -k2,2。如果你想在 Bash 命令行中写 tab 制表符,按下 ctrl-v [Tab] 或键入 $'\t' (后者可能更好,因为你可以复制粘贴它)。标准的源代码对比及合并工具是 diff 和 patch。使用 diffstat 查看变更总览数据。注意到 diff -r 对整个文件夹有效。使用 diff -r tree1 tree2 | diffstat 查看变更总览数据。对于二进制文件,使用 hd 使其以十六进制显示以及使用 bvi 来编辑二进制。同样对于二进制文件,strings(包括 grep 等等)允许你查找一些文本。二进制文件对比(Delta 压缩),使用 xdelta3。使用 iconv 更改文本编码。而更高级的用法,可以使用 uconv,它支持一些高级的 Unicode 功能。例如,这条命令将所有元音字母转为小写并移除了: uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt拆分文件,查看 split(按大小拆分)和 csplit(按模式拆分)。用 dateutils 中的 dateadd, datediff, strptime 等工具操作日期和时间表达式。使用 zless,zmore,zcat 和 zgrep 对压缩过的文件进行操作。系统调试curl 和 curl -I 可以便捷地被应用于 web 调试中,它们的好兄弟 wget 也可以,或者是更潮的 httpie。使用 iostat、netstat、top (htop 更佳)和 dstat 去获取硬盘、cpu 和网络的状态。熟练掌握这些工具可以使你快速的对系统的当前状态有一个大概的认识。使用 netstat 和 ss 查看网络连接的细节。若要对系统有一个深度的总体认识,使用 glances。它在一个终端窗口中向你提供一些系统级的数据。这对于快速的检查各个子系统非常有帮助。若要了解内存状态,运行并理解 free 和 vmstat 的输出。尤其注意“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,因此它与空闲内存无关。Java 系统调试则是一件截然不同的事,一个可以用于 Oracle 的 JVM 或其他 JVM 上的调试的技巧是你可以运行 kill -3 <pid> 同时一个完整的栈轨迹和堆概述(包括 GC 的细节)会被保存到标准输出/日志文件。JDK 中的 jps,jstat,jstack,jmap 很有用。SJK tools 更高级.使用 mtr 去跟踪路由,用于确定网络问题。用 ncdu 来查看磁盘使用情况,它比常用的命令,如 du -sh *,更节省时间。查找正在使用带宽的套接字连接或进程,使用 iftop 或 nethogs。ab 工具(捆绑于 Apache)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 siege。wireshark,tshark 和 ngrep 可用于复杂的网络调试。了解 strace 和 ltrace。这俩工具在你的程序运行失败、挂起甚至崩溃,而你却不知道为什么或你想对性能有个总体的认识的时候是非常有用的。注意 profile 参数(-c)和附加到一个运行的进程参数 (-p)。了解使用 ldd 来检查共享库。了解如何运用 gdb 连接到一个运行着的进程并获取它的堆栈轨迹。学会使用 /proc。它在调试正在出现的问题的时候有时会效果惊人。比如:/proc/cpuinfo,/proc/meminfo,/proc/cmdline,/proc/xxx/cwd,/proc/xxx/exe,/proc/xxx/fd/,/proc/xxx/smaps(这里的 xxx 表示进程的 id 或 pid)。当调试一些之前出现的问题的时候,sar 非常有用。它展示了 cpu、内存以及网络等的历史数据。关于更深层次的系统分析以及性能分析,看看 stap(SystemTap),perf),以及sysdig。查看你当前使用的系统,使用 uname , uname -a (Unix/kernel 信息) 或者 lsb_release -a (Linux 发行版信息)。无论什么东西工作得很欢乐时试试 dmesg(可能是硬件或驱动问题)。单行脚本一些命令组合的例子:当你需要对文本文件做集合交、并、差运算时,结合使用 sort/uniq 很有帮助。假设 a 与 b 是两内容不同的文件。这种方式效率很高,并且在小文件和上G的文件上都能运用 (sort 不被内存大小约束,尽管在 /tmp 在一个小的根分区上时你可能需要 -T 参数),参阅前文中关于 LC_ALL 和 sort 的 -u 参数的部分。 cat a b | sort | uniq > c # c is a union b cat a b | sort | uniq -d > c # c is a intersect b cat a b b | sort | uniq -u > c # c is set difference a - b使用 grep . *(每行都会附上文件名)或者 head -100 *(每个文件有一个标题)来阅读检查目录下所有文件的内容。这在检查一个充满配置文件的目录(如 /sys、/proc、/etc)时特别好用。计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍): awk '{ x += $3 } END { print x }' myfile如果你想在文件树上查看大小/日期,这可能看起来像递归版的 ls -l 但比 ls -lR 更易于理解: find . -type f -ls假设你有一个类似于 web 服务器日志文件的文本文件,并且一个确定的值只会出现在某些行上,假设一个 acct_id 参数在URI中。如果你想计算出每个 acct_id 值有多少次请求,使用如下代码: cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn运行这个函数从这篇文档中随机获取一条技巧(解析 Markdown 文件并抽取项目): function taocl() { curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README-zh.md| pandoc -f markdown -t html | iconv -f 'utf-8' -t 'unicode' | xmlstarlet fo --html --dropdtd | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | xmlstarlet unesc | fmt -80 }冷门但有用expr:计算表达式或正则匹配m4:简单地宏处理器yes:多次打印字符串cal:漂亮的日历env:执行一个命令(脚本文件中很有用)printenv:打印环境变量(调试时或在使用脚本文件时很有用)look:查找以特定字符串开头的单词cut、paste 和 join:数据修改fmt:格式化文本段落pr:将文本格式化成页/列形式fold:包裹文本中的几行column:将文本格式化成多列或表格expand 和 unexpand:制表符与空格之间转换nl:添加行号seq:打印数字bc:计算器factor:分解因数gpg:加密并签名文件toe:terminfo entries 列表nc:网络调试及数据传输socat:套接字代理,与 netcat 类似slurm:网络可视化dd:文件或设备间传输数据file:确定文件类型tree:以树的形式显示路径和文件,类似于递归的 lsstat:文件信息time:执行命令,并计算执行时间lockfile:使文件只能通过 rm -f 移除logrotate: 切换、压缩以及发送日志文件watch:重复运行同一个命令,展示结果并高亮有更改的部分tac:反向输出文件shuf:文件中随机选取几行comm:一行一行的比较排序过的文件pv:监视通过管道的数据hd,hexdump,xxd,biew 和 bvi:保存或编辑二进制文件strings:从二进制文件中抽取文本tr:转换字母iconv 或 uconv:简易的文件编码split 和 csplit:分割文件sponge:在写入前读取所有输入,在读取文件后再向同一文件写入时比较有用,例如 grep -v something some-file | sponge some-fileunits:将一种计量单位转换为另一种等效的计量单位(参阅 /usr/share/units/definitions.units)apg:随机生成密码7z:高比例的文件压缩ldd:动态库信息nm:提取 obj 文件中的符号ab:性能分析 web 服务器strace:系统调用调试mtr:更好的网络调试跟踪工具cssh:可视化的并发 shellrsync:通过 ssh 或本地文件系统同步文件和文件夹wireshark 和 tshark:抓包和网络调试工具ngrep:网络层的 grephost 和 dig:DNS 查找lsof:列出当前系统打开文件的工具以及查看端口信息dstat:系统状态查看glances:高层次的多子系统总览iostat:硬盘使用状态mpstat: CPU 使用状态vmstat: 内存使用状态htop:top 的加强版last:登入记录w:查看处于登录状态的用户id:用户/组 ID 信息sar:系统历史数据iftop 或 nethogs:套接字及进程的网络利用ss:套接字数据dmesg:引导及系统错误信息sysctl: 在内核运行时动态地查看和修改内核的运行参数hdparm:SATA/ATA 磁盘更改及性能分析lsb_release:Linux 发行版信息lsblk:列出块设备信息:以树形展示你的磁盘以及磁盘分区信息lshw,lscpu,lspci,lsusb 和 dmidecode:查看硬件信息,包括 CPU、BIOS、RAID、显卡、USB设备等lsmod 和 modinfo:列出内核模块,并显示其细节fortune,ddate 和 sl:额,这主要取决于你是否认为蒸汽火车和莫名其妙的名人名言是否“有用”仅限 OS X 系统以下是仅限于 MacOS 系统的技巧用 brew (Homebrew)或者 port (MacPorts)进行包管理。这些可以用来在 Mac 系统上安装以上的大多数命令。用 pbcopy 复制任何命令的输出到桌面应用,用 pbpaste 粘贴输入。若要在 Mac OS 终端中将 Option 键视为 alt 键(例如在上面介绍的 alt-b, alt-f 等命令中用到),打开 偏好设置 -> 描述文件 -> 键盘 并勾选“使用 Option 键作为 Meta 键”。用 open 或者 open -a /Applications/Whatever.app 使用桌面应用打开文件。Spotlight: 用 mdfind 搜索文件,用 mdls 列出元数据(例如照片的 EXIF 信息)。注意 MacOS 系统是基于 BSD UNIX 的,许多命令(例如 ps,ls,tail,awk,sed)都和 Linux 中有些微的不同,这些极大的被 System V-style Unix 和 GNU 工具影响。你可以通过标题为 "BSD General Commands Manual" 的 man 页面发现这些不同。在有些情况下 GNU 版本的命令也可能被安装(例如 gawk 和 gsed 对应 GNU 中的 awk 和 sed )。如果要写跨平台的 Bash 脚本,避免使用这些命令(例如,考虑 Python 或者 perl )或者经过仔细的测试。用 sw_vers 获取 MacOS 的版本信息。更多资源awesome-shell:一份精心组织的命令行工具及资源的列表。awesome-osx-command-line:一份针对 Mac OS 命令行的更深入的指南。Strict mode:为了编写更好的脚本文件。shellcheck:一个静态 shell 脚本分析工具,本质上是 bash/sh/zsh 的 lint。Filenames and Pathnames in Shell:有关如何在 shell 脚本里正确处理文件名的细枝末节。免责声明除去特别微小的任务,编写代码是出于方便阅读的目的。能力往往伴随着责任。你 可以 在 Bash 中做一些事并不意味着你应该去做!;)授权条款本文使用授权协议 Creative Commons Attribution-ShareAlike 4.0 International License。
2016-07-21
Markdown 语法-完整版本
<< 访问 Wow!UbuntuNOTE: This is Simplelified Chinese Edition Document of Markdown Syntax. If you are seeking for English Edition Document. Please refer to Markdown: Syntax.声明: 这份文档派生(fork)于繁体中文版,在此基础上进行了繁体转简体工作,并进行了适当的润色。此文档用 Markdown 语法编写,你可以到这里查看它的源文件。「繁体中文版的原始文件可以查看这里 。」--By @riku注: 本项目托管于 [GitCafe][]上,请通过"派生"和"合并请求"来帮忙改进本项目。Markdown 语法说明 (简体中文版) / (点击查看快速入门)概述宗旨兼容 HTML特殊字符自动转换区块元素段落和换行标题区块引用列表代码区块分隔线区段元素链接强调代码图片其它反斜杠自动链接感谢Markdown 免费编辑器*概述宗旨Markdown 的目标是实现「易读易写」。可读性,无论如何,都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响,包括 [Setext] [1]、[atx] [2]、[Textile] [3]、[reStructuredText] [4]、[Grutatext] [5] 和 [EtText] [6],而最大灵感来源其实是纯文本电子邮件的格式。总之, Markdown 的语法全由一些符号所组成,这些符号经过精挑细选,其作用一目了然。比如:在文字两旁加上星号,看起来就像*强调*。Markdown 的列表看起来,嗯,就是列表。Markdown 的区块引用看起来就真的像是引用一段文字,就像你曾在电子邮件中见过的那样。兼容 HTMLMarkdown 语法的目标是:成为一种适用于网络的书写语言。Markdown 并不是想取代 HTML的地位,甚至接近它。它的语法种类很少,只对应 HTML 标记的一小部分。Markdown 的构想不是要使得 HTML 文档更容易书写。在我看来, HTML 已经很容易写了。Markdown 的理念是,能让文档更容易读、写和随意改。HTML 是一种发布的格式,Markdown 是一种书写的格式。就这样,Markdown 的格式语法只涵盖纯文本可以涵盖的范围。不在 Markdown 涵盖范围之内的标签,都可以直接在文档里面用 HTML 撰写。不需要额外标注这是 HTML 或是 Markdown;只要直接加标签就可以了。要制约的只有一些 HTML 区块元素――比如 <div>、<table>、<pre>、<p> 等标签,必须在前后加上空行与其它内容区隔开,还要求它们的开始标签与结尾标签不能用制表符或空格来缩进。Markdown 的生成器有足够智能,不会在 HTML 区块标签外加上不必要的 <p> 标签。例子如下,在 Markdown 文件里加上一段 HTML 表格:这是一个普通段落。 <table> <tr> <td>Foo</td> </tr> </table> 这是另一个普通段落。 请注意,在 HTML 区块标签间的 Markdown 格式语法将不会被处理。比如,你在 HTML 区块内使用 Markdown 样式的*强调*会没有效果。HTML 的区段(行内)标签如 <span>、<cite>、<del> 可以在 Markdown 的段落、列表或是标题里随意使用。依照个人习惯,甚至可以不用 Markdown 格式,而直接采用 HTML 标签来格式化。举例说明:如果比较喜欢 HTML 的 <a> 或 <img> 标签,可以直接使用这些标签,而不用 Markdown 提供的链接或是图像标签语法。和处在 HTML 区块标签间不同,Markdown 语法在 HTML 区段标签间是有效的。特殊字符自动转换在 HTML 文件中,有两个字符需要特殊处理: < 和 & 。 < 符号用于起始标签,& 符号则用于标记 HTML 实体,如果你只是想要显示这些字符的原型,你必须要使用实体的形式,像是 < 和 &。& 字符尤其让网络文档编写者受折磨,如果你要打「AT&T」 ,你必须要写成「AT&T」。而网址中的 & 字符也要转换。比如你要链接到:http://images.google.com/images?num=30&q=larry+bird 你必须要把网址转换写为:http://images.google.com/images?num=30&q=larry+bird 才能放到链接标签的 href 属性里。不用说也知道这很容易忽略,这也可能是 HTML 标准检验所检查到的错误中,数量最多的。Markdown 让你可以自然地书写字符,需要转换的由它来处理好了。如果你使用的 & 字符是 HTML 字符实体的一部分,它会保留原状,否则它会被转换成 &。所以你如果要在文档中插入一个版权符号 ©,你可以这样写:© Markdown 会保留它不动。而若你写:AT&T Markdown 就会将它转为:AT&T 类似的状况也会发生在 < 符号上,因为 Markdown 允许 兼容 HTML ,如果你是把 < 符号作为 HTML 标签的定界符使用,那 Markdown 也不会对它做任何转换,但是如果你写:4 < 5 Markdown 将会把它转换为:4 < 5 不过需要注意的是,code 范围内,不论是行内还是区块, < 和 & 两个符号都一定会被转换成 HTML 实体,这项特性让你可以很容易地用 Markdown 写 HTML code (和 HTML 相对而言, HTML 语法中,你要把所有的 < 和 & 都转换为 HTML 实体,才能在 HTML 文件里面写出 HTML code。)区块元素段落和换行一个 Markdown 段落是由一个或多个连续的文本行组成,它的前后要有一个以上的空行(空行的定义是显示上看起来像是空的,便会被视为空行。比方说,若某一行只包含空格和制表符,则该行也会被视为空行)。普通段落不该用空格或制表符来缩进。「由一个或多个连续的文本行组成」这句话其实暗示了 Markdown 允许段落内的强迫换行(插入换行符),这个特性和其他大部分的 text-to-HTML 格式不一样(包括 Movable Type 的「Convert Line Breaks」选项),其它的格式会把每个换行符都转成 <br /> 标签。如果你确实想要依赖 Markdown 来插入 <br /> 标签的话,在插入处先按入两个以上的空格然后回车。的确,需要多费点事(多加空格)来产生 <br /> ,但是简单地「每个换行都转换为 <br />」的方法在 Markdown 中并不适合, Markdown 中 email 式的 区块引用 和多段落的 列表 在使用换行来排版的时候,不但更好用,还更方便阅读。标题Markdown 支持两种标题的语法,类 [Setext] [1] 和类 [atx] [2] 形式。类 Setext 形式是用底线的形式,利用 = (最高阶标题)和 - (第二阶标题),例如:This is an H1 ============= This is an H2 ------------- 任何数量的 = 和 - 都可以有效果。类 Atx 形式则是在行首插入 1 到 6 个 # ,对应到标题 1 到 6 阶,例如:# 这是 H1 ## 这是 H2 ###### 这是 H6 你可以选择性地「闭合」类 atx 样式的标题,这纯粹只是美观用的,若是觉得这样看起来比较舒适,你就可以在行尾加上 #,而行尾的 # 数量也不用和开头一样(行首的井字符数量决定标题的阶数):# 这是 H1 # ## 这是 H2 ## ### 这是 H3 ###### 区块引用 BlockquotesMarkdown 标记区块引用是使用类似 email 中用 > 的引用方式。如果你还熟悉在 email 信件中的引言部分,你就知道怎么在 Markdown 文件中建立一个区块引用,那会看起来像是你自己先断好行,然后在每行的最前面加上 > :> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. > > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse > id sem consectetuer libero luctus adipiscing. Markdown 也允许你偷懒只在整个段落的第一行最前面加上 > :> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing. 区块引用可以嵌套(例如:引用内的引用),只要根据层次加上不同数量的 > :> This is the first level of quoting. > > > This is nested blockquote. > > Back to the first level. 引用的区块内也可以使用其他的 Markdown 语法,包括标题、列表、代码区块等:> ## 这是一个标题。 > > 1. 这是第一行列表项。 > 2. 这是第二行列表项。 > > 给出一些例子代码: > > return shell_exec("echo $input | $markdown_script"); 任何像样的文本编辑器都能轻松地建立 email 型的引用。例如在 BBEdit 中,你可以选取文字后然后从选单中选择增加引用阶层。列表Markdown 支持有序列表和无序列表。无序列表使用星号、加号或是减号作为列表标记:* Red * Green * Blue 效果就是redgreenblue等同于:+ Red + Green + Blue 也等同于:- Red - Green - Blue 有序列表则使用数字接着一个英文句点:1. Bird 2. McHale 3. Parish 很重要的一点是,你在列表标记上使用的数字并不会影响输出的 HTML 结果,上面的列表所产生的 HTML 标记为:<ol> <li>Bird</li> <li>McHale</li> <li>Parish</li> </ol> 如果你的列表标记写成:1. Bird 1. McHale 1. Parish 或甚至是:3. Bird 1. McHale 8. Parish 你都会得到完全相同的 HTML 输出。重点在于,你可以让 Markdown 文件的列表数字和输出的结果相同,或是你懒一点,你可以完全不用在意数字的正确性。如果你使用懒惰的写法,建议第一个项目最好还是从 1. 开始,因为 Markdown 未来可能会支持有序列表的 start 属性。列表项目标记通常是放在最左边,但是其实也可以缩进,最多 3 个空格,项目标记后面则一定要接着至少一个空格或制表符。要让列表看起来更漂亮,你可以把内容用固定的缩进整理好:* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing. 但是如果你懒,那也行:* Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing. 如果列表项目间用空行分开,在输出 HTML 时 Markdown 就会将项目内容用 <p> 标签包起来,举例来说:* Bird * Magic 会被转换为:<ul> <li>Bird</li> <li>Magic</li> </ul> 但是这个:* Bird * Magic 会被转换为:<ul> <li><p>Bird</p></li> <li><p>Magic</p></li> </ul> 列表项目可以包含多个段落,每个项目下的段落都必须缩进 4 个空格或是 1 个制表符:1. This is a list item with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. Donec sit amet nisl. Aliquam semper ipsum sit amet velit. 2. Suspendisse id sem consectetuer libero luctus adipiscing. 如果你每行都有缩进,看起来会看好很多,当然,再次地,如果你很懒惰,Markdown 也允许:* This is a list item with two paragraphs. This is the second paragraph in the list item. You're only required to indent the first line. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. * Another item in the same list. 如果要在列表项目内放进引用,那 > 就需要缩进:* A list item with a blockquote: > This is a blockquote > inside a list item. 如果要放代码区块的话,该区块就需要缩进两次,也就是 8 个空格或是 2 个制表符:* 一列表项包含一个列表区块: <代码写在这> 当然,项目列表很可能会不小心产生,像是下面这样的写法:1986. What a great season. 换句话说,也就是在行首出现数字-句点-空白,要避免这样的状况,你可以在句点前面加上反斜杠。1986\. What a great season. 代码区块和程序相关的写作或是标签语言原始码通常会有已经排版好的代码区块,通常这些区块我们并不希望它以一般段落文件的方式去排版,而是照原来的样子显示,Markdown 会用 <pre> 和 <code> 标签来把代码区块包起来。要在 Markdown 中建立代码区块很简单,只要简单地缩进 4 个空格或是 1 个制表符就可以,例如,下面的输入:这是一个普通段落: 这是一个代码区块。 Markdown 会转换成:<p>这是一个普通段落:</p> <pre><code>这是一个代码区块。 </code></pre> 这个每行一阶的缩进(4 个空格或是 1 个制表符),都会被移除,例如:Here is an example of AppleScript: tell application "Foo" beep end tell 会被转换为:<p>Here is an example of AppleScript:</p> <pre><code>tell application "Foo" beep end tell </code></pre> 一个代码区块会一直持续到没有缩进的那一行(或是文件结尾)。在代码区块里面, & 、 < 和 > 会自动转成 HTML 实体,这样的方式让你非常容易使用 Markdown 插入范例用的 HTML 原始码,只需要复制贴上,再加上缩进就可以了,剩下的 Markdown 都会帮你处理,例如: <div class="footer"> © 2004 Foo Corporation </div> 会被转换为:<pre><code><div class="footer"> &copy; 2004 Foo Corporation </div> </code></pre> 代码区块中,一般的 Markdown 语法不会被转换,像是星号便只是星号,这表示你可以很容易地以 Markdown 语法撰写 Markdown 语法相关的文件。分隔线你可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线:* * * *** ***** - - - --------------------------------------- 区段元素链接Markdown 支持两种形式的链接语法: 行内式和参考式两种形式。不管是哪一种,链接文字都是用 [方括号] 来标记。要建立一个行内式的链接,只要在方块括号后面紧接着圆括号并插入网址链接即可,如果你还想要加上链接的 title 文字,只要在网址后面,用双引号把 title 文字包起来即可,例如:This is [an example](http://example.com/ "Title") inline link. [This link](http://example.net/) has no title attribute. 会产生:<p>This is <a href="http://example.com/" title="Title"> an example</a> inline link.</p> <p><a href="http://example.net/">This link</a> has no title attribute.</p> 如果你是要链接到同样主机的资源,你可以使用相对路径:See my [About](/about/) page for details. 参考式的链接是在链接文字的括号后面再接上另一个方括号,而在第二个方括号里面要填入用以辨识链接的标记:This is [an example][id] reference-style link. 你也可以选择性地在两个方括号中间加上一个空格:This is [an example] [id] reference-style link. 接着,在文件的任意处,你可以把这个标记的链接内容定义出来:[id]: http://example.com/ "Optional Title Here" 链接内容定义的形式为:方括号(前面可以选择性地加上至多三个空格来缩进),里面输入链接文字接着一个冒号接着一个以上的空格或制表符接着链接的网址选择性地接着 title 内容,可以用单引号、双引号或是括弧包着下面这三种链接的定义都是相同:[foo]: http://example.com/ "Optional Title Here" [foo]: http://example.com/ 'Optional Title Here' [foo]: http://example.com/ (Optional Title Here) 请注意:有一个已知的问题是 Markdown.pl 1.0.1 会忽略单引号包起来的链接 title。链接网址也可以用尖括号包起来:[id]: <http://example.com/> "Optional Title Here" 你也可以把 title 属性放到下一行,也可以加一些缩进,若网址太长的话,这样会比较好看:[id]: http://example.com/longish/path/to/resource/here "Optional Title Here" 网址定义只有在产生链接的时候用到,并不会直接出现在文件之中。链接辨别标签可以有字母、数字、空白和标点符号,但是并不区分大小写,因此下面两个链接是一样的:[link text][a] [link text][A] 隐式链接标记功能让你可以省略指定链接标记,这种情形下,链接标记会视为等同于链接文字,要用隐式链接标记只要在链接文字后面加上一个空的方括号,如果你要让 "Google" 链接到 google.com,你可以简化成:[Google][] 然后定义链接内容:[Google]: http://google.com/ 由于链接文字可能包含空白,所以这种简化型的标记内也许包含多个单词:Visit [Daring Fireball][] for more information. 然后接着定义链接:[Daring Fireball]: http://daringfireball.net/ 链接的定义可以放在文件中的任何一个地方,我比较偏好直接放在链接出现段落的后面,你也可以把它放在文件最后面,就像是注解一样。下面是一个参考式链接的范例:I get 10 times more traffic from [Google] [1] than from [Yahoo] [2] or [MSN] [3]. [1]: http://google.com/ "Google" [2]: http://search.yahoo.com/ "Yahoo Search" [3]: http://search.msn.com/ "MSN Search" 如果改成用链接名称的方式写:I get 10 times more traffic from [Google][] than from [Yahoo][] or [MSN][]. [google]: http://google.com/ "Google" [yahoo]: http://search.yahoo.com/ "Yahoo Search" [msn]: http://search.msn.com/ "MSN Search" 上面两种写法都会产生下面的 HTML。<p>I get 10 times more traffic from <a href="http://google.com/" title="Google">Google</a> than from <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> 下面是用行内式写的同样一段内容的 Markdown 文件,提供作为比较之用:I get 10 times more traffic from [Google](http://google.com/ "Google") than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or [MSN](http://search.msn.com/ "MSN Search"). 参考式的链接其实重点不在于它比较好写,而是它比较好读,比较一下上面的范例,使用参考式的文章本身只有 81 个字符,但是用行内形式的却会增加到 176 个字元,如果是用纯 HTML 格式来写,会有 234 个字元,在 HTML 格式中,标签比文本还要多。使用 Markdown 的参考式链接,可以让文件更像是浏览器最后产生的结果,让你可以把一些标记相关的元数据移到段落文字之外,你就可以增加链接而不让文章的阅读感觉被打断。强调Markdown 使用星号(*)和底线(_)作为标记强调字词的符号,被 * 或 _ 包围的字词会被转成用 <em> 标签包围,用两个 * 或 _ 包起来的话,则会被转成 <strong>,例如:*single asterisks* _single underscores_ **double asterisks** __double underscores__ 会转成:<em>single asterisks</em> <em>single underscores</em> <strong>double asterisks</strong> <strong>double underscores</strong> 你可以随便用你喜欢的样式,唯一的限制是,你用什么符号开启标签,就要用什么符号结束。强调也可以直接插在文字中间:un*frigging*believable 但是如果你的 * 和 _ 两边都有空白的话,它们就只会被当成普通的符号。如果要在文字前后直接插入普通的星号或底线,你可以用反斜线:\*this text is surrounded by literal asterisks\* 代码如果要标记一小段行内代码,你可以用反引号把它包起来( ` ),例如:Use the `printf()` function. 会产生:<p>Use the <code>printf()</code> function.</p> 如果要在代码区段内插入反引号,你可以用多个反引号来开启和结束代码区段:``There is a literal backtick (`) here.`` 这段语法会产生:<p><code>There is a literal backtick (`) here.</code></p> 代码区段的起始和结束端都可以放入一个空白,起始端后面一个,结束端前面一个,这样你就可以在区段的一开始就插入反引号:A single backtick in a code span: `` ` `` A backtick-delimited string in a code span: `` `foo` `` 会产生:<p>A single backtick in a code span: <code>`</code></p> <p>A backtick-delimited string in a code span: <code>`foo`</code></p> 在代码区段内,& 和尖括号都会被自动地转成 HTML 实体,这使得插入 HTML 原始码变得很容易,Markdown 会把下面这段:Please don't use any `<blink>` tags. 转为:<p>Please don't use any <code><blink></code> tags.</p> 你也可以这样写:`—` is the decimal-encoded equivalent of `—`. 以产生:<p><code>&#8212;</code> is the decimal-encoded equivalent of <code>&mdash;</code>.</p> 图片很明显地,要在纯文字应用中设计一个「自然」的语法来插入图片是有一定难度的。Markdown 使用一种和链接很相似的语法来标记图片,同样也允许两种样式: 行内式和参考式。行内式的图片语法看起来像是:![Alt text](/path/to/img.jpg) ![Alt text](/path/to/img.jpg "Optional title") 详细叙述如下:一个惊叹号 !接着一个方括号,里面放上图片的替代文字接着一个普通括号,里面放上图片的网址,最后还可以用引号包住并加上选择性的 'title' 文字。参考式的图片语法则长得像这样:![Alt text][id] 「id」是图片参考的名称,图片参考的定义方式则和链接参考一样:[id]: url/to/image "Optional title attribute" 到目前为止, Markdown 还没有办法指定图片的宽高,如果你需要的话,你可以使用普通的 <img> 标签。其它自动链接Markdown 支持以比较简短的自动链接形式来处理网址和电子邮件信箱,只要是用尖括号包起来, Markdown 就会自动把它转成链接。一般网址的链接文字就和链接地址一样,例如:<http://example.com/> Markdown 会转为:<a href="http://example.com/">http://example.com/</a> 邮址的自动链接也很类似,只是 Markdown 会先做一个编码转换的过程,把文字字符转成 16 进位码的 HTML 实体,这样的格式可以糊弄一些不好的邮址收集机器人,例如:<address@example.com> Markdown 会转成:<a href="mailto:addre ss@example.co m">address@exa mple.com</a> 在浏览器里面,这段字串(其实是 <a href="mailto:address@example.com">address@example.com</a>)会变成一个可以点击的「address@example.com」链接。(这种作法虽然可以糊弄不少的机器人,但并不能全部挡下来,不过总比什么都不做好些。不管怎样,公开你的信箱终究会引来广告信件的。)反斜杠Markdown 可以利用反斜杠来插入一些在语法中有其它意义的符号,例如:如果你想要用星号加在文字旁边的方式来做出强调效果(但不用 <em> 标签),你可以在星号的前面加上反斜杠:\*literal asterisks\* Markdown 支持以下这些符号前面加上反斜杠来帮助插入普通的符号:\ 反斜线 ` 反引号 * 星号 _ 底线 {} 花括号 [] 方括号 () 括弧 # 井字号 + 加号 - 减号 . 英文句点 ! 惊叹号 感谢感谢 [leafy7382][] 协助翻译,[hlb][]、[Randylien][] 帮忙润稿,[ethantw][] 的[汉字标准格式・CSS Reset][], [WM][] 回报文字错误。感谢 [fenprace][],[addv][]。Markdown 免费编辑器Windows 平台MarkdownPadMarkPadLinux 平台ReTextMac 平台Mou在线编辑器Markable.inDillinger.io浏览器插件MaDe (Chrome)高级应用Sublime Text 2 + MarkdownEditing / 教程*** 如有更好的 Markdown 免费编辑器推荐,请到这里反馈,谢谢!来源: https://gitcafe.com/riku/Markdown-Syntax-CN/raw/master/syntax.md
2016年07月21日
117 阅读
0 评论
0 点赞
2016-07-21
Markdown 语法basics
<< 访问 Wow!Ubuntu声明: 这份文档派生(fork)于繁体中文版,在此基础上进行了繁体转简体工作,并进行了适当的润色。此文档用 Markdown 语法编写,你可以到这里查看它的源文件。「繁体中文版的原始文件可以查看这里」--By @riku注: 本项目托管于 [GitCafe][]上,请通过"派生"和"合并请求"来帮忙改进本项目。Markdown: Basics (快速入门) / (点击查看完整语法说明)Getting the Gist of Markdown's Formatting Syntax此页提供了 Markdown 的简单概念, 语法说明 页提供了完整详细的文档,说明了每项功能。但是 Markdown 其实很简单就可以上手,此页文档提供了一些范例,并且每个范例都会提供输出的 HTML 结果。其实直接试试看也是一个很不错的方法, Dingus 是一个网页应用程序,你可以把自已编写的 Markdown 文档转成 XHTML。段落、标题、区块代码一个段落是由一个以上的连接的行句组成,而一个以上的空行则会划分出不同的段落(空行的定义是显示上看起来像是空行,就被视为空行,例如有一行只有空白和 tab,那该行也会被视为空行),一般的段落不需要用空白或换行缩进。Markdown 支持两种标题的语法,[Setext] [1] 和 [atx] [2] 形式。Setext 形式是用底线的形式,利用 = (最高阶标题)和 - (第二阶标题),Atx 形式在行首插入 1 到 6 个 # ,对应到标题 1 到 6 阶。区块引用则使用 email 形式的 '>' 角括号。Markdown 语法:A First Level Header ==================== A Second Level Header --------------------- Now is the time for all good men to come to the aid of their country. This is just a regular paragraph. The quick brown fox jumped over the lazy dog's back. ### Header 3 > This is a blockquote. > > This is the second paragraph in the blockquote. > > ## This is an H2 in a blockquote 输出 HTML 为:<h1>A First Level Header</h1> <h2>A Second Level Header</h2> <p>Now is the time for all good men to come to the aid of their country. This is just a regular paragraph.</p> <p>The quick brown fox jumped over the lazy dog's back.</p> <h3>Header 3</h3> <blockquote> <p>This is a blockquote.</p> <p>This is the second paragraph in the blockquote.</p> <h2>This is an H2 in a blockquote</h2> </blockquote> 修辞和强调Markdown 使用星号和底线来标记需要强调的区段。Markdown 语法:Some of these words *are emphasized*. Some of these words _are emphasized also_. Use two asterisks for **strong emphasis**. Or, if you prefer, __use two underscores instead__. 输出 HTML 为:<p>Some of these words <em>are emphasized</em>. Some of these words <em>are emphasized also</em>.</p> <p>Use two asterisks for <strong>strong emphasis</strong>. Or, if you prefer, <strong>use two underscores instead</strong>.</p> 列表无序列表使用星号、加号和减号来做为列表的项目标记,这些符号是都可以使用的,使用星号:* Candy. * Gum. * Booze. 加号:+ Candy. + Gum. + Booze. 和减号- Candy. - Gum. - Booze. 都会输出 HTML 为:<ul> <li>Candy.</li> <li>Gum.</li> <li>Booze.</li> </ul> 有序的列表则是使用一般的数字接着一个英文句点作为项目标记:1. Red 2. Green 3. Blue 输出 HTML 为:<ol> <li>Red</li> <li>Green</li> <li>Blue</li> </ol> 如果你在项目之间插入空行,那项目的内容会用 <p> 包起来,你也可以在一个项目内放上多个段落,只要在它前面缩排 4 个空白或 1 个 tab 。* A list item. With multiple paragraphs. * Another item in the list. 输出 HTML 为:<ul> <li><p>A list item.</p> <p>With multiple paragraphs.</p></li> <li><p>Another item in the list.</p></li> </ul>链接Markdown 支援两种形式的链接语法: 行内 和 参考 两种形式,两种都是使用角括号来把文字转成连结。行内形式是直接在后面用括号直接接上链接:This is an [example link](http://example.com/). 输出 HTML 为:<p>This is an <a href="http://example.com/"> example link</a>.</p> 你也可以选择性的加上 title 属性:This is an [example link](http://example.com/ "With a Title"). 输出 HTML 为:<p>This is an <a href="http://example.com/" title="With a Title"> example link</a>.</p> 参考形式的链接让你可以为链接定一个名称,之后你可以在文件的其他地方定义该链接的内容:I get 10 times more traffic from [Google][1] than from [Yahoo][2] or [MSN][3]. [1]: http://google.com/ "Google" [2]: http://search.yahoo.com/ "Yahoo Search" [3]: http://search.msn.com/ "MSN Search" 输出 HTML 为:<p>I get 10 times more traffic from <a href="http://google.com/" title="Google">Google</a> than from <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p> title 属性是选择性的,链接名称可以用字母、数字和空格,但是不分大小写:I start my morning with a cup of coffee and [The New York Times][NY Times]. [ny times]: http://www.nytimes.com/ 输出 HTML 为:<p>I start my morning with a cup of coffee and <a href="http://www.nytimes.com/">The New York Times</a>.</p> 图片图片的语法和链接很像。行内形式(title 是选择性的):![alt text](/path/to/img.jpg "Title") 参考形式:![alt text][id] [id]: /path/to/img.jpg "Title" 上面两种方法都会输出 HTML 为:<img src="/path/to/img.jpg" alt="alt text" title="Title" /> 代码在一般的段落文字中,你可以使用反引号 ` 来标记代码区段,区段内的 &、< 和 > 都会被自动的转换成 HTML 实体,这项特性让你可以很容易的在代码区段内插入 HTML 码:I strongly recommend against using any `<blink>` tags. I wish SmartyPants used named entities like `—` instead of decimal-encoded entites like `—`. 输出 HTML 为:<p>I strongly recommend against using any <code><blink></code> tags.</p> <p>I wish SmartyPants used named entities like <code>&mdash;</code> instead of decimal-encoded entites like <code>&#8212;</code>.</p> 如果要建立一个已经格式化好的代码区块,只要每行都缩进 4 个空格或是一个 tab 就可以了,而 &、< 和 > 也一样会自动转成 HTML 实体。Markdown 语法:If you want your page to validate under XHTML 1.0 Strict, you've got to put paragraph tags in your blockquotes: <blockquote> <p>For example.</p> </blockquote> 输出 HTML 为:<p>If you want your page to validate under XHTML 1.0 Strict, you've got to put paragraph tags in your blockquotes:</p> <pre><code><blockquote> <p>For example.</p> </blockquote> </code></pre> 来源: https://gitcafe.com/riku/Markdown-Syntax-CN/raw/master/basics.md
2016年07月21日
121 阅读
0 评论
0 点赞
1
...
6
7