<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<atom:link href="https://book.loveliuran.cn/feed" rel="self" type="application/rss+xml"/>
<title>我的小世界呀</title>
<link>https://book.loveliuran.cn</link>
<description>哈喽~欢迎光临</description>
<language>zh-CN</language>
<copyright>© 浩 </copyright>
<pubDate>Sat, 09 May 2026 02:08:52 GMT</pubDate>
<generator>Mix Space CMS (https://github.com/mx-space)</generator>
<docs>https://mx-space.js.org</docs>
<image>
    <url>https://file.loveliuran.cn/699a9364-a78a-4ae6-b0b6-3fdc0df47212.jpeg?1</url>
    <title>我的小世界呀</title>
    <link>https://book.loveliuran.cn</link>
</image>
<item>
    <title>docker内网部署hoppscotch</title>
    <link>https://book.loveliuran.cn/posts/study/hoppscotch</link>
    <pubDate>Tue, 08 Jul 2025 06:30:56 GMT</pubDate>
    <description>1.安装docker
(借鉴与)[https://book.loveliuran.cn/posts/</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/study/hoppscotch'>https://book.loveliuran.cn/posts/study/hoppscotch</a></blockquote>
      <h2>1.安装docker</h2>
<p>(借鉴与)[<a href="https://book.loveliuran.cn/posts/study/docker%5D">https://book.loveliuran.cn/posts/study/docker]</a></p>
<h2>2.安装Hoppscotch</h2>
<h3>2.1 在安装目录创建<code>.env</code>文件</h3>
<pre><code class="language-angular2html">#-----------------------Backend Config------------------------------#
# Prisma Config
DATABASE_URL=postgresql://admin:123456@postgres:5432/hoppscotch?schema=public # or replace with your database URL

# (Optional) By default, the AIO container (when in subpath access mode) exposes the endpoint on port 80. Use this setting to specify a different port if needed.
HOPP_AIO_ALTERNATE_PORT=80

# Auth Tokens Config
JWT_SECRET=secretcode123
TOKEN_SALT_COMPLEXITY=10
MAGIC_LINK_TOKEN_VALIDITY=3
# Default validity is 7 days (604800000 ms) in ms
REFRESH_TOKEN_VALIDITY=604800000
# Default validity is 1 day (86400000 ms) in ms
ACCESS_TOKEN_VALIDITY=86400000
SESSION_SECRET=anothersecretcode123

# Recommended to be true, set to false if you are using http
# Note: Some auth providers may not support http requests
ALLOW_SECURE_COOKIES=true

# Sensitive Data Encryption Key while storing in Database (32 character)
DATA_ENCRYPTION_KEY=********************************

# Hoppscotch App Domain Config
REDIRECT_URL=http://192.168.110.251:3000
# Whitelisted origins for the Hoppscotch App.
# This list controls which origins can interact with the app through cross-origin comms.
# - localhost ports (3170, 3000, 3100): app, backend, development servers and services
# - app://localhost_3200: Bundle server origin identifier
#   NOTE: `3200` here refers to the bundle server (port 3200) that provides the bundles,
#   NOT where the app runs. The app itself uses the `app://` protocol with dynamic
#   bundle names like `app://{bundle-name}/`
WHITELISTED_ORIGINS=http://192.168.110.251:3170,http://192.168.110.251:3000,http://192.168.110.251:3100,app://localhost_3200,app://hoppscotch
VITE_ALLOWED_AUTH_PROVIDERS=GOOGLE,GITHUB,MICROSOFT,EMAIL

# Google Auth Config
GOOGLE_CLIENT_ID=************************************************
GOOGLE_CLIENT_SECRET=************************************************
GOOGLE_CALLBACK_URL=http://192.168.110.251:3170/v1/auth/google/callback
GOOGLE_SCOPE=email,profile

# Github Auth Config
GITHUB_CLIENT_ID=************************************************
GITHUB_CLIENT_SECRET=************************************************
GITHUB_CALLBACK_URL=http://192.168.110.251:3170/v1/auth/github/callback
GITHUB_SCOPE=user:email

# Microsoft Auth Config
MICROSOFT_CLIENT_ID=************************************************
MICROSOFT_CLIENT_SECRET=************************************************
MICROSOFT_CALLBACK_URL=http://192.168.110.251:3170/v1/auth/microsoft/callback
MICROSOFT_SCOPE=user.read
MICROSOFT_TENANT=common

# Mailer config
MAILER_SMTP_ENABLE=true
MAILER_USE_CUSTOM_CONFIGS=false
MAILER_ADDRESS_FROM=&lt;from@example.com&gt;
MAILER_SMTP_URL=smtps://user@domain.com:pass@smtp.domain.com # used if custom mailer configs is false

# The following are used if custom mailer configs is true
MAILER_SMTP_HOST=192.168.110.251
MAILER_SMTP_PORT=1025
MAILER_SMTP_SECURE=true
MAILER_SMTP_USER=user@domain.com
MAILER_SMTP_PASSWORD=pass
MAILER_TLS_REJECT_UNAUTHORIZED=true

# Rate Limit Config
RATE_LIMIT_TTL=60 # In seconds
RATE_LIMIT_MAX=100 # Max requests per IP

#-----------------------Frontend Config------------------------------#

# Base URLs
VITE_BASE_URL=http://192.168.110.251:3000
VITE_SHORTCODE_BASE_URL=http://192.168.110.251:3000
VITE_ADMIN_URL=http://192.168.110.251:3100

# Backend URLs
VITE_BACKEND_GQL_URL=http://192.168.110.251:3170/graphql
VITE_BACKEND_WS_URL=wss://192.168.110.251:3170/graphql
VITE_BACKEND_API_URL=http://192.168.110.251:3170/v1

# Terms Of Service And Privacy Policy Links (Optional)
VITE_APP_TOS_LINK=https://docs.hoppscotch.io/support/terms
VITE_APP_PRIVACY_POLICY_LINK=https://docs.hoppscotch.io/support/privacy

# Set to `true` for subpath based access
ENABLE_SUBPATH_BASED_ACCESS=false</code></pre><p>将上述IP地址修改为自己的IP地址。</p>
<h4>2.2 创建docker-compose.yml文件</h4>
<pre><code class="language-yaml">services:
  hoppscotch:
    image: hoppscotch/hoppscotch
    container_name: hoppscotch
    volumes:
      - /home/hoppscotch-aio/hoppscotch/config:/config # 从本地创建一个目录挂载到容器中以保留原有配置
    ports:
      - 8888:80
      - 3000:3000
      - 3100:3100
      - 3170:3170
      - 3200:3200
    env_file:
      - .env
    networks:
      - postgres
    restart: unless-stopped

networks:
  postgres:
    external: true</code></pre><h4>2.3 由于会依赖smtp服务，需要启动smtp服务</h4>
<p>启动smtp服务，这里使用docker启动，具体启动命令如下：</p>
<pre><code class="language-bash">docker run -d --name smtp -p 1025:1025 -p 1080:1080 dockage/mailcatcher:latest</code></pre><h4>2.4 启动Hoppscotch</h4>
<pre><code class="language-bash">docker-compose up -d</code></pre><blockquote>
<p>注意首次需要初始化一下数据库中</p>
<pre><code class="language-yaml">sudo docker compose run hoppscotch sh
pnpm dlx prisma migrate deploy</code></pre><p>然后重启容器就ok了</p>
<p><code>docker-compose restart hoppscotch</code></p>
</blockquote>
<p>启动成功后，访问<a href="http://192.168.110.251:3000%EF%BC%8C%E5%8D%B3%E5%8F%AF%E8%BF%9B%E5%85%A5Hoppscotch%E3%80%82">http://192.168.110.251:3000，即可进入Hoppscotch。</a></p>

      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/study/hoppscotch#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">686cbb2076cd7aade7e9fdb9</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>Jenkins配合gitLab构建流水线</title>
    <link>https://book.loveliuran.cn/posts/study/j1</link>
    <pubDate>Wed, 21 May 2025 04:00:19 GMT</pubDate>
    <description>环境要求
jenkins
gitlab

Jenkins配置
Jenkins 插件下载

GitLa</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/study/j1'>https://book.loveliuran.cn/posts/study/j1</a></blockquote>
      <h3>环境要求</h3>
<ol>
<li>jenkins</li>
<li>gitlab</li>
</ol>
<h4>Jenkins配置</h4>
<h5>Jenkins 插件下载</h5>
<pre><code class="language-angular2html">1. GitLab Plugin
2. Maven Integration plugin 
3. Git plugin
4. Blue Ocean #美化插件
5. Localization: Chinese (Simplified) #汉化插件
6. Pipeline #流水线管道插件</code></pre><blockquote>
<p>Tips: </p>
<ol>
<li>插件下载后，需要重启jenkins服务</li>
<li>Jenkins如果需要安装多个版本的maven，需要配置maven的安装路径，并配置maven的版本号（java同理）</li>
<li>Jenkins配置服务器信息，需要配置服务器的ip和端口号，以及服务器的用户名和密码</li>
</ol>
</blockquote>
<h5>Jenkins配置服务器信息</h5>
<p>配置服务器信息
</p>
<h5>Jenkins配置maven</h5>
<p>配置环境信息
</p>
<blockquote>
<p><strong>如果需要配置多个版本的maven，需要如上图配置多个maven的安装路径</strong></p>
</blockquote>
<h5>Jenkins配置Java</h5>
<p>配置java
</p>
<blockquote>
<p><strong>如果需要配置多个版本的java，需要如上图配置多个java的安装路径</strong></p>
</blockquote>
<h4>流水线创建及配置</h4>
<ol>
<li>创建流水线项目
</li>
<li>利用模板生成脚本
</li>
<li>创建一个git脚本
</li>
<li>添加git登录账户信息
</li>
<li>选择账户创建脚本
</li>
<li>复制脚本
</li>
<li>粘贴脚本

8.保存
至此一个简单的流水线完成</li>
</ol>
<h4>Jenkins使用sshPublisher执行脚本</h4>
<p>如下编写执行脚本可以保证能再后台执行</p>
<pre><code class="language-shell">
bash -c "bash /xmsy/jenkins/start.sh & disown"</code></pre>
      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/study/j1#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">682d4fd383139a326c718f28</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>私有化部署GitLab及使用</title>
    <link>https://book.loveliuran.cn/posts/study/gitlab</link>
    <pubDate>Thu, 15 May 2025 02:35:41 GMT</pubDate>
    <description>准备工作

需要准备一台服务器，大家可以在网上买，个人学习的话还是建议大家去安装一个虚拟机，去装一个</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/study/gitlab'>https://book.loveliuran.cn/posts/study/gitlab</a></blockquote>
      <h3>准备工作</h3>
<ul>
<li>需要准备一台服务器，大家可以在网上买，个人学习的话还是建议大家去安装一个虚拟机，去装一个Linux系统。<a href="https://book.loveliuran.cn/posts/technology/pve">PVE安装教程</a></li>
<li>docker <a href="https://book.loveliuran.cn/posts/study/docker">Docker安装教程</a></li>
</ul>
<h3>安装</h3>
<pre><code class="language-yml"># 拉取Gitlab镜像
docker pull gitlab/gitlab-ce:latest</code></pre><pre><code class="language-yml">services:
  gitlab:
    image: gitlab/gitlab-ce
    container_name: gitlab
    restart: always
    privileged: true
    ports:
      - "9980:80"
      - "9922:22"
    volumes:
      - ./gitlab/etc:/etc/gitlab
      - ./gitlab/log:/var/log/gitlab
      - ./gitlab/opt:/var/opt/gitlab
    stdin_open: true
    tty: true
</code></pre><ul>
<li>启动docker-compose.yml文件</li>
</ul>
<pre><code class="language-yml">docker-compose up -d</code></pre><ul>
<li>修改配置信息</li>
</ul>
<pre><code class="language-shell">#进容器内部
docker exec -it gitlab /bin/bash
 
#修改gitlab.rb
vi /etc/gitlab/gitlab.rb
 
#加入如下
#gitlab访问地址，可以写域名。如果端口不写的话默认为80端口
external_url 'http://192.168.124.194'
#ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '192.168.124.194'
#ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 9922
 
# 让配置生效
gitlab-ctl reconfigure</code></pre><ul>
<li>注意先不要重启容器 <code>/etc/gitlab/gitlab.rb</code>文件的配置会映射到gitlab.yml这个文件，由于咱们在docker中运行，在gitlab上生成的http地址应该是<a href="http://192.168.124.194:9980,%E6%89%80%E4%BB%A5%EF%BC%8C%E8%A6%81%E4%BF%AE%E6%94%B9%E4%B8%8B%E9%9D%A2%E6%96%87%E4%BB%B6">http://192.168.124.194:9980,所以，要修改下面文件</a></li>
</ul>
<pre><code class="language-shell"># 修改http和ssh配置
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
 
  gitlab:
    host: 192.168.124.194
    port: 9980 # 这里改为9980
    https: false</code></pre><pre><code class="language-shell">#重启gitlab 
gitlab-ctl restart
#退出容器 
exit</code></pre><ul>
<li>访问gitlab服务器IP:9980;第一次访问，会让修改root密码，修改后以root用户登录即可；或者修改密码</li>
</ul>
<pre><code class="language-shell"># 进入容器内部
docker exec -it gitlab /bin/bash
 
# 进入控制台
gitlab-rails console -e production
 
# 查询id为1的用户，id为1的用户是超级管理员
user = User.where(id:1).first
# 修改密码为lhx123456
user.password='lhx123456'
# 保存
user.save!
# 退出
exit
</code></pre><h3>使用</h3>
<h4>创建项目</h4>
<ul>
<li>登录后点击Create a project</li>
</ul>
<h4>设置ssh</h4>
<pre><code class="language-shell">
#1.打开本地git bash,使用如下命令生成ssh公钥和私钥对
ssh-keygen -t rsa -C 'xxx@xxx.com' 
#然后一路回车(-C 参数是你的邮箱地址)
#2.然后输入命令：
cat ~/.ssh/id_rsa.pub
#3.打开gitlab,找到Profile Settings--&gt;SSH Keys---&gt;Add SSH Key,并把上一步中复制的内容粘贴到Key所对应的文本框</code></pre><h4>拉取项目</h4>
<pre><code class="language-shell">
#回到gitlab页面点击projects-&gt;your projects
#选择一个需要克隆的项目，进入
#点击按钮复制地址
#新建一个文件夹，我在这里在我的电脑D盘下新建project文件夹
#进入projects文件夹右键选择-&gt;Git Bash Here
#设置用户名和邮箱
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
#克隆项目
git clone ssh://git@192.168.1.155:9980/coe/dotware-svr.git
#查看projects文件夹，项目已经克隆下来了</code></pre><h4>提交代码到gitlab</h4>
<pre><code class="language-shell">
#基于以上步骤，在克隆的项目文件夹下新增一个测试文件
#查看同步状态在项目文件夹下右键点击-&gt;Git Bash Here
git status
#可以看到红色部分有需要提交的文件
#提交代码
git add test.txt
#然后输入以下命令提交并添加提交信息
git commit -m "message"
#最后输出以下命令提交到gitlab
git push origin master
#提交完成啦
#再回到gitlab上看该项目就可以看到多了一个txt测试文件</code></pre><h3>备份及加载</h3>
<p><strong>docker中保存镜像，在另一台电脑加载(以gitlab镜像为例)：</strong></p>
<pre><code class="language-shell">
 docker save -o gitlab.tar  gitlab/gitlab-ce:latest   #请替换为你实际使用的gitlab镜像和标签
 #将保存的镜像文件传输到另一台电脑，在另一台电脑上加载gitlab镜像
 docker load -i gitlab.tar</code></pre>
      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/study/gitlab#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">682552fd1e409b84ca592c11</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>Jenkins-Docker安装教程</title>
    <link>https://book.loveliuran.cn/posts/study/j</link>
    <pubDate>Wed, 14 May 2025 09:50:22 GMT</pubDate>
    <description>Jenkins是一个开源软件项目，是基于Java开发的一种持续集成工具，用于监控持续重复的工作，旨在</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/study/j'>https://book.loveliuran.cn/posts/study/j</a></blockquote>
      <p>Jenkins是一个开源软件项目，是基于Java开发的一种持续集成工具，用于监控持续重复的工作，旨在提供一个开放易用的软件平台，使软件的持续集成变成可能。</p>
<h3>准备工作</h3>
<ul>
<li>需要准备一台服务器，大家可以在网上买，个人学习的话还是建议大家去安装一个虚拟机，去装一个Linux系统。<a href="https://book.loveliuran.cn/posts/technology/pve">PVE安装教程</a></li>
<li>docker <a href="https://book.loveliuran.cn/posts/study/docker">Docker安装教程</a></li>
</ul>
<h3>开始安装</h3>
<ul>
<li>下载镜像</li>
</ul>
<pre><code class="language-yml">docker pull jenkins/jenkins</code></pre><ul>
<li>vim创建docker-compose.yml文件</li>
</ul>
<pre><code class="language-yml">services:
  jenkins:
    image: jenkins/jenkins
    user: '0:0' #设置root权限运行
    container_name: myjenkins
    restart: always # 自动重启容器
    ports:
      - "8099:8080" # 映射Jenkins的HTTP端口
      - "50099:50000" # 映射Jenkins的代理端口
    volumes:
      - ./local/jenkins:/var/jenkins_home # 挂载Jenkins home目录</code></pre><ul>
<li>启动docker-compose.yml文件</li>
</ul>
<pre><code class="language-yml">docker-compose up -d</code></pre><ul>
<li>访问jenkins服务器IP:8099,首次登录需要输入密码</li>
<li>密码文件位置：/var/jenkins_home/secrets/initialAdminPassword</li>
<li>复制密码，输入密码，选择安装推荐插件，输入管理员账号密码，完成安装</li>
<li><a href="https://www.cnblogs.com/guangdelw/p/18763336">Jenkins配置源</a></li>
</ul>

      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/study/j#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">6824675e1e409b84ca592052</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>PVE</title>
    <link>https://book.loveliuran.cn/posts/technology/pve</link>
    <pubDate>Mon, 12 May 2025 02:35:00 GMT</pubDate>
    <description>PVE 

安装

安装教程1

安装教程2


Tips:

 安装时选择网卡是管理端操控网卡，宿</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/technology/pve'>https://book.loveliuran.cn/posts/technology/pve</a></blockquote>
      <h2>PVE</h2>
<h3>安装</h3>
<p><a href="https://post.smzdm.com/p/akle62mk/">安装教程1</a></p>
<p><a href="https://post.smzdm.com/p/ar6v6ovx/">安装教程2</a></p>
<p>Tips:</p>
<ul>
<li>安装时选择网卡是管理端操控网卡，宿主机是多网口情况下，安装选择的网口插入网线才可以进入pev管理端。</li>
</ul>
<h3>去掉订阅弹窗</h3>
<pre><code class="language-">sed -i_$RANDOM.bak "s/data.status === 'Active'/true/g" /usr/share/pve-manager/js/pvemanagerlib.js
sed -i_$RANDOM.bak "s/if (res === null || res === undefined || \!res || res/if(/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
sed -i_$RANDOM.bak "s/.data.status.toLowerCase() !== 'active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy</code></pre><h3>使用PVETOOLS</h3>
<h4>下载安装</h4>
<pre><code class="language-">export LC_ALL=en_US.UTF-8
apt update && apt -y install git && git clone https://github.com/ivanhao/pvetools.git
cd pvetools
./pvetools.sh</code></pre><h4>一键安装</h4>
<pre><code class="language-">echo "nameserver  8.8.8.8" &gt;&gt; /etc/resolv.conf && rm -rf pvetools && rm -rf /etc/apt/sources.list.d/pve-enterprise.list && export LC_ALL=en_US.UTF-8 && apt update && apt -y install git && git clone https://github.com/ivanhao/pvetools.git && echo "cd /root/pvetools && ./pvetools.sh" &gt; pvetools/pvetools && chmod +x pvetools/pvetools* && ln -s /root/pvetools/pvetools /usr/local/bin/pvetools && pvetools</code></pre><p>Tips:未完待续...</p>

      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/technology/pve#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68215e541e409b84ca58f6a0</guid>
  <category>posts</category>
<category>技术</category>
 </item>
  <item>
    <title>第一次使用ORACLE，下面是部分查询函数</title>
    <link>https://book.loveliuran.cn/posts/study/oracle</link>
    <pubDate>Mon, 12 May 2025 02:31:38 GMT</pubDate>
    <description>ORACLE
时间查询（某月，某天，某年）
使用TRUNC(data,fmt)
	MM 使时间格式化</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/study/oracle'>https://book.loveliuran.cn/posts/study/oracle</a></blockquote>
      <h2>ORACLE</h2>
<h4>时间查询（某月，某天，某年）</h4>
<ul>
<li><p>使用<code>TRUNC(data,fmt)</code></p>
<ul>
<li>MM 使时间格式化为某月开始</li>
<li>DD 使时间格式化为某天开始</li>
<li>YY 使时间格式化为某年开始</li>
</ul>
<p>参考：</p>
</li>
</ul>
<pre><code class="language-">SELECT 
*
FROM T_GOODS_TRAIN_LOG tg
WHERE CREATE_USER = ''
and TRUNC(CREATE_TIME, 'MM') = TRUNC(SYSDATE, 'MM')</code></pre><p>该sql意思是查询当前月的数据	</p>
<h4>OVER()使用</h4>
<p>OVER 关键字后面会跟随窗口函数的定义，包括窗口分区（PARTITION BY）、排序（ORDER BY）、窗口帧（ROWS 或 RANGE）等子句。基本语法如下：</p>
<pre><code class="language-">SELECT
    column1,
    column2,
    ...,
    window_function() OVER (
        [PARTITION BY partition_expression]
        [ORDER BY order_expression [ASC | DESC]]
        [window_frame_clause]
    ) AS window_function_alias
FROM
    table_name;</code></pre><p>例子：</p>
<p>假设我们有一个 sales 表，包含销售数据，我们希望计算每个销售员的销售总额，并且显示每个销售额与该销售员的平均销售额的差距。在这种情况下，可以使用 OVER 和窗口函数来实现：</p>
<pre><code class="language-">SELECT
    salesperson_id,
    total_sales,
    AVG(total_sales) OVER (PARTITION BY salesperson_id) AS avg_sales,
    total_sales - AVG(total_sales) OVER (PARTITION BY salesperson_id) AS sales_diff
FROM
    sales;</code></pre><p>在这个查询中：</p>
<ul>
<li>PARTITION BY salesperson_id 指定了窗口函数的分区，即按 salesperson_id 分组计算。</li>
<li>AVG(total_sales) OVER (PARTITION BY salesperson_id) 是一个窗口函数，计算每个 salesperson_id 的平均销售额。</li>
<li>total_sales - AVG(total_sales) OVER (PARTITION BY salesperson_id) 则计算了每条记录的销售额与对应 salesperson_id 的平均销售额之差。</li>
</ul>
<h6>常用窗口函数</h6>
<p>常见的 SQL 窗口函数包括：</p>
<ul>
<li>COUNT():统计数量。</li>
<li>ROW_NUMBER()：为每一行分配一个唯一的整数序号。</li>
<li>RANK() 和 DENSE_RANK()：计算排名，区别在于处理并列项的方式。</li>
<li>SUM()、AVG()、MIN()、MAX()：计算指定列的总和、平均值、最小值、最大值等。</li>
<li>LEAD() 和 LAG()：获取某行之后或之前的行的数据。</li>
</ul>
<h4></h4>

      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/study/oracle#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68215d8a1e409b84ca58f669</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>Docker安装方式</title>
    <link>https://book.loveliuran.cn/posts/study/docker</link>
    <pubDate>Mon, 12 May 2025 02:26:11 GMT</pubDate>
    <description>Docker的使用，一直没有系统的梳理和记录，刚好最近看视频又再次的全面介绍到docker。于是记录</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/study/docker'>https://book.loveliuran.cn/posts/study/docker</a></blockquote>
      <p>Docker的使用，一直没有系统的梳理和记录，刚好最近看视频又再次的全面介绍到docker。于是记录下方便后面自己的使用，毕竟安装过程中还是会存在小的不丝滑。</p>
<h3>1 Docker的简单介绍</h3>
<pre><code class="language-">这里的介绍来自于大模型的问答（LLM时代的到来，使用起来~~）。
 
Docker 是一个开源的应用容器引擎，它使开发者能够打包他们的应用以及依赖包到一个可移植的容器中，然后发布到任何流行的 Linux 机器上，也可以实现虚拟化。容器是完全使用沙箱机制，相互之间不会有任何接口（类似 iPhone 的 app）, 更重要的是容器性能开销极低。
 
传统的虚拟化技术（如 VMware，KVM 等）是在硬件层面实现虚拟化，需要模拟硬件，因此无法避免地有一些额外的性能开销。而 Docker 是在操作系统层面上实现虚拟化，Docker 容器和内核交互，几乎没有性能损耗。
</code></pre><h4>【Docker 的三个基本概念】</h4>
<p>镜像（Image）：Docker 镜像是一个只读模板，可以用来创建 Docker 容器。一个镜像可以包含一个完整的操作系统环境，里面仅安装了应用和运行时所需的依赖。镜像可以用来创建 Docker 容器。
容器（Container）：Docker 容器是 Docker 镜像的一个可运行实例，它包含了应用程序及其依赖项，它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
仓库（Repository）：仓库是集中存放镜像文件的场所。仓库分为公开仓库（Public）和私有仓库（Private）两种形式。最大的公开仓库是 Docker Hub，存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。
 </p>
<h4>【Docker的组成】</h4>
<p>Docker Client客户端：用户通过DockerClient与Docker守护进程进行交互，发送请求并接收响应。
Docker Daemon守护进程：负责接收来自DockerClient的请求，执行诸如创建、运行、停止、删除容器等操作。
Docker Image镜像
Docker Container容器
 </p>
<h4>【Docker的使用】</h4>
<p>安装Docker：在Linux或Windows上安装Docker引擎，并验证安装是否成功。
创建和运行容器：通过Docker命令（如docker search、docker pull、docker create、docker start等）来搜索、拉取、创建和启动容器。
构建和发布镜像：使用Dockerfile来定义镜像的构建过程，并通过docker build命令来构建镜像。构建完成后，可以使用docker push命令将镜像发布到Docker Hub等镜像仓库供其他人使用。
Docker通过其强大的功能和灵活性，已经成为现代软件开发和运维中不可或缺的工具之一。
 </p>
<h4>【Docker的特点】</h4>
<p>可移植性：Docker容器可以在任何安装了Docker的机器上运行，无需担心环境差异。
隔离性：Docker容器使用沙箱机制，相互之间不会有任何接口，确保了应用程序的安全性。
轻量级：Docker容器相比于虚拟机更加轻量级，因为它们共享宿主机的内核，不需要额外的操作系统。
版本控制：Docker镜像可以被版本化，方便管理和追踪历史变更。
 </p>
<h4>【Docker的用途】</h4>
<p>本地依赖：Docker可以快速搭建开发环境，节省时间，提高开发效率。
搭建环境：Docker可以快速地构建源码所需的环境，无需手动安装和配置各种软件。
微服务：Docker非常适合微服务架构，可以将每个服务打包为一个Docker镜像并使用docker-compose来模拟生产环境。
自动测试：Docker可以将测试用例与镜像紧密运行在一起，提高测试效率和可管理性。
部署过程：Docker可以简化部署过程，使得应用程序可以快速、可靠地部署到目标机器上。
持续部署：Docker天生适合持续集成/持续部署，可以方便地实现应用程序的自动化更新和升级。</p>
<h3>2 Docker的安装</h3>
<p>第二章节，记录下ubuntu20.04下的Docker的安装。</p>
<h4>1 安装一些依赖</h4>
<pre><code class="language-">sudo apt update

sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
添加docker官网 GPG 密钥、设置stable 仓库

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
</code></pre><p>正确执行为会打印“OK”。</p>
<p>可能存在问题：报错</p>
<pre><code class="language-">curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to download.docker.com:443 
gpg: no valid OpenPGP data found.</code></pre><p>这说明连接异常，更换阿里云进行配置GPG 密钥（如下图），以及设置stable仓库（未贴图）
在这里插入图片描述
具体命令如下：</p>
<pre><code class="language-">curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository  \
"deb [arch=arm64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
</code></pre><h4>2.安装 Docker</h4>
<pre><code class="language-">sudo apt-get update
sudo apt install docker-ce docker-ce-cli containerd.io
</code></pre><p>安装完成，Docker 服务将会自动启动。你可以输入下面的命令，验证它：</p>
<pre><code class="language-">docker --version
sudo systemctl status docker</code></pre><p>在这里插入图片描述</p>
<p>但安装过程中，可能报错如下：</p>
<pre><code class="language-">invoke-rc.d:syntax error: unknown option ".-skip-systemd-native"
dpkg: error processing package docker-ce(--configure):
installed docker-ce package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
docker-ce
E:Sub-process /usr/bin/dpkg returnedan error code (1)
</code></pre><p>则需执行以下操作：</p>
<pre><code class="language-">cd /var/lib/dpkg
sudo mv info info.bak
sudo mkdir info
sudo apt-get install docker-ce docker-ce-cli containerd.io </code></pre><h4>3.1 查阅安装的版本</h4>
<p>安装历史版本的docker</p>
<pre><code class="language-">apt list -a docker-ce         ## 查看 Docker 软件源中所有可用的版本
sudo apt install docker-ce=&lt;VERSION&gt; docker-ce-cli=&lt;VERSION&gt; containerd.io</code></pre><h4>3.2 Docher 版本的固定</h4>
<p>如果你想阻止 Docker 自动更新，锁住它的版本：</p>
<pre><code class="language-">sudo apt-mark hold docker-ce</code></pre><h4>4 设置非root用户的权限</h4>
<p>默认情况下，只有 root 或者 有 sudo 权限的用户可以执行 Docker 命令。
想要以非 root 用户执行 Docker 命令，需要将用户添加到 Docker 用户组，该用户组在 Docker_ce 软件包安装过程中被创建。输入：</p>
<pre><code class="language-">sudo usermod -aG docker $USER   ## $USER是一个环境变量，代表当前用户名。</code></pre><p>登出，并且重新登录，以便用户组会员信息刷新。</p>
<h4>5 安装docker-compose</h4>
<p>可选，安装命令如下。（实际上就是从github的releases中下载对应系统版本的docker-compose程序文件，授予执行权限即可）</p>
<pre><code class="language-">sudo curl -L “https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-$(uname -m)” -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version </code></pre><h4>6 Docker的测试</h4>
<p>Docker Hub是一个云端服务，主要用来储存 公有和私有源中的 Docker 镜像。默认情况下，Docker可以从 从 Docker Hub 拉取镜像。
运行个docker的hello-word，执行docker命令如下：</p>
<pre><code class="language-">docker container run hello-world</code></pre><p>第一次云运行时本地没有该镜像，这个命令将会下载测试镜像，在容器中运行它，打印出 “Hello from Docker”，并且退出。
在这里插入图片描述</p>
<h4>6.1 阿里云镜像加速器的配置</h4>
<p>拉取 hub.docker.com 的镜像，会发现速度很慢，是因为有墙。可以配置阿里云镜像加速器。
修改Docker配置文件。对于系统系统为Ubuntu 16.04+、Debian 8+、CentOS 7、Fedora 24+、RedHat 7+等，可修改<code>/etc/docker/daemon.json</code>文件（可能不存在）</p>
<p><code>vim /etc/docker/daemon.json</code>
然后添加如下内容</p>
<pre><code class="language-">{
  "registry-mirrors": [
     "https://docker.actima.top",
     "https://hub.rat.dev"
]
}</code></pre><p>然后重启docker</p>
<pre><code class="language-">sudo systemctl daemon-reload
sudo systemctl restart docker</code></pre><h4>7 卸载 Docker</h4>
<p>在卸载 Docker 之前，最好移除所有的容器，镜像，卷和网络。
运行下面的命令停止所有正在运行的容器，并且移除所有的 docker 对象：</p>
<pre><code class="language-">docker container stop $(docker container ls -aq)
docker system prune -a --volumes</code></pre><p>使用apt像卸载其他软件包一样来卸载 Docker：</p>
<pre><code class="language-">sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo apt autoremove</code></pre><h2><a href="https://blog.csdn.net/magic_ll/article/details/139985543">安装教程</a></h2>

      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/study/docker#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68215c431e409b84ca58f5b9</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>随笔</title>
    <link>https://book.loveliuran.cn/posts/default/a1</link>
    <pubDate>Sat, 10 May 2025 08:19:38 GMT</pubDate>
    <description>第一次使用这个软件。试试呢
啊啊</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://book.loveliuran.cn/posts/default/a1'>https://book.loveliuran.cn/posts/default/a1</a></blockquote>
      <p>第一次使用这个软件。试试呢
啊啊</p>

      <p style='text-align: right'>
      <a href='https://book.loveliuran.cn/posts/default/a1#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">681f0c1acbccb13c030a0b2b</guid>
  <category>posts</category>
<category>默认分类</category>
 </item>
  
</channel>
</rss>