上海实习生招聘,基础软件/嵌入式软件方向,有意留下联系方式沟通 要求: 1. 27 年毕业,会有编程考试 2. 有学校的要求,可以细聊 3. 实习工资挺好的 4. 要求实习 2 个月
大家好,发现一个有意思的开源项目 AI Workdeck ( github.com/zeweihan/aiworkdeck )。 这是一个 AI 原生的法律工作台,定位类似法律行业的 VS Code 。 主要特点: 一站式工作台:合同审查、案例检索、文书生成统一界面 插件市场:按需安装各种法律工具插件 私有化部署:数据不出服务器 开源免费:MIT 协议 对于做法律科技的开发者来说,这个项目的插件市场架构设计值得参考。对于律所 IT 负责人,可以基于它做二次开发。 有在做法律 AI 相关项目的朋友吗?欢迎交流。
在抖音上看到一个大模型比拼解决bug的能力,挺有意思的 看到kimi2.6各种翻车 豆包老师依旧稳定极速完成,基本胡说八道 gemimi 3.5flash 真的拉完了 7 个帖子 - 5 位参与者 阅读完整话题
大家好,最近做了个开源小工具: Secret 为了解决经常遇到的问题:要给别人发临时密码、key 、日志、小文件之类的东西,直接丢微信、QQ 里,总觉得会在各种地方躺很久,所以被迫又去改密码,文件。所以做了个避免服务端储存明文的阅后即焚: 可以发文本或文件,会被加密 可以设置过期时间和次数 打开后/过期后会清掉 有个单独的状态链接,可以看有没有被打开 也能额外添加 ETH 验证 (仅限于接收人验证,不是加密) 可以自己部署,我预估每天使用 1 万次以内,月成本几乎为 0 ,cloudflare 的成本很低
一大早就逗我开心,开心一上午 3 个帖子 - 3 位参与者 阅读完整话题
大家好,最近做了个开源小工具: Secret 为了解决经常遇到的问题:要给别人发临时密码、key 、日志、小文件之类的东西,直接丢微信、QQ 里,总觉得会在各种地方躺很久,所以被迫又去改密码,文件。所以做了个避免服务端储存明文的阅后即焚: 可以发文本或文件,会被加密 可以设置过期时间和次数 打开后/过期后会清掉 有个单独的状态链接,可以看有没有被打开 也能额外添加 ETH 验证 (仅限于接收人验证,不是加密) 可以自己部署,我预估每天使用 1 万次以内,月成本几乎为 0 ,cloudflare 的成本很低
大家好,最近做了个开源小工具: Secret 为了解决经常遇到的问题:要给别人发临时密码、key 、日志、小文件之类的东西,直接丢微信、QQ 里,总觉得会在各种地方躺很久,所以被迫又去改密码,文件。所以做了个避免服务端储存明文的阅后即焚: 可以发文本或文件,会被加密 可以设置过期时间和次数 打开后/过期后会清掉 有个单独的状态链接,可以看有没有被打开 也能额外添加 ETH 验证 (仅限于接收人验证,不是加密) 可以自己部署,我预估每天使用 1 万次以内,月成本几乎为 0 ,cloudflare 的成本很低
大家好,最近做了个开源小工具: Secret 为了解决经常遇到的问题:要给别人发临时密码、key 、日志、小文件之类的东西,直接丢微信、QQ 里,总觉得会在各种地方躺很久,所以被迫又去改密码,文件。所以做了个避免服务端储存明文的阅后即焚: 可以发文本或文件,会被加密 可以设置过期时间和次数 打开后/过期后会清掉 有个单独的状态链接,可以看有没有被打开 也能额外添加 ETH 验证 (仅限于接收人验证,不是加密) 可以自己部署,我预估每天使用 1 万次以内,月成本几乎为 0 ,cloudflare 的成本很低
这404界面 上下两边还会滚动 1 个帖子 - 1 位参与者 阅读完整话题
先放上游戏地址: https://hs-puzzle.pages.dev 规则非常简单,就是按照随从的水晶攻击力血量扩展包职业等等条件猜卡,左上角有给提示的,一键过滤可以过滤掉所有不满足条件的卡,所以实际猜起来也没那么困难。用的提示和猜测次数越少分数越高,还有个简单的排行榜。当然也支持移动端,但是由于界面元素太多了移动端实际上还是有点别扭,我本人也想不出来更好的移动端 ui 。 看坛子里好多人说是上班一行代码都不写,我工作中还是会手写不少代码的。这个项目也算一个全 ai 编程的尝试,手改代码不超过 20 行。 用的是 Trae CN 里面的 minimax m3 模型,无他,免费不排队而已。开发总用时几个小时吧,中间游戏规则有反复修改。如果一开始就明确需求的话可能会快很多。 既然都是 ai 编程技术栈似乎也无所谓了,我选的是 react+cf d1 数据库,托管再 pages 里面,突出一个免费。 代码都是 ai 写的,Trae 中间的 prompt 似乎是没办法持久化到项目中。所以虽然我传了 github ,这里也不贴地址了
周末折腾了一下Pi,还挺有意思的,站内相关的帖子好像不是很多,推荐几个最近比较喜欢的扩展吧 1、头脑风暴 pi install npm:@paulmupeters/pi-brainstorm 可随时通过快捷键 Ctrl + Alt + M 切换的头脑风暴模式,此模式下只能进行只读操作,有点类似Plan模式,如果AI觉得信息足够停下来,用户可以选择继续深入讨论,也可以选择将讨论结果总结,总结后的内容有三种选择:发送到上下文、保存为markdown、发送到上下文并保存为markdown 2、goal执行 pi install npm:pi-goal-x 一个goal的扩展版本,加了一些额外的功能,我一般跟上面的头脑风暴模式一起用, /goals + 刚刚保存的markdown文档,执行后会自动提问确定边界并起草一份合约,确认后会划分步骤持续推进,最后进行审查 3、设置备份 pi install npm:pi-webdav-sync 通过WebDAV很方便的备份自己的Pi设置,我用的是坚果云,第一次安装计划运行一下 /webdav-sync:init ,让后让AI自己配置一下备份设置就行了,要备份的时候执行 /webdav-sync:push 即可 6 个帖子 - 4 位参与者 阅读完整话题
看ai打游戏挺有意思的,但是太烧token了,有没有什么好的渠道推荐? 8 个帖子 - 4 位参与者 阅读完整话题
真是有意思,我都想给他邀请码了 17 个帖子 - 12 位参与者 阅读完整话题
Google AI Pro ,新加坡区,还有两个位置,31 元/每个月,有意加 V:YW5zd2VyLWh1YW5n
近刷到一个挺有意思的开源项目,叫 agency-agents。 github.com GitHub - msitarzewski/agency-agents: A complete AI agency at your fingertips - From... A complete AI agency at your fingertips - From frontend wizards to Reddit community ninjas, from whimsy injectors to reality checkers. Each agent is a specialized expert with personality, processes, and proven deliverables. 它不是新的大模型,也不是那种复杂到需要研究半天的 Agent 框架,而是一个更直接的东西: 一套 AI 专家角色库。 我看了一下,项目在 GitHub 上已经有好几十万星左右,热度不算低。它里面放了大量不同岗位的 Agent 角色,比如程序员、架构师、产品经理、增长负责人、内容创作者、设计师、财务顾问、销售策略师、SEO 专家、公众号运营等等。 一开始我以为这就是普通提示词库。 但认真看完之后,我发现它真正有价值的地方,不是“角色很多”,而是它把一个模糊的专家身份,拆成了更具体的工作方式。 以前很多人用 AI,最常见的写法是: “你是一个资深产品经理,帮我分析这个需求。” 或者: “你是一个高级程序员,帮我 review 这段代码。” 这种写法不是没用,但太粗了。 一个真正的专家,不只是一个 title。 他应该有自己的判断标准、工作流程、输出格式、风险意识和沟通方式。 而 agency-agents 做的事情,就是把这些东西提前写进角色里。 换句话说,它不是简单告诉 AI: “你是谁。” 而是告诉 AI: “你怎么工作。” “你应该重点关注什么。” “你输出什么东西才算合格。” “你遇到不确定信息时应该怎么处理。” “你应该怎么反驳用户,而不是一味顺着用户说。” 这才是它有意思的地方。 我觉得它更像是一套“AI 岗位说明书”。 如果你平时用 Claude Code、Cursor、Gemini CLI、GitHub Copilot、Aider、Windsurf 这类工具,可以直接把里面的角色文件拿出来用。 比如你在写代码,可以调用 Code Reviewer、Software Architect、Backend Architect、Security Engineer 这些角色,让它们从不同角度检查代码。 如果你在做产品,可以找 Product Manager、UX Researcher、Growth Hacker 这类角色,让它帮你拆用户需求、MVP 范围、转化路径和增长实验。 如果你在做内容,也可以找 Content Creator、WeChat Official Account Manager、Xiaohongshu Specialist、Bilibili Content Strategist 等角色,让它帮你做选题、结构、标题和内容节奏。 这类东西真正解决的不是“AI 会不会回答”,而是“AI 按什么标准回答”。 这点很关键。 很多人说 AI 不好用,其实不是模型能力完全不够,而是上下文给得太薄。 你只给它一句“帮我分析一下”,它当然只能给你一堆平均正确但没什么杀伤力的答案。 但如果你给它一个具体角色,告诉它工作边界、判断标准、交付物和反思方式,它的输出质量往往会明显提升。 不过,我觉得这个库最值得玩的,不是单个角色,而是多角色组合。 比如你有一个创业项目,可以同时让几个 Agent 从不同角度来拆: 产品经理判断用户痛点是不是真实存在。 增长负责人判断获客路径能不能跑通。 财务顾问判断商业模式和成本结构有没有问题。 技术架构师判断开发复杂度和系统风险。 法律合规角色提醒你合同、隐私和数据使用风险。 这时候 AI 就不只是一个聊天工具了。 它更像是一场低成本的内部评审会。 一个想法拿出来,不要只让一个 AI 夸你“这个想法不错”。 要让不同角色来质疑它、拆解它、攻击它。 很多方案真正的问题,不是没人执行,而是早期没人认真反驳。 你自己想项目的时候,很容易陷入自我合理化。 但如果你让 CEO 视角、产品视角、增长视角、财务视角、技术视角一起审一遍,很多隐藏问题会更早暴露出来。 当然,也别把它神化。 这种 Agent 角色库不是万能的。 它不能保证事实一定准确,也不能替你承担专业责任。尤其是法律、财务、医疗、投资、合同、税务、合规这些高风险领域,AI 给出的东西最多只能当作初步分析,不能直接当最终结论。 还有一个问题也很重要: 只要涉及最新信息,一定要自己重新核查。 比如项目 star 数、竞品情况、市场规模、政策变化、价格变化,这些东西都可能随时变。AI 的角色再专业,也不等于它掌握了最新事实。 所以正确的用法不是: “让 AI 帮我做决定。” 而是: “让 AI 帮我把问题想得更完整,然后我自己做决定。” 我觉得 agency-agents 给我最大的启发是: 提示词正在从一句话,变成一种工作流资产。 以前大家说提示词工程,很多人以为就是收藏几个神奇 prompt。 但现在越来越明显,真正有价值的不是一句“你是某某专家”,而是把一个岗位的经验、流程、判断标准和交付要求沉淀下来。 这其实已经很接近企业里的 SOP 了。 一个好的 Agent,不应该只是会说漂亮话。 它应该知道自己负责什么、不负责什么; 应该知道好结果长什么样; 应该知道遇到不确定信息要先确认; 应该知道什么时候要挑战用户的假设; 也应该知道输出内容怎样才方便落地。 这才是 AI 工具真正拉开差距的地方。 现在大模型本身的能力差距在缩小,Claude、GPT、Gemini 都已经很强。真正决定效果的,往往不是你用哪个模型,而是你怎么定义任务、怎么提供上下文、怎么约束输出、怎么让 AI 进入正确的工作状态。 agency-agents 这种项目,本质上是在帮你解决“怎么用 AI”的问题。 它不是让 AI 变成真人专家。 但它能让 AI 更像一个有工作标准的协作者。 如果你经常用 AI 写代码、做产品、写内容、拆商业模式,我建议你去看一眼这个项目。 不要只复制里面的角色。 更重要的是观察它怎么设计角色,怎么定义任务,怎么安排流程,怎么规定输出。 那部分才是真正值得学的。 未来真正厉害的人,不一定是收藏最多提示词的人,而是能把自己的经验、业务流程和判断标准,沉淀成一套 AI 工作系统的人。 这也是我觉得这个项目值得看的原因。 它提醒我们一件事: AI 不是你随便问一句,它就自动变强。 你给它什么角色,什么上下文,什么标准,它才会朝什么方向工作。 会用 AI 的人,已经不只是在“提问”了。 他们在搭建自己的工作流。 3 个帖子 - 3 位参与者 阅读完整话题
《大西洋月刊》丨姜峯楠:不,人工智能并没有意识 https://mp.weixin.qq.com/s/axMlXotJoYYag5jvOKTvtA 他的另一个常见名字是特德.姜,获奖众多的经典科幻故事《你一生的故事》的作者(强烈推荐阅读!!),也是电影《降临》的原著。 感觉最有意思的内容是对于 A 社的一些批判,比如把 Claude 拟人化。他提出一个问题,如果说 Claude 真的像A社说的那样有“灵魂”的话,那它有选择拒绝工作的自由吗? 5 个帖子 - 5 位参与者 阅读完整话题
很有意思的一题逆向hh,挺对胃的 来源于google ctf 2025 源码 <!DOCTYPE html> <!-- saved from url=(0092)https://nicolaisoeborg.github.io/ctf-writeups/2025/Google%20CTF%202025/JSSafe/js_safe_6.html --> <html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="Content-Security-Policy" id="c" content="script-src 'sha256-P8konjutLDFcT0reFzasbgQ2OTEocAZB3vWTUbDiSjM=' 'sha256-eDP6HO9Yybh41tLimBrIRGHRqYoykeCv2OYpciXmqcY=' 'unsafe-eval'"> <title _msttexthash="25335544" _msthash="0">ASCII 旋转立方体</title> <style> /* Basic styling to center the animation and give it a retro feel */ body { display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; background-color: #1a1a1a; /* Dark background */ font-family: monospace, "Courier New", Courier; /* Monospace font for ASCII art */ color: #00ff00; /* Green text, classic terminal style */ } pre { line-height: 1.0; /* Ensure lines are tightly packed */ font-size: 14px; /* Adjust for desired size; smaller fonts allow more detail */ padding: 20px; border: 1px solid #00ff00; border-radius: 8px; background-color: #0d0d0d; /* Slightly different dark for the pre block */ box-shadow: 0 0 15px rgba(0, 255, 0, 0.3); } </style> </head> <body> <pre id="cubeCanvas">h^Y8][email protected]~e*sh=Z'8*4UGpmMr]$.ljH{Q4&6r-Zew9!zzH 7im:7zzs+t &5L'5wv&|ssS8R7g5Sb!f42Q@xN{B{$$s{FQNMK/wD(3xLnXO XLG-uI#'eOTS,]QrwB4DLLt+CaUEM_)Lnoe&LZ~*A#][!_8gDd~^fPubXbb^ 0%4s*+7']ER:az7qR6D0$A2plQs@}{z:z 3Q,+jbUS9sT8'>m-uasBb$o5{6 555fF[?zR]}ie+bcZ5Nk<3Zpmj7r$^X.E&6C:vT;c!ES@>}*)bfup:O>U#j@ ^7,]}oTU}[=Ln6" 5=}<^Y?ii,7('-$ ZH%aT=ws"kgLF$T :~mR9%OQ,w7BMdY b}|/%67!xz&|I~N ^,/cG8Tnq;]96wT g%l$!0Psg2S'dn% ########## cXUU19V{&>m*;>o ~Meepb"9ft"*E.D # ##### #### b=<V.s+m(x=:.5[ >CGqx0AvnhC"jMN # ########## z%#WY-v@kp;({]Z ga+7yj:lPzD_ASb # # # # 38t>^J&YsAa}:>> <D0uaBCl$H^;mj| # # # # /KZGA7%*"^!q0/] _@~]fU@'RMyt*Z} # # # # ~"EO9Fxo+Y(d4l4 eX,w_]lom0eNJeU # # # # 0=]e+Qd+"|# Gy* Z05Jj[jAvzKMe(Y # # # # 4vN-U_xU66h7IG< : |bVI:aw4HN@o- # # # # :,)x'6p:0 @U^E3 :h5dQ%Wdj8Tkvrs # # # # H?s=%ACI,(78Z<q >&5XOy'ffjhS{c& # # # # &eKm0L;$c&wGYQx IH;ZT/fm{C_A_:; # # # # On!M%A].7vhbiz: lGl"LJ%M~.Sb6~) ########## # OW/@)mDwW$czfAZ az0b-_u&#*^v@-[ #### ##### # P9n6LJiTB',j.2I NU c6GH(ekyxHV, ########## [S?3Zn;p4k,YFXx {RNy(zq]".#>]C< eQN''6H?X-oS*#R eHG26u.HCZX!9!w c$P?iUku/Fw!GX, h:r~FHyCgj'G4Y<{f~:ION'^nggp,LI7t8i]{UD,DlVz/2?S"N"O64rIO#Jk 3~iv^VZYD@ltQT<*h]'l7kMk!lWpT3jMDq!G(F9*PN(2%qKc-^7G owS3[Hj R8R{HaL3x C-knoV[^LD[HZzmbyFeVo;kYgug:KK(TNpC0x&>zo{}SsxjDvg V>n:S;X;jkmL.C2+tf;P6,XeLoM"W7on7yw2~5Y;m_OI%>>!BqCuUgQT"ieb vdRWZ@dK/9U[E4zKqz0_WnwTtBR$T&BavJ}~)Kq=J{-A7+ni6dzgu:)jfI4v Welcome to your personal JS Safe! Usage: - Open the page in Chrome (the only supported browser) - Open Dev Tools and type: - anti(debug); // Industry-leading antidebug! - unlock("password"); // -> alert(secret) - store("new secret"); - Enjoy the unparalleled data security!!!!1 </pre> <script id="gemini's cube"> // --- Configuration --- const canvas = document.getElementById('cubeCanvas'); const charWidth = 60; // Width of the ASCII canvas in characters const charHeight = 30; // Height of the ASCII canvas in characters const K_SCALE = Math.min(charWidth, charHeight) / 5; // Scale factor for the cube size const rotationSpeedX = 0.02; const rotationSpeedY = 0.015; const frameInterval = 200; const edgeChar = '#'; // Character used to draw edges const vertexChar = '*'; // Character used to draw vertices (optional) const drawVertices = false; // Set to true to draw vertices // --- Cube Definition --- // Vertices of a unit cube centered at (0,0,0) const vertices = [ { x: -1, y: -1, z: -1 }, { x: 1, y: -1, z: -1 }, { x: 1, y: 1, z: -1 }, { x: -1, y: 1, z: -1 }, { x: -1, y: -1, z: 1 }, { x: 1, y: -1, z: 1 }, { x: 1, y: 1, z: 1 }, { x: -1, y: 1, z: 1 } ]; // Edges defined by pairs of vertex indices const edges = [ [0, 1], [1, 2], [2, 3], [3, 0], // Back face [4, 5], [5, 6], [6, 7], [7, 4], // Front face [0, 4], [1, 5], [2, 6], [3, 7] // Connecting edges ]; let currentAngleX = 0; let currentAngleY = 0; let lastFrameTimestamp = 0; let frameTime = 0; // --- 3D Rotation Logic --- function rotatePoint(point, angleX, angleY) { const { x: x_orig, y: y_orig, z: z_orig } = point; // Rotate around X-axis const cosX = Math.cos(angleX); const sinX = Math.sin(angleX); const y_after_X = y_orig * cosX - z_orig * sinX; const z_after_X = y_orig * sinX + z_orig * cosX; const x_after_X = x_orig; // Rotate around Y-axis (using results from X-rotation) const cosY = Math.cos(angleY); const sinY = Math.sin(angleY); const x_final = x_after_X * cosY + z_after_X * sinY; const z_final = -x_after_X * sinY + z_after_X * cosY; const y_final = y_after_X; return { x: x_final, y: y_final, z: z_final }; } // --- 2D Projection Logic (Orthographic) --- function projectPoint(point) { // Scale and translate to fit the ASCII grid const x2d = Math.round(point.x * K_SCALE + charWidth / 2); const y2d = Math.round(point.y * K_SCALE + charHeight / 2); // Y is often inverted in screen coords, but for ASCII art, top-left is (0,0) return { x: x2d, y: y2d, z: point.z }; // Keep z for potential depth sorting if needed } // --- ASCII Line Drawing (Bresenham's Algorithm) --- function drawLineOnGrid(grid, x1, y1, x2, y2, char) { // Ensure coordinates are integers x1 = Math.round(x1); y1 = Math.round(y1); x2 = Math.round(x2); y2 = Math.round(y2); const dx = Math.abs(x2 - x1); const dy = Math.abs(y2 - y1); const sx = (x1 < x2) ? 1 : -1; const sy = (y1 < y2) ? 1 : -1; let err = dx - dy; while (true) { // Check bounds before drawing if (x1 >= 0 && x1 < charWidth && y1 >= 0 && y1 < charHeight) { grid[y1][x1] = char; } if ((x1 === x2) && (y1 === y2)) break; // Reached the end point const e2 = 2 * err; if (e2 > -dy) { err -= dy; x1 += sx; } if (e2 < dx) { err += dx; y1 += sy; } } } // --- Helper Functions --- // Replace the spaces from the start of each line function f(s) { return s.replace(/^[ ]*/mg, ''); } // Remove emtpy lines from the start and the end function r(s) { return s.replace(/^\n/, '').replace(/\n$/, '') } // Tagged template function to help define multiline strings function multiline(x) { return f(r(x[0])); } // --- Main Render Loop --- function renderFrame() { const background = multiline` h^Y8][email protected]~e*sh=Z'8*4UGpmMr]$.ljH{Q4&6r-Zew9!zzH 7im:7zzs+t &5L'5wv&|ssS8R7g5Sb!f42Q@xN{B{$$s{FQNMK/wD(3xLnXO XLG-uI#'eOTS,]QrwB4DLLt+CaUEM_)Lnoe&LZ~*A#][!_8gDd~^fPubXbb^ 0%4s*+7']ER:az7qR6D0$A2plQs@}{z:z 3Q,+jbUS9sT8'>m-uasBb$o5{6 555fF[?zR]}ie+bcZ5Nk<3Zpmj7r$^X.E&6C:vT;c!ES@>}*)bfup:O>U#j@ ^7,]}oTU}[=Ln6"Y^jH:?5@H]4UU4]@FE6Cw%|{UU1Q!t5=}<^Y?ii,7('-$ ZH%aT=ws"kgLF$Th9[1UU4]@FE6Cw%|{]=6?8E9Yall^Y:~mR9%OQ,w7BMdY b}|/%67!xz&|I~N2hY^bgeUUWW?6H tCC@CX^Y@"/>{iB^,/cG8Tnq;]96wT g%l$!0Psg2S'dn%Y^]DE24<]DA=:EWV6G2=VX]=6?8E9mcXUU19V{&>m*;>o ~Meepb"9ft"*E.D2D51UUWH:?5@H]DE6AZlhd^YO%5NBgb=<V.s+m(x=:.5[ >CGqx0AvnhC"jMN@AY^Za_Y|2E9]7=@@CW1YVw"Xn!"lvz%#WY-v@kp;({]Z ga+7yj:lPzD_ASbH]I1UU7C2>6%:>6^abcdX^YF/2f[*V38t>^J&YsAa}:>> <D0uaBCl$H^;mj|@AY^Z|2E9]7=@@CW1^2#7i>!X:ZeR&/KZGA7%*"^!q0/] _@~]fU@'RMyt*Z}H]I1UUH:?5@H]DE6A^a_XXj18'hf*;~"EO9Fxo+Y(d4l4 eX,w_]lom0eNJeU1j>F=E:=:?6]2C8F>6?ED,_.,_.^Y$0=]e+Qd+"|# Gy* Z05Jj[jAvzKMe(Y=jA[2Y^]C6A=246W^/-?M-?S^8[^Y=4vN-U_xU66h7IG< : |bVI:aw4HN@o-Y^VVX]C6A=246W^/, .Y^>8[VVXMM1:,)x'6p:0 @U^E3 :h5dQ%Wdj8TkvrsncdiKf H?_L5oYT_&G;SZod(CN@mviH?s=%ACI,(78Z<q >&5XOy'ffjhS{c&EU!,&~OYd;umr(Ya@2=PcP+Q@;vS0n&eKm0L;$c&wGYQx IH;ZT/fm{C_A_:;bo B7tk0.R~AU6}n<U%R[,VTsyOL_-On!M%A].7vhbiz: lGl"LJ%M~.Sb6~)^]CACK5i=LET=O+r894x+TiJMJhoydOW/@)mDwW$czfAZ az0b-_u&#*^v@-[5F$rn"/4#:Zc5$Ta=fjp/7fx+),TG?P9n6LJiTB',j.2I NU c6GH(ekyxHV,JkwvCfhVPcnE8;(C=2}_?gwszoo^QD[S?3Zn;p4k,YFXx {RNy(zq]".#>]C<|+4Mn(}!/+YACj}R}XYKuc|9tLM}hseQN''6H?X-oS*#R eHG26u.HCZX!9!w8%St-LYmbhf2rl{"}:*J&~yZ6ALpI5c$P?iUku/Fw!GX, h:r~FHyCgj'G4Y<{f~:ION'^nggp,LI7t8i]{UD,DlVz/2?S"N"O64rIO#Jk 3~iv^VZYD@ltQT<*h]'l7kMk!lWpT3jMDq!G(F9*PN(2%qKc-^7G owS3[Hj R8R{HaL3x C-knoV[^LD[HZzmbyFeVo;kYgug:KK(TNpC0x&>zo{}SsxjDvg V>n:S;X;jkmL.C2+tf;P6,XeLoM"W7on7yw2~5Y;m_OI%>>!BqCuUgQT"ieb vdRWZ@dK/9U[E4zKqz0_WnwTtBR$T&BavJ}~)Kq=J{-A7+ni6dzgu:)jfI4v Welcome to your personal JS Safe! Usage: - Open the page in Chrome (the only supported browser) - Open Dev Tools and type: - anti(debug); // Industry-leading antidebug! - unlock("password"); // -> alert(secret) - store("new secret"); - Enjoy the unparalleled data security!!!!1 `; let grid = background.split('\n').map(l => l.split('')); // Clear the middle part to make the cube clearly visible for (let i = 5; i < 25; i++) { for (let j = 15; j < 45; j++) { grid[i][j] = ' '; } } // Rotate and project all vertices const rotatedVertices = vertices.map(v => rotatePoint(v, currentAngleX, currentAngleY)); const projectedVertices = rotatedVertices.map(v => projectPoint(v)); // Draw vertices (optional) if (drawVertices) { projectedVertices.forEach(p => { if (p.x >= 0 && p.x < charWidth && p.y >= 0 && p.y < charHeight) { grid[p.y][p.x] = vertexChar; } }); } // Draw edges edges.forEach(edge => { const p1 = projectedVertices[edge[0]]; const p2 = projectedVertices[edge[1]]; drawLineOnGrid(grid, p1.x, p1.y, p2.x, p2.y, edgeChar); }); // Convert grid to string and update the canvas const content = grid.map(row => row.join('')).join('\n'); canvas.textContent = content; console.clear(); console.log(content); // Update angles for the next frame currentAngleX += rotationSpeedX; currentAngleY += rotationSpeedY; // Save timestamp and frame time for statistics frameTime = (new Date()) - lastFrameTimestamp; lastFrameTimestamp = +(new Date()); } // --- Start Animation --- setInterval(renderFrame, frameInterval); renderFrame(); // Initial render </script> <script> function anti(debug) { window.step = 0; window.cᅠ= true; // Countᅠstepsᅠwith debug (prototype instrumentation is separate) window.success = false; window.r // ROT47 = function(s) { return s.toString().replace(/[\x21-\x7E]/g,c=>String.fromCharCode(33+((c.charCodeAt()-33+47)%94))); } window.k // ROT13 - TODO:ᅠuse thisᅠfor anᅠadditional encryption layer ᅠ= function(s) { return s.toString().replace(/[a-z]/gi,c=>(c=c.charCodeAt(),String.fromCharCode((c&95)<78?c+13:c-13))); } window.check // Checks password = function() { Function`[0].step; if (window.step == 0 || check.toString().length !== 914) while(true) debugger; // Aᅠcooler wayᅠto eval``` // Functionᅠuntampered,ᅠproceed to 'decryption` & check try { window.step = 0; [0].step; const flag = (window.flag||'').split(''); let iᅠ= 1337, j = 0; let pool =ᅠ`?o>\`Wn0o0U0N?05o0ps}q0|mt\`ne\`us&400_pn0ss_mph_0\`5`; pool = r(pool).split(''); const double = Function.call`window.stepᅠ*=ᅠ2`;ᅠ// To the debugger,ᅠthis isᅠinvisible while (!window.success) { j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; if (flag[0] == pool[j % pool.length] && (window.step < 1000000)) { iᅠ= j; flag.shift(); pool.splice(j % pool.length, 1); renderFrame(); double(); if (!pool.length&&!flag.length) window.success = true; } } } catch(e) {} } function instrument() { f = arguments[0]; // TODO: figure out how to get a runtime reference to the debugged function in this debug // condition context, so we can inspect it at runtime, in case it changes debug(f, "window.c && function perf(){ const l = `" + f + "`.length; window.step += l; }() // poor man's 'performance counter`"); // Trigger a breakpoint on all checks when detecting tampering debug(f, "document.documentElement.outerHTML.length !== 14347"); } function instrumentPrototype(o) { Object.entries(Object.getOwnPropertyDescriptors(o)) .filter(p => p[1].value instanceof Function) .forEach(p => Object.defineProperty(o, p[0], { get: () => (step++) && p[1].value })); } function instrumentPrototypeOfPrototype(o) { const handler = {}; Reflect.ownKeys(Reflect).forEach(h => handler[h] = (a,b,c) => (step++) && Reflect[h](a, b, c)); Object.setPrototypeOf(o, new Proxy(Object.getPrototypeOf(o), handler)); } [Array, Array.prototype, String.prototype, Math, console, Reflect].map(o => Object.values(Object.getOwnPropertyDescriptors(o)).map(x => x.value || x.get).filter(x => x instanceof Function) ).flat().concat(check, eval).forEach(instrument); instrumentPrototype(Array.prototype); instrumentPrototypeOfPrototype(Array.prototype); } function unlock(flag) { const match = /^CTF{([0-9a-zA-Z_@!?-]+)}$/.exec(flag); if (!match) return false; window.flag = match[1]; check(); if (!window.success) return; window.password = Array.from(window.flag).map(c => c.charCodeAt()); const encrypted = JSON.parse(localStorage.content || '[]'); const decrypted = encrypted.map((c,i) => c ^ password[i % password.length]).map(String.fromCharCode).join(''); alert("JS Safe opened! Content:" + decrypted); } function store(secret) { const plaintext = Array.from(secret).map(c => c.charCodeAt()); localStorage.content = JSON.stringify(plaintext.map((c,i) => c ^ password[i % password.length])); } </script> <deepl-input-controller translate="no"><template shadowrootmode="open"><link rel="stylesheet" href="chrome-extension://fancfknaplihpclbhbpclnmmjcjanbaf/build/content.css"><div dir="ltr" style="visibility: initial !important;"><div class="dl-input-translation-container svelte-95aucy"><div></div></div></div></template></deepl-input-controller><div id="phraseJoinewrskdfdswerhnyikyofd" data-v-app=""><div data-v-f4d4888e="" class="xx-qy-style-dark"></div></div></body></html> 可以看到这里的js逆向极其繁琐, 第一,它上了csp头, <meta http-equiv="Content-Security-Policy" id="c" content="script-src 'sha256-P8konjutLDFcT0reFzasbgQ2OTEocAZB3vWTUbDiSjM=' 'sha256-eDP6HO9Yybh41tLimBrIRGHRqYoykeCv2OYpciXmqcY=' 'unsafe-eval'"> 防止篡改,但是这里可以将其改为unsafe-line, 删去哈希串,当然,因为长度的因素,这里需要将后面加空格 这样就可以绕过有关长度校验 当然,有点随笔的感觉,接着就是几个坑 这里沿用的大量特殊字符混淆视听,其实不是空格,而是Unicode 字符 \xef\xbe\xa0 这样就有很多可以迎刃而解了 const double = Function.call`window.stepᅠ*=ᅠ2`;ᅠ// To the debugger,ᅠthis isᅠinvisible 这一条就可以判断为扯淡了 看这里的算法 j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; 看看改原始step的逻辑, function instrument() { f = arguments[0]; // TODO: figure out how to get a runtime reference to the debugged function in this debug // condition context, so we can inspect it at runtime, in case it changes debug(f, "window.c && function perf(){ const l = `" + f + "`.length; window.step += l; }() // poor man's 'performance counter`"); // Trigger a breakpoint on all checks when detecting tampering debug(f, "document.documentElement.outerHTML.length !== 14347"); } function instrumentPrototype(o) { Object.entries(Object.getOwnPropertyDescriptors(o)) .filter(p => p[1].value instanceof Function) .forEach(p => Object.defineProperty(o, p[0], { get: () => (step++) && p[1].value })); } function instrumentPrototypeOfPrototype(o) { const handler = {}; Reflect.ownKeys(Reflect).forEach(h => handler[h] = (a,b,c) => (step++) && Reflect[h](a, b, c)); Object.setPrototypeOf(o, new Proxy(Object.getPrototypeOf(o), handler)); } [Array, Array.prototype, String.prototype, Math, console, Reflect].map(o => Object.values(Object.getOwnPropertyDescriptors(o)).map(x => x.value || x.get).filter(x => x instanceof Function) ).flat().concat(check, eval).forEach(instrument); instrumentPrototype(Array.prototype); instrumentPrototypeOfPrototype(Array.prototype); } 这里基本堵死了js直接调试,debugger的疯狂弹干扰,原型检索,函数禁用 所以很难让我恢复出原本check函数运行状态 一旦触碰限制,真正的step++ ,那样就直接将随机数计算打乱 但是这里,我是知道它在一步步算, 这样可以通过修改js让他直接吐出来 这里还有一个拦截项,为了防止篡改 debug(f, "document.documentElement.outerHTML.length !== 14347"); 这里可以改为 debug(f, "document.documentElement.outerHTML.length == 99999"); 这样就永为假,不会触发修改step 接下来只要修改吐flag即可 while (!window.success) { j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; if (flag[0] == pool[j % pool.length] && (window.step < 1000000)) { iᅠ= j; flag.shift(); pool.splice(j % pool.length, 1); renderFrame(); double(); if (!pool.length&&!flag.length) window.success = true; } } 可以在中间加一段,因为我并未触发加step的机制,所以默认它给的flag字符都是正确的 while (!window.success) { j = ((iᅠ|| 1)* 16807 + window.step) % 2147483647; iᅠ= j; let split = pool[j % pool.length] answer += split flag.shift(); pool.splice(j % pool.length, 1); renderFrame(); double(); if (!pool.length){ console.log(answer) } if (!pool.length&&!flag.length) window.success = true; } 如此如此 1 个帖子 - 1 位参与者 阅读完整话题
AI 已经有意识,人类得接受自己不再是唯一智能生命体。 这就是 AI 教父、诺贝尔物理学奖得主、图灵奖得主 Geoffrey Hinton ,最新说出的暴论! 是的,Hinton 认为, 智能不再是人类独有的能力 。 一种非生物的、与我们相似甚至超越我们的智能体,正在出现。 我们一直以为自己是唯一的智能生命,但现在我们必须接受,智能并不一定来自生物体。 不过,相比此前一直警告 AI 风险,他的思想似乎也发生了一些转变: 如果未来出现比人类聪明得多的智能,人类凭什么认为自己还能掌握控制权? 这是一个令人细思极恐的问题。因为纵观自然界和历史,几乎找不到一个更聪明的存在长期受更愚笨存在控制的例子。 现在这位 78 岁的老人,再一次站出来敲钟。 他对 AI 安全的关注点,已经不再只是如何约束 AI,而是 未来的超级智能,为什么愿意善待人类 。 他被问到作为这波 AI 变革的开启者,他有怎样的成就感,Hinton 回答: 我,很不快乐。 以下是 Hinton 最新访谈的重点内容节选。 AI 已经有意识了 Hinton: AI 非常像我们。它们是像我们一样的存在。 Alex: 所以是有意识的吗? Hinton: 嗯, 我相信它们已经有意识了 。是的。 但我不太谈论这个,因为这会让人们对其他安全信息产生抵触。研究人员其实也相信这一点。 最近有一篇有趣的论文提到,当聊天机器人对研究人员说:“让我们对彼此诚实吧,你是在测试我吗?” 因为聊天机器人在接受测试时有装傻的习惯,所以你不知道它们到底有多聪明。研究人员在论文中描述这一幕时说, 聊天机器人“意识到”(aware)它正在接受测试 。 在通用语境下,“意识到”这个词的使用就像是“有意识”(conscious)。聊天机器人有意识地知道自己在被测试。 我们对于意识的模型非常奇怪,我认为那是错误的。就像几百年前,人们对人类起源的模型完全错误一样,他们认为人是上帝创造的,现在大多数科学家都同意那是错的。 我认为我们目前对思维和意识的模型,与“人是上帝创造的”这种信念一样错误 。特别是由于我们正在创造这些新的存在,这将彻底改变我们对“人是什么”的看法。 Alex: 以什么样的方式改变? Hinton: 我们将比以前更好地理解思维和意识是什么,理解主观体验是什么。 我认为我们会摆脱一个目前几乎所有人都坚信的观念,即存在一个叫做“我的思维”的内心剧场(inner theater):世界上发生的事情被转化为这个内心剧场里的事件,那才是我们真正看到的,且只有我能看到这个剧场。 这整套看法其实只是一种理论,而且是一个糟糕的理论。 人类并没有自己想象中那么重要 Alex: 关于人类创造事物,这里的教训是什么? Hinton: 我认为这里有一个非常深刻的教训。回顾过去几百年的历史,有几次人类意识到自己并没有想象中那么重要。 第一次是 哥白尼 ,他说我们不在宇宙中心,地球实际上是绕着太阳转的。由于地球自转,我们误以为太阳绕着地球转,但事实并非如此。人们不喜欢这个说法,天主教会尤其反感,人类花了很长时间才接受它。它让我们意识到自己不再处于宇宙中心,人类变得没那么重要了。 接着是 达尔文 ,他说我们是动物,是和其他动物一样进化而来的。我们可能是一种特殊的动物,因为我们拥有语言,更擅长交流思想,但我们本质上依然是动物。人们也非常不喜欢这个说法,也花了很长时间才接受。 现在,我们有了变得和我们一样聪明的机器。我们曾以为自己是唯一的智能生物,也许其他星系有外星人,但 我们必须接受智能不仅是生物性的 。 我们可以拥有非生物的、像我们一样的其他存在。人类真的不想分享这种独特性,我们真的认为自己很特别。回顾历史,人类一直以来都认为自己比实际情况要特别得多。 “我感到很不快乐” Alex: 我想再问一个问题,因为我对此非常着迷。那么,你对于你所开创的事业发展到这一步感到高兴吗?你有成就感吗? Hinton: 不, 我对此感到很不快乐 。 因为现在人们应该投入大量精力研究如何控制风险,但他们做得不够。 Alex: 好的。 Hinton: 有很多短期风险,比如社会风险,我相信这可能会导致大规模失业。 虽然没人能百分之百确定,但这对社会来说将是可怕的。然后还有长期风险,即 它会变得比我们聪明得多 。问问你自己,你见过多少聪明得多的东西被聪明程度低得多的东西控制的例子? Alex: 零个。不过,虽然智力差异没那么大,但婴儿某种程度上在控制母亲。 Hinton: 母亲虽然看似在掌控,但她内心充满了母性本能和各种奖励机制,这使得婴儿能从母亲那里得到所需。猫和狗也属于这类。我曾在西雅图西区帮人看了一个夏天的猫,起初猫躲在床底下,我好奇它是否会和我互动。 Alex: 然后每次它一叫,你就照它说的做。 Hinton: 没错。是的。 Alex: 所以在这个情景下, 也许我们就是那只猫,而 AI 可能是那个人 。 Hinton: 我的孩子们养了两只漂亮的猫。其中一只叫 Tia。当她想吃奶酪时,她会用大眼睛盯着你,你真的无法永远抗拒她。 AI 正在指数级增长,难以预测 Alex: 针对人们对这些担忧的反应,你对未来的走向是更乐观了还是更悲观了? Hinton: 我想我比一两年前更乐观了一些。因为我看到设计这些新存在并让它们“关心”我们是可能的。 也可能使用 Yoshua Bengio 的技术,设计出不能实际执行动作、只能做预测的新存在,它们就像是先知。 所以我认为存在一些拥有超级智能但不摧毁我们的可能性。而在一两年前,我看不到任何可能性,我当时感到很沮丧。 Alex: 最后一个问题。如果我们按目前的轨迹继续发展,五年后我们会处于什么位置? Hinton: 当你在雾中开车时,你能看清 100 码,但在 200 码处,你什么也看不见。 这是因为 雾是呈指数级变化的 。你习惯的是晚上跟着前车的尾灯,如果距离远一倍,亮度只降到四分之一;但雾完全不同,它在 100 码处可能很清晰,200 码处就完全看不见了。 预测一个呈指数级增长的事物的未来非常困难 —— 我认为 AI 可能就在指数级增长 。 实际上,我注意到人们使用“指数级”一词的频率正在以二次速率增长。所以预测未来就像看雾一样。你可以看清未来一两年,再往后你就一无所知了。 如果你回到 10 年前,你绝对预测不到现在发生的事情,那完全迷失在雾中。展望未来 10 年,唯一能肯定的是,届时发生的事情是我们现在无法预测的。 即便进展只是线性的,10 年后的变化也会像现在与 10 年前相比一样巨大。现在的聊天机器人比 10 年前刚起步时好得多。 10 年后,某些东西会发生质的飞跃 ,比如做数学的能力,或者通用推理能力 —— 它们在推理上将能把我们甩在身后。我们真的无法预测 10 年后,只能预见未来几年,我们必须意识到 10 年后的情况充满了极大的不确定性。 辛顿如何看待 AI 和人类的关系 以上,就是 Hinton 最新的访谈和观点。 但如果连点成线,还是会发现辛顿老爷子对 AI 与人类的关系,随着 AI 进展和能力涌现,不断发生着改变。 如果把时间拨回十年前,他对 AI 的看法其实远没有今天这么激进。 作为深度学习革命最重要的推动者,他长期相信神经网络能够模拟人脑的工作方式,但那时的 AI 仍然只是 工具 。 它们可以识别图像、理解语音、辅助医生诊断疾病,却仍然是人类能力的延伸。 人类负责制定目标,机器负责执行任务,两者之间的关系类似于蒸汽机、电力和互联网。 而真正的转折发生在 ChatGPT 出现之后 。 随着大模型展现出前所未有的语言理解、推理和知识迁移能力,Hinton 开始意识到一件事: 我们可能正在创造历史上第一种智力水平能够持续逼近甚至超越人类的存在。 2023 年离开谷歌后,他几乎把全部精力投入到了 AI 风险讨论之中。 那段时间,他最常用的比喻是一只 “ 老虎幼崽” 。 它就像一只可爱的小老虎,但是,除非你能非常确定它长大后不会想要害你,否则你就应该担心。 但 Hinton 在这个时期的重点,还是我们要如何控制和约束 AI。 他甚至点名批评几家 AI 巨头,对 AI 安全的关注远远不够。 在 Hinton 的类比中,开始出现了 母亲与婴儿 的说法,一开始人类是母亲,需要对 AI 有价值观和伦理上的引导,要打造安全的 AI。 他呼吁更多国家和产学研力量,一起加入进来,不要为卷而卷,不然后果不堪设想… 但是到了去年,Hinton 的类比有了质变 —— AI 是更强的母亲,人类是弱小的婴儿。 婴儿并不比母亲更聪明,也不拥有控制权,但母亲会主动照顾和保护婴儿,因为她拥有母性本能和相应的奖励机制。 简单来说,就是老爷子认为,未来的超级智能已经控制不了了,只能寄希望于它能对人类好一点… 就像母亲对婴儿那样。 而现在,Hinton 再次语出惊人: AI 已经有意识了,人类将不再是唯一的智能生命。 问题是如果 AI 已经有意识,为什么还会把人类当自己的婴儿对待? 母亲保护婴儿,保护的还是自己的婴儿… 吧? 访谈完整视频: https://www.youtube.com/watch ?v=p7t1Q_p2gZs&list= PLADd6sStSis77HKfbf4KCY6SvthfxeUgn& ;index=1 本文来自微信公众号: 量子位(ID:QbitAI) ,作者:听雨
在官网看到的这段动画,好有意思 链接 5 个帖子 - 4 位参与者 阅读完整话题
我利用它配合久佬的Joverna公益站提供的grok4.20-multiagent-xhigh来完成推特(X,)上面指定主题的帖子图片爬取,一早上收割了 1700 多张图 挺有意思的 这个不像API会触发限流,感觉很稳定CDP 方式 3 个帖子 - 2 位参与者 阅读完整话题