每月 Shaarli

一月内的所有链接,汇聚在一个页面上。

October, 2024

EmojiDB

Find emojis!

极品下载论坛 - Down512.COM

欢迎来到极品下载论坛,这里不仅专注于高清无损音乐MV的搜集下载,更是教育教学的最佳学习分享之地。

全国计算机技术与软件专业技术资格(水平)考试
豆包 MarsCode - 工作台

基于豆包大模型,提供智能 AI IDE 和 AI 编程助手,带给你全新的编码体验。AI IDE 提供开箱即用的开发环境,AI 编程助手提供代码生成、代码解释、单测生成和问题修复等功能,支持上百种编程语言和主流开发环境。

豆包 MarsCode——智能编码,一触即发

基于豆包大模型,提供智能 AI IDE 和 AI 编程助手,带给你全新的编码体验。AI IDE 提供开箱即用的开发环境,AI 编程助手提供代码生成、代码解释、单测生成和问题修复等功能,支持上百种编程语言和主流开发环境。

Crate tauri
Note: Tauri窗口置顶和窗口快捷键绑定

// ./src/lib.rs

// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! You've been greeted from Rust!", name)
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .setup(|app| {
            {
                use tauri::Manager;
                // 获取窗口对象
                let window = app.get_webview_window("main").unwrap();
                // 设置窗口始终在最上层
                window.set_always_on_top(true).unwrap();
            }
            {
                use tauri::{AppHandle, Manager};
                #[cfg(desktop)]
                use tauri_plugin_global_shortcut::{
                    Code, GlobalShortcutExt, Modifiers, Shortcut, ShortcutState,
                }; // 引入窗口管理模块

                let alt_x_shortcut = Shortcut::new(Some(Modifiers::ALT), Code::KeyX);

                app.handle().plugin(
                    tauri_plugin_global_shortcut::Builder::new()
                        .with_handler(move |app_handle: &AppHandle, shortcut, event| {
                            if shortcut == &alt_x_shortcut {
                                let window = app_handle.get_webview_window("main").unwrap(); // 获取窗口对象
                                match event.state() {
                                    ShortcutState::Pressed => {
                                        if window.is_minimized().unwrap() {
                                            window.unminimize().unwrap(); // 还原窗口
                                            println!("窗口已还原!");
                                        } else {
                                            window.minimize().unwrap(); // 最小化窗口
                                            println!("窗口已最小化!");
                                        }
                                    }
                                    ShortcutState::Released => {
                                        // 这里可以添加你想要在松开时执行的逻辑
                                    }
                                }
                            }
                        })
                        .build(),
                )?;

                app.global_shortcut().register(alt_x_shortcut)?;
            }

            Ok(())
        })
        .plugin(tauri_plugin_shell::init())
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
Tauri 2.0 | Tauri

The cross-platform app building toolkit

Note: PHP使用Redis
<?php
// 检查 Redis 扩展是否已加载
if (!extension_loaded('redis')) {
    die("Redis extension is not loaded.");
}

try {
    // 创建 Redis 客户端实例
    $redis = new Redis();

    // 连接到 Redis 服务器 (假设是本地服务器,默认端口 6379)
    $redis->connect('127.0.0.1', 6379);

    // 设置一个键值对
    $redis->set("greeting", "Hello, Redis!");

    // 获取并显示该值
    $greeting = $redis->get("greeting");
    echo "<p>Greeting from Redis: " . htmlspecialchars($greeting) . "</p>";

    // 增加一个计数器
    $redis->incr("counter");
    $counter = $redis->get("counter");
    echo "<p>Visit count: " . htmlspecialchars($counter) . "</p>";

    // 删除键
    $redis->del("greeting");

} catch (Exception $e) {
    // 错误处理
    echo "Could not connect to Redis: ", $e->getMessage();
}
?>

Redis 的持久化配置

打开 Redis 配置文件(AlpineLinux中位于 /etc/redis.conf),根据需要设置持久化选项:

# 启用 RDB 快照(例如每 5 分钟有 1 次更新时生成快照)
save 300 1

# 启用 AOF 持久化
appendonly yes

修改完配置文件后,重启 Redis 使配置生效:

rc-service redis restart

Redis 的跨 PHP 脚本共享

只要 Redis 服务在运行,所有连接到它的 PHP 脚本都可以共享数据。在其他 PHP 文件中,只需重复相同的 Redis 连接代码,即可访问 Redis 中的数据。

例如,在 other_script.php 中可以使用:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 读取之前设置的计数器
$counter = $redis->get("counter");
echo "Current visit count: " . htmlspecialchars($counter);
?>

将表格结构的数据存储在 Redis 中

1. 使用 Redis 哈希(Hash)类型

Redis 哈希类型可以用来存储类似行记录的数据,每一行是一个 Redis 哈希,每列是哈希的字段。
适用于单条记录的数据存储,且查询特定字段非常高效。
示例
假设有一张“用户表”,包含 id, name, 和 email 列:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 添加一个用户记录,key 为 "user:1"
$redis->hSet("user:1", "id", 1);
$redis->hSet("user:1", "name", "Alice");
$redis->hSet("user:1", "email", "alice@example.com");

// 获取用户记录
$user = $redis->hGetAll("user:1");
print_r($user);
?>

结果

Array
(
    [id] => 1
    [name] => Alice
    [email] => alice@example.com
)

2. 使用 Redis 列表(List)类型

Redis 列表可以用来按顺序存储多行数据,例如多个用户的 id 列表。
可以用于模拟表中的一列,但没有字段标识,适合按顺序存取数据的场景。
示例

$redis->lPush("user_ids", 1);
$redis->lPush("user_ids", 2);
$redis->lPush("user_ids", 3);

$userIds = $redis->lRange("user_ids", 0, -1);
print_r($userIds);

3. 使用 Redis 集合(Set)和有序集合(Sorted Set)

集合(Set)适合无序、去重的数据列,适用于存储唯一的字段(如标签)。
有序集合(Sorted Set)适合存储排序数据,例如排行榜或按日期排序的数据。
示例

$redis->zAdd("user_scores", 100, "user:1");
$redis->zAdd("user_scores", 150, "user:2");

4. 将整张表序列化存储

如果需要存储复杂的表格数据,可以将整个表格序列化为 JSON 格式字符串,并存储到 Redis 中。
示例

$userData = [
    ['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com'],
    ['id' => 2, 'name' => 'Bob', 'email' => 'bob@example.com'],
];

$redis->set("users", json_encode($userData));

// 获取并解码
$decodedData = json_decode($redis->get("users"), true);
print_r($decodedData);

总结

Redis 哈希最适合存储类似数据库表的行记录。
JSON 序列化适合存储复杂的表格数据结构。
使用合适的数据类型可以让 Redis 更高效地管理和查询表格化数据。

Note: PHP操作Sqlite3数据库

文件数据库:

<?php
// 定义数据库文件的路径
$dbFile = 'database.db';

try {
    // 创建或打开 SQLite3 数据库
    $db = new SQLite3($dbFile);

    // 创建一个表格,如果已经存在则跳过
    $db->exec("CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE
    )");

    // 插入一些数据
    $insertData = [
        ['name' => 'Alice', 'email' => 'alice@example.com'],
        ['name' => 'Bob', 'email' => 'bob@example.com'],
        ['name' => 'Charlie', 'email' => 'charlie@example.com'],
    ];

    $stmt = $db->prepare("INSERT OR IGNORE INTO users (name, email) VALUES (:name, :email)");
    foreach ($insertData as $data) {
        $stmt->bindValue(':name', $data['name'], SQLITE3_TEXT);
        $stmt->bindValue(':email', $data['email'], SQLITE3_TEXT);
        $stmt->execute();
    }

    // 从数据库读取数据
    $result = $db->query("SELECT * FROM users");

    // 输出数据
    echo "<h1>Users List</h1>";
    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>Name</th><th>Email</th></tr>";
    while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($row['id']) . "</td>";
        echo "<td>" . htmlspecialchars($row['name']) . "</td>";
        echo "<td>" . htmlspecialchars($row['email']) . "</td>";
        echo "</tr>";
    }
    echo "</table>";

    // 关闭数据库连接
    $db->close();

} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>

内存数据库:

<?php
try {
    // 创建一个 SQLite3 的内存数据库
    $db = new SQLite3(':memory:');

    // 创建一个表
    $db->exec("CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT NOT NULL UNIQUE
    )");

    // 插入一些数据
    $db->exec("INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')");
    $db->exec("INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com')");
    $db->exec("INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com')");

    // 从数据库读取数据
    $result = $db->query("SELECT * FROM users");

    // 输出数据
    echo "<h1>Users List (Memory Database)</h1>";
    echo "<table border='1'>";
    echo "<tr><th>ID</th><th>Name</th><th>Email</th></tr>";
    while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($row['id']) . "</td>";
        echo "<td>" . htmlspecialchars($row['name']) . "</td>";
        echo "<td>" . htmlspecialchars($row['email']) . "</td>";
        echo "</tr>";
    }
    echo "</table>";

    // 关闭数据库连接
    $db->close();

} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>
Compress images, compare text, utilities for web - WebUtils

Utilities for web, compare text online or compress/convert images to formats like JPEG, PNG, AVIF and WEBP

Emmet Documentation
GeoLite

===========20250704=============

IP Address Lookup / Domain Name Lookup / Whois Lookup

Collect the perfect IP addresses and domain names database for querying.

Microsoft Clarity - Free Heatmaps & Session Recordings

Clarity is a free user behavior analytics tool that helps you understand how users are interacting with your website through session replays and heatmaps.