现代 C99, C11 标准下的 C 语言编程 一、摘要 一直以来,我们所学习的 C 语言大多是 ANSI-C 标准,也就是后来被标准化的 C89 标准。在 1999 年发布的 C99 和 2011 年发布的 C11 标准在此之上,引入了许多新的特性,也解决了许多问题。因此,随着标准的发布,我们的 C 语言规范和写法也要发生相应的变化。 C++ 同样也发布了 C++99,C++11,C++14 甚至 C++17 规范。从变化上看,C++11 规范之后的 C++ 语言已经焕然一新,引入了大量非常现代化的特性。C 语言规范的最大的变化则发生在 C99 规范之中。其后的 C11 虽然也有一些特性,但更多的算是为了于 C++ 同步而引入的新特性。 目前的 GCC 和 Clang 编译器都已经完整支持 C99 和 C11 的特性,默认都是支持 C11 规范。如果需要显式指定的时候,则在编译时加入 -std=c99 或者 -std=c11 即可。 本文将介绍这两个协议下带来的新特性,和我们新的编码习惯的变化。 二、新的基本数据类型规范 在 C99 规范中,有着大量对于新的数据类型的定义和补充。这是非常有必要的,原先的 int,long 等变量基本类型在不同架构的机器上,会有不同的长度,往往会导致不可预期的问题。64 位数值、布尔类型和复数类型的缺失、以及 Unicode 的缺失也阻碍了 C 语言在现代的进一步发展。因此,C99 类型中带来了大量编码类型的变化。 2.1 数值类型 我们经常因为数据类型在不同架构机器上的不同表现,而感到困扰。因此在 C99 规范中,引入了标准的固定长度数据类型的规范,并且引入了 64 位数据类型的支持。在 32 位机器上,你可能需要使用 long long 来建立一个 64 位的数据类型。而在 64 位机器上,long 即表示 64 位数据类型。
Read more

Atom 的第一次尝试

09.04.2019  in atom , editor

Atom 的第一次尝试 对于我来说,折腾已经成为了一种习惯了。耐不住性子的我常常会去折腾各种新的东西,编辑器、系统、浏览器这些我都会经常去尝试,去找到哪一款自己最喜爱的和效率最高的产品。 我个人对于编辑器的要求还是很高的,要能够敏捷、好用,还得长得好看。也尝试过主流的各种编辑器,比如 VsCode,Vim 以及 emacs。在我的潜意识里,我非常喜欢 Emacs 的快捷键,特别是光标移动的部分: alt 代表单词,ctrl 代表字符,PNBF 代表上下左右,非常清晰。但是我又希望能够减少我配置的压力,要能够开箱即用,还要有较强的功能。因此,Vim 和 Emacs 这类需要进行配置的环境对我来说其实不够优雅。我希望能够尽可能使用默认的配置,而不过多的进行配置修改,快捷键也是如此。(因为能够保证多平台的一致性)。 其实 Visual Studio Code 确实挺符合这个标准,我也一直拿它作为我的主要编辑器,写过 go,写过 javascript,也写过 python 和 C。VsCode 其实真的非常强大,编译、调试、代码托管、项目管理,这些功能齐全而且非常好用。此外还有异常丰富的插件系统。对于我个人来说,除非是大型项目,一般很少用 PyCharm 之类的 IDE。 现在我遇到了 Atom,我不敢保证我会一直使用这个编辑器(毕竟被吐槽性能差,让我非常顾虑),但是我会尽力去使用它。因为,它的默认快捷键非常符合我的预想,而且界面咸现代且好看。它的光标移动的快捷键和 Emacs 基本一致,我可以非常迅速的进行光标的移动。此外还有与 VsCode 类似的多光标,搜索、替换等等操作方式。原生的 Git 和 Github 支持也非常好用。 确实,使用快捷键可以方便的定位文件、函数,也可以方便的进行窗口的管理。对于我个人来说,这一套快捷键还是比较符合我的预期和使用习惯的。手不离开键盘,就能完成文本的编辑。(这一篇文章就是在 Atom 中便捷的)。 界面美观也是一个非常重要的因素,一直以来我都是使用 VsCode 的 Light+ 主题,换成 Atom 之后,我发现 One Dark 的配色和代码高亮也非常美观。 目前初步测试了代码补全的功能。Python 和 C 的支持都还算不错,应该问题不大。而让我有所顾虑的就是广为诟病的性能问题,实测内存占用至少是 VsCode 的 1.5 倍, 目前还没有遇到卡顿的现象,还需要进一步在使用中测试。 此外,代码调试和编译的功能是缺失的,或者需要第三方插件,这个对于我问题不大,我个人的编码习惯是习惯使用命令行编译和调试。反而对这一部分需求不大。 希望 Atom 能够让我的编码体验更加优秀吧。虽然 Github 已经被微软收购了,但是我还是希望它能够越来越好吧。
Read more


Windows Server Core 管理与 PowerShell 笔记(九)———— PowerShell 面向对象脚本语言 前面的几篇文章都是使用 PowerShell 作为主要交互脚本。在这些命令的使用过程中,已经初步体验到了面向对象的脚本语言于传统的基于文本的脚本语言的区别。这篇文章中将综合介绍 PowerShell 的一些知识和面对对象的部分。 一、 变量、环境变量 1.1 基本用法 变量全部以 $ 开头,用等号赋值。没有特殊的声明语句。例如: PS C:\Windows\system32> $a = 1 PS C:\Windows\system32> $b = "Hello,World" PS C:\Windows\system32> $a 1 PS C:\Windows\system32> $b Hello,World 所有的变量全部存储在 Variable: 驱动器中。因此我们可以使用于导航文件目录一样的命令来管理变量。比如: PS Variable:\> Test-Path Variable:a # 查找变量是否存在 True PS Variable:\> Remove-Item Variable:b # 删除变量 1.2 PowerShell 自动化变量 下面这些变量在命令运行的过程中自动赋值: \$\$ 上一个命令最后一个参数 $^ 上一个命令第一个参数 $? 上一个命令执行结果 $Error 错误数组 $Home 家目录 $Host 当前主机对象 $PID 当前进程ID $Profile 当前配置文件位置 等等
Read more


Windows Server Core 管理与 PowerShell 笔记(八)———— 计算机管理(进程、服务、日志) 在 Windows Server Core 中,可以按住 Ctrl+Alt+Delete 来打开任务管理器,因此可以图形化的管理进程和服务。在 PowerShell 下也有非常良好的接口用于配置进程运行、服务运行和日志等。本文所介绍的绝大部分命令都是来自 Microsoft.PowerShell.Management 模块之中。在这个模块中,还有其他诸如查看计算机信息、设置市区、关机、重启、加入域、退出域等功能。 一、计算机信息查询(Get-ComputerInfo) 我们通常需要有一个命令来查询计算机的软硬件信息,包括内存、CPU、OS 等相关信息。PowerShell 提供了一个 Get-ComputerInfo 命令来查询这些基本信息。但是这个命令输出的条目过多,往往不能够很好的找到我们所需要的信息。因此需要在这个命令的基础上加以筛选来现实我们所需要的系统信息: Get-ComputerInfo *process* # 获取处理器信息 Get-ComputerInfo *memory* # 获取内存用量信息 Get-ComputerInfo *OS* # 获取操作系统信息 Get-ComputerInfo *Bios* # BIOS 信息 Get-ComputerInfo *Timezone* # 时区 Get-COmputerInfo *Domain* # 加入的域名 PowerShell 支持完整的正则表达式支持,因此可以灵活地设置匹配字符串。 二、进程管理 Windows Server Core 中保留了任务管理器,在使用远程登录的情况下,是无需使用这些命令来进行进程管理的。但是有时候,我们使用 ssh 或远程连接 PowerShell 时,我们只有一个 Powershell 终端。此时,就需要我们使用命令行来进行管理。 Get-Process 可以用来获取当前的所有进程对象。在此基础上,我们可以加以搜索或者筛选,以此来查看我们所需要的进程对象: PS C:\Windows\system32> Get-Process explorer Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 1531 58 31076 99056 3.
Read more


Understanding Open Ports in Android Applications: Discovery, Diagnosis, and Security Assessment 作者:Daoyuan Wu, Debin Gao, Rocky K. C. Chang, En He, Eric K. T. Cheng, and Robert H. Deng 收录会议: Network and Distributed Systems Security (NDSS) Symposium 2019 一、摘要 文章主要完成了如下几件事: 对 136 个国家的三千多 Android 设备进行测量。对流行应用和 Built-in 应用进行测量。 对这些数据进行聚合和诊断。 完成了三项安全评估: vulnerability analysis revealing five vulnerability patterns in open ports of popular apps inter-device connectivity measurement in 224 cellular networks and 2,181 WiFi networks through crowdsourced network scans experimental demonstration of effective denial-of-service attacks against mobile open ports 之前已有的工作是发现了移动设备也有开放的端口,以及对特定应用程序使用开放端口的测试(截屏软件、文件分享软件等),但是这些工作只在局部给出了结论,而缺少对于 Open Ports in Android Application 这一个问题的宏观结果。
Read more


Windows Server Core 管理与 PowerShell 笔记(七)———— 防火墙与网络安全 这篇文章主要介绍 Windows 网络安全的相关知识。Windows Server 的工作核心是提供网络服务,因此不可避免的会有遭受攻击的风险。从这个角度说,Windows 的网络安全也是 Windows 安全的重要组成部分。 PowerShell 的 NetSecurity 模块提供了关于网络安全相关的命令,可以使得我们较为方便的对 Windows 的网络安全加以维护。在 NetSecurity 模块中,主要分为两部分指令。一部分是防火墙配置的相关指令。这些指令提供了对 Windows 防火墙不同细粒度的操作。另外一部分是 IPSec 协议的具体实现。IPSec 是一个 TCP/IP 网络层的安全协议,提供了加密、认证等功能。 由于篇幅原因。本文只介绍 Windows 防火墙有关的最基础指令,使用这些指令可以完成绝大部分的防火墙配置工作。更加高级的指令和 IPSec 相关指令暂且不介绍,如有需要可以具体查阅文档。 一、 Windows 防火墙概述 在 Windows Server 防火墙之中,预先定义了多种配置文件适用于不同的网络环境之下。主要有一下几种: Domain 域环境。当计算机加入某一个特定域的时候,其防火墙边界扩展到域的边界。而对域内计算机信任程度较高。开启网络发现和文件共享服务。 Private 专有网路。当计算机处在某一个局域网(主要用于家庭和工作网络时),对于该网络中的设备比较信任。此时,开启网络发现和文件共享服务。 Public 公共网络。此时计算机处在公网之上。因此具有最严格的防火墙策略。此时文件共享和发现服务对外不可见。 Windows 防火墙由多组规则(Rule)所定义。每一个规则都可以设置规则名称、端口、方向、用户、IP、接口、应用程序、服务等属性。多个规则聚合成一些规则组,便于管理。每一个规则都可以设置成“允许”或者“拒绝”。 对于网络流量包,有默认三种处理方式:“全部允许”、“拒绝与规则不匹配的”以及“全部拒绝”三种默认动作。其中使用“拒绝与规则不匹配的”的策略时候,需要经过上面这些 Filter 进行过滤。只有留下的数据包才能够进入安全区。 二、Windows 防火墙配置文件设置 我们使用 Get-NetFirewallPrfile 命令来查看当前计算机的防火墙配置文件,以及配置文件中的属性。下面的例子可以看到防火墙的三组策略,并且全部开启。 PS C:\Windows\system32> Get-NetFirewallProfile | Format-Table Name,Enabled Name Enabled ---- ------- Domain True Private True Public True 使用 Set-NetFirewallProfile 来设置防火墙配置属性(主要是是否开启、默认动作等)。例如:
Read more


Windows Server Core 管理与 PowerShell 笔记(六)———— 文件共享 一、SMB/CIFS 协议 Windows 使用 SMB/CIFS 协议来承载文件共享和打印机共享等网络共享服务。这一部分文章就将开始介绍 Windows 的文件共享相关知识和架构。主要包括文件共享设置、共享文件等权限设置、如何挂载网络驱动器等。 在 PowerShell 中,SMBShare 模块中的 Comlet 用来配置 SMB 共享,本文也将介绍该模块中的一些最常用的指令。 此外 Windows 还有网络文件系统(NFS)的相关指令。 二、管理 SMB 客户端和服务器端配置 在 PowerShell 中,主要使用 Get-SmbClientConfiguration 和 Set-SmbClientConfiguration 两个指令来读取和写入 SMB 客户端的配置信息。主要配置包括缓存寿命、超时时间等。通常情况下,这些配置不需要怎么改动。 同样使用 Get-SmbServerConfiguration 和 Set-SmbServerConfiguration 来读取和修改服务器端的配置信息。通常也按需修改即可。 三、管理文件共享 Get-SmbShare 和 Set-SmbShare 这一对指令可以用来查看和修改当前系统中的文件共享。 PS C:\Users\ertuil> Get-SmbShare Name ScopeName Path Description ---- --------- ---- ----------- ADMIN$ * C:\Windows 远程管理 C$ * C:\ 默认共享 E$ * E:\ 默认共享 ertuil * C:\Users\ertuil IPC$ * 远程 IPC PS C:\Windows\system32> Set-SmbShare -Name 'ertuil' -EncryptData $True 确认 是否确实要执行此操作?
Read more


Windows Server Core 管理与 PowerShell 笔记(五)———— 磁盘管理 在这一部分,我们将会介绍 PowerShell 如何管理磁盘以及如何设置文件网络共享。磁盘管理是系统管理中非常重要的一部分。 本部分文章不包括分布式文件系统(DFS)。 一、磁盘管理 1.1 Windows Server 磁盘模型 Windows 使用了最多四层结构来构建磁盘模型和文件系统。这个模型非常类似于 Linux 的 lvm 的概念。五层结构是: PhysicalDisk 物理磁盘:表征一个具有物理实体的磁盘对象。 StoragePool 存储池:可以将多个物理磁盘聚合成一个大的存储池。 VirtualDIsk 虚拟磁盘:在存储池中,可以分割成多个虚拟磁盘。可以指定多种 raid 级别。 Partition 分区。可以在物理磁盘和虚拟磁盘的基础上,划分多个分区并格式化成各种文件格式。 Volume 卷。在分区中安装文件系统构成卷。 1.2 通用磁盘管理命令 命令 Get-Disk 将会列出所有的物理磁盘和虚拟磁盘。而 Get-PhysicalDisk 将只列出所有的物理磁盘。 PS C:\Users\ertuil> Get-Disk Number Friendly Name Serial Number HealthStatus OperationalStatus Total Size Partition Style ------ ------------- ------------- ------------ ----------------- ---------- ---------- 2 VMware Vir... VMWare NVME-0000 Healthy Online 60 GB GPT 0 VMware Vir.
Read more


Windows Server Core 管理与 PowerShell 笔记(四)———— 本地访问控制 在上一篇文章中,我们介绍了关于 Windows 用户和用户组的相关操作。Windows 中最常用的登陆方式,就是基于用户口令的身份鉴别机制。 在本文中,我们将会进一步介绍 Windows 的访问控制策略。其中主要包括对于文件和其他各种系统资源的权限控制。 一、Windows 的文件访问权限策略 1.1 安全标识符(SID) Windows 对于所有的主体(包括用户、组、计算机等)都分配一个安全标识符,这类似于 Linux 中的 uid, gid, pid 等相关概念。 每一个安全标识符都对应了一个安全主体。 Windows 的 SID 由字母 S 开头,而后紧跟多个数字。分别代表了修订级别、颁发机构、子颁发机构、其余颁发机构以及相对标识符构成。 1.2 NTFS 文件权限 NTFS 和 ReFS 的文件权限基本类似,主要分为标准访问权限和特殊访问权限。简单的来说,标注访问权限的细粒度较粗,是多个特殊访问权限的结合, 在一般情况下使用标准访问权限就能够很好的对文件进行访问控制。特殊访问权限的划分非常细致,当有特殊需求的时候,可以使用特殊访问权限加以控制。 由于篇幅原因,我们只重点记录标准访问权限。 在 Windows 中,对于文件的标准访问控制权限主要有以下五种: 读取:读取文件内容、属性、扩展属性、权限。 写入:写入或者附加内容,写入属性和扩展属性。 读取和执行:比写入多了执行文件权限。 修改:除了读取、写入、执行权限之外,还能够删除该文件。 完全控制:上述所有权限,外加修改权限和获得所有权。 对于文件夹的标准访问控制权限主要有一下六种: 读取:列出该文件夹、读取属性、扩展属性以及权限。 写入:在文件夹内创建新的文件和文件夹,写入属性和扩展属性。 列出文件夹内容:比读取多一个列出该文件夹中内容的权限。 读取和执行:具有的权限与“列出文件夹内容”权限一样。但是在继承时有区别,所有文件夹都能继承该属性,而只有子文件夹才能继承“列出文件夹内容”属性。 修改:具有读取和写入的权限,外加删除该文件夹的权限。(但是没有删除子文件夹和文件的权限) 完全控制: 具有上述所有权限以及删除子文件夹、文件,更改权限、获得所有权。 1.3 文件权限的运算规则 权限最小化原则:尽量给用户分配最小的权限,而不分配过多权限。 累加原则:将用户以及用户所在的所用组的权限叠加,作为用户的权限。 拒绝有限:当用户某一个组具有拒绝权限时,则直接拒绝该权限。 继承原则:一个文件夹中的权限默认继承自该文件夹。当然,我们也可以设置权限不继承。注意之前有提到文件夹继承的特殊性。 另外,当使用 SMB 分享文件时,文件同时具有分享权限和NTFS权限。此时对权限取交集。
Read more


Windows Server Core 管理与 PowerShell 笔记(三)———— 用户、组 本文将介绍 Windows 等用户和组管理,以及基于访问控制列表(ACL)提供的 Windows 基本访问控制机制。这里的内容其实已经在《计算机安全》的 “Windows 安全” 专题中有过一定的介绍。因此本文将从实用的角度介绍访问控制机制是如何作用的。 本文介绍的是本地的用户和组访问控制。基于活动目录(Active Directory)域控的强制访问控制,将会在 AD 章节专门介绍。 一、Windows 本地用户、本地组 与 Linux 类似,Windows 的访问控制主体主要是用户,并且具有组这一个中间层结构。此外基于访问控制列表(Access Control List)和特殊访问权限的机制,使得 Windows 可以实现比 Linux 更高细粒度的访问权限控制。 1.1 查看本地用户和组 Winodws 本地用户的相关信息,是存在与本地安全账户数据库(SAM)之中的,由此实现对登陆实体身份对鉴别。我们可以使用 Get-LocalUser 命令来查询本地用户信息: PS C:\Users\ertuil> Get-LocalUser Name Enabled Description ---- ------- ----------- Administrator True 管理计算机(域)的内置帐户 DefaultAccount False 系统管理的用户帐户。 ertuil True Guest False 供来宾访问计算机或访问域的内置帐户 WDAGUtilityAccount False 系统为 Windows Defender 应用程序防护方案管理和使用的用户帐户。 在 Windows Server 2019 之中,对外可见对用户主要有如下账户。
Read more