#
界面:

算法:

說明:
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則授權不通過。
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
@import url(http://www.tkk7.com/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)
> 數據錄入與統計的實現
1,對于HBase的存儲設計,要考慮它的存儲結構是:rowkey+columnFamily:columnQualifier+timestamp(version)+value = KeyValue in HBase,一個KeyValue依次按照rowkey,columnkey和timestamp有序。一個rowkey加一個column信息定位了hbase表的一個邏輯的行結構。
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這樣的形式了。
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雖然叫這個名字,但是完全可以存放任何內容來形成用戶自定義的版本信息。
應用服務器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);
}
}
FTP服務器中,如果使用的是FTP協議,則用戶名和密碼是以明文方式傳輸的,如果是以SFTP 的方式,就會通過加密的方式傳輸。
如果服務器中的用戶增加了公鑰的設置,則要求客戶端要有相對應的私鑰。
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, 且帶有圖形界面。有用到的可以自己試試。
通常如果要查找文件,是用的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
因為最近的一個項目的客戶需要使用SFTP給我放傳送文件,公司的服務器都是WINDOWS 2003或者WINDOWS 2008,我必須找到一個免費的(這點很重要),好用的,穩定的SFTP服務端軟件。
經過一番苦尋,找到了以下幾款:
1. OpenSSH
參考文章:《Windows下用sftp打造安全傳輸》
OpenSSH 安裝起來很快速,然后就是在CMD命令行里做若干設置,但是不知道哪里沒做好,用CUTEFTP-SFTP客戶端訪問總是報錯,折騰了一小會索性放棄,沒有圖形界面的東西,還是有點不太習慣,反正我也不是LINUX愛好者。

2.Core FTP Mini-Sftp Server
華軍下載鏈接:http://www.onlinedown.net/soft/75991.htm
Core FTP Mini-Sftp Server是個綠色軟件,什么都不用設置,下載后就一個exe程序,運行它,軟件界面簡單的嚇人,就2個按鈕:Start和About,隨便寫個用戶名和密碼點start就大功告成了,從客戶端訪問很正常。缺點是太不像個服務器軟件了,呵呵,不能以系統服務方式運行,這要不小心關閉了或者機器重啟后忘記打開它了就麻煩了,而且支持1個用戶,遂放棄。

3. CoreFTPServer
官方網站: http://www.coreftp.com/server/
我想既然有Core FTP Mini-Sftp Server,它就一定有高級的、完整的版本,google一搜,還真找到了,貌似還是免費的,去下載了最新版,在服務器上安裝運行,圖形界面設置比較豐富,功能比較多,在setup中試著建立了一個domain,從SFTP客戶端訪問正常。
缺點:免費版只支持一個域名和2個用戶訪問,最便宜的標準版的收費是一年50美元,還是算了,咱窮啊!

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 遠端管理、…等等,還真的是名符其實的「個人」版,但是該有的功能一個都沒少,可以方便你安全的傳文件。 考慮后今后的多用戶使用情況,還是放棄了。

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 之后,通常可以忽略它,即使您是命令行的愛好者,您仍能發現您活得更舒坦了。
看了一下文檔,感覺安裝和使用上都不是很方便,沒有親自下載安裝測試。略過它了。

6. Serv-U
國內的管理員們用的最多的FTP服務器軟件,能夠支持多種FTP服務,包括Ftp,SFtp,Ftps等等,功能非常強大,破解版非常給力,不介意破解版的朋友可以使用它。
但是我本人還是不太喜歡在服務器上運行破解軟件和注冊機等程序,另外我的服務器放在國外,對知識產權比較敏感,所以放棄了Serv-U

7. freeSSHd
官方網站下載:http://www.freesshd.com
眾里尋他千百度,千呼萬喚始出來!這是我安裝試用了freeSSHd后發出的感嘆,此軟件免費,功能非常豐富且強大,同時支持軟件用戶、本地系統用戶和域用戶驗證,對各用戶選擇性開放SFTP,Telnet, Tunneling服務,所以功能和服務完全不受限制的使用,總之太棒了,一款免費軟件做的比收費軟件還要強大,強烈推薦。
這里有一篇博文詳細介紹了FreeSSHD的使用:http://blog.163.com/ls_19851213/blog/static/531321762009815657395/
freeSSHd截圖:


Cuteftp 客戶端截圖:

8.F-Secure SSH Server
F-Secure SSH server是一款商業性質的SSH服務程序,也有免費限制版本,因為有了freeSSHd,就偷懶了沒有去試用F-Secure SSH Server,抱歉。

問題
一般程序員都會發現這樣的問題,需求拿了,編碼寫完了,編譯也通過了,運行也沒報錯,就以為程序OK了,但到測試人員那里,一運行測試用例,就發現漏了這個那個的,產生了所謂的質量問題。
原因
這通常是由于程序員一拿到需求,就馬上想要幾個CLASS,然后就開始編碼了。
解決方案
- 拿到需求后,先想大概會用到哪些OBJECT,即SERVICE,DAO之類的
- 設計出會遇到哪些場景
- 設計出分別在這些場景中,那些OBJECT合作的流程圖
- 編碼
舉例
需求:有一系統會在每天的某個時間點,在某個文件夾內,導出一個一定格式名稱的文件,現在要求程序實現在文件生成后,讀取這個文件,抽取某些內容后,再生成另一文件,通過SFTP發走。
方案:
- 會用到排程器,控制器,SPRING BATCH JOB
- 有這幾種場景:沒有發現文件時,發現了文件后正常處理,控制器和SPRING BATCH JOB出現錯誤時等
- 處理流程:控制器沒有發現文件后,通知排程器繼續下一次循環;控制器發現文件后,通知SPRING BATCH JOB處理,然后通知控制器退出;控制器出現錯誤或SPRING BATCH JOB出現錯誤后,控制器通知排程器退出。
- 根據這幾種場景設計程序結構,編碼
- 編寫單元測試用例