• Android之视频编解码

    media

    不吹不黑,我的多媒体基础非常之薄弱,自己也意识到这方面的知识要恶补。最近由于工作上的需求,我也在弄编解码的东西。这篇blog主要的目的就是把最近理解到的东西记录下来,主要内容包括MediaExtractor、MediaCodecs以及Android上的硬件加速。


    • MediaExtractor

    为什么要从MediaExtractor开始说起呢?其实有两方面的原因,首先是它比较简单,其次它常常是视频编解码的第一个步骤。从功能上讲,MediaExtractor其实就是一个高配InputStream。它的作用就是读取音视频文件,然后按照一定的格式输出出来。废话不多说,我们先看一段使用的MediaExtractor的代码,然后结合代码分析。

     MediaExtractor extractor = new MediaExtractor();
     extractor.setDataSource(...);
    【查看更多】
  • 理解消息中间件

    本文出自:【InTheWorld的博客】

    消息中间件(Message-oriented middleware)是一类基础通信软件,它可以为分布式应用或者系统提供异步、松耦合、高可靠性、可扩展并且安全的通信功能。

    这段话出自《ActiveMQ in Action》,算是对消息中间件比较准确的定义。虽然这句话只有不到两行,却很值得我们仔细分析。

    1. 异步性

    image

    在分布式系统中,应用需要通过网络的方式协作。协作的典型方式就是通过RPC,RPC的实现方式有很多种,但有一点很确定——RPC是同步的。所谓的同步,是指请求返回时,请求的任务已经完成。区别于RPC这种同步的方式,消息中间件旨在实现一种异步的模式。看看下图就能发现消息中间件的异步特点。

    image

    异步模式与同步模式之间其实没有绝对的优劣,需要根据场景来讨论。比如在高并发的场景,由于同步模式的阻塞特性,可能会导致服务的【查看更多】

  • 使用RxJava遇到的问题

    本文出自:【InTheWorld的博客】

    timg

    越用RxJava,越觉得它好用,所以不知不觉地发现代码里到处都是RxJava的身影。然而,RxJava也不是银弹,其中仍然有很多问题需要解决。这里,我简单地总结一下自己遇到的一些“坑”,内容上可能会比较松散。

    • 考虑主线程的切换

    RxJava中一个常用的使用方法是——在其他线程中做处理,然后切换到UI线程中去更新页面。其中,线程切换就是使用了observeOn()。后台下载文件,前台显示下载进度就可以使用这种方式完成。然而,实践发现这其中有坑。如果文件比较大,而下载包的粒度又比较小,这将导致很多通知积压下来,最终导致错误。

    这种错误其实也是可以理解的,毕竟MainLooper是根据Message来工作的,Message过多必然会导致一些问题。当然,这还是比较想当然的想法,最终还是需要… 【查看更多】

  • 使用Python进行网络测试

    本文出自:【InTheWorld的博客】

    上周,同学让我帮忙写一个测试网络的工具。由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本。其实,我Python用的比较少,所以基本都是边查资料边写程序。程序的主要逻辑如下:读取一个excel文件中的ip列表,然后使用多线程调用ping统计每个ip的网络参数,最后把结果输出到excel文件中。代码如下所示:

    #! /usr/bin/env python
    # -*- coding: UTF-8 -*-
    # File: pingtest_test.py
    # Date: 2008-09-28
    # Author: Michael Field
    # Modified By:intheworld
    # Date: 2017-4-17
    import sys
    import os
    import getopt
    import commands
    import subprocess
    import re
    import time
    【查看更多】
  • 由Spring引发的小总结

    本文出自:【InTheWorld的博客】

    aa6f195de38c385d9e66185d2f9e9d48

    最近两年,微服务成为了后端最火的概念。Spring boot和Spring cloud也成为了微服务浪潮的有力推动者。以至于,多年来裹足不前的Java EE也将在今年推出新版本。个人拙见,微服务其实就是分布式服务端系统的一种实践方式。微服务的火爆也体现了后端技术的不断发展,开发者开始着眼于系统的扩展性、稳定性、可用性等等的多重指标,而不仅仅是为了实现目前的需求。

    后端技术博大精深,以我现在的水平很难全面地给出总结。所以在此,我从自己的一些实践感受出发,谈一些理解。当然,我会以Spring全家桶作为参考对象,因为Spring的生态圈相对比较全面。

    1. 重量级 VS 轻量级

    首先明确一下,这里的“重量”和“轻量”指的是对“细节标准”的实现程度。“细节标准”是区别于“标准的细节”。“细节标准”常常作用于“大标准”的子空间里。如果过度地支持这些细节标准,一方面有… 【查看更多】

  • ZooKeeper事务流程源码分析<1>

    本文出自:【InTheWorld的博客】

    ZooKeeper

    利用过年这几天的一些空余时间,把《从PAXOS到ZOOKEEPER分布式一致性原理与实践》看了一遍。对ZooKeeper有了一个大致的了解。ZooKeeper作为Chubby的开源实现,在当前的分布式生产环境中有着广泛的应用。使用ZooKeeper可以方便的实现Dynamic DNS、微服务架构中的服务路由以及为其他分布式系统提供支撑(如Kafka, HBase)。

    作为个人关于ZooKeeper的第一篇blog,我准备分析一下ZooKeeper的事务流程。事务处理是ZooKeeper的一大重要功能。在ZooKeeper事务流程实现中,所有的事务请求都需要从Leader Server协调完成。因此,从ZooKeeper的Leader Sever来分析事务流程更为简单。

    首先分析LeaderZooKeeperServer类,它是ZooKeeperServer的子类,一个该类型的实… 【查看更多】

  • Android触控之驱动层与应用层

    本文出自:【InTheWorld的博客】

    触控技术算是现代智能硬件的一大特征。作为一种输入方式,触摸系统与其他输入设备(如键盘)其实非常相似。写这篇blog的初衷并不是要实现触屏驱动移植。而是看《Android内核剖析》等书的时候,发现他们都没有仔细分析触摸系统的整个流程。在这篇博客中,我打算把Android触控技术从硬件驱动到应用层大致分析一下。

    本文以GT810触屏为例进行分析,虽然我手头并没有这个板子。分析原理当然还是要从硬件分析起来了,首先简单地看下电路图吧!

    image

    就是这么简单,重点就在I2C接口和中断CAP_INT。其中I2C总线的作用是数据传输,可以实现触摸屏的初始化以及触摸数据的传输。CAP_INT连接到CPU的中断PIN脚上,用于通知CPU来读取触摸数据。有人画了一张不错的流程图,我贴在下面:

    gt810

    驱动代码的一大特征就是格式统一,毕竟是架构是内核规定好的。所以,在熟悉了套路之后,我分析驱动代码的… 【查看更多】

  • MINA拆包问题的简单讨论

    本文出自:【InTheWorld的博客】

    mina

    前面有写过一篇简单的关于Netty的粘包和拆包问题,这里扯扯Mina。讲真,我对Mina其实不熟悉,但作为网络框架,和Netty什么的还是挺相似的。使用Mina处理报文数据的时候,也是通过添加自定义filter来实现的。对应与本文所讨论的拆包问题,就是ProtocolCodecFilter。

    而ProtocolCodecFilter的构造函数有两个,分别是:

    public ProtocolCodecFilter(ProtocolCodecFactory factory) 
    
    public ProtocolCodecFilter(final ProtocolEncoder encoder, final ProtocolDecoder decoder) 
    

    如果使用的是第一个构造函数,就需要注意一些问题了。这个工厂类的作用就是产生encoder和decoder类。这里所说的协议使用了length字段来解决拆包和粘包问题。在拆包的情况下,会出现… 【查看更多】

  • Linux下矩阵键盘驱动分析与移植

    本文出自:【InTheWorld的博客】

    首先要介绍一下Linux中input子系统的模型,一图胜千言,所以直接上图。

    input_subsys

    上图一目了然,我们的键盘驱动就是工作在input子系统的最低层。单纯地从驱动角度讲,我们的工作就是最终调用input_event()这个函数,把扫描到的键值传递给input core层。然后的事情就不是我们考虑的了,这样一来感觉很轻松的样子。

    好吧!正式开工了!首先说明一下硬件环境,我用的是友善之臂的tiny210开发板。出厂配置的内核是没有加入矩阵键盘的。不过驱动代码是有的,所以在menuconfig里面配置矩阵键盘。说实话,这工作真的很弱智的样子。为什么呢?因为210处理器上是有一个键盘控制器一样的东西。什么扫描,消抖都是硬件在干。唯一需要改动的地方就是键盘的键值表。默认的驱动里面只用44的键值数据,但是我要用的键盘要88才行。

    然后我们分析一下驱动的结构,键盘在210上是作为一个平台设备存在的。那么… 【查看更多】

  • Java的序列化实现解析

    本文出自:【InTheWorld的博客】java_logo

    对于Java自带的对象序列化,我并没有仔细研究过它的实现机制。对于Java默认的序列化机制,它的最大优点就是简单方便。你需要做的仅仅是对需要序列化的POJO增加一句implement Serializable,最多最多再增加一行serialVersionUID。其他的事情就不用我们操心了。那么Java默认的序列化机制是如何实现的呢?答案就是——反射。

            Person person = new Person(25, "Tim");
            FileOutputStream fos = new FileOutputStream("Person.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(person);

    上面这段代码是典型的默认序列化使用方式。玄机就… 【查看更多】