<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>L2M2</title>
  
  <subtitle>把简单的事情做好</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://l2m2.top/"/>
  <updated>2025-03-21T13:10:51.524Z</updated>
  <id>https://l2m2.top/</id>
  
  <author>
    <name>李黎明 Leon</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>解决VMware虚拟机中的Windows XP到期无法使用的问题</title>
    <link href="https://l2m2.top/2024/12/19/2024-12-19-windows-xp-vmware-expire/"/>
    <id>https://l2m2.top/2024/12/19/2024-12-19-windows-xp-vmware-expire/</id>
    <published>2024-12-19T16:58:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/20241219_01.png" alt></p><p>之前项目中需要在Windows XP上进行测试，使用VMware安装了Windows XP 虚拟机。很久没用之后再打开，出现了上面的画面。</p><p>以下是解决方法：</p><p>Step 1: 关闭Windows XP虚拟机</p><p>Step 2: 编辑Windows XP.vmx文件，增加行</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bios.bootDelay = &quot;8000&quot;</span><br></pre></td></tr></table></figure><p>Step 3: 启动Windows XP, 按F8进入安全模式，手速要快</p><p>Step 4: 进入安全模式后，cmd中执行命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ rundll32.exe syssetup,SetupOobeBnk</span><br></pre></td></tr></table></figure><p>此命令的目的是重置Windows操作系统的激活宽限期</p><p>Step 5: 再次重启Windows XP, 不再出现激活提示。</p>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="运维" scheme="https://l2m2.top/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="Windows" scheme="https://l2m2.top/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>解决WSL的CentOS无法正常使用systemctl</title>
    <link href="https://l2m2.top/2024/11/19/2024-11-19-systemctl-on-wsl/"/>
    <id>https://l2m2.top/2024/11/19/2024-11-19-systemctl-on-wsl/</id>
    <published>2024-11-19T19:57:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>在WSL的CentOS系统中使用systemctl会报错“Failed to get D-Bus connection”。</p><p>解决方案：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ mv /usr/bin/systemctl /usr/bin/systemctl.old</span><br><span class="line">$ curl https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py &gt; /usr/bin/systemctl</span><br><span class="line">$ chmod +x /usr/bin/systemctl</span><br></pre></td></tr></table></figure><p>你也可以在<a href="https://github.com/l2m2/resource/blob/master/systemctl.py" target="_blank" rel="noopener">这里</a>获取systemctl.py</p>]]></content>
    
    <summary type="html">
    
      Failed to get D-Bus connection
    
    </summary>
    
      <category term="运维" scheme="https://l2m2.top/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="CentOS" scheme="https://l2m2.top/tags/CentOS/"/>
    
      <category term="WSL" scheme="https://l2m2.top/tags/WSL/"/>
    
  </entry>
  
  <entry>
    <title>windows下使用pg_partman实现PostgreSQL 15自动分区</title>
    <link href="https://l2m2.top/2024/08/06/2024-08-06-use-pg_partman/"/>
    <id>https://l2m2.top/2024/08/06/2024-08-06-use-pg_partman/</id>
    <published>2024-08-06T12:41:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装-pg-partman"><a href="#安装-pg-partman" class="headerlink" title="安装 pg_partman"></a>安装 pg_partman</h2><ul><li><p>clone pg_partman repo</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">clone</span> git@github.com:pgpartman/pg_partman.git</span><br></pre></td></tr></table></figure></li><li><p>create a new file in pg_partman directory</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> pg_partman</span><br><span class="line">$ touch make.sh</span><br></pre></td></tr></table></figure><p>edit content as below in make.sh</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">EXTENSION=pg_partman</span><br><span class="line">VERSION=$(grep default_version <span class="variable">$EXTENSION</span>.control | \</span><br><span class="line">          sed -e <span class="string">"s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/"</span>)</span><br><span class="line"></span><br><span class="line">cat sql/types/*.sql &gt; <span class="string">"<span class="variable">$&#123;EXTENSION&#125;</span>--<span class="variable">$&#123;VERSION&#125;</span>.sql"</span></span><br><span class="line">cat sql/tables/*.sql &gt;&gt; <span class="string">"<span class="variable">$&#123;EXTENSION&#125;</span>--<span class="variable">$&#123;VERSION&#125;</span>.sql"</span></span><br><span class="line">cat sql/<span class="built_in">functions</span>/*.sql &gt;&gt; <span class="string">"<span class="variable">$&#123;EXTENSION&#125;</span>--<span class="variable">$&#123;VERSION&#125;</span>.sql"</span></span><br><span class="line">cat sql/procedures/*.sql &gt;&gt; <span class="string">"<span class="variable">$&#123;EXTENSION&#125;</span>--<span class="variable">$&#123;VERSION&#125;</span>.sql"</span></span><br></pre></td></tr></table></figure></li><li><p>after exec make.sh, you will see two new files: pg_partman.control &amp; pg_partman–5.1.0.sql</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ ./make.sh</span><br></pre></td></tr></table></figure></li><li><p>copy pg_partman.control &amp; pg_partman–5.1.0.sql to C:\Program Files\PostgreSQL\15\share\extension</p></li><li><p>install pg_partman using sql:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">C:\Program Files\PostgreSQL\15\bin&gt;psql.exe -U postgres</span><br><span class="line">用户 postgres 的口令：</span><br><span class="line">psql (15.7)</span><br><span class="line">输入 &quot;help&quot; 来获取帮助信息.</span><br><span class="line"></span><br><span class="line">postgres=# CREATE SCHEMA IF NOT EXISTS partman;</span><br><span class="line">CREATE SCHEMA</span><br><span class="line">postgres=# create extension IF NOT EXISTS pg_partman SCHEMA partman;</span><br><span class="line">CREATE EXTENSION</span><br><span class="line">postgres=# select * from pg_available_extensions where name=&apos;pg_partman&apos;;</span><br><span class="line">    name    | default_version | installed_version |                       comment</span><br><span class="line">------------+-----------------+-------------------+------------------------------------------------------</span><br><span class="line"> pg_partman | 5.1.0           | 5.1.0             | Extension to manage partitioned tables by time or ID</span><br><span class="line">(1 行记录)</span><br></pre></td></tr></table></figure></li></ul><h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><h3 id="示例一：每年1个分区"><a href="#示例一：每年1个分区" class="headerlink" title="示例一：每年1个分区"></a>示例一：每年1个分区</h3><p>创建t1表：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> public.t1 (</span><br><span class="line">  <span class="keyword">id</span> <span class="built_in">serial</span>,</span><br><span class="line">  <span class="keyword">data</span> <span class="built_in">text</span>,</span><br><span class="line">  dt <span class="built_in">timestamp</span> <span class="keyword">NOT</span> <span class="literal">NULL</span> <span class="keyword">DEFAULT</span> <span class="keyword">CURRENT_TIMESTAMP</span></span><br><span class="line">) <span class="keyword">PARTITION</span> <span class="keyword">BY</span> <span class="keyword">RANGE</span>(dt);</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">INDEX</span> <span class="keyword">ON</span> public.t1 (dt);</span><br></pre></td></tr></table></figure><p>创建t1_template表, 使用id 为主键：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> public.t1_template ( <span class="keyword">LIKE</span> public.t1);</span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> public.t1_template <span class="keyword">ADD</span> PRIMARY <span class="keyword">KEY</span> (<span class="keyword">id</span>);</span><br></pre></td></tr></table></figure><p>使用pg_partman创建分区：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> partman.create_parent(</span><br><span class="line">    p_parent_table := <span class="string">'public.t1'</span></span><br><span class="line">    , p_control := <span class="string">'dt'</span></span><br><span class="line">    , p_interval := <span class="string">'1 year'</span></span><br><span class="line">    , p_template_table := <span class="string">'public.t1_template'</span></span><br><span class="line">    , p_start_partition := to_char(date_trunc(<span class="string">'year'</span>,<span class="keyword">CURRENT_TIMESTAMP</span>), <span class="string">'YYYY-MM-DD HH24:MI:SS'</span>));</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p>查看t1的详细信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">postgres=<span class="comment"># \d+ public.t1</span></span><br><span class="line">                                                      分区表 <span class="string">"public.t1"</span></span><br><span class="line"> 栏位 |            类型             | 校对规则 |  可空的  |              预设              |   存储   | 压缩 | 统计目标 | 描述</span><br><span class="line">------+-----------------------------+----------+----------+--------------------------------+----------+------+----------+------</span><br><span class="line"> id   | <span class="built_in">integer</span>                     |          | not null | nextval(<span class="string">'t1_id_seq'</span>::regclass) | plain    |      |          |</span><br><span class="line"> data | text                        |          |          |                                | extended |      |          |</span><br><span class="line"> dt   | timestamp without time zone |          | not null | CURRENT_TIMESTAMP              | plain    |      |          |</span><br><span class="line">分区键值: RANGE (dt)</span><br><span class="line">索引：</span><br><span class="line">    <span class="string">"t1_dt_idx"</span> btree (dt)</span><br><span class="line">分区: t1_p20240101 FOR VALUES FROM (<span class="string">'2024-01-01 00:00:00'</span>) TO (<span class="string">'2025-01-01 00:00:00'</span>),</span><br><span class="line">      t1_p20250101 FOR VALUES FROM (<span class="string">'2025-01-01 00:00:00'</span>) TO (<span class="string">'2026-01-01 00:00:00'</span>),</span><br><span class="line">      t1_p20260101 FOR VALUES FROM (<span class="string">'2026-01-01 00:00:00'</span>) TO (<span class="string">'2027-01-01 00:00:00'</span>),</span><br><span class="line">      t1_p20270101 FOR VALUES FROM (<span class="string">'2027-01-01 00:00:00'</span>) TO (<span class="string">'2028-01-01 00:00:00'</span>),</span><br><span class="line">      t1_p20280101 FOR VALUES FROM (<span class="string">'2028-01-01 00:00:00'</span>) TO (<span class="string">'2029-01-01 00:00:00'</span>),</span><br><span class="line">      t1_default DEFAULT</span><br></pre></td></tr></table></figure><p>分区表信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">postgres=<span class="comment"># \d+ public.t1_p20240101</span></span><br><span class="line">                                                 数据表 <span class="string">"public.t1_p20240101"</span></span><br><span class="line"> 栏位 |            类型             | 校对规则 |  可空的  |              预设              |   存储   | 压缩 | 统计目标 | 描述</span><br><span class="line">------+-----------------------------+----------+----------+--------------------------------+----------+------+----------+------</span><br><span class="line"> id   | <span class="built_in">integer</span>                     |          | not null | nextval(<span class="string">'t1_id_seq'</span>::regclass) | plain    |      |          |</span><br><span class="line"> data | text                        |          |          |                                | extended |      |          |</span><br><span class="line"> dt   | timestamp without time zone |          | not null | CURRENT_TIMESTAMP              | plain    |      |          |</span><br><span class="line">分区: t1 FOR VALUES FROM (<span class="string">'2024-01-01 00:00:00'</span>) TO (<span class="string">'2025-01-01 00:00:00'</span>)</span><br><span class="line">分区约束: ((dt IS NOT NULL) AND (dt &gt;= <span class="string">'2024-01-01 00:00:00'</span>::timestamp without time zone) AND (dt &lt; <span class="string">'2025-01-01 00:00:00'</span>::timestamp without time zone))</span><br><span class="line">索引：</span><br><span class="line">    <span class="string">"t1_p20240101_pkey"</span> PRIMARY KEY, btree (id)</span><br><span class="line">    <span class="string">"t1_p20240101_dt_idx"</span> btree (dt)</span><br><span class="line">访问方法 heap</span><br></pre></td></tr></table></figure><h3 id="示例二：每-10-个-ID-值-1-个分区"><a href="#示例二：每-10-个-ID-值-1-个分区" class="headerlink" title="示例二：每 10 个 ID 值 1 个分区"></a>示例二：每 10 个 ID 值 1 个分区</h3><p>创建t2表：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> public.t2 (</span><br><span class="line"><span class="keyword">id</span> <span class="built_in">serial</span> PRIMARY <span class="keyword">KEY</span>,</span><br><span class="line">  <span class="keyword">data</span> <span class="built_in">text</span>,</span><br><span class="line">  dt <span class="built_in">timestamp</span> <span class="keyword">DEFAULT</span> <span class="keyword">CURRENT_TIMESTAMP</span></span><br><span class="line">) <span class="keyword">PARTITION</span> <span class="keyword">BY</span> <span class="keyword">RANGE</span>(<span class="keyword">id</span>);</span><br></pre></td></tr></table></figure><p>使用pg_partman创建分区：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> partman.create_parent(</span><br><span class="line">    p_parent_table := <span class="string">'public.t2'</span></span><br><span class="line">    , p_control := <span class="string">'id'</span></span><br><span class="line">    , p_interval := <span class="string">'10'</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><p>t2的详细信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">postgres=<span class="comment"># \d+ public.t2</span></span><br><span class="line">                                                      分区表 <span class="string">"public.t2"</span></span><br><span class="line"> 栏位 |            类型             | 校对规则 |  可空的  |              预设              |   存储   | 压缩 | 统计目标 | 描述</span><br><span class="line">------+-----------------------------+----------+----------+--------------------------------+----------+------+----------+------</span><br><span class="line"> id   | <span class="built_in">integer</span>                     |          | not null | nextval(<span class="string">'t2_id_seq'</span>::regclass) | plain    |      |          |</span><br><span class="line"> data | text                        |          |          |                                | extended |      |          |</span><br><span class="line"> dt   | timestamp without time zone |          |          | CURRENT_TIMESTAMP              | plain    |      |          |</span><br><span class="line">分区键值: RANGE (id)</span><br><span class="line">索引：</span><br><span class="line">    <span class="string">"t2_pkey"</span> PRIMARY KEY, btree (id)</span><br><span class="line">分区: t2_p0 FOR VALUES FROM (0) TO (10),</span><br><span class="line">      t2_p10 FOR VALUES FROM (10) TO (20),</span><br><span class="line">      t2_p20 FOR VALUES FROM (20) TO (30),</span><br><span class="line">      t2_p30 FOR VALUES FROM (30) TO (40),</span><br><span class="line">      t2_p40 FOR VALUES FROM (40) TO (50),</span><br><span class="line">      t2_default DEFAULT</span><br></pre></td></tr></table></figure><p>分区表信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">postgres=<span class="comment"># \d+ t2_p10</span></span><br><span class="line">                                                    数据表 <span class="string">"public.t2_p10"</span></span><br><span class="line"> 栏位 |            类型             | 校对规则 |  可空的  |              预设              |   存储   | 压缩 | 统计目标 | 描述</span><br><span class="line">------+-----------------------------+----------+----------+--------------------------------+----------+------+----------+------</span><br><span class="line"> id   | <span class="built_in">integer</span>                     |          | not null | nextval(<span class="string">'t2_id_seq'</span>::regclass) | plain    |      |          |</span><br><span class="line"> data | text                        |          |          |                                | extended |      |          |</span><br><span class="line"> dt   | timestamp without time zone |          |          | CURRENT_TIMESTAMP              | plain    |      |          |</span><br><span class="line">分区: t2 FOR VALUES FROM (10) TO (20)</span><br><span class="line">分区约束: ((id IS NOT NULL) AND (id &gt;= 10) AND (id &lt; 20))</span><br><span class="line">索引：</span><br><span class="line">    <span class="string">"t2_p10_pkey"</span> PRIMARY KEY, btree (id)</span><br><span class="line">访问方法 heap</span><br></pre></td></tr></table></figure><h2 id="后台自动创建分区"><a href="#后台自动创建分区" class="headerlink" title="后台自动创建分区"></a>后台自动创建分区</h2><p>可手动调用run_maintenance_proc自动创建：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CALL</span> partman.run_maintenance_proc();</span><br></pre></td></tr></table></figure><p>可配合pg_cron或pg_partman_bgw定时进行分区的创建和删除。</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://github.com/pgpartman/pg_partman/blob/master/doc/pg_partman_howto.md" target="_blank" rel="noopener">https://github.com/pgpartman/pg_partman/blob/master/doc/pg_partman_howto.md</a></li><li><a href="https://github.com/pgpartman/pg_partman/blob/master/doc/pg_partman.md" target="_blank" rel="noopener">https://github.com/pgpartman/pg_partman/blob/master/doc/pg_partman.md</a></li></ul>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="数据库" scheme="https://l2m2.top/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="PostgreSQL" scheme="https://l2m2.top/tags/PostgreSQL/"/>
    
  </entry>
  
  <entry>
    <title>QML中的Row与RowLayout</title>
    <link href="https://l2m2.top/2024/02/02/2024-02-02-qml-row-vs-rowlayout/"/>
    <id>https://l2m2.top/2024/02/02/2024-02-02-qml-row-vs-rowlayout/</id>
    <published>2024-02-02T00:09:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p><code>Row</code>和<code>RowLayout</code>都是Qt Quick中的布局元素，用于在水平方向上布局其子元素。但是，它们的工作方式有一些重要的区别。</p><p><code>Row</code>是一个基础的布局元素，它会将其子元素简单地排列在一行中。你可以使用<code>spacing</code>属性来控制子元素之间的间距，使用<code>anchors</code>来定位<code>Row</code>本身。然而，<code>Row</code>不会调整其子元素的大小，所有子元素都保持其原始大小。</p><figure class="highlight qml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">Row</span> &#123;</span><br><span class="line">    <span class="attribute">spacing</span>: <span class="number">2</span></span><br><span class="line">    <span class="title">Rectangle</span> &#123; <span class="attribute">width</span>: <span class="number">50</span>; <span class="attribute">height</span>: <span class="number">50</span>; <span class="attribute">color</span>: <span class="string">"red"</span> &#125;</span><br><span class="line">    <span class="title">Rectangle</span> &#123; <span class="attribute">width</span>: <span class="number">50</span>; <span class="attribute">height</span>: <span class="number">50</span>; <span class="attribute">color</span>: <span class="string">"green"</span> &#125;</span><br><span class="line">    <span class="title">Rectangle</span> &#123; <span class="attribute">width</span>: <span class="number">50</span>; <span class="attribute">height</span>: <span class="number">50</span>; <span class="attribute">color</span>: <span class="string">"blue"</span> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>另一方面，<code>RowLayout</code>是一个更高级的布局元素，它是Qt Quick Layouts模块的一部分。<code>RowLayout</code>不仅可以将其子元素排列在一行中，还可以调整其子元素的大小以填充可用空间。你可以使用<code>Layout.fillWidth</code>和<code>Layout.preferredWidth</code>等属性来控制如何调整子元素的大小。</p><figure class="highlight qml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">RowLayout</span> &#123;</span><br><span class="line">    <span class="attribute">anchors.fill</span>: <span class="built_in">parent</span></span><br><span class="line">    <span class="title">Rectangle</span> &#123; <span class="attribute">Layout.fillWidth</span>: <span class="literal">true</span>; <span class="attribute">height</span>: <span class="number">50</span>; <span class="attribute">color</span>: <span class="string">"red"</span> &#125;</span><br><span class="line">    <span class="title">Rectangle</span> &#123; <span class="attribute">Layout.preferredWidth</span>: <span class="number">50</span>; <span class="attribute">height</span>: <span class="number">50</span>; <span class="attribute">color</span>: <span class="string">"green"</span> &#125;</span><br><span class="line">    <span class="title">Rectangle</span> &#123; <span class="attribute">Layout.fillWidth</span>: <span class="literal">true</span>; <span class="attribute">height</span>: <span class="number">50</span>; <span class="attribute">color</span>: <span class="string">"blue"</span> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在这个例子中，红色和蓝色的矩形将填充剩余的空间，而绿色的矩形将保持50像素的宽度。</p><p>总的来说，如果你只需要简单地将一些元素排列在一行中，并且不需要调整它们的大小，那么<code>Row</code>可能就足够了。如果你需要更复杂的布局，例如需要调整子元素的大小以填充可用空间，那么<code>RowLayout</code>可能会更合适。</p>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="Qt" scheme="https://l2m2.top/categories/Qt/"/>
    
    
      <category term="Qt" scheme="https://l2m2.top/tags/Qt/"/>
    
      <category term="QML" scheme="https://l2m2.top/tags/QML/"/>
    
  </entry>
  
  <entry>
    <title>Qt5.6编译QtCharts</title>
    <link href="https://l2m2.top/2023/11/21/2023-11-21-qt-charts-for-5.6/"/>
    <id>https://l2m2.top/2023/11/21/2023-11-21-qt-charts-for-5.6/</id>
    <published>2023-11-21T14:43:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<ol><li><p>下载并安装<a href="https://strawberryperl.com/" target="_blank" rel="noopener">Perl</a> ，安装完成后在cmd中测试<code>perl -v</code></p></li><li><p>下载QtCharts代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">clone</span> git@github.com:qt/qtcharts.git</span><br></pre></td></tr></table></figure></li><li><p>切换到5.7分支，较新的分支在Qt5.6下编译有问题</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git checkout 5.7</span><br></pre></td></tr></table></figure></li><li><p>使用QtCreator打开根目录下的qtcharts.pro</p></li><li><p>qmake</p></li><li><p>make</p></li><li><p>make install (在项目配置中，构建的步骤中添加install参数)</p></li><li><p>make docs (在项目配置中，构建的步骤中添加docs参数)</p></li><li><p>运行工程中的examples查看效果</p></li></ol>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="Qt" scheme="https://l2m2.top/categories/Qt/"/>
    
    
      <category term="Qt" scheme="https://l2m2.top/tags/Qt/"/>
    
  </entry>
  
  <entry>
    <title>基于RetinaNet训练模型以及检测图像中的对象</title>
    <link href="https://l2m2.top/2023/06/26/2023-06-26-retinanet-training/"/>
    <id>https://l2m2.top/2023/06/26/2023-06-26-retinanet-training/</id>
    <published>2023-06-26T10:40:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><ol><li><p>Clone RetinaNet repository</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git <span class="built_in">clone</span> git@github.com:fizyr/keras-retinanet.git</span><br></pre></td></tr></table></figure></li><li><p>使用虚拟环境</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ python -m venv .venv</span><br><span class="line">$ .venv\Scripts\activate.bat</span><br></pre></td></tr></table></figure></li><li><p>安装包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ pip install numpy</span><br><span class="line">$ pip install tensorflow</span><br><span class="line">$ pip install matplotlib</span><br><span class="line">$ pip install .</span><br></pre></td></tr></table></figure><p>如果安装过程中出现错误，可能是墙的原因。可使用代理，例如：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ pip install --proxy=http://127.0.0.1:7890 .</span><br></pre></td></tr></table></figure></li><li><p>编译Cython代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ python setup.py build_ext --inplace</span><br></pre></td></tr></table></figure></li></ol><h2 id="运行例子"><a href="#运行例子" class="headerlink" title="运行例子"></a>运行例子</h2><ol><li><p>下载RetinaNet模型 <a href="https://github.com/fizyr/keras-retinanet/releases" target="_blank" rel="noopener">https://github.com/fizyr/keras-retinanet/releases</a> ，选择 resnet50_coco_best_v2.1.0.h5</p></li><li><p>将下载好的文件放到snapshots文件夹下</p></li><li><p>运行examples目录下的例子</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> examples</span><br><span class="line">$ python resnet50_retinanet.py</span><br></pre></td></tr></table></figure></li><li><p>如果正常运行，你将看到一个包含检测结果的窗口</p><p><img src="/images/20230626_01.png" alt></p></li></ol><h2 id="训练自定义数据"><a href="#训练自定义数据" class="headerlink" title="训练自定义数据"></a>训练自定义数据</h2><ul><li>步骤 1 ：准备数据</li><li>步骤 2： 标注</li><li>步骤 3 ：定义 classes</li><li>步骤 4 ：训练你自己的模型</li></ul><h3 id="准备数据"><a href="#准备数据" class="headerlink" title="准备数据"></a>准备数据</h3><p>目录结构长这样：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">└── dataset</span><br><span class="line">    ├── Annotations</span><br><span class="line">    │   ├── 1.xml</span><br><span class="line">    │   ├── 2.xml</span><br><span class="line">    │   └── ....</span><br><span class="line">    ├── ImageSets</span><br><span class="line">    │   └── Main</span><br><span class="line">    │      ├── train.txt</span><br><span class="line">    │       └── val.txt</span><br><span class="line">    └── JPEGImages</span><br><span class="line">        ├── 1.jpg</span><br><span class="line">        ├── 2.jpg</span><br><span class="line">        └── ...</span><br></pre></td></tr></table></figure><p>将图片放在JPEGImages目录下</p><h3 id="标注"><a href="#标注" class="headerlink" title="标注"></a>标注</h3><p>使用LabelImg进行标注，保存格式选择 PASCAL VOC。</p><p>将生成的xml放在dataset\Annotations下。</p><h3 id="定义Classes"><a href="#定义Classes" class="headerlink" title="定义Classes"></a>定义Classes</h3><p>修改 keras_retinanet/preprocessing/pascal_voc.py 文件中的voc_classes定义，例如</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">voc_classes = &#123;</span><br><span class="line">    <span class="string">'a'</span>: <span class="number">0</span>,</span><br><span class="line">    <span class="string">'b'</span>: <span class="number">1</span>,</span><br><span class="line">    <span class="string">'c'</span>: <span class="number">2</span>,</span><br><span class="line">    <span class="string">'d'</span>: <span class="number">3</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="训练"><a href="#训练" class="headerlink" title="训练"></a>训练</h3><p>使用下面的脚本生成train.txt 和 val.txt。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> os <span class="keyword">import</span> listdir</span><br><span class="line"><span class="keyword">from</span> os.path <span class="keyword">import</span> isfile, join</span><br><span class="line"></span><br><span class="line">dataset_directory = <span class="string">"./dataset/Annotations"</span></span><br><span class="line"></span><br><span class="line">files = [join(dataset_directory,file) <span class="keyword">for</span> file <span class="keyword">in</span> listdir(dataset_directory) <span class="keyword">if</span> isfile(join(dataset_directory,file))]</span><br><span class="line"></span><br><span class="line">i = <span class="number">0</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">"val.txt"</span>, <span class="string">"w"</span>) <span class="keyword">as</span> test:</span><br><span class="line">    <span class="keyword">for</span> file <span class="keyword">in</span> files:</span><br><span class="line">        i += <span class="number">1</span></span><br><span class="line">        <span class="keyword">if</span> (i % <span class="number">5</span>) == <span class="number">0</span>:</span><br><span class="line">            name = file.split(<span class="string">"\\"</span>)[<span class="number">-1</span>]</span><br><span class="line">            name = name.split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line">            test.write(name + <span class="string">"\n"</span>)</span><br><span class="line">            print(<span class="string">"test:    "</span> + name)</span><br><span class="line">            </span><br><span class="line">i = <span class="number">0</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">"train.txt"</span>, <span class="string">"w"</span>) <span class="keyword">as</span> train:</span><br><span class="line">    <span class="keyword">for</span> file <span class="keyword">in</span> files:</span><br><span class="line">        i += <span class="number">1</span></span><br><span class="line">        <span class="keyword">if</span> (i % <span class="number">5</span>) != <span class="number">0</span>:       </span><br><span class="line">            name = file.split(<span class="string">"\\"</span>)[<span class="number">-1</span>]</span><br><span class="line">            name = name.split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line">            train.write(name + <span class="string">"\n"</span>)   </span><br><span class="line">            print(<span class="string">"train:    "</span> + name)</span><br><span class="line"></span><br><span class="line">test.close()</span><br><span class="line">train.close()</span><br></pre></td></tr></table></figure><p>生成后，train.txt中包含80%的图像，val.txt中包含20%的图像。</p><p>然后就可以开始训练了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ python keras_retinanet/bin/train.py</span><br><span class="line">--imagenet-weights</span><br><span class="line">--epoch &lt;put your total epoch&gt;</span><br><span class="line">--steps &lt;put your total steps&gt;</span><br><span class="line">--snapshot-path &lt;path to store snapshots of models&gt;</span><br><span class="line">--tensorboard-dir &lt;<span class="built_in">log</span> directory <span class="keyword">for</span> Tensorboard output&gt;</span><br><span class="line">pascal &lt;path to dataset directory&gt;</span><br></pre></td></tr></table></figure><p>训练完成后在snapshots目录下会生成一个新的h5后缀的文件。</p><p>将它转换成inference model：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ python keras_retinanet/bin/convert_model.py &lt;/path/to/training/model.h5&gt; &lt;/path/to/save/inference/model.h5&gt;</span><br></pre></td></tr></table></figure><p>也可以不进行转换，在代码中进行转换。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">model = models.load_model(model_path, backbone_name=<span class="string">'resnet50'</span>)</span><br><span class="line">model = models.convert_model(model)</span><br></pre></td></tr></table></figure><p>然后再修改examples\resnet50_retinanet.py中的labels_to_names和model_path，再进行验证。</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://medium.com/@van.evanfebrianto/how-to-train-custom-object-detection-models-using-retinanet-aeed72f5d701" target="_blank" rel="noopener">https://medium.com/@van.evanfebrianto/how-to-train-custom-object-detection-models-using-retinanet-aeed72f5d701</a></li></ul>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="AI" scheme="https://l2m2.top/categories/AI/"/>
    
    
      <category term="AI" scheme="https://l2m2.top/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>使用ImageAI训练自定义模型以及检测图像中的对象</title>
    <link href="https://l2m2.top/2023/06/21/2023-06-21-imageai-custom-training/"/>
    <id>https://l2m2.top/2023/06/21/2023-06-21-imageai-custom-training/</id>
    <published>2023-06-21T14:10:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>大概的步骤是：收集足够多的样本图片-&gt;人工标注出图片中的对象-&gt;训练出自定义模型-&gt;检测图片中的对象。</p><h2 id="人工标注"><a href="#人工标注" class="headerlink" title="人工标注"></a>人工标注</h2><p>本文试验过程中使用了LabelImg进行人工标注。你可以在 <a href="https://github.com/tzutalin/labelImg" target="_blank" rel="noopener">https://github.com/tzutalin/labelImg</a> 中找到编译好的可执行程序。</p><ol><li><p>准备至少200张样本图片</p></li><li><p>ImageAI使用YOLO的标注格式，因此在用LabelImg进行标注时，记得选择YOLO格式</p><p><img src="/images/20230621_01.png" alt></p></li><li><p>像下面这样创建目录结构</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">|--train\</span><br><span class="line">|  |--images\</span><br><span class="line">|  |  |--1.png</span><br><span class="line">|  |  |--2.png</span><br><span class="line">|  |--annotations\</span><br><span class="line">|  |  |--1.txt</span><br><span class="line">|  |  |--2.txt</span><br><span class="line">|--validation\</span><br><span class="line">|  |--images\</span><br><span class="line">|  |  |--1.png</span><br><span class="line">|  |  |--2.png</span><br><span class="line">|  |--annotations\</span><br><span class="line">|  |  |--1.txt</span><br><span class="line">|  |  |--2.txt</span><br></pre></td></tr></table></figure><p>将70-80%的图片放到train\images下，剩余的放到validation\images\下。</p><p>将train\images的标注结果保存到train\annotations下，将validation\images的标注结果保存到validation\annotations下。</p></li></ol><h2 id="训练"><a href="#训练" class="headerlink" title="训练"></a>训练</h2><ol><li><p>下载预训练模型<a href="https://github.com/OlafenwaMoses/ImageAI/releases/tag/3.0.0-pretrained" target="_blank" rel="noopener">yolov3.pt</a></p></li><li><p>安装ImageAI, 本文试验是在Windows 10下使用venv进行安装的。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">python -m venv .venv</span><br><span class="line">.venv\Scripts\activate.bat</span><br><span class="line">pip install -r requirements.txt</span><br><span class="line">pip install -r requirements_gpu.txt</span><br><span class="line">pip install -r requirements_extra.txt</span><br><span class="line">pip install imageai --upgrade</span><br></pre></td></tr></table></figure><p>requirements.txt、requirements_gpu.txt、requirements_extra.txt可以在<a href="https://github.com/OlafenwaMoses/ImageAI/tree/master" target="_blank" rel="noopener">ImageAI</a>中找到。</p></li><li><p>训练</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> imageai.Detection.Custom <span class="keyword">import</span> DetectionModelTrainer</span><br><span class="line"></span><br><span class="line">trainer = DetectionModelTrainer()</span><br><span class="line">trainer.setModelTypeAsYOLOv3()</span><br><span class="line">trainer.setDataDirectory(data_directory=<span class="string">"answer-sheet"</span>)</span><br><span class="line">trainer.setTrainConfig(object_names_array=[<span class="string">"t0"</span>, <span class="string">"t1"</span>, <span class="string">"t2"</span>, <span class="string">"t10"</span>], batch_size=<span class="number">4</span>, num_experiments=<span class="number">200</span>, train_from_pretrained_model=<span class="string">"yolov3.pt"</span>)</span><br><span class="line"><span class="comment"># In the above,when training for detecting multiple objects,</span></span><br><span class="line"><span class="comment">#set object_names_array=["object1", "object2", "object3",..."objectz"]</span></span><br><span class="line">trainer.trainModel()</span><br></pre></td></tr></table></figure><ul><li>setDataDirectory设置数据目录，即包含train和validation的父目录</li><li>object_names_array: 对象数组。</li><li>batch_size: 该参数用于指定批次数量。由于内存限制，需要分批训练，直到所有批次训练集都完成为止。</li><li>num_experiments: 该参数用于指定将对图像训练的次数，也称为epochs。</li></ul><p>执行训练脚本后，如果看到类似下面的输出，表示正在正常训练中</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Epoch 96/200</span><br><span class="line">----------</span><br><span class="line">Train:</span><br><span class="line">40it [06:45, 10.13s/it]</span><br><span class="line">    box loss-&gt; 0.08312, object loss-&gt; 0.03558, class loss-&gt; 0.00509</span><br><span class="line">Validation:</span><br><span class="line">20it [00:40,  2.04s/it]</span><br><span class="line">    recall: 0.691667 precision: 0.403712 mAP@0.5: 0.465307, mAP@0.5-0.95: 0.162056</span><br></pre></td></tr></table></figure></li><li><p>训练完成后会生成类似下面的结果</p><p><img src="/images/20230621_02.png" alt></p></li></ol><h2 id="检测"><a href="#检测" class="headerlink" title="检测"></a>检测</h2><ol><li><p>运行下面的脚本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> imageai.Detection.Custom <span class="keyword">import</span> CustomObjectDetection</span><br><span class="line"></span><br><span class="line">detector = CustomObjectDetection()</span><br><span class="line">detector.setModelTypeAsYOLOv3()</span><br><span class="line">detector.setModelPath(<span class="string">"answer-sheet/models/yolov3_answer-sheet_mAP-0.65715_epoch-191.pt"</span>)</span><br><span class="line">detector.setJsonPath(<span class="string">"answer-sheet/json/answer-sheet_yolov3_detection_config.json"</span>)</span><br><span class="line">detector.loadModel()</span><br><span class="line">detections = detector.detectObjectsFromImage(input_image=<span class="string">"1.png"</span>, output_image_path=<span class="string">"1-detected.png"</span>)</span><br><span class="line"><span class="keyword">for</span> detection <span class="keyword">in</span> detections:</span><br><span class="line">  print(detection[<span class="string">"name"</span>], <span class="string">" : "</span>, detection[<span class="string">"percentage_probability"</span>], <span class="string">" : "</span>, detection[<span class="string">"box_points"</span>])</span><br></pre></td></tr></table></figure><p>可以在1-detected.png中看到对1.png图片中的对象检测结果。</p></li><li><p>也可以将各个检测到的对象单独裁剪出来</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> imageai.Detection.Custom <span class="keyword">import</span> CustomObjectDetection</span><br><span class="line"></span><br><span class="line">detector = CustomObjectDetection()</span><br><span class="line">detector.setModelTypeAsYOLOv3()</span><br><span class="line">detector.setModelPath(<span class="string">"answer-sheet/models/yolov3_answer-sheet_mAP-0.65715_epoch-191.pt"</span>)</span><br><span class="line">detector.setJsonPath(<span class="string">"answer-sheet/json/answer-sheet_yolov3_detection_config.json"</span>)</span><br><span class="line">detector.loadModel()</span><br><span class="line">detections, extracted_objects_array = detector.detectObjectsFromImage(input_image=<span class="string">"1.png"</span>, output_image_path=<span class="string">"1-detected.png"</span>, extract_detected_objects=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> detection, object_path <span class="keyword">in</span> zip(detections, extracted_objects_array):</span><br><span class="line">    print(object_path)</span><br><span class="line">    print(detection[<span class="string">"name"</span>], <span class="string">" : "</span>, detection[<span class="string">"percentage_probability"</span>], <span class="string">" : "</span>, detection[<span class="string">"box_points"</span>])</span><br><span class="line">    print(<span class="string">"---------------"</span>)</span><br></pre></td></tr></table></figure><p>裁剪出来的子图片保存在1-detected-extracted子目录中。  </p></li></ol><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/Custom/CUSTOMDETECTIONTRAINING.md" target="_blank" rel="noopener">https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/Custom/CUSTOMDETECTIONTRAINING.md</a></li><li><a href="https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/Custom/CUSTOMDETECTION.md" target="_blank" rel="noopener">https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Detection/Custom/CUSTOMDETECTION.md</a></li></ul>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="AI" scheme="https://l2m2.top/categories/AI/"/>
    
    
      <category term="AI" scheme="https://l2m2.top/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>AutoIt操作Access数据库</title>
    <link href="https://l2m2.top/2023/05/18/2023-05-18-autoit-access-db/"/>
    <id>https://l2m2.top/2023/05/18/2023-05-18-autoit-access-db/</id>
    <published>2023-05-18T23:15:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<ol><li><p>安装Access数据库驱动 AccessDatabaseEngine.exe</p></li><li><p>下载<a href="https://www.autoitscript.com/forum/files/file/389-adoau3-udf/" target="_blank" rel="noopener">ADO.au3 UDF</a></p><p>这是为简化ADO操作封装的一些数据库操作接口</p></li><li><p>连接数据库</p><figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Local</span> $driver = <span class="string">'Microsoft Access Driver (*.mdb)'</span></span><br><span class="line"><span class="keyword">Local</span> $dbname = <span class="symbol">@ScriptDir</span> &amp; <span class="string">'/xxx.mdb'</span></span><br><span class="line"><span class="keyword">Local</span> $dbuser = <span class="string">''</span></span><br><span class="line"><span class="keyword">Local</span> $dbpassword = <span class="string">'xxx'</span></span><br><span class="line"><span class="keyword">Local</span> $sConnectionString = <span class="string">'DRIVER='</span> &amp; $driver &amp; <span class="string">';Dbq='</span> &amp; $dbname &amp; <span class="string">';Uid='</span> &amp; $dbuser &amp; <span class="string">';PWD='</span> &amp; $dbpassword &amp; <span class="string">';'</span></span><br><span class="line"><span class="keyword">Local</span> $oConnection = _ADO_Connection_Create()</span><br><span class="line">_ADO_Connection_OpenConString($oConnection, $sConnectionString)</span><br></pre></td></tr></table></figure><p>若是Microsoft Access 2007及以后的版本，driver要写成 ‘Microsoft Access Driver (*.mdb *.accdb)’</p></li><li><p>查询数据</p><figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$aQresult = _ADO_Execute($oConnection, <span class="string">"SELECT * FROM 表名"</span>, <span class="literal">True</span>)</span><br><span class="line">$Qresult = _ArrayToString($aQresult[2])</span><br><span class="line"><span class="built_in">ConsoleWrite</span>(<span class="string">"2 $Qresult "</span> &amp; $Qresult &amp; <span class="symbol">@CRLF</span>)</span><br></pre></td></tr></table></figure></li><li><p>关闭数据库连接</p><figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">_ADO_Connection_Close($oConnection)</span><br><span class="line">$oConnection = <span class="literal">null</span></span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="其他" scheme="https://l2m2.top/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="AutoIt" scheme="https://l2m2.top/tags/AutoIt/"/>
    
  </entry>
  
  <entry>
    <title>AutoIt操作PostgreSQL数据库</title>
    <link href="https://l2m2.top/2023/05/12/2023-05-12-autoit-postgresql/"/>
    <id>https://l2m2.top/2023/05/12/2023-05-12-autoit-postgresql/</id>
    <published>2023-05-12T15:45:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<ol><li><p>安装PostgreSQL ODBC驱动。</p><p>在PosetgreSQL官网下载<a href="https://www.postgresql.org/ftp/odbc/versions/msi/" target="_blank" rel="noopener">PostgreSQL ODBC driver</a></p></li><li><p>配置DSN。</p><p>打开ODBC数据源管理程序。</p><p>Windows 10上可以在任务栏的搜索框中搜索”管理工具“，然后打开ODBC数据源管理程序。</p><p><img src="/images/2023051201.png" alt></p><p>点击添加，选择”PostgreSQL Unicode“</p><p><img src="/images/2023051202.png" alt></p><p>添加完成后在列表中可以找到如PostgreSQL35W一样的DSN项</p><p><img src="/images/2023051203.png" alt></p></li><li><p>下载<a href="https://www.autoitscript.com/forum/files/file/389-adoau3-udf/" target="_blank" rel="noopener">ADO.au3 UDF</a></p><p>这是为简化ADO操作封装的一些数据库操作接口</p></li><li><p>示例代码</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">#include &quot;ADO.au3&quot;</span><br><span class="line">#include &lt;Array.au3&gt;</span><br><span class="line">#include &lt;MsgBoxConstants.au3&gt;</span><br><span class="line">#include &lt;AutoItConstants.au3&gt;</span><br><span class="line"></span><br><span class="line">Global $oCon = Null ; $oConnection</span><br><span class="line"></span><br><span class="line">_fMyADO_test()</span><br><span class="line">Func _fMyADO_test()</span><br><span class="line">Local $sDSN = &apos;PostgreSQL35W&apos; </span><br><span class="line">Local $sDatabase = &apos;xxx&apos; ; DB Name</span><br><span class="line">Local $sServer = &apos;xxx&apos;   ; DB Host</span><br><span class="line">Local $sPort = &apos;xx&apos;      ; DB Port</span><br><span class="line">Local $sUser = &apos;xx&apos;      ; DB Username</span><br><span class="line">Local $sPassword = &apos;xx&apos;  ; DB Password</span><br><span class="line"></span><br><span class="line">Local $sConnectionString = &apos;DSN=&apos; &amp; $sDSN &amp; &apos;;DATABASE=&apos; &amp; $sDatabase &amp; &apos;;SERVER=&apos; &amp; $sServer &amp; &apos;;PORT=&apos; &amp; $sPort &amp; &apos;;UID=&apos; &amp; $sUser &amp; &apos;;PWD=&apos; &amp; $sPassword &amp; &apos;;&apos;</span><br><span class="line"></span><br><span class="line">; Create connection object</span><br><span class="line">Local $oConnection = _ADO_Connection_Create()</span><br><span class="line"></span><br><span class="line">; Open connection with $sConnectionString</span><br><span class="line">_ADO_Connection_OpenConString($oConnection, $sConnectionString)</span><br><span class="line">If @error Then Return SetError(@error, @extended, $ADO_RET_FAILURE)</span><br><span class="line"></span><br><span class="line">$oCon = $oConnection</span><br><span class="line"></span><br><span class="line">Local $Query, $aQresult, $Qresult</span><br><span class="line"></span><br><span class="line">ConsoleWrite(&quot;_Example_PostgreSQL &quot; &amp; $sConnectionString &amp; @CRLF)</span><br><span class="line">$Query = &quot;insert into company (id, name, age) values (11, &apos;gongwo&apos;, 1) ;&quot;</span><br><span class="line">$aQresult = _ADO_Execute($oCon, $Query, True)</span><br><span class="line">ConsoleWrite(&quot;1 $Query &quot; &amp; $Query &amp; @CRLF)</span><br><span class="line">ConsoleWrite(&quot;1 $Qresult &quot; &amp; $Qresult &amp; @CRLF)</span><br><span class="line">ConsoleWrite(&quot;1 $aQresult &quot; &amp; $aQresult &amp; @CRLF)</span><br><span class="line">$aQresult = &apos;&apos;</span><br><span class="line"></span><br><span class="line">$Query = &quot;Select * from company ; &quot;</span><br><span class="line">$aQresult = _ADO_Execute($oCon, $Query, True)</span><br><span class="line">$Qresult = _ArrayToString($aQresult[2])</span><br><span class="line">ConsoleWrite(&quot;2 $Query &quot; &amp; $Query &amp; @CRLF)</span><br><span class="line">ConsoleWrite(&quot;2 $Qresult &quot; &amp; $Qresult &amp; @CRLF)</span><br><span class="line">$aQresult = &apos;&apos;</span><br><span class="line">EndFunc   ;==&gt;_fMyADO_test</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="其他" scheme="https://l2m2.top/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="AutoIt" scheme="https://l2m2.top/tags/AutoIt/"/>
    
  </entry>
  
  <entry>
    <title>搭建Qt for Android开发环境</title>
    <link href="https://l2m2.top/2023/05/10/2023-05-10-qt-for-android-env-build/"/>
    <id>https://l2m2.top/2023/05/10/2023-05-10-qt-for-android-env-build/</id>
    <published>2023-05-10T15:45:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Installing-the-Prerequisites"><a href="#Installing-the-Prerequisites" class="headerlink" title="Installing the Prerequisites"></a>Installing the Prerequisites</h2><p>In order to use <a href="https://doc.qt.io/qt-5/android.html" target="_blank" rel="noopener">Qt for Android</a>, you need the following:</p><h3 id="JDK"><a href="#JDK" class="headerlink" title="JDK"></a>JDK</h3><p>Java Development Kit (JDK) provided by <a href="https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot" target="_blank" rel="noopener">AdoptOpenJDK</a> for all platforms, is required to build Android apps. Other alternatives such as <a href="http://openjdk.java.net/" target="_blank" rel="noopener">OpenJDK</a> for Linux or <a href="https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html" target="_blank" rel="noopener">Java SE Development Kit</a> for Windows are also supported.</p><blockquote><p><strong>Note:</strong> As of Qt 5.15.8, JDK 11 or later is supported for Qt for Android.</p></blockquote><p>Verify your installation</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ java -version</span><br><span class="line">openjdk version <span class="string">"11.0.19"</span> 2023-04-18</span><br><span class="line">OpenJDK Runtime Environment Temurin-11.0.19+7 (build 11.0.19+7)</span><br><span class="line">OpenJDK 64-Bit Server VM Temurin-11.0.19+7 (build 11.0.19+7, mixed mode)</span><br></pre></td></tr></table></figure><h3 id="Gradle"><a href="#Gradle" class="headerlink" title="Gradle"></a>Gradle</h3><p><a href="http://www.gradle.org/" target="_blank" rel="noopener">Gradle</a> for building application packages (APK) and app bundles (AAB) for Android devices. Gradle is delivered with Qt 5.9, and later.</p><blockquote><p><strong>Note:</strong> Using Ant to build APKs is no longer supported.</p></blockquote><p>*<em>Step 1. *</em><a href="https://gradle.org/releases" target="_blank" rel="noopener">Download</a> the latest Gradle distribution</p><p>*<em>Step 2. *</em>Unpack the distribution</p><p>Create a new directory <code>C:\Gradle</code> with <strong>File Explorer</strong>.</p><p>Open a second <strong>File Explorer</strong> window and go to the directory where the Gradle distribution was downloaded. Double-click the ZIP archive to expose the content. Drag the content folder <code>gradle-8.1.1</code> to your newly created <code>C:\Gradle</code> folder.</p><p>Alternatively you can unpack the Gradle distribution ZIP into <code>C:\Gradle</code> using an archiver tool of your choice.</p><p>*<em>Step 3. *</em>Configure your system environment</p><p>In <strong>File Explorer</strong> right-click on the <code>This PC</code> (or <code>Computer</code>) icon, then click <code>Properties</code> -&gt; <code>Advanced System Settings</code> -&gt; <code>Environmental Variables</code>.</p><p>Under <code>System Variables</code> select <code>Path</code>, then click <code>Edit</code>. Add an entry for <code>C:\Gradle\gradle-8.1.1\bin</code>. Click OK to save.</p><p>*<em>Step 4. *</em>Verify your installation</p><p>Open a console (or a Windows command prompt) and run <code>gradle -v</code> to run gradle and display the version, e.g.:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ gradle -v</span><br><span class="line">------------------------------------------------------------</span><br><span class="line">Gradle 8.1.1</span><br><span class="line">------------------------------------------------------------</span><br></pre></td></tr></table></figure><h3 id="Android-SDK"><a href="#Android-SDK" class="headerlink" title="Android SDK"></a>Android SDK</h3><p><a href="http://developer.android.com/sdk/index.html" target="_blank" rel="noopener">The Android Command-line SDK Tools</a> to install the following packages that are required to compile Qt applications for Android:</p><ul><li>Platform tools</li><li>Build tools</li><li>At least one SDK platform</li><li><a href="https://doc.qt.io/qt-5/android-getting-started.html#android-ndk" target="_blank" rel="noopener">The Android NDK</a>, which contains toolchains and debuggers for Android.</li></ul><blockquote><p><strong>Note:</strong> Qt Creator 4.12 or later can set up the SDK Tools, NDK, and essential packages automatically. For more information, see <a href="http://doc.qt.io/qtcreator/creator-developing-android.html#specifying-android-device-settings" target="_blank" rel="noopener">Qt Creator: Specifying Android Device Settings</a>.</p></blockquote><blockquote><p><strong>Note:</strong> If you are using the SDK Tools 26.x or below, the JDK 8 is required. Versions higher than 8 might cause issues for <a href="https://doc.qt.io/qt-5/android-getting-started.html#android-sdk" target="_blank" rel="noopener">the Android SDK tools</a>.</p></blockquote><blockquote><p><strong>Note:</strong> If your Qt version is earlier than v5.9, use the SDK tools package v25.2.5 or earlier.</p></blockquote><p><strong>Installing the Android SDK Essentials</strong></p><p>After downloading and unpacking the Commandline SDK Tools, use the <code>sdkmanager</code> command line tool to install the essential packages:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ sdkmanager.bat --sdk_root=<span class="string">"D:\Programs\android-sdk"</span> --install <span class="string">"cmdline-tools;latest"</span></span><br><span class="line">$ sdkmanager.bat --sdk_root=<span class="string">"D:\Programs\android-sdk"</span> --install <span class="string">"platform-tools"</span> <span class="string">"platforms;android-29"</span> <span class="string">"build-tools;29.0.2"</span> <span class="string">"ndk;21.3.6528147"</span></span><br></pre></td></tr></table></figure><p><a href="https://developer.android.com/studio#downloads" target="_blank" rel="noopener">Android Studio</a> or the Qt Creator’s <a href="http://doc.qt.io/qtcreator/creator-deploying-android.html#managing-android-skd-packages" target="_blank" rel="noopener">SDK Manager UI</a> can also be used to install the essential SDK packages.</p><p><strong>NDK</strong></p><p><a href="http://developer.android.com/tools/sdk/ndk/index.html" target="_blank" rel="noopener">The Android NDK</a> can be installed using the <code>sdkmanager</code> tool. Alternatively, you can download it and extract it manually to a path of your choosing.</p><p>Different Qt versions depend on different NDK versions, as listed below:</p><table><thead><tr><th align="center">Qt version</th><th align="center">NDK version</th><th align="center">Toolchain</th></tr></thead><tbody><tr><td align="center">Qt 5.14.0 or later Qt 5.13.2 or later Qt 5.12.6 or later</td><td align="center">NDK r20b or r21</td><td align="center"><em>android-clang</em></td></tr><tr><td align="center">Qt 5.12.0 to 5.12.5 Qt 5.13.0 to 5.13.1</td><td align="center">NDK r19c</td><td align="center"><em>android-clang</em></td></tr><tr><td align="center">Qt 5.11 and earlier</td><td align="center">NDK r10e</td><td align="center"><em>GCC</em> toolchain</td></tr></tbody></table><h2 id="Host-Specific-Configuration"><a href="#Host-Specific-Configuration" class="headerlink" title="Host Specific Configuration"></a>Host Specific Configuration</h2><h3 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h3><p>The default USB driver on Windows does not allow debugging using Android Debug Bridge (ADB) tool. You must install the additional USB driver provided by the <em>extras</em> Android SDK package. To install it, run the following:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sdkmanager.bat --sdk_root=<span class="string">"D:\Programs\android-sdk"</span> --install <span class="string">"extras;google;usb_driver"</span></span><br></pre></td></tr></table></figure><p>After the package installation is complete, install the driver from <code>&lt;ANDROID_SDK_ROOT&gt;/extras/google/usb_driver</code>. Try running a few basic <a href="http://developer.android.com/tools/help/adb.html" target="_blank" rel="noopener">adb</a> commands now and check whether your Android device responds to them.</p><h2 id="Qt-Creator"><a href="#Qt-Creator" class="headerlink" title="Qt Creator"></a>Qt Creator</h2><p><img src="/images/2023051001.png" alt></p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://doc.qt.io/qt-5/android-getting-started.html" target="_blank" rel="noopener">https://doc.qt.io/qt-5/android-getting-started.html</a></li><li><a href="https://gradle.org/install/" target="_blank" rel="noopener">https://gradle.org/install/</a></li></ul>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="Qt" scheme="https://l2m2.top/categories/Qt/"/>
    
    
      <category term="Qt" scheme="https://l2m2.top/tags/Qt/"/>
    
  </entry>
  
  <entry>
    <title>Midjourney傻瓜指南</title>
    <link href="https://l2m2.top/2023/03/30/2023-03-30-midjourney/"/>
    <id>https://l2m2.top/2023/03/30/2023-03-30-midjourney/</id>
    <published>2023-03-30T10:37:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>本文会介绍如何订阅海外服务充值(使用nodepay)，以及如何玩Midjourney。</p><h2 id="nodepay"><a href="#nodepay" class="headerlink" title="nodepay"></a>nodepay</h2><p>订阅海外服务充值，玩了一通下来，感觉nodepay操作上最傻瓜，更适合普通用户。以下是详细步骤：</p><ol><li><p>登录nodepay官网</p></li><li><p>注册nodepay账号，邀请码可以google一个，我使用的是 CDFBE23</p></li><li><p>注册过程中，需要进行人脸识别，进行实名认证</p></li><li><p>注册成功后，登录nodepay</p></li><li><p>在线充值，我是在普通账户中进行充值的。有个限制，最低充500RMB</p></li><li><p>开通虚拟信用卡。在左侧导航选择“我的卡片”-&gt;“快速开卡”：</p><p><img src="/images/2023033001.png" alt></p></li><li><p>给虚拟信用卡充值。在左侧导航选择“我的卡片”-&gt;“卡片列表”。对需要充值的卡片选择”管理”-&gt;“卡片充值”。</p></li></ol><h2 id="Midjourney"><a href="#Midjourney" class="headerlink" title="Midjourney"></a>Midjourney</h2><p>Midjourney需要订阅才能使用，我目前选择的是按月订阅，每月10刀。</p><ol><li><p>注册一个Discord账号</p></li><li><p>进入Discord选择添加服务器</p><p><img src="/images/2023033002.png" alt></p></li><li><p>点击加入服务器</p><p><img src="/images/2023033003.png" alt></p></li><li><p>在邀请链接那里填入：<a href="https://t.co/Q31mkUKx1x" target="_blank" rel="noopener">https://discord.gg/midjourney</a>  之后点击加入服务器</p><p><img src="/images/2023033004.png" alt></p></li><li><p>进入midjourney频道社区后，找到newbies</p><p><img src="/images/2023033005.png" alt></p></li><li><p>在对话框那里输入/imagine  比如“The frog and the elephant play mahjong together” 回车</p><p><img src="/images/2023033006.png" alt></p></li><li><p>在那里就能生成你的图片了，U1-U2-U3-U4分别对应1-2-3-4的大图片，你想要第2张的大图，就点击U2，V1-V2-V3-V4分别对应1-2-3-4的拓展图，你想拓展一下第4张图，那你就点击V4，又会自动帮你生成4张V4风格拓展图。</p><p><img src="/images/2023033007.png" alt></p></li><li><p>需要注意的是因为用的人比较多，你的消息可能会淹没在消息列表中，你可在<a href="https://t.co/uPt2mSFvkp" target="_blank" rel="noopener">http://midjourney.com</a>官网上用discord号登录，然后在你的主页上就能看到你在discord里对AI下命令生成的图片了!</p></li></ol><p>​    </p>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="AI" scheme="https://l2m2.top/categories/AI/"/>
    
    
      <category term="Midjourney" scheme="https://l2m2.top/tags/Midjourney/"/>
    
  </entry>
  
  <entry>
    <title>使用ChatGPT Next Web搭建自己的ChatGPT网页服务</title>
    <link href="https://l2m2.top/2023/03/05/2023-03-05-chatgpt-next-web/"/>
    <id>https://l2m2.top/2023/03/05/2023-03-05-chatgpt-next-web/</id>
    <published>2023-03-05T10:37:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>ChatGPT Next Web是一个开源项目，用于一键搭建自己的ChatGPT网页服务。</p><h2 id="Steps"><a href="#Steps" class="headerlink" title="Steps"></a>Steps</h2><ol><li><p>获取你的OpenAI API Key：<a href="https://platform.openai.com/account/api-keys" target="_blank" rel="noopener">https://platform.openai.com/account/api-keys</a></p></li><li><p>在开源项目中 <a href="https://github.com/Yidadaa/ChatGPT-Next-Web" target="_blank" rel="noopener">https://github.com/Yidadaa/ChatGPT-Next-Web</a> 的README中点击Deploy</p></li><li><p>进入vercel页面后，使用Github账户登录，期间需要验证手机号，使用大陆手机号即可</p></li><li><p>在Configure Project中，输入步骤1中的API Key，在CODE框中输入密码。多个密码用;分隔</p><p><img src="/images/2023040302.png" alt></p></li><li><p>点击Deploy</p></li><li><p>等待部署完成即可</p></li></ol><h2 id="绑定自己的域名"><a href="#绑定自己的域名" class="headerlink" title="绑定自己的域名"></a>绑定自己的域名</h2><ol><li><p>在<a href="https://vercel.com/dashboard中找到chat-gpt-next-web项目，进入项目设置" target="_blank" rel="noopener">https://vercel.com/dashboard中找到chat-gpt-next-web项目，进入项目设置</a></p></li><li><p>在Domains中添加自己的域名</p><p><img src="/images/2023040303.png" alt></p></li><li><p>配置CNAME，在域名提供商处进行配置。下图是我的阿里云DNS解析设置</p><p><img src="/images/2023040304.png" alt></p></li><li><p>现在可以使用自定义域名访问自己的ChatGPT网页服务啦。</p></li></ol>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="AI" scheme="https://l2m2.top/categories/AI/"/>
    
    
      <category term="ChatGPT" scheme="https://l2m2.top/tags/ChatGPT/"/>
    
  </entry>
  
  <entry>
    <title>秒开你的WordPress网站</title>
    <link href="https://l2m2.top/2023/03/03/2023-03-03-wordpress-to-static/"/>
    <id>https://l2m2.top/2023/03/03/2023-03-03-wordpress-to-static/</id>
    <published>2023-03-03T16:16:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>在尝试了各种WordPress插件之后，网站打开速度仍然不理想。</p><p>换了另外一种方案，将WordPress网站转成全静态资源，再将这些资源上传到OSS。最终测试结果：毫秒级打开网站。</p><p>这相当于将静态网站托管到阿里云OSS的存储空间，并用OSS的域名访问这个网站。</p><h2 id="全静态"><a href="#全静态" class="headerlink" title="全静态"></a>全静态</h2><ol><li>安装 Simply Static 插件</li><li>Simply Static -&gt; Settings，Delivery Method选择ZIP Archive，保存设置</li><li>Simply Static -&gt; Generate-&gt;GENERATE STATIC FILES，完成后下载打包好的压缩文件</li></ol><h2 id="OSS"><a href="#OSS" class="headerlink" title="OSS"></a>OSS</h2><ol><li><p>开通OSS(我使用的是阿里云OSS)</p></li><li><p>将静态资源解压后，上传到OSS的bucket</p></li><li><p>OSS控制台 -&gt; Bucket列表 -&gt; 你创建的Bucket -&gt; 数据管理 -&gt; 静态页面 -&gt;设置，如下图</p><p><img src="/images/2023030301.png" alt></p></li><li><p>OSS控制台 -&gt; Bucket列表 -&gt; 你创建的Bucket -&gt; Bucket配置 -&gt; 域名管理 -&gt; 绑定域名，如下图</p><p><img src="/images/2023030302.png" alt></p></li></ol><h2 id="域名解析"><a href="#域名解析" class="headerlink" title="域名解析"></a>域名解析</h2><ol><li><p>在域名解析中配置CNAME，如下图</p><p><img src="/images/2023030303.png" alt></p></li></ol><h2 id="SSL"><a href="#SSL" class="headerlink" title="SSL"></a>SSL</h2><ol><li>可以在阿里云中申请免费证书</li></ol><p>​    <img src="/images/2024030102.jpg" alt></p><ol start="2"><li><p>然后在OSS控制台中进行设置</p><p><img src="/images/2024030101.jpg" alt></p></li></ol>]]></content>
    
    <summary type="html">
    
      全静态+OSS
    
    </summary>
    
      <category term="其他" scheme="https://l2m2.top/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="WordPress" scheme="https://l2m2.top/tags/WordPress/"/>
    
  </entry>
  
  <entry>
    <title>使用Nginx Proxy Manager反向代理神器配置域名解析</title>
    <link href="https://l2m2.top/2023/03/01/2023-03-01-nginx-proxy-manager/"/>
    <id>https://l2m2.top/2023/03/01/2023-03-01-nginx-proxy-manager/</id>
    <published>2023-03-01T09:22:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>测试环境：CentOS 7.9，阿里云服务器</p><h2 id="Steps"><a href="#Steps" class="headerlink" title="Steps"></a>Steps</h2><ol><li><p>安装 Nginx Proxy Manager</p><p>若未安装Docker Compose，先安装Docker Compose，参考<a href="https://docs.docker.com/compose/install/" target="_blank" rel="noopener">官网文档</a></p></li></ol><p>-<br>   新建一个docker-compose.yml文件</p>   <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">"3"</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"><span class="attr">  app:</span></span><br><span class="line"><span class="attr">    image:</span> <span class="string">'jc21/nginx-proxy-manager:latest'</span></span><br><span class="line"><span class="attr">    restart:</span> <span class="string">unless-stopped</span></span><br><span class="line"><span class="attr">    ports:</span></span><br><span class="line">      <span class="comment"># These ports are in format &lt;host-port&gt;:&lt;container-port&gt;</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">'80:80'</span> <span class="comment"># Public HTTP Port</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">'443:443'</span> <span class="comment"># Public HTTPS Port</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">'81:81'</span> <span class="comment"># Admin Web Port</span></span><br><span class="line"><span class="attr">    volumes:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">./data:/data</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">./letsencrypt:/etc/letsencrypt</span></span><br></pre></td></tr></table></figure><p>   启动服务：</p>   <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ docker-compose up -d</span><br></pre></td></tr></table></figure><ol start="2"><li><p>打开Nginx Proxy Manager后台管理页面。<a href="http://x.x.x.x:81。初始用户名是admin@example.com，密码是changeme。" target="_blank" rel="noopener">http://x.x.x.x:81。初始用户名是admin@example.com，密码是changeme。</a></p><p>登录后，按要求修改初始密码。</p></li><li><p>配置域名解析。</p><p><img src="/images/2023030102.png" alt></p></li><li><p>配置云服务器的安全组规则。</p><p><img src="/images/2023030103.png" alt></p><p>如果服务器配置了防火墙，需要再进行防火墙配置。</p></li><li><p>配置反向代理。</p><p>在Nginx Proxy Manager管理页面Hosts-&gt;Proxy Host-&gt;Add Proxy Host</p><p><img src="/images/2023030101.png" alt></p><p>建议勾选上“Block Common Exploits”，阻止常见漏洞。</p><p>配置二级域名也一样，如下图：</p><p><img src="/images/2023030104.png" alt></p></li><li><p>添加SSL证书。</p><p>在Nginx Proxy Manager管理页面SSL Certificates-&gt;Add SSL Certificate-&gt;Let’s Encrypt</p><p><img src="/images/2023030105.png" alt></p><p>Credentials File Content中的access_key和access-key_secret需要替换成您自己的。</p><p>可在阿里云管理端获取（阿里云控制台点最右侧的头像-&gt;Access Key管理）。</p></li><li><p>配置HTTPS。</p><p>在反向代理的配置页面的SSL选项卡中进行选择即可。</p><p><img src="/images/2023030106.png" alt></p></li><li><p>Done!</p></li></ol>]]></content>
    
    <summary type="html">
    
      使用反向代理配置二级域名；支持HTTPS
    
    </summary>
    
      <category term="运维" scheme="https://l2m2.top/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="Nginx" scheme="https://l2m2.top/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>修改已存在的Docker容器的端口映射</title>
    <link href="https://l2m2.top/2023/02/15/2023-02-15-change-port-mapping-on-docker/"/>
    <id>https://l2m2.top/2023/02/15/2023-02-15-change-port-mapping-on-docker/</id>
    <published>2023-02-15T09:51:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>测试环境：CentOS 7.9</p><h2 id="Steps"><a href="#Steps" class="headerlink" title="Steps"></a>Steps</h2><ol><li><p>停止当前容器。作为示例，wp是我要修改端口映射的容器名称。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ docker container stop wp</span><br></pre></td></tr></table></figure></li><li><p>停止Docker服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ systemctl stop docker</span><br></pre></td></tr></table></figure></li><li><p>找到容器的HASH ID</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ docker inspect wp</span><br><span class="line">[root@l2m2 ~]<span class="comment"># docker inspect wp</span></span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">"Id"</span>: <span class="string">"547ecaa980a4be72120176fddc580c4fd3526a3c08831e016f996c01be36d846"</span>,</span><br><span class="line">        <span class="string">"Created"</span>: <span class="string">"2022-12-06T06:49:30.380291936Z"</span>,</span><br><span class="line">        <span class="string">"Path"</span>: <span class="string">"docker-entrypoint.sh"</span>,</span><br><span class="line">        <span class="string">"Args"</span>: [</span><br><span class="line">            <span class="string">"apache2-foreground"</span></span><br><span class="line">        ],</span><br></pre></td></tr></table></figure><p>HASH ID为547ecaa980a4be72120176fddc580c4fd3526a3c08831e016f996c01be36d846</p></li><li><p>修改文件 /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json</p><p>找到PortBindings，修改映射端口。</p></li><li><p>重启Docker服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ systemctl restart docker</span><br></pre></td></tr></table></figure></li><li><p>启动容器</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ docker start wp</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="运维" scheme="https://l2m2.top/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="Docker" scheme="https://l2m2.top/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Python的Windows系统兼容性和无网环境使用</title>
    <link href="https://l2m2.top/2023/02/10/2023-02-10-using-python-on-windows/"/>
    <id>https://l2m2.top/2023/02/10/2023-02-10-using-python-on-windows/</id>
    <published>2023-02-10T14:34:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>最近在研究Windows系统(Windows XP/Windows 7/Windows 10)的GUI自动化方案，整理一下相关的知识。</p><h2 id="系统兼容性"><a href="#系统兼容性" class="headerlink" title="系统兼容性"></a>系统兼容性</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">As specified in PEP 11, a Python release only supports a Windows platform while Microsoft considers the platform under extended support. This means that Python 3.11 supports Windows 8.1 and newer. If you require Windows 7 support, please install Python 3.8.</span><br></pre></td></tr></table></figure><p>上面的文字引用自<a href="https://docs.python.org/3/using/windows.html" target="_blank" rel="noopener">Using Python on Windows</a>。</p><p>从<a href="https://www.python.org/downloads/windows/" target="_blank" rel="noopener">Python for Windows Downloads</a>页面也可以看出各个Windows系统可以安装的Python版本。</p><h3 id="Windows-10"><a href="#Windows-10" class="headerlink" title="Windows 10 +"></a>Windows 10 +</h3><p>到目前为止，Windows 10/Windows 11仍然是微软在维护的版本，因此最新的Python版本都是支持的。根据需要选择即可。</p><h3 id="Windows-7"><a href="#Windows-7" class="headerlink" title="Windows 7"></a>Windows 7</h3><p>要支持Windows 7, 必须安装Python 3.8或之前的版本。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">According to the release calendar specified in PEP 569, Python 3.8 is now in security fixes only stage of its life cycle: 3.8 branch only accepts security fixes and releases of those are made irregularly in source-only form until October 2024. Python 3.8 isn&apos;t receiving regular bugfixes anymore, and binary installers are no longer provided for it. Python 3.8.10 was the last full bugfix release of Python 3.8 with binary installers.</span><br></pre></td></tr></table></figure><p>目前官方提供的二进制安装包最新只到3.8.10。可在<a href="https://www.python.org/downloads/release/python-3810/" target="_blank" rel="noopener">官网</a>或者<a href="https://pan.quark.cn/s/e1fef829b045" target="_blank" rel="noopener">我的网盘</a>中获取。</p><h3 id="Windows-XP"><a href="#Windows-XP" class="headerlink" title="Windows XP"></a>Windows XP</h3><p>要支持Windows XP, 必须要安装 Python 3.4或之前的版本。</p><p>目前官方提供的二进制安装包只到3.4.4。可在<a href="https://www.python.org/downloads/release/python-344/" target="_blank" rel="noopener">官网</a>或者<a href="https://pan.quark.cn/s/e1fef829b045" target="_blank" rel="noopener">我的网盘</a>中获取。</p><h2 id="命令行安装"><a href="#命令行安装" class="headerlink" title="命令行安装"></a>命令行安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ python-3.4.3.msi /quiet /norestart</span><br><span class="line">$ python-3.8.10-amd64.exe /quiet /norestart</span><br></pre></td></tr></table></figure><p>Python 3.4默认安装的位置是%SystemDrive%\Python34。</p><p>Python3.8默认安装的位置是%LocalAppData%\Programs\Python\Python38。</p><h2 id="NSIS脚本安装"><a href="#NSIS脚本安装" class="headerlink" title="NSIS脚本安装"></a>NSIS脚本安装</h2><figure class="highlight nsis"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Exec</span> <span class="string">'"<span class="variable">$INSTDIR</span>\python-3.8.10-amd64.exe" /quiet /norestart'</span></span><br></pre></td></tr></table></figure><h2 id="virtualenv"><a href="#virtualenv" class="headerlink" title="virtualenv"></a>virtualenv</h2><h3 id="venv"><a href="#venv" class="headerlink" title="venv"></a>venv</h3><p>python3.6及更高版本中内置了venv，功能与virtualenv类似。无需额外安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ python3 -m venv .venv</span><br></pre></td></tr></table></figure><h3 id="virtualenv-1"><a href="#virtualenv-1" class="headerlink" title="virtualenv"></a>virtualenv</h3><p>在有网环境中，使用pip安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ python -m pip install --user virtualenv</span><br><span class="line">$ python -m virtualenv --<span class="built_in">help</span></span><br></pre></td></tr></table></figure><p>创建</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ virtualenv .venv</span><br></pre></td></tr></table></figure><p>删除</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ rm -rf .venv</span><br></pre></td></tr></table></figure><p>启用</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ .venv\Scripts\activate.bat</span><br></pre></td></tr></table></figure><p>禁用</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ .venv\Scripts\deactivate.bat</span><br></pre></td></tr></table></figure><p>在无网环境中，使用zipapps。你可以在<a href="https://virtualenv.pypa.io/en/latest/installation.html" target="_blank" rel="noopener">官网</a>或者<a href="https://pan.quark.cn/s/e1fef829b045" target="_blank" rel="noopener">我的网盘</a>获取virtualenv.pyz。</p><p>创建</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ python virtualenv.pyz .venv</span><br></pre></td></tr></table></figure><h2 id="无网环境中安装包"><a href="#无网环境中安装包" class="headerlink" title="无网环境中安装包"></a>无网环境中安装包</h2><h3 id="使用pip"><a href="#使用pip" class="headerlink" title="使用pip"></a>使用pip</h3><ol><li><p>在相同环境(Windows, Python)的有网机器上执行download</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ pip download -r requirements.txt -d wheelfiles --trusted-host mirrors.aliyun.com</span><br></pre></td></tr></table></figure><p>如果使用了阿里云的镜像，要加上–trusted-host mirrors.aliyun.com。</p><p>如果是较老的pip版本，需要用pip install –download替代pip download。</p></li><li><p>在无网机器上执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ pip install -r requirements.txt --no-index --find-links path/to/wheels</span><br></pre></td></tr></table></figure></li></ol><h3 id="使用virtualenv"><a href="#使用virtualenv" class="headerlink" title="使用virtualenv"></a>使用virtualenv</h3><ol><li>确保有网机器和无网机器的Python版本、操作系统、architecture一致。</li><li>拷贝整个虚拟环境目录到目标机</li></ol>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="Python" scheme="https://l2m2.top/categories/Python/"/>
    
    
      <category term="Python" scheme="https://l2m2.top/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>如何注册ChatGPT</title>
    <link href="https://l2m2.top/2023/01/04/2023-01-04-chatgpt-register/"/>
    <id>https://l2m2.top/2023/01/04/2023-01-04-chatgpt-register/</id>
    <published>2023-01-04T10:37:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Steps"><a href="#Steps" class="headerlink" title="Steps"></a>Steps</h2><ol><li><p>挂代理</p></li><li><p>注册、登录(或用Google账户登录)</p></li><li><p>搞一个虚拟国外手机号进行验证 <a href="http://sms-activate.org/cn" target="_blank" rel="noopener">http://sms-activate.org/cn</a>，支付宝充值0.5刀，选择印度手机号收验证码激活</p><p><img src="/images/2023040301.png" alt></p></li><li><p>访问  <a href="http://chat.openai.com" target="_blank" rel="noopener">http://chat.openai.com</a>开始玩</p></li></ol><h2 id="ChatGPT-Plus"><a href="#ChatGPT-Plus" class="headerlink" title="ChatGPT Plus"></a>ChatGPT Plus</h2><p>订阅ChatGPT Plus可用nodepay创建虚拟信用卡进行支付。</p><ol><li><p>登录nodepay官网</p></li><li><p>注册nodepay账号，邀请码可以google一个，我使用的是 CDFBE23</p></li><li><p>注册过程中，需要进行人脸识别，进行实名认证</p></li><li><p>注册成功后，登录nodepay</p></li><li><p>在线充值，我是在普通账户中进行充值的。有个限制，最低充500RMB</p></li><li><p>开通虚拟信用卡。在左侧导航选择“我的卡片”-&gt;“快速开卡”：</p><p><img src="/images/2023033001.png" alt></p></li><li><p>给虚拟信用卡充值。在左侧导航选择“我的卡片”-&gt;“卡片列表”。对需要充值的卡片选择”管理”-&gt;“卡片充值”。</p></li></ol>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="AI" scheme="https://l2m2.top/categories/AI/"/>
    
    
      <category term="ChatGPT" scheme="https://l2m2.top/tags/ChatGPT/"/>
    
  </entry>
  
  <entry>
    <title>使用npm管理C++/Qt的库文件</title>
    <link href="https://l2m2.top/2022/12/27/2022-12-27-binrary-mgt-use-npm/"/>
    <id>https://l2m2.top/2022/12/27/2022-12-27-binrary-mgt-use-npm/</id>
    <published>2022-12-27T14:50:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>公司内部使用的C++/Qt的版本固定，因此我们只需要管理编译好的库文件(*.lib, *.dll)以及头文件就好了。</p><p>我们使用npm来管理它们，可以使用npm的诸多功能，例如版本依赖、用户管理等。我们使用verdaccio搭建自己的npm镜像，可以方便在网页上查看目前公司已有的包。</p><h2 id="搭建公司私有npm镜像"><a href="#搭建公司私有npm镜像" class="headerlink" title="搭建公司私有npm镜像"></a>搭建公司私有npm镜像</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ docker pull verdaccio/verdaccio</span><br><span class="line">$ docker run -it --rm --name verdaccio -d -p 4873:4873 verdaccio/verdaccio</span><br></pre></td></tr></table></figure><p>添加用户</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm adduser --registry http://x.x.x.x:4873</span><br></pre></td></tr></table></figure><h2 id="package-json"><a href="#package-json" class="headerlink" title="package.json"></a>package.json</h2><p>package.json中写入要打包的头文件和库文件。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"name"</span>: <span class="string">"@gw/liclib"</span>,</span><br><span class="line">  <span class="attr">"version"</span>: <span class="string">"1.0.0"</span>,</span><br><span class="line">  <span class="attr">"author"</span>: <span class="string">"leon.li"</span>,</span><br><span class="line">  <span class="attr">"files"</span>: [</span><br><span class="line">    <span class="string">"include/gw/liclib/*"</span>,</span><br><span class="line">    <span class="string">"dist/debug/gw-liclibd.dll"</span>,</span><br><span class="line">    <span class="string">"dist/debug/gw-liclibd.lib"</span>,</span><br><span class="line">    <span class="string">"dist/debug/gw-liclibd.pdb"</span>,</span><br><span class="line">    <span class="string">"dist/debug/gw-hardware-key-getter.exe"</span>,</span><br><span class="line">    <span class="string">"dist/release/gw-liclib.dll"</span>,</span><br><span class="line">    <span class="string">"dist/release/gw-liclib.lib"</span>,</span><br><span class="line">    <span class="string">"dist/release/gw-liclib.pdb"</span>,</span><br><span class="line">    <span class="string">"dist/release/gw-hardware-key-getter.exe"</span></span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="发布包"><a href="#发布包" class="headerlink" title="发布包"></a>发布包</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm publish --registry http://x.x.x.x:4873/</span><br></pre></td></tr></table></figure><p>若某个库需要在多个平台发布，可以使用多个package.json，目录结构：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">|--@gw\</span><br><span class="line">|  |--liclib\</span><br><span class="line">|  |  |--dist\</span><br><span class="line">|  |  |--include\</span><br><span class="line">|  |  |--package.json</span><br><span class="line">|  |  |--publish.bat</span><br><span class="line">|  |--liclib-linux\</span><br><span class="line">|  |  |--dist\</span><br><span class="line">|  |  |--include\</span><br><span class="line">|  |  |--package.json</span><br><span class="line">|  |  |--publish.sh</span><br></pre></td></tr></table></figure><p>在publish.bat/publish.sh脚本中，将需要的文件拷贝到当前目录，再使用<code>npm publish</code>发布</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line"><span class="built_in">set</span> include_tmp_dir=%~dp0include\</span><br><span class="line"><span class="built_in">set</span> dist_tmp_dir=%~dp0dist\</span><br><span class="line"><span class="built_in">set</span> root_dir=%~dp0..\..\</span><br><span class="line"><span class="keyword">if</span> exist <span class="string">"%include_tmp_dir%"</span> rmdir /S /Q <span class="string">"%include_tmp_dir%"</span></span><br><span class="line"><span class="keyword">if</span> exist <span class="string">"%dist_tmp_dir%"</span> rmdir /S /Q <span class="string">"%dist_tmp_dir%"</span></span><br><span class="line">xcopy <span class="string">"%root_dir%include\" "</span>%include_tmp_dir%<span class="string">" /E /Y</span></span><br><span class="line"><span class="string">xcopy "</span>%root_dir%dist\" <span class="string">"%dist_tmp_dir%"</span> /E /Y</span><br><span class="line">xcopy <span class="string">"%root_dir%README.md"</span> <span class="string">"%~dp0"</span> /Y</span><br><span class="line">npm publish --registry http://x.x.x.x:4873/</span><br></pre></td></tr></table></figure><h2 id="取消发布"><a href="#取消发布" class="headerlink" title="取消发布"></a>取消发布</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm unpublish @gw/liclib --registry http://x.x.x.x:4873/ --force</span><br></pre></td></tr></table></figure><h2 id="使用包"><a href="#使用包" class="headerlink" title="使用包"></a>使用包</h2><p>在使用项目的根目录下添加一个package.json，添加依赖项</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"name"</span>: <span class="string">"test"</span>,</span><br><span class="line">  <span class="attr">"version"</span>: <span class="string">"1.0.0"</span>,</span><br><span class="line">  <span class="attr">"dependencies"</span>: &#123;</span><br><span class="line">    <span class="attr">"@gw/liclib"</span>: <span class="string">"^1.0.0"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>编写一个脚本执行npm包的下载，以及文件的拷贝，node_modules文件夹的删除。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line"><span class="built_in">set</span> gw_libs=liclib utillib</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> exist <span class="string">"node_modules"</span> rmdir /S /Q <span class="string">"node_modules"</span></span><br><span class="line"></span><br><span class="line">call npm install --registry http://x.x.x.x:4873/</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> %%a <span class="keyword">in</span> (%gw_libs%) <span class="keyword">do</span> ( </span><br><span class="line"> <span class="built_in">echo</span> %%a</span><br><span class="line"> xcopy node_modules\@gw\%%a\include\ include\ /E /Y</span><br><span class="line"> xcopy node_modules\@gw\%%a\dist\ dist\ /E /Y</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> exist <span class="string">"node_modules"</span> rmdir /S /Q <span class="string">"node_modules"</span></span><br></pre></td></tr></table></figure><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://docs.npmjs.com/cli/v9/configuring-npm/package-json" target="_blank" rel="noopener">https://docs.npmjs.com/cli/v9/configuring-npm/package-json</a></li></ul>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="运维" scheme="https://l2m2.top/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="yarn" scheme="https://l2m2.top/tags/yarn/"/>
    
      <category term="npm" scheme="https://l2m2.top/tags/npm/"/>
    
  </entry>
  
  <entry>
    <title>用WordPress+Astra+Elementor搭建企业官网</title>
    <link href="https://l2m2.top/2022/12/05/2022-12-05-build-official-website-with-wordpress/"/>
    <id>https://l2m2.top/2022/12/05/2022-12-05-build-official-website-with-wordpress/</id>
    <published>2022-12-05T09:50:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<p>本文演示如何使用WordPress、Astra主题、Elementor插件来构建一个企业官网。</p><p><em>测试环境：阿里云服务器，CentOS 7</em></p><p>如果仅仅是本地试玩，建议使用<a href="https://localwp.com/" target="_blank" rel="noopener">localwp</a>。</p><h2 id="1-安装WordPress"><a href="#1-安装WordPress" class="headerlink" title="1. 安装WordPress"></a>1. 安装WordPress</h2><p>本文演示使用Docker安装WordPress。如果购买的云服务器已经预装了WordPress，可跳过此步骤。</p><h3 id="1-1-安装WordPress需要的MySQL"><a href="#1-1-安装WordPress需要的MySQL" class="headerlink" title="1.1 安装WordPress需要的MySQL"></a>1.1 安装WordPress需要的MySQL</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ docker pull mysql</span><br><span class="line"><span class="comment"># 创建一个目录用于mount MySQL的数据</span></span><br><span class="line">$ mkdir -p /home/data/mysqldata</span><br><span class="line">$ docker run --name mysql -p 3306:3306 -v /home/data/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=**** -d --restart always mysql</span><br></pre></td></tr></table></figure><h3 id="1-2-在MySQL上创建一个新的数据库"><a href="#1-2-在MySQL上创建一个新的数据库" class="headerlink" title="1.2 在MySQL上创建一个新的数据库"></a>1.2 在MySQL上创建一个新的数据库</h3><p>创建的新数据库用于存储WordPress相关的数据。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 进入Docker容器</span></span><br><span class="line">$ docker <span class="built_in">exec</span> -it mysql bash </span><br><span class="line"><span class="comment"># 登录MySQL</span></span><br><span class="line">bash-4.4 <span class="comment"># mysql -u root -p </span></span><br><span class="line">mysql&gt; create database wordpress;</span><br><span class="line"><span class="comment"># 退出MySQL</span></span><br><span class="line">mysql&gt; \q </span><br><span class="line"><span class="comment"># 退出Docker容器</span></span><br><span class="line">bash-4.4<span class="comment"># exit</span></span><br></pre></td></tr></table></figure><h3 id="1-3-安装WordPress"><a href="#1-3-安装WordPress" class="headerlink" title="1.3 安装WordPress"></a>1.3 安装WordPress</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ docker pull wordpress</span><br><span class="line">$ mkdir -p /home/data/wordpressdata</span><br><span class="line">$ docker run --name wp -p 8080:80  -d -v /home/data/wordpressdata:/var/www/html --restart always wordpress</span><br></pre></td></tr></table></figure><h3 id="1-4-配置WordPress"><a href="#1-4-配置WordPress" class="headerlink" title="1.4 配置WordPress"></a>1.4 配置WordPress</h3><ul><li><p>打开 <a href="http://8.144.66.95:8080/" target="_blank" rel="noopener">http://8.144.66.95:8080/</a></p></li><li><p>选择语言，点击下一步，填写MySQL数据库配置,如下图</p><p><img src="/images/2020-12-01-install-wordpress-with-docker-1.png" alt></p></li><li><p>填写好标题、用户名等信息，点击安装WordPress</p><p><img src="/images/2020-12-01-install-wordpress-with-docker-2.png" alt></p></li><li><p>安装完成，登录即可使用WordPress来创建网站。</p></li></ul><h2 id="2-安装插件Elementor"><a href="#2-安装插件Elementor" class="headerlink" title="2. 安装插件Elementor"></a>2. 安装插件Elementor</h2><h3 id="2-1-安装-Elementor"><a href="#2-1-安装-Elementor" class="headerlink" title="2.1 安装 Elementor"></a>2.1 安装 Elementor</h3><p>在WordPress导航中找到“插件”，然后再点击“安装插件”</p><p><img src="/images/2022120501.png" alt></p><p>在搜索框输入“Elementor”，在检索到的页面找到“Elementor Website Builder”，点击安装。</p><p><img src="/images/2022120502.png" alt></p><h3 id="2-2-启用-Elementor"><a href="#2-2-启用-Elementor" class="headerlink" title="2.2 启用  Elementor"></a>2.2 启用  Elementor</h3><p>确保插件已被启用</p><p><img src="/images/2022120503.png" alt></p><h2 id="3-安装主题Astra"><a href="#3-安装主题Astra" class="headerlink" title="3. 安装主题Astra"></a>3. 安装主题Astra</h2><h3 id="3-1-安装Astra"><a href="#3-1-安装Astra" class="headerlink" title="3.1 安装Astra"></a>3.1 安装Astra</h3><p>在WordPress导航中找到“外观”-&gt;“主题”，然后再点击“安装主题”</p><p><img src="/images/2022120504.png" alt></p><p>在搜索框中输入“Astra”，在检索到的页面中找到Astra主题，点击安装。</p><h3 id="3-2-启用Astra"><a href="#3-2-启用Astra" class="headerlink" title="3.2 启用Astra"></a>3.2 启用Astra</h3><p><img src="/images/2022120505.png" alt></p><h3 id="3-3-安装Astra导入插件"><a href="#3-3-安装Astra导入插件" class="headerlink" title="3.3 安装Astra导入插件"></a>3.3 安装Astra导入插件</h3><p><img src="/images/2022120506.png" alt></p><h3 id="3-4-查看模板库，选取模板"><a href="#3-4-查看模板库，选取模板" class="headerlink" title="3.4 查看模板库，选取模板"></a>3.4 查看模板库，选取模板</h3><p><img src="/images/2022120507.png" alt></p><p>选择中意的模板。然后在“Select Page Builder”页面选择Elementor。</p><p><img src="/images/2022120508.png" alt></p><h3 id="3-5-设置模板的Logo、色系、字体"><a href="#3-5-设置模板的Logo、色系、字体" class="headerlink" title="3.5 设置模板的Logo、色系、字体"></a>3.5 设置模板的Logo、色系、字体</h3><p>挑选好模板后，可以即刻对网站进行一些基础设置。</p><p>可以替换Logo。</p><p><img src="/images/2022120509.png" alt></p><p>选择色系，字体。</p><p><img src="/images/2022120510.png" alt></p><p>设置完成，等待安装完成。</p><p><img src="/images/2022120511.png" alt></p><h2 id="4-编辑页面"><a href="#4-编辑页面" class="headerlink" title="4. 编辑页面"></a>4. 编辑页面</h2><h3 id="4-1-使用Elementor编辑页面"><a href="#4-1-使用Elementor编辑页面" class="headerlink" title="4.1 使用Elementor编辑页面"></a>4.1 使用Elementor编辑页面</h3><p>Astra模板设置好后，接下来就是对具体页面中的图片、文字进行替换、编辑的过程了。</p><p><img src="/images/2022120512.png" alt></p><h3 id="4-2-改变菜单"><a href="#4-2-改变菜单" class="headerlink" title="4.2 改变菜单"></a>4.2 改变菜单</h3><p><img src="/images/2022120513.png" alt></p><h2 id="5-加速"><a href="#5-加速" class="headerlink" title="5. 加速"></a>5. 加速</h2><ul><li><p>如果是国内，安装插件<a href="https://github.com/litepress/wp-china-yes" target="_blank" rel="noopener">wp-china-yes</a></p></li><li><p>安装缓存插件WP Super Cache并在设置中启用</p><p><img src="/images/2022120514.png" alt></p></li><li><p>如果上面的方法都无效，可以使用Simply Static插件将wordpress转成全静态页面，再重新玩一个静态网站服务</p></li></ul><h2 id="6-常见问题"><a href="#6-常见问题" class="headerlink" title="6. 常见问题"></a>6. 常见问题</h2><ul><li><p>启用HTTPS后图片无法正常显示</p><p>在wp-includes/functions.php的最后加上下面的代码</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">add_filter(<span class="string">'script_loader_src'</span>, <span class="string">'agnostic_script_loader_src'</span>, <span class="number">20</span>,<span class="number">2</span>);</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">agnostic_script_loader_src</span><span class="params">($src, $handle)</span></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> preg_replace(<span class="string">'/^(http|https):/'</span>, <span class="string">''</span>, $src);</span><br><span class="line">&#125;</span><br><span class="line">add_filter(<span class="string">'style_loader_src'</span>, <span class="string">'agnostic_style_loader_src'</span>, <span class="number">20</span>,<span class="number">2</span>);</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">agnostic_style_loader_src</span><span class="params">($src, $handle)</span></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> preg_replace(<span class="string">'/^(http|https):/'</span>, <span class="string">''</span>, $src);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><h2 id="7-Reference"><a href="#7-Reference" class="headerlink" title="7. Reference"></a>7. Reference</h2><ul><li><a href="https://www.youtube.com/watch?v=6FZ6xP0nRmI&list=LL&index=2" target="_blank" rel="noopener">梧桐小讲堂的Youtube频道</a></li></ul>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="其他" scheme="https://l2m2.top/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="WordPress" scheme="https://l2m2.top/tags/WordPress/"/>
    
  </entry>
  
  <entry>
    <title>在Windwos XP上玩SikuliX</title>
    <link href="https://l2m2.top/2022/11/08/2022-11-08-sikulix-on-windows-xp/"/>
    <id>https://l2m2.top/2022/11/08/2022-11-08-sikulix-on-windows-xp/</id>
    <published>2022-11-08T15:21:00.000Z</published>
    <updated>2025-03-21T13:10:51.524Z</updated>
    
    <content type="html"><![CDATA[<h2 id="SikuliX"><a href="#SikuliX" class="headerlink" title="SikuliX"></a>SikuliX</h2><p><a href="https://sikulix.github.io/" target="_blank" rel="noopener">SikuliX</a>是一个基于图像识别的GUI自动化测试工具。</p><p>它提供像下面的脚本进行GUI自动化。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">openApp(someApp) <span class="comment"># we use an application someApp</span></span><br><span class="line">click(imageButton.png) <span class="comment"># we click some button</span></span><br><span class="line">wait(imageExpected.png) <span class="comment"># we wait for the app to react and show the expected result on the screen</span></span><br><span class="line">type(“some text”); type(Key.ENTER) <span class="comment"># we fill in some text and press ENTER</span></span><br><span class="line">wait(imageExpected1) <span class="comment"># again we wait for some expected reaction or result</span></span><br><span class="line">click(…) <span class="comment"># we click …</span></span><br></pre></td></tr></table></figure><h2 id="SikuliX-on-Windows-XP"><a href="#SikuliX-on-Windows-XP" class="headerlink" title="SikuliX on Windows XP"></a>SikuliX on Windows XP</h2><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><ol><li><p>最新的SikuliX版本(2.0.x)已不支持Windows XP，我们需要下载更老的支持Windows XP的<a href="https://launchpadlibrarian.net/79944188/Sikuli-X-1.0rc3%20%28r905%29-win32.exe" target="_blank" rel="noopener">版本</a>(1.0.0)。</p><p>SikuliX1.0.0的文档在<a href="http://doc.sikuli.org/index.html" target="_blank" rel="noopener">这里</a>。</p></li><li><p>下载支持Windows XP的<a href="https://download.oracle.com/otn/java/jdk/7u80-b15/jdk-7u80-windows-i586.exe?AuthParam=1667887537_f3ce2f1c0496eb3d295f9e2ad6b2c80c" target="_blank" rel="noopener">JDK 1.7</a>。</p></li><li><p>参考下面的图例设置JAVA环境变量</p><p><img src="/images/2022-11-08-sikulix-on-windows-xp_1.png" alt></p><p><img src="/images/2022-11-08-sikulix-on-windows-xp_2.png" alt></p><p><img src="/images/2022-11-08-sikulix-on-windows-xp_3.png" alt></p></li></ol><h3 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h3><p>安装完成之后，便可以打卡Sikuli IDE进行测试了。</p><p><img src="/images/2022-11-08-sikulix-on-windows-xp_4.gif" alt></p><p>上面的示例中，双击打开了我的电脑。</p><p>再写一个例子，创建一个文本文件，输入test，再另存到桌面上为test.txt，再关闭文件。</p><p>脚本如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">notepad = App.open(<span class="string">"notepad.exe"</span>)</span><br><span class="line">wait(<span class="number">1</span>)</span><br><span class="line">notepad.focus()</span><br><span class="line">type(<span class="string">"test"</span>)</span><br><span class="line">click(<span class="string">"Screenshot_1.png"</span>)</span><br><span class="line">wait(<span class="number">1</span>)</span><br><span class="line">click(<span class="string">"Screenshot_2.png"</span>)</span><br><span class="line">wait(<span class="number">1</span>)</span><br><span class="line">click(<span class="string">"Screenshot_3.png"</span>)</span><br><span class="line">type(<span class="string">"test.txt"</span>)</span><br><span class="line">click(<span class="string">"Screenshot_4.png"</span>)</span><br><span class="line">notepad.close()</span><br></pre></td></tr></table></figure><p>效果：</p><p><img src="/images/2022-11-08-sikulix-on-windows-xp_5.gif" alt></p><p>注意：如果在Windows XP下Sikuli IDE的屏幕截图不可用，可下载<a href="https://app.prntscr.com/build/setup-lightshot.exe" target="_blank" rel="noopener">lightshot</a>，事先把所需要的图片截好，再在Sikuli IDE中导入图片。</p><h3 id="命令行运行脚本"><a href="#命令行运行脚本" class="headerlink" title="命令行运行脚本"></a>命令行运行脚本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ Sikuli-IDE.exe -r test.sikuli</span><br></pre></td></tr></table></figure><p>test.sikuli是指包含图片和Python脚本的文件夹路径。</p>]]></content>
    
    <summary type="html">
    
      ~_~
    
    </summary>
    
      <category term="其他" scheme="https://l2m2.top/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="SikuliX" scheme="https://l2m2.top/tags/SikuliX/"/>
    
  </entry>
  
</feed>
