我对DAO的理解

Posted on Wed 09 January 2013 in 我用(IT) • Tagged with Design Patterns, Program Language

Context

上午review一个新项目的代码,这个项目预估今年用户规模在500万以上。程序架构我已经搭建完成了,主要就是review一个同事写的业务代码。 我对他使用DAO的方式有很大的疑虑,虽然用了很长的时间讨论,但我无法说服他改变。 如鲠在喉,于是动笔写出我的意见,与大家交流。欢迎站在我同事的角度来说服我或再多给我一些能说服我同事的理由。

先描述一下同事写的代码,他把DAO当成一个工具类来用,没写实体类,而是讨巧的用Map做容器,用列名做key来存储实体,然后写了一个通用的方法支持增删改查。

我的理解

首先DAO是一种设计模式,用来分离低级别的数据访问逻辑与高级别的业务逻辑; 在实现上,数据访问对象(Data Access Object)是一个对象,它为某类数据库或持久存储系统提供一个抽象接口。应用程序对数据的操作都映射到持久层,DAO提供具体的数据操作而不暴露数据库的详细信息,从而实现底层数据操作逻辑与业务逻辑的分割。 一个典型的DAO实现有以下组件:

  1. 一个获取DAO对象的工厂类
  2. 一个定义DAO如何操作数据的接口
  3. 一个实现了DAO接口的具体类
  4. 数据传输对象(DTO)或称域对象(Domain)/实体类(Entity)

把DAO层变成一个工具类让我们失去了什么?

  1. Map替代DTO的副作用:
  2. 看不到清晰的业务域对象,不知道哪些域对象具有可用的持久存储;无法利用IDE的自动完成特性;这无疑会降低程序的可读性;
  3. 失去了类型安全性:
  4. 损失了编译时发现某些问题的可能性,可能降低程序的可靠性 ...


Continue reading

Study of Lightweight markup language

Posted on Sun 06 January 2013 in 我用(IT) • Tagged with github, markdown, reStructuredText

以前对txt2tags(moinmoin采用的语法标准)和reStructuredText的语法很熟,后来Jira升级到也支持Conflence wiki标准,于是textile【注1】也用得挺顺溜了。现在因为开始用github,另外一种轻量标记语言Markdown又走进了视野。 虽然都不复杂,但不看一下语法也是没法用的,还得占用我本就不够用的脑部存储。这些轮子的发明有些重复了。

推荐这篇语法说明,把原文翻译得比较好。

初次使用感受

段落和换行:双回车分段和txt2tags的语法一样,行尾加两个空格可以段内换行的规则挺不错的; 链接的格式比较新鲜:This link ; 表格:本身不支持,但可以用html的标记来完成; 代码:用单个或多个``把代码括起来。从在github上的效果上看与中文之间必须加空格。

引用资料

  • 轻量标记语言比较: http://en.wikipedia.org/wiki/Lightweight_markup_language ...

Continue reading

MySQL轻量数据同步工具比较

Posted on Mon 26 November 2012 in 我用(IT) • Tagged with MySQL

Background

Context

新业务部署在AWS上,把MySQL放到RDS中了,从性能测试结果上看还是很满意的。业务自身需要实时与主IDC(国内机房)的数据库保持同步(涉及到几十张表,百兆以上的数据量,实时性要求也很高,幸亏只要求单向),原来的技术方案采用系统级的Master-Slaver复制,于是老革命遇到了新问题: 由于RDS目前并不开放系统级的API,使得利用系统IO(例如DRBD的HA方案)或基于binary log(master-slaver)进行复制的系统级方案无法应用。 要么找基于MySQL自有接口的轻量级工具完成同步,要么改应用逻辑自己实现。 后者是个工作量不小的活计,所以我希望能找一个现成儿的工具。

http://aws.amazon.com/rds/faqs/#103

Q: Can I directly access the binary logs for my Database Instance to manage my own replication? Amazon ...


Continue reading

Change the appearance of Safari Reader in Safari 6.0

Posted on Wed 12 September 2012 in 我用(IT) • Tagged with Safari Extensions, 浏览器

Safari自带的Reader工具很好用,但无法对阅读界面进行调整。这里的方法提供了手工修改Reader属性的线索,原理是修改Reader使用的模板,位置如下: /System/Library/PrivateFrameworks/Safari.framework/Versions/A/Resources/Reader.html

还有更简单的方法,下载这个插件,支持调整Reader的字体、行宽等属性。

https://extensions.apple.com 下的Safari插件很多,有空的时候可以淘淘宝。


Continue reading

新浪微博开放平台学习

Posted on Fri 27 April 2012 in 我用(IT) • Tagged with PaaS, Python

关于新浪微博开放平台

From http://open.weibo.com/wiki/平台概述

微博开放平台是一个基于新浪微博客系统的开放的信息订阅、分享与交流平台。微博开放平台为您提供了海量的微博信息、粉丝关系、以及随时随地发生的信息裂变式传播渠道。 您可以登录平台并创建应用,使用微博平台提供的接口,创建有趣的应用或者让您的网站具有更强的社交特性。

用微博账号登录 经过简单的代码整合,并在自己的网站上放置微博登录按钮,您的网站用户就能够使用微博账号进行登录: 网站可以获取当前用户的用户名、头像图片、当前用户的粉丝和关注对象列表; 使用OAuth的授权机制进行开发,在网站的显著位置添加“与新浪微博连接”的功能,让用户与能够直接点击并登录。

内容发布与绑定 微博平台也提供了发布微博信息的接口,在网站上绑定微博账户后,可以在自己的网站上整合发布微博信息功能: 让用户在网站上生成的信息同步到微博网站上; 可以通过账号绑定来实时同步微博信息,让用户的关注者也能够及时了解用户的动态。

入门指南

的平台开放接口(Open API)对微博系统进行操作。 http://open.weibo.com/wiki/FAQ

  1. 注册成为开发者,获取AppKey 登录http://open ...


Continue reading

生成静态网页图片库的工具

Posted on Tue 27 March 2012 in 我用(IT) • Tagged with Picasa, Python

为了和大家分享照片,使用了两个生成静态网页图片库的工具:Picasa和create_JSON_gallery.py。 前者是google生产的强大看图软件,后者是斯坦福计算机系Phil Guo同学写的一个Python脚本; 前者用起来很简单但可选择的样式很少,后者的功能很强大,但操作起来还是要花点儿时间的。 这里就和大家分享一下使用经验

I use Philip Guo's JSON Photo Gallery: Create HTML webpage galleries with Python, no server-side scripting is required. Below is the steps of how i make it work.

requirement

python 2.6+ needed.

PIL wget http://effbot.org ...


Continue reading

用Eventquery.vbs获得系统日志信息

Posted on Fri 24 February 2012 in 我用(IT) • Tagged with 命令行工具

Refer: http://technet.microsoft.com/zh-cn/68672494-7700-4cbf-8392-4b6ef87b8749

描述: EventQuery.vbs 脚本允许管理员从一个或多个事件日志中列表事件和事件属性。

Sample: - Microsoft Security Client by Cmd Line set Scan_File=x:....

set MSC_CMD="%ProgramFiles%Microsoft Security ClientAntimalware"MpCmdRun set MSC_CMD=%MSC_CMD% -scan -ScanType 3 -SignatureUpdate -UNC -file %MSC_CMD% %Scan_File%

  • output Scan starting... Scan finished. Scanning x:.... found 1 threats. Cleaning ...


Continue reading

UML规范阅读指导

Posted on Thu 22 December 2011 in 我用(IT) • Tagged with UML

今年八月OMG发布了UML 2.4.1 规范。观察规范的发布速度,作为软件开发领域内最最权威的建模语言可以当得起“与时俱进”四个字。

作为一个软件从业者,使用UML也有好多个年头了,不看看原版Spec显得实在不够 Professional,让我们打开下面这个链接,开始阅读UML规范的学习之路吧。 http://www.omg.org/spec/UML/2.4.1/

规范概览

从UML 2.0开始, UML规范被拆分成两个部分:基础结构规范(Infrastructure)和上层结构规范(Superstructure)。

基础结构规范定义了构成UML语言的基础;上层结构规范完善基础结构规范,定义了用户要使用的东西。这两部分规范构成了完整的 UML 2 规范。

UML的目标

基础结构规范是UML工具开发商们关注的,上层结构规范是我们这些UML真正用户关心的。翻开Superstructure第一章Scope我们可以看到如下文字

The objective of UML is to ...


Continue reading

怎样诊断系统高负载问题?

Posted on Fri 09 December 2011 in 我用(IT) • Tagged with linux

最近一个每日40万PV的应用经常挂点,少壮们努力奋斗,终于定位到了问题。把分析方法和大家分享一下。

Uptime - 查看系统平均负载

Load是指在指定时间段内等待运行队列中等待进程的数量,时间段如下: load average: 1min, 5min, 15min 通常,当一个系统出现高负载时就会出现不响应或运行缓慢甚至造成系统中的应用服务异常—我们必须降低负载来提升系统响应。 要想解决,我们必须知道是什么原因造成的高负载。

造成负载过高的原因

当一个线程无法获得以下资源时,就会进行等待。 CPU I/O:Disk 或 Network 当CPU不够强大或因为某种问题存在IO阻塞时,系统负载就会过高。

定位问题的一般步骤

Top - 对CPU进行判断

首先我们看一下top命令 -bash-3.2$top

top - 17:27:17 up 42 days, 6:09, 5 users, load average: 0 ...


Continue reading

UUID

Posted on Thu 08 December 2011 in 我用(IT) • Tagged with Algorithm, Python

通用唯一识别码 (Universally Unique Identifier, UUID)是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF)的组织在分散式计算环境 (Distributed Computing Environment, DCE)领域的一部份。

UUID的目的,是让分散式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的UUID。在这样的情况下,就不需考虑资料库建立时的名称重复问题。

1. 定义

一个UUID是由32个16进制数字所构成,所以UUID理论上的总数为2(4 x 32) =2^128,约等于3.4 x 10^38。也就是说若每奈秒(1ns=10^-9s)产生1兆个UUID,要花100亿年才会将所有UUID用完。

UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字元。范例; 550e8400-e29b-41d4-a716-446655440000 ...


Continue reading

Vim配置

Posted on Thu 08 December 2011 in 我用(IT) • Tagged with linux, 命令行工具

最近Vim用得比较多,发现朋友们博客上的配置介绍写得非常好,让我轻松就完成了配置。 强烈推荐呼噜猫的配置说明。 坚毅的刀刀的这篇文章也请参考。

简要操作步骤

在启动Vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本。

创建当前用户的.vimrc文件的命令如下: $vi ~/.vimrc 设置完后 :wq 进行保存退出即可。

我现在Mac上用的.vimrc

" 更详细的.vimrc参考: http://vi-improved.org/vimrc.html

" Basics { set nocompatible " explicitly get out of vi-compatible mode "set noexrc " don't use local version of .(g)vimrc, .exrc set ...


Continue reading

使用PythonTidy作为PyDev的Code Formatter

Posted on Fri 25 November 2011 in 我用(IT) • Tagged with Python

PyDev自身的Code Formatter能力较弱,不支持Maximum Line Length(完整的编码格式标准)。但它支持插入其它beautifier,比如PythonTidy。

操作过程如下,我在Mac OS下,Eclipse Helios,PyDev 2.24下:

  1. 下载PythonTidy.py wget http://lacusveris.com/PythonTidy/PythonTidy-1.20.python -O PythonTidy.py

  2. 编写Jython脚本 参考:http://pydev.org/manual_articles_scripting.html 注意:pyedit_pythontidy.py的第64行各位要修改一些,让PythonTidy.py能被脚本找到,linux下注意PythonTidy.py需要有执行权限。

    """
    This code is public domain.
    The ...


Continue reading

Creating A Thrift Service Step by Step

Posted on Sun 09 October 2011 in 我用(IT) • Tagged with SOA, Thrift

  1. 生成基础代码 1) 创建接口定义文件
    namespace java com.li3huo.thrift.example

struct UserProfile { 1: i32 uid, 2: string name, 3: string email } service UserStorage { void store(1: UserProfile user), UserProfile retrieve(1: i32 uid) } 2) 生成Java基础代码

thrift -r -gen java:java5 example.thrift
2. 在eclipse中编写代码 1) 创建eclipse工程
mkdir java #own code mkdir ...


Continue reading

Thrift Quick Start

Posted on Sat 08 October 2011 in 我用(IT) • Tagged with SOA, Thrift

Thrift的入门文档需要更新

运行Thrift的应用(Java)

其实Thrift不用安装就能跑。 为了安装Thrift,在Mac(Lion)上还得装Xcode4才能configuration和make,Turorial的顺序不是最简单路径。 应该准备一个QuickStart(只要提供tutorial.jar,80多k的jar包就够了),让大家直接拿一个可运行的程序,这样能吸引更多新手啊。 如果手头儿没有现成儿可以跑的程序,那就得安装Thrift(Gen Java Code)之后编译示例文件从头开始生成tutorial.jar了。

安装Thrift

从主站进入,下了个thrift-0.7.0.tar.gz,解开,没看明白怎么用; 不急,打开Turorial页面,写得非常简单,再结合解开的东西,还是没明白; 不急,打开$thrift/README,按Installation的提示进行安装
chmod +x configure ./configure ./make sudo ...


Continue reading

让Moin1.9跑在Python2.7下

Posted on Wed 03 August 2011 in 我用(IT) • Tagged with Mac OS Lion, moinmoin

晨仔送来了OS X Lion,毫不费力的就升成功了,得赞一个。 结果Python被升级到2.7了,Moin起不来了,解决过程如下

我使用的版本

Moin: 1.9.3 Python: 2.7.1

打patch:Moin patch for Python2.7

解决服务起不来的问题:http://hg.moinmo.in/moin/1.9/rev/a4a7f275b7b3

MoinMoin/support/werkzeug/templates.py 注释掉这一行:from compiler.consts import SC_LOCAL, SC_GLOBAL, SC_FREE, SC_CELL

清cache ...


Continue reading