今天终于很高兴地搞定了Ubuntu下用samba实现与Windows文件共享。其实相当简单(比论坛上samba文件服务器设置“最简单篇”还要简单):
在要共享的文件夹上右击,选择“共享文件夹”,第一次做时会提示安装相关服务,只需选中“Windows网络(SMB)”一项就可以了。
安装完samba包后就可以打开“Share Folder”对话框,共享方式选择“Windows网络(SMB)”,其他的默认即可。
此时Windows下的网上邻居已经可以看到你的电脑和共享的文件夹,但是还无法打开。得修改一下访问权限才行,按“ALT+F3”打开终端,输入:
sudo gedit /etc/samba/smb.conf
找到
security = user
修改为
security = share
保存退出。然后执行
sudo /etc/init.d/samba restart
重启samba服务。现在在Win下访问就应该完全没有问题了。
建议在“系统管理”-“共享的文件夹”下修改一下工作组,最好与其他的Windows电脑在同一个组中。
但此方法无法实现对文件夹的授权访问,局域网内所有电脑都可以访问共享的文件夹。如需授权,还请参见“最简单”篇,使用默认的
“security = user”。
PS:我在设置共享时还遇到了无法访问挂载的NTFS的问题,最终发现问题出在“NTFS写入支持配置程序”,我前一阵子居然把两个写入支持都关了,都打开就好了。
今天给《希望泉》杂志的RSS做了一下重定向。
以前杂志订阅用的RSS还是我大一时研究asp那阵子自己写的一个xml,后来由杂志的上一任技术部负责人deven修正了一下。每次新杂志发布时都要自己手动改这个文件,相当的不方便,而且相当容易出错。
可能是出于懒吧,这么不好用,居然还这么一直用下来了。不过今天终于爆发了,到网上查了一下RSS重定向的解决方法。决定把它重定向到《希望泉》官方博客的RSS上去。这样只要在官方博客上发表篇文章就可以了。而且这样的话更新RSS就不需要技术部门出面了。
查到的解决方案只有两种:
1.301永久重定向
貌似大部分人在重定向时都用的这个方法,使用Apache的“.htaccess”文件,在里面写入类似:
redirect permanent rss.xml http://blog.sina.com.cn/rss/hopespring.xml
一句即可实现将rss.xml重定向到http://blog.sina.com.cn/rss/hopespring.xml。而且这种重定向的方法对搜索引擎也很友好。
但经过实现,我学网的服务器貌似不支持这种重定向。只有采用另一种方案了,在xml级别上实现重定向。将原来rss.xml中的内容替换为:
http://blog.sina.com.cn/rss/hopespring.xml
经试验opera可以正常识别这种重定向,而firefox对其支持好像不是很好。不知道其他的订阅工具对其支持如何,但目前也只能这样了。总比手动更新浪费很多时间又出一大堆错误好吧。
昨晚搞定了Ubuntu的鼠标驱动,信心百倍,觉得似乎可以再次安装一下ATI最新的显卡驱动了。毕竟挂起(待机)是一个很实用的功能,坛子里也早就有人说07年12月之后的ATI官方驱动已经解决了挂起的问题。而现在08年1月的驱动也已经出来了,置顶贴里也终于有“推荐安装”的字样了。
按照“ati官方驱动(非开源)的安装配置(08/01/19)”里的说明,开始下载安装最新版的驱动。
第一遍安装,xorg-driver-fglrx安装时报了个“libGL”的错误,但安装完毕。用“fglrxinfo”测试得到的结果也正确。但2D加速不怎样,3D加速几乎没有。决定恢复源中的驱动。参照“方法一”卸载最新的驱动,重新安装源中的驱动。结果重启后顶部的菜单面板自动隐藏时花屏。考虑可能是那个“libGL”的原因,再加上也不知道怎样修复,决定重装系统,从头开始,直接安装ATI8.1驱动。
第二遍安装,过程一切正常,没有libGL的错误了,“fglrxinfo”也没问题。但明显感觉2D、3D加速不如以前。3D窗口切换时明显卡了。挂起问题确实解决了。点“挂起”后本本的电源灯终于灭掉了。但是敲空格唤醒时点不亮屏幕,鼠标、键盘、无线网卡上的灯倒是都亮了……最要命的是居然无法正常注销,点击注销后屏幕黄在那就没反应了。失望,看来还是得回源里的驱动。再次按照“方法一”安装源中的驱动,再次花屏。无语,看来还得重装。
又安装一次系统。一天之中我忍受了再次新装Ubuntu的不爽:开机黑屏、中文包下载、字体设置……唯一值得庆幸的是当初把/home挂到了一个单独的分区上。个人设置基本上没丢。
为了一个显卡驱动,我整整折腾了一天。可以说是浪费了不少时间。不过也算是有点收获:
安装Ubuntu终于轻车熟路了,安装时用到的sudo,apt-get,cp,xorg.conf,local.conf等等,基本上都可以用命令完成了。
打开了Ubuntu的tty1-tty6这6个字符控制界面(删掉boot.ini中启动项后的vga=XXX),用它们完成了不少维护任务。
知道3D桌面有两种实现方案:aiglx+compiz,xgl+compiz,A卡Ubuntu源里的驱动不支持aiglx,所以之前用的
sudo apt-get install xserver-xgl compizconfig-settings-manager
命令是安装xgl和compiz实现的3D桌面。
明白了备份的重要性,捯饬驱动这类容易让系统挂掉的东西之前一定要备份好系统!
玩Ubuntu这段时间来,与硬件相关上有两个问题始终没能解决
- 无法挂起
- 鼠标上的前进和后退键不起作用
第一个问题在《珍爱生命,请用N卡》上已经说过了,ATI显卡驱动的问题,暂时还只能等等。第二个问题今天在浏览论坛时偶然发现了解决方案“罗技多键鼠标的配置”,完全按照帖子里的方法照做,成功!
挂起能用的时候就完美了!
上周我们进行了最后一周的课程:操作系统课程设计。
这个名字听起来挺吓人,不过实际上比期中的那个系统软件分析与设计简单多了。老师出的题目不过是让实现一个多线程的演示程序。由于只是个演示用途,也没有限制开发环境。但有一点特殊的是这次课程是分组做的,老师按照学生名单每相邻三个人分为一组,完成同一个任务。我被分到和班里学习最好的两个女生一起完成第一道题:演示对两个缓冲区的put、move、get操作。
说实话,不过是一个简单的演示程序。后面用Java的Lock和Condition实现一个buffer的model,用swing做一个图形界面,再写个controller就可以了。上学期编的那个连连看才花了我四天时间。但现在我要和两个女生合作,这个难度可就高了一个数量级。不过毕竟是团队嘛,如果我什么都不管,自己单干的话确实也不是很好(我一哥们选择了这条路,自己单独完成一道题)。
一周的课设下来,大概花了一半的时间解释和讨论程序的思路和实现方法,一半的时间用在编码上。总算在让大家都基本明白程序是怎么回事的基础上完成了设计。而且体会到了给别人讲解确确实实是提升自己理解能力的非常好的方法。
以下是我自己写的缓冲区类,存放自定义的数据类型Data,这个类型里只包括一个整型的id和Color型的随机颜色信息:
package model;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author riqe
* buffer
*/
public class SynchBuffer {
private Data[] buffers;
private int head;
private int rear;
private Lock bufferLock;
private Condition puttable;
private Condition takable;
public Statistic statistic;
public SynchBuffer(int size){
buffers=new Data[size+1];
head=0;
rear=0;
bufferLock=new ReentrantLock();
puttable=bufferLock.newCondition();
takable=bufferLock.newCondition();
statistic=new Statistic();
}
/**
* Put data into the buffer.
* It will cause the calling thread blocked
* when the buffer is being operated or full.
* @param value data to put into the buffer.
* @param delay millisecond to delay after put the data in.
*/
public void put(Data value,int delay){
bufferLock.lock();
try{
while((head-rear+buffers.length)%buffers.length==1)
puttable.await();
buffers[rear]=value;
rear=(rear+1)%buffers.length;
statistic.addPutCount();
takable.signalAll();
Thread.sleep(delay);
}catch (InterruptedException e) {
}finally{
bufferLock.unlock();
}
}
/**
* Take data out of the buffer.
* It will cause the calling thread blocked
* when the buffer is being operated or empty.
* @param delay millisecond to delay after take the data out
* @return
*/
public Data take(int delay){
Data getValue=null;
bufferLock.lock();
try{
while((buffers.length+head-rear)%buffers.length==0)
takable.await();
getValue=buffers[head];
head=(head+1)%buffers.length;
statistic.addTakeCount();
puttable.signalAll();
Thread.sleep(delay);
}catch (InterruptedException e) {
}finally{
bufferLock.unlock();
}
return getValue;
}
/**
* clear up the buffer.
*/
public void sweep(){
bufferLock.lock();
rear=head;
bufferLock.unlock();
}
}
附上这次的成果,jar文件,安装Java Runtime Environment双击即可运行。
双缓冲操作显示