WPF判断命令(Command)是否能够执行是通过ICommand.CanExecute事件,在实际程序中路由命令一般是通过CommandBinding来使命令得到实际操作代码,但是这个CanExecute事件的调用是由WPF控制的,有些时候,比如命令执行后进行一些异步耗时操作,操作完成后会影响CanExecute事件结果,但是WPF不会立即做出反应,那么这个时侯就需要手动调用CommandManager.InvalidateRequerySuggested对命令系统进行一次刷新。 比如下面这个小程序 <Window.CommandBindings> <CommandBinding Command="New" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" /> </Window.CommandBindings> <StackPanel> <Button Command="New">执行工作</Button> <TextBlock Name="tbl" Text="等待执行"></TextBlock> </StackPanel> // // 事件执行代码 // privatevoid CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute =!finished; } privatevoid CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { System.Threading.ThreadPool.QueueUserWorkItem(dowork); } bool finished =false; void dowork(object obj) { updateUI("开始工作"); System.Threading.Thread.Sleep(1000); updateUI("工作结束"); finished =true; } void updateUI(string msg) { Dispatcher.BeginInvoke((Action)(() => tbl.Text = msg)); } 程序按钮点击后下面文字显示“工作结束”,这时按钮理应是禁用的(因为此时CanExecute结果是false),但实际上按钮没有被禁用,只有界面发生改变后(如焦点,按键变化,或者按钮再次被点击),按钮才会被禁用,因为此时WPF才调用相应的CanExecute事件。 手动调用CommandManager.InvalidateRequerySuggested就可以解决问题,注意这个函数只有在UI主线程下调用才会起作用。 void dowork(object obj) { updateUI("开始工作"); System.Threading.Thread.Sleep(1000); updateUI("工作结束"); finished =true; //手动更新 updateCommand(); } void updateCommand() { Dispatcher.BeginInvoke((Action)(() […]
View Details做过WinForm开发的都会郁闷WPF竟然没有Timer。 今天想在WPF中用Timer可是发现WPF没有Timer类,找了半天发现新增了一个 DispatcherTimer确实好用和WinForm中Timer用法相似。 —————————————————————————————————————————-- 引:银光中国 在 WPF 中不再有类似 WinForm 中的 Timer 控件,因此,需要使用 DispatcherTimer 类来实现类似 Timer 的定时执行事件,该事件使用委托方式实现。DispatcherTimer 类 在 System.Windows.Threading 下,需要 using System.Windows.Threading 命名空间。 MSDN事例: 创建了名为 dispatcherTimer 的 DispatcherTimer 对象。 事件处理程序 dispatcherTimer_Tick 被添加到 dispatcherTimer 的 Tick 事件中。 使用 TimeSpan 对象将 Interval 设置为 1 秒,并启动了计时器。
1 |
<ol class="dp-c"><li class="alt"><span><span class="comment">// DispatcherTimer setup</span><span> </span></span></li><li><span>dispatcherTimer = <span class="keyword">new</span><span> System.Windows.Threading.DispatcherTimer(); </span></span></li><li class="alt"><span>dispatcherTimer.Tick += <span class="keyword">new</span><span> EventHandler(dispatcherTimer_Tick); </span></span></li><li><span>dispatcherTimer.Interval = <span class="keyword">new</span><span> TimeSpan(0,0,1); </span></span></li><li class="alt"><span>dispatcherTimer.Start(); </span></li></ol> |
Tick 事件处理程序将更新显示当前秒数的 Label,并且它将对 CommandManager 调用 InvalidateRequerySuggested。
1 |
<ol class="dp-c"><li class="alt"><span><span class="comment">// System.Windows.Threading.DispatcherTimer.Tick handler</span><span> </span></span></li><li><span> <span class="comment">//</span><span> </span></span></li><li class="alt"><span> <span class="comment">// Updates the current seconds display and calls</span><span> </span></span></li><li><span> <span class="comment">// InvalidateRequerySuggested on the CommandManager to force </span><span> </span></span></li><li class="alt"><span> <span class="comment">// the Command to raise the CanExecuteChanged event.</span><span> </span></span></li><li><span> <span class="keyword">private</span><span> </span><span class="keyword">void</span><span> dispatcherTimer_Tick(</span><span class="keyword">object</span><span> sender, EventArgs e) </span></span></li><li class="alt"><span> { </span></li><li><span> <span class="comment">// Updating the Label which displays the current second</span><span> </span></span></li><li class="alt"><span> lblSeconds.Content = DateTime.Now.Second; </span></li><li><span> </span></li><li class="alt"><span> <span class="comment">// Forcing the CommandManager to raise the RequerySuggested event</span><span> </span></span></li><li><span> CommandManager.InvalidateRequerySuggested(); </span></li><li class="alt"><span> } </span></li></ol> |
转自:http://www.cnblogs.com/midcn/archive/2011/03/18/1987928.html
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 |
using System; using System.Configuration.Install; using System.Collections; using System.Collections.Specialized; IDictionary stateSaver = new Hashtable(); 一、安装服务: private void InstallService(IDictionary stateSaver, string filepath) { try { System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController("ServiceName"); if(!ServiceIsExisted("ServiceName")) { //Install Service AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller(); myAssemblyInstaller.UseNewContext = true; myAssemblyInstaller.Path =filepath; myAssemblyInstaller.Install(stateSaver); myAssemblyInstaller.Commit(stateSaver); myAssemblyInstaller.Dispose(); //--Start Service service.Start(); } else { if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending) { service.Start(); } } } catch (Exception ex) { throw new Exception("installServiceError\n" + ex.Message); } } 或者 /// <summary> /// 安装服务 /// </summary> /// <param name="p_Path">指定服务文件路径</param> /// <param name="p_ServiceName">返回安装完成后的服务名</param> /// <returns>安装信息 正确安装返回""</returns> public static string InsertService(string p_Path, ref string p_ServiceName) { if (!File.Exists(p_Path)) return "文件不存在!"; p_ServiceName = ""; FileInfo _InsertFile = new FileInfo(p_Path); IDictionary _SavedState = new Hashtable(); try { //加载一个程序集,并运行其中的所有安装程序。 AssemblyInstaller _AssemblyInstaller = new AssemblyInstaller(p_Path, new string[] { "/LogFile=" + _InsertFile.DirectoryName + "\\" + _InsertFile.Name.Substring(0, _InsertFile.Name.Length - _InsertFile.Extension.Length) + ".log" }); _AssemblyInstaller.UseNewContext = true; _AssemblyInstaller.Install(_SavedState); _AssemblyInstaller.Commit(_SavedState); Type[] _TypeList = _AssemblyInstaller.Assembly.GetTypes();//获取安装程序集类型集合 for (int i = 0; i != _TypeList.Length; i++) { if (_TypeList[i].BaseType.FullName == "System.Configuration.Install.Installer") { //找到System.Configuration.Install.Installer 类型 object _InsertObject = System.Activator.CreateInstance(_TypeList[i]);//创建类型实列 FieldInfo[] _FieldList = _TypeList[i].GetFields(BindingFlags.NonPublic | BindingFlags.Instance); for (int z = 0; z != _FieldList.Length; z++) { if (_FieldList[z].FieldType.FullName == "System.ServiceProcess.ServiceInstaller") { object _ServiceInsert = _FieldList[z].GetValue(_InsertObject); if (_ServiceInsert != null) { p_ServiceName = ((ServiceInstaller)_ServiceInsert).ServiceName; return ""; } } } } } return ""; } catch (Exception ex) { return ex.Message; } } 二、卸载windows服务: private void UnInstallService(string filepath) { try { if (ServiceIsExisted("ServiceName")) { //UnInstall Service AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller(); myAssemblyInstaller.UseNewContext = true; myAssemblyInstaller.Path = filepath; myAssemblyInstaller.Uninstall(null); myAssemblyInstaller.Dispose(); } } catch (Exception ex) { throw new Exception("unInstallServiceError\n" + ex.Message); } } 三、判断window服务是否存在: private bool ServiceIsExisted(string serviceName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController s in services) { if (s.ServiceName == serviceName) { return true; } } return false; } 四、启动服务: private void StartService(string serviceName) { if (ServiceIsExisted(serviceName)) { System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName); if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending) { service.Start(); for (int i = 0; i < 60; i++) { service.Refresh(); System.Threading.Thread.Sleep(1000); if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running) { break; } if (i == 59) { throw new Exception(startServiceError.Replace("$s$", serviceName)); } } } } } 另外方法 /// <summary> /// 启动服务 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public static bool ServiceStart(string serviceName) { try { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running) { return true; } else { TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 10); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } } catch { return false; } return true; } 五、停止服务: private void StopService(string serviceName) { if (ServiceIsExisted(serviceName)) { System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName); if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running) { service.Stop(); for (int i = 0; i < 60; i++) { service.Refresh(); System.Threading.Thread.Sleep(1000); if (service.Status == System.ServiceProcess.ServiceControllerStatus.Stopped) { break; } if (i == 59) { throw new Exception(stopServiceError.Replace("$s$", serviceName)); } } } } } 另外一方法: /// <summary> /// 停止服务 /// </summary> /// <param name="serviseName"></param> /// <returns></returns> public static bool ServiceStop(string serviseName) { try { ServiceController service = new ServiceController(serviseName); if (service.Status == ServiceControllerStatus.Stopped) { return true; } else { TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 10); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } } catch { return false; } return true; } 六 修改服务的启动项 /// <summary> /// 修改服务的启动项 2为自动,3为手动 /// </summary> /// <param name="startType"></param> /// <param name="serviceName"></param> /// <returns></returns> public static bool ChangeServiceStartType(int startType, string serviceName) { try { RegistryKey regist = Registry.LocalMachine; RegistryKey sysReg = regist.OpenSubKey("SYSTEM"); RegistryKey currentControlSet = sysReg.OpenSubKey("CurrentControlSet"); RegistryKey services = currentControlSet.OpenSubKey("Services"); RegistryKey servicesName = services.OpenSubKey(serviceName, true); servicesName.SetValue("Start", startType); } catch (Exception ex) { return false; } return true; } 七 获取服务启动类型 /// <summary> /// 获取服务启动类型 2为自动 3为手动 4 为禁用 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public static string GetServiceStartType(string serviceName) { try { RegistryKey regist = Registry.LocalMachine; RegistryKey sysReg = regist.OpenSubKey("SYSTEM"); RegistryKey currentControlSet = sysReg.OpenSubKey("CurrentControlSet"); RegistryKey services = currentControlSet.OpenSubKey("Services"); RegistryKey servicesName = services.OpenSubKey(serviceName, true); return servicesName.GetValue("Start").ToString(); } catch (Exception ex) { return string.Empty; } } 八 验证服务是否启动 服务是否存在 /// <summary> /// 验证服务是否启动 /// </summary> /// <returns></returns> public static bool ServiceIsRunning(string serviceName) { ServiceController service = new ServiceController(serviceName); if (service.Status == ServiceControllerStatus.Running) { return true; } else { return false; } } /// <summary> /// 服务是否存在 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public static bool ServiceExist(string serviceName) { try { string m_ServiceName = serviceName; ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController s in services) { if (s.ServiceName.ToLower() == m_ServiceName.ToLower()) { return true; } } return false; } catch (Exception ex) { return false; } } 注:手动安装window服务的方法: 在“Visual Studio 2005 命令提示”窗口中,运行: 安装服务:installutil servicepath 卸除服务:installutil /u servicepath |
View Details
Thread thread=null; //定义线程 //开始线程 private void button1_Click(object sender, EventArgs e) { thread = new Thread(new ThreadStart(StartThread)); thread.Start();//开始线程 } private void StartThread() { int i = 0; while (true) { this.label1.Text = i.ToString(); //此处报错 i++; } } //结束线程 private void button4_Click(object sender, EventArgs e) { thread.Abort(); } 问题:当我们运行的时候会出现错误:"线程间操作无效: 从不是创建控件“label1”的线程访问它。" 解决方案:在程序运行的时候增加一句话,如下: public Form1() {InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false; //这是增加的一句话 } 缺点:将UI传给了子线程,违背了弱耦合、封装的思想。子线程去更新UI的状态,如果有多个不同主线程要获取子线程状态,怎么办?
View Details
1 |
//十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, 2));//十进制转八进制Console.WriteLine("十进制166的八进制表示: "+Convert.ToString(166, 8));//十进制转十六进制Console.WriteLine("十进制166的十六进制表示: "+Convert.ToString(166, 16)); //二进制转十进制Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32("111101", 2));//八进制转十进制Console.WriteLine("八进制 44 的十进制表示: "+Convert.ToInt32("44", 8));//十六进制转十进制Console.WriteLine("十六进制 CC的十进制表示: "+Convert.ToInt32("CC", 16)); |
View Details
【IT168 技术文档】WCF是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NET Framework 3.5的重要组成部分。使用该框架,开发人员可以构建跨平台、安全、可靠和支持事务处理的企业级互联应用解决方案。 在IIS中运行服务 之前我们让Derivatives Calculator服务在一个.NET可执行文件中运行,在这个练习中,我们将让服务在IIS中运行。 利用IIS作为宿主程序来运行WCF服务通常有许多好处。 ·将项目构建到\bin目录中 为了方便部署,我们需要对服务项目进行配置,让它编译到一个bin目录中。 1. 在Solution Explorer中右键单击DerivativesCalculatorService项目并选择Properties菜单项。 2. 在Project designer中,单击Build选项卡。 3. 将Output path从bin\Debug\改为bin\,如图所示。 Project designer中经过调整的Output path属性 4. 选择File | Save All菜单项。 5. 选择File | Close菜单项来关闭Project designer。 现在,在构建服务时产生的所有文件都会被输出到\bin目录中。 ·添加一个.svc文件 为了让WCF服务能够在IIS中运行,我们需要用一种特殊的内容文件(.svc文件)表示它。这种模型和ASMX页面在IIS中的表示方法类似。.svc文件包含一个WCF专用的处理指示符(@ServiceHost),这个指示符告诉WCF运行库在收到消息时激活服务。 1. 在Solution Explorer中右键单击DerivativesCalculatorService项目并选择Add | New Item菜单项。 2. 在Add New Item对话框中,选择Text File模板。 wordend 相关阅读: 3. 在Name文本框中输入Service.svc。 4. Add New Item对话框看起来应该如图所示。 添加一个svc文件 5. 单击Add按钮。 6. 在Service.svc文件中添加下面这行语句。 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/ <%@ServiceHost Service="DerivativesCalculatorService.Calculator" […]
View DetailsNode.js安装与配置 Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本情况了,对此,我们将在0.6.x的版本上介绍Node.js的安装和配置。(本文一律以0.6.1为例,0.6的其余版本,只需替换版本号即可。从http://nodejs.org/#download可以查看到最新的二进制版本和源代码)。 Windows平台下的Node.js安装 在过去,Node.js一直不支持在Windows平台下原生编译,需要借助Cygwin或MinGW来模拟POSIX系统,才能编译安装。幸运的是2011年6月微软开始与Joyent合作移植Node.js到Windows平台上(http://www.infoq.com/cn/news/2011/06/node-exe ),这次合作的成果最终呈现在0.6.x的稳定版的发布上。这次的版本发布使得Node.js在Windows平台上的性能大幅度提高,使用方面也更容易和轻巧,完全摆脱掉Cygwin或MinGW等实验室式的环境,并且在某些细节方面,表现出比Linux下更高的性能,细节参见http://www.infoq.com/news/2011/11/Nodejs-Windows。 在Windows(Windows7)平台下,我将介绍二种安装Node.js的方法,即普通和文艺安装方法。 普通的安装方法 普通安装方法其实就是最简单的方法了,对于大多Windows用户而言,都是不太喜欢折腾的人,你可以从这里(http://nodejs.org/dist/v0.6.1/node-v0.6.1.msi )直接下载到Node.js编译好的msi文件。然后双击即可在程序的引导下完成安装。 在命令行中直接运行:
1 |
node -v |
命令行将打印出:
1 |
v0.6.1 |
该引导步骤会将node.exe文件安装到C:\Program Files (x86)\nodejs\目录下,并将该目录添加进PATH环境变量。 文艺的安装方法 Windows平台下的文艺安装方法主要提供给那些热爱折腾,喜欢编译的同学们。在编译源码之前需要注意的是你的Windows系统是否包含编译源码的工具。Node.js的源码主要由C++代码和JavaScript代码构成,但是却用gyp工具(http://code.google.com/p/gyp/ )来做源码的项目管理,该工具采用Python语言写成的。在Windows平台上,Node.js采用gyp来生成Visual Studio Solution文件,最终通过VC++的编译器将其编译为二进制文件。所以,你需要满足以下两个条件: Python(Node.js建议使用2.6或更高版本,不推荐3.0),可以从这里(http://python.org/)获取。 VC++ 编译器,包含在Visual Studio 2010中(VC++ 2010 Express亦可),VS2010可以从这里(http://msdn.microsoft.com/en-us/vstudio/hh388567)找到。 下载Node.js的0.6.1版本的源码压缩包(http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz )并解压之。 通过命令行进入解压的源码目录,执行vcbuild.bat release命令,然后经历了漫长的等待后,编译完成后,在Release目录下可以找到编译好的node.exe文件。通过命令行执行node -v。 命令行返回结果为:
1 |
v0.6.1 |
事实上,如果你的编译环境中存在WiX工具集(http://wix.sourceforge.net/ ),执行vcbuild.bat msi release命令,你将会在Relase目录下找到node.msi。 是的,我们回到了一开始的普通安装方法。所谓文艺就是多走一些路,多看一些风景罢了。 Unix/Linux平台下的Node.js安装 由于Node.js尚处于v0.x.x的版本的快速发展中,Unix/Linux平台的发行版都不会预置Node的二进制文件,通过源码进行编译安装是目前最好的选择。而且用Unix/Linux系统的同学们多数都是文艺程序员,本节只介绍如何通过源码进行编译和安装。 安装条件 如同在Windows平台下一样,Node.js依然是采用gyp工具管理生成项目的,不同的是通过make工具进行最终的编译。所以Unix/Linux平台下你需要以下几个必备条件,才能确保编译完成: Python。用于gyp,可以通过在shell下执行python命令,查看是否已安装python,并确认版本是否符合需求(2.6或更高版本,但不推荐3.0)。 源代码编译器,通常 Unix/Linux平台都自带了C++的编译器(GCC/G++)。如果没有,请通过当前发行版的软件包安装工具安装make,g++这些编译工具。 Debian/Ubuntu下的工具是apt-get RedHat/centOS下通过yum命令 Mac OS X下你可能需要安装xcode来获得编译器 相关厂商内容 进阶xUnit培训课程,由Jolt大奖著作作者Gerard亲自授课,越早报名优惠越多! 京东网架构师何斌,确定QCon杭州分享主题:虚拟化如何支撑京东业务! oolShell博主,亚马逊中国研发经理陈皓,确定QCon杭州分享主题:建一支强悍的小团队! 百度技术沙龙第三十一期:推荐引擎算法与技术(10月20日 周六) 相关赞助商 QCon杭州2012大会10月25~27,10月10日前报名享受9折优惠,5人以上团购享有更多优惠! 其次,如果你计划在Node.js中启用网络加密,OpenSSL的加密库也是必须的。该加密库是libssl-dev,可以通过apt-get install libssl-dev等命令安装。 检查环境并安装 完成以上预备条件后,我们获取源码并进行环境检查吧:
1 |
wget <a href="http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz">http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz</a> tar zxvf node-v0.6.1.tar.gz cd node-v0.6.1 ./configure 上面几行命令是通过wget命令下载最新版本的代码,并解压之。./configure命令将会检查环境是否符合Nodejs的编译需要。 Checking for program g++ or c++ : /usr/bin/g++ Checking for program cpp : /usr/bin/cpp Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for g++ : ok Checking for program gcc or cc : /usr/bin/gcc Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for gcc : ok Checking for library dl : yes Checking for openssl : yes Checking for library util : yes Checking for library rt : yes Checking for fdatasync(2) with c++ : yes 'configure' finished successfully (7.350s) |
如果检查没有通过,请确认上面提到的三个条件是否满足。如果configure命令执行成功,就可以进行编译了:
1 |
make make install |
Nodejs通过make工具进行编译和安装(如果make install不成功,请使用sudo以确保拥有权限)。完成以上两步后,检查一下是否安装成功:
1 |
node -v |
检查是否返回:
1 |
v0.6.1 |
至此,Nodejs已经编译并安装完成。如需卸载,可以执行make uninstall进行卸载。 小结 以上介绍了*nix和Windows平台下Nodejs的安装,之后可以如同Nodejs官方网站上介绍的那样,编写example.js文件。
1 |
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, "127.0.0.1"); console.log('Server running at http://127.0.0.1:1337/'); |
在命令行中执行它:
1 |
node example.js |
你就可以通过浏览器访问http://127.0.0.1:1337得到Hello World的响应。 安装NPM NPM的全称是Node Package Manager,如果你熟悉ruby的gem,Python的PyPL、setuptools,PHP的pear,那么你就知道NPM的作用是什么了。没错,它就是Nodejs的包管理器。Nodejs自身提供了基本的模块。但是在这些基本模块上开发实际应用需要较多的工作。所幸的是笔者执笔此文的时候NPM上已经有了5112个Nodejs库或框架,这些库从各个方面可以帮助Nodejs的开发者完成较为复杂的应用。这些库的数量和活跃也从侧面反映出Nodejs社区的发展是十分神速和活跃的。下面我将介绍安装NPM和通过NPM安装Nodejs的第三方库,以及在大陆的网络环境下,如何更好的利用NPM。 Unix/Linux下安装NPM 就像NPM的官网(http://npmjs.org/)上介绍的那样,安装NPM仅仅是一行命令的事情:
1 |
curl http://npmjs.org/install.sh | sh |
这里详解一下这句命令的意思,curl http://npmjs.org/install.sh是通过curl命令获取这个安装shell脚本,按后通过管道符| 将获取的脚本交由sh命令来执行。这里如果没有权限会安装不成功,需要加上sudo来确保权限:
1 |
curl http://npmjs.org/install.sh | sudo sh |
安装成功后执行npm命令,会得到一下的提示:
1 |
Usage: npm <command> where <command> is one of: adduser, apihelp, author, bin, bugs, c, cache, completion, config, deprecate, docs, edit, explore, faq, find, get, help, help-search, home, i, info, init, install, la, link, list, ll, ln, ls, outdated, owner, pack, prefix, prune, publish, r, rb, rebuild, remove, restart, rm, root, run-script, s, se, search, set, show, star, start, stop, submodule, tag, test, un, uninstall, unlink, unpublish, unstar, up, update, version, view, whoami |
我们以underscore为例,来展示下通过npm安装第三方包的过程。
1 |
npm install underscore |
返回:
1 |
underscore@1.2.2 ./node_modules/underscore |
由于一些特殊的网络环境,直接通过npm install命令安装第三方库的时候,经常会出现卡死的状态。幸运的是国内CNode社区的@fire9同学利用空余时间搭建了一个镜像的NPM资源库,服务器架设在日本,可以绕过某些不必要的网络问题。你可以通过以下这条命令来安装第三方库:
1 |
npm --registry "<a href="http://npm.hacknodejs.com/">http://npm.hacknodejs.com/</a>" install underscore |
如果你想将它设为默认的资源库,运行下面这条命令即可: npm config set registry "http://npm.hacknodejs.com/" 设置之后每次安装时就可以不用带上—registry参数。值得一提的是还有另一个镜像可用,该镜像地址是http://registry.npmjs.vitecho.com,如需使用,替换上面两行命令的地址即可。 Windows下安装NPM 由于Nodejs最初在Linux开发下的历史原因,导致NPM一开始也不支持Windows环境,但是随着Nodejs成功移植到到Windows平台,NPM在Windows下的需求亦是日渐增加。下面开始Windows下的NPM之旅吧。 安装GIT工具 由于github网站不支持直接下载打包了所有submodule的源码包,所以需要通过git工具来签出所有的源码。从http://code.google.com/p/msysgit/downloads/list,可以下载到msysgit这个Windows平台下的git客户端工具(最新版本文件为Git-1.7.7.1-preview20111027.exe)。在下载之后双击安装。 下载NPM源码 打开命令行工具(CMD),执行以下命令,可以通过msysgit签出NPM的所有源码和依赖代码并安装npm。 […]
View Details以下从网络中搞定我的Win7下IIS错误: HTTP 错误 500.19 Internal Server Error 第一种可能,能解决一部分问题 http://wenku.baidu.com/view/c5cb4a08bb68a98271fefa3f.html 第二种可能,解决另外一部分问题 经过检查发现是由于先安装vs2008后安装iis的缘故,只需重新注册下AspNet就可以了,具体步骤如下 1 打开运行,输入cmd进入到命令提示符窗口。 2 进入到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 目录。 3 输入aspnet_regiis.exe –i 执行既可 注意:如果系统为64位 第二步的路径为C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727 第三种可能解决方法: Win7下我碰到的问题 WIN7下.Net开发遇到的又一问题:HTTP 错误 500.19 – Internal Server Error,无法访问请求的页面,因为该页的相关配置数据无效。 详细错误信息模块 IIS Web Core 通知 BeginRequest 处理程序 尚未确定 错误代码 0x80070021 配置错误 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny" 或旧有的 allowOverride="false" 的位置标记明确设置的。 配置源 219: <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></modules> 220: <handlers> 221: <remove name="WebServiceHandlerFactory-Integrated"/> […]
View DetailsEclipse插件安装、更新、删除 Eclipse的插件可以装在内部,也可以装在外部,装在内部的方法很简单:把插件的features和plugins目录copy到eclipse的安装目录即可。eclipse和其插件升级比较频繁,用过eclipse的朋友应该都有体会,插件装在外部相比装在内部有很多优点,此处不再赘述。 装在外部的插件的的目录结构通常应该类似如下: samplePlugins |——eclipse |——features |——plugins |——.eclipseextension 其中.eclipseextension文件只是标识这是一个eclipse外部插件,没有实际意义。有些插件解压后没有这个文件,可以手工创建一个空的即可。 在外部安装插件的两种方法: 1、使用Software Update功能 在Eclipse中选择Help > Software Updates > Manage Configuration,在这里会列出所有已经安装的插件。右键单击Eclipse Platform,选择New > Extension Location…,然后找到要安装的插件的目录,如:samplePlugins,确定,ok,安装成功。Eclipse会提示你重启以使应用生效。继续点击yes,然后就可以使用新插件了。 2、使用links目录功能 进入Eclipse安装目录,查看是否有links目录,如果没有,则新建之。进入links目录,新建一个后缀为.link的文本文件,如:samplePlugs.link,此文件只有一行内容,格式为:path=插件目录。例如:安装汉化插件,将汉化包解压出来应该是eclipse文件夹(包含features和plugins两个文件夹),放在C:\Java\eclipse\language目录下,在同一目录新建links文件夹,在links文件夹下新建language.ini(language.link)文本文件,内容:path=language保存退出,重启eclipse,就完成了Eclipse的汉化,^=^。 Eclipse的升级也有两种方法: 1、使用Help —> Software Updates —> Find and Install,选中需要升级的插件,按提示操作即可。 2、下载全新安装文件,解压新版本的eclipse,把以前安装的插件按照前述方法导入,如果需要再修改workspace的指向即可。 插件升级的方法也是同理,可以在线升级,或者下载新版插件,然后在links目录里修改.link文件即可。 插件卸载的方法: 在Help —> Software Updates —> Manage Configuration 里disable相应插件即可。如果要完全删除,则需要删除eclipse目录下的configuration目录,这步操作其实无甚必要。 以上操作从Eclipse2.1到Eclipse3.x下都经过试验。如果修改之后eclipse不能正常启动,到configuration目录下查看错误日志,再寻找解决办法。通常如果是配置问题,只要删除configuration目录基本都可以解决。 接下来主要说一下Eclipse集成的一些插件及其在线更新地址: 1. Subversion是下一代版本(或源码)控制系统,它的目的是代替CVS下载. 在线更新地址 : http://subclipse.tigris.org/update_1.2.x/ 2.PyDevPyDev是一个允许用户利用Eclipse进行Python开发。它提供了一些很好的功能如:代码填空,语法高亮显示,语法分析,重构(refactor)和调试等等. 在线安装更新地址 : http://pydev.sourceforge.net/updates/ 3. JyDT Jython开发工具。 在线安装更新地址 :http://www.redrobinsoftware.net/jydt/ 4. 基于Eclipse的Java反编译插件 在线更新地址 : http://www.technoetic.com/eclipse/update/ 5. JSEclipse可以编辑JavaScript 文件,支持语法突出显示和包括了一些常用的面向对象的方法。支持的面向对象的功能有:构造函数,类方法,实例方法,类变量等等。支持代码错误提示,警靠报告等。 在线更新地址 : http://download.macromedia.com/pub/labs/jseclipse/autoinstall/ 6. Implementors当追踪方法代码时,Eclipse默认是转到方法的接口类,而接口中是只有方法名称没有具体的实现代码,此插件提供了追踪到具体实现类的实现代码的功能。 在线更新地址 : http://eclipse-tools.sourceforge.net/updates/ 7. Easy ExplorerEasy Explorer 打开在eclipse中选定文件所在的目录 在线安装更新地址 : http://easystruts.sourceforge.net/eclipse/updates/ 8. […]
View Details一、设置代码的编码格式: 有时候大家也许会看到这个错误:Save could not be completed. Reason: some characters cannot be mapped using “ISO-8859-1“ character encoding 这个错误是因为你的文件格式是ISO-8859-1,右键点击报错文件->选择Properties->Text file enconding->把ISO-8859-1改为UTF-8或者GBK就解决这个问题了。 这是因为Eclipse默认的文件格式都是ISO-8859-1,那如果大量文件该怎么办呢?我们不会一个一个手动改吧?答案是NO。 方法如下: Eclipse-->Window-->Preferences-->General-->Content Types然后在选择 右边的Text下边的Java Properties File,修改其编码(推荐UTF-8)。 二、编辑器字体(全体,包括PyDev、cdt、jdt的编辑器) Eclipse-->Window-->Preferences-->General-->Appearance--> Colors and Fonts -->Basic --> Text Font-->Change 喜欢哪个就选哪个字体。
View Details