NFS攻略 - Windows下 NFS 客户端的安装及设置 - Bash @ Linux - ITeye技术网站
4 Windows下 NFS 客户端的安装及设置
在Windows上使用NFS客户端,需要把nfs共享目录映射到一个驱动器。此处假定为映射的驱动器为N:,而nfs共享目录为192.168.6.55:/vmsnfs。
4.1 安装Microsoft Windows Services for UNIX
Windows Services for UNIX 3.5 提 供支援充分和整合完全的跨平台網路服務,適應需要 Windows 和 UNIX 基礎環境之間交互操作性的企業客 戶。 Windows Services for UNIX 3.5 為企業客戶提供儲存在多個平台的資訊之緊密存取,統一了跨平台的網路管理,並且重複 使用 UNIX 應用程式和 Windows 上的指令碼。其中包括支援網路檔案系統 (NFS)。
下载Microsoft Windows Services for UNIX
地址: http://www.microsoft.com/taiwan/windows/sfu/
安装程序: SFU35SEL_EN.exe 217 MB (228,178,504 字节)
安装Microsoft Windows Services for UNIX
注意与NFS有关的两个组件是一定要安装的
NFS->Client for NFS
Authentication tools for NFS->Server for PCNFS
安装过程比较简单,此处略过。
4.2 在Windows下配置NFS客户端
打开Services for UNIX Administration配置用户名
点 “开始菜单”->“所有程 序”->“Windows Services for UNIX”->“Services for UNIX Administration”, 会弹出一个名为“Services for UNIX Administration”的窗口。
左边栏切到Server for PCNFS。
右边栏切到Groups,添加Group Name为root,Group ID(GID)为0的组。
右边栏切到Users,添加User name为root,User logon name为root,Primary group name为root,User ID(UID)为0的用户,密码不必与Linux系统的密码相同。
点击右上角的Apply保存。
映射网络驱动器到NFS共享目录(界面操作方式,不推荐)
在“网上邻居”上按右键,选择“映射网络驱动器”,会弹出映射网络驱动器对话框。
选择盘符,比如N:
输入网络资源路径:192.168.6.55:/vmsnfs
点 “确定”。会弹出一个NFS login successful的信息框,注意检查显示的UID和GID的值(一般为-2),点“否”,会弹出 Client for NFS Drive N:对话框。选中Login using PCNFS authentication对话框,在 Server name中填入localhost,在User name中填入root,在Password中填入前面设定的密码,点“确定”,会再次弹 出NFS login successful的信息框,此次会显示UID和GID均为0,点“确定”。
这时打开“我的电脑”,会看到增加了一个盘符N:。在其上按右键打开属性对话框,切换到NFS Attributes页,会看到权限,切换到NFS Mount Options,会看到UID和GID等信息。注意确认一下UID和GID一定要为0。
映射网络驱动器到NFS共享目录(批处理脚本方式,推荐)
上 面这段挺费劲的,但我不推荐使用这种方式来设置,因为一旦重新启动机器,你再打开“我的电脑”,在NFS对应的盘符N:属性就会看到UID和GID由还原 成了-2。还得先把它断开,然后重新设置,挺麻烦的。所幸微软提供了类似Unix下的命令行工具mount.exe,可以编写如下内容的批处理脚本并保存 为nfs.bat。其中第一行是用来记录操作日志的,第二行启动Server for PCNFS,第三行是避免mount命令出错,第四行是把nfs共 享目录挂载到N:(注意-p:xxx要设置成前面设定的密码),第五行列出N:下的文件和目录。
- echo mount nfs at %date% %time% >>c:\nfs.log
- net start pcnfsd >>c:\nfs.log
- net use /pers:no >>c:\nfs.log
- mount -o mtype=hard -o pcnfs=localhost -u:root -p:xxx 192.168.6.55:/vmsnfs N: >>c:\nfs.log
- dir N: >>c:\nfs.log
双击执行nfs.bat,然后打开“我的电脑”就可以看到N:了,然后打开c:\nfs.log看一下。
- mount nfs at 2010-11-19 星期五 11:33:39.15
- 命令成功完成。
- N: is now successfully connected to 192.168.6.55:/vmsnfs
- The command completed successfully.
- mounted
如果看到successully之类的关键字眼,就表明mount成功了。
4.3 在Windows下使用NFS客户端会碰到的问题
Q:在挂载nfs共享目录时,mount.exe报1326错误,是什么原因?
Network Error - 1326
Type 'NET HELPMSG 1326' for more information.
A:根据提示,使用net helpmsg看一下,如下所示:
C:\>net helpmsg 1326
登录失败: 未知的用户名或错误密码。
这时,需要检查一下mount命令后面的-u:user和-p:password这两部分是否正确了。
Q:在挂载nfs共享目录时,mount.exe报85错误,是什么原因?
Network Error - 85
Type 'NET HELPMSG 85' for more information.
A:根据提示,使用net helpmsg看一下,如下所示:
C:\>net helpmsg 85
本地设备名已在使用中。
这是由于对同一个驱动器重复执行mount命令造成的,确认驱动器选择是否正确。
Q:创建目录或文件时报“拒绝访问”,怎么办?
A:首先打开“我的电脑”,在NFS映射的驱动器上按右键,打开属性对话框。切换到NFS Mount Options页,看显示的UID和GID是否为0,可能你看到的是-2。关闭属性对话框之后,在驱动器上按右键,选择“断开”,然后参照上一节重新设置。
如果看到NFS Mount Options页显示的UID和GID都为0,那么就要到NFS服务端去查找原因了。比如,检查一下共享目录的属主和组是否为nfsnobody,参见前面的章节。
Q:怎样做到登录Windows之后自动启动NFS?
A:按照4.2创建nfs.bat脚本,然后复制到“启动”目录(我的XP系统是“C:\Documents and Settings\Administrator\「开始」菜单\程序\启动”目录)。在登录之后就会自动挂载nfs共享目录。如果需要确认是否成功,打开c:\nfs.log看一下。
Q:怎样做到启动Windows之后自动挂载NFS,而不管是否登录?
A:这个就有点难了。本人试验了如下两种方式,都无法成功的挂在nfs共享目录。(奇怪,手工直接执行nfs.bat就能成功)
(1)安装Windows Resource Kits,里面有instsrv.exe和srvany.exe两个程序,制作了系统服务MountNFS,用来执行nfs.bat脚本。
(2)设置“任务计划”,执行文件为nfs.bat,触发条件为“计算机启动时”。
最后,只能将XP系统设置为自动登录才得以解决,不算很完美。具体如下:
先按照上一个问题中所述,将nfs.bat复制到“启动”目录。
然后执行“rundll32 netplwiz.dll,UsersRunDll ”,在弹出的用户账户对话框中,把“要使用本机,用户必须输入用户名和密码(E)”前面的钩去掉,然后点“确定”。这时,会提示输入账号和密码,输入好之后保存就行了。下次启动机器就会直接登录,而无需手工输入账号和密码了。
因为自动登录Windows之后会自动去执行“启动”目录的nfs.bat脚本,也就会挂载nfs共享目录了。
Q:怎样才能在Windows下用程序访问文件服务器上的文件?
A:在Linux下文件/vmsnfs/subdir/file.wav,可以直接访问,在Windows下在路径前面加上N:无法访问N:/vmsnfs/subdir/file.wav,必须要把路径里面的vmsnfs去掉,变成N:/subdir/file.wav才能访问。这样程序处理起来稍微有点麻烦。
如果在Linux文件服务器的共享目录上创建一个名为vmsnfs符号链接,就可以用N:/vmsnfs/subdir/file.wav来访问了,具体做法如下:
cd /vmsnfs
ln -s . vmsnfs
Spring 高效批量邮件发送 - shupili141005 - ITeye技术网站
Gmail 邮件发送配置
email.properties 文件:
# Gmail Configuration
email.host=smtp.gmail.com
email.port=587
email.username=******
email.password=******
email.defaultEncoding=UTF-8
applicationContext.xml 文件:
<!-- Email Service -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${email.host}"/>
<property name="port" value="${email.port}"/>
<property name="username" value="${email.username}"/>
<property name="password" value="${email.password}"/>
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.host">smtp.gmail.com</prop>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.port">465 </prop>
</props>
<!--
<value>
mail.smtp.auth=true
</value>
-->
</property>
<property name="defaultEncoding" value="${email.defaultEncoding}"></property>
</bean>
<bean id="emailSender" class="com.tucue.common.util.SimpleEmailSender">
<property name="mailSender" ref="mailSender"></property>
</bean>
<!-- end of Email Service -->
FAQ :
com .sun .mail .smtp .SMTPSendFailedException: 530 5 .7 . 0 Must issue a STARTTLS command first .
A :
<prop key="mail.smtp.starttls.enable">true</prop>
Send Batch Mail
http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mail/MailSender .html
Method Summary
void |
send (SimpleMailMessage simpleMessage) Send the given simple mail message. |
void |
send (SimpleMailMessage [] simpleMessages) Send the given array of simple mail messages in batch. |
Method Summary
MimeMessage |
createMimeMessage () Create a new JavaMail MimeMessage for the underlying JavaMail Session of this sender. |
MimeMessage |
createMimeMessage (InputStream contentStream) Create a new JavaMail MimeMessage for the underlying JavaMail Session of this sender, using the given input stream as the message source. |
void |
send (MimeMessage mimeMessage) Send the given JavaMail MIME message . |
void |
send (MimeMessage [] mimeMessages) Send the given array of JavaMail MIME messages in batch . |
void |
send (MimeMessagePreparator mimeMessagePreparator) Send the JavaMail MIME message prepared by the given MimeMessagePreparator. |
void |
send (MimeMessagePreparator [] mimeMessagePreparators) Send the JavaMail MIME messages prepared by the given MimeMessagePreparators. |
方案一:首先获取要发送邮件的所有地址,然后迭代的封装单个 MimeMessage 之后就将其发送出去(即发送一封邮件)。
SimpleEmailSender.java 文件
- /**
- * 功能: 传入邮件接收者地址、标题和内容,然后发送单个邮件服务
- * @param {@link String} emailAddress
- * @param {@link String} subject
- * @param {@link String} content
- * @throws MessagingException
- */
- public static void sendSimpleEmail(<span style="color: #ff0000;">String receiver</span>
- , String subject, String content) throws MessagingException {
- JavaMailSender sender = (JavaMailSender) mailSender;
- <span style="color: #ff0000;">MimeMessage mimeMessage</span>
- = sender.createMimeMessage();
- MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
- messageHelper.setFrom("***@<span style="color: #ff0000;">gmail</span>
- .com");
- messageHelper.setTo(receiver);
- messageHelper.setSubject(subject);
- messageHelper.setText(content, true);
- sender.send(<span style="color: #ff0000;">mimeMessage</span>
- );
- }
UserInfoAction.java 文件
- // 用户 -> 批量邮件发送
- public String sendBatchEmail() {
- if(!emailReceiverList.equals("")) { // 发送用户邮件
- // String[] receiverList = emailReceiverList.split(",");
- String[] receiverList = new String[20];
- for(int i = 0; i < 20; ++i) {
- receiverList[i] = "[email protected]";
- }
- long start = System.currentTimeMillis();
- for(<span style="color: #ff0000;">String receiver: receiverList</span>
- ) {
- try {
- <span style="color: #ff0000;">SimpleEmailSender.sendSimpleEmail(receiver, emailSubject, emailContent);</span>
- } catch (MessagingException e) {
- e.printStackTrace();
- }
- }
- long end = System.currentTimeMillis();
- System.out.println(end - start);
- } else {// 发送用户组邮件
- List<String> receiverList = userInfoService.getUserEmailByGroupId(groupID);
- for(String receiver: receiverList) {
- try {
- SimpleEmailSender.sendSimpleEmail(receiver, emailSubject, emailContent);
- } catch (MessagingException e) {
- e.printStackTrace();
- }
- }
- }
- return SUCCESS;
- }
方案二:首先获取要发送邮件的所有地址,然后一起封装成 MimeMessage[] 之后就将其发送出去(即批量发送所有要发送的邮件)。
SimpleEmailSender.java 文件
- /**
- * 功能: 传入邮件接收者地址列表、标题和内容,然后发送批量邮件服务
- * @param {@link List<String>} receiverList
- * @param {@link String} subject
- * @param {@link String} content
- * @throws MessagingException
- */
- public static void sendBulkEmail(<span style="color: #ff0000;">List<String> receiverList</span>
- , String subject, String content) throws MessagingException {
- JavaMailSender sender = (JavaMailSender) mailSender;
- int len = receiverList.size();
- <span style="color: #ff0000;">MimeMessage[] mimeMessageList</span>
- = new MimeMessage[len]; // 注意:是<span style="color: #ff0000;">数组类型</span>
- MimeMessageHelper messageHelper = null;
- for(int i = 0; i < len; ++i) {
- <span style="color: #ff0000;">mimeMessageList[i]</span>
- = sender.createMimeMessage();
- messageHelper = new MimeMessageHelper(mimeMessageList[i], true, "UTF-8");
- messageHelper.setFrom("[email protected]");
- messageHelper.setTo(receiverList.get(i));
- messageHelper.setSubject(subject);
- messageHelper.setText(content, true);
- }
- sender.send(<span style="color: #ff0000;">mimeMessageList</span>
- );
- }
UserInfoAction.java 文件
- // 用户 -> 批量邮件发送
- public String sendBatchEmail() {
- if(!emailReceiverList.equals("")) { // 发送用户邮件
- / String[] receiverList = emailReceiverList.split(",");
- <span style="color: #ff0000;">List<String> receiverList</span>
- = new ArrayList<String>(20);
- for(int i = 0; i < 20; ++i) {
- receiverList.add("[email protected]");
- }
- long start = System.currentTimeMillis();
- try {
- / SimpleEmailSender.sendBulkEmail(Arrays.asList(receiverList), emailSubject, emailContent);
- SimpleEmailSender.<span style="color: #ff0000;">sendBulkEmail(receiverList</span>
- emailSubject, emailContent);
- } catch (MessagingException e) {
- e.printStackTrace();
- }
- long end = System.currentTimeMillis();
- System.out.println(end - start);
- } else {// 发送用户组邮件
- List<String> receiverList = userInfoService.getUserEmailByGroupId(groupID);
- try {
- SimpleEmailSender.sendBulkEmail(receiverList, emailSubject, emailContent);
- } catch (MessagingException e) {
- e.printStackTrace();
- }
- }
- return SUCCESS;
- }
根据上述两种方案,通过发送 20 封邮件进行测试后发,发现第二种方案(用时 36984 ms)比第一种(81266 ms)的 执行效率 2.1 倍多 。
总结
通过这次实验,感觉自己收获了不少。第一,评价哪种方案优劣,用你需要的数据测试就能体现执行效率,但健壮性和可扩展性就不能一概而论了;第二,要想编写更加高效的代码,就必须对你特别重要(特别是常用基础类)的 API 有足够的熟知。就以这个案例为例,刚开始我没有仔细看过 JavaMailSender 的 API ,导致就不知道用 send (MimeMessage [] mimeMessages) 这个函数,所以也不知道存在第二种方案。后来突然发现有这个函数,就像能不能对先前的发送单个邮件服务加以改进,第二种方案也就是这样萌生的。
211·AutoCAD图导出为图片方法汇总_我只是一小小鸟_新浪博客
这个方法其实就是添加一个虚拟的打印机,直接将dwg图打印成图片格式。AutoCAD其实提供了这样的虚拟打印机,只是没有默认安装,所以需要手工添加,步骤如下:
AutoCAD→【文件】菜单→【绘图仪管理器】菜单→打开Plotters文件夹,在文件夹里面打开【添加绘图仪向导】→【下一步】,选择“我的电脑”→【下一步】,进入到“绘图仪型号”对话框(如下图)。
在“生产商”列表里选择“光栅文件格式”,“型号”列表里面选择“TIFF Version 6(不压缩)”(选择TIFF是个个人习惯,事实上可以选择任意其他型号),一直点【下一步】,直至【完成】。
接下来的事情,就跟普通的AutoCAD图纸打印无异,不过需要提醒一点的是,在图纸大小的选择上建议根据需要自定义,这样理论上可以得到无限大的(同时也是无限清晰)的图片。比如下图,图纸尺寸定义的是5000×5000像素的,最终保存成图片以后的大小是90多M,已经相当清晰了。
值得强调的是,在添加绘图仪的生产商时并不一定选择光栅文件,另外几种也是可以选择的,这有待读者自己去摸索。这里提供一个@小雄JT(微博地址:http://weibo.com/TRANSzhou)介绍的一个方法:打印成EPS文件。
以下关于EPS的内容来自维基百科EPS条目(地址:http://zh.wikipedia.org/wiki/EPS)。
EPS(Encapsulated PostScript)是印前系统中功能最强的一种图档格式,向量及位图皆可包容,向量图形的EPS档可以在Illustrator及CorelDraw中修改,也可再加载到Photoshop中做影像合成,可以在任何的作业平台及高分辨率输出设备上,输出色彩精确的向量或位图,是做分色印刷美工排版人员最爱使用的图档格式。
AutoCAD图输出为EPS格式文件和输出为TIFF图片类似,只是在添加虚拟打印机时需要选择Adobe的PostScript,如下图所示。
虚拟打印后保存的文件,需要使用Photoshop打开,再转换为图片(jpg等)。据@小雄JT 所说,AutoCAD输出的eps文件可以分层,多用在展板或挂图制作上。这种格式的优点就是分辨率高,但缺点是文件也大。
还记得如何将PDF转成图片吗?如果不知道的话,请看博客《193·【总结】如何将Office文件转换成图片(买三送一,附…》(地址:http://blog.sina.com.cn/s/blog_638f98570101cnym.html)
至于如何将DWG图转换成PDF文件,我是这样做的:安装PDF虚拟打印机。PDF虚拟打印机有许多种,推荐安装的是pdfFactory。接下来,就是打印图纸的事儿了。方法三相对于方法二来说有一个简便的地方,即可以直接将图片复制到剪切板里面,这样可以将图片粘贴到任何需要的地方。但是方法三又有一个缺点(也算不上吧),即不能精确的控制图片的像素。
这个方法要用到BetterWMF,那什么是BetterWMF呢?笔者很懒,直接抄软件的使用说明吧:BetterWMF是一款可以将AutoCAD中的DWG图形拷贝到Word中的软件。它的独特之处是在拷贝时可以自动去除那令人烦恼的黑色背景并具有自动修剪图形的空白边缘、自动填充颜色、自动将DWG格式的图形文件转变为WMF图像格式的功能,另外它还能对图形进行缩放、旋转,并能根据使用者的需要对线条的宽度和颜色进行设置。如果你是一位专业制图人员,或者你是一位需要经常编辑制图资料的编辑人员,那么BetterWMF一定可以作为你的首选。嗯,略有广告嫌疑,但我确实不是卖软件的。
BetterWMF常规选线窗口如下图所示。
1、打开“文件(file)”菜单下的“打印机管理器(plottermanager)”。
2、运行“打印机添加向导(Add-A-Plotter Wizard)。
3、点击“下一步(next)”,在右边的选项中选择“我的电脑(My Computer)”,继续“下一步”,进入“打印机型号(Plotter Model)”选择页面。
4、在左边的“厂商(Manufacturers)”中选择“光栅文件格式(Raster File Formats)”,这是我们可以看到在右边的“型号(Model)”中列出了很多种我们熟悉的图形格式,我习惯于使用JPG格式,选择“独立的JPEG编组(Independent JPEG Group JFIF)”,点击“下一步(next)”,直到完成。这样我们以后就可以将CAD图形输出位JPG格式了。接下来我们来看看该如何使用它。
5、用CAD做好一幅图后,我们打开“文件(file)”菜单下的“打印(plotter...)”。在打印对话框中,在打印机类型中选择我们刚刚装好的“Independent JPEG Group JFIF”,在下面的“打印到文件(plot to file)”里添上生成的文件名称和路径,这个文件就是一个可以再photoshop中编辑的图形了。在页面设置中选择一个我们需要的尺寸,其他的就和使用真正的打印机方法是一样的。点击打印后,等几秒钟,图形就生成了。
注:系统默认的页面尺寸只有1280*1600,这个尺寸并不能满足我们的需要。我们可以在打印机的属性中自定义我们所需要的尺寸。