帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

上一篇大概说了一下JS是怎么画UML 图形的。
这一篇简单介绍一下这个JS 解析 UML语法是怎么实现的。
https://github.com/bramp/js-sequence-diagrams/blob/master/src/grammar.ebnf

这个是Markdown UML语言的语法结构。摘抄了部分:
这一部分是将词和词组成语句。而语句和语句就组成篇章。

document ::= statement*
statement ::=
( 'title' ':' message
| 'participant' actor
| 'note' ('left of' | 'right of' | 'over') actor ':' message
| actor ( '-' | '--' ) ( '>' | '>>' )? actor ':' message
)

这里的意思是 UML是由 statement(语句)构成的。
statement有下面几种表示方法:
1. ‘title’ ‘:’ message 这里带上”的都是token,在编译原理中,token标识不能再被解释的词。
2. ‘participant’ actor
3. ‘note’ (‘left of’ | ‘right of’ | ‘over’) actor ‘:’ message
表示note与Actor之间的关系
4. actor ( ‘-’ | ‘–’ ) ( ‘>’ | ‘>>’ )? actor ‘:’ message 标识actor之间的关系。

下面的词法分析会将字符转换为UML中有含义的字。类似字符组成词。用正则式将字母变成有含义的词。

/** js sequence diagrams
 *  http://bramp.github.io/js-sequence-diagrams/
 *  (c) 2012-2013 Andrew Brampton (bramp.net)
 *  Simplified BSD license.
 */
%lex

%options case-insensitive

%{
    // Pre-lexer code can go here
%}

%%

[\n]+             return 'NL';
\s+               /* skip whitespace */
\#[^\n]*          /* skip comments */
"participant"     return 'participant';
"left of"         return 'left_of';
"right of"        return 'right_of';
"over"            return 'over';
"note"            return 'note';
"title"           return 'title';
","               return ',';
[^\->:\n,]+       return 'ACTOR';
"--"              return 'DOTLINE';
"-"               return 'LINE';
">>"              return 'OPENARROW';
">"               return 'ARROW';
:[^#\n]+          return 'MESSAGE';
<<EOF>>           return 'EOF';
.                 return 'INVALID';

/lex

%start start

%% /* language grammar */

start
    : document 'EOF' { return yy; }
    ;

document
    : /* empty */
    | document line
    ;

line
    : statement { }
    | 'NL'
    ;

statement
    : 'participant' actor  { $2; }
    | signal               { yy.addSignal($1); }
    | note_statement       { yy.addSignal($1); }
    | 'title' message      { yy.setTitle($2);  }
    ;

note_statement
    : 'note' placement actor message   { $$ = new Diagram.Note($3, $2, $4); }
	| 'note' 'over' actor_pair message { $$ = new Diagram.Note($3, Diagram.PLACEMENT.OVER, $4); }
    ;

actor_pair
    : actor             { $$ = $1; }
	| actor ',' actor   { $$ = [$1, $3]; }
    ;

placement
    : 'left_of'   { $$ = Diagram.PLACEMENT.LEFTOF; }
	| 'right_of'  { $$ = Diagram.PLACEMENT.RIGHTOF; }
    ;

signal
    : actor signaltype actor message
    { $$ = new Diagram.Signal($1, $2, $3, $4); }
    ;

actor
    : ACTOR { $$ = yy.getActor($1); }
    ;

signaltype
    : linetype arrowtype  { $$ = $1 | ($2 << 2); }
	| linetype            { $$ = $1; }
    ;

linetype
    : LINE      { $$ = Diagram.LINETYPE.SOLID; }
	| DOTLINE   { $$ = Diagram.LINETYPE.DOTTED; }
    ;

arrowtype
    : ARROW     { $$ = Diagram.ARROWTYPE.FILLED; }
	| OPENARROW { $$ = Diagram.ARROWTYPE.OPEN; }
    ;

message
    : MESSAGE { $$ = $1.substring(1).trim().replace(/\\n/gm, "\n"); }
    ;
%%

例如下面这一句:

[^\->:\n,]+       return 'ACTOR';

就是将不是“->:\n,” 这些字符的多个字组成词,这个词叫做ACTOR.

一般来说终结符也就是类似’note’ 这样的字符需要先被定义。否则 ‘note’这样的字符集合就变成了markdown UML的ACTOR.

而下面的是将ACTOR词转成对象actor。

actor
    : ACTOR { $$ = yy.getActor($1); }
    ;
    
1
2
3
4
5
A->B: 一句话证明你很寂寞。
Note left of A: thinking
B->B: counting
B>>A: 这句话有一共六十九笔
Note right of X: SB

Created with Raphaël 2.1.2 寂寞是什么 A A C C S S B B 一句话证明你很寂寞。
thinking counting 这句话有一共六十九笔 SB

好吧上面就是UML的grammar. 其实用什么语言都可以写出来。不局限于JS. 具体grammar这块使用的是jison和ebnf.
有闲空的人可以看一下JS调用jison来做js parser以及EBNF表达式。

这一篇开始讨论代码层面的问题。主要是markdown的功能的设计实现。

这一篇先从markdown外围的代码开始讲起:
UML序列图是从 https://github.com/bramp/js-sequence-diagrams
copy得到的。

当如这个UML代码还用到了两个JS,功能库和画图.

<script src="underscore-min.js"></script>
<script src="raphael-min.js"></script>

首先讲讲这个JS最核心的类:
[ https://github.com/bramp/js-sequence-diagrams/blob/master/src/sequence-
diagram.js ](https://github.com/bramp/js-sequence-diagrams/blob/master/src
/sequence-diagram.js)

首先这个类分为其实使用两种风格的。一种就是现在CSDN采用的风格,叫做simple. 另外一种是手绘风格,叫做hand。定义如下:

var themes = {
simple : RaphaelTheme,
hand : HandRaphaelTheme
};
Diagram.prototype.drawSVG = function (container, options) {
var default_options = {
theme: 'hand'
};
options = _.defaults(options || {}, default_options);
if (!(options.theme in themes))
throw new Error("Unsupported theme: " + options.theme);
var drawing = new themes[options.theme](this);
drawing.draw(container);
}; // end of drawSVG

drawSVG是最外层JS要画图调用的方法。例如:

<div id="diagram">Diagram will be placed here</div>
<script src="sequence-diagram-min.js"></script>
<script> 
  var diagram = Diagram.parse("A->B: Does something");
  diagram.drawSVG('diagram');
</script>

下面就可以画出图形。所以drawSVG是核心入口。

drawSVG的实现过程中,最重要的一句:

drawing.draw(container);

这一句调用的draw function定义如下:

    draw : function(container) {
        var diagram = this.diagram;
        this.init_paper(container);
        this.init_font();
        this.layout();
        var title_height = this._title ? this._title.height : 0;
        this._paper.setStart();
        this._paper.setSize(diagram.width, diagram.height);
        var y = DIAGRAM_MARGIN + title_height;
        this.draw_title();
        this.draw_actors(y);
        this.draw_signals(y + this._actors_height);
        this._paper.setFinish();
},

这几句看起来平淡无奇,就是初始化背景,初始化字体,初始化各种,然后画标题,画角色(也就是序列图中的实体),画调用箭头。

这里面看似简单,但是最为繁琐的就是:

this.layout();

布局:要遍历所有的要画到画布上的东西,要提前预知,各个东西的长宽,然后根据长宽,各个东西相距的距离,算出画布的尺寸。这段JS并没有做到固定长宽后,各个东西等
比缩放。

这个做完之后,开始画角色(也就是实体)

Created with Raphaël 2.1.2 A A 这就是角色A 包括上下两个方块和中间的竖线

再然后,两个角色之间是有间距的。例如:

Created with Raphaël 2.1.2 距离是什么? A A B B 我们两个角色之间的间距 包括上下两个方块和中间的竖线

间距的计算并不是很容易,首先确定每个角色的基本的高和宽,然后根据将信号signal计算在内(signal 包括两种,一种是 箭头关系,另外一种是 注释框)所
以大家可以看到注释框和箭头也是有从上到下的顺序的。signal的宽度和字的个数以及宽度均有关系(这里计算较为复杂,此处略去太多字…有兴趣的看源码)。

然后顺序遍历,依次确定A,B,C…各个角色所在的绝对坐标。

每一个signal都是有高度的,将所有的signal 高度加和,就得到了下端角色方框的坐标。然后连线就大功告成。

看源码发现了许多没有的功能…

例如 UML中增加title
以及UML中注释框除了Right, Left, 还有Over, 对于Over还可以置于多个角色之上。

title 和 Over

1
2
3
4
5
title: 距离是什么?

A->B: 我们两个角色之间的间距
Note Over A,B: 包括上下两个方块和中间的竖线
Note Over A: I'm A

表现:

Created with Raphaël 2.1.2 距离是什么? A A B B 我们两个角色之间的间距 包括上下两个方块和中间的竖线
I’m A

[ https://github.com/bramp/js-sequence-diagrams/blob/master/src/jquery-
plugin.js ](https://github.com/bramp/js-sequence-diagrams/blob/master/src
/jquery-plugin.js)

这里写图片描述

这个类中,如果没有定义option属性,那么就只能用simple的形式了。感觉CSDN的dev好像没有定义这个option. 我这边也无能为力。

[ https://github.com/bramp/js-sequence-diagrams/blob/master/src/diagram.js]

这个类没有什么好讲的,就是通过parser构造出来的实体类。

剩下的两个gammar JS. 这种词法解析的放到后面一篇再说. 网络实在不好,啥都timeout, 另外也该睡觉了。

这里大概就只能生成两种类型的图:

  • 序列图
  • 流程图

序列图

1
2
3
4
A->B: 一句话证明你很寂寞。
Note right of B: thinking
B->B: counting
B-->A: 这句话有一共六十九笔

Created with Raphaël 2.1.2 A A B B 一句话证明你很寂寞。 thinking counting
这句话有一共六十九笔

序列图很简单, 左边 A->B就能生成两个对象.按照从上至下的顺序,将序列依次画出。 –>是虚线, ->是实线。 Note Right of 【名称】
是注释框。

1
2
3
4
5
A->B: 一句话证明你很寂寞。
Note left of A: thinking
B->B: counting
B-->A: 这句话有一共六十九笔
Note right of X: SB

Created with Raphaël 2.1.2 A A B B X X 一句话证明你很寂寞。 thinking counting
这句话有一共六十九笔 SB

如果Note中的对象名没有出现过,就会自建一个。另外还可以使用Note left of。

这个js是使用的 https://github.com/bramp/js-sequence-diagrams

流程图

1
2
3
4
5
6
7
8
st=>start: 开始吃饭
e=>end: 结束吃饭
op=>operation: 埋头苦吃
cond=>condition: 已经吃饱了?

st->op->cond
cond(yes)->e
cond(no)->op

Created with Raphaël 2.1.2 开始吃饭 埋头苦吃 已经吃饱了? 结束吃饭 yes no

流程图的代码: https://github.com/adrai/flowchart.js

看了一下代码,准备下一篇讲一讲 UML 序列图和流程的实现。

Latex是为了写数学公式的。嗯…但实际这种语言的作用是为了排版的。数学公式只是他的附加属性。

但是markdown引入这个完全是为了写公式。其他的Latex语法不支持。

CSDN markdown语法支持的latex,分为两类
- 行内公式:

$\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N$

这是行内公式: Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N

  • 块级公式:

    x=b±b24ac2ax = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a}

这个是块级的。本身带着缩进。
x = − b ± b 2 − 4 a c − − − − − − − √ 2 a

LaTex符号等:

常用希腊字符 $\eta$ , $\mu$ ,$\epsilon$, $\pi$, $\alpha$, $\beta$, $\gamma$, $\lambda$, 

空集: $\phi$, $\varphi$, $\Phi$,

密度量: $\rho$, $\theta$, $\zeta$, $\delta$, 

大写的$\Delta$,$\Theta$,  

以及常用的:$\Omega$, $\Sigma$,$\sigma$

常用希腊字符 η , μ , ϵ , π , α , β , γ , λ ,

空集: ϕ , φ , Φ ,

密度量: ρ , θ , ζ , δ ,

大写的 Δ , Θ ,

以及常用的: Ω , Σ , σ

常用符号 
+ - * / = < > 
$\div$,$\le$ , $\ge$, $\approx$, $\equiv$, $\sim$, 

$\simeq$, $\ll$, $\gg$, $\in$, $\subset$, $\subseteq$, 

$\Join $, $\propto$, $\notin$, $\neq$, $\oplus$, $\times$, 

$\cup$, $\cap$, $\vee$, $\land$, $\sum$, $\prod$

$\bigcup$, $\bigcap$, $\int$, $\oint$, $\Leftarrow$, $\Rightarrow$

$\iff$, $\lgroup$, $\rgroup$, $\infty$, $\angle$,$\nabla$

$\forall$, $\exists$, $\emptyset$, 

有些我也没有用过的运算操作符就没有写。另外对称的也只写了一个。

常用符号:
+ - * / = < >

÷ , ≤ , ≥ , ≈ , ≡ , ∼ ,

≃ , ≪ , ≫ , ∈ , ⊂ , ⊆ ,

⋈ , ∝ , ∉ , ≠ , ⊕ , × ,

∪ , ∩ , ∨ , ∧ , ∑ , ∏

⋃ , ⋂ , ∫ , ∮ , ⇐ , ⇒

⟺ , ⟮ , ⟯ , ∞ , ∠ , ∇

∀ , ∃ , ∅ ,

分数 $\frac{a}{b}$ 
  • 分数 a b
    指数 aba^b

  • 指数 a b
    下标 abca_{bc}

  • 下标 a b c
    微分 $\frac{\partial y}{\partial x} $

  • 微分 ∂ y ∂ x
    向量 AB\vec{AB}

  • 向量 A B →
    加和 i=1naibi\sum_{i=1}^n a_ib_i

  • 加和 ∑ n i = 1 a i b i
    积分 0π2sin(x)\int_{0}^{\frac{\pi}{2}}sin(x)

  • 积分 ∫ π 2 0 s i n ( x )
    连乘 a=1nai\prod_{a = 1}^n a_i

  • 连乘 ∏ n a = 1 a i
    粗体 n\mathbf{n}

  • 粗体 n

我看了一下Latex的这些数学符合…感觉自己的数学知识已经完全交还给体育老师了。你们上面的符号还记得多少?

如果人类出现了断层。数千年后,后人看这些数学符号。大概和现代人看甲骨文一样。难于识别。

藐视渣渣的数学学霸…上面那些符号并不是你要看的数学符号。下面的才是:

这里写图片描述

这里写图片描述

这里写图片描述

这一篇准备抄一下help文档,另外加一些自己的解释。这一篇里不讲UML和LaTEX。 准备抽两个篇专门讲一下。

1. 标题与字号

markdown字号太少了,觉得应该再加些。

在文字写书写不同数量的#可以完成不同的标题,如下:

# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题

** 这里的需要注意的是 #[空格]标题 一定要有空格 **

等号及减号也可以进行标题的书写,不过只能书写二级标题,并且需要写在文字的下面,减号及等号的数量不会对标题的字号产生影响,如下:

二级标题
=========

二级标题
---------

二级标题

二级标题

一直觉得这个语法是对诡异的。因为 \- 极可能是无序列表中的第一行。所以这个语法判断时候,还要判断 \-
后面是否有一个空格。感觉文法很不舒服。这是为什么呢?

解析一下:markdown文法类似

这里写图片描述

从A到B的转移通过字符 \- ,在B状态下markdown认为这个上面的字符都要加粗。如果下一个字符是[空格],那么markdown认为是一个无序列
表,将上面一行的所有文字的状态置为不加粗。虽然这个是状态的改变。但是在我们眼里,这是之前文字的状态改变。所以我们觉得这个文法就不舒服。因为我们习惯于向同一个
方向书写。而不是写着写着回顾另外一个方向。


2. 有序和无序

无序列表的使用,在符号“-”后加空格使用。如下:
另外注意 \- 一定要是开始字符,如果不是那么 \- 之前只能有空格或者tab字符。

- 无序列表1
- 无序列表2
- 无序列表3
  • 无序列表1
  • 无序列表2
  • 无序列表3

如果要控制列表的层级,则需要在符号“-”前使用空格或者tab。如下:

- 无序列表1
- 无序列表2
  - 无序列表2.1
     - 列表内容
     - 列表内容
  • 无序列表1

  • 无序列表2

    • 无序列表2.1

      • 列表内容
      • 列表内容

有序列表的使用,在数字及符号“.”后加空格几个,如下:

1. 有序列表1
2. 有序列表2
    3.  有序列表2.1
    4.  有序列表2.2
        - 这
        - 无
            1. 有
            2. 序
        - 序
3. 有序列表3
  1. 有序列表1
  2. 有序列表2
1. 有序列表2.1 
2. 有序列表2.2   

  * 这 
  * 无   

    1. 有 
    2. 序 
  * 序 
  1. 有序列表3

有序列表如果要区分层级,也可以在数字前加空格或者tab。


3. 引用

引用的格式是使用符号“>”后面书写文字. ”>“之后是否加空格不影响。如下:

> 我说的都是我说的——帐前卒

我说的都是我说的——帐前卒


4. 粗体和斜体

粗体和斜体: 一个 * 两个 * 还是三个 * . 注意 **[你的字符]*** 号和你的字符之间没有空格。
一个 * : *你是斜体* _ 你是斜体 _
两个 * : **不对,你是粗体** ** 不对,你是粗体 **
三个 * : ***你又粗又斜*** ** _ 你又粗又斜 _ **


5. 链接

  • 在引用中加链接,第一个中括号添加需要添加的文字,第二个中括号中是引用链接的id,之后在引用中,使用id加链接:如下:
    [link text][id]
    [id]: http://example.com/ “optional title here”

上面的文字将展示为:

link text

  • 在文中直接引用链接,直接使用尖括号,把链接加入到尖括号中就可以实现,如下:

http://example.com/ or [email protected]

展示如下:
http://example.com/ or [email protected]

  • 插入互联网上图片,格式如下:

![这里写图片描述](http://img3.douban.com/mpic/s1108264.jpg)

这里写图片描述

或者如下面的写法:
![这里写图片描述][jane-eyre-douban]

[jane-eyre-douban]: http://img3.douban.com/mpic/s1108264.jpg`

这里写图片描述


6. 代码块 - 如果在一个行内需要引用代码,只要用反引号引起来就好,如下: Use the printf()` function. -

用TAB键起始的段落,会被认为是代码块,如下: echo “hello world”; - 如果TAB不管用的话,需要使用三个反引号` 例如:
下面连高亮都做了。

<php>
    echo "hello world";
</php>

7. 分割线和删除线

可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,同时需要在分隔线的上面空一行。如下:

---
****
___
展示如下:



删除线的使用,在需要删除的文字前后各使用两个符号“~”,如下

~~Mistaken text.~~

Mistaken text.


8. 表格

可以使用冒号来定义表格的对齐方式,如下:

| Tables | Are | Cool |
| ------------- |:-------------:| -----:|
| col 3 is | right-aligned | $1600 |
| col 2 is | centered | $12 |
| zebra stripes | are neat | $1 |
| somemissed |
|||$20|

Tables Are Cool

col 3 is

right-aligned

$1600

col 2 is

centered

$12

zebra stripes

are neat

$1

somemissed

$20

第一篇简单介绍了markdown. 第一篇地址

第二篇主要会介绍不熟悉markdown语言的人如何使用CSDN新的编辑器。这里主要介绍图形编辑器。已经掌握的人请挪步。

编辑器bar

  • 前面几个都非常简单。例如对字体 ** 加粗 ** 和 ** _ 斜体 _ ** 。

  • 或者是对 帐前卒专栏 加个链接。用 连接图标

  • 再者就是加个图片: 图片图标

数字图片

上图的算式= ?
呃…好吧,这不是重点。

  • 再用这个图形编辑器写点代码。圈中代码块后,点击: 这里写图片描述
    // 这个是世界上最好的语言php

    echo “世界上最好的语言”;

  • 再比如引用名人名言,用这个 这里写图片描述

啊,我现在在地球上 —— 帐前卒

  • 有时候我们需要对很多事物排序。所以用这个: 这里写图片描述

    1. 吃早餐
    2. 吃橘子
    3. 吃桂圆
    4. 睡觉
    5. 起来继续吃

这样,用排序的方法把自己的生活整理的井井有条。

  • 无序的列表用: 无序图标 , 比如吃什么肉其实并不重要,重要的是有肉吃。

    • 吃粉蒸肉
    • 吃红烧肉
    • 吃唐僧肉

我觉得这里这里的无序图标和有序的图标长得差不多。 ** UI还是需要改改吧 ** 。

  • 这个图标 字体大小 是用来修改字号的。不过这个字号只有 <h1> , <h2> 和正常三种字号可以改。感觉很 ** 鸡肋 ** 呀。

我是No.1

我是No.2

我是No.3



上面竟然不能出现 ** 华丽的分割线 ** 这几个字. 嗯,CSDN能不能满足一下我的这个需求?

  • 这里写图片描述 这个就不细说了。

  • 这里写图片描述 这个图标不要轻易点。嗯.除非你想发狂。

  • 这里写图片描述 是保存到线上草稿箱中,类似于save. 你可以在后台草稿箱找到保存的。

保存

  • 这里写图片描述 生成摘要,点击后长这个样子:

摘要

  • 这里写图片描述 点击后长这个样子。没有什么更加详细的描述了。

文章设置

  • 这里写图片描述 感觉也很 ** 危险 ** 最好还是不要去点击。
    导入

  • 这里写图片描述 这个是将本地的markdown文件 _ .md变成线上可以编辑的。而 这里写图片描述 是将现在线上正在编辑的文字变成 _ .md本地文件或者html 等。

这里写图片描述

这里写图片描述

  • 这里写图片描述 帮助文档就是下面这个样子的。会在右边出现。方便使用。

帮助截图

** END **

好吧,该睡了。这一篇非常基础,所以感觉废话太多。 ** 下一篇开始介绍markdown的基本语法。 **

另外用csdn markdown编辑器的时候,发现了一个不错的东西。鼠标移至右下角

这里写图片描述

这里能看到文章标题列表。和本篇文章的字数统计。不错的功能~

我以为csdn markdown 也支持 <i class="icon-undo"> 这个内部标签功能呢。因为在后台它是这样显示的:

这里写图片描述

但是发布之后,却无法显示出来这个图标。

最近CSDN 新出了markdown编辑器。我这也算是尝鲜。
最初接触markdown编辑器是在2011年。那个时候,使用markdown编辑器写blog。然后将blog放到github上托管。markdown还不能像
现在这样可以实时编辑显现。那个时候有一个markdown engine专门将markdown语法转换成html. 每次感觉自己写对了。实际上语法各种不对。

究竟什么是markdown?

markdown是一种更加贴近自然表达的语法,它可以转换成互联网上通用展示的html格式。 — 帐前卒

所以这个特点,造就了markdown的巨大优势。

markdown优势

优势其实就只有一点: ** _ 简单 _ **

  • 如果写blog用html写。那么需要写一个空格,需要写 &nbsp; 但是有了markdown, 我只需要这样写:

这里有一个空格, ,真的。

  • 如果我想使用html换一行,或者新起一个段落,需要写 <br> 或者 <p> 但是我如果使用markdown,那么我直接打两个回车。例如:

新开一行吧

不知道这样是不是省字数。不过从初学者的角度一定是:markdown的语法更接近于自己所见。所以 ** 所见即所得 ** 以及 ** 易学易用 **
是markdown语法的终极目标。

说了这么多markdown的好处。那markdown能否替换掉“世界上最好的语言”php呢?来看看他的不足

markdown缺点

  • 现在还没有浏览器直接支持markdown
  • markdown解析器bug很多,而且也不知道什么时候能fix.
  • markdown的基础语法表达较少。例如如果我想对换一下这个字体的颜色,或者换一下背景色。这个还是需要借助于css.

看起来markdown的缺点吐槽吐的有点多。但这并不影响它成为更加实用的语言。仔细想想,blog中除了字就是图。没有颜色,没有样式也不影响阅读。

csdn markdown 对比

呃…我找到这一款markdown: https://www.zybuluo.com/mdeditor

markdown 使用细节

这里需要注意的是,如果你希望上一行的样式不要应用到下一行,那么就要在中间空一行。所以两次回车是新起一个段落。新手一定犯这个错误。

如果段落开头需要两个空格,那么还是得加入两个 &nbsp;&nbsp;
当然咱们的是中文字,每个字符占空格宽度好像是四个,所以这里需要八个空格。当然这里可能也和字体有关系。

这是我的段落开始~
你看这里~~

另外如果某些字符不能在html中展示,那么就要加两个 `` , 例如

`&nbsp;`

说实话,上面这个好难打出来。需要先打一个[tab]然后再写原始字符。这样被认为是一个代码块,就不会被转义了。

这一篇先写到这里。
下一篇准备写 CSDN markdown 简单使用

很久没有写blog了

公司发了一个android 手机,所以准备学习一下android开发。如果再发一个mac的话,准备学习一下IOS开发。嗯。然后就是去android的官网:

http://developer.android.com/training/index.html

![](http://img.blog.csdn.net/20150311090605105?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)
就是这里了。如果你打不开,说明被墙了。如果你挂了代理还打不开,说明你的代理也被墙了。总之,这个地方已经被墙了。

点击Build Your First App然后看介绍。

![](http://img.blog.csdn.net/20150311090608225?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

介绍说,让我们先下载Android Studio再说.  点击去下载页面

![](http://img.blog.csdn.net/20150311090611064?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)
开始下载吧:

![](http://img.blog.csdn.net/20150311090617086?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)
还要确认协议等。

![](http://img.blog.csdn.net/20150311090620128?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

这里不要用浏览器的默认下载方式,把链接获取到,然后放到迅雷中下载吧。这样速度更快。在下载的空闲时间里看了一下介绍。

![](http://img.blog.csdn.net/20150311090623419?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

上面说这个Android Studio多好多好。啥都有,你放心的下吧。

![](http://img.blog.csdn.net/20150311090740810?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

我于是又看了下一节: Andding SDK Packages.

![](http://img.blog.csdn.net/20150311090629613?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

这一节说Android SDK 要啥没啥。Android Studio 是 IDE + android SDK.
这里最主要是说你要下载那几个package,否则不能用。其实你下载了Android Studio, 本身就带了那几个package.其实不需要再下载了。

![](http://img.blog.csdn.net/20150311090754928?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

下载结束了,双击运行吧。 但你最好检查一下JDK的是有1.7的版本。1.8的某些版本也可以。但是1.8的最新版,Android
Studio还不支持。然后一路next.

![](http://img.blog.csdn.net/20150311090632452?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

去安装的目录就看到这两个文件夹,一个是IDE( idea IDE) 另外一个就是Android SDK.

![](http://img.blog.csdn.net/20150311090758142?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

进入Android Studio, 然后再进入bin. 然后看到一堆exe 文件。 如果你是64位机器,使用studio64.exe
运行,32用studio.exe运行。这里要修改一下idea.properties.

![](http://img.blog.csdn.net/20150311090801262?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

如果你不做任何修改,直接打开了studio.exe或者studio64.exe, 中国地区的朋友们一般会卡在这个地方:

![](http://img.blog.csdn.net/20150311090650064?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

就是Fetching Android SDK component information.
这里是我非常鄙视google的地方。本来就是一个本地能用的东西。Google的做法是先更新,再使用,而且还不检查网络是否有问题。网上有人评价Android
是 too young too naive. 我觉得也是。那么解决这个问题的方法就是修改之前的idea.properties文件, 添加一行:

** disable.android.first.run=true **

要么你就所有的请求,http/https/socket都能走代理。嗯,我公司的代理不能支持全部请求代理。有能用的代理的同仁请捐助我一个全局代理。跳过fetc
hing阶段就到了:

![](http://img.blog.csdn.net/20150311090807174?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

为了让中国地区的朋友们不在创建新项目中卡住。一般会在这里卡住 Gradle: resolve dependancies ‘_debugCompile’
。这里一定要先config… 然后是project default.

![](http://img.blog.csdn.net/20150311090815614?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

然后是 Setting 选项.

![](http://img.blog.csdn.net/20150311090728487?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

这里搜索到gradle,然后将 ** offline work ** 勾选,点击apply. 然后返回。

![](http://img.blog.csdn.net/20150311090733682?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

然后就是点击project stucture。

![](http://img.blog.csdn.net/20150311090728487?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

你可以看到你安装的sdk和Jdk的位置是否正确。如果正确的话,就略过吧。

![](http://img.blog.csdn.net/20150311090918388?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

然后返回到创建新项目的页面:

![](http://img.blog.csdn.net/20150311090808080?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

然后一路next. 你就能看到你的工程:

![](http://img.blog.csdn.net/20150311090810919?watermark/2/text/aHR0cDovL2Jsb2
cuY3Nkbi5uZXQvY2N0dF8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/7
0/gravity/Center)

嗯,终于安装结束了。我试过让java 使用代理的方式访问网络。但是还是不行。自从去年公司的代理被封掉,现在的代理就只能通过sock5来做事情。添加成全局代理
后,百度都连接不上。完全不知道如何使用。有会使用的,请在下方留言。

有道云笔记 开工利是红包  vs  微信/支付宝红包

最近被支付宝,微信红包折腾够了。要么手抖了半天也不发钱,要么发就发了1分钱。还美其名曰“红包”。嗯, 马云 and
麻花腾,你们给乞丐一分钱试试,你看乞丐打不打你们。作为良民,嗯,我还是忍了。下面还是发一下有道云笔记的 开工利是 红包吧。大家见者有份。才不像马云 and
麻花腾那么小气。

下面是开工利是红包地址~   猛戳吧~~
http://note.youdao.com/hongbao/web/index.html

我应该怎么说呢?AWS被AWS的市场部害惨了。

这次活动是AWS的市场人员组织的吧。说出来是谁组织的吧。说出来,我们大家保证不打死他/她。

开场气氛不错。但是为什么这么口渴。渴的我到处找水喝。我没有亲见AWS兑换礼品处的争吵。只是听说那块快打起来了。像码农这样温和的物种竟然也要打人,这组织的真不
错。另外为什么需要网上报名,网上报名也就罢了,还给个编号。给我打电话的人员说没有编号进不去,没编号也不让去。那,为什么还开设现场报名!另外下午那动手课排了好
长好长的队伍。竟然一节课听完要全部清场,还要出去重新排队。你们在网上报名的地方限死就好了呀。其实这些课程只要在网上公开可用,pdf可以下载就好了。为啥一个普
及的课程,还要代币。 我实在想不通。我也想不通AWS这个策略是什么. 本来就是个API文档教程,还收个费。那课程里面都是基本的API文档介绍。

另外那课程响应速度极慢,我很难想象AWS基础服务会快到哪里去。嗯。这课程难道不是搭在AWS服务上的吗?AWS这是自己在抽自己耳光吗?还是说程序写的烂和AWS
基础服务无关?反正动手训练课不是充满惊喜和愉悦。加上清场和排队以及糟糕的网速和网站响应速度,周围总是充斥着:“**CK, 网页又打不开”…

只有一点比云计算大会稍好些:就是中午的饭能吃饱。

好吧。吐槽了这么久。“**CK”了无数,现在开始写正文:

开场,胖胖的CTO做了各种讲,各种赞。然后引用glu和其他应用做了说节约成本。其实为啥大家用你的服务,还不就是因为省力省钱。很明显的原因。但是这些公司有一个
共同点:数据是隐私无关,或者需要特殊专业知识才能研读。因为除非那个黑客是跨专业的。否则数据对他来说基本上看不懂的。即使是基因这么隐秘的数据。黑客看不懂的话,
也完全没有意义。某副总裁说可以根据某人基因研发出来特殊病毒。嗯,细细想来也不对劲。因为制造病毒杀人成本太高,而且副作用也很大。这特殊病毒还要在其他人身上做试
验没有问题以证明其特殊性?

好吧,不八卦了。真正开始写正文:

AWS 的确给中小创业公司带来了福音。因为中小公司的新项目不知道效果好不好。可能开发了两个月,推一下市场。看看效果,行就继续,不行就换方向。如果走正常的采购
机器,部署机房的流程。那不知道拖了几个星期了。所以对于中小公司来说,快是重要的策略。因为对于已经发展了多年的应用来说,背了很多包袱和假设,根本快不起来。想清
楚方向的快是胜利,想不清楚的快是找死。对于中小公司来说,即使是找死最好代价也小一些。所以云计算平台是最好的选择。AWS, 腾讯,京东,阿里几家云计算的来说。
AWS又可以带点国际化的梦想。如果定价和腾讯/京东/百度/阿里基本持平。我觉得AWS一家独大不是梦。当然如果AWS能解决将被墙的国际节点限定到小范围内,并且
国际上的CDN再给力些。我觉得国内几家云计算公司连粥都分不到。嗯,应该说到那时,国内的互联网公司连粥都喝不到了。(所以说墙还是好的,养活了大量的国内的互联网
人士。)

AWS的基础组件的确比较齐全。M/R, search, mq, db 等等。基本上对于一般的互联网应用来说也就足够了。

看了一下AWS的组件:

EC2 , 这个是弹性计算云(Elastic Compute Cloud)。是最核心的部分。没有这东西,基本上就啥也不能玩了。
S3, Simple Store Service.
简单存储服务。我当年研究的时候,觉得这个是个玩具。现在也是这么认为的。相比于RDB,这个简单太多了。这个对于某些应用来说就够了。例如key-value,
特别是value极大的情况。例如图片,视频,音频服务等。 这个是每个AZ上部署一份。找三个AZ分别部署。
AET(Amazon Elastic Transcoder) 媒体转码用的。这让我想到百度云的 流畅/原文 模式。
M/R (Map, Reduce) MR计算 kv 这种关系的还是很给力的。想想因为kv这种很符合现在的互联网场景。数据不断增长,刷新和重置。建立复杂索引的
速度跟不上数据变更的速度。另外一方面,数据经过简单筛选就可以变成真正有用的数据。所以kv这种模型才大行其道。而与KV相符合的MR才是有用的。
Kinesis 这个和spark是类似的。咋说呢?就是计算当前固定small时间段比较给力的工具。你可以认为是[curr-fix_interval,
curr] 这个区间的数据运算。
RDS  (relation Database service)
听起来是好东西。所有的代码都不需要变化,就可以平滑的迁入云端。不过你的应用是使用mysql, postgreSQL, 或者oracle。看起来是mysql
Wapper, postgreSQL  wapper, and Oralce  Wapper。 不过很可惜,我们的核心应用这几种数据库都没有用到。
Analytics(这个好像单独为mobile而生的)。这东西看起来应该是App Annie的竞争对手。和我们Google Analyzer,
JiaThis, 百度分析啥的基本无太多差别。
Zocalo 企业存储和共享服务。这个如果在做强大一些,就是我们的竞争对手了。不过现在看来功能还比较简单。
ElastiCache (Elastic 这里的c略写了)这个是memcache/redis wapper.
Dynamo DB 这个东西是好东西,而且是Amazon的原创。Cassandra是抄袭者。外面一般都用CS.  但是CS是免费的。这个是付费的。
CloudSearch 这个也是好东西。不过现在是否支持中文,我没有细看,最近才支持日文,另外说支持34种语言。不过我觉得中文现在可能是不支持的。(2014
-12-12)。另外这个没有在中国region中部署。
SWF(simple workflow service) 我记得我有一篇论文是关于workflow的. 知道设计模式中的 Chain Of
responsebility吧? 这个基本上可以类比。
RedShift  这个是用于数据仓库的。看起来不错。最大数据量能达到 16TB*100.
嗯。所以这东西也只能用于中小公司。因为公司再大些,数据量再大一下,自己建立数据中心其实更省钱。
Code Pipeline/commit/deploy  这个就是提交代码=> merge=> 发布自动化的工具。
Lambda  基于事件驱动的计算服务。 从底层看,依旧是消息流。不过可能编程上会有改进。
Cognito 用户身份和数据同步服务。 sso(single sign on) 知道吧。那就不多说了,就是这个服务。
再说说AZ(avaliable zone), datacentor, region之间的关系。 AZ 是由一个或者一组datacentor组成。 多个AZ+
transit构成了region. 而不同的AZ说明这两个AZ中的server相聚甚远,可以达到容灾的目的。
在同一个datacentor中的server一般不超过8w. 如果超了一般会再建一个datacentor. Why?

AZ之间的传输延迟一般为2ms, 通常小于1ms. 峰值25Tbps.
对于实例不停变换ip的问题,AWS使用ELB(elastic load balance) 方案进行解决。听起来好像起了一堆nginx.
最后说一句:
AWS免费套餐不适用于AWS中国(北京)区域。具体适用地区请参见本页最后的说明。
这一句话令我非常不爽。因为除了中国区,其他地区都可以免费使用一段时间。这让我想到了植物大战僵尸这款游戏。有异曲同工之妙。
我一向反感这种所谓的差别对待。所以,最后再对AWS 说一句 “**CK”。

0%