1.openctp通道源码开放二(新浪行情CTPAPI)
2.OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
3.Spring Cloud OpenFeign源码FeignClientFactoryBean原理
4.CANOpen系列教程14_协议源码移植(二)
5.能提供原始代码的实现软件是
6.opensips2.4源码分析udp协议处理
openctp通道源码开放二(新浪行情CTPAPI)
CTPAPI接口源码的开放,引发了广泛关注,源码短短几天内获得了上千次的实现点赞与收藏。CTPAPI,源码由上期所旗下的实现技术公司开发,以其精湛设计、源码cmake生成源码高效率与开放运营模式,实现备受投资者青睐,源码几乎成为了期货交易的实现必备选择。然而,源码股票市场中,实现虽然有多家技术公司与券商提供了各自的源码柜台服务,但其影响力与CTPAPI相比仍有差距。实现面对多品种交易或更换券商需求,源码openctp提供的实现统一CTPAPI接口技术显得尤为重要。用户只需一个接口,就能接入包括期货、期权、A股、港股、美股、外盘期货在内的全市场全品种。
本文将介绍openctp再次开放的新浪行情通道CTPAPI接口源码。对于从互联网获取股票行情,前文已有详细说明,这里简要概述新浪的江湖源码 股市方法。只需输入指定网址,即可接收股票行情数据。具体格式如下:
单个股票: hq.sinajs.cn/list=sz...
多个股票: hq.sinajs.cn/list=sh...
然而,去年新浪对协议进行了调整,改动了HTTP头部,需额外添加特定字段,否则访问会被拒绝。详情请参考相关文章:《新浪行情无法接收的解决方法》。
CTPAPI在期货领域广为人知,但在股票市场中可能较少被提及。为了帮助用户更好地理解如何利用此接口接收股票行情,本文提供了一个示例。同时,公开了新浪行情CTPAPI源码地址,用户可访问:/krenx/openctp/tree/master/ctp2Sina行情。
CTPAPI接口版本多样,从6.3.到6.6.7,主要更新包括新增字段或函数,但这些新增内容大多不常使用。交易相关的接口保持稳定。为了确保兼容性和功能完整性,建议使用6.6.7及以上版本。关于接口下载与官方文档,用户可访问openctp主页:github.com/krenx/op...
为方便用户获取更多行情信息,openctp还提供了强大的谷歌 app 源码行情显示工具prices,其源码地址为:github.com/krenx/op...
欲了解更多信息,请访问openctp主页:/krenx/openctp或关注公众号openctp,获取最新动态。CTPAPI相关文章,敬请关注。
OpenJDK-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
ZGC简介:
ZGC是Java垃圾回收器的前沿技术,支持低延迟、大容量堆、染色指针、读屏障等特性,自JDK起作为试验特性,JDK起支持Windows,JDK正式投入生产使用。在JDK中已实现分代收集,预计不久将发布,性能将更优秀。
ZGC特征:
1. 低延迟
2. 大容量堆
3. 染色指针
4. 读屏障
并发标记过程:
ZGC并发标记主要分为三个阶段:初始标记、并发标记/重映射、重分配。本篇主要分析并发标记/重映射部分源代码。
入口与并发标记:
整个ZGC源码入口是ZDriver::gc函数,其中concurrent()是一个宏定义。并发标记函数是concurrent_mark。
并发标记流程:
从ZHeap::heap()进入mark函数,使用任务框架执行任务逻辑在ZMarkTask里,壁纸源码开发具体执行函数是work。工作逻辑循环从标记条带中取出数据,直到取完或时间到。此循环即为ZGC三色标记主循环。之后进入drain函数,从栈中取出指针进行标记,直到栈排空。标记过程包括从栈取数据,标记和递归标记。
标记与迭代:
标记过程涉及对象迭代遍历。标记流程中,ZGC通过map存储对象地址的finalizable和inc_live信息。map大小约为堆中对象对齐大小的二分之一。接着通过oop_iterate函数对对象中的指针进行迭代,使用ZMarkBarrierOopClosure作为读屏障,实现了指针自愈和防止漏标。
读屏障细节:
ZMarkBarrierOopClosure函数在标记非静态成员变量的指针时触发读屏障。慢路径处理和指针自愈是核心逻辑,慢路径标记指针,快速路径通过cas操作修复坏指针,并重新标记。
重映射过程:
读屏障触发标记后,对象被推入栈中,下次标记循环时取出。ZGC并发标记流程至此结束。石器复刻源码
问题回顾:
本文解答了ZGC如何标记指针、三色标记过程、如何防止漏标、指针自愈和并发重映射过程的问题。
扩展思考:
ZGC在指针上标记,当回收某个region时,如何得知对象是否存活?答案需要结合标记阶段和重分配阶段的代码。
结束语:
本文深入分析了ZGC并发标记的源码细节,对您有启发或帮助的话,请多多点赞支持。作者:京东物流 刘家存,来源:京东云开发者社区 自猿其说 Tech。转载请注明来源。
Spring Cloud OpenFeign源码FeignClientFactoryBean原理
Spring Cloud OpenFeign的FeignClientFactoryBean在实例化过程中,通过FactoryBean接口实现,GetObject方法的关键步骤包括获取FeignContext、配置Feign.Builder、创建HardCodedTarget和调用loadBalance方法。这些步骤涉及自动配置、FeignClientSpecification的使用、Logger和Builder组件的定制以及动态代理的生成。最后,getObject方法返回的是一个接口的代理类,用于执行远程调用。
详细分析:
FeignClientFactoryBean在Spring容器中,通过getObject方法转化为实际的FeignClient实例。首先,它从FeignContext获取相关配置,这个配置在引入OpenFeign依赖时自动注入。接下来,通过getTarget方法,FeignClientFactoryBean配置了Builder组件,如Logger(非Slf4j)、RequestInterceptor、Encoder和Decoder等,同时考虑了用户自定义组件的配置。之后,创建了HardCodedTarget,基于FeignClient接口、注解值和完整URL构建,然后通过loadBalance方法,整合了LoadBalancerFeignClient和HystrixTargeter,进行负载均衡和目标URL定位。
在newInstance方法中,解析了接口方法的注解,生成了MethodHandler,并用FeignInvocationHandler封装,这个InvocationHandler在代理类实例化时被调用,实现了远程调用。最终,通过Proxy.newProxyInstance动态生成了代理类,完成FeignClientFactoryBean的实例化过程。
总的来说,FeignClientFactoryBean实例化是通过一系列配置和代理生成,实现了Spring Cloud OpenFeign的远程调用功能。如果你对源码的深入理解感兴趣,下期文章将继续解析调用源码细节。
CANOpen系列教程_协议源码移植(二)
本文主要阐述了在嵌入式系统开发中,将CANOpen协议源码移植到工程中并实现的具体步骤。作者首先强调了系列教程的背景,基于CanFestival架构、STMF1芯片、FreeRTOS操作系统、以及Keil MDK-ARM开发环境。接下来,文章深入讲解了移植过程中需要关注的几个关键点。
在添加源码和路径部分,作者指出需要在现有工程中加入与CANOpen相关的组和文件,并添加CANOpen源码的inc头文件路径,确保编译时能正确找到所需文件。这部分是基础准备工作,确保开发环境能正确识别和使用新添加的代码。
在添加代码及分析部分,文章聚焦于实际代码实现的关键点。作者提到需要修改的canfestival.h文件,以防止递归包含问题,同时解释了需要实现的底层驱动函数,如canSend,这是CANOpen源代码调用最频繁的函数。作者还详细介绍了初始化相关接口的实现方法,以及定时器调度接口的调用和实现。特别地,文中提到发送接口函数canSend的重要性,并建议尽量保持其接口原样,因为这一函数在多个源文件中被广泛调用。最后,文章还讨论了发送和接收缓存的实现、中断接收机制以及配置节点等关键功能。
工程下载及运行效果部分展示了作者提供的示例工程,该工程展示了主站和从站的心跳功能,通过CAN分析仪抓取数据进行验证。通过这一部分,读者可以直观地了解移植后的CANOpen协议在实际应用中的表现。
文章最后对文档的使用和版权所有进行了说明,并推荐了作者的博客、GitHub以及微信公众号,鼓励读者关注以获取更多相关资源和内容。
能提供原始代码的软件是
能提供原始代码的软件是开源软件。 开源软件一般指开放源代码软件。开放源码软件(open-source)是一个新名词,它被定义为描述其源码可以被公众使用的软件,并且此软件的使用,修改和分发也不受许可证的限制。 代码(code)是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。 代码设计的原则包括唯一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。 源代码是代码的分支,某种意义上来说,源代码相当于代码。 现代程序语言中,源代码可以书籍或磁带形式出现,但最为常用格式是文本文件,这种典型格式的目的是为了编译出计算机程序。 计算机源代码最终目的是将人类可读文本翻译成为计算机可执行的二进制指令,这种过程叫编译,它由通过编译器完成。opensips2.4源码分析udp协议处理
在opensips 2.4的源码中,udp协议处理是通过内置的静态模块proto_udp实现的。这个模块主要集中在proto_udp.c文件中,通过结构体module_exports的cmds和params来配置,其中"udp_port"是唯一的可配置参数,默认值为。
关键的函数proto_udp_init负责初始化协议处理结构体struct proto_info,它负责设置udp的监听、发送和接收功能,这些底层操作在proto_udp.c文件中具体实现。在opensips主程序启动时,通过trans_load函数加载所有通信协议,其中会查找并调用proto_init函数,如proto_udp的proto_init函数,用于初始化proto_info结构。
udp的监听逻辑根据配置文件进行,配置中的listen指令决定监听的端口。opensips使用struct socket_id结构体来抽象监听,这个结构在cfg.y的flex语法文件中生成,并在trans.c的add_listener函数中添加到全局的protos数组。在主程序启动的最后阶段,会调用udp_proto模块的tran.init_listener函数来启动监听,但实际监听端口可能根据配置有所调整,如果没有相应的配置,该协议将被禁用。
window.openç示ä¾
1ãæåºæ¬çå¼¹åºçªå£ä»£ç å ¶å®ä»£ç é常ç®åï¼
<SCRIPT LANGUAGE=javascript>
<!--
window.open ('page.html')
-->
</SCRIPT>
å 为è¿æ¯ä¸æ®µjavascripts代ç ï¼æ以å®ä»¬åºè¯¥æ¾å¨<SCRIPT LANGUAGE=javascript>ï¼æ ç¾å</script>ï¼ä¹é´ã<!-- å -->ï¼æ¯å¯¹ä¸äºçæ¬ä½çæµè§å¨èµ·ä½ç¨ï¼å¨è¿äºèæµè§å¨ä¸ä¸ä¼å°æ ç¾ä¸ç代ç ä½ä¸ºææ¬æ¾ç¤ºåºæ¥ãè¦å »æè¿ä¸ªå¥½ä¹ æ¯åã
Window.open ('page.html') ç¨äºæ§å¶å¼¹åºæ°ççªå£page.htmlï¼å¦æpage.htmlä¸ä¸ä¸»çªå£å¨åä¸è·¯å¾ä¸ï¼åé¢åºåæè·¯å¾ï¼ç»å¯¹è·¯å¾ï¼http://ï¼åç¸å¯¹è·¯å¾ï¼../ï¼åå¯ãç¨åå¼å·ååå¼å·é½å¯ä»¥ï¼åªæ¯ä¸è¦æ··ç¨ã
è¿ä¸æ®µä»£ç å¯ä»¥å å ¥HTMLçä»»æä½ç½®ï¼<head>ï¼å</head>ï¼ä¹é´å¯ä»¥ï¼<body>ï¼é´</body>ï¼ä¹å¯ä»¥ï¼è¶åè¶æ©æ§è¡ï¼å°¤å ¶æ¯é¡µé¢ä»£ç é¿ï¼åæ³ä½¿é¡µé¢æ©ç¹å¼¹åºå°±å°½éå¾åæ¾ã
ã2ãç»è¿è®¾ç½®åçå¼¹åºçªå£ã
ä¸é¢å说ä¸è¯´å¼¹åºçªå£ç设置ãåªè¦åå¾ä¸é¢ç代ç ä¸å ä¸ç¹ä¸è¥¿å°±å¯ä»¥äºã
æ们æ¥å®å¶è¿ä¸ªå¼¹åºççªå£çå¤è§ï¼å°ºå¯¸å¤§å°ï¼å¼¹åºçä½ç½®ä»¥éåºè¯¥é¡µé¢çå ·ä½æ åµã
<SCRIPT LANGUAGE=javascript>
<!--
window.open ('page.html','newwindow','height=,width=,top=0,left=0,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no')
//åæä¸è¡
-->
</SCRIPT>
åæ°è§£éï¼
<SCRIPT LANGUAGE=javascript> jsèæ¬å¼å§ï¼
window.open å¼¹åºæ°çªå£çå½ä»¤ï¼
'page.html' å¼¹åºçªå£çæ件åï¼
'newwindow' å¼¹åºçªå£çååï¼ä¸æ¯æ件åï¼ï¼éå¿ é¡»ï¼å¯ç¨ç©º''代æ¿ï¼
height= çªå£é«åº¦ï¼
width= çªå£å®½åº¦ï¼
top=0 çªå£è·ç¦»å±å¹ä¸æ¹çè±¡ç´ å¼ï¼
left=0 çªå£è·ç¦»å±å¹å·¦ä¾§çè±¡ç´ å¼ï¼
toolbar=no æ¯å¦æ¾ç¤ºå·¥å ·æ ï¼yes为æ¾ç¤ºï¼
menubarï¼scrollbars 表示èåæ åæ»å¨æ ã
Resizable=no æ¯å¦å 许æ¹åçªå£å¤§å°ï¼yes为å 许ï¼
location=no æ¯å¦æ¾ç¤ºå°åæ ï¼yes为å 许ï¼
status=no æ¯å¦æ¾ç¤ºç¶ææ å çä¿¡æ¯ï¼é常æ¯æ件已ç»æå¼ï¼ï¼yes为å 许ï¼
</SCRIPT> jsèæ¬ç»æ
ã3ãç¨å½æ°æ§å¶å¼¹åºçªå£ã
ä¸é¢æ¯ä¸ä¸ªå®æ´ç代ç ã
<html>
<head>
<script LANGUAGE=JavaScript>
<!--
function openwin() { window.open (page.html,newwindow,height=,width=,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no)
//åæä¸è¡
}
//-->
</script>
</head>
<body onload=openwin()>
â¦ä»»æç页é¢å 容â¦
</body>
</html>
è¿éå®ä¹äºä¸ä¸ªå½æ°openwinï¼ï¼ï¼å½æ°å 容就æ¯æå¼ä¸ä¸ªçªå£ãå¨è°ç¨å®ä¹å没æä»»ä½ç¨éã
æä¹è°ç¨å¢ï¼
æ¹æ³ä¸ï¼<body onload=openwin()> æµè§å¨è¯»é¡µé¢æ¶å¼¹åºçªå£ï¼
æ¹æ³äºï¼<body onunload=openwin()> æµè§å¨ç¦»å¼é¡µé¢æ¶å¼¹åºçªå£ï¼
æ¹æ³ä¸ï¼ç¨ä¸ä¸ªè¿æ¥è°ç¨ï¼
<a href=# onclick=openwin()>ï¼æå¼ä¸ä¸ªçªå£</a>
注æï¼ä½¿ç¨ç#æ¯èè¿æ¥ã
æ¹æ³åï¼ç¨ä¸ä¸ªæé®è°ç¨ï¼
<input type=button onclick=openwin() value=æå¼çªå£>
ã4ãåæ¶å¼¹åº2个çªå£ã
对æºä»£ç ç¨å¾®æ¹å¨ä¸ä¸ï¼
<script LANGUAGE=JavaScript>
<!--
function openwin()
{ window.open (page.html,newwindow,height=,width=,top=0,left=0,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no)
//åæä¸è¡
window.open (page2.html,newwindow2,height=,width=,top=,left=,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no)
//åæä¸è¡
}
//-->
</script>
为é¿å å¼¹åºç2个çªå£è¦çï¼ç¨topåleftæ§å¶ä¸ä¸å¼¹åºçä½ç½®ä¸è¦ç¸äºè¦çå³å¯ãæåç¨ä¸é¢è¯´è¿çåç§æ¹æ³è°ç¨å³å¯ã
注æï¼2个çªå£çname(newwindowsånewwindow2ï¼ä¸è¦ç¸åï¼æè å¹²èå ¨é¨ä¸ºç©ºãOKï¼
ã5ã主çªå£æå¼æ件1.htmï¼åæ¶å¼¹åºå°çªå£page.htmlã
å¦ä¸ä»£ç å å ¥ä¸»çªå£<head>ï¼åºï¼
<script language=javascript>
<!--
function openwin()
{ window.open(page.html,,width=,height=)
}
//-->
</script>
å å ¥<body>ï¼åºï¼
<a href=1.htm onclick=openwin()>open</a>ï¼å³å¯ã
ã6ãå¼¹åºççªå£ä¹å®æ¶å ³éæ§å¶ã
ä¸é¢æ们å对弹åºççªå£è¿è¡ä¸äºæ§å¶ï¼ææå°±æ´å¥½äºãå¦ææ们åå°ä¸å°æ®µä»£ç å å ¥å¼¹åºç页é¢ï¼æ³¨ææ¯å å ¥å°page.htmlçHTMLä¸ï¼å¯ä¸æ¯ä¸»é¡µé¢ä¸ï¼å¦åâ¦ï¼ï¼è®©å®ç§åèªå¨å ³éæ¯ä¸æ¯æ´é ·äºï¼
é¦å ï¼å°å¦ä¸ä»£ç å å ¥page.htmlæ件ç<head>ï¼åºï¼
<script language=JavaScript>
function closeit()
{ setTimeout(self.close(),) //毫ç§}
</script>
ç¶åï¼åç¨<body onload=closeit()> è¿ä¸å¥è¯ä»£æ¿page.htmlä¸åæç<BODY>ï¼è¿ä¸å¥å°±å¯ä»¥äºãï¼è¿ä¸å¥è¯åä¸ä¸è¦å¿è®°ååï¼è¿ä¸å¥çä½ç¨æ¯è°ç¨å ³éçªå£ç代ç ï¼ç§éåå°±èªè¡å ³é该çªå£ãï¼
ã7ãå¨å¼¹åºçªå£ä¸å ä¸ä¸ä¸ªå ³éæé®ã
<FORM>
<INPUT TYPE='BUTTON' VALUE='å ³é' onClick='window.close()'>
</FORM>
åµåµï¼ç°å¨æ´å å®ç¾äºï¼
ã8ãå å å«çå¼¹åºçªå£-ä¸ä¸ªé¡µé¢ä¸¤ä¸ªçªå£ã
ä¸é¢çä¾åé½å å«ä¸¤ä¸ªçªå£ï¼ä¸ä¸ªæ¯ä¸»çªå£ï¼å¦ä¸ä¸ªæ¯å¼¹åºçå°çªå£ã
éè¿ä¸é¢çä¾åï¼ä½ å¯ä»¥å¨ä¸ä¸ªé¡µé¢å å®æä¸é¢çææã
<html>
<head>
<SCRIPT LANGUAGE=JavaScript>
function openwin()
{ OpenWindow=window.open(,newwin,height=,width=,toolbar=no,scrollbars=+scroll+,menubar=no);
//åæä¸è¡
OpenWindow.document.write(<TITLE>ï¼ä¾å</TITLE>)
OpenWindow.document.write(<BODY BGCOLOR=#ffffff>)
OpenWindow.document.write(<h1>Hello!</h1>)
OpenWindow.document.write(New window opened!)
OpenWindow.document.write(</BODY>)
OpenWindow.document.write(</HTML>)
OpenWindow.document.close()}
</SCRIPT>
</head>
<body>
<a href=# onclick=openwin()>ï¼æå¼ä¸ä¸ªçªå£</a>
<input type=button onclick=openwin() value=æå¼çªå£>
</body>
</html>
çç OpenWindow.document.writeï¼ï¼éé¢ç代ç ä¸å°±æ¯æ åçHTMLåï¼åªè¦æç §æ ¼å¼åæ´å¤çè¡å³å¯ãåä¸æ³¨æå¤ä¸ä¸ªæ ç¾æå°ä¸ä¸ªæ ç¾å°±ä¼åºç°é误ãè®°å¾ç¨OpenWindow.document.closeï¼ï¼ç»æåã
ã9ãç»æåºç¨--å¼¹åºççªå£ä¹Cookieæ§å¶ã
åæ³ä¸ä¸ï¼ä¸é¢çå¼¹åºçªå£è½ç¶é ·ï¼ä½æ¯æä¸ç¹å°æ¯ç ï¼æ²æµ¸å¨åæ¦ä¹ä¸ï¼ä¸å®æ²¡æåç°å§ï¼ï¼æ¯å¦ä½ å°ä¸é¢çèæ¬æ¾å¨ä¸ä¸ªéè¦é¢ç¹ç»è¿ç页é¢éï¼ä¾å¦é¦é¡µï¼ï¼é£ä¹æ¯æ¬¡å·æ°è¿ä¸ªé¡µé¢ï¼çªå£é½ä¼å¼¹åºä¸æ¬¡ï¼æ¯ä¸æ¯é常ç¦äººï¼ï¼-ï¼æ解å³çåæ³åï¼Yes! ;-) Follow me.
æ们使ç¨cookieæ¥æ§å¶ä¸ä¸å°±å¯ä»¥äºã
é¦å ï¼å°å¦ä¸ä»£ç å å ¥ä¸»é¡µé¢HTMLç<HEAD>ï¼åºï¼
<script>
function openwin()
{ window.open(page.html,,width=,height=)}
function get_cookie(Name)
{ var search = Name + =
var returnvalue = ;
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search)
if (offset != -1ï¼ {
offset += search.length
end = document.cookie.indexOf(;,offset);
if (end == -1ï¼
end = document.cookie.length;
returnvalue=unescape(document.cookie.substring(offset,end))
}
}
return returnvalue;
}
function loadpopup(){
if (get_cookie('popped')==''){
openwin()
document.cookie=popped=yes
}
}
</script>
ç¶åï¼ç¨<body onload=loadpopup()>ï¼ï¼æ³¨æä¸æ¯openwinèæ¯loadpopåï¼ï¼æ¿æ¢ä¸»é¡µé¢ä¸åæç<BODY>ï¼è¿ä¸å¥å³å¯ãä½ å¯ä»¥è¯çå·æ°ä¸ä¸è¿ä¸ªé¡µé¢æéæ°è¿å ¥è¯¥é¡µé¢ï¼çªå£åä¹ä¸ä¼å¼¹åºäºãçæ£çPop-Only-Onceï¼
åå°è¿éå¼¹åºçªå£çå¶ä½ååºç¨æå·§åºæ¬ä¸ç®æ¯å®æäºï¼ä¿ºä¹ç´¯åäºï¼ä¸å£æ°è¯´äºè¿ä¹å¤ï¼å¸æ对æ£å¨å¶ä½ç½é¡µçæåææ帮å©ä¿ºå°±éå¸¸æ¬£æ °äºã
éè¦æ³¨æçæ¯ï¼JSèæ¬ä¸çç大å°åæ好ååä¿æä¸è´ã