WWW.YOUINFO.SITE
标签聚合 便捷

/tag/便捷

LinuxDo 最新话题 · 2026-06-08 11:02:43+08:00 · tech

你更在乎隐私还是便利? 你更在乎隐私还是便利? 我在乎隐私 我在乎便利 点击以查看投票。 Part 1 不知道为啥,突然站里就蹦出一堆关注隐私泄漏的帖子。 感觉和其他话题一样,大部分人也就跟风关注一下,然后这阵讨论过去,还是该干啥干啥。 这个帖子和朋友们讨论下隐私保护,只涉及个人日常,涉及国家机器层面的不在本帖讨论范围。 Part 2 隐私保护应该是日常的习惯,而不是大家讨论起来注意到然后去想咋办,这时候已经晚了。 就拿现在讨论最多的中转站来说,你没办法知道后台干了什么,是不是掺水了,记录了什么信息,甚至注入了什么内容,你能做的只是别把“关键信息”传进去。 具体什么是关键信息,那就看你在这东西被网友知道了发出来的时候你慌不慌。 日常使用也要养成好习惯。很多人打开APP,弹窗要什么权限就给什么权限,丝毫不管这些权限会导致什么问题。 什么是好的习惯? 权限给最少: 相册给有限读取 (手动添加可读的) 不给无关权限 (比如计算器APP给你要通讯录权限) 个人资料类的全都不给 (比如订票软件要日历权限写日程,不给,手动添加日程)。 就算真想给权限,能限制就限制别给完整的 还有身份信息,诸如登录密码,key,或者其他机密信息, 不要用脑子记 ,你会不自觉的用自己熟悉的内容作为密码,导致类似于“一堆网站用同一个账号密码”,泄漏一个=全都泄漏。 使用密码管理器,并且坚持生成随机密码,使用自动填入。 开启两步验证,妥善保管恢复密钥。 尤其不能把恢复密钥明文备份在网络上,最好的方式是用你自己独特的方式加密后打印出来(做个二维码)或者刻个盘,保存在一个现实世界安全的地方。 对于更加机密的内容(如助记词),建议刻在防火防水的合金板上保存,甚至分开两份放到不同地方/人保存防止一份拿到被破解。 中转站自己搭建,学一学相关知识,弄个服务器装sub2api反代出来自己用最安全。 还有一些小的点大家比较熟悉,比如不连公共wifi,打开反追踪器,使用轮换mac地址之类的功能。 Part 3 隐私保护和方便快捷,我认为就是天平两端,互斥的内容。你更在乎一边,另一边必定要舍弃一些。 上面的分享只是一部分,能做到这些,你的隐私基本上已经保住一大半了,但是你做的越多,你就越不方便。具体取舍,就看你对你可能要牺牲的那些隐私内容的重视程度了。 还记不记得某人说过一句话:“中国人对隐私问题更加开放,或者说没有那么敏感;如果要用隐私来交换便捷性、效率,很多情况下中国用户是愿意这么做的。” 但是我觉得不对,大家能有现在这么多讨论隐私保护的内容,说明大家越来越在意隐私保护了。 End 完 3 个帖子 - 3 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-07 15:55:11+08:00 · tech

社区拟优化账号注册机制 第一点很好理解,也就是有邀请链接就可以直接注册。一方面消除不确定性,另一方面释放管理精力进行下一阶段运营。 第二点主要是改变发邀请链接的渠道,将有且仅有 3 个渠道: GitHub申请渠道 调整为 5 年 GitHub 账号直接获取。 于是,我搞了一个html方便查询github信息,不仅能查自己的还能查别人的 链接如下 github-q.087654.xyz GitHub 用户资料查询 1 个帖子 - 1 位参与者 阅读完整话题

IT之家 · 2026-06-03 13:54:12+08:00 · tech

IT之家 6 月 3 日消息,比亚迪腾势汽车今日宣布,旗下旗舰车型腾势 Z9 GT 与腾势 Z9 迎来新 OTA 系统升级。本次升级以“智慧进阶,奢享新境”为主题,围绕智能互联、车载娱乐、安全取证及 IoT 生态四大维度推出九大功能更新。 IT之家注意到,在智能家居互联领域,腾势此次 OTA 新增海信与 TCL 两大知名品牌接入车家互联生态,腾势车主可通过车机系统远程控制家中空调等智能设备。 本次升级对哨兵模式进行了重要优化。新增本地及 U 盘便捷导出功能,车主可在哨兵视频播放界面一键将关键视频导出至本地存储或 U 盘。当车辆发生剐蹭、碰撞等风险事件时,用户能够快速完成取证操作。 腾势智慧物联 App 商城正式接入积分支付体系。车主登录车机 DiLink 账号后,在商城购物可直接使用积分抵扣现金。 本次 OTA 在音乐娱乐方面实现了多项重磅升级。首先,融合音乐新增流量提醒功能,用户可在音乐设置页自定义流量限额,当流量使用达到设定阈值时系统将即时推送提醒。 在视觉与内容层面,百变主题新增“时光音乐壁纸”功能。该壁纸能够实时感知天气与时间变化,自动调节屏幕色彩氛围,并智能推荐契合当下心境的音乐曲目。 内容服务方面,QQ 音乐新增“AI 陪你听”功能。伴随音乐播放,AI 讲解将自动同步启动,为用户讲述歌词与旋律背后的故事,提供“听懂音乐更听懂你的心声”的深度听歌体验。同时,QQ 音乐新增银河音效、酷狗音乐新增蝰蛇音效,两大主流音乐平台均针对腾势座舱声学环境进行了专属适配,以精准的空间音频算法打造“移动的音乐厅”。 腾势智慧物联 IoT 生态在本次升级中迎来一批新成员。新增支持宠物安全座、九号滑板车、车载空气净化器、车载吸尘器、腰部按摩仪以及两用双温冰箱等设备的接入与控制。车主可通过车机系统实时查看宠物状态、调节车载环境设备。 针对多屏交互场景,腾势新增爱奇艺跨屏点播功能。用户在使用爱奇艺应用时,长按影片封面即可将内容跨屏投放至车内其他娱乐屏幕, 此外,此次 OTA 新增副驾小憩模式,一键开启,座椅缓缓舒展至休憩姿态。

LinuxDo 最新话题 · 2026-05-30 11:23:40+08:00 · tech

用 mac 大半年了,非常好用,但是感觉部分便捷性的软件还是不如 win 上 标签切换,目前用的 alt tab2,这玩意儿会一直录你的屏,很难受,并且并不能按照历史记录切换,特别是涉及到谷歌浏览器和 wps,不能切换到上一个使用的窗口 右键文件夹 / 文件,使用 vscode 打开,一直没找到这个功能,感觉很便捷 复制粘贴历史记录,windows 上 win+v 自动的功能,mac 上没有找到合适的工具 进程、内存管理,自带的活动监视器似乎占用很高,而且看起来不太方便 暂时只有这些感觉可以优化的地方,都是我遇到的一些使用上的问题,有没有佬知道怎么搞? 4 个帖子 - 4 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-22 11:20:44+08:00 · tech

参考这篇文章,昨天对最新版 Typora 进行了激活。 Typora【超便捷md文本编辑器】 安装与激活教程 但是我遇到了两个问题: 1、首次(后台没有 Typora 进程)打开 Typora 或使用 Typora 打开 md 文件,会自动弹出开发者工具。 2、我把前台窗口关闭后,再次点击打开其他 md 文件,无法打开(无法弹窗),任务管理器查看有 Typora 后台进程,把所有后台进程关闭后,再次打开其他 md 文件,这时才可以打开。 分析了下,确实脚本有些小问题: 自动弹 DevTools:来自 win.webContents.openDevTools({ mode: “detach” }) 关闭窗口后后台残留:来自把 electron.app.quit 覆盖成空函数,导致 Typora 主进程不退出 已经修好了,自取: const asar = require("asar"); const chalk = require("chalk"); const fs = require("fs"); const path = require("path"); const { execSync } = require("child_process"); const readlineSync = require("readline-sync"); const WinReg = require("winreg"); const { flipFuses, FuseV1Options, FuseVersion } = require("@electron/fuses"); function getInsertCode(EnableHookDebug, atobMachineCode, email, nowDateStr) { return ` /** Hook破解开始 */ const electron = require("electron"); // 是否启用劫持调试 const HookDebug = ${EnableHookDebug ? "true" : "false"}; // 调试日志定义 const LOG_PATH = ".\\\\Typora_Hook_Log.txt"; //fs.rmSync(LOG_PATH, { force: true }); function writeLog(...data) { const log = \`[\${new Date().toLocaleString()}] [Log] \${data.join( " " )}\\n------------------\\n\`; fs.appendFileSync(LOG_PATH, log); } // 调试模式只记录窗口创建,不改写 app.quit,也不自动打开 DevTools。 // 改写 app.quit 会让前台窗口关闭后主进程残留,双击 md 时 second-instance 无法正常唤起窗口。 if (HookDebug) { electron.app.on("browser-window-created", (_event, win) => { writeLog("【👀 监控】检测到 BrowserWindow 实例化!"); }); } // Hook fs 模块,重定向对 resources/app 目录的访问 // resources/app/ → resources/app.bak/ const fsPathFrom = /resources[\\\\/]app[\\\\/]/i; const fsPathTo = "resources\\\\app.bak\\\\"; const fsHook = {}; [ "readFileSync", "readFile", "statSync", "stat", "Stats", "StatsFs", "open", "openSync", ].forEach((property) => { fsHook[property] = fs[property]; fs[property] = function (filePath, ...args) { if (typeof filePath == "string" && fsPathFrom.test(filePath)) { const redirectPath = filePath.replace(fsPathFrom, fsPathTo); writeLog( \`[🛡️ fsHook] 程序试图 fs.\${property} 重定向 \${filePath} --> \${redirectPath}\` ); return fsHook[property].call(this, redirectPath, ...args); } writeLog(\`[🛡️ fsHook] 程序试图 fs.\${property} \${filePath}\`); return fsHook[property].call(this, filePath, ...args); }; }); const fsPromisesHook = {}; ["readFile", "open", "stat"].forEach((property) => { fsPromisesHook[property] = fs.promises[property]; fs.promises[property] = async function (filePath, ...args) { if (typeof filePath == "string" && fsPathFrom.test(filePath)) { const redirectPath = filePath.replace(fsPathFrom, fsPathTo); writeLog( \`[🛡️ fsHook/Promises] 程序试图 fs.promises.\${property} 重定向 \${filePath} --> \${redirectPath}\` ); return fsPromisesHook[property].call(this, redirectPath, ...args); } writeLog( \`[🛡️ fsHook/Promises] 程序试图 fs.promises.\${property} \${filePath}\` ); return fsPromisesHook[property].call(this, filePath, ...args); }; }); // IPC 通信进行监控 if (HookDebug) { const invokeFilter = ["document.addSnapAndLastSync", "document.setContent"]; const originalIpcMainHandle = electron.ipcMain.handle; electron.ipcMain.handle = function (channel, listener) { // writeLog(\`[IPC 注册] .handle 监听频道: "\${channel}"\`); const filter = !invokeFilter.includes(channel); return originalIpcMainHandle.call(this, channel, async (event, ...args) => { filter && writeLog( \`[👀IPC 请求] 收到 .invoke("\${channel}") 参数:\`, JSON.stringify(args) ); try { const result = await listener(event, ...args); filter && writeLog( \`[👀IPC 响应] .handle("\${channel}") 返回结果:\`, JSON.stringify(result) ); return result; } catch (error) { filter && writeLog(\`[👀IPC 错误] .handle("\${channel}") 执行出错:\`, error); throw error; } }); }; } const crypto = require("crypto"); const originalPublicDecrypt = crypto.publicDecrypt; crypto.publicDecrypt = function (key, buffer) { if (HookDebug) { writeLog("-------------------------------------------"); writeLog("【👀 监控】 crypto.publicDecrypt 被调用"); writeLog("Key:", key); writeLog("Buffer (Hex):", buffer.toString("hex")); } // return originalPublicDecrypt.call(this, key, buffer); // 直接返回伪造的明文 Buffer return Buffer.from( JSON.stringify({ deviceId: "${atobMachineCode.l}", fingerprint: "${atobMachineCode.i}", email: "${email}", license: "Cracked_By_DreamNya", version: "${atobMachineCode.v}", date: "${nowDateStr}", type: "DreamNya", }) ); }; // 劫持联网验证 electron.app.whenReady().then(() => { electron.protocol.handle("https", async (request) => { writeLog(\`[👀electron.net Request] \${request.method} \${request.url}\`); writeLog("request.url typeof:", typeof request.url, "value:", request.url); // 拦截目标请求,伪造响应 if (request.url === "https://store.typora.io/api/client/renew") { if (HookDebug){ writeLog(\`[🛡️ 拦截] 伪造激活验证响应: {success:true, msg: \${btoa("DreamNya")}}\`); } return new Response( JSON.stringify({ success: true, msg: btoa("DreamNya") }), { status: 200, headers: { "content-type": "application/json" }, } ); } if (HookDebug) { // 尝试打印 Request Body try { const reqClone = request.clone(); const reqBody = await reqClone.text(); if (reqBody) { writeLog('[electron.net Request Body]:', reqBody); } } catch { } // 其他请求正常转发 const response = await electron.net.fetch(request, { bypassCustomProtocolHandlers: true }); // 克隆响应用于日志 const resClone = response.clone(); resClone .text() .then((resText) => { writeLog(\`[👀electron.net Response] \${response.status} \${request.url}\`); writeLog('[electron.net Response Body]:', resText.substring(0, 500)); }) .catch((err) => { console.error('[electron.net Response Error]:', err); }); return response; } }); }); /** Hook破解结束 */ `; } let EnableBackup = false; // 是否备份原始文件 let EnableHookDebug = false; // 是否启用调试日志 const Typora_Installation_Path = "D:\\App\\Tool\\Typora"; const resourcesPath = path.join(Typora_Installation_Path, "resources"); const asarPath = path.join(resourcesPath, "app.asar"); const appDir = path.join(resourcesPath, "app"); const appBakDir = path.join(resourcesPath, "app.bak"); const asarBakPath = path.join(resourcesPath, "app.asar.bak"); const TyporaEXE = path.join(Typora_Installation_Path, "Typora.exe"); const LaunchDistJS = path.join(appDir, "launch.dist.js"); // 随机生成一个符合前端验证格式的注册码 function generateRegCode() { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; let code = '+'; for (let i = 0; i < 8; i++) { code += chars.charAt(Math.floor(Math.random() * chars.length)); } code += '#'; return code; } function closeTyporaProcesses() { try { execSync("taskkill /F /IM Typora.exe"); console.log(chalk.green("已关闭所有 Typora.exe 进程")); } catch (e) { console.log(chalk.red("Typora.exe 未运行或关闭失败,请手动关闭后继续。")); } console.log( chalk.yellow( "已尝试自动关闭所有 Typora.exe 进程,如果未关闭请手动关闭后再运行此程序。" ) ); // 回车继续 console.log(chalk.cyan("请按回车键继续...")); readlineSync.question(); } function setRegValue(regKey, name, value) { return new Promise((resolve, reject) => { regKey.set(name, WinReg.REG_SZ, value, function (err) { if (err) reject(err); else resolve(); }); }); } function getNowDateStr() { const now = new Date(); const dd = String(now.getDate()).padStart(2, "0"); const mm = String(now.getMonth() + 1).padStart(2, "0"); const yyyy = now.getFullYear(); return `${mm}/${dd}/${yyyy}`; } const nowDateStr = getNowDateStr(); // 要求输入机器码和邮箱 console.log(chalk.cyan("请输入机器码: ")); const machineCode = readlineSync.question(); console.log(chalk.cyan("请输入邮箱: ")); const email = readlineSync.question(); // 询问是否开启备份(默认开启)与调试(默认关闭) console.log(chalk.cyan("请选择是否开启备份与调试选项:")); console.log(chalk.cyan("【建议开启】是否开启备份?(Y/N): ")); const backupAnswer = readlineSync.question(); console.log(chalk.cyan("【建议关闭】是否开启调试?(Y/N): ")); const debugAnswer = readlineSync.question(); EnableBackup = backupAnswer.toLowerCase() === "y"; EnableHookDebug = debugAnswer.toLowerCase() === "y"; // Base64 解码 function atob(str) { return Buffer.from(str, "base64").toString("utf-8"); } const atobMachineCode = JSON.parse(atob(machineCode)); console.log(chalk.yellow("deviceId: " + atobMachineCode.l)); console.log(chalk.yellow("fingerprint: " + atobMachineCode.i)); console.log(chalk.yellow("version: " + atobMachineCode.v)); // 关闭所有 Typora.exe 进程 closeTyporaProcesses(); console.log(chalk.green("==== 开始破解... ====")); async function main() { // 一、反反调试 console.log(chalk.yellow("一、正在进行反反调试操作...")); console.log(chalk.yellow("解包 asar")); await asar.extractAll(asarPath, appDir); console.log( chalk.yellow("复制 app 到 app.bak(递归复制)【应对完整性校验】") ); // 2. 复制 app 到 app.bak(递归复制) function copyDir(src, dest) { if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true }); for (const entry of fs.readdirSync(src, { withFileTypes: true })) { const srcPath = path.join(src, entry.name); const destPath = path.join(dest, entry.name); if (entry.isDirectory()) { copyDir(srcPath, destPath); } else { fs.copyFileSync(srcPath, destPath); } } } copyDir(appDir, appBakDir); console.log(chalk.yellow("移除 app.asar 文件")); // 3. 重命名 app.asar 为 app.asar.bak if (EnableBackup) { fs.renameSync(asarPath, asarBakPath); } else { fs.rmSync(asarPath, { force: true }); } console.log( chalk.yellow("修改 Typora.exe 的 fuse 配置,允许加载未打包的 app 目录") ); if (EnableBackup) { // 修改前先备份 fs.copyFileSync(TyporaEXE, `${TyporaEXE}.bak`); } // 修改fuse配置(同时会修改程序hash) flipFuses(TyporaEXE, { version: FuseVersion.V1, [FuseV1Options.OnlyLoadAppFromAsar]: false, }); console.log(chalk.green("反反调试操作完成!")); // 二、注入破解代码 console.log(chalk.yellow("二、正在注入破解代码到 launch.dist.js...")); // 读取原文件内容 let content = fs.readFileSync(LaunchDistJS, "utf-8"); // 查找第一个require语句后的分号 const requireRegex = /require\([^)]+\);/; const match = requireRegex.exec(content); if (match) { const insertPos = match.index + match[0].length; const insertCode = getInsertCode( EnableHookDebug, atobMachineCode, email, nowDateStr ); // 插入代码 content = content.slice(0, insertPos) + insertCode + content.slice(insertPos); fs.writeFileSync(LaunchDistJS, content, "utf-8"); console.log(chalk.green("成功插入破解代码到 launch.dist.js")); } else { console.log( chalk.red("未找到 require 语句,破解代码未插入launch.dist.js。") ); } console.log(chalk.green("注入破解代码完成!")); // // 三、注册激活 // console.log(chalk.yellow("三、正在注册激活...")); // try { // execSync(`start "" "${TyporaEXE}"`); // console.log(chalk.green("Typora 已启动!")); // } catch (e) { // console.log(chalk.red("Typora 启动失败,请手动打开。")); // } // const regCode = generateRegCode(); // console.log(chalk.green(`您的注册码为:${regCode}`)); // console.log(chalk.yellow("请复制并用于激活。")); // console.log(chalk.cyan("请按回车键继续...")); // // 关闭Typora进程 // closeTyporaProcesses(); // 三、修改注册表 console.log(chalk.yellow("三、正在修改注册表以关闭联网验证...")); // 修改注册表,尽量关闭联网验证 // 注册表路径 const regKey = new WinReg({ hive: WinReg.HKCU, key: "\\Software\\Typora", }); try { await setRegValue(regKey, "SLicense", "RHJlYW1OeWE=#0#1/1/2029"); console.log(chalk.green("SLicense 注册表字段写入成功")); await setRegValue(regKey, "IDate", nowDateStr); console.log(chalk.green("IDate 注册表字段写入成功")); } catch (err) { console.log(chalk.red("写入注册表失败:"), err); } console.log(chalk.green("==== 破解完成!使用愉快!====")); console.log(chalk.yellow("后续操作建议:\n")); const regCode = generateRegCode(); console.log(chalk.green(`\t1.您的注册码为:${regCode} 请复制并用于激活。`)); console.log(chalk.yellow("\t2. 关闭【自动检查更新】功能,防止被覆盖。")); console.log( chalk.yellow( "\t3. 关闭【Typora服务器使用国内服务器】功能,避免绕过联网验证失败。" ) ); } main(); 详细激活过程可以参考原帖。感谢大佬提供的脚本。 3 个帖子 - 2 位参与者 阅读完整话题