轩辕十四

探索科技与创新的个人博客

由于网络问题,我们在使用 Xcode SPM 管理项目依赖库的时候,clone依赖库那速度真的是拉的一泻千里💩。所以我们需要将 SPM 下载依赖库的过程交给我们的代理去处理。首先你需要一个科学上网工具,无论是客户端还是路由器刷机,此文章的例子都是基于本人网络环境 Surge,其他的代理方式需自行研究。

阅读全文 »

指针简介

指针?什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量(或数据对象)。正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。在 C 语言中,指针有许多用法。本章将介绍如何把指针作为函数参数使用,以及为何要这样用。

假设一个指针变量名是ptr,可以编写如下语句:

1
ptr = &pooh; // 把 pooh 的地址赋给 ptr

对于这条语句,我们说ptr“指向”poohptr&pooh的区别是ptr是变量,而&pooh是常量。或者,ptr是可修改的左值,而&pooh是右值。还可以把ptr指向别处:

1
ptr = &bah; // 把 ptr 指向 bah,而不是 pooh

现在ptr的值是bah的地址。

要创建指针变量,先要声明指针变量的类型。假设想把ptr声明为储存int类型变量地址的指针,就要使用下面介绍的新运算符。

阅读全文 »

C 有一系列专门处理字符的函数,ctype.h 头文件包含了这些函数的原型。这些函数接受一个字符作为参数,如果该字符属于某特殊的类别,就返回一个非零值(真);否则,返回口(假)。例如,如果 isalpha() 函数的参数是一个字母,则返回一个非零值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// cypher2.c -- 替换输入的字母,非字母字符保持不变
#include <stdio.h>
#include <ctype.h> // 包含isalpha()的函数原型
int main (void) {
char ch;
while ((ch = getchar()) != '\n') {
if (isalpha(ch)) // 如果是一个宇字符,
putchar(ch + 1); // 显示该字符的下一个字符
else // 否则,
putchar(ch); // 原样显示
}
putchar(ch); // 显示换行符
return 0;
}
阅读全文 »

在 C 语言中,一直用 int 类型的变量表示 真/假 值。C99 专门针对这种类型的变量新增了 _Bool 类型。该类型是以英国数学家 George Boole 的名字命名的,他开发了用代数表示逻辑和解决逻辑问题。在编程中,表示真或假的变量被称为布尔变量(Boolean variable),所以日 _Bool 是 C 语言中布尔变量的类型名。_Bool 类型的变量只能储存 1(真)0(假)。如果把其他非零数值赋给 _Bool 类型的变量,该变量会被设置为 1。这反映了 C 把所有的非零值都视为真

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h> // 提供strlen()函数的原型
#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)
int main () {
float weight, volume;
int size, letters;
char name [40]; // name 是一个可容纳40个宇符的数组

printf("Hi! What's your first name?\n");
scanf("%s", name);
printf("%s, what's your weight in pounds?\n", name);
scanf("%f", &weight);
size = sizeof name;
letters = strlen(name);
volume = weight / DENSITY;
printf("Well, %s, your volume is %2.2f cubic feet. \n", name, volume);
printf("Also, your first name has %d letters, \n", letters);
printf("and we have %d bytes to store it. \n", size);
return 0;
}
阅读全文 »

目标代码文件、可执行文件和库

C 编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。

典型的 C 实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C 使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。

中间文件有多种形式。我们在这里描述的是最普遍的一种形式,即把源代码转专换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代码,这还不是一个完整的程序。

目标代码文件缺失启动代码(startup code)。启动代码充当着程序和操作系统之间的接口。例如,可以在 MS WindowsLinux 系统下运行 1BM PC 兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是 WindowsLinux 所需的启动代码不同,因为这些系统处理程序的方式不同。

阅读全文 »

如下,输入一个数组和一个目标变量:

input: [1, 3, 1, 3, 2, 2, 5, -1]

input: 4

要求找到此数组中所有两数之和等于目标变量的元素集合并返回,并且结果中不能有重复项。

阅读全文 »

我们都知道有的程序员能创造 10 倍的价值,那么我们是吗?

根据 20 世纪 60 年代进行的一份研究,对开发人员的各种方面(如代码简单性、程序大小、调试技巧、程序执行等)进行了比较。根据这项研究,普遍的共识是,一个优秀的开发人员和一个差劲的开发人员之间的差异可以达到20 倍之多,而中间值在大多数情况下是 10 倍。

这就是说,假设你已经苦干了多年,吸收了所有可能的技术,最终达到了令人垂涎的 10 倍高级开发人员级别。太棒了,恭喜!你应该得到名望和随之而来的尊重。现在你想攀登下一座山:成为一名优秀的技术经理。想想就觉得很美。

等等,让我们花点时间想想。

阅读全文 »

截图清晰度

截图处理

由于笔记截图需要缩放以适应预览视图,所以截图时会出现不清晰的问题。故我们需要用笔记截图的原数据进行渲染绘制。

我们将预览视图分为四大块儿进行处理,分别为,header,note,footer,user info,因为 header 和 footer 只有在设置主题的情况下才可能存在,所以需要将 header,footer 和 user info 分别处理。如下图:

阅读全文 »

在许多方面,苹果的故事都是一些有趣的历史偶然事件将技术融合在一起,创造出比以前更好的东西:OS X 是 MacOS 与 NeXTSTEP 的结合。OC 是 Smalltalk 类面向对象编程与 C 的结合。iCloud 则是苹果移动服务与云平台的结合。

虽然苹果技术栈的许多方面都是如此,但是不得不说苹果技术中的进程通讯走的是“反人类”的道路。

由于不是根据每个节点上最优原则进行设计,苹果的进程间通信解决方案更显得混乱扎堆。结果是,大量重叠,不兼容的 IPC 技术在各个抽象层随处可见。(除了 GCD 还有剪贴板)

  • Mach Ports
  • Distributed Notifications
  • Distributed Objects
  • AppleEvents & AppleScript
  • Pasteboard
  • XPC

从低级内核抽象到高级,面向对象的 API,它们都有各自特殊的表现以及安全特性。但是基础层面来看,它们都是从不同上下文段传递或者获取数据的机制。

阅读全文 »
0%