在 Ubuntu 下通过 Docker 部署 Mastodon 服务器的详细教程

在 Azure 100 学生订阅中新建 Ubuntu VPS 并部署 Mastodon 服务器 阅读详情

1. Docker 和 Mastodon 软件介绍

Docker 是一个开源的容器化平台,使得开发者可以以轻量级的方式打包、分发和管理应用程序及其依赖。通过 Docker,用户能够在隔离的环境中运行应用,避免了环境配置带来的复杂性。Docker 的优势在于其跨平台的特性,使得在不同的操作系统上都能保持一致的运行效果。

Mastodon 是一个开源的社交网络平台,类似于 Twitter,但用户可以自建服务器,实现去中心化的社交体验。Mastodon 提供了丰富的功能,包括支持多媒体内容、用户自定义时间线等。通过 Docker 部署 Mastodon,可以快速搭建自己的社交网络环境,便于进行个性化定制和扩展。

由于最近囊中羞涩,所以本次实验使用的是三 丰云的免费服务器,配置是:1 核 CPU、1G 内存和 5M 带宽。根据实际测试,没想到这配置是可以运行小型 Mastodon 实例的。

2. 在 Ubuntu Linux 下通过 Docker 部署 Mastodon 服务器的详细步骤

步骤 1:安装 Docker 和 Docker Compose

首先,更新系统并安装 Docker 和 Docker Compose:

sudo apt update
sudo apt install -y docker.io docker-compose

启动 Docker 服务并设为开机自启:

sudo systemctl start docker
sudo systemctl enable docker

步骤 2:创建 Mastodon 目录

创建一个工作目录,并进入该目录:

mkdir ~/mastodon
cd ~/mastodon

步骤 3:创建配置文件

创建 docker-compose.yml 文件,并添加以下内容:

version: '3.7'

services:
  web:
    image: tootsuite/mastodon
    restart: always
    env_file: .env
    ports:
      - "3000:3000"
    volumes:
      - mastodon_media:/mastodon/public/system
    depends_on:
      - redis
      - db

  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_DB: mastodon_production
      POSTGRES_USER: mastodon
      POSTGRES_PASSWORD: mastodonpassword
    volumes:
      - db_data:/var/lib/postgresql/data

  redis:
    image: redis
    restart: always

volumes:
  mastodon_media:
  db_data:

步骤 4:创建环境变量文件

创建 .env 文件,并使用以下内容配置相关参数:

LOCAL_DOMAIN=example.com
SINGLE_USER_MODE=true
SECRET_KEY_BASE=your_secret_key_base
OTP_SECRET=your_otp_secret

请确保替换 example.com 和其他密钥为自己的实际值。

步骤 5:启动 Mastodon 服务

在 Mastodon 目录下运行以下命令启动服务:

sudo docker-compose up -d

步骤 6:初始化数据库

在启动后,运行以下命令初始化数据库:

sudo docker-compose run --rm web rake db:migrate
sudo docker-compose run --rm web rake db:seed

步骤 7:访问 Mastodon

在浏览器中输入 http://<你的服务器IP>:3000,即可访问你的 Mastodon 实例。

总结

通过以上步骤,你可以在 Ubuntu 上利用 Docker 快速部署 Mastodon 服务器。虽然这个配置适合初学者和小型项目,但如果需要处理更高负载,建议升级服务器配置以满足需求。

基于AI Agent的last30days开源项目:打破信息茧房的实时搜索引擎 在信息爆炸的时代,传统搜索引擎常因算法局限导致信息过时和结果同质化,形成“信息茧房”。其核心原理多依赖于历史权重和用户画像排序,使得新内容难以浮现,用户视野受限。为应对这一挑战,AI Agent技术应运而生,它通过智能化的数据采集、语义理解和协同工作流,能够主动、持续地获取并分析实时信息,从而提供动态、多元的搜索结果。这种技术不仅提升了信息获取的时效性和多样性,更在技术趋势追踪、市场分析、学术研究等场景中展现出巨大价值。本文聚焦的last30days开源项目,正是这一理念的实践典范,它利用多个AI Agen 阅读详情

相关推荐

Device Mapper 代码分析

Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM

SonicLing的专栏 1万+

VMware搭建docker mastodon

环境 VMware CentOS 7.6 [root@warship ~]# docker version Client: Version: 18.09.0 API version: 1.39 Go version: go1.10.4 Git commit: 4d60db4 Built: Wed Nov 7 00...

真理部 2049

工业以太网通讯Profinet协议详解

Profinet是通过西门子控制系统被广泛使用的工业通信协议,是一种较新的,基于以太网的工业通讯协议。

mydatai的专栏 8852

我的象牙塔我做主:Ubuntu 下 Docker 一键部署 Mastodon 完全指南

我的象牙塔我做主:Ubuntu 下 Docker 一键部署 Mastodon 完全指南

reddingtons的博客 1493

qemu(2) -- 定制开发板

向qemu源码中添加自定义开发板

xflm的博客 842

伺服电机三环控制实战:从参数整定到系统优化

本文以实战视角,深入解析伺服电机三环控制(位置环、速度环、电流环)的参数整定与系统优化全流程。文章摒弃复杂理论,通过生动的比喻和分步调试指南,详细阐述了从电流环快速响应、速度环平滑调节到位置环精准定位的调试方法,并提供了常见问题排查与进阶优化技巧,帮助工程师有效提升伺服系统性能与稳定性。

weixin_29201933的博客 244

在Ubuntu下通过Docker部署Mastodon服务器

Docker是一个开源的容器化平台,让你能够将应用及其依赖打包在一个轻量级的容器中,便于在不同环境中部署和管理。它的隔离性和可移植性使得开发和运维变得简单高效,尤其适合像Mastodon这样复杂的应用。Mastodon是一个开源的去中心化社交网络平台,类似于Twitter,但允许用户在自己的服务器上运行实例。Mastodon的用户可以相互沟通、分享内容,而不必依赖于单一的平台。这种去中心化的理念使得Mastodon越来越受到关注,尤其是在追求隐私和自由的用户中。

shelby_loo的博客 643

Transformer实战(32)——Transformer模型压缩

在本节中,我们学习了如何在硬件资源受限的情况下减轻运行大模型的负担。我们介绍了如何通过蒸馏、剪枝和量化从训练好的模型中提取高效模型。预训练轻量级的通用语言模型(如 DistilBERT) 可以在各种任务上进行微调,并表现出与非蒸馏模型相当的性能。随着数据量的不断增加,我们希望模型能够更快地运行,在这方面,高效 Transformer 起着至关重要的作用。

盼小辉丶的博客 2570

在 Ubuntu 下通过 Docker 部署 Mastodon 服务器

Docker 是一种开源平台,可以让开发者自动化应用程序的部署、扩展和管理。通过容器技术,Docker 能够将应用及其依赖打包在一起,确保在任何环境下都能运行。Mastodon 是一个去中心化的社交网络,用户可以在不同的实例上创建账户并互相交流。它具有高度的可定制性和用户隐私保护的优势,非常适合希望控制自己社交环境的用户。我这次使用的是三丰云的免费服务器,配置为 1 核 CPU、1GB 内存和 5M 带宽。这个配置对于小型项目的测试是足够的。

reddingtons的博客 554

Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程

本文主要介绍了Mac 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 安装教程 2.1 安装OpenClaw 2.2 配置模型 2.3 对话 3. 后续使用步骤 4. 关闭程序

weixin_43178406的博客 11万+

仿真模型简单介绍

同时,各种以伯克利的Spice仿真程序的算法为核心的商用Spice电路仿真工具也随之产生,运行在PC和UNIX平台,许多都是基于原始的SPICE2G6版的源代码,这是一个公开发表的版本,它们都在Spice的基础上做了很多实用化的工作,比较常见的Spice仿真软件有HSpice、Pspice、Spectre、Tspice、SmartSpcie、IsSpice等,虽然它们的核心算法雷同,但仿真速度、精度和收敛性却不一样,其中以Synopsys公司的Hspice和Cadence公司的Pspice最为著名。...

小幽余生不加糖 8003

接管 Marketplace 部署的 Mastodon:Ubuntu 系统级运维指南

Mastodon 是基于 Ruby on Rails 构建的去中心化社交平台,其生产部署依赖 PostgreSQL、Redis、Nginx 和 Sidekiq 等核心组件的协同运行。在 DigitalOcean Marketplace 的一键部署镜像中,系统以原生 Ubuntu systemd 模式运行,而非容器化方案,这意味着运维责任完全移交至用户——从环境变量配置、日志实时分析,到服务依赖管理、SSL 自动续期与权限审计,每一步都需深入操作系统层面。理解 `/opt/mastodon` 配置中枢、`/v

circularr9834的博客 453

CVPR 2026 即插即用 | 注意力篇 | PFG:多尺度大核+像素级频率门控,特征显著增强,精准适配边缘纹理场景

本文提出了一种基于频率引导的轻量级外围门控模块PFG,用于高效时空预测学习。该模块通过多尺度大核分解卷积(1×K + K×1)捕捉外围空间依赖,同时利用固定频率滤波器提取高频线索,动态融合不同尺度的外围特征。核心创新包括:外围聚焦的多尺度空间增强、频率引导的动态融合机制、双阶段归一化协同等。实验表明,PFGNet在多个基准数据集上达到SOTA性能,同时保持较低计算复杂度。该模块可直接嵌入各类视觉模型,适用于需要强化空间-通道协同表达的轻量级任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 480

Mastodon-Twitter Crossposter部署实战:Docker与系统服务配置详解

Mastodon-Twitter Crossposter是一款强大的开源工具,能够帮助用户在Mastodon和Twitter之间自动同步状态更新,实现跨平台内容无缝流转。本文将详细介绍如何通过Docker容器化部署和系统服务配置两种方式,快速搭建属于自己的跨平台内容同步桥梁。 ## 项目概述:连接两大社交平台的终极解决方案 Mastodon-Twitter Crossposter作为一款开源的

gitblog_00032的博客 772

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

DigitalOcean Marketplace一键部署Mastodon实操指南

Mastodon作为主流开源联邦社交平台,其部署常因环境依赖复杂、配置耦合度高而成为开发者门槛。理解其基于Docker容器化架构、Ubuntu系统基础与Nginx+PostgreSQL+Redis技术栈的协同原理,是保障高可用与可维护性的关键。Marketplace镜像通过预集成验证过的生产级组件(如Ubuntu 22.04、Docker 24.0.x、Let’s Encrypt自动证书),显著降低部署失败率与运维摩擦,适用于个人建站、团队协作及API集成验证等轻量级生产场景。本文聚焦DigitalOcea

weixin_30219613的博客 294

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Hometown完整入门指南:从零开始搭建你的私有社交网络服务器

想要拥有完全掌控权的社交网络体验吗?Hometown作为Mastodon的一个轻量级分支,为你提供了**本地发布**功能和更丰富的内容类型支持,让你可以搭建属于自己的私有社交网络服务器。这篇终极指南将带你从零开始,快速搭建一个功能完整的Hometown实例,享受去中心化社交的自由与隐私保护。 ## 🚀 为什么选择Hometown? Hometown是一个基于Mastodon的轻量级分支,专注

gitblog_00232的博客 522

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

从0到1搭建kbin实例:完整Docker部署指南

kbin是一个类似Reddit的内容聚合器和微博客平台,专为联邦宇宙(fediverse)设计。通过Docker部署kbin实例,你可以快速拥有一个功能完善的社区平台,实现内容分享、讨论和互动。本指南将带你一步步完成kbin的Docker部署,即使是新手也能轻松上手。 ## 准备工作:部署前的环境检查 在开始部署kbin之前,确保你的服务器满足以下基本要求: - 操作系统:Linux(推荐Ub

gitblog_01080的博客 323

wttr.in 部署指南:使用 systemd 将天气服务注册为常驻后台服务

本指南以仓库 [share/systemd/README.md](https://link.gitcode.com/i/23956b4d87f05a7bbc0dfd400acf9222) 为骨架,完整讲解如何把 wttr.in 注册为 systemd 服务并实现开机自启,同时结合仓库内 [wttrin.service](https://link.gitcode.com/i/95625b448b9b

gitblog_00367的博客 335

从AI对话到自动化管线:Claude Routine与GitHub Actions构建内容引擎

在当今的软件开发与内容创作领域,自动化工作流已成为提升效率的核心技术。其基本原理是通过脚本和配置,将重复、琐碎的人工操作串联成可自动执行的流程,从而释放人力,聚焦于更高价值的创意与决策。这种自动化思维的技术价值在于,它将一次性的、不稳定的手工操作,转化为稳定、可重复、可扩展的生产系统。在内容生成场景中,这尤其关键。开发者常面临从AI生成文本到最终发布之间的断层,需要手动处理格式转换、排版和部署等环节。通过结合Claude Routine的结构化内容生成能力与GitHub Actions的自动化触发与部署功能

weixin_34326429的博客 304

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 374

0.4 文件与文件夹:数据是怎么存放的,一篇讲清目录树

电脑里几万个文件怎么归类?本文讲清文件是有名字的数据单位、文件夹(目录)是可层层嵌套的收纳容器,二者共同构成目录树,最顶层是根目录;建立字节/KB/MB/GB 的大小直觉,介绍 Linux 一切皆文件的设计;用一张表讲清复制、移动、重命名、删除的区别,以及 Delete 进回收站、Shift+Delete 永久删除的差异;最后从安全视角讲文件上传(伪装脚本上传即 WebShell)与路径穿越(ZipSlip 把文件写到敏感位置),提醒凡是文件读写都要警惕路径被操纵。

一个安全白帽子的成长记录:Web 安全、漏洞复现、内网渗透。完整目录在 gysec.top 223

【Linux网络】TCP 服务器并发处理多客户端:从 fork 分发到双重 fork 彻底消灭僵尸进程

拆解 TCP 服务器并发演进链:fork 分发连接、SIGCHLD 循环回收僵尸、双重 fork 交孙进程给 init 收养,并给出模型选型与线上排错对照。

2301_78967866的博客 429
上一篇: 继续介绍5 个冷门的 Adobe 系列软件小技巧
下一篇: 五个冷门的Adobe系列软件小技巧
reddingtons
博客等级 码龄2年 1941粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值