Ghost blog 源码分析(二)Init

我能说很后悔四点钟爬起来写了个(一)config么。。。

在Ghost blog的Node server启动后,首先做好config工作,接下来就是blog系统本身的初始化,在很多初始化步骤中,以笔者现在龟爬的阅读进度来看,还不能理解为什么,只能写是什么。

在入口server.js中,首先调用了ghost.init()方法,调用代码只有一行就省略不贴了。而这个ghost对象,就是整个系统的核心对象,从名字上就能看出来。他是从一个Ghost类上new出来的。而我们今天要讲的init就是Ghost类中的初始化方法。

ghost在./core目录下,init函数如下:
// Initialise the application
Ghost.prototype.init = function () {
var self = this;

function doFirstRun() {
//...... 省略
}

function initDbHashAndFirstRun() {
//.......省略

}

// ### Initialisation
return when.join(
// Initialise the models
self.dataProvider.init(),
// Calculate paths
self.getPaths(),
// Initialise mail after first run
self.mail.init(self)
).then(function () {
// Populate any missing default settings
return models.Settings.populateDefaults();
}).then(function () {
// Initialize the settings cache
return self.updateSettingsCache();
}).then(function () {
return when.join(
// Check for or initialise a dbHash.
initDbHashAndFirstRun(),
// Initialize plugins
self.initPlugins(),
// Initialize the permissions actions and objects
permissions.init()
);
}).otherwise(errors.logAndThrowError);
};


那么按着顺序一个一个步骤简单介绍一下吧。
1. self.dataProvider.init() : 调用了一个类自身属性dataProvider的init方法,这个dataProvider在上文有定义
models      = require('./server/models'),

dataProvider: models,

但其实models是个目录,下面是诸如user,post,tag,setting等模块。那么话说回来,models.init()到底做了什么,它就做了一件事:比较当前的blog数据版本和默认的数据版本是否一致,如果不一致会做更新,甚至是直接抛错。

2. self.getPaths() :调用类自身的方法getPaths(),所做的工作就是生成主题(themes)和插件(plugins)所在的路径,以供之后其他方法调用。

3. self.mail.init(self) : 很明显,这是在初始化邮件模块

4. models.Settings.populateDefaults() : setting里面其实存有blog的很多基本信息,诸如:
databaseVersion
title
description
email
logo
cover
defaultLang
postsPerPage
forceI18n
activeTheme
activePlugins
installedPlugins

而,这一步代码,所做的工作就是去看看当前blog中的这些key有没有缺少的,如果少了,就用defaults的value给补上

5. self.updateSettingsCache() : 将当前的基本信息给更新到cache里,就是第4步里那些信息,这个方法其实还有一个参数settings,如果传了就用所传的,不传的话就从db里去找数据。

6. initDbHashAndFirstRun() :初始化dbHash哈希值,dbHash也是在settings里的一项数据,这里做个判断,如果已存在就用现成的,不存在就用uuid.v4()重新生成,dbhash的作用从注释上看是用于cookie相关的操作,实际用处暂时不知道。
        // Holds the dbhash (mainly used for cookie secret)
instance.dbHash = undefined;

同时,生成好dbHash后,就进行First run,在console上输出一些信息,上面代码里就省略了。

7. self.initPlugins() : 对插件进行加载,不过一开始当然是没有插件的

8. permissions.init() : 允许动作的初始化,笔者返回了{ edit: [ 'post' ], remove: [ 'post' ], create: [ 'post' ] }这样的信息,但是用处不明。

先写这么多,每个步骤其实都可以深入下去,下次写啥呢……
GhostNet是一种轻量级的神经网络模型,被设计用于图像分类任务。GhostNet的设计目标是在保持较高精度的同时,尽可能减少模型的参数量和计算复杂度。 GhostNet的源码解析涉及一些细节,我会尽量以简洁的方式进行解释。请注意,以下解析基于我对GhostNet的了解,可能与实际源码实现略有不同。 GhostNet的主要特点之一是使用了Ghost Module(幽灵模块)。Ghost Module是一种特殊的模块,用于替代传统的卷积操作。它通过将一个较大的卷积核分解为一个较小的卷积核和一个稀疏矩阵(称为幽灵通道),以减少参数量和计算复杂度。这种分解可以在一定程度上保持模型的特征表达能力。 在GhostNet中,幽灵通道是通过对输入特征图进行一系列线性变换得到的。这些线性变换可以通过1x1卷积层或全连接层来实现。然后,幽灵通道与小卷积核进行卷积操作,得到最终的输出特征图。 除了Ghost Module,GhostNet还使用了一些其他的优化技巧来进一步减少模型的参数量和计算复杂度。例如,使用了深度可分离卷积(depthwise separable convolution)来减少计算量,使用了SE模块来增强模型的表达能力。 总的来说,GhostNet是一种轻量级的神经网络模型,通过使用Ghost Module和其他优化技巧,可以在图像分类任务上取得较高的精度,并减少模型的参数量和计算复杂度。具体的源码实现可以在相关的开源项目中找到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值