笔记:DSL笔记之三 DSL实现

Written by 某L. Posted in Domain Specific Language, MDA

ClipboardImage1.png

一般来说,DSL的实现包含三种方式:内部DSL,外部DSL,DSL工作台

内部DSL是指DSL使用宿主语言实现,需要遵循宿主语言的语法;

外度DSL通常拥有独立的语法,通过编译或解释形成目标模型;

DSL工作台通常表现为一个支持DSL开发的IDE。

 

DSL一般先解析为语义模型(Semantic Model),有时还会进一步生成目标代码(target code)。

ClipboardImage

在解析为语义模型的过程中,一般隐含着一个概念——语法树(Syntax Tree)

ClipboardImage(1)

在内部DSL中,语法树的实现是以函数参数调用(嵌套函数 Nested Function)及嵌套对象(方法链)的形式。有时语言并没有强制的层次结构,那么就需要借助函数序列(Function Sequence)和上下文变量(Context Variables)来模拟层次结构。

语法(grammar)是用于描述文本流如何转换为语法树的规则集。

语法树和语义模型的不同之处在于:同样的语法树可能有不同的语义模型,反义亦然。

 

在解析生成语法树的过程中,解析器可能需要存储一些数据。为解决这个问题,引入了符号表(Symbol Table)

image

本质上来讲,符号表是一个字典,键为标识符,值为语法树中对应的对象。

DSL的测试可以分为三部分,对语义模型的测试,对解析器的测试,以及对DSL脚本测试。

是否要从evernote转向印象笔记

Written by 某L. Posted in Blogs

Evernote一直是埋头做产品的风格。

关于它,有很多有意思的数据。

比如:

  • 很多用户,过了一年后会再想起这款产品,并成为忠实用户。
  • 大部分付费用户,都是免费用了很久产品之后甘心上套的。

可以认为,Evernote是依靠内在的品质获胜的,虽然走得慢,却一直很稳。

但是这样的产品,想进入中国市场时,却选择了让人称奇的方式——创建功能基本一致,内容绝对隔离的产品——《印象笔记

要理解这么做的原因,不放先看看Evernote这款产品到底是什么。

Evernote做了什么

——《“2011年度公司”Evernote的成功之道

收集你生活中的“数字面包屑”

它可以让你很方便的保存东西并添加标签或注释,将你生活中的“面包屑”收集整理起来,不管是文字还是图片,也不管你添加的标签是时间、人名还是当时的心情。当你创建一个文件的时候,它就已经把时间、地点这些信息添加进去了。

快速查找你所需要的信息

它不仅仅保存信息,还能快速查找你所保存的东西,甚至人的大脑都没有这样的记忆力和效率。Evernote能够识别图片中的文本信息并加以保存和分类,即使是手写的。如果你把某次会议上记录内容的白板拍了下来,即使过段时间你只记的几个单词,Evernote也能帮你找出那张照片。

无处不在

它在你的PC、iPad、Mac和各种各样的智能手机上,还有网页版的Evernote。如果这还不够,你甚至可以通过邮件将信息保存到Evernote。

事实上,不仅如此。“围绕着Evernote形成了一个产品和服务的生态系统。电脑,手机,平板电脑、打印机以及扫描器都有集成Evernote功能的,有时候只需要通过一个专门的Evernote按钮就可以。“——http://xbeta.info/evernote-inc.htm

那么下一个问题是:

印象笔记还有什么

很遗憾,目前看来,印象笔记只有一个小小的核,像个营养不良的孩子,只能将就用一下。

包括:桌面版本,移动版本,未来会有的API,功能方面并没有太多变化。

但因为与原先的生态环境完全隔离,可以说,这完全是二次创业。

 

有人将evernote和还很不成熟的wiz比较,完败。http://xbeta.info/evernote2wiz.htm

这个比较基本完全忽略了围绕evernote的生态环境,但在国内来说,却是事实。

因为政府政策,国内互联网难以想象的封闭。

evernote的生态环境基本相当于全军覆灭。

在这种情态下,直接推倒重来,也就不是什么不可思议的事情了。

 

好在evernote一开始就没有打算强制留住用户,而是支持用户方便的转移对自己来说是无价之宝的用户数据。

另一种角度,这也给了印象笔记二次创业的先发优势。

遗憾的是,目前这种优势难以确立。

老用户转换完全依赖手工。

缺失网页剪辑工具,ifttt这种第三方强大应用的支持,怎么也没心情从国际版转回来。

虽然无法忍受网络的巨大延迟,不过好在软件本身的异步特性,为了高质量软件和服务,留在原地应该是正确的选择。

 

所以建议大家,别凑热闹了。

Open API权限管理的设计

Written by 某L. Posted in Blogs

今天凌晨,突然朋友们开始各种消息,追问微博发生了什么(全球各地)。

直到七点钟一条短信“你变成拉皮条的了?”,才醒来。

后来发现,因为八百年前授权的“安卓HiAPK”网站,结果微博被刷满了某某419之类的信息。

原因倒也简单,因为只是个下软件的论坛账户,所以密码超级简单;

但是不经意关联了微博账号,结果本来控制严格的微博账号形同虚设。

事情本是自己的责任,接下来的处理就让人不快了。

 

首先,新浪无提示的禁止账号发帖。

这是一个非常重要的保护措施,但生效多久,是否可以告知用户。

是否是自动恢复,还是必须人工申诉解决?

另外禁言功能基本上剥夺了微博所有功能,是否可以设计的精细一点,比如根据发帖渠道禁言。

 

授权是否可以做的细致一点。

目前的网站和应用授权,基本上就是一股脑过来让你选同意。

腾讯的做的记得是好一点,会区分几个权限,而新浪都是默认全选且不能修改。

这就好像好坏产品一起搭售,其实是垄断下不得不做的糟糕交易。

再加上应用授权管理界面的简陋,批量管理没办法进行,垃圾贴也无法批量删除,花了十几分钟差不多才恢复原有面貌。

让这种授权十分鸡肋。

 

新浪OAuth的实现也非常别扭,v1已经是渐渐废止,v2居然没有实现重要的token更新。

随着API对互联网应用越来越重要,权限控制一定是很核心的问题;

用户体验不好,失去用户安全性的信任,代价必然十分巨大。

Linux Web服务器性能调优 – Apache的工作模式及配置

Written by 某L. Posted in Blogs

一般来说Apache有两种常用工作模式prefork和worker;

要查看当前服务器的工作模式,请用命令 apache2 -l

$ apache2 -l
Compiled in modules:
core.c
mod_log_config.c
mod_logio.c
prefork.c
http_core.c
mod_so.c

可以看到prefork.c 说明现在在用prefork模式。

关于两种模式的区别,根据官方文档:

  • The workerMPM uses multiple child processes with many threads each. Each thread handles one connection at a time. Worker generally is a good choice for high-traffic servers because it has a smaller memory footprint than the prefork MPM.
  • The prefork MPM uses multiple child processes with one thread each. Each process handles one connection at a time. On many systems, prefork is comparable in speed to worker, but it uses more memory. Prefork’s threadless design has advantages over worker in some situations: it can be used with non-thread-safe third-party modules, and it is easier to debug on platforms with poor thread debugging support.

可以看到,这些主要和进程和线程有关,对于内存有限逻辑简单,不太考虑线程安全的网站,worker模式显然更加适合。

复习下进程和线程的主要区别和联系:

进程与线程区别与联系

  1. 划分尺度:线程更小,所以多线程程序并发性更高;
  2. 资源分配:进程是资源分配的基本单位,同一进程内多个线程共享其资源;
  3. 地址空间:进程拥有独立的地址空间,同一进程内多个线程共享其资源;
  4. 处理器调度:线程是处理器调度的基本单位;
  5. 执行:每个线程都有一个程序运行的入口,顺序执行序列和程序的出口,但线程不能单独执行,必须组成进程,一个进程至少有一个主线程。简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

worker模式是介于纯进程的prefork和纯线程的event模式直接的方式,在稳定性和资源上有一个取舍。

prefork配置解释

一个典型的prefork配置和解释如下

<IfModule prefork.c>
StartServers 20 # 启动服务数,对应启动进程数
MinSpareServers 50 # 最小空闲服务(提高响应能力),当前进程数 > 最小空闲服务 + 工作进程
MaxSpareServers 100 # 最大空闲服务(合理释放资源),当前进程数 < 最大空闲服务 + 工作进程
MaxClients 200 # 最大客户端,对应最大进程数
MaxRequestsPerChild 20000 # 每个服务最多处理的请求数量,设定一个有限值可以避免内存泄漏,但会消耗进程创建和销毁的资源
</IfModule>

prefork是用起来最方便的设置,apache的默认设置也是如此。
但该模式最内存资源消耗巨大。举例来说:
一般情况下,一个PHP网站中,每个server需要30M左右内存。
按照前文的配置,最多将占用6G左右的内存。
如果资源不足,就会引发频繁的page fault,大量的SWAP,系统产生大量IO,导致宕机。

所以合理的调整参数,满足网站并发要求和资源限制,在小内存(1G),prefork模式几乎是不可能做到的。

worker配置解释

<IfModule worker.c>

StartServers 15 # 启动的服务,对应进程

ServerLimit 15 # 最大服务限制 应满足 ServerLimit > MaxClients / ThreadsPerChild

MaxClients 256 # 最大客户端数量
ThreadLimit 256 # 最大线程数量
MinSpareThreads 30 # 最小空闲线程(提高响应能力),当前线程数 > 最小空闲服务 + 工作线程
MaxSpareThreads 305 # 最大空闲线程(合理释放资源),当前线程数 < 最大空闲服务 + 工作线程
ThreadsPerChild 255 # 每个子进程对应对线程数
MaxRequestsPerChild 0 # 每个进程处理的最大请求数量,达到即销毁新建进程
</IfModule>

类似的,我们也主要关注其并发响应能力和资源占用情况。

上面的配置可以支持256的并发,内存占用约大于 15 * 30M = 450M 左右,算上线程的开销,大致小于500M。

其他建议

并发和性能与很多东西相关,不是简单计算能够解决的。

这里的配置主要是避免系统瓶颈,同时保护服务器不要超过应用能力。

实际情况中,和磁盘性能,网络,CPU等都有关系,建议在对硬件的充分理解上,结合性能测试工具不断调优。Linux WEB Perfomance Tunning Toolbox

Linux WEB服务器性能调优 – 工具箱

Written by 某L. Posted in Blogs

以下是这两天调优的小笔记。第一部分 – 工具

工具

top

top 命令用于互动查看系统情况,相信linux用户都用过。

备注:H 可以显示线程 u 可以指定用户

ps

ps可以列出进程状态,最经典的用法就是 ps aux

不过我更喜欢加上 ps aux -H 可显示进程层次

另外 ps aux -T 可以显示线程

pstree

以树形方式简单直接显示进程,常用 pstree –ph (带线程)

lsof

使用它既可以知道进程打开了哪些文件,也可以了解一个文件被哪个进程打开。

一般需配合 grep 使用,对于前面几个工具,发现状态经常为D IOWait较高的情况,最适合用lsof分析原因。

举例:

lsof /etc/passwd 查看谁打开了passwd文件

lsof -p 9995 查看进程9995打开的文件

lsof -i -n -p 显示网络连接状态也非常好用

ab

压力测试工具

常用 ab -c 20 -n 1000 http://example.org/

用20并发请求1000次 http://example.org/ 并汇总统计

sar

系统状态统计

vmstat

系统状态统计

短命令

TCP网络连接状态

netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,”t”,state[key]}’
会得到类似下面的结果,具体数字会有所不同:
LAST_ACK         1
SYN_RECV         14
ESTABLISHED      79
FIN_WAIT1        28
FIN_WAIT2        3
CLOSING          5
TIME_WAIT        1669

SYN_RECV表示等待响应,如果数值较高,需要提高服务器的吞吐量

ESTABLISHED是成功建立连接的,如果占主导是好事情

其他意义不大,有兴趣可以查看TCP相关资料

iPhone, iPad 应用安装指南

Written by 某L. Posted in Blogs

image_thumb.png

按照官方的模式,通过iTune同步应用和在设备的App Store直接购买是唯一的两种安装应用的方式。

而为了安装破解的收费软件,和一些系统级别的软件更新,就需要更特别一点的方法。

Highlight:

    1. 最基本最守法的是通过iTune App Store(通过电脑或手机直接下载)安装
    2. 最好的破解包是ipa格式的,deb是某些系统包必须的格式,pxl是最不推荐的,因为会影响系统稳定性。
    3. 安装第三方软件,iPhone需先越狱
    4. 首先考虑App Store安装,然后是Cydia(deb)或AppSync+iTunes(ipa),接着是通过SSH或者i-funbox + installous安装,91手机助手之类请尽量不考虑。

    Recent Comments

    某L_

    |

    我授权了一堆,现在也基本取消了。
    目前新浪的OAuth2实现只能支持24小时,因为没有refresh token

    Allo

    |

    理论上Oauth2规范是存在授权期限的,一般是1周。我基本不授权第三方网站,尤其是论坛

    某L_

    |

    AV3.IT
    这个留给你

    花花的小三

    |

    独立域名博客还是靠谱一些,这边做个301,权重什么的都平滑转移过去了。话说你们一个av2.me,一个av4.us,难道我也要找个av前缀的?