需求

前言:Windows下通过GitHub+Hexo搭建个人博客的步骤

传统利用Hexo发布博文,需要:

  1. 执行hexo new "文章标题"命令,编写博文
  2. 执行hexo generate命令,生成静态网页文件
  3. 执行hexo deploy命令,将静态网页文件部署到Github Pages
  • 问题1:
    如果想用git进行版本控制,每部署一次,也要git addgit commitgit push三连。版本控制与博客的部署操作是割裂的,很难一次性完成。
  • 问题2:
    随着文章越来越多,编译的时间也越来越长,每次执行hexo generate命令都需要花费大量时间,这对个人博客来说是不划算的。
  • 问题3:
    可能会遇到本地安装的Node.js 版本升级后,与 Hexo 不兼容的问题

那么有没有什么方法,可以搞定这些痛点,自动部署Hexo博客呢?
Github Actions是一个白嫖的好答案。它是Github推出的持续集成服务,可以自动化地执行各种任务,比如编译、测试、打包、发布等等

最终效果:

Github Actions自动部署Hexo博客流程

阅读全文 »

现象

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.4.0</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.18.1</version>
</dependency>

Redis缓存数据,使用GenericJackson2JsonRedisSerializer作为value和hash value的序列化器

// 将用户信息存入redis
redisTemplate.opsForValue().set(RedisConstants.LOGIN_USER_ID + loginUser.getUser().getId(), loginUser);

// 从redis中获取用户信息
LoginUser loginUser = (LoginUser) redisTemplate.opsForValue().get(RedisConstants.LOGIN_USER_ID + userId);

从redis中获取用户信息时,会报错:LinkedHashMap cannot convert to LoginUser

阅读全文 »

现象

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>3.4.0</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.18.1</version>
</dependency>

Redis缓存数据,使用GenericJackson2JsonRedisSerializer作为value和hash value的序列化器

使用如下方式存储哈希对象:

// 不使用任何查询条件,从数据库中获取所有博文信息
List<Article> articles = articleMapper.selectList(null);

Map<String, Long> viewCountMap = articles.stream()
    .collect(Collectors.toMap(article -> article.getId().toString(), Article::getViewCount));

// 将id、浏览量存入redis
redisTemplate.opsForHash().putAll("article:viewCount", viewCountMap);

当需要从中取出数据时,如果viewCountMap的Long类型的value数值大小可以被Integer所存储,反序列化的数据会变成Integer类型

// 从redis读出浏览量,需要先指定泛型,如果直接调用到entries只能得到Object类型
BoundHashOperations<String, String, Long> boundHashOps = redisTemplate.boundHashOps("article:viewCount");
Map<String, Long> viewCountMap = boundHashOps.entries();
assert viewCountMap != null;
List<Article> articleList = viewCountMap.entrySet()
    .stream()
    .map(entry -> new Article(Long.valueOf(entry.getKey()),
                              entry.getValue()))
    .toList();

呈现出来的现象就是:对Map进行 JSON 序列化,其中值中包含Long类型的数据,反序列化后强转Long时报了类型转换异常

java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader ‘bootstrap’)

阅读全文 »

System.lineSeparator()

换行符使用System.lineSeparator()获取,避免不同操作系统的换行符不一致。

org.springframework.util.StringUtils

字符串判空

字符串对象的判空是经常需要处理的流程,通常会使用str != null && !str.isEmpty(),每次手动写全浪费时间。Spring框架提供了String工具类,对字符串对象的判空做了封装:

org.springframework.util.StringUtils.hasLength(String str)


java.time.LocalDateTime

Date 类不是线程安全的,这意味着在多线程环境中使用 Date 类时需要特别小心,以避免并发问题。

  1. LocalDateTime类是不可变的(immutable),因此它是线程安全的。
  2. LocalDateTime还明确地将日期和时间分开,提供了 LocalDateLocalTime 类来分别处理日期和时间,更加直观和灵活。
  3. LocalDateTime与MySQL的 DATETIME 类型语义一致。

简介

Kotlin是一种现代但已经成熟的编程语言,它简洁、安全、可与Java和其他语言互操作,并提供了许多在多个平台之间重用代码的方法。它由JetBrains公司于2011年设计和开发,并在2016年正式发布。Kotlin旨在解决Java语言在编码效率和代码质量方面存在的问题,并且与Java语言完全兼容。Kotlin通过简化语法、提供更强大的功能以及减少样板代码的编写,使得开发者能够更高效地编写清晰、简洁而又安全的代码。

阅读全文 »

Android Studio

Google将JDK、Android SDK都集成了,Android官方网就可以下载最新的开发工具:下载 Android Studio


创建Android项目

  1. New Project - Phone and Tablet - Empty Activity
image-20240821123557291
  1. Minimum SDK:设置项目最低能兼容的Android版本
阅读全文 »

简介

Anaconda是一个免费开源的Python和R语言的发行版本,用于计算科学(数据科学、机器学习、大数据处理和预测分析),Anaconda致力于简化包管理和部署。Anaconda的包使用软件包管理系统Conda进行管理。

Anaconda3默认包含Python 3.7,但是用户可以创建虚拟环境来使用任意版本的Python包


常用命令

  1. 查看conda版本:conda --version
  2. 查看conda的环境配置:conda config --show
  3. 更新conda:conda update conda
  4. 更新Anaconda整体:conda update Anaconda

管理环境

Conda允许创建相互隔离的虚拟环境(Virtual Environment),这些环境各自包含属于自己的文件、包以及他们的依存关系,并且不会相互干扰。

  1. 创建虚拟环境

    conda create -n env_name python=3.8

    不指定python版本时,自动创建基于最新python版本的虚拟环境。

  2. 创建虚拟环境时,安装必要的包

    conda create -n env_name numpy matplotlib python=3.8

  3. 列举虚拟环境

    conda env list

    所显示的列表中,前面带星号*的表示当前活动环境。

  4. 激活虚拟环境

    conda activate env_name

  5. 退出虚拟环境

    conda deactivate,回到base

  6. 删除虚拟环境、虚拟环境中的包

    • conda remove --name env_name --all
    • conda remove --name env_name package_name
  7. 导出环境

    conda env export --name myenv > myenv.yml

  8. 还原环境

    conda env create -f myenv.yml


管理Package

  1. 查询包的安装情况。

    • conda list
    • conda list pkgname*
  2. 查询当前Anaconda repository中是否有想要安装的包

    conda search package_name

  3. 安装、更新、卸载包

    • conda install package_name
    • conda update package_name
    • conda uninstall package_name
  4. 清理缓存

    • conda clean -p 删除没有用的包 –packages
    • conda clean -t 删除tar打包 –tarballs
    • conda clean -y -all 删除所有的安装包及cache(索引缓存、锁定文件、未使用过的包和tar包)

conda install vs pip install

  1. conda可以管理非python包,pip只能管理python包。
  2. conda自己可以用来创建环境,pip不能,需要依赖virtualenv之类的。
    conda安装的包是编译好的二进制文件,安装包文件过程中会自动安装依赖包;pip安装的包是wheel或源码,装过程中不会去支持python语言之外的依赖项。
  3. conda安装的包会统一下载到一个目录文件中,当环境B需要下载的包,之前其他环境安装过,就只需要把之间下载的文件复制到环境B中,下载一次多次安装。pip是直接下载到对应环境中。
  4. conda只能在conda管理的环境中使用,例如比如conda所创建的虚环境中使用。pip可以在任何环境中使用,在conda创建的环境 中使用pip命令,需要先安装pip(conda install pip ),然后可以 环境A 中使用pip 。
  5. conda 安装的包,pip可以卸载,但不能卸载依赖包,pip安装的包,只能用pip卸载。

由于conda的库不如pip的库丰富,有时候可能迫不得已要使用pip安装。只有在conda install搞不定时才使用pip intall


Windows 通过WSL2 Ubuntu和Docker搭建深度学习环境

参考:


WSL2 Ubuntu安装Docker Engine

  1. 设置 Docker的 apt 仓库

    # Add Docker's official GPG key:
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # Add the repository to Apt sources:
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
  2. 下载安装Docker的安装包

    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  3. 查看docker版本,确认是否成功安装。

    docker -v
    Docker version 27.1.1, build 6312585

WSL2 下安装Anaconda的Docker镜像

参考Anaconda官网文档Docker — Anaconda documentation

# 拉取镜像
docker pull continuumio/miniconda3:24.5.0-0

# 启动容器
docker run -it --name=miniconda continuumio/miniconda3:24.5.0-0 bash

# 进入容器后,查看默认安装的Python版本
(base) root@8fead34bd870:/# python --version
Python 3.12.4

在miniconda3容器中安装cudatoolkit和cudnn

wsl2和windows11共用显卡驱动,因此我们只需安装cudatoolkit和cudnn。以后windows显卡驱动正常更新即可。

windows下nvidia-smi命令查看显卡驱动,以及支持的 CUDA 的最高版本,CUDA Version指的是可驱动的最高版本

 nvidia-smi
Fri Aug  9 23:04:30 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 531.79                 Driver Version: 531.79       CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                      TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf            Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 3060 Ti    WDDM | 00000000:01:00.0  On |                  N/A |
|  0%   49C    P8               10W / 225W|    885MiB /  8192MiB |      3%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      3008    C+G   C:\Program Files\Typora\Typora.exe        N/A      |
|    0   N/A  N/A      3372    C+G   ...ekyb3d8bbwe\PhoneExperienceHost.exe    N/A      |
|    0   N/A  N/A      7852    C+G   ...nt.CBS_cw5n1h2txyewy\SearchHost.exe    N/A      |
|    0   N/A  N/A      9944    C+G   ...CBS_cw5n1h2txyewy\TextInputHost.exe    N/A      |
|    0   N/A  N/A     11300    C+G   ...les\Microsoft OneDrive\OneDrive.exe    N/A      |
|    0   N/A  N/A     11628    C+G   ...t.LockApp_cw5n1h2txyewy\LockApp.exe    N/A      |
|    0   N/A  N/A     11632    C+G   ...5n1h2txyewy\ShellExperienceHost.exe    N/A      |
|    0   N/A  N/A     14872    C+G   C:\Windows\explorer.exe                   N/A      |
|    0   N/A  N/A     15800    C+G   ...2txyewy\StartMenuExperienceHost.exe    N/A      |
|    0   N/A  N/A     16008    C+G   ...siveControlPanel\SystemSettings.exe    N/A      |
|    0   N/A  N/A     16976    C+G   ...64__v826wp6bftszj\TranslucentTB.exe    N/A      |
|    0   N/A  N/A     20136    C+G   ...42.0_x64__8wekyb3d8bbwe\GameBar.exe    N/A      |
|    0   N/A  N/A     21440    C+G   ...ram Files (x86)\Anycast\Anycast.exe    N/A      |
|    0   N/A  N/A     21848    C+G   ...crosoft\Edge\Application\msedge.exe    N/A      |
|    0   N/A  N/A     22204    C+G   ...tionsPlus\logioptionsplus_agent.exe    N/A      |
|    0   N/A  N/A     27108    C+G   ...voice\logioptionsplus_logivoice.exe    N/A      |
+---------------------------------------------------------------------------------------+

根据可驱动的最高版本直接去官网下载对应版本https://developer.nvidia.com/cuda-toolkit-archive

image-20240809232152015

执行官网提供的安装命令:

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda

创建环境,安装pytorch

conda create -n pytorch python=3.10

conda active pytorch

Start Locally | PyTorch

根据官网确定环境配置,得到相应的安装命令:

conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

plan2

基于 WSL2 和 Docker 的深度学习环境指北 - duanyll

安装Docker Engine

安装 NVIDIA Container Toolkit

安装带 CUDA 的 PyTorch 镜像

pytorch/pytorch:2.4.0-cuda12.1-cudnn9-devel

若想要使用pycharm连接docker容器,容器端口号必须指定为22,因为SFTP默认使用22端口。

docker run -it –gpus all -p 8077:22 pytorch/pytorch:2.4.0-cuda12.1-cudnn9-devel

进入容器,用which python查看,为/opt/conda/bin/python,可知默认使用conda来管理环境和package。

容器中安装SSH

sudo apt purge openssh-server # wsl2 自带的好像 sshd 不完整,先删除掉


apt update

apt -y upgrade

apt install -y vim openssh-server

service ssh start

service ssh status

设置root密码和配置文件

passwd root

vim /etc/ssh/sshd_config

添加如下内容

#启用公钥私钥配对认证方式
PubkeyAuthentication yes 
#公钥文件路径(和上面生成的文件同)
AuthorizedKeysFile .ssh/authorized_keys 
#root能使用ssh登录
PermitRootLogin yes 

重启ssh

service ssh restart

【详细教程】pycharm使用docker容器开发_pycharm docker-CSDN博客


不知道为什么连不上,只能正常连接子系统和docker。

修复 WSL2 镜像网络模式下无法连接 Docker 的问题 - sulinehk blog - 专注于计算机科学与软件工程的技术博客

可能是添加了这个配置才好的。


直接运行项目中的jupyter notebook内容,会报错:

Running as root is not recommended. Use --allow-root to bypass.

在容器中执行:

jupyter server --generate-config

# 自动生成默认配置
Writing default config to: /root/.jupyter/jupyter_server_config.py

# 在如下文件中添加 c.ServerApp.allow_root = True
vim /root/.jupyter/jupyter_server_config.py

安装matplotlib

Matplotlib 是 Python 的绘图库。

conda install -y matplotlib


Matplotlib Pyplot

Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。

Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。

Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改,例如:给图像加上标记,生新的图像,在图像中产生新的绘图区域等等。

使用的时候,我们可以使用 import 导入 pyplot 库,并设置一个别名plt:

import matplotlib.pyplot as plt

一些常用的 pyplot 函数:

  • plot():用于绘制线图和散点图
  • scatter():用于绘制散点图
  • bar():用于绘制垂直条形图和水平条形图
  • hist():用于绘制直方图
  • pie():用于绘制饼图
  • imshow():用于绘制图像
  • subplots():用于创建子图

概述

SpringSecurity是一个基于Spring开发的非常强大的权限验证框架,其核心功能包括:

  • 认证 (用户登录)
  • 授权 (此用户能够做哪些事情)
  • 攻击防护 (防止伪造身份攻击)
阅读全文 »
0%