SegmentFault 由点到面最新的文章
2023-06-14T11:05:49+08:00
https://segmentfault.com/feeds/blogs
https://creativecommons.org/licenses/by-nc-nd/4.0/
ElectronEgg 新一代桌面应用开发框架
https://segmentfault.com/a/1190000043899127
2023-06-14T11:05:49+08:00
2023-06-14T11:05:49+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<p><img src="/img/remote/1460000043899129" alt="image.png" title="image.png"></p><h3><strong>为什么使用</strong></h3><p>桌面软件(办公方向、 个人工具),仍然是未来十几年 PC 端需求之一,提高工作效率<br>electron 技术是流行趋势,百度翻译、阿里网盘、迅雷、有道云笔记 ......<br>前端、服务端同学都能快速入门</p><h3><strong>愿景</strong></h3><p>所有开发者都能学会桌面软件研发</p><h3><strong>简单</strong></h3><p>只需懂 JavaScript</p><h3><strong>开源</strong></h3><p>gitee:<a href="https://link.segmentfault.com/?enc=N82rMWrKlfdSn6lCy9s3pQ%3D%3D.OOggFeWI2kbmwQuCwBbZrWMiC%2F%2FNiicbEMZPzyRQxMhQXbXNTjL7%2BeWTaL0Mu8Ay" rel="nofollow">https://gitee.com/dromara/electron-egg</a> 3400+</p><p>github:<a href="https://link.segmentfault.com/?enc=wf1X5%2F5XOYwMhXkqreysIw%3D%3D.Xsf1dLOqwhl7BNiJgkr2OsewGoku2KQDykMRu6D1dXtDZfVo4e7neibRphugZIQ5beV%2BvowD3NQ2bBlcEdjQzLG3gfdM9HYIb20JgQqHrs9oVGip2f5scuujzS7aoZAd" rel="nofollow">https://github.com/dromara/electron-egg</a> 900+</p><h3>3.4.0</h3><ol><li>【增加】主进程mainserver支持加载静态资源,支持入口文件配置。</li><li>【增加】config模块,增加isWebProtocol()/isFileProtocol()。</li><li>【升级】升级electron到v21.4.4</li><li>【升级】升级@electron/rebuild到v3.2.13</li><li>【升级】demo分支,升级better-sqlite3到v8.4.0</li><li>【修复】修复service多层调用。</li><li>【优化】将打包配置独立出builder.json文件,精简package.json内容。</li></ol><h3>使用场景</h3><h3>1. 常规桌面软件 - 功能 demo</h3><ul><li>windows 平台<img src="/img/remote/1460000043899130" alt="image.png" title="image.png"></li><li>macOS 平台<br><img src="/img/remote/1460000043899131" alt="image.png" title="image.png"></li><li>linux 平台 - 国产 UOS、Deepin<img src="/img/remote/1460000043899132" alt="image.png" title="image.png"></li><li>linux 平台 (ubuntu)</li><li><p><img src="/img/remote/1460000043899133" alt="image.png" title="image.png"></p><h3>2. vue、react、web 转换成桌面软件</h3></li><li>vue-ant-design(本地)<img src="/img/remote/1460000043899134" alt="image.png" title="image.png"></li><li><p>禅道项目管理(web 项目地址)</p><h3>3. 用户案例</h3><p><img src="/img/remote/1460000043899135" alt="image.png" title="image.png"><br><img src="/img/remote/1460000043899136" alt="image.png" title="image.png"></p><h2><a href="https://link.segmentfault.com/?enc=7U87draB5lGyMFP0sCITNg%3D%3D.CkXCHHCQnjrdI8g68IHhxd%2F3LEhBAw87Ez%2FO5HKvP%2FKRV8Y8coyZStRiEA%2FbRSdg0FNT7wc1snpZuQPh%2Fz8nSA%3D%3D" rel="nofollow">更多案例</a></h2><p><a href="https://link.segmentfault.com/?enc=M%2FRopYEcl1WPKzSQYUht%2FA%3D%3D.RHN68E0ecJX355%2FEUi4IXKr01uZWjGvoBnlUVnaHYEGYKIh%2Flf0M6JGklVyUPIRmW83KlPPeuPAXiQfk0sA2Zxug7WcVALnJNUApGknyJWxEknn2gN1WoL2H8B%2F%2F2iQ3" rel="nofollow">访问官网:</a><a href="https://link.segmentfault.com/?enc=eDOB7yedUq8HCxtqH4MwKg%3D%3D.Xv5UiN4cceN%2FuizfIP%2FEfqtRXQt42IQDpGv8lds%2FQfSLApU56%2FxngRzpzz4XKOv8" rel="nofollow">electron-egg: 一个入门简单、跨平台、企业级桌面软件开发框架</a></p></li></ul>
electron-egg: 当代桌面开发框架,轻松入门electron
https://segmentfault.com/a/1190000043187598
2022-12-29T10:37:47+08:00
2022-12-29T10:37:47+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>前言</h2><p>当前技术社区中出现了各种下一代技术或框架,却很少有当代可以用的,于是electron-egg就出现了。😄</p><p>它愿景很大:希望所有开发者都能学会桌面软件开发</p><h2>当前桌面软件技术有哪些?</h2><table><thead><tr><th>语言</th><th>技术</th><th>优点</th><th>缺点</th></tr></thead><tbody><tr><td>C#</td><td>wpf</td><td>专业的桌面软件技术,功能强大</td><td>学习成本高</td></tr><tr><td>Java</td><td>swing/javaFx</td><td>跨平台和语言流行</td><td>GUI库少,界面不美观</td></tr><tr><td>C++</td><td>Qt</td><td>跨平台,功能和类库丰富</td><td>学习成本高</td></tr><tr><td>Swift</td><td> </td><td>无</td><td>非跨平台,文档不友好,UI库少</td></tr><tr><td>JS</td><td>electron</td><td>跨平台,入门简单,UI强大,扩展性强</td><td>内存开销大,包体大。</td></tr><tr><td> </td><td> </td><td> </td><td> </td></tr></tbody></table><h2>为什么使用electron?</h2><p><img src="/img/remote/1460000043187600" alt="QQ截图20221223174420.png" title="QQ截图20221223174420.png"></p><p>某某说:我们的应用要兼容多个平台,原生开发效率低,各平台研发人员不足,我们没有资源。</p><p>也许你觉得只是小公司没有资源,no!大公司更没有资源。</p><p>因为软件体量越大,所需研发人员越多。再加上需要多平台支持的话,研发人员更是指数级增长的。</p><p>我们来看看QQ团队负责人最近的回应吧:</p><p>“感谢大家对新版桌面QQ NT的使用和关注,今年QQ团队启动了QQ的架构升级计划,第一站就是解决目前桌面端迭代慢的问题,我们使用新架构从前到后对QQ代码进行了重构,而其中选择使用Electron作为新版QQ桌面端UI跨平台解决方案,是基于提升研发效率、框架成熟度、团队技术及人才积累等几个方面综合考虑的结果。”</p><p>也许electron的缺点很明显,但它的投入产出比确实最高的。</p><p>所以,对企业而言,效率永远是第一位的。不要用程序员的思维去思考产品。</p><h2>哪些企业或软件在使用electron?</h2><p>国内:抖音客户端、百度翻译、阿里云盘、B站客户端、迅雷、网易有道云、QQ(doing) 等</p><p>国外:vscode、Slack、Atom、Discord、Skype、WhatsApp、等</p><p>你的软件用户体量应该没有上面这些公司多吧?所以你还有什么可担心的呢?</p><p>开发者 / 决策者不要去关心性能、包体大小这些东西,当你的产品用户少时,它没意义;当你的产品用户多时,找nb的人把它优化。</p><h2>聊聊electron-egg框架</h2><p>EE是一个业务框架;就好比 Spring之于java,thinkphp之于php,nuxt.js之于vue;electron只提供了基础的函数和api,但你写项目的时候,业务和代码工程化是需要自己实现的,ee就提供了这个工程化能力。</p><h2>特性</h2><ul><li>🍄 跨平台:一套代码,可以打包成windows版、Mac版、Linux版、国产UOS、Deepin、麒麟等</li><li>🌹 简单高效:只需学习 js 语言</li><li>🌱 前端独立:理论上支持任何前端技术,如:vue、react、html等等</li><li>🌴 工程化:可以用前端、服务端的开发思维,来编写桌面软件</li><li>🍁 高性能:事件驱动、非阻塞式IO</li><li>🌷 功能丰富:配置、通信、插件、数据库、升级、打包、工具... 应有尽有</li><li>🌰 安全:支持字节码加密、压缩混淆加密</li><li>💐 功能demo:桌面软件常见功能,框架集成或提供demo</li></ul><h2>谁可以使用electron-egg?</h2><p>前端、服务端、运维、游戏等技术人员皆可使用。我相信在你的工作生涯中,或多或少都接触过js,恭喜你,可以入门了。</p><h2>为什么各种技术栈的开发者都能使用electron-egg?</h2><p>这与它的架构有关。</p><p><img src="/img/remote/1460000043187601" alt="QQ截图20221223180451.png" title="QQ截图20221223180451.png"></p><p>第一:前端独立</p><p>你可以用vue、react、angular等开发框架;也可用antdesign、layui、bootstrap等组件库;或者你用cococreater开发游戏也行; 框架只需要最终构建的资源(html/css/js)。</p><p>第二:工程化-MVC编程模式</p><p>如果你是java、php、python等后端开发者,不懂js那一套编程模式怎么办?<br>没关系,框架已经为你提供了MVC(controller/service/model/view),是不是很熟悉?官方提供了大量业务场景demo,直接开始撸代码吧。</p><h2>开箱即用</h2><p>编程方法、插件、通信、日志、数据库、调试、脚本工具、打包工具等开发需要的东西,框架都已经提供好了,你只需要专注于业务的实现。</p><h2>十分钟体验</h2><h3>安装</h3><pre><code># 下载
git clone https://gitee.com/dromara/electron-egg.git
# 安装依赖
npm install
# 启动
npm run start</code></pre><h3>效果</h3><p><img src="/img/remote/1460000043187602" alt="QQ截图20221223173935.png" title="QQ截图20221223173935.png"></p><p>界面中的功能是demo,方便初学者入门。</p><h2>项目案例</h2><p>EE框架已经应用于医疗、学校、政务、股票交易、ERP、娱乐、视频、企业等领域客户端</p><p>以下是部分开发者使用electron-egg开发的客户端软件,请看效果</p><p><img src="/img/remote/1460000043187603" alt="QQ图片20221128194242.jpg" title="QQ图片20221128194242.jpg"></p><p><img src="/img/remote/1460000043187604" alt="zhanjichaxun.png" title="zhanjichaxun.png"></p><p><img src="/img/remote/1460000043187605" alt="d8b3c88f70d2142ff981b54584fa9da.png" title="d8b3c88f70d2142ff981b54584fa9da.png"></p><h2>后语</h2><p>我是 <a href="https://link.segmentfault.com/?enc=xZCHXJYMRwaCfTGwUlpZaA%3D%3D.jTtH054HlfFJqxoYYIf%2FnzGXhjU7wBiJ6iWtfrb4GIk%3D" rel="nofollow"><strong>哆啦好梦</strong></a> ,一个码农。喜欢唱、跳、rap、篮球、music ......</p><p>仓库地址,欢迎给项目点赞!</p><p>gitee:<a href="https://link.segmentfault.com/?enc=ssgFHQ9GDXkmleHc282PKQ%3D%3D.GvqJiF4s0l%2FoQMOsE7D1Z602WcPiL5VuuHy%2B1tAbsAqJW2z4FRLwt9iRbwIBrN3%2F" rel="nofollow">https://gitee.com/dromara/electron-egg</a> 2400+</p><p>github:<a href="https://link.segmentfault.com/?enc=%2FS8f1lDGiBhGFwLfX%2B5SZA%3D%3D.wfTfJOY0Nu1Bg2ipYOHdCoU0IfKFIyOI%2BotpAfkQIWs4%2FMWkEHLI0zVUrU286R%2BKx%2FHwxQi5o5BaHO5cP9KAceM5NiCqB05R3Mg5ZGu0ceg%3D" rel="nofollow">https://github.com/dromara/electron-egg</a> 600+</p><h2>关于 Dromara</h2><p><a href="https://link.segmentfault.com/?enc=c2LmmOSFUgPIP1L5ENwBwA%3D%3D.tuSax%2BWdWOPWibWuK%2BKnD5UV%2BPTHmPYPBRn43vhPT80%3D" rel="nofollow">Dromara</a> 是由国内顶尖的开源项目作者共同组成的开源社区。提供包括分布式事务,流行工具,企业级认证,微服务RPC,运维监控,Agent监控,分布式日志,调度编排等一系列开源产品、解决方案与咨询、技术支持与培训认证服务。技术栈全面开源共建、 保持社区中立,致力于为全球用户提供微服务云原生解决方案。让参与的每一位开源爱好者,体会到开源的快乐。</p><p><a href="https://link.segmentfault.com/?enc=XVxdaAYZWJj5ox5D5HEwCg%3D%3D.eXTr4rqbwkf97b8K3zIyBsWr0AauIg1KbT%2F6sxNLuT8%3D" rel="nofollow">Dromara</a> 开源社区目前拥有10+GVP项目,总star数量超过十万,构建了上万人的开源社区,有成千上万的个人及团队在使用Dromara社区的开源项目。</p>
独立博客、文档类网站消亡倒计时
https://segmentfault.com/a/1190000042469190
2022-09-13T15:25:47+08:00
2022-09-13T15:25:47+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h3>背景</h3><p>去年初,我写了一个开源项目<a href="https://link.segmentfault.com/?enc=HK4%2Bk8PXZYk8FqIYw114ZA%3D%3D.L5Mb08YrHJqwX8iExQD7DJD%2BUlpUYUeMevdfblDWoREXx0EXCI%2BfLK3zMpz8m4RX" rel="nofollow">electron-egg</a>,需要搭建一个文档站点,然后开始折腾。</p><p>经历了一系列繁杂的操作后,我发现独立博客和文档类网站这个市场,正慢慢的发生着变化......</p><h3>那些走过的弯路</h3><h4>wordpress</h4><p>最初打算使用 wordpress,一个知名的个人站点程序,全球4000万个网站在使用;</p><p>既然用的人那么多,我也来尝试一下;<strong>一顿猛如虎的操作</strong>:</p><ol><li>买域名</li><li>买服务器</li><li>搭建php、mysql数据库、nginx、git</li><li>安装WordPress</li><li>......</li></ol><p>一天过去了,晚上陷入沉思......</p><p>我 <em> </em> 只是想搭个文档站点而已........</p><h4>hexo</h4><p>第二天发现hexo,技能做文档,也能写博客,挺好。</p><ol><li>hexo-安装、配置</li><li>hexo-主题、布局、模板</li><li>hexo-部署、git、发布</li><li>hexo-标签、文章、布局</li><li>.......</li></ol><p>一天又过去了,晚上又陷入了沉思......</p><p>我 <em> </em> 只是想搭个文档站点而已........</p><h4>vuepress</h4><p>第三天发现,原来不需要买域名和服务器也可以呀,而且使用人挺多,开搞。</p><ol><li>vuepress-安装、添加菜单、目录</li><li>vuepress-添加搜索、链接、重定向</li><li>vuepress-添加评论插件、https、站长工具</li><li>vuepress-添加等等等</li><li>......</li></ol><p>一天又过去了,晚上继续陷入沉思......</p><p>我 <em> </em> 只是想搭个文档站点而已........</p><h4>Notion or 语雀</h4><p>后来用体验了notion和语雀,因为网络原因,最终选择语雀。</p><p>直接当笔记算了。</p><p>一年多过去了,发现语雀的使用体验超过了我的预期,主要有以下几点</p><ol><li>提供web支持</li><li>随写随用,自动发布</li><li>公开或者私有</li><li>文字、图片、视频、代码</li><li>统计、评论、关注、收藏等</li><li>各种功能应有尽有</li></ol><p>效果如图</p><p><img src="/img/remote/1460000042469192" alt="" title=""></p><p><img src="/img/remote/1460000042469193" alt="" title=""></p><h3>35w+阅读量</h3><p>一年多时间,<a href="https://link.segmentfault.com/?enc=VtJmmON1wM17ogg9rXYqFA%3D%3D.OT%2BCl0eyv%2F0A5YPIJWJO1CVT%2B7GzLB5pvifoL0xGeG5ab32XDjm7Ypvmrnw9G9Gd" rel="nofollow">electron-egg</a>项目经过不断迭代,也终于小有成就:</p><p>gitee <strong>1900+</strong> star</p><p>github <strong>450+</strong> star</p><p>文档已经被阅读了<strong>35w</strong>次了,我也有了更多精力来维护这个框架。</p><p>如果当初使用WordPress或者vuepress,我要花费多少时间在更新文档上面呢?</p><h3>自己建站 or 站点托管 or 使用数字化管理工具</h3><p>如今notion已经有了<strong>2000w</strong>用户,语雀也在迅速成长,提高效率一直是用户的核心需求,还有多少人愿意花费大量的精力去维护、管理个人站点呢?</p><h3>个人观点</h3><p>独立博客、文档类网站 <strong>将要</strong> 进入存量市场;虽然还会有增长,但是将有越来越多的用户投入到<strong>新一代数字化工作管理工具</strong>的怀抱中。</p><p>相信有不少人都经历过,<strong>独自建站</strong> 或 <strong>站点托管平台</strong>的折腾;然而它们的投入产出比又有多少呢?你还会继续维护那个站点多久呢?</p>
electron与node.js的版本对应关系(全版本)
https://segmentfault.com/a/1190000041871749
2022-05-20T11:45:32+08:00
2022-05-20T11:45:32+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<p>最近在测试自己的项目框架(<a href="https://link.segmentfault.com/?enc=MbACACiv%2F%2BTva8KBqiPzhA%3D%3D.EOHWJ2trFG4mqHGB0g6s7HD0OUPyH6O4acO6yz4tVs7NmgEQ8mB048sUnyTw1%2FlW" rel="nofollow">electron-egg</a>)在各个操作系统的运行情况时,发现在ubuntu系统中,软件白屏。</p><p>测试后发现是版本问题,于是整理了electron和node.js的版本对应关系。</p><p>去掉了预发布版本,只提供稳定版,方便大家查找。</p><p>v18</p><table><thead><tr><th><strong>electron</strong></th><th><strong>发布日期</strong></th><th><strong>npm</strong></th><th><strong>是否预览版</strong></th><th><strong>Module 版本</strong></th><th><strong>Node</strong></th><th><strong>Chrome</strong></th><th><strong>下载量</strong></th><th> </th></tr></thead><tbody><tr><td><a href="https://link.segmentfault.com/?enc=%2FVu%2FYYm3VTtw6MfMdAHFsQ%3D%3D.gM0Yaeg30LBCYKHwC1pM6LFaMnuBhSHOUKkDdLZtzDQay8QsqOj9JxYyBMCDsMPtYCGb2GCh%2BOEfNfYFF9%2B%2BzQ%3D%3D" rel="nofollow">v18.2.1</a></td><td>2022-05-04</td><td> </td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.143</td><td>1807</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=6K1nWSIlfdjn61iCtijVGg%3D%3D.nD7Ijp2Gn7%2FMwtQkIFTdYs%2B5dG995SrQqcP7I7Nr1NAIZ%2BrK2GwlfrYlpKoPxf5W%2BxZK5G5nu8I%2FqTzrvMR%2B4Q%3D%3D" rel="nofollow">v18.2.0</a></td><td>2022-04-29</td><td>latest, 18-x-y</td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.143</td><td>39842</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=JODSpHlqRpWE44waT9gbwA%3D%3D.bWeADzwfauW%2FTMagSL2qVtrsw5wqXIBpFqMgHfisAv%2Bee1fEInofZpi5eURROxDmXbxCC0Wq7Fl6cnz8P71D2w%3D%3D" rel="nofollow">v18.1.0</a></td><td>2022-04-21</td><td> </td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.127</td><td>65238</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=%2FTPxUmsqUJ9A%2BqiMA4abDw%3D%3D.6BJAQEADb2MI3vko28D3wm0oTfSAvKpxgie2haXOQ%2BF9yT2v4wMXKnKs1nHbNBO7Ab5m6CgvhXRD38ph1ezYAA%3D%3D" rel="nofollow">v18.0.4</a></td><td>2022-04-14</td><td> </td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.75</td><td>52793</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=SqARh%2BEFw8Nax0zt6fUk%2FA%3D%3D.4NsubDV%2BR%2B5hUhDDco887pwRJUA1Q1%2FTHNTbWV6L4Iynh%2B51wp34Rhh%2F8fqMWGURpA7bda6qsRSwwQSEK5FlJw%3D%3D" rel="nofollow">v18.0.3</a></td><td>2022-04-07</td><td> </td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.75</td><td>80702</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=f0PB5ZzusnJ%2FU9n1fzIcbw%3D%3D.%2B9dGpDwbfJz7OsH1wVODcMt36G5rQBVWBFyidP1nVLHukGb%2BJSPGGNgZbwxgb3HqJtqAzIicrlBgu%2BYRC57gbg%3D%3D" rel="nofollow">v18.0.2</a></td><td>2022-04-05</td><td> </td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.60</td><td>19331</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=YjUS4uaDaedVAE805TkSOg%3D%3D.HEnQAc%2FKtWVJZMfJI41pwkTgwuBcYUaGn4bpWHy7OFSnQHXU72KAIJP0Mjl0LQGV7J3C%2BgHCO%2F5rY4Pqdy%2BwXw%3D%3D" rel="nofollow">v18.0.1</a></td><td>2022-03-30</td><td> </td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.60</td><td>57377</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=BscAGEx5%2BolwYbJfxSFdtA%3D%3D.bztlcZg6%2B%2FtB%2B%2FFyndqlG29SRDi1yztLKk6JqcJ89YE%2B40O6wrfOq1%2BtNKAUUGcr0R22qLlfXd3rmAhUSfIRug%3D%3D" rel="nofollow">v18.0.0</a></td><td>2022-03-29</td><td> </td><td>no</td><td>103</td><td>16.13.2</td><td>100.0.4896.56</td><td>30498</td></tr></tbody></table><p>v17</p><table><thead><tr><th><strong>electron</strong></th><th><strong>发布日期</strong></th><th><strong>npm</strong></th><th><strong>是否预览版</strong></th><th><strong>Module 版本</strong></th><th><strong>Node</strong></th><th><strong>Chrome</strong></th><th><strong>下载量</strong></th><th> </th></tr></thead><tbody><tr><td><a href="https://link.segmentfault.com/?enc=lEiE3IM5BNoyX5ig1QJqOw%3D%3D.nS1zjmgVx9rtQGTV4QHqV5TuaHMJkWgtja1Yj8cPx7uNZb7%2FSVYyPuADBQ8aMT0UuulNNcNWbTn4U9gM7eY9xQ%3D%3D" rel="nofollow">v17.4.3</a></td><td>2022-05-05</td><td>17-x-y</td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.141</td><td>1877</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=Prhjf%2F7RFaq8xYcmB6RrFw%3D%3D.vG2B5fzYRAMkI8C9gVubISnGacKjWTnu1dQhJ9wXgE%2BkaEbxrCobk6L35Q7cXBmSKrQorLzcsB2or9%2F1b7ARSw%3D%3D" rel="nofollow">v17.4.2</a></td><td>2022-04-29</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.141</td><td>9985</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=iK5yqf2R4k0dVLvfDQ1Rkg%3D%3D.8dVp12iGiK92v2cOZZCoMbybJgnK74C1K9edFsVJD4EQiFBINH6etKFLAsQM6Xx006f6qvUOVX%2FtkFSKT3MNPQ%3D%3D" rel="nofollow">v17.4.1</a></td><td>2022-04-20</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.141</td><td>20096</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=22sb0KyapCfvX0qFJjjW2w%3D%3D.bgI%2B6N%2F%2F4FL3h%2FXYohFxncJqlib%2FQbVMQfBDrbmwXYddnkLs7y5ucUqsPRTbaLP453i%2BNM2dfSAzxnvOK6KFtg%3D%3D" rel="nofollow">v17.4.0</a></td><td>2022-04-05</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.141</td><td>40564</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=s%2FgH1jIp09dx2UTXjxkiZQ%3D%3D.ThJCxdpVjZ49JOc969I4Su7uEeoSXOrgM%2ByjsnNdKmQzSZrC76B1z7WdRSc1ykvg5cUS0zvmD9dDoSbidhpaSg%3D%3D" rel="nofollow">v17.3.1</a></td><td>2022-03-30</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.141</td><td>42411</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=pw7ml50KJFidtHiyQiJ0kw%3D%3D.3k2xXw5QHSDSbZ7V%2FD1XLWQ7uyiNCWdWv0iedBTzO2F%2Fe2ceZKF5GFBWZd3E%2FPybYSl03Jthvtl%2BCRBCbU%2FSww%3D%3D" rel="nofollow">v17.3.0</a></td><td>2022-03-29</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.141</td><td>19669</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=WnJTefOi9yP7SmKTkibq5Q%3D%3D.bzrT4Xm2pkeByEDiSIe5PJIakVCccHwt55GUOX1Z4fymxQaLymaZBEOc49ywGRtS2lltIdS2ZYDfVa6qoSoEbg%3D%3D" rel="nofollow">v17.2.0</a></td><td>2022-03-23</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.109</td><td>103221</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=xzHEereRd%2F%2B3i1Hb%2F%2FT7iQ%3D%3D.do8OWeahH1X4f139qYKzo%2F9f6RU0m%2F16odGJ%2Fuaj6ZJmI5taXhuxW8sj2Zcl9MgBi8L1xeWRJUYWnMzq0K0ENw%3D%3D" rel="nofollow">v17.1.2</a></td><td>2022-03-09</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.109</td><td>138942</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=eAQUeU%2FGlvnM1vi0mIm3rQ%3D%3D.ZDM5n1UwWoJXssSKBChC2y6hEmYthyfUnooQxIKDtZ0WaYGI2UyVXdrNjFhvD3%2B7hKpLrIwh7zhm7fOpW9XC4w%3D%3D" rel="nofollow">v17.1.1</a></td><td>2022-03-07</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.109</td><td>43198</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=Pzq463KYFZSmpTeTy3WWHg%3D%3D.fY4lts7sPXdHzTOco4%2FkwFCIK2GuALny2c9h07Xa8eEjkBqAuKH7LxCQEM%2FlCP3V2OrvFV4drZgf%2FJ7tFsLkgA%3D%3D" rel="nofollow">v17.1.0</a></td><td>2022-02-23</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.102</td><td>143043</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=TCSXUMwubHw7rWyFmBKi1g%3D%3D.YTeGySGP9QKOgG8CKj6kMrfs%2Bls48wQMlwllVuacwzuGX%2FWFIg7Mm1PPvzIWilcRiKRGqCkARTJ%2BlRT0LHZkpA%3D%3D" rel="nofollow">v17.0.1</a></td><td>2022-02-15</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.82</td><td>114714</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=E3nUhl0QXTwBXPmhsC6vYg%3D%3D.RHfSbjmGWpWH713HE9GhcCO5MnugwxPW7iz5wvpHFghOQxhJfZSqsN52HcKYOO6j8fBroul4b3Ay8nSJjQ8tUg%3D%3D" rel="nofollow">v17.0.0</a></td><td>2022-02-01</td><td> </td><td>no</td><td>101</td><td>16.13.0</td><td>98.0.4758.74</td><td>204358</td></tr></tbody></table><p>v16</p><table><thead><tr><th>electron</th><th>发布日期</th><th>npm</th><th>是否预览版</th><th>Module 版本</th><th>Node</th><th>Chrome</th><th>下载量</th><th> </th></tr></thead><tbody><tr><td><a href="https://link.segmentfault.com/?enc=%2F9zhqSuoooVoYy4wX4QgNg%3D%3D.ZR4SJj7RojYJmqH7a138m1lD9i2DFGjpPdawSVp8qKd7Jej9DZ1aICeUwDJ5fGM2vET8ab3uRvvbm%2Bpvf%2BoYsw%3D%3D" rel="nofollow">v16.2.5</a></td><td>2022-05-04</td><td>16-x-y</td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>2452</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=bJF337apWjjCNA4FbXLXUg%3D%3D.7e00d8MVkP3gc4eywKsb6OwDZy%2FrtWyLTRAqUkS5%2BUK4xKFtXZYryZl5mH1d5bko48j2yeKvZvF%2F3xBbYOwG6Q%3D%3D" rel="nofollow">v16.2.4</a></td><td>2022-04-28</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>4778</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=VOzv2lJ%2FZfhopFF%2FGmKgPQ%3D%3D.rFnEKZeyUiTtFk5TkhktORoGSU1gZeIB1AfZDak7EK7%2BiqdY%2B9RE6JSC4CAKnEOJaXJpCh4Ad2kLs5DR0OCxMQ%3D%3D" rel="nofollow">v16.2.3</a></td><td>2022-04-20</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>9476</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=xRNJIghu9OnV8%2FFAfJNFLQ%3D%3D.GMFC4XctYsEOY2hJaTRUgRqQTtLO8By19u1fILakAKpYY4uYmI1sT%2BMoY4TUoC15eG5zEUK5PpkEolFWv39OKQ%3D%3D" rel="nofollow">v16.2.2</a></td><td>2022-04-06</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>19842</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=5QfPFlFCCHG9hbgUwE6ZYw%3D%3D.bHwaer0I%2FsmxOMnSosJWEgnWDpgFFa4c4rH0iMBhyNe21NHfuqDA2iDJRf5WFaSYgjwKD1Dz2qJUIa4SGfcJzQ%3D%3D" rel="nofollow">v16.2.1</a></td><td>2022-03-30</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>15888</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=Xvce8P43hMV56QPQSSQ3xg%3D%3D.TkO%2BPwMNMmUsjkMC0ex7NzYwWjal%2BAmvCDSq0YbPcZMSBgbxNdnshBMrzRjLlptCUs0NT7S0t4EPFfmw5YnWRw%3D%3D" rel="nofollow">v16.2.0</a></td><td>2022-03-28</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>9773</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=lq1iqkLCKTsHIqGElMm2Uw%3D%3D.i9gM7PiADN18x%2FDWWBpD2Gn2SAswEq4hL8JLeGFMt6GVWncMj9X39fcbI%2FNpV6lWWyRs3eTpuD%2BVcZqhYv%2FRHA%3D%3D" rel="nofollow">v16.1.1</a></td><td>2022-03-23</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>12178</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=1lF5mntyYAa1enxc3lV5JA%3D%3D.N9xO70DOwN065uYmIV1m6z1WGZbUAWm9ExFEdHDGrt8LNDF%2F8QHMATmtVwdjLK2QQvA%2FDC%2FEeADMGlrpxHFtCg%3D%3D" rel="nofollow">v16.1.0</a></td><td>2022-03-09</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>37596</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=Yq8B2XM61UvVw7yRsrsz5w%3D%3D.cGvFp3nymv2nqJC95Rb825F%2F3jVlDZV2zrdtx78wTEgBu%2F9NsN19ztOykN1hx8thYKQzylqetHyY9pqNdWQucA%3D%3D" rel="nofollow">v16.0.10</a></td><td>2022-02-23</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>40536</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=XYflSmtuf3yFG2WTmE6KWw%3D%3D.ofvXiW6QLSonD%2B4ZAsz3DQaaEN5PyOcEs%2Bs9dIGYxJkg8Y1lXaFtRQC0LLWJ3lc83YcYkfqnuSU%2BbCddZVUMcw%3D%3D" rel="nofollow">v16.0.9</a></td><td>2022-02-15</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.174</td><td>55469</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=rTbAjXA%2BV2ENUaIk899zGg%3D%3D.5%2Fdf%2B%2FivNSb3jaiP4c69cILOo5rkrc2aGGtr%2BMnpEEy%2BC%2Fwax4ryN3%2FwiZuOtW7XvoidPRNPesWhlUFRMHr47w%3D%3D" rel="nofollow">v16.0.8</a></td><td>2022-01-27</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.110</td><td>134374</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=dzgBPUriOMO9nqn6chbt9Q%3D%3D.f6dPTq%2BWQjk0R40RTvASUnCtBdW1BmaqRtblmk8hz%2BzxmhdfZO8QGC1Ff1kGM6YFIb0eJtSkAU8rCSGDYQzvmA%3D%3D" rel="nofollow">v16.0.7</a></td><td>2022-01-11</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.110</td><td>190233</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=%2FTxgqGs04QlZnahy94nFMQ%3D%3D.2MYxXnbLLT5n%2BvBeF5tNhkSYbh3RVv1q6kBxYOiOyDLGBtffWgcmtJzYZA%2BlA5G9b1AD7H1nBy6r3r3WaAHPqw%3D%3D" rel="nofollow">v16.0.6</a></td><td>2022-01-03</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.110</td><td>231145</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=puxjHk2ndfS2s3HaIJgj4A%3D%3D.2H2gdEmBCdaNsGxohMZz%2BrB9nksMNBVTM6p5rpVHbmGOtJF6NHdpJDUCgTPNr37wUYX0OO2s7Yv9Msc32yn1Ng%3D%3D" rel="nofollow">v16.0.5</a></td><td>2021-12-17</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.55</td><td>225611</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=DIxI9MwJfjzBhCBGhlaJ0Q%3D%3D.GcTMkR5%2B2Sg7VQ5qgMwHNpNRNLGAKLjGswnX0H0uebkzf%2BWPC0so4Xi8O8lUPZKkAtqbxNxPDYvm%2FTOnU5172g%3D%3D" rel="nofollow">v16.0.4</a></td><td>2021-12-03</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.55</td><td>174058</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=gTc9nNWFTXkMwSEcfipa2Q%3D%3D.BqVp8mvzSQGBQP%2FpT9Yy9%2FdaZOQ4qjJ7k36xpDd%2FZK%2FzBE1P56BeLioA%2B%2FqX3o9fSXRSIKbMJAqheOsrzFyO3g%3D%3D" rel="nofollow">v16.0.3</a></td><td>2021-11-30</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.55</td><td>46686</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=teKmmmjN1Q1V6SSZm1i7wA%3D%3D.wiqw7z6uniyBxE5nlhX4NZf16ULuP9eQpjhylHXG4fv%2FF%2FuEWV0pU8qpkHLRgPjUdUneAOgalv3JT5lvSts1AQ%3D%3D" rel="nofollow">v16.0.2</a></td><td>2021-11-24</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.55</td><td>134974</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=vZ1ayH%2F3nqmUzOoTarzv8g%3D%3D.sH6p7Z4IkSwOF%2BDWsPZqO%2BKlvGEczn%2BXxyTZDUe%2BYTcG5TGO5Ft5yC3usd51egLR128tc1ldEBkr2U6xozdTSw%3D%3D" rel="nofollow">v16.0.1</a></td><td>2021-11-18</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.45</td><td>64611</td></tr><tr><td><a href="https://link.segmentfault.com/?enc=vNGRh%2B3PldxGLaHTfM622Q%3D%3D.E2dsOTJZjfidOrjw%2FMtB2yLjdOkJeKGa3Zy%2FypP7PlW85C1vKH9A1RmyjDQZaLY7kDuKvdBvA1NOUKjOiW70iQ%3D%3D" rel="nofollow">v16.0.0</a></td><td>2021-11-16</td><td> </td><td>no</td><td>99</td><td>16.9.1</td><td>96.0.4664.45</td><td>82535</td></tr></tbody></table><p>我项目在用16.2.4版本,经过测试没有什么问题。<br>因为版本太多了,弄了文档分类,列表如下,需要的同学可以查看。</p><h3>electron与node.js 版本对应关系(稳定版)</h3><ul><li><a href="https://link.segmentfault.com/?enc=WayQiZy15%2BipELy5hoz8LQ%3D%3D.ywPJXXWdG%2FlEUqK%2FFLRyiC6YwLbVzbYHI3ScL6fCfkyH2OkfbE5u5vzGgSV4O2AI" rel="nofollow">v18</a></li><li><a href="https://link.segmentfault.com/?enc=3aV3GEvprPleF98U3lKdzg%3D%3D.qUEKSSkQhOE%2FdE%2FwR8RLsqiH3HeWko6lNuwWU2iSIWzRhsNe%2FxUpksqncWFtb4CT" rel="nofollow">v17</a></li><li><a href="https://link.segmentfault.com/?enc=OuDsO%2FnxJr%2BdWzI59aOMLw%3D%3D.JQT5G5BFk36uNgg02GkmO2ZT9T%2B6alXb%2F7k8uFzc0Z6zi9K4qwTy0kGnJ5iW6Xb7" rel="nofollow">v16</a></li><li><a href="https://link.segmentfault.com/?enc=1yHUSwD%2B3okcXSgzI9yyYQ%3D%3D.ZNCVtJwXH1IpvMhNL%2FxzUfysqH2IkBedWGkrj8c9uMVAcQKRyUcCCSzd0zKUUgzc" rel="nofollow">v15</a></li><li><a href="https://link.segmentfault.com/?enc=m0fBlkht3grtT1eybqjT3g%3D%3D.z0LTjTvnGXOpvY3vUNnZvZU6g2JbJ%2F%2BZl0CAOXkcf8h6fvPJklwvuNB5aGRvitYy" rel="nofollow">v14</a></li><li><a href="https://link.segmentfault.com/?enc=WoyJhqB2pkSmL4Oc2fijWQ%3D%3D.D9jFU68d0SYsqZGJpzfkDnH%2BLECPbihP%2FoImlDoCb3Q9bV8ee1A5hR%2FqDYE%2BXhog" rel="nofollow">v13</a></li><li><a href="https://link.segmentfault.com/?enc=HC7KoAjikDOJ1J0raNqmXA%3D%3D.FQ7rTIPD%2BpxbY1HO5qQWHUFFLQ0B9X7G8s7qKwsSluuHkbp3QhCV516hB2w9QMZT" rel="nofollow">v12</a></li><li><a href="https://link.segmentfault.com/?enc=4b8yMR%2F70e4Pkm23UhHotQ%3D%3D.cfti8RS%2BNRMuzQtwLLFE%2FbgUgyyRe%2FpCwLrfFmxROWtfSBs5Hx4Dk89PLTGGUI4M" rel="nofollow">v11</a></li><li><a href="https://link.segmentfault.com/?enc=g%2FSSOXUOIBWXEPewedBNEA%3D%3D.08%2BoYWwyQzE%2F2EZ%2FCWRGH5c783t3ezlvjI%2Bglz9ynaAYwn2nGln4q%2FKHWPkFXJZ4" rel="nofollow">v10</a></li><li><a href="https://link.segmentfault.com/?enc=n27nHTuHZJb%2FcNVdiehVcQ%3D%3D.ZFTqyPVhzf0yXnkdIJjOJZWcztxHEOrAHBrxf5nkpKrt1tgOpBWX1mh6pSdQIGav" rel="nofollow">v9</a></li><li><a href="https://link.segmentfault.com/?enc=a%2FcW4mZoHYvMdImUOSq%2Brg%3D%3D.w%2BkK9UMqIsJSXcBfoJXNUdBC6ZJRMbl2BrYIc5UfpSnqoQw39aADlJKCjVfQoRSs" rel="nofollow">v8</a></li><li><a href="https://link.segmentfault.com/?enc=%2B3Zn%2FRex00MP8srwBYeQDg%3D%3D.Q96wiQZ%2BvqOm%2FAiE3Cw%2BGggJi9hZyIpCTJWXOtyLpYPlJ1MgunymOdiDLGBZZI45" rel="nofollow">v7</a></li><li><a href="https://link.segmentfault.com/?enc=LBLihFR%2FxXbB8b95kef%2FWA%3D%3D.iPALmQH3rlmTKuTRQUJr0HmsKp5nrd6AWbcv8bjuwan5miaYUfsRjXLD3E2lHT9n" rel="nofollow">v6</a></li><li><a href="https://link.segmentfault.com/?enc=9mdWVnC4yIyWfwP5GDnt8A%3D%3D.AnyCW1%2BLsgkkBg1Iwu7M5s28STqqM6WNmk4L9IkYQiCrn52y4imsnoJnnUQ09Scl" rel="nofollow">v5</a></li><li><a href="https://link.segmentfault.com/?enc=oAVzKlI5hoz%2ByNjM2AiGsg%3D%3D.%2Fvq7k2gXATHx1fojACx5UzB7XtO2Gu5Dyyr5P%2FNH%2B7q0juC%2BWnlFz64%2F1JCYAqM5" rel="nofollow">v4</a></li><li><a href="https://link.segmentfault.com/?enc=0y1%2BmRVVzqtkSwIhpsxpyg%3D%3D.9Dk0k%2Feysx%2F41ForMYQUepc%2BHXjMQwVhX%2FIsw%2FbtcLmPQ%2BBXf8zWD0K%2BKFGcA0as" rel="nofollow">v3</a></li><li><a href="https://link.segmentfault.com/?enc=eOMyC2UL6sZfhjD3pv1nmA%3D%3D.3OZ5T7pnSJ17CglaXWXPaLe7FbMsxZmF0OcWseB1RlN%2FBmDrXKFUV3vtoB4lWUeK" rel="nofollow">v2</a></li><li><a href="https://link.segmentfault.com/?enc=bNO5AjSq85oIA3F6UCPxaQ%3D%3D.qCCcayhZEXVo2LmYEfPp4kAZp6lv7ajzzZPjoD2QZLWNnUojgxGzqWBzxxZ6NELp" rel="nofollow">v1</a></li></ul>
Electron-egg 1.15.0 发布,人人都会桌面软件开发
https://segmentfault.com/a/1190000040827421
2021-10-18T15:00:41+08:00
2021-10-18T15:00:41+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<p>一个简单、快速、功能丰富的JS跨平台桌面软件开发框架。</p><ul><li>🏆 码云最有价值开源项目</li><li>地址:<a href="https://link.segmentfault.com/?enc=pO2%2FbEmxYXCVeSpmq%2BtDTQ%3D%3D.wm6QhuWfqxwk3W84ZN8EMjSFLkeZ68FrWz44lStznIppnKu5NIMKTd%2FNSf39g0cU" rel="nofollow">https://gitee.com/wallace5303...</a></li></ul><h2>特性</h2><ol><li>跨平台:一套代码,可以打包成windows版、Mac版、Linux版或者以web网站运行</li><li>简单高效:支持vue、react、ejs等前端技术</li><li>工程化:可以用服务端的开发思维,来编写桌面软件</li><li>高性能:可启动多个工作进程</li><li>功能丰富:服务端的技术场景都可以使用,如:路由、中间件、控制器、服务、定时任务、队列、插件等</li><li>功能demo:桌面软件常见功能,后续逐步集成并完善或提供demo</li><li>更多功能请看文档</li></ol><h2>本次更新</h2><ol><li>增加chrome扩展程序(重点)</li><li>增加web(html)内容嵌入</li><li>增加多窗口打开</li><li>增加桌面通知</li><li>增加电源监控</li><li>增加获取显示器信息</li><li>增加系统主题设置</li><li>修改功能分类</li></ol><h2>使用场景</h2><h3>1. 常规桌面软件</h3><ul><li><p>demo</p><p><img src="/img/remote/1460000040760492" alt="" title=""><br><img src="/img/remote/1460000040760493" alt="" title=""></p></li></ul><h3>2. 游戏(h5相关技术开发)</h3><ul><li><p>忍者100层</p><p><img src="/img/remote/1460000040760494" alt="" title=""></p></li></ul><h3>3. 任意网站变桌面软件</h3><ul><li><p>Youtube</p><p><img src="/img/remote/1460000040760495" alt="" title=""></p></li><li><p>discuz-q论坛</p><p><img src="/img/remote/1460000040760496" alt="" title=""></p></li></ul><h3>4. web项目</h3><ul><li><p>网站助手:<a href="https://link.segmentfault.com/?enc=7C6dl%2ByYh%2BwRgfFt4Vobjw%3D%3D.sBRLaeeOaKfdLI3YogQjYXMlOiqlKLC3DT6twxaJqfY%3D" rel="nofollow">http://b.kaka996.com/</a></p><p><img src="/img/remote/1460000040760497" alt="" title=""></p></li></ul><h2>开始使用</h2><ol><li><p>下载</p><pre><code># gitee
git clone https://gitee.com/wallace5303/electron-egg.git
# github
git clone https://github.com/wallace5303/electron-egg.git</code></pre></li><li><p>安装</p><pre><code># 提升安装速度,使用国内镜像;
npm config set registry https://registry.npm.taobao.org
# 进入目录 ./electron-egg/
npm install</code></pre></li><li><p>常用命令</p><pre><code># 开发者模式
# 1:【进入前端目录】,启动vue
cd frontend && npm install && npm run serve
# 2:【根目录】,启动后端服务
cd ../ && npm run dev
# 预发布模式(环境变量为:prod)
npm run start
# 打包-windows版本
npm run build-w (32位)
npm run build-w-64 (64位)
# 打包-mac版本
npm run build-m
npm run build-m-arm64 (苹果M1芯片架构)
# 打包-linux版本
npm run build-l
# web运行-开发模式
npm run web-dev
# web运行-生产者模式-启动
npm run web-start
# web运行-生产者模式-停止
npm run web-stop</code></pre></li></ol>
Electron-egg 1.14.0 发布,桌面软件,从未如此简单
https://segmentfault.com/a/1190000040760489
2021-09-30T10:52:20+08:00
2021-09-30T10:52:20+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
3
<p>一个简单、快速、功能丰富的跨平台桌面软件开发框架。</p><ul><li>🏆 码云最有价值开源项目</li><li>地址:<a href="https://link.segmentfault.com/?enc=74oF51JBigj%2FwbyqeYlj9g%3D%3D.jdTTYKzxOUJrOjg3K%2BD2huiwK6duNQ6ljRPluqH4D9bqNmG%2F2GuvRoWaBOg1xXyd" rel="nofollow">https://gitee.com/wallace5303...</a></li></ul><h2>特性</h2><ol start="0"><li>很多小伙伴问可以商用么?基于本框架开发的软件,可以商用。</li><li>跨平台:一套代码,可以打包成windows版、Mac版、Linux版或者以web网站运行</li><li>简单高效:支持vue、react、ejs等</li><li>工程化:可以用服务端的开发思维,来编写桌面软件</li><li>高性能:可启动多个工作进程</li><li>功能丰富:服务端的技术场景都可以使用,如:路由、中间件、控制器、服务、定时任务、队列、插件等</li><li>功能demo:桌面软件常见功能,后续逐步集成并完善或提供demo</li><li>自动更新</li><li>更多功能请看文档</li></ol><h2>本次更新</h2><ol><li>视图样式重构</li><li>demo增加分类</li><li>demo界面优化,重新排版</li><li>增加选择文件夹目录</li><li>增加ipc通信模块与apis模块语法统一</li><li>增加路由分类</li><li>增加ipc支持长通信,服务端持续向页面发消息</li><li>增加操作系统弹框demo</li><li>删除非必要代码</li><li>修复拉伸窗口空白</li></ol><h2>使用场景</h2><h3>1. 常规桌面软件</h3><ul><li><p>demo</p><p><img src="/img/remote/1460000040760492" alt="" title=""><br><img src="/img/remote/1460000040760493" alt="" title=""></p></li></ul><h3>2. 游戏(h5相关技术开发)</h3><ul><li><p>忍者100层</p><p><img src="/img/remote/1460000040760494" alt="" title=""></p></li></ul><h3>3. 任意网站变桌面软件</h3><ul><li><p>Youtube</p><p><img src="/img/remote/1460000040760495" alt="" title=""></p></li><li><p>discuz-q论坛</p><p><img src="/img/remote/1460000040760496" alt="" title=""></p></li></ul><h3>4. web项目</h3><ul><li><p>网站助手:<a href="https://link.segmentfault.com/?enc=0WqwrxpHL0T%2B1Zmy1Znc4A%3D%3D.NkyTFE6wYEn2p2KJe6XHLA1faLmGaKy%2BTtFtMqF6Kuk%3D" rel="nofollow">http://b.kaka996.com/</a></p><p><img src="/img/remote/1460000040760497" alt="" title=""></p></li></ul><h2>开始使用</h2><ol><li><p>下载</p><pre><code># gitee
git clone https://gitee.com/wallace5303/electron-egg.git
# github
git clone https://github.com/wallace5303/electron-egg.git</code></pre></li><li><p>安装</p><pre><code># 提升安装速度,使用国内镜像;
npm config set registry https://registry.npm.taobao.org
# 进入目录 ./electron-egg/
npm install</code></pre></li><li><p>常用命令</p><pre><code># 开发者模式
# 1:【进入前端目录】,启动vue
cd frontend && npm install && npm run serve
# 2:【根目录】,启动后端服务
cd ../ && npm run dev
# 预发布模式(环境变量为:prod)
npm run start
# 打包-windows版本
npm run build-w (32位)
npm run build-w-64 (64位)
# 打包-mac版本
npm run build-m
npm run build-m-arm64 (苹果M1芯片架构)
# 打包-linux版本
npm run build-l
# web运行-开发模式
npm run web-dev
# web运行-生产者模式-启动
npm run web-start
# web运行-生产者模式-停止
npm run web-stop</code></pre></li></ol>
一行命令把任意网站变成桌面软件
https://segmentfault.com/a/1190000040541148
2021-08-19T11:42:48+08:00
2021-08-19T11:42:48+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
4
<h2>一行命令把任意网站变成桌面软件</h2><p>以前,开发一个桌面软件要花费大量的人力和时间。现在随着Electron的出现,大大简化了开发门槛。今天,给大家介绍一个工具,让你5分钟之内就把一个网站变成一个可安装的桌面软件。</p><h4>所需工具</h4><ul><li>electron-egg 是一个简单、快速、功能丰富的跨平台桌面软件开发框架。</li><li><a href="https://link.segmentfault.com/?enc=xnEUyUV9DUi%2BTUKkAT%2FeTw%3D%3D.1zrBZv0snWoF3Zpd7JS34xc%2FWqKh5HlV6YXX2GzIR%2FM8gMek6JzkC%2BTo2MT8mlMj" rel="nofollow">查看 electron-egg 教程</a></li></ul><h4>效果如下</h4><p><img src="/img/bVcUgLc" alt="" title=""><br><img src="/img/bVcUgLf" alt="" title=""></p><h4>安装工具</h4><ol><li><p>下载</p><pre><code># gitee
git clone https://gitee.com/wallace5303/electron-egg.git</code></pre></li><li><p>安装</p><pre><code># 提升安装速度,使用国内镜像
npm config set registry https://registry.npm.taobao.org
# 进入目录 ./electron-egg/
npm install</code></pre></li><li><p>配置网站</p><pre><code># 编辑文件
./electron/config.js
# 配置网站地址
remoteUrl: {
enable: true, // 启用:true
url: 'https://discuz.chat/' // 任意网址
},</code></pre></li><li><p>打包成可执行程序(windows、macOS、linux)全都支持</p><pre><code># 打包 (windows版本)
npm run build-w (32位)
npm run build-w-64 (64位)
# 打包 (mac版本)
npm run build-m
npm run build-m-arm64 (m1芯片架构)
# 打包 (linux版本)
npm run build-l</code></pre></li><li><p>安装包在这里</p><pre><code>./out/安装包.exe (dmg、dep等)</code></pre></li><li>快来试试效果吧^_^</li></ol><h4>更多用法</h4><p><a href="https://link.segmentfault.com/?enc=2SiZN%2BDiT2gbHvMNrQ0XLg%3D%3D.n1po9bCqc6ikp91BVT0%2BsN%2Bh4ltTucFKmCnZY0uUiLgfOMbCk9FZjpybNk5M8C1h" rel="nofollow">查看 electron-egg 教程</a></p>
免费图床,auxpi 集合多家 API 的新一代图床
https://segmentfault.com/a/1190000021012367
2019-11-15T16:10:05+08:00
2019-11-15T16:10:05+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<p>前言:我们在写博客或者文档或者工作中的时候,经常需要上传图片获取图片地址,这时候,就需要用到图床,本次发布一个开源的auxpi免费图床,使用体验非常好,请尝试。</p>
<p>注:每周会上架1~2款新应用,持续更新</p>
<h2>dapps是什么?</h2>
<p>dapps是一个应用程序商店,包含丰富的软件,一键安装程序;多版本共存。</p>
<h2>使用</h2>
<p>官网文档:<a href="https://link.segmentfault.com/?enc=lSXGvNfXBNk9VJZp5P0d8g%3D%3D.phkK4z7RzpoMZFxfxMYWQRAeqJ0n9OEFVh8ZP%2FkDGpBfaZ8l2dkQU5AXIoFERNSR" rel="nofollow">dapps应用商店</a></p>
<ol>
<li>应用商店中安装 auxpi</li>
<li>使用说明:<a href="https://link.segmentfault.com/?enc=YnBuDvXMzOzMdO8yRlDgEQ%3D%3D.JaofmNoNz5WIk%2BMfd7tGBL31U37pxoPC6gUs3Mt5G24vA3shpsnbtrWPX%2BJpDPSmTL1iHEaIUQ%2FgR8o18aaO7WHLywKfyNpNLz0kfYBTxZk%3D" rel="nofollow">查看</a>
</li>
</ol>
<h2>效果</h2>
<p><img src="/img/bVbAkq0" alt="20191113105517.png" title="20191113105517.png"><br><img src="/img/bVbAkq1" alt="20191113103848.png" title="20191113103848.png"><br><img src="/img/bVbAkq6" alt="20191113104443.png" title="20191113104443.png"><br><img src="/img/bVbAkra" alt="20191113105847.png" title="20191113105847.png"></p>
<h2>目前包含的软件</h2>
<ul>
<li>百度网盘web版:下载速度比官方快很多 ------ <a href="https://link.segmentfault.com/?enc=3Jt4GoOCfbvi8%2B81vBkxLw%3D%3D.ALt32qdRWqYpZkzD8t1lwX4T159%2B1KMqYW1mmj9SaGURsdu9KFJXwrys7tWRZpgYICgXPYvAqHgMXDyT5zpW8%2BXPvA4r8OBw2FvWuvWAjYFNSQ3VgHtcRy7w%2FKK3AUpS" rel="nofollow">查看效果</a>
</li>
<li>AriaNg高速下载器:2倍迅雷速度,迅雷无法下载的资源,也能下载 ------ <a href="https://link.segmentfault.com/?enc=pWN8U4DUeD36XukXalRs2w%3D%3D.Scl4f5oKzS1VysISAYi8r2P5FM%2FLTGBSH1%2Fuc77eniALAkFqf8Uy4qU1ZxNmnKEJKiSVbMxeCweugAwln994r5c6f8A2fXNL%2FjtBIgeeO8I%3D" rel="nofollow">查看效果</a>
</li>
<li>百度网盘下载器(命令行) ------ <a href="https://link.segmentfault.com/?enc=7CxGrrW91tlIwz3ZUPOD2A%3D%3D.%2Fu2YFHFzfqjLtTLbi1p8duJNveZ7Y9xqKtPf2Bvr4OBDOGmdu2qRjJfme3orpTDbH9Tr6MHslLuda1atQwqbzo7zLNZNSEB8UY2v4O9Hrxvytn899R%2FNvXvanCA8%2FZSp" rel="nofollow">查看效果</a>
</li>
<li>wordpress ------ <a href="https://link.segmentfault.com/?enc=waDskqxAXgkySAOq5ZTa8A%3D%3D.cIlRF8T8FdDWh7OWmU5n9%2BYrHIog%2BjrsI5k%2Bej1IiEnse03%2FOtYMyyBct3F9iIyHV%2B3Lcczi2%2BrGO0pp6Luo3Dn9pxRk3vFkmbCvslpB5FRPGZAZ5F%2BPxuKN1mkQukUi" rel="nofollow">查看效果</a>
</li>
<li>py12306抢票 ------ <a href="https://link.segmentfault.com/?enc=ZFuDpKYAWFhhCz%2FBtasdPQ%3D%3D.6V6t2JE20qCXYGuBXkIBjlbyoBC7%2FoOCK28EUt4V2hab4I4S89vAweBOO%2FZYota4VvYjARhHBJ%2FFJd6LqAUs9WlUMX5icbS35N%2BIW53zF7alclSCGA2QYHMr7mJ6AdrW" rel="nofollow">查看效果</a>
</li>
<li>magnetw: 种子搜索神器 ------ <a href="https://link.segmentfault.com/?enc=QJ0xwi5kvwkEncfzyy11Ow%3D%3D.5FYoRpvzYOcMpSky2zBwsNLDxz5VJ3I8Hc9jzmzHQf1K%2Bpr%2Fl%2B4GVAR0DHVoAWO3XYONxLakczOYWFwEgDA%2BdB5jkZOVrGXI%2BOrdK0mWNQeS0n%2FRMZCsQu%2BQlGrNr0vA" rel="nofollow">查看效果</a>
</li>
<li>PhpMyAdmin:mysql管理工具 ------ <a href="https://link.segmentfault.com/?enc=MG%2BHC36qqmNW%2BDACwKD3Bw%3D%3D.V2ptvlaqpLR%2FOZCMcBRbrkmMY%2FQ5ht2DsvUunKjYtu3nlJYnjzRq%2FbvYgY7bRf3xE2Yw6isPfCPnBrla5himdq%2Bb3TdzZiDpppqGXRPYVa0re5rTqhWz3%2FnVV4qKgjiZ" rel="nofollow">查看效果</a>
</li>
<li>adminmongo: mongo管理工具 ------ <a href="https://link.segmentfault.com/?enc=cmHvpf3BJ%2FqLowVXEuTNVg%3D%3D.u92CyTS8JwLtMgVrsnSbtUelKxWzFgSirZi0c0eSLYpQeU1j7GUriXWswMD4JruKI8wSq%2BZpRGwh%2FDBjVzY21wfPk5qipQVUDUAL0jKa9hAGWQJAKhLKRgFjRw3CKauC" rel="nofollow">查看效果</a>
</li>
<li>PHP: 世界上最好的语言(版本:5.6,7.1,7.2,7.3)------ <a href="https://link.segmentfault.com/?enc=y7FPIr%2F0eEvk50pSExX7Ow%3D%3D.stD5Z089yWZgFXxf3ZvwGpIYt29togwd1yZnrLBDhod7yFT4rQUIkIrX4IBKOrDUHZPSD9SP5YtIxN4ErNcqf47f99%2FNZBSHPqPOx0r%2BWdOkDIAivj%2BiejqzM4CItDlH" rel="nofollow">查看效果</a>
</li>
<li>Mysql:数据库(版本:5.6,5.7,,8.0)------ <a href="https://link.segmentfault.com/?enc=dvRr1jzbXeYJEnob%2FiNr%2BA%3D%3D.agxLNCjZ7izf9%2FIfkzl4CUN1n9sewRWalPKPg97VD0lE2bSsOePasO6i9CFsiknQpnXwd9rFZGD9GqAjZ5AWtMIjttbgwDKYC0H3Kl7HXDdY107ruaU9FtFnU5Tcoght" rel="nofollow">查看效果</a>
</li>
<li>Nginx:服务器(版本:1.16)------ <a href="https://link.segmentfault.com/?enc=4hmLhdWzRMX24xEnKfIokA%3D%3D.d%2BDnQBfwyLgeDb7TwXtEZK%2BgmN2jdxL8Km%2B7T2Un%2BwQVThgVUKuVXePZ22LWfZR94RvItGLRU7xXC2MQ7O3fAu%2FZUE2mCQcT7%2F3NgDUjl0vUmeGS3d%2FSAaLrdE3EzKoW" rel="nofollow">查看效果</a>
</li>
<li>redis:nosql数据库(版本:5.0)------ <a href="https://link.segmentfault.com/?enc=tTKWcvWhhXNjjeYnm7aqWQ%3D%3D.xWpEv87CQPqzPLIM28yb4UU6URtudxJjvMmn%2FFKXL0Qks7aKT1pwhjDkQC9yYIPaUlnooszgKlJa2bwCnXxYB9wsjLO1oiVopZSZGeFUFSs%3D" rel="nofollow">查看效果</a>
</li>
<li>mongo:是一个基于分布式文件存储的数据库(版本:3.4,4.0)------ <a href="https://link.segmentfault.com/?enc=HaR8MKLWz%2BUG1Cs0RtVBJA%3D%3D.bPMdQOrJc8nbDZrRWccHHlZYr05OlY8L1Vu5e42117jhK1l4su2LM09Vq6dMTgzVjSRXNHTloCXHiUE5dTqLdKCXxqyoBbcISAgqSAimLUJVrdFVg29QbMWGtEB13Ni2" rel="nofollow">查看效果</a>
</li>
<li>gogs版本控制 ------ <a href="https://link.segmentfault.com/?enc=siMrN4PEGdNUOZGYisCcnQ%3D%3D.ODtyBRndRN6f3Zy1DRUhUhy%2Bts9IcKd4XMTW34Andi3etjQU%2FkoxYlwHx4cs9XGFWPxJsAbYSWy55Gny51KF4oZKnVoUVftbL6VfSomMzuE%3D" rel="nofollow">查看效果</a>
</li>
<li>rabbitmq3.7队列服务 ------ <a href="https://link.segmentfault.com/?enc=OcI8%2FqM7TMc04nk9AMExUg%3D%3D.pt0fDsZZvRJZFhIIyVxhgYICnctyJEpgc854nVs3pCfGWs3vQZuA2HrYlQJOtveUk44GAM7dT8jd28L0ztqiOzLKWx5evKV7NeatbzEQhfbqS0tCfaknxnV32bLgK27%2F" rel="nofollow">查看效果</a>
</li>
<li>2048游戏 ------ <a href="https://link.segmentfault.com/?enc=i5bv%2FdpyX1KcVcTUfPXX3g%3D%3D.mLUFuSaKhUx1nCxSJuCD%2Bb30wW9ED4sxxezDbLgO3MSImfzxSLtdAt290i7a5GHkazudepHoiblYgqpWKnEwlPreWWEULHxy%2FgRHETmWBoyIMz6phQhy3LIEBiJZLBwq" rel="nofollow">查看效果</a>
</li>
<li>等......</li>
</ul>
Dapps 上架 baidupcs-web,百度网盘 Web 版
https://segmentfault.com/a/1190000020985493
2019-11-13T09:59:23+08:00
2019-11-13T09:59:23+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<p>前言:之前上架过一个命令行版本的百度客户端,但大部分用户不知道怎么使用,本期上架一个带界面的易使用版本</p>
<h2>dapps是什么?</h2>
<p>dapps是一个应用程序商店,包含丰富的软件,一键安装程序;多版本共存。</p>
<h2>使用</h2>
<p>官网文档:<a href="https://link.segmentfault.com/?enc=aqR5uwnTkVShMAYDZzMxRA%3D%3D.RSn5ysRBwjwsbovAO93Lrxr179adyD%2BbNceWw84x%2Ft80B6kt%2FG9OIiQrEJgbp5LG" rel="nofollow">dapps应用商店</a></p>
<ol>
<li>应用商店中安装 BaiduPCS-web</li>
<li>使用说明:<a href="https://link.segmentfault.com/?enc=9w3pSGn%2BI8UciLoj%2FZs70w%3D%3D.TJhKL6HM056X%2FEn6QcKWzA%2B5U2xAq08qA5tjMpflvScb6oljYMHwuh05pZeCcQl4gmoFuoTwzGEUXftqI3rGU0avc8c0zcmrf%2B9puQLOnGxl9wh2vLOR9ojahxeNTBTy" rel="nofollow">查看</a>
</li>
</ol>
<h2>效果</h2>
<p><img src="/img/bVbAdo7?w=1709&h=830" alt="QQ截图20191106095853.png" title="QQ截图20191106095853.png"><br><img src="/img/bVbAdrC?w=1727&h=755" alt="QQ截图20191106102409.png" title="QQ截图20191106102409.png"></p>
<h2>目前包含的软件</h2>
<ul>
<li>注:每周会上架一款新应用,持续更新</li>
<li>百度网盘web版:下载速度比官方快很多 ------ <a href="https://link.segmentfault.com/?enc=mZWK4KKvHXoewyPqO7iqQw%3D%3D.uz6UgZXew0j2%2BO8NsFBVXVHcfPzolbS9qROQYJd4ctJmdl96dSGxlNtskMR4OX9Nv3f7nEnptVq8jwdkjrxP7FiH9axCiwn%2F2e7Q3pNhoLNwoPYnFaPkRtGkYrRqAuhe" rel="nofollow">查看效果</a>
</li>
<li>AriaNg高速下载器:2倍迅雷速度,迅雷无法下载的资源,也能下载 ------ <a href="https://link.segmentfault.com/?enc=c4%2Fvf9KduL%2Bl5lk8%2F2anpQ%3D%3D.HfJjAGJjK%2Fx3fxJMmkVsmeu4%2FwV97fUkJPsErChybk0pX6yTzGix1JoN88ezJyttYgH2Op%2BhRpXi7XbAMCMJbVReOwMbFam9by5sDEYaJcw%3D" rel="nofollow">查看效果</a>
</li>
<li>百度网盘下载器(命令行) ------ <a href="https://link.segmentfault.com/?enc=Jzny3JPkamTXH9az3cHJlw%3D%3D.PIocyrho5YV6F3Mx3fiyhTZyeV87KILQDGPt53WRsY5RNd4dYyUqe9DokaQUYu4PzuSn0JAcCpE1c%2Bn5UtzeFvy%2F3J26epmrXwvNfpYXmf16qH5UVdftdKLZLfP5FTyE" rel="nofollow">查看效果</a>
</li>
<li>wordpress ------ <a href="https://link.segmentfault.com/?enc=6%2Bqx5YSale6ctuh0WXsyow%3D%3D.szXkEH1Umg8%2B%2Bvs61o24LE4sTP0OHtJEWtxTeFEfJQpLGEgSmP8G%2BCPDcQjq4kqGSB0Q%2FTdQ1xhX5NDpirApx%2Fo7cyaA7gbFJXVnYDUlYOUrc6W1YMftCzjLdUgYdYpZ" rel="nofollow">查看效果</a>
</li>
<li>py12306抢票 ------ <a href="https://link.segmentfault.com/?enc=XzANSEyL3OYvdNBsy7I6uQ%3D%3D.DtB84vUSke%2F%2BHeWxAFA5ldPAoe6gPIYgr4C22lidnU1cHW%2BK8GrP%2B3ZT427hC8vB3OY74HKYdJWWCInHwHtDVq0CNeI8wE%2B2%2FZBUCP5tXwtcG7sdn9lajbt85jwBa9W3" rel="nofollow">查看效果</a>
</li>
<li>magnetw: 种子搜索神器 ------ <a href="https://link.segmentfault.com/?enc=gLM9vz0JioG6WIHJy%2FQh1Q%3D%3D.Tv8v2dp04tESL3%2BxN%2Fd04%2BAYiJfbMquvAZ1auguluRPkym2Of4h1QYiGGNHL9L2jGNPZaN%2FjwCH3wqG8P0jpOC9IGVBM39O31l%2B6qL%2FTcQGAWf2KHepl1PKbUmIhwX%2Fa" rel="nofollow">查看效果</a>
</li>
<li>PhpMyAdmin:mysql管理工具 ------ <a href="https://link.segmentfault.com/?enc=wPqRCQkNyhjqyZ4lvVNJwQ%3D%3D.nXoPQ05y7KxNi6PAXmoW3EWWThx8QBPkjBvumKX4IXJB9zYqZvnD46bRa69XeFkriQuvRx2ouxIPQ%2Fk5ZiY2vOizMeZL20NMvUu5%2BP3VYOinADlYi7X3NKZAd%2F%2FuRnb5" rel="nofollow">查看效果</a>
</li>
<li>adminmongo: mongo管理工具 ------ <a href="https://link.segmentfault.com/?enc=hQTzywjdd6KbFOj4kFF3rg%3D%3D.%2B2fxeH89GDB23yUprS%2B0H0JilQMoyQ3r%2FMWnwSeZ4nZxKaAMjpJRHn4ljtHTHE5tWyUhDtYmoycvQ%2BWozcJWbjWUVsh9%2BRVHl9basx1Op67agcmOPbbi64EpuWIOHpLv" rel="nofollow">查看效果</a>
</li>
<li>PHP: 世界上最好的语言(版本:5.6,7.1,7.2,7.3)------ <a href="https://link.segmentfault.com/?enc=0o5Y0aBx%2Fus7Mw0TIrjuBA%3D%3D.LnpDeEijREkqvpP3XHag37%2BWTdYJqS%2BfOUdMioiZAT4fSnReWY%2Bt01WhR9lM34kUM8TgmfLnikaN4w99KysiU2EW5cLcRA%2BPsQw%2FU1cJmikT5UyP%2BqbsR98Qa69yOq7N" rel="nofollow">查看效果</a>
</li>
<li>Mysql:数据库(版本:5.6,5.7,,8.0)------ <a href="https://link.segmentfault.com/?enc=7HosB%2BMCLZ%2FPVbeNPkFC9w%3D%3D.FmZFaZMpox0C3Cv71UUzwlxWycIivME9KK%2FCIWJ1Qx0VNyNc%2BFGx8y7UuxIAMT6W1pMyc06D4o9x1Y1xAwne89X1Z%2Fs2iUJbLPG7l4Qs1SnmQxB7HT8KDZOPnLSIndX0" rel="nofollow">查看效果</a>
</li>
<li>Nginx:服务器(版本:1.16)------ <a href="https://link.segmentfault.com/?enc=15R%2B9476%2BIIgKeF9rByj9Q%3D%3D.Car59v92NG2hVjkNiNzsWuL75HePNYqfqJlhanHkg6vzASapArQwVvjADelF8BplCFqutr2jtYQsTRI3WGqtbIVpU%2FCLLV67NVQDRxOeiR8exp6FFK5z22Mbc00KZzUT" rel="nofollow">查看效果</a>
</li>
<li>redis:nosql数据库(版本:5.0)------ <a href="https://link.segmentfault.com/?enc=NSWjrOP4C6JiF00d3ufMRg%3D%3D.7ux52rndNeZuYVeqamYlQWsOHHTGcRNwEZ%2BRv83GTy8vgJ9WHyW12%2B%2FkxN3kOMb00jYeepECBDOyS%2ByiNn55Oq9eEewrPwGzMnS%2FB%2F035q0%3D" rel="nofollow">查看效果</a>
</li>
<li>mongo:是一个基于分布式文件存储的数据库(版本:3.4,4.0)------ <a href="https://link.segmentfault.com/?enc=YPPGpZUK4istC2TsVJtnCg%3D%3D.skIJvgbV7u%2FeMpBN0ijn93wtMFBIk1YGTnKAUSOTm9MldwqHef6x5yuvGyHFubnSpdpXjCIBfDLHkdGrr%2Bm2%2FUNSfrFrbl8GZ%2BsYpLghhXLgLJkBY0vOdVhv%2FFRp40%2FP" rel="nofollow">查看效果</a>
</li>
<li>gogs版本控制 ------ <a href="https://link.segmentfault.com/?enc=SWGcCL0ZdNof5Wd14GsvRg%3D%3D.JsUqrdh4ytdHI9tCXN%2BV0b070e11lIqS41mgYmCKv2R%2FfqOZWoYGYemd31O0c8v1OVJPYWLSu3lFwUh7Yw1A%2Bp%2FAsx2Mfxa5p9SThwnbI8Y%3D" rel="nofollow">查看效果</a>
</li>
<li>rabbitmq3.7队列服务 ------ <a href="https://link.segmentfault.com/?enc=onoMazpNeXCNx8I4GaeNiQ%3D%3D.KPgZqPD%2BA%2BDGSDrGjhqn8oHYY4dWHaJ6c4CsKnvT54Ht1FL3SBjE5anUHxjPVR6Z4DL8RRY1g7w%2BxMfSLXr32H3bsirvBonnCZ26yO%2FjG5Pd%2FsO0lE9Zg46tgNZm9WXJ" rel="nofollow">查看效果</a>
</li>
<li>2048游戏 ------ <a href="https://link.segmentfault.com/?enc=VlSj4mTcH7blWx95s0kphA%3D%3D.EAB5%2BMajEtLq2bibam4VGSfTpDAU69AP%2BQZRXDJlzwLpHPHKPyGq1TaC6IxOcKBZrcNNIWk6kxaZoDotPm1Rv0%2FPKR6f1SuKwK%2FylNz0dBj7pNqZnHi5Ws5N6bgqkCkd" rel="nofollow">查看效果</a>
</li>
<li>等......</li>
</ul>
docker安装AriaNg下载器
https://segmentfault.com/a/1190000020907891
2019-11-05T09:57:00+08:00
2019-11-05T09:57:00+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<p>AriaNg是一个非常优秀的下载工具,基于aria2。个人感觉可以替代迅雷。</p>
<p>效果图:<br><img src="/img/bVbzTey?w=1701&h=450" alt="QQ截图20191104151923.png" title="QQ截图20191104151923.png"></p>
<p>代码:<br>docker-compose.yml</p>
<pre><code>version: '3'
services:
ariang:
image: wahyd4/aria2-ui:latest
container_name: dapps-ariang
ports:
- "${ARIANG_HOST_PORT}:80"
volumes:
- ${ARIANG_DATA_DIR}:/data
restart: always</code></pre>
<p>.env文件</p>
<pre><code># app info
AUTHOR_UID=10000000
AUTHOR_NAME=kaka
APP_ID=ariang
APP_NAME=ariang高速下载器
APP_INTRODUCTION=2倍迅雷下载速度
APP_UPDATE_CONTENT=
APP_VERSION=1.0.0
APP_PORT=8011/ui
# environment config file
SOURCE_DIR=./www
# Timezone
TZ=Asia/Shanghai
# environment config
ARIANG_HOST_PORT=8011
ARIANG_DATA_DIR=./downloads</code></pre>
<p>对docker不太熟悉的同学,可以使用dapps应用商店,一键安装。</p>
<p>Dapps项目:<a href="#">使用</a></p>
跨平台应用商店 Dapps 发布,nodejs编写
https://segmentfault.com/a/1190000020768780
2019-10-22T19:03:27+08:00
2019-10-22T19:03:27+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h3>dapps是什么?</h3>
<p> 它是基于docker的应用程序商店,包含丰富的软件,因为基于docker,使你本机电脑有云开发的效果。 一键安装程序;多版本共存,完善的使用说明,且不影响本机环境。 前端、服务端、运维、站长可以直接使用,效率提高非常多。普通用户亦可使用其中部分软件。</p>
<p>官网文档:<a href="https://link.segmentfault.com/?enc=%2F8dGCNpwGv73GjTEY7shaw%3D%3D.i4of1DZXNp%2B%2BgLWD%2FJ985RaTdtqZJGQRWjw1akDV72sT72MJzYSTKeMw43R6gtZh" rel="nofollow">dapps应用商店</a></p>
<hr>
<p>github:<a href="https://link.segmentfault.com/?enc=Vz06jYvLF4jEIEWUU1jscQ%3D%3D.4jhkXWgeIvGWWfFvmvVYgAxwRSIZTsNzM1dO%2BToJeP2GKCf4f1J8F%2Faqsf2cVhgd" rel="nofollow">https://github.com/wallace5303/dapps</a></p>
<p>gitee: <a href="https://link.segmentfault.com/?enc=AE2zCzOhX%2Bh0VePMoLoPcQ%3D%3D.M%2BiMoS9KuNKH2C4ShvrKvzruuiiLPG6b6MDa0iAvLfs5lvd3DcVbQoTJhhojMxmn" rel="nofollow">https://gitee.com/wallace5303/dapps</a></p>
<h3>目前包含的软件</h3>
<ol>
<li>PHP : 世界上最好的语言(版本:5.6,7.1,7.2,7.3)</li>
<li>Mysql : 数据库(版本:5.6,5.7,,8.0)</li>
<li>Nginx : 服务器(版本:1.16)</li>
<li>PhpMyAdmin: mysql管理工具</li>
<li>redis nosql数据库(版本:5.0)</li>
<li>mongo 是一个基于分布式文件存储的数据库(版本:3.4,4.0)</li>
<li>py12306抢票软件</li>
<li>gogs版本控制</li>
<li>mysql-8.0.16</li>
<li>mongo-4.0.13</li>
<li>magnetw 2.1 磁力种子聚合搜索下载</li>
<li>php 5.6、 7.1、 7.3</li>
</ol>
<h3>开始使用</h3>
<p># 下载<br>git clone <a href="https://link.segmentfault.com/?enc=bvYmGGfaBTV%2B%2F4p5nykjvg%3D%3D.Dy3Bu61a5FPwhSuON3RJPKH9J5ZUTBKFWGmZ5cQ6e2CZprin5PQEoZRTTYpDq2Kv" rel="nofollow">https://gitee.com/wallace5303...</a></p>
<h2>安装</h2>
<p>cd dapps<br>npm install --registry=<a href="https://link.segmentfault.com/?enc=5dgNgU1iO4SJgKU9%2FHZujQ%3D%3D.O67qQHV%2BRM4FwExL5VeQchMCsbTy4Up%2Bfhr4FmQS8UA%3D" rel="nofollow">https://registry.npm.taobao.org</a></p>
<h2>启动</h2>
<p>npm run start</p>
<p>注:# 请确保已经安装了nodejs,下载地址:<a href="https://link.segmentfault.com/?enc=vOXjFVqMHQugeptgkfzl9g%3D%3D.iFQWy9xjmmeolFivH1cuLTqRrpwUkANrEMorxH7zL58%3D" rel="nofollow">http://nodejs.cn/download/</a></p>
<h3>效果图</h3>
<ol><li>访问: <a href="https://link.segmentfault.com/?enc=UOkcLPQPUV%2BdF5Kuz984xA%3D%3D.JzxHnWT2AR4Dt2g1oxCN%2F4%2FNikae2%2BmrCIskDtwG1FA%3D" rel="nofollow">http://localhost:8000/</a>
</li></ol>
<p><img src="/img/remote/1460000020768783" alt="" title=""><img alt="" title="" src=""><img src="/img/remote/1460000020768784" alt="" title=""><img alt="" title="" src=""></p>
<h3>特性</h3>
<blockquote>1.使用对象:<strong>普通用户</strong>,<strong>前端</strong>,<strong>服务端</strong>,<strong>运维</strong><p>2.支持<strong>多版本共存</strong>php,mysql, mongo, redis等</p>
<p>3.兼容<strong>OneinStack</strong>的配置文件,完善的配置说明</p>
<p>4.支持<strong>绑定多个域名</strong></p>
<p>5.清晰的文件结构</p>
<p>6.支持php<strong>扩展</strong>安装</p>
<p>7.程序是基于docker最新stable版,并从官方仓库下载</p>
<p>8.持续不断更新,支持交互、无人值守安装</p>
<p>9.支持系统版本:Linux、MacOs、Windows</p>
</blockquote>
[译]10个最常见的JavaScript错误
https://segmentfault.com/a/1190000020119849
2019-08-19T17:59:30+08:00
2019-08-19T17:59:30+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<p>为了回馈我们的开发人员社区,我们查看了数千个项目的数据库,并发现了JavaScript中的前10个错误。我们将向您展示导致它们的原因以及如何防止它们发生。如果你避免这些“陷阱”,它会让你成为一个更好的开发者。</p>
<p>由于数据为王,我们收集,分析并排名前十大JavaScript错误。Rollbar收集每个项目的所有错误,并总结每个项目发生的次数。我们通过根据指纹对错误进行分组来实现此目的。基本上,如果第二个错误只是第一个错误的重复,我们将两个错误分组。这为用户提供了一个很好的概述。</p>
<p>我们专注于最有可能影响您和您的用户的错误。为此,我们根据不同公司遇到的项目数量对错误进行排名。如果我们只查看每个错误发生的总次数,那么大批量客户可能会因为与大多数读者无关的错误而压倒数据集。</p>
<h3>这里是10大JavaScript错误:</h3>
<p><img src="/img/bVbwAal?w=1000&h=619" alt="图片描述" title="图片描述"></p>
<p>为了可读性,上面错误的描述都是缩写后的。接下来会深入探讨一下,这些错误发生的原理,并且如何避免触发他们。</p>
<h3>1. Uncaught TypeError: Cannot read property</h3>
<p>如果你是一个JavaScript开发人员,可能你看到这个错误的次数,比你希望承认的次数还要多。当你在一个未定义undefined的对象上读取一个属性或调用一个方法时,这个错误就会在chrome里触发(当然在其他浏览器中也会报错,但是错误信息不是这样描述的)。在chrome开发者控制台console里,可以测试这个错误:<br><img src="/img/bV3F9U?w=915&h=145" alt="图片描述" title="图片描述"></p>
<p>这个错误出现的原因有很多,最常见的一种场景是:当使用UI组件进行渲染时,声明state不正确。让我们来看下下面这段在真实app中的示例代码片段。我们选取的react的代码,但是同理这种不恰当的声明在vue、Angular或其他框架中也会出现。</p>
<pre><code> class Quiz extends Component {
componentWillMount() {
axios.get('/thedata').then(res => {
this.setState({items: res.data});
});
}
render() {
return (
<ul>
{this.state.items.map(item =>
<li key={item.id}>{item.name}</li>
)}
</ul>
);
}
}</code></pre>
<p>这里有两点需要注意的:</p>
<ol>
<li>一个组件的state(比如上面的this.state)在组件生命周期开始时是未声明的,为undefined。</li>
<li>当你异步获取数据时,组件在获取到数据之前,无论你获取数据的代码是写在constructor方法,还是componentWillMount或者componentDidMount的生命周期里,至少都会调用一次render方法渲染模板。上面的示例代码运行第一次render的时候,this.state.items为undefined。这意味着本该是ItemList的值,却为undefined,接着你就会在console里看到一个错误”Uncaught TypeError: Cannot read property ‘map’ of undefined“</li>
</ol>
<p>这个问题修复起来也很简单。最简单的方法:在constructor里初始化时用恰当的默认值赋值给state。</p>
<pre><code>class Quiz extends Component {
// 在这里添加:
constructor(props) {
super(props);
// 声明state本身,并给他的属性都设置上一个默认值
this.state = {
items: []
};
}
componentWillMount() {
axios.get('/thedata').then(res => {
this.setState({items: res.data});
});
}
render() {
return (
<ul>
{this.state.items.map(item =>
<li key={item.id}>{item.name}</li>
)}
</ul>
);
}
}</code></pre>
<p>在你的app中的具体代码可能和上面有区别,但我们还是希望这会给你足够多的线索去修复或避免这个错误。如果没能帮到你,请继续阅读下面的更多例子以及相关的错误。</p>
<h3>2.TypeError: ‘undefined’ is not an object</h3>
<p>当你在一个未定义undefined的对象上读取一个属性或调用一个方法时,在safari里就会报这个错。你可以再Safari的console控制台里测试这个错误,本质上和上面那个在chrome中出现错误是一样的,只是在Safari用里的错误信息有区别。<br><img src="/img/bVbwAbU?w=575&h=160" alt="图片描述" title="图片描述"></p>
<h3>3. TypeError: null is not an object</h3>
<p>当你去读取一个null对象的属性或调用方法时,会在Safari里出现这个错误。可以在Safari 控制台里测试这个错误。</p>
<p><img src="/img/bV3F9V?w=555&h=159" alt="图片描述" title="图片描述"><br>有趣的是,在JavaScript中的null和undefined是不相等的,所以我们才会得到不同的错误信息。Undefined通常是指一个变量没有被声明,而null表示一个变量的值为空。使用严格相等操作符可以证实他们是不相等的。<br><img src="/img/bV3F9T?w=916&h=129" alt="图片描述" title="图片描述"></p>
<p>在实际项目中有一种出现这种错误的场景:当你在js中想要操作一个dom元素,但这个元素还没加载或者不存在时。这是因为dom的API会在你查找dom元素的结果为空的情况下返回null。<br>任何处理dom元素的代码必须要放在dom元素被创建完毕之后。JS代码正如HTML中一样,是从上而下执行的。所以,如果你在html代码里的dom元素之前使用了一个JavaScript标签,并在里面包含了一些内联的js代码,那么这些js代码会在html页面解析之前执行。这时可能就会出现这个错误,因为在加载js代码之前,dom元素还没有被创建好。<br>在这种情况下,我们可以通过添加一个监听页面是否解析完毕的事件监听来解决问题。一但事件监听器触发,init()方法就能开始使用dom元素了。</p>
<pre><code><script>
function init() {
var myButton = document.getElementById("myButton");
var myTextfield = document.getElementById("myTextfield");
myButton.onclick = function() {
var userName = myTextfield.value;
}
}
document.addEventListener('readystatechange', function() {
if (document.readyState === "complete") {
init();
}
});
</script>
<form>
<input type="text" id="myTextfield" placeholder="Type your name" />
<input type="button" id="myButton" value="Go" />
</form></code></pre>
<h3>4. (unknown): Script error</h3>
<p>当一个未被捕获的错误在跨域时,违背了浏览器的跨域策略,就会出现这个错误。举个例子,你把js代码放在了CDN上面,任何未捕捉的错误发生时(这里指冒泡到window.onerror的监听处理器,而没有try/catch的错误)都只会报一条简单的'Script error'信息,而没有更加详细有帮助的错误信息。这是浏览器的一种安全手段,为了防止跨域传输数据,不允许进行通信。<br>想要获取到真实详细的错误信息,你可以像这样做:</p>
<ul>
<li>
<p>在header里添加 Access-Control-Allow-Origin 字段</p>
<p>在header(这应该是服务器返回的response header)字段里,把Access-Control-Allow-Origin设为,这样就表示来自任意的域名请求都可以正确地访问到服务器的资源。必要的话也可以指定具体的域名来代替星号,比如:Access-Control-Allow-Origin: www.example.com。但是配置的域名太多的话,处理起来会有点棘手,而且如果你在使用CDN的话还会出现缓存的问题,这样就有点费力不讨好了。更多参考这里</p>
<p>下面举一些在各种环境下配置这个header的示例:<br>Apache:<br>在JavaScript代码所在的文件夹目录下,新建一个.htaccess文件,内容如下:</p>
<pre><code>Header add Access-Control-Allow-Origin "*"</code></pre>
<p>Nginx:</p>
<p>在JavaScript代码所在文件夹目录下面,添加add_header命令:</p>
<pre><code>location ~ ^/assets/ {
add_header Access-Control-Allow-Origin *;
}</code></pre>
<p>HAProxy:</p>
<p>在后端的JavaScript所在文件加入以下内容:</p>
<pre><code>rspadd Access-Control-Allow-Origin:\ *</code></pre>
</li>
<li>在JavaScript标签上设置crossorigin="anonymous"<p>在html代码里,每个设置好了Access-Control-Allow-Origin的js资源,都可以在其JavaScript标签上添加crossorigin="anonymous"。在设置crossorigin="anonymous"之前,确定好header字段都是正确发送了的。在Firefox里,如果js标签上出现了crossorigin属性,但是header里没有Access-Control-Allow-Origin,那么该js将不会被执行。(crossorigin是html5新增的功能,不只是JavaScript标签独有的,比如video、image也可以设置)</p>
</li>
</ul>
<h3>5. TypeError: Object doesn’t support property</h3>
<p>这个错误发生在IE浏览器中,当你调用一个未定义的方法时,可以在IE的console里测试这个:<br><img src="/img/bV3F9R?w=900&h=211" alt="图片描述" title="图片描述"></p>
<p>这个错误和发生在chrome里的"TypeError: ‘undefined’ is not a function"是相同的,不同的浏览器对于相同的逻辑错误会给出不同的错误信息。<br>这是一个常见的错误,当你在IE里操作JavaScript的命名空间时。这种情况百分之九十九是因为IE无法将当前作用域的方法绑定给this关键字。举个例子,假设你有一个名叫Rollbar的作用域,里面包含了一个isAwesome函数。正常情况下,你可以用下面这样的语法在Rollbar作用域里引用isAwesome函数:</p>
<pre><code>this.isAwesome();</code></pre>
<p>Chrome,Firefox 和 Opera 会能接受这个语法,但是IE不行。 因此,使用 JS 命名空间时最安全的选择是始终以实际名称空间作为前缀:</p>
<pre><code>Rollbar.isAwesome();</code></pre>
<h3>6. TypeError: ‘undefined’ is not a function</h3>
<p>调用一个未定义的函数时会出现这个错误,可以在Chrome或Mozilla Firefox的console里测试这个:<br><img src="/img/bV3F9Q?w=937&h=190" alt="图片描述" title="图片描述"></p>
<p>随着js代码的编码技巧和设计模式越来越复杂,在回调函数、闭包等各种作用域中this的指向的层级也随之增加,这就是js代码中this/that指向容易混淆的原因。<br>先来看下这段代码:</p>
<pre><code>function testFunction() {
this.clearLocalStorage();
this.timer = setTimeout(function() {
this.clearBoard(); // 这个this指向谁?
}, 0);
};</code></pre>
<p>执行上述代码时,会出现错误: "Uncaught TypeError: undefined is not a function."。这是因为你执行setTimeout方法时,其实是执行的window.setTimeout。所以作为参数传递过去的匿名函数,其实是在window作用域下执行的,而window对象并没有clearBoard方法。<br>一个最简单的、能兼容旧版本浏览器的方法,就是先把this指向赋值给一个变量self,然后在闭包里直接引用这个self变量。像这样:</p>
<pre><code>function testFunction () {
this.clearLocalStorage();
var self = this; // 把this赋值给self,这个作用域就会被保存下来
this.timer = setTimeout(function(){
self.clearBoard();
}, 0);
};</code></pre>
<p>另外也可以使用bind方法来传递恰当的this指向:</p>
<pre><code>function testFunction () {
this.clearLocalStorage();
this.timer = setTimeout(this.reset.bind(this), 0); // bind to 'this'
};
function testFunction(){
this.clearBoard(); //back in the context of the right 'this'!
};</code></pre>
<h3>7. Uncaught RangeError: Maximum call stack</h3>
<p>在chrome中有好几个情况会触发这个错误。其中一种情况就是无终止地调用一个递归函数。<br><img src="/img/bV3F9P?w=645&h=287" alt="图片描述" title="图片描述"></p>
<p>还有当你给函数传参时,如果超出了范围,也会出现这个错误。许多函数在接收数字类型的参数时,都有一个具体的范围要求。比如,Number.toExponential(digits) 和 Number.toFixed(digits)方法,只接受0到20的数字作为参数,而Number.toPrecision(digits) 接收1到21的数字。</p>
<pre><code>var a = new Array(4294967295); //OK
var b = new Array(-1); //range error
var num = 2.555555;
document.writeln(num.toExponential(4)); //OK
document.writeln(num.toExponential(-2)); //range error!
num = 2.9999;
document.writeln(num.toFixed(2)); //OK
document.writeln(num.toFixed(25)); //range error!
num = 2.3456;
document.writeln(num.toPrecision(1)); //OK
document.writeln(num.toPrecision(22)); //range error!</code></pre>
<h3>8. TypeError: Cannot read property ‘length’</h3>
<p>当在chorme中读取一个未定义变量的length属性时,就会出现这个错误。<br><img src="/img/bV3F9L?w=937&h=230" alt="图片描述" title="图片描述"></p>
<p>正常情况下你可以在数组对象上读取这个length属性,但是如果你要使用的数组对象没有被初始化,或者因为作用域的问题而没有正确地获取到,可能就会出现这个错误。来看下面这段代码理解下:</p>
<pre><code>var testArray= ["Test"];
function testFunction(testArray) {
for (var i = 0; i < testArray.length; i++) {
console.log(testArray[i]);
}
}
testFunction();</code></pre>
<p>当你声明函数的参数时,这些参数就是在函数内部的本地参数。这意味着,你在外部声明的全局变量和本地变量同名了话(都是叫testArray),那在函数内部读取的一定是本地的变量,即传入的参数。<br>有两种方法解决这样的问题</p>
<ul>
<li>
<p>在函数声明时,去掉这些参数。</p>
<pre><code>var testArray = ["Test"];
/* Precondition: defined testArray outside of a function */
function testFunction(/* No params */) {
for (var i = 0; i < testArray.length; i++) {
console.log(testArray[i]);
}
}
testFunction();</code></pre>
</li>
<li>
<p>把外部的变量作为参数正确地传给函数内部。</p>
<pre><code>var testArray = ["Test"];
function testFunction(testArray) {
for (var i = 0; i < testArray.length; i++) {
console.log(testArray[i]);
}
}
testFunction(testArray);</code></pre>
</li>
</ul>
<h3>9. Uncaught TypeError: Cannot set property</h3>
<p>当我们把一个变量为undefined的时候,它就永远返回undefined,不能再读取/设置它的属性。否则,就会抛出这个错误。<br><img src="/img/bV3F9N?w=939&h=232" alt="图片描述" title="图片描述"></p>
<h3>10. ReferenceError: event is not defined</h3>
<p>当您尝试访问未定义的变量或当前作用域无法访问到的变量时,就会出现这个错误。<br><img src="/img/bV3F9M?w=939&h=236" alt="图片描述" title="图片描述"></p>
Dnnmmp更新:Docker可视化管理工具Portainer
https://segmentfault.com/a/1190000020117960
2019-08-19T16:09:20+08:00
2019-08-19T16:09:20+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
4
<h2>dnnmmp更新1.2.4</h2>
<p>增加docker可视化管理工具portainer</p>
<h2>Portainer是什么?</h2>
<p>简介:Portainer是一个轻量级的管理界面,可以让您轻松地管理不同的Docker环境(Docker主机或Swarm集群)。功能十分全面,基本能满足中小型单位对容器管理的全部需求。</p>
<h2>快速部署:</h2>
<ol>
<li>帮忙加个星吧:<p><a href="https://link.segmentfault.com/?enc=OyloMCsu4rVHqYp86AKFYQ%3D%3D.KDNiv2BLwKklp0bt5M0tK%2F4sT%2Bm2xI%2F3ZUNS5fL%2FE%2FjOODta9GJfU%2BfQP1r86S8%2B" rel="nofollow">点击:GitHub</a></p>
</li>
<li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。<br><a href="https://link.segmentfault.com/?enc=fx8eWT6nLh%2BU7xN7TDb53w%3D%3D.0cMhgVlwQH3foykYLCbcEIlYnHqnzsiFAH0Tak%2BXvd3dFIdRiexECn7PiHNtj2yZ1QfSPK8dzs8Z48ZzMPHK%2FOd1Ri8f79Iz3nT5WLsn660fN8prZAtWIEusAMuhnx%2Bv" rel="nofollow">附录1:docker安装</a>
</li>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>构建并启动:</p>
<pre><code class="bash">$ cd dnnmmp
# 后台运行(第一次)
$ docker-compose -f docker-compose-manage.yml up -d portainer
# 停止
$ docker-compose -f docker-compose-manage.yml stop portainer
# 运行(如果容器已经存在)
$ docker-compose -f docker-compose-manage.yml start portainer
</code></pre>
</li>
<li>
<p>在浏览器中访问:</p>
<blockquote><a href="https://link.segmentfault.com/?enc=VpU6RxxQZdtE7O2DKjPn%2Bw%3D%3D.gdfqvBXKAqctTtJp%2FpOkRn%2Bh6S648MK0BeT%2BLX1XnSg%3D" rel="nofollow">http://localhost:8003</a></blockquote>
<p>如下图</p>
<p>登录:<br><img src="/img/remote/1460000020117963?w=1582&h=811" alt="" title=""></p>
<p>镜像列表:<br><img src="/img/remote/1460000020118135?w=1703&h=877" alt="" title=""></p>
<p>容器列表:<br><img src="/img/remote/1460000020117964?w=1697&h=879" alt="" title=""></p>
<p>用户管理:<br><img src="/img/remote/1460000020117965?w=1693&h=873" alt="" title=""></p>
</li>
</ol>
<h2>dnnmmp其他使用</h2>
<p><a href="https://link.segmentfault.com/?enc=SepLU7Gzntj5EPQ4BHuuYg%3D%3D.riPlQyRRYqYy33M%2Bzeb2ogxNncgHO6k5DwPQPcDg2TI%3D" rel="nofollow">官网</a></p>
nodejs版,麻将智能机器人出牌算法
https://segmentfault.com/a/1190000020096815
2019-08-16T17:11:13+08:00
2019-08-16T17:11:13+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<h2>nodejs版,麻将智能机器人出牌算法。</h2>
<h3>简述</h3>
<p>麻将,起源于中国,粤港澳及闽南地区俗称麻雀,<br><br>由中国古人发明的博弈游戏,娱乐用具,一般用竹子、骨头或塑料制成的小长方块,上面刻有花纹或字样,<br><br>北方麻将每副136张,南方麻将多八个花牌,分别是春夏秋冬,梅竹兰菊,共计144张。<br></p>
<h3>项目</h3>
<p>请加星收藏仓库地址,方便以后学习使用。</p>
<p><a href="https://link.segmentfault.com/?enc=cP1x4S2Ew%2F4V%2BqOjUfAqow%3D%3D.zoQQSKu6geOEklnTif2qd6jJB2i6OplnVQUEZU3k6Or32eis9Xjs02pW9YKdVdYc" rel="nofollow">github地址</a></p>
<h3>使用方法</h3>
<pre><code>
# 下载
git clone https://github.com/wallace5303/nodejs-game.git
# 进入文件
cd nodejs-game/aiTable
# 安装
npm install
# 运行
node demo.js</code></pre>
<h5>demo内容</h5>
<pre><code># 麻将牌所有对应的数字id,请查看配置文件:cardConfig.json
const outCardLogic = require('./outCardLogic');
// 手牌 1万,2万,3万,8万,8万,1条,5条
const cards = ['31' , '32', '33', '38', '38', '41', '45'];
// 选出一张最优牌
var outLogic = new outCardLogic();
// 第二个参数为万能牌,可选。
var card = outLogic.outAI(cards);
console.log("选出的最优牌是:%j", card); // 41(1条)</code></pre>
<h3>分类</h3>
<h5>字牌(合计28张)</h5>
<ul>
<li>风牌:东、南、西、北,各4张,共16张。</li>
<li>箭牌:中、发、白,各4张,共12张。</li>
</ul>
<h5>花牌(合计8张)</h5>
<ul>
<li>春、夏、秋、冬,梅、兰、竹、菊,各一张,共8张。</li>
<li>注:这种牌很少种类的麻将会用到。</li>
</ul>
<h5>序数牌(合计108张)</h5>
<ul>
<li>万子牌:从一万至九万,各4张,共36张。</li>
<li>筒子牌:从一筒至九筒,各4张,共36张。也有的地方称为饼,从一饼到九饼。</li>
<li>索子牌:从一索至九索,各4张,共36张。也有的地方称为条,从一条到九条。</li>
</ul>
<h3>相关术语</h3>
<p>麻将应对的五种标准状态,是“吃”、“碰”、“杠”、“听”、“胡”。在正式比赛中,五种状态的官方语言都是汉语,包括国际比赛。</p>
<ul>
<li>吃:上家打出牌,与下家的牌正好组成一副顺子,他就可以吃。</li>
<li>碰:其他人打出一张牌,自己手中有两张相同的牌正好组成一副刻子,他就可以碰。</li>
<li>杠:其他人打出一张牌,自己手中有三张相同的牌,即可杠牌,称为明杠,倒下这个杠,再到排尾抓一张牌,将手中不需要的一张牌打出。手中有三张相同的牌,又抓到一张相同的牌,称为暗杠,扣下,别人不知道是啥牌,再到排尾抓一张牌,将手中不需要的一张牌打出。“明杠”比“吃”优先,如果你要杠的牌刚好是出牌方下家要吃的牌,则吃牌失败,杠牌成功。</li>
<li>听:当你将你手中的牌都凑成了有用的牌,只需再加上最后一张便可和牌,你就可以进入听牌的阶段,报听后不能吃、碰、杠,且只能打出本轮摸到的牌。</li>
<li>和:(读音:hú,ㄏㄨ)当最终牌型满足m<em>AAA+n</em>ABC+DD(m、n可以为0),即可和牌(少数特殊牌型除外)。四位玩家谁先和牌谁为胜利,得分由底分乘上番数。具体视比赛详细规则而定。</li>
</ul>
<h3>牌型术语</h3>
<ul>
<li>连子:一万二万三万<br>
</li>
<li>刻子:一筒一筒一筒<br>
</li>
<li>将:一条一条<br>
</li>
</ul>
<h3>胡牌公式</h3>
<ul>
<li>N×连子 + M×刻子 + 1×将</li>
<li>N>=0, M>=0<br>
</li>
</ul>
<h3>鬼牌</h3>
<p>鬼牌的定义就是能够变成任意牌的牌,也叫万能牌。<br></p>
<h3>案例分析</h3>
<p>举个栗子,看看真实的人是怎么思考出牌的:</p>
<ul>
<li>1万2万3万5条,打5条<br>
</li>
<li>1万2万3万1条1条6条,打6条<br>
</li>
</ul>
<h3>解决思路</h3>
<p>从上面的例子可以看出来,打牌的过程,其实就是打完之后的牌面,胡牌概率最高。<br><br>所以,算法变成了评估牌面积分的算法,越高说明牌越好,也说明这副牌可以胡的概率更高。<br></p>
<h3>评估方法</h3>
<p>为了评价这副牌的积分,也就是胡牌的概率,我们可以给他再摸N张牌,看看胡牌情况。<br>参考如下示例,可以很直观得出牌面积分:1筒2筒3筒 > 1筒2筒3筒2条3条 > 1筒2筒3筒2条。</p>
<ul><li>1筒2筒3筒<br>
</li></ul>
<p>已经胡了,胡牌概率为1</p>
<ul><li>1筒2筒3筒2条<br>
</li></ul>
<p>只摸1张牌,那么只有当摸2条的时候,才会赢,胡牌概率为1/9*摸条的概率,有将。</p>
<ul><li>1筒2筒3筒2条3条<br>
</li></ul>
<p>只摸1张牌,那么只有当摸1条4条的时候,才会赢,胡牌概率为2/9*摸条的概率,无将。</p>
<h3>表格生成</h3>
<p>有了评估方法后,我们只需要对每个花色的手牌,分配N张牌给他,然后计算胡牌概率,就可以知道牌面积分。<br><br>不过考虑到计算量太大,所以我们可使用查表法,提前计算好,方便快速查找。<br></p>
<h3>出牌算法</h3>
<ul>
<li>遍历手上的非鬼牌,计算排除掉这张牌后的牌面积分最大值,这张牌就是要打的牌。</li>
<li>如果打出能听牌了,就取一个听牌最多的牌打出去。</li>
</ul>
Docker入门练手项目,运行一个2048游戏
https://segmentfault.com/a/1190000020082895
2019-08-15T15:33:46+08:00
2019-08-15T15:33:46+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
4
<p>dnnmmp集成环境中,之前一直在增加软件功能,这次想试试运行一个web项目,最后看起来还不错。</p>
<p>让我们开始吧!</p>
<h3>安装2048游戏</h3>
<p>安装步骤如下:</p>
<ol>
<li>帮忙加个星呗:<p><a href="https://link.segmentfault.com/?enc=aE53X16lnR8xqzCkgcqTvg%3D%3D.5z6xMbp85Dy387onxiq4WLzyMHzKVS4NKFpSvw2mua30O%2FbcGRRkzhjmd9%2BQgVfR" rel="nofollow">点击:GitHub</a></p>
</li>
<li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。<br><a href="https://link.segmentfault.com/?enc=1W%2BfhIZnytTrJujD6%2BtBZw%3D%3D.ej%2BLJKkeqKCOi8nrcXmUEei99E6ESUz5monTzWkSqetVxtmunIPl1XkEzuA2kWYZ" rel="nofollow">附录1:docker安装</a>
</li>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>启动运行:</p>
<pre><code class="bash">$ cd dnnmmp
# 后台运行
$ docker-compose up -d game_2048
# 停止运行
$ docker-compose stop game_2048
# 不玩了,可以删除容器,避免占用空间
$ docker-compose rm game_2048
</code></pre>
</li>
<li>
<p>开始玩游戏吧:</p>
<blockquote>在浏览器中访问:<a href="https://link.segmentfault.com/?enc=%2B9dXDlCFkycuGxEqu0nPZQ%3D%3D.sfseseWqM5wZszPJsVryB2%2BK%2BKaEJ25MebY7JHuCXVM%3D" rel="nofollow">http://localhost</a>:8001<p>玩法:键盘的上下左右键来控制。</p>
</blockquote>
<p>如图:<br><img src="/img/remote/1460000020082898?w=1429&h=933" alt="" title=""></p>
<p><img src="/img/remote/1460000020082899" alt="" title=""></p>
</li>
</ol>
想成为一名web开发者?学习Node.js而不是PHP
https://segmentfault.com/a/1190000020060654
2019-08-13T18:06:33+08:00
2019-08-13T18:06:33+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<p><strong>为了保证的可读性,本文采用意译而非直译</strong></p>
<p><img src="/img/bVbwkLS?w=700&h=466" alt="图片描述" title="图片描述"></p>
<p>我的学生们提出的一个最常见的问题是“你怎么在课程中教授Node.js而不是PHP?”;告诉他们:“相信我,我在这个行业工作了好多年”,那是不够的。所以,这是我在课程中包含Node.js的原因,以及为什么如果你想作为开发人员投资你的未来,你应该放弃PHP。虽然我以这两个为例,但在本文中,我将向您展示一个大的框架,用于确定您在开发人员职业生涯中应该学习的工具,编程语言,框架和库。</p>
<p>由于您作为开发人员的时间和资源有限,您必须决定投入时间以获得最大的投资回报。</p>
<p>现在,您应该问自己的问题:在知识,薪水和满意度方面,我作为开发人员在未来的职业生涯中,我可以投入多少时间和精力进行学习?</p>
<p>这并不意味着选择最简单的路径。这意味着选择能够让您在未来许多年保持相关性和竞争力的工具,同时培养您成为高级开发人员的技能。</p>
<p>在本文的结论中,如果您想成为使用下面相同分析的Web开发人员,您将在2019年找到我推荐的所有技术。如果你不耐烦,你可以跳到最后。<br>我们将在这篇文章中使用两种类型的分析:工作前景分析和技术分析。开始了:</p>
<p><img src="/img/bVbwkNy?w=700&h=299" alt="图片描述" title="图片描述"></p>
<h3>1. Node.js与PHP - 工作前景分析</h3>
<p>我们将使用Stackoverflow开发人员调查和LinkedIn进行此分析。我们还将只关注与Web开发相关的技术。<br>人气:<br>JavaScript连续第五年成为最常用的编程语言。Python的使用在五年内第一次超越了PHP。Node.js在哪里?Node.js是一个javascript运行时。在非技术性说法:Node.js是一种使用Javascript的方式,就像你可以在服务器端使用PHP一样。现在,将Node.js视为Javascript。</p>
<p><img src="/img/bVbwkNI?w=700&h=432" alt="图片描述" title="图片描述"></p>
<p><img src="/img/bVbwkNQ?w=700&h=458" alt="图片描述" title="图片描述"></p>
<p>正如您所看到的,Node.js和Javascript排名靠前,而PHP则不那么受欢迎。<br>在Stackoverflow在开发者调查中收集数据的五年中,他们看到Javascript和Node.js等语言越来越流行,而PHP等语言的使用一直在缩小:</p>
<p><img src="/img/bVbwkN0?w=700&h=444" alt="图片描述" title="图片描述"></p>
<hr>
<p>React是开发者中最受欢迎的,然而,Node.js是最受欢迎和最受欢迎的:</p>
<p><img src="/img/bVbwkN6?w=700&h=459" alt="图片描述" title="图片描述"></p>
<h2><img src="/img/bVbwkN0?w=700&h=444" alt="图片描述" title="图片描述"></h2>
<p>薪金和机会:<br>使用下面图表中蓝线下方列出的语言的开发人员,例如Go,Rust和Clojure,考虑到他们拥有多少经验,他们将获得更多报酬。然而,使用像PHP这样的蓝线以下语言的开发人员,即使有多年的经验,也会得到较少的报酬。此图表中圆圈的大小表示与其他开发人员相比,使用该语言的开发人员数量。PHP显然似乎通过他们拥有的经验数量来越来越少地奖励开发人员。</p>
<h2><img src="/img/bVbwkOp?w=700&h=498" alt="图片描述" title="图片描述"></h2>
<p>在LinkedIn Jobs上,您可以看到Node.js开发人员在全球范围内的职位发布远远超过PHP开发人员近10,000。尽管事实上Node.js是一种比PHP 更年轻的技术,并且事实上PHP被大量使用Wordpress,它支持互联网上所有网站的30%。</p>
<p><img src="/img/bVbwkOT?w=700&h=123" alt="图片描述" title="图片描述"></p>
<hr>
<p>最后,你可以看到各地区技术的平均工资(我没有包括下面的全球标签,因为PHP甚至没有在那里制作):</p>
<p><img src="/img/bVbwkO2?w=700&h=793" alt="图片描述" title="图片描述"></p>
<p>同样,我们不是在这里抨击PHP。我们只是看数字来决定选择学习什么。显然,它的排名始终低于其他技术,如Javascript和Node.js.<br>stackoverflow得出了2018年调查的结果:PHP下降的比较多。</p>
<hr>
<p>结果:<br>PHP的受欢迎程度正在下降,而就业市场和Node.js的普及正在增长。总体而言,PHP开发人员的报酬显着低于其他开发人员,而且趋势似乎在不断扩大。</p>
<hr>
<h3>2. Node.js与PHP - 技术分析</h3>
<p>让我们来看看每种技术的优缺点。</p>
<blockquote>Node.js优点:</blockquote>
<ul>
<li>特别适用于需要客户端和服务器之间实时通信的应用程序。像socket.io这样的工具可以很容易地构建聊天应用程序之类的东西 这些相同的功能使Node.js适用于处理来自IoT设备(物联网)和单页应用程序(SPA)的数据的应用程序,这些应用程序现在非常普遍。</li>
<li>使用JSON进行本机序列化和反序列化,可以很好地处理Web上的AJAX请求。</li>
<li>非常适用于具有非阻塞输入/输出的事件驱动应用程序(I / O是信息处理系统(如计算机)与外部世界之间的通信,可能是人或其他信息处理系统(如数据库)</li>
<li>你学习Javascript,你学习Node.js. 您不需要学习PHP等其他语言。这意味着你可以花费你所有的努力来学习Javascript并掌握它。您只需一种语言就可以编写前端和后端代码。</li>
<li>许多流行的客户端框架,如React,Vue和Angular都是用JavaScript编写的,JavaScript是现代浏览器的主要语言。在使用Node.js服务器端时,您可以在应用程序开发堆栈中获得一种脚本语言的所有好处。在前端和后端使用相同的语言非常适合可维护性:它使所有团队成员之间的工作更容易为您的应用程序,因为前端和后端开发人员使用相同的JavaScript数据结构,函数和语言约定。</li>
<li>当从客户端一次处理大量请求时,单线程事件驱动系统非常快。</li>
<li>通过NPM可以为客户端和服务器端访问不断增长的第三方库和软件包,以及用于Web开发的命令行工具。此外,其中大多数都托管在GitHub上,您可以在其中报告问题,或者您可以自己分叉代码以进行自定义。</li>
<li>它已成为运行Javascript相关工具和其他Web开发人员相关工具的标准环境,包括任务运行器,minifiers,linters,格式化程序,预处理器,捆绑器和分析处理器。</li>
<li>许多新的API和服务(如AWS Lambda)本机支持。</li>
<li>我们获得了V8的所有性能提升,这是Node.js构建在其上的Google JavaScript解释器。由于Google的工程设计不断提高V8的性能,Node.js免费获得此开发的好处。</li>
</ul>
<hr>
<blockquote>Node.js缺点:</blockquote>
<ul>
<li>上面提到的NPM包可能会膨胀您的代码,可能不安全,并且很难找到哪些包是好的,因为有很多选项(查看下载和GitHub统计是解决此问题的一种方法)。</li>
<li>使用Node.js和npm包构建服务器的方法很多。这使新开发人员难以接受。</li>
<li>对于依赖大量CPU消耗代码的服务器(即图像处理或排序等繁重算法)而言,这并不理想。通常,任何非I / O都可以被认为是CPU消耗代码。在这种情况下,通常多线程服务器环境比Node.js更好(解决方案:如果需要,可以将代码的CPU密集部分交给用C编写的程序)。</li>
<li>节点不使用底层系统或机器的所有核心。您必须自己编写逻辑才能使用多核处理器。这可以通过多种方式实现,但它需要一些额外的工作(当您能够最大化系统的CPU使用率时,这将成为专业人员)。</li>
</ul>
<blockquote>Node.js对比结果:</blockquote>
<ul>
<li>Node.js非常适合具有大量并发连接的应用程序,每个请求只需要很少的CPU周期。这使得它非常适用于当前互联网上的许多应用,如SPA和实时应用。</li>
<li>使用JavaScript的内置异步处理,可以创建高度可扩展的服务器端代码,最大限度地利用单个CPU和内存,同时能够处理比传统多线程服务器更多的并发请求。</li>
<li>Node.js附带很少的依赖项,规则和指南,允许开发人员以他们想要的方式自由和创造性地开发他们的应用程序。开发人员可以为他们的项目选择最佳架构,设计模式,模块和功能,同时通过NPM从社区中获得所有好处。</li>
</ul>
<hr>
<blockquote>PHP优点:</blockquote>
<ul>
<li>因年龄大而强大的社区。</li>
<li>PHP有一个强大的代码库,包括用于构建网站的流行平台(即WordPress,Joomla,Drupal)。CMS(内容管理系统),如WordPress,可以在几分钟内轻松部署博客或电子商务网站,并允许非开发人员轻松定制它们。</li>
<li>使用非开发人员工具更容易设置,更适合不需要了解SSH和Linux服务器的个人或小公司。许多PHP应用程序(即cPanel)由基本托管平台提供,可以一键安装。</li>
<li>与其他通用编程语言不同,PHP是专门为Web设计的。PHP提供了一个出色的服务器端解决方案,因为所有页面都可以在服务器上轻松生成和呈现,因此无需在浏览器中使用JavaScript。如果您想避免在客户端运送太多代码,这非常有用。Node.js也能够做到这一点,但解决方案并不那么简单。</li>
<li>PHP7和HHVM(由facebook支持)开发在PHP性能方面有所改进......但最近HHVM出现了一些坏消息。</li>
</ul>
<blockquote>PHP缺点:</blockquote>
<ul>
<li>PHP仅用于后端。这意味着如果您想在客户端工作或被视为完整堆栈开发人员,您仍然需要学习Javascript。</li>
<li>使用PHP,重型服务器端呈现以及对服务器生成和呈现页面的大量请求对于单页应用程序来说不是一个好选择。</li>
<li>每个活动客户端都会占用一个服务器进程。不适合拥有许多客户端连接的应用。</li>
<li>与Node.js相比,对AWS Lambda等新API和服务的PHP本机支持有限。</li>
<li>它遵循传统的客户端 - 服务器模型,其中每个页面请求都启动应用程序,数据库连接和HTML呈现。与使用永久运行并且只需要初始化一次的Node.js应用程序相比,这使得PHP在浏览网站时变慢。因此,Node.js更适合网络与HTML5,AJAX和WebSockets一起发展的新方向。</li>
</ul>
<blockquote>PHP总结:</blockquote>
<ul><li>PHP周围的社区很容易学习。 对于博客或新闻网站等标准化解决方案而言,它是一个不错的选择。它具有Wordpress的强大功能,这是最流行的CMS(内容管理系统),它允许您创建可自定义的博客,而无需太多编码。但是,在这种情况下更简单并不是一个好的质量。学习技术越容易,有人进入现场并增加供应池就越容易,而且你需要为服务收取的费用越低。</li></ul>
<hr>
<h3>结论</h3>
<p>随着Wordpress的普及,PHP是Web 1.0时代的顶级语言之一。Node.js于2009年推出,技术上不是语言,而是Javascript的运行时环境。它是更年轻的Web开发的冠军,更适合构建基于事件的,数据驱动的,I / O繁重的应用程序,您在Web 2.0时代会遇到更多。</p>
<p>特别是,Node.js的异步和基于事件的体系结构使其非常适合实时应用程序,例如消息传递和协作应用程序,其中许多请求同时发生,并且客户端和服务器之间有很多来回。没有Wordpress不能活下去?好吧,Node.js有自己的CMS,叫做Keystone.js很棒。</p>
<p>总会有权衡。永远不会有一种技术可以帮助您解决所有问题并使您免于工作过时。我们所能做的最好的事情就是分析我们的选择,并选择一个具有最佳投资回报的选项。看看上面的工作前景分析和技术分析,我们可以看到一个明显的赢家。</p>
<p>我选择了Node.js.<br>虽然如果按照自己特定的方式使用所有技术都很棒,但我们生活在一个信息如此丰富的世界,我们必须限制我们可以关注和深入学习的数量。<br>如果你想在2018年成为一个完整的堆栈web开发人员,我建议你学习:</p>
<ul>
<li>HTML5</li>
<li>CSS3</li>
<li>Javascript</li>
<li>React.js</li>
<li>Node.js + Express.js</li>
<li>PostgreSQL</li>
<li>和其他一些......</li>
</ul>
Docker命令详解之run
https://segmentfault.com/a/1190000020023222
2019-08-09T15:34:45+08:00
2019-08-09T15:34:45+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>RUN 命令</h2>
<p>RUN 指令是用来执行命令行命令的,是最常用的指令之一。</p>
<p>命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]<br>意思为:通过run命令创建一个新的容器</p>
<p>常用选项说明:</p>
<blockquote>-d, --detach=false, 指定容器运行于前台还是后台,默认为false</blockquote>
<blockquote>-i, --interactive=false, 打开STDIN,用于控制台交互</blockquote>
<blockquote>-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false</blockquote>
<blockquote>-u, --user="", 指定容器的用户</blockquote>
<blockquote>-a, --attach=[], 登录容器(必须是以docker run -d启动的容器)</blockquote>
<blockquote>-w, --workdir="", 指定容器的工作目录</blockquote>
<blockquote>-c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用</blockquote>
<blockquote>-e, --env=[], 指定环境变量,容器中可以使用该环境变量</blockquote>
<blockquote>-m, --memory="", 指定容器的内存上限</blockquote>
<blockquote>-P, --publish-all=false, 指定容器暴露的端口</blockquote>
<blockquote>-p, --publish=[], 指定容器暴露的端口</blockquote>
<blockquote>-h, --hostname="", 指定容器的主机名</blockquote>
<blockquote>-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录</blockquote>
<blockquote>--volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录</blockquote>
<blockquote>--cap-add=[], 添加权限,权限清单详见:<a href="https://link.segmentfault.com/?enc=eSkiepbBuGEtMuSTjWYIDg%3D%3D.jPl5JIRYozKNUx6x2mGCvoy74WfFWQF6%2Fi8w5%2BejLSOgwqCrzI4wgXfB1Ra9UZ3E" rel="nofollow">http://linux.die.net/man/7/ca...</a>
</blockquote>
<blockquote>--cap-drop=[], 删除权限,权限清单详见:<a href="https://link.segmentfault.com/?enc=25D5KGd6sVkxpeVjzqFNFA%3D%3D.BRST%2BW63Mx5RCbHZ3NPD6p0AkMZFzqXcttyX%2FCmVhtcUHMWtzt3p89nkKZGHSpYd" rel="nofollow">http://linux.die.net/man/7/ca...</a>
</blockquote>
<blockquote>--cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法</blockquote>
<blockquote>--cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU</blockquote>
<blockquote>--device=[], 添加主机设备给容器,相当于设备直通</blockquote>
<blockquote>--dns=[], 指定容器的dns服务器</blockquote>
<blockquote>--dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件</blockquote>
<blockquote>--entrypoint="", 覆盖image的入口点</blockquote>
<blockquote>--env-file=[], 指定环境变量文件,文件格式为每行一个环境变量</blockquote>
<blockquote>--expose=[], 指定容器暴露的端口,即修改镜像的暴露端口</blockquote>
<blockquote>--link=[], 指定容器间的关联,使用其他容器的IP、env等信息</blockquote>
<blockquote>--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-drive</blockquote>
<blockquote>--name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字</blockquote>
<blockquote>--net="bridge", 容器网络设置:</blockquote>
<pre><code> bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
</code></pre>
<blockquote>--privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities</blockquote>
<blockquote>--restart="no", 指定容器停止后的重启策略:</blockquote>
<pre><code> no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
</code></pre>
<blockquote>--rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)</blockquote>
<blockquote>--sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理</blockquote>
Dnnmmp1.2.0更新,集成golang环境,想学习go的同学请进
https://segmentfault.com/a/1190000020020140
2019-08-09T11:57:24+08:00
2019-08-09T11:57:24+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h3>Dnnmmp是什么?</h3>
<p> 它是基于docker的开发环境,具有lnmp,lamp,mac系统下的XAMPP、MAMP一样的功能。但它是未来开发者的趋势,因为基于docker,使你本机电脑有云开发的效果。</p>
<h3>它能做什么?</h3>
<p> 目前集成了 nodejs、PHP、mysql、MongoDB、redis、nginx、go;PHP开发者、nodejs开发者、前端、运维、go可以直接使用。效率提高非常多。</p>
<h3>它有什么优势?</h3>
<p> 一键安装所有程序,或者单独使用某个程序;方便版本切换,还有它是基于docker,一点也不影响本机环境,让程序员的整个生涯都不再需要为环境困扰。</p>
<p>今天加入了对golang的支持,希望学习go的同学,但又不想破坏本地的环境,可以试一下。</p>
<blockquote>
<a href="https://link.segmentfault.com/?enc=P7HKF4Xr46p7oj5vbuLpcg%3D%3D.VCg57SgvaKv31ayu6lE8XzOuYW1TtY06fzw9wikyXu9O%2FdE5%2B%2F2ef%2Bk3pZilV0gO" rel="nofollow">github地址</a><p><a href="https://link.segmentfault.com/?enc=OVi4MNuaKa6t%2Fs3y4iVfpw%3D%3D.O7ChNO8Z%2BXSAiXLauEReKthveJ8O0iGSio4y2DBJxao8es7usiBoKyS837aPDjvL" rel="nofollow">官方文档</a></p>
</blockquote>
<h3>方法</h3>
<p>安装步骤如下:</p>
<ol>
<li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。<br><a href="https://link.segmentfault.com/?enc=3aQWgZgzn9AxKLat4EM1Rw%3D%3D.%2B4Xam%2B27JY31GFRgV1nKoAFbJUAvLpyu7Kad0dif9b4gK2fJRJhHaf5H7D1Vuv5m0vP7o97mCrwc4xGeyEYc66kh0QIc0PwEvHK0MOrZC70ttOUYsH5mj07vaMjql0Yr" rel="nofollow">附录1:docker安装</a>
</li>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>构建并启动:</p>
<pre><code class="bash">$ cd dnnmmp
# 构建
$ docker-compose build go</code></pre>
<blockquote>查看镜像:<code>$ docker image ls</code>
</blockquote>
</li>
<li>
<p>进入容器查看信息</p>
<pre><code class="bash"># 必须进入GO工作空间
cd ./www/gowork
docker run -it --rm -v $PWD:/go:rw --privileged dnnmmp_go /bin/sh
# 查看版本
go version
# 查看环境变量信息
go env</code></pre>
<blockquote>PS:<a href="https://link.segmentfault.com/?enc=6gsNB905iBT%2Fym0x1IvN0Q%3D%3D.f4VyIHrRyKYD2hZOM1%2BERG%2FU6txuL5w35oa5Mmn7t%2FUswUTwWUzdteOEV%2F9jmSHb" rel="nofollow">go的一些变量说明</a>
</blockquote>
</li>
</ol>
<h3>编写hello world</h3>
<ol><li>
<p>进入go的项目目录</p>
<pre><code class="bash"># Go代码必须放在工作空间内
cd ./www/gowork
# 编辑文件
vim hello.go
# 添加内容
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
# 进入容器运行
docker run -it --rm -v $PWD:/go:rw --privileged dnnmmp_go /bin/sh
go run hello.go
Hello, World!</code></pre>
<blockquote>需要深入的学习go,请点击<a href="https://link.segmentfault.com/?enc=AuGE6mRE8tsANI8zb5OlaA%3D%3D.jw2gXcCRuqxVHuWE5xgIhoDoC2lJxsJGxFAOtFw7wXq73%2BLTEYoMIpueLvWxAZqH" rel="nofollow">go编程</a>
</blockquote>
</li></ol>
nginx配置文件说明
https://segmentfault.com/a/1190000020008855
2019-08-08T14:52:30+08:00
2019-08-08T14:52:30+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
4
<p>文件:nginx.conf</p>
<pre><code class="bash">#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#charset utf-8; #默认编码
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#服务器名字的hash表大小
server_names_hash_bucket_size 128;
#上传文件大小限制
client_header_buffer_size 32k;
#设定请求缓
large_client_header_buffers 4 64k;
#设定请求缓
client_max_body_size 8m;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.nginx.cn访问
server_name www.nginx.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}</code></pre>
前端与后端同学都需要掌握的技术文档(或博客)搭建
https://segmentfault.com/a/1190000020008597
2019-08-08T14:34:14+08:00
2019-08-08T14:34:14+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<blockquote>当你写完一个开源项目或者一篇博客文章,是否想要有个的页面来呈现它?</blockquote>
<p>如图:</p>
<p><img src="/img/remote/1460000020008600?w=1568&h=864" alt="" title=""></p>
<p>那我们开始吧</p>
<h2>使用vuepress搭建</h2>
<p><a href="https://link.segmentfault.com/?enc=vj3C87as41xXhhguEnBBrQ%3D%3D.0Zv%2BDQYA8%2FNdHA0L2%2FOyBLF6j0nQIyT10yi3%2F36%2BKzs%3D" rel="nofollow">vuepress官网</a></p>
<h2>安装运行</h2>
<p>1.使用Yarn和npm,Node.js版本>=8。</p>
<pre><code>npm install -g vuepress</code></pre>
<p>2.创建项目目录</p>
<pre><code>mkdir demo
cd demo</code></pre>
<p>3.初始化项目</p>
<pre><code>npm init -y</code></pre>
<p>4.在 package.json 里添加:</p>
<pre><code> "scripts": {
"dev": "vuepress dev docs",
"build": "vuepress build docs"
}</code></pre>
<p>5.创建文档目录与文件,结构如下:</p>
<pre><code>demo
├─── docs
│ └── .vuepress // 配置目录
│ │ ├── public // 静态资源
│ │ ├──── img
│ │ ├────── bg.ico // 图标
│ │ ├────── logo.jpg // 首页logo
│ │ └── config.js // vuepress配置文件
│ ├── 随笔 // 随笔
│ │ ├── suibi // 一级目录
│ │ │ ├── test.md // 文章
│ └── README.md // 博客首页
└── package.json</code></pre>
<p>6.运行</p>
<pre><code>npm run dev</code></pre>
<p>7.浏览器访问:<a href="https://link.segmentfault.com/?enc=mbFwMokoF6UyPLl106y4VA%3D%3D.BRHa86xcI3zVeWm7BOcYBESCDy0kmFSpA9tBQ5P9PxI%3D" rel="nofollow">http://localhost</a>:8080/,就可以看到效果了。<br>多放几张图:<br><img src="/img/remote/1460000020008601" alt="" title=""></p>
<p><img src="/img/remote/1460000020008602" alt="" title=""></p>
<p>8.还可以构建生成html:</p>
<pre><code>npm run build</code></pre>
<p>9.config.js文件例子</p>
<pre><code class="bash">module.exports = {
title: 'hello',
description: '技术',
head: [ // 注入到当前页面的 HTML <head> 中的标签
['meta', { 'http-quiv': 'pragma', cotent: 'no-cache'}],
['meta', { 'http-quiv': 'pragma', cotent: 'no-cache,must-revalidate'}],
['meta', { 'http-quiv': 'expires', cotent: '0'}]
],
serviceWorker: true, // 是否开启 PWA
base: '/', // 部署到github相关的配置
markdown: {
lineNumbers: true // 代码块是否显示行号
},
themeConfig: {
lastUpdated: '更新于',
sidebarDepth: 3,
displayAllHeaders: true,
nav: [
{ text: '导航', link: 'http://www.kaka996.com' },
{
text: 'dnnmmp',
items: [
{
text: 'dnnmmp集成环境',
items: [
{ text: '介绍', link: '/dnnmmp_introduce/' },
{ text: '安装', link: '/dnnmmp_install/' },
{ text: '命令行使用', link: '/dnnmmp_command/' },
{ text: '日志', link: '/dnnmmp_log/' },
{ text: '附录', link: '/dnnmmp_appendix/' },
]
}
]
},
{
text: '了解更多',
items: [
{ text: '个人信息', link: '/pages_about/' },
]
}
],
sidebar:{
'/dnnmmp/': [
{
title: '介绍',
collapsable: false,
children: [
'introduce/介绍',
]
},
{
title: '安装',
collapsable: false,
children: [
'install/一键安装',
'install/单独安装PHP',
'install/单独安装Nodejs',
'install/单独安装Mongodb',
'install/单独安装Mysql',
'install/单独安装Nginx',
'install/单独安装Redis',
//'install/单独安装go',
]
},
{
title: '命令行使用',
collapsable: false,
children: [
'command/命令行使用',
]
},
{
title: '日志',
collapsable: false,
children: [
'log/日志',
]
},
{
title: '附录',
collapsable: false,
children: [
'appendix/附录',
]
}
]
},
}
};</code></pre>
<p>10.浏览作者的网站效果:<br><a href="https://link.segmentfault.com/?enc=NLyOe8BSOGBflH%2FQcCBbUQ%3D%3D.cyalgOyTMWNtMcde%2FSZm6UybAN8kugb44%2BQUPzvDDKU%3D" rel="nofollow">http://blog.kaka996.com/</a></p>
宿主机nginx与docker的PHP搭配使用
https://segmentfault.com/a/1190000019985705
2019-08-06T14:22:29+08:00
2019-08-06T14:22:29+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<blockquote>主要差异在于本地nginx配置</blockquote>
<p>因为php-fpm的服务由docker提供, 那么就修改nginx中PHP相关的内容。</p>
<p>注意:在docker中php文件的目录是: /var/www/html, 而(我)本地目录是:/data/www/项目名。</p>
<p>原先的配置</p>
<pre><code>root /data/www/项目名;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 或者 docker提供的地址:172.17.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}</code></pre>
<p>将 root 这行, 修改为:</p>
<pre><code>root /var/www/html/项目名 # 即docker中php加载的项目路径</code></pre>
<p>测试Ok!</p>
开发工具篇--最好用的git图形化工具sourcetree
https://segmentfault.com/a/1190000019952720
2019-08-02T12:12:57+08:00
2019-08-02T12:12:57+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<pre><code>接下来几篇会陆续出:
开发工具篇
nodejs篇
php篇
erlang篇
linux篇
redis篇
...
这样知识点就串联起来了,后续查看也方便
</code></pre>
<h3>1. 下载</h3>
<p><a href="https://link.segmentfault.com/?enc=N8XW061XTS0IU0T5xay33w%3D%3D.VTp%2FJ4%2BTTimZDVKtrRvS2UNPpMWe3x3Vk2VNcTdNjAE%3D" rel="nofollow">https://www.sourcetreeapp.com/</a></p>
<h3>2. 安装</h3>
<p><a href="https://link.segmentfault.com/?enc=Fl6FN6VCEb8yUdM53nC%2FMQ%3D%3D.YypOtkWieXkwtjPIYf2kRB96%2BduNa2Y1KDjuU8IuoAbDkWlMZJDFr6rslZpGrtoV" rel="nofollow">科学上网</a></p>
<h3>3. SSH配置</h3>
<p>软件启动后,如果需要和远程的Gitlab仓库进行交互,需要配置SourceTree的SSH配置。 <br>菜单栏中 : 工具 –> 选项 <br><img src="/img/bVbvSKX?w=1409&h=885" alt="图片描述" title="图片描述"></p>
<p>在如图所示红色框内,SSH秘钥设置是自己本地的秘钥。</p>
<h3>4. 常用的几个功能</h3>
<p>(1)克隆<br>远程仓库:<br><img src="/img/bVbvSLe?w=597&h=367" alt="图片描述" title="图片描述"></p>
<p>如下截图有 Local (本地)、Remote (远端)<br>如果要从远端直接Clone下来,选中Remote选项 —-> Clone选项。 得到如下截图:<br><img src="/img/bVbvSLf?w=1175&h=599" alt="图片描述" title="图片描述"></p>
<p>在第一个框内输入git的仓库地址,后面两个框内内容会自动识别,一个是代码的存储路径,一个是工程名,可以修改。<br>本地仓库:<br>如果git代码已经在本地,则可以使用本地仓库直接导入。<br><img src="/img/bVbvSLi?w=1757&h=397" alt="图片描述" title="图片描述"></p>
<p>无论远程 还是本地导入成功后界面如下:<br><img src="/img/bVbvSLk?w=1823&h=1042" alt="图片描述" title="图片描述"></p>
<p>上面方框代指本地分支,下面方框代码远程分支。直接双击分支名称,就可以进行分支之间的切换。</p>
<p>(2)新建分支<br>在开发的过程中,开发者如果要设计一个功能,一般都是从当前的开发分支上拉取一个新的本地分支。 假设当前的开发分支是dev-1.0.0, 那么开发者从dev-1.0.0拉取一个新的本地分支,假设分支名称为 dev-1.0.0-A。 创建步骤如下:<br><img src="/img/bVbvSLp?w=1702&h=577" alt="图片描述" title="图片描述"><br><img src="/img/bVbvSLs?w=933&h=488" alt="图片描述" title="图片描述"><br>从图的左侧红框可以看出,新分支dev-1.0.0-A 已经创建了。<br>开发者可以在改分支上进行开发了。另外一个开发者B,也可以同样的方式在本地创建一个开发分支dev-1.0.0-B。</p>
<p>(3)提交<br>在指定分支上进行开发后,需要进行代码提交。<br><img src="/img/bVbvSLw?w=1916&h=1036" alt="图片描述" title="图片描述"><br>点击标示1可以查看未提交的更改,如标示2所示,然后选中相应的文件,点击标示3,进行保存。<br><img src="/img/bVbvSLz?w=1828&h=1004" alt="图片描述" title="图片描述"><br>点击上图标示1 所示提交。会得到上图。在标示2中是这次修改的文件。 在标示3中填写上修改的评论。 然后在点击提交。</p>
<p>(4)推送<br>代码提交完成后,只是提交到了本地仓库,并没有推送到远程仓库。是否成功推送到远程服务器,可以直接登录gitlab网站查看。<br><img src="/img/bVbvSLC?w=1848&h=989" alt="图片描述" title="图片描述"><br>在sourceTree上,如果存在只提交没有推送的记录,在菜单栏的“推送”按钮处会有数字提示显示 。如下图所示:<br><img src="/img/bVbvSLD?w=523&h=116" alt="图片描述" title="图片描述"></p>
<p>(5)合并<br>本地分支dev-1.0.0-A 开发完成后,需要先合并到整个项目的当前分支 dev-1.0.0。 <br>如何进行分支合并操作呢? <br>如下图所示: 假设 分支 dev-1.0.0-A 合并到 dev-1.0.0 分支。 <br>步骤1: 切换到分支dev-1.0.0 <br>步骤2: 选中分支dev-1.0.0-A 然后点击右键 <br>步骤3 :在右键菜单栏中选中 “合并 dev-1.0.0-A至当前分支” <br>步骤4: 合并分支成功。确认dev-1.0.0-A分支的内容是否合并到dev-1.0.0<br><img src="/img/bVbvSLF?w=1481&h=893" alt="图片描述" title="图片描述"><br>分支合并后,在菜单栏“推送” 按钮处会有数字提示。提示大家需要把合并后的内容推送到服务器上去。 <br><img src="/img/bVbvSLG?w=1903&h=832" alt="图片描述" title="图片描述"></p>
<p>(6)分支删除<br>本地分支开发完后,如果需要删除它,可以按照如下操作进行。 切记,不要删除主分支和当前开发分支,自己本地的分支,可以删除。<br><img src="/img/bVbvSLL?w=1518&h=538" alt="图片描述" title="图片描述"><br>ps: 弹出的删除菜单框,注意类型。有本地类型和远端类型之分。</p>
<p>(7)获取 或 拉取<br>每次修改代码的时候,需要得到最新的代码。这时候就需要执行菜单栏的“获取”或者 “拉取”操作<br>“获取” 和 “拉取” 的区别:<br>“获取” : 从远程获取最新版本 到本地 不会自动合并 merge<br><img src="/img/bVbvSLV?w=1405&h=379" alt="图片描述" title="图片描述"><br>“拉取” : 从远程拉取最新版本 到本地 自动合并 merge<br><img src="/img/bVbvSLW?w=1743&h=596" alt="图片描述" title="图片描述"><br>ps: 所以一般选用 “拉取 ”, 因为省去了手动的merge操作。</p>
Git忽略文件不起作用解决方案
https://segmentfault.com/a/1190000019940160
2019-08-01T11:04:07+08:00
2019-08-01T11:04:07+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<p>通过配置.gitignore文件让git不在跟踪记录这些文件。 发现配置过的文件并没有生效,因为.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经纳入版本管理中,则修改.gitignore不会生效。解决办法就是先把本地缓存删除(改成未track状态),然后再提交”。</p>
<blockquote>操作如下:</blockquote>
<pre><code class="bash"> git rm -r --cached .
git add .
git commit -m "update .gitignore"</code></pre>
docker安装MongoDB
https://segmentfault.com/a/1190000019940099
2019-08-01T10:59:29+08:00
2019-08-01T10:59:29+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>docker安装mongodb</h2>
<p>使用dnnmmp单独安装mongodb的。</p>
<blockquote>软件地址:<a href="https://link.segmentfault.com/?enc=R8h0%2FD%2BSrfINhdx9a91P%2Bw%3D%3D.1mix%2FXk0qSWCU8gV6s2Msg30zNES1XT63bxLrsi94gVrf2h9faMYjrzF7JJ1uPZY" rel="nofollow">https://github.com/wallace530...</a>
</blockquote>
<p>安装步骤如下:</p>
<ol><li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。</li></ol>
<ul>
<li><a href="https://link.segmentfault.com/?enc=%2Bd1oaGprvPTCD8pzoH5cYg%3D%3D.r9UdKB894gqvtK33LO1Ijtmp936HoY1sXlIp%2BzGzG03QmXzR0XF%2Bz3180X77e4jl" rel="nofollow">docker安装</a></li>
<li><a href="https://link.segmentfault.com/?enc=7kKKnNnJ%2FFpMOkxYzrykNA%3D%3D.y%2Blwlomm6g92kFbqn1Hn0CT%2FDUj7PX7WCXQ1nmDpnuDhPiNIegfQpScMD%2Fw32KEh" rel="nofollow">docker-compose安装</a></li>
</ul>
<ol>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>构建并启动:</p>
<pre><code class="bash">$ cd dnnmmp
# 后台运行
$ docker-compose up -d mongodb</code></pre>
<blockquote>查看容器:<code>$ docker container ls</code>
</blockquote>
</li>
</ol>
docker安装nodejs
https://segmentfault.com/a/1190000019938504
2019-08-01T09:37:21+08:00
2019-08-01T09:37:21+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>docker安装php</h2>
<p>使用dnnmmp单独安装nodejs的。</p>
<blockquote>软件地址:<a href="https://link.segmentfault.com/?enc=1JKlMUHqtI3GrE0OeD4kwA%3D%3D.pgTxPjpm9%2FDJi7YculUDc4QyNCXDkc5DqnFZVI1Y4dl1E8pYpd2Z2w0BB4URfwO%2F" rel="nofollow">https://github.com/wallace530...</a>
</blockquote>
<p>安装步骤如下:</p>
<ol><li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。</li></ol>
<ul>
<li><a href="https://link.segmentfault.com/?enc=0X5kcf%2FntI4oMWYMOXfpzg%3D%3D.qRZJfWRO%2BWNFe7QvchhNKAraJryuxux0Yb6%2BnZtoLK3BOCMgSnuGnk1sU6F7S48S" rel="nofollow">docker安装</a></li>
<li><a href="https://link.segmentfault.com/?enc=tRcATPRl1Wg0lWAo1IpO9Q%3D%3D.k6GN1ai2h7EGGY%2Fam2d60PsVgNBLctaZAXCw%2BJZh4MnK28woCSeO310iB9qt71QN" rel="nofollow">docker-compose安装</a></li>
</ul>
<ol>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>构建并启动:</p>
<pre><code class="bash">$ cd dnnmmp
# 构建
$ docker-compose up -d node
</code></pre>
<blockquote>查看容器:<code>$ docker container ls -a</code>
</blockquote>
</li>
<li>
<p>命令行使用</p>
<blockquote>编辑 <code>~/.bashrc(或 ~/.zshrc)</code>,并在行尾添加</blockquote>
<pre><code class="bash"> # 如果电脑上已经安装过软件,请更换函数名称
node () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--volume $PWD:/var/www/html:rw \
--workdir /var/www/html \
dnnmmp_node node "$@"
}
npm () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--volume $PWD:/var/www/html:rw \
--workdir /var/www/html \
dnnmmp_node npm "$@"
}</code></pre>
<blockquote>(3)让修改的内容生效</blockquote>
<pre><code>$ source ~/.bashrc(或 ~/.zshrc)</code></pre>
<blockquote>(4)查看版本信息</blockquote>
<pre><code>$ node -v
v10.16.0
$ npm -v
6.9.0</code></pre>
</li>
</ol>
vim命令大全(建议收藏)
https://segmentfault.com/a/1190000019929567
2019-07-31T12:41:39+08:00
2019-07-31T12:41:39+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<h2>vim命令大全</h2>
<blockquote>命令历史</blockquote>
<p>以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。</p>
<blockquote>启动vim</blockquote>
<p>在命令行窗口中输入以下命令即可<br>vim 直接启动vim<br>vim filename 打开vim并创建名为filename的文件</p>
<blockquote>文件命令</blockquote>
<p>打开单个文件<br>vim file<br>同时打开多个文件<br>vim file1 file2 file3 ...<br>在vim窗口中打开一个新文件<br>:open file<br>在新窗口中打开文件<br>:split file<br>切换到下一个文件<br>:bn<br>切换到上一个文件<br>:bp<br>查看当前打开的文件列表,当前正在编辑的文件会用[]括起来。<br>:args<br>打开远程文件,比如ftp或者share folder<br>:e ftp://192.168.10.76/abc.txt<br>:e \qadrivetest1.txt</p>
<blockquote>vim的模式</blockquote>
<p>正常模式(按Esc或Ctrl+[进入) 左下角显示文件名或为空<br>插入模式(按i键进入) 左下角显示--INSERT--<br>可视模式(不知道如何进入) 左下角显示--VISUAL--</p>
<blockquote>导航命令</blockquote>
<p>% 括号匹配<br>插入命令<br>i 在当前位置生前插入<br>I 在当前行首插入<br>a 在当前位置后插入<br>A 在当前行尾插入<br>o 在当前行之后插入一行<br>O 在当前行之前插入一行</p>
<blockquote>查找命令</blockquote>
<p>/text 查找text,按n健查找下一个,按N健查找前一个。<br>?text 查找text,反向查找,按n健查找下一个,按N健查找前一个。<br>vim中有一些特殊字符在查找时需要转义 .*[]^%/?~$<br>:set ignorecase 忽略大小写的查找<br>:set noignorecase 不忽略大小写的查找<br>查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上,按*或#键即可以该单词进行搜索,相当于/搜索。而#命令相当于?搜索。<br>:set hlsearch 高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配。<br>:set nohlsearch 关闭高亮搜索显示<br>:nohlsearch 关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮。<br>:set incsearch 逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。<br>:set wrapscan 重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。</p>
<blockquote>替换命令</blockquote>
<p>ra 将当前字符替换为a,当期字符即光标所在字符。<br>s/old/new/ 用old替换new,替换当前行的第一个匹配<br>s/old/new/g 用old替换new,替换当前行的所有匹配<br>%s/old/new/ 用old替换new,替换所有行的第一个匹配<br>%s/old/new/g 用old替换new,替换整个文件的所有匹配<br>:10,20 s/^/ /g 在第10行知第20行每行前面加四个空格,用于缩进。<br>ddp 交换光标所在行和其下紧邻的一行。</p>
<blockquote>移动命令</blockquote>
<p>h 左移一个字符<br>l 右移一个字符,这个命令很少用,一般用w代替。<br>k 上移一个字符<br>j 下移一个字符<br>以上四个命令可以配合数字使用,比如20j就是向下移动20行,5h就是向左移动5个字符,在Vim中,很多命令都可以配合数字使用,比如删除10个字符10x,在当前位置后插入3个!,3a!<Esc>,这里的Esc是必须的,否则命令不生效。<br>w 向前移动一个单词(光标停在单词首部),如果已到行尾,则转至下一行行首。此命令快,可以代替l命令。<br>b 向后移动一个单词 2b 向后移动2个单词<br>e,同w,只不过是光标停在单词尾部<br>ge,同b,光标停在单词尾部。<br>^ 移动到本行第一个非空白字符上。<br>0(数字0)移动到本行第一个字符上,<br><HOME> 移动到本行第一个字符。同0健。<br>$ 移动到行尾 3$ 移动到下面3行的行尾<br>gg 移动到文件头。 = [[<br>G(shift + g) 移动到文件尾。 = ]]<br>f(find)命令也可以用于移动,fx将找到光标后第一个为x的字符,3fd将找到第三个为d的字符。<br>F 同f,反向查找。<br>跳到指定行,冒号+行号,回车,比如跳到240行就是 :240回车。另一个方法是行号+G,比如230G跳到230行。<br>Ctrl + e 向下滚动一行<br>Ctrl + y 向上滚动一行<br>Ctrl + d 向下滚动半屏<br>Ctrl + u 向上滚动半屏<br>Ctrl + f 向下滚动一屏<br>Ctrl + b 向上滚动一屏</p>
<blockquote>撤销和重做</blockquote>
<p>u 撤销(Undo)<br>U 撤销对整行的操作<br>Ctrl + r 重做(Redo),即撤销的撤销。</p>
<blockquote>删除命令</blockquote>
<p>x 删除当前字符<br>3x 删除当前光标开始向后三个字符<br>X 删除当前字符的前一个字符。X=dh<br>dl 删除当前字符, dl=x<br>dh 删除前一个字符<br>dd 删除当前行<br>dj 删除上一行<br>dk 删除下一行<br>10d 删除当前行开始的10行。<br>D 删除当前字符至行尾。D=d$<br>d$ 删除当前字符之后的所有字符(本行)<br>kdgg 删除当前行之前所有行(不包括当前行)<br>jdG(jd shift + g) 删除当前行之后所有行(不包括当前行)<br>:1,10d 删除1-10行<br>:11,$d 删除11行及以后所有的行<br>:1,$d 删除所有行<br>J(shift + j) 删除两行之间的空行,实际上是合并两行。</p>
<blockquote>拷贝和粘贴</blockquote>
<p>yy 拷贝当前行<br>nyy 拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行。<br>p 在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴。<br>shift+p 在当前行前粘贴<br>:1,10 co 20 将1-10行插入到第20行之后。<br>:1,$ co $ 将整个文件复制一份并添加到文件尾部。<br>正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按y即可复制<br>ddp交换当前行和其下一行<br>xp交换当前字符和其后一个字符</p>
<blockquote>剪切命令</blockquote>
<p>正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按d即可剪切<br>ndd 剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴<br>:1,10d 将1-10行剪切。利用p命令可将剪切后的内容进行粘贴。<br>:1, 10 m 20 将第1-10行移动到第20行之后。</p>
<blockquote>退出命令</blockquote>
<p>:wq 保存并退出<br>ZZ 保存并退出<br>:q! 强制退出并忽略所有更改<br>:e! 放弃所有修改,并打开原来文件。</p>
<blockquote>窗口命令</blockquote>
<p>:split或new 打开一个新窗口,光标停在顶层的窗口上<br>:split file或:new file 用新窗口打开文件<br>split打开的窗口都是横向的,使用vsplit可以纵向打开窗口。<br>Ctrl+ww 移动到下一个窗口<br>Ctrl+wj 移动到下方的窗口<br>Ctrl+wk 移动到上方的窗口</p>
<blockquote>关闭窗口</blockquote>
<p>:close 最后一个窗口不能使用此命令,可以防止意外退出vim。<br>:q 如果是最后一个被关闭的窗口,那么将退出vim。<br>ZZ 保存并退出。<br>关闭所有窗口,只保留当前窗口<br>:only</p>
<blockquote>执行shell命令</blockquote>
<p>:!command<br>:!ls 列出当前目录下文件<br>:!perl -c script.pl 检查perl脚本语法,可以不用退出vim,非常方便。<br>:!perl script.pl 执行perl脚本,可以不用退出vim,非常方便。<br>:suspend或Ctrl - Z 挂起vim,回到shell,按fg可以返回vim。</p>
<blockquote>注释命令</blockquote>
<p>perl程序中#开始的行为注释,所以要注释某些行,只需在行首加入#<br>3,5 s/^/#/g 注释第3-5行<br>3,5 s/^#//g 解除3-5行的注释<br>1,$ s/^/#/g 注释整个文档。<br>:%s/^/#/g 注释整个文档,此法更快。</p>
<blockquote>帮助命令</blockquote>
<p>:help or F1 显示整个帮助<br>:help xxx 显示xxx的帮助,比如 :help i, :help CTRL-[(即Ctrl+[的帮助)。<br>:help 'number' Vim选项的帮助用单引号括起<br>:help <Esc> 特殊键的帮助用<>扩起<br>:help -t Vim启动参数的帮助用-<br>:help i_<Esc> 插入模式下Esc的帮助,某个模式下的帮助用模式_主题的模式<br>帮助文件中位于||之间的内容是超链接,可以用Ctrl+]进入链接,Ctrl+o(Ctrl + t)返回<br>其他非编辑命令<br>. 重复前一次命令<br>:set ruler? 查看是否设置了ruler,在.vimrc中,使用set命令设制的选项都可以通过这个命令查看<br>:scriptnames 查看vim脚本文件的位置,比如.vimrc文件,语法文件及plugin等。<br>:set list 显示非打印字符,如tab,空格,行尾等。如果tab无法显示,请确定用set lcs=tab:>-命令设置了.vimrc文件,并确保你的文件中的确有tab,如果开启了expendtab,那么tab将被扩展为空格。</p>
docker安装nginx
https://segmentfault.com/a/1190000019927679
2019-07-31T10:32:06+08:00
2019-07-31T10:32:06+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
2
<h2>docker安装nginx</h2>
<p>使用dnnmmp单独安装nginx的。</p>
<blockquote>软件地址:<a href="https://link.segmentfault.com/?enc=6xYHvnaiBZsgQp9H5wfWsQ%3D%3D.JOslbXbSY80lEA2Z20t%2BKony6R%2BYjFfUjzK2Rcmbrr5H%2BOuaUkCjNDeOGkhIlWuT" rel="nofollow">https://github.com/wallace530...</a>
</blockquote>
<p>安装步骤如下:</p>
<ol><li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。</li></ol>
<ul>
<li><a href="https://link.segmentfault.com/?enc=zHfYGROeHE3Z2dRYbsEFyQ%3D%3D.YMrZnH%2BeREO%2FjTKADmFF1yD4cDcVKUAJTJpcNkEYPyTNw%2BaTE%2FjX8fbwDiQZfYAx" rel="nofollow">docker安装</a></li>
<li><a href="https://link.segmentfault.com/?enc=D7%2F0RMtN9LEbdSrYdB9wSw%3D%3D.oFrG9S%2BnxH%2FvNeuppdd1IJir6MMPzMiNnXG1fD%2BzC36QOE5JucH0%2B3YQN2zcOsgc" rel="nofollow">docker-compose安装</a></li>
</ul>
<ol>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>构建并启动:</p>
<pre><code class="bash">$ cd dnnmmp
# 构建
$ docker-compose build nginx
# 后台运行
$ docker-compose up -d nginx</code></pre>
<blockquote>查看容器:<code>$ docker container ls</code>
</blockquote>
</li>
</ol>
docker安装php
https://segmentfault.com/a/1190000019924261
2019-07-30T21:59:03+08:00
2019-07-30T21:59:03+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
3
<h2>docker安装php</h2>
<p>之前写的一篇文章docker内容介绍的比较多,但有很多网友反映对docker不是很熟悉,很难一次性全部接收完,因此写一篇单独安装PHP的。</p>
<blockquote>软件地址:<a href="https://link.segmentfault.com/?enc=1vVimiHRrEQMrLl%2FrqLzmA%3D%3D.PEeOnxVBVsJNfTJAhKQ21KPkQmygTHHoCRcPegTjPSb3JHXoHXmi3hLMH3nOU3%2B1" rel="nofollow">https://github.com/wallace530...</a>
</blockquote>
<p>安装步骤如下:</p>
<ol><li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。</li></ol>
<ul>
<li><a href="https://link.segmentfault.com/?enc=dgxTl5ZBu2e%2FTMx88Uw25A%3D%3D.eL9SvUcNirW9L5ci1iGb%2FE5cu2fj7fYSj58C7emz%2BZ%2FK03k1iRI3Kc%2FQedxXhoKD" rel="nofollow">docker安装</a></li>
<li><a href="https://link.segmentfault.com/?enc=%2FuJKHKU%2BhydsPo39vtKHwQ%3D%3D.bYithI7HXzkgy6yKUA%2FBv%2BGZxBYvcihtGjv%2F0sptcS9%2Fn1AUJWI27gvPNTbcHbqn" rel="nofollow">docker-compose安装</a></li>
</ul>
<ol>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>构建并启动:</p>
<pre><code class="bash">$ cd dnnmmp
# 构建
$ docker-compose build php72
# 后台运行
$ docker-compose up -d php72</code></pre>
<blockquote>查看容器:<code>$ docker container ls</code>
</blockquote>
</li>
<li>
<p>命令行使用</p>
<blockquote>编辑 <code>~/.bashrc(或 ~/.zshrc)</code>,并在行尾添加</blockquote>
<pre><code class="bash"> # 如果电脑上已经安装过软件,请更换函数名称
php () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--volume $PWD:/var/www/html:rw \
--workdir /var/www/html \
dnnmmp_php72 php "$@"
}
composer () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--user $(id -u):$(id -g) \
--volume ~/dnnmmp/composer:/tmp \
--volume /etc/passwd:/etc/passwd:ro \
--volume /etc/group:/etc/group:ro \
--volume $(pwd):/app \
composer "$@"
}</code></pre>
<blockquote>(3)让修改的内容生效</blockquote>
<pre><code>$ source ~/.bashrc(或 ~/.zshrc)</code></pre>
<blockquote>(4)查看版本信息</blockquote>
<pre><code>$ php -v
PHP 7.2.19 (cli) (built: Jun 28 2019 03:58:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.19, Copyright (c) 1999-2018, by Zend Technologies
$ composer -v
Composer version 1.8.6 2019-06-11 15:03:05</code></pre>
</li>
</ol>
一键搭建基于docker的nodejs、php开发环境 (开源项目)
https://segmentfault.com/a/1190000019906077
2019-07-29T15:18:20+08:00
2019-07-29T15:18:20+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
63
<p>最近写了个新项目,一键部署nodejs,php开发环境(docker,nodejs,php,nginx,mongo,mysql,redis)</p>
<p>因为最近开始同时写nodejs,php项目,还要部署到测试、预发布、线上环境,其他同事也需要一套相同的环境。不同平台下搭建一整套开发环境又很繁琐,因此有了这个项目。</p>
<blockquote>帮忙加个星呗<br>github地址:<a href="https://link.segmentfault.com/?enc=weiErQIPNaTvoVbyE6naxA%3D%3D.5ndX0H7PYISJCZ7fPDKpe4xzvPi2aGjaPnAKu9HQpkmIdW3eYNQGUEPNK5asryGd" rel="nofollow">https://github.com/wallace530...</a>
</blockquote>
<p>如果有疑问或者使用异常,请帮忙指出。感谢!</p>
<p>详情如下:</p>
<h2>基于docker的nodejs、php开发环境</h2>
<h3>Dnnmmp包含以下组合</h3>
<blockquote>dnm(Docker + Nodejs + Mysql/MongoDB/Redis)<p>dnmn(Docker + Nodejs + Mysql/MongoDB/Redis + Nginx)</p>
<p>dnmp(Docker + Nginx + Mysql/MongoDB/Redis + PHP)</p>
<p>支持系统版本:Linux、MacOs、Windows</p>
</blockquote>
<h3>特性</h3>
<blockquote>1.主要针对<strong>nodejs</strong>开发人员、<strong>php</strong>开发人员,<strong>运维</strong>,<strong>前端</strong><p>2.支持<strong>多版本</strong>php,nodejs</p>
<p>3.兼容<strong>OneinStack</strong>的配置文件,完善的配置说明</p>
<p>4.支持<strong>绑定多个域名</strong></p>
<p>5.清晰的docker文件、配置文件、日志文件结构</p>
<p>6.支持php<strong>扩展</strong>安装</p>
<p>7.程序是基于docker最新stable版,并从官方仓库下载</p>
<p>8.持续不断更新,支持交互、无人值守安装</p>
</blockquote>
<h3>可选软件版本</h3>
<blockquote>
<a href="https://link.segmentfault.com/?enc=51njNwiZHaVFGa0LgOzDgw%3D%3D.7KSHgdyF2GbOeqmHIF3%2B%2BzCJhonBpg7FDAr0uTtckMwASaLpomXHYLfPJGU%2FTICq" rel="nofollow">docker官方仓库</a><p>nginx=1.17 / 1.16</p>
<p>mysql=8 / 5.7 / 5.6</p>
<p>nodejs=12 / 10 / 8</p>
<p>php=7.4 / 7.3 / 7.2 / 7.1 / 5.6</p>
<p>mongodb=4 / 3</p>
<p>redis=5 / 4</p>
</blockquote>
<h2>目录</h2>
<ul>
<li><a href="#2.%E5%AE%89%E8%A3%85%E6%AD%A5%E9%AA%A4">1.安装步骤</a></li>
<li><a href="#3.%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%BD%BF%E7%94%A8">2.命令行使用</a></li>
<li><a href="#4.php%E6%89%A9%E5%B1%95">3.php扩展</a></li>
<li><a href="#5.%E6%97%A5%E5%BF%97">4.日志</a></li>
<li><a href="#%E9%99%84%E5%BD%951">附录1:docker安装</a></li>
<li><a href="#%E9%99%84%E5%BD%952">附录2:目录结构</a></li>
<li><a href="#%E9%99%84%E5%BD%953">附录3:收集的程序员常用网站</a></li>
<li><a href="#%E9%99%84%E5%BD%954">附录4:常见的问题</a></li>
</ul>
<h3>1.安装步骤</h3>
<ol>
<li>本地安装<code>git</code>、<code>docker</code>和<code>docker-compose</code>(<strong>建议使用最新版本:1.23</strong>)。<br><a href="#%E9%99%84%E5%BD%951">附录1:docker安装</a>
</li>
<li>
<p><code>clone</code>项目:</p>
<pre><code class="bash"># 如果不是`root`用户,那么将当前用户加入`docker`用户组
$ sudo gpasswd -a ${USER} docker
# 获取项目
$ git clone https://github.com/wallace5303/dnnmmp.git</code></pre>
</li>
<li>
<p>构建并启动:</p>
<pre><code class="bash">$ cd dnnmmp
# 构建并运行(第一次安装建议使用此命令,方便查看打印的日志)
$ docker-compose up
# 后台运行
$ docker-compose up -d</code></pre>
<blockquote>注意:Windows安装360安全卫士的同学,请先将其退出,不然安装过程中可能Docker创建账号过程可能被拦截,导致启动时文件共享失败;<p>查看生成的镜像:<code>$ docker image ls</code></p>
<p>查看启动的容器:<code>$ docker container ls</code></p>
<p><a href="#%E9%99%84%E5%BD%954">附录4:常见的问题</a></p>
</blockquote>
</li>
<li>访问在浏览器中访问:<br><a href="https://link.segmentfault.com/?enc=A1T1QnAxDj5A4fzhJFW1vA%3D%3D.LLjgitTHFTL99qz4Fbhk%2BVkGXCeiysF%2BVhkqBdA6nvU%3D" rel="nofollow">http://local2.com/index.html</a>,</li>
<li>常用命令</li>
</ol>
<pre><code class="bash"># 服务列表:redis|mysql|mongodb|nginx|php
# 列出 Compose 文件中包含的镜像
$ docker-compose images
# 创建所有服务并启动
$ docker-compose up
$ docker-compose up -d # 全部后台启动
# 创建单个服务
$ docker-compose up redis
$ docker-compose up redis -d # 后台启动
# 如果容器已经创建
# 启动
$ docker-compose start redis
# 停止
$ docker-compose stop redis
# 重启
$ docker-compose restart redis
# 重新构建
$ docker-compose build redis
# 删除
$ docker-compose rm redis</code></pre>
<p>更多docker命令,请查看:</p>
<ul>
<li><a href="https://link.segmentfault.com/?enc=bjU2FvDUM%2BETYceb1V36Aw%3D%3D.hF0JK2JM2DNCeXg%2FPl7Mk7QC2M3CSMTLdhqpl50tVafK9px4sRAxWcbxYKuFsj3VZfl7nb5bIuWox%2BHNT02heQ%3D%3D" rel="nofollow">docker</a></li>
<li><a href="https://link.segmentfault.com/?enc=nxjFxyWuew5ms9Tb53AzJA%3D%3D.Z3hzNE7EdTGbNPlpG5yv3Wp3ZsLcm3H7%2FBR2Jk%2FviLozSEaN%2FbVmPPUWe6gmuhzePvrxN4Au%2B8ZHvfUg6a0VHQ%3D%3D" rel="nofollow">docker-compose</a></li>
</ul>
<h3>2.命令行使用</h3>
<ol><li>docker安装的程序与直接安装在宿主机上的程序不同,如果需要使用命令行,有两种方法,</li></ol>
<ul>
<li><blockquote>(1)方法一:进入docker创建的容器中执行命令</blockquote></li>
<li><blockquote>(2)<strong>方法二(推荐)</strong>:添加bash快捷命令,如下:</blockquote></li>
<li>
<blockquote>编辑 <code>~/.bashrc(或 ~/.zshrc)</code>,并在行尾添加</blockquote>
<pre><code class="bash"># 如果电脑上已经安装过软件,请更换函数名称
node () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--volume $PWD:/var/www/html:rw \
--workdir /var/www/html \
dnnmmp_node node "$@"
}
npm () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--volume $PWD:/var/www/html:rw \
--workdir /var/www/html \
dnnmmp_node npm "$@"
}
php () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--volume $PWD:/var/www/html:rw \
--workdir /var/www/html \
dnnmmp_php72 php "$@"
}
composer () {
tty=
tty -s && tty=--tty
docker run \
$tty \
--interactive \
--rm \
--user $(id -u):$(id -g) \
--volume ~/dnnmmp/composer:/tmp \
--volume /etc/passwd:/etc/passwd:ro \
--volume /etc/group:/etc/group:ro \
--volume $(pwd):/app \
composer "$@"
}</code></pre>
</li>
<li>
<blockquote>(3)让修改的内容生效</blockquote>
<pre><code>$ source ~/.bashrc(或 ~/.zshrc)</code></pre>
</li>
<li><blockquote>注意:如果提示命令不存在,请重新打开终端窗口。(因为旧的终端,并不会重新加载该文件)</blockquote></li>
<li>
<blockquote>(4)查看版本信息</blockquote>
<pre><code>$ node -v
v10.16.0
$ npm -v
6.9.0
$ php -v
PHP 7.2.19 (cli) (built: Jun 28 2019 03:58:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.19, Copyright (c) 1999-2018, by Zend Technologies
$ composer -v
Composer version 1.8.6 2019-06-11 15:03:05</code></pre>
</li>
</ul>
<ol><li>
<p>快速进入容器</p>
<p>了解docker的同学知道,经常需要进入容器中查看内容,配置进入容器命令。</p>
<p>编辑 <code>~/.bashrc(或 ~/.zshrc)</code>,添加:</p>
<pre><code class="bash">alias dmysql='docker exec -it dnnmmp_mysql_1 /bin/bash'
alias dredis='docker exec -it dnnmmp_redis_1 /bin/sh'
alias dnginx='docker exec -it dnnmmp_nginx_1 /bin/sh'
alias dmongodb='docker exec -it dnnmmp_mongodb_1 /bin/sh'
alias dphp72='docker exec -it dnnmmp_php72_1 /bin/bash'</code></pre>
<p>使生效:</p>
<pre><code>$source ~/.bashrc(或 ~/.zshrc)</code></pre>
</li></ol>
<h3>3.php扩展</h3>
<ol><li>
<p>添加扩展:编辑.env文件</p>
<pre><code class="bash">#从扩展列表中选择相应的扩展,添加到此行中,英文逗号隔开
PHP72_EXTENSIONS=curl,opcache,redis</code></pre>
<blockquote>重新build PHP镜像:docker-compose build php72 docker-compose up -d</blockquote>
</li></ol>
<h3>4.日志</h3>
<p>php日志目录:./log/php/</p>
<p>nginx日志目录:./log/nginx/</p>
<p>mysql数据及日志目录:./mysql/</p>
<p>mongo数据及日志目录:./mongo/</p>
<h3>附录1:docker安装</h3>
<ul>
<li><a href="https://link.segmentfault.com/?enc=f8H0JB3aPaNRLrRrI%2F5aHg%3D%3D.e%2B6qq2c0no2c0bIAM4%2BPPKbgmCX0bts1P%2FFlB1O9Uj30B%2BIryJpdlcorULh8NUnx" rel="nofollow">docker安装</a></li>
<li><a href="https://link.segmentfault.com/?enc=9DhhPZNsSANiJtBW2okyLQ%3D%3D.ygj0pPC1qvzIuxzM%2BekPHDR7whRQ9QJ3U7ST6D6k3MHSqPQJCiPM6aeySiMiWGYS" rel="nofollow">docker-compose安装</a></li>
</ul>
<h3>附录2:目录结构</h3>
<pre><code>/
├── composer Composer配置与缓存
├── config 配置文件
│ ├── mongodb mongodb
│ ├── Dockerfile Dockerfile文件
│ ├── mysql mysql
│ ├── Dockerfile
│ ├── mysql.cnf mysql配置文件
│ ├── nginx nginx
│ ├── conf.d
│ ├── certs 秘钥
│ ├── localhost_https.conf https虚拟主机
│ ├── localhost.conf 虚拟主机
│ ├── Dockerfile
│ ├── nginx.conf nginx配置
│ ├── node node
│ ├── Dockerfile
│ ├── php php
│ ├── extensions 扩展及脚本
│ ├── install.sh 基础安装脚本
│ ├── php56.sh php5.6扩展安装脚本
│ ├── php72.sh php7.2扩展安装脚本
│ ├── Dockerfile
│ ├── php-fpm.conf php-fpm配置文件
│ ├── php.ini php.ini配置文件
│ ├── redis redis
│ ├── Dockerfile
│ ├── redis.conf redis配置文件
├── mongo mongodb数据目录
├── log 日志目录
├── mysql MySQL数据目录
├── docker-compose.yml Docker 服务配置
├── .env 环境配置
└── www 代码目录</code></pre>
前端程序员给女朋友做的相册——原生JS
https://segmentfault.com/a/1190000019241813
2019-05-21T00:36:15+08:00
2019-05-21T00:36:15+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
6
<p>今天要分享的是一款特别的 html5/css3 焦点图效果,不依赖jquery,全程JS 手写,代码量不大,百行左右,它的特别之处在于 可以多维度的切换</p>
<p>谁说程序员没有情调? 拿这个去给女票定制个专属相册吧<img src="/img/bVbsTPs?w=577&h=566" alt="图片描述" title="图片描述"><img src="/img/bVbsTPO?w=545&h=548" alt="图片描述" title="图片描述"><img src="/img/bVbsTPP?w=547&h=545" alt="图片描述" title="图片描述"></p>
<p>源码地址:<a>下载</a></p>
<p>js核心代码:</p>
<pre><code>window.addEventListener('load',function(){
figure = document.getElementById('multiSlide');
topButton = document.getElementById('top');
bottomButton = document.getElementById('bottom');
leftButton = document.getElementById('left');
rightButton = document.getElementById('right');
new Box(-2,2,'images/2689.jpg');
new Box(-1,2,'images/2690.jpg');
new Box(0,2,'images/2691.jpg');
new Box(1,2,'images/2692.jpg');
new Box(2,2,'images/2693.jpg');
new Box(3,2,'images/2694.jpg');
new Box(4,2,'images/2695.jpg');
new Box(5,2,'images/2696.jpg');
new Box(2,-2,'images/2697.jpg');
new Box(2,-1,'images/2698.jpg');
new Box(2,0,'images/2699.jpg');
new Box(2,1,'images/2700.jpg');
new Box(2,2,'images/2701.jpg');
new Box(2,3,'images/2702.jpg');
new Box(2,4,'images/2703.jpg');
new Box(2,5,'images/2704.jpg');
topButton.addEventListener('click', function(){
if(slidePosY>-3)
slide('Y',-1);
});
bottomButton.addEventListener('click', function(){
if(slidePosY<4)
slide('Y',1);
});
leftButton.addEventListener('click', function(){
if(slidePosX>-3)
slide('X',-1);
});
rightButton.addEventListener('click', function(){
if(slidePosX<4)
slide('X',1);
});
});
var unit = 160;
var registeredBoxes = [];
var slidePosX = 0;
var slidePosY = 0;
var Box = function(posX,posY,img){
this.pos = {};
this.pos.X = posX;
this.pos.Y = posY;
this.img = img;
this.init();
}
Box.prototype = {
init : function(){
this.DOMElement = document.createElement('div');
this.DOMElement.className = 'box';
this.DOMElement.style.left = (this.pos.X*unit)-unit+'px';
this.DOMElement.style.top = (this.pos.Y*unit)-unit+'px';
this.DOMElement.setAttribute('data-pos',this.pos.X.toString()+this.pos.Y.toString());
var img = document.createElement('img');
img.src = this.img;
this.DOMElement.appendChild(img);
figure.appendChild(this.DOMElement);
registeredBoxes.push(this);
},
setPosition : function(axis,val){
this.pos[axis] = val;
if(axis == 'X'){
this.DOMElement.style.left = (this.pos[axis]*unit)-unit+'px';
}else if(axis == 'Y'){
this.DOMElement.style.top = (this.pos[axis]*unit)-unit+'px';
}
this.DOMElement.setAttribute('data-pos',this.pos.X.toString()+this.pos.Y.toString());
}
}
function slide(axis,dir){
var len = registeredBoxes.length;
if(axis == 'Y'){
for(var i=0; i<len; i++){
if(registeredBoxes[i].pos['X']=='2'){
registeredBoxes[i].setPosition(axis,registeredBoxes[i].pos['Y']+(1*dir));
}
}
slidePosY = slidePosY+dir;
}else if(axis == 'X'){
for(var i=0; i<len; i++){
if(registeredBoxes[i].pos['Y']=='2'){
registeredBoxes[i].setPosition(axis,registeredBoxes[i].pos['X']+(1*dir));
}
}
slidePosX = slidePosX+dir;
}
}</code></pre>
设计模式-07-装饰者模式
https://segmentfault.com/a/1190000018829243
2019-04-11T09:51:12+08:00
2019-04-11T09:51:12+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>装饰者模式</h2>
<h3>概述</h3>
<p>当对象需要添加一些功能,比如在表单的组件添加验证功能,为咖啡添加配料,为窗口添加滚动条等等.此时如果使用继承的话,会产生很多子类,不好管理,而且,在项目越来越大的时候会出现类爆炸.使用装饰者模式,使用组合的形式构造对象,比使用继承更加灵活简单,也更加容易管理.</p>
<h3>实现</h3>
<p>此处实现为咖啡添加配料.有咖啡材料,现调制摩卡咖啡等.使用Beverage抽象类,咖啡和配料分别继承Beverage类,并实现里面的抽象方法Cost和GetDecription.配料的构造方法传入咖啡类,通过在配料的构造函数里组合配料与咖啡原料实现装饰者模式.每个配料(装饰者)都有(包装)一个组件,在装饰者里保存一个原料的引用就能实现咖啡被配料包(装饰)起来.</p>
<h3>总结与分析</h3>
<p>装饰者模式采用组合的构建方式,大大减少了类的数量,也打破了扩展功能一定要使用继承的思维惯性.但是装饰者模式会产生过多的小类,过度地使用会让程序变得更复杂.</p>
<h3>代码实现:</h3>
<p><a href="https://link.segmentfault.com/?enc=POfxBluct14ALuNUYDVjZg%3D%3D.Uylg3ZD2adzevTNfTgj1g%2BbLJFYW50n7zMZA8o46yNzYWPxu75tAl6mkv%2BJh1s%2BqnUHLv50JvV%2F986chfHmQcPSdQvCVXbGTAq7DEYk7fqRl%2BU3VgHIMkQ9M5BZUI4D3bbVKNhiwnrca2NwyGsZ3%2Fw%3D%3D" rel="nofollow">装饰者模式(php/go)</a></p>
设计模式-06-组合模式
https://segmentfault.com/a/1190000018829173
2019-04-11T09:48:11+08:00
2019-04-11T09:48:11+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>组合模式</h2>
<h3>概述</h3>
<p>树形结构在项目中很经常会碰到,当树形结构变得越来越大之后会难以管理。组合模式允许你将对象组合成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。树里面包含了组合以及个别的对象。</p>
<h3>实现</h3>
<p>本例中,用组合模式来实现导航栏。可以有多级导航栏和二级导航栏。</p>
<h3>总结与分析</h3>
<p>使用组合模式,可以将相同的操作应用在组合和个别的对象上,换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。</p>
<h3>代码实现:</h3>
<p><a href="https://link.segmentfault.com/?enc=pFuBxckiEDJcmWnnfarNnA%3D%3D.XCDh4C1rXfIyY6kOSkCAoZAbJCOFjm2jdtYiP1wKgLIufzxexwG7GSA7vIWgwA%2F8wQPkIgWtkZCRJNUMKMrof9RbIxO%2FRfbCnNgfMoWMv6zoc1felKgfVDDo4%2BH1XVH4P7QVAipGiLb7fydErIlNIw%3D%3D" rel="nofollow">组合模式(php/go)</a></p>
设计模式-05-命令模式
https://segmentfault.com/a/1190000018828966
2019-04-11T09:35:16+08:00
2019-04-11T09:35:16+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>命令模式</h2>
<h3>概述</h3>
<p>在开发中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。我们希望做到只需在程序运行时指定具体的请求接收者即可,可以使用命令模式来进行设计,消除请求发送者与请求接收者彼此之间的耦合,让对象之间的调用关系更加灵活。</p>
<h3>实现</h3>
<p>使用一个音乐播放器的例子,有播放,暂停和停止播放三种命令。</p>
<h3>总结与分析</h3>
<p>命令模式的本质是对命令进行封装,将发出和执行命令的责任分割开。命令模式中的每一个命令都是一个操作,请求方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。</p>
<h3>代码实现:</h3>
<p><a href="https://link.segmentfault.com/?enc=TPy1BUs1%2Bo43UpALRT6nuA%3D%3D.f6%2F3mUDQgdUTm5v39YvulntHn%2FjbwZyfPlTnZIjw6WXmSUS5twFreozH7dYDmpidfJrOU7FABDhPJihJLNi33zQ39WjybvM6ZpTfPnR8uSGsab556G%2BhQ15%2Fk2ItJwRmju85NWz9h%2BRRmKEG0hILdw%3D%3D" rel="nofollow">命令模式(php/go)</a></p>
设计模式-04-职责链模式
https://segmentfault.com/a/1190000018828916
2019-04-11T09:31:43+08:00
2019-04-11T09:31:43+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
0
<h2>职责链模式</h2>
<h3>概述</h3>
<p>职责链模式是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。</p>
<h3>实现</h3>
<p>使用数据过滤类来实现职责链模式。用户传递数据给FilterChain类,但是数据具体会被哪个过滤器处理客户并不知道,FilterChain最终会返回被过滤后的数据给用户。</p>
<h3>总结与分析</h3>
<p>职责链模式让请求者和接收者解耦,从而可以动态地切换和组合接收者</p>
<h3>代码实现:</h3>
<p><a href="https://link.segmentfault.com/?enc=w53kvRSgE%2FPp0TUq4e%2BBoA%3D%3D.yamUePA70Jyt0IPTbjDosImEGclWymEnX0F31GNnHMM2eC2iRehzgMc8Ef5voLWOxEtZQX29qLQce9VnxUqwcOrNZHYzl8BMLTAnmtrGS9MYGbyoqRLJjQ6%2BG%2Bil7%2BPpOVh0RM3QpMxJ0r5c4ett8n%2FxnvKnRHFWoL4igNeDHpo%3D" rel="nofollow">职责链模式(php/go)</a></p>
设计模式-03-生成器模式
https://segmentfault.com/a/1190000018825096
2019-04-10T19:53:37+08:00
2019-04-10T19:53:37+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
1
<h2>生成器模式</h2>
<h3>概述</h3>
<p>生成器模式将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的主要功能是构建复杂的产品,而且是细化地、分步骤地构建产品,也就是说生成器模式重在一步一步解决构建复杂对象的问题。</p>
<h3>实现</h3>
<p>使用文件的导出来实现生成器模式。文件的导出有普通文本和xml等文件格式。生成器作为一个接口,不同的具体生成器具体实现接口的方法。还有一个指导者负责整体构建的算法部分,是相对不变的部分。</p>
<h3>总结与分析</h3>
<p>生成器模式构建对象的过程是统一的、固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程,就能构建出不同的产品来。生成器模式的重心在于分离构建方法和具体的构造实现,从而使得构建算法可以重用。具体的构造实现可以很方便地扩展和切换,从而可以灵活地组合来构造出不同的产品对象。生成器模式跟模板方法模式很像,但是模板方法模式主要是用来定义算法的骨架,把算法中某些步骤延迟到子类中实现。生成器模式是用“指导者”来定义整体的构建算法,把算法中某些涉及到具体部件对象的创建和装配的功能,委托给具体的生成器来实现。</p>
<h3>代码实现:</h3>
<p><a href="https://link.segmentfault.com/?enc=eUBFKtQJg5FUC4ZoYirWog%3D%3D.Unjt7ZLxOYa83u7yQFAXpTVZcSqxibVdLPd5QoobSHLXFsoL%2BAMA52THU8H5c%2F%2Fu4%2BT9e%2B8ddP%2BaJYpM2MHSwwUDVRTkUy4jiwhYPP5u%2BJcgf6k0Er%2Byw9Sl1Vl2ssUro7STtGkFxPA1MWTtifIEUw%3D%3D" rel="nofollow">生成器模式(php/go)</a></p>
设计模式-02-桥接模式
https://segmentfault.com/a/1190000018825051
2019-04-10T19:49:38+08:00
2019-04-10T19:49:38+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
2
<h2>桥接模式</h2>
<h3>概述</h3>
<p>桥接模式将抽象部分与它的实现部分分离,使他们都可以独立地变化。通俗地说,桥接就是在不同的东西之间搭一个桥,让它们能够连接起来,可以相互通讯和使用。在桥接模式中的桥接是在被分离的抽象部分和实现部分之间搭一个桥。为了达到让抽象部分和实现部分分离开,而且在抽象部分实现的时候,还是需要使用具体的实现,可以使用桥接模式来实现。这里的桥接,就是让抽象部分拥有实现部分的接口对象,就桥接上了。</p>
<h3>实现</h3>
<p>使用发送信息的例子来实现桥接模式。信息的发送方式如:手机信息、普通信息、Email信息作为抽象部分,信息的分类如:普通信息、紧急信息、加急信息作为具体实现部分。</p>
<h3>总结与分析</h3>
<p>桥接模式是用来解决有两个变化纬度的情况下,如何灵活地扩展功能的一个很好的方案。其实,桥接模式主要是把继承改成了使用对象组合,从而把两个纬度分开,让每一个纬度单独地去变化,最后通过对象组合的方式,把两个纬度组合起来。桥接模式也从侧面体现了使用对象组合的方式比继承要来得更灵活。</p>
<h3>代码实现:</h3>
<p><a href="https://link.segmentfault.com/?enc=H4wj5MDKDviyIGIZx7Latw%3D%3D.zh3sYp9x0uMLCVH4RC9qdxhSMDD%2BLomDBA733Es4h3yJ%2BrWl7z7T6y51LMFLEaXVITMpTHGXTtJiXyjaowWQeUOx9zJdFVLV90mPDCuM4S9sq7OTjiVxyc1i7pg0oRqrL6G9C3puZ4KbftcbTAnsMA%3D%3D" rel="nofollow">桥接模式(php/go)</a></p>
设计模式-01-适配器模式
https://segmentfault.com/a/1190000018824953
2019-04-10T19:38:46+08:00
2019-04-10T19:38:46+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
2
<h2>适配器模式</h2>
<h3>概述</h3>
<p>在开发过程会遇到有两个项目,A项目想调用B项目的接口,然而两个项目并没有做兼容。适配器模式就将一个类的接口,转换成客户期望的另一个接口。适配器模式就好比IPhone手机的转换器一样。还有Javachoking的swing库也有很多Adapter也是适配器模式应用的场景。</p>
<h3>实现</h3>
<p>实现使用适配Log类。当Log实现了保存到文件的功能后,客户想实现保存到数据库,使用适配器模式可以实现。</p>
<h3>总结与分析</h3>
<p>适配器模式的主要目的是组合两个不相干的类,在不改变原有系统的基础上,提供新的接口服务。</p>
<h3>代码实现:</h3>
<p><a href="https://link.segmentfault.com/?enc=plj62RJPhmW4aJ%2BRXgvNeA%3D%3D.u%2FOB8d1NG%2FhRQN%2Fdjm6qrkAKc3UaR7nNI3A1kXRCWiZDbiYnKErvUL86OLOPulemsCxJH%2BU0lt1KKTYMrzf662WxRz5Q6ZoE03QkPARbfSVvx3i18g4wU4vc7uh%2FvXm%2BRj4%2FE3bs2A2G5h%2FRQu6s%2FQ%3D%3D" rel="nofollow">适配器模式(php/go)</a></p>
事件驱动模型是什么
https://segmentfault.com/a/1190000017151921
2018-11-26T23:15:12+08:00
2018-11-26T23:15:12+08:00
哆啦好梦
https://segmentfault.com/u/wallace5303
2
<p>在学习nodejs的时候,对nodejs的介绍就是:Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。那么什么是事件驱动模型呢? 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。 让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。图21.1展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。</p>
<p>图21.1 <br><img src="/img/bVT5e6?w=1162&h=1108" alt="图片描述" title="图片描述"></p>
<p>在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。这种明确的执行顺序和串行化处理的行为是很容易推断得出的。如果任务之间并没有互相依赖的关系,但仍然需要互相等待的话这就使得程序不必要的降低了运行速度。</p>
<p>在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的bug。</p>
<p>在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。</p>
<p>当我们面对如下的环境时,事件驱动模型通常是一个好的选择:</p>
<pre><code>1:程序中有许多任务,而且…
2:任务之间高度独立(因此它们不需要互相通信,或者等待彼此)而且…
3:在等待事件到来时,某些任务会阻塞。
</code></pre>
<p>当应用程序需要在任务间共享可变的数据时,这也是一个不错的选择,因为这里不需要采用同步处理。</p>
<p>网络应用程序通常都有上述这些特点,这使得它们能够很好的契合事件驱动编程模型。</p>