• [技术干货] gui 事件处理机制
    主要内容:        ◆  Java事件处理机制        ◆ 常见事件及处理接口        ◆ Java绘图机制▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ Java事件处理机制===============================================简介:       Java事件处理机制是一种基于授权的事件处理机制。-----------------------------------------------------------------------------------------------------------------------事件处理中的主要概念:     事件源,能够产生事件的对象都可以成为事件源 .     监视器,负责监视事件源的对象,当事件源产生事件时,监视器将调用方法对事件进行处理。                    事件源通过调用相应的方法将某个对象注册为自己的监视器。                     对于文本框,这个方法是:addActionListener(监视器);                     java语言中监视器都是使用接口来实现的。                    事件源注册监视器之后,相应的操作就会导致相应的事件的发生,并通知监视器,监视器就会作出相应的处理。      事件处理接口,接口中定义了处理事件的方法。                                监视器负责处理事件源发生的事件。                                监视器是一个对象,为了处理事件源发生的事件,监视器这个对象会自动调用接口中一个方法来处理事件。                                 Java规定:为了让监视器这个对象能对事件源发生的事件进行处理,                               创建该监视器对象的类必须声明实现相应的接口,那么当事件源发生事件时,监视器就自动调用被类重写的某个接口方法。----------------------------------------------------------------------------------------------------------------------------事件处理步骤:1.写一个监视器类     class Pliceman implements XXXListener     {          接口方法(XXXEvent e)          {               //.......           }      }2.创建事件源、监视器对象3.事件源注册监视器     事件源.addXXXListener(监视器);---------------------------------------------常见事件及处理接口=========================================================ActionEvent事件    ***------------------------------------------------------------------------------------- 1 ActionEvent事件源 :    文本框、按纽、菜单项、密码框和单选按纽都可以触发ActionEvent事件,即都可以成为ActionEvent事件的事件源。  2.注册监视器: ActionListener接口作为监视器    事件源.addActionListener(ActionListener listen)    将实现ActionListener接口的类的实例注册为事件源的监视器。  3.ActionListener接口:重写接口中的方法作为事件处理。    ActionListener接口在java.awt.event包中,该接口中只有一个方法:                     public void actionPerformed(ActinEvent e) ;        事件源触发ActionEvent事件后,监视器将发现触发的ActionEvent事件,然后调用接口中的这个方法对发生的事件作出处理。        ActionEvent类事先创建的事件对象就会传递给该方法的参数e。   4.ActionEvent类中的方法:下面的方法能够获取发生动作的事件源。            public Object getSource() --------- 调用该方法可以获取发生ActionEvent事件的事件源对象的引用。            public String getActionCommand()  ---------  调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个命令字符串。------------------------------------------------------------------------------------------------------------------------------带事件处理的GUI程序总结:通常有3各类:监视器类public class Pliceman implements ActionListener {   //取数组的组件   //显示数据的组件   //设置取数据组件的方法   //设置显示数据组件的方法   //接口中的方法   public void actionPerformed(ActionEvent e) {        //取得数据        //处理数据        //显示数据   }}窗口类pulic MainFrame extends JFrame {   //组件   //监视器   public MainFrame() {       init();       initEvent();       //设置窗口的属性   }   void init() {       //设置布局       //创建组件       //添加组件   }   void initEvent() {       //创建监视器       //设置监视器的属性       //事件源注册监视器   }}主类--------------------------------------------------------ItemEvent事件-----------------------------------------------------------------------------------------------------------1.ItemEvent事件源 :           选择框、下拉列表都可以触发ItemEvent事件。2.注册监视器:ItemListener接口作为监视器             事件源.addItemListener(ItemListener listen)             将实现ItemListener接口的类的实例注册为事件源的监视器。 3.ItemListener接口:重写方法作为事件处理             ItemListener接口在java.awt.event包中,该接口中只有一个方法                       public void itemStateChanged(ItemEvent e)                  事件源触发ItemEvent事件后,监视器将发现触发的ItemEvent事件,                 然后调用接口中的itemStateChanged(ItemEvent  e)方法对发生的事件作出处理。                  ItemEvent类事先创建的事件对象就会传递给该方法的参数e。 4.ItemEvent类中的方法 :              getSource()方法返回发生Itemevent事件的事件源外              getItemSelectable()方法返回发生Itemevent事件的事件源。 ---------------------------------------------------------------------------------------------------DocumentEvent事件---------------------------------------------------------------------------------------------------------------------1.  DocumentEvent事件源 :                文本区所维护的文档能触发DocumentEvent事件  2. 注册监视器:DocumentListener作为监视器                事件源.addDucumentListener(DocumentListener listen)                      将实现DocumentListener接口的类的实例注册为事件源的监视器。 3. DocumentListener接口:重写接口中的方法作为事件处理    DocumentListener接口在javax.swing.event包中,该接口中有三个方法:          public void changedUpdate(DocumentEvent e)          public void removeUpdate(DocumentEvent e)          public void insertUpdate(DocumentEvent e)----------------------------------------------------------------------------------------------------------------------MouseEvent事件_1-----------------------------------------------------------------------------------------------------------------------1. 事件源:        任何组件上都可以发生鼠标事件,如:鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,                 即导致MouseEvent类自动创建一个事件对象。 2.使用MouseListener接口可以处理以下5种操作触发的鼠标事件            事件源.addMouseListener(MouseListener listener)。                   在事件源上按下鼠标键、在事件源上释放鼠标键、在事件源上击鼠标键、鼠标进入事件源、鼠标退出事件源。           注册监视器:MouseListener接口作为监视器3. MouseListener接口中有如下方法:重写方法作为事件源的处理    mousePressed(MouseEvent) 负责处理在组件上按下鼠标键触发的鼠标事件   mouseReleased(MouseEvent) 负责处理在组件上释放鼠标键触发的鼠标事件   mouseEntered(MouseEvent) 负责处理鼠标进入组件触发的鼠标事件   mouseExited(MouseEvent) 负责处理鼠标离开组件触发的鼠标事件   mouseClicked(MouseEvent) 负责处理在组件上单击鼠标键触发的鼠标事件4. MouseEvent 中有下列几个重要的方法:         getX() 获取鼠标指针在事件源坐标系中的x-坐标。         getY() 获取鼠标指针在事件源坐标系中的y-坐标。        getModifiers() 获取鼠标的左键或右键。         getClickCount() 获取鼠标被单击的次数。          getSource() 获取发生鼠标事件的事件源。5. MouseMotionListener接口                 可以处理以下两种操作触发的鼠标事件,  在事件源上拖动鼠标、在事件源上移动鼠标。          事件源注册监视器的方法是:                    事件源.addMouseMotionListener(MouseMotionListener listener)。     MouseMotionListener接口中有如下方法:                mouseDragged(MouseEvent)  负责处理拖动鼠标触发的鼠标事件。                mouseMoved(MouseEvent)  负责处理移动鼠标触发的鼠标事件。------------------------------------------------------------------------------------------------------------------------------焦点事件-----------------------------------------------------------------------------------------------1.焦点事件源 :组件可以触发焦点事件。  2.注册监视器:组件可以使用    addFocusListener(FocusListener listener)     注册焦点事件监视器。  3.FocusListener接口 :        创建监视器的类必须要实现FocusListener接口,该接口有两个方法:      public void focusGained(FocusEvent e)      public void focusLost(FocusEvent e)        当发生FocusEvent事件时,监视器调用类实现的接口中的相应方法。 4.组件也可调用        public boolean requestFocusInWindow()         方法可以获得输入焦点。 --------------------------------------------------------------------------------------------------------------键盘事件--------------------------------------------------------------------------------------------------1. 事件源:            当一个组件处于激活状态时,敲击键盘上一个键就导致这个组件触发键盘事件。2.某个组件使用addKeyListener方法注册监视器。3.接口KeyListener中有如下方法:     public void keyPressed(KeyEvent e),     public void keyTyped(KeyEvent e),     public void KeyReleased(KeyEvent e)  4.(KeyEvent 相关方法:   public int getKeyCode()判断哪个键被按下、敲击或释放,返回一个键码值 。         getKeyChar()判断哪个键被按下、敲击或释放,返回键上的字符。-------------------------------------------------------------------------------------------------------窗口事件-------------------------------------------------------------------------------------WindowListener接口.   (1)  public void windowActivated(WindowEvent e)  当窗口从非激活状态到激活时,窗口的监视器调用该方法。(2) public void windowDeactivated(WindowEvent e)  当窗口激活状态到非激活状态时,窗口的监视器调用该方法。(3) public void windowClosing(WindowEvent e)  当窗口正在被关闭时,窗口的监视器调用该方法。(4) public void windowClosed(WindowEvent e)  当窗口关闭后,窗口的监视器调用该方法。(5) public void windowIconified(WindowEvent e)  当窗口图标化时,窗口的监视器调用该方法。(6) public void windowDeiconified(WindowEvent e)  当窗口撤消图标化时,窗口的监视器调用该方法。(7) public void windowOpened(WindowEvent e)  当窗口打开时,窗口的监视器调用该方法。--------------------------------------------------------------------------------------------------------适配器------------------------------------------------------------------------------------------------------------------------每个具有不止一个方法的AWT监听器接口都有一个实现了它的所有方法,但却不做任何工作的适配器类。适配器可以代替接口来处理事件,当Java提供处理事件的接口中多于一个方法时,Java相应地就提供一个适配器类,比如WindowAdapter类。适配器已经实现了相应的接口,例如WindowAdapter类实现了WindowListener接口。因此,可以使用WindowAdapte的子类创建的对象做监视器,在子类中重写所需要的接口方法即可。 WindowAdapter适配器 .ComponentAdapterContainerAdapterFocusAdapterKeyAdapterMouseAdapterMouseMotio**pterWindowAdapter===========================================匿名类实例或窗口做监视器匿名类的方便之处是匿名类的外嵌类的成员变量在匿名类中仍然有效,当发生事件时,监视器就比较容易操作事件源所在的外嵌类中的成员.当事件的处理比较简单、系统也不复杂时,使用匿名类做监视器是一个不错的选择。让事件源所在的类的实例作为监视器,能让事件的处理比较方便,这是因为,监视器可以方便的操作事件源所在的类中的其他成员。当事件的处理比较简单,系统也不复杂时,让事件源所在的类的实例作为监视器是一个不错的选择。===================================事件总结-------------------------------------------------------------------------------------------------------1.授权模式   Java的事件处理是基于授权模式,即事件源调用调用方法将某个对象注册为自己的监视器。2.接口回调    addXXXListener(XXXListener listener)方法中的参数是一个接口,listener可以引用任何实现了该接口的类所创建的对象,   当事件源发生事件时,接口listener立刻回调被类实现的接口中的某个方法。3.方法绑定    当事件源触发事件发生后,监视器准确知道去调用哪个方法。4.保持松耦合    当事件源触发事件发生后,系统知道某个方法会被执行,但无须关心到底是哪个对象去调用了这个方法,     因为任何实现接口的类的实例(做为监视器)都可以调用这个方法来处理事件。    ====================================================================================================Java绘图机制---------------------------------------------------------------Component类有一个方法public void paint(Graphics g),程序可以在其子类中重写这个方法。当程序运行时,java运行环境会用Graphicd2D(Graphics的一个子类)将参数g实例化,对象g就可以在重写paint方法的组件上内绘制图形、图像等 .Graphics2D的“画笔”分别使用draw和fill方法来绘制和填充一个图形。组件都是矩形形状,组件本身有一个默认的坐标系,组件的左上角的坐标值是(0,0)。java.awt.geom直线           Line2D.Double(double x1, double y1, double x2, double y2)矩形Rectangle2D.Double(double x, double y, double w, double h)圆角矩形RoundRectangle2D.Double(double x, double y, double w, double h);椭圆Ellipse2D.Double(double x, double y double w, double h);圆弧Arc2D.Double(double x, double y, double w, double h, double start, double extent, int type)        x, y, w, h-----------椭圆位置大小        start, -------------圆弧其实位置,单位:度        extent-----------划过的度的弧。单位:度。正值:逆时针;负值:顺时针。        type ---------------Arc2D.OPEN          Arc2D.CHORD                   Arc2D.PIE文本         g.drawString(s, x, y)二次曲线三次曲线多边形-----------------------------------------------------有时需要平移、缩放或旋转一个图形。可以使用AffineTransform类来实现对图形的这些操作。例如: AffineTransform trans=new AffineTransform(); 将图形沿顺时针或逆时针以(x,y)为轴点旋转number个弧度 :trans.rotate(60.0*3.1415927/180,100,100); translate(double a, double b) -----------------------移动              scale(double a, double b)  ------------放缩rotate(double number, double x, double y)-------------------------旋转                 x,y --------旋转圆心                 number--------旋转弧度g_2d.setTransform(trans);-------------------------------------------------两个图形进行布尔运算运算之前,必须分别用这两个图形创建两个Area区域对象,例如:    Area a1 = new Area(T1);    Area a2 = new Area(T2);a1就是图形T1所围成的区域;a2就是T2所围成的区域。那么,a1调用add方法:   a1.add(a2); -------------  或之后,a1就变成a1和a2经过布尔“或”运算后的图形区域。可以用Graphics2D对象g来绘制或填充一个Area对象(区域):  g.draw(a1);  g.fill(a1);   a1.intersect(a2); ---------与   a1.exclusiveOr(a2) ----------------异或   a1.subtract(a2) ------------差。---------------------------------------------------1.加载图像组件调用getToolkit()方法可以返回这个对象的引用。Tollkit类的对象调用方法   Image getImage(String fileNme)或      Image getImage(File file)。可以返回一个Image对象,该对象封装着参数file(或参数fileName)指定的图像文件。2.绘制图像 public boolean drawImage(Image img,int x,int y,ImageObserver observer);    参数img是被绘制的Image对象,x、y是要绘制指定图像的矩形的左上角所处的位置,observer是加载图像时的图像观察器 。-----------------------------------------------------------
  • [技术干货] Python常用GUI框架原理解析汇总
    Graphical User Interface,简称 GUI,又称图形化用户接口,所谓的GUI编程,指的是用户不需要输入代码指令,只通过图形界面的交互就可以操作软件功能。Tkinter一个轻量级的跨平台图形用户界面(GUI)开发工具,是Python的自带的官方标准库,安装Python 之后直接导入就可以使用, 我们常见的python IDLE就是使用TKinter实现。它最大的特点就是上手简单, 做个简单的小工具基本够用了,比如登录,计算器,简单的输入输出工具等,缺点是不够美观,功能太单一。PyqtQT是一个C ++编写的跨平台的框架。这是一个非常全面的库。1991年奇趣科技公司开发的C++ GUI应用程序,2014年发布了Qt5.3正式版。PyQt是Qt库的Python版本,它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。QT带来的最大好处就是它有一个QT Desiginer,这个设计器可以方便我们进行页面的布局,可以说在Tkinter里面需要一坨坨的代码完成的页面布局,在QT里面只要拖一拖控件就搞定了。wxPythonwxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能健全的 GUI 用户界面。wxPython开源免费,支持LINUX和WINDOWS,界面本地化好, 功能完善,它也提供类似QT Designer的设计器wxFormbuilder,可以说是个压缩版的QT。PySide使用“C++”语言编写的应用程序/用户界面(UI)框架。“PySide”是“Qt”的封装。与PySide的不同之处在于PyQt可以商用。PyGUI减少Python应用与平台底层GUI之间的代码量,面向Unix,Macintosh和Windows平台。Kivy基于OpenGL ES 2,能够让使用相同源代码创建的程序能跨平台运行。这个框架是事件驱动的,基于主循环,非常适合开发游戏。Kivy拥有能够处理动画、缓存、手势、绘图等功能。它还内置许多用户界面控件如:按纽、摄影机、表格、Slider和树形控件等。PyGTK -GTK在Linux中常用的“GTK+”是“PyGTK”的“GTK +”封装。与Kivy和PyQt相比,它能不加修改的稳定运行在各种操作系统之上,如Linux,Windows,MacOS等。Flexx许多Python GUI库基于以其他语言编写的库,例如用C++编写的库有wxWidgets和libavg。但Flexx是用Python创建的,使用Web技术,也正因为如此 Flexx 是跨平台的。只需要有 Python 和浏览器就可以运行CEF Python基于Google Chromium,面向Windows,MAC OS和Linux,其主要用于在第三方应用程序中嵌入式浏览器的使用上Dabo一个跨平台的应用程序开发框架,基于wxpython的再封装库。它提供数据库访问,商业逻辑以及用户界面Pyforms一个用于开发GUI应用程序的Python 2.7 / 3.x跨环境运行框架。PyGObject可以为GNOME项目编写Python应用程序,你也可以使用GTK +编写Python应用程序。关于框架的选择,没有最好的,只有最适合的。其他框架的具体使用和介绍,可以查看官方文档学习:https://wiki.python.org/moin/GuiProgramming
  • [技术干货] 用python写一个带有gui界面的密码生成器
    需要用到的库:tkinter:构建gui界面pyperclip:复制功能random:生成随机数string:处理字符串代码:12345678910111213141516171819202122232425262728293031323334353637383940414243from tkinter import *import random, stringimport pyperclip  root =Tk()root.geometry("400x400")root.resizable(0,0)root.title("密码生成器")  heading = Label(root, text = '密码' , font ='arial 15 bold').pack()  pass_label = Label(root, text = '密码长度', font = 'arial 10 bold').pack()pass_len = IntVar()length = Spinbox(root, from_ = 8, to_ = 32 , textvariable = pass_len , width = 15).pack()   pass_str = StringVar() def Generator(): password = '' for x in range (0,4):  password = random.choice(string.ascii_uppercase)+random.choice(string.ascii_lowercase)+random.choice(string.digits)+random.choice(string.punctuation) for y in range(pass_len.get()- 4):  password = password+random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits + string.punctuation) pass_str.set(password)   Button(root, text = "获取密码" , command = Generator ).pack(pady= 5) Entry(root , textvariable = pass_str).pack()  def Copy_password(): pyperclip.copy(pass_str.get()) Button(root, text = '复制密码', command = Copy_password).pack(pady=5)  root.mainloop()运行效果:
  • [技术干货] 《ONAP技术详解与应用实践》读书笔记17
    5.10 UUI功能介绍UUI (Usercase UI)为运营商和终端用户提供图形化界面以进行自助管理与监控。UUI的目标包含:识别运营商和终端用户需要ONAP支持的GUI需求。整合每个ONAP各子系统的GUI增强GUI的功能。 UUI由两个模块组成1.GUI模块GUI模块是ONAP中的一个独立组件,可以单独进行部署。GUI模块为运营商和终端用户(如生命周期管理、监控器)提供图形用户界面。运行如下命令启动UUI的GUI模块:sodo docker run -i  -t -d --name uui_ui -p 8080:8080 -e  MSB_ADDR=$OPENO_IP:80 nexus3.onap.org: 10001/onap/usecase-ui2.服务器模块服务器模块是UUI的一个逻辑部件,主要由LCM事件与监控事件两部分组成。 LCM件分析NS文件,监控事件订阅VNF告警和性能数据。运行如下命令启动UUI的服务器模块:sudo docker run -i -t -d --name uui_server -p 8082:8082 -e MSB_ADDR=$OPENO_IP:80 -e MR_ADDR=$MR_IP:3904 nexus3.onap.org:10001/onap/usecase-ui/usecase-uiserver5.11 VF-C功能介绍VF-C项目使用ETSI NFV MANO架构和信息模型作为参考,实现VNF和NS的生命周期管理、故障管理、配置管理、性能管理、计费管理和安全管理。VF-C与ONAP的其他很多项目(如SDC,SO,A&AI和DCAE等)都有关系。VF-C与其他ONAP项目的依赖关系:VF-C与SDC为CSAR交付件互通SO代理SOL005 AP1调用(E2E业务)到VF-CVF-C使用A&AI作为业务、VNF和VL的持久层VF_C中的所有组件把MSB作为API网关进行通信使用DCAE VE采集器API向DCAE上报FCAPS教据使用多云 API增加、查询、更新和删除(CRUD)虚拟资源VF-C支持如下功能:基于ONAP TOSCA和YANG数据模型和工作流的NS和VNF生命周期管理。通过驱动集成包括VFM和通用VNFM的多个VNFM。通过通用VNFM与多VNF集成,不提供VNFM功能。Multi-VIM与Multi-VIMs集成,包括开源和商用VIM。微服务架构和基于模型的资源编排和管理。VF-C作为ONAP中的控制器,包含NFVO和GVNFM两个组件。NFVO组件具有如下特性:符合ETSI NFV MANO架构和信息模型。为NS提供资源编排和全生命周期管理和FCAPS.为VNFM提供标准的SBI为SO提供NBI以参与E2E业务的编排和操作提供接口,与DCAE和闭环自动化的策略配合使用。GVNFM组件具有如下特性:符合ETSI NFV MANO架构和信息模型。为无须厂商VNFM的VNF提供全生命周期管理和FCAPS。提供接口与NFVO组件配合,参与完成NS的LCM和FCAPS管理。提供接口,与DCAE和闭环自动化的策略配合使用VF-C提供的API包括VF-C北向API和VNFM集成API,前者负责网络业务的生周期管理,后者负责VNFM驱动集成。5.11.2重点特性VF-C当前版本支持的主要特性包括:在ONAP中提供MANO的合规编排,并支持闭环编排。NS编排支持PNF: NSLCM支持由VNF, PNF,VL组成的NSD; 目录支持PNFD组成并更新NSD DM.HPA支持:与OOF集成; VF-C支持解析包含HPA特性的R2+TOSCA模型。标准校准: GVNFM和目录中的SOL003校准。NS和VNF手动伸缩容。NS生命周期管理,包括创建、终止和恢复NS实例。VNF生命周期管理,包括创建、终止和恢复VNF实例。VNF FCAPS采集来自厂商EMS的FCAPS数据。VNFM集成,与厂商特定VNFM集成以部署商用VNFVNF集成,通过GVNFM与VNF集成。独立的数据库微服务。VF-C的未来社区规划特性有:SOL005和SOL003接口补齐。与Dublin版本TOSCA数据模型对齐。5.12 VIDVID (Virtual Infrastructure Deployment,虚拟基础设施部署)可用于基础设施部署、实例化基础设施服务与服务管理。VID的实例化模式包括宏观编排和lacarte编排。在选择目标实例化环境(如Multi-Cloud、测试环境等)后,支持:检查是否已有创建或预留的云资源,并触发云资源的创建。基于SDC设计的特定任务,定制业务、VNF或VF以适配当前的实例化。根据实例化工作流反馈实例化进程,在实例化失败时调用维护操作。VID能够进行变更管理,通过与A&AI的集成,检索当前已部署的业务,从SDC业务和VNF/VF模型中衍生出不可知的或特定的变更管理工作流,支持:为给定的业务和VNF/VF调用变更管理。为监控模板调用变更管理。为策略变更调用变更管理。为许可证变更调用变更管理。VID支持对工作流执行停止、启动、重启和恢复等动作,同时也支持对工作流进行调度,如通知、定时自动实例化等。VID的项目/管理看板包含用户管理、项目相关的VNF/VF和业务。VID支持用户对SDC中设计的基础设施服务和关联组件进行实例化操作,包括业务模型、VNF、 VF模块和磁盘卷组。实际使用过程中,在操作员输入合适的数据后, VID会触发MSO对上述业务模型或组件进行实例化操作。VID图形界面提供两个功能:查找已存在的服务实例,用于对查找到的服务实例进行管理。通过SDC服务模板查找某个模板,并根据模板进行服务的实例化操作。截至完稿之前, VID当前版本支持的主要能力包括:PNF即插即用业务实例化。手动VNFscale out增强。变更管理初始化。VID的Dublin版本及后续版本已规划如下能力:Cloud Region的ID一致性。支持展示各Cloud Region的Owner.向SO请求并提供Owner.用SO作为工作流的仓库。
  • [技术干货] 【转载】Linux下9种优秀的代码比对工具推荐
    【转载华为云社区】大家好,我是良许。在我们编写代码的时候,我们经常需要知道两个文件之间,或者同一个文件不同版本之间有什么差异性。在 Windows 下有个很强大的工具叫作 BeyondCompare ,那在 Linux 下需要用到什么工具呢?本文介绍 9 种 Linux 下常用的 9 种代码比对工具,不仅有命令行工具,还有 GUI 界面工具,让你轻松进行代码比对。1. diff命令diff 命令是 Linux 下自带的一个强大的文本比对工具,而且使用起来非常方便。对于它的使用,我之前也单独写过一篇文章介绍,点击下方链接可以查看。教你一招Linux下文本比对方法diff 命令在大多数的 Linux 发行版里已经预装了,它可以逐行比对两个文本文件,并输出它们的差异点。更多介绍可以直接查看它的 man 手册。$ man diff但是,diff 命令虽然强大,但它的输出结果实在是太感人了,不直观也不清晰。于是,有大佬为了弥补这个缺点,基于 diff 开发了更强大的工具。这里推荐两个:colordiff 和 wdiff 。colordiff命令colordiff 是一个 Perl 脚本工具,它的输出结果和 diff 命令一样,但是会给代码着色,并且具有语法高亮功能。同时,你如果不喜欢它的默认颜色的话,还可以自定义主题。你可以自行安装 colordiff 到你的电脑,根据不同的发行版选择不同的安装命令。$ yum install colordiff             [On CentOS/RHEL/Fedora] $ dnf install colordiff             [On Fedora 23+ version] $ sudo apt-get install colordiff    [On Debian/Ubuntu/Mint]同样,你可以使用 man 命令查看它的帮助文档:$ man colordiffwdiff命令diff 命令是逐行比较差异,而 wdiff 更变态,是逐字比较。所以如果你的文本只是修改了少数一些词语的话,使用 wdiff 命令将更加高效。安装命令如下:$ yum install wdiff             [On CentOS/RHEL/Fedora] $ dnf install wdiff             [On Fedora 23+ version] $ sudo apt-get install wdiff    [On Debian/Ubuntu/Mint]更详细内容可以查看它的 man 手册。$ man wdiff2. vimdiff命令vimdiff 等同于 vim -d 命令,即 Vim 编辑器的 diff 模式。该命令后面通常会接两个或多个文件名作为参数,这些文件会同时在 Vim 编辑器的分割窗口中打开,并高亮显示文件中内容有差异的部分。它的中文主页是:http://vimcdoc.sourceforge.net/doc/diff.html以上介绍的两款是 Linux 命令行的对比工具,我们再来看一些 GUI 比对工具。3. KompareKompare 是基于 diff 的一个 GUI 工具,使用者可以很方便看到文件之间的差异,并且支持合并这些差异。Kompare 的特性有如下:支持多种 diff 格式;支持目录之间的比对;支持读取 diff 文件;自定义界面;创建及应用源文件的 patch 文件。该工具的主页为:https://www.kde.org/applications/development/kompare/4. DiffMergeDiffMerge 是一个跨平台的 GUI 文本比对工具,具有 Linux ,Windows ,macOS 三大平台版本。我们知道,BeyondCompare 是一款收费软件,所以如果你们公司的版权要求比较高的话,不妨考虑一下 DiffMerge工具。DiffMerge 具有两大功能:1. 图示化显示两个文件之间的改变。包含内部行高亮和完整的编辑支持。2. 图示化显示三个文件之间的改变。允许自动合并(当可以安全操作时)和对结果文件完全编辑控制。它具有以下特性:支持文件夹比对;集成文件浏览器;高度可配置。该工具的主页为:https://sourcegear.com/diffmerge/5. MeldMeld 是一个轻量级 GUI 代码比对工具,它支持用户比对文件、目录,并且高度集成版本控制软件。但针对软件开发人员,它的以下几个特性尤为吸引人:执行双向和三向差异并合并轻松地在差异和冲突之间导航逐个文件地比较两个或三个目录,显示新文件,缺失文件和更改文件支持许多版本控制系统,包括 Git,Mercurial,Bazaar 和 SVN 等。它的官网为:http://meldmerge.org/6. DiffuseDiffuse 是另外一款很受欢迎的,免费,小巧,也十分简单的 GUI 文本差异比对合并工具,它是用 Python 写成的,具有两个主要功能:文件比对及版本控制,允许文件编辑、合并,并且输出两个文件的差异点。你可以使用它查看文本比对小结,使用鼠标选择文件里的某行进行编辑。它的其它特性包括:语法高亮快捷键便于文本导航无限次撤销支持 unicode 编码文件支持许多版本控制系统,包括 Git,Mercurial,Bazaar 和 SVN 等。它的官网为:http://diffuse.sourceforge.net/7. XXdiffXXdiff 是一款免费、强大的文件及文件夹差异比对及合并工具,它可以运行在很多类 Unix 系统上。不过它有个限制就是它不支持 unicode 文件,也没法办法直接编辑文件。它具有以下特性:递归对比文件及文件夹高亮显示差异点合并差异点,导出结果支持外部 diff 工具,比如:GNU diff,SIG diff ,Cleareddiff ,以及其它更多工具支持脚本拓展8. KDiff3KDiff3 是另外一种很强大的跨平台差异比对及合并工具,它是由 KDevelop 开发而成,可以在所有类 Unix 平台上运行,包括 Linux ,Mac OS ,Windows 等。它可以比对或合并两到三个文件或目录,具有以下特性:可以逐句、逐字对比差异支持自动合并内置编辑器,可以手动解决冲突支持 unicode ,UTF-8 等各种编码格式支持打印差异它的官网为: http://kdiff3.sourceforge.net/9. TkDiffTkDiff 是另外一种跨平台,易于使用的 GUI 文本比对工具,可以运行在 Linux ,Windows 及 MacOS 系统上。它同样提供一个左右分开的界面,用于查看对比的两个文件。但是,它也有一些其它文本对比工具没有的功能,比如差异书签,以及一个便于快速定位导航差异点的导航图。
  • [技术干货] SpaceX 龙飞船中的新触控交互操作系统,意味着什么?
    作者:doodlewind链接:https://www.zhihu.com/question/396878847/answer/1261374042来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。据本台刚刚收到的消息,SpaceX 龙飞船的触控 UI 基于 Chromium + JavaScript 技术栈开发,开放的 Web 技术就此成为了人类首个应用到载人航天领域的 GUI 技术栈。相信这对数百万前端开发者们来说是个更为历史性的时刻。这个基于 Web 技术打造的触控 UI 界面是这样的:<img src="https://pic4.zhimg.com/50/v2-42d7b42106770263c825f25aeb2b1f4d_hd.jpg" data-rawwidth="1020" data-rawheight="675" data-size="normal" data-caption="" data-default-watermark-src="https://pic3.zhimg.com/50/v2-02e88afdb2468a01437ab97b19afa174_hd.jpg" class="origin_image zh-lightbox-thumb" width="1020" data-original="https://pic4.zhimg.com/v2-42d7b42106770263c825f25aeb2b1f4d_r.jpg"/>这个消息可能为业界带来什么重大影响呢?下面是本台洋葱新闻时间:仅在一夜之间,Electron 风评即由「笨重臃肿的 Chrome 马甲套壳」变成了「稳定安全的航天级 GUI 基础架构」。在飞船 UI 系统宕机时,宇航员手册中记载了最后的应急方案,那就是删掉 node_modules 然后 npm install。「面试造火箭」一语成谶,「宇宙飞船 UI 架构设计」现已加入 BAT 前端面试题库。前端培训班题材纷纷由「高仿美团饿了么首页」转向「高仿宇宙飞船控制台」,全套教学视频 + 源码仅需 998。各大前端框架争相游说各国载人航天团队,史称前端太空竞赛。社区开始争论 React Hooks 和 Vue Composition API 哪个更适合登月。SpaceMVC 项目取代 TodoMVC,成为了下一个前端框架的 battle 标准。工程师一旦发现飞船超重,第一个排查问题的位置就是 node_modules。某国湿婆神号飞船任务失败,原因竟是该国程序员屏幕上的咖喱混淆了 == 和  ===,导致类型比较出错。言归正传,这条新闻的出处仅仅是一条非官方的 Tweet。在 Fake News 横行的今天,怎样确定龙飞船 2 号用的就是 JavaScript 呢?SpaceX 并没有开源他们的技术栈,但仍然有不少可供交叉验证的有趣信息源,今天摸到了条大鱼啊(笑)。首先,推文中附上了四年前 Stack Exchange 上 对猎鹰 9 号计算机技术栈的讨论,其中的主要信息源则是 Reddit 上 SpaceX 软件团队的 AMA 介绍 。另外,Hacker News 上近期也有活跃的 后续讨论帖。这里对其中(与 GUI 部分相关的)主要信息整理如下:龙飞船 2 号和猎鹰 9 号的飞控软件系统基于 Linux,其底层均由 C/C++ 实现。Chromium + JavaScript 属于这一系统中的太空舱界面(flight interface)部分。UI 界面有 100% 的测试覆盖率,包括对图形绘制结果的验证。UI 屏幕彼此之间是完全独立的,相当于冗余备份。UI 系统可以重启,在直播中对接国际空间站时就有这样的例子。除了飞控系统中的 UI 外,SpaceX 还有其他需要 GUI 的地方。负责地面软件的团队使用 LabView 开发地面指挥中心的 GUI,企业 IT 团队则使用常见的 Web 技术栈开发项目管理、库存管理等内部后台系统。上面这些信息除了 AMA 之外都可能有偏差,主要讨论者也未必是这套触屏 UI 的实际开发者。不过稍加搜索就能发现更有趣的料,那就是这套 UI 界面设计师自己的 Portfolio 页面:<img src="https://pic3.zhimg.com/50/v2-89ec0ec5370d4abf067d5e2e56f56e33_hd.jpg" data-rawwidth="987" data-rawheight="848" data-size="normal" data-caption="" data-default-watermark-src="https://pic3.zhimg.com/50/v2-e9e2424ae6d998c63b057bced1e9b935_hd.jpg" class="origin_image zh-lightbox-thumb" width="987" data-original="https://pic3.zhimg.com/v2-89ec0ec5370d4abf067d5e2e56f56e33_r.jpg"/>看到这个页面的时候,我第一印象是这真不是「Lorem Ipsum」式的 Demo 吗……这也太梦幻了吧。但在找到设计师 AJ Fitzpartrick 的 LinkedIn 之后,基本可以确定这还真不是 PPT,有被羡慕到。所以为宇宙飞船设计触屏 UI,到底是在干嘛呢?具体细节仍然处于保密状态,但这位设计师公开的工作描述包括了这些:将航天员在飞行阶段的职责转化为软件需求,与太空运营团队合作,创建出用于驾驶舱触屏显示器的线框和 UI 流程。向 SpaceX 团队和 NASA 客户(包括龙飞船的宇航员机组在内)介绍设计和 UI 流程。基于太空旅行的独特条件,制定风格指南和设计规范,例如适应宇航员手套的触摸目标,以及保证震动时的易读性。与软件工程师紧密合作,了解硬件和技术限制,确定用户体验上的空白和设计任务的优先级。将设计产物和用于生产的素材交付给软件工程师。虽然好像也不是特别复杂,但是这牛逼真是可以吹一辈子啊……这里还有一个有趣之处,那就是这位 UI/UX 设计师此前并非来自「航空航天体制内」,而是做 App 与 Web 的设计出身的。他的代表作品包括索尼的全球设计规范和图片编辑器,还有 iOS 的社交应用等。这也体现了 SpaceX 在组建精英团队时的多元文化(例如做上面介绍的飞控软件的团队,其背景就来自于游戏、消费者软件、Web 开发、金融、电信、航空、学术界等)。所以做交互的同学们还是要有点志气,万一哪天我国的宇宙飞船也要招人做设计稿了呢?至于 SpaceX 正式对外的分享资料,则主要来自 2016 年的 GDC 分享 。他们在其中介绍了新一代软件工具技术对他们的价值:<img src="https://pic1.zhimg.com/50/v2-7c6c32ea27e7100bb56964ce12031d6d_hd.jpg" data-rawwidth="2410" data-rawheight="1419" data-size="normal" data-caption="" data-default-watermark-src="https://pic2.zhimg.com/50/v2-b15a1ad29ca638fed3e22f85f677bac2_hd.jpg" class="origin_image zh-lightbox-thumb" width="2410" data-original="https://pic4.zhimg.com/v2-7c6c32ea27e7100bb56964ce12031d6d_r.jpg"/>这页 PPT 直译过来是这样的:算力上的进步开启了全新的可能性存储、计算和渲染能力上的突破,使实现 3D 渲染和交互式地图等特性成为了可能。移动设备在重量和能耗上的改进非常显著。触摸屏已经很便宜,普及到随处可见。浏览器是界面开发的新平台各种库和框架提供了稳定的功能,并能快速实现原型。现代化的开发和调试工具提高了迭代速度。技术的跨业界通用性扩大了潜在的人选范围,减少了磨合时间。PPT 上还有专门的一页讲了触摸屏技术:<img src="https://pic4.zhimg.com/50/v2-841e0b6a2b15fbd03bf27328c68e2f60_hd.jpg" data-rawwidth="2280" data-rawheight="1227" data-size="normal" data-caption="" data-default-watermark-src="https://pic3.zhimg.com/50/v2-20f29c3f36465ffc65c6b685fb7cde1c_hd.jpg" class="origin_image zh-lightbox-thumb" width="2280" data-original="https://pic3.zhimg.com/v2-841e0b6a2b15fbd03bf27328c68e2f60_r.jpg"/>要点直译过来也很简单:将操作控制移到显示屏上后,极大地减少了空间占用和混乱。通过多个相同的显示屏,很容易实现冗余备份。触摸屏的泛用性使得开发变得容易,还能流水线式地执行训练和测试。基于软件的界面布局,提高了迭代速度。这就是新一代 UI 技术栈对航天领域的影响了。不过对于到此为止的这些内容,仍然可能会有些「这不就只是用 JS 画了点花里胡哨的东西而已吗」的质疑。但其实在即将发射的 詹姆斯·韦伯太空望远镜(JWST)里,NASA 已经在用 JavaScript 操控太空望远镜的观测计划了:在 JWST 机载架构中,活动计划均由地面上传。每个计划都包含了多个 Visit,它们通过上层的机载 JavaScript 来处理。而每个 Visit 则会包含由下层机载脚本处理的观测活动(如探测器配置、回转请求等)。这些机载脚本会构建出命令和遥测请求,从而操作观测子系统(如科学仪器、航天器总线中的姿态控制子系统等)。这个架构设计写在了介绍 JWST 的论文(JWST: Maximizing Efficiency and Minimizing Ground Systems)里,如图所示:<img src="https://pic1.zhimg.com/50/v2-3df0c3a20a3905503f3a655ca3a1ffd1_hd.jpg" data-rawwidth="500" data-rawheight="843" data-size="normal" data-caption="" data-default-watermark-src="https://pic1.zhimg.com/50/v2-4ce8985534952ed59b8c6056952b383c_hd.jpg" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic3.zhimg.com/v2-3df0c3a20a3905503f3a655ca3a1ffd1_r.jpg"/>对于这个破天荒地引入 JS 引擎的操作,其实还有另一篇论文,讲了事件驱动的 JWST 操作设计(Event-driven James Webb Space Telescope Operations)。NASA 使用的是一个由 Nombas 公司开发的普通商用级 JS 引擎,它被嵌入在了 VxWorks 实时操作系统中。论文中探讨了在 JWST 中引入事件驱动架构的优势,值得感兴趣的同学拓展一下视野。Nombas 公司在《JavaScript 20 年》中登场过。它虽然名不见经传,但其实也是首次 TC39 会议的参与者,当时的产品是名称跟 C++ 相反的 Cmm(C minus minus)语言。后来他们在此基础上研发出了嵌入式 ECMAScript 引擎 ScriptEase,亦即被 NASA 选用的产品。这家公司后来被 Openwave 收购。到此为止,我们已经看到 JavaScript 这门「罄竹难书」的语言,居然已经开始在无比高大上的航天领域崭露头角了。在《JavaScript 20 年》史书的结尾处,JS 之父 Brendan Eich 是这样为 JS 正名的:最早他们说 JavaScript 没法做「富互联网应用」。然后他们说 JavaScript 没法快起来。然后他们说 JavaScript 没法修复语言问题。然后他们说 JavaScript 没法做多核与 GPU 运算。今天我们可以再补一条:然后他们说 JavaScript 没法做航天级项目。作者:doodlewind链接:https://www.zhihu.com/question/396878847/answer/1261374042来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。据本台刚刚收到的消息,SpaceX 龙飞船的触控 UI 基于 Chromium + JavaScript 技术栈开发,开放的 Web 技术就此成为了人类首个应用到载人航天领域的 GUI 技术栈。相信这对数百万前端开发者们来说是个更为历史性的时刻。这个基于 Web 技术打造的触控 UI 界面是这样的:<img src="https://pic4.zhimg.com/50/v2-42d7b42106770263c825f25aeb2b1f4d_hd.jpg" data-rawwidth="1020" data-rawheight="675" data-size="normal" data-caption="" data-default-watermark-src="https://pic3.zhimg.com/50/v2-02e88afdb2468a01437ab97b19afa174_hd.jpg" class="origin_image zh-lightbox-thumb" width="1020" data-original="https://pic4.zhimg.com/v2-42d7b42106770263c825f25aeb2b1f4d_r.jpg"/>这个消息可能为业界带来什么重大影响呢?下面是本台洋葱新闻时间:仅在一夜之间,Electron 风评即由「笨重臃肿的 Chrome 马甲套壳」变成了「稳定安全的航天级 GUI 基础架构」。在飞船 UI 系统宕机时,宇航员手册中记载了最后的应急方案,那就是删掉 node_modules 然后 npm install。「面试造火箭」一语成谶,「宇宙飞船 UI 架构设计」现已加入 BAT 前端面试题库。前端培训班题材纷纷由「高仿美团饿了么首页」转向「高仿宇宙飞船控制台」,全套教学视频 + 源码仅需 998。各大前端框架争相游说各国载人航天团队,史称前端太空竞赛。社区开始争论 React Hooks 和 Vue Composition API 哪个更适合登月。SpaceMVC 项目取代 TodoMVC,成为了下一个前端框架的 battle 标准。工程师一旦发现飞船超重,第一个排查问题的位置就是 node_modules。某国湿婆神号飞船任务失败,原因竟是该国程序员屏幕上的咖喱混淆了 == 和  ===,导致类型比较出错。言归正传,这条新闻的出处仅仅是一条非官方的 Tweet。在 Fake News 横行的今天,怎样确定龙飞船 2 号用的就是 JavaScript 呢?SpaceX 并没有开源他们的技术栈,但仍然有不少可供交叉验证的有趣信息源,今天摸到了条大鱼啊(笑)。首先,推文中附上了四年前 Stack Exchange 上 对猎鹰 9 号计算机技术栈的讨论,其中的主要信息源则是 Reddit 上 SpaceX 软件团队的 AMA 介绍 。另外,Hacker News 上近期也有活跃的 后续讨论帖。这里对其中(与 GUI 部分相关的)主要信息整理如下:龙飞船 2 号和猎鹰 9 号的飞控软件系统基于 Linux,其底层均由 C/C++ 实现。Chromium + JavaScript 属于这一系统中的太空舱界面(flight interface)部分。UI 界面有 100% 的测试覆盖率,包括对图形绘制结果的验证。UI 屏幕彼此之间是完全独立的,相当于冗余备份。UI 系统可以重启,在直播中对接国际空间站时就有这样的例子。除了飞控系统中的 UI 外,SpaceX 还有其他需要 GUI 的地方。负责地面软件的团队使用 LabView 开发地面指挥中心的 GUI,企业 IT 团队则使用常见的 Web 技术栈开发项目管理、库存管理等内部后台系统。上面这些信息除了 AMA 之外都可能有偏差,主要讨论者也未必是这套触屏 UI 的实际开发者。不过稍加搜索就能发现更有趣的料,那就是这套 UI 界面设计师自己的 Portfolio 页面:<img src="https://pic3.zhimg.com/50/v2-89ec0ec5370d4abf067d5e2e56f56e33_hd.jpg" data-rawwidth="987" data-rawheight="848" data-size="normal" data-caption="" data-default-watermark-src="https://pic3.zhimg.com/50/v2-e9e2424ae6d998c63b057bced1e9b935_hd.jpg" class="origin_image zh-lightbox-thumb" width="987" data-original="https://pic3.zhimg.com/v2-89ec0ec5370d4abf067d5e2e56f56e33_r.jpg"/>看到这个页面的时候,我第一印象是这真不是「Lorem Ipsum」式的 Demo 吗……这也太梦幻了吧。但在找到设计师 AJ Fitzpartrick 的 LinkedIn 之后,基本可以确定这还真不是 PPT,有被羡慕到。所以为宇宙飞船设计触屏 UI,到底是在干嘛呢?具体细节仍然处于保密状态,但这位设计师公开的工作描述包括了这些:将航天员在飞行阶段的职责转化为软件需求,与太空运营团队合作,创建出用于驾驶舱触屏显示器的线框和 UI 流程。向 SpaceX 团队和 NASA 客户(包括龙飞船的宇航员机组在内)介绍设计和 UI 流程。基于太空旅行的独特条件,制定风格指南和设计规范,例如适应宇航员手套的触摸目标,以及保证震动时的易读性。与软件工程师紧密合作,了解硬件和技术限制,确定用户体验上的空白和设计任务的优先级。将设计产物和用于生产的素材交付给软件工程师。虽然好像也不是特别复杂,但是这牛逼真是可以吹一辈子啊……这里还有一个有趣之处,那就是这位 UI/UX 设计师此前并非来自「航空航天体制内」,而是做 App 与 Web 的设计出身的。他的代表作品包括索尼的全球设计规范和图片编辑器,还有 iOS 的社交应用等。这也体现了 SpaceX 在组建精英团队时的多元文化(例如做上面介绍的飞控软件的团队,其背景就来自于游戏、消费者软件、Web 开发、金融、电信、航空、学术界等)。所以做交互的同学们还是要有点志气,万一哪天我国的宇宙飞船也要招人做设计稿了呢?至于 SpaceX 正式对外的分享资料,则主要来自 2016 年的 GDC 分享 。他们在其中介绍了新一代软件工具技术对他们的价值:<img src="https://pic1.zhimg.com/50/v2-7c6c32ea27e7100bb56964ce12031d6d_hd.jpg" data-rawwidth="2410" data-rawheight="1419" data-size="normal" data-caption="" data-default-watermark-src="https://pic2.zhimg.com/50/v2-b15a1ad29ca638fed3e22f85f677bac2_hd.jpg" class="origin_image zh-lightbox-thumb" width="2410" data-original="https://pic4.zhimg.com/v2-7c6c32ea27e7100bb56964ce12031d6d_r.jpg"/>这页 PPT 直译过来是这样的:算力上的进步开启了全新的可能性存储、计算和渲染能力上的突破,使实现 3D 渲染和交互式地图等特性成为了可能。移动设备在重量和能耗上的改进非常显著。触摸屏已经很便宜,普及到随处可见。浏览器是界面开发的新平台各种库和框架提供了稳定的功能,并能快速实现原型。现代化的开发和调试工具提高了迭代速度。技术的跨业界通用性扩大了潜在的人选范围,减少了磨合时间。PPT 上还有专门的一页讲了触摸屏技术:<img src="https://pic4.zhimg.com/50/v2-841e0b6a2b15fbd03bf27328c68e2f60_hd.jpg" data-rawwidth="2280" data-rawheight="1227" data-size="normal" data-caption="" data-default-watermark-src="https://pic3.zhimg.com/50/v2-20f29c3f36465ffc65c6b685fb7cde1c_hd.jpg" class="origin_image zh-lightbox-thumb" width="2280" data-original="https://pic3.zhimg.com/v2-841e0b6a2b15fbd03bf27328c68e2f60_r.jpg"/>要点直译过来也很简单:将操作控制移到显示屏上后,极大地减少了空间占用和混乱。通过多个相同的显示屏,很容易实现冗余备份。触摸屏的泛用性使得开发变得容易,还能流水线式地执行训练和测试。基于软件的界面布局,提高了迭代速度。这就是新一代 UI 技术栈对航天领域的影响了。不过对于到此为止的这些内容,仍然可能会有些「这不就只是用 JS 画了点花里胡哨的东西而已吗」的质疑。但其实在即将发射的 詹姆斯·韦伯太空望远镜(JWST)里,NASA 已经在用 JavaScript 操控太空望远镜的观测计划了:在 JWST 机载架构中,活动计划均由地面上传。每个计划都包含了多个 Visit,它们通过上层的机载 JavaScript 来处理。而每个 Visit 则会包含由下层机载脚本处理的观测活动(如探测器配置、回转请求等)。这些机载脚本会构建出命令和遥测请求,从而操作观测子系统(如科学仪器、航天器总线中的姿态控制子系统等)。这个架构设计写在了介绍 JWST 的论文(JWST: Maximizing Efficiency and Minimizing Ground Systems)里,如图所示:<img src="https://pic1.zhimg.com/50/v2-3df0c3a20a3905503f3a655ca3a1ffd1_hd.jpg" data-rawwidth="500" data-rawheight="843" data-size="normal" data-caption="" data-default-watermark-src="https://pic1.zhimg.com/50/v2-4ce8985534952ed59b8c6056952b383c_hd.jpg" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic3.zhimg.com/v2-3df0c3a20a3905503f3a655ca3a1ffd1_r.jpg"/>对于这个破天荒地引入 JS 引擎的操作,其实还有另一篇论文,讲了事件驱动的 JWST 操作设计(Event-driven James Webb Space Telescope Operations)。NASA 使用的是一个由 Nombas 公司开发的普通商用级 JS 引擎,它被嵌入在了 VxWorks 实时操作系统中。论文中探讨了在 JWST 中引入事件驱动架构的优势,值得感兴趣的同学拓展一下视野。Nombas 公司在《JavaScript 20 年》中登场过。它虽然名不见经传,但其实也是首次 TC39 会议的参与者,当时的产品是名称跟 C++ 相反的 Cmm(C minus minus)语言。后来他们在此基础上研发出了嵌入式 ECMAScript 引擎 ScriptEase,亦即被 NASA 选用的产品。这家公司后来被 Openwave 收购。到此为止,我们已经看到 JavaScript 这门「罄竹难书」的语言,居然已经开始在无比高大上的航天领域崭露头角了。在《JavaScript 20 年》史书的结尾处,JS 之父 Brendan Eich 是这样为 JS 正名的:最早他们说 JavaScript 没法做「富互联网应用」。然后他们说 JavaScript 没法快起来。然后他们说 JavaScript 没法修复语言问题。然后他们说 JavaScript 没法做多核与 GPU 运算。今天我们可以再补一条:然后他们说 JavaScript 没法做航天级项目。Wrong every time!于是我们再次应证了这条规律:Always bet on JS.当然了,用不用 JS 说到底看的还是实际场景,龙飞船成功的关键也并不是 JS,而是大量前沿科学与工程领域实打实的硬核积累。但作为 GUI 开发者,这里还是许个小小的祝愿,希望有生之年大家做的 UI,能有机会帮助人类飞向更大的世界吧。Wrong every time!于是我们再次应证了这条规律:Always bet on JS.当然了,用不用 JS 说到底看的还是实际场景,龙飞船成功的关键也并不是 JS,而是大量前沿科学与工程领域实打实的硬核积累。但作为 GUI 开发者,这里还是许个小小的祝愿,希望有生之年大家做的 UI,能有机会帮助人类飞向更大的世界吧。
  • [问题求助] Taishan 2280 V2安装centos7.7 1908 server with gui版本无法启动
    服务器型号:Taishan 2280 V2OS版本:centos7.7 1908 Server with GUI问题描述:系统安装成功,然后再次重启服务器后无法进入系统,通过串口确认内核已经启动,可能是GUI无法启动。题求助:请问Taishan是否不兼容centos7.7?该问题如何解决?
  • [技术干货] 【工具分享】北向GUI调试应用 【转】
    (转自https://developer.huawei.com/ict/forum/thread-19669.html)自研工具,提供北向应用基本功能在华为物联网平台的对接开发中,需要南向和北向同步配合进行,尤其是设备的绑定操作,需要北向先注册,南向才能绑定。但是,部分开发者专注于设备的开发,对于北向的应用没有开发需求,希望有一个简单的工具来提供北向应用的基本功能。所以,我开发了这个北向应用GUI小程序,帮助开发者进行对接阶段的调试和开发。一方面,可以便于暂时不想进行北向服务器端应用开发的开发者,配合使用该GUI程序,完成南向设备端的开发;另一方面,该程序的源码已经分享在github之上,对于编写北向服务器应用的开发者也有一定的参考价值。下载地址:包括可执行程序和源码https://github.com/Huawei/IoT_OceanConnect_North_GUI_APPDemo登录界面:主界面:基本功能:应用管理、设备管理、数据管理、命令管理(分为NB模式和Agent模式)、规则管理、订阅管理。应用管理:配置设备异常时间和离线时间(异常和离线的状态切换,可以在论坛搜索相关帖子了解);刷新Token,Token有有效时间,如果超时,则无法获取相关服务,可以点击该按钮刷新。设备管理:注册设备:注册成功,Log区将显示device id。删除设备。修改设备信息:修改设备的基础配置。获取设备列表:可以根据需求(在线或离线、网关或节点)来获取指定设备列表。查询设备状态:在线OR离线。查询设备基础信息:获取设备的基础信息。数据管理:动态获取设备服务能力。根据设备服务能力刷新界面后,可以查询设备当前服务数据和历史数据。命令管理:动态获取设备服务命令下发能力。根据设备服务能力刷新界面后,可以通过平台下发异步命令(NB-IoT)或下发即时消息(Agent)到设备。查询命令状态(NB-IoT)。删除命令(NB-IoT)。规则管理:创建规则,目前响应形式支持发送邮件和短信,未添加命令的形式。更新规则。查询规则:根据作者和规则名进行查询。修改规则的状态:激活或未激活。删除规则。订阅管理:订阅平台支持的各种消息。这个小工具第一次放出来,难免会有一些小bug,欢迎大家测试使用。如果有任何问题,请保存异常日志,并通过论坛和我联系,谢谢。下载地址:包括可执行程序和源码https://github.com/Huawei/IoT_OceanConnect_North_GUI_APPDemo