图1
图2使用命令在终端输入: dwarfdump ./libXXXX.a | grep 'XXXX'#链接,.a文件位置, 源码目录,工程名
def link(lib_file,target_path,basename)
#查询源码所在位置
dir = (`dwarfdump "#{lib_file}" | grep "AT_comp_dir" | head -1 | cut -d \\" -f2 `)
#创建目录
FileUtils.mkdir_p(dir)
#链接
FileUtils.rm_rf(File.join(dir,basename))
`ln -s #{target_path} #{dir}`
end#通过pod post_integrate集成脚本
post_integrate do |installer|
openStaticLibDebug(installer,"project")
end
def openStaticLibDebug(installer,project)
if !ENV["DEBUGLIB"]
return
end
#脚本目录
path_root = "#{Pathname.new(File.dirname(__FILE__)).realpath}"
#当前项目的pod目录
pod_path = "#{path_root}/#{project}/Pods"
installer.pods_project.targets.each do |target|
bunlde_name = target.name
#这里可以根据环境变量选择性开启源码调试
enableDebug = ENV["#{bunlde_name}_DEBUGLIB"]
enableDebug = true
if enableDebug
DebugLibCode.new().link(lib_file,target_path,basename)
end
end
end
图3
图4对于问题1,开发人员手动cbuilder的用户目录是个不合理的操作,我们把这个操作集成到 ZTPodTool内(ZTPodTool是我们开发的一个podfile管理工具,下面会详细介绍),让ZTPodTool来创建cbuilder用户目录,开发人员就能无感知的开发。但是尝试了各种创建目录的api发现都不能创建这个目录,这个问题困扰了我们好久。 查找了大量资料,发现AppleScript是一个与macOS结合非常紧密的脚本语言,它显著的特点就是可以控制其他macOS上的应用程序,通过使用它可以完成一些繁琐重复的工作。代码如下:NSString *script = @"do shell script \" /bin/mkdir -m 777 /Users/cbuilder\" with administrator privileges";
NSError *errorInfo = nil;
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];
NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&errorInfo];
图5[CoreServices] _LSSchemaConfigureForStore failed with error Error Domain=NSOSStatusErrorDomain
Code=-10817 "(null)" UserInfo={_LSFunction=_LSSchemaConfigureForStore, ExpectedSimulatorHash=
{length = 32, bytes =0x4014b70c 8322afc9 dfb06ed8 13148b48 ... b6adae0d b2637192 }, _LSLine=
405, WrongSimulatorHash={length = 32, bytes = 0x073253e6 9a9b67cc 089d6640 ca4fdb3e ...
46b00d8b bca98999 }}//https://developer.apple.com/forums/thread/682395So far I’ve been ignoring this thread because it started out with folks running Xcode and the simulator under Rosetta. This isn’t a supported configuration and I recommend that you switch to running these natively.However, it’s now clear that multiple folks are hitting this while running Xcode and the simulator natively. Have any of you filed a bug about this? If so, please post your bug number?如果剪切板不能用,在模拟器中输入地址或者长文本,对iOS、RN和H5的开发者都是非常耗时、非常痛苦的事情。为此我们想了一个轻巧的办法,绕过了这个系统bug,完美解决了这个问题,主要流程如下:
图6我们给自己的APP自定了快捷键 Ctrl + V,用于触发用户进行粘贴操作 :- (NSArray<UIKeyCommand *> *)keyCommands {
NSArray *a = [super keyCommands];
if (a) {
NSMutableArray *commands = [NSMutableArray arrayWithArray:a];
[commands addObject:[UIKeyCommand keyCommandWithInput:@"v"
modifierFlags:UIKeyModifierControl
action:@selector(posteboardCommand:)
discoverabilityTitle:@""]];
return commands;
}
return @[
[UIKeyCommand keyCommandWithInput:@"v"
modifierFlags:UIKeyModifierControl
action:@selector(posteboardCommand:)
discoverabilityTitle:@""]
];
}
图7获取当前输入框的代码如下:@interface UIResponder (FirstResponder)
+ (id)currentFirstResponder;
@end
static __weak id currentFirstResponder;
@implementation UIResponder (firstResponder)
+(id)currentFirstResponder {
currentFirstResponder = nil;
[[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil];
return currentFirstResponder;
}
-(void)findFirstResponder:(id)sender {
currentFirstResponder = self;
}
@end
//触发获取剪切板的操作如下:
- (void)posteboardCommand:(UIKeyCommand *)command
{
#if TARGET_IPHONE_SIMULATOR
NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:8123/getPasteboardString"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"GET";
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
NSLog(@"读取出错,请检查服务是否打开");
} else {
NSString *pasteString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
UIResponder* aFirstResponder = [UIResponder currentFirstResponder];
if ([aFirstResponder isKindOfClass:[UITextField class]]) {
[(UITextField *)aFirstResponder setText:pasteString];
} else if ([aFirstResponder isKindOfClass:[UITextView class]]) {
[(UITextView *)aFirstResponder setText:pasteString];
} else {
}
}
});
}];
[task resume];
#endif
}
图8在ZTPodTool上,不仅可以便捷地操作每个组件的源码与二进制切换、打组件包,而且支持打测试包(图9)。
图9开发人员点击install按钮,ZTPodTool就会根据用户的源码设置拼装好命令,然后自动打开显示日志更友好的终端,让终端来执行该命令。虽然通过NSTask和NSPipe也可以执行pod install命令,但是获取到的StandardOutput日志无法高亮,看起来十分痛苦。要是能直接在终端执行,那样对开发者就更友好了,查阅苹果文档后,发现官方没有提供“终端”的SDK供开发者使用,在当时如何通过其他途径唤起终端执行命令成一件必须解决的事情。最终还是靠上文提到AppleScript来解决了这个问题,下面是两种调用AppleScript的方式://方式一
NSTask* task = [[NSTask alloc] init];
task.launchPath = @"/usr/bin/osascript";
task.arguments = @"tell application \"Terminal\" to do script \" pod install --repo-update";
task.currentDirectoryPath = @"/Users/zhangsan/iosWorkSpace";
task.environment = @{
@"LANG":@"zh_CN.UTF-8",
@"PATH":@"/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin:/usr/local/"
};
[task launch];//方式二
NSError *err = nil;
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:@"tell application \"Terminal\" to do script \" pod install --repo-update"];
NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&err];
图10上面的流程无论那种方式打包都要等到组件包打完之后才能打测试包,出测试包的时间取决于打组件包的数量与组件间的依赖关系。有没有办法缩短这一流程呢?我们在本地开发的时候编译很快,到了打测试包的时候却要先打组件包才能打测试包,如果打包机也可以自定义部分源码编译,那么就不用等待组件先编译完成了。这样就直接省去了打组件包的时间,可以更快速的打包。让打包机支持部分源码打包,首先得配置好podfile文件,但是开发者不可能提交podfile的修改,那样的话会造成git冲突。于是我们另辟蹊径,把需要变为源码依赖的组件名作为打包网络请求的部分参数,打包平台在打包的时候将这部分参数写入到环境变量里面,然后修改打包脚本,让其在开始执行pod install前去读取这些参数,如果有需要源码编译的组件,就按照参数去修改podfile,这样一通操作下来就让打包机完美支持了。为了更完善这个功能,我们在开发人员点击打包后,可以选择是否同时打组件包,再结合上面提到打包后自动通知测试人员的功能,现在的流程是这样的(图11):
图11从上面简化的流程可以看出,我们将原有的串行任务改为了可并行执行的任务。经过多次实验对比,排除打包排队情况的干扰,所有组件bundle平均打包时间为203秒,全bundle打测试包时间为367秒,部分源码打包时间为384秒,所以理想环境情况打包效率提升32.6%。很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵