Blog

  • Untitled post 1981

    一面在准备一些基础的算法,一面在准备语言相关,泛技术渣太苦逼了,在准备两种语言PHP和Java,而我最近一直在做是却是C++,是不是相当奇葩。。。

  • 关于Java类的hashCode和equals方法

    前面两篇文章中提到了利用哈希表的数据结构,如HashMap,HashSet等,这些数据结构利用对象的hashCode和equals函数来识别对象是否相同,原则如下:
    * hashCode不同的对象一定不同
    * hashCode相同的对象不一定相同
    比方说HashMap,查找元素时,会先以key的hashCode来查找,如果找到对象,然后再以equals方法来判定是否相等,如果相等,才返回相应的value。
    自定义数据结构做key时,需要成对的实现两个函数才可以正确的使用利用哈希表实现的数据结构。

  • Java中HashSet, TreeSet, LinkedHashSet区别

    三个结构都实现了Set接口,不允许含有重复元素。
    * HashSet是用哈希表实现的,增删查的复杂度都是O(1),不能保证元素的顺序
    * TreeSet是用一个树形结构实现(红黑树),增删查的复杂度为O(log(n)),维护一个排序的Set,可以用 first(), last(), headSet(), tailSet()等获取最大最小的元素。
    * LinkedHashSet是用链表+哈希表实现,因为是Linked,所以可以保持插入的顺序,增删查复杂度都是O(1)

  • Java中ArrayList,Vector,LinkedList区别

    三种结构都实现了Collection接口和List接口。而LinkedList还实现了Queue接口。
    内部实现区别:
    * ArrayList可以理解为一个可变长度数组,特点是内存连续,随机访问快,插入、删除慢,扩展容量时,每次增加原容量的50%;
    * Vector可以理解为线程安全的ArrayList,扩展容量时,每次容量翻倍;
    * LinkedList实现上为一个双向链表,随机访问慢,插入、删除快。
    refrence: http://www.programcreek.com/2013/03/arraylist-vs-linkedlist-vs-vector/

  • 内存数据更新策略总结

    因为后台线程更新数据,而前台继续服务,所以涉及数据共享的问题。

    解决方案大致有以下几种:

    1. 使用读写锁
    2. 开辟两份内存,reload时来回切换
    3. 在reload的时候开辟一块内存,切换之后,等待一段时间,前台线程全部切换为新内存后,把老内存释放

    方法1效率相对低下,不考虑。

    方法2完全可以满足需求,并且不用担心前台线程引用到不可用的数据,如果是配置文件之类,完全没有问题,但是如果占用内存比较可观时,成本较高,可行性不高。

    方法3效率高且不需要长期占用双份内存,是较好的方法,但是在实践中,还是需要注意一些问题:

    • 读取数据的线程,需要将一个临时指针指向使用的数据(不要使用成员指针),防止在查询过程中(可能有遍历等比较费时的操作)内存被更新的问题,可能导致程序core掉。
    • sleep的时间尽可能长些,以等待后台线程更新内存(要考虑到如果更新线程每次是新起的话,更新间隔不能太小,如果是单一线程,就不用考虑这问题)
  • wdlinux面板wdcp失效的问题

    前些日子帮一个朋友恢复wdcp的数据,恢复完成之后发现站点操作全部执行失败,仔细找了一天无果。后来将wdcp的wdapache、wdphp打开错误日志,看到了一个sudo相关的错误,本来就知道应该是权限导致的问题,现在sudo的错误提示更说明了这一点。
    于是乎打开sudo的配置文件/etc/sudoers,发现home是有特殊权限的,于是将home分区重新加载到别的分区,然后在wdcp系统面板中更改了新分区,问题解决。
    以前一直没想明白面板用户是怎样管理别的用户的文件的,我太傻了,可以sudo嘛,当然为了安全起见,最好在/etc/sudoer里指定用户可以执行的命令。

  • Bash速成

    条件语句(注意:条件里两边的空格,引号,等号)

    if [ “$var” = “abc” ]; then

    elif [ “$var” = “ac” ]; then

    else

    fi

    for循环

    for var in $(ls *.sh); do
    echo $var
    done

    while循环

    var=1
    while [ “$var” -le 20 ] ; do
    var=$(($var+1))
    done

    until循环(跟while循环相反的)

    until condition
    do

    done

    case条件(可用正则,;;相当于break)

    case “$var” in
    yes | YES | y )
    echo “YES”
    echo “haha”
    ;;
    [Nn]* ) echo “NO”;;
    * ) echo “OTHER”;;
    esac

    定义/赋值变量

    var=xxx  (等号两边不能有空格)

    变量读取

    echo $var

    读取用户输入

    read var

    不输出换行

    echo -n

    执行命令并捕获返回值

    $(command)

    其它

    shell里默认类型是字符串型

  • php json_encode utf-8中文问题

    utf-8字符json_encode为变成转成utf16编码,也就是介个样子:

    $ ./php/bin/php -r 'echo json_encode("中文");'
    "u4e2du6587"

    可读性降低,最新的php 5.4的json_encode支持了UTF-8编码,可以把中文不编码直接输出。
    那低版本怎么办呢?也有办法,封装成一个函数给大家分享一下:

    function my_json_encode($var) {
        return preg_replace("/\u([a-f0-9]{4})/e",
          "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($var));
    }
  • 北京市管公积金打印缴存证明方法

    好多同学都不知道,写下来,希望有帮到不知道的同学:

    • 向公司管薪酬的hr咨询本公司公积金的管理处
    • 带身份证到相应的管理处打印即可
    • 朝阳管理处打印完之后需要到咨询台盖章
    • 搞定..

    朝阳管理处上班时间:

    上午9:00 下午13:30