2024-08-29



import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import com.ververica.cdc.connectors.oracle.OracleSource;
import com.ververica.cdc.debezium.StringDebeziumDeserializationSchema;
 
public class OracleCdcExample {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
 
        Properties properties = new Properties();
        properties.setProperty("connector", "oracle-cdc");
        properties.setProperty("hostname", "your-oracle-host");
        properties.setProperty("port", "1521");
        properties.setProperty("username", "your-username");
        properties.setProperty("password", "your-password");
        properties.setProperty("database-name", "your-database-name");
        properties.setProperty("schema-name", "your-schema-name");
        properties.setProperty("table-name", "your-table-name");
 
        // 创建 Oracle CDC source
        OracleSource<String> source = new OracleSource<>(
            tableEnv,
            properties,
            new StringDebeziumDeserializationSchema(),
            (rowData, rowKind) -> {
                // 处理rowData,这里可以是解析后的数据或者直接处理rowData
            }
        );
 
        // 将source加入到flink作业中
        env.addSource(source).print();
 
        env.execute("Oracle CDC Job");
    }
}

这段代码展示了如何使用Flink CDC连接器来从Oracle数据库中实时读取变更数据并打印输出。需要注意的是,这里的代码仅展示了核心逻辑,并且需要替换相应的数据库连接信息和处理逻辑以适应实际的应用场景。

2024-08-29



from django.shortcuts import render
from .models import Event
from django.utils.timezone import now
 
def events_list(request):
    # 获取当前日期时间
    today = now()
    # 查询未来的事件,排除已经结束的事件
    upcoming_events = Event.objects.filter(end__gte=today).order_by('start')
    # 查询今天结束的事件
    today_events = Event.objects.filter(start__lte=today, end__gte=today)
    # 查询已经结束的事件
    past_events = Event.objects.filter(end__lt=today).order_by('-end')
 
    return render(request, 'events_list.html', {
        'upcoming_events': upcoming_events,
        'today_events': today_events,
        'past_events': past_events,
    })

在模板中:




<!-- 显示未来事件 -->
<h2>Upcoming Events</h2>
<ul>
{% for event in upcoming_events %}
    <li>{{ event.name }} - {{ event.start|date:"SHORT_DATE_FORMAT" }}</li>
{% empty %}
    <li>No upcoming events.</li>
{% endfor %}
</ul>
 
<!-- 显示今天的事件 -->
<h2>Events Today</h2>
<ul>
{% for event in today_events %}
    <li>{{ event.name }} - {{ event.start|time:"SHORT_TIME_FORMAT" }} - {{ event.end|time:"SHORT_TIME_FORMAT" }}</li>
{% empty %}
    <li>No events today.</li>
{% endfor %}
</ul>
 
<!-- 显示已经结束的事件 -->
<h2>Past Events</h2>
<ul>
{% for event in past_events %}
    <li>{{ event.name }} - {{ event.end|date:"SHORT_DATE_FORMAT" }}</li>
{% empty %}
    <li>No past events.</li>
{% endfor %}
</ul>

这个例子中,我们首先从Django中导入了必要的模块,并定义了一个视图函数events_list,它根据日期计算出未来的事件、今天的事件和过去的事件,并将这些事件传递给模板进行渲染。在模板中,我们使用了Django模板标签来格式化日期和时间,并通过逻辑标签{% empty %}来处理没有事件的情况。

2024-08-29

在C++中操作SQLite数据库获取查询结果集,可以使用以下几种方法:

  1. 使用sqlite3_get_table函数

    这个函数用于执行查询,并将结果存储在一个连续的内存块中。每一列的值都是相邻的,然后是下一行的值。




int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
  1. 使用sqlite3_exec函数

    这个函数可以执行任何SQL命令,包括查询,但是它不直接返回结果集。为了获取结果,你需要提供一个回调函数,该函数会为每行结果被调用。




int sqlite3_exec(
  sqlite3 *db,          /* An open database */
  const char *sql,     /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,              /* 1st argument to callback */
  char **errmsg         /* Error message returned here */
);
  1. 使用sqlite3_prepare_v2sqlite3_step

    这些函数用于逐行执行SQL语句。sqlite3_prepare_v2准备一个SQL语句,sqlite3_step执行这个语句并让我们能够逐行访问结果集。




int sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);
 
int sqlite3_step(sqlite3_stmt*);
  1. 使用SQLite C++ Wrapper,例如SQLiteC++

    这是一个C++封装的SQLite接口,使得数据库操作更加面向对象。




#include <sqlite_modern_cpp.h>
 
// ...
 
sqlite::database db("example.db");
auto table = db("SELECT * FROM some_table");
 
for (auto& row : table) {
    std::cout << row.get<int>(0) << ": " << row.get<std::string>(1) << std::endl;
}

以上方法可以根据具体需求选择使用,例如对性能有高要求时可以选择sqlite3_get_table,对于简单查询可以使用sqlite3_exec,而对于复杂的操作或者需要重用SQL语句,则推荐使用sqlite3_prepare_v2sqlite3_step

2024-08-29

在Spring Boot项目中启用SSL双向认证,并实现互相访问通信,你需要进行以下步骤:

  1. 生成服务器的私钥和证书签名请求(CSR)。
  2. 使用CA签名你的服务器证书。
  3. 准备服务器的证书和私钥。
  4. 配置Spring Boot以启用SSL和双向认证。
  5. 配置客户端以信任服务器的证书。

以下是配置Spring Boot以启用SSL双向认证的示例代码:

application.properties:




server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=yourKeystorePassword
server.ssl.key-alias=yourKeyAlias
server.ssl.trust-store=classpath:truststore.jks
server.ssl.trust-store-password=yourTruststorePassword
server.ssl.client-auth=need

Java配置类:




@Configuration
public class SslConfig {
 
    @Bean
    public ServletWebServerFactory servletContainer() throws Exception {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(createSslConnector());
        return tomcat;
    }
 
    private Connector createSslConnector() throws Exception {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setPort(8080);
        protocol.setSSLEnabled(true);
        protocol.setKeystoreFile("path/to/your/keystore.jks");
        protocol.setKeystorePass("yourKeystorePassword");
        protocol.setKeyPass("yourKeyPassword");
        protocol.setTruststoreFile("path/to/your/truststore.jks");
        protocol.setTruststorePass("yourTruststorePassword");
        protocol.setClientAuth("true");
        return connector;
    }
}

确保你已经准备好了服务器的keystore和truststore文件,并且在代码中指定了正确的路径和密码。这样配置后,你的Spring Boot应用将启用SSL,并要求客户端提供证书以进行双向认证。客户端需要具有正确的证书,并且其私钥也必须被客户端所持有。

对于客户端访问服务端时,你还需要配置客户端的SSL上下文,以信任服务端的证书。这通常涉及到导入服务端的公钥证书到客户端的truststore中。

请注意,这只是一个基本示例,根据你的具体环境和安全需求,你可能需要调整配置细节,例如SSL协议、加密算法等。

2024-08-29

在Qt中连接加密的SQLite3数据库,你需要使用SQLCipher,它是SQLite的一个加密版本。首先确保你的系统中已经安装了SQLCipher。

以下是一个简单的例子,展示如何在Qt中打开一个加密的SQLite3数据库:




#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
 
int main(int argc, char *argv[])
{
    // 初始化Qt应用程序
    QApplication app(argc, argv);
 
    // 设置数据库类型
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
 
    // 设置数据库文件名(这里假设数据库文件名为"encrypted.db")
    db.setDatabaseName("encrypted.db");
 
    // 打开数据库连接
    if (!db.open()) {
        qDebug() << "数据库打开失败:" << db.lastError().text();
        return -1;
    }
 
    // 设置数据库加密密钥
    db.exec("PRAGMA key = 'your-encryption-key';");
 
    // 这里可以进行数据库操作
 
    // 关闭数据库连接
    db.close();
 
    return 0;
}

在上面的代码中,你需要将your-encryption-key替换为你的实际加密密钥。当你尝试打开数据库时,SQLCipher会要求你提供密钥,只有正确的密钥才能够访问数据库。

请注意,这个例子假设你已经有一个加密的SQLite数据库文件。如果你还没有加密的数据库,你需要先用SQLCipher创建一个加密的数据库,例如使用SQLCipher的命令行工具来创建一个加密的数据库,并设置密钥。

2024-08-29

在MySQL中,如果你想选择表中除了特定列以外的所有列,你可以使用SHOW COLUMNS语句配合NOT IN条件来实现。但是,由于SHOW COLUMNS的输出不是一个表格,我们需要用到其他方式来获取列的信息。

以下是一个实例代码,演示如何选择除了特定列以外的所有列:




-- 假设我们有一个名为my_table的表,我们想要排除名为excluded_column的列
 
-- 首先,我们获取除了excluded_column以外的所有列名
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'my_table'
  AND COLUMN_NAME != 'excluded_column';
 
-- 然后,我们可以使用上面查询的结果来构建一个包含所有列的SELECT语句
SELECT GROUP_CONCAT(DISTINCT
  CONCAT('`', COLUMN_NAME, '`')
  ORDER BY COLUMN_NAME SEPARATOR ', ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'my_table'
  AND COLUMN_NAME != 'excluded_column'
INTO @columns;
 
-- 最后,我们可以使用@columns变量来构建并执行实际的SELECT语句
SET @query = CONCAT('SELECT ', @columns, ' FROM `my_table`');
 
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

请注意,你需要替换your_database_namemy_tableexcluded_column为你实际的数据库名、表名和列名。

这个例子使用了GROUP_CONCAT函数来生成一个包含所有列名的字符串,然后使用PREPARE STATEMENT来执行这个字符串作为SQL查询。这样做可以动态地构建并执行SQL语句,从而实现需求。

2024-08-29



# 拉取 MongoDB 4.x 镜像
docker pull mongo:4.4
 
# 启动 MongoDB 主节点容器
docker run --name mongo-master -d mongo:4.4 --replSet "rs0"
 
# 获取主节点容器的内网 IP
MASTER_IP=$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' mongo-master)
 
# 启动 MongoDB 从节点容器并配置复制集
docker run --name mongo-slave -d mongo:4.4 --replSet "rs0" --master --slave --source $MASTER_IP
 
# 进入从节点容器执行 MongoDB Shell 脚本
docker exec -it mongo-slave mongo <<EOF
rs.initiate({
    _id: "rs0",
    members: [
        { _id: 0, host: "$MASTER_IP:27017" },
        { _id: 1, host: "localhost:27017" }
    ]
})
EOF

这段代码展示了如何使用Docker快速搭建一个MongoDB 4.x的一主一从复制集。首先,我们从Docker Hub拉取MongoDB 4.4的官方镜像。然后,我们启动主节点的容器,并设置复制集名称为"rs0"。接下来,我们获取主节点容器的内网IP地址,并用这个IP地址启动从节点容器,将其也加入到同一个复制集中。最后,我们通过在从节点容器中执行MongoDB Shell脚本来初始化复制集配置。

2024-08-29

在Oracle Data Pump中,可以使用remap_tablespace参数来在导入时映射表空间名称。如果需要映射Schema,可以使用remap_schema参数。

以下是一个使用Data Pump导出(expdp)和导入(impdp)进行表空间和Schema映射的例子:

导出时,指定需要映射的表空间和目标表空间:




expdp system/password@db11g directory=datapump_dir dumpfile=expdp.dmp logfile=expdp.log remap_tablespace=old_tablespace:new_tablespace

导入时,指定需要映射的Schema和新的Schema名称:




impdp system/password@db11g directory=datapump_dir dumpfile=expdp.dmp logfile=impdp.log remap_schema=old_schema:new_schema

在这个例子中,old_tablespace是源数据库中的表空间名称,new_tablespace是目标数据库中你希望数据导入到的表空间。同样地,old_schemanew_schema分别是源Schema和目标Schema的名称。

请确保在执行这些操作之前,目标数据库中已经创建好了相应的表空间和Schema,并且用户有权限对其进行操作。

2024-08-29

创建第一个Spring Boot项目通常涉及以下步骤:

  1. 访问start.spring.io
  2. 选择您喜欢的工具,如Maven或Gradle,以及Spring Boot的版本。
  3. 输入项目的基本信息,如Group、Artifact和Package名称。
  4. 点击“Generate Project”下载项目的ZIP文件。
  5. 解压ZIP文件到您选择的目录。
  6. 使用您的IDE(如IntelliJ IDEA、Eclipse或Visual Studio Code)打开项目。
  7. 运行项目,例如,如果您使用的是Maven,可以在命令行中运行mvn spring-boot:run,或者在IDE中运行应用的主类。

以下是使用Maven创建Spring Boot项目的示例:




mvn archetype:generate \
    -DgroupId=com.example \
    -DartifactId=myproject \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DinteractiveMode=false

接下来,在myproject目录中创建一个名为SpringBootApplication的类,并使用@SpringBootApplication注解:




package com.example;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class SpringBootApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class, args);
    }
 
}

最后,在pom.xml中添加Spring Boot Maven依赖:




<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.x.x.RELEASE</version>
</parent>
 
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
 
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

完成这些步骤后,您就创建了一个基本的Spring Boot项目,可以通过运行主类的main方法来启动服务器。

2024-08-29



import redis
import time
import uuid
 
class RedLock:
    def __init__(self, connections):
        # 连接列表,按顺序排列
        self.connections = connections
        self.quorum = len(connections) / 2 + 1
 
    def lock(self, resource, ttl):
        # 生成唯一的锁标识符
        token = str(uuid.uuid4())
        # 获取当前时间戳(毫秒)
        now = int(time.time() * 1000)
        # 锁到期时间戳
        valid_until = now + ttl
 
        locks = {}
        for conn in self.connections:
            # 尝试在每个 Redis 实例上获取锁
            identifier = conn.set(resource, token, nx=True, px=ttl)
            if identifier:
                locks[conn] = (identifier, valid_until)
 
        # 如果已经获得足够数量的锁,则返回 RedLock 实例
        if len(locks) >= self.quorum:
            return RedLockManager(locks, resource, token, valid_until)
        else:
            # 如果未能获得足够的锁,则释放已获得的锁并返回 None
            self.unlock(locks)
            return None
 
    def unlock(self, locks):
        # 释放所有已获得的锁
        for conn, (identifier, valid_until) in locks.items():
            with conn.pipeline() as pipe:
                while True:
                    try:
                        pipe.watch(resource)
                        if pipe.get(resource) == identifier:
                            pipe.multi()
                            pipe.delete(resource)
                            pipe.execute()
                            break
                        pipe.unwatch()
                        break
                    except redis.exceptions.WatchError:
                        pass
 
    class RedLockManager:
        def __init__(self, locks, resource, token, valid_until):
            self.locks = locks
            self.resource = resource
            self.token = token
            self.valid_until = valid_until
 
        def is_valid(self):
            # 检查锁是否仍然有效
            return int(time.time() * 1000) < self.valid_until
 
        def break_lock(self):
            # 强制释放锁,不管它是否过期
            self.unlock(self.locks)
 
        def unlock(self, locks):
            # 释放所有已获得的锁
            RedLock.unlock(locks)
 
# 使用示例
# 假设有三个 Redis 实例的连接对象
redis_connections = [redis_client1, redis_client2, redis_client3]
# 初始化 RedLock
red_lock = RedLock(redis_connections)
 
# 尝试获取锁
lock = red_lock.lock("my_resource", 5000)
if lock:
    try:
        # 执行需要互斥访问的代码
        pass
    finally:
        # 释放锁
        lock.unlock(lock.