ftp服务器

linux环境 LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.3.1611 (Core) Release: 7.3.1611 Codename: Core 安装 yum install vsftpd systemctl restart vsftpd.service # 重启vsftpd systemctl stop vsftpd.service # 停止vsftpd systemctl start vsftpd.service # 启动vsftpd systemctl status vsftpd.service # 查看vsftpd的状态 匿名配置 服务器配置文件 位置:/etc/vsftpd/vsftpd.conf 坑:从网上购买的服务器(阿里云)要从控制台开放ftp的端口,建议放开全部端口,如果有需要限制,再限制,否则会出现登录失败的问题 防火墙:开放所需端口 匿名设置:配置文件内容 anonymous_enable=YES #允许匿名登录 local_enable=YES write_enable=YES local_umask=022 #匿名上传的默认权限,匿名不能修改生效,只能上传删除 anon_upload_enable=YES #允许匿名上传 anon_mkdir_write_enable=YES anon_other_write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/xferlog xferlog_std_format=YES listen=YES listen_ipv6=NO pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES 匿名用户的默认根目录:/var/ftp/pub 需要更改权限:chmod -R 755 /var/ftp/pub 客户端(deepin) 安装: ...

December 1, 2019 · 1 min · zhangxiaofeng05

解决vim粘贴错乱问题

vim打开文件后 1、在视图模式下输入 :set paste 2、按i进入编辑模式 3、粘贴((win)Ctrl+v | Shift+Insert(linux)) 4、关闭粘贴 :set nopaste

November 28, 2019 · 1 min · zhangxiaofeng05

hugo搭建博客,部署到GitHub

hugo站点 hugo官网:https://gohugo.io/ 安装和使用,先参考官网 安装:使用命令或者从GitHub下载 https://github.com/gohugoio/hugo 检查安装:$ hugo version 生成站点 $ hugo new site blogHugo 进入站点 $ cd blogHugo 使用主题(https://github.com/olOwOlo/hugo-theme-even) $ git clone https://github.com/olOwOlo/hugo-theme-even themes/even 安装主题上的说明进行配置,注意此主题生成新文件为$ hugo new post/some-content.md 本地运行预览博客 $ hugo server -D 浏览器 $ http://localhost:1313/ 部署到GitHub 在GitHub新建仓库 username.github.io 渲染md文件 $ hugo --theme=even --baseUrl="https://username.github.io" --buildDrafts 此时生成了public目录 执行命令 cd public git init git commit -m "first commit" git remote add origin git@github.com:username/blogHugo.git git push origin master 以后再提交,在站点执行此脚本 $ sh gitHub.sh gitHub.sh hugo --theme=even --baseUrl="https://username.github.io" --buildDrafts cd public git add . git commit -m "update" git push origin master cd .. 原文件放入私有仓库 第一次使用,在站点目录下 ...

October 21, 2019 · 1 min · zhangxiaofeng05

行为型模式-备忘录模式

百度百科 备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 基本介绍 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 涉及角色: Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。 Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。 Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。 备忘录模式的优点和缺点 一、 备忘录模式的优点 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时, 使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。 本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需 要的这些状态的版本。 二、 备忘录模式的缺点: 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。 当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。 当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。 例子 Memento 备忘录存储原发器对象的内部状态。 public class Memento { private String state; public Memento(String state) { this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; } } Originator 原发器创建一个备忘录,用以记录当前时刻的内部状态。 使用备忘录恢复内部状态 public class Originator { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } public Memento createMemento(){ return new Memento(state); } public void setMemento(Memento memento){ state=memento.getState(); } public void showState(){ System.out.println(state); } } Caretaker 负责保存好备忘录。 不能对备忘录的内部进行操作或检查。 ...

August 30, 2019 · 1 min · zhangxiaofeng05

行为型模式-解释器模式

百度百科 Interpreter模式 Interpreter(解释器)模式是一种特殊的设计模式,它建立一个解释器(Interpreter),对于特定的计算机程序设计语言,用来解释预先定义的文法。简单地说,Interpreter模式是一种简单的语法解释器构架。 Interpreter模式,即解释器模式。 解释器模式属于行为模式,Gof是这样定义的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。 实例应用:正则表达式 例子 AbstractExpression(抽象表达式) 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。 public abstract class Expression { abstract void interpret(Context ctx); } TerminalExpression(终结符表达式) 实现与文法中的终结符相关联的解释操作。 一个句子中的每个终结符需要该类的一个实例。 public class SimpleExpression extends Expression { @Override void interpret(Context ctx) { System.out.println("这是普通解析器"); } } NonterminalExpression(非终结符表达式) 为文法中的非终结符实现解释(Interpret)操作。 public class AdvanceExpression extends Expression { @Override void interpret(Context ctx) { System.out.println("这是高级解析器"); } } Context(上下文) 包含解释器之外的一些全局信息。 import java.util.ArrayList; import java.util.List; public class Context { private String content; private List list = new ArrayList(); public String getContent() { return content; } public void setContent(String content) { this.content = content; } public void add(Expression eps){ list.add(eps); } public List getList(){ return list; } } Client(客户) 构建(或被给定)表示该文法定义的语言中某个特定的句子的抽象语法树。 该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。调用解释操作。 ...

August 29, 2019 · 1 min · zhangxiaofeng05

结构型模式-组合模式

百度百科 组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 “组合对象” 的含义。 组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。 经典案例:系统目录结构,网站导航结构等。 组合模式概述 组合模式(Composite Pattern) 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。 定义 (GoF《设计模式》):将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 涉及角色: Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。 Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。 Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。 适用性 以下情况下适用Composite模式: 你想表示对象的部分-整体层次结构 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 总结 组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。 如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。 例子 Component 为组合中的对象声明接口。 在适当的情况下,实现所有类共有接口的缺省行为。 声明一个接口用于访问和管理Component的子组件。 import java.util.List; public abstract class Employer { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void add(Employer employer); public abstract void delete(Employer employer); public List employers; public void printInfo(){ System.out.println(name); } public List getEmployers(){ return this.employers; } } Leaf 在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义节点对象的行为。 ...

August 29, 2019 · 2 min · zhangxiaofeng05

行为型模式-访问者模式

维基百科 访问者模式 访问者模式是一种将算法与对象结构分离的软件设计模式。 这个模式的基本想法如下:首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方法中回调访问者的visit方法,从而使访问者得以处理对象结构的每一个元素。我们可以针对对象结构设计不同的实在的访问者类来完成不同的操作。 访问者模式使得我们可以在传统的单分派语言(如Smalltalk、Java和C++)中模拟双分派技术。对于支持多分派的语言(如CLOS),访问者模式已经内置于语言特性之中了,从而不再重要。 Java interface Visitor { void visit(Wheel wheel); void visit(Engine engine); void visit(Body body); void visit(Car car); } class Wheel { private String name; Wheel(String name) { this.name = name; } String getName() { return this.name; } void accept(Visitor visitor) { visitor.visit(this); } } class Engine { void accept(Visitor visitor) { visitor.visit(this); } } class Body { void accept(Visitor visitor) { visitor.visit(this); } } class Car { private Engine engine = new Engine(); private Body body = new Body(); private Wheel[] wheels = { new Wheel("front left"), new Wheel("front right"), new Wheel("back left") , new Wheel("back right") }; void accept(Visitor visitor) { visitor.visit(this); engine.accept(visitor); body.accept(visitor); for (int i = 0; i < wheels.length; ++ i) wheels[i].accept(visitor); } } class PrintVisitor implements Visitor { public void visit(Wheel wheel) { System.out.println("Visiting " + wheel.getName() + " wheel"); } public void visit(Engine engine) { System.out.println("Visiting engine"); } public void visit(Body body) { System.out.println("Visiting body"); } public void visit(Car car) { System.out.println("Visiting car"); } } public class VisitorDemo { static public void main(String[] args) { Car car = new Car(); Visitor visitor = new PrintVisitor(); car.accept(visitor); } } 运行结果: ...

August 29, 2019 · 1 min · zhangxiaofeng05

行为型模式-模板方法

维基百科 模板方法 模板方法模型是一种行为设计模型。模板方法是一个定义在父类别的方法,在模板方法中会呼叫多个定义在父类别的其他方法,而这些方法有可能只是抽象方法并没有实作,模板方法仅决定这些抽象方法的执行顺序,这些抽象方法的实作由子类别负责,并且子类别不允许覆写模板方法。 用法 模板方法模式多用在: 某些类别的算法中,实做了相同的方法,造成程式码的重复。 控制子类别必须遵守的一些事项。 … Java /** * An abstract class that is common to several games in * which players play against the others, but only one is * playing at a given time. */ abstract class Game { private int playersCount; abstract void initializeGame(); abstract void makePlay(int player); abstract boolean endOfGame(); abstract void printWinner(); /* A template method : */ final void playOneGame(int playersCount) { this.playersCount = playersCount; initializeGame(); int j = 0; while (!endOfGame()){ makePlay(j); j = (j + 1) % playersCount; } printWinner(); } } //Now we can extend this class in order to implement actual games: class Monopoly extends Game { /* Implementation of necessary concrete methods */ void initializeGame() { // ... } void makePlay(int player) { // ... } boolean endOfGame() { // ... } void printWinner() { // ... } /* Specific declarations for the Monopoly game. */ // ... } class Chess extends Game { /* Implementation of necessary concrete methods */ void initializeGame() { // ... } void makePlay(int player) { // ... } boolean endOfGame() { // ... } void printWinner() { // ... } /* Specific declarations for the chess game. */ // ... } public class Player { public static void main(String[] args) { Game chessGame = new Chess(); chessGame.initializeGame(); chessGame.playOneGame(1); //call template method } } 例子 AbstractClass 定义抽象的原语操作(primitiveoperation),具体的子类将重定义它们以实现一个算法的各步骤。 实现一个模板方法,定义一个算法的骨架。 该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。 ...

August 29, 2019 · 2 min · zhangxiaofeng05

行为型模式-策略模式

维基百科 策略模式 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 策略模式: 定义了一族算法(业务规则); 封装了每个算法; 这族的算法可互换代替(interchangeable)。 Java //StrategyExample test application class StrategyExample { public static void main(String[] args) { Context context; // Three contexts following different strategies context = new Context(new FirstStrategy()); context.execute(); context = new Context(new SecondStrategy()); context.execute(); context = new Context(new ThirdStrategy()); context.execute(); } } // The classes that implement a concrete strategy should implement this // The context class uses this to call the concrete strategy interface Strategy { void execute(); } // Implements the algorithm using the strategy interface class FirstStrategy implements Strategy { public void execute() { System.out.println("Called FirstStrategy.execute()"); } } class SecondStrategy implements Strategy { public void execute() { System.out.println("Called SecondStrategy.execute()"); } } class ThirdStrategy implements Strategy { public void execute() { System.out.println("Called ThirdStrategy.execute()"); } } // Configured with a ConcreteStrategy object and maintains a reference to a Strategy object class Context { Strategy strategy; // Constructor public Context(Strategy strategy) { this.strategy = strategy; } public void execute() { this.strategy.execute(); } } 运行结果: ...

August 29, 2019 · 1 min · zhangxiaofeng05

行为型模式-状态模式

百度百科 状态模式 (State Pattern)是设计模式的一种,属于行为模式。 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类 定义 (源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。 意图 允许一个对象在其内部状态改变时改变它的行为 适用场景 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。 例子 State 定义一个接口以封装与Context的一个特定状态相关的行为。 public interface Weather { String getWeather(); } Context 定义客户感兴趣的接口。 维护一个ConcreteState子类的实例,这个实例定义当前状态。 public class Context { private Weather weather; public Weather getWeather() { return weather; } public void setWeather(Weather weather) { this.weather = weather; } public String weatherMessage(){ return weather.getWeather(); } } ConcreteStatesubclasses 每一子类实现一个与Context的一个状态相关的行为。 public class Rain implements Weather { @Override public String getWeather() { return "下雨"; } } public class Sunshine implements Weather { @Override public String getWeather() { return "阳光"; } } Test ...

August 29, 2019 · 1 min · zhangxiaofeng05