1.Android studio从Github克隆源代码并导入的教程
2.windows下paho.mqtt安装教程(C/C++)
3.cloneåforkè°ç¨çåºå«åèç³»
4.lodash源码分析——deepclone
Android studio从Github克隆源代码并导入的教程
自从Android studio给开发代码的工具绑定了很多的插件,也集成了github的功能可以通过这个github直接下载到自己仓库中的源代码,然后直接加载到Android studio的开发界面中,就无需要从github先下载然后在从Android studio导入已下载的源代码文件。
从而一步到位方式解决了。1、微博源码下载首先,需要进入到Android studio的界面中,然后点击菜单中的"VCS"选项,在弹出的可以看到为“checkout from version control”选项。2、通过checkout from version control会进行弹出下一级菜单,然后进行点击“github”的选项。
3、会弹出的master password的选项,需要进行输入girhub的wstmall源码密码,输入完成后点击“ok”4、弹出clone repository框中,parent directory中电脑中保存的路径地址,而Directory name为保存的文件名。
5、弹出checkout from version control的是否使用Android studio打开确认的信息,直接点击“yes”。6、导入项目import project中选择构建的插件,选择gradle,然后点击“next”。7、project输入项目昵称,project location而保存的项目路径。
8、tightvnc源码如果导入项目路径很多,选择一个项目路径,然后点击“fisrh”。9、这样在Android studio中从github下载源代码并打开了项目,就可以进行编辑了。
windows下paho.mqtt安装教程(C/C++)
(1)Github仓库地址:
C库:
C++库:
(2)Visual Studio (社区版即可)
(3)CMake
选择最新版本的Installer即可:
安装过程比较简单,一路next,注意把CMake加到系统路径里即可:
2、编译C库
这里的主要步骤均来自于仓库的readme。
首先clone源码到本地文件夹,例如MQTT\paho.mqtt.c ,它包含几个文件夹:
然后打开CMake客户端,需要依次完成以下步骤:
(1)选择源代码路径,也就是csharp源码source code:
这个路径就是上面clone的路径。
(2)选择输出路径,CMake会将生成的vs工程保存在这个路径下,这里为了方便,可以直接在源码路径下新建一个文件夹,例如build:
(3)配置configure,点开后如下:
第一个是选择VS的版本,一般选择比较高的即可,这里是。然后选择输出平台,可根据情况选择x或win。这里没有特殊参数,就可以忽略Optional toolset...,然后选择下面的工具链为跨平台:
整体的选择如下:
然后点击Next,选择cmke文件夹下的toolchain:
这里根据前面选择的输出平台选择win或者,然后点击完成。viicms 源码
CMake界面如下,显示配置完成:
然后可以看到一大片红色区域,它是CMake的编译选项,这里主要关注一下PAHO即可,点击展开后,有如下选项:
这些选项都很好理解,可以看仓库的介绍,这里截取一部分如下:
这里注意,选择的PAHO_BUILD_SHARED或者 PAHO_BUILD_STATIC最好是和后面编译C++版本的选项要一致。我这里选择SHARED。
这里要注意一点,记住这个路径,后面编译C++库会用到:
(4)点击生成(Generate),产生VS工程目录,位置在第(2)步选择的那个路径。
然后就可以通过VS编译了,完成后,可以看到
这些是编译C++库需要的一些文件。
最后一步:安装生成的这些库文件,方便后续编译C++库文件。
首先在源码路径打开命令行窗口或者powershell,输入如下命令,并执行:
这一步的意义是把编译出的文件安装到指定的目录,这个目录就是第(3)步末尾提示的那个CMAKE_INSTALL_PREFIX路径,后面编译C++库文件时会用到,当然也可以在CMake中指定别的目录,如果默认的这个目录需要管理员权限才能创建,可以选择一个普通的目录(当然也可以管理员权限运行这条命令)。
这个目录下的文件如图:
后面会用到\lib\cmake\eclipse-paho-mqtt-c路径下的几个文件。
3、编译C++库
同样先把源码clone下来,然后打开CMake,按照上面编译C库的方式设置那些选项,但不需要设置工具链,直接默认即可。
点击完成后会报错:
原因是没找到eclipse-paho-mqtt-c,它就是刚刚要设置的C库安装目录,找到设置这个路径的CMake的选项如下,填上C库的安装目录:
然后重新配置,就成功了。
下一步点击生成,会报新的错误:
原因是CMakeList里行报错:
这里是要编译静态库版本,这与C库生成的不符合,直接把这个if编译选项去掉即可。
再次尝试又会报错:
原因是CMakeList选择的是security版本,这里在git仓库也有描述:
所以,我们看C库的安装目录下是哪个,就把CMakeList里替换掉:
将eclipse-paho-mqtt-c::paho-mqtt3as替换为eclipse-paho-mqtt-c::paho-mqtt3a 就大功告成,点击生成,就全部完成了,打开生成的VS工程,编译。
整个过程要注意的是:C库的编译选项和C++库的编译选项最好保持一致。
cloneåforkè°ç¨çåºå«åèç³»
å¨Linuxä¸ä¸»è¦æä¾äºforkãvforkãcloneä¸ä¸ªè¿ç¨å建æ¹æ³ã
é®é¢
å¨linuxæºç ä¸è¿ä¸ä¸ªè°ç¨çæ§è¡è¿ç¨æ¯æ§è¡fork(),vfork(),clone()æ¶ï¼éè¿ä¸ä¸ªç³»ç»è°ç¨è¡¨æ å°å°sys_fork(),sys_vfork(),sys_clone(),åå¨è¿ä¸ä¸ªå½æ°ä¸å»è°ç¨do_fork()å»åå ·ä½çå建è¿ç¨å·¥ä½ã
fork
forkå建ä¸ä¸ªè¿ç¨æ¶ï¼åè¿ç¨åªæ¯å®å ¨å¤å¶ç¶è¿ç¨çèµæºï¼å¤å¶åºæ¥çåè¿ç¨æèªå·±çtask_structç»æåpid,ä½å´å¤å¶ç¶è¿ç¨å ¶å®ææçèµæºãä¾å¦ï¼è¦æ¯ç¶è¿ç¨æå¼äºäºä¸ªæ件ï¼é£ä¹åè¿ç¨ä¹æäºä¸ªæå¼çæ件ï¼èä¸è¿äºæ件çå½å读åæéä¹åå¨ç¸åçå°æ¹ãæ以ï¼è¿ä¸æ¥æåçæ¯å¤å¶ãè¿æ ·å¾å°çåè¿ç¨ç¬ç«äºç¶è¿ç¨ï¼ å ·æè¯å¥½ç并åæ§ï¼ä½æ¯äºè ä¹é´çé讯éè¦éè¿ä¸é¨çé讯æºå¶ï¼å¦ï¼pipeï¼å ±äº«å åçæºå¶ï¼ å¦å¤éè¿forkå建åè¿ç¨ï¼éè¦å°ä¸é¢æè¿°çæ¯ç§èµæºé½å¤å¶ä¸ä¸ªå¯æ¬ãè¿æ ·çæ¥ï¼forkæ¯ä¸ä¸ªå¼éåå大çç³»ç»è°ç¨ï¼è¿äºå¼é并ä¸æ¯ææçæ åµä¸é½æ¯å¿ é¡»çï¼æ¯å¦æè¿ç¨forkåºä¸ä¸ªåè¿ç¨åï¼å ¶åè¿ç¨ä» ä» æ¯ä¸ºäºè°ç¨execæ§è¡å¦ä¸ä¸ªå¯æ§è¡æ件ï¼é£ä¹å¨forkè¿ç¨ä¸å¯¹äºèå空é´çå¤å¶å°æ¯ä¸ä¸ªå¤ä½çè¿ç¨ãä½ç±äºç°å¨Linuxä¸æ¯éåäºcopy-on-write(COWåæ¶å¤å¶)ææ¯ï¼ä¸ºäºéä½å¼éï¼forkæå并ä¸ä¼çç产ç两个ä¸åçæ·è´ï¼å 为å¨é£ä¸ªæ¶åï¼å¤§éçæ°æ®å ¶å®å®å ¨æ¯ä¸æ ·çãåæ¶å¤å¶æ¯å¨æ¨è¿çæ£çæ°æ®æ·è´ãè¥åæ¥ç¡®å®åçäºåå ¥ï¼é£æå³çparentåchildçæ°æ®ä¸ä¸è´äºï¼äºæ¯äº§çå¤å¶å¨ä½ï¼æ¯ä¸ªè¿ç¨æ¿å°å±äºèªå·±çé£ä¸ä»½ï¼è¿æ ·å°±å¯ä»¥éä½ç³»ç»è°ç¨çå¼éãæ以æäºåæ¶å¤å¶åå¢ï¼vforkå ¶å®ç°æä¹å°±ä¸å¤§äºã
fork()è°ç¨æ§è¡ä¸æ¬¡è¿å两个å¼ï¼å¯¹äºç¶è¿ç¨ï¼forkå½æ°è¿ååç¨åºçè¿ç¨å·ï¼è对äºåç¨åºï¼forkå½æ°åè¿åé¶ï¼è¿å°±æ¯ä¸ä¸ªå½æ°è¿å两次çæ¬è´¨ã
å¨forkä¹åï¼åè¿ç¨åç¶è¿ç¨é½ä¼ç»§ç»æ§è¡forkè°ç¨ä¹åçæ令ãåè¿ç¨æ¯ç¶è¿ç¨çå¯æ¬ãå®å°è·å¾ç¶è¿ç¨çæ°æ®ç©ºé´ï¼å åæ çå¯æ¬ï¼è¿äºé½æ¯å¯æ¬ï¼ç¶åè¿ç¨å¹¶ä¸å ±äº«è¿é¨åçå åãä¹å°±æ¯è¯´ï¼åè¿ç¨å¯¹ç¶è¿ç¨ä¸çåååéè¿è¡ä¿®æ¹å¹¶ä¸ä¼å½±åå ¶å¨ç¶è¿ç¨ä¸çå¼ãä½æ¯ç¶åè¿ç¨åå ±äº«ä¸äºä¸è¥¿ï¼ç®å说æ¥å°±æ¯ç¨åºçæ£æ段ãæ£æ段åæ¾çç±cpuæ§è¡çæºå¨æ令ï¼é常æ¯read-onlyçã
vfork
vforkç³»ç»è°ç¨ä¸åäºforkï¼ç¨vforkå建çåè¿ç¨ä¸ç¶è¿ç¨å ±äº«å°å空é´ï¼ä¹å°±æ¯è¯´åè¿ç¨å®å ¨è¿è¡å¨ç¶è¿ç¨çå°å空é´ä¸ï¼å¦æè¿æ¶åè¿ç¨ä¿®æ¹äºæ个åéï¼è¿å°å½±åå°ç¶è¿ç¨ã
å æ¤ï¼ä¸é¢çä¾åå¦ææ¹ç¨vfork()çè¯ï¼é£ä¹ä¸¤æ¬¡æå°a,bçå¼æ¯ç¸åçï¼æå¨å°åä¹æ¯ç¸åçã
ä½æ¤å¤æä¸ç¹è¦æ³¨æçæ¯ç¨vfork()å建çåè¿ç¨å¿ é¡»æ¾ç¤ºè°ç¨exit()æ¥ç»æï¼å¦ååè¿ç¨å°ä¸è½ç»æï¼èfork()åä¸åå¨è¿ä¸ªæ åµã
Vforkä¹æ¯å¨ç¶è¿ç¨ä¸è¿ååè¿ç¨çè¿ç¨å·ï¼å¨åè¿ç¨ä¸è¿å0ã
ç¨ vforkå建åè¿ç¨åï¼ç¶è¿ç¨ä¼è¢«é»å¡ç´å°åè¿ç¨è°ç¨exec(execï¼å°ä¸ä¸ªæ°çå¯æ§è¡æä»¶è½½å ¥å°å°å空é´å¹¶æ§è¡ä¹ã)æexitãvforkç好å¤æ¯å¨åè¿ç¨è¢«å建åå¾å¾ä» ä» æ¯ä¸ºäºè°ç¨execæ§è¡å¦ä¸ä¸ªç¨åºï¼å 为å®å°±ä¸ä¼å¯¹ç¶è¿ç¨çå°å空é´æä»»ä½å¼ç¨ï¼æ以对å°å空é´çå¤å¶æ¯å¤ä½ç ï¼å æ¤éè¿vforkå ±äº«å åå¯ä»¥åå°ä¸å¿ è¦çå¼éã
clone
ç³»ç»è°ç¨fork()åvfork()æ¯æ åæ°çï¼èclone()å带æåæ°ãfork()æ¯å ¨é¨å¤å¶ï¼vfork()æ¯å ±äº«å åï¼èclone()æ¯åå¯ä»¥å°ç¶è¿ç¨èµæºæéæ©å°å¤å¶ç»åè¿ç¨ï¼è没æå¤å¶çæ°æ®ç»æåéè¿æéçå¤å¶è®©åè¿ç¨å ±äº«ï¼å ·ä½è¦å¤å¶åªäºèµæºç»åè¿ç¨ï¼ç±åæ°å表ä¸çclone_flagsæ¥å³å®ãå¦å¤ï¼clone()è¿åçæ¯åè¿ç¨çpidã
lodash源码分析——deepclone
这篇文章深入剖析了lodash库的deepclone函数,基于4..版本。它并非常规的性能优化或常用功能讲解,而是从初学者角度出发,逐行解析源码,探讨了深拷贝的实现机制。
首先,我们从入口函数cloneDeep.js开始,这个函数的简单调用隐藏了后面的复杂逻辑。它通过掩码位控制是否深度复制和处理symbol类型。接着进入baseClone函数,这里进行了对象类型的判断,如baseClone同文件下的isObject函数。
在getTag和baseGetTag.js中,作者关注了浏览器对symbol的支持。在现代浏览器中,它们可以利用Symbol.toStringTag属性获取对象类型,但对于自定义对象,此属性并不适用。在处理特殊类型时,如symbol和环的问题,lodash通过构造栈来确保兼容性和性能。
总结来说,lodash的deepclone方法在处理复杂数据结构时表现出色,包括对特殊类型(如symbol)的处理和环的检测。然而,它并未深度复制函数类型,且不处理原型链上的属性。整体来看,这是一种细致入微且兼顾兼容性的实现策略。