Plusaber's Blog

  • Home

  • Tags

  • Categories

  • Archives

Stanford CoreNLP

Posted on 2015-10-08 | In research | Comments:

Stanford CoreNLP

Stanford CoreNLP
The Stanford Natural Language Processing Group
Stanford Log-linear Part-Of-Speech Tagger
Stanford Named Entity Recognizer (NER)
The Stanford Parser: A statistical parser

DBpedia

Posted on 2015-10-08 | In research | Comments:

DBpedia

DBpedia

DBpedia是一項從維基百科裡萃取結構化內容的專案計畫。這些計畫所得的結構化資訊,也將放在網際網路中公開讓人取閱。[1]DBpedia允許使用者查詢跟維基百科相關資源之間的關係與性質,甚至也可查詢從維基百科外連到其他資料組的內容。

維基百科的條目大部分都是沒有固定格式的文字,不過也有部分的資料是屬於結構化的資訊並且被鑲嵌在條目中,像是資訊框的表格內容(也就是預設在桌機版維基百科瀏覽格式,出現在條目右上角出現的欄位,或是行動版維基百科的條目一開始就顯示的欄位。)、分類、圖像、地理座標、以及外部網頁連結。這些結構化的資訊會在此計畫案被提取出來並且將其統一的放在一個資料集裡頭以方便查詢。

2013年9月,DBpedia發佈了第3.9版的更新。[5]如同之前版本的加強,這次也新增了維基百科更多資訊框的比對,同時也新增了維基數據的連結。(透過 owl:sameAs 的連結)。[5]此版的資料組描述了四百萬筆實體(entities),其中有322萬筆實體是在一個連貫的知識本體中進行分類,這些實體包含了832,000位人物、639,000個地景、116,000份音樂專輯、78,000部影片、18,500個電動遊戲、209,000個組織、226,000個物種以及5,600種疾病。[6]。DBpedia資料集提供了最多有119個不同語言的特色標籤以及資料摘要;現總共有2460萬個圖片連結以及2760萬筆連到外部網頁的連結資料、4500萬筆連結到其他RDF格式的資料集、6700萬筆連結到維基百科的分類頁,以及4120萬筆YAGO2分類的資料[6]。DBpedia計畫使用資源描述框架(Resource Description Framework,簡稱RDF)來呈現擷取的資料,目前包含了24.6億筆的RDF triple資料、4700萬從英文版本維基百科上擷取的資料、19.8億則來自其他的語言版本,同時有大約4,500萬的資料連往外部的資料集。[6]

從本資料集,多個頁面之間傳播的資訊可以被擷取,例如某書籍的作者資料,能夠被放在關於此書或關於作者的頁面中。

從維基百科擷取資料其中的一個重大挑戰是,相同概念可能會在資訊框以及其他的模版中被用不同的參數表示,例如|birthplace=以及|placeofbirth=意義相同。在這樣的情況下,查詢人物出生地點就必須要在這兩個參數下都有查詢才能夠得到完整的結果。於是,DBpedia的映對語言就被開發了出來,以幫助映對知識本體裡頭這些定義的異同,進而減少同義詞的重疊。有鑑於維基百科中使用資訊框以及其他數值非常的多元,開發以及改善映對語言的機制是以開源的方式徵求大眾參與[7]。

DBpedia摘取維基百科頁面上的事實資訊,讓使用者可以不用在多個維基百科條目之間瀏覽便找到問題的答案。查詢資料的方式是利用叫做SPARQL(像是SQL一類的查詢語言)來對資源描述框架(RDF)進行查詢。舉例而言,假如你對日本少女漫畫系列東京喵喵感興趣,想要找這位漫畫的繪者所創作的其他作品。DBpedia結合了維基百科上東京喵喵、征海未亞這些條目,以及相關作品諸如麗佳公主以及恋きゅー的資訊。因為DBpedia把這些資料都標準化到單一的資料庫裡頭,下列查詢就能夠在不需具體清楚哪一個條目有包含了哪一部分的片段資訊,就能夠完整的列出相關作品類型:

1
2
3
4
5
6
7
PREFIX dbprop: <http://dbpedia.org/property/>
PREFIX db: <http://dbpedia.org/resource/>
SELECT ?who, ?WORK, ?genre WHERE {
db:Tokyo_Mew_Mew dbprop:author ?who .
?WORK dbprop:author ?who .
OPTIONAL { ?WORK dbprop:genre ?genre } .
}

参考:
DBpedia Home page
DBpedia Wiki
W3C RDF Primer中文版
RDF Schema
YAGO wiki)
SPARQL wiki

DBpedia Spotlight

2010年6月,來自Web Based Systems Group以及柏林自由大學的研究人員開始了一個叫做「DBpedia Spotlight」的計畫,開發工具來將文字資料中使用DBpedia資源的部份加上註解。這個工具解決了過去透過DBpedia連結非結構化資訊來源到開放連結資料雲的問題。DBpedia Spotlight可展示已命名實體擷取(named entity extraction)、包含實體偵測(entity detection)以及命名衝突化解(name resolution)(也就是消歧義(disambiguation))。此工具也能在其他資訊擷取(information extraction)任務中,用來進行命名實體辨識(named entity recognition)。DBpedia Spotlight聚焦在多種不同用途的客製應用。不去聚焦於少部分的實體類型,此計畫試圖支援全部DBpedia上來自超過320個不同分類裡,共約三百五十萬個實體與概念。

DBpedia Spotlight可公開獲取,是以一個為了測試用途而提供的網路服務,或者也可以從Apache授權的Java/Scala API。DBpedia Spotlight分配也包含了一jQuery插件,此插件允許開發人員在網路上的任何一頁加上註解,只要在他們的頁面上增加一行文字即可[18]用戶端也有Java或PHP的支援應用[19]。此工具可從其展示頁(demo page)裡,處理多種的英語資料[20]以及網路服務。國際化的支援部分,只要此語言有開維基百科即可支援[21]。

Home
Demo

Redis(2)

Posted on 2015-10-06 | In Developing | Comments:

事务

redis中的事务(transaction)和传统关系型数据库中的事务一样,是一组命令的集合。事务同命令一样都是redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。

1
2
3
4
5
6
MULTI

SADD "user:1:following" 2
SADO "user:2:following" 1

EXEC

在执行到EXEC之前,前面的命令并不会马上执行,而是添加到等待执行的事务队列中。如果在EXEC之前事务中断,则事务的所有命令都不会被执行,一旦发送了EXEC命令,所有命令都一定会被执行。

另外redis事务还保证一个事务内的命令依次执行而不被其他命令插入,也就是在多个客户端的情况下,一旦某个客户端开始执行某个事务,到结束之前,其他客户端的命令都不会被执行。

错误处理

  • 语法错误
    事务所有命令都不会被执行。

  • 运行错误。比如使用散列类型的命令操作集合类型的键。这种错误在事务中会被接受并继续执行,也就是即使某条命令出现允许错误,其后面的命令还是会被执行,整个事务会被完成。

需要注意的是,redis不支持rollback。

WATCH命令

很多情况下我们需要保证在我们获得某个键值后,该键值不能被其他客户端修改,直到当前客户端执行事务完成,这时我们可以使用WATCH。WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会被执行(与事务的最后一条性质相违背?没有!!)。监控一直持续到EXEC命令(监控可以在MULTI之前进行,从那时就开始监控,事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控,也就是WATCH作用是,从WATCH开始,到MULTI中间,如果被watch的键被修改,那么这个事务不会被执行)。

1
2
3
4
5
6
7
8
SET key 1
WATCH key
SET key 2
MULTI
SET key 3
EXEC

GET key # 结果是2

执行EXEC命令后会取消对所有键的监控,也可以 用UNWATCH命令来取消监控。

生存时间

在redis可以使用EXPIRE命令设置一个键的生存时间,到时间后redis会自动删除。

1
2
3
4
5
6
EXPIRE key seconds # 返回1表示设置成功,0表示失败
EXPIRE session:29e3d 900

TTL key # 还有多少时间会被删除(秒),-1表示键不存在或没有设置时间

PERSIST key# 取消生存时间设置(恢复为永久保存)

除了PRESIST外,使用SET或GETSET命令赋值也同时回清除键的生存时间(恢复为永久)。其他命令只对键值进行操作的命令(INCR,LPUSH,HSET,ZREM)都不会影响键的生存时间。

1
PEXPIRE key 1000 # 毫秒位单位

实现缓存

为了提高性能和负载能力,我们通常需要将一些访问频率较高或者计算密集的数据结果缓存起来,并希望这些数据能根据具体访问情况自动更新或过期(性能和有效的内存利用)。由于内存有限,我们不可能无限的将所有数据缓存在内存中,需要按照一定的规则淘汰不需要的缓存键,通过配置文件的maxmemory参数我们可以设置redis最大可用内存大小,超出这个限制时redis回根据maxmemory-policy参数指定的策略删除一些键以空出空间。

rule explaination
volatile-lru 使用LRU算法删除一个键(只对设置了生存时间的键)
allkeys-lru 使用LRU算法删除一个键
volatile-random 随见删除一个键(只对设置了生存时间的键)
allkeys-lru 随机删除一个键
valatile-ttl 删除生存时间最近的一个键
noeviction 不删除键,返回错误

排序

  • 有序集合
  • SORT命令

SORT可以对集合,列表和有序集合类型进行排序(在对有序集合排序时会忽略元素的分数,只针对元素自身的值进行排序,如数字是根据数字大小,还可以通过ALPHA参数实现按照字典顺序排列非数字元素),使用DESC可以实现将元素从大到小排序。

1
2
3
4
SORT tag:ruby:posts
SORT myzset

SORT mylistalpha ALPHA DESC

另外SORT还支持LIMIT offset count的用法
SORT tag:ruby:posts DESC LIMIT 1 2

  • BY参数

很多时候列表,集合等中存储的元素值代表的是对象ID,单纯对这些ID排序意义不大,我们需要根据ID对于的对象的某个属性进行排序,这时我们可以使用BY参数。BY 参考键,其中参考键可以是字符串类型键或者是散列类型的某个字段
(表示为键名->字段名)。如果提供了BY参数,SORT命令不在根据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个*并获取其值,用以进行排序。

1
SORT tag:ruby:posts BY post:*->time DESC

除散列类型外,参考键还可以是字符串类型:

1
SORT list my itemscore:* DESC

当某个元素的参考键不存在时,会默认参考键值为0.

  • GET参数

GET参数不影响排序,它的作用是使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值。GET参数的规则和BY参数一样,也支持字符串类型和散列类型的键,并同样使用*作为占位符。另外在一个SORT 命令中可以有多个GET参数(而BY参数只能有一个)。

SORT tag:ruby:posts BY post:*->time DESC GET post:*title GET post:*->time GET #

有N个GET参数,每个元素返回的结果就有N行。使用#作为参数可以返回键值本身。

  • STORE参数

可以将排序结果使用STORE保存,返回结果为保存结果个数。

SORT tag:ruby:posts BY post:*->time DESC GET post:*title GET post:*->time GET # STORE stor.result

  • 性能优化

消息通知

任务队列

两类实体:生产者和消费者,生产者会将需要处理的任务放入任务队列中,而消费者不断地从任务队列中读入任务信息并执行。使用任务队列可以实现松耦合,使得生产者和消费者都可伸缩,并且在访问量急剧增加的情况下可以根据系统资源情况削峰,降低负载。

使用redis实现任务队列

最基本使用redis的列表类型,生产者使用LPUSH加入任务,消费者使用RPOP取出任务并执行(while不断循环,可设置间隔时间)。

上面的一个确定是消费者需要不断调用RPOP查看是否存在新任务,带了额外的负载压力。我们可以通过BRPOP实现一旦有新任务就通知消费者,消费者在调用BRPOP之后,如果没有任务则会阻塞,知道有新任务加入。

1
BRPOP queue 0 # 0表示一直阻塞,其他表示只会阻塞一定时间

优先级队列

有时一个消费者可能能处理相同类型的不同任务,但优先级不同。如VIP客户的订单处理和普通客户的订单处理,可以将不同类型的客户的订单存在不同队列中。BRPOP命令可以同时接收多个键,并处理第一个存在任务的队列的任务。

『发布/订阅』模式

除了任务队列以外,redis还提供了一组命令可以让开发者实现”发布/订阅”模式。”发布/订阅”模式同样可以实现进程间的消息传递:订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定频道发送消息,所有订阅此频道都会收到该消息。

发布者发布消息:

1
PUBLIC channel.1 hi

订阅频道的命令是SUBSCRIBE,可以同时订阅多个频道。

1
SUBSCRIBE channel.1

进入订阅状态后客户端可能会收到三种类型的回复。每种类型的回复都包含三个值。第一个值是消息的类型,根据消息类型的不同,第二、第三个值的含义也不同。

三种类型:

  • 第一个值为”subsribe”。表示订阅成功的反馈信息,第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量。
  • 第一个值为”message”。一般这种类型是我们关心的,表示接受到的消息。第二个值表示频道名称,第三个值表示消息的内容。
  • unsubscribe,表示成功取消订阅频道。

使用UNSUBSCRIBE命令可以取消订阅指定的频道,如果不指定参数则会取消所有订阅频道。

1
UNSUBSCRIBE channel1 channel2 ...

按照规则订阅

PSUBSCRIBE支持通配符匹配:

1
2
3
4
5
6
PSUBSCRIBE channel.?*

1) pmessage
2) channnel.?*
3) channel.1
4) "hi!"

PUNSUBSCRIBE可以退订指定的规则。

管道

Redis(1)

Posted on 2015-10-02 | In Developing | Comments:

Introduction

Key-value数据库

Redis是一个key-value数据库,区别与传统的关系型数据库。
比如一篇文章在redis存储如下:

1
2
3
4
# var["key"] = "value"
doc["title"] = "hello, , world"
doc["author"] = "chen"
doc["tags"] = ["blog", "hello"]
  • 这样存储也与实际doc结构相一致,更加容易操作,而在mysql存储则需要建立一个表存储doc的基本信息,为了表示tags,需要建立第二表存储tags,还需要第三个表连接doc和tags。
  • 并且key-value数据库可以随时给doc增加属性,且每篇doc属性可以不同,而mysql中需要预先定义好doc的属性,每篇doc都必须有相同的属性,在属性非常稀疏或者经常需要添加之前无法预定义的属性时,mysql等关系型数据库将难以处理。
  • 另外当存在海量的docs时,在关系型数据库中将表示为一张巨大的表,会给索引和检索都带来很大的负担,效率会降低,同时单台机器无法存下过大的表,而垂直增加单台机器的性能是一种很不经济的方式,通过水平扩展增加机器数量是一种更好的解决方案,然而mysql传统关系型数据库对于partition的支持是很差的,难以容易scale。而key-value数据库对于水平扩展具有先天的优势,只需将增加机器,然后将单个单个的文档重新划分到这些机器上,非常容易扩展。

这些都是key-value数据库的优势,在处理互联网上海量但是非结构化的数据具有很大的优势。key-value数据库对于不同应用和需求也有很多种,如MongoDB,Cassandra,Dynamo等。

内存存储与持久化

Redis数据库种所有数据都存储在内存种,所以速度非常快,另外redis同时也提供了对持久化的支持,可以将内存的数据异步写到磁盘中。

另外redis虽然是作为数据库开发的,但是由于其基于内存且提供了很多强大的功能,可以很容易将其用于缓存,队列系统等。

安装和启动

Installation

  • 到官网下载当前版本。
  • 解压并编译
1
2
3
$ tar xzf redis-3.0.7.tar.gz
$ cd redis-3.0.7
$ make

启动redis server。

$ src/redis-server
也可以将redis-server命令直接加入到系统路径里,或者将redis-server复制到/usr/bin/下,这样后面启动redis server就不需要切换到redis目录中。

1
2
3
4
5
6
# /usr/local/redis-3.0.7 redis安装目录
vi ~/.bash_profile #或者其他系统环境文件
# 添加:
PATH="$PATH":/usr/local/redis-3.0.7/src

source ~/.bash_profile

redis默认使用6379端口监听,可以通过--port参数设置。

redis-server --port 6000

另外一种方式是使用初始化脚本启动redis。redis目录下utils目录下有一个redis_init_script的默认初始化脚本,我们可以对其修改以满足我们的需要。

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
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid # pid文件位置
CONF="/etc/redis/${REDISPORT}.conf" # 即是这个脚本文件文件名,可以复制到不同位置以进行启动,但是/etc/redis/目录下必须要要有一份
# /var/redis/端口号 持久化文件存放位置

case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac

之后可以启动如下:

redis_6000 start # redis_6000 即是上面脚本文件的文件名

另外如果需要更多的配置,如端口号,持久化文件存放地址等,最好的方式是启动时指定配置文件。

1
redis-server /path/to/redis/conf

通过启动参数传递同名的配置选项会覆盖配置文件中相应的参数。

server交互

之后可以通过命令行终端或者编程语言接口与server交互。

1
2
3
4
5
6
7
8
9
$ redis-cli
# redis-cli -h 127.0.0.1 -p 6000 如果需要指定服务所在地址和端口

# PING 测试连接是否正常

redis> set foo bar
OK
redis> get foo
"bar"

停止redis

redis-cli SHUTDOWN

基本使用(命令行终端)

redis实例与数据库

一个redis实例以默认的配置启动后,提供了多个字典(数据库),客户端可以指定将数据存在哪个数据库中。每个数据库使用一个数字来表示(不支持数据库命名,不同数据库没有不同的访问密码,另外数据库并不是完全隔离的,所以redis里的数据库更像是一种命名空间,所以一个redis实例不适合存储不同应用程序的数据),默认有16个数据库,可以通过配置参数databases来修改。默认会直接进入0号数据库,可以通过SELECT更换数据库。

1
SELECT 1

键操作命令

  • 获得符合规则的键名列表
    KEYS pattern # 不区分大小写,可以使用正则表达式

一些简单的通配符规则:

sign meaning
? 任意一个字符
? 任意个字符
[] 匹配括号内的任意一个字符,可以使用”-“表示区间,如[a-zA-z]
\x 转义通配符
  • 判断键是否存在
    EXISTS key
    如果存在则返回整数类型1,否则返回0

  • 删除键
    DEL key1 key2 key3 ... # 可以一次删除多个键

del命令参数不支持通配符,但是可以结合linux管道和xargs命令实现删除所有符合规则的键,如:
redis-cli KEYS "*" | xargs redis-cli DEL
或者以符合规则的键作为参数:
redis-cli DEL `redis-cli’ KEYS “*” ` # 注意这个一个linux嵌入命令,不是单引号。

  • 获得键值的数据类型
    TYPE key
    返回值可能为string, hash, list, set, zset(有序集合类型)

基本操作命令

  • 赋值与取值
1
2
SET key value
GET key
  • 递增递减数字
1
2
3
4
5
6
7
8
9
INCR key # 必须为整数类型

INCRBY key increment
INCRBY bar 2

DECR key
DECYBY key decrement

INCRBYFLOAT key increment # 双精度浮点数增加
  • 追加
1
2
SET key hello
APPEND key " world" # 如果不存在就相当于SET
  • 字符串长度

STRLEN key

  • 同时获取/设置多个键值
1
2
MGET key1 key2 ... 
MSET key1 value1 key2 value2 ...
  • 位操作
1
2
3
4
GETBIT key offset # 可以对字符串操作
SETBIT key offset value
BITCOUNT key [start] [end] # 1的个数
BITOP operation destkey key1 key2 ...

散列类型

散列类型适合存储对象,使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值(除了散列类型,redis的其他数据类型同样不支持数据类型嵌套,如集合类型的每个元素都只能是字符串,不能是另一个集合或散列)。

  • 赋值与取值
1
2
3
4
5
6
7
8
9
HSET key field value
HGET key field

HMSET key field1 value1 field2 value2
HMGET key field1 field2
HGETALL key

HSET car price 500
HSET car name BMW

redis中每个键都属于一个明确的数据类型,如通过HSET命令建立的键是散列类型,通过SET命令建立的键是字符串类型等。

  • 判断字段是否存在
1
2
3
HEXISTS key field

HEXISTS car name
  • 当字段不存在时赋值
1
HSETNX key field value
  • 增减数字
1
2
3
HINCRBY key field increment

HINCRBY car price 100 # 如果键不存在,则会建立
  • 删除字段
1
HDEL key field1 field2 ...
  • 获取字段名或字段值(属性值),字段数量
1
2
3
HKEYS key
HVALS key
HLEN key

列表类型

列表类型list可以存储一个有序的字符串列表,常用操作是向列表两段添加元素,或者获得列表的一个片段。redis中列表是使用双向链表实现,头尾添加删除很快,注意索引访问速度会比较慢,特别是访问中间的元素。

  • 向两端加入元素
1
2
3
4
5
6
7
8
LPUSH key value1 value2 ...
RPUSH key value1 value2 ...

LPUSH nums 1
LPUSH nums 2 3
# 3 2 1
RPUSH nums 0 -1
# 3 2 1 0 -1
  • 从列表两端弹出元素
1
2
LPOP key
RPOP key
  • 获取列表中元素的个数

LLEN key # O(1)

  • 获取片段
1
2
3
LRANGE key start stop # first element 0

LRANGE nums -2 -1 # -1, 最右边的第一个元素...
  • 删除指定值
1
2
LREM key count value # 删除列表中前count个值为value的元素
# count<0从右边开始删除,count=0删除所有

集合类型

集合使用hashset实现。

  • 增加/删除元素
1
2
SADD key member1 member2 ... # 返回新增成功的个数
SREM key member1 member2 ... # 返回删除成功的个数
  • 获得所有元素
    SMEMBERS key

  • 判断是否存在
    SISMEMBER key member

  • 集合间运算

1
2
3
4
5
6
7
SDIFF key1 key2 ...
SINTER key1 key2 ...
SUNION key1 key2 ...

SDIFFSTORE destination key1 key2...
SINTERSTORE destination key1 key2...
SUNIONSTORE destination key1 key2...
  • 元素个数
    SCARD key

  • 随机获得集合元素
    SRANDMEMBER key [count]

  • 随机弹出一个元素
    SPOP key

有序集合类型

sorted set,每个元素具有分数(权值)的set,如果将当分数设为index大小,则可以实现list的功能。

  • 增加元素
    ZADD key score1 member1 score2 ...

  • 获得元素的分数
    ZSCORE key member

  • 获得排名在某个范围内的元素列表
    ZRANGE key start stop [WITHSCORES] # 分数从小到大
    Zrevrange key start stop [WITHSCORES] # 分数从大到小

  • 获得指定分数范围

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

  • 增加某个元素的分数

ZINCRBY key increment member

Markdown简明语法手册

Posted on 2015-09-16 | In Blogging | Comments:

[Markdown语法]

一个很好的编辑器及语法简明手册,不过并不是所有都兼容其他编辑器或博客。这里对参考Cmd Markdown对常用及兼容的子集进行了总结,完整内容请参考Cmd Markdown。

Mac下另一个强大的编辑器是MacDown,支持PDF导出。

1. 字体

使用 和 * 表示斜体和粗体。也可以使用HTML标签属性修改颜色。

*斜体*,**粗体**。

斜体,粗体。

2. 分级标题

在行的开头加#号表示标题,数量表示标题级别, 如:# H1, ## H2, ### H3,#### H4。
或者在行的下方使用 === 表示一级标题,使用 —- 表示二级标题。

3. 外链接

使用 [描述](链接地址) 为文字增加外链接。

[leetcode](https://leetcode.com/problemset/algorithms/)
leetcode

4. 无序列表

使用 *,+,- 表示无序列表。

1
2
3
- hello1
- hello2
- hello3
  • hello1
  • hello2
  • hello3

5. 有序列表

使用数字和点表示有序列表。

1
2
3
1. hello1
2. hello2
3. hello3
  1. hello1
  2. hello2
  3. hello3

6. 文字引用

使用 > 表示文字引用。

> 野火烧不尽,春风吹又生。

野火烧不尽,春风吹又生。

7. 行内代码块

使用 `代码` 表示行内代码块。

1
Hello, `word`。

Hello, word。

8. 插入图像

使用 ![描述](图片链接地址) 插入图像。

示例:
![hello](http://plusaber.net/images/plusaber.jpg)

hello

9. 内容目录

在段落中填写 [TOC] 以显示全文内容的目录结构。NextT似乎是不支持,无法展示。

[TOC]

10. 标签

标签格式在各个编辑器是有些不兼容的。

Cmd编辑器为:
Tags: 数学 英语 Markdown

对于NextT为:
tags: [leetcode, dynamic programming, unique paths]

11. 目录

目录也存在兼容问题,cmd貌似不兼容

NexT为:
categories: Blogging

12. 删除线

使用 ~~ 表示删除线。

~~这是一段错误的文本。~~

这是一段错误的文本。

13. 注脚

使用 keyword 表示注脚。NextT似乎是不支持,无法展示。

注脚[^footnote]的样例。

注脚footnote的样例。

14. LaTeX 公式

$ 表示行内公式:

质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。

一个不错的介绍Mathjax与LaTex公式简介。

或者参考MathJax。

14. 加强代码块

非代码示例:

1
$ sudo apt-get install vim-gnome

Python 示例:

1
2
3
4
5
6
7
8
9
10
11
12
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None

class SomeClass:
pass

>>> message = '''interpreter
... prompt'''

15. 表格支持

1
2
3
4
5
| 项目        | 价格   |  数量  |
| -------- | -----: | :----: |
| 计算机 | \$1600 | 5 |
| 手机 | \$12 | 12 |
| 管线 | \$1 | 234 |
项目 价格 数量
计算机 $1600 5
手机 $12 12
管线 $1 234

16. Html 标签

1
2
3
4
5
6
7
8
9
10
11
12
13
<table>
<tr>
<th rowspan="2">值班人员</th>
<th>星期一</th>
<th>星期二</th>
<th>星期三</th>
</tr>
<tr>
<td>李强</td>
<td>张明</td>
<td>王平</td>
</tr>
</table>
值班人员 星期一 星期二 星期三
李强 张明 王平
footnote. 这是一个 注脚 的 文本。 ↩
1…456…17
Plusaber

Plusaber

Plusaber's Blog
82 posts
12 categories
22 tags
Links
  • LinkedIn
  • Indeed
  • Baito
  • Kaggle
© 2014 – 2019 Plusaber
Powered by Hexo v3.8.0
|
Theme – NexT.Mist v7.1.1