Chrome高阶调试指南 - 知乎

mikel阅读(648)

来源: Chrome高阶调试指南 – 知乎

  • 调试 JavaScript
    • Preserve Log
    • 代码断点与单步执行
    • Debugger
    • Event Listener Breakpoin & 屏蔽无用 log
    • 提取断点内变量值
    • 调试 Immutable.js
    • 彩色 log
    • 输出 log 时添加时间戳
    • JS 执行计时
    • clear & filter
  • 调试元素
    • 设备模拟
    • 远程调试
    • 远程调试微信页面
    • 模拟元素状态
  • 性能分析
    • disable cache
    • 模拟弱网条件 & 录制屏幕
    • 调试动画
  • 神奇功能
    • 密码找回
    • source map 抓源码
    • Copy as Curl
  • 扩展资料

调试 JavaScript

Preserve Log

调试页面的时候经常会遇到页面跳转, 跳转完之后 Console & Network 面板里记录全部清空, 这在页面上存在 302 跳转时会很恶心.

不过 Chrome 提供 Preserve Log 选项, 勾上这个, 只要不关页面, 记录就可以永久保存

代码断点与单步执行

Debugger

除了手工加断点, 在源代码中加入debugger, 也可以起到断点的效果

注意: debugger 只能在本地测试的时候加, 线上要是有 debugger 的话用户的 js 就执行不了了

Event Listener Breakpoin & 屏蔽无用 log

或者, 也可以按事件去加

同样, 如果某些库绑了太多无用代码, 你可以选择屏蔽这整个库. 比如, 把这个库加到 黑盒 里, 黑盒里 js 的执行过程不会被显示出来, 略有用

demo =>

动图封面

提取断点内变量值

调试过程中有可能会需要将一些变量值保存下来, 这时候只要在想要保存的变量上点击右键, 选择Store as global variable, 就可以在Console面板里使用这个变量(temp1, temp2, temp3, …)

调试 Immutable.js

虽然将变量保存了下来, 但如果调试的是 Immutable.js, 打印出来的 Immutable 对象其实会很难看.

解决办法也简单, F12 打开开发者工具, 然后 F1 打开开发者工具的设置, 勾选Preference->Console -> Enable Customer Formatters

然后点击安装Immutable.js Object Formatter插件

重启一下控制台, 再打印一下 Immutable 对象看看?

彩色 log

Immutable 的原理是利用了 console.log API, console.log 实际上是支持在打印结果中添加 css 效果的

示例:

console.log(
  "%c    ",
  "padding:10% 50%background:ur('http://stcms.beisen.com/CmsPortal/107965/107965_mdias_2018514_2018514logo.png') no-repeatbackground-position:center center"
);
console.log(
  "确认过眼神,你就是对的人\n来到链家,你可以尽发挥自己的特长\n来到链家,你可以不断提高自己的技术\n加入家,加入贝壳,成就房产行业新的巅峰"
);
console.log(
  "请将简历发送至 %c guliming@lianjia.com(邮件标题请以“姓名-应聘XX职位-来自console”命名)",
  "color:red"
);
console.log(
  "%c前端,PHP,QA等等各个岗位各个级别都有在哦,期待你的加入!",
  "color:red"
);
console.log("职位介绍:http://join.lianjia.com/");

效果 =>

参考 => Chrome 开发者文档文档

输出 log 时添加时间戳

log 除了打印消息, 还有一个用途是拿来检测页面性能. 比如开发 React Native 时, 我们可以通过 Android Studio 输出的日志时间戳来判断 JS 的执行情况

其实这个功能 Chrome 也可以做到, 还是 F1 打开开发者工具设置, 勾选Preference->Console -> Show Timestamps

再看看日志, 是不是以后优化页面加载性能, 查看 js 执行瓶颈的时候就方便多了

JS 执行计时

说到 JS 执行计时, 其实不太需要看 log 日志, 看下边的动图就够了

动图封面

clear & filter

Console 面板里执行 clear() 清屏, 在 filter 中输入关键字可以按条件过滤日志, 选项里有一条 Preserve Log, 选中之后只要不关 DevTool, 即使页面刷新也不会清空日志, 勾选之后调试带 302 跳转的页面特别方便

调试元素

设备模拟

在大多数情况下, 网页/后端都是通过 UA 来判断设备类型的, 所以我们只要将 UA & 分辨率改成和移动端一样, 再把点击鼠标事件从 click 改成 touch, 就可以直接在浏览器里调试移动端页面

如果想要模拟 App 操作的话, 只要选择 Edit, 添加上 App 的 UA 就可以了(具体值用 Charles 抓)

一般来说靠这两步就可以解决 99%的移动端调试问题, 但是谷歌显然还觉得不够, 如果你想了解进一步模拟 DPI 修改, 媒体查询检测等功能的话, 在这里可以看到谷歌官方的说明(当然是汉语)

远程调试

当然, 模拟归模拟, 谷歌表示有些移动端的功能实在模拟不了(iOS7 不支持 WebGL, iOS 5 的方向缩放有 bug, etc). 所以 Chrome 也提供了远程调试功能.可以让我们在电脑上直接调试 App 内的网页.

方法如下:

  1. App 启用 WebView 调试模式(一般的测试包都支持, 这里以 Chrome 为例)
  2. 手机启用开发者模式, 打开 USB 调试开关
  3. 电脑装驱动(Windows), 然后用 USB 线把手机连到电脑上
  4. 在 Chrome 上打开 inspect/, 找到 App 内的页面, 点击 inspect, over

效果 =>

然后就跟正常调试页面一样了, 想打断点打断点, 想看 log 看 log, 比用 Charles 把线上 js 替换成本地 js, 然后一个一个的写 alert 效率高多了

详细说明见官方文档

PS 一句, iOS 下也可以这么干, 除了要用 Safari 而不是 Chrome 调试外, 其他地方都一样

远程调试微信页面

和 Chrome 远程调试一样, 微信也支持远程调试功能, 只是需要手工开启一下

  1. 微信内访问debugx5.qq.com/, 或者直接扫描二维码
  1. 如果是首次使用需要先装线上 TBS 内核
  1. 然后打开debugx5.qq.com/, 勾选 信息-TBS Setting- 打开 TBS 内核 inspect 调试功能
  2. 剩下的和 Chrome 远程调试一样, 折腾完打开inspect/, 完毕

模拟元素状态

讲完远程调试, 就可以讲讲检查元素的具体办法. 有时候我们会为元素的 hover 设置一个样式, 但是调试的时候只有把鼠标移上去才能看见样式, 很麻烦.

Chrome 里可以直接模拟这种状态

:hov 中可以模拟各种伪类, .cls 中可以为元素动态添加/删除 class

性能分析

disable cache

刷新页面的时候, 如果想访问到最新的资源(或者模拟初次打开页面), 除了使用隐身模式外, 还可以直接勾上disable cache这项, 效果一样

模拟弱网条件 & 录制屏幕

Chrome 还允许模拟 2G/3G 等弱网环境, 而且为了方便调试, 还提供了录屏功能, 可以录制页面的整个加载过程, 方便检查分析

调试动画

和 Network 一样, 动画也提供了录屏, 模拟移动端 CPU 效果(主动降速), 分析动画成分功能

神奇功能

密码找回

浏览器里我们看到的密码都是打过马赛克的, 解码的方式也很简单—-只要把 input 的 type 类型从 password 随便改成其他值, 就可以看见我们输入的密码

源代码下载

有些公司安全意识不强, 代码发布上线的时候还是 debug 版本(知乎), 甚至连 source map 都带上了. 如果是 debug 版本, 我们可以用 React/Vue 开发者工具查看他们的页面结构, 如果是 source map 都有的话, 加个插件, 可以直接还原出页面的源码 => 点我看原理

Copy as Curl

如果要在命令行中模拟 Http 操作的话, 可以直接在 NetWork 面板中点右键, 这在手工抓接口数据的时候比较有用

扩展资料

苹果CMS自动定时采集_兮动人的博客-CSDN博客

mikel阅读(419)

来源: (2条消息) 苹果CMS自动定时采集教程_苹果cms自动采集_兮动人的博客-CSDN博客

进入苹果CMS10后台,点击–采集

在采集页面,点击左侧 自定义资源库,鼠标右键点击需要采集的内容,如 采集当天、采集本周 、采集所有,右键选择复制链接地址。

复制链接地址后台选择 系统–定时任务,选择添加,添加一个定时任务。

状态选为: 启用,名称和备注:可任写,附加参数:粘贴刚刚复制的链接,执行周期和执行时间的设置点击下面的全选按钮即可。

找到刚才设置的任务后鼠标右键测试复制链接地址

复制刚才的链接进入宝塔后台界面找到计划任务,按照图片所示添加任务,注意url地址填写刚复制的测试采集页面的地址,选择访问URL任务,按自己的需求填写执行周期参数后保存。

最后,点击执行后,网站即可实现自动定时采集,相关过程可在日志中进行查看。一个完整的定时采集任务也已设置完成。

————————————————
版权声明:本文为CSDN博主「兮动人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41684621/article/details/119459887

友价商城SQL注入 - 卿先生 - 博客园

mikel阅读(446)

来源: 友价商城SQL注入 – 卿先生 – 博客园

友价商城SQL注入

 源码出自:https://www.0766city.com/yuanma/9990.html

 

 

下载安装好后打开是这样的:

 

 

8不说了 ,seay审计一把梭哈

 

 

从开始审计 直到这处疑似有注入的地方:

文件地址:/config/return.php

 

 

 

点进去查看代码

 

 

 

可以看到一个$aid变量被带入数据库查询语句,我们跟踪这个变量的来源,看看是否做了什么过滤操作。

 

 

而这里这里发现是函数returntype的一个形参,我们跟踪这个returntype函数,看看在哪里调用了这个函数

 

 

 

可以看到很多处,我们得一处一处去审计

 

直到发现这处

 

 

 

 

在/tem/protype2.php有个调用returntype函数的地方

跟进/tem/protype2.php

 

 

 

发现用$type1name这个变量接收returntype函数的返回值,而我们这个$aid那个形参也就是程序这里传入的$_GET[type1lid],我们关注这个参数,

 

 

 

 

可以看到没有经过任何过滤,造成SQL注入

 

 

 

复现:

 

注入漏洞文件地址:tem/protype2.php

注入参数:type1id

 

 

 

 

 

.net core使用CSRedisCore访问Redis主从+哨兵_.net core csredis_sundna的博客-CSDN博客

mikel阅读(500)

来源: .net core使用CSRedisCore访问Redis主从+哨兵_.net core csredis_sundna的博客-CSDN博客

本文主要目的是对Redis主从+哨兵的高可用方案进行实验,文中使用的技术不进行深入说明,想深入了解的可自行百度。

用到的软件和版本:

CSRedisCore版本:3.0.6.2 (https://github.com/2881099/csredis)
Redis版本:3.2.100 (windows)

1. 下载Redis安装包
本示例使用Windows10搭建Redis环境,Windows下的Redis下载方式如下

打开网址 https://github.com/microsoftarchive/redis/releases,下载3.2.100的压缩包

 

2. 搭建Redis主从集群
将压缩包解压然后复制,总共3份,我们搭建1主2从模式,Redis6379(主),Redis6479(从),Redis6579(从)

 

主Redis配置,进入Redis6379目录中,配置 redis.windows.conf

#配置IP绑定
bind 0.0.0.0
#配置端口
port 6379
#是否保护模式
protected-mode no
为了方便运行,目录下加个run.bat文件

redis-server redis.windows.conf
从Redis配置,分别进入Redis6479和Redis6579目录,配置redis.windows.conf,并添加run.bat文件

#配置IP绑定
bind 0.0.0.0
#配置端口,分别配置6479和6579
port 6479
#是否保护模式
protected-mode no
#配置主redisd的IP和端口
slaveof 192.168.1.5 6379
现在Redis配置好了,运行3个Redis目录中的run.bat启动服务,运行后可以看到主从都成功连接。

 

3.搭建哨兵
实际使用中一般会使用多个哨兵进行监控,本文作了简化,只使用1个哨兵,多个哨兵都是相同的配置,仅区分端口。

将Redis目录复制一份命名为RedisSentinel,添加sentinel.conf文件,内容如下:

port 27000 #哨兵运行端口
protected-mode no #非保护模式运行
#监控的主Redis的IP和端口,1表示1个哨兵
sentinel monitor redis-master 192.168.1.5 6379 1
#主机掉线以后5s进行认证,如果无法连接则重新由哨兵从slave中选出新的master
sentinel down-after-milliseconds redis-master 5000
sentinel failover-timeout redis-master 60000
CMD中通过命令运行哨兵

redis-server sentinel.conf –sentinel
可以看到哨兵已经发现1主2从并开始监听了

 

也可通过命令查看哨兵状态

redis-cli -p 27000 info sentinel

4. .NET Core中使用Redis集群
我们使用CSRedisCore来访问Redis,CSRedisCore是国内大牛开发的一个.net core redis 组件,源码可读性很强非常干净,几乎无任何依赖。性能相比ServiceStack.Redis和StackExchange.Redis会快10%左右,支持Redis的高级特性:订阅/发布,Pipeline,MGet/MSet,集群,分区。

创建一个.net core 控制台程序,然后添加nuget包

nuget Install-Package CSRedisCore
Program.cs代码

using System;
using System.Threading;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//连接哨兵
var csredis = new CSRedis.CSRedisClient(“redis-master”, new[] {“127.0.0.1:27000” });

//初始化 RedisHelper
RedisHelper.Initialization(csredis);

while (true)
{
try
{
Test();
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
Console.ReadKey();
}

static void Test()
{
RedisHelper.Set(“name”, “祝雷”);//设置值。默认永不过期
Console.WriteLine(RedisHelper.Get<String>(“name”));

RedisHelper.Set(“time”, DateTime.Now, 1);
Console.WriteLine(RedisHelper.Get<DateTime>(“time”));
Console.WriteLine(RedisHelper.Get<DateTime>(“time”));

// 列表
RedisHelper.RPush(“list”, “第一个元素”);
RedisHelper.RPush(“list”, “第二个元素”);
RedisHelper.LInsertBefore(“list”, “第二个元素”, “我是新插入的第二个元素!”);
Console.WriteLine($”list的长度为{RedisHelper.LLen(“list”)}”);
Console.WriteLine($”list的第二个元素为{RedisHelper.LIndex(“list”, 1)}”);
}
}
}
模拟故障进行测试,启动程序后,杀死主Redis进程,.net core程序再次访问Redis会出现一次异常检查,然后能正常切换到新的master上。

————————————————
版权声明:本文为CSDN博主「sundna」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sundna/article/details/94133931

自学如何训练/调教一个私人ChatGPT - 知乎

mikel阅读(861)

来源: 自学如何训练/调教一个私人ChatGPT – 知乎

每周更新一丢丢~欢迎大佬来指正

训练步骤

训练一个个人化的GPT模型大概可以分为以下几个步骤:

  1. 数据收集:收集与个人领域相关的数据,这些数据应该足够多且多样化。数据集应该是和你的应用场景相关的,例如针对特定的领域或者任务。
  2. 数据清理和预处理:将数据进行清理,去除噪声和冗余,统一数据格式,进行标记和编码等预处理。
  3. 模型选择:选择一个基础的GPT模型,可以选择已经公开的预训练模型,也可以选择自己训练的模型(如果你有大量的计算资源和时间,同时学习过TensorFlow或PyTorch等深度学习框架)。
  4. 微调模型:将收集到的个人数据和已经训练好的GPT模型进行微调,让模型更好地适应个人领域。
  5. 模型测试和优化:通过测试来评估模型的性能,并进行优化,提高模型的准确性和效率。
  6. 部署:将训练好的模型部署到生产环境中,供用户使用。

可以用的预训练模型

目前已经公开的预训练模型有很多,其中比较常用的包括:

  • GPT-2
  • GPT-3
  • BERT
  • RoBERTa
  • T5
  • XLNet

这些模型都具有一定的训练难度,但可以根据具体需求和场景选择适合的模型。其中

  • GPT-2是比较经典的模型之一,训练难度相对较小,但是效果也不错。
  • GPT-3则是当前最为先进的预训练模型之一,拥有极高的自然语言处理能力,但是训练难度较大,需要较高的计算资源和数据量。
  • BERT和RoBERTa则主要应用于文本分类、问答等任务,效果也比较不错。
  • T5则可以用于各种NLP任务的生成式模型,可以生成文本、代码等。
  • XLNet是一种比较新的预训练模型,在许多NLP任务上都表现出色,尤其是在涉及长序列、多文档或多轮对话的任务中。例如,XLNet在阅读理解、文本分类、序列标注和生成任务等方面表现出色。此外,XLNet还可以在多语言和跨语言任务中应用,因为它可以处理多种语言之间的语言交叉性。

电脑小白可不可以训练?

没问题!

但需要先学习一些基础的编程和机器学习知识,以便更好地理解和使用GPT-2预训练模型。

训练GPT-2预训练模型必须的编程知识主要包括以下几个方面:
1. Python编程语言:GPT-2是使用Python编写的,因此需要掌握Python编程语言基础知识,如变量、函数、数据类型、流程控制等。
2. 深度学习框架:训练GPT-2需要使用深度学习框架,如TensorFlow、PyTorch等。需要掌握框架的基本概念、模型构建、模型训练和模型调优等。
3. 自然语言处理:GPT-2是基于自然语言处理技术的深度学习模型,需要掌握自然语言处理基础知识,如文本处理、分词、词向量、语言模型等。
4. 计算机硬件和操作系统:GPT-2训练需要大量计算资源,需要了解计算机硬件配置和操作系统的基础知识,如CPU、GPU、内存、磁盘、Linux操作系统等。
5. 数据处理和存储:训练GPT-2需要处理大量的数据,需要掌握数据处理和存储的基本知识,如数据清洗、数据抽取、数据存储等。
6. 数学基础:深度学习是一种数学模型,需要掌握一些数学基础知识,如线性代数、微积分、概率论等。

关于如何使用GPT-2预训练模型,以下是一些基本的步骤:

  1. 下载预训练模型:可以从Hugging Face等网站下载预训练模型。
  2. 安装必要的库:需要安装Python、PyTorch等库来加载模型。
  3. 加载模型:使用Python代码加载预训练模型。
  4. 输入数据:将要生成文本的前缀输入到模型中。
  5. 生成文本:使用模型生成新的文本。

编程小白如何起步

如果你是零基础,建议你先学习一些基础编程知识,例如 Python 编程语言、命令行操作、基本的数据结构和算法等等。可以通过一些在线课程、教材或者学习网站来学习这些知识。

对于训练 GPT-2 预训练模型,你需要学习深度学习的基本概念和技术,包括神经网络、反向传播算法、优化器、损失函数等等。同时,你还需要了解自然语言处理领域的相关知识,例如文本预处理、语言模型等等。

一些经验丰富的数据科学家或者研究人员会建议你先从预训练模型的 fine-tuning 开始,这个过程不需要你自己训练一个完整的预训练模型,而是使用已经训练好的模型来完成一个特定的任务,例如文本分类或者生成文本等等。在这个过程中,你可以了解到如何调整模型参数、如何构建输入数据和输出数据等等技术细节。这也是一个更加容易入门的方法。

笔记本电脑可以训练吗?

可以的,尽管性能不会那么好,但够用了。

个人笔记本电脑可以尝试:

  1. 使用小型的语言模型来微调
  2. 使用预训练的模型,如GPT-2或BERT,并将其微调到特定任务中。在微调模型之前,还需要准备好相应的数据集,并决定如何设置模型的超参数。为了获得更好的微调效果,建议使用一些技巧,如数据增强和模型融合。

预训练模型的内存大小会因不同的模型规模而有所不同。以GPT-2模型为例,它的规模包括117M、345M、774M、1558M、3450M等不同大小的模型。其中,117M的模型需要约0.5GB的内存,而3450M的模型需要约17GB的内存。

电脑系统有影响吗?

使用哪种操作系统并不会直接影响使用GPT-2等预训练模型的能力。预训练模型可以在Windows和macOS上运行,但是在选择操作系统时,可能需要考虑以下因素:

  1. 设备性能:无论选择哪种操作系统,电脑都需要具备足够的处理能力和存储空间来运行预训练模型。
  2. 软件支持:在使用预训练模型时,需要安装Python、TensorFlow或PyTorch等软件。这些软件都可以在Windows和macOS上运行,但是可能需要查看它们在不同操作系统上的安装和配置方式。
  3. 开发环境:如果打算进行模型微调和训练,可能需要选择一个操作系统来搭建开发环境。例如,如果打算使用Docker容器运行模型,需要选择支持Docker的操作系统。

总之,选择操作系统主要取决于个人的需求和偏好,不会直接影响使用预训练模型的能力。

无需GPU无需网络“本地部署chatGPT”(更新中文模型)_Pangaroo的博客-CSDN博客

mikel阅读(743)

来源: 无需GPU无需网络“本地部署chatGPT”(更新中文模型)_Pangaroo的博客-CSDN博客

想当初图像生成从DELL到stable diffusion再到苹果的移动部署过了两三年吧
聊天bot才发展几个月就可以边缘部署了,如果苹果更新silicon,npu和运存翻倍,争取apple watch也能本地内置,最快ios18 mac、ipad、iPhone能内置吧
又是一个平民百姓都高兴的开源项目,chatGPT这种级别的模型甚至能部署到树莓派上运行,然后在操作的过程中也遇到一些问题,这篇就是记录步数的这个过程。
最近github那边更新了,我踩坑遇到的问题已经不痛用了,但我暂时又没时间研究这个,干脆好人做到底,把未更新的代码贴在下面。
已经为最新版的github更新了(2023.4.7),可以放心食用,不用下载下面的老代码链接了。

链接: https://pan.baidu.com/s/1J9FBxSDhmBcqAnHx3rGhEQ 提取码: q5xv
–来自百度网盘超级会员v6的分享
然后配合下面的模型百度云链接,大家应该就可以自己搭建语言模型了。

大佬的网址:https://github.com/ggerganov/llama.cpp

下载及生成
打开命令行输入下面的指令

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make

#对于Windows和CMake,使用下面的方法构建:
cd <path_to_llama_folder>
mkdir build
cd build
cmake ..
cmake –build . –config Release
1
2
3
4
5
6
7
8
9
10

模型下载
我觉得模型下载是最麻烦的,还好有别人给了

git clone https://huggingface.co/nyanko7/LLaMA-7B
1
好吧我直接给百度云
链接: https://pan.baidu.com/s/1ZC2SCG9X8jZ-GysavQl29Q 提取码: 4ret
–来自百度网盘超级会员v6的分享

 

然后安装python依赖,然后转换模型到FP16格式。然后第一个小bug会出现。

python3 -m pip install torch numpy sentencepiece

# convert the 7B model to ggml FP16 format
python3 convert-pth-to-ggml.py models/7B/ 1
1
2
3
4

他会报找不到文件。

打开convert-pth-to-ggml.py文件,修改”/tokenizer.model”的路径,再运行python3 convert-pth-to-gaml.py ./models/7B 1,我顺便名字也改了。

文件找到了,然后出现第二个bug。。。。。

我一开始找不出问题,后来对比原网址和7B文件夹里的文件,才发现文件大小根本都不一样,我说几十个G的东西怎么git这么。
打开网站下图这个网址,点红色框的那两个下载。替换掉7B文件夹里的那两个文件。

 

将模型再转换成4位格式

# quantize the model to 4-bits
./quantize ./models/7B/ggml-model-f16.bin ./models/7B/ggml-model-q4_0.bin 2
1
2

推理
# run the inference
./main -m ./models/7B/ggml-model-q4_0.bin -n 128
1
2

想和chatGPT一样对话的话用下面这个指令,-n 控制回复生成的最大长度, –color是区分ai和人类的颜色,-i 作为参数在交互模式下运行, -r 是一种反向提示,-f 是一整段提示, –repeat_penalty 控制生成回复中对重复文本的惩罚力度,–temp 温度系数,值越低回复的随机性越小,反之越大。
更新了之后速度快了很多。

./main -m ./models/7B/ggml-model-q4_0.bin -n 256 –repeat_penalty 1.0 –color -i -r “User:” -f prompts/chat-with-bob.txt
1
让我们打开prompts/chat-with-bob.txt来看一下。

我们可以看到这相当于给了ai模型一个场景话题,然后你和ai之间就可以接着这个话题聊天。

我英文名叫zale,然后我把这个机器人叫作kangaroo,这样的身份和他聊天,你可以按自己的喜欢自己修改下面的代码。

./main -m ./models/7B/ggml-model-q4_0.bin -n 256 –repeat_penalty 1.0 –color -i -r “Zale:” \
1
写一个txt文件

“Transcript of a dialog, where the Zale interacts with an Assistant named Kangaroo. Kangaroo is helpful, kind, honest, good at writing, and never fails to answer the Zale’s requests immediately and with precision.

Zale: Hello, Kangaroo.
Kangaroo: Hello. How may I help you today?
Zale: Please tell me the largest city in Europe.
Kangaroo: Sure. The largest city in Europe is Moscow, the capital of Russia.
Zale:”

1
2
3
4
5
6
7
8

有点呆呆的,不过也算边缘部署的巨大进步了!
一个蛮有意思的发现,明明看得懂中文却跟我说不懂中文。。。。。

分享一段有意思的对话

中文部署
哈工大的github
https://github.com/ymcui/Chinese-LLaMA-Alpaca

git clone https://github.com/ymcui/Chinese-LLaMA-Alpaca.git
1
下载中文模型,但这不是llama.cpp要输入的模型,官方的说明是llama的中文补丁模型,需要和原版的llama/alpaca模型合并才能使用。

安装依赖

pip install git+https://github.com/huggingface/transformers
pip install sentencepiece
pip install peft
1
2
3
为了方便起见,我把llama原文件也放到了这里

还有一些注意事项

查看sha256,每个平台查看方式略微不同,可以上网搜一下如何查看sha256

整理一下llama原文件的路径

我是将transformers下载到conda里了,路径有点长。你就是找到你的convert_llama_weights_to_hf.py文件的路径就好。

python /Users/kangaroo/miniconda3/envs/pytorch/lib/python3.10/site-packages/transformers/models/llama/convert_llama_weights_to_hf.py \
–input_dir ./llama_7b \
–model_size 7B \
–output_dir ./llama_hf
1
2
3
4

合并模型

python scripts/merge_llama_with_chinese_lora.py \
–base_model ./llama_hf \
–lora_model ./chinese_llama_lora_7b \
–output_dir ./cn_llama
1
2
3
4

再把这个文件夹复制到llama.cpp/models 中

回到llama.cpp里重新量化

python convert-pth-to-ggml.py models/cn_llama/ 1

./quantize ./models/cn_llama/ggml-model-f16.bin ./models/cn_llama/ggml-model-q4_0.bin 2
1
2
3
有点话痨,我直接掐掉了,之后再看看

./main -m ./models/cn_llama/ggml-model-q4_0.bin -n 48 –repeat_penalty 1.0 –color -i -r “Zale:” -f prompts/chat-with-zale.txt
1

./main -m models/cn_llama/ggml-model-q4_0.bin –color -f ./prompts/alpaca.txt -ins -c 2048 –temp 0.2 -n 256 –repeat_penalty 1.3
1

————————————————
版权声明:本文为CSDN博主「Pangaroo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45569617/article/details/129553293

JavaScript 对象与 JSON 对象的相互转换_js json转换_latency_cheng的博客-CSDN博客

mikel阅读(452)

来源: JavaScript 对象与 JSON 对象的相互转换_js json转换_latency_cheng的博客-CSDN博客

一、全局JSON对象
ES5定义了全局对象JSON,对解析JSON的行为制定了规范。
JSON对象有两个方法:stringify() 和 parse()。

二、JavaScript 对象序列化为 JSON对象
JSON.stringify( js对象 [, 过滤器] [, 选项])
二三参数可选,js对象中的函数和原型成员将被忽略,值为undefined的属性也被跳过。
默认情况下,返回的JSON不包含任何空格字符和缩进。
var book = {
title: “Professional JavaScript”,
authors: [“Nicholas C. Zakas”],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book);

过滤器为数组:JSON.stingify() 的结果只包含数组中列出的属性。
var book = {
title: “Professional JavaScript”,
authors: [“Nicholas C. Zakas”],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book, [“title”, “edition”]);
jsonText的值为 {“title”: “Professional JavaScript”, “edition”: 3}

过滤器为函数:函数接收两个参数,键名和值(key, value)。函数体中根据键名处理对应的值。
var book = {
title: “Professional JavaScript”,
authors: [“Nicholas C. Zakas”],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book, function(key, value){
switch(key){
case “authors”:
return value.join(“,”)
case “year”:
return 5000;
case “edition”:
return undefined;
default:
return value;
}
});
序列化后的 jsonText 值为:{“title”: “Professional JavaScript”, “authors”: “Nicholas C. Zakas”, “year”: 5000}

第三个参数用于控制结果的缩进:
参数为数值 —– 表示缩进的空格数。
var book = {
title: “Professional JavaScript”,
authors: [“Nicholas C. Zakas”],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book, null, 4);
jsonText 中的字符串:
{
“title”: “Professional JavaScript”,
“authors”: [
“Nicholas C. Zakas”
],
“edition”: 3,
“year”: 2011
}

参数为字符串 —– 表示使用该字符串进行缩进。
var book = {
title: “Professional JavaScript”,
authors: [“Nicholas C. Zakas”],
edition: 3,
year: 2011
};

var jsonText = JSON.stringify(book, null, ” – -“);
jsonText 中的字符串:
{
–“title”: “Professional JavaScript”,
–“authors”: [
—-“Nicholas C. Zakas”
–],
–“edition”: 3,
–“year”: 2011
}

(还可以为对象定义 toJSON() 方法,实现对其进行自定义序列化的需求。)

三、JSON对象解析为 JavaScript 对象
JSON.parse(json对象 [, 还原函数])
还原参数接收两个参数,键和值。如果返回undefined,则表示从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。
var book = {
title: “Professional JavaScript”,
authors: [“Nicholas C. Zakas”],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1)
};

var jsonText = JSON.stringify(book);
var bookCopy = JSON.parse(jsonText, function(key, value){
if (key == “releaseDate”){
return new Date(value);
} else {
return value;
}
});
————————————————
版权声明:本文为CSDN博主「latency_cheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/latency_cheng/article/details/73468205

SQLServer数据库中常用的3种分页查询方法

mikel阅读(628)

SQLServer中,常用的分页查询有以下几种:

  1. 使用OFFSET-FETCH语句:该语句从指定偏移量开始返回指定行数的结果集。

例如:

SELECT *

FROM table_name

ORDER BY column_name

OFFSET 10 ROWS

FETCH NEXT 5 ROWS ONLY;

这将从第11行开始返回5行结果集。

注意:这种方法对SQLServer版本有要求,需要SQLServer2012以后的版本才支持

2、使用ROW_NUMBER()函数:该函数为结果集中的每一行分配一个行号,然后可以根据行号进行分页。

例如:

WITH CTE AS (

  SELECT *, ROW_NUMBER() OVER (ORDER BY column_name) AS RowNum

  FROM table_name

)

SELECT *

FROM CTE

WHERE RowNum BETWEEN 11 AND 15; 这将返回第11行到第15行之间的结果集。

3、使用TOP语句和子查询:该方法可以通过子查询返回指定行数的结果集,然后使用TOP语句从子查询中选择前N行。

例如:

SELECT TOP 5 *

FROM (

  SELECT *, ROW_NUMBER() OVER (ORDER BY column_name) AS RowNum

  FROM table_name

) AS subquery

WHERE RowNum > 10;

这将返回第11行到第15行之间的结果集。

需要注意的是,在处理大量数据时,分页查询可能会影响性能。因此,可以考虑使用其他技术来优化查询。例如,可以使用索引或缓存数据以提高性能。

另外,还可以使用存储过程或视图来实现分页查询。存储过程是一组预定义的SQL语句,可以在需要时执行。视图是一种虚拟表,可以从一个或多个表中检索数据。以下是使用存储过程和视图实现分页查询的示例:

使用存储过程:该方法可以将分页查询逻辑封装在存储过程中,然后可以轻松地调用该存储过程以进行分页查询。例如:

CREATE PROCEDURE GetPageResults

  @PageNumber INT,

  @PageSize INT

AS

BEGIN

  SELECT *

  FROM table_name

  ORDER BY column_name

  OFFSET (@PageNumber – 1) * @PageSize ROWS

  FETCH NEXT @PageSize ROWS  ONLY;

END; 

 然后可以使用以下语句调用存储过程:

EXEC GetPageResults @PageNumber = 2, @PageSize = 5;

这将返回第6行到第10行之间的结果集。

使用视图:该方法可以创建一个虚拟表来存储所有数据,然后可以使用分页查询从该视图中检索数据。例如:

CREATE VIEW vw_table_name AS

SELECT *, ROW_NUMBER() OVER (ORDER BY column_name) AS RowNum

FROM table_name;

然后可以使用以下语句进行分页查询:

SELECT *

FROM vw_table_name

WHERE RowNum BETWEEN 11 AND 15;

这将返回第11行到第15行之间的结果集。

需要注意的是,在使用存储过程或视图时,需要考虑安全性和性能。

存储过程可以提高查询性能并减少SQL注入攻击的风险,但需要更多的开发和管理工作。视图可以提供简单的查询和安全性,但可能会影响性能。决定使用哪种方法取决于具体情况,需要根据实际需要进行权衡。

最后,需要注意的是,以上分页查询示例可能需要根据具体情况进行修改。例如,需要根据实际列名和表名来替换相应的名称。同时需要根据具体需求调整分页查询的参数,如每页显示的行数、需要显示的页码等。

此外,还需要注意以下几个问题:

数据库引擎版本:不同版本的SQL Server可能支持不同的分页查询语法和特性。因此,在编写分页查询语句时,需要考虑数据库引擎的版本。

查询复杂度:如果查询涉及多个表、多个条件或计算密集型操作,可能需要采用优化技术来提高查询性能。例如,可以使用索引、查询优化器或缓存数据等技术。

数据库结构:数据库结构对查询性能和分页查询的实现方式也有很大影响。例如,如果表中没有主键或排序字段,则可能需要采用其他技术来实现分页查询。

数据库访问权限:在实际应用中,需要根据不同的用户角色和权限来限制对数据库的访问和查询。因此,在编写分页查询语句时,需要考虑用户权限和安全性问题。

并发访问:在高并发环境下,多个用户同时访问数据库可能会导致性能问题。因此,在编写分页查询语句时,需要考虑并发访问的情况,并采用适当的技术来避免或减少性能问题。

综上所述,SQL Server提供了多种分页查询语法和技术,开发人员可以根据具体情况选择适当的方法来实现分页查询。同时,需要考虑数据库

引擎版本、查询复杂度、数据库结构、数据库访问权限和并发访问等因素,以确保查询性能和安全性。

ChatGPT 本地部署及搭建_孟郎郎的博客-CSDN博客

mikel阅读(1169)

来源: (1条消息) ChatGPT 本地部署及搭建_孟郎郎的博客-CSDN博客

这篇简要说下清华开源项目 ChatGLM 本地部署的详细教程。清华开源项目 ChatGLM-6B 已发布开源版本,这一项目可以直接部署在本地计算机上做测试,无需联网即可体验与 AI 聊天的乐趣。

项目地址:GitHub – THUDM/ChatGLM-6B: ChatGLM-6B:开源双语对话语言模型 | An Open Bilingual Dialogue Language Model

官网介绍:

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。

为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。

不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。请大家在使用前了解这些问题,以免产生误解。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。

第一步,本地安装 Python
这一步暂略,可以自行下载安装 Python 环境。

Python 下载地址:Download Python | Python.org

注意:安装 >9 以上版本,建议安装 10。

第二步,下载项目程序包
地址见上面的项目地址,直接下载下来并解压。我这里解压到 E:\chatGPT\ 下。

 

第三步,下载模型包 chatglm
下载地址:https://huggingface.co/THUDM/chatglm-6b/tree/main

官网介绍:

ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGLM 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

注意:下载后放到第二步程序包下,自行创建目录 chatglm-6b,如下:

 

第四步,下载依赖包
Window + R 快捷键打开运行窗口,输入 cmd 打开控制台命令行,进入到程序目录下。

 

分别执行如下两条命令:

pip install -r requirements.txt

pip install gradio

注意:如果执行有报错,请查阅文章末尾的错误处理。

 

等待依赖包下载成功,结果如下:

 

第五步,运行网页版 demo
执行如下命令,运行网页版本的 demo,如下:

python web_demo.py

程序会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。最新版 Demo 实现了打字机效果,速度体验大大提升。注意,由于国内 Gradio 的网络访问较为缓慢,启用 demo.queue().launch(share=True, inbrowser=True) 时所有网络会经过 Gradio 服务器转发,导致打字机体验大幅下降,现在默认启动方式已经改为 share=False,如有需要公网访问的需求,可以重新修改为 share=True 启动。

执行结果如下:

 

注意:如果执行提示信息和上图对不上,请查阅文章末尾的错误处理。

第七步,测试网页版程序
浏览器打开地址 并访问,输入问题,可以看到 ChatGLM 会给予回复。

 

Very Good!查看电脑性能,感觉 CPU 和内存都要爆掉了 ^ ^

 

 

第八步,运行命令行 Demo
执行如下命令,运行命令行版本的 demo,如下:

python cli_demo.py

程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear 可以清空对话历史,输入 stop 终止程序。

 

错误一:下载依赖包超时
E:\chatGPT\ChatGLM-6B-main>pip install -r requirements.txt
Collecting protobuf<3.20.1,>=3.19.5
Downloading protobuf-3.20.0-cp310-cp310-win_amd64.whl (903 kB)
—————————————- 903.8/903.8 kB 4.0 kB/s eta 0:00:00
Collecting transformers==4.27.1
Downloading transformers-4.27.1-py3-none-any.whl (6.7 MB)
———– —————————- 2.0/6.7 MB 5.4 kB/s eta 0:14:29
ERROR: Exception:
Traceback (most recent call last):
File “D:\Python\Python310\lib\site-packages\pip\_vendor\urllib3\response.py”, line 438, in _error_catcher
yield
File “D:\Python\Python310\lib\site-packages\pip\_vendor\urllib3\response.py”, line 561, in read
data = self._fp_read(amt) if not fp_closed else b””
File “D:\Python\Python310\lib\site-packages\pip\_vendor\urllib3\response.py”, line 527, in _fp_read
return self._fp.read(amt) if amt is not None else self._fp.read()
File “D:\Python\Python310\lib\site-packages\pip\_vendor\cachecontrol\filewrapper.py”, line 90, in read
data = self.__fp.read(amt)
File “D:\Python\Python310\lib\http\client.py”, line 465, in read
s = self.fp.read(amt)
File “D:\Python\Python310\lib\socket.py”, line 705, in readinto
return self._sock.recv_into(b)
File “D:\Python\Python310\lib\ssl.py”, line 1274, in recv_into
return self.read(nbytes, buffer)
File “D:\Python\Python310\lib\ssl.py”, line 1130, in read
return self._sslobj.read(len, buffer)
TimeoutError: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “D:\Python\Python310\lib\site-packages\pip\_internal\cli\base_command.py”, line 160, in exc_logging_wrapper
status = run_func(*args)
File “D:\Python\Python310\lib\site-packages\pip\_internal\cli\req_command.py”, line 247, in wrapper
return func(self, options, args)
File “D:\Python\Python310\lib\site-packages\pip\_internal\commands\install.py”, line 419, in run
requirement_set = resolver.resolve(
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\resolver.py”, line 92, in resolve
result = self._result = resolver.resolve(
File “D:\Python\Python310\lib\site-packages\pip\_vendor\resolvelib\resolvers.py”, line 481, in resolve
state = resolution.resolve(requirements, max_rounds=max_rounds)
File “D:\Python\Python310\lib\site-packages\pip\_vendor\resolvelib\resolvers.py”, line 348, in resolve
self._add_to_criteria(self.state.criteria, r, parent=None)
File “D:\Python\Python310\lib\site-packages\pip\_vendor\resolvelib\resolvers.py”, line 172, in _add_to_criteria
if not criterion.candidates:
File “D:\Python\Python310\lib\site-packages\pip\_vendor\resolvelib\structs.py”, line 151, in __bool__
return bool(self._sequence)
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py”, line 155, in __bool__
return any(self)
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py”, line 143, in <genexpr>
return (c for c in iterator if id(c) not in self._incompatible_ids)
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py”, line 47, in _iter_built
candidate = func()
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\factory.py”, line 206, in _make_candidate_from_link
self._link_candidate_cache[link] = LinkCandidate(
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py”, line 297, in __init__
super().__init__(
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py”, line 162, in __init__
self.dist = self._prepare()
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py”, line 231, in _prepare
dist = self._prepare_distribution()
File “D:\Python\Python310\lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py”, line 308, in _prepare_distribution
return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
File “D:\Python\Python310\lib\site-packages\pip\_internal\operations\prepare.py”, line 491, in prepare_linked_requirement
return self._prepare_linked_requirement(req, parallel_builds)
File “D:\Python\Python310\lib\site-packages\pip\_internal\operations\prepare.py”, line 536, in _prepare_linked_requirement
local_file = unpack_url(
File “D:\Python\Python310\lib\site-packages\pip\_internal\operations\prepare.py”, line 166, in unpack_url
file = get_http_url(
File “D:\Python\Python310\lib\site-packages\pip\_internal\operations\prepare.py”, line 107, in get_http_url
from_path, content_type = download(link, temp_dir.path)
File “D:\Python\Python310\lib\site-packages\pip\_internal\network\download.py”, line 147, in __call__
for chunk in chunks:
File “D:\Python\Python310\lib\site-packages\pip\_internal\cli\progress_bars.py”, line 53, in _rich_progress_bar
for chunk in iterable:
File “D:\Python\Python310\lib\site-packages\pip\_internal\network\utils.py”, line 63, in response_chunks
for chunk in response.raw.stream(
File “D:\Python\Python310\lib\site-packages\pip\_vendor\urllib3\response.py”, line 622, in stream
data = self.read(amt=amt, decode_content=decode_content)
File “D:\Python\Python310\lib\site-packages\pip\_vendor\urllib3\response.py”, line 560, in read
with self._error_catcher():
File “D:\Python\Python310\lib\contextlib.py”, line 153, in __exit__
self.gen.throw(typ, value, traceback)
File “D:\Python\Python310\lib\site-packages\pip\_vendor\urllib3\response.py”, line 443, in _error_catcher
raise ReadTimeoutError(self._pool, None, “Read timed out.”)
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=’files.pythonhosted.org’, port=443): Read timed out.

E:\chatGPT\ChatGLM-6B-main>

可以看到错误信息提示超时,应该是网络问题,可以尝试在命令中加上超时时间设置的参数,命令修改后如下:

pip –default-timeout=1688 install -r requirements.txt

问题二:又一次实时下载模型包

当运行程序时,如果提示信息中看到又一次下载模型包,而没有使用第三步提前准备的模型包时,需要把模型包复制到程序运行时的缓存目录中,缓存路径可能如下:

C:\Users\用户目录\.cache\huggingface\hub\models–THUDM–chatglm-6b\snapshots\fb23542cfe773f89b72a6ff58c3a57895b664a23

模型包拷贝到该目录后再次运行程序即可。

Good Luck!
————————————————
版权声明:本文为CSDN博主「孟郎郎」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tzhuwb/article/details/129910616

 

轻量高效ORM之Dapper篇 - 知乎

mikel阅读(1132)

来源: 轻量高效ORM之Dapper篇 – 知乎

介绍

dapper是一个简单的对象关系映射框架(ORM—-Object Relation Mapping),它几乎与原始的ADO.NET 数据操作读取一样快(反正我ado.net已经忘完了╥__╥,以前用的最多是linq to SQL和ef,不需要写SQL语句,使用linq操作数据源),它负责数据库与编程语言之间的映射。

与EF的优劣

EF——-重量级ORM的代表

优点:

  • 面向对象式操作数据库。
  • 完全摆脱SQL 语句,不用关心SQL如何写,可移植性强。
  • 支持code first,开发人员可以完成且无需关心数据库,代码先行,极大节省开发成本。
  • 结合LINQ,开发效率高。
  • 跨数据库,易配置。
  • 与VS结合较好。

缺点:

  • 比较复杂,学习曲线复杂(官方文档丰富且杂)。
  • 不适合做统计查询(因为统计查询需要执行查询效率高)。
  • 对于多表查询或一些复杂的查询实现较为困难和复杂。
  • 自动生成的SQL语句复杂,效率低。
  • EF的Context上下文不是线程安全的(知识有限,不懂)。
  • 包和插件较为冗余(对于中小型项目来说),性能一般。

Dapper——–轻量级ORM的代表

优点:

  • 开源,轻巧(轻量级),编译后文件简单且小巧。
  • 支持主流数据库,MSSQL,MySQL,Oracle。
  • 执行效率高。
  • 学习较为方便

缺点:

  • 半自动ORM,需要开发人员自己写实体类┭┮﹏┭┮(可以借助实体类生成工具生成)。
  • 开发时间成本高,LINQ支持较弱。
  • 维护成本高,不支持Code first,开发人员除了要维护数据库中的表,还需要维护代码表中的映射对象。

Dapper安装

Nuget包安装管理器搜索,安装最新版本即可。

Dapper方法

Dapper使用以下几个方法扩展了我们的IDbConnection接口

  • Execute
  • Query
  • QueryFirst
  • QueryFirstOrDefault
  • QuerySingle
  • QuerySingleOrDefault
  • QueryMultiple

Execute

可执行存储过程、增、删、改等操作。

此处以插入为例

MySqlConnection实现了DbConnection接口,当数据库发生改变时,可进行更改。

插入(单、多),更新(单、多),删除(单,多)均使用此方法

Query

Dapper Contrib插件

它是额外的插件,在dapper的基础上进一步封装了些许操作,使开发更为方便。

安装包之后,即可使用。

数据注释

ExplicitKey和Computed这两个属性后面遇到再阐述

基本方法

今日总结,皆为初步学习,有很多方法没有涉及到,具体后期在实践中总结。