(253) 397-5708

前些天在使用jdbc操作oracle时, 报出ORA-00054错误. 该错误的意思是: 资源正忙, 要求指定NOWAIT; 它告诉你要操作的资源被占用, 应该以nowait非阻塞的方式去执行或者超时失效

  • 找出占用资源的会话id
1
select session_id from v$locked_object;

执行该语句时请确保你的账号拥有管理员权限, 如果查出会话id为 2046, 在查出会话的所有者

1
select sid, serial#, username, osuser from v$session where sid = 2046;
  • 关闭该会话
1
alter system kill session '2046,29';

Oracle数据库的锁类型

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:

  1. DML锁(data locks,数据锁),用于保护数据的完整性;
  2. DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
  3. 内部锁和闩(internal locks and latches),保护数据库的内部结构;
    • DML锁的目的在于保证并发情况下的数据完整性.
    • 在Oracle数据库中,DML锁主要包括TM锁和TX锁.

其中TM锁称为表级锁,TX锁称为事务锁或行级锁。当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。在数据行上只有X锁(排他锁)。在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

悲观锁和乐观锁

  1. 悲观锁

    • 锁在用户修改之前就发挥作用:
1
2
-- select ... from update (nowait)
select * from table1 for update

用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。

  • 对返回结果集进行update或delete操作会发生阻塞。
  • 对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
  • 原因分析

此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个操作commit或rollback.同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.

  1. 乐观锁

乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。

阻塞

当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞

  • INSERT
  • UPDATE
  • DELETE
  • SELECT…FOR UPDATE

Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。

UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。

当一个用户发出select..for update的操作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.

shirt dresser死锁(deadlock)

当两个用户希望持有对方的资源时就会发生死锁.即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:

  1. 用户1对A表进行Update,没有提交。
  2. 用户2对B表进行Update,没有提交。此时双反不存在资源共享的问题。
  3. 如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
  4. 如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。

起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

304-990-6262DML锁分类

表: Oracle的TM锁类型

锁模式 锁描述 解释 SQL操作
0 none
1 NULL select
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update、Lock for update、Lock row share
3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert、Update、Delete、Lock row share
4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

关于V$lock表和相关视图的说明

Column Datatype Description
ADDR RAW(4 | 8) Address of lock state object
KADDR RAW(4 | 8) Address of lock
SID NUMBER Identifier for session holding or acquiring the lock
TYPE VARCHAR2(2) Type of user or system lock The locks on the user types are obtained by user applications. Any process that is blocking others is likely to be holding one of these locks. The user type locks are:

  • TM - DML enqueue
  • TX - Transaction enqueue
  • UL - User supplied

    • 我们主要关注TX和TM两种类型的锁
    • UL锁用户自己定义的,一般很少会定义,基本不用关注
    • 其它均为系统锁,会很快自动释放,不用关注

ID1 NUMBER Lock identifier #1 (depends on type)
ID2 NUMBER Lock identifier #2 (depends on type)

  • 当lock type 为TM时,id1为DML-locked object的object_id
  • 当lock type 为TX时,id1为usn+slot,而id2为seq。
  • 当lock type为其它时,不用关注

LMODE NUMBER Lock mode in which the session holds the lock:

0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)

大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞。往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个或几个TX锁,但他们的id1和id2是不同的,请注意

REQUEST NUMBER Lock mode in which the process requests the lock:

0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)

大于0时,表示当前会话被阻塞,其它会话占有改锁的模式

CTIME NUMBER Time since current mode was granted BLOCK NUMBER The lock is blocking another lock

0, 'Not Blocking',
1, 'Blocking',
2, 'Global',

该锁是否阻塞了另外一个锁

(269) 262-1037其它相关视图说明

v$session 查询会话的信息和锁的信息。

  1. sid,serial#:表示会话信息。
  2. program:表示会话的应用程序信息。
  3. row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。
  4. lockwait :该会话等待的锁的地址,与v$lock的kaddr对应.
  5. v$session_wait 查询等待的会话信息。
  6. sid:表示持有锁的会话信息。
  7. Seconds_in_wait:表示等待持续的时间信息
  8. Event:表示会话等待的事件,锁等于enqueue

dba_locks 对v$lock的格式化视图。

  1. Session_id:和v$lock中的Sid对应。
  2. Lock_type:和v$lock中的type对应。
  3. Lock_ID1: 和v$lock中的ID1对应。
  4. Mode_held,mode_requested:和v$lock中的lmode,request相对应。

v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。

  1. Xidusn,xidslot,xidsqn:表示回滚段信息。和v$transaction相关联。
  2. Object_id:表示被锁对象标识。
  3. Session_id:表示持有锁的会话信息。
  4. Locked_mode:表示会话等待的锁模式的信息,和v$lock中的lmode一致。

查询数据库中的锁

1
2
select * from v$lock;
select * from v$lock where block=1;

查询被锁的对象

1
select * from v$locked_object;

查询阻塞

1
2
3
4
-- 查被阻塞的会话
select * from v$lock where lmode=0 and type in ('TM','TX');
-- 查阻塞别的会话锁
select * from v$lock where lmode>0 and type in ('TM','TX');

查询数据库正在等待锁的进程

1
select * from v$session where lockwait is not null;

6572482922查询会话之间锁等待的关系

1
select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from v$lock a,v$lock b where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.block=0;

查询锁等待事件

1
select * from v$session_wait where event='enqueue';

解决方案:

1
2
3
4
5
6
7
-- 首先得到被锁对象的session_id
select session_id from v$locked_object;
-- 通过上面得到的session_id去取得v$session的sid和serial#,然后对该进程进行终止。
SELECT sid, serial#, username, osuser FROM v$session where sid = session_id;
-- ALTER SYSTEM KILL SESSION 'sid,serial';
-- example:
ALTER SYSTEM KILL SESSION '13, 8';

931-277-5977

Nginx配置详细参数, Ubuntu安装的nginx配置文件一般还会将自定义的server配置放到单独的配置文件中:/etc/nginx/sites-available/default

nginx常用来进行

  • http代理, 反向代理
  • 负载均衡
  • web缓存

nginx文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
  1. 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  5. location块:配置请求的路由,以及各种页面的处理情况。

albarello基本配置参数解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#配置用户或者组,默认为nobody nobody
user nobody;
#允许启动的进程数,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志
#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#指定nginx进程运行文件存放地址
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#设置一个进程是否同时接受多个网络连接,默认为off
multi_accept on;
#事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#设置网路连接序列化,防止惊群现象发生,默认为on
accept_mutex on;
#单个后台worker process进程的最大并发连接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型,默认为text/plain
default_type application/octet-stream;
#取消服务日志
#access_log off;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#设置main为日志的值
access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
#可以在http块,server块,location块
sendfile on;
#tcp_nopush on;
#每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
sendfile_max_chunk 100k;
#连接超时时间, 可以在http,server,location块
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
#错误页
error_page 404 /404.html;
#设定虚拟主机配置
server {
#单连接请求上限次数
keepalive_requests 120;
#侦听80端口
listen 80;
#监听地址
server_name www.nginx.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#root path; #根目录
#定义首页索引文件的名称
#设置默认页
index index.php index.html index.htm;
#请求转向mysvr 定义的服务器列表
proxy_pass /myserver;
#拒绝的ip
deny 192.168.10.60;
#允许的ip
allow 192.168.10.65;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
#请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}

(212) 677-1091nginx监听一个端口多域名转发配置

我们将来自test1.com域名的请求转发到8081端口, 将来自test2.com域名的请求都转发到8082端口, 而将test3.com域名的请求都直接返回html下的web容器静态资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
server {
listen 80;
server_name test1.com.cn www.test1.com.cn;
location / {
proxy_pass /localhost:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name test2.com www.test2.com;
location / {
proxy_pass /localhost:8082;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name test3.com.cn www.test3.com.cn;
error_page 404 401 400 /400.html;
location / {
root html;
index 400.html;
}
location = /40x.html{
root html;
}
}

注意

  • $remote_addr与$http_x_forwarded_for 用以记录客户端的ip地址
  • $remote_user :用来记录客户端用户名称
  • $time_local : 用来记录访问时间与时区
  • $request : 用来记录请求的url与http协议
  • $status : 用来记录请求状态;成功是200
  • $body_bytes_sent :记录发送给客户端文件主体内容大小
  • $http_referer :用来记录从那个页面链接访问过来的
  • $http_user_agent :记录客户端浏览器的相关信息
  • 每个指令必须有分号结束

开发环境配置

为Ubuntu 16.04配置开发环境

更新包

1
2
$ sudo apt update
$ sudo apt upgrade

安装git

1
$ sudo apt install git-core

这里只需要安装core就行了

安装jdk

1
2
3
4
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install oracle-java8-set-default

我安装的是oracle jdk, 不要安装openjdk. 如果你想安装Java 7(i.e Java 1.7),在上面的命令中用java7代替java8

安装nvm和nodejs

  1. 我们需要先安装nvm以便在开发时切换node的版本, 我这里安装的是v6.9.5, 没有安装7以上, 为兼容考虑
1
2
3
4
$ curl -o- /raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
$ nvm ls-remote
$ nvm install v6.9.5
$ nvm alias default v6.9.5
  1. nrm 是一个管理 npm 源的工具
1
2
3
4
5
6
#全局安装nrm
$ npm i nrm -g
#查看当前nrm内置几个npm源的地址
$ nrm ls
#切换cnpm
$ nrm use cnpm
  1. 使用淘宝npm镜像
1
2
# 也可以使用淘宝的npm镜像, --registry就是指定仓储
$ npm install -g cnpm --registry=/registry.npm.taobao.org
  1. 安装必要的包 4196313577、koa、egg、hexo、914-339-4383、pm2
1
2
3
4
5
6
7
8
9
10
11
12
13
# express是node web开发框架
$ cnpm install -g express
# koa是express的弟弟
$ cnpm install koa -g
# egg是阿里nodejs企业级web开发框架
$ cnpm install egg-init -g
# hexo 是一个开源的博客系统
$ cnpm install -g hexo-cli
# supervisor可以监听你文件的改动而自动重启服务, 运行可以使用 supervisor --harmony index.js,
# --harmony参数指定支持es6特性
$ cnpm install -g supervisor
# pm2 一般在部署时候用, 是进程管理工具, 管理的服务进程
$ cnpm install -g pm2

(775) 415-0867安装nginx

  • 由于ubuntu默认开启了Apache服务, 首先关闭该服务
1
2
3
4
5
6
# 关闭Apache服务
$ sudo /etc/init.d/apache2 stop
# 如果还不行, 查看占用80端口的进程,
$ sudo lsof -i:80
# 使用kill干掉
$ kill -9 <pid>
  • 安装Nginx
1
2
3
4
5
6
7
8
# 安装
$ sudo apt-get install nginx
# 在vim中修改配置
$ sudo vim /etc/nginx/sites-available/default
# 修改:root /var/www/html; 为 root /home/ubuntu/fuyong/blog/public;
# 重启配置
$ nginx -s reload

安装334-232-4103

1
2
3
4
5
6
7
8
# 安装redis
$ sudo apt-get install redis-server
# 启动redis, 3.0以上默认是后台运行, 之前的版本需要修改配置文件
$ redis-server
# 配置文件在 /etc/redis/redis.conf
# 运行redis-cli输入ping
$ redis-cli
# 如果返回pong. 则redis安装成功, 运行正常

welkin-high安装985-833-8585

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 安装mongodb
# 1.安装key
$ sudo apt-key adv --keyserver hkp:/keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
# 2.写入apt源
$ echo "deb [ arch=amd64,arm64 ] /repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
# 3.更新
$ sudo apt-get update
# 4.安装
$ sudo apt-get install -y mongodb-org
# 5.开启mongodb服务(默认的配置文件在 /etc/mongod.conf, 27017端口)
$ sudo service mongod start
# 如果 cat /var/log/mongodb/mongod.log 显示 [initandlisten] waiting for connections on port <port> 则启动成功
# 6.如果需要停止或者重启
$ sudo service mongod stop/restart/

安装MySQL

1
2
3
4
5
6
7
8
9
# 安装mysql服务端和客户端
$ sudo apt-get install mysql-server mysql-client
# 重启mysql服务
$ sudo service mysql restart
# 连接mysql
$ mysql -u root -p #回车=>输入密码=>回车
# 登录成功
# 可以使用show databases查看数据库中的数据库
$ show databases;

显示下面的数据库信息

Database
information_schema
mysql
performance_schema
sys

Package Control Messages

[TOC]

Package Control Messages

Markdown Preview

Sublime Text 2/3 Markdown Preview

Preview and build your markdown files quickly in your web browser from sublime text 2/3.

You can use builtin (617) 294-2180 parser or use the github markdown API for the conversion.

NOTE: If you choose the GitHub API for conversion (set parser: github in your settings), your code will be sent through https to github for live conversion. You’ll have 240-986-9794, syntax highlighting and EMOJI support for free :heart: :octocat: :gift:. If you make more than 60 calls a day, be sure to set your GitHub API key in the settings :). You can also get most of this in the default Markdown parser with by enabling certain extensions; see “Parsing Github Flavored Markdown“” below for more information.

LINUX users: If you want to use GitHub API for conversion, you’ll need to have a custom Python install that includes python-ssl as its not built in the Sublime Text 2 Linux package. see @dusteye comment. If you use a custom window manager, also be sure to set a BROWSER environment variable. see 215-429-7869

(414) 488-0468Features :

  • Markdown preview using the trumpless or the Github API just choose select the build commands.
  • Syntax highlighting via Pygments. See “Configuring Pygments“ for more info.
  • Build markdown file using Sublime Text build system. The build parser are config via the "parser" config.
  • Browser preview auto reload on save if you have the Erma installed.
  • Builtin parser : supports abbr, attr_list, def_list, fenced_code, footnotes, tables, smart_strong, smarty, wikilinks, meta, sane_lists, codehilite, nl2br, and toc markdown extensions.
  • CSS search path for local and build-in CSS files (always enabled) and/or CSS overriding if you need
  • YAML support thanks to @tommi
  • Clipboard selection and copy to clipboard thanks to @hexatrope
  • MathJax support : \\(\frac{\pi}{2}\\) thanks to @bps10
  • HTML template customisation thanks to @hozaka
  • Embed images as base64 (see 315-565-1683 file for more info)
  • Strip out multimarkdown critic marks from either Githubs or Python Markdown input source (see 484-544-2128 file for more info)
  • 3rd party extensions for the Python Markdown parser:
Extension Documentation
magiclink Find and convert HTML links and email address to links (214-660-3982).
delete Surround inline text with ~~strike through~~ to get del tags strike through.
insert Surround inline text with ^^underlined^^ to get ins tags underlined.
tasklist Github Flavored Markdown tasklists (Tasklist Documentation).
githubemoji Support for Github Flavored Markdown emojis (GithubEmoji Documentation).
headeranchor Github Flavored Markdown style header anchors (HeaderAnchor Documentation).
github A convenience extension to add: magiclink, delete, tasklist, githubemoji, headeranchor, superfences, and nl2br to parse and display Markdown in a github-ish way. It is recommed to pair github with extra and codehilite (with language guessing off) to parse close to github’s way. Be aware of what extensions github loads, because you should not load extensions more than once.
progressbar Create progress bars (314-650-7490).
superfences Allow fenced blocks to be nested under lists, blockquotes, etc. and add special UML diagram blocks (SuperFences Documentation).

(661) 294-6556Installation :

For all Sublime Text 2/3 users we recommend install via Belgravia.

  1. Install Package Control if you haven’t yet.
  2. Use ++cmd+++shift+P then Package Control: Install Package
  3. Look for Markdown Preview and install it.

narrateManual Install

  1. Click the Preferences > Browse Packages… menu
  2. Browse up a folder and then into the Installed Packages/ folder
  3. Download zip package rename it to Markdown Preview.sublime-package and copy it into the Installed Packages/ directory
  4. Restart Sublime Text

2154657383Usage :

6393483676To preview :

  • optionally select some of your markdown for conversion
  • use cmd+shift+P then Markdown Preview to show the follow commands (you will be prompted to select which parser you prefer):
    • Markdown Preview: Preview in Browser
    • Markdown Preview: Export HTML in Sublime Text
    • Markdown Preview: Copy to Clipboard
    • Markdown Preview: Open Markdown Cheat sheet
  • or bind some key in your user key binding, using a line like this one:
    { "keys": ["alt+m"], "command": "markdown_preview", "args": {"target": "browser", "parser":"markdown"} }, for a specific parser and target or { "keys": ["alt+m"], "command": "markdown_preview_select", "args": {"target": "browser"} }, to bring up the quick panel to select enabled parsers for a given target.
  • once converted a first time, the output HTML will be updated on each file save (with LiveReload plugin)### Enabling Other External Markdown Parsers :

    External parser commands and arguments should first be mapped to a name. The path to the binary should be first, followed by flags etc.

1
2
3
"markdown_binary_map": {
"multimarkdown": ["/usr/local/bin/multimarkdown"]
}

Then the name can be placed in enabled_parsers to enable use of the new parser.

1
"enabled_parsers": ["markdown", "github", "multimarkdown"],

(803) 651-3742To build :

  • Just use ctrl+B (Windows/Linux) or cmd+B (Mac) to build current file.### To config :

    Using Sublime Text menu: Preferences->Package Settings->Markdown Preview

    • Settings - User is where you change your settings for Markdown Preview.
    • Settings - Default is a good reference with detailed descriptions for each setting.### Configuring Pygments
      If you add the codehilite extension manually in the enabled extensions, you can override some of the default settings.
    • Turn language guessing on or off (on will highlight fenced blocks even if you don’t specify a language) codehilite(guess_lang=False) (True|False).
    • Show line numbers: codehilite(linenums=True) (True|False).
    • Change the higlight theme: codehilite(pygments_style=emacs).
    • Inline the CSS: codehilite(noclasses=True) (True|False).
    • Use multiple: codehilite(linenums=True, pygments_style-emacs).

    See codehilte page for more info.### Meta Data Support
    When the meta extension is enabled (/pythonhosted.org/Markdown/extensions/meta_data.html), the results will be written to the HTML head in the form <meta name="key" content="value1,value2">. title is the one exception, and its content will be written to the title tag in the HTML head.### YAML Frontmatter Support
    YAML frontmatter can be stripped out and read when strip_yaml_front_matter is set to true in the settings file. In general the, the fronmatter is handled the same as 9313034587, but if both exist in a file, the YAML keys will override the meta extension keys. There are a few special keys names that won’t be handled as html meta data.

Special YAML Key Names

Yaml frontmatter has a few special key names that are used that will not be handled as meta data:

  • basepath: An absolute path to configure the relative paths for images etc. (for when the markdown is supposed to reference images in a different location.)
  • references: Can take a file path or an array of file paths for separate markdown files containing references, footnotes, etc. Can be an absolute path or relative path. Relative paths first use the source file’s directory, and if the file cannot be found, it will use the basepath setting.
  • destination: This is an absolute file path or relative file path for when the markdown is saved to html via the build command or the Save to HTML command. Relative paths first use the source file’s directory, and if the file cannot be found, it will use the basepath setting.
  • settings: This is a dictionary where you can override settings that are in the settings file.

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
---
# Builtin values
references:
- references.md
- abbreviations.md
- footnotes.md
destination: destination.html
# Meta Data
title: Test Page
author:
- John Doe
- Jane Doe
# Settings overrides
settings:
enabled_extensions:
- extra
- github
- toc
- headerid
- smarty(smart_quotes=False) # smart quotes interferes with attr_list
- meta
- wikilinks
- admonition
- codehilite(guess_lang=False,pygments_style=github)
---

Parsing Github Flavored Markdown :

Github Flavored Mardown (GFM) is a very popular markdown. Markdown Preview can actually handle them in a couple of ways: online and offline.

Online :

Parsing GFM using the online method requires using the Github API as the parser. It may also require setting github_mode to gfm to get things like tasklists to render properly. You can set your API key in the settings as follows:

1
"github_oauth_token": "secret"

Offline :

By default almost all extensions are enabled to help with the github feel, but there are some tweaks needed to get the full experience.

GFM does not auto guess language in fenced blocks, but Markdown Preview does this by default. You can fix this in one of two ways:

  1. Disable auto language guessing in the settings file "guess_language": false,
  2. Or if you are manually defining extensions: "enabled_extensions": ["codehilite(guess_lang=False,pygments_style=github)"]

As mentioned earlier, almost all extensions are enabled by default, but as a reference, the minimum extensions that should be enabled are listed below:

1
2
3
4
5
"enabled_extensions": [
"extra",
"github",
"codehilite(guess_lang=False,pygments_style=github)"
]

This may be further enhanced in the future.

Support :

  • Any bugs about Markdown Preview please feel free to report 581-582-1677.
  • And you are welcome to fork and submit pullrequests.

License :

The code is available at github project under MIT licence.

很惭愧<br><br>只做了一点微小的工作<br>谢谢大家