帐前卒专栏

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

这一篇开始讨论代码层面的问题。主要是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”。

用git的人非常鄙视用svn的。因为要不断的开分支。而且也没有本地的分支这个概念。

但是git 作为一项技术,是一定可以被svn替代的。当然替代的方法是否繁琐另当别论,但一定是能被替代。svn同样也能被git替代。大概所有的技术都是一样。都
能相互替代,只是你要为替代本身花费多长时间。

git作为一种同步工具好用吗?其实真不好用。我梦想的工具一定是可以帮我自动完成merge过程的,永远不用开分支,永远不用告诉我链表头在哪里,以及怎么rese
t, 什么时候rebase, 什么时候打tag.
一个工具让使用者一直在思考,那一定不是好工具。我那锤子砸钉子的时候也没有先按几个按钮。当然svn也不是啥好工具。

所以本文的观点是站在我们开发的场景中从一种不好用的工具向着另外一种不好用的工具迁移。如同砸钉子的时候,始终没有找到锤子,只找到了瑞士军刀和扳手。没办法还是要
砸。

svn 迁移到git上遇到非常多的坑。大家要是开发任务紧急,就等不急的时候再迁移吧。

这里也不在意你到底使用的gerrit还是gitlab还是github. 反正都不好迁移。

一般使用的命令

1
2

git svn clone [某分支] --authors-file=users.txt --no-metadata -s (这里的分支是/trunk的上一层)

另外还可以是:

1
2

git svn clone -r383874:HEAD [你的分支] --authors-file=users.txt --no-metadata --trunk=trunk --tags=milestones --branches=branches

第二条命令是带上版本号的。也可以指定什么分支会变成git的trunk,什么分支会变成git的tag等等。
这里的users.txt内容是:
[svn的名字] = [git上的名字] <[git上的email]>
例如:
aa=bb[email protected]
tt=ee[email protected]
细数一下我自己遇到的问题:

1. ** Can’t locate Term/ReadKey.pm in @INC ** 。 不要听网上说的装什么cpan,
也不要装什么其他的软件。直接执行 svn co [一个分支]。 输入以下自己的用户名密码,然后这个问题就不存在了。

1.1 如果输入密码后,还是不行。 删除这个文件 $HOME/.subversion/auth/svn.simple/* 。 然后再 svn co , 再
git svn clone.
2. ** Do not be alarmed at the above message git-svn is just searching
aggressively for old history. ** 遇到这个提示…这个提示是吓唬你的.

3. ** Author: xx not defined in users.txt file **
这是你的users.txt里面没有某些用户。可能这些用户过于久远,你忘记加入了。

4.系统文件没有找到条目。会有下面的错误:

1
2
3
4
5
6

Initializing parent: refs/remotes/origin/trunk@22086
W: Ignoring error from SVN, path probably does not exist: (160013): 文件系统没有条目: 找不到路径 “/xxx/ooo/101”: 额外错误:: File not found: revision 101, path '/txx/slsl/'
W: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
This may take a while on large repositories

这说有些 svn 版本信息太古老了。实在没有找到对应的diff啥的。也可能被svn管理员早就删除了。所以执行 git svn clone的时候最好带上
-r[A version]:[B version]

1
2

git svn clone -r20202:HEAD [某分支] --authors-file=users.txt --no-metadata -s

5. ** Use of uninitialized value $u in substitution (s///) ** 某些git
svn版本代码写的搓。只好手工改代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

vi /usr/lib/perl5/vendor_perl/5.14/Git/SVN.pm
修改
$u =~ s!^\Q$url\E(/|$)!! or die
"$refname: '$url' not found in '$u'\n";

改成:
if(!$u) {
$u = $pathname;
}else {
$u =~ s!^\Q$url\E(/|$)!! or die
"$refname: '$url' not found in '$u'\n";
}
然后重新运行。

6. git svn clone 结束后, 执行一下 git branch -a, 发现没有一些之前开的分支。例如我们的milestone分支都叫
/milestoneXXX. 是之前git svn clone的命令的问题。 应该改为:

1
2

git svn clone -r383874:HEAD [你的分支] --authors-file=users.txt --no-metadata --trunk=trunk --tags=milestones --branches=branches

另外 git TAG和 svn开一个tag的性质不是很一致。 git tag依附于某一个commit. 而且是不变化的,从这个点开出来的所有分支,都从属于这
个TAG。svn的tag就是开了分支,可以从这个分支随意提交代码。从svn的这个TAG开出来的所有分支和这个svn TAG毛关系都没有。

好吧。说了这么多,其实我们项目就像钉子,而svn/git都不是锤子。虽然是钉子,但是钉子数目很多。遇到以上坑的,看到这篇文章希望能很快的跳过坑去~~

0%