这个运动手表不久会和大家见面,并且开源

 

项目代号 MoriPark  第一个里程碑实验版本 Thylacine

今天是2017年9月7日,MoriPark项目正式启动。

81年前的今天,地球上最后一只Thylacine(袋狼)死在地球人类的动物园里。

为了纪念这些曾经生活在地球上的小家伙,MoriPark的第一个版本定为Thylacine。

我很想以此为契机,为热爱运动和炫酷科技的小伙伴们,为热爱开源分享和开发的小伙伴们,创造一座前所未有的桥梁,让彼此的世界更加广阔。

考虑到第一期的制作成本,这里暂且使用很大众的单片机STM32F103,后续会选择更优异的架构。

这是我第一次用STM32单片机开发东西,先在这里给出原理图的pdf:

A0-MoriPark-Thylacine-1CORE A0-MoriPark-Thylacine-3rdpartyGPSBD-ATGM336H-5N A0-MoriPark-Thylacine-3rdpartyGSM-GA6

届时产品对用户开放所有现成的工程文件。

Read more

首家把各种多人游戏搬进健身房团课的训练娱乐系统登录ChinaFit

没错,就是豆包开发的运动娱乐系统,直接上ChinaFit课程PPT。

暖场视频 课程广告

课程讲义 PowerPoint2016格式的PPT | PPT转出的视频

本系统将遵循下文给出的 AGPL协议 和 3mn.net附加协议 开放源代码,提供所有功能的实现(软硬件完全开放)。本次课程介绍的demo版本已经打包更新至之前的俱乐部系统源码包。

—————————————————————————
Read more

Windows上的蓝牙4.0BLE心率设备数据采集

本文所述方法在windows 10 1703(创意者更新)无法使用,在之前的版本没有问题,不知道之后的版本是否会修复,所以现在暂且先用1607等版本的win10禁止大更新使用了,详情见 https://developercommunity.visualstudio.com/content/problem/57636/gattdeviceservicefromidasync-broken-on-winforms-ap.html

最近开发了Windows系统上的心率功率墙,用到了蓝牙设备数据采集。

因为BLE比用SPP方便很多,所以连接现代蓝牙4.0+心率或其他BLE传感器获得数据要比以前省事很多,对于可以主动通知主机的设备,大致步骤如下:

  1. 在Windows建立配对,通常没有密码或者是六个零,如果不对的话,看看说明书。
  2. 用Windows SDK里的Windows.Devices.Enumeration.DeviceInformation.FindAllAsync获得对应类别的设备列表并枚举。
  3. 对于遍历的每一个设备,用蓝牙空间里的GattDeviceService.FromIdAsync得到service。
  4. 用得到的service对象的GetCharacteristics得到characteristic。
  5. 把characteristic的ValueChanged绑定指定的事件处理函数。
  6. 用characteristic的WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);设定主动通知模式。
  7. 在指定的事件处理函数中用DataReader.FromBuffer(args.CharacteristicValue).ReadBytes得到设备主动发来的数据。

工程源代码下载链接:(里面也同时提供了MSDN提供的针对Windows8.1 StoreApp的蓝牙心率采集demo,但默认启动工程没有用那个,也没有依赖)

BLEHeartRateReceiver

值得注意的是,在微软提供的demo里进行了一系列额外没用的设置,比如数据可加密、超范围断线回来自动重连,而那些都是不必要的,因为山寨设备都不加密,而且自动重连完全可以在更顶层统一实现,效率也并不会差多少。更重要的是,在微软的demo直接用.Net Core而不用FrameWork会带来很多额外的麻烦,比如连接数据库、使用Redis或其他Windows上的第三方组件等,既然是在Windows用不考虑跨平台,就没有必要用那个demo的方式了,因为即便用UWP、.Net Core,蓝牙BLE操作对Windows SDK的依赖也导致了无法直接用于其他平台(WindowsPhone基本没人用,我直接把demo里那个csproj给删了- -||),不如直接用我后来写的WinForm。(但目前如文章最开始所述,这个方法在版本1703行不通了,只能用store app,UWP操作其他东西非常麻烦。不知道是微软故意的还是bug,但愿下个版本能继续用吧)

开源版俱乐部管理系统(ClubWorkBench demo)

本工程来自豆包2016年初至当年夏天的Demo探索实践,和目前维护的商用版本架构、细节、依赖、引用库、第三方组件均不相同,并且已经不再进行实用性维护。看到业内各种类似项目的蓬勃发展,为促进技术交流进步,将之前的探索实践完全开源。

系统功能:

常规俱乐部会籍管理、IC卡拍照发卡刷卡签到、IC卡储值、常规课程开单销单、电话约课客服、各种报表自定义打印、扫条码刷IC卡的商品入库和售卖、IC卡刷卡详细记录、俱乐部自定义OA系统、俱乐部HTML5多媒体文件网盘、微信可集成(部分需简单二次开发)……

概要性的说明可以参考 这个pdf文件

部署使用方法:

在服务器部署配置好Windows Server 2016、SQL Server 2016、IIS等所有基础依赖。使用客户端exe程序的系统推荐使用Windows 10。确保客户端计算机和服务器是可以通过IP网络连通的,如果需要的话,在客户端计算机接入USB扫码枪(用于商品入库和售卖)、USB IC卡刷卡器(用于IC卡会籍管理)、USB Modem(用于电话客服功能来电自动识别客户)。

下载所有源码,在vs2015打开所有解决方案文件,添加所有对应的引用和库(为了节省空间二进制基本都删掉了),编译之后,把所有目录按结构不变直接放到IIS的默认目录下,如C:\inetpub(如果目录改变需要对应修改部署用的站点配置文件appsites.xml),在C盘根下建立目录C:\Temp。其中LoginForm是使用DSkin的客户端程序,其他站点程序很多用到了DevExpress16.1.6,需要自行购买或下载得到。

点击这里下载所有源码
(已集成此处介绍的运动传感器及其数据采集、BLE4GATT心率数据采集、三维或实景视觉前端等)
下载须同意这里文章后半段深蓝色文字描述的AGPL&3mn.netAL 解压密码:3mn.net
文件名:developing.rar
大小: 2319316094 字节
MD5: E84C59A67F796CE731218615F4ABDFBA
SHA1: 435DEA8E403380761C4EF1BEAE0508BF7F683395
CRC32: FC0EBED6
*由于文件较大且存放于公共网络空间,请下载后务必哈希校验再解压使用。
点击这里下载站点配置

参考这里导入站点配置 http://www.cnblogs.com/goody9807/p/3613491.html

安装压缩包里提供的所有第三方软件,如Redis、AForge.NET等。在SQL Server 2016建库CustomerServiceForm(本系统默认配置文件里的连接用户是csf,密码l123456,可自行更改),导入CustomerServiceForm.sql建立数据表结构和必要元数据。直接通过Web访问IP即可进入管理后台,默认管理员用户admin,密码111。在刷卡客户端系统,配置好LoginForm的config文件,运行exe文件,即可进入客户端程序。

 

How to construct an iSCSI encrypt agent

最近两天看了看如何以网络代理的形式加密各种存储协议向后端落地的数据。

其中用于SAN阵列加密的iSCSI代理,在CentOS 7居然一个包都没有yum就搞定了。

只顾着跑步和健身好久没有来更新和审核文章了,先把这个水货放上充充数吧 o(>_<)o

点击这里可以下载 示例脚本文件 <–download script file here. the content is the same as following blog text.

点击这里可以下载彩色版本的word文档 vSAN

Read more

libvirt support for Xen’s new libxenlight toolstack

Originally posted on jfehlig‘s blog, here.

Xen has had a long history in libvirt.  In fact, it was the first hypervisor supported by libvirt.  I’ve witnessed an incredible evolution of libvirt over the years and now not only does it support managing many hypervisors such as Xen, KVM/QEMULXCVirtualBoxhyper-vESX, etc., but it also supports managing a wide range of host subsystems used in a virtualized environment such as storage pools and volumes, networks, network interfaces, etc.  It has really become the swiss army knife of virtualization management on Linux, and Xen has been along for the entire ride.

基于OCaml的Mirage OS的1.0版本前不久已经发布

http://xenproject.org/downloads/mirage-os-archives/mirage-os-10.html

What is Mirage OS and why is it important?

Most applications that run in the cloud are not optimized to do so. They inherently carry assumptions about the underlying operating system with them, including vulnerabilities and bloat.

Compartmentalization of large servers into smaller ‘virtual machines’ has enabled many new businesses to get started and achieve scale. This has been great for new services but many of those virtual machines are single-purpose and yet they contain largely complete operating systems which typically run single applications like web-servers, load balancers, databases, mail servers and similar services. This means a large part of the footprint is unused and unnecessary, which is both costly due to resource usage (RAM, disk space etc) and a security risk due to the increased complexity of the system and the larger attack surface.

CloudOSDiagram

Mirage OS is a Cloud Operating Systemwhich represents an approach where only the necessary components of the operating system are included and compiled along with the application into a ‘unikernel’. This results in highly efficient and extremely lean ‘appliances’, with the same or better functionality but a much smaller footprint and attack surface. These appliances can be deployed directly to the cloud and embedded devices, with the benefits of reduced costs and increased security and scalability.

Some example use cases for Mirage OS include: (1) A lean webserver, for example the openmirage.org, website is about 1MB including all content, boots in about 1 second and is hosted on Amazon EC2. (2) Middle-box applications such as small OpenFlow switches for tenants in a cloud-provider. (3) Easy reuse of the same code and toolchain that create cloud appliances to target the space and memory constrained ARM devices.

How does Mirage OS work?

Mirage OS works by treating the Xen hypervisor as a stable hardware platform and using libraries to provide the services and protocols we expect from a typical operating system, e.g. a networking stack. Application code is developed in a high-level functional programming language OCaml on a desktop OS such as Linux or Mac OSX, and compiled into a fully-standalone, specialized unikernel. These unikernels run directly on Xen hypervisor APIs. Since Xen powers most public clouds such as Amazon EC2, Rackspace Cloud, and many others, Mirage OS lets your servers run more cheaply, securely and faster on those services.

Mirage OS is implemented in the OCaml language, with 50+ libraries which map directly to operating system constructs when being compiled for production deployment. The goal is to make it as easy as possible to create Mirage OS appliances and ensure that all the things found in a typical operating system stack are still available to the developer. Mirage OS includes clean-slate functional implementations of protocols ranging from TCP/IP, DNS, SSH, OpenFlow (switch/controller), HTTP, XMPP and Xen Project inter-VM transports. Since everything is written in a single high-level language, it is easier to work with those libraries directly. This approach guarantees the best possible performance of Mirage OS on the Xen Hypervisor without needing to support the thousands of device drivers found in a traditional OS.

MirageDNS-500

An example of a Mirage OS appliance is a DNS server and below is a comparison with one of the most widely deployed DNS servers on the internet, BIND 9. As you can see, the Mirage OS appliance outperforms BIND 9 but in addition, the Mirage OS VM is less than 200kB in size compared to over 450MB for the BIND VM. Moreover, the traditional VM contains 4-5 times more lines of code than the Mirage implementation, and lines of code are often considered correlated with attack surface. More detail about this comparison and others can be found in the associated ASPLOS paper.

For the DNS appliance above, the application code was written using OCaml and compiled with the relevant Mirage OS libraries. To take full advantage of Mirage OS it is necessary to design and construct applications using OCaml, which provides a number of additional benefits such as type-safety. For those new to OCaml, there are some excellent resources to get started with the language, including a new book from O’Reilly and a range of tutorials on the revamped OCaml website.

We look forward to the exciting wave of innovation that Mirage OS will unleash including more resilient and lean software as well as increased developer productivity.

Google利用PNaCl将AmigaOS移植到Chrome

为演示Portable Native Client(PNaCl)技术,Google开发者 Christian Stefansen将上世纪80年代的AmigaOS移植到Chrome。Chrome运行是一个特别的AmigaOS开源版本,Stefansen利用PNaCl将该版本的C语言代码移植运行在Chrome上。Native Client技术让Web应用程序能以接近原生代码的性能运行在浏览器上,Native Client针对的是X86架构处理器,而Portable Native Client则扩展了Native Client,变成了一个架构独立的技术,让应用程序可以运行在X86或ARM平台。最新的演示只支持Chrome 31以上版本,不支持Android和iOS。

liR9UwZrlN0Jc

 

Epic和Mozilla发布虚幻引擎3的浏览器演示

今年早些时候,Mozilla和Epic Games利用asm.js、Emscripten和WebGL,在浏览器上演示了虚幻引擎3的一个DEMO,展示了Web成为一个3D游戏平台的潜力。这一演示吸引了游戏工作室NomNom Games的注意,他们因此开始探索将其开发的虚幻引擎3游戏移植到浏览器的可能性。12月12日,Mozilla和NomNom宣布了第一个基于asm.js技术的3D商业Web游戏——Monster Madness。用户可以在支持WebGL的Firefox、Chrome或Opera上测试游戏的Alpha版本,和之前的演示一样,进入游戏前需要花比较长时间载入纹理素材。

liwFR8EHxPPSE

免费开源云平台与VDI的构建

2013年11月28日所说的部分话撤回,愿提供更好的方案给需要的人。 2017年1月24日。

 

下面列举一下如何快速构建开源VDI平台:

总体思路是通过开源项目,依次构建虚拟化平台、IaaS云平台、VDI桌面管理。

 

a) 如果主要需求点是Windows桌面,则通常基于Xen/XenServer/Hyper-V构建。

以最常用的Xen为例,为了直接获得可实际使用的版本,首先你需要下载开源的XenServer, http://xenserver.org/open-source-virtualization-download.html

直接下载安装iso,不要试图从两张源代码DVD从零构建,编译组件后组合没有文档的,如果你不能得到Citrix工程师的支持,需要耗费巨量的时间。

直接安装以后主要部分都很容易从源代码DVD里找到对应,如果你要修改或者山寨,对应的替换就可以了。

然后选择一个IaaS平台,下载安装,例如选择CloudStack,稳定版本可以从官网的下载页面获得,http://cloudstack.apache.org/downloads.html

如果想体验最新开发版本,可以从github直接checkout,https://github.com/apache/cloudstack

写这篇blog的时候,github上的4.4版本的CloudStack可以直接成功编译使用。使用OpenStack相对繁琐一些。

安装文档可以参考官方的指南, http://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.2.0/html/Installation_Guide/index.html

最后,你需要一个RDP或者SPICE的远程桌面分配平台,并自己写几个脚本,让用户的虚拟机可以在访问桌面的时候自动启动,即可完成VDI的构建。

RDP客户端的开源项目一样是铺天盖地,如果考虑到实际的桌面需求,需要跨平台支持各种终端,又不想安装客户端程序和Agent,为何不考虑用Flash或HTML5的桌面呢。

例如Guacamole,一款完全开源的HTML5桌面代理,http://guac-dev.org/#download ,你可以轻松的用它构建VDI,并支持动态分配桌面、AD域集成身份认证等,官方有详细的文档。

如果想要性能好一点,可以基于rdesktop http://sourceforge.net/projects/rdesktop/files/?source=navbar 或其他开源的RDP/SPICE客户端稍加改造,甚至不用改造,直接使用原本的Windows远程桌面即可。http://cgit.freedesktop.org/spice/spice-html5 这里有html5的spice。

最可笑的是现在很多卖瘦客户端的,就是弄个破ARM开发板上面跑个远程桌面,还说什么1080p,你去看看随便买个几百块钱的破ARM板子多少都支持1080p显示?怎么能有脸卖几千块呢。。

比如飞凌的板子: http://item.taobao.com/item.htm?spm=a1z10.1.w4004-185985825.11.Ntntya&id=18449162554 类似的CortexA8 A9的板子大量支持HDMI高清显示,

不要说1080p,就算4k的视频输出的板子,也卖不到几千块钱啊~ 而且买个板子,源代码本身是cpu厂商连同BSP一起提供的,真心对瘦客户端VDI宣传什么云主机还注册专利的,表示呵呵~

开关虚拟机用CloudMonkey写几行python脚本就搞定了,https://cwiki.apache.org/confluence/display/CLOUDSTACK/CloudStack+cloudmonkey+CLI 。

b) 如果主要需求点是linux或BSD的服务器虚拟化,则通常基于KVM构建。

KVM的更好办,直接装个CentOS,把虚拟化支持打开就ok了,装CloudStack需要额外装个Agent,然后就可以把KVM当底层Hypervisor了。其他部分和上面一段一样。

另外,红帽比较喜欢SPICE桌面,http://www.spice-space.org/download.html ,但实测一般应用场合感觉这东西用户体验没比RDP好多少。

 

 

NDS游戏开发起动 很多东西游戏开发前辈已经写了,转几个有用的地址来

【2009.1】
有了的就不再写了,DS的年龄比较长,寻找资料和开发很顺利,概括一下,转几个地址来~
想花几分钟立刻建立DS游戏开发环境的朋友请直接阅读黄色和蓝色底色的文字。
NDS开发环境配置(官方开发环境 实际上就是开发裸机ARM程序的ADS)
陈超的专栏 ——NDS开发揭秘
实际上就是按ARM系统裸机开发的方式使用老版ADS里的CodeWarrior,对于业内的朋友应该是相当的熟悉和顺手~因为我当年在ADS的CodeWarrior写过好多程序,所以看到DS直接用这个真是倍感亲切,其实这也是意料之中的事情,Nintendo肯定懒得自己做IDE,而且ARM还提供了这么方便的。。另外需要提及的是,我没具体尝试,不知道04年左右流行ADS开发的时候流传的无限期license能不能直接用在这里提供的CodeWarrior之上,如果能直接用的话,就不存在什么时间限制问题了,我估计没有什么问题,这里提供的CodeWarrior应该没有什么特别的改动。
陈超的图链接好像断了,这个帖子里有:
官方的注册帐号比较麻烦,要一堆公司的信息之类的。。下面看看fans的~
NDS开发环境配置(fans开发环境 可以用VisualStudio或linux下的一些IDE配合交叉编译)
jiaweihao1987的专栏(一份可行性分析报告)
还有这里
类似的google就可以,教程和资源十分丰富。
fans之前是用arm-linux-gcc编译过DS程序(比如甚至移植了uClinux2.6到DS上,”dslinux”),CodeWarrior所使用的armcc.exe实际上和arm-linux-gcc极其相似,用什么编译器都是可以的。DS实际上是个裸机环境,而且cpu没有mmu,全是直接寻址,也没有什么程序装载的问题,全裸上阵。
fans方案大多就是用传说中的devkitpro, PSP等东西的开发也可以用这个kit:
使用PAlib(一个基于fans用的devkitPro的更方便开发的工具包)结合VC++9.0的具体安装步骤 (2009.02.06补充,解决新版本的PAlib和devkitPro的兼容性问题)
00 – Visual C++ 2008 Express Edition
01 – devkitPro Updater
v. 1-4.7
http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=160396
02 – devkitARM
r21
http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=124207&release_id=549080
     delete c:devkitProdevkitARM and extract to C:devKitPro
03 – libnds
20071023
http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=151608&release_id=549081
     delete all contents inside C:devkitProlibnds and extract in the folder
04 – PAlib Community Update
BETA 080203
http://palib.info/downloads/Beta/PALib_CommunityUpdate_BETA-080203.7z
     extract to C:devkitPro
     080823
     extract and copy PAlib/lib/* to C:devkitProPAlib (fix some bugs)  
05 – libfat-nds
20070127
http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=197264

extract the files in the include folder to C:devkitProlibndsinclude and the files in the lib folder to C:devkitProlibndslib
06 – dswifi
0.3.4
http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=199021
     The same method as 05
07 – StartComputerright clickpropertiesadvanced tabenvironnement variables
Add a new user variable
name : PAPATH
Value : C:/devkitPro/PAlib
Add a new system variable
name : DEVKITPRO
value : /c/devkitPro
08 –
     VC8.0 setup
09 – Open VC++ and new a PAlib project, build it, create an .nds file,
     just run it.
        
NDS系统概览
参见我这个blog收藏的相关链接和之前的文章.
还有 这里写得相当不错
blog “猴子灵药”:
当然,可以不用PAlib,那样就直接按devkitPro官方站点的说明来配置IDE。只使用devkitPro只需要做前面叙述的一堆步骤中的00和01即可。 
NDS游戏程序demo
官方开发环境的demo warioworld.com里有。
fans在linux开发的可以看一下http://www.dev-scene.com/NDS/Applications_2007

使用linux的小型消费类系统上的常见应用层程序移植

【2008】

1.Web服务器: BOA 与 cgic库

本节内容摘自网络流传的教程,我曾经在s3c2440和ep9315系统亲手移植过BOA,没有遇到问题.
cgic只是需要交叉编译一下,不需要做什么修改和配置.

移植
第一步:从www.boa.org下载Boa源码,将其解压并进入源码目录的src子目录。
# tar  xzf  boa-0.94.13.tar.gz
# cd  boa-0.94.13/src
生成Makefile文件
# ./configure
修改Makefile文件,找到CC=gcc和CPP=gcc -E,分别将其改为交叉编译器安装的路径CC=某路径下arm-linux-gcc和CPP=某路径下arm-linux-gcc -E并保存退出。
然后运行make进行编译,得到可执行程序boa
# make
# 某路径下arm-linux-strip boa

第二步:Boa的配置。
Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改。
1.    Group nogroup修改成Group 0,由于在/etc/group文件中没有nogroup组,所以设成0
另外在/etc/passwd中有nobody用户,所以User nobody不用修改。
2.    ScriptAlias /cgi-bin/  /usr/lib/cgi-bin/ 修改成 ScriptAlias /cgi-bin/  /var/www/cgi-bin/
其它默认设置即可。
还需要创建日志文件所在目录/var/log/boa,创建HTML文档的主目录/var/www,将静态网页存入该目录下(可以将主机/usr /share/doc/HTML/目录下的index.html文件和img目录复制到/var/www目录下),创建CGI脚本所在目录/var /www/cgi-bin,将cgi的脚本存放在该目录下。另外还要将mime.types文件复制/etc目录下,通常可以从linux主机的/etc 目录下直接复制即可。

第三步:测试
1.静态HTML网页
在目标板上运行boa程序,将主机与目标机的ip设成同一网段,然后打开任一个浏览器(linux或window下都可),输入目标板的ip地址(http://10.10.10.2)即可打开/var/www/index.html网页
2.CGI脚本测试
boa源码中有cgi-bin测试脚本(examples/cgi-test.cgi),但由于它不是在我们目标平台下编译的,所以不能将它复制到/var/www/cgi-bin目录下进行测试。
下面是一个简单的hello, world!程序,代码如下:
#include <stdio.h>
void main(){
printf(“Content-type: text/htmlnn”);
printf(“<html>n”);
printf(“<head><title>CGI Output</title></head>n”);
printf(“<body>n”);
printf(“<hl>Hello, world.</hl>n”);
printf(“<body>n”);
printf(“</html>n”);
exit(0);
}

Boa移植时常出现的问题
1.    当运行boa程序时出现错误,如下:
# ./boa
[27/Nov/1990:13:22:25 + 0000]boa.c:266.icky Linux kernel bug!:No such file
将 User 0修改成 User nobody
2.    打开网页时,网页中的图片无法显示
就将存放图片的子目录/var/www/images修改成/var/www/img
3.    在测试cgi脚本时,当在浏览器地址中输入“http//10.10.10.2/cgi-bin/helloworld.cgi”时,浏览输出下述错误:
502 Bad Gateway
The CGI was not CGI/1.1 compliant
(sanicle注:此种错误在使用BOA时十分常见,原因基本都是自己写的cgi程序的输入输出问题)
在目标板的调试终端中输出下述错误:
……cgi_header:unable to find LFIF
上述错误是在boa原码中的cgi_header .c文件中的process_cgi_header函数产生,如下:
buf = req->header_line;
c = strstr(buf, “nrn”);
if (c == NULL) {
c = strstr(buf, “nn”);
if (c == NULL) {
log_error_time();
fputs(“cgi_header: unable to find LFLFn”, stderr);  //出错信息
#ifdef FASCIST_LOGGING
log_error_time();
fprintf(stderr, “”%s”n”, buf);
#endif
send_r_bad_gateway(req);
return 0;
}
}
我们可以定义FASCIST_LOGGING,使产生该错误时将buf内容打印出来,结果如下:
……cgi_header:unable to find LFIF
Content-type: text/html
<html>
<head><title>CGI Output</title></head>
<body>
<hl>Hello, world.</hl>
<body>
</html>
原来buf中的内容就是helloworld.c中输出的内容,查看输出结果,再看process_cgi_header函数中的语句:c = strstr(buf, “nn”),很明显buf中没有两个连续的换行符”nn”,所以是helloworld.c文件中的语句:printf(“Content- type: text/htmlnn”);错写成了printf(“Content-type: text/htmln”);
上述行通过标 准输出将字符串″Contenttype:text/plainnn″传送给Web服务器。它是一个MIME头信息,告诉Web服务器随后的输出是以纯ASCII文本的形式。在这个头信息中有两个新行符,这是因为Web服务器需要在实际的文本信息开始之前先看见一个空行。

WEB应用开发
CGIC库的移植
从CGIC的主站点http://www.boutell.com/cgic/上下载源码,将其解压并进入源码目录。
# tar  –zxvf  cgic.tar.gz
# cd  cgic205
修改Makefile文件,同样是改为使用交叉编译。
然后输入make进行编译,可以将生成的capture和cgictest.cgi文件复制到目标板目录/var/www/cgi-bin/下,以测试正确性。

2.数据库: sqlite (结合web服务器,小型嵌入式设备也可以做各种BS结构的应用和web服务)

网上同样有教程,我就不再转载了,我在ep9315上的linux2.4.21和s3c2440上的2.6.14都曾用过sqlite3,这里我直接把移植好的一个版本提供过来(sqlite3.3.14).

下载 sqlite3-arm-linux (扩展名改成z01,和其他压缩包放在一起解压) sqlite3-arm-linux
3.GUI: MiniGUI QT

涉及商业使用中的文档,暂略,等有适合放出的再放吧.

4.USB摄象头获取视频并由以太网传出: 驱动spca5xx 视频服务器servfox 视频客户端spcaview

我曾经在各种系统上(如s3c2410,ep9315,rm9200等)尝试使用常见的301p摄象头,用spca这些东西感觉很不错,移植容易,基本也就是交叉编译一下,作者是一个和蔼可亲的法国大胡子老爷爷.这一堆东西具体可以看这里:
http://mxhaard.free.fr/embedded.html (我刚才上不去..不知道是我的网络人品还是那个站人品了..汗)

我07年的时候对这些还是蛮有兴趣的,但可惜的是经常使用的Video4Linux相关的东西,由于时间安排,我还没有详细研究.
spcaview在fifth的努力下可以在windows使用,代码简明易懂,以下是fifth的blog中的相关内容:
http://blog.chinaunix.net/u/27015/showart_223753.html

又看到有人引用了那段难懂的C代码,简单说两句

#include <stdio.h>
main(t,_,a)
char *a;
{
return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,”%s %d %dn”):9:16:t<0?t<-72?main(_,t,
“@n’+,#’/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#
;#q#n+,/+k#;*+,/’r :’d*’3,}{w+K w’K:’+}e#’;dq#’l
q#’+d’K#!/+k#;q#’r}eKK#}w’r}eKK{nl]’/#;#q#n’){)#}w’){){nl]’/+#n’;d}rw’ i;#
){nl]!/n{n#’; r{#w’r nc{nl]’/#{l,+’K {rw’ iK{;[{nl]’/w#q#n’wk nw’
iwk{KK{nl]!/w{%’l##w#’ i; :{nl]’/*{q#’ld;r’}{nlwb!/*de}’c
;;{nl’-{}rw]’/+,}##’*}#nc,’,#nw]’/+kd’+e}+;#’rdq#w! nr’/ ‘) }+}{rl#'{n’ ‘)#
}’+}##(!!/”)
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a==’/’)+t,_,a+1)
:0<t?main(2,2,”%s”):*a==’/’||main(0,main(-61,*a,
“!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m .vpbks,fxntdCeghiry”),a+1);
}

这段C代码的阅读可以考验读者作为地球人的毅力哈哈,是以前世界最难懂C代码比赛的一段代码~当时我看了好久才隐约明白过来~ 最近看到有博友发了这个,简单分析两句~
这段代码之所以难以理解主要是因为 1)尽可能的利用递归,2)分明就是只有putchar输出字符而已,却故意把字符串搞成很难阅读,3)把逻辑分支都搞成问号冒号的形式。。。分解的第一步自然是把绕眼的字符串先砍掉。

去掉双引号的部分先分析逻辑
双引号故意乱眼的部分是:
“@n’+,#’/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#
;#q#n+,/+k#;*+,/’r :’d*’3,}{w+K w’K:’+}e#’;dq#’l
q#’+d’K#!/+k#;q#’r}eKK#}w’r}eKK{nl]’/#;#q#n’){)#}w’){){nl]’/+#n’;d}rw’ i;#
){nl]!/n{n#’; r{#w’r nc{nl]’/#{l,+’K {rw’ iK{;[{nl]’/w#q#n’wk nw’
iwk{KK{nl]!/w{%’l##w#’ i; :{nl]’/*{q#’ld;r’}{nlwb!/*de}’c
;;{nl’-{}rw]’/+,}##’*}#nc,’,#nw]’/+kd’+e}+;#’rdq#w! nr’/ ‘) }+}{rl#'{n’ ‘)#
}’+}##(!!/”

“!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m .vpbks,fxntdCeghiry”

去掉以后,把问号冒号和递归逻辑展开,这里比较麻烦,因为实在套了不少。
但先不用展,我们也能分析一些东西。我们知道,要控制递归结束,嵌套执行的次数运气好的话会在程序里找到常数。暂且假设作者没有变态到连这个控制用的数都隐藏起来了,试着从表面查找它。程序中大小比较只有“<”,查找所有的“<”,发现变量和常数比较的时候出现的正数只有13,又因为程序中没有出现递减1,但有很多递加1,可以感觉到,貌似是循环13或12次输出什么东西,而具体输出的东西自然应该和那两段乱人眼的引号之间的字符串有关系,因为连续重复的字符貌似没太有,所以可以暂时先试着排除作者要输出某种字符组成的图形的可能性,往后再展开程序具体分析那两段怎么变成正常的地球语言~ 有空的朋友可以具体分析下哈~ 不过感觉这个过程比较需要耐心~

运行结果是:

On the first day of Christmas my true love gave to me
a partridge in a pear tree.

On the second day of Christmas my true love gave to me
two turtle doves
and a partridge in a pear tree.

On the third day of Christmas my true love gave to me
three french hens, two turtle doves
and a partridge in a pear tree.

On the fourth day of Christmas my true love gave to me
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the fifth day of Christmas my true love gave to me
five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the sixth day of Christmas my true love gave to me
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the seventh day of Christmas my true love gave to me
seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the eigth day of Christmas my true love gave to me
eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the ninth day of Christmas my true love gave to me
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the tenth day of Christmas my true love gave to me
ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the eleventh day of Christmas my true love gave to me
eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

On the twelfth day of Christmas my true love gave to me
twelve drummers drumming, eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.

有了结果,规则基本可以看见了,再倒回去分析可能会容易一些。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

刚才我在网上搜了一下这段文字,发现有人把这段程序解析成地球版本了已经~
以下程序来自这里

///////////////////////////////////////////////////////////////////////
//"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m .vpbks,fxntdCeghiry";
// !-------------------------------!
///////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////
//
// @n'+,#'
// on the
//---------------------------------------------------------------------
// /*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/
//  first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth
//---------------------------------------------------------------------
//  'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!
//   day of Christmas my true love gave to me
//---------------------------------------------------------------------
// /+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!
//  twelve drummers drumming,  eleven pipers piping,  ten lords a-leaping,
//---------------------------------------------------------------------
// /n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!
//  nine ladies dancing,  eight maids a-milking,  seven swans a-swimming,
//---------------------------------------------------------------------
// /w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlw]!
//  six geese a-laying,  five gold rings,
//---------------------------------------------------------------------
// /*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w!
//  four calling birds,  three french hens,  two turtle doves
//---------------------------------------------------------------------
//   nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/
//  and  a partridge in a pear tree.
//
///////////////////////////////////////////////////////////////////////

#include <stdio.h>

#ifdef __TURBOC__
#include <conio.h>
#endif

#define END_DAY     12
#define START_DAY    1

#if !(START_DAY>0&&END_DAY<=12&&START_DAY<=END_DAY)
    #error "error! START_DAY or END_DAY is not in range!"
#endif

const int START_DELIMITERS   =  0;
const int NUMBERS_DELIMITERS = 13;
const int GIFTS_DELIMITERS   = 13;

const char * decodeTbl=
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:nuwloca-O;m .vpbks,fxntdCeghiry";
const char * cryptograph=
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l 
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# 
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' 
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlw]!/*de}'c 
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# 
}'+}##(!!/";

void decodeAndPrint(int d)
{
    const char *pc = cryptograph;

    while (d < 0)
    {
        if (*pc++ == '/')
        {
            d++;
        }
    }

    while (*pc != '/')
    {
        const char *p = decodeTbl;
        while (*p != *pc) p++;
        putchar(p[31]);
        pc++;
    }
}

void start()
{
    decodeAndPrint( - START_DELIMITERS );
}

void number(int n)
{
    decodeAndPrint( - (START_DELIMITERS+n) );
}

void dayToMe()
{
    decodeAndPrint( - (START_DELIMITERS+NUMBERS_DELIMITERS) );
}

void gift(int g)
{
    decodeAndPrint( g - (START_DELIMITERS+NUMBERS_DELIMITERS+GIFTS_DELIMITERS) );
}

void gifts(int g, int n)
{
    if (g < n)
        gifts(g + 1, n);
    if (g > 0)
        gift(g);
}

void printBible(int n)
{
#ifdef __TURBOC__
    static int temp = 0;
    if(++temp%5==0)
        getch();
#endif
    start();
    number(n);
    dayToMe();
    gifts(1, n);
    if( n < END_DAY)
        printBible(n + 1);
}

void main()
{
#ifdef __TURBOC__
    clrscr();
#endif
    printBible(START_DAY);
#ifdef __TURBOC__
    getch();
#endif
}

怀旧用dx7的一个踢小球的2D游戏demo

【2007.12】
下载
这个包里面有编译好的小游戏,这个小游戏的VC6代码工程,以及使用到的3dmax模型.
ps.这个demo写得很烂,仅仅是为一篇感怀以往的回忆录存在的 o(^3^)o,,,
最近因为又要离职踏上新的道路,有空整理了一下以往的代码,从在dos时代用TC写的飞机打小球游戏,到初中时候BASIC的猴子打香蕉代码分析,windows9x时代VB5写的日记本,高中的时候用VB6写的数学函数图线绘制,VC6用dx7 api搞的这个小游戏demo,VB6写的ssa字幕时间戳软件,到.net出现后用C#写的聊天室,用j2me结合asp做的类似移动qq的手机聊天软件,用jsp1.0做的初期的3mn.net…等等等等..我在闲暇时写的pc上跑的软件攒起来也算有不少,主要以windows上的代码为主.从一堆堆的代码中,我回忆着各种程序陪我度过的美好时光,和现今在社会与学校混比起来,往日平静的学习和研究生活感觉要好得多,我的人生 从小时候刚接触计算机到从事开发工作 因为那些带着感情的小程序而充实幸福起来~
给我感触最深的要算是几个带着不少感情的小程序,可惜这几个小程序都写得很烂哈哈 XD, 这个gamedemo是其中之一.记得当时我读了一本蛮厚的Andre Lamothe的书,具体的名字不太记得了,墨绿色皮的,讲使用directx的2d游戏编程.当时我十分喜欢游戏编程,构建一个游戏的时空很能满足我的创造欲.这个小程序的编写没有使用C++,而是以C为主,我记得那本书中的demo程序也是用C的好象..其实一直以来我更喜欢用C,大概是因为和硬件方面的控制接触多了,用C++总有一种摸不到cpu的感觉,而用C在熟悉的cpu体系上不需要编译就能知道对应的汇编大概是什么样子,都怪我对C++造化不够,其实到现在为止我都不熟悉STL,让我用C++我完全不会考虑到模板,就如同用早期的java写程序一样的感觉.之所以对这个小demo很有感情,主要是因为所有的美工都是我自己做的,为了画那两个小人,我还专门研究了一番3dmax哈哈,真是很麻烦的记忆哈,当时本来以为不看书也可以很快上手这种大众化的软件,后来折腾了好几天觉得麻烦,还是买了一本3dmax的参考书 =_=bb ..看来尽管有点经验,一些想法真正实施的时候,事情往往都不像想象的那么简单.
这个小demo实话说写得很烂,现在看来,代码罗列严重,复用性差,技术含量很低.真想不到那个时候的自己居然还写出了如此烂的程序,我本以为高中以后我的编码水平没有什么进步的,现在回头看一些代码才发现,大学以后的进步还是有的,哈.现在看来,不管是算法上还是模式上,这完全是一个失败的工程,大概是因为当时我并没有详细阅读linux kernel等一些比较优秀工程的代码,程序完全是堆出来的,寻迹也是使用最白痴的算法,和小学初中时的水平没什么两样.后来用C做工程逐渐习惯用结构中的函数指针的形式来模仿面向对象,这种习惯对我的工作选择有不小的影响,前两年所做的嵌入式系统底层开发工作中,我也一直热忠于使用C的面向对象开发.有点扯远了,总的说来,就是只要保持开心奋进的状态,平淡人生中的每一步都会是有进步和有意义的.
让我有感触的不仅仅是这个小游戏,还有很多其他工程..不过相比起来比这个写得还烂,哈哈(^0^),不过都很有感情,以前都是想到一个什么应用,就顺手写个方便自己用的小软件,比如记得上大学的时候我在战部渡的家魔神论坛还有狂客动漫论坛的时候(现在狂客论坛还在http://bbs.enetxp.com http://comicdna.com ),我搞过几集动画片的字幕,当时ssa的字幕脚本时间戳和特效还专门写了个软件..现在很多动画片字幕组都有自己的特效和时间戳软件,年轻的地带总是充满新鲜活力的哈~ 说到这里,我应该感谢全国各地所有的朋友对我以往写的一些小破东西的支持~不管是发布在哪里的,有人用的东西好歹是米有白做哈~也感谢所有漫友以往在各个动漫论坛的吐槽八卦交流,你们给了我很BT的动力~ 不管如何,我觉得既然活着,就感恩的活着,充满活力的活着,BT的活着,个性的活着,享受生命的幸福.
说到最后,可以download运行下这个破烂demo,感受一下这个无聊game哈哈~ 按上下左右方向键可以滚屏,选小人和控制他们走动就和其他即时战略游戏里一样哈,他们踢小球小球可以撞掉砖头…没做游戏结局 = =bb…

从算法开始从零编写的RSA密钥生成和文件加密软件

【2006】

下载 textrsa

源代码包下载 sanpack_rsa_vs2003sln_src

后来我也在华军发表过这个软件 http://www.onlinedown.net/soft/46622.htm

底层用C++实现,上层界面用C#实现.VS2003的工程.

 

里面包括我的五流本科毕业论文,回头看看真是2到无语,论文里不能提到“本文”二字不知道是哪来的规矩,还有那蹩脚的英语摘要,要把汉语逐句对应过去,真是脑残没有极限,我自己译的不蹩脚的被否了,这个摘要是软件生成加哪个同学改的,居然合格。

不过这个软件里有几个可借鉴的地方,一是C++大整数运算类,二是C接口dll在C#古老版本的引用。

 

Contact Magic Zestination | 联系豆包