diff --git a/404.html b/404.html new file mode 100644 index 0000000..af33dc8 --- /dev/null +++ b/404.html @@ -0,0 +1,26 @@ + + + + + + + + + + VuePress + + + + + + + +
404
+ + + diff --git a/8612fa7f/47867b98/Flutter/74684463.html b/8612fa7f/47867b98/Flutter/74684463.html new file mode 100644 index 0000000..8f47eca --- /dev/null +++ b/8612fa7f/47867b98/Flutter/74684463.html @@ -0,0 +1,68 @@ + + + + + + + + + + AAPT: error: resource android:attr/fontVariationSettings not found | VuePress + + + + + + + +

动漫美图

心累,每天都是“惊喜”,我太菜了

环境
开发工具 idea

flutter doctor
+
+D:\Android\flutter\bin\flutter.bat doctor --verbose
+[√] Flutter (Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.18363.815], locale zh-CN)
+    • Flutter version 1.17.0 at D:\Android\flutter
+    • Framework revision e6b34c2b5c (7 days ago), 2020-05-02 11:39:18 -0700
+    • Engine revision 540786dd51
+    • Dart version 2.8.1
+
+[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
+    • Android SDK at D:\Android\android-sdk
+    • Platform android-29, build-tools 29.0.3
+    • ANDROID_HOME = D:\Android\android-sdk
+    • Java binary at: D:\Program Files\Java\jdk1.8.0_241\bin\java
+    • Java version Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
+    • All Android licenses accepted.
+
+[!] Android Studio (not installed)
+    • Android Studio not found; download from https://developer.android.com/studio/index.html
+      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).
+
+[√] Connected device (1 available)
+    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26) (emulator)
+
+! Doctor found issues in 1 category.
+Process finished with exit code 0
+

Could not find androidx.lifecycle:lifecycle-common:2.2.0,lifecycle-common-java8:2.2.0,lifecycle-runtime:2.2.0,androidx.fragment:fragment:1.1.0.,androidx.annotation:annotation:1.1.0.
解决方法:

allprojects {
+    repositories {
+        google() 
+        jcenter()
+        maven { url "https://maven.google.com" }//感觉google()是假的,这里我用了阿里云镜像,可能没同步吧。
+    }
+}
+

.gradleachesransforms-1iles-1.1ore-1.1.0.aarb817d4a7e2a888884c999547cadccefesaluesalues.xml:7:5-70: AAPT: error: resource android:attr/fontVariationSettings not found.AAPT: error: resource android:attr/ttcIndex not found

stackoverflow上解决方法

解决方法:
修改app下的build.gradle文件

android {
+    compileSdkVersion 28
+    defaultConfig {
+	...
+        targetSdkVersion 28
+	...
+    }
+    ...
+}
+

stackoverflow真是个好东西,可惜要翻墙,感想上面的大神。
不写了,累,这种资料网站都要墙,真是丧心病狂,什么时候能不用镜像站。构建工具再好,巧妇难为无米之炊啊

评论数
+ + + diff --git a/8612fa7f/47867b98/Java/9c47706b.html b/8612fa7f/47867b98/Java/9c47706b.html new file mode 100644 index 0000000..da27a90 --- /dev/null +++ b/8612fa7f/47867b98/Java/9c47706b.html @@ -0,0 +1,48 @@ + + + + + + + + + + win10下编译以及调试openjdk | VuePress + + + + + + + +

动漫美图

编译OpenJDK

安装编译环境

下载openjdk

使用git clone(如果觉得慢可以使用coding导入的jdk

安装编译工具

1.win下Cygwin64环境编译

  1. 安装Cygwin

    1. 官方下载
    2. 设置下载源
      清华下载源
  2. 需要安装的包
    cywin64需要的包

补充:需要安装autoconf
+
  1. 编译选项&检查

+bash ./configure -with-freetype=buddle -enable-debug -with-target-bits=64 -disable-ccache
+
+
  1. 构建
make all
+

2.win下linux环境编译(ubuntu )

  1. 需要安装的包

    包名命令
    gccsudo apt-get install build-essential
    FreeTypesudo apt-get install libfreetype6-dev
    CUPSsudo apt-get install libcups2-dev
    X11sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
    ALSAsudo apt-get install libasound2-dev
    libffisudo apt-get install libffi-dev
    Autoconfsudo apt-get install autoconf
    zipsudo apt-get install zip
  2. 执行命令

 bash configure --enable-debug --with-jvm-variants=server --with-boot-jdk=/mnt/e/jdk/jdk-16 --with-tools-dir=/mnt/d/vs/2019/Community/VC/Auxiliary/Build
+

命令解释:

–with-boot-jdk 如果找不到正确jdk,通过该命令可以手动指定
jdk版本必须是编译版本的前一个版本
jdk需与目标平台(win/linux)一致

–with-tools-dir 指定编译工具目录,具体指向跟编译目标有关

注意:win下wsl默认编译win平台jdk,如果需要编译linux版本需要进行配置

build.doc

遇到的问题

win10sdk路径包含括号
在这里插入图片描述
在这里插入图片描述
解决:更换目录
移动到正常目录(括号都不行,中文就更不行了
创建软连接

   mklink /J "C:\Program Files (x86)\Windows Kits" "D:\WindowsKits"
+

当路径包含空格,路径会被截断。(参数是路径也会,最好是不要有空格)
在这里插入图片描述
警告
在这里插入图片描述
解决:执行

make clean
+

错误
在这里插入图片描述
解决:手动删除jdk下build文件夹

编译成功

编译成功
验证jdk
验证jdk

ps:如果可以的话直接在linux系统下编译,就不会有这么多的路径问题

调试OpenJDK

安装clion

因为我是java使用idea,clion和它属于一家公司产品,使用方式相似,上手容易。安装过程(略)

配置clion

根据编译jdk时使用的工具链,调试时应该选择对应的工具链,否则会出现debug无效的情况

上一篇文章我虽然使用wsl环境编译jdk,但编译工具使用的是vs工具链,所以调试选择vs工具链。
vs工具链
WSL配置
当成普通linux服务器进行连接即可,缺什么安装什么,一般是缺失cmake,gdb。
wsl配置

导入项目

  1. 导入jdk目录
  2. 创建CMakeLists.txt
    简易版(能调试,大量飘红,少部分代码能跳转)
#自己版本能用就行
+cmake_minimum_required(VERSION 3.16)
+project(jdk)
+# 添加源文件
+file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
+# 添加执行配置
+add_executable(hotspot ${SOURCE_FILES})
+

复杂版(emmmm,我不会cmake,百度到的都是少了,有大佬教我吗

#自己版本能用就行
+cmake_minimum_required(VERSION 3.16)
+project(jdk)
+# 添加源文件
+file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
+# 添加执行配置
+add_executable(hotspot ${SOURCE_FILES})
+
  1. 修改run configuration

    1. 修改executable为build/windows-x86_64-server-fastdebug/jdk/bin/java.exe
    2. 设置参数,测试用-version,可以换成类
    3. 删除build下before launch下的build
      配置结果

运行结果

断点打在src/java.base/share/native/libjli/java.c中的JavaMain函数,对c/c++不是很了解,看调用帧,这个应该是入口,下面三个点进去是汇编代码。
调试openjdk

评论数
+ + + diff --git a/8612fa7f/47867b98/Java/c82dcf86.html b/8612fa7f/47867b98/Java/c82dcf86.html new file mode 100644 index 0000000..ed9a749 --- /dev/null +++ b/8612fa7f/47867b98/Java/c82dcf86.html @@ -0,0 +1,235 @@ + + + + + + + + + + 使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF] | VuePress + + + + + + + +

动漫美图

前言

  今天做了一个自动打卡工具,准备搭建邮件服务,反馈打卡结果。使用的邮箱是yandex mail。出现Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF],记录一下。

邮箱准备

  使用邮箱没有要求,支持smtp就行

注册邮箱

yandex mail注册地址

登录邮箱

  登录邮箱后可能会提示开启smtp。

这里是官方提供打开smtp的文档,还记录了端口号。
官方文档表示端口是465

启用smtp

  邮箱首页右上角的齿轮>security> Email clients>
smtp启用页面
这里我使用outlook测试了连接,使用的端口是465,附连接成功图。

连接成功图

邮件协议

SMTP 协议

SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。提供了SSL加密的SMTP协议被称为SMTPS,SMTP使用TCP端口25,SMTPS使用TCP端口465

POP3 协议

POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S,POP3 默认端口110,POP3S默认端口995

IMAP 协议

IMAP(Internet Mail Access Protocol)以前称作交互邮件访问协议(Interactive Mail Access Protocol),是一个应用层协议。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作,提供了SSL加密的IMAP协议被称为IMAP S,POP3 默认端口143,POP3S默认端口993

搭建步骤及简单使用

mail依赖

build.gradl文件

    compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.3.2.RELEASE'
+

yml配置文件

server:
+  port: 80
+logging:
+  level:
+    web: debug
+spring:
+  mail:
+    default-encoding: UTF-8
+    host: smtp.yandex.com
+    username: xxx@xxx.xx
+    password: 123456
+    port: 25 #smtp协议使用25端口 
+#    port: 465 #smtps使用465端口,不然报错。
+    protocol: smtp #指定协议
+    test-connection: true
+    properties:
+      mail:
+        smtp:
+          auth: true # 使用
+          starttls: # 使用 SSL 安全协议,须如下配置
+            enable: true
+            required: true
+

java代码

MailService 接口文件
public interface MailService {
+
+    /**
+     * 发送纯文本邮件
+     * @param toAddr 收件人
+     * @param title 标题
+     * @param content 内容
+     */
+    void sendTextMail(String toAddr, String title, String content);
+
+    /**
+     * 发送 html 邮件
+     * @param toAddr 收件人
+     * @param title 标题
+     * @param content 内容(HTML)
+     */
+    void sendHtmlMail(String toAddr, String title, String content);
+
+    /**
+     *  发送待附件的邮件
+     * @param toAddr 收件人
+     * @param title 标题
+     * @param content 内容
+     * @param filePath 附件地址
+     */
+    void sendAttachmentsMail(String toAddr, String title, String content, String filePath);
+
+    /**
+     *  发送文本中有静态资源(图片)的邮件
+     * @param toAddr 收件人
+     * @param title 标题
+     * @param content 内容
+     * @param rscPath 资源路径
+     * @param rscId 资源id (可能有多个图片)
+     */
+    void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId);
+
+}
+
MailServiceImpl文件
@Component
+public class MailServiceImpl implements MailService {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    private final JavaMailSender mailSender;
+
+    /**
+     * 注入常量
+     */
+
+    @Value("${spring.mail.username}")
+    private String from;
+
+    public MailServiceImpl(JavaMailSender mailSender) {
+        this.mailSender = mailSender;
+    }
+
+    /**
+     * 发送文本邮件
+     *
+     * @param toAddr  收件人
+     * @param title   标题
+     * @param content 内容
+     */
+    @Override
+    public void sendTextMail(String toAddr, String title, String content) {
+        // 纯文本邮件对象
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setFrom(from);
+        message.setTo(toAddr);
+        message.setSubject(title);
+        message.setText(content);
+
+        try {
+            mailSender.send(message);
+            if (logger.isInfoEnabled()) {
+                logger.info("Text邮件已经发送。");
+            }
+        } catch (Exception e) {
+            logger.error("发送Text邮件时发生异常!", e);
+        }
+
+    }
+    
+    /**
+     * 发送 html 邮件
+     *
+     * @param toAddr  收件人
+     * @param title   标题
+     * @param content 内容(HTML)
+     */
+    @Override
+    public void sendHtmlMail(String toAddr, String title, String content) {
+        // html 邮件对象
+        MimeMessage message = mailSender.createMimeMessage();
+
+        try {
+            //true表示需要创建一个multipart message
+            MimeMessageHelper helper = new MimeMessageHelper(message, true);
+            helper.setFrom(from);
+            helper.setTo(toAddr);
+            helper.setSubject(title);
+            helper.setText(content, true);
+
+            mailSender.send(message);
+            if (logger.isInfoEnabled()) {
+                logger.info("html邮件发送成功");
+            }
+        } catch (MessagingException e) {
+            logger.error("发送html邮件时发生异常!", e);
+        }
+    }
+
+
+    /**
+     * 发送待附件的邮件
+     *
+     * @param toAddr   收件人
+     * @param title    标题
+     * @param content  内容
+     * @param filePath 附件地址
+     */
+    @Override
+    public void sendAttachmentsMail(String toAddr, String title, String content, String filePath) {
+        MimeMessage message = mailSender.createMimeMessage();
+
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(message, true);
+            helper.setFrom(from);
+            helper.setTo(toAddr);
+            helper.setSubject(title);
+            helper.setText(content, true);
+
+            FileSystemResource file = new FileSystemResource(new File(filePath));
+            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
+            helper.addAttachment(fileName, file);
+            mailSender.send(message);
+            if (logger.isInfoEnabled()) {
+                logger.info("带附件的邮件已经发送。");
+            }
+        } catch (MessagingException e) {
+            logger.error("发送带附件的邮件时发生异常!", e);
+        }
+    }
+
+
+    /**
+     * 发送文本中有静态资源(图片)的邮件
+     *
+     * @param toAddr  收件人
+     * @param title   标题
+     * @param content 内容
+     * @param rscPath 资源路径
+     * @param rscId   资源id (可能有多个图片)
+     */
+    @Override
+    public void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId) {
+        MimeMessage message = mailSender.createMimeMessage();
+
+        try {
+            MimeMessageHelper helper = new MimeMessageHelper(message, true);
+            helper.setFrom(from);
+            helper.setTo(toAddr);
+            helper.setSubject(title);
+            helper.setText(content, true);
+
+            FileSystemResource res = new FileSystemResource(new File(rscPath));
+            helper.addInline(rscId, res);
+
+            mailSender.send(message);
+            if (logger.isInfoEnabled()) {
+                logger.info("嵌入静态资源的邮件已经发送。");
+            }
+        } catch (MessagingException e) {
+            logger.error("发送嵌入静态资源的邮件时发生异常!", e);
+        }
+    }
+}
+
测试类
@SpringBootTest
+class ClockInApplicationTests {
+    @Autowired
+    MailService mailService;
+    @Test
+    void sendTextMail(){
+        mailService.sendTextMail("vlnrjp92486@chacuo.net","单元测试","测试邮件发送");
+    }
+}
+

运行结果

如标题所述,出现了异常
异常图
使用协议对应端口后发送成功,附图。
单元测试通过

结语

  通过这个实践,我觉要写代码前还是要做很多准备,或者说我了解的东西不过全面。出错后百度异常信息怎么都找不到,想着哪里出错了,之前使用outlook连接测试通过,应该就是代码问题。后来看到很多人使用25端口发送,然后去百度端口才发现协议与端口不一致。所以我觉得写代码前的准备不充分或者知识储备不足,这个重要信息都不了解。

评论数
+ + + diff --git a/8612fa7f/47867b98/Java/fd72446f.html b/8612fa7f/47867b98/Java/fd72446f.html new file mode 100644 index 0000000..1293161 --- /dev/null +++ b/8612fa7f/47867b98/Java/fd72446f.html @@ -0,0 +1,33 @@ + + + + + + + + + + gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx | VuePress + + + + + + + +

动漫美图

gateway配合nacos 找不到服务的问题

gateway版本: 3.0.2
+
nacos版本: 1.4.1
+

在这里插入图片描述

在这里插入图片描述
gateway出错了,没有任何异常信息,增加自定义异常处理后,通过日志发现一个关键词NoLoadBalancer,突然就想到Spring Cloud2020移除了Ribbon,加入依赖后成功解决问题.

<dependency>
+   <groupId>org.springframework.cloud</groupId>
+   <artifactId>spring-cloud-loadbalancer</artifactId>
+   <version>对应版本</version>
+</dependency>
+
评论数
+ + + diff --git a/8612fa7f/79666db/7b216a3b/7cab1e06.html b/8612fa7f/79666db/7b216a3b/7cab1e06.html new file mode 100644 index 0000000..5bdcd4e --- /dev/null +++ b/8612fa7f/79666db/7b216a3b/7cab1e06.html @@ -0,0 +1,26 @@ + + + + + + + + + + 二叉搜索树 | VuePress + + + + + + + +

别名
二叉搜索树,二叉查找树,BST,Binary Search Tree

特点

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树;
  4. 没有键值相等的节点。
评论数
+ + + diff --git a/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html b/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html new file mode 100644 index 0000000..8d6da5c --- /dev/null +++ b/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html @@ -0,0 +1,26 @@ + + + + + + + + + + 信息检索-绪论 | VuePress + + + + + + + +

动漫美图

信息与文献基本知识

  未来学家托天勒把人类社会的发展过程划分为3个阶段:以农业经济为基础的农业社会;以工业经济为基础的工业社会;以信息经济为基础的信息社会。在信息社会中,信息资源已被人们公认为是物质、能量资源之后的人类可利用的第三类资源,是人类社会领域的基础性资源。

从信息到文献

信息(Information)

  美国数学家、控制论的主要奠基人维纳在1950年出版的《控制论与社会》中是这样来理解信息的:“人通过感觉器官感知周围世界”,“我们支配环境的命令就是给环境的一种信息”,因此,“信息就是我们在适应外部世界,并把这种适应反作用于外部世界的过程中,同外部世界进行交换的内容的名称”。

信息的定义:

  中国国家标准《情报与文献工作词汇一一基本术语》 (GB/T4894-1985)中信息的定义为:信息是物质存在的一种方式、形态或运动状态,也是事物的一种普遍属性,一般指数据、消息中所包含的意义,可以使消息中所描述事件的不确定性减少。

信息的基本属性:

(1)客观性。
(2)传递性。
(3)多态性。
(4)共享性。
(5)时效性。
(6)价值相对性。
(7)依附性。
(8)增长性。

知识(Knowledge)

  知识是人们在改造世界的实践中所获得的认识和经验的总和,是对客观世界物质形态和运动规律的认识。根据韦伯斯特(Webster)词典1997年的定义,知识是通过实践、研究、联系或调查获得的关于事物的事实和状态的认识,是对科学、艺术或技术的理解,是人类获得的关于真理和原理的认识的总和。

知识的定义
  • 从信息的观念看,知识来源于信息,是信息的一部分。简而言之,知识是理性化、优化、系统化了的信息。
  • 从反映的内容而言,知识是客观事物的属性与联系的反映,是客观世界在人脑中的相对正确的反映。
  • 从反映的活动形式而言,知识有时表现为主体对事物的感性知觉或表象,属于感性知识,有时表现为关于事物的概念或规律,属于理性知识。

情报(Intelligence)

  情报是作为交流对象的有用的知识。“情报 是判断、意志、决心、行动需要的能指引方向的知识和智慧”;“情报是解决问题所需要的知识”;“情报是激活 了的知识”情报的基本属性是知识性、传递性和效用性。

情报的基本属性

(1) 知识性。一般而言,情报是一种新的知识。然而称为情报的知识
并不排斥时间上的“不新”。这就是说,凡原先不知道的(不论时间多久),而现在又迫切需要的知识,都属于“新”的知识。
(2) 传递性。情报传递的过程包括从情报源进行收集到向用户提供情报的全过程。无论多高深、渊博、新奇的知识,如果不记录、不传递、不交流,都不能称为情报。
(3) 效用性(判断的标准)。情报是一种有价值、有效用的知识。情报均须“有用”,当用户不需要时,百分之百的知识也不能把它称之为情报

文献(Literature/Document)

  国家标准《文献著录总则》(GB/T3792. 1-1983)给出的定义为:“文献是记录有知识的一切载体。”国家标准化组织IS0在《文献情报术语国际标准》(IS0/DIS5217)给出的定义是:“为了把人类知识传播开来和继承下去,人们用文字、图形、符号、音频、视频等手段将其记录下来,或写在纸上,或晒在蓝图上,或制在感光片上,或录到唱片上,或存储在磁盘上。这种附着在各种载体上的记录统称为文献。”

文献包括4个要素。

(1) 知识和信息,即文献的内容。
(2) 物质载体,如竹简、纸张、胶片、磁盘等,它是文献的外在形式。
(3) 记录知识和信息的符号,如文字、图表、声音、图像等。
(4) 记录的方式或手段,如书写、印刷、复制、录音、录像等,即将知识和信息固化到载体上的手段。

信息、知识、情报与文献

  我国图书情报学界对信息、知识、文献和情报的看法是:知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,当文献中记录的知识传递给用户,并为用户所利用时,文献中的知识就转化为情报。

信息的分类

  1. 按信息的内容划分
    科学技术信息
    社会科学信息
  2. 按产生信息的客体的性质来划分
    自然信息
    生物信息
    机器信息
    社会信息
  3. 按信息所依附的载体来划分
    文献信息
    口头信息

文献的分类

  1. 按照文献的加工层次分类
    零次文献(Zeroth Literature)
    一次文献(Primary Literature)
    二次文献(Secondary Literature)
    三次文献(Tertiary Literature)
  2. 按照文献的载体分类
    印刷型文献(Paper Literature)
    缩微型文献(Microform)
    电子型文献(Electronic iterature)
    音像型文献(Audio-Visual iterature)
  3. 按照文献的出版形式分类
    图书
    期刊
    报纸
    特种文献(学位论文、会议论文、专利文献、标准文献、科技报告、政府出版物、产品样本资料等)

信息检索基础

信息检索的原理

信息检索的概念

  广义的信息检索“Information Retrieval”是指将信息按照一定的方式组织和存储起来,并根据信息用户的需要揭示、查找、传递相关信息的过程,包括了信息的存储过程和查找过程。狭义的信息检索仅指信息的查找,是指从信息集合中找出用户所需要的有关信息的过程。狭义的信息检索包括3个方面的含义:了解用户的信息需求、信息检索的技术或方法、满足信息用户的需求。

信息检索的原理

  信息检索的基本原理就是在对信息进行整理排序形成检索工具的基础上,按照用户的要求利用检索工具或检索系统,将用户检索提问标识(检索词)与已形成的或存储在系统中的信息的存储标识(文献特征标识、标引词)进行匹配比较,若取得一致,则为匹配,即达到了用户的检索需求,如图1.1所示。

信息检索的类型

  1. 按信息存储和检索的内容分类
    文献检索
    数据检索
    事实检索
  2. 按照检索系统中信息的组织方式分类
    全文检索
    多媒体检索
  3. 按照信息存储的载体和实现查找的技术手段分类
    手工检索
    机械检索
    计算机检索

信息检索的工具

  信息检索工具是指为检索需要而组织的文献检索系统,它是收集、加工标引、组织文献的结果,是检索工作赖以生存的手段和条件,包含目录、索引、文摘等。

典型的检索工具组成

  1. 主体:即检索工具的主要部分,由所收录文献的著录部分组成,是文献储存与检索的实体。其包含文献的内部特征与文献的外部特征。
  2. 辅助索引:是在文献检索工作中,从主体部分的文献款目编排系统以外的角度增加检索途径、扩大检索效果的辅助手段,它不能离开检索工具的主体单独存在。
  3. 使用说明:向用户介绍本检索工具的性质、内容范围、收录年限、读者对象、著录方法、分类体系、检索方法等,帮助用户利用检索工具。
目录
目录的定义

  目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

目录的著录款目

目录的著录包括如下款目。
(1) 书名(刊名)项。
(2) 著者(编者)项。
(3) 出版项:包括出版地点、出版者、出版期、版次等。
(4) 稽核项:包括页数、图表、开本、装订形式、定价等。
(5) 附注项:对上述各项的补充或说明。
(6) 提要项:内容简介。
(7) 业务注记:指图书馆或保存单位在目录上做的业务记载,包括索取号、登录号、分类号、主题词、存储地点等。

索引
索引的定义

  索引是将报刊书籍中某些重要的或有意义的信息,如书名、刊名篇名、主题、人名、地名等分别摘录出来,按一定方式编排,并注明出处,以供检索的工具。

索引的作用

  索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

常用索引

(1) 主题索引
(2) 分类索引
(3) 著者索引
(4) 其他:单位索引(或团体著者索引)、化学分子式索引、引用刊物索引、出版单位索引等。

文摘
文摘定义

  我国国家标准GB3468——83定义文摘为“除题录部分外还对文献内容作实质性描述的文献条目称文摘”。

文摘作用

(1) 帮助读者快速判断文献内容
(2) 节省阅读时间
(3) 减少语言障碍
(4) 替代原文

检索工具类型
  1. 按信息加工的手段或设备划分
    手工检索工具
    机械检索工具
    计算机检索工具
  2. 按编制方法划分
    目录型检索工具
    题录型检索工具
    文摘型检索工具
    索引型检索工具
  3. 按信息载体形态划分
    书本式检索工具
    卡片式检索工具
    缩微式检索工具
    磁性材料式检索工具
  4. 按收录范围划分
    综合性检索
    综合性检系
    专科性检索工具
    专题性检索工具
    全面性检索工具
    单一性检索工具
  5. 按时间范围划分
    预告性检索工具
    现期通报性检索工具
    回溯性检索工具

信息检索的意义

  1. 掌握获取知识的捷径,提高信息利用的效率
  2. 提高信息素质,培养终身学习的能力
  3. 科学研究的向导,科技查新的基础

信息检索的途径

  根据信息的基本特征,可以把信息检索途径分为外部特征检索途径(题名途径、著者途径、引文途径等)和内容特征检索途径(分类途径、主题途径等)两大类。

外部特征途径

  1. 题名途径:刊名、书名、篇名等
  2. 著者途径:作者、编者、译者、专利权人、出版机构等
  3. 引文途径: 其他途径:专利号、报告号、合同号、标准号、国际标准书号和刊号等

内容特征途径

  1. 分类途径:是指按照文献所属学科(专业)属性(类别)进行检索的途径。
  2. 主题途径:是按照文献信息的主题内容进行检索的途径,利用主题词、关键词、叙词,并按字顺排列实现检索。

信息检索的步骤和方法

信息检索的步骤

信息检索的方法

  1. 顺查法:指按照时间的顺序,由远及近地利用检索系统进行文献信息检索的方法。
  2. 逆查法:是由近及远地查找,逆着时间的顺序利用检索工具进行文献信息检索的方法。
  3. 抽查法:是针对检索课题的特点,选择有关该课题的文献信息最可能出现或最多出现的时间段,利用检索工具进行重点检索的方法。
  4. 追溯法(引文法) :是指利用已经掌握的文献末尾所列的参考文献,进行逐一追溯查找“引文”的一种最简便的扩大情报来源的方法。
  5. 综合法:又称循环法,这是把上述方法加以综合运用的方法。

计算机信息检索基础

计算机信息检索概述

计算机信息检索的特点

(1) 速度快。
(2) 检索范围广。
(3) 检索不受时空的限制。
(4) 及时。
(5) 界面友好。
(6) 超文本检索。

计算机信息检索分类

(1) 脱机检索
(2) 联机检索
(3) 网络检索

计算机信息检索技术

  计算机检索系统常采用一些运算方法,从概念相关性、位置相关性等方面对检索提问进行技术处理。

  1. 检索词的选择
    检索式由检索词和检索算符组成。
    检索词分为两类:受控词和非受控词。
  2. 布尔逻辑检索
    将多个检索词用布尔运算符(简称检索算符)组合在一起来进行检索,称之为布尔逻辑检索。
    系统使用的检索算符一般有以下几种:
    (1) 逻辑与
    (2) 逻辑或
    (3) 逻辑非

光盘检索

光盘检索的特点主要有以下几个。

  1. 检索途径多。其可提供内容、著者、关键词、标题、著者单位、年代、出处等多种检索途径。
  2. 检索系统配置简单。利用微机系统建立光盘检索系统只要一台光盘驱动器和所需要的盘片,不需经过通信线路。
  3. 检索费用低廉。由于光盘的费用是一次性投入,可够次任意使用,利用率越高,分摊的成本越低。
  4. 系统操作简单。光盘数据库一般都具备类似联机检索那样齐全的检索和输出功能,同时提供人机对话,系统界面友好。

网络检索

网络检索具有如下特点:

  1. 检索速度快。手工检索需数周的课题计算机检索只需数小时或数分钟。
  2. 检索途径多。除手工检索工具的分类、主题、著者等检索途径之外,网络检索往往还提供更多更灵活的检索途径,如文本词途径。
  3. 更新快。网上信息很多为为更新。
  4. 范围广。网上数据库的种类更为广泛和丰富,有些可免费进行
  5. 检索用词的选择及其组配更为灵活。检索策略的制定更为灵活和复杂,可利用各种讦算机检索技术随意扩天或缩小检索范围以满足用户各种不同的信息检索需求。
  6. 检索结果可直接打印或下载,可操作性强。

思考题:

简述信息、知识、文献的概念,及三者之间的关系。

  知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,

信息检索的目的和意义

  1. 掌握获取知识的捷径,提高信息利用的效率
  2. 提高信息素质,培养终身学习的能力
  3. 科学研究的向导,科技查新的基础

检索工具的结构构成是什么?

  1. 目录
  2. 索引
  3. 文摘

目录在检索中起什么作用?

  目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

索引在检索中起什么作用?

  索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

文摘在检索中起什么作用?

(1) 帮助读者快速判断文献内容
(2) 节省阅读时间
(3) 减少语言障碍
(4) 替代原文

简述国内外主要分类法。

中国图书分类法

  1. 中国人民大学图书馆图书分类法。简称人大法新中国成立后的第一部分类法,1954年出第一版,1996年出第六版。4大部类、17个基本大类。总结科学,社会科学,自然科学,综合性科学、综合性图书。
  2. 中国科学院图书馆图书分类法
  3. 中国图书资料分类法
  4. 中国档案分类法

外国图书分类法

  1. 杜威十进分类法(Dewey Decimal Classification &Relative Index,DDC)是世界上流传最广、影响最大的一部文献分类法,它开创了文献分类法的新纪元,是外国文献分类法发展史上一个重要里程碑。
  2. 国际十进分类法
  3. 美国国会图书馆分类法
  4. 冒号分类法
  5. 布利斯书目分类法

操作题:

题目:

利用《中国图书馆图书分类法》找出分类号。

检索目的:

掌握《中国图书馆图书分类法》的基本构成特点。

检索要求:

按照基本大类,在《中国图书馆图书分类法》中查找以下相关类目编号。

  1. 计算机技术:国际互联网

TP393.4

  1. 交通运输:运输线路优选

U116.2

  1. 环境科学:环境污染的控制及其排除

X506

  1. 食品工业:淀粉加工工艺

TS234

  1. 文化、科学:图书馆工作者

G251.6

评论数
+ + + diff --git a/8612fa7f/8f8103b7/Docker/29596f0c.html b/8612fa7f/8f8103b7/Docker/29596f0c.html new file mode 100644 index 0000000..fb6fda9 --- /dev/null +++ b/8612fa7f/8f8103b7/Docker/29596f0c.html @@ -0,0 +1,38 @@ + + + + + + + + + + 在docker安装elasticsearch | VuePress + + + + + + + +

动漫美图

安装elasticsearch(简称es)

拉取镜像,该命令拉取最新版(不推荐,最新版意味着踩坑)

docker pull elasticsearch
+

可以指定版本,查看elasticsearch版本

docker pull elasticsearch:x.x.x
+

执行docker pull elasticsearch
尝试运行

docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:latest
+

response from daemon: Conflict. The container name "/elasticsearch" is already in use by container "06a80d721428c762abcb750f5a5f48a947c4714e3f9e6637e10792b4f4fa5a02". You have to remove (or rename) that container to be able to reuse that name
查看所有容器

docker ps -a
+

解决方法

  1. 删除容器,重新创建
docker rm containerId|names
+

image.png
发送GET请求,校验是否安装成功

curl localhost:9200
+

curl localhost:9200
2. 重新启动之前的容器

docker start containerId|names
+

安装可视化控件(kibana,elasticsearch-head…)

这里选择kibana,颜值就是正义,在docker中安装kibana官方文档

需要指定版本,该版本与es一致

docker pull docker.elastic.co/kibana/kibana:7.6.2
+

 response from daemon: manifest for docker.elastic.co/kibana/kibana:latest not found: manifest unknown: manifest unknown
+
运行kibana

docker run --link elasticsearch:elasticsearch -p 5601:5601 --name kibana -d docker.elastic.co/kibana/kibana:7.6.2
+

测试

 curl localhost:5601/status
+

出现kibana server is not ready yet
查看日志

docker logs -f containerId
+

image.png
完了掉坑里了,下次再写了顺便补上docker-compose部署

评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html b/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html new file mode 100644 index 0000000..7dc591e --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html @@ -0,0 +1,57 @@ + + + + + + + + + + [21]合并两个有序链表 | VuePress + + + + + + + +
class Solution {
+    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
+      // 虚拟头结点
+      ListNode dummy = new ListNode(-1), p = dummy;
+      ListNode p1 = l1, p2 = l2;
+
+      while (p1 != null && p2 != null) {
+        // 比较 p1 和 p2 两个指针
+        // 将值较小的的节点接到 p 指针
+        if (p1.val > p2.val) {
+          p.next = p2;
+          p2 = p2.next;
+        } else {
+          p.next = p1;
+          p1 = p1.next;
+        }
+        // p 指针不断前进
+        p = p.next;
+      }
+
+      if (p1 != null) {
+        p.next = p1;
+      }
+
+      if (p2 != null) {
+        p.next = p2;
+      }
+
+      return dummy.next;
+    }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html b/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html new file mode 100644 index 0000000..61e2c38 --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html @@ -0,0 +1,54 @@ + + + + + + + + + + [23]合并K个升序链表 | VuePress + + + + + + + +
class Solution {
+  public ListNode mergeKLists(ListNode[] lists) {
+    if (lists.length == 0) return null;
+    // 虚拟头结点
+    ListNode dummy = new ListNode(-1);
+    ListNode p = dummy;
+    // 优先级队列,最小堆
+    PriorityQueue<ListNode> pq = new PriorityQueue<>(
+      lists.length, (a, b)->(a.val - b.val));
+    // 将 k 个链表的头结点加入最小堆
+    for (ListNode head : lists) {
+      if (head != null)
+        pq.add(head);
+    }
+
+    while (!pq.isEmpty()) {
+      // 获取最小节点,接到结果链表中
+      ListNode node = pq.poll();
+      p.next = node;
+      if (node.next != null) {
+        pq.add(node.next);
+      }
+      // p 指针不断前进
+      p = p.next;
+    }
+    return dummy.next;
+  }
+}
+

总结:优先级队列

评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/36462e02.html b/8612fa7f/b7e144d1/2362a8ea/36462e02.html new file mode 100644 index 0000000..12f5c4f --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/36462e02.html @@ -0,0 +1,59 @@ + + + + + + + + + + [19]删除链表的倒数第 N 个结点 | VuePress + + + + + + + +
/**
+ * Definition for singly-linked list.
+ * public class ListNode {
+ *     int val;
+ *     ListNode next;
+ *     ListNode() {}
+ *     ListNode(int val) { this.val = val; }
+ *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
+ * }
+ */
+class Solution {
+  public ListNode removeNthFromEnd(ListNode head, int n) {
+    //删除倒数第N个,那我怎么知道N的位置,链表长度不是固定的
+    //假设是1到x,那么第倒数第N个应该是 X - N + 1
+    //Y = X - N + 1 ,则
+    // 虚拟头结点
+    ListNode pre = new ListNode(0);
+    pre.next = head;
+    ListNode start = pre, end = pre;
+    // p1 先走 n 步
+    while (n != 0) {
+      start = start.next;
+      n--;
+    }
+    // p1 和 p2 同时走 x - n 步,当p1走完时,p2走了 x-n步,停在X - N + 1上
+    while (start.next != null) {
+      start = start.next;
+      end = end.next;
+    }
+    end.next = end.next.next;
+    return pre.next;
+  }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/3758805c.html b/8612fa7f/b7e144d1/2362a8ea/3758805c.html new file mode 100644 index 0000000..9472fc2 --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/3758805c.html @@ -0,0 +1,56 @@ + + + + + + + + + + [86]分隔链表 | VuePress + + + + + + + +
class Solution {
+  public ListNode partition(ListNode head, int x) {
+      // 存放小于 x 的链表的虚拟头结点
+      ListNode dummy1 = new ListNode(-1);
+      // 存放大于等于 x 的链表的虚拟头结点
+      ListNode dummy2 = new ListNode(-1);
+      // p1, p2 指针负责生成结果链表
+      ListNode p1 = dummy1, p2 = dummy2;
+      // p 负责遍历原链表,类似合并两个有序链表的逻辑
+      // 这里是将一个链表分解成两个链表
+      ListNode p = head;
+      while (p != null) {
+        if (p.val >= x) {
+          p2.next = p;
+          p2 = p2.next;
+        } else {
+          p1.next = p;
+          p1 = p1.next;
+        }
+        // 断开原链表中的每个节点的 next 指针
+        ListNode temp = p.next;
+        p.next = null;
+        p = temp;
+      }
+      // 连接两个链表
+      p1.next = dummy2.next;
+
+      return dummy1.next;
+    }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/389d18c2.html b/8612fa7f/b7e144d1/2362a8ea/389d18c2.html new file mode 100644 index 0000000..e5b9600 --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/389d18c2.html @@ -0,0 +1,47 @@ + + + + + + + + + + [160]相交链表 | VuePress + + + + + + + +
public class Solution {
+  public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
+    // p1 指向 A 链表头结点,p2 指向 B 链表头结点
+    ListNode p1 = headA, p2 = headB;
+    while (p1 != p2) {
+      // p1 走一步,如果走到 A 链表末尾,转到 B 链表
+      if (p1 == null) {
+        p1 = headB;
+      } else {
+        p1 = p1.next;
+      }
+      // p2 走一步,如果走到 B 链表末尾,转到 A 链表
+      if (p2 == null) {
+        p2 = headA;
+      } else {
+        p2 = p2.next;
+      }
+    }
+    return p1;
+  }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/69a9925d.html b/8612fa7f/b7e144d1/2362a8ea/69a9925d.html new file mode 100644 index 0000000..d0bec7b --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/69a9925d.html @@ -0,0 +1,52 @@ + + + + + + + + + + [141]环形链表 | VuePress + + + + + + + +
/**
+ * Definition for singly-linked list.
+ * class ListNode {
+ *     int val;
+ *     ListNode next;
+ *     ListNode(int x) {
+ *         val = x;
+ *         next = null;
+ *     }
+ * }
+ */
+public class Solution {
+  public boolean hasCycle(ListNode head) {
+    ListNode fast = head, slow = head;
+    // 快指针走到末尾时停止
+    while (fast != null && fast.next != null) {
+      slow = slow.next;
+      fast = fast.next.next;
+      // 快慢指针相遇,说明含有环
+      if (slow == fast) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html b/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html new file mode 100644 index 0000000..1072235 --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html @@ -0,0 +1,51 @@ + + + + + + + + + + [876]链表的中间结点 | VuePress + + + + + + + +
/**
+ * Definition for singly-linked list.
+ * public class ListNode {
+ *     int val;
+ *     ListNode next;
+ *     ListNode() {}
+ *     ListNode(int val) { this.val = val; }
+ *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
+ * }
+ */
+class Solution {
+  public ListNode middleNode(ListNode head) {
+    //简单的话应该是循环一遍,获取长度,如果是偶数则长度加一,然后获取中点,再循环一次
+    // 快慢指针初始化指向 head
+    ListNode slow = head, fast = head;
+    // 快指针走到末尾时停止
+    while (fast != null && fast.next != null) {
+      // 慢指针走一步,快指针走两步
+      slow = slow.next;
+      fast = fast.next.next;
+    }
+    // 慢指针指向中点
+    return slow;
+  }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html b/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html new file mode 100644 index 0000000..7554cf2 --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html @@ -0,0 +1,43 @@ + + + + + + + + + + [剑指 Offer 22]链表中倒数第k个节点 | VuePress + + + + + + + +
class Solution {
+    public ListNode getKthFromEnd(ListNode head, int k) {
+        ListNode p1 = head;
+        // p1 先走 k 步
+        for (int i = 0; i < k; i++) {
+            p1 = p1.next;
+        }
+        ListNode p2 = head;
+        // p1 和 p2 同时走 n - k 步
+        while (p1 != null) {
+            p2 = p2.next;
+            p1 = p1.next;
+        }
+        // p2 现在指向第 n - k + 1 个节点,即倒数第 k 个节点
+        return p2;
+    }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/2362a8ea/9862a150.html b/8612fa7f/b7e144d1/2362a8ea/9862a150.html new file mode 100644 index 0000000..4cafe03 --- /dev/null +++ b/8612fa7f/b7e144d1/2362a8ea/9862a150.html @@ -0,0 +1,59 @@ + + + + + + + + + + [剑指 Offer II 022]链表中环的入口节点 | VuePress + + + + + + + +
/**
+ * Definition for singly-linked list.
+ * class ListNode {
+ *     int val;
+ *     ListNode next;
+ *     ListNode(int x) {
+ *         val = x;
+ *         next = null;
+ *     }
+ * }
+ */
+public class Solution {
+  public ListNode detectCycle(ListNode head) {
+    //如果用两个指针
+    ListNode fast = head, slow = head;
+    while (fast != null && fast.next != null) {
+      fast = fast.next.next;
+      slow = slow.next;
+      if (fast == slow) {
+        break;
+      }
+    }
+    if (fast == null || fast.next == null) {
+      return null;
+    }
+    slow = head;
+    while (slow!=fast){
+        slow = slow.next;
+        fast = fast.next;
+    }
+    return slow;
+  }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/340249a9/76a66db0.html b/8612fa7f/b7e144d1/340249a9/76a66db0.html new file mode 100644 index 0000000..8b6122e --- /dev/null +++ b/8612fa7f/b7e144d1/340249a9/76a66db0.html @@ -0,0 +1,39 @@ + + + + + + + + + + [2073]买票需要的时间 | VuePress + + + + + + + +
class Solution {
+    public int timeRequiredToBuy(int[] tickets, int k) {
+        int ret = 0;
+        for (int i = 0; i < tickets.length; i++) {
+            if (i <= k) {
+                ret = ret + Math.min(tickets[i], tickets[k]);
+            } else {
+                ret = ret + Math.min(tickets[i], tickets[k] - 1);
+            }
+        }
+        return ret;
+    }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html b/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html new file mode 100644 index 0000000..441174a --- /dev/null +++ b/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html @@ -0,0 +1,46 @@ + + + + + + + + + + [230]二叉搜索树中第K小的元素 | VuePress + + + + + + + +
class Solution {
+  int rank,res = 0;
+  public int kthSmallest(TreeNode root, int k) {
+    traverse(root,k);
+    return res;
+  }
+  private void traverse(TreeNode root, int k) {
+    if (root == null) {
+      return;
+    }
+    traverse(root.left,k);
+    //二叉搜索树的特点,若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值,因此先序遍历的就是第k小
+    rank++;
+    if (k == rank) {
+      res = root.val;
+      return;
+    }
+    traverse(root.right,k);
+  }
+}
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html b/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html new file mode 100644 index 0000000..6fccc5e --- /dev/null +++ b/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html @@ -0,0 +1,62 @@ + + + + + + + + + + [124]二叉树中的最大路径和 | VuePress + + + + + + + +

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和。

示例 1:
示例 1
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:
示例 2
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

  • 树中节点数目范围是 [1, 3 * 10⁴]
  • -1000 <= Node.val <= 1000

Related Topics

  • 深度优先搜索
  • 动态规划
  • 二叉树
  • 👍 1658
  • 👎 0
/**
+ * Definition for a binary tree node.
+ * public class TreeNode {
+ *     int val;
+ *     TreeNode left;
+ *     TreeNode right;
+ *     TreeNode() {}
+ *     TreeNode(int val) { this.val = val; }
+ *     TreeNode(int val, TreeNode left, TreeNode right) {
+ *         this.val = val;
+ *         this.left = left;
+ *         this.right = right;
+ *     }
+ * }
+ */
+class Solution {
+  int res = Integer.MIN_VALUE;
+
+  public int maxPathSum(TreeNode root) {
+    // 后序位置
+    oneSideMax(root);
+    return res;
+  }
+
+  private int oneSideMax(TreeNode root){
+    if (root == null) {
+      return 0;
+    }
+    int left = Math.max(0, oneSideMax(root.left));
+    int right = Math.max(0, oneSideMax(root.right));
+    res = Math.max(res, left + right + root.val);
+    return Math.max(left, right) + root.val;
+  }
+}
+//leetcode submit region end(Prohibit modification and deletion)
+
+
评论数
+ + + diff --git a/8612fa7f/b7e144d1/e85d694a/c7081503.html b/8612fa7f/b7e144d1/e85d694a/c7081503.html new file mode 100644 index 0000000..10243a6 --- /dev/null +++ b/8612fa7f/b7e144d1/e85d694a/c7081503.html @@ -0,0 +1,95 @@ + + + + + + + + + + [105]从前序与中序遍历序列构造二叉树 | VuePress + + + + + + + +
/**
+ * Definition for a binary tree node.
+ * public class TreeNode {
+ *     int val;
+ *     TreeNode left;
+ *     TreeNode right;
+ *     TreeNode() {}
+ *     TreeNode(int val) { this.val = val; }
+ *     TreeNode(int val, TreeNode left, TreeNode right) {
+ *         this.val = val;
+ *         this.left = left;
+ *         this.right = right;
+ *     }
+ * }
+ */
+class Solution {
+  public TreeNode buildTree(int[] preorder, int[] inorder) {
+    return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
+  }
+
+  private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) {
+    if (preStart > preEnd) {
+      return null;
+    }   //根的值
+    int rootVal = preorder[preStart];
+    //中序中根的位置
+    int index = 0;
+    for (int i = inStart; i <= inEnd; i++) {
+      if (inorder[i] == rootVal) {
+        index = i;
+        break;
+      }
+    }
+    //根节点左边节点数
+    int leftSize = index - inStart;
+    TreeNode root = new TreeNode(rootVal);
+    //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
+    //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
+    root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);
+    root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd);
+    return root;
+  }
+}
+

改进

class Solution {
+  Map<Integer,Integer> valOrderMap = new HashMap<>();
+  public TreeNode buildTree(int[] preorder, int[] inorder) {
+    for (int j = 0; j < inorder.length; j++) {
+      valOrderMap.put(inorder[j],j);
+    }
+    return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
+  }
+
+  private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) {
+    if (preStart > preEnd) {
+      return null;
+    }   //根的值
+    int rootVal = preorder[preStart];
+    //中序中根的位置
+    int index = valOrderMap.get(rootVal);
+    //根节点左边节点数
+    int leftSize = index - inStart;
+    TreeNode root = new TreeNode(rootVal);
+    //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
+    //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
+    root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);
+    root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd);
+    return root;
+  }
+}
+
评论数
+ + + diff --git a/8612fa7f/e00fc567/3632a017/af753a41.html b/8612fa7f/e00fc567/3632a017/af753a41.html new file mode 100644 index 0000000..4e8aa17 --- /dev/null +++ b/8612fa7f/e00fc567/3632a017/af753a41.html @@ -0,0 +1,26 @@ + + + + + + + + + + 安卓Studio打不开 | VuePress + + + + + + + +

安卓Studio打不开

莫名奇妙的问题,idea能打开。难道有单独的变量设置?最后没找到。
官网上的针对IDE能打开的情况,这不是废话吗,能打开什么都好说。。。

通过bat打开后发现Android Studio 使用的是java11,而我坏境JavaHome是1.8。但是之前就很正常,而且它是自带环境的,卸载重装也没用

最后给我的java环境升级到了java19,成功解决问题。

问题不到,开发时可以指定java版本,外部就用最高的长期支持版吧!

评论数
+ + + diff --git a/8612fa7f/e00fc567/5ac6f809/49af668f.html b/8612fa7f/e00fc567/5ac6f809/49af668f.html new file mode 100644 index 0000000..95d462c --- /dev/null +++ b/8612fa7f/e00fc567/5ac6f809/49af668f.html @@ -0,0 +1,27 @@ + + + + + + + + + + 一个bug | VuePress + + + + + + + +

动漫美图

一个让人烦躁的bug

  今天写代码,一个简单的查询,总是出现++java.math.BigDecimal cannot be cast to java.lang.Integer++,项目是热部署的,以为是缓存,清除一遍又一遍还是无效。我试着用toString方法转字符串然后转int,结果出现了异常,但是注释掉的代码可以运行

转换异常,看不出哪里有异常转换,我也有点好奇Map<String, Integer>是怎么变成Map<String, BigDecimal>的。
类型变化
我手动写了一个Map<String, Integer>尝试放入一个BigDecimal,结果编译失败了!

编译失败

查询使用了mybatis3.2.6框架(不是plus), resultType=“java.util.Map”
下面是sql

select MONTH(日期) as month,SUM(amount) AS total FROM `销售` where YEAR(日期) = #{year} GROUP BY MONTH(日期);
+
评论数
+ + + diff --git a/8612fa7f/e00fc567/5ac6f809/aa3015f4.html b/8612fa7f/e00fc567/5ac6f809/aa3015f4.html new file mode 100644 index 0000000..e61f619 --- /dev/null +++ b/8612fa7f/e00fc567/5ac6f809/aa3015f4.html @@ -0,0 +1,54 @@ + + + + + + + + + + Android逆向工程:使用Apktool反编译小米便签 | VuePress + + + + + + + +

动漫美图

记录一次安卓反编译过程

下周就要安卓课设,而我的课设作业是开发一个记事本,我发现我小米手机上的便签挺好的,于是想参考一下布局以及实现。

软件apktooldex2jarjd-jui
版本2.4.12.10.3.5

准备工作

  1. 获取小米便签
    网上没有最新版下载,通过Es文件浏览器导出apk。
    也可以通过mt浏览器,因为后面需要三个framework文件,Es浏览器和Re浏览器好像屏蔽了根目录,不能访问了。

  2. 下载反编译相关工具
    菜鸟教程三个工具,版本低,

  3. 我使用的三个工具 密码:7uyi

开始反编译

apktool.bat d base.apk
+

Could not decode arsc file

这个是由于apktool版本低导致的,下载最新的重命名为apktool.jar替换即可
更新最新apktool后再次执行命令,还是失败,错误信息如下:

W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=android, name=id, value=0x100b0001
+W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=, name=layout, value=0x10030009
+W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
+W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
+W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
+W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d008f
+W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=android, name=height, value=0x100a0003
+W: Could not decode attr value, using undecoded value instead: ns=android, name=width, value=0x100a0003
+I: Decoding values */* XMLs...
+Can't find framework resources for package of id: 16. You must install proper framework files, see project website for more info.
+

查看一下反编译结果,发现资源以及提取出来,但是没有任何代码。
百度了最后一句话发现,有些应用需要提供额外框架,具体信息可以查看一下博文Android逆向工程:解决针对小米系统应用,使用Apktool反编译失败问题!

根据博文我提取了文章中提到的framework-res.apk,framework-ext-res.apk,miui.apk。
文件列表

执行一下命令安装:

apktool if framework-res.apk
+apktool if framework-ext-res.apk
+apktool if miui.apk
+

安装完成后发现缺少的16号对应framework-ext-res.apk

缺少的16号

再次执行 apktool.bat d base.apk 后发现还有问题,提示缺少了id为18的框架文件

缺少了id为18的框架文件

我有点头疼,我怎么知道18号是什么文件,于是尝试导入其他文件,搜索framework,找到了一个名为XiaomiServiceFramework.apk的文件,并进行安装;

apktool if XiaomiServiceFramework.apk

根据上图,我发现这个文件不是我们需要的,但它提供了一个信息:
++I: Decoding Shared Library (miui.system), pkgId: 18++
于是我去搜索system,经过筛选找到miuisystem.apk,进行安装,发现他就是我们需要的18号:

apktool if miuisystem.apk
再次反编译没有报错,查看文件发现Smali代码成功获取:

成功截图

反编译到此结束,会smali语法的大佬已经可以阅读代码了,不会的可以使用工具转java再阅读

使用dex2jar将dex转成jar

  1. 将base.apk当成压缩包打开
  2. 提取 classes.dex,classes2.dex
    执行命令:
d2j-dex2jar.bat classes.dex
+d2j-dex2jar.bat classes2.dex
+

d2j-dex2jar.bat classes.dex
这个也是版本低导致的,下载最新的就可以了
再次执行,出了新问题,我之前没遇到

C:\Users\dyt\Desktop\dex-tools-2.1-SNAPSHOT>d2j-dex2jar.bat classes.dex
+dex2jar classes.dex -> .\classes-dex2jar.jar
+Detail Error Information in File .\classes-error.zip
+Please report this file to one of following link if possible (any one).
+    https://sourceforge.net/p/dex2jar/tickets/
+    https://bitbucket.org/pxb1988/dex2jar/issues
+    https://github.com/pxb1988/dex2jar/issues [no attachment support, not preferred]
+    dex2jar@googlegroups.com
+

换了一个多了后缀的2.1版本,成功解决,但我不记得在哪下的了

成功获取jar

获取的jar

使用jd-gui查看

这个就是软件使用了,跟一般软件没区别,将jar包拖到jd-gui.exe就行了,不多说,自己体会。

使用截图

评论数
+ + + diff --git a/8612fa7f/e00fc567/5ac6f809/c4877271.html b/8612fa7f/e00fc567/5ac6f809/c4877271.html new file mode 100644 index 0000000..4f9054f --- /dev/null +++ b/8612fa7f/e00fc567/5ac6f809/c4877271.html @@ -0,0 +1,333 @@ + + + + + + + + + + Failed to resolve: androidx.appcompat:appcompat:1.1.0 | VuePress + + + + + + + +

动漫美图

安卓实验–内容提供器

日常踩雷

新建了一个空activity项目
+
ERROR: Failed to resolve: androidx.appcompat:appcompat:1.1.0
+ERROR: Failed to resolve: androidx.test.ext:junit:1.1.1
+ERROR: Failed to resolve: androidx.test.espresso:espresso-core:3.2.0
+ERROR: Failed to resolve: androidx.constraintlayout:constraintlayout:1.1.3
+

init.gradle

感觉有毒,成功了,依赖还是未解决,清除缓存重启无效!
有毒

删除init.gradle后,成功解决,好吧,估计问题在镜像仓库,也可能是这个配置问题,以后还是老老实实用官方源吧,虽然费时间。但出错率低。
  这是我的init.gradle,路径为C:\Users\{username}\.gradle,建立这个文件的目的是加速依赖下载,现在看来反而是累赘,以前用着正常,现在不能用了也不知道是什么原因。

allprojects{
+    repositories {
+        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
+        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
+        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
+        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
+        all { ArtifactRepository repo ->
+            if(repo instanceof MavenArtifactRepository){
+                def url = repo.url.toString()
+                if (url.startsWith('https://repo1.maven.org/maven2')) {
+                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
+                    remove repo
+                }
+                if (url.startsWith('https://jcenter.bintray.com/')) {
+                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
+                    remove repo
+                }
+if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
+                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
+                    remove repo
+                }
+                if (url.startsWith('https://plugins.gradle.org/m2/')) {
+                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
+                    remove repo
+                }
+            }
+        }
+        maven {
+                url ALIYUN_REPOSITORY_URL
+                url ALIYUN_JCENTER_URL
+	url ALIYUN_GOOGLE_URL 
+ 	url ALIYUN_GRADLE_PLUGIN_URL 
+
+        }
+    }
+}
+

image.png

问题解决了,开工干活

实验目的

1、掌握运行时权限使用
2、掌握访问其他应用程序的数据

实验内容

1.实现拨打电话功能
2.访问通讯录

实验仪器

1)PC机最低配置:2G Hz以上双核CPU,2G以上内存
2)Windows 32位或64位操作系统
3)Android Studio 2.2及以上版本

实验主要步骤

1)创建实验项目:选择Empty Activity
2)编写布局文件;

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:tools="http://schemas.android.com/tools"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        tools:context=".MainActivity">
+
+    <ListView
+            android:id="@+id/list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
+

list_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:layout_margin="20dp"
+              android:padding="5dp">
+
+    <ImageView
+            android:contentDescription="@string/icon"
+            android:src="@mipmap/kyzja1gl2m4"
+            android:id="@+id/image_photo"
+            android:layout_width="70dp"
+            android:layout_height="70dp" />
+    <LinearLayout
+            android:layout_weight="1"
+            android:layout_width="0dp"
+            android:layout_height="70dp"
+            android:orientation="vertical"
+            android:layout_marginRight="15dp"
+            android:layout_marginLeft="15dp">
+
+        <TextView
+                android:id="@+id/name"
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:text="@string/name"
+                android:textStyle="bold"
+                android:textColor="#000"
+                android:textSize="20sp" tools:ignore="NestedWeights"/>
+        <TextView
+                android:id="@+id/phone"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:layout_width="match_parent"
+                android:text="@string/phone"
+                android:textStyle="bold"
+                android:textColor="#666"
+                android:textSize="20sp" />
+    </LinearLayout>
+    <Button
+            android:layout_width="70dp"
+            android:layout_height="70dp"
+            android:id="@+id/call"
+            android:text="@string/call"
+    />
+</LinearLayout>
+

3)编写Activity类,单击查询通讯录信息,申请运行时权限

MainActivity

package tk.dragondyt.study6;
+import android.Manifest;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.util.Log;
+import android.widget.ListView;
+import android.widget.Toast;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * @author dyt
+ */
+public class MainActivity extends AppCompatActivity {
+    final String TAG = "MainActivity";
+    ContactPersonAdapter adapter;
+    List<Person> contactsList = new ArrayList<>();
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        ListView listView = findViewById(R.id.list);
+        adapter = new ContactPersonAdapter(this,getLayoutInflater(),contactsList);
+        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
+            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
+        } else {
+            readContacts();
+        }
+        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
+            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 100);
+        }
+        listView.setAdapter(adapter);
+
+    }
+    private void readContacts() {
+        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+                null, null, null, null)) {
+            if (cursor != null) {
+                while (cursor.moveToNext()) {
+                    String name = cursor.getString(cursor.getColumnIndex(
+                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
+                    String phone = cursor.getString(cursor.getColumnIndex(
+                            ContactsContract.CommonDataKinds.Phone.NUMBER));
+                    contactsList.add(new Person(name,phone));
+                }
+                adapter.notifyDataSetChanged();
+            }
+        } catch (Exception e) {
+            Log.d(TAG, "readContacts: "+e.getMessage());
+        }
+    }
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantsResults) {
+        if (requestCode == 1) {
+            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
+                readContacts();
+            } else {
+                Toast.makeText(this, "请授予访问通讯录权限", Toast.LENGTH_SHORT).show();
+            }
+        }
+        if (requestCode==100){
+            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
+                readContacts();
+            } else {
+                Toast.makeText(this, "请授予拨打电话权限", Toast.LENGTH_SHORT).show();
+            }
+        }
+    }
+}
+
+

4)通过通讯录应用程序提供的内容提供器查询其数据

private void readContacts() {
+        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+                null, null, null, null)) {
+            if (cursor != null) {
+                while (cursor.moveToNext()) {
+                    String name = cursor.getString(cursor.getColumnIndex(
+                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
+                    String phone = cursor.getString(cursor.getColumnIndex(
+                            ContactsContract.CommonDataKinds.Phone.NUMBER));
+                    contactsList.add(new Person(name,phone));
+                }
+                adapter.notifyDataSetChanged();
+            }
+        } catch (Exception e) {
+            Log.d(TAG, "readContacts: "+e.getMessage());
+        }
+    }
+

5)编写ListView展示通讯录方法,把查询到的数据展示在页面

ContactPersonAdapter

package tk.dragondyt.study6;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.TextView;
+
+import java.util.List;
+
+/**
+ * @author dyt
+ */
+public class ContactPersonAdapter extends BaseAdapter {
+
+    /**定义数据*/
+    private final List<Person> mData;
+    /**定义Inflater,加载我们自定义的布局。*/
+    private final LayoutInflater mInflater;
+    private final Context context;
+
+  /**
+    定义构造器,在Activity创建对象Adapter的时候将数据data和Inflater传入自定义的Adapter中进行处理。
+    */
+    public ContactPersonAdapter(Context context,LayoutInflater inflater, List<Person> data){
+        mInflater = inflater;
+        mData = data;
+        this.context = context;
+    }
+
+    @Override
+    public int getCount() {
+        return mData.size();
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return position;
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View view, ViewGroup viewGroup) {
+        @SuppressLint("ViewHolder")
+        View item = mInflater.inflate(R.layout.list_item,null);
+        Person person = mData.get(position);
+        TextView name = item.findViewById(R.id.name);
+        TextView phone = item.findViewById(R.id.phone);
+        Button call = item.findViewById(R.id.call);
+        call.setOnClickListener((v)->{
+            Intent intentCall =  new Intent();
+            intentCall.setAction(Intent.ACTION_CALL);
+            intentCall.setData(Uri.parse("tel:" + person.getPhone()));
+            context.startActivity(intentCall);
+        });
+        name.setText(person.name);
+        phone.setText(person.phone);
+         return item ;
+    }
+}
+

Person

package tk.dragondyt.study6;
+
+/**
+ * @author dyt
+ */
+public class Person {
+    String name;
+    String phone;
+
+    public Person(String name, String phone) {
+        this.name = name;
+        this.phone = phone;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    @Override
+    public String toString() {
+        return "Person{" +
+                "name='" + name + '\'' +
+                ", phone='" + phone + '\'' +
+                '}';
+    }
+}
+
+

最后附上截图,最讨厌没图的教程。

运行截图

实验源码

评论数
+ + + diff --git a/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html b/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html new file mode 100644 index 0000000..4673ca5 --- /dev/null +++ b/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html @@ -0,0 +1,26 @@ + + + + + + + + + + 安卓开发学习--安装开发环境 | VuePress + + + + + + + +

安卓路线图

Android Stdio下载

网盘下载
官网下载

安装过程

一直点next就行了,注意一下几点:

  1. AS安装路径不能与sdk路径一样

安装路径配置

错误图片

  1. 安装目录不能是中文,如果安装目录是中文,AS会提示错误 ++Your SDK location contains non-ASCII characters++

Your SDK location contains non-ASCII characters

App运行方式

模拟器运行

模拟器运行图片
手机型号可以自己选,然后点next
手机选择
选择镜像(安卓版本),然后点next,后面配置可以不动,点Finish
安卓版本
完成图片
配置完成图片
启动图片
tip:模拟器默认安装在C盘,可以通过教程修改传送门

真机运行

插上安卓手机,打开usb调试打开方式,手机出现提示时点同意
usb调试授权

第一次写blog,不足之处多多见谅

评论数
+ + + diff --git a/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html b/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html new file mode 100644 index 0000000..76f40ef --- /dev/null +++ b/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html @@ -0,0 +1,37 @@ + + + + + + + + + + OpenGL环境测试 | VuePress + + + + + + + +

日志

2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: eglCreateContext: EGL_BAD_CONFIG: no ES 3 support
+2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: tid 6601: eglCreateContext(1682): error 0x3005 (EGL_BAD_CONFIG)
+2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/AndroidRuntime: FATAL EXCEPTION: GLThread 501
+    Process: com.example.opengl, PID: 6546
+    java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG
+        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1223)
+        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1214)
+        at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1064)
+        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1431)
+        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272)
+
+

估计是电脑没显卡导致的

评论数
+ + + diff --git a/8612fa7f/e255a10a/a87da565/589e13eb.html b/8612fa7f/e255a10a/a87da565/589e13eb.html new file mode 100644 index 0000000..7f9422c --- /dev/null +++ b/8612fa7f/e255a10a/a87da565/589e13eb.html @@ -0,0 +1,26 @@ + + + + + + + + + + 计算机网络第三章数据链路层答案 | VuePress + + + + + + + +

第三章 数据链路层

一、选择题

  1. 流量控制是为( C )所需要的。

A. 位错误   B. 发送方缓冲区溢出
  C. 接收方缓冲区溢出   D. 接收方与发送方之间冲突

  1. 在下列协议中,使用带位填充的首尾标志法组帧是( B )。

A. DDCMP   B. HDLC   C. BSC   D. SLIP

  1. PPP不同于HDLC协议,使用面向( B )的填充方式。

A. 比特   B. 字符   C. 透明传输   D. 帧

  1. 对于窗口大小为n的滑动窗口,最多可以有( C )帧已发送但没有确认。

A. 0   B. n-1   C. n   D. n+1

  1. 在滑动窗口流量控制(窗口大小为8)中,ACK3意味着接收方期待的下一帧是( B )号帧。

A. 2   B. 3   C. 4   D. 8

  1. PPP是Internet中使用的( C ),其功能对应于OSI参考模型的数据链路层。

A. 传输协议   B. 分组控制协议   C. 点到点协议   D. 报文控制协议

7. 下面不是数据链路层功能的是(D)。

A. 帧同步   B. 差错控制   C. 流量控制   D. 拥塞控制

8. 面向比特同步的帧数据段中出现位串01111101,则比特填充后输出是(A)。

A. 011111001   B. 001111101   C. 011111101   D. 011111010

9. PPP为实现透明传输在异步传输时采用(A),而同步传输采用(A)。

A. 字符填充法,比特填充法   B. 比特填充法,字符填充法
  C. 字符填充法,字节记数法   D. 比特填充法,比特填充法

10. 在数据通信中,当发送数据出现差错时,发送端无需进行数据重发的差错控制方法为(B)。

A. ARQ   B. FEC   C. 奇偶校验码   D. CRC

11. 已知循环冗余码生成多项式G(X)=x5+x4+x+1,若信息位10101100,则冗余码是(B)。

A. 01101   B.01100   C. 1101   D. 1100

12. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以(C)。

A. 检测出一位差错       B. 检测并纠正一位差错
  C. 检测出多位突发性差错   D. 检测并纠正多位突发性差错

  1. 若数据链路的发送窗口尺寸WT=4,在发送3号帧、并接到2号帧的确认帧后,发送方还可连续发送(B)。

A. 2帧   B. 3帧   C. 4帧   D. 1帧

14. 在回退N协议中,当帧序号为3比特,发送窗口的最大尺寸为(C)。

A. 5   B. 6   C. 7   D. 8

15. 在选择重传协议中,当帧的序号字段为3比特,且接受窗口与发送窗口尺寸相同时,发送窗口的最大尺寸为(B)。

A. 2   B. 4   C. 6   D. 8
16. 假定我们运行发送窗口大小为5和接收窗口大小为3的滑动窗口算法,并且在传输过程中不会发生分组失序的问题,帧序号的编码至少有(B)位。

A. 2   B. 3   C. 4   D. 5

17.无论是SLIP还是PPP协议都是(D)协议。

A.物理层 B 传输层 C网络层 D数据链路层

18.下列哪一项最好地描述了CRC的特征?(AB)
  A.逐个检查每一个字符

B.能检查出99%以上的差错

C.检查不出有偶数个位出错的差错

D.不如奇偶校验方法可靠

19.HDLC协议采用的帧同步方法是(A)。

A.使用比特填充的首尾标志法

B.使用字符填充的首尾定界符法

C.字节计数法

D.违法编码法

20.流量控制是数据链路层的基本功能之一,有关流量控制,下列说法中正确的是(C)。

A.只有数据链路层存在流量控制

B.不只是数据链路层存在流量控制,不过各层的流量控制对象都一样

C.不只是数据链路层存在流量控制,但是各层的流量控制对象都不一样

D.以上都不对

21.为了避免传输中帧的消失,数据链路层采用了(D)方法。

A.发送帧编上序号   B.循环冗余码
  C.海明码   D.计时器超时重发

22.下列不属于数据链路层功能的是(B)。

A.帧同步功能   B.电路管理功能
  C.差错控制功能   D.流量控制功能

23.流量控制实际上是对(A)的控制。

A.发送方数据流量   B.接收方数据流量
  C.发送,接受双方数据流量   D.链路上任意两结点间的数据流量

24.在数据帧中,当所传送的数据中出现控制字符时,就必须采取适当的措施,使接收方不至于将数据误认为是控制信息。这样才能保证数据链路层的传输是(A)的。

A.透明   B.面向连接   C.冗余   D.无连接
25.数据链路层采用后退N帧协议,发送方已经发送了编号为0~7的帧。

当及时器超时,若发送方只收到0,2,3号帧的确认,则要发送方重发的帧数是(C)
  A.2   B.3   C.4   D.5

26.计算机网络中各节点间采用©方式。

A.连续传输   B.总线传输   C.串行传输   D.并行传输

27.差错控制的基本方式有(多选)(AB)

A.检错反馈重发   B.前向纠错方式   C.奇偶校验码   D.方阵检验码

28.数据传输中的差错主要有(多选)(AD)

A.随机错   B.计算错   C.校验错   D.突发错

29.无论是SLIP还是PPP协议都是( B )协议。

(A)物理层  (B)数据链路层  ©网络层  (D)运输层

ps:不保证完全正确,仅用来偷懒

评论数
+ + + diff --git a/8612fa7f/e255a10a/a87da565/5eef9793.html b/8612fa7f/e255a10a/a87da565/5eef9793.html new file mode 100644 index 0000000..bf159c7 --- /dev/null +++ b/8612fa7f/e255a10a/a87da565/5eef9793.html @@ -0,0 +1,26 @@ + + + + + + + + + + 计算机网络第二章物理层课堂练习答案 | VuePress + + + + + + + +

第二章 物理层

一、 选择题

  1. 信号是数据在传输过程中的(A)的表现形式。
    A. 电信号 B. 代码 C. 信息 D. 程序
  2. 数据通信的任务是传输( D  )代码的比特序列。
    A. 十进制 B. 帧结构 C. 分组结构 D. 二进制
  3. ( B )信号的电平是连续变化的。
    A. 数字 B. 模拟 C. 脉冲 D. 二进制
  4. ( C)是指将数字信号转变成可以在电话线上传输的模拟信号的过程。
    A. 解调 B. 采样 C. 调制 D. 压缩
  5. 数据传输速率是指每秒钟传输构成数据二进制代码的(D )数。
    A. 码元 B. 信元 C. 波特 D. 位
  6. 利用模拟通信信道传输数据信号的方法称为( A )。
    A. 频带传输 B. 基带传输 C. 异步传输 D. 同步传输
  7. 基带传输是指在数字通信信道上( C )传输数字数据信号的方法。
    A. 调制 B. 脉冲编码 C. 直接 D. 间接
  8. 数据在通信信道传输的过程中,对数据传输的误码率影响最主要的因素是( D )。
    A. 传输速率 B. 调制解调器 C. 传输介质 D. 噪声强度
    9.Internet上的数据交换采用的是( A )。
    A. 分组交换 B. 电路交换 C. 报文交换 D. 光交换
  9. FDM是指( A )。
    A. 频分多路复用 B. 时分多路复用 C. 波分多路复用 D. 码分多路利用
  10. 利用( A ),数字数据可以用模拟信号来表示。
    A. 调制解调器 B. 编码解码器 C. 串联放大器 D. 电话网络
  11. 在数据通信系统中,传输介质的功能是( D )。
    A. 在信源与信宿之间传输信息 B.纠正传输过程中的错误
    C. 根据环境状况自动调整信号形式 D. 将信号从一端传至另一端
  12. 在光纤中采用的多路复用技术是( C )。
    A. 时分多路复用 B. 频分多路复用 C. 波分多路复用 D. 码分多路复用
  13. 为了实现长距离传输,模拟传输系统都使用放大器来使信号中的能量得到增加,其噪声分量( A )。
    A. 增大 B. 减小 C. 不变 D. 不一定
  14. “复用”是一种将若干个彼此独立的信号合并为一个可在同一信道上传输的( C )。
    A. 调制信号 B. 已调信号 C. 复用信号 D. 单边带信号
  15. 物理层4个重要特性:机械特性、功能特性、电气特性和(A)。
    A. 规程特性 B. 接口特性 C.协议特性 D. 物理特性
    17. 基带系统使用(C)进行传输的。
    A. 模拟信号 B. 调制信号 C. 数字信号 D. 载波信号
    18. 下列关于异步传输说法正确的是(D)。
    A. 一次传输一个数据块 B. 对时序的要求较高
    C. 收/发端不需要进行同步 D. 数据传输速率低
    19. 低通通道带宽为5KHz,编码采用512级分级信号,最大数据传输率(D)。
    A. 32 kbps B. 48 kbps C. 64 kbps D. 90 kbps
  16. 在宽带为8KHz的信道上,按奈奎斯特定理,每秒能发送的比特数不超过48kbps,则一个码元离散取值是(B)。
    A. 4 B. 8 C. 16 D. 24
    21. 在宽带为8KHz的信道上,如果8种不同的物理状态来表示数据,若信噪比S/N为30Db,按香农定理,最大限制的数据速率为(D)。
    A. 24 kbps B. 48 kbps C. 40 kbps D. 80kbps
    22. 在脉冲起始时刻,有无跳变来表示“0”和“1”,在脉冲中间时刻始终发生跳变的编码是(C)。
    A. 曼彻斯特编码 B. 非归零码 C. 差分曼彻斯特编码 D. 8B/10B
    23. 当数字信号在模拟传输系统中传送时,在发送端和接受端分别需要(A)。
    A. 调制器和解调器 B. 解调器和调制器
    C. 编码器和解码器 D. 解码器和编码器
    24.两台计算机利用电话线路传输数据信号时必备的设备是(A).
    A. 调制解调器 B. 网卡 C. 中继器 D. 集线器
    25. 当通信子网采用(B)方式时,我们首先要在通信双方之间建立起逻辑连接。
    A. 报文交换 B. 虚电路 C. 数据报 D. 电路交换
    26.不受电磁干扰或噪声影响的介质是(B)。
    A. 双绞线 B. 光纤 C. 同轴电缆 D. 微波
    27. 报文的内容不按顺序到达目的节点的是(D)方式。
    A. 电路交换 B. 报文交换 C.虚电路交换 D. 数据报交换
    28. 在中继系统中,中继器处于(A)。
    A. 物理层 B.数据链路层 C. 网络层 D. 高层
    29. 关于时延说法正确的是(C)。
    A. 发送时延=信道长度/电磁波在信道上的传播速度
    B. 传播时延=数据块长度/信道带宽
    C. 总时延=传播时延+发送时延+排队时延
    D. 提高链路带宽减小了数据的传播时延
    30. 下列说法错误的是(C)。
    A. 在虚电路方式中,信息从源节点传送到目的节点采用“存储转发”方式
    B. 在数据报方式中,信息从源节点传送到目的节点采用“存储转发”方式
    C. 电路交换比分组交换实时性好
    D. 报文交换方式适合交互式通信
    31.物理层传输的是(A)。
    A.原始比特 B.分组 C.信元 D.帧
    32.在电缆中采用屏蔽可以带来什么好处?(B)
    A.减少信号衰减 B.减少电磁干扰辐射
    C.减少物理损坏 D.减少电缆的阻抗
    33.调制解调技术主要用于(A)的通信方式中。
    A.模拟信道传输数字数据 B.模拟信道传输模拟数据
    C.数字信道传输数字数据 D.数字信道传输模拟数据
    34.下列说法中,哪一项是正确的?(C)
    A.虚电路与线路交换没有实质不同
    B.在通信的两个站点间只能建立一条虚电路
    C.虚电路有连接建立,数据传输,连接拆除3个阶段
    D.虚电路的各个结点需要为每个分组作路由选择判定
    35.当数字信号在模拟传输系统中传送时,在发送端和接收端分别需要(A)。
    A.调制器和解调器 B解调器和调制器
    C. 编码器和解码器 D解码器和编码器
    36.物理层的4个特性中,(B)规定了每种信号的电平,信号的脉冲宽度,允许的数据传输速率和最大传输距离。
    A.机械特性 B电气特性 C功能特性 D规程特性
    37.为了将数字信号传输得更远,可以采用的设备是(A)。
    A.中继器 B放大器 C网桥 D路由器
    38.在无噪声情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输率是(C)
    A.12kbps B.24kbps C.48kbps D.96kbps
    39.传递需进行调制编码。(B)
      A.数字数据在数字信道上 B.数字数据在模拟信道上
      C.模拟数据在数字信道上 D.模拟数据在模拟信道上
    40.数据传输速率公式:S= Tlog2N中,T的含义是。(B)
      A.单位脉冲幅度 B.单位脉冲宽度 C.调制速率 D.脉冲的有效值
    41.两个实体间数据传输和交换是(A)
      A.数据通信 B.数据控制 C.数据传输 D.信息交换
    42.在多数情况下,网络接口卡实现的功能处于。 (A)
      A.物理层协议和数据链路层协议 B.物理层协议和网络层协议
      C.数据链路层协议 D.网络层协议
    43.下列说法哪一个是正确的 (A)
      A、当码元的离散值个数N=2,则波特率等于比特率;
      B、600波特和600bps是一个意思;
      C、每秒传送l00个码元也就是每秒传送100个比特;
    D、每秒50波特的传输速率是很低的
    44.模拟通信系统中产生的调制信号一定是。(B)
      A.数字信号 B.连续信号 C.语音信号 D.离散信号
    45.用bps作单位的有(多选)(AC)
      A.位速率 B.波特率 C.数据传输率 D.误码率
    46.下列对基带传输和宽带传输的说法正确的是(多选) (AB)
      A.基带传输是将数据直接转换为脉冲信号加到电缆上传输出去
      B.宽带传输是将数据加到载波信号上传送出去
      C.基带传输采用“控制载波信号状态”的传输技术
      D.在通信中,依据数据流的方向可以分为基带传输和宽带传输
    47.下述哪个说法是正确的?(D)
      (A)细同轴电缆传输速率最高。
      (B) 光纤电缆支持电缆运行几十公里。
      © 屏蔽双绞线电缆对电磁干扰不敏感。
      (D) 以上说法都不对。
    48.下述哪一个电缆类型支持最大的电缆长度?©
      (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
    49.下述哪个说法是正确的?(D)
      (A)细同轴电缆传输速率最高。
      (B) 光纤电缆支持电缆运行几十公里。
      © 屏蔽双绞线电缆对电磁干扰不敏感。
      (D) 以上说法都不对。
    50.下述哪一个电缆类型支持最大的电缆长度?©
      (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
    ps:不保证完全正确,仅用来偷懒
评论数
+ + + diff --git a/8612fa7f/ec060e02/Hadoop/15d9e331.html b/8612fa7f/ec060e02/Hadoop/15d9e331.html new file mode 100644 index 0000000..2790a4b --- /dev/null +++ b/8612fa7f/ec060e02/Hadoop/15d9e331.html @@ -0,0 +1,212 @@ + + + + + + + + + + win10下hadoop学习 | VuePress + + + + + + + +

动漫美图

下载

下载hadoop

在这里插入图片描述

配置环境变量

在这里插入图片描述
path路径
在这里插入图片描述

配置文件

hadoop-3.2.2\etc\hadoop\core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<configuration>
+ <property>
+        <name>fs.defaultFS</name>
+        <value>hdfs://localhost:9000/</value>
+ </property>
+ <!-- 当前用户全设置成root -->
+<property>
+<name>hadoop.http.staticuser.user</name>
+<value>root</value>
+</property>
+
+<!-- 不开启权限检查 -->
+<property>
+<name>dfs.permissions.enabled</name>
+<value>false</value>
+</property>
+
+</configuration>
+
+

hadoop-3.2.2\etc\hadoop\hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<configuration>
+    <property>
+        <name>dfs.namenode.name.dir</name>
+        <value>/d:/DevTools/hadoop-3.2.2/data/namenode</value>
+        <description>NameNode directory for namespace and transaction logs storage.</description>
+    </property>
+    <property>
+        <name>dfs.datanode.data.dir</name>
+        <value>/d:/DevTools/hadoop-3.2.2/data/datanode</value>
+        <description>DataNode directory</description>
+    </property>
+    <property>
+        <name>dfs.replication</name>
+        <value>2</value>
+    </property>
+</configuration>
+
+

hadoop-3.2.2\etc\hadoop\mapred-site.xml

<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<configuration>
+    <property>
+        <name>mapreduce.framework.name</name>
+        <value>yarn</value>
+    </property>
+</configuration>
+
+

hadoop-3.2.2\etc\hadoop\yarn-site.xml

<?xml version="1.0"?>
+<configuration>
+<property>
+        <name>yarn.nodemanager.aux-services</name>
+        <value>mapreduce_shuffle</value>
+    </property>
+    <property>
+        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
+        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
+    </property>
+    <property>
+        <name>yarn.resourcemanager.hostname</name>
+        <value>localhost</value>
+    </property>
+</configuration>
+

缺失文件

在这里插入图片描述
github下载

遇到的问题

在这里插入图片描述

解决方案:安装DirectX修复工具增强版修复系统组件缺失,在C://Windows/System32目录下放置hadoop.dll

在这里插入图片描述

ps: 本来打算放弃的,win下的坑太多了,一顿瞎搞后终于成功了,还有点小问题

在这里插入图片描述

节点未格式化

执行

hdfs namenode  -format
+

输入Y
在这里插入图片描述

启动

执行命令或双击hadoop-3.2.2\sbin下的start-all.cmd

./start-all.cmd
+

访问8088

在这里插入图片描述

访问9000

It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.

访问9870(hadoop新版本默认)

在这里插入图片描述

关闭

执行命令或双击hadoop-3.2.2\sbin下的stop-all.cmd

./stop-all.cmd
+

开发时修改权限

core-site.xml

<!-- 当前用户全设置成root -->
+<property>
+<name>hadoop.http.staticuser.user</name>
+<value>root</value>
+</property>
+
+<!-- 不开启权限检查 -->
+<property>
+<name>dfs.permissions.enabled</name>
+<value>false</value>
+</property>
+
+

测试

环境准备

  1. 使用图形界面添加等会用的的目录
  2. 上传测试文件word,内容为
my name is abc, I can read abc.
+this is a demo for mapreduce
+I'm learning hadoop
+hadoop and mapreduce
+

在这里插入图片描述

代码编写

pom.xml

...
+        <!-- hadoop 依赖 -->
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-hdfs</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-client</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-mapreduce-client-core</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-common</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+...
+
package com.hadoop.demo.mapreduce;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mapreduce.Job;
+import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
+import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
+import java.io.IOException;
+public class MyJob {
+    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
+        //1 Configuration创建配置对象
+        Configuration cfg=new Configuration();
+        //2 getInstance创建job对象
+        Job job = Job.getInstance(cfg);
+        //3 set设置job,map,reduce类,map,reduce输出类
+        job.setJarByClass(MyJob.class);
+        job.setMapperClass(MyMap.class);
+        job.setReducerClass(MyReduce.class);
+        job.setOutputKeyClass(Text.class);
+        job.setOutputValueClass(IntWritable.class);
+        job.setMapOutputKeyClass(Text.class);
+        job.setMapOutputValueClass(IntWritable.class);
+        //4 FileInputFormat.addInputPath指定读取地址
+        FileInputFormat.addInputPath(job,new Path("hdfs://localhost:9000/wc/input"));
+        //5 FileOutputFormat.setOutputPath指定写入地址
+        FileOutputFormat.setOutputPath(job,new Path("hdfs://localhost:9000/wc/output"));
+        //6 waitForCompletion等待mapreduce完成
+        boolean flag = job.waitForCompletion(true);
+        //7 System.exit关闭系统
+        System.exit(flag?0:1);
+    }
+}
+
package com.hadoop.demo.mapreduce;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mapreduce.Mapper;
+import java.io.IOException;
+public class MyMap extends Mapper<LongWritable,Text,Text,IntWritable> {
+    private IntWritable count=new IntWritable(1);
+    private Text w=new Text();
+    @Override
+    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
+        //1 toString字符串转换
+        String line = value.toString();
+        //2 split分割单词
+        String[] words = line.split(" ");
+        //3 for遍历
+        for (String word:words){
+            //4 set转换Text
+            w.set(word);
+            //5 write写入
+            context.write(w,count);
+        }
+    }
+}
+
package com.hadoop.demo.mapreduce;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mapreduce.Reducer;
+import java.io.IOException;
+public class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
+    private IntWritable i=new IntWritable();
+    @Override
+    protected void reduce(Text word, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
+        //1 int计数器
+        int sum=0;
+        //2 for遍历value
+        for (IntWritable it:values){
+            //3 get转换int
+            sum +=it.get();
+        }
+        //4 set转换IntWritable
+        i.set(sum);
+        //5 write写入
+        context.write(word,i);
+    }
+}
+

运行main方法就可以了

在这里插入图片描述

运行结果

在这里插入图片描述
在这里插入图片描述

结语

个人感觉新版本对新手友好一下,HDFS WebUI 里可以上传文件,创建目录,2.7.1好像没有.

评论数
+ + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..957030d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +blog.dragondyt.top diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000..e2db9f2 Binary files /dev/null and b/android-chrome-192x192.png differ diff --git a/android-chrome-192x192.webp b/android-chrome-192x192.webp new file mode 100644 index 0000000..4a808aa Binary files /dev/null and b/android-chrome-192x192.webp differ diff --git a/android-chrome-256x256.png b/android-chrome-256x256.png new file mode 100644 index 0000000..f5d25cf Binary files /dev/null and b/android-chrome-256x256.png differ diff --git a/android-chrome-256x256.webp b/android-chrome-256x256.webp new file mode 100644 index 0000000..90eb4fd Binary files /dev/null and b/android-chrome-256x256.webp differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000..cfcced2 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/apple-touch-icon.webp b/apple-touch-icon.webp new file mode 100644 index 0000000..59de4f1 Binary files /dev/null and b/apple-touch-icon.webp differ diff --git a/assets/15d9e331.html-27f8bca1.js b/assets/15d9e331.html-27f8bca1.js new file mode 100644 index 0000000..4f16159 --- /dev/null +++ b/assets/15d9e331.html-27f8bca1.js @@ -0,0 +1,187 @@ +import{_ as t,o as e,c as a,e as o}from"./app-5c46a61a.js";const n={},r=o(`

动漫美图

下载

下载hadoop

在这里插入图片描述

配置环境变量

在这里插入图片描述
path路径
在这里插入图片描述

配置文件

hadoop-3.2.2\\etc\\hadoop\\core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<configuration>
+ <property>
+        <name>fs.defaultFS</name>
+        <value>hdfs://localhost:9000/</value>
+ </property>
+ <!-- 当前用户全设置成root -->
+<property>
+<name>hadoop.http.staticuser.user</name>
+<value>root</value>
+</property>
+
+<!-- 不开启权限检查 -->
+<property>
+<name>dfs.permissions.enabled</name>
+<value>false</value>
+</property>
+
+</configuration>
+
+

hadoop-3.2.2\\etc\\hadoop\\hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<configuration>
+    <property>
+        <name>dfs.namenode.name.dir</name>
+        <value>/d:/DevTools/hadoop-3.2.2/data/namenode</value>
+        <description>NameNode directory for namespace and transaction logs storage.</description>
+    </property>
+    <property>
+        <name>dfs.datanode.data.dir</name>
+        <value>/d:/DevTools/hadoop-3.2.2/data/datanode</value>
+        <description>DataNode directory</description>
+    </property>
+    <property>
+        <name>dfs.replication</name>
+        <value>2</value>
+    </property>
+</configuration>
+
+

hadoop-3.2.2\\etc\\hadoop\\mapred-site.xml

<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<configuration>
+    <property>
+        <name>mapreduce.framework.name</name>
+        <value>yarn</value>
+    </property>
+</configuration>
+
+

hadoop-3.2.2\\etc\\hadoop\\yarn-site.xml

<?xml version="1.0"?>
+<configuration>
+<property>
+        <name>yarn.nodemanager.aux-services</name>
+        <value>mapreduce_shuffle</value>
+    </property>
+    <property>
+        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
+        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
+    </property>
+    <property>
+        <name>yarn.resourcemanager.hostname</name>
+        <value>localhost</value>
+    </property>
+</configuration>
+

缺失文件

在这里插入图片描述
github下载

遇到的问题

在这里插入图片描述

解决方案:安装DirectX修复工具增强版修复系统组件缺失,在C://Windows/System32目录下放置hadoop.dll

在这里插入图片描述

ps: 本来打算放弃的,win下的坑太多了,一顿瞎搞后终于成功了,还有点小问题

在这里插入图片描述

节点未格式化

执行

hdfs namenode  -format
+

输入Y
在这里插入图片描述

启动

执行命令或双击hadoop-3.2.2\\sbin下的start-all.cmd

./start-all.cmd
+

访问8088

在这里插入图片描述

访问9000

It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.

访问9870(hadoop新版本默认)

在这里插入图片描述

关闭

执行命令或双击hadoop-3.2.2\\sbin下的stop-all.cmd

./stop-all.cmd
+

开发时修改权限

core-site.xml

<!-- 当前用户全设置成root -->
+<property>
+<name>hadoop.http.staticuser.user</name>
+<value>root</value>
+</property>
+
+<!-- 不开启权限检查 -->
+<property>
+<name>dfs.permissions.enabled</name>
+<value>false</value>
+</property>
+
+

测试

环境准备

  1. 使用图形界面添加等会用的的目录
  2. 上传测试文件word,内容为
my name is abc, I can read abc.
+this is a demo for mapreduce
+I'm learning hadoop
+hadoop and mapreduce
+

在这里插入图片描述

代码编写

pom.xml

...
+        <!-- hadoop 依赖 -->
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-hdfs</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-client</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-mapreduce-client-core</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-common</artifactId>
+            <version>2.10.0</version>
+        </dependency>
+...
+
package com.hadoop.demo.mapreduce;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mapreduce.Job;
+import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
+import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
+import java.io.IOException;
+public class MyJob {
+    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
+        //1 Configuration创建配置对象
+        Configuration cfg=new Configuration();
+        //2 getInstance创建job对象
+        Job job = Job.getInstance(cfg);
+        //3 set设置job,map,reduce类,map,reduce输出类
+        job.setJarByClass(MyJob.class);
+        job.setMapperClass(MyMap.class);
+        job.setReducerClass(MyReduce.class);
+        job.setOutputKeyClass(Text.class);
+        job.setOutputValueClass(IntWritable.class);
+        job.setMapOutputKeyClass(Text.class);
+        job.setMapOutputValueClass(IntWritable.class);
+        //4 FileInputFormat.addInputPath指定读取地址
+        FileInputFormat.addInputPath(job,new Path("hdfs://localhost:9000/wc/input"));
+        //5 FileOutputFormat.setOutputPath指定写入地址
+        FileOutputFormat.setOutputPath(job,new Path("hdfs://localhost:9000/wc/output"));
+        //6 waitForCompletion等待mapreduce完成
+        boolean flag = job.waitForCompletion(true);
+        //7 System.exit关闭系统
+        System.exit(flag?0:1);
+    }
+}
+
package com.hadoop.demo.mapreduce;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mapreduce.Mapper;
+import java.io.IOException;
+public class MyMap extends Mapper<LongWritable,Text,Text,IntWritable> {
+    private IntWritable count=new IntWritable(1);
+    private Text w=new Text();
+    @Override
+    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
+        //1 toString字符串转换
+        String line = value.toString();
+        //2 split分割单词
+        String[] words = line.split(" ");
+        //3 for遍历
+        for (String word:words){
+            //4 set转换Text
+            w.set(word);
+            //5 write写入
+            context.write(w,count);
+        }
+    }
+}
+
package com.hadoop.demo.mapreduce;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mapreduce.Reducer;
+import java.io.IOException;
+public class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
+    private IntWritable i=new IntWritable();
+    @Override
+    protected void reduce(Text word, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
+        //1 int计数器
+        int sum=0;
+        //2 for遍历value
+        for (IntWritable it:values){
+            //3 get转换int
+            sum +=it.get();
+        }
+        //4 set转换IntWritable
+        i.set(sum);
+        //5 write写入
+        context.write(word,i);
+    }
+}
+

运行main方法就可以了

在这里插入图片描述

运行结果

在这里插入图片描述
在这里插入图片描述

结语

个人感觉新版本对新手友好一下,HDFS WebUI 里可以上传文件,创建目录,2.7.1好像没有.

`,59),p=[r];function l(i,d){return e(),a("div",null,p)}const c=t(n,[["render",l],["__file","15d9e331.html.vue"]]);export{c as default}; diff --git a/assets/15d9e331.html-a77e6597.js b/assets/15d9e331.html-a77e6597.js new file mode 100644 index 0000000..9586b14 --- /dev/null +++ b/assets/15d9e331.html-a77e6597.js @@ -0,0 +1 @@ +const e=JSON.parse(`{"key":"v-0a4f90b1","path":"/8612fa7f/ec060e02/Hadoop/15d9e331.html","title":"win10下hadoop学习","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/ec060e02/Hadoop/15d9e331.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/ec060e02/Hadoop/15d9e331.html\\",\\"headline\\":\\"win10下hadoop学习\\",\\"name\\":\\"win10下hadoop学习\\",\\"datePublished\\":\\"2021-04-23\\",\\"dateModified\\":\\"2021-04-23\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/ec060e02/Hadoop/15d9e331.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"hadoop\\",\\"win10下hadoop学习\\"]}"]],"title":"win10下hadoop学习","tags":[{"name":"hadoop","path":"/tags/hadoop"}],"categories":[{"name":"大数据","path":"/categories/ec060e02"}],"keywords":["hadoop","win10下hadoop学习"],"date":"2021-04-23T21:55:57.000Z","abbrlink":"15d9e331","permalink":"/8612fa7f/ec060e02/Hadoop/15d9e331.html"},"headers":[{"level":1,"title":"下载","slug":"下载","link":"#下载","children":[]},{"level":1,"title":"配置环境变量","slug":"配置环境变量","link":"#配置环境变量","children":[]},{"level":1,"title":"配置文件","slug":"配置文件","link":"#配置文件","children":[]},{"level":1,"title":"缺失文件","slug":"缺失文件","link":"#缺失文件","children":[]},{"level":1,"title":"遇到的问题","slug":"遇到的问题","link":"#遇到的问题","children":[{"level":2,"title":"节点未格式化","slug":"节点未格式化","link":"#节点未格式化","children":[]}]},{"level":1,"title":"启动","slug":"启动","link":"#启动","children":[{"level":2,"title":"访问8088","slug":"访问8088","link":"#访问8088","children":[]},{"level":2,"title":"访问9000","slug":"访问9000","link":"#访问9000","children":[]},{"level":2,"title":"访问9870(hadoop新版本默认)","slug":"访问9870-hadoop新版本默认","link":"#访问9870-hadoop新版本默认","children":[]}]},{"level":1,"title":"关闭","slug":"关闭","link":"#关闭","children":[]},{"level":1,"title":"开发时修改权限","slug":"开发时修改权限","link":"#开发时修改权限","children":[]},{"level":1,"title":"测试","slug":"测试","link":"#测试","children":[{"level":2,"title":"环境准备","slug":"环境准备","link":"#环境准备","children":[]},{"level":2,"title":"代码编写","slug":"代码编写","link":"#代码编写","children":[]},{"level":2,"title":"运行结果","slug":"运行结果","link":"#运行结果","children":[]}]},{"level":1,"title":"结语","slug":"结语","link":"#结语","children":[]}]}`);export{e as data}; diff --git a/assets/2157fe1d.html-06c71e1d.js b/assets/2157fe1d.html-06c71e1d.js new file mode 100644 index 0000000..86b4fd1 --- /dev/null +++ b/assets/2157fe1d.html-06c71e1d.js @@ -0,0 +1 @@ +import{_ as r,r as i,o as h,c as d,d as l,w as n,e as a,a as t}from"./app-5c46a61a.js";const o={},c=a('

动漫美图

信息与文献基本知识

  未来学家托天勒把人类社会的发展过程划分为3个阶段:以农业经济为基础的农业社会;以工业经济为基础的工业社会;以信息经济为基础的信息社会。在信息社会中,信息资源已被人们公认为是物质、能量资源之后的人类可利用的第三类资源,是人类社会领域的基础性资源。

从信息到文献

信息(Information)

  美国数学家、控制论的主要奠基人维纳在1950年出版的《控制论与社会》中是这样来理解信息的:“人通过感觉器官感知周围世界”,“我们支配环境的命令就是给环境的一种信息”,因此,“信息就是我们在适应外部世界,并把这种适应反作用于外部世界的过程中,同外部世界进行交换的内容的名称”。

信息的定义:

  中国国家标准《情报与文献工作词汇一一基本术语》 (GB/T4894-1985)中信息的定义为:信息是物质存在的一种方式、形态或运动状态,也是事物的一种普遍属性,一般指数据、消息中所包含的意义,可以使消息中所描述事件的不确定性减少。

信息的基本属性:

(1)客观性。
(2)传递性。
(3)多态性。
(4)共享性。
(5)时效性。
(6)价值相对性。
(7)依附性。
(8)增长性。

知识(Knowledge)

  知识是人们在改造世界的实践中所获得的认识和经验的总和,是对客观世界物质形态和运动规律的认识。根据韦伯斯特(Webster)词典1997年的定义,知识是通过实践、研究、联系或调查获得的关于事物的事实和状态的认识,是对科学、艺术或技术的理解,是人类获得的关于真理和原理的认识的总和。

知识的定义

情报(Intelligence)

  情报是作为交流对象的有用的知识。“情报 是判断、意志、决心、行动需要的能指引方向的知识和智慧”;“情报是解决问题所需要的知识”;“情报是激活 了的知识”情报的基本属性是知识性、传递性和效用性。

情报的基本属性

(1) 知识性。一般而言,情报是一种新的知识。然而称为情报的知识
并不排斥时间上的“不新”。这就是说,凡原先不知道的(不论时间多久),而现在又迫切需要的知识,都属于“新”的知识。
(2) 传递性。情报传递的过程包括从情报源进行收集到向用户提供情报的全过程。无论多高深、渊博、新奇的知识,如果不记录、不传递、不交流,都不能称为情报。
(3) 效用性(判断的标准)。情报是一种有价值、有效用的知识。情报均须“有用”,当用户不需要时,百分之百的知识也不能把它称之为情报

文献(Literature/Document)

  国家标准《文献著录总则》(GB/T3792. 1-1983)给出的定义为:“文献是记录有知识的一切载体。”国家标准化组织IS0在《文献情报术语国际标准》(IS0/DIS5217)给出的定义是:“为了把人类知识传播开来和继承下去,人们用文字、图形、符号、音频、视频等手段将其记录下来,或写在纸上,或晒在蓝图上,或制在感光片上,或录到唱片上,或存储在磁盘上。这种附着在各种载体上的记录统称为文献。”

文献包括4个要素。

(1) 知识和信息,即文献的内容。
(2) 物质载体,如竹简、纸张、胶片、磁盘等,它是文献的外在形式。
(3) 记录知识和信息的符号,如文字、图表、声音、图像等。
(4) 记录的方式或手段,如书写、印刷、复制、录音、录像等,即将知识和信息固化到载体上的手段。

信息、知识、情报与文献

  我国图书情报学界对信息、知识、文献和情报的看法是:知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,当文献中记录的知识传递给用户,并为用户所利用时,文献中的知识就转化为情报。

信息的分类

  1. 按信息的内容划分
    科学技术信息
    社会科学信息
  2. 按产生信息的客体的性质来划分
    自然信息
    生物信息
    机器信息
    社会信息
  3. 按信息所依附的载体来划分
    文献信息
    口头信息

文献的分类

  1. 按照文献的加工层次分类
    零次文献(Zeroth Literature)
    一次文献(Primary Literature)
    二次文献(Secondary Literature)
    三次文献(Tertiary Literature)
  2. 按照文献的载体分类
    印刷型文献(Paper Literature)
    缩微型文献(Microform)
    电子型文献(Electronic iterature)
    音像型文献(Audio-Visual iterature)
  3. 按照文献的出版形式分类
    图书
    期刊
    报纸
    特种文献(学位论文、会议论文、专利文献、标准文献、科技报告、政府出版物、产品样本资料等)

信息检索基础

信息检索的原理

信息检索的概念

  广义的信息检索“Information Retrieval”是指将信息按照一定的方式组织和存储起来,并根据信息用户的需要揭示、查找、传递相关信息的过程,包括了信息的存储过程和查找过程。狭义的信息检索仅指信息的查找,是指从信息集合中找出用户所需要的有关信息的过程。狭义的信息检索包括3个方面的含义:了解用户的信息需求、信息检索的技术或方法、满足信息用户的需求。

信息检索的原理

  信息检索的基本原理就是在对信息进行整理排序形成检索工具的基础上,按照用户的要求利用检索工具或检索系统,将用户检索提问标识(检索词)与已形成的或存储在系统中的信息的存储标识(文献特征标识、标引词)进行匹配比较,若取得一致,则为匹配,即达到了用户的检索需求,如图1.1所示。

',34),b=t("img",{src:"http://www.zhixing123.cn/uploads/allimg/130825/1_130825003450_1.png",alt:"信息检索原理图"},null,-1),s=a('

信息检索的类型

  1. 按信息存储和检索的内容分类
    文献检索
    数据检索
    事实检索
  2. 按照检索系统中信息的组织方式分类
    全文检索
    多媒体检索
  3. 按照信息存储的载体和实现查找的技术手段分类
    手工检索
    机械检索
    计算机检索

信息检索的工具

  信息检索工具是指为检索需要而组织的文献检索系统,它是收集、加工标引、组织文献的结果,是检索工作赖以生存的手段和条件,包含目录、索引、文摘等。

典型的检索工具组成

  1. 主体:即检索工具的主要部分,由所收录文献的著录部分组成,是文献储存与检索的实体。其包含文献的内部特征与文献的外部特征。
  2. 辅助索引:是在文献检索工作中,从主体部分的文献款目编排系统以外的角度增加检索途径、扩大检索效果的辅助手段,它不能离开检索工具的主体单独存在。
  3. 使用说明:向用户介绍本检索工具的性质、内容范围、收录年限、读者对象、著录方法、分类体系、检索方法等,帮助用户利用检索工具。
目录
目录的定义

  目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

目录的著录款目

目录的著录包括如下款目。
(1) 书名(刊名)项。
(2) 著者(编者)项。
(3) 出版项:包括出版地点、出版者、出版期、版次等。
(4) 稽核项:包括页数、图表、开本、装订形式、定价等。
(5) 附注项:对上述各项的补充或说明。
(6) 提要项:内容简介。
(7) 业务注记:指图书馆或保存单位在目录上做的业务记载,包括索取号、登录号、分类号、主题词、存储地点等。

索引
索引的定义

  索引是将报刊书籍中某些重要的或有意义的信息,如书名、刊名篇名、主题、人名、地名等分别摘录出来,按一定方式编排,并注明出处,以供检索的工具。

索引的作用

  索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

常用索引

(1) 主题索引
(2) 分类索引
(3) 著者索引
(4) 其他:单位索引(或团体著者索引)、化学分子式索引、引用刊物索引、出版单位索引等。

文摘
文摘定义

  我国国家标准GB3468——83定义文摘为“除题录部分外还对文献内容作实质性描述的文献条目称文摘”。

文摘作用

(1) 帮助读者快速判断文献内容
(2) 节省阅读时间
(3) 减少语言障碍
(4) 替代原文

检索工具类型
  1. 按信息加工的手段或设备划分
    手工检索工具
    机械检索工具
    计算机检索工具
  2. 按编制方法划分
    目录型检索工具
    题录型检索工具
    文摘型检索工具
    索引型检索工具
  3. 按信息载体形态划分
    书本式检索工具
    卡片式检索工具
    缩微式检索工具
    磁性材料式检索工具
  4. 按收录范围划分
    综合性检索
    综合性检系
    专科性检索工具
    专题性检索工具
    全面性检索工具
    单一性检索工具
  5. 按时间范围划分
    预告性检索工具
    现期通报性检索工具
    回溯性检索工具

信息检索的意义

  1. 掌握获取知识的捷径,提高信息利用的效率
  2. 提高信息素质,培养终身学习的能力
  3. 科学研究的向导,科技查新的基础

信息检索的途径

  根据信息的基本特征,可以把信息检索途径分为外部特征检索途径(题名途径、著者途径、引文途径等)和内容特征检索途径(分类途径、主题途径等)两大类。

外部特征途径

  1. 题名途径:刊名、书名、篇名等
  2. 著者途径:作者、编者、译者、专利权人、出版机构等
  3. 引文途径: 其他途径:专利号、报告号、合同号、标准号、国际标准书号和刊号等

内容特征途径

  1. 分类途径:是指按照文献所属学科(专业)属性(类别)进行检索的途径。
  2. 主题途径:是按照文献信息的主题内容进行检索的途径,利用主题词、关键词、叙词,并按字顺排列实现检索。

信息检索的步骤和方法

信息检索的步骤

信息检索的方法

  1. 顺查法:指按照时间的顺序,由远及近地利用检索系统进行文献信息检索的方法。
  2. 逆查法:是由近及远地查找,逆着时间的顺序利用检索工具进行文献信息检索的方法。
  3. 抽查法:是针对检索课题的特点,选择有关该课题的文献信息最可能出现或最多出现的时间段,利用检索工具进行重点检索的方法。
  4. 追溯法(引文法) :是指利用已经掌握的文献末尾所列的参考文献,进行逐一追溯查找“引文”的一种最简便的扩大情报来源的方法。
  5. 综合法:又称循环法,这是把上述方法加以综合运用的方法。

计算机信息检索基础

计算机信息检索概述

计算机信息检索的特点

(1) 速度快。
(2) 检索范围广。
(3) 检索不受时空的限制。
(4) 及时。
(5) 界面友好。
(6) 超文本检索。

计算机信息检索分类

(1) 脱机检索
(2) 联机检索
(3) 网络检索

计算机信息检索技术

  计算机检索系统常采用一些运算方法,从概念相关性、位置相关性等方面对检索提问进行技术处理。

  1. 检索词的选择
    检索式由检索词和检索算符组成。
    检索词分为两类:受控词和非受控词。
  2. 布尔逻辑检索
    将多个检索词用布尔运算符(简称检索算符)组合在一起来进行检索,称之为布尔逻辑检索。
    系统使用的检索算符一般有以下几种:
    (1) 逻辑与
    (2) 逻辑或
    (3) 逻辑非

光盘检索

光盘检索的特点主要有以下几个。

  1. 检索途径多。其可提供内容、著者、关键词、标题、著者单位、年代、出处等多种检索途径。
  2. 检索系统配置简单。利用微机系统建立光盘检索系统只要一台光盘驱动器和所需要的盘片,不需经过通信线路。
  3. 检索费用低廉。由于光盘的费用是一次性投入,可够次任意使用,利用率越高,分摊的成本越低。
  4. 系统操作简单。光盘数据库一般都具备类似联机检索那样齐全的检索和输出功能,同时提供人机对话,系统界面友好。

网络检索

网络检索具有如下特点:

  1. 检索速度快。手工检索需数周的课题计算机检索只需数小时或数分钟。
  2. 检索途径多。除手工检索工具的分类、主题、著者等检索途径之外,网络检索往往还提供更多更灵活的检索途径,如文本词途径。
  3. 更新快。网上信息很多为为更新。
  4. 范围广。网上数据库的种类更为广泛和丰富,有些可免费进行
  5. 检索用词的选择及其组配更为灵活。检索策略的制定更为灵活和复杂,可利用各种讦算机检索技术随意扩天或缩小检索范围以满足用户各种不同的信息检索需求。
  6. 检索结果可直接打印或下载,可操作性强。

思考题:

简述信息、知识、文献的概念,及三者之间的关系。

  知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,

信息检索的目的和意义

  1. 掌握获取知识的捷径,提高信息利用的效率
  2. 提高信息素质,培养终身学习的能力
  3. 科学研究的向导,科技查新的基础

检索工具的结构构成是什么?

  1. 目录
  2. 索引
  3. 文摘

目录在检索中起什么作用?

  目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

索引在检索中起什么作用?

  索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

文摘在检索中起什么作用?

(1) 帮助读者快速判断文献内容
(2) 节省阅读时间
(3) 减少语言障碍
(4) 替代原文

简述国内外主要分类法。

中国图书分类法

  1. 中国人民大学图书馆图书分类法。简称人大法新中国成立后的第一部分类法,1954年出第一版,1996年出第六版。4大部类、17个基本大类。总结科学,社会科学,自然科学,综合性科学、综合性图书。
  2. 中国科学院图书馆图书分类法
  3. 中国图书资料分类法
  4. 中国档案分类法

外国图书分类法

  1. 杜威十进分类法(Dewey Decimal Classification &Relative Index,DDC)是世界上流传最广、影响最大的一部文献分类法,它开创了文献分类法的新纪元,是外国文献分类法发展史上一个重要里程碑。
  2. 国际十进分类法
  3. 美国国会图书馆分类法
  4. 冒号分类法
  5. 布利斯书目分类法

操作题:

题目:

利用《中国图书馆图书分类法》找出分类号。

检索目的:

掌握《中国图书馆图书分类法》的基本构成特点。

检索要求:

按照基本大类,在《中国图书馆图书分类法》中查找以下相关类目编号。

  1. 计算机技术:国际互联网

TP393.4

  1. 交通运输:运输线路优选

U116.2

  1. 环境科学:环境污染的控制及其排除

X506

  1. 食品工业:淀粉加工工艺

TS234

  1. 文化、科学:图书馆工作者

G251.6

',87);function u(p,f){const e=i("center");return h(),d("div",null,[c,l(e,null,{default:n(()=>[b]),_:1}),s])}const _=r(o,[["render",u],["__file","2157fe1d.html.vue"]]);export{_ as default}; diff --git a/assets/2157fe1d.html-9fef4a27.js b/assets/2157fe1d.html-9fef4a27.js new file mode 100644 index 0000000..604b185 --- /dev/null +++ b/assets/2157fe1d.html-9fef4a27.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-174701eb","path":"/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html","title":"信息检索-绪论","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html\\",\\"headline\\":\\"信息检索-绪论\\",\\"name\\":\\"信息检索-绪论\\",\\"datePublished\\":\\"2020-05-06\\",\\"dateModified\\":\\"2020-05-06\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"信息检索\\",\\"dyt\\",\\"dragondyt\\",\\"论文写作\\",\\"信息\\",\\"知识\\",\\"文献\\",\\"目录\\",\\"索引\\",\\"文摘\\",\\"检索途径\\"]}"]],"title":"信息检索-绪论","tags":[{"name":"信息检索","path":"/tags/d3ee0f4f"}],"categories":[{"name":"信息检索","path":"/categories/d3ee0f4f"}],"keywords":["信息检索","dyt","dragondyt","论文写作","信息","知识","文献","目录","索引","文摘","检索途径"],"date":"2020-05-06T21:55:57.000Z","abbrlink":"2157fe1d","permalink":"/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html"},"headers":[{"level":2,"title":"信息与文献基本知识","slug":"信息与文献基本知识","link":"#信息与文献基本知识","children":[]},{"level":2,"title":"信息检索基础","slug":"信息检索基础","link":"#信息检索基础","children":[]},{"level":2,"title":"信息检索的途径","slug":"信息检索的途径","link":"#信息检索的途径","children":[]},{"level":2,"title":"信息检索的步骤和方法","slug":"信息检索的步骤和方法","link":"#信息检索的步骤和方法","children":[]},{"level":2,"title":"计算机信息检索基础","slug":"计算机信息检索基础","link":"#计算机信息检索基础","children":[]},{"level":2,"title":"思考题:","slug":"思考题","link":"#思考题","children":[]},{"level":2,"title":"操作题:","slug":"操作题","link":"#操作题","children":[]}]}`);export{t as data}; diff --git a/assets/29596f0c.html-20bdad68.js b/assets/29596f0c.html-20bdad68.js new file mode 100644 index 0000000..a8abce7 --- /dev/null +++ b/assets/29596f0c.html-20bdad68.js @@ -0,0 +1,13 @@ +import{_ as e,o as a,c,e as r}from"./app-5c46a61a.js";const s={},n=r(`

动漫美图

安装elasticsearch(简称es)

拉取镜像,该命令拉取最新版(不推荐,最新版意味着踩坑)

docker pull elasticsearch
+

可以指定版本,查看elasticsearch版本

docker pull elasticsearch:x.x.x
+

执行docker pull elasticsearch
尝试运行

docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:latest
+

response from daemon: Conflict. The container name "/elasticsearch" is already in use by container "06a80d721428c762abcb750f5a5f48a947c4714e3f9e6637e10792b4f4fa5a02". You have to remove (or rename) that container to be able to reuse that name
查看所有容器

docker ps -a
+

解决方法

  1. 删除容器,重新创建
docker rm containerId|names
+

image.png
发送GET请求,校验是否安装成功

curl localhost:9200
+

curl localhost:9200
2. 重新启动之前的容器

docker start containerId|names
+

安装可视化控件(kibana,elasticsearch-head…)

这里选择kibana,颜值就是正义,在docker中安装kibana官方文档

需要指定版本,该版本与es一致

docker pull docker.elastic.co/kibana/kibana:7.6.2
+

 response from daemon: manifest for docker.elastic.co/kibana/kibana:latest not found: manifest unknown: manifest unknown
+
运行kibana

docker run --link elasticsearch:elasticsearch -p 5601:5601 --name kibana -d docker.elastic.co/kibana/kibana:7.6.2
+

测试

 curl localhost:5601/status
+

出现kibana server is not ready yet
查看日志

docker logs -f containerId
+

image.png
完了掉坑里了,下次再写了顺便补上docker-compose部署

`,28),t=[n];function o(l,i){return a(),c("div",null,t)}const d=e(s,[["render",o],["__file","29596f0c.html.vue"]]);export{d as default}; diff --git a/assets/29596f0c.html-a7ddfb8b.js b/assets/29596f0c.html-a7ddfb8b.js new file mode 100644 index 0000000..4ccd930 --- /dev/null +++ b/assets/29596f0c.html-a7ddfb8b.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-b46656c2","path":"/8612fa7f/8f8103b7/Docker/29596f0c.html","title":"在docker安装elasticsearch","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/8f8103b7/Docker/29596f0c.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/8f8103b7/Docker/29596f0c.html\\",\\"headline\\":\\"在docker安装elasticsearch\\",\\"name\\":\\"在docker安装elasticsearch\\",\\"datePublished\\":\\"2020-04-29\\",\\"dateModified\\":\\"2020-04-29\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/8f8103b7/Docker/29596f0c.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"java\\",\\"dyt\\",\\"dragondyt\\",\\"elasticsearch\\",\\"docker\\"]}"]],"title":"在docker安装elasticsearch","tags":[{"name":"docker","path":"/tags/docker"}],"categories":[{"name":"教程","path":"/categories/1868f51e"}],"keywords":["java","dyt","dragondyt","elasticsearch","docker"],"date":"2020-04-29T21:55:57.000Z","abbrlink":"29596f0c","permalink":"/8612fa7f/8f8103b7/Docker/29596f0c.html"},"headers":[{"level":2,"title":"安装elasticsearch(简称es)","slug":"安装elasticsearch-简称es","link":"#安装elasticsearch-简称es","children":[]},{"level":2,"title":"安装可视化控件(kibana,elasticsearch-head…)","slug":"安装可视化控件-kibana-elasticsearch-head","link":"#安装可视化控件-kibana-elasticsearch-head","children":[]}]}`);export{t as data}; diff --git a/assets/2a1f0504.html-11f2c670.js b/assets/2a1f0504.html-11f2c670.js new file mode 100644 index 0000000..fb4ff4e --- /dev/null +++ b/assets/2a1f0504.html-11f2c670.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-4339b5be","path":"/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html","title":"[21]合并两个有序链表","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html\\",\\"headline\\":\\"[21]合并两个有序链表\\",\\"name\\":\\"[21]合并两个有序链表\\",\\"datePublished\\":\\"2022-07-28\\",\\"dateModified\\":\\"2022-07-28\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[21]合并两个有序链表","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"}],"date":"2022-07-28 15:58:04","abbrlink":"2a1f0504","permalink":"/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html"},"headers":[]}`);export{t as data}; diff --git a/assets/2a1f0504.html-5c7ea01b.js b/assets/2a1f0504.html-5c7ea01b.js new file mode 100644 index 0000000..256a0ca --- /dev/null +++ b/assets/2a1f0504.html-5c7ea01b.js @@ -0,0 +1,32 @@ +import{_ as e,o as t,c as p,a as n}from"./app-5c46a61a.js";const l={},s=n("pre",null,[n("code",{class:"language-java"},`class Solution { + public ListNode mergeTwoLists(ListNode list1, ListNode list2) { + // 虚拟头结点 + ListNode dummy = new ListNode(-1), p = dummy; + ListNode p1 = l1, p2 = l2; + + while (p1 != null && p2 != null) { + // 比较 p1 和 p2 两个指针 + // 将值较小的的节点接到 p 指针 + if (p1.val > p2.val) { + p.next = p2; + p2 = p2.next; + } else { + p.next = p1; + p1 = p1.next; + } + // p 指针不断前进 + p = p.next; + } + + if (p1 != null) { + p.next = p1; + } + + if (p2 != null) { + p.next = p2; + } + + return dummy.next; + } +} +`)],-1),o=[s];function a(i,c){return t(),p("div",null,o)}const u=e(l,[["render",a],["__file","2a1f0504.html.vue"]]);export{u as default}; diff --git a/assets/2cf49dc6.html-049b4a75.js b/assets/2cf49dc6.html-049b4a75.js new file mode 100644 index 0000000..1d1efc7 --- /dev/null +++ b/assets/2cf49dc6.html-049b4a75.js @@ -0,0 +1,29 @@ +import{_ as e,o as t,c as s,a as n}from"./app-5c46a61a.js";const o={},l=n("pre",null,[n("code",{class:"language-java"},`class Solution { + public ListNode mergeKLists(ListNode[] lists) { + if (lists.length == 0) return null; + // 虚拟头结点 + ListNode dummy = new ListNode(-1); + ListNode p = dummy; + // 优先级队列,最小堆 + PriorityQueue pq = new PriorityQueue<>( + lists.length, (a, b)->(a.val - b.val)); + // 将 k 个链表的头结点加入最小堆 + for (ListNode head : lists) { + if (head != null) + pq.add(head); + } + + while (!pq.isEmpty()) { + // 获取最小节点,接到结果链表中 + ListNode node = pq.poll(); + p.next = node; + if (node.next != null) { + pq.add(node.next); + } + // p 指针不断前进 + p = p.next; + } + return dummy.next; + } +} +`)],-1),d=n("p",null,"总结:优先级队列",-1),i=[l,d];function a(c,r){return t(),s("div",null,i)}const p=e(o,[["render",a],["__file","2cf49dc6.html.vue"]]);export{p as default}; diff --git a/assets/2cf49dc6.html-4bb1a3d6.js b/assets/2cf49dc6.html-4bb1a3d6.js new file mode 100644 index 0000000..01516fd --- /dev/null +++ b/assets/2cf49dc6.html-4bb1a3d6.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-3e64061e","path":"/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html","title":"[23]合并K个升序链表","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html\\",\\"headline\\":\\"[23]合并K个升序链表\\",\\"name\\":\\"[23]合并K个升序链表\\",\\"datePublished\\":\\"2022-07-28\\",\\"dateModified\\":\\"2022-07-28\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[23]合并K个升序链表","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"}],"date":"2022-07-28 16:10:15","abbrlink":"2cf49dc6","permalink":"/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html"},"headers":[]}`);export{t as data}; diff --git a/assets/36462e02.html-2409ae54.js b/assets/36462e02.html-2409ae54.js new file mode 100644 index 0000000..c3845ba --- /dev/null +++ b/assets/36462e02.html-2409ae54.js @@ -0,0 +1,34 @@ +import{_ as e,o as t,c as s,a as n}from"./app-5c46a61a.js";const i={},a=n("pre",null,[n("code",{class:"language-java"},`/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode removeNthFromEnd(ListNode head, int n) { + //删除倒数第N个,那我怎么知道N的位置,链表长度不是固定的 + //假设是1到x,那么第倒数第N个应该是 X - N + 1 + //Y = X - N + 1 ,则 + // 虚拟头结点 + ListNode pre = new ListNode(0); + pre.next = head; + ListNode start = pre, end = pre; + // p1 先走 n 步 + while (n != 0) { + start = start.next; + n--; + } + // p1 和 p2 同时走 x - n 步,当p1走完时,p2走了 x-n步,停在X - N + 1上 + while (start.next != null) { + start = start.next; + end = end.next; + } + end.next = end.next.next; + return pre.next; + } +} +`)],-1),o=[a];function l(r,d){return t(),s("div",null,o)}const x=e(i,[["render",l],["__file","36462e02.html.vue"]]);export{x as default}; diff --git a/assets/36462e02.html-8063d2f3.js b/assets/36462e02.html-8063d2f3.js new file mode 100644 index 0000000..c8b95aa --- /dev/null +++ b/assets/36462e02.html-8063d2f3.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-124fddb4","path":"/8612fa7f/b7e144d1/2362a8ea/36462e02.html","title":"[19]删除链表的倒数第 N 个结点","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/36462e02.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/36462e02.html\\",\\"headline\\":\\"[19]删除链表的倒数第 N 个结点\\",\\"name\\":\\"[19]删除链表的倒数第 N 个结点\\",\\"datePublished\\":\\"2022-08-03\\",\\"dateModified\\":\\"2022-08-03\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/36462e02.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[19]删除链表的倒数第 N 个结点","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"}],"date":"2022-08-03 15:19:58","abbrlink":"36462e02","permalink":"/8612fa7f/b7e144d1/2362a8ea/36462e02.html"},"headers":[]}`);export{t as data}; diff --git a/assets/3758805c.html-6c4a5950.js b/assets/3758805c.html-6c4a5950.js new file mode 100644 index 0000000..f0e700c --- /dev/null +++ b/assets/3758805c.html-6c4a5950.js @@ -0,0 +1,31 @@ +import{_ as e,o as t,c as o,a as n}from"./app-5c46a61a.js";const p={},s=n("pre",null,[n("code",{class:"language-java"},`class Solution { + public ListNode partition(ListNode head, int x) { + // 存放小于 x 的链表的虚拟头结点 + ListNode dummy1 = new ListNode(-1); + // 存放大于等于 x 的链表的虚拟头结点 + ListNode dummy2 = new ListNode(-1); + // p1, p2 指针负责生成结果链表 + ListNode p1 = dummy1, p2 = dummy2; + // p 负责遍历原链表,类似合并两个有序链表的逻辑 + // 这里是将一个链表分解成两个链表 + ListNode p = head; + while (p != null) { + if (p.val >= x) { + p2.next = p; + p2 = p2.next; + } else { + p1.next = p; + p1 = p1.next; + } + // 断开原链表中的每个节点的 next 指针 + ListNode temp = p.next; + p.next = null; + p = temp; + } + // 连接两个链表 + p1.next = dummy2.next; + + return dummy1.next; + } +} +`)],-1),d=[s];function i(l,a){return t(),o("div",null,d)}const m=e(p,[["render",i],["__file","3758805c.html.vue"]]);export{m as default}; diff --git a/assets/3758805c.html-b9824761.js b/assets/3758805c.html-b9824761.js new file mode 100644 index 0000000..00d878a --- /dev/null +++ b/assets/3758805c.html-b9824761.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-28dbf2be","path":"/8612fa7f/b7e144d1/2362a8ea/3758805c.html","title":"[86]分隔链表","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/3758805c.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/3758805c.html\\",\\"headline\\":\\"[86]分隔链表\\",\\"name\\":\\"[86]分隔链表\\",\\"datePublished\\":\\"2022-07-28\\",\\"dateModified\\":\\"2022-07-28\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/3758805c.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[86]分隔链表","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"}],"date":"2022-07-28 15:58:04","abbrlink":"3758805c","permalink":"/8612fa7f/b7e144d1/2362a8ea/3758805c.html"},"headers":[]}`);export{t as data}; diff --git a/assets/389d18c2.html-952307de.js b/assets/389d18c2.html-952307de.js new file mode 100644 index 0000000..4cc9bf9 --- /dev/null +++ b/assets/389d18c2.html-952307de.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-bb3d14f0","path":"/8612fa7f/b7e144d1/2362a8ea/389d18c2.html","title":"[160]相交链表","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/389d18c2.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/389d18c2.html\\",\\"headline\\":\\"[160]相交链表\\",\\"name\\":\\"[160]相交链表\\",\\"datePublished\\":\\"2022-08-04\\",\\"dateModified\\":\\"2022-08-04\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/389d18c2.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[160]相交链表","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"},{"name":"双指针","path":"/tags/91a7e4d1"}],"date":"2022-08-04 10:20:55","abbrlink":"389d18c2","permalink":"/8612fa7f/b7e144d1/2362a8ea/389d18c2.html"},"headers":[]}`);export{t as data}; diff --git a/assets/389d18c2.html-ff81f812.js b/assets/389d18c2.html-ff81f812.js new file mode 100644 index 0000000..e2de23b --- /dev/null +++ b/assets/389d18c2.html-ff81f812.js @@ -0,0 +1,22 @@ +import{_ as n,o as t,c as s,a as e}from"./app-5c46a61a.js";const o={},a=e("pre",null,[e("code",{class:"language-java"},`public class Solution { + public ListNode getIntersectionNode(ListNode headA, ListNode headB) { + // p1 指向 A 链表头结点,p2 指向 B 链表头结点 + ListNode p1 = headA, p2 = headB; + while (p1 != p2) { + // p1 走一步,如果走到 A 链表末尾,转到 B 链表 + if (p1 == null) { + p1 = headB; + } else { + p1 = p1.next; + } + // p2 走一步,如果走到 B 链表末尾,转到 A 链表 + if (p2 == null) { + p2 = headA; + } else { + p2 = p2.next; + } + } + return p1; + } +} +`)],-1),c=[a];function l(p,d){return t(),s("div",null,c)}const _=n(o,[["render",l],["__file","389d18c2.html.vue"]]);export{_ as default}; diff --git a/assets/404.html-54df78f4.js b/assets/404.html-54df78f4.js new file mode 100644 index 0000000..a18c44a --- /dev/null +++ b/assets/404.html-54df78f4.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-3706649a","path":"/404.html","title":"","lang":"en-US","frontmatter":{"layout":"NotFound","head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/404.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/404.html\\",\\"headline\\":\\"\\",\\"name\\":\\"\\",\\"datePublished\\":\\"0000-00-00\\",\\"dateModified\\":\\"0000-00-00\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/404.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]]},"headers":[]}`);export{t as data}; diff --git a/assets/404.html-683716ce.js b/assets/404.html-683716ce.js new file mode 100644 index 0000000..6156fac --- /dev/null +++ b/assets/404.html-683716ce.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as t}from"./app-5c46a61a.js";const _={};function o(r,n){return c(),t("div")}const a=e(_,[["render",o],["__file","404.html.vue"]]);export{a as default}; diff --git a/assets/49af668f.html-4f108862.js b/assets/49af668f.html-4f108862.js new file mode 100644 index 0000000..23c352c --- /dev/null +++ b/assets/49af668f.html-4f108862.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-65e4fc7a","path":"/8612fa7f/e00fc567/5ac6f809/49af668f.html","title":"一个bug","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/49af668f.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/49af668f.html\\",\\"headline\\":\\"一个bug\\",\\"name\\":\\"一个bug\\",\\"datePublished\\":\\"2020-03-14\\",\\"dateModified\\":\\"2020-03-14\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/49af668f.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"java\\",\\"dyt\\",\\"dragondyt\\",\\"BigDecimal\\",\\"Integer\\",\\"java.math.BigDecimal cannot be cast to java.lang.Integer\\"]}"]],"title":"一个bug","tags":[{"name":"安卓","path":"/tags/e00fc567"}],"categories":[{"name":"bug","path":"/categories/bug"}],"keywords":["java","dyt","dragondyt","BigDecimal","Integer","java.math.BigDecimal cannot be cast to java.lang.Integer"],"date":"2020-03-14T21:55:57.000Z","abbrlink":"49af668f","permalink":"/8612fa7f/e00fc567/5ac6f809/49af668f.html"},"headers":[{"level":2,"title":"一个让人烦躁的bug","slug":"一个让人烦躁的bug","link":"#一个让人烦躁的bug","children":[]}]}`);export{t as data}; diff --git a/assets/49af668f.html-6cc33c8c.js b/assets/49af668f.html-6cc33c8c.js new file mode 100644 index 0000000..bfc1f88 --- /dev/null +++ b/assets/49af668f.html-6cc33c8c.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,e as n}from"./app-5c46a61a.js";const i={},l=n('

动漫美图

一个让人烦躁的bug

  今天写代码,一个简单的查询,总是出现++java.math.BigDecimal cannot be cast to java.lang.Integer++,项目是热部署的,以为是缓存,清除一遍又一遍还是无效。我试着用toString方法转字符串然后转int,结果出现了异常,但是注释掉的代码可以运行

转换异常,看不出哪里有异常转换,我也有点好奇Map<String, Integer>是怎么变成Map<String, BigDecimal>的。
类型变化
我手动写了一个Map<String, Integer>尝试放入一个BigDecimal,结果编译失败了!

编译失败

查询使用了mybatis3.2.6框架(不是plus), resultType=“java.util.Map”
下面是sql

select MONTH(日期) as month,SUM(amount) AS total FROM `销售` where YEAR(日期) = #{year} GROUP BY MONTH(日期);\n
',7),r=[l];function s(c,o){return e(),a("div",null,r)}const g=t(i,[["render",s],["__file","49af668f.html.vue"]]);export{g as default}; diff --git a/assets/589e13eb.html-4d1c0041.js b/assets/589e13eb.html-4d1c0041.js new file mode 100644 index 0000000..8d521f4 --- /dev/null +++ b/assets/589e13eb.html-4d1c0041.js @@ -0,0 +1 @@ +import{_ as p,o as C,c as B,e as A}from"./app-5c46a61a.js";const l={},D=A('

第三章 数据链路层

一、选择题

  1. 流量控制是为( C )所需要的。

A. 位错误   B. 发送方缓冲区溢出
  C. 接收方缓冲区溢出   D. 接收方与发送方之间冲突

  1. 在下列协议中,使用带位填充的首尾标志法组帧是( B )。

A. DDCMP   B. HDLC   C. BSC   D. SLIP

  1. PPP不同于HDLC协议,使用面向( B )的填充方式。

A. 比特   B. 字符   C. 透明传输   D. 帧

  1. 对于窗口大小为n的滑动窗口,最多可以有( C )帧已发送但没有确认。

A. 0   B. n-1   C. n   D. n+1

  1. 在滑动窗口流量控制(窗口大小为8)中,ACK3意味着接收方期待的下一帧是( B )号帧。

A. 2   B. 3   C. 4   D. 8

  1. PPP是Internet中使用的( C ),其功能对应于OSI参考模型的数据链路层。

A. 传输协议   B. 分组控制协议   C. 点到点协议   D. 报文控制协议

7. 下面不是数据链路层功能的是(D)。

A. 帧同步   B. 差错控制   C. 流量控制   D. 拥塞控制

8. 面向比特同步的帧数据段中出现位串01111101,则比特填充后输出是(A)。

A. 011111001   B. 001111101   C. 011111101   D. 011111010

9. PPP为实现透明传输在异步传输时采用(A),而同步传输采用(A)。

A. 字符填充法,比特填充法   B. 比特填充法,字符填充法
  C. 字符填充法,字节记数法   D. 比特填充法,比特填充法

10. 在数据通信中,当发送数据出现差错时,发送端无需进行数据重发的差错控制方法为(B)。

A. ARQ   B. FEC   C. 奇偶校验码   D. CRC

11. 已知循环冗余码生成多项式G(X)=x5+x4+x+1,若信息位10101100,则冗余码是(B)。

A. 01101   B.01100   C. 1101   D. 1100

12. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以(C)。

A. 检测出一位差错       B. 检测并纠正一位差错
  C. 检测出多位突发性差错   D. 检测并纠正多位突发性差错

  1. 若数据链路的发送窗口尺寸WT=4,在发送3号帧、并接到2号帧的确认帧后,发送方还可连续发送(B)。

A. 2帧   B. 3帧   C. 4帧   D. 1帧

14. 在回退N协议中,当帧序号为3比特,发送窗口的最大尺寸为(C)。

A. 5   B. 6   C. 7   D. 8

15. 在选择重传协议中,当帧的序号字段为3比特,且接受窗口与发送窗口尺寸相同时,发送窗口的最大尺寸为(B)。

A. 2   B. 4   C. 6   D. 8
16. 假定我们运行发送窗口大小为5和接收窗口大小为3的滑动窗口算法,并且在传输过程中不会发生分组失序的问题,帧序号的编码至少有(B)位。

A. 2   B. 3   C. 4   D. 5

17.无论是SLIP还是PPP协议都是(D)协议。

A.物理层 B 传输层 C网络层 D数据链路层

18.下列哪一项最好地描述了CRC的特征?(AB)
  A.逐个检查每一个字符

B.能检查出99%以上的差错

C.检查不出有偶数个位出错的差错

D.不如奇偶校验方法可靠

19.HDLC协议采用的帧同步方法是(A)。

A.使用比特填充的首尾标志法

B.使用字符填充的首尾定界符法

C.字节计数法

D.违法编码法

20.流量控制是数据链路层的基本功能之一,有关流量控制,下列说法中正确的是(C)。

A.只有数据链路层存在流量控制

B.不只是数据链路层存在流量控制,不过各层的流量控制对象都一样

C.不只是数据链路层存在流量控制,但是各层的流量控制对象都不一样

D.以上都不对

21.为了避免传输中帧的消失,数据链路层采用了(D)方法。

A.发送帧编上序号   B.循环冗余码
  C.海明码   D.计时器超时重发

22.下列不属于数据链路层功能的是(B)。

A.帧同步功能   B.电路管理功能
  C.差错控制功能   D.流量控制功能

23.流量控制实际上是对(A)的控制。

A.发送方数据流量   B.接收方数据流量
  C.发送,接受双方数据流量   D.链路上任意两结点间的数据流量

24.在数据帧中,当所传送的数据中出现控制字符时,就必须采取适当的措施,使接收方不至于将数据误认为是控制信息。这样才能保证数据链路层的传输是(A)的。

A.透明   B.面向连接   C.冗余   D.无连接
25.数据链路层采用后退N帧协议,发送方已经发送了编号为0~7的帧。

当及时器超时,若发送方只收到0,2,3号帧的确认,则要发送方重发的帧数是(C)
  A.2   B.3   C.4   D.5

26.计算机网络中各节点间采用©方式。

A.连续传输   B.总线传输   C.串行传输   D.并行传输

27.差错控制的基本方式有(多选)(AB)

A.检错反馈重发   B.前向纠错方式   C.奇偶校验码   D.方阵检验码

28.数据传输中的差错主要有(多选)(AD)

A.随机错   B.计算错   C.校验错   D.突发错

29.无论是SLIP还是PPP协议都是( B )协议。

(A)物理层  (B)数据链路层  ©网络层  (D)运输层

ps:不保证完全正确,仅用来偷懒

',67),t=[D];function e(r,o){return C(),B("div",null,t)}const a=p(l,[["render",e],["__file","589e13eb.html.vue"]]);export{a as default}; diff --git a/assets/589e13eb.html-ccdb7b95.js b/assets/589e13eb.html-ccdb7b95.js new file mode 100644 index 0000000..490ef6d --- /dev/null +++ b/assets/589e13eb.html-ccdb7b95.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-12caed67","path":"/8612fa7f/e255a10a/a87da565/589e13eb.html","title":"计算机网络第三章数据链路层答案","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/589e13eb.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/589e13eb.html\\",\\"headline\\":\\"计算机网络第三章数据链路层答案\\",\\"name\\":\\"计算机网络第三章数据链路层答案\\",\\"description\\":\\"用来偷懒的答案\\",\\"datePublished\\":\\"2020-03-16\\",\\"dateModified\\":\\"2020-03-16\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/589e13eb.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"计算机网络作业\\",\\"数据链路层课堂练习\\",\\"秦时明月的博客\\",\\"dyt\\",\\"dragondyt\\"]}"]],"title":"计算机网络第三章数据链路层答案","tags":[{"name":"计算机网络","path":"/tags/e255a10a"}],"categories":[{"name":"计算机网络","path":"/categories/e255a10a"}],"description":"用来偷懒的答案","notShow":true,"keywords":["计算机网络作业","数据链路层课堂练习","秦时明月的博客","dyt","dragondyt"],"date":"2020-03-16T19:22:27.000Z","abbrlink":"589e13eb","permalink":"/8612fa7f/e255a10a/a87da565/589e13eb.html"},"headers":[{"level":2,"title":"第三章 数据链路层","slug":"第三章-数据链路层","link":"#第三章-数据链路层","children":[]}]}`);export{t as data}; diff --git a/assets/5eef9793.html-dd485dea.js b/assets/5eef9793.html-dd485dea.js new file mode 100644 index 0000000..d324d71 --- /dev/null +++ b/assets/5eef9793.html-dd485dea.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-5b013ee8","path":"/8612fa7f/e255a10a/a87da565/5eef9793.html","title":"计算机网络第二章物理层课堂练习答案","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/5eef9793.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/5eef9793.html\\",\\"headline\\":\\"计算机网络第二章物理层课堂练习答案\\",\\"name\\":\\"计算机网络第二章物理层课堂练习答案\\",\\"description\\":\\"用来偷懒的答案\\",\\"datePublished\\":\\"2020-03-15\\",\\"dateModified\\":\\"2020-03-15\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/5eef9793.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"计算机网络\\",\\"物理层课堂练习\\",\\"秦时明月的博客\\",\\"dyt\\",\\"dragondyt\\"]}"]],"title":"计算机网络第二章物理层课堂练习答案","tags":[{"name":"计算机网络","path":"/tags/e255a10a"}],"categories":[{"name":"计算机网络","path":"/categories/e255a10a"}],"description":"用来偷懒的答案","notShow":true,"comments":false,"keywords":["计算机网络","物理层课堂练习","秦时明月的博客","dyt","dragondyt"],"date":"2020-03-15T19:22:27.000Z","abbrlink":"5eef9793","permalink":"/8612fa7f/e255a10a/a87da565/5eef9793.html"},"headers":[{"level":2,"title":"第二章 物理层","slug":"第二章-物理层","link":"#第二章-物理层","children":[]}]}`);export{t as data}; diff --git a/assets/5eef9793.html-edf9c100.js b/assets/5eef9793.html-edf9c100.js new file mode 100644 index 0000000..7ea5a3c --- /dev/null +++ b/assets/5eef9793.html-edf9c100.js @@ -0,0 +1 @@ +import{_ as r,o as b,c as A,e as B}from"./app-5c46a61a.js";const D={},C=B('

第二章 物理层

一、 选择题

  1. 信号是数据在传输过程中的(A)的表现形式。
    A. 电信号 B. 代码 C. 信息 D. 程序
  2. 数据通信的任务是传输( D  )代码的比特序列。
    A. 十进制 B. 帧结构 C. 分组结构 D. 二进制
  3. ( B )信号的电平是连续变化的。
    A. 数字 B. 模拟 C. 脉冲 D. 二进制
  4. ( C)是指将数字信号转变成可以在电话线上传输的模拟信号的过程。
    A. 解调 B. 采样 C. 调制 D. 压缩
  5. 数据传输速率是指每秒钟传输构成数据二进制代码的(D )数。
    A. 码元 B. 信元 C. 波特 D. 位
  6. 利用模拟通信信道传输数据信号的方法称为( A )。
    A. 频带传输 B. 基带传输 C. 异步传输 D. 同步传输
  7. 基带传输是指在数字通信信道上( C )传输数字数据信号的方法。
    A. 调制 B. 脉冲编码 C. 直接 D. 间接
  8. 数据在通信信道传输的过程中,对数据传输的误码率影响最主要的因素是( D )。
    A. 传输速率 B. 调制解调器 C. 传输介质 D. 噪声强度
    9.Internet上的数据交换采用的是( A )。
    A. 分组交换 B. 电路交换 C. 报文交换 D. 光交换
  9. FDM是指( A )。
    A. 频分多路复用 B. 时分多路复用 C. 波分多路复用 D. 码分多路利用
  10. 利用( A ),数字数据可以用模拟信号来表示。
    A. 调制解调器 B. 编码解码器 C. 串联放大器 D. 电话网络
  11. 在数据通信系统中,传输介质的功能是( D )。
    A. 在信源与信宿之间传输信息 B.纠正传输过程中的错误
    C. 根据环境状况自动调整信号形式 D. 将信号从一端传至另一端
  12. 在光纤中采用的多路复用技术是( C )。
    A. 时分多路复用 B. 频分多路复用 C. 波分多路复用 D. 码分多路复用
  13. 为了实现长距离传输,模拟传输系统都使用放大器来使信号中的能量得到增加,其噪声分量( A )。
    A. 增大 B. 减小 C. 不变 D. 不一定
  14. “复用”是一种将若干个彼此独立的信号合并为一个可在同一信道上传输的( C )。
    A. 调制信号 B. 已调信号 C. 复用信号 D. 单边带信号
  15. 物理层4个重要特性:机械特性、功能特性、电气特性和(A)。
    A. 规程特性 B. 接口特性 C.协议特性 D. 物理特性
    17. 基带系统使用(C)进行传输的。
    A. 模拟信号 B. 调制信号 C. 数字信号 D. 载波信号
    18. 下列关于异步传输说法正确的是(D)。
    A. 一次传输一个数据块 B. 对时序的要求较高
    C. 收/发端不需要进行同步 D. 数据传输速率低
    19. 低通通道带宽为5KHz,编码采用512级分级信号,最大数据传输率(D)。
    A. 32 kbps B. 48 kbps C. 64 kbps D. 90 kbps
  16. 在宽带为8KHz的信道上,按奈奎斯特定理,每秒能发送的比特数不超过48kbps,则一个码元离散取值是(B)。
    A. 4 B. 8 C. 16 D. 24
    21. 在宽带为8KHz的信道上,如果8种不同的物理状态来表示数据,若信噪比S/N为30Db,按香农定理,最大限制的数据速率为(D)。
    A. 24 kbps B. 48 kbps C. 40 kbps D. 80kbps
    22. 在脉冲起始时刻,有无跳变来表示“0”和“1”,在脉冲中间时刻始终发生跳变的编码是(C)。
    A. 曼彻斯特编码 B. 非归零码 C. 差分曼彻斯特编码 D. 8B/10B
    23. 当数字信号在模拟传输系统中传送时,在发送端和接受端分别需要(A)。
    A. 调制器和解调器 B. 解调器和调制器
    C. 编码器和解码器 D. 解码器和编码器
    24.两台计算机利用电话线路传输数据信号时必备的设备是(A).
    A. 调制解调器 B. 网卡 C. 中继器 D. 集线器
    25. 当通信子网采用(B)方式时,我们首先要在通信双方之间建立起逻辑连接。
    A. 报文交换 B. 虚电路 C. 数据报 D. 电路交换
    26.不受电磁干扰或噪声影响的介质是(B)。
    A. 双绞线 B. 光纤 C. 同轴电缆 D. 微波
    27. 报文的内容不按顺序到达目的节点的是(D)方式。
    A. 电路交换 B. 报文交换 C.虚电路交换 D. 数据报交换
    28. 在中继系统中,中继器处于(A)。
    A. 物理层 B.数据链路层 C. 网络层 D. 高层
    29. 关于时延说法正确的是(C)。
    A. 发送时延=信道长度/电磁波在信道上的传播速度
    B. 传播时延=数据块长度/信道带宽
    C. 总时延=传播时延+发送时延+排队时延
    D. 提高链路带宽减小了数据的传播时延
    30. 下列说法错误的是(C)。
    A. 在虚电路方式中,信息从源节点传送到目的节点采用“存储转发”方式
    B. 在数据报方式中,信息从源节点传送到目的节点采用“存储转发”方式
    C. 电路交换比分组交换实时性好
    D. 报文交换方式适合交互式通信
    31.物理层传输的是(A)。
    A.原始比特 B.分组 C.信元 D.帧
    32.在电缆中采用屏蔽可以带来什么好处?(B)
    A.减少信号衰减 B.减少电磁干扰辐射
    C.减少物理损坏 D.减少电缆的阻抗
    33.调制解调技术主要用于(A)的通信方式中。
    A.模拟信道传输数字数据 B.模拟信道传输模拟数据
    C.数字信道传输数字数据 D.数字信道传输模拟数据
    34.下列说法中,哪一项是正确的?(C)
    A.虚电路与线路交换没有实质不同
    B.在通信的两个站点间只能建立一条虚电路
    C.虚电路有连接建立,数据传输,连接拆除3个阶段
    D.虚电路的各个结点需要为每个分组作路由选择判定
    35.当数字信号在模拟传输系统中传送时,在发送端和接收端分别需要(A)。
    A.调制器和解调器 B解调器和调制器
    C. 编码器和解码器 D解码器和编码器
    36.物理层的4个特性中,(B)规定了每种信号的电平,信号的脉冲宽度,允许的数据传输速率和最大传输距离。
    A.机械特性 B电气特性 C功能特性 D规程特性
    37.为了将数字信号传输得更远,可以采用的设备是(A)。
    A.中继器 B放大器 C网桥 D路由器
    38.在无噪声情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输率是(C)
    A.12kbps B.24kbps C.48kbps D.96kbps
    39.传递需进行调制编码。(B)
      A.数字数据在数字信道上 B.数字数据在模拟信道上
      C.模拟数据在数字信道上 D.模拟数据在模拟信道上
    40.数据传输速率公式:S= Tlog2N中,T的含义是。(B)
      A.单位脉冲幅度 B.单位脉冲宽度 C.调制速率 D.脉冲的有效值
    41.两个实体间数据传输和交换是(A)
      A.数据通信 B.数据控制 C.数据传输 D.信息交换
    42.在多数情况下,网络接口卡实现的功能处于。 (A)
      A.物理层协议和数据链路层协议 B.物理层协议和网络层协议
      C.数据链路层协议 D.网络层协议
    43.下列说法哪一个是正确的 (A)
      A、当码元的离散值个数N=2,则波特率等于比特率;
      B、600波特和600bps是一个意思;
      C、每秒传送l00个码元也就是每秒传送100个比特;
    D、每秒50波特的传输速率是很低的
    44.模拟通信系统中产生的调制信号一定是。(B)
      A.数字信号 B.连续信号 C.语音信号 D.离散信号
    45.用bps作单位的有(多选)(AC)
      A.位速率 B.波特率 C.数据传输率 D.误码率
    46.下列对基带传输和宽带传输的说法正确的是(多选) (AB)
      A.基带传输是将数据直接转换为脉冲信号加到电缆上传输出去
      B.宽带传输是将数据加到载波信号上传送出去
      C.基带传输采用“控制载波信号状态”的传输技术
      D.在通信中,依据数据流的方向可以分为基带传输和宽带传输
    47.下述哪个说法是正确的?(D)
      (A)细同轴电缆传输速率最高。
      (B) 光纤电缆支持电缆运行几十公里。
      © 屏蔽双绞线电缆对电磁干扰不敏感。
      (D) 以上说法都不对。
    48.下述哪一个电缆类型支持最大的电缆长度?©
      (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
    49.下述哪个说法是正确的?(D)
      (A)细同轴电缆传输速率最高。
      (B) 光纤电缆支持电缆运行几十公里。
      © 屏蔽双绞线电缆对电磁干扰不敏感。
      (D) 以上说法都不对。
    50.下述哪一个电缆类型支持最大的电缆长度?©
      (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
    ps:不保证完全正确,仅用来偷懒
',3),l=[C];function i(e,s){return b(),A("div",null,l)}const p=r(D,[["render",i],["__file","5eef9793.html.vue"]]);export{p as default}; diff --git a/assets/69a9925d.html-14f67bc6.js b/assets/69a9925d.html-14f67bc6.js new file mode 100644 index 0000000..97cdbaf --- /dev/null +++ b/assets/69a9925d.html-14f67bc6.js @@ -0,0 +1,27 @@ +import{_ as e,o as t,c as s,a as n}from"./app-5c46a61a.js";const l={},a=n("pre",null,[n("code",{class:"language-java"},`/** + * Definition for singly-linked list. + * class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ +public class Solution { + public boolean hasCycle(ListNode head) { + ListNode fast = head, slow = head; + // 快指针走到末尾时停止 + while (fast != null && fast.next != null) { + slow = slow.next; + fast = fast.next.next; + // 快慢指针相遇,说明含有环 + if (slow == fast) { + return true; + } + } + return false; + } +} +`)],-1),o=[a];function i(c,d){return t(),s("div",null,o)}const f=e(l,[["render",i],["__file","69a9925d.html.vue"]]);export{f as default}; diff --git a/assets/69a9925d.html-792e5ae6.js b/assets/69a9925d.html-792e5ae6.js new file mode 100644 index 0000000..424dcb0 --- /dev/null +++ b/assets/69a9925d.html-792e5ae6.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-905b9eea","path":"/8612fa7f/b7e144d1/2362a8ea/69a9925d.html","title":"[141]环形链表","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/69a9925d.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/69a9925d.html\\",\\"headline\\":\\"[141]环形链表\\",\\"name\\":\\"[141]环形链表\\",\\"datePublished\\":\\"2022-08-03\\",\\"dateModified\\":\\"2022-08-03\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/69a9925d.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[141]环形链表","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"},{"name":"快慢指针","path":"/tags/76495b47"}],"date":"2022-08-03 15:57:27","abbrlink":"69a9925d","permalink":"/8612fa7f/b7e144d1/2362a8ea/69a9925d.html"},"headers":[]}`);export{t as data}; diff --git a/assets/6d80ff7f.html-548940fd.js b/assets/6d80ff7f.html-548940fd.js new file mode 100644 index 0000000..498b30d --- /dev/null +++ b/assets/6d80ff7f.html-548940fd.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-2a6e24b9","path":"/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html","title":"[876]链表的中间结点","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html\\",\\"headline\\":\\"[876]链表的中间结点\\",\\"name\\":\\"[876]链表的中间结点\\",\\"datePublished\\":\\"2022-08-03\\",\\"dateModified\\":\\"2022-08-03\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[876]链表的中间结点","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"}],"date":"2022-08-03 15:44:27","abbrlink":"6d80ff7f","permalink":"/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html"},"headers":[]}`);export{t as data}; diff --git a/assets/6d80ff7f.html-5c35da4b.js b/assets/6d80ff7f.html-5c35da4b.js new file mode 100644 index 0000000..5aaa8a6 --- /dev/null +++ b/assets/6d80ff7f.html-5c35da4b.js @@ -0,0 +1,26 @@ +import{_ as e,o as t,c as s,a as n}from"./app-5c46a61a.js";const l={},a=n("pre",null,[n("code",{class:"language-java"},`/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode middleNode(ListNode head) { + //简单的话应该是循环一遍,获取长度,如果是偶数则长度加一,然后获取中点,再循环一次 + // 快慢指针初始化指向 head + ListNode slow = head, fast = head; + // 快指针走到末尾时停止 + while (fast != null && fast.next != null) { + // 慢指针走一步,快指针走两步 + slow = slow.next; + fast = fast.next.next; + } + // 慢指针指向中点 + return slow; + } +} +`)],-1),o=[a];function i(d,c){return t(),s("div",null,o)}const _=e(l,[["render",i],["__file","6d80ff7f.html.vue"]]);export{_ as default}; diff --git a/assets/74684463.html-21bb8fa5.js b/assets/74684463.html-21bb8fa5.js new file mode 100644 index 0000000..44ca880 --- /dev/null +++ b/assets/74684463.html-21bb8fa5.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-67bb3c93","path":"/8612fa7f/47867b98/Flutter/74684463.html","title":"AAPT: error: resource android:attr/fontVariationSettings not found","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"踩坑\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7cf68d8\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"flutter\\",\\"item\\":\\"https://blog.dragondyt.top/categories/flutter\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Flutter/74684463.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Flutter/74684463.html\\",\\"headline\\":\\"AAPT: error: resource android:attr/fontVariationSettings not found\\",\\"name\\":\\"AAPT: error: resource android:attr/fontVariationSettings not found\\",\\"datePublished\\":\\"2020-05-09\\",\\"dateModified\\":\\"2020-05-09\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Flutter/74684463.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"AAPT: error: resource android:attr/fontVariationSettings not found\\"]}"]],"title":"AAPT: error: resource android:attr/fontVariationSettings not found","tags":[{"name":"吐槽","path":"/tags/62f4a42b"},{"name":"flutter","path":"/tags/flutter"}],"categories":[{"name":"踩坑","path":"/categories/b7cf68d8"},{"name":"flutter","path":"/categories/flutter"}],"keywords":["AAPT: error: resource android:attr/fontVariationSettings not found"],"date":"2020-05-09T10:54:35.000Z","abbrlink":"74684463","permalink":"/8612fa7f/47867b98/Flutter/74684463.html"},"headers":[{"level":2,"title":"心累,每天都是“惊喜”,我太菜了","slug":"心累-每天都是-惊喜-我太菜了","link":"#心累-每天都是-惊喜-我太菜了","children":[]}]}`);export{t as data}; diff --git a/assets/74684463.html-c0ecf027.js b/assets/74684463.html-c0ecf027.js new file mode 100644 index 0000000..b8a172e --- /dev/null +++ b/assets/74684463.html-c0ecf027.js @@ -0,0 +1,43 @@ +import{_ as e,o as n,c as o,e as r}from"./app-5c46a61a.js";const t={},a=r(`

动漫美图

心累,每天都是“惊喜”,我太菜了

环境
开发工具 idea

flutter doctor
+
+D:\\Android\\flutter\\bin\\flutter.bat doctor --verbose
+[√] Flutter (Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.18363.815], locale zh-CN)
+    • Flutter version 1.17.0 at D:\\Android\\flutter
+    • Framework revision e6b34c2b5c (7 days ago), 2020-05-02 11:39:18 -0700
+    • Engine revision 540786dd51
+    • Dart version 2.8.1
+
+[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
+    • Android SDK at D:\\Android\\android-sdk
+    • Platform android-29, build-tools 29.0.3
+    • ANDROID_HOME = D:\\Android\\android-sdk
+    • Java binary at: D:\\Program Files\\Java\\jdk1.8.0_241\\bin\\java
+    • Java version Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
+    • All Android licenses accepted.
+
+[!] Android Studio (not installed)
+    • Android Studio not found; download from https://developer.android.com/studio/index.html
+      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).
+
+[√] Connected device (1 available)
+    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26) (emulator)
+
+! Doctor found issues in 1 category.
+Process finished with exit code 0
+

Could not find androidx.lifecycle:lifecycle-common:2.2.0,lifecycle-common-java8:2.2.0,lifecycle-runtime:2.2.0,androidx.fragment:fragment:1.1.0.,androidx.annotation:annotation:1.1.0.
解决方法:

allprojects {
+    repositories {
+        google() 
+        jcenter()
+        maven { url "https://maven.google.com" }//感觉google()是假的,这里我用了阿里云镜像,可能没同步吧。
+    }
+}
+

.gradleachesransforms-1iles-1.1ore-1.1.0.aarb817d4a7e2a888884c999547cadccefesaluesalues.xml:7:5-70: AAPT: error: resource android:attr/fontVariationSettings not found.AAPT: error: resource android:attr/ttcIndex not found

stackoverflow上解决方法

解决方法:
修改app下的build.gradle文件

android {
+    compileSdkVersion 28
+    defaultConfig {
+	...
+        targetSdkVersion 28
+	...
+    }
+    ...
+}
+

stackoverflow真是个好东西,可惜要翻墙,感想上面的大神。
不写了,累,这种资料网站都要墙,真是丧心病狂,什么时候能不用镜像站。构建工具再好,巧妇难为无米之炊啊

`,11),d=[a];function i(s,l){return n(),o("div",null,d)}const u=e(t,[["render",i],["__file","74684463.html.vue"]]);export{u as default}; diff --git a/assets/76a66db0.html-691d3a71.js b/assets/76a66db0.html-691d3a71.js new file mode 100644 index 0000000..f51373d --- /dev/null +++ b/assets/76a66db0.html-691d3a71.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-e9d2e9e4","path":"/8612fa7f/b7e144d1/340249a9/76a66db0.html","title":"[2073]买票需要的时间","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"二叉树\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1/e85d694a\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/340249a9/76a66db0.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/340249a9/76a66db0.html\\",\\"headline\\":\\"[2073]买票需要的时间\\",\\"name\\":\\"[2073]买票需要的时间\\",\\"datePublished\\":\\"2022-08-04\\",\\"dateModified\\":\\"2022-08-04\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/340249a9/76a66db0.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[2073]买票需要的时间","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"二叉树","path":"/categories/b7e144d1/e85d694a"}],"tags":[{"name":"队列","path":"/tags/b6c47025"},{"name":"数组","path":"/tags/340249a9"}],"date":"2022-08-04 09:48:19","abbrlink":"76a66db0","permalink":"/8612fa7f/b7e144d1/340249a9/76a66db0.html"},"headers":[]}`);export{t as data}; diff --git a/assets/76a66db0.html-bdbcb783.js b/assets/76a66db0.html-bdbcb783.js new file mode 100644 index 0000000..395949c --- /dev/null +++ b/assets/76a66db0.html-bdbcb783.js @@ -0,0 +1,14 @@ +import{_ as e,o as n,c as i,a as t}from"./app-5c46a61a.js";const c={},s=t("pre",null,[t("code",{class:"language-java"},`class Solution { + public int timeRequiredToBuy(int[] tickets, int k) { + int ret = 0; + for (int i = 0; i < tickets.length; i++) { + if (i <= k) { + ret = ret + Math.min(tickets[i], tickets[k]); + } else { + ret = ret + Math.min(tickets[i], tickets[k] - 1); + } + } + return ret; + } +} +`)],-1),r=[s];function a(o,l){return n(),i("div",null,r)}const k=e(c,[["render",a],["__file","76a66db0.html.vue"]]);export{k as default}; diff --git a/assets/77c5fdb1.html-0bd7b0da.js b/assets/77c5fdb1.html-0bd7b0da.js new file mode 100644 index 0000000..827b84b --- /dev/null +++ b/assets/77c5fdb1.html-0bd7b0da.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-a4e6871e","path":"/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html","title":"[230]二叉搜索树中第K小的元素","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"二叉树\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1/e85d694a\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html\\",\\"headline\\":\\"[230]二叉搜索树中第K小的元素\\",\\"name\\":\\"[230]二叉搜索树中第K小的元素\\",\\"datePublished\\":\\"2022-07-20\\",\\"dateModified\\":\\"2022-07-20\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[230]二叉搜索树中第K小的元素","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"二叉树","path":"/categories/b7e144d1/e85d694a"}],"tags":[{"name":"二叉树","path":"/tags/e85d694a"}],"date":"2022-07-20 14:24:17","abbrlink":"77c5fdb1","permalink":"/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html"},"headers":[]}`);export{t as data}; diff --git a/assets/77c5fdb1.html-1316a7c0.js b/assets/77c5fdb1.html-1316a7c0.js new file mode 100644 index 0000000..a17e03e --- /dev/null +++ b/assets/77c5fdb1.html-1316a7c0.js @@ -0,0 +1,21 @@ +import{_ as n,o as r,c as t,a as e}from"./app-5c46a61a.js";const o={},a=e("pre",null,[e("code",{class:"language-java"},`class Solution { + int rank,res = 0; + public int kthSmallest(TreeNode root, int k) { + traverse(root,k); + return res; + } + private void traverse(TreeNode root, int k) { + if (root == null) { + return; + } + traverse(root.left,k); + //二叉搜索树的特点,若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值,因此先序遍历的就是第k小 + rank++; + if (k == rank) { + res = root.val; + return; + } + traverse(root.right,k); + } +} +`)],-1),s=[a];function c(l,i){return r(),t("div",null,s)}const d=n(o,[["render",c],["__file","77c5fdb1.html.vue"]]);export{d as default}; diff --git a/assets/79abcd0d.html-225294be.js b/assets/79abcd0d.html-225294be.js new file mode 100644 index 0000000..73cfea2 --- /dev/null +++ b/assets/79abcd0d.html-225294be.js @@ -0,0 +1,4 @@ +import{_ as a,r as c,o as i,c as d,a as o,b as e,d as n,w as l,e as r}from"./app-5c46a61a.js";const s={},h=r('

:::info
跳票N久终于更新的简单的使用说明

已经支持hexo 5。
:::

:::info
因博主被学业和工作掏空,本项目已停滞更新大半年,问题也无法及时回复大家,这个悲惨状态可能还要持续半年的样子。

有很多热心小伙伴在评论区或者项目issue帮忙回答问题,非常非常感谢!

本项目是完全开源的,也有做一些example示例,大家可以随便拿随便改。
但是很抱歉,博主我暂时不能提供更多的支持,这个写的乱七八糟的文档,暂时也没有时间把它写得更专业一些。
非常对不住大家!

iconfont的添加申请,我看到留言后会尽快加上,希望各位小伙伴能看到。
:::

:::warning
当前版本更新至 0.2.5,更新记录点此

:::

',9),u=o("br",null,null,-1),_=o("strong",null,"🚀快速开始",-1),p=o("br",null,null,-1),m=r(`

设计缘由

前几年在Bear和Evernote上整理了大量笔记,非常喜欢Bear默认的markdown渲染样式。
后来因为换了安卓手机,用不了Bear,四处搜寻替代品,没有满意的。
然后阴差阳错知道了Hexo,又得知Github也可以免费建私有仓库了,故再次转移阵地到了自建博客,并部署在Github Pages。

因为这个博客是用来记笔记的,故起名书架
对应的主题即Theme.Shoka,可以说是为了笔记阅读而生的主题。
样式严重参考Bear,部分代码严重参考NexT

Hexo的默认及常用渲染器均使用highlight.js进行代码高亮,而我喜欢Prism.js,故重写了一个渲染器配合主题食用。
渲染器取名multi,因为集成了很多很多很多markdown-it插件,以及压缩静态文件的功能。
(最新版的默认渲染器也支持Prism.js了,可喜可贺,但不想用,哈哈哈哈哈哈哈

墙内Github Pages访问速度时而感人,所以用了jsDelivr加速,主要是因为它可以按需合并依赖文件。

快速安装

# cd your-blog
+git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka
+

打开主题目录,内有example文件夹,提供了配置文件的demo供参考。

安装依赖插件

在应用主题之前,必须至少安装 hexo-renderer-multi-markdown-it 渲染插件 和 hexo-autoprefixer

`,10),E=r(`

应用主题

修改站点配置

修改站点配置文件<root>/_config.yml,把主题改为 shoka

theme: shoka
+

修改主题配置

主题配置的所有参数在<root>/themes/shoka/_config.yml文件中。

为了方便主题升级,请在根目录新建一个yml文件,命名为_config.shoka.yml
也就是说,所有主题的自定义配置均保存于<root>/_config.shoka.yml文件。

`,7),f=o("br",null,null,-1),b=r('

更新记录

标签含义:
❗ 需要手动操作的更新信息
⚠️ 需要注意的更新信息
🔧 已修复的问题
⌛ TODO

0.2.4 👉 0.2.5

💡 避免直接修改主题文件,添加各种自定义:

',4),A=o("p",null,"🔧 修复一些BUG",-1),B=o("h2",{id:"_0-2-3-👉-0-2-4",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#_0-2-3-👉-0-2-4","aria-hidden":"true"},"#"),e(" 0.2.3 👉 0.2.4")],-1),g=o("p",null,[e("⚠️ "),o("strong",null,"评论功能更新")],-1),k=o("li",null,[e("MiniValine魔改版更新至beta10,修改过主题默认"),o("code",null,"_config.yml"),e("的同学,记得更新末尾的"),o("code",null,"vendors"),e("到最新哦")],-1),x=o("ul",null,[o("li",null,"主要增加的Tag配置,现在可以各种自定义啦")],-1),w=o("p",null,"⚠️ 配置新增",-1),y=o("code",null,"darkmode",-1),D=o("code",null,"auto_scroll",-1),V=o("code",null,"image_server",-1),C=o("ul",null,[o("li",null,"可以添加多个播放列表"),o("li",null,"加了一些控制按钮")],-1),v=o("code",null,"media",-1),F=o("br",null,null,-1),j=o("p",null,[e("🔧 随机图库支持非渣浪图床的任意图片"),o("br"),e(" 🔧 还有许多小BUG")],-1),G=o("h2",{id:"_0-2-2-👉-0-2-3",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#_0-2-2-👉-0-2-3","aria-hidden":"true"},"#"),e(" 0.2.2 👉 0.2.3")],-1),N=o("br",null,null,-1),P=o("h2",{id:"_0-2-1-👉-0-2-2",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#_0-2-1-👉-0-2-2","aria-hidden":"true"},"#"),e(" 0.2.1 👉 0.2.2")],-1),T=o("code",null,"mediumzoom",-1),M=o("code",null,"fancybox",-1),U=o("br",null,null,-1),z=o("code",null,"繁体中文",-1),H=o("code",null,"日语",-1),I=o("br",null,null,-1),L=o("br",null,null,-1),O=o("br",null,null,-1),Q=o("code",null,"audio: false",-1),R=o("h2",{id:"_0-2-👉-0-2-1",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#_0-2-👉-0-2-1","aria-hidden":"true"},"#"),e(" 0.2 👉 0.2.1")],-1),S=o("code",null,"loader",-1),q=o("br",null,null,-1),J=o("br",null,null,-1),K=o("br",null,null,-1),W=o("br",null,null,-1),X=o("h2",{id:"_0-1-9-👉-0-2",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#_0-1-9-👉-0-2","aria-hidden":"true"},"#"),e(" 0.1.9 👉 0.2")],-1),Y=o("p",null,[e("⚠️ "),o("strong",null,"评论功能大改")],-1),Z=o("li",null,[e("弃用不开源的Valine,改用MiniValine,并且进行了魔改,"),o("a",{href:"https://github.com/amehime/MiniValine",target:"_blank",rel:"noopener noreferrer"},"项目戳此"),o("br"),e(" 主要是大量压缩了代码,弃用一些花里胡哨的功能,又加了一些别的花里胡哨的功能。")],-1),$=o("li",null,[e("为防止泄露用户邮箱、IP等隐私信息,弃用QQ号获取昵称及头像。"),o("br"),e(" ❗ 同时需要手动进行一些迁移,"),o("a",{href:"https://github.com/imaegoo/Valine",target:"_blank",rel:"noopener noreferrer"},"具体步骤戳此")],-1),ee=o("br",null,null,-1),oe=o("br",null,null,-1),te=o("code",null,"i-douban",-1),ne=o("br",null,null,-1);function le(re,ae){const t=c("RouterLink");return i(),d("div",null,[h,o("p",null,[e(":::primary"),u,n(t,{to:"/computer-science/note/theme-shoka-doc/"},{default:l(()=>[_]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/dependents/"},{default:l(()=>[e("💌依赖插件")]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/config/"},{default:l(()=>[e("📌基本配置")]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/display/"},{default:l(()=>[e("🌈界面显示")]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/special/"},{default:l(()=>[e("🦄特殊功能")]),_:1}),p,e(" :::")]),m,o("p",null,[n(t,{to:"/computer-science/note/dependents/"},{default:l(()=>[e("插件安装与配置教程戳此")]),_:1})]),E,o("p",null,[n(t,{to:"/computer-science/note/config/"},{default:l(()=>[e("主题的基础配置可以参考这里")]),_:1}),f,n(t,{to:"/computer-science/note/display/"},{default:l(()=>[e("界面显示相关的配置参考这里")]),_:1})]),b,o("ul",null,[o("li",null,[n(t,{to:"/computer-science/note/display/#%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A1%B5%E9%9D%A2%E9%85%8D%E8%89%B2"},{default:l(()=>[e("样式")]),_:1}),e(":包括配色、"),n(t,{to:"/computer-science/note/config/#iconfont%E5%9B%BE%E6%A0%87"},{default:l(()=>[e("icon")]),_:1}),e("、其他自定义样式")]),o("li",null,[e("图片:包括"),n(t,{to:"/computer-science/note/display/#%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%BB%E9%A2%98%E5%9B%BE%E7%89%87"},{default:l(()=>[e("主题图片")]),_:1}),e("、"),n(t,{to:"/computer-science/note/config/#%E9%9A%8F%E6%9C%BA%E5%9B%BE%E5%BA%93"},{default:l(()=>[e("随机图库")]),_:1})])]),A,B,g,o("ul",null,[k,o("li",null,[e("❗ 评论相关的配置有更新,"),n(t,{to:"/computer-science/note/config/#%E6%96%87%E7%AB%A0%E8%AF%84%E8%AE%BA"},{default:l(()=>[e("配置戳此")]),_:1}),x])]),w,o("ul",null,[o("li",null,[e("夜间模式"),y,e(","),n(t,{to:"/computer-science/note/config/#%E5%A4%9C%E9%97%B4%E6%A8%A1%E5%BC%8F"},{default:l(()=>[e("配置戳此")]),_:1})]),o("li",null,[e("自动定位"),D,e(","),n(t,{to:"/computer-science/note/config/#%E8%87%AA%E5%8A%A8%E5%AE%9A%E4%BD%8D"},{default:l(()=>[e("配置戳此")]),_:1})]),o("li",null,[e("图床API设置"),V,e(","),n(t,{to:"/computer-science/note/config/#%E9%9A%8F%E6%9C%BA%E5%9B%BE%E5%BA%93"},{default:l(()=>[e("配置戳此")]),_:1})])]),o("p",null,[e("⚠️ 背景音乐功能增强,"),n(t,{to:"/computer-science/note/config/#%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90"},{default:l(()=>[e("配置戳此")]),_:1})]),C,o("p",null,[e("⚠️ 增加"),v,e("标签,在文章中插入音频和视频播放列表,"),n(t,{to:"/computer-science/note/special/#media%E5%A4%9A%E5%AA%92%E4%BD%93"},{default:l(()=>[e("方法戳此")]),_:1}),F,e(" ⌛ 视频播放器有待增强(显示分段标签,字幕)")]),j,G,o("p",null,[e("❗ 增加主题文件外自定义语言包的功能,"),n(t,{to:"/computer-science/note/display/#%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%AD%E8%A8%80%E5%8C%85"},{default:l(()=>[e("配置戳此")]),_:1}),N,e(" 🔧 提高低版本浏览器兼容性")]),P,o("p",null,[e("⚠️ 弃用"),T,e(",改成"),M,e(","),n(t,{to:"/computer-science/note/display/#%E5%9B%BE%E7%89%87%E5%B1%95%E7%A4%BA%E4%B8%8E%E7%9B%B8%E5%86%8C"},{default:l(()=>[e("配置戳此")]),_:1}),U,e(" 💡 增加语言包:"),z,e("和"),H,I,e(" 💡 quiz功能优化,根据语言显示题型标签"),L,e(" 🔧 修复评论功能中反复初始化leancloud-storage"),O,e(" 🔧 修复"),Q,e("时不能隐藏播放按钮、停止播放")]),R,o("p",null,[e("⚠️ 配置文件添加 "),S,e(" 参数,"),n(t,{to:"/computer-science/note/config/#%E5%8A%A0%E8%BD%BD%E5%8A%A8%E7%94%BB"},{default:l(()=>[e("配置戳此")]),_:1}),q,e(" 💡 二级list区别显示"),J,e(" 🔧 修复浏览位置定位BUG"),K,e(" 🔧 修复firework动画延迟"),W,e(" 🔧 优化评论功能")]),X,Y,o("ul",null,[Z,$,o("li",null,[e("❗ 评论相关的配置亦有更新,"),n(t,{to:"/computer-science/note/config/#%E6%96%87%E7%AB%A0%E8%AF%84%E8%AE%BA"},{default:l(()=>[e("配置戳此")]),_:1})])]),o("p",null,[e("⚠️ 增加单击页面烟花效果,"),n(t,{to:"/computer-science/note/config/#%E9%A1%B5%E9%9D%A2%E7%89%B9%E6%95%88"},{default:l(()=>[e("配置戳此")]),_:1}),ee,e(" 💡 弃用Velocity,改用anime.js,方便未来添加更多!!花里胡哨的!!功能!!严重拖慢页面滑行速度!!"),oe,e(" 🔧 新增多枚icon,包括豆瓣"),te,e("等"),ne,e(" 🔧 一些显示问题")])])}const ie=a(s,[["render",le],["__file","79abcd0d.html.vue"]]);export{ie as default}; diff --git a/assets/79abcd0d.html-47af4901.js b/assets/79abcd0d.html-47af4901.js new file mode 100644 index 0000000..636cece --- /dev/null +++ b/assets/79abcd0d.html-47af4901.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-04d0e708","path":"/computer-science/note/79abcd0d.html","title":"Hexo主题Shoka & multi-markdown-it渲染器使用说明","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"二进制杂谈\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"Theme Shoka Documentation\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd/Theme-Shoka-Documentation\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/computer-science/note/79abcd0d.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/computer-science/note/79abcd0d.html\\",\\"headline\\":\\"Hexo主题Shoka & multi-markdown-it渲染器使用说明\\",\\"name\\":\\"Hexo主题Shoka & multi-markdown-it渲染器使用说明\\",\\"datePublished\\":\\"2020-08-13\\",\\"dateModified\\":\\"2020-08-13\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/computer-science/note/79abcd0d.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"Hexo主题Shoka & multi-markdown-it渲染器使用说明","date":"2020-08-13T20:45:48.000Z","update":"2020-09-27T00:00:00.000Z","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"二进制杂谈","path":"/categories/11159622/97a3d3dd"},{"name":"Theme Shoka Documentation","path":"/categories/11159622/97a3d3dd/Theme-Shoka-Documentation"}],"tags":[{"name":"Hexo","path":"/tags/Hexo"},{"name":"教程","path":"/tags/1868f51e"}],"sticky":true,"valine":{"placeholder":"1. 提问前请先仔细阅读本文档⚡\\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"},"permalink":"/computer-science/note/79abcd0d.html","abbrlink":"79abcd0d"},"headers":[{"level":1,"title":"设计缘由","slug":"设计缘由","link":"#设计缘由","children":[]},{"level":1,"title":"快速安装","slug":"快速安装","link":"#快速安装","children":[]},{"level":1,"title":"安装依赖插件","slug":"安装依赖插件","link":"#安装依赖插件","children":[]},{"level":1,"title":"应用主题","slug":"应用主题","link":"#应用主题","children":[{"level":2,"title":"修改站点配置","slug":"修改站点配置","link":"#修改站点配置","children":[]},{"level":2,"title":"修改主题配置","slug":"修改主题配置","link":"#修改主题配置","children":[]}]},{"level":1,"title":"更新记录","slug":"更新记录","link":"#更新记录","children":[{"level":2,"title":"0.2.4 👉 0.2.5","slug":"_0-2-4-👉-0-2-5","link":"#_0-2-4-👉-0-2-5","children":[]},{"level":2,"title":"0.2.3 👉 0.2.4","slug":"_0-2-3-👉-0-2-4","link":"#_0-2-3-👉-0-2-4","children":[]},{"level":2,"title":"0.2.2 👉 0.2.3","slug":"_0-2-2-👉-0-2-3","link":"#_0-2-2-👉-0-2-3","children":[]},{"level":2,"title":"0.2.1 👉 0.2.2","slug":"_0-2-1-👉-0-2-2","link":"#_0-2-1-👉-0-2-2","children":[]},{"level":2,"title":"0.2 👉 0.2.1","slug":"_0-2-👉-0-2-1","link":"#_0-2-👉-0-2-1","children":[]},{"level":2,"title":"0.1.9 👉 0.2","slug":"_0-1-9-👉-0-2","link":"#_0-1-9-👉-0-2","children":[]}]}]}`);export{t as data}; diff --git a/assets/7cab1e06.html-93a7ff90.js b/assets/7cab1e06.html-93a7ff90.js new file mode 100644 index 0000000..ae37d21 --- /dev/null +++ b/assets/7cab1e06.html-93a7ff90.js @@ -0,0 +1 @@ +import{_ as l,o as n,c as t,a as e,b as o}from"./app-5c46a61a.js";const c={},s=e("p",null,[e("strong",null,"别名"),e("br"),o(" 二叉搜索树,二叉查找树,BST,Binary Search Tree")],-1),_=e("p",null,[e("strong",null,"特点")],-1),r=e("ol",null,[e("li",null,"若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;"),e("li",null,"任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;"),e("li",null,"任意节点的左、右子树也分别为二叉查找树;"),e("li",null,"没有键值相等的节点。")],-1),a=[s,_,r];function i(u,d){return n(),t("div",null,a)}const f=l(c,[["render",i],["__file","7cab1e06.html.vue"]]);export{f as default}; diff --git a/assets/7cab1e06.html-c789ffc2.js b/assets/7cab1e06.html-c789ffc2.js new file mode 100644 index 0000000..fd733de --- /dev/null +++ b/assets/7cab1e06.html-c789ffc2.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-43b91011","path":"/8612fa7f/79666db/7b216a3b/7cab1e06.html","title":"二叉搜索树","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/79666db/7b216a3b/7cab1e06.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/79666db/7b216a3b/7cab1e06.html\\",\\"headline\\":\\"二叉搜索树\\",\\"name\\":\\"二叉搜索树\\",\\"datePublished\\":\\"2022-07-20\\",\\"dateModified\\":\\"2022-07-20\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/79666db/7b216a3b/7cab1e06.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"二叉搜索树","date":"2022-07-20 15:11:43","abbrlink":"7cab1e06","permalink":"/8612fa7f/79666db/7b216a3b/7cab1e06.html","categories":[],"tags":[]},"headers":[]}`);export{t as data}; diff --git a/assets/85a3718.html-bec2de7a.js b/assets/85a3718.html-bec2de7a.js new file mode 100644 index 0000000..0ae7abf --- /dev/null +++ b/assets/85a3718.html-bec2de7a.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-6c73d6db","path":"/computer-science/note/theme-shoka-doc/85a3718.html","title":"Step.2 基本配置","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"二进制杂谈\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"Theme Shoka Documentation\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd/Theme-Shoka-Documentation\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/85a3718.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/85a3718.html\\",\\"headline\\":\\"Step.2 基本配置\\",\\"name\\":\\"Step.2 基本配置\\",\\"datePublished\\":\\"2020-08-13\\",\\"dateModified\\":\\"2020-08-13\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/85a3718.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"Step.2 基本配置","date":"2020-08-13T20:56:48.000Z","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"二进制杂谈","path":"/categories/11159622/97a3d3dd"},{"name":"Theme Shoka Documentation","path":"/categories/11159622/97a3d3dd/Theme-Shoka-Documentation"}],"tags":[{"name":"Hexo","path":"/tags/Hexo"},{"name":"教程","path":"/tags/1868f51e"}],"valine":{"placeholder":"1. 提问前请先仔细阅读本文档⚡\\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"},"audio":["https://music.163.com/song?id=1387098940"],"permalink":"/computer-science/note/theme-shoka-doc/85a3718.html","abbrlink":"85a3718"},"headers":[{"level":1,"title":"站点别称","slug":"站点别称","link":"#站点别称","children":[]},{"level":1,"title":"静态文件目录","slug":"静态文件目录","link":"#静态文件目录","children":[]},{"level":1,"title":"夜间模式","slug":"夜间模式","link":"#夜间模式","children":[]},{"level":1,"title":"自动定位","slug":"自动定位","link":"#自动定位","children":[]},{"level":1,"title":"加载动画","slug":"加载动画","link":"#加载动画","children":[]},{"level":1,"title":"页面特效","slug":"页面特效","link":"#页面特效","children":[]},{"level":1,"title":"加载谷歌字体","slug":"加载谷歌字体","link":"#加载谷歌字体","children":[]},{"level":1,"title":"iconfont图标","slug":"iconfont图标","link":"#iconfont图标","children":[]},{"level":1,"title":"菜单与社交按钮","slug":"菜单与社交按钮","link":"#菜单与社交按钮","children":[]},{"level":1,"title":"边栏配置","slug":"边栏配置","link":"#边栏配置","children":[]},{"level":1,"title":"底部widgets","slug":"底部widgets","link":"#底部widgets","children":[]},{"level":1,"title":"字数及阅读时间统计","slug":"字数及阅读时间统计","link":"#字数及阅读时间统计","children":[]},{"level":1,"title":"文章评论","slug":"文章评论","link":"#文章评论","children":[]},{"level":1,"title":"背景音乐","slug":"背景音乐","link":"#背景音乐","children":[]},{"level":1,"title":"随机图库","slug":"随机图库","link":"#随机图库","children":[]},{"level":1,"title":"加载第三方组件","slug":"加载第三方组件","link":"#加载第三方组件","children":[]}]}`);export{t as data}; diff --git a/assets/85a3718.html-fa6379ec.js b/assets/85a3718.html-fa6379ec.js new file mode 100644 index 0000000..d096e66 --- /dev/null +++ b/assets/85a3718.html-fa6379ec.js @@ -0,0 +1,209 @@ +import{_ as c,r as d,o as s,c as i,a as o,b as e,d as a,w as n,e as r}from"./app-5c46a61a.js";const l={},u=o("br",null,null,-1),p=o("strong",null,"📌基本配置",-1),h=o("br",null,null,-1),m=r(`

站点别称

alternate: Yume Shoka
+

这里设置的名称代替Logo,显示在页面顶部,以及页尾©️处

静态文件目录

statics: / #//cdn.jsdelivr.net/gh/amehime/shoka@latest/
+

默认值是/,指使用本地静态文件
可以修改成//cdn.jsdelivr.net/gh/您的github用户名/您的项目名@latest/这种形式,以使用jsDelivr进行加速。
PS:jsDelivr并不是实时更新,重新生成文件后需要耐心等待

css: css
+js: js
+images: images
+

静态文件所处目录的实际目录名,这些一般不改。

夜间模式

darkmode: # true
+

默认情况下,是否开启夜间模式取决于(优先级从高到低):

  1. 访客点击页面头部切换按钮的自行选择
  2. 访客切换了浏览设备的主题色调
  3. 您的darkmode配置项

自动定位

auto_scroll: # false
+

默认情况下,再次打开页面时,会自动滚动到上次浏览的位置。
这个选项设为false时将停用此功能。

加载动画

# 是否显示页面加载动画loading-cat
+loader:
+  start: true # 当初次打开页面时,显示加载动画
+  switch: true # tab切换到其他页面时,显示加载动画
+

tab切换后只是显示loading动画,实际并未重新加载页面

页面特效

单击页面的烟花效果配置如下

fireworks:
+  enable: true # 是否启用
+  color: # 烟花颜色
+    - "rgba(255,182,185,.9)"
+    - "rgba(250,227,217,.9)"
+    - "rgba(187,222,214,.9)"
+    - "rgba(138,198,209,.9)"
+

加载谷歌字体

font:
+  enable: true
+  # Font options:
+  # \`external: true\` will load this font family from \`host\` above.
+  # \`family: Times New Roman\`. Without any quotes.
+  # \`size: x.x\`. Use \`em\` as unit. Default: 1 (16px)
+
+  # Global font settings used for all elements inside <body>.
+  global:
+    external: true
+    family: Mulish
+    size:
+
+  # Font settings for alternate title.
+  logo:
+    external: true
+    family: Fredericka the Great
+    size: 3.5
+
+  # Font settings for site title.
+  title:
+    external: true
+    family: Noto Serif JP
+    size: 2.5
+
+  # Font settings for headlines (<h1> to <h6>).
+  headings:
+    external: true
+    family: Noto Serif SC
+    size:
+
+  # Font settings for posts.
+  posts:
+    external: true
+    family:
+
+  # Font settings for <code> and code blocks.
+  codes:
+    external: true
+    family: Inconsolata
+

此功能基本参考NexT。
加粗标题的字体总是使用Noto Serif,为了正确友好的显示日文中的汉字,会先后加载headingstitle的字体设置。

iconfont图标

主题没有直接使用Font Awesome,是因为用不到那么多icon感觉非常浪费,因此在Iconfont上重新建立了一个项目。
font-family设为ic,所有字体样式前缀为i-,具体参见<root>/themes/shoka/source/css/_iconfont.styl

# project of https://www.iconfont.cn/
+# //at.alicdn.com/t/font_1832207_c8i9n1ulxlt.css => 1832207_c8i9n1ulxlt
+iconfont: "1832207_c8i9n1ulxlt"
+

如果需要添加或修改,请留言告诉我您的Iconfont用户名,我将把您添加到目前的项目中。

添加权限为只读,此后您可以任意全选,批量保存到购物车中,添加至您自己的项目里,并将主题配置文件中的iconfont值改为您的项目。

注意,您的项目应设置FontClass/Symbol 前缀i-

<root>/source/_data/目录新建文件iconfont.styl,把新增或修改的图标样式复制到这个文件中。

自定义iconfont.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

菜单与社交按钮

menu:
+  home: / || home
+  about: /about/ || user
+  posts:
+    default: / || feather
+    archives: /archives/ || list-alt
+    categories: /categories/ || th
+    tags: /tags/ || tags
+  # friends: /friends/ || heart
+  # links: /links/ || magic
+
+social:
+  github: https://github.com/yourname || github || "#191717"
+  #google: https://plus.google.com/yourname || google
+  twitter: https://twitter.com/yourname || twitter || "#00aff0"
+  zhihu: https://www.zhihu.com/people/yourname || zhihu || "#1e88e5"
+  music: https://music.163.com/#/user/home?id=yourid || cloud-music || "#e60026"
+  weibo: https://weibo.com/yourname || weibo || "#ea716e"
+  about: https://about.me/yourname || address-card || "#3b5998"
+  #email: mailto:yourname@mail.com || envelope || "#55acd5"
+  #facebook: https://www.facebook.com/yourname || facebook
+  #stackoverflow: https://stackoverflow.com/yourname || stack-overflow
+  #youtube: https://youtube.com/yourname || youtube
+  #instagram: https://instagram.com/yourname || instagram
+  #skype: skype:yourname?call|chat || skype
+  #douban: https://www.douban.com/people/yourname/ || douban
+

如上,使用||作为分隔符,依次为 链接 || 图标 || 颜色
注意,只需要写图标名称,如github,则会自动转换为ic i-github
十六进制颜色码需要""包绕。

menu 支持一级子目录,子目录设置中的第一项必须为default,用来定义父级按钮的样式。

`,36),g=o("h1",{id:"边栏配置",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#边栏配置","aria-hidden":"true"},"#"),e(" 边栏配置")],-1),f=o("p",null,[e("边栏可以选择在左侧,或右侧"),o("br"),e(" 修改头像文件的地址,相对于静态文件目录"),o("code",null,"images"),e("中配置的路径。")],-1),b=o("pre",null,[o("code",{class:"language-yml"},`sidebar: + # Sidebar Position. + position: left + #position: right + # Replace the default avatar image and set the url here. + avatar: avatar.jpg +`)],-1),q=o("code",null,"/source/_data/images/",-1),y=r(`

底部widgets

目前页面底部可以显示两个小部件,即随机文章最近评论

widgets:
+  random_posts: true # 显示随机文章
+  recent_comments: true # 显示最近评论
+

字数及阅读时间统计

安装好hexo-symbols-count-time插件后,不需要修改站点配置文件,直接使用插件默认配置就行。

需要修改主题配置文件,找到两处cout,修改为true

# 页尾全站统计
+footer:
+  since: 2010
+  count: true
+
+# 文章界面统计
+post:
+  count: true
+

文章评论

如何获取LeanCloud的appId和appKey

valine:
+  appId: #Your_appId
+  appKey: #Your_appkey
+  placeholder: ヽ(○´∀\`)ノ♪ # Comment box placeholder
+  avatar: mp # Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro
+  pageSize: 10 # Pagination size
+  lang: zh-CN.ts-CN
+  visitor: true # 文章访问量统计
+  NoRecordIP: false # 不记录IP
+  serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
+  powerMode: true # 默认打开评论框输入特效
+  tagMeta:
+    visitor: 新朋友
+    master: 主人
+    friend: 小伙伴
+    investor: 金主粑粑
+  tagColor:
+    master: "var(--color-orange)"
+    friend: "var(--color-aqua)"
+    investor: "var(--color-pink)"
+  tagMember:
+    master:
+      # - hash of master@email.com
+      # - hash of master2@email.com
+    friend:
+      # - hash of friend@email.com
+      # - hash of friend2@email.com
+    investor:
+      # - hash of investor1@email.com
+

tag标签显示在评论者名字的后面,默认是tagMeta.visitor对应的值。
tagMetatagColor中,除了visitor这个key不能修改外,其他key都可以换一换,但需要保证一致性。

  tagMeta:
+    visitor: 游客
+    admin: 管理员
+    waifu: 我老婆
+  tagColor:
+    visitor: "#855194"
+    admin: "#a77c59"
+    waifu: "#ed6ea0"
+  tagMember:
+    admin:
+      # - hash of admin@email.com
+    waifu:
+      # - hash of waifu@email.com
+

在文章Front Matter中也可以配置上述参数,访问该文章页面时,将覆盖全局配置。
尤其可以用来配置一个特殊的placeholder。

valine:
+  placeholder: "1. 提问前请先仔细阅读本文档⚡\\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"
+---
+

评论通知与管理工具建议使用这个Valine-Admin
注意SITE_URL需要以/结尾。

如果某一篇文章需要关闭评论功能,则在文章Front Matter中配置:

---
+title: 关闭评论
+comment: false
+---
+

背景音乐

在主题配置文件中,设置全局播放列表。
在文章的 Front Matter 中,设置文章专有播放列表,访问该文章页面时,将覆盖全局配置。

audio:
+  - https://music.163.com/song?id=1387098940
+  - https://music.163.com/#/playlist?id=2088001742
+  - https://www.xiami.com/collect/250830668
+  - https://y.qq.com/n/yqq/playsquare/3535982902.html
+

如上,可以直接使用网易云、虾米、QQ音乐的播放列表、单曲,可以同时填写多个。

audio:
+  - title: 列表1
+    list:
+      - https://music.163.com/#/playlist?id=2943811283
+      - https://music.163.com/#/playlist?id=2297706586
+  - title: 列表2
+    list:
+      - https://music.163.com/#/playlist?id=2031842656
+

如果需要自定义媒体文件,可以按照以下格式填写:

audio:
+  - name: "曲目1"
+    url: "播放地址"
+    artist: "艺术家"
+    cover: "封面"
+    lrc: "歌词"
+  - name: "曲目2"
+    url: "播放地址"
+    artist: "艺术家"
+    cover: "封面"
+    lrc: "歌词"
+
audio:
+    - title: 列表1
+      list:
+        - name: "曲目1"
+          url: "播放地址"
+          artist: "艺术家"
+          cover: "封面"
+          lrc: "歌词"
+        - name: "曲目2"
+          url: "播放地址"
+          artist: "艺术家"
+          cover: "封面"
+          lrc: "歌词"
+    - title: 列表2
+      list:
+        - https://music.163.com/#/playlist?id=2031842656
+

如果要关闭当前页面的背景音乐播放器,则在文章Front Matter中配置:

---
+title: 关闭背景音乐
+audio: false
+---
+

随机图库

- https://i.loli.net/2020/10/30/qAMYEFXxJcKRsiG.gif
+- https://i.loli.net/2020/10/30/rjdhcSgEN8COBPA.jpg
+- https://i.loli.net/2020/10/30/HKyzSd7NI3mlBpt.jpg
+- https://i.loli.net/2020/10/30/Y1CBXqgeokEs457.jpg
+- https://i.loli.net/2020/10/30/Z5W6r2BSoiThHG1.jpg
+
image_server: "https://acg.xydwz.cn/api/api.php"
+

加载第三方组件

vendors:
+  css:
+    # 略略略
+  js:
+    # 略略略
+

包括

–|–|–
pace | 加载进度条|全局
pjax | 页面无刷新加载|全局
anime | js动画效果|全局
algolia instantsearch| 基于algolia的站内搜索|全局
lazyload | 图片懒加载|全局
quicklink | 链接资源预加载|全局
fetch | 获取播放列表|全局
katex copy_tex|数学公式显示及复制|按需
fancybox | 图片放大显示及排列|按需
valine | 基于LeanCloud的评论系统及文章阅读次数统计|按需
chart | 图表显示|按需

以上文件加载全部基于jsDelivr,并对全局加载的组件进行了文件合并。
如果不明白啥意思,则不要轻易修改。

:::danger
主题版本升级的时候,可能会修改这里。
如果修改过主题默认_config.yml,记得更新主题时,末尾的vendors也要及时修改。
:::

`,38);function _(w,x){const t=d("RouterLink");return s(),i("div",null,[o("p",null,[e(":::primary"),u,a(t,{to:"/computer-science/note/theme-shoka-doc/"},{default:n(()=>[e("🚀快速开始")]),_:1}),e(" - "),a(t,{to:"/computer-science/note/theme-shoka-doc/dependents/"},{default:n(()=>[e("💌依赖插件")]),_:1}),e(" - "),a(t,{to:"/computer-science/note/theme-shoka-doc/config/"},{default:n(()=>[p]),_:1}),e(" - "),a(t,{to:"/computer-science/note/theme-shoka-doc/display/"},{default:n(()=>[e("🌈界面显示")]),_:1}),e(" - "),a(t,{to:"/computer-science/note/theme-shoka-doc/special/"},{default:n(()=>[e("🦄特殊功能")]),_:1}),h,e(" :::")]),m,o("p",null,[e("菜单显示文字可以在语言包中定义,"),a(t,{to:"/computer-science/note/display/#%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%AD%E8%A8%80%E5%8C%85"},{default:n(()=>[e("具体请戳这里")]),_:1})]),g,f,b,o("p",null,[e("可以将自己的图片放在"),q,e("目录,甚至以同名覆盖主题内默认的头像图片,"),a(t,{to:"/computer-science/note/display/#%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%BB%E9%A2%98%E5%9B%BE%E7%89%87"},{default:n(()=>[e("具体请戳这里")]),_:1})]),y])}const v=c(l,[["render",_],["__file","85a3718.html.vue"]]);export{v as default}; diff --git a/assets/8f835b6d.html-4b5b4fee.js b/assets/8f835b6d.html-4b5b4fee.js new file mode 100644 index 0000000..9424200 --- /dev/null +++ b/assets/8f835b6d.html-4b5b4fee.js @@ -0,0 +1,18 @@ +import{_ as e,o as t,c as o,a as n}from"./app-5c46a61a.js";const s={},a=n("pre",null,[n("code",{class:"language-java"},`class Solution { + public ListNode getKthFromEnd(ListNode head, int k) { + ListNode p1 = head; + // p1 先走 k 步 + for (int i = 0; i < k; i++) { + p1 = p1.next; + } + ListNode p2 = head; + // p1 和 p2 同时走 n - k 步 + while (p1 != null) { + p2 = p2.next; + p1 = p1.next; + } + // p2 现在指向第 n - k + 1 个节点,即倒数第 k 个节点 + return p2; + } +} +`)],-1),c=[a];function p(i,l){return t(),o("div",null,c)}const r=e(s,[["render",p],["__file","8f835b6d.html.vue"]]);export{r as default}; diff --git a/assets/8f835b6d.html-c1f7f2e5.js b/assets/8f835b6d.html-c1f7f2e5.js new file mode 100644 index 0000000..0d260fd --- /dev/null +++ b/assets/8f835b6d.html-c1f7f2e5.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-8a741eac","path":"/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html","title":"[剑指 Offer 22]链表中倒数第k个节点","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"链表\\",\\"item\\":\\"https://blog.dragondyt.top/categories/2362a8ea\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html\\",\\"headline\\":\\"[剑指 Offer 22]链表中倒数第k个节点\\",\\"name\\":\\"[剑指 Offer 22]链表中倒数第k个节点\\",\\"datePublished\\":\\"2022-07-28\\",\\"dateModified\\":\\"2022-07-28\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[剑指 Offer 22]链表中倒数第k个节点","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"链表","path":"/categories/2362a8ea"}],"tags":[{"name":"链表","path":"/tags/2362a8ea"}],"date":"2022-07-28 16:59:09","abbrlink":"8f835b6d","permalink":"/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html"},"headers":[]}`);export{t as data}; diff --git a/assets/9862a150.html-a983562a.js b/assets/9862a150.html-a983562a.js new file mode 100644 index 0000000..e9c45f3 --- /dev/null +++ b/assets/9862a150.html-a983562a.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-3551ab68","path":"/8612fa7f/b7e144d1/2362a8ea/9862a150.html","title":"[剑指 Offer II 022]链表中环的入口节点","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/9862a150.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/9862a150.html\\",\\"headline\\":\\"[剑指 Offer II 022]链表中环的入口节点\\",\\"name\\":\\"[剑指 Offer II 022]链表中环的入口节点\\",\\"datePublished\\":\\"2022-08-03\\",\\"dateModified\\":\\"2022-08-03\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/9862a150.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[剑指 Offer II 022]链表中环的入口节点","tags":[{"name":"链表","path":"/tags/2362a8ea"},{"name":"快慢指针","path":"/tags/76495b47"}],"date":"2022-08-03 16:10:45","abbrlink":"9862a150","permalink":"/8612fa7f/b7e144d1/2362a8ea/9862a150.html","categories":[]},"headers":[]}`);export{t as data}; diff --git a/assets/9862a150.html-fc4d3a00.js b/assets/9862a150.html-fc4d3a00.js new file mode 100644 index 0000000..e757091 --- /dev/null +++ b/assets/9862a150.html-fc4d3a00.js @@ -0,0 +1,34 @@ +import{_ as e,o as t,c as s,a as n}from"./app-5c46a61a.js";const l={},a=n("pre",null,[n("code",{class:"language-java"},`/** + * Definition for singly-linked list. + * class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ +public class Solution { + public ListNode detectCycle(ListNode head) { + //如果用两个指针 + ListNode fast = head, slow = head; + while (fast != null && fast.next != null) { + fast = fast.next.next; + slow = slow.next; + if (fast == slow) { + break; + } + } + if (fast == null || fast.next == null) { + return null; + } + slow = head; + while (slow!=fast){ + slow = slow.next; + fast = fast.next; + } + return slow; + } +} +`)],-1),o=[a];function i(c,f){return t(),s("div",null,o)}const r=e(l,[["render",i],["__file","9862a150.html.vue"]]);export{r as default}; diff --git a/assets/9b7cc1d2.html-58a05574.js b/assets/9b7cc1d2.html-58a05574.js new file mode 100644 index 0000000..5b0e622 --- /dev/null +++ b/assets/9b7cc1d2.html-58a05574.js @@ -0,0 +1,37 @@ +import{_ as t,o as n,c as e,e as o}from"./app-5c46a61a.js";const r={},l=o(`

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和。

示例 1:
示例 1
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:
示例 2
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

Related Topics

/**
+ * Definition for a binary tree node.
+ * public class TreeNode {
+ *     int val;
+ *     TreeNode left;
+ *     TreeNode right;
+ *     TreeNode() {}
+ *     TreeNode(int val) { this.val = val; }
+ *     TreeNode(int val, TreeNode left, TreeNode right) {
+ *         this.val = val;
+ *         this.left = left;
+ *         this.right = right;
+ *     }
+ * }
+ */
+class Solution {
+  int res = Integer.MIN_VALUE;
+
+  public int maxPathSum(TreeNode root) {
+    // 后序位置
+    oneSideMax(root);
+    return res;
+  }
+
+  private int oneSideMax(TreeNode root){
+    if (root == null) {
+      return 0;
+    }
+    int left = Math.max(0, oneSideMax(root.left));
+    int right = Math.max(0, oneSideMax(root.right));
+    res = Math.max(res, left + right + root.val);
+    return Math.max(left, right) + root.val;
+  }
+}
+//leetcode submit region end(Prohibit modification and deletion)
+
+
`,10),i=[l];function s(a,g){return n(),e("div",null,i)}const d=t(r,[["render",s],["__file","9b7cc1d2.html.vue"]]);export{d as default}; diff --git a/assets/9b7cc1d2.html-a318771d.js b/assets/9b7cc1d2.html-a318771d.js new file mode 100644 index 0000000..ddac471 --- /dev/null +++ b/assets/9b7cc1d2.html-a318771d.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-20253c7f","path":"/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html","title":"[124]二叉树中的最大路径和","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"二叉树\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1/e85d694a\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html\\",\\"headline\\":\\"[124]二叉树中的最大路径和\\",\\"name\\":\\"[124]二叉树中的最大路径和\\",\\"datePublished\\":\\"2022-07-20\\",\\"dateModified\\":\\"2022-07-20\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[124]二叉树中的最大路径和","date":"2022-07-20 09:34:52","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"二叉树","path":"/categories/b7e144d1/e85d694a"}],"tags":[{"name":"二叉树","path":"/tags/e85d694a"}],"abbrlink":"9b7cc1d2","permalink":"/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html"},"headers":[]}`);export{t as data}; diff --git a/assets/9c47706b.html-232b29cd.js b/assets/9c47706b.html-232b29cd.js new file mode 100644 index 0000000..6004b09 --- /dev/null +++ b/assets/9c47706b.html-232b29cd.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-92b3379e","path":"/8612fa7f/47867b98/Java/9c47706b.html","title":"win10下编译以及调试openjdk","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/9c47706b.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/9c47706b.html\\",\\"headline\\":\\"win10下编译以及调试openjdk\\",\\"name\\":\\"win10下编译以及调试openjdk\\",\\"datePublished\\":\\"2020-12-05\\",\\"dateModified\\":\\"2020-12-05\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/9c47706b.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"openjdk\\",\\"dyt\\",\\"dragondyt\\",\\"win10下编译以及调试openjdk\\"]}"]],"title":"win10下编译以及调试openjdk","tags":[{"name":"java","path":"/tags/java"}],"categories":[{"name":"教程","path":"/categories/1868f51e"}],"keywords":["openjdk","dyt","dragondyt","win10下编译以及调试openjdk"],"date":"2020-12-05T17:00:19.000Z","abbrlink":"9c47706b","permalink":"/8612fa7f/47867b98/Java/9c47706b.html"},"headers":[{"level":1,"title":"编译OpenJDK","slug":"编译openjdk","link":"#编译openjdk","children":[{"level":2,"title":"安装编译环境","slug":"安装编译环境","link":"#安装编译环境","children":[]}]},{"level":1,"title":"调试OpenJDK","slug":"调试openjdk","link":"#调试openjdk","children":[{"level":2,"title":"安装clion","slug":"安装clion","link":"#安装clion","children":[]},{"level":2,"title":"配置clion","slug":"配置clion","link":"#配置clion","children":[]},{"level":2,"title":"运行结果","slug":"运行结果","link":"#运行结果","children":[]}]}]}`);export{t as data}; diff --git a/assets/9c47706b.html-89c50918.js b/assets/9c47706b.html-89c50918.js new file mode 100644 index 0000000..9d86007 --- /dev/null +++ b/assets/9c47706b.html-89c50918.js @@ -0,0 +1,23 @@ +import{_ as e,o as t,c as a,e as i}from"./app-5c46a61a.js";const d={},n=i(`

动漫美图

编译OpenJDK

安装编译环境

下载openjdk

使用git clone(如果觉得慢可以使用coding导入的jdk

安装编译工具

1.win下Cygwin64环境编译

  1. 安装Cygwin

    1. 官方下载
    2. 设置下载源
      清华下载源
  2. 需要安装的包
    cywin64需要的包

补充:需要安装autoconf
+
  1. 编译选项&检查

+bash ./configure -with-freetype=buddle -enable-debug -with-target-bits=64 -disable-ccache
+
+
  1. 构建
make all
+

2.win下linux环境编译(ubuntu )

  1. 需要安装的包

    包名命令
    gccsudo apt-get install build-essential
    FreeTypesudo apt-get install libfreetype6-dev
    CUPSsudo apt-get install libcups2-dev
    X11sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
    ALSAsudo apt-get install libasound2-dev
    libffisudo apt-get install libffi-dev
    Autoconfsudo apt-get install autoconf
    zipsudo apt-get install zip
  2. 执行命令

 bash configure --enable-debug --with-jvm-variants=server --with-boot-jdk=/mnt/e/jdk/jdk-16 --with-tools-dir=/mnt/d/vs/2019/Community/VC/Auxiliary/Build
+

命令解释:

–with-boot-jdk 如果找不到正确jdk,通过该命令可以手动指定
jdk版本必须是编译版本的前一个版本
jdk需与目标平台(win/linux)一致

–with-tools-dir 指定编译工具目录,具体指向跟编译目标有关

注意:win下wsl默认编译win平台jdk,如果需要编译linux版本需要进行配置

build.doc

遇到的问题

win10sdk路径包含括号
在这里插入图片描述
在这里插入图片描述
解决:更换目录
移动到正常目录(括号都不行,中文就更不行了
创建软连接

   mklink /J "C:\\Program Files (x86)\\Windows Kits" "D:\\WindowsKits"
+

当路径包含空格,路径会被截断。(参数是路径也会,最好是不要有空格)
在这里插入图片描述
警告
在这里插入图片描述
解决:执行

make clean
+

错误
在这里插入图片描述
解决:手动删除jdk下build文件夹

编译成功

编译成功
验证jdk
验证jdk

ps:如果可以的话直接在linux系统下编译,就不会有这么多的路径问题

调试OpenJDK

安装clion

因为我是java使用idea,clion和它属于一家公司产品,使用方式相似,上手容易。安装过程(略)

配置clion

根据编译jdk时使用的工具链,调试时应该选择对应的工具链,否则会出现debug无效的情况

上一篇文章我虽然使用wsl环境编译jdk,但编译工具使用的是vs工具链,所以调试选择vs工具链。
vs工具链
WSL配置
当成普通linux服务器进行连接即可,缺什么安装什么,一般是缺失cmake,gdb。
wsl配置

导入项目

  1. 导入jdk目录
  2. 创建CMakeLists.txt
    简易版(能调试,大量飘红,少部分代码能跳转)
#自己版本能用就行
+cmake_minimum_required(VERSION 3.16)
+project(jdk)
+# 添加源文件
+file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
+# 添加执行配置
+add_executable(hotspot \${SOURCE_FILES})
+

复杂版(emmmm,我不会cmake,百度到的都是少了,有大佬教我吗

#自己版本能用就行
+cmake_minimum_required(VERSION 3.16)
+project(jdk)
+# 添加源文件
+file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
+# 添加执行配置
+add_executable(hotspot \${SOURCE_FILES})
+
  1. 修改run configuration

    1. 修改executable为build/windows-x86_64-server-fastdebug/jdk/bin/java.exe
    2. 设置参数,测试用-version,可以换成类
    3. 删除build下before launch下的build
      配置结果

运行结果

断点打在src/java.base/share/native/libjli/java.c中的JavaMain函数,对c/c++不是很了解,看调用帧,这个应该是入口,下面三个点进去是汇编代码。
调试openjdk

`,44),r=[n];function o(l,s){return t(),a("div",null,r)}const p=e(d,[["render",o],["__file","9c47706b.html.vue"]]);export{p as default}; diff --git a/assets/Comment-1ec3b863.js b/assets/Comment-1ec3b863.js new file mode 100644 index 0000000..e7a151f --- /dev/null +++ b/assets/Comment-1ec3b863.js @@ -0,0 +1 @@ +import{_ as e,o as c,c as n}from"./app-5c46a61a.js";const o={};function t(r,_){return c(),n("div",null,"评论")}const a=e(o,[["render",t],["__file","Comment.vue"]]);export{a as default}; diff --git a/assets/aa3015f4.html-68b9daa5.js b/assets/aa3015f4.html-68b9daa5.js new file mode 100644 index 0000000..2495abd --- /dev/null +++ b/assets/aa3015f4.html-68b9daa5.js @@ -0,0 +1,29 @@ +import{_ as e,o as a,c as t,e as r}from"./app-5c46a61a.js";const o={},d=r(`

动漫美图

记录一次安卓反编译过程

下周就要安卓课设,而我的课设作业是开发一个记事本,我发现我小米手机上的便签挺好的,于是想参考一下布局以及实现。

软件apktooldex2jarjd-jui
版本2.4.12.10.3.5

准备工作

  1. 获取小米便签
    网上没有最新版下载,通过Es文件浏览器导出apk。
    也可以通过mt浏览器,因为后面需要三个framework文件,Es浏览器和Re浏览器好像屏蔽了根目录,不能访问了。

  2. 下载反编译相关工具
    菜鸟教程三个工具,版本低,

  3. 我使用的三个工具 密码:7uyi

开始反编译

apktool.bat d base.apk
+

Could not decode arsc file

这个是由于apktool版本低导致的,下载最新的重命名为apktool.jar替换即可
更新最新apktool后再次执行命令,还是失败,错误信息如下:

W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=android, name=id, value=0x100b0001
+W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=, name=layout, value=0x10030009
+W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
+W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
+W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
+W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d008f
+W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
+W: Could not decode attr value, using undecoded value instead: ns=android, name=height, value=0x100a0003
+W: Could not decode attr value, using undecoded value instead: ns=android, name=width, value=0x100a0003
+I: Decoding values */* XMLs...
+Can't find framework resources for package of id: 16. You must install proper framework files, see project website for more info.
+

查看一下反编译结果,发现资源以及提取出来,但是没有任何代码。
百度了最后一句话发现,有些应用需要提供额外框架,具体信息可以查看一下博文Android逆向工程:解决针对小米系统应用,使用Apktool反编译失败问题!

根据博文我提取了文章中提到的framework-res.apk,framework-ext-res.apk,miui.apk。
文件列表

执行一下命令安装:

apktool if framework-res.apk
+apktool if framework-ext-res.apk
+apktool if miui.apk
+

安装完成后发现缺少的16号对应framework-ext-res.apk

缺少的16号

再次执行 apktool.bat d base.apk 后发现还有问题,提示缺少了id为18的框架文件

缺少了id为18的框架文件

我有点头疼,我怎么知道18号是什么文件,于是尝试导入其他文件,搜索framework,找到了一个名为XiaomiServiceFramework.apk的文件,并进行安装;

apktool if XiaomiServiceFramework.apk

根据上图,我发现这个文件不是我们需要的,但它提供了一个信息:
++I: Decoding Shared Library (miui.system), pkgId: 18++
于是我去搜索system,经过筛选找到miuisystem.apk,进行安装,发现他就是我们需要的18号:

apktool if miuisystem.apk
再次反编译没有报错,查看文件发现Smali代码成功获取:

成功截图

反编译到此结束,会smali语法的大佬已经可以阅读代码了,不会的可以使用工具转java再阅读

使用dex2jar将dex转成jar

  1. 将base.apk当成压缩包打开
  2. 提取 classes.dex,classes2.dex
    执行命令:
d2j-dex2jar.bat classes.dex
+d2j-dex2jar.bat classes2.dex
+

d2j-dex2jar.bat classes.dex
这个也是版本低导致的,下载最新的就可以了
再次执行,出了新问题,我之前没遇到

C:\\Users\\dyt\\Desktop\\dex-tools-2.1-SNAPSHOT>d2j-dex2jar.bat classes.dex
+dex2jar classes.dex -> .\\classes-dex2jar.jar
+Detail Error Information in File .\\classes-error.zip
+Please report this file to one of following link if possible (any one).
+    https://sourceforge.net/p/dex2jar/tickets/
+    https://bitbucket.org/pxb1988/dex2jar/issues
+    https://github.com/pxb1988/dex2jar/issues [no attachment support, not preferred]
+    dex2jar@googlegroups.com
+

换了一个多了后缀的2.1版本,成功解决,但我不记得在哪下的了

成功获取jar

获取的jar

使用jd-gui查看

这个就是软件使用了,跟一般软件没区别,将jar包拖到jd-gui.exe就行了,不多说,自己体会。

使用截图

`,36),n=[d];function l(s,i){return a(),t("div",null,n)}const u=e(o,[["render",l],["__file","aa3015f4.html.vue"]]);export{u as default}; diff --git a/assets/aa3015f4.html-92dafd9c.js b/assets/aa3015f4.html-92dafd9c.js new file mode 100644 index 0000000..7a1bbd0 --- /dev/null +++ b/assets/aa3015f4.html-92dafd9c.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-1cedfb83","path":"/8612fa7f/e00fc567/5ac6f809/aa3015f4.html","title":"Android逆向工程:使用Apktool反编译小米便签","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/aa3015f4.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/aa3015f4.html\\",\\"headline\\":\\"Android逆向工程:使用Apktool反编译小米便签\\",\\"name\\":\\"Android逆向工程:使用Apktool反编译小米便签\\",\\"datePublished\\":\\"2020-06-04\\",\\"dateModified\\":\\"2020-06-04\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/aa3015f4.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"逆向工程\\",\\"Apktool\\",\\"安卓\\"]}"]],"title":"Android逆向工程:使用Apktool反编译小米便签","tags":[{"name":"安卓","path":"/tags/e00fc567"},{"name":"逆向工程","path":"/tags/a4fa37c"}],"categories":[{"name":"安卓","path":"/categories/b7cf68d8/e00fc567"}],"keywords":["逆向工程","Apktool","安卓"],"date":"2020-06-04T10:54:35.000Z","abbrlink":"aa3015f4","permalink":"/8612fa7f/e00fc567/5ac6f809/aa3015f4.html"},"headers":[{"level":2,"title":"记录一次安卓反编译过程","slug":"记录一次安卓反编译过程","link":"#记录一次安卓反编译过程","children":[]}]}`);export{t as data}; diff --git a/assets/af753a41.html-68680300.js b/assets/af753a41.html-68680300.js new file mode 100644 index 0000000..c807453 --- /dev/null +++ b/assets/af753a41.html-68680300.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-0782f2c1","path":"/8612fa7f/e00fc567/3632a017/af753a41.html","title":"安卓Studio打不开","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/3632a017/af753a41.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/3632a017/af753a41.html\\",\\"headline\\":\\"安卓Studio打不开\\",\\"name\\":\\"安卓Studio打不开\\",\\"datePublished\\":\\"0000-00-00\\",\\"dateModified\\":\\"0000-00-00\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/3632a017/af753a41.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"安卓Studio打不开","abbrlink":"af753a41","permalink":"/8612fa7f/e00fc567/3632a017/af753a41.html","categories":[],"tags":[]},"headers":[]}`);export{t as data}; diff --git a/assets/af753a41.html-bd7919c5.js b/assets/af753a41.html-bd7919c5.js new file mode 100644 index 0000000..43ce101 --- /dev/null +++ b/assets/af753a41.html-bd7919c5.js @@ -0,0 +1 @@ +import{_ as o,o as a,c as n,a as t,b as e}from"./app-5c46a61a.js";const s="/images/androidStudioWonTOpen.png",_={},c=t("p",null,[t("img",{src:s,alt:"安卓Studio打不开"})],-1),d=t("p",null,[e("莫名奇妙的问题,idea能打开。难道有单独的变量设置?最后没找到。"),t("br"),e(" 官网上的针对IDE能打开的情况,这不是废话吗,能打开什么都好说。。。")],-1),i=t("p",null,"通过bat打开后发现Android Studio 使用的是java11,而我坏境JavaHome是1.8。但是之前就很正常,而且它是自带环境的,卸载重装也没用",-1),l=t("p",null,"最后给我的java环境升级到了java19,成功解决问题。",-1),r=t("p",null,"问题不到,开发时可以指定java版本,外部就用最高的长期支持版吧!",-1),u=[c,d,i,l,r];function p(m,f){return a(),n("div",null,u)}const v=o(_,[["render",p],["__file","af753a41.html.vue"]]);export{v as default}; diff --git a/assets/app-5c46a61a.js b/assets/app-5c46a61a.js new file mode 100644 index 0000000..8ce694e --- /dev/null +++ b/assets/app-5c46a61a.js @@ -0,0 +1,59 @@ +var ga=Object.defineProperty;var Ea=(e,t,n)=>t in e?ga(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var rs=(e,t,n)=>(Ea(e,typeof t!="symbol"?t+"":t,n),n);const va="modulepreload",_a=function(e){return"/"+e},is={},U=function(t,n,r){if(!n||n.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(n.map(s=>{if(s=_a(s),s in is)return;is[s]=!0;const o=s.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!r)for(let c=i.length-1;c>=0;c--){const f=i[c];if(f.href===s&&(!o||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${l}`))return;const u=document.createElement("link");if(u.rel=o?"stylesheet":va,o||(u.as="script",u.crossOrigin=""),u.href=s,document.head.appendChild(u),o)return new Promise((c,f)=>{u.addEventListener("load",c),u.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>t()).catch(s=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=s,window.dispatchEvent(o),!o.defaultPrevented)throw s})};function Ci(e,t){const n=Object.create(null),r=e.split(",");for(let i=0;i!!n[i.toLowerCase()]:i=>!!n[i]}const Be={},Qt=[],lt=()=>{},ya=()=>!1,Aa=/^on[^a-z]/,Wn=e=>Aa.test(e),Bi=e=>e.startsWith("onUpdate:"),je=Object.assign,Ri=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ba=Object.prototype.hasOwnProperty,Ae=(e,t)=>ba.call(e,t),te=Array.isArray,Xt=e=>Kn(e)==="[object Map]",mn=e=>Kn(e)==="[object Set]",ss=e=>Kn(e)==="[object Date]",ae=e=>typeof e=="function",Re=e=>typeof e=="string",Pn=e=>typeof e=="symbol",Ce=e=>e!==null&&typeof e=="object",Lo=e=>Ce(e)&&ae(e.then)&&ae(e.catch),So=Object.prototype.toString,Kn=e=>So.call(e),wa=e=>Kn(e).slice(8,-1),$o=e=>Kn(e)==="[object Object]",Li=e=>Re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Bn=Ci(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Or=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ka=/-(\w)/g,pt=Or(e=>e.replace(ka,(t,n)=>n?n.toUpperCase():"")),xa=/\B([A-Z])/g,gn=Or(e=>e.replace(xa,"-$1").toLowerCase()),Pr=Or(e=>e.charAt(0).toUpperCase()+e.slice(1)),Vr=Or(e=>e?`on${Pr(e)}`:""),Dn=(e,t)=>!Object.is(e,t),hr=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},vr=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let os;const ai=()=>os||(os=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function zn(e){if(te(e)){const t={};for(let n=0;n{if(n){const r=n.split(Ba);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Se(e){let t="";if(Re(e))t=e;else if(te(e))for(let n=0;nWt(n,t))}const me=e=>Re(e)?e:e==null?"":te(e)||Ce(e)&&(e.toString===So||!ae(e.toString))?JSON.stringify(e,Io,2):String(e),Io=(e,t)=>t&&t.__v_isRef?Io(e,t.value):Xt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,i])=>(n[`${r} =>`]=i,n),{})}:mn(t)?{[`Set(${t.size})`]:[...t.values()]}:Ce(t)&&!te(t)&&!$o(t)?String(t):t;let Xe;class Ia{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Xe,!t&&Xe&&(this.index=(Xe.scopes||(Xe.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Xe;try{return Xe=this,t()}finally{Xe=n}}}on(){Xe=this}off(){Xe=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Po=e=>(e.w&It)>0,Do=e=>(e.n&It)>0,Da=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(c==="length"||c>=a)&&l.push(u)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":te(e)?Li(n)&&l.push(o.get("length")):(l.push(o.get(Vt)),Xt(e)&&l.push(o.get(fi)));break;case"delete":te(e)||(l.push(o.get(Vt)),Xt(e)&&l.push(o.get(fi)));break;case"set":Xt(e)&&l.push(o.get(Vt));break}if(l.length===1)l[0]&&di(l[0]);else{const a=[];for(const u of l)u&&a.push(...u);di($i(a))}}function di(e,t){const n=te(e)?e:[...e];for(const r of n)r.computed&&as(r);for(const r of n)r.computed||as(r)}function as(e,t){(e!==st||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Fa=Ci("__proto__,__v_isRef,__isVue"),Mo=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Pn)),Ma=Ii(),ja=Ii(!1,!0),Na=Ii(!0),cs=Ua();function Ua(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=we(this);for(let s=0,o=this.length;s{e[t]=function(...n){En();const r=we(this)[t].apply(this,n);return vn(),r}}),e}function Ha(e){const t=we(this);return Ye(t,"has",e),t.hasOwnProperty(e)}function Ii(e=!1,t=!1){return function(r,i,s){if(i==="__v_isReactive")return!e;if(i==="__v_isReadonly")return e;if(i==="__v_isShallow")return t;if(i==="__v_raw"&&s===(e?t?sc:Vo:t?Ho:Uo).get(r))return r;const o=te(r);if(!e){if(o&&Ae(cs,i))return Reflect.get(cs,i,s);if(i==="hasOwnProperty")return Ha}const l=Reflect.get(r,i,s);return(Pn(i)?Mo.has(i):Fa(i))||(e||Ye(r,"get",i),t)?l:ze(l)?o&&Li(i)?l:l.value:Ce(l)?e?Kt(l):Ot(l):l}}const Va=jo(),qa=jo(!0);function jo(e=!1){return function(n,r,i,s){let o=n[r];if(on(o)&&ze(o)&&!ze(i))return!1;if(!e&&(!_r(i)&&!on(i)&&(o=we(o),i=we(i)),!te(n)&&ze(o)&&!ze(i)))return o.value=i,!0;const l=te(n)&&Li(r)?Number(r)e,Dr=e=>Reflect.getPrototypeOf(e);function Qn(e,t,n=!1,r=!1){e=e.__v_raw;const i=we(e),s=we(t);n||(t!==s&&Ye(i,"get",t),Ye(i,"get",s));const{has:o}=Dr(i),l=r?Oi:n?zi:Fn;if(o.call(i,t))return l(e.get(t));if(o.call(i,s))return l(e.get(s));e!==i&&e.get(t)}function Xn(e,t=!1){const n=this.__v_raw,r=we(n),i=we(e);return t||(e!==i&&Ye(r,"has",e),Ye(r,"has",i)),e===i?n.has(e):n.has(e)||n.has(i)}function er(e,t=!1){return e=e.__v_raw,!t&&Ye(we(e),"iterate",Vt),Reflect.get(e,"size",e)}function us(e){e=we(e);const t=we(this);return Dr(t).has.call(t,e)||(t.add(e),At(t,"add",e,e)),this}function fs(e,t){t=we(t);const n=we(this),{has:r,get:i}=Dr(n);let s=r.call(n,e);s||(e=we(e),s=r.call(n,e));const o=i.call(n,e);return n.set(e,t),s?Dn(t,o)&&At(n,"set",e,t):At(n,"add",e,t),this}function ds(e){const t=we(this),{has:n,get:r}=Dr(t);let i=n.call(t,e);i||(e=we(e),i=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return i&&At(t,"delete",e,void 0),s}function hs(){const e=we(this),t=e.size!==0,n=e.clear();return t&&At(e,"clear",void 0,void 0),n}function tr(e,t){return function(r,i){const s=this,o=s.__v_raw,l=we(o),a=t?Oi:e?zi:Fn;return!e&&Ye(l,"iterate",Vt),o.forEach((u,c)=>r.call(i,a(u),a(c),s))}}function nr(e,t,n){return function(...r){const i=this.__v_raw,s=we(i),o=Xt(s),l=e==="entries"||e===Symbol.iterator&&o,a=e==="keys"&&o,u=i[e](...r),c=n?Oi:t?zi:Fn;return!t&&Ye(s,"iterate",a?fi:Vt),{next(){const{value:f,done:h}=u.next();return h?{value:f,done:h}:{value:l?[c(f[0]),c(f[1])]:c(f),done:h}},[Symbol.iterator](){return this}}}}function Ct(e){return function(...t){return e==="delete"?!1:this}}function Ya(){const e={get(s){return Qn(this,s)},get size(){return er(this)},has:Xn,add:us,set:fs,delete:ds,clear:hs,forEach:tr(!1,!1)},t={get(s){return Qn(this,s,!1,!0)},get size(){return er(this)},has:Xn,add:us,set:fs,delete:ds,clear:hs,forEach:tr(!1,!0)},n={get(s){return Qn(this,s,!0)},get size(){return er(this,!0)},has(s){return Xn.call(this,s,!0)},add:Ct("add"),set:Ct("set"),delete:Ct("delete"),clear:Ct("clear"),forEach:tr(!0,!1)},r={get(s){return Qn(this,s,!0,!0)},get size(){return er(this,!0)},has(s){return Xn.call(this,s,!0)},add:Ct("add"),set:Ct("set"),delete:Ct("delete"),clear:Ct("clear"),forEach:tr(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=nr(s,!1,!1),n[s]=nr(s,!0,!1),t[s]=nr(s,!1,!0),r[s]=nr(s,!0,!0)}),[e,n,t,r]}const[Qa,Xa,ec,tc]=Ya();function Pi(e,t){const n=t?e?tc:ec:e?Xa:Qa;return(r,i,s)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?r:Reflect.get(Ae(n,i)&&i in r?n:r,i,s)}const nc={get:Pi(!1,!1)},rc={get:Pi(!1,!0)},ic={get:Pi(!0,!1)},Uo=new WeakMap,Ho=new WeakMap,Vo=new WeakMap,sc=new WeakMap;function oc(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function lc(e){return e.__v_skip||!Object.isExtensible(e)?0:oc(wa(e))}function Ot(e){return on(e)?e:Di(e,!1,No,nc,Uo)}function qo(e){return Di(e,!1,Ga,rc,Ho)}function Kt(e){return Di(e,!0,Ja,ic,Vo)}function Di(e,t,n,r,i){if(!Ce(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=i.get(e);if(s)return s;const o=lc(e);if(o===0)return e;const l=new Proxy(e,o===2?r:n);return i.set(e,l),l}function en(e){return on(e)?en(e.__v_raw):!!(e&&e.__v_isReactive)}function on(e){return!!(e&&e.__v_isReadonly)}function _r(e){return!!(e&&e.__v_isShallow)}function Wo(e){return en(e)||on(e)}function we(e){const t=e&&e.__v_raw;return t?we(t):e}function Ko(e){return Er(e,"__v_skip",!0),e}const Fn=e=>Ce(e)?Ot(e):e,zi=e=>Ce(e)?Kt(e):e;function Fi(e){$t&&st&&(e=we(e),Fo(e.dep||(e.dep=$i())))}function Mi(e,t){e=we(e);const n=e.dep;n&&di(n)}function ze(e){return!!(e&&e.__v_isRef===!0)}function G(e){return Zo(e,!1)}function ji(e){return Zo(e,!0)}function Zo(e,t){return ze(e)?e:new ac(e,t)}class ac{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:we(t),this._value=n?t:Fn(t)}get value(){return Fi(this),this._value}set value(t){const n=this.__v_isShallow||_r(t)||on(t);t=n?t:we(t),Dn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Fn(t),Mi(this))}}function Z(e){return ze(e)?e.value:e}const cc={get:(e,t,n)=>Z(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const i=e[t];return ze(i)&&!ze(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Jo(e){return en(e)?e:new Proxy(e,cc)}class uc{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Fi(this),()=>Mi(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function fc(e){return new uc(e)}class dc{constructor(t,n,r,i){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Ti(t,()=>{this._dirty||(this._dirty=!0,Mi(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!i,this.__v_isReadonly=r}get value(){const t=we(this);return Fi(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function hc(e,t,n=!1){let r,i;const s=ae(e);return s?(r=e,i=lt):(r=e.get,i=e.set),new dc(r,i,s||!i,n)}function Tt(e,t,n,r){let i;try{i=r?e(...r):e()}catch(s){Zn(s,t,n)}return i}function at(e,t,n,r){if(ae(e)){const s=Tt(e,t,n,r);return s&&Lo(s)&&s.catch(o=>{Zn(o,t,n)}),s}const i=[];for(let s=0;s>>1;jn(qe[r])ht&&qe.splice(t,1)}function Ec(e){te(e)?tn.push(...e):(!vt||!vt.includes(e,e.allowRecurse?jt+1:jt))&&tn.push(e),Yo()}function ps(e,t=Mn?ht+1:0){for(;tjn(n)-jn(r)),jt=0;jte.id==null?1/0:e.id,vc=(e,t)=>{const n=jn(e)-jn(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Qo(e){hi=!1,Mn=!0,qe.sort(vc);const t=lt;try{for(ht=0;htRe(m)?m.trim():m)),f&&(i=n.map(vr))}let l,a=r[l=Vr(t)]||r[l=Vr(pt(t))];!a&&s&&(a=r[l=Vr(gn(t))]),a&&at(a,e,6,i);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,at(u,e,6,i)}}function Xo(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(i!==void 0)return i;const s=e.emits;let o={},l=!1;if(!ae(e)){const a=u=>{const c=Xo(u,t,!0);c&&(l=!0,je(o,c))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!s&&!l?(Ce(e)&&r.set(e,null),null):(te(s)?s.forEach(a=>o[a]=null):je(o,s),Ce(e)&&r.set(e,o),o)}function Fr(e,t){return!e||!Wn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Ae(e,t[0].toLowerCase()+t.slice(1))||Ae(e,gn(t))||Ae(e,t))}let He=null,el=null;function Ar(e){const t=He;return He=e,el=e&&e.type.__scopeId||null,t}function Ut(e,t=He,n){if(!t||e._n)return e;const r=(...i)=>{r._d&&xs(-1);const s=Ar(t);let o;try{o=e(...i)}finally{Ar(s),r._d&&xs(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function qr(e){const{type:t,vnode:n,proxy:r,withProxy:i,props:s,propsOptions:[o],slots:l,attrs:a,emit:u,render:c,renderCache:f,data:h,setupState:m,ctx:A,inheritAttrs:E}=e;let b,v;const _=Ar(e);try{if(n.shapeFlag&4){const k=i||r;b=it(c.call(k,k,f,s,m,h,A)),v=a}else{const k=t;b=it(k.length>1?k(s,{attrs:a,slots:l,emit:u}):k(s,null)),v=t.props?a:yc(a)}}catch(k){Sn.length=0,Zn(k,e,1),b=le(bt)}let R=b;if(v&&E!==!1){const k=Object.keys(v),{shapeFlag:H}=R;k.length&&H&7&&(o&&k.some(Bi)&&(v=Ac(v,o)),R=an(R,v))}return n.dirs&&(R=an(R),R.dirs=R.dirs?R.dirs.concat(n.dirs):n.dirs),n.transition&&(R.transition=n.transition),b=R,Ar(_),b}const yc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Wn(n))&&((t||(t={}))[n]=e[n]);return t},Ac=(e,t)=>{const n={};for(const r in e)(!Bi(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function bc(e,t,n){const{props:r,children:i,component:s}=e,{props:o,children:l,patchFlag:a}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?ms(r,o,u):!!o;if(a&8){const c=t.dynamicProps;for(let f=0;fe.__isSuspense;function tl(e,t){t&&t.pendingBranch?te(e)?t.effects.push(...e):t.effects.push(e):Ec(e)}function pi(e,t){return Ui(e,null,t)}const rr={};function Fe(e,t,n){return Ui(e,t,n)}function Ui(e,t,{immediate:n,deep:r,flush:i,onTrack:s,onTrigger:o}=Be){var l;const a=Oo()===((l=Oe)==null?void 0:l.scope)?Oe:null;let u,c=!1,f=!1;if(ze(e)?(u=()=>e.value,c=_r(e)):en(e)?(u=()=>e,r=!0):te(e)?(f=!0,c=e.some(k=>en(k)||_r(k)),u=()=>e.map(k=>{if(ze(k))return k.value;if(en(k))return Ht(k);if(ae(k))return Tt(k,a,2)})):ae(e)?t?u=()=>Tt(e,a,2):u=()=>{if(!(a&&a.isUnmounted))return h&&h(),at(e,a,3,[m])}:u=lt,t&&r){const k=u;u=()=>Ht(k())}let h,m=k=>{h=_.onStop=()=>{Tt(k,a,4)}},A;if(un)if(m=lt,t?n&&at(t,a,3,[u(),f?[]:void 0,m]):u(),i==="sync"){const k=Eu();A=k.__watcherHandles||(k.__watcherHandles=[])}else return lt;let E=f?new Array(e.length).fill(rr):rr;const b=()=>{if(_.active)if(t){const k=_.run();(r||c||(f?k.some((H,K)=>Dn(H,E[K])):Dn(k,E)))&&(h&&h(),at(t,a,3,[k,E===rr?void 0:f&&E[0]===rr?[]:E,m]),E=k)}else _.run()};b.allowRecurse=!!t;let v;i==="sync"?v=b:i==="post"?v=()=>Ze(b,a&&a.suspense):(b.pre=!0,a&&(b.id=a.uid),v=()=>zr(b));const _=new Ti(u,v);t?n?b():E=_.run():i==="post"?Ze(_.run.bind(_),a&&a.suspense):_.run();const R=()=>{_.stop(),a&&a.scope&&Ri(a.scope.effects,_)};return A&&A.push(R),R}function xc(e,t,n){const r=this.proxy,i=Re(e)?e.includes(".")?nl(r,e):()=>r[e]:e.bind(r,r);let s;ae(t)?s=t:(s=t.handler,n=t);const o=Oe;cn(this);const l=Ui(i,s.bind(r),n);return o?cn(o):qt(),l}function nl(e,t){const n=t.split(".");return()=>{let r=e;for(let i=0;i{Ht(n,t)});else if($o(e))for(const n in e)Ht(e[n],t);return e}function ir(e,t){const n=He;if(n===null)return e;const r=Nr(n)||n.proxy,i=e.dirs||(e.dirs=[]);for(let s=0;sje({name:e.name},t,{setup:e}))():e}const nn=e=>!!e.type.__asyncLoader;function Ee(e){ae(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:i=200,timeout:s,suspensible:o=!0,onError:l}=e;let a=null,u,c=0;const f=()=>(c++,a=null,h()),h=()=>{let m;return a||(m=a=t().catch(A=>{if(A=A instanceof Error?A:new Error(String(A)),l)return new Promise((E,b)=>{l(A,()=>E(f()),()=>b(A),c+1)});throw A}).then(A=>m!==a&&a?a:(A&&(A.__esModule||A[Symbol.toStringTag]==="Module")&&(A=A.default),u=A,A)))};return Ne({name:"AsyncComponentWrapper",__asyncLoader:h,get __asyncResolved(){return u},setup(){const m=Oe;if(u)return()=>Wr(u,m);const A=_=>{a=null,Zn(_,m,13,!r)};if(o&&m.suspense||un)return h().then(_=>()=>Wr(_,m)).catch(_=>(A(_),()=>r?le(r,{error:_}):null));const E=G(!1),b=G(),v=G(!!i);return i&&setTimeout(()=>{v.value=!1},i),s!=null&&setTimeout(()=>{if(!E.value&&!b.value){const _=new Error(`Async component timed out after ${s}ms.`);A(_),b.value=_}},s),h().then(()=>{E.value=!0,m.parent&&Hi(m.parent.vnode)&&zr(m.parent.update)}).catch(_=>{A(_),b.value=_}),()=>{if(E.value&&u)return Wr(u,m);if(b.value&&r)return le(r,{error:b.value});if(n&&!v.value)return le(n)}}})}function Wr(e,t){const{ref:n,props:r,children:i,ce:s}=t.vnode,o=le(e,r,i);return o.ref=n,o.ce=s,delete t.vnode.ce,o}const Hi=e=>e.type.__isKeepAlive;function Cc(e,t){rl(e,"a",t)}function Bc(e,t){rl(e,"da",t)}function rl(e,t,n=Oe){const r=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Mr(t,r,n),n){let i=n.parent;for(;i&&i.parent;)Hi(i.parent.vnode)&&Rc(r,t,n,i),i=i.parent}}function Rc(e,t,n,r){const i=Mr(t,e,r,!0);_n(()=>{Ri(r[t],i)},n)}function Mr(e,t,n=Oe,r=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;En(),cn(n);const l=at(t,n,e,o);return qt(),vn(),l});return r?i.unshift(s):i.push(s),s}}const wt=e=>(t,n=Oe)=>(!un||e==="sp")&&Mr(e,(...r)=>t(...r),n),Lc=wt("bm"),ut=wt("m"),Sc=wt("bu"),$c=wt("u"),Vi=wt("bum"),_n=wt("um"),Tc=wt("sp"),Ic=wt("rtg"),Oc=wt("rtc");function Pc(e,t=Oe){Mr("ec",e,t)}const il="components";function qi(e,t){return zc(il,e,!0,t)||e}const Dc=Symbol.for("v-ndc");function zc(e,t,n=!0,r=!1){const i=He||Oe;if(i){const s=i.type;if(e===il){const l=pu(s,!1);if(l&&(l===t||l===pt(t)||l===Pr(pt(t))))return s}const o=gs(i[e]||s[e],t)||gs(i.appContext[e],t);return!o&&r?s:o}}function gs(e,t){return e&&(e[t]||e[pt(t)]||e[Pr(pt(t))])}function Je(e,t,n,r){let i;const s=n&&n[r];if(te(e)||Re(e)){i=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,s&&s[l]));else{const o=Object.keys(e);i=new Array(o.length);for(let l=0,a=o.length;lxr(t)?!(t.type===bt||t.type===_e&&!sl(t.children)):!0)?e:null}const mi=e=>e?vl(e)?Nr(e)||e.proxy:mi(e.parent):null,Rn=je(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>mi(e.parent),$root:e=>mi(e.root),$emit:e=>e.emit,$options:e=>Wi(e),$forceUpdate:e=>e.f||(e.f=()=>zr(e.update)),$nextTick:e=>e.n||(e.n=Jn.bind(e.proxy)),$watch:e=>xc.bind(e)}),Zr=(e,t)=>e!==Be&&!e.__isScriptSetup&&Ae(e,t),Fc={get({_:e},t){const{ctx:n,setupState:r,data:i,props:s,accessCache:o,type:l,appContext:a}=e;let u;if(t[0]!=="$"){const m=o[t];if(m!==void 0)switch(m){case 1:return r[t];case 2:return i[t];case 4:return n[t];case 3:return s[t]}else{if(Zr(r,t))return o[t]=1,r[t];if(i!==Be&&Ae(i,t))return o[t]=2,i[t];if((u=e.propsOptions[0])&&Ae(u,t))return o[t]=3,s[t];if(n!==Be&&Ae(n,t))return o[t]=4,n[t];gi&&(o[t]=0)}}const c=Rn[t];let f,h;if(c)return t==="$attrs"&&Ye(e,"get",t),c(e);if((f=l.__cssModules)&&(f=f[t]))return f;if(n!==Be&&Ae(n,t))return o[t]=4,n[t];if(h=a.config.globalProperties,Ae(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;return Zr(i,t)?(i[t]=n,!0):r!==Be&&Ae(r,t)?(r[t]=n,!0):Ae(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:s}},o){let l;return!!n[o]||e!==Be&&Ae(e,o)||Zr(t,o)||(l=s[0])&&Ae(l,o)||Ae(r,o)||Ae(Rn,o)||Ae(i.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Ae(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Es(e){return te(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let gi=!0;function Mc(e){const t=Wi(e),n=e.proxy,r=e.ctx;gi=!1,t.beforeCreate&&vs(t.beforeCreate,e,"bc");const{data:i,computed:s,methods:o,watch:l,provide:a,inject:u,created:c,beforeMount:f,mounted:h,beforeUpdate:m,updated:A,activated:E,deactivated:b,beforeDestroy:v,beforeUnmount:_,destroyed:R,unmounted:k,render:H,renderTracked:K,renderTriggered:O,errorCaptured:P,serverPrefetch:ie,expose:ce,inheritAttrs:ye,components:Y,directives:W,filters:M}=t;if(u&&jc(u,r,null),o)for(const oe in o){const ne=o[oe];ae(ne)&&(r[oe]=ne.bind(n))}if(i){const oe=i.call(n,n);Ce(oe)&&(e.data=Ot(oe))}if(gi=!0,s)for(const oe in s){const ne=s[oe],$e=ae(ne)?ne.bind(n,n):ae(ne.get)?ne.get.bind(n,n):lt,Ie=!ae(ne)&&ae(ne.set)?ne.set.bind(n):lt,Pe=pe({get:$e,set:Ie});Object.defineProperty(r,oe,{enumerable:!0,configurable:!0,get:()=>Pe.value,set:Te=>Pe.value=Te})}if(l)for(const oe in l)ol(l[oe],r,n,oe);if(a){const oe=ae(a)?a.call(n):a;Reflect.ownKeys(oe).forEach(ne=>{rn(ne,oe[ne])})}c&&vs(c,e,"c");function Q(oe,ne){te(ne)?ne.forEach($e=>oe($e.bind(n))):ne&&oe(ne.bind(n))}if(Q(Lc,f),Q(ut,h),Q(Sc,m),Q($c,A),Q(Cc,E),Q(Bc,b),Q(Pc,P),Q(Oc,K),Q(Ic,O),Q(Vi,_),Q(_n,k),Q(Tc,ie),te(ce))if(ce.length){const oe=e.exposed||(e.exposed={});ce.forEach(ne=>{Object.defineProperty(oe,ne,{get:()=>n[ne],set:$e=>n[ne]=$e})})}else e.exposed||(e.exposed={});H&&e.render===lt&&(e.render=H),ye!=null&&(e.inheritAttrs=ye),Y&&(e.components=Y),W&&(e.directives=W)}function jc(e,t,n=lt){te(e)&&(e=Ei(e));for(const r in e){const i=e[r];let s;Ce(i)?"default"in i?s=Me(i.from||r,i.default,!0):s=Me(i.from||r):s=Me(i),ze(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:o=>s.value=o}):t[r]=s}}function vs(e,t,n){at(te(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function ol(e,t,n,r){const i=r.includes(".")?nl(n,r):()=>n[r];if(Re(e)){const s=t[e];ae(s)&&Fe(i,s)}else if(ae(e))Fe(i,e.bind(n));else if(Ce(e))if(te(e))e.forEach(s=>ol(s,t,n,r));else{const s=ae(e.handler)?e.handler.bind(n):t[e.handler];ae(s)&&Fe(i,s,e)}}function Wi(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,l=s.get(t);let a;return l?a=l:!i.length&&!n&&!r?a=t:(a={},i.length&&i.forEach(u=>br(a,u,o,!0)),br(a,t,o)),Ce(t)&&s.set(t,a),a}function br(e,t,n,r=!1){const{mixins:i,extends:s}=t;s&&br(e,s,n,!0),i&&i.forEach(o=>br(e,o,n,!0));for(const o in t)if(!(r&&o==="expose")){const l=Nc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Nc={data:_s,props:ys,emits:ys,methods:xn,computed:xn,beforeCreate:We,created:We,beforeMount:We,mounted:We,beforeUpdate:We,updated:We,beforeDestroy:We,beforeUnmount:We,destroyed:We,unmounted:We,activated:We,deactivated:We,errorCaptured:We,serverPrefetch:We,components:xn,directives:xn,watch:Hc,provide:_s,inject:Uc};function _s(e,t){return t?e?function(){return je(ae(e)?e.call(this,this):e,ae(t)?t.call(this,this):t)}:t:e}function Uc(e,t){return xn(Ei(e),Ei(t))}function Ei(e){if(te(e)){const t={};for(let n=0;n1)return n&&ae(t)?t.call(r&&r.proxy):t}}function Wc(e,t,n,r=!1){const i={},s={};Er(s,jr,1),e.propsDefaults=Object.create(null),al(e,t,i,s);for(const o in e.propsOptions[0])o in i||(i[o]=void 0);n?e.props=r?i:qo(i):e.type.props?e.props=i:e.props=s,e.attrs=s}function Kc(e,t,n,r){const{props:i,attrs:s,vnode:{patchFlag:o}}=e,l=we(i),[a]=e.propsOptions;let u=!1;if((r||o>0)&&!(o&16)){if(o&8){const c=e.vnode.dynamicProps;for(let f=0;f{a=!0;const[h,m]=cl(f,t,!0);je(o,h),m&&l.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!s&&!a)return Ce(e)&&r.set(e,Qt),Qt;if(te(s))for(let c=0;c-1,m[1]=E<0||A-1||Ae(m,"default"))&&l.push(f)}}}const u=[o,l];return Ce(e)&&r.set(e,u),u}function As(e){return e[0]!=="$"}function bs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function ws(e,t){return bs(e)===bs(t)}function ks(e,t){return te(t)?t.findIndex(n=>ws(n,e)):ae(t)&&ws(t,e)?0:-1}const ul=e=>e[0]==="_"||e==="$stable",Ki=e=>te(e)?e.map(it):[it(e)],Zc=(e,t,n)=>{if(t._n)return t;const r=Ut((...i)=>Ki(t(...i)),n);return r._c=!1,r},fl=(e,t,n)=>{const r=e._ctx;for(const i in e){if(ul(i))continue;const s=e[i];if(ae(s))t[i]=Zc(i,s,r);else if(s!=null){const o=Ki(s);t[i]=()=>o}}},dl=(e,t)=>{const n=Ki(t);e.slots.default=()=>n},Jc=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=we(t),Er(t,"_",n)):fl(t,e.slots={})}else e.slots={},t&&dl(e,t);Er(e.slots,jr,1)},Gc=(e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,o=Be;if(r.shapeFlag&32){const l=t._;l?n&&l===1?s=!1:(je(i,t),!n&&l===1&&delete i._):(s=!t.$stable,fl(t,i)),o=t}else t&&(dl(e,t),o={default:1});if(s)for(const l in i)!ul(l)&&!(l in o)&&delete i[l]};function kr(e,t,n,r,i=!1){if(te(e)){e.forEach((h,m)=>kr(h,t&&(te(t)?t[m]:t),n,r,i));return}if(nn(r)&&!i)return;const s=r.shapeFlag&4?Nr(r.component)||r.component.proxy:r.el,o=i?null:s,{i:l,r:a}=e,u=t&&t.r,c=l.refs===Be?l.refs={}:l.refs,f=l.setupState;if(u!=null&&u!==a&&(Re(u)?(c[u]=null,Ae(f,u)&&(f[u]=null)):ze(u)&&(u.value=null)),ae(a))Tt(a,l,12,[o,c]);else{const h=Re(a),m=ze(a);if(h||m){const A=()=>{if(e.f){const E=h?Ae(f,a)?f[a]:c[a]:a.value;i?te(E)&&Ri(E,s):te(E)?E.includes(s)||E.push(s):h?(c[a]=[s],Ae(f,a)&&(f[a]=c[a])):(a.value=[s],e.k&&(c[e.k]=a.value))}else h?(c[a]=o,Ae(f,a)&&(f[a]=o)):m&&(a.value=o,e.k&&(c[e.k]=o))};o?(A.id=-1,Ze(A,n)):A()}}}let Bt=!1;const sr=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",or=e=>e.nodeType===8;function Yc(e){const{mt:t,p:n,o:{patchProp:r,createText:i,nextSibling:s,parentNode:o,remove:l,insert:a,createComment:u}}=e,c=(v,_)=>{if(!_.hasChildNodes()){n(null,v,_),yr(),_._vnode=v;return}Bt=!1,f(_.firstChild,v,null,null,null),yr(),_._vnode=v,Bt&&console.error("Hydration completed but contains mismatches.")},f=(v,_,R,k,H,K=!1)=>{const O=or(v)&&v.data==="[",P=()=>E(v,_,R,k,H,O),{type:ie,ref:ce,shapeFlag:ye,patchFlag:Y}=_;let W=v.nodeType;_.el=v,Y===-2&&(K=!1,_.dynamicChildren=null);let M=null;switch(ie){case ln:W!==3?_.children===""?(a(_.el=i(""),o(v),v),M=v):M=P():(v.data!==_.children&&(Bt=!0,v.data=_.children),M=s(v));break;case bt:W!==8||O?M=P():M=s(v);break;case Ln:if(O&&(v=s(v),W=v.nodeType),W===1||W===3){M=v;const de=!_.children.length;for(let Q=0;Q<_.staticCount;Q++)de&&(_.children+=M.nodeType===1?M.outerHTML:M.data),Q===_.staticCount-1&&(_.anchor=M),M=s(M);return O?s(M):M}else P();break;case _e:O?M=A(v,_,R,k,H,K):M=P();break;default:if(ye&1)W!==1||_.type.toLowerCase()!==v.tagName.toLowerCase()?M=P():M=h(v,_,R,k,H,K);else if(ye&6){_.slotScopeIds=H;const de=o(v);if(t(_,de,null,R,k,sr(de),K),M=O?b(v):s(v),M&&or(M)&&M.data==="teleport end"&&(M=s(M)),nn(_)){let Q;O?(Q=le(_e),Q.anchor=M?M.previousSibling:de.lastChild):Q=v.nodeType===3?Ge(""):le("div"),Q.el=v,_.component.subTree=Q}}else ye&64?W!==8?M=P():M=_.type.hydrate(v,_,R,k,H,K,e,m):ye&128&&(M=_.type.hydrate(v,_,R,k,sr(o(v)),H,K,e,f))}return ce!=null&&kr(ce,null,k,_),M},h=(v,_,R,k,H,K)=>{K=K||!!_.dynamicChildren;const{type:O,props:P,patchFlag:ie,shapeFlag:ce,dirs:ye}=_,Y=O==="input"&&ye||O==="option";if(Y||ie!==-1){if(ye&&dt(_,null,R,"created"),P)if(Y||!K||ie&48)for(const M in P)(Y&&M.endsWith("value")||Wn(M)&&!Bn(M))&&r(v,M,null,P[M],!1,void 0,R);else P.onClick&&r(v,"onClick",null,P.onClick,!1,void 0,R);let W;if((W=P&&P.onVnodeBeforeMount)&&rt(W,R,_),ye&&dt(_,null,R,"beforeMount"),((W=P&&P.onVnodeMounted)||ye)&&tl(()=>{W&&rt(W,R,_),ye&&dt(_,null,R,"mounted")},k),ce&16&&!(P&&(P.innerHTML||P.textContent))){let M=m(v.firstChild,_,v,R,k,H,K);for(;M;){Bt=!0;const de=M;M=M.nextSibling,l(de)}}else ce&8&&v.textContent!==_.children&&(Bt=!0,v.textContent=_.children)}return v.nextSibling},m=(v,_,R,k,H,K,O)=>{O=O||!!_.dynamicChildren;const P=_.children,ie=P.length;for(let ce=0;ce{const{slotScopeIds:O}=_;O&&(H=H?H.concat(O):O);const P=o(v),ie=m(s(v),_,P,R,k,H,K);return ie&&or(ie)&&ie.data==="]"?s(_.anchor=ie):(Bt=!0,a(_.anchor=u("]"),P,ie),ie)},E=(v,_,R,k,H,K)=>{if(Bt=!0,_.el=null,K){const ie=b(v);for(;;){const ce=s(v);if(ce&&ce!==ie)l(ce);else break}}const O=s(v),P=o(v);return l(v),n(null,_,P,O,R,k,sr(P),H),O},b=v=>{let _=0;for(;v;)if(v=s(v),v&&or(v)&&(v.data==="["&&_++,v.data==="]")){if(_===0)return s(v);_--}return v};return[c,f]}const Ze=tl;function Qc(e){return hl(e)}function Xc(e){return hl(e,Yc)}function hl(e,t){const n=ai();n.__VUE__=!0;const{insert:r,remove:i,patchProp:s,createElement:o,createText:l,createComment:a,setText:u,setElementText:c,parentNode:f,nextSibling:h,setScopeId:m=lt,insertStaticContent:A}=e,E=(d,p,g,y=null,w=null,C=null,$=!1,T=null,z=!!p.dynamicChildren)=>{if(d===p)return;d&&!An(d,p)&&(y=x(d),Te(d,w,C,!0),d=null),p.patchFlag===-2&&(z=!1,p.dynamicChildren=null);const{type:L,ref:J,shapeFlag:V}=p;switch(L){case ln:b(d,p,g,y);break;case bt:v(d,p,g,y);break;case Ln:d==null&&_(p,g,y,$);break;case _e:Y(d,p,g,y,w,C,$,T,z);break;default:V&1?H(d,p,g,y,w,C,$,T,z):V&6?W(d,p,g,y,w,C,$,T,z):(V&64||V&128)&&L.process(d,p,g,y,w,C,$,T,z,F)}J!=null&&w&&kr(J,d&&d.ref,C,p||d,!p)},b=(d,p,g,y)=>{if(d==null)r(p.el=l(p.children),g,y);else{const w=p.el=d.el;p.children!==d.children&&u(w,p.children)}},v=(d,p,g,y)=>{d==null?r(p.el=a(p.children||""),g,y):p.el=d.el},_=(d,p,g,y)=>{[d.el,d.anchor]=A(d.children,p,g,y,d.el,d.anchor)},R=({el:d,anchor:p},g,y)=>{let w;for(;d&&d!==p;)w=h(d),r(d,g,y),d=w;r(p,g,y)},k=({el:d,anchor:p})=>{let g;for(;d&&d!==p;)g=h(d),i(d),d=g;i(p)},H=(d,p,g,y,w,C,$,T,z)=>{$=$||p.type==="svg",d==null?K(p,g,y,w,C,$,T,z):ie(d,p,w,C,$,T,z)},K=(d,p,g,y,w,C,$,T)=>{let z,L;const{type:J,props:V,shapeFlag:X,transition:se,dirs:ue}=d;if(z=d.el=o(d.type,C,V&&V.is,V),X&8?c(z,d.children):X&16&&P(d.children,z,null,y,w,C&&J!=="foreignObject",$,T),ue&&dt(d,null,y,"created"),O(z,d,d.scopeId,$,y),V){for(const he in V)he!=="value"&&!Bn(he)&&s(z,he,null,V[he],C,d.children,y,w,Le);"value"in V&&s(z,"value",null,V.value),(L=V.onVnodeBeforeMount)&&rt(L,y,d)}ue&&dt(d,null,y,"beforeMount");const ve=(!w||w&&!w.pendingBranch)&&se&&!se.persisted;ve&&se.beforeEnter(z),r(z,p,g),((L=V&&V.onVnodeMounted)||ve||ue)&&Ze(()=>{L&&rt(L,y,d),ve&&se.enter(z),ue&&dt(d,null,y,"mounted")},w)},O=(d,p,g,y,w)=>{if(g&&m(d,g),y)for(let C=0;C{for(let L=z;L{const T=p.el=d.el;let{patchFlag:z,dynamicChildren:L,dirs:J}=p;z|=d.patchFlag&16;const V=d.props||Be,X=p.props||Be;let se;g&&Mt(g,!1),(se=X.onVnodeBeforeUpdate)&&rt(se,g,p,d),J&&dt(p,d,g,"beforeUpdate"),g&&Mt(g,!0);const ue=w&&p.type!=="foreignObject";if(L?ce(d.dynamicChildren,L,T,g,y,ue,C):$||ne(d,p,T,null,g,y,ue,C,!1),z>0){if(z&16)ye(T,p,V,X,g,y,w);else if(z&2&&V.class!==X.class&&s(T,"class",null,X.class,w),z&4&&s(T,"style",V.style,X.style,w),z&8){const ve=p.dynamicProps;for(let he=0;he{se&&rt(se,g,p,d),J&&dt(p,d,g,"updated")},y)},ce=(d,p,g,y,w,C,$)=>{for(let T=0;T{if(g!==y){if(g!==Be)for(const T in g)!Bn(T)&&!(T in y)&&s(d,T,g[T],null,$,p.children,w,C,Le);for(const T in y){if(Bn(T))continue;const z=y[T],L=g[T];z!==L&&T!=="value"&&s(d,T,L,z,$,p.children,w,C,Le)}"value"in y&&s(d,"value",g.value,y.value)}},Y=(d,p,g,y,w,C,$,T,z)=>{const L=p.el=d?d.el:l(""),J=p.anchor=d?d.anchor:l("");let{patchFlag:V,dynamicChildren:X,slotScopeIds:se}=p;se&&(T=T?T.concat(se):se),d==null?(r(L,g,y),r(J,g,y),P(p.children,g,J,w,C,$,T,z)):V>0&&V&64&&X&&d.dynamicChildren?(ce(d.dynamicChildren,X,g,w,C,$,T),(p.key!=null||w&&p===w.subTree)&&pl(d,p,!0)):ne(d,p,g,J,w,C,$,T,z)},W=(d,p,g,y,w,C,$,T,z)=>{p.slotScopeIds=T,d==null?p.shapeFlag&512?w.ctx.activate(p,g,y,$,z):M(p,g,y,w,C,$,z):de(d,p,z)},M=(d,p,g,y,w,C,$)=>{const T=d.component=cu(d,y,w);if(Hi(d)&&(T.ctx.renderer=F),uu(T),T.asyncDep){if(w&&w.registerDep(T,Q),!d.el){const z=T.subTree=le(bt);v(null,z,p,g)}return}Q(T,d,p,g,w,C,$)},de=(d,p,g)=>{const y=p.component=d.component;if(bc(d,p,g))if(y.asyncDep&&!y.asyncResolved){oe(y,p,g);return}else y.next=p,gc(y.update),y.update();else p.el=d.el,y.vnode=p},Q=(d,p,g,y,w,C,$)=>{const T=()=>{if(d.isMounted){let{next:J,bu:V,u:X,parent:se,vnode:ue}=d,ve=J,he;Mt(d,!1),J?(J.el=ue.el,oe(d,J,$)):J=ue,V&&hr(V),(he=J.props&&J.props.onVnodeBeforeUpdate)&&rt(he,se,J,ue),Mt(d,!0);const be=qr(d),Ue=d.subTree;d.subTree=be,E(Ue,be,f(Ue.el),x(Ue),d,w,C),J.el=be.el,ve===null&&wc(d,be.el),X&&Ze(X,w),(he=J.props&&J.props.onVnodeUpdated)&&Ze(()=>rt(he,se,J,ue),w)}else{let J;const{el:V,props:X}=p,{bm:se,m:ue,parent:ve}=d,he=nn(p);if(Mt(d,!1),se&&hr(se),!he&&(J=X&&X.onVnodeBeforeMount)&&rt(J,ve,p),Mt(d,!0),V&&S){const be=()=>{d.subTree=qr(d),S(V,d.subTree,d,w,null)};he?p.type.__asyncLoader().then(()=>!d.isUnmounted&&be()):be()}else{const be=d.subTree=qr(d);E(null,be,g,y,d,w,C),p.el=be.el}if(ue&&Ze(ue,w),!he&&(J=X&&X.onVnodeMounted)){const be=p;Ze(()=>rt(J,ve,be),w)}(p.shapeFlag&256||ve&&nn(ve.vnode)&&ve.vnode.shapeFlag&256)&&d.a&&Ze(d.a,w),d.isMounted=!0,p=g=y=null}},z=d.effect=new Ti(T,()=>zr(L),d.scope),L=d.update=()=>z.run();L.id=d.uid,Mt(d,!0),L()},oe=(d,p,g)=>{p.component=d;const y=d.vnode.props;d.vnode=p,d.next=null,Kc(d,p.props,y,g),Gc(d,p.children,g),En(),ps(),vn()},ne=(d,p,g,y,w,C,$,T,z=!1)=>{const L=d&&d.children,J=d?d.shapeFlag:0,V=p.children,{patchFlag:X,shapeFlag:se}=p;if(X>0){if(X&128){Ie(L,V,g,y,w,C,$,T,z);return}else if(X&256){$e(L,V,g,y,w,C,$,T,z);return}}se&8?(J&16&&Le(L,w,C),V!==L&&c(g,V)):J&16?se&16?Ie(L,V,g,y,w,C,$,T,z):Le(L,w,C,!0):(J&8&&c(g,""),se&16&&P(V,g,y,w,C,$,T,z))},$e=(d,p,g,y,w,C,$,T,z)=>{d=d||Qt,p=p||Qt;const L=d.length,J=p.length,V=Math.min(L,J);let X;for(X=0;XJ?Le(d,w,C,!0,!1,V):P(p,g,y,w,C,$,T,z,V)},Ie=(d,p,g,y,w,C,$,T,z)=>{let L=0;const J=p.length;let V=d.length-1,X=J-1;for(;L<=V&&L<=X;){const se=d[L],ue=p[L]=z?Rt(p[L]):it(p[L]);if(An(se,ue))E(se,ue,g,null,w,C,$,T,z);else break;L++}for(;L<=V&&L<=X;){const se=d[V],ue=p[X]=z?Rt(p[X]):it(p[X]);if(An(se,ue))E(se,ue,g,null,w,C,$,T,z);else break;V--,X--}if(L>V){if(L<=X){const se=X+1,ue=seX)for(;L<=V;)Te(d[L],w,C,!0),L++;else{const se=L,ue=L,ve=new Map;for(L=ue;L<=X;L++){const Qe=p[L]=z?Rt(p[L]):it(p[L]);Qe.key!=null&&ve.set(Qe.key,L)}let he,be=0;const Ue=X-ue+1;let De=!1,kt=0;const xt=new Array(Ue);for(L=0;L=Ue){Te(Qe,w,C,!0);continue}let ft;if(Qe.key!=null)ft=ve.get(Qe.key);else for(he=ue;he<=X;he++)if(xt[he-ue]===0&&An(Qe,p[he])){ft=he;break}ft===void 0?Te(Qe,w,C,!0):(xt[ft-ue]=L+1,ft>=kt?kt=ft:De=!0,E(Qe,p[ft],g,null,w,C,$,T,z),be++)}const Yn=De?eu(xt):Qt;for(he=Yn.length-1,L=Ue-1;L>=0;L--){const Qe=ue+L,ft=p[Qe],ns=Qe+1{const{el:C,type:$,transition:T,children:z,shapeFlag:L}=d;if(L&6){Pe(d.component.subTree,p,g,y);return}if(L&128){d.suspense.move(p,g,y);return}if(L&64){$.move(d,p,g,F);return}if($===_e){r(C,p,g);for(let V=0;VT.enter(C),w);else{const{leave:V,delayLeave:X,afterLeave:se}=T,ue=()=>r(C,p,g),ve=()=>{V(C,()=>{ue(),se&&se()})};X?X(C,ue,ve):ve()}else r(C,p,g)},Te=(d,p,g,y=!1,w=!1)=>{const{type:C,props:$,ref:T,children:z,dynamicChildren:L,shapeFlag:J,patchFlag:V,dirs:X}=d;if(T!=null&&kr(T,null,g,d,!0),J&256){p.ctx.deactivate(d);return}const se=J&1&&X,ue=!nn(d);let ve;if(ue&&(ve=$&&$.onVnodeBeforeUnmount)&&rt(ve,p,d),J&6)nt(d.component,g,y);else{if(J&128){d.suspense.unmount(g,y);return}se&&dt(d,null,p,"beforeUnmount"),J&64?d.type.remove(d,p,g,w,F,y):L&&(C!==_e||V>0&&V&64)?Le(L,p,g,!1,!0):(C===_e&&V&384||!w&&J&16)&&Le(z,p,g),y&&et(d)}(ue&&(ve=$&&$.onVnodeUnmounted)||se)&&Ze(()=>{ve&&rt(ve,p,d),se&&dt(d,null,p,"unmounted")},g)},et=d=>{const{type:p,el:g,anchor:y,transition:w}=d;if(p===_e){tt(g,y);return}if(p===Ln){k(d);return}const C=()=>{i(g),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(d.shapeFlag&1&&w&&!w.persisted){const{leave:$,delayLeave:T}=w,z=()=>$(g,C);T?T(d.el,C,z):z()}else C()},tt=(d,p)=>{let g;for(;d!==p;)g=h(d),i(d),d=g;i(p)},nt=(d,p,g)=>{const{bum:y,scope:w,update:C,subTree:$,um:T}=d;y&&hr(y),w.stop(),C&&(C.active=!1,Te($,d,p,g)),T&&Ze(T,p),Ze(()=>{d.isUnmounted=!0},p),p&&p.pendingBranch&&!p.isUnmounted&&d.asyncDep&&!d.asyncResolved&&d.suspenseId===p.pendingId&&(p.deps--,p.deps===0&&p.resolve())},Le=(d,p,g,y=!1,w=!1,C=0)=>{for(let $=C;$d.shapeFlag&6?x(d.component.subTree):d.shapeFlag&128?d.suspense.next():h(d.anchor||d.el),N=(d,p,g)=>{d==null?p._vnode&&Te(p._vnode,null,null,!0):E(p._vnode||null,d,p,null,null,null,g),ps(),yr(),p._vnode=d},F={p:E,um:Te,m:Pe,r:et,mt:M,mc:P,pc:ne,pbc:ce,n:x,o:e};let B,S;return t&&([B,S]=t(F)),{render:N,hydrate:B,createApp:qc(N,B)}}function Mt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function pl(e,t,n=!1){const r=e.children,i=t.children;if(te(r)&&te(i))for(let s=0;s>1,e[n[l]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,o=n[s-1];s-- >0;)n[s]=o,o=t[o];return n}const tu=e=>e.__isTeleport,_e=Symbol.for("v-fgt"),ln=Symbol.for("v-txt"),bt=Symbol.for("v-cmt"),Ln=Symbol.for("v-stc"),Sn=[];let ot=null;function I(e=!1){Sn.push(ot=e?null:[])}function nu(){Sn.pop(),ot=Sn[Sn.length-1]||null}let Nn=1;function xs(e){Nn+=e}function ml(e){return e.dynamicChildren=Nn>0?ot||Qt:null,nu(),Nn>0&&ot&&ot.push(e),e}function j(e,t,n,r,i,s){return ml(D(e,t,n,r,i,s,!0))}function Ke(e,t,n,r,i){return ml(le(e,t,n,r,i,!0))}function xr(e){return e?e.__v_isVNode===!0:!1}function An(e,t){return e.type===t.type&&e.key===t.key}const jr="__vInternal",gl=({key:e})=>e??null,pr=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Re(e)||ze(e)||ae(e)?{i:He,r:e,k:t,f:!!n}:e:null);function D(e,t=null,n=null,r=0,i=null,s=e===_e?0:1,o=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&gl(t),ref:t&&pr(t),scopeId:el,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:He};return l?(Zi(a,n),s&128&&e.normalize(a)):n&&(a.shapeFlag|=Re(n)?8:16),Nn>0&&!o&&ot&&(a.patchFlag>0||s&6)&&a.patchFlag!==32&&ot.push(a),a}const le=ru;function ru(e,t=null,n=null,r=0,i=null,s=!1){if((!e||e===Dc)&&(e=bt),xr(e)){const l=an(e,t,!0);return n&&Zi(l,n),Nn>0&&!s&&ot&&(l.shapeFlag&6?ot[ot.indexOf(e)]=l:ot.push(l)),l.patchFlag|=-2,l}if(mu(e)&&(e=e.__vccOpts),t){t=iu(t);let{class:l,style:a}=t;l&&!Re(l)&&(t.class=Se(l)),Ce(a)&&(Wo(a)&&!te(a)&&(a=je({},a)),t.style=zn(a))}const o=Re(e)?1:kc(e)?128:tu(e)?64:Ce(e)?4:ae(e)?2:0;return D(e,t,n,r,i,o,s,!0)}function iu(e){return e?Wo(e)||jr in e?je({},e):e:null}function an(e,t,n=!1){const{props:r,ref:i,patchFlag:s,children:o}=e,l=t?ou(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&gl(l),ref:t&&t.ref?n&&i?te(i)?i.concat(pr(t)):[i,pr(t)]:pr(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==_e?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&an(e.ssContent),ssFallback:e.ssFallback&&an(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ge(e=" ",t=0){return le(ln,null,e,t)}function su(e,t){const n=le(Ln,null,e);return n.staticCount=t,n}function fe(e="",t=!1){return t?(I(),Ke(bt,null,e)):le(bt,null,e)}function it(e){return e==null||typeof e=="boolean"?le(bt):te(e)?le(_e,null,e.slice()):typeof e=="object"?Rt(e):le(ln,null,String(e))}function Rt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:an(e)}function Zi(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(te(t))n=16;else if(typeof t=="object")if(r&65){const i=t.default;i&&(i._c&&(i._d=!1),Zi(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!(jr in t)?t._ctx=He:i===3&&He&&(He.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ae(t)?(t={default:t,_ctx:He},n=32):(t=String(t),r&64?(n=16,t=[Ge(t)]):n=8);e.children=t,e.shapeFlag|=n}function ou(...e){const t={};for(let n=0;nOe||He;let Ji,Jt,Cs="__VUE_INSTANCE_SETTERS__";(Jt=ai()[Cs])||(Jt=ai()[Cs]=[]),Jt.push(e=>Oe=e),Ji=e=>{Jt.length>1?Jt.forEach(t=>t(e)):Jt[0](e)};const cn=e=>{Ji(e),e.scope.on()},qt=()=>{Oe&&Oe.scope.off(),Ji(null)};function vl(e){return e.vnode.shapeFlag&4}let un=!1;function uu(e,t=!1){un=t;const{props:n,children:r}=e.vnode,i=vl(e);Wc(e,n,i,t),Jc(e,r);const s=i?fu(e,t):void 0;return un=!1,s}function fu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ko(new Proxy(e.ctx,Fc));const{setup:r}=n;if(r){const i=e.setupContext=r.length>1?hu(e):null;cn(e),En();const s=Tt(r,e,0,[e.props,i]);if(vn(),qt(),Lo(s)){if(s.then(qt,qt),t)return s.then(o=>{Bs(e,o,t)}).catch(o=>{Zn(o,e,0)});e.asyncDep=s}else Bs(e,s,t)}else _l(e,t)}function Bs(e,t,n){ae(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ce(t)&&(e.setupState=Jo(t)),_l(e,n)}let Rs;function _l(e,t,n){const r=e.type;if(!e.render){if(!t&&Rs&&!r.render){const i=r.template||Wi(e).template;if(i){const{isCustomElement:s,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:a}=r,u=je(je({isCustomElement:s,delimiters:l},o),a);r.render=Rs(i,u)}}e.render=r.render||lt}cn(e),En(),Mc(e),vn(),qt()}function du(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Ye(e,"get","$attrs"),t[n]}}))}function hu(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return du(e)},slots:e.slots,emit:e.emit,expose:t}}function Nr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Jo(Ko(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Rn)return Rn[n](e)},has(t,n){return n in t||n in Rn}}))}function pu(e,t=!0){return ae(e)?e.displayName||e.name:e.name||t&&e.__name}function mu(e){return ae(e)&&"__vccOpts"in e}const pe=(e,t)=>hc(e,t,un);function ge(e,t,n){const r=arguments.length;return r===2?Ce(t)&&!te(t)?xr(t)?le(e,null,[t]):le(e,t):le(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&xr(n)&&(n=[n]),le(e,t,n))}const gu=Symbol.for("v-scx"),Eu=()=>Me(gu),vu="3.3.4",_u="http://www.w3.org/2000/svg",Nt=typeof document<"u"?document:null,Ls=Nt&&Nt.createElement("template"),yu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const i=t?Nt.createElementNS(_u,e):Nt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&i.setAttribute("multiple",r.multiple),i},createText:e=>Nt.createTextNode(e),createComment:e=>Nt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Nt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,i,s){const o=n?n.previousSibling:t.lastChild;if(i&&(i===s||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===s||!(i=i.nextSibling)););else{Ls.innerHTML=r?`${e}`:e;const l=Ls.content;if(r){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Au(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function bu(e,t,n){const r=e.style,i=Re(n);if(n&&!i){if(t&&!Re(t))for(const s in t)n[s]==null&&_i(r,s,"");for(const s in n)_i(r,s,n[s])}else{const s=r.display;i?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=s)}}const Ss=/\s*!important$/;function _i(e,t,n){if(te(n))n.forEach(r=>_i(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=wu(e,t);Ss.test(n)?e.setProperty(gn(r),n.replace(Ss,""),"important"):e[r]=n}}const $s=["Webkit","Moz","ms"],Jr={};function wu(e,t){const n=Jr[t];if(n)return n;let r=pt(t);if(r!=="filter"&&r in e)return Jr[t]=r;r=Pr(r);for(let i=0;i<$s.length;i++){const s=$s[i]+r;if(s in e)return Jr[t]=s}return t}const Ts="http://www.w3.org/1999/xlink";function ku(e,t,n,r,i){if(r&&t.startsWith("xlink:"))n==null?e.removeAttributeNS(Ts,t.slice(6,t.length)):e.setAttributeNS(Ts,t,n);else{const s=$a(t);n==null||s&&!To(n)?e.removeAttribute(t):e.setAttribute(t,s?"":n)}}function xu(e,t,n,r,i,s,o){if(t==="innerHTML"||t==="textContent"){r&&o(r,i,s),e[t]=n??"";return}const l=e.tagName;if(t==="value"&&l!=="PROGRESS"&&!l.includes("-")){e._value=n;const u=l==="OPTION"?e.getAttribute("value"):e.value,c=n??"";u!==c&&(e.value=c),n==null&&e.removeAttribute(t);return}let a=!1;if(n===""||n==null){const u=typeof e[t];u==="boolean"?n=To(n):n==null&&u==="string"?(n="",a=!0):u==="number"&&(n=0,a=!0)}try{e[t]=n}catch{}a&&e.removeAttribute(t)}function _t(e,t,n,r){e.addEventListener(t,n,r)}function Cu(e,t,n,r){e.removeEventListener(t,n,r)}function Bu(e,t,n,r,i=null){const s=e._vei||(e._vei={}),o=s[t];if(r&&o)o.value=r;else{const[l,a]=Ru(t);if(r){const u=s[t]=$u(r,i);_t(e,l,u,a)}else o&&(Cu(e,l,o,a),s[t]=void 0)}}const Is=/(?:Once|Passive|Capture)$/;function Ru(e){let t;if(Is.test(e)){t={};let r;for(;r=e.match(Is);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):gn(e.slice(2)),t]}let Gr=0;const Lu=Promise.resolve(),Su=()=>Gr||(Lu.then(()=>Gr=0),Gr=Date.now());function $u(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;at(Tu(r,n.value),t,5,[r])};return n.value=e,n.attached=Su(),n}function Tu(e,t){if(te(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>i=>!i._stopped&&r&&r(i))}else return t}const Os=/^on[a-z]/,Iu=(e,t,n,r,i=!1,s,o,l,a)=>{t==="class"?Au(e,r,i):t==="style"?bu(e,n,r):Wn(t)?Bi(t)||Bu(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ou(e,t,r,i))?xu(e,t,r,s,o,l,a):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),ku(e,t,r,i))};function Ou(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Os.test(t)&&ae(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Os.test(t)&&Re(n)?!1:t in e}const Pt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return te(t)?n=>hr(t,n):t};function Pu(e){e.target.composing=!0}function Ps(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const yi={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e._assign=Pt(i);const s=r||i.props&&i.props.type==="number";_t(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),s&&(l=vr(l)),e._assign(l)}),n&&_t(e,"change",()=>{e.value=e.value.trim()}),t||(_t(e,"compositionstart",Pu),_t(e,"compositionend",Ps),_t(e,"change",Ps))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:i}},s){if(e._assign=Pt(s),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(i||e.type==="number")&&vr(e.value)===t))return;const o=t??"";e.value!==o&&(e.value=o)}},Du={deep:!0,created(e,t,n){e._assign=Pt(n),_t(e,"change",()=>{const r=e._modelValue,i=fn(e),s=e.checked,o=e._assign;if(te(r)){const l=Si(r,i),a=l!==-1;if(s&&!a)o(r.concat(i));else if(!s&&a){const u=[...r];u.splice(l,1),o(u)}}else if(mn(r)){const l=new Set(r);s?l.add(i):l.delete(i),o(l)}else o(yl(e,s))})},mounted:Ds,beforeUpdate(e,t,n){e._assign=Pt(n),Ds(e,t,n)}};function Ds(e,{value:t,oldValue:n},r){e._modelValue=t,te(t)?e.checked=Si(t,r.props.value)>-1:mn(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=Wt(t,yl(e,!0)))}const zu={created(e,{value:t},n){e.checked=Wt(t,n.props.value),e._assign=Pt(n),_t(e,"change",()=>{e._assign(fn(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=Pt(r),t!==n&&(e.checked=Wt(t,r.props.value))}},Fu={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const i=mn(t);_t(e,"change",()=>{const s=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?vr(fn(o)):fn(o));e._assign(e.multiple?i?new Set(s):s:s[0])}),e._assign=Pt(r)},mounted(e,{value:t}){zs(e,t)},beforeUpdate(e,t,n){e._assign=Pt(n)},updated(e,{value:t}){zs(e,t)}};function zs(e,t){const n=e.multiple;if(!(n&&!te(t)&&!mn(t))){for(let r=0,i=e.options.length;r-1:s.selected=t.has(o);else if(Wt(fn(s),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function fn(e){return"_value"in e?e._value:e.value}function yl(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Mu={created(e,t,n){lr(e,t,n,null,"created")},mounted(e,t,n){lr(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){lr(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){lr(e,t,n,r,"updated")}};function ju(e,t){switch(e){case"SELECT":return Fu;case"TEXTAREA":return yi;default:switch(t){case"checkbox":return Du;case"radio":return zu;default:return yi}}}function lr(e,t,n,r,i){const o=ju(e.tagName,n.props&&n.props.type)[i];o&&o(e,t,n,r)}const Fs={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):bn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),bn(e,!0),r.enter(e)):r.leave(e,()=>{bn(e,!1)}):bn(e,t))},beforeUnmount(e,{value:t}){bn(e,t)}};function bn(e,t){e.style.display=t?e._vod:"none"}const Al=je({patchProp:Iu},yu);let $n,Ms=!1;function Nu(){return $n||($n=Qc(Al))}function Uu(){return $n=Ms?$n:Xc(Al),Ms=!0,$n}const Hu=(...e)=>{const t=Nu().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=bl(r);if(!i)return;const s=t._component;!ae(s)&&!s.render&&!s.template&&(s.template=i.innerHTML),i.innerHTML="";const o=n(i,!1,i instanceof SVGElement);return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},t},Vu=(...e)=>{const t=Uu().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=bl(r);if(i)return n(i,!0,i instanceof SVGElement)},t};function bl(e){return Re(e)?document.querySelector(e):e}const qu={"v-04d0e708":()=>U(()=>import("./79abcd0d.html-47af4901.js"),[]).then(({data:e})=>e),"v-6c73d6db":()=>U(()=>import("./85a3718.html-bec2de7a.js"),[]).then(({data:e})=>e),"v-24188f82":()=>U(()=>import("./d30922d5.html-c9d774a1.js"),[]).then(({data:e})=>e),"v-55334d5c":()=>U(()=>import("./b7629dd4.html-44f13d49.js"),[]).then(({data:e})=>e),"v-0a4f90b1":()=>U(()=>import("./15d9e331.html-a77e6597.js"),[]).then(({data:e})=>e),"v-6c92eadd":()=>U(()=>import("./ecdcd4fc.html-b800b5f4.js"),[]).then(({data:e})=>e),"v-0782f2c1":()=>U(()=>import("./af753a41.html-68680300.js"),[]).then(({data:e})=>e),"v-65e4fc7a":()=>U(()=>import("./49af668f.html-4f108862.js"),[]).then(({data:e})=>e),"v-d874a1a0":()=>U(()=>import("./ff03d5f4.html-14cacdf5.js"),[]).then(({data:e})=>e),"v-867195e6":()=>U(()=>import("./c4877271.html-7c746610.js"),[]).then(({data:e})=>e),"v-1cedfb83":()=>U(()=>import("./aa3015f4.html-92dafd9c.js"),[]).then(({data:e})=>e),"v-b46656c2":()=>U(()=>import("./29596f0c.html-a7ddfb8b.js"),[]).then(({data:e})=>e),"v-112a40d0":()=>U(()=>import("./git.html-b9199f20.js"),[]).then(({data:e})=>e),"v-43b91011":()=>U(()=>import("./7cab1e06.html-c789ffc2.js"),[]).then(({data:e})=>e),"v-174701eb":()=>U(()=>import("./2157fe1d.html-9fef4a27.js"),[]).then(({data:e})=>e),"v-6d631026":()=>U(()=>import("./c7081503.html-a2524c58.js"),[]).then(({data:e})=>e),"v-20253c7f":()=>U(()=>import("./9b7cc1d2.html-a318771d.js"),[]).then(({data:e})=>e),"v-a4e6871e":()=>U(()=>import("./77c5fdb1.html-0bd7b0da.js"),[]).then(({data:e})=>e),"v-e9d2e9e4":()=>U(()=>import("./76a66db0.html-691d3a71.js"),[]).then(({data:e})=>e),"v-905b9eea":()=>U(()=>import("./69a9925d.html-792e5ae6.js"),[]).then(({data:e})=>e),"v-bb3d14f0":()=>U(()=>import("./389d18c2.html-952307de.js"),[]).then(({data:e})=>e),"v-124fddb4":()=>U(()=>import("./36462e02.html-8063d2f3.js"),[]).then(({data:e})=>e),"v-4339b5be":()=>U(()=>import("./2a1f0504.html-11f2c670.js"),[]).then(({data:e})=>e),"v-3e64061e":()=>U(()=>import("./2cf49dc6.html-4bb1a3d6.js"),[]).then(({data:e})=>e),"v-28dbf2be":()=>U(()=>import("./3758805c.html-b9824761.js"),[]).then(({data:e})=>e),"v-2a6e24b9":()=>U(()=>import("./6d80ff7f.html-548940fd.js"),[]).then(({data:e})=>e),"v-8a741eac":()=>U(()=>import("./8f835b6d.html-c1f7f2e5.js"),[]).then(({data:e})=>e),"v-3551ab68":()=>U(()=>import("./9862a150.html-a983562a.js"),[]).then(({data:e})=>e),"v-67bb3c93":()=>U(()=>import("./74684463.html-21bb8fa5.js"),[]).then(({data:e})=>e),"v-e3ac4c4c":()=>U(()=>import("./fd72446f.html-e11f2d19.js"),[]).then(({data:e})=>e),"v-92b3379e":()=>U(()=>import("./9c47706b.html-232b29cd.js"),[]).then(({data:e})=>e),"v-4f301c8a":()=>U(()=>import("./c82dcf86.html-dbd354ab.js"),[]).then(({data:e})=>e),"v-5b013ee8":()=>U(()=>import("./5eef9793.html-dd485dea.js"),[]).then(({data:e})=>e),"v-12caed67":()=>U(()=>import("./589e13eb.html-ccdb7b95.js"),[]).then(({data:e})=>e),"v-3706649a":()=>U(()=>import("./404.html-54df78f4.js"),[]).then(({data:e})=>e)},Wu=JSON.parse('{"base":"/","lang":"zh-CN","title":"","description":"","head":[["link",{"href":"//at.alicdn.com/t/font_1832207_igi8uaupcus.css","rel":"stylesheet"}],["meta",{"name":"yandex-verification","content":"23d49293d84c2e24"}]],"locales":{"tagLine":{},"/":{"lang":"en-US","title":"VuePress","description":"Vue-powered Static Site Generator"},"/zh/":{"lang":"zh-CN.ts-CN","title":"VuePress","description":"Vue 驱动的静态网站生成器"}}}');var Ku=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Zu=e=>{const t=new Set,n=[];return e.forEach(r=>{const i=Ku(r);t.has(i)||(t.add(i),n.push(r))}),n},Ju=e=>/^(https?:)?\/\//.test(e),Gu=e=>Object.prototype.toString.call(e)==="[object Object]",Yu=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Qu=e=>e[0]==="/"?e.slice(1):e,Xu=(e,t)=>{const n=Object.keys(e).sort((r,i)=>{const s=i.split("/").length-r.split("/").length;return s!==0?s:i.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const wl={"v-04d0e708":Ee(()=>U(()=>import("./79abcd0d.html-225294be.js"),[])),"v-6c73d6db":Ee(()=>U(()=>import("./85a3718.html-fa6379ec.js"),[])),"v-24188f82":Ee(()=>U(()=>import("./d30922d5.html-43b5d096.js"),[])),"v-55334d5c":Ee(()=>U(()=>import("./b7629dd4.html-79a9d301.js"),[])),"v-0a4f90b1":Ee(()=>U(()=>import("./15d9e331.html-27f8bca1.js"),[])),"v-6c92eadd":Ee(()=>U(()=>import("./ecdcd4fc.html-e0d6f233.js"),[])),"v-0782f2c1":Ee(()=>U(()=>import("./af753a41.html-bd7919c5.js"),[])),"v-65e4fc7a":Ee(()=>U(()=>import("./49af668f.html-6cc33c8c.js"),[])),"v-d874a1a0":Ee(()=>U(()=>import("./ff03d5f4.html-ef849882.js"),[])),"v-867195e6":Ee(()=>U(()=>import("./c4877271.html-5980451d.js"),[])),"v-1cedfb83":Ee(()=>U(()=>import("./aa3015f4.html-68b9daa5.js"),[])),"v-b46656c2":Ee(()=>U(()=>import("./29596f0c.html-20bdad68.js"),[])),"v-112a40d0":Ee(()=>U(()=>import("./git.html-97b723df.js"),[])),"v-43b91011":Ee(()=>U(()=>import("./7cab1e06.html-93a7ff90.js"),[])),"v-174701eb":Ee(()=>U(()=>import("./2157fe1d.html-06c71e1d.js"),[])),"v-6d631026":Ee(()=>U(()=>import("./c7081503.html-4ba99b2c.js"),[])),"v-20253c7f":Ee(()=>U(()=>import("./9b7cc1d2.html-58a05574.js"),[])),"v-a4e6871e":Ee(()=>U(()=>import("./77c5fdb1.html-1316a7c0.js"),[])),"v-e9d2e9e4":Ee(()=>U(()=>import("./76a66db0.html-bdbcb783.js"),[])),"v-905b9eea":Ee(()=>U(()=>import("./69a9925d.html-14f67bc6.js"),[])),"v-bb3d14f0":Ee(()=>U(()=>import("./389d18c2.html-ff81f812.js"),[])),"v-124fddb4":Ee(()=>U(()=>import("./36462e02.html-2409ae54.js"),[])),"v-4339b5be":Ee(()=>U(()=>import("./2a1f0504.html-5c7ea01b.js"),[])),"v-3e64061e":Ee(()=>U(()=>import("./2cf49dc6.html-049b4a75.js"),[])),"v-28dbf2be":Ee(()=>U(()=>import("./3758805c.html-6c4a5950.js"),[])),"v-2a6e24b9":Ee(()=>U(()=>import("./6d80ff7f.html-5c35da4b.js"),[])),"v-8a741eac":Ee(()=>U(()=>import("./8f835b6d.html-4b5b4fee.js"),[])),"v-3551ab68":Ee(()=>U(()=>import("./9862a150.html-fc4d3a00.js"),[])),"v-67bb3c93":Ee(()=>U(()=>import("./74684463.html-c0ecf027.js"),[])),"v-e3ac4c4c":Ee(()=>U(()=>import("./fd72446f.html-7d3620fb.js"),[])),"v-92b3379e":Ee(()=>U(()=>import("./9c47706b.html-89c50918.js"),[])),"v-4f301c8a":Ee(()=>U(()=>import("./c82dcf86.html-dee9609e.js"),[])),"v-5b013ee8":Ee(()=>U(()=>import("./5eef9793.html-edf9c100.js"),[])),"v-12caed67":Ee(()=>U(()=>import("./589e13eb.html-4d1c0041.js"),[])),"v-3706649a":Ee(()=>U(()=>import("./404.html-683716ce.js"),[]))};var ef=Symbol(""),kl=Symbol(""),tf=Kt({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),Ur=()=>{const e=Me(kl);if(!e)throw new Error("pageData() is called without provider.");return e},xl=Symbol(""),Cl=()=>{const e=Me(xl);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Bl=Symbol(""),nf=()=>{const e=Me(Bl);if(!e)throw new Error("usePageHead() is called without provider.");return e},rf=Symbol(""),Rl=Symbol(""),Ll=()=>{const e=Me(Rl);if(!e)throw new Error("usePageLang() is called without provider.");return e},Sl=Symbol(""),sf=()=>{const e=Me(Sl);if(!e)throw new Error("usePageLayout() is called without provider.");return e},of=G(qu),$l=Symbol(""),Yt=G(Wu),Tl=()=>Yt,lf=Symbol(""),af=Symbol(""),cf="Layout",uf="NotFound",gt=Ot({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=of.value[e];return await(t==null?void 0:t())??tf},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=Re(t.description)?t.description:n.description,i=[...te(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return Zu(i)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const r=e.frontmatter.layout;Re(r)?n=r:n=cf}else n=uf;return t[n]},resolveRouteLocale:(e,t)=>Xu(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),ff=Ne({name:"ClientOnly",setup(e,t){const n=G(!1);return ut(()=>{n.value=!0}),()=>{var r,i;return n.value?(i=(r=t.slots).default)==null?void 0:i.call(r):null}}}),Il=Ne({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=Ur(),n=pe(()=>wl[e.pageKey||t.value.key]);return()=>n.value?ge(n.value):ge("div","404 Not Found")}}),Ol=(e={})=>e,df=e=>Ju(e)?e:`/${Qu(e)}`;const hf=JSON.parse('{"url":"https://blog.dragondyt.top","serverURL":"https://api.dragondyt.top/api"}'),pf=G(hf),Pl=()=>pf,mf=Symbol(""),gf=(e,t)=>{const{locales:n,...r}=e;return{...r,...n==null?void 0:n[t]}},Ef=Ol({enhance({app:e}){const t=Pl(),n=e._context.provides[$l],r=pe(()=>gf(t.value,n.value));e.provide(mf,r),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return r.value}}})}}),vf={class:"text-[1em] leading-[1.8] overflow-hidden text-ellipsis whitespace-nowrap"},_f=["href"],yf={class:"toc-number"},Af={class:"toc-text"},bf=Ne({__name:"TocItem",props:{header:{required:!0},index:{type:Number,required:!0},pIndex:{type:Number,default:0}},setup(e){const t=()=>{console.log("anchorScroll")};return(n,r)=>(I(),j("li",vf,[D("a",{href:e.header.link,onClick:t},[D("span",yf,me(e.pIndex===0?"":e.pIndex+".")+me(e.index)+". ",1),D("span",Af,me(e.header.title),1)],8,_f),e.header.children&&e.header.children.length>0?(I(),Ke(Dl,{key:0,headers:e.header.children,pIndex:e.index},null,8,["headers","pIndex"])):(I(),j(_e,{key:1},[],64))]))}}),Ft=(e,t)=>{const n=e.__vccOpts||e;for(const[r,i]of t)n[r]=i;return n},wf=Ft(bf,[["__file","TocItem.vue"]]),kf={class:"p-[0_.125rem_.3125rem_.625rem] text-left"},xf=Ne({__name:"Toc",props:{headers:{required:!0},pIndex:{type:Number,default:0}},setup(e){return(t,n)=>(I(),j("ol",kf,[(I(!0),j(_e,null,Je(e.headers,(r,i)=>(I(),Ke(wf,{key:i,header:r,index:i+1,"p-index":e.pIndex},null,8,["header","index","p-index"]))),128))]))}}),Dl=Ft(xf,[["__file","Toc.vue"]]),Cf={class:"my-0 mx-auto w-full"},Bf={class:"flex flex-col justify-center items-center"},Rf={class:"flex flex-col justify-center items-center"},Lf=D("div",{class:"fixed top-0 left-0 w-full h-[70vh] min-h-[25rem] -z-[9] bg-[#363636] before:content-[''] before:block before:absolute before:w-full before:h-full before:top-0 before:left-0 before:z-[1] before:bg-[rgba(0,0,0,.2)] before:transition duration-200"},[D("ul",null,[D("li",{class:"w-full h-full absolute top-0 left-0 bg-cover bg-center bg-no-repeat opacity-0 z-0 [backface-visibility:hidden] [transform-style:preserve-3d] animate-[imageAnimation_36s_linear_infinite_0s]"})]),D("img",{src:"",alt:"封面"})],-1),Sf={id:"main"},$f=su('
  • 文章目录
  • ',3),Tf=[$f],If={class:"overflow-x-hidden overflow-y-auto w-auto h-full my-0 mx-auto"},Of={class:"block p-[.875rem_.9375rem_2rem]"},Pf=D("div",{class:"block p-[.875rem_.9375rem_2rem]"},null,-1),Df=D("div",{class:"block p-[.875rem_.9375rem_2rem]"},null,-1),zf=D("div",{class:"dimmer"},null,-1),Ff=D("footer",{id:"footer"},[D("div")],-1),Mf=Ne({__name:"BaseLayout",setup(e){const t=G(),n=G(),r=G(),i=G(),s=G(),o=G(),l=G(),a=G(!1);let u,c,f,h=0;const m={x:"undefined",y:"undefined"},A=Ur(),E=()=>{switch(document.visibilityState){case"hidden":document.title="(´Д`)大変だ!",clearTimeout(u);break;case"visible":document.title="(●´3`●)やれやれだぜ",u=setTimeout(()=>{document.title=A.value.title},2e3);break}},b=()=>{const _=window.pageYOffset>c,R=window.pageYOffset>0;t.value.classList.toggle("show",_),i.value.classList.toggle("affix",R),a.value=window.pageYOffset>f&&document.body.offsetWidth>991,r.value.classList.toggle("affix",a.value),typeof m.y>"u"&&(m.y=window.pageYOffset),h=m.y-window.pageYOffset,h<0?(t.value.classList.remove("up"),t.value.classList.toggle("down",_)):h>0&&(t.value.classList.remove("down"),t.value.classList.toggle("up",_)),m.y=window.pageYOffset},v=()=>{var _;c=n.value.getBoundingClientRect().height,f=c+((_=s.value)==null?void 0:_.getBoundingClientRect().height)};return ut(()=>{document.addEventListener("visibilitychange",E),window.addEventListener("scroll",b),window.addEventListener("resize",v),v()}),Vi(()=>{document.removeEventListener("visibilitychange",E),window.removeEventListener("scroll",b),window.removeEventListener("resize",v)}),(_,R)=>(I(),j(_e,null,[D("header",{id:"header",ref_key:"siteHeader",ref:n},[D("div",Cf,[D("div",{ref_key:"siteBrand",ref:i,class:"-z-[1] h-[50vh] w-full min-h-[10rem] fixed text-center flex flex-col justify-center items-center pt-12 px-20 pb-0"},[D("div",Bf,[Kr(_.$slots,"header")])],512),D("nav",{id:"nav",ref_key:"siteNav",ref:t},[D("div",Rf,[D("div",{ref_key:"menuToggle",ref:l},null,512)])],512)]),Lf],512),D("div",{id:"waves",ref_key:"waves",ref:s},null,512),D("main",null,[D("div",{ref_key:"mainInner",ref:o,class:"flex items-start justify-between w-[calc(100%-.625rem)] xl:w-[72.5rem] 2xl:w-[73%] my-0 mx-auto"},[D("div",Sf,[Kr(_.$slots,"content")]),D("div",{id:"sidebar",ref_key:"sideBar",ref:r},[Kr(_.$slots,"sidebar",{},()=>[D("div",{class:Se(["w-[15rem] text-[var(--grey-6)] text-center flex justify-around items-start flex-wrap z-[1]",{fixed:a.value,relative:!a.value,"top-0":a.value}])},[D("ul",{class:Se(["absolute inline-flex m-0 px-0 pb-2.5 min-h-[1.875rem]",{"pt-2.5":a.value}])},Tf,2),D("div",{class:Se(["w-full overflow-hidden",{"pt-[3.625rem]":a.value,"p-[4.6875rem_0_2rem]":!a.value}])},[D("div",If,[D("div",Of,[le(Dl,{headers:Z(A).headers},null,8,["headers"])]),Pf,Df])],2)],2)])],512),zf],512)]),Ff],64))}});const zl=Ft(Mf,[["__file","BaseLayout.vue"]]),jf=Ne({__name:"IndexLayout",setup(e){return(t,n)=>(I(),Ke(zl,null,{default:Ut(()=>[Ge("index")]),_:1}))}}),Nf=Ft(jf,[["__file","IndexLayout.vue"]]),Uf={class:"py-0 px-4"},Hf={class:"body md"},Vf={key:0,class:"text-left mt-2.5 text-[.75em]"},qf=["data-path"],Wf=Ne({__name:"Article",setup(e){const t=Ur(),n=Cl();return ut(()=>{document.body.querySelectorAll("figure.highlight").forEach(i=>{const s=i.querySelector(".code-container"),o=i.querySelector("figcaption"),l=i.querySelector(".copy-btn"),a=i.querySelector(".breakline-btn"),u=i.querySelector(".fullscreen-btn");l==null||l.addEventListener("click",f),l==null||l.addEventListener("mouseleave",h),a==null||a.addEventListener("click",m),u==null||u.addEventListener("click",A),o&&o.addEventListener("click",A);const c=s==null?void 0:s.querySelector(".show-btn");c&&s.querySelectorAll("tr").length>15&&c.addEventListener("click",E);function f(b){}function h(b){}function m(b){}function A(b){}function E(b){}})}),(r,i)=>{const s=qi("RouterLink");return I(),j("article",Uf,[D("div",Hf,[le(Z(Il)),Z(n).tags?(I(),j("div",Vf,[(I(!0),j(_e,null,Je(Z(n).tags,o=>(I(),Ke(s,{key:o.path,class:"inline-block relative py-0 px-[0.3125rem] rounded-[0.3125rem] bg-[var(--note-bg)] text-[var(--note-text)] [border-bottom:none] [&:not(:last-child)]:mr-2.5",to:o.path},{default:Ut(()=>[Ge(me(o.name),1)]),_:2},1032,["to"]))),128))])):(I(),j(_e,{key:1},[],64))]),D("footer",null,[Ge(" 评论数 "),D("span",{class:"waline-pageview-count","data-path":Z(t).path},null,8,qf)])])}}});const Kf=Ft(Wf,[["__scopeId","data-v-215ea2f0"],["__file","Article.vue"]]);function js(e,t){var n;const r=ji();return pi(()=>{r.value=e()},{...t,flush:(n=t==null?void 0:t.flush)!=null?n:"sync"}),Kt(r)}function Zf(e,t){let n,r,i;const s=G(!0),o=()=>{s.value=!0,i()};Fe(e,o,{flush:"sync"});const l=typeof t=="function"?t:t.get,a=typeof t=="function"?void 0:t.set,u=fc((c,f)=>(r=c,i=f,{get(){return s.value&&(n=l(),s.value=!1),r(),n},set(h){a==null||a(h)}}));return Object.isExtensible(u)&&(u.trigger=o),u}function Un(e){return Oo()?(Pa(e),!0):!1}function yt(e){return typeof e=="function"?e():Z(e)}const Cr=typeof window<"u"&&typeof document<"u",Jf=Object.prototype.toString,Gf=e=>Jf.call(e)==="[object Object]",Br=()=>{};function Fl(e,t){function n(...r){return new Promise((i,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(i).catch(s)})}return n}const Ml=e=>e();function Yf(e,t={}){let n,r,i=Br;const s=l=>{clearTimeout(l),i(),i=Br};return l=>{const a=yt(e),u=yt(t.maxWait);return n&&s(n),a<=0||u!==void 0&&u<=0?(r&&(s(r),r=null),Promise.resolve(l())):new Promise((c,f)=>{i=t.rejectOnCancel?f:c,u&&!r&&(r=setTimeout(()=>{n&&s(n),r=null,c(l())},u)),n=setTimeout(()=>{r&&s(r),r=null,c(l())},a)})}}function Qf(e=Ml){const t=G(!0);function n(){t.value=!1}function r(){t.value=!0}const i=(...s)=>{t.value&&e(...s)};return{isActive:Kt(t),pause:n,resume:r,eventFilter:i}}function Xf(e,t=200,n={}){return Fl(Yf(t,n),e)}function ed(e,t,n={}){const{eventFilter:r=Ml,...i}=n;return Fe(e,Fl(r,t),i)}function td(e,t,n={}){const{eventFilter:r,...i}=n,{eventFilter:s,pause:o,resume:l,isActive:a}=Qf(r);return{stop:ed(e,t,{...i,eventFilter:s}),pause:o,resume:l,isActive:a}}function jl(e,t=!0){El()?ut(e):t?e():Jn(e)}function nd(e){El()&&_n(e)}function rd(e,t=1e3,n={}){const{immediate:r=!0,immediateCallback:i=!1}=n;let s=null;const o=G(!1);function l(){s&&(clearInterval(s),s=null)}function a(){o.value=!1,l()}function u(){const c=yt(t);c<=0||(o.value=!0,i&&e(),l(),s=setInterval(e,c))}if(r&&Cr&&u(),ze(t)||typeof t=="function"){const c=Fe(t,()=>{o.value&&Cr&&u()});Un(c)}return Un(a),{isActive:o,pause:a,resume:u}}function id(e){var t;const n=yt(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Rr=Cr?window:void 0,Nl=Cr?window.document:void 0;function Ns(...e){let t,n,r,i;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,i]=e,t=Rr):[t,n,r,i]=e,!t)return Br;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],o=()=>{s.forEach(c=>c()),s.length=0},l=(c,f,h,m)=>(c.addEventListener(f,h,m),()=>c.removeEventListener(f,h,m)),a=Fe(()=>[id(t),yt(i)],([c,f])=>{if(o(),!c)return;const h=Gf(f)?{...f}:f;s.push(...n.flatMap(m=>r.map(A=>l(c,m,A,h))))},{immediate:!0,flush:"post"}),u=()=>{a(),o()};return Un(u),u}function sd(e,t={}){const{immediate:n=!0,window:r=Rr}=t,i=G(!1);let s=0,o=null;function l(c){if(!i.value||!r)return;const f=c-(s||c);e({delta:f,timestamp:c}),s=c,o=r.requestAnimationFrame(l)}function a(){!i.value&&r&&(i.value=!0,o=r.requestAnimationFrame(l))}function u(){i.value=!1,o!=null&&r&&(r.cancelAnimationFrame(o),o=null)}return n&&a(),Un(u),{isActive:Kt(i),pause:u,resume:a}}const ar=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},cr="__vueuse_ssr_handlers__",od=ld();function ld(){return cr in ar||(ar[cr]=ar[cr]||{}),ar[cr]}function ad(e,t){return od[e]||t}function cd(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const ud={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Us="vueuse-storage";function dn(e,t,n,r={}){var i;const{flush:s="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:a=!0,mergeDefaults:u=!1,shallow:c,window:f=Rr,eventFilter:h,onError:m=P=>{console.error(P)}}=r,A=(c?ji:G)(t);if(!n)try{n=ad("getDefaultStorage",()=>{var P;return(P=Rr)==null?void 0:P.localStorage})()}catch(P){m(P)}if(!n)return A;const E=yt(t),b=cd(E),v=(i=r.serializer)!=null?i:ud[b],{pause:_,resume:R}=td(A,()=>k(A.value),{flush:s,deep:o,eventFilter:h});return f&&l&&(Ns(f,"storage",O),Ns(f,Us,K)),O(),A;function k(P){try{if(P==null)n.removeItem(e);else{const ie=v.write(P),ce=n.getItem(e);ce!==ie&&(n.setItem(e,ie),f&&f.dispatchEvent(new CustomEvent(Us,{detail:{key:e,oldValue:ce,newValue:ie,storageArea:n}})))}}catch(ie){m(ie)}}function H(P){const ie=P?P.newValue:n.getItem(e);if(ie==null)return a&&E!==null&&n.setItem(e,v.write(E)),E;if(!P&&u){const ce=v.read(ie);return typeof u=="function"?u(ce,E):b==="object"&&!Array.isArray(ce)?{...E,...ce}:ce}else return typeof ie!="string"?ie:v.read(ie)}function K(P){O(P.detail)}function O(P){if(!(P&&P.storageArea!==n)){if(P&&P.key==null){A.value=E;return}if(!(P&&P.key!==e)){_();try{(P==null?void 0:P.newValue)!==v.write(A.value)&&(A.value=H(P))}catch(ie){m(ie)}finally{P?Jn(R):R()}}}}}function fd(e={}){const{controls:t=!1,interval:n="requestAnimationFrame"}=e,r=G(new Date),i=()=>r.value=new Date,s=n==="requestAnimationFrame"?sd(i,{immediate:!0}):rd(i,n,{immediate:!0});return t?{now:r,...s}:r}function dd(e,t=Br,n={}){const{immediate:r=!0,manual:i=!1,type:s="text/javascript",async:o=!0,crossOrigin:l,referrerPolicy:a,noModule:u,defer:c,document:f=Nl,attrs:h={}}=n,m=G(null);let A=null;const E=_=>new Promise((R,k)=>{const H=P=>(m.value=P,R(P),P);if(!f){R(!1);return}let K=!1,O=f.querySelector(`script[src="${yt(e)}"]`);O?O.hasAttribute("data-loaded")&&H(O):(O=f.createElement("script"),O.type=s,O.async=o,O.src=yt(e),c&&(O.defer=c),l&&(O.crossOrigin=l),u&&(O.noModule=u),a&&(O.referrerPolicy=a),Object.entries(h).forEach(([P,ie])=>O==null?void 0:O.setAttribute(P,ie)),K=!0),O.addEventListener("error",P=>k(P)),O.addEventListener("abort",P=>k(P)),O.addEventListener("load",()=>{O.setAttribute("data-loaded","true"),t(O),H(O)}),K&&(O=f.head.appendChild(O)),_||H(O)}),b=(_=!0)=>(A||(A=E(_)),A),v=()=>{if(!f)return;A=null,m.value&&(m.value=null);const _=f.querySelector(`script[src="${yt(e)}"]`);_&&f.head.removeChild(_)};return r&&!i&&jl(b),i||nd(v),{scriptTag:m,load:b,unload:v}}let hd=0;function pd(e,t={}){const n=G(!1),{document:r=Nl,immediate:i=!0,manual:s=!1,id:o=`vueuse_styletag_${++hd}`}=t,l=G(e);let a=()=>{};const u=()=>{if(!r)return;const f=r.getElementById(o)||r.createElement("style");f.isConnected||(f.id=o,t.media&&(f.media=t.media),r.head.appendChild(f)),!n.value&&(a=Fe(l,h=>{f.textContent=h},{immediate:!0}),n.value=!0)},c=()=>{!r||!n.value||(a(),r.head.removeChild(r.getElementById(o)),n.value=!1)};return i&&!s&&jl(u),s||Un(c),{id:o,css:l,unload:c,load:u,isLoaded:Kt(n)}}var Tn=new Map;function md(e){var t=Tn.get(e);t&&t.destroy()}function gd(e){var t=Tn.get(e);t&&t.update()}var Cn=null;typeof window>"u"?((Cn=function(e){return e}).destroy=function(e){return e},Cn.update=function(e){return e}):((Cn=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(n){return function(r){if(r&&r.nodeName&&r.nodeName==="TEXTAREA"&&!Tn.has(r)){var i,s=null,o=window.getComputedStyle(r),l=(i=r.value,function(){u({testForHeightReduction:i===""||!r.value.startsWith(i),restoreTextAlign:null}),i=r.value}),a=(function(f){r.removeEventListener("autosize:destroy",a),r.removeEventListener("autosize:update",c),r.removeEventListener("input",l),window.removeEventListener("resize",c),Object.keys(f).forEach(function(h){return r.style[h]=f[h]}),Tn.delete(r)}).bind(r,{height:r.style.height,resize:r.style.resize,textAlign:r.style.textAlign,overflowY:r.style.overflowY,overflowX:r.style.overflowX,wordWrap:r.style.wordWrap});r.addEventListener("autosize:destroy",a),r.addEventListener("autosize:update",c),r.addEventListener("input",l),window.addEventListener("resize",c),r.style.overflowX="hidden",r.style.wordWrap="break-word",Tn.set(r,{destroy:a,update:c}),c()}function u(f){var h,m,A=f.restoreTextAlign,E=A===void 0?null:A,b=f.testForHeightReduction,v=b===void 0||b,_=o.overflowY;if(r.scrollHeight!==0&&(o.resize==="vertical"?r.style.resize="none":o.resize==="both"&&(r.style.resize="horizontal"),v&&(h=function(k){for(var H=[];k&&k.parentNode&&k.parentNode instanceof Element;)k.parentNode.scrollTop&&H.push([k.parentNode,k.parentNode.scrollTop]),k=k.parentNode;return function(){return H.forEach(function(K){var O=K[0],P=K[1];O.style.scrollBehavior="auto",O.scrollTop=P,O.style.scrollBehavior=null})}}(r),r.style.height=""),m=o.boxSizing==="content-box"?r.scrollHeight-(parseFloat(o.paddingTop)+parseFloat(o.paddingBottom)):r.scrollHeight+parseFloat(o.borderTopWidth)+parseFloat(o.borderBottomWidth),o.maxHeight!=="none"&&m>parseFloat(o.maxHeight)?(o.overflowY==="hidden"&&(r.style.overflow="scroll"),m=parseFloat(o.maxHeight)):o.overflowY!=="hidden"&&(r.style.overflow="hidden"),r.style.height=m+"px",E&&(r.style.textAlign=E),h&&h(),s!==m&&(r.dispatchEvent(new Event("autosize:resized",{bubbles:!0})),s=m),_!==o.overflow&&!E)){var R=o.textAlign;o.overflow==="hidden"&&(r.style.textAlign=R==="start"?"end":"start"),u({restoreTextAlign:R,testForHeightReduction:!0})}}function c(){u({testForHeightReduction:!0,restoreTextAlign:null})}}(n)}),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],md),e},Cn.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],gd),e});var Hs=Cn;function Ul(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,hooks:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}let Zt=Ul();function Ed(e){Zt=e}const Hl=/[&<>"']/,vd=new RegExp(Hl.source,"g"),Vl=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,_d=new RegExp(Vl.source,"g"),yd={"&":"&","<":"<",">":">",'"':""","'":"'"},Vs=e=>yd[e];function Ve(e,t){if(t){if(Hl.test(e))return e.replace(vd,Vs)}else if(Vl.test(e))return e.replace(_d,Vs);return e}const Ad=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function ql(e){return e.replace(Ad,(t,n)=>(n=n.toLowerCase(),n==="colon"?":":n.charAt(0)==="#"?n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1)):""))}const bd=/(^|[^\[])\^/g;function xe(e,t){e=typeof e=="string"?e:e.source,t=t||"";const n={replace:(r,i)=>(i=i.source||i,i=i.replace(bd,"$1"),e=e.replace(r,i),n),getRegex:()=>new RegExp(e,t)};return n}const wd=/[^\w:]/g,kd=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function qs(e,t,n){if(e){let r;try{r=decodeURIComponent(ql(n)).replace(wd,"").toLowerCase()}catch{return null}if(r.indexOf("javascript:")===0||r.indexOf("vbscript:")===0||r.indexOf("data:")===0)return null}t&&!kd.test(n)&&(n=Rd(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch{return null}return n}const ur={},xd=/^[^:]+:\/*[^/]*$/,Cd=/^([^:]+:)[\s\S]*$/,Bd=/^([^:]+:\/*[^/]*)[\s\S]*$/;function Rd(e,t){ur[" "+e]||(xd.test(e)?ur[" "+e]=e+"/":ur[" "+e]=mr(e,"/",!0)),e=ur[" "+e];const n=e.indexOf(":")===-1;return t.substring(0,2)==="//"?n?t:e.replace(Cd,"$1")+t:t.charAt(0)==="/"?n?t:e.replace(Bd,"$1")+t:e+t}const Lr={exec:function(){}};function Ws(e,t){const n=e.replace(/\|/g,(s,o,l)=>{let a=!1,u=o;for(;--u>=0&&l[u]==="\\";)a=!a;return a?"|":" |"}),r=n.split(/ \|/);let i=0;if(r[0].trim()||r.shift(),r.length>0&&!r[r.length-1].trim()&&r.pop(),r.length>t)r.splice(t);else for(;r.length1;)t&1&&(n+=e),t>>=1,e+=e;return n+e}function Zs(e,t,n,r){const i=t.href,s=t.title?Ve(t.title):null,o=e[1].replace(/\\([\[\]])/g,"$1");if(e[0].charAt(0)!=="!"){r.state.inLink=!0;const l={type:"link",raw:n,href:i,title:s,text:o,tokens:r.inlineTokens(o)};return r.state.inLink=!1,l}return{type:"image",raw:n,href:i,title:s,text:Ve(o)}}function $d(e,t){const n=e.match(/^(\s+)(?:```)/);if(n===null)return t;const r=n[1];return t.split(` +`).map(i=>{const s=i.match(/^\s+/);if(s===null)return i;const[o]=s;return o.length>=r.length?i.slice(r.length):i}).join(` +`)}class Gi{constructor(t){this.options=t||Zt}space(t){const n=this.rules.block.newline.exec(t);if(n&&n[0].length>0)return{type:"space",raw:n[0]}}code(t){const n=this.rules.block.code.exec(t);if(n){const r=n[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:n[0],codeBlockStyle:"indented",text:this.options.pedantic?r:mr(r,` +`)}}}fences(t){const n=this.rules.block.fences.exec(t);if(n){const r=n[0],i=$d(r,n[3]||"");return{type:"code",raw:r,lang:n[2]?n[2].trim().replace(this.rules.inline._escapes,"$1"):n[2],text:i}}}heading(t){const n=this.rules.block.heading.exec(t);if(n){let r=n[2].trim();if(/#$/.test(r)){const i=mr(r,"#");(this.options.pedantic||!i||/ $/.test(i))&&(r=i.trim())}return{type:"heading",raw:n[0],depth:n[1].length,text:r,tokens:this.lexer.inline(r)}}}hr(t){const n=this.rules.block.hr.exec(t);if(n)return{type:"hr",raw:n[0]}}blockquote(t){const n=this.rules.block.blockquote.exec(t);if(n){const r=n[0].replace(/^ *>[ \t]?/gm,""),i=this.lexer.state.top;this.lexer.state.top=!0;const s=this.lexer.blockTokens(r);return this.lexer.state.top=i,{type:"blockquote",raw:n[0],tokens:s,text:r}}}list(t){let n=this.rules.block.list.exec(t);if(n){let r,i,s,o,l,a,u,c,f,h,m,A,E=n[1].trim();const b=E.length>1,v={type:"list",raw:"",ordered:b,start:b?+E.slice(0,-1):"",loose:!1,items:[]};E=b?`\\d{1,9}\\${E.slice(-1)}`:`\\${E}`,this.options.pedantic&&(E=b?E:"[*+-]");const _=new RegExp(`^( {0,3}${E})((?:[ ][^\\n]*)?(?:\\n|$))`);for(;t&&(A=!1,!(!(n=_.exec(t))||this.rules.block.hr.test(t)));){if(r=n[0],t=t.substring(r.length),c=n[2].split(` +`,1)[0].replace(/^\t+/,k=>" ".repeat(3*k.length)),f=t.split(` +`,1)[0],this.options.pedantic?(o=2,m=c.trimLeft()):(o=n[2].search(/[^ ]/),o=o>4?1:o,m=c.slice(o),o+=n[1].length),a=!1,!c&&/^ *$/.test(f)&&(r+=f+` +`,t=t.substring(f.length+1),A=!0),!A){const k=new RegExp(`^ {0,${Math.min(3,o-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),H=new RegExp(`^ {0,${Math.min(3,o-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),K=new RegExp(`^ {0,${Math.min(3,o-1)}}(?:\`\`\`|~~~)`),O=new RegExp(`^ {0,${Math.min(3,o-1)}}#`);for(;t&&(h=t.split(` +`,1)[0],f=h,this.options.pedantic&&(f=f.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),!(K.test(f)||O.test(f)||k.test(f)||H.test(t)));){if(f.search(/[^ ]/)>=o||!f.trim())m+=` +`+f.slice(o);else{if(a||c.search(/[^ ]/)>=4||K.test(c)||O.test(c)||H.test(c))break;m+=` +`+f}!a&&!f.trim()&&(a=!0),r+=h+` +`,t=t.substring(h.length+1),c=f.slice(o)}}v.loose||(u?v.loose=!0:/\n *\n *$/.test(r)&&(u=!0)),this.options.gfm&&(i=/^\[[ xX]\] /.exec(m),i&&(s=i[0]!=="[ ] ",m=m.replace(/^\[[ xX]\] +/,""))),v.items.push({type:"list_item",raw:r,task:!!i,checked:s,loose:!1,text:m}),v.raw+=r}v.items[v.items.length-1].raw=r.trimRight(),v.items[v.items.length-1].text=m.trimRight(),v.raw=v.raw.trimRight();const R=v.items.length;for(l=0;lK.type==="space"),H=k.length>0&&k.some(K=>/\n.*\n/.test(K.raw));v.loose=H}if(v.loose)for(l=0;l$/,"$1").replace(this.rules.inline._escapes,"$1"):"",s=n[3]?n[3].substring(1,n[3].length-1).replace(this.rules.inline._escapes,"$1"):n[3];return{type:"def",tag:r,raw:n[0],href:i,title:s}}}table(t){const n=this.rules.block.table.exec(t);if(n){const r={type:"table",header:Ws(n[1]).map(i=>({text:i})),align:n[2].replace(/^ *|\| *$/g,"").split(/ *\| */),rows:n[3]&&n[3].trim()?n[3].replace(/\n[ \t]*$/,"").split(` +`):[]};if(r.header.length===r.align.length){r.raw=n[0];let i=r.align.length,s,o,l,a;for(s=0;s({text:u}));for(i=r.header.length,o=0;o/i.test(n[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(n[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(n[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:n[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(n[0]):Ve(n[0]):n[0]}}link(t){const n=this.rules.inline.link.exec(t);if(n){const r=n[2].trim();if(!this.options.pedantic&&/^$/.test(r))return;const o=mr(r.slice(0,-1),"\\");if((r.length-o.length)%2===0)return}else{const o=Ld(n[2],"()");if(o>-1){const a=(n[0].indexOf("!")===0?5:4)+n[1].length+o;n[2]=n[2].substring(0,o),n[0]=n[0].substring(0,a).trim(),n[3]=""}}let i=n[2],s="";if(this.options.pedantic){const o=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i);o&&(i=o[1],s=o[3])}else s=n[3]?n[3].slice(1,-1):"";return i=i.trim(),/^$/.test(r)?i=i.slice(1):i=i.slice(1,-1)),Zs(n,{href:i&&i.replace(this.rules.inline._escapes,"$1"),title:s&&s.replace(this.rules.inline._escapes,"$1")},n[0],this.lexer)}}reflink(t,n){let r;if((r=this.rules.inline.reflink.exec(t))||(r=this.rules.inline.nolink.exec(t))){let i=(r[2]||r[1]).replace(/\s+/g," ");if(i=n[i.toLowerCase()],!i){const s=r[0].charAt(0);return{type:"text",raw:s,text:s}}return Zs(r,i,r[0],this.lexer)}}emStrong(t,n,r=""){let i=this.rules.inline.emStrong.lDelim.exec(t);if(!i||i[3]&&r.match(/[\p{L}\p{N}]/u))return;const s=i[1]||i[2]||"";if(!s||s&&(r===""||this.rules.inline.punctuation.exec(r))){const o=i[0].length-1;let l,a,u=o,c=0;const f=i[0][0]==="*"?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(f.lastIndex=0,n=n.slice(-1*t.length+o);(i=f.exec(n))!=null;){if(l=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!l)continue;if(a=l.length,i[3]||i[4]){u+=a;continue}else if((i[5]||i[6])&&o%3&&!((o+a)%3)){c+=a;continue}if(u-=a,u>0)continue;a=Math.min(a,a+u+c);const h=t.slice(0,o+i.index+(i[0].length-l.length)+a);if(Math.min(o,a)%2){const A=h.slice(1,-1);return{type:"em",raw:h,text:A,tokens:this.lexer.inlineTokens(A)}}const m=h.slice(2,-2);return{type:"strong",raw:h,text:m,tokens:this.lexer.inlineTokens(m)}}}}codespan(t){const n=this.rules.inline.code.exec(t);if(n){let r=n[2].replace(/\n/g," ");const i=/[^ ]/.test(r),s=/^ /.test(r)&&/ $/.test(r);return i&&s&&(r=r.substring(1,r.length-1)),r=Ve(r,!0),{type:"codespan",raw:n[0],text:r}}}br(t){const n=this.rules.inline.br.exec(t);if(n)return{type:"br",raw:n[0]}}del(t){const n=this.rules.inline.del.exec(t);if(n)return{type:"del",raw:n[0],text:n[2],tokens:this.lexer.inlineTokens(n[2])}}autolink(t,n){const r=this.rules.inline.autolink.exec(t);if(r){let i,s;return r[2]==="@"?(i=Ve(this.options.mangle?n(r[1]):r[1]),s="mailto:"+i):(i=Ve(r[1]),s=i),{type:"link",raw:r[0],text:i,href:s,tokens:[{type:"text",raw:i,text:i}]}}}url(t,n){let r;if(r=this.rules.inline.url.exec(t)){let i,s;if(r[2]==="@")i=Ve(this.options.mangle?n(r[0]):r[0]),s="mailto:"+i;else{let o;do o=r[0],r[0]=this.rules.inline._backpedal.exec(r[0])[0];while(o!==r[0]);i=Ve(r[0]),r[1]==="www."?s="http://"+r[0]:s=r[0]}return{type:"link",raw:r[0],text:i,href:s,tokens:[{type:"text",raw:i,text:i}]}}}inlineText(t,n){const r=this.rules.inline.text.exec(t);if(r){let i;return this.lexer.state.inRawBlock?i=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):Ve(r[0]):r[0]:i=Ve(this.options.smartypants?n(r[0]):r[0]),{type:"text",raw:r[0],text:i}}}}const re={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:Lr,lheading:/^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/};re._label=/(?!\s*\])(?:\\.|[^\[\]\\])+/;re._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;re.def=xe(re.def).replace("label",re._label).replace("title",re._title).getRegex();re.bullet=/(?:[*+-]|\d{1,9}[.)])/;re.listItemStart=xe(/^( *)(bull) */).replace("bull",re.bullet).getRegex();re.list=xe(re.list).replace(/bull/g,re.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+re.def.source+")").getRegex();re._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";re._comment=/|$)/;re.html=xe(re.html,"i").replace("comment",re._comment).replace("tag",re._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();re.paragraph=xe(re._paragraph).replace("hr",re.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",re._tag).getRegex();re.blockquote=xe(re.blockquote).replace("paragraph",re.paragraph).getRegex();re.normal={...re};re.gfm={...re.normal,table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"};re.gfm.table=xe(re.gfm.table).replace("hr",re.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",re._tag).getRegex();re.gfm.paragraph=xe(re._paragraph).replace("hr",re.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",re.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",re._tag).getRegex();re.pedantic={...re.normal,html:xe(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",re._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Lr,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:xe(re.normal._paragraph).replace("hr",re.hr).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",re.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()};const q={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Lr,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,rDelimUnd:/^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Lr,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~";q.punctuation=xe(q.punctuation).replace(/punctuation/g,q._punctuation).getRegex();q.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;q.escapedEmSt=/(?:^|[^\\])(?:\\\\)*\\[*_]/g;q._comment=xe(re._comment).replace("(?:-->|$)","-->").getRegex();q.emStrong.lDelim=xe(q.emStrong.lDelim).replace(/punct/g,q._punctuation).getRegex();q.emStrong.rDelimAst=xe(q.emStrong.rDelimAst,"g").replace(/punct/g,q._punctuation).getRegex();q.emStrong.rDelimUnd=xe(q.emStrong.rDelimUnd,"g").replace(/punct/g,q._punctuation).getRegex();q._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;q._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;q._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;q.autolink=xe(q.autolink).replace("scheme",q._scheme).replace("email",q._email).getRegex();q._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;q.tag=xe(q.tag).replace("comment",q._comment).replace("attribute",q._attribute).getRegex();q._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;q._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;q._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;q.link=xe(q.link).replace("label",q._label).replace("href",q._href).replace("title",q._title).getRegex();q.reflink=xe(q.reflink).replace("label",q._label).replace("ref",re._label).getRegex();q.nolink=xe(q.nolink).replace("ref",re._label).getRegex();q.reflinkSearch=xe(q.reflinkSearch,"g").replace("reflink",q.reflink).replace("nolink",q.nolink).getRegex();q.normal={...q};q.pedantic={...q.normal,strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:xe(/^!?\[(label)\]\((.*?)\)/).replace("label",q._label).getRegex(),reflink:xe(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",q._label).getRegex()};q.gfm={...q.normal,escape:xe(q.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\.5&&(r="x"+r.toString(16)),t+="&#"+r+";";return t}class Dt{constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||Zt,this.options.tokenizer=this.options.tokenizer||new Gi,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};const n={block:re.normal,inline:q.normal};this.options.pedantic?(n.block=re.pedantic,n.inline=q.pedantic):this.options.gfm&&(n.block=re.gfm,this.options.breaks?n.inline=q.breaks:n.inline=q.gfm),this.tokenizer.rules=n}static get rules(){return{block:re,inline:q}}static lex(t,n){return new Dt(n).lex(t)}static lexInline(t,n){return new Dt(n).inlineTokens(t)}lex(t){t=t.replace(/\r\n|\r/g,` +`),this.blockTokens(t,this.tokens);let n;for(;n=this.inlineQueue.shift();)this.inlineTokens(n.src,n.tokens);return this.tokens}blockTokens(t,n=[]){this.options.pedantic?t=t.replace(/\t/g," ").replace(/^ +$/gm,""):t=t.replace(/^( *)(\t+)/gm,(l,a,u)=>a+" ".repeat(u.length));let r,i,s,o;for(;t;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(l=>(r=l.call({lexer:this},t,n))?(t=t.substring(r.raw.length),n.push(r),!0):!1))){if(r=this.tokenizer.space(t)){t=t.substring(r.raw.length),r.raw.length===1&&n.length>0?n[n.length-1].raw+=` +`:n.push(r);continue}if(r=this.tokenizer.code(t)){t=t.substring(r.raw.length),i=n[n.length-1],i&&(i.type==="paragraph"||i.type==="text")?(i.raw+=` +`+r.raw,i.text+=` +`+r.text,this.inlineQueue[this.inlineQueue.length-1].src=i.text):n.push(r);continue}if(r=this.tokenizer.fences(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.heading(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.hr(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.blockquote(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.list(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.html(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.def(t)){t=t.substring(r.raw.length),i=n[n.length-1],i&&(i.type==="paragraph"||i.type==="text")?(i.raw+=` +`+r.raw,i.text+=` +`+r.raw,this.inlineQueue[this.inlineQueue.length-1].src=i.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title});continue}if(r=this.tokenizer.table(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.lheading(t)){t=t.substring(r.raw.length),n.push(r);continue}if(s=t,this.options.extensions&&this.options.extensions.startBlock){let l=1/0;const a=t.slice(1);let u;this.options.extensions.startBlock.forEach(function(c){u=c.call({lexer:this},a),typeof u=="number"&&u>=0&&(l=Math.min(l,u))}),l<1/0&&l>=0&&(s=t.substring(0,l+1))}if(this.state.top&&(r=this.tokenizer.paragraph(s))){i=n[n.length-1],o&&i.type==="paragraph"?(i.raw+=` +`+r.raw,i.text+=` +`+r.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=i.text):n.push(r),o=s.length!==t.length,t=t.substring(r.raw.length);continue}if(r=this.tokenizer.text(t)){t=t.substring(r.raw.length),i=n[n.length-1],i&&i.type==="text"?(i.raw+=` +`+r.raw,i.text+=` +`+r.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=i.text):n.push(r);continue}if(t){const l="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(l);break}else throw new Error(l)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){let r,i,s,o=t,l,a,u;if(this.tokens.links){const c=Object.keys(this.tokens.links);if(c.length>0)for(;(l=this.tokenizer.rules.inline.reflinkSearch.exec(o))!=null;)c.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(o=o.slice(0,l.index)+"["+Ks("a",l[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(l=this.tokenizer.rules.inline.blockSkip.exec(o))!=null;)o=o.slice(0,l.index)+"["+Ks("a",l[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(l=this.tokenizer.rules.inline.escapedEmSt.exec(o))!=null;)o=o.slice(0,l.index+l[0].length-2)+"++"+o.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex),this.tokenizer.rules.inline.escapedEmSt.lastIndex--;for(;t;)if(a||(u=""),a=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(c=>(r=c.call({lexer:this},t,n))?(t=t.substring(r.raw.length),n.push(r),!0):!1))){if(r=this.tokenizer.escape(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.tag(t)){t=t.substring(r.raw.length),i=n[n.length-1],i&&r.type==="text"&&i.type==="text"?(i.raw+=r.raw,i.text+=r.text):n.push(r);continue}if(r=this.tokenizer.link(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(r.raw.length),i=n[n.length-1],i&&r.type==="text"&&i.type==="text"?(i.raw+=r.raw,i.text+=r.text):n.push(r);continue}if(r=this.tokenizer.emStrong(t,o,u)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.codespan(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.br(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.del(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.autolink(t,Js)){t=t.substring(r.raw.length),n.push(r);continue}if(!this.state.inLink&&(r=this.tokenizer.url(t,Js))){t=t.substring(r.raw.length),n.push(r);continue}if(s=t,this.options.extensions&&this.options.extensions.startInline){let c=1/0;const f=t.slice(1);let h;this.options.extensions.startInline.forEach(function(m){h=m.call({lexer:this},f),typeof h=="number"&&h>=0&&(c=Math.min(c,h))}),c<1/0&&c>=0&&(s=t.substring(0,c+1))}if(r=this.tokenizer.inlineText(s,Td)){t=t.substring(r.raw.length),r.raw.slice(-1)!=="_"&&(u=r.raw.slice(-1)),a=!0,i=n[n.length-1],i&&i.type==="text"?(i.raw+=r.raw,i.text+=r.text):n.push(r);continue}if(t){const c="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return n}}class Yi{constructor(t){this.options=t||Zt}code(t,n,r){const i=(n||"").match(/\S*/)[0];if(this.options.highlight){const s=this.options.highlight(t,i);s!=null&&s!==t&&(r=!0,t=s)}return t=t.replace(/\n$/,"")+` +`,i?'
    '+(r?t:Ve(t,!0))+`
    +`:"
    "+(r?t:Ve(t,!0))+`
    +`}blockquote(t){return`
    +${t}
    +`}html(t){return t}heading(t,n,r,i){if(this.options.headerIds){const s=this.options.headerPrefix+i.slug(r);return`${t} +`}return`${t} +`}hr(){return this.options.xhtml?`
    +`:`
    +`}list(t,n,r){const i=n?"ol":"ul",s=n&&r!==1?' start="'+r+'"':"";return"<"+i+s+`> +`+t+" +`}listitem(t){return`
  • ${t}
  • +`}checkbox(t){return" "}paragraph(t){return`

    ${t}

    +`}table(t,n){return n&&(n=`${n}`),` + +`+t+` +`+n+`
    +`}tablerow(t){return` +${t} +`}tablecell(t,n){const r=n.header?"th":"td";return(n.align?`<${r} align="${n.align}">`:`<${r}>`)+t+` +`}strong(t){return`${t}`}em(t){return`${t}`}codespan(t){return`${t}`}br(){return this.options.xhtml?"
    ":"
    "}del(t){return`${t}`}link(t,n,r){if(t=qs(this.options.sanitize,this.options.baseUrl,t),t===null)return r;let i='",i}image(t,n,r){if(t=qs(this.options.sanitize,this.options.baseUrl,t),t===null)return r;let i=`${r}":">",i}text(t){return t}}class Wl{strong(t){return t}em(t){return t}codespan(t){return t}del(t){return t}html(t){return t}text(t){return t}link(t,n,r){return""+r}image(t,n,r){return""+r}br(){return""}}class Kl{constructor(){this.seen={}}serialize(t){return t.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")}getNextSafeSlug(t,n){let r=t,i=0;if(this.seen.hasOwnProperty(r)){i=this.seen[t];do i++,r=t+"-"+i;while(this.seen.hasOwnProperty(r))}return n||(this.seen[t]=i,this.seen[r]=0),r}slug(t,n={}){const r=this.serialize(t);return this.getNextSafeSlug(r,n.dryrun)}}class zt{constructor(t){this.options=t||Zt,this.options.renderer=this.options.renderer||new Yi,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new Wl,this.slugger=new Kl}static parse(t,n){return new zt(n).parse(t)}static parseInline(t,n){return new zt(n).parseInline(t)}parse(t,n=!0){let r="",i,s,o,l,a,u,c,f,h,m,A,E,b,v,_,R,k,H,K;const O=t.length;for(i=0;i0&&_.tokens[0].type==="paragraph"?(_.tokens[0].text=H+" "+_.tokens[0].text,_.tokens[0].tokens&&_.tokens[0].tokens.length>0&&_.tokens[0].tokens[0].type==="text"&&(_.tokens[0].tokens[0].text=H+" "+_.tokens[0].tokens[0].text)):_.tokens.unshift({type:"text",text:H}):v+=H),v+=this.parse(_.tokens,b),h+=this.renderer.listitem(v,k,R);r+=this.renderer.list(h,A,E);continue}case"html":{r+=this.renderer.html(m.text);continue}case"paragraph":{r+=this.renderer.paragraph(this.parseInline(m.tokens));continue}case"text":{for(h=m.tokens?this.parseInline(m.tokens):m.text;i+1{if(r.message+=` +Please report this to https://github.com/markedjs/marked.`,e){const i="

    An error occurred:

    "+Ve(r.message+"",!0)+"
    ";if(t)return Promise.resolve(i);if(n){n(null,i);return}return i}if(t)return Promise.reject(r);if(n){n(r);return}throw r}}function Zl(e,t){return(n,r,i)=>{typeof r=="function"&&(i=r,r=null);const s={...r};r={...ee.defaults,...s};const o=Id(r.silent,r.async,i);if(typeof n>"u"||n===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(Sd(r),r.hooks&&(r.hooks.options=r),i){const l=r.highlight;let a;try{r.hooks&&(n=r.hooks.preprocess(n)),a=e(n,r)}catch(f){return o(f)}const u=function(f){let h;if(!f)try{r.walkTokens&&ee.walkTokens(a,r.walkTokens),h=t(a,r),r.hooks&&(h=r.hooks.postprocess(h))}catch(m){f=m}return r.highlight=l,f?o(f):i(null,h)};if(!l||l.length<3||(delete r.highlight,!a.length))return u();let c=0;ee.walkTokens(a,function(f){f.type==="code"&&(c++,setTimeout(()=>{l(f.text,f.lang,function(h,m){if(h)return u(h);m!=null&&m!==f.text&&(f.text=m,f.escaped=!0),c--,c===0&&u()})},0))}),c===0&&u();return}if(r.async)return Promise.resolve(r.hooks?r.hooks.preprocess(n):n).then(l=>e(l,r)).then(l=>r.walkTokens?Promise.all(ee.walkTokens(l,r.walkTokens)).then(()=>l):l).then(l=>t(l,r)).then(l=>r.hooks?r.hooks.postprocess(l):l).catch(o);try{r.hooks&&(n=r.hooks.preprocess(n));const l=e(n,r);r.walkTokens&&ee.walkTokens(l,r.walkTokens);let a=t(l,r);return r.hooks&&(a=r.hooks.postprocess(a)),a}catch(l){return o(l)}}}function ee(e,t,n){return Zl(Dt.lex,zt.parse)(e,t,n)}ee.options=ee.setOptions=function(e){return ee.defaults={...ee.defaults,...e},Ed(ee.defaults),ee};ee.getDefaults=Ul;ee.defaults=Zt;ee.use=function(...e){const t=ee.defaults.extensions||{renderers:{},childTokens:{}};e.forEach(n=>{const r={...n};if(r.async=ee.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if(i.renderer){const s=t.renderers[i.name];s?t.renderers[i.name]=function(...o){let l=i.renderer.apply(this,o);return l===!1&&(l=s.apply(this,o)),l}:t.renderers[i.name]=i.renderer}if(i.tokenizer){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");t[i.level]?t[i.level].unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){const i=ee.defaults.renderer||new Yi;for(const s in n.renderer){const o=i[s];i[s]=(...l)=>{let a=n.renderer[s].apply(i,l);return a===!1&&(a=o.apply(i,l)),a}}r.renderer=i}if(n.tokenizer){const i=ee.defaults.tokenizer||new Gi;for(const s in n.tokenizer){const o=i[s];i[s]=(...l)=>{let a=n.tokenizer[s].apply(i,l);return a===!1&&(a=o.apply(i,l)),a}}r.tokenizer=i}if(n.hooks){const i=ee.defaults.hooks||new Sr;for(const s in n.hooks){const o=i[s];Sr.passThroughHooks.has(s)?i[s]=l=>{if(ee.defaults.async)return Promise.resolve(n.hooks[s].call(i,l)).then(u=>o.call(i,u));const a=n.hooks[s].call(i,l);return o.call(i,a)}:i[s]=(...l)=>{let a=n.hooks[s].apply(i,l);return a===!1&&(a=o.apply(i,l)),a}}r.hooks=i}if(n.walkTokens){const i=ee.defaults.walkTokens;r.walkTokens=function(s){let o=[];return o.push(n.walkTokens.call(this,s)),i&&(o=o.concat(i.call(this,s))),o}}ee.setOptions(r)})};ee.walkTokens=function(e,t){let n=[];for(const r of e)switch(n=n.concat(t.call(ee,r)),r.type){case"table":{for(const i of r.header)n=n.concat(ee.walkTokens(i.tokens,t));for(const i of r.rows)for(const s of i)n=n.concat(ee.walkTokens(s.tokens,t));break}case"list":{n=n.concat(ee.walkTokens(r.items,t));break}default:ee.defaults.extensions&&ee.defaults.extensions.childTokens&&ee.defaults.extensions.childTokens[r.type]?ee.defaults.extensions.childTokens[r.type].forEach(function(i){n=n.concat(ee.walkTokens(r[i],t))}):r.tokens&&(n=n.concat(ee.walkTokens(r.tokens,t)))}return n};ee.parseInline=Zl(Dt.lexInline,zt.parseInline);ee.Parser=zt;ee.parser=zt.parse;ee.Renderer=Yi;ee.TextRenderer=Wl;ee.Lexer=Dt;ee.lexer=Dt.lex;ee.Tokenizer=Gi;ee.Slugger=Kl;ee.Hooks=Sr;ee.parse=ee;ee.options;ee.setOptions;ee.use;ee.walkTokens;ee.parseInline;zt.parse;Dt.lex;const Od=["nick","mail","link"],Gs=e=>e.filter(t=>Od.includes(t)),Ys=["//unpkg.com/@waline/emojis@1.1.0/weibo"],Pd="en-US",Dd=["//unpkg.com/@waline/emojis/tieba/tieba_agree.png","//unpkg.com/@waline/emojis/tieba/tieba_look_down.png","//unpkg.com/@waline/emojis/tieba/tieba_sunglasses.png","//unpkg.com/@waline/emojis/tieba/tieba_pick_nose.png","//unpkg.com/@waline/emojis/tieba/tieba_awkward.png","//unpkg.com/@waline/emojis/tieba/tieba_sleep.png"],zd=e=>new Promise((t,n)=>{if(e.size>128e3)return n(new Error("File too large! File size limit 128KB"));const r=new FileReader;r.readAsDataURL(e),r.onload=()=>{var i;return t(((i=r.result)==null?void 0:i.toString())||"")},r.onerror=n}),Fd=e=>e===!0?'

    TeX is not available in preview

    ':'TeX is not available in preview',Md=e=>{const t=async(n,r={})=>fetch(`https://api.giphy.com/v1/gifs/${n}?${new URLSearchParams({lang:e,limit:"20",rating:"g",api_key:"6CIMLkNMMOhRcXPoMCPkFy4Ybk2XUiMp",...r}).toString()}`).then(i=>i.json()).then(({data:i})=>i.map(s=>({title:s.title,src:s.images.downsized_medium.url})));return{search:n=>t("search",{q:n,offset:"0"}),default:()=>t("trending",{}),more:(n,r=0)=>t("search",{q:n,offset:r.toString()})}},jd=new RegExp(`(${/[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u309f\uac00-\ud7af\u0400-\u04FF]+|\w+/.source}|${/{let t=0;return e.replace(jd,(n,r,i)=>{if(i)return`${i}`;if(r==="<")return"<";let s;Yr[r]?s=Yr[r]:(s=Qs[t],Yr[r]=s);const o=`${r}`;return t=++t%Qs.length,o})},Ud=["nick","nickError","mail","mailError","link","optional","placeholder","sofa","submit","like","cancelLike","reply","cancelReply","comment","refresh","more","preview","emoji","uploadImage","seconds","minutes","hours","days","now","uploading","login","logout","admin","sticky","word","wordHint","anonymous","level0","level1","level2","level3","level4","level5","gif","gifSearchPlaceholder","profile","approved","waiting","spam","unsticky","oldest","latest","hottest","reactionTitle"],yn=e=>Object.fromEntries(e.map((t,n)=>[Ud[n],t]));var Qr=yn(["NickName","NickName cannot be less than 3 bytes.","E-Mail","Please confirm your email address.","Website","Optional","Comment here...","No comment yet.","Submit","Like","Cancel like","Reply","Cancel reply","Comments","Refresh","Load More...","Preview","Emoji","Upload Image","seconds ago","minutes ago","hours ago","days ago","just now","Uploading","Login","logout","Admin","Sticky","Words",`Please input comments between $0 and $1 words! + Current word number: $2`,"Anonymous","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Search GIF","Profile","Approved","Waiting","Spam","Unsticky","Oldest","Latest","Hottest","What do you think?"]),fr=yn(["ニックネーム","3バイト以上のニックネームをご入力ください.","メールアドレス","メールアドレスをご確認ください.","サイト","オプション","ここにコメント","コメントしましょう~","提出する","Like","Cancel like","返信する","キャンセル","コメント","更新","さらに読み込む","プレビュー","絵文字","画像をアップロード","秒前","分前","時間前","日前","たっだ今","アップロード","ログインする","ログアウト","管理者","トップに置く","ワード",`コメントは $0 から $1 ワードの間でなければなりません! + 現在の単語番号: $2`,"匿名","うえにん","なかにん","しもおし","特にしもおし","かげ","なぬし","GIF","探す GIF","個人情報","承認済み","待っている","スパム","べたつかない","逆順","正順","人気順","どう思いますか?"]),Xs=yn(["Apelido","Apelido não pode ser menor que 3 bytes.","E-Mail","Por favor, confirme seu endereço de e-mail.","Website","Opcional","Comente aqui...","Nenhum comentário, ainda.","Enviar","Like","Cancel like","Responder","Cancelar resposta","Comentários","Refrescar","Carregar Mais...","Visualizar","Emoji","Enviar Imagem","segundos atrás","minutos atrás","horas atrás","dias atrás","agora mesmo","Enviando","Entrar","Sair","Admin","Sticky","Palavras",`Favor enviar comentário com $0 a $1 palavras! + Número de palavras atuais: $2`,"Anônimo","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Pesquisar GIF","informação pessoal","Aprovado","Espera","Spam","Unsticky","Mais velho","Mais recentes","Mais quente","O que você acha?"]),Xr=yn(["Псевдоним","Никнейм не может быть меньше 3 байт.","Эл. адрес","Пожалуйста, подтвердите адрес вашей электронной почты.","Веб-сайт","Необязательный","Комментарий здесь...","Пока нет комментариев.","Отправить","Like","Cancel like","Отвечать","Отменить ответ","Комментарии","Обновить","Загрузи больше...","Превью","эмодзи","Загрузить изображение","секунд назад","несколько минут назад","несколько часов назад","дней назад","прямо сейчас","Загрузка","Авторизоваться","Выход из системы","Админ","Липкий","Слова",`Пожалуйста, введите комментарии от $0 до $1 слов! +Номер текущего слова: $2`,"Анонимный","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Поиск GIF","Персональные данные","Одобренный","Ожидающий","Спам","Нелипкий","самый старый","последний","самый горячий","Что вы думаете?"]),ei=yn(["昵称","昵称不能少于3个字符","邮箱","请填写正确的邮件地址","网址","可选","欢迎评论","来发评论吧~","提交","喜欢","取消喜欢","回复","取消回复","评论","刷新","加载更多...","预览","表情","上传图片","秒前","分钟前","小时前","天前","刚刚","正在上传","登录","退出","博主","置顶","字",`评论字数应在 $0 到 $1 字之间! +当前字数:$2`,"匿名","潜水","冒泡","吐槽","活跃","话痨","传说","表情包","搜索表情包","个人资料","通过","待审核","垃圾","取消置顶","按倒序","按正序","按热度","你认为这篇文章怎么样?"]),eo=yn(["暱稱","暱稱不能少於3個字元","郵箱","請填寫正確的郵件地址","網址","可選","歡迎留言","來發留言吧~","送出","喜歡","取消喜歡","回覆","取消回覆","留言","重整","載入更多...","預覽","表情","上傳圖片","秒前","分鐘前","小時前","天前","剛剛","正在上傳","登入","登出","管理者","置頂","字",`留言字數應在 $0 到 $1 字之間! +目前字數:$2`,"匿名","潛水","冒泡","吐槽","活躍","多話","傳說","表情包","搜尋表情包","個人資料","通過","待審核","垃圾","取消置頂","最早","最新","熱門","你認為這篇文章怎麼樣?"]);const ti={zh:ei,"zh-cn":ei,"zh-CN":ei,"zh-tw":eo,"zh-TW":eo,en:Qr,"en-US":Qr,"en-us":Qr,jp:fr,ja:fr,"jp-jp":fr,"jp-JP":fr,"pt-br":Xs,"pt-BR":Xs,ru:Xr,"ru-ru":Xr,"ru-RU":Xr},Jl={"Content-Type":"application/json"},Ai=(e,t="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},Gl=({serverURL:e,lang:t,paths:n,type:r,signal:i})=>fetch(`${e}/article?path=${encodeURIComponent(n.join(","))}&type=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:i}).then(s=>s.json()),bi=({serverURL:e,lang:t,path:n,type:r,action:i})=>fetch(`${e}/article?lang=${t}`,{method:"POST",headers:Jl,body:JSON.stringify({path:n,type:r,action:i})}).then(s=>s.json()),gr=({serverURL:e,lang:t,token:n,objectId:r,comment:i})=>fetch(`${e}/comment/${r}?lang=${t}`,{method:"PUT",headers:{...Jl,Authorization:`Bearer ${n}`},body:JSON.stringify(i)}).then(s=>s.json()).then(s=>Ai(s,"Update comment")),Yl=e=>{try{e=decodeURI(e)}catch{}return e},Ql=(e="")=>e.replace(/\/$/u,""),Xl=e=>/^(https?:)?\/\//.test(e),$r=e=>{const t=Ql(e);return Xl(t)?t:`https://${t}`},Hd=e=>Array.isArray(e)?e:!!e&&[0,e],ni=(e,t)=>typeof e=="function"?e:e!==!1&&t,ri="{--waline-white:#000;--waline-light-grey:#666;--waline-dark-grey:#999;--waline-color:#888;--waline-bgcolor:#1e1e1e;--waline-bgcolor-light:#272727;--waline-bgcolor-hover: #444;--waline-border-color:#333;--waline-disable-bgcolor:#444;--waline-disable-color:#272727;--waline-bq-color:#272727;--waline-info-bgcolor:#272727;--waline-info-color:#666}",ii=(e,t)=>{let n=e.toString();for(;n.length{if(!e)return"";const r=typeof e=="string"?new Date(e.indexOf(" ")!==-1?e.replace(/-/g,"/"):e):e,i=t.getTime()-r.getTime(),s=Math.floor(i/864e5);if(s===0){const o=i%864e5,l=Math.floor(o/36e5);if(l===0){const a=o%36e5,u=Math.floor(a/6e4);if(u===0){const c=a%6e4;return`${Math.round(c/1e3)} ${n.seconds}`}return`${u} ${n.minutes}`}return`${l} ${n.hours}`}return s<0?n.now:s<8?`${s} ${n.days}`:(o=>{const l=ii(o.getDate(),2),a=ii(o.getMonth()+1,2);return`${ii(o.getFullYear(),2)}-${a}-${l}`})(r)},qd=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Wd=e=>{const t=dn("WALINE_EMOJI",{}),n=!!/@[0-9]+\.[0-9]+\.[0-9]+/.test(e);if(n){const r=t.value[e];if(r)return Promise.resolve(r)}return fetch(`${e}/info.json`).then(r=>r.json()).then(r=>{const i={folder:e,...r};return n&&(t.value[e]=i),i})},to=(e,t="",n="",r="")=>`${t?`${t}/`:""}${n}${e}${r?`.${r}`:""}`,ea=e=>{e.name!=="AbortError"&&console.error(e.message)},Kd=e=>e instanceof HTMLElement?e:typeof e=="string"?document.querySelector(e):null,Zd=e=>e.type.includes("image"),no=e=>{const t=Array.from(e).find(Zd);return t?t.getAsFile():null},Jd=/\$.*?\$/,Gd=/^\$(.*?)\$/,Yd=/^(?:\s{0,3})\$\$((?:[^\n]|\n[^\n])+?)\n{0,1}\$\$/,ta=(e="",t={})=>e.replace(/:(.+?):/g,(n,r)=>t[r]?`${r}`:n),Qd=(e,{emojiMap:t,highlighter:n,texRenderer:r})=>{if(ee.setOptions({highlight:n||void 0,breaks:!0,smartLists:!0,smartypants:!0}),r){const i=(s=>[{name:"blockMath",level:"block",tokenizer(o){const l=Yd.exec(o);if(l!==null)return{type:"html",raw:l[0],text:s(!0,l[1])}}},{name:"inlineMath",level:"inline",start(o){const l=o.search(Jd);return l!==-1?l:o.length},tokenizer(o){const l=Gd.exec(o);if(l!==null)return{type:"html",raw:l[0],text:s(!1,l[1])}}}])(r);ee.use({extensions:i})}return ee.parse(ta(e,t))},ro=e=>e.dataset.path||e.getAttribute("id"),Xd=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-comment-count",lang:r=navigator.language})=>{const i=new AbortController,s=document.querySelectorAll(n);return s.length&&(({serverURL:o,lang:l,paths:a,signal:u})=>fetch(`${o}/comment?type=count&url=${encodeURIComponent(a.join(","))}&lang=${l}`,{signal:u}).then(c=>c.json()).then(c=>Array.isArray(c)?c:[c]))({serverURL:$r(e),paths:Array.from(s).map(o=>Yl(o.dataset.path||o.getAttribute("id")||t)),lang:r,signal:i.signal}).then(o=>{s.forEach((l,a)=>{l.innerText=o[a].toString()})}).catch(ea),i.abort.bind(i)},io=({size:e})=>ge("svg",{class:"wl-close-icon",viewBox:"0 0 1024 1024",width:e,height:e},[ge("path",{d:"M697.173 85.333h-369.92c-144.64 0-241.92 101.547-241.92 252.587v348.587c0 150.613 97.28 252.16 241.92 252.16h369.92c144.64 0 241.494-101.547 241.494-252.16V337.92c0-151.04-96.854-252.587-241.494-252.587z",fill:"currentColor"}),ge("path",{d:"m640.683 587.52-75.947-75.861 75.904-75.862a37.29 37.29 0 0 0 0-52.778 37.205 37.205 0 0 0-52.779 0l-75.946 75.818-75.862-75.946a37.419 37.419 0 0 0-52.821 0 37.419 37.419 0 0 0 0 52.821l75.947 75.947-75.776 75.733a37.29 37.29 0 1 0 52.778 52.821l75.776-75.776 75.947 75.947a37.376 37.376 0 0 0 52.779-52.821z",fill:"#888"})]),eh=()=>ge("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},ge("path",{d:"m341.013 394.667 27.755 393.45h271.83l27.733-393.45h64.106l-28.01 397.952a64 64 0 0 1-63.83 59.498H368.768a64 64 0 0 1-63.83-59.52l-28.053-397.93h64.128zm139.307 19.818v298.667h-64V414.485h64zm117.013 0v298.667h-64V414.485h64zM181.333 288h640v64h-640v-64zm453.483-106.667v64h-256v-64h256z",fill:"red"})),th=()=>ge("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},ge("path",{d:"M563.2 463.3 677 540c1.7 1.2 3.7 1.8 5.8 1.8.7 0 1.4-.1 2-.2 2.7-.5 5.1-2.1 6.6-4.4l25.3-37.8c1.5-2.3 2.1-5.1 1.6-7.8s-2.1-5.1-4.4-6.6l-73.6-49.1 73.6-49.1c2.3-1.5 3.9-3.9 4.4-6.6.5-2.7 0-5.5-1.6-7.8l-25.3-37.8a10.1 10.1 0 0 0-6.6-4.4c-.7-.1-1.3-.2-2-.2-2.1 0-4.1.6-5.8 1.8l-113.8 76.6c-9.2 6.2-14.7 16.4-14.7 27.5.1 11 5.5 21.3 14.7 27.4zM387 348.8h-45.5c-5.7 0-10.4 4.7-10.4 10.4v153.3c0 5.7 4.7 10.4 10.4 10.4H387c5.7 0 10.4-4.7 10.4-10.4V359.2c0-5.7-4.7-10.4-10.4-10.4zm333.8 241.3-41-20a10.3 10.3 0 0 0-8.1-.5c-2.6.9-4.8 2.9-5.9 5.4-30.1 64.9-93.1 109.1-164.4 115.2-5.7.5-9.9 5.5-9.5 11.2l3.9 45.5c.5 5.3 5 9.5 10.3 9.5h.9c94.8-8 178.5-66.5 218.6-152.7 2.4-5 .3-11.2-4.8-13.6zm186-186.1c-11.9-42-30.5-81.4-55.2-117.1-24.1-34.9-53.5-65.6-87.5-91.2-33.9-25.6-71.5-45.5-111.6-59.2-41.2-14-84.1-21.1-127.8-21.1h-1.2c-75.4 0-148.8 21.4-212.5 61.7-63.7 40.3-114.3 97.6-146.5 165.8-32.2 68.1-44.3 143.6-35.1 218.4 9.3 74.8 39.4 145 87.3 203.3.1.2.3.3.4.5l36.2 38.4c1.1 1.2 2.5 2.1 3.9 2.6 73.3 66.7 168.2 103.5 267.5 103.5 73.3 0 145.2-20.3 207.7-58.7 37.3-22.9 70.3-51.5 98.1-85 27.1-32.7 48.7-69.5 64.2-109.1 15.5-39.7 24.4-81.3 26.6-123.8 2.4-43.6-2.5-87-14.5-129zm-60.5 181.1c-8.3 37-22.8 72-43 104-19.7 31.1-44.3 58.6-73.1 81.7-28.8 23.1-61 41-95.7 53.4-35.6 12.7-72.9 19.1-110.9 19.1-82.6 0-161.7-30.6-222.8-86.2l-34.1-35.8c-23.9-29.3-42.4-62.2-55.1-97.7-12.4-34.7-18.8-71-19.2-107.9-.4-36.9 5.4-73.3 17.1-108.2 12-35.8 30-69.2 53.4-99.1 31.7-40.4 71.1-72 117.2-94.1 44.5-21.3 94-32.6 143.4-32.6 49.3 0 97 10.8 141.8 32 34.3 16.3 65.3 38.1 92 64.8 26.1 26 47.5 56 63.6 89.2 16.2 33.2 26.6 68.5 31 105.1 4.6 37.5 2.7 75.3-5.6 112.3z",fill:"currentColor"})),nh=()=>ge("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[ge("path",{d:"M784 112H240c-88 0-160 72-160 160v480c0 88 72 160 160 160h544c88 0 160-72 160-160V272c0-88-72-160-160-160zm96 640c0 52.8-43.2 96-96 96H240c-52.8 0-96-43.2-96-96V272c0-52.8 43.2-96 96-96h544c52.8 0 96 43.2 96 96v480z",fill:"currentColor"}),ge("path",{d:"M352 480c52.8 0 96-43.2 96-96s-43.2-96-96-96-96 43.2-96 96 43.2 96 96 96zm0-128c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32zm462.4 379.2-3.2-3.2-177.6-177.6c-25.6-25.6-65.6-25.6-91.2 0l-80 80-36.8-36.8c-25.6-25.6-65.6-25.6-91.2 0L200 728c-4.8 6.4-8 14.4-8 24 0 17.6 14.4 32 32 32 9.6 0 16-3.2 22.4-9.6L380.8 640l134.4 134.4c6.4 6.4 14.4 9.6 24 9.6 17.6 0 32-14.4 32-32 0-9.6-4.8-17.6-9.6-24l-52.8-52.8 80-80L769.6 776c6.4 4.8 12.8 8 20.8 8 17.6 0 32-14.4 32-32 0-8-3.2-16-8-20.8z",fill:"currentColor"})]),rh=({active:e=!1})=>ge("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[ge("path",{d:"M850.654 323.804c-11.042-25.625-26.862-48.532-46.885-68.225-20.022-19.61-43.258-34.936-69.213-45.73-26.78-11.124-55.124-16.727-84.375-16.727-40.622 0-80.256 11.123-114.698 32.135A214.79 214.79 0 0 0 512 241.819a214.79 214.79 0 0 0-23.483-16.562c-34.442-21.012-74.076-32.135-114.698-32.135-29.25 0-57.595 5.603-84.375 16.727-25.872 10.711-49.19 26.12-69.213 45.73-20.105 19.693-35.843 42.6-46.885 68.225-11.453 26.615-17.303 54.877-17.303 83.963 0 27.439 5.603 56.03 16.727 85.117 9.31 24.307 22.659 49.52 39.715 74.981 27.027 40.293 64.188 82.316 110.33 124.915 76.465 70.615 152.189 119.394 155.402 121.371l19.528 12.525c8.652 5.52 19.776 5.52 28.427 0l19.529-12.525c3.213-2.06 78.854-50.756 155.401-121.371 46.143-42.6 83.304-84.622 110.33-124.915 17.057-25.46 30.487-50.674 39.716-74.981 11.124-29.087 16.727-57.678 16.727-85.117.082-29.086-5.768-57.348-17.221-83.963z"+(e?"":"M512 761.5S218.665 573.55 218.665 407.767c0-83.963 69.461-152.023 155.154-152.023 60.233 0 112.473 33.618 138.181 82.727 25.708-49.109 77.948-82.727 138.18-82.727 85.694 0 155.155 68.06 155.155 152.023C805.335 573.551 512 761.5 512 761.5z"),fill:e?"red":"currentColor"})]),ih=()=>ge("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},[ge("path",{d:"M710.816 654.301c70.323-96.639 61.084-230.578-23.705-314.843-46.098-46.098-107.183-71.109-172.28-71.109-65.008 0-126.092 25.444-172.28 71.109-45.227 46.098-70.756 107.183-70.756 172.106 0 64.923 25.444 126.007 71.194 172.106 46.099 46.098 107.184 71.109 172.28 71.109 51.414 0 100.648-16.212 142.824-47.404l126.53 126.006c7.058 7.06 16.297 10.979 26.406 10.979 10.105 0 19.343-3.919 26.402-10.979 14.467-14.467 14.467-38.172 0-52.723L710.816 654.301zm-315.107-23.265c-65.88-65.88-65.88-172.54 0-238.42 32.069-32.07 74.245-49.149 119.471-49.149 45.227 0 87.407 17.603 119.472 49.149 65.88 65.879 65.88 172.539 0 238.42-63.612 63.178-175.242 63.178-238.943 0zm0 0",fill:"currentColor"}),ge("path",{d:"M703.319 121.603H321.03c-109.8 0-199.469 89.146-199.469 199.38v382.034c0 109.796 89.236 199.38 199.469 199.38h207.397c20.653 0 37.384-16.645 37.384-37.299 0-20.649-16.731-37.296-37.384-37.296H321.03c-68.582 0-124.352-55.77-124.352-124.267V321.421c0-68.496 55.77-124.267 124.352-124.267h382.289c68.582 0 124.352 55.771 124.352 124.267V524.72c0 20.654 16.736 37.299 37.385 37.299 20.654 0 37.384-16.645 37.384-37.299V320.549c-.085-109.8-89.321-198.946-199.121-198.946zm0 0",fill:"currentColor"})]),sh=()=>ge("svg",{width:"16",height:"16",ariaHidden:"true"},ge("path",{d:"M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z",fill:"currentColor"})),oh=()=>ge("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},ge("path",{d:"M810.667 213.333a64 64 0 0 1 64 64V704a64 64 0 0 1-64 64H478.336l-146.645 96.107a21.333 21.333 0 0 1-33.024-17.856V768h-85.334a64 64 0 0 1-64-64V277.333a64 64 0 0 1 64-64h597.334zm0 64H213.333V704h149.334v63.296L459.243 704h351.424V277.333zm-271.36 213.334v64h-176.64v-64h176.64zm122.026-128v64H362.667v-64h298.666z",fill:"currentColor"})),lh=()=>ge("svg",{viewBox:"0 0 1024 1024",width:"24",height:"24"},ge("path",{d:"M813.039 318.772L480.53 651.278H360.718V531.463L693.227 198.961C697.904 194.284 704.027 192 710.157 192C716.302 192 722.436 194.284 727.114 198.961L813.039 284.88C817.72 289.561 820 295.684 820 301.825C820 307.95 817.72 314.093 813.039 318.772ZM710.172 261.888L420.624 551.431V591.376H460.561L750.109 301.825L710.172 261.888ZM490.517 291.845H240.906V771.09H720.156V521.479C720.156 504.947 733.559 491.529 750.109 491.529C766.653 491.529 780.063 504.947 780.063 521.479V791.059C780.063 813.118 762.18 831 740.125 831H220.937C198.882 831 181 813.118 181 791.059V271.872C181 249.817 198.882 231.935 220.937 231.935H490.517C507.06 231.935 520.47 245.352 520.47 261.888C520.47 278.424 507.06 291.845 490.517 291.845Z",fill:"currentColor"})),ah=()=>ge("svg",{class:"verified-icon",viewBox:"0 0 1024 1024",width:"14",height:"14"},ge("path",{d:"m894.4 461.56-54.4-63.2c-10.4-12-18.8-34.4-18.8-50.4v-68c0-42.4-34.8-77.2-77.2-77.2h-68c-15.6 0-38.4-8.4-50.4-18.8l-63.2-54.4c-27.6-23.6-72.8-23.6-100.8 0l-62.8 54.8c-12 10-34.8 18.4-50.4 18.4h-69.2c-42.4 0-77.2 34.8-77.2 77.2v68.4c0 15.6-8.4 38-18.4 50l-54 63.6c-23.2 27.6-23.2 72.4 0 100l54 63.6c10 12 18.4 34.4 18.4 50v68.4c0 42.4 34.8 77.2 77.2 77.2h69.2c15.6 0 38.4 8.4 50.4 18.8l63.2 54.4c27.6 23.6 72.8 23.6 100.8 0l63.2-54.4c12-10.4 34.4-18.8 50.4-18.8h68c42.4 0 77.2-34.8 77.2-77.2v-68c0-15.6 8.4-38.4 18.8-50.4l54.4-63.2c23.2-27.6 23.2-73.2-.4-100.8zm-216-25.2-193.2 193.2a30 30 0 0 1-42.4 0l-96.8-96.8a30.16 30.16 0 0 1 0-42.4c11.6-11.6 30.8-11.6 42.4 0l75.6 75.6 172-172c11.6-11.6 30.8-11.6 42.4 0 11.6 11.6 11.6 30.8 0 42.4z",fill:"#27ae60"})),Hn=({size:e=100})=>ge("svg",{width:e,height:e,viewBox:"0 0 100 100",preserveAspectRatio:"xMidYMid"},ge("circle",{cx:50,cy:50,fill:"none",stroke:"currentColor",strokeWidth:"4",r:"40","stroke-dasharray":"85 30"},ge("animateTransform",{attributeName:"transform",type:"rotate",repeatCount:"indefinite",dur:"1s",values:"0 50 50;360 50 50",keyTimes:"0;1"}))),ch=()=>ge("svg",{width:24,height:24,fill:"currentcolor",viewBox:"0 0 24 24"},[ge("path",{style:"transform: translateY(0.5px)",d:"M18.968 10.5H15.968V11.484H17.984V12.984H15.968V15H14.468V9H18.968V10.5V10.5ZM8.984 9C9.26533 9 9.49967 9.09367 9.687 9.281C9.87433 9.46833 9.968 9.70267 9.968 9.984V10.5H6.499V13.5H8.468V12H9.968V14.016C9.968 14.2973 9.87433 14.5317 9.687 14.719C9.49967 14.9063 9.26533 15 8.984 15H5.984C5.70267 15 5.46833 14.9063 5.281 14.719C5.09367 14.5317 5 14.2973 5 14.016V9.985C5 9.70367 5.09367 9.46933 5.281 9.282C5.46833 9.09467 5.70267 9.001 5.984 9.001H8.984V9ZM11.468 9H12.968V15H11.468V9V9Z"}),ge("path",{d:"M18.5 3H5.75C3.6875 3 2 4.6875 2 6.75V18C2 20.0625 3.6875 21.75 5.75 21.75H18.5C20.5625 21.75 22.25 20.0625 22.25 18V6.75C22.25 4.6875 20.5625 3 18.5 3ZM20.75 18C20.75 19.2375 19.7375 20.25 18.5 20.25H5.75C4.5125 20.25 3.5 19.2375 3.5 18V6.75C3.5 5.5125 4.5125 4.5 5.75 4.5H18.5C19.7375 4.5 20.75 5.5125 20.75 6.75V18Z"})]);let so=null;const na=()=>so||(so=dn("WALINE_LIKE",[]));let oo=null;const uh=()=>oo??(oo=dn("WALINE_REACTION",{}));var Tr=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ra={},sn={},Vn={},fh=Tr&&Tr.__awaiter||function(e,t,n,r){return new(n||(n=Promise))(function(i,s){function o(u){try{a(r.next(u))}catch(c){s(c)}}function l(u){try{a(r.throw(u))}catch(c){s(c)}}function a(u){var c;u.done?i(u.value):(c=u.value,c instanceof n?c:new n(function(f){f(c)})).then(o,l)}a((r=r.apply(e,t||[])).next())})},dh=Tr&&Tr.__generator||function(e,t){var n,r,i,s,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return s={next:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function l(a){return function(u){return function(c){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(i=2&c[0]?r.return:c[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,c[1])).done)return i;switch(r=0,i&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,r=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(i=o.trys,!((i=i.length>0&&i[i.length-1])||c[0]!==6&&c[0]!==2)){o=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]"u")return Promise.reject(new Error("This is a library for the browser!"));if(e.getLoadingState()===Lt.LOADED)return e.instance.getSiteKey()===t?Promise.resolve(e.instance):Promise.reject(new Error("reCAPTCHA already loaded with different site key!"));if(e.getLoadingState()===Lt.LOADING)return t!==e.instanceSiteKey?Promise.reject(new Error("reCAPTCHA already loaded with different site key!")):new Promise(function(i,s){e.successfulLoadingConsumers.push(function(o){return i(o)}),e.errorLoadingRunnable.push(function(o){return s(o)})});e.instanceSiteKey=t,e.setLoadingState(Lt.LOADING);var r=new e;return new Promise(function(i,s){r.loadScript(t,n.useRecaptchaNet||!1,n.useEnterprise||!1,n.renderParameters?n.renderParameters:{},n.customUrl).then(function(){e.setLoadingState(Lt.LOADED);var o=r.doExplicitRender(grecaptcha,t,n.explicitRenderParameters?n.explicitRenderParameters:{},n.useEnterprise||!1),l=new ph.ReCaptchaInstance(t,o,grecaptcha);e.successfulLoadingConsumers.forEach(function(a){return a(l)}),e.successfulLoadingConsumers=[],n.autoHideBadge&&l.hideBadge(),e.instance=l,i(l)}).catch(function(o){e.errorLoadingRunnable.forEach(function(l){return l(o)}),e.errorLoadingRunnable=[],s(o)})})},e.getInstance=function(){return e.instance},e.setLoadingState=function(t){e.loadingState=t},e.getLoadingState=function(){return e.loadingState===null?Lt.NOT_LOADED:e.loadingState},e.prototype.loadScript=function(t,n,r,i,s){var o=this;n===void 0&&(n=!1),r===void 0&&(r=!1),i===void 0&&(i={}),s===void 0&&(s="");var l=document.createElement("script");l.setAttribute("recaptcha-v3-script","");var a="https://www.google.com/recaptcha/api.js";n&&(a=r?"https://recaptcha.net/recaptcha/enterprise.js":"https://recaptcha.net/recaptcha/api.js"),r&&(a="https://www.google.com/recaptcha/enterprise.js"),s&&(a=s),i.render&&(i.render=void 0);var u=this.buildQueryString(i);return l.src=a+"?render=explicit"+u,new Promise(function(c,f){l.addEventListener("load",o.waitForScriptToLoad(function(){c(l)},r),!1),l.onerror=function(h){e.setLoadingState(Lt.NOT_LOADED),f(h)},document.head.appendChild(l)})},e.prototype.buildQueryString=function(t){return Object.keys(t).length<1?"":"&"+Object.keys(t).filter(function(n){return!!t[n]}).map(function(n){return n+"="+t[n]}).join("&")},e.prototype.waitForScriptToLoad=function(t,n){var r=this;return function(){window.grecaptcha===void 0?setTimeout(function(){r.waitForScriptToLoad(t,n)},e.SCRIPT_LOAD_DELAY):n?window.grecaptcha.enterprise.ready(function(){t()}):window.grecaptcha.ready(function(){t()})}},e.prototype.doExplicitRender=function(t,n,r,i){var s={sitekey:n,badge:r.badge,size:r.size,tabindex:r.tabindex};return r.container?i?t.enterprise.render(r.container,s):t.render(r.container,s):i?t.enterprise.render(s):t.render(s)},e.loadingState=null,e.instance=null,e.instanceSiteKey=null,e.successfulLoadingConsumers=[],e.errorLoadingRunnable=[],e.SCRIPT_LOAD_DELAY=25,e}();sn.load=lo.load,sn.getInstance=lo.getInstance,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.ReCaptchaInstance=e.getInstance=e.load=void 0;var t=sn;Object.defineProperty(e,"load",{enumerable:!0,get:function(){return t.load}}),Object.defineProperty(e,"getInstance",{enumerable:!0,get:function(){return t.getInstance}});var n=Vn;Object.defineProperty(e,"ReCaptchaInstance",{enumerable:!0,get:function(){return n.ReCaptchaInstance}})}(ra);const ao={};let co=null;const Qi=()=>co??(co=dn("WALINE_USER",{})),mh={key:0,class:"wl-reaction"},gh=["textContent"],Eh={class:"wl-reaction-list"},vh=["onClick"],_h={class:"wl-reaction-img"},yh=["src","alt"],Ah=["textContent"],bh=["textContent"];var wh=Ne({__name:"ArticleReaction",setup(e,{expose:t}){t();const n=uh(),r=Me("config"),i=G(-1),s=G([]),o=pe(()=>r.value.locale),l=pe(()=>r.value.reaction.length>0),a=pe(()=>{const{reaction:c,path:f}=r.value;return c.map((h,m)=>({icon:h,desc:o.value[`reaction${m}`],active:n.value[f]===m}))});let u;return ut(()=>{Fe(()=>[r.value.serverURL,r.value.path],()=>{(async()=>{if(l.value){const{serverURL:c,lang:f,path:h,reaction:m}=r.value,A=new AbortController;u=A.abort.bind(A);const E=await Gl({serverURL:c,lang:f,paths:[h],type:m.map((b,v)=>`reaction${v}`),signal:A.signal});if(Array.isArray(E)||typeof E=="number")return;s.value=m.map((b,v)=>E[`reaction${v}`])}})()},{immediate:!0})}),_n(()=>u==null?void 0:u()),(c,f)=>a.value.length?(I(),j("div",mh,[D("div",{class:"wl-reaction-title",textContent:me(o.value.reactionTitle)},null,8,gh),D("ul",Eh,[(I(!0),j(_e,null,Je(a.value,({active:h,icon:m,desc:A},E)=>(I(),j("li",{key:E,class:Se(["wl-reaction-item",{active:h}]),onClick:b=>(async v=>{if(i.value===-1){const{serverURL:_,lang:R,path:k}=r.value,H=n.value[k];i.value=v,H!==void 0&&(await bi({serverURL:_,lang:R,path:k,type:`reaction${H}`,action:"desc"}),s.value[H]=Math.max(s.value[H]-1,0)),H!==v&&(await bi({serverURL:_,lang:R,path:k,type:`reaction${v}`}),s.value[v]=(s.value[v]||0)+1),H===v?delete n.value[k]:n.value[k]=v,i.value=-1}})(E)},[D("div",_h,[D("img",{src:m,alt:A},null,8,yh),i.value===E?(I(),Ke(Z(Hn),{key:0,class:"wl-reaction-loading"})):(I(),j("div",{key:1,class:"wl-reaction-votes",textContent:me(s.value[E]||0)},null,8,Ah))]),D("div",{class:"wl-reaction-text",textContent:me(A)},null,8,bh)],10,vh))),128))])])):fe("v-if",!0)}}),Gn=(e,t)=>{const n=e.__vccOpts||e;for(const[r,i]of t)n[r]=i;return n},kh=Gn(wh,[["__file","ArticleReaction.vue"]]);const xh=["data-index"],Ch=["src","title","onClick"];var Bh=Gn(Ne({__name:"ImageWall",props:{items:{default:()=>[]},columnWidth:{default:300},gap:{default:0}},emits:["insert"],setup(e,{expose:t}){const n=e;t();let r=null;const i=G(null),s=G({}),o=G([]),l=()=>{const f=Math.floor((i.value.getBoundingClientRect().width+n.gap)/(n.columnWidth+n.gap));return f>0?f:1},a=async f=>{var m;if(f>=n.items.length)return;await Jn();const h=Array.from(((m=i.value)==null?void 0:m.children)||[]).reduce((A,E)=>E.getBoundingClientRect().height{if(o.value.length===l()&&!f)return;var h;o.value=(h=l(),new Array(h).fill(null).map(()=>[]));const m=window.scrollY;await a(0),window.scrollTo({top:m})},c=f=>{s.value[f.target.src]=!0};return ut(()=>{u(!0),r=new ResizeObserver(()=>{u()}),r.observe(i.value),Fe(()=>[n.items],()=>{s.value={},u(!0)}),Fe(()=>[n.columnWidth,n.gap],()=>{u()})}),Vi(()=>r.unobserve(i.value)),(f,h)=>(I(),j("div",{ref_key:"wall",ref:i,class:"wl-gallery",style:zn({gap:`${f.gap}px`})},[(I(!0),j(_e,null,Je(o.value,(m,A)=>(I(),j("div",{key:A,class:"wl-gallery-column","data-index":A,style:zn({gap:`${f.gap}px`})},[(I(!0),j(_e,null,Je(m,E=>(I(),j(_e,{key:E},[s.value[f.items[E].src]?fe("v-if",!0):(I(),Ke(Z(Hn),{key:0,size:36,style:{margin:"20px auto"}})),D("img",{class:"wl-gallery-item",src:f.items[E].src,title:f.items[E].title,loading:"lazy",onLoad:c,onClick:b=>f.$emit("insert",`![](${f.items[E].src})`)},null,40,Ch)],64))),128))],12,xh))),128))],4))}}),[["__file","ImageWall.vue"]]);const Rh={class:"wl-comment"},Lh={key:0,class:"wl-login-info"},Sh={class:"wl-avatar"},$h=["title"],Th=["title"],Ih=["src"],Oh=["title","textContent"],Ph={class:"wl-panel"},Dh=["for","textContent"],zh=["id","onUpdate:modelValue","name","type"],Fh=["placeholder"],Mh={class:"wl-preview"},jh=D("hr",null,null,-1),Nh=["innerHTML"],Uh={class:"wl-footer"},Hh={class:"wl-actions"},Vh={href:"https://guides.github.com/features/mastering-markdown/",title:"Markdown Guide","aria-label":"Markdown is supported",class:"wl-action",target:"_blank",rel:"noopener noreferrer"},qh=["title"],Wh=["title"],Kh=["title"],Zh=["title"],Jh={class:"wl-info"},Gh=D("div",{class:"wl-captcha-container"},null,-1),Yh={class:"wl-text-number"},Qh={key:0},Xh=["textContent"],ep=["textContent"],tp=["disabled"],np=["placeholder"],rp={key:1,class:"wl-loading"},ip={key:0,class:"wl-tab-wrapper"},sp=["title","onClick"],op=["src","alt"],lp={key:0,class:"wl-tabs"},ap=["onClick"],cp=["src","alt","title"],up=["title"];var fp=Ne({__name:"CommentBox",props:{edit:{default:null},rootId:{default:""},replyId:{default:""},replyUser:{default:""}},emits:["log","cancelEdit","cancelReply","submit"],setup(e,{expose:t,emit:n}){const r=e;t();const i=Me("config"),s=dn("WALINE_COMMENT_BOX_EDITOR",""),o=dn("WALINE_USER_META",{nick:"",mail:"",link:""}),l=Qi(),a=G({}),u=G(null),c=G(null),f=G(null),h=G(null),m=G(null),A=G(null),E=G(null),b=G({tabs:[],map:{}}),v=G(0),_=G(!1),R=G(!1),k=G(!1),H=G(""),K=G(0),O=Ot({loading:!0,list:[]}),P=G(0),ie=G(!1),ce=G(""),ye=G(!1),Y=G(!1),W=pe(()=>i.value.locale),M=pe(()=>{var B;return!!((B=l.value)!=null&&B.token)}),de=pe(()=>i.value.imageUploader!==!1),Q=B=>{const S=u.value,d=S.selectionStart,p=S.selectionEnd||0,g=S.scrollTop;s.value=S.value.substring(0,d)+B+S.value.substring(p,S.value.length),S.focus(),S.selectionStart=d+B.length,S.selectionEnd=d+B.length,S.scrollTop=g},oe=B=>{const S=B.key;(B.ctrlKey||B.metaKey)&&S==="Enter"&&Te()},ne=B=>{const S=`![${i.value.locale.uploading} ${B.name}]()`;return Q(S),ye.value=!0,Promise.resolve().then(()=>i.value.imageUploader(B)).then(d=>{s.value=s.value.replace(S,`\r +![${B.name}](${d})`)}).catch(d=>{alert(d.message),s.value=s.value.replace(S,"")}).then(()=>{ye.value=!1})},$e=B=>{var S;if((S=B.dataTransfer)!=null&&S.items){const d=no(B.dataTransfer.items);d&&de.value&&(ne(d),B.preventDefault())}},Ie=B=>{if(B.clipboardData){const S=no(B.clipboardData.items);S&&de.value&&ne(S)}},Pe=()=>{const B=c.value;B.files&&de.value&&ne(B.files[0]).then(()=>{B.value=""})},Te=async()=>{var L,J,V,X,se,ue;const{serverURL:B,lang:S,login:d,wordLimit:p,requiredMeta:g,recaptchaV3Key:y,turnstileKey:w}=i.value,C=await(async()=>{if(!navigator)return"";const{userAgentData:ve}=navigator;let he=navigator.userAgent;if(!ve||ve.platform!=="Windows")return he;const{platformVersion:be}=await ve.getHighEntropyValues(["platformVersion"]);return be&&parseInt(be.split(".")[0])>=13&&(he=he.replace("Windows NT 10.0","Windows NT 11.0")),he})(),$={comment:ce.value,nick:o.value.nick,mail:o.value.mail,link:o.value.link,url:i.value.path,ua:C};if((L=l.value)!=null&&L.token)$.nick=l.value.display_name,$.mail=l.value.email,$.link=l.value.url;else{if(d==="force")return;if(g.indexOf("nick")>-1&&!$.nick)return(J=a.value.nick)==null||J.focus(),alert(W.value.nickError);if(g.indexOf("mail")>-1&&!$.mail||$.mail&&(T=$.mail,!qd.test(T)))return(V=a.value.mail)==null||V.focus(),alert(W.value.mailError);$.nick||($.nick=W.value.anonymous)}var T;if($.comment){if(!ie.value)return alert(W.value.wordHint.replace("$0",p[0].toString()).replace("$1",p[1].toString()).replace("$2",K.value.toString()));$.comment=ta($.comment,b.value.map),r.replyId&&r.rootId&&($.pid=r.replyId,$.rid=r.rootId,$.at=r.replyUser),ye.value=!0;try{y&&($.recaptchaV3=await(be=>{const Ue=ao[be]??(ao[be]=ra.load(be,{useRecaptchaNet:!0,autoHideBadge:!0}));return{execute:De=>Ue.then(kt=>kt.execute(De))}})(y).execute("social")),w&&($.turnstile=await(z=w,{execute:async be=>{const{load:Ue}=dd("https://challenges.cloudflare.com/turnstile/v0/api.js",void 0,{async:!1});await Ue();const De=window==null?void 0:window.turnstile;return new Promise(kt=>{De==null||De.ready(()=>{De==null||De.render(".wl-captcha-container",{sitekey:z,action:be,size:"compact",callback:kt})})})}}).execute("social"));const ve={serverURL:B,lang:S,token:(X=l.value)==null?void 0:X.token,comment:$},he=await(r.edit?gr({objectId:r.edit.objectId,...ve}):(({serverURL:be,lang:Ue,token:De,comment:kt})=>{const xt={"Content-Type":"application/json"};return De&&(xt.Authorization=`Bearer ${De}`),fetch(`${be}/comment?lang=${Ue}`,{method:"POST",headers:xt,body:JSON.stringify(kt)}).then(Yn=>Yn.json())})(ve));if(ye.value=!1,he.errmsg)return alert(he.errmsg);n("submit",he.data),s.value="",H.value="",r.replyId&&n("cancelReply"),(se=r.edit)!=null&&se.objectId&&n("cancelEdit")}catch(ve){ye.value=!1,alert(ve.message)}var z}else(ue=u.value)==null||ue.focus()},et=B=>{B.preventDefault();const{lang:S,serverURL:d}=i.value;(({lang:p,serverURL:g})=>{const y=(window.innerWidth-450)/2,w=(window.innerHeight-450)/2,C=window.open(`${g}/ui/login?lng=${encodeURIComponent(p)}`,"_blank",`width=450,height=450,left=${y},top=${w},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return C==null||C.postMessage({type:"TOKEN",data:null},"*"),new Promise($=>{const T=({data:z})=>{z&&typeof z=="object"&&z.type==="userInfo"&&z.data.token&&(C==null||C.close(),window.removeEventListener("message",T),$(z.data))};window.addEventListener("message",T)})})({serverURL:d,lang:S}).then(p=>{l.value=p,(p.remember?localStorage:sessionStorage).setItem("WALINE_USER",JSON.stringify(p)),n("log")})},tt=()=>{l.value={},localStorage.setItem("WALINE_USER","null"),sessionStorage.setItem("WALINE_USER","null"),n("log")},nt=B=>{B.preventDefault();const{lang:S,serverURL:d}=i.value,p=(window.innerWidth-800)/2,g=(window.innerHeight-800)/2,y=new URLSearchParams({lng:S,token:l.value.token}),w=window.open(`${d}/ui/profile?${y.toString()}`,"_blank",`width=800,height=800,left=${p},top=${g},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);w==null||w.postMessage({type:"TOKEN",data:l.value.token},"*")},Le=B=>{var S,d,p,g;(S=f.value)!=null&&S.contains(B.target)||(d=h.value)!=null&&d.contains(B.target)||(_.value=!1),(p=m.value)!=null&&p.contains(B.target)||(g=A.value)!=null&&g.contains(B.target)||(R.value=!1)},x=async B=>{var C;const{scrollTop:S,clientHeight:d,scrollHeight:p}=B.target,g=(d+S)/p,y=i.value.search,w=((C=E.value)==null?void 0:C.value)||"";g<.9||O.loading||Y.value||(O.loading=!0,(y.more&&O.list.length?await y.more(w,O.list.length):await y.search(w)).length?O.list=[...O.list,...y.more&&O.list.length?await y.more(w,O.list.length):await y.search(w)]:Y.value=!0,O.loading=!1,setTimeout(()=>{B.target.scrollTop=S},50))},N=Xf(B=>{O.list=[],Y.value=!1,x(B)},300);Fe([i,K],([B,S])=>{const{wordLimit:d}=B;d?Sd[1]?(P.value=d[1],ie.value=!1):(P.value=d[1],ie.value=!0):(P.value=0,ie.value=!0)},{immediate:!0});const F=({data:B})=>{B&&B.type==="profile"&&(l.value={...l.value,...B.data},[localStorage,sessionStorage].filter(S=>S.getItem("WALINE_USER")).forEach(S=>S.setItem("WALINE_USER",JSON.stringify(l))))};return ut(()=>{var B;document.body.addEventListener("click",Le),window.addEventListener("message",F),(B=r.edit)!=null&&B.objectId&&(s.value=r.edit.orig),Fe(R,async S=>{if(!S)return;const d=i.value.search;E.value&&(E.value.value=""),O.loading=!0,O.list=d.default?await d.default():await d.search(""),O.loading=!1}),Fe(()=>s.value,S=>{const{highlighter:d,texRenderer:p}=i.value;ce.value=S,H.value=Qd(S,{emojiMap:b.value.map,highlighter:d,texRenderer:p}),K.value=(g=>{var y,w;return(((y=(C=>C.match(/[\w\d\s,.\u00C0-\u024F\u0400-\u04FF]+/giu))(g))==null?void 0:y.reduce((C,$)=>C+($.trim()===""?0:$.trim().split(/\s+/u).length),0))||0)+(((w=(C=>C.match(/[\u4E00-\u9FD5]/gu))(g))==null?void 0:w.length)||0)})(S),S?Hs(u.value):Hs.destroy(u.value)},{immediate:!0}),Fe(()=>i.value.emoji,S=>{return(d=S,Promise.all(d.map(p=>typeof p=="string"?Wd(Ql(p)):Promise.resolve(p))).then(p=>{const g={tabs:[],map:{}};return p.forEach(y=>{const{name:w,folder:C,icon:$,prefix:T,type:z,items:L}=y;g.tabs.push({name:w,icon:to($,C,T,z),items:L.map(J=>{const V=`${T||""}${J}`;return g.map[V]=to(J,C,T,z),V})})}),g})).then(p=>{b.value=p});var d},{immediate:!0})}),_n(()=>{document.body.removeEventListener("click",Le),window.removeEventListener("message",F)}),(B,S)=>{var d,p;return I(),j("div",Rh,[Z(i).login!=="disable"&&M.value&&!((d=B.edit)!=null&&d.objectId)?(I(),j("div",Lh,[D("div",Sh,[D("button",{type:"submit",class:"wl-logout-btn",title:W.value.logout,onClick:tt},[le(Z(io),{size:14})],8,$h),D("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:W.value.profile,onClick:nt},[D("img",{src:Z(l).avatar,alt:"avatar"},null,8,Ih)],8,Th)]),D("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:W.value.profile,onClick:nt,textContent:me(Z(l).display_name)},null,8,Oh)])):fe("v-if",!0),D("div",Ph,[Z(i).login!=="force"&&Z(i).meta.length&&!M.value?(I(),j("div",{key:0,class:Se(["wl-header",`item${Z(i).meta.length}`])},[(I(!0),j(_e,null,Je(Z(i).meta,g=>(I(),j("div",{key:g,class:"wl-header-item"},[D("label",{for:`wl-${g}`,textContent:me(W.value[g]+(Z(i).requiredMeta.includes(g)||!Z(i).requiredMeta.length?"":`(${W.value.optional})`))},null,8,Dh),ir(D("input",{id:`wl-${g}`,ref_for:!0,ref:y=>{y&&(a.value[g]=y)},"onUpdate:modelValue":y=>Z(o)[g]=y,class:Se(["wl-input",`wl-${g}`]),name:g,type:g==="mail"?"email":"text"},null,10,zh),[[Mu,Z(o)[g]]])]))),128))],2)):fe("v-if",!0),ir(D("textarea",{id:"wl-edit",ref_key:"editorRef",ref:u,"onUpdate:modelValue":S[0]||(S[0]=g=>ze(s)?s.value=g:null),class:"wl-editor",placeholder:B.replyUser?`@${B.replyUser}`:W.value.placeholder,onKeydown:oe,onDrop:$e,onPaste:Ie},null,40,Fh),[[yi,Z(s)]]),ir(D("div",Mh,[jh,D("h4",null,me(W.value.preview)+":",1),D("div",{class:"wl-content",innerHTML:H.value},null,8,Nh)],512),[[Fs,k.value]]),D("div",Uh,[D("div",Hh,[D("a",Vh,[le(Z(sh))]),ir(D("button",{ref_key:"emojiButtonRef",ref:f,type:"button",class:Se(["wl-action",{active:_.value}]),title:W.value.emoji,onClick:S[1]||(S[1]=g=>_.value=!_.value)},[le(Z(th))],10,qh),[[Fs,b.value.tabs.length]]),Z(i).search?(I(),j("button",{key:0,ref_key:"gifButtonRef",ref:m,type:"button",class:Se(["wl-action",{active:R.value}]),title:W.value.gif,onClick:S[2]||(S[2]=g=>R.value=!R.value)},[le(Z(ch))],10,Wh)):fe("v-if",!0),D("input",{id:"wl-image-upload",ref_key:"imageUploadRef",ref:c,class:"upload",type:"file",accept:".png,.jpg,.jpeg,.webp,.bmp,.gif",onChange:Pe},null,544),de.value?(I(),j("label",{key:1,for:"wl-image-upload",class:"wl-action",title:W.value.uploadImage},[le(Z(nh))],8,Kh)):fe("v-if",!0),D("button",{type:"button",class:Se(["wl-action",{active:k.value}]),title:W.value.preview,onClick:S[3]||(S[3]=g=>k.value=!k.value)},[le(Z(ih))],10,Zh)]),D("div",Jh,[Gh,D("div",Yh,[Ge(me(K.value)+" ",1),Z(i).wordLimit?(I(),j("span",Qh,[Ge("  /  "),D("span",{class:Se({illegal:!ie.value}),textContent:me(P.value)},null,10,Xh)])):fe("v-if",!0),Ge("  "+me(W.value.word),1)]),Z(i).login==="disable"||M.value?fe("v-if",!0):(I(),j("button",{key:0,type:"button",class:"wl-btn",onClick:et,textContent:me(W.value.login)},null,8,ep)),Z(i).login!=="force"||M.value?(I(),j("button",{key:1,type:"submit",class:"primary wl-btn",title:"Cmd|Ctrl + Enter",disabled:ye.value,onClick:Te},[ye.value?(I(),Ke(Z(Hn),{key:0,size:16})):(I(),j(_e,{key:1},[Ge(me(W.value.submit),1)],64))],8,tp)):fe("v-if",!0)]),D("div",{ref_key:"gifPopupRef",ref:A,class:Se(["wl-gif-popup",{display:R.value}])},[D("input",{ref_key:"gifSearchInputRef",ref:E,type:"text",placeholder:W.value.gifSearchPlaceholder,onInput:S[4]||(S[4]=(...g)=>Z(N)&&Z(N)(...g))},null,40,np),O.list.length?(I(),Ke(Bh,{key:0,items:O.list,"column-width":200,gap:6,onInsert:S[5]||(S[5]=g=>Q(g)),onScroll:x},null,8,["items"])):fe("v-if",!0),O.loading?(I(),j("div",rp,[le(Z(Hn),{size:30})])):fe("v-if",!0)],2),D("div",{ref_key:"emojiPopupRef",ref:h,class:Se(["wl-emoji-popup",{display:_.value}])},[(I(!0),j(_e,null,Je(b.value.tabs,(g,y)=>(I(),j(_e,{key:g.name},[y===v.value?(I(),j("div",ip,[(I(!0),j(_e,null,Je(g.items,w=>(I(),j("button",{key:w,type:"button",title:w,onClick:C=>Q(`:${w}:`)},[_.value?(I(),j("img",{key:0,class:"wl-emoji",src:b.value.map[w],alt:w,loading:"lazy",referrerPolicy:"no-referrer"},null,8,op)):fe("v-if",!0)],8,sp))),128))])):fe("v-if",!0)],64))),128)),b.value.tabs.length>1?(I(),j("div",lp,[(I(!0),j(_e,null,Je(b.value.tabs,(g,y)=>(I(),j("button",{key:g.name,type:"button",class:Se(["wl-tab",{active:v.value===y}]),onClick:w=>v.value=y},[D("img",{class:"wl-emoji",src:g.icon,alt:g.name,title:g.name,loading:"lazy",referrerPolicy:"no-referrer"},null,8,cp)],10,ap))),128))])):fe("v-if",!0)],2)])]),B.replyId||(p=B.edit)!=null&&p.objectId?(I(),j("button",{key:1,type:"button",class:"wl-close",title:W.value.cancelReply,onClick:S[6]||(S[6]=g=>B.$emit(B.replyId?"cancelReply":"cancelEdit"))},[le(Z(io),{size:24})],8,up)):fe("v-if",!0)])}}}),ia=Gn(fp,[["__file","CommentBox.vue"]]);const dp=["id"],hp={class:"wl-user","aria-hidden":"true"},pp=["src"],mp={class:"wl-card"},gp={class:"wl-head"},Ep=["href"],vp={key:1,class:"wl-nick"},_p=["textContent"],yp=["textContent"],Ap=["textContent"],bp=["textContent"],wp=["textContent"],kp={class:"wl-comment-actions"},xp=["title"],Cp=["textContent"],Bp=["title"],Rp={class:"wl-meta","aria-hidden":"true"},Lp=["data-value","textContent"],Sp=["data-value","textContent"],$p=["data-value","textContent"],Tp=["innerHTML"],Ip={key:1,class:"wl-admin-actions"},Op={class:"wl-comment-status"},Pp=["disabled","onClick","textContent"],Dp={key:3,class:"wl-quote"};var zp=Gn(Ne({__name:"CommentCard",props:{comment:{},edit:{default:null},rootId:{},reply:{default:null}},emits:["log","submit","delete","edit","like","status","sticky","reply"],setup(e){const t=e,n=["approved","waiting","spam"],r=Me("config"),i=na(),s=fd(),o=Qi(),l=pe(()=>r.value.locale),a=pe(()=>{const{link:E}=t.comment;return E?Xl(E)?E:`https://${E}`:""}),u=pe(()=>i.value.includes(t.comment.objectId)),c=pe(()=>Vd(t.comment.insertedAt,s.value,l.value)),f=pe(()=>o.value.type==="administrator"),h=pe(()=>t.comment.user_id&&o.value.objectId===t.comment.user_id),m=pe(()=>{var E;return t.comment.objectId===((E=t.reply)==null?void 0:E.objectId)}),A=pe(()=>{var E;return t.comment.objectId===((E=t.edit)==null?void 0:E.objectId)});return(E,b)=>{var _;const v=qi("CommentCard",!0);return I(),j("div",{id:E.comment.objectId,class:"wl-card-item"},[D("div",hp,[E.comment.avatar?(I(),j("img",{key:0,src:E.comment.avatar},null,8,pp)):fe("v-if",!0),E.comment.type?(I(),Ke(Z(ah),{key:1})):fe("v-if",!0)]),D("div",mp,[D("div",gp,[a.value?(I(),j("a",{key:0,class:"wl-nick",href:a.value,target:"_blank",rel:"nofollow noopener noreferrer"},me(E.comment.nick),9,Ep)):(I(),j("span",vp,me(E.comment.nick),1)),E.comment.type==="administrator"?(I(),j("span",{key:2,class:"wl-badge",textContent:me(l.value.admin)},null,8,_p)):fe("v-if",!0),E.comment.label?(I(),j("span",{key:3,class:"wl-badge",textContent:me(E.comment.label)},null,8,yp)):fe("v-if",!0),E.comment.sticky?(I(),j("span",{key:4,class:"wl-badge",textContent:me(l.value.sticky)},null,8,Ap)):fe("v-if",!0),E.comment.level!==void 0&&E.comment.level>=0?(I(),j("span",{key:5,class:Se(`wl-badge level${E.comment.level}`),textContent:me(l.value[`level${E.comment.level}`]||`Level ${E.comment.level}`)},null,10,bp)):fe("v-if",!0),D("span",{class:"wl-time",textContent:me(c.value)},null,8,wp),D("div",kp,[f.value||h.value?(I(),j("button",{key:0,type:"button",class:"wl-edit",onClick:b[0]||(b[0]=()=>E.$emit("edit",E.comment))},[le(Z(lh))])):fe("v-if",!0),f.value||h.value?(I(),j("button",{key:1,type:"button",class:"wl-delete",onClick:b[1]||(b[1]=R=>E.$emit("delete",E.comment))},[le(Z(eh))])):fe("v-if",!0),D("button",{type:"button",class:"wl-like",title:u.value?l.value.cancelLike:l.value.like,onClick:b[2]||(b[2]=R=>E.$emit("like",E.comment))},[le(Z(rh),{active:u.value},null,8,["active"]),"like"in E.comment?(I(),j("span",{key:0,textContent:me(E.comment.like)},null,8,Cp)):fe("v-if",!0)],8,xp),D("button",{type:"button",class:Se(["wl-reply",{active:m.value}]),title:m.value?l.value.cancelReply:l.value.reply,onClick:b[3]||(b[3]=R=>E.$emit("reply",m.value?null:E.comment))},[le(Z(oh))],10,Bp)])]),D("div",Rp,[E.comment.addr?(I(),j("span",{key:0,class:"wl-addr","data-value":E.comment.addr,textContent:me(E.comment.addr)},null,8,Lp)):fe("v-if",!0),E.comment.browser?(I(),j("span",{key:1,class:"wl-browser","data-value":E.comment.browser,textContent:me(E.comment.browser)},null,8,Sp)):fe("v-if",!0),E.comment.os?(I(),j("span",{key:2,class:"wl-os","data-value":E.comment.os,textContent:me(E.comment.os)},null,8,$p)):fe("v-if",!0)]),A.value?fe("v-if",!0):(I(),j("div",{key:0,class:"wl-content",innerHTML:E.comment.comment},null,8,Tp)),f.value&&!A.value?(I(),j("div",Ip,[D("span",Op,[(I(),j(_e,null,Je(n,R=>D("button",{key:R,type:"submit",class:Se(`wl-btn wl-${R}`),disabled:E.comment.status===R,onClick:k=>E.$emit("status",{status:R,comment:E.comment}),textContent:me(l.value[R])},null,10,Pp)),64))]),f.value&&!E.comment.rid?(I(),j("button",{key:0,type:"submit",class:"wl-btn wl-sticky",onClick:b[4]||(b[4]=R=>E.$emit("sticky",E.comment))},me(E.comment.sticky?l.value.unsticky:l.value.sticky),1)):fe("v-if",!0)])):fe("v-if",!0),m.value||A.value?(I(),j("div",{key:2,class:Se({"wl-reply-wrapper":m.value,"wl-edit-wrapper":A.value})},[le(ia,{edit:E.edit,"reply-id":(_=E.reply)==null?void 0:_.objectId,"reply-user":E.comment.nick,"root-id":E.rootId,onLog:b[5]||(b[5]=R=>E.$emit("log")),onCancelReply:b[6]||(b[6]=R=>E.$emit("reply",null)),onCancelEdit:b[7]||(b[7]=R=>E.$emit("edit",null)),onSubmit:b[8]||(b[8]=R=>E.$emit("submit",R))},null,8,["edit","reply-id","reply-user","root-id"])],2)):fe("v-if",!0),E.comment.children?(I(),j("div",Dp,[(I(!0),j(_e,null,Je(E.comment.children,R=>(I(),Ke(v,{key:R.objectId,comment:R,reply:E.reply,edit:E.edit,"root-id":E.rootId,onLog:b[9]||(b[9]=k=>E.$emit("log")),onDelete:b[10]||(b[10]=k=>E.$emit("delete",k)),onEdit:b[11]||(b[11]=k=>E.$emit("edit",k)),onLike:b[12]||(b[12]=k=>E.$emit("like",k)),onReply:b[13]||(b[13]=k=>E.$emit("reply",k)),onStatus:b[14]||(b[14]=k=>E.$emit("status",k)),onSticky:b[15]||(b[15]=k=>E.$emit("sticky",k)),onSubmit:b[16]||(b[16]=k=>E.$emit("submit",k))},null,8,["comment","reply","edit","root-id"]))),128))])):fe("v-if",!0)])],8,dp)}}}),[["__file","CommentCard.vue"]]);const Fp="2.15.8",Mp={"data-waline":""},jp={class:"wl-meta-head"},Np={class:"wl-count"},Up=["textContent"],Hp={class:"wl-sort"},Vp=["onClick"],qp={class:"wl-cards"},Wp={key:1,class:"wl-operation"},Kp=["textContent"],Zp={key:0,class:"wl-loading"},Jp=["textContent"],Gp={key:2,class:"wl-operation"},Yp=["textContent"],Qp={key:3,class:"wl-power"},Xp=D("a",{href:"https://github.com/walinejs/waline",target:"_blank",rel:"noopener noreferrer"}," Waline ",-1);var em=Ne({__name:"WalineComment",props:["serverURL","path","meta","requiredMeta","dark","commentSorting","lang","locale","pageSize","wordLimit","emoji","login","highlighter","texRenderer","imageUploader","search","copyright","recaptchaV3Key","turnstileKey","reaction"],setup(e){const t=e,n={latest:"insertedAt_desc",oldest:"insertedAt_asc",hottest:"like_desc"},r=Object.keys(n),i=Qi(),s=na(),o=G("loading"),l=G(0),a=G(1),u=G(0),c=pe(()=>(({serverURL:Y,path:W=location.pathname,lang:M=typeof navigator>"u"?"en-US":navigator.language,locale:de,emoji:Q=Ys,meta:oe=["nick","mail","link"],requiredMeta:ne=[],dark:$e=!1,pageSize:Ie=10,wordLimit:Pe,imageUploader:Te,highlighter:et,texRenderer:tt,copyright:nt=!0,login:Le="enable",search:x,reaction:N,recaptchaV3Key:F="",turnstileKey:B="",commentSorting:S="latest",...d})=>({serverURL:$r(Y),path:Yl(W),locale:{...ti[M]||ti[Pd],...typeof de=="object"?de:{}},wordLimit:Hd(Pe),meta:Gs(oe),requiredMeta:Gs(ne),imageUploader:ni(Te,zd),highlighter:ni(et,Nd),texRenderer:ni(tt,Fd),lang:Object.keys(ti).includes(M)?M:"en-US",dark:$e,emoji:typeof Q=="boolean"?Q?Ys:[]:Q,pageSize:Ie,login:Le,copyright:nt,search:x!==!1&&(typeof x=="object"?x:Md(M)),recaptchaV3Key:F,turnstileKey:B,reaction:Array.isArray(N)?N:N===!0?Dd:[],commentSorting:S,...d}))(t)),f=G(c.value.commentSorting),h=G([]),m=G(null),A=G(null),E=pe(()=>{return typeof(Y=c.value.dark)=="string"?Y==="auto"?`@media(prefers-color-scheme:dark){body${ri}}`:`${Y}${ri}`:Y===!0?`:root${ri}`:"";var Y}),b=pe(()=>c.value.locale);let v;pd(E,{id:"waline-darkmode"});const _=Y=>{var oe;const{serverURL:W,path:M,pageSize:de}=c.value,Q=new AbortController;o.value="loading",v==null||v(),(({serverURL:ne,lang:$e,path:Ie,page:Pe,pageSize:Te,sortBy:et,signal:tt,token:nt})=>{const Le={};return nt&&(Le.Authorization=`Bearer ${nt}`),fetch(`${ne}/comment?path=${encodeURIComponent(Ie)}&pageSize=${Te}&page=${Pe}&lang=${$e}&sortBy=${et}`,{signal:tt,headers:Le}).then(x=>x.json()).then(x=>Ai(x,"Get comment data"))})({serverURL:W,lang:c.value.lang,path:M,pageSize:de,sortBy:n[f.value],page:Y,signal:Q.signal,token:(oe=i.value)==null?void 0:oe.token}).then(ne=>{o.value="success",l.value=ne.count,h.value.push(...ne.data),a.value=Y,u.value=ne.totalPages}).catch(ne=>{ne.name!=="AbortError"&&(console.error(ne.message),o.value="error")}),v=Q.abort.bind(Q)},R=()=>_(a.value+1),k=()=>{l.value=0,h.value=[],_(1)},H=Y=>{m.value=Y},K=Y=>{A.value=Y},O=Y=>{if(A.value)A.value.comment=Y.comment,A.value.orig=Y.orig;else if(Y.rid){const W=h.value.find(({objectId:M})=>M===Y.rid);if(!W)return;Array.isArray(W.children)||(W.children=[]),W.children.push(Y)}else h.value.unshift(Y),l.value+=1},P=async({comment:Y,status:W})=>{var Q;if(Y.status===W)return;const{serverURL:M,lang:de}=c.value;await gr({serverURL:M,lang:de,token:(Q=i.value)==null?void 0:Q.token,objectId:Y.objectId,comment:{status:W}}),Y.status=W},ie=async Y=>{var de;if(Y.rid)return;const{serverURL:W,lang:M}=c.value;await gr({serverURL:W,lang:M,token:(de=i.value)==null?void 0:de.token,objectId:Y.objectId,comment:{sticky:Y.sticky?0:1}}),Y.sticky=!Y.sticky},ce=async({objectId:Y})=>{var de;if(!confirm("Are you sure you want to delete this comment?"))return;const{serverURL:W,lang:M}=c.value;await(({serverURL:Q,lang:oe,token:ne,objectId:$e})=>fetch(`${Q}/comment/${$e}?lang=${oe}`,{method:"DELETE",headers:{Authorization:`Bearer ${ne}`}}).then(Ie=>Ie.json()).then(Ie=>Ai(Ie,"Delete comment")))({serverURL:W,lang:M,token:(de=i.value)==null?void 0:de.token,objectId:Y}),h.value.some((Q,oe)=>Q.objectId===Y?(h.value=h.value.filter((ne,$e)=>$e!==oe),!0):Q.children.some((ne,$e)=>ne.objectId===Y&&(h.value[oe].children=Q.children.filter((Ie,Pe)=>Pe!==$e),!0)))},ye=async Y=>{var oe;const{serverURL:W,lang:M}=c.value,{objectId:de}=Y,Q=s.value.includes(de);await gr({serverURL:W,lang:M,objectId:de,token:(oe=i.value)==null?void 0:oe.token,comment:{like:!Q}}),Q?s.value=s.value.filter(ne=>ne!==de):(s.value=[...s.value,de],s.value.length>50&&(s.value=s.value.slice(-50))),Y.like=(Y.like||0)+(Q?-1:1)};return rn("config",c),ut(()=>{Fe(()=>[t.serverURL,t.path],()=>k(),{immediate:!0})}),_n(()=>v==null?void 0:v()),(Y,W)=>(I(),j("div",Mp,[le(kh),m.value?fe("v-if",!0):(I(),Ke(ia,{key:0,onLog:k,onSubmit:O})),D("div",jp,[D("div",Np,[l.value?(I(),j("span",{key:0,class:"wl-num",textContent:me(l.value)},null,8,Up)):fe("v-if",!0),Ge(" "+me(b.value.comment),1)]),D("ul",Hp,[(I(!0),j(_e,null,Je(Z(r),M=>(I(),j("li",{key:M,class:Se([M===f.value?"active":""]),onClick:de=>(Q=>{f.value!==Q&&(f.value=Q,k())})(M)},me(b.value[M]),11,Vp))),128))])]),D("div",qp,[(I(!0),j(_e,null,Je(h.value,M=>(I(),Ke(zp,{key:M.objectId,"root-id":M.objectId,comment:M,reply:m.value,edit:A.value,onLog:k,onReply:H,onEdit:K,onSubmit:O,onStatus:P,onDelete:ce,onSticky:ie,onLike:ye},null,8,["root-id","comment","reply","edit"]))),128))]),o.value==="error"?(I(),j("div",Wp,[D("button",{type:"button",class:"wl-btn",onClick:k,textContent:me(b.value.refresh)},null,8,Kp)])):(I(),j(_e,{key:2},[o.value==="loading"?(I(),j("div",Zp,[le(Z(Hn),{size:30})])):h.value.length?a.value{t.forEach((n,r)=>{n.innerText=e[r].toString()})},nm=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-pageview-count",update:r=!0,lang:i=navigator.language})=>{const s=new AbortController,o=Array.from(document.querySelectorAll(n)),l=c=>{const f=ro(c);return f!==null&&t!==f},a=c=>(({serverURL:f,lang:h,paths:m,signal:A})=>Gl({serverURL:f,lang:h,paths:m,type:["time"],signal:A}).then(E=>Array.isArray(E)?E:[E]))({serverURL:$r(e),paths:c.map(f=>ro(f)||t),lang:i,signal:s.signal}).then(f=>uo(f,c)).catch(ea);if(r){const c=o.filter(h=>!l(h)),f=o.filter(l);(u={serverURL:$r(e),path:t,lang:i},bi({...u,type:"time",action:"inc"})).then(h=>uo(new Array(c.length).fill(h),c)),f.length&&a(f)}else a(o);var u;return s.abort.bind(s)},rm=({el:e="#waline",path:t=window.location.pathname,comment:n=!1,pageview:r=!1,...i})=>{const s=e?Kd(e):null;if(e&&!s)throw new Error("Option 'el' do not match any domElement!");if(!i.serverURL)throw new Error("Option 'serverURL' is missing!");const o=Ot({...i}),l=Ot({comment:n,pageview:r,path:t}),a=s?Hu(()=>ge(tm,{path:l.path,...o})):null;a&&a.mount(s);const u=pi(()=>{l.comment&&Xd({serverURL:o.serverURL,path:l.path,selector:typeof l.comment=="string"?l.comment:void 0})}),c=pi(()=>{l.pageview&&nm({serverURL:o.serverURL,path:l.path,selector:typeof l.pageview=="string"?l.pageview:void 0})});return{el:s,update:({comment:f,pageview:h,path:m=window.location.pathname,...A}={})=>{Object.entries(A).forEach(([E,b])=>{o[E]=b}),l.path=m,f!==void 0&&(l.comment=f),h!==void 0&&(l.pageview=h)},destroy:()=>{a==null||a.unmount(),u(),c()}}};/*! + * vue-router v4.2.5 + * (c) 2023 Eduardo San Martin Morote + * @license MIT + */const Gt=typeof window<"u";function im(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const ke=Object.assign;function si(e,t){const n={};for(const r in t){const i=t[r];n[r]=ct(i)?i.map(e):e(i)}return n}const In=()=>{},ct=Array.isArray,sm=/\/$/,om=e=>e.replace(sm,"");function oi(e,t,n="/"){let r,i={},s="",o="";const l=t.indexOf("#");let a=t.indexOf("?");return l=0&&(a=-1),a>-1&&(r=t.slice(0,a),s=t.slice(a+1,l>-1?l:t.length),i=e(s)),l>-1&&(r=r||t.slice(0,l),o=t.slice(l,t.length)),r=um(r??t,n),{fullPath:r+(s&&"?")+s+o,path:r,query:i,hash:o}}function lm(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function fo(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function am(e,t,n){const r=t.matched.length-1,i=n.matched.length-1;return r>-1&&r===i&&hn(t.matched[r],n.matched[i])&&sa(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function hn(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function sa(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!cm(e[n],t[n]))return!1;return!0}function cm(e,t){return ct(e)?ho(e,t):ct(t)?ho(t,e):e===t}function ho(e,t){return ct(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function um(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),i=r[r.length-1];(i===".."||i===".")&&r.push("");let s=n.length-1,o,l;for(o=0;o1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(o-(o===r.length?1:0)).join("/")}var qn;(function(e){e.pop="pop",e.push="push"})(qn||(qn={}));var On;(function(e){e.back="back",e.forward="forward",e.unknown=""})(On||(On={}));function fm(e){if(!e)if(Gt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),om(e)}const dm=/^[^#]+#/;function hm(e,t){return e.replace(dm,"#")+t}function pm(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const Hr=()=>({left:window.pageXOffset,top:window.pageYOffset});function mm(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),i=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!i)return;t=pm(i,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function po(e,t){return(history.state?history.state.position-t:-1)+e}const wi=new Map;function gm(e,t){wi.set(e,t)}function Em(e){const t=wi.get(e);return wi.delete(e),t}let vm=()=>location.protocol+"//"+location.host;function oa(e,t){const{pathname:n,search:r,hash:i}=t,s=e.indexOf("#");if(s>-1){let l=i.includes(e.slice(s))?e.slice(s).length:1,a=i.slice(l);return a[0]!=="/"&&(a="/"+a),fo(a,"")}return fo(n,e)+r+i}function _m(e,t,n,r){let i=[],s=[],o=null;const l=({state:h})=>{const m=oa(e,location),A=n.value,E=t.value;let b=0;if(h){if(n.value=m,t.value=h,o&&o===A){o=null;return}b=E?h.position-E.position:0}else r(m);i.forEach(v=>{v(n.value,A,{delta:b,type:qn.pop,direction:b?b>0?On.forward:On.back:On.unknown})})};function a(){o=n.value}function u(h){i.push(h);const m=()=>{const A=i.indexOf(h);A>-1&&i.splice(A,1)};return s.push(m),m}function c(){const{history:h}=window;h.state&&h.replaceState(ke({},h.state,{scroll:Hr()}),"")}function f(){for(const h of s)h();s=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:a,listen:u,destroy:f}}function mo(e,t,n,r=!1,i=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:i?Hr():null}}function ym(e){const{history:t,location:n}=window,r={value:oa(e,n)},i={value:t.state};i.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(a,u,c){const f=e.indexOf("#"),h=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+a:vm()+e+a;try{t[c?"replaceState":"pushState"](u,"",h),i.value=u}catch(m){console.error(m),n[c?"replace":"assign"](h)}}function o(a,u){const c=ke({},t.state,mo(i.value.back,a,i.value.forward,!0),u,{position:i.value.position});s(a,c,!0),r.value=a}function l(a,u){const c=ke({},i.value,t.state,{forward:a,scroll:Hr()});s(c.current,c,!0);const f=ke({},mo(r.value,a,null),{position:c.position+1},u);s(a,f,!1),r.value=a}return{location:r,state:i,push:l,replace:o}}function Am(e){e=fm(e);const t=ym(e),n=_m(e,t.state,t.location,t.replace);function r(s,o=!0){o||n.pauseListeners(),history.go(s)}const i=ke({location:"",base:e,go:r,createHref:hm.bind(null,e)},t,n);return Object.defineProperty(i,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,"state",{enumerable:!0,get:()=>t.state.value}),i}function bm(e){return typeof e=="string"||e&&typeof e=="object"}function la(e){return typeof e=="string"||typeof e=="symbol"}const Et={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},aa=Symbol("");var go;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(go||(go={}));function pn(e,t){return ke(new Error,{type:e,[aa]:!0},t)}function mt(e,t){return e instanceof Error&&aa in e&&(t==null||!!(e.type&t))}const Eo="[^/]+?",wm={sensitive:!1,strict:!1,start:!0,end:!0},km=/[.+*?^${}()[\]/\\]/g;function xm(e,t){const n=ke({},wm,t),r=[];let i=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(i+="/");for(let f=0;ft.length?t.length===1&&t[0]===40+40?1:-1:0}function Bm(e,t){let n=0;const r=e.score,i=t.score;for(;n0&&t[t.length-1]<0}const Rm={type:0,value:""},Lm=/[a-zA-Z0-9_]/;function Sm(e){if(!e)return[[]];if(e==="/")return[[Rm]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${u}": ${m}`)}let n=0,r=n;const i=[];let s;function o(){s&&i.push(s),s=[]}let l=0,a,u="",c="";function f(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(a==="*"||a==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:a==="*"||a==="+",optional:a==="*"||a==="?"})):t("Invalid state to consume buffer"),u="")}function h(){u+=a}for(;l{o(_)}:In}function o(c){if(la(c)){const f=r.get(c);f&&(r.delete(c),n.splice(n.indexOf(f),1),f.children.forEach(o),f.alias.forEach(o))}else{const f=n.indexOf(c);f>-1&&(n.splice(f,1),c.record.name&&r.delete(c.record.name),c.children.forEach(o),c.alias.forEach(o))}}function l(){return n}function a(c){let f=0;for(;f=0&&(c.record.path!==n[f].record.path||!ca(c,n[f]));)f++;n.splice(f,0,c),c.record.name&&!yo(c)&&r.set(c.record.name,c)}function u(c,f){let h,m={},A,E;if("name"in c&&c.name){if(h=r.get(c.name),!h)throw pn(1,{location:c});E=h.record.name,m=ke(_o(f.params,h.keys.filter(_=>!_.optional).map(_=>_.name)),c.params&&_o(c.params,h.keys.map(_=>_.name))),A=h.stringify(m)}else if("path"in c)A=c.path,h=n.find(_=>_.re.test(A)),h&&(m=h.parse(A),E=h.record.name);else{if(h=f.name?r.get(f.name):n.find(_=>_.re.test(f.path)),!h)throw pn(1,{location:c,currentLocation:f});E=h.record.name,m=ke({},f.params,c.params),A=h.stringify(m)}const b=[];let v=h;for(;v;)b.unshift(v.record),v=v.parent;return{name:E,path:A,params:m,matched:b,meta:Pm(b)}}return e.forEach(c=>s(c)),{addRoute:s,resolve:u,removeRoute:o,getRoutes:l,getRecordMatcher:i}}function _o(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Im(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Om(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function Om(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function yo(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Pm(e){return e.reduce((t,n)=>ke(t,n.meta),{})}function Ao(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function ca(e,t){return t.children.some(n=>n===e||ca(e,n))}const ua=/#/g,Dm=/&/g,zm=/\//g,Fm=/=/g,Mm=/\?/g,fa=/\+/g,jm=/%5B/g,Nm=/%5D/g,da=/%5E/g,Um=/%60/g,ha=/%7B/g,Hm=/%7C/g,pa=/%7D/g,Vm=/%20/g;function Xi(e){return encodeURI(""+e).replace(Hm,"|").replace(jm,"[").replace(Nm,"]")}function qm(e){return Xi(e).replace(ha,"{").replace(pa,"}").replace(da,"^")}function ki(e){return Xi(e).replace(fa,"%2B").replace(Vm,"+").replace(ua,"%23").replace(Dm,"%26").replace(Um,"`").replace(ha,"{").replace(pa,"}").replace(da,"^")}function Wm(e){return ki(e).replace(Fm,"%3D")}function Km(e){return Xi(e).replace(ua,"%23").replace(Mm,"%3F")}function Zm(e){return e==null?"":Km(e).replace(zm,"%2F")}function Ir(e){try{return decodeURIComponent(""+e)}catch{}return""+e}function Jm(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let i=0;is&&ki(s)):[r&&ki(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Gm(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=ct(r)?r.map(i=>i==null?null:""+i):r==null?r:""+r)}return t}const Ym=Symbol(""),wo=Symbol(""),es=Symbol(""),ts=Symbol(""),xi=Symbol("");function wn(){let e=[];function t(r){return e.push(r),()=>{const i=e.indexOf(r);i>-1&&e.splice(i,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function St(e,t,n,r,i){const s=r&&(r.enterCallbacks[i]=r.enterCallbacks[i]||[]);return()=>new Promise((o,l)=>{const a=f=>{f===!1?l(pn(4,{from:n,to:t})):f instanceof Error?l(f):bm(f)?l(pn(2,{from:t,to:f})):(s&&r.enterCallbacks[i]===s&&typeof f=="function"&&s.push(f),o())},u=e.call(r&&r.instances[i],t,n,a);let c=Promise.resolve(u);e.length<3&&(c=c.then(a)),c.catch(f=>l(f))})}function li(e,t,n,r){const i=[];for(const s of e)for(const o in s.components){let l=s.components[o];if(!(t!=="beforeRouteEnter"&&!s.instances[o]))if(Qm(l)){const u=(l.__vccOpts||l)[t];u&&i.push(St(u,n,r,s,o))}else{let a=l();i.push(()=>a.then(u=>{if(!u)return Promise.reject(new Error(`Couldn't resolve component "${o}" at "${s.path}"`));const c=im(u)?u.default:u;s.components[o]=c;const h=(c.__vccOpts||c)[t];return h&&St(h,n,r,s,o)()}))}}return i}function Qm(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function ko(e){const t=Me(es),n=Me(ts),r=pe(()=>t.resolve(Z(e.to))),i=pe(()=>{const{matched:a}=r.value,{length:u}=a,c=a[u-1],f=n.matched;if(!c||!f.length)return-1;const h=f.findIndex(hn.bind(null,c));if(h>-1)return h;const m=xo(a[u-2]);return u>1&&xo(c)===m&&f[f.length-1].path!==m?f.findIndex(hn.bind(null,a[u-2])):h}),s=pe(()=>i.value>-1&&ng(n.params,r.value.params)),o=pe(()=>i.value>-1&&i.value===n.matched.length-1&&sa(n.params,r.value.params));function l(a={}){return tg(a)?t[Z(e.replace)?"replace":"push"](Z(e.to)).catch(In):Promise.resolve()}return{route:r,href:pe(()=>r.value.href),isActive:s,isExactActive:o,navigate:l}}const Xm=Ne({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:ko,setup(e,{slots:t}){const n=Ot(ko(e)),{options:r}=Me(es),i=pe(()=>({[Co(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Co(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:ge("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:i.value},s)}}}),eg=Xm;function tg(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function ng(e,t){for(const n in t){const r=t[n],i=e[n];if(typeof r=="string"){if(r!==i)return!1}else if(!ct(i)||i.length!==r.length||r.some((s,o)=>s!==i[o]))return!1}return!0}function xo(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Co=(e,t,n)=>e??t??n,rg=Ne({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Me(xi),i=pe(()=>e.route||r.value),s=Me(wo,0),o=pe(()=>{let u=Z(s);const{matched:c}=i.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),l=pe(()=>i.value.matched[o.value]);rn(wo,pe(()=>o.value+1)),rn(Ym,l),rn(xi,i);const a=G();return Fe(()=>[a.value,l.value,e.name],([u,c,f],[h,m,A])=>{c&&(c.instances[f]=u,m&&m!==c&&u&&u===h&&(c.leaveGuards.size||(c.leaveGuards=m.leaveGuards),c.updateGuards.size||(c.updateGuards=m.updateGuards))),u&&c&&(!m||!hn(c,m)||!h)&&(c.enterCallbacks[f]||[]).forEach(E=>E(u))},{flush:"post"}),()=>{const u=i.value,c=e.name,f=l.value,h=f&&f.components[c];if(!h)return Bo(n.default,{Component:h,route:u});const m=f.props[c],A=m?m===!0?u.params:typeof m=="function"?m(u):m:null,b=ge(h,ke({},A,t,{onVnodeUnmounted:v=>{v.component.isUnmounted&&(f.instances[c]=null)},ref:a}));return Bo(n.default,{Component:b,route:u})||b}}});function Bo(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const ma=rg;function ig(e){const t=Tm(e.routes,e),n=e.parseQuery||Jm,r=e.stringifyQuery||bo,i=e.history,s=wn(),o=wn(),l=wn(),a=ji(Et);let u=Et;Gt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=si.bind(null,x=>""+x),f=si.bind(null,Zm),h=si.bind(null,Ir);function m(x,N){let F,B;return la(x)?(F=t.getRecordMatcher(x),B=N):B=x,t.addRoute(B,F)}function A(x){const N=t.getRecordMatcher(x);N&&t.removeRoute(N)}function E(){return t.getRoutes().map(x=>x.record)}function b(x){return!!t.getRecordMatcher(x)}function v(x,N){if(N=ke({},N||a.value),typeof x=="string"){const g=oi(n,x,N.path),y=t.resolve({path:g.path},N),w=i.createHref(g.fullPath);return ke(g,y,{params:h(y.params),hash:Ir(g.hash),redirectedFrom:void 0,href:w})}let F;if("path"in x)F=ke({},x,{path:oi(n,x.path,N.path).path});else{const g=ke({},x.params);for(const y in g)g[y]==null&&delete g[y];F=ke({},x,{params:f(g)}),N.params=f(N.params)}const B=t.resolve(F,N),S=x.hash||"";B.params=c(h(B.params));const d=lm(r,ke({},x,{hash:qm(S),path:B.path})),p=i.createHref(d);return ke({fullPath:d,hash:S,query:r===bo?Gm(x.query):x.query||{}},B,{redirectedFrom:void 0,href:p})}function _(x){return typeof x=="string"?oi(n,x,a.value.path):ke({},x)}function R(x,N){if(u!==x)return pn(8,{from:N,to:x})}function k(x){return O(x)}function H(x){return k(ke(_(x),{replace:!0}))}function K(x){const N=x.matched[x.matched.length-1];if(N&&N.redirect){const{redirect:F}=N;let B=typeof F=="function"?F(x):F;return typeof B=="string"&&(B=B.includes("?")||B.includes("#")?B=_(B):{path:B},B.params={}),ke({query:x.query,hash:x.hash,params:"path"in B?{}:x.params},B)}}function O(x,N){const F=u=v(x),B=a.value,S=x.state,d=x.force,p=x.replace===!0,g=K(F);if(g)return O(ke(_(g),{state:typeof g=="object"?ke({},S,g.state):S,force:d,replace:p}),N||F);const y=F;y.redirectedFrom=N;let w;return!d&&am(r,B,F)&&(w=pn(16,{to:y,from:B}),Pe(B,B,!0,!1)),(w?Promise.resolve(w):ce(y,B)).catch(C=>mt(C)?mt(C,2)?C:Ie(C):ne(C,y,B)).then(C=>{if(C){if(mt(C,2))return O(ke({replace:p},_(C.to),{state:typeof C.to=="object"?ke({},S,C.to.state):S,force:d}),N||y)}else C=Y(y,B,!0,p,S);return ye(y,B,C),C})}function P(x,N){const F=R(x,N);return F?Promise.reject(F):Promise.resolve()}function ie(x){const N=tt.values().next().value;return N&&typeof N.runWithContext=="function"?N.runWithContext(x):x()}function ce(x,N){let F;const[B,S,d]=sg(x,N);F=li(B.reverse(),"beforeRouteLeave",x,N);for(const g of B)g.leaveGuards.forEach(y=>{F.push(St(y,x,N))});const p=P.bind(null,x,N);return F.push(p),Le(F).then(()=>{F=[];for(const g of s.list())F.push(St(g,x,N));return F.push(p),Le(F)}).then(()=>{F=li(S,"beforeRouteUpdate",x,N);for(const g of S)g.updateGuards.forEach(y=>{F.push(St(y,x,N))});return F.push(p),Le(F)}).then(()=>{F=[];for(const g of d)if(g.beforeEnter)if(ct(g.beforeEnter))for(const y of g.beforeEnter)F.push(St(y,x,N));else F.push(St(g.beforeEnter,x,N));return F.push(p),Le(F)}).then(()=>(x.matched.forEach(g=>g.enterCallbacks={}),F=li(d,"beforeRouteEnter",x,N),F.push(p),Le(F))).then(()=>{F=[];for(const g of o.list())F.push(St(g,x,N));return F.push(p),Le(F)}).catch(g=>mt(g,8)?g:Promise.reject(g))}function ye(x,N,F){l.list().forEach(B=>ie(()=>B(x,N,F)))}function Y(x,N,F,B,S){const d=R(x,N);if(d)return d;const p=N===Et,g=Gt?history.state:{};F&&(B||p?i.replace(x.fullPath,ke({scroll:p&&g&&g.scroll},S)):i.push(x.fullPath,S)),a.value=x,Pe(x,N,F,p),Ie()}let W;function M(){W||(W=i.listen((x,N,F)=>{if(!nt.listening)return;const B=v(x),S=K(B);if(S){O(ke(S,{replace:!0}),B).catch(In);return}u=B;const d=a.value;Gt&&gm(po(d.fullPath,F.delta),Hr()),ce(B,d).catch(p=>mt(p,12)?p:mt(p,2)?(O(p.to,B).then(g=>{mt(g,20)&&!F.delta&&F.type===qn.pop&&i.go(-1,!1)}).catch(In),Promise.reject()):(F.delta&&i.go(-F.delta,!1),ne(p,B,d))).then(p=>{p=p||Y(B,d,!1),p&&(F.delta&&!mt(p,8)?i.go(-F.delta,!1):F.type===qn.pop&&mt(p,20)&&i.go(-1,!1)),ye(B,d,p)}).catch(In)}))}let de=wn(),Q=wn(),oe;function ne(x,N,F){Ie(x);const B=Q.list();return B.length?B.forEach(S=>S(x,N,F)):console.error(x),Promise.reject(x)}function $e(){return oe&&a.value!==Et?Promise.resolve():new Promise((x,N)=>{de.add([x,N])})}function Ie(x){return oe||(oe=!x,M(),de.list().forEach(([N,F])=>x?F(x):N()),de.reset()),x}function Pe(x,N,F,B){const{scrollBehavior:S}=e;if(!Gt||!S)return Promise.resolve();const d=!F&&Em(po(x.fullPath,0))||(B||!F)&&history.state&&history.state.scroll||null;return Jn().then(()=>S(x,N,d)).then(p=>p&&mm(p)).catch(p=>ne(p,x,N))}const Te=x=>i.go(x);let et;const tt=new Set,nt={currentRoute:a,listening:!0,addRoute:m,removeRoute:A,hasRoute:b,getRoutes:E,resolve:v,options:e,push:k,replace:H,go:Te,back:()=>Te(-1),forward:()=>Te(1),beforeEach:s.add,beforeResolve:o.add,afterEach:l.add,onError:Q.add,isReady:$e,install(x){const N=this;x.component("RouterLink",eg),x.component("RouterView",ma),x.config.globalProperties.$router=N,Object.defineProperty(x.config.globalProperties,"$route",{enumerable:!0,get:()=>Z(a)}),Gt&&!et&&a.value===Et&&(et=!0,k(i.location).catch(S=>{}));const F={};for(const S in Et)Object.defineProperty(F,S,{get:()=>a.value[S],enumerable:!0});x.provide(es,N),x.provide(ts,qo(F)),x.provide(xi,a);const B=x.unmount;tt.add(x),x.unmount=function(){tt.delete(x),tt.size<1&&(u=Et,W&&W(),W=null,a.value=Et,et=!1,oe=!1),B()}}};function Le(x){return x.reduce((N,F)=>N.then(()=>ie(F)),Promise.resolve())}return nt}function sg(e,t){const n=[],r=[],i=[],s=Math.max(t.matched.length,e.matched.length);for(let o=0;ohn(u,l))?r.push(l):n.push(l));const a=e.matched[o];a&&(t.matched.find(u=>hn(u,a))||i.push(a))}return[n,r,i]}function og(){return Me(ts)}const lg={id:"comments",class:"relative p-5"},ag=Ne({__name:"Comment",setup(e){const t=pe(()=>og().path),n=Pl(),r=Ll(),i=Tl();return ut(()=>{n.value.serverURL&&(rm({el:"#comments",serverURL:n.value.serverURL,dark:'html[class="dark"]',path:t.value,lang:r.value||i.value.lang,pageview:!0}),document.getElementById("wl-nick").placeholder="昵称",document.getElementById("wl-mail").placeholder="邮箱",document.getElementById("wl-link").placeholder="网址",document.getElementById("wl-edit").placeholder=`1. 提问前请先仔细阅读本文档⚡ +2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址 +3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪`)}),(s,o)=>(I(),j("div",lg))}});const cg=Ft(ag,[["__file","Comment.vue"]]),ug={class:"first:mb-5 relative p-5"},fg={class:"inline-flex text-[.8125em] items-center my-5 mx-0 flex-wrap"},dg=D("i",{class:"ic i-home"},null,-1),hg={key:0,class:"ic i-angle-right"},pg={key:0,class:"ic i-angle-right"},mg=Ne({__name:"Layout",setup(e){const t=Ur(),n=Tl(),r=Cl();return(i,s)=>{const o=qi("RouterLink");return I(),Ke(zl,null,{header:Ut(()=>[D("h1",null,me(Z(t).title),1)]),content:Ut(()=>[D("div",ug,[D("div",fg,[dg,D("span",null,[le(o,{to:Z(n).base},{default:Ut(()=>[Ge("首页")]),_:1},8,["to"])]),Z(r).categories&&Z(r).categories.length?(I(),j("i",hg)):fe("",!0),Z(r).categories&&Z(r).categories.length?(I(!0),j(_e,{key:1},Je(Z(r).categories,(l,a)=>(I(),j(_e,{key:l.path},[D("span",{class:Se(a===Z(r).categories.length-1?"current":"")},[le(o,{to:l.path},{default:Ut(()=>[Ge(me(l.name),1)]),_:2},1032,["to"])],2),Z(r).categories&&Z(r).categories.length>1&&a!==Z(r).categories.length-1?(I(),j("i",pg)):fe("",!0)],64))),128)):fe("",!0)]),le(Kf)]),le(cg)]),_:1})}}}),gg=Ft(mg,[["__file","Layout.vue"]]),Eg={};function vg(e,t){return I(),j("div",null,"404")}const _g=Ft(Eg,[["render",vg],["__file","NotFound.vue"]]);const yg=Ol({layouts:{Layout:gg,NotFound:_g,IndexLayout:Nf}}),Ag={enhance:({app:e})=>{e.component("Comment",Ee(()=>U(()=>import("./Comment-1ec3b863.js"),[])))}},dr=[Ef,yg,Ag],bg=[["v-04d0e708","/computer-science/note/79abcd0d.html",{},["/computer-science/note/theme-shoka-doc.html","/computer-science/note/theme-shoka-doc.md"]],["v-6c73d6db","/computer-science/note/theme-shoka-doc/85a3718.html",{},["/computer-science/note/theme-shoka-doc/config.html","/computer-science/note/theme-shoka-doc/config.md"]],["v-24188f82","/computer-science/note/theme-shoka-doc/d30922d5.html",{},["/computer-science/note/theme-shoka-doc/dependents.html","/computer-science/note/theme-shoka-doc/dependents.md"]],["v-55334d5c","/computer-science/note/theme-shoka-doc/b7629dd4.html",{},["/computer-science/note/theme-shoka-doc/display.html","/computer-science/note/theme-shoka-doc/display.md"]],["v-0a4f90b1","/8612fa7f/ec060e02/Hadoop/15d9e331.html",{},["/计算机/大数据/Hadoop/win-hadoop.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%A4%A7%E6%95%B0%E6%8D%AE/Hadoop/win-hadoop.html","/计算机/大数据/Hadoop/win-hadoop.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%A4%A7%E6%95%B0%E6%8D%AE/Hadoop/win-hadoop.md"]],["v-6c92eadd","/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html",{},["/计算机/安卓/OpenGL/OpenGL环境测试.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/OpenGL/OpenGL%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95.html","/计算机/安卓/OpenGL/OpenGL环境测试.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/OpenGL/OpenGL%E7%8E%AF%E5%A2%83%E6%B5%8B%E8%AF%95.md"]],["v-0782f2c1","/8612fa7f/e00fc567/3632a017/af753a41.html",{},["/计算机/安卓/奇怪的问题/安卓Studio打不开.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%A5%87%E6%80%AA%E7%9A%84%E9%97%AE%E9%A2%98/%E5%AE%89%E5%8D%93Studio%E6%89%93%E4%B8%8D%E5%BC%80.html","/计算机/安卓/奇怪的问题/安卓Studio打不开.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%A5%87%E6%80%AA%E7%9A%84%E9%97%AE%E9%A2%98/%E5%AE%89%E5%8D%93Studio%E6%89%93%E4%B8%8D%E5%BC%80.md"]],["v-65e4fc7a","/8612fa7f/e00fc567/5ac6f809/49af668f.html",{},["/计算机/安卓/学习/ATresomeBug.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/ATresomeBug.html","/计算机/安卓/学习/ATresomeBug.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/ATresomeBug.md"]],["v-d874a1a0","/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html",{},["/计算机/安卓/学习/AndroidDevelopment01.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/AndroidDevelopment01.html","/计算机/安卓/学习/AndroidDevelopment01.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/AndroidDevelopment01.md"]],["v-867195e6","/8612fa7f/e00fc567/5ac6f809/c4877271.html",{},["/计算机/安卓/学习/android-study6.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/android-study6.html","/计算机/安卓/学习/android-study6.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/android-study6.md"]],["v-1cedfb83","/8612fa7f/e00fc567/5ac6f809/aa3015f4.html",{},["/计算机/安卓/学习/apktool.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/apktool.html","/计算机/安卓/学习/apktool.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%89%E5%8D%93/%E5%AD%A6%E4%B9%A0/apktool.md"]],["v-b46656c2","/8612fa7f/8f8103b7/Docker/29596f0c.html",{},["/计算机/容器/Docker/docker-es.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%B9%E5%99%A8/Docker/docker-es.html","/计算机/容器/Docker/docker-es.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%AE%B9%E5%99%A8/Docker/docker-es.md"]],["v-112a40d0","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%B7%A5%E5%85%B7/Git/git.html",{},["/计算机/工具/Git/git.html","/计算机/工具/Git/git.md",":md"]],["v-43b91011","/8612fa7f/79666db/7b216a3b/7cab1e06.html",{},["/计算机/数据结构/树/二叉搜索树.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%A0%91/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html","/计算机/数据结构/树/二叉搜索树.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%A0%91/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.md"]],["v-174701eb","/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html",{},["/计算机/文献阅读/信息检索/doc-study.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E6%96%87%E7%8C%AE%E9%98%85%E8%AF%BB/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2/doc-study.html","/计算机/文献阅读/信息检索/doc-study.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E6%96%87%E7%8C%AE%E9%98%85%E8%AF%BB/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2/doc-study.md"]],["v-6d631026","/8612fa7f/b7e144d1/e85d694a/c7081503.html",{},["/计算机/算法/二叉树/[105]从前序与中序遍历序列构造二叉树.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91/%5B105%5D%E4%BB%8E%E5%89%8D%E5%BA%8F%E4%B8%8E%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91.html","/计算机/算法/二叉树/[105]从前序与中序遍历序列构造二叉树.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91/%5B105%5D%E4%BB%8E%E5%89%8D%E5%BA%8F%E4%B8%8E%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91.md"]],["v-20253c7f","/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html",{},["/计算机/算法/二叉树/[124]二叉树中的最大路径和.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91/%5B124%5D%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E7%9A%84%E6%9C%80%E5%A4%A7%E8%B7%AF%E5%BE%84%E5%92%8C.html","/计算机/算法/二叉树/[124]二叉树中的最大路径和.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91/%5B124%5D%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%E7%9A%84%E6%9C%80%E5%A4%A7%E8%B7%AF%E5%BE%84%E5%92%8C.md"]],["v-a4e6871e","/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html",{},["/计算机/算法/二叉树/[230]二叉搜索树中第K小的元素.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91/%5B230%5D%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%AC%ACK%E5%B0%8F%E7%9A%84%E5%85%83%E7%B4%A0.html","/计算机/算法/二叉树/[230]二叉搜索树中第K小的元素.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E4%BA%8C%E5%8F%89%E6%A0%91/%5B230%5D%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%AC%ACK%E5%B0%8F%E7%9A%84%E5%85%83%E7%B4%A0.md"]],["v-e9d2e9e4","/8612fa7f/b7e144d1/340249a9/76a66db0.html",{},["/计算机/算法/数组/[2073]买票需要的时间.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E6%95%B0%E7%BB%84/%5B2073%5D%E4%B9%B0%E7%A5%A8%E9%9C%80%E8%A6%81%E7%9A%84%E6%97%B6%E9%97%B4.html","/计算机/算法/数组/[2073]买票需要的时间.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E6%95%B0%E7%BB%84/%5B2073%5D%E4%B9%B0%E7%A5%A8%E9%9C%80%E8%A6%81%E7%9A%84%E6%97%B6%E9%97%B4.md"]],["v-905b9eea","/8612fa7f/b7e144d1/2362a8ea/69a9925d.html",{},["/计算机/算法/链表/[141]环形链表.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B141%5D%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.html","/计算机/算法/链表/[141]环形链表.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B141%5D%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8.md"]],["v-bb3d14f0","/8612fa7f/b7e144d1/2362a8ea/389d18c2.html",{},["/计算机/算法/链表/[160]相交链表.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B160%5D%E7%9B%B8%E4%BA%A4%E9%93%BE%E8%A1%A8.html","/计算机/算法/链表/[160]相交链表.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B160%5D%E7%9B%B8%E4%BA%A4%E9%93%BE%E8%A1%A8.md"]],["v-124fddb4","/8612fa7f/b7e144d1/2362a8ea/36462e02.html",{},["/计算机/算法/链表/[19]删除链表的倒数第 N 个结点.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B19%5D%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%AC%20N%20%E4%B8%AA%E7%BB%93%E7%82%B9.html","/计算机/算法/链表/[19]删除链表的倒数第 N 个结点.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B19%5D%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%AC%20N%20%E4%B8%AA%E7%BB%93%E7%82%B9.md"]],["v-4339b5be","/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html",{},["/计算机/算法/链表/[21]合并两个有序链表.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B21%5D%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%9C%89%E5%BA%8F%E9%93%BE%E8%A1%A8.html","/计算机/算法/链表/[21]合并两个有序链表.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B21%5D%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%9C%89%E5%BA%8F%E9%93%BE%E8%A1%A8.md"]],["v-3e64061e","/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html",{},["/计算机/算法/链表/[23]合并K个升序链表.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B23%5D%E5%90%88%E5%B9%B6K%E4%B8%AA%E5%8D%87%E5%BA%8F%E9%93%BE%E8%A1%A8.html","/计算机/算法/链表/[23]合并K个升序链表.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B23%5D%E5%90%88%E5%B9%B6K%E4%B8%AA%E5%8D%87%E5%BA%8F%E9%93%BE%E8%A1%A8.md"]],["v-28dbf2be","/8612fa7f/b7e144d1/2362a8ea/3758805c.html",{},["/计算机/算法/链表/[86]分隔链表.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B86%5D%E5%88%86%E9%9A%94%E9%93%BE%E8%A1%A8.html","/计算机/算法/链表/[86]分隔链表.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B86%5D%E5%88%86%E9%9A%94%E9%93%BE%E8%A1%A8.md"]],["v-2a6e24b9","/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html",{},["/计算机/算法/链表/[876]链表的中间结点.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B876%5D%E9%93%BE%E8%A1%A8%E7%9A%84%E4%B8%AD%E9%97%B4%E7%BB%93%E7%82%B9.html","/计算机/算法/链表/[876]链表的中间结点.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B876%5D%E9%93%BE%E8%A1%A8%E7%9A%84%E4%B8%AD%E9%97%B4%E7%BB%93%E7%82%B9.md"]],["v-8a741eac","/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html",{},["/计算机/算法/链表/[剑指 Offer 22]链表中倒数第k个节点.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B%E5%89%91%E6%8C%87%20Offer%2022%5D%E9%93%BE%E8%A1%A8%E4%B8%AD%E5%80%92%E6%95%B0%E7%AC%ACk%E4%B8%AA%E8%8A%82%E7%82%B9.html","/计算机/算法/链表/[剑指 Offer 22]链表中倒数第k个节点.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B%E5%89%91%E6%8C%87%20Offer%2022%5D%E9%93%BE%E8%A1%A8%E4%B8%AD%E5%80%92%E6%95%B0%E7%AC%ACk%E4%B8%AA%E8%8A%82%E7%82%B9.md"]],["v-3551ab68","/8612fa7f/b7e144d1/2362a8ea/9862a150.html",{},["/计算机/算法/链表/[剑指 Offer II 022]链表中环的入口节点.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B%E5%89%91%E6%8C%87%20Offer%20II%20022%5D%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%8E%AF%E7%9A%84%E5%85%A5%E5%8F%A3%E8%8A%82%E7%82%B9.html","/计算机/算法/链表/[剑指 Offer II 022]链表中环的入口节点.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%AE%97%E6%B3%95/%E9%93%BE%E8%A1%A8/%5B%E5%89%91%E6%8C%87%20Offer%20II%20022%5D%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%8E%AF%E7%9A%84%E5%85%A5%E5%8F%A3%E8%8A%82%E7%82%B9.md"]],["v-67bb3c93","/8612fa7f/47867b98/Flutter/74684463.html",{},["/计算机/编程/Flutter/flutter-problem.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Flutter/flutter-problem.html","/计算机/编程/Flutter/flutter-problem.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Flutter/flutter-problem.md"]],["v-e3ac4c4c","/8612fa7f/47867b98/Java/fd72446f.html",{},["/计算机/编程/Java/nacos-gatewayl.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Java/nacos-gatewayl.html","/计算机/编程/Java/nacos-gatewayl.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Java/nacos-gatewayl.md"]],["v-92b3379e","/8612fa7f/47867b98/Java/9c47706b.html",{},["/计算机/编程/Java/openjdk.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Java/openjdk.html","/计算机/编程/Java/openjdk.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Java/openjdk.md"]],["v-4f301c8a","/8612fa7f/47867b98/Java/c82dcf86.html",{},["/计算机/编程/Java/yandex_mail_service.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Java/yandex_mail_service.html","/计算机/编程/Java/yandex_mail_service.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E7%BC%96%E7%A8%8B/Java/yandex_mail_service.md"]],["v-5b013ee8","/8612fa7f/e255a10a/a87da565/5eef9793.html",{},["/计算机/计算机网络/习题/ComputerNetworkClassAnswers.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E4%B9%A0%E9%A2%98/ComputerNetworkClassAnswers.html","/计算机/计算机网络/习题/ComputerNetworkClassAnswers.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E4%B9%A0%E9%A2%98/ComputerNetworkClassAnswers.md"]],["v-12caed67","/8612fa7f/e255a10a/a87da565/589e13eb.html",{},["/计算机/计算机网络/习题/dataLinkLayerAnswer.html","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E4%B9%A0%E9%A2%98/dataLinkLayerAnswer.html","/计算机/计算机网络/习题/dataLinkLayerAnswer.md","/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E4%B9%A0%E9%A2%98/dataLinkLayerAnswer.md"]],["v-3706649a","/404.html",{},[]]];var Ro=Ne({name:"Vuepress",setup(){const e=sf();return()=>ge(e.value)}}),wg=()=>bg.reduce((e,[t,n,r,i])=>(e.push({name:t,path:n,component:Ro,meta:r},{path:n.endsWith("/")?n+"index.html":n.substring(0,n.length-5),redirect:n},...i.map(s=>({path:s===":md"?n.substring(0,n.length-5)+".md":s,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:Ro}]),kg=Am,xg=()=>{const e=ig({history:kg(Yu("/")),routes:wg(),scrollBehavior:(t,n,r)=>r||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var r;(t.path!==n.path||n===Et)&&([t.meta._data]=await Promise.all([gt.resolvePageData(t.name),(r=wl[t.name])==null?void 0:r.__asyncLoader()]))}),e},Cg=e=>{e.component("ClientOnly",ff),e.component("Content",Il)},Bg=(e,t,n)=>{const r=js(()=>t.currentRoute.value.path),i=js(()=>gt.resolveRouteLocale(Yt.value.locales,r.value)),s=Zf(r,()=>t.currentRoute.value.meta._data),o=pe(()=>gt.resolveLayouts(n)),l=pe(()=>gt.resolveSiteLocaleData(Yt.value,i.value)),a=pe(()=>gt.resolvePageFrontmatter(s.value)),u=pe(()=>gt.resolvePageHeadTitle(s.value,l.value)),c=pe(()=>gt.resolvePageHead(u.value,a.value,l.value)),f=pe(()=>gt.resolvePageLang(s.value,l.value)),h=pe(()=>gt.resolvePageLayout(s.value,o.value));return e.provide(ef,o),e.provide(kl,s),e.provide(xl,a),e.provide(rf,u),e.provide(Bl,c),e.provide(Rl,f),e.provide(Sl,h),e.provide($l,i),e.provide(lf,l),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>a.value},$head:{get:()=>c.value},$headTitle:{get:()=>u.value},$lang:{get:()=>f.value},$page:{get:()=>s.value},$routeLocale:{get:()=>i.value},$site:{get:()=>Yt.value},$siteLocale:{get:()=>l.value},$withBase:{get:()=>df}}),{layouts:o,pageData:s,pageFrontmatter:a,pageHead:c,pageHeadTitle:u,pageLang:f,pageLayout:h,routeLocale:i,siteData:Yt,siteLocaleData:l}},Rg=()=>{const e=nf(),t=Ll(),n=G([]),r=()=>{e.value.forEach(s=>{const o=Lg(s);o&&n.value.push(o)})},i=()=>{document.documentElement.lang=t.value,n.value.forEach(s=>{s.parentNode===document.head&&document.head.removeChild(s)}),n.value.splice(0,n.value.length),e.value.forEach(s=>{const o=Sg(s);o!==null&&(document.head.appendChild(o),n.value.push(o))})};rn(af,i),ut(()=>{r(),i(),Fe(()=>e.value,i)})},Lg=([e,t,n=""])=>{const r=Object.entries(t).map(([l,a])=>Re(a)?`[${l}=${JSON.stringify(a)}]`:a===!0?`[${l}]`:"").join(""),i=`head > ${e}${r}`;return Array.from(document.querySelectorAll(i)).find(l=>l.innerText===n)||null},Sg=([e,t,n])=>{if(!Re(e))return null;const r=document.createElement(e);return Gu(t)&&Object.entries(t).forEach(([i,s])=>{Re(s)?r.setAttribute(i,s):s===!0&&r.setAttribute(i,"")}),Re(n)&&r.appendChild(document.createTextNode(n)),r},$g=Vu,Tg=async()=>{var n;const e=$g({name:"VuepressApp",setup(){var r;Rg();for(const i of dr)(r=i.setup)==null||r.call(i);return()=>[ge(ma),...dr.flatMap(({rootComponents:i=[]})=>i.map(s=>ge(s)))]}}),t=xg();Cg(e),Bg(e,t,dr);for(const r of dr)await((n=r.enhance)==null?void 0:n.call(r,{app:e,router:t,siteData:Yt}));return e.use(t),{app:e,router:t}};Tg().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{Ft as _,D as a,Ge as b,j as c,Tg as createVueApp,le as d,su as e,I as o,qi as r,Ut as w}; diff --git a/assets/b7629dd4.html-44f13d49.js b/assets/b7629dd4.html-44f13d49.js new file mode 100644 index 0000000..d579a14 --- /dev/null +++ b/assets/b7629dd4.html-44f13d49.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-55334d5c","path":"/computer-science/note/theme-shoka-doc/b7629dd4.html","title":"Step.3 界面显示","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"二进制杂谈\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"Theme Shoka Documentation\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd/Theme-Shoka-Documentation\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/b7629dd4.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/b7629dd4.html\\",\\"headline\\":\\"Step.3 界面显示\\",\\"name\\":\\"Step.3 界面显示\\",\\"datePublished\\":\\"2020-08-13\\",\\"dateModified\\":\\"2020-08-13\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/b7629dd4.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"Step.3 界面显示","date":"2020-08-13T21:12:48.000Z","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"二进制杂谈","path":"/categories/11159622/97a3d3dd"},{"name":"Theme Shoka Documentation","path":"/categories/11159622/97a3d3dd/Theme-Shoka-Documentation"}],"tags":[{"name":"Hexo","path":"/tags/Hexo"},{"name":"教程","path":"/tags/1868f51e"}],"valine":{"placeholder":"1. 提问前请先仔细阅读本文档⚡\\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"},"permalink":"/computer-science/note/theme-shoka-doc/b7629dd4.html","abbrlink":"b7629dd4"},"headers":[{"level":1,"title":"首页置顶文章","slug":"首页置顶文章","link":"#首页置顶文章","children":[]},{"level":1,"title":"首页精选分类","slug":"首页精选分类","link":"#首页精选分类","children":[]},{"level":1,"title":"文章封面图","slug":"文章封面图","link":"#文章封面图","children":[]},{"level":1,"title":"图片展示与相册","slug":"图片展示与相册","link":"#图片展示与相册","children":[{"level":2,"title":"图案列表No.1","slug":"图案列表no-1","link":"#图案列表no-1","children":[]},{"level":2,"title":"图案列表No.2","slug":"图案列表no-2","link":"#图案列表no-2","children":[]}]},{"level":1,"title":"自定义页面配色","slug":"自定义页面配色","link":"#自定义页面配色","children":[]},{"level":1,"title":"自定义主题图片","slug":"自定义主题图片","link":"#自定义主题图片","children":[]},{"level":1,"title":"自定义语言包","slug":"自定义语言包","link":"#自定义语言包","children":[]}]}`);export{t as data}; diff --git a/assets/b7629dd4.html-79a9d301.js b/assets/b7629dd4.html-79a9d301.js new file mode 100644 index 0000000..70a33c9 --- /dev/null +++ b/assets/b7629dd4.html-79a9d301.js @@ -0,0 +1,57 @@ +import{_ as r,r as n,o as s,c as d,a as e,b as t,d as c,w as a,e as l}from"./app-5c46a61a.js";const i={},p=e("br",null,null,-1),g=e("strong",null,"🌈界面显示",-1),h=e("br",null,null,-1),u=l(`

    首页置顶文章

    在文章的Front Matter设置sticky: true,则该文章将显示在首页最上方的置顶文章列。
    多篇文章按照发布时间倒序排列,不分页。

    ---
    +title: 置顶文章
    +sticky: true
    +---
    +

    首页精选分类

    想要在首页显示分类翻转块,需要按照以下示例的方式,给需要显示的分类加上封面图。

    1. 首先,修改站点配置:
      找到category_map:,配置每个分类对应的英文映射,比如:

      category_map:
      +  计算机科学: computer-science
      +  Java: java
      +  C++: cpp
      +  二进制杂谈: note
      +  计算机程序设计(C++)-西安交通大学: course-1
      +  零基础学Java语言-浙江大学-翁恺: course-1
      +  面向对象程序设计-Java语言-浙江大学-翁恺: course-2
      +

      注意:hexo会自动处理路径中的特殊字符,~\`!@#$%^&*()-_+=[]{}|\\;:"'<>,.?以及空格,这些全部会被替换成-
      所以避免在设置中使用上述字符,否则可导致无法抓取到目录下的cover.jpg

    2. <root>/source/_posts文件夹相应的目录里,存放封面图
      例子:如 第1周 计算 这篇文章。
      所处的分类是

      categories:
      +- [计算机科学, Java, 零基础学Java语言-浙江大学-翁恺]
      +

      现在需要在首页显示零基础学Java语言-浙江大学-翁恺这个分类,翻转卡片后,显示这个分类下的文章们。
      而该分类经过英文映射,它的路径将是/computer-science/java/course-1/

      那么,请在<root>/source/_posts/computer-science/java/course-1/的目录下放置cover.jpg文件。
      只要分类路径对应的目录下存在cover.jpg文件,这个分类就会在首页显示。
      在进行hexo g时,本分类的封面图会自动被复制到public目录里相应的位置。

    3. 事实上,为了方便文章管理,这个分类下所有文章的md文件,我都会放在<root>/source/_posts/computer-science/java/course-1/这个目录下。

      且站点配置文件里,永久链接设置如下

      permalink: :title/
      +

      hexo g后,文章的html文件们将全部生成到<root>/public/computer-science/java/course-1/目录。
      具体可以查看本博客的github仓库

    4. 文章详情界面中的系列文章,显示的是与当前文章同一分类的其他文章,并按照文章名正序排序。

    o(* ̄▽ ̄*)ゞ
    其实,不设置category_map也可以,只要在分类路径对应的文件夹下存在cover.jpg文件就行。
    现在,这项功能与category_dir的配置也无关,hexo g生成后,图片会自动被转移到category_dir的相关子目录下。

    文章封面图

    `,8),m=l(`
  • 如果文章的Front Matter设置了cover: image path,则封面会显示这张图片。

    title: Images
    +cover: assets/wallpaper-2572384.jpg
    +# 或者写成
    +cover: http://placehold.it/350x150.jpg
    +---
    +

    这里cover的值可以是位于source目录里的图片文件,此处是<root>/source/assets/wallpaper-2572384.jpg文件,也可以是一个某网址。

  • 如果文章是一个gallery post,即Front Matter设置了photos,则会封面会显示设置的第一张图片。

    title: Gallery Post
    +photos:
    +- assets/wallpaper-2572384.jpg
    +- assets/wallpaper-2311325.jpg
    +- assets/wallpaper-878514.jpg
    +- http://placehold.it/350x150.jpg
    +---
    +

    此时默认会显示第一个图片,即位于<root>/source/assets/目录里的wallpaper-2572384.jpg

  • 如果站点配置中设置了post_asset_folder: true,那么上述本地图片路径应为<root>/source/_posts/文章同名的文件夹/assets/wallpaper-2572384.jpg,当然此时assets目录可以省掉。

  • `,3),b=l(`

    图片展示与相册

    在文章的Front Matter设置fancybox: false,可以关闭文章页的图片展示功能。
    使用Justified-Gallery对Gallery Post内图案进行排列。

    下面介绍一些小技巧:

    1. 让图案下方显示title的markdown代码
    ![这里是alt](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "这里是title")
    +

    这里是alt

    1. 设置图片的大小
    ![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度和高度"){height="100px" width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度"){width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定高度"){height="100px"}
    +

    {height=“100px” width=“400px”}

    {width=“400px”}

    {height=“100px”}

    1. 除了在Front Matter里配置photos可以显示相册图案列表外,还可以这样写
    ## 图案列表No.1
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclfdu6exj20zk0m87hw.jpg "这里是title")
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclflwv2aj20zk0m84qp.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclg5ms2rj20zk0m8u0x.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclhnx9glj20zk0m8npd.jpg)
    +{.gallery}
    +
    +## 图案列表No.2
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicitht3xtj20zk0m8k5v.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclil3m4ej20zk0m8tn8.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicljgocqbj20zk0m8e81.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gipetfk5zwj20zk0m8e81.jpg)
    +{.gallery data-height="120"}
    +

    data-height用来设置每行的高度,默认为220

    图案列表No.1





    {.gallery}

    图案列表No.2





    {.gallery data-height=“120”}

    自定义页面配色

    主题配色全部在<root>/themes/shoka/source/css/_colors.styl文件中,可以自行查看。

    <root>/source/_data/目录新建文件colors.styl,在此文件中添改样式。

    自定义colors.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    主题支持在<root>/source/_data/目录建立三个自定义styl文件:

    `,23),j=e("thead",null,[e("tr",null,[e("th",null,"自定义文件名"),e("th",null,"对应默认样式文件"),e("th",null,"样式功能")])],-1),_=e("tr",null,[e("td",null,[e("code",null,"colors.styl")]),e("td",null,[e("code",null,"_colors.styl")]),e("td",null,"页面配色")],-1),y=e("td",null,[e("code",null,"iconfont.styl")],-1),k=e("td",null,[e("code",null,"_iconfont.styl")],-1),v=e("tr",null,[e("td",null,[e("code",null,"custom.styl")]),e("td",null,"-"),e("td",null,"任意自定义样式")],-1),f=l(`

    自定义主题图片

    如果想要修改主题的<root>/themes/shoka/source/images/目录内的某张图片,请在<root>/source/_data/目录新建目录images,并在这个文件夹中添加++同名++文件,部署时将自动覆盖主题内的默认图片。

    可以用此方法自定义头像、打赏二维码等图片,并且避免覆盖更新主题时遗失自定义文件。

    自定义语言包

    本功能参考NexT,主要可以用来定义菜单等处显示的文字,且可以方便主题无脑覆盖升级。

    <root>/source/_data/目录新建文件languages.yml

    按照以下格式添加配置项:

    # language
    +zh-CN:
    +  # items
    +  post:
    +    copyright:
    +      # the translation you perfer
    +      author: 本文博主
    +en:
    +  menu:
    +    travellings: Travellings
    +

    可以参考主题目录下的example/source/_data文件夹。

    站点配置及文件的Front Matter中,language项只支持zh-CNzh-HKzh-TWjaen
    类似写成zh_CN这样是不可以的。

    `,10);function x(q,z){const o=n("RouterLink");return s(),d("div",null,[e("p",null,[t(":::primary"),p,c(o,{to:"/computer-science/note/theme-shoka-doc/"},{default:a(()=>[t("🚀快速开始")]),_:1}),t(" - "),c(o,{to:"/computer-science/note/theme-shoka-doc/dependents/"},{default:a(()=>[t("💌依赖插件")]),_:1}),t(" - "),c(o,{to:"/computer-science/note/theme-shoka-doc/config/"},{default:a(()=>[t("📌基本配置")]),_:1}),t(" - "),c(o,{to:"/computer-science/note/theme-shoka-doc/display/"},{default:a(()=>[g]),_:1}),t(" - "),c(o,{to:"/computer-science/note/theme-shoka-doc/special/"},{default:a(()=>[t("🦄特殊功能")]),_:1}),h,t(" :::")]),u,e("ul",null,[m,e("li",null,[e("p",null,[t("如果以上设置均不存在,将显示一张随机图片,"),c(o,{to:"/computer-science/note/config/#%E9%9A%8F%E6%9C%BA%E5%9B%BE%E5%BA%93"},{default:a(()=>[t("随机图库配置戳此")]),_:1}),t("。")])])]),b,e("table",null,[j,e("tbody",null,[_,e("tr",null,[y,k,e("td",null,[c(o,{to:"/computer-science/note/config/#iconfont%E5%9B%BE%E6%A0%87"},{default:a(()=>[t("图标样式")]),_:1})])]),v])]),f])}const N=r(i,[["render",x],["__file","b7629dd4.html.vue"]]);export{N as default}; diff --git a/assets/c4877271.html-5980451d.js b/assets/c4877271.html-5980451d.js new file mode 100644 index 0000000..09e5597 --- /dev/null +++ b/assets/c4877271.html-5980451d.js @@ -0,0 +1,308 @@ +import{_ as t,o as n,c as o,e}from"./app-5c46a61a.js";const a={},i=e(`

    动漫美图

    安卓实验–内容提供器

    日常踩雷

    新建了一个空activity项目
    +
    ERROR: Failed to resolve: androidx.appcompat:appcompat:1.1.0
    +ERROR: Failed to resolve: androidx.test.ext:junit:1.1.1
    +ERROR: Failed to resolve: androidx.test.espresso:espresso-core:3.2.0
    +ERROR: Failed to resolve: androidx.constraintlayout:constraintlayout:1.1.3
    +

    init.gradle

    感觉有毒,成功了,依赖还是未解决,清除缓存重启无效!
    有毒

    删除init.gradle后,成功解决,好吧,估计问题在镜像仓库,也可能是这个配置问题,以后还是老老实实用官方源吧,虽然费时间。但出错率低。
      这是我的init.gradle,路径为C:\\Users\\{username}\\.gradle,建立这个文件的目的是加速依赖下载,现在看来反而是累赘,以前用着正常,现在不能用了也不知道是什么原因。

    allprojects{
    +    repositories {
    +        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
    +        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
    +        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
    +        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
    +        all { ArtifactRepository repo ->
    +            if(repo instanceof MavenArtifactRepository){
    +                def url = repo.url.toString()
    +                if (url.startsWith('https://repo1.maven.org/maven2')) {
    +                    project.logger.lifecycle "Repository \${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
    +                    remove repo
    +                }
    +                if (url.startsWith('https://jcenter.bintray.com/')) {
    +                    project.logger.lifecycle "Repository \${repo.url} replaced by $ALIYUN_JCENTER_URL."
    +                    remove repo
    +                }
    +if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
    +                    project.logger.lifecycle "Repository \${repo.url} replaced by $ALIYUN_GOOGLE_URL."
    +                    remove repo
    +                }
    +                if (url.startsWith('https://plugins.gradle.org/m2/')) {
    +                    project.logger.lifecycle "Repository \${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
    +                    remove repo
    +                }
    +            }
    +        }
    +        maven {
    +                url ALIYUN_REPOSITORY_URL
    +                url ALIYUN_JCENTER_URL
    +	url ALIYUN_GOOGLE_URL 
    + 	url ALIYUN_GRADLE_PLUGIN_URL 
    +
    +        }
    +    }
    +}
    +

    image.png

    问题解决了,开工干活

    实验目的

    1、掌握运行时权限使用
    2、掌握访问其他应用程序的数据

    实验内容

    1.实现拨打电话功能
    2.访问通讯录

    实验仪器

    1)PC机最低配置:2G Hz以上双核CPU,2G以上内存
    2)Windows 32位或64位操作系统
    3)Android Studio 2.2及以上版本

    实验主要步骤

    1)创建实验项目:选择Empty Activity
    2)编写布局文件;

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    +<androidx.constraintlayout.widget.ConstraintLayout
    +        xmlns:android="http://schemas.android.com/apk/res/android"
    +        xmlns:tools="http://schemas.android.com/tools"
    +        xmlns:app="http://schemas.android.com/apk/res-auto"
    +        android:layout_width="match_parent"
    +        android:layout_height="match_parent"
    +        tools:context=".MainActivity">
    +
    +    <ListView
    +            android:id="@+id/list"
    +            android:layout_width="match_parent"
    +            android:layout_height="match_parent"
    +            app:layout_constraintBottom_toBottomOf="parent"
    +            app:layout_constraintLeft_toLeftOf="parent"
    +            app:layout_constraintRight_toRightOf="parent"
    +            app:layout_constraintTop_toTopOf="parent"/>
    +
    +</androidx.constraintlayout.widget.ConstraintLayout>
    +

    list_item.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    +              xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal"
    +              android:layout_width="match_parent"
    +              android:layout_height="wrap_content"
    +              android:layout_margin="20dp"
    +              android:padding="5dp">
    +
    +    <ImageView
    +            android:contentDescription="@string/icon"
    +            android:src="@mipmap/kyzja1gl2m4"
    +            android:id="@+id/image_photo"
    +            android:layout_width="70dp"
    +            android:layout_height="70dp" />
    +    <LinearLayout
    +            android:layout_weight="1"
    +            android:layout_width="0dp"
    +            android:layout_height="70dp"
    +            android:orientation="vertical"
    +            android:layout_marginRight="15dp"
    +            android:layout_marginLeft="15dp">
    +
    +        <TextView
    +                android:id="@+id/name"
    +                android:layout_width="match_parent"
    +                android:layout_weight="1"
    +                android:layout_height="match_parent"
    +                android:text="@string/name"
    +                android:textStyle="bold"
    +                android:textColor="#000"
    +                android:textSize="20sp" tools:ignore="NestedWeights"/>
    +        <TextView
    +                android:id="@+id/phone"
    +                android:layout_weight="1"
    +                android:layout_height="match_parent"
    +                android:layout_width="match_parent"
    +                android:text="@string/phone"
    +                android:textStyle="bold"
    +                android:textColor="#666"
    +                android:textSize="20sp" />
    +    </LinearLayout>
    +    <Button
    +            android:layout_width="70dp"
    +            android:layout_height="70dp"
    +            android:id="@+id/call"
    +            android:text="@string/call"
    +    />
    +</LinearLayout>
    +

    3)编写Activity类,单击查询通讯录信息,申请运行时权限

    MainActivity

    package tk.dragondyt.study6;
    +import android.Manifest;
    +import android.content.pm.PackageManager;
    +import android.database.Cursor;
    +import android.os.Bundle;
    +import android.provider.ContactsContract;
    +import android.util.Log;
    +import android.widget.ListView;
    +import android.widget.Toast;
    +import androidx.annotation.NonNull;
    +import androidx.appcompat.app.AppCompatActivity;
    +import androidx.core.app.ActivityCompat;
    +import androidx.core.content.ContextCompat;
    +import java.util.ArrayList;
    +import java.util.List;
    +/**
    + * @author dyt
    + */
    +public class MainActivity extends AppCompatActivity {
    +    final String TAG = "MainActivity";
    +    ContactPersonAdapter adapter;
    +    List<Person> contactsList = new ArrayList<>();
    +    @Override
    +    protected void onCreate(Bundle savedInstanceState) {
    +        super.onCreate(savedInstanceState);
    +        setContentView(R.layout.activity_main);
    +        ListView listView = findViewById(R.id.list);
    +        adapter = new ContactPersonAdapter(this,getLayoutInflater(),contactsList);
    +        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    +            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
    +        } else {
    +            readContacts();
    +        }
    +        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    +            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 100);
    +        }
    +        listView.setAdapter(adapter);
    +
    +    }
    +    private void readContacts() {
    +        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    +                null, null, null, null)) {
    +            if (cursor != null) {
    +                while (cursor.moveToNext()) {
    +                    String name = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    +                    String phone = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.NUMBER));
    +                    contactsList.add(new Person(name,phone));
    +                }
    +                adapter.notifyDataSetChanged();
    +            }
    +        } catch (Exception e) {
    +            Log.d(TAG, "readContacts: "+e.getMessage());
    +        }
    +    }
    +    @Override
    +    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantsResults) {
    +        if (requestCode == 1) {
    +            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
    +                readContacts();
    +            } else {
    +                Toast.makeText(this, "请授予访问通讯录权限", Toast.LENGTH_SHORT).show();
    +            }
    +        }
    +        if (requestCode==100){
    +            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
    +                readContacts();
    +            } else {
    +                Toast.makeText(this, "请授予拨打电话权限", Toast.LENGTH_SHORT).show();
    +            }
    +        }
    +    }
    +}
    +
    +

    4)通过通讯录应用程序提供的内容提供器查询其数据

    private void readContacts() {
    +        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    +                null, null, null, null)) {
    +            if (cursor != null) {
    +                while (cursor.moveToNext()) {
    +                    String name = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    +                    String phone = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.NUMBER));
    +                    contactsList.add(new Person(name,phone));
    +                }
    +                adapter.notifyDataSetChanged();
    +            }
    +        } catch (Exception e) {
    +            Log.d(TAG, "readContacts: "+e.getMessage());
    +        }
    +    }
    +

    5)编写ListView展示通讯录方法,把查询到的数据展示在页面

    ContactPersonAdapter

    package tk.dragondyt.study6;
    +
    +import android.annotation.SuppressLint;
    +import android.content.Context;
    +import android.content.Intent;
    +import android.net.Uri;
    +import android.view.LayoutInflater;
    +import android.view.View;
    +import android.view.ViewGroup;
    +import android.widget.BaseAdapter;
    +import android.widget.Button;
    +import android.widget.TextView;
    +
    +import java.util.List;
    +
    +/**
    + * @author dyt
    + */
    +public class ContactPersonAdapter extends BaseAdapter {
    +
    +    /**定义数据*/
    +    private final List<Person> mData;
    +    /**定义Inflater,加载我们自定义的布局。*/
    +    private final LayoutInflater mInflater;
    +    private final Context context;
    +
    +  /**
    +    定义构造器,在Activity创建对象Adapter的时候将数据data和Inflater传入自定义的Adapter中进行处理。
    +    */
    +    public ContactPersonAdapter(Context context,LayoutInflater inflater, List<Person> data){
    +        mInflater = inflater;
    +        mData = data;
    +        this.context = context;
    +    }
    +
    +    @Override
    +    public int getCount() {
    +        return mData.size();
    +    }
    +
    +    @Override
    +    public Object getItem(int position) {
    +        return position;
    +    }
    +
    +    @Override
    +    public long getItemId(int position) {
    +        return position;
    +    }
    +
    +    @Override
    +    public View getView(int position, View view, ViewGroup viewGroup) {
    +        @SuppressLint("ViewHolder")
    +        View item = mInflater.inflate(R.layout.list_item,null);
    +        Person person = mData.get(position);
    +        TextView name = item.findViewById(R.id.name);
    +        TextView phone = item.findViewById(R.id.phone);
    +        Button call = item.findViewById(R.id.call);
    +        call.setOnClickListener((v)->{
    +            Intent intentCall =  new Intent();
    +            intentCall.setAction(Intent.ACTION_CALL);
    +            intentCall.setData(Uri.parse("tel:" + person.getPhone()));
    +            context.startActivity(intentCall);
    +        });
    +        name.setText(person.name);
    +        phone.setText(person.phone);
    +         return item ;
    +    }
    +}
    +

    Person

    package tk.dragondyt.study6;
    +
    +/**
    + * @author dyt
    + */
    +public class Person {
    +    String name;
    +    String phone;
    +
    +    public Person(String name, String phone) {
    +        this.name = name;
    +        this.phone = phone;
    +    }
    +
    +    public String getName() {
    +        return name;
    +    }
    +
    +    public void setName(String name) {
    +        this.name = name;
    +    }
    +
    +    public String getPhone() {
    +        return phone;
    +    }
    +
    +    public void setPhone(String phone) {
    +        this.phone = phone;
    +    }
    +
    +    @Override
    +    public String toString() {
    +        return "Person{" +
    +                "name='" + name + '\\'' +
    +                ", phone='" + phone + '\\'' +
    +                '}';
    +    }
    +}
    +
    +

    最后附上截图,最讨厌没图的教程。

    运行截图

    实验源码

    `,36),r=[i];function d(s,u){return n(),o("div",null,r)}const l=t(a,[["render",d],["__file","c4877271.html.vue"]]);export{l as default}; diff --git a/assets/c4877271.html-7c746610.js b/assets/c4877271.html-7c746610.js new file mode 100644 index 0000000..46e0805 --- /dev/null +++ b/assets/c4877271.html-7c746610.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-867195e6","path":"/8612fa7f/e00fc567/5ac6f809/c4877271.html","title":"Failed to resolve: androidx.appcompat:appcompat:1.1.0","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"踩坑\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7cf68d8\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"安卓\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7cf68d8/e00fc567\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/c4877271.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/c4877271.html\\",\\"headline\\":\\"Failed to resolve: androidx.appcompat:appcompat:1.1.0\\",\\"name\\":\\"Failed to resolve: androidx.appcompat:appcompat:1.1.0\\",\\"datePublished\\":\\"2020-05-09\\",\\"dateModified\\":\\"2020-05-09\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/c4877271.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"Failed to resolve: androidx.appcompat:appcompat:1.1.0\\"]}"]],"title":"Failed to resolve: androidx.appcompat:appcompat:1.1.0","tags":[{"name":"安卓","path":"/tags/e00fc567"},{"name":"吐槽","path":"/tags/62f4a42b"}],"categories":[{"name":"踩坑","path":"/categories/b7cf68d8"},{"name":"安卓","path":"/categories/b7cf68d8/e00fc567"}],"keywords":["Failed to resolve: androidx.appcompat:appcompat:1.1.0"],"date":"2020-05-09T10:54:35.000Z","abbrlink":"c4877271","permalink":"/8612fa7f/e00fc567/5ac6f809/c4877271.html"},"headers":[{"level":2,"title":"安卓实验–内容提供器","slug":"安卓实验–内容提供器","link":"#安卓实验–内容提供器","children":[]}]}`);export{t as data}; diff --git a/assets/c7081503.html-4ba99b2c.js b/assets/c7081503.html-4ba99b2c.js new file mode 100644 index 0000000..4f3046a --- /dev/null +++ b/assets/c7081503.html-4ba99b2c.js @@ -0,0 +1,70 @@ +import{_ as r,o as n,c as t,a as e}from"./app-5c46a61a.js";const i={},o=e("pre",null,[e("code",{class:"language-java"},`/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + public TreeNode buildTree(int[] preorder, int[] inorder) { + return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); + } + + private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) { + if (preStart > preEnd) { + return null; + } //根的值 + int rootVal = preorder[preStart]; + //中序中根的位置 + int index = 0; + for (int i = inStart; i <= inEnd; i++) { + if (inorder[i] == rootVal) { + index = i; + break; + } + } + //根节点左边节点数 + int leftSize = index - inStart; + TreeNode root = new TreeNode(rootVal); + //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ] + //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ] + root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1); + root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd); + return root; + } +} +`)],-1),d=e("p",null,"改进",-1),l=e("pre",null,[e("code",{class:"language-java"},`class Solution { + Map valOrderMap = new HashMap<>(); + public TreeNode buildTree(int[] preorder, int[] inorder) { + for (int j = 0; j < inorder.length; j++) { + valOrderMap.put(inorder[j],j); + } + return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); + } + + private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) { + if (preStart > preEnd) { + return null; + } //根的值 + int rootVal = preorder[preStart]; + //中序中根的位置 + int index = valOrderMap.get(rootVal); + //根节点左边节点数 + int leftSize = index - inStart; + TreeNode root = new TreeNode(rootVal); + //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ] + //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ] + root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1); + root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd); + return root; + } +} +`)],-1),a=[o,d,l];function p(s,u){return n(),t("div",null,a)}const S=r(i,[["render",p],["__file","c7081503.html.vue"]]);export{S as default}; diff --git a/assets/c7081503.html-a2524c58.js b/assets/c7081503.html-a2524c58.js new file mode 100644 index 0000000..8ca4957 --- /dev/null +++ b/assets/c7081503.html-a2524c58.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-6d631026","path":"/8612fa7f/b7e144d1/e85d694a/c7081503.html","title":"[105]从前序与中序遍历序列构造二叉树","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"算法\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"二叉树\\",\\"item\\":\\"https://blog.dragondyt.top/categories/b7e144d1/e85d694a\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/c7081503.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/c7081503.html\\",\\"headline\\":\\"[105]从前序与中序遍历序列构造二叉树\\",\\"name\\":\\"[105]从前序与中序遍历序列构造二叉树\\",\\"datePublished\\":\\"2022-07-20\\",\\"dateModified\\":\\"2022-07-20\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/c7081503.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"[105]从前序与中序遍历序列构造二叉树","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"算法","path":"/categories/b7e144d1"},{"name":"二叉树","path":"/categories/b7e144d1/e85d694a"}],"tags":[{"name":"二叉树","path":"/tags/e85d694a"}],"date":"2022-07-20 12:40:11","abbrlink":"c7081503","permalink":"/8612fa7f/b7e144d1/e85d694a/c7081503.html"},"headers":[]}`);export{t as data}; diff --git a/assets/c82dcf86.html-dbd354ab.js b/assets/c82dcf86.html-dbd354ab.js new file mode 100644 index 0000000..06adf66 --- /dev/null +++ b/assets/c82dcf86.html-dbd354ab.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-4f301c8a","path":"/8612fa7f/47867b98/Java/c82dcf86.html","title":"使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF]","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/c82dcf86.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/c82dcf86.html\\",\\"headline\\":\\"使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF]\\",\\"name\\":\\"使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF]\\",\\"datePublished\\":\\"2020-07-29\\",\\"dateModified\\":\\"2020-07-29\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/c82dcf86.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"java\\",\\"springboot\\",\\"mail\\"]}"]],"title":"使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF]","tags":[{"name":"踩坑","path":"/tags/b7cf68d8"},{"name":"java","path":"/tags/java"}],"categories":[{"name":"Springboot","path":"/categories/Springboot"}],"keywords":["java","springboot","mail"],"date":"2020-07-29T21:54:35.000Z","abbrlink":"c82dcf86","permalink":"/8612fa7f/47867b98/Java/c82dcf86.html"},"headers":[{"level":2,"title":"前言","slug":"前言","link":"#前言","children":[]}]}`);export{t as data}; diff --git a/assets/c82dcf86.html-dee9609e.js b/assets/c82dcf86.html-dee9609e.js new file mode 100644 index 0000000..ef952a6 --- /dev/null +++ b/assets/c82dcf86.html-dee9609e.js @@ -0,0 +1,210 @@ +import{_ as e,o as n,c as a,e as t}from"./app-5c46a61a.js";const r={},i=t(`

    动漫美图

    前言

      今天做了一个自动打卡工具,准备搭建邮件服务,反馈打卡结果。使用的邮箱是yandex mail。出现Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF],记录一下。

    邮箱准备

      使用邮箱没有要求,支持smtp就行

    注册邮箱

    yandex mail注册地址

    登录邮箱

      登录邮箱后可能会提示开启smtp。

    这里是官方提供打开smtp的文档,还记录了端口号。
    官方文档表示端口是465

    启用smtp

      邮箱首页右上角的齿轮>security> Email clients>
    smtp启用页面
    这里我使用outlook测试了连接,使用的端口是465,附连接成功图。

    连接成功图

    邮件协议

    SMTP 协议

    SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。提供了SSL加密的SMTP协议被称为SMTPS,SMTP使用TCP端口25,SMTPS使用TCP端口465

    POP3 协议

    POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S,POP3 默认端口110,POP3S默认端口995

    IMAP 协议

    IMAP(Internet Mail Access Protocol)以前称作交互邮件访问协议(Interactive Mail Access Protocol),是一个应用层协议。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作,提供了SSL加密的IMAP协议被称为IMAP S,POP3 默认端口143,POP3S默认端口993

    搭建步骤及简单使用

    mail依赖

    build.gradl文件

        compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.3.2.RELEASE'
    +

    yml配置文件

    server:
    +  port: 80
    +logging:
    +  level:
    +    web: debug
    +spring:
    +  mail:
    +    default-encoding: UTF-8
    +    host: smtp.yandex.com
    +    username: xxx@xxx.xx
    +    password: 123456
    +    port: 25 #smtp协议使用25端口 
    +#    port: 465 #smtps使用465端口,不然报错。
    +    protocol: smtp #指定协议
    +    test-connection: true
    +    properties:
    +      mail:
    +        smtp:
    +          auth: true # 使用
    +          starttls: # 使用 SSL 安全协议,须如下配置
    +            enable: true
    +            required: true
    +

    java代码

    MailService 接口文件
    public interface MailService {
    +
    +    /**
    +     * 发送纯文本邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     */
    +    void sendTextMail(String toAddr, String title, String content);
    +
    +    /**
    +     * 发送 html 邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容(HTML)
    +     */
    +    void sendHtmlMail(String toAddr, String title, String content);
    +
    +    /**
    +     *  发送待附件的邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     * @param filePath 附件地址
    +     */
    +    void sendAttachmentsMail(String toAddr, String title, String content, String filePath);
    +
    +    /**
    +     *  发送文本中有静态资源(图片)的邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     * @param rscPath 资源路径
    +     * @param rscId 资源id (可能有多个图片)
    +     */
    +    void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId);
    +
    +}
    +
    MailServiceImpl文件
    @Component
    +public class MailServiceImpl implements MailService {
    +
    +    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    +
    +    private final JavaMailSender mailSender;
    +
    +    /**
    +     * 注入常量
    +     */
    +
    +    @Value("\${spring.mail.username}")
    +    private String from;
    +
    +    public MailServiceImpl(JavaMailSender mailSender) {
    +        this.mailSender = mailSender;
    +    }
    +
    +    /**
    +     * 发送文本邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容
    +     */
    +    @Override
    +    public void sendTextMail(String toAddr, String title, String content) {
    +        // 纯文本邮件对象
    +        SimpleMailMessage message = new SimpleMailMessage();
    +        message.setFrom(from);
    +        message.setTo(toAddr);
    +        message.setSubject(title);
    +        message.setText(content);
    +
    +        try {
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("Text邮件已经发送。");
    +            }
    +        } catch (Exception e) {
    +            logger.error("发送Text邮件时发生异常!", e);
    +        }
    +
    +    }
    +    
    +    /**
    +     * 发送 html 邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容(HTML)
    +     */
    +    @Override
    +    public void sendHtmlMail(String toAddr, String title, String content) {
    +        // html 邮件对象
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            //true表示需要创建一个multipart message
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("html邮件发送成功");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送html邮件时发生异常!", e);
    +        }
    +    }
    +
    +
    +    /**
    +     * 发送待附件的邮件
    +     *
    +     * @param toAddr   收件人
    +     * @param title    标题
    +     * @param content  内容
    +     * @param filePath 附件地址
    +     */
    +    @Override
    +    public void sendAttachmentsMail(String toAddr, String title, String content, String filePath) {
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            FileSystemResource file = new FileSystemResource(new File(filePath));
    +            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
    +            helper.addAttachment(fileName, file);
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("带附件的邮件已经发送。");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送带附件的邮件时发生异常!", e);
    +        }
    +    }
    +
    +
    +    /**
    +     * 发送文本中有静态资源(图片)的邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容
    +     * @param rscPath 资源路径
    +     * @param rscId   资源id (可能有多个图片)
    +     */
    +    @Override
    +    public void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId) {
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            FileSystemResource res = new FileSystemResource(new File(rscPath));
    +            helper.addInline(rscId, res);
    +
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("嵌入静态资源的邮件已经发送。");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送嵌入静态资源的邮件时发生异常!", e);
    +        }
    +    }
    +}
    +
    测试类
    @SpringBootTest
    +class ClockInApplicationTests {
    +    @Autowired
    +    MailService mailService;
    +    @Test
    +    void sendTextMail(){
    +        mailService.sendTextMail("vlnrjp92486@chacuo.net","单元测试","测试邮件发送");
    +    }
    +}
    +

    运行结果

    如标题所述,出现了异常
    异常图
    使用协议对应端口后发送成功,附图。
    单元测试通过

    结语

      通过这个实践,我觉要写代码前还是要做很多准备,或者说我了解的东西不过全面。出错后百度异常信息怎么都找不到,想着哪里出错了,之前使用outlook连接测试通过,应该就是代码问题。后来看到很多人使用25端口发送,然后去百度端口才发现协议与端口不一致。所以我觉得写代码前的准备不充分或者知识储备不足,这个重要信息都不了解。

    `,37),s=[i];function o(d,l){return n(),a("div",null,s)}const m=e(r,[["render",o],["__file","c82dcf86.html.vue"]]);export{m as default}; diff --git a/assets/d30922d5.html-43b5d096.js b/assets/d30922d5.html-43b5d096.js new file mode 100644 index 0000000..18cbea8 --- /dev/null +++ b/assets/d30922d5.html-43b5d096.js @@ -0,0 +1,103 @@ +import{_ as o,r as d,o as l,c as s,a as r,b as e,d as n,w as a,e as i}from"./app-5c46a61a.js";const c={},u=r("br",null,null,-1),h=r("strong",null,"💌依赖插件",-1),m=r("br",null,null,-1),p=i(`

    :::warning
    请务必将hexo-renderer-multi-markdown-it升级到最新版,目前为 0.1.5
    :::

    Theme Shoka依赖以下Hexo插件

    插件名称npm地址功能依赖程度
    hexo-renderer-multi-markdown-it链接md文件渲染器,压缩css/js/html必需
    hexo-autoprefixer链接给生成的css文件们添加浏览器前缀必需
    hexo-algoliasearch链接站内搜索功能搜索按钮失灵
    hexo-symbols-count-time链接文章或站点字数及阅读时间统计统计没有
    hexo-feed链接生成Feed文件Feed文件没有

    没有正确安装以上插件的话,本主题会报错or无法正确显示or部分功能失效。
    hexo-renderer-multi-markdown-it请注意升级到最新版

    安装完以上插件后,修改站点配置文件,加入相关配置。

    multi-markdown-it安装与配置

    安装

    1. 安装前,记得务必卸载掉默认的hexo-renderer-marked,以及别的markdown文件渲染器。

      npm un hexo-renderer-marked --save
      +# 或者
      +yarn remove hexo-renderer-marked
      +
    2. 安装

      npm i hexo-renderer-multi-markdown-it --save
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it
      +
    3. 如果安装缓慢,或者失败
      如报错

      ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
      +

      因为有一步需要下载puppeteer里的Chromium内核,基于天朝内部网络现状,这一步能不能成功要靠科学和运气,所以为了避免安装失败,需要加上--ignore-scripts跳过Chromium内核的下载。

      npm i hexo-renderer-multi-markdown-it --save --ignore-scripts
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it --ignore-scripts
      +

      puppeteer主要是用来渲染mermaid流程图,只要文章中不使用mermaid就没有任何问题,如果要使用mermaid建议还是想办法完全安装。

    配置

    1. 加入markdown配置,用来渲染md文件
    markdown:
    +  render: # 渲染器设置
    +    html: false # 过滤 HTML 标签
    +    xhtmlOut: true # 使用 '/' 来闭合单标签 (比如 <br />)。
    +    breaks: true # 转换段落里的 '\\n' 到 <br>。
    +    linkify: true # 将类似 URL 的文本自动转换为链接。
    +    typographer: 
    +    quotes: '“”‘’'
    +  plugins: # markdown-it插件设置
    +    - plugin:
    +        name: markdown-it-toc-and-anchor
    +        enable: true
    +        options: # 文章目录以及锚点应用的class名称,shoka主题必须设置成这样
    +          tocClassName: 'toc'
    +          anchorClassName: 'anchor'
    +    - plugin:
    +        name: markdown-it-multimd-table
    +        enable: true
    +        options:
    +          multiline: true
    +          rowspan: true
    +          headerless: true
    +    - plugin:
    +        name: ./markdown-it-furigana
    +        enable: true
    +        options:
    +          fallbackParens: "()"
    +    - plugin:
    +        name: ./markdown-it-spoiler
    +        enable: true
    +        options:
    +          title: "你知道得太多了"
    +
    1. 加入minify配置,压缩css/js/html
    minify:
    +  html:
    +    enable: true
    +    exclude: # 排除hexo-feed用到的模板文件
    +      - '**/json.ejs'
    +      - '**/atom.ejs'
    +      - '**/rss.ejs'
    +  css:
    +    enable: true
    +    exclude:
    +      - '**/*.min.css'
    +  js:
    +    enable: true
    +    mangle:
    +      toplevel: true
    +    output:
    +    compress:
    +    exclude:
    +      - '**/*.min.js'
    +
    1. 停用默认代码高亮功能,否则代码块的mac样式不能正常显示。
      找到highlightprismjs,把enable改成false
    highlight:
    +  enable: false
    +
    +prismjs:
    +  enable: false
    +

    autoprefixer配置建议

    autoprefixer:
    +  exclude:
    +    - '*.min.css'
    +

    缺少这个插件,首页卡片翻转效果在部分浏览器中无法正确显示。

    algolia配置建议

    algolia:
    +  appId: #Your appId
    +  apiKey: #Your apiKey
    +  adminApiKey: #Your adminApiKey
    +  chunkSize: 5000
    +  indexName: #"shoka"
    +  fields:
    +    - title #必须配置
    +    - path #必须配置
    +    - categories #推荐配置
    +    - content:strip:truncate,0,2000
    +    - gallery
    +    - photos
    +    - tags
    +

    feed配置建议

    keywords: #站点关键词,用“,”分隔
    +
    +feed:
    +    limit: 20
    +    order_by: "-date"
    +    tag_dir: false
    +    category_dir: false
    +    rss:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/rss.ejs"
    +        output: "rss.xml"
    +    atom:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/atom.ejs"
    +        output: "atom.xml"
    +    jsonFeed:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/json.ejs"
    +        output: "feed.json"
    +
    `,22);function g(f,k){const t=d("RouterLink");return l(),s("div",null,[r("p",null,[e(":::primary"),u,n(t,{to:"/computer-science/note/theme-shoka-doc/"},{default:a(()=>[e("🚀快速开始")]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/dependents/"},{default:a(()=>[h]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/config/"},{default:a(()=>[e("📌基本配置")]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/display/"},{default:a(()=>[e("🌈界面显示")]),_:1}),e(" - "),n(t,{to:"/computer-science/note/theme-shoka-doc/special/"},{default:a(()=>[e("🦄特殊功能")]),_:1}),m,e(" :::")]),p])}const x=o(c,[["render",g],["__file","d30922d5.html.vue"]]);export{x as default}; diff --git a/assets/d30922d5.html-c9d774a1.js b/assets/d30922d5.html-c9d774a1.js new file mode 100644 index 0000000..4bf344b --- /dev/null +++ b/assets/d30922d5.html-c9d774a1.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-24188f82","path":"/computer-science/note/theme-shoka-doc/d30922d5.html","title":"Step.1 依赖插件","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"BreadcrumbList\\",\\"itemListElement\\":[{\\"@type\\":\\"ListItem\\",\\"position\\":0,\\"name\\":\\"计算机科学\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":1,\\"name\\":\\"二进制杂谈\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd\\"},{\\"@type\\":\\"ListItem\\",\\"position\\":2,\\"name\\":\\"Theme Shoka Documentation\\",\\"item\\":\\"https://blog.dragondyt.top/categories/11159622/97a3d3dd/Theme-Shoka-Documentation\\"}]}"],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/d30922d5.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/d30922d5.html\\",\\"headline\\":\\"Step.1 依赖插件\\",\\"name\\":\\"Step.1 依赖插件\\",\\"datePublished\\":\\"2020-08-13\\",\\"dateModified\\":\\"2020-08-13\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/d30922d5.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"Step.1 依赖插件","date":"2020-08-13T20:46:48.000Z","categories":[{"name":"计算机科学","path":"/categories/11159622"},{"name":"二进制杂谈","path":"/categories/11159622/97a3d3dd"},{"name":"Theme Shoka Documentation","path":"/categories/11159622/97a3d3dd/Theme-Shoka-Documentation"}],"tags":[{"name":"Hexo","path":"/tags/Hexo"},{"name":"教程","path":"/tags/1868f51e"}],"valine":{"placeholder":"1. 提问前请先仔细阅读本文档⚡\\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"},"permalink":"/computer-science/note/theme-shoka-doc/d30922d5.html","abbrlink":"d30922d5"},"headers":[{"level":1,"title":"multi-markdown-it安装与配置","slug":"multi-markdown-it安装与配置","link":"#multi-markdown-it安装与配置","children":[{"level":2,"title":"安装","slug":"安装","link":"#安装","children":[]},{"level":2,"title":"配置","slug":"配置","link":"#配置","children":[]}]},{"level":1,"title":"autoprefixer配置建议","slug":"autoprefixer配置建议","link":"#autoprefixer配置建议","children":[]},{"level":1,"title":"algolia配置建议","slug":"algolia配置建议","link":"#algolia配置建议","children":[]},{"level":1,"title":"feed配置建议","slug":"feed配置建议","link":"#feed配置建议","children":[]}]}`);export{t as data}; diff --git a/assets/ecdcd4fc.html-b800b5f4.js b/assets/ecdcd4fc.html-b800b5f4.js new file mode 100644 index 0000000..e365ecb --- /dev/null +++ b/assets/ecdcd4fc.html-b800b5f4.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-6c92eadd","path":"/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html","title":"OpenGL环境测试","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html\\",\\"headline\\":\\"OpenGL环境测试\\",\\"name\\":\\"OpenGL环境测试\\",\\"datePublished\\":\\"0000-00-00\\",\\"dateModified\\":\\"0000-00-00\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\"}"]],"title":"OpenGL环境测试","tags":[{"name":"OpenGL","path":"/tags/OpenGL"},{"name":"NDK","path":"/tags/NDK"}],"abbrlink":"ecdcd4fc","permalink":"/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html","categories":[]},"headers":[]}`);export{t as data}; diff --git a/assets/ecdcd4fc.html-e0d6f233.js b/assets/ecdcd4fc.html-e0d6f233.js new file mode 100644 index 0000000..07b723d --- /dev/null +++ b/assets/ecdcd4fc.html-e0d6f233.js @@ -0,0 +1,12 @@ +import{_ as a,o as n,c as o,a as e}from"./app-5c46a61a.js";const t={},r=e("p",null,"日志",-1),c=e("pre",null,[e("code",null,`2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: eglCreateContext: EGL_BAD_CONFIG: no ES 3 support +2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: tid 6601: eglCreateContext(1682): error 0x3005 (EGL_BAD_CONFIG) +2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/AndroidRuntime: FATAL EXCEPTION: GLThread 501 + Process: com.example.opengl, PID: 6546 + java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG + at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1223) + at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1214) + at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1064) + at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1431) + at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272) + +`)],-1),l=e("p",null,"估计是电脑没显卡导致的",-1),i=[r,c,l];function d(p,_){return n(),o("div",null,i)}const s=a(t,[["render",d],["__file","ecdcd4fc.html.vue"]]);export{s as default}; diff --git a/assets/fd72446f.html-7d3620fb.js b/assets/fd72446f.html-7d3620fb.js new file mode 100644 index 0000000..66fd4d5 --- /dev/null +++ b/assets/fd72446f.html-7d3620fb.js @@ -0,0 +1,8 @@ +import{_ as e,o as t,c as a,e as o}from"./app-5c46a61a.js";const c={},n=o(`

    动漫美图

    gateway配合nacos 找不到服务的问题

    gateway版本: 3.0.2
    +
    nacos版本: 1.4.1
    +

    在这里插入图片描述

    在这里插入图片描述
    gateway出错了,没有任何异常信息,增加自定义异常处理后,通过日志发现一个关键词NoLoadBalancer,突然就想到Spring Cloud2020移除了Ribbon,加入依赖后成功解决问题.

    <dependency>
    +   <groupId>org.springframework.cloud</groupId>
    +   <artifactId>spring-cloud-loadbalancer</artifactId>
    +   <version>对应版本</version>
    +</dependency>
    +
    `,7),r=[n];function s(d,p){return t(),a("div",null,r)}const l=e(c,[["render",s],["__file","fd72446f.html.vue"]]);export{l as default}; diff --git a/assets/fd72446f.html-e11f2d19.js b/assets/fd72446f.html-e11f2d19.js new file mode 100644 index 0000000..b31277b --- /dev/null +++ b/assets/fd72446f.html-e11f2d19.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-e3ac4c4c","path":"/8612fa7f/47867b98/Java/fd72446f.html","title":"gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/fd72446f.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/fd72446f.html\\",\\"headline\\":\\"gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx\\",\\"name\\":\\"gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx\\",\\"datePublished\\":\\"2021-05-14\\",\\"dateModified\\":\\"2021-05-14\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/47867b98/Java/fd72446f.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"nacos1.4.1\\",\\"gateway3.0.2\\",\\"springcloud2020\\"]}"]],"title":"gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx","tags":[{"name":"java","path":"/tags/java"},{"name":"微服务","path":"/tags/460c1130"}],"categories":[{"name":"java","path":"/categories/java"}],"keywords":["nacos1.4.1","gateway3.0.2","springcloud2020"],"date":"2021-05-14T17:34:35.000Z","abbrlink":"fd72446f","permalink":"/8612fa7f/47867b98/Java/fd72446f.html"},"headers":[{"level":1,"title":"gateway配合nacos 找不到服务的问题","slug":"gateway配合nacos-找不到服务的问题","link":"#gateway配合nacos-找不到服务的问题","children":[]}]}`);export{t as data}; diff --git a/assets/ff03d5f4.html-14cacdf5.js b/assets/ff03d5f4.html-14cacdf5.js new file mode 100644 index 0000000..acbadec --- /dev/null +++ b/assets/ff03d5f4.html-14cacdf5.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-d874a1a0","path":"/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html","title":"安卓开发学习--安装开发环境","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html\\",\\"headline\\":\\"安卓开发学习--安装开发环境\\",\\"name\\":\\"安卓开发学习--安装开发环境\\",\\"datePublished\\":\\"2020-03-05\\",\\"dateModified\\":\\"2020-03-05\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"安卓\\",\\"java\\",\\"dyt\\",\\"dragondyt\\"]}"]],"title":"安卓开发学习--安装开发环境","tags":[{"name":"安卓","path":"/tags/e00fc567"}],"categories":[{"name":"安卓开发学习","path":"/categories/77ffff1"}],"keywords":["安卓","java","dyt","dragondyt"],"date":"2020-03-05T07:55:57.000Z","abbrlink":"ff03d5f4","permalink":"/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html"},"headers":[{"level":2,"title":"Android Stdio下载","slug":"android-stdio下载","link":"#android-stdio下载","children":[]},{"level":2,"title":"安装过程","slug":"安装过程","link":"#安装过程","children":[]},{"level":2,"title":"App运行方式","slug":"app运行方式","link":"#app运行方式","children":[]}]}`);export{t as data}; diff --git a/assets/ff03d5f4.html-ef849882.js b/assets/ff03d5f4.html-ef849882.js new file mode 100644 index 0000000..f07600a --- /dev/null +++ b/assets/ff03d5f4.html-ef849882.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as r,e as a}from"./app-5c46a61a.js";const n={},i=a('

    安卓路线图

    Android Stdio下载

    网盘下载
    官网下载

    安装过程

    一直点next就行了,注意一下几点:

    1. AS安装路径不能与sdk路径一样

    安装路径配置

    错误图片

    1. 安装目录不能是中文,如果安装目录是中文,AS会提示错误 ++Your SDK location contains non-ASCII characters++

    Your SDK location contains non-ASCII characters

    App运行方式

    模拟器运行

    模拟器运行图片
    手机型号可以自己选,然后点next
    手机选择
    选择镜像(安卓版本),然后点next,后面配置可以不动,点Finish
    安卓版本
    完成图片
    配置完成图片
    启动图片
    tip:模拟器默认安装在C盘,可以通过教程修改传送门

    真机运行

    插上安卓手机,打开usb调试打开方式,手机出现提示时点同意
    usb调试授权

    第一次写blog,不足之处多多见谅

    ',16),o=[i];function s(l,d){return e(),r("div",null,o)}const h=t(n,[["render",s],["__file","ff03d5f4.html.vue"]]);export{h as default}; diff --git a/assets/git.html-97b723df.js b/assets/git.html-97b723df.js new file mode 100644 index 0000000..5739785 --- /dev/null +++ b/assets/git.html-97b723df.js @@ -0,0 +1,7 @@ +import{_ as e,o as t,c as r,e as s}from"./app-5c46a61a.js";const a={},p=s(`

    动漫美图

    git push时出现error: src refspec master does not match any解决办法.

    网传原因:
      ++这是由于存储库仍然为空引起的。存储库中没有提交,因此没有 master分支可推送到服务器。++
    网传解决方法:

    touch README
    +git add README 
    +git commit -m 'first commit'
    +git push origin master
    +

    可能是我垃圾吧,git命令写错了,反正没能解决,如图:

    image.png

    git show-ref
    +

    d601ecc070daac5320959ee8c47bca013a113256 refs/remotes/origin/master

    终于换一种错误了,留下了无知的眼泪

    git push origin HEAD:master
    +

    image.png

    一番调整,我终于成功了,失败30次,o(╥﹏╥)o

    image.png

    去目标仓库查看,发现有一个目录文件全没了(╥╯^╰╥)
    我有修改一番,好刺激啊,这就是删库跑路的快感吗!

    image.png

    这就是之前消失的文件,现在回来了,其他的又消失了。。。
    经过检查,该文件夹下面含有 .git 文件夹,无法被追踪,删除即可,到此结束了,节后逃生的感觉。
    总结:出现这个错误不一定是因为空目录,也可能是因为远程分支不在!!!

    `,16),i=[p];function c(n,o){return t(),r("div",null,i)}const m=e(a,[["render",c],["__file","git.html.vue"]]);export{m as default}; diff --git a/assets/git.html-b9199f20.js b/assets/git.html-b9199f20.js new file mode 100644 index 0000000..5311951 --- /dev/null +++ b/assets/git.html-b9199f20.js @@ -0,0 +1 @@ +const t=JSON.parse(`{"key":"v-112a40d0","path":"/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%B7%A5%E5%85%B7/Git/git.html","title":"git push时出现error: src refspec master does not match any解决办法.","lang":"en-US","frontmatter":{"head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://blog.dragondyt.top/rss.xml","title":"RSS"}],["link",{"rel":"alternate","type":"application/json","href":"https://blog.dragondyt.top/feed.json","title":"RSS"}],["link",{"rel":"alternate","type":"application/atom+xml","href":"https://blog.dragondyt.top/atom.xml","title":"RSS"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org/\\",\\"@type\\":\\"BlogPosting\\",\\"@id\\":\\"https://blog.dragondyt.top/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%B7%A5%E5%85%B7/Git/git.html\\",\\"mainEntityOfPage\\":\\"https://blog.dragondyt.top/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%B7%A5%E5%85%B7/Git/git.html\\",\\"headline\\":\\"git push时出现error: src refspec master does not match any解决办法.\\",\\"name\\":\\"git push时出现error: src refspec master does not match any解决办法.\\",\\"datePublished\\":\\"2020-04-23\\",\\"dateModified\\":\\"2020-04-23\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"@id\\":\\"https://dataliberate.com/author/richard-wallis/#Person\\",\\"name\\":\\"Richard Wallis\\",\\"url\\":\\"https://dataliberate.com/author/richard-wallis/\\",\\"image\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"url\\":\\"https://secure.gravatar.com/avatar/bbdd78abba6116d6f5bfa2c992de6592?s=96&d=mm&r=g\\",\\"height\\":\\"96\\",\\"width\\":\\"96\\"}},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"Data Liberate\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"@id\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"url\\":\\"https://dataliberate.com/wp-content/uploads/2011/12/Data_Liberate_Logo-200.png\\",\\"width\\":\\"600\\",\\"height\\":\\"60\\"}},\\"url\\":\\"https://blog.dragondyt.top/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%B7%A5%E5%85%B7/Git/git.html\\",\\"isPartOf\\":{\\"@type\\":\\"Blog\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\",\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"@id\\":\\"https://blog.dragondyt.top\\",\\"name\\":\\"\\"}},\\"commentCount\\":\\"1\\",\\"comment\\":[{\\"@type\\":\\"Comment\\",\\"@id\\":\\"https://dataliberate.com/2019/05/14/library-metadata-evolution-final-mile/#Comment1\\",\\"dateCreated\\":\\"2019-06-23 17:31:15\\",\\"description\\":\\"I've been looking for a decent metadata scheme for use in a home-brew library system for the past 4 years now. I'm a big user of schema.org. I found this very interesting, especially the part about reconciliation. I assume you're referring to the process of identifying duplicate representations of works. This has also been one of my biggest struggles. I'll still be waiting for schema.org to mature...\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"Jeff\\",\\"url\\":\\"http://schoenstatt.link\\"}}],\\"about\\":[{\\"@type\\":\\"Thing\\",\\"@id\\":\\"https://dataliberate.com/category/bibframe/\\",\\"name\\":\\"Bibframe\\",\\"sameAs\\":[\\"https://en.wikipedia.org/wiki/BIBFRAME\\",\\"http://www.wikidata.org/entity/Q17050075\\"]},\\"Data Liberate\\"],\\"wordCount\\":\\"488\\",\\"keywords\\":[\\"git\\",\\"dyt\\",\\"dragondyt\\",\\"git push: src refspec master does not match any\\"]}"]],"tags":[{"name":"踩坑","path":"/tags/b7cf68d8"}],"categories":[{"name":"教程","path":"/categories/1868f51e"}],"keywords":["git","dyt","dragondyt","git push: src refspec master does not match any"],"date":"2020-04-23T21:55:57.000Z"},"headers":[{"level":1,"title":"git push时出现error: src refspec master does not match any解决办法.","slug":"git-push时出现error-src-refspec-master-does-not-match-any解决办法","link":"#git-push时出现error-src-refspec-master-does-not-match-any解决办法","children":[]}]}`);export{t as data}; diff --git a/assets/style-a28b7ad3.css b/assets/style-a28b7ad3.css new file mode 100644 index 0000000..ed74636 --- /dev/null +++ b/assets/style-a28b7ad3.css @@ -0,0 +1 @@ +#header{position:relative;margin:0 auto;height:50vh;width:100%;text-shadow:0 .2rem .3rem rgba(0,0,0,.5);color:var(--header-text-color)}main{display:block;background:linear-gradient(to top,var(--body-bg-shadow) 0,var(--grey-1) 20%) no-repeat bottom}main #sidebar{position:static;width:15rem;top:0;bottom:0;transition:all .2s ease-in-out 0s}main #sidebar .contents ol{padding:0 .125rem .3125rem .625rem;text-align:left}main #sidebar .contents .toc-item{font-size:1em;line-height:1.8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}main #sidebar .contents .toc-child{display:none}#main{background:linear-gradient(to top,var(--grey-0) 0,var(--grey-1) 20%) no-repeat top;box-shadow:0 1.25rem 1rem .3125rem var(--body-bg-shadow);width:calc(100% - 15.75rem);min-height:37.5rem;width:100%}@media (min-width: 1280px){#main{width:calc(100% - 15.75rem)}}@media (min-width: 1536px){#main{width:73%}}#footer{color:var(--grey-5);font-size:.875em;background:var(--body-bg-shadow)}@keyframes imageAnimation{0%{opacity:0;animation-timing-function:ease-in}2%{opacity:1}8%{opacity:1;transform:scale(1.05);animation-timing-function:ease-out}17%{opacity:1;transform:scale(1.1)}25%{opacity:0;transform:scale(1.1)}to{opacity:0}}[data-v-215ea2f0] .md{font-family:Mulish,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;overflow-wrap:break-word;word-wrap:break-word}[data-v-215ea2f0] .md a{color:var(--primary-color)}[data-v-215ea2f0] .md a:hover{color:var(--color-blue)}[data-v-215ea2f0] .md a.header-anchor{border-bottom-style:none;color:var(--grey-4);float:right;margin-left:.625rem}[data-v-215ea2f0] .md dd ol,[data-v-215ea2f0] .md dd ul{margin-top:0}[data-v-215ea2f0] .md h1{position:relative;padding-top:.625rem;font-size:1.5em}[data-v-215ea2f0] .md h1 .header-anchor:after{content:" 1 "}[data-v-215ea2f0] .md h1:after{content:"";display:block;box-sizing:unset;width:100%;height:.0625rem;background:var(--grey-3);padding-right:1.25rem;margin-left:-1.25rem;margin-top:.3125rem}[data-v-215ea2f0] .md h2{position:relative;padding-top:.625rem;font-size:1.375em}[data-v-215ea2f0] .md h2 .header-anchor:after{content:" 2 "}[data-v-215ea2f0] .md h3{position:relative;padding-top:.625rem;font-size:1.25em}[data-v-215ea2f0] .md h3 .header-anchor:after{content:" 3 "}[data-v-215ea2f0] .md h4{position:relative;padding-top:.625rem;font-size:1.125em}[data-v-215ea2f0] .md h4 .header-anchor:after{content:" 4 "}[data-v-215ea2f0] .md h5{position:relative;padding-top:.625rem;font-size:1em}[data-v-215ea2f0] .md h5 .header-anchor:after{content:" 5 "}[data-v-215ea2f0] .md h6{position:relative;padding-top:.625rem;font-size:.875em}[data-v-215ea2f0] .md h6 .header-anchor:after{content:" 6 "}[data-v-215ea2f0] .md ol ol,[data-v-215ea2f0] .md ol ul{margin-top:0}[data-v-215ea2f0] .md p{margin:0 0 .8rem}[data-v-215ea2f0] .md ul ul{margin-top:0}[data-v-215ea2f0] .md .active .header-anchor:after,[data-v-215ea2f0] .md .active .header-anchor:before{color:var(--primary-color)}[data-v-215ea2f0] .md .body a{border-bottom:2px dashed var(--grey-3);padding-bottom:3px}[data-v-215ea2f0] .md .body a:hover{border-bottom-color:var(--color-blue)}[data-v-215ea2f0] .md .button{margin-top:2.5rem;text-align:center}[data-v-215ea2f0] .md .code-container{overflow-x:scroll;overflow-y:hidden}[data-v-215ea2f0] .md .code-container table{white-space:pre;border-spacing:0;width:100%}[data-v-215ea2f0] .md .code-container td{position:relative;padding:unset;vertical-align:unset;border:unset;transition:all .2s ease-in-out 0s}[data-v-215ea2f0] .md .code-container td pre:before{content:" "}[data-v-215ea2f0] .md .code-container td:first-child{position:absolute;background:var(--grey-2);text-align:right;overflow-x:visible!important;overflow-y:hidden;left:0;width:2.5rem;padding-right:.9375rem;color:var(--color-grey);z-index:1}[data-v-215ea2f0] .md .code-container td:nth-child(2){padding-left:3rem}[data-v-215ea2f0] .md .code-container td:last-child{padding-right:.9375rem}[data-v-215ea2f0] .md .code-container td[data-num]:before{content:attr(data-num)}[data-v-215ea2f0] .md .code-container td[data-command]:before{content:attr(data-command) " ";color:var(--grey-5);display:block;letter-spacing:-1px;padding-right:.5rem;text-align:right;white-space:nowrap}[data-v-215ea2f0] .md .code-container td[data-command]+td{padding-left:.5rem;border-left:1px solid var(--grey-4)}[data-v-215ea2f0] .md .code-container tr{background-color:inherit}[data-v-215ea2f0] .md .code-container:after{content:"";display:block;height:.625rem;width:100%}[data-v-215ea2f0] .md .code-container .operation{color:var(--grey-5);cursor:pointer;position:absolute;padding:.125rem .375rem;right:.125rem;top:.45rem;font-size:.8125em}[data-v-215ea2f0] .md .code-container .operation span{transition:all .2s ease-in-out 0s;margin:0 .3125rem}[data-v-215ea2f0] .md .code-container .operation span:hover{color:var(--grey-7)}[data-v-215ea2f0] .md .code-container .show-btn{position:absolute;cursor:pointer;left:0;bottom:0;width:100%;height:2.875rem;text-align:center;color:var(--text-color);background-image:linear-gradient(to bottom,var(--grey-2-a0) 0,var(--grey-2) 80%);z-index:1}[data-v-215ea2f0] .md .code-container,[data-v-215ea2f0] .md code,[data-v-215ea2f0] .md pre{font-family:Inconsolata,consolas,Menlo,-apple-system,PingFang SC,Microsoft YaHei,serif;font-size:1em}[data-v-215ea2f0] .md .header-anchor:after,[data-v-215ea2f0] .md .header-anchor:before{color:var(--grey-4);position:absolute;font-weight:400;transition:all .2s ease-out 0s}[data-v-215ea2f0] .md .header-anchor:before,[data-v-215ea2f0] .md .header-anchor:after{content:"H";font-family:Mulish,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;left:-1.875rem;top:1rem;width:1.25rem;height:1.5625rem;text-align:right;visibility:visible;font-size:80%}[data-v-215ea2f0] .md .header-anchor:after{font-size:50%;left:-1.375rem;line-height:3}[data-v-215ea2f0] .md .highlight{position:relative;overflow:hidden;border-radius:.5rem;box-shadow:0 .3125rem .625rem -.125rem var(--grey-9-a1);background:var(--grey-2);color:var(--grey-7);line-height:1.6;margin:1.25rem auto}[data-v-215ea2f0] .md .highlight figcaption{color:var(--grey-4);display:inline-flex;font-size:.875em;font-weight:700;padding:0 6rem 0 5rem;min-height:2.5rem;width:100%;text-align:center;align-items:center;justify-content:space-between;background-color:var(--grey-3);margin-bottom:.625rem}[data-v-215ea2f0] .md .highlight figcaption a{color:var(--grey-5)}[data-v-215ea2f0] .md .highlight figcaption a:hover{color:var(--grey-6)}[data-v-215ea2f0] .md .highlight figcaption a,[data-v-215ea2f0] .md .highlight figcaption span{display:block;margin-left:.625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-v-215ea2f0] .md .highlight figcaption:before{content:attr(data-lang);text-transform:Capitalize}[data-v-215ea2f0] .md .highlight:before{content:" ";position:absolute;border-radius:50%;background:#fc625d;width:.75rem;height:.75rem;left:.75rem;top:.8125rem;box-shadow:1.25rem 0 #fdbc40,2.5rem 0 #35cd4b}[data-v-215ea2f0] .md .highlight::-moz-selection{background:var(--grey-4)}[data-v-215ea2f0] .md .highlight::selection{background:var(--grey-4)}[data-v-215ea2f0] .md .note{border-radius:.1875rem;margin:1rem 0;position:relative;background:var(--note-bg, var(--grey-2));color:var(--grey-6);border-left:.25rem solid var(--note-border, var(--grey-4));font-size:.875em;padding:1rem 1rem 1rem 2.5rem;--primary-color: var(--note-text)}[data-v-215ea2f0] .md .note P{line-height:1.8}[data-v-215ea2f0] .md .note P:last-child{margin-bottom:0}[data-v-215ea2f0] .md .note.primary{--note-border: #cda0c7;--note-bg: #fdf8ff;--note-text: #8a51c0;--note-hover: #935aca}[data-v-215ea2f0] .md .note.primary:before{content:""}[data-v-215ea2f0] .md .note.info{--note-border: #8fa4dc;--note-bg: #f1f9ff;--note-text: #1d4974;--note-hover: #1d5fa0}[data-v-215ea2f0] .md .note.info:before{content:""}[data-v-215ea2f0] .md .note.success{--note-border: #a3c293;--note-bg: #fcfff5;--note-text: #2c662d;--note-hover: #3b883c}[data-v-215ea2f0] .md .note.success:before{content:""}[data-v-215ea2f0] .md .note.warning{--note-border: #c9ba9b;--note-bg: #fffbeb;--note-text: #947600;--note-hover: #ccb045}[data-v-215ea2f0] .md .note.warning:before{content:""}[data-v-215ea2f0] .md .note.danger{--note-border: #f4b3c1;--note-bg: #fff2f5;--note-text: #cc0f35;--note-hover: #f14668}[data-v-215ea2f0] .md .note.danger:before{content:""}[data-v-215ea2f0] .md .note:before{position:absolute;left:.5rem;top:calc(50% - 1.5rem);font-family:ic;font-weight:400;font-size:1.5rem;color:var(--note-text, var(--grey-6))}[data-v-215ea2f0] .md :not(pre)>code{color:var(--primary-color);border-radius:.3rem;border:.0625rem solid rgba(0,0,0,.1);background-color:var(--grey-0);padding:.2rem .3rem;overflow-wrap:break-word;word-wrap:break-word}@media (max-width: 567px){[data-v-215ea2f0] .md h1,[data-v-215ea2f0] .md h2,[data-v-215ea2f0] .md h3,[data-v-215ea2f0] .md h4,[data-v-215ea2f0] .md h5,[data-v-215ea2f0] .md h6{padding-left:1.25rem}[data-v-215ea2f0] .md .note h1,[data-v-215ea2f0] .md .note h2,[data-v-215ea2f0] .md .note h3,[data-v-215ea2f0] .md .note h4,[data-v-215ea2f0] .md .note h5,[data-v-215ea2f0] .md .note h6{margin:0 .3125rem}[data-v-215ea2f0] .md img,[data-v-215ea2f0] .md video{margin-bottom:.625rem!important}}:root{--waline-font-size: 1rem;--waline-white: #fff;--waline-light-grey: #999;--waline-dark-grey: #666;--waline-theme-color: #27ae60;--waline-active-color: #2ecc71;--waline-color: #444;--waline-bgcolor: #fff;--waline-bgcolor-light: #f8f8f8;--waline-bgcolor-hover: #f0f0f0;--waline-border-color: #ddd;--waline-disable-bgcolor: #f8f8f8;--waline-disable-color: #000;--waline-code-bgcolor: #282c34;--waline-bq-color: #f0f0f0;--waline-avatar-size: 3.25rem;--waline-m-avatar-size: calc(var(--waline-avatar-size) * 9 / 13);--waline-badge-color: #3498db;--waline-badge-font-size: .75em;--waline-info-bgcolor: #f8f8f8;--waline-info-color: #999;--waline-info-font-size: .625em;--waline-border: 1px solid var(--waline-border-color);--waline-avatar-radius: 50%;--waline-box-shadow: none}[data-waline]{font-size:var(--waline-font-size);text-align:start}[dir=rtl] [data-waline]{direction:rtl}[data-waline] *{box-sizing:content-box;line-height:1.75}[data-waline] p{color:var(--waline-color)}[data-waline] a{position:relative;display:inline-block;color:var(--waline-theme-color);text-decoration:none;word-break:break-word;cursor:pointer}[data-waline] a:hover{color:var(--waline-active-color)}[data-waline] img{max-width:100%;max-height:400px;border:none}[data-waline] hr{margin:.825em 0;border-style:dashed;border-color:var(--waline-bgcolor-light)}[data-waline] code,[data-waline] pre{margin:0;padding:.2em .4em;border-radius:3px;background:var(--waline-bgcolor-light);font-size:85%}[data-waline] pre{overflow:auto;padding:10px;line-height:1.45}[data-waline] pre::-webkit-scrollbar{width:6px;height:6px}[data-waline] pre::-webkit-scrollbar-track-piece:horizontal{border-radius:6px;background:rgba(0,0,0,.1)}[data-waline] pre::-webkit-scrollbar-thumb:horizontal{width:6px;border-radius:6px;background:var(--waline-theme-color)}[data-waline] pre code{padding:0;background:rgba(0,0,0,0);color:var(--waline-color);white-space:pre-wrap;word-break:keep-all}[data-waline] blockquote{margin:.5em 0;padding:.5em 0 .5em 1em;border-inline-start:8px solid var(--waline-bq-color);color:var(--waline-dark-grey)}[data-waline] blockquote>p{margin:0}[data-waline] ol,[data-waline] ul{margin-inline-start:1.25em;padding:0}[data-waline] input[type=checkbox],[data-waline] input[type=radio]{display:inline-block;vertical-align:middle;margin-top:-2px}.wl-btn{display:inline-block;vertical-align:middle;min-width:2.5em;margin-bottom:0;padding:.5em 1em;border:1px solid var(--waline-border-color);border-radius:.5em;background:rgba(0,0,0,0);color:var(--waline-color);font-weight:400;font-size:.75em;line-height:1.5;text-align:center;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition-duration:.4s;touch-action:manipulation}.wl-btn:hover,.wl-btn:active{border-color:var(--waline-theme-color);color:var(--waline-theme-color)}.wl-btn:disabled{border-color:var(--waline-border-color);background:var(--waline-disable-bgcolor);color:var(--waline-disable-color);cursor:not-allowed}.wl-btn.primary{border-color:var(--waline-theme-color);background:var(--waline-theme-color);color:var(--waline-white)}.wl-btn.primary:hover,.wl-btn.primary:active{border-color:var(--waline-active-color);background:var(--waline-active-color);color:var(--waline-white)}.wl-btn.primary:disabled{border-color:var(--waline-border-color);background:var(--waline-disable-bgcolor);color:var(--waline-disable-color);cursor:not-allowed}.wl-loading{text-align:center}.wl-loading svg{margin:0 auto}.wl-comment{position:relative;display:flex;margin-bottom:.75em}.wl-close{position:absolute;top:-4px;inset-inline-end:-4px;padding:0;border:none;background:rgba(0,0,0,0);line-height:1;cursor:pointer}.wl-login-info{max-width:80px;margin-top:.75em;text-align:center}.wl-logout-btn{position:absolute;top:-10px;inset-inline-end:-10px;padding:3px;border:none;background:rgba(0,0,0,0);line-height:0;cursor:pointer}.wl-avatar{position:relative;width:var(--waline-avatar-size);height:var(--waline-avatar-size);margin:0 auto;border:var(--waline-border);border-radius:var(--waline-avatar-radius)}@media (max-width: 720px){.wl-avatar{width:var(--waline-m-avatar-size);height:var(--waline-m-avatar-size)}}.wl-avatar img{width:100%;height:100%;border-radius:var(--waline-avatar-radius)}.wl-login-nick{display:block;color:var(--waline-theme-color);font-size:.75em;word-break:break-all}.wl-panel{position:relative;flex-shrink:1;width:100%;margin:.5em;border:var(--waline-border);border-radius:.75em;background:var(--waline-bgcolor);box-shadow:var(--waline-box-shadow)}.wl-header{display:flex;overflow:hidden;padding:0 4px;border-bottom:2px dashed var(--waline-border-color);border-top-left-radius:.75em;border-top-right-radius:.75em}@media (max-width: 580px){.wl-header{display:block}}.wl-header label{min-width:40px;padding:.75em .5em;color:var(--waline-color);font-size:.75em;text-align:center}.wl-header input{flex:1;width:0;padding:.5em;background:rgba(0,0,0,0);font-size:.625em;resize:none}.wl-header-item{display:flex;flex:1}@media (max-width: 580px){.wl-header-item:not(:last-child){border-bottom:2px dashed var(--waline-border-color)}}.wl-header-1 .wl-header-item{width:100%}.wl-header-2 .wl-header-item{width:50%}@media (max-width: 580px){.wl-header-2 .wl-header-item{flex:0;width:100%}}.wl-header-3 .wl-header-item{width:33.33%}@media (max-width: 580px){.wl-header-3 .wl-header-item{width:100%}}.wl-editor{position:relative;width:calc(100% - 1em);min-height:8.75em;margin:.75em .5em;border-radius:.5em;background:rgba(0,0,0,0);font-size:.875em;resize:vertical}.wl-editor,.wl-input{max-width:100%;border:none;color:var(--waline-color);outline:none;transition:all .25s ease}.wl-editor:focus,.wl-input:focus{background:var(--waline-bgcolor-light)}.wl-preview{padding:0 .5em .5em}.wl-preview h4{margin:.25em;font-weight:700;font-size:.9375em}.wl-preview .wl-content{min-height:1.25em;padding:.25em;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.wl-preview .wl-content>*:first-child{margin-top:0}.wl-preview .wl-content>*:last-child{margin-bottom:0}.wl-footer{position:relative;display:flex;flex-wrap:wrap;margin:.5em .75em}.wl-actions{display:flex;flex:2;align-items:center}.wl-action{display:inline-flex;align-items:center;justify-content:center;width:1.5em;height:1.5em;margin:2px;padding:0;border:none;background:rgba(0,0,0,0);color:var(--waline-color);font-size:16px;cursor:pointer}.wl-action:hover{color:var(--waline-theme-color)}.wl-action.active{color:var(--waline-active-color)}#wl-image-upload{display:none}#wl-image-upload:focus+label{color:var(--waline-color)}#wl-image-upload:focus-visible+label{outline:-webkit-focus-ring-color auto 1px}.wl-info{display:flex;flex:3;align-items:center;justify-content:flex-end}.wl-info .wl-text-number{color:var(--waline-info-color);font-size:.75em}.wl-info .wl-text-number .illegal{color:red}.wl-info button{margin-inline-start:.75em}.wl-info button svg{display:block;margin:0 auto;line-height:18px}.wl-emoji-popup{position:absolute;top:100%;inset-inline-start:1.25em;z-index:10;max-width:526px;border:var(--waline-border);border-radius:6px;background:var(--waline-bgcolor);box-shadow:var(--waline-box-shadow);opacity:0;visibility:hidden;transition:transform .2s ease-out,opacity .2s ease-out;transform:scale(.9);transform-origin:0 0}.wl-emoji-popup.display{opacity:1;visibility:visible;transform:none}.wl-emoji-popup button{display:inline-block;vertical-align:middle;width:2em;margin:.125em;padding:0;border-width:0;background:rgba(0,0,0,0);font-size:inherit;line-height:2;text-align:center;cursor:pointer}.wl-emoji-popup button:hover{background:var(--waline-bgcolor-hover)}.wl-emoji-popup .wl-emoji{display:inline-block;vertical-align:middle;max-width:1.5em;max-height:1.5em}.wl-emoji-popup .wl-tab-wrapper{overflow-y:auto;max-height:145px;padding:.5em}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar{width:6px;height:6px}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar-track-piece:vertical{border-radius:6px;background:rgba(0,0,0,.1)}.wl-emoji-popup .wl-tab-wrapper::-webkit-scrollbar-thumb:vertical{width:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-emoji-popup .wl-tabs{position:relative;overflow-x:auto;padding:0 6px;white-space:nowrap}.wl-emoji-popup .wl-tabs:before{content:" ";position:absolute;top:0;right:0;left:0;z-index:2;height:1px;background:var(--waline-border-color)}.wl-emoji-popup .wl-tabs::-webkit-scrollbar{width:6px;height:6px}.wl-emoji-popup .wl-tabs::-webkit-scrollbar-track-piece:horizontal{border-radius:6px;background:rgba(0,0,0,.1)}.wl-emoji-popup .wl-tabs::-webkit-scrollbar-thumb:horizontal{height:6px;border-radius:6px;background:var(--waline-theme-color)}.wl-emoji-popup .wl-tab{position:relative;margin:0;padding:0 .5em}.wl-emoji-popup .wl-tab.active{z-index:3;border:1px solid var(--waline-border-color);border-top-width:0;border-bottom-right-radius:6px;border-bottom-left-radius:6px;background:var(--waline-bgcolor)}.wl-gif-popup{position:absolute;top:100%;inset-inline-start:1.25em;z-index:10;width:calc(100% - 3em);padding:.75em .75em .25em;border:var(--waline-border);border-radius:6px;background:var(--waline-bgcolor);box-shadow:var(--waline-box-shadow);opacity:0;visibility:hidden;transition:transform .2s ease-out,opacity .2s ease-out;transform:scale(.9);transform-origin:0 0}.wl-gif-popup.display{opacity:1;visibility:visible;transform:none}.wl-gif-popup input{box-sizing:border-box;width:100%;margin-bottom:10px;padding:3px 5px;border:var(--waline-border)}.wl-gif-popup img{display:block;box-sizing:border-box;width:100%;border-width:2px;border-style:solid;border-color:#fff;cursor:pointer}.wl-gif-popup img:hover{border-color:var(--waline-theme-color);border-radius:2px}.wl-gallery{display:flex;overflow-y:auto;max-height:80vh}.wl-gallery-column{display:flex;flex:1;flex-direction:column;height:max-content}.wl-cards .wl-user{--avatar-size: var(--waline-avatar-size);position:relative;margin-inline-end:.75em}@media (max-width: 720px){.wl-cards .wl-user{--avatar-size: var(--waline-m-avatar-size)}}.wl-cards .wl-user img{width:var(--avatar-size);height:var(--avatar-size);border-radius:var(--waline-avatar-radius);box-shadow:var(--waline-box-shadow)}.wl-cards .wl-user .verified-icon{position:absolute;top:calc(var(--avatar-size)*3/4);inset-inline-start:calc(var(--avatar-size)*3/4);border-radius:50%;background:var(--waline-bgcolor);box-shadow:var(--waline-box-shadow)}.wl-card-item{position:relative;display:flex;padding:.5em}.wl-card-item .wl-card-item{padding-inline-end:0}.wl-card{flex:1;width:0;padding-bottom:.5em;border-bottom:1px dashed var(--waline-border-color)}.wl-card:first-child{margin-inline-start:1em}.wl-card-item:last-child>.wl-card{border-bottom:none}.wl-card .wl-nick svg{position:relative;bottom:-.125em;line-height:1}.wl-card .wl-head{overflow:hidden;line-height:1.5}.wl-card .wl-head .wl-nick{position:relative;display:inline-block;margin-inline-end:.5em;font-weight:700;font-size:.875em;line-height:1;text-decoration:none}.wl-card span.wl-nick{color:var(--waline-dark-grey)}.wl-card .wl-badge{display:inline-block;margin-inline-end:1em;padding:0 .3em;border:1px solid var(--waline-badge-color);border-radius:4px;color:var(--waline-badge-color);font-size:var(--waline-badge-font-size)}.wl-card .wl-time{margin-inline-end:.875em;color:var(--waline-info-color);font-size:.75em}.wl-card .wl-meta{position:relative;line-height:1}.wl-card .wl-meta>span{display:inline-block;margin-inline-end:.25em;padding:2px 4px;border-radius:.2em;background:var(--waline-info-bgcolor);color:var(--waline-info-color);font-size:var(--waline-info-font-size);line-height:1.5}.wl-card .wl-meta>span:empty{display:none}.wl-card .wl-comment-actions{float:right;line-height:1}[dir=rtl] .wl-card .wl-comment-actions{float:left}.wl-card .wl-delete,.wl-card .wl-like,.wl-card .wl-reply,.wl-card .wl-edit{display:inline-flex;align-items:center;border:none;background:rgba(0,0,0,0);color:var(--waline-color);line-height:1;cursor:pointer;transition:color .2s ease}.wl-card .wl-delete:hover,.wl-card .wl-like:hover,.wl-card .wl-reply:hover,.wl-card .wl-edit:hover{color:var(--waline-theme-color)}.wl-card .wl-delete.active,.wl-card .wl-like.active,.wl-card .wl-reply.active,.wl-card .wl-edit.active{color:var(--waline-active-color)}.wl-card .wl-content{position:relative;margin-bottom:.75em;padding-top:.625em;font-size:.875em;line-height:2;word-wrap:break-word}.wl-card .wl-content.expand{overflow:hidden;max-height:8em;cursor:pointer}.wl-card .wl-content.expand:before{content:"";position:absolute;top:0;bottom:3.15em;inset-inline-start:0;z-index:999;display:block;width:100%;background:linear-gradient(180deg,#000,rgba(255,255,255,.9))}.wl-card .wl-content.expand:after{content:attr(data-expand);position:absolute;bottom:0;inset-inline-start:0;z-index:999;display:block;width:100%;height:3.15em;background:rgba(255,255,255,.9);color:#828586;line-height:3.15em;text-align:center}.wl-card .wl-content>*:first-child{margin-top:0}.wl-card .wl-content>*:last-child{margin-bottom:0}.wl-card .wl-admin-actions{margin:8px 0;font-size:12px;text-align:right}.wl-card .wl-comment-status{margin:0 8px}.wl-card .wl-comment-status .wl-btn{border-radius:0}.wl-card .wl-comment-status .wl-btn:first-child{border-inline-end:0;border-radius:.5em 0 0 .5em}.wl-card .wl-comment-status .wl-btn:last-child{border-inline-start:0;border-radius:0 .5em .5em 0}.wl-card .wl-quote{border-inline-start:1px dashed rgba(237,237,237,.5)}.wl-card .wl-quote .wl-user{--avatar-size: var(--waline-m-avatar-size)}.wl-close-icon{color:var(--waline-border-color)}.wl-content .vemoji,.wl-content .wl-emoji{display:inline-block;vertical-align:baseline;height:1.25em;margin:-.125em .25em}.wl-content .wl-tex{background:var(--waline-info-bgcolor);color:var(--waline-info-color)}.wl-content span.wl-tex{display:inline-block;margin-inline-end:.25em;padding:2px 4px;border-radius:.2em;font-size:var(--waline-info-font-size);line-height:1.5}.wl-content p.wl-tex{text-align:center}.wl-content .katex-display{overflow:auto hidden;-webkit-overflow-scrolling:touch;padding-top:.2em;padding-bottom:.2em}.wl-content .katex-display::-webkit-scrollbar{height:3px}.wl-content .katex-error{color:red}.wl-count{flex:1;font-weight:700;font-size:1.25em}.wl-empty{overflow:auto;padding:1.25em;color:var(--waline-color);text-align:center}.wl-operation{text-align:center}.wl-operation button{margin:1em 0}.wl-power{padding:.5em 0;color:var(--waline-light-grey);font-size:var(--waline-info-font-size);text-align:end}.wl-meta-head{display:flex;flex-direction:row;align-items:center;padding:.375em}.wl-sort{margin:0;list-style-type:none}.wl-sort li{display:inline-block;color:var(--waline-info-color);font-size:.75em;cursor:pointer}.wl-sort li.active{color:var(--waline-theme-color)}.wl-sort li+li{margin-inline-start:1em}.wl-reaction{overflow:auto hidden;margin-bottom:1.75em;text-align:center}.wl-reaction img{width:100%;height:100%;transition:all .25s ease-in-out}.wl-reaction-title{margin:16px auto;font-weight:700;font-size:18px}.wl-reaction-list{display:flex;flex-direction:row;gap:16px;justify-content:center;margin:0;padding:8px;list-style-type:none}@media (max-width: 580px){.wl-reaction-list{gap:12px}}[data-waline] .wl-reaction-list{margin-inline-start:0}.wl-reaction-item{display:flex;flex-direction:column;align-items:center;cursor:pointer}.wl-reaction-item:hover img,.wl-reaction-item.active img{transform:scale(1.15)}.wl-reaction-img{position:relative;width:42px;height:42px}@media (max-width: 580px){.wl-reaction-img{width:32px;height:32px}}.wl-reaction-loading{position:absolute;top:-4px;inset-inline-end:-5px;width:18px;height:18px;color:var(--waline-theme-color)}.wl-reaction-votes{position:absolute;top:-9px;inset-inline-end:-9px;min-width:1em;padding:2px;border:1px solid var(--waline-theme-color);border-radius:1em;background:var(--waline-bgcolor);color:var(--waline-theme-color);font-weight:700;font-size:.75em;line-height:1}.wl-reaction-item.active .wl-reaction-votes{background:var(--waline-theme-color);color:var(--waline-bgcolor)}.wl-reaction-text{font-size:.875em}.wl-reaction-item.active .wl-reaction-text{color:var(--waline-theme-color)}.wl-content pre,.wl-content pre[class*=language-]{overflow:auto;margin:.75rem 0;padding:1rem 1.25rem;border-radius:6px;background:var(--waline-code-bgcolor);line-height:1.4}.wl-content pre code,.wl-content pre[class*=language-] code{padding:0;border-radius:0;background:rgba(0,0,0,0)!important;color:#bbb;direction:ltr}.wl-content code[class*=language-],.wl-content pre[class*=language-]{background:none;color:#ccc;font-size:1em;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;text-align:left;white-space:pre;word-spacing:normal;word-wrap:normal;word-break:normal;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}.wl-content pre[class*=language-]{overflow:auto}.wl-content :not(pre)>code[class*=language-],.wl-content pre[class*=language-]{background:#2d2d2d}.wl-content :not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.wl-content .token.comment,.wl-content .token.block-comment,.wl-content .token.prolog,.wl-content .token.doctype,.wl-content .token.cdata{color:#999}.wl-content .token.punctuation{color:#ccc}.wl-content .token.tag,.wl-content .token.attr-name,.wl-content .token.namespace,.wl-content .token.deleted{color:#e2777a}.wl-content .token.function-name{color:#6196cc}.wl-content .token.boolean,.wl-content .token.number,.wl-content .token.function{color:#f08d49}.wl-content .token.property,.wl-content .token.class-name,.wl-content .token.constant,.wl-content .token.symbol{color:#f8c555}.wl-content .token.selector,.wl-content .token.important,.wl-content .token.atrule,.wl-content .token.keyword,.wl-content .token.builtin{color:#cc99cd}.wl-content .token.string,.wl-content .token.char,.wl-content .token.attr-value,.wl-content .token.regex,.wl-content .token.variable{color:#7ec699}.wl-content .token.operator,.wl-content .token.entity,.wl-content .token.url{color:#67cdcc}.wl-content .token.important,.wl-content .token.bold{font-weight:700}.wl-content .token.italic{font-style:italic}.wl-content .token.entity{cursor:help}.wl-content .token.inserted{color:green}.wl-recent-item p{display:inline}.wl-user-list{padding:0;list-style:none}.wl-user-list a,.wl-user-list a:hover,.wl-user-list a:visited{color:var(--waline-color);text-decoration:none}.wl-user-list .wl-user-avatar{position:relative;display:inline-block;overflow:hidden;margin-inline-end:10px;border-radius:4px;line-height:0}.wl-user-list .wl-user-avatar>img{width:var(--waline-user-avatar-size, 48px);height:var(--waline-user-avatar-size, 48px)}.wl-user-list .wl-user-badge{position:absolute;bottom:0;inset-inline-end:0;min-width:.7em;height:1.5em;padding:0 .4em;border-radius:4px;background:var(--waline-info-bgcolor);color:var(--waline-info-color);font-weight:700;font-size:10px;line-height:1.5em;text-align:center}.wl-user-list .wl-user-item{margin:10px 0}.wl-user-list .wl-user-item:nth-child(1) .wl-user-badge{background:var(--waline-rank-gold-bgcolor, #fa3939);color:var(--waline-white);font-weight:700}.wl-user-list .wl-user-item:nth-child(2) .wl-user-badge{background:var(--waline-rank-silver-bgcolor, #fb811c);color:var(--waline-white);font-weight:700}.wl-user-list .wl-user-item:nth-child(3) .wl-user-badge{background:var(--waline-rank-copper-bgcolor, #feb207);color:var(--waline-white)}.wl-user-list .wl-user-meta{display:inline-block;vertical-align:top}.wl-user-list .wl-badge{display:inline-block;vertical-align:text-top;margin-inline-start:.5em;padding:0 .3em;border:1px solid var(--waline-badge-color);border-radius:4px;color:var(--waline-badge-color);font-size:var(--waline-badge-font-size)}.wl-user-wall{padding:0;list-style:none}.wl-user-wall .wl-user-badge,.wl-user-wall .wl-user-meta{display:none}.wl-user-wall .wl-user-item{position:relative;display:inline-block;transition:transform ease-in-out .2s}.wl-user-wall .wl-user-item:before,.wl-user-wall .wl-user-item:after{position:absolute;bottom:100%;left:50%;z-index:10;opacity:0;pointer-events:none;transition:all .18s ease-out .18s;transform:translate(-50%,4px);transform-origin:top}.wl-user-wall .wl-user-item:before{content:"";width:0;height:0;border:5px solid rgba(0,0,0,0);border-top-color:#101010f2}.wl-user-wall .wl-user-item:after{content:attr(aria-label);margin-bottom:10px;padding:.5em 1em;border-radius:2px;background:rgba(16,16,16,.95);color:#fff;font-size:12px;white-space:nowrap}.wl-user-wall .wl-user-item:hover{transform:scale(1.1)}.wl-user-wall .wl-user-item:hover:before,.wl-user-wall .wl-user-item:hover:after{opacity:1;pointer-events:none;transform:translate(-50%)}.wl-user-wall .wl-user-item img{width:var(--waline-user-avatar-size, 48px);height:var(--waline-user-avatar-size, 48px)}.dark .wl-panel{background:none}.wl-panel{border-radius:.5rem;border:.0625rem solid var(--grey-2);box-shadow:0 .625rem 1.875rem -.9375rem var(--box-bg-shadow);margin-bottom:.625rem;position:relative;padding:.625rem}.wl-panel .wl-header{display:flex;padding:.3em .6em;border-bottom:none}.wl-panel .wl-header .wl-header-item{flex:1 1 100%;padding-right:0;width:100%;border-bottom:none}.wl-panel .wl-header .wl-header-item label{display:none}.wl-panel .wl-header input{padding:.625rem .3125rem;width:100%;border-bottom:.0625rem dashed var(--grey-4);outline:0;background:0 0;font-size:.75em;transition:all .25s ease}.wl-panel .wl-header textarea{border:none;outline:0;background:0 0;font-size:.75em;transition:all .25s ease}.wl-panel .wl-editor{width:100%;min-height:8.75em;font-size:.875em;line-height:1.75;resize:vertical}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.left-0{left:0}.top-0{top:0}.-z-\[1\]{z-index:-1}.-z-\[9\]{z-index:-9}.z-0{z-index:0}.z-\[1\]{z-index:1}.m-0{margin:0}.mx-0{margin-left:0;margin-right:0}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0;margin-bottom:0}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-auto{margin-top:auto;margin-bottom:auto}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}.h-\[50vh\]{height:50vh}.h-\[70vh\]{height:70vh}.h-full{height:100%}.min-h-\[1\.875rem\]{min-height:1.875rem}.min-h-\[10rem\]{min-height:10rem}.min-h-\[25rem\]{min-height:25rem}.w-\[15rem\]{width:15rem}.w-\[calc\(100\%-\.625rem\)\]{width:calc(100% - .625rem)}.w-auto{width:auto}.w-full{width:100%}.flex-shrink{flex-shrink:1}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[imageAnimation_36s_linear_infinite_0s\]{animation:imageAnimation 36s linear infinite 0s}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded-\[0\.3125rem\]{border-radius:.3125rem}.rounded-\[0\.625rem\]{border-radius:.625rem}.border{border-width:1px}.bg-\[\#363636\]{--tw-bg-opacity: 1;background-color:rgb(54 54 54 / var(--tw-bg-opacity))}.bg-\[rgba\(0\,0\,0\,\.08\)\]{background-color:#00000014}.bg-\[var\(--note-bg\)\]{background-color:var(--note-bg)}.bg-cover{background-size:cover}.bg-center{background-position:center}.bg-no-repeat{background-repeat:no-repeat}.p-5{padding:1.25rem}.p-\[\.875rem_\.9375rem_2rem\]{padding:.875rem .9375rem 2rem}.p-\[0_\.125rem_\.3125rem_\.625rem\]{padding:0 .125rem .3125rem .625rem}.p-\[4\.6875rem_0_2rem\]{padding:4.6875rem 0 2rem}.px-0{padding-left:0;padding-right:0}.px-20{padding-left:5rem;padding-right:5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-\[\.9375rem\]{padding-left:.9375rem;padding-right:.9375rem}.px-\[0\.3125rem\]{padding-left:.3125rem;padding-right:.3125rem}.py-0{padding-top:0;padding-bottom:0}.py-\[\.3125rem\]{padding-top:.3125rem;padding-bottom:.3125rem}.pb-0{padding-bottom:0}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pt-12{padding-top:3rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-\[3\.625rem\]{padding-top:3.625rem}.text-left{text-align:left}.text-center{text-align:center}.text-\[\.75em\]{font-size:.75em}.text-\[\.8125em\]{font-size:.8125em}.text-\[\.875em\]{font-size:.875em}.text-\[1em\]{font-size:1em}.font-normal{font-weight:400}.uppercase{text-transform:uppercase}.leading-\[1\.8\]{line-height:1.8}.text-\[var\(--grey-5\)\]{color:var(--grey-5)}.text-\[var\(--grey-6\)\]{color:var(--grey-6)}.text-\[var\(--note-text\)\]{color:var(--note-text)}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[backface-visibility\:hidden\]{backface-visibility:hidden}.\[border-bottom\:none\]{border-bottom:none}.\[text-decoration\:none\]{text-decoration:none}.\[transform-style\:preserve-3d\]{transform-style:preserve-3d}:root{--grey-0: #fff;--grey-1: #fdfdfd;--grey-2: #f7f7f7;--grey-3: #eff2f3;--grey-4: #ccc;--grey-5: #999;--grey-6: #666;--grey-7: #333;--grey-8: #222;--grey-9: #000;--grey-1-a0: rgba(253,253,253,0);--grey-1-a7: rgba(253,253,253,.7);--grey-1-a5: rgba(253,253,253,.5);--grey-1-a3: rgba(253,253,253,.3);--grey-9-a1: rgba(0,0,0,.1);--grey-9-a5: rgba(0,0,0,.5);--grey-2-a0: rgba(247,247,247,0);--color-pink-light: #ffe6fa;--color-cyan-light: #e3fdf5;--color-red: #e9546b;--color-pink: #ed6ea0;--color-orange: #ec8c69;--color-yellow: #eab700;--color-green: #0a7426;--color-aqua: #3e999f;--color-blue: #38a1db;--color-purple: #9d5b8b;--color-grey: #869194;--color-red-a1: rgba(233,84,107,.1);--color-red-a3: rgba(233,84,107,.3);--color-pink-a3: rgba(237,110,160,.3);--color-pink-light-a3: rgba(255,230,250,.3);--color-pink-light-a5: rgba(255,230,250,.5);--color-pink-light-a7: rgba(255,230,250,.7);--body-bg-shadow: var(--grey-2);--box-bg-shadow: var(--grey-9-a1);--text-color: var(--grey-7);--header-text-color: var(--grey-0);--primary-color: var(--color-red);--nav-bg: linear-gradient(-225deg, var(--color-cyan-light) 0, var(--color-pink-light) 100%) }::-moz-selection{background:var(--color-orange);color:var(--grey-2)}::selection{background:var(--color-orange);color:var(--grey-2)}::-webkit-scrollbar{width:.5rem;height:.5rem;background:0 0}::-webkit-scrollbar-track{border-radius:.3125rem;background:0 0}::-webkit-scrollbar-track-piece{background:0 0}::-webkit-scrollbar-button{background:0 0;height:0}::-webkit-scrollbar-thumb{border-radius:1.25rem;background-clip:padding-box;background-color:var(--color-pink-light);background-image:linear-gradient(45deg,var(--grey-1-a5) 25%,transparent 0,transparent 50%,var(--grey-1-a5) 0,var(--grey-1-a5) 75%,transparent 0,transparent)}*,:after,:before{box-sizing:border-box;margin:0;padding:0}body,html{height:100%}body{background:linear-gradient(to top,var(--body-bg-shadow) 0,var(--grey-1) 20%) no-repeat bottom;color:var(--text-color);font-family:Mulish,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;font-size:1em;line-height:2;-webkit-font-smoothing:antialiased;overflow:auto}#app{position:relative;display:flex;height:100%;width:100%;flex-direction:column}a:after,a:before{transition:all .4s ease-in-out 0s}h1{font-size:2em;margin:.67em 0}h1,h2,h3,h4,h5,h6{font-family:Mulish,"Noto Serif SC","Noto Serif JP",Mulish,-apple-system,PingFang SC,Microsoft YaHei,sans-serif;font-weight:700;line-height:1.5;margin:1.25rem 0 .9375rem}@font-face{font-family:ic;src:url(//at.alicdn.com/t/font_1832207_igi8uaupcus.eot);src:url(//at.alicdn.com/t/font_1832207_igi8uaupcus.eot?#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/font_1832207_igi8uaupcus.woff2) format("woff2"),url(//at.alicdn.com/t/font_1832207_igi8uaupcus.woff) format("woff"),url(//at.alicdn.com/t/font_1832207_igi8uaupcus.ttf) format("truetype"),url(//at.alicdn.com/t/font_1832207_igi8uaupcus.svg#ic) format("svg")}.ic{font-family:ic!important;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;width:1.25em;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:left-0:before{content:var(--tw-content);left:0}.before\:top-0:before{content:var(--tw-content);top:0}.before\:z-\[1\]:before{content:var(--tw-content);z-index:1}.before\:block:before{content:var(--tw-content);display:block}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-full:before{content:var(--tw-content);width:100%}.before\:bg-\[rgba\(0\,0\,0\,\.2\)\]:before{content:var(--tw-content);background-color:#0003}.before\:transition:before{content:var(--tw-content);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.before\:content-\[\'\'\]:before{--tw-content: "";content:var(--tw-content)}.before\:content-\[\'\\e8ed\'\]:before{--tw-content: "";content:var(--tw-content)}.before\:content-\[\'\\f039\'\]:before{--tw-content: "";content:var(--tw-content)}.before\:content-\[\'\\f0bd\'\]:before{--tw-content: "";content:var(--tw-content)}.before\:\[font-family\:ic\]:before{content:var(--tw-content);font-family:ic}.first\:mb-5:first-child{margin-bottom:1.25rem}@media (min-width: 1280px){.xl\:w-\[72\.5rem\]{width:72.5rem}.xl\:w-\[calc\(100\%-15\.75rem\)\]{width:calc(100% - 15.75rem)}}@media (min-width: 1536px){.\32xl\:w-\[73\%\]{width:73%}}.\[\&\:not\(\:last-child\)\]\:mr-2\.5:not(:last-child){margin-right:.625rem} diff --git a/atom.xml b/atom.xml new file mode 100644 index 0000000..cccc14e --- /dev/null +++ b/atom.xml @@ -0,0 +1,3853 @@ + + + DYT + 这是一个无聊的人搭建的博客 + 2023-09-28T07:24:11.077Z + https://github.com/jpmonette/feed + + Dragon Dyt + dragondyt@yandex.com + + + + 这是一个无聊的人搭建的博客 + https://cdn.jsdelivr.net/gh/amehime/shoka@30732f13/images/avatar.jpg + All rights reserved 2021, Dragon Dyt + + + <![CDATA[OpenGL环境测试]]> + /8612fa7f/e00fc567/OpenGL/ecdcd4fc.html + + 2023-09-28T07:24:11.068Z + 日志

    +
    2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: eglCreateContext: EGL_BAD_CONFIG: no ES 3 support
    +2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: tid 6601: eglCreateContext(1682): error 0x3005 (EGL_BAD_CONFIG)
    +2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/AndroidRuntime: FATAL EXCEPTION: GLThread 501
    +    Process: com.example.opengl, PID: 6546
    +    java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG
    +        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1223)
    +        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1214)
    +        at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1064)
    +        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1431)
    +        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272)
    +
    +
    +

    估计是电脑没显卡导致的

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + Dragon Dyt + dragondyt@yandex.com + + 2023-09-28T07:24:11.068Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[安卓Studio打不开]]> + /8612fa7f/e00fc567/3632a017/af753a41.html + + 2023-09-28T07:24:11.068Z + 安卓Studio打不开

    +

    莫名奇妙的问题,idea能打开。难道有单独的变量设置?最后没找到。
    +官网上的针对IDE能打开的情况,这不是废话吗,能打开什么都好说。。。

    +

    通过bat打开后发现Android Studio 使用的是java11,而我坏境JavaHome是1.8。但是之前就很正常,而且它是自带环境的,卸载重装也没用

    +

    最后给我的java环境升级到了java19,成功解决问题。

    +

    问题不到,开发时可以指定java版本,外部就用最高的长期支持版吧!

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + Dragon Dyt + dragondyt@yandex.com + + 2023-09-28T07:24:11.068Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[[160]相交链表]]> + /8612fa7f/b7e144d1/2362a8ea/389d18c2.html + + 2022-08-04T10:20:55.000Z + public class Solution { + public ListNode getIntersectionNode(ListNode headA, ListNode headB) { + // p1 指向 A 链表头结点,p2 指向 B 链表头结点 + ListNode p1 = headA, p2 = headB; + while (p1 != p2) { + // p1 走一步,如果走到 A 链表末尾,转到 B 链表 + if (p1 == null) { + p1 = headB; + } else { + p1 = p1.next; + } + // p2 走一步,如果走到 B 链表末尾,转到 A 链表 + if (p2 == null) { + p2 = headA; + } else { + p2 = p2.next; + } + } + return p1; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-08-04T10:20:55.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[2073]买票需要的时间]]> + /8612fa7f/b7e144d1/340249a9/76a66db0.html + + 2022-08-04T09:48:19.000Z + class Solution { + public int timeRequiredToBuy(int[] tickets, int k) { + int ret = 0; + for (int i = 0; i < tickets.length; i++) { + if (i <= k) { + ret = ret + Math.min(tickets[i], tickets[k]); + } else { + ret = ret + Math.min(tickets[i], tickets[k] - 1); + } + } + return ret; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-08-04T09:48:19.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[剑指 Offer II 022]链表中环的入口节点]]> + /8612fa7f/b7e144d1/2362a8ea/9862a150.html + + 2022-08-03T16:10:45.000Z + /** + * Definition for singly-linked list. + * class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ +public class Solution { + public ListNode detectCycle(ListNode head) { + //如果用两个指针 + ListNode fast = head, slow = head; + while (fast != null && fast.next != null) { + fast = fast.next.next; + slow = slow.next; + if (fast == slow) { + break; + } + } + if (fast == null || fast.next == null) { + return null; + } + slow = head; + while (slow!=fast){ + slow = slow.next; + fast = fast.next; + } + return slow; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + Dragon Dyt + dragondyt@yandex.com + + 2022-08-03T16:10:45.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[141]环形链表]]> + /8612fa7f/b7e144d1/2362a8ea/69a9925d.html + + 2022-08-03T15:57:27.000Z + /** + * Definition for singly-linked list. + * class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ +public class Solution { + public boolean hasCycle(ListNode head) { + ListNode fast = head, slow = head; + // 快指针走到末尾时停止 + while (fast != null && fast.next != null) { + slow = slow.next; + fast = fast.next.next; + // 快慢指针相遇,说明含有环 + if (slow == fast) { + return true; + } + } + return false; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-08-03T15:57:27.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[876]链表的中间结点]]> + /8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html + + 2022-08-03T15:44:27.000Z + /** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode middleNode(ListNode head) { + //简单的话应该是循环一遍,获取长度,如果是偶数则长度加一,然后获取中点,再循环一次 + // 快慢指针初始化指向 head + ListNode slow = head, fast = head; + // 快指针走到末尾时停止 + while (fast != null && fast.next != null) { + // 慢指针走一步,快指针走两步 + slow = slow.next; + fast = fast.next.next; + } + // 慢指针指向中点 + return slow; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-08-03T15:44:27.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[19]删除链表的倒数第 N 个结点]]> + /8612fa7f/b7e144d1/2362a8ea/36462e02.html + + 2022-08-03T15:19:58.000Z + /** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode removeNthFromEnd(ListNode head, int n) { + //删除倒数第N个,那我怎么知道N的位置,链表长度不是固定的 + //假设是1到x,那么第倒数第N个应该是 X - N + 1 + //Y = X - N + 1 ,则 + // 虚拟头结点 + ListNode pre = new ListNode(0); + pre.next = head; + ListNode start = pre, end = pre; + // p1 先走 n 步 + while (n != 0) { + start = start.next; + n--; + } + // p1 和 p2 同时走 x - n 步,当p1走完时,p2走了 x-n步,停在X - N + 1上 + while (start.next != null) { + start = start.next; + end = end.next; + } + end.next = end.next.next; + return pre.next; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-08-03T15:19:58.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[剑指 Offer 22]链表中倒数第k个节点]]> + /8612fa7f/b7e144d1/2362a8ea/8f835b6d.html + + 2022-07-28T16:59:09.000Z + class Solution { + public ListNode getKthFromEnd(ListNode head, int k) { + ListNode p1 = head; + // p1 先走 k 步 + for (int i = 0; i < k; i++) { + p1 = p1.next; + } + ListNode p2 = head; + // p1 和 p2 同时走 n - k 步 + while (p1 != null) { + p2 = p2.next; + p1 = p1.next; + } + // p2 现在指向第 n - k + 1 个节点,即倒数第 k 个节点 + return p2; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-28T16:59:09.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[23]合并K个升序链表]]> + /8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html + + 2022-07-28T16:10:15.000Z + class Solution { + public ListNode mergeKLists(ListNode[] lists) { + if (lists.length == 0) return null; + // 虚拟头结点 + ListNode dummy = new ListNode(-1); + ListNode p = dummy; + // 优先级队列,最小堆 + PriorityQueue<ListNode> pq = new PriorityQueue<>( + lists.length, (a, b)->(a.val - b.val)); + // 将 k 个链表的头结点加入最小堆 + for (ListNode head : lists) { + if (head != null) + pq.add(head); + } + + while (!pq.isEmpty()) { + // 获取最小节点,接到结果链表中 + ListNode node = pq.poll(); + p.next = node; + if (node.next != null) { + pq.add(node.next); + } + // p 指针不断前进 + p = p.next; + } + return dummy.next; + } +} + +

    总结:优先级队列

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-28T16:10:15.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[[21]合并两个有序链表]]> + /8612fa7f/b7e144d1/2362a8ea/2a1f0504.html + + 2022-07-28T15:58:04.000Z + class Solution { + public ListNode mergeTwoLists(ListNode list1, ListNode list2) { + // 虚拟头结点 + ListNode dummy = new ListNode(-1), p = dummy; + ListNode p1 = l1, p2 = l2; + + while (p1 != null && p2 != null) { + // 比较 p1 和 p2 两个指针 + // 将值较小的的节点接到 p 指针 + if (p1.val > p2.val) { + p.next = p2; + p2 = p2.next; + } else { + p.next = p1; + p1 = p1.next; + } + // p 指针不断前进 + p = p.next; + } + + if (p1 != null) { + p.next = p1; + } + + if (p2 != null) { + p.next = p2; + } + + return dummy.next; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-28T15:58:04.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[86]分隔链表]]> + /8612fa7f/b7e144d1/2362a8ea/3758805c.html + + 2022-07-28T15:58:04.000Z + class Solution { + public ListNode partition(ListNode head, int x) { + // 存放小于 x 的链表的虚拟头结点 + ListNode dummy1 = new ListNode(-1); + // 存放大于等于 x 的链表的虚拟头结点 + ListNode dummy2 = new ListNode(-1); + // p1, p2 指针负责生成结果链表 + ListNode p1 = dummy1, p2 = dummy2; + // p 负责遍历原链表,类似合并两个有序链表的逻辑 + // 这里是将一个链表分解成两个链表 + ListNode p = head; + while (p != null) { + if (p.val >= x) { + p2.next = p; + p2 = p2.next; + } else { + p1.next = p; + p1 = p1.next; + } + // 断开原链表中的每个节点的 next 指针 + ListNode temp = p.next; + p.next = null; + p = temp; + } + // 连接两个链表 + p1.next = dummy2.next; + + return dummy1.next; + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-28T15:58:04.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[二叉搜索树]]> + /8612fa7f/79666db/7b216a3b/7cab1e06.html + + 2022-07-20T15:11:43.000Z + 别名
    +二叉搜索树,二叉查找树,BST,Binary Search Tree

    +

    特点

    +
      +
    1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    2. +
    3. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    4. +
    5. 任意节点的左、右子树也分别为二叉查找树;
    6. +
    7. 没有键值相等的节点。
    8. +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-20T15:11:43.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[[230]二叉搜索树中第K小的元素]]> + /8612fa7f/b7e144d1/e85d694a/77c5fdb1.html + + 2022-07-20T14:24:17.000Z + class Solution { + int rank,res = 0; + public int kthSmallest(TreeNode root, int k) { + traverse(root,k); + return res; + } + private void traverse(TreeNode root, int k) { + if (root == null) { + return; + } + traverse(root.left,k); + //二叉搜索树的特点,若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值,因此先序遍历的就是第k小 + rank++; + if (k == rank) { + res = root.val; + return; + } + traverse(root.right,k); + } +} + +]]> + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-20T14:24:17.000Z + All rights reserved 2021, Dragon Dyt + + + <![CDATA[[105]从前序与中序遍历序列构造二叉树]]> + /8612fa7f/b7e144d1/e85d694a/c7081503.html + + 2022-07-20T12:40:11.000Z + /** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + public TreeNode buildTree(int[] preorder, int[] inorder) { + return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); + } + + private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) { + if (preStart > preEnd) { + return null; + } //根的值 + int rootVal = preorder[preStart]; + //中序中根的位置 + int index = 0; + for (int i = inStart; i <= inEnd; i++) { + if (inorder[i] == rootVal) { + index = i; + break; + } + } + //根节点左边节点数 + int leftSize = index - inStart; + TreeNode root = new TreeNode(rootVal); + //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ] + //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ] + root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1); + root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd); + return root; + } +} + +

    改进

    +
    class Solution {
    +  Map<Integer,Integer> valOrderMap = new HashMap<>();
    +  public TreeNode buildTree(int[] preorder, int[] inorder) {
    +    for (int j = 0; j < inorder.length; j++) {
    +      valOrderMap.put(inorder[j],j);
    +    }
    +    return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
    +  }
    +
    +  private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) {
    +    if (preStart > preEnd) {
    +      return null;
    +    }   //根的值
    +    int rootVal = preorder[preStart];
    +    //中序中根的位置
    +    int index = valOrderMap.get(rootVal);
    +    //根节点左边节点数
    +    int leftSize = index - inStart;
    +    TreeNode root = new TreeNode(rootVal);
    +    //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
    +    //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
    +    root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);
    +    root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd);
    +    return root;
    +  }
    +}
    +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-20T12:40:11.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[[124]二叉树中的最大路径和]]> + /8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html + + 2022-07-20T09:34:52.000Z + 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。

    +

    路径和 是路径中各节点值的总和。

    +

    给你一个二叉树的根节点 root ,返回其 最大路径和。

    +

    示例 1:
    +示例 1
    +输入:root = [1,2,3]
    +输出:6
    +解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

    +

    示例 2:
    +示例 2
    +输入:root = [-10,9,20,null,null,15,7]
    +输出:42
    +解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

    +

    提示:

    +
      +
    • 树中节点数目范围是 [1, 3 * 10⁴]
    • +
    • -1000 <= Node.val <= 1000
    • +
    +

    Related Topics

    +
      +
    • +
    • 深度优先搜索
    • +
    • 动态规划
    • +
    • 二叉树
    • +
    • 👍 1658
    • +
    • 👎 0
    • +
    +
    /**
    + * Definition for a binary tree node.
    + * public class TreeNode {
    + *     int val;
    + *     TreeNode left;
    + *     TreeNode right;
    + *     TreeNode() {}
    + *     TreeNode(int val) { this.val = val; }
    + *     TreeNode(int val, TreeNode left, TreeNode right) {
    + *         this.val = val;
    + *         this.left = left;
    + *         this.right = right;
    + *     }
    + * }
    + */
    +class Solution {
    +  int res = Integer.MIN_VALUE;
    +
    +  public int maxPathSum(TreeNode root) {
    +    // 后序位置
    +    oneSideMax(root);
    +    return res;
    +  }
    +
    +  private int oneSideMax(TreeNode root){
    +    if (root == null) {
    +      return 0;
    +    }
    +    int left = Math.max(0, oneSideMax(root.left));
    +    int right = Math.max(0, oneSideMax(root.right));
    +    res = Math.max(res, left + right + root.val);
    +    return Math.max(left, right) + root.val;
    +  }
    +}
    +//leetcode submit region end(Prohibit modification and deletion)
    +
    +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2022-07-20T09:34:52.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx]]> + /8612fa7f/47867b98/Java/fd72446f.html + + 2021-05-14T17:34:35.000Z + 动漫美图

    + + +

    gateway配合nacos 找不到服务的问题

    +
    gateway版本: 3.0.2
    +
    +
    nacos版本: 1.4.1
    +
    +

    在这里插入图片描述

    +

    在这里插入图片描述
    +gateway出错了,没有任何异常信息,增加自定义异常处理后,通过日志发现一个关键词NoLoadBalancer,突然就想到Spring Cloud2020移除了Ribbon,加入依赖后成功解决问题.

    +
    <dependency>
    +   <groupId>org.springframework.cloud</groupId>
    +   <artifactId>spring-cloud-loadbalancer</artifactId>
    +   <version>对应版本</version>
    +</dependency>
    +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2021-05-14T17:34:35.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[win10下hadoop学习]]> + /8612fa7f/ec060e02/Hadoop/15d9e331.html + + 2021-04-23T21:55:57.000Z + 动漫美图

    + + +

    下载

    +

    下载hadoop

    +

    在这里插入图片描述

    +

    配置环境变量

    +

    在这里插入图片描述
    +path路径
    +在这里插入图片描述

    +

    配置文件

    +

    hadoop-3.2.2\etc\hadoop\core-site.xml

    +
    <?xml version="1.0" encoding="UTF-8"?>
    +<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    +<configuration>
    + <property>
    +        <name>fs.defaultFS</name>
    +        <value>hdfs://localhost:9000/</value>
    + </property>
    + <!-- 当前用户全设置成root -->
    +<property>
    +<name>hadoop.http.staticuser.user</name>
    +<value>root</value>
    +</property>
    +
    +<!-- 不开启权限检查 -->
    +<property>
    +<name>dfs.permissions.enabled</name>
    +<value>false</value>
    +</property>
    +
    +</configuration>
    +
    +
    +

    hadoop-3.2.2\etc\hadoop\hdfs-site.xml

    +
    <?xml version="1.0" encoding="UTF-8"?>
    +<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    +<configuration>
    +    <property>
    +        <name>dfs.namenode.name.dir</name>
    +        <value>/d:/DevTools/hadoop-3.2.2/data/namenode</value>
    +        <description>NameNode directory for namespace and transaction logs storage.</description>
    +    </property>
    +    <property>
    +        <name>dfs.datanode.data.dir</name>
    +        <value>/d:/DevTools/hadoop-3.2.2/data/datanode</value>
    +        <description>DataNode directory</description>
    +    </property>
    +    <property>
    +        <name>dfs.replication</name>
    +        <value>2</value>
    +    </property>
    +</configuration>
    +
    +
    +

    hadoop-3.2.2\etc\hadoop\mapred-site.xml

    +
    <?xml version="1.0"?>
    +<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    +<configuration>
    +    <property>
    +        <name>mapreduce.framework.name</name>
    +        <value>yarn</value>
    +    </property>
    +</configuration>
    +
    +
    +

    hadoop-3.2.2\etc\hadoop\yarn-site.xml

    +
    <?xml version="1.0"?>
    +<configuration>
    +<property>
    +        <name>yarn.nodemanager.aux-services</name>
    +        <value>mapreduce_shuffle</value>
    +    </property>
    +    <property>
    +        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    +        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    +    </property>
    +    <property>
    +        <name>yarn.resourcemanager.hostname</name>
    +        <value>localhost</value>
    +    </property>
    +</configuration>
    +
    +

    缺失文件

    +

    在这里插入图片描述
    +github下载

    +

    遇到的问题

    +

    在这里插入图片描述

    +
    +

    解决方案:安装DirectX修复工具增强版修复系统组件缺失,在C://Windows/System32目录下放置hadoop.dll

    +
    +

    在这里插入图片描述

    +
    +

    ps: 本来打算放弃的,win下的坑太多了,一顿瞎搞后终于成功了,还有点小问题

    +
    +

    在这里插入图片描述

    +

    节点未格式化

    +

    执行

    +
    hdfs namenode  -format
    +
    +

    输入Y
    +在这里插入图片描述

    +

    启动

    +

    执行命令或双击hadoop-3.2.2\sbin下的start-all.cmd

    +
    ./start-all.cmd
    +
    +

    访问8088

    +

    在这里插入图片描述

    +

    访问9000

    +

    It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.

    +

    访问9870(hadoop新版本默认)

    +

    在这里插入图片描述

    +

    关闭

    +

    执行命令或双击hadoop-3.2.2\sbin下的stop-all.cmd

    +
    ./stop-all.cmd
    +
    +

    开发时修改权限

    +

    core-site.xml

    +
    <!-- 当前用户全设置成root -->
    +<property>
    +<name>hadoop.http.staticuser.user</name>
    +<value>root</value>
    +</property>
    +
    +<!-- 不开启权限检查 -->
    +<property>
    +<name>dfs.permissions.enabled</name>
    +<value>false</value>
    +</property>
    +
    +
    +

    测试

    +

    环境准备

    +
      +
    1. 使用图形界面添加等会用的的目录
    2. +
    3. 上传测试文件word,内容为
    4. +
    +
    my name is abc, I can read abc.
    +this is a demo for mapreduce
    +I'm learning hadoop
    +hadoop and mapreduce
    +
    +

    在这里插入图片描述

    +

    代码编写

    +

    pom.xml

    +
    ...
    +        <!-- hadoop 依赖 -->
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-hdfs</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-client</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-mapreduce-client-core</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-common</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +...
    +
    +
    package com.hadoop.demo.mapreduce;
    +import org.apache.hadoop.conf.Configuration;
    +import org.apache.hadoop.fs.Path;
    +import org.apache.hadoop.io.IntWritable;
    +import org.apache.hadoop.io.Text;
    +import org.apache.hadoop.mapreduce.Job;
    +import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    +import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    +import java.io.IOException;
    +public class MyJob {
    +    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    +        //1 Configuration创建配置对象
    +        Configuration cfg=new Configuration();
    +        //2 getInstance创建job对象
    +        Job job = Job.getInstance(cfg);
    +        //3 set设置job,map,reduce类,map,reduce输出类
    +        job.setJarByClass(MyJob.class);
    +        job.setMapperClass(MyMap.class);
    +        job.setReducerClass(MyReduce.class);
    +        job.setOutputKeyClass(Text.class);
    +        job.setOutputValueClass(IntWritable.class);
    +        job.setMapOutputKeyClass(Text.class);
    +        job.setMapOutputValueClass(IntWritable.class);
    +        //4 FileInputFormat.addInputPath指定读取地址
    +        FileInputFormat.addInputPath(job,new Path("hdfs://localhost:9000/wc/input"));
    +        //5 FileOutputFormat.setOutputPath指定写入地址
    +        FileOutputFormat.setOutputPath(job,new Path("hdfs://localhost:9000/wc/output"));
    +        //6 waitForCompletion等待mapreduce完成
    +        boolean flag = job.waitForCompletion(true);
    +        //7 System.exit关闭系统
    +        System.exit(flag?0:1);
    +    }
    +}
    +
    +
    package com.hadoop.demo.mapreduce;
    +import org.apache.hadoop.io.IntWritable;
    +import org.apache.hadoop.io.LongWritable;
    +import org.apache.hadoop.io.Text;
    +import org.apache.hadoop.mapreduce.Mapper;
    +import java.io.IOException;
    +public class MyMap extends Mapper<LongWritable,Text,Text,IntWritable> {
    +    private IntWritable count=new IntWritable(1);
    +    private Text w=new Text();
    +    @Override
    +    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    +        //1 toString字符串转换
    +        String line = value.toString();
    +        //2 split分割单词
    +        String[] words = line.split(" ");
    +        //3 for遍历
    +        for (String word:words){
    +            //4 set转换Text
    +            w.set(word);
    +            //5 write写入
    +            context.write(w,count);
    +        }
    +    }
    +}
    +
    +
    package com.hadoop.demo.mapreduce;
    +import org.apache.hadoop.io.IntWritable;
    +import org.apache.hadoop.io.Text;
    +import org.apache.hadoop.mapreduce.Reducer;
    +import java.io.IOException;
    +public class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
    +    private IntWritable i=new IntWritable();
    +    @Override
    +    protected void reduce(Text word, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
    +        //1 int计数器
    +        int sum=0;
    +        //2 for遍历value
    +        for (IntWritable it:values){
    +            //3 get转换int
    +            sum +=it.get();
    +        }
    +        //4 set转换IntWritable
    +        i.set(sum);
    +        //5 write写入
    +        context.write(word,i);
    +    }
    +}
    +
    +

    运行main方法就可以了

    +

    在这里插入图片描述

    +

    运行结果

    +

    在这里插入图片描述
    +在这里插入图片描述

    +

    结语

    +

    个人感觉新版本对新手友好一下,HDFS WebUI 里可以上传文件,创建目录,2.7.1好像没有.

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2021-04-23T21:55:57.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[win10下编译以及调试openjdk]]> + /8612fa7f/47867b98/Java/9c47706b.html + + 2020-12-05T17:00:19.000Z + 动漫美图

    + + +

    编译OpenJDK

    +

    安装编译环境

    +

    下载openjdk

    +

    使用git clone(如果觉得慢可以使用coding导入的jdk

    +

    安装编译工具

    +

    1.win下Cygwin64环境编译

    +
      +
    1. +

      安装Cygwin

      +
        +
      1. 官方下载
      2. +
      3. 设置下载源
        +清华下载源
      4. +
      +
    2. +
    3. +

      需要安装的包
      +cywin64需要的包

      +
    4. +
    +
    补充:需要安装autoconf
    +
    +
      +
    1. 编译选项&检查
    2. +
    +
    
    +bash ./configure -with-freetype=buddle -enable-debug -with-target-bits=64 -disable-ccache
    +
    +
    +
      +
    1. 构建
    2. +
    +
    make all
    +
    +

    2.win下linux环境编译(ubuntu )

    +
      +
    1. +

      需要安装的包

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      包名命令
      gccsudo apt-get install build-essential
      FreeTypesudo apt-get install libfreetype6-dev
      CUPSsudo apt-get install libcups2-dev
      X11sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
      ALSAsudo apt-get install libasound2-dev
      libffisudo apt-get install libffi-dev
      Autoconfsudo apt-get install autoconf
      zipsudo apt-get install zip
      +
    2. +
    3. +

      执行命令

      +
    4. +
    +
     bash configure --enable-debug --with-jvm-variants=server --with-boot-jdk=/mnt/e/jdk/jdk-16 --with-tools-dir=/mnt/d/vs/2019/Community/VC/Auxiliary/Build
    +
    +

    命令解释:

    +
    +

    –with-boot-jdk 如果找不到正确jdk,通过该命令可以手动指定
    +jdk版本必须是编译版本的前一个版本
    +jdk需与目标平台(win/linux)一致

    +
    +
    +

    –with-tools-dir 指定编译工具目录,具体指向跟编译目标有关

    +
    +
    +

    注意:win下wsl默认编译win平台jdk,如果需要编译linux版本需要进行配置

    +
    +

    build.doc

    +

    遇到的问题

    +

    win10sdk路径包含括号
    +在这里插入图片描述
    +在这里插入图片描述
    +解决:更换目录
    +移动到正常目录(括号都不行,中文就更不行了
    +创建软连接

    +
       mklink /J "C:\Program Files (x86)\Windows Kits" "D:\WindowsKits"
    +
    +

    当路径包含空格,路径会被截断。(参数是路径也会,最好是不要有空格)
    +在这里插入图片描述
    +警告
    +在这里插入图片描述
    +解决:执行

    +
    make clean
    +
    +

    错误
    +在这里插入图片描述
    +解决:手动删除jdk下build文件夹

    +

    编译成功

    +

    编译成功
    +验证jdk
    +验证jdk

    +

    ps:如果可以的话直接在linux系统下编译,就不会有这么多的路径问题

    +

    调试OpenJDK

    +

    安装clion

    +

    因为我是java使用idea,clion和它属于一家公司产品,使用方式相似,上手容易。安装过程(略)

    +

    配置clion

    +

    根据编译jdk时使用的工具链,调试时应该选择对应的工具链,否则会出现debug无效的情况

    +

    上一篇文章我虽然使用wsl环境编译jdk,但编译工具使用的是vs工具链,所以调试选择vs工具链。
    +vs工具链
    +WSL配置
    +当成普通linux服务器进行连接即可,缺什么安装什么,一般是缺失cmake,gdb。
    +wsl配置

    +

    导入项目

    +
      +
    1. 导入jdk目录
    2. +
    3. 创建CMakeLists.txt
      +简易版(能调试,大量飘红,少部分代码能跳转)
    4. +
    +
    #自己版本能用就行
    +cmake_minimum_required(VERSION 3.16)
    +project(jdk)
    +# 添加源文件
    +file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
    +# 添加执行配置
    +add_executable(hotspot ${SOURCE_FILES})
    +
    +

    复杂版(emmmm,我不会cmake,百度到的都是少了,有大佬教我吗

    +
    #自己版本能用就行
    +cmake_minimum_required(VERSION 3.16)
    +project(jdk)
    +# 添加源文件
    +file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
    +# 添加执行配置
    +add_executable(hotspot ${SOURCE_FILES})
    +
    +
      +
    1. +

      修改run configuration

      +
        +
      1. 修改executable为build/windows-x86_64-server-fastdebug/jdk/bin/java.exe
      2. +
      3. 设置参数,测试用-version,可以换成类
      4. +
      5. 删除build下before launch下的build
        +配置结果
      6. +
      +
    2. +
    +

    运行结果

    +

    断点打在src/java.base/share/native/libjli/java.c中的JavaMain函数,对c/c++不是很了解,看调用帧,这个应该是入口,下面三个点进去是汇编代码。
    +调试openjdk

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-12-05T17:00:19.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[Step.3 界面显示]]> + /computer-science/note/theme-shoka-doc/b7629dd4.html + + 2020-08-13T21:12:48.000Z + :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    首页置顶文章

    +

    在文章的Front Matter设置sticky: true,则该文章将显示在首页最上方的置顶文章列。
    +多篇文章按照发布时间倒序排列,不分页。

    +
    ---
    +title: 置顶文章
    +sticky: true
    +---
    +
    +

    首页精选分类

    +

    想要在首页显示分类翻转块,需要按照以下示例的方式,给需要显示的分类加上封面图。

    +
      +
    1. +

      首先,修改站点配置:
      +找到category_map:,配置每个分类对应的英文映射,比如:

      +
      category_map:
      +  计算机科学: computer-science
      +  Java: java
      +  C++: cpp
      +  二进制杂谈: note
      +  计算机程序设计(C++)-西安交通大学: course-1
      +  零基础学Java语言-浙江大学-翁恺: course-1
      +  面向对象程序设计-Java语言-浙江大学-翁恺: course-2
      +
      +
      +

      注意:hexo会自动处理路径中的特殊字符,~`!@#$%^&*()-_+=[]{}|\;:"'<>,.?以及空格,这些全部会被替换成-
      +所以避免在设置中使用上述字符,否则可导致无法抓取到目录下的cover.jpg

      +
      +
    2. +
    3. +

      <root>/source/_posts文件夹相应的目录里,存放封面图
      +例子:如 第1周 计算 这篇文章。
      +所处的分类是

      +
      categories:
      +- [计算机科学, Java, 零基础学Java语言-浙江大学-翁恺]
      +
      +

      现在需要在首页显示零基础学Java语言-浙江大学-翁恺这个分类,翻转卡片后,显示这个分类下的文章们。
      +而该分类经过英文映射,它的路径将是/computer-science/java/course-1/

      +

      那么,请在<root>/source/_posts/computer-science/java/course-1/的目录下放置cover.jpg文件。
      +只要分类路径对应的目录下存在cover.jpg文件,这个分类就会在首页显示。
      +在进行hexo g时,本分类的封面图会自动被复制到public目录里相应的位置。

      +
    4. +
    5. +

      事实上,为了方便文章管理,这个分类下所有文章的md文件,我都会放在<root>/source/_posts/computer-science/java/course-1/这个目录下。

      +

      且站点配置文件里,永久链接设置如下

      +
      permalink: :title/
      +
      +

      hexo g后,文章的html文件们将全部生成到<root>/public/computer-science/java/course-1/目录。
      +具体可以查看本博客的github仓库

      +
    6. +
    7. +

      文章详情界面中的系列文章,显示的是与当前文章同一分类的其他文章,并按照文章名正序排序。

      +
    8. +
    +
    +

    o(* ̄▽ ̄*)ゞ
    +其实,不设置category_map也可以,只要在分类路径对应的文件夹下存在cover.jpg文件就行。
    +现在,这项功能与category_dir的配置也无关,hexo g生成后,图片会自动被转移到category_dir的相关子目录下。

    +
    +

    文章封面图

    +
      +
    • +

      如果文章的Front Matter设置了cover: image path,则封面会显示这张图片。

      +
      title: Images
      +cover: assets/wallpaper-2572384.jpg
      +# 或者写成
      +cover: http://placehold.it/350x150.jpg
      +---
      +
      +

      这里cover的值可以是位于source目录里的图片文件,此处是<root>/source/assets/wallpaper-2572384.jpg文件,也可以是一个某网址。

      +
    • +
    • +

      如果文章是一个gallery post,即Front Matter设置了photos,则会封面会显示设置的第一张图片。

      +
      title: Gallery Post
      +photos:
      +- assets/wallpaper-2572384.jpg
      +- assets/wallpaper-2311325.jpg
      +- assets/wallpaper-878514.jpg
      +- http://placehold.it/350x150.jpg
      +---
      +
      +

      此时默认会显示第一个图片,即位于<root>/source/assets/目录里的wallpaper-2572384.jpg

      +
    • +
    • +

      如果站点配置中设置了post_asset_folder: true,那么上述本地图片路径应为<root>/source/_posts/文章同名的文件夹/assets/wallpaper-2572384.jpg,当然此时assets目录可以省掉。

      +
    • +
    • +

      如果以上设置均不存在,将显示一张随机图片,随机图库配置戳此

      +
    • +
    +

    图片展示与相册

    +

    在文章的Front Matter设置fancybox: false,可以关闭文章页的图片展示功能。
    +使用Justified-Gallery对Gallery Post内图案进行排列。

    +

    下面介绍一些小技巧:

    +
      +
    1. 让图案下方显示title的markdown代码
    2. +
    +
    ![这里是alt](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "这里是title")
    +
    +

    这里是alt

    +
      +
    1. 设置图片的大小
    2. +
    +
    ![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度和高度"){height="100px" width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度"){width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定高度"){height="100px"}
    +
    +

    {height=“100px” width=“400px”}

    +

    {width=“400px”}

    +

    {height=“100px”}

    +
      +
    1. 除了在Front Matter里配置photos可以显示相册图案列表外,还可以这样写
    2. +
    +
    ## 图案列表No.1
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclfdu6exj20zk0m87hw.jpg "这里是title")
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclflwv2aj20zk0m84qp.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclg5ms2rj20zk0m8u0x.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclhnx9glj20zk0m8npd.jpg)
    +{.gallery}
    +
    +## 图案列表No.2
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicitht3xtj20zk0m8k5v.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclil3m4ej20zk0m8tn8.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicljgocqbj20zk0m8e81.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gipetfk5zwj20zk0m8e81.jpg)
    +{.gallery data-height="120"}
    +
    +

    data-height用来设置每行的高度,默认为220

    +

    图案列表No.1

    +


    +
    +
    +
    +{.gallery}

    +

    图案列表No.2

    +


    +
    +
    +
    +{.gallery data-height=“120”}

    +

    自定义页面配色

    +

    主题配色全部在<root>/themes/shoka/source/css/_colors.styl文件中,可以自行查看。

    +

    <root>/source/_data/目录新建文件colors.styl,在此文件中添改样式。

    +
    +

    自定义colors.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    +
    +

    主题支持在<root>/source/_data/目录建立三个自定义styl文件:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    自定义文件名对应默认样式文件样式功能
    colors.styl_colors.styl页面配色
    iconfont.styl_iconfont.styl图标样式
    custom.styl-任意自定义样式
    +

    自定义主题图片

    +

    如果想要修改主题的<root>/themes/shoka/source/images/目录内的某张图片,请在<root>/source/_data/目录新建目录images,并在这个文件夹中添加++同名++文件,部署时将自动覆盖主题内的默认图片。

    +

    可以用此方法自定义头像、打赏二维码等图片,并且避免覆盖更新主题时遗失自定义文件。

    +

    自定义语言包

    +

    本功能参考NexT,主要可以用来定义菜单等处显示的文字,且可以方便主题无脑覆盖升级。

    +

    <root>/source/_data/目录新建文件languages.yml

    +

    按照以下格式添加配置项:

    +
    # language
    +zh-CN:
    +  # items
    +  post:
    +    copyright:
    +      # the translation you perfer
    +      author: 本文博主
    +en:
    +  menu:
    +    travellings: Travellings
    +
    +

    可以参考主题目录下的example/source/_data文件夹。

    +
    +

    站点配置及文件的Front Matter中,language项只支持zh-CNzh-HKzh-TWjaen
    +类似写成zh_CN这样是不可以的。

    +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-08-13T21:12:48.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[Step.2 基本配置]]> + /computer-science/note/theme-shoka-doc/85a3718.html + + 2020-08-13T20:56:48.000Z + :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    站点别称

    +
    alternate: Yume Shoka
    +
    +

    这里设置的名称代替Logo,显示在页面顶部,以及页尾©️处

    +

    静态文件目录

    +
    statics: / #//cdn.jsdelivr.net/gh/amehime/shoka@latest/
    +
    +

    默认值是/,指使用本地静态文件
    +可以修改成//cdn.jsdelivr.net/gh/您的github用户名/您的项目名@latest/这种形式,以使用jsDelivr进行加速。
    +PS:jsDelivr并不是实时更新,重新生成文件后需要耐心等待

    +
    css: css
    +js: js
    +images: images
    +
    +

    静态文件所处目录的实际目录名,这些一般不改。

    +

    夜间模式

    +
    darkmode: # true
    +
    +

    默认情况下,是否开启夜间模式取决于(优先级从高到低):

    +
      +
    1. 访客点击页面头部切换按钮的自行选择
    2. +
    3. 访客切换了浏览设备的主题色调
    4. +
    5. 您的darkmode配置项
    6. +
    +

    自动定位

    +
    auto_scroll: # false
    +
    +

    默认情况下,再次打开页面时,会自动滚动到上次浏览的位置。
    +这个选项设为false时将停用此功能。

    +

    加载动画

    +
    # 是否显示页面加载动画loading-cat
    +loader:
    +  start: true # 当初次打开页面时,显示加载动画
    +  switch: true # tab切换到其他页面时,显示加载动画
    +
    +

    tab切换后只是显示loading动画,实际并未重新加载页面

    +

    页面特效

    +

    单击页面的烟花效果配置如下

    +
    fireworks:
    +  enable: true # 是否启用
    +  color: # 烟花颜色
    +    - "rgba(255,182,185,.9)"
    +    - "rgba(250,227,217,.9)"
    +    - "rgba(187,222,214,.9)"
    +    - "rgba(138,198,209,.9)"
    +
    +

    加载谷歌字体

    +
    font:
    +  enable: true
    +  # Font options:
    +  # `external: true` will load this font family from `host` above.
    +  # `family: Times New Roman`. Without any quotes.
    +  # `size: x.x`. Use `em` as unit. Default: 1 (16px)
    +
    +  # Global font settings used for all elements inside <body>.
    +  global:
    +    external: true
    +    family: Mulish
    +    size:
    +
    +  # Font settings for alternate title.
    +  logo:
    +    external: true
    +    family: Fredericka the Great
    +    size: 3.5
    +
    +  # Font settings for site title.
    +  title:
    +    external: true
    +    family: Noto Serif JP
    +    size: 2.5
    +
    +  # Font settings for headlines (<h1> to <h6>).
    +  headings:
    +    external: true
    +    family: Noto Serif SC
    +    size:
    +
    +  # Font settings for posts.
    +  posts:
    +    external: true
    +    family:
    +
    +  # Font settings for <code> and code blocks.
    +  codes:
    +    external: true
    +    family: Inconsolata
    +
    +

    此功能基本参考NexT。
    +加粗标题的字体总是使用Noto Serif,为了正确友好的显示日文中的汉字,会先后加载headingstitle的字体设置。

    +

    iconfont图标

    +

    主题没有直接使用Font Awesome,是因为用不到那么多icon感觉非常浪费,因此在Iconfont上重新建立了一个项目。
    +font-family设为ic,所有字体样式前缀为i-,具体参见<root>/themes/shoka/source/css/_iconfont.styl

    +
    # project of https://www.iconfont.cn/
    +# //at.alicdn.com/t/font_1832207_c8i9n1ulxlt.css => 1832207_c8i9n1ulxlt
    +iconfont: "1832207_c8i9n1ulxlt"
    +
    +

    如果需要添加或修改,请留言告诉我您的Iconfont用户名,我将把您添加到目前的项目中。

    +

    添加权限为只读,此后您可以任意全选,批量保存到购物车中,添加至您自己的项目里,并将主题配置文件中的iconfont值改为您的项目。

    +

    注意,您的项目应设置FontClass/Symbol 前缀i-

    +

    <root>/source/_data/目录新建文件iconfont.styl,把新增或修改的图标样式复制到这个文件中。

    +
    +

    自定义iconfont.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    +
    +

    菜单与社交按钮

    +
    menu:
    +  home: / || home
    +  about: /about/ || user
    +  posts:
    +    default: / || feather
    +    archives: /archives/ || list-alt
    +    categories: /categories/ || th
    +    tags: /tags/ || tags
    +  # friends: /friends/ || heart
    +  # links: /links/ || magic
    +
    +social:
    +  github: https://github.com/yourname || github || "#191717"
    +  #google: https://plus.google.com/yourname || google
    +  twitter: https://twitter.com/yourname || twitter || "#00aff0"
    +  zhihu: https://www.zhihu.com/people/yourname || zhihu || "#1e88e5"
    +  music: https://music.163.com/#/user/home?id=yourid || cloud-music || "#e60026"
    +  weibo: https://weibo.com/yourname || weibo || "#ea716e"
    +  about: https://about.me/yourname || address-card || "#3b5998"
    +  #email: mailto:yourname@mail.com || envelope || "#55acd5"
    +  #facebook: https://www.facebook.com/yourname || facebook
    +  #stackoverflow: https://stackoverflow.com/yourname || stack-overflow
    +  #youtube: https://youtube.com/yourname || youtube
    +  #instagram: https://instagram.com/yourname || instagram
    +  #skype: skype:yourname?call|chat || skype
    +  #douban: https://www.douban.com/people/yourname/ || douban
    +
    +

    如上,使用||作为分隔符,依次为 链接 || 图标 || 颜色
    +注意,只需要写图标名称,如github,则会自动转换为ic i-github
    +十六进制颜色码需要""包绕。

    +

    menu 支持一级子目录,子目录设置中的第一项必须为default,用来定义父级按钮的样式。

    +

    菜单显示文字可以在语言包中定义,具体请戳这里

    +

    边栏配置

    +

    边栏可以选择在左侧,或右侧
    +修改头像文件的地址,相对于静态文件目录images中配置的路径。

    +
    sidebar:
    +  # Sidebar Position.
    +  position: left
    +  #position: right
    +  # Replace the default avatar image and set the url here.
    +  avatar: avatar.jpg
    +
    +

    可以将自己的图片放在<root>/source/_data/images/目录,甚至以同名覆盖主题内默认的头像图片,具体请戳这里

    +

    底部widgets

    +

    目前页面底部可以显示两个小部件,即随机文章最近评论

    +
    widgets:
    +  random_posts: true # 显示随机文章
    +  recent_comments: true # 显示最近评论
    +
    +

    字数及阅读时间统计

    +

    安装好hexo-symbols-count-time插件后,不需要修改站点配置文件,直接使用插件默认配置就行。

    +

    需要修改主题配置文件,找到两处cout,修改为true

    +
    # 页尾全站统计
    +footer:
    +  since: 2010
    +  count: true
    +
    +# 文章界面统计
    +post:
    +  count: true
    +
    +

    文章评论

    +

    如何获取LeanCloud的appId和appKey

    +
    valine:
    +  appId: #Your_appId
    +  appKey: #Your_appkey
    +  placeholder: ヽ(○´∀`)ノ♪ # Comment box placeholder
    +  avatar: mp # Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro
    +  pageSize: 10 # Pagination size
    +  lang: zh-CN.ts-CN
    +  visitor: true # 文章访问量统计
    +  NoRecordIP: false # 不记录IP
    +  serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
    +  powerMode: true # 默认打开评论框输入特效
    +  tagMeta:
    +    visitor: 新朋友
    +    master: 主人
    +    friend: 小伙伴
    +    investor: 金主粑粑
    +  tagColor:
    +    master: "var(--color-orange)"
    +    friend: "var(--color-aqua)"
    +    investor: "var(--color-pink)"
    +  tagMember:
    +    master:
    +      # - hash of master@email.com
    +      # - hash of master2@email.com
    +    friend:
    +      # - hash of friend@email.com
    +      # - hash of friend2@email.com
    +    investor:
    +      # - hash of investor1@email.com
    +
    +

    tag标签显示在评论者名字的后面,默认是tagMeta.visitor对应的值。
    +在tagMetatagColor中,除了visitor这个key不能修改外,其他key都可以换一换,但需要保证一致性。

    +
      tagMeta:
    +    visitor: 游客
    +    admin: 管理员
    +    waifu: 我老婆
    +  tagColor:
    +    visitor: "#855194"
    +    admin: "#a77c59"
    +    waifu: "#ed6ea0"
    +  tagMember:
    +    admin:
    +      # - hash of admin@email.com
    +    waifu:
    +      # - hash of waifu@email.com
    +
    +

    在文章Front Matter中也可以配置上述参数,访问该文章页面时,将覆盖全局配置。
    +尤其可以用来配置一个特殊的placeholder。

    +
    valine:
    +  placeholder: "1. 提问前请先仔细阅读本文档⚡\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"
    +---
    +
    +

    评论通知与管理工具建议使用这个Valine-Admin
    +注意SITE_URL需要以/结尾。

    +

    如果某一篇文章需要关闭评论功能,则在文章Front Matter中配置:

    +
    ---
    +title: 关闭评论
    +comment: false
    +---
    +
    +

    背景音乐

    +

    在主题配置文件中,设置全局播放列表。
    +在文章的 Front Matter 中,设置文章专有播放列表,访问该文章页面时,将覆盖全局配置。

    +
    audio:
    +  - https://music.163.com/song?id=1387098940
    +  - https://music.163.com/#/playlist?id=2088001742
    +  - https://www.xiami.com/collect/250830668
    +  - https://y.qq.com/n/yqq/playsquare/3535982902.html
    +
    +

    如上,可以直接使用网易云、虾米、QQ音乐的播放列表、单曲,可以同时填写多个。

    +
    audio:
    +  - title: 列表1
    +    list:
    +      - https://music.163.com/#/playlist?id=2943811283
    +      - https://music.163.com/#/playlist?id=2297706586
    +  - title: 列表2
    +    list:
    +      - https://music.163.com/#/playlist?id=2031842656
    +
    +

    如果需要自定义媒体文件,可以按照以下格式填写:

    +
    audio:
    +  - name: "曲目1"
    +    url: "播放地址"
    +    artist: "艺术家"
    +    cover: "封面"
    +    lrc: "歌词"
    +  - name: "曲目2"
    +    url: "播放地址"
    +    artist: "艺术家"
    +    cover: "封面"
    +    lrc: "歌词"
    +
    +
    audio:
    +    - title: 列表1
    +      list:
    +        - name: "曲目1"
    +          url: "播放地址"
    +          artist: "艺术家"
    +          cover: "封面"
    +          lrc: "歌词"
    +        - name: "曲目2"
    +          url: "播放地址"
    +          artist: "艺术家"
    +          cover: "封面"
    +          lrc: "歌词"
    +    - title: 列表2
    +      list:
    +        - https://music.163.com/#/playlist?id=2031842656
    +
    +

    如果要关闭当前页面的背景音乐播放器,则在文章Front Matter中配置:

    +
    ---
    +title: 关闭背景音乐
    +audio: false
    +---
    +
    +

    随机图库

    +
      +
    • +

      默认的图片列表位于<root>/themes/shoka/_images.yml中。
      +使用了渣浪图库,使用一些上传工具,比如这里
      +上传后图片的链接是http://wx4.sinaimg.cn/large/6833939bly1gicmnywqgpj20zk0m8dwx.jpg
      +只需要新一行写上- 6833939bly1gicmnywqgpj20zk0m8dwx.jpg

      +

      如果想要自定义,则在<root>/source/_data/目录新建一个images.yml文件,这个文件中的图片至少6枚,将完全覆盖默认的图片列表。

      +
    • +
    • +

      也可以直接在图片列表yml文件中,写上任意外链图片地址

      +
    • +
    +
    - https://i.loli.net/2020/10/30/qAMYEFXxJcKRsiG.gif
    +- https://i.loli.net/2020/10/30/rjdhcSgEN8COBPA.jpg
    +- https://i.loli.net/2020/10/30/HKyzSd7NI3mlBpt.jpg
    +- https://i.loli.net/2020/10/30/Y1CBXqgeokEs457.jpg
    +- https://i.loli.net/2020/10/30/Z5W6r2BSoiThHG1.jpg
    +
    +
      +
    • 也可以在主题配置文件中,设置图床API:
    • +
    +
    image_server: "https://acg.xydwz.cn/api/api.php"
    +
    +

    加载第三方组件

    +
    vendors:
    +  css:
    +    # 略略略
    +  js:
    +    # 略略略
    +
    +

    包括

    +

    –|–|–
    +pace | 加载进度条|全局
    +pjax | 页面无刷新加载|全局
    +anime | js动画效果|全局
    +algolia instantsearch| 基于algolia的站内搜索|全局
    +lazyload | 图片懒加载|全局
    +quicklink | 链接资源预加载|全局
    +fetch | 获取播放列表|全局
    +katex copy_tex|数学公式显示及复制|按需
    +fancybox | 图片放大显示及排列|按需
    +valine | 基于LeanCloud的评论系统及文章阅读次数统计|按需
    +chart | 图表显示|按需

    +

    以上文件加载全部基于jsDelivr,并对全局加载的组件进行了文件合并。
    +如果不明白啥意思,则不要轻易修改。

    +

    :::danger
    +主题版本升级的时候,可能会修改这里。
    +如果修改过主题默认_config.yml,记得更新主题时,末尾的vendors也要及时修改。
    +:::

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-08-13T20:56:48.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[Step.1 依赖插件]]> + /computer-science/note/theme-shoka-doc/d30922d5.html + + 2020-08-13T20:46:48.000Z + :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    :::warning
    +请务必将hexo-renderer-multi-markdown-it升级到最新版,目前为 0.1.5
    +:::

    +

    Theme Shoka依赖以下Hexo插件

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    插件名称npm地址功能依赖程度
    hexo-renderer-multi-markdown-it链接md文件渲染器,压缩css/js/html必需
    hexo-autoprefixer链接给生成的css文件们添加浏览器前缀必需
    hexo-algoliasearch链接站内搜索功能搜索按钮失灵
    hexo-symbols-count-time链接文章或站点字数及阅读时间统计统计没有
    hexo-feed链接生成Feed文件Feed文件没有
    +
    +

    没有正确安装以上插件的话,本主题会报错or无法正确显示or部分功能失效。
    +hexo-renderer-multi-markdown-it请注意升级到最新版

    +
    +

    安装完以上插件后,修改站点配置文件,加入相关配置。

    +

    multi-markdown-it安装与配置

    +

    安装

    +
      +
    1. +

      安装前,记得务必卸载掉默认的hexo-renderer-marked,以及别的markdown文件渲染器。

      +
      npm un hexo-renderer-marked --save
      +# 或者
      +yarn remove hexo-renderer-marked
      +
      +
    2. +
    3. +

      安装

      +
      npm i hexo-renderer-multi-markdown-it --save
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it
      +
      +
    4. +
    5. +

      如果安装缓慢,或者失败
      +如报错

      +
      ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
      +
      +

      因为有一步需要下载puppeteer里的Chromium内核,基于天朝内部网络现状,这一步能不能成功要靠科学和运气,所以为了避免安装失败,需要加上--ignore-scripts跳过Chromium内核的下载。

      +
      npm i hexo-renderer-multi-markdown-it --save --ignore-scripts
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it --ignore-scripts
      +
      +

      puppeteer主要是用来渲染mermaid流程图,只要文章中不使用mermaid就没有任何问题,如果要使用mermaid建议还是想办法完全安装。

      +
    6. +
    +

    配置

    +
      +
    1. 加入markdown配置,用来渲染md文件
    2. +
    +
    markdown:
    +  render: # 渲染器设置
    +    html: false # 过滤 HTML 标签
    +    xhtmlOut: true # 使用 '/' 来闭合单标签 (比如 <br />)。
    +    breaks: true # 转换段落里的 '\n' 到 <br>。
    +    linkify: true # 将类似 URL 的文本自动转换为链接。
    +    typographer: 
    +    quotes: '“”‘’'
    +  plugins: # markdown-it插件设置
    +    - plugin:
    +        name: markdown-it-toc-and-anchor
    +        enable: true
    +        options: # 文章目录以及锚点应用的class名称,shoka主题必须设置成这样
    +          tocClassName: 'toc'
    +          anchorClassName: 'anchor'
    +    - plugin:
    +        name: markdown-it-multimd-table
    +        enable: true
    +        options:
    +          multiline: true
    +          rowspan: true
    +          headerless: true
    +    - plugin:
    +        name: ./markdown-it-furigana
    +        enable: true
    +        options:
    +          fallbackParens: "()"
    +    - plugin:
    +        name: ./markdown-it-spoiler
    +        enable: true
    +        options:
    +          title: "你知道得太多了"
    +
    +
      +
    1. 加入minify配置,压缩css/js/html
    2. +
    +
    minify:
    +  html:
    +    enable: true
    +    exclude: # 排除hexo-feed用到的模板文件
    +      - '**/json.ejs'
    +      - '**/atom.ejs'
    +      - '**/rss.ejs'
    +  css:
    +    enable: true
    +    exclude:
    +      - '**/*.min.css'
    +  js:
    +    enable: true
    +    mangle:
    +      toplevel: true
    +    output:
    +    compress:
    +    exclude:
    +      - '**/*.min.js'
    +
    +
      +
    1. 停用默认代码高亮功能,否则代码块的mac样式不能正常显示。
      +找到highlightprismjs,把enable改成false
    2. +
    +
    highlight:
    +  enable: false
    +
    +prismjs:
    +  enable: false
    +
    +

    autoprefixer配置建议

    +
    autoprefixer:
    +  exclude:
    +    - '*.min.css'
    +
    +

    缺少这个插件,首页卡片翻转效果在部分浏览器中无法正确显示。

    +

    algolia配置建议

    +
    algolia:
    +  appId: #Your appId
    +  apiKey: #Your apiKey
    +  adminApiKey: #Your adminApiKey
    +  chunkSize: 5000
    +  indexName: #"shoka"
    +  fields:
    +    - title #必须配置
    +    - path #必须配置
    +    - categories #推荐配置
    +    - content:strip:truncate,0,2000
    +    - gallery
    +    - photos
    +    - tags
    +
    +

    feed配置建议

    +
    keywords: #站点关键词,用“,”分隔
    +
    +feed:
    +    limit: 20
    +    order_by: "-date"
    +    tag_dir: false
    +    category_dir: false
    +    rss:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/rss.ejs"
    +        output: "rss.xml"
    +    atom:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/atom.ejs"
    +        output: "atom.xml"
    +    jsonFeed:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/json.ejs"
    +        output: "feed.json"
    +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-08-13T20:46:48.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[Hexo主题Shoka & multi-markdown-it渲染器使用说明]]> + /computer-science/note/79abcd0d.html + + 2020-08-13T20:45:48.000Z + :::info
    +跳票N久终于更新的简单的使用说明

    + +

    已经支持hexo 5。
    +:::

    +

    :::info
    +因博主被学业和工作掏空,本项目已停滞更新大半年,问题也无法及时回复大家,这个悲惨状态可能还要持续半年的样子。

    +

    有很多热心小伙伴在评论区或者项目issue帮忙回答问题,非常非常感谢!

    +

    本项目是完全开源的,也有做一些example示例,大家可以随便拿随便改。
    +但是很抱歉,博主我暂时不能提供更多的支持,这个写的乱七八糟的文档,暂时也没有时间把它写得更专业一些。
    +非常对不住大家!

    +

    iconfont的添加申请,我看到留言后会尽快加上,希望各位小伙伴能看到。
    +:::

    +

    :::warning
    +当前版本更新至 0.2.5,更新记录点此

    +

    :::

    +

    :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    设计缘由

    +

    前几年在Bear和Evernote上整理了大量笔记,非常喜欢Bear默认的markdown渲染样式。
    +后来因为换了安卓手机,用不了Bear,四处搜寻替代品,没有满意的。
    +然后阴差阳错知道了Hexo,又得知Github也可以免费建私有仓库了,故再次转移阵地到了自建博客,并部署在Github Pages。

    +

    因为这个博客是用来记笔记的,故起名书架
    +对应的主题即Theme.Shoka,可以说是为了笔记阅读而生的主题。
    +样式严重参考Bear,部分代码严重参考NexT

    +

    Hexo的默认及常用渲染器均使用highlight.js进行代码高亮,而我喜欢Prism.js,故重写了一个渲染器配合主题食用。
    +渲染器取名multi,因为集成了很多很多很多markdown-it插件,以及压缩静态文件的功能。
    +(最新版的默认渲染器也支持Prism.js了,可喜可贺,但不想用,哈哈哈哈哈哈哈

    +

    墙内Github Pages访问速度时而感人,所以用了jsDelivr加速,主要是因为它可以按需合并依赖文件。

    +

    快速安装

    +
    # cd your-blog
    +git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka
    +
    +

    打开主题目录,内有example文件夹,提供了配置文件的demo供参考。

    +

    安装依赖插件

    +

    在应用主题之前,必须至少安装 hexo-renderer-multi-markdown-it 渲染插件 和 hexo-autoprefixer

    +

    插件安装与配置教程戳此

    +

    应用主题

    +

    修改站点配置

    +

    修改站点配置文件<root>/_config.yml,把主题改为 shoka

    +
    theme: shoka
    +
    +

    修改主题配置

    +

    主题配置的所有参数在<root>/themes/shoka/_config.yml文件中。

    +

    为了方便主题升级,请在根目录新建一个yml文件,命名为_config.shoka.yml
    +也就是说,所有主题的自定义配置均保存于<root>/_config.shoka.yml文件。

    +

    主题的基础配置可以参考这里
    +界面显示相关的配置参考这里

    +

    更新记录

    +

    标签含义:
    +❗ 需要手动操作的更新信息
    +⚠️ 需要注意的更新信息
    +🔧 已修复的问题
    +⌛ TODO

    +

    0.2.4 👉 0.2.5

    +

    💡 避免直接修改主题文件,添加各种自定义:

    + +

    🔧 修复一些BUG

    +

    0.2.3 👉 0.2.4

    +

    ⚠️ 评论功能更新

    +
      +
    • MiniValine魔改版更新至beta10,修改过主题默认_config.yml的同学,记得更新末尾的vendors到最新哦
    • +
    • ❗ 评论相关的配置有更新,配置戳此 +
        +
      • 主要增加的Tag配置,现在可以各种自定义啦
      • +
      +
    • +
    +

    ⚠️ 配置新增

    + +

    ⚠️ 背景音乐功能增强,配置戳此

    +
      +
    • 可以添加多个播放列表
    • +
    • 加了一些控制按钮
    • +
    +

    ⚠️ 增加media标签,在文章中插入音频和视频播放列表,方法戳此
    +⌛ 视频播放器有待增强(显示分段标签,字幕)

    +

    🔧 随机图库支持非渣浪图床的任意图片
    +🔧 还有许多小BUG

    +

    0.2.2 👉 0.2.3

    +

    ❗ 增加主题文件外自定义语言包的功能,配置戳此
    +🔧 提高低版本浏览器兼容性

    +

    0.2.1 👉 0.2.2

    +

    ⚠️ 弃用mediumzoom,改成fancybox配置戳此
    +💡 增加语言包:繁体中文日语
    +💡 quiz功能优化,根据语言显示题型标签
    +🔧 修复评论功能中反复初始化leancloud-storage
    +🔧 修复audio: false时不能隐藏播放按钮、停止播放

    +

    0.2 👉 0.2.1

    +

    ⚠️ 配置文件添加 loader 参数,配置戳此
    +💡 二级list区别显示
    +🔧 修复浏览位置定位BUG
    +🔧 修复firework动画延迟
    +🔧 优化评论功能

    +

    0.1.9 👉 0.2

    +

    ⚠️ 评论功能大改

    +
      +
    • 弃用不开源的Valine,改用MiniValine,并且进行了魔改,项目戳此
      +主要是大量压缩了代码,弃用一些花里胡哨的功能,又加了一些别的花里胡哨的功能。
    • +
    • 为防止泄露用户邮箱、IP等隐私信息,弃用QQ号获取昵称及头像。
      +❗ 同时需要手动进行一些迁移,具体步骤戳此
    • +
    • ❗ 评论相关的配置亦有更新,配置戳此
    • +
    +

    ⚠️ 增加单击页面烟花效果,配置戳此
    +💡 弃用Velocity,改用anime.js,方便未来添加更多!!花里胡哨的!!功能!!严重拖慢页面滑行速度!!
    +🔧 新增多枚icon,包括豆瓣i-douban
    +🔧 一些显示问题

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-08-13T20:45:48.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF]]]> + /8612fa7f/47867b98/Java/c82dcf86.html + + 2020-07-29T21:54:35.000Z + 动漫美图

    + + +

    前言

    +

      今天做了一个自动打卡工具,准备搭建邮件服务,反馈打卡结果。使用的邮箱是yandex mail。出现Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF],记录一下。

    +

    邮箱准备

    +

      使用邮箱没有要求,支持smtp就行

    +

    注册邮箱

    +

    yandex mail注册地址

    +

    登录邮箱

    +

      登录邮箱后可能会提示开启smtp。

    +

    这里是官方提供打开smtp的文档,还记录了端口号。
    +官方文档表示端口是465

    +

    启用smtp

    +

      邮箱首页右上角的齿轮>security> Email clients>
    +smtp启用页面
    +这里我使用outlook测试了连接,使用的端口是465,附连接成功图。

    +

    连接成功图

    +

    邮件协议

    +

    SMTP 协议

    +

    SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。提供了SSL加密的SMTP协议被称为SMTPS,SMTP使用TCP端口25,SMTPS使用TCP端口465

    +

    POP3 协议

    +

    POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S,POP3 默认端口110,POP3S默认端口995

    +

    IMAP 协议

    +

    IMAP(Internet Mail Access Protocol)以前称作交互邮件访问协议(Interactive Mail Access Protocol),是一个应用层协议。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作,提供了SSL加密的IMAP协议被称为IMAP S,POP3 默认端口143,POP3S默认端口993

    +

    搭建步骤及简单使用

    +

    mail依赖

    +

    build.gradl文件

    +
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.3.2.RELEASE'
    +
    +

    yml配置文件

    +
    server:
    +  port: 80
    +logging:
    +  level:
    +    web: debug
    +spring:
    +  mail:
    +    default-encoding: UTF-8
    +    host: smtp.yandex.com
    +    username: xxx@xxx.xx
    +    password: 123456
    +    port: 25 #smtp协议使用25端口 
    +#    port: 465 #smtps使用465端口,不然报错。
    +    protocol: smtp #指定协议
    +    test-connection: true
    +    properties:
    +      mail:
    +        smtp:
    +          auth: true # 使用
    +          starttls: # 使用 SSL 安全协议,须如下配置
    +            enable: true
    +            required: true
    +
    +

    java代码

    +
    MailService 接口文件
    +
    public interface MailService {
    +
    +    /**
    +     * 发送纯文本邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     */
    +    void sendTextMail(String toAddr, String title, String content);
    +
    +    /**
    +     * 发送 html 邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容(HTML)
    +     */
    +    void sendHtmlMail(String toAddr, String title, String content);
    +
    +    /**
    +     *  发送待附件的邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     * @param filePath 附件地址
    +     */
    +    void sendAttachmentsMail(String toAddr, String title, String content, String filePath);
    +
    +    /**
    +     *  发送文本中有静态资源(图片)的邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     * @param rscPath 资源路径
    +     * @param rscId 资源id (可能有多个图片)
    +     */
    +    void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId);
    +
    +}
    +
    +
    MailServiceImpl文件
    +
    @Component
    +public class MailServiceImpl implements MailService {
    +
    +    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    +
    +    private final JavaMailSender mailSender;
    +
    +    /**
    +     * 注入常量
    +     */
    +
    +    @Value("${spring.mail.username}")
    +    private String from;
    +
    +    public MailServiceImpl(JavaMailSender mailSender) {
    +        this.mailSender = mailSender;
    +    }
    +
    +    /**
    +     * 发送文本邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容
    +     */
    +    @Override
    +    public void sendTextMail(String toAddr, String title, String content) {
    +        // 纯文本邮件对象
    +        SimpleMailMessage message = new SimpleMailMessage();
    +        message.setFrom(from);
    +        message.setTo(toAddr);
    +        message.setSubject(title);
    +        message.setText(content);
    +
    +        try {
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("Text邮件已经发送。");
    +            }
    +        } catch (Exception e) {
    +            logger.error("发送Text邮件时发生异常!", e);
    +        }
    +
    +    }
    +    
    +    /**
    +     * 发送 html 邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容(HTML)
    +     */
    +    @Override
    +    public void sendHtmlMail(String toAddr, String title, String content) {
    +        // html 邮件对象
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            //true表示需要创建一个multipart message
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("html邮件发送成功");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送html邮件时发生异常!", e);
    +        }
    +    }
    +
    +
    +    /**
    +     * 发送待附件的邮件
    +     *
    +     * @param toAddr   收件人
    +     * @param title    标题
    +     * @param content  内容
    +     * @param filePath 附件地址
    +     */
    +    @Override
    +    public void sendAttachmentsMail(String toAddr, String title, String content, String filePath) {
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            FileSystemResource file = new FileSystemResource(new File(filePath));
    +            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
    +            helper.addAttachment(fileName, file);
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("带附件的邮件已经发送。");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送带附件的邮件时发生异常!", e);
    +        }
    +    }
    +
    +
    +    /**
    +     * 发送文本中有静态资源(图片)的邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容
    +     * @param rscPath 资源路径
    +     * @param rscId   资源id (可能有多个图片)
    +     */
    +    @Override
    +    public void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId) {
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            FileSystemResource res = new FileSystemResource(new File(rscPath));
    +            helper.addInline(rscId, res);
    +
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("嵌入静态资源的邮件已经发送。");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送嵌入静态资源的邮件时发生异常!", e);
    +        }
    +    }
    +}
    +
    +
    测试类
    +
    @SpringBootTest
    +class ClockInApplicationTests {
    +    @Autowired
    +    MailService mailService;
    +    @Test
    +    void sendTextMail(){
    +        mailService.sendTextMail("vlnrjp92486@chacuo.net","单元测试","测试邮件发送");
    +    }
    +}
    +
    +

    运行结果

    +

    如标题所述,出现了异常
    +异常图
    +使用协议对应端口后发送成功,附图。
    +单元测试通过

    +

    结语

    +

      通过这个实践,我觉要写代码前还是要做很多准备,或者说我了解的东西不过全面。出错后百度异常信息怎么都找不到,想着哪里出错了,之前使用outlook连接测试通过,应该就是代码问题。后来看到很多人使用25端口发送,然后去百度端口才发现协议与端口不一致。所以我觉得写代码前的准备不充分或者知识储备不足,这个重要信息都不了解。

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-07-29T21:54:35.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[Android逆向工程:使用Apktool反编译小米便签]]> + /8612fa7f/e00fc567/5ac6f809/aa3015f4.html + + 2020-06-04T10:54:35.000Z + 动漫美图

    + + +

    记录一次安卓反编译过程

    +

    下周就要安卓课设,而我的课设作业是开发一个记事本,我发现我小米手机上的便签挺好的,于是想参考一下布局以及实现。

    + + + + + + + + + + + + + + + + + +
    软件apktooldex2jarjd-jui
    版本2.4.12.10.3.5
    +

    准备工作

    +
      +
    1. +

      获取小米便签
      +网上没有最新版下载,通过Es文件浏览器导出apk。
      +也可以通过mt浏览器,因为后面需要三个framework文件,Es浏览器和Re浏览器好像屏蔽了根目录,不能访问了。

      +
    2. +
    3. +

      下载反编译相关工具
      +菜鸟教程三个工具,版本低,

      +
    4. +
    5. +

      我使用的三个工具 密码:7uyi

      +
    6. +
    +

    开始反编译

    +
    apktool.bat d base.apk
    +
    +

    Could not decode arsc file

    +

    这个是由于apktool版本低导致的,下载最新的重命名为apktool.jar替换即可
    +更新最新apktool后再次执行命令,还是失败,错误信息如下:

    +
    W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=id, value=0x100b0001
    +W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=, name=layout, value=0x10030009
    +W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
    +W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d008f
    +W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=height, value=0x100a0003
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=width, value=0x100a0003
    +I: Decoding values */* XMLs...
    +Can't find framework resources for package of id: 16. You must install proper framework files, see project website for more info.
    +
    +

    查看一下反编译结果,发现资源以及提取出来,但是没有任何代码。
    +百度了最后一句话发现,有些应用需要提供额外框架,具体信息可以查看一下博文Android逆向工程:解决针对小米系统应用,使用Apktool反编译失败问题!

    +

    根据博文我提取了文章中提到的framework-res.apk,framework-ext-res.apk,miui.apk。
    +文件列表

    +

    执行一下命令安装:

    +
    apktool if framework-res.apk
    +apktool if framework-ext-res.apk
    +apktool if miui.apk
    +
    +

    安装完成后发现缺少的16号对应framework-ext-res.apk

    +

    缺少的16号

    +

    再次执行 apktool.bat d base.apk 后发现还有问题,提示缺少了id为18的框架文件

    +

    缺少了id为18的框架文件

    +

    我有点头疼,我怎么知道18号是什么文件,于是尝试导入其他文件,搜索framework,找到了一个名为XiaomiServiceFramework.apk的文件,并进行安装;

    +

    apktool if XiaomiServiceFramework.apk

    +

    根据上图,我发现这个文件不是我们需要的,但它提供了一个信息:
    +++I: Decoding Shared Library (miui.system), pkgId: 18++
    +于是我去搜索system,经过筛选找到miuisystem.apk,进行安装,发现他就是我们需要的18号:

    +

    apktool if miuisystem.apk
    +再次反编译没有报错,查看文件发现Smali代码成功获取:

    +

    成功截图

    +

    反编译到此结束,会smali语法的大佬已经可以阅读代码了,不会的可以使用工具转java再阅读

    +

    使用dex2jar将dex转成jar

    +
      +
    1. 将base.apk当成压缩包打开
    2. +
    3. 提取 classes.dex,classes2.dex
      +执行命令:
    4. +
    +
    d2j-dex2jar.bat classes.dex
    +d2j-dex2jar.bat classes2.dex
    +
    +

    d2j-dex2jar.bat classes.dex
    +这个也是版本低导致的,下载最新的就可以了
    +再次执行,出了新问题,我之前没遇到

    +
    C:\Users\dyt\Desktop\dex-tools-2.1-SNAPSHOT>d2j-dex2jar.bat classes.dex
    +dex2jar classes.dex -> .\classes-dex2jar.jar
    +Detail Error Information in File .\classes-error.zip
    +Please report this file to one of following link if possible (any one).
    +    https://sourceforge.net/p/dex2jar/tickets/
    +    https://bitbucket.org/pxb1988/dex2jar/issues
    +    https://github.com/pxb1988/dex2jar/issues [no attachment support, not preferred]
    +    dex2jar@googlegroups.com
    +
    +

    换了一个多了后缀的2.1版本,成功解决,但我不记得在哪下的了

    +

    成功获取jar

    +

    获取的jar

    +

    使用jd-gui查看

    +

    这个就是软件使用了,跟一般软件没区别,将jar包拖到jd-gui.exe就行了,不多说,自己体会。

    +

    使用截图

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-06-04T10:54:35.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[Failed to resolve: androidx.appcompat:appcompat:1.1.0]]> + /8612fa7f/e00fc567/5ac6f809/c4877271.html + + 2020-05-09T10:54:35.000Z + 动漫美图

    + + +

    安卓实验–内容提供器

    +

    日常踩雷

    +
    新建了一个空activity项目
    +
    +
    ERROR: Failed to resolve: androidx.appcompat:appcompat:1.1.0
    +ERROR: Failed to resolve: androidx.test.ext:junit:1.1.1
    +ERROR: Failed to resolve: androidx.test.espresso:espresso-core:3.2.0
    +ERROR: Failed to resolve: androidx.constraintlayout:constraintlayout:1.1.3
    +
    +

    init.gradle

    +

    感觉有毒,成功了,依赖还是未解决,清除缓存重启无效!
    +有毒

    +

    删除init.gradle后,成功解决,好吧,估计问题在镜像仓库,也可能是这个配置问题,以后还是老老实实用官方源吧,虽然费时间。但出错率低。
    +  这是我的init.gradle,路径为C:\Users\{username}\.gradle,建立这个文件的目的是加速依赖下载,现在看来反而是累赘,以前用着正常,现在不能用了也不知道是什么原因。

    +
    allprojects{
    +    repositories {
    +        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
    +        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
    +        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
    +        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
    +        all { ArtifactRepository repo ->
    +            if(repo instanceof MavenArtifactRepository){
    +                def url = repo.url.toString()
    +                if (url.startsWith('https://repo1.maven.org/maven2')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
    +                    remove repo
    +                }
    +                if (url.startsWith('https://jcenter.bintray.com/')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
    +                    remove repo
    +                }
    +if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
    +                    remove repo
    +                }
    +                if (url.startsWith('https://plugins.gradle.org/m2/')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
    +                    remove repo
    +                }
    +            }
    +        }
    +        maven {
    +                url ALIYUN_REPOSITORY_URL
    +                url ALIYUN_JCENTER_URL
    +	url ALIYUN_GOOGLE_URL 
    + 	url ALIYUN_GRADLE_PLUGIN_URL 
    +
    +        }
    +    }
    +}
    +
    +

    image.png

    +

    问题解决了,开工干活

    +

    实验目的

    +

    1、掌握运行时权限使用
    +2、掌握访问其他应用程序的数据

    +

    实验内容

    +

    1.实现拨打电话功能
    +2.访问通讯录

    +

    实验仪器

    +

    1)PC机最低配置:2G Hz以上双核CPU,2G以上内存
    +2)Windows 32位或64位操作系统
    +3)Android Studio 2.2及以上版本

    +

    实验主要步骤

    +

    1)创建实验项目:选择Empty Activity
    +2)编写布局文件;

    +

    activity_main.xml

    +
    <?xml version="1.0" encoding="utf-8"?>
    +<androidx.constraintlayout.widget.ConstraintLayout
    +        xmlns:android="http://schemas.android.com/apk/res/android"
    +        xmlns:tools="http://schemas.android.com/tools"
    +        xmlns:app="http://schemas.android.com/apk/res-auto"
    +        android:layout_width="match_parent"
    +        android:layout_height="match_parent"
    +        tools:context=".MainActivity">
    +
    +    <ListView
    +            android:id="@+id/list"
    +            android:layout_width="match_parent"
    +            android:layout_height="match_parent"
    +            app:layout_constraintBottom_toBottomOf="parent"
    +            app:layout_constraintLeft_toLeftOf="parent"
    +            app:layout_constraintRight_toRightOf="parent"
    +            app:layout_constraintTop_toTopOf="parent"/>
    +
    +</androidx.constraintlayout.widget.ConstraintLayout>
    +
    +

    list_item.xml

    +
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    +              xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal"
    +              android:layout_width="match_parent"
    +              android:layout_height="wrap_content"
    +              android:layout_margin="20dp"
    +              android:padding="5dp">
    +
    +    <ImageView
    +            android:contentDescription="@string/icon"
    +            android:src="@mipmap/kyzja1gl2m4"
    +            android:id="@+id/image_photo"
    +            android:layout_width="70dp"
    +            android:layout_height="70dp" />
    +    <LinearLayout
    +            android:layout_weight="1"
    +            android:layout_width="0dp"
    +            android:layout_height="70dp"
    +            android:orientation="vertical"
    +            android:layout_marginRight="15dp"
    +            android:layout_marginLeft="15dp">
    +
    +        <TextView
    +                android:id="@+id/name"
    +                android:layout_width="match_parent"
    +                android:layout_weight="1"
    +                android:layout_height="match_parent"
    +                android:text="@string/name"
    +                android:textStyle="bold"
    +                android:textColor="#000"
    +                android:textSize="20sp" tools:ignore="NestedWeights"/>
    +        <TextView
    +                android:id="@+id/phone"
    +                android:layout_weight="1"
    +                android:layout_height="match_parent"
    +                android:layout_width="match_parent"
    +                android:text="@string/phone"
    +                android:textStyle="bold"
    +                android:textColor="#666"
    +                android:textSize="20sp" />
    +    </LinearLayout>
    +    <Button
    +            android:layout_width="70dp"
    +            android:layout_height="70dp"
    +            android:id="@+id/call"
    +            android:text="@string/call"
    +    />
    +</LinearLayout>
    +
    +

    3)编写Activity类,单击查询通讯录信息,申请运行时权限

    +

    MainActivity

    +
    package tk.dragondyt.study6;
    +import android.Manifest;
    +import android.content.pm.PackageManager;
    +import android.database.Cursor;
    +import android.os.Bundle;
    +import android.provider.ContactsContract;
    +import android.util.Log;
    +import android.widget.ListView;
    +import android.widget.Toast;
    +import androidx.annotation.NonNull;
    +import androidx.appcompat.app.AppCompatActivity;
    +import androidx.core.app.ActivityCompat;
    +import androidx.core.content.ContextCompat;
    +import java.util.ArrayList;
    +import java.util.List;
    +/**
    + * @author dyt
    + */
    +public class MainActivity extends AppCompatActivity {
    +    final String TAG = "MainActivity";
    +    ContactPersonAdapter adapter;
    +    List<Person> contactsList = new ArrayList<>();
    +    @Override
    +    protected void onCreate(Bundle savedInstanceState) {
    +        super.onCreate(savedInstanceState);
    +        setContentView(R.layout.activity_main);
    +        ListView listView = findViewById(R.id.list);
    +        adapter = new ContactPersonAdapter(this,getLayoutInflater(),contactsList);
    +        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    +            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
    +        } else {
    +            readContacts();
    +        }
    +        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    +            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 100);
    +        }
    +        listView.setAdapter(adapter);
    +
    +    }
    +    private void readContacts() {
    +        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    +                null, null, null, null)) {
    +            if (cursor != null) {
    +                while (cursor.moveToNext()) {
    +                    String name = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    +                    String phone = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.NUMBER));
    +                    contactsList.add(new Person(name,phone));
    +                }
    +                adapter.notifyDataSetChanged();
    +            }
    +        } catch (Exception e) {
    +            Log.d(TAG, "readContacts: "+e.getMessage());
    +        }
    +    }
    +    @Override
    +    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantsResults) {
    +        if (requestCode == 1) {
    +            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
    +                readContacts();
    +            } else {
    +                Toast.makeText(this, "请授予访问通讯录权限", Toast.LENGTH_SHORT).show();
    +            }
    +        }
    +        if (requestCode==100){
    +            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
    +                readContacts();
    +            } else {
    +                Toast.makeText(this, "请授予拨打电话权限", Toast.LENGTH_SHORT).show();
    +            }
    +        }
    +    }
    +}
    +
    +
    +

    4)通过通讯录应用程序提供的内容提供器查询其数据

    +
    private void readContacts() {
    +        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    +                null, null, null, null)) {
    +            if (cursor != null) {
    +                while (cursor.moveToNext()) {
    +                    String name = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    +                    String phone = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.NUMBER));
    +                    contactsList.add(new Person(name,phone));
    +                }
    +                adapter.notifyDataSetChanged();
    +            }
    +        } catch (Exception e) {
    +            Log.d(TAG, "readContacts: "+e.getMessage());
    +        }
    +    }
    +
    +

    5)编写ListView展示通讯录方法,把查询到的数据展示在页面

    +

    ContactPersonAdapter

    +
    package tk.dragondyt.study6;
    +
    +import android.annotation.SuppressLint;
    +import android.content.Context;
    +import android.content.Intent;
    +import android.net.Uri;
    +import android.view.LayoutInflater;
    +import android.view.View;
    +import android.view.ViewGroup;
    +import android.widget.BaseAdapter;
    +import android.widget.Button;
    +import android.widget.TextView;
    +
    +import java.util.List;
    +
    +/**
    + * @author dyt
    + */
    +public class ContactPersonAdapter extends BaseAdapter {
    +
    +    /**定义数据*/
    +    private final List<Person> mData;
    +    /**定义Inflater,加载我们自定义的布局。*/
    +    private final LayoutInflater mInflater;
    +    private final Context context;
    +
    +  /**
    +    定义构造器,在Activity创建对象Adapter的时候将数据data和Inflater传入自定义的Adapter中进行处理。
    +    */
    +    public ContactPersonAdapter(Context context,LayoutInflater inflater, List<Person> data){
    +        mInflater = inflater;
    +        mData = data;
    +        this.context = context;
    +    }
    +
    +    @Override
    +    public int getCount() {
    +        return mData.size();
    +    }
    +
    +    @Override
    +    public Object getItem(int position) {
    +        return position;
    +    }
    +
    +    @Override
    +    public long getItemId(int position) {
    +        return position;
    +    }
    +
    +    @Override
    +    public View getView(int position, View view, ViewGroup viewGroup) {
    +        @SuppressLint("ViewHolder")
    +        View item = mInflater.inflate(R.layout.list_item,null);
    +        Person person = mData.get(position);
    +        TextView name = item.findViewById(R.id.name);
    +        TextView phone = item.findViewById(R.id.phone);
    +        Button call = item.findViewById(R.id.call);
    +        call.setOnClickListener((v)->{
    +            Intent intentCall =  new Intent();
    +            intentCall.setAction(Intent.ACTION_CALL);
    +            intentCall.setData(Uri.parse("tel:" + person.getPhone()));
    +            context.startActivity(intentCall);
    +        });
    +        name.setText(person.name);
    +        phone.setText(person.phone);
    +         return item ;
    +    }
    +}
    +
    +

    Person

    +
    package tk.dragondyt.study6;
    +
    +/**
    + * @author dyt
    + */
    +public class Person {
    +    String name;
    +    String phone;
    +
    +    public Person(String name, String phone) {
    +        this.name = name;
    +        this.phone = phone;
    +    }
    +
    +    public String getName() {
    +        return name;
    +    }
    +
    +    public void setName(String name) {
    +        this.name = name;
    +    }
    +
    +    public String getPhone() {
    +        return phone;
    +    }
    +
    +    public void setPhone(String phone) {
    +        this.phone = phone;
    +    }
    +
    +    @Override
    +    public String toString() {
    +        return "Person{" +
    +                "name='" + name + '\'' +
    +                ", phone='" + phone + '\'' +
    +                '}';
    +    }
    +}
    +
    +
    +

    最后附上截图,最讨厌没图的教程。

    +

    运行截图

    +

    实验源码

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-05-09T10:54:35.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[AAPT: error: resource android:attr/fontVariationSettings not found]]> + /8612fa7f/47867b98/Flutter/74684463.html + + 2020-05-09T10:54:35.000Z + 动漫美图

    + + +

    心累,每天都是“惊喜”,我太菜了

    +

    环境
    +开发工具 idea

    +
    flutter doctor
    +
    +D:\Android\flutter\bin\flutter.bat doctor --verbose
    +[√] Flutter (Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.18363.815], locale zh-CN)
    +    • Flutter version 1.17.0 at D:\Android\flutter
    +    • Framework revision e6b34c2b5c (7 days ago), 2020-05-02 11:39:18 -0700
    +    • Engine revision 540786dd51
    +    • Dart version 2.8.1
    +
    +[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    +    • Android SDK at D:\Android\android-sdk
    +    • Platform android-29, build-tools 29.0.3
    +    • ANDROID_HOME = D:\Android\android-sdk
    +    • Java binary at: D:\Program Files\Java\jdk1.8.0_241\bin\java
    +    • Java version Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
    +    • All Android licenses accepted.
    +
    +[!] Android Studio (not installed)
    +    • Android Studio not found; download from https://developer.android.com/studio/index.html
    +      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).
    +
    +[√] Connected device (1 available)
    +    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26) (emulator)
    +
    +! Doctor found issues in 1 category.
    +Process finished with exit code 0
    +
    +

    Could not find androidx.lifecycle:lifecycle-common:2.2.0,lifecycle-common-java8:2.2.0,lifecycle-runtime:2.2.0,androidx.fragment:fragment:1.1.0.,androidx.annotation:annotation:1.1.0.
    +解决方法:

    +
    allprojects {
    +    repositories {
    +        google() 
    +        jcenter()
    +        maven { url "https://maven.google.com" }//感觉google()是假的,这里我用了阿里云镜像,可能没同步吧。
    +    }
    +}
    +
    +

    .gradleachesransforms-1iles-1.1ore-1.1.0.aarb817d4a7e2a888884c999547cadccefesaluesalues.xml:7:5-70: AAPT: error: resource android:attr/fontVariationSettings not found.AAPT: error: resource android:attr/ttcIndex not found

    +

    stackoverflow上解决方法

    +

    解决方法:
    +修改app下的build.gradle文件

    +
    android {
    +    compileSdkVersion 28
    +    defaultConfig {
    +	...
    +        targetSdkVersion 28
    +	...
    +    }
    +    ...
    +}
    +
    +

    stackoverflow真是个好东西,可惜要翻墙,感想上面的大神。
    +不写了,累,这种资料网站都要墙,真是丧心病狂,什么时候能不用镜像站。构建工具再好,巧妇难为无米之炊啊

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-05-09T10:54:35.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[信息检索-绪论]]> + /8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html + + 2020-05-06T21:55:57.000Z + 动漫美图

    + + +

    信息与文献基本知识

    +

      未来学家托天勒把人类社会的发展过程划分为3个阶段:以农业经济为基础的农业社会;以工业经济为基础的工业社会;以信息经济为基础的信息社会。在信息社会中,信息资源已被人们公认为是物质、能量资源之后的人类可利用的第三类资源,是人类社会领域的基础性资源。

    +

    从信息到文献

    +

    信息(Information)

    +

      美国数学家、控制论的主要奠基人维纳在1950年出版的《控制论与社会》中是这样来理解信息的:“人通过感觉器官感知周围世界”,“我们支配环境的命令就是给环境的一种信息”,因此,“信息就是我们在适应外部世界,并把这种适应反作用于外部世界的过程中,同外部世界进行交换的内容的名称”。

    +
    信息的定义:
    +

      中国国家标准《情报与文献工作词汇一一基本术语》 (GB/T4894-1985)中信息的定义为:信息是物质存在的一种方式、形态或运动状态,也是事物的一种普遍属性,一般指数据、消息中所包含的意义,可以使消息中所描述事件的不确定性减少。

    +
    信息的基本属性:
    +

    (1)客观性。
    +(2)传递性。
    +(3)多态性。
    +(4)共享性。
    +(5)时效性。
    +(6)价值相对性。
    +(7)依附性。
    +(8)增长性。

    +

    知识(Knowledge)

    +

      知识是人们在改造世界的实践中所获得的认识和经验的总和,是对客观世界物质形态和运动规律的认识。根据韦伯斯特(Webster)词典1997年的定义,知识是通过实践、研究、联系或调查获得的关于事物的事实和状态的认识,是对科学、艺术或技术的理解,是人类获得的关于真理和原理的认识的总和。

    +
    知识的定义
    +
      +
    • 从信息的观念看,知识来源于信息,是信息的一部分。简而言之,知识是理性化、优化、系统化了的信息。
    • +
    • 从反映的内容而言,知识是客观事物的属性与联系的反映,是客观世界在人脑中的相对正确的反映。
    • +
    • 从反映的活动形式而言,知识有时表现为主体对事物的感性知觉或表象,属于感性知识,有时表现为关于事物的概念或规律,属于理性知识。
    • +
    +

    情报(Intelligence)

    +

      情报是作为交流对象的有用的知识。“情报 是判断、意志、决心、行动需要的能指引方向的知识和智慧”;“情报是解决问题所需要的知识”;“情报是激活 了的知识”情报的基本属性是知识性、传递性和效用性。

    +
    情报的基本属性
    +

    (1) 知识性。一般而言,情报是一种新的知识。然而称为情报的知识
    +并不排斥时间上的“不新”。这就是说,凡原先不知道的(不论时间多久),而现在又迫切需要的知识,都属于“新”的知识。
    +(2) 传递性。情报传递的过程包括从情报源进行收集到向用户提供情报的全过程。无论多高深、渊博、新奇的知识,如果不记录、不传递、不交流,都不能称为情报。
    +(3) 效用性(判断的标准)。情报是一种有价值、有效用的知识。情报均须“有用”,当用户不需要时,百分之百的知识也不能把它称之为情报

    +

    文献(Literature/Document)

    +

      国家标准《文献著录总则》(GB/T3792. 1-1983)给出的定义为:“文献是记录有知识的一切载体。”国家标准化组织IS0在《文献情报术语国际标准》(IS0/DIS5217)给出的定义是:“为了把人类知识传播开来和继承下去,人们用文字、图形、符号、音频、视频等手段将其记录下来,或写在纸上,或晒在蓝图上,或制在感光片上,或录到唱片上,或存储在磁盘上。这种附着在各种载体上的记录统称为文献。”

    +
    文献包括4个要素。
    +

    (1) 知识和信息,即文献的内容。
    +(2) 物质载体,如竹简、纸张、胶片、磁盘等,它是文献的外在形式。
    +(3) 记录知识和信息的符号,如文字、图表、声音、图像等。
    +(4) 记录的方式或手段,如书写、印刷、复制、录音、录像等,即将知识和信息固化到载体上的手段。

    +

    信息、知识、情报与文献

    +

      我国图书情报学界对信息、知识、文献和情报的看法是:知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,当文献中记录的知识传递给用户,并为用户所利用时,文献中的知识就转化为情报。

    +

    信息的分类

    +
      +
    1. 按信息的内容划分
      +科学技术信息
      +社会科学信息
    2. +
    3. 按产生信息的客体的性质来划分
      +自然信息
      +生物信息
      +机器信息
      +社会信息
    4. +
    5. 按信息所依附的载体来划分
      +文献信息
      +口头信息
    6. +
    +

    文献的分类

    +
      +
    1. 按照文献的加工层次分类
      +零次文献(Zeroth Literature)
      +一次文献(Primary Literature)
      +二次文献(Secondary Literature)
      +三次文献(Tertiary Literature)
    2. +
    3. 按照文献的载体分类
      +印刷型文献(Paper Literature)
      +缩微型文献(Microform)
      +电子型文献(Electronic iterature)
      +音像型文献(Audio-Visual iterature)
    4. +
    5. 按照文献的出版形式分类
      +图书
      +期刊
      +报纸
      +特种文献(学位论文、会议论文、专利文献、标准文献、科技报告、政府出版物、产品样本资料等)
    6. +
    +

    信息检索基础

    +

    信息检索的原理

    +

    信息检索的概念

    +

      广义的信息检索“Information Retrieval”是指将信息按照一定的方式组织和存储起来,并根据信息用户的需要揭示、查找、传递相关信息的过程,包括了信息的存储过程和查找过程。狭义的信息检索仅指信息的查找,是指从信息集合中找出用户所需要的有关信息的过程。狭义的信息检索包括3个方面的含义:了解用户的信息需求、信息检索的技术或方法、满足信息用户的需求。

    +

    信息检索的原理

    +

      信息检索的基本原理就是在对信息进行整理排序形成检索工具的基础上,按照用户的要求利用检索工具或检索系统,将用户检索提问标识(检索词)与已形成的或存储在系统中的信息的存储标识(文献特征标识、标引词)进行匹配比较,若取得一致,则为匹配,即达到了用户的检索需求,如图1.1所示。

    +
    +信息检索原理图 +
    +

    信息检索的类型

    +
      +
    1. 按信息存储和检索的内容分类
      +文献检索
      +数据检索
      +事实检索
    2. +
    3. 按照检索系统中信息的组织方式分类
      +全文检索
      +多媒体检索
    4. +
    5. 按照信息存储的载体和实现查找的技术手段分类
      +手工检索
      +机械检索
      +计算机检索
    6. +
    +

    信息检索的工具

    +

      信息检索工具是指为检索需要而组织的文献检索系统,它是收集、加工标引、组织文献的结果,是检索工作赖以生存的手段和条件,包含目录、索引、文摘等。

    +

    典型的检索工具组成

    +
      +
    1. 主体:即检索工具的主要部分,由所收录文献的著录部分组成,是文献储存与检索的实体。其包含文献的内部特征与文献的外部特征。
    2. +
    3. 辅助索引:是在文献检索工作中,从主体部分的文献款目编排系统以外的角度增加检索途径、扩大检索效果的辅助手段,它不能离开检索工具的主体单独存在。
    4. +
    5. 使用说明:向用户介绍本检索工具的性质、内容范围、收录年限、读者对象、著录方法、分类体系、检索方法等,帮助用户利用检索工具。
    6. +
    +
    目录
    +
    目录的定义
    +

      目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

    +
    目录的著录款目
    +

    目录的著录包括如下款目。
    +(1) 书名(刊名)项。
    +(2) 著者(编者)项。
    +(3) 出版项:包括出版地点、出版者、出版期、版次等。
    +(4) 稽核项:包括页数、图表、开本、装订形式、定价等。
    +(5) 附注项:对上述各项的补充或说明。
    +(6) 提要项:内容简介。
    +(7) 业务注记:指图书馆或保存单位在目录上做的业务记载,包括索取号、登录号、分类号、主题词、存储地点等。

    +
    索引
    +
    索引的定义
    +

      索引是将报刊书籍中某些重要的或有意义的信息,如书名、刊名篇名、主题、人名、地名等分别摘录出来,按一定方式编排,并注明出处,以供检索的工具。

    +
    索引的作用
    +

      索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

    +
    常用索引
    +

    (1) 主题索引
    +(2) 分类索引
    +(3) 著者索引
    +(4) 其他:单位索引(或团体著者索引)、化学分子式索引、引用刊物索引、出版单位索引等。

    +
    文摘
    +
    文摘定义
    +

      我国国家标准GB3468——83定义文摘为“除题录部分外还对文献内容作实质性描述的文献条目称文摘”。

    +
    文摘作用
    +

    (1) 帮助读者快速判断文献内容
    +(2) 节省阅读时间
    +(3) 减少语言障碍
    +(4) 替代原文

    +
    检索工具类型
    +
      +
    1. 按信息加工的手段或设备划分
      +手工检索工具
      +机械检索工具
      +计算机检索工具
    2. +
    3. 按编制方法划分
      +目录型检索工具
      +题录型检索工具
      +文摘型检索工具
      +索引型检索工具
    4. +
    5. 按信息载体形态划分
      +书本式检索工具
      +卡片式检索工具
      +缩微式检索工具
      +磁性材料式检索工具
    6. +
    7. 按收录范围划分
      +综合性检索
      +综合性检系
      +专科性检索工具
      +专题性检索工具
      +全面性检索工具
      +单一性检索工具
    8. +
    9. 按时间范围划分
      +预告性检索工具
      +现期通报性检索工具
      +回溯性检索工具
    10. +
    +

    信息检索的意义

    +
      +
    1. 掌握获取知识的捷径,提高信息利用的效率
    2. +
    3. 提高信息素质,培养终身学习的能力
    4. +
    5. 科学研究的向导,科技查新的基础
    6. +
    +

    信息检索的途径

    +

      根据信息的基本特征,可以把信息检索途径分为外部特征检索途径(题名途径、著者途径、引文途径等)和内容特征检索途径(分类途径、主题途径等)两大类。

    +

    外部特征途径

    +
      +
    1. 题名途径:刊名、书名、篇名等
    2. +
    3. 著者途径:作者、编者、译者、专利权人、出版机构等
    4. +
    5. 引文途径: 其他途径:专利号、报告号、合同号、标准号、国际标准书号和刊号等
    6. +
    +

    内容特征途径

    +
      +
    1. 分类途径:是指按照文献所属学科(专业)属性(类别)进行检索的途径。
    2. +
    3. 主题途径:是按照文献信息的主题内容进行检索的途径,利用主题词、关键词、叙词,并按字顺排列实现检索。
    4. +
    +

    信息检索的步骤和方法

    +

    信息检索的步骤

    +

    信息检索的方法

    +
      +
    1. 顺查法:指按照时间的顺序,由远及近地利用检索系统进行文献信息检索的方法。
    2. +
    3. 逆查法:是由近及远地查找,逆着时间的顺序利用检索工具进行文献信息检索的方法。
    4. +
    5. 抽查法:是针对检索课题的特点,选择有关该课题的文献信息最可能出现或最多出现的时间段,利用检索工具进行重点检索的方法。
    6. +
    7. 追溯法(引文法) :是指利用已经掌握的文献末尾所列的参考文献,进行逐一追溯查找“引文”的一种最简便的扩大情报来源的方法。
    8. +
    9. 综合法:又称循环法,这是把上述方法加以综合运用的方法。
    10. +
    +

    计算机信息检索基础

    +

    计算机信息检索概述

    +

    计算机信息检索的特点

    +

    (1) 速度快。
    +(2) 检索范围广。
    +(3) 检索不受时空的限制。
    +(4) 及时。
    +(5) 界面友好。
    +(6) 超文本检索。

    +

    计算机信息检索分类

    +

    (1) 脱机检索
    +(2) 联机检索
    +(3) 网络检索

    +

    计算机信息检索技术

    +

      计算机检索系统常采用一些运算方法,从概念相关性、位置相关性等方面对检索提问进行技术处理。

    +
      +
    1. 检索词的选择
      +检索式由检索词和检索算符组成。
      +检索词分为两类:受控词和非受控词。
    2. +
    3. 布尔逻辑检索
      +将多个检索词用布尔运算符(简称检索算符)组合在一起来进行检索,称之为布尔逻辑检索。
      +系统使用的检索算符一般有以下几种:
      +(1) 逻辑与
      +(2) 逻辑或
      +(3) 逻辑非
    4. +
    +

    光盘检索

    +

    光盘检索的特点主要有以下几个。

    +
      +
    1. 检索途径多。其可提供内容、著者、关键词、标题、著者单位、年代、出处等多种检索途径。
    2. +
    3. 检索系统配置简单。利用微机系统建立光盘检索系统只要一台光盘驱动器和所需要的盘片,不需经过通信线路。
    4. +
    5. 检索费用低廉。由于光盘的费用是一次性投入,可够次任意使用,利用率越高,分摊的成本越低。
    6. +
    7. 系统操作简单。光盘数据库一般都具备类似联机检索那样齐全的检索和输出功能,同时提供人机对话,系统界面友好。
    8. +
    +

    网络检索

    +

    网络检索具有如下特点:

    +
      +
    1. 检索速度快。手工检索需数周的课题计算机检索只需数小时或数分钟。
    2. +
    3. 检索途径多。除手工检索工具的分类、主题、著者等检索途径之外,网络检索往往还提供更多更灵活的检索途径,如文本词途径。
    4. +
    5. 更新快。网上信息很多为为更新。
    6. +
    7. 范围广。网上数据库的种类更为广泛和丰富,有些可免费进行
    8. +
    9. 检索用词的选择及其组配更为灵活。检索策略的制定更为灵活和复杂,可利用各种讦算机检索技术随意扩天或缩小检索范围以满足用户各种不同的信息检索需求。
    10. +
    11. 检索结果可直接打印或下载,可操作性强。
    12. +
    +

    思考题:

    +

    简述信息、知识、文献的概念,及三者之间的关系。

    +

      知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,

    +

    信息检索的目的和意义

    +
      +
    1. 掌握获取知识的捷径,提高信息利用的效率
    2. +
    3. 提高信息素质,培养终身学习的能力
    4. +
    5. 科学研究的向导,科技查新的基础
    6. +
    +

    检索工具的结构构成是什么?

    +
      +
    1. 目录
    2. +
    3. 索引
    4. +
    5. 文摘
    6. +
    +

    目录在检索中起什么作用?

    +

      目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

    +

    索引在检索中起什么作用?

    +

      索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

    +

    文摘在检索中起什么作用?

    +

    (1) 帮助读者快速判断文献内容
    +(2) 节省阅读时间
    +(3) 减少语言障碍
    +(4) 替代原文

    +

    简述国内外主要分类法。

    +

    中国图书分类法

    +
      +
    1. 中国人民大学图书馆图书分类法。简称人大法新中国成立后的第一部分类法,1954年出第一版,1996年出第六版。4大部类、17个基本大类。总结科学,社会科学,自然科学,综合性科学、综合性图书。
    2. +
    3. 中国科学院图书馆图书分类法
    4. +
    5. 中国图书资料分类法
    6. +
    7. 中国档案分类法
    8. +
    +

    外国图书分类法

    +
      +
    1. 杜威十进分类法(Dewey Decimal Classification &Relative Index,DDC)是世界上流传最广、影响最大的一部文献分类法,它开创了文献分类法的新纪元,是外国文献分类法发展史上一个重要里程碑。
    2. +
    3. 国际十进分类法
    4. +
    5. 美国国会图书馆分类法
    6. +
    7. 冒号分类法
    8. +
    9. 布利斯书目分类法
    10. +
    +

    操作题:

    +

    题目:

    +

    利用《中国图书馆图书分类法》找出分类号。

    +

    检索目的:

    +

    掌握《中国图书馆图书分类法》的基本构成特点。

    +

    检索要求:

    +

    按照基本大类,在《中国图书馆图书分类法》中查找以下相关类目编号。

    +
      +
    1. 计算机技术:国际互联网
    2. +
    +
    +

    TP393.4

    +
    +
      +
    1. 交通运输:运输线路优选
    2. +
    +
    +

    U116.2

    +
    +
      +
    1. 环境科学:环境污染的控制及其排除
    2. +
    +
    +

    X506

    +
    +
      +
    1. 食品工业:淀粉加工工艺
    2. +
    +
    +

    TS234

    +
    +
      +
    1. 文化、科学:图书馆工作者
    2. +
    +
    +

    G251.6

    +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-05-06T21:55:57.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[在docker安装elasticsearch]]> + /8612fa7f/8f8103b7/Docker/29596f0c.html + + 2020-04-29T21:55:57.000Z + 动漫美图

    + + +

    安装elasticsearch(简称es)

    +

    拉取镜像,该命令拉取最新版(不推荐,最新版意味着踩坑)

    +
    docker pull elasticsearch
    +
    +

    可以指定版本,查看elasticsearch版本

    +
    docker pull elasticsearch:x.x.x
    +
    +

    执行docker pull elasticsearch
    +尝试运行

    +
    docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:latest
    +
    +

    response from daemon: Conflict. The container name "/elasticsearch" is already in use by container "06a80d721428c762abcb750f5a5f48a947c4714e3f9e6637e10792b4f4fa5a02". You have to remove (or rename) that container to be able to reuse that name
    +查看所有容器

    +
    docker ps -a
    +
    +

    解决方法

    +
      +
    1. 删除容器,重新创建
    2. +
    +
    docker rm containerId|names
    +
    +

    image.png
    +发送GET请求,校验是否安装成功

    +
    curl localhost:9200
    +
    +

    curl localhost:9200
    +2. 重新启动之前的容器

    +
    docker start containerId|names
    +
    +

    安装可视化控件(kibana,elasticsearch-head…)

    +

    这里选择kibana,颜值就是正义,在docker中安装kibana官方文档

    +

    需要指定版本,该版本与es一致

    +
    docker pull docker.elastic.co/kibana/kibana:7.6.2
    +
    +

     response from daemon: manifest for docker.elastic.co/kibana/kibana:latest not found: manifest unknown: manifest unknown
+
    +运行kibana

    +
    docker run --link elasticsearch:elasticsearch -p 5601:5601 --name kibana -d docker.elastic.co/kibana/kibana:7.6.2
    +
    +

    测试

    +
     curl localhost:5601/status
    +
    +

    出现kibana server is not ready yet
    +查看日志

    +
    docker logs -f containerId
    +
    +

    image.png
    +完了掉坑里了,下次再写了顺便补上docker-compose部署

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-04-29T21:55:57.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[git push时出现error: src refspec master does not match any解决办法.]]> + https://blog.dragondyt.topnull + + 2020-04-23T21:55:57.000Z + 动漫美图

    + + +

    git push时出现error: src refspec master does not match any解决办法.

    +

    网传原因:
    +  ++这是由于存储库仍然为空引起的。存储库中没有提交,因此没有 master分支可推送到服务器。++
    +网传解决方法:

    +
    touch README
    +git add README 
    +git commit -m 'first commit'
    +git push origin master
    +
    +

    可能是我垃圾吧,git命令写错了,反正没能解决,如图:

    +

    image.png

    +
    git show-ref
    +
    +

    d601ecc070daac5320959ee8c47bca013a113256 refs/remotes/origin/master

    +

    终于换一种错误了,留下了无知的眼泪

    +
    git push origin HEAD:master
    +
    +

    image.png

    +

    一番调整,我终于成功了,失败30次,o(╥﹏╥)o

    +

    image.png

    +

    去目标仓库查看,发现有一个目录文件全没了(╥╯^╰╥)
    +我有修改一番,好刺激啊,这就是删库跑路的快感吗!

    +

    image.png

    +

    这就是之前消失的文件,现在回来了,其他的又消失了。。。
    +经过检查,该文件夹下面含有 .git 文件夹,无法被追踪,删除即可,到此结束了,节后逃生的感觉。
    +总结:出现这个错误不一定是因为空目录,也可能是因为远程分支不在!!!

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-04-23T21:55:57.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[计算机网络第三章数据链路层答案]]> + /8612fa7f/e255a10a/a87da565/589e13eb.html + + 2020-03-16T19:22:27.000Z + + 第三章 数据链路层 +

    一、选择题

    +
      +
    1. 流量控制是为( C )所需要的。
    2. +
    +

    A. 位错误   B. 发送方缓冲区溢出
    +  C. 接收方缓冲区溢出   D. 接收方与发送方之间冲突

    +
      +
    1. 在下列协议中,使用带位填充的首尾标志法组帧是( B )。
    2. +
    +

    A. DDCMP   B. HDLC   C. BSC   D. SLIP

    +
      +
    1. PPP不同于HDLC协议,使用面向( B )的填充方式。
    2. +
    +

    A. 比特   B. 字符   C. 透明传输   D. 帧

    +
      +
    1. 对于窗口大小为n的滑动窗口,最多可以有( C )帧已发送但没有确认。
    2. +
    +

    A. 0   B. n-1   C. n   D. n+1

    +
      +
    1. 在滑动窗口流量控制(窗口大小为8)中,ACK3意味着接收方期待的下一帧是( B )号帧。
    2. +
    +

    A. 2   B. 3   C. 4   D. 8

    +
      +
    1. PPP是Internet中使用的( C ),其功能对应于OSI参考模型的数据链路层。
    2. +
    +

    A. 传输协议   B. 分组控制协议   C. 点到点协议   D. 报文控制协议

    +

    7. 下面不是数据链路层功能的是(D)。

    +

    A. 帧同步   B. 差错控制   C. 流量控制   D. 拥塞控制

    +

    8. 面向比特同步的帧数据段中出现位串01111101,则比特填充后输出是(A)。

    +

    A. 011111001   B. 001111101   C. 011111101   D. 011111010

    +

    9. PPP为实现透明传输在异步传输时采用(A),而同步传输采用(A)。

    +

    A. 字符填充法,比特填充法   B. 比特填充法,字符填充法
    +  C. 字符填充法,字节记数法   D. 比特填充法,比特填充法

    +

    10. 在数据通信中,当发送数据出现差错时,发送端无需进行数据重发的差错控制方法为(B)。

    +

    A. ARQ   B. FEC   C. 奇偶校验码   D. CRC

    +

    11. 已知循环冗余码生成多项式G(X)=x5+x4+x+1,若信息位10101100,则冗余码是(B)。

    +

    A. 01101   B.01100   C. 1101   D. 1100

    +

    12. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以(C)。

    +

    A. 检测出一位差错       B. 检测并纠正一位差错
    +  C. 检测出多位突发性差错   D. 检测并纠正多位突发性差错

    +
      +
    1. 若数据链路的发送窗口尺寸WT=4,在发送3号帧、并接到2号帧的确认帧后,发送方还可连续发送(B)。
    2. +
    +

    A. 2帧   B. 3帧   C. 4帧   D. 1帧

    +

    14. 在回退N协议中,当帧序号为3比特,发送窗口的最大尺寸为(C)。

    +

    A. 5   B. 6   C. 7   D. 8

    +

    15. 在选择重传协议中,当帧的序号字段为3比特,且接受窗口与发送窗口尺寸相同时,发送窗口的最大尺寸为(B)。

    +

    A. 2   B. 4   C. 6   D. 8
    +16. 假定我们运行发送窗口大小为5和接收窗口大小为3的滑动窗口算法,并且在传输过程中不会发生分组失序的问题,帧序号的编码至少有(B)位。

    +

    A. 2   B. 3   C. 4   D. 5

    +

    17.无论是SLIP还是PPP协议都是(D)协议。

    +

    A.物理层 B 传输层 C网络层 D数据链路层

    +

    18.下列哪一项最好地描述了CRC的特征?(AB)
    +  A.逐个检查每一个字符

    +

    B.能检查出99%以上的差错

    +

    C.检查不出有偶数个位出错的差错

    +

    D.不如奇偶校验方法可靠

    +

    19.HDLC协议采用的帧同步方法是(A)。

    +

    A.使用比特填充的首尾标志法

    +

    B.使用字符填充的首尾定界符法

    +

    C.字节计数法

    +

    D.违法编码法

    +

    20.流量控制是数据链路层的基本功能之一,有关流量控制,下列说法中正确的是(C)。

    +

    A.只有数据链路层存在流量控制

    +

    B.不只是数据链路层存在流量控制,不过各层的流量控制对象都一样

    +

    C.不只是数据链路层存在流量控制,但是各层的流量控制对象都不一样

    +

    D.以上都不对

    +

    21.为了避免传输中帧的消失,数据链路层采用了(D)方法。

    +

    A.发送帧编上序号   B.循环冗余码
    +  C.海明码   D.计时器超时重发

    +

    22.下列不属于数据链路层功能的是(B)。

    +

    A.帧同步功能   B.电路管理功能
    +  C.差错控制功能   D.流量控制功能

    +

    23.流量控制实际上是对(A)的控制。

    +

    A.发送方数据流量   B.接收方数据流量
    +  C.发送,接受双方数据流量   D.链路上任意两结点间的数据流量

    +

    24.在数据帧中,当所传送的数据中出现控制字符时,就必须采取适当的措施,使接收方不至于将数据误认为是控制信息。这样才能保证数据链路层的传输是(A)的。

    +

    A.透明   B.面向连接   C.冗余   D.无连接
    +25.数据链路层采用后退N帧协议,发送方已经发送了编号为0~7的帧。

    +

    当及时器超时,若发送方只收到0,2,3号帧的确认,则要发送方重发的帧数是(C)
    +  A.2   B.3   C.4   D.5

    +

    26.计算机网络中各节点间采用©方式。

    +

    A.连续传输   B.总线传输   C.串行传输   D.并行传输

    +

    27.差错控制的基本方式有(多选)(AB)

    +

    A.检错反馈重发   B.前向纠错方式   C.奇偶校验码   D.方阵检验码

    +

    28.数据传输中的差错主要有(多选)(AD)

    +

    A.随机错   B.计算错   C.校验错   D.突发错

    +

    29.无论是SLIP还是PPP协议都是( B )协议。

    +

    (A)物理层  (B)数据链路层  ©网络层  (D)运输层

    +

    ps:不保证完全正确,仅用来偷懒

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-03-16T19:22:27.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[计算机网络第二章物理层课堂练习答案]]> + /8612fa7f/e255a10a/a87da565/5eef9793.html + + 2020-03-15T19:22:27.000Z + + 第二章 物理层 +

    一、 选择题

    +
      +
    1. 信号是数据在传输过程中的(A)的表现形式。
      +A. 电信号 B. 代码 C. 信息 D. 程序
    2. +
    3. 数据通信的任务是传输( D  )代码的比特序列。
      +A. 十进制 B. 帧结构 C. 分组结构 D. 二进制
    4. +
    5. ( B )信号的电平是连续变化的。
      +A. 数字 B. 模拟 C. 脉冲 D. 二进制
    6. +
    7. ( C)是指将数字信号转变成可以在电话线上传输的模拟信号的过程。
      +A. 解调 B. 采样 C. 调制 D. 压缩
    8. +
    9. 数据传输速率是指每秒钟传输构成数据二进制代码的(D )数。
      +A. 码元 B. 信元 C. 波特 D. 位
    10. +
    11. 利用模拟通信信道传输数据信号的方法称为( A )。
      +A. 频带传输 B. 基带传输 C. 异步传输 D. 同步传输
    12. +
    13. 基带传输是指在数字通信信道上( C )传输数字数据信号的方法。
      +A. 调制 B. 脉冲编码 C. 直接 D. 间接
    14. +
    15. 数据在通信信道传输的过程中,对数据传输的误码率影响最主要的因素是( D )。
      +A. 传输速率 B. 调制解调器 C. 传输介质 D. 噪声强度
      +9.Internet上的数据交换采用的是( A )。
      +A. 分组交换 B. 电路交换 C. 报文交换 D. 光交换
    16. +
    17. FDM是指( A )。
      +A. 频分多路复用 B. 时分多路复用 C. 波分多路复用 D. 码分多路利用
    18. +
    19. 利用( A ),数字数据可以用模拟信号来表示。
      +A. 调制解调器 B. 编码解码器 C. 串联放大器 D. 电话网络
    20. +
    21. 在数据通信系统中,传输介质的功能是( D )。
      +A. 在信源与信宿之间传输信息 B.纠正传输过程中的错误
      +C. 根据环境状况自动调整信号形式 D. 将信号从一端传至另一端
    22. +
    23. 在光纤中采用的多路复用技术是( C )。
      +A. 时分多路复用 B. 频分多路复用 C. 波分多路复用 D. 码分多路复用
    24. +
    25. 为了实现长距离传输,模拟传输系统都使用放大器来使信号中的能量得到增加,其噪声分量( A )。
      +A. 增大 B. 减小 C. 不变 D. 不一定
    26. +
    27. “复用”是一种将若干个彼此独立的信号合并为一个可在同一信道上传输的( C )。
      +A. 调制信号 B. 已调信号 C. 复用信号 D. 单边带信号
    28. +
    29. 物理层4个重要特性:机械特性、功能特性、电气特性和(A)。
      +A. 规程特性 B. 接口特性 C.协议特性 D. 物理特性
      +17. 基带系统使用(C)进行传输的。
      +A. 模拟信号 B. 调制信号 C. 数字信号 D. 载波信号
      +18. 下列关于异步传输说法正确的是(D)。
      +A. 一次传输一个数据块 B. 对时序的要求较高
      +C. 收/发端不需要进行同步 D. 数据传输速率低
      +19. 低通通道带宽为5KHz,编码采用512级分级信号,最大数据传输率(D)。
      +A. 32 kbps B. 48 kbps C. 64 kbps D. 90 kbps
    30. +
    31. 在宽带为8KHz的信道上,按奈奎斯特定理,每秒能发送的比特数不超过48kbps,则一个码元离散取值是(B)。
      +A. 4 B. 8 C. 16 D. 24
      +21. 在宽带为8KHz的信道上,如果8种不同的物理状态来表示数据,若信噪比S/N为30Db,按香农定理,最大限制的数据速率为(D)。
      +A. 24 kbps B. 48 kbps C. 40 kbps D. 80kbps
      +22. 在脉冲起始时刻,有无跳变来表示“0”和“1”,在脉冲中间时刻始终发生跳变的编码是(C)。
      +A. 曼彻斯特编码 B. 非归零码 C. 差分曼彻斯特编码 D. 8B/10B
      +23. 当数字信号在模拟传输系统中传送时,在发送端和接受端分别需要(A)。
      +A. 调制器和解调器 B. 解调器和调制器
      +C. 编码器和解码器 D. 解码器和编码器
      +24.两台计算机利用电话线路传输数据信号时必备的设备是(A).
      +A. 调制解调器 B. 网卡 C. 中继器 D. 集线器
      +25. 当通信子网采用(B)方式时,我们首先要在通信双方之间建立起逻辑连接。
      +A. 报文交换 B. 虚电路 C. 数据报 D. 电路交换
      +26.不受电磁干扰或噪声影响的介质是(B)。
      +A. 双绞线 B. 光纤 C. 同轴电缆 D. 微波
      +27. 报文的内容不按顺序到达目的节点的是(D)方式。
      +A. 电路交换 B. 报文交换 C.虚电路交换 D. 数据报交换
      +28. 在中继系统中,中继器处于(A)。
      +A. 物理层 B.数据链路层 C. 网络层 D. 高层
      +29. 关于时延说法正确的是(C)。
      +A. 发送时延=信道长度/电磁波在信道上的传播速度
      +B. 传播时延=数据块长度/信道带宽
      +C. 总时延=传播时延+发送时延+排队时延
      +D. 提高链路带宽减小了数据的传播时延
      +30. 下列说法错误的是(C)。
      +A. 在虚电路方式中,信息从源节点传送到目的节点采用“存储转发”方式
      +B. 在数据报方式中,信息从源节点传送到目的节点采用“存储转发”方式
      +C. 电路交换比分组交换实时性好
      +D. 报文交换方式适合交互式通信
      +31.物理层传输的是(A)。
      +A.原始比特 B.分组 C.信元 D.帧
      +32.在电缆中采用屏蔽可以带来什么好处?(B)
      +A.减少信号衰减 B.减少电磁干扰辐射
      +C.减少物理损坏 D.减少电缆的阻抗
      +33.调制解调技术主要用于(A)的通信方式中。
      +A.模拟信道传输数字数据 B.模拟信道传输模拟数据
      +C.数字信道传输数字数据 D.数字信道传输模拟数据
      +34.下列说法中,哪一项是正确的?(C)
      +A.虚电路与线路交换没有实质不同
      +B.在通信的两个站点间只能建立一条虚电路
      +C.虚电路有连接建立,数据传输,连接拆除3个阶段
      +D.虚电路的各个结点需要为每个分组作路由选择判定
      +35.当数字信号在模拟传输系统中传送时,在发送端和接收端分别需要(A)。
      +A.调制器和解调器 B解调器和调制器
      +C. 编码器和解码器 D解码器和编码器
      +36.物理层的4个特性中,(B)规定了每种信号的电平,信号的脉冲宽度,允许的数据传输速率和最大传输距离。
      +A.机械特性 B电气特性 C功能特性 D规程特性
      +37.为了将数字信号传输得更远,可以采用的设备是(A)。
      +A.中继器 B放大器 C网桥 D路由器
      +38.在无噪声情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输率是(C)
      +A.12kbps B.24kbps C.48kbps D.96kbps
      +39.传递需进行调制编码。(B)
      +  A.数字数据在数字信道上 B.数字数据在模拟信道上
      +  C.模拟数据在数字信道上 D.模拟数据在模拟信道上
      +40.数据传输速率公式:S= Tlog2N中,T的含义是。(B)
      +  A.单位脉冲幅度 B.单位脉冲宽度 C.调制速率 D.脉冲的有效值
      +41.两个实体间数据传输和交换是(A)
      +  A.数据通信 B.数据控制 C.数据传输 D.信息交换
      +42.在多数情况下,网络接口卡实现的功能处于。 (A)
      +  A.物理层协议和数据链路层协议 B.物理层协议和网络层协议
      +  C.数据链路层协议 D.网络层协议
      +43.下列说法哪一个是正确的 (A)
      +  A、当码元的离散值个数N=2,则波特率等于比特率;
      +  B、600波特和600bps是一个意思;
      +  C、每秒传送l00个码元也就是每秒传送100个比特;
      +D、每秒50波特的传输速率是很低的
      +44.模拟通信系统中产生的调制信号一定是。(B)
      +  A.数字信号 B.连续信号 C.语音信号 D.离散信号
      +45.用bps作单位的有(多选)(AC)
      +  A.位速率 B.波特率 C.数据传输率 D.误码率
      +46.下列对基带传输和宽带传输的说法正确的是(多选) (AB)
      +  A.基带传输是将数据直接转换为脉冲信号加到电缆上传输出去
      +  B.宽带传输是将数据加到载波信号上传送出去
      +  C.基带传输采用“控制载波信号状态”的传输技术
      +  D.在通信中,依据数据流的方向可以分为基带传输和宽带传输
      +47.下述哪个说法是正确的?(D)
      +  (A)细同轴电缆传输速率最高。
      +  (B) 光纤电缆支持电缆运行几十公里。
      +  © 屏蔽双绞线电缆对电磁干扰不敏感。
      +  (D) 以上说法都不对。
      +48.下述哪一个电缆类型支持最大的电缆长度?©
      +  (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
      +49.下述哪个说法是正确的?(D)
      +  (A)细同轴电缆传输速率最高。
      +  (B) 光纤电缆支持电缆运行几十公里。
      +  © 屏蔽双绞线电缆对电磁干扰不敏感。
      +  (D) 以上说法都不对。
      +50.下述哪一个电缆类型支持最大的电缆长度?©
      +  (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
      +ps:不保证完全正确,仅用来偷懒
    32. +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-03-15T19:22:27.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[一个bug]]> + /8612fa7f/e00fc567/5ac6f809/49af668f.html + + 2020-03-14T21:55:57.000Z + 动漫美图

    + + +

    一个让人烦躁的bug

    +

      今天写代码,一个简单的查询,总是出现++java.math.BigDecimal cannot be cast to java.lang.Integer++,项目是热部署的,以为是缓存,清除一遍又一遍还是无效。我试着用toString方法转字符串然后转int,结果出现了异常,但是注释掉的代码可以运行

    +

    转换异常,看不出哪里有异常转换,我也有点好奇Map<String, Integer>是怎么变成Map<String, BigDecimal>的。
    +类型变化
    +我手动写了一个Map<String, Integer>尝试放入一个BigDecimal,结果编译失败了!

    +

    编译失败

    +

    查询使用了mybatis3.2.6框架(不是plus), resultType=“java.util.Map”
    +下面是sql

    +
    select MONTH(日期) as month,SUM(amount) AS total FROM `销售` where YEAR(日期) = #{year} GROUP BY MONTH(日期);
    +
    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-03-14T21:55:57.000Z + All rights reserved 2021, Dragon Dyt +
    + + <![CDATA[安卓开发学习--安装开发环境]]> + /8612fa7f/e00fc567/5ac6f809/ff03d5f4.html + + 2020-03-05T07:55:57.000Z + 安卓路线图

    + + +

    Android Stdio下载

    +

    网盘下载
    +官网下载

    +

    安装过程

    +

    一直点next就行了,注意一下几点:

    +
      +
    1. AS安装路径不能与sdk路径一样
    2. +
    +

    安装路径配置

    +

    错误图片

    +
      +
    1. 安装目录不能是中文,如果安装目录是中文,AS会提示错误 ++Your SDK location contains non-ASCII characters++
    2. +
    +

    Your SDK location contains non-ASCII characters

    +

    App运行方式

    +

    模拟器运行

    +

    模拟器运行图片
    +手机型号可以自己选,然后点next
    +手机选择
    +选择镜像(安卓版本),然后点next,后面配置可以不动,点Finish
    +安卓版本
    +完成图片
    +配置完成图片
    +启动图片
    +tip:模拟器默认安装在C盘,可以通过教程修改传送门

    +

    真机运行

    +

    插上安卓手机,打开usb调试打开方式,手机出现提示时点同意
    +usb调试授权

    +

    第一次写blog,不足之处多多见谅

    +]]>
    + + Dragon Dyt + dragondyt@yandex.com + + + + Dragon Dyt + dragondyt@yandex.com + + 2020-03-05T07:55:57.000Z + All rights reserved 2021, Dragon Dyt +
    +
    \ No newline at end of file diff --git a/baidu_verify_code-u4oZ0WYbh5.html b/baidu_verify_code-u4oZ0WYbh5.html new file mode 100644 index 0000000..a1302bf --- /dev/null +++ b/baidu_verify_code-u4oZ0WYbh5.html @@ -0,0 +1 @@ +999b2ced93860e70841ea2597075e3de \ No newline at end of file diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 0000000..249c5c1 --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #ffc40d + + + diff --git a/computer-science/note/79abcd0d.html b/computer-science/note/79abcd0d.html new file mode 100644 index 0000000..6420511 --- /dev/null +++ b/computer-science/note/79abcd0d.html @@ -0,0 +1,29 @@ + + + + + + + + + + Hexo主题Shoka & multi-markdown-it渲染器使用说明 | VuePress + + + + + + + +

    :::info
    跳票N久终于更新的简单的使用说明

    已经支持hexo 5。
    :::

    :::info
    因博主被学业和工作掏空,本项目已停滞更新大半年,问题也无法及时回复大家,这个悲惨状态可能还要持续半年的样子。

    有很多热心小伙伴在评论区或者项目issue帮忙回答问题,非常非常感谢!

    本项目是完全开源的,也有做一些example示例,大家可以随便拿随便改。
    但是很抱歉,博主我暂时不能提供更多的支持,这个写的乱七八糟的文档,暂时也没有时间把它写得更专业一些。
    非常对不住大家!

    iconfont的添加申请,我看到留言后会尽快加上,希望各位小伙伴能看到。
    :::

    :::warning
    当前版本更新至 0.2.5,更新记录点此

    :::

    :::primary
    🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    :::

    设计缘由

    前几年在Bear和Evernote上整理了大量笔记,非常喜欢Bear默认的markdown渲染样式。
    后来因为换了安卓手机,用不了Bear,四处搜寻替代品,没有满意的。
    然后阴差阳错知道了Hexo,又得知Github也可以免费建私有仓库了,故再次转移阵地到了自建博客,并部署在Github Pages。

    因为这个博客是用来记笔记的,故起名书架
    对应的主题即Theme.Shoka,可以说是为了笔记阅读而生的主题。
    样式严重参考Bear,部分代码严重参考NexT

    Hexo的默认及常用渲染器均使用highlight.js进行代码高亮,而我喜欢Prism.js,故重写了一个渲染器配合主题食用。
    渲染器取名multi,因为集成了很多很多很多markdown-it插件,以及压缩静态文件的功能。
    (最新版的默认渲染器也支持Prism.js了,可喜可贺,但不想用,哈哈哈哈哈哈哈

    墙内Github Pages访问速度时而感人,所以用了jsDelivr加速,主要是因为它可以按需合并依赖文件。

    快速安装

    # cd your-blog
    +git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka
    +

    打开主题目录,内有example文件夹,提供了配置文件的demo供参考。

    安装依赖插件

    在应用主题之前,必须至少安装 hexo-renderer-multi-markdown-it 渲染插件 和 hexo-autoprefixer

    插件安装与配置教程戳此

    应用主题

    修改站点配置

    修改站点配置文件<root>/_config.yml,把主题改为 shoka

    theme: shoka
    +

    修改主题配置

    主题配置的所有参数在<root>/themes/shoka/_config.yml文件中。

    为了方便主题升级,请在根目录新建一个yml文件,命名为_config.shoka.yml
    也就是说,所有主题的自定义配置均保存于<root>/_config.shoka.yml文件。

    主题的基础配置可以参考这里
    界面显示相关的配置参考这里

    更新记录

    标签含义:
    ❗ 需要手动操作的更新信息
    ⚠️ 需要注意的更新信息
    🔧 已修复的问题
    ⌛ TODO

    0.2.4 👉 0.2.5

    💡 避免直接修改主题文件,添加各种自定义:

    🔧 修复一些BUG

    0.2.3 👉 0.2.4

    ⚠️ 评论功能更新

    • MiniValine魔改版更新至beta10,修改过主题默认_config.yml的同学,记得更新末尾的vendors到最新哦
    • ❗ 评论相关的配置有更新,配置戳此
      • 主要增加的Tag配置,现在可以各种自定义啦

    ⚠️ 配置新增

    ⚠️ 背景音乐功能增强,配置戳此

    • 可以添加多个播放列表
    • 加了一些控制按钮

    ⚠️ 增加media标签,在文章中插入音频和视频播放列表,方法戳此
    ⌛ 视频播放器有待增强(显示分段标签,字幕)

    🔧 随机图库支持非渣浪图床的任意图片
    🔧 还有许多小BUG

    0.2.2 👉 0.2.3

    ❗ 增加主题文件外自定义语言包的功能,配置戳此
    🔧 提高低版本浏览器兼容性

    0.2.1 👉 0.2.2

    ⚠️ 弃用mediumzoom,改成fancybox配置戳此
    💡 增加语言包:繁体中文日语
    💡 quiz功能优化,根据语言显示题型标签
    🔧 修复评论功能中反复初始化leancloud-storage
    🔧 修复audio: false时不能隐藏播放按钮、停止播放

    0.2 👉 0.2.1

    ⚠️ 配置文件添加 loader 参数,配置戳此
    💡 二级list区别显示
    🔧 修复浏览位置定位BUG
    🔧 修复firework动画延迟
    🔧 优化评论功能

    0.1.9 👉 0.2

    ⚠️ 评论功能大改

    • 弃用不开源的Valine,改用MiniValine,并且进行了魔改,项目戳此
      主要是大量压缩了代码,弃用一些花里胡哨的功能,又加了一些别的花里胡哨的功能。
    • 为防止泄露用户邮箱、IP等隐私信息,弃用QQ号获取昵称及头像。
      ❗ 同时需要手动进行一些迁移,具体步骤戳此
    • ❗ 评论相关的配置亦有更新,配置戳此

    ⚠️ 增加单击页面烟花效果,配置戳此
    💡 弃用Velocity,改用anime.js,方便未来添加更多!!花里胡哨的!!功能!!严重拖慢页面滑行速度!!
    🔧 新增多枚icon,包括豆瓣i-douban
    🔧 一些显示问题

    评论数
    + + + diff --git a/computer-science/note/theme-shoka-doc/85a3718.html b/computer-science/note/theme-shoka-doc/85a3718.html new file mode 100644 index 0000000..faf33cb --- /dev/null +++ b/computer-science/note/theme-shoka-doc/85a3718.html @@ -0,0 +1,234 @@ + + + + + + + + + + Step.2 基本配置 | VuePress + + + + + + + +

    :::primary
    🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    :::

    站点别称

    alternate: Yume Shoka
    +

    这里设置的名称代替Logo,显示在页面顶部,以及页尾©️处

    静态文件目录

    statics: / #//cdn.jsdelivr.net/gh/amehime/shoka@latest/
    +

    默认值是/,指使用本地静态文件
    可以修改成//cdn.jsdelivr.net/gh/您的github用户名/您的项目名@latest/这种形式,以使用jsDelivr进行加速。
    PS:jsDelivr并不是实时更新,重新生成文件后需要耐心等待

    css: css
    +js: js
    +images: images
    +

    静态文件所处目录的实际目录名,这些一般不改。

    夜间模式

    darkmode: # true
    +

    默认情况下,是否开启夜间模式取决于(优先级从高到低):

    1. 访客点击页面头部切换按钮的自行选择
    2. 访客切换了浏览设备的主题色调
    3. 您的darkmode配置项

    自动定位

    auto_scroll: # false
    +

    默认情况下,再次打开页面时,会自动滚动到上次浏览的位置。
    这个选项设为false时将停用此功能。

    加载动画

    # 是否显示页面加载动画loading-cat
    +loader:
    +  start: true # 当初次打开页面时,显示加载动画
    +  switch: true # tab切换到其他页面时,显示加载动画
    +

    tab切换后只是显示loading动画,实际并未重新加载页面

    页面特效

    单击页面的烟花效果配置如下

    fireworks:
    +  enable: true # 是否启用
    +  color: # 烟花颜色
    +    - "rgba(255,182,185,.9)"
    +    - "rgba(250,227,217,.9)"
    +    - "rgba(187,222,214,.9)"
    +    - "rgba(138,198,209,.9)"
    +

    加载谷歌字体

    font:
    +  enable: true
    +  # Font options:
    +  # `external: true` will load this font family from `host` above.
    +  # `family: Times New Roman`. Without any quotes.
    +  # `size: x.x`. Use `em` as unit. Default: 1 (16px)
    +
    +  # Global font settings used for all elements inside <body>.
    +  global:
    +    external: true
    +    family: Mulish
    +    size:
    +
    +  # Font settings for alternate title.
    +  logo:
    +    external: true
    +    family: Fredericka the Great
    +    size: 3.5
    +
    +  # Font settings for site title.
    +  title:
    +    external: true
    +    family: Noto Serif JP
    +    size: 2.5
    +
    +  # Font settings for headlines (<h1> to <h6>).
    +  headings:
    +    external: true
    +    family: Noto Serif SC
    +    size:
    +
    +  # Font settings for posts.
    +  posts:
    +    external: true
    +    family:
    +
    +  # Font settings for <code> and code blocks.
    +  codes:
    +    external: true
    +    family: Inconsolata
    +

    此功能基本参考NexT。
    加粗标题的字体总是使用Noto Serif,为了正确友好的显示日文中的汉字,会先后加载headingstitle的字体设置。

    iconfont图标

    主题没有直接使用Font Awesome,是因为用不到那么多icon感觉非常浪费,因此在Iconfont上重新建立了一个项目。
    font-family设为ic,所有字体样式前缀为i-,具体参见<root>/themes/shoka/source/css/_iconfont.styl

    # project of https://www.iconfont.cn/
    +# //at.alicdn.com/t/font_1832207_c8i9n1ulxlt.css => 1832207_c8i9n1ulxlt
    +iconfont: "1832207_c8i9n1ulxlt"
    +

    如果需要添加或修改,请留言告诉我您的Iconfont用户名,我将把您添加到目前的项目中。

    添加权限为只读,此后您可以任意全选,批量保存到购物车中,添加至您自己的项目里,并将主题配置文件中的iconfont值改为您的项目。

    注意,您的项目应设置FontClass/Symbol 前缀i-

    <root>/source/_data/目录新建文件iconfont.styl,把新增或修改的图标样式复制到这个文件中。

    自定义iconfont.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    菜单与社交按钮

    menu:
    +  home: / || home
    +  about: /about/ || user
    +  posts:
    +    default: / || feather
    +    archives: /archives/ || list-alt
    +    categories: /categories/ || th
    +    tags: /tags/ || tags
    +  # friends: /friends/ || heart
    +  # links: /links/ || magic
    +
    +social:
    +  github: https://github.com/yourname || github || "#191717"
    +  #google: https://plus.google.com/yourname || google
    +  twitter: https://twitter.com/yourname || twitter || "#00aff0"
    +  zhihu: https://www.zhihu.com/people/yourname || zhihu || "#1e88e5"
    +  music: https://music.163.com/#/user/home?id=yourid || cloud-music || "#e60026"
    +  weibo: https://weibo.com/yourname || weibo || "#ea716e"
    +  about: https://about.me/yourname || address-card || "#3b5998"
    +  #email: mailto:yourname@mail.com || envelope || "#55acd5"
    +  #facebook: https://www.facebook.com/yourname || facebook
    +  #stackoverflow: https://stackoverflow.com/yourname || stack-overflow
    +  #youtube: https://youtube.com/yourname || youtube
    +  #instagram: https://instagram.com/yourname || instagram
    +  #skype: skype:yourname?call|chat || skype
    +  #douban: https://www.douban.com/people/yourname/ || douban
    +

    如上,使用||作为分隔符,依次为 链接 || 图标 || 颜色
    注意,只需要写图标名称,如github,则会自动转换为ic i-github
    十六进制颜色码需要""包绕。

    menu 支持一级子目录,子目录设置中的第一项必须为default,用来定义父级按钮的样式。

    菜单显示文字可以在语言包中定义,具体请戳这里

    边栏配置

    边栏可以选择在左侧,或右侧
    修改头像文件的地址,相对于静态文件目录images中配置的路径。

    sidebar:
    +  # Sidebar Position.
    +  position: left
    +  #position: right
    +  # Replace the default avatar image and set the url here.
    +  avatar: avatar.jpg
    +

    可以将自己的图片放在<root>/source/_data/images/目录,甚至以同名覆盖主题内默认的头像图片,具体请戳这里

    底部widgets

    目前页面底部可以显示两个小部件,即随机文章最近评论

    widgets:
    +  random_posts: true # 显示随机文章
    +  recent_comments: true # 显示最近评论
    +

    字数及阅读时间统计

    安装好hexo-symbols-count-time插件后,不需要修改站点配置文件,直接使用插件默认配置就行。

    需要修改主题配置文件,找到两处cout,修改为true

    # 页尾全站统计
    +footer:
    +  since: 2010
    +  count: true
    +
    +# 文章界面统计
    +post:
    +  count: true
    +

    文章评论

    如何获取LeanCloud的appId和appKey

    valine:
    +  appId: #Your_appId
    +  appKey: #Your_appkey
    +  placeholder: ヽ(○´∀`)ノ♪ # Comment box placeholder
    +  avatar: mp # Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro
    +  pageSize: 10 # Pagination size
    +  lang: zh-CN.ts-CN
    +  visitor: true # 文章访问量统计
    +  NoRecordIP: false # 不记录IP
    +  serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
    +  powerMode: true # 默认打开评论框输入特效
    +  tagMeta:
    +    visitor: 新朋友
    +    master: 主人
    +    friend: 小伙伴
    +    investor: 金主粑粑
    +  tagColor:
    +    master: "var(--color-orange)"
    +    friend: "var(--color-aqua)"
    +    investor: "var(--color-pink)"
    +  tagMember:
    +    master:
    +      # - hash of master@email.com
    +      # - hash of master2@email.com
    +    friend:
    +      # - hash of friend@email.com
    +      # - hash of friend2@email.com
    +    investor:
    +      # - hash of investor1@email.com
    +

    tag标签显示在评论者名字的后面,默认是tagMeta.visitor对应的值。
    tagMetatagColor中,除了visitor这个key不能修改外,其他key都可以换一换,但需要保证一致性。

      tagMeta:
    +    visitor: 游客
    +    admin: 管理员
    +    waifu: 我老婆
    +  tagColor:
    +    visitor: "#855194"
    +    admin: "#a77c59"
    +    waifu: "#ed6ea0"
    +  tagMember:
    +    admin:
    +      # - hash of admin@email.com
    +    waifu:
    +      # - hash of waifu@email.com
    +

    在文章Front Matter中也可以配置上述参数,访问该文章页面时,将覆盖全局配置。
    尤其可以用来配置一个特殊的placeholder。

    valine:
    +  placeholder: "1. 提问前请先仔细阅读本文档⚡\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"
    +---
    +

    评论通知与管理工具建议使用这个Valine-Admin
    注意SITE_URL需要以/结尾。

    如果某一篇文章需要关闭评论功能,则在文章Front Matter中配置:

    ---
    +title: 关闭评论
    +comment: false
    +---
    +

    背景音乐

    在主题配置文件中,设置全局播放列表。
    在文章的 Front Matter 中,设置文章专有播放列表,访问该文章页面时,将覆盖全局配置。

    audio:
    +  - https://music.163.com/song?id=1387098940
    +  - https://music.163.com/#/playlist?id=2088001742
    +  - https://www.xiami.com/collect/250830668
    +  - https://y.qq.com/n/yqq/playsquare/3535982902.html
    +

    如上,可以直接使用网易云、虾米、QQ音乐的播放列表、单曲,可以同时填写多个。

    audio:
    +  - title: 列表1
    +    list:
    +      - https://music.163.com/#/playlist?id=2943811283
    +      - https://music.163.com/#/playlist?id=2297706586
    +  - title: 列表2
    +    list:
    +      - https://music.163.com/#/playlist?id=2031842656
    +

    如果需要自定义媒体文件,可以按照以下格式填写:

    audio:
    +  - name: "曲目1"
    +    url: "播放地址"
    +    artist: "艺术家"
    +    cover: "封面"
    +    lrc: "歌词"
    +  - name: "曲目2"
    +    url: "播放地址"
    +    artist: "艺术家"
    +    cover: "封面"
    +    lrc: "歌词"
    +
    audio:
    +    - title: 列表1
    +      list:
    +        - name: "曲目1"
    +          url: "播放地址"
    +          artist: "艺术家"
    +          cover: "封面"
    +          lrc: "歌词"
    +        - name: "曲目2"
    +          url: "播放地址"
    +          artist: "艺术家"
    +          cover: "封面"
    +          lrc: "歌词"
    +    - title: 列表2
    +      list:
    +        - https://music.163.com/#/playlist?id=2031842656
    +

    如果要关闭当前页面的背景音乐播放器,则在文章Front Matter中配置:

    ---
    +title: 关闭背景音乐
    +audio: false
    +---
    +

    随机图库

    • 默认的图片列表位于<root>/themes/shoka/_images.yml中。
      使用了渣浪图库,使用一些上传工具,比如这里
      上传后图片的链接是http://wx4.sinaimg.cn/large/6833939bly1gicmnywqgpj20zk0m8dwx.jpg
      只需要新一行写上- 6833939bly1gicmnywqgpj20zk0m8dwx.jpg

      如果想要自定义,则在<root>/source/_data/目录新建一个images.yml文件,这个文件中的图片至少6枚,将完全覆盖默认的图片列表。

    • 也可以直接在图片列表yml文件中,写上任意外链图片地址

    - https://i.loli.net/2020/10/30/qAMYEFXxJcKRsiG.gif
    +- https://i.loli.net/2020/10/30/rjdhcSgEN8COBPA.jpg
    +- https://i.loli.net/2020/10/30/HKyzSd7NI3mlBpt.jpg
    +- https://i.loli.net/2020/10/30/Y1CBXqgeokEs457.jpg
    +- https://i.loli.net/2020/10/30/Z5W6r2BSoiThHG1.jpg
    +
    • 也可以在主题配置文件中,设置图床API:
    image_server: "https://acg.xydwz.cn/api/api.php"
    +

    加载第三方组件

    vendors:
    +  css:
    +    # 略略略
    +  js:
    +    # 略略略
    +

    包括

    –|–|–
    pace | 加载进度条|全局
    pjax | 页面无刷新加载|全局
    anime | js动画效果|全局
    algolia instantsearch| 基于algolia的站内搜索|全局
    lazyload | 图片懒加载|全局
    quicklink | 链接资源预加载|全局
    fetch | 获取播放列表|全局
    katex copy_tex|数学公式显示及复制|按需
    fancybox | 图片放大显示及排列|按需
    valine | 基于LeanCloud的评论系统及文章阅读次数统计|按需
    chart | 图表显示|按需

    以上文件加载全部基于jsDelivr,并对全局加载的组件进行了文件合并。
    如果不明白啥意思,则不要轻易修改。

    :::danger
    主题版本升级的时候,可能会修改这里。
    如果修改过主题默认_config.yml,记得更新主题时,末尾的vendors也要及时修改。
    :::

    评论数
    + + + diff --git a/computer-science/note/theme-shoka-doc/b7629dd4.html b/computer-science/note/theme-shoka-doc/b7629dd4.html new file mode 100644 index 0000000..d36e4d0 --- /dev/null +++ b/computer-science/note/theme-shoka-doc/b7629dd4.html @@ -0,0 +1,82 @@ + + + + + + + + + + Step.3 界面显示 | VuePress + + + + + + + +

    :::primary
    🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    :::

    首页置顶文章

    在文章的Front Matter设置sticky: true,则该文章将显示在首页最上方的置顶文章列。
    多篇文章按照发布时间倒序排列,不分页。

    ---
    +title: 置顶文章
    +sticky: true
    +---
    +

    首页精选分类

    想要在首页显示分类翻转块,需要按照以下示例的方式,给需要显示的分类加上封面图。

    1. 首先,修改站点配置:
      找到category_map:,配置每个分类对应的英文映射,比如:

      category_map:
      +  计算机科学: computer-science
      +  Java: java
      +  C++: cpp
      +  二进制杂谈: note
      +  计算机程序设计(C++)-西安交通大学: course-1
      +  零基础学Java语言-浙江大学-翁恺: course-1
      +  面向对象程序设计-Java语言-浙江大学-翁恺: course-2
      +

      注意:hexo会自动处理路径中的特殊字符,~`!@#$%^&*()-_+=[]{}|\;:"'<>,.?以及空格,这些全部会被替换成-
      所以避免在设置中使用上述字符,否则可导致无法抓取到目录下的cover.jpg

    2. <root>/source/_posts文件夹相应的目录里,存放封面图
      例子:如 第1周 计算 这篇文章。
      所处的分类是

      categories:
      +- [计算机科学, Java, 零基础学Java语言-浙江大学-翁恺]
      +

      现在需要在首页显示零基础学Java语言-浙江大学-翁恺这个分类,翻转卡片后,显示这个分类下的文章们。
      而该分类经过英文映射,它的路径将是/computer-science/java/course-1/

      那么,请在<root>/source/_posts/computer-science/java/course-1/的目录下放置cover.jpg文件。
      只要分类路径对应的目录下存在cover.jpg文件,这个分类就会在首页显示。
      在进行hexo g时,本分类的封面图会自动被复制到public目录里相应的位置。

    3. 事实上,为了方便文章管理,这个分类下所有文章的md文件,我都会放在<root>/source/_posts/computer-science/java/course-1/这个目录下。

      且站点配置文件里,永久链接设置如下

      permalink: :title/
      +

      hexo g后,文章的html文件们将全部生成到<root>/public/computer-science/java/course-1/目录。
      具体可以查看本博客的github仓库

    4. 文章详情界面中的系列文章,显示的是与当前文章同一分类的其他文章,并按照文章名正序排序。

    o(* ̄▽ ̄*)ゞ
    其实,不设置category_map也可以,只要在分类路径对应的文件夹下存在cover.jpg文件就行。
    现在,这项功能与category_dir的配置也无关,hexo g生成后,图片会自动被转移到category_dir的相关子目录下。

    文章封面图

    • 如果文章的Front Matter设置了cover: image path,则封面会显示这张图片。

      title: Images
      +cover: assets/wallpaper-2572384.jpg
      +# 或者写成
      +cover: http://placehold.it/350x150.jpg
      +---
      +

      这里cover的值可以是位于source目录里的图片文件,此处是<root>/source/assets/wallpaper-2572384.jpg文件,也可以是一个某网址。

    • 如果文章是一个gallery post,即Front Matter设置了photos,则会封面会显示设置的第一张图片。

      title: Gallery Post
      +photos:
      +- assets/wallpaper-2572384.jpg
      +- assets/wallpaper-2311325.jpg
      +- assets/wallpaper-878514.jpg
      +- http://placehold.it/350x150.jpg
      +---
      +

      此时默认会显示第一个图片,即位于<root>/source/assets/目录里的wallpaper-2572384.jpg

    • 如果站点配置中设置了post_asset_folder: true,那么上述本地图片路径应为<root>/source/_posts/文章同名的文件夹/assets/wallpaper-2572384.jpg,当然此时assets目录可以省掉。

    • 如果以上设置均不存在,将显示一张随机图片,随机图库配置戳此

    图片展示与相册

    在文章的Front Matter设置fancybox: false,可以关闭文章页的图片展示功能。
    使用Justified-Gallery对Gallery Post内图案进行排列。

    下面介绍一些小技巧:

    1. 让图案下方显示title的markdown代码
    ![这里是alt](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "这里是title")
    +

    这里是alt

    1. 设置图片的大小
    ![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度和高度"){height="100px" width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度"){width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定高度"){height="100px"}
    +

    {height=“100px” width=“400px”}

    {width=“400px”}

    {height=“100px”}

    1. 除了在Front Matter里配置photos可以显示相册图案列表外,还可以这样写
    ## 图案列表No.1
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclfdu6exj20zk0m87hw.jpg "这里是title")
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclflwv2aj20zk0m84qp.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclg5ms2rj20zk0m8u0x.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclhnx9glj20zk0m8npd.jpg)
    +{.gallery}
    +
    +## 图案列表No.2
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicitht3xtj20zk0m8k5v.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclil3m4ej20zk0m8tn8.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicljgocqbj20zk0m8e81.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gipetfk5zwj20zk0m8e81.jpg)
    +{.gallery data-height="120"}
    +

    data-height用来设置每行的高度,默认为220

    图案列表No.1





    {.gallery}

    图案列表No.2





    {.gallery data-height=“120”}

    自定义页面配色

    主题配色全部在<root>/themes/shoka/source/css/_colors.styl文件中,可以自行查看。

    <root>/source/_data/目录新建文件colors.styl,在此文件中添改样式。

    自定义colors.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    主题支持在<root>/source/_data/目录建立三个自定义styl文件:

    自定义文件名对应默认样式文件样式功能
    colors.styl_colors.styl页面配色
    iconfont.styl_iconfont.styl图标样式
    custom.styl-任意自定义样式

    自定义主题图片

    如果想要修改主题的<root>/themes/shoka/source/images/目录内的某张图片,请在<root>/source/_data/目录新建目录images,并在这个文件夹中添加++同名++文件,部署时将自动覆盖主题内的默认图片。

    可以用此方法自定义头像、打赏二维码等图片,并且避免覆盖更新主题时遗失自定义文件。

    自定义语言包

    本功能参考NexT,主要可以用来定义菜单等处显示的文字,且可以方便主题无脑覆盖升级。

    <root>/source/_data/目录新建文件languages.yml

    按照以下格式添加配置项:

    # language
    +zh-CN:
    +  # items
    +  post:
    +    copyright:
    +      # the translation you perfer
    +      author: 本文博主
    +en:
    +  menu:
    +    travellings: Travellings
    +

    可以参考主题目录下的example/source/_data文件夹。

    站点配置及文件的Front Matter中,language项只支持zh-CNzh-HKzh-TWjaen
    类似写成zh_CN这样是不可以的。

    评论数
    + + + diff --git a/computer-science/note/theme-shoka-doc/d30922d5.html b/computer-science/note/theme-shoka-doc/d30922d5.html new file mode 100644 index 0000000..b3fb1ca --- /dev/null +++ b/computer-science/note/theme-shoka-doc/d30922d5.html @@ -0,0 +1,128 @@ + + + + + + + + + + Step.1 依赖插件 | VuePress + + + + + + + +

    :::primary
    🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    :::

    :::warning
    请务必将hexo-renderer-multi-markdown-it升级到最新版,目前为 0.1.5
    :::

    Theme Shoka依赖以下Hexo插件

    插件名称npm地址功能依赖程度
    hexo-renderer-multi-markdown-it链接md文件渲染器,压缩css/js/html必需
    hexo-autoprefixer链接给生成的css文件们添加浏览器前缀必需
    hexo-algoliasearch链接站内搜索功能搜索按钮失灵
    hexo-symbols-count-time链接文章或站点字数及阅读时间统计统计没有
    hexo-feed链接生成Feed文件Feed文件没有

    没有正确安装以上插件的话,本主题会报错or无法正确显示or部分功能失效。
    hexo-renderer-multi-markdown-it请注意升级到最新版

    安装完以上插件后,修改站点配置文件,加入相关配置。

    multi-markdown-it安装与配置

    安装

    1. 安装前,记得务必卸载掉默认的hexo-renderer-marked,以及别的markdown文件渲染器。

      npm un hexo-renderer-marked --save
      +# 或者
      +yarn remove hexo-renderer-marked
      +
    2. 安装

      npm i hexo-renderer-multi-markdown-it --save
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it
      +
    3. 如果安装缓慢,或者失败
      如报错

      ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
      +

      因为有一步需要下载puppeteer里的Chromium内核,基于天朝内部网络现状,这一步能不能成功要靠科学和运气,所以为了避免安装失败,需要加上--ignore-scripts跳过Chromium内核的下载。

      npm i hexo-renderer-multi-markdown-it --save --ignore-scripts
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it --ignore-scripts
      +

      puppeteer主要是用来渲染mermaid流程图,只要文章中不使用mermaid就没有任何问题,如果要使用mermaid建议还是想办法完全安装。

    配置

    1. 加入markdown配置,用来渲染md文件
    markdown:
    +  render: # 渲染器设置
    +    html: false # 过滤 HTML 标签
    +    xhtmlOut: true # 使用 '/' 来闭合单标签 (比如 <br />)。
    +    breaks: true # 转换段落里的 '\n' 到 <br>。
    +    linkify: true # 将类似 URL 的文本自动转换为链接。
    +    typographer: 
    +    quotes: '“”‘’'
    +  plugins: # markdown-it插件设置
    +    - plugin:
    +        name: markdown-it-toc-and-anchor
    +        enable: true
    +        options: # 文章目录以及锚点应用的class名称,shoka主题必须设置成这样
    +          tocClassName: 'toc'
    +          anchorClassName: 'anchor'
    +    - plugin:
    +        name: markdown-it-multimd-table
    +        enable: true
    +        options:
    +          multiline: true
    +          rowspan: true
    +          headerless: true
    +    - plugin:
    +        name: ./markdown-it-furigana
    +        enable: true
    +        options:
    +          fallbackParens: "()"
    +    - plugin:
    +        name: ./markdown-it-spoiler
    +        enable: true
    +        options:
    +          title: "你知道得太多了"
    +
    1. 加入minify配置,压缩css/js/html
    minify:
    +  html:
    +    enable: true
    +    exclude: # 排除hexo-feed用到的模板文件
    +      - '**/json.ejs'
    +      - '**/atom.ejs'
    +      - '**/rss.ejs'
    +  css:
    +    enable: true
    +    exclude:
    +      - '**/*.min.css'
    +  js:
    +    enable: true
    +    mangle:
    +      toplevel: true
    +    output:
    +    compress:
    +    exclude:
    +      - '**/*.min.js'
    +
    1. 停用默认代码高亮功能,否则代码块的mac样式不能正常显示。
      找到highlightprismjs,把enable改成false
    highlight:
    +  enable: false
    +
    +prismjs:
    +  enable: false
    +

    autoprefixer配置建议

    autoprefixer:
    +  exclude:
    +    - '*.min.css'
    +

    缺少这个插件,首页卡片翻转效果在部分浏览器中无法正确显示。

    algolia配置建议

    algolia:
    +  appId: #Your appId
    +  apiKey: #Your apiKey
    +  adminApiKey: #Your adminApiKey
    +  chunkSize: 5000
    +  indexName: #"shoka"
    +  fields:
    +    - title #必须配置
    +    - path #必须配置
    +    - categories #推荐配置
    +    - content:strip:truncate,0,2000
    +    - gallery
    +    - photos
    +    - tags
    +

    feed配置建议

    keywords: #站点关键词,用“,”分隔
    +
    +feed:
    +    limit: 20
    +    order_by: "-date"
    +    tag_dir: false
    +    category_dir: false
    +    rss:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/rss.ejs"
    +        output: "rss.xml"
    +    atom:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/atom.ejs"
    +        output: "atom.xml"
    +    jsonFeed:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/json.ejs"
    +        output: "feed.json"
    +
    评论数
    + + + diff --git a/failure.ico b/failure.ico new file mode 100644 index 0000000..254bb1e Binary files /dev/null and b/failure.ico differ diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000..003f77f Binary files /dev/null and b/favicon-16x16.png differ diff --git a/favicon-16x16.webp b/favicon-16x16.webp new file mode 100644 index 0000000..e0d52e8 Binary files /dev/null and b/favicon-16x16.webp differ diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000..ef03b24 Binary files /dev/null and b/favicon-32x32.png differ diff --git a/favicon-32x32.webp b/favicon-32x32.webp new file mode 100644 index 0000000..6e78db6 Binary files /dev/null and b/favicon-32x32.webp differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..f2a2be5 Binary files /dev/null and b/favicon.ico differ diff --git a/feed.json b/feed.json new file mode 100644 index 0000000..961418a --- /dev/null +++ b/feed.json @@ -0,0 +1,517 @@ +{ + "version": "https://jsonfeed.org/version/1", + "title": "这是一个无聊的人搭建的博客", + "home_page_url": "https://blog.dragondyt.top", + "feed_url": "https://blog.dragondyt.top/feed.json", + "description": "这是一个无聊的人搭建的博客", + "icon": "https://cdn.jsdelivr.net/gh/amehime/shoka@30732f13/images/avatar.jpg", + "author": { + "name": "Dragon Dyt" + }, + "items": [ + { + "id": "/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html", + "content_html": "

    日志

    \n
    2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: eglCreateContext: EGL_BAD_CONFIG: no ES 3 support\n2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: tid 6601: eglCreateContext(1682): error 0x3005 (EGL_BAD_CONFIG)\n2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/AndroidRuntime: FATAL EXCEPTION: GLThread 501\n    Process: com.example.opengl, PID: 6546\n    java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG\n        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1223)\n        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1214)\n        at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1064)\n        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1431)\n        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272)\n\n
    \n

    估计是电脑没显卡导致的

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html", + "title": "OpenGL环境测试", + "date_modified": "2023-09-28T07:24:11.068Z", + "date_published": "2023-09-28T07:24:11.068Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [] + }, + { + "id": "/8612fa7f/e00fc567/3632a017/af753a41.html", + "content_html": "

    \"安卓Studio打不开\"

    \n

    莫名奇妙的问题,idea能打开。难道有单独的变量设置?最后没找到。
    \n官网上的针对IDE能打开的情况,这不是废话吗,能打开什么都好说。。。

    \n

    通过bat打开后发现Android Studio 使用的是java11,而我坏境JavaHome是1.8。但是之前就很正常,而且它是自带环境的,卸载重装也没用

    \n

    最后给我的java环境升级到了java19,成功解决问题。

    \n

    问题不到,开发时可以指定java版本,外部就用最高的长期支持版吧!

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e00fc567/3632a017/af753a41.html", + "title": "安卓Studio打不开", + "date_modified": "2023-09-28T07:24:11.068Z", + "date_published": "2023-09-28T07:24:11.068Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/389d18c2.html", + "content_html": "
    public class Solution {\n  public ListNode getIntersectionNode(ListNode headA, ListNode headB) {\n    // p1 指向 A 链表头结点,p2 指向 B 链表头结点\n    ListNode p1 = headA, p2 = headB;\n    while (p1 != p2) {\n      // p1 走一步,如果走到 A 链表末尾,转到 B 链表\n      if (p1 == null) {\n        p1 = headB;\n      } else {\n        p1 = p1.next;\n      }\n      // p2 走一步,如果走到 B 链表末尾,转到 A 链表\n      if (p2 == null) {\n        p2 = headA;\n      } else {\n        p2 = p2.next;\n      }\n    }\n    return p1;\n  }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/389d18c2.html", + "title": "[160]相交链表", + "date_modified": "2022-08-04T10:20:55.000Z", + "date_published": "2022-08-04T10:20:55.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/b7e144d1/340249a9/76a66db0.html", + "content_html": "
    class Solution {\n    public int timeRequiredToBuy(int[] tickets, int k) {\n        int ret = 0;\n        for (int i = 0; i < tickets.length; i++) {\n            if (i <= k) {\n                ret = ret + Math.min(tickets[i], tickets[k]);\n            } else {\n                ret = ret + Math.min(tickets[i], tickets[k] - 1);\n            }\n        }\n        return ret;\n    }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/340249a9/76a66db0.html", + "title": "[2073]买票需要的时间", + "date_modified": "2022-08-04T09:48:19.000Z", + "date_published": "2022-08-04T09:48:19.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "二叉树" + ] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/9862a150.html", + "content_html": "
    /**\n * Definition for singly-linked list.\n * class ListNode {\n *     int val;\n *     ListNode next;\n *     ListNode(int x) {\n *         val = x;\n *         next = null;\n *     }\n * }\n */\npublic class Solution {\n  public ListNode detectCycle(ListNode head) {\n    //如果用两个指针\n    ListNode fast = head, slow = head;\n    while (fast != null && fast.next != null) {\n      fast = fast.next.next;\n      slow = slow.next;\n      if (fast == slow) {\n        break;\n      }\n    }\n    if (fast == null || fast.next == null) {\n      return null;\n    }\n    slow = head;\n    while (slow!=fast){\n        slow = slow.next;\n        fast = fast.next;\n    }\n    return slow;\n  }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/9862a150.html", + "title": "[剑指 Offer II 022]链表中环的入口节点", + "date_modified": "2022-08-03T16:10:45.000Z", + "date_published": "2022-08-03T16:10:45.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/69a9925d.html", + "content_html": "
    /**\n * Definition for singly-linked list.\n * class ListNode {\n *     int val;\n *     ListNode next;\n *     ListNode(int x) {\n *         val = x;\n *         next = null;\n *     }\n * }\n */\npublic class Solution {\n  public boolean hasCycle(ListNode head) {\n    ListNode fast = head, slow = head;\n    // 快指针走到末尾时停止\n    while (fast != null && fast.next != null) {\n      slow = slow.next;\n      fast = fast.next.next;\n      // 快慢指针相遇,说明含有环\n      if (slow == fast) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/69a9925d.html", + "title": "[141]环形链表", + "date_modified": "2022-08-03T15:57:27.000Z", + "date_published": "2022-08-03T15:57:27.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html", + "content_html": "
    /**\n * Definition for singly-linked list.\n * public class ListNode {\n *     int val;\n *     ListNode next;\n *     ListNode() {}\n *     ListNode(int val) { this.val = val; }\n *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }\n * }\n */\nclass Solution {\n  public ListNode middleNode(ListNode head) {\n    //简单的话应该是循环一遍,获取长度,如果是偶数则长度加一,然后获取中点,再循环一次\n    // 快慢指针初始化指向 head\n    ListNode slow = head, fast = head;\n    // 快指针走到末尾时停止\n    while (fast != null && fast.next != null) {\n      // 慢指针走一步,快指针走两步\n      slow = slow.next;\n      fast = fast.next.next;\n    }\n    // 慢指针指向中点\n    return slow;\n  }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html", + "title": "[876]链表的中间结点", + "date_modified": "2022-08-03T15:44:27.000Z", + "date_published": "2022-08-03T15:44:27.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/36462e02.html", + "content_html": "
    /**\n * Definition for singly-linked list.\n * public class ListNode {\n *     int val;\n *     ListNode next;\n *     ListNode() {}\n *     ListNode(int val) { this.val = val; }\n *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }\n * }\n */\nclass Solution {\n  public ListNode removeNthFromEnd(ListNode head, int n) {\n    //删除倒数第N个,那我怎么知道N的位置,链表长度不是固定的\n    //假设是1到x,那么第倒数第N个应该是 X - N + 1\n    //Y = X - N + 1 ,则\n    // 虚拟头结点\n    ListNode pre = new ListNode(0);\n    pre.next = head;\n    ListNode start = pre, end = pre;\n    // p1 先走 n 步\n    while (n != 0) {\n      start = start.next;\n      n--;\n    }\n    // p1 和 p2 同时走 x - n 步,当p1走完时,p2走了 x-n步,停在X - N + 1上\n    while (start.next != null) {\n      start = start.next;\n      end = end.next;\n    }\n    end.next = end.next.next;\n    return pre.next;\n  }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/36462e02.html", + "title": "[19]删除链表的倒数第 N 个结点", + "date_modified": "2022-08-03T15:19:58.000Z", + "date_published": "2022-08-03T15:19:58.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html", + "content_html": "
    class Solution {\n    public ListNode getKthFromEnd(ListNode head, int k) {\n        ListNode p1 = head;\n        // p1 先走 k 步\n        for (int i = 0; i < k; i++) {\n            p1 = p1.next;\n        }\n        ListNode p2 = head;\n        // p1 和 p2 同时走 n - k 步\n        while (p1 != null) {\n            p2 = p2.next;\n            p1 = p1.next;\n        }\n        // p2 现在指向第 n - k + 1 个节点,即倒数第 k 个节点\n        return p2;\n    }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html", + "title": "[剑指 Offer 22]链表中倒数第k个节点", + "date_modified": "2022-07-28T16:59:09.000Z", + "date_published": "2022-07-28T16:59:09.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html", + "content_html": "
    class Solution {\n  public ListNode mergeKLists(ListNode[] lists) {\n    if (lists.length == 0) return null;\n    // 虚拟头结点\n    ListNode dummy = new ListNode(-1);\n    ListNode p = dummy;\n    // 优先级队列,最小堆\n    PriorityQueue<ListNode> pq = new PriorityQueue<>(\n      lists.length, (a, b)->(a.val - b.val));\n    // 将 k 个链表的头结点加入最小堆\n    for (ListNode head : lists) {\n      if (head != null)\n        pq.add(head);\n    }\n\n    while (!pq.isEmpty()) {\n      // 获取最小节点,接到结果链表中\n      ListNode node = pq.poll();\n      p.next = node;\n      if (node.next != null) {\n        pq.add(node.next);\n      }\n      // p 指针不断前进\n      p = p.next;\n    }\n    return dummy.next;\n  }\n}\n
    \n

    总结:优先级队列

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html", + "title": "[23]合并K个升序链表", + "date_modified": "2022-07-28T16:10:15.000Z", + "date_published": "2022-07-28T16:10:15.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html", + "content_html": "
    class Solution {\n    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {\n      // 虚拟头结点\n      ListNode dummy = new ListNode(-1), p = dummy;\n      ListNode p1 = l1, p2 = l2;\n\n      while (p1 != null && p2 != null) {\n        // 比较 p1 和 p2 两个指针\n        // 将值较小的的节点接到 p 指针\n        if (p1.val > p2.val) {\n          p.next = p2;\n          p2 = p2.next;\n        } else {\n          p.next = p1;\n          p1 = p1.next;\n        }\n        // p 指针不断前进\n        p = p.next;\n      }\n\n      if (p1 != null) {\n        p.next = p1;\n      }\n\n      if (p2 != null) {\n        p.next = p2;\n      }\n\n      return dummy.next;\n    }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html", + "title": "[21]合并两个有序链表", + "date_modified": "2022-07-28T15:58:04.000Z", + "date_published": "2022-07-28T15:58:04.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/b7e144d1/2362a8ea/3758805c.html", + "content_html": "
    class Solution {\n  public ListNode partition(ListNode head, int x) {\n      // 存放小于 x 的链表的虚拟头结点\n      ListNode dummy1 = new ListNode(-1);\n      // 存放大于等于 x 的链表的虚拟头结点\n      ListNode dummy2 = new ListNode(-1);\n      // p1, p2 指针负责生成结果链表\n      ListNode p1 = dummy1, p2 = dummy2;\n      // p 负责遍历原链表,类似合并两个有序链表的逻辑\n      // 这里是将一个链表分解成两个链表\n      ListNode p = head;\n      while (p != null) {\n        if (p.val >= x) {\n          p2.next = p;\n          p2 = p2.next;\n        } else {\n          p1.next = p;\n          p1 = p1.next;\n        }\n        // 断开原链表中的每个节点的 next 指针\n        ListNode temp = p.next;\n        p.next = null;\n        p = temp;\n      }\n      // 连接两个链表\n      p1.next = dummy2.next;\n\n      return dummy1.next;\n    }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/3758805c.html", + "title": "[86]分隔链表", + "date_modified": "2022-07-28T15:58:04.000Z", + "date_published": "2022-07-28T15:58:04.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "链表" + ] + }, + { + "id": "/8612fa7f/79666db/7b216a3b/7cab1e06.html", + "content_html": "

    别名
    \n二叉搜索树,二叉查找树,BST,Binary Search Tree

    \n

    特点

    \n
      \n
    1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    2. \n
    3. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    4. \n
    5. 任意节点的左、右子树也分别为二叉查找树;
    6. \n
    7. 没有键值相等的节点。
    8. \n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/79666db/7b216a3b/7cab1e06.html", + "title": "二叉搜索树", + "date_modified": "2022-07-20T15:11:43.000Z", + "date_published": "2022-07-20T15:11:43.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [] + }, + { + "id": "/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html", + "content_html": "
    class Solution {\n  int rank,res = 0;\n  public int kthSmallest(TreeNode root, int k) {\n    traverse(root,k);\n    return res;\n  }\n  private void traverse(TreeNode root, int k) {\n    if (root == null) {\n      return;\n    }\n    traverse(root.left,k);\n    //二叉搜索树的特点,若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值,因此先序遍历的就是第k小\n    rank++;\n    if (k == rank) {\n      res = root.val;\n      return;\n    }\n    traverse(root.right,k);\n  }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html", + "title": "[230]二叉搜索树中第K小的元素", + "date_modified": "2022-07-20T14:24:17.000Z", + "date_published": "2022-07-20T14:24:17.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "二叉树" + ] + }, + { + "id": "/8612fa7f/b7e144d1/e85d694a/c7081503.html", + "content_html": "
    /**\n * Definition for a binary tree node.\n * public class TreeNode {\n *     int val;\n *     TreeNode left;\n *     TreeNode right;\n *     TreeNode() {}\n *     TreeNode(int val) { this.val = val; }\n *     TreeNode(int val, TreeNode left, TreeNode right) {\n *         this.val = val;\n *         this.left = left;\n *         this.right = right;\n *     }\n * }\n */\nclass Solution {\n  public TreeNode buildTree(int[] preorder, int[] inorder) {\n    return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);\n  }\n\n  private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) {\n    if (preStart > preEnd) {\n      return null;\n    }   //根的值\n    int rootVal = preorder[preStart];\n    //中序中根的位置\n    int index = 0;\n    for (int i = inStart; i <= inEnd; i++) {\n      if (inorder[i] == rootVal) {\n        index = i;\n        break;\n      }\n    }\n    //根节点左边节点数\n    int leftSize = index - inStart;\n    TreeNode root = new TreeNode(rootVal);\n    //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]\n    //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]\n    root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);\n    root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd);\n    return root;\n  }\n}\n
    \n

    改进

    \n
    class Solution {\n  Map<Integer,Integer> valOrderMap = new HashMap<>();\n  public TreeNode buildTree(int[] preorder, int[] inorder) {\n    for (int j = 0; j < inorder.length; j++) {\n      valOrderMap.put(inorder[j],j);\n    }\n    return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);\n  }\n\n  private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) {\n    if (preStart > preEnd) {\n      return null;\n    }   //根的值\n    int rootVal = preorder[preStart];\n    //中序中根的位置\n    int index = valOrderMap.get(rootVal);\n    //根节点左边节点数\n    int leftSize = index - inStart;\n    TreeNode root = new TreeNode(rootVal);\n    //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]\n    //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]\n    root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);\n    root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd);\n    return root;\n  }\n}\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/c7081503.html", + "title": "[105]从前序与中序遍历序列构造二叉树", + "date_modified": "2022-07-20T12:40:11.000Z", + "date_published": "2022-07-20T12:40:11.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "二叉树" + ] + }, + { + "id": "/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html", + "content_html": "

    路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。

    \n

    路径和 是路径中各节点值的总和。

    \n

    给你一个二叉树的根节点 root ,返回其 最大路径和。

    \n

    示例 1:
    \n\"示例
    \n输入:root = [1,2,3]
    \n输出:6
    \n解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

    \n

    示例 2:
    \n\"示例
    \n输入:root = [-10,9,20,null,null,15,7]
    \n输出:42
    \n解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

    \n

    提示:

    \n
      \n
    • 树中节点数目范围是 [1, 3 * 10⁴]
    • \n
    • -1000 <= Node.val <= 1000
    • \n
    \n

    Related Topics

    \n
      \n
    • \n
    • 深度优先搜索
    • \n
    • 动态规划
    • \n
    • 二叉树
    • \n
    • 👍 1658
    • \n
    • 👎 0
    • \n
    \n
    /**\n * Definition for a binary tree node.\n * public class TreeNode {\n *     int val;\n *     TreeNode left;\n *     TreeNode right;\n *     TreeNode() {}\n *     TreeNode(int val) { this.val = val; }\n *     TreeNode(int val, TreeNode left, TreeNode right) {\n *         this.val = val;\n *         this.left = left;\n *         this.right = right;\n *     }\n * }\n */\nclass Solution {\n  int res = Integer.MIN_VALUE;\n\n  public int maxPathSum(TreeNode root) {\n    // 后序位置\n    oneSideMax(root);\n    return res;\n  }\n\n  private int oneSideMax(TreeNode root){\n    if (root == null) {\n      return 0;\n    }\n    int left = Math.max(0, oneSideMax(root.left));\n    int right = Math.max(0, oneSideMax(root.right));\n    res = Math.max(res, left + right + root.val);\n    return Math.max(left, right) + root.val;\n  }\n}\n//leetcode submit region end(Prohibit modification and deletion)\n\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html", + "title": "[124]二叉树中的最大路径和", + "date_modified": "2022-07-20T09:34:52.000Z", + "date_published": "2022-07-20T09:34:52.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "算法", + "二叉树" + ] + }, + { + "id": "/8612fa7f/47867b98/Java/fd72446f.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # gateway配合nacos 找不到服务的问题

    \n
    gateway版本: 3.0.2\n
    \n
    nacos版本: 1.4.1\n
    \n

    \"在这里插入图片描述\"

    \n

    \"在这里插入图片描述\"
    \ngateway出错了,没有任何异常信息,增加自定义异常处理后,通过日志发现一个关键词NoLoadBalancer,突然就想到Spring Cloud2020移除了Ribbon,加入依赖后成功解决问题.

    \n
    <dependency>\n   <groupId>org.springframework.cloud</groupId>\n   <artifactId>spring-cloud-loadbalancer</artifactId>\n   <version>对应版本</version>\n</dependency>\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/47867b98/Java/fd72446f.html", + "title": "gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx", + "date_modified": "2021-05-14T17:34:35.000Z", + "date_published": "2021-05-14T17:34:35.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "java" + ] + }, + { + "id": "/8612fa7f/ec060e02/Hadoop/15d9e331.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 下载

    \n

    下载hadoop

    \n

    \"在这里插入图片描述\"

    \n

    # 配置环境变量

    \n

    \"在这里插入图片描述\"
    \npath路径
    \n\"在这里插入图片描述\"

    \n

    # 配置文件

    \n

    hadoop-3.2.2\\etc\\hadoop\\core-site.xml

    \n
    <?xml version="1.0" encoding="UTF-8"?>\n<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>\n<configuration>\n <property>\n        <name>fs.defaultFS</name>\n        <value>hdfs://localhost:9000/</value>\n </property>\n <!-- 当前用户全设置成root -->\n<property>\n<name>hadoop.http.staticuser.user</name>\n<value>root</value>\n</property>\n\n<!-- 不开启权限检查 -->\n<property>\n<name>dfs.permissions.enabled</name>\n<value>false</value>\n</property>\n\n</configuration>\n\n
    \n

    hadoop-3.2.2\\etc\\hadoop\\hdfs-site.xml

    \n
    <?xml version="1.0" encoding="UTF-8"?>\n<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>\n<configuration>\n    <property>\n        <name>dfs.namenode.name.dir</name>\n        <value>/d:/DevTools/hadoop-3.2.2/data/namenode</value>\n        <description>NameNode directory for namespace and transaction logs storage.</description>\n    </property>\n    <property>\n        <name>dfs.datanode.data.dir</name>\n        <value>/d:/DevTools/hadoop-3.2.2/data/datanode</value>\n        <description>DataNode directory</description>\n    </property>\n    <property>\n        <name>dfs.replication</name>\n        <value>2</value>\n    </property>\n</configuration>\n\n
    \n

    hadoop-3.2.2\\etc\\hadoop\\mapred-site.xml

    \n
    <?xml version="1.0"?>\n<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>\n<configuration>\n    <property>\n        <name>mapreduce.framework.name</name>\n        <value>yarn</value>\n    </property>\n</configuration>\n\n
    \n

    hadoop-3.2.2\\etc\\hadoop\\yarn-site.xml

    \n
    <?xml version="1.0"?>\n<configuration>\n<property>\n        <name>yarn.nodemanager.aux-services</name>\n        <value>mapreduce_shuffle</value>\n    </property>\n    <property>\n        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>\n        <value>org.apache.hadoop.mapred.ShuffleHandler</value>\n    </property>\n    <property>\n        <name>yarn.resourcemanager.hostname</name>\n        <value>localhost</value>\n    </property>\n</configuration>\n
    \n

    # 缺失文件

    \n

    \"在这里插入图片描述\"
    \ngithub下载

    \n

    # 遇到的问题

    \n

    \"在这里插入图片描述\"

    \n
    \n

    解决方案:安装DirectX修复工具增强版修复系统组件缺失,在C://Windows/System32目录下放置hadoop.dll

    \n
    \n

    \"在这里插入图片描述\"

    \n
    \n

    ps: 本来打算放弃的,win下的坑太多了,一顿瞎搞后终于成功了,还有点小问题

    \n
    \n

    \"在这里插入图片描述\"

    \n

    # 节点未格式化

    \n

    执行

    \n
    hdfs namenode  -format\n
    \n

    输入Y
    \n\"在这里插入图片描述\"

    \n

    # 启动

    \n

    执行命令或双击hadoop-3.2.2\\sbin下的start-all.cmd

    \n
    ./start-all.cmd\n
    \n

    # 访问8088

    \n

    \"在这里插入图片描述\"

    \n

    # 访问9000

    \n

    It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.

    \n

    # 访问9870(hadoop新版本默认)

    \n

    \"在这里插入图片描述\"

    \n

    # 关闭

    \n

    执行命令或双击hadoop-3.2.2\\sbin下的stop-all.cmd

    \n
    ./stop-all.cmd\n
    \n

    # 开发时修改权限

    \n

    core-site.xml

    \n
    <!-- 当前用户全设置成root -->\n<property>\n<name>hadoop.http.staticuser.user</name>\n<value>root</value>\n</property>\n\n<!-- 不开启权限检查 -->\n<property>\n<name>dfs.permissions.enabled</name>\n<value>false</value>\n</property>\n\n
    \n

    # 测试

    \n

    # 环境准备

    \n
      \n
    1. 使用图形界面添加等会用的的目录
    2. \n
    3. 上传测试文件word,内容为
    4. \n
    \n
    my name is abc, I can read abc.\nthis is a demo for mapreduce\nI'm learning hadoop\nhadoop and mapreduce\n
    \n

    \"在这里插入图片描述\"

    \n

    # 代码编写

    \n

    pom.xml

    \n
    ...\n        <!-- hadoop 依赖 -->\n        <dependency>\n            <groupId>org.apache.hadoop</groupId>\n            <artifactId>hadoop-hdfs</artifactId>\n            <version>2.10.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.hadoop</groupId>\n            <artifactId>hadoop-client</artifactId>\n            <version>2.10.0</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.hadoop</groupId>\n            <artifactId>hadoop-mapreduce-client-core</artifactId>\n            <version>2.10.0</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.hadoop</groupId>\n            <artifactId>hadoop-common</artifactId>\n            <version>2.10.0</version>\n        </dependency>\n...\n
    \n
    package com.hadoop.demo.mapreduce;\nimport org.apache.hadoop.conf.Configuration;\nimport org.apache.hadoop.fs.Path;\nimport org.apache.hadoop.io.IntWritable;\nimport org.apache.hadoop.io.Text;\nimport org.apache.hadoop.mapreduce.Job;\nimport org.apache.hadoop.mapreduce.lib.input.FileInputFormat;\nimport org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;\nimport java.io.IOException;\npublic class MyJob {\n    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {\n        //1 Configuration创建配置对象\n        Configuration cfg=new Configuration();\n        //2 getInstance创建job对象\n        Job job = Job.getInstance(cfg);\n        //3 set设置job,map,reduce类,map,reduce输出类\n        job.setJarByClass(MyJob.class);\n        job.setMapperClass(MyMap.class);\n        job.setReducerClass(MyReduce.class);\n        job.setOutputKeyClass(Text.class);\n        job.setOutputValueClass(IntWritable.class);\n        job.setMapOutputKeyClass(Text.class);\n        job.setMapOutputValueClass(IntWritable.class);\n        //4 FileInputFormat.addInputPath指定读取地址\n        FileInputFormat.addInputPath(job,new Path("hdfs://localhost:9000/wc/input"));\n        //5 FileOutputFormat.setOutputPath指定写入地址\n        FileOutputFormat.setOutputPath(job,new Path("hdfs://localhost:9000/wc/output"));\n        //6 waitForCompletion等待mapreduce完成\n        boolean flag = job.waitForCompletion(true);\n        //7 System.exit关闭系统\n        System.exit(flag?0:1);\n    }\n}\n
    \n
    package com.hadoop.demo.mapreduce;\nimport org.apache.hadoop.io.IntWritable;\nimport org.apache.hadoop.io.LongWritable;\nimport org.apache.hadoop.io.Text;\nimport org.apache.hadoop.mapreduce.Mapper;\nimport java.io.IOException;\npublic class MyMap extends Mapper<LongWritable,Text,Text,IntWritable> {\n    private IntWritable count=new IntWritable(1);\n    private Text w=new Text();\n    @Override\n    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {\n        //1 toString字符串转换\n        String line = value.toString();\n        //2 split分割单词\n        String[] words = line.split(" ");\n        //3 for遍历\n        for (String word:words){\n            //4 set转换Text\n            w.set(word);\n            //5 write写入\n            context.write(w,count);\n        }\n    }\n}\n
    \n
    package com.hadoop.demo.mapreduce;\nimport org.apache.hadoop.io.IntWritable;\nimport org.apache.hadoop.io.Text;\nimport org.apache.hadoop.mapreduce.Reducer;\nimport java.io.IOException;\npublic class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable> {\n    private IntWritable i=new IntWritable();\n    @Override\n    protected void reduce(Text word, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {\n        //1 int计数器\n        int sum=0;\n        //2 for遍历value\n        for (IntWritable it:values){\n            //3 get转换int\n            sum +=it.get();\n        }\n        //4 set转换IntWritable\n        i.set(sum);\n        //5 write写入\n        context.write(word,i);\n    }\n}\n
    \n

    运行main方法就可以了

    \n

    \"在这里插入图片描述\"

    \n

    # 运行结果

    \n

    \"在这里插入图片描述\"
    \n\"在这里插入图片描述\"

    \n

    # 结语

    \n

    个人感觉新版本对新手友好一下,HDFS WebUI 里可以上传文件,创建目录,2.7.1好像没有.

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/ec060e02/Hadoop/15d9e331.html", + "title": "win10下hadoop学习", + "date_modified": "2021-04-23T21:55:57.000Z", + "date_published": "2021-04-23T21:55:57.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "大数据" + ] + }, + { + "id": "/8612fa7f/47867b98/Java/9c47706b.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 编译OpenJDK

    \n

    # 安装编译环境

    \n

    # 下载openjdk

    \n

    使用git clone(如果觉得慢可以使用coding导入的jdk

    \n

    # 安装编译工具

    \n

    # 1.win下Cygwin64环境编译

    \n
      \n
    1. \n

      安装Cygwin

      \n
        \n
      1. 官方下载
      2. \n
      3. 设置下载源
        \n\"清华下载源\"
      4. \n
      \n
    2. \n
    3. \n

      需要安装的包
      \n\"cywin64需要的包\"

      \n
    4. \n
    \n
    补充:需要安装autoconf\n
    \n
      \n
    1. 编译选项&检查
    2. \n
    \n
    \nbash ./configure -with-freetype=buddle -enable-debug -with-target-bits=64 -disable-ccache\n\n
    \n
      \n
    1. 构建
    2. \n
    \n
    make all\n
    \n

    # 2.win下linux环境编译(ubuntu )

    \n
      \n
    1. \n

      需要安装的包

      \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
      包名命令
      gccsudo apt-get install build-essential
      FreeTypesudo apt-get install libfreetype6-dev
      CUPSsudo apt-get install libcups2-dev
      X11sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
      ALSAsudo apt-get install libasound2-dev
      libffisudo apt-get install libffi-dev
      Autoconfsudo apt-get install autoconf
      zipsudo apt-get install zip
      \n
    2. \n
    3. \n

      执行命令

      \n
    4. \n
    \n
     bash configure --enable-debug --with-jvm-variants=server --with-boot-jdk=/mnt/e/jdk/jdk-16 --with-tools-dir=/mnt/d/vs/2019/Community/VC/Auxiliary/Build\n
    \n

    命令解释:

    \n
    \n

    –with-boot-jdk 如果找不到正确jdk,通过该命令可以手动指定
    \njdk版本必须是编译版本的前一个版本
    \njdk需与目标平台(win/linux)一致

    \n
    \n
    \n

    –with-tools-dir 指定编译工具目录,具体指向跟编译目标有关

    \n
    \n
    \n

    注意:win下wsl默认编译win平台jdk,如果需要编译linux版本需要进行配置

    \n
    \n

    \"build.doc\"

    \n

    # 遇到的问题

    \n

    win10sdk路径包含括号
    \n\"在这里插入图片描述\"
    \n\"在这里插入图片描述\"
    \n解决:更换目录
    \n移动到正常目录(括号都不行,中文就更不行了
    \n创建软连接

    \n
       mklink /J "C:\\Program Files (x86)\\Windows Kits" "D:\\WindowsKits"\n
    \n

    当路径包含空格,路径会被截断。(参数是路径也会,最好是不要有空格)
    \n\"在这里插入图片描述\"
    \n警告
    \n\"在这里插入图片描述\"
    \n解决:执行

    \n
    make clean\n
    \n

    错误
    \n\"在这里插入图片描述\"
    \n解决:手动删除jdk下build文件夹

    \n

    # 编译成功

    \n

    \"编译成功\"
    \n验证jdk
    \n\"验证jdk\"

    \n

    ps:如果可以的话直接在linux系统下编译,就不会有这么多的路径问题

    \n

    # 调试OpenJDK

    \n

    # 安装clion

    \n

    # 因为我是java使用idea,clion和它属于一家公司产品,使用方式相似,上手容易。安装过程(略)

    \n

    # 配置clion

    \n

    根据编译jdk时使用的工具链,调试时应该选择对应的工具链,否则会出现debug无效的情况

    \n

    上一篇文章我虽然使用wsl环境编译jdk,但编译工具使用的是vs工具链,所以调试选择vs工具链。
    \n\"vs工具链\"
    \nWSL配置
    \n当成普通linux服务器进行连接即可,缺什么安装什么,一般是缺失cmake,gdb。
    \n\"wsl配置\"

    \n

    # 导入项目

    \n
      \n
    1. 导入jdk目录
    2. \n
    3. 创建CMakeLists.txt
      \n简易版(能调试,大量飘红,少部分代码能跳转)
    4. \n
    \n
    #自己版本能用就行\ncmake_minimum_required(VERSION 3.16)\nproject(jdk)\n# 添加源文件\nfile(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")\n# 添加执行配置\nadd_executable(hotspot ${SOURCE_FILES})\n
    \n

    复杂版(emmmm,我不会cmake,百度到的都是少了,有大佬教我吗

    \n
    #自己版本能用就行\ncmake_minimum_required(VERSION 3.16)\nproject(jdk)\n# 添加源文件\nfile(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")\n# 添加执行配置\nadd_executable(hotspot ${SOURCE_FILES})\n
    \n
      \n
    1. \n

      修改run configuration

      \n
        \n
      1. 修改executable为build/windows-x86_64-server-fastdebug/jdk/bin/java.exe
      2. \n
      3. 设置参数,测试用-version,可以换成类
      4. \n
      5. 删除build下before launch下的build
        \n\"配置结果\"
      6. \n
      \n
    2. \n
    \n

    # 运行结果

    \n

    断点打在src/java.base/share/native/libjli/java.c中的JavaMain函数,对c/c++不是很了解,看调用帧,这个应该是入口,下面三个点进去是汇编代码。
    \n\"调试openjdk\"

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/47867b98/Java/9c47706b.html", + "title": "win10下编译以及调试openjdk", + "date_modified": "2020-12-05T17:00:19.000Z", + "date_published": "2020-12-05T17:00:19.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "教程" + ] + }, + { + "id": "/computer-science/note/theme-shoka-doc/b7629dd4.html", + "content_html": "

    :::primary
    \n🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    \n:::

    \n

    # 首页置顶文章

    \n

    在文章的Front Matter设置sticky: true,则该文章将显示在首页最上方的置顶文章列。
    \n多篇文章按照发布时间倒序排列,不分页。

    \n
    ---\ntitle: 置顶文章\nsticky: true\n---\n
    \n

    # 首页精选分类

    \n

    想要在首页显示分类翻转块,需要按照以下示例的方式,给需要显示的分类加上封面图。

    \n
      \n
    1. \n

      首先,修改站点配置:
      \n找到category_map:,配置每个分类对应的英文映射,比如:

      \n
      category_map:\n  计算机科学: computer-science\n  Java: java\n  C++: cpp\n  二进制杂谈: note\n  计算机程序设计(C++)-西安交通大学: course-1\n  零基础学Java语言-浙江大学-翁恺: course-1\n  面向对象程序设计-Java语言-浙江大学-翁恺: course-2\n
      \n
      \n

      注意:hexo会自动处理路径中的特殊字符,~`!@#$%^&*()-_+=[]{}|\\;:"'<>,.?以及空格,这些全部会被替换成-
      \n所以避免在设置中使用上述字符,否则可导致无法抓取到目录下的cover.jpg

      \n
      \n
    2. \n
    3. \n

      <root>/source/_posts文件夹相应的目录里,存放封面图
      \n例子:如 第1周 计算 这篇文章。
      \n所处的分类是

      \n
      categories:\n- [计算机科学, Java, 零基础学Java语言-浙江大学-翁恺]\n
      \n

      现在需要在首页显示零基础学Java语言-浙江大学-翁恺这个分类,翻转卡片后,显示这个分类下的文章们。
      \n而该分类经过英文映射,它的路径将是/computer-science/java/course-1/

      \n

      那么,请在<root>/source/_posts/computer-science/java/course-1/的目录下放置cover.jpg文件。
      \n只要分类路径对应的目录下存在cover.jpg文件,这个分类就会在首页显示。
      \n在进行hexo g时,本分类的封面图会自动被复制到public目录里相应的位置。

      \n
    4. \n
    5. \n

      事实上,为了方便文章管理,这个分类下所有文章的md文件,我都会放在<root>/source/_posts/computer-science/java/course-1/这个目录下。

      \n

      且站点配置文件里,永久链接设置如下

      \n
      permalink: :title/\n
      \n

      hexo g后,文章的html文件们将全部生成到<root>/public/computer-science/java/course-1/目录。
      \n具体可以查看本博客的github仓库

      \n
    6. \n
    7. \n

      文章详情界面中的系列文章,显示的是与当前文章同一分类的其他文章,并按照文章名正序排序。

      \n
    8. \n
    \n
    \n

    o(* ̄▽ ̄*)ゞ
    \n其实,不设置category_map也可以,只要在分类路径对应的文件夹下存在cover.jpg文件就行。
    \n现在,这项功能与category_dir的配置也无关,hexo g生成后,图片会自动被转移到category_dir的相关子目录下。

    \n
    \n

    # 文章封面图

    \n
      \n
    • \n

      如果文章的Front Matter设置了cover: image path,则封面会显示这张图片。

      \n
      title: Images\ncover: assets/wallpaper-2572384.jpg\n# 或者写成\ncover: http://placehold.it/350x150.jpg\n---\n
      \n

      这里cover的值可以是位于source目录里的图片文件,此处是<root>/source/assets/wallpaper-2572384.jpg文件,也可以是一个某网址。

      \n
    • \n
    • \n

      如果文章是一个gallery post,即Front Matter设置了photos,则会封面会显示设置的第一张图片。

      \n
      title: Gallery Post\nphotos:\n- assets/wallpaper-2572384.jpg\n- assets/wallpaper-2311325.jpg\n- assets/wallpaper-878514.jpg\n- http://placehold.it/350x150.jpg\n---\n
      \n

      此时默认会显示第一个图片,即位于<root>/source/assets/目录里的wallpaper-2572384.jpg

      \n
    • \n
    • \n

      如果站点配置中设置了post_asset_folder: true,那么上述本地图片路径应为<root>/source/_posts/文章同名的文件夹/assets/wallpaper-2572384.jpg,当然此时assets目录可以省掉。

      \n
    • \n
    • \n

      如果以上设置均不存在,将显示一张随机图片,随机图库配置戳此

      \n
    • \n
    \n

    # 图片展示与相册

    \n

    在文章的Front Matter设置fancybox: false,可以关闭文章页的图片展示功能。
    \n使用Justified-Gallery对Gallery Post内图案进行排列。

    \n

    下面介绍一些小技巧:

    \n
      \n
    1. 让图案下方显示title的markdown代码
    2. \n
    \n
    ![这里是alt](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "这里是title")\n
    \n

    \"这里是alt\"

    \n
      \n
    1. 设置图片的大小
    2. \n
    \n
    ![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度和高度"){height="100px" width="400px"}\n\n![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度"){width="400px"}\n\n![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定高度"){height="100px"}\n
    \n

    \"\"{height=“100px” width=“400px”}

    \n

    \"\"{width=“400px”}

    \n

    \"\"{height=“100px”}

    \n
      \n
    1. 除了在Front Matter里配置photos可以显示相册图案列表外,还可以这样写
    2. \n
    \n
    ## 图案列表No.1\n![](https://tva3.sinaimg.cn/large/6833939bly1giclfdu6exj20zk0m87hw.jpg "这里是title")\n![](https://tva3.sinaimg.cn/large/6833939bly1giclflwv2aj20zk0m84qp.jpg)\n![](https://tva3.sinaimg.cn/large/6833939bly1giclg5ms2rj20zk0m8u0x.jpg)\n![](https://tva3.sinaimg.cn/large/6833939bly1giclhnx9glj20zk0m8npd.jpg)\n{.gallery}\n\n## 图案列表No.2\n![](https://tva3.sinaimg.cn/large/6833939bly1gicitht3xtj20zk0m8k5v.jpg)\n![](https://tva3.sinaimg.cn/large/6833939bly1giclil3m4ej20zk0m8tn8.jpg)\n![](https://tva3.sinaimg.cn/large/6833939bly1gicljgocqbj20zk0m8e81.jpg)\n![](https://tva3.sinaimg.cn/large/6833939bly1gipetfk5zwj20zk0m8e81.jpg)\n{.gallery data-height="120"}\n
    \n

    data-height用来设置每行的高度,默认为220

    \n

    # 图案列表No.1

    \n

    \"\"
    \n\"\"
    \n\"\"
    \n\"\"
    \n{.gallery}

    \n

    # 图案列表No.2

    \n

    \"\"
    \n\"\"
    \n\"\"
    \n\"\"
    \n{.gallery data-height=“120”}

    \n

    # 自定义页面配色

    \n

    主题配色全部在<root>/themes/shoka/source/css/_colors.styl文件中,可以自行查看。

    \n

    <root>/source/_data/目录新建文件colors.styl,在此文件中添改样式。

    \n
    \n

    自定义colors.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    \n
    \n

    主题支持在<root>/source/_data/目录建立三个自定义styl文件:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    自定义文件名对应默认样式文件样式功能
    colors.styl_colors.styl页面配色
    iconfont.styl_iconfont.styl图标样式
    custom.styl-任意自定义样式
    \n

    # 自定义主题图片

    \n

    如果想要修改主题的<root>/themes/shoka/source/images/目录内的某张图片,请在<root>/source/_data/目录新建目录images,并在这个文件夹中添加++同名++文件,部署时将自动覆盖主题内的默认图片。

    \n

    可以用此方法自定义头像、打赏二维码等图片,并且避免覆盖更新主题时遗失自定义文件。

    \n

    # 自定义语言包

    \n

    本功能参考NexT,主要可以用来定义菜单等处显示的文字,且可以方便主题无脑覆盖升级。

    \n

    <root>/source/_data/目录新建文件languages.yml

    \n

    按照以下格式添加配置项:

    \n
    # language\nzh-CN:\n  # items\n  post:\n    copyright:\n      # the translation you perfer\n      author: 本文博主\nen:\n  menu:\n    travellings: Travellings\n
    \n

    可以参考主题目录下的example/source/_data文件夹。

    \n
    \n

    站点配置及文件的Front Matter中,language项只支持zh-CNzh-HKzh-TWjaen
    \n类似写成zh_CN这样是不可以的。

    \n
    \n", + "url": "https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/b7629dd4.html", + "title": "Step.3 界面显示", + "date_modified": "2020-08-13T21:12:48.000Z", + "date_published": "2020-08-13T21:12:48.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "二进制杂谈", + "Theme Shoka Documentation" + ] + }, + { + "id": "/computer-science/note/theme-shoka-doc/85a3718.html", + "content_html": "

    :::primary
    \n🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    \n:::

    \n

    # 站点别称

    \n
    alternate: Yume Shoka\n
    \n

    这里设置的名称代替Logo,显示在页面顶部,以及页尾©️处

    \n

    # 静态文件目录

    \n
    statics: / #//cdn.jsdelivr.net/gh/amehime/shoka@latest/\n
    \n

    默认值是/,指使用本地静态文件
    \n可以修改成//cdn.jsdelivr.net/gh/您的github用户名/您的项目名@latest/这种形式,以使用jsDelivr进行加速。
    \nPS:jsDelivr并不是实时更新,重新生成文件后需要耐心等待

    \n
    css: css\njs: js\nimages: images\n
    \n

    静态文件所处目录的实际目录名,这些一般不改。

    \n

    # 夜间模式

    \n
    darkmode: # true\n
    \n

    默认情况下,是否开启夜间模式取决于(优先级从高到低):

    \n
      \n
    1. 访客点击页面头部切换按钮的自行选择
    2. \n
    3. 访客切换了浏览设备的主题色调
    4. \n
    5. 您的darkmode配置项
    6. \n
    \n

    # 自动定位

    \n
    auto_scroll: # false\n
    \n

    默认情况下,再次打开页面时,会自动滚动到上次浏览的位置。
    \n这个选项设为false时将停用此功能。

    \n

    # 加载动画

    \n
    # 是否显示页面加载动画loading-cat\nloader:\n  start: true # 当初次打开页面时,显示加载动画\n  switch: true # tab切换到其他页面时,显示加载动画\n
    \n

    tab切换后只是显示loading动画,实际并未重新加载页面

    \n

    # 页面特效

    \n

    单击页面的烟花效果配置如下

    \n
    fireworks:\n  enable: true # 是否启用\n  color: # 烟花颜色\n    - "rgba(255,182,185,.9)"\n    - "rgba(250,227,217,.9)"\n    - "rgba(187,222,214,.9)"\n    - "rgba(138,198,209,.9)"\n
    \n

    # 加载谷歌字体

    \n
    font:\n  enable: true\n  # Font options:\n  # `external: true` will load this font family from `host` above.\n  # `family: Times New Roman`. Without any quotes.\n  # `size: x.x`. Use `em` as unit. Default: 1 (16px)\n\n  # Global font settings used for all elements inside <body>.\n  global:\n    external: true\n    family: Mulish\n    size:\n\n  # Font settings for alternate title.\n  logo:\n    external: true\n    family: Fredericka the Great\n    size: 3.5\n\n  # Font settings for site title.\n  title:\n    external: true\n    family: Noto Serif JP\n    size: 2.5\n\n  # Font settings for headlines (<h1> to <h6>).\n  headings:\n    external: true\n    family: Noto Serif SC\n    size:\n\n  # Font settings for posts.\n  posts:\n    external: true\n    family:\n\n  # Font settings for <code> and code blocks.\n  codes:\n    external: true\n    family: Inconsolata\n
    \n

    此功能基本参考NexT。
    \n加粗标题的字体总是使用Noto Serif,为了正确友好的显示日文中的汉字,会先后加载headingstitle的字体设置。

    \n

    # iconfont图标

    \n

    主题没有直接使用Font Awesome,是因为用不到那么多icon感觉非常浪费,因此在Iconfont上重新建立了一个项目。
    \nfont-family设为ic,所有字体样式前缀为i-,具体参见<root>/themes/shoka/source/css/_iconfont.styl

    \n
    # project of https://www.iconfont.cn/\n# //at.alicdn.com/t/font_1832207_c8i9n1ulxlt.css => 1832207_c8i9n1ulxlt\niconfont: "1832207_c8i9n1ulxlt"\n
    \n

    如果需要添加或修改,请留言告诉我您的Iconfont用户名,我将把您添加到目前的项目中。

    \n

    添加权限为只读,此后您可以任意全选,批量保存到购物车中,添加至您自己的项目里,并将主题配置文件中的iconfont值改为您的项目。

    \n

    注意,您的项目应设置FontClass/Symbol 前缀i-

    \n

    <root>/source/_data/目录新建文件iconfont.styl,把新增或修改的图标样式复制到这个文件中。

    \n
    \n

    自定义iconfont.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    \n
    \n

    # 菜单与社交按钮

    \n
    menu:\n  home: / || home\n  about: /about/ || user\n  posts:\n    default: / || feather\n    archives: /archives/ || list-alt\n    categories: /categories/ || th\n    tags: /tags/ || tags\n  # friends: /friends/ || heart\n  # links: /links/ || magic\n\nsocial:\n  github: https://github.com/yourname || github || "#191717"\n  #google: https://plus.google.com/yourname || google\n  twitter: https://twitter.com/yourname || twitter || "#00aff0"\n  zhihu: https://www.zhihu.com/people/yourname || zhihu || "#1e88e5"\n  music: https://music.163.com/#/user/home?id=yourid || cloud-music || "#e60026"\n  weibo: https://weibo.com/yourname || weibo || "#ea716e"\n  about: https://about.me/yourname || address-card || "#3b5998"\n  #email: mailto:yourname@mail.com || envelope || "#55acd5"\n  #facebook: https://www.facebook.com/yourname || facebook\n  #stackoverflow: https://stackoverflow.com/yourname || stack-overflow\n  #youtube: https://youtube.com/yourname || youtube\n  #instagram: https://instagram.com/yourname || instagram\n  #skype: skype:yourname?call|chat || skype\n  #douban: https://www.douban.com/people/yourname/ || douban\n
    \n

    如上,使用||作为分隔符,依次为 链接 || 图标 || 颜色
    \n注意,只需要写图标名称,如github,则会自动转换为ic i-github
    \n十六进制颜色码需要""包绕。

    \n

    menu 支持一级子目录,子目录设置中的第一项必须为default,用来定义父级按钮的样式。

    \n

    菜单显示文字可以在语言包中定义,具体请戳这里

    \n

    # 边栏配置

    \n

    边栏可以选择在左侧,或右侧
    \n修改头像文件的地址,相对于静态文件目录images中配置的路径。

    \n
    sidebar:\n  # Sidebar Position.\n  position: left\n  #position: right\n  # Replace the default avatar image and set the url here.\n  avatar: avatar.jpg\n
    \n

    可以将自己的图片放在<root>/source/_data/images/目录,甚至以同名覆盖主题内默认的头像图片,具体请戳这里

    \n

    # 底部widgets

    \n

    目前页面底部可以显示两个小部件,即随机文章最近评论

    \n
    widgets:\n  random_posts: true # 显示随机文章\n  recent_comments: true # 显示最近评论\n
    \n

    # 字数及阅读时间统计

    \n

    安装好hexo-symbols-count-time插件后,不需要修改站点配置文件,直接使用插件默认配置就行。

    \n

    需要修改主题配置文件,找到两处cout,修改为true

    \n
    # 页尾全站统计\nfooter:\n  since: 2010\n  count: true\n\n# 文章界面统计\npost:\n  count: true\n
    \n

    # 文章评论

    \n

    如何获取LeanCloud的appId和appKey

    \n
    valine:\n  appId: #Your_appId\n  appKey: #Your_appkey\n  placeholder: ヽ(○´∀`)ノ♪ # Comment box placeholder\n  avatar: mp # Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro\n  pageSize: 10 # Pagination size\n  lang: zh-CN.ts-CN\n  visitor: true # 文章访问量统计\n  NoRecordIP: false # 不记录IP\n  serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)\n  powerMode: true # 默认打开评论框输入特效\n  tagMeta:\n    visitor: 新朋友\n    master: 主人\n    friend: 小伙伴\n    investor: 金主粑粑\n  tagColor:\n    master: "var(--color-orange)"\n    friend: "var(--color-aqua)"\n    investor: "var(--color-pink)"\n  tagMember:\n    master:\n      # - hash of master@email.com\n      # - hash of master2@email.com\n    friend:\n      # - hash of friend@email.com\n      # - hash of friend2@email.com\n    investor:\n      # - hash of investor1@email.com\n
    \n

    tag标签显示在评论者名字的后面,默认是tagMeta.visitor对应的值。
    \n在tagMetatagColor中,除了visitor这个key不能修改外,其他key都可以换一换,但需要保证一致性。

    \n
      tagMeta:\n    visitor: 游客\n    admin: 管理员\n    waifu: 我老婆\n  tagColor:\n    visitor: "#855194"\n    admin: "#a77c59"\n    waifu: "#ed6ea0"\n  tagMember:\n    admin:\n      # - hash of admin@email.com\n    waifu:\n      # - hash of waifu@email.com\n
    \n

    在文章Front Matter中也可以配置上述参数,访问该文章页面时,将覆盖全局配置。
    \n尤其可以用来配置一个特殊的placeholder。

    \n
    valine:\n  placeholder: "1. 提问前请先仔细阅读本文档⚡\\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"\n---\n
    \n

    评论通知与管理工具建议使用这个Valine-Admin
    \n注意SITE_URL需要以/结尾。

    \n

    如果某一篇文章需要关闭评论功能,则在文章Front Matter中配置:

    \n
    ---\ntitle: 关闭评论\ncomment: false\n---\n
    \n

    # 背景音乐

    \n

    在主题配置文件中,设置全局播放列表。
    \n在文章的 Front Matter 中,设置文章专有播放列表,访问该文章页面时,将覆盖全局配置。

    \n
    audio:\n  - https://music.163.com/song?id=1387098940\n  - https://music.163.com/#/playlist?id=2088001742\n  - https://www.xiami.com/collect/250830668\n  - https://y.qq.com/n/yqq/playsquare/3535982902.html\n
    \n

    如上,可以直接使用网易云、虾米、QQ音乐的播放列表、单曲,可以同时填写多个。

    \n
    audio:\n  - title: 列表1\n    list:\n      - https://music.163.com/#/playlist?id=2943811283\n      - https://music.163.com/#/playlist?id=2297706586\n  - title: 列表2\n    list:\n      - https://music.163.com/#/playlist?id=2031842656\n
    \n

    如果需要自定义媒体文件,可以按照以下格式填写:

    \n
    audio:\n  - name: "曲目1"\n    url: "播放地址"\n    artist: "艺术家"\n    cover: "封面"\n    lrc: "歌词"\n  - name: "曲目2"\n    url: "播放地址"\n    artist: "艺术家"\n    cover: "封面"\n    lrc: "歌词"\n
    \n
    audio:\n    - title: 列表1\n      list:\n        - name: "曲目1"\n          url: "播放地址"\n          artist: "艺术家"\n          cover: "封面"\n          lrc: "歌词"\n        - name: "曲目2"\n          url: "播放地址"\n          artist: "艺术家"\n          cover: "封面"\n          lrc: "歌词"\n    - title: 列表2\n      list:\n        - https://music.163.com/#/playlist?id=2031842656\n
    \n

    如果要关闭当前页面的背景音乐播放器,则在文章Front Matter中配置:

    \n
    ---\ntitle: 关闭背景音乐\naudio: false\n---\n
    \n

    # 随机图库

    \n
      \n
    • \n

      默认的图片列表位于<root>/themes/shoka/_images.yml中。
      \n使用了渣浪图库,使用一些上传工具,比如这里
      \n上传后图片的链接是http://wx4.sinaimg.cn/large/6833939bly1gicmnywqgpj20zk0m8dwx.jpg
      \n只需要新一行写上- 6833939bly1gicmnywqgpj20zk0m8dwx.jpg

      \n

      如果想要自定义,则在<root>/source/_data/目录新建一个images.yml文件,这个文件中的图片至少6枚,将完全覆盖默认的图片列表。

      \n
    • \n
    • \n

      也可以直接在图片列表yml文件中,写上任意外链图片地址

      \n
    • \n
    \n
    - https://i.loli.net/2020/10/30/qAMYEFXxJcKRsiG.gif\n- https://i.loli.net/2020/10/30/rjdhcSgEN8COBPA.jpg\n- https://i.loli.net/2020/10/30/HKyzSd7NI3mlBpt.jpg\n- https://i.loli.net/2020/10/30/Y1CBXqgeokEs457.jpg\n- https://i.loli.net/2020/10/30/Z5W6r2BSoiThHG1.jpg\n
    \n
      \n
    • 也可以在主题配置文件中,设置图床API:
    • \n
    \n
    image_server: "https://acg.xydwz.cn/api/api.php"\n
    \n

    # 加载第三方组件

    \n
    vendors:\n  css:\n    # 略略略\n  js:\n    # 略略略\n
    \n

    包括

    \n

    –|–|–
    \npace | 加载进度条|全局
    \npjax | 页面无刷新加载|全局
    \nanime | js动画效果|全局
    \nalgolia instantsearch| 基于algolia的站内搜索|全局
    \nlazyload | 图片懒加载|全局
    \nquicklink | 链接资源预加载|全局
    \nfetch | 获取播放列表|全局
    \nkatex copy_tex|数学公式显示及复制|按需
    \nfancybox | 图片放大显示及排列|按需
    \nvaline | 基于LeanCloud的评论系统及文章阅读次数统计|按需
    \nchart | 图表显示|按需

    \n

    以上文件加载全部基于jsDelivr,并对全局加载的组件进行了文件合并。
    \n如果不明白啥意思,则不要轻易修改。

    \n

    :::danger
    \n主题版本升级的时候,可能会修改这里。
    \n如果修改过主题默认_config.yml,记得更新主题时,末尾的vendors也要及时修改。
    \n:::

    \n", + "url": "https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/85a3718.html", + "title": "Step.2 基本配置", + "date_modified": "2020-08-13T20:56:48.000Z", + "date_published": "2020-08-13T20:56:48.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "二进制杂谈", + "Theme Shoka Documentation" + ] + }, + { + "id": "/computer-science/note/theme-shoka-doc/d30922d5.html", + "content_html": "

    :::primary
    \n🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    \n:::

    \n

    :::warning
    \n请务必将hexo-renderer-multi-markdown-it升级到最新版,目前为 0.1.5
    \n:::

    \n

    Theme Shoka依赖以下Hexo插件

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    插件名称npm地址功能依赖程度
    hexo-renderer-multi-markdown-it链接md文件渲染器,压缩css/js/html必需
    hexo-autoprefixer链接给生成的css文件们添加浏览器前缀必需
    hexo-algoliasearch链接站内搜索功能搜索按钮失灵
    hexo-symbols-count-time链接文章或站点字数及阅读时间统计统计没有
    hexo-feed链接生成Feed文件Feed文件没有
    \n
    \n

    没有正确安装以上插件的话,本主题会报错or无法正确显示or部分功能失效。
    \nhexo-renderer-multi-markdown-it请注意升级到最新版

    \n
    \n

    安装完以上插件后,修改站点配置文件,加入相关配置。

    \n

    # multi-markdown-it安装与配置

    \n

    # 安装

    \n
      \n
    1. \n

      安装前,记得务必卸载掉默认的hexo-renderer-marked,以及别的markdown文件渲染器。

      \n
      npm un hexo-renderer-marked --save\n# 或者\nyarn remove hexo-renderer-marked\n
      \n
    2. \n
    3. \n

      安装

      \n
      npm i hexo-renderer-multi-markdown-it --save\n# 或者\nyarn add hexo-renderer-multi-markdown-it\n
      \n
    4. \n
    5. \n

      如果安装缓慢,或者失败
      \n如报错

      \n
      ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.\n
      \n

      因为有一步需要下载puppeteer里的Chromium内核,基于天朝内部网络现状,这一步能不能成功要靠科学和运气,所以为了避免安装失败,需要加上--ignore-scripts跳过Chromium内核的下载。

      \n
      npm i hexo-renderer-multi-markdown-it --save --ignore-scripts\n# 或者\nyarn add hexo-renderer-multi-markdown-it --ignore-scripts\n
      \n

      puppeteer主要是用来渲染mermaid流程图,只要文章中不使用mermaid就没有任何问题,如果要使用mermaid建议还是想办法完全安装。

      \n
    6. \n
    \n

    # 配置

    \n
      \n
    1. 加入markdown配置,用来渲染md文件
    2. \n
    \n
    markdown:\n  render: # 渲染器设置\n    html: false # 过滤 HTML 标签\n    xhtmlOut: true # 使用 '/' 来闭合单标签 (比如 <br />)。\n    breaks: true # 转换段落里的 '\\n' 到 <br>。\n    linkify: true # 将类似 URL 的文本自动转换为链接。\n    typographer: \n    quotes: '“”‘’'\n  plugins: # markdown-it插件设置\n    - plugin:\n        name: markdown-it-toc-and-anchor\n        enable: true\n        options: # 文章目录以及锚点应用的class名称,shoka主题必须设置成这样\n          tocClassName: 'toc'\n          anchorClassName: 'anchor'\n    - plugin:\n        name: markdown-it-multimd-table\n        enable: true\n        options:\n          multiline: true\n          rowspan: true\n          headerless: true\n    - plugin:\n        name: ./markdown-it-furigana\n        enable: true\n        options:\n          fallbackParens: "()"\n    - plugin:\n        name: ./markdown-it-spoiler\n        enable: true\n        options:\n          title: "你知道得太多了"\n
    \n
      \n
    1. 加入minify配置,压缩css/js/html
    2. \n
    \n
    minify:\n  html:\n    enable: true\n    exclude: # 排除hexo-feed用到的模板文件\n      - '**/json.ejs'\n      - '**/atom.ejs'\n      - '**/rss.ejs'\n  css:\n    enable: true\n    exclude:\n      - '**/*.min.css'\n  js:\n    enable: true\n    mangle:\n      toplevel: true\n    output:\n    compress:\n    exclude:\n      - '**/*.min.js'\n
    \n
      \n
    1. 停用默认代码高亮功能,否则代码块的mac样式不能正常显示。
      \n找到highlightprismjs,把enable改成false
    2. \n
    \n
    highlight:\n  enable: false\n\nprismjs:\n  enable: false\n
    \n

    # autoprefixer配置建议

    \n
    autoprefixer:\n  exclude:\n    - '*.min.css'\n
    \n

    缺少这个插件,首页卡片翻转效果在部分浏览器中无法正确显示。

    \n

    # algolia配置建议

    \n
    algolia:\n  appId: #Your appId\n  apiKey: #Your apiKey\n  adminApiKey: #Your adminApiKey\n  chunkSize: 5000\n  indexName: #"shoka"\n  fields:\n    - title #必须配置\n    - path #必须配置\n    - categories #推荐配置\n    - content:strip:truncate,0,2000\n    - gallery\n    - photos\n    - tags\n
    \n

    # feed配置建议

    \n
    keywords: #站点关键词,用“,”分隔\n\nfeed:\n    limit: 20\n    order_by: "-date"\n    tag_dir: false\n    category_dir: false\n    rss:\n        enable: true\n        template: "themes/shoka/layout/_alternate/rss.ejs"\n        output: "rss.xml"\n    atom:\n        enable: true\n        template: "themes/shoka/layout/_alternate/atom.ejs"\n        output: "atom.xml"\n    jsonFeed:\n        enable: true\n        template: "themes/shoka/layout/_alternate/json.ejs"\n        output: "feed.json"\n
    \n", + "url": "https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/d30922d5.html", + "title": "Step.1 依赖插件", + "date_modified": "2020-08-13T20:46:48.000Z", + "date_published": "2020-08-13T20:46:48.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "二进制杂谈", + "Theme Shoka Documentation" + ] + }, + { + "id": "/computer-science/note/79abcd0d.html", + "content_html": "

    :::info
    \n跳票N久终于更新的简单的使用说明

    \n\n

    已经支持hexo 5。
    \n:::

    \n

    :::info
    \n因博主被学业和工作掏空,本项目已停滞更新大半年,问题也无法及时回复大家,这个悲惨状态可能还要持续半年的样子。

    \n

    有很多热心小伙伴在评论区或者项目issue帮忙回答问题,非常非常感谢!

    \n

    本项目是完全开源的,也有做一些example示例,大家可以随便拿随便改。
    \n但是很抱歉,博主我暂时不能提供更多的支持,这个写的乱七八糟的文档,暂时也没有时间把它写得更专业一些。
    \n非常对不住大家!

    \n

    iconfont的添加申请,我看到留言后会尽快加上,希望各位小伙伴能看到。
    \n:::

    \n

    :::warning
    \n当前版本更新至 0.2.5,更新记录点此

    \n

    :::

    \n

    :::primary
    \n🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    \n:::

    \n

    # 设计缘由

    \n

    前几年在Bear和Evernote上整理了大量笔记,非常喜欢Bear默认的markdown渲染样式。
    \n后来因为换了安卓手机,用不了Bear,四处搜寻替代品,没有满意的。
    \n然后阴差阳错知道了Hexo,又得知Github也可以免费建私有仓库了,故再次转移阵地到了自建博客,并部署在Github Pages。

    \n

    因为这个博客是用来记笔记的,故起名书架
    \n对应的主题即Theme.Shoka,可以说是为了笔记阅读而生的主题。
    \n样式严重参考Bear,部分代码严重参考NexT

    \n

    Hexo的默认及常用渲染器均使用highlight.js进行代码高亮,而我喜欢Prism.js,故重写了一个渲染器配合主题食用。
    \n渲染器取名multi,因为集成了很多很多很多markdown-it插件,以及压缩静态文件的功能。
    \n(最新版的默认渲染器也支持Prism.js了,可喜可贺,但不想用,哈哈哈哈哈哈哈

    \n

    墙内Github Pages访问速度时而感人,所以用了jsDelivr加速,主要是因为它可以按需合并依赖文件。

    \n

    # 快速安装

    \n
    # cd your-blog\ngit clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka\n
    \n

    打开主题目录,内有example文件夹,提供了配置文件的demo供参考。

    \n

    # 安装依赖插件

    \n

    在应用主题之前,必须至少安装 hexo-renderer-multi-markdown-it 渲染插件 和 hexo-autoprefixer

    \n

    插件安装与配置教程戳此

    \n

    # 应用主题

    \n

    # 修改站点配置

    \n

    修改站点配置文件<root>/_config.yml,把主题改为 shoka

    \n
    theme: shoka\n
    \n

    # 修改主题配置

    \n

    主题配置的所有参数在<root>/themes/shoka/_config.yml文件中。

    \n

    为了方便主题升级,请在根目录新建一个yml文件,命名为_config.shoka.yml
    \n也就是说,所有主题的自定义配置均保存于<root>/_config.shoka.yml文件。

    \n

    主题的基础配置可以参考这里
    \n界面显示相关的配置参考这里

    \n

    # 更新记录

    \n

    标签含义:
    \n❗ 需要手动操作的更新信息
    \n⚠️ 需要注意的更新信息
    \n🔧 已修复的问题
    \n⌛ TODO

    \n

    # 0.2.4 👉 0.2.5

    \n

    💡 避免直接修改主题文件,添加各种自定义:

    \n\n

    🔧 修复一些BUG

    \n

    # 0.2.3 👉 0.2.4

    \n

    ⚠️ 评论功能更新

    \n
      \n
    • MiniValine魔改版更新至beta10,修改过主题默认_config.yml的同学,记得更新末尾的vendors到最新哦
    • \n
    • ❗ 评论相关的配置有更新,配置戳此\n
        \n
      • 主要增加的Tag配置,现在可以各种自定义啦
      • \n
      \n
    • \n
    \n

    ⚠️ 配置新增

    \n\n

    ⚠️ 背景音乐功能增强,配置戳此

    \n
      \n
    • 可以添加多个播放列表
    • \n
    • 加了一些控制按钮
    • \n
    \n

    ⚠️ 增加media标签,在文章中插入音频和视频播放列表,方法戳此
    \n⌛ 视频播放器有待增强(显示分段标签,字幕)

    \n

    🔧 随机图库支持非渣浪图床的任意图片
    \n🔧 还有许多小BUG

    \n

    # 0.2.2 👉 0.2.3

    \n

    ❗ 增加主题文件外自定义语言包的功能,配置戳此
    \n🔧 提高低版本浏览器兼容性

    \n

    # 0.2.1 👉 0.2.2

    \n

    ⚠️ 弃用mediumzoom,改成fancybox配置戳此
    \n💡 增加语言包:繁体中文日语
    \n💡 quiz功能优化,根据语言显示题型标签
    \n🔧 修复评论功能中反复初始化leancloud-storage
    \n🔧 修复audio: false时不能隐藏播放按钮、停止播放

    \n

    # 0.2 👉 0.2.1

    \n

    ⚠️ 配置文件添加 loader 参数,配置戳此
    \n💡 二级list区别显示
    \n🔧 修复浏览位置定位BUG
    \n🔧 修复firework动画延迟
    \n🔧 优化评论功能

    \n

    # 0.1.9 👉 0.2

    \n

    ⚠️ 评论功能大改

    \n
      \n
    • 弃用不开源的Valine,改用MiniValine,并且进行了魔改,项目戳此
      \n主要是大量压缩了代码,弃用一些花里胡哨的功能,又加了一些别的花里胡哨的功能。
    • \n
    • 为防止泄露用户邮箱、IP等隐私信息,弃用QQ号获取昵称及头像。
      \n❗ 同时需要手动进行一些迁移,具体步骤戳此
    • \n
    • ❗ 评论相关的配置亦有更新,配置戳此
    • \n
    \n

    ⚠️ 增加单击页面烟花效果,配置戳此
    \n💡 弃用Velocity,改用anime.js,方便未来添加更多!!花里胡哨的!!功能!!严重拖慢页面滑行速度!!
    \n🔧 新增多枚icon,包括豆瓣i-douban
    \n🔧 一些显示问题

    \n", + "url": "https://blog.dragondyt.top/computer-science/note/79abcd0d.html", + "title": "Hexo主题Shoka & multi-markdown-it渲染器使用说明", + "date_modified": "2020-08-13T20:45:48.000Z", + "date_published": "2020-08-13T20:45:48.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机科学", + "二进制杂谈", + "Theme Shoka Documentation" + ] + }, + { + "id": "/8612fa7f/47867b98/Java/c82dcf86.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 前言

    \n

      今天做了一个自动打卡工具,准备搭建邮件服务,反馈打卡结果。使用的邮箱是yandex mail。出现Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF],记录一下。

    \n

    # 邮箱准备

    \n

      使用邮箱没有要求,支持smtp就行

    \n

    # 注册邮箱

    \n

    yandex mail注册地址

    \n

    # 登录邮箱

    \n

      登录邮箱后可能会提示开启smtp。

    \n

    这里是官方提供打开smtp的文档,还记录了端口号。
    \n\"官方文档表示端口是465\"

    \n

    # 启用smtp

    \n

      邮箱首页右上角的齿轮>security> Email clients>
    \n\"smtp启用页面\"
    \n这里我使用outlook测试了连接,使用的端口是465,附连接成功图。

    \n

    \"连接成功图\"

    \n

    # 邮件协议

    \n

    # SMTP 协议

    \n

    SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。提供了SSL加密的SMTP协议被称为SMTPS,SMTP使用TCP端口25,SMTPS使用TCP端口465

    \n

    # POP3 协议

    \n

    POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S,POP3 默认端口110,POP3S默认端口995

    \n

    # IMAP 协议

    \n

    IMAP(Internet Mail Access Protocol)以前称作交互邮件访问协议(Interactive Mail Access Protocol),是一个应用层协议。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作,提供了SSL加密的IMAP协议被称为IMAP S,POP3 默认端口143,POP3S默认端口993

    \n

    # 搭建步骤及简单使用

    \n

    # mail依赖

    \n

    build.gradl文件

    \n
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.3.2.RELEASE'\n
    \n

    # yml配置文件

    \n
    server:\n  port: 80\nlogging:\n  level:\n    web: debug\nspring:\n  mail:\n    default-encoding: UTF-8\n    host: smtp.yandex.com\n    username: xxx@xxx.xx\n    password: 123456\n    port: 25 #smtp协议使用25端口 \n#    port: 465 #smtps使用465端口,不然报错。\n    protocol: smtp #指定协议\n    test-connection: true\n    properties:\n      mail:\n        smtp:\n          auth: true # 使用\n          starttls: # 使用 SSL 安全协议,须如下配置\n            enable: true\n            required: true\n
    \n

    # java代码

    \n
    # MailService 接口文件
    \n
    public interface MailService {\n\n    /**\n     * 发送纯文本邮件\n     * @param toAddr 收件人\n     * @param title 标题\n     * @param content 内容\n     */\n    void sendTextMail(String toAddr, String title, String content);\n\n    /**\n     * 发送 html 邮件\n     * @param toAddr 收件人\n     * @param title 标题\n     * @param content 内容(HTML)\n     */\n    void sendHtmlMail(String toAddr, String title, String content);\n\n    /**\n     *  发送待附件的邮件\n     * @param toAddr 收件人\n     * @param title 标题\n     * @param content 内容\n     * @param filePath 附件地址\n     */\n    void sendAttachmentsMail(String toAddr, String title, String content, String filePath);\n\n    /**\n     *  发送文本中有静态资源(图片)的邮件\n     * @param toAddr 收件人\n     * @param title 标题\n     * @param content 内容\n     * @param rscPath 资源路径\n     * @param rscId 资源id (可能有多个图片)\n     */\n    void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId);\n\n}\n
    \n
    # MailServiceImpl文件
    \n
    @Component\npublic class MailServiceImpl implements MailService {\n\n    private final Logger logger = LoggerFactory.getLogger(this.getClass());\n\n    private final JavaMailSender mailSender;\n\n    /**\n     * 注入常量\n     */\n\n    @Value("${spring.mail.username}")\n    private String from;\n\n    public MailServiceImpl(JavaMailSender mailSender) {\n        this.mailSender = mailSender;\n    }\n\n    /**\n     * 发送文本邮件\n     *\n     * @param toAddr  收件人\n     * @param title   标题\n     * @param content 内容\n     */\n    @Override\n    public void sendTextMail(String toAddr, String title, String content) {\n        // 纯文本邮件对象\n        SimpleMailMessage message = new SimpleMailMessage();\n        message.setFrom(from);\n        message.setTo(toAddr);\n        message.setSubject(title);\n        message.setText(content);\n\n        try {\n            mailSender.send(message);\n            if (logger.isInfoEnabled()) {\n                logger.info("Text邮件已经发送。");\n            }\n        } catch (Exception e) {\n            logger.error("发送Text邮件时发生异常!", e);\n        }\n\n    }\n    \n    /**\n     * 发送 html 邮件\n     *\n     * @param toAddr  收件人\n     * @param title   标题\n     * @param content 内容(HTML)\n     */\n    @Override\n    public void sendHtmlMail(String toAddr, String title, String content) {\n        // html 邮件对象\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            //true表示需要创建一个multipart message\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(toAddr);\n            helper.setSubject(title);\n            helper.setText(content, true);\n\n            mailSender.send(message);\n            if (logger.isInfoEnabled()) {\n                logger.info("html邮件发送成功");\n            }\n        } catch (MessagingException e) {\n            logger.error("发送html邮件时发生异常!", e);\n        }\n    }\n\n\n    /**\n     * 发送待附件的邮件\n     *\n     * @param toAddr   收件人\n     * @param title    标题\n     * @param content  内容\n     * @param filePath 附件地址\n     */\n    @Override\n    public void sendAttachmentsMail(String toAddr, String title, String content, String filePath) {\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(toAddr);\n            helper.setSubject(title);\n            helper.setText(content, true);\n\n            FileSystemResource file = new FileSystemResource(new File(filePath));\n            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));\n            helper.addAttachment(fileName, file);\n            mailSender.send(message);\n            if (logger.isInfoEnabled()) {\n                logger.info("带附件的邮件已经发送。");\n            }\n        } catch (MessagingException e) {\n            logger.error("发送带附件的邮件时发生异常!", e);\n        }\n    }\n\n\n    /**\n     * 发送文本中有静态资源(图片)的邮件\n     *\n     * @param toAddr  收件人\n     * @param title   标题\n     * @param content 内容\n     * @param rscPath 资源路径\n     * @param rscId   资源id (可能有多个图片)\n     */\n    @Override\n    public void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId) {\n        MimeMessage message = mailSender.createMimeMessage();\n\n        try {\n            MimeMessageHelper helper = new MimeMessageHelper(message, true);\n            helper.setFrom(from);\n            helper.setTo(toAddr);\n            helper.setSubject(title);\n            helper.setText(content, true);\n\n            FileSystemResource res = new FileSystemResource(new File(rscPath));\n            helper.addInline(rscId, res);\n\n            mailSender.send(message);\n            if (logger.isInfoEnabled()) {\n                logger.info("嵌入静态资源的邮件已经发送。");\n            }\n        } catch (MessagingException e) {\n            logger.error("发送嵌入静态资源的邮件时发生异常!", e);\n        }\n    }\n}\n
    \n
    # 测试类
    \n
    @SpringBootTest\nclass ClockInApplicationTests {\n    @Autowired\n    MailService mailService;\n    @Test\n    void sendTextMail(){\n        mailService.sendTextMail("vlnrjp92486@chacuo.net","单元测试","测试邮件发送");\n    }\n}\n
    \n

    # 运行结果

    \n

    如标题所述,出现了异常
    \n\"异常图\"
    \n使用协议对应端口后发送成功,附图。
    \n\"单元测试通过\"

    \n

    # 结语

    \n

      通过这个实践,我觉要写代码前还是要做很多准备,或者说我了解的东西不过全面。出错后百度异常信息怎么都找不到,想着哪里出错了,之前使用outlook连接测试通过,应该就是代码问题。后来看到很多人使用25端口发送,然后去百度端口才发现协议与端口不一致。所以我觉得写代码前的准备不充分或者知识储备不足,这个重要信息都不了解。

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/47867b98/Java/c82dcf86.html", + "title": "使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF]", + "date_modified": "2020-07-29T21:54:35.000Z", + "date_published": "2020-07-29T21:54:35.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "Springboot" + ] + }, + { + "id": "/8612fa7f/e00fc567/5ac6f809/aa3015f4.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 记录一次安卓反编译过程

    \n

    下周就要安卓课设,而我的课设作业是开发一个记事本,我发现我小米手机上的便签挺好的,于是想参考一下布局以及实现。

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    软件apktooldex2jarjd-jui
    版本2.4.12.10.3.5
    \n

    # 准备工作

    \n
      \n
    1. \n

      获取小米便签
      \n网上没有最新版下载,通过Es文件浏览器导出apk。
      \n也可以通过mt浏览器,因为后面需要三个framework文件,Es浏览器和Re浏览器好像屏蔽了根目录,不能访问了。

      \n
    2. \n
    3. \n

      下载反编译相关工具
      \n菜鸟教程三个工具,版本低,

      \n
    4. \n
    5. \n

      我使用的三个工具 密码:7uyi

      \n
    6. \n
    \n

    # 开始反编译

    \n
    apktool.bat d base.apk\n
    \n

    \"Could

    \n

    这个是由于apktool版本低导致的,下载最新的重命名为apktool.jar替换即可
    \n更新最新apktool后再次执行命令,还是失败,错误信息如下:

    \n
    W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e\nW: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e\nW: Could not decode attr value, using undecoded value instead: ns=android, name=id, value=0x100b0001\nW: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e\nW: Could not decode attr value, using undecoded value instead: ns=, name=layout, value=0x10030009\nW: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f\nW: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058\nW: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f\nW: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d008f\nW: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e\nW: Could not decode attr value, using undecoded value instead: ns=android, name=height, value=0x100a0003\nW: Could not decode attr value, using undecoded value instead: ns=android, name=width, value=0x100a0003\nI: Decoding values */* XMLs...\nCan't find framework resources for package of id: 16. You must install proper framework files, see project website for more info.\n
    \n

    查看一下反编译结果,发现资源以及提取出来,但是没有任何代码。
    \n百度了最后一句话发现,有些应用需要提供额外框架,具体信息可以查看一下博文Android逆向工程:解决针对小米系统应用,使用Apktool反编译失败问题!

    \n

    根据博文我提取了文章中提到的framework-res.apk,framework-ext-res.apk,miui.apk。
    \n\"文件列表\"

    \n

    执行一下命令安装:

    \n
    apktool if framework-res.apk\napktool if framework-ext-res.apk\napktool if miui.apk\n
    \n

    安装完成后发现缺少的16号对应framework-ext-res.apk

    \n

    \"缺少的16号\"

    \n

    再次执行 apktool.bat d base.apk 后发现还有问题,提示缺少了id为18的框架文件

    \n

    \"缺少了id为18的框架文件\"

    \n

    我有点头疼,我怎么知道18号是什么文件,于是尝试导入其他文件,搜索framework,找到了一个名为XiaomiServiceFramework.apk的文件,并进行安装;

    \n

    \"apktool

    \n

    根据上图,我发现这个文件不是我们需要的,但它提供了一个信息:
    \n++I: Decoding Shared Library (miui.system), pkgId: 18++
    \n于是我去搜索system,经过筛选找到miuisystem.apk,进行安装,发现他就是我们需要的18号:

    \n

    \"apktool
    \n再次反编译没有报错,查看文件发现Smali代码成功获取:

    \n

    \"成功截图\"

    \n

    反编译到此结束,会smali语法的大佬已经可以阅读代码了,不会的可以使用工具转java再阅读

    \n

    # 使用dex2jar将dex转成jar

    \n
      \n
    1. 将base.apk当成压缩包打开
    2. \n
    3. 提取 classes.dex,classes2.dex
      \n执行命令:
    4. \n
    \n
    d2j-dex2jar.bat classes.dex\nd2j-dex2jar.bat classes2.dex\n
    \n

    \"d2j-dex2jar.bat
    \n这个也是版本低导致的,下载最新的就可以了
    \n再次执行,出了新问题,我之前没遇到

    \n
    C:\\Users\\dyt\\Desktop\\dex-tools-2.1-SNAPSHOT>d2j-dex2jar.bat classes.dex\ndex2jar classes.dex -> .\\classes-dex2jar.jar\nDetail Error Information in File .\\classes-error.zip\nPlease report this file to one of following link if possible (any one).\n    https://sourceforge.net/p/dex2jar/tickets/\n    https://bitbucket.org/pxb1988/dex2jar/issues\n    https://github.com/pxb1988/dex2jar/issues [no attachment support, not preferred]\n    dex2jar@googlegroups.com\n
    \n

    换了一个多了后缀的2.1版本,成功解决,但我不记得在哪下的了

    \n

    \"成功获取jar\"

    \n

    \"获取的jar\"

    \n

    # 使用jd-gui查看

    \n

    这个就是软件使用了,跟一般软件没区别,将jar包拖到jd-gui.exe就行了,不多说,自己体会。

    \n

    \"使用截图\"

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/aa3015f4.html", + "title": "Android逆向工程:使用Apktool反编译小米便签", + "date_modified": "2020-06-04T10:54:35.000Z", + "date_published": "2020-06-04T10:54:35.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "安卓" + ] + }, + { + "id": "/8612fa7f/e00fc567/5ac6f809/c4877271.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 安卓实验–内容提供器

    \n

    # 日常踩雷

    \n
    新建了一个空activity项目\n
    \n
    ERROR: Failed to resolve: androidx.appcompat:appcompat:1.1.0\nERROR: Failed to resolve: androidx.test.ext:junit:1.1.1\nERROR: Failed to resolve: androidx.test.espresso:espresso-core:3.2.0\nERROR: Failed to resolve: androidx.constraintlayout:constraintlayout:1.1.3\n
    \n

    \"init.gradle\"

    \n

    感觉有毒,成功了,依赖还是未解决,清除缓存重启无效!
    \n\"有毒\"

    \n

    删除init.gradle后,成功解决,好吧,估计问题在镜像仓库,也可能是这个配置问题,以后还是老老实实用官方源吧,虽然费时间。但出错率低。
    \n  这是我的init.gradle,路径为C:\\Users\\{username}\\.gradle,建立这个文件的目的是加速依赖下载,现在看来反而是累赘,以前用着正常,现在不能用了也不知道是什么原因。

    \n
    allprojects{\n    repositories {\n        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'\n        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'\n        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'\n        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'\n        all { ArtifactRepository repo ->\n            if(repo instanceof MavenArtifactRepository){\n                def url = repo.url.toString()\n                if (url.startsWith('https://repo1.maven.org/maven2')) {\n                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."\n                    remove repo\n                }\n                if (url.startsWith('https://jcenter.bintray.com/')) {\n                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."\n                    remove repo\n                }\nif (url.startsWith('https://dl.google.com/dl/android/maven2/')) {\n                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."\n                    remove repo\n                }\n                if (url.startsWith('https://plugins.gradle.org/m2/')) {\n                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."\n                    remove repo\n                }\n            }\n        }\n        maven {\n                url ALIYUN_REPOSITORY_URL\n                url ALIYUN_JCENTER_URL\n\turl ALIYUN_GOOGLE_URL \n \turl ALIYUN_GRADLE_PLUGIN_URL \n\n        }\n    }\n}\n
    \n

    \"image.png\"

    \n

    # 问题解决了,开工干活

    \n

    # 实验目的

    \n

    1、掌握运行时权限使用
    \n2、掌握访问其他应用程序的数据

    \n

    # 实验内容

    \n

    1.实现拨打电话功能
    \n2.访问通讯录

    \n

    # 实验仪器

    \n

    1)PC机最低配置:2G Hz以上双核CPU,2G以上内存
    \n2)Windows 32位或64位操作系统
    \n3)Android Studio 2.2及以上版本

    \n

    # 实验主要步骤

    \n

    1)创建实验项目:选择Empty Activity
    \n2)编写布局文件;

    \n

    activity_main.xml

    \n
    <?xml version="1.0" encoding="utf-8"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android="http://schemas.android.com/apk/res/android"\n        xmlns:tools="http://schemas.android.com/tools"\n        xmlns:app="http://schemas.android.com/apk/res-auto"\n        android:layout_width="match_parent"\n        android:layout_height="match_parent"\n        tools:context=".MainActivity">\n\n    <ListView\n            android:id="@+id/list"\n            android:layout_width="match_parent"\n            android:layout_height="match_parent"\n            app:layout_constraintBottom_toBottomOf="parent"\n            app:layout_constraintLeft_toLeftOf="parent"\n            app:layout_constraintRight_toRightOf="parent"\n            app:layout_constraintTop_toTopOf="parent"/>\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n
    \n

    list_item.xml

    \n
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\n              xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal"\n              android:layout_width="match_parent"\n              android:layout_height="wrap_content"\n              android:layout_margin="20dp"\n              android:padding="5dp">\n\n    <ImageView\n            android:contentDescription="@string/icon"\n            android:src="@mipmap/kyzja1gl2m4"\n            android:id="@+id/image_photo"\n            android:layout_width="70dp"\n            android:layout_height="70dp" />\n    <LinearLayout\n            android:layout_weight="1"\n            android:layout_width="0dp"\n            android:layout_height="70dp"\n            android:orientation="vertical"\n            android:layout_marginRight="15dp"\n            android:layout_marginLeft="15dp">\n\n        <TextView\n                android:id="@+id/name"\n                android:layout_width="match_parent"\n                android:layout_weight="1"\n                android:layout_height="match_parent"\n                android:text="@string/name"\n                android:textStyle="bold"\n                android:textColor="#000"\n                android:textSize="20sp" tools:ignore="NestedWeights"/>\n        <TextView\n                android:id="@+id/phone"\n                android:layout_weight="1"\n                android:layout_height="match_parent"\n                android:layout_width="match_parent"\n                android:text="@string/phone"\n                android:textStyle="bold"\n                android:textColor="#666"\n                android:textSize="20sp" />\n    </LinearLayout>\n    <Button\n            android:layout_width="70dp"\n            android:layout_height="70dp"\n            android:id="@+id/call"\n            android:text="@string/call"\n    />\n</LinearLayout>\n
    \n

    3)编写Activity类,单击查询通讯录信息,申请运行时权限

    \n

    MainActivity

    \n
    package tk.dragondyt.study6;\nimport android.Manifest;\nimport android.content.pm.PackageManager;\nimport android.database.Cursor;\nimport android.os.Bundle;\nimport android.provider.ContactsContract;\nimport android.util.Log;\nimport android.widget.ListView;\nimport android.widget.Toast;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\nimport java.util.ArrayList;\nimport java.util.List;\n/**\n * @author dyt\n */\npublic class MainActivity extends AppCompatActivity {\n    final String TAG = "MainActivity";\n    ContactPersonAdapter adapter;\n    List<Person> contactsList = new ArrayList<>();\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        ListView listView = findViewById(R.id.list);\n        adapter = new ContactPersonAdapter(this,getLayoutInflater(),contactsList);\n        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {\n            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);\n        } else {\n            readContacts();\n        }\n        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {\n            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 100);\n        }\n        listView.setAdapter(adapter);\n\n    }\n    private void readContacts() {\n        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,\n                null, null, null, null)) {\n            if (cursor != null) {\n                while (cursor.moveToNext()) {\n                    String name = cursor.getString(cursor.getColumnIndex(\n                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));\n                    String phone = cursor.getString(cursor.getColumnIndex(\n                            ContactsContract.CommonDataKinds.Phone.NUMBER));\n                    contactsList.add(new Person(name,phone));\n                }\n                adapter.notifyDataSetChanged();\n            }\n        } catch (Exception e) {\n            Log.d(TAG, "readContacts: "+e.getMessage());\n        }\n    }\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantsResults) {\n        if (requestCode == 1) {\n            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {\n                readContacts();\n            } else {\n                Toast.makeText(this, "请授予访问通讯录权限", Toast.LENGTH_SHORT).show();\n            }\n        }\n        if (requestCode==100){\n            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {\n                readContacts();\n            } else {\n                Toast.makeText(this, "请授予拨打电话权限", Toast.LENGTH_SHORT).show();\n            }\n        }\n    }\n}\n\n
    \n

    4)通过通讯录应用程序提供的内容提供器查询其数据

    \n
    private void readContacts() {\n        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,\n                null, null, null, null)) {\n            if (cursor != null) {\n                while (cursor.moveToNext()) {\n                    String name = cursor.getString(cursor.getColumnIndex(\n                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));\n                    String phone = cursor.getString(cursor.getColumnIndex(\n                            ContactsContract.CommonDataKinds.Phone.NUMBER));\n                    contactsList.add(new Person(name,phone));\n                }\n                adapter.notifyDataSetChanged();\n            }\n        } catch (Exception e) {\n            Log.d(TAG, "readContacts: "+e.getMessage());\n        }\n    }\n
    \n

    5)编写ListView展示通讯录方法,把查询到的数据展示在页面

    \n

    ContactPersonAdapter

    \n
    package tk.dragondyt.study6;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.Button;\nimport android.widget.TextView;\n\nimport java.util.List;\n\n/**\n * @author dyt\n */\npublic class ContactPersonAdapter extends BaseAdapter {\n\n    /**定义数据*/\n    private final List<Person> mData;\n    /**定义Inflater,加载我们自定义的布局。*/\n    private final LayoutInflater mInflater;\n    private final Context context;\n\n  /**\n    定义构造器,在Activity创建对象Adapter的时候将数据data和Inflater传入自定义的Adapter中进行处理。\n    */\n    public ContactPersonAdapter(Context context,LayoutInflater inflater, List<Person> data){\n        mInflater = inflater;\n        mData = data;\n        this.context = context;\n    }\n\n    @Override\n    public int getCount() {\n        return mData.size();\n    }\n\n    @Override\n    public Object getItem(int position) {\n        return position;\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n\n    @Override\n    public View getView(int position, View view, ViewGroup viewGroup) {\n        @SuppressLint("ViewHolder")\n        View item = mInflater.inflate(R.layout.list_item,null);\n        Person person = mData.get(position);\n        TextView name = item.findViewById(R.id.name);\n        TextView phone = item.findViewById(R.id.phone);\n        Button call = item.findViewById(R.id.call);\n        call.setOnClickListener((v)->{\n            Intent intentCall =  new Intent();\n            intentCall.setAction(Intent.ACTION_CALL);\n            intentCall.setData(Uri.parse("tel:" + person.getPhone()));\n            context.startActivity(intentCall);\n        });\n        name.setText(person.name);\n        phone.setText(person.phone);\n         return item ;\n    }\n}\n
    \n

    Person

    \n
    package tk.dragondyt.study6;\n\n/**\n * @author dyt\n */\npublic class Person {\n    String name;\n    String phone;\n\n    public Person(String name, String phone) {\n        this.name = name;\n        this.phone = phone;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPhone() {\n        return phone;\n    }\n\n    public void setPhone(String phone) {\n        this.phone = phone;\n    }\n\n    @Override\n    public String toString() {\n        return "Person{" +\n                "name='" + name + '\\'' +\n                ", phone='" + phone + '\\'' +\n                '}';\n    }\n}\n\n
    \n

    # 最后附上截图,最讨厌没图的教程。

    \n

    \"运行截图\"

    \n

    实验源码

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/c4877271.html", + "title": "Failed to resolve: androidx.appcompat:appcompat:1.1.0", + "date_modified": "2020-05-09T10:54:35.000Z", + "date_published": "2020-05-09T10:54:35.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "踩坑", + "安卓" + ] + }, + { + "id": "/8612fa7f/47867b98/Flutter/74684463.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 心累,每天都是“惊喜”,我太菜了

    \n

    环境
    \n开发工具 idea

    \n
    flutter doctor\n\nD:\\Android\\flutter\\bin\\flutter.bat doctor --verbose\n[√] Flutter (Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.18363.815], locale zh-CN)\n    • Flutter version 1.17.0 at D:\\Android\\flutter\n    • Framework revision e6b34c2b5c (7 days ago), 2020-05-02 11:39:18 -0700\n    • Engine revision 540786dd51\n    • Dart version 2.8.1\n\n[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)\n    • Android SDK at D:\\Android\\android-sdk\n    • Platform android-29, build-tools 29.0.3\n    • ANDROID_HOME = D:\\Android\\android-sdk\n    • Java binary at: D:\\Program Files\\Java\\jdk1.8.0_241\\bin\\java\n    • Java version Java(TM) SE Runtime Environment (build 1.8.0_241-b07)\n    • All Android licenses accepted.\n\n[!] Android Studio (not installed)\n    • Android Studio not found; download from https://developer.android.com/studio/index.html\n      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).\n\n[√] Connected device (1 available)\n    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26) (emulator)\n\n! Doctor found issues in 1 category.\nProcess finished with exit code 0\n
    \n

    \"Could
    \n解决方法:

    \n
    allprojects {\n    repositories {\n        google() \n        jcenter()\n        maven { url "https://maven.google.com" }//感觉google()是假的,这里我用了阿里云镜像,可能没同步吧。\n    }\n}\n
    \n

    \".gradleachesransforms-1iles-1.1ore-1.1.0.aarb817d4a7e2a888884c999547cadccefesaluesalues.xml:7:5-70:

    \n

    stackoverflow上解决方法

    \n

    解决方法:
    \n修改app下的build.gradle文件

    \n
    android {\n    compileSdkVersion 28\n    defaultConfig {\n\t...\n        targetSdkVersion 28\n\t...\n    }\n    ...\n}\n
    \n

    stackoverflow真是个好东西,可惜要翻墙,感想上面的大神。
    \n不写了,累,这种资料网站都要墙,真是丧心病狂,什么时候能不用镜像站。构建工具再好,巧妇难为无米之炊啊

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/47867b98/Flutter/74684463.html", + "title": "AAPT: error: resource android:attr/fontVariationSettings not found", + "date_modified": "2020-05-09T10:54:35.000Z", + "date_published": "2020-05-09T10:54:35.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "踩坑", + "flutter" + ] + }, + { + "id": "/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 信息与文献基本知识

    \n

      未来学家托天勒把人类社会的发展过程划分为3个阶段:以农业经济为基础的农业社会;以工业经济为基础的工业社会;以信息经济为基础的信息社会。在信息社会中,信息资源已被人们公认为是物质、能量资源之后的人类可利用的第三类资源,是人类社会领域的基础性资源。

    \n

    # 从信息到文献

    \n

    # 信息(Information)

    \n

      美国数学家、控制论的主要奠基人维纳在1950年出版的《控制论与社会》中是这样来理解信息的:“人通过感觉器官感知周围世界”,“我们支配环境的命令就是给环境的一种信息”,因此,“信息就是我们在适应外部世界,并把这种适应反作用于外部世界的过程中,同外部世界进行交换的内容的名称”。

    \n
    # 信息的定义:
    \n

      中国国家标准《情报与文献工作词汇一一基本术语》 (GB/T4894-1985)中信息的定义为:信息是物质存在的一种方式、形态或运动状态,也是事物的一种普遍属性,一般指数据、消息中所包含的意义,可以使消息中所描述事件的不确定性减少。

    \n
    # 信息的基本属性:
    \n

    (1)客观性。
    \n(2)传递性。
    \n(3)多态性。
    \n(4)共享性。
    \n(5)时效性。
    \n(6)价值相对性。
    \n(7)依附性。
    \n(8)增长性。

    \n

    # 知识(Knowledge)

    \n

      知识是人们在改造世界的实践中所获得的认识和经验的总和,是对客观世界物质形态和运动规律的认识。根据韦伯斯特(Webster)词典1997年的定义,知识是通过实践、研究、联系或调查获得的关于事物的事实和状态的认识,是对科学、艺术或技术的理解,是人类获得的关于真理和原理的认识的总和。

    \n
    # 知识的定义
    \n
      \n
    • 从信息的观念看,知识来源于信息,是信息的一部分。简而言之,知识是理性化、优化、系统化了的信息。
    • \n
    • 从反映的内容而言,知识是客观事物的属性与联系的反映,是客观世界在人脑中的相对正确的反映。
    • \n
    • 从反映的活动形式而言,知识有时表现为主体对事物的感性知觉或表象,属于感性知识,有时表现为关于事物的概念或规律,属于理性知识。
    • \n
    \n

    # 情报(Intelligence)

    \n

      情报是作为交流对象的有用的知识。“情报 是判断、意志、决心、行动需要的能指引方向的知识和智慧”;“情报是解决问题所需要的知识”;“情报是激活 了的知识”情报的基本属性是知识性、传递性和效用性。

    \n
    # 情报的基本属性
    \n

    (1) 知识性。一般而言,情报是一种新的知识。然而称为情报的知识
    \n并不排斥时间上的“不新”。这就是说,凡原先不知道的(不论时间多久),而现在又迫切需要的知识,都属于“新”的知识。
    \n(2) 传递性。情报传递的过程包括从情报源进行收集到向用户提供情报的全过程。无论多高深、渊博、新奇的知识,如果不记录、不传递、不交流,都不能称为情报。
    \n(3) 效用性(判断的标准)。情报是一种有价值、有效用的知识。情报均须“有用”,当用户不需要时,百分之百的知识也不能把它称之为情报

    \n

    # 文献(Literature/Document)

    \n

      国家标准《文献著录总则》(GB/T3792. 1-1983)给出的定义为:“文献是记录有知识的一切载体。”国家标准化组织IS0在《文献情报术语国际标准》(IS0/DIS5217)给出的定义是:“为了把人类知识传播开来和继承下去,人们用文字、图形、符号、音频、视频等手段将其记录下来,或写在纸上,或晒在蓝图上,或制在感光片上,或录到唱片上,或存储在磁盘上。这种附着在各种载体上的记录统称为文献。”

    \n
    # 文献包括4个要素。
    \n

    (1) 知识和信息,即文献的内容。
    \n(2) 物质载体,如竹简、纸张、胶片、磁盘等,它是文献的外在形式。
    \n(3) 记录知识和信息的符号,如文字、图表、声音、图像等。
    \n(4) 记录的方式或手段,如书写、印刷、复制、录音、录像等,即将知识和信息固化到载体上的手段。

    \n

    # 信息、知识、情报与文献

    \n

      我国图书情报学界对信息、知识、文献和情报的看法是:知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,当文献中记录的知识传递给用户,并为用户所利用时,文献中的知识就转化为情报。

    \n

    # 信息的分类

    \n
      \n
    1. 按信息的内容划分
      \n科学技术信息
      \n社会科学信息
    2. \n
    3. 按产生信息的客体的性质来划分
      \n自然信息
      \n生物信息
      \n机器信息
      \n社会信息
    4. \n
    5. 按信息所依附的载体来划分
      \n文献信息
      \n口头信息
    6. \n
    \n

    # 文献的分类

    \n
      \n
    1. 按照文献的加工层次分类
      \n零次文献(Zeroth Literature)
      \n一次文献(Primary Literature)
      \n二次文献(Secondary Literature)
      \n三次文献(Tertiary Literature)
    2. \n
    3. 按照文献的载体分类
      \n印刷型文献(Paper Literature)
      \n缩微型文献(Microform)
      \n电子型文献(Electronic iterature)
      \n音像型文献(Audio-Visual iterature)
    4. \n
    5. 按照文献的出版形式分类
      \n图书
      \n期刊
      \n报纸
      \n特种文献(学位论文、会议论文、专利文献、标准文献、科技报告、政府出版物、产品样本资料等)
    6. \n
    \n

    # 信息检索基础

    \n

    # 信息检索的原理

    \n

    # 信息检索的概念

    \n

      广义的信息检索“Information Retrieval”是指将信息按照一定的方式组织和存储起来,并根据信息用户的需要揭示、查找、传递相关信息的过程,包括了信息的存储过程和查找过程。狭义的信息检索仅指信息的查找,是指从信息集合中找出用户所需要的有关信息的过程。狭义的信息检索包括3个方面的含义:了解用户的信息需求、信息检索的技术或方法、满足信息用户的需求。

    \n

    # 信息检索的原理

    \n

      信息检索的基本原理就是在对信息进行整理排序形成检索工具的基础上,按照用户的要求利用检索工具或检索系统,将用户检索提问标识(检索词)与已形成的或存储在系统中的信息的存储标识(文献特征标识、标引词)进行匹配比较,若取得一致,则为匹配,即达到了用户的检索需求,如图1.1所示。

    \n
    \n\"信息检索原理图\"/\n
    \n

    # 信息检索的类型

    \n
      \n
    1. 按信息存储和检索的内容分类
      \n文献检索
      \n数据检索
      \n事实检索
    2. \n
    3. 按照检索系统中信息的组织方式分类
      \n全文检索
      \n多媒体检索
    4. \n
    5. 按照信息存储的载体和实现查找的技术手段分类
      \n手工检索
      \n机械检索
      \n计算机检索
    6. \n
    \n

    # 信息检索的工具

    \n

      信息检索工具是指为检索需要而组织的文献检索系统,它是收集、加工标引、组织文献的结果,是检索工作赖以生存的手段和条件,包含目录、索引、文摘等。

    \n

    # 典型的检索工具组成

    \n
      \n
    1. 主体:即检索工具的主要部分,由所收录文献的著录部分组成,是文献储存与检索的实体。其包含文献的内部特征与文献的外部特征。
    2. \n
    3. 辅助索引:是在文献检索工作中,从主体部分的文献款目编排系统以外的角度增加检索途径、扩大检索效果的辅助手段,它不能离开检索工具的主体单独存在。
    4. \n
    5. 使用说明:向用户介绍本检索工具的性质、内容范围、收录年限、读者对象、著录方法、分类体系、检索方法等,帮助用户利用检索工具。
    6. \n
    \n
    # 目录
    \n
    # 目录的定义
    \n

      目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

    \n
    # 目录的著录款目
    \n

    目录的著录包括如下款目。
    \n(1) 书名(刊名)项。
    \n(2) 著者(编者)项。
    \n(3) 出版项:包括出版地点、出版者、出版期、版次等。
    \n(4) 稽核项:包括页数、图表、开本、装订形式、定价等。
    \n(5) 附注项:对上述各项的补充或说明。
    \n(6) 提要项:内容简介。
    \n(7) 业务注记:指图书馆或保存单位在目录上做的业务记载,包括索取号、登录号、分类号、主题词、存储地点等。

    \n
    # 索引
    \n
    # 索引的定义
    \n

      索引是将报刊书籍中某些重要的或有意义的信息,如书名、刊名篇名、主题、人名、地名等分别摘录出来,按一定方式编排,并注明出处,以供检索的工具。

    \n
    # 索引的作用
    \n

      索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

    \n
    # 常用索引
    \n

    (1) 主题索引
    \n(2) 分类索引
    \n(3) 著者索引
    \n(4) 其他:单位索引(或团体著者索引)、化学分子式索引、引用刊物索引、出版单位索引等。

    \n
    # 文摘
    \n
    # 文摘定义
    \n

      我国国家标准GB3468——83定义文摘为“除题录部分外还对文献内容作实质性描述的文献条目称文摘”。

    \n
    # 文摘作用
    \n

    (1) 帮助读者快速判断文献内容
    \n(2) 节省阅读时间
    \n(3) 减少语言障碍
    \n(4) 替代原文

    \n
    # 检索工具类型
    \n
      \n
    1. 按信息加工的手段或设备划分
      \n手工检索工具
      \n机械检索工具
      \n计算机检索工具
    2. \n
    3. 按编制方法划分
      \n目录型检索工具
      \n题录型检索工具
      \n文摘型检索工具
      \n索引型检索工具
    4. \n
    5. 按信息载体形态划分
      \n书本式检索工具
      \n卡片式检索工具
      \n缩微式检索工具
      \n磁性材料式检索工具
    6. \n
    7. 按收录范围划分
      \n综合性检索
      \n综合性检系
      \n专科性检索工具
      \n专题性检索工具
      \n全面性检索工具
      \n单一性检索工具
    8. \n
    9. 按时间范围划分
      \n预告性检索工具
      \n现期通报性检索工具
      \n回溯性检索工具
    10. \n
    \n

    # 信息检索的意义

    \n
      \n
    1. 掌握获取知识的捷径,提高信息利用的效率
    2. \n
    3. 提高信息素质,培养终身学习的能力
    4. \n
    5. 科学研究的向导,科技查新的基础
    6. \n
    \n

    # 信息检索的途径

    \n

      根据信息的基本特征,可以把信息检索途径分为外部特征检索途径(题名途径、著者途径、引文途径等)和内容特征检索途径(分类途径、主题途径等)两大类。

    \n

    # 外部特征途径

    \n
      \n
    1. 题名途径:刊名、书名、篇名等
    2. \n
    3. 著者途径:作者、编者、译者、专利权人、出版机构等
    4. \n
    5. 引文途径: 其他途径:专利号、报告号、合同号、标准号、国际标准书号和刊号等
    6. \n
    \n

    # 内容特征途径

    \n
      \n
    1. 分类途径:是指按照文献所属学科(专业)属性(类别)进行检索的途径。
    2. \n
    3. 主题途径:是按照文献信息的主题内容进行检索的途径,利用主题词、关键词、叙词,并按字顺排列实现检索。
    4. \n
    \n

    # 信息检索的步骤和方法

    \n

    # 信息检索的步骤

    \n

    # 信息检索的方法

    \n
      \n
    1. 顺查法:指按照时间的顺序,由远及近地利用检索系统进行文献信息检索的方法。
    2. \n
    3. 逆查法:是由近及远地查找,逆着时间的顺序利用检索工具进行文献信息检索的方法。
    4. \n
    5. 抽查法:是针对检索课题的特点,选择有关该课题的文献信息最可能出现或最多出现的时间段,利用检索工具进行重点检索的方法。
    6. \n
    7. 追溯法(引文法) :是指利用已经掌握的文献末尾所列的参考文献,进行逐一追溯查找“引文”的一种最简便的扩大情报来源的方法。
    8. \n
    9. 综合法:又称循环法,这是把上述方法加以综合运用的方法。
    10. \n
    \n

    # 计算机信息检索基础

    \n

    # 计算机信息检索概述

    \n

    # 计算机信息检索的特点

    \n

    (1) 速度快。
    \n(2) 检索范围广。
    \n(3) 检索不受时空的限制。
    \n(4) 及时。
    \n(5) 界面友好。
    \n(6) 超文本检索。

    \n

    # 计算机信息检索分类

    \n

    (1) 脱机检索
    \n(2) 联机检索
    \n(3) 网络检索

    \n

    # 计算机信息检索技术

    \n

      计算机检索系统常采用一些运算方法,从概念相关性、位置相关性等方面对检索提问进行技术处理。

    \n
      \n
    1. 检索词的选择
      \n检索式由检索词和检索算符组成。
      \n检索词分为两类:受控词和非受控词。
    2. \n
    3. 布尔逻辑检索
      \n将多个检索词用布尔运算符(简称检索算符)组合在一起来进行检索,称之为布尔逻辑检索。
      \n系统使用的检索算符一般有以下几种:
      \n(1) 逻辑与
      \n(2) 逻辑或
      \n(3) 逻辑非
    4. \n
    \n

    # 光盘检索

    \n

    光盘检索的特点主要有以下几个。

    \n
      \n
    1. 检索途径多。其可提供内容、著者、关键词、标题、著者单位、年代、出处等多种检索途径。
    2. \n
    3. 检索系统配置简单。利用微机系统建立光盘检索系统只要一台光盘驱动器和所需要的盘片,不需经过通信线路。
    4. \n
    5. 检索费用低廉。由于光盘的费用是一次性投入,可够次任意使用,利用率越高,分摊的成本越低。
    6. \n
    7. 系统操作简单。光盘数据库一般都具备类似联机检索那样齐全的检索和输出功能,同时提供人机对话,系统界面友好。
    8. \n
    \n

    # 网络检索

    \n

    网络检索具有如下特点:

    \n
      \n
    1. 检索速度快。手工检索需数周的课题计算机检索只需数小时或数分钟。
    2. \n
    3. 检索途径多。除手工检索工具的分类、主题、著者等检索途径之外,网络检索往往还提供更多更灵活的检索途径,如文本词途径。
    4. \n
    5. 更新快。网上信息很多为为更新。
    6. \n
    7. 范围广。网上数据库的种类更为广泛和丰富,有些可免费进行
    8. \n
    9. 检索用词的选择及其组配更为灵活。检索策略的制定更为灵活和复杂,可利用各种讦算机检索技术随意扩天或缩小检索范围以满足用户各种不同的信息检索需求。
    10. \n
    11. 检索结果可直接打印或下载,可操作性强。
    12. \n
    \n

    # 思考题:

    \n

    # 简述信息、知识、文献的概念,及三者之间的关系。

    \n

      知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,

    \n

    # 信息检索的目的和意义

    \n
      \n
    1. 掌握获取知识的捷径,提高信息利用的效率
    2. \n
    3. 提高信息素质,培养终身学习的能力
    4. \n
    5. 科学研究的向导,科技查新的基础
    6. \n
    \n

    # 检索工具的结构构成是什么?

    \n
      \n
    1. 目录
    2. \n
    3. 索引
    4. \n
    5. 文摘
    6. \n
    \n

    # 目录在检索中起什么作用?

    \n

      目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

    \n

    # 索引在检索中起什么作用?

    \n

      索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

    \n

    # 文摘在检索中起什么作用?

    \n

    (1) 帮助读者快速判断文献内容
    \n(2) 节省阅读时间
    \n(3) 减少语言障碍
    \n(4) 替代原文

    \n

    # 简述国内外主要分类法。

    \n

    # 中国图书分类法

    \n
      \n
    1. 中国人民大学图书馆图书分类法。简称人大法新中国成立后的第一部分类法,1954年出第一版,1996年出第六版。4大部类、17个基本大类。总结科学,社会科学,自然科学,综合性科学、综合性图书。
    2. \n
    3. 中国科学院图书馆图书分类法
    4. \n
    5. 中国图书资料分类法
    6. \n
    7. 中国档案分类法
    8. \n
    \n

    # 外国图书分类法

    \n
      \n
    1. 杜威十进分类法(Dewey Decimal Classification &Relative Index,DDC)是世界上流传最广、影响最大的一部文献分类法,它开创了文献分类法的新纪元,是外国文献分类法发展史上一个重要里程碑。
    2. \n
    3. 国际十进分类法
    4. \n
    5. 美国国会图书馆分类法
    6. \n
    7. 冒号分类法
    8. \n
    9. 布利斯书目分类法
    10. \n
    \n

    # 操作题:

    \n

    # 题目:

    \n

    利用《中国图书馆图书分类法》找出分类号。

    \n

    # 检索目的:

    \n

    掌握《中国图书馆图书分类法》的基本构成特点。

    \n

    # 检索要求:

    \n

    按照基本大类,在《中国图书馆图书分类法》中查找以下相关类目编号。

    \n
      \n
    1. 计算机技术:国际互联网
    2. \n
    \n
    \n

    TP393.4

    \n
    \n
      \n
    1. 交通运输:运输线路优选
    2. \n
    \n
    \n

    U116.2

    \n
    \n
      \n
    1. 环境科学:环境污染的控制及其排除
    2. \n
    \n
    \n

    X506

    \n
    \n
      \n
    1. 食品工业:淀粉加工工艺
    2. \n
    \n
    \n

    TS234

    \n
    \n
      \n
    1. 文化、科学:图书馆工作者
    2. \n
    \n
    \n

    G251.6

    \n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html", + "title": "信息检索-绪论", + "date_modified": "2020-05-06T21:55:57.000Z", + "date_published": "2020-05-06T21:55:57.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "信息检索" + ] + }, + { + "id": "/8612fa7f/8f8103b7/Docker/29596f0c.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 安装elasticsearch(简称es)

    \n

    拉取镜像,该命令拉取最新版(不推荐,最新版意味着踩坑)

    \n
    docker pull elasticsearch\n
    \n

    可以指定版本,查看elasticsearch版本

    \n
    docker pull elasticsearch:x.x.x\n
    \n

    \"执行docker
    \n尝试运行

    \n
    docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:latest\n
    \n

    \"response
    \n查看所有容器

    \n
    docker ps -a\n
    \n

    解决方法

    \n
      \n
    1. 删除容器,重新创建
    2. \n
    \n
    docker rm containerId|names\n
    \n

    \"image.png\"
    \n发送GET请求,校验是否安装成功

    \n
    curl localhost:9200\n
    \n

    \"curl
    \n2. 重新启动之前的容器

    \n
    docker start containerId|names\n
    \n

    # 安装可视化控件(kibana,elasticsearch-head…)

    \n

    这里选择kibana,颜值就是正义,在docker中安装kibana官方文档

    \n

    需要指定版本,该版本与es一致

    \n
    docker pull docker.elastic.co/kibana/kibana:7.6.2\n
    \n

    \"
    \n运行kibana

    \n
    docker run --link elasticsearch:elasticsearch -p 5601:5601 --name kibana -d docker.elastic.co/kibana/kibana:7.6.2\n
    \n

    测试

    \n
     curl localhost:5601/status\n
    \n

    出现kibana server is not ready yet
    \n查看日志

    \n
    docker logs -f containerId\n
    \n

    \"image.png\"
    \n完了掉坑里了,下次再写了顺便补上docker-compose部署

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/8f8103b7/Docker/29596f0c.html", + "title": "在docker安装elasticsearch", + "date_modified": "2020-04-29T21:55:57.000Z", + "date_published": "2020-04-29T21:55:57.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "教程" + ] + }, + { + "id": null, + "content_html": "

    \"动漫美图\"

    \n\n\n

    # git push时出现error: src refspec master does not match any解决办法.

    \n

    网传原因:
    \n  ++这是由于存储库仍然为空引起的。存储库中没有提交,因此没有 master分支可推送到服务器。++
    \n网传解决方法:

    \n
    touch README\ngit add README \ngit commit -m 'first commit'\ngit push origin master\n
    \n

    可能是我垃圾吧,git命令写错了,反正没能解决,如图:

    \n

    \"image.png\"

    \n
    git show-ref\n
    \n

    d601ecc070daac5320959ee8c47bca013a113256 refs/remotes/origin/master

    \n

    终于换一种错误了,留下了无知的眼泪

    \n
    git push origin HEAD:master\n
    \n

    \"image.png\"

    \n

    一番调整,我终于成功了,失败30次,o(╥﹏╥)o

    \n

    \"image.png\"

    \n

    去目标仓库查看,发现有一个目录文件全没了(╥╯^╰╥)
    \n我有修改一番,好刺激啊,这就是删库跑路的快感吗!

    \n

    \"image.png\"

    \n

    这就是之前消失的文件,现在回来了,其他的又消失了。。。
    \n经过检查,该文件夹下面含有 .git 文件夹,无法被追踪,删除即可,到此结束了,节后逃生的感觉。
    \n总结:出现这个错误不一定是因为空目录,也可能是因为远程分支不在!!!

    \n", + "url": "https://blog.dragondyt.topnull", + "title": "git push时出现error: src refspec master does not match any解决办法.", + "date_modified": "2020-04-23T21:55:57.000Z", + "date_published": "2020-04-23T21:55:57.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "教程" + ] + }, + { + "id": "/8612fa7f/e255a10a/a87da565/589e13eb.html", + "content_html": "

    # 第三章 数据链路层

    \n

    一、选择题

    \n
      \n
    1. 流量控制是为( C )所需要的。
    2. \n
    \n

    A. 位错误   B. 发送方缓冲区溢出
    \n  C. 接收方缓冲区溢出   D. 接收方与发送方之间冲突

    \n
      \n
    1. 在下列协议中,使用带位填充的首尾标志法组帧是( B )。
    2. \n
    \n

    A. DDCMP   B. HDLC   C. BSC   D. SLIP

    \n
      \n
    1. PPP不同于HDLC协议,使用面向( B )的填充方式。
    2. \n
    \n

    A. 比特   B. 字符   C. 透明传输   D. 帧

    \n
      \n
    1. 对于窗口大小为n的滑动窗口,最多可以有( C )帧已发送但没有确认。
    2. \n
    \n

    A. 0   B. n-1   C. n   D. n+1

    \n
      \n
    1. 在滑动窗口流量控制(窗口大小为8)中,ACK3意味着接收方期待的下一帧是( B )号帧。
    2. \n
    \n

    A. 2   B. 3   C. 4   D. 8

    \n
      \n
    1. PPP是Internet中使用的( C ),其功能对应于OSI参考模型的数据链路层。
    2. \n
    \n

    A. 传输协议   B. 分组控制协议   C. 点到点协议   D. 报文控制协议

    \n

    7. 下面不是数据链路层功能的是(D)。

    \n

    A. 帧同步   B. 差错控制   C. 流量控制   D. 拥塞控制

    \n

    8. 面向比特同步的帧数据段中出现位串01111101,则比特填充后输出是(A)。

    \n

    A. 011111001   B. 001111101   C. 011111101   D. 011111010

    \n

    9. PPP为实现透明传输在异步传输时采用(A),而同步传输采用(A)。

    \n

    A. 字符填充法,比特填充法   B. 比特填充法,字符填充法
    \n  C. 字符填充法,字节记数法   D. 比特填充法,比特填充法

    \n

    10. 在数据通信中,当发送数据出现差错时,发送端无需进行数据重发的差错控制方法为(B)。

    \n

    A. ARQ   B. FEC   C. 奇偶校验码   D. CRC

    \n

    11. 已知循环冗余码生成多项式G(X)=x5+x4+x+1,若信息位10101100,则冗余码是(B)。

    \n

    A. 01101   B.01100   C. 1101   D. 1100

    \n

    12. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以(C)。

    \n

    A. 检测出一位差错       B. 检测并纠正一位差错
    \n  C. 检测出多位突发性差错   D. 检测并纠正多位突发性差错

    \n
      \n
    1. 若数据链路的发送窗口尺寸WT=4,在发送3号帧、并接到2号帧的确认帧后,发送方还可连续发送(B)。
    2. \n
    \n

    A. 2帧   B. 3帧   C. 4帧   D. 1帧

    \n

    14. 在回退N协议中,当帧序号为3比特,发送窗口的最大尺寸为(C)。

    \n

    A. 5   B. 6   C. 7   D. 8

    \n

    15. 在选择重传协议中,当帧的序号字段为3比特,且接受窗口与发送窗口尺寸相同时,发送窗口的最大尺寸为(B)。

    \n

    A. 2   B. 4   C. 6   D. 8
    \n16. 假定我们运行发送窗口大小为5和接收窗口大小为3的滑动窗口算法,并且在传输过程中不会发生分组失序的问题,帧序号的编码至少有(B)位。

    \n

    A. 2   B. 3   C. 4   D. 5

    \n

    17.无论是SLIP还是PPP协议都是(D)协议。

    \n

    A.物理层 B 传输层 C网络层 D数据链路层

    \n

    18.下列哪一项最好地描述了CRC的特征?(AB)
    \n  A.逐个检查每一个字符

    \n

    B.能检查出99%以上的差错

    \n

    C.检查不出有偶数个位出错的差错

    \n

    D.不如奇偶校验方法可靠

    \n

    19.HDLC协议采用的帧同步方法是(A)。

    \n

    A.使用比特填充的首尾标志法

    \n

    B.使用字符填充的首尾定界符法

    \n

    C.字节计数法

    \n

    D.违法编码法

    \n

    20.流量控制是数据链路层的基本功能之一,有关流量控制,下列说法中正确的是(C)。

    \n

    A.只有数据链路层存在流量控制

    \n

    B.不只是数据链路层存在流量控制,不过各层的流量控制对象都一样

    \n

    C.不只是数据链路层存在流量控制,但是各层的流量控制对象都不一样

    \n

    D.以上都不对

    \n

    21.为了避免传输中帧的消失,数据链路层采用了(D)方法。

    \n

    A.发送帧编上序号   B.循环冗余码
    \n  C.海明码   D.计时器超时重发

    \n

    22.下列不属于数据链路层功能的是(B)。

    \n

    A.帧同步功能   B.电路管理功能
    \n  C.差错控制功能   D.流量控制功能

    \n

    23.流量控制实际上是对(A)的控制。

    \n

    A.发送方数据流量   B.接收方数据流量
    \n  C.发送,接受双方数据流量   D.链路上任意两结点间的数据流量

    \n

    24.在数据帧中,当所传送的数据中出现控制字符时,就必须采取适当的措施,使接收方不至于将数据误认为是控制信息。这样才能保证数据链路层的传输是(A)的。

    \n

    A.透明   B.面向连接   C.冗余   D.无连接
    \n25.数据链路层采用后退N帧协议,发送方已经发送了编号为0~7的帧。

    \n

    当及时器超时,若发送方只收到0,2,3号帧的确认,则要发送方重发的帧数是(C)
    \n  A.2\t\t  B.3\t\t  C.4\t\t  D.5

    \n

    26.计算机网络中各节点间采用©方式。

    \n

    A.连续传输   B.总线传输   C.串行传输   D.并行传输

    \n

    27.差错控制的基本方式有(多选)(AB)

    \n

    A.检错反馈重发   B.前向纠错方式   C.奇偶校验码   D.方阵检验码

    \n

    28.数据传输中的差错主要有(多选)(AD)

    \n

    A.随机错   B.计算错   C.校验错   D.突发错

    \n

    29.无论是SLIP还是PPP协议都是( B )协议。

    \n

    (A)物理层  (B)数据链路层  ©网络层  (D)运输层

    \n

    ps:不保证完全正确,仅用来偷懒

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/589e13eb.html", + "title": "计算机网络第三章数据链路层答案", + "summary": "用来偷懒的答案", + "date_modified": "2020-03-16T19:22:27.000Z", + "date_published": "2020-03-16T19:22:27.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机网络" + ] + }, + { + "id": "/8612fa7f/e255a10a/a87da565/5eef9793.html", + "content_html": "

    # 第二章 物理层

    \n

    一、 选择题

    \n
      \n
    1. 信号是数据在传输过程中的(A)的表现形式。
      \nA. 电信号 B. 代码 C. 信息 D. 程序
    2. \n
    3. 数据通信的任务是传输( D  )代码的比特序列。
      \nA. 十进制 B. 帧结构 C. 分组结构 D. 二进制
    4. \n
    5. ( B )信号的电平是连续变化的。
      \nA. 数字 B. 模拟 C. 脉冲 D. 二进制
    6. \n
    7. ( C)是指将数字信号转变成可以在电话线上传输的模拟信号的过程。
      \nA. 解调 B. 采样 C. 调制 D. 压缩
    8. \n
    9. 数据传输速率是指每秒钟传输构成数据二进制代码的(D )数。
      \nA. 码元 B. 信元 C. 波特 D. 位
    10. \n
    11. 利用模拟通信信道传输数据信号的方法称为( A )。
      \nA. 频带传输 B. 基带传输 C. 异步传输 D. 同步传输
    12. \n
    13. 基带传输是指在数字通信信道上( C )传输数字数据信号的方法。
      \nA. 调制 B. 脉冲编码 C. 直接 D. 间接
    14. \n
    15. 数据在通信信道传输的过程中,对数据传输的误码率影响最主要的因素是( D )。
      \nA. 传输速率 B. 调制解调器 C. 传输介质 D. 噪声强度
      \n9.Internet上的数据交换采用的是( A )。
      \nA. 分组交换 B. 电路交换 C. 报文交换 D. 光交换
    16. \n
    17. FDM是指( A )。
      \nA. 频分多路复用 B. 时分多路复用 C. 波分多路复用 D. 码分多路利用
    18. \n
    19. 利用( A ),数字数据可以用模拟信号来表示。
      \nA. 调制解调器 B. 编码解码器 C. 串联放大器 D. 电话网络
    20. \n
    21. 在数据通信系统中,传输介质的功能是( D )。
      \nA. 在信源与信宿之间传输信息 B.纠正传输过程中的错误
      \nC. 根据环境状况自动调整信号形式 D. 将信号从一端传至另一端
    22. \n
    23. 在光纤中采用的多路复用技术是( C )。
      \nA. 时分多路复用 B. 频分多路复用 C. 波分多路复用 D. 码分多路复用
    24. \n
    25. 为了实现长距离传输,模拟传输系统都使用放大器来使信号中的能量得到增加,其噪声分量( A )。
      \nA. 增大 B. 减小 C. 不变 D. 不一定
    26. \n
    27. “复用”是一种将若干个彼此独立的信号合并为一个可在同一信道上传输的( C )。
      \nA. 调制信号 B. 已调信号 C. 复用信号 D. 单边带信号
    28. \n
    29. 物理层4个重要特性:机械特性、功能特性、电气特性和(A)。
      \nA. 规程特性 B. 接口特性 C.协议特性 D. 物理特性
      \n17. 基带系统使用(C)进行传输的。
      \nA. 模拟信号 B. 调制信号 C. 数字信号 D. 载波信号
      \n18. 下列关于异步传输说法正确的是(D)。
      \nA. 一次传输一个数据块 B. 对时序的要求较高
      \nC. 收/发端不需要进行同步 D. 数据传输速率低
      \n19. 低通通道带宽为5KHz,编码采用512级分级信号,最大数据传输率(D)。
      \nA. 32 kbps B. 48 kbps C. 64 kbps D. 90 kbps
    30. \n
    31. 在宽带为8KHz的信道上,按奈奎斯特定理,每秒能发送的比特数不超过48kbps,则一个码元离散取值是(B)。
      \nA. 4 B. 8 C. 16 D. 24
      \n21. 在宽带为8KHz的信道上,如果8种不同的物理状态来表示数据,若信噪比S/N为30Db,按香农定理,最大限制的数据速率为(D)。
      \nA. 24 kbps B. 48 kbps C. 40 kbps D. 80kbps
      \n22. 在脉冲起始时刻,有无跳变来表示“0”和“1”,在脉冲中间时刻始终发生跳变的编码是(C)。
      \nA. 曼彻斯特编码 B. 非归零码 C. 差分曼彻斯特编码 D. 8B/10B
      \n23. 当数字信号在模拟传输系统中传送时,在发送端和接受端分别需要(A)。
      \nA. 调制器和解调器 B. 解调器和调制器
      \nC. 编码器和解码器 D. 解码器和编码器
      \n24.两台计算机利用电话线路传输数据信号时必备的设备是(A).
      \nA. 调制解调器 B. 网卡 C. 中继器 D. 集线器
      \n25. 当通信子网采用(B)方式时,我们首先要在通信双方之间建立起逻辑连接。
      \nA. 报文交换 B. 虚电路 C. 数据报 D. 电路交换
      \n26.不受电磁干扰或噪声影响的介质是(B)。
      \nA. 双绞线 B. 光纤 C. 同轴电缆 D. 微波
      \n27. 报文的内容不按顺序到达目的节点的是(D)方式。
      \nA. 电路交换 B. 报文交换 C.虚电路交换 D. 数据报交换
      \n28. 在中继系统中,中继器处于(A)。
      \nA. 物理层 B.数据链路层 C. 网络层 D. 高层
      \n29. 关于时延说法正确的是(C)。
      \nA. 发送时延=信道长度/电磁波在信道上的传播速度
      \nB. 传播时延=数据块长度/信道带宽
      \nC. 总时延=传播时延+发送时延+排队时延
      \nD. 提高链路带宽减小了数据的传播时延
      \n30. 下列说法错误的是(C)。
      \nA. 在虚电路方式中,信息从源节点传送到目的节点采用“存储转发”方式
      \nB. 在数据报方式中,信息从源节点传送到目的节点采用“存储转发”方式
      \nC. 电路交换比分组交换实时性好
      \nD. 报文交换方式适合交互式通信
      \n31.物理层传输的是(A)。
      \nA.原始比特 B.分组 C.信元 D.帧
      \n32.在电缆中采用屏蔽可以带来什么好处?(B)
      \nA.减少信号衰减 B.减少电磁干扰辐射
      \nC.减少物理损坏 D.减少电缆的阻抗
      \n33.调制解调技术主要用于(A)的通信方式中。
      \nA.模拟信道传输数字数据 B.模拟信道传输模拟数据
      \nC.数字信道传输数字数据 D.数字信道传输模拟数据
      \n34.下列说法中,哪一项是正确的?(C)
      \nA.虚电路与线路交换没有实质不同
      \nB.在通信的两个站点间只能建立一条虚电路
      \nC.虚电路有连接建立,数据传输,连接拆除3个阶段
      \nD.虚电路的各个结点需要为每个分组作路由选择判定
      \n35.当数字信号在模拟传输系统中传送时,在发送端和接收端分别需要(A)。
      \nA.调制器和解调器 B解调器和调制器
      \nC. 编码器和解码器 D解码器和编码器
      \n36.物理层的4个特性中,(B)规定了每种信号的电平,信号的脉冲宽度,允许的数据传输速率和最大传输距离。
      \nA.机械特性 B电气特性 C功能特性 D规程特性
      \n37.为了将数字信号传输得更远,可以采用的设备是(A)。
      \nA.中继器 B放大器 C网桥 D路由器
      \n38.在无噪声情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输率是(C)
      \nA.12kbps\tB.24kbps\tC.48kbps\tD.96kbps
      \n39.传递需进行调制编码。(B)
      \n  A.数字数据在数字信道上 B.数字数据在模拟信道上
      \n  C.模拟数据在数字信道上 D.模拟数据在模拟信道上
      \n40.数据传输速率公式:S= Tlog2N中,T的含义是。(B)
      \n  A.单位脉冲幅度 B.单位脉冲宽度 C.调制速率 D.脉冲的有效值
      \n41.两个实体间数据传输和交换是(A)
      \n  A.数据通信 B.数据控制 C.数据传输 D.信息交换
      \n42.在多数情况下,网络接口卡实现的功能处于。\t(A)
      \n  A.物理层协议和数据链路层协议 B.物理层协议和网络层协议
      \n  C.数据链路层协议 D.网络层协议
      \n43.下列说法哪一个是正确的 (A)
      \n  A、当码元的离散值个数N=2,则波特率等于比特率;
      \n  B、600波特和600bps是一个意思;
      \n  C、每秒传送l00个码元也就是每秒传送100个比特;
      \nD、每秒50波特的传输速率是很低的
      \n44.模拟通信系统中产生的调制信号一定是。(B)
      \n  A.数字信号 B.连续信号 C.语音信号 D.离散信号
      \n45.用bps作单位的有(多选)(AC)
      \n  A.位速率 B.波特率 C.数据传输率 D.误码率
      \n46.下列对基带传输和宽带传输的说法正确的是(多选) (AB)
      \n  A.基带传输是将数据直接转换为脉冲信号加到电缆上传输出去
      \n  B.宽带传输是将数据加到载波信号上传送出去
      \n  C.基带传输采用“控制载波信号状态”的传输技术
      \n  D.在通信中,依据数据流的方向可以分为基带传输和宽带传输
      \n47.下述哪个说法是正确的?(D)
      \n  (A)细同轴电缆传输速率最高。
      \n  (B) 光纤电缆支持电缆运行几十公里。
      \n  © 屏蔽双绞线电缆对电磁干扰不敏感。
      \n  (D) 以上说法都不对。
      \n48.下述哪一个电缆类型支持最大的电缆长度?©
      \n  (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
      \n49.下述哪个说法是正确的?(D)
      \n  (A)细同轴电缆传输速率最高。
      \n  (B) 光纤电缆支持电缆运行几十公里。
      \n  © 屏蔽双绞线电缆对电磁干扰不敏感。
      \n  (D) 以上说法都不对。
      \n50.下述哪一个电缆类型支持最大的电缆长度?©
      \n  (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
      \nps:不保证完全正确,仅用来偷懒
    32. \n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/5eef9793.html", + "title": "计算机网络第二章物理层课堂练习答案", + "summary": "用来偷懒的答案", + "date_modified": "2020-03-15T19:22:27.000Z", + "date_published": "2020-03-15T19:22:27.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "计算机网络" + ] + }, + { + "id": "/8612fa7f/e00fc567/5ac6f809/49af668f.html", + "content_html": "

    \"动漫美图\"

    \n\n\n

    # 一个让人烦躁的bug

    \n

      今天写代码,一个简单的查询,总是出现++java.math.BigDecimal cannot be cast to java.lang.Integer++,项目是热部署的,以为是缓存,清除一遍又一遍还是无效。我试着用toString方法转字符串然后转int,结果出现了异常,但是注释掉的代码可以运行

    \n

    \"转换异常\",看不出哪里有异常转换,我也有点好奇Map<String, Integer>是怎么变成Map<String, BigDecimal>的。
    \n\"类型变化\"
    \n我手动写了一个Map<String, Integer>尝试放入一个BigDecimal,结果编译失败了!

    \n

    \"编译失败\"

    \n

    查询使用了mybatis3.2.6框架(不是plus), resultType=“java.util.Map”
    \n下面是sql

    \n
    select MONTH(日期) as month,SUM(amount) AS total FROM `销售` where YEAR(日期) = #{year} GROUP BY MONTH(日期);\n
    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/49af668f.html", + "title": "一个bug", + "date_modified": "2020-03-14T21:55:57.000Z", + "date_published": "2020-03-14T21:55:57.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "bug" + ] + }, + { + "id": "/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html", + "content_html": "

    \"安卓路线图\"

    \n\n\n

    # Android Stdio下载

    \n

    网盘下载
    \n官网下载

    \n

    # 安装过程

    \n

    一直点next就行了,注意一下几点:

    \n
      \n
    1. AS安装路径不能与sdk路径一样
    2. \n
    \n

    \"安装路径配置\"

    \n

    \"错误图片\"

    \n
      \n
    1. 安装目录不能是中文,如果安装目录是中文,AS会提示错误 ++Your SDK location contains non-ASCII characters++
    2. \n
    \n

    \"Your

    \n

    # App运行方式

    \n

    # 模拟器运行

    \n

    \"模拟器运行图片\"
    \n手机型号可以自己选,然后点next
    \n\"手机选择\"
    \n选择镜像(安卓版本),然后点next,后面配置可以不动,点Finish
    \n\"安卓版本\"
    \n完成图片
    \n\"配置完成图片\"
    \n\"启动图片\"
    \ntip:模拟器默认安装在C盘,可以通过教程修改传送门

    \n

    # 真机运行

    \n

    插上安卓手机,打开usb调试打开方式,手机出现提示时点同意
    \n\"usb调试授权\"

    \n

    第一次写blog,不足之处多多见谅

    \n", + "url": "https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html", + "title": "安卓开发学习--安装开发环境", + "date_modified": "2020-03-05T07:55:57.000Z", + "date_published": "2020-03-05T07:55:57.000Z", + "author": { + "name": "Dragon Dyt" + }, + "tags": [ + "安卓开发学习" + ] + } + ] +} \ No newline at end of file diff --git a/images/0072Vf1pgy1foxk7mecohj31hc0u048p.jpg b/images/0072Vf1pgy1foxk7mecohj31hc0u048p.jpg new file mode 100644 index 0000000..e8ef976 Binary files /dev/null and b/images/0072Vf1pgy1foxk7mecohj31hc0u048p.jpg differ diff --git a/images/androidStudioWonTOpen.png b/images/androidStudioWonTOpen.png new file mode 100644 index 0000000..642a97b Binary files /dev/null and b/images/androidStudioWonTOpen.png differ diff --git a/images/avatar.jpg b/images/avatar.jpg new file mode 100644 index 0000000..d5d7a7a Binary files /dev/null and b/images/avatar.jpg differ diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..05c01fc --- /dev/null +++ b/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Hi, DIYgod", + "short_name": "Hi, DIYgod", + "description": "Vue-powered Static Site Generator", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#fff", + "background_color": "#fff", + "display": "standalone", + "start_url": "/index.html" +} diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 0000000..24b47c9 --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "VuePress", + "short_name": "VuePress", + "description": "Vue-powered Static Site Generator", + "start_url": "/index.html", + "display": "standalone", + "background_color": "#fff", + "theme_color": "#3eaf7c", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/images/icons/android-chrome-384x384.png", + "sizes": "384x384", + "type": "image/png" + } + ] +} diff --git a/mstile-150x150.png b/mstile-150x150.png new file mode 100644 index 0000000..2dbc29b Binary files /dev/null and b/mstile-150x150.png differ diff --git a/mstile-150x150.webp b/mstile-150x150.webp new file mode 100644 index 0000000..be15b8e Binary files /dev/null and b/mstile-150x150.webp differ diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..e72168a --- /dev/null +++ b/robots.txt @@ -0,0 +1,11 @@ +User-agent: * +Allow: / +Allow: /archives/ +Allow: /categories/ +Allow: /tags/ +Allow: /about/ +Disallow: /diary/ +Crawl-delay: 5 + +Sitemap: https://blog.dragondyt.top/sitemap-index.xml +Sitemap: https://blog.dragondyt.top/sitemap-0.xml diff --git a/rss.xml b/rss.xml new file mode 100644 index 0000000..4e6895c --- /dev/null +++ b/rss.xml @@ -0,0 +1,3551 @@ + + + + 这是一个无聊的人搭建的博客 + https://blog.dragondyt.top + 这是一个无聊的人搭建的博客 + Thu, 28 Sep 2023 07:24:11 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + zh-CN + + 这是一个无聊的人搭建的博客 + https://cdn.jsdelivr.net/gh/amehime/shoka@30732f13/images/avatar.jpg + https://blog.dragondyt.top + + All rights reserved 2021, Dragon Dyt + 计算机 + + + <![CDATA[OpenGL环境测试]]> + https://blog.dragondyt.top/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html + https://blog.dragondyt.top/8612fa7f/e00fc567/OpenGL/ecdcd4fc.html + Thu, 28 Sep 2023 07:24:11 GMT + 日志

    +
    2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: eglCreateContext: EGL_BAD_CONFIG: no ES 3 support
    +2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/EGL_emulation: tid 6601: eglCreateContext(1682): error 0x3005 (EGL_BAD_CONFIG)
    +2022-09-27 13:55:55.593 6546-6601/com.example.opengl E/AndroidRuntime: FATAL EXCEPTION: GLThread 501
    +    Process: com.example.opengl, PID: 6546
    +    java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG
    +        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1223)
    +        at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1214)
    +        at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1064)
    +        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1431)
    +        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1272)
    +
    +
    +

    估计是电脑没显卡导致的

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) +
    + + <![CDATA[安卓Studio打不开]]> + https://blog.dragondyt.top/8612fa7f/e00fc567/3632a017/af753a41.html + https://blog.dragondyt.top/8612fa7f/e00fc567/3632a017/af753a41.html + Thu, 28 Sep 2023 07:24:11 GMT + 安卓Studio打不开

    +

    莫名奇妙的问题,idea能打开。难道有单独的变量设置?最后没找到。
    +官网上的针对IDE能打开的情况,这不是废话吗,能打开什么都好说。。。

    +

    通过bat打开后发现Android Studio 使用的是java11,而我坏境JavaHome是1.8。但是之前就很正常,而且它是自带环境的,卸载重装也没用

    +

    最后给我的java环境升级到了java19,成功解决问题。

    +

    问题不到,开发时可以指定java版本,外部就用最高的长期支持版吧!

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) +
    + + <![CDATA[[160]相交链表]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/389d18c2.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/389d18c2.html + Thu, 04 Aug 2022 10:20:55 GMT + public class Solution { + public ListNode getIntersectionNode(ListNode headA, ListNode headB) { + // p1 指向 A 链表头结点,p2 指向 B 链表头结点 + ListNode p1 = headA, p2 = headB; + while (p1 != p2) { + // p1 走一步,如果走到 A 链表末尾,转到 B 链表 + if (p1 == null) { + p1 = headB; + } else { + p1 = p1.next; + } + // p2 走一步,如果走到 B 链表末尾,转到 A 链表 + if (p2 == null) { + p2 = headA; + } else { + p2 = p2.next; + } + } + return p1; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 + + + <![CDATA[[2073]买票需要的时间]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/340249a9/76a66db0.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/340249a9/76a66db0.html + Thu, 04 Aug 2022 09:48:19 GMT + class Solution { + public int timeRequiredToBuy(int[] tickets, int k) { + int ret = 0; + for (int i = 0; i < tickets.length; i++) { + if (i <= k) { + ret = ret + Math.min(tickets[i], tickets[k]); + } else { + ret = ret + Math.min(tickets[i], tickets[k] - 1); + } + } + return ret; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 二叉树 + + + <![CDATA[[剑指 Offer II 022]链表中环的入口节点]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/9862a150.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/9862a150.html + Wed, 03 Aug 2022 16:10:45 GMT + /** + * Definition for singly-linked list. + * class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ +public class Solution { + public ListNode detectCycle(ListNode head) { + //如果用两个指针 + ListNode fast = head, slow = head; + while (fast != null && fast.next != null) { + fast = fast.next.next; + slow = slow.next; + if (fast == slow) { + break; + } + } + if (fast == null || fast.next == null) { + return null; + } + slow = head; + while (slow!=fast){ + slow = slow.next; + fast = fast.next; + } + return slow; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + + + <![CDATA[[141]环形链表]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/69a9925d.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/69a9925d.html + Wed, 03 Aug 2022 15:57:27 GMT + /** + * Definition for singly-linked list. + * class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ +public class Solution { + public boolean hasCycle(ListNode head) { + ListNode fast = head, slow = head; + // 快指针走到末尾时停止 + while (fast != null && fast.next != null) { + slow = slow.next; + fast = fast.next.next; + // 快慢指针相遇,说明含有环 + if (slow == fast) { + return true; + } + } + return false; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 + + + <![CDATA[[876]链表的中间结点]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.html + Wed, 03 Aug 2022 15:44:27 GMT + /** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode middleNode(ListNode head) { + //简单的话应该是循环一遍,获取长度,如果是偶数则长度加一,然后获取中点,再循环一次 + // 快慢指针初始化指向 head + ListNode slow = head, fast = head; + // 快指针走到末尾时停止 + while (fast != null && fast.next != null) { + // 慢指针走一步,快指针走两步 + slow = slow.next; + fast = fast.next.next; + } + // 慢指针指向中点 + return slow; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 + + + <![CDATA[[19]删除链表的倒数第 N 个结点]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/36462e02.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/36462e02.html + Wed, 03 Aug 2022 15:19:58 GMT + /** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + public ListNode removeNthFromEnd(ListNode head, int n) { + //删除倒数第N个,那我怎么知道N的位置,链表长度不是固定的 + //假设是1到x,那么第倒数第N个应该是 X - N + 1 + //Y = X - N + 1 ,则 + // 虚拟头结点 + ListNode pre = new ListNode(0); + pre.next = head; + ListNode start = pre, end = pre; + // p1 先走 n 步 + while (n != 0) { + start = start.next; + n--; + } + // p1 和 p2 同时走 x - n 步,当p1走完时,p2走了 x-n步,停在X - N + 1上 + while (start.next != null) { + start = start.next; + end = end.next; + } + end.next = end.next.next; + return pre.next; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 + + + <![CDATA[[剑指 Offer 22]链表中倒数第k个节点]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/8f835b6d.html + Thu, 28 Jul 2022 16:59:09 GMT + class Solution { + public ListNode getKthFromEnd(ListNode head, int k) { + ListNode p1 = head; + // p1 先走 k 步 + for (int i = 0; i < k; i++) { + p1 = p1.next; + } + ListNode p2 = head; + // p1 和 p2 同时走 n - k 步 + while (p1 != null) { + p2 = p2.next; + p1 = p1.next; + } + // p2 现在指向第 n - k + 1 个节点,即倒数第 k 个节点 + return p2; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 + + + <![CDATA[[23]合并K个升序链表]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.html + Thu, 28 Jul 2022 16:10:15 GMT + class Solution { + public ListNode mergeKLists(ListNode[] lists) { + if (lists.length == 0) return null; + // 虚拟头结点 + ListNode dummy = new ListNode(-1); + ListNode p = dummy; + // 优先级队列,最小堆 + PriorityQueue<ListNode> pq = new PriorityQueue<>( + lists.length, (a, b)->(a.val - b.val)); + // 将 k 个链表的头结点加入最小堆 + for (ListNode head : lists) { + if (head != null) + pq.add(head); + } + + while (!pq.isEmpty()) { + // 获取最小节点,接到结果链表中 + ListNode node = pq.poll(); + p.next = node; + if (node.next != null) { + pq.add(node.next); + } + // p 指针不断前进 + p = p.next; + } + return dummy.next; + } +} + +

    总结:优先级队列

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 +
    + + <![CDATA[[21]合并两个有序链表]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2a1f0504.html + Thu, 28 Jul 2022 15:58:04 GMT + class Solution { + public ListNode mergeTwoLists(ListNode list1, ListNode list2) { + // 虚拟头结点 + ListNode dummy = new ListNode(-1), p = dummy; + ListNode p1 = l1, p2 = l2; + + while (p1 != null && p2 != null) { + // 比较 p1 和 p2 两个指针 + // 将值较小的的节点接到 p 指针 + if (p1.val > p2.val) { + p.next = p2; + p2 = p2.next; + } else { + p.next = p1; + p1 = p1.next; + } + // p 指针不断前进 + p = p.next; + } + + if (p1 != null) { + p.next = p1; + } + + if (p2 != null) { + p.next = p2; + } + + return dummy.next; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 + + + <![CDATA[[86]分隔链表]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/3758805c.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/3758805c.html + Thu, 28 Jul 2022 15:58:04 GMT + class Solution { + public ListNode partition(ListNode head, int x) { + // 存放小于 x 的链表的虚拟头结点 + ListNode dummy1 = new ListNode(-1); + // 存放大于等于 x 的链表的虚拟头结点 + ListNode dummy2 = new ListNode(-1); + // p1, p2 指针负责生成结果链表 + ListNode p1 = dummy1, p2 = dummy2; + // p 负责遍历原链表,类似合并两个有序链表的逻辑 + // 这里是将一个链表分解成两个链表 + ListNode p = head; + while (p != null) { + if (p.val >= x) { + p2.next = p; + p2 = p2.next; + } else { + p1.next = p; + p1 = p1.next; + } + // 断开原链表中的每个节点的 next 指针 + ListNode temp = p.next; + p.next = null; + p = temp; + } + // 连接两个链表 + p1.next = dummy2.next; + + return dummy1.next; + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 链表 + + + <![CDATA[二叉搜索树]]> + https://blog.dragondyt.top/8612fa7f/79666db/7b216a3b/7cab1e06.html + https://blog.dragondyt.top/8612fa7f/79666db/7b216a3b/7cab1e06.html + Wed, 20 Jul 2022 15:11:43 GMT + 别名
    +二叉搜索树,二叉查找树,BST,Binary Search Tree

    +

    特点

    +
      +
    1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    2. +
    3. 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    4. +
    5. 任意节点的左、右子树也分别为二叉查找树;
    6. +
    7. 没有键值相等的节点。
    8. +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) +
    + + <![CDATA[[230]二叉搜索树中第K小的元素]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/77c5fdb1.html + Wed, 20 Jul 2022 14:24:17 GMT + class Solution { + int rank,res = 0; + public int kthSmallest(TreeNode root, int k) { + traverse(root,k); + return res; + } + private void traverse(TreeNode root, int k) { + if (root == null) { + return; + } + traverse(root.left,k); + //二叉搜索树的特点,若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值,因此先序遍历的就是第k小 + rank++; + if (k == rank) { + res = root.val; + return; + } + traverse(root.right,k); + } +} + +]]> + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 二叉树 + + + <![CDATA[[105]从前序与中序遍历序列构造二叉树]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/c7081503.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/c7081503.html + Wed, 20 Jul 2022 12:40:11 GMT + /** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +class Solution { + public TreeNode buildTree(int[] preorder, int[] inorder) { + return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); + } + + private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) { + if (preStart > preEnd) { + return null; + } //根的值 + int rootVal = preorder[preStart]; + //中序中根的位置 + int index = 0; + for (int i = inStart; i <= inEnd; i++) { + if (inorder[i] == rootVal) { + index = i; + break; + } + } + //根节点左边节点数 + int leftSize = index - inStart; + TreeNode root = new TreeNode(rootVal); + //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ] + //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ] + root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1); + root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd); + return root; + } +} + +

    改进

    +
    class Solution {
    +  Map<Integer,Integer> valOrderMap = new HashMap<>();
    +  public TreeNode buildTree(int[] preorder, int[] inorder) {
    +    for (int j = 0; j < inorder.length; j++) {
    +      valOrderMap.put(inorder[j],j);
    +    }
    +    return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
    +  }
    +
    +  private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int preEnd, int inStart, int inEnd) {
    +    if (preStart > preEnd) {
    +      return null;
    +    }   //根的值
    +    int rootVal = preorder[preStart];
    +    //中序中根的位置
    +    int index = valOrderMap.get(rootVal);
    +    //根节点左边节点数
    +    int leftSize = index - inStart;
    +    TreeNode root = new TreeNode(rootVal);
    +    //[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
    +    //[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
    +    root.left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);
    +    root.right = buildTree(preorder, inorder, preStart + 1 + leftSize, preEnd, index + 1, inEnd);
    +    return root;
    +  }
    +}
    +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 二叉树 +
    + + <![CDATA[[124]二叉树中的最大路径和]]> + https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html + https://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.html + Wed, 20 Jul 2022 09:34:52 GMT + 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。

    +

    路径和 是路径中各节点值的总和。

    +

    给你一个二叉树的根节点 root ,返回其 最大路径和。

    +

    示例 1:
    +示例 1
    +输入:root = [1,2,3]
    +输出:6
    +解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

    +

    示例 2:
    +示例 2
    +输入:root = [-10,9,20,null,null,15,7]
    +输出:42
    +解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

    +

    提示:

    +
      +
    • 树中节点数目范围是 [1, 3 * 10⁴]
    • +
    • -1000 <= Node.val <= 1000
    • +
    +

    Related Topics

    +
      +
    • +
    • 深度优先搜索
    • +
    • 动态规划
    • +
    • 二叉树
    • +
    • 👍 1658
    • +
    • 👎 0
    • +
    +
    /**
    + * Definition for a binary tree node.
    + * public class TreeNode {
    + *     int val;
    + *     TreeNode left;
    + *     TreeNode right;
    + *     TreeNode() {}
    + *     TreeNode(int val) { this.val = val; }
    + *     TreeNode(int val, TreeNode left, TreeNode right) {
    + *         this.val = val;
    + *         this.left = left;
    + *         this.right = right;
    + *     }
    + * }
    + */
    +class Solution {
    +  int res = Integer.MIN_VALUE;
    +
    +  public int maxPathSum(TreeNode root) {
    +    // 后序位置
    +    oneSideMax(root);
    +    return res;
    +  }
    +
    +  private int oneSideMax(TreeNode root){
    +    if (root == null) {
    +      return 0;
    +    }
    +    int left = Math.max(0, oneSideMax(root.left));
    +    int right = Math.max(0, oneSideMax(root.right));
    +    res = Math.max(res, left + right + root.val);
    +    return Math.max(left, right) + root.val;
    +  }
    +}
    +//leetcode submit region end(Prohibit modification and deletion)
    +
    +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 算法 + 二叉树 +
    + + <![CDATA[gateway配合nacos SERVICE_UNAVAILABLE “Unable to find instance for xxx]]> + https://blog.dragondyt.top/8612fa7f/47867b98/Java/fd72446f.html + https://blog.dragondyt.top/8612fa7f/47867b98/Java/fd72446f.html + Fri, 14 May 2021 17:34:35 GMT + 动漫美图

    + + +

    gateway配合nacos 找不到服务的问题

    +
    gateway版本: 3.0.2
    +
    +
    nacos版本: 1.4.1
    +
    +

    在这里插入图片描述

    +

    在这里插入图片描述
    +gateway出错了,没有任何异常信息,增加自定义异常处理后,通过日志发现一个关键词NoLoadBalancer,突然就想到Spring Cloud2020移除了Ribbon,加入依赖后成功解决问题.

    +
    <dependency>
    +   <groupId>org.springframework.cloud</groupId>
    +   <artifactId>spring-cloud-loadbalancer</artifactId>
    +   <version>对应版本</version>
    +</dependency>
    +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + java +
    + + <![CDATA[win10下hadoop学习]]> + https://blog.dragondyt.top/8612fa7f/ec060e02/Hadoop/15d9e331.html + https://blog.dragondyt.top/8612fa7f/ec060e02/Hadoop/15d9e331.html + Fri, 23 Apr 2021 21:55:57 GMT + 动漫美图

    + + +

    下载

    +

    下载hadoop

    +

    在这里插入图片描述

    +

    配置环境变量

    +

    在这里插入图片描述
    +path路径
    +在这里插入图片描述

    +

    配置文件

    +

    hadoop-3.2.2\etc\hadoop\core-site.xml

    +
    <?xml version="1.0" encoding="UTF-8"?>
    +<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    +<configuration>
    + <property>
    +        <name>fs.defaultFS</name>
    +        <value>hdfs://localhost:9000/</value>
    + </property>
    + <!-- 当前用户全设置成root -->
    +<property>
    +<name>hadoop.http.staticuser.user</name>
    +<value>root</value>
    +</property>
    +
    +<!-- 不开启权限检查 -->
    +<property>
    +<name>dfs.permissions.enabled</name>
    +<value>false</value>
    +</property>
    +
    +</configuration>
    +
    +
    +

    hadoop-3.2.2\etc\hadoop\hdfs-site.xml

    +
    <?xml version="1.0" encoding="UTF-8"?>
    +<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    +<configuration>
    +    <property>
    +        <name>dfs.namenode.name.dir</name>
    +        <value>/d:/DevTools/hadoop-3.2.2/data/namenode</value>
    +        <description>NameNode directory for namespace and transaction logs storage.</description>
    +    </property>
    +    <property>
    +        <name>dfs.datanode.data.dir</name>
    +        <value>/d:/DevTools/hadoop-3.2.2/data/datanode</value>
    +        <description>DataNode directory</description>
    +    </property>
    +    <property>
    +        <name>dfs.replication</name>
    +        <value>2</value>
    +    </property>
    +</configuration>
    +
    +
    +

    hadoop-3.2.2\etc\hadoop\mapred-site.xml

    +
    <?xml version="1.0"?>
    +<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    +<configuration>
    +    <property>
    +        <name>mapreduce.framework.name</name>
    +        <value>yarn</value>
    +    </property>
    +</configuration>
    +
    +
    +

    hadoop-3.2.2\etc\hadoop\yarn-site.xml

    +
    <?xml version="1.0"?>
    +<configuration>
    +<property>
    +        <name>yarn.nodemanager.aux-services</name>
    +        <value>mapreduce_shuffle</value>
    +    </property>
    +    <property>
    +        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    +        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    +    </property>
    +    <property>
    +        <name>yarn.resourcemanager.hostname</name>
    +        <value>localhost</value>
    +    </property>
    +</configuration>
    +
    +

    缺失文件

    +

    在这里插入图片描述
    +github下载

    +

    遇到的问题

    +

    在这里插入图片描述

    +
    +

    解决方案:安装DirectX修复工具增强版修复系统组件缺失,在C://Windows/System32目录下放置hadoop.dll

    +
    +

    在这里插入图片描述

    +
    +

    ps: 本来打算放弃的,win下的坑太多了,一顿瞎搞后终于成功了,还有点小问题

    +
    +

    在这里插入图片描述

    +

    节点未格式化

    +

    执行

    +
    hdfs namenode  -format
    +
    +

    输入Y
    +在这里插入图片描述

    +

    启动

    +

    执行命令或双击hadoop-3.2.2\sbin下的start-all.cmd

    +
    ./start-all.cmd
    +
    +

    访问8088

    +

    在这里插入图片描述

    +

    访问9000

    +

    It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.

    +

    访问9870(hadoop新版本默认)

    +

    在这里插入图片描述

    +

    关闭

    +

    执行命令或双击hadoop-3.2.2\sbin下的stop-all.cmd

    +
    ./stop-all.cmd
    +
    +

    开发时修改权限

    +

    core-site.xml

    +
    <!-- 当前用户全设置成root -->
    +<property>
    +<name>hadoop.http.staticuser.user</name>
    +<value>root</value>
    +</property>
    +
    +<!-- 不开启权限检查 -->
    +<property>
    +<name>dfs.permissions.enabled</name>
    +<value>false</value>
    +</property>
    +
    +
    +

    测试

    +

    环境准备

    +
      +
    1. 使用图形界面添加等会用的的目录
    2. +
    3. 上传测试文件word,内容为
    4. +
    +
    my name is abc, I can read abc.
    +this is a demo for mapreduce
    +I'm learning hadoop
    +hadoop and mapreduce
    +
    +

    在这里插入图片描述

    +

    代码编写

    +

    pom.xml

    +
    ...
    +        <!-- hadoop 依赖 -->
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-hdfs</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-client</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-mapreduce-client-core</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +        <dependency>
    +            <groupId>org.apache.hadoop</groupId>
    +            <artifactId>hadoop-common</artifactId>
    +            <version>2.10.0</version>
    +        </dependency>
    +...
    +
    +
    package com.hadoop.demo.mapreduce;
    +import org.apache.hadoop.conf.Configuration;
    +import org.apache.hadoop.fs.Path;
    +import org.apache.hadoop.io.IntWritable;
    +import org.apache.hadoop.io.Text;
    +import org.apache.hadoop.mapreduce.Job;
    +import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    +import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    +import java.io.IOException;
    +public class MyJob {
    +    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    +        //1 Configuration创建配置对象
    +        Configuration cfg=new Configuration();
    +        //2 getInstance创建job对象
    +        Job job = Job.getInstance(cfg);
    +        //3 set设置job,map,reduce类,map,reduce输出类
    +        job.setJarByClass(MyJob.class);
    +        job.setMapperClass(MyMap.class);
    +        job.setReducerClass(MyReduce.class);
    +        job.setOutputKeyClass(Text.class);
    +        job.setOutputValueClass(IntWritable.class);
    +        job.setMapOutputKeyClass(Text.class);
    +        job.setMapOutputValueClass(IntWritable.class);
    +        //4 FileInputFormat.addInputPath指定读取地址
    +        FileInputFormat.addInputPath(job,new Path("hdfs://localhost:9000/wc/input"));
    +        //5 FileOutputFormat.setOutputPath指定写入地址
    +        FileOutputFormat.setOutputPath(job,new Path("hdfs://localhost:9000/wc/output"));
    +        //6 waitForCompletion等待mapreduce完成
    +        boolean flag = job.waitForCompletion(true);
    +        //7 System.exit关闭系统
    +        System.exit(flag?0:1);
    +    }
    +}
    +
    +
    package com.hadoop.demo.mapreduce;
    +import org.apache.hadoop.io.IntWritable;
    +import org.apache.hadoop.io.LongWritable;
    +import org.apache.hadoop.io.Text;
    +import org.apache.hadoop.mapreduce.Mapper;
    +import java.io.IOException;
    +public class MyMap extends Mapper<LongWritable,Text,Text,IntWritable> {
    +    private IntWritable count=new IntWritable(1);
    +    private Text w=new Text();
    +    @Override
    +    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    +        //1 toString字符串转换
    +        String line = value.toString();
    +        //2 split分割单词
    +        String[] words = line.split(" ");
    +        //3 for遍历
    +        for (String word:words){
    +            //4 set转换Text
    +            w.set(word);
    +            //5 write写入
    +            context.write(w,count);
    +        }
    +    }
    +}
    +
    +
    package com.hadoop.demo.mapreduce;
    +import org.apache.hadoop.io.IntWritable;
    +import org.apache.hadoop.io.Text;
    +import org.apache.hadoop.mapreduce.Reducer;
    +import java.io.IOException;
    +public class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
    +    private IntWritable i=new IntWritable();
    +    @Override
    +    protected void reduce(Text word, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
    +        //1 int计数器
    +        int sum=0;
    +        //2 for遍历value
    +        for (IntWritable it:values){
    +            //3 get转换int
    +            sum +=it.get();
    +        }
    +        //4 set转换IntWritable
    +        i.set(sum);
    +        //5 write写入
    +        context.write(word,i);
    +    }
    +}
    +
    +

    运行main方法就可以了

    +

    在这里插入图片描述

    +

    运行结果

    +

    在这里插入图片描述
    +在这里插入图片描述

    +

    结语

    +

    个人感觉新版本对新手友好一下,HDFS WebUI 里可以上传文件,创建目录,2.7.1好像没有.

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 大数据 +
    + + <![CDATA[win10下编译以及调试openjdk]]> + https://blog.dragondyt.top/8612fa7f/47867b98/Java/9c47706b.html + https://blog.dragondyt.top/8612fa7f/47867b98/Java/9c47706b.html + Sat, 05 Dec 2020 17:00:19 GMT + 动漫美图

    + + +

    编译OpenJDK

    +

    安装编译环境

    +

    下载openjdk

    +

    使用git clone(如果觉得慢可以使用coding导入的jdk

    +

    安装编译工具

    +

    1.win下Cygwin64环境编译

    +
      +
    1. +

      安装Cygwin

      +
        +
      1. 官方下载
      2. +
      3. 设置下载源
        +清华下载源
      4. +
      +
    2. +
    3. +

      需要安装的包
      +cywin64需要的包

      +
    4. +
    +
    补充:需要安装autoconf
    +
    +
      +
    1. 编译选项&检查
    2. +
    +
    
    +bash ./configure -with-freetype=buddle -enable-debug -with-target-bits=64 -disable-ccache
    +
    +
    +
      +
    1. 构建
    2. +
    +
    make all
    +
    +

    2.win下linux环境编译(ubuntu )

    +
      +
    1. +

      需要安装的包

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      包名命令
      gccsudo apt-get install build-essential
      FreeTypesudo apt-get install libfreetype6-dev
      CUPSsudo apt-get install libcups2-dev
      X11sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
      ALSAsudo apt-get install libasound2-dev
      libffisudo apt-get install libffi-dev
      Autoconfsudo apt-get install autoconf
      zipsudo apt-get install zip
      +
    2. +
    3. +

      执行命令

      +
    4. +
    +
     bash configure --enable-debug --with-jvm-variants=server --with-boot-jdk=/mnt/e/jdk/jdk-16 --with-tools-dir=/mnt/d/vs/2019/Community/VC/Auxiliary/Build
    +
    +

    命令解释:

    +
    +

    –with-boot-jdk 如果找不到正确jdk,通过该命令可以手动指定
    +jdk版本必须是编译版本的前一个版本
    +jdk需与目标平台(win/linux)一致

    +
    +
    +

    –with-tools-dir 指定编译工具目录,具体指向跟编译目标有关

    +
    +
    +

    注意:win下wsl默认编译win平台jdk,如果需要编译linux版本需要进行配置

    +
    +

    build.doc

    +

    遇到的问题

    +

    win10sdk路径包含括号
    +在这里插入图片描述
    +在这里插入图片描述
    +解决:更换目录
    +移动到正常目录(括号都不行,中文就更不行了
    +创建软连接

    +
       mklink /J "C:\Program Files (x86)\Windows Kits" "D:\WindowsKits"
    +
    +

    当路径包含空格,路径会被截断。(参数是路径也会,最好是不要有空格)
    +在这里插入图片描述
    +警告
    +在这里插入图片描述
    +解决:执行

    +
    make clean
    +
    +

    错误
    +在这里插入图片描述
    +解决:手动删除jdk下build文件夹

    +

    编译成功

    +

    编译成功
    +验证jdk
    +验证jdk

    +

    ps:如果可以的话直接在linux系统下编译,就不会有这么多的路径问题

    +

    调试OpenJDK

    +

    安装clion

    +

    因为我是java使用idea,clion和它属于一家公司产品,使用方式相似,上手容易。安装过程(略)

    +

    配置clion

    +

    根据编译jdk时使用的工具链,调试时应该选择对应的工具链,否则会出现debug无效的情况

    +

    上一篇文章我虽然使用wsl环境编译jdk,但编译工具使用的是vs工具链,所以调试选择vs工具链。
    +vs工具链
    +WSL配置
    +当成普通linux服务器进行连接即可,缺什么安装什么,一般是缺失cmake,gdb。
    +wsl配置

    +

    导入项目

    +
      +
    1. 导入jdk目录
    2. +
    3. 创建CMakeLists.txt
      +简易版(能调试,大量飘红,少部分代码能跳转)
    4. +
    +
    #自己版本能用就行
    +cmake_minimum_required(VERSION 3.16)
    +project(jdk)
    +# 添加源文件
    +file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
    +# 添加执行配置
    +add_executable(hotspot ${SOURCE_FILES})
    +
    +

    复杂版(emmmm,我不会cmake,百度到的都是少了,有大佬教我吗

    +
    #自己版本能用就行
    +cmake_minimum_required(VERSION 3.16)
    +project(jdk)
    +# 添加源文件
    +file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")
    +# 添加执行配置
    +add_executable(hotspot ${SOURCE_FILES})
    +
    +
      +
    1. +

      修改run configuration

      +
        +
      1. 修改executable为build/windows-x86_64-server-fastdebug/jdk/bin/java.exe
      2. +
      3. 设置参数,测试用-version,可以换成类
      4. +
      5. 删除build下before launch下的build
        +配置结果
      6. +
      +
    2. +
    +

    运行结果

    +

    断点打在src/java.base/share/native/libjli/java.c中的JavaMain函数,对c/c++不是很了解,看调用帧,这个应该是入口,下面三个点进去是汇编代码。
    +调试openjdk

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 教程 +
    + + <![CDATA[Step.3 界面显示]]> + https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/b7629dd4.html + https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/b7629dd4.html + Thu, 13 Aug 2020 21:12:48 GMT + :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    首页置顶文章

    +

    在文章的Front Matter设置sticky: true,则该文章将显示在首页最上方的置顶文章列。
    +多篇文章按照发布时间倒序排列,不分页。

    +
    ---
    +title: 置顶文章
    +sticky: true
    +---
    +
    +

    首页精选分类

    +

    想要在首页显示分类翻转块,需要按照以下示例的方式,给需要显示的分类加上封面图。

    +
      +
    1. +

      首先,修改站点配置:
      +找到category_map:,配置每个分类对应的英文映射,比如:

      +
      category_map:
      +  计算机科学: computer-science
      +  Java: java
      +  C++: cpp
      +  二进制杂谈: note
      +  计算机程序设计(C++)-西安交通大学: course-1
      +  零基础学Java语言-浙江大学-翁恺: course-1
      +  面向对象程序设计-Java语言-浙江大学-翁恺: course-2
      +
      +
      +

      注意:hexo会自动处理路径中的特殊字符,~`!@#$%^&*()-_+=[]{}|\;:"'<>,.?以及空格,这些全部会被替换成-
      +所以避免在设置中使用上述字符,否则可导致无法抓取到目录下的cover.jpg

      +
      +
    2. +
    3. +

      <root>/source/_posts文件夹相应的目录里,存放封面图
      +例子:如 第1周 计算 这篇文章。
      +所处的分类是

      +
      categories:
      +- [计算机科学, Java, 零基础学Java语言-浙江大学-翁恺]
      +
      +

      现在需要在首页显示零基础学Java语言-浙江大学-翁恺这个分类,翻转卡片后,显示这个分类下的文章们。
      +而该分类经过英文映射,它的路径将是/computer-science/java/course-1/

      +

      那么,请在<root>/source/_posts/computer-science/java/course-1/的目录下放置cover.jpg文件。
      +只要分类路径对应的目录下存在cover.jpg文件,这个分类就会在首页显示。
      +在进行hexo g时,本分类的封面图会自动被复制到public目录里相应的位置。

      +
    4. +
    5. +

      事实上,为了方便文章管理,这个分类下所有文章的md文件,我都会放在<root>/source/_posts/computer-science/java/course-1/这个目录下。

      +

      且站点配置文件里,永久链接设置如下

      +
      permalink: :title/
      +
      +

      hexo g后,文章的html文件们将全部生成到<root>/public/computer-science/java/course-1/目录。
      +具体可以查看本博客的github仓库

      +
    6. +
    7. +

      文章详情界面中的系列文章,显示的是与当前文章同一分类的其他文章,并按照文章名正序排序。

      +
    8. +
    +
    +

    o(* ̄▽ ̄*)ゞ
    +其实,不设置category_map也可以,只要在分类路径对应的文件夹下存在cover.jpg文件就行。
    +现在,这项功能与category_dir的配置也无关,hexo g生成后,图片会自动被转移到category_dir的相关子目录下。

    +
    +

    文章封面图

    +
      +
    • +

      如果文章的Front Matter设置了cover: image path,则封面会显示这张图片。

      +
      title: Images
      +cover: assets/wallpaper-2572384.jpg
      +# 或者写成
      +cover: http://placehold.it/350x150.jpg
      +---
      +
      +

      这里cover的值可以是位于source目录里的图片文件,此处是<root>/source/assets/wallpaper-2572384.jpg文件,也可以是一个某网址。

      +
    • +
    • +

      如果文章是一个gallery post,即Front Matter设置了photos,则会封面会显示设置的第一张图片。

      +
      title: Gallery Post
      +photos:
      +- assets/wallpaper-2572384.jpg
      +- assets/wallpaper-2311325.jpg
      +- assets/wallpaper-878514.jpg
      +- http://placehold.it/350x150.jpg
      +---
      +
      +

      此时默认会显示第一个图片,即位于<root>/source/assets/目录里的wallpaper-2572384.jpg

      +
    • +
    • +

      如果站点配置中设置了post_asset_folder: true,那么上述本地图片路径应为<root>/source/_posts/文章同名的文件夹/assets/wallpaper-2572384.jpg,当然此时assets目录可以省掉。

      +
    • +
    • +

      如果以上设置均不存在,将显示一张随机图片,随机图库配置戳此

      +
    • +
    +

    图片展示与相册

    +

    在文章的Front Matter设置fancybox: false,可以关闭文章页的图片展示功能。
    +使用Justified-Gallery对Gallery Post内图案进行排列。

    +

    下面介绍一些小技巧:

    +
      +
    1. 让图案下方显示title的markdown代码
    2. +
    +
    ![这里是alt](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "这里是title")
    +
    +

    这里是alt

    +
      +
    1. 设置图片的大小
    2. +
    +
    ![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度和高度"){height="100px" width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定宽度"){width="400px"}
    +
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicis081o9j20zk0m8dmr.jpg "定义图片大小-固定高度"){height="100px"}
    +
    +

    {height=“100px” width=“400px”}

    +

    {width=“400px”}

    +

    {height=“100px”}

    +
      +
    1. 除了在Front Matter里配置photos可以显示相册图案列表外,还可以这样写
    2. +
    +
    ## 图案列表No.1
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclfdu6exj20zk0m87hw.jpg "这里是title")
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclflwv2aj20zk0m84qp.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclg5ms2rj20zk0m8u0x.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclhnx9glj20zk0m8npd.jpg)
    +{.gallery}
    +
    +## 图案列表No.2
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicitht3xtj20zk0m8k5v.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1giclil3m4ej20zk0m8tn8.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gicljgocqbj20zk0m8e81.jpg)
    +![](https://tva3.sinaimg.cn/large/6833939bly1gipetfk5zwj20zk0m8e81.jpg)
    +{.gallery data-height="120"}
    +
    +

    data-height用来设置每行的高度,默认为220

    +

    图案列表No.1

    +


    +
    +
    +
    +{.gallery}

    +

    图案列表No.2

    +


    +
    +
    +
    +{.gallery data-height=“120”}

    +

    自定义页面配色

    +

    主题配色全部在<root>/themes/shoka/source/css/_colors.styl文件中,可以自行查看。

    +

    <root>/source/_data/目录新建文件colors.styl,在此文件中添改样式。

    +
    +

    自定义colors.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    +
    +

    主题支持在<root>/source/_data/目录建立三个自定义styl文件:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    自定义文件名对应默认样式文件样式功能
    colors.styl_colors.styl页面配色
    iconfont.styl_iconfont.styl图标样式
    custom.styl-任意自定义样式
    +

    自定义主题图片

    +

    如果想要修改主题的<root>/themes/shoka/source/images/目录内的某张图片,请在<root>/source/_data/目录新建目录images,并在这个文件夹中添加++同名++文件,部署时将自动覆盖主题内的默认图片。

    +

    可以用此方法自定义头像、打赏二维码等图片,并且避免覆盖更新主题时遗失自定义文件。

    +

    自定义语言包

    +

    本功能参考NexT,主要可以用来定义菜单等处显示的文字,且可以方便主题无脑覆盖升级。

    +

    <root>/source/_data/目录新建文件languages.yml

    +

    按照以下格式添加配置项:

    +
    # language
    +zh-CN:
    +  # items
    +  post:
    +    copyright:
    +      # the translation you perfer
    +      author: 本文博主
    +en:
    +  menu:
    +    travellings: Travellings
    +
    +

    可以参考主题目录下的example/source/_data文件夹。

    +
    +

    站点配置及文件的Front Matter中,language项只支持zh-CNzh-HKzh-TWjaen
    +类似写成zh_CN这样是不可以的。

    +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 二进制杂谈 + Theme Shoka Documentation +
    + + <![CDATA[Step.2 基本配置]]> + https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/85a3718.html + https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/85a3718.html + Thu, 13 Aug 2020 20:56:48 GMT + :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    站点别称

    +
    alternate: Yume Shoka
    +
    +

    这里设置的名称代替Logo,显示在页面顶部,以及页尾©️处

    +

    静态文件目录

    +
    statics: / #//cdn.jsdelivr.net/gh/amehime/shoka@latest/
    +
    +

    默认值是/,指使用本地静态文件
    +可以修改成//cdn.jsdelivr.net/gh/您的github用户名/您的项目名@latest/这种形式,以使用jsDelivr进行加速。
    +PS:jsDelivr并不是实时更新,重新生成文件后需要耐心等待

    +
    css: css
    +js: js
    +images: images
    +
    +

    静态文件所处目录的实际目录名,这些一般不改。

    +

    夜间模式

    +
    darkmode: # true
    +
    +

    默认情况下,是否开启夜间模式取决于(优先级从高到低):

    +
      +
    1. 访客点击页面头部切换按钮的自行选择
    2. +
    3. 访客切换了浏览设备的主题色调
    4. +
    5. 您的darkmode配置项
    6. +
    +

    自动定位

    +
    auto_scroll: # false
    +
    +

    默认情况下,再次打开页面时,会自动滚动到上次浏览的位置。
    +这个选项设为false时将停用此功能。

    +

    加载动画

    +
    # 是否显示页面加载动画loading-cat
    +loader:
    +  start: true # 当初次打开页面时,显示加载动画
    +  switch: true # tab切换到其他页面时,显示加载动画
    +
    +

    tab切换后只是显示loading动画,实际并未重新加载页面

    +

    页面特效

    +

    单击页面的烟花效果配置如下

    +
    fireworks:
    +  enable: true # 是否启用
    +  color: # 烟花颜色
    +    - "rgba(255,182,185,.9)"
    +    - "rgba(250,227,217,.9)"
    +    - "rgba(187,222,214,.9)"
    +    - "rgba(138,198,209,.9)"
    +
    +

    加载谷歌字体

    +
    font:
    +  enable: true
    +  # Font options:
    +  # `external: true` will load this font family from `host` above.
    +  # `family: Times New Roman`. Without any quotes.
    +  # `size: x.x`. Use `em` as unit. Default: 1 (16px)
    +
    +  # Global font settings used for all elements inside <body>.
    +  global:
    +    external: true
    +    family: Mulish
    +    size:
    +
    +  # Font settings for alternate title.
    +  logo:
    +    external: true
    +    family: Fredericka the Great
    +    size: 3.5
    +
    +  # Font settings for site title.
    +  title:
    +    external: true
    +    family: Noto Serif JP
    +    size: 2.5
    +
    +  # Font settings for headlines (<h1> to <h6>).
    +  headings:
    +    external: true
    +    family: Noto Serif SC
    +    size:
    +
    +  # Font settings for posts.
    +  posts:
    +    external: true
    +    family:
    +
    +  # Font settings for <code> and code blocks.
    +  codes:
    +    external: true
    +    family: Inconsolata
    +
    +

    此功能基本参考NexT。
    +加粗标题的字体总是使用Noto Serif,为了正确友好的显示日文中的汉字,会先后加载headingstitle的字体设置。

    +

    iconfont图标

    +

    主题没有直接使用Font Awesome,是因为用不到那么多icon感觉非常浪费,因此在Iconfont上重新建立了一个项目。
    +font-family设为ic,所有字体样式前缀为i-,具体参见<root>/themes/shoka/source/css/_iconfont.styl

    +
    # project of https://www.iconfont.cn/
    +# //at.alicdn.com/t/font_1832207_c8i9n1ulxlt.css => 1832207_c8i9n1ulxlt
    +iconfont: "1832207_c8i9n1ulxlt"
    +
    +

    如果需要添加或修改,请留言告诉我您的Iconfont用户名,我将把您添加到目前的项目中。

    +

    添加权限为只读,此后您可以任意全选,批量保存到购物车中,添加至您自己的项目里,并将主题配置文件中的iconfont值改为您的项目。

    +

    注意,您的项目应设置FontClass/Symbol 前缀i-

    +

    <root>/source/_data/目录新建文件iconfont.styl,把新增或修改的图标样式复制到这个文件中。

    +
    +

    自定义iconfont.styl文件将覆盖主题默认样式,为了避免出错,请保证原有样式名均存在,在原有样式基础上进行增删改。

    +
    +

    菜单与社交按钮

    +
    menu:
    +  home: / || home
    +  about: /about/ || user
    +  posts:
    +    default: / || feather
    +    archives: /archives/ || list-alt
    +    categories: /categories/ || th
    +    tags: /tags/ || tags
    +  # friends: /friends/ || heart
    +  # links: /links/ || magic
    +
    +social:
    +  github: https://github.com/yourname || github || "#191717"
    +  #google: https://plus.google.com/yourname || google
    +  twitter: https://twitter.com/yourname || twitter || "#00aff0"
    +  zhihu: https://www.zhihu.com/people/yourname || zhihu || "#1e88e5"
    +  music: https://music.163.com/#/user/home?id=yourid || cloud-music || "#e60026"
    +  weibo: https://weibo.com/yourname || weibo || "#ea716e"
    +  about: https://about.me/yourname || address-card || "#3b5998"
    +  #email: mailto:yourname@mail.com || envelope || "#55acd5"
    +  #facebook: https://www.facebook.com/yourname || facebook
    +  #stackoverflow: https://stackoverflow.com/yourname || stack-overflow
    +  #youtube: https://youtube.com/yourname || youtube
    +  #instagram: https://instagram.com/yourname || instagram
    +  #skype: skype:yourname?call|chat || skype
    +  #douban: https://www.douban.com/people/yourname/ || douban
    +
    +

    如上,使用||作为分隔符,依次为 链接 || 图标 || 颜色
    +注意,只需要写图标名称,如github,则会自动转换为ic i-github
    +十六进制颜色码需要""包绕。

    +

    menu 支持一级子目录,子目录设置中的第一项必须为default,用来定义父级按钮的样式。

    +

    菜单显示文字可以在语言包中定义,具体请戳这里

    +

    边栏配置

    +

    边栏可以选择在左侧,或右侧
    +修改头像文件的地址,相对于静态文件目录images中配置的路径。

    +
    sidebar:
    +  # Sidebar Position.
    +  position: left
    +  #position: right
    +  # Replace the default avatar image and set the url here.
    +  avatar: avatar.jpg
    +
    +

    可以将自己的图片放在<root>/source/_data/images/目录,甚至以同名覆盖主题内默认的头像图片,具体请戳这里

    +

    底部widgets

    +

    目前页面底部可以显示两个小部件,即随机文章最近评论

    +
    widgets:
    +  random_posts: true # 显示随机文章
    +  recent_comments: true # 显示最近评论
    +
    +

    字数及阅读时间统计

    +

    安装好hexo-symbols-count-time插件后,不需要修改站点配置文件,直接使用插件默认配置就行。

    +

    需要修改主题配置文件,找到两处cout,修改为true

    +
    # 页尾全站统计
    +footer:
    +  since: 2010
    +  count: true
    +
    +# 文章界面统计
    +post:
    +  count: true
    +
    +

    文章评论

    +

    如何获取LeanCloud的appId和appKey

    +
    valine:
    +  appId: #Your_appId
    +  appKey: #Your_appkey
    +  placeholder: ヽ(○´∀`)ノ♪ # Comment box placeholder
    +  avatar: mp # Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro
    +  pageSize: 10 # Pagination size
    +  lang: zh-CN.ts-CN
    +  visitor: true # 文章访问量统计
    +  NoRecordIP: false # 不记录IP
    +  serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
    +  powerMode: true # 默认打开评论框输入特效
    +  tagMeta:
    +    visitor: 新朋友
    +    master: 主人
    +    friend: 小伙伴
    +    investor: 金主粑粑
    +  tagColor:
    +    master: "var(--color-orange)"
    +    friend: "var(--color-aqua)"
    +    investor: "var(--color-pink)"
    +  tagMember:
    +    master:
    +      # - hash of master@email.com
    +      # - hash of master2@email.com
    +    friend:
    +      # - hash of friend@email.com
    +      # - hash of friend2@email.com
    +    investor:
    +      # - hash of investor1@email.com
    +
    +

    tag标签显示在评论者名字的后面,默认是tagMeta.visitor对应的值。
    +在tagMetatagColor中,除了visitor这个key不能修改外,其他key都可以换一换,但需要保证一致性。

    +
      tagMeta:
    +    visitor: 游客
    +    admin: 管理员
    +    waifu: 我老婆
    +  tagColor:
    +    visitor: "#855194"
    +    admin: "#a77c59"
    +    waifu: "#ed6ea0"
    +  tagMember:
    +    admin:
    +      # - hash of admin@email.com
    +    waifu:
    +      # - hash of waifu@email.com
    +
    +

    在文章Front Matter中也可以配置上述参数,访问该文章页面时,将覆盖全局配置。
    +尤其可以用来配置一个特殊的placeholder。

    +
    valine:
    +  placeholder: "1. 提问前请先仔细阅读本文档⚡\n2. 页面显示问题💥,请提供控制台截图📸或者您的测试网址\n3. 其他任何报错💣,请提供详细描述和截图📸,祝食用愉快💪"
    +---
    +
    +

    评论通知与管理工具建议使用这个Valine-Admin
    +注意SITE_URL需要以/结尾。

    +

    如果某一篇文章需要关闭评论功能,则在文章Front Matter中配置:

    +
    ---
    +title: 关闭评论
    +comment: false
    +---
    +
    +

    背景音乐

    +

    在主题配置文件中,设置全局播放列表。
    +在文章的 Front Matter 中,设置文章专有播放列表,访问该文章页面时,将覆盖全局配置。

    +
    audio:
    +  - https://music.163.com/song?id=1387098940
    +  - https://music.163.com/#/playlist?id=2088001742
    +  - https://www.xiami.com/collect/250830668
    +  - https://y.qq.com/n/yqq/playsquare/3535982902.html
    +
    +

    如上,可以直接使用网易云、虾米、QQ音乐的播放列表、单曲,可以同时填写多个。

    +
    audio:
    +  - title: 列表1
    +    list:
    +      - https://music.163.com/#/playlist?id=2943811283
    +      - https://music.163.com/#/playlist?id=2297706586
    +  - title: 列表2
    +    list:
    +      - https://music.163.com/#/playlist?id=2031842656
    +
    +

    如果需要自定义媒体文件,可以按照以下格式填写:

    +
    audio:
    +  - name: "曲目1"
    +    url: "播放地址"
    +    artist: "艺术家"
    +    cover: "封面"
    +    lrc: "歌词"
    +  - name: "曲目2"
    +    url: "播放地址"
    +    artist: "艺术家"
    +    cover: "封面"
    +    lrc: "歌词"
    +
    +
    audio:
    +    - title: 列表1
    +      list:
    +        - name: "曲目1"
    +          url: "播放地址"
    +          artist: "艺术家"
    +          cover: "封面"
    +          lrc: "歌词"
    +        - name: "曲目2"
    +          url: "播放地址"
    +          artist: "艺术家"
    +          cover: "封面"
    +          lrc: "歌词"
    +    - title: 列表2
    +      list:
    +        - https://music.163.com/#/playlist?id=2031842656
    +
    +

    如果要关闭当前页面的背景音乐播放器,则在文章Front Matter中配置:

    +
    ---
    +title: 关闭背景音乐
    +audio: false
    +---
    +
    +

    随机图库

    +
      +
    • +

      默认的图片列表位于<root>/themes/shoka/_images.yml中。
      +使用了渣浪图库,使用一些上传工具,比如这里
      +上传后图片的链接是http://wx4.sinaimg.cn/large/6833939bly1gicmnywqgpj20zk0m8dwx.jpg
      +只需要新一行写上- 6833939bly1gicmnywqgpj20zk0m8dwx.jpg

      +

      如果想要自定义,则在<root>/source/_data/目录新建一个images.yml文件,这个文件中的图片至少6枚,将完全覆盖默认的图片列表。

      +
    • +
    • +

      也可以直接在图片列表yml文件中,写上任意外链图片地址

      +
    • +
    +
    - https://i.loli.net/2020/10/30/qAMYEFXxJcKRsiG.gif
    +- https://i.loli.net/2020/10/30/rjdhcSgEN8COBPA.jpg
    +- https://i.loli.net/2020/10/30/HKyzSd7NI3mlBpt.jpg
    +- https://i.loli.net/2020/10/30/Y1CBXqgeokEs457.jpg
    +- https://i.loli.net/2020/10/30/Z5W6r2BSoiThHG1.jpg
    +
    +
      +
    • 也可以在主题配置文件中,设置图床API:
    • +
    +
    image_server: "https://acg.xydwz.cn/api/api.php"
    +
    +

    加载第三方组件

    +
    vendors:
    +  css:
    +    # 略略略
    +  js:
    +    # 略略略
    +
    +

    包括

    +

    –|–|–
    +pace | 加载进度条|全局
    +pjax | 页面无刷新加载|全局
    +anime | js动画效果|全局
    +algolia instantsearch| 基于algolia的站内搜索|全局
    +lazyload | 图片懒加载|全局
    +quicklink | 链接资源预加载|全局
    +fetch | 获取播放列表|全局
    +katex copy_tex|数学公式显示及复制|按需
    +fancybox | 图片放大显示及排列|按需
    +valine | 基于LeanCloud的评论系统及文章阅读次数统计|按需
    +chart | 图表显示|按需

    +

    以上文件加载全部基于jsDelivr,并对全局加载的组件进行了文件合并。
    +如果不明白啥意思,则不要轻易修改。

    +

    :::danger
    +主题版本升级的时候,可能会修改这里。
    +如果修改过主题默认_config.yml,记得更新主题时,末尾的vendors也要及时修改。
    +:::

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 二进制杂谈 + Theme Shoka Documentation + +
    + + <![CDATA[Step.1 依赖插件]]> + https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/d30922d5.html + https://blog.dragondyt.top/computer-science/note/theme-shoka-doc/d30922d5.html + Thu, 13 Aug 2020 20:46:48 GMT + :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    :::warning
    +请务必将hexo-renderer-multi-markdown-it升级到最新版,目前为 0.1.5
    +:::

    +

    Theme Shoka依赖以下Hexo插件

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    插件名称npm地址功能依赖程度
    hexo-renderer-multi-markdown-it链接md文件渲染器,压缩css/js/html必需
    hexo-autoprefixer链接给生成的css文件们添加浏览器前缀必需
    hexo-algoliasearch链接站内搜索功能搜索按钮失灵
    hexo-symbols-count-time链接文章或站点字数及阅读时间统计统计没有
    hexo-feed链接生成Feed文件Feed文件没有
    +
    +

    没有正确安装以上插件的话,本主题会报错or无法正确显示or部分功能失效。
    +hexo-renderer-multi-markdown-it请注意升级到最新版

    +
    +

    安装完以上插件后,修改站点配置文件,加入相关配置。

    +

    multi-markdown-it安装与配置

    +

    安装

    +
      +
    1. +

      安装前,记得务必卸载掉默认的hexo-renderer-marked,以及别的markdown文件渲染器。

      +
      npm un hexo-renderer-marked --save
      +# 或者
      +yarn remove hexo-renderer-marked
      +
      +
    2. +
    3. +

      安装

      +
      npm i hexo-renderer-multi-markdown-it --save
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it
      +
      +
    4. +
    5. +

      如果安装缓慢,或者失败
      +如报错

      +
      ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
      +
      +

      因为有一步需要下载puppeteer里的Chromium内核,基于天朝内部网络现状,这一步能不能成功要靠科学和运气,所以为了避免安装失败,需要加上--ignore-scripts跳过Chromium内核的下载。

      +
      npm i hexo-renderer-multi-markdown-it --save --ignore-scripts
      +# 或者
      +yarn add hexo-renderer-multi-markdown-it --ignore-scripts
      +
      +

      puppeteer主要是用来渲染mermaid流程图,只要文章中不使用mermaid就没有任何问题,如果要使用mermaid建议还是想办法完全安装。

      +
    6. +
    +

    配置

    +
      +
    1. 加入markdown配置,用来渲染md文件
    2. +
    +
    markdown:
    +  render: # 渲染器设置
    +    html: false # 过滤 HTML 标签
    +    xhtmlOut: true # 使用 '/' 来闭合单标签 (比如 <br />)。
    +    breaks: true # 转换段落里的 '\n' 到 <br>。
    +    linkify: true # 将类似 URL 的文本自动转换为链接。
    +    typographer: 
    +    quotes: '“”‘’'
    +  plugins: # markdown-it插件设置
    +    - plugin:
    +        name: markdown-it-toc-and-anchor
    +        enable: true
    +        options: # 文章目录以及锚点应用的class名称,shoka主题必须设置成这样
    +          tocClassName: 'toc'
    +          anchorClassName: 'anchor'
    +    - plugin:
    +        name: markdown-it-multimd-table
    +        enable: true
    +        options:
    +          multiline: true
    +          rowspan: true
    +          headerless: true
    +    - plugin:
    +        name: ./markdown-it-furigana
    +        enable: true
    +        options:
    +          fallbackParens: "()"
    +    - plugin:
    +        name: ./markdown-it-spoiler
    +        enable: true
    +        options:
    +          title: "你知道得太多了"
    +
    +
      +
    1. 加入minify配置,压缩css/js/html
    2. +
    +
    minify:
    +  html:
    +    enable: true
    +    exclude: # 排除hexo-feed用到的模板文件
    +      - '**/json.ejs'
    +      - '**/atom.ejs'
    +      - '**/rss.ejs'
    +  css:
    +    enable: true
    +    exclude:
    +      - '**/*.min.css'
    +  js:
    +    enable: true
    +    mangle:
    +      toplevel: true
    +    output:
    +    compress:
    +    exclude:
    +      - '**/*.min.js'
    +
    +
      +
    1. 停用默认代码高亮功能,否则代码块的mac样式不能正常显示。
      +找到highlightprismjs,把enable改成false
    2. +
    +
    highlight:
    +  enable: false
    +
    +prismjs:
    +  enable: false
    +
    +

    autoprefixer配置建议

    +
    autoprefixer:
    +  exclude:
    +    - '*.min.css'
    +
    +

    缺少这个插件,首页卡片翻转效果在部分浏览器中无法正确显示。

    +

    algolia配置建议

    +
    algolia:
    +  appId: #Your appId
    +  apiKey: #Your apiKey
    +  adminApiKey: #Your adminApiKey
    +  chunkSize: 5000
    +  indexName: #"shoka"
    +  fields:
    +    - title #必须配置
    +    - path #必须配置
    +    - categories #推荐配置
    +    - content:strip:truncate,0,2000
    +    - gallery
    +    - photos
    +    - tags
    +
    +

    feed配置建议

    +
    keywords: #站点关键词,用“,”分隔
    +
    +feed:
    +    limit: 20
    +    order_by: "-date"
    +    tag_dir: false
    +    category_dir: false
    +    rss:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/rss.ejs"
    +        output: "rss.xml"
    +    atom:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/atom.ejs"
    +        output: "atom.xml"
    +    jsonFeed:
    +        enable: true
    +        template: "themes/shoka/layout/_alternate/json.ejs"
    +        output: "feed.json"
    +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 二进制杂谈 + Theme Shoka Documentation +
    + + <![CDATA[Hexo主题Shoka & multi-markdown-it渲染器使用说明]]> + https://blog.dragondyt.top/computer-science/note/79abcd0d.html + https://blog.dragondyt.top/computer-science/note/79abcd0d.html + Thu, 13 Aug 2020 20:45:48 GMT + :::info
    +跳票N久终于更新的简单的使用说明

    + +

    已经支持hexo 5。
    +:::

    +

    :::info
    +因博主被学业和工作掏空,本项目已停滞更新大半年,问题也无法及时回复大家,这个悲惨状态可能还要持续半年的样子。

    +

    有很多热心小伙伴在评论区或者项目issue帮忙回答问题,非常非常感谢!

    +

    本项目是完全开源的,也有做一些example示例,大家可以随便拿随便改。
    +但是很抱歉,博主我暂时不能提供更多的支持,这个写的乱七八糟的文档,暂时也没有时间把它写得更专业一些。
    +非常对不住大家!

    +

    iconfont的添加申请,我看到留言后会尽快加上,希望各位小伙伴能看到。
    +:::

    +

    :::warning
    +当前版本更新至 0.2.5,更新记录点此

    +

    :::

    +

    :::primary
    +🚀快速开始 - 💌依赖插件 - 📌基本配置 - 🌈界面显示 - 🦄特殊功能
    +:::

    +

    设计缘由

    +

    前几年在Bear和Evernote上整理了大量笔记,非常喜欢Bear默认的markdown渲染样式。
    +后来因为换了安卓手机,用不了Bear,四处搜寻替代品,没有满意的。
    +然后阴差阳错知道了Hexo,又得知Github也可以免费建私有仓库了,故再次转移阵地到了自建博客,并部署在Github Pages。

    +

    因为这个博客是用来记笔记的,故起名书架
    +对应的主题即Theme.Shoka,可以说是为了笔记阅读而生的主题。
    +样式严重参考Bear,部分代码严重参考NexT

    +

    Hexo的默认及常用渲染器均使用highlight.js进行代码高亮,而我喜欢Prism.js,故重写了一个渲染器配合主题食用。
    +渲染器取名multi,因为集成了很多很多很多markdown-it插件,以及压缩静态文件的功能。
    +(最新版的默认渲染器也支持Prism.js了,可喜可贺,但不想用,哈哈哈哈哈哈哈

    +

    墙内Github Pages访问速度时而感人,所以用了jsDelivr加速,主要是因为它可以按需合并依赖文件。

    +

    快速安装

    +
    # cd your-blog
    +git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka
    +
    +

    打开主题目录,内有example文件夹,提供了配置文件的demo供参考。

    +

    安装依赖插件

    +

    在应用主题之前,必须至少安装 hexo-renderer-multi-markdown-it 渲染插件 和 hexo-autoprefixer

    +

    插件安装与配置教程戳此

    +

    应用主题

    +

    修改站点配置

    +

    修改站点配置文件<root>/_config.yml,把主题改为 shoka

    +
    theme: shoka
    +
    +

    修改主题配置

    +

    主题配置的所有参数在<root>/themes/shoka/_config.yml文件中。

    +

    为了方便主题升级,请在根目录新建一个yml文件,命名为_config.shoka.yml
    +也就是说,所有主题的自定义配置均保存于<root>/_config.shoka.yml文件。

    +

    主题的基础配置可以参考这里
    +界面显示相关的配置参考这里

    +

    更新记录

    +

    标签含义:
    +❗ 需要手动操作的更新信息
    +⚠️ 需要注意的更新信息
    +🔧 已修复的问题
    +⌛ TODO

    +

    0.2.4 👉 0.2.5

    +

    💡 避免直接修改主题文件,添加各种自定义:

    + +

    🔧 修复一些BUG

    +

    0.2.3 👉 0.2.4

    +

    ⚠️ 评论功能更新

    +
      +
    • MiniValine魔改版更新至beta10,修改过主题默认_config.yml的同学,记得更新末尾的vendors到最新哦
    • +
    • ❗ 评论相关的配置有更新,配置戳此 +
        +
      • 主要增加的Tag配置,现在可以各种自定义啦
      • +
      +
    • +
    +

    ⚠️ 配置新增

    + +

    ⚠️ 背景音乐功能增强,配置戳此

    +
      +
    • 可以添加多个播放列表
    • +
    • 加了一些控制按钮
    • +
    +

    ⚠️ 增加media标签,在文章中插入音频和视频播放列表,方法戳此
    +⌛ 视频播放器有待增强(显示分段标签,字幕)

    +

    🔧 随机图库支持非渣浪图床的任意图片
    +🔧 还有许多小BUG

    +

    0.2.2 👉 0.2.3

    +

    ❗ 增加主题文件外自定义语言包的功能,配置戳此
    +🔧 提高低版本浏览器兼容性

    +

    0.2.1 👉 0.2.2

    +

    ⚠️ 弃用mediumzoom,改成fancybox配置戳此
    +💡 增加语言包:繁体中文日语
    +💡 quiz功能优化,根据语言显示题型标签
    +🔧 修复评论功能中反复初始化leancloud-storage
    +🔧 修复audio: false时不能隐藏播放按钮、停止播放

    +

    0.2 👉 0.2.1

    +

    ⚠️ 配置文件添加 loader 参数,配置戳此
    +💡 二级list区别显示
    +🔧 修复浏览位置定位BUG
    +🔧 修复firework动画延迟
    +🔧 优化评论功能

    +

    0.1.9 👉 0.2

    +

    ⚠️ 评论功能大改

    +
      +
    • 弃用不开源的Valine,改用MiniValine,并且进行了魔改,项目戳此
      +主要是大量压缩了代码,弃用一些花里胡哨的功能,又加了一些别的花里胡哨的功能。
    • +
    • 为防止泄露用户邮箱、IP等隐私信息,弃用QQ号获取昵称及头像。
      +❗ 同时需要手动进行一些迁移,具体步骤戳此
    • +
    • ❗ 评论相关的配置亦有更新,配置戳此
    • +
    +

    ⚠️ 增加单击页面烟花效果,配置戳此
    +💡 弃用Velocity,改用anime.js,方便未来添加更多!!花里胡哨的!!功能!!严重拖慢页面滑行速度!!
    +🔧 新增多枚icon,包括豆瓣i-douban
    +🔧 一些显示问题

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机科学 + 二进制杂谈 + Theme Shoka Documentation +
    + + <![CDATA[使用yandex邮箱 ,报错Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF]]]> + https://blog.dragondyt.top/8612fa7f/47867b98/Java/c82dcf86.html + https://blog.dragondyt.top/8612fa7f/47867b98/Java/c82dcf86.html + Wed, 29 Jul 2020 21:54:35 GMT + 动漫美图

    + + +

    前言

    +

      今天做了一个自动打卡工具,准备搭建邮件服务,反馈打卡结果。使用的邮箱是yandex mail。出现Got bad greeting from SMTP host: smtp.yandex.com, port: 465, response: [EOF],记录一下。

    +

    邮箱准备

    +

      使用邮箱没有要求,支持smtp就行

    +

    注册邮箱

    +

    yandex mail注册地址

    +

    登录邮箱

    +

      登录邮箱后可能会提示开启smtp。

    +

    这里是官方提供打开smtp的文档,还记录了端口号。
    +官方文档表示端口是465

    +

    启用smtp

    +

      邮箱首页右上角的齿轮>security> Email clients>
    +smtp启用页面
    +这里我使用outlook测试了连接,使用的端口是465,附连接成功图。

    +

    连接成功图

    +

    邮件协议

    +

    SMTP 协议

    +

    SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。提供了SSL加密的SMTP协议被称为SMTPS,SMTP使用TCP端口25,SMTPS使用TCP端口465

    +

    POP3 协议

    +

    POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S,POP3 默认端口110,POP3S默认端口995

    +

    IMAP 协议

    +

    IMAP(Internet Mail Access Protocol)以前称作交互邮件访问协议(Interactive Mail Access Protocol),是一个应用层协议。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作,提供了SSL加密的IMAP协议被称为IMAP S,POP3 默认端口143,POP3S默认端口993

    +

    搭建步骤及简单使用

    +

    mail依赖

    +

    build.gradl文件

    +
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '2.3.2.RELEASE'
    +
    +

    yml配置文件

    +
    server:
    +  port: 80
    +logging:
    +  level:
    +    web: debug
    +spring:
    +  mail:
    +    default-encoding: UTF-8
    +    host: smtp.yandex.com
    +    username: xxx@xxx.xx
    +    password: 123456
    +    port: 25 #smtp协议使用25端口 
    +#    port: 465 #smtps使用465端口,不然报错。
    +    protocol: smtp #指定协议
    +    test-connection: true
    +    properties:
    +      mail:
    +        smtp:
    +          auth: true # 使用
    +          starttls: # 使用 SSL 安全协议,须如下配置
    +            enable: true
    +            required: true
    +
    +

    java代码

    +
    MailService 接口文件
    +
    public interface MailService {
    +
    +    /**
    +     * 发送纯文本邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     */
    +    void sendTextMail(String toAddr, String title, String content);
    +
    +    /**
    +     * 发送 html 邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容(HTML)
    +     */
    +    void sendHtmlMail(String toAddr, String title, String content);
    +
    +    /**
    +     *  发送待附件的邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     * @param filePath 附件地址
    +     */
    +    void sendAttachmentsMail(String toAddr, String title, String content, String filePath);
    +
    +    /**
    +     *  发送文本中有静态资源(图片)的邮件
    +     * @param toAddr 收件人
    +     * @param title 标题
    +     * @param content 内容
    +     * @param rscPath 资源路径
    +     * @param rscId 资源id (可能有多个图片)
    +     */
    +    void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId);
    +
    +}
    +
    +
    MailServiceImpl文件
    +
    @Component
    +public class MailServiceImpl implements MailService {
    +
    +    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    +
    +    private final JavaMailSender mailSender;
    +
    +    /**
    +     * 注入常量
    +     */
    +
    +    @Value("${spring.mail.username}")
    +    private String from;
    +
    +    public MailServiceImpl(JavaMailSender mailSender) {
    +        this.mailSender = mailSender;
    +    }
    +
    +    /**
    +     * 发送文本邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容
    +     */
    +    @Override
    +    public void sendTextMail(String toAddr, String title, String content) {
    +        // 纯文本邮件对象
    +        SimpleMailMessage message = new SimpleMailMessage();
    +        message.setFrom(from);
    +        message.setTo(toAddr);
    +        message.setSubject(title);
    +        message.setText(content);
    +
    +        try {
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("Text邮件已经发送。");
    +            }
    +        } catch (Exception e) {
    +            logger.error("发送Text邮件时发生异常!", e);
    +        }
    +
    +    }
    +    
    +    /**
    +     * 发送 html 邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容(HTML)
    +     */
    +    @Override
    +    public void sendHtmlMail(String toAddr, String title, String content) {
    +        // html 邮件对象
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            //true表示需要创建一个multipart message
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("html邮件发送成功");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送html邮件时发生异常!", e);
    +        }
    +    }
    +
    +
    +    /**
    +     * 发送待附件的邮件
    +     *
    +     * @param toAddr   收件人
    +     * @param title    标题
    +     * @param content  内容
    +     * @param filePath 附件地址
    +     */
    +    @Override
    +    public void sendAttachmentsMail(String toAddr, String title, String content, String filePath) {
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            FileSystemResource file = new FileSystemResource(new File(filePath));
    +            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
    +            helper.addAttachment(fileName, file);
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("带附件的邮件已经发送。");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送带附件的邮件时发生异常!", e);
    +        }
    +    }
    +
    +
    +    /**
    +     * 发送文本中有静态资源(图片)的邮件
    +     *
    +     * @param toAddr  收件人
    +     * @param title   标题
    +     * @param content 内容
    +     * @param rscPath 资源路径
    +     * @param rscId   资源id (可能有多个图片)
    +     */
    +    @Override
    +    public void sendInlineResourceMail(String toAddr, String title, String content, String rscPath, String rscId) {
    +        MimeMessage message = mailSender.createMimeMessage();
    +
    +        try {
    +            MimeMessageHelper helper = new MimeMessageHelper(message, true);
    +            helper.setFrom(from);
    +            helper.setTo(toAddr);
    +            helper.setSubject(title);
    +            helper.setText(content, true);
    +
    +            FileSystemResource res = new FileSystemResource(new File(rscPath));
    +            helper.addInline(rscId, res);
    +
    +            mailSender.send(message);
    +            if (logger.isInfoEnabled()) {
    +                logger.info("嵌入静态资源的邮件已经发送。");
    +            }
    +        } catch (MessagingException e) {
    +            logger.error("发送嵌入静态资源的邮件时发生异常!", e);
    +        }
    +    }
    +}
    +
    +
    测试类
    +
    @SpringBootTest
    +class ClockInApplicationTests {
    +    @Autowired
    +    MailService mailService;
    +    @Test
    +    void sendTextMail(){
    +        mailService.sendTextMail("vlnrjp92486@chacuo.net","单元测试","测试邮件发送");
    +    }
    +}
    +
    +

    运行结果

    +

    如标题所述,出现了异常
    +异常图
    +使用协议对应端口后发送成功,附图。
    +单元测试通过

    +

    结语

    +

      通过这个实践,我觉要写代码前还是要做很多准备,或者说我了解的东西不过全面。出错后百度异常信息怎么都找不到,想着哪里出错了,之前使用outlook连接测试通过,应该就是代码问题。后来看到很多人使用25端口发送,然后去百度端口才发现协议与端口不一致。所以我觉得写代码前的准备不充分或者知识储备不足,这个重要信息都不了解。

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + Springboot +
    + + <![CDATA[Android逆向工程:使用Apktool反编译小米便签]]> + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/aa3015f4.html + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/aa3015f4.html + Thu, 04 Jun 2020 10:54:35 GMT + 动漫美图

    + + +

    记录一次安卓反编译过程

    +

    下周就要安卓课设,而我的课设作业是开发一个记事本,我发现我小米手机上的便签挺好的,于是想参考一下布局以及实现。

    + + + + + + + + + + + + + + + + + +
    软件apktooldex2jarjd-jui
    版本2.4.12.10.3.5
    +

    准备工作

    +
      +
    1. +

      获取小米便签
      +网上没有最新版下载,通过Es文件浏览器导出apk。
      +也可以通过mt浏览器,因为后面需要三个framework文件,Es浏览器和Re浏览器好像屏蔽了根目录,不能访问了。

      +
    2. +
    3. +

      下载反编译相关工具
      +菜鸟教程三个工具,版本低,

      +
    4. +
    5. +

      我使用的三个工具 密码:7uyi

      +
    6. +
    +

    开始反编译

    +
    apktool.bat d base.apk
    +
    +

    Could not decode arsc file

    +

    这个是由于apktool版本低导致的,下载最新的重命名为apktool.jar替换即可
    +更新最新apktool后再次执行命令,还是失败,错误信息如下:

    +
    W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=id, value=0x100b0001
    +W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=, name=layout, value=0x10030009
    +W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d0058
    +W: Could not decode attr value, using undecoded value instead: ns=, name=style, value=0x100d008f
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x100d008f
    +W: Could not decode attr value, using undecoded value instead: ns=miui, name=fabColor, value=0x7f06002e
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=height, value=0x100a0003
    +W: Could not decode attr value, using undecoded value instead: ns=android, name=width, value=0x100a0003
    +I: Decoding values */* XMLs...
    +Can't find framework resources for package of id: 16. You must install proper framework files, see project website for more info.
    +
    +

    查看一下反编译结果,发现资源以及提取出来,但是没有任何代码。
    +百度了最后一句话发现,有些应用需要提供额外框架,具体信息可以查看一下博文Android逆向工程:解决针对小米系统应用,使用Apktool反编译失败问题!

    +

    根据博文我提取了文章中提到的framework-res.apk,framework-ext-res.apk,miui.apk。
    +文件列表

    +

    执行一下命令安装:

    +
    apktool if framework-res.apk
    +apktool if framework-ext-res.apk
    +apktool if miui.apk
    +
    +

    安装完成后发现缺少的16号对应framework-ext-res.apk

    +

    缺少的16号

    +

    再次执行 apktool.bat d base.apk 后发现还有问题,提示缺少了id为18的框架文件

    +

    缺少了id为18的框架文件

    +

    我有点头疼,我怎么知道18号是什么文件,于是尝试导入其他文件,搜索framework,找到了一个名为XiaomiServiceFramework.apk的文件,并进行安装;

    +

    apktool if XiaomiServiceFramework.apk

    +

    根据上图,我发现这个文件不是我们需要的,但它提供了一个信息:
    +++I: Decoding Shared Library (miui.system), pkgId: 18++
    +于是我去搜索system,经过筛选找到miuisystem.apk,进行安装,发现他就是我们需要的18号:

    +

    apktool if miuisystem.apk
    +再次反编译没有报错,查看文件发现Smali代码成功获取:

    +

    成功截图

    +

    反编译到此结束,会smali语法的大佬已经可以阅读代码了,不会的可以使用工具转java再阅读

    +

    使用dex2jar将dex转成jar

    +
      +
    1. 将base.apk当成压缩包打开
    2. +
    3. 提取 classes.dex,classes2.dex
      +执行命令:
    4. +
    +
    d2j-dex2jar.bat classes.dex
    +d2j-dex2jar.bat classes2.dex
    +
    +

    d2j-dex2jar.bat classes.dex
    +这个也是版本低导致的,下载最新的就可以了
    +再次执行,出了新问题,我之前没遇到

    +
    C:\Users\dyt\Desktop\dex-tools-2.1-SNAPSHOT>d2j-dex2jar.bat classes.dex
    +dex2jar classes.dex -> .\classes-dex2jar.jar
    +Detail Error Information in File .\classes-error.zip
    +Please report this file to one of following link if possible (any one).
    +    https://sourceforge.net/p/dex2jar/tickets/
    +    https://bitbucket.org/pxb1988/dex2jar/issues
    +    https://github.com/pxb1988/dex2jar/issues [no attachment support, not preferred]
    +    dex2jar@googlegroups.com
    +
    +

    换了一个多了后缀的2.1版本,成功解决,但我不记得在哪下的了

    +

    成功获取jar

    +

    获取的jar

    +

    使用jd-gui查看

    +

    这个就是软件使用了,跟一般软件没区别,将jar包拖到jd-gui.exe就行了,不多说,自己体会。

    +

    使用截图

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 安卓 +
    + + <![CDATA[Failed to resolve: androidx.appcompat:appcompat:1.1.0]]> + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/c4877271.html + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/c4877271.html + Sat, 09 May 2020 10:54:35 GMT + 动漫美图

    + + +

    安卓实验–内容提供器

    +

    日常踩雷

    +
    新建了一个空activity项目
    +
    +
    ERROR: Failed to resolve: androidx.appcompat:appcompat:1.1.0
    +ERROR: Failed to resolve: androidx.test.ext:junit:1.1.1
    +ERROR: Failed to resolve: androidx.test.espresso:espresso-core:3.2.0
    +ERROR: Failed to resolve: androidx.constraintlayout:constraintlayout:1.1.3
    +
    +

    init.gradle

    +

    感觉有毒,成功了,依赖还是未解决,清除缓存重启无效!
    +有毒

    +

    删除init.gradle后,成功解决,好吧,估计问题在镜像仓库,也可能是这个配置问题,以后还是老老实实用官方源吧,虽然费时间。但出错率低。
    +  这是我的init.gradle,路径为C:\Users\{username}\.gradle,建立这个文件的目的是加速依赖下载,现在看来反而是累赘,以前用着正常,现在不能用了也不知道是什么原因。

    +
    allprojects{
    +    repositories {
    +        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
    +        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
    +        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
    +        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
    +        all { ArtifactRepository repo ->
    +            if(repo instanceof MavenArtifactRepository){
    +                def url = repo.url.toString()
    +                if (url.startsWith('https://repo1.maven.org/maven2')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
    +                    remove repo
    +                }
    +                if (url.startsWith('https://jcenter.bintray.com/')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
    +                    remove repo
    +                }
    +if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
    +                    remove repo
    +                }
    +                if (url.startsWith('https://plugins.gradle.org/m2/')) {
    +                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
    +                    remove repo
    +                }
    +            }
    +        }
    +        maven {
    +                url ALIYUN_REPOSITORY_URL
    +                url ALIYUN_JCENTER_URL
    +	url ALIYUN_GOOGLE_URL 
    + 	url ALIYUN_GRADLE_PLUGIN_URL 
    +
    +        }
    +    }
    +}
    +
    +

    image.png

    +

    问题解决了,开工干活

    +

    实验目的

    +

    1、掌握运行时权限使用
    +2、掌握访问其他应用程序的数据

    +

    实验内容

    +

    1.实现拨打电话功能
    +2.访问通讯录

    +

    实验仪器

    +

    1)PC机最低配置:2G Hz以上双核CPU,2G以上内存
    +2)Windows 32位或64位操作系统
    +3)Android Studio 2.2及以上版本

    +

    实验主要步骤

    +

    1)创建实验项目:选择Empty Activity
    +2)编写布局文件;

    +

    activity_main.xml

    +
    <?xml version="1.0" encoding="utf-8"?>
    +<androidx.constraintlayout.widget.ConstraintLayout
    +        xmlns:android="http://schemas.android.com/apk/res/android"
    +        xmlns:tools="http://schemas.android.com/tools"
    +        xmlns:app="http://schemas.android.com/apk/res-auto"
    +        android:layout_width="match_parent"
    +        android:layout_height="match_parent"
    +        tools:context=".MainActivity">
    +
    +    <ListView
    +            android:id="@+id/list"
    +            android:layout_width="match_parent"
    +            android:layout_height="match_parent"
    +            app:layout_constraintBottom_toBottomOf="parent"
    +            app:layout_constraintLeft_toLeftOf="parent"
    +            app:layout_constraintRight_toRightOf="parent"
    +            app:layout_constraintTop_toTopOf="parent"/>
    +
    +</androidx.constraintlayout.widget.ConstraintLayout>
    +
    +

    list_item.xml

    +
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    +              xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal"
    +              android:layout_width="match_parent"
    +              android:layout_height="wrap_content"
    +              android:layout_margin="20dp"
    +              android:padding="5dp">
    +
    +    <ImageView
    +            android:contentDescription="@string/icon"
    +            android:src="@mipmap/kyzja1gl2m4"
    +            android:id="@+id/image_photo"
    +            android:layout_width="70dp"
    +            android:layout_height="70dp" />
    +    <LinearLayout
    +            android:layout_weight="1"
    +            android:layout_width="0dp"
    +            android:layout_height="70dp"
    +            android:orientation="vertical"
    +            android:layout_marginRight="15dp"
    +            android:layout_marginLeft="15dp">
    +
    +        <TextView
    +                android:id="@+id/name"
    +                android:layout_width="match_parent"
    +                android:layout_weight="1"
    +                android:layout_height="match_parent"
    +                android:text="@string/name"
    +                android:textStyle="bold"
    +                android:textColor="#000"
    +                android:textSize="20sp" tools:ignore="NestedWeights"/>
    +        <TextView
    +                android:id="@+id/phone"
    +                android:layout_weight="1"
    +                android:layout_height="match_parent"
    +                android:layout_width="match_parent"
    +                android:text="@string/phone"
    +                android:textStyle="bold"
    +                android:textColor="#666"
    +                android:textSize="20sp" />
    +    </LinearLayout>
    +    <Button
    +            android:layout_width="70dp"
    +            android:layout_height="70dp"
    +            android:id="@+id/call"
    +            android:text="@string/call"
    +    />
    +</LinearLayout>
    +
    +

    3)编写Activity类,单击查询通讯录信息,申请运行时权限

    +

    MainActivity

    +
    package tk.dragondyt.study6;
    +import android.Manifest;
    +import android.content.pm.PackageManager;
    +import android.database.Cursor;
    +import android.os.Bundle;
    +import android.provider.ContactsContract;
    +import android.util.Log;
    +import android.widget.ListView;
    +import android.widget.Toast;
    +import androidx.annotation.NonNull;
    +import androidx.appcompat.app.AppCompatActivity;
    +import androidx.core.app.ActivityCompat;
    +import androidx.core.content.ContextCompat;
    +import java.util.ArrayList;
    +import java.util.List;
    +/**
    + * @author dyt
    + */
    +public class MainActivity extends AppCompatActivity {
    +    final String TAG = "MainActivity";
    +    ContactPersonAdapter adapter;
    +    List<Person> contactsList = new ArrayList<>();
    +    @Override
    +    protected void onCreate(Bundle savedInstanceState) {
    +        super.onCreate(savedInstanceState);
    +        setContentView(R.layout.activity_main);
    +        ListView listView = findViewById(R.id.list);
    +        adapter = new ContactPersonAdapter(this,getLayoutInflater(),contactsList);
    +        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    +            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
    +        } else {
    +            readContacts();
    +        }
    +        if(ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    +            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 100);
    +        }
    +        listView.setAdapter(adapter);
    +
    +    }
    +    private void readContacts() {
    +        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    +                null, null, null, null)) {
    +            if (cursor != null) {
    +                while (cursor.moveToNext()) {
    +                    String name = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    +                    String phone = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.NUMBER));
    +                    contactsList.add(new Person(name,phone));
    +                }
    +                adapter.notifyDataSetChanged();
    +            }
    +        } catch (Exception e) {
    +            Log.d(TAG, "readContacts: "+e.getMessage());
    +        }
    +    }
    +    @Override
    +    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantsResults) {
    +        if (requestCode == 1) {
    +            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
    +                readContacts();
    +            } else {
    +                Toast.makeText(this, "请授予访问通讯录权限", Toast.LENGTH_SHORT).show();
    +            }
    +        }
    +        if (requestCode==100){
    +            if (grantsResults.length > 0 && grantsResults[0] == PackageManager.PERMISSION_GRANTED) {
    +                readContacts();
    +            } else {
    +                Toast.makeText(this, "请授予拨打电话权限", Toast.LENGTH_SHORT).show();
    +            }
    +        }
    +    }
    +}
    +
    +
    +

    4)通过通讯录应用程序提供的内容提供器查询其数据

    +
    private void readContacts() {
    +        try(Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    +                null, null, null, null)) {
    +            if (cursor != null) {
    +                while (cursor.moveToNext()) {
    +                    String name = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
    +                    String phone = cursor.getString(cursor.getColumnIndex(
    +                            ContactsContract.CommonDataKinds.Phone.NUMBER));
    +                    contactsList.add(new Person(name,phone));
    +                }
    +                adapter.notifyDataSetChanged();
    +            }
    +        } catch (Exception e) {
    +            Log.d(TAG, "readContacts: "+e.getMessage());
    +        }
    +    }
    +
    +

    5)编写ListView展示通讯录方法,把查询到的数据展示在页面

    +

    ContactPersonAdapter

    +
    package tk.dragondyt.study6;
    +
    +import android.annotation.SuppressLint;
    +import android.content.Context;
    +import android.content.Intent;
    +import android.net.Uri;
    +import android.view.LayoutInflater;
    +import android.view.View;
    +import android.view.ViewGroup;
    +import android.widget.BaseAdapter;
    +import android.widget.Button;
    +import android.widget.TextView;
    +
    +import java.util.List;
    +
    +/**
    + * @author dyt
    + */
    +public class ContactPersonAdapter extends BaseAdapter {
    +
    +    /**定义数据*/
    +    private final List<Person> mData;
    +    /**定义Inflater,加载我们自定义的布局。*/
    +    private final LayoutInflater mInflater;
    +    private final Context context;
    +
    +  /**
    +    定义构造器,在Activity创建对象Adapter的时候将数据data和Inflater传入自定义的Adapter中进行处理。
    +    */
    +    public ContactPersonAdapter(Context context,LayoutInflater inflater, List<Person> data){
    +        mInflater = inflater;
    +        mData = data;
    +        this.context = context;
    +    }
    +
    +    @Override
    +    public int getCount() {
    +        return mData.size();
    +    }
    +
    +    @Override
    +    public Object getItem(int position) {
    +        return position;
    +    }
    +
    +    @Override
    +    public long getItemId(int position) {
    +        return position;
    +    }
    +
    +    @Override
    +    public View getView(int position, View view, ViewGroup viewGroup) {
    +        @SuppressLint("ViewHolder")
    +        View item = mInflater.inflate(R.layout.list_item,null);
    +        Person person = mData.get(position);
    +        TextView name = item.findViewById(R.id.name);
    +        TextView phone = item.findViewById(R.id.phone);
    +        Button call = item.findViewById(R.id.call);
    +        call.setOnClickListener((v)->{
    +            Intent intentCall =  new Intent();
    +            intentCall.setAction(Intent.ACTION_CALL);
    +            intentCall.setData(Uri.parse("tel:" + person.getPhone()));
    +            context.startActivity(intentCall);
    +        });
    +        name.setText(person.name);
    +        phone.setText(person.phone);
    +         return item ;
    +    }
    +}
    +
    +

    Person

    +
    package tk.dragondyt.study6;
    +
    +/**
    + * @author dyt
    + */
    +public class Person {
    +    String name;
    +    String phone;
    +
    +    public Person(String name, String phone) {
    +        this.name = name;
    +        this.phone = phone;
    +    }
    +
    +    public String getName() {
    +        return name;
    +    }
    +
    +    public void setName(String name) {
    +        this.name = name;
    +    }
    +
    +    public String getPhone() {
    +        return phone;
    +    }
    +
    +    public void setPhone(String phone) {
    +        this.phone = phone;
    +    }
    +
    +    @Override
    +    public String toString() {
    +        return "Person{" +
    +                "name='" + name + '\'' +
    +                ", phone='" + phone + '\'' +
    +                '}';
    +    }
    +}
    +
    +
    +

    最后附上截图,最讨厌没图的教程。

    +

    运行截图

    +

    实验源码

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 踩坑 + 安卓 +
    + + <![CDATA[AAPT: error: resource android:attr/fontVariationSettings not found]]> + https://blog.dragondyt.top/8612fa7f/47867b98/Flutter/74684463.html + https://blog.dragondyt.top/8612fa7f/47867b98/Flutter/74684463.html + Sat, 09 May 2020 10:54:35 GMT + 动漫美图

    + + +

    心累,每天都是“惊喜”,我太菜了

    +

    环境
    +开发工具 idea

    +
    flutter doctor
    +
    +D:\Android\flutter\bin\flutter.bat doctor --verbose
    +[√] Flutter (Channel stable, v1.17.0, on Microsoft Windows [Version 10.0.18363.815], locale zh-CN)
    +    • Flutter version 1.17.0 at D:\Android\flutter
    +    • Framework revision e6b34c2b5c (7 days ago), 2020-05-02 11:39:18 -0700
    +    • Engine revision 540786dd51
    +    • Dart version 2.8.1
    +
    +[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    +    • Android SDK at D:\Android\android-sdk
    +    • Platform android-29, build-tools 29.0.3
    +    • ANDROID_HOME = D:\Android\android-sdk
    +    • Java binary at: D:\Program Files\Java\jdk1.8.0_241\bin\java
    +    • Java version Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
    +    • All Android licenses accepted.
    +
    +[!] Android Studio (not installed)
    +    • Android Studio not found; download from https://developer.android.com/studio/index.html
    +      (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions).
    +
    +[√] Connected device (1 available)
    +    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26) (emulator)
    +
    +! Doctor found issues in 1 category.
    +Process finished with exit code 0
    +
    +

    Could not find androidx.lifecycle:lifecycle-common:2.2.0,lifecycle-common-java8:2.2.0,lifecycle-runtime:2.2.0,androidx.fragment:fragment:1.1.0.,androidx.annotation:annotation:1.1.0.
    +解决方法:

    +
    allprojects {
    +    repositories {
    +        google() 
    +        jcenter()
    +        maven { url "https://maven.google.com" }//感觉google()是假的,这里我用了阿里云镜像,可能没同步吧。
    +    }
    +}
    +
    +

    .gradleachesransforms-1iles-1.1ore-1.1.0.aarb817d4a7e2a888884c999547cadccefesaluesalues.xml:7:5-70: AAPT: error: resource android:attr/fontVariationSettings not found.AAPT: error: resource android:attr/ttcIndex not found

    +

    stackoverflow上解决方法

    +

    解决方法:
    +修改app下的build.gradle文件

    +
    android {
    +    compileSdkVersion 28
    +    defaultConfig {
    +	...
    +        targetSdkVersion 28
    +	...
    +    }
    +    ...
    +}
    +
    +

    stackoverflow真是个好东西,可惜要翻墙,感想上面的大神。
    +不写了,累,这种资料网站都要墙,真是丧心病狂,什么时候能不用镜像站。构建工具再好,巧妇难为无米之炊啊

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 踩坑 + flutter +
    + + <![CDATA[信息检索-绪论]]> + https://blog.dragondyt.top/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html + https://blog.dragondyt.top/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.html + Wed, 06 May 2020 21:55:57 GMT + 动漫美图

    + + +

    信息与文献基本知识

    +

      未来学家托天勒把人类社会的发展过程划分为3个阶段:以农业经济为基础的农业社会;以工业经济为基础的工业社会;以信息经济为基础的信息社会。在信息社会中,信息资源已被人们公认为是物质、能量资源之后的人类可利用的第三类资源,是人类社会领域的基础性资源。

    +

    从信息到文献

    +

    信息(Information)

    +

      美国数学家、控制论的主要奠基人维纳在1950年出版的《控制论与社会》中是这样来理解信息的:“人通过感觉器官感知周围世界”,“我们支配环境的命令就是给环境的一种信息”,因此,“信息就是我们在适应外部世界,并把这种适应反作用于外部世界的过程中,同外部世界进行交换的内容的名称”。

    +
    信息的定义:
    +

      中国国家标准《情报与文献工作词汇一一基本术语》 (GB/T4894-1985)中信息的定义为:信息是物质存在的一种方式、形态或运动状态,也是事物的一种普遍属性,一般指数据、消息中所包含的意义,可以使消息中所描述事件的不确定性减少。

    +
    信息的基本属性:
    +

    (1)客观性。
    +(2)传递性。
    +(3)多态性。
    +(4)共享性。
    +(5)时效性。
    +(6)价值相对性。
    +(7)依附性。
    +(8)增长性。

    +

    知识(Knowledge)

    +

      知识是人们在改造世界的实践中所获得的认识和经验的总和,是对客观世界物质形态和运动规律的认识。根据韦伯斯特(Webster)词典1997年的定义,知识是通过实践、研究、联系或调查获得的关于事物的事实和状态的认识,是对科学、艺术或技术的理解,是人类获得的关于真理和原理的认识的总和。

    +
    知识的定义
    +
      +
    • 从信息的观念看,知识来源于信息,是信息的一部分。简而言之,知识是理性化、优化、系统化了的信息。
    • +
    • 从反映的内容而言,知识是客观事物的属性与联系的反映,是客观世界在人脑中的相对正确的反映。
    • +
    • 从反映的活动形式而言,知识有时表现为主体对事物的感性知觉或表象,属于感性知识,有时表现为关于事物的概念或规律,属于理性知识。
    • +
    +

    情报(Intelligence)

    +

      情报是作为交流对象的有用的知识。“情报 是判断、意志、决心、行动需要的能指引方向的知识和智慧”;“情报是解决问题所需要的知识”;“情报是激活 了的知识”情报的基本属性是知识性、传递性和效用性。

    +
    情报的基本属性
    +

    (1) 知识性。一般而言,情报是一种新的知识。然而称为情报的知识
    +并不排斥时间上的“不新”。这就是说,凡原先不知道的(不论时间多久),而现在又迫切需要的知识,都属于“新”的知识。
    +(2) 传递性。情报传递的过程包括从情报源进行收集到向用户提供情报的全过程。无论多高深、渊博、新奇的知识,如果不记录、不传递、不交流,都不能称为情报。
    +(3) 效用性(判断的标准)。情报是一种有价值、有效用的知识。情报均须“有用”,当用户不需要时,百分之百的知识也不能把它称之为情报

    +

    文献(Literature/Document)

    +

      国家标准《文献著录总则》(GB/T3792. 1-1983)给出的定义为:“文献是记录有知识的一切载体。”国家标准化组织IS0在《文献情报术语国际标准》(IS0/DIS5217)给出的定义是:“为了把人类知识传播开来和继承下去,人们用文字、图形、符号、音频、视频等手段将其记录下来,或写在纸上,或晒在蓝图上,或制在感光片上,或录到唱片上,或存储在磁盘上。这种附着在各种载体上的记录统称为文献。”

    +
    文献包括4个要素。
    +

    (1) 知识和信息,即文献的内容。
    +(2) 物质载体,如竹简、纸张、胶片、磁盘等,它是文献的外在形式。
    +(3) 记录知识和信息的符号,如文字、图表、声音、图像等。
    +(4) 记录的方式或手段,如书写、印刷、复制、录音、录像等,即将知识和信息固化到载体上的手段。

    +

    信息、知识、情报与文献

    +

      我国图书情报学界对信息、知识、文献和情报的看法是:知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,当文献中记录的知识传递给用户,并为用户所利用时,文献中的知识就转化为情报。

    +

    信息的分类

    +
      +
    1. 按信息的内容划分
      +科学技术信息
      +社会科学信息
    2. +
    3. 按产生信息的客体的性质来划分
      +自然信息
      +生物信息
      +机器信息
      +社会信息
    4. +
    5. 按信息所依附的载体来划分
      +文献信息
      +口头信息
    6. +
    +

    文献的分类

    +
      +
    1. 按照文献的加工层次分类
      +零次文献(Zeroth Literature)
      +一次文献(Primary Literature)
      +二次文献(Secondary Literature)
      +三次文献(Tertiary Literature)
    2. +
    3. 按照文献的载体分类
      +印刷型文献(Paper Literature)
      +缩微型文献(Microform)
      +电子型文献(Electronic iterature)
      +音像型文献(Audio-Visual iterature)
    4. +
    5. 按照文献的出版形式分类
      +图书
      +期刊
      +报纸
      +特种文献(学位论文、会议论文、专利文献、标准文献、科技报告、政府出版物、产品样本资料等)
    6. +
    +

    信息检索基础

    +

    信息检索的原理

    +

    信息检索的概念

    +

      广义的信息检索“Information Retrieval”是指将信息按照一定的方式组织和存储起来,并根据信息用户的需要揭示、查找、传递相关信息的过程,包括了信息的存储过程和查找过程。狭义的信息检索仅指信息的查找,是指从信息集合中找出用户所需要的有关信息的过程。狭义的信息检索包括3个方面的含义:了解用户的信息需求、信息检索的技术或方法、满足信息用户的需求。

    +

    信息检索的原理

    +

      信息检索的基本原理就是在对信息进行整理排序形成检索工具的基础上,按照用户的要求利用检索工具或检索系统,将用户检索提问标识(检索词)与已形成的或存储在系统中的信息的存储标识(文献特征标识、标引词)进行匹配比较,若取得一致,则为匹配,即达到了用户的检索需求,如图1.1所示。

    +
    +信息检索原理图 +
    +

    信息检索的类型

    +
      +
    1. 按信息存储和检索的内容分类
      +文献检索
      +数据检索
      +事实检索
    2. +
    3. 按照检索系统中信息的组织方式分类
      +全文检索
      +多媒体检索
    4. +
    5. 按照信息存储的载体和实现查找的技术手段分类
      +手工检索
      +机械检索
      +计算机检索
    6. +
    +

    信息检索的工具

    +

      信息检索工具是指为检索需要而组织的文献检索系统,它是收集、加工标引、组织文献的结果,是检索工作赖以生存的手段和条件,包含目录、索引、文摘等。

    +

    典型的检索工具组成

    +
      +
    1. 主体:即检索工具的主要部分,由所收录文献的著录部分组成,是文献储存与检索的实体。其包含文献的内部特征与文献的外部特征。
    2. +
    3. 辅助索引:是在文献检索工作中,从主体部分的文献款目编排系统以外的角度增加检索途径、扩大检索效果的辅助手段,它不能离开检索工具的主体单独存在。
    4. +
    5. 使用说明:向用户介绍本检索工具的性质、内容范围、收录年限、读者对象、著录方法、分类体系、检索方法等,帮助用户利用检索工具。
    6. +
    +
    目录
    +
    目录的定义
    +

      目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

    +
    目录的著录款目
    +

    目录的著录包括如下款目。
    +(1) 书名(刊名)项。
    +(2) 著者(编者)项。
    +(3) 出版项:包括出版地点、出版者、出版期、版次等。
    +(4) 稽核项:包括页数、图表、开本、装订形式、定价等。
    +(5) 附注项:对上述各项的补充或说明。
    +(6) 提要项:内容简介。
    +(7) 业务注记:指图书馆或保存单位在目录上做的业务记载,包括索取号、登录号、分类号、主题词、存储地点等。

    +
    索引
    +
    索引的定义
    +

      索引是将报刊书籍中某些重要的或有意义的信息,如书名、刊名篇名、主题、人名、地名等分别摘录出来,按一定方式编排,并注明出处,以供检索的工具。

    +
    索引的作用
    +

      索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

    +
    常用索引
    +

    (1) 主题索引
    +(2) 分类索引
    +(3) 著者索引
    +(4) 其他:单位索引(或团体著者索引)、化学分子式索引、引用刊物索引、出版单位索引等。

    +
    文摘
    +
    文摘定义
    +

      我国国家标准GB3468——83定义文摘为“除题录部分外还对文献内容作实质性描述的文献条目称文摘”。

    +
    文摘作用
    +

    (1) 帮助读者快速判断文献内容
    +(2) 节省阅读时间
    +(3) 减少语言障碍
    +(4) 替代原文

    +
    检索工具类型
    +
      +
    1. 按信息加工的手段或设备划分
      +手工检索工具
      +机械检索工具
      +计算机检索工具
    2. +
    3. 按编制方法划分
      +目录型检索工具
      +题录型检索工具
      +文摘型检索工具
      +索引型检索工具
    4. +
    5. 按信息载体形态划分
      +书本式检索工具
      +卡片式检索工具
      +缩微式检索工具
      +磁性材料式检索工具
    6. +
    7. 按收录范围划分
      +综合性检索
      +综合性检系
      +专科性检索工具
      +专题性检索工具
      +全面性检索工具
      +单一性检索工具
    8. +
    9. 按时间范围划分
      +预告性检索工具
      +现期通报性检索工具
      +回溯性检索工具
    10. +
    +

    信息检索的意义

    +
      +
    1. 掌握获取知识的捷径,提高信息利用的效率
    2. +
    3. 提高信息素质,培养终身学习的能力
    4. +
    5. 科学研究的向导,科技查新的基础
    6. +
    +

    信息检索的途径

    +

      根据信息的基本特征,可以把信息检索途径分为外部特征检索途径(题名途径、著者途径、引文途径等)和内容特征检索途径(分类途径、主题途径等)两大类。

    +

    外部特征途径

    +
      +
    1. 题名途径:刊名、书名、篇名等
    2. +
    3. 著者途径:作者、编者、译者、专利权人、出版机构等
    4. +
    5. 引文途径: 其他途径:专利号、报告号、合同号、标准号、国际标准书号和刊号等
    6. +
    +

    内容特征途径

    +
      +
    1. 分类途径:是指按照文献所属学科(专业)属性(类别)进行检索的途径。
    2. +
    3. 主题途径:是按照文献信息的主题内容进行检索的途径,利用主题词、关键词、叙词,并按字顺排列实现检索。
    4. +
    +

    信息检索的步骤和方法

    +

    信息检索的步骤

    +

    信息检索的方法

    +
      +
    1. 顺查法:指按照时间的顺序,由远及近地利用检索系统进行文献信息检索的方法。
    2. +
    3. 逆查法:是由近及远地查找,逆着时间的顺序利用检索工具进行文献信息检索的方法。
    4. +
    5. 抽查法:是针对检索课题的特点,选择有关该课题的文献信息最可能出现或最多出现的时间段,利用检索工具进行重点检索的方法。
    6. +
    7. 追溯法(引文法) :是指利用已经掌握的文献末尾所列的参考文献,进行逐一追溯查找“引文”的一种最简便的扩大情报来源的方法。
    8. +
    9. 综合法:又称循环法,这是把上述方法加以综合运用的方法。
    10. +
    +

    计算机信息检索基础

    +

    计算机信息检索概述

    +

    计算机信息检索的特点

    +

    (1) 速度快。
    +(2) 检索范围广。
    +(3) 检索不受时空的限制。
    +(4) 及时。
    +(5) 界面友好。
    +(6) 超文本检索。

    +

    计算机信息检索分类

    +

    (1) 脱机检索
    +(2) 联机检索
    +(3) 网络检索

    +

    计算机信息检索技术

    +

      计算机检索系统常采用一些运算方法,从概念相关性、位置相关性等方面对检索提问进行技术处理。

    +
      +
    1. 检索词的选择
      +检索式由检索词和检索算符组成。
      +检索词分为两类:受控词和非受控词。
    2. +
    3. 布尔逻辑检索
      +将多个检索词用布尔运算符(简称检索算符)组合在一起来进行检索,称之为布尔逻辑检索。
      +系统使用的检索算符一般有以下几种:
      +(1) 逻辑与
      +(2) 逻辑或
      +(3) 逻辑非
    4. +
    +

    光盘检索

    +

    光盘检索的特点主要有以下几个。

    +
      +
    1. 检索途径多。其可提供内容、著者、关键词、标题、著者单位、年代、出处等多种检索途径。
    2. +
    3. 检索系统配置简单。利用微机系统建立光盘检索系统只要一台光盘驱动器和所需要的盘片,不需经过通信线路。
    4. +
    5. 检索费用低廉。由于光盘的费用是一次性投入,可够次任意使用,利用率越高,分摊的成本越低。
    6. +
    7. 系统操作简单。光盘数据库一般都具备类似联机检索那样齐全的检索和输出功能,同时提供人机对话,系统界面友好。
    8. +
    +

    网络检索

    +

    网络检索具有如下特点:

    +
      +
    1. 检索速度快。手工检索需数周的课题计算机检索只需数小时或数分钟。
    2. +
    3. 检索途径多。除手工检索工具的分类、主题、著者等检索途径之外,网络检索往往还提供更多更灵活的检索途径,如文本词途径。
    4. +
    5. 更新快。网上信息很多为为更新。
    6. +
    7. 范围广。网上数据库的种类更为广泛和丰富,有些可免费进行
    8. +
    9. 检索用词的选择及其组配更为灵活。检索策略的制定更为灵活和复杂,可利用各种讦算机检索技术随意扩天或缩小检索范围以满足用户各种不同的信息检索需求。
    10. +
    11. 检索结果可直接打印或下载,可操作性强。
    12. +
    +

    思考题:

    +

    简述信息、知识、文献的概念,及三者之间的关系。

    +

      知识是对信息加工、吸收、提取、评价的结果,即系统化的信息成为知识,知识记录下来成为文献,文献经传递并加以应用成为情报,情报体现了人运用知识的能力。文献是记录有知识和信息的一切载体,或称为固化在某种物质载体上的知识和信息,

    +

    信息检索的目的和意义

    +
      +
    1. 掌握获取知识的捷径,提高信息利用的效率
    2. +
    3. 提高信息素质,培养终身学习的能力
    4. +
    5. 科学研究的向导,科技查新的基础
    6. +
    +

    检索工具的结构构成是什么?

    +
      +
    1. 目录
    2. +
    3. 索引
    4. +
    5. 文摘
    6. +
    +

    目录在检索中起什么作用?

    +

      目录是图书以及其他单独出版物的外部特征的解释和系统化记载,是将一批文献款目按照一定的次序或规则编排而成的一种揭示与报道的文献工具。

    +

    索引在检索中起什么作用?

    +

      索引可以将文献所包含的若干信息分析摘录出来,作为排检标识, 这种标识可以根据需要,在一定的范围内进行任意深度的选择和标引,从而满足更深层次或更多途径的查找要求。索引可以方便用户更快地达到检索目标,是依附在目录或文摘等检索工具之上的辅助性工具,不能独立存在。

    +

    文摘在检索中起什么作用?

    +

    (1) 帮助读者快速判断文献内容
    +(2) 节省阅读时间
    +(3) 减少语言障碍
    +(4) 替代原文

    +

    简述国内外主要分类法。

    +

    中国图书分类法

    +
      +
    1. 中国人民大学图书馆图书分类法。简称人大法新中国成立后的第一部分类法,1954年出第一版,1996年出第六版。4大部类、17个基本大类。总结科学,社会科学,自然科学,综合性科学、综合性图书。
    2. +
    3. 中国科学院图书馆图书分类法
    4. +
    5. 中国图书资料分类法
    6. +
    7. 中国档案分类法
    8. +
    +

    外国图书分类法

    +
      +
    1. 杜威十进分类法(Dewey Decimal Classification &Relative Index,DDC)是世界上流传最广、影响最大的一部文献分类法,它开创了文献分类法的新纪元,是外国文献分类法发展史上一个重要里程碑。
    2. +
    3. 国际十进分类法
    4. +
    5. 美国国会图书馆分类法
    6. +
    7. 冒号分类法
    8. +
    9. 布利斯书目分类法
    10. +
    +

    操作题:

    +

    题目:

    +

    利用《中国图书馆图书分类法》找出分类号。

    +

    检索目的:

    +

    掌握《中国图书馆图书分类法》的基本构成特点。

    +

    检索要求:

    +

    按照基本大类,在《中国图书馆图书分类法》中查找以下相关类目编号。

    +
      +
    1. 计算机技术:国际互联网
    2. +
    +
    +

    TP393.4

    +
    +
      +
    1. 交通运输:运输线路优选
    2. +
    +
    +

    U116.2

    +
    +
      +
    1. 环境科学:环境污染的控制及其排除
    2. +
    +
    +

    X506

    +
    +
      +
    1. 食品工业:淀粉加工工艺
    2. +
    +
    +

    TS234

    +
    +
      +
    1. 文化、科学:图书馆工作者
    2. +
    +
    +

    G251.6

    +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 信息检索 +
    + + <![CDATA[在docker安装elasticsearch]]> + https://blog.dragondyt.top/8612fa7f/8f8103b7/Docker/29596f0c.html + https://blog.dragondyt.top/8612fa7f/8f8103b7/Docker/29596f0c.html + Wed, 29 Apr 2020 21:55:57 GMT + 动漫美图

    + + +

    安装elasticsearch(简称es)

    +

    拉取镜像,该命令拉取最新版(不推荐,最新版意味着踩坑)

    +
    docker pull elasticsearch
    +
    +

    可以指定版本,查看elasticsearch版本

    +
    docker pull elasticsearch:x.x.x
    +
    +

    执行docker pull elasticsearch
    +尝试运行

    +
    docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:latest
    +
    +

    response from daemon: Conflict. The container name "/elasticsearch" is already in use by container "06a80d721428c762abcb750f5a5f48a947c4714e3f9e6637e10792b4f4fa5a02". You have to remove (or rename) that container to be able to reuse that name
    +查看所有容器

    +
    docker ps -a
    +
    +

    解决方法

    +
      +
    1. 删除容器,重新创建
    2. +
    +
    docker rm containerId|names
    +
    +

    image.png
    +发送GET请求,校验是否安装成功

    +
    curl localhost:9200
    +
    +

    curl localhost:9200
    +2. 重新启动之前的容器

    +
    docker start containerId|names
    +
    +

    安装可视化控件(kibana,elasticsearch-head…)

    +

    这里选择kibana,颜值就是正义,在docker中安装kibana官方文档

    +

    需要指定版本,该版本与es一致

    +
    docker pull docker.elastic.co/kibana/kibana:7.6.2
    +
    +

     response from daemon: manifest for docker.elastic.co/kibana/kibana:latest not found: manifest unknown: manifest unknown
+
    +运行kibana

    +
    docker run --link elasticsearch:elasticsearch -p 5601:5601 --name kibana -d docker.elastic.co/kibana/kibana:7.6.2
    +
    +

    测试

    +
     curl localhost:5601/status
    +
    +

    出现kibana server is not ready yet
    +查看日志

    +
    docker logs -f containerId
    +
    +

    image.png
    +完了掉坑里了,下次再写了顺便补上docker-compose部署

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 教程 +
    + + <![CDATA[git push时出现error: src refspec master does not match any解决办法.]]> + https://blog.dragondyt.topnull + https://blog.dragondyt.topnull + Thu, 23 Apr 2020 21:55:57 GMT + 动漫美图

    + + +

    git push时出现error: src refspec master does not match any解决办法.

    +

    网传原因:
    +  ++这是由于存储库仍然为空引起的。存储库中没有提交,因此没有 master分支可推送到服务器。++
    +网传解决方法:

    +
    touch README
    +git add README 
    +git commit -m 'first commit'
    +git push origin master
    +
    +

    可能是我垃圾吧,git命令写错了,反正没能解决,如图:

    +

    image.png

    +
    git show-ref
    +
    +

    d601ecc070daac5320959ee8c47bca013a113256 refs/remotes/origin/master

    +

    终于换一种错误了,留下了无知的眼泪

    +
    git push origin HEAD:master
    +
    +

    image.png

    +

    一番调整,我终于成功了,失败30次,o(╥﹏╥)o

    +

    image.png

    +

    去目标仓库查看,发现有一个目录文件全没了(╥╯^╰╥)
    +我有修改一番,好刺激啊,这就是删库跑路的快感吗!

    +

    image.png

    +

    这就是之前消失的文件,现在回来了,其他的又消失了。。。
    +经过检查,该文件夹下面含有 .git 文件夹,无法被追踪,删除即可,到此结束了,节后逃生的感觉。
    +总结:出现这个错误不一定是因为空目录,也可能是因为远程分支不在!!!

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 教程 +
    + + <![CDATA[计算机网络第三章数据链路层答案]]> + https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/589e13eb.html + https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/589e13eb.html + Mon, 16 Mar 2020 19:22:27 GMT + + 第三章 数据链路层 +

    一、选择题

    +
      +
    1. 流量控制是为( C )所需要的。
    2. +
    +

    A. 位错误   B. 发送方缓冲区溢出
    +  C. 接收方缓冲区溢出   D. 接收方与发送方之间冲突

    +
      +
    1. 在下列协议中,使用带位填充的首尾标志法组帧是( B )。
    2. +
    +

    A. DDCMP   B. HDLC   C. BSC   D. SLIP

    +
      +
    1. PPP不同于HDLC协议,使用面向( B )的填充方式。
    2. +
    +

    A. 比特   B. 字符   C. 透明传输   D. 帧

    +
      +
    1. 对于窗口大小为n的滑动窗口,最多可以有( C )帧已发送但没有确认。
    2. +
    +

    A. 0   B. n-1   C. n   D. n+1

    +
      +
    1. 在滑动窗口流量控制(窗口大小为8)中,ACK3意味着接收方期待的下一帧是( B )号帧。
    2. +
    +

    A. 2   B. 3   C. 4   D. 8

    +
      +
    1. PPP是Internet中使用的( C ),其功能对应于OSI参考模型的数据链路层。
    2. +
    +

    A. 传输协议   B. 分组控制协议   C. 点到点协议   D. 报文控制协议

    +

    7. 下面不是数据链路层功能的是(D)。

    +

    A. 帧同步   B. 差错控制   C. 流量控制   D. 拥塞控制

    +

    8. 面向比特同步的帧数据段中出现位串01111101,则比特填充后输出是(A)。

    +

    A. 011111001   B. 001111101   C. 011111101   D. 011111010

    +

    9. PPP为实现透明传输在异步传输时采用(A),而同步传输采用(A)。

    +

    A. 字符填充法,比特填充法   B. 比特填充法,字符填充法
    +  C. 字符填充法,字节记数法   D. 比特填充法,比特填充法

    +

    10. 在数据通信中,当发送数据出现差错时,发送端无需进行数据重发的差错控制方法为(B)。

    +

    A. ARQ   B. FEC   C. 奇偶校验码   D. CRC

    +

    11. 已知循环冗余码生成多项式G(X)=x5+x4+x+1,若信息位10101100,则冗余码是(B)。

    +

    A. 01101   B.01100   C. 1101   D. 1100

    +

    12. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以(C)。

    +

    A. 检测出一位差错       B. 检测并纠正一位差错
    +  C. 检测出多位突发性差错   D. 检测并纠正多位突发性差错

    +
      +
    1. 若数据链路的发送窗口尺寸WT=4,在发送3号帧、并接到2号帧的确认帧后,发送方还可连续发送(B)。
    2. +
    +

    A. 2帧   B. 3帧   C. 4帧   D. 1帧

    +

    14. 在回退N协议中,当帧序号为3比特,发送窗口的最大尺寸为(C)。

    +

    A. 5   B. 6   C. 7   D. 8

    +

    15. 在选择重传协议中,当帧的序号字段为3比特,且接受窗口与发送窗口尺寸相同时,发送窗口的最大尺寸为(B)。

    +

    A. 2   B. 4   C. 6   D. 8
    +16. 假定我们运行发送窗口大小为5和接收窗口大小为3的滑动窗口算法,并且在传输过程中不会发生分组失序的问题,帧序号的编码至少有(B)位。

    +

    A. 2   B. 3   C. 4   D. 5

    +

    17.无论是SLIP还是PPP协议都是(D)协议。

    +

    A.物理层 B 传输层 C网络层 D数据链路层

    +

    18.下列哪一项最好地描述了CRC的特征?(AB)
    +  A.逐个检查每一个字符

    +

    B.能检查出99%以上的差错

    +

    C.检查不出有偶数个位出错的差错

    +

    D.不如奇偶校验方法可靠

    +

    19.HDLC协议采用的帧同步方法是(A)。

    +

    A.使用比特填充的首尾标志法

    +

    B.使用字符填充的首尾定界符法

    +

    C.字节计数法

    +

    D.违法编码法

    +

    20.流量控制是数据链路层的基本功能之一,有关流量控制,下列说法中正确的是(C)。

    +

    A.只有数据链路层存在流量控制

    +

    B.不只是数据链路层存在流量控制,不过各层的流量控制对象都一样

    +

    C.不只是数据链路层存在流量控制,但是各层的流量控制对象都不一样

    +

    D.以上都不对

    +

    21.为了避免传输中帧的消失,数据链路层采用了(D)方法。

    +

    A.发送帧编上序号   B.循环冗余码
    +  C.海明码   D.计时器超时重发

    +

    22.下列不属于数据链路层功能的是(B)。

    +

    A.帧同步功能   B.电路管理功能
    +  C.差错控制功能   D.流量控制功能

    +

    23.流量控制实际上是对(A)的控制。

    +

    A.发送方数据流量   B.接收方数据流量
    +  C.发送,接受双方数据流量   D.链路上任意两结点间的数据流量

    +

    24.在数据帧中,当所传送的数据中出现控制字符时,就必须采取适当的措施,使接收方不至于将数据误认为是控制信息。这样才能保证数据链路层的传输是(A)的。

    +

    A.透明   B.面向连接   C.冗余   D.无连接
    +25.数据链路层采用后退N帧协议,发送方已经发送了编号为0~7的帧。

    +

    当及时器超时,若发送方只收到0,2,3号帧的确认,则要发送方重发的帧数是(C)
    +  A.2   B.3   C.4   D.5

    +

    26.计算机网络中各节点间采用©方式。

    +

    A.连续传输   B.总线传输   C.串行传输   D.并行传输

    +

    27.差错控制的基本方式有(多选)(AB)

    +

    A.检错反馈重发   B.前向纠错方式   C.奇偶校验码   D.方阵检验码

    +

    28.数据传输中的差错主要有(多选)(AD)

    +

    A.随机错   B.计算错   C.校验错   D.突发错

    +

    29.无论是SLIP还是PPP协议都是( B )协议。

    +

    (A)物理层  (B)数据链路层  ©网络层  (D)运输层

    +

    ps:不保证完全正确,仅用来偷懒

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机网络 +
    + + <![CDATA[计算机网络第二章物理层课堂练习答案]]> + https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/5eef9793.html + https://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/5eef9793.html + Sun, 15 Mar 2020 19:22:27 GMT + + 第二章 物理层 +

    一、 选择题

    +
      +
    1. 信号是数据在传输过程中的(A)的表现形式。
      +A. 电信号 B. 代码 C. 信息 D. 程序
    2. +
    3. 数据通信的任务是传输( D  )代码的比特序列。
      +A. 十进制 B. 帧结构 C. 分组结构 D. 二进制
    4. +
    5. ( B )信号的电平是连续变化的。
      +A. 数字 B. 模拟 C. 脉冲 D. 二进制
    6. +
    7. ( C)是指将数字信号转变成可以在电话线上传输的模拟信号的过程。
      +A. 解调 B. 采样 C. 调制 D. 压缩
    8. +
    9. 数据传输速率是指每秒钟传输构成数据二进制代码的(D )数。
      +A. 码元 B. 信元 C. 波特 D. 位
    10. +
    11. 利用模拟通信信道传输数据信号的方法称为( A )。
      +A. 频带传输 B. 基带传输 C. 异步传输 D. 同步传输
    12. +
    13. 基带传输是指在数字通信信道上( C )传输数字数据信号的方法。
      +A. 调制 B. 脉冲编码 C. 直接 D. 间接
    14. +
    15. 数据在通信信道传输的过程中,对数据传输的误码率影响最主要的因素是( D )。
      +A. 传输速率 B. 调制解调器 C. 传输介质 D. 噪声强度
      +9.Internet上的数据交换采用的是( A )。
      +A. 分组交换 B. 电路交换 C. 报文交换 D. 光交换
    16. +
    17. FDM是指( A )。
      +A. 频分多路复用 B. 时分多路复用 C. 波分多路复用 D. 码分多路利用
    18. +
    19. 利用( A ),数字数据可以用模拟信号来表示。
      +A. 调制解调器 B. 编码解码器 C. 串联放大器 D. 电话网络
    20. +
    21. 在数据通信系统中,传输介质的功能是( D )。
      +A. 在信源与信宿之间传输信息 B.纠正传输过程中的错误
      +C. 根据环境状况自动调整信号形式 D. 将信号从一端传至另一端
    22. +
    23. 在光纤中采用的多路复用技术是( C )。
      +A. 时分多路复用 B. 频分多路复用 C. 波分多路复用 D. 码分多路复用
    24. +
    25. 为了实现长距离传输,模拟传输系统都使用放大器来使信号中的能量得到增加,其噪声分量( A )。
      +A. 增大 B. 减小 C. 不变 D. 不一定
    26. +
    27. “复用”是一种将若干个彼此独立的信号合并为一个可在同一信道上传输的( C )。
      +A. 调制信号 B. 已调信号 C. 复用信号 D. 单边带信号
    28. +
    29. 物理层4个重要特性:机械特性、功能特性、电气特性和(A)。
      +A. 规程特性 B. 接口特性 C.协议特性 D. 物理特性
      +17. 基带系统使用(C)进行传输的。
      +A. 模拟信号 B. 调制信号 C. 数字信号 D. 载波信号
      +18. 下列关于异步传输说法正确的是(D)。
      +A. 一次传输一个数据块 B. 对时序的要求较高
      +C. 收/发端不需要进行同步 D. 数据传输速率低
      +19. 低通通道带宽为5KHz,编码采用512级分级信号,最大数据传输率(D)。
      +A. 32 kbps B. 48 kbps C. 64 kbps D. 90 kbps
    30. +
    31. 在宽带为8KHz的信道上,按奈奎斯特定理,每秒能发送的比特数不超过48kbps,则一个码元离散取值是(B)。
      +A. 4 B. 8 C. 16 D. 24
      +21. 在宽带为8KHz的信道上,如果8种不同的物理状态来表示数据,若信噪比S/N为30Db,按香农定理,最大限制的数据速率为(D)。
      +A. 24 kbps B. 48 kbps C. 40 kbps D. 80kbps
      +22. 在脉冲起始时刻,有无跳变来表示“0”和“1”,在脉冲中间时刻始终发生跳变的编码是(C)。
      +A. 曼彻斯特编码 B. 非归零码 C. 差分曼彻斯特编码 D. 8B/10B
      +23. 当数字信号在模拟传输系统中传送时,在发送端和接受端分别需要(A)。
      +A. 调制器和解调器 B. 解调器和调制器
      +C. 编码器和解码器 D. 解码器和编码器
      +24.两台计算机利用电话线路传输数据信号时必备的设备是(A).
      +A. 调制解调器 B. 网卡 C. 中继器 D. 集线器
      +25. 当通信子网采用(B)方式时,我们首先要在通信双方之间建立起逻辑连接。
      +A. 报文交换 B. 虚电路 C. 数据报 D. 电路交换
      +26.不受电磁干扰或噪声影响的介质是(B)。
      +A. 双绞线 B. 光纤 C. 同轴电缆 D. 微波
      +27. 报文的内容不按顺序到达目的节点的是(D)方式。
      +A. 电路交换 B. 报文交换 C.虚电路交换 D. 数据报交换
      +28. 在中继系统中,中继器处于(A)。
      +A. 物理层 B.数据链路层 C. 网络层 D. 高层
      +29. 关于时延说法正确的是(C)。
      +A. 发送时延=信道长度/电磁波在信道上的传播速度
      +B. 传播时延=数据块长度/信道带宽
      +C. 总时延=传播时延+发送时延+排队时延
      +D. 提高链路带宽减小了数据的传播时延
      +30. 下列说法错误的是(C)。
      +A. 在虚电路方式中,信息从源节点传送到目的节点采用“存储转发”方式
      +B. 在数据报方式中,信息从源节点传送到目的节点采用“存储转发”方式
      +C. 电路交换比分组交换实时性好
      +D. 报文交换方式适合交互式通信
      +31.物理层传输的是(A)。
      +A.原始比特 B.分组 C.信元 D.帧
      +32.在电缆中采用屏蔽可以带来什么好处?(B)
      +A.减少信号衰减 B.减少电磁干扰辐射
      +C.减少物理损坏 D.减少电缆的阻抗
      +33.调制解调技术主要用于(A)的通信方式中。
      +A.模拟信道传输数字数据 B.模拟信道传输模拟数据
      +C.数字信道传输数字数据 D.数字信道传输模拟数据
      +34.下列说法中,哪一项是正确的?(C)
      +A.虚电路与线路交换没有实质不同
      +B.在通信的两个站点间只能建立一条虚电路
      +C.虚电路有连接建立,数据传输,连接拆除3个阶段
      +D.虚电路的各个结点需要为每个分组作路由选择判定
      +35.当数字信号在模拟传输系统中传送时,在发送端和接收端分别需要(A)。
      +A.调制器和解调器 B解调器和调制器
      +C. 编码器和解码器 D解码器和编码器
      +36.物理层的4个特性中,(B)规定了每种信号的电平,信号的脉冲宽度,允许的数据传输速率和最大传输距离。
      +A.机械特性 B电气特性 C功能特性 D规程特性
      +37.为了将数字信号传输得更远,可以采用的设备是(A)。
      +A.中继器 B放大器 C网桥 D路由器
      +38.在无噪声情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输率是(C)
      +A.12kbps B.24kbps C.48kbps D.96kbps
      +39.传递需进行调制编码。(B)
      +  A.数字数据在数字信道上 B.数字数据在模拟信道上
      +  C.模拟数据在数字信道上 D.模拟数据在模拟信道上
      +40.数据传输速率公式:S= Tlog2N中,T的含义是。(B)
      +  A.单位脉冲幅度 B.单位脉冲宽度 C.调制速率 D.脉冲的有效值
      +41.两个实体间数据传输和交换是(A)
      +  A.数据通信 B.数据控制 C.数据传输 D.信息交换
      +42.在多数情况下,网络接口卡实现的功能处于。 (A)
      +  A.物理层协议和数据链路层协议 B.物理层协议和网络层协议
      +  C.数据链路层协议 D.网络层协议
      +43.下列说法哪一个是正确的 (A)
      +  A、当码元的离散值个数N=2,则波特率等于比特率;
      +  B、600波特和600bps是一个意思;
      +  C、每秒传送l00个码元也就是每秒传送100个比特;
      +D、每秒50波特的传输速率是很低的
      +44.模拟通信系统中产生的调制信号一定是。(B)
      +  A.数字信号 B.连续信号 C.语音信号 D.离散信号
      +45.用bps作单位的有(多选)(AC)
      +  A.位速率 B.波特率 C.数据传输率 D.误码率
      +46.下列对基带传输和宽带传输的说法正确的是(多选) (AB)
      +  A.基带传输是将数据直接转换为脉冲信号加到电缆上传输出去
      +  B.宽带传输是将数据加到载波信号上传送出去
      +  C.基带传输采用“控制载波信号状态”的传输技术
      +  D.在通信中,依据数据流的方向可以分为基带传输和宽带传输
      +47.下述哪个说法是正确的?(D)
      +  (A)细同轴电缆传输速率最高。
      +  (B) 光纤电缆支持电缆运行几十公里。
      +  © 屏蔽双绞线电缆对电磁干扰不敏感。
      +  (D) 以上说法都不对。
      +48.下述哪一个电缆类型支持最大的电缆长度?©
      +  (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
      +49.下述哪个说法是正确的?(D)
      +  (A)细同轴电缆传输速率最高。
      +  (B) 光纤电缆支持电缆运行几十公里。
      +  © 屏蔽双绞线电缆对电磁干扰不敏感。
      +  (D) 以上说法都不对。
      +50.下述哪一个电缆类型支持最大的电缆长度?©
      +  (A)无屏蔽双绞线(B)屏蔽双绞线©粗同轴电缆(D)细同轴电缆
      +ps:不保证完全正确,仅用来偷懒
    32. +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 计算机网络 +
    + + <![CDATA[一个bug]]> + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/49af668f.html + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/49af668f.html + Sat, 14 Mar 2020 21:55:57 GMT + 动漫美图

    + + +

    一个让人烦躁的bug

    +

      今天写代码,一个简单的查询,总是出现++java.math.BigDecimal cannot be cast to java.lang.Integer++,项目是热部署的,以为是缓存,清除一遍又一遍还是无效。我试着用toString方法转字符串然后转int,结果出现了异常,但是注释掉的代码可以运行

    +

    转换异常,看不出哪里有异常转换,我也有点好奇Map<String, Integer>是怎么变成Map<String, BigDecimal>的。
    +类型变化
    +我手动写了一个Map<String, Integer>尝试放入一个BigDecimal,结果编译失败了!

    +

    编译失败

    +

    查询使用了mybatis3.2.6框架(不是plus), resultType=“java.util.Map”
    +下面是sql

    +
    select MONTH(日期) as month,SUM(amount) AS total FROM `销售` where YEAR(日期) = #{year} GROUP BY MONTH(日期);
    +
    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + bug +
    + + <![CDATA[安卓开发学习--安装开发环境]]> + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html + https://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/ff03d5f4.html + Thu, 05 Mar 2020 07:55:57 GMT + 安卓路线图

    + + +

    Android Stdio下载

    +

    网盘下载
    +官网下载

    +

    安装过程

    +

    一直点next就行了,注意一下几点:

    +
      +
    1. AS安装路径不能与sdk路径一样
    2. +
    +

    安装路径配置

    +

    错误图片

    +
      +
    1. 安装目录不能是中文,如果安装目录是中文,AS会提示错误 ++Your SDK location contains non-ASCII characters++
    2. +
    +

    Your SDK location contains non-ASCII characters

    +

    App运行方式

    +

    模拟器运行

    +

    模拟器运行图片
    +手机型号可以自己选,然后点next
    +手机选择
    +选择镜像(安卓版本),然后点next,后面配置可以不动,点Finish
    +安卓版本
    +完成图片
    +配置完成图片
    +启动图片
    +tip:模拟器默认安装在C盘,可以通过教程修改传送门

    +

    真机运行

    +

    插上安卓手机,打开usb调试打开方式,手机出现提示时点同意
    +usb调试授权

    +

    第一次写blog,不足之处多多见谅

    +]]>
    + dragondyt@yandex.com (Dragon Dyt) + 安卓开发学习 +
    +
    +
    \ No newline at end of file diff --git a/safari-pinned-tab.svg b/safari-pinned-tab.svg new file mode 100644 index 0000000..a0e8898 --- /dev/null +++ b/safari-pinned-tab.svg @@ -0,0 +1,66 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/sitemap-0.xml b/sitemap-0.xml new file mode 100644 index 0000000..b3bf5d6 --- /dev/null +++ b/sitemap-0.xml @@ -0,0 +1 @@ +https://blog.dragondyt.top/8612fa7f/e00fc567/OpenGL/ecdcd4fc.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/e00fc567/3632a017/af753a41.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/389d18c2.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/340249a9/76a66db0.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/9862a150.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/69a9925d.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/6d80ff7f.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/36462e02.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/8f835b6d.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2cf49dc6.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/2a1f0504.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/2362a8ea/3758805c.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/79666db/7b216a3b/7cab1e06.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/77c5fdb1.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/c7081503.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/b7e144d1/e85d694a/9b7cc1d2.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/47867b98/Java/fd72446f.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/ec060e02/Hadoop/15d9e331.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/47867b98/Java/9c47706b.htmlmonthlyhttps://blog.dragondyt.top/computer-science/note/theme-shoka-doc/b7629dd4.htmlmonthlyhttps://blog.dragondyt.top/computer-science/note/theme-shoka-doc/85a3718.htmlmonthlyhttps://blog.dragondyt.top/computer-science/note/theme-shoka-doc/d30922d5.htmlmonthlyhttps://blog.dragondyt.top/computer-science/note/79abcd0d.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/47867b98/Java/c82dcf86.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/aa3015f4.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/c4877271.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/47867b98/Flutter/74684463.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/7c36b624/d3ee0f4f/2157fe1d.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/8f8103b7/Docker/29596f0c.htmlmonthlyhttps://blog.dragondyt.top/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E5%B7%A5%E5%85%B7/Git/git.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/589e13eb.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/e255a10a/a87da565/5eef9793.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/49af668f.htmlmonthlyhttps://blog.dragondyt.top/8612fa7f/e00fc567/5ac6f809/ff03d5f4.htmlmonthly \ No newline at end of file diff --git a/sitemap-index.xml b/sitemap-index.xml new file mode 100644 index 0000000..4e269b3 --- /dev/null +++ b/sitemap-index.xml @@ -0,0 +1 @@ +https://blog.dragondyt.top/sitemap-0.xml \ No newline at end of file diff --git a/yandex_02ac31566ebecff8.html b/yandex_02ac31566ebecff8.html new file mode 100644 index 0000000..ed9f7ed --- /dev/null +++ b/yandex_02ac31566ebecff8.html @@ -0,0 +1,6 @@ + + + + + Verification: 02ac31566ebecff8 + \ No newline at end of file diff --git "a/\350\256\241\347\256\227\346\234\272/\345\267\245\345\205\267/Git/git.html" "b/\350\256\241\347\256\227\346\234\272/\345\267\245\345\205\267/Git/git.html" new file mode 100644 index 0000000..81cb582 --- /dev/null +++ "b/\350\256\241\347\256\227\346\234\272/\345\267\245\345\205\267/Git/git.html" @@ -0,0 +1,32 @@ + + + + + + + + + + git push时出现error: src refspec master does not match any解决办法. | VuePress + + + + + + + +

    动漫美图

    git push时出现error: src refspec master does not match any解决办法.

    网传原因:
      ++这是由于存储库仍然为空引起的。存储库中没有提交,因此没有 master分支可推送到服务器。++
    网传解决方法:

    touch README
    +git add README 
    +git commit -m 'first commit'
    +git push origin master
    +

    可能是我垃圾吧,git命令写错了,反正没能解决,如图:

    image.png

    git show-ref
    +

    d601ecc070daac5320959ee8c47bca013a113256 refs/remotes/origin/master

    终于换一种错误了,留下了无知的眼泪

    git push origin HEAD:master
    +

    image.png

    一番调整,我终于成功了,失败30次,o(╥﹏╥)o

    image.png

    去目标仓库查看,发现有一个目录文件全没了(╥╯^╰╥)
    我有修改一番,好刺激啊,这就是删库跑路的快感吗!

    image.png

    这就是之前消失的文件,现在回来了,其他的又消失了。。。
    经过检查,该文件夹下面含有 .git 文件夹,无法被追踪,删除即可,到此结束了,节后逃生的感觉。
    总结:出现这个错误不一定是因为空目录,也可能是因为远程分支不在!!!

    评论数
    + + +