首页 文章 精选 留言 我的

精选列表

搜索[UTF-8编码],共10014篇文章
优秀的个人博客,低调大师

提升编码幸福感的秘密「GitHub 热点速览」

写代码是一个充满挑战的事情,在这段充满挑战的旅途中,我们都渴望找到那个提升幸福感的秘密。没准是更先进或是更快的工具,希望本期热点速递的开源项目,能给你带来启迪和乐趣,上菜! 第一个上场的是一款用 Rust 写的代码编辑器:Zed,因为它足够快、足够先进。全栈不等于全占 Expo 让你用一套代码到处运行,轻松拿下客户端。用过 Git 的小伙伴都知道,起项目时一个好的 .gitignore 文件能让你省去好多烦恼,GitHub 官方维护的 gitignore 拿去直接用。最后,热评的 JSON 可视化工具 JSON Crack 也不要错过呀! 对了,贾扬清博士开源的对话式 AI 搜索工具(Demo)有时间也可以玩一下,感受下新型搜索工具的交互模式。 本文目录 1. 开源新闻 1.1 500 行对话式 AI 搜索工具 1.2 “被”下架的开源项目 2. GitHub 热搜项目 2.1 超快的代码编辑器:Zed 2.2 快速开发移动端:Expo 2.3 用 Python 画架构图:Diagrams 2.4 Git 忽略文件的集合:gitignore 2.5 大语言模型课程:LLM-course 3. HelloGitHub 热评 3.1 优雅的 JSON 数据可视化工具:JSON Crack 3.2 可爱的 Mac 菜单栏日历:Itsycal 4. 往期回顾 下面,让我们一起看看,过去一周开源领域都发生了什么,关注开源最新动态、品热搜开源项目。 1. 开源新闻 1.1 500 行对话式 AI 搜索工具 该项目是贾扬清博士(PyTorch、TensorFlow 的核心贡献者之一)用 Python 做的 AI 搜索服务,仅作为对话式搜索的演示。后端用的是 FastAPI 框架,集成了多个自己服务比如 Mixtral-8x7b 模型和必应搜索的 API。 GitHub 地址→https://github.com/leptonai/search_with_lepton 小插曲,在贾扬清博士放出演示地址后,AI 搜索引擎 Perplexity 创始人认为这款产品参考了自家的 UI 界面设计,贾扬清博士也对此做出回应,表示他无意进入这个市场,该项目更多是作为演示和宣传自家 LeptonAI 云服务的一部分,并且从一开始就计划开源该项目。(然后这个项目就开源了) 1.2 “被”下架的开源项目 近期,海尔向一位海外开发者发出律师函,要求他从 GitHub 下架他维护的开源项目:Home Assistant。该项目是一个开源智能家电自动化平台,可以让用户控制海尔的智能家电,包括空调、净化器、冰箱等。 GitHub 地址→https://github.com/Andre0512/hOn 还有,国内的网易云音乐 API 开源项目:NeteaseCloudMusicApi,被网易云音乐公司起诉侵权,要求删除。该项目是作者用 Node.js 封装的第三方网易云音乐 API,很多网易云音乐的开源客户端都依赖它,目前该项目已删库,仅留下一句:“保护版权,此仓库不再维护”。 2. GitHub 热搜项目 2.1 超快的代码编辑器:Zed 主语言:Rust,Star:15.2k,周增长:1w+ 这是一款用 Rust 编写的代码编辑器,但并不只是 Rust 语言的编辑器。它的核心优势是在协作方面的强大,包括多人共享工作区、语音和文字聊天频道以及屏幕共享功能。它还具备丰富的功能,如支持 GitHub Copilot、精确的代码高亮、自动缩进、内置终端、Vim 模式和多种主题。性能方面更是出色,充分利用 CPU 和 GPU 资源,让启动和编辑过程流畅无比。 更刺激的是,Zed 编辑器的作者团队可不简单!他们由 GitHub Atom(5.9w Star 编辑器)和 tree-sitter(1.4w Star 语法解析框架)的开发者组成。该项目刚刚在上周正式开源,结果仅仅短短一周时间,它已经获得了超过一万个 Star!🤯 GitHub 地址→https://github.com/zed-industries/zed 2.2 快速开发移动端:Expo 主语言:TypeScript,Star:2.6w,周增长:200 这是一个使用 React 构建通用原生应用的开源平台,支持 Android、iOS 和 Web 开发。它可以让开发者使用 JavaScript/TypeScript 开发移动端和 Web 应用,一套代码多端运行。该项目包含完成的文档和丰富的示例项目,帮助开发者快速上手。 GitHub 地址→https://github.com/expo/expo 2.3 用 Python 画架构图:Diagrams 主语言:Python,Star:3.3w,周增长:500 该项目可以让开发者用 Python 代码绘制系统架构图,比如 Airflow 文档里的架构图就是用它画的。内含 AWS、Azure、Kubernetes 等资源,用于绘制系统架构图。 GitHub 地址→https://github.com/mingrammer/diagrams 2.4 Git 忽略文件的集合:gitignore 主语言:Markdown,Star:15w,周增长:300 该项目是由 GitHub 官方开源的 .gitignore 模版集合,不同项目的 gitignore 规则不同,这里提供了海量、实用、复制可用的 .gitignore 文件。 GitHub 地址→https://github.com/github/gitignore 2.5 大语言模型课程:LLM-course 主语言:Python,Star:2.1w,周增长:5.5k 这是个免费的 LLM 课程,包含面向新手入门 LLM 的基础知识,面向程序员和科学家的 LLMs 产品和部署 LLM 应用的知识和笔记。 GitHub 地址→https://github.com/mlabonne/llm-course 3. HelloGitHub 热评 在这个章节,将会分享下本周 HelloGitHub 网站上的热门开源项目,欢迎与我们分享你上手这些开源项目后的使用体验。 3.1 优雅的 JSON 数据可视化工具:JSON Crack 主语言:TypeScript 该项目不是简单的展示 JSON 数据,而是将其转化为类似脑图的形式,支持放大/缩小、展开/收缩、搜索节点、导出图片等操作,还可以快速部署成服务。 项目详情→https://hellogithub.com/repository/d914aef84cef4ceda13e2703779b51ba 3.2 可爱的 Mac 菜单栏日历:Itsycal 主语言:Objective-C 这是一个迷你的菜单栏日历工具,拥有可爱的界面和实用的功能。支持显示/添加系统日历的事件、深色模式、周数、快捷键等功能,适用于 macOS 11+ 系统。 项目详情→https://hellogithub.com/repository/a36f9c930d344ee6929fd84709237897 4. 往期回顾 往期回顾: 你和时间管理大师,就差一个开源工具 开源的代名词 以上为 2024 年第 5 个工作周的 GitHub Trending 🎉如果你发现其他好玩、实用的 GitHub 项目,就来 HelloGitHub 和大家一起分享下吧。

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

java安全编码指南之:lock和同步的正确使用

简介 在java多线程环境中,lock和同步是我们一定会使用到的功能。那么在java中编写lock和同步相关的代码之后,需要注意哪些问题呢?一起来看看吧。 使用private final object来作为lock对象 一般来说我们在做多线程共享对象的时候就需要进行同步。java中有两种同步方式,第一种就是方法同步,第二种是同步块。 如果我们在实例方法中使用的是synchronized关键字,或者在同步块中使用的是synchronized(this),那么会以该该对象的实例作为monitor,我们称之为intrinsic lock。 如果有恶意代码恶意获取该对象的锁并且释放,那么我们的系统将不能及时响应正常的服务,将会遭受到DOS攻击。 解决这种问题的方法就是使用private final object来作为lock的对象。因为是private的,所以恶意对象无法获取到该对象的锁,从而避免了问题的产生。 如果是在类方法(static)中使用了synchronized关键字,那么将会以这个class对象作为monitor。这种情况下,恶意对象可以通过该class的子类或者直接获取到该class,然后通过调用getClass()获取到class对象,从而进行加锁操作,让正常服务无法获取到锁。 所以,我们推荐使用private final object来作为lock对象。 下面举几个例子来说明: public class SynObject { public synchronized void doSomething(){ //do something } public static void main(String[] args) throws InterruptedException { SynObject synObject= new SynObject(); synchronized (synObject){ while (true){ //loop forever Thread.sleep(10000); } } } } 上面代码可能使我们最常使用的代码,我们在对象中定义了一个synchronized的doSomething方法。 如果有恶意代码直接拿到了我们要调用的SynObject对象,并且直接对其进行同步,如上例所示,那么这个对象的锁将永远无法释放。最终导致DOS。 我们看第二种写法: public Object lock = new Object(); public void doSomething2(){ synchronized (lock){ //do something } } 上面的例子中,我们同步了一个public对象,但是因为该对象是public的,所以恶意程序完全可以访问该public字段,并且永久获得这个对象的monitor,从而产生DOS。 再看下面的一个例子: private volatile Object lock2 = new Object(); public void doSomething3() { synchronized (lock2) { // do something } } public void setLock2(Object lockValue) { lock2 = lockValue; } 上面的例子中,我们定义了一个private的lock对象,并且使用它来为doSomething3方法加锁。 虽然是private的,但是我们提供了一个public的方法来对该对象进行修改。所以也是有安全问题的。 正确的做法是使用private final Object: private final Object lock4= new Object(); public void doSomething4() { synchronized (lock4) { // do something } } 我们再考虑一下静态方法的情况: public static synchronized void doSomething5() { // do something } synchronized (SynObject.class) { while (true) { Thread.sleep(10000); } } 上面定义了一个public static的方法,从而锁定的是class对象,恶意代码可以恶意占有该对象的锁,从而导致DOS。 不要synchronize可被重用的对象 之前我们在讲表达式规则的时候,提到了封装类对象的构建原则: 对于Boolean和Byte来说,如果直接从基础类值构建的话,也是同一个对象。 而对于Character来说,如果值的范围在\u0000 to \u007f,则属于同一个对象,如果超出了这个范围,则是不同的对象。 对于Integer和Short来说,如果值的范围在-128 and 127,则属于同一个对象,如果超出了这个范围,则是不同的对象。 举个例子: Boolean boolA=true; Boolean boolB=true; System.out.println(boolA==boolB); 上面从基础类型构建的Boolean对象其实是同一个对象。 如果我们在代码中使用下面的Boolean对象来进行同步,则可能会触发安全问题: private final Boolean booleanLock = Boolean.FALSE; public void doSomething() { synchronized (booleanLock) { // ... } } 上面的例子中,我们从Boolean.FALSE构建了一个Boolean对象,虽然这个对象是private的,但是恶意代码可以通过Boolean.FALSE来构建一个相同的对象,从而让private规则失效。 同样的问题也可能出现在String中: private final String lock = "lock"; public void doSomething() { synchronized (lock) { // ... } } 因为String对象有字符串常量池,直接通过字符串来创建的String对象其实是同一个对象。所以上面的代码是有安全问题的。 解决办法就是使用new来新创建一个对象。 private final String lock = new String("LOCK"); 不要sync Object.getClass() 有时候我们想要同步class类,Object提供了一个方便的getClass方法来返回当前的类。但是如果在父类和子类的情况下,子类的getClass会返回子类的class类而不是父类的class类,从而产生不一致对象同步的情况。 看下面的一个例子: public class SycClass { public void doSomething(){ synchronized (getClass()){ //do something } } } 在SycClass中,我们定义了一个doSomething方法,在该方法中,我们sync的是getClass()返回的对象。 如果SycClass有子类的情况下: public class SycClassSub extends SycClass{ public void doSomethingElse(){ synchronized (SycClass.class){ doSomething(); } } } doSomethingElse方法实际上获得了两个锁,一个是SycClass,一个是SycClassSub,从而产生了安全隐患。 在sync的时候,我们需要明确指定要同步的对象,有两种方法指定要同步的class: synchronized (SycClass.class) synchronized (Class.forName("com.flydean.SycClass")) 我们可以直接调用SycClass.class也可以使用Class.forName来获取。 不要sync高级并发对象 我们把实现了java.util.concurrent.locks包中的Lock和Condition接口的对象称作高级并发对象。比如:ReentrantLock。 这些高级并发对象看起来也是一个个的Lock,那么我们可不可以直接sync这些高级并发对象呢?看下面的例子: public class SyncLock { private final Lock lock = new ReentrantLock(); public void doSomething(){ synchronized (lock){ //do something } } } 看起来好像没问题,但是我们要注意的是,我们自定义的synchronized (lock)和高级并发对象中的Lock实现是不一样的,如果我们同时使用了synchronized (lock)和Lock自带的lock.lock(),那么就有可能产生安全隐患。 所以,对于这些高级并发对象,最好的做法就是不要直接sync,而是使用他们自带的lock机制,如下: public void doSomething2(){ lock.lock(); try{ //do something }finally { lock.unlock(); } } 不要使用Instance lock来保护static数据 一个class中可以有static类变量,也可以有实例变量。类变量是和class相关的,而实例变量是和class的实例对象相关的。 那么我们在保护类变量的时候,一定要注意sync的也必须是类变量,如果sync的是实例变量,就无法达到保护的目的。 看下面的一个例子: public class SyncStatic { private static volatile int age; public synchronized void doSomething(){ age++; } } 我们定义了一个static变量age,然后在一个方法中希望对其累加。之前的文章我们也讲过了,++是一个复合操作,我们需要对其进行数据同步。 但是上面的例子中,我们使用了synchronized关键字,同步的实际上是SyncStatic的实例对象,如果有多个线程创建多个实例对象同时调用doSomething方法,完全是可以并行进行的。从而导致++操作出现问题。 同样的,下面的代码也是一样的问题: private final Object lock = new Object(); public void doSomething2(){ synchronized (lock) { age++; } } 解决办法就是定义一个类变量: private static final Object lock3 = new Object(); public void doSomething3(){ synchronized (lock3) { age++; } } 在持有lock期间,不要做耗时操作 如果在持有lock期间,我们进行了比较耗时的操作,像I/O操作,那么持有lock的时间就会过长,如果是在高并发的情况下,就有可能出现线程饿死的情况,或者DOS。 所以这种情况我们一定要避免。 正确释放锁 在持有锁之后,一定要注意正确的释放锁,即使遇到了异常也不应该打断锁的释放。 一般来说锁放在finally{}中释放最好。 public void doSomething(){ lock.lock(); try{ //do something }finally { lock.unlock(); } } 本文的代码: learn-java-base-9-to-20/tree/master/security 本文已收录于 http://www.flydean.com/java-security-code-line-lock/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现! 欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

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

常见Serialize技术探秘(ObjectXXStream、XML、JSON、JDBC byte编码、Protobuf)

目前业界有各种各样的网络输出传输时的序列化和反序列化方案,它们在技术上的实现的初衷和背景有较大的区别,因此在设计的架构也会有很大的区别,最终在落地后的:解析速度、对系统的影响、传输数据的大小、可维护性及可阅读性等方面有着较大的区别,本文分享一些我在一些常见序列化技术的分析和理解: 文章分成3个部分: 1、列举常见的序列化和反序列化方案(ObjectXXStream、XML、JSON) 2、MySQL JDBC结果集的处理方案 3、Google Protocol Buffer处理方案 【一、常见的在API及消息通信调的用中Serialize方案】: 方案1、基于Java原生的ObjectOutputStream.write()和ObjectInputStream.read()来进行对象序列化和反序列化。 方案2、基于JSON进行序列化和反序列化

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册