您是否存在想在浏览器动态编译razor的组件的想法?

不知道是否有人跟我一样想在浏览器上直接可以动态的编译blazor的一些组件库?而不是通过引用NuGet以后才能查看到效果,并且在使用别人的组件的时候可以在动态的调整组件的一些样式

不说了开始正文:

本文我们将使用Masa提供的一个组件实现动态编译github.com直通车 ,执行环境将在WebAssembly中执行,为什么使用WebAssembly而不是Server呢?首先我们需要先了解这俩种模式的执行原理

WebAssembly:

  • Blazor WebAssemblyBlazor WebAssembly,用于使用 .NET 生成交互式客户端 Web 应用。 Blazor WebAssembly 使用无插件或将代码重新编译为其他语言的开放式 Web 标准。 Blazor WebAssembly 适用于所有新式 Web 浏览器,包括移动浏览器。

Server:

  • Blazor ServerASP.NET Core 应用中支持在服务器上托管 Razor 组件。 可通过 SignalR 连接处理 UI 更新。

    运行时停留在服务器上并处理:

    • 执行应用的 C# 代码。
    • 将 UI 事件从浏览器发送到服务器。
    • 将 UI 更新应用于服务器发送回的已呈现的组件。

由于编译是完全可操作的,存在安全问题,在Server的模式下用户编译的环境就是服务器的环境,这样用户就可以通过动态编译代码实现操作侵入安全,问题很严重,如果有心人使用对于安全影响过于严重,不建议在Server中使用动态编译

实现我们来创建一个空的WebAssembly项目

mkdir compileRazor
cd compileRazor
dotnet new blazorwasm-empty

使用vs打开项目添加Masa.Blazor.Extensions.Languages.Razor ,将一下代码添加到项目文件中

    <PackageReference Include="Masa.Blazor.Extensions.Languages.Razor" Version="0.0.1" />

修改Program.cs文件的代码

using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using compileRazor;
using Masa.Blazor.Extensions.Languages.Razor;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.CodeAnalysis;

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

var app = builder.Build();

// 初始化RazorCompile
RazorCompile.Initialized(await GetReference(app.Services), await GetRazorExtension());

await app.RunAsync();

// 添加程序集引用
async Task<List<PortableExecutableReference>?> GetReference(IServiceProvider services)
{
    #region WebAsembly

    // need to add Service
    var httpClient = services.GetService<HttpClient>();

    var portableExecutableReferences = new List<PortableExecutableReference>();
    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
    {
        try
        {
            //你需要通过网络获取程序集,应为无法通过程序集目录获取
            var stream = await httpClient!.GetStreamAsync($"_framework/{assembly.GetName().Name}.dll");
            if (stream.Length > 0)
            {
                portableExecutableReferences?.Add(MetadataReference.CreateFromStream(stream));
            }
        }
        catch (Exception e) // There may be a 404
        {
            Console.WriteLine(e.Message);
        }
    }

    #endregion

    // 由于WebAssembly和Server返回portableexecutablerreference机制不同,需要分开处理
    return portableExecutableReferences;
}

async Task<List<RazorExtension>> GetRazorExtension()
{
    var razorExtension = new List<RazorExtension>();

    foreach (var asm in typeof(Program).Assembly.GetReferencedAssemblies())
    {
        razorExtension.Add(new AssemblyExtension(asm.FullName, AppDomain.CurrentDomain.Load(asm.FullName)));
    }

    return razorExtension;
}

修改Pages\Index.razor的代码


@page "/"
@using Masa.Blazor.Extensions.Languages.Razor;

<button class="button" @onclick="Run">刷新</button>

<div class="input-container">
    <textarea @bind="Code" type="text" class="input-box" placeholder="请输入执行代码" >
    </textarea>
</div>

@if (ComponentType != null)
{
    <DynamicComponent Type="ComponentType"></DynamicComponent>
}

@code{

    private string Code = @"<body>
    <div id='app'>
        <header>
            <h1>Doctor Who&trade; Episode Database</h1>
        </header>

        <nav>
            <a href='main-list'>Main Episode List</a>
            <a href='search'>Search</a>
            <a href='new'>Add Episode</a>
        </nav>

        <h2>Episodes</h2>

        <ul>
            <li>...</li>
            <li>...</li>
            <li>...</li>
        </ul>

        <footer>
            Doctor Who is a registered trademark of the BBC. 
            http://www.doctorwho.tv/
        </footer>
    </div>
</body>";

    private Type? ComponentType;

    private void Run()
    {
        ComponentType = RazorCompile.CompileToType(new CompileRazorOptions()
        {
            Code = Code // TODO: 在WebAssembly下保证ConcurrentBuild是false 因为Webassembly不支持多线程
        });
        StateHasChanged();
    }

}

<style>
    .button{
        width: 100%;
        font-size: 22px;
        background-color: cornflowerblue;
        border: 0px;
        margin: 5px;
        border-radius: 5px;
        height: 40px;
    }
    .input-container {
        width: 500px;
        margin: 0 auto;
        padding: 10px;
        border: 1px solid #ccc;
        border-radius: 5px;
    } 
    .input-box {
        width: 100%;
        height: 100px;
        border: 1px solid #ccc;
        border-radius: 5px;
        font-size: 14px;
    }
</style>

然后启动程序效果如图:

首次编译会比较慢,在WebAssembly下还可以因为电脑问题造成卡顿,如果是需要提供开发效率可以使用Server调试,在Server调试的话是比WebAssembly快很多,而且WebAssembly还没有做Aot,性能不会太好

来自token的分享

技术交流群:737776595

推荐一个超级好用的Blazor UI组件 MASA Blazor 开源协议 MIT 商用完全没问题

本文转载于网络 如有侵权请联系删除

相关文章

  • 设置 node 环境变量

    大家好,又见面了,我是你们的朋友全栈君。一、前言下载完node后,想要在编辑器里面使用npm命令,必须设置环境变量。二、设置步骤如下(以win10操作系统为例)1.找到“此电脑”,点击右键,选择“属性”;2.按照下图1、2、3的顺序点击;3.出现如下图,选择“path”;4.出现如下图,选择“新建”;5.出现如下图,选择“浏览”,选择node的安装地址;6.确定之后(记得设置完之后一定要逐步确定),打开cmd,输入node-v,出现如下图,设置成功。发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133479.html原文链接:https://javaforall.cn

  • antui,一款前端开发第三方库

    AntUI是蚂蚁金服无线H5样式库,是对外开放的一套支付宝App视觉交互规范。旨在帮助用户快速完成H5页面开发,并提供给用户在支付宝App内一致的体验;目前AntUI只提供静态的规范样式,业务场景中的复杂效果以及配合js完成的交互效果需要业务自己控制。AntUI组件只覆盖支付宝App中常用的业务场景,并随钱包版本更新而更新,样式库更新发布后需要各业务手动更新样式库版本。AntUI提供的交互组件,你可以根据自己的业务情况进行二次开发。1、该第三方库,且结合vue开发前端,是比较合适的一款。 2、es6也是结合vue开发,一种不错的体验。(结合vue中粘性布局,弹性布局,自定义组件,ajax请求后台接口,分页组件实现方式)。

  • 简简单单,快速生成函数调用关系图

    ##示例代码//来源:公众号编程珠玑 //作者:守望先生 #include<stdio.h> #include<stdlib.h> intlevel() { intret=rand()%100; returnret; } intlevel2(intinput) { intret=rand()%input; returnret; } intmain() { inta=level(); intb=level2(a); printf("%d\n",b); } 复制生成调用关系图clang-S-emit-llvmdemo.c-o-|opt-analyze-dot-callgraph dot-Tpng-ocallgraph.pngcallgraph.dot 复制当然这里用到了好几个工具,你可能需要单独安装。效果图扩展另外就是还可以利用CodeViz给编译器打补丁的方式来生成调用关系图,有兴趣的也可以去尝试看看。关于dot,之前在《如何优雅地画一棵树》中也有介绍其应用。而在分析性能问题的时候,要看到底层所有调用关系图,还可以使用gprof2dot。看个示

  • Python matplotlib绘制折线图

    matplotlib是Python中的一个第三方库。主要用于开发2D图表,以渐进式、交互式的方式实现数据可视化,可以更直观的呈现数据,使数据更具说服力。一、安装matplotlibpipinstallmatplotlib-ihttps://pypi.tuna.tsinghua.edu.cn/simple复制二、matplotlib图像简介matplotlib的图像分为三层,容器层、辅助显示层和图像层。1.容器层主要由Canvas、Figure、Axes组成。Canvas位于图像的最底层,充当画布的作用。Figure位于Canvas之上,指画布上的一整张图像。Axes位于Figure之上,指Figure中的单个图表,一个Figure中可以有一个或多个Axes,即一张图像中可以有一个或多个图表。2.辅助显示层是单个图表(Axes)中用来提供辅助信息的层。辅助显示层主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axislabel)、坐标轴刻度(tick)、坐标轴刻度标签(ticklabel)、网格线(grid)、图例(legend)、标题

  • 责任链模式以及在 Android 中的应用

    前言这几天在重新阅读Okhttp源码的时候,看到了OkhttpInterceptor的应用,想起了责任链模式,于是,动手将自己对责任链模式的理解记录了下来,希望对大家有所帮助。责任链设计模式责任链设计模式属于行为设计模式,简单来说,一个请求由链表进行处理(链表上由多个对象组成),具体由那个对象处理,需要根据条件判断。他的处理逻辑大概是这样的,从链头开始传递,直到找到处理他的对象为止。责任链设计模式有一个很明显的好处,请求者与处理者直接耦合度大大降低,他们之间甚至可以互相不知道对方的存在。下面,我们先来看一下责任链模式的UML图。可以看到,主要有几个角色抽象处理者(Handler)角色:定义一个处理请求的抽象类。ConcreteHandler具体事件处理者,一般来说,他持有下一个处理者的引用,当他不处理目前事件的时候,会传递给下一个处理者处理,即successor处理。Client方,即发起方,当我们发起请求的时候,直接交给Handler链表去处理即可例子我们来模拟一个公司的请假流程,比如说,在公司中,我们平时请假,在OA上面发起申请流程,少于3天的一般由组长审批即可,大于3天的小于7天

  • python去抖音视频水印,竟然只要14行代码!

    自从大数据火了,学习Python的人也出现了爆发式的增长。身边的小伙伴们纷纷加入了Python大营,无论是在互联网做开发项目的,还是在公司做财务报表的,各行各业各岗位都在努力学习Python。因为Python有很多非常强大的数据处理、数据分析方面的库,同时又是全平台兼容,因此Python成了大家眼里的香饽饽!其实Python学起来非常容易,而且还能Get很多好玩的技能!Python爬取抖音上的小姐姐有时候我们在刷抖音的时候看到好看的小姐姐,想要下载下来方便以后欣赏,但是每次都需要在抖音里面寻找好久才能下载而且还都是带有水印,非常不方便。现在如果掌握了Python,就可以自动下载这个小姐姐的抖音视频,而且还都是高清无水印版本的呢!这里需要用到mitmproxy这个抓包软件,配置好手机代理后打开抖音。这时我们可以发现,所有的视频都存在ixigua.com这个网址里。通过查看拦截到的数据可以发现,我们刷到的每一个视频都是一个返回类型为video/mp4的数据包。首先Python实时拦截手机刷抖音时的数据,然后从中筛选出域名为*.ixigua.com且返回类型为video/mp4的请求包,下载

  • Java的异常处理机制

    异常 异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。 异常处理机制在Java应用程序中,异常处理机制为:抛出异常,捕捉异常。**抛出异常:**当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。**捕获异常:**在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exceptionhandler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时

  • Python爬虫之正则表达式入门正则表达式语法正则表达式实例ReMatch对象贪婪匹配和最小匹配

    正则表达式是用来简洁表达一组字符串的表达式使用正则表达式的优势是什么? 简洁 一行胜千言一行就是特征(模式) 无穷字符串组的简洁表达某种特征字符串组的简洁表达正则表达式是用来简洁表达一组字符串的表达式 正则表达式是一种通用的字符串表达框架 正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具 正则表达式可以用来判断某字符串的特征归属 正则表达式在文本处理中十分常用: 表达文本类型的特征(病毒、入侵等) 同时查找或替换一组字符串 匹配字符串的全部或部分 …… 最主要应用在字符串匹配中 编译:将符合正则表达式语法的字符串转换成正则表达式特征正则表达式语法正则表达式语法由字符和操作符构成image.png正则表达式实例ReRe库是Python的标准库,主要用于字符串匹配 调用方式: importrerawstring类型(原生字符串类型) re库采用rawstring类型表示正则表达式,表示为:rawstring是不包含对转义符再次转义的字符串re库也可以采用string类型表示正则表达式,但更繁琐 例如:建议:当正则表达式包含转义符时,使用rawstringimage.pngimag

  • IMWebConf 2017 线上票购买用户补偿方案

    本文作者:IMWebIMWeb团队原文出处:IMWeb社区未经同意,禁止转载 2017年9月16日,IMWebConf2017在深圳科兴国际会议中心完美落幕!大会共邀请国内外讲师16名,包括W3C的全球项目负责人Philippe先生、Google开发者平台工程师MichaelYeung、微软TypeScript专家Liminzhu以及编译器专家buckleScript作者张宏波先生等技术专家,以及众多国内一线公司的技术专家。现场参会者达到约500人,参会者覆盖了华为、大疆、京东、百度、阿里、腾讯等近百家公司,还有来自北京、上海、中国香港等各地的开发者远道而来参会。 这是IMWeb团队第一次举办这么高规格的会议,尽管团队每个成员都已经尽力来确保会议的顺利进行,但是由于会议现场的网络临时故障,导致购买线上票的观众直播体验不佳。为此,组委会在此致歉,并希望通过下面的补偿方案向各位表示我们的歉意: 购买线上票任意学班级(150元)并且自己付费金额超过或等于100元的用户,补偿价值150元的IMWebConf纪念礼品一份。购买线上票单个会场、购买任意学但是自己付费金额小于100元的用户,补偿礼品

  • af-s af-f_read fpdma queued

    大家好,又见面了,我是你们的朋友全栈君。1.PDAF驱动功能验证1.1pdaflog设置log设置,打开AF(8),State(2),Sensor(2)的log CT30P:/#cat/vendor/etc/camera/camxoverridesettings.txt overrideLogLevels=0x3F logWarningMask=0x08000202 logInfoMask=0x08000202 logVerboseMask=0x08000202 enable3ADebugData=TRUE dumpSensorEEPROMData=TRUE enableTuningMetadata=TRUE afFullsweep=3 enablePDLibLog=3复制1.2验证pdaf.xml是否编译进系统02-2514:52:07.993887887ICamX:[INFO][SENSOR]camxsensornode.cpp:3165IsPDAFEnabled()PDAFType=3:isPDAFEnabled1 02-2514:52:08.037887887ICamX:[IN

  • Lombok好用是好用,就是容易踩坑,这份避坑指南请查收

    序言 各位好啊,我是会编程的蜗牛,作为java开发者,我们平常在开发过程中,总是希望能够尽量少敲代码。这一方面,当然是为了偷懒,另一方面,当然也是为了代码看起来更加简洁一点,不断往编程规范上靠。然后其中有一个插件或者说依赖吧,就是lombok,它的出现真可谓程序员的福音啊。只要用了这个东西,我们再也不用写那一大堆重复的但确实必须的代码了。虽然我们也可以用IDEA自动生成这些东西,但总归麻烦啊。一旦这个类的属性做了一些调整,还得重新修改对应的setter/getter方法等。 当然,今天不是来说lombok的好的,而是想和各位探索一下这个东西存在的一些坑,防止大家踩坑,这个坑就让我来踩一下吧~ 问题再现 首先,我们新建一个Dog的类,里面有name和year的属性,然后加上注解@Data,然后进行编译,可以看到class文件里面自动生成了很多代码。     里面我数了一下,一共生成了6种类型的代码,有【空构造方法】、【Get/Set方法】、【equals方法】、【canEqual】、【hashCode】、【toString】方法,我们想要的和不想要的,通过给我们生

  • JeeWMS仓库管理系统(移动端+分析+物流管理)

    源码地址:https://gitee.com/erzhongxmu/JEEWMS(如有侵权请及时联系博主删贴) 本WMS基于JAVA的仓库管理系统(支持3PL(三方物流)和厂内物流),包含PDA端和WEB端,功能涵盖WMS,OMS,BMS(计费管理系统),TMS,成功应用于多家国内知名大客户,客户群体:冷链,干仓,快消品,新能源汽车等行业   智能制造产品JEEMES已经开源(https://gitee.com/erzhongxmu/jeemes)欢迎大家STAR 测试系统地址http://47.113.229.131:9080/wms用户名:test密码:123456本地启动的用户名:admin密码:llg123 androidapp也已经开源,近期更新会比较频繁app开源地址https://gitee.com/erzhongxmu/JeeWMSapp-uni 大家看到了,star一下,谢谢,本团队会持续更新,一直开源! 开源不易,如果大家需要购买华为云可以通过我们的专属链接,优惠多多华为云服务器优惠购买 一、项目简介: JeeWMS在经过多家公司上线运行后,为了降低物流仓

  • svn server配置与TortoiseSVN、Ankhsvn+VS使用

    Svn服务器与客户端安装 1.      下载安装VisualSvn-Server服务端。(过程略) 2.      下载安装TortoiseSVN客户端。(过程略) 3.      下载安装vs插件AnkhSvn。(过程略) 在服务器中建立仓库 打开visualSVNServerManager,右击Repositories—新建—Repository,在弹出的对话框中输入仓库名(recharge) 安全性设置 在左侧的Users上点击右键—新建—User,在弹出的对话框中添加用户名和密码:(注意用户名和密码区分大小写)   将源代码迁入到svn服务器中 找到你新建的项目文件夹(项目已经包含在里面),右击—TortoiseSVN—Import,在弹出的对话框中输入仓库所在的url,点击ok完成迁入源代码到svn服务器中。 设置项目使用权限 在svn中权限分为三种noaccess(不可用),

  • js 递归处理树形结构数据

    //判断任务状态禁用按钮 //子级得递归一下 lettaskListDeepCopy=JSON.parse(JSON.stringify(this.taskList)); this.taskList=this.arrayRecursion(taskListDeepCopy); 复制 //递归处理树形结构数据函数 arrayRecursion(array){ array.forEach((item)=>{ item.checked=false; //判断任务状态禁用按钮 //子级得递归一下 if(item.taskStatus=="进行中"){ item.disabled=false; }else{ item.disabled=true; } if(item.subtaskList){ this.arrayRecursion(item.subtaskList) }else{ return } }); returnarray; }, 复制

  • 安装go语言,配置环境及IDE,只需3步

    安装go语言,配置环境及IDE,只需3步  (欢迎加入go语言群:218160862,群内有实践) 第1.下载go压缩包,解压  ,如果你是window系统,请选择go1.5.windows-386.zip第2.将go语言的解压路径写到电脑的环境变量中:http://www.cnblogs.com/atyou/archive/2012/10/15/2724490.html .第3.go的ide叫做liteIde,这个ide本身就是用go语言+qt库写的界面,还是中国人写的,作者很强悍 https://github.com/visualfc/liteide.  安装即可,liteIde还是不错的,这个ide占用内存比较小。   go语言的windows界面开发有walk(win)、goqt(跨平台QT),只需要普通引入类库即可,例子可看群共享 (欢迎加入go语言群:218160862,群内有实践)

  • Safari浏览器中,Access-Control-Allow-Headers 兼容性问题,别设置为*,设置为具体的每个值

    问题:macOS10.13.6、Safari浏览器11.1.2中,接口报错:【RequestheaderfieldContent-TypeisnotallowedbyAccess-Control-Allow-Headers.】 解决:Access-Control-Allow-Headers别设置为*,设置为具体的每个值。

  • ROS系统MoveIt玩转双臂机器人系列(三)--利用controller控制实际机器人

    注:本篇博文全部源码下载地址为:GitRepo。 1.下载到本地后解压到当前文件夹然后运行:catkin_make编译。 2.源码是在Ubuntu14.04+Indigo环境下编写。   一、概述   本系列博文的第一篇,我们完成了双臂机器人Rob的建模工作;第二篇博文则详细介绍MoveIt模块的配置工具SetupAssistantTool的使用,并配置了一个简单的使用环境。具体在程序结构上如图1所示,我们已经完成了两处红色椭圆圈出的部分,即完成了ROSParamServer(建模)的工作,同时利用系统工具配置了move_group节点。   图1      但是,到目前为止我们仍然只是在模拟环境中(Rviz)看到我们的机器人做动作,仍然没有和现实中的机器人产生关联,如何利用这个框架控制现实中的机器人则是本博文需要解决的问题。具体到程序结构上如图1所示,我们要完成绿色椭圆圈出的两个部分的工作,即将MoveIt的运动消息发送给实际的机器人,同时利用发布机器人的关节信息,实现方法如下文所述。 二、改造默认生成的rob_moveit_config包    我首

  • 初识Python、PyCharm、Anaconda与tensorflow

        最近裸辞了,未来希望转深度学习、语音识别、文本挖掘,觉得这块特别有意思,比较好玩。开始自学相关知识,为了能够独立地、系统地了解和学习相关知识,计划不定期记录和更新一些平时的学习总结,个人关于以上几个方面的理解等,以达到自勉、自我督促和交流的目的。    关于python:    在读研以及工作的前两年,基本上使用MATLAB做算法的研究和实现,C和C++也用的比较少。最初听说python是一个比较高效的科学计算语言,很好奇python比之MATLAB功能如何?后面熟悉了python打算再好好比较一下二者的优劣。    按照官方说法,python是一种解释型的、面向对象的、带有动态语义的高级程序设计语言。自从GuidovanRossum于20世纪90年代创立python以来,python的追随者稳步增加,愈发流行。python广泛应用于系统管理工作(许多linux发行版的重要组成部分)、主程序开发、脚本语言、制作影片特效、管理讨论组、实现网络爬虫和搜索

  • 字符串

    StringBuilder publicclassStringBuilderDemo{ publicstaticvoidmain(String[]args){ test(); } staticvoidtest(){ //需求:使用String完成50000个字符串的拼接:7640ms longbegin=System.currentTimeMillis(); Stringstr=""; for(inti=0;i<50000;i++){ str+=i; } System.out.println(System.currentTimeMillis()-begin);//7640ms System.out.println("---------------"); //需求:使用StringBuild完成50000个字符串的拼接/特点:线程安全性较低,但是性能较高多线程使用StringBuild begin=System.currentTimeMillis(); StringBuildersb=newStringBuilder(); for(inti=0;i<50000;i++){

  • 博弈论

    喝酒玩骰子有哪些技巧 一、摇好的骰子只看一遍,自己要记得自己的骰子二、通常前三把是输给对方的,目的是看他喊骰子的规律(是说实话还是假话,什么时候说)三、自己喊骰子要注意不要被人找到喊骰子的规律四、喊骰子不要犹豫,哪怕没有,从理直气壮的口气上也让人相信有五、别人喊的数字次数多,喊的也越来越高的时候跟他一个六、一般心理素质不好的人从眼神和喊骰子看骰子上就能看出来他是真的还是假的,心里素质好的,我们通常都叫他大忽悠,就是有没有都喊,喊的最后别人都不敢喊了,这种人是比较厉害的 酒吧博弈 酒吧博弈的关键在于,如果我们在博弈中能够知道他人的选择,然后作出与其他大多数相反的选择,就能在这种博弈中胜出! 那么,对于在喝酒的时候,我们无法确定的是,喊的人(),他说的是实话还是假话,这是我们无法预测的,这是一个混沌现象! 所以这里就讲到了,历史(经验),同时对于我们自己有用的,或是唯一有的依据就是,对方不知道喊的人说的是实话还假话,这是喊的人让其产生混沌的主要原因! 枪手博弈(未完待续...) 有三个枪手,分别是甲,乙,丙,彼此水火不容,某天,三人出现在同一个地方。眼看就要发生生死决斗。枪手的枪法因人而异

  • 直流电机调速作业

    对于此次的直流电机调速,我决定采用书上学习过的转速、电流双闭环调速。 并且采用PI来调节。 这是我的PI调节的参数代码,我的设定是将Kp设定为1,Ki设定为2. 最初,我的Kp设定是30,但是由于得到我波动值太大,到了1e+xx多,我就相对应的降低了Kp,直到Kp降为5存在了相应的曲线,经过调整,Kp=1和Ki=2为最好增益。 这个是我调节大概的图,电压稳定在59.7474V。 通过这图,可以看出,在0.1S就差不多打到了调整值的百分之90,调整速度比较快。  

相关推荐

推荐阅读