g-var.com | G-VAR's Blog

Recent Posts

    Rust 1.2.2 | Display

    Thu, Jul 6, 2017
    转载请注明出处! 译文链接:Rust 1.2.2 | Display 英文原文:Display fmt::Debug看起来几乎是既不紧凑也不整洁,但通常利于进行输出形式的定制。而通过手动实现fmt::Display是可以实现紧凑又整洁的,其使用了{}输出标记。实现形式如下: // (通过`use`)导入`fmt`模块来使其可见 use std::fmt; // 定义一个用于实现`fmt::Display`的结构体,只是一个简单tuple struct, // 包含一个绑定到名称为`Structure`结构体`i32`类型数据 struct Structure(i32); // 为了使用`{}`标记,必须为此类型手动实现`fmt::Display`特性 impl fmt::Display for Structure { // 此特性需要`fmt`的确切签名 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // 直接将第一个元素写入提供的输出流:`f`中, // 返回一个`fmt::Result`,其表示了是否操作成功, // 注意`write!`的语法与`println!`类似。 write!(f, "{}", self.0) } } fmt::Display可能会比fmt::Debug更整洁,但这暴露了std库的一个问题。模糊类型该如何显示?例如,如果std库为所有的Vec<T>实现了一个单一类型,那么该是何种风格?下面两种的一种? Vec<path>:/:/etc:/home/username:/bin(以:分割) Vec<number>:1,2,3(以,分割) 都不是,因为所有的类型都没有实际的风格,并且std库也不会假定一个。Vec<T>或者其它通用容器并没有实现fmt::Display。这些通用情况会使用fmt::Debug。 这并不是个问题,因为任何新的容器类型都不是通用的,可以实现fmt::Display。 use std::fmt; // 导入`fmt` // 拥有两个数的结构体。继承了`Debug`,来与`Display`进行对比 #[derive(Debug)] struct MinMax(i64, i64); // 为`MinMax`实现`Display` impl fmt::Display for MinMax { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // 使用`self.

    VS2013编译Qt 4.8.6 x64

    Thu, Apr 13, 2017
    转载请注明出处! 原文链接:VS2013编译Qt 4.8.6 x64 下载Qt 4.8.6源码 下载地址 源码配置 将下载的qt-everywhere-opensource-src-4.8.6.zip解压,如:E:/qt-everywhere-opensource-src-4.8.6 对源文件进行修改,修改内容如下: 找到./mkspecs/win32-msvc2013/qmake.conf文件,将 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF QMAKE_LFLAGS_DEBUG = /DEBUG 修改为 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO QMAKE_LFLAGS_DEBUG = /DEBUG /INCREMENTAL:NO 找到./src/3rdparty/webkit/Source/JavaScriptCore/wtf/HashSet.h文件,将 return m_impl.add(value); 修改为 typedef typename HashSet<T, U, V>::iterator iter_type; auto& p = m_impl.add(value); return make_pair((iter_type)p.first, p.second); 再将 return m_impl.template addPassingHashCode<T, T, Adapter>(value, value); 修改为: typedef typename HashSet<Value, HashFunctions, Traits>::iterator iter_type; auto& p = m_impl.

    CheckIO 3 | House Password

    Wed, Aug 10, 2016
    转载请注明出处! 原文链接:CheckIO 3 | House Password 任务: 斯蒂芬和索菲亚对于一切都使用简单的密码,忘记了安全性。请你帮助尼古拉开发一个密码安全检查模块。如果密码的长度大于或等于10个符号,至少有一个数字,一个大写字母和一个小写字母,该密码将被视为足够强大。密码只包含ASCII拉丁字母或数字。 输入: 密码 (str, unicode)。 输出: 密码的安全与否,作为布尔值(bool),或者任何可以转换和处理为布尔值的数据类型。你会在结果看到转换后的结果(True 或 False)。 Example: checkio(‘A1213pokl’) == False checkio(‘bAse730onE’) == True checkio(‘asasasasasasasaas’) == False checkio(‘QWERTYqwerty’) == False checkio(‘123456123456’) == False checkio(‘QwErTy911poqqqq’) == True 如何使用: 如果你担心你的应用或服务的安全性,您可以检查用户密码的复杂性。你可以使用这些技巧要求你的用户的密码符合多个条件(标点符号或unicode)。 前提:: re.match(”[a-zA-Z0-9]+“, password) 0 < len(password) ≤ 64 答案: def checkio(data): if len(data)>9: if any(i.isupper() for i in data) and any(i.islower() for i in data) and any(i.isdigit() for i in data): return True else: return False else: return False 其它答案:

    CheckIO 2 | Median

    Wed, Aug 10, 2016
    转载请注明出处! 原文链接:CheckIO 2 | Median 任务: 中位数是一个可将数值集合划分为相等的上下两部分的一个数值。如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位数。在这个任务里,你将得到一个含有自然数的非空数组(X)。你必须把它分成上下两部分,找到中位数。 输入: 一个作为数组的整数(int)列表(list)的。 输出: 数组的中位数(int, float). 范例: checkio([1, 2, 3, 4, 5]) == 3 checkio([3, 1, 2, 5, 3]) == 3 checkio([1, 300, 2, 200, 1]) == 2 checkio([3, 6, 20, 99, 10, 15]) == 12.5 如何使用: 中位数在概率论和统计学中得到应用,它偏态分布中有显著的价值。例如:我们想从一组数据中知道人们的平均财富 – 100人一个月收入100美元,10人一个月收入1,000,000美元。如果我们算平均值,得到的是91000美元。这是一个完全没有向我们展示真实情况的奇怪的值。所以在这种情况下,中位数会给我们更有用的值和较好的描述。 维基百科的文章。 前提: 1 < len(data) ≤ 1000 all(0 ≤ x < 10 ** 6 for x in data) 答案:

    CheckIO 1 | Non Unique Element

    Tue, Aug 9, 2016
    最近在学习Python,听说了一个叫CheckIO的网站(需要翻墙),是通过游戏的方式以Python来解答各种问题,正好可以通过该网站的任务来加深对Python的理解,希望以后能有时间每天做一两道题,在此记录的是不是我的答案,只记录一下比较经典的答案,基于Python 2.7。 转载请注明出处! 原文链接:CheckIO 1 | Non Unique Element 任务: 你将得到一个含有整数(X)的非空列表。在这个任务里,你应该返回在此列表中的非唯一元素的列表。要做到这一点,你需要删除所有独特的元素(这是包含在一个给定的列表只有一次的元素)。解决这个任务时,不能改变列表的顺序。例如:[1,2,3,1,3] 1和3是非唯一元素,结果将是 [1, 3, 1, 3]。 输入: 一个含有整数的列表。 输出: 一个含有不唯一元素的整数列表。 范例: checkio([1, 2, 3, 1, 3]) == [1, 3, 1, 3] checkio([1, 2, 3, 4, 5]) == [] checkio([5, 5, 5, 5, 5]) == [5, 5, 5, 5, 5] checkio([10, 9, 10, 10, 9, 8]) == [10, 9, 10, 10, 9] 如何使用: 这个任务将帮助您了解如何操作数组,这是解决更复杂的任务的基础。这个概念可以很容易地推广到真实世界的任务。例如你需要通过删除低频的元素(噪声)来使统计数据更清楚。 前提: 0 < |X| < 1000

    [译]CMake与Visual Studio

    Mon, Jul 25, 2016
    最近在研究一个用CMake而生成的Visual Studio工程,修改项目属性比较艰难,有些时候还需要手动修改.vcxproj文件。遂想研究研究CMake,Google时碰到这么一篇CMake and Visual Studio的文章,想通过翻译的过程来加深学习。 转载请注明出处! 译文链接:CMake与Visual Studio 英文原文:CMake and Visual Studio CMake可以无缝地生成Visual Studio的解决方案。这篇文章会将CMake命令映射到Visual Studio IDE上,为了更容易学习会附上一个例子。此篇文章主要倾向于使用Visual Studio的C++开发者。这里的大多数引用都是基于Visual Studio 2010的,但应该也会同样适用于其他版本。大家可以从前言CMake for Visual Studio Developers开始阅读。注:这篇前言就不翻译了。 介绍 先简单的介绍一段关于CMake理念的背景。通常源文件应该被视为可以由开发者显式修改的任何文件。另外,可以从源文件持续生成的任何东西都应被视为构建过程的输出。每次构建总是会生成大量的临时或中间文件,为了避免生成的文件会弄乱实际的源文件,建议在源文件之外进行构建。 除了像.obj这样典型的中间文件,Visual Studio还会生成更多的临时文件,包括.sln、.sbr、.suo、.vcxproj.user、.vcxproj.filters。这些文件不需要(也不应该)被上传到源码库中,因为它们有的时候会非常大,并且这些文件还是用户特定的文件。 Visual Studio的开发者可能会将工程文件.vcproj视为”源”文件,因为它涉及到添加、删除文件以及修改文件的依赖等。然而,通过CMake你可以将工程文件也视为中间文件,因为CMake会自动生成它,并建议将其放置在源文件目录之外。 在CMake的构建系统中,构建的”规则”或者是”项目的设置”等都会被定义在称之为CMakeLists.txt的文本文件中。 Visual Studio到CMake的映射 Visual Studio项目的一些常见的操作和设置,以及它们与CMake的对应关系简要地罗列在下面的列表里。(注:表的内容就不翻译了) 例子 CMake Tutorial就是一个非常简单的例子。如果你对基本概念还不太清楚,请去该页面进行参考。这里的例子是个改进版本,用以展示常在Windows下使用的某些具体内容。 示例代码可以通过GitHub获得。而对于那些对Github不太熟悉的人,我将同样的代码打包成了7z文件。鼠标右键点击tutorial-7z.jpg,另存到硬盘上,然后将其重命名为Tutorial.7z,并将文件解压就可以获得源码了。 源码结构 CMake-VisualStudio-Example |---app | |---CMakeLists.txt | |---main.cxx |---math | |---advanced | | |---AdvancedFunctions.cxx | | |---AdvancedFunctions.h | |---simple | | |---SimpleFunctions.cxx | | |---SimpleFunctions.h | |----CMakeLists.txt | |---MathExports.h |---CMakeLists.txt |---TutorialConfig.h.in 执行CMake 如前所述,对于源外构建的建议,需要创建一个目录来存放由CMake生成的必须的Visual Studio项目文件和大量的CMake的特定文件。

    Golang获取网卡信息

    Wed, Dec 23, 2015
    转载请注明出处! 原文链接:Golang获取网卡信息 最近项目需要,想用Go语言获取网卡信息,并能用Go语言对网卡进行配置。 Go的net包可以获取网卡的IP,但不能获取网卡的子网掩码以及网关等信息,需要借助syscall包来获取子网掩码等信息,实现代码如下: // getAdapterList()是interface_windows.go下的源码,getAdapterList()这个函数只在go 1.5之前有,1.5之后就没有该函数了,不过这不影响程序的运行。 func getAdapterList() (*syscall.IpAdapterInfo, error) { b := make([]byte, 1000) l := uint32(len(b)) a := (*syscall.IpAdapterInfo)(unsafe.Pointer(&b[0])) err := syscall.GetAdaptersInfo(a, &l) if err == syscall.ERROR_BUFFER_OVERFLOW { b = make([]byte, l) a = (*syscall.IpAdapterInfo)(unsafe.Pointer(&b[0])) err = syscall.GetAdaptersInfo(a, &l) } if err != nil { return nil, os.NewSyscallError("GetAdaptersInfo", err) } return a, nil } func localAddresses() error { ifaces, err := net.Interfaces() if err != nil { return err } aList, err := getAdapterList() if err !

    wxWidgets 1 | VS2013下搭建wxWidgets 3.0.2开发环境

    Tue, Sep 15, 2015
    转载请注明出处! 原文链接:VS2013下搭建wxWidgets 3.0.2开发环境 准备条件 OS:Win 7 VS:VS2013 wx:wxWidgets 3.0.2 安装 wxWidgets的安装分为两种:一种是直接下载安装包进行安装,另外一种就是下载源码进行编译。 本文将采用源码编译的方式进行安装。 首先下载wxWidgets 3.0.2的源码包,然后解压在任意位置。如:X:\wxWidgets-3.0.2。 然后进入X:\wxWidgets-3.0.2\build\msw路径下找到wx_vc12.sln文件,双击打开。 最后在vs2013的菜单栏里找到生成->批生成选项,点击打开批生成窗口,在窗口里选择要编译生成的工程,并点击窗口右侧的生成按钮进行编译。 如果顺利,在经过几分钟的编译之后,会在X:\wxWidgets-3.0.2\lib\vc_lib文件夹下生成所需的库文件,其中u表示Release版本,ud表示Debug版本。 使用 至此,wxWidgets的开发环境基本上就算搭建完成了,接下来就可以编译源码中的例子来进行深入的学习了。 以X:\wxWidgets-3.0.2\samples\mfc下的工程为例,双击打开目录下的mfc_vc9.vcxproj文件进行工程的迁移工作,完成之后直接进行编译,成功之后就会在X:\wxWidgets-3.0.2\samples\mfc\vc_mswud目录下生成名为mfctest.exe的可执行文件,双击运行就可以看到简单的界面程序了。 注意:这里编译的自带例子可以直接生成,如果要编译其它基于wxWidgets的工程(如OpenPhone)可能会就需要进行一些配置了,具体的配置就自行Google吧。 [ 转载必须在正文中标注并保留原文链接等信息。]

    Rust 1.2.1 | Debug

    Tue, Aug 4, 2015
    转载请注明出处! 译文链接:Rust 1.2.1 | Debug 英文原文:Debug 所有想使用std::fmt格式化traits的类型均需要具有可打印输出的实现。只有在std库中的一些类型自动实现了这个特性。而其它类型就需要手动实现了。 fmt::Debug特性将此工作变得非常直接。所有类型均可以derive(自动创建)fmt::Debug实现。而对于fmt::Display不一定可行,其需要手动实现。 // 此结构体不可以被打印输出,因为其既不具有`fmt::Display`也不具有`fmt::Debug` struct UnPrintable(i32); // `derive`会为具有`fmt::Debug`属性的`struct`自动创建相关实现 #[derive(Debug)] struct DebugPrintable(i32); 所有std库中的类型也都可以通过{:?}自动实现打印输出功能: // 为`Structure`继承`fmt::Debug`实现.`Structure`是只包含了一个`i32`类型成员 #[derive(Debug)] struct Structure(i32); // 将`Structure`放入`Deep`结构体中.也使其具有打印输出功能. #[derive(Debug)] struct Deep(Structure); fn main() { // 使用`{:?}`进行打印与`{}`类似 println!("{:?} months in a year.", 12); println!("{1:?} {0:?} is the {actor:?} name.", "Slater", "Christian", actor="actor's"); // `Structure`是可打印输出的! println!("Now {:?} will print!", Structure(3)); // 使用`derive`的一个问题是对显示结果不可控.如果只想显示一个`7`该怎么办? println!("Now {:?} will print!", Deep(Structure(7))); } 虽然fmt::Debug可以直接实现打印功能,但会损失一些优雅的特性。而通过手动实现fmt::Display是可以解决该问题的。 请参考: attributes, derive, std::fmt, 以及 struct

    Rust 1.2| 格式化输出

    Tue, Jul 28, 2015
    转载请注明出处! 译文链接:Rust 1.2 | 格式化输出 英文原文:Formatted print 打印输出是由一系列的宏来进行处理的,这些宏包含在std::fmt标准库中。其中包含下面三种形式: format!:将格式化的文本写入字符串中 print!:功能与format!相同,但文本是被输出到控制台 println!:功能与print!相同,但会在一行的末尾追加换行符 所有的文本均以相同的形式进行解析。另外一点就是会在编译期检验文本格式的正确性。 fn main() { // 通常情况下,`{}`会自动替换任意参数,并且会将替换的内容字符串化。 println!("{} days", 31); // 此处31未带有后缀,31默认是i32类型。也可以通过添加后缀来改变31的类型。 // 显示的形式是有不同的可选样式的。 // 可以使用位置参数。 println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob"); // 也可以使用命名参数。 println!("{subject} {verb} {predicate}", predicate="over the lazy dog", subject="the quick brown fox", verb="jumps"); // 可以在`:`字符之后指定特殊的格式。 println!("{} of {:b} people know binary, the other half don't", 1, 2); // 编译器甚至会进行检验,以确保使用正确的参数个数。 // 下面的语句编译出错。 println!