Hoey笔记

和有趣的人做尽有趣的事


  • Home

  • Archives

  • Sitemap

  • Search

mac下的开发包管理工具-sdk

Posted on 2023-07-16

SDK可以帮助我们维护mac下的程序包,比如想安装jdk1.8、又想安装jdk11,比如想安装maven等等,它都可以通过指令进行安装和管理。下面是一些常用的指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装
curl -s "https://get.sdkman.io" | bash
# 设置path
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 查看sdk版本
sdk version
# 查看安装maven安装情况
sdk list maven

# 安装maven 3.6.4
sdk install maven 3.6.3
# maven被安装到的目录
cd ~/.sdkman/candidates

家庭网络拓扑

Posted on 2023-07-11

前段时间618新入手了几块硬盘,买回来组一个NAS,下面是家里的网络拓扑逻辑图

image-20230711130249774

在其中完成了以下内容:

  1. 网络统一管理,包括网络分割如划分子网;网络的优化如实现拦截、翻墙、过滤广告、加速;内外网穿透。
  2. ESXI虚拟化,对物理机的CPU计算、存储和网络资源高效利用,EXSI高效的横向拓展能力和简易的操作都非常的优秀。
  3. NAS(网络附加存储),数据共享与存储、备份与恢复、远程访问、横向磁盘扩容。
  4. 边缘计算,网络资源共享,提升网络三大运营商CDN网络加速。

得到的好处:

  1. 全端的无差异实时备份,包括Mac、Windows、IPad、IPhone等设备
  2. 现在市面上各大云盘,某度云、某里云等等,现在统统废弃,全部用NAS就可以解决,相当于买了个所有云盘的VIP
  3. 网络方面的国内外无差异化上网体验。
  4. 给老婆刷刷剧,看看电影都很方便。

http://192.168.1.1/cu.html

CUAdmin32216618

使用反向代理解决SSL认证

Posted on 2023-05-04

自己手里有很多私有服务,并且域名还都不一样,例如下面这些:

应用 ip
NAS 192.168.30.5:5000
Jellyfin 192.168.30.5:8096
私人笔记 hoey94.github.io
私人网盘 192.168.30.5:9000
chatgpt chat.github.io
… …

这些应用管理起来十分不方便,于是就想将这些网站整合在一起,并且对外提供统一域名访问方式。我自身是有一个免费的顶级域名的hoey.tk,那现在的需求就很明确了,其实就是想得到下面这样的效果:

应用 ip
NAS nas.hoey.tk
Jellyfin jellyfin.hoey.tk
私人笔记 notes.hoey.tk
私人网盘 pan.hoey.tk
chatgpt chat.hoey.tk
… …

最近找到了一款挺不错的软件Nginx Project Manager,并且还能提供免费的SSL,虽然3个月到期以后还要手动续期,不过白嫖的东西还要什么自行车。它的页面像这样:

image-20230504205632731

配置完以后,访问的时候只需要使用二级域名访问即可,十分方便,维护起来也十分傻瓜。

前置准备

  • VPS任意,我的是在国外自购的一台服务器,为什么自购国外,大家懂得都懂,现在是科学时代。
  • 自建家用机服务器,我的服务器主要插上8T*2机械硬盘组磁盘阵列,搞成NAS存储服务器做个私有云。另外结合esxi或者是docker能跑很多好玩的东西,这里就不一一列举了,感兴趣的小伙伴可以搜索一下自建NAS服务器 ALL IN ONE。
  • tk域名是白嫖的,在DNS服务商那里却不被支持(这就是白嫖的代价吧)。自己又穷,买不起域名哈哈哈,就搞了个垃圾域名做中转,4块钱人民币一年哈哈哈。

网络拓扑图

下面这个是结合自己家庭网络拓扑图和已有的一些服务的网络拓扑图,用这个实现二级域名访问+SSL。

image-20230504212114306

从最右边开始一层一层解释所做的事情:

  1. 首先联系联通宽带,给到公网IP,将自己内网服务,在软路由内部通过端口映射的方式开放到外网。如果没有公网IP,也可以用frp等工具实现内网穿透。

  2. 接下来要解决公网IP变动的问题(联通给的公网IP是动态的,每隔一段时间就会变)。DNS服务商我选择的是Cloudflare,实现DDNS这块是参考开源项目,改写了一个脚本,其主要功能是:以轮训的方式,动态监测公网IP变更,将A记录通过API的方式更新到Cloudflare以实现DNS解析,具体脚本参考cloudflare-api-dns,当然网上也有很多类似以封装好的工具实现DDNS,比如ddns-go

  3. 在自己的VPS上搭建好Nginx Project Manager(后面我们简称NPM),用来整合自己所有的服务,并添加SSL认证。

  4. 在Cloudflare创建记录将tk域名映射到VPS上,反向代理接受到请求,转发到4块钱买的域名(hoey.asia)上,哈哈哈。

在CentOS 7上 安装 NPM

  1. 确保安装了docker 和docker-compose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# docker
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
yum install -y docker-ce
systemctl start docker.service
systemctl enable docker.service
docker -v

# docker-compose
curl -L https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version


# 开启ipv6防止日志文件过大 (可选)
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF

systemctl restart docker
  1. 使用docker-compose 安装npm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir -p /data/docker_data/npm
cd /data/docker_data/npm
vim docker-compose.yml
# 将内容粘贴进去 start
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 冒号左边可以改成自己服务器未被占用的端口
- '81:81' # 冒号左边可以改成自己服务器未被占用的端口
- '443:443' # 冒号左边可以改成自己服务器未被占用的端口
volumes:
- ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
- ./letsencrypt:/etc/letsencrypt # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中
# 将内容粘贴进去 end
docker-compose up -d
  1. 更新NPM
1
2
3
4
5
6
7
8
9
10
11
cd /root/data/docker_data/npm

docker-compose down

cp -r /data/docker_data/npm /data/docker_data/npm.archive # 万事先备份,以防万一

docker-compose pull

docker-compose up -d # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像
  1. 卸载NPM
1
2
3
4
5
cd /root/data/docker_data/npm

docker-compose down

rm -rf /root/data/docker_data/npm # 完全删除映射到本地的数据

结合Cloudflare 配置NPM

NPM默认账号密码: admin@example.com/changeme,登录后修改

登录Cloudflare,到自己的域名中添加A记录,指向VPS服务器(我的VPS是110.123.11.1,域名是hoey.tk)

image-20230504222932398

在NPM中添加对应的反向代理配置,并打开SSL,(下图是以nas这条记录为例,描述NPM的配置)

image-20230504214014283

之后开启SSL认证

image-20230504214052552

点击保存即可。

总结

配置完成以后,就可以使用nas.hoey.tk访问nas服务了,当用户访问nas.hoey.tk时,在网络中它的链路应该如下图所示:

image-20230504214857962

以上

Jellyfin 添加字体库解决中文乱码

Posted on 2023-04-30

最近使用Jellyfin搭建家庭影音出现中文乱码问题,下面是我搜到的一些方案,我用的是扩展中文字体库

  • 使用nyanmisaka/jellyfin 套件
  • 使用actime转字幕
  • 扩展中文字体库

下面是一些指令,针对小白用的,大佬无视

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 远程登录到NAS并切换最高权限
ssh admin@192.168.30.5 -p 22
sudo -i

# 进入到NAS自己创建的目录,这个目录自己改
cd /volume1/media/fonts
pwd

# 使用docker命令查看jellyfin 的id
docker ps

# 进入到容器内部查看目录文件结构1538f09eaa85要替换成自己的id
docker exec -it 1538f09eaa85 /bin/bash
cd /usr/share/fonts/
exit

# 复制宿主机的文件到容器内
docker cp fz.tar.gz 1538f09eaa85:/usr/share/fonts/

# 到容器目录中解压
docker exec -it 1538f09eaa85 /bin/bash
cd /usr/share/fonts/
tar -zxvf fz.tar.gz

链接:https://share.weiyun.com/5Wg55FF5 密码:nhqe76

视频已经传到B站,欢迎观看Jellyfin中文字幕乱码解决_哔哩哔哩_bilibili

Doris使用踩坑总结

Posted on 2023-03-28

环境

  • MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
  • [Doris](部署 Docker 集群 - Apache Doris):v1.12.1
  • JDK: v1.8.x
  • IDEA开发环境

一、 Docker部署

官方提供文档Deploy Docker cluster

但部署完以后发现集群无法识别BE节点,查看日志发现是因为没有设置vm.max_map_count参数

避坑1: 需要设置sysctl -w vm.max_map_count=2000000

避坑2: 在启动容器时需要添加privileged: true

二、Flink 写入Doris

官方提供了文档Flink Doris Connector

这里选用的是RowData的方式写入到Doris,提前到Doris中创建表代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE DATABASE dwd;
DROP TABLE IF EXISTS dwd.TICKET;
CREATE TABLE IF NOT EXISTS dwd.TICKET (
event VARCHAR(256),
newval VARCHAR(256),
oldval VARCHAR(256),
stamp VARCHAR(256),
subevent VARCHAR(256),
uptm VARCHAR(256),
uptmms VARCHAR(256),
ver VARCHAR(256)
)DISTRIBUTED BY HASH(stamp) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

然后是使用Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static void main(String[] args) throws Exception {

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
Properties prop = new Properties();
prop.setProperty("format", "json");
prop.setProperty("strip_outer_array", "true");

env.fromElements("{\"event\":\"CheckIn\",\"newval\":\"90\",\"oldval\":\"0\",\"stamp\":\"67100c4f-0355-4dba-8a76-2a94202132d1\",\"subevent\":\"\",\"uptm\":\"20230319094822\",\"uptmms\":\"20230319094822031\",\"ver\":\"v1.0\"}")
.addSink(DorisSink.sink(
DorisReadOptions.builder().build(),
DorisExecutionOptions.builder().setBatchSize(3)
.setBatchIntervalMs(0L)
.setMaxRetries(3)
.setStreamLoadProp(prop)
.build(),
DorisOptions.builder().setFenodes("localhost:8030")
.setTableIdentifier("dwd.TICKET")
.setUsername("admin")
.setPassword("").build())
);
env.execute("pss-format-job");
}

运行时发现网络不通问题,无法成功写入Dois,具体错误如图下图所示:

image-20230328131103501

分析宿主节点和docker集群的关系

image-20230328131607049

由架构图得知,是因为sink写入的时候通过外网地址的fe取到be地址是内网地址。

解决思路:

  1. 程序上传到FE运行,但是我属于本地开发环境,这种方式不适合

  2. 配置Docker network,使得在宿主节点能够访问容器 BE的IP。这块我也尝试搜索了很多资料,最终以失败告终。

    • 尝试一: 在宿主节点修改路由表 sudo route add -net 172.20.80.0/24 172.20.80.1
    • 尝试二: 以Host方式运行FE和BE
  3. 修改源代码: 找到涉及到“第二步:将BE内网IP返回给主程序”代码,并修改

其中我是用第三种方法,成功在本地开发环境摄入数据到Doris,在这里简单介绍一下快速修改源码的方法。

第一步: 先找到涉及到代码的相关方法,在该场景中对应的是org.apache.doris.flink.rest.RestService类的randomBackend()。

1
2
3
4
5
6
7
8
9
10
11
12
13
@VisibleForTesting
public static String randomBackend(DorisOptions options, DorisReadOptions readOptions, Logger logger) throws DorisException, IOException {
List<BackendRowV2> backends = getBackendsV2(options, readOptions, logger);
logger.trace("Parse beNodes '{}'.", backends);
if (backends != null && !backends.isEmpty()) {
Collections.shuffle(backends);
BackendRowV2 backend = (BackendRowV2)backends.get(0);
return backend.getIp() + ":" + backend.getHttpPort();
} else {
logger.error("argument '{}' is illegal, value is '{}'.", "beNodes", backends);
throw new IllegalArgumentException("beNodes", String.valueOf(backends));
}
}

第二步:现在希望返回值并非BE的内网IP,因此我们需要将return的内容写死return "localhost:8040";

第三步:在代码中我们创建与类相同的包,并将源码原封不动粘贴进去,如果报错,可以修改。紧接着修改return "localhost:8040";即可

image-20230328133408579

总结:

我这里是本地开发环境遇到的问题,并非生产环境;如果生产环境部署基于Doris的应用程序,则需要注意下下面几点:

  1. 运行的代码所在的机器,必须与Doris所在的网络保持通常。
  2. 基于RowData的摄入方式不太友好,现在仍要寻找一种更好的编码方式。

ksqlDB

Posted on 2023-03-14

目前需要对Kafka Topic中的数据进行分析,查询了一下KSQLDB挺不错,它是一个流处理引擎,主要用于处理实时数据流,并支持 SQL 查询和流处理操作。KSQLDB 可以运行在 Apache Kafka 平台之上,它不需要额外的基础设施,因此可以方便地与 Kafka 进行集成。KSQLDB 可以实现流数据的可视化、数据的清洗和去重、流式计算等。KSQLDB 的主要特点包括易于使用、接近实时的处理速度、强大的 SQL 查询功能以及灵活的流处理操作。

环境准备

  • MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
  • Docker & Docker compose

下面代码用于部署Standalone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
---
version: '2'

services:
zookeeper:
image: confluentinc/cp-zookeeper:7.3.0
hostname: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000

broker:
image: confluentinc/cp-kafka:7.3.0
hostname: broker
container_name: broker
depends_on:
- zookeeper
ports:
- "29092:29092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1

ksqldb-server:
image: confluentinc/ksqldb-server:0.28.3
hostname: ksqldb-server
container_name: ksqldb-server
depends_on:
- broker
ports:
- "8088:8088"
environment:
KSQL_LISTENERS: http://0.0.0.0:8088
KSQL_BOOTSTRAP_SERVERS: broker:9092
KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"

ksqldb-cli:
image: confluentinc/ksqldb-cli:0.28.3
container_name: ksqldb-cli
depends_on:
- broker
- ksqldb-server
entrypoint: /bin/sh
tty: true

启动KsqlDB服务:

1
docker-compose up

使用Docker链接到Cli中

1
docker exec -it ksqldb-cli

链接到cli中后,在终端运行命令链接:

1
[ksqldb-cli] docker exec -it ksqldb-cli ksql http://ksqldb-server:8088

可以运行命令查看topic

1
show topics;

如果你想链接远端Kafka集群,将 替换成自己的远程Kafka集群,像下面这个dockerfile一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
---
version: '2'

services:

ksqldb-server-juneyao:
image: confluentinc/ksqldb-server
hostname: ksqldb-server-juneyao
container_name: ksqldb-server-juneyao
ports:
- "8088:8088"
environment:
KSQL_LISTENERS: http://0.0.0.0:8088
KSQL_BOOTSTRAP_SERVERS: 172.22.17.28:9092
KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"

ksqldb-cli-juneyao:
image: confluentinc/ksqldb-cli
container_name: ksqldb-cli-juneyao
depends_on:
- ksqldb-server-juneyao
entrypoint: /bin/sh
tty: true

后面的操作和上面都一样了,启动的时候注意修改名称

image-20230314162231259

Example 1: 创建流表并查询

展示有多少Topic:

1
2
show topics;
show streams;

在cli链接后,我们创建一个riderLocations流,如果locations这个topic在kafka中不存在,则会对应创建。

1
2
3
4
5
CREATE STREAM riderLocations (
profileId VARCHAR,
latitude DOUBLE,
longitude DOUBLE
) WITH ( kafka_topic='locations', value_format='json', PARTITIONS =1 );

然后往topic中插入一批数据

1
2
3
4
kafka-console-producer --broker-list localhost:9092 --topic locations 
{"profileId":"1","latitude":2.0,"longitude":1.0}
{"profileId":"2","latitude":3.0,"longitude":3.0}
{"profileId":"3","latitude":1.0,"longitude":1.0}

就可以愉快的查询它了

1
2
SET 'auto.offset.reset'='earliest';
select * from riderLocations;

更多的详细用法可以参考网站ksqldb

拉链表

Posted on 2023-02-21

拉链表思路图:

image-20230221094438645

使用HiveSQL增量完成拉链表加工思路:

image-20230221094348740

DolphinScheduler 3.1.0 本地环境搭建

Posted on 2022-12-28

环境准备

  • MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
  • Git
  • JDK: v1.8.x (Currently does not support jdk 11)
  • Maven: v3.5+
  • Node: v16.13+ (dolphinScheduler version is lower than 3.0, please install node v12.20+)
  • Pnpm: v6.x
  • Zookeeper: 3.8

1.克隆项目到本地

1
git clone https://github.com/apache/dolphinscheduler.git

2.导入项目到IDEA,并切换分支到3.1.0

1
git checkout 3.1.0-release

3.编译项目

spotless是一种代码格式化工具,使用 spotless:apply 表示格式化module代码

mvnw同mvn的功能是一样的,mvnw做了项目适配

1
2
./mvnw spotless:apply 
./mvnw clean install -Prelease -Dmaven.test.skip=true -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true

4.在mysql创建database数据库

1
CREATE SCHEMA dolphinschedulertest;

找到脚本dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql并运行

5.修改项目配置文件

全局搜索application.yaml,将文件中涉及postgresql的替换为mysql

1
2
3
4
5
6
7
8
9
10
#    driver-class-name: org.postgresql.Driver
# url: jdbc:postgresql://127.0.0.1:5432/dolphinscheduler
# username: root
# password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dolphinschedulertest
username: root
password: 123456

org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate

6.修改dolphinscheduler-bom下pom.xml

1
2
3
4
5
6
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
<scope>compile</scope>
</dependency>

7.修改logback-spring.xml

全局搜索logback-spring.xml,将下面内容添加到其中

1
2
3
4
<root level="INFO">
<!--将这句话加入到root节点下-->
<appender-ref ref="STDOUT"/>
</root>

8.配置启动项

分别配置MasterServer, WorkerServer, ApiApplicationServer

  • MasterServer:Execute function main in the class org.apache.dolphinscheduler.server.master.MasterServer by Intellij IDEA, with the configuration VM Options -Dlogging.config=classpath:logback-spring.xml -Ddruid.mysql.usePingMethod=false -Dspring.profiles.active=mysql
  • WorkerServer:Execute function main in the class org.apache.dolphinscheduler.server.worker.WorkerServer by Intellij IDEA, with the configuration VM Options -Dlogging.config=classpath:logback-spring.xml -Ddruid.mysql.usePingMethod=false -Dspring.profiles.active=mysql
  • ApiApplicationServer:Execute function main in the class org.apache.dolphinscheduler.api.ApiApplicationServer by Intellij IDEA, with the configuration VM Options -Dlogging.config=classpath:logback-spring.xml -Dspring.profiles.active=api,mysql. After it started, you could find Open API documentation in http://localhost:12345/dolphinscheduler/swagger-ui/index.html

9.配置zookeeper

参考以前的博客zookeeper部署

10.启动前端

1
2
pnpm install
pnpm run dev

11.启动后端

分别在IDEA中运行MasterServer, WorkerServer, ApiApplicationServer

登陆账号密码 admin/dolphinscheduler123

参考文档:https://www.bookstack.cn/read/dolphinscheduler-3.1.0-en/af18cd17a04eb31f.md

编译错误1:

1
[ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.12.1:pnpm (pnpm install) on project dolphinscheduler-ui: Failed to run task: 'pnpm install' failed. org.apache.commons.exec.ExecuteException: Process exited with an error: 9 (Exit value: 9) -> [Help 1]

解决办法:

修改dolphinscheduler-ui模块下的pom.xml,修改后记得重新执行./mvnw spotless:apply格式化代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!--                <plugins>-->
<!-- <plugin>-->
<!-- <groupId>com.github.eirslett</groupId>-->
<!-- <artifactId>frontend-maven-plugin</artifactId>-->
<!-- <version>${frontend-maven-plugin.version}</version>-->
<!-- <configuration>-->
<!-- <pnpmInheritsProxyConfigFromMaven>false</pnpmInheritsProxyConfigFromMaven>-->
<!-- </configuration>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>install node and pnpm</id>-->
<!-- <goals>-->
<!-- <goal>install-node-and-pnpm</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <nodeVersion>${node.version}</nodeVersion>-->
<!-- <pnpmVersion>${pnpm.version}</pnpmVersion>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- <execution>-->
<!-- <id>pnpm install</id>-->
<!-- <goals>-->
<!-- <goal>pnpm</goal>-->
<!-- </goals>-->
<!-- <phase>generate-resources</phase>-->
<!-- <configuration>-->
<!-- <arguments>install</arguments>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- <execution>-->
<!-- <id>pnpm run build:prod</id>-->
<!-- <goals>-->
<!-- <goal>pnpm</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <arguments>run build:prod</arguments>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!-- </plugins>-->

基于Python的简易FS服务

Posted on 2022-12-12

创建start.py,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
try:
# Python 3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig
import sys
def test (*args):
test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
except ImportError: # Python 2
from BaseHTTPServer import HTTPServer, test
from SimpleHTTPServer import SimpleHTTPRequestHandler

class CORSRequestHandler (SimpleHTTPRequestHandler):
def end_headers (self):
self.send_header('Access-Control-Allow-Origin', '*')
SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
test(CORSRequestHandler, HTTPServer)

运行start.py,端口为8000

1
python start.py 8000

Hexo隐藏文章

Posted on 2022-12-12

安装

在站点根目录下执行

1
cnpm install hexo-hide-posts --save

配置

在站点目录下的_config.yml中如下配置:

1
2
3
4
5
6
7
8
9
10
11
# hexo-hide-posts
hide_posts:
# 可以改成其他你喜欢的名字
filter: hidden
# 指定你想要传递隐藏文章的位置,比如让所有隐藏文章在存档页面可见
# 常见的位置有:index, tag, category, archive, sitemap, feed, etc.
# 留空则默认全部隐藏
public_generators: []
# 为隐藏的文章添加 noindex meta 标签,阻止搜索引擎收录
noindex: true

使用

在文章的属性中定义 hidden: true 即可隐藏文章。

1
2
3
4
5
---
title: hidden test
date: 2022-12-12 09:49:19
hidden: true
---

虽然首页上被隐藏了,但你仍然可以通过 https://hexo.test/lorem-ipsum/ 链接访问它。

你可以在命令行运行 hexo hidden:list 来获取当前所有的已隐藏文章列表。

参考blog:https://www.cnblogs.com/yangstar/articles/16690342.html

<1…456>

54 posts
© 2025 Hoey