沈凡宸 2018-04-17 18:48:30

一、概述

本文主要讲解C语言函数调用约定。

或许多数童鞋有点不明白这个东西有什么作用和影响,在不清楚调用规则的情况下,我们依旧可以写出可用的甚至很好的代码。

可以说,C调用约定是一个非常关键和有用的机制,理解函数调用不仅可以使你写出更优质的代码,也可以拓宽你对编程语言的视野,更可以让你了解一些“不让播”的东西~当然,这里我们不过度关注这些方面,可以从第三节的引申部分了解一二。

C语言发展到现在其实有很多种调用方式,例如:stdcall、cdecl、fastcall、thiscall、naked call等。我们不关注64位系统的调用方式,不是因为其不重要,而是部分原理还是相通的。

二、cdecl详解

这里我们关注cdecl的调用机制,cdecl是C语言的缺省调用约定,称为C调用约定。

在这个约定中,不仅规定了函数参数、返回值的输入与输出方式及负责方,还给出了在调用时辅助内容寄存器的使用规定。

下面我们通过一个简单的函数声明来说明一个函数的调用过程:

“` int f

张庚 2017-11-08 11:37:14

二话不说,先上图:

图一:未优化前APP启动的样子:

图二:优化后APP启动的样子:

对比这两幅图可以看到什么:

在图一中,APP的启动经历如下过程:点击桌面APP icon——>经历黑屏页面——>跳转到Splash页面; 在图二中,APP的启动经历如下过程:点击桌面APP icon——>跳转到Splash页面。

因此,这次的优化主要目标就是:

秒开,一触即发,不给用户任何等待的时间。

本文主要记录这次优化过程,其中包含如下内容:

APP启动秒开的意义所在 Android APP启动的时候都做了哪些事儿? 为什么APP启动的时候会看到一个黑屏

穆秋实 2017-11-08 11:18:46

背景

说放弃有些夸张,其实之前简单了解过Dagger2框架,但是并没有深入研究。这次准备从依赖注入概念入手,通过写一个简单的Demo,掌握Dagger2最基本的使用,同时阅读最基础的生成源码,分析其注入过程

简介

Dagger,匕首,Jake Wharton大神三把刀中最著名的一把,是一个Android依赖注入框架,目前已经交由谷歌维护,开发到2.0+版本。其最大的作用,是用于模块间解耦,提高代码的健壮性和可维护性。

控制反转 1、耦合

我们总说解耦,那首先就得先定义一下什么是耦合,不然连解的是什么都不知道怎么行,看下面的代码

class A { B b; public A() { this.b = new B(); } }

很简单,我在开发中也经常这么用,在A中通过new关键字创建B的实例对象,调用相关方法。这里的创建对象,其实 这里就存在着耦合,因为当B修改了构造方法,A也要跟着做修改,所以耦合用大白话说,就是模块间产生了联系。当然,这个联系不仅仅局限于使用了

李军 2017-11-07 17:58:07

本文主要记录跳转可滑动项目详情页卡顿情况思考与解决过程,包括如下方面:

存在什么问题,优化之后预期达到什么样的目标 什么原因导致的这个问题 试错方案 最终解决方案 最终结果 总结 拓展 一、存在什么问题,优化之后预期达到什么样的目标

在项目列表页跳转项目详情页存在很大的卡顿问题,抓取堆栈信息,大概卡顿时间如图:

有大概990ms的卡顿时间。 我们希望在这次优化之后,达到跳转不可滑动详情页的效果,跳转预期时间如图:

二、什么原因导致的上述问题

崔志华 2017-11-03 13:52:18

简介 名字来源:REmote DIctionary Server 非关系数据库 可以存储key和5种不同类型的值Value 可以将存储在内存中的数据持久化到硬盘 可以使用复制特性来扩展读性能 可以使用客户端分片来扩展写性能(线性提升) 客户端分片:基于hash或者包含键的Id将数据存储到多台机器,也可以从多台机器里面获取数据,这种办法在处理某些问题时可以获得线性级别的性能提升。 redis 不支持嵌套结构特性(如果需要可以通过合理组织命名空间一定程度上行模拟。) 一、和memcache对比 都可用于存储键值对 性能相差无几 部署成本接近(要求越高memcache越便宜) redis集群功能受限制比较严重,大规模应用没有明显的优势 redis单机功能完爆memcache redis单机很难升级(各种多机架构对redis协议的高级特性一般都支持的不怎么好) Redis可以以两种方式进行持久化 Redis除了存储字符串之外

张庚 2017-11-02 18:49:19

本文主要记录对易项优选APP进行Android 7.0 适配过程,其中包含如下内容:

易项优选APP 在Android 7.0上碰到的问题

适配7.0的步骤

第一步,声明provider 第二步,编写resource xml file 第三步,使用FileProvider API

这个特性将会影响到的使用场景以及解决方案

自动安装文件 调用系统拍照 调用系统裁剪 适配过程中遇到的问题 一、易项优选APP 在Android 7.0上碰到的问题

投资人在上传名片时,点击拍照按钮,APP Crash,并抛出如下日志:

“` Process: com.capcom.app.android, PID: 656 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.capcom.app.android/files/capcom/IMG_20171026_172210

纪浩 2017-10-27 10:17:05

《计算机程序设计艺术》作为算法学科的开山之作,几乎所有程序员都听说过这本书的大名,但真正使用这本书来学习算法的人却寥寥无几,主要的原因有两个,一是书籍开头用接近100页的篇幅讲解书中用到的数学知识,这对于数学不好的同学来说,阅读体验及其不友好;二是作者为了讲解算法,设计了一台虚拟的计算机–MIX,并针对该机器自己设计了一整套汇编指令集–MIXAL,且书中的所有算法都是使用MIXAL来实现的。这对于常年使用高级语言的同学来说,阅读体验及其不友好。

事实上,MIX的汇编语言学习起来并不复杂,按照作者的估算时间,只需要一个下午的时间就可以初步掌握这种语言。但理解代码最直观的手段还是让代码跑起来,本文的主要目的就是介绍[MIXVM](https://www.gnu.org/software/mdk/manual/html_node/index.

李伟 2017-10-26 11:41:25

1、问题

在MySQL中,使用ALTER TABLE语法会给整张表加锁,会导致两个问题:

改表过程中所有写操作(DML)会被阻塞 容易产生主从延迟 2、解决方案

percona提供了一个工具集,其中pt_online_schema_change能不影响业务的同时修改表结构(DDL),详情参考:https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html pt_online_schema_change的原理是:

首先按照原表结构复制一个新表 然后给新表执行改表结构操作 在原表上添加触发器让原表的所有改动同步到新表 一段一段地读原表的数据并把数据写入到新表 检查从库是否延迟,如果有延迟它会暂停写入并等待从库延迟恢复 最后将修改原表表名为_原表表名_old,并将新表表名改成原表表名 删掉_old表 3、修改无从库表

修改只有主库没有从库的数据库中的表结构,可以使用本小节中的方法进行。

彭小华 2017-10-25 18:21:22

首先介绍下这本书,网易杭州研究院出的,主要讲他们的项目经理是如何参与和推动项目。之前读的《卓有成效的管理者》、《领导梯队》等都是大而全的讲解管理原则,适用于各行各业,偏理论修内功。这本书主要是从实际项目出发,教了大量的招式,深度上也有一些,完全按照那些方法论来做,也能有板有眼像那么回事。项目经理本质是个管理岗,项目和人都不可能是通用的,就像里面提到的一句:守-破-离,守-学习方法,按套路出招;破-创新,根据实际情况进行调整;离-看透本质,大道至简,无招胜有招。想起之前美团的一位大牛在分享的时候说过不存在通用的方法论,如果有那就是“具体情况,具体对待”。所以初级的项目经理读这本书的时候可以先做到掌握一二章的常用套路,第三章得在业务达到一定规模下才有发挥,用得不好会出挺大问题,第四章的内容在缺少管理经验时甚至会觉得有点虚。

第一章讲的都是些日常工作,常用的招式都是解决什么问题,项目经理新手应该全部掌握。

我很认可里面提到的项目经理的三重境界:

第一重是做项目,在满足项目铁三角的前提下交付项目(铁三角指的是范围、时间和成本),同时要保证质量。

第二重是

张夫尧 2017-10-25 12:28:28

一、npm init

首先进入到项目目录,执行 npm init,效果如图:

一般来说,一路回车即可,如果对应的有 git 仓库,它也会自动填充。几个东西值得一说:

name 项目名,也就是以后发布的时候的 npm 包名。发布前随时可以改,所以也不用太担心重复。 entry point 入口文件,也就是别人 npm install 之后,require 所使用到的文件。 license 开源协议,这里建议使用完全无传染性的 MIT 和有一定传染性的 LGPL-3.0,也可以根据自己的需求选择开源协议。

执行完毕后,目录中会生成一个 package.json 文件,其中 entry point 在这个文件中的字段名是 main,也可以随时改,所以也不用太在意。

package.json 字段详解:http://ju.

张夫尧 2017-10-25 12:27:31

背景

vue2.0 中去掉了 replace: false 这个参数,原因是 vue2.0 采用了 virtual dom,而其设计的数据结构需要唯一的根节点。

但是,根据实际需求就会发现,我们不可能永远让一个组件在内部控制其对外布局的样式,更多的情况应该是在外控制其对外布局的样式。从这个角度考虑,replace: false 参数对我们是有用的。

所幸,vue2.0 中提供了 render 这个方法,这个方法使得开发者可以通过 js 生成自己需要的 virtual dom。

同时,vue2.0 中还有 Vue.compile 这个 api,用于将模板编译为 virtual dom。

还有一点要注意的是,vue2.0 要求的是唯一的根节点,所以无所谓这个根节点是 dom 表现出来的还是 render 出来的,哪怕是 v-if v-else,只要最终展现出的是唯一的根节点就行。

以上三者,为我们提供了无限的可能。

探索

render 和 compile 这两个东西如何结合?官方文档没有说的很明白。但是通过写一些

李伟 2017-10-25 12:17:32

1、burpsuite介绍

burpsuite是安全领域的一个很重要的辅助工具,它提供了一套工具集可以轻松地

查看请求 截获请求 发送请求 重复请求 篡改请求

很适合客户端同学抓包和排错。另外,个人觉得它比charles更加好用。

2、基础使用 2.1 下载安装burpsuite

https://portswigger.net/burp/download.html

2.2 burpsuite配置代理端口

2.3 Chrome连入burpsuite

推荐安装chrome扩展SwitchyOmega,配置如下:

![Chrome连入burpsuite](http://file.ethercap.c