wespten
悦分享
网上搜索资料的朋友,一定都会有这样一个感受,那就是知识点有时太过零散,有时又存在误区,有时又太过简短,而有时又缺乏深度,一个系统又详细的分享小天地,为真正想去学习或了解某些事情的朋友,持续提供有价值且有深度的内容。
展开
-
weblogic网站搭建连接oracle数据库(附网站源码及安装包)
好,返回weblogic的部署页面去,选择路径的地方,选择我们的jobfan.war文件,注意上面还有一个蓝色字体的上传文件的功能,点击它来进行上传也是可以的。开启后台管理服务器,然后点击完成,注意,要记住管理服务器的 url http://jadenwin2003web:7001/console。选择安装路径,直接下一步,默认即可,把默认路径记下来 C:\Oracle\Middleware\Oracle_Home ,后面有用。好,来到如下页面,点击完成即可,部署会花费一点时间,所以稍作等待。原创 2025-05-02 22:35:04 · 49 阅读 · 0 评论 -
jboss网站搭建连接oracle数据库(附网站源码及安装包)
jboss环境是没有一键安装的,所以我们需要手动安装将我给大家下载好jdk和jboss安装文件兵放到虚拟机上。在oracle和joss的官方网站即可下载,我下载好了,已上传至附件,大家直接而用就行了。也就是安装java:点击下一步,来到如下窗口,安装路径选择,默认即可:点击下一步,来到如下页面:下一步,来到如下窗口:点击关闭,安装完成。原创 2025-05-02 22:02:52 · 40 阅读 · 0 评论 -
tomcat+java网站搭建连接mysql数据库(附网站源码及安装包)
tomcat是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试JSP 程序的首选。structs是一个java开发的后端语言框架,是Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。程序员开发网站时用到structs的主要原因就是用它来开发网站会很快,因为好多开发网站的功能都封装到了这个框架中了,企业用这两个工具结合起来进行网站的开发和部署,structs虽然功能很强。原创 2025-05-02 21:04:20 · 58 阅读 · 0 评论 -
ASPX网站搭建连接sqlserver数据库(附网站源码及安装包)
下面我们要部署的网站是基于sqlserver数据库的,所以我们需要安装一下。sqlserver这个数据库我已经封装到一个光盘镜像中了,我们加载一下这个镜像就可以了(镜像已上传至附件)。原创 2025-05-02 20:51:41 · 41 阅读 · 0 评论 -
asp网站连接access数据库(附asp网站源码及安装包)
从微软推出了ASP(ActiveServerPage)后,它以其强大的功能,简单易学的特点而受到广大WEB开发人员的喜欢。但是它却有微软产品的通病,只能在Windows平台下使用,虽然它可以通过增加控件而在LINUX下使用,但是其功能最强大的DCOM控件却不能使用。而SUN公司在JAVA的基础下开发出的JSP(Java ServerPages)实现了动态页面与静态页面的分离,脱离了硬件平台的束缚,以及编译后运行等方式大大提高了其执行效率而逐渐成为因特网上的主流开发工具.原创 2025-05-02 19:50:15 · 37 阅读 · 0 评论 -
MySQL报Got an error reading communication packets错
要禁用它,请将其设置为0,如果该值大于0,服务器会记录有关基于语句的日志记录不安全的语句的消息。如果该值大于1,服务器将记录中止的连接和新连接尝试的访问拒绝错误。增加net_read_timeout、net_write_timeout的值,并观察是否还有该错误发生;但这样直接修改,重启后会失效,需要通过修改配置文件mysql.cnf log_warnings = 1。当然,也可能是其它原因导致的。坦白讲,异常中断是很难诊断的,也有可能是和网络、防火墙有关。检查DNS配置是否有延迟问题。原创 2025-01-02 03:11:15 · 411 阅读 · 0 评论 -
Ceph存储调优与故障排查(TS)实战
在典型的部署中,osd使用具有高延迟的传统旋转磁盘,因为它们以较低的每兆字节成本提供了满足定义目标的令人满意的指标。从经验来看,主要的例外是对CRUSH的改动。此问题可能是由网络问题引起的,或者Ceph监视器可能有过时的Ceph监视器映射(monmap)正在试图到达不正确的IP地址上的其他Ceph监视器。Ceph不支持混合设置,例如为客户端启用Ceph,但在Ceph服务之间的通信中禁用Ceph。默认情况下,Cephx是启用的,如果客户端试图在没有Cephx的情况下访问Ceph集群,则会收到一个错误消息。原创 2024-09-01 20:32:09 · 187 阅读 · 0 评论 -
管理ceph存储集群实战
Red Hat Ceph Storage Manager (MGR)的作用是收集集群统计信息。当MGR节点关闭时,客户端I/O操作继续正常,但查询集群统计信息失败。为每个集群至少部署两个mgr,以提供高可用性。mgr通常运行在与MON节点相同的主机上,但这不是必需的。在集群中启动的第一个MGR守护进程成为活动的MGR,所有其他MGR处于备用状态。如果主MGR没有在配置的时间间隔内发送信标,备用MGR将接管。如果需要,可以配置mon_mgr_beacon_grace设置来更改信标时间间隔。缺省值是30秒。原创 2024-09-01 20:31:19 · 251 阅读 · 0 评论 -
Ceph提供文件存储实战
Ceph文件系统的实现需要一个运行的Ceph存储集群和至少一个Ceph元数据服务器(MDS)来管理Ceph元数据,与文件数据分开,这降低了复杂性并提高了可靠性。要实现cephfs文件系统,需要创建所需的池、创建cephfs文件系统、部署MDS守护进程,然后挂载文件系统。你可以手动创建池,创建ceph fs文件系统,部署MDS守护进程,或者使用ceph fs volume create命令,它会自动执行所有这些步骤。在创建子卷时,可以指定更细粒度的权限管理,例如子卷的UID、GID、文件模式、大小和子卷组。原创 2024-09-01 20:30:24 · 113 阅读 · 0 评论 -
ceph对象存储和REST api访问对象存储实战
对象存储将数据存储为离散的项,每个项单独称为一个对象。与文件系统中的文件不同,对象不是在目录和子目录树中组织的。相反,对象存储在平坦的名称空间中。通过使用对象的唯一对象ID(也称为对象键)检索每个对象。应用程序不使用普通的文件系统操作来访问对象数据。相反,应用程序访问REST API来发送和接收对象。Red Hat Ceph Storage支持两种最常见的对象api: Amazon S3(简单存储服务)和OpenStack Swift(OpenStack对象存储)。原创 2024-09-01 20:25:57 · 258 阅读 · 0 评论 -
ceph提供块存储和块存储的扩容实战
因为Ceph块设备的用户空间实现(例如,librbd)不能利用Linux页面缓存,所以它执行自己的内存缓存,称为RBD缓存。基于快照的镜像使用定期调度或手动创建的RBD镜像快照,在两个Red Hat Ceph Storage集群之间复制崩溃一致的RBD镜像。通过遵循这个推荐的实践,你可以根据你的Red Hat OpenStack平台环境访问的RBD映像类型创建不同的缓存策略。RBD镜像中的所有对象都有一个名称,该名称以每个RBD镜像的RBD块名称前缀字段中包含的值开头,并使用RBD info命令显示。原创 2024-09-01 20:19:18 · 182 阅读 · 0 评论 -
ceph创建存储对象与存储对象集群实战
Red Hat Ceph Storage是一个分布式数据对象存储。它是一种企业级、软件定义的存储解决方案,可扩展到数千个客户端,这些客户端可以访问EB以上的数据。Ceph旨在提供出色的性能、可靠性和可伸缩性。对象存储后端,称为RADOS(Reliable Autonomic Distributed Object Store可靠自主分布式对象存储);2种和RADOS交互的方式;RADOS是一个自修复(self-healing)和自管理(self-managing)的基于软件的对象存储。原创 2024-09-01 18:12:03 · 137 阅读 · 0 评论 -
MySQL、Redis高频面试题汇总
3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。3)缓存击穿,是指一个key非常热点,在不停的扛着大并发,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。原创 2024-05-21 08:00:05 · 138 阅读 · 0 评论 -
Ceph故障排查案例
分布式存储集群的可靠性已经很高,但在大容量集群环境下,出现任何故障都可能带来集群性能问题或者数据安全隐患,因此要做好对集群状态监控及故障恢复。当故障发生后,我们要及时使用正确的处理方式排除故障。原创 2024-01-21 06:23:57 · 425 阅读 · 0 评论 -
Ceph容灾实战
要了解多站点设置,首先需要了解一些多站点的关键组件:Realm、Zone、Zonegroup和Period。原创 2024-01-21 06:23:29 · 247 阅读 · 0 评论 -
Ceph集群管理实战
配置完Ceph集群后,我们即可对Ceph集群进行数据存储。在后续使用过程中,Ceph提供了常用的命令对Ceph集群进行必要的运维。常见的集群状态查看、磁盘使用率查看、添加磁盘、删除坏盘等操作。原创 2024-01-21 06:22:57 · 195 阅读 · 0 评论 -
Ceph文件存储详解
文件系统的结构状态是维护在远端Ceph集群中的,Ceph文件系统同时挂载用户机1和用户机2,当往用户机1的挂载点写入数据后,远端Ceph集群中的系统文件状态结构随之更新,当从用户机2的挂载点访问数据时会去远端Ceph集群取数据,由于远端Ceph集群已更新,用户机2能够获取最新的数据。Ceph的文件系统符合POSIX 标准,用户就可以像使用本地存储目录一样使用Ceph的文件系统的挂载目录,即无需修改你的程序,就可以将程序的底层存储换成空间无线并可以多出共享读写的Ceph集群文件系统。原创 2024-01-21 06:22:31 · 277 阅读 · 0 评论 -
Ceph对象存储详解
而对象存储则将元数据独立出来了,控制节点叫元数据服务器(服务器+对象存储管理软件),里面主要负责存储对象的属性(主要是对象的数据被打散存放到了那几台分布式服务器中的信息)而其他负责存储数据的分布式服务器叫做OSD,主要负责存储文件的数据部分。之所以出现对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬各自的优点。(2)对象存储的成本比起普通的文件存储还要较高,需要购买专门的对象存储软件以及大容量硬盘,如果对数据量要求不是海量,只是为了做文件共享的时候,直接用文件存储就好了,性价比高。原创 2024-01-21 06:22:07 · 229 阅读 · 0 评论 -
Ceph RBD块存储详解
块存储接口通常以 QEMU Driver 或者 Kernel Module 的方式存在,这种接口需要实现 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青云的云硬盘和阿里云的盘古系统,还有 Ceph 的 RBD(RBD是Ceph面向块存储的接口)。块存储将信息存储在固定大小的块中,每个块都有自己的地址,可以在块设备的任意位置读取一定长度的数据。以hd开头的块设备文件对应的是IDE接口的硬盘。原创 2024-01-21 06:21:41 · 455 阅读 · 0 评论 -
Ceph企业级实战
当对克隆的镜像没有写而是读的时候,那么读取的是被克隆的快照,明白了上面的道理所有我们知道从快照克隆的镜像是依赖于快照的,一旦快照被删除则这个克隆镜像也就毁了,所以我们要保护这个快照。原因: 第一次在做的时候没有修改主机名是就生成了公私钥,结果拷贝的公钥有问题,在问题二推送配置的时候,排查后发现主机名的问题。之后初始化mon的时候出错,排错两个小时,差点怀疑人生的时候突然发现,想起主机名的事情,就检查了以下公私钥,结果发现生成的公私钥是以原主机名生成的,删除后生成新的公私钥,传送公钥后,还是失败。原创 2024-01-21 06:21:15 · 157 阅读 · 0 评论 -
Ceph存储引擎详解
BlueStore 最大的特点是 OSD 可以直接管理裸磁盘设备,并且将对象数据存储在该设备中。另外对象有很多KV属性信息,这些信息之前是存储在文件的扩展属性或者LevelDB当中的。而在BlueStore中,这些信息存储在RocksDB当中。RocksDB本身是需要运行在文件系统之上的,因此为了使用RocksDB存储这些元数据,需要开发一个简单的文件系统(BlueFS)。原创 2024-01-21 06:20:27 · 229 阅读 · 0 评论 -
Ceph存储架构详解
1. Ceph支持文件系统存储、块存储、对象存储;2. 中间层 librados 是提供上层接口访问底层 RADOS 集群存储系统的各种库函数;3. RAODS 提供了一个完整的存储系统,包含:Monitors、OSDs、MDSa. Monitor:用来监视Ceph集群的健康状态,并保存各种map信息;b. OSDs:主要用来存储数据的守护进程,以PG位单位进行数据的存储、迁移和恢复;c. MDS:文件系统的元数据管理服务流程,主要针对CephFS中的元数据信息进行管理。原创 2024-01-21 06:19:58 · 220 阅读 · 0 评论 -
分布式存储Ceph概述
什么是分布式存储?打个比方, 我在一个环境当中,有很多很多的服务器,服务器上也有它自己很多的硬盘,我通过软件的形式把若干服务器都收集起来,部署成一个软件,在这个逻辑的软件里可以同时看到我若干服务器的磁盘的空间,这个逻辑的软件对外就像是一个整体一样,这个整体叫storage spool,用户呢有一天想用这个空间了,用户直接去对应这个存储池提供的接口,这用的话,用户保存一个文件,实际上保存在若干个服务器里,文件会随机存到第一个服务器的第一块硬盘里,下一次就可能存到第二个服务器的第三块硬盘里。原创 2024-01-21 06:19:36 · 131 阅读 · 0 评论 -
SQL Server加密与解密(附SQLServer加密还原插件)
加密是指通过使用密钥或密码对数据进行模糊处理的过程。加密解密最简单的过程,如下图所示。通常来说,加密可以分为两大类,对称(Symmetric)加密和非对称(Asymmetric)加密。对称加密是那些加密和解密使用同一个密钥的加密算法,在图1中就是加密密钥=解密密钥。对称加密通常来说会比较羸弱,因为使用数据时不仅仅需要传输数据本身,还是要通过某种方式传输密钥,这很有可能使得密钥在传输的过程中被窃取。非对称加密是那些加密和解密使用不同密钥的加密算法,在图1中就是加密密钥!=解密密钥。原创 2023-12-19 18:02:59 · 2290 阅读 · 0 评论 -
Python 操作数据库
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。你可以访问查看详细的支持数据库列表。不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。原创 2023-12-19 17:01:11 · 875 阅读 · 0 评论 -
MySQL字符集乱码
在使用MySQL数据库时,经常会遇到字符集乱码的问题。这种问题会导致数据库中存储的中文或特殊字符显示为乱码,给数据的查看和处理带来不便。当向MySQL数据库中插入或读取包含特殊字符的数据时,可能会出现字符集乱码的情况。原创 2023-12-19 15:45:08 · 446 阅读 · 0 评论 -
shell远程连接数据库与数据库循环操作脚本(附shell脚本)
数据库备份和恢复是管理数据库的重要工具,使用这些工具可以帮助用户保护数据库数据,确保数据库的可靠性和稳定性。Shell是一种强大的命令行解释器,它可以用来执行各种任务,shell可以轻松地连接到MySQL、PostgreSQL和Oracle数据库,并执行查询或更新操作。该命令将连接到指定的Oracle数据库,并执行指定的SQL查询,查询结果将经过awk命令处理,并输出到标准输出。该命令将连接到指定的MySQL数据库,并执行指定的SQL查询,查询结果将经过awk命令处理,并输出到标准输出。原创 2023-12-19 15:18:34 · 2006 阅读 · 0 评论 -
PHP应用程序连接Oracle数据库Demo(附Oracle客户端安装文件)
这里的代码如下图所示,基本流程是连接数据库,然后进行select查询并将查询结果反馈到表格table中。PHP版本的Architecture参数对应的数字x64还是x86,以及是TS(线程安全)还是NTS(非线程安全)。把安装的oracle的客户端文件夹(E:\instantclient_11_2)内的全部文件复制到apache内的bin文件夹下,重启apache。注意,如果没有出现OCI8或出错,可能需要下载扩展,下载的时候一定要看清PHP版本(Architecture参数以及TS或NTS)。原创 2023-11-01 07:47:27 · 469 阅读 · 0 评论 -
Docker安装MongoDB(附Docker虚拟机环境与MongoDB客户端连接工具)
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。原创 2023-10-31 18:29:28 · 249 阅读 · 0 评论 -
Docker安装SQL Server(附Docker虚拟机环境)
如果连接不成功,则可以将 -No 选项添加到 sqlcmd,以指定加密是可选的,而不是强制性的。创建 SQL Server 容器后,可以通过在容器中运行 echo $MSSQL_SA_PASSWORD 来发现指定的 MSSQL_SA_PASSWORD 环境变量。还需要在防火墙上打开相应的入站端口以允许连接。在下面的示例中,sql1 是在创建容器时由 --name 参数指定的名称。最后一步,更改 SA 密码,因为 MSSQL_SA_PASSWORD 在 ps -eax 输出中可见,并存储在同名的环境变量中。原创 2023-10-31 17:50:51 · 1133 阅读 · 0 评论 -
Docker安装MySQL(附Docker虚拟机环境)
允许任何ip地址(%表示允许任何ip地址)的电脑用admin帐户和密码(123456)来访问这个mysql server。找到bind-address = 127.0.0.1这一行,改为bind-address = 0.0.0.0即可。注意admin账户不一定要存在。用户名root,密码123456。原创 2023-10-31 17:30:18 · 230 阅读 · 0 评论 -
Docker安装MySQL8、SQL Server 2022、Oracle11g(附VMWare安装包及虚拟机环境)
修改oracle11g安装目录下的配置文件,通常是在NETWORK/ADMIN,涉及的文件主要是listener.ora 和tnsnames.ora。切换到oracle用户下su oracle,查看连接oracle,sqlplus /nolog conn /as sysdba。helowin代表远程连接的数据库,172.21.33.175代表数据库服务器地址,1521远程数据库端口号。要记住export ORACLE_SID=helowin,helowin是naivcat登录的重要选项。原创 2023-10-31 17:08:17 · 586 阅读 · 0 评论 -
PHP应用程序连接MSQL数据库Demo(附crud程序)
程序运行截图:php和代码已上传至附件。原创 2023-10-31 08:21:39 · 172 阅读 · 0 评论 -
Java应用程序连接SQL Server数据库Demo(附VMware安装包及虚拟机环境)
1. 登录模块功能使用Shiro权限管理框架,实现登录验证和登录信息的储存,根据不同的登录账户,分发权限角色,对不同页面url进行角色设置。2. 管理员模块功能管理员可对课程、学生信息、教师信息等进行增删改查,修改个人密码,修改学生和教师的密码。课程管理:当课程已经有学生选课成功时,将不能删除;学生管理:添加学生信息时,其信息也会添加到登录表中;教师管理:添加教师信息时,其信息也会添加到登录表中;账户密码重置:修改学生和教师的密码,不需要输入旧密码;修改密码:修改自己的密码,需要输入旧密码。原创 2023-10-31 08:14:51 · 168 阅读 · 0 评论 -
SQL Server安装与远程连接设置
打开安装管理工具,可在开始菜单打开(Options不会默认选中 安装媒体文件夹)或者在 安装媒体文件夹中打开(Options默认选中 安装媒体文件夹),首先确认 Options 选项是否已经选中 安装媒体文件夹,没有则需要先选中。至此,数据库实例就已经安装成功了, 如果需要安装新的实例,可以继续点击 “自定义” 按钮安装,或需要的时候再安装。在右侧的TCP/IP当中,右键启用或者双击打开设置面板将其修改为“是”,如果已经为“是”就不用修改了。第四步:右击实例名称(就是下图画红线的部分),选择属性。原创 2023-10-31 07:28:14 · 146 阅读 · 0 评论 -
Java应用程序连接Oracle数据库Demo(附VMware安装包及虚拟机环境)
该项目可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。虚拟机环境:JDBC配置信息:项目运行效果:进入Window->Preferences->Maven->Installations页面,设置已经安装好的Maven:进入Window->Preferences->Maven->User Settings页面,配置Maven仓库路径:通过Eclipse导入工程,步骤如下:点击左侧项目区域—>Import...原创 2023-10-31 05:18:02 · 219 阅读 · 0 评论 -
Oracle安装与远程连接配置(附Oracle安装包)
全局数据库名字默认就可以,口令自己设置(因为oracle本身有自己的密码原则,所以会有提示你的密码不符合规则,如果只是用于个人学习可以忽视不管,不必在意安全性),其他默认即可。不断回车之后进入数据库清除操作,几分钟后(其实很久),数据库就卸载完成了,这个过程可能失败,重启电脑或者关闭Oracle的服务重新卸载即可。注意这里的格式,@后面有//, port后面:换成了/,这种格式是Oracle 推荐的格式,因为对于集群来说,每个节点的SID 是不一样的,但是SERVICE_NAME 确可以包含所有节点。原创 2023-10-30 08:24:57 · 1667 阅读 · 0 评论 -
MySQL二进制与yum在线安装及安装后通用必要调优策略
MySQL是最流行的数据库,主要特点:MySQL发行版的选择:Percona Server由领先的MySQL咨询公司Percona发布。Percona Server是一款独立的数据库产品,其可以完全与MySQL兼容,可以在不更改代码的情况了下将存储引擎更换成XtraDB。是最接近官方MySQL Enterprise发行版的版本。Percona提供了高性能XtraDB引擎,还提供PXC高可用解决方案,并且附带了percona-toolkit等DBA管理工具箱。MariaDB由MySQL的创始人开发,Maria原创 2023-08-07 05:20:37 · 109 阅读 · 0 评论 -
MySQL高可用解决方案详解
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。原创 2023-08-06 18:24:22 · 287 阅读 · 0 评论 -
MySQL优化配置详解
当访问用户越来越多,写请求暴涨,对于上面的单 Master 节点肯定扛不住,那么该怎么办呢?多加几个 Master?不行,这样会带来更多的数据不一致的问题,且增加系统的复杂度。那该怎么办?就只能对库表进行拆分了。数据库中的数据量也不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大。另外,一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈,。原创 2023-08-06 18:15:38 · 251 阅读 · 0 评论