首页 文章 精选 留言 我的

精选列表

搜索[标签页组],共10000篇文章
优秀的个人博客,低调大师

50 万行 Go 代码,美国一组织从 Python 2 迁移到 Go

美国教育非营利组织可汗学院(Khan Academy)方面透露,其已经用谷歌的 Go 编程语言完成了 50 万行代码,以取代此前用 Python 2 编写的后台服务器。根据介绍,可汗学院在其 Goliath 项目下实现了从 Python 2到 Go 的大转变。Goliath最初是使用 Python 2 实现的;从 2019 年开始,可汗学院逐步将其迁移到了 Go。 当我们开始 Goliath项目的时候,团队中没有人知道 Go,只是通过实验验证了 Go 是相较而言更好的选择。今天,我们所有的后端和全栈工程师都在写 Go,而我们对 Goliath 的渐进式交付也使我们跨越了一个重要的里程碑。现在有超过 50 万行的 Go代码在生产中运行。这似乎是对 Go 本身进行反思的一个好时机。 Python 2 于2020 年初到达EOL 阶段;鉴于此,可汗学院计划进行大规模迁移。对此,可汗学院的首席软件架构师 Kevin Dangoor曾表示,从 Python 2迁移到 3并不是一件容易的事。 他的团队曾认为 Kotlin 是一个有吸引力的选择,但最终还是选择了 Go;其工程师认为,和 Python 3相比,Go具有很大的性能优势。“由于 Go 的编译速度快得惊人,我们可以更快地进行迭代。此外,我们的团队成员拥有多年的经验和围绕许多不同编辑器建立的肌肉记忆。Go 比 Kotlin 更受各种编辑器的支持。” 很多可汗学院的工程师反馈称,Go 很容易写和读,并表示自己越是使用Go就越喜欢它。同时,Go 的错误处理、工具链以及编译速度也都收到了诸多好评。另一方面,可汗学院方面也表达了对泛型的需要。“虽然大多数情况下不需要泛型。但有时候,特别是是在写内部库,尤其是涉及到 slice 时,就会明显感觉到对泛型的需求...... 我们希望少写一点代码,而泛型提供的选项将对此有所帮助。” 最后,该组织总结称,虽然一般来说Go 比 Python 更冗长;但他们还是更喜欢 Go一些,因为它速度快、工具好用、并且在生产中运行良好。

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

复旦课题组发明单晶体管逻辑结构新原理,集成电路将革新

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 随着晶体管不断缩小特征尺寸,集成电路的性能得以持续提升。然而在超小器件尺寸下,硅材料的物理极限导致了功耗的大幅提升,难以进一步持续减小晶体管的特征尺寸 通过引入层状半导体,并依据其特性设计新型层状晶体管结构,发现可以通过单个晶体管实现逻辑门(与门、或门),而同样的逻辑门在传统结构中则需要两个晶体管。 这一新型晶体管结构极大的提高了晶体管的面积利用率,可以促进晶体管的特征尺寸持续缩小。 让一个人干两个人的活,所有的事在一个办公室里处理完成,这样是不是大大提升了效率,节省了成本?这种思路放在集成电路中也是一样的。 目前,集成电路已越来越紧密地和现代社会的生产生活联系在一起,但是,随着晶体管物理尺寸的不断微缩,短沟道效应等负面效应使得漏电流不可避免,功耗大、集成度提高困难、不确定性增加,限制了集成电路的发展。 针对这些问题,复旦大学微电子学院教授周鹏、张卫、曾晓洋携团队与计算机学院教授姜育刚展开合作,发现了新材料在集成电路中的更优应用方案,解决了如何用新材料、新原理和新架构继续延展摩尔定律的难题,实现了电路逻辑结构从无到有的原始创新。 5 月 27 日正值复旦大学 114 周年校庆日,相关成果以《小尺寸晶体管架构在可光控逻辑和原位存储器中的应用》(“Small footprint transistor architecture for photo-switching logic and in-situ memory”)为题在线发表于《自然·纳米技术》(Nature Nanotechnology)。 单晶体管逻辑结构示意图 “一个人干两人活”,提供“光控开关”切换选项 “我们这项研究工作的核心内容是利用原子晶体硫化钼做出了新结构晶体管。在此基础上,团队发明了单晶体管逻辑结构的新原理。新原理、新结构对原子晶体材料具有普适性。”周鹏解释道。 据介绍,研究团队采用与硅工艺兼容的双栅作为逻辑输入端,通过对创新引入的双导电通道加以独立控制,在单晶体管上实现了逻辑运算的“与”和“或”。 “与”和“或”是构成计算系统的最基本逻辑单元。 相比需要通过两个独立晶体管才能实现逻辑功能的传统体材料体系,该研究工作在逻辑门水平上缩小了 50% 的面积,有效降低了成本。“原先需要两个独立的晶体管才能实现逻辑功能,现在只需要一个晶体管,相当于一个人干两个人的活,这是研究工作的变革性之一。”周鹏补充。 同时研究中还发现了可层数调控的晶体管逻辑特性,并提供光切换逻辑功能的选项。周鹏解释,“简单来说,可光控逻辑相当于我们给逻辑做了一个光控开关,比如说有光照射时可能是‘或’逻辑,那么我们撤掉光线的话它就会切换成‘与’逻辑。当然反过来也是可以的。” 研究证明,该逻辑结构对原子晶体材料具有通用性,不仅适用于研究中已经验证的硫化钼,其它具有原子晶体属性的材料均可利用此架构实现可调控的逻辑功能。 通过进一步研究,发现该层状晶体管不但可以实现单一的逻辑门,而且可以通过外界的光照条件和沟道材料的厚度调控逻辑门的种类 现有的实验数据已经证明了,硫化钼沟道的厚度在大于 4nm 时,晶体管具备“或门”特性,而当沟道厚度减小到 4nm 以下时,可以通过光照条件在“与”门和“或”门之间自由切换。 这表明层状晶体管结构除了在面积利用率上有较大优势外,还具备更为丰富可控的特性。 “房间”合二为一,存算一体突破现有架构限制 新的逻辑架构可以通过器件级存算一体路径破解数据传输阻塞瓶颈问题,突破了现有逻辑系统中冯诺依曼架构的限制。 对存算一体、原位存储,周鹏打了个比方,“原先我们计算和存储数据需要两个房间跑,而现在所有数据的计算和存储都在同一个房间解决。” 在冯·诺依曼架构下,计算和存储是相互分离的。“就好比我们现在有两个房间,房间A专门用来计算数据,房间B用来存储数据,数据在经过计算之后要通过电子借由导线从房间A传输到房间B,这条导线就相当于连接两个房间的走廊。”周鹏解释道。随着技术的发展,数据的计算速度越来越快,与此同时存储速度和传输速度却未能得到同步提升。冯诺依曼架构的限制就主要体现在计算速度、存储速度和传输速度的不相匹配。 “我们假设,房间A已经打包了 100 份数据,却只有几十份数据能被即时传输出去;又或是房间A已经打包完 100 份,房间B才刚刚开始存储接收到的前几十份数据,这两种情况都会对数据的处理带来很大限制。”周鹏补充。 存算一体、原位存储的物理架构突破了冯诺依曼架构的限制。在这一架构中,只需要“一个房间”就可实现计算和存储的功能。“房间”内分层工作,***层负责计算,第二层负责存储,两个表层在垂直空间上形成堆叠。周鹏打比方:“就像两张纸摞在一起,它们在空间上是堆叠着的,数据的计算和存储只是在原地被相对抬高了一些而已。”计算层的沟道电流可以影响到存储层,从而摆脱传输环节,实现原位存储。 充分利用新材料特性,独辟蹊径继续延展摩尔定律 使用钢铁制造轮船、使用硅晶体制造芯片,人类在漫长历史中使用材料的本征属性来改造自然界。但周鹏发现,迄今的原子晶体电子器件研究工作仍然是用新材料模仿旧架构,无法真正发挥其优异的物理本质特性。 为走出窠臼,在着手该项研究的过程中,从材料本质优势出发设计新器件成为了团队的重要出发点。最终,正是超薄、表面无悬挂键等硫化钼特性的充分发挥,帮助其另辟蹊径地实现了集成电路逻辑结构上的革新,开拓了二维材料集成电路应用的新世界。 据周鹏介绍,团队对该工作的研究兴趣源自于目前国家发展对集成电路的重大需求,以及学界业界对延展摩尔定律(英特尔联合创始人戈登·摩尔曾提出集成电路上可容纳的元器件的数量每隔 18 至 24 个月就会增加一倍,性能也将提升一倍)、降低集成电路成本的尝试。单晶体管逻辑结构如果得以继续推进、应用于规模化生产,将推动集成电路往更轻、更快、更小、功耗更低的方向发展,促进集成电路产业的发展。“到那时,人们使用的手机、电脑等设备可能将更轻便、待机时间更长。”周鹏十分看好这一研究成果的发展前景,他表示,团队未来将探讨如何进一步突破冯诺依曼架构的限制。 复旦大学专用集成电路与系统国家重点实验室是研究工作的唯一单位。复旦大学微电子学院博士生刘春森及指导教师周鹏教授为共同***作者,复旦大学微电子学院教授张卫和周鹏为通讯作者。研究工作得到国家自然科学基金委优秀青年项目和“集成电路3-5 纳米节点器件基础问题研究”应急管理项目资助。

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

go-mir v5.0.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v5.0.1 发布了,v5 版本带来全新的 RESTful API 开发方式,提供媲美 gRPC 服务开发的体验,方便快捷,欢迎使用。 ​Mir 是一套提供类似 gRPC 服务开发体验的快速开发 RESTful API 后端开发脚手架,适配多种 HTTP 框架,包括Gin,Chi,Hertz,Echo,Iris,Fiber,Macaron,Mux,httprouter。 使用说明 生成样板项目 % go install github.com/alimy/mir/mirc/v5@latest % mirc new -h create template project Usage: mirc new [flags] Flags: -d, --dst string genereted destination target directory (default ".") -h, --help help for new --mir string mir replace package name or place -p, --pkg string project's package name (default "github.com/alimy/mir-example") -s, --style string generated engine style eg: gin,chi,mux,hertz,echo,iris,fiber,fiber-v2,macaron,httprouter (default "gin") % mirc new -d example % tree example example . |-- Makefile |-- README.md |-- go.mod |-- go.sum |-- main.go |-- mirc | |-- auto | | `-- api | | |-- site.go | | |-- v1 | | | `-- site.go | | `-- v2 | | `-- site.go | |-- gen.go | `-- routes | |-- site.go | |-- v1 | | `-- site.go | `-- v2 | `-- site.go `-- servants |-- core.go |-- servants.go |-- site.go |-- site_v1.go `-- site_v2.go % cd example % make generate % make run RESTful API 接口定义 // file: mirc/routes.go package routes import ( . "github.com/alimy/mir/v5" ) type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } // User user interface info type User struct { // 标示为 API Entry, group为v1, 带有中间件接口 Schema `mir:"v1,chain"` Login func(Post, LoginReq) LoginResp `mir:"login"` Logout func(Post) `mir:"logout"` } 代码生成 // file: mirc/auto/api/routes/v1.go // Code generated by go-mir. DO NOT EDIT. // versions: // - mir v5.0.0 package v1 import ( "net/http" "github.com/alimy/mir/v5" "github.com/gin-gonic/gin" ) type _binding_ interface { Bind(*gin.Context) mir.Error } type _render_ interface { Render(*gin.Context) } type _default_ interface { Bind(*gin.Context, any) mir.Error Render(*gin.Context, any, mir.Error) } type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } type User interface { _default_ // Chain provide handlers chain for gin Chain() gin.HandlersChain Login(*gin.Context, *LoginReq) (*LoginResp, mir.Error) Logout(*gin.Context) mir.Error mustEmbedUnimplementedUserServant() } // RegisterUserServant register User servant to gin func RegisterUserServant(e *gin.Engine, s User) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("POST", "login", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } req := new(LoginReq) if err := s.Bind(c, req); err != nil { s.Render(c, nil, err) return } resp, err := s.Login(req) s.Render(c, resp, err) }) router.Handle("POST", "logout", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } s.Render(c, nil, s.Logout(c)) }) } func (UnimplementedUserServant) Chain() gin.HandlersChain { return nil } func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} 接口实现 // file: servants/user.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/alimy/mir/v5" "github.com/gin-gonic/gin" ) type baseSrv struct{} func (baseSrv) Bind(c *gin.Context, obj any) mir.Error { if err := c.ShouldBind(obj); err != nil { mir.NewError(http.StatusBadRequest, err) } return nil } func (baseSrv) Render(c *gin.Context, data any, err mir.Error) { if err == nil { c.JSON(http.StatusOK, data) } else { c.JSON(err.StatusCode(), err.Error()) } } type userSrv struct { baseSrv api.UnimplementedUserServant // TODO: add other fields } func newUserSrv() api.User { return &userSrv{} } 服务注册 // file: servants/servants.go package servants import ( api "github.com/alimy/mir-example/v5/mirc/auto/api/v1" "github.com/gin-gonic/gin" ) // RegisterServants register all the servants to gin.Engine func RegisterServants(e *gin.Engine) { api.RegisterUserServant(e, newUserSrv()) // TODO: some other servant to register } 程序启动 // file: main.go package main import ( "log" "github.com/alimy/mir-example/v5/servants" "github.com/gin-gonic/gin" ) func main() { e := gin.Default() // register servants to gin servants.RegisterServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } 使用go-mir的项目 examples-go-mir自带的 demo,主要演示了如何使用Mir快速进行 RESTful API 的后端开 发; paopao-ce-一个清新文艺的微社区,提供类似 Twiter / 微博的推文分享服务; paopao-ce 通过使用go-mir更好、更便捷的开发 RESTful API 服务与 gRPC 服务。

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

go-mir v3.0.0 发布,用 Go 结构体标签定义 handler 路由信息的辅助库

go-mir v3.0.0 发布了,v3版本带来全新的RESTful API开发方式,提供媲美gRPC服务开发的体验,方便快捷,欢迎参考使用。 ​Mir 是一套提供类似gRPC服务开发体验的快速开发RESTful API后端开发脚手架,适配多种HTTP框架,包括Gin, Chi, Hertz, Echo, Iris, Fiber, Macaron, Mux, httprouter。 使用说明 生成样板项目 % go install github.com/alimy/mir/mirc/v3@latest % mirc new -h create template project Usage: mirc new [flags] Flags: -d, --dst string genereted destination target directory (default ".") -h, --help help for new --mir string mir replace package name or place -p, --pkg string project's package name (default "github.com/alimy/mir-example") -s, --style string generated engine style eg: gin,chi,mux,hertz,echo,iris,fiber,fiber-v2,macaron,httprouter (default "gin") % mirc new -d example % tree example example . |-- Makefile |-- README.md |-- go.mod |-- go.sum |-- main.go |-- mirc | |-- auto | | `-- api | | |-- site.go | | |-- v1 | | | `-- site.go | | `-- v2 | | `-- site.go | |-- main.go | `-- routes | |-- site.go | |-- v1 | | `-- site.go | `-- v2 | `-- site.go `-- servants |-- core.go |-- servants.go |-- site.go |-- site_v1.go `-- site_v2.go % cd example % make generate % make build RESTful接口定义 // file: mirc/routes.go package routes import ( . "github.com/alimy/mir/v3" . "github.com/alimy/mir/v3/engine" ) func init() { AddEntry(new(User)) } type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } // User user interface info type User struct { Chain Chain `mir:"-"` Group Group `mir:"v1"` Login func(Post, LoginReq) LoginResp `mir:"/login/"` Logout func(Post) `mir:"/logout/"` } 代码生成 // file: mirc/auto/api/routes.go // Code generated by go-mir. DO NOT EDIT. package routes import ( "net/http" "github.com/alimy/mir/v3" "github.com/gin-gonic/gin" ) type LoginReq struct { Name string `json:"name"` Passwd string `json:"passwd"` } type LoginResp struct { JwtToken string `json:"jwt_token"` } type User interface { // Chain provide handlers chain for gin Chain() gin.HandlersChain Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) Logout(c *gin.Context) mir.Error mustEmbedUnimplementedUserServant() } type UserBinding interface { BindLogin(c *gin.Context) (*LoginReq, mir.Error) mustEmbedUnimplementedUserBinding() } type UserRender interface { RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) RenderLogout(c *gin.Context, err mir.Error) mustEmbedUnimplementedUserRender() } // UnimplementedUserServant can be embedded to have forward compatible implementations. type UnimplementedUserServant struct { } // UnimplementedUserBinding can be embedded to have forward compatible implementations. type UnimplementedUserBinding struct { BindAny func(*gin.Context, any) mir.Error } // UnimplementedUserRender can be embedded to have forward compatible implementations. type UnimplementedUserRender struct { RenderAny func(*gin.Context, any, mir.Error) } // RegisterUserServant register User servant to gin func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("POST", "/login/", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } req, err := b.BindLogin(c) if err != nil { r.RenderLogin(c, nil, err) } resp, err := s.Login(c, req) r.RenderLogin(c, resp, err) }) router.Handle("POST", "/logout/", func(c *gin.Context) { select { case <-c.Request.Context().Done(): return default: } r.RenderLogout(c, s.Logout(c)) }) } func (UnimplementedUserServant) Chain() gin.HandlersChain { return nil } func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) } func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} func (b UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { obj := new(LoginReq) err := b.BindAny(c, obj) return obj, err } func (b UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} func (r UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { r.RenderAny(c, data, err) } func (r UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { r.RenderAny(c, nil, err) } func (r UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} 接口实现 // file: servants/user.go package servants import ( "github.com/alimy/mir-example/v3/mirc/auto/api" ) type userSrv struct { api.UnimplementedUserServant } type userBinding struct { *api.UnimplementedUserBinding } type userRender struct { *api.UnimplementedUserRender } func newUserSrv() api.Site { return &userSrv{} } func newUserBinding() api.SiteBinding { return &siteBinding{ UnimplementedSiteBinding: &api.UnimplementedSiteBinding{ BindAny: bindAny, }, } } func newUserRender() api.SiteRender { return &siteRender{ UnimplementedSiteRender: &api.UnimplementedSiteRender{ RenderAny: renderAny, }, } } func bindAny(c *gin.Context, obj any) mir.Error { if err != c.ShouldBind(obj); err != nil { return mir.NewError(http.StatusBadRequest, err) } return nil } func renderAny(c *gin.Context, data any, err mir.Error) { if err == nil { c.JSON(http.StatusOK, data) } else { c.JSON(err.StatusCode(), err.Error()) } } 服务注册 // file: servants/servants.go package servants import ( "github.com/alimy/mir-example/v3/mirc/auto/api" "github.com/gin-gonic/gin" ) // RegisterServants register all the servants to gin.Engine func RegisterServants(e *gin.Engine) { api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) // TODO: some other servant to register } 程序启动 // file: main.go package main import ( "log" "github.com/alimy/mir-example/v3/servants" "github.com/gin-gonic/gin" ) func main() { e := gin.Default() // register servants to gin servants.RegisterServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } 使用go-mir的项目 examples- go-mir自带的demo,主要演示了如何使用Mir快速进行RESTful API的后端开 发; paopao-ce - 一个清新文艺的微社区,提供类似Twiter/微博的推文分享服务; paopao-ce通过使用go-mir更好、更便捷的开发RESTful API服务与gRPC服务。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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部分的功能。

用户登录
用户注册