自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 资源 (1)
  • 收藏
  • 关注

原创 对微服务网关的一些总结

过滤器的模式,当WEB服务获取到HTTP请求的时候,在三个处理阶段做处理。支持服务注册与发现,根据不同的服务前缀,转发请求到不同的微服务。但是对于数据库的访问,缓存服务的访问等等,还是使用JAVA更具有优势。由于网关可编码,对安全,扩容,认证等通用的需求,变得比较容易实现。跟NGINX类似,可以编码实现,逻辑可以更加细致,比较容易。结合当前的技术栈,与具体的项目需求,以及当前的现状,来做选择。网关有很多,Kong,Zuul,Gateway,等等。相对于NGINX,微服务网关具备可编码的优势。

2023-08-04 11:01:12 1367

原创 Media-Android的相关知识

Media-Android的相关知识一. 调用系统相机,拍照,录像 调用系统相机,无论是拍照还是录像,首先要判断是否有权限(包括外存储权限)。 如果没有的话,需要申请;如果已经申请过了但是没有授权,那么提示; 权限通过之后,要通过隐式Intent调用,来唤起系统相机。拍照和录像的Intent的Action是不一样的。 另外一般要加EXTRA_OUTPUT用于指定拍照或录像的文件;对于Android7.0以下的,直接Uri.fromFile(),其他的一律要使用EX.

2020-11-18 15:16:35 215

原创 生产环境、测试环境的Maven pom.xml 配置

生产环境、测试环境的Maven pom.xml 配置思路:通过定义Profile,在Build的时候,用fliter进行参数替换。 env-XXX.properties定义每个环境的值, application.properties里,用$()引用pom.xml<profiles> <profile> <id>test</id> <properties> ...

2020-09-17 16:09:07 355

原创 优化Android、iOS文件上传超时

App在文件上传的功能模块做了个优化,就是总的时间设置了个最大值,超过了就失败。如果是前端Ajax的话,可以配置参数,对于Android、iOS上来说,比较麻烦一些。Android上首先自带的HttpUrlConnection是不支持这个功能的,于是用了OKHTTP替代,设置了CallTimeout还不够,还要设置connect、Read\Write Timeout。iOS上,用了AFNetworking,主要设置timeoutForResource,另外调大了timeoutInterval。

2020-09-17 15:45:01 725

原创 产品评估与运营

一. 产品评估1. 是什么样的产品? 核心价值(卖点)是什么?2. 它的用户是谁? 有足够的市场吗?3. 它的盈利模式是什么?4. 它的推广渠道是什么? 怎么销售?6. 竞品情况如何?7. 它处在整个产业链的哪个环节?是否核心环节?8. 是否符合国家的规定?9. 如果这次项目不成功,它有为下个项目留下什么积累吗?二. 产品运营1. 推广成本怎么样?2. 它的留存如何?3. 活跃度如何?4. 付费率如何?5. 使用时长多少?6. 各种转化情况如何?7. 常用功能以及核心功能是

2020-08-19 10:01:15 196

原创 Android Studio工程恢复三步走

不知道是WIN7的原因还是什么,我的AndroidStudio经常导致蓝屏。重启之后,往往工程就挂了,甚至有时候,源文件都乱码了。经常这样之后,摸索了一套工程挂了之后的恢复方法。大概三个尝试之后,基本能恢复工程。1)。File->Invalidate catches and restart。这个是自带的一个,点了之后会清理缓存并重启。2)。如果第一步失败了,那么自己去清理缓存。先关掉AS,然后去.AndroidStudio3.4\system,删掉caches这个目录, 再启动AS。3)。.

2020-08-03 15:12:31 873

原创 HyBird混合开发的几个注意的地方

做混合开发APP的时候,我们的方案是内置了H5相关的dist包,以本地文件的方式用WebView进行加载。期间遇到了Webview的安全相关的几个坑点。1. JS同源策略与跨域访问 同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。 何谓同源: URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。 同源策略: 浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某...

2020-06-30 10:34:20 270

原创 线程的互斥与协作

互斥:对于临界资源(区),同时只有一个线程能够访问。协作:生产者与消费者经常会用到的几个概念,不同的语言可能有不同的实现,但是概念是一样。volatile:这个无论JAVA还是C都提供了这么一个关键字。它是指需要内存的透传,CPU不能对它修饰的变量进行缓存,多个线程看到的值,一定是一样的。Atomic:原子操作,指的一段代码需要作为一个(不能被进一步分割的整体)执行。GCC编译器或者JDK会提供一些原语,比如C的swap_and_compare,Java的AtomicXXX等。Mutex:互斥量,它代表

2020-06-24 10:56:16 146

原创 Zookeeper的使用中需要注意的几个点

Zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。简单来说zookeeper=文件系统+监听通知机制.它相对于用Redis来做服务注册,优点就是能通知。我们以前做游戏服务的时候,也有一个中心服,就是干这个的。就是好多服务可以注册上来,然后,它可以对注册了监听的服务,进行通知这个变化。Zookeeper除了注册服务外,还可以管比如理配置文件这.

2020-06-15 11:12:28 259

原创 Java服务进程内存分析

做了个非常轻量级的JAVA HTTP服务,基于evnet2.0。基本上所有的方面都还可以,只有一个我觉得有些奇怪,需要好好查查。这个方面,就是对内存的占用。对比以前C做的HTTP的服务,内存差了大概2个量级。C的服务,逻辑也简单的,大概1M就可以了, 但是JAVA的,运行一段时间要100M。现象是: 服务启动完成的时候,占用内存25M,但是运行几千个请求之后,变100M了。这个是用Linux的ps命令看的。到底这么多内存都花在哪里了呢,会不会有内存泄漏? 于是就有了对JAVA进程内存的分析。

2020-06-10 14:01:26 523

原创 iOS 13 推送token的适配

在 iOS 13 的手机上,NSData类型的 deviceToken 转换成的字符串变成了:{length = 32, bytes = 0xd7f9fe34 69be14d1 fa51be22 329ac80d ... 5ad13017 b8ad0736 } 用户反映推送失败,网上百度了下,才知道原来的获取方法已经过时。于是修改为:if (![deviceToken isKindOfClass:[NSData class]]) { return; } cons...

2020-06-05 17:53:15 868

原创 用Java的NIO实现Reactor模型

以前用C写的evnet,类似于libev的NIO Reactor框架,主要用于Android、IOS的游戏网络模块。随着它的完善,也开始用于服务端的服务编写。对于一些对资源要求苛刻的服务,用它来写,非常的轻量级,并且已经比较稳定了。它主要的Event来自Redis的AELOOP,windows版本我补充了Select版本,另外补充了一个pipe通知机制,这个pipe用于支持signal与多线程的异步通知。目前有不少基于它的服务用于生产环境,跑了一年都不用重启。最近有些需求,需要大量用到JAVA的

2020-06-03 10:54:23 791

原创 iOS证书即将过期的更新步骤

公司的iOS的推送证书即将过期了,记录下更新的步骤:1. 登陆苹果开发者后台,将原来的证书Revoke. 会提示受影响之类的,点确定。2. mac开发机上,点钥匙串,将原来的删掉。3. 苹果开发者后台,重新创建推送证书。期间会提示选择CSR,这个用以前创建推送证书的时候,保存好的。4. 创建成功,下载安装。5. 导出p12文件,替换。实际测试,经过1~5步骤,老的证书依旧可以推送成功,因此不用担心更换过程会导致线上的设备受影响。...

2020-05-28 11:44:11 5748

原创 GDB 调试 core

分两个方面1. 可执行文件 可执行文件一定是要用 -g 编的,目的是产生调试符号,也就是函数名之类的,不然看到的就是一大堆的地址,压根分析不出来啥。2. 配置成可生成core ulimit -c unlimited当出现了segment fault的时候,就可以 gdb 可执行文件 core文件名接着 bt 查看调用堆栈即可...

2020-05-26 16:39:44 122

原创 Tomcat7热部署SpringBoot war包的兼容问题

由于项目的需求,要用springboot 的war包的热部署的方式。但是总是会失败,只有重新启动TOMCAT才行。报错的异常, 关键的地方是这样: java.lang.NoClassDefFoundError: javax/el/ELManager网上百度了,原来是Tomcat7里的el-api.jar的版本太低了。因此,网上找了一个javax.el-api-3.0.0.jar,放到了...

2020-03-16 15:02:38 187

原创 XCode11上传AppStore一直卡住的问题

更新Xcode11之后,上传AppStore的时候,遇到了在Uploading界面的AuthenticatingwiththeAppStore…卡住一整天都不会动。百度了很多,终于找到了一个可行的方案。解决方案1.下载com.apple.amp.itmstransporter.zip文件. 目前已经被我转存到自己的百度网盘底下。2.下载好之后,解压到Caches目录底下。3.重启XC...

2020-03-13 18:26:05 2605

原创 数据结构(十一) --- 抽象数据类型(完)

抽象数据类型,ADT,是除了包含属性数据之外,还有自身方法(函数)的一种数据结构。属性不难理解,就是组成它的基础数据结构。而方法其实则是函数指针,它指向了当前ADT的一个函数实现。        ADT本质上是普通数据结构的一个引申与扩展,算是数据结构的终极类型。它不仅包含了数据,也包含了在数据上的操作。一般而言,类也是根据这个思想而产生的。        在C++中,有CLASS这么一个

2013-03-06 10:47:37 495

原创 数据结构(十) --- 字符串

字符串是存放N个字符的一个数据结构。在C语言中,并没有一个专门的数据类型,而开发中这个东西如此之重要,以至于基本上没有不适用字符串的程序。        字符是有意义的字节或者是双字节,甚至可以扩充为N字节。单个字符可能表示的意义不够,所以需要字符串来进行表达具体的数据。字符串跟字符数组的意义类似,事实上很多时候,可以像操作数组一样来操作字符串。字符串不同于数组的地方,在于字符串有结尾标记,大

2013-02-28 17:22:13 327

原创 数据结构(九) --- 树

树是一种非线性的数据结构,就像一棵真正的树一样,从根节点开始,分叉开的子节点,每个子节点又可以继续向下分成N个子节点,循环下去,一直到长出叶子为止。叶子也是一个节点,不同的是,它没有子节点。        树形结构在实际程序设计开发中,代表了一种具有层次规律的数据模型,经常被使用。比如HTML文档,可以解析成一棵树,应用中所有使用中的GUI的控件,也可以看做一棵树。树根据其特点不同,有二叉树,

2013-02-28 15:45:18 309

原创 数据结构(八) --- 队列

队列对应了先进先出的思想,与栈一样,是一种算法类的线性表。它的特点是只能在队头读取,队尾添加。在队列这个数据结构中,使用了头指针和尾指针(可以使索引)两个变量记录当前队列的基本情况。       1). 队列操作。最开始,头尾指针均是指向队头。入队, 就是在队列的尾部添加数据,队列数据个数加一,尾指针后移; 出队,就是在队列的头部取的数据后,然后删除该数据,头指针后移。       2).

2013-02-28 11:39:57 366

原创 数据结构(七) --- 栈

栈是一种先进后出的表,很多场合需要使用栈的思想。程序中,只能在栈的一端进行插入和删除操作,允许插入和删除数据元素的这一端称为栈顶;而另一固定的一端称为栈底。        栈有栈顶指针来定位当前栈顶的位置。如果用一个数组[N]来实现一个栈,当栈顶指针是0的时候,则栈为空,当栈顶指针是(N-1)的时候,代表这个栈满了。        最常说的程序运行栈,就是栈思想的经典使用。函数的调用则对应

2013-02-28 11:22:07 374

原创 数据结构(六) --- 数组

数组是一种连续内存存储的线性表,是程序设计中非常重要的一种数据结构。数组对应了一块连续的内存,而且数组中每一项所占内存的大小是一定的。它非常的简单易用,通过索引可以非常快速地定位到某个元素。        相比于链表(详细见前一节),数组的优点是: 快速索引,而且由于是固定大小元素的连续内存,不再需要指针域,能利用更少的内存存储更多的数据。缺点是: 自定义的时候,数组所占的内存大小就固定了,并

2013-02-28 11:04:03 292

原创 数据结构(五) --- 链表

链表是一种非连续内存存储的线性表。它的每一个元素叫做节点,节点有两个部分组成,分别叫做值域和指针域。指针域提供了寻找其他节点的信息,值域里则存放了当前的数据信息。        链表是常用的一种数据结构,优点是可以方便的完成节点的插入删除动作,并且有比较高的效率,而且对大小没有限制。缺点是索引某个节点数据的时候,需要从头节点开始遍历。        1). 单向链表,节点的指针域仅仅是保存

2013-02-28 10:26:56 408

原创 数据结构(四) --- 内存与指针

内存在程序角度上来讲,是一段连续的空间,以字节为单位,可以存储数据。对于每一个存储单位,都有对应的一个地址,谓之曰指针。程序使用的内存是有限制的,虽然现代硬件发展很快,但是内存的合理利用仍然是对优秀程序的要求。          01). 变量与常量。常量顾名思义是运行期间不变的数据,变量则是可以再运行期间被修改的。而指针变量存储的是指针,也就是一个内存的地址,一般是用整数来表示的。程序分配内

2013-02-21 11:33:40 1083

原创 数据结构(三) --- 复合数据类型

复合数据类型是C/C++中特有的,编译器支持的一项特征,在不同的使用场景发挥着至关重要的作用。一旦被定义,就可以像基本数据类型一样使用,可以有数组,可以有指针,可以通过文件操作进行读写,可以组织成更加复杂的数据类型。        1). STRUCT. 结构的意义如同记录,由若干成员组成的。成员可以使基本数据类型,也可以使复合数据类型。内存组织上,根据编译器选项的不同,结构的成员依次按照N字

2013-02-01 16:44:20 567

原创 数据结构(二) --- 基本数据类型

基本数据类型是指编程语言通常支持的数据类型。C/C++里支持的有BIT,CHAR,INT,FLOAT,LONG,指针。它们是构建数据结构的基础,就算最复杂的类(CLASS),都是由它们作为基本单元来描述的。       1). 数与数的表示。在计算机内部,数据都是以二进制的形式而存在的,就是0、1两种值,叫做BIT,也叫位。为了能更好的编程,面向程序人员,编译器支持了字节,整数,浮点数,指针。

2013-01-28 11:00:38 418

原创 数据结构(一) --- 前言

要进行高级编程,那么需要打下坚实的基础。俗话说,万丈高楼平地起,这个话题就开始介绍基础的数据结构。程序的运行基于当前的数据模型,只有掌握了数据结构,才能设计出程序各种细节的实现。        数据结构,可以理解为程序的数据模型,即当前要处理什么样的数据,什么格式的数据,这些数据是怎么组织的。请注意,将这些基本知识融会贯通才能得到真正的提高。就向太极拳一样,要根据这些有形的知识,消化理解成自己

2013-01-07 13:00:28 344

原创 基础算法(十一) --- 算法的本质(完)

程序指令无外乎顺序,分支,循环,而就是由这三种方式却能组建出复杂的大型的程序。算法一样如此,一个一个算法堆积起来,互相作用,能够解决非常非常复杂的问题。原来,算法讲究的是一种解决问题的思路。       说到这里,基础算法这个话题就结束了,然而算法学习之路仍然很长很长。在以后的实践里,基础算法这个话题里列举的节目也就是能起到抛砖引玉的作用,这正的更加合理的算法还需要大家好好的体会与总结。

2013-01-05 15:11:23 438

原创 基础算法(十) --- 递归法

递归法是一种直接或者间接地调用自身算法的过程。        什么时候使用递归呢?一般而言,如果发现当前的问题,可以用一个跟它本身策略一样的一个子问题的结果来计算的时候。如果恰好在最后一步中,有一个明确的递归结束条件(称为递归出口)。那么,就是递归使用的时机到了。        递归有时候并不太明显,函数可能被间接嵌套。用递归写的代码非常简洁,也非常容易理解。在有些嵌入式应用里,如果当前的

2013-01-05 15:01:18 429

原创 基础算法(九) --- 哈希与哈希表

哈希是可以达到快速存取的一种算法。俺接触到的利用哈希的地方基本都是通过关键字进行查询的,而且关键字都是比较复杂,比如说字符串,根据关键字比较非常繁琐耗时。这样的情况下,哈希就非常有作用了。       它的存放过程是怎样的呢?首先,通过哈希函数将复杂的关键字计算出一个哈希表元素的索引;然后将真正的关键字的实际位置信息,作为索引位置对应的元素值。如果存在冲突,就继续找下一个合适的位置存放。下一个

2013-01-05 14:34:12 517

原创 基础算法(八) --- 试探法

摸到石头过河,从实践中出真知,这是试探法的原理。从学过的有关知识和规律,从自己的体会,找出相关的进行试探。如果能找出其中一个解,那么也就代表试探初步成功了。请注意初步成功的解也许并非是最优的那个解,但是已经能解决问题。如果没有达到预期,还可以将这个解放到候选集里,然后继续试探,最后取最好的那个作为你的解决方案,而这个度就需要程序把握了。        日常生活中也有很多需要我们去把握度的问题,

2013-01-05 11:05:09 2973 1

原创 基础算法(七) --- 缓存策略

缓存是经常使用的一种方法,尤其在服务器端。对于一些复杂的宝贵资源来说,频繁的申请与释放,会导致整个服务的瓶颈。而利用局部性原理,可以将一些经常使用的资源缓存起来,下次再次使用的时候,可以直接从缓存里取,从而提高效率。        设计模式中有个代理模式,就是对宝贵资源进行一个限制,而缓存也可以起到这样的作用。其实很多时候,代理模式中也使用了缓存策略。其实在硬件系统中,内存的分层结构,从一级缓

2013-01-05 10:49:14 2272

原创 基础算法(六) --- 递推法

递推法是指根据当前的一些简单情况,推演情况很复杂的结果的一个方法。即当问题中涉及相互联系的物体较多并且有规律时,应根据题目特点应用数学思想将所研究的问题归类,然后求出通式。具体方法是先分析某一次作用的情况,得出结论,再根据多次作用的重复性和它们的共同点,把结论推广,然后结合数学知识求解。       用递推法解题的关键是导出联系相邻两次作用的递推关系式.       Example 1:

2013-01-04 16:36:00 689

原创 基础算法(五) --- 穷举法

’拿不准就穷举’,忘了这句话是哪里看来的了。是的,穷举虽然看起来笨拙,但是使用它的地方,多着呢。大多数情况下,一个问题存在的可能也就那么几个,穷举是最合适的思路。       穷举的思想非常简单明了:将问题划分成有限的几种可能,然后一一判断。所有的可能都处理过了,那么这个问题也就解决了。在刚刚毕业那会,曾经做一个小功能:有个界面上有四个按钮,每一个被点击了都要有对应的处理。那个时候,项目组的组

2013-01-04 16:11:06 1029

原创 基础算法(四) --- 分治法

分治法的本质是大事化小。就是把问题分成很多小问题,小问题再分成更小的问题。而小问题往往是更容易解决的,各个小问题解决了,大问题也就解决了。往往在进行软件设计的时候,会划分成很多的模块,这个是分而治之的一个思路。        思想是简单的,具体如何分,这个就要靠一些原则与经验了。        Example 1:        函数拆分。一个小的模块,往往也要拆分成很多的功能单一的函

2013-01-04 12:23:13 533

原创 基础算法(三) --- 轮询

轮询算法是一个比较耗费CPU资源的方法,因为总要不停的来问才行。在低级IO的时候,往往CPU是等一段时间就查看控制总线是否已经被置为可读可写,其实这就是一个轮询的例子。为什么要轮询呢,是因为你不知道对方是否已经到了想要的那个状态(比如数据已经就绪)。而你必须要等到那个状态才能继续。所以,要定一个定时器,时间到了,就来查看一些状态。Example 1:MTK平台检查SOCKET是否已经连

2013-01-04 11:54:14 3613

原创 基础算法(二) --- 控制反转

控制反转是面向对象设计中的一个概念,它反映的是一个低层调用高层的一个方法。也就是说,可以让低层模块作为主动模块,主动的来呼叫比它层次更高模块的方法。       在C语言中往往实现的方式是使用回调函数,而在JAVA中则可以使用抽象类继承或者接口等。这个机制在软件开发中,经常扮演非常重要的角色,也是很多设计模式所依赖的一个手段。比如监听者模式,比如策略模式等。       Example 1

2013-01-04 11:36:22 544

原创 基础算法(一) --- 前言

算法是遇到一些问题的解决思路,解决问题的办法由千万种,所以往往算法跟当前的人的性格阅历都有很大的关系。但是,对于一些经常出现的问题,往往也有一些非常通用的前人已经总结出来的算法可以很好的应对。        基础算法这个话题,将会总结一些基本的问题域比较单一的解决问题之道,就如同设计模式一样,有自己一些使用范围。        就像学习数学中的加减乘除一样,要熟练掌握并形成自己的独特的感觉

2013-01-04 11:03:11 354

原创 抽象的操作系统(十) --- 中间件(完)

既然操作系统可以抽象,那么就可以做一个中间层,提供类似于操作系统功能的接口。然后这个中间层可以移植到不同的平台之上。基于这个思想,基于中间件接口的软件,就不用操心移植的问题了。软件开发过程中遇到的问题也可以更好的利用中间件来定位。        很多的嵌入式软件,都有自己的移植层,而核心的代码却是跟具体平台无关的。这个做法是基于封装变化的思想,把使用的接口抽象出来,具体的实现由移植层来完成。有

2012-12-28 15:35:38 1652

原创 抽象的操作系统(九) --- 硬件系统

典型的硬件系统是:CPU -- 总线 -- MEMORY/IO,被称作在冯-诺依曼结构。对于任何复杂的硬件系统来讲,都脱离不了这个范畴。操作系统就运行在这样的一个架构之上,完成对硬件设备的调度与资源的分配。        1). 指令执行。CPU是一种比较智能的硬件设备,每一种CPU有自己的结构和指令集, CPU一般有运算单元,寄存器组成。启动的时候,会到RESET地址去执行指令。硬件系统每执

2012-12-28 15:03:25 675

SDL-1.2.zip

SDL 1.2 源码 , 是一款跨平台的2D引擎,用于多媒体开发

2013-01-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除