智能助手网
标签聚合 app

/tag/app

linux.do · 2026-04-18 22:06:10+08:00 · tech

我个人观察到的现象是,会话创建后的首条消息正常,之后的消息会延迟数秒才能发出,在 mac 和 windows 平台都出现了此问题; 并且 mac 版本还出现了运行时 cpu 使用率过高,发热严重的问题。 github 上也有不少类似的反馈,首个发现的版本应该是 26.415.21839 ;有人反映关闭记忆功能后可绕过此问题,但对大多数人包括我自己无效,目前只能通过降级解决。 github.com/openai/codex Fix: Desktop App - Message send is delayed for ~8 seconds in new sessions after the latest update 已打开 04:31AM - 17 Apr 26 UTC JavierPiedra bug app session ### What version of the Codex App are you using (From “About Codex” dialog)? 26 … .415.21839 ### What subscription do you have? Pro ### What platform is your computer? Darwin 25.3.0 arm64 arm ### What issue are you seeing? ## Summary In the Codex desktop app, sending a message can take around 8 seconds before the message is actually sent. This appears to have started after the latest update. It did not happen in older sessions before. ## Environment - App: Codex desktop app - Codex version: `26.415.21839 (1763)` - macOS: `26.3.1 (build 25D771280a)` - Hardware: `MacBook Air (Apple M3, 24 GB RAM)` ## Actual behavior After pressing Enter to send a message, the message does not send immediately. Observed behavior: - The spinner appears in the send button - The message remains pending for about `8 seconds` - Lowering reasoning does not help This is affecting sessions created after the latest update. ### What steps can reproduce the bug? ## Reproduction Observed repro: 1. Open Codex desktop 2. Open a newer thread created after the latest update 3. Type a normal message 4. Press Enter 5. Observe the spinner in the send button and a delay of about `8 seconds` before the message is sent Additional observation: - In a brand-new thread, the first message sent immediately - The second message in that same new thread then started taking a very long time to send ## Scope / pattern - Happens in newer sessions created after the latest update - Did **not** happen in older sessions tested by the user - Not fixed by lowering reasoning - Seen with `GPT-5.4` and `Extra High`, but reasoning level does not appear to be the cause ### What is the expected behavior? ## Expected behavior Pressing Enter should enqueue and send the message immediately, or at least show near-instant client acknowledgment. ### Additional information ## Notes This feels like client-side send latency rather than raw network latency. Local diagnostics from the machine at the time: - Network path looked healthy in macOS logs - Codex renderer/helper processes showed noticeable CPU activity while the issue was occurring - No obvious network failure was visible from the local system logs ## Impact This makes normal back-and-forth use of Codex frustrating because even short messages feel blocked before they are sent. If you want, I can also compress this into a shorter GitHub-style version, or turn it into a more technical issue with a small `Additional diagnostics` section at the end. 本以为是梯子又出问题,但看了下发现是 app 的锅,记录一下 9 个帖子 - 8 位参与者 阅读完整话题

linux.do · 2026-04-18 22:05:59+08:00 · tech

<script setup> import { ref } from 'vue'; import { onLoad } from '@dcloudio/uni-app'; import request from '@/utils/request'; import { getFiles, getRandomFile, getFileArray } from '@/utils/yangUtils'; const imageSuffix = ['png', 'jpg', 'jpeg']; const videoSuffix = ['mp4', 'avi', 'mov']; const imageNum = ref(0); const videoNum = ref(0); // 获取父级传入的数据 const props = defineProps(["modelValue", "limit", "message", "isDelete", "isAdd"]); // 定义 emits const emit = defineEmits(['update:modelValue']); // const listData = ref(["https://yxdjpw.oss-cn-beijing.aliyuncs.com/uploadDefault/20260417192542-d3ea46.png", "https://yxdjpw.oss-cn-beijing.aliyuncs.com/uploadDefault/20260417194449-bfb1ba.mp4"]); const listData = ref([]) const onSelectFile = async () => { let result; // #ifdef APP || APP-PLUS || MP-WEIXIN || MP-TOUTIAO || MP-LARK || MP-JD || MP-HARMONY || MP-XHS result = await uni.chooseMedia({ count: props.limit || 9, mediaType: ['image', 'video'], sourceType: ['album', 'camera'], maxDuration: '30s' }) // #endif // #ifdef WEB || H5 result = await uni.chooseFile({ count: props.limit || 9, type: 'all', }) // #endif let arr = []; console.log(result); for (let filePath of result.tempFiles) { // 判断文件是否超出10M if (filePath.size > 10 * 1024 * 1024) { uni.showModal({ title: '提示', content: '文件大小不能超过10M!', showCancel: true, }) return; } if (imageSuffix.includes(filePath.name.replaceAll('"', '').split('.').pop()?.toLowerCase())) { imageNum.value++; } else if (videoSuffix.includes(filePath.name.replaceAll('"', '').split('.').pop()?.toLowerCase())) { // 判断之前有没有上传过视频或者图片 if (imageNum.value >= 1 || videoNum.value >= 1) { uni.showModal({ title: '提示', content: '图片和视频不能同时上传,并且视频只能上传一个!', showCancel: true, }) return; } videoNum.value++; } const data = await request("/upload/uploadFile", filePath.path, "post"); arr.push(getFileArray(data)[0]); } listData.value = listData.value.concat(arr); // 将数据返回出去 emit("update:modelValue", listData.value.join(",")); } // 删除 const onDelete = (index) => { // 1. 先拿到要删除的项(必须在 splice 之前拿!) const deletedItem = listData.value[index]; // 2. 判断类型,更新计数 const ext = deletedItem.split('.').pop()?.toLowerCase(); if (imageSuffix.includes(ext)) { imageNum.value--; } else if (videoSuffix.includes(ext)) { videoNum.value--; } // 3. 再删除元素 listData.value.splice(index, 1); // 4. 更新双向绑定 emit("update:modelValue", listData.value.join(",")); } // 查看 const onView = (item) => { } // 类型判断 const isSuffix = () => { return listData.value.some(item => { // 获取后缀(转小写,避免大小写问题) const ext = item.split('.').pop()?.toLowerCase() return videoSuffix.includes(ext) }) } </script> <template> <view> <view class="header"> <view v-if="props.message" class="message">{{ props.message }}</view> <view class="numCount">{{ `${listData.length}/${props.limit || 9}` }}</view> </view> <view class="image-grid" :class="isSuffix() ? 'grid-video' : ''"> <template v-for="(item, index) in listData" :key="index"> <view class="grid-item grid-item-content" :class="isSuffix() ? 'grid-item-video' : ''" @click="onView(item)"> <image v-if="imageSuffix.includes(item.split('.').pop())" class="img" :src="item" mode="aspectFill" /> <video v-else-if="videoSuffix.includes(item.split('.').pop())" class="video" :src="item" /> <view class="grid-item-delete" v-if="(isAdd ?? true)" @click="onDelete(index)"><uni-icons class="icon-delete" type="closeempty" color="#D3D4D6" size="24" /></view> </view> </template> <view class="grid-item icon-add" v-if="(isAdd ?? true) && !isSuffix() && listData.length < (props.limit ?? 9)" @click="onSelectFile()"> <uni-icons type="plusempty" size="60" color="#F1F1F1"></uni-icons> </view> </view> </view> </template> <style lang="scss" scoped> .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20rpx; } .image-grid { display: grid; grid-template-columns: repeat(3, 1fr); /* 一行3个,自动均分 */ gap: 20rpx; /* 格子间距 */ box-sizing: border-box; } .grid-item { width: 240rpx; height: 240rpx; } .grid-video { grid-template-columns: repeat(1, 1fr) !important; } .grid-item-video { width: 100%; height: 400rpx; } .numCount { display: flex; flex-direction: row-reverse; font-size: 26rpx; } .img, .video { width: 100%; height: 100%; } .grid-item-content { position: relative; } .icon-add { background: #FFFFFF; line-height: 240rpx; text-align: center; border: 1rpx solid #EEEEEE; border-radius: 6rpx; } .grid-item-delete { position: absolute; top: 0rpx; right: 0rpx; z-index: 1; } </style> 方法解析 文件后端返回的是 /api/upload/xxx.png getFiles 将图片拼接成正常能访问的 比如 http://域名.com/api/upload/xxx.png getRandomFile 是随机访问 getFileArray 是拼接成数组 limit → 最多上传数量 默认为9 message → 提示 比如请上传视频 可不填 isDelete → 是否可以删除重新上传 默认为true isAdd → 是否可以新增,比如有些地方可以直接回显 比如产品的图片,但是你不想让它显示新增的框 可以为false 默认为true // 文件加载 export const getFiles = (url) => { if (!url) { return ""; } if (url.startsWith("http://") || url.startsWith("https://")) { return cleanString(url); } else { return baseURL + cleanString(url); } }; // 随机加载文件 export const getRandomFile = (url) => { if (!url) { return ""; } const urls = url.split(","); const randomIndex = Math.floor(Math.random() * urls.length); const selectedUrl = urls[randomIndex]; if ( cleanString(selectedUrl).startsWith("http://") || cleanString(selectedUrl).startsWith("https://") ) { return cleanString(selectedUrl); } else { return baseURL + cleanString(selectedUrl); } }; export const getFileArray = (url) => { if (!url) { return []; } let baseUrl = []; url.split(",").forEach((v) => { if ( cleanString(v).startsWith("http://") || cleanString(v).startsWith("https://") ) { baseUrl.push(cleanString(v)); } else { baseUrl.push(baseURL + cleanString(v)); } }); console.log(baseUrl); return baseUrl; }; 请求就是 uni.request的请求 你们按照你们自己的改 当前只支持H5 你们需要的话 我会再更新 如果上传了视频就直接独占一行 并且不能上传其他视频和图片 仿照的是朋友圈 其他页面调用就是 比如文件名叫uploadFile.vue吧 import UpLoadFile from '@/components/uploadFile.vue' // 页面代码 <UpLoadFile v-model="form.media" /> 第一次封装 还有些问题 我会持续更新的 1 个帖子 - 1 位参与者 阅读完整话题

hnrss.org · 2026-04-18 20:17:13+08:00 · tech

150 applications. One offer. Each application took 5+ manual steps. Separate tools, separate tabs, separate sites — none of them talking to each other. Generic output. Over an hour per application. Paste a job description — or pull it from any job site with the Chrome extension — and five AI agents run an orchestrated pipeline in under 30 seconds: analyzing the role, scoring your fit, researching the company, writing a targeted cover letter, and tailoring your resume to the role. Sequential where it needs to be, parallel where it can be, each agent's output feeding the next. Also includes a dashboard to track every application. And tools for everything around it: interview prep with mock sessions, salary negotiation, job comparison, follow-ups, thank you notes, and references. Runs on your machine. No subscriptions, no data stored on our servers — just your own Gemini API key connecting directly to Google. Comments URL: https://news.ycombinator.com/item?id=47815326 Points: 1 # Comments: 0

linux.do · 2026-04-18 13:41:11+08:00 · tech

今早看到 Claude Design 发布了,正好准备用 Claude Code 开发一个 App 给我自己看论文用,奈何 Claude Code 自己设计的页面实在是没眼看。。。然后用 Claude Design 把页面截图+页面的代码发给它进行设计。 这是原始 Claude code 给我的页面: emm,我虽然不懂设计,没有具体的美学训练,但是一眼看下来就不好看,然后丢给Claude Design,他会出一个类似问卷的东西,有几个问题让我选(没截图这个页面的设计,所以放了一个其他页面的问题交互): 它会给我好几个风格的备选: 当然,也可以修改,我让他融合 A+C 在统一成卡片式的设计,最后又给了一个方案 D: 我很喜欢方案D,Claude Design 是分别给出了每个方案的代码的,我再把这些东西丢到 Claude Code 里就帮我实现的很好了 下面都是 Claude Design 跑出来,然后我用 Claude Code 实现后的运行截图: 额度跑的飞起,可能和我使用方式有关。。。跑一个页面,每周的 Claude Design 限制从 44% 涨到56%了 当然,页面布局对于专业人员来说肯定还能做的更好,但是对于我个人来说,已经相当相当满意了 1 个帖子 - 1 位参与者 阅读完整话题

www.ithome.com · 2026-04-18 12:45:30+08:00 · tech

Apple 产品京东自营旗舰店 4 月大促已开启,iPhone 17 Pro Max 以旧换新至高补贴 1300 元,指定产品享 24 期免息: 点此前往 。 iPhone Air 于去年 10 月 22 日开售,上市起售价为 7999 元。 今日京东自营叠加国补后仅需 5099 元,无需换新等额外操作,本次京东直接降。 此外,若大家所在地区的国补支持京东支付,本次活动还可享 12 期免息分期: 京东 iPhone Air 12+256GB 京东自营 国补后 5099 元 直达链接 iPhone 17 今日也支持 5099 元 +12 期免息哦: 京东 iPhone 17 8+256GB 京东自营 国补后 5099 元 直达链接

linux.do · 2026-04-18 12:15:23+08:00 · tech

render部署的cpa遇到Access blocked by Cloudflare. This usually happens when connecting from a restricted region (status 403 Forbidden), u rl: https://www.xxxx.top/v1/responses , cf-ray: 9ee0d216d8856e64-HKG 现在在本机使用codex会报错,尝试过切换网络、切换节点依然报错,直接访问网页是正常的。然而换了机器后是可以正常连接的。怀疑是被render的cf通过tls指纹给ban了。有佬友遇到过知道怎么解决吗? 1 个帖子 - 1 位参与者 阅读完整话题

hnrss.org · 2026-04-18 11:44:54+08:00 · tech

I found myself reaching for SF Symbols' 'Copy Image As…' quite often during agentic design sessions, so I made a command-line tool that the agent can use by itself. It exports Apple SF Symbols as SVG, PDF, or PNG. The vector paths come directly from macOS's symbol renderer. Internally it reaches a private ivar on NSSymbolImageRep to get the CUINamedVectorGlyph, draws into a CGPDFContext, then walks the PDF content stream back out as SVG `d` commands. The output matches what the system draws, rather than an approximation traced from rasters. A few things about it: - Every subcommand accepts `--json`, and `sfsym schema` returns a machine-readable description of the whole CLI. - Symbol enumeration reads the OS's Assets.car BOM tree, so the list of 8,300+ names stays current with macOS updates without a version table in the binary. - Each SVG ` ` carries a `data-layer` attribute, so you can retheme in CSS without touching geometry. It's been saving me a bunch of clicking. Please let me know if you have any other ideas for it. Comments URL: https://news.ycombinator.com/item?id=47812964 Points: 15 # Comments: 3

www.ithome.com · 2026-04-18 10:38:35+08:00 · tech

IT之家 4 月 18 日消息,谷歌开发者博客昨日(4 月 17 日)发布博文,宣布在安卓 17 Beta 4 更新中,计划主动终止占用资源过高的应用, 强制执行设备级内存限制与异常检测服务。 在安卓 17 Beta 4 更新中,谷歌为了进一步优化设备性能,引入基于设备总内存的应用内存限制机制。这一机制旨在通过设定确定性的内存边界,解决因个别应用内存失控导致的系统级不稳定问题。 该机制会实时监控异常服务,强制终止超出基准线的应用,倒逼开发者优化臃肿软件,解决卡顿问题。 在之前的安卓版本中,应用可使用的内存上限主要受限于 largeHeap 属性以及系统整体的内存压力(LMK - Low Memory Killer 机制)。 这种模式虽然灵活,但容易导致“劣币驱逐良币”, 单个内存泄露严重的应用可能占用过多资源,导致系统频繁杀后台、UI 卡顿甚至整机重启。 IT之家援引博文介绍,在安卓 17 系统中,系统根据设备的物理内存总量, 为应用设定了明确的内存使用上限。 在安卓 17 Beta 4 阶段,谷歌限制设定较为保守, 主要目标是建立系统基线,精准打击“极端内存泄漏”和“异常值”应用, 当应用的内存占用触及该上限后,系统将介入干预,防止其继续分配内存。 为协助开发者排查内存问题,Android Studio Panda 版本在性能分析器中集成了 LeakCanary 任务,并提供基于触发器的性能分析功能,可在应用触发内存限制或检测到异常行为时自动收集堆转储数据。 当应用因触及内存限制被终止后,系统会在 ApplicationExitInfo 的 getDescription () 方法中返回字符串标识 MemoryLimiter。开发者可以通过监听此标识,快速判断应用崩溃是否源于新的内存限制策略。 Android Studio Profiler 中的 LeakCanary 任务 该机制的核心目标是创造更稳定、更确定的运行环境,阻断因单个应用内存溢出引发的系统连锁反应(如 System UI 重启、设备发热),官方预计绝大多数合规应用不会受到此限制的影响,主要影响对象为存在严重内存泄漏或过度优化的异常应用。