1.7个源代码/库搜索引擎网站
2.PHP7源码之array_unique函数分析
3.pikachu靶场的详细搭建
4.程序员学习一般去哪些网站?
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等海量公共代码库的紧密合作,足以证明其在源代码搜索领域的主导地位。几乎涵盖了所有编程语言的同步 源码支持,是开发者寻找代码的首选工具。PHP7源码之array_unique函数分析
以下源码基于 PHP 7.3.8
array array_unique ( array array[,intarray[,intsort_flags = SORT_STRING ] ) (PHP 4 >= 4.0.1, PHP 5, PHP 7) array_unique — 移除数组中重复的值 参数说明: array:输入的数组。 sort_flag:(可选)排序类型标记,用于修改排序行为,主要有以下值: SORT_REGULAR - 按照通常方法比较(不修改类型) SORT_NUMERIC - 按照数字形式比较 SORT_STRING - 按照字符串形式比较 SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。
array_unique 函数的源代码在 /ext/standard/array.c 文件中。由于篇幅过长,完整代码不在这里贴出来了,可以参见 GitHub 贴出的源代码。
定义变量
首先是定义变量,array_unique 函数默认使用 PHP_SORT_STRING 排序,PHP_SORT_STRING 在 /ext/standard/php_array.h 头文件中定义。
可以看到和开头PHP函数的sort_flag 参数默认的预定义常量 SORT_STRING 很像。
compare_func_t cmp 这行代码没看懂,不清楚是做什么的。compare_func_t 在 /Zend/zend_types.h 中定义:应该是定义了一个指向int 型返回值且带有两个指针常量参数的函数指针类型,没有查到相关资料,先搁着,继续往下看。
参数解析
ZEND_PARSE_PARAMETERS_START(1, 2),第一个参数表示必传参数个数,第二个参数表示最多参数个数,即该函数参数范围是源码 连接 1-2 个。
数组元素个数判断
这段代码很容易看懂,当数组为空或只有 1 个元素时,无需去重操作,直接将array 拷贝到新数组 return_value来返回即可。
分配持久化内存
这一步只有当sort_type 为 PHP_SORT_STRING 时才执行。在下面可以看到调用 zend_hash_init 初始化了 array,调用 zend_hash_destroy 释放持久化的内存。
设置比较函数
进行具体比较顺序控制的函数指针是cmp,是通过向 php_get_data_compare_func 传入 sort_type 和 0 得到的,sort_type 也就是 SORT_STRING 这样的标记。
php_get_data_compare_func 在 array.c 文件中定义(即与 array_unique 函数同一文件),代码过长,这里只贴出默认标记为 SORT_STRING 的代码:
在前面的代码中,我们可以看到,cmp = php_get_data_compare_func(sort_type, 0); 的第二个参数,即参数 reverse 的值为 0,也就是当 sort_type 为 PHP_SORT_STRING 时,调用的是 php_array_data_compare_string 函数,即 SORT_STRING 采用 php_array_data_compare_string 进行比较。继续展开 php_array_data_compare_string 函数:
可以得到这样一条调用链:
string_compare_function 是一个 ZEND API,在 /Zend/zend_operators.c 中定义:
可以看到,SORT_STRING 使用 zend_binary_strcmp 函数进行字符串比较。下面的代码是 zend_binary_strcmp 的实现(也在 /Zend/zend_operators.c 中):
上面的代码是比较两个字符串。也就是linux内核 源码SORT_STRING 排序方式的底层实现是 C 语言的 memcmp,即它对两个字符串从前往后,按照逐个字节比较,一旦字节有差异,就终止并比较出大小。
数组排序
这段代码初始化一个新的数组,然后将值拷贝到新数组,然后调用zend_sort 排序函数对数组进行排序。排序算法在 /Zend/zend_sort.c 中实现,注释有这样一句话:
Derived from LLVM's libc++ implementation of std::sort.
这个排序算法是基于LLVM 的 libc++ 中的 std::sort 实现的,算是快排的优化版,当元素数小于等于时有特殊的优化,当元素数小于等于 5 时直接通过 if else 嵌套判断排序。代码就不贴出来了。
数组去重
回到array_unique 上,继续看代码:
遍历排序好的数组,然后删除重复的元素。
众周所知,快排的时间复杂度是O(nlogn),因此,array_unique 函数的时间复杂度是O(nlogn)。array_unique 底层调用了快排算法,加大了函数运行的时间开销,当数据量很大时,会导致整个函数的运行较慢。
pikachu靶场的详细搭建
为了构建一个名为pikachu的靶场,首先需要在计算机上安装phpstudy,这是一个包含了Apache、FTP、MySQL、Nginx的集成环境软件。下载并安装后,最好将phpstudy放置在一个专门的文件夹中,以便于后续查找。启动过程中,如果遇到端口占用问题,只需关闭该端口;若MySQL始终无法正常启动并关闭,通过任务管理器关闭先前运行的mysqld.exe程序,即可解决。
接着,获取pikachu靶场的源代码。此代码可以从GitHub(github.com/zhuifengshao...)下载,或直接从百度网盘(pan.baidu.com/s/1PZr6Q8...,提取码:)获取。下载后,将名为pikachu的文件夹放置于phpstudy的WWW目录下,即E:\phpstudy\phpstudy_pro\WWW。
使用phpstudy创建本地网站,输入域名“pikachu”(方便记忆),端口为“”。浏览并选择之前下载的pikachu文件夹,点击确认完成网站创建。确保对pikachu-master目录下的inc文件夹内的config.inc.php文件进行配置,修改数据库用户名和密码,推荐使用Visual Studio Code或EditPlus编辑器,如果这些工具未安装,记事本也可满足需求。
在config.inc.php文件中,将第十行的数据库用户名和第十一行的数据库密码替换为对应数据库的实际用户名和密码。默认用户名和密码通常为“root”,但建议后期自行更改。完成替换后,靶场搭建基本完成,访问localhost/pikachu即可开始使用。
最后,确保对pikachu-master目录下的pkxss内的inc文件夹下的config.inc.php文件也进行相应的配置,路径为E:\phpstudy\phpstudy_pro\WWW\pikachu-master\pkxss\inc。按照相似步骤,替换配置文件中的数据库用户名和密码,或选择创建新数据库。
完成所有配置后,打开浏览器访问localhost/pikachu,即可体验pikachu靶场。初始化安装后,就可以开始愉快地“打靶”了。希望这一过程能帮助需要搭建pikachu靶场的用户。
程序员学习一般去哪些网站?
GitHub国外的网站,各种知名的公司以及开源框架源码,可以直接把框架源码clone到本地,也可以大胆把你所想写出来,pull上去成为贡献者,向国内外各种大佬学习他们的优秀编程思想和架构技术,也是一个体现程序员级别的地方。
csdn
专业IT技术社区:号称国内的github,为1亿技术人员提供一个优秀的学习和交流的平台,以技术博客论坛为主,无数的星级大牛博主,有些更是出书的大牛,每天都在上面分享一些自己的点点滴滴。坚持写作,从点滴做起。
知乎
本是一个分享各种人生杂谈,和一些鲜为人知以及各种大牛的免费和付费的知识型网站。由于流量逐步扩大,吸引了大批优秀的程序员在上面分享自己的技术创作,也是一个程序员常去的网站之一,不仅仅是为了学习技术。
OSChina(开源中国)
开源中国,上面有非常非常多的各种开源软件和插件。没准你公司用的哪个网站或app就是从上面copy下来的,有免费的有收费的,各种各样琳琅满目。算是一个比较古老的大而全的技术论坛和博客社区了,值得收藏。
StackOverFlow
这是一个由外国人创办的专为程序员提供的国际性问题解答交流社区,正如网站签名:Stack Overflow - Where Developers Learn, Share, & Build Careers。这个网站非常的纯粹,一般人还真不太习惯用这个,没有一手好英语还看不太懂全英文的技术交流与问答。
简书
简书是一个不仅仅为程序员提供的创作分享社区,上面充满了各种各样精彩的博文,不难看出这个网站的创始人的初衷是做全品类的创作社区,野心还是蛮大的哟。不过要做大而全就很难做到专业了,相比较与csdn个人认为在技术创作方面就略低一筹了。
牛客网
偶然发现上面的东西真的很有价值,这个网站不像csdn和OSChina以技术博客论坛为主了。但是在你需要的时候,却是相当有价值,里面有面试技巧、各种知名的不知名的互联网公司的对应往年校招社招面试题库,刷到你手软。
cnBlogs(博客园)
也是国内早起一批专为程序员们提供的一个免费技术论坛博客,上面有各种各样你想要寻找的解决方案,以及各种各样你见到的没见到的疑难杂症,值得拥有。
LeetCode
几乎每个算法大牛都知道的神奇网站,这个网站上面有:算法、数据库、Shell、多线程等多种类型供你学习。多数人在上面练习编程算法,尤其是给想进入一线互联网公司的技术人员,提供了一个免费又方便的题库。面试前都会在上面进行长期和充分的刷题,是你的不二选择。