paulwong

#

权限管理要点参考

界面:



算法:



说明:
http://lilyproject.org/books/daisy_docs_book--2_3/publications/html-chunked/output/s182.html

注意:
此处的ACL可以是一个系统多个的,如某些情况用不同的ACL。
资源:可以指文档ID,页面ID之类的,由于文档可能很多个,因此用表达式代替之。
角色:指ROLE/USER之类的。
动作(PERMISSION):指操作类型,如读、写、删除等。
结果(ACTION):指GRANT、DENNY等。
具体实现方式:根据表达式进行运算,看哪个表达式为TRUE,则用哪个,再传入PERMISSION 类型,角色,看ACTION是GRANT还是DENNY,如果是GRANT则授权通过,DENNY则授权不通过。

posted @ 2013-01-28 17:34 paulwong 阅读(601) | 评论 (0)编辑 收藏

未来企业IT技术关注点及IT架构变革探讨

gartner十大战略性技术分析如下:

1.       移动设备战争

移动设备多样化,Windows仅仅是IT需要支持的多种环境之一,IT需要支持多样化环境。

2.       移动应用与HTML5

HTML5将变得愈发重要,以满足多元化的需求,以满足对安全性非常看重的企业级应用。

3.       个人云

个人云将把重心从客户端设备向跨设备交付基于云的服务转移。

4.       企业应用商店

有了企业应用商店,IT的角色将从集权式规划者转变为市场管理者,并为用户提供监管和经纪服务,甚至可能为应用程序专家提供生态系统支持。

5.       物联网

物联网是一个概念,描述了互联网将如何作为物理实物扩展,如消费电子设备和实物资产都连接到互联网上。

6.       混合型IT和云计算

打造私有云并搭建相应的管理平台,再利用该平台来管理内外部服务

7.       战略性大数据

企业应当将大数据看成变革性的构架,用多元化数据库代替基于同质划分的关系数据库。

8.       可行性分析

大数据的核心在于为企业提供可行的创意。受移动网络、社交网络、海量数据等因素的驱动,企业需要改变分析方式以应对新观点

9.       内存计算

内存计算以云服务的形式提供给内部或外部用户,数以百万的事件能在几十毫秒内被扫描以检测相关性和规律。

10.    整合生态系统

市场正在经历从松散耦合的异构系统向更为整合的系统和生态系统转移,应用程序与硬件、软件、软件及服务打包形成整合生态系统。

结合应用实践及客户需求,可以有以下结论:

1.       大数据时代已经到来

       物联网发展及非结构化、半结构化数据的剧增推动了大数据应用需求发展。大数据高效应用是挖掘企业数据资源价值的趋势与发展方向。

2.       云计算依旧是主题,云将更加关注个体

       云计算是改变IT现状的核心技术之一,云计算将是大数据、应用商店交付的基础。个人云的发展将促使云端服务更关注个体。

3.       移动趋势,企业应用商店将改变传统软件交付模式

       Windows将逐步不再是客户端主流平台,IT技术需要逐步转向支持多平台服务。在云平台上构建企业应用商店,逐步促成IT的角色将从集权式规划者转变为应用市场管理者

4.       物联网将持续改变工作及生活方式

       物联网将改变生活及工作方式,物联网将是一种革新的力量。在物联网方向,IPV6将是值得研究的一个技术。

未来企业IT架构图如下:

架构说明:

1.应用将被拆分,客户端将变得极简,用户只需要关注极小部分和自己有关的内容,打开系统后不再是上百个业务菜单。

2.企业后端架构将以分布式架构为主,大数据服务能力将成为企业核心竞争力的集中体现。

3.非结构化数据处理及分析相关技术将会得到前所未有的重视。

受个人水平有限,仅供参考,不当之处,欢迎拍砖!


http://blog.csdn.net/sdhustyh/article/details/8484780

posted @ 2013-01-14 23:09 paulwong 阅读(299) | 评论 (0)编辑 收藏

Activiti入门Demo(kft-activiti-demo)

  • 本项目旨在让Activiti初学者可以快速入门,使用工作流里面的请假流程作为Activiti企业实战的Hello World。
  • 简单通过这个实例说明如何结合流程与业务,表单、业务、流程之前如何衔接……
  • 发起这个项目也是目前没有太完整、接近企业真实项目的例子,本项目作为一个补充希望能帮助更多人。
  • 本项目托管在著名的Github,地址:https://github.com/henryyan/kft-activiti-demo 。
  • 参考WIKI:https://github.com/henryyan/kft-activiti-demo/wiki
kft-activiti-demo

posted @ 2013-01-06 21:39 paulwong 阅读(1702) | 评论 (0)编辑 收藏

某hadoop视频教程内容

@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 第1章节:
> Hadoop背景
> HDFS设计目标
> HDFS不适合的场景
> HDFS架构详尽分析
> MapReduce的基本原理



第2章节
> Hadoop的版本介绍
> 安装单机版Hadoop
> 安装Hadoop集群



第3章节
> HDFS命令行基本操作
> Namenode的工作机制
> HDFS基本配置管理



第4章节
> HDFS应用实战:图片服务器(1) - 系统设计
> 应用的环境搭建 php + bootstrap + java
> 使用Hadoop Java API实现向HDFS写入文件



第5章节
> HDFS应用实战:图片服务器(2)
> 使用Hadoop Java API实现读取HDFS中的文件
> 使用Hadoop Java API实现获取HDFS目录列表
> 使用Hadoop Java API实现删除HDFS中的文件


第6章节
> MapReduce的基本原理
> MapReduce的运行过程
> 搭建MapReduce的java开发环境
> 使用MapReduce的java接口实现WordCount



第7章节
> WordCount运算过程分析
> MapReduce的combiner
> 使用MapReduce实现数据去重
> 使用MapReduce实现数据排序
> 使用MapReduce实现数据平均成绩计算



第8章节
> HBase详细介绍
> HBase的系统架构
> HBase的表结构,RowKey,列族和时间戳
> HBase中的Master,Region以及Region Server


第9章节
> 使用HBase实现微博应用(1)
> 用户注册,登陆和注销的设计
> 搭建环境 struts2 + jsp + bootstrap + jquery + HBase Java API
> HBase和用户相关的表结构设计
> 用户注册的实现



第10章节
> 使用HBase实现微博应用(2)
> 使用session实现用户登录和注销
> “关注"功能的设计
> “关注"功能的表结构设计
> “关注"功能的实现


第11章节
> 使用HBase实现微博应用(3)
> “发微博"功能的设计
> “发微博"功能的表结构设计
> “发微博"功能的实现
> 展现整个应用的运行



第12章节
> HBase与MapReduce介绍
> HBase如何使用MapReduce



第13章节

> HBase应用实战:话单查询与统计(1)
> 应用的整体设计
> 开发环境搭建
> 表结构设计



第14章节
> HBase应用实战:话单查询与统计(2)
> 话单入库单设计与实现
> 话单查询的设计与实现



第15章节
> HBase应用实战:话单查询与统计(3)
> 统计功能设计
> 统计功能实现



第16章节
> 深入MapReduce(1)
> split的实现详解
> 自定义输入的实现
> 实例讲解



第17章节
> 深入MapReduce(2)
> Reduce的partition
> 实例讲解



第18章节
> Hive入门
> 安装Hive
> 使用Hive向HDFS存入结构化数据
> Hive的基本使用


第19章节
> 使用MySql作为Hive的元数据库
> Hive结合MapReduce



第20章节
> Hive应用实战:数据统计(1)
> 应用设计,表结构设计



第21章节
> Hive应用实战:数据统计(2)
> 数据录入与统计的实现 

posted @ 2013-01-05 12:59 paulwong| 编辑 收藏

HBase的一些应用设计tip

1,对于HBase的存储设计,要考虑它的存储结构是:rowkey+columnFamily:columnQualifier+timestamp(version)+value = KeyValue in HBase,一个KeyValue依次按照rowkey,columnkey和timestamp有序。一个rowkey加一个column信息定位了hbase表的一个逻辑的行结构。
0XJJ{2%~G~[G]JBPMW}YE~A 

2,从逻辑存储结构到实际的物理存储结构要经历一个fold过程,所有的columnFamily下的内容被有序的合并,因为HBase把一个ColumnFamily存储为一个StoreFile。

3,把HBase的查询等价为一个逐层过滤的行为,那么在设计存储时就应该明白,使设计越趋向单一的keyvalue性能会越好;如果是因为复杂的业务逻辑导致查询需要确定rowkey、column、timestamp,甚至更夸张的是用到了HBase的Filter在server端做value的处理,那么整个性能会非常低。 

4,因此在表结构设计时,HBase里有tall narrow和flat wide两种设计模式,前者行多列少,整个表结构高且窄;后者行少列多,表结构平且宽;但是由于HBase只能在行的边界做split,因此如果选择flat wide的结构,那么在特殊行变的超级大(超过file或region的上限)时,那么这种行为会导致compaction,而这样做是要把row读内存的~~因此,强烈推荐使用tall narrow模式设计表结构,这样结构更趋近于keyvalue,性能更好。 

5,一种优雅的行设计叫做partial row scan,我们一般rowkey会设计为<key1>-<key2>-<key3>...,每个key都是查询条件,中间用某种分隔符分开,对于只想查key1的所有这样的情况,在不使用filter的情况下(更高性能),我们可以为每个key设定一个起始和结束的值,比如key1作为开始,key1+1作为结束,这样scan的时候可以通过设定start row和stop row就能查到所有的key1的value,同理迭代,每个子key都可以这样被设计到rowkey中。 

6,对于分页查询,推荐的设计方式也不是利用filter,而是在scan中通过offset和limit的设定来模拟类似RDBMS的分页。具体过程就是首先定位start row,接着跳过offset行,读取limit行,最后关闭scan,整个流程结束。 

7,对于带有时间范围的查询,一种设计是把时间放到一个key的位置,这样设计有个弊端就是查询时一定要先知道查询哪个维度的时间范围值,而不能直接通过时间查询所有维度的值;另一种设计是把timestamp放到前面,同时利用hashcode或者MD5这样的形式将其打散,这样对于实时的时序数据,因为将其打散导致自动分到其他region可以提供更好的并发写优势。 

8,对于读写的平衡,下面这张图更好的说明了key的设计:salting等价于hash,promoted等价于在key中加入其他维度,而random就是MD这样的形式了。
  VN{YX`@[2P9AQ[@(2U8N9{0

9,还有一种高级的设计方式是利用column来当做RDBMS类似二级索引的应用设计,rowkey的存储达到一定程度后,利用column的有序,完成类似索引的设计,比如,一个CF叫做data存放数据本身,ColumnQualifier是一个MD5形式的index,而value是实际的数据;再建一个CF叫做index存储刚才的MD5,这个index的CF的ColumnQualifier是真正的索引字段(比如名字或者任意的表字段,这样可以允许多个),而value是这个索引字段的MD5。每次查询时就可以先在index里找到这个索引(查询条件不同,选择的索引字段不同),然后利用这个索引到data里找到数据,两次查询实现真正的复杂条件业务查询。

10,实现二级索引还有其他途径,
比如:
1,客户端控制,即一次读取将所有数据取回,在客户端做各种过滤操作,优点自然是控制力比较强,但是缺点在性能和一致性的保证上;
2,Indexed-Transactional HBase,这是个开源项目,扩展了HBase,在客户端和服务端加入了扩展实现了事务和二级索引;
3,Indexed-HBase;
4,Coprocessor。 

11,HBase集成搜索的方式有多种:1,客户端控制,同上;2,Lucene;3,HBasene,4,Coprocessor。 

12,HBase集成事务的方式:1,ITHBase;2,ZooKeeper,通过分布式锁。 

13,timestamp虽然叫这个名字,但是完全可以存放任何内容来形成用户自定义的版本信息。

posted @ 2013-01-02 23:09 paulwong 阅读(1101) | 评论 (0)编辑 收藏

用JAMES实现自己的邮件服务器

应用服务器Apache企业应用XMLC
简介
James 是一个企业级的邮件服务器,它完全实现了smtp 和 pops 以及nntp 协议。同时,james服务器又是一个邮件应用程序平台。James的核心是Mailet API,而james 服务齐是一个mailet的容器。它可以让你非常容易的实现出很强大的邮件应用程序。James开源项目被广泛的应用于与邮件有关的项目中。你可以通过它来搭建自己的邮件服务器。我们可以利用Mailet API,编程接口来实现自己所需的业务。James集成了Avalon 应用程序框架以及Phoenix Avalon 框架容器。Phoenix为james 服务器提供了强大的支持。需要说明的是Avalon开源项目目前已经关闭。
快速上手
安装james
我这次使用的安装包是james 2.3.1。大家可以从这里下载到http://james.apache.org/download.cgi
现在让我们开始我们激动人心的james之旅。首先我们将james-binary-2.3.1.zip解压缩下载到你的安装目录。我们可以把这个过程理解为安装的过程。我在这里将它解压到c:\.并且把它改名为james.这样我们的james就安装好了。目录为C:\james。很简单吧!

准备知识 - 学习一些必要的知识
在我使用james的时候让我感觉首先理解james的应用程序结构是很重要的。否则你会在使用中感到很困惑。
它的应用程序结构是这样的:
James
|_ _apps
|_ _bin
|_ _conf
|_ _ext
|_ _lib
|_ _logs
|_ _tools
我们重点介绍一下两个文件夹bin 和 apps.
bin目录中的run.bat和run.sh是James的启动程序。只要记住这个重要文件就可以。
启动之后控制台显示如下:
Using PHOENIX_HOME: C:\james
Using PHOENIX_TMPDIR: C:\james\temp
Using JAVA_HOME: C:\j2sdk1.4.2_02
Phoenix 4.2
James Mail Server 2.3.1
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service started plain:119
FetchMail Disabled
Apps 目录下有个james的子目录这个目录是它的核心。
james
|_ _SAR-INF
|_ _conf
|_ _logs
|_ _var
|_mail
|_address-error
|_error
|_indexes
|_outgoing
|_relay-denied
|_spam
|_spool
|_nntp
|_....

|_users
SAR-INF 下有一个config.xml是james中的核心配置文件。
Logs 包含了与james有关的Log。调试全靠它了。
Var 包含了一些文件夹通过它们的名字我们大概也能猜测出它们的用途。Mail主要用于存储邮件。nntp主要用于新闻服务器。Users用于存储所有邮件服务器的用户。也就是邮件地址前面的东东。如:pig@sina.com的pig就是所谓用用户。

创建用户:
我们在James上建若干用户,用来测试收发邮件。当然如果你不用james本身的用户也可以。James以telnet 的方式提供了接口用来添加用户。下面我来演示一下。
首先使用telnet来连接james的remote manager .
1.telnet localhost 4555 回车
2.然后输入管理员用户名和密码(user/pwd : root/root 是默认设置这个可以在config.xml中修改)
JAMES Remote Administration Tool 2.3.1
Please enter your login and password
Login id:
root
Password:
root
Welcome root. HELP for a list of commands

3.添加用户
adduser kakaxi kakaxi
User kakaxi added

Adduser mingren mingren
User mingren added

4.查看添加情况
listusers
Existing accounts 2
user: mingren
user: kakaxi
得到上面的信息说明我们已经添加成功。


发送器
这个类主要用来测试我们的邮件服务器,可以不用将其打入包中。
java 代码 
package com.paul.jamesstudy;   
  
import java.util.Date;   
import java.util.Properties;   
  
import javax.mail.Authenticator;   
import javax.mail.Message;   
import javax.mail.PasswordAuthentication;   
import javax.mail.Session;   
import javax.mail.Transport;   
import javax.mail.internet.InternetAddress;   
import javax.mail.internet.MimeMessage;   
  
public class Mail {   
    private String mailServer, From, To, mailSubject, MailContent;   
  
    private String username, password;   
  
    private Session mailSession;   
  
    private Properties prop;   
  
    private Message message;   
  
    // Authenticator auth;//认证   
    public Mail() {   
        // 设置邮件相关   
        username = "kakaxi";   
        password = "kakaxi";   
        mailServer = "localhost";   
        From = "kakaxi@localhost";   
        To = "mingren@localhost";   
        mailSubject = "Hello Scientist";   
        MailContent = "How are you today!";   
    }   
    public void send(){   
        EmailAuthenticator mailauth =    
new EmailAuthenticator(username, password);   
        // 设置邮件服务器   
        prop = System.getProperties();   
        prop.put("mail.smtp.auth", "true");   
        prop.put("mail.smtp.host", mailServer);   
        // 产生新的Session服务   
        mailSession = mailSession.getDefaultInstance(prop,   
                (Authenticator) mailauth);   
        message = new MimeMessage(mailSession);   
  
        try {   
        message.setFrom(new InternetAddress(From)); // 设置发件人   
        message.setRecipient(Message.RecipientType.TO,    
new InternetAddress(To));// 设置收件人   
        message.setSubject(mailSubject);// 设置主题   
        message.setContent(MailContent, "text/plain");// 设置内容   
        message.setSentDate(new Date());// 设置日期   
        Transport tran = mailSession.getTransport("smtp");   
        tran.connect(mailServer, username, password);   
        tran.send(message, message.getAllRecipients());   
        tran.close();   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
    public static void main(String[] args) {   
        Mail mail;   
        mail = new Mail();   
        System.out.println("sending");   
        mail.send();   
        System.out.println("finished!");   
    }   
  
}   
  
class EmailAuthenticator extends Authenticator {   
    private String m_username = null;   
  
    private String m_userpass = null;   
  
    void setUsername(String username) {   
        m_username = username;   
    }   
  
    void setUserpass(String userpass) {   
        m_userpass = userpass;   
    }   
  
    public EmailAuthenticator(String username, String userpass) {   
        super();   
        setUsername(username);   
        setUserpass(userpass);   
    }   
  
    public PasswordAuthentication getPasswordAuthentication() {   
        return new PasswordAuthentication(m_username, m_userpass);   
    }   
}   


posted @ 2012-12-16 13:14 paulwong 阅读(913) | 评论 (0)编辑 收藏

java程序实现对sftp服务器的操作

FTP服务器中,如果使用的是FTP协议,则用户名和密码是以明文方式传输的,如果是以SFTP 的方式,就会通过加密的方式传输。

如果服务器中的用户增加了公钥的设置,则要求客户端要有相对应的私钥。

公/私钥的产生方法可见:http://www.jcraft.com/jsch/examples/KeyGen.java.html,值得注意的是,可以产生用密码的公私钥和无密码的公私钥。

SFTP服务器:http://www.xlightftpd.com/cn/tutorial/SSH2_SFTP_Setup.html,下载后,添加虚拟服务器,添加用户,并为用户添加公钥文件,即可。

JAVA模拟一个SFTP服务器:http://mina.apache.org/sshd-project/embedding_ssh.html
http://svn.apache.org/repos/asf/mina/sshd/trunk/
public void setupSftpServer(){
    SshServer sshd = SshServer.setUpDefaultServer();
    sshd.setPort(22);
    sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));

    List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
    userAuthFactories.add(new UserAuthNone.Factory());
    sshd.setUserAuthFactories(userAuthFactories);

    sshd.setCommandFactory(new ScpCommandFactory());

    List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>();
    namedFactoryList.add(new SftpSubsystem.Factory());
    sshd.setSubsystemFactories(namedFactoryList);

    try {
        sshd.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在这里介绍对sftp操作的一种java框架:JSch-Java Secure Channel,官方地址是:http://www.jcraft.com/jsch/

具体使用方法请看下面代码:

package jsch;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class Test {

    protected String host;//sftp服务器ip
    protected String username;//用户名
    protected String password;//密码
    protected String privateKey;//密钥文件路径
    protected String passphrase;//密钥口令
    protected int port = 22;//默认的sftp端口号是22

    /**
     * 获取连接
     * 
@return channel
     
*/
    public ChannelSftp connectSFTP() {
        JSch jsch = new JSch();
        Channel channel = null;
        try {
            if (privateKey != null && !"".equals(privateKey)) {
                //使用密钥验证方式,密钥可以使有口令的密钥,也可以是没有口令的密钥
                if (passphrase != null && "".equals(passphrase)) {
                    jsch.addIdentity(privateKey, passphrase);
                } else {
                    jsch.addIdentity(privateKey);
                }
            }
            Session session = jsch.getSession(username, host, port);
            if (password != null && !"".equals(password)) {
                session.setPassword(password);
            }
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");// do not verify host key
            session.setConfig(sshConfig);
            // session.setTimeout(timeout);
            session.setServerAliveInterval(92000);
            session.connect();
            //参数sftp指明要打开的连接是sftp连接
            channel = session.openChannel("sftp");
            channel.connect();
        } catch (JSchException e) {
            e.printStackTrace();
        }
        return (ChannelSftp) channel;
    }
    
    /**
     * 上传文件
     * 
     * 
@param directory
     *            上传的目录
     * 
@param uploadFile
     *            要上传的文件
     * 
@param sftp
     
*/
    public void upload(String directory, String uploadFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            File file = new File(uploadFile);
            sftp.put(new FileInputStream(file), file.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 下载文件
     * 
     * 
@param directory
     *            下载目录
     * 
@param downloadFile
     *            下载的文件
     * 
@param saveFile
     *            存在本地的路径
     * 
@param sftp
     
*/
    public void download(String directory, String downloadFile,
            String saveFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            sftp.get(downloadFile,saveFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除文件
     * 
     * 
@param directory
     *            要删除文件所在目录
     * 
@param deleteFile
     *            要删除的文件
     * 
@param sftp
     
*/
    public void delete(String directory, String deleteFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            sftp.rm(deleteFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void disconnected(ChannelSftp sftp){
        if (sftp != null) {
            try {
                sftp.getSession().disconnect();
            } catch (JSchException e) {
                e.printStackTrace();
            }
            sftp.disconnect();
        }
    }
}

在jsch自带的例子中,有一个可以根据密钥生成公钥的类,叫做UserAuthPubKey.java, 且带有图形界面。有用到的可以自己试试。

posted @ 2012-12-15 19:54 paulwong 阅读(10014) | 评论 (1)编辑 收藏

PathMatchingResourcePatternResolver

通常如果要查找文件,是用的File再传入一个绝对路径,如果要找WEB下面的就不方便了。SPRING有个好用的Resolver:PathMatchingResourcePatternResolver。

PathMatchingResourcePatternResolver是一个通配符的Resource查找器,包括:
/WEB-INF/*-context.xml
com/mycompany/**/applicationContext.xml
file:C:/some/path/*-context.xml
classpath:com/mycompany/**/applicationContext.xml

如果要处理一个目录下的文件就可以下面的代码: 
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        
Resource[] resources = resolver.getResources("classpath:com/you/atlas/webx/context/*.class");
        
System.out.println(resources[0].getURL());
File file = resources[0].getFile();
echo:file:/home/work/branche/springtest/target/classes/com/you/atlas/webx/context/WebxContextLoader.class

posted @ 2012-12-15 19:47 paulwong 阅读(1244) | 评论 (0)编辑 收藏

WINDOWS下的SFTP服务器安装搭建

因为最近的一个项目的客户需要使用SFTP给我放传送文件,公司的服务器都是WINDOWS 2003或者WINDOWS 2008,我必须找到一个免费的(这点很重要),好用的,稳定的SFTP服务端软件。

经过一番苦寻,找到了以下几款:

1. OpenSSH

参考文章:《Windows下用sftp打造安全传输》

OpenSSH 安装起来很快速,然后就是在CMD命令行里做若干设置,但是不知道哪里没做好,用CUTEFTP-SFTP客户端访问总是报错,折腾了一小会索性放弃,没有图形界面的东西,还是有点不太习惯,反正我也不是LINUX爱好者。

image

2.Core FTP Mini-Sftp Server

华军下载链接:http://www.onlinedown.net/soft/75991.htm

Core FTP Mini-Sftp Server是个绿色软件,什么都不用设置,下载后就一个exe程序,运行它,软件界面简单的吓人,就2个按钮:Start和About,随便写个用户名和密码点start就大功告成了,从客户端访问很正常。缺点是太不像个服务器软件了,呵呵,不能以系统服务方式运行,这要不小心关闭了或者机器重启后忘记打开它了就麻烦了,而且支持1个用户,遂放弃。

image

3. CoreFTPServer

官方网站: http://www.coreftp.com/server/

我想既然有Core FTP Mini-Sftp Server,它就一定有高级的、完整的版本,google一搜,还真找到了,貌似还是免费的,去下载了最新版,在服务器上安装运行,图形界面设置比较丰富,功能比较多,在setup中试着建立了一个domain,从SFTP客户端访问正常。

缺点:免费版只支持一个域名和2个用户访问,最便宜的标准版的收费是一年50美元,还是算了,咱穷啊!

image

4.Sysax Multi Server

Sysax Multi Server也提供了免费功能受限版,它非常容易安裝,也提供了 GUI设置 介面,管理起来很方便,对WINDOWS 2008支持也很好,不像CYGwin就不支持WIN08。

载后记得先到 Buy a License for Sysax Multi Server or Sysax FTP Automation 页面点选 Request Personal Edition License for Sysax Multi Server 按钮申请一组免费的序号。

虽然有个人免费版,但功能限制还蛮多的,例如同时只能一个人连线、不支援 Web-based 远端管理、…等等,还真的是名符其实的「个人」版,但是该有的功能一个都没少,可以方便你安全的传文件。 考虑后今后的多用户使用情况,还是放弃了。

image image

5. Cygwin下安装SFTP Server

参考文章:http://hi.baidu.com/www100/blog/item/e985c717e656b601c93d6d10.html

http://blog.csdn.net/ezdevelop/article/details/67936

Cygwin 是 Windows 上类似于 Linux 的环境。它包括一个提供 UNIX 功能性基本子集的 DLL 以及在这之上的一组工具。安装好 Cygwin 之后,通常可以忽略它,即使您是命令行的爱好者,您仍能发现您活得更舒坦了。

看了一下文档,感觉安装和使用上都不是很方便,没有亲自下载安装测试。略过它了。

image

6. Serv-U

国内的管理员们用的最多的FTP服务器软件,能够支持多种FTP服务,包括Ftp,SFtp,Ftps等等,功能非常强大,破解版非常给力,不介意破解版的朋友可以使用它。

但是我本人还是不太喜欢在服务器上运行破解软件和注册机等程序,另外我的服务器放在国外,对知识产权比较敏感,所以放弃了Serv-U

image

7. freeSSHd

官方网站下载:http://www.freesshd.com

众里寻他千百度,千呼万唤始出来!这是我安装试用了freeSSHd后发出的感叹,此软件免费,功能非常丰富且强大,同时支持软件用户、本地系统用户和域用户验证,对各用户选择性开放SFTP,Telnet, Tunneling服务,所以功能和服务完全不受限制的使用,总之太棒了,一款免费软件做的比收费软件还要强大,强烈推荐。

这里有一篇博文详细介绍了FreeSSHD的使用:http://blog.163.com/ls_19851213/blog/static/531321762009815657395/

freeSSHd截图:

image

image

Cuteftp 客户端截图:

image

8.F-Secure SSH Server

F-Secure SSH server是一款商业性质的SSH服务程序,也有免费限制版本,因为有了freeSSHd,就偷懒了没有去试用F-Secure SSH Server,抱歉。

image

posted @ 2012-12-15 01:29 paulwong 阅读(29818) | 评论 (1)编辑 收藏

如何提高编码质量

问题 
一般程序员都会发现这样的问题,需求拿了,编码写完了,编译也通过了,运行也没报错,就以为程序OK了,但到测试人员那里,一运行测试用例,就发现漏了这个那个的,产生了所谓的质量问题。

原因
这通常是由于程序员一拿到需求,就马上想要几个CLASS,然后就开始编码了。

解决方案
  1. 拿到需求后,先想大概会用到哪些OBJECT,即SERVICE,DAO之类的
  2. 设计出会遇到哪些场景
  3. 设计出分别在这些场景中,那些OBJECT合作的流程图
  4. 编码
举例
需求:有一系统会在每天的某个时间点,在某个文件夹内,导出一个一定格式名称的文件,现在要求程序实现在文件生成后,读取这个文件,抽取某些内容后,再生成另一文件,通过SFTP发走。

方案:
  1. 会用到排程器,控制器,SPRING BATCH JOB
  2. 有这几种场景:没有发现文件时,发现了文件后正常处理,控制器和SPRING BATCH JOB出现错误时等
  3. 处理流程:控制器没有发现文件后,通知排程器继续下一次循环;控制器发现文件后,通知SPRING BATCH JOB处理,然后通知控制器退出;控制器出现错误或SPRING BATCH JOB出现错误后,控制器通知排程器退出。
  4. 根据这几种场景设计程序结构,编码
  5. 编写单元测试用例


posted @ 2012-12-14 11:57 paulwong 阅读(424) | 评论 (0)编辑 收藏

仅列出标题
共116页: First 上一页 73 74 75 76 77 78 79 80 81 下一页 Last