在 Silverlight 中管理动态内容交付,第 1 部分

2023-11-05

 本文示例源代码或素材下载

在 Silverlight 中管理动态内容交付,第 1 部分目录

  Silverlight 应用程序的大小

  动态生成的 XAML

  动态生成的 XAP

  请求内容

  缓存下载的内容

  下载工具

  下载仅含 XAML 的数据

  使用 XAP 程序包

  处理 XAP 内容

  总结

  任何使用富 Internet 应用程序 (RIA) 的用户都关注安全性和下载大小问题。Silverlight 应用程序受到完整的 Microsoft .NET Framework 子集的支持,因此可能会对本地用户计算机执行有害操作。为此,Silverlight 团队开发了一个全新的安全模型,可防止应用程序调用核心 CLR(.NET Framework 的 Silverlight 版本)中的任何安全关键类。您可以从文章“使用 CoreCLR 编写 Silverlight”中了解有关 Silverlight 安全模型的更多信息,从“开始在整个网站积累更深入的体验”中了解有关构建 Silverlight 应用程序的详细内容。

  下载 Silverlight 插件并不是问题的核心所在,因为此操作只需几秒钟且只能运行一次。但是所下载应用程序的大小会有什么影响呢?

  在本月的专栏中,我将解决 Silverlight 应用程序下载的问题。首先,我将说明如何动态生成 XAML。然后我将讨论如何严格地根据每个用户请求动态启用应用程序功能。在随后可以单独实现一些使用主代码流难以实现的特定于应用程序的功能,更为重要的是,可以分别下载它们,而且可以轻松地与主用户界面相集成。
Silverlight 应用程序的大小

  用户安装了 Silverlight 插件后,他就拥有了 Silverlight 应用程序可能会需要的所有系统程序集。这意味着下载仅限于包含该应用程序的程序集以及任何引用的自定义程序集。最后,应用程序下载文件的大小通常为数万字节。请注意,此估计值仅适用于 RTM 版本的 Silverlight 2 以及在发布模式下编译的代码。

  当然,该应用程序占用的空间可能会更大,尤其是当其包含长算法、图形和媒体内容或动画时。要处理下载时间过长的大型应用程序,一般可采用以下两种方法。一种是流式传输 Silverlight 内容,如 silverlight.live.com 上所述。另一种是将应用程序拆分成可以按需分别下载的独立片段。

  动态生成的 XAML

  Silverlight 插件本质上设计用于显示 XAML 内容。如果 XAML 附带了一些代码隐藏,则该插件会对代码进行处理以生成用户界面并支持任何编码行为或效果。如果您要下载的是 XAML,那么可以通过 URL 直接指向该 XAML;如果不是,则可以通过 XAP 扩展名来引用 Silverlight 程序包。

  XAP 程序包内含指令清单和一或多个程序集。其中一个程序集包含应用程序的入口点;其他程序集仅仅是引用的程序集。用户界面的 XAML 存储在入口点程序集的资源中。在创建和编译项目时,Silverlight 2 的 Visual Studio 2008 扩展会创建一个 XAP 程序包。

  XAML 和 XAP 流都属于 Silverlight 插件知道如何处理的流。但是要下载此类内容,您不必将该插件指向服务器上的物理 XAML 或 XAP 资源。您可以将该插件指向某个 URL,例如,可以指向返回动态生成的 XAML 或 XAP 内容的 URL。

  图 1 显示了一个示例 ASP.NET HTTP 处理程序,它将返回动态创建的某些 XAML。ProcessRequest 方法在 Response 对象上设置内容类型,然后根据配置数据、参数或运行时条件撰写某些 XAML 内容(如动态合成的 XAML)。通过设置 Response 对象的 Expires 属性,您还可以禁止在客户端上缓存资源。如果您所处理的内容会定期改动并需要刷新,则这可能会有所帮助。

图 1 返回 XAML 的 HTTP 处理程序

<%@ WebHandler Language="C#" Class="XamlGenHandler" %>
using System;
using System.Web;
public class XamlGenHandler : IHttpHandler
{
  public void ProcessRequest (HttpContext context)
  {
    // Prevent caching of the response
    context.Response.Expires = -1;
    // Set the type of data we're returning
    context.Response.ContentType = "text/xaml";
    // Create some XAML and return it down the wire
    context.Response.Write("<Canvas xmlns=
      'http://schemas.microsoft.com/client/2007' " +
      "xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>" +
      "<TextBlock Foreground='black' Padding='10' FontSize='20'>
       <Run>XAML content</Run><LineBreak/>" +
      "<Run>[generated " + DateTime.Now.ToLongTimeString() + "]</Run>" +
      "</TextBlock></Canvas>");
  }
  public bool IsReusable
  {
    get {return true;}
  }
}

动态生成的 XAP

  返回动态生成的 XAP 程序包与返回原始 XAML 文本二者的差别并不大,只不过 XAP 程序包不是纯文本文件罢了。XAP 程序包是一个 ZIP 文件,它包含 XML 指令清单和一或多个程序集。通过使用程序包格式,团队可以最大程度地减少下载 Silverlight 应用程序请求的全部内容所需的往返次数。图 2 显示了一个 ASP.NET HTTP 处理程序,它将 XAP 文件的内容写入到 HTTP 响应流中。

在 Silverlight 中管理动态内容交付,第 1 部分图 2 返回 XAP 程序包的 HTTP 处理程序

<%@ WebHandler Language="C#" Class="XapGenHandler" %>
using System;
using System.Web;
public class XapGenHandler : IHttpHandler
{
  public void ProcessRequest (HttpContext context)
  {
    // XAP file to return
    string xapFile = "...";
    // Set the type of data we're returning
    context.Response.ContentType = "application/octet-stream";
    // Create some XAML and return it down the wire
    content.Response.WriteFile(xapFile);
  }
  public bool IsReusable
  {
    get {return true;}
  }
}

  示例代码从现有文件中读取 XAP 数据。显然,如果在项目中嵌入一个 ZIP 库,则可以轻松地动态组合程序包(首先将不同的 DLL 组合在一起,然后创建适当的 XML 指令清单文件)。

  如果想返回 XAP 内容,可将响应的内容类型设置为 application/octet-stream,这是一种 MIME 类型,通常用于标识通用的二进制内容。

  要将该插件与 HTTP 处理程序或您选择的任何其他端点相关联,可使用常见的 Silverlight 编程技术。例如,您可以在 ASP.NET 页面中使用 Silverlight 服务器控件:

<asp:Silverlight ID="Xaml1" runat="server"
  Source="~/xap.ashx"
  MinimumVersion="2.0.30523"
  Width="100%"
  Height="100%" />

  在这两个示例中,Silverlight 应用程序的工厂均位于 Web 服务器上。如果宿主页面需要动态指示要下载的内容,则这不失为一种不错的方法。

  但是,这只是一种可能的情况。还有另一种情况可能更常见,即需要下载当前 Silverlight 应用程序的可选组件。在这种情况下,选择和下载外部内容的逻辑全部位于客户端上运行的 Silverlight 插件中。

  请求内容

  Silverlight 2 为按需下载代码和/或 XAML 提供了一个丰富而又强大的 API,可用来下载内容并将其插入到现有的 XAML 文档对象模型中。

  XAML 树的所有可视元素都有一个名为 Children 的属性,可用来以编程方式添加或删除任意大小的子元素。例如,您可以附加从同一服务器甚至是从信任的可选远程服务器下载的整个用户控件。示例如下行所示:

StackPanel1.Children.Add(downloadedContent);

  由参数表示的用户控件被添加到 StackPanel XAML 元素的 Children 集合中。呈现是即时性的,而用户界面是实时更新的。

  您可以做的不仅仅是下载内容并将其附加到现有文档对象模型中。您可以执行更多其他操作,例如,您可以在本地将其缓存到应用程序的本地存储中并检查自己的缓存是否存在请求内容,在确认完毕后再向服务器发出新请求。

此方法使您能够永久存储下载的内容。但在某些情况下,这可能有些多余。另一种简单的方法不需要任何额外的工作:让浏览器为您缓存 XAP 资源。

  缓存下载的内容

  从 Web 服务器获得的 XAP 程序包对浏览器而言没有任何特殊含义。因此,浏览器在缓存从 Web 服务器获得的任何其他内容的同时也会缓存它,但这一切都遵守在宿主 HTML 页面中由请求或类似 meta 标记中的 cache-control 和 "expires" HTTP 标头所确定的请求缓存策略。

  请注意,当遇到需要下载到浏览器中的 XAP 资源时,可以在通常使用 meta 标记或 ASP.NET 指令属性插入的页面中通过进行一些设置来控制缓存。如果 XAP 资源将要通过 HTTP 处理程序下载(如之前的示例所示),则您可以控制特定请求的缓存。

  值得注意的另外一点是,这里被缓存的是原始 XAP 内容(包括程序集和 XAML)。因此,正在运行的应用程序可以通过编程方式修改原始 XAML。但是,这种更改不会被自动缓存,同样,您从 XAP 程序包中提取的任何资源(媒体、图像等)也不会被单独缓存。这样一来,每次用户访问该页面时,都不会重新下载 XAP 程序包(除非已过期),但会重新提取所有资源。此外,您在先前的会话中对这些资源所做的所有更改也将丢失。要保留对 XAML 文档对象模型所做的更改,必须安排您自己的定制缓存。(这是一种很酷的方法,我将在本主题的第 2 部分对此加以介绍。)

  最后还要注意,保存在浏览器缓存中的 XAP 程序包的存留完全取决于用户。如果用户决定在某个时间清除缓存,则其中的所有内容都将丢失(包括 XAP 程序包)。要永久存储 Silverlight XAP 程序包,必须求助于独立存储(此主题也安排在第 2 部分进行介绍)。

  下载工具
在编写 Silverlight 应用程序时,要记住届时需要用到但却未打包到应用程序的 XAP 中的所有资源都必须从服务器显式下载。WebClient 类是可用来安排附加资源下载的主要 Silverlight 工具。它提供了一些异步方法,可用于将数据发送到 Web 资源以及从 Web 资源接收数据。下面介绍它的工作原理:

WebClient wc = new WebClient();
wc.DownloadStringCompleted +=
   new DownloadStringCompletedEventHandler(callback);
wc.DownloadStringAsync(address);

  DownloadStringAsync 方法操控 HTTP GET 并捕获 URL 响应作为一个字符串。此字符串由相关联的回调接收,如下所示:

void callback(object sender, DownloadStringCompletedEventArgs e)
{
 if (e.Error != null)
   return;
 string response = e.Result;
...
}

  稍后您会看到,此方法非常适合于下载没有附加任何代码隐藏的纯 XAML。要以编程方式下载二进制数据(如 XAP 程序包),您需要用到流并需要使用一种略微不同的方法。这时 WebClient 类仍很有帮助,因为它在 OpenReadAsync 中提供了一种非常适合的方法:

WebClient wc = new WebClient();
wc.OpenReadCompleted +=
   new OpenReadCompletedEventHandler(callback);
wc.OpenReadAsync(address);

  关联回调的结构与上一示例中的完全相同。最后,使用 DownloadStringAsync 方法获取一个简单的字符串;使用 OpenReadAsync 方法获取任意数据的流。无论您决定下载字符串还是流,都属于个人喜好问题,在本质上取决于您打算如何使用接收到的数据。

  另外还要注意,WebClient 提供了一对可以向远程 URL 执行写入操作的方法:UploadStringAsync(用于发布字符串)和 OpenWriteAsync(使用流将任意数据上载到 URL)。
 您可以使用 Headers 属性来指定附加标头,因为默认情况下该类并不指定任何标头。但应注意,您设置的某些标头会被 Framework 剥离而改为进行内部管理。这些标头包括 Referer、Connection 和 User-Agent。Content-Type 标头(如果已设置)会被保留。

  在下载资源时,WebClient 类会在尝试连接之前透明地使用浏览器缓存。如果 XAML 或 XAP 资源不在缓存中,则该类将继续执行下载。之所以要从 Silverlight 应用程序下载内容,是 Silverlight 运行时和主机浏览器提供给插件的内部 API 这二者的共同作用而决定的。这意味着在 WebClient 的掩盖下,Silverlight 运行时会与浏览器沙箱进行沟通,以查看请求的资源是否已存在于缓存中。如果不在,Silverlight 会依照自己的安全策略继续授权请求。当数据最终从端点返回时,Silverlight 运行时会通过浏览器的服务将其缓存在本地,并完全遵循当前的缓存策略。

  Silverlight System.Net 命名空间中的 WebClient 类和其他 HTTP 类具有许多安全限制。特别是 WebClient 类仅支持 HTTP 和 HTTPS 方案(当通过流进行下载时)以及 FILE 方案(当下载纯 XAML 时)。跨方案访问被严格禁止,因此,如果宿主页面是通过 HTTP 下载的,则无法将 WebClient 指向 HTTPS 资源(反之亦然)。WebClient 请求通常可以进入不同浏览器区域内的某个 URL,但无法从一个 Internet 区域移至具有更严格限制的另一个区域。Silverlight 目前仅在 Windows 操作系统中支持区域。

  最后,仅当远程站点通过在其根目录下托管适当的 XML 文件来加入时,才支持跨域访问。另外还要注意,跨域访问对 HTTPS-to-HTTPS 方案不起作用。

  同一个 WebClient 对象无法同时处理多个请求。应检查 IsBusy 属性(这是一个布尔值)以确定您的代码在通过同一个 WebClient 实例发出新请求时是否安全。如果使用多个 WebClient 对象(可能在不同的线程上),则可以同时启动多个下载。

  下载仅含 XAML 的数据

  让我们看一看如何使用 WebClient 下载 XAML 数据并将其集成到可视树中。在 Silverlight 2 应用程序中,动态下载纯 XAML 数据不一定会为您带来您需要的编程功能。XAML 字符串必须是纯 XAML,没有需要在运行时解析的任何引用,例如绑定或对样式、资源和事件的引用。

  XAML 字符串下载完毕后,可使用 XamlReader 类将其转换为 UI 元素,然后即可添加到现有文档对象模型中。下面的代码显示了如何以编程方式从某个 URL 下载 XAML 字符串。请注意,您需要提供 URL 作为 Uri 对象:

WebClient client = new WebClient();
client.DownloadStringCompleted +=
  new DownloadStringCompletedEventHandler(OnDownloadCompleted);
Uri uri = new Uri("xaml.ashx", UriKind.Relative);
client.DownloadStringAsync(uri);

  该 URL 可以指向纯 XAML 资源或指向返回 text/xaml 响应的端点。下面的代码将处理下载的 XAML 并将其附加到可视树中的一个占位符上:

void OnDownloadCompleted(object sender, DownloadStringCompletedEventArgs e)
{
  // Parse XAML to a UI element
  string xaml = e.Result;
  UIElement dom = XamlReader.Load(xaml) as UIElement;
  // Append to the DOM
  Placeholder.Children.Clear();
  Placeholder.Children.Add(dom);
}

  如前所述,占位符可以是插件中当前呈现的文档对象模型中的任何元素。请注意,UI 元素的子元素会形成一个集合,它们将呈现为一个序列。这意味着,为避免元素之间产生不必要的重叠,在更新时应首先删除这些元素然后再重新添加。

  XAML 序列化(通过 XamlReader 和 XamlWriter 类执行)所基于的原则是扩展引用被取消引用,而且运行时值通过设计时设置进行保存。如果希望下载 XAML 内容并在显示前对其进行自定义(例如,通过动态数据绑定),这时该怎么办?您无法将绑定嵌入到 XAML 源中,但可以在下载的 XAML 中定义占位符、通过数据解析检索它们并以编程方式将其设置为您希望的任何值。但在 Silverlight 2 中,下载 XAP 程序包无疑是更合理的解决方案。

  使用 XAP 程序包

  XAP 程序包内含整个 Silverlight 应用程序,其用户界面主要由一个用户控件构成,此控件实际上只是 XAML 标记和代码的容器。

  如前所述,XAP 程序包内含指令清单文件所跟踪的一或多个程序集。除下载外,处理 XAP 程序包还会导致两个额外的步骤。您需要提取主程序集,然后实例化用于启动已下载应用程序的入口点类。毫无疑问,此时您可以在 XAML 中使用绑定、样式、事件以及其他任何需要的内容。使用 XAP 程序包时,是由 Silverlight 运行时(而不是序列化 API)来处理 XAML 并在随后解析引用。这将对编程功能产生巨大影响。

  下载和处理 XAP 程序包还需要许多其他工作,而不仅仅是通过字符串来构建对象模型。其中的一些工作(通常包括内容下载和程序集提取)可以转给可重复使用的 downloader 类(请参见图 3)。

在 Silverlight 中管理动态内容交付,第 1 部分图 3 动态下载 XAP 程序包

public partial class Page : UserControl
{
  private UIElement content = null;
  private TabItem item = null;
  public Page()
  {
    InitializeComponent();
  }
  private void chkNewContent_Click(object sender, RoutedEventArgs e)
  {
    bool shouldDisplay = (sender as CheckBox).IsChecked.Value; 
    if (shouldDisplay)
    {
      if (!IsContentAvailable())
        DownloadContent();
      else
        ShowContent();
    }
    else
    {
      HideContent();
    }
  }
  private bool IsContentAvailable()
  {
    return (content != null);
  }
  private void DownloadContent()
  {
    Downloader dl = new Downloader();
    dl.XapDownloaded +=
      new EventHandler<XapEventArgs>(OnPackageDownload);
    dl.LoadPackage("more.xap", "more.dll", "More.ExtraTab");
  }
  void OnPackageDownload(object sender, XapEventArgs e)
  {
    content = e.DownloadedContent;
    ShowContent();
  }
  private void HideContent()
  {
    this.TabList.Items.Remove(item);
  }
  private void ShowContent()
  {
    item = new TabItem();
    item.Header = "Extra tab";
    item.Content = content;
    this.TabList.Items.Add(item);
  }
}

  图 3 中的代码显示了一个基于选项卡的示例应用程序,它会在用户首次单击复选框时加载一个新选项卡。在本例中,会下载一个新的 XAP 程序包,而且其用户界面中包含的用户控件将被插入到新建的 TabItem 中。隐藏新下载的程序包中的内容是一个简单的客户端操作。由于以下两个合理原因,重新显示该内容并不需要第二次往返动作:该内容被缓存在内存中;从中构建该内容的程序包被缓存在浏览器缓存中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Silverlight 中管理动态内容交付,第 1 部分 的相关文章

  • 强制 const 存储返回的值 value

    这就是我想要实现的目标 struct test const test returnconst return test test returnnonconst return test int main test t1 returnnoncon
  • 如何在运行 ASP.NET 页面时以编程方式设置表格背景?

    我有一个 aspx 页面 其默认背景颜色是一种 当选择单选按钮的某个选项时 我需要能够以编程方式更改它 我尝试设置表的 ID 字段 但似乎无法在 C 代码隐藏文件中访问它 我原来的表是 table style width 100 backg
  • NHibernate手动控制抓取

    我正在使用 NHibernate 我想控制手动获取相关实体 这是我的示例实体 public class Post public virtual long Id get set public virtual string Title get
  • Web API 复杂参数属性均为 null

    我有一个 Web API 服务调用可以更新用户的首选项 不幸的是 当我从 jQuery ajax 调用中调用此 POST 方法时 请求参数对象的属性始终为 null 或默认值 而不是传入的值 如果我使用 REST 客户端调用相同的方法 我使
  • 字典的线程安全

    如果我有一个 Dictionary
  • C# 委托实例化与仅传递方法引用 [重复]

    这个问题在这里已经有答案了 我有一个简单的问题 与仅传递函数引用相比 实例化 C 委托有什么优势 我的意思是 Why do Thread t new Thread new ThreadStart SomeObject SomeMethod
  • 本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

    这相当复杂 所以请耐心听我说 我有一个用本机 仅限 Win32 C 编码的第 3 方程序 目标 作为目标设计的一部分 它实现了一个 dll 插件系统 本机 DLL 当放置在程序的 ext 目录中时 由目标加载 然后 目标根据需要调用每个 D
  • 带有 Prism 区域适配器的 AvalonDock

    我看到了一些关于 SO 的问题 但似乎没有一个适合我 我希望能够使用伟大的使用 Prism 4 但是 所有示例区域适配器均适用于 Avalondock 1 x 系列 我无法使其工作 有人有关于如何为 AvalonDock 的 LayoutD
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • 将控制台输入和输出重定向到文本框

    您好 提前致谢 我正在尝试 非常努力 将控制台输入和输出重定向到文本框 到目前为止 输出工作正常 但问题在于输入 例如 我无法执行一个简单的程序来执行以下操作 Console WriteLine 请输入您的姓名 字符串名称 Console
  • Parallel ForEach 的本地初始化如何工作?

    我不确定 Parallel ForEach 中本地 init 函数的使用 如 msdn 文章中所述 http msdn microsoft com en us library dd997393 aspx http msdn microsof
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 为什么一个结构体,如果没有显式的默认构造函数,则无法编译将另一个结构体作为成员包装在联合体中的结构体?

    这就是我所说的关系 struct A int i 1 struct B union A a void main B b 在这个星座中 我的编译器 vs2015 抱怨 B 的默认构造函数B B void 被删除 并附有编译器已生成的注释B B
  • 隐式类型转换 - 编译器错误

    这个问题与this https stackoverflow com questions 3529449 can i make the ternary operator treat my class like a bool问题 下面的代码在V
  • 以编程方式连接和断开 USB,“无需拔出和重新插入”

    我需要以编程方式连接和断开 USB 也就是说 我已经插入了USB设备 我需要使用 C NET 应用程序传输文件 该应用程序将监视特定文件夹并将文件从该文件夹传输到 USB 驱动器 我需要在文件传输后断开 USB 设备的连接 并在需要时连接
  • 警告从 lambda 返回捕获的引用

    我尝试使用 lambda 有条件地将引用绑定到两个变量之一 int foo bar int choice gt int if true some condition return foo else return bar 这会在 clang
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效
  • In 和 Out 属性在 .NET 中如何工作?

    我一直在尝试跨序列化数组AppDomain边界 使用以下代码 public int Read byte buffer int offset int count return base Read buffer offset count 作为猜
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • vue常用指令和用法

    文章目录 1 v text 2 v html 3 v on 4 v show 5 v if 6 v bind 7 v for 8 v model 1 v text 设置标签的文本值内容 默然写法会替换全部内容 使用插值表达式 可以替换指定内
  • 题解:按钮加减计数器设计(单片机C51)(外部中断)

    需求 使用4位共阴极段码表及共阳极数码管 通过外部中断方式 实现两个按钮分配加1 减1功能 今天我就来讲解一下这道题 目录 1 代码 1 1定义头文件 1 2定义延时函数 毫秒 1 3定义主函数 1 4定义0 15共阴极数码管字符码 1 5
  • Linux 操作系统管理命令(全)

    目录 1 Linux常用命令 1 date 2 pwd命令 3 cd命令 4 cal命令 5 who命令 6 wc命令 7 uname命令 8 clear命令 9 logout命令 10 shutdown命令 2 命令高级操作 1 命令补全
  • VQ-VAE-2

    原文链接 Generating Diverse High Fidelity Images with VQ VAE 2 加载速度慢点这里 中科院镜像 由于科研需要 最近在学习图像生成相关的文献知识 VQ VAE 2是我目前了解到的比较新的生成
  • PMD检查java代码:为了提升性能,正确使用记录日志的语句(GuardLogStatement)

    https docs pmd code org pmd doc 6 55 0 pmd rules java bestpractices html guardlogstatement 对应记录日志的语句 要首先检查对应的日志级别有没有实际打开
  • Windows下VS2015编译caffe(CPU ONLY)

    本文参照了 Windows下VS2015编译caffe 零基础 1 环境 Windows 7VS2015 CPU ONLY 2 准备工作 原文说 https github com BVLC caffe tree windows Requir
  • linux验证cuda安装成功_CUDA9.1在Linux系统下runfile方式安装手册

    一 准备工作 确认是CUDA9 1 支持的Linux系统版本 3 确认gcc已安装 输入gcc version命令 如果有报错信息 需要重新安装gcc 4 确认安装了正确版本的kernel devel和kernel headers unam
  • 利用三轴加速度求解位移的算法—来自飞思卡尔方案

    在要求精度不高的情况 可以使用三轴加速度积分得到位移 飞思卡尔给出了官方方法 下文来自翻译说明 cache freescale com files senso 摘要 此文档描述并使用MMA7260QT三轴加速计和低功耗的9S08QG8八位单
  • Qt在connect中使用lambda表达式(最简单)

    若想在QT中使用lambda表达式需要在项目文件中的 pro 中加入 CONFIG c 11 例子 当点击按钮时 打印一个 输出 需要包含按钮类和打印调试类 include
  • ROS-Qt-转CMake编译以及qmake第三方库添加及其他

    Qt 开发ROS 界面的方法 方法2 带ui的工作空间配置 以ROS节点执行 步骤1 mkdir catkin qt cd catkin qt mkdir src cd src catkin init workpasce cd catkin
  • volatile足以保证数据同步吗

    在讨论之前必须先搞清四种存储介质 寄存器 高级缓存 RAM和ROM RAM与ROM大家都比较熟悉了 可以看成是我们经常说的内存与硬盘 寄存器属于处理器里面的一部分 而高级缓存cache是CPU设计者为提高性能引入的一个缓存 也可以说是属于处
  • axios post方式同时传递pram和json参数

    废话不多说 直接上代码 1 单独传递表单参数 后台使用 RequestParam接收 let postData mobile this account password this password loginType 0 let postD
  • 编译原理------语法分析器C/C++代码实现

    一 实验目的 编制一个递归下降分析程序 实现对词法分析程序所提供的单词序列的语法检查和结构分析 二 实验内容 利用C语言编制递归下降分析程序 并对简单语言进行语法分析 2 1 待分析的简单语言的语法 用扩充的BNF表示如下 lt 程序 gt
  • npm nrm安装后报错

    错误信息为 C Users Lenovo AppData Roaming npm node modules nrm cli js 9 const open require open Error ERR REQUIRE ESM require
  • Hadoop学习笔记(六)(Spark + Flink + Beam)

    spark 计算框架 速度 易用 通用性 Mapreduce是进程级别的 Spark是线程级别的 Spark生态系统 DBAS Berkeley Data Analytics Stack Mesos HDFS Tachyon 基于内存的文件
  • LRUCache详解

    1 概念 LRU是Least Recently Used的缩写 意思是最近最少使用 它是一种Cache替换算法 Cache的容量有限 因此当Cache的容量用完后 而又有新的内容需要添加进来时 就需要挑选并舍弃原有的部分内容 从而腾出空间来
  • 【C++类模板详解】——快速入门C++风靡全球的原因

    C 类模板详解 快速入门C 风靡全球的原因 C 是目前全球最为流行 应用范围最为广泛的编程语言之一 其强大的语言特性和灵活的代码设计方式使得它被广泛应用于各种领域 包括操作系统 数据库 游戏 框架等等 而在C 中 类模板是一种非常重要的编程
  • Unity中如何让物体和相机一起动

    Unity中开发VR或者AR应用中我们想要物体和相机跟随着进行移动 我们需要先获得相机的参数 其次我们需要修改物体的参数使得其跟随移动 public class TestCubeStability MonoBehaviour public
  • javascript 优雅实现时间格式化

    有的时候 我们需要一定格式的 时间 比如 2017 05 12 08 48 这样的格式 上代码先 时间格式化 第一种 function formatDate time var date new Date time var year date
  • 在 Silverlight 中管理动态内容交付,第 1 部分

    本文示例源代码或素材下载 目录 Silverlight 应用程序的大小 动态生成的 XAML 动态生成的 XAP 请求内容 缓存下载的内容 下载工具 下载仅含 XAML 的数据 使用 XAP 程序包 处理 XAP 内容 总结 任何使用富 I