Spiga

分类为读书笔记的文章

程序员的AI基础1:通识基础

2025-04-19 15:27:42

摘要:一、人工智能通识 1. 人工智能的应用场景与定义 日常生活中的AI应用: 手机语音助手利用自然语言处理和语音识别技术,为用户提供便捷服务,如查询信息、设置提醒等。智能家居设备通过语音控制实现家电操作,提升生活便利性。 自动驾驶汽车依靠AI进行环境感知和决策,提高行车安全。金融领域中,机器人投资顾问运用AI分析数据,提供个性化资产管理建议。 专业领域的AI应用 医院利用AI图像识别技术辅助诊断,提高诊断准确率。 制造业借助AI优化生产流程,提高效率和质量。 监控摄像头结合AI技术实现行为监测和犯罪预测,提升社会安全水平。 这些应用展示了AI在不同领域的强大潜力和广泛价值。 人工智能的定义与本质 约翰·麦卡锡将人工智能定义为“实现目标的计算能力”,强调其目标导向性。但目前的AI技术本质上是一种高级统计工具,仅在特定任务上表现出色。 真正的智能涉及意识、情感和创造力,而现有AI缺乏这些特质,只能在预设规则或数据支持下运行,无法像人类一样灵活应对复杂情况。 人工智能的分类 现有的AI大多是“弱人工智能”,只能完成特定任务,如翻译、推荐等。 而“强人工智能”或通用人工智能(AGI)是未来目标,能处理任何任务,目前仍遥不可及。 例如,扫地机器人和聊天机器人虽表现出一定智能,但不具备真正的智能。目前的AI产品和服务只是AGI研发过程中的副产品。 2. 人工智能的发展历程 第一次浪潮:规则驱动 1950s- 1980s,达特茅斯会议提出人工智能概念,开启第一次浪潮。基于逻辑和符号推理,依赖人工编写规则,如早期的专家系统。 这种方式在某些领域取得成就,但局限性明显,难以处理自然语言的歧义性和图像识别的复杂性,且成本高昂、可扩展性差,导致人工智能进入寒冬。 第二次浪潮:统计学习 1990s- 2010s,计算机硬件性能提升和互联网出现推动第二次浪潮。统计学习引入概率和统计方法,让计算机从数据中自动学习模式。 垃圾邮件过滤、语音识别和推荐系统等领域取得显著成果,但依赖人工特征工程,对于复杂任务和场景的处理能力有限,发展仍受限。 第三次浪潮:深度学习 21世纪10年代,深度学习和互联网兴起推动第三次浪潮。深度学习实现端到端学习,自动提取数据特征,取得重大突破,如AlphaGo战胜李世石、ChatGPT引发热潮。 在图像识别、自然语言处理等领域超越人…… 阅读全文

前端提升3:TS

2025-03-15 10:19:14

摘要:TypeScript 是一种由微软开发的自由开源的编程语言,他是JavaScript的一个超集,扩展了JavaScript的 语法,主要提供了类型系统和对 ES6 的支持。 一、类型定义 window.onload=function(){ //类型系统 let flag:boolean = false; //布尔类型 let num:number = 15; //数值类型 let str:string = 'abc'; //字符串类型 let str2:string=`hello,${str}`; let msg:string = `hello,${str},${num}`; let u: undefined = undefined; let n: null = null; //为什么要TS // function sum(n1:number,n2:number){ // return n1+n2 // }; // sum(10,20); // sum('10',20); let count:number = 10; count = 100; //声明的变量有多种类型——联合类型 let id:number | string = 10; id = '111'; //任意类型 :any 万能类型 let x:any = true; x = 111; x = 'abc'; //引用类型 //数组 let arr:number[] = [1,2,3,4,5]; //最简单的方法是使用「类型 + 方括号」来表示数组: number[] let arr2:string[] = ['a','b','hello']; let arr3:(number|string)[] = ['a',100,'hello']; let arr4:any[] = ['a',100,'hello']; //数组泛型 Array类型 let arr5:Arraynumber= [1,2,3,4,5]; let …… 阅读全文

WPF学习笔记5:MVVM

2022-09-04 23:46:49

摘要:一、了解MVVM 1. 什么是MVVM 一种设计模式 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 为什么需要MVVM?解决什么问题? 降低耦合、独立开发、逻辑重用(Xamarin MAUI多平台应用)、可测试 响应式布局 2. 控件交互到MVVM模式的转变 控件交互:基于控件的功能开发 -MVVM****模式 代码/项目结构 Models: Views: ViewModels: 3. MVVM绑定模式下的信息交互 数据类型:INotifyPropertyChanged接口 public event PropertyChangedEventHandler? PropertyChanged; 执行事件,发公告 ContextMenu,注意:命令的数据源的指定 行为动作:ICommand接口 public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) public void Execute(object? parameter) 是不是所有控件都有Command属性?是不是所有动作都可以使用Command? 无法绑定的动作如何处理? 4. MVVM绑定扩展 无法绑定的对象属性 通过附加属性进行扩展 无法绑定的动作事件 (InputBindings: ) 单击鼠标左键 :LeftClick 双击鼠标左键:LeftDoubleClick 单击鼠标中键 :MiddleClick 双击鼠标中键:MiddleDoubleClick 单击鼠标右键:RightClick 双击鼠标右键:RightDoubleClick 不执行任何操作:None 旋转鼠标滚轮:WheelClick 事件转命令 Behavior 自定义实现 5. MVVM案例 一般页面信息绑定 页面集合绑定 任意数据源绑定 自定义控件 6. MV…… 阅读全文

WPF学习笔记4:控件模版

2022-08-29 23:42:50

摘要:一、WPF控件的组成 1. 逻辑与呈现的分离 ​ 控件模板旨在成为展示详细信息的自包含单元,对外部用户和对象(包括 Style 对象)不可见。 操作控件模板内容的唯一方法是在当前控件模板中。 2. 模板修改:显示区域的内容重组 Button模板Template:渲染对象、属性值的关联、触发器 样式与模板 3. 基础控件如何显示的? 功能最强大,布局最灵活的容器 主要属性配置: ColumnDefinitions(ColumnDefinition)、RowDefinitions(RowDefinition)、ShowGridLines、IsSharedSizeScope(SharedSizeGroup)、给子项控件使用:Grid.Row Grid.Column 使用场景:广泛,不知道用什么布局,就用Grid,意外(WrapPanel) 二、模板中的基础控件 1. 基础元素的呈现:DrawingContext DrawRect TextBlock Border OnRender 2. 控件模板案例解析 Label、GroupBox、CheckBox、RadioButton、ToggleButton TextBox/PasswordBox、TabControl/TabItem、TreeView/TreeViewItem、ListBox/ListBoxItem、ListView/ListViewItem、Menu/MenuItem ComboBox、ScrollViewer、ProgressBar、Slider Calendar/DatePicker、DataGrid 模板的添加与修改 默认模板:wpf\src\Microsoft.DotNet.Wpf\src\Themes 3. 控件模板案例解析 基本控件的使用 名称、基本作用表现、特征 常用属性:尺寸、定位、显示内容 常用事件:点击、输入 控件的特殊属性 Style:用来统一设置控件属性的对象 Resources:资源管理,存放可共用的数据(变量、样式、模板) Template:用来控制控件的呈现 目的: 三、属性与绑定 1. WPF的数据关系 绑定关系:数据绑定是应用呈现数据并与数据交互提供了一种简单而一致的方法,在应用 UI 与其显示的数据之间建立连接的过程。 2. 建…… 阅读全文

WPF学习笔记3:基本布局

2022-08-28 10:40:57

摘要:一、界面布局 1. 布局原则 不用显式的方式设定元素的尺寸 不使用屏幕坐标来指定位置 2. 常用布局控件与布局处理 Grid StackPanel DockPanel WrapPanel UniformGrid Canvas InkCanvas Border(装饰控件:背景色/边框 圆角 子对象也只能一个) 3. Grid 功能最强大,布局最灵活的容器 主要属性配置: ColumnDefinitions(ColumnDefinition)、RowDefinitions(RowDefinition)、ShowGridLines、IsSharedSizeScope(SharedSizeGroup)、给子项控件使用:Grid.Row Grid.Column 使用场景:广泛,不知道用什么布局,就用Grid,意外(WrapPanel) 4. StackPanel 最简单的布局容器之一 主要属性配置:Orientation-调整排列方向、FlowDirection 使用场景:图文并显、工具栏 可以Grid代替 5. WrapPanel 唯一一个不能被Grid替代的布局控件,水平方向排列,过程中当前子项出界了,进行折行 主要属性配置:Orientation-调整排列方向 使用场景:桌面式图标排列、搜索历史关键词排列 6. DockPanel 通过设置Dock停靠进行布局 主要属性配置:LastChildFill、DockPanel.Dock 使用场景:应用的主窗口布局(标题栏、状态栏、工具栏、菜单栏) 7. UniformGrid 另一种行列风格布局,自动生成统一一致的行列 主要属性配置:Columns、Rows 指定的是当前区域均分多少行和列,不存在指定行高和列宽 使用场景:9宫格的功能区域、图表 8. Canvas 通过精确坐标定位放置子元素 主要属性配置:Canvas.Left、Top、Right、Bottom 使用场景:组态、组件封装(仪表) 9. InkCanvas 支持任意笔画输入的画布组件 主要属性配置: 使用场景:手写墨迹识别(不是手写图像识别):文字、图形 10. Border 最基础的装饰控件 主要属性配置: 使用场景: 二、界面布局处理案例分析 1. 可视化数字看板 使用控件总结:Border …… 阅读全文

WPF学习笔记2:3D绘图

2022-08-22 12:37:23

摘要:一、基本对象 1. WPF 3D WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。 WPF 中的 3D 图形内容封装在 Viewport3D 元素中,该元素可以参与二维元素结构。 该图形系统将 Viewport3D 视为一个二维视觉元素,就像 WPF 中的许多其他元素一样。 Viewport3D 充当三维场景中的窗口(即视区)。 更准确地说,它是 3D 场景所投影到的图面。 2. 模型3D场景 3D视口 坐标系 点、线、面、三角顶点网格 材质 光源 相机 3. 3D对象模型结构 MeshGemetry3D Positions TraiangleIndices TextureCoordinates:如何对应? 4. 相机 OrthographicCamera:正交 PerspectiveCamera:透视 基本属性: Position:相机的空间坐标(X,Y,Z) LookDirection:观察方向,向量,相机观察口朝向 FieldOfView(透视相机属性) / Width(正交相机属性):视野范围(焦距),一个值 UpDirection:相机上方方向,控制相机观察口旋转 FarPlaneDistance:远景距离,大于这个距离的场景不渲染 NearPlaneDistance:近景距离,小于这个距离的场景不渲染 5. 3D对象模型材质 DiffuseMaterial:漫反射,反射场景光效果 EmissiveMaterial:自发光,类似于电灯 SpecularMaterial:全反射,可以映射场景 贴图(平面贴图、曲面贴图-地球) 背面材质 6. 3D对象模型光源 AmbientLight:环境光 DirectionalLight:平行光 PointLight:点光源 SpotLight:聚光灯 相关属性 Color:灯光颜色 Direction:光线方向(平行光、聚光灯) Position:光源坐标(点光源、聚光灯) Range:灯光范围(点光源) InnerConeAngle:内光柱照射角度(聚光灯) OuterConeAngle:外光柱照射角度(聚光灯) 7. 3D对象的变换 Transform3D:平移 xyz ScaleTransform3D:缩放 RotateTransform3D:旋转 M…… 阅读全文

WPF学习笔记1:基础控件

2022-08-21 22:56:30

摘要:一、基础控件汇总 控件类型 主要控件 按钮控件 Button、RepeatButton、RadioButton 数据显示控件 TextBlock、Label、Image、ItemsControl**、ListView、ListBox、**DataGrid、DocumentViwer 输入控件 TextBox、RichTextBox、CheckBox、ComboBox、DatePicker、PasswordBox、Slider、ProgressBar 菜单导航控件 MenuItem、ContextMenu、ToolBar、TreeView、TabControl、Expander 信息提示控件 Popup、Window、PrintDialog、ToolTip 布局控件 Grid**、StackPanel、WrapPanel、DockPanel、UniformGrid、Canvas、InkCanvas、**Border 图形控件 Line、Rectangle、Ellipse、Polyline、Polygon、Path 其他控件 ScrollViwer、GroupBox、ViewBox 1. 常用属性 尺寸(宽高)、定位(Margin,HorizontalAlignment、VerticalAlignment)、颜色(Background、Foreground)、信息显示(Text、Content、ListViewItem、ListBoxItem、DataGridTextColumn…..) 鼠标事件、键盘事件 特别属性 RadioButton:GroupName 集合控件:AlternationCount ComboBox:SelectedItem、SelectedValue、SelectedValuePath、DisplayMemberPath、SelectedIndex DatePicker:SelectedDate、DisplayDateStart、DisplayDateEnd PasswordBox:Password(普通属性) Silder、ProgressBar:最小值、最大值、当前值 Popup:IsOpen、Placement、PlacementTarget、StaysOpen Window:无边…… 阅读全文

[推荐] Kubernates学习思路导图笔记

2021-04-25 23:46:47

摘要: 阅读全文

[推荐] kubectl 常用命令总结

2021-01-25 11:40:01

摘要:# 查看所有 pod 列表, -n 后跟 namespace, 查看指定的命名空间 kubectl get pod kubectl get pod -n kube kubectl get pod -o wide # 查看 RC 和 service 列表, -o wide 查看详细信息 kubectl get rc,svc kubectl get pod,svc -o wide kubectl get pod pod-name -o yaml # 显示 Node 的详细信息 kubectl describe node 192.168.0.212 # 显示 Pod 的详细信息, 特别是查看 pod 无法创建的时候的日志 kubectl describe pod pod-name eg: kubectl describe pod redis-master-tqds9 # 根据 yaml 创建资源, apply 可以重复执行,create 不行 kubectl create -f pod.yaml kubectl apply -f pod.yaml # 基于 pod.yaml 定义的名称删除 pod kubectl delete -f pod.yaml # 删除所有包含某个 label 的pod 和 service kubectl delete pod,svc -l name=label-name # 删除所有 Pod kubectl delete pod --all # 查看 endpoint 列表 kubectl get endpoints # 执行 pod 的 date 命令 kubectl exec pod-name -- date kubectl exec pod-name -- bash kubectl exec pod-name -- ping 10.24.51.9 # 通过bash获得 pod 中某个容器的TTY,相当于登录容器 kubectl exec -it pod-name -c container-name -- bash eg: kubectl exec -it redis-master-cln81 -- bash # 查看容器的日志 kubectl logs pod-name kube…… 阅读全文

Go学习笔记(十一):编写⾼性能的Go程序

2020-05-13 13:11:55

摘要:别让性能被“锁”住 我们来看一段代码 var cache map[string]string const NUM_OF_READER int = 40 const READ_TIMES = 100000 func init() { cache = make(map[string]string) cache[a] = aa cache[b] = bb } func lockFreeAccess() { var wg sync.WaitGroup wg.Add(NUM_OF_READER) for i := 0; i NUM_OF_READER; i++ { go func() { for j := 0; j READ_TIMES; j++ { _, err := cache[a] if !err { fmt.Println(Nothing) } } wg.Done() }() } wg.Wait() } func lockAccess() { var wg sync.WaitGroup wg.Add(NUM_OF_READER) m := new(sync.RWMutex) for i := 0; i NUM_OF_READER; i++ { go func() { for j := 0; j READ_TIMES; j++ { m.RLock() _, err := cache[a] if !err { fmt.Println(Nothing) } m.RUnlock() } wg.Done() }() } wg.Wait() } 这段程序一个没有锁,一个有锁。我们看一下测试结果 func BenchmarkLockFree(b *testing.B) { b.ResetTimer() for i := 0; i b.N; i++ { lockFreeAccess() } } //169 6618595 ns/op 77 B/op 1 allocs/op func BenchmarkLock(b *testing.B) { b.R…… 阅读全文