【翻译】UX不是UI, 但是UI绝对是UX

首席开发顾问Madeline Schenck阐释了通常情况下UI和UX是如何相互转化的,以及他们二者的不同内涵。

当人们听说我专注于用户体验的时候,他们常常认为我是做前端设计的。

当我刚开始加入微软的首席团队的时候,我接触到很多工作都是有关前端设计的。在经过很多次如何为客户提供价值的讨论之后,我开始意识到在开发的过程中产生了很多专业性的词语(比如用户体验和以用户为中心的设计),但只有很少数的人能完全掌握什么才是“用户体验”

一般情况下,用户体验UX这个术语是可以替换为用户界面UI,或者合称为UI/UX。 UI(用户界面)指的是,用户在终端上打开一个解决方案(APP,网站,仪表盘等)时看到并且可以与之交互的视觉效果。绝大多数情况下,当有人请我为他们的产品做用户体验UX的时候,他们的真实意图往往是希望他们产品的用户界面UI看起来很漂亮。请不要误解,用户界面UI和视觉设计依旧是一个产品用户体验UX中的重要组成部分,但是如果产品的导航菜单什么的组织的不到位,不恰当,那再漂亮的色彩和酷炫的动画也无法帮助您的用户有良好的使用体验。

我没有将UI和UX混为一个可以相互转化的术语,在韦恩图中比较这两个词可以更直观清晰一点:除UI之外的部分都是归属于UX范围内的。

UX和UI的包含关系

正如我之前提到的,应用程序的UI指的是用户所能看见的和交互的视觉效果,包括主题颜色,字体,页面中不同元素的尺寸大小等。UI是解决方案的UX中重要的组成部分,但不是唯一的部分,有时候它甚至都不是最重要的部分。

在开发一个解决方案的时候,你还不得不考虑一些事情,比如如何组织导航菜单,用户如何从应用程序转到你的站点,Windows和macOS用户之间不同的使用模式,目标受众的年龄范围以及目标受众使用某一功能和路径高于其他的频率等等。类似的还有很多,并且还可以再增加。实际上,用户体验包含了在解决方案中一切能影响用户整体体验的要素,当然这里面包括了用户界面UI。

如果我们深入地去了解那些交付成果以及落实到的技术上,UX和UI的可以被细分成下面这样 。

UX和UI所包含内容的细化

像排版选择,颜色主题,页面的视觉设计等等这些内容通常都属于产品的用户体验UX内用户界面UI这个小范围内。我曾与很多客户合作过,然而他们通常都只将这些东西作为UI决策处理,而不会考虑去搜集用户对当前解决方案的反馈或者是针对用户做任何研究。根据我个人的经验,从短期和长远的角度去看,这种处理方式对用户和开发团队产生了不好的效应。所有的用户界面UI的决策都应该包含对用户偏好的了解,将这些信息用在开发过程中,可以避免日后代价巨大的返工。

举个例子:你是一个需要决定为一个应用程序确定色彩的设计师。你虽然受制于公司品牌特色的限制,但是仍然在考虑着去使用一个特别的颜色让这个应用程序在视觉和感受上都更加出色。你可能是项目中唯一的设计师,所以你经常需要自己来决定所有的设计决策。最初,你选定了中蓝色的背景和白色、纤细的文本。因为你没有任何用户调研可供使用,也没有时间去获取一些用户相关的需求,所以最后你只是根据外观做了一个界面。然而这样做出来的方案,失去了设计中最重要的东西——用户。你如果可以花了一些时间与目标用户交谈或查看他们此前提供的反馈,那就会发现你的最终用户往往超过50岁并且通常他们20来岁时候拥有更差的视力。因此,设计具有高对比度配色方案和更大文本的布局是有意义的。现在有了关于用户的背景信息,您可以选择使用16px粗体白色字体的深蓝色背景作为应用程序的导航菜单。这样做节省了开发团队(和您自己)的时间,因为用户不会抱怨易读性,您和开发人员也不必返工去修改配色方案。

像用户调研、现有产品的用户反馈、人物画像等都是与用户体验UX息息相关的要素。这些要素并不是专门为了产品创建一个用户界面UI,但也不意味着他们从来都不重要。做出用户界面UI的决策绝不能让他发生在只包含UI的范围内。接纳用户,并把他们的反馈意见融入开发和设计的环节中去,这都能为你和你的团队提供宝贵的参考。了解UX不仅仅局限于您的解决方案的UI,这是识别到UX是如何为你的所有技术解决方案节省时间和精力的第一步。

原文地址:Premier Developer | UX is not UI, but UI is definitely UX

【翻译】微软Windows hello和无密码登陆技术的工作原理概述

关于FIDO2,CTAP2和WebAuthn

在Identity Standards工作的这一周是十分荣幸的,因为我们在微软庆祝我们发布第一个WebAuthn依赖方。这一依赖方(Relying Partiy)在Xbox,Skype和Outlook.com等基础上都实现了标准化的无密码身份验证。但是什么是这次实现中难点的真实部分?他们又是怎么适配的?请继续阅读,了解W3C WebAuthn是如何与FIDO2 CATP2规范进行交互的。我们将从行业标准的角度出发,并且在最后我们将总结微软是如何让他们生效的。为了理解FIDO2认证是如何工作的,你需要了解两个不同标准体系中的两个规范相关的知识。Web身份认证(WebAuthn)的规范在W3C(浏览器支持)查阅,此外,Client-to-Authenticator(CTAP2)的规范可以参见FIDO Alliance(一个从事硬件和平台相关的人都加入进来,为了解决在线快速认证的问题)。

整体情况

CTAP2和WebAuthn定义了一个抽象层,这个抽象层可以为强认证凭据构建一个生态系统。运行给定的“客户端设备”上的任何可交互客户端都可以使用一个标准化模式与任何可交互的身份验证设备进行交互——这也许意味着平台认证设备(Platform Authenticator)可以被内置在客户端设备或者漫游认证设备(Roaming Authenticator)中,而这些设备也可以通过USB、BLE或者NFC方式连接到客户端设备。在用户必须通过使用“用户手势(User Gesture)”这一行为来同意某一操作的条件下,验证设备就可以安全地创建并本地存储强加密密钥。一旦这些客户端限定的密钥被创建,那么就可以请求认证(attestation)并将其发送给客户端以进行注册和认证(authentication)。另一方面,用户手势则由私钥执行的签名类型进行映射。

CTAP and WebAuthn

我们绘制了一个关于CTAP和WebAuthn作用机制的图(如下图所示)。浅蓝色虚线代表了面向客户端的平台API的方式是一个执行选择。 

关于WebAuthn/CTAP2结合作用的几个部分的介绍:

依赖方和客户端(Relying Parties & Clients)

依赖方是那些有意使用强凭据的Web或者原生应用。在原生情况下,运行在客户端设备上的依赖方也能够通过WebAuthn客户端进行直接的WebAuhtn调用。在Web环境下,有意使用凭据的实体是不能直接与WebAuthn API进行交互的,因此必须借助浏览器作为代理来进行交互。需要注意的是:不要将FIDO依赖方和联合依赖方(Federated Relying Parties)混淆,上图中并没有单点登录(Single Sign-On)。

客户端设备(Client Device)

客户端设备是托管给拥有强认证的硬件设备,比如笔记本电脑和手机。

平台认证器(Platform Authenticator)

平台认证器通常是依托于客户端设备的,并且不能通过跨平台传输协议(如USB,NFC和BLE)来进行访问。常见的平台认证器包括笔记本电脑上的指纹读取和智能手机前置摄像头的面部识别。

漫游认证器(Roaming Authenticator)

漫游认证器可以连接到多个客户端设备,但是必须通过支持的传输协议进行交互。常见的漫游认证器包括USB安全密钥,支持BLE的智能手机APP或者支持NFC的感应卡。这些认证器可能需要支持CTAP1,CTAP2或者同时支持。

CTAP2平台/主机设备(CTAP2 Platform/Host)

CTAP2平台(在CTAP2规范也被称之为“主机”)是与认证器进行信息沟通的客户端设备的一部分。该平台负责安全地报告请求源以及调用CTAP2 Cbor API。在平台不是CTAP2识别的情况下,客户端本身就难免承载更多的负担,并且内部机理可能有着些微的不同。

许多依赖方和客户端可以再耽搁客户端设备上与多个认证器进行交互。用户可能就需要安装不同支持WebAuthn的浏览器,当然,也可能是同时拥有内置的指纹识别器,插入式的安全密钥或者支持BLE的手机APP。WebAuthn API能使客户端向认证器提出请求——为了创建一个密钥,也能使客户端获取密钥断言,反馈容量和管理PIN等。

交互部分

在使用WebAuthn和CTAP2之前,我们使用的是U2F和CTAP1。U2F是FIDO联盟的一个通用第二级因素规范(universal second factor specification)并且仍有很多认证器在使用CTAP1并管理U2F凭证,WebAuthn旨在与CTAP1认证器进行交互,且U2F仍旧可以使用,只要依赖方没有限定只能使用FIDO2功能。 FIDO2认证器已经实现的,WebAuthn依赖方可能需要的功能包括:

  • 每个依赖方可以存储多个账户的密钥
  • 客户端PIN
  • 定位(认证器返回的位置)
  • HMAC-secret(可以启用离线方案)

其他的功能看起来很酷,也许将来会用得到,但是现在并没有被应用:

  • 业务审批
  • 用户验证索引(允许服务器去了解本地存储的生物识别是否随着时间而产生了改变)
  • 用户验证模式(依赖方可以指定可接受的误识(false acceptance)和拒识率( false rejection rates))

未来,博客将发文来探讨这些交互项目的好处以及内部工作原理(其中一些以及在规范中提及,但并未进行任何实现)。

微软的实现方式

微软的FIDO2实现以及在市场上有很多年了:独立实现的,并且符合标准的软件和服务。截止到Windows 10 2018年10月更新的发布为止,所有的微软组建都更新到使用最新的WebAuthn RC版本——这个版本是一个稳定的版本,在规范进行最终审核之前是不会进行任何规则上的变更的。由于微软是世界上最早部署FIDO2的公司之一,一些受欢迎的非微软组件的组合(combinations)将无法实现交互——但是请给一点时间去解决。请记住,规范的普及并不会一蹴而就。作为一个有责任的企业,我们将努力实现所有组件都能以正确的扩展方式来支持规范。

Current MSFT WebAuthn/CTAP2 Functionality

下面是微软一些实现的大致布局: 

  • 微软账户扮演着WebAuthn依赖方的角色。如果您不熟悉微软账户,其实它是Skype,Xbox,Outlook和其他微软产品的登录服务。登录行为使用JavaScript触发Edge与WebAuthn进行通信。微软账户要求认证器拥有下列功能:
    • 密钥需本地存储在认证器,而不是存储在某个服务器上
    • 有效的离线方案(例如:HMAC-secret)
    • 用户能够在同一个认证器上存储多个用户账户的密钥
    • 如有必要,认证器需要使用客户端PIN来解锁TPM
    注意:这是微软现行的要求。如果需要被称为“微软兼容”的官方发布和维护的扩展列表,请参阅此文档。由于微软账户需要FIDO2 CTAP2认证器特有的功能和扩展,因此所有站点将不接受CTAP1(U2F)凭据。
  • 微软Edge浏览器扮演着WebAuthn客户端的角色。Edge可以处理上面提到的WebAuthn/CTAP2特性的UI,并且支持AppID扩展。Edge能够与CTAP1和CTAP2认证器进行交互,这意味着它可以更容易地进行U2F和FIDO2凭据的创建和使用。然而Edge并不使用U2F协议,所以依赖方被要求只能使用WebAuthn规范。很遗憾,目前Edge on Android不支持WebAuthn。
    • 有关支持WebAuthn和CTAP的Edge权威信息可以在开发指南中找到。
  • Windows 10则扮演着平台的角色。它托管着Win32 平台的WebAuthn API,这能够使得客户端可以与Windows Hello进行交互,以便提醒用户与认证器进行交互。有关Windows Hello的工作机制请参阅他们的博文。
  • 漫游认证器

你也许注意到,以上布局中没有任何“微软”相关的漫游认证器。这是因为我们已经有了很强大的产品生态系统,专门用于强身份验证。并且我们的每个客户(无论是企业还是个人)都对安全性、易用性、分配方式和账户恢复有着不同的需求。如果您需要查看不断更新的FIDO2认证器,您可以参阅这个链接:https://fidoalliance.org/certification/fido-certified-products/。这个列表涵盖了有关内置认证器,漫游认证器甚至是经认证的芯片,且需要注意的是,这个列表仅仅是初期FIDO2涵盖面。虽然USB安全密钥是现在最常见的漫游认证器,但是未来会发生改变,我们需要关注NFC和BLE领域的大量创新,以及将FIDO2整合到智能手机App,智能卡,健身定位器以及能想到的其他地方。

虽然上图在理论上很有意思,但是它的确是一个真实的可交互布局,并且用户最终可以在更多服务中利用认证器——如果能够实现,微软对这部分的投入将会十分值得。我们这个行业仍在追求普遍的标准化的无密码身份验证,我们也在努力的朝着这一目标实现。

下一步工作

这篇概述涵盖了WebAuthn/CTAP2交互的实现,但是这只是冰山一角。在未来的博客文章中我们将深入研究交互本身的一些细节,包括:

  • 如何存储密钥以及留存密钥的重要性
  • 如何使得U2F/CTAP1的正常进行向后兼容
  • 一些具体的扩展以及他们的商业价值
  • 使用第一因素和第二因素认证WebAuthn的差异
  • 开发人员如何成为WebAuthn和CTAP的依赖方
  • 安全措施是如何保证它是安全的

原文链接:All about FIDO2, CTAP2 and WebAuthn

【翻译】Visual Studio 2019中UX和UI的变化预览

近年来,我们了解到,与您,我们亲爱的用户,分享关于Visual Studio的进步可以尽快和频繁地帮助我们为社区提供最佳的体验。我们激动地在今天分享一下作为Visual Studio 2019进一步发展的一部分:我们将把Visual Studio的主题焕然一新并更新产品的图标和启动界面——以便于让您更快的启动您的代码。接下来我将带领你们知晓我们在这些改变背后的想法,并展示您即将日常接触到的用户体验。

近年来,我们了解到,与您,我们亲爱的用户,分享关于Visual Studio的进步可以尽快和频繁地帮助我们为社区提供最佳的体验。我们激动地在今天分享一下作为Visual Studio 2019进一步发展的一部分:我们将把Visual Studio的主题焕然一新并更新产品的图标和启动界面——以便于让您更快的启动您的代码。接下来我将带领你们知晓我们在这些改变背后的想法,并展示您即将日常接触到的用户体验。

新的Visual Studio图标

Visual Studio 2017 图标(左)和新的Visual Studio 2019图标(右)

【Visual Studio 2017 图标(左)和新的Visual Studio 2019图标(右)】

您也许已经注意到了,首要的改变就是我们给Visual Studio换了新的图标。我们一直致力于为发布的每一版Visual Studio去改善它的图标,这样您就可以快速的辨识出您正在使用的哪个版本。我们在Visual Studio 2017版本的早期就已经关注到了一些产品的可用性和图标风格问题,所以我们专注于在Visual Studio 2019中处理它们。

有一个现象是,现有的图标使得它在有相似背景下或变得几乎不可见。因此,我们通过Fluent Design System的方式来给它进行加深、提亮和材质化。新的图标我们已经在视觉上进行了强化,让它能够在不同背景下都可以清晰明显的辨认。

在任务栏和开始菜单中的新Visual Studio 2019图标

【在任务栏和开始菜单中的新Visual Studio 2019图标】

我们一直在了解Visual Studio的Logo可能出现在哪些新的情况和环境下。故而我们一直改善它的易读性。减少它在相似颜色背景下Logo消失的可能性。

Visual Studio 2019发布版图标(左)和预览图标(右)

【Visual Studio 2019发布版图标(左)和预览图标(右)】

我们面对的另一个挑战则是Visual Studio预览版和最终RTM版本的差异。Visual Studio的图标一直是我们传递这种差异的明显的途径,但是在2017版本中这很困难。对于Visual Studio 2017来说,我们给Visual Studio 2017设计的图标是让它作为Visual Studio家族中的一个部分。我们所使用的方法是所有的图标有一个对齐的右侧“ribbon功能区”。但是,这为区别和辨识这些APP的图标留下了更少的空间。

而对于Visual Studio 2019,我们着手去掉了图标中的其余部分,我们希望能够专注于Visual Studio Logo中最容易识别的元素:即“无限循环”。

我们放大了“无限循环”的尺寸,这给我们提供了更多的空间和机会去展示发布版和预览版图标间的差异。我们现在采用了一个很大胆的设计方式来代表预览版:在几个地方打破图标形状,但整体上依旧保持Visual Studio图标的形状。与此同时我们也展示这个预览图标用于表示一个成品预览版(尚未准备就绪的)与正式发布版明显而清晰的差异。

我们也用相同的方式在为新的Visual Studio for Mac做了修改,您可以在即将发布的预览版上见到它。

更容易运行您的代码

Visual Studio for Mac的开始菜单和Visual Studio的启动页面

【Visual Studio for Mac的开始菜单和Visual Studio的启动页面】

我们也通过一些研究和观察确信我们有这样一个机会去简化用户们在启动vs时候所要做出的选项。我们意识到移除一些使用中所谓的“off-ramps”可以提供更佳地直接启动代码的途径。

无论您是一个Visual Studio新用户还是一个资历丰富的Visual Studio开发者,这个新的启动界面都能够给您更快的方式去让开发者获取他们的常用的代码,包括克隆或者审阅代码,打开一个项目或者解决方案,打开PC上的本地文件或是创建新的项目。

我们知道对您来说现在的Visual Studio 2017 IDE 中启动页的最近项目列表有多么重要(90%的用户们都在使用启动页和最近的项目列表)。作为用户体验中的焦点,我们确保会保留它的位置。

您也可以使用全新的、简化的Git-First工作流程,只需要点击几下就可以将公共Git的repos克隆到本地。

最后,我们也重新想象了一下创建一个新项目的用户体验,包括新的项目模板列表以及改善文件仓库。使用新的设计和步步引导去选择模板并配置项目,我们相信让这个过程不在让人感到无所适从,这样您就可以关注于每次的单个决定。您也能够在配置页中探寻其他语言、平台和VS支持的项目类别,最终正确地安装他们。

一个焕新的蓝色主题

焕新的蓝色主题(左)和现在的蓝色主题(右)

【焕新的蓝色主题(左)和现在的蓝色主题(右)】

当您使用Visual Studio 2019时候您能够很明显注意到的改变是我们更新了蓝色主题。超过半数的用户都在使用蓝色主题,但是自从Visual Studio 2012版本以来都没有什么变化。我们围绕着让UI进行一次蜕变的愿望来专注于我们产品的改变。通过柔化图标按钮和工具栏(包含工具窗口)周围的边框,我们让您能够更直接的关注您正在解决的项目和工程。我们在整体UI上做了一些小的改动,这使得界面更加简洁但是同时又符合我们的设计标准。我们用蓝色主题来启动VS以便于我们能够把这些改动带到您的面前,希望能够了解到您的反馈然后我们将把它应用于其他主题上。

触手可及的生产力

现在的命令空间(上)和Visual Studio 2019简化版本(下)

【现在的命令空间(上)和Visual Studio 2019简化版本(下)】

为了寻求扩充代码的展示空间并减少冗余,我们在顶部采用了横向的展开方式。通过移除标题栏,我们有机会无需大幅更改工作流程就可以重新评估vs的顶部布局。我们也移除了搜索栏去增加代码的可覆盖空间。在即将到来的更新中,您可以发现2019中的搜索工具更加的好用和准确。

现在,我们也关注标题栏中的Live Share团队协作部件。现在只要团队都登录他们的Visual Studio账户,您就可以更直观的看到您正在与哪些人合作。它现在内置于所有的Visual Studio版本中。我们也花费了一些时间去清理默认图标,以便于更好的和Windows对应。

这些细小的改动让我们能够回收一部分IDE的界面空间,也给更大的工具窗口、更大的代码空间、留下的可能,也能让您更快的访问你需要的工具或者命令。

更易注意到的通知

image

明年年初,我们在预览版中将包含一个对通知UI的更新。通过社区对话,我们了解到现在的通知的位置、图标和状态都不够清晰明确。为了解决这个问题,我们将通知的入口移动到了IDE的底部的状态栏上了。新的位置避免了破坏现有的界面进而干扰用户的注意力,也让我们在未来也能够显示来自不同服务(Live Share的状态或者Pull Request comment)的消息。根据你们在社区的反馈,我们也考虑未来将通知的图标从旗帜改为铃铛。

仍在进行的对话

我们很高兴与您分享我们一直以来的努力改进的变化,也很乐意听取您对我们新设计的看法。您可以在我们的开发人员社区中提交您的建议和反馈。我们希望每次更新都使Visual Studio变得更好,您的反馈至关重要。

PAT (Advanced Level)-1015. Reversible Primes (20)

PAT (Advanced Level)-1015. Reversible Primes (20)

##1015. Reversible Primes (20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue


A reversible prime in any number system is a prime whose “reverse” in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.

Now given any two positive integers N (< 105) and D (1 < D <= 10), you are supposed to tell if N is a reversible prime with radix D.


Input Specification:

The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.

Output Specification:

For each test case, print in one line “Yes” if N is a reversible prime with radix D, or “No” if not.

Sample Input:

73 10
23 2
23 10
-2

Sample Output:

Yes
Yes
No

解读

考查进制转换和数字反转。

注意函数

int number_reverse(int num, int basic)

实现了反转和转化。

完整代码

#include<iostream>

using namespace std;

int number_reverse(int num, int basic)
{
	int num_2 = 0;
	for (; num;)
	{
		num_2 *= basic;
		num_2 += num%basic;
		num /= basic;
	}
	return num_2;
}

bool is_Prime(int num)
{
	if (num < 2)
		return false;
	else if (num == 2 || num == 3)
		return true;
	else
	{
		for (int i = 2; i*i <= num; i++)
		{
			if (num%i == 0)
				return false;
		}
		return true;
	}
}

int main()
{
	int N = 0;
	for (;;) 
	{
		cin >> N;
		if (N < 0)
			break;
		int D;
		cin >> D;
		if (is_Prime(N) && is_Prime(number_reverse(N, D)))
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}

	}
	return 0;
}