开源

悠然乱弹:竹子与开源:扎根是为了长得更高

↘锁芯ラ 提交于 2019-12-07 20:50:08
端午节到了,人们都在讨论屈原不屈不挠的精神,以及龙舟、粽叶等世界文化遗产。粽叶清淡,给人无限的遐想。或者,你很容易想起和粽叶形状比较类似的竹叶,以及屹立挺拔的骨感竹子。竹在清风中瑟瑟的声音,在夜月下疏朗的影子,都让文人墨客深深感动。而竹于风霜凌厉中苍翠依然的品格,更让诗人引为同道。苏东坡曾在《于潜僧绿筠轩》里宣称,“宁可食无肉,不可居无竹。无肉令人瘦,无竹令人俗。人瘦尚可肥,士俗不可医。”当年郑板桥曾作《竹石》,细细品味,也给人许多思考。 作为开源参与者,其实我们可以联想到很多和竹子相关的典故,以及和竹子相关的精神。端午节前,困顿的晌午,我决定穿越时空,会一会屈原。 一、对话屈原 为此,我溯江而上,穿越雄伟险峻的长江西陵峡,抬头眺望长江北岸,有一座气势雄伟的建筑,半遮半掩在桔林与翠柏之中,这便是世人瞩目的屈原祠。 拾级而上,来到屈原祠里,一番膜拜之后,我准备与屈原做一次详谈。“屈大夫,我不想继续做Tiny框架了,你能给我一个让我坚持的理由吗?”我问。 屈原回答 : “你看看我的祠堂四周,看到那些山蕨和竹子了吗?去年我播种了山蕨和竹子的种子后,给它们光照和水分。山蕨很快就从地面长出来,茂密的绿叶覆盖了地面。然而,竹子却什么也没长出来。一年过去了,山蕨长得更加茂密。竹子的种子仍然没有长出任何东西。 2 年过去了,竹子的种子还是没有发芽。 然而,到了第 5 年,地面上冒起了一个细小的萌芽

打造一个全命令行的Android构建系统

谁说胖子不能爱 提交于 2019-12-07 13:42:00
IDE都是给小白 程序员 的,大牛级别的程序员一定是命令行控,终端控,你看大牛都是使用vim,emacs 就一切搞定” 这话说的虽然有些绝对,但是也不无道理,做开发这行要想效率高,自动化还真是缺少不了命令行工具,因为只有命令行才是最佳的人机交互工具。其实IDE也是底层也是调用命令行工具而已,只不过给普通开发者呈现一个更友好的开发界面。这里可不是宣扬让大家放弃IDE都改命令行,只是每种事物都有他存在的理由,无论是编程语言还是工具都是一个原则 “没有最好的,只有最合适的”。 前一段时间做一个人产品,发布产品的时候为了统计各渠道流量免不了要构建不通的渠道包,你懂得国内渠道上百个,靠IDE编译打包非吐血不可。这些重复劳动最适合交个程序来做,很多程序员想不明白这个问题,宁愿把大量的精力时间花在业务上,却不知道用工具 提高工作效率 。在这里写一篇简单的教程,告诉大家怎么脱离IDE环境完成一个android项目的编译构建,有了这基础开发什么自动化构建工具都不是什么难事了, 前一阵子做的一个打包html5应用的在线工具 AppBuilder 就是基于命令行构建完成的。 说到命令行自然是不需要图形界面,所以Android SDK的安装下载自然都是在终端上进行。下面是本文中使用的一些SDK和基本环境。 ubuntu server 14.04 (64位) JDK 1.7 android-sdk_r24

最简单的方式开发一个高并发服务器

可紊 提交于 2019-12-07 12:01:18
1.包含头文件 #include "frame/netserver/NetServer.h" #include "frame/netserver/NetHost.h" 2.从NetServer派生自己的服务器类GameServer 3.在构造函数中设置要监听的端口,实现OnMsg回调方法 GameServer.h /** * 数据到达,回调方法 * * 派生类实现具体断开连接业务处理 * */ void OnMsg(mdk::NetHost* pClient); GameServer.cpp TestServer::TestServer() { Listen(8888); } void GameServer::OnMsg(mdk::NetHost* pClient) { unsigned char c[256]; unsigned short len = 100; /* 读取数据长度,长度不足直接返回,等待下次数据到达时再读取 */ if ( !pClient->Recv( c, len, false ) ) return; pClient->Send( c, len );//收到消息原样回复 } 4.使用GameServer类 int main() { GameServer ser; ser.Start(); ser.WaitStop(); return 0; } 5

NetHost指针访问安全专集(基于mdk1.10)

百般思念 提交于 2019-12-07 12:01:06
NetHost是服务器引擎的2大接口类之一,而且是由引擎维护其对象的创建与释放, 用户使用不当可能造成访问野指针或者内存泄露。 为了让使用mdk的朋友,安全的使用NetHost指针,本文写提出一些安全的使用模型。 首先说明一下,如果担心NetHost使用不当,可以完全放弃NetHost,引擎的另外一大接口类NetServer已经提供了SendMsg()与CloseConnect()方法,用于安全的操作主机的连接,只要传递HostID进去(可以通过NetHost->ID()方法得到)即可,ID只是一个int值,不存在内存泄露与野指针问题。 接收数据,在OnMsg中使用参数的NetHost指针是绝对安全的,引擎已经做好控制。 开始NetHost的安全访问 NetHost表示一个连接上来的主机,该类主要就是2个作用send发消息close断开连接,另外提供方便的Group操作 为了避免方法野指针和内存泄露,主要要了解NetHost对象的生存周期 NetHost对象在连接建立时被创建 连接断开(不管是server断开,还是client断开)后被移动到关闭列表(代码中就是m_closedConnects里面), 后台有一个释放线程,会循环定时去检查这个列表中的指针,如果对象的访问计数为0,则释放掉对象 对象什么时是绝对安全的(不会被释放) 1.被作为参数传递给OnConnect OnMsg

Tachyon:Spark生态系统中的分布式内存文件系统

牧云@^-^@ 提交于 2019-12-06 21:12:34
Tachyon是Spark生态系统内快速崛起的一个新项目。 本质上, Tachyon是个分布式的内存文件系统, 它在减轻Spark内存压力的同时,也赋予了Spark内存快速大量数据读写的能力。Tachyon把内存存储的功能从Spark中分离出来, 使Spark可以更专注计算的本身, 以求通过更细的分工达到更高的执行效率。 本文将先向读者介绍Tachyon在Spark生态系统中的使用, 也将分享百度在大数据平台上利用Tachyon取得的性能改善的用例,以及在实际使用Tachyon过程中遇到的一些问题和解决方案。最后我们将介绍一下Tachyon的一些新功能。 Tachyon简介 Spark平台以分布式内存计算的模式达到更高的计算性能,在最近引起了业界的广泛关注,其开源社区也十分活跃。以百度为例,在百度内部计算平台已经搭建并运行了千台规模的Spark计算集群,百度也通过其BMR的开放云平台对外提供Spark计算平台服务。然而,分布式内存计算的模式也是一柄双刃剑,在提高性能的同时不得不面对分布式数据存储所产生的问题,具体问题主要有以下几个: 当两个Spark作业需要共享数据时,必须通过写磁盘操作。比如:作业1要先把生成的数据写入HDFS,然后作业2再从HDFS把数据读出来。在此,磁盘的读写可能造成性能瓶颈。 由于Spark会利用自身的JVM对数据进行缓存,当Spark程序崩溃时

NetHost::Recv方法使用专集(基于mdk1.10)

╄→尐↘猪︶ㄣ 提交于 2019-12-06 20:21:27
为什么将此方法特别弄一个专集,因为在通信软件领域中,数据接收一直是一个比较有复杂的事情,处理的好不好,直接影响到程序效率。 本文就是为了介绍NetHost::Recv配合mdk这套引擎,如何方便的解决了传统通信软件中在数据接收这一块上遇到的各种瓶颈 瓶颈1:等待数据的方式 循环sleep、阻塞recv、事件触发(例如select epoll) 他们的缺点 循环sleepcpu吃紧 阻塞recv占用业务线程 事件触发,不知道有多少可读数据,如果数据不完整,读出数据需要用户自己维护 NetHost的解决方案 NetHost有自己的接收缓冲,mdk引擎收到数据首先放入NetHost的接收缓冲,然后触发OnMsg。 因为底层已经在接收了,所以recv永不阻塞,数据不够直接返回,等下次数据到达时,OnMsg会再次被触发 瓶颈2:一个完整消息被分成多次到达 来1次收1次,记录上次接收状态,用户自己拼包 缺点 用户得自己维护已接收的数据,相当于一个接收缓冲,这个缓冲必须随着连接的建立与断开创建与删除,维护代价昂贵 NetHost的解决方案 NetHost::Recv比传统的recv方法增加一个bClearCache参数,告诉Recv接收到数据后,是否将数据从接收缓冲删除 bClearCache为true时,与传统recv方法效果一样,比如到达数据123456789 recv 2 byte

开源 免费 java CMS

我与影子孤独终老i 提交于 2019-12-06 17:31:40
项目地址: http://code.google.com/p/freecms/ 系统配置 管理系统使用的配置项。 从左侧管理菜单点击系统配置进入。 从FreeCMS 1.7开始支持 数据变更后栏目页面静态化间隔时间 ( 单位为分 ) :修改栏目、更新信息时当选择静态化栏目页面时,系统会自动静态化栏目页面的第一页,然后会根据此配置添加静态化任务,比如此配置设置为10,系统会生成一个10分种后执行的静态化任务来处理此栏目页面所有页的静态化。 来源: oschina 链接: https://my.oschina.net/u/916014/blog/207768

开源 免费 java CMS

陌路散爱 提交于 2019-12-06 17:25:04
项目地址: http://code.google.com/p/freecms/ 栏目管理 栏目是系统频道某一类内容的集合体。 您可以在频道中设置多个一级栏目,在一级栏目中添加多个二级栏目……。FreeCMS的栏目设置具有无级分类功能。 1. 添加一级栏目 从左侧管理菜单点击栏目管理进入。 点击“添加根栏目” 输入相关属性点击“保存”即可。 操作成功后,提示是否静态化本栏目页面、本栏目父栏目页面、站点首页。 提示 : 1. 本栏目页面静态化:选择将会对本栏目进行静态化页面处理。 2 . 本栏目的所有父栏目页面静态化:选择将会对此本栏目的所有父栏目(不包含本栏目)进行静态化页面处理。 3 . 站点首页静态化:选择将会对此栏目的所属站点进行首页静态化处理。 2. 编辑栏目 选择需要编辑的栏目。 点击“编辑” 输入相关属性点击“保存”即可。 操作成功后,提示是否静态化本栏目页面、本栏目父栏目页面、站点首页。 3. 添加下级栏目 点击需要添加下级栏目的栏目,如“根栏目” 点击“添加下级” 填写相关属性后点击“保存”即可。 操作成功后,提示是否静态化本栏目页面、本栏目父栏目页面、站点首页。 4. 转移栏目 为了方便用户使用,FreeCMS提供了改变栏目结构的简便方法,使您在想对栏目结构作出调整时不需要删除重建栏目。 选择需要改变所属栏目的栏目,如“根栏目” 点击“转移” 选择需要调整的位置,如

轻触开源(四)-Gson项目源码解析_叁

我只是一个虾纸丫 提交于 2019-12-06 14:01:31
ReflectiveTypeAdapterFactory完成Field属性之后,将生成TypeAdapter返回。Gson通过Adapter来生成指定类型的对象。生成对象的过程,被ReflectiveTypeAdapterFactory.Adapter类记录在自己的read方法中: @Override public T read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } T instance = constructor.construct(); try { in.beginObject(); while (in.hasNext()) { String name = in.nextName(); BoundField field = boundFields.get(name); if (field == null || !field.deserialized) { in.skipValue(); } else { field.read(in, instance); } } } catch (IllegalStateException e) { throw new JsonSyntaxException(e); } catch

轻触开源(三)-Gson项目源码解析_贰

久未见 提交于 2019-12-06 14:01:20
转载请注明出处:https://my.oschina.net/u/874727/blog/750473 Q:1025250620 非墨上一篇文文章说到:Gson通过传入的TypeToken类型,遍历Gson变量中的factorys工厂,来生成一个TypeAdapter的转换器。本章将细化这个生成过程。我们依旧沿用上一次所定义的Json对象和Java数据模型,通过一个典型的例子来学习一下:在Gson项目中,是如何做到数据适配和转换的。 // code Java public static class ClassRoom{ public String roomName; public int number; public String toString() { return "["+roomName+":"+number+"]"; } } public static class User{ public String name; public int age; private ClassRoom room; @Override public String toString() { // TODO Auto-generated method stub return name+"->"+age+":"+room; } } ... //code main String strJson = "