WWW.YOUINFO.SITE
标签聚合 要求

/tag/要求

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

本人和小组其他成员一起买了一个pro 20x订阅,搭了一个中转站方便使用,固定了代理ip,网页版gpt也使用了指纹浏览器,过了cyber认证,目前gpt主要用于网安研究使用。一个月不到被发了两封邮件警告cyber abuse啊 ,申诉被维持原判,现在导致不敢用了,害怕再来一次号没了,也不知道哪里出了问题,难道普通的网安研究也不行吗(没有逆向,破解等操作)。非常焦虑,没有AI直接停摆了 有没有佬懂的指点一下 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 22:42:04+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 前言 本教程的环境基于 jdk8 + langchain4j 0.35 教程源码放在这里了: github.com GitHub - worenbudaoni/rag-study-helper: 一个学习检索增强生成的全流程助手 一个学习检索增强生成的全流程助手 文章内容 因为内容比较多,我会从下面三个文章进行讲解,后续发布后会贴出来,这节讲: 接入飞书WIKI文档 RAG实现全流程 : 【开源、教程】RAG全流程实现(java+完整代码):第一弹 接入飞书WIKI文档 : 【开源、教程】RAG全流程实现(java+完整代码):第二弹 接口限流:令牌桶 + AOP 强烈建议先看完第一弹,不然后面代码有可能看不懂 实现逻辑 后面会有图文讲解的,这里就相当于大概介绍一下,看个大概就好,有不了解的不要先去搜,我后文都会讲,如果讲漏了麻烦评论一下,我改正 飞书开发者平台 : 1、去飞书开发者平台创建一个应用 2、给应用赋予权限(权限管理 菜单) 3、给应用赋予机器人能力(添加应用能力 菜单) 4、发布(版本管理与发布 菜单) 5、获取应用的app-id、app-secret(凭证和基础信息 菜单) 飞书app : 1、创建一个群聊 2、把机器人给拉进去 3、点击左边菜单的更多找到知识库,新建知识库(下面统一称为 WIKI) 4、添加群聊(机器人)为管理员:点 WIKI 进去会打开一个网站,左下角有个设置点进去,在成员设置->角色与权限->管理员,添加管理员,搜索我们刚才创建的有机器人的群聊并添加 5、在页面的连接处找到space-id,如: https://kcnvw23rzo5r.feishu.cn/wiki/settings/666666(666666就是我们要的space-id) 项目 : 1、创建一个job,用来定时获取文档(下面为job启动后的流程) 2、通过app-id、app-secret获取tenant_access_token和expire 3、通过tenant_access_token和space-id获取文档信息(名字、更新时间、documentToken 等等) 4、通过documentToken去获取文档的内容(字符串) 5、走 【开源、教程】RAG全流程实现(java+完整代码):第一弹 的入库流程 一、飞书开发者平台 app-id、app-secret 是啥 app-id :应用的唯一标识 app-secret :应用的密钥,在创建应用时由平台生成,可用于获取app_access_token 1、飞书开放平台创建企业应用 开发者后台 - 飞书开放平台 这里注意的是创建好应用后需要审核、启用,所以企业级的应用权限在领导手上,我们可以创建一个个人版的飞书账号来做实验 2、给应用赋予权限 (权限管理菜单) 直接复制我的也行 { "scopes": { "tenant": [ "bitable:app:readonly", "docx:document:readonly", "drive:drive:readonly", "drive:file:readonly", "wiki:wiki:readonly" ], "user": [] } } 3、给应用赋予机器人能力 (添加应用能力菜单) 4、发布 (版本管理与发布菜单) 创建好后发布就行 5、获取应用的app-id、app-secret(凭证和基础信息菜单) 二、飞书app space-id是啥 就是飞书知识库(WIKI)所对应的空间ID,我们找到这个空间就可以找到下面的文档 打个比方就是图书馆的书架,书架有个唯一标识(小说),我们根据这个书架ID(小说)去找下面所有的书 1、创建一个群聊 2、把机器人给拉进去 3、点击左边菜单的更多找到知识库,新建知识库(下面统一称为 WIKI) 4、添加群聊(机器人)为管理员 点 WIKI 进去会打开一个网站,左下角有个设置点进去,在成员设置->角色与权限->管理员,添加管理员,搜索我们刚才创建的有机器人的群聊并添加 5、在页面的连接处找到space-id 如: https://kcnvw23rzo5r.feishu.cn/wiki/settings/666666(666666就是我们要的space-id) 三、项目 这里就不按照上面实现逻辑写的走了,我就按照代码里的讲解 1、job总览(步骤拆解在后面) FeishuSyncService.java // 没想加重框架,如果用xxl-job什么的,自己搬一下就行了 @Scheduled(cron = "${app.feishu.cron}") public void syncWiki() { log.info("Starting Feishu wiki sync for space: {}", spaceId); try { // 获取全部文档信息(通过app-id、app-secret、space-id) // 这里逻辑后面会讲 List<WikiNode> nodes = feishuClient.getWikiNodeTree(spaceId); log.info("Found {} nodes in wiki", nodes.size()); // 成功数量,跳过数量(如果数据存在了关系型数据库且没有更新就跳过),失败数量 int synced = 0, skipped = 0, failed = 0; for (WikiNode node : nodes) { // 后缀 String objType = node.getObjType(); // 文档令牌 用来获取 文档内容 String nodeToken = node.getNodeToken(); // 更新时间判断是否需要跳过 long updateTime = node.getUpdateTime(); // 是否入库 Documents doc = documentsMapper.selectOne( Wrappers.<Documents>lambdaQuery() .eq(Documents::getFeishuNodeToken, nodeToken) ); // 文档是否更新是否需要跳过,这个更新时间不在where条件里面是因为后续要继续用到这个数据 if (doc != null && doc.getFeishuUpdateTime() != null && doc.getFeishuUpdateTime() == updateTime) { skipped++; continue; } try { // 文档内容 String content; // 获取文件名 String fileName; switch (objType) { case "doc": case "docx": // 获取文档内容 // 这里逻辑就不讲了,我后面扔给飞书的文档,照着对接或者看我源码就好 content = feishuClient.getDocumentContent(node.getObjToken()); fileName = node.getNodeTitle() + "_文档"; break; case "sheet": content = feishuClient.getSheetContent(node.getObjToken()); fileName = node.getNodeTitle() + "_表格"; break; case "bitable": content = feishuClient.getBitableContent(node.getObjToken()); fileName = node.getNodeTitle() + "_多维表格"; break; default: skipped++; continue; } // 如果是更新,先删旧向量和映射记录 if (doc != null) { // 查询旧文档相关的向量映射 List<DocumentChunks> oldChunks = documentChunksMapper.selectList( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, doc.getId()) ); // 有两张表 // 第一张为文档库:记录文档标题、更新时间、创建人等信息 // 第二张为分片库:记录向量数据库插入后的向量ID // 向量ID List<String> vectorIds = oldChunks.stream() .map(DocumentChunks::getVectorId) .collect(Collectors.toList()); // 删除向量 embeddingStore.removeAll(vectorIds); // 删除映射记录 documentChunksMapper.delete( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, doc.getId()) ); // 删除文档 documentsMapper.deleteById(doc.getId()); } // RAG 入库流程 (第一篇文章中亦有记载(跟第一章代码有些许出入,看完第一章后,直接看源码更佳)) ingestionService.ingestFeishuDocument(fileName, content, nodeToken, updateTime, objType); synced++; log.info(" Synced: {} ({})", node.getNodeTitle(), nodeToken); } catch (Exception e) { log.error(" Failed to sync node: {} ({})", node.getNodeTitle(), nodeToken, e); failed++; } } // 清理远程已删除的文档 // 这里的逻辑是 // 第一次job执行:查询飞书wiki给了 A、B、C 三个文档入库 // 后面有人在wiki中删了 C 文档 // 第二次job执行:只有查询出 A、B 两个文档 // 这时就要去数据库中和向量库中删除多余的 C 文档 List<String> remoteTokens = nodes.stream() .map(WikiNode::getNodeToken) .collect(Collectors.toList()); if (!remoteTokens.isEmpty()) { // MySQL 查出本地多出的记录,只遍历需要删除的 List<Documents> toRemove = documentsMapper.selectList( Wrappers.<Documents>lambdaQuery() .isNotNull(Documents::getFeishuNodeToken) .notIn(Documents::getFeishuNodeToken, remoteTokens) ); for (Documents removed : toRemove) { log.info("Document removed remotely, cleaning up: {} ({})", removed.getDocumentName(), removed.getFeishuNodeToken()); List<DocumentChunks> chunks = documentChunksMapper.selectList( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, removed.getId()) ); List<String> vectorIds = chunks.stream() .map(DocumentChunks::getVectorId) .collect(Collectors.toList()); // 向量数据库 删 embeddingStore.removeAll(vectorIds); // 关系型数据库 分片库 删 documentChunksMapper.delete( Wrappers.<DocumentChunks>lambdaQuery() .eq(DocumentChunks::getDocumentId, removed.getId()) ); // 关系型数据库 文档库 删 documentsMapper.deleteById(removed.getId()); } } log.info("Feishu wiki sync complete: synced={}, skipped={}, failed={}", synced, skipped, failed); } catch (Exception e) { log.error("Feishu wiki sync failed", e); } } 2、递归获取知识库所有文档节点 FeishuClient.java 这里其实没什么特别好讲的点,就是参考飞书文档,然后请求并解析 我在源码里也标记了文档的地址,所以这里放一个总体的查询地址 开发文档 - 飞书开放平台 /** * 获取 tenant_access_token(内部自动缓存和刷新) */ public synchronized String getAccessToken() throws IOException { if (cachedToken != null && System.currentTimeMillis() < tokenExpireAt) { return cachedToken; } String json = "{\"app_id\":\"" + appId + "\",\"app_secret\":\"" + appSecret + "\"}"; // https://open.feishu.cn/document/server-docs/authentication-management/access-token/tenant_access_token_internal Request request = new Request.Builder() .url(baseUrl + "/open-apis/auth/v3/tenant_access_token/internal") .post(RequestBody.create(JSON, json)) .build(); try (Response resp = httpClient.newCall(request).execute()) { JsonNode body = objectMapper.readTree(resp.body().string()); if (body.get("code").asInt() != 0) { throw new IOException("Failed to get access token: " + body); } cachedToken = body.get("tenant_access_token").asText(); // tenant_access_token 的最大有效期是 2 小时 // 7200 是秒 int expire = body.get("expire").asInt(7200); // 防御性编程 免得刚好过期 由于网络延时 造成接口调用失败 tokenExpireAt = System.currentTimeMillis() + (expire - 60) * 1000L; return cachedToken; } } /** * 递归获取知识库所有文档节点。 */ public List<WikiNode> getWikiNodeTree(String spaceId) throws IOException { List<WikiNode> allNodes = new ArrayList<>(); collectNodes(spaceId, null, allNodes); return allNodes; } private void collectNodes(String spaceId, String parentNodeToken, List<WikiNode> result) throws IOException { List<WikiNode> currentLevelNodes = new ArrayList<>(); String pageToken = null; do { // https://open.feishu.cn/document/server-docs/docs/wiki-v2/space-node/create StringBuilder url = new StringBuilder(baseUrl + "/open-apis/wiki/v2/spaces/" + spaceId + "/nodes"); if (parentNodeToken != null) { url.append("/").append(parentNodeToken).append("/children"); } url.append("?page_size=50"); if (pageToken != null) { url.append("&page_token=").append(pageToken); } Request request = new Request.Builder() .url(url.toString()) .header("Authorization", "Bearer " + getAccessToken()) .get() .build(); try (Response resp = httpClient.newCall(request).execute()) { JsonNode body = objectMapper.readTree(resp.body().string()); if (body.get("code").asInt() != 0) { log.error("Wiki API error for URL [{}]: {}", url, body); break; } JsonNode items = body.path("data").path("items"); for (JsonNode item : items) { WikiNode node = new WikiNode(); // 节点token node.setNodeToken(item.path("node_token").asText()); // 对应文档类型的token,可根据 obj_type 判断属于哪种文档类型。 node.setObjToken(item.path("obj_token").asText()); // 文档类型,对于快捷方式,该字段是对应的实体的obj_type。 // 可选值有: // doc:旧版文档 sheet:表格 mindnote:思维导图 bitable:多维表格 file:文件 docx:新版文档 slides:幻灯片 node.setObjType(item.path("obj_type").asText()); // 文档标题 node.setNodeTitle(item.path("title").asText()); node.setParentNodeToken(parentNodeToken); // 是否有子节点 node.setHasChild(item.path("has_child").asBoolean(false)); // 文档最近编辑时间 String editTime = item.path("obj_edit_time").asText(); node.setUpdateTime(Long.parseLong(editTime.isEmpty() ? "0" : editTime)); currentLevelNodes.add(node); } pageToken = body.path("data").path("page_token").asText(null); } } while (pageToken != null && !pageToken.isEmpty()); // Add all nodes from this level, then recurse into children result.addAll(currentLevelNodes); for (WikiNode node : currentLevelNodes) { if (node.isHasChild()) { collectNodes(spaceId, node.getNodeToken(), result); } } } 四、测试 1、导入文档 还是拿这个 补鸡稻 作为测试案例 2、配置 app-id、app-secret、space-id和sync-enable 我这里通过 jvm 运行参数注入,免得又把 apikey 给上传到 github 了 sync-enable 记得为 true,不然不注册 spring bean 3、运行时发现文档可以查询到,并且入库了 4、提问 5、测试结束,完结撒花 2 个帖子 - 2 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 22:41:04+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 一个 Windows 小工具,可以读取本机 Claude Code 用量,并推送到 EDIFIER 花再 Halo PixelBar 点阵屏显示,支持手动推送、定时刷新、设备选择和界面化配置。 它可以在 Windows 上自动读取当前电脑的 Claude Code 登录凭证,查询 Claude 用量信息,然后渲染成 256x32 点阵画面,通过 HID 推送到 EDIFIER 花再 Halo PixelBar 显示。 界面: 效果图: 主要功能: 自动获取 Claude Code usage 信息 支持 5 小时、7 天、Sonnet 用量展示 支持 EDIFIER 花再 Halo PixelBar 点阵屏推送 支持手动推送一次 支持定时刷新,比如 5 / 10 / 30 分钟 支持选择设备 支持自定义显示文字、单位、布局、字体参数 支持推送前自动切换 WORK 场景 提供 GUI 可视化配置界面 附带源码和可直接运行的 exe 隐私说明: 工具只读取本机 Claude Code 的 OAuth 凭证,用于查询 usage API;不会上传 token,不会把 token 写入配置文件,也不会打包进 exe。项目是非官方工具,不属于 EDIFIER / Anthropic / Claude 官方项目。 项目地址: https://github.com/3441293738/claude-edifier-pixelbar-usage 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 22:32:57+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 最近做了一个自己在用的 YouTube 下载插件,开源出来。 项目地址: github.com GitHub - fengjunda888/youtube-download-extension: YouTube 视频下载 Chrome 扩展,基于… YouTube 视频下载 Chrome 扩展,基于 yt-dlp,支持合集、多任务、画质选择和下载进度 这个插件的特点: 基于 yt-dlp Chrome 插件形式 支持 Windows 和 macOS 支持先解析链接,再选择下载 支持单个视频、合集、多选、全选 支持画质选择 支持查看下载进度和任务状态 目前的使用方式是: 在 Chrome 加载 extension 目录 本地安装 Native Host 配好 yt-dlp 在插件里粘贴 YouTube 链接,先解析,再选择下载 Windows 安装比较直接: Install-NativeHost.bat macOS 也支持: Install-NativeHost.sh 说明一下: 这个工具不会绕过 YouTube 权限限制,会员、私有、区域限制之类的视频还是取决于 yt-dlp 和账号/网络环境。 欢迎试用,也欢迎提 issue / PR。 希望能给个star! 谢谢! LINUX DO 版主 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 19:19:29+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 GitHub - Hittopu/okfa-one-keyboard-for-all: okfa - one keyboard for all · GitHub 可以实现mac/windows的键盘一键切换成另外一台windows的键盘,可以实现在工位偶尔在另一台电脑上输入nvidia-smi的方便操作,也间接的实现了(mac键盘打瓦) 1 个帖子 - 1 位参与者 阅读完整话题

cnBeta全文版 · 2026-06-11 13:35:37+08:00 · tech

6月10日,韩国板桥。或许连Kakao自己都没想到,这家曾经代表着韩国互联网“超高速”增长与“酷”文化的企业,其总部门前最热闹的一天,不是因为新品发布,也不是什么明星代言活动,而是600多名员工高举标语、喊着口号的罢工集会。 对,你没看错,Kakao,这个承载着韩国人生活方方面面的国民级应用巨头,迎来了它创立以来的“第一次”大规模罢工。这事儿在韩国科技圈的震撼程度,恐怕不亚于一颗深水炸弹。 为什么是现在?又为什么是Kakao? 新闻里说得直白:改善奖金制度、调整薪酬结构、推动更透明合理的员工激励机制。翻译一下,就是员工们觉得,公司赚的钱和自己付出的努力,在账面上“失衡”了。 表面看是“钱没给够”,但往深了扒,这其实是Kakao那层“梦想职场”的滤镜,碎了。 很长一段时间里,Kakao都是韩国程序员的“圣地”。它以扁平化、自由开放著称,领着不菲的薪水,做着改变韩国人生活方式的产品,那种优越感和归属感,是很多传统财阀大厂给不了的。员工们在这里工作,不仅仅是打工,更像是在参与一场宏大的、有趣的数字革命。那时候,谈“钱”似乎有点俗,因为“梦想”和“股票期权”的光环足以掩盖一切。 但梦想不能当饭吃,尤其是在经济周期的寒风吹过来的时候。 当Kakao从那个锐意进取的挑战者,逐渐变成一个庞大臃肿的商业帝国时,故事的内核就变了。增长放缓、股价承压、新业务屡屡碰壁,管理层自然要开始“降本增效”,收紧裤腰带。 可对于习惯了高增长红利的一线员工来说,感受到的却是:指标越来越重,加班越来越晚,但奖金池却肉眼可见地缩水了。更致命的是,员工们发现,薪酬调整的尺子似乎并不透明,激励机制的承诺,兑现起来也打了折扣。 这种“撕裂感”是爆发此次罢工的核心燃料。过去,我们是一起为了理想狂奔的战友,你画的大饼我认,因为我能看到它在变大。但现在,你开始跟我精打细算地计较工时和成本,把我当成庞大机器上一颗随时可以替换的螺丝钉,那我就要跟你认认真真地谈谈法律、合同和真金白银了。 值得注意的是,这次站出来的600人,不是普通员工,而是工会成员。在高科技、高收入的韩国IT行业,工会一直是个有点“非主流”的存在。而如今,Kakao工会能用一场史无前例的罢工,展现出如此强的组织力和行动力,这本身就是对管理层的一记响亮耳光。它宣告了一个事实:过去那种依靠领袖魅力和“文化洗脑”式的管理,已经行不通了。新一代的知识工作者,自我意识更强,对权利边界和规则公平的要求更高。 失业君小编总结认为,这不仅仅是Kakao一家的危机,更是整个韩国科技行业,乃至所有曾经以“改变世界”为口号的新经济公司的共同寓言。 当高速增长的红利期结束,当“选择权”的暴富神话破灭,企业用什么来留住最顶尖的大脑?是继续贩卖虚无缥缈的情怀,还是建立一套经得起审视、能够被量化的公平分配机制? Kakao的罢工员工给出了他们的答案。他们用行动撕掉了那层温情脉脉的面纱,告诉资本方一个最朴素的道理:在任何一种雇佣关系里,当精神共鸣难以维系时,最基本的物质尊重和规则透明,就是最后的底线。如果你连这个也守不住,那么,再酷的公司,也终将迎来门前那刺眼的标语和沉默的抗议。 这或许是Kakao成长至今,必须经历的最昂贵、也最深刻的一堂管理课。而台下的学生,是整个韩国科技界。这出戏,才刚刚开场。 经理人热议 @人生如梦饭如初(IP沪): 以前是‘来我们一起改变世界’,现在是‘来我们一起算算KPI’。滤镜碎了很正常,毕竟滤镜又不能当工资发。 @Shia7690(IP粤): 一边是高管拿着天价年薪,一边是基层连绩效奖金都发得不明不白。 @RADIOfan(IP冀): 这就是我为什么越来越不相信‘企业文化’这四个字。能经得起真金白银考验的,才是真文化。余下的,都是廉价装饰画。 @听汐哥(IP吉): 有个评论说得好:当增长神话破灭,大家就只能坐下来分存量蛋糕了。分蛋糕的刀不透明,那就别怪掀桌子。 @beawing996(IP贵): 哈哈,想当年多少人为了进Kakao挤破头,现在门前的标语比招聘广告还醒目。真是三十年河东,三十年河西。 @向清尔生(IPHK): 三星员工要求加薪的成功的案例教会了其他韩企:别谈梦,谈钱。透明地谈钱。 查看评论

V2EX - 技术 · 2026-06-11 10:46:55+08:00 · tech

任职要求: 1 、关注最新 Web 应用漏洞、系统漏洞,并迅速掌握漏洞利用方法,能够了解漏洞原理、利用方法以及修复方法; 2 、熟悉渗透测试流程,能够按照渗透测试框架进行渗透测试,拥有三年以上渗透测试项目经验优先: 3 、熟练使用 AWVS 、Burp Suite Pro 、SQLMap Metaspoloit 、Cosbalt Strike 等常见安全测试工具; 4 、熟悉 Windows 、Linux 平台的攻击技巧,了解 Apache Nginx 等中间件漏洞; 5 、熟练使用 Python 、Go 、PHP 、Shell 等一种及以上脚本语言,能够独立编写各类小工具及 EXP ,提高工作效率 6 、熟悉木马免杀,钓鱼,鱼叉以及水坑攻击: 7 、从事过打击黑灰产业、反诈类项目及做过案件服务优先。 8 、岗位偏渗透方向 9 待遇薪资详谈 PM:VEfvvJogQGxpbjFfNjg4ODg=