深度学习网络对输入的数据进行多层的非线性变换操作, 不断耦合低层特征, 层层往上, 最后得到高层的语义表达
卷积神经网络
模型
gpt 175 billion netro cell
创建新解决方案 使用webapi模板 new -> Project -> ASP.NET Core Web API template
命令行工具参考Microsoft Doc: dotnet new1
2
3
4
5
6mkdir MyServices
cd MyServices
dotnet new sln
mkdir src
dotnet new webapi -lang C# -o src/MyServices.API
dotnet sln add src/MyServices.API/MyServices.API.csproj
添加class library项目1
2
3
4dotnet new classlib -lang C# -o src/MyServices.EntityManagers
dotnet new classlib -lang C# -o src/MyServices.Models
dotnet sln add src/MyServices.EntityManagers/MyServices.EntityManagers.csproj
dotnet sln add src/MyServices.Models/MyServices.Models.csproj
创建详细目录,如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19─src
├───MyServices.API
│ ├───Controllers
│ ├───Infrastructure
│ │ ├───ActionFilters
│ │ ├───DbContext
│ │ ├───Helpers
│ │ ├───OData
│ │ └───Security
│ └───Properties
├───MyServices.EntityManagers
│ ├───interfaces
│ ├───Managers
│ └───Utilities
└───MyServices.Models
├───Contexts
├───DTO
├───Enums
└───Migrations
安装依赖
API layer
Microsoft DOc: Swagger/OpenAPI Swagger 项目已于 2015 年捐赠给 OpenAPI 计划,自此它被称为 OpenAPI。 是一个与语言无关的规范,用于描述 REST API。 它使计算机和用户无需直接访问源代码即可了解 REST API 的功能。
visual stuadio创建ASP.NET Core Web API项目模板,包含Enable OpenAPI support选项 即swagger页面
初始startup.cs的配置是1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
配置加载名为swagger.json的接口描述,记作WebApplication1 v1的接口文档
swagger.json不会自动生成 从controller获取接口文档由下述swagger的实现包完成
启用xml注释
右键API项目 -> Properties -> Build -> Output
Output path 为空 即项目根目录
勾选XML documentation file 并命名1
2
3
4
5
6
7
8
9
10
11services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
c.DocInclusionPredicate((name, api) => api.HttpMethod != null);
// Locate the XML file being generated by ASP.NET
var xmlFiles = Directory.GetFiles(AppContext.BaseDirectory, "WebApplication1.API.xml", SearchOption.TopDirectoryOnly);
// Tell Swagger to use those XML comments.
xmlFiles.ToList().ForEach(xmlFile => c.IncludeXmlComments(xmlFile));
});
详情待续 参考Microsoft Doc:Swashbuckle入门
百度旗下深度学习平台
介于网络问题 使用源码编译 参考PaddlePaddle在Windows下使用源码编译
1 | cmake .. -G "Visual Studio 16 2019" -A x64 -DPY_VERSION=3.8 -DPYTHON_INCLUDE_DIR=C:\\Users\\qqqst\\AppData\\Local\\Programs\\Python\\Python38\\include -DPYTHON_LIBRARY=C:\\Users\\qqqst\\AppData\\Local\\Programs\\Python\\Python38\\Lib -DPYTHON_EXECUTABLE=C:\\Users\\qqqst\\AppData\\Local\\Programs\\Python\\Python38\\python.exe -DWITH_FLUID_ONLY=ON -DWITH_GPU=ON -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DCUDA_TOOLKIT_ROOT_DIR="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.3" |
若使用其他MSBuild编译过 产生./build/CMakeFiles以及CMakeCache.txt 需要先删除
使用Release x64编译
small_vector issue: length_error is not a member of std
pull request: betterpig/Paddle ‘vs2019’
Release x64, 先编译third_party,再编译solution 得到约50m的 build\python\dist*.whl1
pip install -U xxx.whl
PaddleX GUI安装正确姿势 (2022.1.1 paddle v2.2)
大概是python工具链版本控制
windows start -> Anaconda3 -> Anaconda Prompt
创建激活conda环境1
2
3
4# 创建名为my_paddlex的环境,指定Python版本为3.8
conda create -n my_paddlex python=3.8
# 进入my_paddlex环境
conda activate my_paddlex
1 | conda activate my_paddlex |
Teams App 实质是托管在Azure等服务端上的web app,Teams客户端类似于浏览器,打包部署直接用插件完成 此外微软提供sdk使之支持sso及授权访问功能
部署及发布Teams App需要Talent的管理员权限 加入Microsoft 365 Developer Program 创建开发者账号使用免费沙盒—> Microsoft 365计划
│ index.css
│ index.jsx
│
└───components
│ App.css
│ App.jsx
│ Privacy.jsx
│ Tab.jsx
│ TabConfig.jsx
│ TermsOfUse.jsx
Tab其实就是个React AppYour Microsoft 365 tenant admin hasn’t enabled sideloading permission for your account. You can’t install your app to Teams!
出于种种原因造成的side loading disabled 应进入Microsoft365 Admin Center设置
Show all —> Admin centers —> Teams Apps —> Setup policies —> Global
打开 Upload custom apps
先执行Teams Toolkit提供的DEPLOYMENT—>Provision in the Cloud功能,toolkit将以项目名称自行创建App Service、Storage Account及Vitual Network等Rescource
事实上,Teams Tab App的前端静态文件使用Azure Storage Account托管,访问控制通过托管标识(Managed Identity), 关于Provision时创建哪种资源见Provision cloud resources
使用Deploy to the Cloud 将当前项目作为Web App部署到前面Provision预备的资源上
记得配置Api的Endpoint 比如写/public/config.json
Zip Teams metadata package可获得该Web App的配置信息 包括名称及地址 以用于添加到Organization的Teams中
编译产生 build\appPackage.local.zip 即项目的应用包,该目录下还有应用部件清单 manifest.json
将应用包上传到teams中测试:Teams 左边栏点击Apps —> Manage your apps —> Upload an app to your org’s app catalog
上传后图标显示在Apps列表中 可将其添加到team的chat中
1 | npm i -g teamsfx-cli // 安装脚手架 |
使用如下命令创建sample APP并基于这些sample作为模板开发自己的应用1
teamsfx new template todo-list-SPFx
在teams中打开sharepoint站点
配置一个list 见Microsoft Doc:
代码中/SPFx/src/webparts/todoList/components/SharePointListManager.ts line17 设置为sharepoint上list的名字
用vscode的Teams Toolkit打开项目
选择项目目录打开
在teams toolkit中选择Provision in the cloud 在Cloud端创建app
**
点击Deploy to the cloud部署
点击Publish to the cloud发布
访问Microsoft Teams admin center查找已发布的app
登录Teams添加app
TODO 主动从外部系统向 Teams 发送信息,允许用户从 Teams 客户端内部处理该信息。
TODO 允许用户在另一个系统中快速查找信息,并将结果添加到 Teams 中的对话。
Microsoft 或 Microsoft 365 帐户登录 Teams 后,应用用户可以使用你的应用,而无需再次登录。
如上图示,App添加到Teams,切换到该tab时 确认授权App访问Azure AD
步骤:
首先 在AzureAD注册app
Teams Toolkit issue: Your Microsoft 365 tenant admin hasn’t enabled sideloading permission for your account. You can’t install your app to Teams
1 | const orientation = renderObject.renderer.getActiveCamera().getViewPlaneNormal(); // camera法向量 |
曾尝试actor.setOrientation失败 请使用source.setDirection
很多主流浏览器(包括Chrome)对webgl的实现中,设置线宽为1,在现阶段需要将line转为tube以实现‘线宽’1
2
3
4
5
6
7
8
9const updateTubeActor = (actor, polydata, lineWidth) => {
const filter = vtkTubeFilter.newInstance();
const mapper = actor.getMapper();
filter.setCapping(false);
filter.setNumberOfSides(10);
filter.setRadius(lineWidth);
filter.setInputData(polydata);
mapper.setInputConnection(filter.getOutputPort());
};
RenderWindowInteractor事件中使用屏幕像素坐标
而3D视图中是世界坐标
模型坐标系固定在模型上,该坐标系在建模时由建模者指定。
模型所处的位置,采用世界坐标系来描述。通常每个模型都有自己的坐标系,但是只有一个世界坐标系。在对模型进行旋转、平移、缩放时,世界坐标是不变的,但模型坐标系相对于世界坐标系的空间位置关系发生了变化。通常相机与光源也在世界坐标系中定义。
视点坐标系能够表达对相机可见的场景,其x和y坐标的范围在(-1,1)之间,z代表深度值。世界坐标系到视点坐标系之间的转换用4*4的相机矩阵来表达。
屏幕坐标系 display coordinate system
屏幕坐标系即图像坐标系,其坐标轴方向与视点坐标系一致,但是其x,y坐标值为像素坐标值。窗口尺寸决定了视点坐标与像素坐标的投影关系。不同的viewports(范围:0~1)能将同一个视点坐标系下的物体投影到不同的屏幕坐标系下。
物体最初在模型坐标系下建立,并展示在世界坐标系中。通过相机空间变换矩阵投影到视点坐标系下,并经viewport展示在屏幕上。
1 | const computerDisplayToWorld = (x, y, z) => { |
公司Legacy SSO使用场景已经很少, 逐步转向Azure ADB2C,员工常遗忘其Legacy SSO的密码,
由于企业Azure ADB2C申请比较麻烦,而且资产系统需求未必符合普适性,故自行搭建SSO服务
参考CNBlog:从零搭建一个IdentityServer
对于从未接触过Legacy SSO的员工以及未来Legacy SSO废止的风险下,允许员工使用其工号或邮箱+密码或邮件验证码通过认证
有限的免费: free for dev/testing/personal projects and companies or individuals making less than 1M USD gross annnual revenue
首先安装dotnet cli提供的identityserver模板1
dotnet new -i IdentityServer4.Templates
提供了以下模板
IdentityServer4 with AdminUI is4admin
IdentityServer4 with ASP.NET Core Identity is4aspid
IdentityServer4 Empty is4empty
IdentityServer4 with Entity Framework Stores is4ef
IdentityServer4 with In-Memory Stores and Test Users is4inmem
IdentityServer4 Quickstart UI (UI assets only) is4ui
入门:
入门项目包含三个部分,身份认证服务(https://localhost:5001), API(https://localhost:44323/identity), Client(一个console program)
创建身份认证服务
1 | dotnet new is4empty -n IdentityServer |
在Config.cs中定义API scope
1 | public static IEnumerable<ApiScope> ApiScopes => |
在Config.cs中定义访问API的client
1 | public static IEnumerable<Client> Clients => |
该client使用clientCredential(id+secret)认证 允许访问名为api1的scope
在startup.cs中载入资源以及client
1 | public void ConfigureServices(IServiceCollection services) |
启动项目 导航到 https://localhost:5001/.well-known/openid-configuration
创建一个API, 并使用上面的IdentityServer作认证
1 | dotnet new webapi -n Api |
受保护的接口(protected interface)
1 | [Route("identity")] |
在startup.cs配置认证
1 | public void ConfigureServices(IServiceCollection services){ |
1 | dotnet new console -n Client |
1 | class Program |
在vs中右键solution在Properties中配置Multiple startup projects,确认后开始运行(F5)
右键Client project —> Debug —> start new instance 因为控制台程序执行后关闭 在Program中打断点
1 | public void ConfigureServices(IServiceCollection services){ |
1 |
配置OpenId Connect
Similar to OAuth 2.0, OpenID Connect also uses the scopes concept. Again, scopes represent something you want to protect and that clients want to access. In contrast to OAuth, scopes in OIDC don’t represent APIs, but identity data like user id, name or email address.
在Identity Server注册Mvc Client
官方文档中基于上述Quickstart项目扩展,使前者In Memery的配置以及运行数据可以保存到数据库
github上的sample与使用is4ef模板生成的项目有差别
download sample源码 在此基础上开发自己的需求 加入IConfiguration并从appsettings.json读取connectionstring
源码在startup中定义了一个InitializeDatabase方法 在第一次启动时执行以初始化SQL Server数据库 之后就把它注释掉
将我们的client写入到数据库配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88INSERT INTO [dbo].[Clients]
([Enabled]
,[ClientId]
,[ProtocolType]
,[RequireClientSecret]
,[ClientName]
,[Description]
,[ClientUri]
,[LogoUri]
,[RequireConsent]
,[AllowRememberConsent]
,[AlwaysIncludeUserClaimsInIdToken]
,[RequirePkce]
,[AllowPlainTextPkce]
,[RequireRequestObject]
,[AllowAccessTokensViaBrowser]
,[FrontChannelLogoutUri]
,[FrontChannelLogoutSessionRequired]
,[BackChannelLogoutUri]
,[BackChannelLogoutSessionRequired]
,[AllowOfflineAccess]
,[IdentityTokenLifetime]
,[AllowedIdentityTokenSigningAlgorithms]
,[AccessTokenLifetime]
,[AuthorizationCodeLifetime]
,[ConsentLifetime]
,[AbsoluteRefreshTokenLifetime]
,[SlidingRefreshTokenLifetime]
,[RefreshTokenUsage]
,[UpdateAccessTokenClaimsOnRefresh]
,[RefreshTokenExpiration]
,[AccessTokenType]
,[EnableLocalLogin]
,[IncludeJwtId]
,[AlwaysSendClientClaims]
,[ClientClaimsPrefix]
,[PairWiseSubjectSalt]
,[Created]
,[Updated]
,[LastAccessed]
,[UserSsoLifetime]
,[UserCodeType]
,[DeviceCodeLifetime]
,[NonEditable])
VALUES
(1
,'angular_spa'
,'oidc'
,0
,null
,null
,null
,null
,0
,1
,0
,1
,0
,0
,0
,null
,1
,null
,1
,0
,300
,null
,3600
,300
,null
,2592000
,1296000
,1
,0
,1
,0
,1
,1
,0
,'client_'
,null
,SYSDATETIME()
,null
,null
,null
,null
,300
,0)
写入client scope1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18INSERT INTO [dbo].[ClientScopes]
([Scope]
,[ClientId])
VALUES
('openid'
,3);
INSERT INTO [dbo].[ClientScopes]
([Scope]
,[ClientId])
VALUES
('profile'
,3);
INSERT INTO [dbo].[ClientScopes]
([Scope]
,[ClientId])
VALUES
('api1'
,3)
client cors配置1
2
3
4
5
6INSERT INTO [dbo].[ClientCorsOrigins]
([Origin]
,[ClientId])
VALUES
('http://localhost:4200'
,3)
到这一步 angular spa 可以完成到identity server的跳转但是显示授权错误“Sorry, there was an error : unauthorized_client
Unknown client or client not enabled”1
2
3
4
5
6
7
8
INSERT INTO [dbo].[ClientGrantTypes]
([GrantType]
,[ClientId])
VALUES
('implicit'
,3)
GO1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23INSERT INTO [dbo].[ApiResources]
([Enabled]
,[Name]
,[DisplayName]
,[Description]
,[AllowedAccessTokenSigningAlgorithms]
,[ShowInDiscoveryDocument]
,[Created]
,[Updated]
,[LastAccessed]
,[NonEditable])
VALUES
(1
,'api1'
,'AMS API'
,null
,null
,1
,SYSDATETIME()
,null
,null
,0)
GO
安装entityframework sqlserver依赖1
2dotnet add package IdentityServer4.EntityFramework
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
模板使用的是sqlitedb 见startup.cs1
2
3
4services..AddConfigurationStore(options =>
{
options.ConfigureDbContext = builder => builder.UseSqlite(connectionString);
})
用户数据库上下文1
2dotnet ef migrations add InitUserContext -c AMSIS.Data.UserContext -o Data/Migrations/UserDb
Update-Database -c AMSIS.Data.UserContext
当token无效时(比如后台校验jwt返回前台401)前台spa应跳转至登录页如 http://localhost:44365/account/login?returnUri=http%3A//localhost%3A4200/passport/callback
spa应在路由到callback时从url中取得token存localstorage
跳转到注册页 填表单 保存profile
应在业务领域分离出用户/账户信息 使用从identityserver取得的openid关联本业务领域数据