首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
13
篇与
的结果
2024-01-24
令人感动的创富故事编号001:27岁Python程序员年入$600万+
27岁Python程序员年入$600万+27岁的你,在做什么?为家庭生计而努力搬砖,辛勤工作?还是放弃挣扎,选择躺平呢?当我们还在为未来道路感到困惑之际,年仅27岁的Reilly已经迈向了财富自由的大门。Reilly是一位Python程序员。2018年初,他启动了SaaS业务。并在博客中进行分享,介绍他刚刚尝试过的方法、哪些有效、哪些无效。在产品发布后,他获得了一些早期客户,但并没有赚到很多钱,但他一直在尝试各种方法来成长……在2019年1月,他被解雇了,因为他的雇主不喜欢他兼职,尽管他的工作能力非常出色。最终,他决定全力投入SaaS业务,甚至卖掉了自己的房子,为SaaS事业换取更大的资金支持。令人惊讶的是,他被解雇后,给了他更多的动力去发展SaaS,这也让他的SaaS取得了成功 —— Reilly独自开发了一款名叫HostiFi的软件产品(HostiFi是一个SaaS平台),这是一款能监测和管理网络设备的软件。如今,他的SaaS产品不再只是一个副业项目,而是他的一切。随着使用软件的用户数越来越多,上线近5年时间,Reilly的收入超过了600万美元。现在的Reilly已经不再被雇主支配,读书、编程、运动、旅游……讨论业务,平时没事儿的时候他还会开着车去森林里兜风,过起了人人向往的生活。是不是足够令人羡慕呢?程序员是实现财富自由最容易的职业之一。但临渊羡鱼不如退而结网,不断的学习、尝试、折腾,距离梦想就会越来越近。
2024年01月24日
13 阅读
0 评论
0 点赞
2023-12-30
每天学一点知识有用吗
每天学一点知识有用吗在探索学习PHP的过程中,我发现了一种基于微习惯的学习方式,比如每天花十分钟编写PHP代码,或者每天阅读一篇关于PHP的资料。尽管这种方法颇受欢迎,但它也有一些限制,有时会淘汰更高效的练习方法。长时间跨度的学习方式很难让人明确自己是否在进步,也难以根据进度调整学习方式。更重要的是,简单习惯的设定对于难度较大的任务来说,可能只是一个好的起点,而不是最终的学习方式。微习惯有缺点,但我必须承认,密集式的项目也存在一些问题!这些大动干戈的项目安排起来很困难,执行起来更是困难重重,而且由于缺乏适当的间歇时间,记住的知识也不多。最好的做法不是一味地坚持某一种方式,而是明白每种方法都有其长处和短处。因此,今天我想讨论一下微习惯在学习PHP方面更有效。只要你能保持长久的坚持,微习惯学习法的优势就能展现出来,主要有两个:间隔效应和便利性。先来说说间隔效应。这是一个经过国外深入研究的领域。我们发现,对于间隔时间更长的信息,我们记忆得更牢固,而同样的信息,如果在短时间内接触过多次,反而记不住。举个例子,如果你在十复看一个PHP函数十次,你肯定比在一个小时内反复看十次记得更牢。通过拉长学习时间,微习惯能更好地利用间隔效应,使记忆更持久,相比于一口气学习一大堆,更加有效。便利性。在日常工作和生活中,我们要做的事情很多,学习PHP本身就已经够难了,但是无论多忙,我们每天都能抽出十分钟的时间来。考虑到这两个优势,我认为我们需要考虑哪些学习目标更适合简单持久的微习惯。Q那么微习惯什么时候能派上用场呢?根据我对微习惯的理解,我倾向于认为,只有当学习PHP的内容不需要太多脑力劳动,并且可以在短时间内完成时,微习惯才能发挥效果。根据"认知负荷理论"的基本思想,信息只有通过狭窄的意识瓶颈才能进行学习。复杂的PHP知识和技能,那些需要将多个信息片段融合在一起才能理解的,会导致较高的认知负荷。这就是为什么学习PHP的高级概念和技巧会很困难的原因。然而,对于PHP的认知负荷并不是固定的!当你学习时,你的大脑会使用一些机制,比如分块或检索线索,来减轻工作记忆的负担。例如,当你刚开始学习PHP时,认知负荷非常高,因为你必须努力理解每个语法规则。但最终,随着你对PHP语法的熟悉程度提高,认知负荷就降低了。不同的PHP学习内容对工作记忆的需求是不同的。有些PHP技巧和概念本身就有很高的认知负荷,因为它们有很多新的相互作用的部分。相反,其他一些概念基本上是独立的,可以一次学习一个。根据这种理解,用微习惯的方式学习PHP的卡片记忆方法可能对记住一些独立的PHP知识有帮助,但对于学习解决复杂的PHP问题的能力来说,可能效果就不那么好大量信息装载到短期记忆中,因此对于大部分缺乏经验的PHP学习者来说,有效的练习活动更像是需要你在一段时间内专注的一系列问题。微习惯可能更适合于保持PHP知识和流利度,而不是开拓新的PHP技能领域。长期、重复的练习对提高流利度是理想的,但在纠正反馈存在的情况下做出刻意的调整时,效果就不那么明显了。。所以,每天保持低强度的PHP编程习惯可能会让编程变得更轻松,但可能不会帮助你达到更高的熟练度。后者可能需要刻意练习,强制自己使用不那么熟悉的PHP风格或结构,并需要一定的专注和努力(可能还需要一些外部反馈)。这种习惯无法通过微习惯来持续。根据我的个人经验,在某些场景下微习惯是非常有用的,当然也有一些效果不尽如人意的时候。以下几种情况,微习惯可能会发挥的知识:广泛的学科知识。每天阅读PHP相关的博客、观看教育类的视频,或者浏览相关的PHP论文,可能不会让你成为PHP专家,但它可以让你了解相关的PHP知识,需要实践来提升你的熟练度。使用卡片记忆孤立的事实。这些可以制成独立、可快速测试的知识碎片,也是一个很好的选择。我过去成功地利用零碎的时间学习了很多词汇,这也有助于知识的维持。提高流利度和维护已掌握的技能。保持最小化的努力可以帮助你熟练掌握PHP,这也是最终精通的一部分。相反,我如果需要刻意练习的复杂PHP技能,或者在微习惯所要求的时间和努力限制内无法进行有效练习的情况下,微习惯可能不适用。需要注意的是,耐心和急躁的区别通常是基于实际学习时间的考虑。根据一些合理的估计,要掌握PHP可能需要500至2000小时的课堂时间。如果你每天用微习惯的方式,比如每天十分钟学习,一年坚持下来,你可以达到相当不错的PHP水平!总结简而言之,微习惯可能适用于保持PHP知识和流利度,对于开拓新的PHP技能和需要刻意练习的情况可能不太适用。了解自己的学习目标和学习内容的特点,选择适合自己的学习方式是最重要的。
2023年12月30日
16 阅读
0 评论
0 点赞
2023-12-26
吐血整理!数十个程序员硬核工具奉上!
吐血整理!数十个程序员硬核工具奉上!在我认识的所有程序员里,每个人几乎都有专属于自己的常用工具和相关资源,今天给大家奉上数几十个程序员硬核工具,我相信这里总有一款工具是属于你的,所以一定要看到最后哟!程序员生产力工具大全如下:Idea-Intellij IDEA (java 编程语言 开发的集成环境)业界排名第一的java开发工具,非常非常好用,如果还在用eclipse的朋友,赶紧来体验一把,你一定会爱上她的。SecureCRT (SSH终端仿真程序)SecureCRT是一款终端仿真程序,支持SSH(SSH1和SSH2)以及Telnet和rlogin协议。SecureCRT用于连接运行包括Windows、UNIX和VMS在内的远程系统的理想工具。Termius (全平台的远程终端)termius是一款全平台的远程终端,Termius不仅涵盖了Windows、Linux、OSX,还变态得支持Android和iOS(以后在地铁、公交上都可以随时拿出手机来排查线上问题啦,还真是广大程序员的福音呢。Google Chrome (谷歌浏览器)Google Chrome是一款由Google公司开发的网页浏览器,该浏览器基于其他开源软件撰写,包括WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。iTerm (为Mac OS X编写的终端仿真程序)iTerm是一个为Mac OS X编写的,功能齐全的终端仿真程序;目标是在为用户提供OS X下最佳的命令行体验;字母i代表了本地苹果的外观和风格的程序界面,并把重点放在完整的国际支持;它合并由两个项目, CTerminal和TerminalX ,而这两者都是基于JTerminal项目;该软件非常有实用和易用性。Visual Studio Code (简称“VS Code”,编写现代Web和云应用的跨平台源代码编辑器)重新定义和优化了代码编辑,以便生成和调试新式 Web 应用程序和云应用程序。也是著名的文本编辑器,它是轻量级的,vSCode的一大特点就是你可以通过多种方式来调整设置,而且Vim可以和VScode集成在一起,它还带有一个集成终端,可用的扩展太多,使开发人员的工作变得更加轻松。我最喜欢的一些扩展是AWS Toolkit, ESLint,Live Server, Live Share, Prettier-代码格式化程序,YAML,Live Sass编译器,Docker等。VMware Fusion & VMware workstation (为计算机开发的虚拟机管理程序)是在计算机上无缝运行 Windows 的最佳方式,可确保 Windows 应用程序在计算机上实现无缝运行可以在基于 Intel 的计算机上无缝运行 Windows、Linux 以及其他 PC等多个操作系统,进而构建、测试或演示软件。Navicat Premium (数据库管理工具)Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 资料库,让管理不同类型的资料库更加的方便。Postman (api调试工具)简单来说,四个词,简单、实用、大方、美观!postman这款网页调试工具的windows客户端,功能强大的HTTP调试与模拟插件。使用Postman可以进行API开发、请求、调试,除了它,还可以使用lnsomnia和Insomnia Designer作为API文档。RedisDesktopManager (一款可视化 redis管理工具 )Redis Desktop Manager是一款简单快速、跨平台的Redis桌面管理工具,也被称作Redis可视化工具,Redis Desktop Manager官方版是一款开源软件,支持通过SSH Tunnel连接,支持windows、mac等多平台。Dash (基于MAC的 API文档浏览器和代码片段管理器)“开发者不可或缺的杰作。”Dash 可让您的 Mac 即时离线访问 200 多个 API 文档集。立刻搜索离线文件集200层+的API ,100+备忘单和 href="">更多 功能。您甚至可以"">生成自己的文档集 或 href="">请求 包含href="">文档集 。Fiddler & Wireshark (http抓包工具)Fiddler和Wireshark都是进行抓包的工具:所谓抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。作为开发者,经常想调试一下http请求发送的数据的详情,那么可以使用这2款软件。用抓包工具wireshark的人相对来说更多一些。HBuilder X (HTML5的Web开发工具)当前最快的HTML开发工具,强大的代码助手帮你快速完成开发,最全的语法库和浏览器兼容性数据让浏览器碎片化不再头痛。作为HBuilder下一代的全新编辑器,HBuilderX被定位为ide和编辑器的完美结合,除了对某种语言的语法分析、提示、转到定义、调试,同时加强了对通用文本处理能力,界面更加清爽,拥有比上一代更加有效的快捷键体系。MobaXterm (远程终端控制软件,集串口,SSH远程登录和FTP传输三合一的工具)多功能终端MobaXterm Professional Edition 是一款豪华、全功能的终端软件。MobaXterm带来了所有必要的Unix命令到Windows桌面,在开箱单便携式exe文件。MobaXterm允许您启动远程会话。远程shell,MobaXterm远比Putty好用,您可以选择创建SSH,远程登录,Rlogin,RDP,VNC,XDMCP,FTP,SFTP或串行会话。Sublime Text (跨平台代码编辑器)http://www.sublimetext.cn/Sublime Text 是一款用于代码、标记和散文的精致文本编辑器。Sublime Text 中文网致力于为广大国内开发者提供详尽的中文文档、使用说明等,助力开发者快速掌握这个编辑器。16.webstorm (专业的HTML编辑工具)web开发的必备的一款开发神器,比如写js、页面、css,那么这款软件用起来非常顺手。此软件和idea出自于同一家公司,这家公司做了很多异常好用的软件,基本上你需要的各种开发相关的IDE,这家公司都生产。可以说是“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”。新版对JavaScript,TypeScript和CSS支持更好,改进了Vue.js的体验,并为Jest集成增加了新功能。17.Xshell (功能强大的终端模拟器)linux原创控制软件,完全免费且非常稳定的 SSH 客户端 ,支持多种远程协议,提供了很多特色与高级功能,简体中文界面也让你轻松管理远程服务器。Xshell 的 Screen 会话不闪屏,而且可以回滚;Script 的执行顺序可以调整;可以同时发送指令到多个 session;支持布局切换等。SwitchHosts (修改Hosts文件的工具)这是用于在多个HOSTS之间进行切换。可在公用hosts文件 、当前系统hosts、本地方案和在线方案间进行切换。作为一名开发人员,经常需要修改本地host,你还是通过修改host文件来操作的么?那样太慢了,这里建议大家使用switchhosts这款软件,可以快速修改本地host,非常好用。其他工具:CodeIf(智能命名) :https://unbug.github.io/codelf大部分开发者都或多或少遇到过变量命名的烦恼,如果命名不规范,不仅会影响开发的效率,而且对后面维护的同学来说也是一个不小的挑战,因为他要去揣摩你这个变量的含义。随着项目越来越复杂,变量和函数数量越来越多,虽然每个编程语言都有各种命名规范,但是也不能解决所有的问题。“计算机科学里两件最难的事:缓存失效和命名。” Codelf通过搜索在线开源平台Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Project的项目源码,帮开发者从中找出已有的匹配关键字的变量名,从而帮助为变量名苦恼的开发者命名。这个搜索服务支持直接搜索中文。同时可以在自己用的编辑器里安装插件,支持 VS Code、Atom、Sublime Text 和 Chrome。DocsChina-印记中文 : https://www.docschina.org这是一个前端中文文档合集,进入网站可以看到开发中经常使用的前端中文文档。如果你的英文实在不怎么好,还在为找中文文档而烦恼,这里将是你非常好的选择。记得放到自己的浏览器收藏夹里哦!any-rule(正则表达大全):http://github.com/any86/any-ruleany-rule 维护了一个常用正则表达式合集,并且本身是一个支持 Web/VS Code/idea/Alfred Workflow 多平台的正则表达式工具。tool.lu(在线工具): https://tool.lu程序员总是有很多小工具要使用,比如、Base64编码、Markdown编辑器时间戳转换,进制转换等,在线运行各种语言代码。这个网站包含了太多程序员需要用到的小工具了。比如你想运行点JAVA代码,又不想麻烦的在系统中安装JAVA环境,可以使用里边的在线运行代码工具,然后选择JAVA,写点JAVA代码就可以直接运行了。Baomitu(前端静态源库): https://cdn.baomitu.com这个静态资源库是支持HTTP/2的CDN服务,有了它,如果你是自己的小型项目或者是做测试就不用下载任何的代码库,直接粘贴地址过来用就可以,因为是国内的CDN库,速度还非常的快。Typora-Markdown(编写工具):https://www.typora.io一款实用的 Markdown 编写工具,所见即所得,用Markdown编写文章是一个程序员的标准配置,也就是标配。现在有很多在线工具都支持Markdown,什么有道云笔记、雀语,、印象笔记等。这种简单的界面,沉浸式的编写,清晰的大纲,它就像一件称手的兵器,让你一旦拥有就爱不释手。Snipaste (简单便捷的截图软件):https://zh.snipaste.com/download.html一款免费的桌面截图软件,功能强大,使用方便,支持任何屏幕位置截图,支持窗口截图,支持快捷方式截图。您可通过截取贴图,使两张图合并为一张图,还能调整截图文字图像等等,是一款非常强大的贴图软件,喜欢此款贴图软件的朋友不要错过。Captura (最好用的开源录屏、gif动态制作工具)官网:https://captura.updatestar.com/github:https://github.com/MathewSachin/Captura通过这款工具可以帮助你轻松录制各种视频。支持全屏录制、区域录制两种方式,全屏录制可以录制全部的电脑屏幕,将电脑屏幕上所有的动态都录制下来,该软件还拥有视频编解码器,可以对视频进行解码,支持mp4、avi、GIF、webm等格式,可以满足一般的解码需要。还支持屏幕截图、剪贴板,简单的图像编辑等功能,是一款非常好用的屏幕录像工具。向日葵 (远程控制软件):https://sunlogin.oray.com/向日葵远程控制是一款提供远程控制服务的软件。向日葵远程控制支持主流操作系统Windows、Linux、Mac、Android、iOS跨平台协同操作,在任何可连入互联网的地点,都可以轻松访问和控制安装了向日葵远程控制客户端的设备。整个远控过程,可通过浏览器直接进行,无需再安装软件。Everything (本地文件检索工具):http://www.voidtools.com/support/everything/由voidef="">tools 开发的一款文件搜索工具,这款软件是基于名称实时定位文件和目录。Everthing功能强大,体积小巧,第一次安装使用时会建立一个索引数据库,将所有文件和文件夹的名称导入其中,后续使用能够以极快的速度快速搜索,查找到你所需要的文件。StarUML (UML画图工具)画uml图的一款神器,类图、时序图、流程图、状态图等等,都可以用这款工具轻松应对。uTools (生产力工具集):https://u.tools/一个极简、插件化、跨平台的现代化桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。这个工具,我只能说他是一款神奇,太牛逼,这款工具中汇集了很多好用的工具,可以通过这款工具秒开电脑上的各种软件。搜索资源网站工具:1.BingBing 国际版:https://cn.bing.com/感觉比某度要好用多了。2.DuckDuckGoDuckDuckGo:https://duckduckgo.com/从官网的介绍来看这个搜索引擎不收集用户信息,而且没有广告。3.Stack OverflowStack Overflow:https://stackoverflow.com/我们如果常用 Google,很多技术问题的答案就在这个网站上,如果你无法使用 Google 可以在这个网站上直接检索就好了。4.GitlogsGitlogs:https://www.gitlogs.com/Gitlogs 是专门针对 GitHub 项目的搜索引擎,我们通过他可以快速找到想要项目。5.jiumo search文档搜索引擎 jiumo search 鸠摩搜书:https://www.jiumodiary.com/可以用来找一些技术文档手册,很多在百度网盘里。6.EbookeEbooke:https://ebookee.org/Ebookee 是一个基于互联网并提供免费电子图书下载的搜索引擎网站。7.Iconfinder图标搜索:https://www.iconfinder.com/用来查找 logo 。8.TinEyeTinEye:https://www.tineye.com用来检索,我们可以上传或输入的 URL 来检索。9.SemanticScholarSemanticScholar:https://www.semanticscholar.org/SemanticScholar 是一个免费学术搜索引擎,其检索结果来自于期刊、学术会议资料或者是学术机构的文献。10.LibreStockLibreStock:https://librestock.com/LibreStock 上可以检索一些优质的高清。http://11.CC SearchCC Search:https://ccsearch.creativecommons.org/CC Search 上搜索到的资源都是无版权的,我们可以免费的使用。12.PexelsPexels:https://www.pexels.com/高质量的网站,可以免费使用。13.UnsplashUnsplash:https://unsplash.com/免费高清素材网站。14.The App StoreThe App Store:https://theappstore.org/The App Store 是一个针对苹果手机、iPad、Mac 设备的应用搜索工具。在线画图工具:在线画图工具ProcessOn:https://www.processon.com/在线画图工具http://draw.io:https://app.diagrams.net/在线思维导图工具:http://www.mindline.cn/webappPlantUML在线编辑器:http://haha98k.com/在线开发辅助工具:日常开发经常会用到一些辅助工具我总结为8大类,包括:编解码工具、转换工具、正则工具、编译工具、网络工具、格式化工具、可视化工具、在线生成器、以及其他工具等等。具体列表如下:在线编码工具:BASE64编解码工具:https://base64.supfree.net/• MD5编码工具:https://www.zxgj.cn/g/md5• AES/DES加解密:http://www.fly63.com/tool/cipher/• JWT解码工具:http://jwt.calebb.net/• ASCII编解码工具:https://www.matools.com/code-convert-ascii• Unicode编解码工具:https://www.zxgj.cn/g/unicode• UTF-8编解码工具:https://www.zxgj.cn/g/utf8• 字符串编解码工具:https://www.zxgj.cn/g/enstring• URL编解码工具:http://tool.chinaz.com/tools/urlencode.aspx?jdfwkey=lbixz1在线转换工具:在线ASCII码对照表:http://www.fly63.com/tool/ascii/• 通用进制转换工具:https://www.zxgj.cn/g/jinzhi• 在线浮点数十进制转换:http://www.binaryconvert.com/• RGB颜色转换:https://www.zxgj.cn/g/yansezhi• 时间戳转换工具:https://www.zxgj.cn/g/unix• 计量单位换算工具:http://www.fly63.com/tool/unitable/• 在线JSON解析:http://www.json.cn/• 在线JS代码格式化工具:https://prettier.io/playground/• SQL压缩/格式化工具:https://www.zxgj.cn/g/sqlformat• JSON和XML在线转换:https://www.zxgj.cn/g/jsonxml• JSON/YAML在线转换:http://www.fly63.com/tool/jsonyaml/• 人民币大小写转换工具:http://www.fly63.com/tool/renmingbi/正则表达式工具:正则表达式调试工具:https://regexr.com/• 正则表达式可视化工具:https://jex.im/regulex/网络工具:IP地址归属地查询:https://www.ip138.com/• IP地址查询:https://www.ipip.net/ip.html• HTTP在线接口测试工具:http://www.fly63.com/php/http/在线编译运行工具:C# 在线编译运行:https://rextester.com/• C/C++在线编译调试:https://www.onlinegdb.com/• 在线编译工具套装:https://c.runoob.com/可视化/格式化工具:在线前端编辑器: https://codepen.io/• 在线数据可视化:https://flourish.studio/• 在线JSON解析:http://www.json.cn/• 在线CSS代码可视化工具:https://enjoycss.com/• XML格式化工具:https://www.zxgj.cn/g/xmlformat• 在线JS代码格式化工具:https://prettier.io/playground/• SQL压缩/格式化工具:https://www.zxgj.cn/g/sqlformat• JSON和XML在线转换:https://www.zxgj.cn/g/jsonxml• JSON/YAML在线转换:http://www.fly63.com/tool/jsonyaml/在线生成器:UUID在线生成器:https://www.zxgj.cn/g/uuid• 随机数生成器:https://www.zxgj.cn/g/suijishu其他常用工具:在线Nginx配置工具:https://nginxconfig.io/• 在线对比工具:http://www.fly63.com/tool/textdiff/• 在线Chrome浏览器插件:https://www.crx4chrome.com/• 在线接口文档管理工具:http://www.docway.net在线素材工具:如果你写文章,或者做视频,那就一定少不了要找素材,包括各种、背景、emoji表情、表情包、壁纸、视频、gif图等等。• 免费透明背景素材:http://pngimg.com/• Emoji表情搜索:https://emoji.svend.cc/• Emoji表情包下载:https://emojiisland.com/• open source icons:https://feathericons.com/• 表情包在线网站:https://fabiaoqing.com/• 免费PNG库:https://pluspng.com/• ICON图标在线下载:https://www.iconfinder.com/• 极简壁纸:https://bz.zzzmh.cn/• Wallpaper Abyss壁纸:https://wall.alphacoders.com• Pixabay素材库:https://pixabay.com/zh/• Unsplash素材库:https://unsplash.com• Pexels素材库:http://www.pexels.com• NASA视频素材库:https://images.nasa.gov设计制作类工具:对于那些文章创作者和视频创作者而言,设计封面,做海报,设计LOGO,美化等等基本也是刚需。这样大概率日常会用到一些简易好上手的在线设计制作类工具,比如在线P图、音/视频轻量化剪辑、logo制作、海报设计制作、美化、在线转换或生成等等。• 在线PS:https://www.uupoop.com/• 在线音频剪辑:https://www.weixinsyt.com/• 在线视频剪辑:https://www.kapwing.com/• 免费logo在线制作:http://www.uugai.com/• 艺术字体在线生成:https://www.qt86.com/• 在线表格转换工具: https://tableconvert.com/• 在线海报设计工具:https://www.designcap.com/• 智能放大工具:https://bigjpg.com/• 二维码美化器:https://mh.cli.im/• 在线代码截图工具:https://carbon.now.sh/• 在线抠图工具:https://www.remove.bg/zh• ICO图标在线生成:http://www.fly63.com/php/ico/• SVG转PNG工具:http://www.fly63.com/tool/svg2img/• 视频转GIF工具:http://www.fly63.com/tool/giftxt/• 二维码在线生成器:http://www.fly63.com/tool/ewm/• 二维码在线解码:http://www.fly63.com/php/decoder/写辅助工具:写文章的过程中经常会用到和写作相关的辅助工具,比方说:字数统计工具、Markdown格式的文章排版工具、图床网站、代码截图工具等等,所以下面这些在线工具就能很好地满足我的需求。• 在线字数统计:https://www.eteste.com/• mdnice markdown排版工具:https://mdnice.com/• md2all markdown排版工具:http://md.aclickall.com/• 在线图床神器:https://picx.xpoet.cn/• 在线免费图床:https://sm.ms/• 图壳图床:https://imgkr.com/• 在线代码截图工具:https://carbon.now.sh/• 在线短链接工具:https://urlify.cn/• 在线文本替换:http://www.fly63.com/tool/textreplace/在线办公工具:部分在线工具主要用来处理一些和文档以及文稿相关的事情,经常用到的比如:在线的全套pdf处理和转换工具、各种各样多媒体文件间的相互转换工具、在线识别工具、在线压缩工具等等。• pdf在线处理工具1:https://smallpdf.com/cn/pdf-tools• pdf在线处理工具2:https://tools.pdf24.org/zh/• pdf转word在线工具:https://www.pdftoword.com/• 在线多媒体转换器合集:https://cn.office-converter.com/• 在线文字识别工具:https://ocr.wdku.net/• 在线文件压缩工具:https://docsmall.com/文档笔记工具:好记性不如烂笔头,作为一个学习者,我觉得记笔记是必不可少的步骤。当然现在基本都做电子笔记和电子文档比较多。现如今各式各样优秀的文档工具和笔记软件鳞次栉比,好用的也有很多,整理成如下列表,这东西各有长处,使用哪个最合意还得看个人习惯和需求了。• 印象笔记:https://www.yinxiang.com/• 有道笔记:https://note.youdao.com/• OneNote:https://www.onenote.com/• 幕布:https://mubu.com/• 为知笔记:https://www.wiz.cn/• 石墨文档:https://shimo.im/• Simplenote:https://simplenote.com/• 语雀:https://www.yuque.com/编程学习网:• php中文网:https://www.php.cn/• 哔哩哔哩:https://www.bilibili.com/• C语言网:https://www.dotcpp.com/• cppreference:http://zh.cppreference.com/• 中国大学MOOC:https://www.icourse163.org/• 牛客网:http://www.nowcoder.com• 网易公开课:http://open.163.com• CodeGym:https://codegym.cc/• BeginnersBook:https://beginnersbook.com/• JavaSED:http://www.javased.com/• codecademy:https://www.codecademy.com/• Coursera:https://www.coursera.org/• StackOverFlow:https://stackoverflow.com/• LeetCode:https://leetcode-cn.com/• LintCode:https://www.lintcode.com/
2023年12月26日
10 阅读
0 评论
0 点赞
2023-08-30
一个故事告诉你什么才是好的程序员
一个故事告诉你什么才是好的程序员从一个故事说起在应用开发如此方便的今天,我总是会听到有些人有这样的疑问,“只是做 应用 开发的话,还有没有必要学习诸如操作系统,编译原理这样的课程呢?”,亦或是会听到这样的话,“会用这个框架就行了,它底层是怎么实现的不用去管。”还记得我在大一学 C 语言的时候,就听过有同学说我以后是想从事 Java 开发的,C 语言这种学来应付一下考试就行,指针什么的其他语言又没有,就不用去管啦。真的是这样吗?刚好今天看到一个有意思的故事,从故事中我看到了答案,这个故事是是艾萨克·阿西莫夫 的科幻巨作《基地》中的一个片段。故事是这样的:在银河系中,随着战争的蔓延,文明从银河系边缘开始逐渐退化,许多星球虽然还保留着核电站等高科技产品,但是已经不知道它们是如何运作的。而有这样一颗小行星,我们暂且称之为 科技星 吧,在大战爆发前它搜集了银河系中的各种科学文献,并且汇聚了一大批的顶尖科学家。这颗小行星没有被卷入战争,而是将技术一直传承下去。科技星周围的星球觊觎它所拥有的高科技,想将之夺取。而科技星又没有自保的武装力量,在这种情况下,科技星如何自保呢?这里最有意思的地方,正是科技星所使用的科技宗教的战略。当后来其他星球上的高科技出现问题的时候,会向科技星求救。科技星就会派遣工程师前去维修,但是呢,他们将各种身份都进行包装,比如,工程师不叫做工程师,而是叫做“僧侣”,核电站也不叫做核电站,而是叫“圣殿”,维修也不叫做“维修”,而是叫做“祈祷”,也就是说,对核电站维修这一项工作完全被宗教化了!而此时科技星提供的说法是这样,因为这颗星球上的人做了坏事,比如违反法规,发动战争等等,触犯了神灵,所以神灵剥夺了他们使用能源的权力。而如果想要恢复能源,就必须对自己的行为忏悔,祈求神灵的原谅。所以当工程师进入核电站进行维修的时候,所有的星球居民一起下跪祈祷,而当核电站恢复的时候,大家纷纷称颂神的伟大。为什么那些拥有核电站星球的人们会对来维修的工程师“膜拜祈祷”呢?其根本原因还是在于核电站这样的高科技对他们而言是神秘的,未知的东西。 尽管他们拥有这样高科技的东西,却没有与之匹配的认知和知识储备。再回过头来看看一开始的问题,你是否明悟了呢?我们也是掌握着上层应用框架这种“高科技”,我们知道怎么去配置,怎么去调用,就像上面故事中普通星球的人知道怎么启动,关闭核电站一样。但一旦出了无法解决的问题,或者是遇到了什么性能瓶颈,似乎我们能做的,只能去各种技术群里,找那些大神“祈祷”了。再来说说人工智能在今天,人工智能这个名词已经逐渐为人们所熟知。而未来,人工智能的应用场景只会越来越广泛,面向 AI 编程也必然会是一种趋势。那么现在从事于 Web 或是 Android 等应用开发的程序员需要去学习机器学习或是深度学习相关的知识吗?我的回答是 YES 。有人说我又不想从事于人工智能的开发工作,为什么还要去学它呢呢?我想说的是,为了避免成为上面故事中那些普通星球的居民。再过几年,当你碰到一个会跟你说话的机器人或是更加奇妙的事物的时候,我们应该是对它的一些实现细节感兴趣,会有探究的欲望。而不是在那里感慨着造物主真伟大,竟能造出一个这样神奇的东西。话又说回来,在机器学习或是深度学习的学习过程中其实也很容易陷入到这种只会调用上层 API 而不知底层原理模型的境地。因为在今天,有很多库类都可以让你轻松实现一条语句就直接使用某个算法模型,所以很多人就不再专注于对底层模型原理的学习。在机器学习的学习过程中,相信大多数人应该都看过这样一张图,我们来看看这张图中 Hacking Skills 和 Substantive Expertise 的交界处,这里叫 Danger Zone,即危险区。意思是如果你只会编程和调用机器学习的 API,调参数,那么你就处于一种很危险的境地。结语一个好的程序员,不应当满足于学习到了什么新的技术或者学习了什么新的算法模型。真正有价值的东西,往往是那些人们不乐意去学的底层的,枯燥的内容。 我们应该认识到,单单只会上层应用开发或只会调包调模型而不懂底层原理,那这种开发人员的知识体系便如空中阁楼。看起来华丽壮观,但实际上却地基不稳。一旦出现一点问题这座阁楼便会顷刻崩塌,并且无计可施,只能到处“祈祷”。 对未知的事务保持好奇,不断学习,探究事物的本质,原理。在我看来,这才是程序员之道。
2023年08月30日
19 阅读
0 评论
0 点赞
2023-08-19
如何写出优雅的代码
如何写出优雅的代码一、好代码的定义谈到好代码,我的第一想法就是优雅,那我们如何该写出好的代码,让阅读的人感受到优雅呢?首先简单探讨一下优雅代码的定义。关于好代码的定义,各路大神都给出了自己的定义和见解整洁的代码如同优美的散文。—— Grady Booch任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。—— Martin Fowler首先要达成一致,我们写的代码,除了用于机器执行产生我们预期的效果之外,更多的时候是给人读的,可能是后续的维护人员,更多时候是一段时间后的作者本人,因此优雅面向不同的用户有两层含义的解读。对人而言,代码的整洁,清晰的逻辑;对机器而言,准确性、执行性能、异常处理机制等;这次,我们就来聊一聊,什么代码是优雅的代码,怎样写出优雅的代码。二、代码整洁1. 有意义的命名简单说就是 类、方法、变量的命名要名副其实,要能描述清晰自己的职责 。一个好的命名能输出更多的信息,它会告诉你,它为什么存在,它是做什么事的,应该怎么使用。 一个简单的衡量标准是,如果命名完仍需要注释来补充语义,那就不是名副其实 ;选个好名字要花时间,但省下的时间的时间比花掉的多,一旦发现有更好的名称,就换掉旧的。举个例子:public List<int[]> getItem() { List<int[]> list1 = new ArrayList<int[]>(); for (int[] x: theList) if (x[0] == 4) list1.add(x); return list1; }整体逻辑没啥问题,读完之后,就有很多问题在脑海中产生theList中是存储什么东西的数组?theList第一个值是做什么的?值4的意义又是什么?返回的列表该怎么使用?代码应该体现所处的情景 ,比方说上述的代码所处情景是我们正在开发一种扫雷游戏,盘面是名为theList的单元格列表,那就将其名称改为gameBoard。盘面上每个单元格都用一个简单数组表示。零下标条目是一种状态值,而这种状态值为4代表“已标记”。只要改为有意义的名称,代码就得到了改进。更进一步,不用int数组来表示单元格,而是另写一个类。该类包括一个名副其实的函数(称为isFlagged),从而掩盖住哪个魔术数4,得到新的函数版本。public List<Cell> getFlaggedCells() { List<Cell> flaggedCells = new ArrayList<Cell>(); for (Cell cell : gameBoard) if (cell.isFlagged()) flaggedCells.add(cell); return flaggedCells; }2. 优雅的注释实际上,只要我们的代码有足够的表达力,能清晰的通过命名来做到名副其实,就不太需要注释,或者根本不需要; 注释的存在往往是弥补我们无法用代码清晰表达意图的情况。 可以想象一下,每次自己发现需要写注释的时候,是什么心态,担心此处代码明天自己看不懂或者别人看不懂,那有没有考虑用更好的语义的代码来替代。但尽管有注释,也有好有坏,有时候注释也会撒谎,通常注释存在的越久,就离其描述的代码越远,变得越来越离谱;因为代码在变动在迭代,在注释和代码间可能会插入新的代码,旧代码我们通常copy来copy去,分离又重组,但注释一般不会修改,就会造成注释和描述的代码分离,对阅读者造成更大的迷惑。我们在需要写注释的时候就要告诉自己,能不能用代码来进行描述。 以下是一些坏代码的注释bad case(坏 案例)。1. 一些被注释掉的代码//something code //something code2. 位置标记//begin someting code; //end3. 签名标记/** add by xiaoli*/4. 非公用方法的javadoc/** * doSomething */ private void doSomething(){ }5. 日志式注释/** add xx * update sometimes * update sometimes * update sometimes */6. 误导性注释//此处怎样xx3. 优雅的函数3.1 务必要短小方法应该有多短小?没有明确约束,idea也不会限制你,但通常我们的 方法不该长于一屏 ,至少多于一屏或者横向外溢到屏幕以外最直观的就会造成可读性体验差,读了下面忘记上面,左右拖拽等。 对大多数笔记本来说一屏大概就30行左右。短小精简的方法要比30行短很多 ,比如:public String renderPageWithSetupAndTeardowns(Page page, boolean isSuite) throws Exception{ if(isTestPage(page)){ includeSetupAndTeardownPages(page,isSuite); } return page.getHtml(); }if语句、else语句、while语句等,其中的代码应该只有一行。改行通常是一个调用语句,这样不但能保持短小,还可以给调用方法命名一个有说明性的名字,进一步增加代码的可读性3.2 只做一件事一事精,便可动人。这个普世法则甚至适用于各种场合。 像设计原则的单一职责模式,让类只有一个职责。如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致逻辑混乱,设计耦合。 当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。针对方法而言更是如此。方法作为程序的原子单元,保持 单一会有效提升复用性 。 那怎么判断一个方法是否只做了一件事。最简单的规则就是 看看该方法是否能在拆出一个方法,且拆出去的方法是不同于该方法的诠释和实现。但是要注意同一方法的逻辑层级务必要一致。3.3 抽象层级一致抽象层级一致也是 对方法只做一件事的更高要求,抽象层级不一致的代码一定是做了多件事。 我们读代码通常是自顶向下阅读,我们想让每个方法后面都跟着位于下一层级的方法,这样我们可以依着抽象层级向下阅读了。我们也需要这样 阅读代码,先有整体在展示细节,这种叫向下规则。这也是保持方法短小,确保只做一件事的诀窍 。一旦方法中混杂不同的抽象层级,会让人很迷惑,因为没办法这个方法中判断某个表达式是基础概念还是细节,更恶劣的是,一旦细节与基础概念混杂,更多的细节就会纠缠不清,举例子我们想写一个冰冻大象的需求://把大象装进冰箱 public void frozenElephant(){ //1. 捕捉大象 //2. 运输大象 //3. 打开冰箱 //4. 放入大象 //5. 关闭冰箱 }这个例子的1.2两步就不是一个层级的逻辑,是属于更高层级的抽象。3.4.5都是将大象放入冰箱的步骤,属于低层级的抽象。可以将代码拆分为如下实现, 将高抽象层级的代码聚合提取出来,细节在分别单独实现 ,如下:public void frozenElephant(){ //1. 捕捉大象 catchElephant(); //2. 运输大象 transportElephant(); //将大象放入冰箱 putElephantInRefrigerator(); } public void catchElephant(){ } public void transportElephant(){ } public void putElephantInRefrigerator(){ //打开冰箱 //放入大象 //关闭冰箱 }3.4 使用异常替代返回错误码针对错误码的判断会导致更深层次的嵌套结构,返回错误码就意味着要求调用者跟着处理错误,如下:if(deletePage() == OK){ if(registry.deleteReference(page.name) == OK){ if(configKeys.deleteKey(page.name.makeKey) == OK){ logger.log("page deleted") }else{ logger.log("configKey not deleted") } }else{ logger.log("deleteReference from registry failed") } }else{ logger.log("delete failed") return Error; }一般我们还需要将try/Catch代码块给抽离出去,另外形成方法。防止代码块过多搞乱代码结构,分不清错误处理还是正常流程。同时因为方法只做一件事,错误处理就是一件事,因此错误处理的方法不应该在做其他事,也就是如果一个方法中有try关键字,那try就是方法的开头。catch/finally代码块后面也不应该再有内容,如下:try{ deletePage(page); registry.deleteReference(page.name); configKeys.deleteKey(page.name.makeKey); }catch(Exception e){ logger.log(e.getMessage()); }3.5 使用第三方库比如Lombok组件通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法 举例如下:比如Apache Commons系列组件给我们提供了关于字符串、集合、IO操作等工具方法。这些组件是个大宝库,提供了不少轮子:beanUtilsJavaBean进行各种操作,克隆对象、属性等等codec处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64等.collectionsjava集合框架操作configurationjava应用程序的配置管理类库ioio工具的封装langJava基本对象方法的工具类包 如StringUtils、ArrayUtils等等.logging提供的日志接口net提供了客户端和服务器端的数据验证框架三、代码重构重构是对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。在重构之前一定要知道,一旦开始对类和方法进行重构,就需要事前有完备的单元测试用例来保障重构的准确性,每次重构之后都要去执行对应的单元测试用例,验证重构的正确性!1. 识别代码的坏味道1.1 重复的代码如果在一个以上的地点看到相同的代码结构,可以肯定的是,想办法抽线出来合而为一,代码会变得更好。一般包含几个点的重复:最单纯的重复代码就是“同一个类的两个函数含有相同的表达式”。这时候需要做的就是采用提炼函数提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码如果重复代码只是相似而不是完全相同,需要先尝试用移动语句重组代码顺序,把相似的部分放在一起以便提炼。如果重复的代码段位于同一个超类的不同子类中,可以使用函数上移来避免在两个子类之间互相调用。1.2 过长的函数遵循这样一条原则:每当感觉需要以注释来说明点什么的时候,就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名,可以对一组甚至短短一行代码做这件事。哪怕替换后的函数调用动作比函数自身还长,只要函数名称能够解释其用途,就要毫不犹豫地那样做,关键不在于函数的长度,而在于函数“做什么”和“如何做”之间的语义距离。百分之九十九的场合里,要把函数变短,只需使用提炼函数。找到函数中适合集中在一起的部分,将它们提炼出来形成一个新函数。如果函数内有大量的参数和临时变量,最终就会把许多参数传递给被提炼出来的新函数,导致可读性几乎没有任何提升。此时可以经常运用以查询取代临时变量来消除这些临时元素。引入参数对象和保持对象完整则可以将过长的参数列表变得更简洁一些。如果有多个switch语句基于同一个条件 进行分支选择,就应该使用以多态取代条件表达式。1.3 数据的可变性对数据的修改经常导致出乎意料的结果和难以发现的bug。在一处更新数据,却没有意识到软件中的另一处期望着完全不同的数据,于是出现难以预料的bug,往往比较难排查(需要排查数据流转的整体链路),这就需要一些方法用于约束对数据的更新,降低数据可变性的风险。可以用封装变量来确保所有数据更新操作都通过很少几个函数来进行,使其更容易统一监控和演进如果一个变量在不同时候被用于存储不同的东西, 可以使用拆分变量将其拆分为各自不同用途的变量,从而避免危险的更新操作。使用移动和提炼函数尽量把逻辑从处理更新操作的代码中搬移出来,将业务处理逻辑代码与执行数据更新操作的代码分开。1.4 模块单一职责所谓模块化,就是力求将代码分出区域,最大化区域内部的交互、最小化跨区域的交互。但是经常出现一个函数跟另一个模块中的函数或者数据交流格外频繁,远胜于与所处模块内部的交流,这就是模块功能不单一的典型情况。总看到某个函数为了计算某个值,从另一个对象那儿调用半打的取值函数。如果这个函数需要跟这些数据待在一起,那就使用移动功能把它移过去。一个函数往往会用到几个模块的功能,那么它究竟该被置于何处呢?原则是:判断哪个模块拥有的此函数使用的数据最多,然后就把这个函数和那些数据摆在一起。 如果先以提炼函数将这个函数分解为数个较小的函数并分别置放于不同类中,上面的步骤就会比较容易完成。Strategy模式和Visitor模式是为了对抗发散式变化,但也能解决单一职责问题,最根本的原则是:将总是一起变化的东西放在一块儿。 数据和引用这些数据的行为总是一起变化的,如果有特殊情况,我们就搬移那些行为,保持变化始终只在一地发生。2. 函数重构的方法2.1 Extract Method 提取函数这个是最常用的操作,将大函数按模块拆分为几个小的函数,在重构时提倡将代码模块细分,因为模块越小,可重用度就越大。不要写大函数,如果你的函数过大,那么这意味着你的函数需要重构了。因为函数过大,可维护性,可理解性就会变差。并且当你实现类似功能的时候就容易产生重复代码。写代码时,最忌讳的就是代码重复。2.2 Inline Method 内联函数这个和Extract Method是相对的,如果重构过程中对模块进行过度拆分的话,就需要使用该方法对函数进行中和,将过度拆分的函数在组装到一起。2.3 Replace Temp with Query 以查询取代临时变量说白了就是将有着复杂表达式赋值的逻辑使用函数查询取代,这样一来在实现类似功能的函数时,这些复杂的临时变量就可以进行复用,从而减少代码的重复率,使用合理的命名解释复杂的表达式逻辑也增强了可读性。2.4 Inline Temp 内联临时变量与2.3 Replace Temp with Query相对,就不过多赘述了。2.5 Introduce Explaining Variable 引入解释性变量引入变量是为了解释该表达式中的一部分的功能的,目的在于让该表达式具有更好的可读性。使用Introduce Explaining Variable规则,就相当于为该表达式添加上相应的注释2.6 Split Temporary Variable 分解临时变量具体说来就是在一个函数中一个临时变量不能做两种事情,也就是一个临时变量不能赋上不同意义的值。如果你这么做了,那么对不起,请对该重复使用的临时变量进行分解,也就是说你需要创建一个新的临时变量来接收第二次分配给第一个临时变量的值,并为第二个临时变量命一个确切的名字。2.7 Remove Assignments to Parameters 移除对参数的赋值就是在函数中不要对函数参数进行赋值,当直接对函数的参数进行修改时,就应该对此重构。因为这样会使参数的原始值丢失,我们需要引入临时变量,然后对这个临时变量进行操作。2.8 Replace Method with Method Object 以函数对象取代函数当一个特别长的函数,而且函数中含有比较复杂的临时变量,使用上述方法不好进行重构时,就要考虑将该函数封装成一个类了。这个对应的类的对象就是函数对象。我们可以将该场函数中的参数以及临时变量转变成类的属性,函数要做的事情作为类的方法。将函数转变成函数类后,我们就可以使用上述的方法对新类中的函数进行重构了。四、小结关于代码的逻辑和重构都是很基础的东西,在写代码之前我们就要思考如何做到整洁、优雅,并一直遵循这些经验来编写代码,所谓的“代码感”就自然而然的滋养而出,要时刻提醒自己,仅仅编写出可运行的代码是远远不够的!要以一个分享者的角度去写代码,再换位成一个阅读者的视角去审视自己的代码,如果能做了自己心里那一关,那一切就OK了!
2023年08月19日
20 阅读
0 评论
0 点赞
1
2
3