知乎周源微信_每周源代码57-使用C#4,ASP.NET MVC和jQuery控制Eagletron TrackerPod

知乎周源微信

知乎周源微信

I have a 42" HDTV in Seattle that's hooked up all the time as an "Embodied Social Proxy." It's a portal between the Microsoft Redmond campus and my house here in Oregon. I've blogged about Embodied Social Proxies before as well as shot video of one for Channel 9. It's called the "HanselCart" around work, although recently it's stopped being a cart and now it's a whole office that folks in Building 42 can drop by and see me, er, the Virtual Me.

我有一个42"在西雅图HDTV多数民众赞成迷上了所有的时间作为‘体现社会代理。’这是微软Redmond园区和我的家在这里在俄勒冈州之间的门户网站。我的博客上讲述体现社会代理前以及拍摄第9频道的视频,它被称为“ HanselCart”,尽管最近它不再是购物车,而现在却是整个办公室,42号楼的人们可以前来看看我,或者是Virtual Me。

One of the things that hasn't been 100% smooth is that while the LifeCam Cinema HD 720p is a nice camera, I can't MOVE it. I have to ask folks to move it for me, which is a slight irritant.

并非100%平滑的事情之一是,虽然LifeCam Cinema HD 720p是一款不错的相机,但我无法移动它。 我必须要求人们为我移动它,这有点刺激。

I'm getting ready to head up to Seattle for a meeting. While I was packing I found this TrackerPod motorized WebCam pan/tilt/zoom in my junk closet. I must have purchased it a long time ago and forgotten. I drilled a hole into the metal base of the LifeCam Cinema HD and superglued it while half-threading it on the TrackerPod's standard tripod-style male screw.

我准备去西雅图开会。 在打包时,我在垃圾柜中发现了这个TrackerPod电动WebCam平移/倾斜/缩放。 我一定很久以前就已经买了它,却忘记了。 我在LifeCam Cinema HD的金属底座上钻了一个Kong,然后在TrackerPod的标准三脚架式外螺纹上半拧了一下,然后将其粘合。

It's late, but I figured it I was going up to Seattle tomorrow, maybe I could hack something together quickly with this device and take it with me. There's a Custom Programming API page on the TrackerPod site with a TrackerPod COM Client.

已经很晚了,但是我想明天我要去西雅图,也许我可以用这个设备快速破解一些东西,然后随身携带。 在TrackerPod站点上有一个带有TrackerPod COM客户端的“自定义编程API”页面

This is what I built in action:

这是我构建的动作:

Here's how I did it in 40 minutes. First, I made a new ASP.NET MVC 3 web project, keeping the default template. This is quick and dirty, right?

这是我在40分钟内完成的操作。 首先,我创建了一个新的ASP.NET MVC 3 Web项目,保留了默认模板。 这又快又脏,对吗?

Yes, I used a <TABLE>, sue me.

是的,我使用了<TABLE>来起诉我。

image

Here's the complete Razor View. I knew that I'd want a bunch of buttons to move the camera, and I assumed I would use jQuery to make an AJAX to the server side running ASP.NET MVC. I'm using the latest jQuery 1.4.4 and I'm getting it from the updated Microsoft cookieless CDN (Content Delivery Network.)

这是完整的“剃刀视图”。 我知道我想要一堆按钮来移动相机,并且我假设我会使用jQuery在运行ASP.NET MVC的服务器端制作AJAX。 我正在使用最新的jQuery 1.4.4,并且从更新的Microsoft无cookie CDN(内容交付网络)中获取它。

Rather than making a complex switch statement for the different buttons or different event handlers, I decided to use arbitrary HTML5 data attributes. Each INPUT Button has attributes like data-xvalue and data-yvalue.

我决定使用任意HTML5数据属性,而不是为不同的按钮或不同的事件处理程序创建复杂的switch语句。 每个“输入”按钮都有诸如data-xvalue和data-yvalue之类的属性。

There's one Click() handler hooked up to all Buttons. It gets the values of those data attributes, then POSTs the data to the Move method of the Home Controller.

有一个Click()处理函数连接到所有Button。 它获取这些数据属性的值,然后将数据发布到本地控制器的Move方法。

@{
View.Title = "Home Page";
}
<script src="•http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.4.min.js"
type="text/javascript"></script>
<table border="0">
<tr>
<td></td><td>
<input type="button" value=" up " name="up"
data-xvalue="0" data-yvalue="-10" data-method="0" />
</td><td></td>
</tr>
<tr>
<td>
<input type="button" value="left" name="left"
data-xvalue="10" data-yvalue="0" data-method="0" />
</td>
<td>
<input type="button" value="home" name="home"
data-xvalue="0" data-yvalue="0" data-method="1" />
</td>
<td>
<input type="button" value="right" name="right"
data-xvalue="-10" data-yvalue="0"
data-method="0" />
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="button" value="down" name="down"
data-xvalue="0" data-yvalue="10" data-method="0" />
</td>
<td>
</td>
</tr>
</table>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function () {
$('input').click(function (event) {
var target = event.target;
x = $(target).data('xvalue');
y = $(target).data('yvalue');
m = $(target).data('method');
$.post("/Home/Move", { x: x, y: y, method: m });
}
);
});
//]]>
</script>

In the Home Controller, there's a method called Move(int x, int y, int method) where method is the way to move the camera - relative is 0 or absolute is 1. That's part of the camera's calling convention.

在Home Controller中,有一个名为Move(int x,int y,int method)的方法,其中method是移动摄像机的方式-相对值为0或绝对值为1。这是摄像机调用约定的一部分。

using TRACKERPOD_DUAL_COMLib;

namespace TrackerPodWeb.Controllers
{
public class HomeController : Controller
{
private dynamic cam = MvcApplication.myCameraInstance;

[HttpPost]
public void Move(int x, int y, int method)
{
cam.x = x;
cam.y = y;
cam.move_method = method;
cam.move();
}

public ActionResult Index()
{
return View();
}
}
}

See that dynamic object? That was the part that blew me away. I'm so used to COM Interop being a freaking nightmare from .NET that I spent most of the time messing with COM Interfaces and Type Libraries and exceptions when I realized that C# 4 was supposed to fix all that.

看到那个动态物体? 那是让我震惊的部分。 我很习惯COM Interop成为.NET的噩梦,当我意识到C#4应该解决所有这些问题时,我大部分时间都花在弄乱COM接口和类型库以及异常上。

Like I've been saying about Razor - "stop thinking about syntax and just use it." - the same applies to COM interop in .NET 4 (Remember that the Visual Basic guys have have this nice experience for years...that's why VB is such a popular business automation language.)

就像我一直在谈论Razor一样-“停止思考语法,而只是使用它。” -.NET 4中的COM互操作性也是如此(请记住,Visual Basic专家已经有多年的良好经验了,这就是为什么VB是这么流行的业务自动化语言的原因。)

Just use the dynamic keyword and start calling COM methods. Seriously, it just worked. I was copy/pasting code from the TrackerCam's VB6 (yes Visual Basic 6) samples into C#4 and other than a few semicolons, it was working directly!

只需使用dynamic关键字并开始调用COM方法。 认真地说,它只是有效。 我正在将TrackerCam的VB6(是Visual Basic 6)示例中的代码复制/粘贴到C#4中,除了几个分号以外,它可以直接工作!

Here's my Web Application's startup code:

这是我的Web应用程序的启动代码:

public static dynamic myCameraInstance { get; set; }

protected void Application_Start()
{
//snip the MVC init stuff...
myCameraInstance = new TrackerPod();
myCameraInstance.app_name = "hanselcam";
myCameraInstance.initialize();
}

Here I hang on to the COM object for the camera as a poor man's singleton for use elsewhere. I should probably put guard-code around this to make sure it doesn't disappear or something but it's working so far. It should be a proper singleton I think.

在这里,我以穷人的单身身份挂在摄像机的COM对象上,以供其他地方使用。 我可能应该在此周围加上保护代码,以确保它不会消失或出现某种情况,但是到目前为止已经可以使用了。 我认为应该是一个合适的单身人士。

Then I use that instance in my HomeController and call the COM methods in Move(). ASP.NET MVC takes care of the binding from jQuery to the Action Method, and .NET 4, C# and the DLR take care of the call into the COM TrackerCam stuff.

然后,在HomeController中使用该实例,并在Move()中调用COM方法。 ASP.NET MVC负责从jQuery到Action Method的绑定,而.NET 4,C#和DLR负责对COM TrackerCam的调用。

HTML5+jQuery -> ASP.NET MVC -> C# 4 dynamic keyword -> DLR COM Binder -> COM Library = It just works.

HTML5 + jQuery-> ASP.NET MVC-> C#4动态关键字-> DLR COM活页夹-> COM库=可以使用。

There's some HTML5 attributes, five lines of JS here and basically four lines of COM interop on my Move() method.

有一些HTML5属性,这里有5行JS,在我的Move()方法上基本上有4行COM互操作。

Now I'll be able to control my Seattle WebCam from Oregon. I may make it so I can control it from the Office Communicator Lync chat client or something. It'd also be nice if someone wrapped up the TrackerPod as a nice C# library and put it on CodePlex.

现在,我将能够从俄勒冈州控制我的Seattle WebCam。 我可能会这样做,以便可以从 Office Communicator Lync聊天客户端等控制它。 如果有人将TrackerPod包装成一个不错的C#库并将其放在CodePlex上,那也很好。

I'll add that to my ToDo list, or perhaps you will, Dear Reader. ;)

亲爱的读者,我会将其添加到“待办事项”列表中。 ;)

Related Links

相关链接

翻译自: https://www.hanselman.com/blog/the-weekly-source-code-57-controlling-an-eagletron-trackerpod-with-c-4-aspnet-mvc-and-jquery

知乎周源微信

【AI Agent 记忆共享实战】【下篇】多 Agent 会话 Session 统一共享实战:全链路工程落地、采集归一、MCP 服务、私有化部署、码级实战 中篇我们已经锁定最终最优架构方案: 非侵入式、外部旁路采集、只读归一、中心化存储、MCP 按需检索注入。摒弃「改 Agent 码」「软链接互通」「原生 Session 互导」等不现实方案。本篇直接落地可上线、可简历复用、可个人私有化部署多 Agent 异构 Session专属采集器(Claude/CODex/DSH/OpenCode/Kimi/WorkBuddy/ 豆包)统一消息归一化解析层(解决所有 Schema 异构)增量同步、去重、时间戳对齐核心逻辑。 阅读详情

相关推荐

【实战教程】BMAD-METHOD 入门教程:用 AI 组建你的“七人开发团队”

简单说,BMAD-METHOD 就像一个会自己运转的“AI 软件公司”。它不是某个单一应用,而是一种AI 工作流方法论—— 把一个项目拆解成多个角色(产品、架构、前后端、测试、运维等),每个角色由一个 AI 智能体负责协作,就像你真的在带一个 7 人团队。GitHub 项目地址 👉目前 Star 数已经达到了恐怖的 20k,可见这套方法的影响力不小。BMAD-METHOD 的核心理念不是“生成代码”,而是“自动化协作”。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1588

Java在线考试系统怎么选?从技术选型到落地部署的完整指南

Java在线考试系统怎么选?本文从技术选型、核心功能、部署运维、二次开发等维度,梳理了Java在线考试系统的选型要点。

麦塔在线考试培训系统 355

基于PHP的游戏平台充值支付码 php版.zip

基于PHP的游戏平台充值支付码 php版.zip

大数据 之 Snappy

【代码】大数据 之 Snappy。

zhixingheyi_tian的博客 188

Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动

dm‑r2dbc 是面向达梦 DM8 的实验性 R2DBC 驱动,混合架构:Netty 异步网络传输层 + JDBC 驱动协议编解码复用。核心思路:不去逆向达梦私有协议二进制报文,直接复用达梦 JDBC 驱动内部已经成熟的编解码逻辑,通过反射替换 JDBC 内部默认阻塞 Socket 传输实现,替换为 Netty NIO 异步通道,实现真正异步非阻塞网络 IO。

jinyuttt的专栏 299

Spring AI RAG管道构建与优化

<think>我们只需要根据给定的内容生成摘要(≤150字)。给定内容较长,但核心是Spring AI RAG管道构建与优化,涉及文档加载、分割、嵌入、存储、检索、生成等。摘要应高度概括。 注意用户要求“根据以下内容,生成≤150字的文章摘要”。内容提供了代码等细节,但摘要需抓住要点。 写出摘要,字数≤150。</think>摘要:本文深入讲解Spring AI RAG管道的构建与优化,涵盖文档加载、分割、嵌入、存储、检索到生成的全流程。详细展示了多文档加载(PDF、网页、JSON)、多种分割策略(按页、

BADAO_LIUMANG_QIZHI的博客 224

41面向对象(高级)-抽象类

当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。

weixin_52770734的博客 380

商超智能运营如何落地?从系统架构到实战避坑的完整技术路径

3. **多端交互展示层**:需覆盖顾客使用的**小程序、APP及H5公众号**,以及员工使用的管理后台。答:在应用层引入**适配器模式**。在项目启动时,应强制要求供应商或自研团队产出**部署文档**(含环境变量清单)**二次开发文档**(含核心流程时序图),确保后续维护不受限于个人。- **多租户插件**:MyBatis Plus的`TenantLineInnerInterceptor`可实现SQL层面的自动拼接`store_id`条件,防止开发者因SQL编写疏漏导致的数据越权。

weixin_56812938的博客 539

Java的AI生成式编程工具落地流程

针对Oracle数据库操作场景,让AI自动生成MyBatis-plus的CRUD代码,同时适配Oracle特有的JSON_TABLE、XMLTABLE等高级函数语法,避免手写SQL的语法错误。利用AI的全链路生成能力,快速搭建AI问答机器人、智能风控等Java AI应用原型,整合Stanford CoreNLP、Elasticsearch等组件,大幅缩短新业务的落地期。调试排障阶段‌:把报错堆栈信息直接粘贴给AI,它会结合本地代码上下文定位根因,同时给出可直接运行的修复代码片段,大幅降低Bug排查耗时。

chinalog的专栏 150

电商推返模式的技术架构与系统落地实践

成功的电商推返模式系统,本质是。

weixin_42804741的博客 194

大模型API并发限流解析:中科热备多Key轮换工程方案

灾备与数据保护技术实战:CDP持续保护、数据库备份、异地容灾架构等核心技术深度解析。

2501_92899622的博客 334

工控机之static工具类

static工具类是无状态工具集合:删除构造函数禁止实例化;语法允许一个类同时拥有static函数普通成员变量,但那样它就不是无状态工具类,而是有状态实例类。4. 不要普通成员变量:普通成员变量属于对象实例;单独创建一个管理器类,允许实例化,状态作为普通成员变量;• 工具类(静态类):无状态,ProtocolUtil::xxx();协议转换、校验、格式化;// ✅允许:static成员函数,纯函数,输出仅依赖入参,无副作用。纯工具类:无状态工具集合,只提供公共算法函数,不创建对象、不保存运行时状态。

老赵的博客 211

RocketMQ订单事务消息实战教学

用户下单要同时扣库存、扣余额、加积分,拆成 MQ 异步履约后,原子性、重复投递、部分成功三大难题怎么破?本文用一个真实可跑的下单案例,讲透 RocketMQ 事务消息(half 消息/本地事务/回查)、三层幂等防线(Redis SETNX + DB 唯一索引 + ▎ 条件更新)、业务失败与消费失败的区分处理、按状态补偿的 Saga 关单逆向流程,以及死信工单 + 人工重放的完整闭环。全量代码含 import、pom 依赖、建表 SQL,附三条可演示链路、生产落地清单与面试题速答,跟着做即可复现。

zhenyu333的博客 386

MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?

<think>我们根据要求,生成≤150字的文章摘要。内容主要讲MCP协议深度落地,用Python/Java双语言实现统一工具调用网关。摘要应涵盖核心:MCP网关解决企业REST接口与AI Agent连接问题,通过协议转换、零代码改造,统一鉴权、审计等。需简洁。不超过150字。</think>MCP网关解决企业上百个REST接口无法被AI Agent调用的痛点,通过协议转换、集中鉴权与审计,实现“零代码改造”接入。本文阐述网关五大核心职责与工作流程,并给出Python(FastAPI)与Java双语言实现方

2301_80078096的博客 507

【软件实施】Windows 服务器运维实战

Windows服务器运维实战

低调做人,低调编码,神码都是浮云 320

【SpringBoot请求记录】Spring Boot Actuator 自定义记录 HTTP 服务请求

<think>我们根据内容生成一段摘要,不超过150字。内容主要介绍Spring Boot Actuator自定义记录HTTP请求的架构,推荐使用Actuator+OncePerRequestFilter+ContentCachingRequestWrapper+ContentCachingResponseWrapper,并说明为什么不能直接读取流,以及Filter实现方法。摘要需概括核心点。 浓缩:本文介绍利用Spring Boot Actuator自定义Filter记录HTTP请求细节(如Body、耗

Mr 敦(A.Dun)Java历险记 193

24小时自助健身系统码实战指南:从架构设计到部署运维全解析

为了应对高峰期并发入场,需要在`checkin_record`表中对`member_id``checkin_time`建立联合索引,并利用Redis预扣库存,避免多人同时扫码入场导致的超卖问题。将计时规则抽象为`START_TIME`、`END_TIME`、`UNIT_PRICE`等字段,由后端定时任务统一计算,避免前端因时区或网络问题导致金额计算误差。在开始编码之前,明确架构边界至关重要。一个完整的24小时自助健身系统通常由**用户端小程序/H5**、**管理后台****硬件控制网关**三部分组成。

weixin_56812938的博客 222

C++ 理解 std::thread 在单核多核上的行为差异

std::thread 本身的行为在单核多核上是完全一致的——它都是创建操作系统级别的线程,由操作系统调度器负责分配CPU时间。真正的差异在于操作系统的调度策略以及硬件并行能力。 形象地说: 单核CPU = 一个人(一个核心)同时只能做一件事,但可以在多任务之间快速切换(时间片轮转)。 多核CPU = 多个人(多个核心)可以真正同时做不同的事。

q610098308的专栏 265

SpringBoot3-整合WebSocket指南

@author CoderJia * @create 2024/12/15 下午 08:21 * @Description。

2601_96207145的博客 223

Spring Boot 中的 YAML 完全指南

YAML 是 Spring Boot 推荐的配置文件格式,它让配置表达更清晰、更接近人的阅读习惯。缩进表示层级是多层配置的天然表达方式,列表对象结构比 properties 更容易书写维护。与 properties 相比,YAML 让配置文件从“扁平键值对”变为“结构化文档”,更适合管理大型应用中的复杂配置。当配置层级超过两层或包含列表结构时,YAML 的价值会明显体现出来。无论是小规模应用还是大规模微服务项目,掌握 YAML 的语法 Spring Boot 对其的增强特性都是必要的技能。

weixin_51288065的博客 572

glibc中的ArenaTcache

本文从单线程时代"一个进程只有一个堆"讲起,逐步剖析多线程下 malloc / free 的锁竞争问题,引出 ptmalloc2 的两大核心机制:Arena(把一个大堆拆成多个独立子堆,降低线程间锁竞争)与 TCache(为每个线程提供私有无锁的小块缓存,提升单线程内分配速度)。文章详细对比了 Main Arena 与 Non-Main Arena 的实现差异,梳理了 TCache 与 Fast Bin 的层级关系,并给出 malloc / free 的全链路流程、常见误区与高并发调优建议,最后用一张图帮

2301_79383371的博客 297
上一篇: 知乎周源微信_每周源代码55-NotABlog:指向Windows Live Writer的本地XML-RPC MetaWebLog端点...
下一篇: Hanselminutes播客227-开发人员Mike Calvo的Inside Expression SuperPreview
cunfusq0176
博客等级 码龄12年 21粉丝 244原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值