关键词[WinForm������������]相关搜索结果,共搜索到4666条结果

.NET 5 支持 Azure Functions OpenAPI 扩展啦

今年5月,在Build大会上,AzureFunctionsOpenAPI的功能支持(预览版)正式宣布。当时,它最高支持v3运行时——.NETCore3.1版本。最近,它发布了.NET5隔离工作器支持包作为预览。在这篇文章中,我将回顾如何使用它并将其部署到Azure。注意:您可以在此GitHub存储库中找到本文中使用的示例代码:https://github.com/justinyoo/azfunc-openapi-dotnet在.NET5中创建AzureFunctions应用程序让我们使用VisualStudio来完成这个练习。在创建应用程序时,使用".NET5(隔离)"运行时和"Http触发器"。然后您将找到带有默认代码的HTTP端点。现在,在解决方案资源管理器上选择NuGet包管理器菜单。在NuGet包管理器屏幕中,勾选"包括预发布"复选框,然后搜索Microsoft.Azure.Functions.Worker.Extensions.OpenApi包。在撰写本文时,NuGet打包程序版本是v0.8.1-preview。OpenAPI扩展现在已经安装。配置HostBuilder安装OpenAPI扩展之后,让我们配置HostBuilder。首先,打开Program.cs文件并删除现有的ConfigureFunctionsWorkerDefaults()方法。这是因为该方法默认使用System.Text.Json,我们不会使用它。publicstaticvoidMain(){varhost=newHostBuilder()//👇👇👇👇👇删除以下这行👇👇👇👇👇.ConfigureFunctionsWorkerDefaults()//👆👆👆👆👆删除以上这行👆👆👆👆👆.Build();host.Run();}然后,按此顺序添加ConfigureFunctionsWorkerDefaults(worker=>worker.usenewtonsoftjson())和ConfigureOpenApi()方法。第一个方法明确声明要使用Newtonsoft.Json包,下一个导入额外的OpenAPI相关端点。publicstaticvoidMain(){varhost=newHostBuilder()//👇👇👇👇👇Addtheselinesbelow👇👇👇👇👇.ConfigureFunctionsWorkerDefaults(worker=>worker.UseNewtonsoftJson()).ConfigureOpenApi()//👆👆👆👆👆Addtheselinesabove👆👆👆👆👆.Build();host.Run();}注意:目前,使用System.Text.Json并不能保证应用程序是否正常工作。因此,强烈推荐使用Newtonsoft.Json。至此,配置完毕。让我们继续。添加OpenAPI修饰符添加OpenAPI相关的修饰符,如下所示。这与现有方法完全相同,所以我不会讲得太深。//👇👇👇👇👇在下面添加OpenAPI相关的修饰符👇👇👇👇👇[OpenApiOperation(operationId:"greeting",tags:new[]{"greeting"},Summary="Greetings",Description="Thisshowsawelcomemessage.",Visibility=OpenApiVisibilityType.Important)][OpenApiSecurity("function_key",SecuritySchemeType.ApiKey,Name="code",In=OpenApiSecurityLocationType.Query)][OpenApiResponseWithBody(statusCode:HttpStatusCode.OK,contentType:"text/plain",bodyType:typeof(string),Summary="Theresponse",Description="Thisreturnstheresponse")]//👆👆👆👆👆在上面添加OpenAPI相关的修饰符👆👆👆👆👆[Function("Function1")]publicstaticHttpResponseDataRun([HttpTrigger(AuthorizationLevel.Function,"get","post")]HttpRequestDatareq,FunctionContextexecutionContext){...}一旦你完成了修饰符的添加,你就完成了!让我们运行这个应用程序。运行SwaggerUI通过输入F5键或单击VisualStudio上的调试按钮运行Function应用程序。您将看到控制台中添加了OpenAPI相关的端点。在web浏览器上运行http://localhost:7071/api/swagger/ui端点,您将看到SwaggerUI页面。现在已正确实施具有OpenAPI功能的AzureFunction应用。部署AzureFunctionApp–Windows你确认你的AzureFunction应用工作正常。现在需要部署该项目。首先,单击解决方案资源管理器中的"发布"菜单。选择"Azure",然后选择"AzureFunctionsApp(Windows)"。您可以使用现有的Function应用程序实例或通过单击➕按钮来创建一个新的应用程序实例。这一次,让我们使用当前实例。一旦部署完成,在web浏览器上打开AzureFunctionsURL,你就会看到SwaggerUI页面。部署AzureFunction应用-Linux这一次,让我们将相同的应用程序部署到Linux实例。除此之外,让我们使用GitHubActions。为了做到这一点,你必须将这个应用程序上传到GitHub存储库。因此,移动到"GitChanges"窗格并创建一个Git仓库。如果你已经在VisualStudio中登录了GitHub,你就可以创建一个存储库并推送代码。一旦推送了所有代码,请访问GitHub以检查您的存储库是否已实际上传所有代码。让我们回到发布屏幕,点击"➕New"按钮来创建一个新的发布配置文件。然后会出现一个类似的弹出窗口。这次让我们使用"AzureFunctionApp(Linux)"菜单。如前所述,您可以使用现有的实例或创建新的实例。我们就用现有的吧。在前面的部署练习中,我们没有GitHub存储库。因此,我们不得不使用本地部署的方法。但这一次,我们有GitHub存储库,这意味着我们有选择。因此,这次我们不选择相同的部署方法,而是选择GitHubActions。GitHubActions工作流现已自动生成。但这需要一个新的commit。移至"GitChanges"窗格,输入如下所示的提交消息,单击"CommitAll"按钮,然后推送更改。当您实际访问您的GitHub存储库时,您的GitHub操作工作流会运行buil和部署。一旦部署结束,打开一个新的web浏览器,访问AzureFunctions应用程序URL,并发现SwaggerUI页面被正确地呈现。到目前为止,我们已经学习了如何创建一个支持OpenAPI的AzureFunctions应用程序,在.Net5独立的工作环境中运行,并无需离开VisualStudio就将其部署到Azure。我猜理论上它也可以在。Net6上很好运行。如果你好奇,请部署它,并在https://github.com/Azure/azure-functions-openapi-extension/issues上告诉我们!参考资料Github存储库:AzureFunctionsOpenAPI扩展Microsoft文档:在VisualStudio中使用AzureFunction和API管理集成创建无服务器API(预览版)Microsoft学习平台:AzureFunctions:发现OpenAPI和Power应用

一、了解Windows UI3.0

看了几篇关于微软关于WinUI3.0介绍和路线图,整理如下:WinUI是适用于Windows的现代本机UI平台,具有两个活跃的代系:WinUI3:最新的第3代WinUI,作为Windows应用SDK的一部分,提供与操作系统分离的整个WinUIstack。WinUI2:用于UWP应用的上一代WinUIstack,由直接内置于Windows10操作系统中的XAML和可视化层,以及基于操作系统构建的控件库组成,通过NuGet交付并托管在此存储库中。WinUI2将继续通过错误、可靠性和安全性修复程序获得支持。有关WinUI2和3之间差异的详细信息,请查看比较表WinUI的优势Windows运行于windiows环境,相对稳定。它是一个经过全面测试和验证的UI平台,为操作系统环境和10亿多台Windows10和11PC,XBoxOne,HoloLens,SurfaceHub和其他设备的基本体验提供支持。FluentDesignWinUI是Windows上FluentDesignSystem的最终来源。它还将支持最新的构图和渲染创新,如矢量动画,效果,阴影和照明。新功能向后兼容性新的WinUI而无需等待用户运行Windows的最新更新。本机开发支持WinUI可以与.NET一起使用,但不依赖于.NET:WinUI是100%C++并且可以在非托管Windows应用中使用,例如通过C++/WinRT使用标准C++17。更频繁的更新WinUI计划大约每6个月发布一次,每个稳定版本至少有两个预览版本。开源开发和社区参与WinUI2控件库已经在GitHub上开源,我们还计划将完整的WinUI3框架添加到此存储库中。你可以直接与Microsoft的核心工程团队联系,并提供错误报告、功能创意甚至代。。WinUI3的三个主要用例实现现有应用的现代化使你能够使用即将发布的XamlIslands按照自己的节奏使用现代WindowsUI扩展现有的Win32(WPF、WinForms、MFC...)应用。创建新的Windows应用(个人推荐)使你能够利用Windows应用SDK提供的灵活性轻松创建新的现代Windows应用启用其他框架在Windows上运行时,为其他框架(如ReactNative和.NETMAUI)提供本机实现。2022年的主要关注领域在2022年,我们的首要目标是通过提高整体可靠性和增加整个行业的使用量,在1.0版本的基础上进行构建。为此,我们今年将专注于三个领域:发布WinAppSDK1.1和1.2,其中包含一系列新的增强功能和功能,专注于使第一组基于WinAppSDK的行业领先的应用程序能够推向市场。在微软自己的产品中扩大WinUI3的使用,包括内置和随Windows一起提供的应用程序,以及Windows操作系统外壳本身。让我们自己的团队亲身体验该平台将帮助我们快速改进每个人的产品。继续努力使WinAppSDK和WinUI3可用于.NETMAUI和ReactNativeforWindows生态系统。按版本划分的功能功能描述0.5Version0.8Version1.0Version在使用Windows应用SDK的任何应用中均受支持🟢🟢🟢包含来自WinUI2.6的新Windows11控件/样式🟢支持MSIX部署🟢🟢🟢支持无包(非MSIX)部署🟢适用于Windows10版本1809及更高版本🟢🟢🟢支持最新的.NET🟢🟢🟢支持ARM64🟢🟢🟢🟢🟢🟢智能感知,热重载,实时可视化树🔷🔷基于铬的WebView2🟢🟢🟢标题栏自定义🟢🟢🟢流畅的阴影🟢🟢🟢数据字段的输入验证🔷🔷🔷支持同一线程上的多个顶级窗口🔷🔷🟢支持不同线程上的多个顶级窗口🔷🔷🔷拖放🟢🟢🟢渲染目标位图🟢🟢🟢鼠标光标自定义🟢🟢🟢动画GIF支持🟢🟢🟢VirtualSurfaceImageSource(VSIS)支持🟢🟢🟢应用内亚克力🟢🟢🟢XAML群岛🔷🔷我们的目标是每六个月发布一次高质量的版本;随着即将发布的版本的工作开始,我们还将同时启动后续版本的计划。我们的下一个WinAppSDK版本将是1.1版本,预计将于2022年上半年(22H1)发布。此版本的主要功能包括:应用可以在同一UI线程上创建具有WinUI3内容的多个窗口。云母和亚克力样式可用于WinUI3内容。改进了默认和自定义标题栏,具有z顺序、大小调整/调整大小、高标题栏和扩展显示等新功能。使用Windows应用SDK的应用可以使用提升的权限运行。同时部署所有依赖项的应用现在还可以包含Windows应用SDK。(独立部署)无论应用是否打包/解包,或者应用是否在应用商店中发布,应用都可以推送通知。环境变量PATH和PATHEXT可以在运行时使用新的方便的API进行管理和跟踪。应用可以手动重新启动,也可以将自身注册为在系统更新发生时正在运行时重新启动。1.2功能列表旨在于2022年底发布,将在未来的路线图更新中共享。

CTF-记录一下自己见过的各种加密

Base64:1.标准base64只有64个字符(英文大小写、数字和+、/)以及后缀“=”2.base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除3.等号一定用作后缀,且数目一定是0个、1个或2个。Base32:1.大于3个=号2.只有英文大写常见Base解密地址:http://ctf.ssleye.com/base64.htmlBase100:一堆emjoy表情,像这样📟💶💐📜💧💨📝💏💦👙👘👪👜🐨🐧🐧📜💇💎解密地址:http://www.atoolbox.net/Tool.php?Id=936MD5编码:1.要么全为大写,要么全为小写2.字符数量16/323.MD5的取值范围是0~9 a~f解密地址:https://cmd5.com/凯撒密码:1.它只位移字母解密地址:https://www.qqxiuzi.cn/bianma/kaisamima.php需要注意:有的CTF题需要通过MD5是32位加密提交,而有在线解密会全部解密成小写,MD5加密相同字母的大写和小写是完全不一样的。培根密码:1.一串字符里全是A和B,并且5个一组。培根加密只能加密字母。当铺密码:特点字大部分比较简单,多为横竖组合的汉字二进制转字符串/摩斯密码如果有一大串加密都是0和1,那么多半是这俩没跑了,区别就是前者是有规律的,后者好像没什么规律。当然正常的摩斯密码是这样的:--/---/.../../--/../--/.- 很好认二进制转字符串:http://www.txttool.com/wenben_binarystr.asp摩斯密码:需要对照摩斯密码和ASCII码表,建议自己写脚本去跑,当然网上是能搜到的

10 个超棒的 JavaScript 简写技巧

今天我要分享的是10个超棒的JavaScript简写方法,可以加快开发速度,让你的开发工作事半功倍哦。开始吧!1.合并数组普通写法:我们通常使用Array中的concat()方法合并两个数组。用concat()方法来合并两个或多个数组,不会更改现有的数组,而是返回一个新的数组。请看一个简单的例子:letapples=['🍎','🍏'];letfruits=['🍉','🍊','🍇'].concat(apples);console.log(fruits);//=>["🍉","🍊","🍇","🍎","🍏"]简写方法:我们可以通过使用ES6扩展运算符(...)来减少代码,如下所示:letapples=['🍎','🍏'];letfruits=['🍉','🍊','🍇',...apples];//<--hereconsole.log(fruits);//=>["🍉","🍊","🍇","🍎","🍏"]得到的输出与普通写法相同。2.合并数组(在开头位置)普通写法:假设我们想将apples数组中的所有项添加到Fruits数组的开头,而不是像上一个示例中那样放在末尾。我们可以使用Array.prototype.unshift()来做到这一点:letapples=['🍎','🍏'];letfruits=['🥭','🍌','🍒'];//AddallitemsfromapplesontofruitsatstartArray.prototype.unshift.apply(fruits,apples)console.log(fruits);//=>["🍎","🍏","🥭","🍌","🍒"]现在红苹果和绿苹果会在开头位置合并而不是末尾。简写方法:我们依然可以使用ES6扩展运算符(...)缩短这段长代码,如下所示:letapples=['🍎','🍏'];letfruits=[...apples,'🥭','🍌','🍒'];//<--hereconsole.log(fruits);//=>["🍎","🍏","🥭","🍌","🍒"]3.克隆数组普通写法:我们可以使用Array中的slice()方法轻松克隆数组,如下所示:letfruits=['🍉','🍊','🍇','🍎'];letcloneFruits=fruits.slice();console.log(cloneFruits);//=>["🍉","🍊","🍇","🍎"]简写方法:我们可以使用ES6扩展运算符(...)像这样克隆一个数组:letfruits=['🍉','🍊','🍇','🍎'];letcloneFruits=[...fruits];//<--hereconsole.log(cloneFruits);//=>["🍉","🍊","🍇","🍎"]4.解构赋值普通写法:在处理数组时,我们有时需要将数组“解包”成一堆变量,如下所示:letapples=['🍎','🍏'];letredApple=apples[0];letgreenApple=apples[1];console.log(redApple);//=>🍎console.log(greenApple);//=>🍏简写方法:我们可以通过解构赋值用一行代码实现相同的结果:letapples=['🍎','🍏'];let[redApple,greenApple]=apples;//<--hereconsole.log(redApple);//=>🍎console.log(greenApple);//=>🍏5.模板字面量普通写法:通常,当我们必须向字符串添加表达式时,我们会这样做://Displaynameinbetweentwostringsletname='Palash';console.log('Hello,'+name+'!');//=>Hello,Palash!//Add&Subtracttwonumbersletnum1=20;letnum2=10;console.log('Sum='+(num1+num2)+'andSubtract='+(num1-num2));//=>Sum=30andSubtract=10简写方法:通过模板字面量,我们可以使用反引号(),这样我们就可以将表达式包装在${...}`中,然后嵌入到字符串,如下所示://Displaynameinbetweentwostringsletname='Palash';console.log(`Hello,${name}!`);//<--Noneedtouse+var+anymore//=>Hello,Palash!//Addtwonumbersletnum1=20;letnum2=10;console.log(`Sum=${num1+num2}andSubtract=${num1-num2}`);//=>Sum=30andSubtract=106.For循环普通写法:我们可以使用for循环像这样循环遍历一个数组:letfruits=['🍉','🍊','🍇','🍎'];//Loopthrougheachfruitfor(letindex=0;index<fruits.length;index++){console.log(fruits[index]);//<--getthefruitatcurrentindex}//=>🍉//=>🍊//=>🍇//=>🍎简写方法:我们可以使用for...of语句实现相同的结果,而代码要少得多,如下所示:letfruits=['🍉','🍊','🍇','🍎'];//Usingfor...ofstatementfor(letfruitoffruits){console.log(fruit);}//=>🍉//=>🍊//=>🍇//=>🍎7.箭头函数普通写法:要遍历数组,我们还可以使用Array中的forEach()方法。但是需要写很多代码,虽然比最常见的for循环要少,但仍然比for...of语句多一点:letfruits=['🍉','🍊','🍇','🍎'];//UsingforEachmethodfruits.forEach(function(fruit){console.log(fruit);});//=>🍉//=>🍊//=>🍇//=>🍎简写方法:但是使用箭头函数表达式,允许我们用一行编写完整的循环代码,如下所示:letfruits=['🍉','🍊','🍇','🍎'];fruits.forEach(fruit=>console.log(fruit));//<--Magic✨//=>🍉//=>🍊//=>🍇//=>🍎大多数时候我使用的是带箭头函数的forEach循环,这里我把for...of语句和forEach循环都展示出来,方便大家根据自己的喜好使用代码。8.在数组中查找对象普通写法:要通过其中一个属性从对象数组中查找对象的话,我们通常使用for循环:letinventory=[{name:'Bananas',quantity:5},{name:'Apples',quantity:10},{name:'Grapes',quantity:2}];//Gettheobjectwiththename`Apples`insidethearrayfunctiongetApples(arr,value){for(letindex=0;index<arr.length;index++){//Checkthevalueofthisobjectproperty`name`issameas'Apples'if(arr[index].name==='Apples'){//=>🍎//Amatchwasfound,returnthisobjectreturnarr[index];}}}letresult=getApples(inventory);console.log(result)//=>{name:"Apples",quantity:10}简写方法:哇!上面我们写了这么多代码来实现这个逻辑。但是使用Array中的find()方法和箭头函数=>,允许我们像这样一行搞定://Gettheobjectwiththename`Apples`insidethearrayfunctiongetApples(arr,value){returnarr.find(obj=>obj.name==='Apples');//<--here}letresult=getApples(inventory);console.log(result)//=>{name:"Apples",quantity:10}9.将字符串转换为整数普通写法:parseInt()函数用于解析字符串并返回整数:letnum=parseInt("10")console.log(num)//=>10console.log(typeofnum)//=>"number"简写方法:我们可以通过在字符串前添加+前缀来实现相同的结果,如下所示:letnum=+"10";console.log(num)//=>10console.log(typeofnum)//=>"number"console.log(+"10"===10)//=>true10.短路求值普通写法:如果我们必须根据另一个值来设置一个值不是falsy值,一般会使用if-else语句,就像这样:functiongetUserRole(role){letuserRole;//Ifroleisnotfalsyvalue//set`userRole`aspassed`role`valueif(role){userRole=role;}else{//elsesetthe`userRole`asUSERuserRole='USER';}returnuserRole;}console.log(getUserRole())//=>"USER"console.log(getUserRole('ADMIN'))//=>"ADMIN"简写方法:但是使用短路求值(||),我们可以用一行代码执行此操作,如下所示:functiongetUserRole(role){returnrole||'USER';//<--here}console.log(getUserRole())//=>"USER"console.log(getUserRole('ADMIN'))//=>"ADMIN"基本上,expression1||expression2被评估为真表达式。因此,这就意味着如果第一部分为真,则不必费心求值表达式的其余部分。补充几点箭头函数如果你不需要this上下文,则在使用箭头函数时代码还可以更短:letfruits=['🍉','🍊','🍇','🍎'];fruits.forEach(console.log);在数组中查找对象你可以使用对象解构和箭头函数使代码更精简://Gettheobjectwiththename`Apples`insidethearrayconstgetApples=array=>array.find(({name})=>name==="Apples");letresult=getApples(inventory);console.log(result);//=>{name:"Apples",quantity:10}短路求值替代方案constgetUserRole1=(role="USER")=>role;constgetUserRole2=role=>role??"USER";constgetUserRole3=role=>role?role:"USER";最后,我想借用一段话来作结尾:代码之所以是我们的敌人,是因为我们中的许多程序员写了很多很多的狗屎代码。如果我们没有办法摆脱,那么最好尽全力保持代码简洁。如果你喜欢写代码——真的,真的很喜欢写代码——你代码写得越少,说明你的爱意越深。欢迎关注我的公众号:前端新世界只关注前端技术,每日分享JS/CSS技术教程;Vue、React、jQuery等前端开发组件

Codeforces Round #594 (Div. 1) C. Queue in the Train 模拟

C.QueueintheTrainThereare𝑛seatsinthetrain'scarandthereisexactlyonepassengeroccupyingeveryseat.Theseatsarenumberedfrom1to𝑛fromlefttoright.Thetripislong,soeachpassengerwillbecomehungryatsomemomentoftimeandwillgototakeboiledwaterforhisnoodles.Thepersonatseat𝑖(1≤𝑖≤𝑛)willdecidetogoforboiledwateratminute𝑡𝑖.Tankwithaboiledwaterislocatedtotheleftofthe1-stseat.Incasetoomanypassengerswillgoforboiledwatersimultaneously,theywillformaqueue,sincetherecanbeonlyonepassengerusingthetankateachparticularmomentoftime.Eachpassengerusesthetankforexactly𝑝minutes.Weassumethatthetimeittakespassengerstogofromtheirseattothetankisnegligiblysmall.Nobodylikestostandinaqueue.Sowhenthepassengeroccupyingthe𝑖-thseatwantstogoforaboiledwater,hewillfirsttakealookonallseatsfrom1to𝑖−1.Incaseatleastoneofthoseseatsisempty,heassumesthatthosepeoplearestandinginaqueuerightnow,sohewouldbebetterseatingforthetimebeing.However,attheveryfirstmomentheobservesthatallseatswithnumberssmallerthan𝑖arebusy,hewillgotothetank.Thereisanunspokenrule,thatincaseatsomemomentseveralpeoplecangotothetank,thanonlytheleftmostofthem(thatis,seatingontheseatwithsmallestnumber)willgotothetank,whileallotherswillwaitforthenextmoment.Yourgoalistofindforeachpassenger,whenhewillreceivetheboiledwaterforhisnoodles.InputThefirstlinecontainsintegers𝑛and𝑝(1≤𝑛≤100000,1≤𝑝≤109)—thenumberofpeopleandtheamountoftimeonepersonusesthetank.Thesecondlinecontains𝑛integers𝑡1,𝑡2,…,𝑡𝑛(0≤𝑡𝑖≤109)—themomentswhenthecorrespondingpassengerwillgofortheboiledwater.OutputPrint𝑛integers,where𝑖-thofthemisthetimemomentthepassengeron𝑖-thseatwillreceivehisboiledwater.Exampleinput531403109426280output31462812569421570NoteConsidertheexample.Atthe0-thminutethereweretwopassengerswillingtogoforawater,passenger1and5,sothefirstpassengerhasgonefirst,andreturnedatthe314-thminute.Atthismomentthepassenger2wasalreadywillingtogoforthewater,sothepassenger2hasgonenext,andsoon.Intheend,5-thpassengerwaslasttoreceivetheboiledwater.题意火车上面一共有n个人要打水,每个人会选择在t[i]的时间去打水,每次打水需要花费p的代价。每个人都不喜欢排队,如果这个人发现他前面有人没在座位上,他就不会去打水;如果有多个人同时去打水,序号小的会优先去排队;排队按照先后顺序打水。题解纯模拟题,维护一个打水的优先队列,维护一个排队的队列,维护一个等待序列。然后模拟模拟就好了。那么问题来了,这道题真的值div1C的难度吗代码#include<bits/stdc++.h>usingnamespacestd;priority_queue<pair<longlong,int>>Q1;priority_queue<int>Q2;set<int>EmptyQueue;queue<int>Q3;constintmaxn=1e5+7;intn;longlongp;longlongans[maxn];intmain(){scanf("%d%lld",&n,&p);for(inti=0;i<n;i++){longlongt;scanf("%lld",&t);Q1.push(make_pair(-t,-i));}longlongnow=0;while(!Q1.empty()||!Q2.empty()||!Q3.empty()){if(Q3.empty()&&Q2.empty()){now=max(now,-Q1.top().first);}while(!Q1.empty()&&-Q1.top().first<=now+p){if(EmptyQueue.empty()||(*EmptyQueue.begin()>-Q1.top().second)){Q3.push(-Q1.top().second);EmptyQueue.insert(-Q1.top().second);}else{Q2.push(Q1.top().second);}Q1.pop();}if(!Q3.empty()){ans[Q3.front()]=now+p;now=now+p;EmptyQueue.erase(Q3.front());Q3.pop();}if(!Q2.empty()&&Q3.empty()){Q3.push(-Q2.top());EmptyQueue.insert(-Q2.top());Q2.pop();}}for(inti=0;i<n;i++)cout<<ans[i]<<"";cout<<endl;}

【python代码】只是打印

print('观音:孙悟空,你根本不想去取西经,也不能原谅你欺师灭祖的行为')print('唐三藏:姐姐,这是你的不对了')print('观音:😱😱😱')print('唐三藏:悟空🐒他要吃我,只不过是一个构思,还没有成为事实')print('唐三藏:你又没有证据,他又何罪之有呢')print('唐三藏:不如等他吃了我之后,你有凭有据,再定他的罪也不迟啊😀')print('观音:😡,唐三藏,你啰嗦我早就知道,不过没想到你居然这么啰嗦')

Codeforces Round #599 (Div. 1) B. 0-1 MST 图论

D.0-1MSTUjanhasalotofuselessstuffinhisdrawers,aconsiderablepartofwhicharehismathnotebooks:itistimetosortthemout.Thistimehefoundanolddustygraphtheorynotebookwithadescriptionofagraph.Itisanundirectedweightedgraphon𝑛vertices.Itisacompletegraph:eachpairofverticesisconnectedbyanedge.Theweightofeachedgeiseither0or1;exactly𝑚edgeshaveweight1,andallothershaveweight0.SinceUjandoesn'treallywanttoorganizehisnotes,hedecidedtofindtheweightoftheminimumspanningtreeofthegraph.(Theweightofaspanningtreeisthesumofallitsedges.)CanyoufindtheanswerforUjansohestopsprocrastinating?InputThefirstlineoftheinputcontainstwointegers𝑛and𝑚(1≤𝑛≤105,0≤𝑚≤min(𝑛(𝑛−1)2,105)),thenumberofverticesandthenumberofedgesofweight1inthegraph.The𝑖-thofthenext𝑚linescontainstwointegers𝑎𝑖and𝑏𝑖(1≤𝑎𝑖,𝑏𝑖≤𝑛,𝑎𝑖≠𝑏𝑖),theendpointsofthe𝑖-thedgeofweight1.Itisguaranteedthatnoedgeappearstwiceintheinput.OutputOutputasingleinteger,theweightoftheminimumspanningtreeofthegraph.Examplesinput6111314151623242526343536output2input30output0NoteThegraphfromthefirstsampleisshownbelow.Dashededgeshaveweight0,otheredgeshaveweight1.Oneoftheminimumspanningtreesishighlightedinorangeandhastotalweight2.Inthesecondsample,alledgeshaveweight0soanyspanningtreehastotalweight0.题意现在有n个点的完全图,其中m条边的长度是1,其他都是0;问你这个图的最小生成树的代价是多少?题解考虑一下最小生成树,实际上在这道题可以理解为0边的联通块一共有多少个,如果有k个,那么答案就是k-1.然后代码需要优化一下,我们维护两个集合,一个集合是当前已经聚合成连痛块的点,和一堆还在外面没有讨论过的点。考虑均摊,我们每个点只会访问一次,每条边也只会访问一次,那么复杂度就是(n+m)logn<----set的复杂度。但这个vis数组的复杂度有点迷,不太会算。。。代码#include<bits/stdc++.h>usingnamespacestd;constintmaxn=100005;set<int>g[maxn];set<int>vis;intu[maxn];voiddfs(intx){u[x]=1;vis.erase(x);vector<int>ret;for(intp:vis){if(!g[x].count(p)){ret.push_back(p);}}for(intt:ret){vis.erase(t);}for(intt:ret){u[t]=1;dfs(t);}}intmain(){intn,m;cin>>n>>m;for(inti=0;i<m;i++){intx,y;cin>>x>>y;x--,y--;g[x].insert(y);g[y].insert(x);}for(inti=0;i<n;i++){vis.insert(i);}intans=0;for(inti=0;i<n;i++){if(!u[i]){ans++;dfs(i);}}cout<<ans-1<<endl;}

f第一天,学习Markdown

立一个flag每天写一篇博客2022.4.28新人报道,先给自己起个名字:运甓写博客第一天,先水一篇今天学习Markdown语法csdnctrl+k+v快速打开右侧预览(vscode)Ctrl+k+0折叠所有标题(vscode)ctrl+k+j回复折叠(vscode)[/toc]制作目录倾斜加粗Ctrl+b倾斜加粗下划线分级标题/#最多分六级分割线代码块#include<cstdio.h>intmain(){print("hello,world!");return0;}一行中使用代码,用一个代码helloworld删除线高亮下划线表情包😄😃😏😟😑😉现在还不会用脚注,第一天就写到这吧!明天见

NOIP提高组模拟赛18

求和等差数列求和,直接乘会炸\(ull\),需要龟速乘(考试时候懒得打高精主要是不会,也忘了有龟速乘这个东西.......)code#include<cstdio>#include<cstring>usingnamespacestd;typedefunsignedlonglongull;ullx,y,x2,y2,mod;ullslow(ullx,ully){ullans=0;while(y){if(y&1)ans=(ans+x)%mod;x=(x+x)%mod;y>>=1;}returnans;}intmain(){freopen("sum.in","r",stdin);freopen("sum.out","w",stdout);scanf("%llu%llu%llu%llu%llu",&x,&y,&x2,&y2,&mod);ullans=(x+y-1);ullh=x2-x+1;ullz=y2-y+1;ullghs=slow(h,z);ans=slow(ans,ghs);ullh1=h-1,h2=h;if(h&1)h1>>=1;elseh2>>=1;ullyh=slow(h1,h2);ans=(ans+slow(yh,z))%mod;ullz1=z-1,z2=z;if(z&1)z1>>=1;elsez2>>=1;ullres=slow(z2,z1);res=slow(res,h);ans=(ans+res)%mod;printf("%llu\n",ans);return0;}B.分组配对有个贪心就是能多选一定多选,然后因为区间连续,就从左边开始判断即可。因为排序不等式,最大的与最大的相乘,次大的与次大的相乘......这样得到的是最大值显然满足二分性,但是直接二分会$TLE4优化是倍增+二分,看起来复杂了,但是时间复杂度确实小了先倍增锁定二分区间,然后二分,\(check\)不变code#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongll;constintmaxn=500005;lln,m;lla[maxn],b[maxn];llaa[maxn],bb[maxn];boolcheck(intl,intr){for(inti=l;i<=r;++i)aa[i]=a[i];for(inti=l;i<=r;++i)bb[i]=b[i];sort(aa+l,aa+r+1);sort(bb+l,bb+r+1);boolflag=1;llsum=0;for(inti=l;i<=r;++i){sum+=1ll*aa[i]*bb[i];if(sum>m){flag=0;break;}}returnflag;}intwork(){intnow=1,ans=0;while(now<=n){intl=now,r=n;for(inti=1;now+(1<<i)-1<=n;++i)if(!check(now,now+(1<<i)-1)){l=now+(1<<(i-1))-1;r=now+(1<<i)-1;break;}while(l<r){intmid=(l+r+1)>>1;if(check(now,mid))l=mid;elser=mid-1;}++ans;now=l+1;}returnans;}intmain(){freopen("pair.in","r",stdin);freopen("pair.out","w",stdout);scanf("%lld%lld",&n,&m);for(inti=1;i<=n;++i)scanf("%lld",&a[i]);for(inti=1;i<=n;++i)scanf("%lld",&b[i]);printf("%d\n",work());return0;}C.城市游戏神奇的\(dp\),有的地方写的挺假的,有些情况根本没考虑,但是仍然能\(A\),\(Cd\)大佬想\(hack\)但是根本\(hack\)不掉,我也是挺迷的解法倒是没啥大问题设\(f_i\)表示从\(i\)号点走到\(n\)号点,之前没有封过道路的最短距离小\(A\)在\(i\)号点,考虑\((i,j)\)这条边,如果\(B\)封路,那么处理出\(i\)不走这条边到达\(n\)的最短路\(dv_{i-j}\)来更新答案,如果不封路,那么就是\(f_j+val_{i->j}\)更新答案,因为\(B\)采取最优策略所以取\(max\)即\(max(f_j+val_{i->j},dv_{i-j})->f_i\)这是带环的\(DP\),使用\(Dijkstra\)计算答案如何求解\(d_{i-j}\)最短路径树的思想结合并查集进行解决具体方法如下:以\(𝑛\)为原点,进行一次最短路算法,并且在每个点上记录,从\(𝑛\)到这个点的最短路径的前驱,前驱有多个的话记录任意一个即可构造一张新图,每个点与自己记录的前驱,边的长度为在原图中这两个点之间的边的长度这样的连边过后会构造出一棵以点𝑛为根的有根树,被称为\(最短路径树\)最短路径树具有很多优秀的性质,其中最重要的一条性质是:树上的两个点如果具有父子关系,则树上这两个点之间的路径对应于原图中这两个点之间的一条最短路在求解\(𝑑_{𝑖-j}\)时,只有边\(𝑖,𝑗\)出现在树上的时候,这样的求解才有意义。否则\(𝑑_{𝑖-𝑗}\)就等于原图中\(𝑖\)到\(𝑛\)的最短路长度所以,余下的任务是:对树上的每条边,求出它被删掉后,从点𝑛到这条边连接着的儿子的最短路长度考虑删掉的边是\(𝑢,𝑣\)其中\(𝑢\)为父亲,\(𝑣\)为儿子。在\(𝑢<->𝑣\)被删掉以后,树被分为了两个连通块,一个是以𝑣为根的子树,另一个是剩余的部分如果想从点\(𝑛\)移动到点\(𝑣\),一定会经过一条跨越了两个连通块的边设这条边连接着第一个连通块内的点\(𝑎\),和第二个连通块的点\(𝑏\)那么,就有一条从点\(𝑛\)移动到点\(𝑣\)的路径\(𝑛−𝑏−𝑎−𝑣\)路径的长度是\(𝑑𝑖𝑠_𝑏+𝑙_{𝑎-𝑏}+𝑑𝑖𝑠_𝑎−𝑑𝑖𝑠_𝑣=𝑑𝑖𝑠_b+𝑑𝑖𝑠_𝑎+𝑙_{𝑎-𝑏}−𝑑𝑖𝑠_𝑣\)其中\(𝑑𝑖𝑠_𝑢\)表示点\(𝑛\)到点\(𝑢\)的最短路长度可以发现,上面的表达式中,前面几项和边𝑎,𝑏相关,而最后一项和\(𝑣\)有关。设\(𝑑𝑖𝑠𝑏+𝑑𝑖𝑠𝑎+𝑙𝑎,𝑏=𝑝(𝑎,𝑏)\)则在枚举了点𝑣后,我们的标是找到一条不在树上的边\((𝑎,𝑏)\)使\(𝑝(𝑎,𝑏)\)最小,且满足\(𝑎\)在\(𝑣\)的子树中而\(𝑏\)不在转变一个思路来求解上述问题。枚举边\((𝑎,𝑏)\),再考虑哪些点\(𝑣\)是可以选择的可以发现,可行的点\(𝑣\)应该在\(𝑎−𝑏\)的树链上,且不能是\(𝑎\)和\(𝑏\)的\(𝑙𝑐𝑎\)如果暴力地进行上述操作,时间复杂度不能接受(实际上能过)如果我们把边按\(𝑝(𝑎,𝑏)\)进行排序,按顺序对每条边的\(𝑎−𝑏\)树链上的点(不包括\(𝑙𝑐𝑎\))进行赋值,那么被赋值过一次的点就不需要再被赋值。以此条件进行优化:设\(𝐹[𝑢]\)表示\(𝑢\)及\(𝑢\)的祖先中,深度最大的还没被赋值过的点。每次点\(𝑢\)被赋值后,就执行\(𝐹𝑢=𝑓𝑎[𝑢]\)此时的\(𝐹[𝑢]\)并不是实时更新的,而是在我们需要获取\(𝐹[𝑢]\)的准确值时,不断查看\(𝐹[𝑢],𝐹[𝐹[𝑢]],𝐹[𝐹[𝐹[𝑢]]]\),...,直到找到\(𝐹[𝑣]=𝑣\)这玩意就跟并查集路径压缩一个道理code#include<cstdio>#include<cstring>#include<queue>#include<algorithm>usingnamespacestd;typedeflonglongll;constintmaxn=100005;constintmaxm=200005;constllinf=0x3f3f3f3f3f3f3f3f;priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>>q;structfsb{inta,b;llval;}fb[maxm<<2|1];structedge{intval,net,to;}e[maxm<<1|1];structed{intnet,to;}ee[maxn];boolcmp(fsbx,fsby){returnx.val<y.val;}intn,m,cnt,rem[maxn],head[maxn],tot=1,he[maxn],tott,f[maxn],fa[maxn][19],dep[maxn];lldv[maxn],d[maxn],ans[maxn];boolvis[maxn],is[maxm<<1|1];voidadd(intu,intv,intw){e[++tot].net=head[u];head[u]=tot;e[tot].val=w;e[tot].to=v;}voidad(intu,intv){ee[++tott].net=he[u];he[u]=tott;ee[tott].to=v;}voiddfs(intx){for(inti=1;i<=18;++i)fa[x][i]=fa[fa[x][i-1]][i-1];dep[x]=dep[fa[x][0]]+1;for(inti=he[x];i;i=ee[i].net){fa[ee[i].to][0]=x;dfs(ee[i].to);}}intLCA(intu,intv){if(dep[u]<dep[v])swap(u,v);intddep=dep[u]-dep[v];for(inti=18;i>=0;--i)if((1<<i)<=ddep)ddep-=(1<<i),u=fa[u][i];if(u==v)returnu;for(inti=18;i>=0;--i)if(fa[u][i]!=fa[v][i])u=fa[u][i],v=fa[v][i];returnfa[u][0];}intgf(intx){if(f[x]==x)returnx;returnf[x]=gf(f[x]);}voiddij(){d[n]=0;q.emplace(0,n);while(!q.empty()){intx=q.top().second;q.pop();if(vis[x])continue;for(inti=head[x];i;i=e[i].net){intv=e[i].to;if(d[v]>d[x]+e[i].val){d[v]=d[x]+e[i].val;rem[v]=i;q.emplace(d[v],v);}}}}voidDIJ(){memset(vis,0,sizeof(vis));ans[n]=0;q.emplace(0,n);while(!q.empty()){intx=q.top().second;q.pop();if(vis[x])continue;vis[x]=1;for(inti=head[x];i;i=e[i].net){intv=e[i].to;//if(ans[v]>max(ans[x]+e[i].val,is[i]?dv[v]:d[v])){if(ans[v]>max(ans[x]+e[i].val,dv[v])){//上边两个if都能AC,而且对拍拍不出错误,不是很理解,下面的这个显然是错误的,为什么答案是对的?//是因为非树边一定不会更新答案吗?但是直接不考虑非树边也是错的//更新出了非法状态但是得到了正确解???ans[v]=max(ans[x]+e[i].val,dv[v]);q.emplace(ans[v],v);}}}}intmain(){freopen("city.in","r",stdin);freopen("city.out","w",stdout);scanf("%d%d",&n,&m);for(inti=0;i<=n;++i)d[i]=inf;for(inti=0;i<=n;++i)ans[i]=inf;for(inti=0;i<=n;++i)dv[i]=inf;for(inti=1;i<=m;++i){intu,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}dij();for(inti=1;i<n;++i){ad(e[rem[i]^1].to,i);is[rem[i]]=is[rem[i]^1]=1;}dfs(n);for(inti=1;i<=n;++i)f[i]=i;for(inti=2;i<=tot;i+=2){if(is[i])continue;intu=e[i^1].to,v=e[i].to;fb[++cnt].val=e[i].val+d[u]+d[v];fb[cnt].a=u;fb[cnt].b=v;}sort(fb+1,fb+cnt+1,cmp);for(inti=1;i<=cnt;++i){intlca=LCA(fb[i].a,fb[i].b);intx=gf(fb[i].a);while(dep[x]>dep[lca]){dv[x]=fb[i].val-d[x];f[x]=fa[x][0];x=gf(x);}x=gf(fb[i].b);while(dep[x]>dep[lca]){dv[x]=fb[i].val-d[x];f[x]=fa[x][0];x=gf(x);}}DIJ();if(ans[1]==ans[0])printf("-1\n");elseprintf("%lld\n",ans[1]);return0;}简单计算数论牛逼题。。。题解几行,完了。。。。。然而他确实就这么简单,但是确实难想(还是我太菜)\(2\sum_{i=0}^p\lflooriq/p\rfloor=\sum_{i=0}^p\lflooriq/p\rfloor+\lfloor(p-i)q/p\rfloor\)\(=(p+1)*q-\sum_{i=0}^p[(p|qi)?0:1]\)\(=(p+1)*q-p+gcd(p,q)\)最后一步简单说一下\(p_1=p/gcd,q_1=q/gcd\)有\(p_1|q_1i\)则\(p_1|i\)那么有\(p/p_1=gcd\)个满足条件的code#include<cstdio>#include<cstring>usingnamespacestd;typedeflonglongll;llp,q;llgcd(llx,lly){returny==0?x:gcd(y,x%y);}intmain(){freopen("simplecalc.in","r",stdin);freopen("simplecalc.out","w",stdout);intT;scanf("%d",&T);for(intask=1;ask<=T;++ask){scanf("%lld%lld",&p,&q);printf("%lld\n",((p+1)*q-p+gcd(p,q))/2);}return0;}

RSA解密报错 javax.crypto.BadPaddingException: Decryption error

**************256加密后文字:bӷX)5hF2M5u2Y3)n:f-H#}K"=a9SL0ףޟZSDOp1ɗߙBh?@B3u$M.nףD,S6Z(E>rS{d$IMvo֘3|(iI{}>A_ܾεU2LoNM=fl#7gCjQA4b<&"/?!+************************

【RabbitMQ】

我是🌟廖志伟🌟,一名🌕Java开发工程师🌕、📝Java领域优质创作者📝、🎉CSDN博客专家🎉、🌹幕后大佬社区创始人🌹。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。🍊博主:java_wxid🍊博主:Java廖志伟🍊社区:幕后大佬文章目录一、RabbitMQ的基本概念,以及6种工作模式,消息确认机制二、6种工作模式一、理论二、代码三、消息确认机制:confirm状态和return状态一、理论二、代码二、Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)一、项目代码1.生产者1.项目架构图:2.pom.xml依赖:3.spring-rabbitmq-producer.xml:4.rabbitmq.properties:5.ProducerTest:2.消费者1.项目架构图2.pom.xml依赖:3.spring-rabbitmq-consumer.xml4.rabbitmq.properties5.ConsumerTest6.FanoutListener7.FanoutListener28.SpringDirectQueue9.SpringQueueListener10.TopicListenerOne11.TopicListenerTwo12.TopicListenerThree二、项目演示演示简单模式:演示广播模式:演示路由模式:演示通配符模式:三、消息可靠性投递1.rabbitmq整个消息投递的路径2.实现消息可靠性投递的步骤3.具体实现可靠消息投递的代码生产者消费者4.具体实现可靠消息投递的演示正常发消息Demo演示异常发消息Demo演示四、消息在消费端限流1.限流示例图2.实现步骤3.具体实现消费端限流代码消费者生成者4.具体实现消费端限流Demo演示启动消费者启动生产者查看消费者控制台日志异常情况,消费未进行签收五、TTL1.业务场景2.定义3.实现步骤4.通过RabbitMQ管理控制台页面实现Demo1.创建消息2.创建交换机3.将交换机和消息绑定4.发送消息5.通过代码实现TTL六、死信队列1.定义2.消息成为死信的三种情况3.队列绑定死信交换机4.代码实现七、延迟队列1.定义2.场景3.具体实现1.生产者2.消费者4.Demo演示八、消息积压1.场景2.解决方案九、消息幂等性1.定义2.解决方案三、Springboot集成RabbitMQ(直连模式,工作队列模式,发布订阅模式,路由模式,通配符模式一、集成步骤一、生产者:二、消费者:二、实现步骤1.项目架构图2.创建项目1.pom依赖2.application.properties配置3.config配置HelloWorldConfigFanoutConfigWorkConfigDirectConfigTopicConfig4.消费端component5.生产者controller三、演示步骤1.启动项目2.调用接口演示1.直连模式1.接口调用2.控制台打印2.工作队列模式1.接口调用2.控制台打印3.发布订阅模式(交换机类型:fanout)1.接口调用2.控制台打印4.路由工作模式(交换机类型:direct)1.接口调用2.控制台打印5.通配符模式(交换机类型:topic)1.接口调用2.控制台打印四、RabbitMQ集群搭建一、准备工作二、集群搭建1.集群搭建步骤2.集群搭建负载均衡-HAProxy搭建1.执行安装2.haproxy.cfg配置详解本文的大概内容:https://gitee.com/java_wxid/liaojava_wxid🍊社区地址:幕后大佬给读者大大的话我本身是一个很普通的程序员,放在人堆里,除了与生俱来的🌹盛世美颜🌹、所剩不多的发量,就剩下180的大高个了。就是我这样的一个人,默默坚持写博文也有好多年了,有句老话说的好,🌕牛逼之前都是傻逼式的坚持🌕。希望自己可以通过大量的作品,时间的积累,个人魅力、运气和时机,可以打造属于自己的🌟技术影响力🌟。同时也希望自己可以成为一个🎄懂技术🎄,🎄懂业务🎄,🎄懂管理🎄的综合型人才,作为项目架构路线的总设计师,掌控全局的🌕团队大脑🌕,技术团队中的🍊绝对核心🍊是我未来几年不断前进的目标。提示:以下都是资源分享,求个一键三连。面试资料福利大放送,🎉欢迎关注🔎点赞👍收藏⭐️留言📝,拜托了🙏,这对我真的很重要。点击:面试资料提取码:2021200套PPT模板福利大放送,🎉欢迎关注🔎点赞👍收藏⭐️留言📝,拜托了🙏,这对我真的很重要。点击:200套PPT模板提取码:2021提问的智慧福利大放送,🎉欢迎关注🔎点赞👍收藏⭐️留言📝,拜托了🙏,这对我真的很重要。点击:提问的智慧提取码:2021Java开发学习路线名称链接JavaSE点击:JavaSEMySQL专栏点击:MySQL专栏JDBC专栏点击:JDBC专栏MyBatis专栏点击:MyBatis专栏Web专栏点击:Web专栏Spring专栏点击:Spring专栏SpringMVC专栏点击:SpringMVC专栏SpringBoot专栏点击:SpringBoot专栏SpringCould专栏点击:SpringCould专栏Redis专栏点击:Redis专栏Linux专栏点击:Linux专栏Maven3专栏点击:Maven3专栏SpringSecurity5专栏点击:SpringSecurity5专栏更多专栏更多专栏,请到java_wxid主页查看P5学习路线图P6学习路线图P7学习路线图P8学习路线图以上四张图详细介绍了作为Java开发工作者所需要具备的知识技能,同学们学废了嘛,有想法系统学习的同学可以私聊我,🎉欢迎关注🔎点赞👍收藏⭐️留言📝。🍊博主:java_wxid🍊博主:Java廖志伟🍊社区:幕后大佬

【Docker/GitLab/Jenkins】

我是🌟廖志伟🌟,一名🌕Java开发工程师🌕、📝Java领域优质创作者📝、🎉CSDN博客专家🎉、🌹幕后大佬社区创始人🌹。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。🍊博主:java_wxid🍊博主:Java廖志伟🍊社区:幕后大佬Docker/GitLab/Jenkins一、docker安装二、配置docker对外端口三、安装配置gitlab四、安装配置jekins一、准备工作二、下载安装配置Jenkins五、jenkins主要的一些配置六、项目配置七、jekins迁移到另一台服务器上https://pan.baidu.com/s/1nAVgmke9RbF8MnXo33S72Q提取码:mvsq查看版本java-version上传maven到自定义目录,这里提供maven3.8.3的linux版本,从官网拉下来的链接:https://pan.baidu.com/s/1rC4NsMX5i0669_ONJV3MJA提取码:ek1p查看版本mvn-v关于git其实可以使用默认的git,进入到容器中通过以下命令进行查看git版本git--version当前也可以自行安装git,在docker容器启动的时候配置映射路径,并且在/etc/profile的path路径中添加git安装路径即可,可通过以下命令查看git安装路径whichgit需要注意的是docker容器每次重新启动,会将容器内部生成的sshkey移除掉,所以我们可以通过映射路径或者复制宿主机的sshkey到容器内部,也可以重新生成然后去到gitlab的sshkey配置。下面的邮箱为你github、gitee或者gitlab登录的邮箱,执行命令之后,连续三次回车即可生成,生成git的sshkey命令:ssh-keygen-trsa-C"java_wxid@aliyun.com"查询生成的sshkey的路径:cd~/.ssh外部配置的jdk和maven需要映射到jenkins容器,所以相关的配置也需要映射进去,所以需要提前在宿主机配置vim/etc/profile在最后一行添加java环境变量和maven环境变量###java环境配置exportJAVA_HOME=/opt/java/jdkexportJRE_HOME=$JAVA_HOME/jreexportCLASSPATH=./:JAVA_HOME/lib:$JRE_HOME/lib###maven环境配置exportM2_HOME=/opt/java/maven###git环境配置exportGIT_HOME=/opt/java/git###pathexportPATH=/bin:/usr/bin:/sbin:/usr/sbin:$JAVA_HOME/bin:$M2_HOME/bin:$GIT_HOME/bin:$PATH立即重载配置source/etc/profile查看版本信息mvn-vLinux系统:第十三章:centos误删文件如何恢复文件数据。比如项目部署成功无法访问,排查项目是否成功运行,对日志进行排查排除项目启动错误导致的无法访问,对网络进行排查排查安全出口和入口等问题。如果觉得jenkins配置太过麻烦,可参考gitlab的CI:Linux系统:第十五章:gitlab集成CI。博主的心理话:这里还是要吐槽一下,这几天一直在弄二套CI流程(gitlab的ci和jenkins),踩坑无数,目前网络上面太多相同的文章了,搜索出来一页至少超过一半的文章,文章内容一模一样,剩下的就是排版乱的很,看都看不下去的那种,导致找到的解决方法的时间大大延长,希望未来这种环境能够有所改善。java_wxid🍊社区地址:幕后大佬给读者大大的话我本身是一个很普通的程序员,放在人堆里,除了与生俱来的🌹盛世美颜🌹、所剩不多的发量,就剩下180的大高个了。就是我这样的一个人,默默坚持写博文也有好多年了,有句老话说的好,🌕牛逼之前都是傻逼式的坚持🌕。希望自己可以通过大量的作品,时间的积累,个人魅力、运气和时机,可以打造属于自己的🌟技术影响力🌟。同时也希望自己可以成为一个🎄懂技术🎄,🎄懂业务🎄,🎄懂管理🎄的综合型人才,作为项目架构路线的总设计师,掌控全局的🌕团队大脑🌕,技术团队中的🍊绝对核心🍊是我未来几年不断前进的目标。提示:以下都是资源分享,求个一键三连。面试资料福利大放送,🎉欢迎关注🔎点赞👍收藏⭐️留言📝,拜托了🙏,这对我真的很重要。点击:面试资料提取码:2021200套PPT模板福利大放送,🎉欢迎关注🔎点赞👍收藏⭐️留言📝,拜托了🙏,这对我真的很重要。点击:200套PPT模板提取码:2021提问的智慧福利大放送,🎉欢迎关注🔎点赞👍收藏⭐️留言📝,拜托了🙏,这对我真的很重要。点击:提问的智慧提取码:2021Java开发学习路线名称链接JavaSE点击:JavaSEMySQL专栏点击:MySQL专栏JDBC专栏点击:JDBC专栏MyBatis专栏点击:MyBatis专栏Web专栏点击:Web专栏Spring专栏点击:Spring专栏SpringMVC专栏点击:SpringMVC专栏SpringBoot专栏点击:SpringBoot专栏SpringCould专栏点击:SpringCould专栏Redis专栏点击:Redis专栏Linux专栏点击:Linux专栏Maven3专栏点击:Maven3专栏SpringSecurity5专栏点击:SpringSecurity5专栏更多专栏更多专栏,请到java_wxid主页查看P5学习路线图P6学习路线图P7学习路线图P8学习路线图以上四张图详细介绍了作为Java开发工作者所需要具备的知识技能,同学们学废了嘛,有想法系统学习的同学可以私聊我,🎉欢迎关注🔎点赞👍收藏⭐️留言📝。🍊博主:java_wxid🍊博主:Java廖志伟🍊社区:幕后大佬

养猪日记 2021.11.2

Tuesday 晴今天上午下午各一门课,晚上也有课。上午上了《焊接机器人》,课上写了三道leetcode,最近刷题效率提高不少,比几十题时快多了。🐖最近睡眠不够,上午和我说她胸口不舒服,想中午先上九楼歇一会,让我自己去吃饭,我此时尚未意识到事情的严重性。我吃完饭回到九楼,🐖在写实验报告,对我十分冷漠,🐖生气了。下午🐖做完实验,我赶紧去接🐖,🐖向我吐露了这段时间对我积攒的不满,哭的可怜巴巴的。我一定多多关心🐖!最后通过红包抚慰了伤心的🐖。今天看了一会算法课,上了好几门课,有些累了。

睡前小甜蜜~

亲爱哒敏敏:今晚和研究社交网络领域的同性好友谈了一小时什么时候你有心情可以打电话一起讨论呀看看我能为你做什么作为研究者我可是不会废话的~早点休息哈,晚安~😘💖

开心

亲爱哒敏敏:离你更近好开心是你身情住我心我必如愿兑承诺望汝相信我之爱必将因你焕奇迹亲爱哒早点休息哈,晚安啦💖😘

养猪日记 2022.1.30

Sunday 晴今天周赛做上两道。5道算法题,3节MySQL课,4节内存管理课。面试题:C++基础语法:51~65.好困好困,晚安乖🐖,晚安🐖宝宝。1:54 安达

【设计模式】Java设计模式 - 外观模式

Java设计模式-外观模式😄不断学习才是王道🔥继续踏上学习之路,学之分享笔记👊总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN:一个有梦有戏的人👊准备将博客园、CSDN一起记录分享自己的学习心得!!!🌝分享学习心得,欢迎指正,大家一起学习成长!目录https://developer.aliyun.com/article/420326掘金https://juejin.cn/post/6844903680303431693今天的内容还算是简单好理解的,多看看,多动手理解就会更快!👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍

敏感词过滤方案那些事

      2月底,我辞了公司工作,开始为自己奋斗,立志在敏感词过滤方面走出一条路来。原以为凭借ToolGood.Words开源项目所领悟的算法及多年优化经验,我可以在3个月内快速完成,然而我用了6个月,在6个月内,我换了三套核心算法,每次重写都让人心身疲惫,甚至有点自我怀疑,一个人单干真得太难了。      敏感词过滤是一项非常复杂项目,而很多人却不这么认为。在去年我组建了一个【敏感信息过滤研究会】Q群,Q群不热闹,干贷却不少。以下为我总结出来几个现象:一,很多程序员认为开源免费的就是好的,就是一套可用的完整的技术,github上的星星就是最好的验证。盲目的使用ToolGood.Words项目,使用过一段时间就发现问题了,就来问我“生日”怎么是敏感词,我帮他检测了一下,告诉他这敏感词列表内有”日”字,要排除误测需要使用NLP来过滤。二,很多程序员认为宁可错杀,也不可放过一个,只要检测到第一个就判断有敏感词。真的心很大,不怕用户流失而扣奖金嘛。三,对企业来说数据保密很重要。我碰过一个程序员设置敏感词时,使用base64字符串,检测的文本也是base64字符串,一测试就出问题了,跟我说ToolGood.Word内存占用大,而且检测不准。原因很简单,转base64字符串,如【准】就转成【5YeG】,【1准】就转成【MeWHhg==】这个例子就很容易说明,内存大是字符变长,检测不准是转base64字符串后内容变得不一样了。技术小白可能不知道,文本转base64字符串是依据6位bit来转化的,而一个byte有8位bit,Base64编码是每3个原始字符编码成4个字符,当原始字符串长度不能被3整除,使用0来补充原始字符串。如【准】就转成【5YeG】,【1准】就转成【MeWHhg==】,四,对于网上敏感词过滤的吐槽,吐槽原因主要是“不准“,”太严了“。大厂也是吐槽对象。因为大厂的产品定位是严,否则会出现封站问题,名声越大负面消息传得越快。五、有不少网友跟我反馈,ToolGood.Words开源项目内的敏感词列表还是比较不错的,第一次听时,我比较诧异,那个敏感词列表是我随手找的,内有大量误判的敏感词。后来我明白了,小平台对敏感词过滤要求很低,目标客户目标范围都比较小,基本不会有涉政内容,能过滤95%的违规内容就可以了,也因为是目标范围小,一些误判的敏感词也涉及不到,而且大部分都有用户举报功能,最后,如百度这些搜索引擎也不会特意去显示违规内容。六,很多敏感词过滤企业开始往AI方面发展,原因很简单,领导认为使用DFA技术过滤信息是很low的,无法在客户面前吹牛。往AI方面发展有多少坑,下面我会讲一下。AI的路有多难走?      往AI方向发展是趋势,但绕不开性能问题,乘法、除法太耗运算资源了。所以企业都会选择DFA算法+AI算法。      AI算法的一个基础概念是词向量,词向量的维数少的可以取20,多的可以取500,汉字的组词实在太多了,很难全部训练完成,很多公司为了偷懒为了快速完成项目,都将单个汉字设为词向量,也就埋下了一个bug。      在某平台测试,会发现【买犊卖刀】是辱骂词,建议屏蔽。【买犊卖刀】原义:卖剑买牛。原指放下武器,从事耕种。后比喻改业务农或坏人改恶从善。为什么出现这种情况?原因很简单,训练词库内有大量含【卖】的脏词、以及大量含【犊】的脏字,两个合在一起就出问题了。      AI算法的局限主要来源训练数据样本不均衡,但这个问题是解决不了的,因为我们有口头、书面语,高频词、低频词,而且时代变迁,很多词的意思都带了上不同意思,如“公主”、“小姐”。每个公司的敏感词过滤定位不一样,决策也不一样。      敏感词过滤公司,以空间换时间,内存使用量达100多G,16K文本检测速度达到毫秒级。新闻平台对涉政文章是允许的,而小平台基本是不允许的。医疗平台对含器官、病症文章是允许的,而小平台基本是不允许的。游戏论坛对装备交流涉及武器、刀具是允许的,而小平台是不允许的。大平台对外部链接普遍保持开放态度,而小平台是不允许的。大平台对引流至公众号平台也是默许的,而小平台是不允许的。我对产品的定位是性能要高、内存使用量要小、单文件部署。性能要高、内存使用量要小,让我改了三次核心源码。内存从将class转成struct,将检测每一个int,string等有效范围,尝试bool代替int类型、int类型代替string类型;性能从一个个算法、一个个if、一个个循环中扣出来,一次次修改代码、生成应用、生成数据、测试准确性、测试性能、驳回修改,漫长又枯燥。。。现在已完成了目标,加载数据后内存使用量在100M以下,检测速度小文本(6-10字)每秒25W条,大文本(18W字)每秒5条,实际环境下,cpu、内存卡和网络传输都会影响性能。内存少了,敏感词却没少,是因为算法优秀。可以下文字去我的平台(toolgood.com)测试。拼接后的脏词有26303904组(约2630W)。c|C|⒞|c|ⓒ|C|C|ℂ|Ⓒ|с|С|𝐜|𝑐|𝚌|𝒸|𝒄|𝓬|𝕔|𝖼|𝗰|𝘤|𝙘|𝐂|𝐶|𝙲|𝒞|𝑪|𝓒|𝖢|𝗖|𝘊|𝘾|©a|A|⒜|ā|á|ǎ|à|a|ⓐ|A|A|Ⓐ|а|А|𝐚|𝑎|𝚊|𝒶|𝒂|𝓪|𝕒|𝖺|𝗮|𝘢|𝙖|𝐀|𝐴|𝙰|𝒜|𝑨|𝓐|𝔸|𝖠|𝗔|𝘈|𝘼|Α|αo|O|⒪|ō|ó|ǒ|ò|o|ⓞ|O|O|Ⓞ|о|О|𝐨|𝑜|𝚘|𝒐|𝓸|𝕠|𝗈|𝗼|𝘰|𝙤|𝐎|𝑂|𝙾|𝒪|𝑶|𝓞|𝕆|𝖮|𝗢|𝘖|𝙊|Ο|ο|σ㚷|伱|你|倪|呢|妮|妳|尼|您|拟|昵|汝|沵|泥|祢|迩|铌|鉨|your|you|亻尓|女尓|ni㐷|吗|嘛|妈|娘|嫲|嬷|杩|溤|犘|犸|玛|痲|码|祃|蔴|蚂|马|骂|鰢|鷌|麻|嚒|ma注:坚线为分隔符。后记:      我准备开写两个系列文章,《dotnet单文件部署》和《敏感词过滤简史》。全是实用干货哦。敏感词会随时间增多,这是一个不争的事实,社会上的一些极端分子总是喜欢造一些词羞辱别人。当然部分敏感词也会随时间消失。      敏感词过滤项目是一件助人的项目,净化网络,消除负面气息,避免人被请去喝茶。预告:下一篇文章《普通公司敏感词审核度制》

【MISC】放松一下吧——F5隐写

1、题目信息2、解题思路3、解题过程4、思路总结1、题目信息:描述: bugku{}2、解题思路:看题目是要下载一个文件,打开发现是一个游戏,那么一般思路就是先过关,然后看看有没有存档文件修改。另外就是看看能否反编译,或查看16进制。3、解题过程:下载得到文件放松一下吧.zip,无密码解压得到放松一下获得password吧.zip(无密码,由此可获的另一zip的密码)、你需要刷新.zip(有密码)解压放松一下获得password吧.zip,打开iwannagetthepassword.exe,你需要通过第一关,然后存档,会在文件夹中出现save1(2/3)文件,用记事本打开,发现数字2(代表是第几关卡),将其改为最后一关,再开游戏,即可得到如图: 得到你需要刷新.zip的密码:happy_i_wanna解压你需要刷新.zip文件,获得passwd.txt、你需要刷新.jpg,“你需要刷新”暗示使用F5-steganography-master反隐写,而密码就在passwd.txt中:password:🐭🐭🐭🐭🐭🐭🐭🐭贝斯的老大也可以解这个问题“贝斯的老大”指base100编码,将🐭🐭🐭🐭🐭🐭🐭🐭用下面的工具解密即可bugku工具-base100得到密码:66666666然后利用F5-steganography-master,下面给出下载链接:F5-steganography-master打开命令行,按如下图的样子操作(本人在windows下操作),会在F5-steganography-master文件夹中得到output.txt文件,flag就在其中flag:bugku{F5_and_i_wanna_is_so_cool}4、思路总结一般游戏类的题目大部分都是修改存档,所以这题还是比较常规。通过文件名提示了隐写类型是F5解码说了base的老大那就是base加密最大的base100了,看这个表情包也能猜到。

string、(integer,int)相互转换

JAVA中int转String类型有三种方法🔗java-String与Integer的相互转化

1 2 3 4 5 6 7 8 9 10 下一页