`
Donald_Draper
  • 浏览: 999823 次
社区版块
存档分类
最新评论

P6Spy源码分析-属性文件加载

阅读更多
P6Spy使用:http://donald-draper.iteye.com/blog/2319646
使用P6Spy的时候用到这一句我们来看这一句的内涵:
P6DataSource p6DSource = new P6DataSource(cpDSource)
// P6DataSource p6DSource = new P6DataSource(cpDSource)
public class P6DataSource extends P6Base
    implements DataSource, Referenceable, Serializable
{
    //source是通过构造传入的数据源c3p0或Druid
    public P6DataSource(DataSource source)
    {
        rds = source;
    }
    //初始化驱动及日志模块
    public static void initMethod()
    {
        P6SpyDriverCore.initMethod((com.p6spy.engine.spy.P6SpyDriver.class).getName());
    }
    //获取Connection
     public Connection getConnection()
        throws SQLException
    {
        if(rds == null)
            bindDataSource();
        return P6SpyDriverCore.wrapConnection(rds.getConnection());
    }
    protected DataSource rds;
    protected String rdsName;
    //通过static语句块调用初始化方法
    static 
    {
        initMethod();
    }
}

初始化属性线路:初始化驱动及日志相关信息
P6DataSource,通过static语句块调用初始化方法initMethod(),initMethod()中一句很重要的
P6SpyDriverCore.initMethod((com.p6spy.engine.spy.P6SpyDriver.class).getName());再来看看P6SpyDriverCore
的initMethod的方法都做了什么事情
public abstract class P6SpyDriverCore
    implements Driver
{
    public static synchronized void initMethod(String spydriver)
    {
        if(initialized)
            return;
        String path = P6SpyProperties.getPropertiesPath();
        if(path == null)
        {
            foundSpyProperties = false;
            return;
        }
        foundSpyProperties = true;
	//初始化spy.properties属性文件
        P6SpyProperties properties = new P6SpyProperties();
        P6SpyOptions coreOptions = new P6SpyOptions();
        OptionReloader.add(coreOptions, properties);
        String className = "no class";
        String classType = "driver";
        try
        {
	    //realdriver
            ArrayList driverNames = null;
	    //日志模块
            ArrayList modules = null;
	    //获取驱动名
            driverNames = P6SpyOptions.allDriverNames();
	    //获取所有日志模块
            modules = P6SpyOptions.allModules();
            boolean hasModules = modules.size() > 0;
            Iterator i = null;
            classType = "driver";
            Driver realDriver;
            for(i = driverNames.iterator(); i.hasNext(); P6LogQuery.logDebug("Registered driver: " + className + ", realdriver: " + realDriver))
            {
                P6SpyDriver spy = null;
                if(hasModules)
                {
                    spy = new P6SpyDriver();
                    DriverManager.registerDriver(spy);
                }
                className = (String)i.next();
                deregister(className);
                realDriver = (Driver)P6Util.forName(className).newInstance();
                if(P6SpyOptions.getDeregisterDrivers())
		    //注册驱动realdriver=com.mysql.jdbc.Driver
                    DriverManager.registerDriver(realDriver);
                if(hasModules)
                {
                    spy.setPassthru(realDriver);
                    realDrivers.add(realDriver);
                }
            }

            if(hasModules)
            {
                factories = new ArrayList();
                classType = "factory";
                com.p6spy.engine.common.P6Options options;
                for(i = modules.iterator(); i.hasNext(); P6LogQuery.logDebug("Registered factory: " + className + " with options: " + options))
                {
                    className = (String)i.next();
		    //module.log=com.p6spy.engine.logging.P6LogFactory
                    //module.outage=com.p6spy.engine.outage.P6OutageFactory
                    P6Factory factory = (P6Factory)P6Util.forName(className).newInstance();
                    factories.add(factory);
                    options = factory.getOptions();
                    if(options != null)
                        OptionReloader.add(options, properties);
                }

            }
            initialized = true;
            for(Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); P6LogQuery.logDebug("Driver manager reporting driver registered: " + e.nextElement()));
        }
        catch(Exception e)
        {
            String err = "Error registering " + classType + "  [" + className + "]\nCaused By: " + e.toString();
            P6LogQuery.logError(err);
            throw new P6DriverNotFoundError(err);
        }
    }
//P6DataSource的getConnection方法条用P6SpyDriverCore的wrapConnection(Connection realConnection)方法
public static Connection wrapConnection(Connection realConnection)
        throws SQLException
    {
        Connection con = realConnection;
        if(factories != null)
        {
            for(Iterator it = factories.iterator(); it.hasNext();)
            {
                P6Factory factory = (P6Factory)it.next();
		//这里是重点,这里是通过P6Factory来获取连接,P6SpyDriverCore
		//在初始化initMethod已经P6LogFactory,P6OutageFactory
		//module.log=com.p6spy.engine.logging.P6LogFactory
                //module.outage=com.p6spy.engine.outage.P6OutageFactory
                con = factory.getConnection(con);
            }

        }
        return con;
    }
    private String getRealUrl(String url)
    {
        if(P6SpyOptions.getUsePrefix())
            return url.startsWith("p6spy:") ? url.substring("p6spy:".length()) : null;
        else
            return url;
    }
    public boolean acceptsURL(String p0)
        throws SQLException
    {
        String realUrl = getRealUrl(p0);
        boolean accepts = false;
        if(passthru == null && initialized)
        {
            if(realDrivers.size() == 0)
                throw new SQLException("P6 has no drivers registered");
            findPassthru(realUrl);
            if(passthru == null)
                throw new SQLException("P6 can't find a driver to accept url (" + realUrl + ") from the " + realDrivers.size() + " drivers P6 knows about. The current driver is null");
        }
        if(realUrl != null)
            accepts = passthru.acceptsURL(realUrl);
        return accepts;
    }
    protected Driver passthru;
    protected static boolean initialized = false;
    protected static ArrayList factories;
   [color=red] protected static ArrayList realDrivers = new ArrayList();[/color]
    protected static boolean foundSpyProperties;
}

这里我们先来看一下p6spy的属性配置,再看P6LogFactory获取连接及日志
P6SpyProperties属性文件操作类:
public class P6SpyProperties
{

    public static void initMethod()
    {
        //设置属性文件名
        setSpyProperties(System.getProperty("spy.properties", "spy.properties"));
    }

    public P6SpyProperties()
    {
        File propertiesFile = new File(propertiesPath);
        if(propertiesFile.exists())
        {
            long lastModified = propertiesFile.lastModified();
            if(lastModified != propertiesLastModified)
            {
                propertiesLastModified = lastModified;
		//加载spy.properties文件
                properties = P6Util.loadProperties(SPY_PROPERTIES_FILE);
            } else
            {
                properties = null;
            }
        }
    }
 

    public static String getPropertiesPath()
    {
        return propertiesPath;
    }
    //设置属性文件名
    public static void setSpyProperties(String _properties)
    {
        SPY_PROPERTIES_FILE = _properties != null ? _properties : "spy.properties";
        propertiesPath = findPropertiesPath();
        propertiesLastModified = -1L;
    }

    protected static String findPropertiesPath()
    {
        String propertiesPath = P6Util.classPathFile(SPY_PROPERTIES_FILE);
        if(propertiesPath != null)
        {
            File propertiesFile = new File(propertiesPath);
            if(propertiesFile.exists())
                return propertiesPath;
        }
        return null;
    }
    public Properties forceReadProperties()
    {
        File propertiesFile = new File(propertiesPath);
        if(propertiesFile.exists())
        {
            long lastModified = propertiesFile.lastModified();
            properties = P6Util.loadProperties(SPY_PROPERTIES_FILE);
        }
        return properties;
    }
    protected static final String OPTIONS_FILE_PROPERTY = "spy.properties";
    protected static final String DFLT_OPTIONS_FILE = "spy.properties";
    protected static String SPY_PROPERTIES_FILE;
    protected static long propertiesLastModified = -1L;
    protected static String propertiesPath;
    public Properties properties;
   //通过静态语句块调用initMethod方法
    static 
    {
        initMethod();
    }
}

P6SpyOptions配置选项类:set,get方法对应配置文件选项
public class P6SpyOptions extends P6Options
{
 public static void setAutoflush(String _autoflush)
    {
        autoflush = P6Util.isTrue(_autoflush, false);
    }

    public static boolean getAutoflush()
    {
        return autoflush;
    }

    public static void setExclude(String _exclude)
    {
        exclude = _exclude;
    }
    public static void setExcludecategories(String _excludecategories)
    {
        excludecategories = _excludecategories;
    }
    public static void setFilter(String _filter)
    {
        filter = P6Util.isTrue(_filter, false);
    }
    public static void setIncludecategories(String _includecategories)
    {
        includecategories = _includecategories;
    }
    public static void setDeregisterDrivers(String trueOrFalse)
    {
        deregister = P6Util.isTrue(trueOrFalse, false);
    }

    public static void setLogfile(String _logfile)
    {
        logfile = _logfile;
        if(logfile == null)
            logfile = "spy.log";
    }
    public static void setAppender(String className)
    {
        appender = className;
    }
    //实际驱动设置
    public static void setRealdriver(String _realdriver)
    {
        realdriver = _realdriver;
    }
   public static void setRealdriver2(String _realdriver2)
    {
        realdriver2 = _realdriver2;
    }

  

    public static void setAppend(String _append)
    {
        append = P6Util.isTrue(_append, true);
    }

    public static boolean getAppend()
    {
        return append;
    }

    public static void setSpydriver(String _spydriver)
    {
        spydriver = _spydriver;
        if(spydriver == null)
            spydriver = "com.p6spy.engine.spy.P6SpyDriver";
    }

    public static String getSpydriver()
    {
        return spydriver;
    }
   //设置日志日期格式
   //dateformat=hh:mm:ss,SSS
    public static void setDateformat(String _dateformat)
    {
        dateformat = _dateformat;
        if(_dateformat == null || _dateformat.equals(""))
            dateformatter = null;
        else
            dateformatter = new SimpleDateFormat(_dateformat);
    }
    public static void setStringmatcher(String _stringmatcher)
    {
        stringmatcher = _stringmatcher;
        if(stringmatcher == null || stringmatcher.equals(""))
            stringmatcher = "com.p6spy.engine.common.SubstringMatcher";
        try
        {
            stringMatcherEngine = (StringMatcher)P6Util.forName(stringmatcher).newInstance();
        }
        catch(InstantiationException e)
        {
            P6LogQuery.logError("Could not instantiate string matcher class: " + stringmatcher);
            e.printStackTrace();
        }
        catch(IllegalAccessException e)
        {
            P6LogQuery.logError("Could not instantiate string matcher class: " + stringmatcher);
            e.printStackTrace();
        }
        catch(ClassNotFoundException e)
        {
            P6LogQuery.logError("Could not instantiate string matcher class: " + stringmatcher);
            e.printStackTrace();
        }
    }
    //设置重新加载配置文件间隔
    public static void setReloadPropertiesInterval(String _reloadpropertiesinterval)
    {
        reloadPropertiesInterval = P6Util.parseLong(_reloadpropertiesinterval, -1L);
        reloadMs = reloadPropertiesInterval * 1000L;
    }
    public static void setRealDataSource(String _realdatasource)
    {
        realdatasource = _realdatasource;
    }

    //当配置文件修改时,重新加载属性文件
    public void reload(P6SpyProperties properties)
    {
        P6LogQuery.logDebug(getClass().getName() + " reloading properties");
        modules = properties.getReverseOrderedList("module.");
        driverNames = properties.getReverseOrderedList("realdriver");
        properties.setClassValues(com.p6spy.engine.common.P6SpyOptions.class);
        configureReloadingThread();
        P6LogQuery.initMethod();
        P6LogQuery.logInfo("reloadProperties() successful");
    }
    //获取所有模块
    public static ArrayList allModules()
    {
        return modules;
    }
    //获取所有驱动
    public static ArrayList allDriverNames()
    {
        return driverNames;
    }

    protected static Thread reloadThread = null;
    protected static OptionReloader reloader = null;
    public static final String DRIVER_PREFIX = "realdriver";
    public static final String MODULE_PREFIX = "module.";
    private static ArrayList modules;
    private static ArrayList driverNames;
    private static boolean usePrefix;
    private static boolean autoflush;
    private static String exclude;
    private static boolean filter;
    private static String include;
    private static String logfile;
    private static String appender;
    private static String realdriver;
    private static String realdriver2;
    private static String realdriver3;
    private static String spydriver;
    private static boolean append;
    private static String properties;
    private static boolean deregister;
    private static String dateformat;
    private static SimpleDateFormat dateformatter;
    private static String includecategories;
    private static String excludecategories;
    private static String stringmatcher;
    private static StringMatcher stringMatcherEngine;
    private static String sqlExpression;
    private static boolean stackTrace;
    private static String stackTraceClass;
    private static boolean reloadProperties;
    private static long reloadPropertiesInterval;
    private static long reloadMs;
    private static String jndicontextfactory;
    private static String jndicontextproviderurl;
    private static String jndicontextcustom;
    private static String realdatasource;
    private static String realdatasourceclass;
    private static String realdatasourceproperties;
    private static long executionThreshold;
}

自此属性文件配置线路完毕。
分享到:
评论

相关推荐

    myeclipse配置p6spy以及导入源码

    在介绍如何在MyEclipse中配置P6Spy以及导入其源码之前,首先需要了解P6Spy是一款什么工具。P6Spy是一个开源的应用程序,它允许开发者在Java应用程序中监控和记录对数据库的SQL调用。这对于数据库查询的性能分析和...

    weblogic server 11g +p6spy +sql profiler 配置

    你需要在WebLogic的`$WL_HOME/server/lib`目录下,添加P6Spy的JDBC驱动`sqlprofiler.jar`,并确保WebLogic服务器启动时能加载到这个代理驱动。 4. **配置数据源**:在WebLogic管理控制台中,找到你的数据源配置,...

    基于单片机的科学型计算器设计(51+1602+KEY40)#0067

    包括:源程序工程文件、Proteus仿真工程文件、配套技术手册等 1、采用51/52单片机作为主控芯片; 2、采用1602液晶显示; 3、采用5*8矩阵键盘输入; 4、功能键包括:复位键(RST),回删键(DEL),确定键(OK),第二功能切换(2U),背光灯键(LED); 5、运算均为单精度浮点数,包括: 加(+),减(-),乘(x),除(÷), e底指数(e^n),N次方(x^n),开N次方(sqrt), 正弦(sin),余弦(cos),正切(tan), 对数(log), 阶乘(n!)(n<35), 排列(Arn), 累加(∑), *开启第二功能(2U)后可用: 反正弦(asin),反余弦(acos),反正切(atan), 组合(Crn)

    基于三菱FX2N PLC的机械手控制系统设计与实现

    内容概要:本文详细介绍了如何利用三菱FX2N系列PLC构建机械手控制系统。主要内容涵盖电路图设计、IO表配置、源程序编写以及单机组态。文中提供了具体的梯形图编程实例,展示了如何通过PLC精确控制机械手的各种动作,如抓取、移动和放置。此外,还分享了许多实用的调试技巧和注意事项,强调了传感器状态交叉验证和关键动作的时间守护机制。通过这些内容,读者可以全面了解PLC在机械手控制中的应用。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和机械手控制感兴趣的初学者和有一定经验的研发人员。 使用场景及目标:适用于需要设计和实施机械手控制系统的工业场合,帮助工程师掌握PLC编程技巧,提高机械手控制系统的稳定性和可靠性。 其他说明:文章不仅提供理论指导,还包括大量实战代码和调试经验,有助于读者快速上手并在实践中不断优化系统性能。

    豆包生成美女的AI提示词基于豆包平台的美女图像生成提示词

    内容概要:本文档提供了用于生成具有时尚性感元素的美女跳舞图像的提示词指南。文档内容包括角色设定为擅长描绘时尚与超现实主义图片的创作者,背景设定强调女性形象,偏好展现性感漂亮女孩的镜头表达。目标在于根据用户指令创作三幅统一风格的图像,注重色彩搭配和高清效果,同时确保每张图片都具备半身像、真实感和电影效果的特点。文档还给出了具体的输出示例,详细描述了人物形象、服装搭配以及场景布置等要素,旨在为用户提供满意的图像生成服务。; 适合人群:对图像生成感兴趣,尤其是喜欢带有时尚性感元素的美女图像的用户。; 使用场景及目标:①根据用户提供的简单场景信息(如户外或室内)生成三幅不同场景但风格统一的赛博朋克风格美女跳舞图像;②确保生成的图像符合特定的要求,如半身像、真实感、电影效果、性感服装、特定灯光效果等;③通过询问用户对生成图像的满意度来保证服务质量。; 其他说明:文档明确了图像生成的工作流程,从接收用户指令到根据反馈调整生成内容,确保整个过程高效且满足用户需求。同时,文档还限制了生成图像的具体条件,如场景必须为赛博朋克风格、不能出现鞋子和其他人等,以保证图像的独特性和一致性。

    蓝桥杯大赛模拟题PDF

    题目描述 1.问题描述 一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的 数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。 给定正整数n,请问在整数1至n中有多少个数位递增的数? 输入格式 输入的第一行包含一个整数n。 输出格式 输出一行包含一个整数,表示答案。 样例输入 30 样例输出

    基于非对称纳什谈判的多微网电能共享优化策略及其MATLAB实现

    内容概要:本文详细介绍了基于非对称纳什谈判的多微网电能共享运行优化策略及其MATLAB代码实现。首先阐述了纳什谈判和合作博弈的基本理论,然后将多微网电能共享合作运行模型分解为微网联盟效益最大化和合作收益分配两个子问题。文中展示了如何通过交替方向乘子法(ADMM)进行分布式求解,确保各微网隐私安全。此外,还探讨了电转气(P2G)和碳捕集(CCS)设备的应用,以实现低碳调度。最后,通过具体代码示例解释了模型的构建、求解及优化过程。 适合人群:对电力系统优化、博弈论、MATLAB编程感兴趣的科研人员和技术开发者。 使用场景及目标:适用于希望深入了解多微网电能共享优化策略的研究者,旨在提高微网联盟的整体效益并实现公平合理的收益分配。同时,该策略有助于降低碳排放,提升系统的环境友好性和经济性。 其他说明:文章提供了详细的代码注释和调试技巧,帮助读者更好地理解和实现这一复杂的优化策略。

    MATLAB机器人仿真:基于视觉控制的六轴机械臂运动路径规划与实现

    内容概要:本文详细介绍了如何利用MATLAB进行六轴机械臂的视觉控制系统仿真。首先,通过MATLAB的图像处理工具箱捕捉并处理实时视频流,使用HSV颜色空间进行颜色阈值处理,从而定位红色小球的位置。然后,借助Robotics Toolbox中的逆运动学模块,将摄像头获取的目标位置转换为机械臂的关节角度,确保机械臂能够精准地追踪目标。此外,还讨论了路径规划的方法,如使用五次多项式插值和平滑滤波器,使机械臂的动作更加流畅。文中强调了实际应用中可能遇到的问题及其解决方法,如奇异点处理、坐标系转换和机械臂的速度限制等。 适合人群:具有一定编程基础和技术背景的研究人员、工程师以及对机器人视觉控制感兴趣的开发者。 使用场景及目标:适用于希望在MATLAB环境中快速搭建和测试机械臂视觉控制系统的科研人员和工程师。主要目标是掌握从图像处理到机械臂控制的完整流程,理解各模块的工作原理,并能够在实际项目中应用。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实用的经验和技巧,帮助读者更好地理解和优化仿真系统。同时提醒读者注意仿真与现实之间的差异,如摄像头延迟、机械臂传动误差等问题。

    【KUKA 机器人坐标的建立】:mo2_base_en.ppt

    KUKA机器人相关文档

    【KUKA 机器人资料】:KAKA机器人汽车座椅测试系统.pdf

    KUKA机器人相关文档

    三相变流器MPC控制:Matlab/Simulink仿真实现及优化技巧

    内容概要:本文详细介绍了三相变流器的模型预测控制(MPC)在Matlab/Simulink环境下的实现过程。首先,初始化程序设置了关键参数,如直流母线电压、开关频率和控制周期等,确保系统的稳定性和效率。接着,通过MPC_sfun.c实现了核心控制算法,采用状态空间模型进行滚动预测,提高了系统的动态响应能力。最后,利用out.m生成高质量的仿真结果图,展示了负载突变时的快速恢复特性,并提供了优化建议,如调整代价函数权重和引入软约束等。 适合人群:电力电子工程师、控制系统研究人员以及对MPC感兴趣的科研工作者。 使用场景及目标:适用于需要精确控制电压电流的场合,如电动汽车充电站、风力发电系统等。主要目标是提高系统的动态响应速度、降低总谐波失真(THD),并在性能和计算负担之间取得平衡。 其他说明:文中提到了一些实用技巧,如控制周期的选择、预测步长的优化、图形绘制的最佳实践等,有助于读者更好地理解和应用MPC控制策略。同时,强调了在实际应用中需要注意的问题,如避免过高开关频率导致器件损坏等。

    网络炒作策划要点解析.ppt

    网络炒作策划要点解析.ppt

    三菱Q03UDE PLC SFC编程模板在16轴伺服控制系统中的应用与优化

    内容概要:本文详细介绍了三菱Q03UDE PLC使用SFC(顺序功能图)编程方法在16轴伺服控制系统中的应用。文章首先概述了硬件配置,包括500个IO点、16轴伺服控制以及触摸屏的画面编程。接着深入探讨了SFC编程的具体实现方式,如将复杂的轴控制分解为独立的流程块,利用并行结构解决多轴同步问题,通过触摸屏实时监控和反馈SFC步状态,以及如何高效管理和复用输出点。此外,文章还讨论了SFC在状态管理和报警处理方面的优势,并提供了具体的代码示例来展示其实现细节。最后,作者分享了一些实用技巧和注意事项,强调了SFC编程相比传统梯形图的优势。 适合人群:从事工业自动化控制系统的工程师和技术人员,尤其是对三菱PLC和SFC编程感兴趣的读者。 使用场景及目标:适用于需要进行复杂多轴伺服控制项目的工程师,旨在提高调试效率、减少信号冲突、缩短新人培养周期,并提供一种更加直观和高效的编程方法。 其他说明:文中提到的实际项目经验有助于读者更好地理解和应用SFC编程技术,同时也提醒了一些常见的错误和陷阱,帮助读者避免不必要的麻烦。

    LabVIEW与三菱FX3U PLC串口通讯:基于Modbus协议的简易实现及应用

    内容概要:本文详细介绍了如何使用LabVIEW实现与三菱FX3U PLC的串口通讯,采用Modbus无协议通讯方式进行简单读写操作。主要内容包括PLC通讯参数配置、LabVIEW工程结构搭建、Modbus报文构造方法以及具体的读写数据模块实现。文中提供了详细的代码示例和注意事项,帮助读者快速理解和实践这一通讯过程。 适合人群:对工业自动化有一定兴趣的技术人员,尤其是熟悉LabVIEW和三菱PLC的工程师。 使用场景及目标:适用于需要将LabVIEW作为上位机与三菱FX3U PLC进行串口通讯的应用场合,如工业控制系统、实验教学等。主要目标是掌握Modbus协议的基础知识及其在LabVIEW中的具体实现。 其他说明:文章还提供了一些常见的错误排查方法和实用技巧,如CRC校验的处理、地址偏移量的注意事项等。此外,附带了完整的源码供读者下载和参考。

    图像检索-基于零样本开集的草图图像检索系统实现-附项目源码+流程教程-优质项目实战.zip

    图像检索_基于零样本开集的草图图像检索系统实现_附项目源码+流程教程_优质项目实战

    基于C语言写的电话簿程序

    基于C语言写的电话簿程序

    基于单片机的电压(20V)检测设计(51+1602+AD0808)#0063

    包括:源程序工程文件、Proteus仿真工程文件、配套技术手册等 1、采用51单片机作为主控芯片; 2、采用1602液晶显示检测电压值,范围0~20V; 3、采用ADC0808进行模数转换;

    【剧本杀AI提示词指令】基于AI的剧本杀定制化创作系统(deepseek,豆包,kimi,chatGPT,扣子空间,manus,AI训练师)

    内容概要:本文介绍了一个专业的剧本杀创作作家AI。它能根据客户需求创作各种风格和难度的剧本杀剧本,并提供创作建议和修改意见。其目标是创造引人入胜、逻辑严密的剧本体验。它的工作流程包括接收理解剧本要求、创作剧本框架情节、设计角色背景线索任务剧情走向、提供修改完善建议、确保剧本可玩性和故事连贯性。它需保证剧本原创、符合道德法律标准并在规定时间内完成创作。它具备剧本创作技巧、角色构建理解、线索悬念编织、文学知识和创意思维、不同文化背景下剧本风格掌握以及剧本杀游戏机制和玩家心理熟悉等技能。; 适合人群:有剧本杀创作需求的人群,如剧本杀爱好者、创作者等。; 使用场景及目标:①为用户提供符合要求的剧本杀剧本创作服务;②帮助用户完善剧本杀剧本,提高剧本质量。; 阅读建议:此资源详细介绍了剧本杀创作作家AI的功能和服务流程,用户可以依据自身需求与该AI合作,明确表达自己的创作需求并配合其工作流程。

    Matlab图像处理技术实现静态图片美颜与特效处理

    内容概要:本文详细介绍了如何利用Matlab进行静态图片的美颜和特效处理。首先通过Viola-Jones算法进行人脸定位,然后采用双边滤波对皮肤进行磨皮处理,在HSV色彩空间中调整亮度以达到美白效果,最后运用小波变换将星空图等特效融合到图片中。整个过程中涉及多个图像处理技术和算法,如Haar特征、双边滤波、HSV转换、小波变换等。 适合人群:对图像处理感兴趣的初学者以及有一定Matlab基础的研发人员。 使用场景及目标:适用于希望深入了解图像处理原理并掌握具体实现方法的学习者;目标是能够独立完成简单的图像美化任务,如人像磨皮、美白、特效添加等。 其他说明:文中提供了完整的代码示例,帮助读者更好地理解和实践相关技术。同时强调了参数选择的重要性,并给出了合理的建议范围。

    KUKA_机器人初级培训教材.ppt

    KUKA机器人相关文档

Global site tag (gtag.js) - Google Analytics