JURUO怎么写 qwertier's blog

自动生成白盒测试基本路径

题目链接:https://cms.hit.edu.cn/mod/assignment/view.php?id=8919

注意事项有四条:

  1. 在查找基本路径时,采用深度优先搜索策略;若遇到判定节点,需遵循“先遍历false分支,再遍历true分支”的原则。
  2. 若某一条路径出现循环,即:该路径的后续部分已经在本路径之前出现过,则在进入循环的第一个节点处停止,后续部分不需要再包含在该路径中(例如1,2,3,9,10,2,3这样的路径,需简化为1,2,3,9,10,2即可)。
  3. 需根据“基本路径”的定义对每一条路径进行检查,看其中是否包含了之前其他路径中不曾出现过的边。若否,则将其去除;
  4. 若程序需要输出多条基本路径,按照路径长度由小到大排序输出;若两个路径的长度相等,则按相对应位置的数字大小由低到高排列(例如1,3,6,5和1,3,4,5两条路径,后者应该先输出;1,10,8,3,4和1,9,10,3,4两条路径,后者应该先输出)。

值得注意的是,第二条中应该改为当某条路径遇到这条路径之前访问过的节点时,停止访问。

我们先不考虑扩展要求,那么就可以得到一个简单的算法:

DFS(u):
    if vis[u] = True 或者 u无出边
        找到一条路径
        return
    vis[u] = True
    按照先F分支后T分支的顺序遍历u的出边,设当前边指向的节点为v
        DFS(v)
    vis[u] = False

考虑扩展需求之后,加边时就有一点小trick。

图片1

图片2

如果是AND关系,那么就会如上面两个图,靠上的图是分裂之前的样子,靠下的图是分裂之后的样子。

可以看出所有指向2的节点现在需要指向2.1,所以我们可以给每个节点设一个节点对应的值。先不考虑扩展需求,生成图。然后把原来2号节点的值从2设为2.1,然后新建一个节点2.2,然后修改他们指向的边就可以了。

这样这个题就完成了,逻辑比较简单,代码也不长(100+)。

在Ubuntu上使用Nginx部署django

最终完成软工项目后,接下来就是项目的部署。由于在软工项目里,我们使用的是django,加上我们用的是我之前搞的阿里云服务器,搭载的系统是Ubuntu 16.04。因此这篇文章将会介绍如何在Ubuntu 16.04上部署django。

为什么要部署

其实,看到有些(几乎所有)同学将django部署到服务器上时,仅仅是简单地用django自带的测试服务器打开,然后直接(或间接)用8000端口来从外部访问django应用,这样做的好处有两个:一是简单,二是容易调试。

然而,在实际上的生产环境中,这样部署很容易出问题。django自带的测试服务器是单线程的,当多个用户访问的时候,性能就很差,这一个测试服务器挂掉应用就完蛋了。所以,使用Nginx部署势在必行。

部署步骤

简单地说,部署django,我们需要做的只有三步:

1. 环境配置
2. 安装、配置uwsgi来作为nginx和django的中间件
3. 安装、配置nginx来作为服务器的最前端

最后达成的效果大约是这样的:

    用户 <-> nginx <-> uWSGI <-> Django

接下来就是具体的三步如何配置。

环境配置

由于服务器是Ubuntu 16.04,自带了Python 2.7与Python 3.5。

如果对python的版本不满意,可以用pyenv来管理不同版本的python,灵活切换环境,很爽(本人用pyenv装了python36)。

一个大坑就是:如果用了pyenv,想保持当前python的环境,就不要用sudo语句了,不然pyenv就会失效。

另外,就是django和各个依赖库的安装,注意版本号。

简单用django自带的测试服务器测试一下是否能正常运行即可。

    python manage.py runserver 0.0.0.0:8000

安装、配置uwsgi

uwsgi的安装也非常简单,用pip安装即可。

    pip install uwsgi

安装完uwsgi之后,可以使用如下语句测试uwsgi(到项目目录下,把下面的PROJECT替换成你的项目名):

    uwsgi --http :8001 --plugin python --module PROJECT.wsgi

然后看能否正常访问项目。

接下来我们写uwsgi的配置文件(我们项目的配置文件,仅供参考):

    [uwsgi]
    # Django-related settings
    #plugins = python3
    socket = :8001

    # the base directory (full path)
    chdir           = /root/Friend-Reader

    # Django s wsgi file
    module          = FriendReader.wsgi

    # process-related settings
    # master
    master          = true

    # maximum number of worker processes
    processes       = 4

    # ... with appropriate permissions - may be needed
    chmod-socket    = 777
    # clear environment on exit
    vacuum          = true
    buffer-size = 32768

如上,项目文件夹在/root/Friend-Reader,项目名为FriendReader,因此/root/Friend-Reader/FriendReader/下有个wsgi.py文件。

如下语句即可在后台运行uwsgi:

    uwsgi --ini uwsgi.ini

安装、配置nginx

nginx的安装十分简单,只需要用apt-get即可。

    sudo apt-get install nginx

这时候打开服务器地址,应该会看到nginx的欢迎页面。

好友设置

好,接下来配置nginx,打开/etc/nginx/nginx.conf,在http那个大括号里,我们加上这段:

    server {
        # the port your site will be served on
        listen      80;
        # the domain name it will serve for
        server_name reader.qwertier.cn; # substitute your machine's IP address or FQDN
        charset     utf-8;
        
        # max upload size
        client_max_body_size 75M;   # adjust to taste
        
        # Django media
        location /media  {
            alias /root/Friend-Reader/media;  # your Django project's media files - amend as required
        }
        
        location /static {
            alias /root/Friend-Reader/static; # your Django project's static files - amend as required
        }
        
        # Finally, send all non-media requests to the Django server.
        location / {
            include     uwsgi_params; # the uwsgi_params file you installed
            uwsgi_pass 127.0.0.1:8001;
        }
    }

首先,“location /media”和“location /static”那两段都是用来配置静态文件的,静态文件是指不经django处理的文件,只需要nginx给用户就可以。

然而,对于其他请求,“location /”是将这些请求交给uwsgi处理,且设置了uwsgi的监听地址:127.0.0.1:8001。

这样,我们的django就部署好了,访问就可以使用了。

最后,我们的在线演示地址:http://reader.qwertier.cn,我们的GitHub项目地址:https://github.com/HIT-Three-Friends/Friend-Reader/

写在第一轮迭代验收之后

前言

跟ljr大腿和hy大腿组队,抱得好爽。

我们做的项目

开发一个Web网站:

  1. 用户选择N个社交网络服务,指定自己关心的社交好友(及其在N个社交网络 中的账号/主页等);
  2. 网站自动抽取好友在这N个服务中的更新记录,汇总在一起展示给当前用户;
  3. 网站可分析好友在N个服务中的活跃度随时间/日期变化的规律;
  4. 网站可分析好友的“兴趣”随日期变化的规律;
  5. 网站可感知与该好友具有密切社交互动的其他人,并分析他/她们之间互动 的规律(活跃度、主题)等。
  6. 当好友发布某些特定主题的内容时,网站可主动推送给当前用户。

要做的项目需要从老师给定点的列表中选,通过民主决议,我们一致决定做网页更新订阅1。然而不幸的是,这个被别人做了,于是就做了个类似的好友动态的订阅网站。效果如下:

好友动态展示

下拉自动获取内容,通过点击内容展开折叠

好友活跃度分析

分析汪泽堃同学在一天内的知乎活跃度情况(因为服务器时区设置问题,横轴时间应该+8)

好友设置

历程

做这个东西的过程总体上还是比较顺利的。

为了不浪费时间,三个人能平行推进,我们决定三人分别负责前端(我),后端(ljr)和爬虫(hy)。我和ljr大爷还专门写了个接口文档。

接口文档

但是小队仍然遇到了一些障碍。对我而言,主要是前端的交互设计。

之所以我来写前端,主要是因为另外两个大腿之前没怎么写过前端。然而我也不是写前端的料,就只是多点经验。所以特别喜欢LaTeX这样的东西,内容和设计分离,只专注于内容就行,所以写报告的时候能用LaTeX我一般就不会用其他东西。

设计上的问题虽然大都像是“这个按钮应该是什么颜色”,“这个头像应该多大”这样的不是什么大问题的问题。但是到了强迫症患者的手上,就变成了项目拖延的最重要的原因。

结果

结果只能说是差强人意,由于项目的固有难度,我们没有做完主动推送和好友互动分析功能,最后的得分只有83/100分,希望能在最后的验收环节让助教和用户满意。

  1. 就是用户对网页进行订阅,然后网站自动获取网页内容的更新,还要智能地解析网页的结构 

在Eclipse上通过Maven配置Tomcat 9.0 + Struts 2.5 (软工课程相关)

实验二需要用Eclipse配置Tomcat和Struts环境,看到友班的同学用Jetbrains IntelliJ IDEA不费吹灰之力就配好了环境,心里有点羡慕。不过现在终于用Eclipse配置好了,把主要的步骤在这贴一下,最重要的还是自己踩过的坑,希望别人不用再踩了。

把Eclipse for Java Developers强化成Eclipse IDE for Java EE Developers

如果你像我一样,用现在的Eclipse版本用出了感情,不想再下一个Eclipse IDE for Java EE Developers,那你可能要花好几个小时装很多Eclipse的插件。因为一开始不理解,无病乱投医,装了许多插件,具体有:

通过”Help”-“Install New Software”安装的:

1. Data Tools Platform Extender SDK, Data Tools Platform Enablement Extender SDK (数据库可视化管理相关)
2. Eclipse Java EE Developer Tools
3. Eclipse Java Web Developer Tools
4. Eclipse Web Developer Tools
5. Eclipse XML Editors and Tools
6. JST Server Adapters, JST Server Adapters Extensions

通过”Help”-“Eclipse Marketplace”安装的:

1. Tomcat Plugin (后来发现只支持到7.0,于是卸载了,实际上这东西也没什么大用)
2. Emacs+ (这玩意太好用了,完美还原Emacs的快捷键)

安装、配置Tomcat

接下来可以下载Tomcat,如果下载的是绿色版,把Tomcat解压到某个目录里即可。

然后在”Window”-“Preferences”-“Server”-“Runtime Environments”里配置好Tomcat,使Eclipse能找到、正确调用Tomcat。

新建项目

这里我们新建一个Dynamic Web Project项目: “File”-“New”-“Other..”-“Web”-“Dynamic Web Project”。

两次”Next”即可,在最后一步可以让向导帮我们生成web.xml。

新建完项目之后,目录结构如下:

如果libraries里没有Tomcat的库,可以在项目的属性设置里的”Java Build Path”中,”Add Library”-“Server Runtime”-“Apache Tomcat V9.0”,把Tomcat的库加进Build Path。

接下来,把项目转化为Maven项目,以方便管理依赖。右键项目名-“Configure”-“Conver to Maven Project”。

在项目里配置Tomcat与Struts

首先把Struts添加到项目的依赖中,做法可以参考前一篇博文

在web-app标签中,加入这段代码,让Tomcat知道,我们使用的是Struts框架。

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>

接下来在”Java Resources/src”中新建struts.xml,填入以下代码,将”HelloWorld.action”映射到”HelloWorld.jsp”,中间需HelloWorld类处理:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<include file="struts-default.xml" />
	<package name="test2333" extends="struts-default">
		<action name="HelloWorld" class="test2333.HelloWorld">
			<result>/HelloWorld.jsp</result>
		</action>
	</package>
</struts>

然后在”WEB-INF”中新建”HelloWorld.jsp”,填入以下代码:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<h2><s:property value="message" /></h2>
</body>
</html>

在”Java Resources/src”中新建”HelloWorld.java”,填入

package test2333;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {
    public static final String MESSAGE = "Struts is up and running ...";

    public String execute() throws Exception {
        setMessage(MESSAGE);
        return SUCCESS;
    }

    private String message = "test";

    public void setMessage(String message){
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

运行网站

这样就基本配置好了一个基于Struts的Java Web项目。想要启动它的话,只需要右击项目名-“Run As”-“Run On Server”,

一路Next即可。

打开浏览器,地址栏输入”localhost:8080/test2333/HelloWorld.action“,就能看到效果了。

如果404错误(正如我之前遇到的),那么可以检查一下Console里的错误信息,如果有NoClassException错误,可以试试把structs的lib文件放到tomcat安装路径下的lib文件夹中。

在Eclipse项目中通过Maven使用其他包 (Package)的方法 (软工课程相关)

第一眼看实验1的时候,发现是真的难。在不用外部库且图美观可读的前提下画出一个带权有向图,想一想就恶心。然而,一天之后,要求就改了。画图部分,可以使用外部库了。助教学长还推荐了Graphviz这个东西。于是就搜了一下“Graphviz Java”,还真是搜出了点东西:graphviz-java——提供了能在Java中使用的Graphviz接口。但这个repo的作者在README里一点都没写怎么在项目里引入这个东西,本人也是在解奥然学长帮助下才(算是有点)搞明白,在这里粘一下我在项目里引入graphviz-java的方法吧。

捷径——使用Maven

Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具。1

就通过Maven导入graphviz-java的过程而言,个人觉得Maven有点像是make,程序员设置依赖关系,然后Maven就去满足依赖。而我们就只需要在项目的依赖中加入graphviz-java,然后使用Maven构建程序,Maven就会自动下载部署所需要的依赖,graphviz-java就可以用了。

在Eclipse工程中添加依赖2

如果想要使用Maven,首先需要新建Maven工程。菜单栏里”File” - “New” - “Other”,弹出的”New”对话框中,选择”Maven” - “Maven Project”,然后点击”Next”。

New

接下来,一路”Next”,随便填好”Group ID”和”Artifact ID”,点击”Finish”,就可以新建一个Maven工程。

New2

在”Package Explorer”中,选择刚才新建的项目,右键 - “Maven” - “Add Dependency”,搜索”graphviz-java”,然后就能找到对应的库,选中确认即可。

add_dependency

另外,graphviz-java还需要日志记录的依赖,按刚才添加graphviz-java的方法添加SLF4J或者Log4j均可 (graphviz-java的Github repo中有提示)。

之后,在项目上右键 - “Run as” - “Maven Install”,之后Maven就会自动下载所需依赖,然后构建项目。看到Console里出现”Build Success”就说明构建成功了。

package com.untitled.tests233;

import static guru.nidi.graphviz.model.Factory.*;

import java.io.File;
import java.io.IOException;

import guru.nidi.graphviz.engine.*;
import guru.nidi.graphviz.model.Graph;

public class App
{
    public static void main( String[] args ) throws IOException
    {
    	Graph g = graph("example1").directed().with(node("a").link(node("b")));
    	Graphviz.fromGraph(g).width(200).render(Format.PNG).toFile(new File("example/ex1.png"));
    }
}

输入上面的代码 (最前面的包名可能需要修改),执行一下,就能看到项目文件夹下”example”文件夹中多了”ex1.png”文件,说明示例也运行成功了。

  1. https://zh.wikipedia.org/wiki/Apache_Maven 

  2. 本人使用的Eclipse版本为Eclipse IDE for Java Developers 4.7.0 

鲁ICP备16001914号