有没有人一起来做这个?用纯C写一个MQTT服务器

RT.
https://github.com/Markgorden/cmqttd
 
 
另外,我打算基于这个https://github.com/Markgorden/ ... ework库编写
 
因为
https://github.com/Markgorden/ ... ing.c
我认为这是目前效率最高的二进制协议Buffer处理方式。
come on, star 快来。 
 
继续阅读 »
RT.
https://github.com/Markgorden/cmqttd
 
 
另外,我打算基于这个https://github.com/Markgorden/ ... ework库编写
 
因为
https://github.com/Markgorden/ ... ing.c
我认为这是目前效率最高的二进制协议Buffer处理方式。
come on, star 快来。 
  收起阅读 »

招聘路由器软件工程师

工作地点:上海漕河泾开发区
工作内容:高通方案AP软件开发
目标人群:3-5年嵌入式软件开发经验,如有路由器软件开发经验最好。
联系人: 
工作地点:上海漕河泾开发区
工作内容:高通方案AP软件开发
目标人群:3-5年嵌入式软件开发经验,如有路由器软件开发经验最好。
联系人: 

多款开源软件硬件,助力攻城狮实现iot产品开发

目录:
第一章:开源硬件
智能宠物屋
智能桌上足球
闪键

第二章   :BT/BLE设备接入参考实现
BT/BLE设备接入参考实现App for iOS源码
BT/BLE设备接入参考实现App for andriod源码

第三章:多款iot开源APP
空气净化器
智能云空调
智能插座
智能热水器
智能中控灯
智能灯
净水器 

智能硬件,或者说大家所讲的物联网,纵向方向涉及到的行业知识很多,从下到上大概有传感器、 MCU、通讯模组(BLE、ZigBee、WiFi 等)、APP、M2M 服务、数据存储、报表分析、数据挖掘、云对接等,往往一个初创团队,没有办法迅速在每个点都投入资源。
此时,不妨借助一下机智云(GizWits),借助一下机智云提供的 GoKit 原型、开源硬件案例、以及多款iot开源app,这个原型已经打通了上 述的每一个环节,并且开源 GoKit 相关技术和资料,同时也提供了根据这个原型快速开发新产品的方法。

第一章:开源硬件[ 软件名称 ] 智能宠物屋
[ 下载地址 ]MCU for GoKit STM
MCU for GoKit 2代 STM
MCU for GoKit 2代 Arduino
[ 授权协议 ] MIT
[ 软件介绍 ] 30分钟开发智能硬件,通过机智云的开发平台定义了一款通过WiFi自动报告宠物动向和自动优化宠物居住环境的宠物屋。通过自动生成的App,立即可以直接控制用GoKit开发板实现的宠物屋。
 

[ 软件名称 ] 智能桌上足球
[ 下载地址 ]MCU代码托管:https://git.oschina.net/dantang/Smart_Foosball-MCU
业务云:https://git.oschina.net/dantan ... Cloud
网站:http://smartfoosball.com/
转载注明出处:http://club.gizwits.com/thread-3290-1-1.html

[ 授权协议 ] MIT
[ 软件介绍 ] 可以将普通桌上足球改造成可社交化的智能产品。通过微信邀约好友参加比赛,实时显示比分,微信分享比赛结果,还可以实时拍摄赛况。

[ 软件名称 ] 植物宝
植物宝可根据植物当前所处环境对自身的生长状况做出检测和判断,然后通过语音播放,告诉人类,自己是否需要浇灌。以后即便你一个人在家,也不会只有你一个声音啦!
相关源码:https://pan.baidu.com/s/1mgxcvjE


闪键
闪键是一个物理快捷键。可放置家中或是办公室。具有一键通话、一键短信、一键遥控家里灯、家电等···实现自定义绑定,轻松开启真正的便捷生活。
相关源码:https://pan.baidu.com/s/1dD3wpPZ

第二章    BT/BLE设备接入参考实现
[ 软件名称 ] BT/BLE设备接入参考实现App for iOS源码
[ 下载地址 ] https://github.com/gizwits/GizDataAccessDemo-iOS
[ 授权协议 ] MIT
[ 软件介绍 ] BT/BLE设备接入机智云iOS客户端示例源码,包含蓝牙设备数据上传云端,云端下载同步数据等功能的参考实现,开发者可通过此开源程序学习物联网硬件相关的App实现方法。

[ 软件名称 ] BT/BLE设备接入参考实现App for Android源码
[ 下载地址 ] https://github.com/gizwits/Giz ... droid
[ 授权协议 ] MIT
[ 软件介绍 ] 
BT/BLE设备接入机智云Android客户端示例源码,包含蓝牙设备数据上传云端,云端下载同步数据等功能的参考实现,开发者可通过此开源程序学习物联网硬件相关的App实现方法。



第三章:多款开源APP
多款开源APP,助力开发者实现iot app开发。

机智云空气净化器空气污染是每个城市人所面临的最大健康威胁,就算你在室内你也需要时刻关注空气质量情况。

智能空气净化器,不仅是一个手机遥控器,它会告诉你当前所在空间的空气质量情况,根据室外空气质量建议你应该开窗通风还是关窗净化空气

源码链接 for iOS
源码链接 for Android


智能云空调
用最简单的方式随时随地控制家里的空调。情景化室内温度调节,你再也不需要半夜起床关闭空调。特有的电量统计功能,以可视化的方式了解空调用电量, 并制定最适合自己的节电策略。
源码链接 for iOS
源码链接 for Android

 

机智云插座
通过智能插座可对所有接入插座的设备进行开关电源操作,除了实时的远程操作,还可以通过设定预约时间进行重复、自动或者倒计时的开关操作。后台还提供了能耗管理的参考实现。
源码链接 for iOS
源码链接 for Android

 

机智云热水器
机智云智能电热水器开源公版App。支持远程开启/关闭热水器,设定目标水温及实时监控当前水温。通过预约用水功能,可以倒计时预约用水和设定用水时间让热水器自动工作。内置了包括智能模式、节能模式、速热模式、加热模式、保温模式、安全模式等自动调节模式。
源码链接 for iOS
源码链接 for Android

 

机智云智能中控灯
中控智能灯通过一个中控设备连接网络,所有灯泡作为子设备以网状结构组网。通过App可以对灯泡进行添加、删除和分组的操作,以实现灯泡的单个或分组控制。利用定时预约功能,可对单个灯泡或分组进行倒计时或定时的开启/关闭操作。灯泡支持亮度调节。
源码链接 for iOS
源码链接 for Android

 

机智云智能灯
这是一款使用XPGWifiSDK的开源代码示例APP,可以帮助开发者快速入手,使用XPGWifiSDK开发连接机智云的物联APP。 该APP针对的是智能家电中的灯泡类产品,包括了以下几点灯泡常用功能: 1.灯泡电源的开关 2.灯泡色温模式和色彩模式的切换 3.灯泡亮度的设置 4.灯泡色彩的设置 5.当前模式的获取和显示
源码链接 for iOS
源码链接 for Android

 


机智云净水器 
机智云智能净水器开源公版App,是针对智能家电中净水器类的产品。通过App可以操控净水器进行净水或冲洗滤芯。可以看到净水器设备运行状态和滤芯各部分的使用情况。当滤芯需要更换时,就会提醒更换并且可以看到滤芯的哪部分是需要更换的。
源码链接 for iOS
源码链接 for Android
继续阅读 »
目录:
第一章:开源硬件
智能宠物屋
智能桌上足球
闪键

第二章   :BT/BLE设备接入参考实现
BT/BLE设备接入参考实现App for iOS源码
BT/BLE设备接入参考实现App for andriod源码

第三章:多款iot开源APP
空气净化器
智能云空调
智能插座
智能热水器
智能中控灯
智能灯
净水器 

智能硬件,或者说大家所讲的物联网,纵向方向涉及到的行业知识很多,从下到上大概有传感器、 MCU、通讯模组(BLE、ZigBee、WiFi 等)、APP、M2M 服务、数据存储、报表分析、数据挖掘、云对接等,往往一个初创团队,没有办法迅速在每个点都投入资源。
此时,不妨借助一下机智云(GizWits),借助一下机智云提供的 GoKit 原型、开源硬件案例、以及多款iot开源app,这个原型已经打通了上 述的每一个环节,并且开源 GoKit 相关技术和资料,同时也提供了根据这个原型快速开发新产品的方法。

第一章:开源硬件[ 软件名称 ] 智能宠物屋
[ 下载地址 ]MCU for GoKit STM
MCU for GoKit 2代 STM
MCU for GoKit 2代 Arduino
[ 授权协议 ] MIT
[ 软件介绍 ] 30分钟开发智能硬件,通过机智云的开发平台定义了一款通过WiFi自动报告宠物动向和自动优化宠物居住环境的宠物屋。通过自动生成的App,立即可以直接控制用GoKit开发板实现的宠物屋。
 

[ 软件名称 ] 智能桌上足球
[ 下载地址 ]MCU代码托管:https://git.oschina.net/dantang/Smart_Foosball-MCU
业务云:https://git.oschina.net/dantan ... Cloud
网站:http://smartfoosball.com/
转载注明出处:http://club.gizwits.com/thread-3290-1-1.html

[ 授权协议 ] MIT
[ 软件介绍 ] 可以将普通桌上足球改造成可社交化的智能产品。通过微信邀约好友参加比赛,实时显示比分,微信分享比赛结果,还可以实时拍摄赛况。

[ 软件名称 ] 植物宝
植物宝可根据植物当前所处环境对自身的生长状况做出检测和判断,然后通过语音播放,告诉人类,自己是否需要浇灌。以后即便你一个人在家,也不会只有你一个声音啦!
相关源码:https://pan.baidu.com/s/1mgxcvjE


闪键
闪键是一个物理快捷键。可放置家中或是办公室。具有一键通话、一键短信、一键遥控家里灯、家电等···实现自定义绑定,轻松开启真正的便捷生活。
相关源码:https://pan.baidu.com/s/1dD3wpPZ

第二章    BT/BLE设备接入参考实现
[ 软件名称 ] BT/BLE设备接入参考实现App for iOS源码
[ 下载地址 ] https://github.com/gizwits/GizDataAccessDemo-iOS
[ 授权协议 ] MIT
[ 软件介绍 ] BT/BLE设备接入机智云iOS客户端示例源码,包含蓝牙设备数据上传云端,云端下载同步数据等功能的参考实现,开发者可通过此开源程序学习物联网硬件相关的App实现方法。

[ 软件名称 ] BT/BLE设备接入参考实现App for Android源码
[ 下载地址 ] https://github.com/gizwits/Giz ... droid
[ 授权协议 ] MIT
[ 软件介绍 ] 
BT/BLE设备接入机智云Android客户端示例源码,包含蓝牙设备数据上传云端,云端下载同步数据等功能的参考实现,开发者可通过此开源程序学习物联网硬件相关的App实现方法。



第三章:多款开源APP
多款开源APP,助力开发者实现iot app开发。

机智云空气净化器空气污染是每个城市人所面临的最大健康威胁,就算你在室内你也需要时刻关注空气质量情况。

智能空气净化器,不仅是一个手机遥控器,它会告诉你当前所在空间的空气质量情况,根据室外空气质量建议你应该开窗通风还是关窗净化空气

源码链接 for iOS
源码链接 for Android


智能云空调
用最简单的方式随时随地控制家里的空调。情景化室内温度调节,你再也不需要半夜起床关闭空调。特有的电量统计功能,以可视化的方式了解空调用电量, 并制定最适合自己的节电策略。
源码链接 for iOS
源码链接 for Android

 

机智云插座
通过智能插座可对所有接入插座的设备进行开关电源操作,除了实时的远程操作,还可以通过设定预约时间进行重复、自动或者倒计时的开关操作。后台还提供了能耗管理的参考实现。
源码链接 for iOS
源码链接 for Android

 

机智云热水器
机智云智能电热水器开源公版App。支持远程开启/关闭热水器,设定目标水温及实时监控当前水温。通过预约用水功能,可以倒计时预约用水和设定用水时间让热水器自动工作。内置了包括智能模式、节能模式、速热模式、加热模式、保温模式、安全模式等自动调节模式。
源码链接 for iOS
源码链接 for Android

 

机智云智能中控灯
中控智能灯通过一个中控设备连接网络,所有灯泡作为子设备以网状结构组网。通过App可以对灯泡进行添加、删除和分组的操作,以实现灯泡的单个或分组控制。利用定时预约功能,可对单个灯泡或分组进行倒计时或定时的开启/关闭操作。灯泡支持亮度调节。
源码链接 for iOS
源码链接 for Android

 

机智云智能灯
这是一款使用XPGWifiSDK的开源代码示例APP,可以帮助开发者快速入手,使用XPGWifiSDK开发连接机智云的物联APP。 该APP针对的是智能家电中的灯泡类产品,包括了以下几点灯泡常用功能: 1.灯泡电源的开关 2.灯泡色温模式和色彩模式的切换 3.灯泡亮度的设置 4.灯泡色彩的设置 5.当前模式的获取和显示
源码链接 for iOS
源码链接 for Android

 


机智云净水器 
机智云智能净水器开源公版App,是针对智能家电中净水器类的产品。通过App可以操控净水器进行净水或冲洗滤芯。可以看到净水器设备运行状态和滤芯各部分的使用情况。当滤芯需要更换时,就会提醒更换并且可以看到滤芯的哪部分是需要更换的。
源码链接 for iOS
源码链接 for Android 收起阅读 »

ADLIST说明

Redis大婶的Adlist
相对Linux 内核链表,有点好处是,它多了几个API,可以用。
一个是 链表长度。
一个是 可以指定对比的回调函数。方便查找元素。

我加了一个方法,清空整个链表,但是不清空头指针,即与listRelease不同。
/* Free the elements that whole list, the list head is still in memory.
* This function can't fail. */
void listReleaseAllElements(list *list)
{
    unsigned long len;
    listNode *current, *next;
    current = list->head;
    len = list->len;
    while(len--) {
        next = current->next;
         if (list->free) list->free(current->value);
         free(current);
        current = next;
    }
   list->len = 0;
    //free(list);  // listRealse把这个也清空掉了,在需要把整个链表清空, 再加入数据时,就不适用了。
}

在头文件中添加
#ifdef __cplusplus
extern "C"{
#endif

….


#ifdef __cplusplus
}
#endif
以便在c++中使用。
 
 
 
 
继续阅读 »
Redis大婶的Adlist
相对Linux 内核链表,有点好处是,它多了几个API,可以用。
一个是 链表长度。
一个是 可以指定对比的回调函数。方便查找元素。

我加了一个方法,清空整个链表,但是不清空头指针,即与listRelease不同。
/* Free the elements that whole list, the list head is still in memory.
* This function can't fail. */
void listReleaseAllElements(list *list)
{
    unsigned long len;
    listNode *current, *next;
    current = list->head;
    len = list->len;
    while(len--) {
        next = current->next;
         if (list->free) list->free(current->value);
         free(current);
        current = next;
    }
   list->len = 0;
    //free(list);  // listRealse把这个也清空掉了,在需要把整个链表清空, 再加入数据时,就不适用了。
}

在头文件中添加
#ifdef __cplusplus
extern "C"{
#endif

….


#ifdef __cplusplus
}
#endif
以便在c++中使用。
 
 
 
  收起阅读 »

开源项目:桌上足球

桌上足球可以将普通桌上足球改造成可社交化的智能产品。通过微信邀约好友参加比赛,实时显示比分,微信分享比赛结果,还可以实时拍摄赛况。




MCU代码托管:https://git.oschina.net/dantang/Smart_Foosball-MCU

业务云:https://git.oschina.net/dantan ... Cloud

网站:http://smartfoosball.com/转载注明出处:http://club.gizwits.com/thread-3290-1-1.html
我们是一群狂热的桌上足球爱好者,我们也是一群有想法愿动手的程序猿。我们想让我们的比赛更好玩、更方便、更有激情,甚至是可以通过游戏认识更多的新朋友。

想做就做,这是创客的精神,我们把自己的想法与机智云智能硬件开发平台和微信的开放平台结合起来,再加上自己动手对机智云 GoKit 套件的简单改造,做出来了很酷的东西。

我们花了一个周末的时间把原型搭建起来了,接下来我们也许会产品化,也许只是给自己使用,但这又有什么关系呢?我们享受创造的过程,让创意的火花更亮一点吧!整体思路我们希望通过微信来发起一个赛事,让好友参与赛事挑战,选择好位置后就可以开始比赛了。球桌在改造后可以自动上报比分,球员在微信应用内可以看到实时的比赛情况,并在一局比赛结束后把比赛结果分享到朋友圈。

vs_hard2.jpg





微信应用

由于微信应用强大的社交功能和人群覆盖,我们决定不做自己的应用,而是在微信的开放平台上进行开发。玩家可以通过对球桌上的二微码扫描加入智能桌上足球的联盟,接下来玩家可以创建新的赛事并把它发送给好友进行比赛邀约。比赛的实时战况,以及最终的结果,都可以通过微信的好友或者朋友圈分享出去。还犹豫什么呢,快点来和我们一起比赛吧!

足球桌改造

硬件的改造也是一个关键点,我们采用了机智云 GoKit 开发套件,进行了简单的硬件修改,加入了 LED 显示和几个按键,同时对红外控测进行了重新编程。硬件的安装是个体力活,我们的动手能力也是要有32个赞哟!更多想象空间你看到的只是一个原型,我们还可以利用机智云提供的强大的数据服务,打造更多的精彩内容和功能。目前正在规划的有球员和球队的胜率统计和各种技术指标统计,另外还有就是联赛的功能,想起来都酷毙了!心动不如行动,如果你也有好的想法,请加入我们!



自己动手 DIY
硬件改造我们用的是机智云的服务,而机智云又正好提供了一块免费的开发板—GoKit,上面有一些常见的传感器和一块 WiFi 模块。由于 GoKit 自带的传感器还不太够用,于是我们决定对它进行一些改造。最主要的改动是我们加了两个红外传感器,用来感应进球,从而可以实现自动记分;另外我们还增加了一块 LED 显示屏,用来显示当前的分数。安装是个技术加体力的活,也最能反映创客和码农之间的区别。因为每张球台都不一样,你一定要发挥出色的观察和设计能力才能把它装好。

QQ截图20160815110708.png (431.89 KB, 下载次数: 0)

下载附件

半小时前 上传


软件部分我们的软件,包括这个网站,都是开源的。你可以在 GitHub 、Git@osc 上下载所有的代码。玩得开心!
继续阅读 »
桌上足球可以将普通桌上足球改造成可社交化的智能产品。通过微信邀约好友参加比赛,实时显示比分,微信分享比赛结果,还可以实时拍摄赛况。




MCU代码托管:https://git.oschina.net/dantang/Smart_Foosball-MCU

业务云:https://git.oschina.net/dantan ... Cloud

网站:http://smartfoosball.com/转载注明出处:http://club.gizwits.com/thread-3290-1-1.html
我们是一群狂热的桌上足球爱好者,我们也是一群有想法愿动手的程序猿。我们想让我们的比赛更好玩、更方便、更有激情,甚至是可以通过游戏认识更多的新朋友。

想做就做,这是创客的精神,我们把自己的想法与机智云智能硬件开发平台和微信的开放平台结合起来,再加上自己动手对机智云 GoKit 套件的简单改造,做出来了很酷的东西。

我们花了一个周末的时间把原型搭建起来了,接下来我们也许会产品化,也许只是给自己使用,但这又有什么关系呢?我们享受创造的过程,让创意的火花更亮一点吧!整体思路我们希望通过微信来发起一个赛事,让好友参与赛事挑战,选择好位置后就可以开始比赛了。球桌在改造后可以自动上报比分,球员在微信应用内可以看到实时的比赛情况,并在一局比赛结束后把比赛结果分享到朋友圈。

vs_hard2.jpg





微信应用

由于微信应用强大的社交功能和人群覆盖,我们决定不做自己的应用,而是在微信的开放平台上进行开发。玩家可以通过对球桌上的二微码扫描加入智能桌上足球的联盟,接下来玩家可以创建新的赛事并把它发送给好友进行比赛邀约。比赛的实时战况,以及最终的结果,都可以通过微信的好友或者朋友圈分享出去。还犹豫什么呢,快点来和我们一起比赛吧!

足球桌改造

硬件的改造也是一个关键点,我们采用了机智云 GoKit 开发套件,进行了简单的硬件修改,加入了 LED 显示和几个按键,同时对红外控测进行了重新编程。硬件的安装是个体力活,我们的动手能力也是要有32个赞哟!更多想象空间你看到的只是一个原型,我们还可以利用机智云提供的强大的数据服务,打造更多的精彩内容和功能。目前正在规划的有球员和球队的胜率统计和各种技术指标统计,另外还有就是联赛的功能,想起来都酷毙了!心动不如行动,如果你也有好的想法,请加入我们!



自己动手 DIY
硬件改造我们用的是机智云的服务,而机智云又正好提供了一块免费的开发板—GoKit,上面有一些常见的传感器和一块 WiFi 模块。由于 GoKit 自带的传感器还不太够用,于是我们决定对它进行一些改造。最主要的改动是我们加了两个红外传感器,用来感应进球,从而可以实现自动记分;另外我们还增加了一块 LED 显示屏,用来显示当前的分数。安装是个技术加体力的活,也最能反映创客和码农之间的区别。因为每张球台都不一样,你一定要发挥出色的观察和设计能力才能把它装好。

QQ截图20160815110708.png (431.89 KB, 下载次数: 0)

下载附件

半小时前 上传


软件部分我们的软件,包括这个网站,都是开源的。你可以在 GitHub 、Git@osc 上下载所有的代码。玩得开心! 收起阅读 »

sds例子程序

Redis大婶用的一个动态字符串类。
主要解决三个问题
1、strlen时,O(1);
2、字符串修改操作时,无需频繁地malloc与free。
3、二进制安全。
 
实现这货,用了很多技巧。
直接上代码。

SDS说明.png

 
继续阅读 »
Redis大婶用的一个动态字符串类。
主要解决三个问题
1、strlen时,O(1);
2、字符串修改操作时,无需频繁地malloc与free。
3、二进制安全。
 
实现这货,用了很多技巧。
直接上代码。

SDS说明.png

  收起阅读 »

从0到1:完成智能硬件产品的开发

硬件环境:
Gokit+Lark7618
 
 
 第  0  篇:     【原创】【魅力Gokit3】序列之0:裸照篇 
http://club.gizwits.com/thread-2972-1-1.html 

第  1  篇:     【原创】【魅力Gokit3】序列之1:与电脑约会
http://club.gizwits.com/thread-3026-1-1.html  

第  2  篇:     【原创】【魅力Gokit3】序列之2:Gokit3介绍
http://club.gizwits.com/thread-3136-1-1.html 

第  3  篇:     【原创】【魅力Gokit3】序列之3:wifi控制走起
http://club.gizwits.com/thread-3138-1-1.html 

第  4  篇:     【原创】【魅力Gokit3】序列之4:底板烧起
http://club.gizwits.com/thread-3141-1-1.html 

第  5  篇:     【原创】【魅力Gokit3】序列之5:机智“云”...
http://club.gizwits.com/thread-3145-1-1.html 

第  6  篇:     【原创】【魅力Gokit3】序列之6:搭建编译环境
http://club.gizwits.com/thread-3145-1-1.html 

第  7  篇:     【原创】【魅力Gokit3】序列之7:LED单灯闪烁
http://club.gizwits.com/thread-3145-1-1.html
 
具体可见:http://club.gizwits.com/thread-2973-1-1.html
继续阅读 »
硬件环境:
Gokit+Lark7618
 
 
 第  0  篇:     【原创】【魅力Gokit3】序列之0:裸照篇 
http://club.gizwits.com/thread-2972-1-1.html 

第  1  篇:     【原创】【魅力Gokit3】序列之1:与电脑约会
http://club.gizwits.com/thread-3026-1-1.html  

第  2  篇:     【原创】【魅力Gokit3】序列之2:Gokit3介绍
http://club.gizwits.com/thread-3136-1-1.html 

第  3  篇:     【原创】【魅力Gokit3】序列之3:wifi控制走起
http://club.gizwits.com/thread-3138-1-1.html 

第  4  篇:     【原创】【魅力Gokit3】序列之4:底板烧起
http://club.gizwits.com/thread-3141-1-1.html 

第  5  篇:     【原创】【魅力Gokit3】序列之5:机智“云”...
http://club.gizwits.com/thread-3145-1-1.html 

第  6  篇:     【原创】【魅力Gokit3】序列之6:搭建编译环境
http://club.gizwits.com/thread-3145-1-1.html 

第  7  篇:     【原创】【魅力Gokit3】序列之7:LED单灯闪烁
http://club.gizwits.com/thread-3145-1-1.html
 
具体可见:http://club.gizwits.com/thread-2973-1-1.html 收起阅读 »

为什么现在流行单进程单线程模型?

问:我发现,现在 居然这样的潮流 盛行了吗?

现在流行的软件模型,有向单钱程,单进程靠的意思。


如?redis,node.js.

不知道为何?

问题详细描述:
事件驱动模型中多路IO 收到 可读可写事件后,需要 回调一个 处理函数,这个处理函数得花时间。
这时候,高并发,也只能等待了。事件来了,你得处理啊。
同一进程处理,意味着处理函数阻塞掉了多路复用IO的回调处理。
我说的线程,并不是说要开多个线程去做工作线程。而是reactor模型,把收到的IO事件,发送到处理线程去处理。

答:
其实开多个线程,也是一样的。只是把队列,搬到用户态来了。
其实放在 内核态是一样的。内核态会维护一个IO列表,取一个处理一个,和取出来后,放到用户态的队列去一个个被处理,其实是一样的,单进程模型,还省下了数据复制与线程切换过程。

因为,单个请求速度没变,量大了就好处来了
线程创建开销很大
线程占2m内存
÷2m,就是线程模型的最大限制
线程间的切换也也非常消耗cpu。

另外:单线程是不是就处理不了事件优先级的问题了
Redis中,是这样的,处理不了了。但是它把 事件分为两类,一类时间事件,一类文件事件。
时间事件,有明显的延迟。
它貌似设计上无所谓。
延迟就延迟吧。


不同的语言是不同的。例如erlang这些,它的线程不同于java的线程,它的开销很小。

并且,不能神化单进程与单线程模型的作用。
单进程单线程要利用多核,就得开多个实例。
 
像Redis,就要注意以下三点:
1、避免大Value,元素过多的Value出现。
2、单机多实例,充分利用cpu多核。
3、单实例数据不要过大1~10G 
继续阅读 »
问:我发现,现在 居然这样的潮流 盛行了吗?

现在流行的软件模型,有向单钱程,单进程靠的意思。


如?redis,node.js.

不知道为何?

问题详细描述:
事件驱动模型中多路IO 收到 可读可写事件后,需要 回调一个 处理函数,这个处理函数得花时间。
这时候,高并发,也只能等待了。事件来了,你得处理啊。
同一进程处理,意味着处理函数阻塞掉了多路复用IO的回调处理。
我说的线程,并不是说要开多个线程去做工作线程。而是reactor模型,把收到的IO事件,发送到处理线程去处理。

答:
其实开多个线程,也是一样的。只是把队列,搬到用户态来了。
其实放在 内核态是一样的。内核态会维护一个IO列表,取一个处理一个,和取出来后,放到用户态的队列去一个个被处理,其实是一样的,单进程模型,还省下了数据复制与线程切换过程。

因为,单个请求速度没变,量大了就好处来了
线程创建开销很大
线程占2m内存
÷2m,就是线程模型的最大限制
线程间的切换也也非常消耗cpu。

另外:单线程是不是就处理不了事件优先级的问题了
Redis中,是这样的,处理不了了。但是它把 事件分为两类,一类时间事件,一类文件事件。
时间事件,有明显的延迟。
它貌似设计上无所谓。
延迟就延迟吧。


不同的语言是不同的。例如erlang这些,它的线程不同于java的线程,它的开销很小。

并且,不能神化单进程与单线程模型的作用。
单进程单线程要利用多核,就得开多个实例。
 
像Redis,就要注意以下三点:
1、避免大Value,元素过多的Value出现。
2、单机多实例,充分利用cpu多核。
3、单实例数据不要过大1~10G  收起阅读 »

几个Hash Table对比

几个Hash Table对比
1、https://github.com/redis/hiredis
/* -------------------------- hash functions -------------------------------- */
/* Generic hash function (a popular one from Bernstein).
* I tested a few and this was the best. */
static unsigned int dictGenHashFunction(const unsigned char *buf, int len) {
unsigned int hash = 5381;
while (len--)
hash = ((hash << 5) + hash) + (*buf++); /* hash * 33 + c */
return hash;
}








 
2、https://github.com/Markgorden/ ... ash.h

3、https://github.com/Markgorden/c_hashmap/blob/master/hashmap.c 
/*
* Hashing function for a string
*/
unsigned int hashmap_hash_int(hashmap_map * m, char* keystring){
unsigned long key = crc32((unsigned char*)(keystring), strlen(keystring));
/* Robert Jenkins' 32 bit Mix Function */
key += (key << 12);
key ^= (key >> 22);
key += (key << 4);
key ^= (key >> 9);
key += (key << 10);
key ^= (key >> 2);
key += (key << 7);
key ^= (key >> 12);
/* Knuth's Multiplicative Method */
key = (key >> 3) * 2654435761;
return key % m->table_size;
}


4、std::hash<std::string>
在std::hash_set 和std::unordered_map中使用。
template<class _Kty>
struct _Bitwise_hash
{ // hash functor for plain old data
typedef _Kty argument_type;
typedef size_t result_type;
size_t operator()(const _Kty& _Keyval) const
{ // hash _Keyval to size_t value by pseudorandomizing transform
return (_Hash_seq((const unsigned char *)&_Keyval, sizeof (_Kty)));
}
};
-------------
// FUNCTION _Hash_seq
inline size_t _Hash_seq(const unsigned char *_First, size_t _Count)
{ // FNV-1a hash function for bytes in [_First, _First + _Count)
#if defined(_WIN64)
static_assert(sizeof(size_t) == 8, "This code is for 64-bit size_t.");
const size_t _FNV_offset_basis = 14695981039346656037ULL;
const size_t _FNV_prime = 1099511628211ULL;
#else /* defined(_WIN64) */
static_assert(sizeof(size_t) == 4, "This code is for 32-bit size_t.");
const size_t _FNV_offset_basis = 2166136261U;
const size_t _FNV_prime = 16777619U;
#endif /* defined(_WIN64) *
/
size_t _Val = _FNV_offset_basis;
for (size_t _Next = 0; _Next < _Count; ++_Next)
{ // fold in another byte
_Val ^= (size_t)_First[_Next];
_Val *= _FNV_prime;
}
return (_Val);
}








 性能测试结果:
hash_test1.jpg

测下了uthash和unorder_map的效率比较
不在一个数量级

 
 
hash_test2.png

 2千万个,uthash扑街


hash_test3.png

 unorder_map正常



 
 
 
 测试姿势如下:
  g++ -O2 test_hash.cpp -o test_hash -lrt -std=c++0x  

 不知测试的姿势是否不对
 
-================================================================---
 
今天补了一下Redis大婶用的那货Dict.h/Dict.c
每个数据项如下。
 
typedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;
} dictEntry;
 
通用性强,赞
插入500W条记录时,性能乐观。
如图
dict500w.png


1千万条简直太慢了
 
./aaa 
Hello, World!
To insert twenty million
table size:10000000
value is 0
To insert twenty million time-consuming
consumption times :828685 microsecond.
-------------------------------
Began to traverse the read
There are number of elements: 10000000 
 
远低于unordered_map,主要怀疑我的测试姿势不对。

 
直接上测试代码。
 
 gcc -o aaa LinuxProject2_ADLISTtest.c dict.c -lrt

 
 
 
 
 
 
 
 
 
 
 
 
 
继续阅读 »
几个Hash Table对比
1、https://github.com/redis/hiredis
/* -------------------------- hash functions -------------------------------- */
/* Generic hash function (a popular one from Bernstein).
* I tested a few and this was the best. */
static unsigned int dictGenHashFunction(const unsigned char *buf, int len) {
unsigned int hash = 5381;
while (len--)
hash = ((hash << 5) + hash) + (*buf++); /* hash * 33 + c */
return hash;
}








 
2、https://github.com/Markgorden/ ... ash.h

3、https://github.com/Markgorden/c_hashmap/blob/master/hashmap.c 
/*
* Hashing function for a string
*/
unsigned int hashmap_hash_int(hashmap_map * m, char* keystring){
unsigned long key = crc32((unsigned char*)(keystring), strlen(keystring));
/* Robert Jenkins' 32 bit Mix Function */
key += (key << 12);
key ^= (key >> 22);
key += (key << 4);
key ^= (key >> 9);
key += (key << 10);
key ^= (key >> 2);
key += (key << 7);
key ^= (key >> 12);
/* Knuth's Multiplicative Method */
key = (key >> 3) * 2654435761;
return key % m->table_size;
}


4、std::hash<std::string>
在std::hash_set 和std::unordered_map中使用。
template<class _Kty>
struct _Bitwise_hash
{ // hash functor for plain old data
typedef _Kty argument_type;
typedef size_t result_type;
size_t operator()(const _Kty& _Keyval) const
{ // hash _Keyval to size_t value by pseudorandomizing transform
return (_Hash_seq((const unsigned char *)&_Keyval, sizeof (_Kty)));
}
};
-------------
// FUNCTION _Hash_seq
inline size_t _Hash_seq(const unsigned char *_First, size_t _Count)
{ // FNV-1a hash function for bytes in [_First, _First + _Count)
#if defined(_WIN64)
static_assert(sizeof(size_t) == 8, "This code is for 64-bit size_t.");
const size_t _FNV_offset_basis = 14695981039346656037ULL;
const size_t _FNV_prime = 1099511628211ULL;
#else /* defined(_WIN64) */
static_assert(sizeof(size_t) == 4, "This code is for 32-bit size_t.");
const size_t _FNV_offset_basis = 2166136261U;
const size_t _FNV_prime = 16777619U;
#endif /* defined(_WIN64) *
/
size_t _Val = _FNV_offset_basis;
for (size_t _Next = 0; _Next < _Count; ++_Next)
{ // fold in another byte
_Val ^= (size_t)_First[_Next];
_Val *= _FNV_prime;
}
return (_Val);
}








 性能测试结果:
hash_test1.jpg

测下了uthash和unorder_map的效率比较
不在一个数量级

 
 
hash_test2.png

 2千万个,uthash扑街


hash_test3.png

 unorder_map正常



 
 
 
 测试姿势如下:
  g++ -O2 test_hash.cpp -o test_hash -lrt -std=c++0x  

 不知测试的姿势是否不对
 
-================================================================---
 
今天补了一下Redis大婶用的那货Dict.h/Dict.c
每个数据项如下。
 
typedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;
} dictEntry;
 
通用性强,赞
插入500W条记录时,性能乐观。
如图
dict500w.png


1千万条简直太慢了
 
./aaa 
Hello, World!
To insert twenty million
table size:10000000
value is 0
To insert twenty million time-consuming
consumption times :828685 microsecond.
-------------------------------
Began to traverse the read
There are number of elements: 10000000 
 
远低于unordered_map,主要怀疑我的测试姿势不对。

 
直接上测试代码。
 
 gcc -o aaa LinuxProject2_ADLISTtest.c dict.c -lrt

 
 
 
 
 
 
 
 
 
 
 
 
  收起阅读 »

Lua是源于对数据结构的精确理解


lua 设计者是真正理解了数据结构精髓的一个人。

 在C语言中,int a; 这句话意味着:
1、先向内存要4个字节。
2、给它起个名字,叫a,
3、将来里边存的数据,应该是 "int"型的。
这时候,语言(编译器)
给这四个字节,定义了一套运算算法规则。
+ - * / sizeof ^ & * > < >> 等一套规则。
所以,数据类型的含义就在这里——就是定义一个数据类型,同时也意味着定义了它相连的一套运算规则。

后来被高级语言扩展到 类——类里有属性和方法,方法就是运算规则。属性就是数据本身。

Lua,就学习了这两者——基本数据类型与用户数据类型——类。
并且发挥到了极致。

它只用一个table解决了所有的数据类型。
通过 元方法,实现运算。

__index
__meta
__xxxxx


-------------------------------------------------------------------------------

任何一种语言,都需要有schema 定义,即一定要有词法与语法分析,一颗树。









继续阅读 »

lua 设计者是真正理解了数据结构精髓的一个人。

 在C语言中,int a; 这句话意味着:
1、先向内存要4个字节。
2、给它起个名字,叫a,
3、将来里边存的数据,应该是 "int"型的。
这时候,语言(编译器)
给这四个字节,定义了一套运算算法规则。
+ - * / sizeof ^ & * > < >> 等一套规则。
所以,数据类型的含义就在这里——就是定义一个数据类型,同时也意味着定义了它相连的一套运算规则。

后来被高级语言扩展到 类——类里有属性和方法,方法就是运算规则。属性就是数据本身。

Lua,就学习了这两者——基本数据类型与用户数据类型——类。
并且发挥到了极致。

它只用一个table解决了所有的数据类型。
通过 元方法,实现运算。

__index
__meta
__xxxxx


-------------------------------------------------------------------------------

任何一种语言,都需要有schema 定义,即一定要有词法与语法分析,一颗树。









收起阅读 »