- 【Node.js】Express 框架及其基本使用详解
Peter-Lu
#NodeJSnode.jsexpressjavascript前端npm
文章目录一、Express概述1.Express是什么?2.为什么选择Express?二、安装与项目初始化1.环境准备2.初始化Express项目三、Express的基本使用1.创建一个简单的服务器2.路由管理3.使用中间件4.处理静态文件四、处理请求数据1.解析JSON数据2.解析URL编码的数据五、错误处理六、总结Express是Node.js生态中最受欢迎的web框架之一,广泛用于构建服务器
- nodejs后端ws与http结合共享一个服务器,前端websocket发送信息后端ws接收信息,使用Map定型数组设置ID
cdcdhj
nodejshttp服务器前端
//服务端代码consthttp=require('node:http');constWebSocket=require('ws');constserver=http.createServer();//创建websocket服务constwss=newWebSocket.WebSocketServer({server});//创建定型数组constclients=newMap();wss.on('
- node.js中实现token的生成与验证
小灰灰学编程
Node.jsnode.jstoken前端
Token(令牌)是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中,Token常用于身份验证和授权,确保用户能够安全地访问受保护的资源。作用与意义身份验证:Token可以用来验证用户的身份,确保用户已经通过认证流程。授权:通过Token,服务器可以识别用户的权限,从而允许或拒绝访问特定的资源。状态管理:在无状态(stateless)的API设计中,Token可以携带用户的状态
- html2canvas 页面变图片
我们用的uni-app页面做的页面,需要把页面转成图片;问题1:不同的手机会偶发文字挤在一块,不是所有的都是那种问题2:图片出现加载不出来解决问题1:是因为我的文字写的居中,html2canvas居中会导致分布不均匀,有针对性的写样式font-smoothing:antialiased;-webkit-text-size-adjust:100%;letter-spacing:0.05em;解决问题
- 【YashanDB知识库】过期统计信息导致SQL执行计划变差
数据库
本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7919229.html?templateId=171...【问题分类】性能问题【关键字】统计信息【问题描述】表的统计信息失效后,将会采用该表默认的参数值支持代价计算,该表对应的SQL的执行计划将会变差。--查看表的统计信息失效状态的表selectTABLE_NAME,NUM_ROWS
- 【YashanDB知识库】安装共享集群时报错:YAS-05721
数据库
本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7919226.html?templateId=171...【标题】安装共享集群时报错:YAS-05721invalidinputparameter,reason:nodenameinvalid【问题分类】安装部署【关键字】YAS-05721、共享集群、主机名、特殊符号、中划线、部署【
- 【YashanDB知识库】YMP校验从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致
数据库
本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7901520.html?templateId=171...问题现象在YMP校验过程中,从yashandb同步到oracle的数据时,字段timestamp(0)出现不一致问题的风险及影响YMP校验出现数据内容不一致问题影响的版本yashandb版本:23.2.7.101YMP版本:2
- 【YashanDB知识库】Hive 命令工具insert崖山数据库报错
数据库
本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7919217.html?templateId=171...【问题分类】功能兼容【关键字】spark30041、不兼容【问题描述】本项目的架构是hadoop+hive+yashandb使用崖山数据库,初始化所有的原数据表和数据新建表之后,插入数据时候报错,hadoopcode30041
- Python进阶-在Ubuntu上部署Flask应用
随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一。Python作为一种简单易用的编程语言,适用于开发各种应用程序。本文将详细介绍如何在Ubuntu服务器上部署Python应用,包括环境准备、应用发布、配置反向代理(Nginx)、设置系统服务以及日志管理等步骤。一、部署准备在开始之前,请确保你具备以下条件:一台运行Ubuntu(如Ubuntu20.04或22.04
- WebKit 的渲染引擎优化策略
简介:WebKit是一个开源的网页浏览引擎,被广泛应用于多种浏览器,包括Safari和许多移动设备浏览器。其高效的渲染性能和灵活的架构使得WebKit成为现代浏览器开发的重要组成部分。在这篇文章中,我们将深入探讨WebKit在渲染引擎优化方面的策略,尤其关注其在提高页面加载速度和渲染效率方面的技术实现。正文:什么是WebKit?WebKit起源于KHTML和KJS,最初由苹果公司用于Safari浏
- Python网络爬虫入门教程:从抓取数据到应用实现
冷夜雨.
python
引言在大数据时代,信息就是力量。各种网站每天产生着海量的数据,这些数据中蕴藏着巨大的商业价值和研究价值。如何快速、自动化地从互联网上获取这些信息,成为了数据科学、人工智能、市场分析等领域中的一个重要课题。Python,作为一门易于学习且功能强大的编程语言,其丰富的库和工具使得构建网络爬虫变得非常简单。网络爬虫(WebScraper)是一种自动化程序,用来从网页中提取信息。无论是用于数据分析、竞争对
- Vue 开发者的 React 实战指南:路由和导航篇
作为Vue开发者,在迁移到React开发时,路由系统的差异是需要重点关注的部分。本文将从VueRouter的使用经验出发,详细介绍ReactRouter的使用方式和最佳实践。基础路由配置VueRouter配置在Vue中,我们通常这样配置路由://router/index.jsimport{createRouter,createWebHistory}from'vue-router';importHo
- 提升CSS动画学习效率的利器——ScriptEcho
前端
引言在现代网页设计中,CSS动画的重要性不言而喻。它不仅能够为用户提供更为生动的视觉体验,还能有效地吸引用户的注意力。例如,按钮的悬停效果、页面的加载动画等,都是通过CSS动画实现的。然而,尽管CSS动画的应用场景广泛,但对于零基础的学习者来说,学习其中的技巧和知识常常面临挑战。本文将介绍如何通过ScriptEcho这一强大的工具来提升CSS动画的学习效率,让每位学习者都能轻松入门。CSS动画基础
- caddy介绍及安装
dockercaddy
参考文档:https://caddyserver.com一:caddy介绍Caddy是一款现代化的Web服务器,专为简化开发者和运维人员的工作流程而设计。它最大的特点是自动化和易用性,尤其是内置的自动HTTPS功能,使得部署安全的Web服务变得前所未有的简单。相比于传统的Web服务器(如Nginx、Apache),Caddy的目标是通过更简洁的配置、更智能的功能来减少人为出错的可能性,并提升部署效
- js,scss常用的方法
javascriptcss
获取网页参数functiongetExtraDataByKey(key){varparams={},query=window.location.search.substring(1),arr=query.split('&'),rt;if(arr&&Array.isArray(arr)){arr.forEach(function(item,i){vartmp=item.split('='),key=
- Java语言基础 关键字与保留字
鹿人甲丁
javajava
关键字(keyword)的定义和特点定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写官方地址:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html用于定义数据类型的关键字classinterfaceenumbyteshortintlongfloatdoublec
- 双周报Vol.62:更新Trait对象语法、新增local types特性、优化web ide debug...多项技术已更新!
编程语言
2024/12/16MoonBit更新Traitobject语法由原来的直接写Trait变更为&Trait(旧语法已deprecate)。这一改动是为了让traitobject类型和trait本身在语法上区分开,以避免混淆。在所有涉及traitobject的场合,包括类型标注、为traitobject定义方法(fn&Trait::method(...))和创建traitobject(...as&T
- 双周报Vol.62:更新Trait对象语法、新增local types特性、优化web ide debug...多项技术已更新!
编程语言
2024/12/16MoonBit更新Traitobject语法由原来的直接写Trait变更为&Trait(旧语法已deprecate)。这一改动是为了让traitobject类型和trait本身在语法上区分开,以避免混淆。在所有涉及traitobject的场合,包括类型标注、为traitobject定义方法(fn&Trait::method(...))和创建traitobject(...as&T
- 系统设计架构——互联网案例
大猩猩爱分享
java架构
Netflix的技术栈移动和网络:Netflix采用Swift和Kotlin来构建原生移动应用。对于其Web应用程序,它使用React。前端/服务器通信:Netflix使用GraphQL。后端服务:Netflix依赖ZUUL、Eureka、SpringBoot框架和其他技术。数据库:Netflix使用EV缓存、Cassandra、CockroachDB和其他数据库。消息传递/流媒体:Netflix
- 端口 443 与 80:它们有何不同?
httpshttp
您是否知道超过90%的互联网流量通过端口443传输?如果您对网络安全或Web开发感兴趣,那么您可能遇到过不同编号的端口,尤其是端口80和443。但它们之间有什么区别?简而言之,端口80用于HTTP流量,端口443用于HTTPS。我们将重点介绍端口80与443、如何打开它们以及何时可能需要将流量从端口80重定向到443。什么是端口80?端口80是计算机网络上用于网络流量的通信端点。它是超文本传输协议
- Vite VS Webpack,谁才是最强构建工具
ViteVSWebpack,谁才是最强构建工具前言大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。VitevsWebpack:哪个更适合您的项目?随着Web应用的不断发展,对更快、更高效的开发工具的需求也在日益增长。多年来,Webpack一直是复杂应用的首选打包工具,以其强大的功能和广泛的插
- Chrome DevTools 剖析:调试 JavaScript 异常
引言ChromeDevTools是一款功能强大的开发者工具,广泛应用于前端开发,尤其是调试网页和Web应用的JavaScript代码。作为GoogleChrome浏览器的一部分,它为开发者提供了一整套调试、分析和优化网页性能的功能。本文将专注于ChromeDevTools中调试JavaScript异常的功能,并详细介绍如何使用它来有效捕获和解决JavaScript错误。1.JavaScript异常
- 5分钟内理解 .prototype 链 | 2024
CSS技巧与案例详解vue2与vue3技巧合集VueUse源码解读在JavaScript的世界里,原型(prototype)系统是一个常被讨论但不易掌握的概念。作为JavaScript继承模型的基石,理解原型对于构建大型应用或进行对象操作至关重要。让我们一起探索这个迷人的话题,揭开原型系统的神秘面纱。什么是原型?在JavaScript中,每个对象都有一个内部属性[[Prototype]]。这个属性
- Redis缓存
小笨猪-
Redis缓存redis数据库分布式
概念核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅,⽅便随时读取.速度快的设备,可以作为速度慢的设备的缓存(CPU寄存器>内存>硬盘>网络)最常见的是,使用内存作为硬盘的缓存硬盘也可以作为网络的缓存,浏览器的缓存浏览器通过http/https从服务器上获取到数据(html,css,js,图片,视频...),像图片这样体积大,又不太改变的数据,就可以保存到浏览器本地(浏览器所在主机的
- vue学习总结
一、transition和transition-group的区别:transition:针对的是一个元素,比如v-if,v-showtransition-group:针对是多个元素,比如使用v-for二、transition动画过渡的时候什么时候生效?1.v-if2.v-show3.动态组件4.组建根节点三、vue创建项目有两种方法:1.vueinitwebpack项目名称2.vuecreate项
- 实现列表拖拽排序功能,可新增,可删除,拖住排序,draggable,dragstart,dragend,dragover,利用好这几个事件,完美实现拖拽功能
Sherry Tian
javascriptjavascript前端
你好呀,我是爱编程的Sherry,很高兴在这里遇见你!我是一名拥有十多年开发经验的前端工程师。这一路走来,面对困难时也曾感到迷茫,凭借不懈的努力和坚持,重新找到了前进的方向。我的人生格言是——认准方向,坚持不懈,你终将迎来辉煌!欢迎关注我,我将在这里分享工作中积累的经验和心得,希望我的分享能够给你带来帮助。文章目录前言效果展示功能说明新增:删除:拖拽排序:关键点:代码实现html(结构)css(样
- python实现排列组合--itertools
Draina
杂项笔记python开发语言
这是一个python自带的工具集,简单好用功能强大,能够大大提升编写代码效率。功能不止排列组合,其他的用用加深理解了再整理。官方文档:https://docs.python.org/zh-cn/3/library/itertools.html1.1、itertools.permutations()所有可能的排列,元素不可以重复出现,第一个元素是字符集,第二个元素是组合的长度。itertools.p
- JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南
拾荒的小海螺
JAVAjavaspringboot开发语言
1、简述在现代Web开发中,安全性尤为重要。为了确保用户的身份,JSONWebToken(JWT)作为一种轻量级且无状态的身份验证方案,广泛应用于微服务和分布式系统中。本篇博客将讲解如何在SpringBoot中集成JWT实现身份验证,并列出具体代码示例和常见应用场景。2、什么是JWT?JWT是一种开放标准(RFC7519),定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象
- 【原创】【亲测有效】如何实现内网穿透 反向代理工具实操 超级实用 遗憾没早学会
精通代码大仙
协议分布式应用服务器服务器代理模式网络go远程工作网络安全网络协议
高价值使用场景FRP(FastReverseProxy)是一个功能强大的工具,适用于多种网络场景。以下是几个常见、鲜明且有价值的使用案例:远程访问内部服务器:场景:远程工作者需要访问公司内部的数据库或Web服务。解决方案:通过FRP,远程用户可以穿透公司防火墙,访问内部服务,如同在公司内部网络一样。开发和测试Web应用:场景:开发者在本地开发Web应用,并希望向不在同一网络的同事展示。解决方案:使
- 1156 Sexy Primes (20)
圣保罗的大教堂
PAT刷题pat考试
Sexyprimesarepairsofprimesoftheform(p,p+6),so-namedsince"sex"istheLatinwordfor"six".(Quotedfromhttp://mathworld.wolfram.com/SexyPrimes.html)Nowgivenaninteger,youaresupposedtotellifitisasexyprime.Input
- Algorithm
香水浓
javaAlgorithm
冒泡排序
public static void sort(Integer[] param) {
for (int i = param.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
int current = param[j];
int next = param[j + 1];
- mongoDB 复杂查询表达式
开窍的石头
mongodb
1:count
Pg: db.user.find().count();
统计多少条数据
2:不等于$ne
Pg: db.user.find({_id:{$ne:3}},{name:1,sex:1,_id:0});
查询id不等于3的数据。
3:大于$gt $gte(大于等于)
&n
- Jboss Java heap space异常解决方法, jboss OutOfMemoryError : PermGen space
0624chenhong
jvmjboss
转自
http://blog.csdn.net/zou274/article/details/5552630
解决办法:
window->preferences->java->installed jres->edit jre
把default vm arguments 的参数设为-Xms64m -Xmx512m
----------------
- 文件上传 下载 解析 相对路径
不懂事的小屁孩
文件上传
有点坑吧,弄这么一个简单的东西弄了一天多,身边还有大神指导着,网上各种百度着。
下面总结一下遇到的问题:
文件上传,在页面上传的时候,不要想着去操作绝对路径,浏览器会对客户端的信息进行保护,避免用户信息收到攻击。
在上传图片,或者文件时,使用form表单来操作。
前台通过form表单传输一个流到后台,而不是ajax传递参数到后台,代码如下:
<form action=&
- 怎么实现qq空间批量点赞
换个号韩国红果果
qq
纯粹为了好玩!!
逻辑很简单
1 打开浏览器console;输入以下代码。
先上添加赞的代码
var tools={};
//添加所有赞
function init(){
document.body.scrollTop=10000;
setTimeout(function(){document.body.scrollTop=0;},2000);//加
- 判断是否为中文
灵静志远
中文
方法一:
public class Zhidao {
public static void main(String args[]) {
String s = "sdf灭礌 kjl d{';\fdsjlk是";
int n=0;
for(int i=0; i<s.length(); i++) {
n = (int)s.charAt(i);
if((
- 一个电话面试后总结
a-john
面试
今天,接了一个电话面试,对于还是初学者的我来说,紧张了半天。
面试的问题分了层次,对于一类问题,由简到难。自己觉得回答不好的地方作了一下总结:
在谈到集合类的时候,举几个常用的集合类,想都没想,直接说了list,map。
然后对list和map分别举几个类型:
list方面:ArrayList,LinkedList。在谈到他们的区别时,愣住了
- MSSQL中Escape转义的使用
aijuans
MSSQL
IF OBJECT_ID('tempdb..#ABC') is not null
drop table tempdb..#ABC
create table #ABC
(
PATHNAME NVARCHAR(50)
)
insert into #ABC
SELECT N'/ABCDEFGHI'
UNION ALL SELECT N'/ABCDGAFGASASSDFA'
UNION ALL
- 一个简单的存储过程
asialee
mysql存储过程构造数据批量插入
今天要批量的生成一批测试数据,其中中间有部分数据是变化的,本来想写个程序来生成的,后来想到存储过程就可以搞定,所以随手写了一个,记录在此:
DELIMITER $$
DROP PROCEDURE IF EXISTS inse
- annot convert from HomeFragment_1 to Fragment
百合不是茶
android导包错误
创建了几个类继承Fragment, 需要将创建的类存储在ArrayList<Fragment>中; 出现不能将new 出来的对象放到队列中,原因很简单;
创建类时引入包是:import android.app.Fragment;
创建队列和对象时使用的包是:import android.support.v4.ap
- Weblogic10两种修改端口的方法
bijian1013
weblogic端口号配置管理config.xml
一.进入控制台进行修改 1.进入控制台: http://127.0.0.1:7001/console 2.展开左边树菜单 域结构->环境->服务器-->点击AdminServer(管理) &
- mysql 操作指令
征客丶
mysql
一、连接mysql
进入 mysql 的安装目录;
$ bin/mysql -p [host IP 如果是登录本地的mysql 可以不写 -p 直接 -u] -u [userName] -p
输入密码,回车,接连;
二、权限操作[如果你很了解mysql数据库后,你可以直接去修改系统表,然后用 mysql> flush privileges; 指令让权限生效]
1、赋权
mys
- 【Hive一】Hive入门
bit1129
hive
Hive安装与配置
Hive的运行需要依赖于Hadoop,因此需要首先安装Hadoop2.5.2,并且Hive的启动前需要首先启动Hadoop。
Hive安装和配置的步骤
1. 从如下地址下载Hive0.14.0
http://mirror.bit.edu.cn/apache/hive/
2.解压hive,在系统变
- ajax 三种提交请求的方法
BlueSkator
Ajaxjqery
1、ajax 提交请求
$.ajax({
type:"post",
url : "${ctx}/front/Hotel/getAllHotelByAjax.do",
dataType : "json",
success : function(result) {
try {
for(v
- mongodb开发环境下的搭建入门
braveCS
运维
linux下安装mongodb
1)官网下载mongodb-linux-x86_64-rhel62-3.0.4.gz
2)linux 解压
gzip -d mongodb-linux-x86_64-rhel62-3.0.4.gz;
mv mongodb-linux-x86_64-rhel62-3.0.4 mongodb-linux-x86_64-rhel62-
- 编程之美-最短摘要的生成
bylijinnan
java数据结构算法编程之美
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class ShortestAbstract {
/**
* 编程之美 最短摘要的生成
* 扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的ran
- json数据解析及typeof
chengxuyuancsdn
jstypeofjson解析
// json格式
var people='{"authors": [{"firstName": "AAA","lastName": "BBB"},'
+' {"firstName": "CCC&
- 流程系统设计的层次和目标
comsci
设计模式数据结构sql框架脚本
流程系统设计的层次和目标
 
- RMAN List和report 命令
daizj
oraclelistreportrman
LIST 命令
使用RMAN LIST 命令显示有关资料档案库中记录的备份集、代理副本和映像副本的
信息。使用此命令可列出:
• RMAN 资料档案库中状态不是AVAILABLE 的备份和副本
• 可用的且可以用于还原操作的数据文件备份和副本
• 备份集和副本,其中包含指定数据文件列表或指定表空间的备份
• 包含指定名称或范围的所有归档日志备份的备份集和副本
• 由标记、完成时间、可
- 二叉树:红黑树
dieslrae
二叉树
红黑树是一种自平衡的二叉树,它的查找,插入,删除操作时间复杂度皆为O(logN),不会出现普通二叉搜索树在最差情况时时间复杂度会变为O(N)的问题.
红黑树必须遵循红黑规则,规则如下
1、每个节点不是红就是黑。 2、根总是黑的 &
- C语言homework3,7个小题目的代码
dcj3sjt126com
c
1、打印100以内的所有奇数。
# include <stdio.h>
int main(void)
{
int i;
for (i=1; i<=100; i++)
{
if (i%2 != 0)
printf("%d ", i);
}
return 0;
}
2、从键盘上输入10个整数,
- 自定义按钮, 图片在上, 文字在下, 居中显示
dcj3sjt126com
自定义
#import <UIKit/UIKit.h>
@interface MyButton : UIButton
-(void)setFrame:(CGRect)frame ImageName:(NSString*)imageName Target:(id)target Action:(SEL)action Title:(NSString*)title Font:(CGFloa
- MySQL查询语句练习题,测试足够用了
flyvszhb
sqlmysql
http://blog.sina.com.cn/s/blog_767d65530101861c.html
1.创建student和score表
CREATE TABLE student (
id INT(10) NOT NULL UNIQUE PRIMARY KEY ,
name VARCHAR
- 转:MyBatis Generator 详解
happyqing
mybatis
MyBatis Generator 详解
http://blog.csdn.net/isea533/article/details/42102297
MyBatis Generator详解
http://git.oschina.net/free/Mybatis_Utils/blob/master/MybatisGeneator/MybatisGeneator.
- 让程序员少走弯路的14个忠告
jingjing0907
工作计划学习
无论是谁,在刚进入某个领域之时,有再大的雄心壮志也敌不过眼前的迷茫:不知道应该怎么做,不知道应该做什么。下面是一名软件开发人员所学到的经验,希望能对大家有所帮助
1.不要害怕在工作中学习。
只要有电脑,就可以通过电子阅读器阅读报纸和大多数书籍。如果你只是做好自己的本职工作以及分配的任务,那是学不到很多东西的。如果你盲目地要求更多的工作,也是不可能提升自己的。放
- nginx和NetScaler区别
流浪鱼
nginx
NetScaler是一个完整的包含操作系统和应用交付功能的产品,Nginx并不包含操作系统,在处理连接方面,需要依赖于操作系统,所以在并发连接数方面和防DoS攻击方面,Nginx不具备优势。
2.易用性方面差别也比较大。Nginx对管理员的水平要求比较高,参数比较多,不确定性给运营带来隐患。在NetScaler常见的配置如健康检查,HA等,在Nginx上的配置的实现相对复杂。
3.策略灵活度方
- 第11章 动画效果(下)
onestopweb
动画
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
- FAQ - SAP BW BO roadmap
blueoxygen
BOBW
http://www.sdn.sap.com/irj/boc/business-objects-for-sap-faq
Besides, I care that how to integrate tightly.
By the way, for BW consultants, please just focus on Query Designer which i
- 关于java堆内存溢出的几种情况
tomcat_oracle
javajvmjdkthread
【情况一】:
java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决: <jvm-arg>-Xms3062m</jvm-arg> <jvm-arg>-Xmx
- Manifest.permission_group权限组
阿尔萨斯
Permission
结构
继承关系
public static final class Manifest.permission_group extends Object
java.lang.Object
android. Manifest.permission_group 常量
ACCOUNTS 直接通过统计管理器访问管理的统计
COST_MONEY可以用来让用户花钱但不需要通过与他们直接牵涉的权限
D