1.golang本地缓存(bigcache/freecache/fastcache等)选型对比及原理总结
2.golang调试利器 dlv 的源码使用姿势
3.红队最喜欢的18 种优秀的网络安全渗透工具
4.å¦ä½å好pythonèªå¨åè¿ç»´
5.游戏主程岗位职责
6.Golang源码分析Golang如何实现自举(一)
golang本地缓存(bigcache/freecache/fastcache等)选型对比及原理总结
以下内容来自腾讯后台研发工程师jayden
导语:提到本地缓存大家都不陌生,只要是探索个有点经验的后台开发人员,都知道缓存的源码作用和弊端。本篇文章我们就来简单聊聊在golang做业务开发的探索过程中,本地缓存的源码一些可选的开源方案,分析它们的探索付费源码街特点,以及内部的源码实现原理。
1.本地缓存需求分析
首先来梳理一下业务开发过程中经常面临的探索本地缓存的一些需求。我们一般做缓存就是源码为了能提高系统的读写性能,缓存的探索命中率越高,也就意味着缓存的源码效果越好。其次本地缓存一般都受限于本地内存的探索大小,所有全量的源码数据一般存不下。那基于这样的探索场景一方面是想缓存的数据越多,则命中率理论上也会随着缓存数据的源码增多而提高;另外一方面是想,既然所有的数据存不下那就想办法利用有限的内存存储有限的数据。这些有限的数据需要是经常访问的,同时有一定时效性(不会频繁改变)的。基于这两个点展开,我们一般对本地缓存会要求其满足支持过期时间、支持淘汰策略。最后再使用自动管理内存的语言例如golang等开发时,还需要考虑在加入本地缓存后引发的GC问题。
分析完我们日常本地缓存的诉求,再结合我们日常开发用到的golang语言,我们可以提炼得到golang本地缓存组件必须具备以下几个能力:
分析清楚了我们的需求,也明确了我们需要的能力。那自然优先考虑golang内置的标准库中是否存在这样的组件可以直接使用呢?很遗憾,没有。golang中内置的可以直接用来做本地缓存的无非就是map和sync.Map。而这两者中,map是非并发安全的数据结构,在使用时需要加锁;而sync.Map虽然是线程安全的。但是需要在并发读写时加锁。此外二者均无法支持数据的过期和淘汰,同时在存储大量数据时,又会产生比较频繁的GC问题,更严重的情况下导致线上服务无法稳定运行。
既然标准库中没有我们满足上述需求的本地缓存组件,那我们就想只有两种解决方案了
那首先面临的第一个问题就是方案的调研和选型,没有合适的方案时自己再来动手构建。下面我们就来给大家介绍下golang中哪些可以直接来使用的本地缓存组件吧。
2.golang本地缓存组件概览
golang中本地缓存方案可选的有如下一些:
下面通过笔者一段时间的调研和研究,将golang可选的开源本地缓存组件汇总为下表,方便大家在方案选型时作参考。
在上述方案中,freecache、bigcache、fastcache、ristretto、groupcache这几个大家根据实际的业务场景首选,offheap有定制需求时可考虑。
通过上表的总结,个人想再此再谈几点关于本地缓存组件的理解:
(1)上述本地缓存组件中,实现零GC的方案主要就两种:
a.无GC:分配堆外内存(Mmap)
b.避免GC:map非指针优化(map[uint]uint)或者采用slice实现一套无指针的map
c.避免GC:数据存入[]byte slice(可考虑底层采用环形队列封装循环使用空间)
(2)实现高性能的关键在于:
a.数据分片(降低锁的粒度)
3. 主流缓存组件实现原理剖析
在本节中我们会重点分析下freecache、bigcache、fastcache、offheap这几个组件内部的实现原理。
3.1 freecache实现原理
首先分析下freecache的内部实现原理。在freecache中它通过segment来进行对数据分片,freecache内部包含个segment,每个segment维护一把互斥锁,每一条kv数据进来后首先会根据k进行计算其hash值,然后根据hash值决定当前的这条数据落入到哪个segment中。
对于每个segment而言,它由索引、数据两部分构成。
索引:其中索引最简单的link源码解析方式采用map来维护,例如map[uint]uint这种。而freecache并没有采用这种做法,而是通过采用slice来底层实现一套无指针的map,以此避免GC扫描。
数据:数据采用环形缓冲区来循环使用,底层采用[]byte进行封装实现。数据写入环形缓冲区后,记录写入的位置index作为索引,读取时首先读取数据header信息,然后再读取kv数据。
在freecache中数据的传递过程是:freecache->segment->(slot,ringbuffer) 下图是freecache的内部实现框架图。
总结: freecache通过利用数据分片减小锁的粒度,然后再存储时索引并没有采用内置的map来维护而是采用自建map减少指针来避免GC,同时数据存储时采用预先分配内存然后后边循环使用。通过上述两种方法保证了在堆上分配内存同时减少GC对系统性能的影响。
3.2 bigcache实现原理
bigcache和freecache类似,也是一个零GC、高性能的cache组件,但是它的实现和freecache还是有些差异,这儿有篇 英文博客介绍bigcache设计原理的,内容稍长感兴趣的可以阅读下,下面我们介绍一下bigcache的实现原理。
bigcache同样是采用分片的方式构成,一个bigcache对象包含2^n 个cacheShard对象,默认是个。每个cacheShard对象维护着一把sync.RWLock锁(读写锁)。所有的数据会分散到不同的cacheShard中。
每个cacheShard同样由索引和数据构成。索引采用map[uint]uint来存储,数据采用entry([]byte)环形队列存储。索引中存储的是该条数据在entryBuffer写入的位置pos。每条kv数据按照TLV的格式写入队列。
不过值得注意的是,和bigcache和freecache不同的一点在于它的环形队列可以自动扩容。同时bigcache中数据的过期是通过全局的时间窗口维护的,每个单独的kv无法设置不同的过期时间。
下面是bigcache的内容实现原理框架图。
总结:bigcache思路和freecache大体相同,只不过在索引存储时更为巧妙,直接采用内置的map结构加上基础数据类型来实现。同时底层存储数据的队列也可以根据空间大小来决定是否扩容。唯一的缺陷是无法针对每个key进行设置不同的过期时间。这个个人认为如果想用bigcache同时想要这个特性,可以进行二次开发一下。
通过 性能测试数据来看,bigcache性能要比freecache稍微好一点。大家可以思考下他们性能的差异可能会在哪里呢?
3.3 fastcache实现原理
本节介绍下fastcache的实现原理,根据fastcache官方文档介绍,它的灵感来自于bigcache。所以整体的思路和bigcache很类似,数据通过bucket进行分片。fastcache由个bucket构成。每个bucket维护一把读写锁。在bucket内部数据同理是索引、数据两部分构成。索引用map[uint]uint存储。数据采用chunks二维的切片(二维数组)存储。不过值得注意的是fastcache有一个很大的特性是,它的内存分配是在堆外分配的,而不是在堆上分配的。堆外分配的内存。这样做也就避免了golang GC的影响。下图是fastcache内部实现框架图。
总结: fastcache一方面充分利用了分片来降低锁的粒度,另一方面在索引存储时采用了对map的优化,同时在分配内存时,直接从堆外申请内存,cpp的源码自己实现了分配和释放内存的逻辑。通过上述手段使得GC的影响降到了最低。fastcache唯一的缺陷是官方提供的版本没有提供针对kv数据的过期时间这个特性。所以如果需要这个特性的话,需要自己动手二次开发。整体从性能上来看是比bigcache和freecache都更优。
3.4 offheap实现原理
本节介绍下offheap的相关内容,offheap其实功能就比较简单了,就是一个基于堆外内存构建的哈希表。它通过直接调用系统调用函数来分配内存。然后在内部通过数组来实现哈希表。实现过程中当发生哈希冲突时,它是采用探测法来解决。由于是在堆外分配的内存上构建的哈希表。导致它的GC开销非常的小。下图是offheap的内部实现框架图。
总结:offheap内部由于是采用探测法解决哈希冲突的,所以当哈希冲突严重时数据删除、查询都会带来非常复杂的处理流程。而且性能也会有一些损耗。可以作为学习和研究的项目还是非常不错的。
4.总结
本文主要从日常需求出发,分析了日常业务过程中对本地缓存的需求,再调研了业界可选的一些组件并进行了对比,希望对本地缓存选型上起到一些参考和帮助。最后再对其中比较重要的几个组件如freecache、bigcache、fastcache、offheap等做了内部实现的简单介绍。上述内容只是从架构层面展开介绍,后续有时间再从源码层面做一些分析。由于篇幅限制本篇内容并未对map、sync.Map、go-cache、groupcache进行介绍。感兴趣的读者可以自行搜索资料进行阅读。如果大致理解了上述原理的童鞋也可以自己动手实践起来,造个轮子看看。
5.参考资料
欢迎点赞分享,关注 @鹅厂架构师,一起探索更多业界领先产品技术。
golang调试利器 dlv 的使用姿势
面对云原生部署带来的挑战,本地开发环境与集群间的网络隔离使得调试工作变得复杂。访问集群内数据库和依赖服务的困难性迫使开发者在本地无法完成充分调试,而频繁编译和部署以完善日志收集的繁琐操作显著降低了开发效率。回想过去在单应用程序开发时,借助编辑器提供的功能,可以在本地轻松实现修改与调试。然而,在容器环境下,安装编辑器进行调试成为不可能的任务。在这种背景下,我们迫切需要一种轻量级、易于在Linux环境中操作的调试工具,能够提供快速、高效的问题诊断解决方案。
在这里,dlv(Go Debugging Library)脱颖而出,成为理想的调试利器。它不仅能够在容器环境下提供便捷的调试功能,甚至在熟练使用后,其调试效率可能超越传统的编辑器调试方式。dlv的成功之处在于其简洁易用的特性,使得开发者能够如同操作ls、cat等命令般熟练掌握。
dlv的安装过程相对简单。通过访问其GitHub仓库,麒麟网源码开发者可以直接通过`go install`命令将其安装至本地的`$GOPATH/bin`目录下。在容器环境下,考虑到可能无法安装Go环境,可以采取将本地dlv二进制文件复制至`$PATH`目录中的方法来实现安装。安装完毕后,通过执行`dlv version`命令验证其可用性。
在调试过程中,dlv提供了一系列实用的命令和功能。对于已存在的进程,`attach`命令尤为关键,它允许开发者直接接入运行中的进程进行调试,尤其是在处理Web应用程序时极为便利。而针对没有现成进程、仅有一个二进制可执行文件的情况,`exec`命令则能够启动进程并进行调试。通过`--`参数,开发者还可以为程序传递所需的额外参数,使得调试过程更加灵活高效。
在深入调试时,`debug`命令允许直接跳入源码文件进行调试,省去了手动编译的步骤,只需指定包名和源码存放的文件夹即可。对于测试文件的调试,虽然使用频率较低,但`test`命令同样提供了相应的支持。此外,`help`命令提供了详细的使用手册,而`version`命令则用于查看dlv的版本信息。
掌握dlv的调试指令是实现高效调试的关键。执行这些指令后,开发者可以实现诸如单步执行、查看变量值、退出当前函数等操作,从而更深入地探索代码运行时的行为。断点管理功能允许开发者对断点进行增删改查,其中使用`break`命令创建断点时,提供了多种方法供选择。进一步地,`debug`命令的使用则能够直接控制程序执行流程,而`locals/vars/display`命令则提供了对变量和参数的管理,这些功能都支持正则表达式的指定,具体用法可以通过`h locals`命令查看。
掌握dlv的使用技巧不仅能够辅助日常调试工作,还能在深入分析项目原理时提供强大的支持。本文仅介绍了dlv的基本使用姿势,未来在其他原理性分析的文章中,我们也将持续探索并应用这一工具,以实现对源代码更深层次的理解和掌握。
红队最喜欢的 种优秀的网络安全渗透工具
Bishop labs用了两期博客,前后各总结了9个红队工具,共计个红队使用的优秀渗透工具,其博客文章也提及,这份清单不是决定性的,也仅用于参考。创建者: @IAmMandatory
用途:允许 谷歌 Chrome 浏览器将受害者的浏览器变成测试代理。
优点: CursedChrome 可以很容易地在红队参与期间模拟恶意浏览器扩展。用来劫持 Chrome 浏览器,绕过大多数 2FA 或其他可能存在的安全保护,并利用 cookie 来访问任何基于网络的目标。
创建者: @symbolcrash1
用途: Universal Loader 是一个 Golang 库,可以跨多个平台(Linux、Windows 和 OSX)从内存中加载共享库,而无需CGO。
优点: Universal Loader 可以用在新的 Apple M1 芯片上,值得一提的是,这个 Golang 库没有使用 memfd,这使它成为第一个这样做的乐蒙源码 Golang Linux 加载器。由于这两个原因,Universal Loader 是一个相当令人印象深刻的红队工具。
创建者: QSecure Labs
用途: Overlord 是一个基于 Python 的控制台命令行界面,用于自动化红队基础设施。
优点: 在红队参与期间能够根据需要快速启动安全基础设施非常重要,该工具可以节省大量时间,然后可以将这些时间用于进行一些实际的黑客攻击。
创作者: @LittleJoeTables和@rkervell
用途: Sliver是一个用 Golang 编写的跨平台通用植入框架。
优点: 这个工具是两位 Bishop Fox 研究人员的创意,所以我们的偏见可能会表现出来。类似于商业工具Cobalt Strike。使 Sliver 值得注意的是诸如使用每个二进制混淆的动态代码生成、多个和可扩展的出口协议以及支持多个操作员同时控制植入物等功能。此外,它易于使用且运行速度快。
创作者: @tillson_
用途: 使用 Githound 来定位暴露的 API 密钥和其他围绕 GitHub 浮动的敏感信息。该工具通过模式匹配、提交 历史 搜索和“独特的结果评分系统”工作。
优点: 像 Githound 这样的秘密窃取工具并不少见,但这并没有使这个工具(或其他类似工具)的价值降低。Githound 的一些可能用例包括检测暴露的客户 API 密钥以及员工 API 令牌。如果您进行漏洞赏金,此工具可用于添加书签 - 有些人报告说,由于它,因此获得了数千美元的赏金。
创作者: @browninfosecguy
用途: 这个工具的名字说明了一切,在 PowerShell 中轻松地为 Microsoft Active Directory 设置实验室。
优点: 速度很快,效果很好。可以使用此工具来确保您针对 Active Directory 使用的任何漏洞利用都已完善,然后再将其引入客户端环境。对于只想更轻松地测试 Active Directory 的渗透测试员来说非常有用。
创建者: Microsoft Azure 红队
用途: 可以使用 Stormspotter 更好地可视化 Azure 攻击面;此工具可帮助您绘制 Azure 和 Azure Active Directory 对象。
优点: 类似渗透测试工具BloodHound概念类似,只是该工具是为 Azure 环境设计的。对于任何蓝色或紫色团队成员来说,从防御的角度来看,Stormspotter 也非常有用。
创建者: @Void_Sec
用途: ECG 实际上是一种商业工具。该工具是静态源代码扫描器,能够分析和检测 TCL/ADP 源代码中真实和复杂的安全漏洞。
优点: ECG是一种强大的工具,可以填补令人惊讶的空白。正如 VoidSec 在他们的官方文章中所指出的,TCL代码相当普遍;所以能够彻底分析漏洞可能会非常有帮助。没有很多其他工具可以满足这种独特的需求,无论是商业的还是其他的。
创建者: @TryCatchHCF
用途: 可以使用 DumpsterFire 构建“时间触发的分布式”安全事件来测试红队进攻和蓝队防守。
优点: DumpsterFire 将传统桌面练习提升到一个新的水平,它还使用自动化来在参与期间有效地进行多任务处理(并避开一些更乏味的事情)。DumpsterFire 允许的定制程度令人印象深刻;可以真正定制模拟安全事件来满足独一无二的情况。
.GhostPack
创建者: SpecterOps ( @SpecterOps )
用途: 借助强大的后开发工具集 GhostPack,可以做各种事情;可以攻击 KeePass 2.X 数据库、复制锁定的文件、篡改 Active Directory 证书等。
优点: GhostPack 是一种满足黑客需求的“一站式商店”。包含的 个工具包括非常有用的 Rubeus、Seatbelt 和 SharpUp。Rubeus 是一个 C# 工具集,直接与 Active Directory 环境中的 Kerberos 协议交互,允许直接与 Kerberos 属性(例如票证和常规身份验证)进行通信,然后可以利用这些属性在网络中移动。Seatbelt 是一个 C# 项目,可用于面向安全的主机“安全检查”,而 SharpUp 是一个 C# 工具,可识别本地权限提升路径。这些工具被无数红队和网络渗透测试员使用。
创作者: Benjamin Delpy ( @gentilkiwi )
用途: Mimikatz 可以从 Windows 环境中提取密码和其他凭据。是一种非常流行的渗透测试工具,已经存在了十多年。但 Mimikatz 会定期维护和更新,以确保仍然是最前沿的工具
优点: 将 Mimikatz 视为网络渗透测试的瑞士军刀。带有几个内置工具,对 Kerberoasting、密码转储很有用,你能想到的,Mimikatz 都可以做到。而且 Mimikatz 不仅适用于那里的进攻性安全专业人员——防御性安全团队也可以从中受益(如果你发现自己处于紫色团队场景中,这也是个好兆头)。
创建者: Metasploit 项目 ( @metasploit ),由 Rapid7 与开源社区合作运营
用途: Metasploit 可以说是世界领先的渗透测试框架,由 HD Moore 于 年创建。Metasploit 包括用于渗透测试几乎每个阶段的模块,这有助于其普及。包括约 个后利用模块,可用于捕获击键、收集网络信息、显示操作系统环境变量等。
优点: Metasploit 后开发模块非常庞大,有一个模块最突出——Meterpreter 有效载荷。Meterpreter 允许 探索 目标系统并执行代码,并且由于它通过内存 DLL 注入工作,因此不必冒险留下任何操作证据。Metasploit 后开发功能也非常通用,具有适用于 Windows、Linux 和 OS X 的模块。
创作者: 阿德里安·沃尔默( @mr_mitm )
用途: 此后利用工具旨在绕过端点检测和应用程序阻止列表。
优点: 可以使用 PowerHub 传输文件,而不会在测试环境中发出任何安全保护警报,这将使下一次渗透测试更加顺畅和轻松。使用此工具领先于 Windows Defender。
创建者: LOLBAS 项目和亚利桑那州安全工程与研究小组
用途: LOLBAS 是一个字典,用于在 Windows 机器上使用二进制文件查找可能的权限提升路径。LLOLBAS 是与 LOLBAS 协同工作的摄取器。摄取器会在 Windows 机器上的 LOLBAS 列表中查找所有二进制文件,因此无需猜测或对列表进行排序以查找它们(这可能很乏味)。
优点: LOLBAS 项目可搜索机器上可能的权限提升路径,而 LLOLBAS 允许针对特定机器定制这些路径。结合这两个工具,(几乎)在参与中势不可挡。作为一个额外的好处,如果出现需要它们的情况,可以方便地使用离线工具。
创作者: @nil0x
用途: PHPSploit 充当功能齐全的 C2 框架,通过单行 PHP 后门在 Web 服务器上静默地持久化。
优点: PHPSploit 是非安全参与时手头上的一项了不起的工具——高效、用户友好且运行安静。正如其 GitHub 描述所述,PHPSploit 是“由偏执狂,为偏执狂设计的”。
创作者: 塞瓦加斯
用途: 可以使用 swap_digger 在后期开发或取证期间自动进行 Linux 交换分析。
优点: 在 Linux 交换空间中可以找到各种各样的好东西,从密码和电子邮件地址到 GPG 私钥。Swap_digger 可以梳理这些交换空间并找到高影响力的奖杯,这将使评估更加成功。
创建者: RedCode 实验室
用途: Bashark 是一个后开发工具包,顾名思义,是用编程语言 Bash 编写的。这是一个可以产生巨大结果的简单脚本。
优点: Bashark 工作快速而隐蔽,允许通过创建 Bash 函数来添加新命令,并清除在目标环境中使用脚本后可能留下的任何痕迹。
创作者: AlessandroZ
用途: 使用 BeRoot 项目查找可用于在 Windows、Linux 和 OS X 环境中提升权限的常见错误配置。
优点: 识别常见的错误配置是在网络中立足的最可靠方法之一,因此找到这些错误配置的速度越快越好。BeRoot 项目在这方面提供了极大的帮助。
本文,旨在介绍一些红队工具,供大家了解和参考研究之用,不建议任何人利用网络技术从事非法工作,破坏他人计算机等行为。渗透有风险,入坑需谨慎。法网恢恢,疏而不漏。请正确理解渗透含义,正确利用渗透技术,做网络安全服务的践行者。
å¦ä½å好pythonèªå¨åè¿ç»´
éç移å¨äºèç½çæ®åï¼æå¡å¨è¿ç»´æé¢ä¸´çææä¹éä¹è¶æ¥è¶å¤§ãå½è§æ¨¡å¢é¿å°ä¸å®ç¨åº¦ï¼æå¨ç®¡çæ¹å¼å·²ç»æ æ³åºå¯¹ï¼èªå¨åè¿ç»´æ为解å³é®é¢çé¶å¼¹ãPythonååå ¶çµæ´»æ§ï¼å¨èªå¨åè¿ç»´æ¹é¢å·²ç»è¢«å¹¿æ³ä½¿ç¨ï¼è½å¤å¤§å¤§æé«è¿ç»´æçï¼æå¡å¨é群çè§æ¨¡è¶å¤§ï¼ä¼å¿è¶ææ¾ãç°å¨ä¸è®ºæ¯Linuxè¿ç»´å·¥ç¨å¸è¿æ¯Unixè¿ç»´å·¥ç¨å¸é½éè¦ææ¡Pythonï¼ä»¥æé«è¿ç»´æçã第ä¸ä¸ªé¶æ®µï¼å级ï¼ææ¡Pythonçè¯æ³åä¸äºå¸¸ç¨åºç使ç¨
ææ¡ä¸é¨è¯è¨æ好çæ¹æ³å°±æ¯ç¨å®ï¼æ以æè§å¾è¾¹å¦è¯æ³è¾¹å·Leetcodeæ¯ææ¡Pythonæå¿«çæ¹å¼ä¹ä¸ã
å¾å¤åªéè¦å°Pythonä½ä¸ºèæ¬æè å°±æ¯åä¸äºå°ç¨åºå¤çå¤çææ¬çè¯ï¼å°è¿ä¸ä¸ªé¶æ®µå°±è¶³å¤äºï¼è¿ä¸ªé¶æ®µå·²ç»å¯ä»¥å¸®æ们å®æå¾å¤å¾å¤çäºæ äºãä½æ¯å¦ææ¯ä¸ä¸ªä¸ä¸å¦ä¹ Pythonçï¼ææè¿éè¦åªåçå级ï¼é¦å ï¼å½å ç大å¤æ°äººé½æ¯å¦ä¹ äºå ¶ä»è¯è¨ï¼Cï¼C++,Javaçï¼ä¹åæ¥å¦ä¹ Pythonçï¼æ以Pythonåè¿äºè¯è¨çä¸åï¼ä¹å°±æ¯pythonicçä¸è¥¿éè¦ä¸äºæ¶é´å»å¦ä¹ äºè§£åææ¡ï¼å¦å¤ï¼å¯¹äºèªå·±é¢åçé¢åçåºææ¶çææ¡ä¹éè¦å¾é¿çæ¶é´å»ææ¡ï¼æåï¼å¦ææ³ç¬ç«å®æä¸ä¸ªPythonç项ç®ï¼é¡¹ç®çå¸å±ï¼åå¸ï¼å¼æºçé½æ¯éè¦èèçé®é¢ã
第äºä¸ªé¶æ®µï¼ä¸çº§ï¼ææ¡èªå·±ç¹å®é¢åçåºï¼ææ¡pythonicåæ³ï¼é常çæPythonçç¹æ§
æ¨èç第ä¸æ¬ä¹¦æ¯ãç¼åé«è´¨é代ç âæ¹åpythonç¨åºç个建议ãï¼è¿æ¬ä¹¦å¤§æ¦çæäºä¸Pythonå·¥ç¨çæ件å¸å±ï¼æ´å¤çæ»ç»äºå¦ä½ååºpythonicç代ç ï¼å¦å¤ï¼ä¹ä»ç»äºä¸äºå¸¸ç¨çåºã
è¿éé¦å æ¨èå¨è ¾è®¯å®æ¹è¯¾ç¨æ¸ éä¸è¿è¡ç´æå¦ä¹ ï¼æå·å°±è½æ å¿ä¸ç´å¦ï¼æ¯å¤©æä¸é½æ¯é«æ¸ ç´æ(ä¼é¹ ççï¼ä¸é´æ¯æåå ä¸è¿ä¸ªè¿å¨ä¸èµ·å°±è½å¤äºï¼ï¼é¤æ¤ä¹å¤åºäºpython2.7å¨ç½ä¸ç书ç±éåäºé头å¼å§ä¸ç´è¯»å®ï¼ä½ä¸ºä¸ä¸ªå¼å人åï¼é¤äºåºæ¬çè¯æ³ï¼è¿æ¬ä¹¦éé¢æå°äºä¸äºå ¶ä»ç常ç¨çåºï¼çäºå»èå¸åçå¾å¤ä¸è¥¿ï¼æè§ä»çæè·¯ï¼ä»¥ååå客å书çé«åº¦ï¼æ¦æ¬æ§ï¼åçæ§é½åå好ï¼è¿æ¬ä¹¦è¯»å®ä¹åï¼ç¸ä¿¡å°±è½å¤å¨æåå¾å¤ä¸è¥¿äºï¼è½å¤å°½æ çç©è½¬Python解说å¨äºã
è¦æ³æ·±å ¥çäºè§£Pythonï¼æçæ¶åççPythonçæºç ä¹æ¯å¾éè¦çï¼èªå·±éè¿è¯»ææºç ï¼æ¥å½»åºçäºè§£Pythonçæ ¸å¿æºå¶ï¼è¿éæ¨èãPythonæºç åæââ深度æ¢ç´¢å¨æè¯è¨æ ¸å¿ææ¯ãï¼è¿æ¬ä¹¦å¹¶æ²¡æçå®ï¼åªæ¯å¨éè¦æ·±å ¥äºè§£Pythonæ个åè½æè æ°æ®ç»æçæ¶åççç¸å ³ç« èï¼ä¹è§å¾åçåªæµ ã
èªå·±é¢åç书ç±åèµæä¹è¯å®å¾å¤ï¼æ¯å¦webå¼åçææ¶é½æå¾å¤ï¼åªæäºè§£çæäºææææ¶ï¼å¨éæ©çæ¶åæè½è¡¡éå©å¼ï¼ç¶åæ·±å ¥ææ¡æäºææ¶ã
游戏主程岗位职责
游戏主程岗位职责1
- 负责游戏客户端内容的开发工作。
- 与策划、美术、后台人员良好沟通,实现相关游戏玩法。
- 持续优化代码、迭代需求,保证质量,提高效率,提升游戏体验。
游戏主程岗位职责2
- 负责公司3D手游产品的C++客户端开发。
- 根据相关需求进行技术评估,任务分配。
游戏主程岗位职责3
- 使用cocos2d—x开发基于iOS/安卓平台手机游戏。
- 参与讨论手游模块功能、操作流程及界面布局等客户端设计。
游戏主程岗位职责4
- Unity游戏主程。
- 本科以及上学历,计算机相关专业者优先。
- 精通C#语言,精通Unity3D引擎,熟悉网络编程。
- 三年以上Unity开发经验,四年以上游戏开发经验,至少作为核心技术参与过一款游戏的开发、以及上线后稳定运营。
游戏主程岗位职责5
- 职位描述:软件工程师。
- 要求:有做过APP、前后台开发;精通用C/C++语言,熟悉linux环境和调试;本科以上学历(、)。
游戏主程岗位职责6
- 职位描述:1、参与公司商品搜索业务优化;2、负责搜索在线系统架构建设,优化系统稳定性、性能、容量、吞吐量,设计灵活的策略架构支持策略快速迭代和升级;3、负责搜索离线系统架构建设,优化离线数据流的稳定性和效率,推进离线数据快速、准确的应用到线上;4、抽象通用的搜索离在线系统架构和策略架构,用于快速支持电商搜索引擎。
- 任职要求:1、优秀的编码与代码控制能力,有扎实的数据结构和算法功底;2、熟悉linux开发环境,熟悉C++,精通网络编程、多线程编程;3、熟悉搜索引擎,对搜索引擎架构、大规模引擎有经验者优先;4、承担过电商类搜索引擎工程或策略改进的工作者优先;5、热爱技术,持续学习,追求极致。
游戏主程岗位职责7
- 职位描述:1、开发客户端应用软件;2、协助项目经理进行新产品功能的研发和版本迭代,持续优化产品的用户体验;3、编写和完善相关产品文档;4、学习新技术完成开发任务;
- 任职要求:1、了解Windows客户端开发(WinForm/MFC/WPF/QT)任意一种框架技术。熟悉C#;2、熟悉前端知识如Nodejs,Electron,Vue,Iview,Element等;3、熟悉Golang服务端开发;4、能独立完成模块设计与代码开发任务、完善产品功能与细节;5、精通多线程/socket等编程技术。擅长多种开源技术应用能力,解决项目中遇到的技术问题;6、具备良好的研究自学能力和独立排查解决问题的能力,能承受工作中的压力;7、有相关技术文档书写能力,例如概要设计、详细设计等。
游戏主程岗位职责8
- 职位描述:1、业务领域:建设相关移动端产品,包括头条,短视频,奇趣,音频等等,在庞大的流量平台上,尽情施展你的才华;2、技术驱动:技术氛围良好,追求极致,在这里你拥有足够的挑战及机遇,一起探索移动技术的未来,包括RN和Weex等新技术的应用;
- 岗位要求:1、5年以上工作经验,计算机相关专业本科及以上学历,基础扎实,数据结构,网络等基础知识掌握牢固;2、精通Android/iOS客户端开发;有丰富的客户端应用架构经验,可以独立承担App级别的架构设计,并主导大型项目研发;3、精通Android/iOS操作系统特性和内部运行机制,精通UI开发,熟练各种UI组件并了解其原理;4、精通Android/iOS调试工具和方法,可以应付各种Android/iOS复杂问题,具备良好的分析解决问题能力,有技术难题攻关经验;5、有高度的工作热情和自我能动性,项目和技术推动和执行能力强,有团队合作精神。热爱移动互联网,对新事物敏感,喜欢探索,有较强的创新意识与责任感;6、有带团队或大型项目经验,有技术视野和前瞻性;7、加分项(满足其一即可):具备Native&Web技术融合经验,例如RN和Weex;同时具备iOS和安卓经验;有H5前端或服务器端研发经验;有独立的开源项目或者参与知名开源项目经验;英语沟通能力;
游戏主程岗位职责9
- 职责描述:1.负责公司游戏项目的服务端开发或维护;2.负责公司游戏项目的管理后台开发或维护;3.负责公司内部开发与管理工具的开发或维护;
- 任职要求:1.3年以上游戏服务端开发经验(从事过框架或基础组件开发工作优先);2.有基于java nio框架开发经验;3.精通多线程并发编程;4.精通Spring、Hibernate、Mina/Netty等开源框架;5.熟悉Linux操作系统;6.熟练应用MySql等数据库(有NoSQL数据开发经验优先);7.至少完整跟进过1款上线游戏项目,并且对技术有专研情况;
游戏主程岗位职责
- 职位描述:游戏服务端主程(使用erlang语言)
- 岗位职责:1.管理和开发项目服务端框架;2.把控和解决游戏服务端的设计和开发中的难点。
- 岗位要求:1.计算机、软件相关专业毕业,本科或以上学历;2.熟悉erlang语言,3年以上游戏服务端开发经验,担任过手游项目服务端主程职位优先;3.有很强的逻辑思维能力,解决技术难点的能力;4.热爱游戏,对手机游戏有激情、有追求;5.工作认真负责,善于与同事进行沟通。
游戏主程岗位职责
- 职位描述:1、负责桌面端产品开发,编写高质量的代码;2、负责研发设计师设计流水线工具,提高生产效率;3、与设计师一起设计特效内容,支持制定特效内容技术标准。
- 任职要求:1、优秀的编码与代码控制能力,良好的设计能力和编程习惯;2、熟练掌握C++,对C++有深刻理解,有一定的跨平台开发经验;3、有较好的产品意识;4、熟悉Objective—C、QT、Windows开发优先;5、熟悉GPUImage,AVFoundation,OpenGL,Metal,ARKit技术者优先;6、具有全栈开发能力者优先;7、对技术有极大的热情,学习能力强,责任心强,工作认真细致,具备良好的服务意识,具有良好的团队沟通与协作能力。
游戏主程岗位职责
- Unity游戏主程:
- 本科以及上学历,计算机相关专业者优先;
- 精通C#语言,精通Unity3D引擎,熟悉网络编程;
- 三年以上Unity开发经验,四年以上游戏开发经验,至少作为核心技术参与过一款游戏的开发、以及上线后稳定运营,面试时需要展示该游戏或者游戏视频;
- 熟悉游戏相关的基本算法,熟悉常规的物理算法;
- 对设计模式、系统架构、源码管理、编码及文档规范等有良好认知与习惯,能写出优质代码;
- 具备团队管理经验;
- 有较强分析和解决问题的能力;
- 较好的数据结构和算法基础,具备较好的系统架构和分析能力;
- 优先条件:有一定的英语阅读能力,能看懂一般英文技术文档;熟悉图形学算法优先;熟悉Shader编程优先;具有iOS或Android平台开发经验者优先;有主程序经验者优先;有Unity3D游戏客户端底层架构经验者优先(网络层,数据层,逻辑层,UI架构)。
Golang源码分析Golang如何实现自举(一)
本文旨在探索Golang如何实现自举这一复杂且关键的技术。在深入研究之前,让我们先回顾Golang的历史。Golang的开发始于年,其编译器在早期阶段是由C语言编写。直到Go 1.5版本,Golang才实现了自己的编译器。研究自举的最佳起点是理解从Go 1.2到Go 1.3的版本,这些版本对自举有重要影响,后续还将探讨Go 1.4。
接下来,我们来了解一下Golang的编译过程。Golang的编译主要涉及几个阶段:词法解析、语法解析、优化器和生成机器码。这一过程始于用户输入的“go build”等命令,这些命令实际上触发了其他内部命令的执行。这些命令被封装在环境变量GOTOOLDIR中,具体位置因系统而异。尽管编译过程看似简单,但实际上包含了多个复杂步骤,包括词法解析、语法解析、优化器、生成机器码以及连接器和buildid过程。
此外,本文还将介绍Golang的目录结构及其功能,包括API、文档、C头文件、依赖库、源代码、杂项脚本和测试目录。编译后生成的文件将被放置在bin和pkg目录中,其中bin目录包含go、godoc和gofmt等文件,pkg目录则包含动态链接库和工具命令。
在编译Golang时,首先需要了解如何安装GCC环境。为了确保兼容性,推荐使用GCC 4.7.0或4.7.1版本。通过使用Docker镜像简化了GCC的安装过程,使得编译变得更为便捷。编译Golang的命令相对简单,通过执行./all即可完成编译过程。
最后,本文对编译文件all.bash和make.bash进行了深入解析。all.bash脚本主要针对nix系统执行,而make.bash脚本则包含了编译过程的关键步骤,包括设置SELinux、编译dist文件、编译go_bootstrap文件,直至最终生成Golang可执行文件。通过分析这些脚本,我们可以深入了解Golang的自举过程,即如何通过go_bootstrap文件来编译生成最终的Golang。
总结而言,Golang的自举过程是一个复杂且多步骤的技术,包含了从早期C语言编译器到自动生成编译器的转变。通过系列文章的深入探讨,我们可以更全面地理解Golang自举的实现细节及其背后的逻辑。本文仅是这一过程的起点,后续将详细解析自举的关键组件和流程。
2024-12-22 20:58
2024-12-22 20:22
2024-12-22 20:17
2024-12-22 19:41
2024-12-22 19:27
2024-12-22 19:24