Tag: 目标C

在C,Go和Swift中构建小型跨平台CLI工具

这就是我写一个简单工具的方式。3次,用不同的语言。 本实验 我的目标是编写一个非常简单的命令行工具,该工具可以生成与Google Authenticator兼容的一次性密码。 Google身份验证器使用基于时间的一次性密码算法(TOTP)生成代码。 我不想使用自己的实现,而是想使用现有的TOTP库,因为已经有很多不错的库。 本质上,我要我的工具要做的就是接受一个秘密作为单个输入,然后调用现有的TOTP库生成代码,并将生成的访问代码打印到标准输出中。 我问自己的问题是:假设我想在多个平台(Mac,Windows,Ubuntu)上使用该工具,并且希望 在少数人(不一定是技术人员)(例如同事)中分配工具,哪种编程语言将是最实用/可行/有趣的选择? 当然,您可以从多个角度看待这个问题。 让我们专注于构建和分发工具。 然后,这些是我的“应有”要求: 应该有可能将工具分发为“开箱即用”的单个可执行文件,这意味着用户不必安装运行时,框架,库等依赖项。 使用相同的代码库(但可能使用不同的工具链),应该可以为多个平台生成构建。 语言选择 我想为这个特定的实验创建一个二进制文件,这就是为什么我没有为此特定工具考虑诸如Node.js,Ruby和Python之类的解释语言的原因。 当然,尽管总的来说,这些语言都能为编写跨平台命令行工具提供完全可行的选择。 这些语言还有一个缺点,那就是最终用户需要安装运行时(例如Node.js)。 尽管许多平台都预先安装了常见的运行时,但是用户可能需要安装其他版本。 对于非技术用户而言,这并不总是一件琐碎的任务。 (我知道有一些工具可以将解释后的语言编译为独立的可执行文件,但这有点像在作弊) 。 最后,我的选择是尝试使用C , Go和Swift 。 我决定留在“编程语言舒适区”,因为学习一种新语言不是我实验的一部分。 因此,我没有尝试过(很有用)非常有趣的其他语言,例如Rust ,我将在以后尝试 (随时对您的Rust经验发表评论)。 也许还需要注意:在本实验中,我考虑了C ++的过大杀伤力(或者实际上,我的C ++ 只是缺乏知识)。 我学到的是 C 通常,使用C构建的可执行文件是动态链接的。 这意味着最终用户需要安装依赖项(链接的库)才能运行该工具。 那绝对不是理想的。 有很多解决方法,但是所有这些都有一些缺点: – 静态链接:创建单个二进制文件,其中将包含所有必需的二进制代码。 但是,这要求您使用的所有库(例如TOTP库)都支持静态链接。 绝对不是总是这样。 此外,Apple在Mac OS X上不支持静态链接的二进制文件。 – 将链接的动态库与您的应用程序一起分发 。 这意味着对于每个目标操作系统,您都必须预先构建所有链接的库,请确保可执行文件可以找到这些库(例如,在macOS上更改rpath),并将其与应用程序捆绑在一起。 换句话说,您需要将.dll (Windows) .dylib (macOS)或.so […]

在Swift应用中使用C,C ++和Objective-C框架

在Swift应用中使用C,C ++和Objective-C框架 我在尝试中做了一个演讲!Swift东京今年关于在Swift应用程序中使用C,C ++和Objective-C框架。 演示文稿非常简洁,因此我决定详细记录内容以提供更多信息。 本文的结构将分为: C,C ++,Objective-C和Swift之间的语言连接 如何建立依存关系 为什么选择包装器以及如何编写包装器 C,C ++,Objective-C和Swift之间的语言连接 C到Swift C已经47岁了,Swift是一种新的强大的开源语言,它支持C。尽管它不能编译C代码,但它与C具有直接的互操作性,因此我们可以在Swift中直接使用已编译的C代码。 从C ++到Swift C ++和Swift无法直接交谈,因此需要一些手动的中间阶段,例如C或Objective-C。 C ++是C的超集,它提供了面向对象编程的支持。 由于Swift支持C,一种方法是使用仅C的API公开C ++库,然后Swift应用程序可以直接使用该库。 Objective-C ++可以编译包含C ++和Objective-C组合的源文件。 另一种方法是将C ++库包含在Objective-C框架中,并将其提供给Swift。 从Objective-C到Swift Swift可以与可可和大量现有的Objective-C代码一起使用,因此Objective-C与Swift之间的通信非常简单。 如何建立依存关系 为了能够在项目中使用框架,我们首先需要设置依赖项。 我将一一示范。 C库到Swift应用 AC库通常被编译为静态库,这里的挑战是库不包含接口。 Swift也不会自动读取头文件。 因此,这里有一个问题:C标头不可见。 解决此问题的技巧是使用模块映射。 有关在Swift应用程序中设置C库依赖关系的逐步指南,请阅读我的其他中篇文章。 C ++库到Swift应用 正如我之前提到的,Swift无法直接与C ++对话,因此让我们添加一些手动中间阶段,例如,创建一个包含C ++库的Objective-C框架。 在Objective-C框架内部,我们需要将所有C功能包装到Objective-C中。 为了能够在一个文件中同时编译C和Objective-C,诀窍是使用Objective-C ++。 我们可以通过将.m文件重命名为.mm来实现 。 有关详细的设置,请参阅这篇中等文章。 Swift应用的Objective-C框架 为了能够在快速的应用程序中使用Objective-C框架,设置非常简单。 我们需要将Objective-C框架或项目包含到快速应用程序中。 如果我们不使用任何依赖关系管理工具,则只需将Objective-C xcodeproj或框架拖到swift项目中即可。 然后链接框架并导入Objective-C模块,现在我们完成了。 […]

iOS应用在设备上的启动时间

您是否曾经对测量应用程序的不同技术指标感兴趣? 如构建时间,启动时间,CPU使用率,内存等。因为它们可能会在使用应用程序时引起良好或不良的用户体验。 今天我们将讨论发射时间 。 但是首先……在这里您找不到关于“如何优化发射时间? -这不是本文的主题。 有几种测量发射时间的方法: 使用DYLD_PRINT_STATISTICS标志; 使用xcrun ; 使用Darwin C API手动进行计算。 设置此环境变量可让您分析主时间。 为了优化主阶段前的时间,我建议您观看WWDC关于优化应用程序启动时间的演讲。 不幸的是,您无法手动处理此信息并将其发送到服务器。 好吧,实际上,您可以解析os日志,但这不是一件简单的任务。 而且它不在当前主题范围之内。 但是我们想跟踪实际用户的启动时间。 我们应该怎么做? 使用此开发命令行工具,您可以编写脚本来测量模拟器上的启动时间。 但实际用户也没有。 好吧,我们应该使用Darwin C API。 主要思想:比较系统启动我们的应用程序过程的时间和应用程序可用的时间。 您要做的就是用C编写一些代码。 #include“ LaunchTimeMeasurer.h” #include ; #include ; double processUptime(){ struct timeval currentTime; // 1 struct kinfo_proc processInfo // 2; size_t processInfoSize = sizeof(processInfo)// 3; int mib [] = {CTL_KERN,KERN_PROC,KERN_PROC_PID,getpid()}; […]

在Xcode中设置一个C / C ++ makefile项目:语法高亮,自动完成,跳转到定义等等!

在这篇文章中,我将向您展示如何设置Xcode,以便您可以在C / C ++项目中使用它。 它将允许您使用IDE提供的所有出色功能。 在撰写本文时,我正在使用Xcode 9.2和MacOS High Sierra。 我将以crazyflie 2.0固件项目为例。 它具有一个使用makefiles作为构建系统的C代码库。 第一步:获得构建项目的工具 在这种情况下,crazyflie项目需要用于Arm的GNU嵌入式工具链。 他们提供了许多安装选择(虚拟机,docker,从源代码构建,从ARM下载预编译的二进制文件),但是我发现的最简单的方法是使用此brew公式,该公式从ARM获取最后一个预编译的二进制文件并对其进行配置,因此您唯一需要做的是: $ brew tap osx-cross/arm $ brew install arm-gcc-bin 之后,您可以通过检查版本来验证正确的安装: $ arm-none-eabi-gcc –version arm-none-eabi-gcc(用于Arm嵌入式处理器的GNU工具7-2017-q4-major)7.2.1 20170904(发行版)[ARM / embedded-7-branch版本255204] 版权所有(C)2017自由软件基金会,Inc. 这是免费软件; 请参阅复制条件的来源。 没有保修; 甚至不是出于适销性或针对特定目的的适用性。 第二步:获取项目的源代码 在这种情况下,请获取crazyflie固件的源代码。 因为此特定项目使用git子模块,所以我们还需要传递–recursive参数: git clone-递归https://github.com/bitcraze/crazyflie-firmware.git 之后,该项目将位于名为crazyflie-firmware的文件夹下。 第三步:设置要构建的Xcode项目 首先,通过执行以下操作创建一个新的Xcode项目: 文件->新建->项目 在cross-platform选项卡下,使用External Build System模板。 给它起个名字并完成设置: 然后,转到主要目标的info选项卡,并将“ Directory字段更改为包含crazyflie源代码的目录: crazyflie-firmware 。 还建议传递-j参数以启用多核构建(更快!):在我的情况下,我有2个核,因此我传递-j2参数。 结果是: […]

编程语言的力量将在2018年引起关注

2018年即将来临,如果您是开发人员,您可能会想知道,明年编程语言将如何吸引您!根据GitHub编程语言使用统计,今年排名前列的编程语言与去年相同- C和Javafighting居首位。 事实没有什么令人惊讶的,不是吗? 在此博客中,我们打破了人们的期望并竭尽所能,以理解将在2018年发展壮大的最强大,引人入胜和有希望的编码语言。检查所有方面是否看起来我们的期望将是有趣的一倍,才有效。 我们概述了对编程语言的预测,这些语言将在2018年主导游戏的发展– 的JavaScript JavaScript在这个季节风靡一时。 最近在前端编程世界中发生了如此多的惊人产品。 总而言之,您不能忽略React成为开源JavaScript库的方式。 到现在为止,众所周知的和有效的方言有了更多的区别。 响应几乎可以解决您所付诸的一切。 前端流畅吗? 它就是为此而设计的。 虚拟现实和增强现实? 检查React VR。 多阶段的东西? React Native涵盖了这一点。 另外,现在您甚至可以使用它来克隆Facebook。 TypeScript也上升了。 TypeScript是一种免费的开源编程语言,它是JavaScript的严格语法超集,并向该语言添加了可选的静态类型,可在任何地方运行,适合于构建大型应用程序,此外,它还用于Unity Engine中 。 爪哇 Java技术使您可以在安全的计算环境中工作和娱乐。 Java根据TIOBE索引在编程语言排名中排名第一,它用于创建我们非常喜欢的Android应用程序-Uber, Slack , Tinder , Amazon等。 Java开发功能可用于从基本移动应用程序到游戏和VR应用程序的所有内容。 只要记住要给它足够的内存即可。 ROR(Ruby on Rail) 关于ROR的淡出和Node.js的取代一直存在着积极的争论。 我们说:不! TIOBE指数表明ROR也是相关的。 Ruby在2月份排名第11位,与2016年的排名完全相同。TIOBE会根据全球熟练技术工程师,课程和利用谁使用编程语言的外部商人的数量来选择评估。 ROR很难学习,这是事实,并且Rails开发中的红宝石需要非常精确的方法。 Ruby on Rails是一个基于服务器的Web应用程序框架,在Rails 5发布后,它具有新的Web开发潜力。 Turbolinks 5和ActionCable等功能非常出色。 开发人员现在可以摆脱客户端JS框架,并使用Turbolinks 5从Rails堆栈直接生成单页应用程序。他们还可以通过ActionCable将WebSockets与其他Rails应用程序集成。 这使开发人员能够以与其他Rails应用程序类似的形式和样式在Ruby上实时编写功能,同时保持良好的可伸缩性和流畅的性能。 C# C#是创建平台或VR(虚拟现实)应用程序的不错决定。 它让人联想到Java,使用和编写代码的需求也比JavaScript少。 C#非常适合各种企业应用程序。 […]

如何确定同一iOS设备上对等TCP连接的PID?

由于我不愿意进入的原因(与我无法更改的第三方库的兼容性),我需要使用TCP套接字在iOS中的单个进程中执行IPC。 为了防止其他进程与我的TCP IPC套接字通信,我想通过操作系统validation调用connect() (来自另一个线程)的进程具有与我自己相同的PID。 在操作系统XI上注意到netstat没有这些信息(与其他操作系统,如Windows和Linux不同),我能够确定此信息的唯一方法是使用lsof 。 我不确定iOS沙箱中可用的是什么,但到目前为止,似乎我最好的选择(尽管看起来很昂贵)是要弄清楚lsof正在做什么并尝试复制它。 有谁知道我可以使用系统调用来检查这个? 我已经阅读过getsockopt(2)并且没有看到任何适用的内容,我找不到有关支持ioctl(2)调用的文档。 这可能是什么?

GLKit的GLKMatrix“专栏”如何?

前提A. 当在线性存储器中讨论“列主要”矩阵时,一个接一个地指定列,使得存储器中的前4个条目对应于矩阵中的第一列。 另一方面,“行主要”矩阵被理解为一个接一个地指定行,使得存储器中的前4个条目指定矩阵的第一行。 GLKMatrix4看起来像这样: union _GLKMatrix4 { struct { float m00, m01, m02, m03; float m10, m11, m12, m13; float m20, m21, m22, m23; float m30, m31, m32, m33; }; float m[16]; } typedef union _GLKMatrix4 GLKMatrix4; 关于m成员的文档说: 按列顺序排列的矩阵元素的一维数组。 前提B GLKMatrix4中的“行”是一组4个水平声明的浮点数( [m00, m01, m02, m03]将是第一个“行”)。 因此,这些条目可以解释为mRowCol( m12将是第1行第2列的条目)。 如果我们根据声明的顺序查看这些GLKMatrix结构成员的布局,我们会看到: [m00, m01, m02, m03, m10, m11, m12, […]

文件是为i386构建的,而不是在Mac OSX 10.6上为iOS 4.2编译OpenCV2.2时所链接的架构(x86_64)

我一直在关注http://www.atinfinity.info/wiki/index.php?OpenCV/Using%20OpenCV%202.2%20on%20iOS%20SDK%204.2的简单指南(使用旧的指南我也读过在http://niw.at/articles/2009/03/14/using-opencv-on-iphone/en )将OpenCV2.2编译为在iOS 4.2上运行。 一切顺利,直到我试图建立。 当我运行以下内容时: lc:opencv_simulator leonard$ ../opencv_cmake.sh Simulator ../../OpenCV-2.2.0/ 我收到以下错误: ld: warning: in /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/usr/lib/libSystem.dylib, file was built for i386 which is not the architecture being linked (x86_64) 这是使用(显然在其他设置中): -D CMAKE_OSX_ARCHITECTURES=”i386″ 我在OSX 10.6上看到i386被视为默认值,因此它使用系统默认值(但这是x86_64)。 我也读过我可以使用: export CFLAGS=-m32 export CPPFLAGS=-m32 但这也不起作用。 有任何想法吗?

访问另一个类中的一个类的数据variables

在任何人提出有关xxxx问题的类似或重复问题之前,我已经检查了27个问题,至今没有人能够明确和帮助我,最有可能的是没有人以最简单的forms发布这个问题。 所以我有一个在我存储一些数据的1类NSstring。 ##Class 1 .h @property ….. NSString *str; .m -(void) someMethod { self.str = @"Blah blah"; } 现在我想通过类2中的属性“str”访问这个“Blah Blah”数据,而不通过任何方法或类似的方法传递它。 我只是需要访问它的地方(例如让我们说viewDidLoad)。 什么是最简单的方法? PS:我正在考虑在appdelagate.m中创build一个* tempStringvariables,并通过创build一个AppleDelegate * apdg对象并访问它来在w / e类中访问它。 任何其他的想法?

如何在我自己的应用程序中将图像设置为ios7中locking屏幕的壁纸?

我正在build立一个相册应用程序。 我想在我自己的应用程序中设置一张照片作为壁纸。 有没有一些方法可以做到这一点? 更新:我知道已经有一些类似的问题发布。 但他们没时间了。 所以我想知道在iOS7中是否有一些方法来实现。