皮皮网
皮皮网

【access源码作品】【单机app源码】【window系统源码】配置源码笔记_源代码设计笔记demo

来源:奖虫APP源码 发表时间:2024-12-27 17:32:30

1.easylogging源码学习笔记(6)
2.Vue2源码学习笔记 - 10.响应式原理一computed与watch浅析
3.EasyLogger源码学习笔记(1)
4.Win下Jenkins-2.138源码编译及填坑笔记
5.Vue Router 源码学习笔记4 - pushState和replaceState的配置实现
6.EasyLogger源码学习笔记(5)

配置源码笔记_源代码设计笔记demo

easylogging源码学习笔记(6)

       `LOG` 是默认日志、CLOG自定义日志、源码源代LOG_IF条件日志

       特殊日志

       LOG_EVERY_N、笔记LOG_AFTER_N、码设LOG_N_TIMES

       for (int i = 1; i <= ; ++i) {

       LOG_EVERY_N(2,计笔记 INFO) << "Logged every second iter";

       }// 5 logs written; 2, 4, 6, 7,

       for (int i = 1; i <= ; ++i) {

       LOG_AFTER_N(2, INFO) << "Log after 2 hits; " << i;

       }// 8 logs written; 3, 4, 5, 6, 7, 8, 9,

       for (int i = 1; i <= ; ++i) {

       LOG_N_TIMES(3, INFO) << "Log only 3 times; " << i;

       }// 3 logs writter; 1, 2, 3

       条件日志和特殊日志可以搭配使用

       * `VLOG_IF(condition, verbose-level)`

       * `CVLOG_IF(condition, verbose-level, loggerID)`

       * `VLOG_EVERY_N(n, verbose-level)`

       * `CVLOG_EVERY_N(n, verbose-level, loggerID)`

       * `VLOG_AFTER_N(n, verbose-level)`

       * `CVLOG_AFTER_N(n, verbose-level, loggerID)`

       * `VLOG_N_TIMES(n, verbose-level)`

       * `CVLOG_N_TIMES(n, verbose-level, loggerID)`

       日志详细等级判定

       if (VLOG_IS_ON(2)) {

       // Verbosity level 2 is on for this file

       }

       性能追踪

       * `TIMED_FUNC(obj-name)`

       * `TIMED_SCOPE(obj-name, block-name)`

       * `TIMED_BLOCK(obj-name, block-name)`

       这些宏实际上都是关于el::base::type::PerformanceTrackerPtr,一个指向el::base::PerformanceTracker的配置access源码作品指针

       #if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)

       PerformanceTracker::PerformanceTracker(const std::string& blockName,

       base::TimestampUnit timestampUnit,

       const std::string& loggerId,

       bool scopedLog, Level level) :

       m_blockName(blockName), m_timestampUnit(timestampUnit), m_loggerId(loggerId), m_scopedLog(scopedLog),

       m_level(level), m_hasChecked(false), m_lastCheckpointId(std::string()), m_enabled(false) {

       #if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED

       // We store it locally so that if user happen to change configuration by the end of scope

       // or before calling checkpoint, we still depend on state of configuration at time of construction

       el::Logger* loggerPtr = ELPP->registeredLoggers()->get(loggerId, false);

       m_enabled = loggerPtr != nullptr && loggerPtr->m_typedConfigurations->performanceTracking(m_level);

       if (m_enabled) {

       base::utils::DateTime::gettimeofday(&m_startTime);

       }

       #endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED

       }

       在构造函数中获取一个时间,

       PerformanceTracker::~PerformanceTracker(void) {

       #if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED

       if (m_enabled) {

       base::threading::ScopedLock scopedLock(lock());

       if (m_scopedLog) {

       base::utils::DateTime::gettimeofday(&m_endTime);

       base::type::string_t formattedTime = getFormattedTimeTaken();

       PerformanceTrackingData data(PerformanceTrackingData::DataType::Complete);

       data.init(this);

       data.m_formattedTimeTaken = formattedTime;

       PerformanceTrackingCallback* callback = nullptr;

       for (const std::pair& h

       : ELPP->m_performanceTrackingCallbacks) {

       callback = h.second.get();

       if (callback != nullptr && callback->enabled()) {

       callback->handle(&data);

       }

       }

       }

       }

       #endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING)

       }

       在析构函数中获取一个时间,源码源代处理时间data,笔记使用PerformanceTrackingCallback类型指针callback,码设并在callback->handle(&data)中处理输出。计笔记

       由于定义了ELPP_FEATURE_PERFORMANCE_TRACKING,配置因此在初始化(INITIALIZE_EASYLOGGINGPP)中实际上是源码源代安装了一个base::DefaultPerformanceTrackingCallback。

       在PerformanceTracker类的笔记handle函数中,callback是码设一个PerformanceTrackingCallback类型指针,由于安装的计笔记是DefaultPerformanceTrackingCallback对象,因此是一个基类指针指向了派生类对象。处理输出的逻辑在DefaultPerformanceTrackingCallback类的handle函数中。

       DefaultPerformanceTrackingCallback类的单机app源码handle函数首先会将数据成员m_data的指针赋值给函数参数,并创建一个base::type::stringstream_t类型的对象ss用于构建输出内容。根据m_data的dataType,输出不同的信息。在输出时,会使用el::base::Writer类构造并输出内容。

Vue2源码学习笔记 - .响应式原理一computed与watch浅析

       本文仅简要介绍Vue2源码中计算属性和侦听属性的初始化过程,深入研究响应式原理将在后续内容中进行。

       计算属性初始化:在Vue实例化过程中,传入的计算属性配置被传递至initComputed函数。该函数生成每个计算属性的Watcher对象,且设置lazy选项为真。通过defineComputed函数定义计算属性为响应式变量,实现计算属性的初始化。在defineComputed中,使用Object.defineProperty将计算属性设置为响应式属性,通过生成getter函数(如computedGetter),在获取属性值时,window系统源码计算并收集依赖。

       侦听属性初始化:在initState函数中,侦听属性的初始化调用initWatch函数。此函数直接将侦听属性传递至Vue.prototype.$watch方法,配置侦听属性与回调函数,实现侦听属性的初始化。$watch方法实例化Watcher对象,监听属性变动,当检测到变动时执行回调函数。

       总结:计算属性与侦听属性的初始化相对简化,主要依赖于Watcher类。计算属性通过生成Watcher对象与getter函数,实现响应式计算与依赖收集;侦听属性则通过配置Watcher对象与回调函数,实现属性变动时的自动响应。在后续内容中,将深入研究Watcher类及其与计算属性、侦听属性的筹码源码指标关联与配合机制。

EasyLogger源码学习笔记(1)

       在编程中,预处理器通过宏定义执行特定的逻辑。使用`#ifdef`和`#else`可以实现条件编译。当`#ifdef _XXXX`中的标识符_XXXX被`#define`命令定义时,编译器将执行`#ifdef`后的程序段1,否则执行`#else`后的程序段2。`#ifndef _XXXX`则表示如果标识符未被定义,则执行程序段1,反之执行程序段2。

       ANSI C宏提供了多种实用信息,如`__DATE__`返回当前日期,`__TIME__`返回当前时间,`__FILE__`包含当前文件名,`__LINE__`包含当前行号。`__STDC__`常量用于判断程序是否遵循ANSI C标准。`__FUNCTION__`宏在预编译时返回所在函数的名称。

       宏参数的vb源码打开处理可以通过`#`将参数变为字符串,使用`##`将两个宏参数连接起来。`__VA_ARGS__`是一个可变参数宏,需配合`define`使用,将宏左侧的`..`内容原样复制到右侧。

       `#if defined`和`#if !defined`在功能上相似,都用于判断宏是否定义。`#error`指令在编译时生成错误消息并停止编译,用于警告开发者。

       `extern`关键字用于引用其他文件中的函数或全局变量。例如`extern ElogErrCode elog_port_init(void);`声明了一个名为`elog_port_init`的外部函数,调用时需要指明返回值类型和参数。

       在多线程编程中,使用`sched_param`结构来管理线程调度参数。`sem_t`表示信号量,用于实现互斥和同步。`pthread_attr_setschedpolicy(&thread_attr, SCHED_RR);`设置进程调度策略为实时轮转调度。

       `SCHED_OTHER`默认分时调度策略,`SCHED_FIFO`采用先进先出策略,而`SCHED_RR`是`SCHED_FIFO`的增强版,提供实时轮转功能。使用`sched_get_priority_max(int policy);`和`sched_get_priority_min(int policy);`函数可以获取线程可设置的最高和最低优先级,其中策略参数即上述三种调度策略的宏定义。

       `pthread_attr_setschedparam(&thread_attr, &thread_sched_param);`用于设置线程的优先级。通过这些函数,开发者可以精细地控制线程调度,提高程序性能。

Win下Jenkins-2.源码编译及填坑笔记

       安装JDK与配置环境

       首先安装JDK版本1.8-,确保操作系统中已添加JDK环境变量。通过执行"Java -version"命令验证JDK安装。注意,JDK版本必须在1.8.0-以上,Jenkins 2.版本不支持Java9,Maven版本需在3.5.3以上。

       设置Maven环境与仓库路径

       解压Maven3.5.4至指定英文路径,并添加Maven环境变量。配置Maven的conf\setting.xml文件,定位到行,设置本地Maven仓库路径为"C:\jstao\soft\sprintbootjar\repository"。定位到行,配置远端阿里云仓库,以方便访问相关资源。

       解压Jenkins源码

       解压Jenkins-2.源码至英文路径下。注意,解压前需确保目标目录为空。

       源码编译与打包

       以管理员身份运行CMD,进入Jenkins解压目录。执行命令"mvn validate"进行项目校验,首次执行可能需等待一段时间。接着执行"mvn clean install -Dmaven.test.skip=true"跳过单元测试编译项目,首次编译亦需等待。校验和编译过程完成后,可在war\target目录下找到GeoDevOps.war文件。

       启动与测试

       运行GeoDevOps.war文件,执行命令"java -jar GeoDevOps.war",访问...,下载iso文件(可能版本不同,但是一定是几个G大小的iso文件):

       由于文件较大,可能会下载一段时间,请耐心等待。 下载得到的文件应该为一个巨大的iso文件。 下载后,推荐使用WinRAR进行解压,也可以通过其他方法进行解压。解压后得到的文件如图所示:

       接下来win+R键入cmd打开,cd到该文件夹下,键入下面的指令启动installer:

       结果如下图所示:

       如果想要进行某些个性化操作,可以键入相应的指令。例如更改下载路径,可以键入d指令。针对各种指令,界面解释的很详细。一般而言,下载的路径是C:/texlive/,下辖和texmf-local等2个文件夹。不用更改也是可以的。 如果确认没有问题,键入i即可开始安装,时间可能比较长,请耐心等待:

       我上次在我的电脑安装了半小时,最终完成的界面是这样:

       最终实际用时:分钟。 接下来稍微配置一下环境变量。打开设置,点击“系统-系统信息-高级系统设置“,点击”环境变量“:

       双击”系统变量“中的PATH,添加一行”C:\texlive\\bin\windows”,如图:

       之后一路点击确定退出。 打开cmd,逐行测试下面的4行命令:

       最终显示结果如图:

       至此,TeXLive环境配置完成。 接下来,如果安装路径没有改,TeXstudio会自动配置TeXLive,这里TeXstudio就可以直接用了,不需要任何更多的配置。 打开TeXstudio的左上角创建文件,输入以下的内容:

       保存文件,按下f5即可编译出pdf,结果如图所示:

       至此,LaTeX的开发环境配置完成!

相关栏目:休闲