Markdown

Markdown-plus

http://mdp.tylingsoft.com/

stackedit

http://stackedit.io  GitHub(http://github.com/benweet/stackedit)

stackedit beta

http://stackedit-beta.herokuapp.com/

UML/Chart

flowchart.js

http://adrai.github.io/flowchart.js/

js-sequence-diagrams

http://bramp.github.io/js-sequence-diagrams/

CodeUml

http://www.codeuml.com/

YUml

http://yuml.me

draw.io (可视化编辑)

http://draw.io

Gliffy (可视化编辑)

http://www.gliffy.com

LucidChart

http://www.lucidchart.com

IDE

CodeBox

http://www.codebox.io

ACE

http://ace.c9.io

Cloud9

http://c9.io

Project Information

Project Name:

WP Code Highlight.js1

Github Home:

https://github.com/owent/WP-Code-Highlight.js

Plugin Home:

http://wordpress.org/plugins/wp-code-highlightjs/

Description:

This is a plugin of Wordpress using Highlight.js2 to make codes on posts, articles or any web pages more beautiful and easier to read.

This plugin allow you to load Highlight.js from local web server or some of public CDN we collected.

To make you easier to migrate from SyntaxHilighter and Google Prettify to Highlight.js, this plugin will provide some compatible mode so that you need not to change any code on your old web pages. They will be converted automaticly.

At the same time, WP Code Highlight.js also allow you to set options of Highlight.js in the setting page of your wordpress. And we also provide some other useful options.For example, you can use only common language package

目录

C++ 的Lambda表达式

C++ 11 标准发布,各大编译器都开始支持里面的各种新特性,其中一项比较有意思的就是lambda表达式。

语法规则

C++ 11 Lambda表达式的四种声明方式

  1. \[ capture \]( params ) mutable(optional) exception attribute -> ret { body }
  2. \[ capture \]( params ) -> ret { body }
  3. \[ capture \]( params ) { body }
  4. \[ capture \]{ body }
  • capture是外部引用的参数
  • params是函数参数
  • 后面可以跟一些函数修饰符
  • ret是返回值类型,如果不指定,会推断一个类型
  • body部分是函数内容 具体用法可以参照C++文档,这里就不复述了

这四个声明式都会返回一个匿名的仿函数实例)。 这里有一个比较重要的一点,就是他是一个仿函数实例,而不是直接一个函数

在项目开发过程中,时不时会碰上需要使用一些工具来做一些自动操作或者附加功能。特别是有一些外部组件只会提供Web工具,或者如果产品会发布在Web上的时候,在线上的产品中加调试指令显然是不安全的(前段时间刚好有携程线上服务器暴露的调试接口,导致用户信息泄露的事故)。这时候我们就可以借助Chrome来制作一些特别的小工具。 使用Chrome来自作工具有几个好处:其一是对熟悉Web开发的人而言,它用得全是Javascript(当然你也可以用Go语言)和HTML,没有太多额外的学习成本,而且现在的Chrome对HTML5标准支持得也比较好,基本的功能都可以实现;其二是不需要花多少时间在UI方面(作为一个后台开发表示The easier the better);其三是在需要的时候,还能开发为App,直接运行(另外还有一个项目叫Nodejs-webkit,提供了打包成不依赖Chrome本地应用的功能,而且底层用了nodejs,提供了更加强大的系统资源访问的功能)。总而言之,作为开发工具而言已经绰绰有余了。

偶尔写写ACM水题还是挺好玩的。(好吧其实是老婆求助我才看滴)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006

一开始看到这题的时候,感觉一天24小时60分钟60秒。把每一秒的最小指针角度记下来再搞个排序。

每个case二分搜一下就好啦。

结果发现最后一个case的结果始终是错的。

详情及变更请参照: Linux 编译安装 GCC 4.9

GCC4.9发布啦,本脚本在之前4.8的基础上做了稍许改进,更新 PS:4.9.0 开始支持C++1y特性 GCC 4.9 的大致变更如下,因为我只用C/C++所以更关注**通用性高的C和C++**的部分啦:

虽然以前玩过一部分,后来没耐心就停止了。但是记下来给大家瞧瞧还是挺有意思的 http://www.pythonchallenge.com http://www.notpron.com/ http://www.gamemastertips.com/cipher/cipher.htm http://riddle.arthurluk.net/index.php http://www.csie.ntu.edu.tw/~b94102/game/game.htm

最近稍微学习了下Tex,就顺带再记一下Tex的一些资源 公式编辑器(支持其他Tex语法): http://www.codecogs.com/latex/eqneditor.php 公式编辑器: http://zh.numberempire.com/texequationeditor/equationeditor.php

Latex编辑器:http://jaxedit.com/

它们都用到了MathJax这个东东: http://www.mathjax.org/

简介

众所周知,单元测试对于持续集成和变更的检测是十分重要的。 这个单元测试框架本是用于之前规划的C++协程框架使用的。 虽然已经有比较成熟的单元测试框架GTest、Boost.Test等等,但是要引入它们都会倒入很多文件。而且他们的兼容性也不是很好 GTest在ARM架构下需要额外作一些适配 Boost.Test的话,按Boost的尿性,一旦引入就会涉及上千个文件

今年准备安安心心写一个协程库。一方面是觉得协程挺有意思,另一方面也是因为C/C++在这方面没有一个非常权威的解决方案。 按照我自己风格还是喜欢C++,所以协程库定名为 libcopp 。 源码托管在 github: https://github.com/owent/libcopp 镜像托管 http://git.oschina.net/owent/distinctionpp

首先介绍: 什么是协程

协程(coroutine),是一种用户态模拟线程的组件。(具体说明参见:http://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B

回顾一下2013年学习和看到的技术、思路、方案总结:

Native Code 型语言

C/C++

脚本语言

lua

javascript

  • 《从Javascript到Typescript到Node.js》 – 闲来无事学习的新东西,javascript一直被诟病说拓展性太强了,导致容易失去了约束而整体混乱。这些个东西一个是javascript扩展工具,一个是javascript的经典应用

bash & shell

熟悉了一些sed和awk的使用,看到书上说perl是专门设计来替代awk的,什么时候研究下

C++11标准里有动态模板参数已经是众所周知的事儿了。但是当时还有个主流编译器还不支持。 但是现在,主要的编译器。VC(Windows),GCC(Windows,Linux),Clang(Mac,IOS)都已经支持了。所以就可以准备用于生产环境了。 type_traits没啥好说的。主要是一些静态检测。主要还是要看动态模板参数和他们两的结合使用上。 动态模版参数标准文档见: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdfhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2555.pdf 虽然贴出来了。估计是没人看得。所以就直接说重点。

前几天我们项目的日志系统出现了一点问题,但是一直没有时间去深究。 昨天在同事的帮助下,无意中猜了一种可能性,结果还真被我猜中了,于是今天就特别研究了一下,记录下来。

其实主要问题是三个模块。

  • 模块 a, 静态库 a
  • 模块 b, 二进制 b, 静态引用a, 动态加载c
  • 模块 c, 动态链接库c, 静态引用a

关键在于静态库a里有一个静态全局变量,没错就是我们的日志模块。 原先的这个静态的模块中的静态全局变量是有构造函数的,也就是构造函数干了点事情。

用过std和boost的function对象和bind函数的童鞋们都知道这玩意用起来腰不酸了,腿不疼了,心情也舒畅了。先上一个简单得示例:

std::string str;
std::function func = std::bind(&std::string::at, &str);
bool is_empty = func();

但是这是怎么做到的呢?看完源码以后,你会发现这里面有着一些很巧妙的设计。

在某个神奇的下午,收到一个垃圾邮件(至少被邮件系统当成了垃圾邮件)。

结果就一不小心看到了这个充满回忆的ACM模式竞赛,还有咱腾讯的,就忍不住看了一下。

果然好久没碰算法,脑子是会生锈的。

第一题大水,懒得写。

第二题伤了很久的脑筋,想出了一个算法结果ultramanhu基于此想出了个更容易理解更容易实现的方法。

以我这种懒人的本性,必须是也懒得写得。

项目里面引入了Lua,就特别学习了一下。

其实对于理解Javascipt的人来说,Lua也很容易理解,因为他们太多的地方相像了。

初步看来,Lua的设计模式和思想很像Javascript,也是原型模型(Javascript里叫prototype,Lua里是metatable

接上一篇 VC和GCC内成员函数指针实现的研究(二)

虚继承

终于到最后的虚继承了。

测试代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

class foo_a
{
public:
    virtual ~foo_a(){}
    virtual void info() {
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    }

    void print(){
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    }
};

class foo_l
{
public:
    int l;
    foo_l(): l(1){}

    virtual void info() {
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    }
};

class foo_r: virtual public foo_a
{
public:
    int r;
    foo_r(): r(2){}
};

class foo_c: virtual public foo_l, public foo_r
{
public:
    virtual void info() {
        printf("%d,%d. %s:%d\n", l, r, __FUNCTION__, __LINE__);
    }
};


int main(int argc, char* argv[]) {
    void (foo_a::*vptr1)() = &foo_a::info;
    void (foo_l::*vptr2)() = &foo_l::info;
    void (foo_a::*ptr)() = &foo_a::print;

    foo_c c;
    foo_r r;
    foo_a a;

    printf("pword size = %d\n", (int)(sizeof(size_t)));
    printf("address of &foo_a::info = 0x%llxH\n", &foo_a::info);
    printf("pointer to &foo_a::info = 0x%llxH\n", vptr1);
    printf("sizeof vptr = %d\n", (int)(sizeof(vptr1)));

    (a.*vptr1)();
    (r.*vptr1)();
    (c.*vptr1)();
    (c.*vptr2)();
    c.info();

    (c.*ptr)();

    return 0;
}

VC虚继承成员函数指针实现

因为是兼容虚继承和非虚继承的,所以赋值的部分的汇编是一样的。这里就不贴了。关键在于执行期它是怎么找到虚基类的。请往下看:

接上一篇 VC和GCC内成员函数指针实现的研究(一)

接下来是多重继承,用到的测试代码如下所示:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

class foo_a
{
public:
    virtual ~foo_a(){}
    virtual void info() {
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    }
};

class foo_b
{
public:
    virtual ~foo_b(){}

    // 这个函数用于试foo_b的结构与foo_a不同
    // 以防止VC对foo_a和foo_b的`vcall'{8}'的代码合并
    virtual void inspect() { 
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    } 

    virtual void info() {
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    }

    void print() {
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    }
};


class foo_c: public foo_a, public foo_b
{
public:
    virtual void info() {
        printf("%s:%d\n", __FUNCTION__, __LINE__);
    }
};


int main(int argc, char* argv[]) {
    void (foo_a::*vptr1)() = &foo_a::info;
    void (foo_b::*vptr2)() = &foo_b::info;
    void (foo_b::*ptr)() = &foo_b::print;

    foo_c c;
    foo_b b;
    foo_a a;

    
    printf("word size = %d\n", (int)(sizeof(size_t)));
    printf("address of &foo_a::info = 0x%llxH\n", &foo_a::info);
    printf("pointer to &foo_a::info = 0x%llxH\n", vptr1);
    printf("address of &foo_b::info = 0x%llxH\n", &foo_b::info);
    printf("pointer to &foo_b::info = 0x%llxH\n", vptr2);
    printf("sizeof vptr = %d\n", (int)(sizeof(vptr1)));

    (a.*vptr1)();
    (b.*vptr2)();
    (c.*vptr1)();
    (c.*vptr2)();

    (c.*ptr)();

    return 0;
}

VC多重继承成员函数指针实现

最近在《C++对象模型》一书里说到的virtual的成员函数指针,低于128的被cfront编译器认为是虚表偏移量(支持子类对父类函数的覆盖)。VC只是提了下单继承、多继承和虚继承的实现方案不同,GCC没有提及,所以就专门稍微深入分析研究下他们的实现机制。

今天看到一个小例子,发现了一个小trick。见代码:

#include 
#include 

class base_1
{
public:
    int a;
};

class base_2
{
public:
    int b;
};

class base_3: public base_1, public base_2
{
public:
    int c;
};

int main(int argc, char* argv[]) {

    printf("&base_1::a = %p\n", &base_1::a);
    printf("&base_2::b = %p\n", &base_2::b);
    printf("&base_3::a = %p\n", &base_3::a);
    printf("&base_3::b = %p\n", &base_3::b);
    printf("&base_3::c = %p\n", &base_3::c);


    base_3 t;
    t.a = 1;
    t.b = 2;
    t.c = 3;

    typedef int (base_3::*tip);
    tip pm = NULL;

    printf("base_3::a = %d\n", t.base_3::a);
    printf("base_3::b = %d\n", t.base_3::b);
    printf("base_3::c = %d\n", t.base_3::c);

    pm = &base_3::a;
    printf("base_3::a(%p) = %d(ptr)\n", pm, t.*pm);
    pm = &base_3::b;
    printf("base_3::b(%p) = %d(ptr)\n", pm, t.*pm);
    pm = &base_3::c;
    printf("base_3::c(%p) = %d(ptr)\n", pm, t.*pm);

    return 0;
}

猜猜看这个代码输出什么? 答案是:

最近看了glibc的ptmaoolc,Goolge的tcmalloc和jemalloc,顺便做了一点记录。可能有些地方理解地不太对,如有发现还请大神指出。

操作系统内存布局

各种malloc的内存分配管理方式离不开操作系统的内存布局策略。