2019-4-2 to 2019-10-24
C#
虚函数
- 定义一个函数为虚函数,不代表函数为不被实现的函数。
- 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
- 定义一个函数为纯虚函数,才代表函数没有被实现。
- 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
从URI中获取复杂类型参数
- 使用[FromUri], 例如
public IHttpAction Get([FromUri] GeoPoint location) {}
一些概念
- Func
- Action
- Assembly
- 在C#里Assembly类表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时应用程序构造块,Assembly包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息。
- IoC
- 如果一个类A的功能需要借助类B,就称类B是类A的依赖,如果在类A的内部实例化类B,则两者容易出现高耦合,则把A对B的控制抽离出来,交给一个第三方去做,就称作控制反转IoC,这是一种思想。而依赖注入是最典型的实现方法,由第三方(IoC容器)来控制依赖,把他通过构造函数、属性或者工厂模式等方法,注入到类A,这样就极大程度的对类A和类B进行解耦。
- 构造方法注入,传参的时候传该类型的参数,就可以不用在A中实例化B。
- 工厂模式注入,新建一个第三方类,交给第三方类去实例化B,A中只需要实例化第三方类,用get得到B的实例即可。
- 框架注入,将对象依赖映射信息存储在容器(.xml)或者特定的对象中,并实现动态的注入。
- IoC符合依赖倒置原则,单一职责原则。
- 如果一个类A的功能需要借助类B,就称类B是类A的依赖,如果在类A的内部实例化类B,则两者容易出现高耦合,则把A对B的控制抽离出来,交给一个第三方去做,就称作控制反转IoC,这是一种思想。而依赖注入是最典型的实现方法,由第三方(IoC容器)来控制依赖,把他通过构造函数、属性或者工厂模式等方法,注入到类A,这样就极大程度的对类A和类B进行解耦。
- vs的蓝色代表关键字,浅蓝色代表类型
- CLR
- .NET不仅提供了自动内存管理的支持,他还提供了一些列的如类型安全、应用程序域、异常机制等支持,这些 都被统称为CLR公共语言运行库。
- C# where
- 在函数参数列表后面跟着的where表示,where T: class 类型T必须是一个参考的参数类型;where T:new()类型T必须有一个无参构造方法
- 什么是类库?
- 类库就是类的逻辑集合,你开发工作中你用过或自己编写过很多工具类,比如搞Web的经常要用到的 JsonHelper、XmlHelper、HttpHelper等等,这些类通常都会在命名为Tool、Utility等这样的项目中。 像这些类的集合我们可以在逻辑上称之为 “类库”,比如这些Helper我们统称为工具类库。
- 异步编程
- 在内部,异步编程基于利用操作系统尽可能高效地执行 I/O 绑定型作业的对象(例如 Task)。
- 定义一个异步方法应满足以下几点
- 使用async关键字来修饰方法
- 在异步方法中使用await关键字(不使用编译器会给出警告但不报错),否则异步方法会以同步方式执行
- 尽量不使用void作为返回类型,若希望异步方法返回void类型,请使用Task
- 异步方法名称以Async结尾
- 异步方法中不能声明使用ref或out关键字修饰的变量
- https://docs.microsoft.com/zh-cn/dotnet/csharp/async
- 特性(attribute):
- 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。
- 委托
- C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托具有以下属性:
- 委托类似于 C++ 函数指针,但委托完全面向对象,不像 C++ 指针会记住函数,委托会同时封- 装对象实例和方法。
- 委托允许将方法作为参数进行传递。
- 委托可用于定义回调方法。
- 委托可以链接在一起;例如,可以对一个事件调用多个方法。
- 方法不必与委托类型完全匹配。 有关详细信息,请参阅使用委托中的变体。
- C# 2.0 版引入了匿名方法的概念,可以将代码块作为参数(而不是单独定义的方法)进行传递。 C# 3.0 引入了 Lambda 表达式,利用它们可以更简练地编写内联代码块。 匿名方法和Lambda 表达式(在某些上下文中)都可编译为委托类型。 这些功能现在统称为匿名函数。 有关 lambda 表达式的详细信息,请参阅匿名函数。
- 委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。 与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。
- C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托具有以下属性:
- 泛型
- 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。
- C#访问修饰符
- public:所有对象都可以访问;
- private:对象本身在对象内部可以访问;
- protected:只有该类对象及其子类对象可以访问
- internal:同一个程序集的对象可以访问;
- protected internal:访问限于当前程序集或派生自包含类的类型。
- .Net 入门
- NET 应用开发用于并运行于一个或多个 .NET 实现。 .NET 实现包括 .NET Framework、.NET Core 和 Mono。 .NET 的所有实现都有一个名为 .NET Standard 的通用 API 规范。 本文简要介绍了每个概念。
- .NET 实现
- 一个或多个运行时。实现 .NET Standard 并且可实现其他 API 的类库。 可选择包含一个或多个应用程序框架。可包含开发工具。 (?) Microsoft 积极开发和维护的主要 .NET 实现有 4 个:.NET Core、.NET Framework、Mono 和 UWP。
- .NET Core
- 是 .NET 的跨平台实现,专用于处理大规模的服务器和云工作负荷。 可在 Windows、macOS 和 Linux 上运行。 它实现 .NET Standard,因此面向 .NET Standard 的代码都可在 .NET Core 上运行。 ASP.NET Core 在 .NET Core 上运行。
- .NET Framework
- .Net Framework 是自 2002 年起就已存在的原始 .NET 实现。 它是当前 .NET 开发人员经常使用的 .NET Framework。 4.5 版以及更高版本实现 .NET Standard,因此面向 .NET Standard 的代码都可在这些版本的 .NET Framework 上运行。 它还包含一些特定于 Windows 的 API,如通过 Windows 窗体和 WPF 进行 Windows 桌面开发的 API。 .NET Framework 非常适合用于生成 Windows 桌面应用程序。
- .NET 运行时
- .NET Framework 公共语言运行时 (CLR)
- .NET Core 核心公共语言运行时 (CoreCLR)
- 适用于通用 Windows 平台的 .NET Native
- 用于 Xamarin.iOS、Xamarin.Android、Xamarin.Mac 和 Mono 桌面框架的 Mono 运行时
- .NET 工具和常见基础结构
- .NET 语言及其编译器
- .NET 项目系统(基于 .csproj.vbproj 和 .fsproj 文件)
- MSBuild(用于生成项目的生成引擎)
- NuGet(适用于.NET 的 Microsoft 程序包管理器)
- .NET Standard 是一组由 .NET 实现的基类库实现的 API。 更正式地说,它是构成协定统一集(这些协定是编写代码的依据)的特定 .NET API 组。 这些协定在每个 .NET 实现中实现。 这可实现不同 .NET 实现间的可移植性,有效地使代码可在任何位置运行。
- 本机互操作性
- 实现本机互操作性的主要方式是通过“平台调用”(简称 P/Invoke),Linux 和 Windows 平台均支持这种方式。 实现本机互操作性的另一种方式称为“COM 互操作”(仅限 Windows),用于在托管代码中操作 COM 组件。 这种方式建立在 P/Invoke 基础结构之上,但工作原理略有不同。
- 托管代码
- 托管代码就是执行过程交由运行时(CLR)管理的代码。托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。
- 如果运行 C/C++ 程序,则运行的代码也称为“非托管代码”。
- 实际的程序在本质上是操作系统 (OS) 载入内存,然后启动的二进制代码。 其他任何工作 - 从内存管理到安全考虑因素, 对于程序员来说是一个不小的负担。
- C#不区分大小写。标识符(例如,命名空间、类型和成员的名称)必须不仅限于大小写不同。
共享屏幕
- 连接公司VPN / mstfvpn开启 global protecal / mstsc命令
.NET
- MVC
- MVC其实理解起来很更简单,就像ASP一样,所有的操作都是由Request驱动的。说白了就是只用知道当前请求的Url归那个Controller中action执行,执行时需要用到哪些数据(Model),执行后在那个试图(View)上显现这个Model即可。
- owin
- OWIN定义了.NET Web服务器和Web应用程序之间的标准接口。OWIN接口的目标是分离服务器和应用程序,鼓励开发用于.NET Web开发的简单模块,并且通过作为开放标准,激发.NET Web开发工具的开源生态系统。
- ASP.NET MVC
- Model(模型)表示应用程序核心(比如数据库记录列表)
- View(视图)对数据(数据库记录)进行显示
- Controller(控制器)处理输入(写入数据库记录)
- App_Data 文件夹用于存储应用程序数据。我们将在本教程稍后的章节向 App_Data 文件夹添加 SQL 数据库
- Controllers 文件夹包含负责处理用户输入和响应的控制器类。
- MVC 要求所有控制器文件的名称以 “Controller” 结尾。
- Models 文件夹包含表示应用程序模型的类。模型存有并操作应用程序的数据。
工作步骤
- Step9: 研究现有代码模块
- Step8: 增加个别的TTS 需要增加的课程类型 readafterme lesson quiz . Text
- Step7: pearson的易混音练习 和 数据工厂迁移 v2 5/22日开始搞 5/26日结束
- Step6: 实现微服务的Mtutor服务迁移demo
- 5/8/2019 5:40 PM 开始搞
- 如何部署服务
- 创建云服务(azure portal完成)
- 部署云服务证书(azure portal完成)
- MTutor.Service项目右键 -> publish 直接publish是有一个service列表选择的
- 在publish设置中选择指定的云服务
- 一路next
- 是CI/CD模式的吗? 理论上应该是,但我好像没发现这部分的内容
- 我们的程序现在是直接跑的 现在没有容器 publish就是把程序打包上传到虚拟机,再用iis serve
- 问题:现在是有些笨重了 开发新功能就比较受限
- 痛点应该还是拆分服务 其中底层有很多机器学习的Model,这些Model被很多服务依赖,这部分应该得水平拆分出来;上层就是一系列不同的产品了,可能是要垂直拆分 那些应该就不用了,也没办法抽取,模块之间总得走rpc,很多nuget像Newtonsoft之类的就是完成RPC功能的,只能直接呆着了 主要还是抽取最小rest服务提供单元,我是这么理解的
- Step6.1 将engines中的一个服务抽离出来 (打包 一周 好难)
- Step5: 数据迁移,将数据按userid为key,后面跟着排好序的session信息 4/29/2019 11:37 AM 争取今天搞完 5/7/2019 5:39 PM 搞完交差
- Step4: 学习微服务,第四周 4/22/2019 11:34 AM 基本看完kubenetes 4/29/2019 11:37 AM
- Step3: 使用API测试代码,熟悉代码框架,了解流程+数据 第三周 数据业务/数据中 测试过程在测代码–学生账号 测代码–教师账号 中
- Step2: 看3个engine 和 相关的managers 第二周 PearsonContentProviderEngine/ScenarioContentProviderEngine/SpeakingContentProviderEngine 看的过程在 Code 中
- Step1: build 第一周
docker
-
- 1、hyper-v 不是前端,他就是虚拟机,当然现在虚拟机都是在内核里运行,需要用 CPU 功能提供支撑的,所以你要是说他是前端,其实也不是什么大错,毕竟你看到的仅仅是他的控制和操作界面。2、docker for win 这东西,先说 docker 本来就是 Linux 下面的程序,借助 Linux 的 cgroup 功能来封装的一个独立的被隔离的进程组。Windows 不支持运行 linux 的程序,也没有 cgroup 的功能,你说他怎么实现的……当然需要跑个虚拟机里面跑 Linux 了……windows 跑 docker 因为是在虚拟机下,肯定比 Linux 真机跑慢,不过 docker for Linux 这个虚拟机是特殊优化的,性能已经非常好了。
- 如何打包一个.net framework容器
- a. 书写Dockerfile文件;b. Publish到obj/Docker/publish;c. Dockerfile中Copy 这个到目录中。
- 一些小代码 ``` MSBuild.exe /t:Publish /p:Configuration=DevDeploy /p:TargetProfile=Local .\MTutor.Service.sln docker exec -it maye cmd docker run -p 81:80 –name maye test-web docker build -t test-web . for /r . %r in (onmt*) do @echo %r dir . | find “vcruntime140.dll” xcopy javadll* C:\Windows\System32\ /e cmd.exe /c depends /c /ot:.\out1.txt .\MTutor.Service.UniSoundSpeechLib.dll docker run -it -v D:\code\dockervolumn:C:\vdata -p 81:80 –rm –name testdll test-dll
```
- 向C#文件中添加c++的dll
- 1 编写一个C++ dll 文件:用vcstudio直接建立一个c++ dll项目,然后build之后 debug目录下就会生成需要的dll文件
- 2 将这个dll文件拷贝到C#项目下的bin目录中 让C#能引用到
- 3 在C#中调用
[DllImport("ClassLibrary1.dll",CallingConvention = CallingConvention.Cdecl)]
- 4 开启iis64 选择 Tools -> Options… -> Projects and Solutions -> Web Project
Yarn & Spark
- 全新的资源管理框架YARN(Yet Another Resource Negotiator)
- (1)MapReduce-On-YARN:YARN上的离线计算
- (2)Spark-On-YARN:YARN上的内存计算;
- (3)Storm-On-YARN:YARN上的实时/流式计算;
- (4)Tez-On-YARN:YARN上的DAG计算
.net framework 迁移到 .net core
- 实战
- 会出现dll找不到的问题:
- 方法1:将框架重定向到相同框架
- 方法2:右键add,找到reference,添加reference
- 方法3:查看文件位置对不对,有可能不在目标文件夹中
- Microsoft.QualityTools.Testing.Fakes (坑,在.net core中不支持该fakes) 【出现在articlescore,chinaDailyMicroApp,】
- 1 该库的作用 使用填充程序将应用程序与其他程序集隔离以进行单元测试
-
2 填充类型是Microsoft Fakes Framework使用的两种技术之一,可让您轻松地将测试中的组件与环境隔离。 (shim使用填充程序将代码与不属于解决方案的程序集隔离开来。要将解决方案的组件彼此隔离,我们建议您使用存根。) 使用填充程序将代码与不属于解决方案的程序集隔离开来。要将解决方案的组件彼此隔离,我们建议您使用存根。
Shim.Replace(() => ArticleScoreContentProviderEngineHelper.GetUserId(null)).With(() => (user.Id)); Shim.Replace(() => ArticleScoreContentProviderEngineHelper.GetAppKey(null)).With(() => (Tutor.GetAppKey(PredefinedRequestOrigin.Test))); Shim.Replace(() => ArticleScoreContentProviderEngineHelper.GetId(null)).With(() => (Helper.GenerateId())); ``` 不行 直接用下面这个
ISession session = new ServerSession(Helper.GenerateId(), user, Tutor.GetAppKey(PredefinedRequestOrigin.Test)); ``` - 3 MOCK 不行,不能用于静态方法 - 4 主要是由两个问题:一个是需要支持async方法,另一个是需要支持 static方法!
-
Dotnet core 不支持 C++/CLI 【出现在coretests】 i. C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换* ,就语义上来说他们的区别大致如下: 1. gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址. 2. gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放. ii. void TestByteArray(array<System::Byte>^ byteArray) { pin_ptr<System::Byte> p = &byteArray[0]; unsigned char* pby = p; char* pch = reinterpret_cast<char*>(pby);
// use it... } iii. http://www.runoob.com/cplusplus/cpp-constructor-destructor.html iv. c#调用c++ dll. unable to find an entry point named function in dll 遇到这种情况,有可能是在 c++ 头文件声明的时候 没有加extern "C"。 加这个是因为需要识别名字,c++中的名字为了重载会在后面加上参数Md5之后的值,然而我们在dllimport的时候只要识别一个,所以用C的命名方法 v. https://blog.csdn.net/WALLEZhe/article/details/48739111 vi. https://stackoverflow.com/questions/30713728/call-class-member-of-c-dll-from-c-sharp d.
- 步骤 a. 分析依赖项将代码移植到 .NET Core i. 分析项目中引用的依赖项( 如果不兼容,则检查 .net framework 兼容性模式,否则用其他的替换) ii. 将packages.config转换为packageReference b. 移植代码 i. Visual Studio 2017或以上,其他的不支持.net core c.
-
.net core选择。目前有.net core 2.0 2.1 2.2 3.0 四个版本,经过分析发现分别包含我们项目中94.76 94.76 94.76 95.82的API,说明 .net core 2.0 2.1 2.2 的库没有区别,官方推荐2.2
- .NET Core 并不是简单的迁移了.NET Framework,而是针对跨平台进行了重新设计,.NET Core 是一个模块化,现代化的开源跨平台.NET。 如果我们原来程序是使用.NET Framework开发的,我们要如何评估迁移到.NET Core. 通过本课程,您将了解到如何评估.NET Framework 项目的移植评估过程:包括调查,分析、移植、测试和支持的过程,一起探讨如何把.NET 应用向.NET Core迁移。
- 会出现dll找不到的问题:
微服务
- Pros and cons
- High frequency release.
- High density worker role.
- Flexible Scale up.
- Quickly start.
- Friendly to streaming.
- K8S
- 特点
- 速度快 i. 不可变基础设施 ii. 描述性配置 iii. 自愈系统
- 易扩展
i. api解耦: APIS为实现者和消费者之间提供缓冲区
ii. 应用和集群解耦 iii. 开发团队解耦 iv. 关注点分离 - 将基础设施抽象 i. 在面向应用抽象的基础上开发
- 效率
- 创建和运行容器
- Containers fall into two main categories: System containers Application containers
- Building Application Images with Docker
- 体现了不可变性 – 删除一个文件并不会删除文件本身
- 每次改变一个layer, 就改变后面的每一层
- Docker 运行时
- 部署一个Kube集群
- kubectl的一些命令
- Pods
- label和注解
- Service discovery
- Replicasets
- DaemonSets
- Jobs
- ConfigMaps and Secrets
- Deployments
- Integrating Storage Solutions and Kubernetes
- Deploying RealWorld Applications
- Kubernetes 群集体系结构
- 特点
- 开启debug的out of process方法 wc 真的是太好用了,djt,6666