首页 文章 精选 留言 我的

精选列表

搜索[飞行模拟],共10000篇文章
优秀的个人博客,低调大师

04.Eclipse下Ndk开发(以文件拆分合并为例模拟一下开发过程,参考文件加密的过程)

(创建于2017/12/6) 1.工具类PatchUtils package com.ren.ndk_file_patch; public class PatchUtils { static{ System.loadLibrary("ndk_file_patch"); } public native static void diff(String path,String path_pattern,int count); public native static void patch(String path_pattern,String merge_path,int count); } 2.生成的头文件 com_ren_ndk_file_patch_PatchUtils.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_ren_ndk_file_patch_PatchUtils */ #ifndef _Included_com_ren_ndk_file_patch_PatchUtils #define _Included_com_ren_ndk_file_patch_PatchUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_ren_ndk_file_patch_PatchUtils * Method: diff * Signature: (Ljava/lang/String;Ljava/lang/String;I)V */ JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_diff (JNIEnv *, jclass, jstring, jstring, jint); /* * Class: com_ren_ndk_file_patch_PatchUtils * Method: patch * Signature: (Ljava/lang/String;Ljava/lang/String;I)V */ JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_patch (JNIEnv *, jclass, jstring, jstring, jint); #ifdef __cplusplus } #endif #endif 3.编写的c文件 ndk_file_patch.c #include "com_ren_ndk_file_patch_PatchUtils.h" #include <jni.h> #include <stdio.h> #include <stdlib.h> #include<android/log.h> #define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"renzhenming",FORMAT,__VA_ARGS__); #define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR),"renzhenming",FORMAT,__VA_ARGS__); long get_file_size(const char *path){ FILE *fl = fopen(path,"rb"); //把与fp有关的文件位置指针放到一个指定位置。 //文件指针定位到文件末尾,偏移0个字节 fseek(fl,0,SEEK_END); //函数用来获取文件读写指针的当前位置,对于二进制文件,则返回从文件开头到结尾的字节数。 return ftell(fl); } JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_diff (JNIEnv *env, jclass jclz, jstring path_jstr, jstring path_pattern_jstr, jint file_num){ //转换文件路径 const char *path = (*env)->GetStringUTFChars(env,path_jstr,NULL); const char *path_pattern = (*env)->GetStringUTFChars(env,path_pattern_jstr,NULL); //得到分割之后的所有文件路径 //申请一段连续的内存空间(一个数组)保存所有分割的文件地址 char **patches = malloc(sizeof(char*)*file_num); int i = 0; for(;i<file_num;i++){ patches[i]=malloc(sizeof(char)*100); //元素赋值 //需要分割的文件:C://jason/liuyan.png //子文件:C://jason/liuyan_%d.png(path_pattern的格式) sprintf(patches[i],path_pattern,(i+1)); LOGI("patch path:%s",patches[i]); } //不断读取path文件,循环写入file_num个文件中 // 整除 // 文件大小:90,分成9个文件,每个文件10 // 不整除 // 文件大小:110,分成9个文件, // 前(9-1)个文件为(110/(9-1))=13 // 最后一个文件(110%(9-1))=6 //获取文件大小 int file_size = get_file_size(path); //打开这个文件 FILE *fpr = fopen(path,"rb"); //整除 if(file_size % file_num == 0){ //单个文件大小 int part = file_size/file_num; int i =0; //逐一写入设置好的子文件路径中 for(;i<file_num;i++){ //从子文件路径打开一个FILE FILE *fpw = fopen(patches[i],"wb"); int j = 0; for(;j<part;j++){ //边读边写 //fgetc函数功能:从流中读取字符,即从fp所指定的文件中取得下一个字符。这里需要注意,在每取完一个字符时fp会自动向下移动一个字节。这样编成时,程序员就不用再对fp //控制了。这种功能在许多读写函数中都有体现。 fputc(fgetc(fpr),fpw); } fclose(fpw); } }else{ //无法整除 int part = file_size/(file_num-1); int i = 0; for(;i<file_num-1;i++){ FILE *fpw = fopen(patches[i],"wb"); int j=0; for(;j<part;j++){ fputc(fgetc(fpr),fpw); } fclose(fpw); } //最后一个子文件 FILE *fpw = fopen(patches[file_num-1],"wb"); i = 0; for(;i<file_size%(file_num-1);i++){ fputc(fgetc(fpr),fpw); } fclose(fpw); } //释放 i = 0; for(;i<file_num;i++){ free(patches[i]); } free(patches); (*env)->ReleaseStringUTFChars(env,path_jstr,path); (*env)->ReleaseStringUTFChars(env,path_pattern_jstr,path_pattern); } /* * Class: com_ren_ndk_file_patch_PatchUtils * Method: patch * Signature: (Ljava/lang/String;Ljava/lang/String;I)V */ JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_patch (JNIEnv *env, jclass jclz, jstring path_pattern_jstr, jstring merge_path_jstr, jint file_num){ //字符串转换 const char *merge_path = (*env)->GetStringUTFChars(env,merge_path_jstr,NULL); const char *path_pattern = (*env)->GetStringUTFChars(env,path_pattern_jstr,NULL); //得到分割后的子文件路径列表 char **patches = malloc(sizeof(char*)*file_num); int i = 0; for(;i<file_num;i++){ patches[i]=malloc(sizeof(char)*100); //元素赋值 //需要分割的文件:C://jason/liuyan.png //子文件:C://jason/liuyan_%d.png sprintf(patches[i],path_pattern,i+1); LOGI("patch path:%s",patches[i]); } //打开要merge_path为一个FILE FILE *fpw = fopen(merge_path,"wb"); //把所有分割的文件读取一遍,写入到这个总的文件中 i = 0; for(;i<file_num;i++){ //得到每个子文件的大小 int file_size = get_file_size(patches[i]); //打开每个子文件路径为一个FILE FILE *fpr = fopen(patches[i],"rb"); int j =0; for(;j<file_size;j++){ fputc(fgetc(fpr),fpw); } fclose(fpr); } fclose(fpw); //释放内存 i = 0; for(;i<file_num;i++){ free(patches[i]); } free(patches); (*env)->ReleaseStringUTFChars(env,merge_path_jstr,merge_path); (*env)->ReleaseStringUTFChars(env,path_pattern_jstr,path_pattern); } 4.Android.mk文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ndk_file_patch LOCAL_SRC_FILES := ndk_file_patch.c LOCAL_LDLIBS := -llog //使用了log,需要引入 include $(BUILD_SHARED_LIBRARY) 5.开始拆分合并 public class MainActivity extends Activity { private String SD_CARD_PATH; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SD_CARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath(); } public void diff(View view){ String path = SD_CARD_PATH +File.separatorChar+ "2.mp4"; String path_pattern = SD_CARD_PATH +File.separatorChar+ "2_%d.mp4"; PatchUtils.diff(path, path_pattern, 2); System.out.println("拆分完成"); } public void patch(View view){ String merge_path = SD_CARD_PATH +File.separatorChar+ "2_new.mp4"; String path_pattern = SD_CARD_PATH +File.separatorChar+ "2_%d.mp4"; PatchUtils.patch(path_pattern, merge_path, 2); System.out.println("合并完成"); } } 6.注意添加权限,6.0动态申请 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

优秀的个人博客,低调大师

MetaGPT 发布:用于解决复杂编程流程的自动化,可以模拟产品经理、架构师、项目经理、工程师等角色

MetaGPT刚刚发布,它是一个革命性的多智能体元编程框架,设计来协同解决复杂问题。欢迎试用、分享反馈。 Github:https://github.com/geekan/MetaGPT 中文介绍:https://github.com/geekan/MetaGPT/blob/main/README_CN.md 我们的最终目标是让 GPT 能够训练、微调,并最终利用自身,以实现自我进化 目前,我们已经使 GPT 能够以团队的形式工作,协作处理更复杂的任务。例如,startup.py 包括了产品经理,架构师,项目经理,工程师,它涵盖了一个软件公司的全过程

优秀的个人博客,低调大师

22、Python快速开发分布式搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

转自: http://www.bdyss.cn http://www.swpan.cn 第一步。首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://github.com/muchrooms/zheye 注意:此程序依赖以下模块包 Keras==2.0.1 Pillow==3.4.2 jupyter==1.0.0 matplotlib==1.5.3 numpy==1.12.1 scikit-learn==0.18.1 tensorflow==1.0.1 h5py==2.6.0 numpy-1.13.1+mkl 我们用豆瓣园来加速安以上依赖装如: pipinstall-ihttps://pypi.douban.com/simpleh5py==2.6.0 如果是win系统,可能存在安装失败的可能,如果那个包安装失败,就到 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 找到win对应的版本下载到本地安装,如: pipinstallh5py-2.7.0-cp35-cp35m-win_amd64.whl 第二步,将者也的,验证码识别程序的zheye文件夹放到工程目录里 第三步,爬虫实现 start_requests()方法,起始url函数,会替换start_urls Request()方法,get方式请求网页 url=字符串类型url headers=字典类型浏览器代理 meta=字典类型的数据,会传递给回调函数 callback=回调函数名称 scrapy.FormRequest()post方式提交数据 url=字符串类型url headers=字典类型浏览器代理 meta=字典类型的数据,会传递给回调函数 callback=回调函数名称 formdata=字典类型,要提交的数据字段 response.headers.getlist('Set-Cookie')获取响应Cookiesresponse.request.headers.getlist('Cookie')获取请求Cookies #-*-coding:utf-8-*- importscrapy fromscrapy.httpimportRequest,FormRequest importre classPachSpider(scrapy.Spider):#定义爬虫类,必须继承scrapy.Spider name='pach'#设置爬虫名称 allowed_domains=['zhihu.com']#爬取域名 #start_urls=['']#爬取网址,只适于不需要登录的请求,因为没法设置cookie等信息 header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64;rv:54.0)Gecko/20100101Firefox/54.0'}#设置浏览器用户代理 defstart_requests(self):#起始url函数,会替换start_urls """第一次请求一下登录页面,设置开启cookie使其得到cookie,设置回调函数""" return[Request( url='https://www.zhihu.com/#signin', headers=self.header, meta={'cookiejar':1},#开启Cookies记录,将Cookies传给回调函数 callback=self.parse )] defparse(self,response): #响应Cookies Cookie1=response.headers.getlist('Set-Cookie')#查看一下响应Cookie,也就是第一次访问注册页面时后台写入浏览器的Cookie print('后台首次写入的响应Cookies:',Cookie1) #获取xsrf密串 xsrf=response.xpath('//input[@name="_xsrf"]/@value').extract()[0] print('获取xsrf密串:'+xsrf) #获取验证码 importtime t=str(int(time.time()*1000)) captcha_url='https://www.zhihu.com/captcha.gif?r={0}&type=login&lang=cn'.format(t)#构造验证码请求地址 yieldRequest(url=captcha_url,#请求验证码图片 headers=self.header, meta={'cookiejar':response.meta['cookiejar'],'xsrf':xsrf},#将Cookies和xsrf密串传给回调函数 callback=self.post_tj ) defpost_tj(self,response): withopen('yzhm.jpg','wb')asf:#打开图片句柄 f.write(response.body)#将验证码图片写入本地 f.close()#关闭句柄 #---------------------------者也验证码识别----------------------- fromzheyeimportzheye#导入者也倒立文字验证码识别模块对象 z=zheye()#实例化对象 positions=z.Recognize('yzhm.jpg')#将验证码本地路径传入Recognize方法识别,返回倒立图片的坐标 #print(positions)#默认倒立文字的y坐标在前,x坐标在后 #知乎网要求的倒立文字坐标是x轴在前,y轴在后,所以我们需要定义一个列表来改变默认的,倒立文字坐标位置 pos_arr=[] iflen(positions)==2: ifpositions[0][1]>positions[1][1]:#判断列表里第一个元祖里的第二个元素如果大于,第二个元祖里的第二个元素 pos_arr.append([positions[1][1],positions[1][0]]) pos_arr.append([positions[0][1],positions[0][0]]) else: pos_arr.append([positions[0][1],positions[0][0]]) pos_arr.append([positions[1][1],positions[1][0]]) else: pos_arr.append([positions[0][1],positions[0][0]]) print('处理后的验证码坐标',pos_arr) #-------------者也验证码识别结束-------- iflen(pos_arr)==2: data={#设置用户登录信息,对应抓包得到字段 '_xsrf':response.meta['xsrf'], 'password':'279819', 'captcha':'{"img_size":[200,44],"input_points":[[%.2f,%f],[%.2f,%f]]}'%( pos_arr[0][0]/2,pos_arr[0][1]/2,pos_arr[1][0]/2,pos_arr[1][1]/2),#因为验证码识别默认是400X88的尺寸所以要除以2 'captcha_type':'cn', 'phone_num':'15284816568' } else: data={#设置用户登录信息,对应抓包得到字段 '_xsrf':response.meta['xsrf'], 'password':'279819', 'captcha':'{"img_size":[200,44],"input_points":[[%.2f,%f]]}'%( pos_arr[0][0]/2,pos_arr[0][1]/2), 'captcha_type':'cn', 'phone_num':'15284816568' } print('登录提交数据',data) print('登录中....!') """第二次用表单post请求,携带Cookie、浏览器代理、用户登录信息,进行登录给Cookie授权""" return[scrapy.FormRequest( url='https://www.zhihu.com/login/phone_num',#真实post地址 meta={'cookiejar':response.meta['cookiejar']},#接收第传过来的Cookies headers=self.header, formdata=data, callback=self.next )] defnext(self,response): #请求Cookie Cookie2=response.request.headers.getlist('Cookie') print('登录时携带请求的Cookies:',Cookie2) jieg=response.body.decode("utf-8")#登录后可以查看一下登录响应信息 print('登录响应结果:',jieg) print('正在请需要登录才可以访问的页面....!') """登录后请求需要登录才能查看的页面,如个人中心,携带授权后的Cookie请求""" yieldRequest( url='https://www.zhihu.com/people/lin-gui-xiu-41/activities', headers=self.header, meta={'cookiejar':True}, callback=self.next2 ) defnext2(self,response): #请求Cookie Cookie3=response.request.headers.getlist('Cookie') print('查看需要登录才可以访问的页面携带Cookies:',Cookie3) leir=response.xpath('/html/head/title/text()').extract()#得到个人中心页面 print('最终内容',leir) #print(response.body.decode("utf-8")) 【转载自:http://www.lqkweb.com】

优秀的个人博客,低调大师

Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件

先说和虚拟化技术的区别: 难道虚拟技术就做不到吗? 不不不,虚拟技术也可以做到,但是会有一定程度的性能损失,灵活度也会下降。容器技术不是模仿硬件层次,而是 在Linux内核里使用cgroup和namespaces来打造轻便的、将近裸机速度的虚拟技术操作系统环境。因为不是虚拟化存储,所以容器技术不会管 底层存储或者文件系统,而是你放哪里,它操作哪里。 这从根本上改变了我们如何虚拟化工作负载和应用程序,因为容器速度比硬件虚拟化技术更快,更加便捷,弹性扩容的更加高效,只是它的工作负载要求操作系统,而不是Linux或特定的Linux内核版本。 那VMWare就这样玩完了? 没那么快!虚拟技术相对成熟,又有广泛的工具,还有生态系统来支持它在不同环境下的配置。至于工作负载,它要求非Linux操作系统,或者只能使用特定的核心虚拟化技术。 -------------------------------------- Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。 在LXC的基础之上,Docker提供了一系列更强的功能。 可移植性 Docker定义了一种新的格式,将应用和其依赖环境全部打包到一个单一对象中,这个对象可以在任何安装有Docker的机器上共享,在任何机器上 执行这个对象的效果都是一样的。LXC仅仅实现了进程沙盒化,并不能在不同机器上进行移植。Docker将应用的所有配置进行抽象,打包到一个容器中,使 得该容器具有可移植性。 以应用为中心 Docker针对应用的部署做了优化,反映在其API,用户接口,设计原理及文档上面。而LXC仅仅关注容器作为一个轻量级的服务器。 自动化构建 Docker中支持Dockerfile,将应用的所有依赖项,构建工具和包都以源码的形式写在Dockerfile中,然后Docker可以根据Dockerfile构建镜像。该镜像在任何机器上面运行的效果都一样。 版本控制 Docker对容器提供了类Git的版本控制功能,支持版本回滚等功能。Docker也实现了增量上传和下载的功能,节约了上传和下载时的带宽资源。 组件重用 一个镜像可以作为基础镜像来创建更多特定的镜像,镜像之间支持多层重用。 镜像共享 Docker开发了一个Docker Hub,里面包含了各种常用的镜像,非常方便,我们也可以将自己的镜像上传到Docker Hub中。用户也可以在私有环境中搭建自己的Docker仓库,用来满足镜像的内部共享。 工具生态系统 Docker定义了一个API,用于自动化和本地化容器的创建和部署。已经存在大量的集成了Docker的工具集,例如Deis,mesos,docker-ui,jenkins等等。 原文:http://stackoverflow.com/questions/17989306/what-does-docker-add-to-just-plain-lxc 转自:http://blog.csdn.net/wangtaoking1/article/details/45043523 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6422630.html,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册