我承认我没有被感动

偶然看到别人下,自己也就下下来将就看了(无主见男干的事情)。
  偶然的又看见了女主角的大眼睛,好像在倾诉,她的痛苦,她的孤寂,她的冷漠,她的悲伤,她的愤怒,还有她不能不说的爱。
   接受商业大片的太多洗礼,偶然发现了一块绿地(小电影)。总觉得法国电影很恬静,没有波澜,生活总是那样的闲适,自由。即使生活在社会的最底层,也有权利生活并且享受,平等而不会因为贫富和分工收到歧视,或许电影里所表达的并不是这些,也或许事实并不是如此。
   老人在度过最后的一段时光里满足的离开,她自信地披着浴巾在阳光下半裸的接受塔图的素描时,画面在自己眼中仿佛定格,是的,她的曾经,是否又回到了那个年轻的岁月?于是乎想起一句话,“就算老去了也要做一个优雅的老太太”(这好像没有什么直接联系)。
   生活总在适宜的时候开始有些许波澜,然后开始转机,变化。而事实总在向大家所愿意的方向发展,并且很乐意于如此。不知道是好还是坏。抑或其本身也是一种束缚,一种在甘甜过后必将带来的苦痛,或者相反。
  平衡总会在某个地方找到一个支点,支点往往难以保持中立,极端总会霸占你的整个视野。
  
   “我们上床并不代表我们就要在一起,我们可以在一起而没有爱!”而事情往往会向更多的方向发展,是的,人永远不会满足。
  
   今天偶然google搜索“天上人间”感觉很受刺激,
   最后还是忍不住骂一句:what the fuck life!
  
  我承认我只是嫉妒!!!

OCS的简单服务端开发

   对于简单的服务器端的扩充以及修改注册表等,那些比较菜的方法这里就不说了,还是说点有技术含量的吧,你要在OCS上面开发,首先得对OCS的架构有一个大致的了解,如果不了解呢,就直接参考网上的一些资料和信息了。了解大致的框架,然后开始看SDK里面的开发包的介绍,原来好像写过一篇文章,仔细找找。
   开发过程当中基本按照前面的构架流程来做,而且可以大部分参考SDK里面的DEMO程序来做,但是有几个需要注意的地方,一个是证书的获取,默认的OCS服务器会有一个证书来验证用户的身份,原来本想直接用默认的身份验证来代替,但是个人实验没有成功,所以这里必须有获取证书的方法。而且还需要注意的就是证书的获取这里默认是获取本地自己的证书的,因为这里个人开发的程序是直接部署在OCS的服务器上面的,如果是部署在域里面的其他服务器上面,那么里面就要做相应的修改了,下面贴函数(该死的天涯没有专业的code标,代码缩进完全变形,只有凑合看了):
  ///

  /// 获得本地证书
  ///

  /// 输出信息
  /// 是否成功
  public bool GetCertificateDictionary(out String m_message)
  {
         m_message = String.Empty;
         bool m_flag = false;
  
         //Create new X509 store from the local certificate store.
        X509Store Store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
   try
   {
        //Store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly |   OpenFlags.MaxAllowed );
   Store.Open(OpenFlags.MaxAllowed);
  
   m_DictionaryOfCertificates.Clear();
   int i = 0;
   CertificatesNameList = new string[Store.Certificates.Count];
   foreach (X509Certificate2 ctf in Store.Certificates)
   {
  
   String CertificateId = ctf.SerialNumber;
   String issue=ctf.Issuer;
   //ComboboxCertificate.Items.Add(CertificateId);
   CertificatesNameList.SetValue(CertificateId, i);
   i++;
   m_DictionaryOfCertificates.Add(CertificateId, ctf);
   m_flag = true;
   }
  
   Store.Close();
  
   if (m_flag == false)
   {
   m_message = “Please ensure the certificate you want to use is loaded into the personal folder of the local computer store.”;
   }
  
   return m_flag;
   }
  
   catch (System.Security.SecurityException e)
   {
   m_message = “You don’t have permissions to enumerate the certificates from the local computer store”;
   return m_flag;
   }
   }
   有了证书,后面的事情就好办多了,无非就是初始化连接manage,初始化endpoint然后加载信息到session,然后发送就ok了,broadcastI。事例里面是直接将当前的需要的用户加入到了广播的session里面,然后统一开了一个后台的线程开始不行发信息。这里需要注意的几个地方:首先要保证你的ocs的服务器的tls和tcp通信都可正常连接,并且端口都是设定ok的,而且受信任的证书也要搞定,原来ocs2005的话需要原来有一个专门的证书服务器来颁发证书,ocs2007里面就已经直接集成了。
  下面开始贴无脑代码,大部分仿照IM的例子里面东西来写的。
  private void RegisterEndpoint()
   {
   // Create the connection manager
   RecordProgress(“Creating the connection manager”);
   if (Settings.TransportType == SipTransportType.Tls)
   {
   try
   {
   _connectionManager = (RealTimeServerConnectionManager)new RealTimeServerTlsConnectionManager(Settings.CertificateIssuerName, Settings.CertificateSerialNumber);
   RecordProgress(“Created the Tls connection manager”);
   }
   catch (TlsFailureException)
   {
   Error(“Cannot read the certificate”);
   return;
   }
  
   _endPoint = new SipEndpoint(“sip:administrator@domcool.net”,
   SipAuthenticationProtocols.Ntlm,
   SipTransportType.Tls,
   “ocs.domcool.net”,
   5061,
   true,
   _connectionManager,
   null);
  
   _endPoint.CredentialCache.Add(SipEndpoint.DefaultRtcRealm, fromCredential);
  
   RecordProgress(“Created a Tls endpoint for {0}”, Settings.Uri);
   }
   else
   {
   _connectionManager = (RealTimeServerConnectionManager)new RealTimeServerTcpConnectionManager();
   RecordProgress(“Created the Tcp connection manager”);
  
   _endPoint = new SipEndpoint(Settings.Uri,
   SipAuthenticationProtocols.Ntlm,
   SipTransportType.Tcp,
   Settings.OCSServerName,
   5060,
   true,
   _connectionManager,
   null);
   _endPoint.CredentialCache.Add(SipEndpoint.DefaultRtcRealm, CredentialCache.DefaultNetworkCredentials);
   RecordProgress(“Created a Tcp endpoint for {0}”, Settings.Uri);
   }
  _endPoint.BeginRegister(new AsyncCallback(RegisterCallback), _endPoint);
   }
  
   private void RegisterCallback(IAsyncResult asyncResult) {
   SipEndpoint endPoint = asyncResult.AsyncState as SipEndpoint;
   SipResponseData response;
  
   try {
   response = endPoint.EndRegister(asyncResult);
   RecordProgress(“Register ok”);
   if (Started != null)
   Started(this, EventArgs.Empty);
   } catch { }
   }
   以html类型发送消息提供了二种方式,一种是以同步方式,一种是以异步方式,下面是同步方式。
  RealTimeEndpoint endpoint = …; // Assumed to be created elsewhere
  RealTimeAddress target = new RealTimeAddress(“sip:jayanama@contoso.com”);
  string msg = “Hi!”;
  ContentType contentType = new ContentType(“text/plain; charset=UTF-8”);
  byte[] msgBody = Encoding.UTF8.GetBytes(msg);
  try
  {
   endpoint.SendMessage(MessageType.Message,
   target,
   contentType,
   msgBody);
  }
  
  catch (RealTimeException e)
  {
   // Handle exception.
  }
  异步方式:
  RealTimeEndpoint endpoint = …; // Assumed to be created elsewhere
  RealTimeAddress target = new RealTimeAddress(“sip:jayanama@contoso.com”);
  string msg = “Hi!”;
  ContentType contentType = new ContentType(“text/plain; charset=UTF-8”);
  byte[] msgBody = Encoding.UTF8.GetBytes(msg);
  try
  {
   endpoint.BeginSendMessage(MessageType.Message,
   target,
   contentType,
   msgBody,
   CompleteSendMessage,
   endpoint);
  }
  
  catch (RealTimeException e)
  {
   // Handle exception here.
  }
  
  // Async callback function to end the BeginSendMessage operation.
  void CompleteSendMessage(AsyncCallback result)
  {
   RealTimeEndpoint ep = ar.AsyncState as RealTimeEndpoint;
   SipResponseData data;
   try
   {
   data = ep.EndSendMessage(ar);
   }
  < br />   catch (FailureResponseException exp)
   {
   // Handle a failure response
   Console.WriteLine(“Failure response for {0}: {1}”,
   ep.Uri,
   exp.ToString());
   }
  
   catch (OperationTimeoutException exp)
   {
   // Operation timed out
   Console.WriteLine(“Operation timed out for {0}: {1}”,
   ep.Uri,
   exp.ToString());
   }
  
   catch (RealTimeException exp)
   {
   // Handle exception.
   Console.WriteLine(“Invite Failure for {0}: {1}”,
   ep.Uri,
   exp.ToString());
   }
  }
   关键的大致就是这样一些代码,归结一下整个消息发送的过程:就是创建连接manage,创建endpoint,在连接池里面注册你的endpoint,然后创建session,附加你的消息到session里面,然后通过session把消息发送出去。对于简单的文本的消息处理大致就是这样,ocs还有一大主要的利用是在语音和视频会议上面,由于哪一部分的没有搞过,这里就没有研究,不过相信会有接口提供相应的支持。
  

堆and栈(我承认我是看了以后才想起来的)

最近看com,发现一篇相当不错的文章,我承认我是看了以后才想起来原来的种种的,有代码,有汇编,有解释,完全符合个人的审美观点和胃口,今天的晚饭就是它了,相当丰盛。
---------------
堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 – 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = “abc”; 栈
char *p2; 栈
char *p3 = “123456”; 123456在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, “123456”); 123456放在常量区,编译器可能会将它与p3所指向的”123456″优化成一个地方。
}
二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较
char s1[] = “aaaaaaaaaaaaaaa”;
char *s2 = “bbbbbbbbbbbbbbbbb”;
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = “1234567890”;
char *p =”1234567890″;
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
—------------------------------------------
补充:看到这里,不禁会让人想起c#里面的装箱和拆箱,值类型,引用类型,以及.net里面的stack,和heap,从根本来说,他们都是
“堆”and “栈”。

近乎茫然的生活

  郁闷,烦躁,充斥在最近三天的几乎每一句话中。
  昨天由于樱桃摄入过量,导致夜间反复腹泻,本不想再去上班,无奈还是踏出家门。
  意外发现公车不再拥挤,乘铁也毋须排队。一改往日的繁忙,拥挤。一看月台计时器才知已经十点有余。
  
  重新回归并不如原来预期的那样顺风顺水,飞机差点在太原迫降。
  亲眼目睹了一个突发性心肌梗塞病人从发病到发病结束的整个过程,只觉得茫然而又无奈。
  机上的空姐,机长,医生,乘客都在为病人担心的时,我却在无奈的开始盘算延后的行程。
  身后的美女祥装睡着,不曾看见有流口水的痕迹。
  突然觉得自己很冷,冷得连自己都有些害怕。
  
  很多事情都是在表面光鲜淋漓,而后面却龌龊不堪,
  从一开始病人需要氧气瓶乘务员的态度开始,到医生的紧急救助,再到起死回生的千恩万谢。
  
  从来一个人最关心的就是自己。
  不知道从死亡线上回来的人,人生观是否会有改变?
  很想体验一次,然后重新做人,抑或是重新不做人。
  可惜很多时候人们都没得选择,或者是自己给自己一个错误的选择,直到老死仍旧无法醒悟。
  
  与老公司还有部分纠缠,要想回去完成那永无止境的任务,却又一秒百念,难以抉择。
  路在自己脚下,有很多的无奈等待无奈地去选择,结果却总是无奈。
  
  新公司暂时很清闲,重新端起电子技术书籍开始吸收精华。
  前面的路还很长。

回归

  乘着旅游的档,回了趟家,无非就是四处物色小吃,物色美女。
  带了相机,却没有拍一张照片,因为景色的确不是什么美景,人工雕琢,商业味依旧浓厚。海拔稍高的地区紫外线都较强,众女们都养成在晚上八点,太阳挂在西边山腰的时候出门,繁华区尤为热闹,胜过白天。酒吧,慢摇吧,华灯上后开始逐渐升温,至晚上4点才冷却。
  城市人的生活,应该基本如此吧。
  
  县镇,乡村,浮华依旧难褪。所谓的“经济不发达区”,人民生活是闲适的,也可能是相对而言吧。没有更高的追求,也就没有为更多追求所带来的压力,或许还带了一些愚昧和懒惰。
  所以,个人感觉用“闲适”这个词来形容是很恰当的。
  山间可以看见一块块的梯田,很绿,可惜没有什么树木,感觉比较突兀。偶尔可以看到有人在田里照顾自己的作物,身形也只是仿佛可见。快要到吃饭的时候,可以看见农家的院子里面冒起的炊烟,袅袅的样子。大多数人的皮肤由于紫外线的缘故,纯粹的泛褐。
  吃饭时装菜,多用大盆,量多,便宜,厚实。
  
  晚上出门宵夜,老板很好,从冰柜里面拿出白天寄存的东西帮我们加工,外加烧烤,饮料,只觉得舒畅,惬意。恨不能每日都能如此宵夜,只得以吃得发胀来解。
  夜间的乡镇很冷,空气清,天很近,看到了许久未曾看到的星星,尝试按照儿时看星座的模糊记忆,仔细辨识,无奈北斗七星反复数来也只有六颗,仙女星座数来也只有四颗而已,只得作罢,脖子早已发酸。
  
  重新收拾心情,打点行装,离开的那天,天下着雨。执意不让父母去送,毕竟拗不过母亲,最后还是和母亲一路乘车去了机场。看着父亲离去的背影,不禁感伤。
  不曾表露。
  
  早已开始自力的生活,脱离父母的依偎,包容,庇护。那一份不曾言表的心情,不曾言表的爱,无时无刻都在浸渍着自己二十多年的生活。也许只有做了父母,才方知父母心。
  
  重新回到这一座喧嚣和忙碌的城市,
  重新混迹在每日拥挤的地铁人流中,
  重新成为一个朝九晚八的脑力民工,
  重新开始原有的生活,
  其实,每一刻我们都逃离不了自己的轨迹。即使这条轨迹和众人不同,却也是自己一手“规画”,或许这正是生活的开始,生活的结束。