【与达梦同行】达梦驱动图谱

news2024/11/18 12:18:18

达梦驱动图谱

摘要

达梦提供了大部分主流开发语言的驱动接口,在我用使用过的国产数据库中对客户端驱动的支持应该算是非常不错的。本文主要介绍达梦的驱动开发,通过实际操作,从环境搭建到实践验证,介绍了达梦各种语言驱动的详细使用过程,由于篇幅原因,将演示代码提交到gitee仓库上供大家参考。

图谱

以下分别对C++、Java、Python、Golang、JavaScript五种开发语言对应的7种驱动进行演示。

图片.png

C++接口

unixODBC

环境搭建

  • 下载unixODBC
  • 安装 unixODBC
tar -zxvf unixODBC-2.3.9.tar.gz
cd unixODBC-2.3.9
./configure 
make -j4
sudo make install
  • 验证 unixODBC 安装
odbcinst -j 
unixODBC 2.3.9
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/frank/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
  • 配置odbcinst.ini
[DM8]
Description = dm odbc
Driver = /home/frank/dmdbms/bin/libdodbc.so
  • 配置odbc.ini
[dm]
Description = gch for DM8
Driver = DM8
Trace = yes
TraceFile = sql.log
SERVER= localhost
UID= SYSDBA
PWD = SYSDBA
TCP_PORT= 5236
  • 设置魂晶变量
export LD_LIBRARY_PATH=/dm8/dmdbms/bin:$LD_LIBRARY_PATH
source ~/.bash_profile

验证

isql -v dm
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select id_code;
+----------------------------------------------------------------------------+
| ID_CODE                                                                                                                         |
+----------------------------------------------------------------------------+
| 1-1-126-20.09.04-126608-ENT                                                                                                     |
+----------------------------------------------------------------------------+
SQLRowCount returns 1
1 rows fetched

C++代码

为了不占用更多篇幅,这部分这部分代码我提交到gitee上,供大家参考:

图片.png

OCI/DCI

环境搭建

${DM_HOME}/drivers/oci/ 达梦提供了OCI相关的库与头文件。

  • 环境变量配置:export LD_LIBRARY_PATH=${DM_HOME}/drivers/oci/:$LD_LIBRARY_PATH

C++代码

代码部分参考

cmake_minimum_required (VERSION 3.11)
project (otloci )

set(CMAKE_CXX_FLAGS "-Wall")
# set(CMAKE_CXX_FLAGS "-Wall -DOTL_ODBC_UNIX")
set(CMAKE_CXX_FLAGS_DEBUG "-g3")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
set(CMAKE_BUILD_TYPE Debug)

include_directories(./)
include_directories(/usr/local/include)
include_directories(/home/frank/dmdbms/drivers/oci/include)

add_executable(otloci otloci.cpp)
link_directories("/home/frank/dmdbms/drivers/oci/")
target_link_libraries(otloci dmoci)

Python接口

dmPython

dmPython是DM提供的依据Python DB API version 2.0中API使用规定而开发的数据库访问接口。dmPython实现这些API,使Python应用程序能够对DM数据库进行访问

环境搭建

dmPython要求DM Server版本大于7.0.0.9;Python版本大于2.6

  • 设置胡静变量: DM_HOME=C:\dmdbmsPATH=C:\dmdbms\drivers\dpi
  • 编译源码:进入${DM_HOME}/drivers/python/dmPython目录,执行python setup.py install
python setup.py install
running install
running bdist_egg
running egg_info
writing dmPython.egg-info\PKG-INFO
writing dependency_links to dmPython.egg-info\dependency_links.txt
writing top-level names to dmPython.egg-info\top_level.txt
reading manifest file 'dmPython.egg-info\SOURCES.txt'
writing manifest file 'dmPython.egg-info\SOURCES.txt'
installing library code to build\bdist.win-amd64\egg
running install_lib
running build_ext
creating build\bdist.win-amd64\egg
copying build\lib.win-amd64-3.9\dmPython.cp39-win_amd64.pyd -> build\bdist.win-amd64\egg
creating stub loader for dmPython.cp39-win_amd64.pyd
byte-compiling build\bdist.win-amd64\egg\dmPython.py to dmPython.cpython-39.pyc
creating build\bdist.win-amd64\egg\EGG-INFO
copying dmPython.egg-info\PKG-INFO -> build\bdist.win-amd64\egg\EGG-INFO
copying dmPython.egg-info\SOURCES.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying dmPython.egg-info\dependency_links.txt -> build\bdist.win-amd64\egg\EGG-INFO
copying dmPython.egg-info\top_level.txt -> build\bdist.win-amd64\egg\EGG-INFO
writing build\bdist.win-amd64\egg\EGG-INFO\native_libs.txt
zip_safe flag not set; analyzing archive contents...
__pycache__.dmPython.cpython-39: module references __file__
creating 'dist\dmPython-2.3-py3.9-win-amd64.egg' and adding 'build\bdist.win-amd64\egg' to it
removing 'build\bdist.win-amd64\egg' (and everything under it)
Processing dmPython-2.3-py3.9-win-amd64.egg
removing 'c:\programdata\miniconda3\lib\site-packages\dmPython-2.3-py3.9-win-amd64.egg' (and everything under it)
creating c:\programdata\miniconda3\lib\site-packages\dmPython-2.3-py3.9-win-amd64.egg
Extracting dmPython-2.3-py3.9-win-amd64.egg to c:\programdata\miniconda3\lib\site-packages
dmPython 2.3 is already the active version in easy-install.pth

Installed c:\programdata\miniconda3\lib\site-packages\dmpython-2.3-py3.9-win-amd64.egg
Processing dependencies for dmPython==2.3
Finished processing dependencies for dmPython==2.3

验证

(base) C:\dmdbms\drivers\python\dmPython>python
Python 3.9.5 (default, May 18 2021, 14:42:02) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import dmPython
>>> conn = dmPython.connect(user='SYSDBA', password='SYSDBA', server='localhost', port=5236, autoCommit=True)
>>> cursor = conn.cursor()
>>> cursor.execute("select * from person.person")
<builtins.DmdbCursor on <dmPython.Connection to SYSDBA@localhost:5236>>
>>> cursor.description
[('PERSONID', <class 'dmPython.NUMBER'>, 11, 10, 10, 0, 0), ('SEX', <class 'dmPython.FIXED_STRING'>, 1, 1, 1, 0, 0), ('NAME', <class 'dmPython.STRING'>, 50, 50, 50, 0, 0), ('EMAIL', <class 'dmPython.STRING'>, 50, 50, 50, 0, 1), ('PHONE', <class 'dmPython.STRING'>, 25, 25, 25, 0, 1)]
>>>

Q&A

Q1:编译时目录没有权限(windows下)

A1:可以使用管理员方式打开或更换Python安装目录

Q2:import dmPython时找不到DLL

A2:可以通过上文设置环境变量或者将dpi目录下的*.dll放到运行目录

JayDeBeApi

JayDeBeApi是一个python模块,可以使用JayDeBeApi通过java JDBC驱动链接数据库。

环境搭建

  • pip install JayDeBeApi

Cloning into 'jaydebeapi'...
remote: Enumerating objects: 1710, done.
remote: Counting objects: 100% (123/123), done.
remote: Compressing objects: 100% (70/70), done.
remote: Total 1710 (delta 48), reused 90 (delta 27), pack-reused 1587
Receiving objects: 100% (1710/1710), 427.56 KiB | 452.00 KiB/s, done.
Resolving deltas: 100% (919/919), done.
[root@localhost jaydebeapi]# python3 setup.py install
running install
running bdist_egg
running egg_info
creating JayDeBeApi.egg-info
writing JayDeBeApi.egg-info/PKG-INFO
......

验证

root@LAPTOP-4OF1323N:~# python3
Python 3.10.6 (main, Nov  2 2022, 18:53:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import jaydebeapi
>>> url='jdbc:dm://localhost:5236'
>>> user='SYSDBA'
>>> password='SYSDBA'
>>> driver='dm.jdbc.driver.DmDriver'
>>> jarfile='/home/frank/test/DmJdbcDriver18.jar'
>>> sqlstr='select id_code'
>>> conn=jaydebeapi.connect(driver,url,[user,password],jarfile)
>>> curs = conn.cursor()
>>> curs.execute(sqlstr)
>>> result = curs.fetchall()

Golang接口

Go 语言标准库 database/sql提供了一系列数据库操作的标准接口,DM 数据库基于 GO1.13 版本通过实现 database/sql 包的接口,向开发人员提供 DM 数据库操作的 Go 语言接口。

环境搭建

达梦安装后在安装目录的drivers下有go目录,该目录下面的dm-go-driver.zip。

  • 新建go工程
[root@vmpc ~]# mkdir go_dm8
[root@vmpc ~]# cd go_dm8/
[root@vmpc go_dm8]# mkdir src
[root@vmpc go_dm8]# cd src/
[root@vmpc src]# mkdir app
[root@vmpc src]# cd app
[root@vmpc dm8]# unzip dm-go-driver.zip
[root@vmpc dm8]# mv dm ../go_dm8/src/
  • 设置环境变量
[root@vmpc go_dm8]# export GOPATH=/root/go_dm8
[root@vmpc go_dm8]# export GO111MODULE="off"
  • 测试代码
/*该例程实现插入数据,修改数据,删除数据,数据查询等基本操作。*/
package main

// 引入相关包
import (
        "database/sql"
        "dm"
        "fmt"
        "io/ioutil"
        "time"
)

var db *sql.DB
var err error

func main() {
        driverName := "dm"
        dataSourceName := "dm://SYSDBA:SYSDBA@localhost:5236"

        if db, err = connect(driverName, dataSourceName); err != nil {
                fmt.Println(err)
                return
        }
        if err = insertTable(); err != nil {
                fmt.Println(err)
                return
        }
        if err = updateTable(); err != nil {
                fmt.Println(err)
                return
        }
        if err = queryTable(); err != nil {
                fmt.Println(err)
                return
        }
        if err = deleteTable(); err != nil {
                fmt.Println(err)
                return
        }
        if err = disconnect(); err != nil {
                fmt.Println(err)
                return
        }
}

/* 创建数据库连接 */
func connect(driverName string, dataSourceName string) (*sql.DB, error) {
        var db *sql.DB
        var err error
        if db, err = sql.Open(driverName, dataSourceName); err != nil {
                return nil, err
        }
        if err = db.Ping(); err != nil {
                return nil, err
        }
        fmt.Printf("connect to \"%s\" succeed.\n", dataSourceName)
        return db, nil
}

/* 往产品信息表插入数据 */
func insertTable() error {
        var inFileName = "sanguo.txt"
        var sql = `INSERT INTO production.product(name,author,publisher,publishtime,
                                product_subcategoryid,productno,satetystocklevel,originalprice,nowprice,discount,
                                description,photo,type,papertotal,wordtotal,sellstarttime,sellendtime)
                VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17);`
        data, err := ioutil.ReadFile(inFileName)
        if err != nil {
                return err
        }
        t1, _ := time.Parse("2006-Jan-02", "2005-Apr-01")
        t2, _ := time.Parse("2006-Jan-02", "2006-Mar-20")
        t3, _ := time.Parse("2006-Jan-02", "1900-Jan-01")
        _, err = db.Exec(sql, "三国演义", "罗贯中", "中华书局", t1, 4, "9787101046121", 10, 19.0000, 15.2000,
                8.0,
                "《三国演义》是中国第一部长篇章回体小说,中国小说由短篇发展至长篇的原因与说书有关。",
                data, "25", 943, 93000, t2, t3)
        if err != nil {
                return err
        }
        fmt.Println("insertTable succeed")
        return nil
}

/* 修改产品信息表数据 */
func updateTable() error {
        var sql = "UPDATE production.product SET name = :name WHERE productid = 11;"
        if _, err := db.Exec(sql, "三国演义(上)"); err != nil {
                return err
        }
        fmt.Println("updateTable succeed")
        return nil
}

/* 查询产品信息表 */
func queryTable() error {
        var productid int
        var name string
        var author string
        var description dm.DmClob
        var photo dm.DmBlob
        var sql = "SELECT productid,name,author,description,photo FROM production.product WHERE productid=11"
        rows, err := db.Query(sql)
        if err != nil {
                return err
        }
        defer rows.Close()

        fmt.Println("queryTable results:")
        for rows.Next() {
                if err = rows.Scan(&productid, &name, &author, &description, &photo); err != nil {
                        return err
                }
                blobLen, _ := photo.GetLength()
                fmt.Printf("%v %v %v %v %v\n", productid, name, author, description, blobLen)
        }
        return nil
}

/* 删除产品信息表数据 */
func deleteTable() error {
        var sql = "DELETE FROM production.product WHERE productid = 11;"
        if _, err := db.Exec(sql); err != nil {
                return err
        }
        fmt.Println("deleteTable succeed")
        return nil
}

/* 关闭数据库连接 */
func disconnect() error {
        if err := db.Close(); err != nil {
                fmt.Printf("db close failed: %s.\n", err)
                return err
        }
        fmt.Println("disconnect succeed")
        return nil
}

编译项目

  • 编译
[root@vmpc x]# cd $GOPATH
[root@vmpc go_dm8]# go get app
[root@vmpc go_dm8]# go install app
  • 目录结构
[root@vmpc go_dm8]# tree -L 2
.
├── bin
│   ├── app
│   └── sanguo.txt
└── src
    ├── app
    ├── dm
    ├── github.com
    └── golang.org

6 directories, 2 files

验证

工程源码在gitee上,供参考:

图片.png

JDBC接口

环境搭建

  • 方法一:

在drivers/jdbc目录找到对应的驱动jar。

  1. DmJdbcDriver16 对应 Jdk1.6 及以上环境
  2. DmJdbcDriver17 对应 Jdk1.7 及以上环境
  3. DmJdbcDriver18 对应 Jdk1.8 及以上环境
  • 方法二:

maven仓库下载

<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmJdbcDriver18</artifactId>
    <version>8.1.1.193</version>
</dependency>

关键代码

    // 定义 DM JDBC 驱动串
    String jdbcString = "dm.jdbc.driver.DmDriver";
    // 定义 DM URL 连接串
    String urlString = "jdbc:dm://localhost:5236";
    // 定义连接用户名
    String userName = "SYSDBA";
    // 定义连接用户口令
    String password = "SYSDBA";
    // 加载 JDBC 驱动程序
    Class.forName(jdbcString);
    // 连接 DM 数据库
    conn = DriverManager.getConnection(urlString, userName, password);
  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>dm_jdbc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.dameng</groupId>
            <artifactId>DmJdbcDriver18</artifactId>
            <version>8.1.1.193</version>
        </dependency>
    </dependencies>
</project>

验证

demo在gitee上

图片.png

Node.js

环境搭建

  • 安装npm
sudo apt install npm
  • 安装dmdb包
npm install dmdb 

关键代码

var db = require('dmdb');

        return db.createPool({
            connectString: "dm://SYSDBA:SYSDBA@localhost:5236?autoCommit=false",
            poolMax: 10,
            poolMin: 1
        });

    try {
        var sql = "SELECT productid,name,author,publisher,photo FROM production.product"
        var result = await conn.execute(sql);
        var lob = result.rows[result.rows.length - 1][4];
        var buffer = await readLob(lob);
        // Lob 对象使用完需关闭 
        await lob.close();
        console.log(buffer);
        return result;
    } catch (err) {
        throw new Error("queryTable error: " + err.message);
    }
  • package.json
{
  "dependencies": {
    "dmdb": "^1.0.14280"
  }
}

验证

demo在gitee上

图片.png

总结

除了上面介绍的驱动达梦还挺了php、doNet、dpi等驱动接口,还有logmnr、fldr驱动。其中dpi类似ODBC,php在企业应用里面使用日趋减少,而doNet主要用于桌面应用上(另外一个原因就是我没用过),所以这3种没有介绍。logmnr、fldr用法比较特殊,后续单独对这两个驱动进行介绍。

本文为达梦在线服务平台【与达梦同行】征文投稿文章,活动详情:
“【与达梦同行】 🏆🏆🏆 第一届达梦数据库技术征文大赛来啦!🚀🚀🚀”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下: https://support.industry.siemens.com/cs/document/109756217/simatic-s7-1500(t)-lsimahydto-for-hydraulic-applications-and-hydraulic-presses?dti=0&dl=en&lc=zh-CNhttps://support.indu…

圣诞树-python绘制雪夜圣诞树并封装为小程序

绘制雪夜圣诞树并封装为小程序 使用turtle绘制一颗雪夜圣诞树&#xff0c;然后封装成exe小程序送给你的朋友吧&#xff01; PS&#xff1a;只能在windows运行。 转载注明本文链接和作者 先看效果图&#xff1a; 绘制雪夜圣诞树 由于代码有三百多行&#xff0c;我放在下面的两…

一文彻底搞懂cookie、session、token

1.Cookie Cookie是客户端保存用户信息的一种机制&#xff0c;用来记录用户的一些信息&#xff0c;实际上Cookie是服务器在本地机器上存储的一小段文本&#xff0c;并随着每次请求发送到服务器。 Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态。 Cookie会…

28.项目搭建网关

项目搭建网关 一、项目架构 二、创建模块&#xff0c;引入依赖&#xff0c;创建启动类&#xff0c;添加application.yml配置文件 2.1依赖 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-…

【AI with ML】第 9 章 :了解序列和时间序列数据

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【linux】linux环境变量初始化与对应文件的生效顺序

1.认识环境变量&#xff08;PATH) 环境变量&#xff08;PATH&#xff09;是一个列表&#xff0c;里面是有序的一些程序的地址&#xff08;一般是xxx/bin&#xff09;&#xff0c;添加环境变量后&#xff0c;系统在任何目录输入命令&#xff0c;都可以识别命令并执行命令对应程…

一个工程师的自我修养!

Datawhale干货 Tw93&#xff0c;前端工程师&#xff0c;Datawhale邀约作者对计算机科学的掌握程度&#xff0c;决定了一个计算机行业从业者能走多远。吴军博士在《浪潮之巅&#xff08;第四版&#xff09;》对工程师做了五个级别的划分&#xff1a;一级&#xff1a;能够开创一个…

询问ChatGPT来了解什么是边缘计算,有哪些特点,有哪些关键技术,和云计算的关系是什么?

什么是云计算 云计算是一种计算架构&#xff0c;它使用互联网作为基础设施&#xff0c;允许用户通过网络访问共享的计算资源&#xff0c;而不需要拥有专门的本地计算机硬件和软件。云计算提供了计算能力、存储空间、应用程序和服务等&#xff0c;并使用计费模型收取使用费用。…

springboot基于ssm框架实现的家具商城管理系统

一、项目简介 本项目是一套基于springboot框架实现的家具商城管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#…

为什么在SPI通信中提供不同的模式?

SPI传输模式 因为SPI是全双工也就是说&#xff08;MOSI和MISO&#xff09;上同时发送和接收数据 时钟极性&#xff08;CPOL&#xff09; 时钟相位&#xff08;CPHA&#xff09;是定义SPI总线使用的时钟格式得主要参数&#xff0c;根据SPOL参数&#xff0c;SPI时钟可以是反向或…

寻找两个正序数组的中位数K个一组翻转链表

文章目录1. [寻找两个正序数组的中位数](https://leetcode.cn/problems/median-of-two-sorted-arrays/)2. [K个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/)1. 寻找两个正序数组的中位数 首先&#xff0c; 中位数的作用就是将正序数组的两端进行分…

[内网渗透]—权限维持

Skeleton Key(万能密码) 原理 当拿到域控权限后,使用mimikatz可以注入Skeleon Key,将 Skeleton Key 注入域控制器的 lsass.exe 进程,这样会在域内的所有账号中添加一个 Skeleton Key,而这个key是自己设定的所以可以随时共享访问。 PS:由于注入到lsass.exe进程中,所以每…

JS图解 | Java程序员的JS | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘JS 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出并回答了…

跟腾讯架构大师学网络框架与后台架构

目录 跟腾讯架构大师学网络框架与后台架构 单机服务 1、单机服务&#xff1a;基本概念 2、单机服务&#xff1a;同步阻塞​编辑 3、单机服务&#xff1a;异步非阻塞框架 4、单机服务&#xff1a;典型框架&#xff1a; 5、单机服务&#xff1a;协程框架 6、单机服务&…

Spring之自定义Bean何时被扫描注册?

1. 前言 在AnnotationConfigApplicationContext的构造函数里&#xff0c;Spring会创建AnnotatedBeanDefinitionReader对象&#xff0c;它的基本作用是将基于注解的BeanClass封装成BeanDefinition&#xff0c;并注册到BeanFactory中。同时AnnotatedBeanDefinitionReader的构造函…

计算机毕业设计springboot+vue景区疫情预警系统

项目介绍 本景区疫情预警系统是针对目前景区疫情预警的实际需求,从实际工作出发,对过去的景区疫情预警系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结…

垃圾回收器

文章目录1. 垃圾回收器分类2. 不同垃圾回收器概述3. Serial与Serial Old垃圾回收器&#xff1a;串行回收4. ParNew垃圾回收器&#xff1a;并行回收5. Parallel与Parallel Old垃圾回收器&#xff1a;吞吐量优先6. CMS回收器&#xff1a;低延迟7. G1回收器&#xff1a;区域分代式…

web前端-javascript-初识Array数组(说明,初步创建,添加元素和读取元素,获取和修改数组的 length 长度,最后一个位置添加元素)

初识 Array 数组 1. 说明 数组也是一个对象它和普通的对象功能类似&#xff0c;也是用来存储一些值的不同的是普通对象是使用字符串作为属性名的 而数组是使用数字来作为索引来操作元素 索引&#xff1a; 从 0 开始的整数就是索引 数组的存储性能比普通对象要好&#xff0c;在…

【记录】Ubuntu20.04安装CUDA和cuDNN

本文记录下如何在Ubuntu20.04系统中安装CUDA和cuDNN。 这里简要介绍下CUDA和cuDNN分别是什么。CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力&#xff0c;可大幅提升计算性能&#xff1b;cuDNN(深度神经网络库)是GPU加速的用于深度…

《西西弗神话》笔记——不期待人生可以过得很顺利,但我希望碰到人生难关的时候,自己可以是它的对手

目录 一、作者生平 二、经典摘录 1、悲剧从本质上讲是对苦难的反抗 2、自杀实质上是一种逃避&#xff0c;它是反抗的对立面 3、不是否认生活本身 4、书的宗旨就是要讨论荒谬与自杀的关系 5、真正严肃的哲学问题只有一个&#xff1a;自杀 6、了解人是否能够义无反顾地生…