1.Python浪漫表白源码合集(爱心、精致精玫瑰花、源码源码照片墙)
2.C语言C++情人节红玫瑰代码
3.å¦ä¹ Cè¯è¨ å¿
çç书ç±
4.7个源代码/库搜索引擎网站
5.九款好看的松鼠后台管理系统登录模板
6.短视频直播源码,EditText输入框的厅最使用
Python浪漫表白源码合集(爱心、玫瑰花、新版新内照片墙)
程序员浪漫的本更rcs调度系统源码一面,通过Python语言展现出来。精致精以下是源码源码一些Python代码实现的浪漫元素,让你的松鼠表白更加独特且充满创意。
首先,厅最让我们用一行代码画出一个爱心。新版新内这不仅简单,本更而且能够快速表达出爱意。精致精
在代码的源码源码帮助下,一个爱心瞬间呈现眼前,松鼠为你的表白增添一抹温情。
接下来,使用Python的turtle库来绘制一个爱心,并在其中加入浪漫的文字。这样,你可以在表白的同时,向她/他传达更深的情感。
通过精心设计的代码,一个充满爱意的爱心与文字组合展现在你眼前。将情感融入代码之中,让表白更具个人特色。
如果你希望将这份浪漫以更便捷的方式传递给未接触过Python的朋友,不妨将代码生成的图形封装成exe文件。这样,只需简单一步点击,无需额外安装Python环境,即可在对方的电脑上欣赏到这份浪漫。
此外,使用turtle库不仅能够画出爱心和文字,还能绘制出一朵美丽的玫瑰花。给这份表白增添一份细腻和精致,让浪漫氛围更加浓郁。
为了将这份浪漫长久保存,我们可以使用Python生成一张照片墙,用以纪念一段美好的回忆。例如,微信社群源码以《香蜜》剧中的作为素材,精心布局成一张照片墙,每一格都包含一张照片,为你和心爱的人留下珍贵的记忆。
通过Python的代码,你不仅能够绘制出美丽的爱心、玫瑰花,还能生成一张充满回忆的照片墙。这些浪漫的元素,能够让你的表白更加个性化和独特。
无论是通过一行代码画出爱心,还是使用Python的turtle库绘制浪漫的图形,亦或是生成一张充满回忆的照片墙,Python语言都能成为你表达爱意的有力工具。让你的表白更加具有创意,让这段故事成为独一无二的记忆。
C语言C++情人节红玫瑰代码
在浪漫的情人节里,让我们用C++为爱人献上一朵独特的红玫瑰。首先,来看看最终的绘制效果,从初始的形态到盛开的美丽,绝对能打动人心。
要实现这个,我们需要准备相应的图形库头文件,这是基础。接下来,定义一些全局变量和结构体,这些是构建花朵各部分的关键。
计算花的主体,包括精致的花柄、优雅的花萼、翠绿的叶子和盛开的花瓣,每一步都需要精确的编程技巧。花的每个细节,都蕴含着对爱的细腻表达。
最后,让我们步入主函数,将所有的元素整合起来,创造出这朵专属于情人节的红玫瑰。无论你是微信斗牛源码C/C++新手还是经验丰富的程序员,这个过程都能增进技术与情感的交融。
如果你对源代码感兴趣,可以加入我们的学习交流群获取。这里有丰富的学习资料和互助氛围,无论你是大学生、前端开发者还是职场人士,这里都是提升C/C++技能的好地方。祝愿每位程序员都能在代码的海洋中找到属于自己的浪漫,用编程的力量实现梦想,走向技术的巅峰。祝愿大家的情人节表白都能收获满满的爱意!
å¦ä¹ Cè¯è¨ å¿ çç书ç±
Brian W.Kernighanï¼ Dennis M.Ritchieï¼ãCç¨åºè®¾è®¡è¯è¨ã
æ¸ åå½±å°çãä¹ é¢éï¼æºæ¢°è¯æçï¼æ°çãèçï¼ï¼ä¹ é¢é
è¿æ¯è¿ä»ä¸ºæ¢å¨ææç¨åºè®¾è®¡è¯è¨ä¹¦ç±ä¸æ广åå°æ¬çä¸é¨ç»å ¸ï¼æ¯ä»»ä½ä¸åCç¨åºåçå¿ è¯»ä¹ä½ãå 为åºèªCè¯è¨ç设计è Dennis M.Ritchieåèåç计ç®æºç§å¦å®¶Brian W.Kernighanä¹æï¼å®è¢«æµç§°ä¸ºâK&R Câãæ¯å®é¦å å¼å ¥äºâHello Worldï¼âç¨åºï¼è¿ä¸ªç¨åºå ä¹æäºåæ¥ä»»ä½ä¸æ¬å ¥é¨æ§ç¨åºè®¾è®¡è¯è¨ä¹¦ç±ä¸ç第ä¸ä¸ªä¾åã
å¦åCè¯è¨æ¬èº«ç®æ´ç´§åèæå ·å¨åä¸æ ·ï¼è¿æ¬ä¹¦è½»èçå°èæå¯å¼ åãéè¿ç®æ´çæè¿°åå ¸åç示ä¾ï¼å®å ¨é¢ãç³»ç»ãåç¡®å°è®²è¿°äºCè¯è¨çå个ç¹æ§ä»¥åCç¨åºè®¾è®¡çåº
æ³ï¼å 容涵çåºæ¬æ¦å¿µãç±»åå表达å¼ãæ§å¶æµãå½æ°ä¸ç¨åºç»æãæéä¸æ°ç»ãç»æãè¾å ¥ä¸è¾åºãUNIXç³»ç»æ¥å£ä»¥åæ ååºçå 容ã
ç®æ´æ¸ æ°æ¯è¿æ¬ä¹¦æ大çç¹è²ãè¿æ¬å°ä¹¦å¯ä»¥æç»ä½ 许å¤æ¯å®åå åçâ大é¨å¤´âçç¥è¯ãæ认为é£äºå¨è¾æ´æ´æ´æ´æ¼ååºå¥½å ç¾é¡µä¹è³ä¸å页çææ¯ä½è åºè¯¥å¥½å¥½åK&Rå¦ä¸å¦ã对äºä¸ãé«çº§ç¨åºåèè¨ï¼å¦æå¸æè¿ éè·å¾Cè¯è¨ç严èç¥è¯èåä¸æ¿æå¤è±è´¹åªæä¸ä¸ç¹æ¶é´ï¼è¿æ¬ä¹¦å°±æ¯é¦éã
顺便说ä¸å¥ï¼è¿æ¬ä¹¦çç´¢å¼å¶ä½é常åºè²ï¼æå ·å®ç¨ä»·å¼ï¼è¿å¯è½é¦å è¦å½åäºæ£æé¨åçç®ææ¼è¦ãæ¤å¤ï¼å°½ç®¡å®çä¸å»å¾åä¸æ¬æç¨ï¼ä½å ¶å®æ´æ¯ä¸æ¬åç»ä¸ä¸ç¨åºåçæåãå¦æä½ ä¸å ·å¤ä»»ä½å ¶ä»è¯è¨ç¨åºè®¾è®¡èæ¯æåºæ¬çCè¯è¨ç¥è¯ï¼è¿æ¬ä¹¦ä¹è®¸å¹¶ä¸éåç¨ä½ä½ çCè¯è¨å¯è读ç©ã
2. Perter Van Der LinDenï¼ãCä¸å®¶ç¼ç¨ã
Cä¸å®¶ç¼ç¨
Cè¯è¨æ¯ä¸¥èçç¨åºåè¯è¨ï¼ä½è¿å¹¶ä¸æå³çCè¯è¨ä¹¦ç±å¿ é¡»æ¿çé¢å说æãå¨è¿æ¬è¢«Cç¨åºåæµç§°ä¸ºâ鱼书âï¼å°é¢ä¸æä¸æ¡âä¸éçâè æ£é±¼ï¼çèä½ä¸ï¼ä½ä¸ºSUNå ¬å¸ç¼è¯å¨åæä½ç³»ç»æ ¸å¿å¼åç»æåä¹ä¸ï¼Peteræ·æ¼å°½è´å°å±ç¤ºäºå ¶æ·±åçææ¯æ²æ·ã丰å¯ç项ç®ç»éªãé«è¶ çåä½æ巧以åæçå¼çå¹½é»ãå¨è¿é¨ä½åä¸ï¼ä½è 以æµç çæåãè¯è°çç¬æ³å°é¸é»å ¸æ ãæºæ §åå¹½é»èªç¶å°èå ¥ææ¯æè¿°ä¸ï¼è¯»æ¥å®è¥ä¸æ¬å°è¯´ï¼æå¯è¶£å³ã æ¬ä¹¦è®²è¿°äºCè¯è¨çåå²ãè¯è¨ç¹æ§ã声æãæ°ç»ãæéãè¿æ¥ãè¿è¡æ¶ä»¥åå å使ç¨çç¥è¯ï¼æ示äºCè¯è¨ä¸è®¸å¤éæ¦ä¹å¤ï¼å°¤å ¶æ·±å ¥è§£æäºå£°æãæ°ç»åæéãå å使ç¨çæ¹é¢çç»èãè¦æ³æ为ä¸åä¸å®¶çº§Cç¨åºåï¼è¿äºå 容é½æ¯å¿ é¡»ææ¡çãåå ¶ä»æ»¡æ¯æ½è±¡ä¾åçCè¯è¨ä¹¦ç±ä¸åï¼è¿æ¬ä¹¦å 满äºå¤§éçæ¥èªçå®ä¸ççCç¨åºè®¾è®¡å®ä¾ï¼å®ä»¬å¯¹Cç¨åºåå ·æå¾é«çåç §ä»·å¼ãå¦å¤ï¼æ¯ä¸ç« é½ä»¥æå¯è¶£å³çâè½»æ¾ä¸ä¸âæ¶å°¾ï¼èéå½Aâç¨åºåå·¥ä½é¢è¯çç§å¯âåæ¯ä»»ä½è¯è¨çç¨åºåå¨åºèå·¥ä½åå¢å¼ºèªä¿¡ç好ææã
ææççæ£çCä¸å®¶å¯è½ç¨ä¸ççè¿æ¬ä¹¦ ââä»å 容å°ç»ç»æ¹å¼å°è¡æé£æ ¼é½å³å®äºè¿æ¯ä¸æ¬è½»æ¾æå¿«çâä»èé¸å°é«æâçè¿é¶è¯»æ¬ï¼æ以ï¼å®çåºæ¥ææ´å¹¿æ³ç读è 群ãå级ç¨åºåå¾å¾æ´éè¦çæ çé¼å±ï¼å¨é 读è¿æ¬ä¹¦çè¿ç¨ä¸ï¼ä½ å®ä¼æ·±æ·±å°è¢«ä½è 对ç¼ç¨çæ¿æ æææã
ä¸é´å¹¶æ å®ç¾ãæ认为è¿æ¬ä¹¦ç缺é·å¨äºï¼å大å¤æ°å¹³åº¸çCè¯è¨ä¹¦ç±ä¸æ ·ï¼å®ç»è添足å°å å ¥äºä¸ç« å ³äºC++çæè¿°ãå¨ä»å¤©çæ¥ï¼è¿ä¸ªæè¿°æ¢ä¸å ¨é¢ä¹æå¤±å ¬å ãä¸è¿ï¼é´äºä½è æ¯å¨å¹´ä»ä¸åCç¨åºåçè§åº¦å»è§å¯C++ï¼è¿ä¸ç¹ä¹å°±ä¸è¶³ä¸ºå¥äºã 3. Samuel P. Harbisonï¼ Guy L. Steeleï¼ãCè¯è¨åèæåï¼ç¬¬äºçï¼ã
å½±å°çï¼æºæ¢°å·¥ä¸åºç社ï¼ãä¸æçï¼æºæ¢°å·¥ä¸åºç社ï¼
å¨Cè¯è¨åèæå类书ç±éï¼Samuel P. Harbison åGuy L. SteeleåèçCï¼ A Reference Manualæ¯é常åºè²çä¸æ¬ãè¿æ¬æåç第äºçæ°å¢äºå¯¹Cæ åçä»ç»ï¼ä»¥ä¾¿æ»¡è¶³æ°æ¶æCè¯è¨å¦ä¹ çéè¦ãå ¨ä¹¦å ±å为两大é¨åï¼ç¬¬ä¸é¨åä¸æ³¨äºCè¯è¨ç¹æ§ï¼ç¬¬äºé¨ååå ¨é¢è®¨è®ºäºCæ ååºãæ¬ä¹¦æ¶µçCãCãä¼ ç»çCãææçæ¬çCè¿è¡åºä»¥åç¼åä¸C++å ¼å®¹çC代ç çä¸åç¥è¯ã
è¿æ¬æååªæ¯ä¸çå度ï¼ä½å®æ¯âæ¯å®æ´åâçå ¶ä»åèæåæ´æ¸ æ°å°æè¿°äºCè¯è¨çç°å¨åè¿å»çæ¹æ¹é¢é¢ãæ´æ¬æåææ¯ç»èæ述精确ï¼ç»ç»æ¡çæ¸ æ¥ï¼å 容å®å¤è¯¦å°½èåç®ææ¼è¦ãå¯ä»¥è¿ä¹è¯´ï¼å®å¨å¹¿åº¦ã深度å精度æ¹é¢é½æ¯åºç±»æèçã对äºä¸ãé«çº§Cç¨åºåèè¨ï¼è¿æ¬æåå¼å¾å¸¸å¤æ¡å¤´ï¼å®å ä¹è¯å®è¦æ¯K&Rçèä½ä½¿ç¨é¢çæ´é«ã
4. David Hansonï¼ãCè¯è¨æ¥å£ä¸å®ç°ï¼å建å¯éç¨è½¯ä»¶çææ¯ãï¼æºæ¢°å·¥ä¸åºç社
Cè¯è¨æ¥å£ä¸å®ç°ï¼å建å¯éç¨è½¯ä»¶çææ¯
Cè¯è¨è½å¤åç»ä¸åå¤å¹´èä¸è¡°ï¼ä¸ä¸ªéè¦çåå å¨äºå®çéåºè½åãå¨è¿âå¤ç¨âãâé¢å对象âãâç»ä»¶âãâå¼å¸¸å¤çâçå è¿æºå¶æ¼«å¤©é£èç年代ï¼Cè¯è¨ä»ç¶è½å¤ååå®å°èä¼é çè¯è¨ç¹æ§ï¼å¨ç¸å½ç¨åº¦ä¸æ»¡è¶³ç°ä»£è½¯ä»¶ä½ç³»æ¶ææåºçè¦æ±ãåªä¸è¿ï¼æ³è¦è¾¾å°è¿ä¸ªç¨åº¦ï¼å¿ é¡»è¦å¨Cçåºç¨ååä¸è¾¾å°æé«å±æ¬¡ãå¨åµå ¥å¼ãç³»ç»è½¯ä»¶ä»¥å对æ§è½è¦æ±æé«çç³»ç»å¼åä¸ï¼å¼å人åå¿ é¡»è¾¾å°è¿æ ·çå±æ¬¡ï¼çç»ææ¡Cè¯è¨çé«çº§ç¹æ§ï¼æè½å¤åæ¶æ»¡è¶³æçåçµæ´»æ§ãå¤ç¨æ§çè¦æ±ãå¯æï¼è½ç¶Cè¯è¨ææ¯å¾ä¹¦æ±çå æ ï¼ä½æ¯å ³æ³¨è¿ä¸ªå³°é¡¶ä¹åçä½åå´æ¯å±æå¯æ°ãDavid HansonçC Interfaces and Implementationså°±æ¯ä¸ªä¸ç¿æ¥ã
David Hansonæ¯ä¸å 大åé¼é¼çèªç±ç¼è¯å¨lccçåä½è ãå¨è¿ä¸ªé¡¹ç®ä¸ï¼ä»è´è´£æä¾é«åº¦å¯å¤ç¨çåºç¡æ¶æãå¨ä¸æçå®è·µä¸ï¼ä»å®å ¨ä½¿ç¨ANSI Cå½¢æäºä¸æ´å¥å¯å¤ç¨ç»ä»¶åºãè¿å¥ç»ä»¶åºæ¶ææ¸ æ°ï¼æ§è½ä¼å¼ï¼èä¸æä¾äºå¾å¤é«çº§çç¹æ§ï¼æ¯å¦ç±»Win SEHçå¼å¸¸å¤çæºå¶ãå¯ç§»æ¤ç线ç¨åºãé«æ§è½çå åæ± ã丰å¯çå¯å¤ç¨æ°æ®ç»æç»ä»¶ãDavid Hansonæä»å¨åä½è¿äºç»ä»¶çè¿ç¨ä¸æ积累çå¿å¾ä»¥åå¯¹å ¶æºç çç²¾è´åæååæ¬æ¬å°åå¨äºè¿æ¬ä¹¦éãè¿æ ·çèä½ï¼å½ç¶å ªç§°Cè¯è¨é¢åéçéå¿ç»åãé¾æªå·²æ èåææ¯ä½å®¶Richard Stevens对æ¤ä¹¦èµä¸ç»å£ï¼ä»è¯´ï¼âè¿æ¬ä¹¦ä¸çææ¯ï¼å¯¹äºå¤§é¨åCç¨åºåæ¥è¯´ï¼å·²ç»éå¿å¾å¤ªä¹ äºãâ对äºå¸æè½å¨Cè¯è¨åºç¨ä¸è¾¾å°æé«å±æ¬¡çæ ¸å¿ç¨åºåèè¨ï¼è¿æ¬ä¹¦æ¯é¾å¾çå¿ è¯»ä¹ä½ã
å ¶ä»é¤äºä»¥ä¸åæ¬ä¹¦ä»¥å¤ï¼æè¿ä¹ææ¨èAndrew Koenigçèä½ãCé·é±å缺é·ãï¼äººæ°é®çµåºç社ï¼åDeitelç¶ååèçC How to Program两æ¬ä¹¦ã
Cä¸å®¶ç¼ç¨
Andrew Koenigæ¯ä¸çä¸å±æå¯æ°çC++ä¸å®¶ï¼ä»çè¿æ¬ä¹¦å¯è½æ¯æèçä¸æ¬Cè¯è¨ç»å ¸ãå®ç®ææ¼è¦å°è®²è¿°äºCç¨åºè®¾è®¡ä¸çé·é±å缺é·ï¼å æ¬è¯æ³é·é±ãè¯æ³é·é±ãè¯ä¹é·é±ãè¿æ¥ãåºå½æ°ãé¢å¤çå¨ä»¥åå¯ç§»æ¤æ§ç¼ºé·çï¼æåä¸ç« è¿ç»åºäºå ³äºå¦ä½åå°ç¨åºé误ç建议以ååé¢åç« é®é¢çåèçæ¡ã尽管è¿ä¸ªå°ååæ书äºCæ åå¶å®ä¹åï¼ç¶èï¼å³ä½¿å°äºCæ©å·²é¢å¸çä»å¤©ï¼ä¹¦ä¸æå°ç大å¤æ°é·é±å缺é·ä¸å¦åäºå¹´åé£æ ·ä½¿æ们è¦éã
Cç¨åºè®¾è®¡æç¨
Deitelç¶ååèçC How to Programä¸ç´æ¯é常好çCè¯è¨å ¥é¨æç¨ï¼ææ头çä¸è¯æ¬å为ãCç¨åºè®¾è®¡æç¨ãï¼æºæ¢°å·¥ä¸åºç社åºçï¼å书第äºçï¼ãé¤äºå¯¹ææ¯çæ£è§æè¿°ï¼è¾ 以许å¤ç®ææ¼è¦çä¾åï¼å¤ï¼æ¯ä¸ç« åé¢é½å¸¦æå°ç»ãæ¯è¯ã常è§çç¨åºè®¾è®¡é误ãè¯å¥½çç¨åºè®¾è®¡ä¹ æ¯ãæ§è½å¿ åãå¯ç§»æ¤æ§å¿ åã软件工ç¨è¯è¿°ãèªææµéªç»ä¹ åçæ¡çãæ´ä¹¦å å®¹æ¸ æ°ï¼ç»ç»è¯å¥½ï¼æäºé 读åç解ãå¼å¾ä¸æçæ¯ï¼æ许å¤å ¥é¨ä¹¦è¯»å®ä¸éå³å¯ææï¼èè¿ä¸æ¬æ¯ä¸ªä¾å¤ã
ç»è¯ä»¥ä¸è¿å æ¬ä¹¦å¾å¤§ç¨åº¦ä¸å±éäºæè¿°Cè¯è¨åæ ååºæ¬èº«ï¼å¦æå¸æå¦ä¹ æ´ä¸ä¸çãé¢åç¸å ³çCç¨åºè®¾è®¡ææ¯ï¼ä½ å¯ä»¥å¨éæ©é 读è¿å æ¬ä¹¦çåºç¡ä¸ç»§ç»æ¥é ä¸é¨ä¹¦ç±ãæ¤å¤ï¼å¨Cè¯è¨ä¹¦ç±é¢åï¼æ°´å¹³ä¸ç¸ä¸ä¸çä½åæå¾å¤ï¼è¿å æ¬åªæ¯æ ¹æ®æèªèº«çé 读ä½éª
7个源代码/库搜索引擎网站
1. GitHub - 开源代码领域的领航者 GitHub, 作为全球领先的开源代码库和版本控制系统,最近引入了革新性的源代码搜索服务。尽管它在这个领域相对较新,但其庞大的代码库已积累超过亿计,正如一篇博文中所述:“GitHub,无疑是海量宝藏的代名词!” 2. Krugle - 互联网上的搜索巨擘 Krugle凭借超过亿行代码的搜索覆盖,堪称全球最大的源代码搜索引擎之一,甚至声称其搜索结果囊括了全球三分之一开发者的作品。企业级服务更是覆盖了Amazon、IBM等知名企业,如Collab.net和SourceForge,以及Yahoo!等巨头。 3. Koders - Ruby程序员的最爱 Koders的搜索范围超过亿行代码,尤其受到Ruby程序员的热烈追捧。在被Black Duck Software收购后,Ruby搜索量激增倍,超越PHP、Perl和Python,成为该平台的第四大热门语言,仅次于Java、C/C++和C#。 4. Codaes - Linux时代的C/C++聚焦者 Codaes在源代码搜索领域虽然规模较小,拥有约2.5亿代码资源,但主要聚焦Linux C/C++项目,对于如今的技术环境稍显过时。除非Linux相关,否则可能有更多选择。 5. DZone - 用户共享的金融理财源码代码宝库 DZone拥有超过名用户贡献的个代码片段,是寻找代码的宝藏库,但需耐心挖掘。这里隐藏着无数珍贵的编程灵感,适合有毅力的探索者。 6. Snipplr - 精致片段的海洋 尽管Snipplr的用户数略逊于DZone(约人),但代码片段数量却高达,增长迅速。它还提供了针对Textmate、Gedit、WordPress等工具的便捷插件,效率极高。 7. Google Code Search - 搜索领域的无可争议王者 最后,不能不提Google Code Search,作为搜索领域的巨头,其功能强大无需赘言。虽然Google并未透露具体代码库规模,但其与GitHub、SourceForge等海量公共代码库的紧密合作,足以证明其在源代码搜索领域的主导地位。几乎涵盖了所有编程语言的支持,是开发者寻找代码的首选工具。九款好看的后台管理系统登录模板
欢迎观赏九款精心设计的后台管理系统登录模板,它们不仅美观,而且实用,适合直接融入项目中。欲获取源代码,可加入下方指定群组,免费领取。
亲测可用,无任何广告干扰。
1. HTML5全屏下雪背景动画登录注册页面模板
2. 精致的登录注册忘记密码切换界面模板
3. 蓝色大气养殖企业内部管理系统后台登录页面模板
4. 基于Layui蓝色全屏粒子线条动画背景后台登录界面模板
5. 蓝色大气app软件后台管理员登录页面模板
6. 蓝色大气移动推广平台登录界面模板
7. HTML5炫酷线条背景动画后台登录界面模板
8. HTML5全屏酷炫星空闪烁背景动画后台登录界面模板
9. 简洁好看的网站后台登录界面静态模板
欲获取上述源代码,请加入指定群组,下载地址在群公告。
短视频直播源码,EditText输入框的使用
短视频直播源码,EditText输入框的使用 在开发过程中,EditText是一个重要的控件,作为View的子类,它继承了View的属性和方法。为了满足不同的站群程序源码需求,Android提供了一个改进版本的AppCompatEditText,其外观更精致,而功能和用法与EditText相同。 在创建Xml界面时,通过Android:,tools:,自定义属性等方式,可以灵活定义EditText的各种属性。例如宽度、高度、行数、输入限制等,这些常见属性有助于实现界面的精细化设计。 为了提升用户体验和交互效果,我们需要对EditText进行状态监听。如登录功能中的错误提示、聚焦时的视觉变化等,这些通过特定的方法实现。关键的方法包括: 内容编辑监听:实现实时反馈,如内容为空或格式不正确时,系统提示或禁用登录按钮。 聚焦状态监听:选中时改变背景色,处理文本内容显示等。 软键盘自动呼起:在界面加载时,聚焦EditText,自动弹出软键盘,方便用户输入。 通过以上介绍,我们对短视频直播源码中EditText的使用有了基本的了解。更多深入内容和实践技巧,请期待后续文章的分享。如何评价 Nix ?
探索Nix:灵活且强大的软件管理解决方案
Nix,这一独特的软件管理工具,以其基于Nix语言的创新理念,彻底解决了传统软件依赖管理的痛点。每个软件在Nix的世界里都化身为了一个精致的表达式,包含详尽的依赖、源代码和build script,通过SHA哈希标记精确到每一个版本。这个革命性的编译结果存储区store>,确保了所有依赖的严格管理,就像一座井井有条的仓库,每个软件都在其特定的位置,互不干扰。
Nixpkgs,Nix的官方软件库,以其高度模块化的特性,如丝般流畅。通过继承和override功能,用户可以灵活地定制和替换软件的依赖版本,就像定制一辆豪华跑车的内饰一样精细。nix-shell则像是一个魔术师的工具,它能自动生成一个隔离的开发环境,一键部署,无需你亲自动手,为开发工作带来前所未有的便利。
Nix提供的依赖管理功能,类似于APT,但更为全面。它能够确保包括"native"库在内的所有依赖都能得到精确控制,从而提升整个系统的稳定性,就像给建筑打上了坚固的基础。nix-env则是用户环境配置的大师,它通过软链接将软件精确地安置在指定目录,同时调整PATH环境变量,使得软件的调用变得轻而易举。
NixOS,Nix的系统级应用,作为基于Nix构建的发行版,不仅负责系统配置,还能生成虚拟机或容器,为开发者提供了无缝的环境一致性。Nix的优势在于其灵活性和统一的配置格式,然而,它并非完美无瑕。空间占用大、对二进制程序支持有限、文档不够详尽和社区规模相对较小,这些挑战正逐步被国内镜像站的可用性、文档更新以及新软件包库的涌现所弥补。
尽管存在这些问题,但NixOS仍值得一试,特别是对于那些寻求高效配置和稳定性的用户。随着国内支持的加强和社区的活跃,Nix正逐渐成为一种值得信赖的软件管理选择。如果你是一位Linux用户,那么尝试搭建Nix开发环境,解决软件安装的繁琐,或者将其集成到CI构建中,你会发现Nix带来的效率提升是实实在在的。
截止年3月日,Nix环境的完善程度显著提升,国内用户现在可以方便地使用镜像站,文档也得到了充实。尽管我尚未亲身体验Nix发布服务器软件或容器的功能,但相信随着社区的不断进步,这部分将会有更多的实践经验可供参考。现在是时候迈出探索Nix的第一步,看看它如何改变你的软件管理世界了。
Lua5.4 源码剖析——虚拟机2 之 闭包与UpValue
故事将由我们拥有了一段 Lua 代码开始,我们先用 Lua 语言写一段简单的打印一加一计算结果的 Lua 代码,并把代码保存在 luatest.lua 文件中:
可执行的一个 Lua 文件或者一份单独的文本形式 Lua 代码,在 Lua 源码中叫做 "Chunk"。无论我们通过什么形式去执行,或者用什么编辑器去执行,最终为了先载入这段 Lua 的 Chunk 到内存中,无外乎会归结到以下两种方式:1)Lua 文件的载入:require 函数 或 loadfile 函数;2)Lua 文本代码块的载入:load 函数;这两种方式最终都会来到下面源码《lparse.c》luaY_parser 函数。该函数是解析器的入口函数,负责完成代码解析工作,最终会创建并返回一个 Lua 闭包(LClosure),见下图的红框部分:
另外,上图中间有一行代码最终会调用到 statement 函数,statement 函数是 Chunk 解析的核心函数,它会一个一个字符地处理我们编写的 Lua 代码,完成词法分析和语法分析工作,想要了解字符处理整个状态流程的可以自行研读该部分源码,见源码《lparse.c》statement 函数部分代码:
完成了解析工作之后,luaY_parser 函数会把解析的所有成果放到 Lua 闭包(LClosure)对象之中,这些存储的内容能保证后续执行器能正常执行 Lua 闭包对应的代码。
Lua 闭包由 Proto(也叫函数原型)与 UpValue(也叫上值)构成,见源码《lobject.h》LClosure 定义,我们下面将进行详细的讲解:
UpValue 是 Lua 闭包数据相关的,在 Lua 的函数调用中,根据数据的作用范围可以把数据分为两种类型:1)内部数据:函数内部自己定义的数据,或者通过函数参数的形式传入的数据(在 Lua 中通过参数传入的数据本质上也是先赋值给一个局部变量);2)外部数据:在函数的更外层进行定义,脱离了该函数后仍然有效的数据;外部数据在我们的 Lua 闭包中就是 UpValue,也叫上值。
既然 Lua 支持函数嵌套,也知道了 UpValue 本质就是上层函数的内部数据。那么 UpValue 有必要存储于 Lua 闭包(LClosure)结构体当中吗?是为了性能考虑而做的一层指针引用缓存吗?回答:并不是基于性能的考虑,因为在实际的 Lua 运用场景中,函数嵌套的层数通常来说不会太多,个别函数多一层的查询访问判断不会带来过多的性能开销。需要在闭包当中存储 UpValue 主要原因是因为内存。Lua 作为一门精致小巧的脚本语言,设计初衷不希望占用过多的系统内存,它会尽量及时地清理内存中用不到的对象。在嵌套函数中,内层函数如果仍然有被引用处于有效状态,而外层函数已经没有被引用了已经无效了,此时 Lua 支持在保留内层函数的情况下,对外层函数进行清除,从而可以清理掉外层函数引用的非当前函数 UpValue 用途以外的大量数据内存。
尽管外层函数被清除了,Lua 仍然可以保持内层函数用到的 UpValue 值的有效性。UpValue 如何能继续保持有效,我们在之前的基础教程《基本数据类型 之 Function》里面学习过,主要是因为 UpValue 有 open 与 close 两种状态,当外层函数被清除的时候,UpValue 会有一个由 open 状态切换到 close 状态的过程,会对数据进行一定的处理,感兴趣的同学可以回到前面复习一下。
UpValue 有效性例子
接下来我们举一个代码例子与一个图例,表现一下 UpValue 在退出外层函数后仍然生效的情况,看一下可以做什么样的功能需求,加深一下印象,请看代码与注释:
上述代码在执行 OutFunc 函数后,外层的 globalFunc 函数变量完成了赋值,每次对它进行调用,都将可以对它引用的 UpValue 值即 outUpValue 变量进行正常加 1。
函数的内部数据属于函数自身的内容,外部其它函数无法通过直接的方式访问其它函数的内部数据。函数自身的东西会存在于 LClosure 结构体的 Proto*p 字段中。Proto 全称 "Function Prototypes",通常也可以叫做 "函数原型",我们来看一下它的定义,见源码《lobject.h》Proto 结构体:
结构体字段比较多,我们先不细看,后面用到哪个字段会再进行补充说明。函数的内部数据分为常量与变量(即函数局部变量),分别对应上图的如下字段:
1)常量:TValue* k 为指针指向常量数组;int sizek 为函数内部定义的常量个数,也即常量数组 k 的元素个数。
2)局部变量:LocVar* locvars 为指针指向局部变量数组;int sizelocvars 为函数定义的局部变量个数,也即局部变量数组 locvars 的元素个数。
UpValue 的描述信息会存储在 Proto 结构体中的 Upvaldesc* upvalues 字段,解析器解析 Lua 代码的时候会生成这个 UpValue 描述信息,并用于生成指令,而执行器运行的时候可以通过该描述信息方便快速地构建出真正的 UpValue 数组。
至此,我们知道了函数拥有 UpValue,有常量,有局部变量。外部数据 UpValue 也讲完,内部数据也讲完。接下来,我们开始学习函数运行的逻辑指令相关内容。
函数逻辑指令存储于函数原型 Proto 结构体中,这些函数逻辑是由一行行的 Lua 代码构成的,代码会被解析器翻译成 Lua 虚拟机能识别的指令,我们把这些指令称为 "OpCode",也叫 "操作码"。Proto 结构体存储 OpCode 使用的是下图中红框部分字段,见源码《lobject.h》Proto 结构体:
至此,我们可以简单提前说一下 Lua 虚拟机的功能了,本质上来看,Lua 虚拟机的工作,就是为当前函数(或者当前一段 OpCode 数组)准备好数据,然后有序执行 OpCode 指令。
对 OpCode 有了一定的认识了,接下来我们要补充一个 OpCode 相关的 Lua 闭包相关的内容,就是 Lua 闭包的运行环境。
一个 Lua 文件在载入的时候会先创建出一个最顶层(Top level)的 Lua 闭包,该闭包默认带有一个 UpValue,这个 UpValue 的变量名为 "_ENV",它指向 Lua 虚拟机的全局变量表,即_G 表,可以理解为_G 表即为当前 Lua 文件中代码的运行环境 (env)。事实上,每一个 Lua 闭包它们第一个 UpValue 值都是_ENV。
ENV 的定义在我们之前提到的解析器相关函数 mainfunc 中,见源码《lparser.c》:
如果想要设置这个载入后的初始运行环境不使用默认的 _G 表,除了直接在该文件代码中重新赋值_ENV 变量这种粗暴且不推荐的方式以外,通常是通过我们前面提到的加载 Lua 文件函数或加载 Lua 字符串代码函数传入 env 参数(Table 类型),就可以用自定义的 Table 作为当前 Lua 闭包的全局变量环境了,env 参数为上面两个函数的最末尾一个参数,'[' 与 ']' 字符中的内容表示参数可选,函数的定义摘自 Lua5.4 官网文档:
所以我们可以在 Lua 代码通过 _ENV 访问当前环境:
在 Lua 的旧版本中,变量的查询最多会分为 3 步:1)先从函数局部变量中进行查找;2)找不到的话就从 UpValue 中查找;3)还找不到就从全局环境默认 _G 表查找。而在 Lua5.4 中,把 UpValue 与全局 _G 表的查询统一为 UpValue 查询,并把一些操作判断提前到了解析器解析阶段进行,例如函数内部使用的某个 UpVaue 变量在代码解析的时候就可以通过 UpValue 描述信息知道存储于 Lua 闭包 upvals 数组的哪个下标位置,在执行器运行的时候只需要直接在数组拿取对应下标的这个 UpValue 数据即可。
从 OpCode 的层面来看,Lua 除了支持通过一个 UpValue 数组下标访问一个 UpValue 变量,在把 _G 表合并到 UpValue 之后,Lua 为此实现了通过一个字符串 key 值从某个 Table 类型的 UpValue 中查询变量的操作。
至此,我们了解了 Lua 闭包的结构与运行环境,以及 OpCode 的基本概念。接下来,我们将深入学习 OpCode,掌握 OpCode 就掌握了整个 Lua 虚拟机数据与逻辑的流向。
2024-11-26 14:572700人浏览
2024-11-26 14:13473人浏览
2024-11-26 13:31355人浏览
2024-11-26 12:562954人浏览
2024-11-26 12:50842人浏览
2024-11-26 12:471443人浏览
1.php源代码保护——PHP加密方案分析&解密还原2.html网页如何加密,防止内容被人盗用,如何防止网站内容被采3.如何保护源代码,防止其泄露、扩散。有什么源代码保护软件没有?php源代码
1.成品网站源码1688免费推荐:免费推荐1688成品网站源码推荐2.想做一个有拼团功 秒杀 砍价功能的小程序要多少钱?3.京东茅台1499真的假的-如何抢购京东茅台14994.码线上抢购,限时特价
1.《我的世界》村民是什么?2.对于网络上我的世界于迷你世界之间的争执越来越激烈甚至还不文明语言对骂,你们怎么看?《我的世界》村民是什么? 村民是《我的世界》里的NPC,无毒无公害,也没有太大作用