找到
23
篇与
cal
相关的结果
- 第 2 页
-
【Typecho】给Joe主题后台添加custom自定义功能! 大家好,今天来添加一下自定义功能! 😂 温馨提示:站长已经通过本地环境测试custom自定义功能,功能正常可以使用,按照我的操作来一定成功! 大纲 创建custom.php 粘贴代码到custom.php文件 引入custom.php文件 添加li标签代码 引入custom.min.css 引入custom.min.js 总结 摘要 本文主要是教各位给自己的joe主题完成一个后台的自定义设置的功能,以后你要添加带有开关的功能直接在自定义设置里面添加即可! 图片展示 title="m8y8or85.png"图片 如图所示,今天要完成的功能就是图片中的自定义设置!下面跟着我的操作来完成。 创建custom.php 登录你的服务器面板(小皮面板、宝塔面板等)找到joe主题的usr/themes/Joe/ public 进去之后创建一个名字为custom.php文件,然后复制以下代码头进行粘贴: <?php ?> 这个php代码的头部声明吧,以后要添加的php代码全部要放在:<?php 代码放这里面 ?> 怕你们看不懂,如下图所示: title="m8y8y891.png"图片 上面的创建php和粘贴一起说了。下面就是引入custom.php文件了,注意看!!! 引入custom.php 还是一样的,找到目录:/usr/themes/ Joe ,找到 functions.php 文件并打开,打开之后我们看到最后的位置,粘贴下面的代码: // 引入自定义设置 require_once("public/custom.php"); 放心,有演示图片的,不要着急!!! 演示图片 title="m8y97hcy.png"图片 看到图片中的符号没? 🔜 } 把引入代码放在它的前面即可! 每次添加完代码都要先保存,保存后先不要急着关闭functions.php,我们继续找到这个文件的开头位置准备添加以下代码: <li class="item" data-current="joe_custom">自定义设置</li>演示图 title="m8y9cpec.png"图片 放好之后我们保存,然后我就去引入custom.css和js文件了,这个简单啊!!! 引人custom.css&js 找到/usr/themes/Joe/assets/ css 点击创建文件,名字命名为custom.min.css,保存之后打开它,粘贴以下代码: html{--reading: #faf9de}html[data-night=night] body{--reading: #424242}html[data-night=night] body::before{filter:brightness(0.2)}html[data-night=night] body img:not(.owo_image,.shang,.user_logo),html[data-night=night] body .joe_detail__leaving-list .item,html[data-night=night] body .js_ad,html[data-night=night] body .a-js-ad,html[data-night=night] body .joe_detail__friends-item{filter:brightness(0.6)}html .joe_header__above-logo{overflow:hidden}html .joe_header__above-logo::before{content:"";position:absolute;top:-50px;left:-15px;width:250px;height:25px;background-image:linear-gradient(rgba(255, 255, 255, 0), var(--background));opacity:.8;transform:rotate(-45deg);-webkit-animation:flashlights 1s ease-in 1s infinite;animation:flashlights 1.5s ease-in 1s infinite}@-webkit-keyframes flashlights{0%{left:-100px;top:0}to{left:120px;top:100px}}@keyframes flashlights{0%{left:-100px;top:0}to{left:120px;top:100px}}@media(max-width: 1200px){.joe_header__above-search{display:none}.joe_header__above-searchicon{display:block}.joe_header__below-sign .joe_dropdown__link span{display:none}}.js_ad{margin-top:10px;position:relative;border-radius:var(--radius-wrap);box-shadow:var(--box-shadow);overflow:hidden;height:120px}@media(max-width: 768px){.js_ad{height:100px}}.Reward{text-align:center;margin-left:30px;color:var(--minor);font-size:12px}.Reward .footer_flex{width:42px;height:42px;background-color:#f56c6c;border-radius:50%;position:relative;z-index:10;display:flex;justify-content:center;align-items:center;margin-bottom:8px}.Reward .footer_flex:hover{background-color:var(--theme);cursor:pointer}.Reward .footer_flex:hover .flex_rows{display:block}.Reward .footer_flex .flex_rows{box-shadow:0px 1px 4px 2px var(--theme);cursor:auto;height:200px;width:170px;position:absolute;top:-215px;background:var(--background);display:none;border-radius:8px}.Reward .footer_flex .flex_rows::after{content:"";position:absolute;bottom:-16px;left:0;right:0;margin:auto;width:0px;border:18px solid transparent;border-bottom:none;border-top-color:var(--background);filter:drop-shadow(0px 4px 2px var(--theme))}.Reward .footer_flex .flex_rows .flex-footer{overflow:hidden;margin:10px;position:relative;width:150px;height:180px}.Reward .footer_flex .flex_rows .flex-footer .RewardImg{width:900px;position:absolute;left:0}.Reward .footer_flex .flex_rows .flex-footer .RewardImg li{float:left;overflow:hidden}.Reward .footer_flex .flex_rows .flex-footer .RewardImg li img{width:150px;border-radius:2px}.Reward .footer_flex .flex_rows .flex-footer .RewardBtn{display:inline-flex;border-radius:5px;position:absolute;border:1px solid var(--classC);bottom:0px;left:0}.Reward .footer_flex .flex_rows .flex-footer .RewardBtn li:nth-of-type(n + 2){border-left:1px solid var(--classC)}.Reward .footer_flex .flex_rows .flex-footer .RewardBtn li div{height:20px;font-size:12px;color:var(--routine);padding:2px;border-radius:2px}.Reward .footer_flex .flex_rows .flex-footer .RewardBtn li:hover{cursor:pointer}.imgUpload_btn{margin:-10px auto 5px;text-align:right}.imgUpload_btn span{cursor:pointer;margin-right:5px}.top-social{position:relative;padding-top:10px;display:flex;flex-wrap:wrap;justify-content:space-around}.top-social li{width:50px;text-align:center;position:relative;height:32px}.top-social li a{height:100%}.top-social li div{height:100%}.top-social li img{height:100%}.top-social li .WeChatInner{display:none;position:absolute;box-shadow:0px 1px 4px 2px var(--theme);border-radius:var(--radius-wrap);transition:.7s all ease;background:var(--background);-webkit-transition:.7s all ease;top:-180px;left:-50px;transform:translate3d(0, 16px, 0);width:150px;height:150px;z-index:20}.top-social li .WeChatInner::before{content:"";position:absolute;bottom:-16px;left:0;right:0;margin:auto;display:inline-block;width:0px;border:18px solid transparent;border-bottom:none;border-top-color:var(--background);filter:drop-shadow(0px 4px 2px var(--theme))}.top-social li .WeChatInner img{border-radius:2px;width:140px;height:auto;margin:5px;background:none}.top-social li:hover .WeChatInner{display:block}.pe-social{width:100%;background:var(--background);border-radius:var(--radius-wrap);padding:10px 15px;box-shadow:var(--box-shadow);margin-bottom:15px}.joe_comment__respond-form .body .text{background:var(--background);border-radius:var(--radius-inner);padding:5px}.joe_comment__respond-form .foot{justify-content:flex-start}.joe_comment__respond-form .foot .joe_owo__contain{position:static}.joe_comment__respond-form .foot .joe_owo__contain .box{position:absolute;bottom:100%;margin-bottom:6px;left:0px;padding-top:5px;border:1px solid rgba(0,0,0,.15);border-color:transparent;box-shadow:0 0 10px 8px rgba(116,116,116,.08)}.joe_comment__respond-form .foot .comment_box{cursor:pointer;text-align:center;color:var(--routine);height:26px;line-height:26px;background:var(--background);opacity:.85;border-radius:13px;width:70px;margin-left:5px}.joe_comment__respond-form .foot .comment_box:hover{background:var(--theme);color:#fff}.joe_comment__respond-form .foot .comment_box .dropdown-menu{cursor:default;position:absolute;top:auto;bottom:100%;margin-bottom:6px;z-index:10;display:none;min-width:160px;padding:5px 0;font-size:14px;text-align:left;list-style:none;background-color:var(--background);color:var(--minor);background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-color:transparent;border-radius:4px;box-shadow:0 0 10px 8px rgba(116,116,116,.08)}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code{width:250px;padding:8px 10px}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image p,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code p{margin:0 0 10px}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image p textarea,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code p textarea{resize:vertical}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image .form-control,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code .form-control{display:block;width:100%;padding:6px 12px;font-size:14px;line-height:1.42857143;border:1px solid #ccc;border-radius:4px;border-color:transparent;background:var(--classD);color:#4e5358;max-height:200px;min-height:90px;box-shadow:none;transition:border-color ease-in-out .15s,background ease-in-out .15s,box-shadow ease-in-out .15s,opacity ease-in-out .3s}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image .text-right,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code .text-right{text-align:right}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image .text-right .error,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code .text-right .error{float:left;color:var(--theme);-webkit-animation:5s ease-in-out 0s infinite normal none running shaked;animation:5s ease-in-out 0s infinite normal none running shaked}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image .text-right .but,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code .text-right .but{border-radius:4px;display:inline-block;line-height:1.44;background:var(--theme);color:#fff;padding:.3em 1em}.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-image .text-right .but:hover,.joe_comment__respond-form .foot .comment_box .dropdown-menu .dropdown-code .text-right .but:hover{-webkit-animation:5s ease-in-out 0s infinite normal none running shaked;animation:5s ease-in-out 0s infinite normal none running shaked}.joe_comment__respond-form .foot .press-down{background:var(--theme) !important;color:#fff !important}@media(max-width: 768px){.joe_comment__respond-form .foot .title{display:none}.joe_comment__respond-form .foot .owo .seat,.joe_comment__respond-form .foot .comment_box{width:26px}}.HeaderImg{position:relative;width:100%;height:15rem;display:flex;margin-left:auto;margin-right:auto;justify-content:center;align-items:center;flex-direction:column}.HeaderImg.minImg{width:82.5rem;height:25rem}.HeaderImg img{-o-object-fit:cover;object-fit:cover}.HeaderImg .infomation{position:absolute;line-height:2}.HeaderImg .infomation .title{font-size:2rem;font-weight:700;color:#fff;text-align:center;text-shadow:0 .1875rem .3125rem #1c1f21;letter-spacing:.5rem}.HeaderImg .infomation .desctitle{display:flex;align-items:center;justify-content:center;text-align:center;color:#f3f3f3;font-size:1rem;padding:0 1rem;text-shadow:0 .1875rem .3125rem #1c1f21}.HeaderImg .infomation .desctitle h1{font-size:1rem}.HeaderImg .infomation .desctitle h1.post_h{font-size:1.5rem}.HeaderImg .HeaderImg_arrow{opacity:1;cursor:pointer;margin-top:1.5rem;position:absolute;left:50%;bottom:20%;width:40px;height:40px;margin-left:-20px}.HeaderImg .HeaderImg_arrow .HeaderImg_arrow__bou{transform:translateX(-50%);transition-delay:5s;-webkit-animation-duration:4s;animation-duration:4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;transform-origin:center bottom;-webkit-animation-name:go_down_animation;animation-name:go_down_animation;-webkit-animation-timing-function:cubic-bezier(0.28, 0.84, 0.42, 1);animation-timing-function:cubic-bezier(0.28, 0.84, 0.42, 1)}@-webkit-keyframes go_down_animation{0%{transform:scale(1, 1) translateY(0px)}10%{transform:scale(1.1, 0.9) translateY(0px)}30%{transform:scale(0.9, 1.1) translateY(-30px)}50%{transform:scale(1.05, 0.95) translateY(0px)}57%{transform:scale(1, 1) translateY(-7px)}64%{transform:scale(1, 1) translateY(0px)}100%{transform:scale(1, 1) translateY(0px)}}@keyframes go_down_animation{0%{transform:scale(1, 1) translateY(0px)}10%{transform:scale(1.1, 0.9) translateY(0px)}30%{transform:scale(0.9, 1.1) translateY(-30px)}50%{transform:scale(1.05, 0.95) translateY(0px)}57%{transform:scale(1, 1) translateY(-7px)}64%{transform:scale(1, 1) translateY(0px)}100%{transform:scale(1, 1) translateY(0px)}}.HeaderImg .HeaderImg_bottom{width:100%;position:absolute;left:0;bottom:-5px}.HeaderImg .HeaderImg_bottom .waves-svg{width:100%;height:6rem}.HeaderImg .HeaderImg_bottom .waves-svg .parallax>use{-webkit-animation:move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite;animation:move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite}.HeaderImg .HeaderImg_bottom .waves-svg .parallax>use:first-child{-webkit-animation-delay:-2s;animation-delay:-2s;-webkit-animation-duration:7s;animation-duration:7s;fill:var(--background);opacity:.9}.HeaderImg .HeaderImg_bottom .waves-svg .parallax>use:nth-child(2){-webkit-animation-delay:-3s;animation-delay:-3s;-webkit-animation-duration:10s;animation-duration:10s;fill:var(--background);opacity:.8}.HeaderImg .HeaderImg_bottom .waves-svg .parallax>use:nth-child(3){-webkit-animation-delay:-4s;animation-delay:-4s;-webkit-animation-duration:13s;animation-duration:13s;fill:var(--background);opacity:.9}.HeaderImg .HeaderImg_bottom .waves-svg .parallax>use:nth-child(4){-webkit-animation-delay:-5s;animation-delay:-5s;-webkit-animation-duration:20s;animation-duration:20s;fill:var(--background)}@-webkit-keyframes move-forever{0%{transform:translate3d(-90px, 0, 0)}to{transform:translate3d(85px, 0, 0)}}@keyframes move-forever{0%{transform:translate3d(-90px, 0, 0)}to{transform:translate3d(85px, 0, 0)}}.HeaderImg:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAKUlEQVQImU3IMREAIAgAwJfNkQCEsH8cijjpMf6vnXlQaIiJFx+omEBfmqIEZLe2jzcAAAAASUVORK5CYII=)}@media(max-width: 768px){.HeaderImg{height:15rem;margin-top:0}.HeaderImg.minImg{width:100%;height:15rem}.HeaderImg .infomation .title{font-size:1.2rem}.HeaderImg .infomation .desctitle h1.post_h{font-size:1rem}.HeaderImg .HeaderImg_bottom .waves-svg{height:3rem}}.joe_aside.inactive{display:none}.joe_main{position:relative}@media(max-width: 768px){.joe-stretch{display:none}}.joe-stretch{height:100%;position:absolute;top:0;right:0;padding:40px 0}.joe-stretch .contain{position:-webkit-sticky;position:sticky;transition:top .5s;-webkit-animation:swingIconSet 2s infinite linear alternate;animation:swingIconSet 2s infinite linear alternate;z-index:333}@-webkit-keyframes swingIconSet{0%{transform:rotate(-30deg)}100%{transform:rotate(30deg)}}@keyframes swingIconSet{0%{transform:rotate(-30deg)}100%{transform:rotate(30deg)}}.joe-stretch .contain::before{content:"";position:absolute;top:0;left:0;width:10px;height:25px;border-top:2px solid var(--minor);border-right:2px solid var(--minor);transition:border .35s}.joe-stretch .contain svg{position:absolute;top:25px;left:-3px;width:24px;height:24px;fill:var(--minor);cursor:pointer;transition:fill .35s}.joe-stretch .contain:hover{-webkit-animation-play-state:paused;animation-play-state:paused}.joe-stretch .contain:hover svg{fill:var(--theme)}.joe-stretch .contain:hover::before{border-color:var(--theme)}.joe-stretch.active{display:block}.joe_action_item.read_book{visibility:hidden;transform:scale(0)}.joe_action_item.read_book.active{visibility:visible;transform:scale(1)}.joe_action_item.read_book svg{transform:scale(0);opacity:0;transition:transform .85s,opacity .85s}.joe_action_item.read_book svg.active{transform:scale(1);opacity:1}.joe_action_item.directory{display:none;transform:scale(0)}.joe_action_item.directory.active{display:inline-flex;transform:scale(1)}.joe_action_item.directory svg{transform:scale(0);opacity:0;transition:transform .85s,opacity .85s}.joe_action_item.directory svg.active{transform:scale(1);opacity:1}.joe_action_item.directory .tree{opacity:0;width:15rem;height:20rem;overflow:auto;position:absolute;z-index:-10;background:var(--background);border-radius:var(--radius-wrap);box-shadow:var(--box-shadow);-webkit-animation:rebox .5s forwards;animation:rebox .5s forwards;cursor:default}@-webkit-keyframes rebox{0%{transform:scale(1);opacity:1;transform:translateY(0px);right:45px;bottom:0}100%{transform:scale(0);opacity:0;width:0;height:0}}@keyframes rebox{0%{transform:scale(1);opacity:1;transform:translateY(0px);right:45px;bottom:0}100%{transform:scale(0);opacity:0;width:0;height:0}}.joe_action_item.directory .tree.active{-webkit-animation:box .5s forwards;animation:box .5s forwards}@-webkit-keyframes box{0%{transform:scale(0);opacity:0;width:0;height:0}100%{transform:scale(1);opacity:1;transform:translateY(0px);right:45px;bottom:0}}@keyframes box{0%{transform:scale(0);opacity:0;width:0;height:0}100%{transform:scale(1);opacity:1;transform:translateY(0px);right:45px;bottom:0}}.joe_action_item.directory .tree .title{font-size:16px;border-bottom:1px solid var(--routine);color:var(--routine);position:sticky;position:-webkit-sticky;padding:5px 10px;top:0;font-weight:bold}.joe_action_item.directory .tree .text{padding:5px 10px;overflow-y:auto;overflow-x:hidden;height:85%;white-space:nowrap;text-overflow:ellipsis}.joe_action_item.directory .tree .text a{text-decoration:none;color:var(--minor);font-size:15px;line-height:1.8;cursor:pointer}.joe_action_item.directory .tree .text a:hover{color:var(--theme);border-bottom:1px solid var(--theme)}.joe_detail__count-information .meta .item .icon{fill:var(--minor);margin:0 5px} 粘贴完成之后我们继续返回到/usr/themes/Joe/assets/ js 文件夹,在Js文件夹里面创建名字为custom.min.js的文件,记住哈是文件不是文件夹! 表情图片 代码如下: document.addEventListener("DOMContentLoaded",function(){if($(".Reward").length){let e=document.querySelector(".RewardImg"),t=document.querySelectorAll(".RewardImg li img"),o=document.querySelectorAll(".RewardBtn li"),a=document.querySelectorAll(".RewardBtn li div");for(let n=0;n<a.length;n++){e.style.width=150*t.length+"px";let i=0;a[0].style.backgroundColor="var(--theme)",a[0].style.color="#fff",o[n].style.width=1/a.length*(150-(a.length+1))+"px",a[n].num=n,a[n].onclick=function(){i=this.num;for(let e=0;e<a.length;e++)a[e].style.backgroundColor="",a[e].style.color="";a[i].style.backgroundColor="var(--theme)",a[i].style.color="#fff",e.style.left=-150*i+"px"}}}if($(".WeChat").length){$WeChatA=$(".WeChatA");let e=$WeChatA.get(0).outerHTML;e=e.replace(/^<a/,"<div"),e=e.replace(/\/a>$/,"/div>"),$WeChatA.replaceWith(e),$(".WeChat").mouseenter(function(){$(".WeChat").append('<div class="WeChatInner"><img src="javascript:;" /></div>'),$(".WeChatInner img").attr("src",$(".WeChatA").attr("href"))}),$(".WeChat").mouseleave(function(){$(".WeChatInner").remove()})}if($(".Comment_Citation").length){function e(){let e=Joe.CITATION,t=/(https?:\/\/[^\s]+)/g;t.test(e)?$.ajax({url:e,dataType:"text",success:e=>$(".joe_comment__respond-form .body textarea").val(e)}):$(".joe_comment__respond-form .body textarea").val(e)}e(),$(".Comment_Citation").click(function(){e()})}if($(".Comment_ImageUrl").length&&($(".Comment_ImageUrl").click(function(e){e.stopPropagation(),$(".Comment_ImageUrl .dropdown-menu").slideToggle("fast",function(){$(".Comment_ImageUrl .comment_box").toggleClass("press-down")}),$(".dropdown-image .text-right span").text(""),$(".dropdown-image textarea").val("")}),$(document).click(function(){$(".Comment_ImageUrl .dropdown-menu").stop().slideUp("fast"),$(".Comment_ImageUrl .comment_box").removeClass("press-down")}),$(".Comment_ImageUrl .dropdown-menu").on("click",function(e){e&&e.stopPropagation?e.stopPropagation():window.event&&(window.event.cancelBubble=!0)}),$(".dropdown-image [type='submit']").click(function(){let e=$(this).parents(".dropdown-image").find("textarea"),t=e.val(),o=$(".joe_comment__respond-form .body textarea").val(),a=/\http[s]{0,1}:\/\/.([^<>"]*)(\.(jpg|jpeg|png|gif|webp))/;a.test(t)?(t="[img="+t+"]\n",$(".joe_comment__respond-form .body textarea").val(o+t),$(".Comment_ImageUrl .dropdown-menu").stop().slideUp("fast"),$(".Comment_ImageUrl .comment_box").toggleClass("press-down"),t=e.val("")):($(".dropdown-image .text-right span").addClass("error"),$(".dropdown-image .text-right span").text("格式错误!"))})),$(".Comment_Code").length&&($(".Comment_Code").click(function(e){e.stopPropagation(),$(".Comment_Code .dropdown-menu").slideToggle("fast",function(){$(".Comment_Code .comment_box").toggleClass("press-down")}),$(".dropdown-code .text-right span").text(""),$(".dropdown-code textarea").val("")}),$(document).click(function(){$(".Comment_Code .dropdown-menu").stop().slideUp("fast"),$(".Comment_Code .comment_box").removeClass("press-down")}),$(".Comment_Code .dropdown-menu").on("click",function(e){e&&e.stopPropagation?e.stopPropagation():window.event&&(window.event.cancelBubble=!0)}),$(".dropdown-code [type='submit']").click(function(){let e=$(this).parents(".dropdown-code").find("textarea"),t=e.val(),o=$(".joe_comment__respond-form .body textarea").val();""==t?($(".dropdown-code .text-right span").addClass("error"),$(".dropdown-code .text-right span").text("请输入内容!")):(t="[code]\n"+t+"\n[/code]\n",$(".joe_comment__respond-form .body textarea").val(o+t),$(".Comment_Code .dropdown-menu").stop().slideUp("fast"),$(".Comment_Code .comment_box").toggleClass("press-down"),t=e.val(""))})),$(".comment-list .substance img:not(img.owo_image)").each(function(){$(this).attr("data-src")?$(this).wrap($(`<span style="display: block;" data-fancybox="Joe" href="${$(this).attr("data-src")}"></span>`)):$(this).wrap($(`<span style="display: block;" data-fancybox="Joe" href="${$(this).attr("src")}"></span>`))}),$(".comment-list__item").length){let e=$(".joe_comment > ol.comment-list").children(".comment-list__item"),t='<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8885993286780110"crossorigin="anonymous"></script><ins class="adsbygoogle"style="display:block" data-ad-format="fluid"data-ad-layout-key="-g8-h+6z-cm-d" data-ad-client="ca-pub-8885993286780110" data-ad-slot="5758522083"></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script>';for(let o=0;o<e.length;o++)o%4==3&&$("<li class='js_ad' style='margin-bottom:10px'>"+t+"</li>").insertAfter(e[o])}if($(".joe-stretch").length&&($(".joe-stretch .contain").css("top",$(".joe_header").height()+40),$(".joe-stretch").on("click",function(){$(".joe_aside").toggleClass("inactive")})),$(".read_book").length&&($(".joe_post").length&&($(".joe_action_item.read_book").addClass("active"),$(".joe_action_item.read_book .icon-1").addClass("active")),$(".joe_action_item.read_book").on("click",function(){$(".joe_action_item.read_book svg").hasClass("icon-1 active")?($(".joe_header").css("display","none"),$(".HeaderImg").css("display","none"),$(".joe_aside").css("display","none"),$(".joe_detail").css("backgroundColor","var(--reading)"),$(".joe_detail__related").css("display","none"),$(".joe_comment").css("display","none"),$(".joe_footer").css("display","none"),$(".joe-stretch").css("display","none"),$(".joe_detail__article").css("font-size","20px")):($(".joe_header").removeAttr("style"),$(".HeaderImg").removeAttr("style"),$(".joe_aside").removeAttr("style"),$(".joe_detail").removeAttr("style"),$(".joe_detail__related").removeAttr("style"),$(".joe_comment").removeAttr("style"),$(".joe_footer").removeAttr("style"),$(".joe-stretch").removeAttr("style"),$(".joe-stretch").removeAttr("style"),$(".joe_detail__article").removeAttr("style")),$(".joe_action_item.read_book .icon-1").toggleClass("active"),$(".joe_action_item.read_book .icon-2").toggleClass("active")})),$(".joe_post").length&&$(".joe_detail__article").find("h2,h3,h4,h5,h6").length){$("body").outerWidth()>=768?($(".joe_action_item.directory").addClass("active"),$(".joe_action_item.directory .icon-2").addClass("active"),$(".joe_action_item.directory .tree").addClass("active")):($(".joe_action_item.directory").addClass("active"),$(".joe_action_item.directory .icon-1").addClass("active"));let e=$(".joe_detail__article").find("*"),t=0;for(let o=0;o<e.length;o++)if("h"==e[o].localName.charAt(0)&&!isNaN(e[o].localName.charAt(1))){e[o].setAttribute("id","t"+t);let a=parseInt(e[o].localName.charAt(1))-2;for(;a--&&!(a<0);)$(".directory .tree .text").append(" ");$(".directory .tree .text").append("<a href='#t"+t+"'>"+$(e[o]).text()+"</a></br>"),t++}$(".joe_action_item.directory").on("click",function(){$(".joe_action_item.directory .tree").toggleClass("active"),$(".joe_action_item.directory .icon-1").toggleClass("active"),$(".joe_action_item.directory .icon-2").toggleClass("active")}),$(".directory .tree").on("click",function(e){e&&e.stopPropagation?e.stopPropagation():window.event&&(window.event.cancelBubble=!0)}),$(".directory .tree a").bind("click touch",function(){$("html,body").animate({scrollTop:$($(this).attr("href")).offset().top-65},1e3)})}$(".HeaderImg_arrow").length&&$(".HeaderImg_arrow").on("click",function(){$("body").outerWidth()>=768&&window.scrollTo({top:300,behavior:"smooth"})})});{function loveSiteTime(e,t){window.setTimeout(function(){loveSiteTime(e,t)},1e3);let o=1e3,a=60*o,n=60*a,i=24*n,r=365*i,s=new Date,l=s.getFullYear(),d=s.getMonth()+1,c=s.getDate(),m=s.getHours(),p=s.getMinutes(),_=s.getSeconds(),g=Date.UTC(2019,10,19,21,0,0);t&&(g=Date.UTC(t.split("-")[0],t.split("-")[1],t.split("-")[2],t.split("-")[3],t.split("-")[4],t.split("-")[5]));let h=Date.UTC(l,d,c,m,p,_),f=h-g,u=Math.floor(f/r),C=Math.floor(f/i-365*u),y=Math.floor((f-(365*u+C)*i)/n),v=Math.floor((f-(365*u+C)*i-y*n)/a),w=Math.floor((f-(365*u+C)*i-y*n-v*a)/o);$("#loveSiteTime4Aside")&&$("#loveSiteTime4Aside").html(e+"</br>"+u+"年"+C+"天"+y+"时"+v+"分"+w+"秒啦</br>"),$("#loveSiteTime4Header")&&$("#loveSiteTime4Header").html(e+"</br>"+u+"年"+C+"天"+y+"时"+v+"分"+w+"秒啦</br>")}}保存之后,去引入这两个文件。 在include.php中引入css\js文件文件路径:/usr/themes/Joe/ public 找到include.php文件并打开,在下面图片中的相应位置添加以下代码: title="m8y9t698.png"图片 <script src="<?php $this->options->themeUrl('assets/js/custom.min.js'); ?>"></script><link rel="stylesheet" href="<?php $this->options->themeUrl('assets/css/custom.min.css'); ?>">总结 创建必要的文件custom.php,引入设置,即可在joe后台看见并使用自定义设置功能,以后添加开关就直接在custom.php文件中添加就行了,不用在funstions.php文件去找地方添加了。快去试试吧! -
在网页中运行EXE程序的完整指南(2025年最新方案) 随着Web技术的快速发展,将传统桌面应用程序(EXE)集成到网页中的需求日益增多。本文将详细介绍6种主流实现方案,涵盖从传统技术到现代云原生的完整解决方案。 一、WebAssembly方案(现代推荐) 实现原理 通过Emscripten工具链将C/C++代码编译为WASM模块,利用浏览器的高性能虚拟机执行原生代码。 实施步骤 环境准备 安装Emscripten SDK: git clone https://github.com/emscripten-core/emsdk.git ./emsdk install latest ./emsdk activate latest 编译转换 使用emcc编译器生成WASM模块: emcc main.c -o app.html -s WASM=1 网页集成 <!DOCTYPE html> <script> fetch('app.wasm') .then(res => res.arrayBuffer()) .then(bytes => WebAssembly.instantiate(bytes)) .then(results => { results.instance.exports._start(); }); </script> 优势与局限 ✅ 性能接近原生,安全沙箱机制 ❗️ 需要源码支持,无法直接转换二进制EXE 二、Electron桌面应用集成 实现原理 通过Node.js的child_process模块调用本地EXE文件,结合Chromium渲染引擎构建混合应用。 开发流程 创建基础项目 npm init electron-app@latest my-app 添加EXE调用功能 const { exec } = require('child_process'); function launchExe() { exec('path/to/program.exe', (err, stdout) => { if(err) console.error(err); }); } 打包部署 使用electron-forge生成安装包: npm run make 安全建议 需签署应用证书防止安全警告 建议通过IPC机制隔离敏感操作 三、云端虚拟化方案 实施方案 服务器部署 推荐使用腾讯云CVM(https://cloud.tencent.com/product/cvm)部署应用 WebRTC串流配置 const peer = new RTCPeerConnection(); navigator.mediaDevices.getDisplayMedia() .then(stream => peer.addStream(stream)); 客户端接入 集成NoVNC库实现浏览器访问: <script src="https://novnc.com/noVNC/vnc.js"></script> <div id="vnc-canvas"></div> 成本分析 资源类型月成本估算4核8G云服务器¥4805Mbps带宽¥900四、浏览器插件方案(传统方式) NPAPI插件开发 #include <npapi.h> NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved) { // 初始化代码 return NPERR_NO_ERROR; }注册表配置 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins\@mycompany.com/MyPlugin] "Description"="My EXE Runner" "Path"="C:\\plugin\\npMyPlugin.dll"浏览器支持现状 浏览器支持状态Chrome❌ 已弃用Firefox❌ 已弃用Edge❌ 不支持五、服务器端执行方案 CGI接口配置 # adduser.py import cgi form = cgi.FieldStorage() print("Content-type: text/html\n") print(f"<h1>Welcome {form['username'].value}</h1>")Nginx配置 location /cgi-bin/ { gzip off; fastcgi_pass unix:/var/run/fcgiwrap.socket; include fastcgi_params; }安全防护 设置chroot jail环境 使用Docker隔离进程 配置严格的权限控制 六、ClickOnce部署方案 项目配置 <!-- MyApp.csproj --> <PropertyGroup> <PublishUrl>http://cdn.6v6.ren/apps/</PublishUrl> <Install>true</Install> <PublisherName>6V6 Tech</PublisherName> </PropertyGroup>签名证书 New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=6V6 Software" -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "Cert:\CurrentUser\My"技术选型建议表 方案开发难度安全性跨平台适用场景WebAssembly★★★★★★★★★是高性能计算Electron★★★★★★☆是混合应用云端虚拟化★★★★★★☆是企业级应用ClickOnce★★★★★☆否Windows内部系统访问 6v6-博客网 获取更多技术干货 涵盖前沿技术解析、开发实战经验、架构设计方法论等专业内容版权声明:本文采用CC BY-NC-SA 4.0协议,转载请注明出处 -
📶 企业级网络压力测试全流程手册 🔍 1. 测试准备阶段 1.1 环境预检 # env_check.py import platform, socket, subprocess def system_info(): print(f"{'='*40}") print(f"🖥️ 系统信息".center(40)) print(f"操作系统\t{platform.system()} {platform.release()}") print(f"主机名\t{socket.gethostname()}") print(f"Python\t{platform.python_version()}") def network_info(): print(f"\n{'='*40}") print(f"🌐 网络配置".center(40)) subprocess.run(["ipconfig", "/all"] if platform.system() == "Windows" else ["ifconfig"]) system_info() network_info1.2 工具矩阵 工具类别Windows安装命令Linux安装命令核心功能带宽测试choco install iperf3sudo apt install iperf3网络吞吐量测量端口扫描choco install nmapsudo apt install nmap服务发现与漏洞检测流量分析choco install wiresharksudo apt install wireshark数据包捕获与分析高级PingInstall-Module PsPingsudo apt install fping精确延迟测量🧪 2. 基础测试套件 2.1 增强版Ping测试 # ping_advanced.ps1 $targets = @( "gateway", "114.114.114.114", "8.8.8.8", "www.baidu.com" ) $results = foreach ($t in $targets) { $ping = Test-Connection -TargetName $t -Count 10 -ErrorAction SilentlyContinue [PSCustomObject]@{ Target = $t AvgLatency = ($ping.ResponseTime | Measure-Object -Average).Average PacketLoss = (10 - $ping.Count)/10*100 } } $results | Format-Table -AutoSize $results | Export-Csv -Path "ping_results.csv" -NoTypeInformation2.2 智能端口扫描 # port_scanner.py import socket from concurrent.futures import ThreadPoolExecutor def scan_port(host, port): try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(2) result = s.connect_ex((host, port)) return port, result == 0 except Exception as e: return port, f"Error: {str(e)}" def full_scan(host, ports=range(1, 1025)): with ThreadPoolExecutor(max_workers=100) as executor: results = executor.map(lambda p: scan_port(host, p), ports) for port, status in results: if status is True: print(f"✅ Port {port}: OPEN") elif "Error" not in str(status): print(f"❌ Port {port}: CLOSED") if __name__ == "__main__": full_scan("target.example.com")🚀 3. 进阶测试方案 3.1 全方位带宽压测 # bandwidth_test.sh #!/bin/bash SERVER_IP="192.168.1.100" DURATION=60 THREADS=10 echo "🔄 启动iPerf3服务端..." iperf3 -s -p 5201 & echo "⏳ 进行TCP上行测试..." iperf3 -c $SERVER_IP -t $DURATION -P $THREADS -J > tcp_upload.json echo "⏳ 进行TCP下行测试..." iperf3 -c $SERVER_IP -t $DURATION -P $THREADS -R -J > tcp_download.json echo "⏳ 进行UDP测试..." iperf3 -c $SERVER_IP -t $DURATION -u -b 1G -J > udp_test.json echo "📊 生成测试报告..." python3 generate_report.py tcp_upload.json tcp_download.json udp_test.json pkill iperf33.2 智能流量分析 # 关键过滤条件库 /* 基础过滤 */ icmp || dns || tcp.port == 80 || tcp.port == 443 /* 异常检测 */ tcp.analysis.retransmission || tcp.analysis.duplicate_ack || tcp.analysis.zero_window /* 应用层分析 */ http.request.method == "POST" || ssl.handshake.type == 1 || dns.qry.name contains "api"🛠️ 4. 深度问题排查 4.1 网络路径诊断 # network_path.ps1 function Trace-NetworkPath { param ( [string]$Target, [int]$MaxHops = 30, [int]$Timeout = 1000 ) $results = tracert -d -h $MaxHops -w $Timeout $Target | Where-Object { $_ -match "\d+\s+ms" } | ForEach-Object { $parts = $_ -split "\s+" [PSCustomObject]@{ Hop = $parts[0] IP = $parts[-2] Latency = $parts[-3..-1] -join "/" } } $results | Export-Csv -Path "tracert_$Target.csv" -NoTypeInformation return $results } Trace-NetworkPath -Target "www.example.com" -MaxHops 154.2 综合连接测试 # connection_test.py import pycurl from io import BytesIO def test_endpoint(url): buffer = BytesIO() c = pycurl.Curl() c.setopt(c.URL, url) c.setopt(c.WRITEDATA, buffer) c.setopt(c.TIMEOUT, 10) metrics = {} c.setopt(c.WRITEHEADER, lambda h: metrics.update({ 'http_code': c.getinfo(c.HTTP_CODE), 'connect_time': c.getinfo(c.CONNECT_TIME), 'total_time': c.getinfo(c.TOTAL_TIME) })) try: c.perform() return { 'status': 'success', 'metrics': metrics, 'response': buffer.getvalue().decode() } except Exception as e: return { 'status': 'failed', 'error': str(e) } finally: c.close() print(test_endpoint("https://www.baidu.com"))🤖 5. 自动化运维方案 5.1 智能监控系统 # network_monitor.py import schedule import time import json from datetime import datetime class NetworkMonitor: def __init__(self): self.config = self.load_config() def load_config(self): with open('config.json') as f: return json.load(f) def run_tests(self): test_results = {} for test in self.config['tests']: # 执行各类测试... test_results[test['name']] = self.execute_test(test) self.generate_report(test_results) def execute_test(self, test_config): # 实现具体测试逻辑 pass def generate_report(self, results): filename = f"report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.html" # 生成报告... print(f"报告已生成: {filename}") if __name__ == "__main__": monitor = NetworkMonitor() schedule.every(15).minutes.do(monitor.run_tests) while True: schedule.run_pending() time.sleep(1)5.2 可视化报告模板 <!-- report_template.html --> <!DOCTYPE html> <html> <head> <title>网络测试报告 - {{ date }}</title> <style> .dashboard { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } .metric-card { border: 1px solid #ddd; padding: 15px; border-radius: 5px; } .critical { background-color: #ffebee; } </style> </head> <body> <h1>网络健康报告</h1> <div class="dashboard"> {% for test in tests %} <div class="metric-card {% if test.status == 'critical' %}critical{% endif %}"> <h3>{{ test.name }}</h3> <p>状态: <strong>{{ test.status }}</strong></p> <p>延迟: {{ test.latency }} ms</p> <p>时间: {{ test.timestamp }}</p> </div> {% endfor %} </div> </body> </html>🏢 6. 企业最佳实践 6.1 网络优化路线图 gantt title 网络优化实施计划 dateFormat YYYY-MM-DD section 第一阶段 现状评估 :a1, 2023-08-01, 7d 工具部署 :after a1, 5d section 第二阶段 基线测试 :2023-08-15, 10d 问题修复 :2023-08-20, 14d section 第三阶段 监控上线 :2023-09-05, 7d 团队培训 :2023-09-10, 3d6.2 企业级检查清单 基础设施 [ ] 核心交换机冗余配置 [ ] 防火墙规则审计 [ ] UPS电源测试 性能标准 [ ] 办公网络延迟 <50ms [ ] 数据中心丢包率 <0.1% [ ] 跨境专线可用性 >99.9% 安全合规 [ ] 网络设备固件更新 [ ] 访问控制列表(ACL)审核 [ ] 安全日志保留90天 📎 附录资源 A. 速查手册 # 常用诊断命令 ping -c 5 target.com # 基础连通性 mtr --report target.com # 实时路由追踪 ss -tulnp # 活动连接查看 tcpdump -i eth0 port 80 -w capture.pcap # 流量捕获B. 技术支持 🌐 知识库: https://6v6.ren C. 版本历史 版本日期更新说明v2.12023-07-15新增自动化监控方案v2.02023-06-01企业级最佳实践章节v1.02023-05-10初始版本发布 -
专业垫音制作终极指南 一、垫音的基本概念与作用 垫音(Backing Vocals/Harmony)是音乐制作中用于增强主唱层次感的声音层,通常采用和声、八度叠加或反向混响等技术。其主要作用包括: 丰富主唱的情感表达 增强音乐的立体感和空间感 填补主唱频率空缺(如高频空气感或低频厚度) 二、垫音制作全流程 1. 前期准备 录音设备: 麦克风:推荐电容麦(如Rode NT1-A、Neumann U87) 声卡:Focusrite Scarlett 2i2(入门级)、Universal Audio Apollo(专业级) 监听耳机:Audio-Technica ATH-M50x 录音环境: 使用吸音棉/隔音板减少房间反射 保持环境噪音低于-60dB 2. 和声编排 基础理论: 三度和声(最常用) 五度和声(增强空旷感) 八度叠加(增加厚度) 工具推荐: Hooktheory(和弦分析软件) Scaler 2(自动和声生成插件) 三、垫音录制技巧 1. 多轨录制 录制3-5遍相同旋律,分别做以下处理: 中央声像(主垫音) 左右偏移±30%(增强立体感) 高八度/低八度(频段填充) 2. 动态控制 使用压缩器(推荐Waves CLA-76): 参数建议: - Ratio: 4:1 - Attack: 10ms - Release: 100ms - Threshold: -18dB 3. 特殊技巧 反向混响: 复制垫音轨道 反转音频 添加长混响(>3s) 再次反转 AI和声生成: iZotope VocalSynth 2(自动和声) Waves Harmony(实时和声引擎) 四、后期处理 1. 音高校正 工具平台特点Melodyne 5Win/MacDNA编辑技术Auto-Tune ProWin/Mac实时修正Celemony Direct Note AccessWin/Mac多音符编辑2. 混音处理 EQ调整: 建议频段: - 80Hz以下:切除 - 300-500Hz:适当衰减(避免浑浊) - 5-8kHz:提升2dB(增加空气感) 空间效果: 混响:Valhalla Room(预设:Medium Hall) 延迟:Soundtoys EchoBoy(1/8 dotted) 五、专业软件推荐与下载 1. 多平台综合工具 软件平台下载链接特点WavePadWin/Mac/Android/iOS官网全功能音频编辑:cite[4]Soundop Audio EditorWin安下载多轨混音专业版:cite[5]2. 移动端专用 软件平台下载链接特点荐音AndroidMDPDA免费音频剪辑:cite[1]混音制作iOS/Android25PP音效合成社区:cite[3]3. AI辅助工具 软件平台下载链接特点VocalSynth 2Win/MaciZotope官网AI和声生成Waves HarmonyWin/MacWaves官网实时和声引擎六、分平台教程 1. Windows/Mac专业流程 1. 录制干声(24bit/48kHz) 2. 导入DAW(如Cubase/Logic Pro) 3. 使用Melodyne修正音高 4. 加载VocalSynth生成和声 5. 混音导出(建议WAV格式)2. Android/iOS快速制作 1. 安装"混音制作"APP:cite[3] 2. 点击"新建项目"→"导入主唱" 3. 选择"自动和声"功能 4. 调整声像和混响 5. 导出MP3七、常见问题解决 问题解决方案垫音与主唱不融合检查EQ冲突(1-3kHz)和声不自然减少修音强度(保留5%原始偏差)空间感不足增加0.3s预延迟的板式混响八、进阶资源 书籍:《混音指南》下载:cite[2] 社区:荐音APP创作社区:cite[1] 硬件:Antelope Audio Zen Go(专业录音接口) 网站宣传 欢迎访问 6v6博客 获取更多音乐制作教程! -
JavaScript 的异步编程如何实现? JavaScript 的异步编程如何实现? JavaScript 是单线程语言,但通过异步编程可以实现非阻塞操作,提高程序的性能和响应速度。本文将介绍 JavaScript 异步编程的几种常见方法。 1. 回调函数(Callback) 1.1 基本概念 回调函数是 JavaScript 异步编程的基础,通过将函数作为参数传递给另一个函数,在异步操作完成后执行。 1.2 示例代码 function fetchData(callback) { setTimeout(() => { const data = "Hello, World!"; callback(data); }, 1000); } fetchData((data) => { console.log(data); // 输出:Hello, World! });1.3 优缺点 优点:简单易用。 缺点:容易导致回调地狱(Callback Hell),代码难以维护。 2. Promise 2.1 基本概念 Promise 是 ES6 引入的异步编程解决方案,用于处理异步操作的成功或失败。 2.2 示例代码 function fetchData() { return new Promise((resolve, reject) => { setTimeout(() => { const data = "Hello, World!"; resolve(data); }, 1000); }); } fetchData() .then((data) => { console.log(data); // 输出:Hello, World! }) .catch((error) => { console.error(error); });2.3 优缺点 优点:链式调用,避免回调地狱。 缺点:仍然需要处理 .then 和 .catch。 3. Async/Await 3.1 基本概念 Async/Await 是 ES8 引入的语法糖,基于 Promise,使异步代码看起来像同步代码。 3.2 示例代码 async function fetchData() { return new Promise((resolve) => { setTimeout(() => { const data = "Hello, World!"; resolve(data); }, 1000); }); } async function main() { try { const data = await fetchData(); console.log(data); // 输出:Hello, World! } catch (error) { console.error(error); } } main();3.3 优缺点 优点:代码简洁,易于理解和维护。 缺点:需要支持 ES8 的环境。 4. 事件监听(Event Listener) 4.1 基本概念 通过事件监听实现异步编程,常用于 DOM 操作和 Node.js 的事件驱动编程。 4.2 示例代码 document.getElementById("myButton").addEventListener("click", () => { console.log("Button clicked!"); });4.3 优缺点 优点:适用于事件驱动的场景。 缺点:不适合复杂的异步逻辑。 5. Generator 函数 5.1 基本概念 Generator 函数是 ES6 引入的异步编程解决方案,通过 yield 关键字暂停和恢复函数执行。 5.2 示例代码 function* fetchData() { yield new Promise((resolve) => { setTimeout(() => { resolve("Hello, World!"); }, 1000); }); } const generator = fetchData(); generator.next().value.then((data) => { console.log(data); // 输出:Hello, World! });5.3 优缺点 优点:灵活控制异步流程。 缺点:语法复杂,使用场景有限。 6. 注意事项 错误处理:确保正确处理异步操作中的错误,避免程序崩溃。 性能优化:避免不必要的异步操作,提高程序性能。 兼容性:根据目标环境选择合适的异步编程方法。 了解更多技术内容,请访问:6v6博客 -
机器学习入门指南:从 TensorFlow 到 PyTorch 机器学习入门指南:从 TensorFlow 到 PyTorch 机器学习(Machine Learning)是人工智能的核心领域之一,近年来在图像识别、自然语言处理、推荐系统等领域取得了巨大进展。本文将从基础概念入手,介绍机器学习的核心知识,并带你快速上手两大主流框架:TensorFlow 和 PyTorch。 机器学习基础 什么是机器学习? 机器学习是一种通过数据训练模型,使计算机能够自动学习和改进的技术。它主要分为三大类: 监督学习:通过标注数据训练模型,例如分类和回归。 无监督学习:通过未标注数据发现模式,例如聚类和降维。 强化学习:通过与环境交互学习策略,例如游戏 AI 和机器人控制。 机器学习的基本流程 数据收集:获取高质量的数据是机器学习的基础。 数据预处理:清洗数据、处理缺失值、标准化等。 模型选择:根据任务选择合适的算法,例如线性回归、决策树、神经网络等。 模型训练:使用训练数据拟合模型。 模型评估:使用测试数据评估模型性能。 模型优化:调整超参数或改进模型结构。 模型部署:将训练好的模型应用到实际场景中。 TensorFlow 入门 TensorFlow 是由 Google 开发的开源机器学习框架,广泛应用于深度学习领域。 1. 安装 TensorFlow 使用 pip 安装 TensorFlow: pip install tensorflow2. 创建一个简单的神经网络 以下是一个使用 TensorFlow 构建和训练神经网络的示例: import tensorflow as tf from tensorflow.keras import layers, models # 加载数据集 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 # 归一化 # 构建模型 model = models.Sequential([ layers.Flatten(input_shape=(28, 28)), # 输入层 layers.Dense(128, activation='relu'), # 隐藏层 layers.Dropout(0.2), # 防止过拟合 layers.Dense(10, activation='softmax') # 输出层 ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5) # 评估模型 model.evaluate(x_test, y_test)3. TensorFlow 的优势 强大的生态系统:支持从研究到生产的全流程。 跨平台支持:可以在 CPU、GPU 和 TPU 上运行。 丰富的工具:如 TensorBoard 可视化工具。 PyTorch 入门 PyTorch 是由 Facebook 开发的开源机器学习框架,以其灵活性和动态计算图著称。 1. 安装 PyTorch 使用 pip 安装 PyTorch: pip install torch torchvision2. 创建一个简单的神经网络 以下是一个使用 PyTorch 构建和训练神经网络的示例: import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 加载数据集 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) # 构建模型 class SimpleNN(nn.Module): def __init__(self): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(28 * 28, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = x.view(-1, 28 * 28) # 展平输入 x = torch.relu(self.fc1(x)) x = self.fc2(x) return x model = SimpleNN() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练模型 for epoch in range(5): for images, labels in train_loader: optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() print(f'Epoch {epoch + 1}, Loss: {loss.item()}')3. PyTorch 的优势 动态计算图:更灵活,适合研究和实验。 Pythonic 风格:代码更易读、易写。 强大的社区支持:丰富的教程和资源。 TensorFlow 和 PyTorch 的比较 特性TensorFlowPyTorch计算图静态计算图动态计算图易用性学习曲线较陡峭更 Pythonic,易于上手生态系统更成熟,工具丰富社区增长迅速,资源丰富部署支持更适合生产环境更适合研究和实验学习资源推荐 TensorFlow 官方教程:https://www.tensorflow.org/tutorials PyTorch 官方教程:https://pytorch.org/tutorials 经典书籍: 《深度学习》(花书) 《动手学深度学习》(PyTorch 版) 在线课程: Coursera 上的《机器学习》课程(Andrew Ng) Fast.ai 的《Practical Deep Learning for Coders》 未来展望 机器学习正在快速发展,未来可能会在以下领域取得突破: 自动化机器学习(AutoML):让机器学习更加普及。 联邦学习:保护数据隐私的同时实现模型训练。 量子机器学习:结合量子计算提升计算能力。 了解更多技术内容,请访问:6v6博客 -
从零开始搭建私有云服务器 从零开始搭建私有云服务器 1. 准备工作 硬件要求: 一台性能足够的服务器(可以是物理机或虚拟机)。 建议配置:至少 4 核 CPU、8GB 内存、100GB 硬盘。 操作系统:推荐使用 Ubuntu Server 20.04 LTS。 网络环境:确保服务器有稳定的公网 IP 或内网穿透能力。 2. 安装操作系统 下载 Ubuntu Server 20.04 LTS 镜像:https://ubuntu.com/download/server。 使用工具(如 Rufus)将镜像写入 U 盘,制作启动盘。 将 U 盘插入服务器,启动并安装 Ubuntu Server。 按照提示完成系统安装,设置用户名和密码。 3. 配置网络 登录服务器,编辑网络配置文件: sudo nano /etc/netplan/01-netcfg.yaml 配置静态 IP 或 DHCP,示例如下: network: version: 2 ethernets: eth0: dhcp4: no addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] 保存并应用配置: sudo netplan apply 4. 安装 Docker 更新系统包: sudo apt update && sudo apt upgrade -y 安装 Docker: sudo apt install apt-transport-https ca-certificates curl software-properties-common -y curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io -y 启动 Docker 并设置开机自启: sudo systemctl start docker && sudo systemctl enable docker 5. 部署私有云服务 安装 Docker Compose: sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d')" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose 创建私有云服务配置文件(如 Nextcloud): mkdir nextcloud && cd nextcloud nano docker-compose.yml 在 docker-compose.yml 中添加以下内容: version: '3' services: nextcloud: image: nextcloud container_name: nextcloud restart: always ports: - 8080:80 volumes: - nextcloud_data:/var/www/html environment: - MYSQL_HOST=db - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=yourpassword db: image: mariadb container_name: nextcloud_db restart: always volumes: - db_data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=yourpassword - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=yourpassword volumes: nextcloud_data: db_data: 启动服务: sudo docker-compose up -d 6. 访问私有云 在浏览器中输入 http://服务器IP:8080,访问 Nextcloud。 按照提示完成初始化设置,创建管理员账户。 7. 安全加固 配置防火墙: sudo ufw allow ssh sudo ufw allow 8080 sudo ufw enable 启用 HTTPS:使用 Let's Encrypt 免费 SSL 证书。 更多关于私有云搭建的技术分享和实用教程,欢迎访问我的博客:6v6 博客,一起探索技术的无限可能! -
《神话时代:重述版》中文版:众神与人类的史诗碰撞! 💡 你是否期待一款融合神话与策略的经典游戏?今天推荐《神话时代:重述版》中文版!✨ 游戏介绍 由屡获殊荣的《帝国时代》系列的创作者精心制作。 超越历史,进入一个众神、怪物和人类碰撞的神话时代。 ✨ 版本介绍 版本号:v100.18.7603.0 容量:28.2GB 语言:官方简体中文 支持设备:键盘、鼠标、手柄 ✨ 下载地址 百度网盘:https://pan.baidu.com/s/1zVwmlta6xF0ZEpr-l2rrXw?pwd=f5cn 介绍图: 👉 更多关于《神话时代:重述版》的游戏攻略和资源分享,欢迎访问我的博客:6v6 博客(https://6v6.ren)