我毕业于2002年,算来已经从事软件开发20年了,期间开发过一些有意思的系统,给网友们分享下。

1)2000~2002年,FLASH动画展示。在校期间,用VC开发了Flash动画展示软件。我将大学学习的采矿工程用Flash软件做成动画,然后在VC上引用Flash插件,将动画硬编写到小软件中。在小软件做个动画展示,这算是未入行时做的学习软件吧。

CString Type="swf";HRSRC res=FindResource (NULL,Name,Type);HGLOBAL gl=LoadResource (NULL,res);
LPVOID lp=LockResource(gl);//返回指向资源内存的地址的指针。CString filename="Temp.swf";//保存的临时文件名// CREATE_ALWAYS为不管文件存不存在都产生新文件。fp= CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);DWORD a;//sizeofResource 得到资源文件的大小if (!WriteFile (fp,lp,SizeofResource (NULL,res),&a,NULL))return false;CloseHandle (fp);//关闭句柄FreeResource (gl);//释放内存void CEmbedModuleView::OnInitialUpdate(){CHtmlView::OnInitialUpdate();Navigate2(_T(“http://www.microsoft.com”),NULL,NULL);}

2)2002~2004年,先后用C#开发了短信竞猜游戏、手机110一键报警等软件。当时的短信应用开发的挺多的,那时的SP挣得盆满钵满。后来工信部对行业做了整顿,那么靠短信正确的SP们纷纷倒闭了。

amespace mmsxx
{public class MMessage{string Subject = "";int nSeconds = 0;   //   设置送达的时间,当前相对时间,以秒为单位   ArrayList lFile = new ArrayList();       //   彩信文件列表   ArrayList lDest = new ArrayList();       //   发送号码集合   static long nSeq = 0;public MMessage(){//   //   TODO:   在此处添加构造函数逻辑   //   }public void SetSubject(string szSubject){Subject = szSubject;}public void SetDeliverTime(int nSec){nSeconds = nSec;}//     public void AddTo(string Dest){lDest.Add(Dest);}public void AddFile(string File){lFile.Add(File);}public void ClearTo(){lDest.Clear();}//   得到二进制编码字节   public byte[] GetContent(){byte[] byMms = new byte[0];//   消息头开始   //X-Mms-Message-Type   byMms = AppendOct(new byte[] { 0x8C, 0x80 }, byMms);//X-Mms-Transaction-ID   byMms = AppendOct(new byte[] { 0x98 }, byMms);byMms = AppendOct(nSeq.ToString(), byMms);nSeq++;   //   序列号加1   byMms = AppendOct(new byte[] { 0x0 }, byMms);//X-Mms-MMS-Version   byMms = AppendOct(new byte[] { 0x8D, 0x90 }, byMms);//Date   //From,设置为   Insert-address-token   byMms = AppendOct(new byte[] { 0x89, 0x01, 0x81 }, byMms);//To   for (int i = 0; i < lDest.Count; i++){byMms = AppendOct(new byte[] { 0x97 }, byMms);byMms = AppendOct("+86" + (string)lDest[i] + "/TYPE=PLMN", byMms);byMms = AppendOct(new byte[] { 0x0 }, byMms);}//Subject   if (Subject.Length > 0)     //   使用Utf8编码   {byMms = AppendOct(new byte[] { 0x96 }, byMms);//   Value-length   Char-set   Text   -string   byte[] byLen = new byte[1];byLen[0] = (byte)(Encoding.UTF8.GetByteCount(Subject) + 2);byMms = AppendOct(byLen, byMms);//   Char-set   为utf-8   byMms = AppendOct(new byte[] { 0xEA }, byMms);byMms = AppendOct(Encoding.UTF8.GetBytes(Subject), byMms);byMms = AppendOct(new byte[] { 0x0 }, byMms);}//   X-Mms-Delivery-Time,递送时间   =   Relative-token   Delta-seconds-value   //   Relative-token   =   0x81   //   Delta-seconds-value   =Long-integer   //   Long-integer   =   Short-length   Multi-octet-integer   if (nSeconds > 0){byMms = AppendOct(new byte[] { 0x87 }, byMms);byte[] bfTime = BitConverter.GetBytes(nSeconds);     //   默认使用Big-endian,需用改为Little-endian   //   bfTime改为Little-endian   Array.Reverse(bfTime);byte[] bfTimeLen = new byte[3];bfTimeLen[0] = (byte)(bfTime.Length + 2);bfTimeLen[1] = 0x81;     //   相对时间格式   bfTimeLen[2] = (byte)bfTime.Length;byMms = AppendOct(bfTimeLen, byMms);byMms = AppendOct(bfTime, byMms);}//Content-Type:application/vnd.wap.multipart.mixed   byMms = AppendOct(new byte[] { 0x84, 0xA3 }, byMms);//   消息体开始(MIME   multipart)   //   8.5.2   Multipart   Header   //   nEntries   Uintvar   The   number   of   entries   in   the   multipart   entity   byte[] byFileCount = new byte[1];byFileCount[0] = (byte)lFile.Count;byMms = AppendOct(byFileCount, byMms);//   8.5.3   Multipart   Entry,逐个加入媒体文件   for (int j = 0; j < lFile.Count; j++){byMms = AppendOct(GetMmsContent(lFile[j].ToString()), byMms);}return byMms;}//   Tools   //   加入媒体文件到彩信内容中去   private byte[] GetMmsContent(string FileName){//   每一个Multipart   Entry由5个部分组成   /*   HeadersLen   *   DataLen   *   ContentType   *   Headers   *   Data   *   */byte[] byHeaders = new byte[0];       //   ContentType和Headers组合   byte[] byData = ReadFromFile(FileName);string FileID = getContentId(FileName);//   Set   content-type   if (FileName.EndsWith(".txt")){byHeaders = new byte[1];byHeaders[0] = (byte)(Encoding.ASCII.GetByteCount(FileID) + 5);byHeaders = AppendOct(new byte[] { 0x83, 0x85 }, byHeaders);       //   Utf-8   byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);byHeaders = AppendOct(new byte[] { 0x00 }, byHeaders);byHeaders = AppendOct(new byte[] { 0x81, 0xEA }, byHeaders);}else if (FileName.EndsWith(".gif")){byHeaders = new byte[] { 0x9D };}else if (FileName.EndsWith(".mid") || FileName.EndsWith(".midi")){byHeaders = Encoding.ASCII.GetBytes("audio/midi");byHeaders = AppendOct(new byte[] { 0x00 }, byHeaders);     //   文本需要以0x00结尾   }//   加入Content-ID和Content-Location   byHeaders = AppendOct(new byte[] { 0xC0, 0x22, 0x3C }, byHeaders);byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);byHeaders = AppendOct(new byte[] { 0x3E, 0x00 }, byHeaders);//加入Content-Location   byHeaders = AppendOct(new byte[] { 0x8E }, byHeaders);byHeaders = AppendOct(Encoding.ASCII.GetBytes(FileID), byHeaders);byHeaders = AppendOct(new byte[] { 0x00 }, byHeaders);byte[] byHeaderLen = encodeUintvar(byHeaders.Length);byte[] byDataLen = encodeUintvar(byData.Length);byte[] byMmc = new byte[byHeaderLen.Length + byDataLen.Length + byHeaders.Length + byData.Length];Array.Copy(byHeaderLen, byMmc, byHeaderLen.Length);Array.Copy(byDataLen, 0, byMmc, byHeaderLen.Length, byDataLen.Length);Array.Copy(byHeaders, 0, byMmc, byHeaderLen.Length + byDataLen.Length, byHeaders.Length);Array.Copy(byData, 0, byMmc, byHeaderLen.Length + byDataLen.Length + byHeaders.Length, byData.Length);return byMmc;}private byte[] encodeUintvar(int n){byte[] buf = new byte[8];int l = 0;while (n >= 128){byte b = (byte)(n & 0x7F);n = n >> 7;buf[l++] = b;}buf[l++] = (byte)n;byte[] retBys = new byte[l];for (int i = 0; i < l; ++i){retBys[i] = (byte)(buf[l - i - 1] | 0x80);}retBys[l - 1] &= 0x7F;return retBys;}//   从文件中读取字节   private byte[] ReadFromFile(string FileName){byte[] bf = new byte[0];FileStream fs = null;try{fs = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);     //   没有设定Buffsize   }catch (Exception e){Console.WriteLine(e.ToString());}if (fs != null){bf = new byte[fs.Length];fs.Read(bf, 0, (int)fs.Length);fs.Close();}return bf;}//   得到文件名(不包含文件夹部分)   private string getContentId(string FileName){int at = FileName.LastIndexOf("\\");if (at < 0)return FileName;elsereturn FileName.Substring(at + 1);}//   增加字节   private byte[] AppendOct(byte[] bys, byte[] byDest){byte[] bysNew = new byte[byDest.Length + bys.Length];try{Array.Copy(byDest, bysNew, byDest.Length);Array.Copy(bys, 0, bysNew, byDest.Length, bys.Length);}catch (Exception e){Console.WriteLine(e);}return bysNew;}//   增加字符串   private byte[] AppendOct(string sz, byte[] byDest){return AppendOct(Encoding.Default.GetBytes(sz), byDest);}}
}

3)2004~2009年,开发了GPS车辆监控系统、GPS高尔夫辅助系统、GPS轨迹系统等。这几年一直和GPS打交道了,其中GPS车辆监控系统主要应用在北京市出租车上。为出租车司机保驾护航。那时还没有手机支付,还没有扫码支付,出租车司机一般收现金。所以出租车司机是那些大夫的重点青睐对象,社会上经常有抢劫司机的案件发生。通过本系统保护了大量的司机师傅,记得有一次司机被抢劫,通过系统精确定位了车辆位置,并对车辆进行管控,保护了司机师傅,抓获了罪犯。这个系统有时还为司机师傅的家庭矛盾做调节,记得曾经有个出租车师傅跟家里闹矛盾,驾车出走了,深夜不归。根据家属的请求及公安民警的准许,在午夜十分,对车辆进行监控,引导家属和师傅会面。随着微信、支付宝等手机支付的普及,抢劫出租车师傅的事情可能也逐渐消失了。GPS车辆监控的安防功能可能用的越来越少了。

4)2009至今,一直从事通信软件的开发。先后开发维护了IP(智能外设)彩铃系统、SS7(7号信令)网关、SIP(SIP信令)网关、SIGTRAN信令网关、视频彩铃、语音识别系统。先后经历了电信的3G、4G、5G通信系统的更新换代,IMS、NGN等这些系统更新的眼花缭乱。系统云化、大数据、虚拟化、NFV等等。哪些电路域,2M线接入的设备,纷纷下电退网。哪些跟不上形势的厂家纷纷淘汰,索尼、爱立信、阿尔卡特、贝尔、摩托罗拉、诺基亚这些厂家纷纷出局。华为、中兴鱼跃龙门,逐渐成为国内运行商的主流厂商、耀眼的明星。

先后敲过了数十万代码吧,开发过系统为现实的生活有过带来了一点点的实在用途。也算是为这个世界的美好,敲下代码做点微薄贡献吧。

做了20年的老码农-历数做过的系统相关推荐

  1. 老码农眼中的CRM 图解

    概述 喔家ArchiSelf CRM 是企业"以客户为中心"价值观的核心体现之一, 各种2B的应用都无可避免,而企业应用具有一定的复杂性,理解CRM系统也不是轻而易举的事情.在老码 ...

  2. 老码农:这是我见过最操蛋的代码,切勿模仿!

    作为一名老码农,我的心这次凉透了! 事情起因很简单:我在全国最大ZZ的同性组织某Hub上浏览时候,发现这样的一条信息: Python 超过 C++.JS 薪酬排行第一 (最大招聘网站Indeed.co ...

  3. 老码农揭开行业黑幕:如何编写无法维护的代码

    作者 | 老码农的自留地 来源 | 程序员的那些事 如何编写无法维护的代码 让自己稳拿铁饭碗 简介 永远不要(把自己遇到的问题)归因于(他人的)恶意,这恰恰说明了(你自己的)无能.-- 拿破仑 为了造 ...

  4. 前端笔试能查吗_老码农的字节跳动前端面试总结

    有幸得到猎头推荐参加字节跳动工程效率部的前端面试,为此准备了一周的时间,面试前内心十分忐忑,略微有些小紧张. 由于是下午面试,所以早早起床,翻出许多年前购买的,几近翻烂的<JavaScript设 ...

  5. 老码农冒死揭开行业黑幕:如何编写无法维护的代码

    [程序员的那些事 注]:这是一篇非常经典的文章,我们以前发过多次.虽然部分内容是针对 Java 语言,但其他部分对所有编程语言都有参考意义.今天重新推荐给新读者朋友,老朋友也值得重温. 编译:我们专栏 ...

  6. 老码农:这段代码绝了,切勿模仿!

    作为一名老码农,我的心这次凉透了! 事情起因很简单:我在某Hub上浏览时候,发现这样的一条信息: Python 超过 C++.JS 薪酬排行第一 (最大招聘网站Indeed.com数据) 噗,996刚 ...

  7. 开发无框架单页面应用 — 老码农的祖传秘方

    什么是单页面应用(SPA)? 维基百科上的描述是这样的: JavaScript 1 2 3 "A single-page application (SPA), is a web applic ...

  8. 42岁老码农找工作记录

    大家好,节日愉快呀!平时和朋友.同事总是会聊到35岁+的程序员都在干啥,各种说法都有,从CTO到滴滴司机不等.今天就给大家分享一位42老码农今年跳槽找工作的经历,文字不常,会有帮助的~ 以下是原文 给 ...

  9. 转载老码农教你学英语

    作者微博:@老码农的自留地 对于咱们这些高端大气.时刻需要和国际接轨的码农,英语的重要性自然是毋庸置疑的.尤其是那些胸怀大志,想在码农行业闯出一片天地,成为秒杀身边小弟们的潜在大牛们,熟练掌握英语更是 ...

最新文章

  1. 如何读emmc里的引导程序_自制操作系统学习1 引导程序
  2. docker svn
  3. php怎么关联默认打开程序,win10系统打开文件时提示“请在默认程序控制面板中创建关联”如何解决...
  4. 一种新的穿透防火墙的数据传输技术
  5. LINUX--特殊权限SUID,SGID,Sticky
  6. [译] Android 的多摄像头支持
  7. 如何在Linux下安装nginx
  8. so baby come on~~
  9. Java List相关用法
  10. 哪里有高中教师教学计算机能力培训,04060406_王世红_高中教师信息技术能力的培训.doc...
  11. 过几天就退休了,目前情况下可不可以请同事们吃饭呢?
  12. Windows下Node.js安装Canvas插件
  13. 机器学习读书笔记: 概率图模型
  14. oracle11g oem使用手册,Oracle11g从入门到精通pdf
  15. linux btrfs raid0,Linux初学之btrfs文件系统及磁盘配额
  16. 价值工程杂志价值工程杂志社价值工程编辑部2022年第23期目录
  17. 计算机组成原理相关话题,“计算机组成原理”教学改革研究
  18. 【大揭秘】Android架构组件ViewModel来龙去脉
  19. Educoder Java高级特性 - JDBC(上)
  20. c#面向对象程序设计——类的抽象

热门文章

  1. 使用Python完成一套优美的中秋节代码
  2. 几种获取本机IPv6地址的方法
  3. 敏捷开发第二阶段每日站立会议(五)
  4. [历年IT笔试题]2014腾讯校园招聘笔试试题
  5. CorelDraw插件开发-VBA-常用功能-查找并替换相同对象-cdr插件
  6. 六级考研单词之路-六
  7. 最强大、最古老、最本源的代码:指令INSTRUCTION
  8. 用于解决listview嵌套GridView时显示不全的问题。
  9. 上线第三天,陀螺财经App再添两大重量级合作伙伴!
  10. 关于“文心一言”,ChatGPT如是说