1.当creator遇上protobufjs|相遇
2.JBoss Webå Tomcatçåºå«
3.JSBridge原理解析——以WebviewJavascriptBridge实现方式为例
4.websphereåtomcatå¨ä½¿ç¨ä¸çåºå«
5.关于Cocos2dx-js游戏的码调jsc文件解密
6.jsbsim学习飞行器模型配置文件解读
当creator遇上protobufjs|相遇
在探索cocos H5开发的最佳实践时,我已离不开nodejs、码调npm和各种脚手架工具。码调首先,码调从初始化package.json文件开始,码调通过npm init命令创建一个文件,码调p2p网贷 源码下载用于管理项目中的码调nodejs第三方模块。
在cocos creator项目中,码调protobufjs的码调使用至关重要。安装步骤如下:通过npm install protobufjs@5 --save命令引入protobufjs 5.x版本,码调若需要全局使用,码调可以使用npm install -g protobufjs@5。码调这个版本虽然不支持最新的码调6.x,但其动态编译功能在cocos creator中更为便利。码调
在creator项目中,码调我们以Player.proto文件为例,展示了如何动态编译文件,生成js对象。在静态语言中,我们会使用protoc命令将proto文件编译为c++/java代码,但在javascript中,protobufjs直接提供了动态编译的ios钢琴源码功能。
然而,当尝试在cocos-jsb环境中运行protobufjs时,可能会遇到问题。这涉及到javascript在浏览器、nodejs和cocos-jsb上的不同文件接口。在cocos-jsb,我们需要处理的是jsb.fileUtils.getStringFromFile接口,这与浏览器和nodejs的文件操作有所不同。
为了解决这个问题,可能需要修改protobufjs源码以适应cocos-jsb。此外,还需注意creator项目中资源路径的管理,通常需要将proto文件放在assets/resources/pb/目录下,并使用cc.url.raw获取正确的资源路径。
尽管通过修改源码可以解决问题,但并不是长久之计。为寻求更稳定的方法,我已创建了一个creator和protobufjs的示例项目,未做任何源码改动,链接如下:[github.com/ShawnZhang...](github.com/ShawnZhang...)。继续关注我的youtubeplayer 源码下载系列文章《探索cocosH5正确的开发姿势》,以了解更多无需修改源码的解决方案和proto文件预编译的用法。
JBoss Webå Tomcatçåºå«
JBoss Webå Tomcatçåºå«
å¨Web2.0ç浪潮ä¸ï¼åç§é¡µé¢ææ¯åæ¡æ¶ä¸ææ¶ç°ï¼ä¸ºæå¡å¨ç«¯çåºç¡æ¶ææåºäºæ´é«ç稳å®æ§åå¯æ©å±æ§çè¦æ±ãè¿å¹´æ¥ï¼ä½ä¸ºå¼æºä¸é´ä»¶çå ¨ çé¢å¯¼è ï¼JBosså¨J2EEåºç¨æå¡å¨é¢åå·²æ为åå±æä¸ºè¿ éçåºç¨æå¡å¨ãå¨å¸åºå æçåæå¡æ»¡æ度ä¸åå¾äºå·¨å¤§çæåï¼ä¸æ¯«ä¸éè²äºå ¶å®çéå¼æº ç«äºå¯¹æï¼å¦WebSphereãWebLogicãApplication ServerãJBoss Webç诸å¤ä¼è¶æ§è½ï¼æ£æ¯å ¶å¹¿ä¸ºæµè¡çåå ã
åºäºTomcatå æ ¸ï¼éèäºè
Tomcat æå¡å¨æ¯ä¸ä¸ªå è´¹çå¼æ¾æºä»£ç çWeb åºç¨æå¡å¨ï¼ææ¯å è¿ãæ§è½ç¨³å®ï¼èä¸å è´¹ï¼å èæ·±åJava ç±å¥½è çåç±å¹¶å¾å°äºé¨å软件å¼ååç认å¯ãå ¶è¿è¡æ¶å ç¨çç³»ç»èµæºå°ï¼æ©å±æ§å¥½ï¼ä¸æ¯æè´è½½å¹³è¡¡ä¸é®ä»¶æå¡çå¼ååºç¨ç³»ç»å¸¸ç¨çåè½ãä½ä¸ºä¸ä¸ªå°åçè½» é级åºç¨æå¡å¨ï¼Tomcatå¨ä¸å°åç³»ç»å并å访é®ç¨æ·ä¸æ¯å¾å¤çåºåä¸è¢«æ®é使ç¨ï¼æ为ç®åæ¯è¾æµè¡çWeb åºç¨æå¡å¨ã
èJBoss Webéç¨ä¸çæä¼çå¼æºJava Webå¼æï¼ å°Java社åºä¸ä¸è½½éæ大ï¼ç¨æ·æ°æå¤ï¼æ åæ¯ææå®å¤çTomcatå æ ¸ä½ä¸ºå ¶Servlet容å¨å¼æï¼å¹¶å ä»¥å®¡æ ¸åè°ä¼ãå纯çTomcatæ§è½æ éï¼å¨å¾å¤å°æ¹è¡¨ç°ææ¬ ç¼ºï¼å¦æ´»å¨è¿æ¥æ¯æãéæå 容ã大æ件åHTTPSçãé¤äºæ§è½é®é¢ï¼Tomcatçå¦ä¸å¤§ç¼ºç¹æ¯å®æ¯ä¸ä¸ªåéçéæå¹³å°ï¼ä» è½è¿ è¡Javaåºç¨ç¨åºãä¼ä¸å¨ä½¿ç¨æ¶Tomcatï¼å¾å¾è¿éåæ¶é¨ç½²Apache Web Server以ä¸ä¹æ´åãæ¤é ç½®è¾ä¸ºç¹çï¼ä¸ä¸è½ä¿è¯æ§è½çä¼è¶æ§ã
JBosså¨Tomcatçåºç¡ä¸ï¼å¯¹å ¶è¿è¡æ¬å°åï¼å°Tomcat 以å åµçæ¹å¼éæå° JBoss ä¸ãJBoss Webéè¿ä½¿ç¨APRåTomcatæ¬å°ææ¯çæ··å模åæ¥è§£å³Tomcatç诸å¤ä¸è¶³ãæ··åææ¯æ¨¡åä»ææ°çæä½ç³»ç»ææ¯éæä¾äºæ好ç线ç¨åäºä»¶å¤çã ç»æï¼JBoss Webè¾¾å°äºå¯æ©å±æ§ï¼æ§è½åæ°å¹é çè³è¶ è¶äºæ¬å°Apache HTTPæå¡å¨æè IISãè¬å¦JBoss Webè½å¤æä¾æ°æ®åºè¿æ¥æ± æå¡ï¼ä¸ä» æ¯æ JSP ç Java ææ¯ï¼åæ¶è¿æ¯æå ¶ä» Web ææ¯çéæï¼è¬å¦ PHPã.NET 两大éµè¥ã
æ ååæ¯åå°ææ¯ä¾èµé£é©ï¼ä¿æ¤æèµæ好çæ¹å¼ãJBoss Webçå æ¯æå ¨ç³»åJEE Webæ åï¼ä»æ ¹æ¬ä¸ä¿è¯äºåºç¨âä¸æ¬¡å¼åï¼å°å¤è¿è¡âçç¹ç¹ï¼ä½¿åºç¨æåè½æ¹ä¾¿å°å¨JBoss Webåå ¶ä»Java Webæå¡å¨ä¹é´è½»æè¿ç§»ã
JSBridge原理解析——以WebviewJavascriptBridge实现方式为例
JSBridge是一种webview与native端进行通信的手段。通过JSBridge,webview可以通过jsb调用native的能力,而native端也可以通过jsb在webview上执行逻辑。以WebviewJavascriptBridge为例,解析其实现方式:
在JSBridge中,主要通过拦截URL请求实现native端与webview端的通信效果。WebviewJavascriptBridge是一个较为流行的实现方式,其源码地址为:github.com/marcuswesti...
实现JSBridge的关键步骤包括:
1. 注册Bridge:在webview侧和native侧分别注册bridge,通过一个对象储存所有函数。
2. 初始化代码注入:在webview内部注入初始化代码,此代码执行关键操作。
3. 监听URL请求:在iOS中,如WKWebview,监听URL请求进行相关处理。
4. webview调用native能力:当webview与native端注册桥后,双方可以互相调用。具体过程包括webview调用、native接收、执行响应。android button源码
5. native调用webview能力:与webview调用相反,native主动调用JS侧方法。
具体步骤如下:
2-4-1:webview侧调用native,通过callHandler生成message并推入队列,更改iframe src。
2-4-2:native侧处理消息队列,检测iframe src变化,执行WKFlushMessageQueue获取message。
2-4-3:webview侧处理来自native的消息,根据responseId执行回调函数。
过程总结如下图所示。
通过这种方式,JSBridge实现了webview与native端的高效通信,为跨平台应用提供了便利。
websphereåtomcatå¨ä½¿ç¨ä¸çåºå«
1.websphereä¿®æ¹é ç½®æ件ä¸ç¨åtomcaté£æ ·éèµ·æå¡å¨ã
2.websphereä¼æ项ç®æå æEARæ件ï¼é¨ç½²è¿ä¸ªEARæ件ï¼TOMCATè²ä¼¼æ¯WARæ件ã
é¦å ï¼ä»ä»¬çå ±åä¹å¤æ¯é½æ¯æ¯æJSPçæå¡å¨è½¯ä»¶ã
ä¸åä¹å¤ï¼
Tomcatï¼ æ¯Apache Group Jakartaå°ç»å¼åçä¸ä¸ªå è´¹æå¡å¨è½¯ä»¶ï¼éåäºåµå ¥Apacheä¸ä½¿ç¨ï¼èä¸ï¼
å®çæºä»£ç æ¯å¯ä»¥å è´¹è·å¾çï¼ä¸è¶³ä¹å¤æ¯å®çé ç½®åå麻ç¦ï¼å¼ä¸å¥½è¿Apcheé½ä¼ææï¼
èä¸æä¸äºå®å ¨æ§çé®é¢æ²¡æ解å³ï¼åå¦è å¯ä»¥ç¨å®æ¥è°è¯JSPæ件ï¼ä½æ¯ç¨ä½åä¸åºç¨ç
æå¡å¨å°±ä¸å¤ªå¦¥å½äºã
BEA WebLogic Severï¼ æ¯ä¸æ¬¾åå强大çæå¡å¨è½¯ä»¶ï¼é ç½®æ¯è¾ç®åï¼èä¸å¯¹JSPçæ©å±åå强大ï¼é带
äºæ°æ®åºçJDBC驱å¨ç¨åºï¼æ¯æJHTMLï¼æ¯ç®åå¸åºå æçæé«çæå¡å¨ï¼ç®åææ°çæ¬æ¯
6.1çï¼ä»·æ ¼å¾è´µï¼ä¸è¿å¿å¿.....æç ´è§£çå¦ï¼ï¼
IBM WebSphere Application Server: æ¯IBMç产åï¼åè½å¾å¼ºå¤§ï¼èä¸æIBMçå¼åå·¥å ·ç¸é å¥ï¼å¼
åWebç¨åºååæ¹ä¾¿ï¼ä¸è¿ä»·æ ¼ä¸ä¸å ã
WebSphereæ¯ IBM çéæ软件平å°ãå®å å«äºç¼åãè¿è¡åçè§å ¨å¤©åçå·¥ä¸å¼ºåº¦çééåºå Web åºç¨ç¨åºå跨平å°ã跨产å解å³æ¹æ¡æéè¦çæ´ä¸ªä¸é´ä»¶åºç¡è®¾æ½ï¼å¦æå¡å¨ãæå¡åå·¥å ·ãWebSphere æä¾äºå¯é ãçµæ´»åå¥å£®çéæ软件ã
WebSphere Application Server æ¯è¯¥åºç¡è®¾æ½çåºç¡ï¼å ¶ä»ææ产åé½å¨å®ä¹ä¸è¿è¡ãWebSphere Process Server åºäº WebSphere Application Server å WebSphere Enterprise Service Busï¼å®ä¸ºé¢åæå¡çä½ç³»ç»æ (SOA) ç模åååºç¨ç¨åºæä¾äºåºç¡ï¼å¹¶æ¯æåºç¨ä¸å¡è§åï¼ä»¥é©±å¨æ¯æä¸å¡æµç¨çåºç¨ç¨åºãé«æ§è½ç¯å¢è¿ä½¿ç¨ WebSphere Extended Deployment ä½ä¸ºå ¶åºæ¬åºç¡è®¾æ½çä¸é¨åãå ¶ä» WebSphere 产åæä¾äºå¹¿æ³çå ¶ä»æå¡ï¼å¦ä¸æè¿°ã
WebSphere æ¯ä¸ä¸ªæ¨¡ååçå¹³å°ï¼åºäºä¸çæ¯æçå¼æ¾æ åãæ¨å¯ä»¥ä½¿ç¨åä¿¡ä»»åæä¹ çæ¥å£ï¼å°ç°æèµäº§æå ¥ WebSphereï¼å¹¶ä¸å¯ä»¥éçéè¦çå¢é¿ç»§ç»æ©å±æ¨çç¯å¢ãWebSphere å¯ä»¥å¨è®¸å¤å¹³å°ä¸è¿è¡ï¼å æ¬ IntelãLinux å z/OSã
webShpere æ¯ééåºåççµååå¡æ¶ä»£çæ主è¦ç软件平å°ãå®ä½¿æ¨çå ¬å¸å¯ä»¥å¼åãé¨ç½²åæ´åæ°ä¸ä»£ççµååå¡åºç¨ï¼å¦B2B
çµååå¡ï¼å¹¶æ¯æä»ç®åçç½é¡µå 容åå¸å°ä¼ä¸çº§äºå¡å¤ççåä¸åºç¨ã
WebLogicæ¯ç¾å½beaå ¬å¸åºåçä¸ä¸ªapplication serverç¡®åç说æ¯ä¸ä¸ªåºäºj2eeæ¶æçä¸é´ä»¶ï¼webserveræ¯ç¨æ¥æ建ç½ç«çå¿ è¦è½¯ä»¶ç¨æ¥è§£æåå¸ç½é¡µçåè½ï¼å®æ¯ç¨çº¯javaå¼åçãweblogicæ¬æ¥ä¸æ¯ç±beaåæçï¼æ¯å®ä»å«äººæä¸ä¹°è¿æ¥ï¼ç¶ååå å·¥æ©å±ãç®åweblogicå¨ä¸çapplication serverå¸åºä¸å ææ大ç份é¢ï¼å ¶ä»è¿æ象IBMçwebsphereï¼å è´¹çtomcatãresinçä¸é´ä»¶ã
BEA WebLogicæ¯ç¨äºå¼åãéæãé¨ç½²å管ç大ååå¸å¼Webåºç¨ãç½ç»åºç¨åæ°æ®åºåºç¨çJavaåºç¨æå¡å¨ãå°Javaçå¨æåè½åJava Enterpriseæ åçå®å ¨æ§å¼å ¥å¤§åç½ç»åºç¨çå¼åãéæãé¨ç½²å管çä¹ä¸ã
BEA WebLogic Serveræ¥æå¤çå ³é®Webåºç¨ç³»ç»é®é¢æéçæ§è½ ãå¯æ©å±æ§åé«å¯ç¨æ§ã
ä¸BEA WebLogic Commerce ServerTMé å使ç¨ï¼ BEA WebLogic Serverå¯ä¸ºé¨ç½²éåºæ§ä¸ªæ§åçµååå¡åºç¨ç³»ç»æä¾å®åç解å³æ¹æ¡ã
BEA WebLogic Serverå ·æå¼ååé¨ç½²å ³é®ä»»å¡çµååå¡Webåºç¨ç³»ç» æéçå¤ç§ç¹è²åä¼å¿ï¼å æ¬ï¼
1)é¢å çæ å
对ä¸å å¤ç§æ åçå ¨é¢æ¯æï¼å æ¬EJBãJSBãJMSãJDBCãXMLåWMLï¼ä½¿Webåºç¨ç³»ç»çå®æ½æ´ä¸ºç®åï¼å¹¶ä¸ä¿æ¤äºæèµï¼åæ¶ä¹ä½¿åºäºæ åç解å³æ¹æ¡çå¼åæ´å ç®ä¾¿ã
2)æ éçå¯æ©å±æ§
BEA WebLogic Serverä»¥å ¶é«æ©å±çæ¶æä½ç³»é»åäºä¸å ï¼å æ¬å®¢æ·æºè¿æ¥çå ±äº«ãèµæºpooling以åå¨æç½é¡µåEJBç»ä»¶ç¾¤éã
3)å¿«éå¼å
åå对EJBåJSPçæ¯æï¼ä»¥åBEA WebLogic Server çServletç»ä»¶æ¶ æä½ç³»ï¼å¯å éææ¾å¸åºé度ãè¿äºå¼æ¾æ§æ åä¸WebGain Studioé åæ¶ï¼å¯ç®åå¼åï¼å¹¶å¯åæ¥å·²æçæè½ï¼è¿ éé¨ç½²åºç¨ç³»ç»ã
4)é¨ç½²æ´è¶çµæ´»
BEA WebLogic Serverçç¹ç¹æ¯ä¸é¢å æ°æ®åºãæä½ç³»ç»åWebæå¡å¨ ç´§å¯éæã
5)å ³é®ä»»å¡å¯é æ§
å ¶å®¹éãç³»ç»ç®¡çåå®å ¨æ§è½å·²ç»å¨å ¨çæ°ä»¥åè®°çå ³é®ä»»å¡ç¯å¢ä¸å¾ä»¥éªè¯ã
6)ä½ç³»ç»æ
BEA WebLogic Serveræ¯ä¸é¨ä¸ºä¼ä¸çµååå¡åºç¨ç³»ç»å¼åçãä¼ä¸çµååå¡åºç¨ç³»ç»éè¦å¿«éå¼åï¼å¹¶è¦æ±æå¡å¨ç«¯ç»ä»¶å ·æè¯å¥½ççµæ´»æ§åå®å ¨æ§ï¼åæ¶è¿è¦æ¯æå ³é®ä»»å¡æå¿ éçæ©å±ãæ§è½ãåé«å¯ç¨æ§ãBEA WebLogic Serverç®åäºå¯ç§»æ¤åå¯æ©å±çåºç¨ç³»ç»çå¼åï¼å¹¶ä¸ºå ¶å®åºç¨ ç³»ç»åç³»ç»æä¾äºä¸°å¯çäºæä½æ§ã
ååå ¶åºè²ç群éææ¯ï¼BEA WebLogic Serveræ¥ææé«æ°´å¹³çå¯æ©å± æ§åå¯ç¨æ§ãBEA WebLogic Serveræ¢å®ç°äºç½é¡µç¾¤éï¼ä¹å®ç°äºEJBç»ä»¶ 群éï¼èä¸ä¸éè¦ä»»ä½ä¸é¨ç硬件ææä½ç³»ç»æ¯æãç½é¡µç¾¤éå¯ä»¥å®ç°éæçå¤å¶ãè´è½½å¹³è¡¡ä»¥å表示å 容容éï¼å¦Webè´ç©è½¦ï¼ç»ä»¶ç¾¤éåå¤çå¤æçå¤å¶ãè´è½½å¹³è¡¡åEJBç»ä»¶å®¹éï¼ä»¥åç¶æ对象ï¼å¦EJBå®ä½ï¼çæ¢å¤ã
æ 论æ¯ç½é¡µç¾¤éï¼è¿æ¯ç»ä»¶ç¾¤éï¼å¯¹äºçµååå¡è§£å³æ¹æ¡æè¦æ±çå¯æ©å±æ§åå¯ç¨æ§é½æ¯è³å ³éè¦çãå ±äº«ç客æ·æº/æå¡å¨åæ°æ®åºè¿æ¥ä»¥åæ°æ®ç¼ååEJBé½å¢å¼ºäºæ§è½è¡¨ç°ãè¿æ¯å ¶å®Webåºç¨ç³»ç»æä¸å ·å¤ç
关于Cocos2dx-js游戏的jsc文件解密
上期关于Cocos2dx-js游戏的jsc文件解密教程引发了一些疑问,本文将解答一些常见问题。
首先,我们通过CocosCreator开发工具构建并编译一个案例js工程,发现游戏中存在脚本加密选项。构建后,得到一个简单的互动大师源码样本APK。在APK中,我们通过Jadx-gui工具解析Java层源码,关注assets目录下二进制源代码的加载情况。在入口Cocos2dxActivity的onLoadNativeLibraries函数中,我们找到了加载libcocos2djs.so文件的步骤,该文件位于AndroidManifest.xml中。
初步分析显示,加载Assets目录资源的操作不在Java层进行。接着,我们参考“jsc反编译工具编写探索之路”一文,将注意力转移到libcocos2djs.so文件上。在Cocos2dx源码中,我们发现其使用的是xxtea加密和解密算法,与Cocos2dx-lua的加密解密过程类似。
在游戏实例分析部分,我们以两个游戏案例为例进行解密。对于游戏A,通过十六进制编辑器搜索libcocos2djs.so文件中的Cocos Game字符串,未发现相关信息。使用IDA分析工具对libcocos2djs.so进行深入研究,发现导出函数名清晰,没有添加额外的安全手段。通过搜索xxtea / key相关函数,我们找到了几个相关函数。在jsb_set_xxtea_key函数中,我们尝试直接设置key值,并发现一个可疑的参数v,用于解密jsc文件。通过回溯该函数的调用路径,我们成功获取了Key值,并成功解密游戏文件。
对于游戏B,虽然Key值不像游戏A那样明文显示,但通过搜索附近的字符串,我们发现可疑的Key值与常规的Cocos Game字符串共存。尝试使用此Key值解密游戏文件,同样取得了成功。对比游戏A和游戏B的关键代码,我们发现密匙都在applicationDidFinishLaunching函数内部体现。此函数在Cocos2d-x应用入口中,当应用环境加载完成时回调。理解CocosCreator构建项目的过程后,我们知道游戏应用环境加载完毕后,该函数内部将Key值传入解密函数中,解密函数将jsc文件转换为js文件,并拷贝到内存中,游戏开始调用js文件,进入游戏界面。
在其他关键函数的分析中,我们注意到在xxtea_decrypt函数中存在memcpy和memset操作,表明在进行内存拷贝数据。通过CocosCreator源代码jsb_global.cpp文件,我们得知传入xxtea_decrypt函数的第三个参数即为解密的Key值。因此,我们可以通过Hook libcocos2djs.so文件加载时的xxtea_decrypt函数来获取Key值。使用Frida框架编写简单的js脚本进行Hook操作,可以成功获取Key值。在获取Key值后,可以参照CocosCreator源代码实现解密逻辑,或者利用封装好的解密程序进行文件解密。
最后,对于解密工具的选择,我们推荐使用一些已封装的加解密程序,例如jsc解密v1.,它能够满足当前Cocos2dx版本的文件加解密需求,并提供较为简单的操作方法。同时,欢迎各位分享自己的解密方法和见解,共同推动社区的发展。
jsbsim学习飞行器模型配置文件解读
jsbsim是用于飞行力学仿真的一款开源软件,旨在实现类似IL2/1战争雷霆的空战游戏。在Unity中通过C#封装一个简化版的气动仿真模型,使模型在接收飞行器当前状态后,能输出6个自由度上的力/力矩,以接入Unity的刚体组件。
以jsbsim自带的f-模型配置文件f.xml为例,解析其中内容。
从xml根节点入手,metrics、mass_balance、aerodynamics等部分尤为关键。地面互动、推力、自动控制等稍后关注,因为jsbsim最初专注于自动控制策略仿真,因此flight_control模块较为详细。
配置文件中的缩写繁多,不易理解,但只要直接导入Unity的刚体组件即可。metrics节点描述了飞行器尺寸、位置指标,明确了飞行器坐标系中的VRP概念,即确定飞行器“鼻尖”与坐标原点之间的偏移。
mass_balance节点包含飞行器质量分布参数,涉及惯性张量等理论力学知识点。对于三维情况下刚体角动量与瞬时角速度方向的差异,理解惯性张量有助于预测飞行器在力矩作用下的旋转行为。
aerodynamics节点包含大量表格数据,jsbsim通过查表实现非线性公式/函数计算,采用线性插值处理。节点下包含轴对应飞行器沿x、y、z轴平动、绕轴转动的六个刚体运动自由度。
重点分析了DRAG轴、SIDE轴、LIFT轴、PITCH轴、YAW轴,这些变量描述了飞行器在不同轴向的气动特性。若无法理解某个变量,可在Google搜索或探索jsbsim源代码中找到相关描述。
完成f.xml配置文件解析后,下一步将编写程序加载配置文件并执行动力学运算。若遇到未在Google搜索到的变量,尝试在jsbsim源代码中进行全局搜索,可获得更多线索。
2024-11-30 00:36
2024-11-30 00:33
2024-11-29 23:42
2024-11-29 23:26
2024-11-29 22:57
2024-11-29 22:43