<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <atom:link href="https://www.jefsky.com/feed" rel="self" type="application/rss+xml" />
        <title><![CDATA[程序猿甜品店 | Jefsky - 小姓黄，鹤舞昂黄😊用心积累,无心成荫]]></title>
        <link><![CDATA[https://www.jefsky.com/feed]]></link>
        <description><![CDATA[一个很普通的人，留下存在过的痕迹。可能是日常生活，可能是开发过程的坑，可能成果，可能啥都不是，诸如此类。谢谢你的倾听来访！]]></description>
        <language>zh_CN</language>
        <pubDate>Mon, 07 Apr 2025 06:39:23 +0000</pubDate>

                    <item>
                <title><![CDATA[tp5.0 PHP8.0报错Method ReflectionParameter::getClass() is deprecated]]></title>
                <link>https://www.jefsky.com/blog/10</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/10</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>$class = $param->getClass();<br>//更换为<br>$class = $param->getType();</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:28:39 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[apache sites-enable 和 sites-available的区别]]></title>
                <link>https://www.jefsky.com/blog/12</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/12</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>Linux的Apache配置文件是 /etc/apache2/apache2.conf，Apache在启动时会自动读取这个文件的配置信息。而其他的一些配置文件，如 httpd.conf等，则是通过include指令包含进来。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在apache2.conf里有sites-enabled目录，而在 /etc/apache2下还有一个sites-available目录。其实，这里面才是真正的配置文件，而sites-enabled目录存放的只是一些指向这里的文件链接，可以通过ls -al /etc/apache2/sites-enabled/来查看来源。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>因此，如果apache上配置了多个虚拟主机，只需要将虚拟主机的配置文件都放在sites-available下，当在sites-enabled下建立一个指向某个虚拟主机配置文件的链接时，就启用了它；如果要关闭某个虚拟主机的话，只需删除相应的链接即可，无需去改配置文件。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 21:28:38 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Docker 安装 mysql 容器]]></title>
                <link>https://www.jefsky.com/blog/14</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/14</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">docker 中下载 mysql</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>docker pull mysql</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">启动</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=roor! -d mysql</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">进入容器</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>docker exec -it mysql bash</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">登录mysql</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>mysql -u root -p<br>ALTER USER 'root'@'localhost' IDENTIFIED BY 'roor!';</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">添加远程登录用户</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>CREATE USER 'roor'@'%' IDENTIFIED WITH mysql_native_password BY 'roor!';<br>GRANT ALL PRIVILEGES ON&nbsp;<em>.</em>&nbsp;TO 'roor'@'%';</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:31:04 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决强制重启系统导致mysql无法启动]]></title>
                <link>https://www.jefsky.com/blog/16</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/16</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>SQLSTATE[HY000] [2002] No such file or directory</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>若您非法关机导致数据库无法启动，一般是强制关机导致MySQL二进制日志损坏，可使用以下命令处理<br>建议：建议关机或重启时最好先停止mysqld服务，否则有一定机率导致数据库损坏。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>清理二进制日志：<br>rm -f /www/server/data/ib_*<br>rm -f /www/server/data/mysql-bin*</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>尝试启动mysqld<br>service mysqld start</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>若还报错，请查看错误日志<br>cat /www/server/data/*.err</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 16:37:25 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[开启windows 下滑关机功能]]></title>
                <link>https://www.jefsky.com/blog/18</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/18</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1.创建一个快捷方式;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2.把目标设置为:%windir%System32SlideToShutDown.exe</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 11:31:19 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkcmf 管理员忘记密码]]></title>
                <link>https://www.jefsky.com/blog/20</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/20</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>忘记密码 可在登陆的控制器那里用</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dump(cmf_password('123456'));
die;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>来获得重置密码</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 07:52:07 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[select2插件 已选项顺序需要按照选择顺序进行排序]]></title>
                <link>https://www.jefsky.com/blog/22</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/22</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>多选列表是1,2,3,4,但是我选择的顺序是2,4,3,1,我录入数据库需要按照我的录入顺序来,可是select2却会按照列表的排序来.插件本身会对已选项按照备选下拉框中的顺序进行排序.解决方法是在选择某一选项时,把它放到所有选项的最后.</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>   $("select").on("select2:select", function (evt) {
    var element = evt.params.data.element;
    var $element = $(element);
    $element.detach();
    $(this).append($element);
    $(this).trigger("change");
});</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 07:52:34 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[宝塔部署时,出现“open_basedir restriction in effect”错误]]></title>
                <link>https://www.jefsky.com/blog/24</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/24</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>错误信息:<br>Warning: require(): open_basedir restriction in effect.<br>Warning: require(XXXXXXXXXXX): failed to open stream: Operation not permitted in XXXX</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>解决方案:<br>更改宝塔网站配置:去掉勾选防跨站攻击（open_basedir）;</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:06:34 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[wordpress aperture-portfolio主题bug]]></title>
                <link>https://www.jefsky.com/blog/26</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/26</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>Parse error: syntax error, unexpected ''<a href="https://portfolio.thepixeltri/" target="_BLANK" rel="noreferrer noopener">https://portfolio.thepixeltri</a>' (T_ENCAPSED_AND_WHITESPACE), expecting ';' in&nbsp;/wp-content/themes/aperture-portfolio/inc/customizer.php&nbsp;on line&nbsp;129<br>您的站点遇到了致命错误。<br>了解更多在WordPress中调试的信息。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>解决方案:<br>/wp-content/themes/aperture-portfolio/inc/customizer.php&nbsp;on line&nbsp;129<br>漏了',加上就好</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:24:34 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[升级WordPress提示：另一更新正在进行]]></title>
                <link>https://www.jefsky.com/blog/28</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/28</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>我的版本是5.4.2，安装完成后提示有更新，但执行更新后总是提示“另一更新正在进行”.<br>后来发现,升级的时候，WordPress会在数据库中wp_options表里增加一条更新记录core_updater.lock用来标记当前的升级状态。所以,如果中途打断升级，这个记录会留在数据库中。当下次升级时，WordPress检测到此记录的存在就会返回“另一更新正在进行”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>解决方案：<br>删除数据库wp_options表中core_updater.lock记录</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 15:17:30 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[七牛上传报400：incorrect region, please use xxxx.qiniu.com]]></title>
                <link>https://www.jefsky.com/blog/30</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/30</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>上传的时候，如果遇到类似400：incorrect region, please use xxx.qiniu.com的错误，说明是上传域名和空间所在的区域不匹配，<strong>多发生在旧的sdk、工具和插件上</strong>。后面的 xxx.qiniu.com是正确的上传域名。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>存储区域和上传域名的对应关系见<a href="https://developer.qiniu.com/kodo/manual/1671/region-endpoint" target="_BLANK" rel="noreferrer noopener">https://developer.qiniu.com/kodo/manual/1671/region-endpoint</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>出现这种情况，如果是使用的第三方插件，需要更新插件或询问第三方开发人员；如果是使用sdk，可以更新成最新的sdk，如果是使用七牛提供的工具，需要你更新为最新版本的qshell工具</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">旧版存储区域</h2>
<!-- /wp:heading -->

<!-- wp:table -->
<figure class="wp-block-table"><table><thead><tr><th>存储区域</th><th>地域简称</th><th>上传域名</th></tr></thead><tbody><tr><td>华东</td><td>z0</td><td>服务器端上传：http(s)://up.qiniup.com</td></tr><tr><td></td><td></td><td>客户端上传： http(s)://upload.qiniup.com</td></tr><tr><td>华北</td><td>z1</td><td>服务器端上传：http(s)://up-z1.qiniup.com</td></tr><tr><td></td><td></td><td>客户端上传：http(s)://upload-z1.qiniup.com</td></tr><tr><td>华南</td><td>z2</td><td>服务器端上传：http(s)://up-z2.qiniup.com</td></tr><tr><td></td><td></td><td>客户端上传：http(s)://upload-z2.qiniup.com</td></tr><tr><td>北美</td><td>na0</td><td>服务器端上传：http(s)://up-na0.qiniup.com</td></tr><tr><td></td><td></td><td>客户端上传：http(s)://upload-na0.qiniup.com</td></tr><tr><td>东南亚</td><td>as0</td><td>服务器端上传：http(s)://up-as0.qiniup.com</td></tr><tr><td></td><td></td><td>客户端上传：http(s)://upload-as0.qiniup.com</td></tr></tbody></table></figure>
<!-- /wp:table -->]]></content>
                <pubDate>Mon, 15 Jan 2024 11:39:19 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Linux一键搭建KMS激活服务器 轻松激活Windows和Office]]></title>
                <link>https://www.jefsky.com/blog/32</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/32</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>如果你拥有自己的服务器，那就不要浪费了，赶紧搭建一个属于你自己的 KMS 激活服务器，自主激活 Windows 和 Office 并自动续期，告别每次重装后都要到度娘上找上一天不止的激活工具，又害怕中毒</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>该激活方法，只能激活 VL 版的系统，如果不是 VL 可以应用 KMS client setup keys 进行转换</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">One key KMS</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在Linux上一键搭建KMS服务器</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>特别感谢KMS服务器程序的开发者Wind4</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>KMS服务器软件vlmcsd Github主页：<a href="https://github.com/Wind4/vlmcsd" target="_BLANK" rel="noreferrer noopener">https://github.com/Wind4/vlmcsd</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>现在还处于测试阶段，您的服务器出现任何问题本人与服务器程序作者均不承担任何责任。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>请根据自己的服务器操作系统运行对应的脚本。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>CentOS，Redhat，Fedora等请选择CentOS脚本</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Debian，Ubuntu，Mint等请选择Debian脚本</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">kms.sh管理脚本的使用：</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果您使用这里的一键脚本安装，即可完美使用该脚本，否则需要手动更改可执行文件存放路径</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>只有start/stop/restart/status的功能，直接执行即可</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>./kms.sh start</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">下载方式</h2>
<!-- /wp:heading -->

<!-- wp:embed {"url":"https://github.com/dakkidaze/one-key-kms"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/dakkidaze/one-key-kms
</div></figure>
<!-- /wp:embed -->

<!-- wp:heading -->
<h2 class="wp-block-heading">下载脚本并运行，根据提示键入y开始安装</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">CentOS / Redhat / Fedora</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>wget https://raw.githubusercontent.com/dakkidaze/one-key-kms/master/one-key-kms-centos.sh &amp;&amp; chmod +x one-key-kms-centos.sh &amp;&amp;./one-key-kms-centos.sh</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Debian / Ubuntu / Mint</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>wget https://raw.githubusercontent.com/dakkidaze/one-key-kms/master/one-key-kms-debian.sh &amp;&amp; chmod +x one-key-kms-debian.sh &amp;&amp; ./one-key-kms-debian.sh
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">下载这个配套脚本来控制启动/停止/重启等</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>#下载脚本
    wget https://raw.githubusercontent.com/dakkidaze/one-key-kms/master/kms.sh &amp;&amp; chmod +x kms.sh
#启动 KMS 服务
    ./kms.sh start
#这个脚本可以使用的参数：
    # start | stop | restart | status</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">配置防火墙,放行1688端口</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">CentOS / Redhat / Fedora</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>iptables -I INPUT -p tcp --dport 1688 -j ACCEPT</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Debian / Ubuntu / Mint</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>#使用 ufw
ufw allow 1688</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">激活 Windows</h2>
<!-- /wp:heading -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>请移步&nbsp;<a href="https://www.jefsky.com/kms.html"></a><a href="https://www.jefsky.com/kms.html">https://www.jefsky.com/kms.html</a></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading -->
<h2 class="wp-block-heading">开机自启</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果想让 KMS 服务在 Linux 上开机自启，那么编辑/etc/rc.local文件，在exit 0（如果有）前面加上一句</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code># kms.sh 脚本位于 /root/kms.sh
/root/kms.sh start</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>保存就好</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">守护进程</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>#Debian / Ubuntu / Mint 使用 apt-get 来安装 supervisor
#CentOS / Redhat / Fedora 使用 yum 来安装 supervisor
#这里以 Debian 系统为例
apt-get install supervisor -y
echo "&#91;program:kms]
command=/usr/local/kms/vlmcsd -L 0.0.0.0:1688
autorestart=true
autostart=true
user=root" &gt; /etc/supervisor/conf.d/kms.conf
/etc/init.d/supervisor restart
</code></pre>
<!-- /wp:code -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>如果使用守护进程方式运行 KMS 服务，那么就不需要再设置开机自启了</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->]]></content>
                <pubDate>Mon, 15 Jan 2024 18:37:40 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[一个可以让你网页标题有感情的typecho插件]]></title>
                <link>https://www.jefsky.com/blog/34</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/34</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">食用方法</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="https://github.com/jefsky/typecho-TitleTips/releases" target="_BLANK" rel="noreferrer noopener">下载插件</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">使用说明</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>下载插件，修改文件名为<code>TitleTips</code>放到<code>/usr/plugins</code>目录，然后到后台启用</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>插件默认关闭预载入jquery3.3.1.min.js,如果您的博客已经引入jquery可进入插件设置中关闭</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>本插件用于当网页失焦或聚焦时,网页标题发生改变。可在插件设置中配置不同状态时所要显示的标题。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 16:31:27 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho 一些冷门小技巧]]></title>
                <link>https://www.jefsky.com/blog/36</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/36</guid>
                <content><![CDATA[<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">切换 IP 来源获取</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果你的网站使用了 CloudFlare 一类的 CDN 服务使得部分插件无法正常记录用户 IP 地址的话，可以在 config.inc.php 声明这个静态变量，替换成服务商对应的用户 IP 头就可以了！CloudFlare 现在默认提供的是 HTTP_X_FORWARDED_FOR 头传送用户真实 IP 地址，所以我直接填入头的名称就可以了！</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>define('__TYPECHO_IP_SOURCE__', 'HTTP_X_FORWARDED_FOR');</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">使用自己的静态存储</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果你有自己的 CDN 或静态存储，希望 Typecho 不使用默认的站点地址来分发内容，可以在 config.inc.php 声明这个静态变量，替换成你自己的附件地址即可！REQUEST_SCHEME 是访问站点的协议，所以 HTTP、HTTPS 都可以使用。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>define('__TYPECHO_UPLOAD_URL__', $_SERVER&#91;'REQUEST_SCHEME'] . '://static.paugram.com');</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">自定义 Gravatar 源</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>使用自己的 Gravatar 源，例如 V2EX 提供的源。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>define('__TYPECHO_GRAVATAR_PREFIX__', 'https://cdn.v2ex.com/gravatar/');</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">排错功能</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>插入如下代码后，在编写插件或模板遇到问题时会输出更详细的报错信息（还要确认 PHP 的 display_errors 是否为 On）</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>define('__TYPECHO_DEBUG__', true);</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">模板开发</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>这两段函数在模板开发中必不可缺，否则会出现一些奇怪的 Bug！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这段是 Typecho 的头部输出内容，如缺少将导致文章评论出现异常。建议放在 header.php 里面。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$this -&gt; header();</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>这段是 Typecho 的尾部输出内容，如缺少将可能导致部分需要前端支持的插件无法使用。建议放在 footer.php 里面。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$this -&gt; footer();</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">输出头像</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>这段函数用于输出当前页面的作者头像，可以用来做作者介绍和版权提示。参数是头像尺寸，建议大于等于 64 像素。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$this -&gt; author -&gt; gravatar(64);</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">输出当前登录用户的头像地址，可以用于评论区的输出。</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>echo Typecho_Common::gravatarUrl($this -&gt; user -&gt; mail, 150, 'X', 'mm')</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">检测是否登录</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>用于检测用户是否登录，已登录返回 true 否则为 false，可以用来实现模板内的评论框结构变更，或是限制模板页面的内容不对外显示。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$this -&gt; user -&gt; hasLogin();</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">页面链接</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>输出上一页 / 下一页的链接</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$this -&gt; pageLink('上一页');
$this -&gt; pageLink('下一页', 'next');</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">文章时间</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>获得文章创建的时间</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$this -&gt; created</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">获得文章上次修改的时间</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$this -&gt; modified</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">计算文章修改自多少天前</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>ceil((time() - $this -&gt; modified) / 86400) // 当前时间减去修改时间，换算为天并取整</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">文章信息</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>count($this -&gt; tags()) // 返回标签数量
count($this -&gt; category()) // 返回标签数量
</code></pre>
<!-- /wp:code -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>转自<a href="https://paugram.com/coding/typecho-secret-usage.html" target="_BLANK" rel="noreferrer noopener">https://paugram.com/coding/typecho-secret-usage.html</a></p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->]]></content>
                <pubDate>Mon, 15 Jan 2024 11:00:16 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkphp6 json字段中的某项目(数据库操作)]]></title>
                <link>https://www.jefsky.com/blog/38</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/38</guid>
                <content><![CDATA[<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">单独修改</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$data&#91;'list-&gt;name'] = '张三';
Db::name('student')-&gt;json(&#91;'list])-&gt;where('id',2)-&gt;update($data);
</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">单独查询</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$student = Db::name('student')-&gt;json(&#91;'list'])-&gt;where('list-&gt;name','张三')-&gt;find();</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 22:23:48 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkphp6 where优先级查询]]></title>
                <link>https://www.jefsky.com/blog/40</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/40</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>$map&#91;] = &#91;'id','&gt;',0];
$map&#91;] = &#91;'sex',1];
$map&#91;] = &#91;'color','blue'];

Db::name('student')
    -&gt;where($map)
    -&gt;where(&#91;'name','like','%efs%'])
    -&gt;select();

SELECT * FROM `student` WHERE `id` &gt; 0 AND `sex` = 1 AND `color` = 'blue' AND 'name' LIKE '%efs%';

Db::name('student')
    -&gt;where(&#91;$map])
    -&gt;where(&#91;'name','like','%efs%'])
    -&gt;select();

SELECT * FROM `student` WHERE ( `id` &gt; 0 AND `sex` = 1 AND `color` = 'blue' ) AND 'name' LIKE '%efs%';
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>一般情况下,where()连缀生成的sql语句是并列AND条件的,当出现优先时,如上所示,如要优先查询$map中的条件再查询'name'条件,只需在where()中加入'[]'即可</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 13:30:17 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[url重写,省略index.php]]></title>
                <link>https://www.jefsky.com/blog/42</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/42</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>httpd.conf配置文件中加载mod_rewrite.so模块;AllowOverroide None 将 None 改为 All</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:17:07 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[国内开源镜像站汇总]]></title>
                <link>https://www.jefsky.com/blog/44</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/44</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>阿里开源镜像站：<a href="http://developer.aliyun.com/mirror/" target="_BLANK" rel="noreferrer noopener">developer.aliyun.com/mirror/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>网易开源镜像站：<a href="http://mirrors.163.com/" target="_BLANK" rel="noreferrer noopener">mirrors.163.com/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>华为开源镜像站：<a href="http://mirrors.huaweicloud.com/" target="_BLANK" rel="noreferrer noopener">mirrors.huaweicloud.com/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>搜狐开源镜像站：<a href="http://mirrors.sohu.com/" target="_BLANK" rel="noreferrer noopener">mirrors.sohu.com/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>清华大学：<a href="http://mirrors.tuna.tsinghua.edu.cn/" target="_BLANK" rel="noreferrer noopener">mirrors.tuna.tsinghua.edu.cn/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>中国科技大学：<a href="http://mirrors.ustc.edu.cn/" target="_BLANK" rel="noreferrer noopener">mirrors.ustc.edu.cn/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>北京交通大学：<a href="http://mirror.bjtu.edu.cn/cn/" target="_BLANK" rel="noreferrer noopener">mirror.bjtu.edu.cn/cn/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>上海交通大学：<a href="http://ftp.sjtu.edu.cn/" target="_BLANK" rel="noreferrer noopener">ftp.sjtu.edu.cn/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>北京理工大学：<a href="http://mirror.bit.edu.cn/web/" target="_BLANK" rel="noreferrer noopener">mirror.bit.edu.cn/web/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>浙江大学：<a href="http://mirrors.zju.edu.cn/" target="_BLANK" rel="noreferrer noopener">mirrors.zju.edu.cn</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>北京理工大学：<a href="http://mirror.bit.edu.cn/" target="_BLANK" rel="noreferrer noopener">mirror.bit.edu.cn</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>华中科技大学：<a href="http://mirrors.hust.edu.cn/" target="_BLANK" rel="noreferrer noopener">mirrors.hust.edu.cn/</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 08:59:48 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[英语常用万能句型整理]]></title>
                <link>https://www.jefsky.com/blog/46</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/46</guid>
                <content><![CDATA[<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>There＋be ＋主语＋地点状语/ 时间状语</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>What’s wrong with＋sb. / sth. ？</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>How do you like...？　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>What do you like about...？　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>had better（not）＋动词原形　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>How＋adj. / adv. ＋主语＋谓语！　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>What a/ an＋adj. ＋n. ＋主语＋谓语！　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Thank＋sb. ＋for（doing）sth.　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>So＋be/ 情态动词/ 助动词＋主语　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... not ... until ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>比较级＋and＋比较级　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>the ＋比较级，the ＋比较级　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... as ＋adj./ adv.＋as ...　　…not as(so) ＋adj. / adv. ＋as ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>more/ less ＋adj.＋than...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>stop…from doing sth.　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>both ... and ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>either ... or...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>neither ... nor ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... as soon as ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... so＋adj. / adv.＋that ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Though...＋主句　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be going to　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be different from　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Welcome（back）to...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>have fun doing　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... because ... / ...，so ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Why don’t you ... / Why not ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>make it　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>have nothing to do　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be sure/ be sure of/ about sth. / be sure to do sb.　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>between ... and ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>keep sb. / sth. ＋adj./ V-ing/ 介词补语/ adv.　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>find ＋宾语＋宾补　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... not ... anymore/ longer　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>What’s the weather like...？　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>There is no time to do/ have no time to do　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Help oneself to...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>used to do　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>borrow ... from　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>lend sb. sth. / lend sth. to sb.　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>have been to　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>have gone to　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be famous for　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>No matter ＋疑问句＋主句　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be afraid（of / todo / that...）　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... as ... as possible / ... as ... as sb can　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>practise / enjoy / finish doing　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>It’s said that ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Not all / everyone ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be based on　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>... so that ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be＋num. ＋metres / kilometres / years...＋long / wide / deep / high / old...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>keep ... from doing　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>with one’s help...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>I don’t think ...　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>What’s the population of ...？　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>prefer to do … rather than do　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be worth (doing) …　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>regard … as　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be confident of　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>seem to do / seem ＋adj. / （介词短语）　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>be angry with / about / at（doing）　　</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>pay for / pay … for　　</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->]]></content>
                <pubDate>Mon, 15 Jan 2024 23:08:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[开启win10滑动关机]]></title>
                <link>https://www.jefsky.com/blog/48</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/48</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>%windir%\System32\SlideToShutDown.exe</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:44:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkphp6 和 thinkphp5 的区别有那些?]]></title>
                <link>https://www.jefsky.com/blog/52</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/52</guid>
                <content><![CDATA[<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">安装方式改变</h3>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>6.0版本开始,必须通过Composer方式安装和更新,所以你无法通过Git下载安装.</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">目录结构的改变</h3>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>thinkphp5的框架核心在根目录的thinkphp里,而thinkphp6在vendor的topthink里</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">自动加载的区别</h3>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>thinkphp5真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>thinkphp6使用composer方式实现类自动加载</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">thinkphp6使用php7严格模式</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">thinkphp6使用更多的PSR规范</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">thinkphp6 ORM组件独立</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">thinkphp6引入文件系统Filesystem</h3>
<!-- /wp:heading -->]]></content>
                <pubDate>Tue, 16 Jan 2024 04:48:45 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[手机听歌不过瘾？一招将Win10电脑变成蓝牙音箱]]></title>
                <link>https://www.jefsky.com/blog/54</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/54</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>很多网友都喜欢用手机听歌，不过话说回来，这东西只适合接驳耳机，如果使用外放，无论如何也是没法和台式音响媲美的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果你有一台装有Win10 v2004的电脑，这里倒有一个小技巧，可以将你的电脑直接变身为“蓝牙音箱”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>一分钱不花，就能让手机音乐从电脑音响里流出了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>蓝牙连接</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>手机和电脑同时开启蓝牙连接，其中手机的开启比较容易，这里不再多说。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>电脑端需要进入“设置”→“设备”→“蓝牙和其他设备”，在保证“蓝牙”为开启状态后，点击“添加蓝牙或其他设备”→“蓝牙”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>稍等片刻，屏幕上会显示出你的手机图标，再次点击就会生成连接密钥。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>手机端也是同样的操作，当电脑端发起连接后，手机端也会同步显示秘钥，如果两者的秘钥完全一致，就可以点击手机上的“配对“图标，将手机与电脑连通。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>注：个别手机系统具有安全设定，如果电脑端发起的连接不成功，也可尝试从手机端发起连接，一般都可以连接完成。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>下载“Bluetooth Audio Receiver”应用</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>打开应用商店，搜索“Bluetooth Audio Receiver”，点击“获取”按钮，让Win10自动下载并安装“Bluetooth Audio Receiver”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>连接手机</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>打开“Bluetooth Audio Receiver”，点击你的手机，此时下方的“Open Connection“按钮将被点亮。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>点击这个按钮，等待设备后面的”Disconnected“变成”Connected“，即代表电脑端已经准备好接收手机蓝牙传来的语音数据了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>连接成功后，手机端播放的音乐便直接从电脑音箱响起。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>当然由于接收的是媒体+语音数据，因此除了音乐以外，微信、视频等声音信号也会通过电脑音箱播出，如果里面有一些隐私消息的话，就得留点儿神了，毕竟整成”大喇叭“可不好。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>最后点击“Bluetooth Audio Receiver“中的”Close Connection“即可中断连接，此外手机端也可控制音箱的输出音量大小，总体来说还是挺方便的。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 14:58:28 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[可替代 MATLAB 的开源软件]]></title>
                <link>https://www.jefsky.com/blog/56</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/56</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>SCILAB</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SCILAB 是一款与 MATLAB 类似的开源软件，可以实现 MATLAB 上所有基本的功能，如科学计算、矩阵处理及图形显示等。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>由于 SCILAB 的语法与 MATLAB 非常接近，熟悉 MATLAB 编程的人很快就会掌握 SCILAB 的使用。有意思的是，SCILAB 提供的语言转换函数可以自动将用 MATLAB 语言编写的程序翻译为 SCILAB 语言。目前，SCILAB 可在 Linux、WINDOWS 和 Mac OS 全 PC 平台运行。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>作为开放源码的软件，SCILAB 遵循 GPL 2.0 开源协议，源代码、用户手册及二进制的可执行文件都可以通过官网免费直接下载使用。用户不仅可以在 SCILAB 的许可证条件下自由使用该软件，还可以根据自己需要修改源代码。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Octave</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Octave 是一个类似 MATLAB 和 Scilab 的数学软件包，可以进行各种运算，编程。它还有丰富的 C++ 接口可以让用户编程时调用。其配套的绘图工具采用 gnuplot 。Octave 的使用也是基于字符终端模式的，当需要绘图时，将会调用 gnuplot 进行数据绘图，并显示出来。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Octave 是用 C++ 编写的，它内容丰富的库也可以供用户在编写软件时调用。Octave 同时还支持 Fortran 等的调用，GSL 绑定等。可以由用户定制自己的函数、子程序等。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Spyder</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Spyder 是一款轻量级的 Python IDE ，提供高级的代码编辑、交互测试、调试等特性，适用于数据分析。Spyder 的界面与 MATLAB 非常类似，其作者早年也承认模仿了 MATLAB 的设计。如果对于 MATLAB 的仿真建模需求不高的话，Spyder 足以取而代之。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 02:45:02 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[安装Composer 快速版]]></title>
                <link>https://www.jefsky.com/blog/58</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/58</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">Linux 和 Mac OS X</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">windows</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>下载并运行 Composer-Setup.exe</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">阿里云镜像</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:27:09 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[php 判断空对象]]></title>
                <link>https://www.jefsky.com/blog/60</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/60</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">场景描述:</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>今天有个需求,前端需要post一个二维数据到后端:</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>var $pageContent = $('#admui-pageContent');
        $('#btn-y').click(function () {
            $('.city-selecter').html('');
            var pc_cat = $('.pc-cat').html();
            var app_cat = $('.app-cat').html();
            var title = $('input&#91;name="title"]').val();
            var sites = &#91;],html='';
            $('input&#91;name="city&#91;]"]:checked').each(function(){
                sites.push($(this).val());
                html += '&lt;div class="form-group row city-config" data-city="'+$(this).val()+'"&gt;';
                html += '&lt;label class="col-sm-2 control-label"&gt;'+$(this).val()+'&lt;/label&gt;';
                html += '&lt;div class="col-sm-4"&gt;';
                html += '&lt;input type="text" class="form-control " placeholder="请输入标题" name="title" value="'+title+'"&gt;';
                html += '&lt;/div&gt;';
                html += '&lt;div class="col-sm-2"&gt;';
                html += pc_cat;
                html += '&lt;/div&gt;';
                html += '&lt;div class="col-sm-2"&gt;';
                html += app_cat;
                html += '&lt;/div&gt;';
                html += '&lt;div class="col-sm-2"&gt;';
                html += '&lt;a class="btn btn-default del" data-cid="'+$(this).val()+'"&gt;删除&lt;/a&gt;';
                html += '&lt;/div&gt;';
                html += '&lt;/div&gt;';
                // html += '&lt;input type="hidden" name="share&#91;'+$(this).val()+']" value="'+$(this).val()+'"&gt;';
            });
            console.log(sites);
            $('.city-selecter').append(html);
        });

        $pageContent.on('submit', '.page-content form', function (e) { 
            var data = {};
            var i = 0;
            $('.city-config').each(function(){
                data&#91;i] = {};
                data&#91;i]&#91;'city'] = $(this).attr('data-city');
                data&#91;i]&#91;'title'] = $(this).find('input&#91;name="title"]').val();
                data&#91;i]&#91;'app_catid'] = $(this).find('select&#91;name="app_catid"]').val();
                data&#91;i]&#91;'pc_catid'] = $(this).find('select&#91;name="pc_catid"]').val();
                i ++;
            })
            data = JSON.stringify(data);
            $('input&#91;name="site_config"]').val(data);
            $.pjax.submit(e,'#admui-pageContent', { replace: true });
        });

</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>我把二维数组转为对象序列化再传了.到了服务端,需要判断一下那个值是不是空吧,因为穿空的就无效了.所以得判断一下.<br>开始我是这样想的</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code> if (request()-&gt;isPost()) {
        $data = input('post.');
        $site_config = json_decode($data&#91;'site_config']);
        if(empty($site_config)) $this-&gt;error('参数错误');
        ....</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>后来发现,文档中empty()返回值描述没有对象相关的返回,好吧~那应该是对对象不起作用了,好像也没有空对象说法吧,自己挖坑不?!用isset更加不可能了</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>    当var存在，并且是一个非空非零的值时返回 FALSE 否则返回 TRUE.
    以下的东西被认为是空的：
    "" (空字符串)
    0 (作为整数的0)
    0.0 (作为浮点数的0)
    "0" (作为字符串的0)
    NULL
    FALSE
    array() (一个空数组)
    $var; (一个声明了，但是没有值的变量)</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>灵机一动,想到了这个get_object_vars — 获取给定对象的属性</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>  if (request()-&gt;isPost()) {
        $data = input('post.');
        $site_config = json_decode($data&#91;'site_config']);
        if(empty(get_object_vars($site_config))) $this-&gt;error('参数错误');</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>用get_object_vars来获取对象属性,在判断就好了~</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:01:17 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[vim代码高亮、显示行号]]></title>
                <link>https://www.jefsky.com/blog/62</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/62</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>可以通过在命令行模式下，输入 :set nu 来显示行号，输入 :syntax on 来开启语法高亮。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:28:37 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[PHP指定时间戳 日期加一天，一年，一周，一月]]></title>
                <link>https://www.jefsky.com/blog/64</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/64</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;?php
echo date('Y-m-d H:i:s',strtotime('now'));//当前时间戳 2017-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1second'));//当前时间戳+1秒 2017-01-09 21:04:12
echo date('Y-m-d H:i:s',strtotime('+1minute'));//当前时间戳+1分 2017-01-09 21:05:11
echo date('Y-m-d H:i:s',strtotime('+1hour'));//当前时间戳+1小时 2017-01-09 22:04:11
echo date('Y-m-d H:i:s',strtotime('+1day'));//当前时间戳+1天 2017-01-10 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1week'));//当前时间戳+1周 2017-01-16 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1month'));//当前时间戳+1月 2017-02-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1year'));//当前时间戳+1年 2018-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+12year 12month 12day 12hour 12minute 12second'));//当前时间戳+12年，12月，12天，12小时，12分，12秒 2030-01-22 09:16:23
$t=1483967416;//指定时间戳
echo $dt=date('Y-m-d H:i:s',$t);//2017-01-09 21:10:16
/*方法一*/
echo date('Y-m-d H:i:s',$t+1*24*60*60);//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',$t+365*24*60*60);//指定时间戳+1年 2018-01-09 21:10:16
/*方法二*/
//$dt是指定时间戳格式化后的日期
echo date('Y-m-d H:i:s',strtotime("$dt+1day"));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("$dt+1year"));//指定时间戳+1年 2018-01-09 21:10:16
/*方法三*/
//$t是指定时间戳
echo date('Y-m-d H:i:s',strtotime("+1day",$t));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("+1year",$t));//指定时间戳+1年 2018-01-09 21:10:16
//指定时间戳加1月、1周、1小时、1分、1秒原理同上；</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:01:22 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[和「下一步」说再见！微软发布 Windows 软件包管理器 winget，应用安装仅需一行命令！]]></title>
                <link>https://www.jefsky.com/blog/66</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/66</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>北京时间 5 月 20 日，在 Build 2020 全球开发者大会上，微软发布全新 Windows Package Manager（winget）——Windows 软件包管理器。<br>例如，您可以启动 Windows Package Manager 并运行新的“ winget”命令，以获取要安装的任何应用程序的最新版本。<br>您只需运行</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>winget install PowerToys
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>即可安装它，而无需访问Github，第三方网站或Microsoft Store。<br>Windows软件包管理器当前支持以下命令：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>install - 安装指定的应用程序
show -  显示关于应用的信息
source - 管理应用源
search - 查找并显示应用的基本信息
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>这是一个开源项目，微软欢迎全球开发者社区参与！<br>下载地址：<a href="https://github.com/microsoft/winget-cli/releases" target="_BLANK" rel="noreferrer noopener">GitHub | Windows Package Manager</a><br>文档支持：<a href="https://docs.microsoft.com/zh-cn/windows/package-manager/" target="_BLANK" rel="noreferrer noopener">Microsoft Docs | Windows Package Manager</a></p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>系统要求：Windows 10 版本 1709 或更高版本</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:01:29 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[sql 根据经纬度查找附近数据]]></title>
                <link>https://www.jefsky.com/blog/68</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/68</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>SELECT
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
            POW( SIN(( 23.065502 * PI()/ 180-dt_lat * PI()/ 180 )/ 2 ), 2 )+ COS( 23.065502 * PI()/ 180 )* COS( dt_lat * PI()/ 180 )* POW( SIN(( 113.803962 * PI()/ 180- dt_lng * PI()/ 180 )/ 2 ), 2 )))* 1000 
    ) AS distance,
    a.id,
    a.title,
    a.price,
    a.unit,
    a.dt_lat,
    a.dt_lng 
FROM
    `cms_house` AS a 
HAVING
    distance &lt;= 1500 
ORDER BY
    distance ASC

</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>dt_latdt_lng 为表中 经纬度字段</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:01:21 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[微信云开发——基础读写]]></title>
                <link>https://www.jefsky.com/blog/70</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/70</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>// 使用 Web 端 SDK
const cloudbase = require('tcb-js-sdk')
const app = cloudbase.init({ /* 初始化... */ })

const db = app.database()

// 插入文档
await db.collection('messages').add({
    author: 'stark',
    message: 'Hello World!'
})

// 查询文档
const data = await db.collection('messages').where({
    author: 'stark'
}).get()

// 更新文档
await db.collection('messages').where({
    author: 'stark'
}).update({
    message: 'Hi, Cloudbase!'
})

// 删除文档
await db.collection('messages').where({
    author: 'stark'
}).remove()</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:01:17 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[PHP实现大数字格式化成K/M/B结尾的简短形式]]></title>
                <link>https://www.jefsky.com/blog/72</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/72</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>/**
 * 转换数字为简短形式
 * @param $n int 要转换的数字
 * @param $precision int 精度
 */
function shortenNumber($n, $precision = 1)
{
    if ($n &lt; 1e+3) {
        $out = number_format($n);
    } else if ($n &lt; 1e+6) {
        $out = number_format($n / 1e+3, $precision) . 'k';
    } else if ($n &lt; 1e+9) {
        $out = number_format($n / 1e+6, $precision) . 'm';
    } else if ($n &lt; 1e+12) {
        $out = number_format($n / 1e+9, $precision) . 'b';
    }
return $out;
}</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:01:30 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[正则表达式校验密码问题（要求大小写字母数字特殊符号四选三）]]></title>
                <link>https://www.jefsky.com/blog/74</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/74</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-ZW_]+$)(?![a-z0-9]+$)(?![a-zW_]+$)(?![0-9\W_]+$)[a-zA-Z0-9W_]{8,}$</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:07:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkphp3.2在php7下运行,出现错误"系统不支持:mysql"]]></title>
                <link>https://www.jefsky.com/blog/76</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/76</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>php7运行thinkphp3.2,报错,出现"系统不支持:mysql"<br>原因是thinkphp里面的数据库链接配置里面,php7里面,已经不能用mysql_connect,只能把mysql改为mysqli<br>这样就可以了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:10:50 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[上班所闻20200414]]></title>
                <link>https://www.jefsky.com/blog/78</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/78</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>上班路上<br>途径横行马路<br>群人急着过去<br>1路公车迎面冲来<br>大概也是想跑快点,车上的人也急着上班<br>没想到<br>压着实线从第一车道,跨到了第二车道<br>终于停下来了<br>"那么急的?怎么开车的吖"<br>有人吐槽<br>大部分人都匆匆过去<br>哔~哔~哔~<br>"哎呀,吵死啦,这不已经在走了吗,车品真差"<br>被司机喇叭吓到的,说了几句<br>我跟着人群,也过去了<br>司机,<br>还是按着喇叭<br>注视着第三车道驶来的汽车<br>手里握着的方向盘<br>蠢蠢欲动,欲把第三车道也堵上<br>四月到<br>疫情稳<br>气温虽凉<br>人心常暖</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 13:01:17 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[分享54个烘焙小知识和小技巧，需要的朋友记得收藏哟]]></title>
                <link>https://www.jefsky.com/blog/84</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/84</guid>
                <content><![CDATA[<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">1、 地球上何时开始有的烘焙?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>公元前5、6百年 古希腊时期</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">2、 17世纪开始什么原因造成西点师和面包师分道扬镳?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>西点制作和面包制作分别需要不同的炉温，而经过改造的烤炉是不能轻易调节温度的，so面包师和西点师觉得大家还是从此分开使用不同的烤炉更为方便。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">3、面包制作中的配料百分比公式是什么?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>配料总重/面粉总重 *100%=配料%</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">4、 油脂在烘焙时的作用?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可以缩短面筋的长度，包覆饼润滑面筋，使面筋不会粘连在一起。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">5、 烘焙过程分为几步?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>无论面包、蛋糕还是饼干，烘焙过程中都遵循这个过程<br>① 气体的形成与膨胀(酵母、苏打释放二氧化碳、水蒸气)、<br>② 气泡中的气体的凝聚(面筋中的气泡、蛋白糊中的气体)<br>③ 淀粉的胶化(淀粉吸水加热到60度左右开始胶化，使产品具有形状)<br>④ 蛋白质的凝固(74度时 蛋白质开始凝结)<br>⑤ 部分水分的蒸发(所以烤熟的面包会很轻、没熟透的灰比较沉)<br>⑥ 油脂的融化(不同油脂会在不同温度下融化，并释放出气体)<br>⑦ 外皮的形成与着色 (产品表面的水分蒸发、干燥从而形成外皮，牛奶、蔗糖和蛋会增加着色度。)</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">6、 面包为什么不应该冷藏?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>面包出炉起，老化就开始了，水分丧失和淀粉结构的化学变化。这个变化在冷藏中会发生的更快，而在冷冻中则几乎会停止。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">7、 为什么含有胚芽的全麦面粉不易保存?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>小麦胚芽中含有很高的油脂，营养含量高，却非常容易酸败。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">8、 面包粉和高筋粉一样么?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>面包粉含约12%的蛋白质，高筋粉则应在14%以上。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">9、你能说出几种糖(甜味剂)在烘焙中的作用?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>①增加甜味和香味<br>②软化面筋结构、细腻组织<br>③增加表面色泽<br>④保持水分、延长保质期<br>⑤与油脂混合可做乳化剂、与鸡蛋混合可做发泡剂<br>⑥ 是酵母的作用对象</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">10、 自己将砂糖研磨成糖粉时，要添加3%粟粉。</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">11、在面包制作中，等量的牛奶不等于等量的水。</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>鲜奶含有88%-91%的水分，其余固体物质为蛋白质、乳糖和矿物质，所以如果以牛奶代替配方中的水，要适当多加一点点，才不至于面团过干。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">12、 whipping cream分为哪三种?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>低脂鲜奶油30%-35%、高脂鲜奶油36%-40%、重奶油48%</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">13、 鸡蛋的最佳储藏温度是2℃。</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">14、 鸡蛋按照重量(带壳)，可分为哪些等级?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>巨大70g、特大64g、大57g、中50g、小43g、极小35g</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">15、 蛋在烘焙中的作用?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>①产生结构：蛋白质会在烘焙过程中凝结;鸡蛋会使食品更加耐嚼并附有韧性、加入适量的脂肪或糖可使成品柔软些。<br>②促使脂肪和液体的乳化：蛋黄中含有天然的乳化剂，能使面团更加光滑、有利于增大体积，并使质地更加柔软。<br>③发泡：搅打蛋液的过程中，包裹住大量空气，在烘焙中空气遇热膨胀，有助面糊膨发。<br>④油脂使用：蛋黄中的脂肪可做为油脂使用，当产品中的油脂含量较低时，蛋中的油脂作用就很重要了。<br>⑤水分：蛋液中含有大量水分，这些水分可在配方中看做总水量的一部分。<br>⑥味道：蛋香(也有人看做鸡蛋腥)<br>⑦营养价值<br>⑧颜色：蛋黄赋予面团和面糊黄色。同时，蛋容易受热变成褐色，进而增强产品外表的色泽。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">16、 什么叫做发酵?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>发酵就是酵母与糖作用，产生二氧化碳和酒精的过程(酒精会挥发，而二氧化碳会膨胀，进而增大产品体积)</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">17、 酵母的活性与温度的关系?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1℃无活性(储存温度)、15-20℃活性低、20-32℃活性高、38℃以上-反应减慢、60℃失活</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">18、 泡打粉分为哪两种?有何特性?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>①单效泡打粉：遇水立刻产生气体，只用于搅拌完成后立刻烘焙的产品。<br>②双效泡打粉：低温时释放一些气体，加热后才会反应完全，面糊调制后可以放置一段时间。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">19、 明胶粉和片可以相互替换吗?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可以，除了处理方式不同，其作用完全一样，1茶匙明胶粉=2.8g</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">20、 明胶的吸水量是多少?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>明胶可吸收其自身水量重5倍的水。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">21、 面包出炉后冷却的作用?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>烘焙完成后，应立即放在网架上冷却，以释放过多的水分、发酵中产生的酒精和残余二氧化碳。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">22、 软皮面包如何保持表皮的软嫩?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可在出炉后未冷却之前，刷一层融化的黄油，即可有效防止表皮变硬。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">23、硬皮面包(法式)应该怎样储藏?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>室温存放6小时内食用最佳，除非冷冻，否则不能包裹，否则会使面包表皮变软，质地会如皮革版难以入口!</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">24、面团有几种发酵方法?特点是什么?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>①直接法：时间短见效快，风味组织没有后两种好<br>②冷藏发酵：风味佳;但时间、温度不好掌握， 容易发酵过度<br>③中种法：中种才用冷藏发酵;制作时间弹性大，酵母用量省，风味组织比直接法好很多，耐储藏，不易老化。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">25、什么是面包直接法、中种法？区别在什么地方？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>直接法又称一次发酵法，是指面包生产工艺流程中经过一次发酵程序的操作方法。中种法又称二次发酵法，是指生产工艺流程中经过二次发酵阶段的方法。面包经过发酵阶段能令面团形成较好的网络组织，及产生特有的面包发酵香味，二次发酵法因有较长时间的发酵而令面团之效果及特性更为成熟。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">26、冬天因天气冷，可不可以把吐司方包放进28度的烤箱中醒发？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>应放在28度，湿度75-85%的醒发柜内醒发。不应放在烤箱中，因烤箱没有相应的湿度。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">27、为什么盐及奶油在搅拌到最后加入？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>因为盐和奶油与干性酵母同时加入会直接抑制酵母的生长，且盐最后加入能缩短搅拌时间减少能源损耗。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">28、氧化成分添加剂能否和乳化成分添加剂同时使用？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>​添加剂是针对面包某一方面特性不足而添加的辅助材料。氧化剂和乳化剂都是针对不同特性而使用的，不应混合使用。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">29、高糖酵母和低糖酵母有何区别？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>高糖酵母和低糖酵母是根据酵母对原材料的适应能力而生产的。高糖酵母是在配方中含糖量10%以上时使用的；低糖酵母则是在含糖量10%以下时使用，其效果更为理想。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">30、卧式和面机和立式和面机有何区别？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>卧式和面机因其搅拌速度较慢及物理作用不同，因而难以将面筋充分扩展，故通常再经过压面机压面的方式帮助面筋结合。立式和面机其搅拌速度及机械结构能直接令面筋在搅拌中充分扩展。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">31、夏天温度太热，搅拌时能否加入冰粒？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可以，应在搅拌时用慢速与原材料搅拌至溶解后才改用快速搅拌。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">32、快速法生产为什么需要加入氧化成份添加剂？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>因快速法没有经过正常的发酵阶段，故需要加入氧化成份的添加剂帮助面筋氧化成熟及缩短发酵时间。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">33、面包烘烤后，为什么表面会下塌？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>A、醒发过度。B、烘烤不足。C、面团操作时已经老化。D、操作时没有经过必要的排气。均会令烘烤后，表面下塌。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">34、吐司烘烤后，为什么会收腰？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>A、面筋度过强。B、成型时面筋松弛不足及成型过紧。C、烘烤后，未有及时脱模，均会导至收腰。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">35、面包涂蛋水烘烤后，为什么光亮不足？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>面包醒发后，表面水份未干即扫蛋水会令烘烤后，表面缺乏光泽。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">36、面包烘烤后，为何表皮下有大气泡的现象？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>醒发时温度过大，令表面产生糊化现象，故烘焙后表皮下容易形成气泡。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">37、面包制作中糖的用量应在多少？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>糖的用量可在0-25%的范围内。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">38、鲜酵母和干酵母有什么区别？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>鲜酵母又称压榨鲜酵母，含水份较大，需在低温下保存，保鲜期3个月，用量为一般干酵母的2-3倍；干酵母是经脱水干燥处理程序，真空包装后能保存2年左右。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">39、面团搅拌后，为什么表面会出水？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>水份加入过量面粉蛋白质含量低面筋不足，面粉生产后，未经过氧化期立即使用，及搅拌过度，均会令面团保水性降低而出现表面出水现象。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">40、面包醒发不足有何现象？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>烘烤后，起发体积不足。组织粗糙，有焦味。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">41、面包烘烤后，皮厚是什么原因？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>醒发时湿度不足，没有相适应的烘烤温度及时间，令水份挥发过多。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">42、为什么包装面包保鲜期短？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>面包烘烤后，没有充分冷却，水份容易附于包装上，均会令面包易于受细菌感染发霉。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">43、面包表面起绉是什么原因？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>面包成型时，松弛不足；最后醒发阶段水份过大；出炉后冷却温差过大，均会使面包表面起绉。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">44、面团搅拌后，理想温度是多少？怎样掌握？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>一般面团搅拌后，理想温度在26-28度最为适宜。可用水温来控制。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">45、刚出炉的面包能不能吃？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>面包组织里的乳酸与醋酸大约在出炉2个小时后才会完全挥发，所以建议将刚出炉的面包放置冷却2个小时。因为刚出炉的面包在高温的状态下，酵素的作用仍然持续进行，这时候会产生很多的二氧化碳，直到面包的中心温度降至40℃左右，酵素作用才会停止，二氧化碳才会充分排出。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">46、如何判别蛋糕已经烤熟了？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>①看成色、膨发情况<br>一般来说，蛋糕成熟时膨发到一定程度后就会稍微回落一点，此时蛋糕已基本定型;再看上色情况，上色均匀表示此蛋糕可能已成熟。<br>②戳孔看是否有粘液<br>可以用牙签或者是竹签戳进去蛋糕里面，拔出来后看看是否有粘液，如果成熟了的蛋糕是不会沾有粘液的，反之没熟透的则会有。<br>③轻拍听回声<br>用手快速拍打蛋糕体，如发出“沙沙”的声音，则表明蛋糕还未完全熟透。<br>④轻按看弹性<br>手指轻轻按下蛋糕表皮，看按下部分是否会快速的弹起，如若是则表示蛋糕已熟透，弹性良好，如果缓慢弹起则仍需再烘烤一会。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">47、如果烤出来的蛋糕不熟，该怎么办呢?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可以直接放回烤箱烘烤的，没熟的蛋糕可以放回烤箱继续烘烤，但此时要注意烤箱温度的调节与时间的控制。这里又可以分几种情况：<br>（1）刚出炉<br>如果是刚出炉的蛋糕发现不熟，可以立即放回烤箱去进行烘烤。由于蛋糕的温度变化不大，所以继续以原温度烘烤时没问题的。<br>（2）出炉一段时间<br>出炉一段时间后的蛋糕，表层的温度已经下降了，但是里面的温度仍然很高，如果用原来的温度与时间烘烤的话有可能影响蛋糕组织。所以建议调低温度或者盖上锡纸进行二次烘烤。<br>（3）完全凉透<br>比较棘手。蛋糕完全凉透后才发现里面没有烤熟，此时再放回烤箱进行烘烤已不大合适了，这时烤箱需要对蛋糕进行全面的加热、烘烤。烤箱的加热是由外到内的，所以内部的加热会比外部的更加慢，表皮的受热情况会更严重。<br>所以建议放微波炉烤几分钟或者是用锅蒸熟吧。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">48、做面包时，面团为什么发不起来？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>影响面团发酵的因素有很多，首先需要考虑的是酵母是否已经失效。我们可以通过简单的方法来检验酵母是否仍有活性。准备30℃的温水半杯，加入2克的砂糖搅拌至溶解，再加入5克的酵母粉搅拌溶解，静止半小时，如果活性良好的酵母会产生泡沫，半小时的时间泡沫会逐渐溢出杯子，如果静止1小时，也没有产生多少泡沫，说明酵母已经失效了。就无法继续使用了，因此建议在购买时可以选择小包装的酵母。除此之外和面时搅拌过度、面团水分过大、发酵时的温度、盐的用量等都有可能影响面团的发酵速度和效果。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">49、戚风蛋糕为什么会回缩、塌陷？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>蛋白的打发是影响戚风是否成功的第一要素，打发蛋白可以通过将筷子插进打发好的蛋白中，倒置打蛋盆，筷子也不会掉落来检验蛋白的打发是否到位。搅拌时切忌使用画圈的方式进行搅拌，迅速由下向上翻拌可有效防止蛋白消泡。烘焙时的温度控制可根据自己烤箱的性能，调整时间和温度。蛋糕烤好之后要及时倒扣防止回缩。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">50、烤饼干的时候，看起来已经烤好，可是内部还没有熟，这是为什么？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>每个烤箱的性能不同，所以温度上会有一定的差别。自己家的烤箱需要多次试验确定合适的温度。如果烤箱上下加热管的温度不能单独控制，还可以通过一些小方法来控制烤箱温度。如可通过在烤盘下方再放入一个烤盘，来阻隔一部分的火力，防止下火太旺，还可以使用锡纸覆盖，防止上火温度过高，造成饼干还未完全熟透，表面却过早上色。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">51、如何才能将动物性奶油打发到位？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>动物性奶油天然健康，但缺点是不易打发，打发后遇热易融化。如果天气炎热，操作室内温度过高，都会影响奶油的打发。确保奶油打发成功，首先要注意的是打发奶油的容器内需无油无水、干净干燥，用于打发的奶油建议提前冷藏24小时，也可在打发时，先在大盆中装入冰块，垫在打发奶油的盆下面，打发至奶油体积明显变大，出现清晰的纹路时，停止继续搅打，以免奶油出现油水分离的豆腐渣状态，是不能用于裱花的。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">52、如何检查鸡蛋是否新鲜？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>检查鸡蛋是否新鲜。把鸡蛋放在一碗水里，如果往下沉，则鸡蛋是新鲜的。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">53、制作面团的面粉不过筛会怎么样？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>懒得去过筛，或者认为过筛不需要？有专业人士认为，在与其他原料混合前，面粉过筛对面团或面糊的制作十分重要。在一开始过筛时尝试尽可能的混入空气，因为慢慢的无论你什么时候烘焙，你都可以得到轻薄的质地。”<br>同时，如果你要添加可可粉或者其他像糖这样的干性原料的话，建议过筛所有干性原料。这可以使所有配料混合得更好、更均匀。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">54、做泡芙时怎样的干湿程度最好？</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>将泡芙面团用木勺或者筷子挑起面糊，面糊呈倒三角形状，尖端离底部4CM左右，并且能保持形状不会低落，就OK了~这是泡芙成功的关键之二。</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>作者：小胡同学 链接：<a href="https://zhuanlan.zhihu.com/p/105370553" target="_BLANK" rel="noreferrer noopener">https://zhuanlan.zhihu.com/p/105370553</a>&nbsp;来源：知乎<br>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->]]></content>
                <pubDate>Mon, 15 Jan 2024 16:00:31 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[让你在linux上运行macos的程序]]></title>
                <link>https://www.jefsky.com/blog/86</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/86</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>今日 Hacker News 上有个热议的工具，类似 Wine ！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>所谓 Wine 就是让你可以在 Linux 平台运行 Windows 版程序，而 Darling 则支持在 Linux 平台运行 macOS 版程序。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Darling 官网：<a href="http://darlinghq.org/" target="_BLANK" rel="noreferrer noopener">http://darlinghq.org/</a><br>Wine 官网:&nbsp;<a href="https://www.winehq.org/" target="_BLANK" rel="noreferrer noopener">https://www.winehq.org/</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:37:29 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[windows10 Linux子系统文件目录]]></title>
                <link>https://www.jefsky.com/blog/88</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/88</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>windows10 引入了linux子系统,对于程序猿的我们来说,简直就是大喜事,那么,这个子系统的文件目录放在哪?又能不能访问母系统呢?</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Windows 访问 Linux 文件目录</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_%^%^&amp;$%&amp;$%$%^\LocalState\rootfs</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">Linux 访问 Windows 文件目录</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>windows的磁盘被挂载到了<code>/mnt</code>下</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 15:47:23 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[一句命令搞掂Mac任何来源不见了，Mac任何来源消失了]]></title>
                <link>https://www.jefsky.com/blog/90</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/90</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>sudo spctl --master-disable</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 21:26:29 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[国内mac os 安装homebrew自动脚本]]></title>
                <link>https://www.jefsky.com/blog/92</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/92</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">自动脚本</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>来源：<a href="https://zhuanlan.zhihu.com/p/111014448" target="_BLANK" rel="noreferrer noopener">https://zhuanlan.zhihu.com/p/111014448</a><br>在Mac os终端中复制粘贴回车下面这句话<br><code>/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"</code><br><code>/bin/zsh -c "$(curl -fsSL https://raw.githubusercontent.com/Jefsky/CNHomebrew/master/CNHomebrew.sh)"</code></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>#CNHomebrew自动安装脚本
#路径表.
HOMEBREW_PREFIX="/usr/local"
HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}/Homebrew"
HOMEBREW_CACHE="${HOME}/Library/Caches/Homebrew"

STAT="stat -f"
CHOWN="/usr/sbin/chown"
CHGRP="/usr/bin/chgrp"
GROUP="admin"

#获取前面两个.的数据
major_minor() {
  echo "${1%%.*}.$(x="${1#*.}"; echo "${x%%.*}")"
}

#获取系统版本
macos_version="$(major_minor "$(/usr/bin/sw_vers -productVersion)")"
#获取系统时间
TIME=$(date "+%Y-%m-%d %H:%M:%S")

JudgeSuccess()
{
    if &#91; $? -ne 0 ];then
        echo '\033&#91;1;31m此步骤失败 '$1'\033&#91;0m'
    else
        echo "\033&#91;1;32m此步骤成功\033&#91;0m"

    fi
}
# 判断是否有系统权限
have_sudo_access() {
  if &#91;&#91; -z "${HAVE_SUDO_ACCESS-}" ]]; then
    /usr/bin/sudo -l mkdir &amp;&gt;/dev/null
    HAVE_SUDO_ACCESS="$?"
  fi

  if &#91;&#91; "$HAVE_SUDO_ACCESS" -ne 0 ]]; then
    echo "获取权限失败!"
  fi

  return "$HAVE_SUDO_ACCESS"
}

shell_join() {
  local arg
  printf "%s" "$1"
  shift
  for arg in "$@"; do
    printf " "
    printf "%s" "${arg// /\ }"
  done
}

execute() {
  if ! "$@"; then
    abort "$(printf "Failed during: %s" "$(shell_join "$@")")"
  fi
}

# 管理员运行
execute_sudo() {
  local -a args=("$@")
  if &#91;&#91; -n "${SUDO_ASKPASS-}" ]]; then
    args=("-A" "${args&#91;@]}")
  fi
  if have_sudo_access; then
    execute "/usr/bin/sudo" "${args&#91;@]}"
  else
    execute "${args&#91;@]}"
  fi
}

CreateFolder()
{
    echo '-&gt; 创建文件夹' $1
    execute_sudo "/bin/mkdir" "-p" "$1"
    JudgeSuccess
    execute_sudo "/bin/chmod" "g+rwx" "$1"
    execute_sudo "$CHOWN" "$USER" "$1"
    execute_sudo "$CHGRP" "$GROUP" "$1"
}

RmCreate()
{
    sudo rm -rf $1
    CreateFolder $1
}

#git提交
git_commit(){
    git add .
    git commit -m "your del"
}

#version_gt 判断$1是否大于$2
version_gt() {
  &#91;&#91; "${1%.*}" -gt "${2%.*}" ]] || &#91;&#91; "${1%.*}" -eq "${2%.*}" &amp;&amp; "${1#*.}" -gt "${2#*.}" ]]
}
#version_ge 判断$1是否大于等于$2
version_ge() {
  &#91;&#91; "${1%.*}" -gt "${2%.*}" ]] || &#91;&#91; "${1%.*}" -eq "${2%.*}" &amp;&amp; "${1#*.}" -ge "${2#*.}" ]]
}
#version_lt 判断$1是否小于$2
version_lt() {
  &#91;&#91; "${1%.*}" -lt "${2%.*}" ]] || &#91;&#91; "${1%.*}" -eq "${2%.*}" &amp;&amp; "${1#*.}" -lt "${2#*.}" ]]
}

#一些警告判断
warning_if(){
  git_proxy=$(git config --global https.proxy)
  if &#91;&#91; -z "$git_proxy" ]]; then
  echo "未发现Git代理（属于正常状态）"
  else
  echo "\033&#91;1;33m
      提示：发现你电脑设置了Git代理，如果后面Git报错，请运行下面这句话：
              git config --global --unset https.proxy
  "
  fi
}

echo '
              \033&#91;1;32m开始执行Brew自动安装程序\033&#91;0m
'
#选择一个下载源
echo '\033&#91;1;32m
请选择一个下载镜像，例如中科大，输入1回车。
(选择后，下载速度觉得慢可以ctrl+c重新运行脚本选择)

1、中科大下载源 2、清华大学下载源\033&#91;0m'
read "MY_DOWN_NUM?请输入序号: "
if &#91;&#91; "$MY_DOWN_NUM" -eq "2" ]];then
  echo "你选择了清华大学下载源"
  USER_HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
  #HomeBrew基础框架
  USER_BREW_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
  #HomeBrew Core
  USER_CORE_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
  #HomeBrew Cask
  USER_CASK_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git
  USER_CASK_FONTS_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-fonts.git
  USER_CASK_DRIVERS_GIT=https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-drivers.git
else
  echo "你选择了中国科学技术大学下载源"
  #HomeBrew 下载源 install
  USER_HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles
  #HomeBrew基础框架
  USER_BREW_GIT=https://mirrors.ustc.edu.cn/brew.git
  #HomeBrew Core
  USER_CORE_GIT=https://mirrors.ustc.edu.cn/homebrew-core.git
  #HomeBrew Cask
  USER_CASK_GIT=https://mirrors.ustc.edu.cn/homebrew-cask.git
fi
echo '==&gt; 通过命令删除之前的brew、创建一个新的Homebrew文件夹
(设置开机密码：在左上角苹果图标-&gt;系统偏好设置-&gt;用户与群组-&gt;更改密码)
(如果就是不想设置密码，自行百度mac sudo免密码)
\033&#91;1;36m请输入开机密码，输入过程不显示，输入完后回车\033&#91;0m'
# 让环境暂时纯粹，重启终端后恢复
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
RmCreate ${HOMEBREW_REPOSITORY}
echo '==&gt; 删除之前brew环境，重新创建'
sudo rm -rf /Users/$(whoami)/Library/Caches/Homebrew/
sudo rm -rf /Users/$(whoami)/Library/Logs/Homebrew/
RmCreate ${HOMEBREW_PREFIX}/Caskroom
RmCreate ${HOMEBREW_PREFIX}/Cellar
RmCreate ${HOMEBREW_PREFIX}/var/homebrew
directories=(bin etc include lib sbin share var opt
             share/zsh share/zsh/site-functions
             var/homebrew var/homebrew/linked
             Cellar Caskroom Homebrew Frameworks)
for dir in "${directories&#91;@]}"; do
  if ! &#91;&#91; -d "${HOMEBREW_PREFIX}/${dir}" ]]; then
    CreateFolder "${HOMEBREW_PREFIX}/${dir}"
  fi
  sudo chown -R $(whoami) ${HOMEBREW_PREFIX}/${dir}
done
warning_if
echo '==&gt; 克隆Homebrew基本文件(32M+)'
sudo git --version
if &#91; $? -ne 0 ];then
  sudo rm -rf "/Library/Developer/CommandLineTools/"
  echo '\033&#91;1;36m安装Git\033&#91;0m后再运行此脚本，\033&#91;1;31m在系统弹窗中点击“安装”按钮
如果没有弹窗的老系统，需要自己下载安装：https://git-scm.com/downloads \033&#91;0m'
  xcode-select --install
  exit 0
fi
sudo git clone $USER_BREW_GIT ${HOMEBREW_REPOSITORY}
JudgeSuccess 尝试切换下载源或者网络
echo '==&gt; 创建brew的替身'
find ${HOMEBREW_PREFIX}/bin -name brew -exec sudo rm -f {} \;
sudo ln -s ${HOMEBREW_PREFIX}/Homebrew/bin/brew ${HOMEBREW_PREFIX}/bin/brew
JudgeSuccess
echo '==&gt; 克隆Homebrew Core(224M+) 
\033&#91;1;36m此处如果显示Password表示需要再次输入开机密码，输入完后回车\033&#91;0m'
sudo mkdir -p ${HOMEBREW_PREFIX}/Homebrew/Library/Taps/homebrew/homebrew-core
sudo git clone $USER_CORE_GIT ${HOMEBREW_PREFIX}/Homebrew/Library/Taps/homebrew/homebrew-core/
JudgeSuccess 尝试切换下载源或者网络
echo '==&gt; 克隆Homebrew Cask(248M+) 类似AppStore 
\033&#91;1;36m此处如果显示Password表示需要再次输入开机密码，输入完后回车\033&#91;0m'
sudo mkdir -p ${HOMEBREW_PREFIX}/Homebrew/Library/Taps/homebrew/homebrew-cask
sudo git clone $USER_CASK_GIT ${HOMEBREW_PREFIX}/Homebrew/Library/Taps/homebrew/homebrew-cask/
JudgeSuccess 尝试切换下载源或者网络
echo '==&gt; 配置国内下载地址'
echo 'export HOMEBREW_BOTTLE_DOMAIN='${USER_HOMEBREW_BOTTLE_DOMAIN} &gt;&gt; ~/.zshrc
echo 'export HOMEBREW_BOTTLE_DOMAIN='${USER_HOMEBREW_BOTTLE_DOMAIN} &gt;&gt; ~/.bash_profile
JudgeSuccess
source ~/.zshrc
source ~/.bash_profile
echo '
==&gt; 安装完成，brew版本
'
#判断系统版本
if version_gt "$macos_version" "10.13"; then
    echo "$macos_version"
else
    echo '\033&#91;1;31m检测到你的系统比较老，会有一些报错，请稍等Ruby下载安装;
    '
fi

sudo chown -R $(whoami) ${HOMEBREW_REPOSITORY}
#先暂时设置到清华大学源，中科大没有Ruby下载镜像
HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles
brew -v
if &#91; $? -ne 0 ];then
    echo '
    \033&#91;1;31m失败 留言  \033&#91;0m
    '
    exit 0
else
    echo "\033&#91;1;32mBrew前期配置成功\033&#91;0m"
fi
echo '
==&gt; brew update
'
HOMEBREW_BOTTLE_DOMAIN=${USER_HOMEBREW_BOTTLE_DOMAIN}
brew update
if &#91; $? -ne 0 ];then
    echo '
    \033&#91;1;31m失败 留言 \033&#91;0m
    '
else
    echo "
        \033&#91;1;32m上一句如果提示Already up-to-date表示成功\033&#91;0m
            \033&#91;1;32mBrew自动安装程序运行完成\033&#91;0m
              \033&#91;1;32m国内地址已经配置完成\033&#91;0m

                初步介绍几个brew命令

        本地软件库列表：brew ls
        查找软件：brew search google（其中google替换为要查找的软件关键字）
        查看brew版本：brew -v  更新brew版本：brew update

        Formulae（方案库 例如python）
        安装方案库：brew install curl（其中curl替换为要安装的软件库名称）
        卸载方案库：brew uninstall curl（其中curl替换为要卸载的软件库名称）

        Casks   （界面软件 例如谷歌浏览器）
        安装软件：brew cask install visual-studio-code（其中visual-studio-code替换为安装的软件名字，例如google-chrome）
        卸载软件：brew cask uninstall visual-studio-code（其中visual-studio-code替换为要卸载的软件名字，例如google-chrome）

        查找命令安装的位置：which brew（brew可以换成任何命令，包括brew安装的）
\033&#91;1;32m
现在可以输入命令open ~/.zshrc 或者 open ~/.bash_profile 整理一下重复的语句(运行 echo \$SHELL 可以查看应该打开那一个文件修改)
\033&#91;0m
    "
fi</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:28:02 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决国内mac无法安装homebrew神器]]></title>
                <link>https://www.jefsky.com/blog/94</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/94</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>这是官方的安装方法：<a href="https://brew.sh/index_zh-cn" target="_BLANK" rel="noreferrer noopener">https://brew.sh/index_zh-cn</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果你在国内，并且访问国外网站比较卡，建议你通过一下方式安装，因为博主试过很多次，都以失败告终</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">自动安装</h2>
<!-- /wp:heading -->

<!-- wp:embed {"url":"https://www.jefsky.com/archives/538.html"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://www.jefsky.com/archives/538.html
</div></figure>
<!-- /wp:embed -->

<!-- wp:heading -->
<h2 class="wp-block-heading">手动安装</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第一步：通过命令删除之前的brew，创建一个新的Homebrew文件夹</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo rm -rf /usr/local/Homebrew

sudo mkdir /usr/local/Homebrew
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>回车后，要输入电脑开机密码（输入的密码不会显示出来，输入完正常回车）。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第二步：git克隆（如果此时扩展说明-1）</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo git clone https://mirrors.ustc.edu.cn/brew.git /usr/local/Homebrew
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>回车后，会提示Receiving objects: xx% 等待下载完成。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第三步：删除原有的brew，创建一个新的</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo rm -f /usr/local/bin/brew

sudo ln -s /usr/local/Homebrew/bin/brew /usr/local/bin/brew
</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第四步：创建core文件夹、克隆</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo mkdir -p /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core

sudo git clone https://mirrors.ustc.edu.cn/homebrew-core.git /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>（下面两句非必须操作）如果需要brew-cask的话，运行：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo mkdir -p /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask

sudo git clone https://mirrors.ustc.edu.cn/homebrew-cask.git /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask
</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第五步：删除之前brew环境，重新创建：</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo rm -rf /usr/local/var/homebrew/ 

sudo mkdir -p /usr/local/var/homebrew

sudo chown -R $(whoami) /usr/local/var/homebrew</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>最后一步：获取权限 运行更新（两句话分开运行）</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo chown -R $(whoami) /usr/local/Homebrew

brew update</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>显示Already up-to-date.表示成功，再进行最后设置（国内下载源）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>最后设置：设置环境变量，再运行下面两句后，重启终端：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' &gt;&gt; ~/.zshrc

echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' &gt;&gt; ~/.bash_profile

</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">扩展说明（非必要）</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1、每一步中的<code>https://mirrors.ustc.edu.cn/</code>可以替换为下面任意一个：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>https:&#47;&#47;mirrors.aliyun.com/homebrew/

https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>如果更换了源依旧速度慢，换下稳定网络，例如手机4G热点或者用网线。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、看评论说没有git，运行下面这句话，弹出的窗口点安装。（如果提示error表示已经安装）</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>xcode-select --install</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>3、brew有一个自检程序，如果有问题自检试试：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>brew doctor</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:48:58 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[mysql 新增、修改、删除 字段 sql语句]]></title>
                <link>https://www.jefsky.com/blog/96</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/96</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">增</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>-- 在test_table 表的 valid_status 字段之后，新增一个字段，设置对应的类型，长度，是否为null，默认值，注释

ALTER TABLE test_table ADD COLUMN `is_staff` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否是从业人员 0否 1是' AFTER `valid_status`;
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">删</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>-- 删除test_table表的 test_value字段 
ALTER TABLE test_table DROP COLUMN test_value;
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">改</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code> -- 修改一个字段的类型
ALTER TABLE test_table MODIFY test_value VARCHAR(10) NOT NULL DEFAULT '' COMMENT '字段注释';
     
-- 修改一个字段的名称，此时要重新指定该字段的类型
ALTER TABLE test_table CHANGE test_value_old test_value_new VARCHAR(10) NOT NULL DEFAULT '' COMMENT '字段注释';</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:21:58 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[vue 有关于命名大小写的问题]]></title>
                <link>https://www.jefsky.com/blog/98</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/98</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>记录一下命名的的一些坑</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">引入文件时, 默认第一个字母大写</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>import Vue from 'vue'</code></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>组件命名的大小写,定义组件名的方式有两种：</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">使用 kebab-case(短横线分隔命名)</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>Vue.component('my-component-name', { /* ... */ })</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>当使用 kebab-case 定义一个组件时，<br>也必须在引用这个自定义元素时使用 kebab-case，例如。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">使用 PascalCase(首字母大写命名)</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>Vue.component('MyComponentName', { /* ... */ })</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>两者均可<br>当使用 PascalCase 定义一个组件时，你在引用这个自定义元素时两种命名法都可以使用。也就是说 和 都是可接受的。</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>注意，尽管如此，直接在 DOM (即非字符串的模板) 中使用时只有 kebab-case 是有效的。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>prop命名的大小写<br>HTML 中的特性名是大小写不敏感的，<br>所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时，camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名：</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:code -->
<pre class="wp-block-code"><code>Vue.component('blog-post', {
  // 在 JavaScript 中是 camelCase 的
  props: &#91;'postTitle'],
  template: '&lt;h3&gt;{{ postTitle }}&lt;/h3&gt;'
})
&lt;!-- 在 HTML 中是 kebab-case 的 --&gt;
&lt;blog-post post-title="hello!"&gt;&lt;/blog-post&gt;</code></pre>
<!-- /wp:code -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>重申一次，如果你使用字符串模板，那么这个限制就不存在了。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>自定义事件的大小写<br>不同于组件和 prop，事件名不会被用作一个 JavaScript 变量名或属性名，<br>所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的)，<br>所以 v-on:myEvent 将会变成 v-on:myevent——导致 myEvent 不可能被监听到。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>因此，我们推荐你始终使用 kebab-case 的事件名,禁止使用驼峰命名, 直接使用中划线即可<br>————————————————<br>版权声明：本文为CSDN博主「ZH_TX」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。<br>原文链接：<a href="https://blog.csdn.net/ZHXT__/article/details/102791205" target="_BLANK" rel="noreferrer noopener">https://blog.csdn.net/ZHXT__/article/details/102791205</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:22:12 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[linux怎么添加root用户？]]></title>
                <link>https://www.jefsky.com/blog/100</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/100</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">linux下添加用户并赋予root权限</h1>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>添加用户，首先用adduser命令添加一个普通用户，命令如下：</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:code -->
<pre class="wp-block-code"><code>#adduser tommy
//添加一个名为tommy的用户    
#passwd tommy   //修改密码
Changing password for user tommy.    
New UNIX password:     //在这里输入新密码
Retype new UNIX password:  //再次输入新密码
passwd: all authentication tokens updated successfully.
</code></pre>
<!-- /wp:code -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>赋予root权限</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">方法一：修改&nbsp;<code>/etc/sudoers</code>&nbsp;文件，找到下面一行，把前面的注释（#）去掉</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>## Allows people in group wheel to run all commands
%wheel    ALL=(ALL)    ALL
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>然后修改用户，使其属于root组（wheel），命令如下：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>#usermod -g root tommy
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>修改完毕，现在可以用tommy帐号登录，然后用命令 su – ，即可获得root权限进行操作。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">方法二：修改&nbsp;<code>/etc/sudoers</code>&nbsp;文件，找到下面一行，在root下面添加一行，如下所示：</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>## Allow root to run any commands anywhere

root    ALL=(ALL)     ALL

tommy   ALL=(ALL)     ALL
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>修改完毕，现在可以用tommy帐号登录，然后用命令 sudo – ，即可获得root权限进行操作。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">方法三：修改&nbsp;<code>/etc/passwd</code>&nbsp;文件，找到如下行，把用户ID修改为 0 ，如下所示：</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>tommy:x:0:33:tommy:/data/webroot:/bin/bash</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:21:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[报错：Incorrect datetime value: '0000-00-00 00:00:00' for column 'login_time' at row 1]]></title>
                <link>https://www.jefsky.com/blog/102</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/102</guid>
                <content><![CDATA[<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">报错说明</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: ‘0000-00-00 00:00:00’ for column ‘login_time’ at row 1</code></p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>原因：MySQL5.7对时间处理更加严格了。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">解决方式</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在MySQL中执行：<br><code>show variables like 'sql_mode';</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>把NO_ZERO_IN_DATE,NO_ZERO_DATE这两个删掉即可：<br><code>set global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:48:52 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[git如何新建分支]]></title>
                <link>https://www.jefsky.com/blog/104</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/104</guid>
                <content><![CDATA[<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>切换到基础分支，如主干git checkout master</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>创建并切换到新分支git checkout -b abcgit branch可以看到已经在abc分支上</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>更新分支代码并提交git add *git commit -m "init abc"git push origin abc</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>在git代码管理界面经可以看到abc分支了</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->]]></content>
                <pubDate>Thu, 11 Jan 2024 21:18:11 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[百度地图实现仿链家(房天下)地图搜房(地图找房)功能]]></title>
                <link>https://www.jefsky.com/blog/106</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/106</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">findHouseByMap 地图找房</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">本项目仅供学习参考</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">运用百度地图api仿照房天下地图找房</h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">项目地址:<a href="https://github.com/Jefsky/findHouseByMap" target="_BLANK" rel="noreferrer noopener">https://github.com/Jefsky/findHouseByMap</a></h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">演示地址:<a href="https://www.jefsky.com/demo/findHouseByMap/">https://www.jefsky.com/demo/findHouseByMap/</a></h3>
<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">完成进度</h1>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>* 缩放检索
* 拖拽检索
* 行政区域划分
</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">项目图示</h1>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>!&#91;Image text](https://github.com/Jefsky/findHouseByMap/blob/master/img/20200305145548.png)
!&#91;Image text](https://github.com/Jefsky/findHouseByMap/blob/master/img/20200305145548.png)
!&#91;Image text](https://github.com/Jefsky/findHouseByMap/blob/master/img/20200305145548.png)

</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">百度地圖api</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference_3_0.html#a0b0" target="_BLANK" rel="noreferrer noopener">http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference_3_0.html#a0b0</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">项目需求分析</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">房天下</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading">PC</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="https://dg.esf.fang.com/map/" target="_BLANK" rel="noreferrer noopener">https://dg.esf.fang.com/map/</a><br><a href="https://www.fang.com/hezuo_file/house/hezuo2014/search.htm" target="_BLANK" rel="noreferrer noopener">https://www.fang.com/hezuo_file/house/hezuo2014/search.htm</a><br><a href="https://static.soufunimg.com/map/ditu/js/map.js?v=2019122701" target="_BLANK" rel="noreferrer noopener">https://static.soufunimg.com/map/ditu/js/map.js?v=2019122701</a></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>alias: {
            jquery: 'jquery/jquery-1.11.1.min',
            BMapLib: 'bmap/BMapLib-min'
        },</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>百度地图</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">关键js</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="https://static.soufunimg.com/map/ditu/js/??bmap/BMap.js?_2019122701,autodiv/autodiv.js?_2019122701,modules/esf/SFMap.js?_2019122701,modules/esf/dhjs.js?_2019122701,modules/esf/suggest.js?_2019122701" target="_BLANK" rel="noreferrer noopener">https://static.soufunimg.com/map/ditu/js/??bmap/BMap.js?_2019122701,autodiv/autodiv.js?_2019122701,modules/esf/SFMap.js?_2019122701,modules/esf/dhjs.js?_2019122701,modules/esf/suggest.js?_2019122701</a><br><a href="https://static.soufunimg.com/map/ditu/js/??modules/SFUtil.js?_2019122701,modules/esf/MapApi.js?_2019122701,lazyload/lazyload.js?_2019122701,scrollbar/scrollbar.js?_2019122701" target="_BLANK" rel="noreferrer noopener">https://static.soufunimg.com/map/ditu/js/??modules/SFUtil.js?_2019122701,modules/esf/MapApi.js?_2019122701,lazyload/lazyload.js?_2019122701,scrollbar/scrollbar.js?_2019122701</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">接口</h3>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>城市地区经纬</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:embed {"url":"https://dg.esf.fang.com/map/?a=getDistArea\u0026city=gz"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.esf.fang.com/map/?a=getDistArea&amp;city=gz
</div></figure>
<!-- /wp:embed -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>城市地铁</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:embed {"url":"https://dg.esf.fang.com/map/?a=getSubway\u0026city=dg"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.esf.fang.com/map/?a=getSubway&amp;city=dg
</div></figure>
<!-- /wp:embed -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>城市地区楼盘套数接口</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:embed {"url":"https://dg.esf.fang.com/map/?mapmode=y\u0026district=\u0026subwayline=\u0026subwaystation=\u0026price=\u0026room=\u0026area=\u0026towards=\u0026floor=\u0026hage=\u0026equipment=\u0026keyword=\u0026comarea=\u0026orderby=30\u0026isyouhui=\u0026x1=113.097682\u0026y1=22.912863\u0026x2=114.20152\u0026y2=23.173058\u0026newCode=\u0026houseNum=\u0026schoolDist=\u0026schoolid=\u0026ecshop=\u0026groupedmode=4\u0026PageNo=1\u0026zoom=12\u0026a=ajaxSearch\u0026city=dg\u0026searchtype=city"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.esf.fang.com/map/?mapmode=y&amp;district=&amp;subwayline=&amp;subwaystation=&amp;price=&amp;room=&amp;area=&amp;towards=&amp;floor=&amp;hage=&amp;equipment=&amp;keyword=&amp;comarea=&amp;orderby=30&amp;isyouhui=&amp;x1=113.097682&amp;y1=22.912863&amp;x2=114.20152&amp;y2=23.173058&amp;newCode=&amp;houseNum=&amp;schoolDist=&amp;schoolid=&amp;ecshop=&amp;groupedmode=4&amp;PageNo=1&amp;zoom=12&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=city
</div></figure>
<!-- /wp:embed -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>地区楼盘套数接口</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:embed {"url":"https://dg.esf.fang.com/map/?mapmode=y\u0026district=800\u0026subwayline=\u0026subwaystation=\u0026price=\u0026room=\u0026area=\u0026towards=\u0026floor=\u0026hage=\u0026equipment=\u0026keyword=\u0026comarea=\u0026orderby=30\u0026isyouhui=\u0026x1=113.515279\u0026y1=22.97771\u0026x2=113.791238\u0026y2=23.042775\u0026newCode=\u0026houseNum=\u0026schoolDist=\u0026schoolid=\u0026ecshop=\u0026groupedmode=4\u0026PageNo=1\u0026zoom=14\u0026a=ajaxSearch\u0026city=dg\u0026searchtype="} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.esf.fang.com/map/?mapmode=y&amp;district=800&amp;subwayline=&amp;subwaystation=&amp;price=&amp;room=&amp;area=&amp;towards=&amp;floor=&amp;hage=&amp;equipment=&amp;keyword=&amp;comarea=&amp;orderby=30&amp;isyouhui=&amp;x1=113.515279&amp;y1=22.97771&amp;x2=113.791238&amp;y2=23.042775&amp;newCode=&amp;houseNum=&amp;schoolDist=&amp;schoolid=&amp;ecshop=&amp;groupedmode=4&amp;PageNo=1&amp;zoom=14&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=
</div></figure>
<!-- /wp:embed -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>地区楼盘接口</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p><a href="https://dg.esf.fang.com/map/?mapmode=y&amp;district=100&amp;subwayline=&amp;subwaystation=&amp;price=&amp;room=&amp;area=&amp;towards=&amp;floor=&amp;hage=&amp;equipment=&amp;keyword=&amp;comarea=17408&amp;orderby=30&amp;isyouhui=&amp;x1=113.67489&amp;y1=23.008064&amp;x2=113.74388&amp;y2=23.02433&amp;newCode=&amp;houseNum=&amp;schoolDist=&amp;schoolid=&amp;ecshop=&amp;groupedmode=4&amp;PageNo=1&amp;zoom=16&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=loupan" target="_BLANK" rel="noreferrer noopener">https://dg.esf.fang.com/map/?mapmode=y&amp;district=100&amp;subwayline=&amp;subwaystation=&amp;price=&amp;room=&amp;area=&amp;towards=&amp;floor=&amp;hage=&amp;equipment=&amp;keyword=&amp;comarea=17408&amp;orderby=30&amp;isyouhui=&amp;x1=113.67489&amp;y1=23.008064&amp;x2=113.74388&amp;y2=23.02433&amp;newCode=&amp;houseNum=&amp;schoolDist=&amp;schoolid=&amp;ecshop=&amp;groupedmode=4&amp;PageNo=1&amp;zoom=16&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=loupan</a><br><a href="https://dg.esf.fang.com/map/?mapmode=y&amp;district=&amp;subwayline=&amp;subwaystation=&amp;price=&amp;room=&amp;area=&amp;towards=&amp;floor=&amp;hage=&amp;equipment=&amp;keyword=&amp;comarea=&amp;orderby=30&amp;isyouhui=&amp;x1=113.584556&amp;y1=23.049196&amp;x2=113.722536&amp;y2=23.083244&amp;newCode=&amp;houseNum=&amp;schoolDist=&amp;schoolid=&amp;ecshop=&amp;groupedmode=4&amp;PageNo=1&amp;zoom=15&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=" target="_BLANK" rel="noreferrer noopener">https://dg.esf.fang.com/map/?mapmode=y&amp;district=&amp;subwayline=&amp;subwaystation=&amp;price=&amp;room=&amp;area=&amp;towards=&amp;floor=&amp;hage=&amp;equipment=&amp;keyword=&amp;comarea=&amp;orderby=30&amp;isyouhui=&amp;x1=113.584556&amp;y1=23.049196&amp;x2=113.722536&amp;y2=23.083244&amp;newCode=&amp;houseNum=&amp;schoolDist=&amp;schoolid=&amp;ecshop=&amp;groupedmode=4&amp;PageNo=1&amp;zoom=15&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=</a></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>拖拽</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:embed {"url":"https://dg.esf.fang.com/map/?mapmode=y\u0026district=\u0026subwayline=\u0026subwaystation=\u0026price=\u0026room=\u0026area=\u0026towards=\u0026floor=\u0026hage=\u0026equipment=\u0026keyword=\u0026comarea=\u0026orderby=30\u0026isyouhui=\u0026x1=113.804792\u0026y1=23.037902\u0026x2=113.873782\u0026y2=23.057623\u0026newCode=\u0026houseNum=\u0026schoolDist=\u0026schoolid=\u0026ecshop=\u0026groupedmode=4\u0026PageNo=1\u0026zoom=16\u0026a=ajaxSearch\u0026city=dg\u0026searchtype=other"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.esf.fang.com/map/?mapmode=y&amp;district=&amp;subwayline=&amp;subwaystation=&amp;price=&amp;room=&amp;area=&amp;towards=&amp;floor=&amp;hage=&amp;equipment=&amp;keyword=&amp;comarea=&amp;orderby=30&amp;isyouhui=&amp;x1=113.804792&amp;y1=23.037902&amp;x2=113.873782&amp;y2=23.057623&amp;newCode=&amp;houseNum=&amp;schoolDist=&amp;schoolid=&amp;ecshop=&amp;groupedmode=4&amp;PageNo=1&amp;zoom=16&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=other
</div></figure>
<!-- /wp:embed -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>接口样本</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:embed {"url":"https://dg.esf.fang.com/map/?mapmode=y\u0026district=800\u0026keyword=\u0026orderby=30\u0026x1=113.515279\u0026y1=22.97771\u0026x2=113.791238\u0026y2=23.042775\u0026groupedmode=4\u0026PageNo=1\u0026zoom=14\u0026a=ajaxSearch\u0026city=dg\u0026searchtype="} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.esf.fang.com/map/?mapmode=y&amp;district=800&amp;keyword=&amp;orderby=30&amp;x1=113.515279&amp;y1=22.97771&amp;x2=113.791238&amp;y2=23.042775&amp;groupedmode=4&amp;PageNo=1&amp;zoom=14&amp;a=ajaxSearch&amp;city=dg&amp;searchtype=
</div></figure>
<!-- /wp:embed -->

<!-- wp:heading -->
<h2 class="wp-block-heading">小程序</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>腾讯地图</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">APP</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>百度地图</p>
<!-- /wp:paragraph -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">链家</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading">PC</h2>
<!-- /wp:heading -->

<!-- wp:embed {"url":"https://dg.lianjia.com/ditu"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.lianjia.com/ditu
</div></figure>
<!-- /wp:embed -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;script&gt;
ljConf = {
        city_id: '441900',
        city_abbr: 'dg',
        city_name: '东莞',
        channel: 'ditu',
        feroot: '//s1.ljcdn.com/feroot/',
        page: 'ditu_index',
        pageConfig: {"ajaxroot":"https:\/\/ajax.api.lianjia.com\/","imAppid":"LIANJIA_WEB_20160624","imAppkey":"6dfdcee27d78b1107fceeca55d80b7bd"}
    };
    &lt;/script&gt;
&lt;script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&amp;ak=dASz7ubuSpHidP1oQWKuAK3q"&gt;&lt;/script&gt;</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p><a href="https://www.idataapi.cn/product/detail/134" target="_BLANK" rel="noreferrer noopener">https://www.idataapi.cn/product/detail/134</a><br><a href="https://gitee.com/liu_peng_yu/Fast-LianJia-Crawler" target="_BLANK" rel="noreferrer noopener">https://gitee.com/liu_peng_yu/Fast-LianJia-Crawler</a><br>百度地图</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">小程序</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>百度地图</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">APP</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>百度地图</p>
<!-- /wp:paragraph -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">Q房网</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading">PC</h2>
<!-- /wp:heading -->

<!-- wp:embed {"url":"https://dongguan.qfang.com/map/sale"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dongguan.qfang.com/map/sale
</div></figure>
<!-- /wp:embed -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;script src="/themes/default/scripts/frontend/map/MapAround.js?qv=1579095567676" type="text/javascript"&gt;&lt;/script&gt;
Qfang.MapAround={_getPointByAngle:function(a,g,c,f){var b=111700;var e=Math.cos(f*2*Math.PI/360)*c/(b*Math.cos(g*2*Math.PI/360))+a;var d=Math.sin(f*2*Math.PI/360)*c/b+g;return new BMap.Point(e,d);}...</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>百度地图</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">小程序</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>腾讯地图</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">APP</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>百度地图</p>
<!-- /wp:paragraph -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">安居客</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading">PC</h2>
<!-- /wp:heading -->

<!-- wp:embed {"url":"https://dg.anjuke.com/map/sale/?from=SearchBar"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://dg.anjuke.com/map/sale/?from=SearchBar
</div></figure>
<!-- /wp:embed -->

<!-- wp:paragraph -->
<p>百度地图 ## 小程序 腾讯地图 ## APP 高德地图 --- # 贝壳找房 ## PC https://dg.ke.com/ditu&nbsp;## 小程序 腾讯地图 ## APP 百度地图 --- # 地图搜租房 https://house-map.cn/#/</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:22:08 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[简易的命令行入门教程]]></title>
                <link>https://www.jefsky.com/blog/108</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/108</guid>
                <content><![CDATA[<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>强烈建议所有的git仓库都有一个README, LICENSE, .gitignore文件</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:heading -->
<h2 class="wp-block-heading">简易的命令行入门教程</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">Git 全局设置</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>git config --global user.name "***"
git config --global user.email "***@***.com"
</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">创建 git 仓库:</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>mkdir testbb
cd testbb
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/someone/***.git
git push -u origin master
</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">已有仓库</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>cd existing_git_repo
git remote add origin https://github.com/someone/***.git
git push -u origin master</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 23:23:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[关于百度地图API覆盖物中的添加行政区划传参问题]]></title>
                <link>https://www.jefsky.com/blog/110</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/110</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在添加行政区划使用BMap.Boundary().get()方法时,发现返回的boundaries的值是数组,但是是一个一维数组,数组的元素是点的集合的字符串,而不是点的集合数组.<br>但是在示例中,关于rs.boundaries.length的注释是'行政区域的点有多少个',意思不是说明了boundaries数组元素应该是一个区域点的数组?<br>再者,就是下面的for循环,也给人觉得是根据点来组合一个多边形.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在这里,我重写了很多次,后来选择从百度给出的示例来console调试,才发现上诉的问题,所以呢,按照目前的示例,我是这样理解的:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>BMap.Boundary().get(name: String, callback: function) 是获取name区域的点,<code>返回的是一个数组,但是点是一个数组字符串</code>(为什么要强调呢,因为如果你是想自己绘制区域的话,就需要注意了,接着往下看)</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>BMap.Polygon(points: Array, opts: PolygonOptions) 这是根据Array创建多边形,注意!!!<code>这里传的不是点的数组,而是点的数组字符串!是一个区域的点的数组字符串!!!</code></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>下面的for循环用意,应该是当有多个行政区需要绘制时,同时绘制出来吧.</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>也有个可能Array就是相当与data[i],我看错吧</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:code -->
<pre class="wp-block-code"><code>function getBoundary(){       
    var bdary = new BMap.Boundary();
    bdary.get("北京市海淀区", function(rs){       //获取行政区域
        map.clearOverlays();        //清除地图覆盖物       
        var count = rs.boundaries.length; //行政区域的点有多少个
        if (count === 0) {
            alert('未能获取当前输入行政区域');
            return ;
        }
          var pointArray = &#91;];
        for (var i = 0; i &lt; count; i++) {
            var ply = new BMap.Polygon(rs.boundaries&#91;i], {strokeWeight: 2, strokeColor: "#ff0000"}); //建立多边形覆盖物
            map.addOverlay(ply);  //添加覆盖物
            pointArray = pointArray.concat(ply.getPath());
        }    
        map.setViewport(pointArray);    //调整视野  
        addlabel();               
    });   
}</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:22:02 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[linux服务器 错误代码:ERR_CONNECTION_REFUSED]]></title>
                <link>https://www.jefsky.com/blog/112</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/112</guid>
                <content><![CDATA[<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>服务器拒绝了连接，相关的服务程序没开，或者防火墙挡了。这个得看看重启之后，你系统服务程序是不是开的。查看系统服务程序是否开启的两种方法：</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>ps -e看看是不是有你的要链接的服务程序；</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>netstat -nltpux看看有没有在你链接的端口上有监听程序。</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[如果将域名解析到服务器的端口上]]></title>
                <link>https://www.jefsky.com/blog/114</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/114</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>利用隐形URL记录类型就好了</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">步骤</h2>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>登陆你的域名解析服务</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>添加记录</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>记录类型 选择<code>隐形URL</code></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>主机记录 按照你的需要填写</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>记录值 就填写你的域名:端口,如<a href="https://www.jefsky.com/archives/www.jefsky.com">https:www.jefsky.com</a>:80</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>保存就好了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Fri, 12 Jan 2024 00:12:18 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Linux后台命令 nohup 和 &amp; 的使用说明]]></title>
                <link>https://www.jefsky.com/blog/116</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/116</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">nohup 命令说明</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>nohup 是 no hungup 的缩写，就是“不挂断,一直运行”,顾名思义就是后台运行</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>很多时候我们通过终端工具去远程执行linux脚本的时候,或多或少都会遇到网络问题导致客户端失去连接,终端断开,程序运行一半就意外结束,或者,有些程序需要一直挂在后台运行,即使退出了客户端,这时候就需要用到nohup命令了.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">语法格式</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>nohup Command [ Arg ... ] [　&amp; ]</code></p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>nohup 命令运行由 Command 参数 和 Arg参数 指定的命令，忽略所有挂断（SIGHUP）信号。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>如果想要在运行后台中的 nohup 命令，则要添加 &amp; （ 表示 “and” 的符号）到命令的尾部。</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>如果不将 nohup 命令的输出重定向，输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写，输出重定向到 $HOME/nohup.out 文件中。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading -->
<h2 class="wp-block-heading">只用 nohup</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>无法标准输入（控制台无法输入），标准输出 和 错误信息保存到 nohup.out文件里面，关闭客户端后，命令仍然会运行。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>nohup Command</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">例如</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>将nohup sh test.sh 任务放到后台，关闭标准输入，终端不再能够接收任何输入，重定向标准输出和标准错误到当前目录下的nohup.out 文件，即使关闭xshell退出后，当前session依然继续运行。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">只用 &amp;</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可以标准输入（控制台可以输入），但会丢失 标准输出 和 错误信息，关闭客户端后，命令会就马上停止。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>sh Command &amp;</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">例如</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>将sh test.sh &amp; 任务放到后台 ，关闭 xshell，对应的任务也跟着停止。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">nohup 和 &amp; 配合使用（推荐使用）</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可以标准输入（控制台可以输入），也不会丢失标准输出和错误信息，并将输出信息保存到 nohup.out 中，关闭客户端后命令仍然会运行。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>nohup Command [ Arg ... ] &amp;</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>nohup sh test.sh &amp;</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">例如</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>nohup sh test.sh &amp;</code>&nbsp;命令在后台执行，可以使用标准输入，终端能够接收任何输入，标准输出 和 错误信息 默认保存到当前目录下的 nohup.out 文件，即使关闭xshell退出当前session依然继续运行。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>nohup ./startWeblogic.sh &amp;&nbsp;</code>意思是即使退出ssh界面，命令仍然在后台执行，并且打印日志到 nohup.out 文件中，当然也可以将nohup.out 的输出转向到其他文件，需要使用 重定向 。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">nohup、 &amp; 、 重定向（推荐使用）</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>使用 nohup sh test.sh &amp; 命令时，默认是将信息输出到 nohup.out 文件中。 但是在实际工作中，我们想把日志信息输出到某个具体文件中，可以下面的命令。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>nohup command &gt;logfile 2&gt;&amp;1 &amp;</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>上面命令可以拆分成三部分 nohup command &amp; 、 &gt;logfile 和 2&gt;&amp;1 。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>nohup command &amp;</code>&nbsp;：这个命令上面已经介绍过了，就是后台运行命令；</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>logfile ：将 command 运行的日志 重定向 写入到 logfile 文件中，即输出内容 不打印到屏幕上，而是输出到 logfile 文件中。<br>2&gt;&amp;1 是将 错误信息(2) 重定向到标准输出（&amp;1）。而 标准输出 默认是写入到 file 文件中，所以 错误信息(2)、 标准输出 都 写入到 file 文件中。<br>例子：</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p><code>nohup starMailWeb.sh &gt; mail.log 2&gt;&amp;1 &amp;</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>后台运行 starMailWeb.sh ，并且将 标准输出(1)、标准错误(2) 等日志 写入到 mail.log 文件中。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>2&gt;&amp;1</code>&nbsp;相关的参数说明：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>/dev/null</code>&nbsp;表示空设备文件，</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>0 表示 stdin (standard input) 标准输入，</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1 表示 stdout (standard output) 标准输出，</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2 表示 stderr (standard error) 标准错误信息；</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>file 表示将 标准输出(1) 输出到 file文件，也就相当于 1&gt;file ；</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p><code>2&gt;error</code>&nbsp;: 将&nbsp;<code>错误信息(2)</code>&nbsp;重定向到 error文件中 ；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>2&gt;&amp;1</code>&nbsp;: 将&nbsp;<code>错误信息(2)</code>&nbsp;重定向 到 标准输出(1) ；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>2&gt;&amp;1 &gt;logfile</code>&nbsp;：错误信息(2) 重定向 到 标准输出(1) ，标准输出(1) 重定向 到 文件file ，等于 1&gt;logfile 2&gt;&amp;1 ，即 标准输出(1) 重定向 到 logfile 文件中，错误信息(2) 重定向 到 标准输出(1) 。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>&amp;</code>&nbsp;放在命令到结尾，表示后台运行，防止终端一直被某个进程占用，这样终端可以执行别到任务，配合&nbsp;<code>&gt;file 2&gt;&amp;1</code>&nbsp;可以将 log信息保存到某个文件中，但如果终端关闭，则进程也停止运行。如&nbsp;<code>command &gt; file.log 2&gt;&amp;1 &amp;</code>&nbsp;。 （ 参考 2、只使用 &amp;）</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">知识扩展</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">清空 nohup.out</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果命令一直运行下去，nohup.out会一直自己增长下去，如果你的服务器硬盘不给力的话，很容易把应用也挂掉（硬盘没空间 ，啥都玩不转），但是又不能一味的直接删。因为直接删除，可能会造成应用无法打印后续的错误日志，该问题常见于weblogic服务器，jboss服务器等这些大型中间件，这个在生产环境上要尤为注意。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>因此就有了我们不停止服务直接，清空nohup.out文件的方法。<br>下面是两个种不用停止WEB服务就可以清空nohup.out的命令。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第一种：<code>cp /dev/null nohup.out</code><br>第二种：<code>cat /dev/null &gt; nohup.out</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">解决 nohup.out 文件过大</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>nohup 的重定向，一劳永逸解决 nohup.out 文件过大的问题<br>以下是定义日志打印级别，除了高于级别2的告警信息记录到log文件外，其余直接不记录</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>//只输出错误信息到日志文件<br><code>nohup ./program &gt;/dev/null 2&gt;log &amp;</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>//什么信息也不要<br><code>nohup ./program &gt;/dev/null 2&gt;&amp;1 &amp;</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Fri, 12 Jan 2024 00:24:48 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Failed to start mysqld.service: Unit not found]]></title>
                <link>https://www.jefsky.com/blog/118</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/118</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">启动mysql</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>systemctl start mysql.service</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">出现以下提示</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>Failed to start mysqld.service: Unit not found</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">解决</h3>
<!-- /wp:heading -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>安装mariadb-server<code>yum install -y mariadb-server</code></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>启动服务<code>systemctl start mariadb.service</code></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>开机启动<code>systemctl enable mariadb.service</code>进行一些安全设置，以及修改数据库管理员密码</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>mysql安全配置及修改数据库管理员密码<code>mysql_secure_installation</code></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>开启远程访问权限<br><code>use mysql；</code><br><code>select User,authentication_string,Host from user；</code><br><code>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';</code><br><code>flush privileges;</code></li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:45 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[部署属于你自己的在线ide vscode]]></title>
                <link>https://www.jefsky.com/blog/120</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/120</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">步骤</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>部署的方法有很多，有docker，ssh，这里就用release来部署</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>下载release<br>下载地址：<a href="https://github.com/cdr/code-server/releases" target="_BLANK" rel="noreferrer noopener">https://github.com/cdr/code-server/releases</a>，根据自己的服务器配置来选择对应的版本.这里以code-server2.1650-vsc1.39.2-linux-x86_64.tar.gz为例下载完成之后解压即可：<code>tar -vzf code-server2.1650-vsc1.39.2-linux-x86_64.tar.gz</code></li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>运行<br>如果你感兴趣的话,可以输入指令<code>./code-server --help</code>查看相关指令直接输入指令<code>./code-server</code>即可启动codeserver随之会提示对应监听的端口为8080,还会给出初始密码打开浏览器访问<a href="http://xn--ip-fr5c86lx7z/" target="_BLANK" rel="noreferrer noopener">http://服务器ip</a>:8080跳到登陆页面，输入密码即可登陆</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>修改端口和默认密码<br>修改密码的指令:<code>export PASSWORD=你的密码</code>启动codeserver，顺便制定端口为88:<br><code>./code-server --auth password --port 88</code></li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:heading -->
<h2 class="wp-block-heading">后台运行</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>上面的操作都不会让code-server在后台运行,如果你退出了或者断开了shell连接,code-server也会随之停止.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>nohup ./codeserver/code-server –auth password –port 88 &gt;&gt; log.log 2&gt;&amp;1 &amp;</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这个命令就是后台启动code-server并且什么都不写入日志</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:42 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[让你的安卓手机也运行vscode]]></title>
                <link>https://www.jefsky.com/blog/122</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/122</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">原理</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>并不是在你的安卓手机上安装visual code,实际是在你的手机上安装一个ubuntu,然后部署一个code-server,如果你知道了,那就不用继续往下看,如果你看不懂我在说什么,那就请随我来</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">准备</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>安卓手机(最好能有桌面模式)<br>Termux 一个不需要root的终端仿真器(自己去Google Play酷安下载)<br><a href="https://github.com/Neo-Oli/termux-ubuntu" target="_BLANK" rel="noreferrer noopener">termux-ubuntu</a>&nbsp;小型ubuntu<br><a href="https://github.com/cdr/code-server" target="_BLANK" rel="noreferrer noopener">code-server</a>&nbsp;visual code服务</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">步骤</h2>
<!-- /wp:heading -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>手机安装Termux</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>进入Termux,下载termux-ubuntu</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>解压并安装部署termux-ubuntu</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>进入termux-ubuntu,下载code-server</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>开启code-server</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>此时,你就可以在你的手机上用浏览器访问<a href="http://localhoust/" target="_BLANK" rel="noreferrer noopener">http://localhoust</a>:8080,就可以使用vscode了</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>它就是一个完整的vscode,你可以在上面下载及运行插件,执行cmd等</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 17:14:21 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[alternativeto 帮你查找代替软件]]></title>
                <link>https://www.jefsky.com/blog/124</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/124</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>就像它的名字那样，"可供选择的、替代的"，没错，这就是一个替代品网站，如果觉得哪个软件不好用，或者嫌安装麻烦，或者购买太贵，到这个网站搜一下，就可以提供很多可供选择的替代产品。</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:embed {"url":"https://alternativeto.net/"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://alternativeto.net/
</div></figure>
<!-- /wp:embed --></blockquote>
<!-- /wp:quote -->]]></content>
                <pubDate>Fri, 12 Jan 2024 01:48:23 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[就凭一句命令让你的苹果Mac启动提示音回归]]></title>
                <link>https://www.jefsky.com/blog/126</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/126</guid>
                <content><![CDATA[<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>打开应用程序文件夹</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>打开实用程序文件夹</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>启动终端应用程序</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>在终端中输入sudo nvram StartupMute =%00，然后按回车键</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>如果想要重新保持默认静音状态，可以在终端中输入sudo nvram StartupMute =%01进行恢复。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:34 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkphp5 返回数组提示variable type error： array]]></title>
                <link>https://www.jefsky.com/blog/128</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/128</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>今天写一个接口,在输入的时候,遇到了报错</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>variable type error： array
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>查阅一下度娘,发现thinkphp5不能直接返回数组.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">怎么解决</h2>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>修改返回方法return json($data) 或者 return xml($data)</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>修改配置文件config.php'default_return_type' =&gt; 'html'修改为你需要的返回类型'default_return_type' =&gt; 'json' 或者 'default_return_type' =&gt; 'xml'</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:32 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[最新版typecho新评论微信提醒通知插件Comment2Wechat]]></title>
                <link>https://www.jefsky.com/blog/130</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/130</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">一、简介</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>「Server酱」，英文名「ServerChan」，是一款「程序员」和「服务器」之间的通信软件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>说人话？就是从服务器推报警和日志到手机的工具。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">二、使用方法</h2>
<!-- /wp:heading -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>下载并安装插件</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>插件下载地址：<a href="https://github.com/Tsuk1ko/Comment2Wechat/archive/master.zip" target="_BLANK" rel="noreferrer noopener">点击此处</a></p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>申请server酱SCKEY</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>（1）进入server酱主页：<a href="http://sc.ftqq.com/" target="_BLANK" rel="noreferrer noopener">点击此处</a><br>（2）用GitHub账号登入server酱网站，没有请自行<a href="http://sc.ftqq.com/?c=github&amp;a=login" target="_BLANK" rel="noreferrer noopener">申请</a><br>（3）打开「发送消息」页面，就能获取一个SCKEY<br>（4）点击「微信推送」，扫码关注同时即可完成绑定</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>使用typecho插件</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>进入到typecho插件页，启用Comment2Wechat，进入设置页，将刚才获取的SCKEY粘贴进去，确定即可。</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>设置成功</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>此时，工作已全部完成。可以去自己的网站测试评论，看看微信是否有提示。如有疑问，请在下方评论！</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Thu, 11 Jan 2024 22:05:41 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho 后台登陆谷歌两步验证插件 GAuthenticator]]></title>
                <link>https://www.jefsky.com/blog/132</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/132</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">插件简介</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>这是一个Typecho系统的两部验证登陆插件，主要支持Google Authenticator的两步验证，免除每次登陆输入密码的麻烦，只要手机安装有AuthOTP软件即可。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>目前该兼容所有符合 RFC6238 规范的AuthOTP软件</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>Microsoft Authenticator</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Google Authenticator</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>1Password</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Authy</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>KeePass</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>LastPass</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:heading -->
<h2 class="wp-block-heading">插件使用</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>下载插件，修改文件名为GAuthenticator放到/usr/plugins目录，然后到后台启用<br>插件默认关闭，首次开启需要扫描二维码绑定之后填写手机上显示的代码，验证成功之后才可以启用</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">已知问题</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>后台没法显示图片，或者是我不知道如何显示，反正就是没显示二维码，只给了一个二维码的网址，自己打开吧</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果手机丢了，没法找回的哟，但是SecretKey保存在数据库typecho_options/plugin:GAuthenticator里，可以手动查询再次绑定</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading"><a href="https://github.com/naicfeng/typecho-Authenticator" target="_BLANK" rel="noreferrer noopener">下载</a></h2>
<!-- /wp:heading -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:26 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkphp5 出现未定义变量style]]></title>
                <link>https://www.jefsky.com/blog/134</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/134</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>上线了一个功能,发现接口一直报错说未定义变量,因为是后台的接口,排查了权限问题,弄来弄去,这过程不说了.<br>最后弄排除法,一行行代码echo一下,发现在最后的返回结果那里问题.<br>原来是因为代码中存在调用模版的代码,接口方法不应存在调用模版的</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">最后把返回改成用json返回就好了</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>接口就接口,不能出现藕断丝连的代码,要干脆利落~</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:22 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决r.getClientRects is not a function]]></title>
                <link>https://www.jefsky.com/blog/136</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/136</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>出现这个问题可能是使用了jquery v3.1<br>Kendo目前正式不支持jquery v3.1，但是如果你引入了jquery-migrate就可以使用了。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Thu, 11 Jan 2024 15:21:19 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[微信小程序 报错: Expecting 'EOF','}',',',']', got INVALID]]></title>
                <link>https://www.jefsky.com/blog/138</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/138</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>JSON 语法<br>这里说一下小程序里JSON配置的一些注意事项。<br>JSON文件都是被包裹在一个大括号中{}，通过key-value的方式来表达数据。JSON的Key必须包裹在一个双引号中，在实践中，编写JSON的时候，忘了给key值加双引号或者是把双引号写成单引号是常见错误。<br>JSON的值只能是以下几种数据格式，其他任何格式都会触发报错，例如JavaScript中的undefined。<br>1、数字，包含浮点和整数；<br>2、字符串，需要包裹在双引号中；<br>3、Bool值，true或者false；<br>4、数组，需要包裹在方括号中[]；<br>5、对象，需要包裹在大括号中{}；<br>6、Null；<br>还需要特别注意的是JSON文件无法使用注释，试图添加注释将会引发报错。<br>附JSON验证网站：<br><a href="http://www.bejson.com/" target="_BLANK" rel="noreferrer noopener">http://www.bejson.com/</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 04:02:20 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[微信小程序云开发初始化失败cannot read property 'init' of undefined]]></title>
                <link>https://www.jefsky.com/blog/140</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/140</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在小程序的app.js中初始化云开发配置<br>出现 cannot read property 'init' of undefined 错误<br>只需将小程序的调试基础库调到最高版本就可以了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:33:07 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[docker 配置镜像加速器]]></title>
                <link>https://www.jefsky.com/blog/142</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/142</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">windows</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>针对安装了Docker Toolbox的用户，您可以参考以下配置步骤：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>创建一台安装有Docker环境的Linux虚拟机，指定机器名称为default，同时配置Docker加速器地址。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>docker-machine create --engine-registry-mirror=https://ugdyofo9.mirror.aliyuncs.com -d virtualbox default
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>查看机器的环境配置，并配置到本地，并通过Docker客户端访问Docker服务。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>docker-machine env defaulteval "$(docker-machine env default)"docker info
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>针对安装了Docker for Windows的用户，您可以参考以下配置步骤：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在系统右下角托盘图标内右键菜单选择 Settings，打开配置窗口后左侧导航菜单选择 Docker Daemon。编辑窗口内的JSON串，填写下方加速器地址：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>{"registry-mirrors": &#91;"https://ugdyofo9.mirror.aliyuncs.com"]}
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>编辑完成后点击 Apply 保存按钮，等待Docker重启并应用配置的镜像加速器。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">注意</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Docker for Windows 和 Docker Toolbox互不兼容，如果同时安装两者的话，需要使用hyperv的参数启动。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>docker-machine create --engine-registry-mirror=https://ugdyofo9.mirror.aliyuncs.com -d hyperv default
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>Docker for Windows 有两种运行模式，一种运行Windows相关容器，一种运行传统的Linux容器。同一时间只能选择一种模式运行。</p>
<!-- /wp:paragraph -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">mac</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>针对安装了Docker Toolbox的用户，您可以参考以下配置步骤：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>创建一台安装有Docker环境的Linux虚拟机，指定机器名称为default，同时配置Docker加速器地址。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>docker-machine create --engine-registry-mirror=https://ugdyofo9.mirror.aliyuncs.com -d virtualbox default
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>查看机器的环境配置，并配置到本地，并通过Docker客户端访问Docker服务。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>docker-machine env defaulteval "$(docker-machine env default)"docker info
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>针对安装了Docker for Mac的用户，您可以参考以下配置步骤：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>右键点击桌面顶栏的 docker 图标，选择 Preferences ，在 Daemon 标签（Docker 17.03 之前版本为 Advanced 标签）下的 Registry mirrors 列表中将</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>https:&#47;&#47;ugdyofo9.mirror.aliyuncs.com
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>加到"registry-mirrors"的数组里，点击 Apply &amp; Restart按钮，等待Docker重启并应用配置的镜像加速器。</p>
<!-- /wp:paragraph -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">centos</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>针对Docker客户端版本大于 1.10.0 的用户</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json &lt;&lt;-'EOF'
{
  "registry-mirrors": &#91;"https://ugdyofo9.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

</code></pre>
<!-- /wp:code -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">linux</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>针对Docker客户端版本大于 1.10.0 的用户</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json &lt;&lt;-'EOF'
{
  "registry-mirrors": &#91;"https://ugdyofo9.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:31:31 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[linux/ubuntu里面卸载软件的方法]]></title>
                <link>https://www.jefsky.com/blog/144</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/144</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">在终端里 apt-get安装的软件</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>安装软件</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo  apt-get install softname1 softname2softname3……</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>卸载软件</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo apt-get remove softname1 softname2 softname3……</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>卸载并清除配置</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo  apt-get remove --purgesoftname1</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>更新软件信息数据库</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo apt-get update</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>进行系统升级</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo apt-get upgrade, sudo apt-get distupgrade</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>搜索软件包</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo apt-cache search softname1 softname2 softname3……
</code></pre>
<!-- /wp:code -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">安装的deb包要用此方法</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>安装deb软件包</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dpkg -i xxx.deb</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>删除软件包</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dpkg -r xxx.deb</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>连同配置文件一起删除</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dpkg -r --purge xxx.deb</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>查看软件包信息</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dpkg -info xxx.deb</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>查看文件拷贝详情</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dpkg -L xxx.deb</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>查看系统中已安装软件包信息</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dpkg -l</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>重新配置软件包</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>dpkg-reconfigure xxx
</code></pre>
<!-- /wp:code -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">“synaptic pakagemanager”</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>点搜索，输入软件名<br>在需要安装或卸载的软件上右击－点标记－最后点应用</p>
<!-- /wp:paragraph -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">software center 直接卸载</h2>
<!-- /wp:heading -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">卸载源代码编译的软件</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>cd 源代码目录
make clean
./configure
（make）
make uninstall
rm -rf 目录
</code></pre>
<!-- /wp:code -->

<!-- wp:separator -->
<hr class="wp-block-separator has-alpha-channel-opacity"/>
<!-- /wp:separator -->

<!-- wp:heading -->
<h2 class="wp-block-heading">清理系统</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo apt-get autoclean
sudo apt-get clean
sudo apt-get autoremove</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>（或使用ubuntu-tweak清理）</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 19:40:43 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu/linux 换阿里云镜像]]></title>
                <link>https://www.jefsky.com/blog/146</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/146</guid>
                <content><![CDATA[<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>vim /etc/apt/sources.list</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>粘贴######## Ubuntu18.04 阿里云镜像源 ###############deb&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic main restricted universe multiversedeb&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-security main restricted universe multiversedeb&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-updates main restricted universe multiversedeb&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-proposed main restricted universe multiversedeb&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-backports main restricted universe multiversedeb-src&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic main restricted universe multiversedeb-src&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-security main restricted universe multiversedeb-src&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-updates main restricted universe multiversedeb-src&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-proposed main restricted universe multiversedeb-src&nbsp;<a href="http://mirrors.aliyun.com/ubuntu/" target="_BLANK" rel="noreferrer noopener">http://mirrors.aliyun.com/ubuntu/</a>&nbsp;bionic-backports main restricted universe multiverse######## 阿里云镜像源 END ###############</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>apt-get update</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->]]></content>
                <pubDate>Mon, 15 Jan 2024 21:04:24 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[手把手教你用GPT格式化大硬盘分区]]></title>
                <link>https://www.jefsky.com/blog/148</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/148</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、使用制作好的系统光盘或U盘启动电脑；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、进入系统界面，按下shift+F10调用命令提示符；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3、输入“diskpart”命令，进入diskpart工具；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>4、输入“list disk”命令，查看当前电脑可用磁盘；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>5、选择需要操作的磁盘，“select disk X”,"X"为目标磁盘序号；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>6、输入“clean”命令，清除当前磁盘上所有数据；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>7、输入“convert gpt”命令，将当前磁盘转换成gpt分区（其中“convert mbr”是转换成mbr）；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>8、创建分区，“create partition NAME size=204800”,创建名为NAME，大小200G的分区，size单位MB，NAME为分区名；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>附：常用命令</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ACTIVE - 将选中的分区标记为活动的分区。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ADD - 将镜像添加到一个简单卷。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ASSIGN - 给所选卷分配一个驱动器号或装载点。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ATTRIBUTES - 操纵卷或磁盘属性。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ATTACH - 连接虚拟磁盘文件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>AUTOMOUNT - 启用和禁用基本卷的自动装载。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>BREAK - 中断镜像集。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>CLEAN - 从磁盘清除配置信息或所有信息。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>COMPACT - 尝试减少文件的物理大小。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>CONVERT - 在不同的磁盘格式之间转换。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>CREATE - 创建卷、分区或虚拟磁盘。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>DELETE - 删除对象。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>DETAIL - 提供对象详细信息。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>DETACH - 分离虚拟磁盘文件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>EXIT - 退出 DiskPart。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>EXTEND - 扩展卷。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>EXPAND - 扩展虚拟磁盘上可用的最大大小。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>FILESYSTEMS - 显示卷上当前和支持的文件系统</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>FORMAT - 格式化卷或分区</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>GPT - 给选择的 GPT 分区分配属性。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>HELP - 显示命令列表。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>IMPORT - 导入磁盘组。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>INACTIVE - 将所选分区标为不活动。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>LIST - 显示对象列表。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>MERGE - 将子磁盘与其父磁盘合并。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ONLINE - 使当前标为脱机的对象联机。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>OFFLINE - 使当前标记为联机的对象脱机。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>RECOVER - 刷新所选包中所有磁盘的状态。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>          尝试恢复无效包中的磁盘，并

          重新同步具有过时丛或奇偶校验数据

          的镜像卷和 RAID5 卷。
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>REM - 不起任何作用。用来注释脚本。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>REMOVE - 删除驱动器号或装载点分配。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>REPAIR - 用失败的成员修复一个 RAID-5 卷。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>RESCAN - 重新扫描计算机，查找磁盘和卷。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>RETAIN - 在一个简单卷下放置一个保留分区。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SAN - 显示或设置当前启动的操作系统的 SAN 策略。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SELECT - 将焦点移动到对象。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SETID - 更改分区类型。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SHRINK - 减小选定卷。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>UNIQUEID - 显示或设置磁盘的 GUID 分区表(GPT)标识符或</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>          主启动记录(MBR)签名。


</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 15:43:18 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[github 图片无法显示？]]></title>
                <link>https://www.jefsky.com/blog/150</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/150</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>不怕，在hosts上加上以下地址就好了</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>192.30.253.112 github.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>192.30.253.119 gist.github.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 assets-cdn.github.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 raw.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 gist.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 cloud.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 camo.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars0.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars1.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars2.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars3.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars4.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars5.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars6.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars7.githubusercontent.com</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>151.101.184.133 avatars8.githubusercontent.com</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 22:36:39 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Python UnicodeDecodeError]]></title>
                <link>https://www.jefsky.com/blog/152</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/152</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>中文字符串在Python环境下遇到 UnicodeDecodeError，这是因为.py文件保存的格式有问题。可以在第一行添加注释</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code># -*- coding: utf-8 -*-
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>目的是告诉Python解释器，用UTF-8编码读取源代码。然后用Notepad++ 另存为... 并选择UTF-8格式保存。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:53 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[网上学习了一下，然后写个框架练练手——Jefskyphp的诞生]]></title>
                <link>https://www.jefsky.com/blog/154</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/154</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">Jefskyphp</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":4} -->
<h4 class="wp-block-heading">A php framework</h4>
<!-- /wp:heading -->

<!-- wp:embed {"url":"https://github.com/Jefsky/jefskyphp"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/Jefsky/jefskyphp
</div></figure>
<!-- /wp:embed -->

<!-- wp:heading -->
<h2 class="wp-block-heading">框架运行流程</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>入口文件 -&gt; 定义常量 -&gt; 引入函数库 -&gt; 自动加载类 -&gt; 启动框架 &lt;- 路由解析 &lt;- 加载控制器 &lt;- 返回结果</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>入口文件<br>/index.php</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">类自动加载</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>spl_autoload_register('corekfw::load');<br>没有引入的类调用load方法</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">路由类</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>默认的路由地址： xxx.com/index.php/index/index</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>隐藏index.php<br>在根目录添加.htaccess文件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>获取URL参数部分<br>/index/index/id/1/str/2</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>返回对应的控制器和方法</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">模型类</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>class Model extends Medoomedoo{</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">视图类</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>twig</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">配置类</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>corelibconf.php</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">控制器</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>添加corelibController基类<br>添加beforeAction方法<br>添加afterAction方法</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">日志类</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>coreliblog.php</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">composer加载</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>新建composer.json文件</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>{
    "name": "jefsky/jefskyphp",
    "descrption": "a php framework",
    "type": "framework",
    "keywords": &#91;
        "PHP", "PHP FrameWork"
    ],
    "require": {
        "php": "&gt;= 5.3.0",
        "filp/whoops": "*",
        "symfony/var-dumper": "*",
        "catfan/medoo": "*",
        "twig/twig": "*"
    },
   "repositories": {
        "packagist": {
            "type": "composer",
            "url": "https://packagist.phpcomposer.com";
        }
    }
}
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">使用composer命令安装依赖</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>composer install<br>composer update<br>whoops用于调试,方便定位错误点<br><a href="https://github.com/filp/whoops%7C" target="_BLANK" rel="noreferrer noopener">https://github.com/filp/whoops|</a>&nbsp;1709646715 |</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>var-dumper优化输出调试<br><a href="https://packagist.org/packages/symfony/var-dumper%7C" target="_BLANK" rel="noreferrer noopener">https://packagist.org/packages/symfony/var-dumper|</a>&nbsp;1709646723 |</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>medoo数据库操作<br><a href="http://medoo.lvtao.net/doc.php%7C" target="_BLANK" rel="noreferrer noopener">http://medoo.lvtao.net/doc.php|</a>&nbsp;1709646731 |</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>twig模版引擎<br><a href="https://twig.symfony.com/doc/2.x/api.html%7C" target="_BLANK" rel="noreferrer noopener">https://twig.symfony.com/doc/2.x/api.html|</a>&nbsp;1709646739 |</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:49 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Apache下htaccess文件不起作用/rewrite 没有效果]]></title>
                <link>https://www.jefsky.com/blog/156</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/156</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、检查apache的rewrite模块是否开启</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>    -进入apache安装目录/conf/http.cnf；

    -把‘#LoadModule rewrite_module modules/mod_rewrite.so’的‘#’去掉；
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>2、检查apache的文件重载是否开启</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>    -将配置文件中的多处‘AllowOverride None’改为‘AllowOverride all’
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>3、保存，重启apache</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 18:39:08 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[\Twig_Autoloader::register(); 找不到Twig_Autoloader]]></title>
                <link>https://www.jefsky.com/blog/158</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/158</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>public function display($file)
{
    $file = APP . '/views/' . $file;
    if(is_file($file)) {
                $loader = new \Twig\Loader\FilesystemLoader(APP . '/views');
                $twig = new \Twig\Environment($loader, &#91;
                    'cache' =&gt; '/path/to/compilation_cache',
                    'debug' =&gt; DEBUG
                ]);
                $template = $twig-&gt;load('index.html');
                $template-&gt;display($this-&gt;assign?$this-&gt;assign:"");
    }
}
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>不需要引入， 直接就可以用， 可以去掉这行。 可能是因为composer autoload.php已引入</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:33 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho 中文章和评论的链接改为新窗口打开]]></title>
                <link>https://www.jefsky.com/blog/162</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/162</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">评论中的链接</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>var/Widget/Abstract/Comments.php</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>echo '&lt;a href="' , $this-&gt;url , '"' , ($noFollow ? ' rel="external nofollow"' : NULL) , '&gt;' , $this-&gt;author , '&lt;/a&gt;';   
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>修改为</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>echo '&lt;a href="' , $this-&gt;url , '"' , ($noFollow ? ' rel="external nofollow"' : NULL) , 'target="_blank"&gt;'  , $this-&gt;author , '&lt;/a&gt;';    
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">文章中的链接</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>var/HyperDown.php</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;a href=\"{$url}\"&gt;{$link}&lt;/a&gt;       </code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>修改为</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;a href=\"{$url}\" target='_blank'&gt;{$link}&lt;/a&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:41 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho服务器出现"Database Server Error"错误]]></title>
                <link>https://www.jefsky.com/blog/164</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/164</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>导入数据库、网站文件以及修改数据库链接，检测到解析正常之后打开网站意外发生了，出现"Database Server Error"错误。可以肯定的是数据库和文件确实没有问题。可能是数据库版本或者是PHP版本问题导致的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>搜索到相关文章，提到Typecho不支持PHP7.0，需要将数据库引擎修改成Pdo_Mysql。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', '*********');
$db-&gt;addServer(array (
  'host' =&gt; '*******',
  'user' =&gt; '*******',
  'password' =&gt; '*********',
  'charset' =&gt; 'utf8',
  'port' =&gt; '3306',
  'database' =&gt; '**********',
  'engine' =&gt; 'MyISAM',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>替换后就可以解决问题。不过，这里又出现故障了，在登录后台的时候有出现"Access denied. "问题。我们需要配置文件，修改php.ini文件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>cgi.fix_pathinfo = 0</code>&nbsp;修改成&nbsp;<code>cgi.fix_pathinfo = 1</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>替换之后，在执行重启PHP。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>service php-fpm restart</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:29:58 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[windows 开启卓越性能]]></title>
                <link>https://www.jefsky.com/blog/166</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/166</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在powershell中执行<br><code>powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:29:45 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[新配置好的lamp访问phpmyadmin出错]]></title>
                <link>https://www.jefsky.com/blog/168</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/168</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>新配置好的lamp访问phpmyadmin出错，</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>phpMyAdmin - Error
The mbstring extension is missing. Please check your PHP configuration.
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>1、打开php的配置文件php.ini；<br>2、查找<code>; extension_dir = "ext"</code>，去掉前面的分号；<br>3、重启<code>Apache /etc/init.d/apache2 restart</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:29:49 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决微信公众号文章图片防盗链]]></title>
                <link>https://www.jefsky.com/blog/170</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/170</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>通常从微信公账号文章中直接复制过来发布，里面的图片基本都会变成这样，文章的图片无法显示。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>废话不多说了，直接干就完了！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>首先在文章模版头部加入</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;meta name="referrer" content="never"&gt;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>然后用动态链接来解决：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;script&gt;

    $(".class img").each(function () {

        var img = $(this);

        var img_src = img.attr("src");

        img.attr('src',img_src+Math.random());

    });

&lt;/script&gt;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>相信对于其他的防盗链也可能适用</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:13 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column]]></title>
                <link>https://www.jefsky.com/blog/172</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/172</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">错误信息：</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>SQLSTATE&#91;42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column cms_edit_log.real_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">错误解决：</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>修改/etc/my.cnf在[mysqld]下面添加如下列：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:06 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[PHP错误：SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client]]></title>
                <link>https://www.jefsky.com/blog/174</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/174</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>使用PHP连接MySQL 8的时候，可能会发生如标题所示的错误：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>SQLSTATE&#91;HY000] &#91;2054] The server requested authentication method unknown to the client
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>发生这种错误，是由于MySQL 8默认使用了新的密码验证插件：caching_sha2_password，而之前的PHP版本中所带的mysqlnd无法支持这种验证。解决这个问题，有两种办法。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>一种办法是升级PHP支持MySQL 8的新验证插件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>PHP 7.2.8和PHP 7.1.20已经可以支持caching_sha2_password，直接连接MySQL 8。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>截止PHP 7.0.31和PHP 5.6.37还无法支持caching_sha2_password，不知道后续版本是否会做出支持。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>可以通过phpinfo()函数了解当前安装的PHP是否支持caching_sha2_password：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果不能升级PHP，可以在MySQL 8中创建（或修改）使用caching_sha2_password插件的账户，使之使用mysql_native_password，这样先前版本的PHP就可以连接使用了。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:02 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决pjax加载页面导致js插件失效]]></title>
                <link>https://www.jefsky.com/blog/176</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/176</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>因为pjax只在第一次加载的时候把js都加载，所以之后页面载入的时候如果需要初始化插件是不可能的，那应该怎么办呢？</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>把插件的js引入放在pjax加载完成的时候就好了，如本站例子</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;script&gt;
    // pjax
    $(document).pjax('a&#91;href^="xxx"]:not(a&#91;target="_blank"], a&#91;no-pjax])', {
        container: '#kratos-blog-post',    
        fragment: '#kratos-blog-post',    
        timeout: 8000    
    }).on('pjax:send',    
        function() {    
            NProgress.start();//加载动画效果开始    
    }).on('pjax:complete',    
    function() {    
        &lt;script type='text/javascript' src='xxxxxxx'&gt;&lt;/script&gt;  //载入插件js    
        NProgress.done();//加载动画效果结束    
    });    
&lt;/script&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:29:53 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Apache 开启伪静态模块]]></title>
                <link>https://www.jefsky.com/blog/178</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/178</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在 Apache 配置中启用 Rewrite，打开配置文件&nbsp;<code>\Apache24\conf\httpd.conf</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>LoadModule rewrite_module modules/mod_rewrite.so 去掉句首的“#”</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果没有就粘贴过去</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>启用 .htaccess</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>针对启用了虚拟机的，在系统配置项中找到 Apache 的配置文件&nbsp;<code>\Apache24\conf\extra\httpd-vhosts.conf</code></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;VirtualHost *:80&gt;

    ServerAdmin webmaster@dummy-host2.example.com

    ServerName www.example.com

    DocumentRoot "${SRVROOT}/htdocs"

    ErrorLog "logs/www.example.com-error.log"

    CustomLog "logs/www.example.com-access.log" common

    &lt;Directory ${SRVROOT}/htdocs &gt;

         #AllowOverride None

        AllowOverride All

        Require all granted

    &lt;/Directory&gt;

&lt;/VirtualHost&gt;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>没有启用虚拟机的，在系统配置项中找到 Apache 的配置文件&nbsp;<code>\Apache24\conf\httpd.conf</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>将 AllowOverride None 修改为： AllowOverride All（对于配置文件，建议在修改前做下备份）</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:29:42 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Ubuntu下启动/重启/停止apache服务器]]></title>
                <link>https://www.jefsky.com/blog/180</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/180</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>Start Apache 2 Server /启动apache服务</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$ sudo /etc/init.d/apache2 start</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Restart Apache 2 Server /重启apache服务</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$ sudo /etc/init.d/apache2 restart</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Stop Apache 2 Server /停止apache服务</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$ sudo /etc/init.d/apache2 stop</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:29:38 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[uni-app 开发 html5执行没问题，微信小程序报错]]></title>
                <link>https://www.jefsky.com/blog/182</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/182</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>uni-app 开发 html5执行没问题，微信小程序报错（jsEnginScriptError Component）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>大概意思是没有找到这个组件吧。检查了很久，源码中组件的路径是正确的，html编译也没问题，可以正常运行。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>既然是小程序报错，那就从小程序的组件入手吧。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>小程序的组件引用路径也是没问题的，相对源码目录或者小程序目录都是没问题。顺着这个思路，我去看组件目录。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>对比了一下，发现少了viewDynamic.json文件，这个文件相当于对组件的启用配置吧。因为文件的内容是</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>为什么会没有生成呢？顺着这个思路，我去查看了组件的源文件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>发现原来源文件的结构不完整，确实了结构，立马加上去编译。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>viewDynamic.json文件编译出来了，也没有报错，正常运行了！</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:30:09 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[win10系统下误删系统变量path恢复方法]]></title>
                <link>https://www.jefsky.com/blog/184</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/184</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>可能是还没睡醒吧，早上一开机就把系统环境变量的Path删除了，顿时晴天霹雳，昨天才刚刚做好的系统，今天有得重装？</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>还好有注册表在！</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">误删系统变量记得千万一定不要重启电脑！</h3>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2 class="wp-block-heading">误删系统变量记得千万一定不要重启电脑！</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">误删系统变量记得千万一定不要重启电脑！</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>下面看我是怎么恢复的</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>什么都别做了，赶紧打开注册表</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>-- win+R 输入 regedit 打开注册表；

-- 定位到 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>看到了吧，被误删的Path这里还有，呼呼，赶紧复制，在系统变量那里恢复回去！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这里还能看到有别的系统变量，大概你没有重启电脑，应该都能恢复回去吧！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果不幸你的注册表也没了，那就复制下面的环境变量过去吧，应该还能拯救一下！</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>之后还差什么的，那就看你自己了~</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:37:08 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[php项目部署到服务器出现乱码或输出代码]]></title>
                <link>https://www.jefsky.com/blog/186</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/186</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>刚刚部署好项目，明明是可以的，怎么新环境就不行，那么可能是你的环境没有开启短标签了</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>打开<code>\php\php.ini</code>，开启短标签</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>short_open_tag = On</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>保存，重启一下就好了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 15:19:22 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[致命错误: Call to undefined function think\captcha\imagecreate()]]></title>
                <link>https://www.jefsky.com/blog/188</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/188</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>刚刚搭建好环境运行程序常常回出现各种各样的问题，看吧，捕捉到一个了，这是因为php扩展中没有开启gd</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>打开<code>\php\php.ini</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>extension=gd2 去掉“;”就好</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:28:54 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[windows apache 虚拟机配置]]></title>
                <link>https://www.jefsky.com/blog/190</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/190</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>配置好wamp之后，我们就需要配置虚拟机了，这里我比较推荐采用域名来配置，因为用端口的话，又得考虑端口占用的问题，同域名的话，结合SwitchHosts!可以很方便的切换，也不用担心域名冲突什么的。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">启动apache的虚拟机扩展</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>解除<code>\Apache24\conf\httpd.conf</code>文件中一下语句的注释#</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>LoadModule vhost_alias_module modules/mod_vhost_alias.so</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Include conf/extra/httpd-vhosts.conf</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">配置虚拟机</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>编辑<code>\Apache24\conf\extra\httpd-vhosts.conf</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在文件尾部加上</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;VirtualHost *:80&gt;

    #绑定域名

    ServerName demo.com

    #网站目录

    DocumentRoot ""

    #网站目录

    &lt;Directory  ""&gt;

    Options +Indexes +Includes +FollowSymLinks +MultiViews

    AllowOverride All

    Require local

    &lt;/Directory&gt;

&lt;/VirtualHost&gt;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>3、重启apache就好了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 12:00:27 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[windows安装wamp环境]]></title>
                <link>https://www.jefsky.com/blog/192</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/192</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">W-&gt;windows</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>系统安装这里就省略了哈，如真有在系统安装需要什么问题的，可以直接找我！欢迎~</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">A-&gt;apache</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1、到官网下载apache最新版本，<a href="http://httpd.apache.org/download.cgi" target="_BLANK" rel="noreferrer noopener">http://httpd.apache.org/download.cgi</a><br>2、解压到安装目录之后，cmd进入到/bin目录<br>-- 安装 httpd.exe --install 或者 http -k install<br>-- 启动服务 net start[restart] apache<br>3、配置apache<br>-- 编辑<code>\apache24\conf\httpd.conf</code>，找到DirectoryIndex，追加index.php index.htm<br>-- 添加对php的支持：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>        LoadModule php7_module D:/amp/php7/php7apache2_4.dll  

        PHPIniDir "D:/php"  

        AddType application/x-httpd-php .php .html .htm  </code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">三、M-&gt;mysql （详情可以移步到：<a href="https://www.jefsky.com/index.php/archives/201.html">https://www.jefsky.com/index.php/archives/201.html</a>）</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1、首先到官网下载最新的mysql，官网：<a href="https://dev.mysql.com/downloads/mysql/" target="_BLANK" rel="noreferrer noopener">https://dev.mysql.com/downloads/mysql/</a><br>-- MSI版本的是直接界面化安装，zip压缩包解压dos窗口安装，我选择了zip<br>2、下载之后解压到安装的目录，并用cmd进入当前目录/bin<br>3、接下来，在安装目录下，创建一个新空文件夹data和一个my.ini文件，其内容如下：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&#91;mysql]# 设置mysql客户端默认字符集default-character-set=utf8 
&#91;mysqld]#设置3306端口
port = 3306 # 设置mysql的安装目录
basedir=E:/mysql-5.7.12-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:/mysql-5.7.12-winx64/data
# 允许最大连接数
max_connections=200# 服务端使用的字符集默认为8比特编码的latin1字符集character-set-server=utf8
# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB
    basedir：安装mysql的路径
    datadir：刚创建的data目录路径</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>4、cmd 输入 mysqld --initialize-insecure<br>-- 再输入：mysqld -install （如果说已经存在，可以使用 sc delete mysql 或者 mysql -remove 将其删除）<br>-- 显示Service successfully installed你就棒棒哒了<br>-- net start mysql #启动mysql服务<br>-- 如果出现MySQL 服务无法启动状况，你可以看看my.ini文件中basedir和datadir中的路径有没有写好</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">四、P-&gt;php （详情可以移步到：<a href="https://www.jefsky.com/index.php/archives/41.html">https://www.jefsky.com/index.php/archives/41.html</a>）</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1、windows安装php<br>--&nbsp;<a href="http://windows.php.net/download" target="_BLANK" rel="noreferrer noopener">http://windows.php.net/download</a><br>-- 下载好之后解压到特定目录，如<code>D:\php\</code><br>2、设置php环境变量<br>-- Win+R，输入sysdm.cpl<br>-- 系统变量path中添加<code>D:\php</code><br>3、测试php是否可执行<br>-- cmd php -h<br>4、配置php.ini文件（结合自己实际情况选择）<br>-- php.ini-development 开发测试用<br>-- php.ini-production 安全性高，适合线上<br>-- 我用了php.ini-production重命名为php.ini</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>稍后你可能还需要配置虚拟机，你可以移步到windows apache 虚拟机配置</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 20:51:56 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Windows系统安装MySQL]]></title>
                <link>https://www.jefsky.com/blog/194</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/194</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>今天给公司的电脑装上了win10，心血来潮想自己搭建wamp。前面的都还好啦，系统安装，php解压，apache的安装配置，就是弄mysql有点麻烦，毕竟不是可以像linux一行命令搞掂。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1、首先到官网下载最新的mysql，官网：<a href="https://dev.mysql.com/downloads/mysql/" target="_BLANK" rel="noreferrer noopener">https://dev.mysql.com/downloads/mysql/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>MSI版本的是直接界面化安装，zip压缩包解压dos窗口安装，我选择了zip</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、下载之后解压到安装的目录，并用cmd进入当前目录/bin</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3、接下来，在安装目录下，创建一个新空文件夹data和一个my.ini文件，其内容如下：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&#91;mysql]# 设置mysql客户端默认字符集default-character-set=utf8 
&#91;mysqld]#设置3306端口
port = 3306 # 设置mysql的安装目录
basedir=E:/mysql-5.7.12-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:/mysql-5.7.12-winx64/data
# 允许最大连接数
max_connections=200# 服务端使用的字符集默认为8比特编码的latin1字符集character-set-server=utf8
# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB
basedir：安装mysql的路径

datadir：刚创建的data目录路径
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>4、cmd 输入 mysqld --initialize-insecure</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>再输入：mysqld -install （如果说已经存在，可以使用 sc delete mysql 或者 mysql -remove 将其删除）<br>显示Service successfully installed你就棒棒哒了<br>net start mysql #启动mysql服务<br>如果出现MySQL 服务无法启动状况，你可以看看my.ini文件中basedir和datadir中的路径有没有写好</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>5、以上都通过之后，我们需要配置一下mysql的密码（因为这时候是没有密码的）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>cmd 输入 mysqladmin -u root password *******</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>mysql -u root -p //进入mysql</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>show databases; //尝试一下</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果可以正常显示数据库出来，就说明你已经成功了</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>注意哟！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果在mysqld --initialize-insecure这一步报错，请百度下载vcredist_x64.exe或者vcredist_x86.exe，安装后解决报错</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:54:55 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[HEAD detached at head的处理]]></title>
                <link>https://www.jefsky.com/blog/196</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/196</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>今天push的时候发现push不上去，经过一系列的操作，发现自己的head被指向在一个没有分支名称的修订版本上，此时我出于了游离状态(detached HEAD)，应该就是这样导致我commit操作提交不到在任何分支上，想了一下应该是之前的git checkout操作造成的。因为git checkout本质上是修改HEAD里面的内容来让它指向不同分支的,而HEAD文件指向的分支就是我们当前的分支,但是有时候HEAD不会指向任何分支，这就是我遇到的情况了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>之后灵机一动，把这个head创建一个分支，在merge到master上就好了</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$git branch temp 97e6710</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>使用git branch 分支名 操作ID 这句命令能够创建一个新的分支,但要注意此时我们还没有切换到这个分支上,这个分支上面代码跟我刚才提交完之后的一样.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$git checkout master</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>切换到master分支</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$git merge temp</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>把上传commit合并到master分支</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$git push</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>最后就可以push上去了</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$git branch -d temp</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>接着把临时分支删除就好了</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">相关命令：</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>git status //查看git状态</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>git branch -a //查看所有分支</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 19:51:35 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[用React、Redux、Immutable做俄罗斯方块]]></title>
                <link>https://www.jefsky.com/blog/198</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/198</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>用React、Redux、Immutable做俄罗斯方块<br>俄罗斯方块是一直各类程序语言热衷实现的经典游戏，JavaScript的实现版本也有很多，这是用React 做的俄罗斯方块。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>戳：<a href="https://www.jefsky.com/games/tetris">https://www.jefsky.com/games/tetris</a>&nbsp;玩一玩！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>项目地址：<a href="https://github.com/chvin/react-tetris" target="_BLANK" rel="noreferrer noopener">https://github.com/chvin/react-tetris</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 18:30:54 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决Mac下命令行ll指令command not found的问题]]></title>
                <link>https://www.jefsky.com/blog/200</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/200</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在mac下无法使用ll,la,l等命令，其实是因为没有配置好ls命令的别名</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>打开环境变量配置文件.bash_profile</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>open ~/.bash_profile</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>添加以下内容到配置文件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>alias ll='ls -alF</code><br><code>alias la='ls -A</code><br><code>alias l='ls -CF</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>command+s进行保存。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>编译配置文件.bash_profile：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>source .bash_profile</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 12:24:44 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[开启Mac终端Tab键自动补全功能]]></title>
                <link>https://www.jefsky.com/blog/202</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/202</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>打开终端，输入以下命令，进入编辑状态<br><code>$ nano .inputrc</code><br>然后在里面粘贴上以下语句：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>set completion-ignore-case onset show-all-if-ambiguous on
TAB: menu-complete
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>按快捷键Control+O（^+O）保存，再按回车</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Control+X（^+X）退出编辑</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>重启终端就可以了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 20:42:47 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[安装git后生成ssh公钥方法]]></title>
                <link>https://www.jefsky.com/blog/204</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/204</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>检查SSH keys是否存在</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>ls -al ~/.ssh</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>生成新的ssh key</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>ssh-keygen -t rsa -C “your_email@example.com”</code></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:26:37 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[搭建Git服务器]]></title>
                <link>https://www.jefsky.com/blog/206</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/206</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>远程仓库实际上和本地仓库没啥不同，纯粹为了7x24小时开机并交换大家的修改。<br>GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说，既不想公开源代码，又舍不得给GitHub交保护费，那就只能自己搭建一台Git服务器作为私有仓库使用。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>搭建Git服务器需要准备一台运行Linux的机器，强烈推荐用Ubuntu或Debian，这样，通过几条简单的apt命令就可以完成安装。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>假设你已经有sudo权限的用户账号，下面，正式开始安装。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第一步，安装git：</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>$ sudo apt-get install git</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第二步，创建一个git用户，用来运行git服务：</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><code>$ sudo adduser git</code></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第三步，创建证书登录：</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>收集所有需要登录的用户的公钥，就是他们自己的id_rsa.pub文件，把所有公钥导入到/home/git/.ssh/authorized_keys文件里，一行一个。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">第四步，初始化Git仓库：</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>先选定一个目录作为Git仓库，假定是/srv/sample.git，在/srv目录下输入命令：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$ sudo git init --bare sample.git</code><br>Git就会创建一个裸仓库，裸仓库没有工作区，因为服务器上的Git仓库纯粹是为了共享，所以不让用户直接登录到服务器上去改工作区，并且服务器上的Git仓库通常都以.git结尾。然后，把owner改为git：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$ sudo chown -R git:git sample.git</code><br>第五步，禁用shell登录：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>出于安全考虑，第二步创建的git用户不允许登录shell，这可以通过编辑/etc/passwd文件完成。找到类似下面的一行：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>git:x:1001:1001:,,,:/home/git:/bin/bash</code><br>改为：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell</code><br>这样，git用户可以正常通过ssh使用git，但无法登录shell，因为我们为git用户指定的git-shell每次一登录就自动退出。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第六步，克隆远程仓库：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>现在，可以通过git clone命令克隆远程仓库了，在各自的电脑上运行：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>$ git clone git@server:/srv/sample.gitCloning into 'sample'...warning: You appear to have cloned an empty repository.</code><br>剩下的推送就简单了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>来自廖雪峰&nbsp;<a href="https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664" target="_BLANK" rel="noreferrer noopener">https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 04:53:37 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[JS字符串转换为JSON的四种方法笔记]]></title>
                <link>https://www.jefsky.com/blog/208</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/208</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1.jQuery插件支持的转换方式：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>示例：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>$.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2.浏览器支持的转换方式(Firefox，chrome，opera，safari，ie)等浏览器：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>示例：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>JSON.parse(jsonstr); //可以将json字符串转换成json对象</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>JSON.stringify(jsonobj); //可以将json对象转换成json对符串</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>注：ie8(兼容模式),ie7和ie6没有JSON对象，推荐采用JSON官方的方式，引入json.js。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3.Javascript支持的转换方式：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>eval('(' + jsonstr + ')'); //可以将json字符串转换成json对象,注意需要在json字符外包裹一对小括号</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>注：ie8(兼容模式),ie7和ie6也可以使用eval()将字符串转为JSON对象，但不推荐这些方式，这种方式不安全eval会执行json串中的表达式。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>4.JSON官方的转换方式：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="http://www.json.org/%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%80%E4%B8%AAjson.js,%E8%BF%99%E6%A0%B7ie8(%E5%85%BC%E5%AE%B9%E6%A8%A1%E5%BC%8F),ie7%E5%92%8Cie6%E5%B0%B1%E5%8F%AF%E4%BB%A5%E6%94%AF%E6%8C%81JSON%E5%AF%B9%E8%B1%A1%E4%BB%A5%E5%8F%8A%E5%85%B6stringify()%E5%92%8Cparse()%E6%96%B9%E6%B3%95" target="_BLANK" rel="noreferrer noopener">http://www.json.org/提供了一个json.js,这样ie8(兼容模式),ie7和ie6就可以支持JSON对象以及其stringify()和parse()方法</a>；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>可以在<a href="https://github.com/douglascrockford/JSON-js%E4%B8%8A%E8%8E%B7%E5%8F%96%E5%88%B0%E8%BF%99%E4%B8%AAjs" target="_BLANK" rel="noreferrer noopener">https://github.com/douglascrockford/JSON-js上获取到这个js</a>，一般现在用json2.js。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 12:41:32 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[干货，不小心执行了rm -f，除了跑路，如何恢复？]]></title>
                <link>https://www.jefsky.com/blog/210</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/210</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">前言</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>每当我们在生产环境服务器上执行rm命令时，总是提心吊胆的，因为一不小心执行了误删，然后就要准备跑路了，毕竟人不是机器，更何况机器也有bug，呵呵。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>那么如果真的删除了不该删除的文件，比如数据库、日志或执行文件，咋办呢？欲知后事如何，请仔细看完本篇博客。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">模拟场景</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1.删除</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>误删除服务器目录/root/selenium/Spider下的MySql.Data.dll文件：</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>rm -f /root/selenium/Spider/MySql.Data.dll&gt; ll /root/selenium/Spider/MySql.Data.dllls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>2.恢复<br>使用lsof命令查看当前是否有进程打开/root/selenium/Spider/MySql.Data.dll文件：</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>lsof | grep /root/selenium/Spider/MySql.Data.dll</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>从上面可以看出，当前文件状态为已删除（deleted）。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>查看是否存在恢复数据：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>/proc/13067/fd：进程操作的文件描述符目录。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>86：文件描述符。</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>cat /proc/13067/fd/86</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>使用I/O重定向恢复文件：</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>cat /proc/23778/fd/86 &gt; /root/selenium/Spider/MySql.Data.dll&gt; ls -l /root/selenium/Spider/MySql.Data.dll-rw-r--r-- 1 root root 702464 Feb 10 12:03 /root/selenium/Spider/MySql.Data.dll<br>重新运行程序：</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>说明恢复的文件没有问题。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">刨根问底</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>通过前面的模拟场景演示了恢复文件的整个过程，那么原理是什么，在什么情况下，文件才是可恢复的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在Linux系统中，每个运行中的程序都有一个宿主进程彼此隔离，以/proc/进程号来体现（Linux本质上就是一个文件系统），比如：ls -l /proc/13067 查看进程PID为13067的进程信息；当程序运行时，操作系统会专门开辟一块内存区域，提供给当前进程使用，对于依赖的文件，操作系统会发放一个文件描述符，以便读写文件，当我们执行 rm -f 删除文件时，其实只是删除了文件的目录索引节点，对于文件系统不可见，但是对于打开它的进程依然可见，即仍然可以使用先前发放的文件描述符读写文件，正是利用这样的原理，所以我们可以使用I/O重定向的方式来恢复文件。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">总结</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果不小心误删了文件，不要着急，首先使用 lsof 查看打开该文件的进程，然后再使用 cat /proc/进程号/fd/文件描述符 查看恢复数据，最后使用I/O重定向的方式来恢复文件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://www.cnblogs.com/justmine/p/10359186.html">https://www.cnblogs.com/justmine/p/10359186.html</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 00:12:57 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决ubuntu mysql navicat远程无法访问 127.0.0.1:3306]]></title>
                <link>https://www.jefsky.com/blog/212</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/212</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>首先登录mysql查看用户访问配置</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>mysql -u root;

&gt;use mysql;

&gt;select Host,User from user;

</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>得知用户已经赋予任何主机可访问权限；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果你的没有，烦请你到<a href="https://www.jefsky.com/index.php/archives/9.html%E6%9F%A5%E7%9C%8B%E5%86%B3%E8%A7%A3%E6%96%B9%E6%A1%88">https://www.jefsky.com/index.php/archives/9.html查看决解方案</a>；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>接下来，查看端口</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>netstat -ntlp | grep -v tcp6;</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>发现127.0.0.1:3306</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>查看mysqld.cnf文件路径</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>find / -name mysqld.cnf</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>查看mysql版本</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>mysql -V</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>mysql5.7 版本：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>vi /etc/mysql/mysql.conf.d/mysqld.cnf;　　//将bind-address = 127.0.0.1 修改成 bind-address = 0.0.0.0
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>mysql5.7以前的版本：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>vi /etc/mysql/my.cnf;　　//将bind-address = 127.0.0.1 修改成 bind-address = 0.0.0.0 ，或注释掉即可

service mysql restart;　　　　//重启mysql
netstat -ntlp | grep -v tcp6;　  //查看端口状态为0.0.0.0:3306即可</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:26:14 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[javascript中何时this何时that]]></title>
                <link>https://www.jefsky.com/blog/214</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/214</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>this是Javascript中的一个关键字。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>当函数运行时，会自动生成的一个内部对象，this代表的就是当前对象，只能在当前函数内部使用，注意这里很重要是当前函数内部！！！因为很多时候会函数中有函数，这个时候，我们就需要把外部函数对象this复制一份了，所以就有了var that=this，that就在里面的函数中用外面的函数对象，这样就不会出现报错说没有什么对象或者变量了。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$(‘#div.clickme').click(function(){

    //此时，this就是#div.clickme这个对象

    var that = this;    //复制，把this对象复制到that

    $(‘#.loop').each(function(){

    //此时，this就成了each遍历到的.loop对象

    //that是外面的那个#div.clickme对象

    });

});
</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 11:54:51 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Thinkphp3.2.3整合phpqrcode生成二维码]]></title>
                <link>https://www.jefsky.com/blog/216</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/216</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>下载地址：<a href="https://sourceforge.net/projects/phpqrcode/" target="_BLANK" rel="noreferrer noopener">https://sourceforge.net/projects/phpqrcode/</a><br>下载后解压放到ThinkPHPLibraryVendor</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>调用phpqrcode</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>public function qrcode()

{

    $url="https://www.jefsky.com";

    Vendor('phpqrcode');

    $errorCorrectionLevel =intval('L') ;//容错级别 L、M、Q、H

    $matrixPointSize = intval(4);//生成二维码点的大小 1~10,手机端用4即可

    $object = new \QRcode();

    $object-&gt;png($url, false, $errorCorrectionLevel, $matrixPointSize, 2);    //不保存

    //$object-&gt;png($url,$filename,$level,$size);    //保存

}

</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:26:10 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Chrome 调试跨域问题解决方案之插件篇]]></title>
                <link>https://www.jefsky.com/blog/218</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/218</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>跨域，就是A域名下的js，想请求B域名下的接口数据。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>跨域，只存在于浏览器端。App和小程序不存在跨域问题。<br>跨域，分浏览器策略和服务器策略。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果服务器配置了允许跨域，那就没有跨域问题</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果uni-app发布的H5页面和服务器接口部署在同一个域名下，那就没有跨域问题</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果服务器不能配跨域，开发期间为了调试方便，想让开发机的ip可以跨域访问服务器接口，那么可以在开发机chrome上安装一个跨域插件。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如果仅仅是为了本地预览，可以使用Chrome浏览器插件来协助调试。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>插件名称：Allow-Control-Allow-Origin: *</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>插件地址<a href="https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi" target="_BLANK" rel="noreferrer noopener">https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:26:34 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu thinkphp5 项目部署上服务器返回500 但有数据]]></title>
                <link>https://www.jefsky.com/blog/220</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/220</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>thinkphp5 项目部署上服务器返回500 但有数据；<br>原因是linux（ubuntu）中没有设置好权限，在项目根目录的runtime给予777权限就好了，没有的可以手动创建。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:26:05 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[使用pear下载包出现：No releases available for package "pear.php.net/PHP_CodeSniffer"]]></title>
                <link>https://www.jefsky.com/blog/222</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/222</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、更新一下list</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>PS C:\php&gt; pear list-upgrades；</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Connection to `ssl://pear.php.net:443' failed: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、出现php未开启ssl，到php.ini中打开ssl；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3、重新更新一下list</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>PS C:\php&gt; pear list-upgrades</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>4、提示channel有更新，更新一下channel</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>PS C:\php&gt; pear channel-update pear.php.net</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Updating channel "pear.php.net"</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Update of Channel "pear.php.net" succeeded</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>5、再尝试upgrade</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>PS C:\php&gt; pear list-upgrades</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Channel pear.php.net: No upgrades available</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>6、安装你需要的扩展，例如phpcs</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>PS C:\php&gt; pear install PHP_CodeSniffer-3.4.2</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>downloading PHP_CodeSniffer-3.4.2.tgz ...</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Starting to download PHP_CodeSniffer-3.4.2.tgz (637,880 bytes)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>................................................................................................................................done: 637,880 bytes</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>install ok: channel://pear.php.net/PHP_CodeSniffer-3.4.2</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>看吧~成功了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:26:21 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[服务器发回了不可路由的地址,使用服务器地址代替]]></title>
                <link>https://www.jefsky.com/blog/224</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/224</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>Filezilla —–服务器发回了不可路由的地址，使用服务器地址代替</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>FTP应该算是常见网络服务中最简单搭建的，初次在国内云服务器上搭建FTP的朋友们应该不会对下面的报错感到陌生，“服务器发回了不可路由的地址，使用服务器地址代替”和“读取目录列表失败”其实是两个问题，反正最终结果就是无法使用FTP，所以很多朋友觉得就是一回事。这里以Linux宝塔面板在腾讯云上搭建Pure-Ftpd为例，给大家分享一下怎么彻底解决这个问题。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>故障分析<br>服务器发回了不可路由的地址，使用服务器地址代替。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>网上最多的解决方案是修改Filezilla客户端的传输方式，也就是把“使用服务器的外部ip地址来代替”改为“回到主动模式”，这个答案并没有说错，但实在过于片面，所以绝大部分朋友最终还是未能解决问题！导致登陆FTP报错的原因主要有两个，按顺序依次开始分析。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第一个 服务器发回了不可路由的地址，使用服务器地址代替</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>腾讯云服务器的基础网络是通过NAT与互联网连接，服务器上的网卡IP为内网地址，而且Pure-Ftpd配置文件中未指定强制被动通信的外网IP地址。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第二个 读取目录列表失败</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>很多朋友以为只要禁用了VPS上的防火墙，就能畅通无阻，然而大型企业提供的云计算服务，一般都还有一道防火墙存在。腾讯云安全组策略中，未开放Pure-Ftpd被动端口范围，导致无法使用被动模式通信。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>解决方案<br>第一个</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>进入宝塔面板，依次点击软件管理-pure-ftpd 1.0.47-配置修改，搜索“ForcePassiveIP”，定位到下图位置：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>服务器发回了不可路由的地址，使用服务器地址代替。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>去掉ForcePassiveIP前面的注释符号，并把后面的IP地址修改为服务器的外网IP地址，保存配置后重载配置或者重启服务生效，解决报错：服务器发回了不可路由的地址，使用服务器地址代替。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>第二个</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Pure-Ftpd配置文件使用的被动端口范围是39000-4000，如需自定义可以编辑修改Pure-Ftpd配置文件。进入腾讯云主机的安全组，添加放行TCP39000-40000，解决报错：读取目录列表失败。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>服务器发回了不可路由的地址，使用服务器地址代替。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 10:37:39 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Hackintosh黑苹果长期维护机型EFI及安装教程整理]]></title>
                <link>https://www.jefsky.com/blog/226</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/226</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>整理这份清单的目的：在于给想体验黑苹果的人一个方向，也想减少大家重复造轮子，节约大家的时间。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>项目地址：&nbsp;<a href="https://github.com/daliansky/Hackintosh" target="_BLANK" rel="noreferrer noopener">https://github.com/daliansky/Hackintosh</a></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 21:58:28 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[vue调试]]></title>
                <link>https://www.jefsky.com/blog/228</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/228</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、console.log,console.error,alert(),debuger</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、chrome vue插件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3、vue实例对象</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>var app = new vue ({

...

})

window对象绑定

mounted(){

    window.vue = this;

}</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 11:27:49 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu 软连接创建与删除]]></title>
                <link>https://www.jefsky.com/blog/230</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/230</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>mkdir test_chk //创建文件夹</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>touch test_chk/test.txt //创建文件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>vim test_chk/test.txt //往test写点内容</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ln-s test_chk test_chk_ln //创建test_chk目录的软链接</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>软链接创建好了，我们来看看怎么删除它</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">正确的删除方式（删除软链接，但不删除实际数据）</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>rm -rf ./test_chk_ln</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">错误的删除方式</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>rm -rf ./test_chk_ln/ (这样就会把原来test_chk下的内容删除)</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">现在看到区别了吧，所以说，以后大家在用rm -rf 删除软链接时，注意了！！！！</h3>
<!-- /wp:heading -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:49:51 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[MySQL server has gone away 问题的解决方法]]></title>
                <link>https://www.jefsky.com/blog/232</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/232</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在my.cnf文件中添加或者修改：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>max_allowed_packet=500M</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>wait_timeout=288000</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>interactive_timeout = 288000</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 16:14:55 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu apt-get 命令]]></title>
                <link>https://www.jefsky.com/blog/234</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/234</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>apt-get update:更新安装列表</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>apt-get upgrade:升级软件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>apt-get install software_name :安装软件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>apt-get --purge remove software_name :卸载软件及其配置</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>apt-get autoremove software_name:卸载软件及其依赖的安装包</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>dpkg --list:罗列已安装软件</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:24:57 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决SSH连接Linux超时自动断开]]></title>
                <link>https://www.jefsky.com/blog/236</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/236</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>修改sshd服务配置文件</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>cd /etc/ssh

grep ClientAlive sshd_confi        # 查看sshd_config中关于客户端活动状态的配置

# 默认配置如下

# ----------------------------

#ClientAliveInterval 0

#ClientAliveCountMax 3

# ----------------------------

# ClientAliveInterval 指定了服务器端向客户端请求消息的时间间隔, 默认是0, 不发送。设置60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了。

# ClientAliveCountMax 表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开。正常情况下, 客户端不会不响应，使用默认值3即可。

cp sshd_config sshd_config.bak        # 备份原配置文件

# 启用客户端活动检查，每60秒检查一次，3次不活动断开连接

sed -i "s/#ClientAliveInterval 0/ClientAliveInterval 60/g" sshd_config

sed -i "s/#ClientAliveCountMax 3/ClientAliveCountMax 3/g" sshd_config

grep ClientAlive sshd_config        # 确认修改

diff sshd_config sshd_config.bak        # 比较配置文件差异

service sshd reload        # 重新加载ssd配置，让配置生效</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:25:21 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu server 开启root密码登录]]></title>
                <link>https://www.jefsky.com/blog/238</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/238</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>ubuntu server 16.04 开启root密码登录<br>由于众多VPS默认使用证书验证登录，虽然安全但使用十分不便，所以特提供开启root用户并使用密码登录方法。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>root账户设置密码<br><code>$ sudo passwd root</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>进入root账户<br><code>$ su root</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>编辑sshd_config文件<br><code>$ vi /etc/ssh/sshd_config</code><br>做如下修改：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1.允许root账户登录<br>PermitRootLogin without-password<br>~修改为~<br>PermitRootLogin yes</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2.允许密码登录<br>PasswordAuthentication no<br>~修改为~<br>PasswordAuthentication yes</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3.关闭证书验证登录(::确认可以使用密码登录后再做此修改，避免发生无法登录服务器的验证后果::)<br>UsePAM yes<br>~修改为~<br>UsePAM no</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>重启sshd服务<br>$ sudo service ssh restart</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:25:09 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu 部署svn]]></title>
                <link>https://www.jefsky.com/blog/240</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/240</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">卸载SVN</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>sudo apt-get remove --purge subversion</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>(–purge 选项表示彻底删除改软件和相关文件)</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">安装SVN</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>ubuntu : apt-get install subversion</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>centos : yum install subversion</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">服务端命令</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>svnserve -控制svn系统服务的启动等</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>svnadmin -版本库的创建、导入、导出、删除等</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>svnlook -查看版本库的信息等</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">客户端命令</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>svn -版本库的检出、更新、提交、重定向等</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">创建版本库</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>svnadmin create /path/repos</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">删除版本库</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>rm -rvf /path/repos</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">版本库配置</h2>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>配置文件位于/path/repos/conf/

    authz -配置用户组以及用户组权限

    passwd -配置用户名和密码

    svnserve.conf -配置默认权限、权限配置文件以及密码配置文件


</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">启动svn</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>svnserve -d -r /path/repos/</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">访问svn</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>checkup =&gt; co</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>svn co svn://192.168.1.11 --username username --password xx</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:25:33 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[简单易懂教你给网站加上pjax，载速瞬间提高]]></title>
                <link>https://www.jefsky.com/blog/242</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/242</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">什么是pjax？不是ajax吗？</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>pjax是jquery的一个插件，它使用ajax和pushState两个技术改善用户的网页浏览体验。简单来说，就是用户点击a标签切换页面的时候，只是局部刷新的技术。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">pjax发生过程是怎样的？</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>首先就是用户通过a标签发送一个ajax请求到服务端，之后服务端收到请求返回需要更新的html前端片段代码，然后客户端接受到数据之后就插入到需要更新的地方，待页面完善后，pushstate就会更新当前页面的url。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">pjax好处：</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>按需加载--&gt;只会加载当前请求所需要的html片段，无需再次解析css和js，再次渲染；</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">怎么操作？</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">引入相关js文件:</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>可放在头部或者尾部，需要注意的是js引入顺序，因为pjax是jquery的插件，所以必须先有jquery再有pjax。还有就是pjax 1.9.6版本应配合jq2.<em>.</em>版本使用，否则无法正常工作。如果要使用jq3.<em>.</em>版本，应使用pjax2.0.1以上版本。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">加上pjax代码：</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>解释一下哈~</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>selector 用于绑定pjax事件，一般的为："a", 如果要去掉一些外连的URL， 这里的selector可以为: "a[href^='<a href="https://www.jefsky.com/">https://www.jefsky.com</a>']"</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>[container] 就是内容变换容器，就是需要更新html的区域，如： '#pjax-content'。那么页面就只刷新的这个部分。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>options 官方文档提供了更多的选项，以便更好地自定义选项。具体查考官方文档<a href="https://github.com/defunkt/jquery-pjax" target="_BLANK" rel="noreferrer noopener">https://github.com/defunkt/jquery-pjax</a>。下面是一些比较常用的：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>container 替换的容器的css选择器。填你的替换容器ID即可。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>timeout 超时就会被迫页面就会完全刷新，单位毫秒。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>fragment 这个作为整个pjax框架，必须写上。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">以本站为例，代码如下：</h3>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;script&gt;

// pjax

$(document).pjax('a&#91;href^="&lt;?php Helper::options()-&gt;siteUrl()?&gt;"]:not(a&#91;target="_blank"], a&#91;no-pjax])', {

    container: '#kratos-blog-post',

    fragment: '#kratos-blog-post',

    timeout: 8000

})

&lt;/script&gt;

</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>当然你也可以加些等候动画等等：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;div style="display:none; z-index:9999; background-color: #ccc; position:fixed; top:0px; width:100%; height:100vh;" class="pjax_loading"&gt;

&lt;script&gt;

$(document).on('pjax:send', function() { //pjax链接点击后显示加载动画；
   //$(".pjax_loading").css("display", "block");});
$(document).on('pjax:complete', function() { //pjax链接加载完成后隐藏加载动画；
   //$(".pjax_loading").css("display", "none");

&lt;/script&gt;
</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 11:37:06 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[设置ubuntu ssh超时时间]]></title>
                <link>https://www.jefsky.com/blog/244</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/244</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>/etc/ssh/sshd_config</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ClientAliveInterval 540</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ClientAliveCountMax 10</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ClientAliveCountMax 指如果发现客户端没有相应，则判断一次超时，这个参数设置允许超时的次数。比如10</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ClientAliveInterval 代表允许超时 5400秒 = 90分钟</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 04:35:49 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[phpmyadmin中的错误警告在./libraries/plugin_interface.lib.php#551中]]></title>
                <link>https://www.jefsky.com/blog/246</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/246</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>./libraries/display_export.lib.php#381: PMA_pluginGetOptions(string 'Export',array,)./libraries/display_export.lib.php#883: PMA_getHtmlForExportOptionsFormat(array)./libraries/display_export.lib.php#1099: PMA_getHtmlForExportOptions(string 'table',string 'bpapluswpdb',string 'wp_commentmeta',string '',integer 0,array,integer 0,)./tbl_export.php#143: PMA_getExportDisplay(string 'table',string 'bpapluswpdb',string 'wp_commentmeta',string '',integer 0,integer 0,string '',)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>...</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>应该是你旧版本的phpMyAdmin可能不适合较新的PHP版本出现了此问题。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>解决问题：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1）从<a href="https://www.phpmyadmin.net/%E4%B8%8B%E8%BD%BD%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E7%9A%84phpMyAdmin" target="_BLANK" rel="noreferrer noopener">https://www.phpmyadmin.net/下载最新版本的phpMyAdmin</a>&nbsp;。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2）解压缩下载的文件夹。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3）将所有内容复制到/ usr / share / phpmyadmin。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>确保所有匹配的文件和文件夹都被新的（您下载的文件和文件夹）替换。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>4）重启apache：sudo systemctl restart apache2</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>就好了！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>亲测过</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:23:25 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Ubuntu 常用解压与压缩命令]]></title>
                <link>https://www.jefsky.com/blog/248</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/248</guid>
                <content><![CDATA[<!-- wp:heading -->
<h2 class="wp-block-heading">.tar</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>tar -xvf FileName.tar # 解包</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>tar -cvf FileName.tar DirName # 将DirName和其下所有文件（夹）打包</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">.gz</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>gunzip FileName.gz # 解压1</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>gzip -d FileName.gz # 解压2</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>gzip FileName # 压缩，只能压缩文件</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">.tar.gz .tgz文件</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>tar -zxvf FileName.tar.gz # 解压</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>tar -zcvf FileName.tar.gz DirName # 将DirName和其下所有文件（夹）压缩</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>tar -C DesDirName -zxvf FileName.tar.gz # 解压到目标路径</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">.zip</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>unzip FileName.zip # 解压</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>zip FileName.zip DirName # 将DirName本身压缩</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>zip -r FileName.zip DirName # 压缩，递归处理，将指定目录下的所有文件和子目录一并压缩</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">.rar（mac和linux并没有自带rar，需要去下载）</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>rar x FileName.rar # 解压</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>rar a FileName.rar DirName # 压缩</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 16:52:18 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[在地址栏玩贪吃蛇，作者很有想法鸭]]></title>
                <link>https://www.jefsky.com/blog/250</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/250</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>GitHub: github.com<br>其实使用的是黑色盲文字符集 U+2800 : www.fileformat.info</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>创意十足</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:43:34 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[如何升级typecho比较好]]></title>
                <link>https://www.jefsky.com/blog/252</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/252</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、通过正规途径下载最新的typecho版本</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、替换新版文件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我们只需要替换 admin目录和var目录还有就是index.php文件就可以啦。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3、登录后台，系统会自己检测到升级升级，点击“完成升级”就好了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>然后，你可以先备份一下，毕竟数据无价，你懂的！</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 19:58:31 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[永远不要在MySQL中使用“utf8”，请使用“utf8mb4”]]></title>
                <link>https://www.jefsky.com/blog/254</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/254</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>最近我遇到了一个bug，我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串，然后出现了一个离奇的错误：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Incorrect string value: ‘xF0x9Fx98x83 &lt;…’ for column ‘summary’ at row 1</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我用的是UTF-8编码的客户端，服务器也是UTF-8编码的，数据库也是，就连要保存的这个字符串“ &lt;…”也是合法的UTF-8。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>问题的症结在于，MySQL的“utf8”实际上不是真正的UTF-8。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>“utf8”只支持每个字符最多三个字节，而真正的UTF-8是每个字符最多四个字节。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>MySQL一直没有修复这个bug，他们在2010年发布了一个叫作“utf8mb4”的字符集，绕过了这个问题。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>当然，他们并没有对新的字符集广而告之（可能是因为这个bug让他们觉得很尴尬），以致于现在网络上仍然在建议开发者使用“utf8”，但这些建议都是错误的。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">简单概括如下：</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1.MySQL的“utf8mb4”是真正的“UTF-8”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2.MySQL的“utf8”是一种“专属的编码”，它能够编码的Unicode字符并不多。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我要在这里澄清一下：所有在使用“utf8”的MySQL和MariaDB用户都应该改用“utf8mb4”，永远都不要再使用“utf8”。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">那么什么是编码？什么是UTF-8？</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>我们都知道，计算机使用0和1来存储文本。比如字符“C”被存成“01000011”，那么计算机在显示这个字符时需要经过两个步骤：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1、计算机读取“01000011”，得到数字67，因为67被编码成“01000011”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、计算机在Unicode字符集中查找67，找到了“C”。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">同样的：</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1、我的电脑将“C”映射成Unicode字符集中的67。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、我的电脑将67编码成“01000011”，并发送给Web服务器。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>几乎所有的网络应用都使用了Unicode字符集，因为没有理由使用其他字符集。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Unicode字符集包含了上百万个字符。最简单的编码是UTF-32，每个字符使用32位。这样做最简单，因为一直以来，计算机将32位视为数字，而计算机最在行的就是处理数字。但问题是，这样太浪费空间了。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>UTF-8可以节省空间，在UTF-8中，字符“C”只需要8位，一些不常用的字符，比如“”需要32位。其他的字符可能使用16位或24位。一篇类似本文这样的文章，如果使用UTF-8编码，占用的空间只有UTF-32的四分之一左右。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>MySQL的“utf8”字符集与其他程序不兼容，它所谓的“”，可能真的是一坨……</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">MySQL简史</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>为什么MySQL开发者会让“utf8”失效？我们或许可以从提交日志中寻找答案。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>MySQL从4.1版本开始支持UTF-8，也就是2003年，而今天使用的UTF-8标准（RFC 3629）是随后才出现的。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>旧版的UTF-8标准（RFC 2279）最多支持每个字符6个字节。2002年3月28日，MySQL开发者在第一个MySQL 4.1预览版中使用了RFC 2279。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>同年9月，他们对MySQL源代码进行了一次调整：“UTF8现在最多只支持3个字节的序列”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>是谁提交了这些代码？他为什么要这样做？这个问题不得而知。在迁移到Git后（MySQL最开始使用的是BitKeeper），MySQL代码库中的很多提交者的名字都丢失了。2003年9月的邮件列表中也找不到可以解释这一变更的线索。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>不过我可以试着猜测一下。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2002年，MySQL做出了一个决定：如果用户可以保证数据表的每一行都使用相同的字节数，那么MySQL就可以在性能方面来一个大提升。为此，用户需要将文本列定义为“CHAR”，每个“CHAR”列总是拥有相同数量的字符。如果插入的字符少于定义的数量，MySQL就会在后面填充空格，如果插入的字符超过了定义的数量，后面超出部分会被截断。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>MySQL开发者在最开始尝试UTF-8时使用了每个字符6个字节，CHAR(1)使用6个字节，CHAR(2)使用12个字节，并以此类推。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>应该说，他们最初的行为才是正确的，可惜这一版本一直没有发布。但是文档上却这么写了，而且广为流传，所有了解UTF-8的人都认同文档里写的东西。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>不过很显然，MySQL开发者或厂商担心会有用户做这两件事：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1、使用CHAR定义列（在现在看来，CHAR已经是老古董了，但在那时，在MySQL中使用CHAR会更快，不过从2005年以后就不是这样子了）。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、将CHAR列的编码设置为“utf8”。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>我的猜测是MySQL开发者本来想帮助那些希望在空间和速度上双赢的用户，但他们搞砸了“utf8”编码。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>所以结果就是没有赢家。那些希望在空间和速度上双赢的用户，当他们在使用“utf8”的CHAR列时，实际上使用的空间比预期的更大，速度也比预期的慢。而想要正确性的用户，当他们使用“utf8”编码时，却无法保存像“”这样的字符。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在这个不合法的字符集发布了之后，MySQL就无法修复它，因为这样需要要求所有用户重新构建他们的数据库。最终，MySQL在2010年重新发布了“utf8mb4”来支持真正的UTF-8。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>为什么这件事情会让人如此抓狂</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>因为这个问题，我整整抓狂了一个礼拜。我被“utf8”愚弄了，花了很多时间才找到这个bug。但我一定不是唯一的一个，网络上几乎所有的文章都把“utf8”当成是真正的UTF-8。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>“utf8”只能算是个专有的字符集，它给我们带来了新问题，却一直没有得到解决。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">总结</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>如果你在使用MySQL或MariaDB，不要用“utf8”编码，改用“utf8mb4”。这里（&nbsp;<a href="https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4" target="_BLANK" rel="noreferrer noopener">https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4</a>&nbsp;）提供了一个指南用于将现有数据库的字符编码从“utf8”转成“utf8mb4”。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 17:52:08 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[console花式log]]></title>
                <link>https://www.jefsky.com/blog/256</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/256</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>console.log利用占位符格式化打印<br>%c表示css样式</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>    console.log('%c hello jefsky', 'color: yellow;font-size: 24px;font-weight: bold;text-decoration: underline;');
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>%d 或 %i表示整型</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>    console.log('%d', 123);

    console.log('%i', 123);
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>%f表示浮点型</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>     console.log('%f', 123.321);
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>%o表示DOM元素</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>    console.log('%o', document.body);
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>%O表示javascript对象</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>    console.log('%O', new Date());
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="wp-block-heading">console对象的其他属性</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>assert: ƒ assert()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>clear: ƒ clear()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>context: ƒ context()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>count: ƒ count()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>countReset: ƒ countReset()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>debug: ƒ debug()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>dir: ƒ dir()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>dirxml: ƒ dirxml()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>error: ƒ error()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>group: ƒ group()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>groupCollapsed: ƒ groupCollapsed()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>groupEnd: ƒ groupEnd()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>info: ƒ info()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>log: ƒ log()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>memory: (...)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>profile: ƒ profile()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>profileEnd: ƒ profileEnd()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>table: ƒ table()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>time: ƒ time()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>timeEnd: ƒ timeEnd()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>timeLog: ƒ timeLog()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>timeStamp: ƒ timeStamp()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>trace: ƒ trace()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>warn: ƒ warn()</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>有兴趣的可以在你的浏览器console中尝试一下</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:28:39 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[http怎么做自动跳转https]]></title>
                <link>https://www.jefsky.com/blog/258</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/258</guid>
                <content><![CDATA[<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">Apache 版本</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>整站跳转，则在网站的配置文件的标签内：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>RewriteEngine on

RewriteCond %{SERVER_PORT} !^443$

RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 &#91;L,R=301]
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>对某个目录做https强制跳转：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>   RewriteEngine on
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>对某个网页进行https跳转，可以使用redirect 301来做跳转！redirect 301 /你的网页&nbsp;<a href="https://xn--+-dr6ao0b411ed5ql8lh16b/" target="_BLANK" rel="noreferrer noopener">https://你的主机+网页</a></p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">Nginx版本</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>配置80端口的文件里面，写入以下内容</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>           server {

    listen       80;

    server_name  localhost;

    rewrite ^(.*)$ https://$host$1 permanent;    

    }


</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">IIS 版本</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>IIs中实现Http自动转换到Https方法介绍 (403跳转对SEO有一定影响)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1、根据IIS版本备份以下文件：<br>IIS6.0 路径：C:WINDOWSHelpiisHelpcommon403-4.htm</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>IIS7.0以上 路径：C:inetpubcusterrzh-CN403.htm</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、把以下内容全部拷贝替换（403-4或403）里面所有内容，保存即可</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;script type="text/javascript"&gt;

var url = window.location.href;

                if (url.indexOf("https") &lt; 0) {

                    url = url.replace("http:", "https:");

                    window.location.replace(url);

                }

&lt;/script&gt;

</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>注释：IIS6中，站点属性-》目录安全性-》编辑中把“要求安全通道（SSL）”勾选上即可。<br>IIS7、8中，SSL设置-》把“要求SSL”勾选即可。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">TOMCAT 版本</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>1、在conf目录下的server.xml文件中找到以下配置，修改redirectPort参数值为"443"，默认是“8443”.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、在conf目录下的web.xml文件内容……中增加以下配置。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;web-app&gt;

.........

&lt;security-constraint&gt;

    &lt;web-resource-collection &gt;        

   &lt;web-resource-name &gt;SSL&lt;/web-resource-name&gt;     

   &lt;url-pattern&gt;/*&lt;/url-pattern&gt;

       &lt;/web-resource-collection&gt;    

       &lt;user-data-constraint&gt;

&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;

       &lt;/user-data-constraint&gt;

&lt;/security-constraint&gt;

&lt;/web-app&gt;

</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">单独页面通用代码段</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>在需要强制为https的页面上加入以下代码进行处理http--&gt;https</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;script type="text/javascript"&gt;

        var url = window.location.href;

        if (url.indexOf("https") &lt; 0) {

        url = url.replace("http:", "https:");

        window.location.replace(url);

        }

&lt;/script&gt;
</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1 class="wp-block-heading">PHP页面跳转</h1>
<!-- /wp:heading -->

<!-- wp:code -->
<pre class="wp-block-code"><code>if ($_SERVER&#91;"HTTPS"] &lt;&gt; "on") 

{ 

$xredir="https://".$_SERVER&#91;"SERVER_NAME"].$_SERVER&#91;"REQUEST_URI"]; 

header("Location: ".$xredir); 

}

</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:39:53 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[count(): Parameter must be an array or an object that implements Countable]]></title>
                <link>https://www.jefsky.com/blog/260</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/260</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>处理mysql问题：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Warning in ./libraries/sql.lib.php#613 count(): Parameter must be an array or an object that implements Countable</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo vim /usr/share/phpmyadmin/libraries/sql.lib.php</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>将(count($analyzed_sql_results['select_expr'] == 1) 改为</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>(count($analyzed_sql_results['select_expr']) == 1</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 16:42:06 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[增加hosts记录]]></title>
                <link>https://www.jefsky.com/blog/262</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/262</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>@echo off

set /p url=请输入域名地址：

set /p ip=请输入IP地址：

set hosts=%systemroot%\System32\drivers\etc\hosts

attrib -h -s -r "%hosts%"

(echo %ip%    %url%)&gt;&gt;"%hosts%"

attrib +h +r +s "%hosts%"

ipconfig /flushdns

pause</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:28:40 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[终于解决typecho自带编辑器的不方便了]]></title>
                <link>https://www.jefsky.com/blog/264</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/264</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>关于typecho自带的markdown解析引擎可以使用parsedown插件替换： kokororin / typecho-plugin-parsedown</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>启用该插件后，无需任何设置，自动替换前台文章解析，支持解析表格和html代码。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>关于编辑器，这里推荐ue ueditor for typecho 2018</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">安装方式1：在线安装</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>使用ueditor.install.php在服务器上下载和安装</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>访问<a href="https://github.com/chanshengzhi/ueditor-for-typecho/releases" target="_BLANK" rel="noreferrer noopener">https://github.com/chanshengzhi/ueditor-for-typecho/releases</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>下载最新版本的安装脚本(ueditor.install.php)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>上传到ueditor.install.php到/usr/plugins文件夹下</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>访问yourdomain.com/usr/plugins/ueditor.install.php进行安装</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>安装成功后进入typecho插件管理界面启用即可.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">安装方式2：下载安装</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>访问<a href="https://github.com/chanshengzhi/ueditor-for-typecho/releases,%E4%B8%8B%E8%BD%BD%E6%89%80%E9%9C%80%E7%89%88%E6%9C%AC%E7%9A%84%E5%8E%8B%E7%BC%A9%E5%8C%85,%E8%A7%A3%E5%8E%8B%E5%90%8E%E4%B8%8A%E4%BC%A0%E5%85%B6%E4%B8%AD%E7%9A%84ueditor%E6%96%87%E4%BB%B6%E5%A4%B9%E5%88%B0/usr/plugins%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B," target="_BLANK" rel="noreferrer noopener">https://github.com/chanshengzhi/ueditor-for-typecho/releases,下载所需版本的压缩包,解压后上传其中的ueditor文件夹到/usr/plugins文件夹下,</a>&nbsp;进入typecho插件管理界面启用即可</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>typecho parsedown 解析markdown插件<br>使用parsedown替换typecho自带的markdown解析库。启用前请将目录名重命名为parsedown。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:28:40 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Ubuntu系统Apache 2部署SSL证书]]></title>
                <link>https://www.jefsky.com/blog/266</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/266</guid>
                <content><![CDATA[<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">环境准备</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>操作系统：Ubuntu</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Web服务器：Apache 2</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">前提条件</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>已从SSL证书控制台下载Apache服务器证书。<br>已安装Open SSL。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="wp-block-heading">操作步骤</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>运行以下命令在apache2目录下创建ssl目录：<br><code>mkdir /etc/apache2/ssl</code><br>运行以下命令将下载的阿里云证书文件复制到ssl目录中：<br><code>cp -r YourDomainName_public.crt /etc/apache2/ssl</code><br><code>cp -r YourDomainName_chain.crt /etc/apache2/ssl</code><br><code>cp -r YourDomainName.key /etc/apache2/ssl</code><br>运行以下命令启用SSL模块：<br><code>sudo a2enmod ssl</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SSL模块启用后可执行：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>ls /etc/apache2/sites-available</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>查看目录下生成的default-ssl.conf文件。</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>说明</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>443端口是网络浏览端口，主要用于HTTPS服务。SSL模块启用后会自动放行443端口。若443端口未自动放行，可执行：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>vi /etc/apache2/ports.conf</code>&nbsp;并添加 Listen 443手动放行。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>运行以下命令修改SSL配置文件default-ssl.conf：<br><code>vi /etc/apache2/sites-available/default-ssl.conf</code><br>在 default-ssl.conf文件中找到以下参数进行修改后保存并退出。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>ServerName#修改为证书绑定的域名 www.YourDomainName.com

SSLCertificateFile /etc/apache2/www.YourDomainName_public.crt 

#将 /etc/apache2/www.YourDomainName.com_public.crt 替换为证书文件路径+证书文件名。 

SSLCertificateKeyFile /etc/apache2/www.YourDomainName.com.key 

#将 /etc/apache2/www.YourDomainName.com.key  替换为证书秘钥文件路径+证书秘钥文件名。 

SSLCertificateChainFile /etc/apache2/www.YourDomainName.com_chain.crt 

#将 /etc/apache2/www.YourDomainName.com_chain.crt  替换为证书链文件路径+证书链文件名。 

/sites-available：该目录存放的是可用的虚拟主机；

/sites-enabled：该目录存放的是已经启用的虚拟主机。 
</code></pre>
<!-- /wp:code -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>说明</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>default-ssl.conf文件可能存放在 /etc/apache2/sites-available 或<br>/etc/apache2/sites-enabled 目录中。</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>运行以下命令：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/001-ssl.conf</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>把 default-ssl.conf 映射至 /etc/apache2/sites-enabled 文件夹中建立软链接、实现二者之间的自动关联</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>运行以下命令：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>sudo /etc/init.d/apache2 force-reload</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>重新加载Apache 2配置文件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>运行以下命令：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>sudo /etc/init.d/apache2 restart</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>重启Apache 2服务</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>后续操作 Apache 2服务重启成功后，您可在浏览器中输入&nbsp;<a href="https://www.yourdomainname.com/" target="_BLANK" rel="noreferrer noopener">https://www.YourDomainName.com</a>&nbsp;验证证书安装结果。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>浏览器地址栏显示绿色的小锁标识说明证书安装成功。件名。&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SSLCertificateKeyFile /etc/apache2/www.YourDomainName.com.key&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>#将 /etc/apache2/www.YourDomainName.com.key&nbsp;&nbsp;替换为证书秘钥文件路径+证书秘钥文件名。&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>SSLCertificateChainFile /etc/apache2/www.YourDomainName.com_chain.crt&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>#将 /etc/apache2/www.YourDomainName.com_chain.crt&nbsp;&nbsp;替换为证书链文件路径+证书链文件名。&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>/sites-available：该目录存放的是可用的虚拟主机；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>/sites-enabled：该目录存放的是已经启用的虚拟主机。&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p>说明&nbsp;</p>
<!-- /wp:paragraph --></blockquote>
<!-- /wp:quote -->

<!-- wp:paragraph -->
<p>default-ssl.conf文件可能存放在 /etc/apache2/sites-available 或 /etc/apache2/sites-enabled 目录中。&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>&lt;br/&gt;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>运行以下命令：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/001-ssl.conf&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>把 default-ssl.conf 映射至 /etc/apache2/sites-enabled 文件夹中建立软链接、实现二者之间的自动关联</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>运行以下命令：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo /etc/init.d/apache2 force-reload&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>重新加载Apache 2配置文件</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>运行以下命令：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo /etc/init.d/apache2 restart&nbsp;</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>重启Apache 2服务</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>后续操作 Apache 2服务重启成功后，您可在浏览器中输入&nbsp;<a href="https://www.yourdomainname.com%20/" target="_BLANK" rel="noreferrer noopener">https://www.YourDomainName.com&nbsp;</a>; 验证证书安装结果。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>浏览器地址栏显示绿色的小锁标识说明证书安装成功。</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:21:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[dede标题无法完整显示]]></title>
                <link>https://www.jefsky.com/blog/268</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/268</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、登陆系统后台，【系统-其它选项】，修改【文档标题最大长度 改此参数后需要手工修改数据表】</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、登陆mysql【www.4499a.com】，找到相关表，相关字段，修改字段属性，如长度</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3、重新保存文章标题</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>4、dede标签添加属性【titlelen】</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 13:48:11 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[网页页面密码]]></title>
                <link>https://www.jefsky.com/blog/270</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/270</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>javascript:(function()%7Bvar%20IN,F;IN=document.getElementsByTagName('input');for(var%20i=0;i&lt;IN.length;i++)%7BF=IN%5Bi%5D;if(F.type.toLowerCase()=='password')%7Btry%7BF.type='text'%7Dcatch(r)%7Bvar%20n,Fa;n=document.createElement('input');Fa=F.attributes;for(var%20ii=0;ii&lt;Fa.length;ii++)%7Bvar%20k,knn,knv;k=Fa%5Bii%5D;knn=k.nodeName;knv=k.nodeValue;if(knn.toLowerCase()!='type')%7Bif(knn!='height'&amp;&amp;knn!='width'&amp;!!knv)n%5Bknn%5D=knv%7D%7D;F.parentNode.replaceChild(n,F)%7D%7D%7D%7D)()</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 21:48:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[禁用MAC SIP系统完整性保护机制]]></title>
                <link>https://www.jefsky.com/blog/272</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/272</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、重新启动操作系统；<br>2、按住Command + R键,知道出现苹果logo；<br>3、菜单“实用工具” ==&gt;&gt; "终端" ==&gt;&gt; 输入 csrutil disable 回车<br>&nbsp; &nbsp; 执行成功后，返回信息如下：<br>Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.<br>4、这样，更改的配置保存到NVRAM中，对整台机器生效，重新启动即可</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>如何查看SIP系统完整性保护机制？<br>命令行终端<br>$ csrutil status<br>System Integrity Protection status: enabled.</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 17:36:47 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[VMware15 安装 mac OS 10.14 无法全屏]]></title>
                <link>https://www.jefsky.com/blog/274</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/274</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在系统中执行终端</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1920*1080分辨率：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo nvram AC20C489-DD86-4E99-992C-B7C742C1DDA9:width=%80%07%00%00</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo nvram AC20C489-DD86-4E99-992C-B7C742C1DDA9:height=%38%04%00%00</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3840*2160分辨率：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo nvram AC20C489-DD86-4E99-992C-B7C742C1DDA9:width=%00%0F%00%00</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo nvram AC20C489-DD86-4E99-992C-B7C742C1DDA9:height=%70%08%00%00</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>解释一下：</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>width=%00%0F%00%00 是宽度的16进制表示，将四个数字倒过来写就是 00 00 0f 00, 相当于十进制的3840</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>height=%70%08%00%00 是高度的16进制表示，将四个数字倒过来写就是 00 00 08 70, 相当于十进制的2160</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>还需要修改一下虚拟机的显示配置，把监视器的分辨率修改为你要的分辨率</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>再然后下载VMware15对应的vmtools安装，重启机器然后在看是否生效。<br>也可以修改对应的vmx文件里面的这部分内容要修改一下，设置一下最大分辨率svga.autodetect = "FALSE"svga.maxWidth = "3840"svga.maxHeight = "2160"</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>然后下载安装对应的vm tool<br><a href="http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/11.0.0/10120384/packages/com.vmware.fusion.tools.darwin.zip.tar" target="_BLANK" rel="noreferrer noopener">http://softwareupdate.vmware.com/cds/vmw-desktop/fusion/11.0.0/10120384/packages/com.vmware.fusion.tools.darwin.zip.tar</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>重启就好了<br>（亲测）</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 16:41:41 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[windows配置php环境（php+pear+PHPcs）]]></title>
                <link>https://www.jefsky.com/blog/276</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/276</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>1、windows安装php<br><a href="http://windows.php.net/download" target="_BLANK" rel="noreferrer noopener">http://windows.php.net/download</a><br>下载好之后解压到特定目录，如D:\php\</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>2、设置php环境变量<br>Win+R，输入sysdm.cpl<br>系统变量path中添加D:\php</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3、测试php是否可执行<br>cmd php -h</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>4、配置php.ini文件（结合自己实际情况选择）<br>php.ini-development 开发测试用<br>php.ini-production 安全性高，适合线上<br>我用了php.ini-production重命名为php.ini</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>5、安装pear库<br>下载go-pear.phar&nbsp;<a href="http://pear.php.net/go-pear.phar" target="_BLANK" rel="noreferrer noopener">http://pear.php.net/go-pear.phar</a>&nbsp;到php根目录下（D:\php）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>据说有人攻破了 PEAR 网站并篡改了 go-pear.phar 安装包<a href="http://app.myzaker.com/news/article.php?pk=5c510e9377ac6408ce2d5842" target="_BLANK" rel="noreferrer noopener">http://app.myzaker.com/news/article.php?pk=5c510e9377ac6408ce2d5842</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>所以推荐大家到github上下载吧</p>
<!-- /wp:paragraph -->

<!-- wp:embed {"url":"https://github.com/pear/pearweb_phars"} -->
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/pear/pearweb_phars
</div></figure>
<!-- /wp:embed -->

<!-- wp:paragraph -->
<p>而且速度也会快些</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>执行php go-pear.phar<br>Are you installing a system-wide PEAR or a local copy?<br>(system|local) [system] :local</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>6、检查php.ini是否配置好<br>结尾处 include_path=".;D:\php\pear"</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>7、检查pear是否安装成功<br>cmd pear</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>8、安装phpcs<br>a&gt; pear方式</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>pear install PHP_CodeSniffer （如果你用pear安装失败，可以前往<a href="https://www.jefsky.com/index.php/archives/40.html">手动安装PHP_CodeSniffer</a>进行手动安装）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>b&gt; composer方式<br>composer require --dev squizlabs/php_codesniffer</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 17:58:40 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决ubbthreads 一直自动跳转https]]></title>
                <link>https://www.jefsky.com/blog/278</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/278</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>/var/www/ubb/includes/config.inc.php</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>把https修改为http就可以了</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 18:43:08 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho访客阅读数统计]]></title>
                <link>https://www.jefsky.com/blog/280</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/280</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>在当前主题function.php中加上
/*
 * 无插件阅读数
*/
function get_post_view($archive)
{
$cid = $archive-&gt;cid;
$db = Typecho_Db::get();
$prefix = $db-&gt;getPrefix();
if (!array_key_exists('views', $db-&gt;fetchRow($db-&gt;select()-&gt;from('table.contents')))) {
    $db-&gt;query('ALTER TABLE `' . $prefix . 'contents` ADD `views` INT(10) DEFAULT 0;');
    echo 0;
    return;
}
$row = $db-&gt;fetchRow($db-&gt;select('views')-&gt;from('table.contents')-&gt;where('cid = ?', $cid));
if ($archive-&gt;is('single')) {
    $db-&gt;query($db-&gt;update('table.contents')-&gt;rows(array('views' =&gt; (int) $row&#91;'views'] + 1))-&gt;where('cid = ?', $cid));
}
echo $row&#91;'views'];
   }
前台调用
&lt;?php get_post_view($this) ?&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 11:09:28 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho调用随机文章]]></title>
                <link>https://www.jefsky.com/blog/282</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/282</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;?php $this-&gt;related(5)-&gt;to($relatedPosts); ?&gt;

    &lt;ul&gt;

&lt;?php while ($relatedPosts-&gt;next()): ?&gt;

    &lt;li&gt;&lt;a href="&lt;?php $relatedPosts-&gt;permalink(); ?&gt;" title="&lt;?php $relatedPosts-&gt;title(); ?&gt;"&gt;&lt;?php $relatedPosts-&gt;title(); ?&gt;&lt;/a&gt;&lt;/li&gt;

&lt;?php endwhile; ?&gt;

    &lt;/ul&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:24:54 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho前台调用判断if标签]]></title>
                <link>https://www.jefsky.com/blog/284</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/284</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>&lt;?php if($this->is('index')): ?><br>//首页内容<br>&lt;?php else: ?><br>//不是首页内容<br>&lt;?php endif; ?></p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:24:41 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho面包屑导航调用]]></title>
                <link>https://www.jefsky.com/blog/286</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/286</guid>
                <content><![CDATA[<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;div class="crumbs_patch"&gt;
&lt;a href="&lt;?php $this-&gt;options-&gt;siteUrl(); ?&gt;"&gt;Home&lt;/a&gt; &amp;raquo;&lt;/li&gt;
&lt;?php if ($this-&gt;is('index')): ?&gt;&lt;!-- 页面为首页时 --&gt;
Latest Post
&lt;?php elseif ($this-&gt;is('post')): ?&gt;&lt;!-- 页面为文章单页时 --&gt;
&lt;?php $this-&gt;category(); ?&gt; &amp;raquo; &lt;?php $this-&gt;title() ?&gt;
&lt;?php else: ?&gt;&lt;!-- 页面为其他页时 --&gt;
&lt;?php $this-&gt;archiveTitle(' &amp;raquo; ','',''); ?&gt;
&lt;?php endif; ?&gt;
&lt;/div&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:24:21 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho调用最新文章]]></title>
                <link>https://www.jefsky.com/blog/288</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/288</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在需要调用的地方添加</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;?php
$this-&gt;widget('Widget_Contents_Post_Recent','pageSize=10')-&gt;to($recent);
if($recent-&gt;have()):
while($recent-&gt;next()):
?&gt;

&lt;li&gt;&lt;a href="&lt;?php $recent-&gt;permalink();?&gt;"&gt;&lt;?php $recent-&gt;title();?&gt;&lt;/a&gt;&lt;/li&gt;

&lt;?php endwhile; endif;?&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 09:01:10 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho调用热门评论文章]]></title>
                <link>https://www.jefsky.com/blog/290</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/290</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>在当前主题function.php中添加</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>function getHotComments($limit = 10){
$db = Typecho_Db::get();
$result = $db-&gt;fetchAll($db-&gt;select()-&gt;from('table.contents')
    -&gt;where('status = ?','publish')
    -&gt;where('type = ?', 'post')
    -&gt;where('created &lt;= unix_timestamp(now())', 'post')
    -&gt;limit($limit)
    -&gt;order('commentsNum', Typecho_Db::SORT_DESC)
);
if($result){
    foreach($result as $val){
        $val = Typecho_Widget::widget('Widget_Abstract_Contents')-&gt;push($val);
        $post_title = htmlspecialchars($val&#91;'title']);
        $permalink = $val&#91;'permalink'];
        echo '`&lt;li&gt;&lt;a href="'.$permalink.'" title="'.$post_title.'" target="_blank"&gt;'.$post_title.'&lt;/a&gt;&lt;/li&gt;`';
    }
}
}
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>前台调用</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;?php getHotComments('10');?&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Tue, 16 Jan 2024 02:19:29 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho调用特定分类最新文章列表]]></title>
                <link>https://www.jefsky.com/blog/292</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/292</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>调用代码</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;?php
$this-&gt;widget('Widget_Archive@index', 'pageSize=8&amp;type=category', 'mid=2')
-&gt;parse('`&lt;li&gt;&lt;a href="{permalink}"&gt;{title}&lt;/a&gt;&lt;/li&gt;`');
?&gt;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>pageSize 调用的数量<br>mid 分类的ID</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:22:58 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Typecho随机调用文章]]></title>
                <link>https://www.jefsky.com/blog/294</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/294</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>添加到当前主题的function.php</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>function getRandomPosts($limit = 10){
$db = Typecho_Db::get();
$result = $db-&gt;fetchAll($db-&gt;select()-&gt;from('table.contents')
    -&gt;where('status = ?','publish')
    -&gt;where('type = ?', 'post')
    -&gt;where('created &lt;= unix_timestamp(now())', 'post')
    -&gt;limit($limit)
    -&gt;order('RAND()')
);
if($result){
    $i=1;
    foreach($result as $val){
        if($i&lt;=3){
            $var = ' class="red"';
        }else{
            $var = '';
        }
        $val = Typecho_Widget::widget('Widget_Abstract_Contents')-&gt;push($val);
        $post_title = htmlspecialchars($val&#91;'title']);
        $permalink = $val&#91;'permalink'];
        echo '`&lt;li&gt;&lt;i'.$var.'&gt;'.$i.'&lt;/i&gt;&lt;a href="'.$permalink.'" title="'.$post_title.'" target="_blank"&gt;'.$post_title.'&lt;/a&gt;&lt;/li&gt;`';
        $i++;
    }
}
}
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>前台调用</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>&lt;?php getRandomPosts('10');?&gt;</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 12:11:18 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Ubuntu安装phpmyadmin和配置]]></title>
                <link>https://www.jefsky.com/blog/296</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/296</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>----------------------------------------------安装----------------------------------------------------<br>ubuntu安装phpmyadmin有两种方法:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>1、apt-get 安装 然后使用 已有的虚拟主机目录建立软连接</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo  apt-get install  phpmyadmin

sudo  ln-s /usr/share/phpmyadmin/      /var/www/pma
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>2、手动上传</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>在官网<code>https://www.phpmyadmin.net/</code>下载phpmyadmin软件包,使用 filezilla 上传到 /var/www/pma (pma自己创建)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>使用 ip/pma 查看phpmyadmin</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>也还可以给phpmyadmin配置虚拟主机 （补习：<a href="https://www.jefsky.com/archives/13.html">ubuntu apache2 如何配置虚拟主机（域名相关）</a>）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>----------------------------------------------配置----------------------------------------------------</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>配置MySQL的remote access（远程访问）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>默认情况下mysql只能是本机访问（127.0.0.1/localhost）<br>如果你是通过远程来访问的话就需要配置remote access，通过ip或者在客户端上使用navicate访问都属于remote access</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>使用<code>sudo vim /etc/mysql/my.cnf</code><br>修改 bind-address 白名单 用'#'注释掉就好了</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>然后进入phpmyadmin添加一个可以使用公网访问的用户<br>最后别忘了重启msyql</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo service mysql restart
</code></pre>
<!-- /wp:code -->]]></content>
                <pubDate>Mon, 15 Jan 2024 10:22:33 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu 新装mysql之后无法登录]]></title>
                <link>https://www.jefsky.com/blog/298</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/298</guid>
                <content><![CDATA[<!-- wp:paragraph -->
<p>ubuntu（linux）新装mysql之后无法登录<br>错误代码：<code>mysql:error 1045(28000):Access denied for user 'root'@'localhost'</code>（诸如此类的错误）</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这是因为root帐号没有设置密码；</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>这时候，我们可以用root权限来登录：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo mysql -u root -p
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>因为在安装mysql的时候没有设置密码，所以root用户的plugin值会变成auth_socket，而不是默认值mysql_native_password<br>所以登录之后需要修改root密码，之后再去更改mysql数据库中user表root用户的plugin值，然后就是刷新一下mysql的用户权限，操作如下：</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>set password for 'root'@'locathost' = password('yourpassword');
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>//设置密码</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>update mysql.user set plugin = 'mysql_native_password' where user = 'root';
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>//更新plugin值</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>flush privileges;
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>//刷新用户权限</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>注意：如果直接更改plugin值为mysql_native_password，就可以使root免密码登录</p>
<!-- /wp:paragraph -->]]></content>
                <pubDate>Tue, 16 Jan 2024 12:48:21 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[在Apache中配置虚拟主机（绑定域名）]]></title>
                <link>https://www.jefsky.com/blog/300</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/300</guid>
                <content><![CDATA[<p>1、先在hosts里面添加域名指向虚拟机IP地址<br />2、现新建的项目让它放在根目录下/wwwroot里面，再在wwwroot文件里面新建www文件夹和bbs文件夹。<br />3、进入/etc/apache2文件配置目录，在进入目录下的sites-available目录，复制默认配置文件default.conf 为www.conf和bbs.conf, 虚拟机装的系统是Ubuntu 14.04-164bit,默认配置文件为000-default.conf,具体命令如下：</p>

<pre class="wp-block-code">#cd /etc/apache2/sites-available
#sudo cp 000-default.conf www.conf
#sudo cp 000-default.conf bbs.conf</pre>

<p>4、复制完成后，编辑两个新复制出来的文件，添加ServerName www.abc.com, 并修改DocumentRoot /wwwroot/www 一个域名对应一个目录，只需要改着两个地方就行了</p>

<pre class="wp-block-code">#sudo vim www.conf
#sudo vim bbs.conf</pre>

<p>5、上面两个文件修改完后，需要在/etc/apache2/sites-enabled目录下创建软连接，系统才会加载他们</p>

<pre class="wp-block-code">#cd /etc/apache2/sites-enabled
#sudo ln -s ../sites-available/www.conf www.conf
#sudo ln -s ../sites-available/bbs.conf bbs.conf</pre>

<p>6、重启apache2就可以了，还需要修改一个地方，就是/etc/apache2/apache2.conf</p>

<pre class="wp-block-code">#sudo vim /etc/apache2/apache2.conf
&lt;Directory /wwwroot/&gt;
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
&lt;/Directory&gt;</pre>

<p>添加如下代码：</p>

<pre class="wp-block-code">#保存重启apache服务，
#sudo service apache2 restart</pre>

<p>如果安装好程序之后没有网站根目录的写入权限，那就说明系统没有分配权限给根目录</p>

<pre class="wp-block-code">chmod -R 777 /var/www/</pre>]]></content>
                <pubDate>Mon, 15 Jan 2024 10:27:17 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[ubuntu18.04安装了phpmyadmin之后，root账户不能登录]]></title>
                <link>https://www.jefsky.com/blog/302</link>
                <description><![CDATA[]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/302</guid>
                <content><![CDATA[<p>ubuntu18.04安装了phpmyadmin之后，root账户不能登录，但在终端中sudo mysql -u root -p仍然可以用root登录。</p>

<p>显示ERROR 1698: Access denied for user ‘root’@’localhost’</p>

<p>用phpmyadmin账户登录以后，看不到其他数据库，没有权限</p>

<p>解决方法一：</p>

<p>创建一个新用户并授予所需的权限。</p>

<p>MySQL赋予用户权限的命令的格式为：<br />grant 权限 on 数据库对象 to 用户 identified by “密码”</p>

<p>1、连接数据库</p>

<pre class="wp-block-code">sudo mysql -u root -p</pre>

<p>2、创建一个赋予权限的账户（例如 root_sql）</p>

<pre class="wp-block-code">CREATE USER 'root_sql'@'localhost' IDENTIFIED BY 'yourpasswd';
GRANT ALL PRIVILEGES ON *.* TO 'root_sql'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;</pre>

<p>3、更新phpMyAdmin配置</p>

<p>打开文件/etc/dbconfig-common/phpmyadmin.conf，修改你的配置文件内容</p>

<pre class="wp-block-code"># dbc_dbuser: database user
#       the name of the user who we will use to connect to the database.
dbc_dbuser='root_sql'
 
# dbc_dbpass: database user password
#       the password to use with the above username when connecting
#       to a database, if one is required
dbc_dbpass='yourpasswd'</pre>

<p>解决方法二：</p>

<p>给phpmyadmin账户赋予所有权限，那么你只要执行</p>

<pre class="wp-block-code">GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY 'yourpasswd';
FLUSH PRIVILEGES;</pre>]]></content>
                <pubDate>Tue, 16 Jan 2024 12:03:56 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Laravel 创建一个模块简要流程]]></title>
                <link>https://www.jefsky.com/blog/313</link>
                <description><![CDATA[## 创建数据迁移文件 `php artisan make:migration create_links_table`  ## 修改迁移文件 `{timestamp}_create_links_table.php` - 迁移时调用 `up()` - 回滚时调用 `down()`  ### 创建数据表     Schema::create('...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/313</guid>
                <content><![CDATA[## 创建数据迁移文件
`php artisan make:migration create_links_table`

## 修改迁移文件
`{timestamp}_create_links_table.php`
- 迁移时调用 `up()`
- 回滚时调用 `down()`

### 创建数据表
    Schema::create('links', function (Blueprint $table) {
          $table->id();
          $table->string('title'),
          $table->timestamps();
    });

##### 注意
- migrate 命令只执行未未迁移的文件，执行完成后将生成 2 个表：
    - migrations —— 迁移版本
    - columns —— 数据

## 执行迁移
`php artisan migrate`
## 创建模型
`php artisan make:model Link`
## 创建模型工厂文件
`php artisan make:factory LinkFactory`
### 修改工厂文件
    public function definition()
    {
        return [
            'name' => $this->faker->name()
        ];
    }
- Faker 是一个假数据生成库，name() 是 faker 提供的 API ，随机生成人名。我们用来填充 name 专栏名称字段。

## 创建填充文件
`php artisan make:seeder LinksSeeder`
- `run()` 方法会在 `db:seed` 执行

### 修改填充文件
```
    public function run()
    {
        Link::factory()->count(10)->create();
    }
```
- 生成10条数据

## 注册数据填充
`databases/seeders/DatabaseSeeder.php`

    public function run()
    {
        $this->call(ColumnsSeeder::class);
    }
##### 注意
- 需要移除无用的数据填充，以防止重复填充

## 执行数据填充
`php artisan db:seed`]]></content>
                <pubDate>Fri, 19 Jan 2024 05:19:49 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Laravel 视图模块共享数据]]></title>
                <link>https://www.jefsky.com/blog/314</link>
                <description><![CDATA[## 创建一个新的服务提供者类  `php artisan make:provider AbcProvider`  ## 修改服务提供类文件  ``` // 引入view类 use Illuminate\Support\Facades\View; // 修改boot() public function boot() { 	// View::com...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/314</guid>
                <content><![CDATA[## 创建一个新的服务提供者类

`php artisan make:provider AbcProvider`

## 修改服务提供类文件

```
// 引入view类
use Illuminate\Support\Facades\View;
// 修改boot()
public function boot()
{
	// View::composer('*',调用的控制器)
	// * 全局共享
	View::composer('*','App\Http\Controllers\CommonController');
}
```

## 注册服务
### 修改 `config\app.php Autoloaded Service Providers部分`
```
    'providers' => ServiceProvider::defaultProviders()->merge([
        //用来为所有视图共享数据
        App\Providers\ComposerServiceProvider::class,
    ])->toArray(),
```

## 完善 `CommonController`
```
public function compose(View $view){
	//与所有视图共享数据
	$links = Link::orderBy('created_at', 'desc')->get();
	$view->with([
		'links_list' => $links,
	]);
}
```

## 视图调用
`{{$links_list}}`]]></content>
                <pubDate>Fri, 19 Jan 2024 05:40:07 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[谈做事的一些想法]]></title>
                <link>https://www.jefsky.com/blog/315</link>
                <description><![CDATA[> 做了，不代表做好；   做好，不代表做完；   做完，不代表抽离；   抽离，不代表无关；   无关，不代表遗忘；   遗忘，不代表不存在。  一个任务的完成过程中各个阶段的相对性和关联性。它强调了每一步的重要性和...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/315</guid>
                <content><![CDATA[> 做了，不代表做好；  
做好，不代表做完；  
做完，不代表抽离；  
抽离，不代表无关；  
无关，不代表遗忘；  
遗忘，不代表不存在。

一个任务的完成过程中各个阶段的相对性和关联性。它强调了每一步的重要性和保持对任务持续关注的价值。

继续展开这些思考，我们可以进一步理解这些阶段在实际工作和生活中的意义：

做了，不代表做好：这意味着仅仅开始行动并不足以保证成功。我们需要确保工作不仅开始了，而且是以正确的方式进行。

做好，不代表做完：即使我们做得很好，也必须确保任务已经彻底完成。有时，我们可能觉得自己的工作质量很高，但实际上可能还有未完成的部分。

做完，不代表抽离：即使任务已经完成，我们也不应该立即放弃对它的关注。这可能意味着后续的检查、修订，或者从中吸取经验教训。

抽离，不代表无关：当我们从一项任务中抽身时，这并不意味着它对我们不重要了。相反，它可能仍然对我们的目标、计划或未来工作产生影响。

无关，不代表遗忘：即使我们认为某些事情与我们当前的工作或生活无关，也不应该轻易遗忘它们。因为过去的经验和知识可能会在未来的某个时刻变得相关。

遗忘，不代表不存在：忘记并不意味着事情从未发生过。我们的大脑可能会暂时忘记某些信息，但这并不意味着这些信息就从我们的生活中消失了。

这些观点提醒我们，在处理任务和生活中的各种事情时，要保持全面的视角和持续的关注。不要满足于表面的完成，而是要深入挖掘每个阶段的价值和意义，以便更好地成长和进步。]]></content>
                <pubDate>Sat, 24 Feb 2024 05:23:24 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Laravel 面试及回答]]></title>
                <link>https://www.jefsky.com/blog/316/Laravel%20Interview%20Questions%20and%20Answers</link>
                <description><![CDATA[**Q1. 什么是Laravel？**  答：Laravel是一个基于MVC设计模式的免费开源“PHP框架”。  它由Taylor Otwell创建。Laravel提供了富有表现力和优雅的语法，有助于轻松快速地创建出色的Web应用程序。  **Q2. 列出Laravel提...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/316</guid>
                <content><![CDATA[**Q1. 什么是Laravel？**

答：Laravel是一个基于MVC设计模式的免费开源“PHP框架”。

它由Taylor Otwell创建。Laravel提供了富有表现力和优雅的语法，有助于轻松快速地创建出色的Web应用程序。

**Q2. 列出Laravel提供的一些官方包？**

答：

- Cashier
- Envoy
- Passport
- Scout
- Socialite

**Q3. 列出Laravel的最新功能。**

答：

- 内置的CSRF（跨站请求伪造）保护。
- 内置的分页
- 反向路由
- 查询构建器
- 路由缓存
- 数据库迁移
- IoC（控制反转）容器或服务容器。

**Q4. 列出Laravel相对于其他Php框架的一些优势。**

答：

- 与其他框架相比，设置和定制过程既简单又快速。
- 内置的身份验证系统。
- 支持多个文件系统
- 预加载的包，如Laravel Socialite、Laravel cashier、Laravel elixir、Passport、Laravel Scout。
- Eloquent ORM（对象关系映射）与PHP活动记录实现。
- 内置的命令行工具“Artisan”，用于创建代码骨架、数据库结构并构建其迁移。

**Q5. 什么是composer？**

答：Composer是用于安装PHP应用程序依赖项的PHP依赖项管理器。

**Q6. 如何通过composer安装laravel？**

答：`composer create-project laravel/laravel your-project-name version`

**Q7. 如何检查laravel的当前版本？**

答：您可以使用artisan命令的--version选项来检查Laravel安装的当前版本。

用法：

- `php artisan --version`

**Q8. 什么是php artisan。列出一些artisan命令？**

答：PHPartisan是Laravel附带的命令行界面/工具。它提供了许多有用的命令，可以帮助您更轻松地构建应用程序。以下是一些artisan命令的列表：

- `php artisan list`
- `php artisan help`
- `php artisan tinker`
- `php artisan make`
- `php artisan --version` （注意：这里应该是`--version`，而不是您在问题中写的`--versian`）
- `php artisan make modal modal_name` （注意：这里可能是个笔误，应该是`php artisan make model model_name`）
- `php artisan make controller controller_name`

**Q9. 解释Laravel中的事件？**

答：事件是由程序检测并处理的某个事件或发生的情况。Laravel事件提供了一个简单的观察者实现，允许我们在应用程序中订阅和监听事件。以下是Laravel中的一些事件示例：

- 新用户已注册
- 发布了新评论
- 用户登录/注销
- 添加了新产品。

**Q10. 如何在Laravel中启用查询日志？**

答：使用`enableQueryLog`方法：

`DB::connection()->enableQueryLog();`

您可以通过使用`getQueryLog`方法获取已执行的查询数组：

`$queries = DB::getQueryLog();`

**Q11. 如何在Laravel中为路由关闭CRSF保护？**

答：在“app/Http/Middleware/VerifyCsrfToken.php”中
//添加一个路由数组来跳过CSRF检查

`private $exceptUrls = ['controller/route1', 'controller/route2'];`

//修改这个函数
`public function handle($request, Closure $next)`

`{`
//添加这个条件

`foreach($this->exceptUrls as $route) {`
`if ($request->is($route)) {`
`return $next($request);`
`}`
`}`
`return parent::handle($request, $next);`
`}`

（注意：直接在中间件中硬编码要跳过的URL通常不是最佳实践。这只是一个示例来说明如何操作。在实际应用中，您可能会找到更灵活和安全的方法来处理此问题。）

**Q12. 什么是Lumen？**

答：Lumen是一个基于Laravel顶级组件构建的PHP微框架。它由Taylor Otwell创建。它是构建基于Laravel的微服务和快速REST API的完美选择。它是可用的最快的微框架之一。

**Q13. 什么是laravel facades？**

答：Laravel Facades为应用程序服务容器中的类提供了一个类似静态的接口。Laravel自带了许多facades，这些facades提供了对Laravel大部分功能的访问。Laravel Facades作为底层服务容器中类的“静态代理”，提供了比传统静态类方法更简洁、更富有表现力的语法，同时保持了更好的可测试性和灵活性。Laravel的所有facades都定义在`Illuminate\Support\Facades`命名空间中。您可以轻松地访问一个Facade，如下所示：

`use Illuminate\Support\Facades\Cache;`

`Route::get('/cache', function () {`

`return Cache::get('key');`

`});`

**Q14. 什么是laravel Contracts？**

答：Laravel的Contracts是一组定义Laravel框架提供的核心服务的接口。

**Q15. 解释Laravel服务容器？**

答：Laravel的服务容器是其最强大的功能之一，它是一个用于解析类依赖项和执行依赖项注入的强大工具。依赖项注入是一个花哨的短语，它本质上意味着类的依赖项是通过构造函数或（在某些情况下）通过“setter”方法“注入”到类中的。

（注意：您提供的文本在这里中断了，所以我没有关于“您可以从这里阅读更多关于Laravel的内容”的翻译。）

**Q16. 在Laravel中如何获取用户的IP地址？**

答：您可以使用以下函数来获取用户的IP地址：

`public function getUserIp(Request $request) {`

`// 获取远程用户的IP地址`

`return $user_ip_address = $request->ip();`

`}`



**Q17. 如何在Laravel模型中使用自定义表？**

**答：** 我们可以通过重写Eloquent的`$table`属性来在Laravel中使用自定义表。以下是一个示例：

```php
class User extends Model { // 注意：应该是 Model 而不是 Eloquent
    protected $table = "my_user_table";
}
```

**Q18. Laravel Eloquent是什么？**

**答：** Laravel包含的Eloquent ORM为数据库操作提供了一个简洁、优雅的ActiveRecord实现。每个数据库表都有一个对应的“模型”，用于与该表进行交互。模型允许您查询表中的数据，以及向表中插入新记录。

**Q19. 如何在Laravel模型中定义可填充属性？**

**答：** 您可以通过重写Laravel Eloquent的`$fillable`属性来定义可填充属性。以下是一个示例：

```php
class User extends Model {
    protected $fillable = ['id', 'first_name', 'last_name', 'age']; // 注意：通常不推荐将'id'包含在fillable属性中，因为它通常是自动增长的
}
```

**Q20. Laravel的vendor目录中包含什么？**

**答：** 我们通过composer安装的所有包都保存在Laravel的vendor目录中。

**Q21. 在Laravel中，控制器位于哪个目录？**

**答：** 我们将所有的控制器保存在`app/Http/Controllers`目录中。（注意：大小写和目录结构需要准确）

**Q22. PHP的compact函数是做什么的？**

**答：** PHP的compact函数接受一个或多个字符串参数，并尝试找到与这些字符串同名的变量。如果找到了变量，它就创建一个关联数组，其中键是变量名，值是变量的值。

**Q23. 定义ORM？**

**答：** 对象关系映射（ORM）是一种编程技术，用于在面向对象编程语言中将数据在不兼容的类型系统之间进行转换。

**Q24. 如何使用Eloquent在Laravel中创建记录？**

**答：** 要使用Laravel Eloquent在数据库中创建新记录，只需创建一个新的模型实例，设置模型的属性，然后调用save方法。以下是一个示例用法：

```php
public function saveProduct(Request $request) {
    $product = new Product; // 注意：类名应该是Product，首字母大写，并且与模型文件名匹配
    $product->name = $request->name;
    $product->description = $request->description; // 这里应该是description而不是重复的name
    $product->save();
}
```

**Q25. 列出Laravel查询构建器提供的一些聚合方法？**

**答：**
- `count()`
- `max()`
- `min()`
- `avg()`
- `sum()`

**Q26. Laravel中Eloquent的`cursor()`方法的用途是什么？**

**答：** `cursor`方法允许您通过游标迭代数据库记录，这只会执行单个查询。在处理大量数据时，`cursor`方法可用于大大减少内存使用量。

示例用法：

```php
foreach (Product::where('name', 'bar')->cursor() as $product) {
    // 执行一些操作
}
```

**Q27. 如何在Laravel中获取已登录用户的信息？**

**答：** 使用`Auth::user()`函数可以在Laravel中获取已登录用户的信息。用法如下：

```php
if (Auth::check()) {
    $loggedInUser = Auth::user();
    dd($loggedInUser);
}
```

**Q28. Laravel中的闭包是什么？**

**答：** 闭包是一个匿名函数，可以分配给变量或作为参数传递给其他函数。闭包可以访问在其创建时所在作用域之外的变量。

**Q29. Laravel的优点是什么？**

**答：**
- 语法简单且一致
- 设置过程简单
- 定制过程简单
- Laravel的代码总是规整的

**Q30. Laravel 5.0的特性是什么？**

**答：**
- 方法注入
- 合约（Contracts）
- 路由缓存
- 事件对象
- 多文件系统
- 身份验证脚手架
- dotenv - 环境检测
- Laravel调度器

**Q31. 比较Laravel和CodeIgniter？**

**答：** （此问题较为开放，以下是比较的一些方面）
- Laravel具有表达性和优雅的语法，而CodeIgniter是一个功能强大的PHP框架，提供简单的工具集来创建全功能的Web应用程序。
- Laravel的开发过程是一种令人愉快和富有创造性的体验，而CodeIgniter以其简单和优雅的工具包而闻名。
- Laravel是为PHP的最新版本构建的，而CodeIgniter是一个更旧、更成熟的框架。
- Laravel与CodeIgniter相比更加面向对象。
- Laravel社区虽然规模仍然较小，但增长非常迅速，而CodeIgniter社区规模较大。

**Q32. 什么是Bundles、Reverse Routing和IoC容器？**

**答：**
- Bundles：这些是您可以下载并添加到Web应用程序中的小功能。但在Laravel中，更常见的术语是“包”（Packages），而不是Bundles。这可能是对旧版Laravel或另一个框架的引用。
- 反向路由：这允许您更改路由，应用程序将更新所有相关链接以匹配此更改。Laravel通过命名路由提供了此功能。
- IoC容器：IoC（控制反转）容器为您提供了生成新对象的方法，并可选择实例化和引用单例。Laravel的服务容器是一个强大的IoC容器实现。

**Q33. 如何在Laravel中设置数据库连接？**

**答：** 数据库配置文件路径是：`config/database.php`。以下是一个数据库配置文件的示例：

```php
'mysql' => [
    'read' => [
        'host' => 'localhost',
    ],
    'write' => [
        'host' => 'localhost'
    ],
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
],
```
但是，请注意，Laravel通常不会为读写分离配置单独的`'read'`和`'write'`键。这可能是对特定设置或扩展包的引用。在标准的Laravel配置中，您通常会看到类似`'connections'`键下的配置。

**Q34. 如何启用查询日志记录？**

**答：** 使用`DB::connection()->enableQueryLog();`可以启用查询日志记录。之后，您可以使用`DB::getQueryLog();`来检索已执行的查询列表。

**Q35. 如何在Laravel中使用select查询？**

**答：** `$users = DB::select('select * from users where city_id = ?', [10]);`。注意，我添加了一个包含绑定参数的数组，这是推荐的方式来避免SQL注入攻击。之后，您可以像下面这样遍历结果：

```php
if (!empty($users)) {
    foreach ($users as $user) {
        // 处理每个用户的数据
    }
}
```

这些问题和答案看起来像是关于Laravel框架的常见问题集（FAQ）。不过，有几个问题的答案存在重复或者需要改进的地方。以下是对这些问题的翻译和改进后的答案：

**Q36: 在Laravel中如何使用Insert语句？**

**答：**


```php
DB::insert('insert into users (id, name, city_id) values (?, ?, ?)', [1, 'Web technology', 10]);
```
或者使用Eloquent ORM：


```php
$user = new User;
$user->id = 1;
$user->name = 'Web technology';
$user->city_id = 10;
$user->save();
```
**Q37: 在Laravel中如何使用Update语句？**

**答：**


```php
DB::update('update users set city_id = 10 where id = ?', [1015]);
```
或者使用Eloquent ORM：


```php
User::where('id', 1015)->update(['city_id' => 10]);
```
**Q38: （重复了Q37）在Laravel中如何使用Update语句？**

**答：** （同Q37的答案）

**Q39: 在Laravel中如何使用Delete语句？**

**答：**


```php
DB::delete('delete from users where id = ?', [1015]);
```
或者使用Eloquent ORM：


```php
User::destroy(1015);
```
**Q40: Laravel支持缓存吗？**

**答：** 是的，Laravel提供了缓存支持。

**Q41: 什么是HTTP中间件？**

**答：** 中间件提供了一个方便的机制来过滤进入你的应用的HTTP请求。例如，Laravel包括一个中间件来验证你的应用的用户是否已经认证。如果用户未认证，中间件会将用户重定向到登录屏幕。然而，如果用户已经认证，中间件将允许请求进一步进入应用。当然，除了认证之外，还可以编写额外的中间件来执行各种任务。一个CORS中间件可能负责向离开你的应用的所有响应添加适当的头。一个日志中间件可能会记录所有进入你的应用的请求。Laravel框架中包含几个中间件，包括用于认证和CSRF保护的中间件。所有这些中间件都位于`app/Http/Middleware`目录中。

**Q42: 什么是数据库迁移？如何使用它来向数据库添加初始数据？**

**答：** 迁移就像数据库的版本控制，允许你的团队轻松地修改和共享应用的数据库模式。迁移通常与Laravel的模式构建器配对，以轻松构建你的应用的数据库模式。如果你曾经不得不告诉队友手动向他们的本地数据库模式添加列，那么你就遇到了数据库迁移要解决的问题。Laravel包括一个使用种子类向数据库添加测试数据的简单方法。所有的种子类都存储在`database/seeds`目录中。种子类可以有任何你想要的名称，但可能应该遵循一些合理的约定，如`UsersTableSeeder`等。默认情况下，为你定义了一个`DatabaseSeeder`类。从这个类中，你可以使用`call`方法来运行其他种子类，允许你控制播种顺序。要向数据库添加初始数据，你可以创建一个种子类并在其中定义要插入的数据。然后，你可以使用`php artisan db:seed`命令来运行种子类并插入数据。你还可以在迁移中使用`DB::table()->insert()`方法来插入初始数据。但是，这通常不是最佳实践，因为它将数据插入逻辑与数据库模式更改混合在一起。相反，最好使用种子类来管理初始数据插入。

**Q43: Laravel安装时需要哪些目录可写？**

**答：** 安装Laravel后，你可能需要配置一些权限。`storage`目录和`bootstrap/cache`目录内的目录应该可由你的Web服务器写入，否则Laravel将无法运行。如果你正在使用Homestead虚拟机，这些权限应该已经设置好了。

**Q44: 如何在Laravel中实现自己的包？**

**答：** 你可以按照以下步骤在Laravel中创建自己的包：

1. **包文件夹和名称**：首先，为你的包创建一个文件夹，并给它一个唯一的名称。这通常是在`packages`目录下完成的（如果你还没有这个目录，你需要创建它）。例如，你可以创建一个名为`vendor/package`的目录结构。
2. **Composer.json文件**：在包的根目录下创建一个`composer.json`文件。这个文件描述了你的包及其依赖关系。确保包含名称、描述、版本、作者、要求和其他相关信息。
3. **通过主composer.json和PSR-4加载包**：在你的主Laravel项目的`composer.json`文件中，你需要添加一个PSR-4自动加载条目来指向你的包。例如：`"psr-4": { "Vendor\\Package\\": "packages/vendor/package/src" }`。然后运行`composer dump-autoload`来重新生成自动加载文件。
4. **创建服务提供者**：服务提供者是Laravel包的核心部分之一。它负责绑定服务到容器、注册事件、路由等。创建一个继承自`Illuminate\Support\ServiceProvider`的类，并在其中定义你的包的启动和服务绑定逻辑。
5. **创建控制器**：为你的包创建一个或多个控制器来处理请求和响应。这些控制器应该放在包的`src/Http/Controllers`目录中。
6. **创建路由文件**：在包的`src/routes`目录下创建一个路由文件（例如`web.php`），并定义你的包的路由。然后，在你的服务提供者的`boot`方法中，使用`$this->loadRoutesFrom()`方法来加载这些路由。
7. **注册服务提供者**：最后，你需要在Laravel的配置文件中注册你的服务提供者。这通常是在`config/app.php`文件的`providers`数组中完成的。添加你的服务提供者的完整类名到该数组中。
8. **发布资源**：如果你的包包含配置文件、视图、迁移等，你可能还需要使用Laravel的发布功能来将这些资源发布到主Laravel项目中。这可以通过在你的服务提供者中定义`publishes`属性来实现。然后，用户可以使用`php artisan vendor:publish`命令来选择性地发布你的包的资源。

**Q45. Laravel 4 和 Laravel 5.x 之间的主要区别是什么？**

**答：**总结 Laravel 5.0 从上述文章的发布说明：

- 旧的app/models目录已被完全移除。
- 控制器、中间件和请求（Laravel 5.0 中的一种新类型的类）现在被分组在 app/Http 目录下。
- 一个新的 app/Providers 目录替换了 Laravel 4.x 之前版本中的 app/start 文件。
- 应用程序语言文件和视图已移动到 resources 目录中。
- 所有主要的 Laravel 组件都实现了位于 illuminate/contracts 存储库中的接口。
- 新的 route:cache Artisan 命令可以大大加速路由的注册。
- Laravel 5 现在支持 HTTP 中间件，并且包含的认证和 CSRF "过滤器" 已经被转换为中间件。
- 您现在可以在控制器方法上键入依赖提示。
- 用户注册、身份验证和密码重置控制器现在已开箱即用，以及位于 resources/views/auth 的简单对应视图。
- 您现在可以将事件定义为对象，而不仅仅是使用字符串。
- 除了 Laravel 4 支持的队列作业格式外，Laravel 5 还允许您将排队作业表示为简单的命令对象。这些命令位于 app/Commands 目录中。
- Laravel 中现在包含一个数据库队列驱动程序，它提供了一个简单的本地队列驱动程序，除了数据库软件之外，不需要安装额外的包。
- Laravel 命令调度程序允许您在 Laravel 本身内流畅且富有表现力地定义您的命令调度，并且您的服务器上只需要一个 Cron 条目。
- php artisan tinker 命令现在使用 Justin Hileman 的 Psysh，这是一个更强大的 PHP REPL。
- Laravel 5 现在使用 Vance Lucas 的 DotEnv。
- Jeffrey Way 的 Laravel Elixir 为编译和连接您的资产提供了一个流畅、富有表现力的界面。
- Laravel Socialite 是一个可选的、与 Laravel 5.0+ 兼容的包，它提供了与 OAuth 提供商完全无痛的认证。
- Laravel 现在包含了强大的 Flysystem 文件系统抽象库，它与本地、Amazon S3 和 Rackspace 云存储提供了无痛的集成 - 所有这些都通过一个统一且优雅的 API！
- Laravel 5.0 引入了表单请求，它扩展了 Illuminate\Foundation\Http\FormRequest 类。这些请求对象可以与控制器方法注入相结合，以提供无需样板的方法来验证用户输入。
- Laravel 5 基础控制器现在包含一个 ValidatesRequests 特性。此特性提供了一个简单的 validate 方法来验证传入的请求。
- 框架中添加了新的 Artisan 生成器命令。
- 流行的 dd 辅助函数（用于转储变量调试信息）已升级为使用神奇的 Symfony VarDumper。

**Q46. 什么是路由，如何编写，以及编写它的不同方式是什么？**

**答：**在 Laravel 中，路由是指定义应用程序端点与对应处理这些请求的代码之间的映射的过程。路由允许您指定应用程序的 URL 结构，并将这些 URL 映射到相应的控制器或处理逻辑上。

路由定义通常位于 Laravel 项目的 `routes` 目录中。对于 Web 界面，路由通常定义在 `routes/web.php` 文件中；而对于无状态的 API 路由，它们则定义在 `routes/api.php` 文件中。

**编写路由的基本方式**：

1. **基础路由**：直接映射一个 URL 到一个闭包函数。


```php
Route::get('/welcome', function () {
    return view('welcome');
});
```
2. **路由到控制器**：将一个 URL 映射到一个控制器的方法。


```php
Route::get('/user/{id}', 'UserController@show');
```
3. **命名路由**：为路由指定一个名称，以便在生成 URL 或重定向时使用。


```php
Route::get('/user/{id}/profile', 'UserController@profile')->name('profile');
```
4. **路由组**：将多个路由分组在一起，共享属性，如中间件或命名空间。


```php
Route::middleware(['auth'])->group(function () {
    Route::get('/user/profile', 'UserController@profile');
    Route::get('/user/settings', 'UserController@settings');
});
```
5. **路由模型绑定**：将路由参数自动解析为 Eloquent 模型实例。


```php
Route::get('/posts/{post}', 'PostsController@show');
```
6. **表单方法伪造**：使用 `POST` 请求来模拟 `PUT`、`PATCH` 或 `DELETE` 请求。
7. **路由回退/通配符路由**：匹配所有其他路由的“捕获所有”路由。
8. **访问控制**：使用中间件来限制对路由的访问，如 `auth` 中间件用于需要身份验证的路由。
9. **API 资源路由**：为构建 RESTful API 提供了一种快速声明路由的方法。例如，使用 `Route::resource()` 或 `Route::apiResource()` 方法。
10. **路由缓存**：为了提高性能，可以使用 `php artisan route:cache` 命令来缓存路由定义。这在生产环境中特别有用，因为它可以减少注册所有路由所需的时间。但是，请注意，在使用路由缓存时，每次修改路由定义后都需要重新缓存路由。

###### [转载自 mytectra —— Laravel Interview Questions and Answers](https://www.mytectra.com/interview-question/laravel-interview-questions-and-answers "转载自 mytectra —— Laravel Interview Questions and Answers")]]></content>
                <pubDate>Sat, 24 Feb 2024 05:19:30 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Microsoft Edge 开发者注册报错Error code 2201]]></title>
                <link>https://www.jefsky.com/blog/317</link>
                <description><![CDATA[**Microsoft Edge 开发者注册报错**   `Error code 2201. Correlation ID 8029563c-f394-46cb-addf-0eb746b1d1a2,rddVd9MV3Uqsqw57.0.3.`  发布Microsoft Edge扩展写注册信息时，就算把*号都填好了，都会提示错误：...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/317</guid>
                <content><![CDATA[**Microsoft Edge 开发者注册报错** 

`Error code 2201. Correlation ID 8029563c-f394-46cb-addf-0eb746b1d1a2,rddVd9MV3Uqsqw57.0.3.`

发布Microsoft Edge扩展写注册信息时，就算把*号都填好了，都会提示错误： 

`Error code 2201. Correlation ID 8029563c-f394-46cb-addf-0eb746b1d1a2,rddVd9MV3Uqsqw57.0.3.`

后来把所有字段都填写了，发现在'state/province'有提示： 
Please choose a state or province 
尝试了中文、拼音、英文的城市名称，都一样报错。

最后才发现，填城市缩写才得意通过（如广东Guangdong，得填GD），望微软修复一下吧~]]></content>
                <pubDate>Mon, 26 Feb 2024 01:38:40 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[关于Laravel取消超时未支付订单的菜鸡解决方案（定时任务）]]></title>
                <link>https://www.jefsky.com/blog/318</link>
                <description><![CDATA[## 需求是这样的： 很多时候用户下单之后不会立刻结账付款，把订单一直挂着，甚至有些用户久而久之把订单忘记了。这样会导致库存一直被占用，经营无法正常进行了。所以，建议给用户订单一个超时时间，够钟就系统自动...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/318</guid>
                <content><![CDATA[## 需求是这样的：
很多时候用户下单之后不会立刻结账付款，把订单一直挂着，甚至有些用户久而久之把订单忘记了。这样会导致库存一直被占用，经营无法正常进行了。所以，建议给用户订单一个超时时间，够钟就系统自动取消订单。
## 大概思想
用的是Laravel里的任务调度，每分钟调度一次，执行查询所有没确定的订单，然后统一取消。弊端就是时效性有点欠缺吧，固定时间执行，会出现订单时间到了，但是还没到任务调度时间。还有个问题就是，固定每分钟执行，就算明知道没有新订单了，还是会去调度，如果数据量大，问题就很大了。

## 操作
####创建一个命令文件
`php artisan make:command CancelOrdersByUnpaid`
####编辑 app/Console/Commands/CancelOrdersByUnpaid.php 文件：
    namespace App\Console\Commands;
    
    use App\Helpers\ResponseEnum;
    use App\Models\ShopOrder;
    use App\Service\Api\ShopOrderGoodsService;
    use App\Service\Api\UserCouponService;
    use Illuminate\Console\Command;
    use Carbon\Carbon;
    use Illuminate\Support\Facades\Log;
    
    class CancelUnpaidOrders extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'orders:cancel';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description';
    
        /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
            $unpaidOrders = ShopOrder::where('status', '0')->where('add_time', 'subHours(24)))->get();
            if(!empty($unpaidOrders)){
                foreach ($unpaidOrders as $order) {
                    $order->status = '-1';
                    $order->save();
                    ShopOrderGoodsService::cancelDataByOrderId($order->id);
                    if ($order->user_coupon_id) {
                        $update_data['id'] = $order->user_coupon_id;
                        $update_data['user_id'] = $order->user_id;
                        $update_data['is_use'] = '0';
                        UserCouponService::updateInfoByOrder($update_data);
                    }
                }
            }
            Log::info('取消订单定时任务执行'.time());
            return Command::SUCCESS;
        }
    }

#### 修改 app/Console/Kernel.php 文件，注册定时任务：
    protected function schedule(Schedule $schedule)
        {
            // $schedule->command('inspire')->hourly();
            $schedule->command('orders:cancel')->everyMinute()->onSuccess(function () {
                Log::info('schedule任务执行成功'.time());
            })
            ->onFailure(function () {
                Log::info('schedule任务执行失败'.time());
            });
    
            Log::info('schedule任务'.time());
        }

#### 配置服务器Cron
`crontab -u www -e` 打开cron配置
> 这里需要主要！必须要用www用户来创建，不然默认是root用户，后期会造成日志文件由root创建，laravel无法写入日志报错

添加 `* * * * * cd /www/wwwroot/project && php artisan  schedule:run >> /dev/null 2>&1`

执行 `php artisan schedule:run`

至此 Laravel取消超时未支付订单的菜鸡解决方案 基本完成]]></content>
                <pubDate>Mon, 20 May 2024 07:56:07 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Laravel取消超时订单的解决方案（延迟分发）]]></title>
                <link>https://www.jefsky.com/blog/319</link>
                <description><![CDATA[## 需求是这样的 很多时候用户下单之后不会立刻结账付款，把订单一直挂着，甚至有些用户久而久之把订单忘记了。这样会导致库存一直被占用，经营无法正常进行了。所以，建议给用户订单一个超时时间，够钟就系统自动取...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/319</guid>
                <content><![CDATA[## 需求是这样的
很多时候用户下单之后不会立刻结账付款，把订单一直挂着，甚至有些用户久而久之把订单忘记了。这样会导致库存一直被占用，经营无法正常进行了。所以，建议给用户订单一个超时时间，够钟就系统自动取消订单。
## 大概思想
用Laravel的延迟分发来制作，用户下单之后，开始出发延时分发，例如30分钟，时间到就执行，如果已经支付了就return，没有就取消订单，恢复库存和优惠券。感觉这个方法比之前的定时要好很多，有新订单就执行，没有就算，而且时效性的问题也解决了。
## 动手
#### 用命令创建一个job
`php artisan make:job CancleOrder`
#### 修改环境文件`.env`中队列配置项指定为 redis
`QUEUE_CONNECTION=redis`
如果是`QUEUE_CONNECTION=sync`就是同步了
对了，你也需要准备好redis环境先
#### 编辑`app/job/CancleOrder`文件
    <?php namespace App\Jobs;
    
    use App\Models\ShopOrder;
    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Support\Facades\Log;
    
    /**
     * CloseOrder
     * @namespace App\Jobs
     * @date 2024/3/5
     * @author Jefsky
     */
    class CloseOrder implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $order;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct(ShopOrder $order, $delay)
        {
            // 这里接收的是订单的实例
            $this->order = $order;
            // 核心配置：设置延迟的时间，delay()方法的参数代表多少秒之后执行
            $this->delay($delay);
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            // 判断对应的订单是否已经被支付，如果已经支付则不需要关闭订单，直接退出
            if (!empty($this->order->pay_status)) {
                Log::info($this->order->id . '订单已支付无需操作' . time());
                return;
            }
    
            // 通过事务执行 sql
            // 取消订单
            $this->order->status = '-1';
            $this->order->save();
            // 恢复库存、优惠券
            ...cancelData...
            if ($this->order->coupon_id) {
               ...
            }
            Log::info($this->order->id . '系统取消订单执行' . time());
        }
    }
#### 添加超时时间
在`config/app.php`中添加超时时间
`'order_ttl' => 1800,// 订单超时时间`
#### 触发
在创建订单的业务上加上延迟分发的任务
    use App\Jobs\CloseOrder;
    
    /**
         * 新增订单
         * @param $insert_data
         * @return mixed
         */
        public static function addOrder($data)
        {
            $order = new ShopOrder();
           	...
            $order->save();
            // 调用延迟队列任务，超时30分钟未支付关闭订单，恢复库存
            dispatch(new CloseOrder($lib, config('app.order_ttl')));
            return $order->id;
        }
		
#### 安装predis依赖
使用 redis 作为队列驱动，还需要引入 predis/predis 依赖
`composer require predis/predis`
#### 启动队列处理器
`php artisan queue:work`
每次修改任务执行程序，都需要先停止队列，修改完成后再重新启动。
> 如果想队列处理器进程一直在后台运行，可以写入到守护进程中，如Supervisor]]></content>
                <pubDate>Tue, 05 Mar 2024 07:23:23 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决Laravel 队列执行报错【不存在failed_jobs】]]></title>
                <link>https://www.jefsky.com/blog/320</link>
                <description><![CDATA[## 问题情景 调试laravel队列的时候报错不存在failed_jobs表  ## 问题显现 > local.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'failed_jobs' doesn't exist  ...  > (PDOException(code: 4...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/320</guid>
                <content><![CDATA[## 问题情景
调试laravel队列的时候报错不存在failed_jobs表

## 问题显现
> local.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'failed_jobs' doesn't exist  ...

> (PDOException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'failed_jobs' doesn't exist ...

问题显而易见就是没有了那张表嘛，那就创建就好了。其实Laravel 自带了一张 failed_jobs 数据表用来记录所有错误的队列，用一下命令就好了：

    $ php artisan queue:failed-table
    $ php artisan migrate]]></content>
                <pubDate>Tue, 26 Mar 2024 08:23:13 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[C盘突然暴涨！]]></title>
                <link>https://www.jefsky.com/blog/321</link>
                <description><![CDATA[## 是这样的 某天开着【我的电脑】，发现C盘红得离谱，我也没在C盘放什么东西。于是乎，我一个个地方找。先碰碰运气找找用户文件夹吧，看看【AppData】会不会是什么临时文件多了。结果不看不知道，一看吓一跳！ 发现...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/321</guid>
                <content><![CDATA[## 是这样的
某天开着【我的电脑】，发现C盘红得离谱，我也没在C盘放什么东西。于是乎，我一个个地方找。先碰碰运气找找用户文件夹吧，看看【AppData】会不会是什么临时文件多了。结果不看不知道，一看吓一跳！
发现`C:\Users\JJ\AppData\Local\Docker\wsl\data\ext4.vhdx`这个罪魁祸首！一个文件夹都占了140G了！天吖
既然问题找到了，那就解决吧~这个一看就知道是跟docker有关的
## 行动吧
### 收缩ext4.vhdx文件
#### 清理不必要的镜像
`docker system prune`
#### 停止wsl服务
`wsl --shutdown`
#### 收缩文件
    diskpart
    select vdisk file="C:\Users\JJ\AppData\Local\Docker\wsl\data\ext4.vhdx"
    attach vdisk readonly
    compact vdisk
    detach vdisk
    exit
#### 重启docker
就完成了，呼呼140G-》6G @〰️@

## 更好的方法
后来了解到，其实不用一个个文件夹去看占用多大空间了，可以直接用diskusage查看
`diskusage /minFileSize=10737418240 /h C:`

> /minFileSize=10737418240 分析找出大于10G的目录   
/h 显示大小为可读格式   
C: 指定磁盘位置，可以是具体目录

就一目了然了]]></content>
                <pubDate>Fri, 08 Mar 2024 02:04:23 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[阿里云服务器搭建个人博客教程LAMP（Ubuntu+Apache+Mysql+php）]]></title>
                <link>https://www.jefsky.com/blog/322</link>
                <description><![CDATA[**阿里云服务器搭建个人博客教程**  **一、购买阿里云服务器**  前往阿里云购买服务器：https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=qpo37rrc|863055719|  - 根据自己的需求选择合适的配置。 - 地域...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/322</guid>
                <content><![CDATA[**阿里云服务器搭建个人博客教程**

**一、购买阿里云服务器**

前往阿里云购买服务器：https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=qpo37rrc|863055719|

- 根据自己的需求选择合适的配置。
- 地域选择在国内的话，需要进行备案，但备案流程相对简单。

**（注意：请确保您已经购买并实名认证了域名）**

**二、选择操作系统**

推荐选择Ubuntu作为操作系统，不建议使用Windows。如果已有服务器但不是Ubuntu系统，可以在镜像市场进行更换。

**三、本地工具准备**

1. **FileZilla**：用于上传和下载服务器文件。
   - 下载地址：https://filezilla-project.org/download.php?type=client
   - 提示：无需单独搭建FTP服务器，使用SFTP协议即可，它与SSH协议兼容。

2. **PuTTY**：免费的跨平台Telnet/SSH客户端。
   - 下载地址：https://github.com/larryli/PuTTY/releases

**四、远程访问与配置环境**

使用PuTTY远程访问服务器进行环境配置。

- **su与sudo的区别**：
  - `su`：切换到超级用户root并保持该身份，直到退出。
  - `sudo`：以超级用户root身份执行单个命令，执行后恢复为原用户身份。使用sudo可以减少多人拥有root密码的风险。

**五、安装与配置环境**

1. **更新服务器目录**
   ```bash
   sudo apt-get update
   ```

2. **安装Apache**
   ```bash
   sudo apt-get install apache2
   ```
   安装完成后，使用`apache2 -v`查看版本信息。

3. **安装PHP（以PHP 7为例）**
   ```bash
   sudo apt-get install php7.0
   ```
   安装完成后，使用`php -v`查看版本信息。

4. **安装PHP Apache模块**
   ```bash
   sudo apt-get install libapache2-mod-php7.0
   ```

5. **安装MySQL服务器**
   ```bash
   sudo apt-get install mysql-server
   ```

6. **安装常用PHP扩展**
   ```bash
   sudo apt-get install php7.0-curl php7.0-gd php7.0-mysql
   ```
   通过`apt-cache search php7.0`查找其他相关安装包。

**六、安装phpMyAdmin**

1. **安装phpMyAdmin**
   ```bash
   sudo apt install phpmyadmin
   ```
   安装过程中会要求输入MySQL的密码信息。

2. **创建软连接**
   ```bash
   sudo ln -s /usr/share/phpmyadmin/ /var/www/html/phpmyadmin
   ```

3. **访问phpMyAdmin**
   在浏览器中访问`你的域名/phpmyadmin`，确保你已经知道如何进行域名解析。

**七、上传并安装博客系统**

以Typecho为例：

1. **下载Typecho**
   访问Typecho官网：http://typecho.org/ 下载安装包。

2. **上传并解压**
   使用FileZilla将安装包上传到服务器网站根目录，并解压。

3. **访问并安装**
   在浏览器中访问你的域名，按照提示完成Typecho的安装。

至此，您的个人博客已经搭建完成。您可以根据自己的需求进一步定制和美化博客。]]></content>
                <pubDate>Thu, 14 Mar 2024 06:11:39 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[小女生石楠子酱——微信表情包]]></title>
                <link>https://www.jefsky.com/blog/324</link>
                <description><![CDATA[##### 最近，我热衷于制作表情包，经过一番努力，终于创作出了一套令自己满意的作品。希望这些表情包能够给你们带来欢乐。 ##### 随着石楠花花期的临近，我灵感迸发，决定以石楠花为主题创作一套表情包。石楠的“楠”...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/324</guid>
                <content><![CDATA[##### 最近，我热衷于制作表情包，经过一番努力，终于创作出了一套令自己满意的作品。希望这些表情包能够给你们带来欢乐。
##### 随着石楠花花期的临近，我灵感迸发，决定以石楠花为主题创作一套表情包。石楠的“楠”与“难”谐音，我以此为出发点，展开丰富的想象。表情包的主人公是一位名叫“小女生石楠子酱”的可爱角色，她生活在石楠花盛开的林子里，身上散发着迷人的石楠花香，喜欢用石楠花作为头饰，为她的生活增添了一抹别样的色彩。
##### 期待你们能够喜欢这套充满创意和趣味性的表情包，也希望它们能够成为你们日常聊天中的小乐趣。
[![表情介绍](https://www.jefsky.com/storage/markdown/images/719d25cc9a47cd1b0f7e5519e8342b18661895fa84a23.png "表情介绍")](https://sticker.weixin.qq.com/cgi-bin/mmemoticon-bin/emoticonview?oper=single&t=shop/detail&productid=aL2PCfwK/89qO7sF6/+I+UDhfwEjhec2ZNvdnLLJRd/OJ0R7ucBgeTDl8J8fQVfElcdjN6HpQhudkFVyiXT+zN55/q/Xq/VyoTlDcM+9llZk= "表情介绍")]]></content>
                <pubDate>Fri, 12 Apr 2024 02:02:48 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[关于计算属性的理解]]></title>
                <link>https://www.jefsky.com/blog/325</link>
                <description><![CDATA[计算属性指的是通过一系列运算之后，最终得到一个属性值。这个动态计算出来的属性值，可以被模板结构或methods方法使用。  在Vue等框架中，计算属性是通过特定的配置项（如computed）来定义的。计算属性是一个函数，...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/325</guid>
                <content><![CDATA[计算属性指的是通过一系列运算之后，最终得到一个属性值。这个动态计算出来的属性值，可以被模板结构或methods方法使用。

在Vue等框架中，计算属性是通过特定的配置项（如computed）来定义的。计算属性是一个函数，它返回一个计算后的值。当计算属性所依赖的数据发生变化时，它会重新计算并返回新的值。计算属性具有缓存功能，即当依赖的数据没有发生变化时，它不会重新计算，而是返回之前缓存的值，这有助于提高性能。

计算属性在定义时要被标记为“方法”，其特点包括实现了代码的复用和当依赖的数据源变化时，计算属性会重新求值。这使得计算属性在处理需要基于其他数据属性进行计算或转换的属性值时非常有用。

例如，在一个Vue组件中，你可以定义一个计算属性来组合firstName和lastName两个数据属性，生成一个fullName属性。当firstName或lastName发生变化时，fullName计算属性会自动更新。

总的来说，计算属性是一种强大的工具，可以帮助你更有效地管理和处理应用程序中的数据属性。

以下提供一个关于计算属性的具体例子。以Vue.js框架为例，假设我们有一个简单的Vue组件，其中包含了两个数据属性：`firstName`和`lastName`。我们想要创建一个计算属性`fullName`，它将`firstName`和`lastName`组合成一个完整的名字。

以下是Vue组件的示例代码：

```html
<template>
  <div>
    <p>First Name: <input v-model="firstName"></p>
    <p>Last Name: <input v-model="lastName"></p>
    <p>Full Name: {{ fullName }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      firstName: '',
      lastName: ''
    };
  },
  computed: {
    fullName: {
      // getter函数，当读取fullName时，get方法被调用
      get() {
        // 返回组合后的全名
        return this.firstName + ' ' + this.lastName;
      },
      // setter函数，当修改fullName时，set方法被调用
      set(value) {
        // 这里可以根据需求分割value并更新firstName和lastName
        const names = value.split(' ');
        this.firstName = names[0];
        this.lastName = names.length > 1 ? names[1] : '';
      }
    }
  }
};
</script>
```

在这个例子中，`fullName`是一个计算属性，它包含了一个`get`函数和一个`set`函数。`get`函数用于读取`fullName`的值，它会将`firstName`和`lastName`组合成一个字符串并返回。当我们在模板中使用`{{ fullName }}`时，实际上调用的是`get`函数。

`set`函数用于设置`fullName`的值。当我们在代码中直接给`fullName`赋值时，`set`函数会被调用。在这个例子中，我们简单地通过空格分割传入的值，并更新`firstName`和`lastName`。请注意，在实际应用中，你可能需要更复杂的逻辑来处理`set`函数中的值。

通过计算属性，我们可以方便地创建基于其他数据属性的动态属性值，并在模板中直接使用。当依赖的数据属性（如`firstName`或`lastName`）发生变化时，计算属性会自动更新，确保`fullName`始终是最新的值。]]></content>
                <pubDate>Sat, 13 Apr 2024 01:39:01 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[掘金上传动态头像]]></title>
                <link>https://www.jefsky.com/blog/326</link>
                <description><![CDATA[### 准备 - 动图 - postman\apizza\apipost  ### 步骤 1. 现在接口工具中把参数写好 ![](https://www.jefsky.com/storage/markdown/images/4fb67d946536085b2424d3783635863c6620d46129461.png) 2. 在掘金中添加新文...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/326</guid>
                <content><![CDATA[### 准备
- 动图
- postman\apizza\apipost

### 步骤
1. 现在接口工具中把参数写好
![](https://www.jefsky.com/storage/markdown/images/4fb67d946536085b2424d3783635863c6620d46129461.png)
2. 在掘金中添加新文章，上传你的动图，得到图片地址，就是avatar的值
![](https://www.jefsky.com/storage/markdown/images/07a95935a940d2d48be004c8fc56125b6620d8f8a148c.png)
3. 访问修改个人资料页面，打开控制台，正常上传一张图，就可以拿到cookie了，放进接口工具，提交就好了。
![](https://www.jefsky.com/storage/markdown/images/8e46fc42f6664e730c09bb96b2f6dbd16620dff3a65de.png)]]></content>
                <pubDate>Thu, 18 Apr 2024 08:57:34 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[查询Laravel的版本]]></title>
                <link>https://www.jefsky.com/blog/327</link>
                <description><![CDATA[要查询Laravel的版本，你可以使用以下两种方法之一：  1. **通过命令行**： 打开你的终端或命令提示符，然后导航到你的Laravel项目的根目录。一旦你在项目根目录中，运行以下命令：   ```bash php artisan --version...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/327</guid>
                <content><![CDATA[要查询Laravel的版本，你可以使用以下两种方法之一：

1. **通过命令行**：
打开你的终端或命令提示符，然后导航到你的Laravel项目的根目录。一旦你在项目根目录中，运行以下命令：


```bash
php artisan --version
```
执行完这个命令后，它会返回Laravel的版本号，例如`Laravel Framework 8.x.y`，其中`8.x.y`是具体的版本号。
2. **查看`composer.json`文件**：
Laravel的版本号也会在项目的`composer.json`文件中列出。你可以使用文本编辑器打开这个文件，并查找`laravel/framework`的版本号。它通常会像这样出现：


```json
"require": {
    "php": "^7.3|^8.0",
    "fideloper/proxy": "^4.4",
    "laravel/framework": "8.*",
    // ... 其他依赖 ...
},
```
在上面的例子中，`laravel/framework`的值是`8.*`，这意味着Laravel的版本是8.x系列。具体的子版本号可能会根据你的具体安装而有所不同。

请注意，上述方法适用于你已经安装了Laravel并且正在使用命令行工具的情况下。如果你还没有安装Laravel，你需要先安装Composer，然后使用Composer来安装Laravel。在安装过程中，你也可以指定你想要安装的Laravel版本。]]></content>
                <pubDate>Thu, 25 Apr 2024 08:11:43 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[nginx反向代理——想让域名解析到服务器端口上]]></title>
                <link>https://www.jefsky.com/blog/328</link>
                <description><![CDATA[## 需求是这样的 我配置了个node服务监听端口9988，但是我不想外网访问在域名后面加端口，很不友好。 对于这种情况，就可以用nginx的反向代理了 ## 操作 配置如下 ``` server     {         listen 80; #nginx监听访...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/328</guid>
                <content><![CDATA[## 需求是这样的
我配置了个node服务监听端口9988，但是我不想外网访问在域名后面加端口，很不友好。
对于这种情况，就可以用nginx的反向代理了
## 操作
配置如下
```
server
    {
        listen 80; #nginx监听访问端口80
        location / {  
            proxy_pass http://localhost:9988;  #转发到本地9988
            proxy_http_version 1.1;  
            proxy_set_header Upgrade $http_upgrade;  
            proxy_set_header Connection 'upgrade';  
            proxy_set_header Host $host;  
            proxy_cache_bypass $http_upgrade;  
        }
    }
```]]></content>
                <pubDate>Mon, 29 Apr 2024 08:10:41 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Lorem ipsum]]></title>
                <link>https://www.jefsky.com/blog/329</link>
                <description><![CDATA[Lorem Ipsum，确实是一种常用的虚拟文本，也称为占位符文本或哑元文本，主要用于在排版、设计、印刷和网页开发中模拟实际内容，以便预览布局和视觉效果。  ### 它起源于哪里？ Lorem Ipsum的起源可以追溯到一篇经典...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/329</guid>
                <content><![CDATA[Lorem Ipsum，确实是一种常用的虚拟文本，也称为占位符文本或哑元文本，主要用于在排版、设计、印刷和网页开发中模拟实际内容，以便预览布局和视觉效果。

### 它起源于哪里？
Lorem Ipsum的起源可以追溯到一篇经典的拉丁文献，具体是西塞罗（Cicero）的《De Finibus Bonorum et Malorum》（论善与恶的界限）。这段文本是西塞罗在公元前45年写成的，并在文艺复兴时期被广泛阅读。Lorem Ipsum的开头“Lorem ipsum dolor sit amet”就是从这篇文献中选取的。

### 我们为何用它？
使用Lorem Ipsum的主要原因是为了在排版和设计中提供一个标准的、可读的、不引人注目的文本内容。这有助于设计师和开发人员更专注于页面的布局、颜色、字体和其他视觉元素，而不必担心实际内容的影响。

### 我能从哪里获取？
你可以从互联网上找到各种版本的Lorem Ipsum。但是，为了确保内容的准确性和专业性，最好从可靠的来源获取。有些网站提供了Lorem Ipsum的生成器，可以根据需要生成任意长度的Lorem Ipsum文本。此外，一些桌面排版软件和网页开发工具也内置了Lorem Ipsum作为默认的占位符文本。

总之，Lorem Ipsum是一种非常有用的工具，它可以帮助设计师和开发人员更好地预览和测试他们的作品。]]></content>
                <pubDate>Thu, 16 May 2024 01:07:36 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决Laravel 定时任务日志权限问题]]></title>
                <link>https://www.jefsky.com/blog/330</link>
                <description><![CDATA[### laravel 项目 计划任务 日志文件出现root 账号权限，导致www 无法写入 错误解决  1. 删除root用户的日志文件 2. 使用www用户来配置crontab   `crontab -u www -e`    > 注意：www 取决于您服务器的web用户名   3...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/330</guid>
                <content><![CDATA[### laravel 项目 计划任务 日志文件出现root 账号权限，导致www 无法写入 错误解决

1. 删除root用户的日志文件
2. 使用www用户来配置crontab

 `crontab -u www -e`

  > 注意：www 取决于您服务器的web用户名
 
3. 添加计划任务

 `* * * * * cd /www/wwwroot/project && php artisan schedule:run >> /dev/null 2>&1`]]></content>
                <pubDate>Mon, 20 May 2024 07:54:07 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[yarn出现“There are no scenarios ; must have at least one"]]></title>
                <link>https://www.jefsky.com/blog/331</link>
                <description><![CDATA[### 事情是这样的，新部署好ubuntu服务器想用yarn安装一下，结果就出现 > There are no scenarios ; must have at least one  ### 直接放代码吧 ```bash sudo apt remove cmdtest sudo apt remove yarn   curl -sS h...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/331</guid>
                <content><![CDATA[### 事情是这样的，新部署好ubuntu服务器想用yarn安装一下，结果就出现
> There are no scenarios ; must have at least one

### 直接放代码吧
```bash
sudo apt remove cmdtest
sudo apt remove yarn
 
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
 
sudo apt update
sudo apt install yarn
```]]></content>
                <pubDate>Wed, 22 May 2024 09:23:47 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[帝国cms首页被木马无法找到文件的处理方法]]></title>
                <link>https://www.jefsky.com/blog/332</link>
                <description><![CDATA[## 事情是这样的 朋友公司的网站首页被挂马了，找我看看。 ![](https://www.jefsky.com/storage/markdown/images/13c5fd301c72e227825d3397085ae6e1666aa42eacc9f.png) 打开首页源码发现头部被植入了恶意js。这部分...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/332</guid>
                <content><![CDATA[## 事情是这样的
朋友公司的网站首页被挂马了，找我看看。
![](https://www.jefsky.com/storage/markdown/images/13c5fd301c72e227825d3397085ae6e1666aa42eacc9f.png)
打开首页源码发现头部被植入了恶意js。这部分代码设置了页面的标题、关键词和描述，但它们都使用了HTML实体编码（例如 &#x56FD; 代表中文字符“国”），解码后显示的是与产品推广、在线观看、品牌精品、亚洲等内容相关的标题和元信息。这明显是为了吸引用户点击或优化搜索引擎排名，但需要注意的是，内容似乎与朋友公司的主题不符，且含有敏感词汇，可能涉及不当或违规信息。所以必须得清楚。
既然找到木马了，那就找到首页删除就好了。
## 如果事情真的那么简单得话，就不会有这篇文章了
开始我翻遍了整个网站目录都没有找到，甚至把首页文件删了，缓存清了，网站首页还是安然无恙，那就奇怪了。
想了想帝国cms就是生成静态页面然后给人访问的吖，难道是js？又翻一遍。甚至试着全文搜编码，还是不行。
尝试着改内页，有反应！就是首页安然无恙。打开开发者工具，没有301或者302。推倒了，我觉得他是重定向要别的地方的猜想。那肯定是在本地，会在哪...
## 睡过一觉，，，，
没有在前端跳转，那会不会在服务器呢？既然修改首页没问题，那是不是说明其实根本没有进入到本地的首页？
顺着这个思路，我翻了下服务器的配置文件。没找到.htaccess相关的文件，但是发现了web.config顾名思义也是网站配置文件吧，打开一看，还家伙！如果不细心还真的以为没毛病
## IIS的URL重写模块配置
![](https://www.jefsky.com/storage/markdown/images/3b0baa9ed9a67c9a554883c91c07d61c666aa9cb3b68f.png)
开始的重写规则还是蛮正常的，将非HTTPS请求重定向到HTTPS。
```xml
<rule> 元素定义了一个重写规则，name 属性为 "301"，stopProcessing 属性为 "true" 表示匹配到该规则后停止处理后续规则。
<match> 元素用于匹配请求的URL，url 属性为 "^(.*)$" 表示匹配任何内容，ignoreCase 属性为 "false" 表示区分大小写。
<conditions> 元素定义了匹配的条件，logicalGrouping 属性为 "MatchAll" 表示所有条件都必须满足。
<add> 元素是一个条件，input 属性为 "{HTTP_FROM_HTTPS}" 表示获取请求头中的 "HTTP_FROM_HTTPS" 值，pattern 属性为 "^on$" 表示匹配值为 "on"，negate 属性为 "true" 表示取反，即不等于 "on"。
<action> 元素定义了匹配成功后的处理方式，type 属性为 "Redirect" 表示重定向，url 属性为 "https://www.xxx.cn/{R:1}" 表示将匹配到的内容替换到目标URL中，redirectType 属性为 "Permanent" 表示重定向类型为 301 永久重定向。
```
不细心的话还真以为这就是个强制https的规则文件，但是看到后面，嗯！？这是个反向代理功能喔！这段XML代码的作用是将访问根目录的请求重定向到指定的URL地址。一问，ip不认识，那不就是你！
```xml
<rule> 标签定义了一个规则，name 属性为 "HomepageReverseProxy"，用于标识该规则。
<match> 标签指定了匹配的URL模式，url 属性为 ^/?$，表示匹配根目录的URL路径。
<action> 标签定义了匹配成功后的操作，type 属性为 "Rewrite"，表示进行URL重写操作。url 属性为 http://38.63.33.31/{R:0}，表示将请求重定向到指定的URL地址。
```

把重定向的删了之后，网站正常了
## 疑问
不知道这是怎么入侵的，我觉得是有人想为了吸引用户点击或优化搜索引擎排名所以搞这一出的，但是我朋友说不知道，资料也没给过别人。也罢，找到原因了就算吧。]]></content>
                <pubDate>Thu, 13 Jun 2024 08:25:02 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkcmf 导航激活状态联动（片段）]]></title>
                <link>https://www.jefsky.com/blog/333</link>
                <description><![CDATA[```html                                                           {$menu.name|default=''}                                                       ``` > 用于判断当前页面的URL是否与导航菜单项的链接相同，...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/333</guid>
                <content><![CDATA[```html
<navigation nav-id="1" root="ul" id="main-navigation" class="nav navbar-nav navbar-nav-custom">
  <navigationmenu root="li" class="menu-item menu-item-level-{$level}"> <?php $currentUrl = $_SERVER['REQUEST_URI']; // 获取当前页面的完整URL
                        if ($menu['href'] == '/') {
                            $isActive = $currentUrl == '/'  ? 'NItemCur' : ''; 
                        } else {
                            $isActive = strpos($currentUrl, $menu['href']) !== false ? 'NItemCur' : ''; 
                        }
                        
                    ?> <dd class="NItem {$key != 1 ?'': 'NFirst '} {$isActive}" data-subid="">
      <table class="NItemTable">
        <tr>
          <td class="NItemL"></td>
          <td class="NItemM"><a href="%7B%24menu.href%7Cdefault=''%7D" title="{$menu.name|default=''}">
              <span>{$menu.name|default=''}</span>
            </a></td>
          <td class="NItemR"></td>
        </tr>
      </table>
    </dd>
    <dd class="NLine"></dd>
  </navigationmenu>
</navigation>
```
> 用于判断当前页面的URL是否与导航菜单项的链接相同，如果相同则为菜单项添加一个指定的类名。

1. $_SERVER['REQUEST_URI'] 用于获取当前页面的完整URL。
2. 使用条件语句判断菜单项的链接是否为根路径 /。
3. 如果是根路径，则判断当前URL是否也为根路径，如果相同则为菜单项添加类名 NItemCur，否则不添加。
4. 如果菜单项的链接不是根路径，则使用 strpos 函数判断当前URL是否包含菜单项的链接，如果包含则为菜单项添加类名 NItemCur，否则不添加。

```javascript
<script>
  $(function() {
      $('.menu-item:eq(2) .NItem').addClass('NItemCur');
  });
</script>
```
> 至于内页的导航状态，我用了jq来控制]]></content>
                <pubDate>Thu, 13 Jun 2024 08:43:59 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[网站防复制]]></title>
                <link>https://www.jefsky.com/blog/334</link>
                <description><![CDATA[这是一份网站防复制的js ```javascript var bindEvent = function(obj,ev,fun){ 	if(obj.attachEvent){ 		obj.attachEvent("on"+ev,fun); 	}else{ 		obj.addEventListener(ev,fun); 	} } function prevent_copy(){...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/334</guid>
                <content><![CDATA[这是一份网站防复制的js
```javascript
var bindEvent = function(obj,ev,fun){
	if(obj.attachEvent){
		obj.attachEvent("on"+ev,fun);
	}else{
		obj.addEventListener(ev,fun);
	}
}
function prevent_copy(){
	$(document).bind("contextmenu",function(){return false;});
	$(document).bind("selectstart",function(){return false;});
	$(document).keydown(function(){return key(arguments[0])}); 
	$(function(){
		$('body').css('-moz-user-select','none');
	});
}
	//按键时提示警告
function key(e){
	var keynum;						
	if(window.event) keynum = e.keyCode;// IE                    
	else if(e.which )  keynum = e.which; // Netscape/Firefox/Opera
	if(e.ctrlKey && (keynum == 88 || keynum == 67)){ alert('防止复制！');return false;}
}
bindEvent(window,'load',prevent_copy);

```]]></content>
                <pubDate>Thu, 13 Jun 2024 09:45:18 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkcmf伪静态文件]]></title>
                <link>https://www.jefsky.com/blog/335</link>
                <description><![CDATA[thinkcmf伪静态文件  ```xml location / { 	if (!-e $request_filename){ 		rewrite  ^(.*)$  /index.php?s=$1  last;   break; 	} } location /api/ {   index  index.php index.html index.htm;   #如果请求既不是...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/335</guid>
                <content><![CDATA[thinkcmf伪静态文件

```xml
location / {
	if (!-e $request_filename){
		rewrite  ^(.*)$  /index.php?s=$1  last;   break;
	}
}
location /api/ {
  index  index.php index.html index.htm;
  #如果请求既不是一个文件，也不是一个目录，则执行一下重写规则
  if (!-e $request_filename)
  {
  #若是子目录则使用下面这句，将subdir改成目录名称即可。
  rewrite ^/api/(.*)$ /api.php?s=$1;
  }
}
```]]></content>
                <pubDate>Thu, 13 Jun 2024 09:50:57 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[解决mysql修改auto_increment不生效]]></title>
                <link>https://www.jefsky.com/blog/336</link>
                <description><![CDATA[### 在开发中经常会需要删除一些记录，并重置自增id的情况 #### 重置自增id `ALTER TABLE tablename auto_increment=1;`  > 注意：修改的auto_increment的值需要大于现有键最大值。否则，语句不报错，也不会生效。...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/336</guid>
                <content><![CDATA[### 在开发中经常会需要删除一些记录，并重置自增id的情况
#### 重置自增id
`ALTER TABLE tablename auto_increment=1;`

> 注意：修改的auto_increment的值需要大于现有键最大值。否则，语句不报错，也不会生效。

### 虽然修改生效了，但是查询表信息的时候，自增键还是原来的记录，这就很纳闷，很强迫症了
`SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name="tablename";`

### 这时候可以执行一下分析表，就可以把表信息更新了
`analyze table tablename;`]]></content>
                <pubDate>Fri, 14 Jun 2024 02:36:38 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkcmf 留言版（前端）]]></title>
                <link>https://www.jefsky.com/blog/337</link>
                <description><![CDATA[## thinkcmf简单版  #### 前端html ```html         姓名                                          電話                                          郵箱                                          地址...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/337</guid>
                <content><![CDATA[## thinkcmf简单版

#### 前端html
```html
<form id="form" name="form" action="%7B:url('portal/GuestBook/add')%7D" method="post">
  <dd>
    <div>姓名</div>
    <div>
      <span>
        <input type="text" placeholder="姓名" data-defaultval="姓名" name="guest_name" value="">
      </span>

    </div>
  <dd>
    <div>電話</div>
    <div>
      <span>
        <input type="text" placeholder="電話" data-defaultval="電話" name="guest_phone" value="">
      </span>

    </div>
  <dd>
    <div>郵箱</div>
    <div>
      <span>
        <input type="text" placeholder="郵箱" data-defaultval="郵箱" name="guest_email" value="">
      </span>

    </div>
  <dd>
    <div>地址</div>
    <div>
      <span>
        <input type="text" placeholder="地址" data-defaultval="地址" name="guest_address" value="">
      </span>

    </div>
  <dd>
    <div>備註</div>
    <div>
      <span>
        <textarea placeholder="備註" data-defaultval="備註" name="guest_content">]]></content>
                <pubDate>Fri, 14 Jun 2024 03:20:10 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[thinkcmf 留言版（后端）]]></title>
                <link>https://www.jefsky.com/blog/338</link>
                <description><![CDATA[thinkcmf 简单版留言模块（后端） ```php]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/338</guid>
                <content><![CDATA[thinkcmf 简单版留言模块（后端）
```php
<?php
/**
 * FILE_NAME GuestBookController.php
 * @date 2024/5/29
 * @author Jefsky
 * @copyright BlackCake
 */

namespace app\portal\controller;

use app\portal\model\GuestBookModel;
use cmf\controller\HomeBaseController;

class GuestBookController extends HomeBaseController
{
    // 新增留言
    public function add()
    {
        $guestBookModel = new GuestBookModel();
        if ($this->request->isPost()) {
            $data = $this->request->param();
            $captcha = $data['captcha'];
            if (!cmf_captcha_check($captcha)) {
                $this->error('captcha error');
            }

            $data['create_time'] = time();
            $result = $guestBookModel->save($data);
            if ($result) {
                $this->success('success');
            } else {
                $this->error('error');
            }
        } else {
            $this->error('error');
        }
    }

}
```]]></content>
                <pubDate>Fri, 14 Jun 2024 03:49:51 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Laravel 多种方法获取当前 URL、请求路径、参数等信息]]></title>
                <link>https://www.jefsky.com/blog/339</link>
                <description><![CDATA[在 Laravel 中，多种方法可以获取当前 URL、请求路径、参数等信息。  ### 使用 URL 类  - `URL::full();` 和 `url()->full();`：这两个方法返回当前请求的完整 URL，包括查询字符串。 - `URL::current();` 和 `url()...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/339</guid>
                <content><![CDATA[在 Laravel 中，多种方法可以获取当前 URL、请求路径、参数等信息。

### 使用 URL 类

- `URL::full();` 和 `url()->full();`：这两个方法返回当前请求的完整 URL，包括查询字符串。
- `URL::current();` 和 `url()->current();`：这两个方法返回当前请求的 URL，但不包括查询字符串。
- `URL::previous();` 和 `url()->previous();`：如果浏览器发送了 `Referer` 头，则此方法将返回之前的 URL。否则，它将返回 `null`。
- `URL::secureAsset('path/to/asset');`：返回指定资源的 HTTPS URL。如果应用配置为使用 HTTPS，它将使用 HTTPS URL；否则，它将使用普通的 HTTP URL。

### 使用 Request 类

- `Request::url();` 和 `$request->url();`：返回当前请求的完整 URL，包括查询字符串。
- `Request::path();` 和 `$request->path();`：返回当前请求的 URI 路径，不包括查询字符串。
- `Request::getRequestUri();` 和 `$request->getRequestUri();`：返回请求 URI（路径和查询字符串）。
- `Request::getUri();` 和 `$request->getUri();`：返回请求 URI 的完整字符串，包括 scheme、host、端口（如果非默认）、路径和查询字符串。
- `$request->route()->getAction();`：返回当前路由操作的相关信息，通常用于获取控制器和方法的名称等。

### 使用 Input 类（不推荐）

在 Laravel 中，`Input` 类已经被废弃，取而代之的是 `Request` 类的各种方法。因此，不建议使用 `Input::url();`，而应该使用 `Request` 类的方法。

### 使用 `$_SERVER`

- `$_SERVER['REQUEST_URI']`：包含当前请求的 URI 路径，可能包括查询字符串。
- `$_SERVER['HTTP_HOST']`：包含当前请求的主机名和端口号（如果非默认）。

### 使用 `Request` 类获取 `$_SERVER` 信息

- `Request::server();` 和 `$request->server();`：返回包含 `$_SERVER` 数组所有信息的数组。
- `Request::server('HTTP_HOST');` 和 `$request->server('HTTP_HOST');`：返回 `$_SERVER` 数组中特定键的值。

### 注意事项

- 当在控制器或路由闭包中使用这些方法时，通常会将 `Request` 类的实例作为参数传递给方法或闭包，因此你可以直接使用 `$request` 变量来调用其方法。
- 在 Laravel 的服务容器和依赖注入的帮助下，你可以轻松地访问 `Request` 类的实例，而无需每次都从全局帮助函数或 `URL` Facade 中获取。
- 在使用 `URL` Facade 或全局帮助函数时，请确保你已经正确配置了你的应用 URL（在 `.env` 文件中的 `APP_URL` 配置项）。]]></content>
                <pubDate>Fri, 14 Jun 2024 05:19:47 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Laravel+Swoole 实现websocket 主动消息推送]]></title>
                <link>https://www.jefsky.com/blog/340</link>
                <description><![CDATA[网络上有太多现成的laravel+swoole配置，搭建聊天系统的例子文章了，可是没有说后端主动推送的 我遇到了这样的需求： 系统已经是laravel+swoole搭建的聊天了，但是需要后端遇到订单状态改变的时候，主动推送给后台系...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/340</guid>
                <content><![CDATA[网络上有太多现成的laravel+swoole配置，搭建聊天系统的例子文章了，可是没有说后端主动推送的
我遇到了这样的需求：
系统已经是laravel+swoole搭建的聊天了，但是需要后端遇到订单状态改变的时候，主动推送给后台系统。我也不想另辟蹊径，感觉可以继续开发swoole的功能来满足这样的需求。
想了个后来觉得挺业余的方案：
创建一个系统用户，然后后端用这个用户来发送消息给管理后台的客服。
在实现这个方案的时候，发现主要是要解决怎么把消息插到websocket服务里面。一直围着“open,message,close”这三个监听状态在纠结。后来在翻swoole wiki的时候发现了事件onRequest
> Swoole\WebSocket\Server 继承自 Swoole\Http\Server，所以 Http\Server 提供的所有 API 和配置项都可以使用。请参考 Swoole\Http\Server 章节。

- 设置了 onRequest 回调，WebSocket\Server 也可以同时作为 HTTP 服务器
- 未设置 onRequest 回调，WebSocket\Server 收到 HTTP 请求后会返回 HTTP 400 错误页面
- 如果想通过接收 HTTP 触发所有 WebSocket 的推送，需要注意作用域的问题，面向过程请使用 global 对 Swoole\WebSocket\Server 进行引用，面向对象可以把 Swoole\WebSocket\Server 设置成一个成员属性

### 来自swoole的demo
https://wiki.swoole.com/zh-cn/#/websocket_server?id=onrequest
```php
class WebSocketServer
{
    public $server;

    public function __construct()
    {
        $this->server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
        $this->server->on('open', function (Swoole\WebSocket\Server $server, $request) {
            echo "server: handshake success with fd{$request->fd}\n";
        });
        $this->server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
            echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
            $server->push($frame->fd, "this is server");
        });
        $this->server->on('close', function ($ser, $fd) {
            echo "client {$fd} closed\n";
        });
        $this->server->on('request', function ($request, $response) {
            // 接收http请求从get获取message参数的值，给用户推送
            // $this->server->connections 遍历所有websocket连接用户的fd，给所有用户推送
            foreach ($this->server->connections as $fd) {
                // 需要先判断是否是正确的websocket连接，否则有可能会push失败
                if ($this->server->isEstablished($fd)) {
                    $this->server->push($fd, $request->get['message']);
                }
            }
        });
        $this->server->start();
    }
}

new WebSocketServer();

```

### 结合我的项目，部分代码是这样的
#### 修改ImCommand类
在ImCommand类的pushHomeLogic方法中正确调用handle中的swoole_server实例，您需要确保该服务器实例在类级别可访问，并且在调用pushHomeLogic方法时能够传递正确的swoole_server实例。以下是修改后的代码示例：

将swoole_server实例设为类成员变量，以便在类的其他方法中访问它。
修改pushHomeLogic方法签名，使其接受swoole_server实例作为参数。
调用pushHomeLogic时传递$server实例。
修改后的代码如下：
```php
<?php namespace App\Console\Commands;

// ... 其他使用声明 ...

class ImCommand extends Command
{
    use SocketPush;

    protected $serverInstance; // 添加一个类成员变量来存储server实例

    // ... 其他方法 ...

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // 创建server并赋值给类成员变量
        $this->serverInstance = new Server("0.0.0.0", 9502);

        // ... 其他handle中的逻辑 ...

        // 监听WebSocket主动推送消息事件
        $this->serverInstance->on('request', function ($request, $response) {
            echo "request-".$request->fd."\n";
            var_dump($request->post);
            // 调用pushHomeLogic时传递$serv实例
            call_user_func([$this, 'pushHomeLogic'], $request, $this->serverInstance);
        });

        // ... 其他handle中的逻辑 ...
    }

    // 修改pushHomeLogic方法以接受$serv参数
    public function pushHomeLogic($request, $serv)
    {
        $data = $request->post;
        $serv->push($data['fd'], $this->success(ImService::$scene[ImService::PUSH_MESSAGE], $data['data']));
    }

    // ... 其他方法 ...
}
```
这样，当在request事件处理器中调用pushHomeLogic方法时，它会使用在handle方法中创建并保存的swoole_server实例进行消息推送。


#### 创建消息服务ImMessageService
```php
    /**
     * CURL请求
     * @param $data
     */
    public static function curl($data)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HEADER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_exec($curl);
        curl_close($curl);
    }

    /**
     * 主动触发
     */
    public static function push($param)
    {
        $to_user_id = 999;	// 后台管理客服id
        $cacheKey = "socket_user:id_".$to_user_id;
        $to_user_info = Redis::get($cacheKey);
        if (empty($to_user_info)) return;
        $to_user_info = json_decode($to_user_info,true);
        $param['fd'] = $to_user_info['fd'];
        self::curl($param);            // 主动推送消息
    }
```

#### 在控制器中直接调用
```php
// 系统推送订单消息
        $param['msg'] = '用户新订单，请注意查看！';
        ImMessageService::push($param);
```]]></content>
                <pubDate>Mon, 24 Jun 2024 08:14:51 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Promise 和ajax的关系]]></title>
                <link>https://www.jefsky.com/blog/341</link>
                <description><![CDATA[Promise 和 AJAX 是 JavaScript 中处理异步操作的两个关键概念，它们之间存在互补关系，但分别解决不同的问题。  **AJAX (Asynchronous JavaScript and XML)**: AJAX 是一种在无需刷新整个网页的情况下，使用 JavaSc...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/341</guid>
                <content><![CDATA[Promise 和 AJAX 是 JavaScript 中处理异步操作的两个关键概念，它们之间存在互补关系，但分别解决不同的问题。

**AJAX (Asynchronous JavaScript and XML)**:
AJAX 是一种在无需刷新整个网页的情况下，使用 JavaScript 向服务器发起请求并处理响应的技术。它允许网页从服务器异步地获取数据，从而实现页面的部分更新。AJAX 可以使用多种数据格式，包括 XML，但现在更常见的是使用 JSON。AJAX 请求传统上是基于回调函数来处理异步操作的结果，这意味着当请求完成时会执行一个指定的函数。

**Promise**:
Promise 是 JavaScript ES6 引入的一种原生对象，用于处理异步操作。它提供了一种更加优雅的方式来组织和管理异步代码，避免了“回调地狱”（即回调函数的多重嵌套）。Promise 有两个状态：pending（等待中）和 settled（已解决，分为fulfilled或rejected）。通过链式调用 `.then` 和 `.catch` 方法，可以清晰地定义成功和失败的处理逻辑，使得异步代码更加易于阅读和维护。

**Promise 与 AJAX 的关系**:
虽然 AJAX 是一种具体的通信技术，用于向服务器发送异步请求，而 Promise 是一种编程模式，用于处理任何类型的异步操作，但它们可以很好地结合起来使用。实际上，现代的 AJAX 库（如 Axios）和一些框架（如 jQuery）已经内置了对 Promise 的支持，使得 AJAX 请求的处理变得更加简洁和易于理解。

例如，你可以在发送 AJAX 请求时返回一个 Promise，然后通过 `.then` 处理成功的响应，通过 `.catch` 处理错误。这样，即使 AJAX 请求是异步的，你也可以用一种线性的、易于理解的方式编写处理这些请求的代码。因此，Promise 提升了 AJAX 编程的可读性和可维护性。]]></content>
                <pubDate>Tue, 25 Jun 2024 05:23:28 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[axios]]></title>
                <link>https://www.jefsky.com/blog/342</link>
                <description><![CDATA[Axios 是一个基于 promise 的 HTTP 库，可用于浏览器和 node.js 中。它是目前非常流行的发送 AJAX 请求的工具，因为它简单易用、功能强大，并且支持取消请求、自动转换请求和响应数据等多种特性。以下是 Axios 的几...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/342</guid>
                <content><![CDATA[Axios 是一个基于 promise 的 HTTP 库，可用于浏览器和 node.js 中。它是目前非常流行的发送 AJAX 请求的工具，因为它简单易用、功能强大，并且支持取消请求、自动转换请求和响应数据等多种特性。以下是 Axios 的几个核心特点和使用示例：

### 核心特点

1. **基于 Promise**: Axios 使用 Promise 实现，这使得处理异步请求变得非常直观和易于链式调用，避免了回调地狱。
2. **跨平台**: 既可以在浏览器中使用，也可以在 Node.js 服务器端运行，提供了统一的 API。
3. **拦截器**: 提供请求拦截器和响应拦截器，可以在请求发出前或者接收到响应后进行一些预处理。
4. **自动转换JSON**: Axios 能够自动将 JavaScript 对象转换为 JSON 字符串，并将接收到的 JSON 字符串转换为 JavaScript 对象。
5. **取消请求**: Axios 支持取消已发出的请求，这对于提升用户体验和避免不必要的服务器负载非常有用。
6. **上传和下载进度**: 可以监控上传和下载的进度。

### 使用示例

#### 发送 GET 请求

```javascript
axios.get('https://api.example.com/data')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error("Error fetching data:", error);
  });
```

#### 发送 POST 请求

```javascript
axios.post('https://api.example.com/data', {
    key: 'value'
  })
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error("Error posting data:", error);
  });
```

#### 使用拦截器

```javascript
// 添加请求拦截器
axios.interceptors.request.use(config => {
    // 在发送请求之前做些什么，比如添加Token
    config.headers.Authorization = `Bearer ${token}`;
    return config;
  }, error => {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(response => {
    // 对响应数据做点什么
    return response;
  }, error => {
    // 对响应错误做点什么
    return Promise.reject(error);
});
```

Axios 的这些特性使得它成为了很多现代Web开发项目中处理HTTP请求的首选库。]]></content>
                <pubDate>Tue, 25 Jun 2024 05:24:04 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Animate.css动画快查表]]></title>
                <link>https://www.jefsky.com/blog/344</link>
                <description><![CDATA[#### Animate.css动画快查表       bounce             弹跳     flash              闪烁     pulse              放大，缩小     rubberBand         放大，缩小，弹簧     shake              左右晃动     headS...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/344</guid>
                <content><![CDATA[#### Animate.css动画快查表


    bounce             弹跳
    flash              闪烁
    pulse              放大，缩小
    rubberBand         放大，缩小，弹簧
    shake              左右晃动
    headShake          左右小幅晃动
    swing              左右扇形摇摆
    tada               放大，左右上下晃动，缩小
    wobble             左右小幅(圆点较远)扇形摇摆
    jello              左右左右上下晃动
    
    bounceIn           重复放大缩小
    bounceInDown       从上到下出现，弹簧
    bounceInLeft       从左到右出现，弹簧
    bounceInRight      从右到左出现，弹簧
    bounceInUp         从下到上出现，弹簧
    bounceOut          从常规到小消失，弹簧
    bounceOutDown      从常规到小，从下方消失，弹簧
    bounceOutLeft      从常规到小，从左方消失，弹簧
    bounceOutRight     从常规到小，从右方消失，弹簧
    bounceOutUp        从常规到小，从上方消失，弹簧
    
    fadeIn             渐现
    fadeInDown         渐现，从上到下
    fadeInDownBig      渐现，从上到下，滑动距离较长
    fadeInLeft         渐现，从左到右
    fadeInLeftBig      渐现，从左到右，滑动距离较长
    fadeInRight        渐现，从右到左
    fadeInRightBig     渐现，从右到左，滑动距离较长
    fadeInUp           渐现，从下到上
    fadeInUpBig        渐现，从下到上，滑动距离较长
    fadeOut            渐隐
    fadeOutDown        渐隐，从上到下
    fadeOutDownBig     渐隐，从上到下，滑动距离较长
    fadeOutLeft        渐隐，从左到右
    fadeOutLeftBig     渐隐，从左到右，滑动距离较长
    fadeOutRight       渐隐，从右到左
    fadeOutRightBig    渐隐，从右到左，滑动距离较长
    fadeOutUp          渐隐，从下到上
    fadeOutUpBig       渐隐，从下到上，滑动距离较长
    
    flip               中心Y轴旋转，放大，缩小
    flipInX            元素中心X轴旋转
    flipInY            元素中心Y轴旋转
    flipOutX           中心X轴旋转，消失
    flipOutY           中心Y轴旋转，消失
    
    lightSpeedIn       从右到左，平行四边形，左上角突出进入
    lightSpeedOut      从左到右，平行四边形，左上角突出进入
    
    rotateIn           元素中心顺时针旋转进入
    rotateInDownLeft   元素左外长半径顺时针旋转进入
    rotateInDownRight  元素右外长半径逆时针旋转进入
    rotateInUpLeft     元素左外长半径逆时针旋转进入     
    rotateInUpRight    元素右外长半径顺时针旋转进入
    rotateOut          元素中心顺时针旋转消失
    rotateOutDownLeft  元素左外长半径顺时针旋转消失
    rotateOutDownRight 元素右外长半径逆时针旋转消失
    rotateOutUpLeft    元素左外长半径逆时针旋转消失
    rotateOutUpRight   元素右外长半径顺时针旋转消失
    
    hinge              从右上到坐下，顺时针旋转，从上到下消失
    
    rollIn             元素左外长半径顺时针旋转，平滑进入
    rollOut            元素右外长半径顺时针旋转，平滑进入
    
    zoomIn             元素由小变大进入
    zoomInDown         元素由小变大，从上方进入
    zoomInLeft         元素由小变大，从左方进入
    zoomInRight        元素由小变大，从右方进入
    zoomInUp           元素由小变大，从下方进入
    zoomOut            元素由大变小，消失
    zoomOutDown        元素由大变小，从下方消失
    zoomOutLeft        元素由大变小，从左方消失
    zoomOutRight       元素由大变小，从右方消失
    zoomOutUp          元素由大变小，从上方消失
    
    slideInDown        元素从上到下，平滑进入
    slideInLeft        元素从左到右，平滑进入
    slideInRight       元素从右到左，平滑进入
    slideInUp          元素从下到上，平滑进入
    slideOutDown       元素从上到下，平滑消失
    slideOutLeft       元素从右到左，平滑消失
    slideOutRight      元素从左到右，平滑消失
    slideOutUp         元素从下到上，平滑消失]]></content>
                <pubDate>Tue, 23 Jul 2024 05:12:01 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[使用 Laravel 发起HTTP 请求到云函数]]></title>
                <link>https://www.jefsky.com/blog/345</link>
                <description><![CDATA[## 概述  1. uniapp和众多的小程序都用云函数，这里以 dcloud 的 unipush 云函数作为例子简述  2. 也可以作为传统服务器针对 unipush2.0 应该怎么部署的例子  > unipush 2.0 取消了传统服务器的身份验证，可直接通过...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/345</guid>
                <content><![CDATA[## 概述

1. uniapp和众多的小程序都用云函数，这里以 dcloud 的 unipush 云函数作为例子简述

2. 也可以作为传统服务器针对 unipush2.0 应该怎么部署的例子

> unipush 2.0 取消了传统服务器的身份验证，可直接通过云函数 url 化来处理

## 实践
###使用 GuzzleHttp\Client 构建请求
1. 安装 Guzzle：首先需要安装 Guzzle HTTP 客户端库，可以通过 Composer 安装：

	`composer require guzzlehttp/guzzle`

2. 使用 Guzzle 发起请求：接下来，我们将使用 Guzzle 来构建请求。

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

class YourController extends Controller
{
    public function test_unipush()
    {
        $data = [
            "cids" => ['15f2d1111de1ef5aa3f8911dab53ffb2'], // 设备id，注意这里使用数组形式
            "title" => 'Test', // 标题
            "content" => '123', // 内容
            "payload" => '', // 数据
            "force_notification" => 'true', // 自动创建“通知栏消息”
            "request_id" => '12345678982', // 请求唯一标识号
        ];

        // 确保数据被正确编码为 JSON
        $jsonData = json_encode($data);

        // 输出 JSON 编码后的数据，以便验证
        var_dump($jsonData);

        try {
            $client = new Client();
            $response = $client->request('POST', 'https://your-cloud-function-url.com/send-push-notification', [
                'headers' => [
                    'Content-Type' => 'application/json',
                ],
                'body' => $jsonData,
            ]);

            return response()->json(json_decode((string) $response->getBody(), true));
        } catch (RequestException $e) {
            // 处理异常情况
            return response()->json([
                'error' => 'An error occurred while sending the request.',
                'message' => $e->getMessage(),
            ], 500);
        }
    }
}

```

### 注意事项

1. Guzzle 安装：确保已经通过 Composer 安装了 Guzzle。

2. 请求构造：使用 Guzzle 的 Client 类来构造请求，并确保请求体被正确设置。

3. 错误处理：使用 Guzzle 提供的异常处理机制来捕获并处理异常。

### 如何测试

1. 使用 var_dump(): 访问 /test_unipush 端点，您将在控制台看到 JSON 编码后的数据结构的输出。

2. 检查请求：确认请求是否正确发送到目标 URL。

#### 示例

当您访问 /test_unipush 端点时，您将看到类似以下的输出：

```json
string(135) "{"cids":["15f2d1111de1ef5aa3f8911dab53ffb2"],"title":"Test","content":"123","payload":"","force_notification":"true","request_id":"12345678982"}"
```]]></content>
                <pubDate>Sun, 18 Aug 2024 02:46:11 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[laravel+filament搭建cms系统]]></title>
                <link>https://www.jefsky.com/blog/346</link>
                <description><![CDATA[使用 **Laravel** 和 **Filament** 搭建一个内容管理系统（CMS）是一个高效且灵活的选择。**Filament** 提供了现代化的管理后台界面，使内容管理变得直观和高效。以下是一个详细的步骤指南，帮助您从零开始搭建一个...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/346</guid>
                <content><![CDATA[使用 **Laravel** 和 **Filament** 搭建一个内容管理系统（CMS）是一个高效且灵活的选择。**Filament** 提供了现代化的管理后台界面，使内容管理变得直观和高效。以下是一个详细的步骤指南，帮助您从零开始搭建一个功能强大的 CMS 系统。

## 目录

1. [项目初始化](#1-项目初始化)
2. [安装 Filament](#2-安装-filament)
3. [定义数据模型](#3-定义数据模型)
4. [创建 Filament 资源](#4-创建-filament-资源)
5. [配置权限和角色](#5-配置权限和角色)
6. [创建内容管理功能](#6-创建内容管理功能)
7. [前端集成（可选）](#7-前端集成可选)
8. [额外功能](#8-额外功能)
9. [部署](#9-部署)
10. [参考资源](#10-参考资源)
11. [总结](#11-总结)

---

## 1. 项目初始化

### 1.1 创建新的 Laravel 项目

如果尚未创建 Laravel 项目，可以使用 Composer 创建一个新项目：

```bash
composer create-project laravel/laravel cms-system
```

进入项目目录：

```bash
cd cms-system
```

### 1.2 设置数据库连接

在 `.env` 文件中配置数据库连接：

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cms_system
DB_USERNAME=root
DB_PASSWORD=your_password
```

创建数据库（例如使用 MySQL）：

```sql
CREATE DATABASE cms_system;
```

### 1.3 运行迁移

运行初始迁移以创建必要的表：

```bash
php artisan migrate
```

## 2. 安装 Filament

### 2.1 使用 Composer 安装 Filament

```bash
composer require filament/filament
```

### 2.2 运行 Filament 安装命令

```bash
php artisan filament:install
```

安装过程中，Filament 会提示您创建管理员用户。按照提示完成安装。

### 2.3 构建前端资源

安装前端依赖并构建资源：

```bash
npm install
npm run build
```

在开发环境中，可以使用：

```bash
npm run dev
```

确保 `public/build/manifest.json` 文件存在。

## 3. 定义数据模型

根据您的 CMS 需求，定义需要管理的内容。例如，假设您要管理文章（Posts）、分类（Categories）、标签（Tags）等。

### 3.1 创建 Eloquent 模型和迁移

以文章（Post）为例：

```bash
php artisan make:model Post -m
```

编辑迁移文件 `database/migrations/xxxx_xx_xx_create_posts_table.php`：

```php
public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('content');
        $table->foreignId('category_id')->constrained()->onDelete('cascade');
        $table->timestamps();
    });
}
```

同样，为分类（Category）创建模型和迁移：

```bash
php artisan make:model Category -m
```

编辑迁移文件 `database/migrations/xxxx_xx_xx_create_categories_table.php`：

```php
public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}
```

运行迁移：

```bash
php artisan migrate
```

### 3.2 定义模型关系

在 `App\Models\Post.php` 中：

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'content', 'category_id'];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}
```

在 `App\Models\Category.php` 中：

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use HasFactory;

    protected $fillable = ['name'];

    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
```

## 4. 创建 Filament 资源

### 4.1 创建 Post 资源

使用 Filament 提供的 Artisan 命令生成资源：

```bash
php artisan make:filament-resource Post
```

这将在 `app/Filament/Resources/PostResource` 目录下生成必要的文件。

### 4.2 配置 Post 资源

编辑 `app/Filament/Resources/PostResource.php`：

```php
<?php

namespace App\Filament\Resources;

use App\Filament\Resources\PostResource\Pages;
use App\Models\Post;
use Filament\Forms;
use Filament\Tables;
use Filament\Resources\Resource;

class PostResource extends Resource
{
    protected static ?string $model = Post::class;

    protected static ?string $navigationIcon = 'heroicon-o-document-text';

    protected static ?int $navigationSort = 1;

    public static function form(Forms\Form $form): Forms\Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Forms\Components\Select::make('category_id')
                    ->relationship('category', 'name')
                    ->required(),
                Forms\Components\RichEditor::make('content')
                    ->required(),
            ]);
    }

    public static function table(Tables\Table $table): Tables\Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('title')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('category.name')->label('Category')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListPosts::route('/'),
            'create' => Pages\CreatePost::route('/create'),
            'edit' => Pages\EditPost::route('/{record}/edit'),
        ];
    }
}
```

### 4.3 创建 Category 资源

同样地，创建并配置分类资源：

```bash
php artisan make:filament-resource Category
```

编辑 `app/Filament/Resources/CategoryResource.php`：

```php
<?php

namespace App\Filament\Resources;

use App\Filament\Resources\CategoryResource\Pages;
use App\Models\Category;
use Filament\Forms;
use Filament\Tables;
use Filament\Resources\Resource;

class CategoryResource extends Resource
{
    protected static ?string $model = Category::class;

    protected static ?string $navigationIcon = 'heroicon-o-collection';

    protected static ?int $navigationSort = 2;

    public static function form(Forms\Form $form): Forms\Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('name')
                    ->required()
                    ->maxLength(255),
            ]);
    }

    public static function table(Tables\Table $table): Tables\Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('name')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListCategories::route('/'),
            'create' => Pages\CreateCategory::route('/create'),
            'edit' => Pages\EditCategory::route('/{record}/edit'),
        ];
    }
}
```

### 4.4 创建其他资源

根据需要，创建更多的资源，如标签（Tags）、用户（Users）、媒体（Media）等。

## 5. 配置权限和角色

为了确保只有授权用户可以访问和管理 CMS 内容，建议使用 **Spatie Laravel Permission** 包来管理角色和权限。

### 5.1 安装 Spatie Laravel Permission

```bash
composer require spatie/laravel-permission
```

### 5.2 发布配置和迁移

```bash
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
```

### 5.3 配置 User 模型

在 `App\Models\User.php` 中添加 `HasRoles` trait：

```php
<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // 其他代码...
}
```

### 5.4 创建角色和权限

使用 Tinker 或编写 Seeder 来创建角色和权限：

```bash
php artisan tinker
```

在 Tinker 中：

```php
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use App\Models\User;

// 创建角色
$adminRole = Role::create(['name' => 'admin']);
$editorRole = Role::create(['name' => 'editor']);

// 创建权限
$managePosts = Permission::create(['name' => 'manage posts']);
$manageCategories = Permission::create(['name' => 'manage categories']);

// 分配权限给角色
$adminRole->givePermissionTo(['manage posts', 'manage categories']);
$editorRole->givePermissionTo(['manage posts']);

// 查找用户并分配角色
$user = User::where('email', 'admin@example.com')->first();

if ($user) {
    $user->assignRole('admin');
} else {
    $user = User::create([
        'name' => 'Admin User',
        'email' => 'admin@example.com',
        'password' => bcrypt('password'), // 请使用更安全的密码
    ]);
    $user->assignRole('admin');
}
```

### 5.5 配置 Filament 中间件

在 `config/filament.php` 中，确保 Filament 只允许特定角色的用户访问后台：

```php
'auth' => [
    'guard' => 'web',
    'passwords' => 'users',
    'middleware' => [
        'web',
        'auth',
        function ($request, $next) {
            if (!$request->user() || !$request->user()->hasRole('admin')) {
                abort(403);
            }
            return $next($request);
        },
    ],
],
```

## 6. 创建内容管理功能

根据 CMS 的需求，创建更多的内容管理资源，如页面（Pages）、媒体（Media）、菜单（Menus）等。

### 示例：创建 Page 资源

```bash
php artisan make:model Page -m
php artisan make:filament-resource Page
```

编辑 `database/migrations/xxxx_xx_xx_create_pages_table.php`：

```php
public function up()
{
    Schema::create('pages', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->string('slug')->unique();
        $table->text('content');
        $table->timestamps();
    });
}
```

运行迁移：

```bash
php artisan migrate
```

编辑 `app/Filament/Resources/PageResource.php`：

```php
<?php

namespace App\Filament\Resources;

use App\Filament\Resources\PageResource\Pages;
use App\Models\Page;
use Filament\Forms;
use Filament\Tables;
use Filament\Resources\Resource;

class PageResource extends Resource
{
    protected static ?string $model = Page::class;

    protected static ?string $navigationIcon = 'heroicon-o-document';

    protected static ?int $navigationSort = 3;

    public static function form(Forms\Form $form): Forms\Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Forms\Components\TextInput::make('slug')
                    ->required()
                    ->maxLength(255)
                    ->unique(ignoreRecord: true),
                Forms\Components\RichEditor::make('content')
                    ->required(),
            ]);
    }

    public static function table(Tables\Table $table): Tables\Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('id')->sortable(),
                Tables\Columns\TextColumn::make('title')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('slug')->sortable()->searchable(),
                Tables\Columns\TextColumn::make('created_at')->dateTime(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListPages::route('/'),
            'create' => Pages\CreatePage::route('/create'),
            'edit' => Pages\EditPage::route('/{record}/edit'),
        ];
    }
}
```

## 7. 前端集成（可选）

如果需要在前端展示 CMS 内容，可以使用 Blade 模板或构建 API 端点。

### 7.1 使用 Blade 模板

创建前端视图来展示 CMS 内容。例如，在 `resources/views/pages.blade.php` 中：

```blade
@extends('layouts.app')

@section('content')
    <h1>Pages</h1>
    @foreach($pages as $page)
        <div>
            <h2>{{ $page->title }}</h2>
            <div>{!! $page->content !!}</div>
        </div>
    @endforeach
@endsection
```

在控制器中获取数据：

```php
<?php

namespace App\Http\Controllers;

use App\Models\Page;

class PageController extends Controller
{
    public function index()
    {
        $pages = Page::all();
        return view('pages', compact('pages'));
    }

    public function show($slug)
    {
        $page = Page::where('slug', $slug)->firstOrFail();
        return view('page', compact('page'));
    }
}
```

定义路由：

```php
use App\Http\Controllers\PageController;

Route::get('/pages', [PageController::class, 'index']);
Route::get('/pages/{slug}', [PageController::class, 'show']);
```

### 7.2 构建 API

如果前端需要使用 JavaScript 框架（如 Vue.js、React），可以构建 API 端点。

创建 API 资源：

```bash
php artisan make:controller Api/PageController --api
```

编辑 `app/Http/Controllers/Api/PageController.php`：

```php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Resources\PageResource;
use App\Models\Page;
use Illuminate\Http\Request;

class PageController extends Controller
{
    public function index()
    {
        return PageResource::collection(Page::all());
    }

    public function show($slug)
    {
        $page = Page::where('slug', $slug)->firstOrFail();
        return new PageResource($page);
    }
}
```

创建资源类：

```bash
php artisan make:resource PageResource
```

编辑 `app/Http/Resources/PageResource.php`：

```php
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PageResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'slug' => $this->slug,
            'content' => $this->content,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
```

定义 API 路由：

```php
use App\Http\Controllers\Api\PageController;

Route::prefix('api')->group(function () {
    Route::get('/pages', [PageController::class, 'index']);
    Route::get('/pages/{slug}', [PageController::class, 'show']);
});
```

## 8. 额外功能

### 8.1 媒体管理

Filament 提供了一个强大的媒体库，可以管理上传的文件。

### 8.2 用户角色与权限

进一步配置用户角色和权限，以满足 CMS 的访问控制需求。

### 8.3 搜索和过滤

在 Filament 资源中添加搜索和过滤功能，以便更高效地管理内容。

## 9. 部署

在开发完成后，将 CMS 系统部署到生产环境。确保前端资源已构建，并且服务器配置正确。

### 9.1 构建前端资源

```bash
npm run build
```

### 9.2 运行迁移

```bash
php artisan migrate --force
```

### 9.3 清理和缓存

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

### 9.4 设置文件权限

确保 `storage` 和 `bootstrap/cache` 目录具有正确的权限。

```bash
chmod -R 755 storage
chmod -R 755 bootstrap/cache
chown -R www-data:www-data storage
chown -R www-data:www-data bootstrap/cache
```

## 10. 参考资源

- [Filament 官方文档](https://filamentphp.com/docs)
- [Spatie Laravel Permission 文档](https://spatie.be/docs/laravel-permission/v5/introduction)
- [Laravel 官方文档](https://laravel.com/docs)
- [Laravel Vite 文档](https://laravel.com/docs/10.x/vite)

## 11. 总结

通过以上步骤，您可以使用 **Laravel** 和 **Filament** 搭建一个功能强大的 CMS 系统。**Filament** 提供了一个现代化的后台管理界面，使内容管理变得更加高效和直观。结合 **Laravel** 的强大功能和扩展生态系统，您可以根据需求进一步定制和扩展 CMS 的功能。

### 关键步骤回顾：

1. **项目初始化**：创建 Laravel 项目并配置数据库。
2. **安装 Filament**：使用 Composer 安装 Filament 并运行安装命令。
3. **定义数据模型**：创建 Eloquent 模型和迁移，定义模型关系。
4. **创建 Filament 资源**：生成并配置 Filament 资源以管理内容。
5. **配置权限和角色**：使用 Spatie Laravel Permission 管理用户角色和权限。
6. **创建内容管理功能**：根据需求创建更多的内容管理资源。
7. **前端集成**：使用 Blade 模板或构建 API 端点展示内容。
8. **额外功能**：实现媒体管理、搜索过滤等高级功能。
9. **部署**：构建前端资源，运行迁移，设置文件权限并部署到生产环境。

如果在搭建过程中遇到任何问题或需要进一步的帮助，请随时提问，我将乐意为您提供更多的指导和支持！]]></content>
                <pubDate>Thu, 10 Oct 2024 09:38:20 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[基于uni-app和 Three.js 开发一款DIY蛋糕应用]]></title>
                <link>https://www.jefsky.com/blog/347</link>
                <description><![CDATA[# DIYCakeApp 基于**uni-app** 和 **Three.js** 开发一款DIY蛋糕应用。将涵盖项目设置、3D模型创建、用户交互实现、界面设计以及部署等各个方面。  ## 目录  1. [项目准备](#项目准备) 2. [环境搭建](#环境搭建) 3....]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/347</guid>
                <content><![CDATA[# DIYCakeApp
基于**uni-app** 和 **Three.js** 开发一款DIY蛋糕应用。将涵盖项目设置、3D模型创建、用户交互实现、界面设计以及部署等各个方面。

## 目录

1. [项目准备](#项目准备)
2. [环境搭建](#环境搭建)
3. [创建uni-app项目](#创建uni-app项目)
4. [集成Three.js](#集成threejs)
5. [设计3D蛋糕模型](#设计3d蛋糕模型)
6. [实现用户交互](#实现用户交互)
7. [UI设计与集成](#ui设计与集成)
8. [测试与调试](#测试与调试)
9. [部署与发布](#部署与发布)
10. [资源与参考](#资源与参考)

---

## 项目准备

在开始开发之前，确保具备以下知识和工具：

- **基本知识**：
  - JavaScript、HTML、CSS
  - Vue.js（因为uni-app基于Vue）
  - Three.js的基础知识

- **工具**：
  - 代码编辑器（如VS Code）
  - Node.js 和 npm
  - HBuilderX（官方推荐的uni-app开发工具）
  
## 环境搭建

### 1. 安装Node.js和npm

首先，确保的开发环境中安装了Node.js和npm。可以从 [Node.js官网](https://nodejs.org/) 下载并安装最新的LTS版本。

```bash
node -v
npm -v
```

### 2. 安装HBuilderX

HBuilderX 是由DCloud推出的支持uni-app开发的IDE。下载并安装HBuilderX：

- [HBuilderX下载链接](https://www.dcloud.io/hbuilderx.html)

### 3. 安装uni-app CLI（可选）

使用命令行，可以安装uni-app的CLI工具：

```bash
npm install -g @vue/cli
npm install -g @dcloudio/uni-app
```

## 创建uni-app项目

### 1. 使用HBuilderX创建项目

1. 打开HBuilderX。
2. 点击“文件” > “新建” > “项目”。
3. 选择“uni-app”模板，填写项目名称（如`DIYCakeApp`），选择项目保存路径，点击“创建”。

### 2. 使用命令行创建项目（可选）

如果使用命令行：

```bash
vue create -p dcloudio/uni-preset-vue DIYCakeApp
cd DIYCakeApp
```

## 集成Three.js

### 1. 安装Three.js

在项目根目录下，通过npm安装Three.js：

```bash
npm install three
```

### 2. 引入Three.js

在需要使用Three.js的页面或组件中引入：

```javascript
import * as THREE from 'three';
```

## 设计3D蛋糕模型

### 1. 准备3D模型

使用Three.js自带的几何体（如圆柱体、球体等）组合成蛋糕，也可以使用3D建模软件（如Blender）创建复杂模型，并导出为Three.js支持的格式（如GLTF）。

### 2. 使用Three.js创建基本蛋糕模型

以下是一个简单的蛋糕模型示例：

```javascript
// 创建场景
const scene = new THREE.Scene();

// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;

// 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);

// 将渲染器的DOM添加到页面
document.getElementById('three-container').appendChild(renderer.domElement);

// 添加蛋糕主体（圆柱体）
const cakeGeometry = new THREE.CylinderGeometry(1, 1, 0.5, 32);
const cakeMaterial = new THREE.MeshBasicMaterial({ color: 0xff69b4 });
const cake = new THREE.Mesh(cakeGeometry, cakeMaterial);
scene.add(cake);

// 添加蛋糕装饰（例如球体表示水果）
const decorationGeometry = new THREE.SphereGeometry(0.1, 16, 16);
const decorationMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const decoration = new THREE.Mesh(decorationGeometry, decorationMaterial);
decoration.position.set(0.5, 0.3, 0);
scene.add(decoration);

// 渲染循环
function animate() {
  requestAnimationFrame(animate);
  
  // 旋转蛋糕
  cake.rotation.y += 0.01;
  decoration.rotation.y += 0.02;
  
  renderer.render(scene, camera);
}
animate();
```

### 3. 在uni-app中集成3D场景

在uni-app页面中，添加一个用于渲染Three.js的容器。例如，在`pages/index/index.vue`中：

```html
<template>
  <view class="container">
    <view id="three-container" class="three-container"></view>
  </view>
</template>

<script>
import * as THREE from 'three';

export default {
  onReady() {
    this.initThree();
  },
  methods: {
    initThree() {
      // 与上述示例相同的Three.js初始化代码
      const scene = new THREE.Scene();
      const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
      camera.position.z = 5;

      const renderer = new THREE.WebGLRenderer({ antialias: true });
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.getElementById('three-container').appendChild(renderer.domElement);

      const cakeGeometry = new THREE.CylinderGeometry(1, 1, 0.5, 32);
      const cakeMaterial = new THREE.MeshBasicMaterial({ color: 0xff69b4 });
      const cake = new THREE.Mesh(cakeGeometry, cakeMaterial);
      scene.add(cake);

      const decorationGeometry = new THREE.SphereGeometry(0.1, 16, 16);
      const decorationMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
      const decoration = new THREE.Mesh(decorationGeometry, decorationMaterial);
      decoration.position.set(0.5, 0.3, 0);
      scene.add(decoration);

      function animate() {
        requestAnimationFrame(animate);
        cake.rotation.y += 0.01;
        decoration.rotation.y += 0.02;
        renderer.render(scene, camera);
      }
      animate();
    }
  }
}
</script>

<style>
.container {
  width: 100%;
  height: 100vh;
}
.three-container {
  width: 100%;
  height: 100%;
}
</style>
```

## 实现用户交互

为了让用户能够DIY蛋糕，需要实现以下交互功能：

1. **选择蛋糕基底**：不同的蛋糕形状或口味。
2. **添加装饰**：添加水果、奶油、糖霜等装饰。
3. **颜色选择**：更改蛋糕和装饰的颜色。
4. **视角控制**：允许用户旋转、缩放和移动视角。

### 1. 添加控制器

使用**OrbitControls**来实现视角控制。首先，引入OrbitControls：

```javascript
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
```

然后，在初始化Three.js时添加控制器：

```javascript
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 使动画更流畅
```

在渲染循环中更新控制器：

```javascript
function animate() {
  requestAnimationFrame(animate);
  
  controls.update(); // 更新控制器

  cake.rotation.y += 0.01;
  decoration.rotation.y += 0.02;
  
  renderer.render(scene, camera);
}
```

### 2. 添加UI控件

在uni-app中使用`<button>`或自定义组件来作为用户交互的控件。例如，添加颜色选择按钮：

```html
<template>
  <view class="container">
    <view id="three-container" class="three-container"></view>
    <view class="controls">
      <button>粉红色</button>
      <button>蓝紫色</button>
      <!-- 更多颜色按钮 -->
    </view>
  </view>
</template>

<script>
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

export default {
  data() {
    return {
      cakeMaterial: null,
      decorationMaterial: null,
    }
  },
  onReady() {
    this.initThree();
  },
  methods: {
    initThree() {
      const scene = new THREE.Scene();
      const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
      camera.position.z = 5;

      const renderer = new THREE.WebGLRenderer({ antialias: true });
      renderer.setSize(window.innerWidth, window.innerHeight);
      document.getElementById('three-container').appendChild(renderer.domElement);

      const cakeGeometry = new THREE.CylinderGeometry(1, 1, 0.5, 32);
      this.cakeMaterial = new THREE.MeshBasicMaterial({ color: 0xff69b4 });
      const cake = new THREE.Mesh(cakeGeometry, this.cakeMaterial);
      scene.add(cake);

      const decorationGeometry = new THREE.SphereGeometry(0.1, 16, 16);
      this.decorationMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
      const decoration = new THREE.Mesh(decorationGeometry, this.decorationMaterial);
      decoration.position.set(0.5, 0.3, 0);
      scene.add(decoration);

      const controls = new OrbitControls(camera, renderer.domElement);
      controls.enableDamping = true;

      const animate = () => {
        requestAnimationFrame(animate);
        controls.update();
        cake.rotation.y += 0.01;
        decoration.rotation.y += 0.02;
        renderer.render(scene, camera);
      };
      animate();
    },
    changeCakeColor(color) {
      if (this.cakeMaterial) {
        this.cakeMaterial.color.set(color);
      }
    }
  }
}
</script>

<style>
.container {
  position: relative;
  width: 100%;
  height: 100vh;
}
.three-container {
  width: 100%;
  height: 100%;
}
.controls {
  position: absolute;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: 10px;
}
button {
  padding: 10px 20px;
  background-color: #ffffffaa;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}
button:hover {
  background-color: #ffffff;
}
</style>
```

### 3. 动态添加装饰

允许用户从预设的装饰列表中选择并添加到蛋糕上。以下是一个简单的实现示例：

```javascript
methods: {
  // ...之前的代码
  addDecoration(color) {
    const decorationGeometry = new THREE.SphereGeometry(0.1, 16, 16);
    const decorationMaterial = new THREE.MeshBasicMaterial({ color });
    const decoration = new THREE.Mesh(decorationGeometry, decorationMaterial);
    decoration.position.set(Math.random() - 0.5, Math.random() * 0.5, Math.random() - 0.5);
    this.$refs.scene.add(decoration);
  }
}
```

在UI中添加按钮调用`addDecoration`方法：

```html
<button>添加绿色装饰</button>
<button>添加蓝色装饰</button>
```

**注意**：确保在Three.js的初始化代码中将场景对象存储在`this.$refs.scene`或其他可访问的位置。

## UI设计与集成

为了提供良好的用户体验，UI设计至关重要。以下是一些建议：

### 1. 布局设计

- **3D视图区域**：占据大部分屏幕，用于展示和交互3D蛋糕。
- **控制面板**：放置在侧边或底部，用于选择蛋糕基底、添加装饰、颜色选择等。
- **预览与保存**：提供预览功能和保存定制蛋糕的选项。

### 2. 使用uni-app的组件

利用uni-app丰富的组件库来构建界面，例如：

- `uView` 或 `Vant Weapp` 等第三方UI库，可以加快开发速度。
- 使用`<button>`、`<picker>`、`<slider>`等组件实现用户交互。

### 3. 响应式设计

确保应用在不同设备（手机、平板等）上都有良好的显示效果。利用CSS的Flex布局或Grid布局来实现响应式设计。

```css
.container {
  display: flex;
  flex-direction: column;
  height: 100vh;
}
.three-container {
  flex: 1;
}
.controls {
  padding: 10px;
  background-color: #f0f0f0;
}
```

## 测试与调试

### 1. 使用HBuilderX的预览功能

HBuilderX提供了丰富的预览选项，可以在手机、浏览器中实时预览应用效果。

- **手机预览**：通过扫码预览在真实设备上的效果。
- **浏览器预览**：在浏览器中打开，方便调试和测试。

### 2. 调试Three.js

Three.js的渲染问题可以通过浏览器的开发者工具进行调试。检查控制台错误、查看渲染效果是否符合预期。

### 3. 性能优化

- **减少多边形数量**：复杂的3D模型会影响性能，尽量优化模型。
- **使用纹理贴图**：合理使用纹理可以减少几何体的复杂度。
- **启用渲染器的性能选项**：如抗锯齿、阴影等根据需要开启或关闭。

## 部署与发布

### 1. 打包应用

使用HBuilderX的打包功能，将应用打包成Web应用、小程序、APP等格式。

- 点击“发行” > 选择目标平台（如Web、微信小程序、APP等）。
- 按照指引完成打包流程。

### 2. 发布到应用商店或服务器

根据目标平台，将应用发布到相应的应用商店或部署到Web服务器。

- **Web应用**：将打包后的文件上传到服务器，配置域名和SSL等。
- **移动应用**：通过相应的应用商店（如Apple App Store、Google Play）发布。
- **小程序**：通过微信公众平台等发布。

### 3. 持续更新与维护

根据用户反馈和需求，不断优化和更新应用，修复bug，添加新功能。

## 资源与参考

### 官方文档

- **uni-app**：
  - 官方网站：[https://uniapp.dcloud.io/](https://uniapp.dcloud.io/)
  - 文档：[https://uniapp.dcloud.io/docs](https://uniapp.dcloud.io/docs)

- **Three.js**：
  - 官方网站：[https://threejs.org/](https://threejs.org/)
  - 文档：[https://threejs.org/docs/](https://threejs.org/docs/)

### 教程与示例

- **uni-app教程**：
  - [uni-app快速入门教程](https://www.dcloud.io/tutorial.html)
  
- **Three.js教程**：
  - [Three.js入门教程](https://threejsfundamentals.org/)
  - [Three.js官方示例](https://threejs.org/examples/)

### 资源素材

- **3D模型资源**：
  - [Sketchfab](https://sketchfab.com/)
  - [TurboSquid](https://www.turbosquid.com/)

- **纹理贴图**：
  - [CC0 Textures](https://cc0textures.com/)
  - [Textures.com](https://www.textures.com/)

### 社区与支持

- **Stack Overflow**：提问和搜索相关问题。
- **GitHub**：查找开源项目和示例代码。
- **Three.js论坛**：[https://discourse.threejs.org/](https://discourse.threejs.org/)
- **项目地址**：[https://github.com/Jefsky/DIYCakeApp](https://github.com/Jefsky/DIYCakeApp)]]></content>
                <pubDate>Wed, 16 Oct 2024 06:42:43 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[基于vue带目录和文件上传功能的Markdown查看器]]></title>
                <link>https://www.jefsky.com/blog/348</link>
                <description><![CDATA[该项目是一个基于 Vue 的 Markdown 查看器，用户可以上传 `.md` 文件并查看其内容，动态生成的目录（TOC）将根据文件中的标题自动生成。点击目录项会滚动到对应的内容区域，同时页面还包含一个“回到顶部”按钮以便快...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/348</guid>
                <content><![CDATA[该项目是一个基于 Vue 的 Markdown 查看器，用户可以上传 `.md` 文件并查看其内容，动态生成的目录（TOC）将根据文件中的标题自动生成。点击目录项会滚动到对应的内容区域，同时页面还包含一个“回到顶部”按钮以便快速返回顶部。

## 功能特色

- **文件上传**：支持从本地上传 `.md` 文件，并在查看器中显示文件内容。
- **动态目录**：根据 Markdown 文件中的标题自动生成目录，并可点击目录项跳转到对应的内容。
- **固定侧边栏**：侧边栏在页面滚动时保持固定，方便用户随时导航。
- **回到顶部**：当页面滚动到一定位置时，会显示一个“回到顶部”按钮，便于用户快速回到页面顶端。
- **响应式设计**：布局响应式，样式简洁美观，适配不同的设备。


## 项目结构

该项目包含以下关键组件：

- **Markdown 查看组件**：展示解析后的 Markdown 内容。
- **目录组件**：展示动态生成的目录，并在滚动时高亮当前章节。
- **文件上传功能**：支持 Markdown 文件上传并显示解析的内容。

## 安装

1. 克隆此仓库：

   ```bash
   git clone https://github.com/jefsky/markdown-viewer.git
   ```

2. 进入项目目录：

   ```bash
   cd markdown-viewer
   ```

3. 安装依赖：

   ```bash
   npm install
   ```

4. 启动开发服务器：

   ```bash
   npm run serve
   ```

   应用将运行在 `http://localhost:8080`。

## 使用说明

1. 点击侧边栏中的 “选择文件” 按钮上传 Markdown 文件。
2. 文件上传后，内容将会显示在页面右侧。
3. 侧边栏会根据 Markdown 文件中的标题自动生成目录，点击目录项将滚动到对应章节。
4. 当页面向下滚动时，“回到顶部” 按钮会出现，点击可快速返回页面顶部。

## 代码结构

- **`markdown-container`**：主要容器，包含侧边栏（目录和文件上传按钮）及 Markdown 内容区。
- **`generateHtml()`**：使用 `marked` 库解析 Markdown 内容，并提取标题生成目录。
- **`scrollTo()`**：平滑滚动到选中的标题位置。
- **`IntersectionObserver`**：当用户滚动页面时，动态高亮对应的目录项。

## 自定义

### 样式定制

该项目使用基本的 CSS 样式，样式定义在组件的 `style` 部分，您可以根据需要进行自定义。以下是可以调整的一些关键样式：

- 侧边栏的宽度和背景颜色
- “选择文件” 和 “回到顶部” 按钮的样式
- 目录项的字体大小和间距
- 盒子阴影和圆角效果

### 功能扩展

你可以通过以下方式扩展此查看器的功能：

- **Markdown 编辑器**：允许用户在应用中直接编辑 Markdown 内容。
- **主题切换**：支持浅色和深色模式切换。
- **文件格式支持**：支持更多文件类型如 `.txt`、`.json` 等。

## 依赖

- [Vue.js](https://vuejs.org/)：构建用户界面的 JavaScript 框架。
- [Marked.js](https://marked.js.org/)：一个 Markdown 解析器和编译器。
- [VueScrollTo](https://www.npmjs.com/package/vue-scrollto)：用于平滑滚动到不同章节的 Vue 插件。

## 许可协议

该项目基于 MIT 许可证开源，详细信息请查看 [LICENSE](LICENSE) 文件。

## 贡献指南

欢迎大家 fork 本仓库并提交 pull requests。如有重大更改，请先开启 issue 讨论你想做的修改。

---

感谢你关注这个项目！如果觉得不错，欢迎在 [GitHub](https://github.com/jefsky/markdown-viewer) 上给一个 🌟。]]></content>
                <pubDate>Mon, 21 Oct 2024 07:44:32 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[Laravel 里，这些都是构建数据库查询时常用的条件构造方式]]></title>
                <link>https://www.jefsky.com/blog/349</link>
                <description><![CDATA[在 Laravel 里，这些都是构建数据库查询时常用的条件构造方式，下面为你详细解释：  ### 1. `$where = []` 此为创建一个空数组，在后续代码里可往该数组添加查询条件，最后再把这个数组传递给查询构建器。 ```php $w...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/349</guid>
                <content><![CDATA[在 Laravel 里，这些都是构建数据库查询时常用的条件构造方式，下面为你详细解释：

### 1. `$where = []`
此为创建一个空数组，在后续代码里可往该数组添加查询条件，最后再把这个数组传递给查询构建器。
```php
$where = [];
if ($someCondition) {
    $where[] = ['column', '=', 'value'];
}
$results = DB::table('table_name')->where($where)->get();
```

### 2. `->where()`
这是 Laravel 查询构建器里的一个方法，可用于添加单个查询条件。它有多种使用方式：

#### 基本用法
```php
$results = DB::table('table_name')
    ->where('column', '=', 'value')
    ->get();
```
这里的 `=` 是比较运算符，也能使用其他运算符，例如 `>`、`<`、`!=` 等。

#### 省略比较运算符
```php
$results = DB::table('table_name')
    ->where('column', 'value')
    ->get();
```
当省略比较运算符时，默认使用 `=`。

#### 多个条件
```php
$results = DB::table('table_name')
    ->where('column1', 'value1')
    ->where('column2', 'value2')
    ->get();
```
多个 `where` 方法之间是 `AND` 关系。

### 3. `->where([])`
该方法用于一次性传递多个查询条件数组。
```php
$conditions = [
    ['column1', '=', 'value1'],
    ['column2', '>', 'value2']
];
$results = DB::table('table_name')->where($conditions)->get();
```

### 4. `$where['key'] = value`
这种方式是往 `$where` 数组添加一个关联元素。通常用于动态构建条件数组。
```php
$where = [];
$where['column'] = 'value';
$results = DB::table('table_name')->where($where)->get();
```
这种方式等价于：
```php
$results = DB::table('table_name')
    ->where('column', '=', 'value')
    ->get();
```

### 5. `$where[] = ['key', '<>', 'value']`
这是往 `$where` 数组添加一个条件子数组。`<>` 是不等于的比较运算符。
```php
$where = [];
$where[] = ['column', '<>', 'value'];
$results = DB::table('table_name')->where($where)->get();
```
上述代码等同于：
```php
$results = DB::table('table_name')
    ->where('column', '<>', 'value')
    ->get();
```

综上所述，这些方式都能用来构建数据库查询条件，可以依据具体需求选择合适的方式。]]></content>
                <pubDate>Tue, 01 Apr 2025 03:35:36 +0000</pubDate>
                            </item>
                    <item>
                <title><![CDATA[找不到与参数名称“SslProtocol”]]></title>
                <link>https://www.jefsky.com/blog/350</link>
                <description><![CDATA[``` (base) PS C:\Users\aa> irm -SslProtocol Tls12 https://astral.sh/uv/install.ps1 | iex Invoke-RestMethod : 找不到与参数名称“SslProtocol”匹配的参数。 所在位置 行:1 字符: 5 + irm -SslProtocol Tls12 ht...]]></description>
                <author><![CDATA[Jefsky <jefsky@qq.com>]]></author>
                <guid>https://www.jefsky.com/350</guid>
                <content><![CDATA[```
(base) PS C:\Users\aa> irm -SslProtocol Tls12 https://astral.sh/uv/install.ps1 | iex
Invoke-RestMethod : 找不到与参数名称“SslProtocol”匹配的参数。
所在位置 行:1 字符: 5
+ irm -SslProtocol Tls12 https://astral.sh/uv/install.ps1 | iex
+     ~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-RestMethod]，ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
```

遇到的错误提示 `找不到与参数名称“SslProtocol”匹配的参数` 表明在 PowerShell 里，`Invoke-RestMethod`（`irm` 是它的别名）命令并不存在 `-SslProtocol` 这个参数。

在 PowerShell 中，若要设定 SSL 协议，可以在调用 `Invoke-RestMethod` 之前通过代码来指定。下面是修改后的命令示例：

```powershell
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-RestMethod -Uri https://astral.sh/uv/install.ps1 | Invoke-Expression
```

可以在 PowerShell 里执行以上命令。此命令会先将 SSL 协议设定为 TLS 1.2，接着从指定的 URL 下载 `install.ps1` 脚本，最后执行该脚本。]]></content>
                <pubDate>Mon, 07 Apr 2025 06:39:23 +0000</pubDate>
                            </item>
            </channel>
</rss>
