首页 文章 精选 留言 我的

精选列表

搜索[云真机],共10000篇文章
优秀的个人博客,低调大师

别只把它当聊天框,让它「交付成品」才是真上手

用了一阵子,我发现新手最容易停在「问答」这一步——问完一句,得到答案,关掉,完事。但 WorkBuddy 真正好用的地方,是它能把一次对话变成「一个你关掉窗口也还在的东西」:一个能打开的网页、一份能打印的文档、一张能放进复盘里的图。前几篇我聊了先出方案、让它出图、把连接器和技能串起来;今天这篇就讲「交付」——怎么让它在聊完之后,真的给你留下一个能打开、能用的文件。我自己的那个备考小工具和杂志阅读器,其实都是这么一点一点「聊」出来的,不是谁一开始就写好了代码。

优秀的个人博客,低调大师

DeepSeek 大范围开放识图模式:不是 OCR,是真看图说话

4 月 28 日,DeepSeek 多模态团队研究员陈小康在 X 平台发布了一条意味深长的推文:「Now, we see you.」配图是 DeepSeek 标志性的蓝色鲸鱼 —— 左边戴着海盗眼罩,右边则睁开了双眼。这条推文随后被删除,但「鲸鱼开眼」的隐喻已经传开。 一天后的 4 月 29 日,DeepSeek 正式开启「识图模式」灰度内测。 而到5 月初,据多家媒体和用户反馈,该功能已大范围开放,「几乎所有测试账号都能看到入口」。不过,入口按钮上至今仍标注着一行小字:「图片理解功能内测中」。 可以看到,在网页端和 App 的对话界面中,「识图模式」作为第三个标签,与原有的「快速模式」「专家模式」并排出现在输入框上方。点击进入后,输入框旁会出现图片上传按钮,支持拖拽、粘贴或点击上传。 与市面上许多「上传图片→提取文字」的 OCR 工具不同,DeepSeek 强调这是深度图像理解—— 模型不仅能读取画面中的文字,还能理解场景氛围、物体关系、空间逻辑甚至文化语境。 根据灰度用户的广泛测试,识图模式在以下场景表现亮眼: 文物鉴定:上传一件玉器照片,非思考模式只能描述外观;开启深度思考后,模型准确识别为「清代痕都斯坦风格」,并给出纹饰和工艺分析。 截图转码:上传含 UI 界面的截图,模型能反向生成结构完整、可交互的 HTML 代码,复现按钮和跳转逻辑。 空间推理:解答立方体旋转与组装类题目,非思考模式容易出错,但深度思考后能给出正确结论(代价是耗时较长,约 4 分钟)。 表情包与梗图:能识别公众人物和动漫角色,并解读其中的幽默逻辑和情绪氛围。 地理推断:结合建筑特征和画面中的少量文字,推断出准确的地理位置并给出坐标。 处理效率方面,非思考模式下响应极快,一张 800×800 像素的图像仅消耗约 90 tokens。 多方实测推测,识图模式背后是一个独立于 DeepSeek-V4 Flash/Pro 的视觉理解模型,基于「Thinking with Visual Primitives」框架,属于挂载在 V4 主干上的视觉模块,而非 V4 原生的多模态能力。这也解释了为什么 V4 预览版(4 月 24 日发布)是纯文本模型,识图模式却在短短几天后即开启灰度 —— 这是两条独立的技术线。 识图模式并非万能。在极限测试中,它暴露出明显短板: 数手指 / 爱心测试:类似「图中有几只老虎」的计数题,模型容易幻觉,自我博弈后仍可能答错。 反色 / 碎块化图片:这类反直觉视觉任务基本失败。 复杂行测图形题:非思考模式下错误率较高,深度思考虽能解对但耗时惊人。 知识库滞后:对于较新的产品、游戏或机型,模型可能误判(如将小米 15 Ultra 误认为小米 11 Ultra)。 此外,该模式目前不支持图像生成、视频理解、以图搜图和二维码识别,HEIF 等部分图片格式也无法上传。 识图模式的灰度上线,标志着 DeepSeek 从纯文本正式迈入图文交互时代。官方技术报告曾将「将多模态能力融入模型体系」列为未来方向,而灰度上线的识图模式被视为向完整多模态过渡的阶段性产品。后续官方预告的 Vision 版本,可能会承载更原生、更完整的多模态功能。 对于已经获得入口的用户来说,这颗「睁眼的鲸鱼」值得亲自试试。

优秀的个人博客,低调大师

美国向谷歌、微软、雅虎要个人敏感信息,他们真给了

2021年10月,福布斯发布了一篇关于美国FBI秘密命令谷歌提供任何输入特定搜索词的人员数据。 当你在Google上搜索某一个关键词时,就有可能成为FBI的目标! 根据2019年的一宗绑架案案例显示,美国一名男子涉嫌绑架被FBI追捕。FBI曾经秘密要求谷歌提供在2019年内的某一个连续的16天内,任何搜索受害者姓名、其母亲电话和地址的所有人的信息,比如搜索相关词汇的Google账户和IP地址等。 另外,FBI还曾经对2018年袭击得克萨斯州奥斯汀的连环爆炸案进行关键词搜索,并要求谷歌、微软和雅虎交出所有搜索与炸弹制造有关的一系列术语的人的IP和账户信息。 FBI打击犯罪的行为本无可厚非,但由于FBI的此种行为都是秘密进行的,并没有对外披露,即便谷歌发言人明确表示:“和所有的执法要求一样,我们有一个严格的流程,以保护用户的隐私,同时支持执法工作。”但是,FBI的这种做法,还是引起了公民自由团体的担忧,认为FBI的这种做法,有可能窃取和侵害公民的隐私及敏感信息。 除了Google账户和IP地址外,FBI还会要求谷歌提供更多的信息,例如“CookieID”,也就是说,即使用户没有登录账号,也会被追踪。 FBI的搜查令还会公布绑架受害者的姓名、Facebook个人资料、电话号码和地址等信息。虽然目前已经得到改进,但这种做法仍然饱受争议。 利用搜索引擎打击犯罪,本来是一件好事,但在“空气都是自由”的美国,似乎别有一番味道。 搜索引擎一直是“科技是一把双刃剑”最好的诠释。 一方面,普通网民利用搜索引擎,快速检索自己想要的信息,获取全面、详尽的知识。另一方面,搜索引擎也是黑客们使用最多的工具之一。 经常使用搜索引擎,你一定知道一些高级搜索技巧,比如site:语法,它可以在特定的网址中搜索,在搜索引擎中输入site:www.zhihu.com,展示的结果就限制在知乎中。 再比如filetype语法,可以搜索特定的文件类型,在搜索引擎中输入“web安全 filetype:pdf”,就可以搜索到标题为“web安全”的pdf文件。 这些命令却也极大方便了黑客发动网络攻击的门槛。 举个例子,在Google上使用inurl语法(在URL中搜索出现指定内容的链接),搜索“php?id=”“jsp?id=”“asp?id=”等关键词,就可以找到可能存在SQL注入的链接。 再比如使用intitle语法(在网页title中搜索出现指定内容的网页),搜索类似“后台管理”的字样,便能找到一些网站的后台地址。 甚至还诞生了一个名为Google Hacking DataBase的网站,在这里汇集了很多google搜索语句,被白帽黑客们使用,固然可以造福整个互联网,反之也可以成为违法犯罪的滋生地。 鸿蒙官方战略合作共建――HarmonyOS技术社区 【责任编辑:赵宁宁 TEL:(010)68476606】

优秀的个人博客,低调大师

大厂面试真题:“JDK 线程池”如何保证“核心线程”不被销毁?

2 --> 前言 很早之前那个时候练习线程池, 就是感觉线程池类似于 ArrayList 这种集合类结构, 将 Thread类存储, 来任务了就进行消费, 然鹅... 线程包装类 线程池并不是对 Thread 直接存储, 而是对 Thread 进行了一层包装, 包装类叫做 Worker 线程在线程池中的存储结构如下: private final HashSet<Worker> workers = new HashSet<Worker>(); 先看一下 Worker 类中的变量及方法 private final class Worker extends AbstractQueuedSynchronizer implements Runnable { /** * 此线程为线程池中的工作线程 */ final Thread thread; /** * 指定线程运行的第一项任务 * 第一项任务没有则为空 */ Worker(Runnable firstTask) { ... this.firstTask = firstTask; this.thread = getThreadFactory().newThread(this); } /** * 运行传入的 Runnable 任务 */ @Override public void run() { runWorker(this); } } 通过 Worker 的构造方法和重写的 run 得知:线程池提交的任务, 会由 Worker 中的 thread 进行执行调用 addWorker 这里还是要先放一下线程池的执行流程代码, 具体流程如下: public void execute(Runnable command) { ... int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { // 【重点】关注方法 if (addWorker(command, true)) return; c = ctl.get(); } if (isRunning(c) && workQueue.offer(command)) { int recheck = ctl.get(); if (!isRunning(recheck) && remove(command)) reject(command); else if (workerCountOf(recheck) == 0) addWorker(null, false); } else if (!addWorker(command, false)) reject(command); } 我们具体看一下 ThreadPoolExecutor#addWorker private boolean addWorker(Runnable firstTask, boolean core) { ... // worker运行标识 boolean workerStarted = false; // worker添加标识 boolean workerAdded = false; Worker w = null; try { // 调用Worker构造方法 w = new Worker(firstTask); // 获取Worker中工作线程 final Thread t = w.thread; if (t != null) { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { int rs = runStateOf(ctl.get()); if (rs < SHUTDOWN || (rs == SHUTDOWN && firstTask == null)) { if (t.isAlive()) throw new IllegalThreadStateException(); // 如无异常, 将w添加至workers workers.add(w); int s = workers.size(); if (s > largestPoolSize) // 更新池内最大线程 largestPoolSize = s; workerAdded = true; } } finally { mainLock.unlock(); } if (workerAdded) { // 启动Woker中thread工作线程 t.start(); // 设置启动成功标识成功 workerStarted = true; } } } finally { // 如果启动失败抛出异常终止, 将Worker从workers中移除 if (!workerStarted) addWorkerFailed(w); } return workerStarted; } 这里需要着重关心下 t.start(), t 是我们 Worker 中的工作线程 上文说到 Worker 实现了 Runnable 接口, 并重写了 run 方法, 所以 t.start() 最终还是会调用 Worker 中的 run() @Override public void run() { runWorker(this); } runWorker ThreadPoolExecutor#runWorker 是具体执行线程池提交任务的方法, 大致思路如下: 1、获取 Worker 中的第一个任务 2、如果第一个任务不为空则执行具体流程 3、第一个任务为空则从阻塞队列中获取任务, 这一点也是核心线程不被回收的关键 runWorker() 中有两个扩展方法, beforeExecute、afterExecute, 在任务执行前后输出一些重要信息, 可用作与监控等... final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask; w.firstTask = null; w.unlock(); // allow interrupts boolean completedAbruptly = true; try { // 【重点】getTask() 是核心线程不被回收的精髓 while (task != null || (task = getTask()) != null) { w.lock(); ... try { beforeExecute(wt, task); Throwable thrown = null; try { task.run(); } ... } finally { afterExecute(task, thrown); } } finally { // 【重点】执行完任务后, 将Task置空 task = null; w.completedTasks++; w.unlock(); } } completedAbruptly = false; } finally { // 退出Worker processWorkerExit(w, completedAbruptly); } } 关键关注下 while 循环, 内部会在执行完流程后将 task 设置为空, 这样就会跳出循环 可以看到 processWorkerExit 是在 finally 语句块中, 相当于 获取不到阻塞队列任务就会去关闭 Worker 线程池是如何保证核心线程获取不到任务时不被销毁呢? 我们继续看一下 getTask() 中是如何获取任务 getTask ThreadPoolExecutor#getTask 只做了一件事情, 就是从线程池的阻塞队列中获取任务返回 private Runnable getTask() { boolean timedOut = false; // Did the last poll() time out? for (; ; ) { int c = ctl.get(); int rs = runStateOf(c); // Check if queue empty only if necessary. if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) { decrementWorkerCount(); return null; } int wc = workerCountOf(c); boolean timed = allowCoreThreadTimeOut || wc > corePoolSize; if ((wc > maximumPoolSize || (timed && timedOut)) && (wc > 1 || workQueue.isEmpty())) { if (compareAndDecrementWorkerCount(c)) return null; continue; } try { Runnable r = timed ? workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) : workQueue.take(); if (r != null) return r; timedOut = true; } catch (InterruptedException retry) { timedOut = false; } } } timed 重点代码从上面截出来, 首先是判断是否需要获取阻塞队列任务时在规定时间返回 /** * 【重点】判断线程是否超时, 这里会针对两种情况判断 * 1. 设置allowCoreThreadTimeOut参数默认false * 如果为true表示核心线程也会进行超时回收 * 2. 判断当前线程池的数量是否大于核心线程数 * * 这里参与了或运算符, 只要其中一个判断符合即为True */ boolean timed = allowCoreThreadTimeOut || wc > corePoolSize; 根据 timed 属性, 判断获取阻塞队列中任务的方式 /** * 【重点】根据timed判断两种不同方式的任务获取 * 1. 如果为True, 表示线程会根据规定时间调用阻塞队列任务 * 2. 如果为False, 表示线程会进行阻塞调用 */ Runnable r = timed ? workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) : workQueue.take(); 这里就比较清楚了, 如果 timed 为 True, 线程经过 非核心线程过期时间后还没有获取到任务, 则方法结束, 后续会将 Worker 进行回收 如果没有设置 allowCoreThreadTimeOut 为 True, 以及当前线程池内线程数量不大于核心线程 那么从阻塞队列获取的话是 take(), take() 会 一直阻塞, 等待任务的添加返回 这样也就间接达到了核心线程数不会被回收的效果 getTask流程 “图片本来是要放上面的, 但是画的实在有点不忍直视 ️” 核心线程与非核心线程区别 核心线程只是一个叫法, 核心线程与非核心线程的区别是: 创建核心线程时会携带一个任务, 而非核心线程没有 如果核心线程执行完第一个任务, 线程池内线程无区别 线程池是期望达到 corePoolSize 的并发状态, 不关心最先添加到线程池的核心线程是否会被销毁

优秀的个人博客,低调大师

取个数据包真麻烦!

网络部新员工 我叫Robert,是Linux帝国一个普通的公民。 今天是我第一天上班的日子,我下了好大功夫才考上了帝国的公务员,根据我的成绩,我被分到了帝国网络部。 一进入帝国的办公园区,我就被眼前的景象惊呆了,一座座高楼大厦,富丽堂皇,鳞次栉比,我忍不住驻足多看了几眼。 这些大楼上面都有招牌,最高的那一座是帝国的进程&线程管理部门的办公大厦,旁边还有内存管理部门、文件管理等部门办公大厦。 网卡驱动部门 我只顾东张西望,不小心跟旁边小路跑出来的一位小哥撞了一个满怀,他手里抱的一堆数据散落的满地都是。 我一边道歉,一边帮他捡起数据。 “这位小哥行色匆匆,不知要去哪里啊”,我好奇的问到。 “哦,你好,我是网卡驱动部门的,这是从网卡那里刚刚拿到的数据包,我得赶紧交给协议栈处理”,说完整理了下数据,就匆忙离开了。 寻着他出来的地方看去,不远处就是他说的网卡驱动部门,难道我办公的地方就在这里?我沿着这条小路走了过去。 一进入网卡驱动部门,出现在眼前的就是一副热火朝天的景象,收包的,解包的,发包的,一群人忙的不亦乐乎。 “这么早就这么忙碌了啊”,我问门口的保安大叔。 “是啊,这平时这个点也没什么网络访问,不知道今天怎么回事,一大早的数据就传输个不停”,保安说到。 我指着里面一个员工问保安:“大叔,那人在干嘛呢?一直在转来转去的” “你说他啊,他在从网卡轮询读取数据包呢!” “轮询?网络数据包不是网卡发中断通知吗,干嘛要去轮询呢?”,我不解的问到。 “以前是这样的,不过后来CPU那边有个叫阿Q的家伙不干了,说网卡数据太频繁,老是打断他们正常的工作。不仅如此,中断响应的时候还得把中断给关了,避免出现错误,时间久了,键盘、鼠标等单位就得不到响应纷纷闹事了”,保安说完点了一支香烟。 我若有所思的点了点头,“那现在就改成轮询了?不过这样好浪费时间哦” 保安吐了一个烟圈,继续说到:“倒也不是全都是轮询,现在把处理过程分成了两段,最开始的第一部分还是靠中断来通知的,这个时候需要关一下中断,不过通知后不会真正处理数据包,而是开启了一个软中断,所以关不了太久时间。第二部分在软中断中去轮询处理的,这个时候就不用关中断了。把硬中断和轮询结合了一下,就不用每个数据包来都中断一次了,也不用关中断太长时间,还给这技术取了个名字叫NAPI” “保安大叔,你怎么什么都知道啊?” “我以前就在里面工作啊,现在年纪稍微大了些,比不上年轻人,就让我来当保安了,唉~”,大叔说完又猛抽了一口香烟,整理了下自己日益稀疏的头发。 “唉,对了,你是谁啊,怎么没见过你?” “我是帝国网络部新来的员工,今天来报道的。我把手中的录取通知书递给了保安” 保安大叔看了看说到:“你走错了,不是这里,你该去网络协议栈大厦”。 协议栈大厦 离开网卡驱动部门,我继续前行终于找到了网络协议栈大厦,这便是我今后工作的地方了。 走近一看,这座网络大厦并不如前面看到的高大,只有三层高,每一层的墙上都挂着一个巨大的招牌,上面写着这一层的名字,从上向下分别是: 应用层 传输层 网络层 大厦的门口还有一个收发室,门牌上写着netif_receive_skb,收发室坐着一位大爷。 正在这时,先前碰到的小哥又来了,将手里的数据放到了收发室就离开了,看来这里就是网络协议栈的入口了。 大爷拆开这个数据包看了看,随即按了下按钮,数据包就顺着管道传到了背后协议栈大厦一楼的一个办公室,我抬头一看,上面写着IPv4。再向旁边看去,还有好几间办公室,分别写了IPv6、ICMP、IGMP、ARP··· 我来到这个IPv4的门口,里面也是忙的不亦乐乎,有分片的、组包的、计算校验和的、有条不紊。 办公室正中央有一个圆柱形的管道,通向了二楼,一楼处理完毕就通过这管道把数据包送了上去。 墙上还有另一个管道,上面写着netfilter hook,不知道是通向了哪里。 “你找谁?”,我正看得入神,里面一个负责人发现了我,我赶紧表明来意。 他看过我手中的录取通知书后说到,“你是在传输层啊,出门右拐上二楼就是了。我们这一楼都是网络层协议的办公室。” 我又看了下手里的录用通知书,这才发现被分配在了传输层工作。 传输层工作 来到二楼,总算见到了我的主管。 “Robert,欢迎加入网络部,工作岗位在传输层的TCP小组,大家欢迎!” “谢谢主管!谢谢大家!” “这是Cerf,你刚来,就让他先带带你,有什么不懂的就向他请教吧。” 我点头感谢,和一旁这个叫Cerf的握了握手。 接下来,主管向我介绍了咱们传输层的几个小组的情况:TCP、UDP、SCTP、UDP-lite······我这才知道,原来传输层不是只有TCP和UDP。 Cerf带我来到了工位,不愧是国有单位,无比宽敞,桌上还有一堆奇怪的设备。 “这是一堆什么东西啊”,我问Cerf。 “这些都是定时器,后面你工作处理TCP连接会用到的” 我点了点头,环顾四周,工位旁边的墙壁上还贴满了什么东西,我凑近了一看,才发现满满的都是RFC几千条的规定。 “好好看,以后的工作可是要天天用到这些东西呢”,Cerf略开玩笑的说着。 “这些我基本都背的下来了,要不然我也考不到这里来”,我笑着说,略带一些得意。 Cerf也笑了笑,“别大意,之前也有人也说过这话,后来还不是走了” 我有些尴尬,不知道说些什么,这时办公室中央的管道里冒出了一个数据包。 “Robert,你刚来,这个新的连接数据包就交给你来处理下,熟悉下工作流程”,主管说到。 我刚刚放松的心情一下紧张了起来,毕竟以前都是纸上谈兵,还从没有真正处理过数据包呢。 我小心翼翼的接过这个数据包,定位到TCP的头部,瞧了一眼标志位,发现SYN位是1,看来是有新的连接到来了,接下来不就是三次握手吗,我再熟悉不过了。 我准备了一个响应包,将SYN标记和ACK标记都点亮后,接下来就犯了难了。这个确认号ACK我倒是知道是对方的序列号+1,不过我回复的序列号该是多少呢?一时之间,不知道如何是好。 你们知道吗?在线等,挺急的。 未完待续······ 彩蛋 CPU一号车间的阿Q又闹脾气了。 “我们花了大量时间把网卡数据搬运到内存,重复又没有技术含量,我受够了!” 预知后事如何,请关注后续精彩······ 往期TOP5文章 CPU明明8个核,网卡为啥拼命折腾一号核? 因为一个跨域请求,我差点丢了饭碗 完了!CPU一味求快出事儿了! 哈希表哪家强?几大编程语言吵起来了! 一个HTTP数据包的奇幻之旅 本文分享自微信公众号 - 编程技术宇宙(xuanyuancoding)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

程序员们想说的是啥,你真听懂了吗?

如果你依然在编程的世界里迷茫,不知道自己的未来规划,可以加入JAVA架构学习交流群:835544715 里面可以与大神一起交流并走出迷茫。进群免费领取学习资料,看看前辈们是如何在编程的世界里傲然前行!群里不停更新最新的教程和学习方法(进群送JAVA架构视频资料),有想学习JAVA的,或是转行,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:835544715(点击链接加入群聊【JAVA高级架构】:https://jq.qq.com/?_wv=1027&k=5dbERkY)群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册