Info

Logstash 是一个应用程序日志、事件的传输、处理、管理和搜索的平台。 你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计。

Logstash 现在是 ElasticSearch 家族成员之一。 Logstash 本身提供了强大的存储、查询和分析日志的功能(实际是嵌入了 ElasticSearch 和 Kibana)。但当配 ElasticSearch(后端数据存储) 和 Kibana(前端展示) 使用时,它做的就是传输日志的苦事。

下图(来至1.3.*前的官方文档)展示 Logstash、ElasticSearch 和 Kibana(Web Interface) 的关系。

这里主要使用了 redis 的 list data type,然后通过 BLPOP 来取出消息,shipper 会把消息传递到 redis 的 list 中,然后通过 indexer 从 redis 中取出消息,再导入导 ElasticSearch 中或者直接 stdout。 因此,redis 只是作为了传递者的角色,本身并不存储数据。

Logstash 本身没有分 shipper 以及 indexer 的,这两种角色只是配置不同。

Required

  • jre 7+
  • 必需指定 JAVA_HOME

Install

下载并解压

curl -O https://download.elasticsearch.org/logstash/logstash/logstash-{logstash_version}.tar.gz
tar -zxvf logstash-{logstash_version}.tar.gz

运行

cd logstash-{logstash_version}
bin/logstash -e 'input { stdin { } } output { stdout {} }'

上面例子,使用的是标准输入/输出。

或则通过配置文件启动

bin/logstash -f my.conf

其中 my.conf 文件内容为 'input { stdin { } } output { stdout {} }'

Configuring

配置文件的结构

Logstash 的配置文件一般如下:

# 这是注释
# 下面是配置内容
input {
	# 从哪里获取日志
  	...
}

filter {
	# 对获取的日志进行处理
	...
}

output {
	# 将处理后的日志输出至哪
	...
}

配置文件分3部分,每部分都可以配置一个或多个 Plugins(插件),并通过 Plugins 来完成所需功能。 其中可以没有 filter 部分,并且 filter 部分的插件是按配置时的顺序执行的。

Plugins

Logstash 提供了很多插件来完成不同的功能。 同时我们可以开发自己的插件(详见官方文档)来完成特定的功能。

常用插件:

Input Plugins

  • stdin: 从标准输入中获取日志
  • file: 从文件中获取日志
  • syslog
  • eventlog: 从window日志中获取日志
  • redis: 从redis中获取日志

filter Plugins

  • grok: 解析和结构化日志信息(从日志信息中提取有用的信息,如: Filed)。help to build patterns
  • date: 解析日期
  • drop: 丢弃特定的日志记录
  • mutate
  • clone
  • multiline: 处理多行日志

Output Plugins

  • stdout: 将日志输出至标准输出
  • elasticsearch: 将日志输出至elasticsearch
  • file: 将日志输出至文件
  • redis: 将日志输出至redis

Codec Plugins

  • plain
  • json
  • rubydebug
  • multiline: 多行处理

其中 Codec Plugins 用于如何展示数据的,它是可以在 Input Plugins 和 Output Plugins 中使用。

Filed(属性)

Logstash 将日志记录解析成多个 Filed 。 可以通过 Plugins 定义 Filed。 可以在配置文件中通过[filedname][top-level field][nested field]方式引用 Filed 。

Conditionals(条件语句)

The conditional syntax is:

if EXPRESSION {
  ...
} else if EXPRESSION {
  ...
} else {
  ...
}

You can use the following comparison operators:

  • equality: ==, !=, <, >, <=, >=
  • regexp: =~, !~
  • inclusion: in, not in

The supported boolean operators are:

  • and, or, nand, xor

The supported unary operators are:

  • !

参考

Read More

Ioc

//TODO

context:annotation-config

//TODO

web mvc

请求处理流程

DispatcherServlet –> HandlerMapping –> DispatcherServlet –> HandlerAdapter –> Handler(Controller) –> HandlerAdapter(ModelAndView) –> DispatcherServlet(ModelAndView) –> ViewResolver –> DispatcherServlet –> View

  • HandlerMapping 接口的实现类: SimpleUrlHandlerMapping,DefaultAnnotationHandlerMapping;
  • HandlerAdapter 接口的实现类: AnnotationMethodHandlerAdapter;
  • Controller 接口: 添加了 @Controller 注解的类就可以担任控制器的职责;
  • ViewResolver 接口的实现类: UrlBaseViewResolver,InternalResourceViewResolver(加入了JSTL的支持);
  • View 接口: JstlView;
  • 其他相关接口/类: HandlerInterceptor(拦截器),LocalResolver(本地化解析),ThemeResolver(主题解析),MultipartResolver(文件上传解析),HandlerExceptionResolver(异常处理,实现类:SimpleMappingExceptionResolver),ModelAndView,RequestToViewNameTranslator,FlashMapManager;

DispatcherServlet

前置控制器,是一个Servlet,配置在web.xml文中。 主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

  1. 文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
  2. 通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
  3. 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
  4. 通过ViewResolver解析逻辑视图名到具体视图实现;
  5. 本地化解析;
  6. 渲染具体的视图等;
  7. 如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

DispatcherServlet中各个接口的默认Bean实现信息配置在org.springframework.web.servlet包中的DispatcherServlet.properties文件里。

配置

web.xml 中声明 DispatcherServlet

<servlet>
	<servlet-name>chapter2</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>chapter2</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

该DispatcherServlet默认使用WebApplicationContext作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”。

DispatcherServlet也可以配置自己的初始化参数,覆盖默认配置:

contextClass: 实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。 如果这个参数没有指定, 默认使用XmlWebApplicationContext。

contextConfigLocation: 传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。 这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。

namespace: WebApplicationContext命名空间。默认值是[server-name]-servlet。

因此我们可以添加初始化参数,如下:

<servlet>
	<servlet-name>springServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring-mvc.xml
			/WEB-INF/spring-service.xml
			/WEB-INF/spring-data.xml
			/WEB-INF/spring-security.xml
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>springServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

web.xml 中配置上下文载入器(旧版Servlet2.3容器使用ContextLoaderListener)

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
	  classpath:spring-common-config.xml,
	  classpath:spring-budget-config.xml
  </param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

如上配置是Spring集成Web环境的通用配置;一般用于加载除Web层的Bean(如DAO、Service等),以便于与其他任何Web框架集成。 contextConfigLocation:表示用于加载Bean的配置文件; contextClass:表示用于加载Bean的ApplicationContext实现类,默认WebApplicationContext。

控制器

2.5之后 spring 默认推荐使用注解,而不再使用”接口继承”去实现控制器.

相关注解

  • @Controller : 用于定义controller类;
  • @RequestMapping : 请求到controller功能方法的映射规则;
  • @RequestParam : 请求参数到controller功能处理方法参数上的绑定;
  • @ModelAttribute : 请求参数到命令对象的绑定;
  • @SessionAttributes : 用于声明session级别存储的属性,放置在controller类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
  • @InitBinder : 自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
  • @CookieValue : cookie数据到controller功能处理方法参数上的绑定;
  • @RequestHeader : 请求头(header)数据到controller功能处理方法参数上的绑定;
  • @RequestBody : 请求的body体的绑定(通过HttpMessageConverter进行类型转换);
  • @ResponseBody : controller功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
  • @ResponseStatus : 定义controller功能处理方法/异常controller返回的状态码和原因;
  • @ExceptionHandler : 注解式声明异常controller;
  • @PathVariable : 将URI模板中的变量绑定到controller功能处理方法的参数上,从而支持RESTful架构风格的URI;
  • @MatrixVairable;

新的 HandlerMapping 和 HandlerAdapter

Spring 3.1 使用新的 @Contoller 和 @RequestMapping 注解支持类:处理器映射 RequestMappingHandlerMapping 和处理器适配器 RequestMappingHandlerAdapter 组合来代替 Spring2.5 开始的处理器映射 DefaultAnnotationHandlerMapping 和处理器适配器 AnnotationMethodHandlerAdapter.

相关配置

<context:component-scan>: 扫描并注入组件(@Service,@Repository,@Component)/Bean/控制器等

<mvc:annotation-driven />: 相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,是spring MVC为@Controllers分发请求所必须的。 并提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。

<mvc:interceptors/>:

<mvc:default-servlet-handler/>: 找不到的请求映射到默认的servlet

<mvc:resources />(spring3.0.4提供):

拦截器

常见应用场景

  • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
  • 权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
  • 性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
  • OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。

…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。

接口

HandlerInterceptor

  • preHandle 方法: 调用Controller前;
  • postHandle 方法: 渲染视图前;
  • afterCompletion 方法: 渲染视图完毕,且 preHandler 返回 true;

拦截器适配器

HandlerInterceptorAdapter

配置

  • 方式1
<mvc:interceptors>
	<bean class="com.app.mvc.MyInteceptor" />
</mvc:interceptors>
  • 方式2
<mvc:interceptors >
	<mvc:interceptor>
		<mvc:mapping path="/user/*" />
		<bean class="com.mvc.MyInteceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>
  • 方式3
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
	<property name="interceptors">
		<list>
			<ref bean="handlerInterceptor1"/>
			<ref bean="handlerInterceptor2"/>
			...
			<ref bean="handlerInterceptorn"/>
		</list>
	</property>
</bean>

异常处理

视图


Read More

1. info

项目主页:http://webmagic.io/

2. vs Scrapy

2.1. Selector

两个框架都有Selector对象,不同在于,WebMagic返回的是Selectable对象,而Scrapy返回的是SelectorList可迭代对象.

开始使用Scrapy时还不是很理解为什返回可迭代对象的,当使用WebMagic爬取表格时,发现它只能按列爬取,而不能按行爬取,当需要对行进行再处理时,WebMagic就显得很麻烦了. 而因为Scrapy返回的时可迭代对象,所以是可以按行进行处理的.

// WebMagic 只能一列一列处理
Page.getHtml.xpath("//tr/td[1]")
Page.getHtml.xpath("//tr/td[2]")

// Scrapy 能一行一行处理
trs = response.xpath("//tr")
for tr in trs:
	tr.xpath("td")
	...

WebMagic 0.5.2 已经多了个Selectable.nodes()方法,可以返回可迭代的对象了.但仍然有些错误存在.

2.2.


A. 参考

Read More

1. Info

HttpComponents 也就是以前的httpclient项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议。 不过现在的 HttpComponents 包含多个子项目,有:

  • HttpComponents Core
  • HttpComponents Client
  • HttpComponents AsyncClient
  • Commons HttpClient

以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页

  • 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
  • 支持自动转向
  • 支持 HTTPS 协议
  • 支持代理服务器等
  • 支持Cookie

2. 安装

使用Maven管理

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>${httpcomponents.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpmime</artifactId>
	<version>${httpcomponents.version}</version>
</dependency>

3. 使用

3.1 基本使用

略。。。

3.2 Fluent方式

HttpClient在4.2版本开始增加了Fluent方式来使用,使代码更简洁。

URI uri = URI.create("http://www.sina.com");
Request request = Request.Post(uri).bodyForm(
		Form.form().add("username", "zhangsan")
			.add("pasword", "pwd")
			.build());
request.addHeader("User-Agent", "Ahopedog/5.0 (Linux NT 5.1; rv:5.0) Gecko/20100101 FireDog/5.0");
request.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");

参考

Read More

1. Info

项目主页:Commons-Lang :

Commons项目中用来处理Java基本对象方法的工具类包,可以简化很多平时经常要用到的写法,例如判断字符串是否为空等等。

3.0 开始jar改为Commons-lang3

2. 结构

3.0 之前共有如下8个包:

  • org.apache.commons.lang 主要是一些高度重用的Util类;
  • org.apache.commons.lang.builder 包含了一组用于产生每个Java类中都常使用到的toString()、hashCode()、equals()、compareTo()等等方法的构造器;
  • org.apache.commons.lang.enum 已不建议使用;
  • org.apache.commons.lang.enums 代替 lang.enum 包,用于处理枚举;
  • org.apache.commons.lang.exception 用于处理Java标准API中的exception,为1.4之前版本提供Nested Exception功能;
  • org.apache.commons.lang.math 用于处理数字;
  • org.apache.commons.lang.mutable 于包装值型变量;
  • org.apache.commons.lang.reflect Accumulates common high-level uses of the java.lang.reflect APIs.
  • org.apache.commons.lang.text Provides classes for handling and manipulating text, partly as an extension to java.text.
  • org.apache.commons.lang.time 提供处理日期和时间的功能。

3.0 增加如下包:

3. 常用类

  • ArrayUtils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;
  • BitField – 用于操作位元,提供了一些方便而安全的方法;
  • BooleanUtils – 用于操作和转换boolean或者Boolean及相应的数组;
  • CharEncoding – 包含了Java环境支持的字符编码,提供是否支持某种编码的判断;
  • CharRange – 用于设定字符范围并做相应检查;
  • CharSet – 用于设定一组字符作为范围并做相应检查;
  • CharSetUtils – 用于操作CharSet;
  • CharUtils – 用于操作char值和Character对象;
  • ClassUtils – 用于对Java类的操作,不使用反射;
  • ObjectUtils – 用于操作Java对象,提供null安全的访问和其他一些功能;
  • RandomStringUtils – 用于生成随机的字符串;
  • SerializationUtils – 用于处理对象序列化,提供比一般Java序列化更高级的处理能力;
  • StringEscapeUtils – 用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码;
  • StringUtils – 处理String的核心类,提供了相当多的功能;
  • SystemUtils – 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断;
  • Validate – 提供验证的操作,有点类似assert断言;
  • WordUtils – 用于处理单词大小写、换行等。
  • HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
  • Fraction - 处理分数的类;
  • NumberUtils - 处理数值的类;
  • DateFormatUtils – 提供格式化日期和时间的功能及相关常量;
  • DateUtils – 在Calendar和Date的基础上提供更方便的访问;
  • DurationFormatUtils – 提供格式化时间跨度的功能及相关常量;
  • FastDateFormat – 为java.text.SimpleDateFormat提供一个的线程安全的替代类;
  • StopWatch – 是一个方便的计时器。

4. 类详细说明

4.1. StringUtils

  • IsEmpty/IsBlank - 检查字符串是否包含文本
  • Trim/Strip - 移除首/尾的空格(Trim移除字符编码小于等于32的字符)
  • Equals - 比较两个字符串(null-safe)
  • startsWith - check if a String starts with a prefix null-safe
  • endsWith - check if a String ends with a suffix null-safe
  • IndexOf/LastIndexOf/Contains - null-safe index-of checks
  • IndexOfAny/LastIndexOfAny/IndexOfAnyBut/LastIndexOfAnyBut - index-of any of a set of Strings
  • ContainsOnly/ContainsNone/ContainsAny - does String contains only/none/any of these characters
  • Substring/Left/Right/Mid - null-safe substring extractions
  • SubstringBefore/SubstringAfter/SubstringBetween - substring extraction relative to other strings
  • Split/Join - splits a String into an array of substrings and vice versa
  • Remove/Delete - removes part of a String
  • Replace/Overlay - Searches a String and replaces one String with another
  • Chomp/Chop - removes the last part of a String
  • AppendIfMissing - 向字符串添加后缀字符,如果后缀不存在
  • PrependIfMissing - 向字符串添加前缀字符,如果前缀不存在
  • LeftPad/RightPad/Center/Repeat - 使用指定字符串填充
  • UpperCase/LowerCase/SwapCase/Capitalize/Uncapitalize - changes the case of a String
  • CountMatches - counts the number of occurrences of one String in another
  • IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable - checks the characters in a String
  • DefaultString - protects against a null input String
  • Reverse/ReverseDelimited - reverses a String
  • Abbreviate - 使用省略号缩减字符串
  • Difference - compares Strings and reports on their differences
  • LevenshteinDistance - the number of changes needed to change one String into another

A. 参考

Read More

1. Info

Yeoman 是一种构建 javascript 项目的脚手架。

是 Google 的团队和外部贡献者团队合作开发的,他的目标是通过Grunt(一个用于开发任务自动化的命令行工具)和Bower(一个HTML、CSS、Javascript和图片等前端资源的包管理器)的包装为开发者创建一个易用的工作流。

Yeoman 主要有三部分组成:

  • yo(脚手架工具);
  • grunt(构建工具);
  • bower(包管理器)。

这三个工具是分别独立开发的,但是需要配合使用,来实现我们高效的工作流模式。

2. Require

  • Node.js v0.10.x+
  • npm v1.4.3+
  • git

3. Install Yeoman 工具集

sudo npm install --global yo bower grunt-cli

4. generator

一个 generator 能帮助构建项目目录,下载项目依赖等工作。

4.1. install a generator

sudo npm install -g generator-***

5. 通过 generator scaffold 应用

5.1. 创建一个项目文件夹

mkdir mytodo && cd mytodo

5.2. 通过 generator 建立应用的框架

yo angular

5.3. 配置

运行上面的命令后,根据提示进行应用的配置。完成后应用的大体框架便出来了。

6. Preview 应用 in the browser

Yeoman 已经包含了我们构建本地服务的所需。

6.1. 运行服务

grunt serve

服务的默认端口为:9000。 停止服务,请按 Ctrl+C。 但在我们开发应用的时候,我们不需要停止服务,然后在重启它以查看效果,grunt 会自动监控项目下文件的变化,并实时更新服务。

7. Start writing App

8. 使用 bower 安装 packages

8.1. 查询当前有哪些 packages

bower list

8.2. 搜索 packages

bower search package-name

8.3. 安装 packages

bower install --save package-name
  • --save 选项将新安装的依赖自动更新至 bower.json 文件。

安装成功后,在 bower_components 目录下将增加相应的 packages 文件夹。

bower 同时会将添加新依赖至相应 HTML 文件中。

9. 测试

9.0. 安装 Karma

npm install grunt-karma --save-dev

9.1. 运行单元测试

grunt test

9.2. 更新 Karma 配置文件

打开 karma.conf.ja 添加应用的相关依赖。

10. 构建与发布

grunt

grunt serve:dist

Read More

作用域

作用域是用来检测模型的改变和为表达式提供执行上下文的。 它是分层组织起来的,并且层级关系是紧跟着DOM的结构的。

控制器

它的主要工作内容是构造模型,并把模型和回调方法一起发送到视图。 视图可以看做是作用域在模板(HTML)上的“投影(projection)”。 而作用域是一个中间地带,它把模型整理好传递给视图,把浏览器事件传递给控制器。 控制器和模型的分离非常重要,因为:

  • 控制器是由Javascript写的。Javascript是命令式的,命令式的语言适合用来编写应用的行为。控制器不应该包含任何关于渲染代码(DOM引用或者片段)。
  • 视图模板是用HTML写的。HTML是声明是的,声明式的语言适合用来编写UI。视图不应该包含任何行为。
  • 因为控制器和视图没有直接的调用关系,所以可以使多个视图对应同一个控制器。这对“换肤(re-skinning)”、适配不同设备(比如移动设备和台式机)、测试,都非常重要。

模型

模型就是用来和模板结合生成视图的数据。模型必须在作用域中时可以被引用,这样才能被渲染生成视图。

视图

视图的生命周期由作为一个模板开始,它将和模型合并并最终渲染到浏览器的DOM中。

模型是视图变化的唯一动因。

指令

Filters

模块和注入器

每个AngularJS应用都有一个唯一的注入器。 注入器提供一个通过名字查找对象实例的方法。 它将所有对象缓存在内部,所以如果重复调用同一名称的对象,每次调用都会得到同一个实例。 如果调用的对象不存在,那么注入器就会让实例工厂(instance factory)创建一个新的实例。

一个模块就是一种配置注入器实例工厂的方式,我们也称为“提供者(provider)”。

Read More

完整版《Markdown 语法说明 (简体中文版)》请访问Wow!Ubuntu

一、段落、标题、区块

段落: 一个以上的空行则会划分出不同的段落,一般的段落不需要用空白或换行缩进。

标题: 行首插入 1 到 6 个 # ,对应到标题 1 到 6 阶。

区块: 区块引用则使用 ‘>’ 角括号。

Markdown 语法:

# 这是一级标题
## 这是二级标题

这是第一个段落!这是第一个段落!这是第一个段落!这是第一个段落!

这是第二个段落!这是第二个段落!这是第二个段落!这是第二个段落!

> ## 区块引用中的二级标题
>
> 区块引用区块引用区块引用
> 区块引用区块引用区块引用

输出效果:

这是一级标题

这是二级标题

这是第一个段落!这是第一个段落!这是第一个段落!这是第一个段落!

这是第二个段落!这是第二个段落!这是第二个段落!这是第二个段落!

区块引用中的二级标题

区块引用区块引用区块引用

区块引用区块引用区块引用

二、修辞和强调

使用一对单星号或双星号来标记需要强调的区段。

Markdown 语法:

*这是使用单星号生成em标签的强调*。

**这是使用双星号生成strong标签的强调**。

输出效果:

这是使用单星号生成em标签的强调

这是使用双星号生成strong标签的强调

三、列表

无序列表使用*、+或-来做为列表的项目标记。

Markdown 语法:

- 第一序列。
- 第二序列。
- 第三序列。

输出效果:

  • 第一序列。
  • 第二序列。
  • 第三序列。

有序列表则是使用数字、英文句点、空格作为项目标记。

Markdown 语法:

1. 第一序列。
2. 第二序列。
3. 第三序列。

输出效果:

  1. 第一序列。
  2. 第二序列。
  3. 第三序列。

四、链接

支持行内参考 两种形式。

行内形式链接 Markdown 语法:

这里就是[链接](http://angularjs.cn/)啦。

输出效果:

这里就是链接啦。

参考形式链接 Markdown 语法:

第一个链接是 [Google][1],第二个链接是[Yahoo][2],第三个链接是[MSN][3]。

[1]: http://google.com/ "Google"
[2]: http://search.yahoo.com/ "Yahoo Search"
[3]: http://search.msn.com/ "MSN Search"

输出效果:

第一个链接是 Google,第二个链接是Yahoo,第三个链接是MSN

五、图片

图片的语法和链接很像,只是前面多了一个!号。

行内形式图片链接 Markdown 语法:

![淘宝网LOGO图片](http://img01.taobaocdn.com/tps/i1/T1Kz0pXzJdXXXIdnjb-146-58.png)

参考形式图片链接 Markdown 语法:

![淘宝网LOGO图片][logo]

[logo]: http://img01.taobaocdn.com/tps/i1/T1Kz0pXzJdXXXIdnjb-146-58.png

输出效果:

淘宝网LOGO图片

六、代码

行内代码可以使用反引号 ` 来标记代码区段,区段内的 &<> 都会被自动的转换成 HTML 实体:

行内代码 Markdown 语法:

这里插入行内代码 `<div></div>`。

输出效果:

这里插入行内代码 <div></div>

代码区块只要每行都缩进 4 个空格就可以了,而 &<> 也一样会自动转成 HTML 实体。

区块代码 Markdown 语法:

    function Err(message, name) {
        return (function () {
            this.name = name || jsGen.lib.msg.err;
            this.message = message;
            return this;
        }).call(Object.create(Error.prototype));
    };

输出效果:

function Err(message, name) {
    return (function () {
        this.name = name || jsGen.lib.msg.err;
        this.message = message;
        return this;
    }).call(Object.create(Error.prototype));
};

Read More

Info

ruby 版本管理工具。

安装

// 安装稳定版本
curl -sSL https://get.rvm.io | bash -s stable

// 安装开发版
curl -sSL https://get.rvm.io | bash

使用

ruby -v
rvm info
rvm list
// 查询可安装的版本
rvm list known
// 安装某一版本的ruby(可安装jruby等)。
rvm install 2.0.0
rvm [use] 2.0.0
rvm use default
rvm use system
rvm reset
rvm alias create alias_name 2.0.0
rvm use alias_name
rvm alias delete alias_name
rvm alias list
rvm remove 2.0.0
rvm uninstall 2.0.0

Read More

Theme主题

从版本0.2.X开始,JB(Jekyll-Bootstrap)的主题完全是模块化的。 这让每个人都可以自由发布和共享主题。 Jekyll-Bootstrap v 0.2.x只附带twitter主题,其他主题需要被安装。 当前主题包在GitHub上:https://github.com/jekyllbootstrap

安装主题

通过使用rake命令,并通过该主题在git的URL安装一个主题。

rake theme:install git="https://github.com/jekyllbootstrap/theme-the-program.git"

安装程序使用的git下载主题包。

如果你已经获得了主题包,如通过Download ZIP下载下来的。 你可以手动把它放到你的 ./_theme_packages文件夹下,然后如下运行:

rake theme:install name="THEME-NAME"

THEME-NAME为主题包名称。

切换主题

一旦你的主题安装,您可以通过rake来进行他们之间的切换

rake theme:switch name="THEME-NAME"

自定义主题

主题的布局在 ./_includes/themes/THEME-NAME 目录下。 您可以编辑该目录中的文件,而不是 _layouts 目录,因为改变的主题将覆盖 _layout 目录中的文件,你可以在_layouts中自由添加额外的模板文件。 以自定义您的博客

Highlight

配置

  • redcarpet
highlighter: pygments
markdown: redcarpet
redcarpet:
  extensions:
    - fenced_code_blocks
    - no_intra_emphasis
    - strikethrough
    - autolink
    - tables
    - with_toc_data

这种配置可以按照 ``` 这样的方式, 自动链接,代码块 等基本功能都可以满足了.

  • karkdown
highlighter: pygments
markdown: kramdown  # [ maruku | rdiscount | kramdown | redcarpet ]
kramdown:
  input:         GFM	# 没有这个配置 代码块不会生效
  auto_ids:      true	# 自动生成ID
  auto_id_prefix:'id-'	# ID的前缀
  # footnote_nr:   1
  # entity_output: as_char
  # toc_levels:    1..6
  # smart_quotes:  lsquo,rsquo,ldquo,rdquo
  # use_coderay:   true

  # coderay:
  #   coderay_wrap:              div
  #   coderay_line_numbers:      inline
  #   coderay_line_number_start: 1
  #   coderay_tab_width:         2
  #   coderay_bold_every:        10
  #   coderay_css:               style

注释为默认配置, 不过 github 没有 coderay 服务, 后面都可以不用

这种方式不能根据代码类型进行着色, 需要引入js

<link href='/assets/styles/agate.css' rel="stylesheet" media="all">
<script src="/assets/highlight.pack.js"></script>
<script> hljs.initHighlightingOnLoad(); </script>

toc生成目录

// TOOD

常用命令

// 列出所有可用的 rake 命令
rake --tasks

rake post title="your title"


参考

Read More