• Android开发中的一些零散纪录

    最近一段时间,主要是在解一些bug,所以精力都分散在了不同的问题上。也是很久一段时间没有写blog了,这里记录一下最近debug过程中的一些知识点。

    1. 使用CircleImageView时,Glide第一次无法加载出正常的图片

    这个 bug的具体原因,我还不太清楚,留到以后再探讨了。后来参考StackOverflow上的回答解决了问题。主要的代码片段如下

    Glide.with(this.getApplicationContext())
    .load(url)
    .asBitmap()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .placeholder(R.drawable.default_avatar)
    .into(new SimpleTarget<Bitmap>() {
    @Override
    public void onResourceReady(Bitmap
    【查看更多】
  • Java Annotation——由butterknife想到

    butterknife是Android开发中应用非常广泛的一个库。butterknife库主要利用了Java中的注解功能,可以提高Android应用的开发效率,毕竟没几个人会喜欢写那种冗长乏味的页面布局、事件连接的代码。首先,还是给一个典型的butterknife使用代码:

        @BindView(R.id.btn)
        TextView mBtn;

    这两行代码,就实现了把布局文件与TextView连接起来的功能,看起来确实非常简单。那么这么方便的功能是如何实现的呢?首先,还是看一个简答的例子,代码如下:

    SimpleAnnotation.java
    package basicTest;
    import java.lang.annotation.*;
    import static java.lang.annotation.ElementType.FIELD;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    【查看更多】
  • 并发设计模式:Actor-based与Task-based

    前面一段时间,瞄了一下《七周七并发模型》。感叹还是有很多语言不会,导致有的章节现在还没法看。但是,Actor并发模型还是给我留下了比较深的印象,因为它适合应用于分布式架构,而且具有很好的容错性。和Actor-based相对应的模型就是Task-based。

    Actor-based与Task-based的含义

    Actor-based和Task-based的含义要从”计算“的内涵说起,”计算“包含两个要素:

    • 用来进行工作的线程
    • 进行工作所需的信息

    因为,线程主动地对信息进行计算处理,所以我们把线程作为计算的“主体”,把信息作为计算的“客体”。对应到并发模型中,Actor-based模型注重主体,而Task-based注重客体。

    Task-based模式的思想与实现

    在Task-based模式中,工作线程之间通过对”客体“的同步操作,并发地完成计算任务。常见的情况下,各个线程引用同一个信息客体,而且… 【查看更多】

  • 多线程程序之线程私有数据

    在C/C++的多线程程序中,所有的线程共享相同的地址空间。所以数据段和进程堆的数据,都可以被所有线程读写。在极端情况下,线程的栈空间也可以被共享。只有线程的寄存器上下文算是真正私有的。对于某些变量,我们希望它在不同的线程中具有不同的值,这就是线程私有数据的用途。

    对于普通的全局变量,或者通过指针或引用实现的共享,其实在内存中只存在一个备份。而进程私有数据则相当于一种Map型的变量,根据线程的id,线程私有变量对应于不同的值。

    /*
     * tsd_once.c
     *
     * Demonstrate use of pthread_once to initialize something
     * exactly once within a multithreaded program.
     *
     * Note that it is often easier to use a statically initialized
     * mutex to accomplish
    【查看更多】
  • JavaScript对象及函数机制

    看Angular.js时候感觉JavaScript水平吃紧,所以需要充点电咯!我个人对JavaScript这语言的看法是,既简单有复杂。简单在语言特性少,复杂在灵活性太大。花了几天看大致看完了《JavaScript语言精粹》。这本书也大致定位为JavaScript的进阶读物,所以还是有一些收获的。当然书中也还是有一些不清楚甚至不正确的东西。

    一切都还是要从proto变量开始,这是JavaScript很多语言特性的基础。

    1. 对象是“名/值”对的集合,JavaScript中的对象都有一个proto变量。
    2. 对象字面量的proto连接到Object.prototype;函数对象的proto连接到Function.prototype。
    3. Function.prototype.proto连接到Object.prototype。

    4. Object.prototype本身是一
    【查看更多】
  • Java的字符编码

    想到这个问题的缘由是如下这段代码:

        String inputStr = "abc";
        byte[] input = inputStr.getBytes();
        System.out.println(input.length);
    

    按照我的常识,Java的String类使用的是utf-16编码。在BMP平面的字符都是可以使用两个字节表示的,四个字节的情况并不常见。对于例子中的inputStr,它应该占用六个字节的存储空间。但是这段程序的执行结果是3。

    这是为什么呢?原来String类还有一个getBytes(String charset)方法。直接调用String.getBytes()相当于调用String.getBytes(Charset.getDefaultCharset())。在中文操作系统下,一般的默认编码都是GBK。

    首先需要明确的是,中文编码GB18030GBKGB2312ASCII,这里的大于号是兼容包含的含义。在三个中文编码标准中,除了128个ASCII是一个字节外,其他都是两个字节。所以中文编码严格算来也是变长编码格式。然而这些中文… 【查看更多】

  • 网络编程中的若干盲点

    • 服务器套接字和连接套接字的区别

            其实看UNP的时候,我根本没有仔细思考这两个概念的区别。然后学习Java网络编程的时候就很好奇,Java的ServerSocket和Socket设计的初衷是什么呢?其实在Socket的本地api并没有对这两者做很大区分。事实上,他们都是使用socket()调用创建的,所以他们的内存布局应该都是一样的。两者的正真区别体现在listen调用和connect调用(两者都可以使用bind调用,虽然连接套接字的很少会这样使用)。一个非常直观的概念是服务器套接字是一个由本地端口和本地ip地址组成的二元组(严格来说还包含协议),而连接套接字这是由本地端口、本地ip地址、远程端口和远程ip地址组成的四元组。

    • 主动连接套接字也可使用bind绑定本地ip和端口

            客户端socket也可以主动绑定ip地址和端口,一个很常见的应用就是主动模式的ftp协议。ftp服务器的数据连接… 【查看更多】

  • 解析Google Analytics机制

    前几天准备在这个博客上装一个Google Analytics插件,虽然我知道这里其实没有人访问的(人艰不拆)。然后我就非常好奇GA的原理,因为WebSocket才出来没多久,以前的异步信息到底是怎么传递的呢?按照我一贯的小猫钓鱼风格,我决定来一探究竟。
    首先还是去找了Google Urchin的代码看,对Javascript的语法不太习惯,看得有点云里雾里。不过还是看出来一点端倪,就是Image。简单来说,在客户端JavaScript中new一个Image对象,然后指定它的src属性,可以引起浏览器对图片的动态加载。聪明的工程师们就是利用了这样一个特性(URL中包含的信息)最终实现的客户端信息的动态传递。听起来也是挺简单的,何不尝试做一个demo呢?
    前面学过一点三脚猫水平的node.js,这里就选… 【查看更多】

  • 安卓-指南针

    这个安卓指南针其实是《Learning Android》一书中的一个例子,但是由于api的变更,代码在新版本中是不能通过编译的。我查找了一些新版本的资料,把原书中的例子更新了一下,发现结果也不太对。程序运行时,指针一直不停的抖动,根本没有实现方向定位的功能。究其原因还是对api的没有了解透彻。实现定位功能的代码如下:

        public void onSensorChanged(SensorEvent event) {
            if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                accelerometerValues = event.values;
                Log.i("Compass","Got acceleration: " + event.values[0] +"   "+ event.values[1] +" " + event.values[2]);
            }
            if(event.sensor.getType()
    【查看更多】
  • C++智能指针

    今天复习了一下智能指针,然后动了动脑子,恍然觉得以前并没有真正的理解智能指针。首先是shared_ptr,shared_ptr的作用就不做介绍了。那么shared_ptr是如何实现的呢?我分析了一下,智能指针的要点就是“计数”和“指针”。所以智能指针的成员变量中就必须有计数值和对象指针。

    指针计数为零的时候自动销毁,所以析构函数中需要实现计数和对象销毁的功能。然后还要注意的就是复制构造函数和复制函数(operator=)。想起来觉得也不难实现,于是就动手写了个丑陋版shared_ptr。

    #include <iostream>
    
    namespace toy{
    template<class T>
    class shared_pointer{
    
    public:
        template<class Y> explicit shared_pointer(Y* p) {
            px = p;
    【查看更多】