使用C#开发ChatGPT聊天程序

使用C#开发ChatGPT聊天程序

总体效果如下:

关键点1:无边框窗口拖动

Window中设置AllowsTransparency="True"Background="Transparent"以及WindowStyle="None"这样设置的话默认窗口的标题栏为不可见状态,且无法用鼠标拖动,使用windowChorme来解决

<WindowChrome.WindowChrome>
    <WindowChrome CaptionHeight="50" UseAeroCaptionButtons="False" />
</WindowChrome.WindowChrome>

该设置的详细讲解参见WPF之Window无边框拖动、特殊形状、Grid拖拽

关键点2:输入栏实现删除按钮

  1. 定义TextBox的ControlTemplate模板(节取重要部分)
<Style x:Key="TextBoxPromote" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border
                            x:Name="border"
                            CornerRadius="6"
                            <DockPanel LastChildFill="True">
                        	<!--新增btn按钮,并绑定Click事件-->
                                <Button
                                    x:Name="btn"
                                    Grid.Column="1"
                                    Background="White"
                                    BorderThickness="0"
                                    Click="Button_Click"
                                    Content="&#xe8d5;"
                                    DockPanel.Dock="Right"
                                    FontFamily="./img/#iconfont" />

                                <ScrollViewer
                                    x:Name="PART_ContentHost"
                                    DockPanel.Dock="Left"
                                    Focusable="false"
                                    HorizontalScrollBarVisibility="Hidden"
                                    VerticalScrollBarVisibility="Hidden" />
                            </DockPanel>
                        </Border>
                        <ControlTemplate.Triggers>
                           <!--新增DataTrigger,当Text属性部位为空时,不显示按钮,Hiddern表示不显示,但是用空格来代替按钮来保持布局,而Collapsed则是不显示且不保留空格-->
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="">
                                <Setter TargetName="btn" Property="Visibility" Value="Collapsed" />
                            </DataTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
  1. 实现Button按钮事件
private void Button_Click(object sender, RoutedEventArgs e)
{
    Button? btn = sender as Button;
    if (btn != null)
    {
        var parent = VisualTreeHelper.GetParent(btn);
        while (!(parent is TextBox))
        {
            parent = VisualTreeHelper.GetParent(parent);
        }
        TextBox txt = parent as TextBox;
        if (txt != null)
        {
            txt.Clear();
        }
    }
}

关键点3:ListBox实现聊天效果

本文使用ListBox来完成消息框的展示,因为涉及到发送和收到两种类型的消息,应该对应两种不同格式,所以会用到样式选择器,不知道怎么用的小伙伴可以看一下这篇文章WPF控件模板、数据模板、容器样式选择器。

  1. 定义选择器类
// 输入代码内容
  1. 在Windwo.Resources中定义数据模板

发送模板

<DataTemplate x:Key="chatSend">
    <StackPanel
        x:Name="SendMsg"
        Margin="0,12,20,0"
        HorizontalAlignment="Right"
        Orientation="Horizontal">
        <StackPanel Margin="0,0,10,0" Orientation="Vertical">
            <!--  消息内容  -->
            <Border
                MinWidth="50"
                MinHeight="30"
                MaxWidth="{Binding Path=ActualWidth,ElementName=borderWidth}"
                Background="#c8dd1f"
                BorderBrush="#ddd"
                BorderThickness="1"
                CornerRadius="8,0,8,8">
                <TextBox
                    MinWidth="30"
                    Margin="8"
                    VerticalAlignment="Center"
                    Background="Transparent"
                    BorderThickness="0"
                    FontSize="14"
                    IsReadOnly="True"
                    Text="{Binding Msg}"
                    TextWrapping="WrapWithOverflow" />
            </Border>
        </StackPanel>
        <!--  头像  -->
        <Border
            Width="35"
            Height="35"
            Margin="0,2,0,0"
            VerticalAlignment="Top"
            BorderThickness="0">
            <Border.Background>
                <ImageBrush ImageSource="/img/user.jpg" />
            </Border.Background>
        </Border>
    </StackPanel>
</DataTemplate>

接收模板

<DataTemplate x:Key="chatRes">
    <StackPanel
        x:Name="SendMsg"
        Margin="0,12,20,0"
        HorizontalAlignment="Right"
        Orientation="Horizontal">
        <!--  头像  -->
        <Border
                    Width="35"
                    Height="35"
                    Margin="0,2,0,0"
                    VerticalAlignment="Top"
                    BorderThickness="0">
                    <Border.Background>
                        <ImageBrush ImageSource="/img/图标ChatGPT.ico" />
                    </Border.Background>
                </Border>
        <StackPanel Margin="0,0,10,0" Orientation="Vertical">
            <!--  消息内容  -->
            <Border
                MinWidth="50"
                MinHeight="30"
                MaxWidth="{Binding Path=ActualWidth,ElementName=borderWidth}"
                Background="#c8dd1f"
                BorderBrush="#ddd"
                BorderThickness="1"
                CornerRadius="0,8,8,8">
                <TextBox
                    MinWidth="30"
                    Margin="8"
                    VerticalAlignment="Center"
                    Background="Transparent"
                    BorderThickness="0"
                    FontSize="14"
                    IsReadOnly="True"
                    MaxLength="25"
                    Text="{Binding Msg}"
                    TextWrapping="WrapWithOverflow" />
            </Border>
        </StackPanel>
    </StackPanel>
</DataTemplate>
  1. 因为发送消息和接受消息的对齐方式不同,一个是左一个是右,所以要定义下ListBox.ItemContainerStyle
<Style x:Key="listViewItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border
                    Name="Bd"
                    Margin="1"
                    Padding="{TemplateBinding Padding}"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    SnapsToDevicePixels="true">
                    <ContentPresenter
                        Margin="1"
                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <!--判断是否为发送,从而使用不同的对齐方式-->
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsSend}" Value="True">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </DataTrigger>
        <DataTrigger Binding="{Binding IsSend}" Value="False">
            <Setter Property="HorizontalContentAlignment" Value="Left" />
        </DataTrigger>
    </Style.Triggers>
</Style>
  1. 为了实现ListBox始终保持下拉到最后的状态,自定义类,重写OnItemsChanged方法
class ScrollingListBox : ListBox
{
    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems == null) return;
        var newItemCount = e.NewItems.Count;

        if (newItemCount > 0)
            this.ScrollIntoView(e.NewItems[newItemCount - 1]);

        base.OnItemsChanged(e);
    }
}
  1. XAML中设置
<!--  消息显示区  -->
<!--设置ScrollViewer.CanContentScroll="False"可以使得滚动条更加丝滑-->
<local:ScrollingListBox 
    Grid.Row="0"
    BorderBrush="#D3D3D3"
    BorderThickness="0,1,0,1"
    ItemsSource="{Binding Path=Messages, ElementName=mainWindow}"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
    ScrollViewer.CanContentScroll="False"
    SelectionMode="Extended">
    <ListBox.ItemTemplateSelector>
        <local:DateTemplateSelector ResTemplate="{StaticResource chatRes}" SendTemplate="{StaticResource chatSend}" />
    </ListBox.ItemTemplateSelector>
    <ListBox.ItemContainerStyle>
        <Style BasedOn="{StaticResource listViewItemStyle}" TargetType="{x:Type ListBoxItem}" />
    </ListBox.ItemContainerStyle>
</local:ScrollingListBox>
本文转载于网络 如有侵权请联系删除

相关文章

  • 一文详解文本语义相似度的研究脉络和最新进展

    每天给你送来NLP技术干货! 文本相似度任务处理步骤通过该领域的大量论文阅读,我认为处理文本相似度任务时可以分为一下三个步骤:预处理:如数据清洗等。此步骤旨在对文本做一些规范化操作,筛选有用特征,去除噪音。文本表示:当数据被预处理完成后,就可以送入模型了。在文本相似度任务中,需要有一个模块用于对文本的向量化表示,从而为下一步相似度比较做准备。这个部分一般会选用一些backbone模型,如LSTM,BERT等。学习范式的选择:这个步骤也是文本相似度任务中最重要的模块,同时也是区别于NLP领域其他任务的一个模块。其主要原因在于相似度是一个比较的过程,因此我们可以选用各种各样的比较的方式来达成目标。可供选择的学习方式有:孪生网络模型,交互网络模型,对比学习模型等。 文本相似度模型发展历程从传统的无监督相似度方法,到孪生模型,交互式模型,BERT,以及基于BERT的一些改进工作,如下图:总体来说,在BERT出现之前,文本相似度任务可以说是一个百花齐放的过程。大家通过各种方式来做相似度比较的都有。从BERT出现之后,由于BERT出色的性能,之后的工作主要是基于BERT的改进。在这个阶段,大家所

  • Angular 2 用户输入

    用户点击链接、按下按钮或者输入文字时,这些用户的交互行为都会触发DOM事件。本章中,我们将学习如何使用Angular事件绑定语法来绑定这些事件。绑定到用户输入事件我们可以使用Angular事件绑定机制来响应任何DOM事件。以下实例将绑定了点击事件:<button(click)="onClickMe()">点我!</button>复制等号左边的(click)表示把该按钮的点击事件作为绑定目标。等号右边,引号中的文本是一个模板语句完整代码如下:app/click-me.component.ts文件:import{Component}from'@angular/core'; @Component({ selector:'click-me', template:` <button(click)="onClickMe()">点我!</button> {{clickMessage}}` }) exportclassClickMeComponent{ clickMessa

  • 火了!这款免费、开源的终端资源监控器是真的牛逼...

    对于系统运维、维护或开发人员来说,能很好、清楚的了解系统各方面资源的使用情况,这也是一个IT人员必备的技能之一。对于Linux系统来说,我们在日常可以借助一些系统自带的命令工具,如:top、htop、iotop、iostat、ifstat、vmstat等等,有时候我也可以借助一些第三方的工具:「系统之眼!Linux系统性能监控工具Glances」来查看系统资源的利用情况。有一个好用的工具也是提高我们工作效率的一种手段。今天,民工哥就给大家介绍一款好用的、并且在UI设计上十分美观的终端资源监视器——Bpytop,Bpytop是bashtop的python版本。功能特点介绍易于使用,带有受游戏启发的菜单系统。完全支持鼠标,所有带有突出显示键的按钮都可单击,并且鼠标滚动可在进程列表和菜单框中使用。快速,反应灵敏的UI,带有UP,DOWN键可进行过程选择。用于显示所选进程的详细统计信息的功能。具有过滤过程的能力,可以输入多个过滤器。在排序选项之间轻松切换。将SIGTERM,SIGKILL,SIGINT发送到选定的进程。用于更改所有配置文件选项的UI菜单。网络使用情况的自动缩放图。如果有新版本可

  • Java虚拟机:类加载机制与双亲委派模型

    一、类加载机制:.java文件中的代码在编译后,就会生成JVM能够识别的二进制字节流class文件,class文件中描述的各种信息,都需要加载到虚拟机中才能被运行和使用。类加载机制,就是虚拟机把类的数据从class文件加载到内存,并对数据进行校检,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程。类从加载到虚拟机内存开始,到卸载出内存结束,整个生命周期包括七个阶段,如下图(每个过程作用见文章第四部分):二、类加载器:生命周期的第一阶段,即加载阶段需要由类加载器来完成的,类加载器根据一个类的全限定名读取类的二进制字节流到JVM中,然后生成对应的java.lang.Class对象实例,在虚拟机默认提供了3种类加载器,启动类加载器(BootstrapClassLoader)、扩展类加载器(ExtensionClassLoader)、应用类加载器(ApplicationClassLoader),如果有必要还可以加入自己定义的类加载器。(1)启动类加载器(BootstrapClassLoader):负责加载在<JAVA_HOME>\lib目录和被-Xbootclas

  • Centos安装jenkins及配置Nginx访问【部署工具】

    一、环境软件安装1.sudowget-O/etc/yum.repos.d/jenkins.repohttp://pkg.jenkins-ci.org/redhat/jenkins.repo2.sudorpm--importhttps://pkg.jenkins.io/redhat/jenkins.io.key3.sudoyuminstalljenkins4.sudoyuminstalljava5.所有安装完毕后,启动服务(当然也有其他启动方式)servicejenkinsstart复制servicenginxrestart复制二、相关内容介绍(如果第一步进行完毕的话)1.日志:/var/log/jenkins2.配置文件:/etc/sysconfig/jenkins3.服务配置文件:/etc/init.d/jenkins4.Jenkins源文件地址:/var/cache/jenkins/war/5.JenkinsWar包地址:/usr/lib/jenkins/jenkins.war三、配置nginx访问,以下贴出源码备注:了解nginx知识参考:https://my.oschina.n

  • playbook管理配置文件

    笔记内容:playbook管理配置文件 笔记日期:2018-01-3124.29/24.30playbook管理配置文件playbook管理配置文件上一篇文章中我们成功的通过playbook安装了nginx,而生产环境中大多时候是需要管理配置文件的,例如修改配置文件然后进行重启服务,修改配置文件时可能会出现误修改的情况,所以我们还需要准备一个回滚的操作。至于安装软件包只是在初始化环境的时候用一下。下面我们来写个管理nginx配置文件的playbook。1.创建相应的目录:[root@server~]#mkdir-p/etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks} [root@server~]#cd/etc/ansible/nginx_config/ [root@server/etc/ansible/nginx_config]#ls roles [root@server/etc/ansible/nginx_config]#lsroles/ newold [root@server/etc/ansibl

  • helm——工具使用举例

    一、helm支持的四种安装方法安装仓库中的chart包,命令举例:helminstallstable/xxx;通过tar包安装,命令举例:helminstallxxx-1.tgz(不推荐使用);通过chart本地目录安装,命令举例:helminstallxxx/xxx(一般是使用helmfetchstable/xxxxx下载相应的模板,然后使用tarzxf解压,修改解压后的目录中的valumes.yaml文件中的值,就是自定义服务了,这种方式比较常用);通过URL安装,不太常用,命令举例:helminstallhttps://xxxx/charts/xxx-1.gz。二、自定义Chart包举例//创建testchart包 [root@docker-k8s01~]#helmcreatetestchart //可以看到生成的目录下各种模板都有了,根据业务需求进行更改即可 [root@docker-k8s01~]#treetestchart/ testchart/ ├──charts ├──Chart.yaml ├──templates │  ├──deployment.yaml │  ├─

  • 【Gym 100015A】Another Rock-Paper-Scissors Problem

    题题意Sonny出石头剪刀布的猜拳策略是先出R,然后每连续两段都是打败前一段的出拳, 现在问你第n回合打败他要出什么。分析他的策略RPSPSRSRPPSRSRPRPSSRPRPSPSR……打败他的策略是PSRSRPRPSSRPRPSPSRRPRPSRSRP……一套策略1113399……第几轮1234-67-910-1819-27……如果n是介于3的某个次方的(1,2]倍,那就是n要打败n减去这个次方对应的拳,故+1(对应的是P就变成S,S就变成R,R就变成P)如果是(2,3]倍,那就+2(P变成R,R变成S,S变成P)。而我们要知道 n减去这个次方 对应的拳,就用递归去求了。可以用数组储存3的次方,数据范围n<=10^12,log310^12=25.15...,所以只要求到3的25次方即可。代码#include<stdio.h> longlongn,t[26]={1}; chars[4]="RPS"; intmain(){ for(inti=1;i<=25;i++) t[i]=t[i-1]*3; while(scanf("%I64d

  • 怎么实现单点登录?面试必问!

    来源:https://dwz.cn/d90vKSJE单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。我将以我所遇到的应用环境以及在其中所经历的各个阶段与大家分享,若有不足,希望各位不吝赐教。一、共享Session共享Session可谓是实现单点登录最直接、最简单的方式。将用户认证信息保存于Session中,即以Session内存储的值为用户凭证,这在单个站点内使用是很正常也很容易实现的,而在用户验证、用户信息管理与业务应用分离的场景下即会遇到单点登录的问题,在应用体系简单,子系统很少的情况下,可以考虑采用Session共享的方法来处理这个问题。这个架构我使用了基于Redis的Session共享方案。将Session存储于Redis上,然后将整个系统的全局CookieDomain设置于顶级域名上,这样SessionID就能在各个子系统间共享。分布式Session共享解决方案,这篇推荐大家看下。这个方案存在着严重的扩展性问题,首先,ASP.NET的S

  • 大牧絮叨设计模式:适配器模式

    [TOC]1、适配器模式概述适配器(Adapter)[GOF95]是一种类型之间互相协作的结构模式,旨在将使用服务的客户方的期望接口,通过适配的适配得到和服务方提供服务的接口相同的实现。注意:很多资料中都是基于服务端来讲解适配器模式的。 本篇文章中,我们将会带领大家从服务端、客户端两个方面理解什么是适配器,怎么操作适配器。 1.1、什么是适配器模式BGM:大雄最近购买了一个笔记本,打算出国旅游。<br/>DX:机器猫,一起出发去国外玩啦,好久没有出去过了呢!大雄机器猫JQM:好呀好呀,时间不早了,现在就出发吧,带上你用的所有的东西哈,出国了可不比国内。DX:早就带好啦,不过话说我遇到一个问题,我的笔记本电脑是咱们大天朝电源适配器,去了国外能用吗?大雄机器猫JQM:这你就OUT了吧,直接跟厂家联系,让给你再发一个X国的笔记本电脑的电源适配器不就好啦。DX:我知道啊,但是有个小问题,厂家怎么知道X国的电压是多少,它们怎么给我发合适的笔记本电源呢?大雄机器猫JQM:你个山炮,电源电压就是一种通用规范<br/>所有国家都按照自己国家的情况进行实现<br/>虽

  • 用完我即走,何日君再来?

    记得去年小程序内测伊始,所有人都对这个新事物充满期待,纷纷投入大量人力物力到小程序的研发中。然而现如今大半年过去了,大家却越来越看不懂了。未来不甚明了,但这也正是她的迷人之处。电商、社交、O2O都未必是我们想要的未来,但她仍然给我们提供了无限的可能。而作为开发者,最令人兴奋的莫过于可以以最小的成本,最快的速度上线一个自己想要的产品了。不过,作为个人开发者,如果没有公司资质的话,限制还是很多的。比如许多类目的限制,以及不能接入支付等等。笔者(笔者===姬小光)作为个人开发者实现的第一个小程序「种草君の共享清单」就因为类目限制几次三番被打回,这款小程序当时提交的时候选择的是“效率”类目,但是打回的原因基本都是:个人小程序不能涉及日记/备忘录类目。之后笔者(笔者===姬小光)联系了微信的朋友确认,主要是因为有用户产生内容,这里个人开发者无法保证内容的合规合法,也无法保证用户信息的安全,所以是禁止的。这个经历就导致后面小组在开发「Pickpick拾荒者」的时候,直接砍掉了用户输入纸条的功能。与此同时,我司的前端团队举办了首届小程序大赛,其中产生了许多优秀的个人小程序,如:「你画我懵」,「打卡接

  • 基于TensorFlow的循环神经网络生成矢量格式的伪造汉字

    基于sketch-rnn(LSTM和MDN)生成SVG格式的伪造汉字字符。代码详见GitHub。注意:对于中文汉字和日文汉字我根据具体情况交替使用它们。更新:宾夕法尼亚大学语言学院关于这项工作的讨论。这篇文章也被@weakish翻译成了简体中文。介绍这是记录我的实验的博客文章系列中的第三篇文章,实验是基于TensorFlow的。为了能更好地理解,可以阅读第一篇关于混合密度网络(MDNs)的文章,以及第二篇结合MDN生成伪造手写体的例子来写的关于长短期记忆网络的文章,关于伪造手写体,AlexGraves有一篇经典论文《GeneratingSequencesWithRecurrentNeuralNetworks》。我们将修改并扩展Graves的方法,使LSTM+MDN能够生成矢量格式的伪造汉字。方法的主要区别在于除了现有的笔划结束状态之外,还添加了对汉字内容结束状态的建模,并对这些小概率的笔的状态应用梯度提升来改进。动机作为一个在英语国家长大的小孩,小时候我会被父母逼着去上周六早上的课程,并在那里学习汉语。在课堂上会有听写测试,就是学生要凭记忆写出教科书上完整的课文。这使得我们间接的接触到

  • lamp环境一键安装搭建脚本

    #!/bin/bash #解压压缩包 yum-yinstallgccgcc-c++unzip unziplamp.zip mvlamp/ cd/lamp foriin`ls*.tar.gz` do tar-xf$i done unzip$(ls*.zip) YANZHENG(){ if[$?-ne0] then echo"$1安装失败">>/root/jieguo exit else echo"$1安装成功">>/root/jieguo fi } #安装libxml2 yum-yinstalllibxml2-develpython-devel cd/lamp/libxml2-2.9.1 ./configure--prefix=/usr/local/libxml2/&&make-j4&&makeinstall YANZHENGlibxml21 #安装libmcrypt cd/lamp/libmcrypt-2.5.8 ./configure--prefix=/usr/local/

  • 从两周发布上线到一周发布上线,如何做到高效稳定?

    早些年开发软件,一个版本发布上线的时间周期是以“月”甚至“年”为单位计的,但是现在随着敏捷开发的推行和普及,版本上线的周期变成了“周”为单位,甚至更短。周期缩短,并不意味着要牺牲质量,而是一样会有完善的开发流程来保障质量,比如设计、开发、自动化测试和手工测试。但是当缩短开发周期的时候,可能原本运行好好的开发流程就会出问题,软件质量下降,需要去重新调整开发流程,以重新做到高效和稳定。 在这里将向您分享一下我所在团队的经历,我们从两周一个发布周期,到每周一个发布周期,都遇到了什么问题和挑战,最终如何克服和解决的。希望能对您有所帮助启发。 在两周一个版本的迭代中,我们是进行项目开发的? 开发流程 在这里先简单介绍一下,我们两周一个Sprint的开发流程是什么样的。整个开发流程如图所示: Sprint计划和部署上一版本到生产环境 每个Sprint开始前,会先有一个计划会议,规划好当前Sprint要完成的新功能和要修复的Bug,这些任务都在Jira上用一条条Ticket记录和跟踪。 编码和分支管理 在计划好了后,紧接着是一整周的开发编码,这期间会对计划好的Tickets进行编码。我们是基于分支

  • Vim配置(python版)

    由于马上将用到django框架,需要有一个好的ide来coding,之前做C的开发时候体会到了vim的强大,所以编写python也决定采用vim。 PS:除了vim,一般浏览代码多用atom和sublime,具体可以自己google。 之前做C的项目时采用了spf13-vim,git地址:https://github.com/spf13/spf13-vim。喜欢的同学可以去下载。 这里由于环境限制,准备配置一套新的简单一些的vim。好久没有配置了,这里写个文档记录下来,重新温习一遍。   这里推荐一大神的配置http://sontek.net/blog/detail/turning-vim-into-a-modern-python-ide这个地址如果访问不了,看这里:http://www.tuicool.com/articles/ZRv6Rv 我没有采用这个配置感觉配置太重没必要python开发不需要太多辅助工具,够用就行。   1、安装 vim--version查看vim版本 在这一步,你要确保已经满足以下两点要求: Vim编辑版本应该大于7.3。 支持P

  • 平凡主丛上的Yang-Mills理论

    本文是复旦大学由丁青教授的暑期课程“Yang-Mills理论的几何及其应用”所作笔记,会有少许修正。 所需基础: 多元微积分学 微分方程(常微分方程,数学物理方程) 曲线曲面论(初等微分几何) 以下是章节总览(未完): 第一讲欧氏空间上的外微分形式理论第二讲简单的李群,李代数及双不变度量第三讲$\mathbb{R}^4$上平凡主丛的联络,曲率和Yang-Mills泛函第四讲Yang-Mills方程和Maxwell方程第五讲自对偶的Yang-Mills方程及Polyakov和t'Hooft解第六讲Ward猜想的由来及相关研究第七讲零曲率,预定曲率表示及规范变化第八讲离散(量子化)的Yang-Mills理论及经典的微分方程   作者:御坂01034 出处:数学搬运工--http://www.cnblogs.com/misaka01034 您的支持是对博主最大的鼓励,感谢您的认真阅读。 本文版权归作者所有,欢迎转载,但请保留该声明。

  • 计算机结构--week5

    内存特征:    计算机中的内存:  Capacity:Thecapacityofthememoryisthenumberofbytes(orpreferablywords)itcanstore.  Thewordsize(orlength)isthenaturalunitoforganisation.  Itisusuallyequaltothenumberofbitsusedtorepresentanintegerandtotheinstructionlength. 3个key:访问时间,恢复时间,传输速率                   ParityBits(奇偶效验位) 具体方法如下:奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数1000110(0)你必须添0这样原来有3个1已经是奇数了所以你添上0之后1的个数还是奇数个。偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数1000110(1)

  • Grep Sed Awk

    grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已独立成一种语言来介绍。 grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多; sed:StreamEDitor,流编辑器,默认只处理模式空间,不处理原数据,如果你处理的数据是针对行进行处理的,可以使用sed; awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk。   grep grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。Unix的grep家族包括grep、egrep和fgrep。 egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符,fgrep就是fixedgrep或fastgre

  • QT学习小demo之LightMD(MarkDown编辑器)

    很早之前就有了写一个类似Windows记事本的想法,加上最近也刚好在学编译原理,所以就想把两者结合起来,于是就打算结合MarkDown,开发一款MarkDown编辑器。 不过由于我之前一直使用的是Java语言居多,对c++并不熟悉,所以一些糟糕的代码风格和规范还望各位大佬谅解! LightMD即一款基于QT实现的markdown编辑器,当然也可以作为代码编辑器,由于时间与个人能力等原因,目前实现的功能非常有限! 主要包括: 支持语法高亮(目前支持C/C++) 支持MarkDown预览 代码行数、文本信息统计等 其它一些基本的文件处理相关功能 好了直接上图吧 本项目主要目的在于学习qt相关的windows开发,其中主要有以下几个模块: 整体布局 代码编辑器 markdown编辑器 整体布局 最外面当然是_QMainWindow_,然后从上到下依次是 menuBar QSplitter statusBar menubar的简单示例如下: QMenu*menuFile=menuBar()->addMenu(tr("&File")); QAct

  • 阅读任务-阅读笔记-3

    风险管理的水平有多个层次: 1啊呀!大问题! 2缓和并防止问题 3预计 4把问题变为机会 成为一个合格的PM需要的能力: 1观察理解和快速学习能力 2分析管理能力 3一定的专业能力 4自省的能力 典型用户的模板可以包括以下内容: 1名字 2年龄和收入 3代表的用户在市场上的比例和重要性 4使用这个软件的典型场景 5使用本软件/服务的环境 6生活/工作情况 7知识层次和能力 8用户的动机目的和困难 9用户的偏好 如何写Spec: 1定义好相关的概念 2规范好一些假设 3避免一些误解界定一些边界条件 4描述主流的用户/软件交互步骤 5一些好的功能还会有副作用 6服务质量的说明

  • transform映射失败-报错 unique is not a valid function name for transfor

     1.当聚合字段是数值型时,用map(str)转化成字符串 df.groupby('Date').Data.transform(lambdax:",".join(map(str,x.unique())))复制 2.当聚合字段是字符串类型 df['consol_info']=df.groupby('container_no')['lot_nr'].transform(lambdax:",".join(x.unique())) df['Countries_percontainer']=df.groupby('container_no')['Country'].transform(lambdax:",".join(x.unique()))复制   Jasminelee

相关推荐

推荐阅读