【腾讯云 Cloud Studio 实战训练营】丝滑体验:用 Cloud Studio 实现一个精确计时的时钟

2023-10-26

当今的云计算技术已经越来越成熟,基于云计算技术进行云端开发已经成为最新趋势。而 Cloud Studio 是一个基于云计算的 Web 端开发微服务平台,提供了代码编辑器、调试器、代码库,以及自动构建和部署工具等各种功能,帮助开发者在云端开发应用程序。

虽然我很早就接触了云端 IDE,可是能让我感到如此丝滑的开发体验,应该要属这一次!

在众多 IDE 中, Cloud Studio 绝对是你可以选择的一款。因为选择一款云端 IDE 不仅仅要看它的用户体验,还要看它能提供的资源。 Cloud Studio 背靠腾讯云,拥有丰富的云端资源可供开发者调用,这就等于你开了一家五金店,你在装修自家房子的时候,可以及时地拿到想要的工具。

而这一次为什么让我体验到了丝滑的感觉呢?因为我在尝试通过前端技术创建一个 Web 时钟动画的时候,发现 Cloud Studio 尽能如此快速、零顿挫感地帮我实现项目应用的预览、代码保存、代码托管等等一系列功能,丝毫没有感觉到浏览器的后台处理进程在“嚣张”地运行。那么,接下来废话不多说,我就来分享一下我是如何在 Cloud Studio 上快速创建 Web 时钟动画的。

本项目来源于《腾讯云 Cloud Studio 实战训练营》的参赛作品,该作品在腾讯云 Cloud Studio 中运行无误。

开始体验

首先,需要创建你的账号。

由于 CODING 和 Cloud Studio 实现了账号互通,如果你有 CODING 的账号,你可以用 CODING 账号登录,完成账号授权。除此之外,你还可以通过 微信 或者 GitHub 进行登录。
在这里插入图片描述
登录之后,你会在 Cloud Studio 左侧的导航栏中看到 “空间模板”这么一个菜单,点击这个菜单,右侧会出现很多常用模板、框架模板供你选择。当然,你也可以选择右上角,点击 “新建模板” 按钮进行手动创建一个模板。

在这里插入图片描述

于是乎,为了特别一点,本项目就选择“新建模板”的方式进行创建:
在这里插入图片描述
只需要填写上述必要的信息即可。

创建成功之后,点击打开刚刚创建的模板:
在这里插入图片描述

开始编程

进入我们刚刚创建的模板之后,会为你加载一个工作空间(注意,工作模式下,只能有一个工作空间在运行。ps:这点感觉不太友好)。

如果你是一个前端开发者,看到打开的工作空间画面是不是觉得很熟悉。没错!这是一个 VSCode 的编辑器界面。那么,这对于一个以使用 VSCode 作为日常开发主要编辑器的开发者来说,这样的工作空间可以说是零门槛上手。

接着,我们创建两个文件夹和三个文件,项目结构如下所示:

在这里插入图片描述
要开始创建一个时钟,你还需要具备一些基础知识。例如,我们下面先来学习一下 Web Animations API

Web Animations API

Web Animations API 引入了时间线的概念。 默认情况下,所有动画都与文档的时间轴相关联。 这意味着动画共享相同的“内部时钟”——即从页面加载开始的时钟。

共享时钟使我们能够协调动画。无论是某种节奏还是一种模式,你都不必担心某些事情会延迟或超前发生。其中,它还有一个 startTime 属性是我们需要知道的。

  • startTime 属性

要使动画在某个时刻开始,请使用 startTime 属性。 startTime 的值以页面加载后的毫秒数为单位。 开始时间设置为 1000.5 的动画将在文档时间轴的 currentTime 属性等于 1000.5 时开始播放。

你是否注意到开始时间值中的小数点了吗? 是的,你可以使用毫秒的分数来精确时间。 但是,精确度取决于浏览器设置。

另一个有趣的事情是开始时间也可以是负数。 你可以自由地将其设置为未来的某个时刻或过去的某个时刻。 将该值设置为 -1000,你的动画状态就像页面加载时已经播放了一秒钟一样。 对于用户来说,动画似乎在他们甚至还没有考虑访问你的页面之前就已经开始播放了

了解了上面的基础知识,下面我们就一起来看下如何使用 Web Animations API 来实现Web 时钟动画。

Web 时钟动画

首先,打开 index.html ,在该文件中填入如下代码。这段代码主要用于创建时钟的布局:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>时钟动画</title>
  <link rel="stylesheet" href="/css/index.css">
</head>
<body>
  <template id="tick">
    <div class="tick"><span></span></div>        
  </template>
  
  <template id="digit"><span class="digit" style="--len: 10;"><span></span></span></template>
  
  <div id="analog-clock">
    <div class="hour-ticks"></div>
    <div class="minute-ticks"></div>
    
    <div class="day"></div>
    
    <div class="hand second"><div class="shadow"></div><div class="body"></div></div>
    <div class="hand minute"><div class="shadow"></div><div class="body"></div></div>
    <div class="hand hour"><div class="shadow"></div><div class="body"></div></div>
  
    <div class="dot"></div>
  </div>
  
  <div id="digital-clock">
    <span class="hours"></span><span>:</span><span class="minutes"></span><span>:</span><span class="seconds"></span><span>.</span><span class="milliseconds"></span>
  </div>
  <script src="./js/index.js"></script>
</body>
</html>

接着,还需要对布局进行样式上的处理。打开 css/index.css 文件,填入如下代码:

:root {
    --face-size: 15rem;
}

body {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    font-family: sans-serif;
}

body > * {
    margin: 1rem;
}

#analog-clock {
    width: var(--face-size);
    height: var(--face-size);
    position: relative;
    border: 3px solid #555;
    border-radius: 50%;
    font-weight: 400;
}

.dot {
    --size: 9px;
    position: absolute;
    left: calc(50% - calc(var(--size) / 2));
    top: calc(50% - calc(var(--size) / 2));
    width: var(--size);
    height: var(--size);
    background-color: #333;
    border-radius: 50%;
    filter: drop-shadow(1px 1px 1px #333);
}

.hand {
    position: absolute;
    bottom: 50%;
    left: calc(50% - calc(var(--width) / 2));
    width: var(--width);
    transform-origin: center bottom;
}

.hand > * {
    position: absolute;
    height: 100%;
    width: 100%;
    border-radius: 4px;
}

.hand .body {
    background-color: #333;
}

.hand .shadow {
    background-color: black;
    opacity: 0.2;
    filter: drop-shadow(0 0 1px black);
}

.second {
    --width: 1px;
    height: 50%;
    transform-origin: center 80%;
    margin-bottom: calc(var(--face-size) * -0.1)
}

.second .body {
    background-color: black;
}

.minute {
    --width: 3px;
    height: 35%;
}

.hour {
    --width: 5px;
    height: 25%;
}

.day {
    --size: 2ch;
    position: absolute;
    left: calc(50% - calc(var(--size) / 2));
    top: calc(50% - calc(var(--size) / 2));
    width: var(--size);
    height: var(--size);
    transform: translate(calc(var(--face-size) * 0.2));
}

.tick {
    --width: 2px;
    --height: 29px;
    --shift: translateY(calc(var(--face-size) / -2));
    position: absolute;
    width: var(--width);
    height: var(--height);
    background-color: #666;
    top: 50%;
    left: calc(50% - calc(var(--width) / 2));
    transform-origin: top center;
}

.tick > span {
    --width: calc(calc(var(--face-size) * 3.141592653589793) / 24);
    position: absolute;
    width: var(--width);
    top: 3px;
    left: calc(var(--width) / -2);
    text-align: center;
}

.hour-ticks .tick:nth-child(even) > span {
    display: none;
}

.hour-ticks .tick:nth-child(odd) {
    background: none;
}

.hour-ticks .tick {
    transform: rotate(calc(var(--index) * 15deg)) var(--shift);
}

.minute-ticks .tick {
    --width: 1px;
    --height: 5px;
    --shift: translateY(calc(var(--face-size) / -2.5));
    background-color: black;
    transform: rotate(calc(var(--index) * 6deg)) var(--shift);
}

.minute-ticks .tick:nth-child(5n+1) {
    display: none;
}

#digital-clock {
    font-size: 1.5rem;
    line-height: 1;
}

#digital-clock > span {
    display: inline-block;
    vertical-align: top;
}

.digit {
    display: inline-block;
    overflow: hidden;
    max-width: 1ch;
}

.digit.wide {
    max-width: 2ch;
}

.digit > span {
    display: inline-flex;
    align-items: flex-start;
}

.digit.wide > span > span {
    min-width: 2ch;
    text-align: right;
}

.day .digit > span > span {
    text-align: center;
}

此时,我们的时钟就画出来了,点击编辑器右上角的按钮,进行预览:

在这里插入图片描述
在这里插入图片描述
上图的这个时钟,有没有一种简笔画的感觉。

但是要让时钟走起来,还需要脚本的处理。就是我们前面提到的 Web Animation API。

接着,我们打开 js/index.js 文件,补充如下代码:

const ms = 1;
const s = ms * 1000;
const m = s * 60;
const h = m * 60;
const d = h * 24;

const start_time = (function () {
    const time = new Date();
    const document_time = document.timeline.currentTime;
    const hour_diff = time.getHours() - time.getUTCHours();
    const current_time = (Number(time) % d) + (hour_diff * h);

    return document_time - current_time;
}());

const single_digit_keyframes = [
    {transform: "translateX(0)"},
    {transform: "translateX(calc(var(--len, 10) * -1ch)"}
];
const double_digit_keyframes = [
    {transform: "translateX(0)"},
    {transform: "translateX(calc(var(--len) * -2ch)"}
];

function range(len) {
    return new Array(len).fill(true);
}

function digits(len = 10, zero_based = true) {
    const digit = document.getElementById("digit").content.cloneNode(true);
    digit.firstElementChild.style.setProperty("--len", len);

    digit.firstElementChild.firstElementChild.append(
        ...range(len).map(function (ignore, index) {
            const span = document.createElement("span");
            span.textContent = zero_based ? index : index + 1;
            return span;
        })
    );

    if (len > 10) {
        digit.firstElementChild.classList.add("wide");
    }

    return digit;
}

(function build_analog_clock() {
    const clock = document.getElementById("analog-clock");
    const tick_template = document.getElementById("tick");
    const hour_marks_container = clock.querySelector(".hour-ticks");
    const minute_marks_container = clock.querySelector(".minute-ticks");
    const day = clock.querySelector(".day");

    hour_marks_container.append(...range(24).map(function (ignore, index) {
        const tick = tick_template.content.cloneNode(true);
        const shifted = index + 1;
        tick.firstElementChild.style.setProperty("--index", shifted);
        tick.firstElementChild.firstElementChild.textContent = shifted;
        return tick;
    }));

    minute_marks_container.append(...range(60).map(function (ignore, index) {
        const tick = tick_template.content.cloneNode(true);
        tick.firstElementChild.style.setProperty("--index", index);
        tick.firstElementChild.firstElementChild.remove();
        return tick;
    }));
}());

(function build_digital_clock() {
    const clock = document.getElementById("digital-clock");
    const hours = clock.querySelector(".hours");
    const minutes = clock.querySelector(".minutes");
    const seconds = clock.querySelector(".seconds");
    const milliseconds = clock.querySelector(".milliseconds");

    hours.append(digits(24));
    minutes.append(digits(6), digits());
    seconds.append(digits(6), digits());
    milliseconds.append(digits(), digits(), digits());
}());

(function start_analog_clock() {
    const clock = document.getElementById("analog-clock");
    if (clock === null) {
        return;
    }

    const second = clock.querySelector(".second");
    const minute = clock.querySelector(".minute");
    const hour = clock.querySelector(".hour");

    const hands = [second, minute, hour];
    const hand_durations = [m, h, d];
    const steps = [60, 60, 120];

    const movement = [];

    hands.forEach(function (hand, index) {
        const duration = hand_durations[index];
        const easing = `steps(${steps[index]}, end)`;
        movement.push(hand.animate(
            [
                {transform: "rotate(0turn)"},
                {transform: "rotate(1turn)"}
            ],
            {duration, iterations: Infinity, easing}
        ));
        
        const shadow = hand.querySelector(".shadow");
        if (shadow) {
            movement.push(shadow.animate(
                [
                    {transform: "rotate(1turn) translate(3px) rotate(0turn)"},
                    {transform: "rotate(0turn) translate(3px) rotate(1turn)"}
                ],
                {duration, iterations: Infinity, iterationStart: 0.9, easing}
            ));
        }
    });

    movement.forEach(function (move) {
        move.startTime = start_time;
    });
}());

(function start_digital_clock() {
    const clock = document.getElementById("digital-clock");
    if (clock === null) {
        return;
    }
    const milliseconds = clock.querySelector(".milliseconds");
    const seconds = clock.querySelector(".seconds");
    const minutes = clock.querySelector(".minutes");
    const hours = clock.querySelector(".hours");
    const sections = [seconds, minutes];

    const durations = [s, m, h];
    const animations = [];

    Array.from(
        milliseconds.children
    ).reverse().forEach(function (digit, index) {
        animations.push(digit.firstElementChild.animate(
            single_digit_keyframes,
            {
                duration: ms * (10 ** (index + 1)),
                iterations: Infinity,
                easing: "steps(10, end)"
            }
        ));
    });

    sections.forEach(function (section, index) {
        Array.from(
            section.children
        ).forEach(function (digit) {
            const nr_digits = digit.firstElementChild.children.length;
            animations.push(digit.firstElementChild.animate(
                single_digit_keyframes,
                {
                    duration: (
                        nr_digits === 10
                        ? durations[index] * 10
                        : durations[index + 1]
                    ),
                    iterations: Infinity,
                    easing: `steps(${nr_digits}, end)`
                }
            ));
        });
    });

    Array.from(hours.children).forEach(function (digit) {
        const nr_digits = digit.firstElementChild.children.length;
        animations.push(
            digit.firstElementChild.animate(
                double_digit_keyframes,
                {
                    duration: d,
                    iterations: Infinity,
                    easing: `steps(${nr_digits}, end)`
                }
            )
        );
    });

    animations.forEach(function (animation) {
        animation.startTime = start_time;
    });
}());

(function set_up_date_complication() {
    const day = document.querySelector(".day");
    if (day === null) {
        return;
    }

    function month() {
        const now = new Date();
        return digits(
            (new Date(now.getFullYear(), now.getMonth() + 1, 0)).getDate(),
            false
        );
    }

    function create_animation(digit) {
        const nr_digits = digit.firstElementChild.children.length;
        const duration = d * nr_digits;
        return digit.firstElementChild.animate(
            double_digit_keyframes,
            {
                duration,
                easing: `steps(${nr_digits}, end)`,
                iterationStart: (d * ((new Date()).getDate() - 1)) / duration
            }
        );
    }

    const new_day = day.cloneNode();
    new_day.append(month());
    day.replaceWith(new_day);

    Array.from(new_day.children).forEach(function (digit) {
        const complication = create_animation(digit);
        complication.startTime = start_time;
        complication.finished.then(set_up_date_complication);
    });
}());

这个时候,右侧的预览画面会实时进行更新,我们会看到时钟神奇地动了起来。

请添加图片描述
至此,我们的 Web 时钟动画就完成啦~

最后,我们把这个应用发布到到 Git 仓库中。

发布 Git

Cloud Studio 支持将代码和项目的仓库地址进行关联,支持 github/ Coding/ gitee 等多平台。目前,Web 时钟的代码已公开在 Coding 仓库中,你可以点击链接进行查看。
在这里插入图片描述

通过这么一系列操作下来,我感觉似乎和我在日常开发中使用 VSCode 自己开发,轻便快捷多了。省去了我很多保存文件、配置信息等等的步骤。最后来总结一下使用体验吧。

总结

使用 Cloud Studio 这个在线 IDE 的感受非常好,它的优点非常丰富,我总结了一些我认为值得赞赏的地方:

  1. 基于 Web,极大地方便了开发者在任何地方、任何设备上进行代码编写,而且不需要安装任何软件。
  2. Cloud Studio 的界面设计得很简洁、直观,使得初学者也可以轻松上手,且不影响开发者的效率。
  3. 支持多种编程语言,如 Java、Python、JavaScript 等,以及一些常见的框架,如 Node.js、Spring Boot 等,这样就可以满足各种开发需求。
  4. 可以与 GitHub 等代码托管平台进行无缝集成,从而方便提交代码和代码的版本控制。
  5. Cloud Studio 还提供了很多强大的开发工具,如代码自动补全、调试、断点等功能,可以大大提高开发效率。
  6. 自动构建和部署,Cloud Studio提供了自动化的构建和部署工具,可以将代码部署到云端或者其他地方进行测试和生产使用。

虽然 Cloud Studio 表现优异,但也存在一些缺点:

  1. 由于它是基于 Web 的,因此在网络不稳定或速度较慢的情况下,可能会影响开发者的使用体验。特别是在创建/打开工作空间的时候,需要等上一会。
  2. 工作空间只能打开一个:这个缺点不知道是不是普通用户的原因,当我有多个项目在开发的时候就很不方便,我需要停了一个工作空间,才能打开另一个工作空间。

但是,相较于其他 IDE,Cloud Studio 的优点在于它的轻便、易用、可扩展、云端存储等。但也有一些不同,例如它不能离线运行,并且可能会受到网络延迟的影响。总的来说,Cloud Studio 是一款非常方便的在线 IDE,可以让我们在任何地方方便地进行开发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【腾讯云 Cloud Studio 实战训练营】丝滑体验:用 Cloud Studio 实现一个精确计时的时钟 的相关文章

  • Clojure 开发:IDE 还是 REPL?

    我已经使用 Clojure 一段时间了 想要创建一些比玩具更大 更复杂的项目 过去几年我一直在使用 Java 并且已经习惯了 IDE 为我所做的事情 编译大量类 将它们打包在 jar 中 创建批处理文件供用户启动它们 当我查看 Clojur
  • 非线性条件断点

    是否可以设置断点 使程序在指令满足某些条件后停止执行true 一个类有一个名为的变量currency我想设置一个断点 使程序在之后的任何行停止currency 20 我不知道行号在哪里currency已更改 因此这就像在其中放置一个断点每行
  • CLion 行注释的自动缩进不一致

    CLion 中出现一些奇怪的自动缩进 我不明白为什么 这是一个例子 int i1 5 some comments then I hit Enter auto indentation goes here I hit Enter again I
  • 如何在 Eclipse 中运行具有 main() 的单个 Java 文件,而不创建整个 Java 项目?

    这是我所得到的 我有一个TestFile java具有相同的类名 这个类有一个有效的main method 该文件可以通过终端使用 javac 和 java 轻松运行 给出预期的输出 但是 当我将文件拖放到 或打开 到 Eclipse 中并
  • 如何清除“运行”->“参数”菜单中的“参数”字段?

    我正在使用 CodeGear RAD Studio IDE 为了使用命令行参数测试我的应用程序 我多次使用 运行 gt 参数 菜单中的 参数 字段 但每次我为它提供一个新值时 它都无法从 下拉框 中删除 我需要清理这个字段 删除所有值 因为
  • 如何防止 IntelliJ IDEA 在启动时重新分配文件类型关联?

    我正在使用 IntelliJ IDEA Ultimate 18 1 而 Jenkinsfile 支持很糟糕 值得庆幸的是 将文件视为 Groovy 是我可以接受的解决方法 这涉及到 删除 Jenkinsfile 关联 在Groovy组下添加
  • 如何让 js2-mode 在 Emacs 中使用空格而不是制表符?

    我在用js2 mode http code google com p js2 mode 在 Emacs 中编辑 Javascript 但我似乎无法让它停止使用制表符而不是空格进行缩进 我的其他模式工作正常 只是遇到 js2 问题 你有 se
  • 在 Visual Studio 中进行嵌入式代码开发(尤其是使用 C18 的 PIC)

    我使用 Visual Studio 编写桌面应用程序 我发现它非常用户友好且易于使用 如果可能的话 我还想在Visual Studio中编写嵌入式代码 例如 是否可以使用 C18 或任何其他类似的基于 C 的语言为 PIC18Fxxx 系列
  • pytorch 的 IDE 自动完成

    我正在使用 Visual Studio 代码 最近尝试了风筝 这两者似乎都没有 pytorch 的自动完成功能 这些工具可以吗 如果没有 有人可以推荐一个可以的编辑器吗 谢谢你 使用Pycharmhttps www jetbrains co
  • 如何在 Intellij Idea 12 中重命名/移动项目?

    就像声明的那样here http link sheidaei com mozcw人们可以更改项目的名称 但是 它仅更改项目名称 不会更改文件夹结构 例如 如果您的项目名为sample1并且位于 user1 development IdeaP
  • 如何设置 Xcode 来代替 Qt Creator 工作?

    我不使用 Qt Creator 的 UI 设计功能 对于一个新项目 我想体验一下使用 Xcode 的工作 这将是一个常规的 Qt 项目 使用 C 和 Qt 库开发 就像在 Qt Creator 中一样 我没有使用 OS X 尤其是 Xcod
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • IntelliJ IDEA 中查找方法/函数的快捷方式是什么?

    I know that Ctrl N is to find classes and it is very useful But what about methods ctrl F12 cmd F12 on macOS will show a
  • 设置 Emacs 进行 Erlang 编程

    Emacs 是 Erlang 编程的首选 IDE 有很多好的模式 distel erlware mode 默认的 erlang 模式 但是您对设置 Emacs 进行专业 Erlang 开发有何建议 按照中所述设置 erlang mode自述
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • R 编程常用工具

    如果已经以不同的方式问过这个问题 我深表歉意 但我找不到任何达到我想要的东西 我真的是从其他软件包 SPSS 开始接触 R 的 当我了解真正可以做什么时 我意识到我还需要其他 工具 这让我想到了我的问题 您有哪些用于开发 R 代码的设置 我
  • 如何在 Windows 上的 Eclipse 中设置 Clang 工具链?

    我为一个愚蠢的问题道歉 但我在网上找不到答案 我正在努力为 64 位计算机上的 Windows 7 中的 Eclipse 设置 Clang 编译器 链接器 我对 C 的了解非常过时 并且从未在 Eclipse 中工作过 我想要实现的是在 W
  • Oo 任何 IDE 中的 javascript 代码补全

    你知道有什么IDE可以自动完成这种代码吗 我这里有一个 javascript 类生成器 function var core bind function method scope if method instanceof Function t
  • WebStorm HTML 文件显示 HTML 元素的 TypeScript 错误

    我安装了 WebStorm 的新副本并打开了现有的 Angular 项目 当我打开项目中的任何 HTML 文件时 IDE 都会显示 找不到 div div html 文件中的标签 IDE 运行了几秒钟 然后显示 2 5 3 Typescri
  • 在 Eclipse 中隐藏重复的工具栏项

    我不知道如何 但我的 STS 有重复的工具栏项目 我不知道如何删除它们 这是我复制的工具栏的样子 我想摆脱这些 我试图隐藏工具栏 但这没有帮助 有人知道如何删除重复的吗 自从升级到 Oxygen 以来 我一直遇到同样的问题 我无法可靠地重现

随机推荐

  • MMDrawerController 与 StoryBoard 构建和谐抽屉效果

    纠结了一天都不知道怎么在storyboard中用MMDrawerController 看了下MMDrawerController Storyboard版本的库也不知道怎么用 网上搜了下 发现了个好方法 参考 http www wenzizo
  • 2017年、2019年全国大学生电子设计竞赛综合测评——常用电路Multisim仿真——方波、三角波振荡电路

    相关原创博客 2017年综合测评仿真电路讲解 题目和结果链接 常用电路Multisim仿真 方波 三角波振荡电路 常用电路Multisim仿真 有源低通滤波器设计 常用电路Multisim仿真 数字芯片74LS74构建分频器设计 常用电路M
  • Couch的MapReduce查询

    1 MapReduce介绍 传统的关系型数据库中 只要你的数据是结构化的 你可以进行任何类型的查询 Apache Couch与此相反 它使用MapReduce 预定义的map和的reduce方法 进行查询 这种查询方式具有更好的灵活性 因为
  • laravel-admin安装

    前言 Laravel Admin 是一个国产项目 作者是 song Laravel Admin 整合了 AdminLTE 内置了权限管理 还可以快速的创建数据表格和表单 更棒的是它是开源的 所以现在有很多人选择使用它来搭建管理后台 官网是h
  • jeecgboot 基础说明

    参考地址 1 主页面 路径 public index html 解释 配置登录页的title 和登录加载过程出现的文字 2 前端页面整体布局 路径 src components page GlobalLayout vue 解释 页面的菜单
  • Apache+SVN+Review Board代码审核服务器搭建流程

    Apache SVN Review Board代码审核服务器搭建流程 本博文基于原创 四京 https blog 51cto com 12676522 1929856 utm source oschina app 更新修改 一 简介 代码审
  • 【每日一题】ABC194E-Mex Min

    题目内容 原题链接 给定一个长度为 n n n 的整数数组 a a a 求所有长度为 m m
  • 腾讯云服务器带宽计费模式按流量内网、外网出入流量计算说明

    腾讯云服务器公网带宽计费模式按使用流量计费 云服务器对内或对外产生的流量如何计算 云服务器出方向 下行流量 和入方向 上行流量 怎么计算 腾讯云百科来详细说下腾讯云服务器按使用流量计算说明 腾讯云服务器带宽计费模式按使用流量 同一私有网络内
  • for in 和 for of 有什么区别

    for in和for of是两种用于遍历数据结构的循环语句 它们在用法和功能上有一些区别 for in循环 for in循环用于遍历对象的可枚举属性 在循环中 变量代表当前遍历到的属性名 字符串类型 循环会遍历对象的自身属性以及继承的属性
  • LeetCode解析------218.天际线问题-树状数组

    题目 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓 现在 假设您获得了城市风光照片 图A 上显示的所有建筑物的位置和高度 请编写一个程序以输出由这些建筑物形成的天际线 图B 每个建筑物的几何信息用三元组 Li Ri Hi
  • 由相位噪声曲线计算积分相噪和Jitter的方法

    先放一张忘了从哪扒下来的图 基本思路 分段求积分相噪 相加得整体的积分相噪 进而得到以弧度为单位的相位抖动 最终转换为以时间为单位的Jitter MATLAB代码 function ph2jt fc f ph ph2jt fc f ph f
  • Android 实现计时器功能

    最近有个项目要实现记录时间推进的功能 之前百度了下 发现了android自带控件 Chronometer 可以实现这个功能 详见之前写的博客 http blog csdn net qq 21793463 article details 49
  • Android 系统设置中显示设置之休眠和屏保设置篇

    1 休眠设置 首先我们来看一下休眠设置在界面中的定义 1
  • 32_杂项

    文章目录 TLS TLS 安全密码套件 证书 TLS通讯过程 open file cache TLS TLS 安全密码套件 密钥交换 ecdhe ECDH椭圆曲线交换 身份验证 RSA 对称加密 aes 128 gcm 摘要算法 sha25
  • SpringMVC-复杂参数处理

    1 实体类 package com hwy entity public class Role private Integer id private String name public Integer getId return id pub
  • 程序员必须知道的10个搜索技巧

    转载地址 http www cnblogs com shown p 6524342 html 1 准确搜索 在关键词上加上双引号 2 排除关键词 用减号 eg 在搜索 Joe Bloggs jeans 时 你所得到的结果反馈是不包含 jea
  • vue3项目装包报错 npm ERR! 404 Not Found - GET https://registry.npmjs.org/@vue%2fvue-loader-v15 - Not found

    npm ERR code E404 npm ERR 404 Not Found GET https registry npmjs org vue 2fvue loader v15 Not found npm ERR 404 npm ERR
  • VSCode+Idea 一个增删改查demo

    一个简单的增删改查demo 开发工具 Visual Studio Code Idea Navicat demo 前端 后台 开发工具 Visual Studio Code 一款前端开发工具 下载地址 https code visualstu
  • 微信小程序开发教程 #043 - 在小程序开发中使用 npm

    本文介绍了如何在微信小程序开发中使用 npm 中包的功能 大大提高微信小程序的开发效率 同时也是微信小程序系列教程的视频版更新 微信小程序在发布之初没有对 npm 的支持功能 这也是目前很多前端开发人员在熟悉了 npm 生态环境后 对微信小
  • 【腾讯云 Cloud Studio 实战训练营】丝滑体验:用 Cloud Studio 实现一个精确计时的时钟

    当今的云计算技术已经越来越成熟 基于云计算技术进行云端开发已经成为最新趋势 而 Cloud Studio 是一个基于云计算的 Web 端开发微服务平台 提供了代码编辑器 调试器 代码库 以及自动构建和部署工具等各种功能 帮助开发者在云端开发