找到
171
篇与
技术教程
相关的结果
- 第 14 页
-
-
使用JavaScript动态生成网站文章目录及内容滚动跟随效果 由于之前使用的文章导读插件性能过于臃肿,导致资源消耗高且难以维护,因此我决定自行开发一个轻量级的文章导读功能。参考了郄郄私语的 案例文章,我实现了以下四个主要功能: 根据文章内容自动生成目录 点击目录跳转至相应章节 滚动阅读时,目录随当前章节自动切换 目录跟随文章内容滚动 目标 本文旨在实现以下功能: 自动生成文章目录 点击目录跳转至对应章节 目录根据当前阅读章节自动高亮 目录随文章内容滚动 根据文章内容自动生成目录 实现自动生成目录的前提是文章内容须有清晰的层次结构,这需要使用 h1 至 h6 标签来定义标题。通过 JavaScript,我们可以提取这些标题来生成目录: var articleTitleList = $('.joe_detail__article').find('h1, h2, h3, h4, h5, h6'); articleTitleList.each(function() { const headingLevel = $(this).prop("tagName").toLowerCase(); const headingName = $(this).text().trim(); console.log(headingLevel, headingName); $('#catalogs').append(`<div class="catalog catalog-${headingLevel}">${headingName}</div>`); });在样式表中为目录项定义缩进样式: .catalog-h2 { margin-left: 1em; } .catalog-h3 { margin-left: 2em; } .catalog-h4 { margin-left: 3em; } .catalog-h5 { margin-left: 4em; } .catalog-h6 { margin-left: 5em; }点击目录跳转至对应章节 点击目录跳转至相应章节可以通过为每个标题添加锚点。我们将在 h1 至 h6 标签上添加 id: articleTitleList.each(function() { const headingName = $(this).text().trim(); const enHeadingName = encodeURIComponent(headingName); $(this).attr('id', `${enHeadingName}`); $('.posts-nav-lists>ul').append(`<li><a href="#${enHeadingName}">${headingName}</a></li>`); });目录自动切换至当前章节 为了让目录随着阅读位置自动切换,我们将监控用户的滚动位置并依据此更新目录的高亮条目: const catalogTrack = () => { let $currentHeading = $('h1'); articleTitleList.each(function() { const $heading = $(this); if ($heading.offset().top - $(document).scrollTop() > 20) return false; // 退出条件 $currentHeading = $heading; }); // 更新目录状态 const anchorName = $currentHeading.attr('id'); $('.posts-nav-lists>ul>li').removeClass('active'); $(`#title-${anchorName}`).parent().addClass('active'); };目录随文章内容滚动 为确保当前章节始终可见,我们控制目录区域的滚动: if ($catalog.length > 0) { $('.posts-nav-box').scrollTop($catalog[0].offsetTop - 50); // 确保可见 }性能优化 为了避免在滚动时频繁调用 catalogTrack 导致性能降低,我们可以使用函数节流技术: function throttle(fn, wait) { let lastTime = 0; return function() { const now = Date.now(); if (now - lastTime >= wait) { fn.apply(this, arguments); lastTime = now; } }; } window.addEventListener('scroll', throttle(catalogTrack, 500)); // 每500毫秒调用一次自定义跳转行为 考虑到固定导航条可能遮挡目标章节,我们可以自定义跳转行为,确保目标元素不会被遮挡: document.querySelectorAll('.posts-nav-lists>ul>li>a').forEach(link => { link.addEventListener('click', (event) => { event.preventDefault(); // 阻止默认跳转 const targetId = link.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); const headerHeight = document.querySelector('.joe_header').offsetHeight; const scrollTop = $(targetElement).offset().top - headerHeight - 10; window.scrollTo({ top: scrollTop, behavior: 'smooth' }); }); });总结 本文记录了生成和控制博客文章目录的思路与方法,针对不同需求可能会有其他解决方案。欢迎大家在评论区讨论和分享建议,感谢阅读! 完整代码示例 HTML 部分 <section class="joe_aside__item posts-nav-box"> <div class="joe_aside__item-title"><i class="fa fa-list-ul"></i><span class="text">文章目录</span><span class="line"></span></div> <div class="joe_aside__item-contain"> <div class="posts-nav-lists"><ul class="bl nav"></ul></div> </div> </section>JavaScript 部分 var articleTitleList = $('.joe_detail__article').find('h1, h2, h3, h4, h5, h6'); if (articleTitleList.length > 0) { // 目录生成及事件绑定 (function () { for (let heading of articleTitleList) { const headingLevel = heading.tagName.toUpperCase(); const $heading = $(heading); // console.log($heading); const headingName = $heading.text().trim(); const enHeadingName = encodeURIComponent(headingName); $heading.attr('id', `${enHeadingName}`); $('.posts-nav-lists>ul').append(`<li class="n-${headingLevel}"><a id="title-${enHeadingName}" href="#${enHeadingName}">${headingName}</a></li>`); // const anchorName = $heading.attr('id'); // console.log(headingLevel, headingName); } if (Joe.IS_MOBILE) { $('.joe_action').append(`<div class="joe_action_item posts-nav-switcher"><i class="fa fa-list-ul"></i></div>`) let joe_aside = $('.joe_aside .joe_aside__item.posts-nav-box .joe_aside__item-contain').html(); $('.joe_aside .joe_aside__item.posts-nav-box').remove(); let html = document.createElement('div'); html.className = 'posts-nav-box'; html.innerHTML = joe_aside; // console.log(html); $('.posts-nav-switcher').append(html); $('.joe_action_item .posts-nav-box').css({ 'position': 'absolute', 'display': 'none', 'right': '50px', 'bottom': '0px', 'padding': '15px', 'border-radius': 'var(--radius-wrap)', 'box-shadow': '0 0 10px 8px var(--main-shadow)', 'overflow': 'auto', 'max-height': '50vh', 'max-width': '80vw' }) $('.joe_action_item.posts-nav-switcher').click(() => { $('.joe_action_item.posts-nav-switcher .posts-nav-box').fadeToggle(200); }); } const catalogTrack = () => { // console.log('页面滚动标题监听'); let $currentHeading = $('h1'); for (let heading of articleTitleList) { const $heading = $(heading); if ($heading.offset().top - $(document).scrollTop() > $('.joe_header').height()) { break; } $currentHeading = $heading; const anchorName = $currentHeading.attr('id'); const $catalog = $(document.getElementById(`title-${anchorName}`)).parent(); if (!$catalog.hasClass('active')) { $('.posts-nav-lists>ul>li').removeClass('active'); $catalog.addClass('active'); } if ($catalog.length > 0) { if ($('.posts-nav-box .joe_aside__item-contain').length > 0) { $('.posts-nav-box .joe_aside__item-contain').scrollTop($catalog[0].offsetTop - 50); } else { $('.posts-nav-box').scrollTop($catalog[0].offsetTop - 50); } } else { $('.posts-nav-lists').scrollTop(0); } } }; /** * 函数节流,时间戳方案 * @param {*} fn * @param {*} wait * @returns */ function throttle(fn, wait) { var pre = Date.now(); return function () { var context = this; var args = arguments; var now = Date.now(); if (now - pre >= wait) { fn.apply(context, args); pre = Date.now(); } } } window.addEventListener('scroll', throttle(() => { catalogTrack(); }, 500)); // 监听文章目录a标签点击 document.querySelectorAll('.posts-nav-lists>ul>li>a').forEach(link => { link.addEventListener('click', (event) => { event.preventDefault(); // 阻止默认跳转行为 // 获取目标元素 ID const targetId = link.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); if (targetElement) { // 获取目标元素距离页面顶部的距离 const targetTop = $(targetElement).offset().top; // console.log(targetTop); // 获取顶栏高度,考虑动态高度变化和内部元素 const headerHeight = document.querySelector('.joe_header').offsetHeight; // 计算滚动位置 const scrollTop = (targetTop - headerHeight) - 10; // 预留10px的美观距离 window.scrollTo({ top: scrollTop, behavior: 'smooth' }); } else { console.error('目标元素未找到:', targetId); } }); }); }()) } else { $('.joe_aside__item.posts-nav-box').remove(); }通过以上修改,文章的可读性、结构性和实用性得以提升,使读者能够更好地理解和使用所提供的功能。
-
三十六计完整详解 三十六计,一计一集,计计相扣,在展现中国古代兵法和东方智慧的同时,浓彩重墨描绘出一幅二千年前中国战国时期政治、军事与各阶层不同的人物情感相交融的历史画卷。 三十六计图片 胜战计 第一计:瞒天过海 备周而意怠,常见则不疑,阴在阳之内,不在阳之对。太阳,太阴。 译:认为准备万分周到,就容易松劲;平时看惯了的,就往往不在怀疑了,秘计隐藏在暴露的事物中,而不是和公开的形式相排斥。非常公开的往往蕴藏着非常机密的。 第二计:围魏救赵 共敌不如分敌,敌阳不如敌阴。 译:树敌不可过多,对敌要各个击破,对现在还不忙于消灭的,要隐藏我们的意图。 第三计:借刀杀人 敌已明,友未定,引友杀敌,不出自力,以损推演。 译:作战的对象已经确定,而朋友的态度还不稳定,要诱导朋友去消灭敌人,避免消耗自己的力量。 第四计:以逸待劳 困敌之势,不以战,损刚益柔。 译:控制敌方力量发展的命脉来扼杀他,而不采取进攻的形势,这就是“损刚益柔”原理的演用。 第五计:趁火打劫 敌之害大,就势取利,刚决柔也。 译:敌方的危机很大,就乘机取利,用优势力量攻击软弱的。 第六计:声东击西 乱志乱萃,不虞“坤下兑上”之象;利其不自主而取之。 译:敌人乱撞瞎碰,摸不清情况,这是《易经》“萃”封上所说的“坤下兑上”的混乱征状。必须利用敌方失去控制力的时机加以消灭。 敌战计 第七计:无中生有 诳也,非诳也,实其所诳也。少阴,太阴,太阳。 译:无中生有是运用假象,但不是弄假到底。而是使假象变真象,大小假象,掩护真象。 第八计:暗渡陈仓 示之以动,利其静而有主,“益动而巽”。 译:故意暴露行动,利用敌方固守的时机,便主动偷袭。 第九计:隔岸观火 阳乖序乱,阴以待逆,暴戾恣睢,其势自毙。顺以动豫,豫顺以动。 译:敌人内部分裂,秩序混乱,我便等待他发生内讧,那时敌人穷凶极恶,翻目仇杀,势必自行灭亡。我要根据敌人变动作好准备;作好准备之后,还要根据敌人的变动而行动。 第十计:笑里藏刀 信而安之,阴以图之,备而后动,勿使有变:刚中柔外也。 译:使敌人相信我方,并使其麻痹松懈,我则暗中策划,充分准备,一有机会,立即动手,使他来不及应变,这是暗中厉害,表面柔和的策略。 第十一计:李代桃僵 势必有损,损阴以益阳。 译:当局势发展有所损失的时候,要舍得局部的损失,以换取全局的优势。 第十二计:顺手牵羊 微隙在所必乘,微利在所必得。少阴,少阳。 译:微小的漏洞必须利用,微小的利益,也必须获得。变敌人小的疏忽,为我方小的胜利。 攻战计 第十三计:打草惊蛇 疑为叩实,察而后动,复者,阴之媒也。 译:有怀疑的就要侦察实情,完全掌握了实情再行动。反复侦察,是发现暗藏敌人的因素。 第十四计:借尸还魂 有用者不可借,不能用者,求借,借不能用者而用之。匪我求童蒙,童蒙求我。 译:有用的不可以利用,怕的是我不能控制它,不能利用的却要去利用,因为我完全可以控制它,利用不能用的而控制它,这不是我受别人的支配,而是我支配别人。 第十五计:调虎离山 待天以困之,用人以诱之,“往蹇来返”。 译:等待天时对敌方不利时再去围困他,用人假象去诱骗他“往前有危险,就返身离开”。 第十六计:欲擒故纵 逼则反兵,走则减势,紧随勿迫。累其气力,消其斗志,散而后擒。兵不血刃,需,有孚光。 译:逼得敌人无路可走,就会遭到坚决的反扑;让他逃走,就会消灭敌人的气势,所以要紧紧地跟踪敌人,但不要逼迫他,借以消耗他的体力,瓦解他的士气,等他的兵力分散了,再行再以捕捉。这样用兵可以避免流血,不逼迫敌人,并让他相信,这对战争是有利的。 第十七计:抛砖引玉 类以诱之,击蒙也。 译:用类似的东西去迷惑敌人,使敌人遭懵上当。 第十八计:擒贼擒王 摧其坚,夺其魁,以解其体;龙战于野,其道穷也。 译:彻底地摧毁敌人的主力,抓住他的首领,借以粉碎他的战争机构,这是一场激烈的总决战。 混战计 第十九计:釜底抽薪 不敌其力,而消其势,兑下乾上之象。 译:力量上不能战胜敌人,可以瓦解他的气势,这就是《易经》兑下乾上的《履卦》上所说的“柔履刚”的办法。 第二十计:混水摸鱼 乘其阴乱,利其弱而无主,随,以向晦入宴息。 译:乘着敌人内部混乱,利用他还是弱小而没有主见,他随从我,像人随着天时吃饭、休息一样。 第二十一计:金蝉脱壳 存其形,完其势;友不疑,敌不动;巽而上蛊。 译:保存阵地的原形,造成强大的声势,使友军不怀疑,敌人也不敢贸然进犯,而我却可以隐蔽地击破另一支敌军。 第二十二计:关门捉贼 小敌困之,剥,不利有攸往。 译:对弱小的敌人,要加以包围歼灭;对垂死挣扎的敌人,如果从后面急追远赶,那是很不利的。 第二十三计:远交近攻 形禁势格,利以近取。害以远隔,上火下泽。 译:处于(扭转)不利的形势(局面),要考虑(阻止)它发展的方向(趋势),(利于)攻取附近的地方,就有利,(不利于)攻击远隔的地方,就有害。《易经聧》卦说:“火苗向上冒,池水向下流,志向不同,也可以结交。” 第二十四计:假途代虢 两大之间,敌胁以从,我假以势,困,有言不信。 译:对处的两个强大敌人中间的国家,敌人胁迫它时,我方却作援求它,立即出兵。《易经困》卦说:“对处在困迫状况下的国家,光空谈而没有行动,是不会被他信任的。” 并战计 第二十五计:偷梁换柱 频更其阵,抽其劲旅,待其自败,而后乘之,曳其轮也。 译:多次变动敌人的阵容,把他的兵力调开,等待他自己败阵,然后用谋进攻他,《易经既济》卦说:“先拖住敌人,然后再替换他。” 第二十六计:指桑骂槐 大凌小者,警以诱之。刚中而应,行险而顺。 译:强大的慑服弱小的,要用警戒的方法来诱导它。《易经师》卦说:适当的强硬,可以得到拥护;施用险诈,可以得到顺从。 第二十七计:假痴不癫 宁伪作不知不为,不伪作假知妄为,静不露机,云雷屯也。 译:宁可假装不知道的,不行动,不可假装知道而轻举妄动。要沉着,不要泄露一点机密,就像迅猛激烈的云雷,在冬季藏入地下般的平静。 第二十八计:上屋抽梯 假之以便,唆之使前,断其援应,陷之死地,遇毒,位不当也。 译:故意露出破绽,引诱敌人深入我方,然后选择有利时机,断绝敌人的前应和后援,使它完全处于死地。敌人这样的下场《易经嗑》上说的好:抢吃腊肉的嗑掉了牙,怪自己的动作不当。 第二十九计:树上开花 借局布势,力小势大;鸿渐于陆,其羽可用为仪也。 译:借别人的局面布成阵势,兵力弱小的看来阵容也显得强大。《易经渐》卦说:鸿雁飞向大陆,全凭它的羽毛丰满助长气势。 第三十计:反客为主 乘隙插足,扼其主机,渐之进也。 译:有空子就要插脚进去,扼住他的主脑机关。《易经渐》卦说:“循序而进”就是这个意思。 败战计 第三十一计:美人计 兵强者,攻其将。将智者,伐其情。将弱兵颓,其势自萎。利用御寇,顺相保也。 译:兵力强大的,就要攻打他的将帅;将帅明智的,就打击他的情绪,用美色诱惑,使其陷入困境或失去战斗力。将帅斗志衰弱、部队士气消沉,他的气势必定自行萎缩。《易经渐》卦说:利用敌人内部的严重弱点来控制敌人,可以有把握地保存自己的实力。 第三十二计:空城计 虚者虚之,疑中生疑;刚柔之际,奇而复奇。 译:空虚的就让它空虚,使人更加难以揣测;在进攻和防御中运用空虚的战术来隐蔽自己的空虚,越发显得用兵出奇。 第三十三计:反间计 疑中之疑,比之向内,不自失也。 译:在疑阵中再布置一层疑阵。《易经比》卦说:来自敌方内部的援助,自己不会受到损失。 第三十四计:苦肉计 人不自害,受害必真。假真真假,间以得行。童蒙之吉,顺以巽也。 译:人不自己迫害自己,受迫害必然是真的;真的变假,间谍便乘机活动。《易经蒙》卦说:把他骗得乖乖的,顺着他活动。 第三十五计:连环计 将多兵众,不可以敌,使其自累,以杀其势。在师中吉,承天宠也。 译:敌方兵力强大,不能硬打,应当运用谋略,使仓储自相牵制,借以削弱他的力量。《易经师》卦说:将帅靠指军不偏不倚,惯打胜仗的就是用兵如神。 第三十六计:走为上计 走为上计全师避敌,在次无咎,未失常也。 译:全军退却,甩开敌人,以退为进,待机破败,这是不违背正常的法则的。 自创计 第三十七计 潜龙勿用 译:自行体悟
-
PHPY 打破语言界限,使PHP引入Python生态,开创PHP语言AI编程时代! PHPY是什么? phpy 是识沃团队最新推出的开源项目,目标是为 PHP 引入 Python 生态,来弥补 PHP 生态的空缺和不足。phpy 使得 PHP 可以调用所有 Python 的包。包括当下非常流行的 AI 库,如:PyTorch、transformers、TensorFlow 等包括当下非常流行的 AI 库,如 PyTorch、transformers、TensorFlow 等,以及科学计算库,如 Numpy、Pandas、Scikit 等,还可以使用图形界面库,如 PyQt、wxPython 等。 不建议在 php-fpm/apache 短生命周期运行环境下使用,频繁地导入/销毁模块的开销会消耗大量资源环境 Linux环境:Ubuntu 22.04.3 LTS PHP版本:PHP 8.1 或以上版本 Python 3.10 或以上版本 安装PHP8.3 下载 wget wget https://www.php.net/distributions/php-8.3.0.tar.gz tar -zxvf php-8.3.0.tar.gz下载地址:https://www.php.net/downloads安装依赖包 sudo apt-get install libfcgi-dev libfcgi0ldbl libjpeg-turbo8-dev libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev libxml2-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libfreetype6-dev libkrb5-dev libpq-dev libxml2-dev libxslt1-dev libzip-dev libsqlite3-dev libonig-dev pkg-config libxml2-dev libkrb5-dev libssl-dev libsqlite3 libbz2-dev libpng-dev libjpg-dev libfreetype6-dev libc-client2007e-dev libonig-dev libreadline-dev libxslt-dev libzip-dev如果安装的依赖包不存在,请通过命令:apt-cache search freetype 查找相应的安装包安装即可编译 ./configure \ --prefix=/usr/local/php-8.3 \ --with-config-file-path=/usr/local/php-8.3/etc \ --with-zlib-dir \ --with-freetype \ --enable-mbstring \ --enable-soap \ --enable-calendar \ --with-curl \ --with-zlib \ --enable-gd \ --disable-rpath \ --enable-inline-optimization \ --with-bz2 \ --with-zlib \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-pcntl \ --enable-mbregex \ --enable-exif \ --enable-bcmath \ --with-mhash \ --with-zip \ --with-pdo-mysql \ --with-mysqli \ --with-mysql-sock=/var/run/mysqld/mysqld.sock \ --with-jpeg \ --with-openssl \ --with-fpm-user=www \ --with-fpm-group=www \ --with-libdir=/lib/x86_64-linux-gnu \ --enable-ftp \ --with-kerberos \ --with-gettext \ --with-xmlrpc \ --with-xsl \ --enable-opcache \ --enable-intl \ --with-pear \ --enable-fpm编译安装 make make install配置文件 核心 php.ini 配置文件cp php.ini-production /usr/local/php-8.3/etc/php.ini查看PHP版本/usr/local/php-8.3/bin/php -v PHP 8.3.0 (cli) (built: Dec 5 2023 20:03:56) (NTS) Copyright (c) The PHP Group Zend Engine v4.3.0, Copyright (c) Zend Technologies安装Python 安装Anaconda Anaconda 是一个开源的Anaconda是专注于数据分析的Python发行版本,包含了conda、Python等190多个科学包及其依赖项。 Anaconda就是可以便捷获取包且对包能够进行管理,包括了python和很多常见的软件库和一个包管理器conda。常见的科学计算类的库都包含在里面了,使得安装比常规python安装要容易,同时对环境可以统一管理的发行版本。 下载地址:https://www.anaconda.com/download#downloads wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh命令行中切换到anaconda文件所在目录 sh Anaconda3-2022.05-Linux-x86_64.sh accept the license terms--yes默认安装路径,/home/用户名/anaconda3=查看Anaconda版本 终端输入 conda --version 或者 conda -V /home/www/anaconda3/condabin/conda --version conda 23.7.4创建虚拟环境 $ conda create -n tinywan-python310 python=3.10 Collecting package metadata (current_repodata.json): done Solving environment: done ==> WARNING: A newer version of conda exists. <== current version: 23.7.4 latest version: 23.11.0 Please update conda by running $ conda update -n base -c defaults conda Or to minimize the number of packages updated during conda update use conda install conda=23.11.0 ## Package Plan ## environment location: /home/www/anaconda3/envs/tinywan-python310 added / updated specs: - python=3.10 The following packages will be downloaded: package | build ---------------------------|----------------- pip-23.3.1 | py310h06a4308_0 2.7 MB python-3.10.13 | h955ad1f_0 26.8 MB setuptools-68.0.0 | py310h06a4308_0 936 KB wheel-0.41.2 | py310h06a4308_0 109 KB ------------------------------------------------------------ Total: 30.5 MB The following NEW packages will be INSTALLED: _libgcc_mutex pkgs/main/linux-64::_libgcc_mutex-0.1-main _openmp_mutex pkgs/main/linux-64::_openmp_mutex-5.1-1_gnu bzip2 pkgs/main/linux-64::bzip2-1.0.8-h7b6447c_0 ca-certificates pkgs/main/linux-64::ca-certificates-2023.08.22-h06a4308_0 ld_impl_linux-64 pkgs/main/linux-64::ld_impl_linux-64-2.38-h1181459_1 libffi pkgs/main/linux-64::libffi-3.4.4-h6a678d5_0 libgcc-ng pkgs/main/linux-64::libgcc-ng-11.2.0-h1234567_1 libgomp pkgs/main/linux-64::libgomp-11.2.0-h1234567_1 libstdcxx-ng pkgs/main/linux-64::libstdcxx-ng-11.2.0-h1234567_1 libuuid pkgs/main/linux-64::libuuid-1.41.5-h5eee18b_0 ncurses pkgs/main/linux-64::ncurses-6.4-h6a678d5_0 openssl pkgs/main/linux-64::openssl-3.0.12-h7f8727e_0 pip pkgs/main/linux-64::pip-23.3.1-py310h06a4308_0 python pkgs/main/linux-64::python-3.10.13-h955ad1f_0 readline pkgs/main/linux-64::readline-8.2-h5eee18b_0 setuptools pkgs/main/linux-64::setuptools-68.0.0-py310h06a4308_0 sqlite pkgs/main/linux-64::sqlite-3.41.2-h5eee18b_0 tk pkgs/main/linux-64::tk-8.6.12-h1ccaba5_0 tzdata pkgs/main/noarch::tzdata-2023c-h04d1e81_0 wheel pkgs/main/linux-64::wheel-0.41.2-py310h06a4308_0 xz pkgs/main/linux-64::xz-5.4.5-h5eee18b_0 zlib pkgs/main/linux-64::zlib-1.2.13-h5eee18b_0 Proceed ([y]/n)? y Downloading and Extracting Packages Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate tinywan-python310 # # To deactivate an active environment, use # # $ conda deactivate激活虚拟环境 conda activate tinywan-test查看已有的虚拟环境 $ conda env list # conda environments: # base /home/www/anaconda3 tinywan-test * /home/www/anaconda3/envs/tinywan-test进入虚拟环境查看Python版本 (tinywan-python310) www@xxxxxxx:~/anaconda3$ python --version Python 3.10.13安装phpy 下载 git clone https://github.com/swoole/phpy.git生成 ./configure 配置文件 /usr/local/php-8.3/bin/phpize --with-php-config=/usr/local/php-8.3/bin/php-config指定配置文件 ./configure --with-php-config=/usr/local/php-8.3/bin/php-config --with-python-dir=/home/www/anaconda3/envs/tinywan-python310 --with-python-version=3.10参数说明 --with-php-config PHP配置文件 --with-python-dir Python安装目录 --with-python-version Python版本号(只能使用次版本好,如:3.10.15,则填写3.10) 编译安装 make -j4 sudo make installphp.ini 扩展添加 安装成功后,修改 php.ini ,加入 extension=phpy.so vim /usr/local/php-8.3/etc/php.ini // 添加 extension=phpy.so执行 php -m 检查是否成功加载扩展。 $ php -m |grep phpy phpy使用 案例 os.php <?php function main() { $m = PyCore::import("os"); var_dump($m instanceof PyObject); $rs = $m->uname(); echo $rs; echo $rs->version; } main()查看当前操作系统版本执行结果 /phpy/examples$ /usr/local/php-8.3/bin/php os.php bool(true) posix.uname_result(sysname='Linux', nodename='iZbp1cqx6cq0t2gpl995gqZ', release='4.15.0-137-generic', version='#141-Ubuntu SMP Fri Feb 19 13:46:27 UTC 2021', machine='x86_64')#141-Ubuntu SMP Fri Feb 19 13:46:27 UTC 2021(tinywan-python310)其他 gcc 版本升级 ubuntu18.04的Gcc7.5.0升级到9.4.01、添加Ubuntu的测试工具链 (Toolchain) PPA。这个PPA包含了最新版本的GCC,包括GCC 9: sudo add-apt-repository ppa:ubuntu-toolchain-r/test2、更新你的包列表: sudo apt-get update sudo apt-get upgrade3、查看gcc所有版本 sudo apt-cache search gcc4、安装GCC-9: sudo apt install gcc-95、为了让你的系统默认使用GCC-9,你需要更新你的update-alternatives。首先,安装GCC-9为一个可选项 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90这个命令告诉 update-alternatives 系统 GCC-9 是一个可选项,并给它一个优先级 90 。优先级最高的版本将成为默认版本。如果安装成功会是这样的: gcc -v gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~18.04)
-
Love-Yi情侣网站存在SQL注入漏洞 FOFA介绍 部署在互联网上的网络设备资产信息搜索引擎。旨在尽可能多的对全球IT设备资 产进行信息收集、 漏洞扫描, 进而开展资产影响分析、漏洞影响分析, 为相关流行态势感知分析提供依据。 网址:https://fofa.info/ FOFA图片 漏洞复现 搜索 love-yi 再找到国内站点,访问速度快一点,提高渗透效率 图片 love-yi是一个记录情侣日常的恋爱网站,经某位程序员修改和设计之后,使其更加美观好看,适合哄女朋友开心,或者留作纪念。 图片 找到点点滴滴下的文章 图片 文章详细页面 图片 查看url,包含了一个id 图片 尝试注入,添加一个 ' ?id=6'查看源码,报错,存在SQL注入漏洞 图片 注入payload ?id=6' union select 1,2,3,4 -- qwe还是报错,而且文章内容也没了,说明该表字段不含4列,尝试5列 图片 ?id=6' union select 1,2,3,4,5 -- qwe正常显示,说明该表包含5个字段 图片 这里使用的union联结查询,他通常需要具备三个条件 选择的列数在两个查询中都是相同的。 数据类型在两个查询中都是兼容的。 第一个查询(即原始查询)不返回任何结果,或者你知道如何绕过它(例如,通过使WHERE子句始终为假)。 第三点中提到了原始查询不返回任何结果,得到payload ?id=-6' union select 1,2,3,4,5 -- qwe图片 注入成功,将2修改为如下payload // 拼接数据库版本,当前用户 concat(user(),database())图片 总结 由于作者更喜欢手工注入,因为手工注入更不容易被发现,灵活性,但是技术要求比较高,也比较耗时,使用SQL注入工具可以提高攻击效率和成功率,但也存在易被发现、受安全设备限制、需要特定环境、可能引发误报以及依赖工具更新等缺点。
-
PHP 8.0:新时代的编程巨浪 随着技术的不断进步,PHP也在不断演化,迎来了它的8.0版本。这一版本不仅仅是数字的增加,更是PHP语言的一次重大飞跃。今天,让我们一起探索PHP 8.0的新特性,以及它如何为开发者带来前所未有的便利。 图片 PHP 8.0简介 PHP 8.0是PHP语言的最新主要版本,它引入了许多新特性和改进,包括JIT编译器、命名参数、联合类型、属性、改进的类型系统等。这些变化旨在提高性能、增强代码的可读性和可维护性。 PHP 7与PHP 8.0的差异 PHP 8.0在多个方面与PHP 7有所不同,以下是一些主要的差异: JIT编译器:PHP 8.0引入了Just-In-Time (JIT) 编译器,这使得PHP代码的执行速度有了显著提升。 命名参数:PHP 8.0允许开发者使用命名参数,这使得函数调用更加灵活和可读。 联合类型:PHP 8.0支持联合类型,允许一个变量或函数参数接受多种类型的值。 属性:PHP 8.0引入了属性(Attributes),这是一种新的元数据语法,可以用于注解类、方法和属性。 改进的类型系统:PHP 8.0对类型系统进行了改进,包括更严格的类型检查和新的类型声明。 PHP 8.0新增功能和方法 PHP 8.0带来了许多新功能和方法,以下是一些值得关注的亮点: 图片 JIT编译器:通过在配置文件中启用JIT,可以显著提高代码执行速度。 命名参数:允许在函数调用时指定参数名称,例如: htmlspecialchars($string, double_encode: false);联合类型:允许函数参数或返回值为多种类型之一,例如: function foo(int|float $number): int|float { return $number * 2; }属性:使用属性来注解代码,例如: #[Route("/api/items/{id}", methods: ["GET"])] function getItem($id) { // 你的代码 }Match表达式:提供了一种更简洁的switch语法,例如: $status = match ($statusCode) { 200 => 'OK', 404 => 'Not Found', default => 'Unknown', };入门指导 要开始使用PHP 8.0,你需要确保你的开发环境已经支持这个版本。你可以通过以下步骤来安装或升级到PHP 8.0: 检查当前版本:首先,运行以下命令来检查你当前的PHP版本: php -v升级到PHP 8.0:如果你的系统支持包管理器,你可以通过包管理器来安装或升级到PHP 8.0。例如,在Ubuntu上,你可以使用以下命令: sudo apt update sudo apt install php8.0代码案例 让我们来看一个简单的例子,展示PHP 8.0中的一些新特性: // 命名参数 htmlspecialchars($string, double_encode: false); // 联合类型 function foo(int|float $number): int|float { return $number * 2; } // 属性 #[Route("/api/items/{id}", methods: ["GET"])] function getItem($id) { // 你的代码 } // Match表达式 $status = match ($statusCode) { 200 => 'OK', 404 => 'Not Found', default => 'Unknown', };PHP 8.0优劣势 优势: 性能提升:PHP 8.0引入了JIT编译器,显著提高了执行速度。 代码简洁:命名参数和联合类型等新特性使得代码更加简洁和易读。 开发效率:属性和其他改进减少了样板代码,提高了开发效率。 劣势: 兼容性问题:升级到PHP 8.0可能会遇到一些兼容性问题,需要对现有代码进行适配。 学习曲线:新特性可能需要开发者花费时间去学习和适应。 使用方法和场景 PHP 8.0适用于所有希望提高性能和代码质量的PHP开发者。它特别适合以下场景: 高性能应用:对于需要快速响应和高吞吐量的应用,PHP 8.0的JIT编译器是一个巨大的优势。 现代化开发:PHP 8.0的新特性使得代码更加现代化,适合追求最新技术趋势的开发者。 注意事项 在使用PHP 8.0时,开发者需要注意以下几点: 兼容性测试:在升级之前,确保对现有代码进行充分的兼容性测试。 文档学习:深入学习PHP 8.0的新特性,充分利用其带来的优势。 结尾 亲爱的开发工程师们,PHP 8.0为我们带来了新的机遇和挑战。让我们拥抱变化,勇敢地迈向新时代。记住,技术的海洋无边无际,每一次升级都是我们航行的新起点。明天,我们将继续探索PHP 8.1的奥秘,敬请期待! 在这篇文章中,我们深入探讨了PHP 8.0的新特性,并提供了入门指导、代码案例和使用场景。希望这些信息能帮助你在开发旅程中做出明智的选择,并在技术的海洋中乘风破浪。
-
《黑神话·悟空》是用什么编程语言开发的? 最近这个“黑神话·悟空”真是火的一塌糊涂,这款被誉为中国第一款3A制作的单机游戏,凭借其惊艳的画面、流畅的战斗体验和深厚的文化内涵,属实是火出圈儿了,连央视、外交部都纷纷点赞了。 图片 关于这款游戏的制作和文化咱就不聊了,毕竟我也不是专业的,今天咱们聊聊另一个话题。 话说,你知道黑神话·悟空这款游戏是用什么编程语言开发的吗? 答案主要是C++(也用到C#和其他语言) 根据游戏开发公司游戏科学官网的显示,《黑神话:悟空》游戏使用的是虚幻引擎(Unreal Engine): 图片 而这个引擎的底层源码主要使用的就是C++。 图片 图片 开发这款引擎的是Epic Games,一家来自美国的游戏公司。 虚幻引擎属于开源项目,大家自己学习或者开发一些免费的东西是可以直接用的。但如果要开发像《黑神话:悟空》这样的商业产品,那就得给钱了。按照他们的协议,当产品销售超过100万$时,就要付5%的版税。 图片 悟空的销售早就超过这个数了,所以现在每多一个人购买这款游戏,就会有5%进入到这家公司的钱包里。当然这种算法可能有些粗糙,在不同平台还有平台抽成,但大体是这么个意思,每销售一次,就会有一笔钱进到这家公司的账户。 我在微博、知乎、公众号很多平台看到大家都在感叹,国内的游戏公司很少愿意投入到这样的3A游戏制作,投入太大、周期长、收益不确定,导致大家都更愿意做投入小、来钱快的网游、手游,做一些奶头乐的游戏,而这类游戏,往往很难承载起文化传播的重担。 确实是这样,过去的十几年里,中国的游戏开发者们大多集中在网游和手游领域,原因很简单——来钱快。网游可以通过内购和会员制等方式持续盈利,而手游更是凭借短平快的开发周期和庞大的用户基数成为了香饽饽。 每次看到这样的评论留言,我就想到咱们软件开发领域其实不是一样的吗? 在中国的软件开发行业,Java和Python几乎成为了开发者的首选。无论是互联网公司开发的各种应用,还是传统企业的信息系统,这两种语言无处不在。为什么它们如此受欢迎?原因很简单:Java和Python的学习门槛低,开发速度快,并且有丰富的生态系统和社区支持。这让企业能够迅速推出产品,抢占市场份额,迎合快速迭代的商业需求。 再来看C++,国内做C++开发的团队实在是太少了,企业想招聘一个合适的C++人员往往要付出更多的时间和成本。这里面有多方面的原因,一方面C++学习曲线陡峭,开发人员需要掌握内存管理、操作系统机制等复杂内容,不仅耗时,而且容易出错。其次,C++的开发周期较长,企业在如此内卷的市场下,也很难快速迭代,毕竟市场不等人。 于是多年下来,造成的局面就是,国内的软件开发主要集中在网站、APP、小程序等领域,很少有涉及底层的软件系统。各种工业软件、操作系统、游戏引擎、数据库、浏览器这些东西基本都是国外的东西。 我看到很多人期望《黑神话:悟空》能像一束光,照亮国内3A游戏的道路,有更多的公司和团队进入到这个领域。其实我也希望,国内有更多的C、C++这些编程语言的开发者,开发出各种基础设施软件,走向全球市场,未来别人用我们的东西,每卖出一份也能给我们交钱。而不只是像现在一样,做一些同质化严重的小程序和APP。 期望归期望,但坦率来讲,这很难,毕竟《流浪地球》五年过去了,如今也只有一个《流浪地球》。 商业和资本本质毕竟还是逐利的,尤其是国内的市场太过浮躁,大家更看重短期利益。别说公司和企业了,个人同样如此,很多人都期望培训班培训三个月,就能月薪上万进入大厂。 不过星星之火总好过一片暗淡,当《黑神话:悟空》这样的星星之火越来越多时,终究有燎原之日。 最后期望中国游戏产业和中国软件产业都能有美好的未来!
-
-
iFrame父子相互获取对方DOM元素 父页面获取子页面dom的方法 /* 必须用onload */ window.onload = () => { const sonWindow = document.querySelector("iframe").contentWindow; const sonDiv = sonWindow.document.querySelector(".son") console.log(sonDiv); }子页面获取父页面dom的方法 /* 必须用onload */ window.onload = () => { const parentWindow = window.parent; const parentDiv = parentWindow.document.querySelector(".parent") console.log(parentDiv); }