Pony语言学习(七)——表达式(Expressions)语法(单篇向)

2023-05-16

一、字面量(Literals):

(一)Bool值:没啥要说的,就是truefalse👊

(二)数值(Numeric Literals):

支持类型:

  • U8, U16, U32, U64, U128, USize, ULong
  • I8, I16, I32, I64, I128, ISize, ILong
  • F32, F64

当然,作为一门现代编程语言,Pony支持自动类型推导,但有时候它与我们用C++、Swift时的直觉相悖:

let my_explicit_unsigned: U32 = 42_000
let my_constructor_unsigned = U8(1)
let my_constructor_float = F64(1.234)

同Swift一样,数值字面量可以用下划线分割。此外你还注意到,U8(1),F64(1.234)这些字面量带上了类型,有些用户说,这从C的观点来看,这类型推导完全没有技术含量啊,我都已经告诉你类型了,哪里还有推导的余地?其实,大多数(用过之前版本的)Java用户并不同意这样的观点,因为他们之前会写出这样的代码:

AReallyUselessClass anotherUselessObj = new AReallyUselessClass("useless things!")

其中痛楚无需赘言。

除此之外,Pony还支持不同进制(指2 8 10 16进制)的数值字面量(不同于Erlang支持2—36进制)以及科学计数法:

let my_decimal_int: I32 = 1024
let my_hexadecimal_int: I32 = 0x400
let my_binary_int: I32 = 0b10000000000

let my_double_precision_float: F64 = 0.009999999776482582092285156250
let my_scientific_float: F32 = 42.12e-4

(三)字符(Character Literals):

各位在C语言里都见的不爱见了,但是在很多现代语言里,人们似乎更喜欢用string去写业务逻辑,不论是char还是Char似乎只有在foo_str[1]里出现。Pony里除了能用单引号(')括起来一个字符外,还支持多字节字面量(Multibyte Character literals):

let big_a: U8 = 'A'                 // 65
let hex_escaped_big_a: U8 = '\x41'  // 65
let newline: U32 = '\n'             // 10

let multiByte: U64 = 'ABCD' // 0x41424344

别把它当Javascript🙏!

(四)字符串(String Literals):

无论如何,string被现代语言处理的已经可以称得上elegant了。大概是从PHP开始吧,人们注意到只用“”并不够用,所以造了一个多行字符串,后来又衍生出原字符串(raw string)和插值语法。总之,从语言层面上,string这个概念已经很完美了。现在让我们看看Pony里字符串是什么样子:

use "format"

actor Main
  new create(env: Env) =>

    let pony = "🐎"
    let pony_hex_escaped = "p\xF6n\xFF"
    let pony_unicode_escape = "\U01F40E"

    env.out.print(pony + " " + pony_hex_escaped + " " + pony_unicode_escape)
    for b in pony.values() do
      env.out.print(Format.int[U8](b, FormatHex))
    end

自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球。在2015年苹果推出的编程语言Swift,当然是后来的教程中,也明确表示emoji可以被加入到字符串,似乎这就是在提醒我们把emoji应当看作是字符和表情的结合体。字符串之字符的取值范围一步步的扩大,我们有理由相信string除了elegant还能变得even more powerful:

let stacked_ponies = "
🐎
🐎
🐎
"

let u_umlaut = "ü"

let triple_quoted_string_docs =
  """
  Triple quoted strings are the way to go for long multiline text.
  They are extensively used as docstrings which are turned into api documentation.

  They get some special treatment, in order to keep Pony code readable:

  * The string literal starts on the line after the opening triple quote.
  * Common indentation is removed from the string literal
    so it can be conveniently aligned with the enclosing indentation
    e.g. each line of this literal will get its first two whitespaces removed
  * Whitespace after the opening and before the closing triple quote will be
    removed as well. The first line will be completely removed if it only 
    contains whitespace. e.g. this strings first character is `T` not `\n`.
  """

上述三例均来自官网,意义分别为:1.支持多行字符串(公平对待换行符)2.可以直接打入特殊字符3.三双引号多行字符串。

最后一个被拿来用作大部分现代编程语言的多行字符串处理方案,它还可以更强大!就比如Ceylon就把这种字符串当成了注释方式的一种。

关于比较字符串,Java程序员又要抱怨了:什么是池?什么是哈希值?什么是实例?如果仅仅是比较字符串就要考虑这么多,不禁有点小忧伤:

let pony = "🐎"
let another_pony = "🐎"
if pony is another_pony then
  // True, therefore this line will run.
end

(五)数组(Array Literals):

关于数组,STL的容器思想和Java的Collection逼得人们不得不从一个更高的层面去思考这样一个数据结构。在Pony中,things got a little different:

let my_literal_array =
  [
    "first"; "second"
    "third one on a new line"
  ]

1.类型推导:

以下介绍会涉及部分Reference Capability的知识,建议囫囵吞枣🙈

let my_heterogenous_array = 
  [
    U64(42)
    "42"
    U64.min_value()
  ]

默认数组的元素可以改变,所以通常我们声明出来的数组类型为:Array[T] ref,其中T是泛型语法。上面这个数组的类型就是Array[(U64|String)] ref。当然了,我们也可以显式指明数组类型:

let my_stringable_array: Array[Stringable] ref =
  [
    U64(0xA)
    "0xA"
  ]

如果我们想要一个不可改变的安全的数组:

let my_immutable_array: Array[Stringable] val =
  [
    U64(0xBEEF)
    "0xBEEF"
  ]

2.As表达式:

有时候,我们需要限制类型推导但同时不失灵活性👌:

let my_as_array =
  [ as Stringable:
    U64(0xFFEF)
    "0xFFEF"
    U64(1 + 1)
  ]

否则,它将被推导为Array[(U64|String)] ref😱

二、变量(Variables):

(一)局部变量:

同Swift,var用来声明可变量,let用来声明常量:

var x: String = "Hello, world!"
let name = "PECman"

出于安全考虑(依旧同Swift),局部常量在声明之初必须赋值(从并发的思想去思考为什么需要这样的限制),而变量是没有此限制的:

var z: String
z = "Hello"    //🆗
let y: U32 // Error😥, can't declare a let local without assigning to it
y = 6 // Error😭, can't reassign to a let local

当然,局部意思是存在其作用域(scope):

if a > b then
  var x = "a is bigger"
  env.out.print(x)  // OK
end

env.out.print(x)  // Illegal

(二)字段(Fields):

和其他OOP语言类似,Pony对字段的改动并不大,只不过要注意下划线开头的字段是私有字段。除此之外,每一个字段的生命周期都与实例对象绑定。上面我们提到过一个局部变量的赋值限制,字段有一点点不同:

如果字段没有在声明时构造方法里赋值,就会报错:

class Wombat
  let name: String
  var _hunger_level: U64

  new ref create(name': String, level: U64) =>
    name = name'
    set_hunger_level(level)
    // Error: field _hunger_level left undefined in constructor
  
  fun ref set_hunger_level(hunger_level: U64) =>
    _hunger_level = hunger_level

嗯哼?

(三)嵌入字段(Embedded Fields):

与局部变量不同,某些类型的字段可以使用embed声明。具体来说,字段只能嵌入类或结构而不能嵌入接口、特征、原生类和数字类型。使用embed声明的字段类似于使用let声明的字段,但在实现(implementation)级别,嵌入类的内存直接在外部类中布局。与let或var相比,实现使用指针来引用field类。嵌入字段可以以与let或var字段完全相同的方式传递给其他函数。嵌入字段必须从构造函数表达式初始化。

为什么要使用嵌入?嵌入避免了访问字段时的指针间接寻址和创建该字段时的单独内存分配。默认情况下,如果可能,建议使用嵌入。但是,由于嵌入字段与其父对象一起分配,因此对该字段的外部引用禁止对父对象进行垃圾收集,如果字段比其父对象长,则可能导致更高的内存使用率。如果这恰好是你关心的问题,请使用let。

(四)全局变量和重名变量:

Some programming languages have global variables that can be accessed from anywhere in the code. What a bad idea! Pony doesn’t have global variables at all.

同时,很多编程语言里都允许你利用遮蔽(shadowing)覆盖变量,如:

fn main() {
    let mut mutable = 200;
    let mutable = true  //利用遮蔽更改类型和值
}

然而:

If you accidentally shadow a variable in Pony, the compiler will complain.

 If you need a variable with nearly the same name, you can use a prime '😊.

三、操作符(Operators):

(一)操作符别名:

下面两个语句是等效的:

x + y
x.add(y)

依此,我们可以改变一些二元操作符的业务逻辑:

// Define a suitable type
class Pair
  var _x: U32 = 0
  var _y: U32 = 0

  new create(x: U32, y: U32) =>
    _x = x
    _y = y

  // Define a + function
  fun add(other: Pair): Pair =>
    Pair(_x + other._x, _y + other._y)

// Now let's use it
class Foo
  fun foo() =>
    var x = Pair(1, 2)
    var y = Pair(3, 4)
    var z = x + y

和C++一样,咱们不能逮着一个操作符就把它给改了,这里有一份列表,以示范围:

 (二)一元操作符:

以下两行代码等价:

-x
x.neg()

同上,也有一张表:

官网还有短路运算、优先级等知识:https://tutorial.ponylang.io/expressions/ops.html,此处从略

算术(Arithmetic)相关知识和操作符关联很大:https://tutorial.ponylang.io/expressions/arithmetic.html,请自行阅读。

四、控制流(Control Structures):

(一)条件判断:

一个例子搞清基础语法:if then elseif then ... else

if a == b then
  env.out.print("they are the same")
else
  if a > b then
    env.out.print("a is bigger")
  else
    env.out.print("b bigger")
  end
end

此外,不同于C中可以用1或0或任意一个整数或指针代替条件,Pony的条件表达式返回值就是布尔值,不能是其他值.

(二)重要理念——万物皆表达式(而表达式就有值):

这一点在很多现代编程语言里很常见,你有充分理由把它理解为三元运算符的延申:

var x: (String | Bool) =
  if friendly then
    "Hello"
  else
    false
  end

当然,对于空类型(None)各大现代编程语言也有所支持,例如Scala中有Nothing等,Swift和Ceylon也各有方案。主要是想萃取null或nullptr的功能:

var x: (String | None) =
  if friendly then
    "Hello"
  end

记住,表达式一定要返回值,哪怕是空值!

(三)循环语句:

1.While循环:

var count: U32 = 1

while count <= 10 do
  env.out.print(count.string())
  count = count + 1
end

按照万物皆表达式的原则,这个while表达式会返回什么呢?答案是10.(注:Pony中表达式永远返回旧值,例如:

a=b=a  <=>  swap = a; a = b; b = a)

2.Break和Continue语句:

这两个语句的重要性就不用多说了,最著名的是那个意大利面程序(goto语句带来的灾难)。刚刚说过,万物皆表达式,而表达式则需要返回值。让我们认真分析一下break和continue的应用场景:

(1)Break语句意味着跳出循环,象征着循环表达式的结束,这样就暗示需要返回值。在Pony中,我们通常需要这样使用break:

var name =
  while moreNames() do
    var name' = getName()
    if name' == "Jack" or name' == "Jill" then
      break name'
    end
    name'
  else
    "Herbert"
  end

有的读者见过带标签的循环/break语句(Swift代码):

outerloop:
for  i in 0 ..< 10
{
  innerloop:    
    for j in 0 ..< 10
    {
        if (j > 3)
        {
            break;
        }
        if (i == 2)
        {
            break innerloop;
        }
        if (i == 4)
        {
            break outerloop;
        }
        print("i = \(i)  and with j = \(j)"  )
    }
}

在Pony中这是禁止的。Pony认为如果你使用了类似的语法,说明你的代码存在算法级别问题,也就是说你需要重构你的代码。

(2)continue语句通常代表继续循环,可能循环没结束,也有可能下一轮循环就会结束(条件不符时),这个时候你并不需要像break语句一样附带一个值。循环中的else代码块会起到大作用

2.For循环:

和Swift中一样,Pony放弃了C风格的For循环,采用了迭代For循环:

for name in ["Bob"; "Fred"; "Sarah"].values() do
  env.out.print(name)
end

同时,Pony也支持一种STL用户熟悉的语法(注意迭代器被声明为常量):

let iterator = ["Bob"; "Fred"; "Sarah"].values()
while iterator.has_next() do
  let name = iterator.next()?
  env.out.print(name)
end

其中?代表可选值的展开,swift中有类似概念:Swift中的问号?和感叹号! Charly_Zheng

3.Repeat语句:

其实它非常像do while语句,只不过要有现代编程语言的一点样子:

var counter = U64(1)
    repeat
      env.out.print("hello!")
      counter = counter + 1
    until counter > 7 end

记住,即使条件不符合这个循环也会执行一遍。尽管如此,你有时候仍然需要为这个循环加上一个else代码块:

continue in the last iteration of a repeat loop needs to get a value from somewhere and an else expression is used for that.

 五、方法(Methods):

1.函数:

Pony functions are quite like functions (or methods) in other languages. 

 但是要注意,如果不指明返回值类型,一律按None处理:

class C
  fun add(x: U32, y: U32): U32 =>
    x + y

  fun nop() =>
    add(1, 2)  // Pointless, we ignore the result

不少人听说过甚至可能是重载(overload)概念的狂热爱好者,可惜,Pony并不允许这样的事情发生。

2.构造器:

在类及其他类型中,我们使用new关键字声明一个构造函数。如果你需要非常多的构造器,你可以用new指明哪些是构造器,但是,你必须要有一个create构造器(这是语法糖需要,详情请看:语法糖)。依代码逻辑所需,你可以提前退出构造器——使用return语句(你一定想到了!)

3.默认参数(Default arguments):

这是当年很多人为之发愁的特性。很多同学在初学C语言时比较善思——printf是怎么实现的呢?C语言里对这方面处理的有点复杂,在一个合格的现代编程语言那里应该这么做:

class Coord
  var _x: U32
  var _y: U32

  new create(x: U32 = 0, y: U32 = 0) =>
    _x = x
    _y = y

class Bar
  fun f() =>
    var a: Coord = Coord.create()     // Contains (0, 0)
    var b: Coord = Coord.create(3)    // Contains (3, 0)
    var c: Coord = Coord.create(3, 4) // Contains (3, 4)

但是,另一个问题油然而生了。就拿C++中的Win32基础开发,在注册窗口类的时候,有很多参数实际上是不需要我们来打理的,这就意味着需要体现程序的自动优越性。在简单的封装之后,比如:

void createMyWindow(..., string title = "Title", int height = 80, int width = 100, ...)

假设我想用默认的标题但是我想改一改窗口的高度或宽度,我就必须先填好第一个参数,之后才有权更改之后的参数。很烦,不是吗?

4.命名参数:

Pony使用where语法解决了上述问题:

class Foo
  fun f(a: U32 = 1, b: U32 = 2, c: U32 = 3, d: U32 = 4, e: U32 = 5): U32  =>
    0

  fun g() =>
    f(6, 7 where d = 8)
    // Equivalent to:
    f(6, 7, 3, 8, 5)

记住,如果你的输入数据起初是按顺序的,那么就先按顺序来,之后再用where语句。

5.链语法:

primitive Printer
  fun print_two_strings(out: StdStream, s1: String, s2: String) =>
    out.>print(s1).>print(s2)
    // Equivalent to:
    out.print(s1)
    out.print(s2)
    out

object.>method(arg1: ...)     <===>    object.method(arg1:...) ; object

如果是这样的链,则等于:

object.>method1(arg1:...).method2(arg1:...)  <===>  object.method1(arg1:...) ; object.method2(arg2:...)

细细思考,这是很自然的:

interface Factory
  fun add_option(o: Option)
  fun make_object(): Object

primitive Foo
  fun object_wrong(f: Factory, o1: Option, o2: Option): Object =>
    f.>add_option(o1).>add_option(o2).>make_object() // Error! The expression returns a Factory

  fun object_right(f: Factory, o1: Option, o2: Option): Object =>
    f.>add_option(o1).>add_option(o2).make_object() // Works. The expression returns an Object

6.匿名函数(闭包):

use "collections"

actor Main
  new create(env: Env) =>
    let list_of_numbers = List[U32].from([1; 2; 3; 4])
    let is_odd = {(n: U32): Bool => (n % 2) == 1}
    for odd_number in list_of_numbers.filter(is_odd).values() do
      env.out.print(odd_number.string())
    end

更详细的阐述见:Object Literals section

7.其他注意事项:

 六、错误处理:

凡是完备的语言都需要错误处理,这方面比较出色的是Java,比较逊色则是Go和C++。这和代码风格和语言传统有很大关系,就和大括号到底写在哪是一个道理。Pony这方面我还并没有看到我想要的那种错误处理,毕竟刚刚0.9,出了1.0再说。

1.抛出和处理错误:

try
  callA()
  if not callB() then error end
  callC()
else
  callD()
end

记住,error不是泛指,而是特指一个名为“error”的命令(command)。如果程序有哪里让你不满意了,你就可以做一些处理,再使用error命令抛出错误。而关于try表达式的返回值,就是它的代码块之一的最后一句(你肯定又猜到了!)

我们在Java里见到过finally块,那么它在Pony里是怎么被引入的呢?

try
  callA()
  if not callB() then error end
  callC()
else
  callD()
then
  callE()
end

即使你在try代码块里返回了某个值或者None,then块还是会执行的。

2.偏函数:

资料链接:Partial Functions(偏函数)

阅读完后请读者自己按其中要义自己写出一个偏函数,之后可以和官网例子对照看看:

fun factorial(x: I32): I32 ? =>
  if x < 0 then error end
  if x == 0 then
    1
  else
    x * factorial(x - 1)?
  end

3.With语法:

with被用于简化try块(特别是当需要声明变量时)和清除变量的操作,这一点和Python十分类似(在Python中被广泛用于文件操作):

with obj = SomeObjectThatNeedsDisposing(), other = SomeOtherDisposableObject() do
  // use objs
else
  // only run if an error has occurred
end

如果你想要你的类也支持with语法:

class SomeObjectThatNeedsDisposing
  // constructor, other functions

  fun dispose() =>
    // release resources

*延伸阅读:

七、结余:

剩下的部分我认为只有一个Object Literals section需要好好学习学习:https://tutorial.ponylang.io/expressions/object-literals.html。其他的话诸君尽可泛读过去。为了我们下面Reference Capability的学习,大家再加把劲,加油!

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

Pony语言学习(七)——表达式(Expressions)语法(单篇向) 的相关文章

  • ubuntu16.04安装完docker后无法上网,没有eth0或eno1只有docker0

    ubuntu16 04安装完docker后无法上网 xff0c 没有eth0或eno1只有docker0 vim etc NetworkManager NetworkManager conf 把里面的 dns 61 dnsmasq用 注释掉
  • OpenCV—PnP单目测距

    OpenCV PnP单目测距 使用单目相机结合OpenCV的pnp解算实现单目测距 xff08 需要知道物体的长宽 xff09 开始用的opencv 自带的标定api 标定相机 xff0c 但是标定结果和matlab的结果有出入 xff0c
  • 【具体实现过程】百度地图POI区域的边界经纬度坐标数据采集

    最近有个项目需要拿到百度地图中XXX市中所有学校的边界坐标 经过一下午的努力 xff0c 终于成功拿到了坐标 xff0c 对坐标数据还原和验证 特此记录一下具体实现过程和爬取思路 前言 xff1a 什么是POI xff1f Point of
  • Gazebo仿真平台模型搭建与修改

    ROS进阶教程 xff08 一 xff09 Gazebo仿真平台模型搭建与修改 文件讲解Models 文件World文件Launch文件 模型编辑可视化操作配置文件编辑 仿真操作流程完成model建模world文件和launch文件修改 其
  • XShell过期需要采购解决办法

    有天Xshell更新完再打开 xff0c 提示我去采购 xff0c 当然采购得花钱 xff0c 所以下面方法是解决这一问题 1 跳到官网 https www netsarang com download free license html
  • 【SMT32CubeMx安装详解】

    SMT32CubeMx安装详解 文章目录 SMT32CubeMx安装详解 前言一 准备工作二 CubeMax安装三 工程参数配置总结 前言 记录CubeMax软件安装和相关工程配置的简单操作 一 准备工作 在我们进行软件安装之前首先将我们需
  • AirSim无人机仿真平台(windows)

    1 环境 xff1a UE4 26 43 AirSim 43 VS2019 2 安装步骤 xff1a 1 xff09 先下载Epic Games安装启动器 xff0c 然后再安装UE4 26 xff1b 2 xff09 安装VS2019社区
  • ubuntu18在docker下运行kalibr

    一些命令 docker images sudo docker run it kalibr latest sudo docker run it v local path docker path respository bin bash sud
  • 机器人避障规划算法之VFH系列算法研究现状

    机器人路径规划算法可以分为全局路径规划与局部路径规划 xff0c 全局规划算法一般需要地图信息作为先验知识 xff0c 而局部规划算法利用传感器探测环境信息避开障碍物 常用的全局算法算法有可视图法 xff0c 栅格地图法 xff0c 智能算
  • Windows配置ArUco

    windows10 vs2019 opencv3 4 6 注意 xff0c 一定要选择与opencv版本一样的opencv contrib 进行编译 xff0c 否则将会出现错误 xff0c 有很多的工程不能编译通过 xff0c 不能产生相
  • ArUco估计位姿原理

    ArUco使用 PnP OpenCV aruco 校准相机 Camera Calibration Demo 使用opencv的aruco库进行位姿估计 include lt opencv2 core core hpp gt include
  • 传递函数极点与微分方程的解

    如何解微分方程 setting y 61 e rx xff0c 点睛之笔
  • MPC控制

    基于状态空间模型的控制 模型预测控制 xff08 MPC xff09 简介 对基于状态空间模型的控制理解得很到位 在这里我重点讲解一下状态空间 模型 那么什么是状态 xff1f 输出是不是也是状态的一种 xff1f 对的 xff0c 输出也
  • @卡尔曼滤波理解

    Kalman Filter For Dummies 翻译 如何用卡尔曼滤波算法求解电池SOC xff08 基础篇 xff09 转载留存 卡尔曼滤波算法详细推导 这一篇对预备知识的介绍还是很好的 xff0c 过程与原理讲解也很到位 xff0c
  • 全景避障、VIO

    VINS Mono代码分析与总结 完整版 单目与IMU的融合可以有效解决单目尺度不可观测的问题 鱼眼摄像头SLAM xff1a PAN SLAM 全景相机SLAM 原论文 xff1a Panoramic SLAM from a multip
  • CAN总线-ACK应答机制分析

    1 xff1a 应答场定义 应答场长度为 2 个位 xff0c 包含应答间隙 xff08 ACK SLOT xff09 和应答界定符 xff08 ACK DELIMITER xff09 在应答场里 xff0c 发送站发送两个 隐性 位 当接
  • 树莓派4b 引脚图

    树莓派 4B 详细资料
  • 控制~线性系统~的能控性和能观性

    现控笔记 xff08 四 xff09 xff1a 能控性和能观性 能控性 xff1a 是控制作用u t 支配系统的状态向量x t 的能力 xff1b 回答u t 能否使x t 作任意转移的问题 能观性 xff1a 是系统的输出y t 反映系
  • 创建功能包

    创建功能包 xff1a catkin create pkg 在Amos WS src路径下 xff0c 打开控制台输入catkin create pkg my package std msgs rospy roscpp 创建一个名为my p
  • SLAM算法

    一 概述 Simultaneous Localization and Mapping SLAM 原本是Robotics领域用来做机器人定位的 xff0c 最早的SLAM算法其实是没有用视觉camera的 xff08 Robotics领域一般

随机推荐

  • 激光雷达入门

    转载自 xff1a https zhuanlan zhihu com p 33792450 前言 上一次的分享里 xff0c 我介绍了一个重要的感知传感器 摄像机 摄像机作为视觉传感器 xff0c 能为无人车提供丰富的感知信息 但是由于本身
  • 【超详细】韦东山:史上最全嵌入式Linux学习路线图

    我是1999年上的大学 xff0c 物理专业 在大一时 xff0c 我们班里普遍弥漫着对未来的不安 xff0c 不知道学习了物理后出去能做什么 你当下的经历 当下的学习 xff0c 在未来的一天肯定会影响到你 毕业后我们也各自找到了自己的职
  • ArUco码辅助定位——计算机视觉

    使用USB网络摄像头和ROS跟踪ArUco Markers
  • 基于D435i的点云重建

    Task 采用D435i采集深度图和RGB图像 xff0c 进行点云重建和聚类 1 xff09 解析Bag数据 xff1a import os import cv2 import numpy as np import rosbag from
  • vncviewer黑屏问题解决

    最近在重启服务器后 xff0c 用vnc进行远程桌面连接时 xff0c vnc能够连上 xff0c 或有提示错误 xff0c 或无提示错误 xff0c 但显示黑屏 在网上搜索了甚久 xff0c 各种google xff0c 各种baidu
  • Unbuntu 系统及VNC Viewer显示中文

    一行命令搞定 xff1a apt get install ttf wqy zenhei
  • 在嵌入式Linux系统上安装打印机

    简介 xff1a 在Linux环境中安装打印机 xff0c 通常是cups ghostscript等 xff0c 但体积通常很大 xff0c 几十兆 在我应用的环境 xff0c 要求打印模块不大于5M xff0c 在网上搜索的方案是将cup
  • 深度学习环境搭建:win10+GTX1060 + tensorflow1.5+keras+cuda9.0+cudnn7

    2018年 2月8日下午 xff0c 开始搭建环境 我新买了联想Y720笔记本电脑一台 xff0c 希望用它来开展深度学习的探索 根据之前的一点点经验 xff0c 搭建深度学习的环境 本篇博客主要记录的是流程 xff0c 不提供相关数据的下
  • Linux C/C++面试题汇总

    Linux C C 43 43 面试题汇总 前言计算机基础程序的内存空间进程和线程相关 关键字conststaticvolatile C C 43 43 指针 前言 最近面试的比较多 xff0c 看了很多关于面试的内容 xff0c 有些平时
  • NVIDIA TX2--3--NVIDIA Jetson TX2 查看系统版本参数状态及重要指令

    Yolov 1 TX2上用YOLOv3训练自己数据集的流程 VOC2007 TX2 GPU Yolov 2 一文全面了解深度学习性能优化加速引擎 TensorRT Yolov 3 TensorRT中yolov3性能优化加速 xff08 基于
  • freertos之timer浅析

    背景 freertos的定时器与我所见得到其他RTOS不一样 xff0c 我知道的ucosii是在每次tick 43 43 的时候会检查定时器链表 xff0c smc rtos也是这样做的 xff0c rtt没看过源码不清楚 xff0c 而
  • vins-fusion gps融合相关总结

    1 简介 xff1a VINS Fusion在VINS Mono的基础上 xff0c 添加了GPS等可以获取全局观测信息的传感器 xff0c 使得VINS可以利用全局信息消除累计误差 xff0c 进而减小闭环依赖 相比于局部传感器 xff0
  • vins-mono里的坐标系

    vins mono里主要涉及三个坐标系 xff1a word坐标系 xff0c body坐标系即IMU帧坐标系 xff0c cam坐标系即相机帧坐标系 对于单目系统而言 xff0c 初始化时就会确定世界坐标系 首先进行纯视觉初始化 SFM
  • 华三交换机配置telnet远程登录和http、https登录

    1 配置管理IP地址 lt H3C gt system view 进入系统视图 H3C int vlan 1 进入管理VLAN1 H3C Vlan interface1 ip address 1 1 1 1 24 配置默认管理IP地址 H3
  • C——char(字符串)转int

    有时候需要对输入的数字进行计算之类的操作 xff0c 这时候需要将char转int类型 char是一个单独字节 xff0c 可以保存一个本地字符集的内容的类型 一般使用char 的格式来使用 int就是一个范围较小的无符号整数类型 注意 x
  • Linux设备驱动——第三章字符驱动

    当对幸福的憧憬过于急切 xff0c 那痛苦就在人的心灵深处升起 加缪 本章的目的是编写一个完整的字符设备驱动 我们开发一个字符驱动是因为这一类适合大部分简单的硬件设备 字符驱动也比块驱动易于理解 本章的最终目的是编写一个模块化的字符驱动 x
  • FreeRTOS(一)系统时钟和中断

    RTOS系统运行必需要有时钟 xff0c FreeRTOS可以选择SysTick或TIM作为时钟源 本文以再stm32f1上的移植介绍 选择SysTick需要在FreeRTOSConfig h中取消SysTick Handler 函数的映射
  • 对于USB Bulk通信发送0包的理解

    写Device USB驱动的时候 xff0c 当Bulk送信发送的数据长度恰好是wMaxPacketSize的整数倍时 xff0c 是否应该发送0包的问题搞得我焦头烂额 查找了好多资料 xff0c 有的说要加 xff0c 这是USB协议的一
  • upload漏洞专题

    一 upload上传绕过专题 后缀检验绕过 1 黑名单检测绕过 1 上传文件重命名 span class token comment 由于只有后缀是可控的 span 所以常见的后缀为php中 php2 php3 php4 php5 phtm
  • Pony语言学习(七)——表达式(Expressions)语法(单篇向)

    一 字面量 xff08 Literals xff09 xff08 一 xff09 Bool值 xff1a 没啥要说的 xff0c 就是true和false x1f44a xff08 二 xff09 数值 xff08 Numeric Lite