fldroid

群山苍翠。加油站孤零零的。入山之前,托马斯停车加油。


  • 首页

  • 归档23

  • 分类5

  • 标签19

  • 关于

  • 公益 404

  • 搜索

领域专用语言(DSL)

发表于 2017-04-26 | 分类于 知识扩展 |

领域专用语言(DSL)

所谓领域专用语言(domain specific language / DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。几乎自计算机发明伊始,人们就开始谈论DSL使用DSL了。

Unix社群是一个频繁使用DSL的社群,他们通常称之为小语言或迷你语言。(关于这一传统,Eric Raymond的《Unix编程艺术》有上佳探讨。)要构建一种DSL,按最常见的Unix风格的做法,就是先定义它的语法,然后通过代码生成技术把DSL代码转成一种通用语言代码,或者写一个这种DSL的解释器。Unix有很多工具能让这件事做起来轻松些。我为这类DSL定了一个术语:“外部DSL”。XML配置文件是外部DSL的另一种常见形式。

阅读全文 »

Android studio 统一替换JCenter为国内阿里云maven

发表于 2017-03-06 | 分类于 Android |

有的时候同步一个依赖要等好久,浪费好多宝贵时间,编译速度也变的很慢,那么今天我们就彻底解决这个问题。使用阿里云maven替代jCenter,加快编译速度。

在你的USER_HOME/.gradle/目录下,新建一个文件init.gradle,把这一段内容拷贝进去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}

二分法查找与快速排序

发表于 2016-12-23 | 分类于 数据结构与算法 |

二分法查找

当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。

假设有一个数组 { 12, 23, 34, 45, 56, 67, 77, 89, 90 },现要求采用二分法找出指定的数值并将其在数组的索引返回,如果没有找到则返回 -1。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Search {
public static void main(String[] args) {
int[] arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 };
System.out.println(binarySearch(arr, 12));
System.out.println(binarySearch(arr, 45));
System.out.println(binarySearch(arr, 67));
System.out.println(binarySearch(arr, 89));
System.out.println(binarySearch(arr, 99));
}

public static int binarySearch(int[] arr, int key) {
int start = 0;
int end = arr.length - 1;
while (start <= end) {
int middle = (start + end) / 2;
if (key < arr[middle]) {
end = middle - 1;
} else if (key > arr[middle]) {
start = middle + 1;
} else {
return middle;
}
}
return -1;
}
}
阅读全文 »

Amigo 源码解读

发表于 2016-11-15 | 分类于 Android |

现在 hotfix 框架有很多,原理大同小异,基本上是基于qq空间这篇文章 或者微信的方案。可惜的是微信的 Tinker 以及 QZone 都没有将其具体实现开源出来,只是在文章中分析了现有各个 hotfix 框架的优缺点以及他们的实现方案。Amigo 原理与 Tinker 基本相同,但是在 Tinker 的基础上,进一步实现了 so 文件、资源文件、Activity、BroadcastReceiver 的修复,几乎可以号称全面修复,不愧Amigo(朋友)这个称号,能在危急时刻送来全面的帮助。

在Amigo这个类中实现了主要的修复工作。我们一起追追看,到底是怎样的实现。

Amigo.java

1
2
3
4
5
6
7
...

if (demoAPk.exists() && isSignatureRight(this, demoAPk)) {
SharedPreferences sp = getSharedPreferences(SP_NAME, MODE_MULTI_PROCESS);
String demoApkChecksum = checksum(demoAPk);
boolean isFirstRun = !sp.getString(NEW_APK_SIG, "").equals(demoApkChecksum);
...
阅读全文 »

Looper、Handler、MessageQueue原理及源码解析

发表于 2016-10-15 | 分类于 Android |

Handler在开发中还是很常用的,通常我们主要用来在子线程中更新UI,其实深入点的话就是涉要另外及Looper、MessageQueue。当然我们也可以让他工作在非UI主线程,怎么用呐?看下边小栗子。

下边我们写个简单的小例子来引入要讲的源码分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private class LooperThread extends Thread {
@Override
public void run() {
Looper.prepare();
mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
//TODO do somethings
return false;
}
});
Looper.loop();
}
}
阅读全文 »

JavascriptInterface与WebChromeClient.onJsPrompt()实现的Android Webview与js交互

发表于 2016-08-07 | 分类于 Android |

在Android开发中,能实现Js调用Nactive,有4种方法:

1
2
3
4
JavascriptInterface
WebViewClient.shouldOverrideUrlLoading()
WebChromeClient.onConsoleMessage()
WebChromeClient.onJsPrompt()

这里我们讨论下第一种@JavascriptInterface注解实现,和第四种就是WebChromeClient.onJsPrompt() js注入的实现。下面来详细讲解一下二者的使用方式,原理,其他请阅读扩展JsBridge实现JavaScript和Java的互相调用-QQ音乐技术团队。

@JavascriptInterface实现

实现步骤:

  • 设置WebView支持js脚本
  • 为提供给js调用的方法加上@JavascriptInterface注解
  • 给WebView添加js接口
阅读全文 »

OSI模型,TLS/SSL 及 HTTPS

发表于 2016-06-20 | 分类于 Android |

上回我们白话了密码学中的两种算法,对称加密算法和非对称加密算法,我们有了这两种算法,我们就要将他们应用到实际生活中,就像我们学会了99乘法表,就可以让我们在实际生活中快速的计算啦!

所以本节课程的先决条件就是,看并掌握我之前白话的这篇文章:对称加密算法vs非对称加密算法。

我们先从互联网开始说起,说到互联网我们就不得不提一下计算机,因为计算机是互联网组成的一个很重要的部分,我们要想使用互联网进行交流就必须使用计算机(注意!我这里的“计算机”是一个统称,爱钻牛角尖的童鞋,不要说,除了计算机还有手机啊,ipad啊,智能手表啊!!!!恩,好了,别闹了)。

然后问题来了,要想形成互联网,计算机和计算机之间就必须相连起来(废话!),于是我们就有了“网线”,当然这里的“网线”也是泛指,因为现在大家家里都用的是无线网!不过无论有线网还是无线网,他们都是通过“物理”途径进行传播信号的!有了这些“联系”,我们计算机和计算机之间有了传递信息的“途径”了,但是!这里仅仅是提供了一个途径,但是如果想让计算机之间彼此了解传输的信息,那么我们必须定义一系列的协议,这些协议是计算机之间都能够明白的,同时发送和接受要严格按照协议去做!就像张三是中国人和王石头是印度人,他们俩要想交流,就要先建立一个途径,无论是加qq还是发邮件,同时他们俩还得说一样的话,不能张三说中国话,王石头说印度话。

阅读全文 »
custom header, leave empty to use the default one
  • 几种常用加密算法比较
  • 如何在Android上使用Https
  • 对称加密算法 VS 非对称加密算法
  • Android数据库加密-SQLCipher集成

对称加密算法 VS 非对称加密算法

发表于 2016-06-13 | 分类于 Android |

对称加密算法(Symmetric-key algorithm)和非对称加密算法(asymmetric key encryption algorithm)只不过就是密码学(encryption)中的两种解密算法罢了,什么是算法,你就可以理解成为是一种规则吧,这种规则可以将信息从一种形式转变成另一种形式,不懂没关系,继续往下看。

对称加密

首先,让我们先从一个情景开始讲起,想当初我们在初中,高中,甚至于大学,每次考试都有人在试图如何更加隐蔽的作弊!那大家都想了什么方法呢?比如张三学习比李四好,李四就想在考试的时候让张三“帮助”一下自己,当然,他们俩不可能像我们平常对话一样说,第一题选A,第二题选B等等,为什么?因为监考老师明白他俩在谈论什么,也就是说这种沟通交流方式属于“明文”,所以李四就想:“我需要发明一种,只有我和张三明白的交流方式”,那李四做了什么呢?恩,李四去找张三说:“当我连续咳嗽三声的时候你看我,然后如果我摸了下左耳朵,说明你可以开始给我传答案了,如果没反应,那说明我真的是在咳嗽。。。。”, 然后,怎么传答案呢?很简单,“你摸左耳朵代表A, 摸右耳朵代表B,左手放下代表C,右手放下代表D”,好了,这就是他们的“算法(规则)”,将信息的一种形式(A,B,C,D),这里我们称为“明文”,转换成了另一种形式(摸左耳朵,摸右耳朵,放左手,放右手),这里称为“密文”,经过这种转换,很显然监考老师不会明白这些“密文”,这样,张三和李四就通过“密文”的形式实现了信息的交换。

其实,密码学不就是为了人们更好的加密传输么?有很多学者,科学家成年累月的工作,为的就是改进或者发明更好的加密算法,让这些加密算法加密的文本难以破解,达到数据安全传输的目的。

阅读全文 »
custom header, leave empty to use the default one
  • 几种常用加密算法比较
  • 如何在Android上使用Https
  • OSI模型,TLS/SSL 及 HTTPS
  • Android数据库加密-SQLCipher集成

基于 Facebook Redex 实现 Android APK 的压缩和优化

发表于 2016-05-13 | 分类于 Android |

image

随着世界各地越来越多的人开始登录Facebook,我们有越来越大的责任保证她的快捷使用性。在发展中地区尤为如此,其中旧设备在市场上滞留的时间变长,人们对新设备的升级周期同样页边长了。我们希望确保我们的程序在所有主要移动平台上改进性能的可能的方法。

Android是我们最大的平台之一,它也是具有很大的多样性设备的移动平台。在这些设备上的任何性能或效率改进都可以更好地为全世界数百万人的体验到。

今天,我们想分享一些我们的努力,通过一个我们称之为Redex的项目来优化Android的Java字节码。Redex是一个用于优化Android .dex文件的管道。通过应用一系列可定制的转换,使得在源.dex在被合并到APK之前被优化。

阅读全文 »

Cookie 和 Session 的区别

发表于 2016-03-18 | 分类于 网络请求 |
  1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。

  2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

  3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。

    阅读全文 »
custom header, leave empty to use the default one
  • 如何在Android上使用Https
123
fldroid

fldroid

23 日志
5 分类
19 标签
RSS
GitHub Weibo Jianshu E-Mail
友情链接
  • Linux.中国
  • 泡在网上的日子
0%
© 2015 — 2018 copyright all rights reserved
由 Hexo 强力驱动 v3.7.1
|
主题 — NexT.Gemini v6.2.0