<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>周瑜的博客</title>
    <link>https://www.zhouxiaoyu.vip/</link>
    <description>我的编程笔记记录</description>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 05 Oct 2026 09:05:33 GMT</lastBuildDate>
    <atom:link href="https://www.zhouxiaoyu.vip/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>大QMT关闭文件IO和Socket后，如何从外部获取特色数据和信号？如何得心应手的使用QMT呢？</title>
      <link>https://www.zhouxiaoyu.vip/posts/%E5%A4%A7QMT%E5%85%B3%E9%97%AD%E6%96%87%E4%BB%B6IO%E5%92%8CSocket%E5%90%8E%E5%A6%82%E4%BD%95%E4%BB%8E%E5%A4%96%E9%83%A8%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/%E5%A4%A7QMT%E5%85%B3%E9%97%AD%E6%96%87%E4%BB%B6IO%E5%92%8CSocket%E5%90%8E%E5%A6%82%E4%BD%95%E4%BB%8E%E5%A4%96%E9%83%A8%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE.html</guid>
      <pubDate>Sun, 09 Aug 2026 00:35:00 GMT</pubDate>
      <category>开发</category>
      <category>量化</category>
      <category>qmt</category>
      <description>程飞 · 六年量化实战 · 十大方案全景拆解 · 2026年8月（只写方案，不给解答，请自行摸索，遇到问题也不要问我，请憋着，哈哈~） 写在前面 早些年，应该是2019-2020年这样，刚开始倒腾量化，开的一创的户，当时是可以搞一创果仁和一创聚宽，一举两得，还是非常不错的。但是突然有一天，一创聚宽关闭了！这还了得，于是开了一创的QMT，没想这我QMT是阉割版的，没有MiniQMT就算了，居然他们的QMT还不能进行文件读者和访问外网。这不，逼得我只能一度用一创果仁，而把他们的QMT丢旮旯角落里！ 后来又整了其他的QMT，发现其他家又有MiniQMT又可以大QMT权限多。。。一创的QMT就更加被遗忘在角落里了。直到最近的各种确定性的风又吹来，很多券商也要收掉权限，这就蛋疼了！</description>
    </item>
    <item>
      <title>MongoDB快速入门</title>
      <link>https://www.zhouxiaoyu.vip/posts/MongoDB%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/MongoDB%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html</guid>
      <pubDate>Sun, 14 Apr 2024 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>数据库</category>
      <category>mongodb</category>
      <description>安装 下载MongoDB的Docker镜像 docker&amp;nbsp;pull&amp;nbsp;mongo:4.2.5</description>
    </item>
    <item>
      <title>mysql分页的两种方式</title>
      <link>https://www.zhouxiaoyu.vip/posts/mysql%E5%88%86%E9%A1%B5%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E5%BC%8F.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/mysql%E5%88%86%E9%A1%B5%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E5%BC%8F.html</guid>
      <pubDate>Fri, 01 Mar 2024 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>数据库</category>
      <category>mysql</category>
      <category>基础知识</category>
      <description>offset 方式 这种方式中 offset 在数量很大时查询会很慢,因为查询语句会扫描全表。 select id , name from table limit offset 20</description>
    </item>
    <item>
      <title>vue中使用jsx开发组件</title>
      <link>https://www.zhouxiaoyu.vip/posts/vue%E4%B8%AD%E4%BD%BF%E7%94%A8jsx%E5%BC%80%E5%8F%91%E7%BB%84%E4%BB%B6.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/vue%E4%B8%AD%E4%BD%BF%E7%94%A8jsx%E5%BC%80%E5%8F%91%E7%BB%84%E4%BB%B6.html</guid>
      <pubDate>Fri, 10 Nov 2023 02:50:37 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>vuejs</category>
      <description>import { defineComponent } from &quot;vue&quot; ; // 定义子组件 const ChildComponent = defineComponent ( { name : &quot;ChildComponent&quot; , setup ( ) { return ( ) =&amp;gt; &amp;lt; div &amp;gt; ChildComponent &amp;lt;/ div &amp;gt; ; } , } ) ; // 也可以使用 render 函数 const ChildComponent = defineComponent ( { name : &quot;ChildComponent&quot; , render ( ) { return &amp;lt; div &amp;gt; ChildComponent &amp;lt;/ div &amp;gt; ; } , } ) ; // 定义非受控组件（就是组件内部没有状态） const UncontrolledComponent = defineComponent ( { name : &quot;UncontrolledComponent&quot; , setup ( ) { return ( ) =&amp;gt; &amp;lt; input type = &quot; text &quot; /&amp;gt; ; } , } ) ; // 定义组件函数并用闭包保存调用时的参数 这种方式可以用于创建组件库 function createComponent ( name , props ) { return defineComponent ( { name , setup ( ) { { props . name ; } return ( ) =&amp;gt; &amp;lt; div &amp;gt; { name } &amp;lt;/ div &amp;gt; ; } , } ) ; } export default defineComponent ( { name : &quot;App&quot; , // 定义 props props : { msg : String , } , // 定义事件 emits : [ &quot;update:msg&quot; ] , setup ( props , { slots , attrs , emit , expose } ) { // 对外暴露的方法 expose ( { // ... } ) ; // 使用 createComponent const ChildComponent = createComponent ( &quot;ChildComponent&quot; , { name : &quot;ChildComponent&quot; , } ) ; // 返回 jsx return ( ) =&amp;gt; ( &amp;lt; div &amp;gt; &amp;lt; ChildComponent /&amp;gt; { h ( ChildComponent ) } &amp;lt; h1 &amp;gt; { props . msg } &amp;lt;/ h1 &amp;gt; &amp;lt; button onClick = { ( ) =&amp;gt; emit ( &quot;update:msg&quot; , &quot;Hello Vite + Vue + JSX&quot; ) } &amp;gt; Change msg &amp;lt;/ button &amp;gt; { slots . default ?. ( ) } &amp;lt;/ div &amp;gt; ) ; } , } ) ;</description>
    </item>
    <item>
      <title>composer常用指令</title>
      <link>https://www.zhouxiaoyu.vip/posts/composer%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/composer%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4.html</guid>
      <pubDate>Fri, 20 Oct 2023 11:31:49 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>php</category>
      <description>composer 使用 psr-4 自动加载类 { &quot;autoload&quot; : { &quot;psr-4&quot; : { &quot;App\\&quot; : &quot;app/&quot; } } }</description>
    </item>
    <item>
      <title>DOS常用指令</title>
      <link>https://www.zhouxiaoyu.vip/posts/DOS%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/DOS%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4.html</guid>
      <pubDate>Sun, 08 Oct 2023 10:13:09 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <description>创建软链接 mklink /d D: \ test D: \ test1 # 下面的命令是将D盘的idea文件夹映射到C盘的idea文件夹 mklink /d C: \ Users \ zhouyu \ AppData \ Local \ JetBrains \ IntelliJ IDEA 2020.3 .3 D: \ idea</description>
    </item>
    <item>
      <title>vite小技巧</title>
      <link>https://www.zhouxiaoyu.vip/posts/vite%E5%B0%8F%E6%8A%80%E5%B7%A7.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/vite%E5%B0%8F%E6%8A%80%E5%B7%A7.html</guid>
      <pubDate>Sun, 08 Oct 2023 02:50:37 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>vuejs</category>
      <description>vite 中给 public/index.html 中注入变量 webpack小技巧 1. 使用 html-webpack-plugin // vite.config.js import { defineConfig } from &apos;vite&apos; ; import vue from &apos;@vitejs/plugin-vue&apos; ; import HtmlWebpackPlugin from &apos;html-webpack-plugin&apos; ; // https://vitejs.dev/config/ export default defineConfig ( { plugins : [ vue ( ) , new HtmlWebpackPlugin ( { template : &apos;public/index.html&apos; , templateParameters : { BASE_URL : &apos;./&apos; , DIY_VAR : &apos;diy_var&apos; , } , } ) , ] , } ) ;</description>
    </item>
    <item>
      <title>vscode中的代码片段</title>
      <link>https://www.zhouxiaoyu.vip/posts/vscode%E4%B8%AD%E7%9A%84%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B5.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/vscode%E4%B8%AD%E7%9A%84%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B5.html</guid>
      <pubDate>Fri, 06 Oct 2023 01:03:08 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <category>开发环境</category>
      <description>变量 有关$name 或${name:default} ,您可以插入变量的值。当一个变量没有设置时,它的 违约 或者插入空字符串。当一个变量是未知的(也就是说,它的名称没有定义),变量的名称被插入,它被转换为占位符。 可以使用下列变量: TM_SELECTED_TEXT 当前选定的文本或空字符串 TM_CURRENT_LINE 当前项目的内容 TM_CURRENT_WORD 光标或空字符串下的单词内容 TM_LINE_INDEX 基于零指数的行数 TM_LINE_NUMBER 基于单索引的行数 TM_FILENAME 当前文档的文件名 TM_FILENAME_BASE 当前文档的文件名没有扩展 TM_DIRECTORY 当前文件目录 TM_FILEPATH 当前文档的完整文件路径 RELATIVE_FILEPATH 当前文档的相对(打开的工作区或文件夹)文件路径 CLIPBOARD 你的剪贴板的内容 WORKSPACE_NAME 打开工作区或文件夹的名称 WORKSPACE_FOLDER 打开工作区或文件夹的路径 CURSOR_INDEX 基于零索引的光标数 CURSOR_NUMBER 基于单索引的光标数</description>
    </item>
    <item>
      <title>wget下载整个网站或者特定目录</title>
      <link>https://www.zhouxiaoyu.vip/posts/wget%E4%B8%8B%E8%BD%BD%E6%95%B4%E4%B8%AA%E7%BD%91%E7%AB%99%E6%88%96%E8%80%85%E7%89%B9%E5%AE%9A%E7%9B%AE%E5%BD%95.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/wget%E4%B8%8B%E8%BD%BD%E6%95%B4%E4%B8%AA%E7%BD%91%E7%AB%99%E6%88%96%E8%80%85%E7%89%B9%E5%AE%9A%E7%9B%AE%E5%BD%95.html</guid>
      <pubDate>Wed, 04 Oct 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>linux</category>
      <category>常用</category>
      <description>需要下载某个目录下面的所有文件。命令如下 wget -c -r -np -k -L -p www.xxx.org/pub/path/</description>
    </item>
    <item>
      <title>Xdebug的工作原理及在phpstorm下的配置</title>
      <link>https://www.zhouxiaoyu.vip/posts/Xdebug%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%9C%A8phpstorm%E4%B8%8B%E7%9A%84%E9%85%8D%E7%BD%AE.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/Xdebug%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%9C%A8phpstorm%E4%B8%8B%E7%9A%84%E9%85%8D%E7%BD%AE.html</guid>
      <pubDate>Tue, 03 Oct 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>php</category>
      <category>调试</category>
      <description>Xdebug 使用可以很简单，在不需要考虑过多场景的情况下只需要，简单配置三项就可以开启单步调试之旅啦。 xdebug 工作的原理图 xdebug 版本和 php 版本的对应关系 php.ini 中的配置 xdebug 3 的版本 zend_extension=debug [Xdebug] ;开启有这个模式开启则不需要过多的配置即可调试 xdebug.mode = debug ;任意请求都开启 xdebug.start_with_request = true ;IDE中开的端口 本地默认不用配置 xdebug.client_port = 9000 ;IDE所在的IP地址 本地默认不用配置 xdebug.client_host=127.0.0.1</description>
    </item>
    <item>
      <title>sql性能监控工具</title>
      <link>https://www.zhouxiaoyu.vip/posts/sql%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7%E5%B7%A5%E5%85%B7.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/sql%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7%E5%B7%A5%E5%85%B7.html</guid>
      <pubDate>Tue, 03 Oct 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>数据库</category>
      <category>mysql</category>
      <description>对于正在运行的mysql，性能如何，参数设置的是否合理，账号设置的是否存在安全隐患，你是否了然于胸呢？ 俗话说工欲善其事，必先利其器，定期对你的MYSQL数据库进行一个体检，是保证数据库安全运行的重要手段，因为，好的工具是使你的工作效率倍增！ 今天和大家分享几个mysql 优化的工具，你可以使用它们对你的mysql进行一个体检，生成awr报告，让你从整体上把握你的数据库的性能情况。 mysqltuner.pl 是mysql一个常用的数据库性能诊断工具，主要检查参数设置的合理性包括日志文件、存储引擎、安全建议及性能分析。针对潜在的问题，给出改进的建议。是mysql优化的好帮手。</description>
    </item>
    <item>
      <title>代理</title>
      <link>https://www.zhouxiaoyu.vip/posts/%E4%BB%A3%E7%90%86.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/%E4%BB%A3%E7%90%86.html</guid>
      <pubDate>Tue, 03 Oct 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>基础</category>
      <category>patterns</category>
      <category>结构型</category>
      <description>什么是代理模式 代理模式是一种结构型设计模式，其设计思想就和其名字一样，就是给某个对象提供一个代理对象，由代理对象来控制对原对象的访问。 （原文此处有一张代理模式的 UML 结构图，原图床已失效，未恢复） 代理模式的使用场景有哪些 代理模式的使用场景有很多，比如： 在访问某个对象时需要添加额外的逻辑，比如权限控制、日志记录等。 在访问某个对象时需要对原对象进行优化，比如缓存、延迟加载等。 在访问某个对象时需要对原对象进行保护，比如只有特定的人才能访问等。 在访问某个对象时需要对原对象进行扩展，比如增加统计信息等。</description>
    </item>
    <item>
      <title>安装minio做图床</title>
      <link>https://www.zhouxiaoyu.vip/posts/%E5%AE%89%E8%A3%85minio%E5%81%9A%E5%9B%BE%E5%BA%8A.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/%E5%AE%89%E8%A3%85minio%E5%81%9A%E5%9B%BE%E5%BA%8A.html</guid>
      <pubDate>Tue, 03 Oct 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <category>运维</category>
      <description>创建本地目录 mkdir -p /www/minio/data /www/minio/config</description>
    </item>
    <item>
      <title>canvas处理视频</title>
      <link>https://www.zhouxiaoyu.vip/posts/canvas%E5%A4%84%E7%90%86%E8%A7%86%E9%A2%91.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/canvas%E5%A4%84%E7%90%86%E8%A7%86%E9%A2%91.html</guid>
      <pubDate>Fri, 01 Sep 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>javascript</category>
      <category>canvas</category>
      <description>&amp;lt;! DOCTYPE html &amp;gt; &amp;lt; html lang = &quot; en &quot; &amp;gt; &amp;lt; head &amp;gt; &amp;lt; meta charset = &quot; UTF-8 &quot; &amp;gt; &amp;lt; title &amp;gt; Title &amp;lt;/ title &amp;gt; &amp;lt;/ head &amp;gt; &amp;lt; body &amp;gt; &amp;lt; video controls src = &quot; video.ogv &quot; id = &quot; v &quot; &amp;gt; &amp;lt;/ video &amp;gt; &amp;lt; canvas id = &quot; mp4 &quot; &amp;gt; &amp;lt;/ canvas &amp;gt; &amp;lt; script &amp;gt; const v = document . getElementById ( &quot;v&quot; ) const canvas = document . getElementById ( &quot;mp4&quot; ) const ctx = canvas . getContext ( &quot;2d&quot; ) canvas . width = v . offsetWidth canvas . height = v . offsetHeight v . addEventListener ( &quot;play&quot; , function ( ) { var i = window . setInterval ( function ( ) { ctx . drawImage ( v , 0 , 0 ) const imgData = ctx . getImageData ( 0 , 0 , v . offsetWidth , v . offsetHeight ) . data ctx . fillStyle = &quot;#ffffff&quot; ctx . fillRect ( 0 , 0 , v . offsetWidth , v . offsetHeight ) // 图片绘制 需要使用两个循环 一个绘制 x 一个绘制 y for ( let y = 0 ; y &amp;lt; v . offsetHeight ; y = y + 2 ) { for ( let x = 0 ; x &amp;lt; v . offsetWidth ; x = x + 1 ) { let i = ( x + y * v . offsetWidth ) * 4 let r = i let g = i + 1 let b = i + 2 let a = i + 3 if ( r &amp;gt; 140 &amp;amp;&amp;amp; r &amp;lt; 180 &amp;amp;&amp;amp; b &amp;gt; 20 &amp;amp;&amp;amp; b &amp;lt; 50 ) { ctx . fillStyle = &quot;#ffffff&quot; } else { ctx . fillStyle = ` rgba( ${ imgData [ r ] } , ${ imgData [ g ] } , ${ imgData [ b ] } , ${ imgData [ a ] } ) ` } ctx . fillRect ( x , y , 1 , 1 ) } } //当视频结束的时候去掉循环 if ( v . ended ) { clearInterval ( i ) } } , 20 ) ; } , false ) &amp;lt;/ script &amp;gt; &amp;lt;/ body &amp;gt; &amp;lt;/ html &amp;gt;</description>
    </item>
    <item>
      <title>canvas 通过图像数据点阵重新绘制图像</title>
      <link>https://www.zhouxiaoyu.vip/posts/canvas%E9%80%9A%E8%BF%87%E5%9B%BE%E5%83%8F%E6%95%B0%E6%8D%AE%E7%82%B9%E9%98%B5%E9%87%8D%E6%96%B0%E7%BB%98%E5%88%B6%E5%9B%BE%E5%83%8F.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/canvas%E9%80%9A%E8%BF%87%E5%9B%BE%E5%83%8F%E6%95%B0%E6%8D%AE%E7%82%B9%E9%98%B5%E9%87%8D%E6%96%B0%E7%BB%98%E5%88%B6%E5%9B%BE%E5%83%8F.html</guid>
      <pubDate>Fri, 01 Sep 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>javascript</category>
      <category>canvas</category>
      <description>&amp;lt;! DOCTYPE html &amp;gt; &amp;lt; html lang = &quot; en &quot; &amp;gt; &amp;lt; head &amp;gt; &amp;lt; meta charset = &quot; UTF-8 &quot; &amp;gt; &amp;lt; meta http-equiv = &quot; X-UA-Compatible &quot; content = &quot; IE=edge &quot; &amp;gt; &amp;lt; meta name = &quot; viewport &quot; content = &quot; width=device-width, initial-scale=1.0 &quot; &amp;gt; &amp;lt; title &amp;gt; Document &amp;lt;/ title &amp;gt; &amp;lt;/ head &amp;gt; &amp;lt; body &amp;gt; &amp;lt; canvas id = &quot; canvas &quot; &amp;gt; &amp;lt;/ canvas &amp;gt; &amp;lt; script &amp;gt; let img = new Image ( ) img . src = &quot;./1.jpg&quot; ; // img.crossOrigin = false let canvas = document . getElementById ( &quot;canvas&quot; ) const ctx = canvas . getContext ( &quot;2d&quot; ) img . onload = function ( ) { canvas . width = img . width canvas . height = img . height ctx . drawImage ( img , 0 , 0 ) const imgData = ctx . getImageData ( 0 , 0 , img . width , img . height ) . data ctx . fillStyle = &quot;#ffffff&quot; ctx . fillRect ( 0 , 0 , img . width , img . height ) // 图片绘制 需要使用两个循环 一个绘制 x 一个绘制 y for ( let y = 0 ; y &amp;lt; img . height ; y = y + 1 ) { for ( let x = 0 ; x &amp;lt; img . width ; x = x + 2 ) { let i = ( x + y * img . width ) * 4 let r = i let g = i + 1 let b = i + 2 let a = i + 3 ctx . fillStyle = ` rgba( ${ imgData [ r ] } , ${ imgData [ g ] } , ${ imgData [ b ] } , ${ imgData [ a ] } ) ` ctx . fillRect ( x , y , 1 , 1 ) } } } &amp;lt;/ script &amp;gt; &amp;lt;/ body &amp;gt; &amp;lt;/ html &amp;gt;</description>
    </item>
    <item>
      <title>【布局】css布局一本通【转载】</title>
      <link>https://www.zhouxiaoyu.vip/posts/css%E5%B8%83%E5%B1%80%E4%B8%80%E6%9C%AC%E9%80%9A.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/css%E5%B8%83%E5%B1%80%E4%B8%80%E6%9C%AC%E9%80%9A.html</guid>
      <pubDate>Fri, 01 Sep 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>css</category>
      <description>各种页面常见布局+知名网站实例分析+相关阅读推荐 阅前必看：本文总结了各种常见的布局实现，网上搜的“史上最全布局”好像也没有这么全吧？哈哈！就当作一个知识整理吧。至于每个方法的优缺点分析会陆续补上。还有就是这篇文章没提到的其他布局，待本人后续想到或遇到定会在此及时更新。各位读者如果发现问题或者有什么意见，欢迎提出！——欢迎关注！欢迎Star！ 在github上Markdown不支持目录，所以准备了一个 docsify文档网站 。←点这里阅读（已附带目录）</description>
    </item>
    <item>
      <title>mysql取随机数字</title>
      <link>https://www.zhouxiaoyu.vip/posts/mysql%E5%8F%96%E9%9A%8F%E6%9C%BA%E6%95%B0%E5%AD%97.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/mysql%E5%8F%96%E9%9A%8F%E6%9C%BA%E6%95%B0%E5%AD%97.html</guid>
      <pubDate>Fri, 01 Sep 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>数据库</category>
      <category>mysql</category>
      <category>基础知识</category>
      <description>咱们学php的都知道，随机函数rand或mt_rand，可以传入一个参数，产生0到参数之间的随机整数，也可以传入两个参数，产生这两个参数之间的随机整数。 而在mysql里，随机数函数rand不能传参，产生的0到1之间的浮点数，要是我们需要 在mysql产生大于1的随机整数，该怎么办呢？ 这样的需求并不陌生，例如，咱做的文章系统，需要作弊，给文章的浏览量随机加上某个范围内的整数。 现在，假设需要产生234到5678之间的随机整数，mysql下怎么实现。 我们无法改mysql下rand的产生值，但我们可以改变我们的需求，</description>
    </item>
    <item>
      <title>nginx 之 proxy_pass详解</title>
      <link>https://www.zhouxiaoyu.vip/posts/nginx%20%E4%B9%8B%20proxy_pass%E8%AF%A6%E8%A7%A3.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/nginx%20%E4%B9%8B%20proxy_pass%E8%AF%A6%E8%A7%A3.html</guid>
      <pubDate>Fri, 01 Sep 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <description>在nginx中配置proxy_pass代理转发时，如果在proxy_pass后面的url加/，表示绝对根路径；如果没有/，表示相对路径，把匹配的路径部分也给代理走。 假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。 第一种： location /proxy/ { proxy_pass http://127.0.0.1/; } 代理到URL： http://127.0.0.1/test.html</description>
    </item>
    <item>
      <title>nginx下websocket反向代理</title>
      <link>https://www.zhouxiaoyu.vip/posts/nginx%E4%B8%8Bwebsocket%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/nginx%E4%B8%8Bwebsocket%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.html</guid>
      <pubDate>Fri, 01 Sep 2023 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <description>upstream wsbackend { server 127.0 .0.1:8080 ; } server { listen 8001 ; server_name sj-desk-watch-ui.test ; root &quot;D:/laragon/www/sj-desk-watch-ui&quot; ; index index.html index.htm index.php ; location /websocket/ { proxy_pass http://wsbackend/ws/ ; proxy_http_version 1.1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection &quot;upgrade&quot; ; } }</description>
    </item>
    <item>
      <title>IDEA必装插件</title>
      <link>https://www.zhouxiaoyu.vip/posts/IDEA%E5%BF%85%E8%A3%85%E6%8F%92%E4%BB%B6.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/IDEA%E5%BF%85%E8%A3%85%E6%8F%92%E4%BB%B6.html</guid>
      <pubDate>Wed, 01 Sep 2021 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <category>ide</category>
      <description>1、Maven Helper 推荐指数：★★★★★ Maven Helper 是解决 Maven 依赖冲突的利器，可以快速查找项目中的依赖冲突。安装后打开 pom 文件，底部有 Dependency Analyzer 视图。显示红色表示存在依赖冲突，点进去直接在包上右键 Exclude 排除，pom 文件中会做出相应排除包的操作。 此外，该插件还具有以下功能： Conflicts（查看冲突） All Dependencies as List（列表形式查看所有依赖） All Dependencies as Tree（树形式查看所有依赖）</description>
    </item>
    <item>
      <title>linux下搭建samba用来和windows共享文件</title>
      <link>https://www.zhouxiaoyu.vip/posts/linux%E4%B8%8B%E6%90%AD%E5%BB%BAsamba%E7%94%A8%E6%9D%A5%E5%92%8Cwindows%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/linux%E4%B8%8B%E6%90%AD%E5%BB%BAsamba%E7%94%A8%E6%9D%A5%E5%92%8Cwindows%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6.html</guid>
      <pubDate>Wed, 01 Sep 2021 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <category>开发环境</category>
      <description>安装samba yum install samba samba-client samba-swat</description>
    </item>
    <item>
      <title>github快速找项目</title>
      <link>https://www.zhouxiaoyu.vip/posts/github%E5%BF%AB%E9%80%9F%E6%89%BE%E9%A1%B9%E7%9B%AE.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/github%E5%BF%AB%E9%80%9F%E6%89%BE%E9%A1%B9%E7%9B%AE.html</guid>
      <pubDate>Thu, 05 Aug 2021 00:25:00 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <description>关键词 + simple 例如 webrtc simple 找样板项目 关键词 + starter 例如 vue starter 找到相关项目案例 关键词 + boilerplate 例如 spring boilerplate 参考文档</description>
    </item>
    <item>
      <title>封装一个三方组件的通用套路</title>
      <link>https://www.zhouxiaoyu.vip/posts/vue%E4%B8%AD%E5%B0%81%E8%A3%85%E4%B8%80%E4%B8%AA%E4%B8%89%E6%96%B9%E7%BB%84%E4%BB%B6%E7%9A%84%E9%80%9A%E7%94%A8%E5%A5%97%E8%B7%AF.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/vue%E4%B8%AD%E5%B0%81%E8%A3%85%E4%B8%80%E4%B8%AA%E4%B8%89%E6%96%B9%E7%BB%84%E4%BB%B6%E7%9A%84%E9%80%9A%E7%94%A8%E5%A5%97%E8%B7%AF.html</guid>
      <pubDate>Thu, 22 Jul 2021 06:09:00 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>vuejs</category>
      <category>2.x</category>
      <description>属性封装 $attrs : 包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外) 。当一个组件没有声明任何 prop 时，这里会包含所有父作用域的绑定 (class 和 style 除外)，并且可以通过 v-bind=&quot;$attrs&quot; 传入内部组件 inheritAttrs 设置为 false ，避免给myInput组件设置的属性被添加到myInput组件的根元素div上。</description>
    </item>
    <item>
      <title>PHP实现ZIP流式打包下载（Zip on the fly）</title>
      <link>https://www.zhouxiaoyu.vip/posts/PHP%E5%AE%9E%E7%8E%B0ZIP%E6%B5%81%E5%BC%8F%E6%89%93%E5%8C%85%E4%B8%8B%E8%BD%BD.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/PHP%E5%AE%9E%E7%8E%B0ZIP%E6%B5%81%E5%BC%8F%E6%89%93%E5%8C%85%E4%B8%8B%E8%BD%BD.html</guid>
      <pubDate>Thu, 22 Jul 2021 06:06:00 GMT</pubDate>
      <category>开发</category>
      <category>编程语言</category>
      <category>php</category>
      <category>源码</category>
      <description>php zip实现类 /** * Zip file creation class. * Makes zip files. * * @access public * @package PhpMyAdmin * @see Official ZIP file format: https://www.pkware.com/support/zip-app-note */ class ZipFile { /** * Whether to echo zip as it&apos;s built or return as string from -&amp;gt; file * * @var boolean $doWrite */ var $doWrite = false ; /** * Array to store compressed data * * @var array $datasec */ var $datasec = array ( ) ; /** * Central directory * * @var array $ctrl_dir */ var $ctrl_dir = array ( ) ; /** * End of central directory record * * @var string $eof_ctrl_dir */ var $eof_ctrl_dir = &quot;\x50\x4b\x05\x06\x00\x00\x00\x00&quot; ; /** * Last offset position * * @var integer $old_offset */ var $old_offset = 0 ; /** * Comments * * @var string $comments */ var $comments = &apos;&apos; ; /** * Sets member variable this -&amp;gt; doWrite to true * - Should be called immediately after class instantiation * - If set to true, then ZIP archive are echo&apos;ed to STDOUT as each * file is added via this -&amp;gt; addfile(), and central directories are * echoed to STDOUT on final call to this -&amp;gt; file(). Also, * this -&amp;gt; file() returns an empty string so it is safe to issue a * &quot;echo $zipfile;&quot; command * * @access public * * @return void */ function setDoWrite ( ) { $this -&amp;gt; doWrite = true ; } // end of the &apos;setDoWrite()&apos; method function setComments ( $comments ) { $this -&amp;gt; comments = $comments ; } /** * Converts an Unix timestamp to a four byte DOS date and time format (date * in high two bytes, time in low two bytes allowing magnitude comparison). * * @param integer $unixtime the current Unix timestamp * * @return integer the current date in a four byte DOS format * * @access private */ function unix2DosTime ( $unixtime = 0 ) { $timearray = ( $unixtime == 0 ) ? getdate ( ) : getdate ( $unixtime ) ; if ( $timearray [ &apos;year&apos; ] &amp;lt; 1980 ) { $timearray [ &apos;year&apos; ] = 1980 ; $timearray [ &apos;mon&apos; ] = 1 ; $timearray [ &apos;mday&apos; ] = 1 ; $timearray [ &apos;hours&apos; ] = 0 ; $timearray [ &apos;minutes&apos; ] = 0 ; $timearray [ &apos;seconds&apos; ] = 0 ; } // end if return ( ( $timearray [ &apos;year&apos; ] - 1980 ) &amp;lt;&amp;lt; 25 ) | ( $timearray [ &apos;mon&apos; ] &amp;lt;&amp;lt; 21 ) | ( $timearray [ &apos;mday&apos; ] &amp;lt;&amp;lt; 16 ) | ( $timearray [ &apos;hours&apos; ] &amp;lt;&amp;lt; 11 ) | ( $timearray [ &apos;minutes&apos; ] &amp;lt;&amp;lt; 5 ) | ( $timearray [ &apos;seconds&apos; ] &amp;gt;&amp;gt; 1 ) ; } // end of the &apos;unix2DosTime()&apos; method /** * Adds &quot;file&quot; to archive * * @param string $data file contents * @param string $name name of the file in the archive (may contains the path) * @param integer $time the current timestamp * * @access public * * @return void */ function addFile ( $data , $name , $time = 0 ) { $name = str_replace ( &apos;\\&apos; , &apos;/&apos; , $name ) ; $hexdtime = pack ( &apos;V&apos; , $this -&amp;gt; unix2DosTime ( $time ) ) ; $fr = &quot;\x50\x4b\x03\x04&quot; ; $fr .= &quot;\x14\x00&quot; ; // ver needed to extract $fr .= &quot;\x00\x00&quot; ; // gen purpose bit flag $fr .= &quot;\x08\x00&quot; ; // compression method $fr .= $hexdtime ; // last mod time and date // &quot;local file header&quot; segment $unc_len = strlen ( $data ) ; $crc = crc32 ( $data ) ; $zdata = gzcompress ( $data ) ; $zdata = substr ( substr ( $zdata , 0 , strlen ( $zdata ) - 4 ) , 2 ) ; // fix crc bug $c_len = strlen ( $zdata ) ; $fr .= pack ( &apos;V&apos; , $crc ) ; // crc32 $fr .= pack ( &apos;V&apos; , $c_len ) ; // compressed filesize $fr .= pack ( &apos;V&apos; , $unc_len ) ; // uncompressed filesize $fr .= pack ( &apos;v&apos; , strlen ( $name ) ) ; // length of filename $fr .= pack ( &apos;v&apos; , 0 ) ; // extra field length $fr .= $name ; // &quot;file data&quot; segment $fr .= $zdata ; // echo this entry on the fly, ... if ( $this -&amp;gt; doWrite ) { echo $fr ; } else { // ... OR add this entry to array $this -&amp;gt; datasec [ ] = $fr ; } // now add to central directory record $cdrec = &quot;\x50\x4b\x01\x02&quot; ; $cdrec .= &quot;\x00\x00&quot; ; // version made by $cdrec .= &quot;\x14\x00&quot; ; // version needed to extract $cdrec .= &quot;\x00\x00&quot; ; // gen purpose bit flag $cdrec .= &quot;\x08\x00&quot; ; // compression method $cdrec .= $hexdtime ; // last mod time &amp;amp; date $cdrec .= pack ( &apos;V&apos; , $crc ) ; // crc32 $cdrec .= pack ( &apos;V&apos; , $c_len ) ; // compressed filesize $cdrec .= pack ( &apos;V&apos; , $unc_len ) ; // uncompressed filesize $cdrec .= pack ( &apos;v&apos; , strlen ( $name ) ) ; // length of filename $cdrec .= pack ( &apos;v&apos; , 0 ) ; // extra field length $cdrec .= pack ( &apos;v&apos; , 0 ) ; // file comment length $cdrec .= pack ( &apos;v&apos; , 0 ) ; // disk number start $cdrec .= pack ( &apos;v&apos; , 0 ) ; // internal file attributes $cdrec .= pack ( &apos;V&apos; , 32 ) ; // external file attributes // - &apos;archive&apos; bit set $cdrec .= pack ( &apos;V&apos; , $this -&amp;gt; old_offset ) ; // relative offset of local header $this -&amp;gt; old_offset += strlen ( $fr ) ; $cdrec .= $name ; // optional extra field, file comment goes here // save to central directory $this -&amp;gt; ctrl_dir [ ] = $cdrec ; } // end of the &apos;addFile()&apos; method /** * Echo central dir if -&amp;gt;doWrite==true, else build string to return * * @return string if -&amp;gt;doWrite { empty string } else the ZIP file contents * * @access public */ function file ( ) { $ctrldir = implode ( &apos;&apos; , $this -&amp;gt; ctrl_dir ) ; $header = $ctrldir . $this -&amp;gt; eof_ctrl_dir . pack ( &apos;v&apos; , sizeof ( $this -&amp;gt; ctrl_dir ) ) . //total #of entries &quot;on this disk&quot; pack ( &apos;v&apos; , sizeof ( $this -&amp;gt; ctrl_dir ) ) . //total #of entries overall pack ( &apos;V&apos; , strlen ( $ctrldir ) ) . //size of central dir pack ( &apos;V&apos; , $this -&amp;gt; old_offset ) . //offset to start of central dir pack ( &apos;v&apos; , strlen ( $this -&amp;gt; comments ) ) . //.zip file comment length $this -&amp;gt; comments ; if ( $this -&amp;gt; doWrite ) { // Send central directory &amp;amp; end ctrl dir to STDOUT echo $header ; return &quot;&quot; ; // Return empty string } else { // Return entire ZIP archive as string $data = implode ( &apos;&apos; , $this -&amp;gt; datasec ) ; return $data . $header ; } } // end of the &apos;file()&apos; method } // end of the &apos;PMA\libraries\ZipFile&apos; class</description>
    </item>
    <item>
      <title>IDEA文件模板变量</title>
      <link>https://www.zhouxiaoyu.vip/posts/IDEA%E6%96%87%E4%BB%B6%E6%A8%A1%E6%9D%BF%E5%8F%98%E9%87%8F.html</link>
      <guid isPermaLink="true">https://www.zhouxiaoyu.vip/posts/IDEA%E6%96%87%E4%BB%B6%E6%A8%A1%E6%9D%BF%E5%8F%98%E9%87%8F.html</guid>
      <pubDate>Wed, 21 Jul 2021 16:00:00 GMT</pubDate>
      <category>开发</category>
      <category>tools</category>
      <category>ide</category>
      <description>IntelliJ IDEA 创建文件模板 打开“设置/首选项”对话框，并在编辑器节点下选择文件和代码模板页面。 切换到 &quot;文件&quot; 选项卡。 单击工具栏上的 图标，并指定模板名称、文件扩展名和模板正文，该模块可以包含以下内容： 纯文本。 #parse 指令与包含一起使用。 要扩展为格式 $ {&amp;lt;variable_name&amp;gt;} 的相应值的预定义变量。 可用的预定义文件模板变量是： ${PACKAGE_NAME} - 将创建新类或接口的目标包的名称。 ${PROJECT_NAME} - 当前项目的名称。 ${FILE_NAME} - 将要创建的 PHP 文件的名称。 ${NAME} - 在创建文件的过程中，在 &quot;新建文件&quot; 对话框中指定的新文件的名称。 ${USER} - 当前用户的登录名。 ${DATE} - 当前系统日期。 ${TIME} - 当前系统时间。 ${YEAR} - 本年度。 ${MONTH} - 当月。 ${DAY} - 当月的当前日期。 ${HOUR} - 当前时间。 ${MINUTE} - 当前分钟。 ${PRODUCT_NAME} - 将在其中创建文件的 IDE 的名称。 ${MONTH_NAME_SHORT} - 月份名称的前3个字母。示例：1月，2月等。 ${MONTH_NAME_FULL} - 一个月的全名。示例：1月，2月等。 IntelliJ IDEA 为 PHP 包括模板提供了一组附加变量，即可以包含在其他 PHP 文件模板内容中的可重用片段的模板。内置的 PHP 包含模板用于生成文件头和 PHPDoc 文档注释。下列变量在 PHP 包含模板中可用： ${NAME} - 将为其生成 PHPDoc 注释的类、字段或函数（方法）的名称。 ${NAMESPACE} - 类或字段命名空间的完全限定名（无斜杠）。 ${CLASS_NAME} - 定义了生成 PHPDoc 注释的字段的类的名称。 ${STATIC}- 如果要为其生成注释的函数 (方法) 或字段为静态（static），则获取静态值。否则计算结果为空字符串。 ${TYPE_HINT}- 提示函数 (方法) 的返回值以生成注释。如果无法通过函数 (方法) 的静态分析检测到返回类型，则计算结果为 void。 ${PARAM_DOC} - 参数的文档注释。计算为一组 @param 类型名称的行。如果要为其生成注释的函数不包含任何参数，则该变量将计算为空内容。 ${THROWS_DOC} - 异常的文档注释。计算结果为一组 @throws 类型的行。如果要为其生成注释的函数不抛出任何异常，则该变量将计算为空内容。 ${DS}- 一个美元字符 ($)。该变量的计算结果为纯美元字符 ($)，当您需要转义此符号时使用它，使其不被视为变量的前缀。 ${CARET} - 指出了在生成和添加评论后插入符号的位置。 仅当在创建文件期间生成并插入 PHPDoc 注释时，才应用此变量。当 PHPDoc 注释是通过代码| 生成| PHPDoc 块（Code | Generate | PHPDoc block）创建的， 可以使用多个函数或方法的选择，因此文档注释可以创建到几个类、函数、方法或字段。因此，IntelliJ IDEA 无法“选择”块来应用 ${CARET} 变量，因此在这种情况下，该 ${CARET} 变量将被忽略。 自定义变量。它们的名称可以通过 #set 指令在模板中定义，也可以在文件创建过程中进行定义。 若要将美元字符 ($) 放在呈现为 &quot;as&quot; 的变量中，请改用 ${DS} 变量。此变量的计算结果为纯美元字符 ($)。 应用更改并关闭对话框。 IntelliJ IDEA 从现有文件夹创建文件模板 打开 &quot;文件模板设置&quot; 页并切换到 &quot;文件&quot; 选项卡。 单击工具栏的 图标，根据需要更改模板名称、扩展名和源代码。 应用更改并关闭对话框。 IntelliJ IDEA 从文件创建文件模板 在编辑器中打开所需的文件。 在主菜单上选择工具|将文件另存为模板（Tools | Save File as Template）。 在 &quot;文件和代码模板&quot; 对话框中指定新模板的名称，并在必要时编辑源代码。 应用更改并关闭对话框。 IntelliJ IDEA 创建和引用包含模板 IntelliJ IDEA 中包含模板用于通过 #parse 指令定义要插入到文件模板中的可重用代码段。</description>
    </item>
  </channel>
</rss>
