捣鼓一个协程库
今年准备安安心心写一个协程库。一方面是觉得协程挺有意思,另一方面也是因为C/C++在这方面没有一个非常权威的解决方案。 按照我自己风格还是喜欢C++,所以协程库定名为 libcopp 。 源码托管在 github: https://github.com/owent/libcopp 镜像托管 http://git.oschina.net/owent/distinctionpp
今年准备安安心心写一个协程库。一方面是觉得协程挺有意思,另一方面也是因为C/C++在这方面没有一个非常权威的解决方案。 按照我自己风格还是喜欢C++,所以协程库定名为 libcopp 。 源码托管在 github: https://github.com/owent/libcopp 镜像托管 http://git.oschina.net/owent/distinctionpp
最近研究了一下ARM的交叉编译环境搭建,太麻烦了必须作一下记录啊。 前两个方法比较简单一点,关键是淫家Google帮你弄好了大部分功能
使用Android NDK的第一步当然是下载Android NDK啦。 http://developer.android.com/tools/sdk/ndk/index.html 使用jni的话,还必须下载相应的Android SDK http://developer.android.com/sdk/index.html 下载完后可以使用 $ANDROID_SDK_ROOT/sdk/tools/android update sdk –no-ui 来更新SDK包 附注:ANDROID_SDK_ROOT指代Android SDK根目录,NDK_ROOT指代Android NDK根目录。下同。 为了方便可以把$ANDROID_SDK_ROOT/sdk/tools:$ANDROID_SDK_ROOT/sdk/platform-tools:$NDK_ROOT 加到环境变量PATH里去 另外,Android 如果要命令行编译,需要ant和ant扩展,需要安装 Android 依赖的32位库 大致上是 glibc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-* jdk 其中 libc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-* 可以用 yum install或apt-get install 安装 jdk最好是官网下一个rpm包安装 rpm -ivh *.rpm
使用代码生成代码是一件十分美妙的事情,于是有了各种代码生成器。但是生成代码,意味着要有对生成规则的分析和处理。 Boost.Spirit 就是这么一个语法分析工具,它实现了对上下文无关文法的LL分析。支持EBNF(扩展巴科斯范式)。 Boost.Spirit 的使用真的是把模板嵌套用到了极致。确实这么做造成了非常强的扩展性,生成的代码也非常高效,但是嵌套的太复杂了,对于初学者而言真心难看懂。 你能想象在学习阶段一个不是太明白的错误导致编译器报出的几十层模板嵌套错误信息的感受吗?而且,这么复杂的模板嵌套还直接导致了编译速度的巨慢无比。 其实在之前,我已经使用过Spirit的Classic版本,即1.X版本,但是过多的复制操作让我觉得当时用得很低效,还好分析的内容并不复杂所以没。体现出来 这回就来研究下功能更强劲的2.X 版本。
C++11的新标准已经出台,各个编译器已经开始陆续支持。 主流编译器支持程度见(VC++, gcc, clang, intel c++等):http://en.cppreference.com/w/cpp/compiler_support
但是要让C++11应用与生产环境还需时日,所以就在这里记录一下在过渡时期可能用到的一些重要功能
C++在效率上有个硬伤。我们知道C#和Java对于类传递都是以引用的方式,而C++默认都是传值。在传值过程中就经常会进行复制构造,这完全没必要而且浪费CPU,为了解决这种问题,于是乎C++11 增加了一个新的非常数引用(reference)类型,称为右值引用(R-value reference)。我就专门看了一下关于右值引用的东西。 右值引用在GCC 4.3之后开始支持,VS 2010(VC 10.0)已经支持,再前一点的VC版本没试过所以不知道。 右值引用的申明标记为T &&,主要用于处理临时变量,比如函数返回的变量(暂时想不出其他例子,忽略返回值优化吧,(命名)返回值优化参见http://efnetcpp.org/wiki/Return_value_optimization,再说返回值优化能力有限是吧,比要求如单返回语句、不能使用异常等等),避免复制构造。同时在析构的时候就不会析构这个临时变量,从而提升效率。 上代码:
详见: Linux编译安装GCC 4.7
系统:
现在的web的js开发很方便啊,但是碰到iframe里的东西还是不方便看到变量的内容,所以就写了这么个看json内容的玩意,还可以当控制台输出用。
学校做项目顺便写的,还是有点用的。
/***
* JQuery扩展插件--提示信息
*
* 本函数用于创建提示信息
*
* Example
* <code>
* var t = $.noticeMessage(msg, a, b);
* </code>
*
*
* function noticeMessage([msg, a,b])
* @Param {
* msg: 信息内容(默认: Notice Message!)
* a: 配置选项({expire: 过期时间(默认5秒), time: 过渡时间, from: {起始CSS样式}, to:{最终CSS样式}})
* b: 回调函数
* }
* @Return {jQuery(msgDiv): 产生的信息DOM组件的jQuery容器}
*
*
* Example:
* <code>
* var t = $.noticeMessage("Hello World!");
* </code>
*
*
* @Author OWenT
* @Version 1.0
* @Link http://www.owent.net
*/
jQuery.extend({
noticeMessage: function (msg, a, b) {
msg = msg || "Notice Message!";
var option = { "expire": 5000, "time": 500,
"from": { "background-color": "LightGreen", "opacity": "0", "position": "fixed", "bottom": "0px", "z-index": "1000",
"font-size": "24px", "color": "DarkGreen", "padding": "3px", "font-weight": "bold"
},
"to": { "opacity": "1", "bottom": "+5px" }
};
var callback = function () { };
if (a && jQuery.isFunction(a))
callback = a;
else {
a = a || {};
jQuery.extend(option, a);
callback = b || function () { };
}
var msgDiv = document.createElement("div");
jQuery(msgDiv).css(option.from).html(msg);
jQuery(document.body).append(msgDiv);
jQuery(msgDiv).stop().animate(option.to, option.time, callback);
if (option.expire > 0) {
setTimeout(function () {
if (msgDiv) {
jQuery(msgDiv).stop().animate({ "opacity": "0", "bottom": "-5px" }, option.time,
function () { callback(); jQuery(this).remove(); });
}
}, option.expire);
}
return jQuery(msgDiv);
}
});
写在最后补充一下,这个动机基本没什么用了
这是学校USRP项目需要而写的一个类,但是既然写出来了,以后也可能用到,就共享出来吧。
这个类用于解析网页URL的QueryString参数,或者也可以当做操作一些其他设置的类库。