X-LIN

2012年10月28日

双系统(windows和ubuntu)删除ubuntu的grub2

一、工具:

MbrFix: http://www.oschina.net/p/mbrfix

二、步骤:

1.将下载到的MbrFix解压到某个位置,譬如比较直接的位置是D:\MbrFix.exe

2.运行CMD(win7/Vista需要管理员权限),输入“D:”将地址切换到D盘,输入修复Mbr的命令:

如果系统是XP,输入:MbrFix /drive 0 fixmbr /yes

如果是Vista或者Win7就要指定操作系统的类型,我是Win7,需要输入:MbrFix /drive 0 fixmbr /win7 /yes

3.上面一个步骤后电脑重启就跳过Grub2直接进入windows了(操作成功的标志是输入上面的命令后没有任何提示- -),但是Linux的Ext4分区还在硬盘上占着。我尝试用win7的磁盘管理器只能删除Linux分区却不能新建,所以直接推荐使用 DiskGenius进行分区删除操作,新建分区格式化成NTFS就最终完成了。


posted @ 2012-10-28 19:17 林 阅读(1159) | 评论 (0)编辑 收藏

2012年10月25日

char str[] 和 char *str 的区别

char* get_str(void)  
{  
    char str[] = {"abcd"};  
    return str;  

char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址。
       此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的。


char* get_str(void)  
{  
    char *str = {"abcd"};  
    return str;  

char* str = {"abcd"};表示先定义个字符串常量,并将其地址赋给str。
      此函数返回的是字符串常量的地址,而像这种字符串都是属于全局的,在编译的时候就已经分配了内存了,只有程序退出的时候才会被销毁,所以返回它的地址是没有问题的,但是你最好返回常量指针,因为你不能去改变字符串常量的值。

 

     这个str就在栈里面,但后面的字符串在常量区,函数返回的时候,先将常量区的地址返回,然后作用域结束,释放str在栈里面的空间。。
const char str[] = "abcd";        //abc存储在堆栈中   
const char *str = "abcd";         //abc存储在静态存储区 

准确的说,上面两个“abc"都是存储在静态存储区,即常量区。常量区是可读不可写的。所以任何试图对常量区进行写的操作都是非法的,当然了,这也不是一 定不可写的,你可以采取某种渠道改变常量区的内存属性,比如改变pe相关节的属性就可以对常量区进行读写,当然了,这个目前可以忽略。。。
       那么为什么str[] = "abc";      可以写呢?   答案就在str[] = "abc";会有一个额外的拷贝过程,即把常量区的 "abc"拷贝到栈内存去,所以就可以写了。

      总结:
所有以" "或' '包含的字符、字符串都是常量,应该是存储在堆上。
char *str = "xxxxx",str指向该常量地址。
char str[] = "xxxxx",str在栈上申请空间,将常量内容复制进来,所以是局部变量。

 

首先,数组和指针是不同的数据类型,有本质的区别:
char str[] = "abcd";         //sizeof(str) == 5 * sizeof(char)
char * str = "abcd";        //sizeof(str) == 4(x86) or 8(x64)
数组可以自动转型成指针,指针不能转成数组。

 

然后,字符串等价于字符数组,而不等于字符指针。根据上一条,字符串可以自动转型成字符指针。

 

再然后,"abcd"叫做“字符串常量”,任何类型的常量都是右值(没有名字的临时变量),必须让"abcd"成为左值(有名字的变量),才能够修改"abcd"这个字符串。
char str[] = "abcd";              //等号两端是相同的数据类型,右值成为左值
char * str = "abcd";             //等号两端是不同的数据类型,右端自动转型成char*,该char*得到了str的名字,而"abcd"这个char数组仍然没有名字。

 

char * str是存储在全局静态存储区,所以,虽然是局部变量但函数返回后依然可以拿到正确的值!
char str[] 是存储在栈上的,local variable ,函数返回后,OS就收回空间了,就不复存在了,所以,拿不到正确的结果!

 

 char str[]="name";与char str[5];str="name" 的不同之处在哪,能不能从内存分配的角度讲一讲,我知道数组名字是一个常量地址(指针),第一个为什么对,第二个为什么错?

 

       第二个先定义了一个数组,要知道数组名str是数组分配到的空间的首地址,str="name"应该是等号两边类型不匹配的错误。一般的常量应该没有内存地址的,除非有某个变量指向了该常量。
       数组名是地址常量,那么常量当然不允许被重新赋值。
       "name"是一个字符串常量他存储在常量存储区,只能用一个指针指向它却不允许改变:char*p;p="name";
      一般情况下char str[]="name";数组是在栈上的空间由编译器分配,内容可以由用户改变。

posted @ 2012-10-25 18:40 林 阅读(288) | 评论 (0)编辑 收藏

2012年10月23日

linux/ubuntu下free查看内存占用大的解释

$ free -m
               total        used      free      shared    buffers     cached
Mem:       1908       1844       64         0              56         689
-/+ buffers/cache:   1098      810
Swap:      3904          0        3904
一开始吓了我一跳,我开了个虚拟机分了512m内存,别的没开啥大程序,怎么那个free就变成64m那么一点儿了。。。后来查了下资料,才知道是这么回事!如下:

总物理内存:1908m,已用了1844m, shard:多个进程共享的内存为0,磁盘缓存的大小为689MB

第二行(mem)的 used/free与第三行(-/ buffers/cache) used/free的区别。

这两个的区别在于使用的角度来看,第二行 是从OS的角度来看,因为对于 OS,buffers/cached 都是属于被使用,所以他的可用内存是15864KB,已用内存是465932KB,其中包括,内核(OS)使用 Application(X, oracle,etc)使用的 buffers cached.

第三行所指的是从应用程序角度来看,对于应用程序来 说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

所 以从应用程序的角度来说,可用内存=系统free memory buffers cached.

Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
total1:    表示物理内存总量。
used1:     表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free1:     未被分配的内存。
shared1:   共享内存,一般系统不会用到,这里也不讨论。
buffers1:  系统分配但未被使用的buffers 数量。
cached1:   系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
  
cache 和 buffer的区别:

Cache: 高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周 期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提 高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢 的设备读入数据时,速度快的设备的操作进程不发生间断。
     缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定 期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的 灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越 大越倾向于使用swap。默认为60,可以改一下试试。
两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字 段放在buffer中保存。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。


因此,linux 内存 used的内存大是正常的, 不同于windows哦。

posted @ 2012-10-23 22:30 林 阅读(587) | 评论 (0)编辑 收藏

2012年10月21日

在使用apt-get出现如下错误解决办法

Problem with MergeList /var/lib/apt/lists/mirrors.163.com_ubuntu_dists_precise_universe_binary-i386_Packages
执行下面命令:
sudo rm /var/lib/apt/lists/* -vf

posted @ 2012-10-21 19:31 林 阅读(287) | 评论 (0)编辑 收藏

2012年10月18日

Ubuntu12.04 不能进入root用户解决办法

编辑 lightdm.conf文件
sudo gedit /etc/lightdm/lightdm.conf

将整个文件更改为:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu
greeter-show-manual-login=true 
allow-guest=false
保存重启即可
 
如果上面的方法不成功,可试试下面这种方式:

修改/etc/pam.d/login文件:

auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

修改成为下面的内容:

auth requisite pam_securetty.so
做完上面的操作之后,重启计算机。

posted @ 2012-10-18 23:04 林 阅读(377) | 评论 (0)编辑 收藏

2012年9月26日

Ubuntu播放器中文乱码解决

使用Ubuntu自带的Rhythmbox音乐播放器的时候有的中文歌曲会有乱码的现象,这是因为在windows平台下保存的歌曲名编码不一样所致。解决Ubuntu播放器中文乱码方法很简单:

1、首先打开终端下,执行命令:

sudo apt-get install python-mutagen
2、从终端进入MP3目录,执行以命令进行转换:

进入MP3目录,一般其它分区是挂在/media下,使用命令:cd /media 可以看到其他分区。进入到存放mp3的目录执行命令:

mid3iconv -e GBK  *.mp3
可以把所在MP3目录下所有文件标签都升级为ntf8格式。
最后重启播放器再导入一次歌曲就不会有乱码了,这样Ubuntu播放器中文乱码问题就解决啦。

posted @ 2012-09-26 20:10 林 阅读(384) | 评论 (0)编辑 收藏

2012年9月19日

JList应用

制作更酷的JList界面
内容:
1。绘制器的工作原理。
2。用自订的绘制器更换JList和JComboBox的外观。
3。让新的外观响应鼠标事件。

借助swing体系的mvc设计理念,为组件更换不同的外观成为轻而易举的事情。本文主要以JList和JComboBox为例讲解ListCellRenderer的原理与用法.


一、绘制器的工作原理
不管是JList还是JComboBox,它们都用到了ListCellRenderer,因为JComboBox本身就是由一个下拉式的JList和TextField组成的. 在这里,它们使用了callback的机制。

callback的一是种常见的方式是在A类中调用B类中的方法,在A类中先要登记一个(也可以是多个)B类的实例引用,在需要调用时再通过该实例来调用它的内部方法.这样的机制在很多的设计模式中都有用到,如Observer等.还有AWT的事件机制也用到了callback.

要实现callback,通常将B类设计成一个能被callback的接口.在JList的绘制器中,swing提供了一个ListCellRenderer接口,
public interface ListCellRenderer {
    Component getListCellRendererComponent(
        JList list,
        Object value,
        int index,
        boolean isSelected,
        boolean cellHasFocus);
}
这个接口只提供一个方法,我们只要实现了这个接口,并将它的实例引用传给JList,就可以将JList替换成不同的样式了.看一下ListCellRenderer是如何工作的,

在绘制JList的每个Cell之前,它会去调用getListCellComponent( ),得到一个Component,并
将这个Component绘制在正确的位置.因为getListCellComponent( )返回的是Component,所以我们几乎可以扩展任意一个Component,来改变JList,JComboBox等的外观.

二、制作自已的绘制器
我们现在要想让JList中显示一组学生名单,同时每个名单前显示该学生的图标.如下图所示

我们先来想一想,Swing中有什么组件既可以显示图标也可以显示文字? JLabel.对了。我们就用JLabel作为JList的绘制器, 看看我扩展的JLabel类,它实现了ListCellRenderer接口:
        /* 可以显示图标的ListCell绘制器 */
        public class IconListItemRenderer extends JLabel implements ListCellRenderer
        {
            private Border
                selectedBorder = BorderFactory.createLineBorder(Color.blue,1),
                emptyBorder = BorderFactory.createEmptyBorder(1,1,1,1);

            public Component getListCellRendererComponent(
                        JList list,
                        Object value,
                        int index,
                        boolean isSelected,
                        boolean cellHasFocus)
                {

                IconListItem item = (IconListItem)value;
                this.setIcon(item.getIcon());
                this.setText(item.getText());

                if ( isSelected ) setBorder (selectedBorder);
                else setBorder(emptyBorder);
                return this;
            }
        }
大家看到,getListCellRendererComponent方法会传入几个参数,我们就用它传入的几个参数设置JLabel的外观:图标与文字。在这个类中,我们用一个IconListItem接收调用者传过来的value,
        IconListItem item = (IconListItem) value;
IconListItem是我另外定义好的一个类,它用来存放每一个List Item的值,
        import javax.swing.*;
        public class IconListItem
        {
            Icon icon;
            String text;
            public IconListItem(Icon icon, String text)
            {
                this.icon = icon;
                this.text = text;
            }
            public Icon getIcon() { return icon;}
            public String getText() { return text;}
            public void setIcon(Icon icon){ this.icon = icon;}
            public void setText(String text){ this.text = text; }
        }
这样的话,我就可以用getIcon()和getText()方法取得每个List Item的值了,
        IconListItem item = (IconListItem) value;
        this.setIcon(item.getIcon());
        this.setText(item.getText());

至此,我们就可以用以下方法方便的更换JList的外观了,
        JList list = new JList();
        list.setCellRenderer(new IconListItemRenderer()); file://安装我们自订的cellRenderer
        DefaultListModel listModel = new DefaultListModel();
        list.setModel(listModel);
        IconListItem item = new IconListItem(new ImageIcon(...),"John");
        listModel.addElement(item);    // 为List增加Item
        ...
由于JComboBox也有一个下拉式清单,所以它的清单也是用ListCellRenderer来绘制的,所以我们也可以将这个IconListItemRenderer给它用:
        JComboBox list = new JComboBox();
        list.setRenderer(new IconListItemRenderer()); //装我们自订的cellRenderer
        DefaultComboBoxModel comboModel = new DefaultComboBoxModel();
        list.setModel(comboModel);
        IconListItem item = new IconListItem(new ImageIcon(...),"John");
        comboModel.addElement(item);    // 为List增加Item
        ...
注意,JComboBox安装绘制器时是用setRenderer()方法,JList是用setCellRenderer()方法,名字稍有不同.

以上大家看到的是可显示一个图标的List, 下面我们再看一个可显示CheckBox的List是如何实现的,以下是例图:

代码实现:
        import javax.swing.*;
        import java.awt.*;
        import javax.swing.border.*;
        import java.awt.event.*;
        /* 可以显示CheckBox的ListCell绘制器 */
        public class CheckListItemRenderer extends JCheckBox implements ListCellRenderer
        {
            public Component getListCellRendererComponent(
                        JList list,
                        Object value,
                        int index,
                        boolean isSelected,
                        boolean cellHasFocus)
            {
                CheckListItem item = (CheckListItem)value;
                this.setSelected(item.getCheck());
                this.setText(item.getText());
                this.setFont(list.getFont());
                this.setEnabled(list.isEnabled());
                return this;
            }
        }
同样这个绘制器中用一个CheckListItem存放每个List Item的值:
        public class CheckListItem
        {
            boolean check;
            String text;
            public CheckListItem(boolean check, String text)
            {
                this.check = check;
                this.text = text;
            }
            public boolean getCheck() { return check; }
            public void setCheck(boolean _check) { check = _check; }
            public String getText() { return text; }
            public void setText(String _text) { text = _text; }
        }
这个绘制器的用法同IconListItemRenderer一样,不多讲了.

三、让自订的绘制器响就鼠标事件
使用以上的CheckListItemRenderer时,大家会发现,虽然List中可以显示CheckBox了,但是用鼠标点击时,没有反应! 现在我就来解决这个问题.要澄清的是,ListCellRenderer本身是只返回一个组件用来绘制一个单元格,不能对用户动作作出反应。为些我们必须在JList上下功夫.JList有一个addMouseListener()方法可以为自身安装一个鼠标监听器,在这里,我实现了一个MouseAdapter,并让它对mousePressed作出响应:
        class CheckListMouseListener extends MouseAdapter
        {
              public void mousePressed(MouseEvent e) {
                JList list = (JList) e.getSource();
                int index = list.locationToIndex(e.getPoint());
                CheckListItem item = (CheckListItem)list.getModel().getElementAt(index);
                item.setCheck(! item.getCheck());
                Rectangle rect = list.getCellBounds(index, index);
                list.repaint(rect);
            }
        }
使用时, 用addMouseListener(new CheckListMouseListener())就行了.

除了包含CheckBox的JList外,许多情况下,我们需要为自制的绘制器加上动作响应,如我们要实现一个可编辑的JList, 除了要扩展JTextField及实现ListCellRenderer之外,还要写一个鼠标监听器和键盘监听器,当双击时,JList变成可编辑状态,当回车时,还原成不可编辑状态

posted @ 2012-09-19 21:45 林 阅读(346) | 评论 (0)编辑 收藏

2012年9月17日

ubuntu 安装mysql

安装MySQL

要安装 MySQL,可以在终端提示符后运行下列命令:

sudo apt-get install mysql-server mysql-client #中途会让你输入一次root用户密码
sudo apt-get install php5-mysql  #安装php5-mysql 是将php和mysql连接起来

一旦安装完成,MySQL 服务器应该自动启动。

sudo start mysql #手动的话这样启动
sudo stop mysql #手动停止

当你修改了配置文件後,你需要重启 mysqld 才能使这些修改生效。

要想检查 mysqld 进程是否已经开启,可以使用下面的命令:

pgrep mysqld
如果进程开启,这个命令将会返回该进程的 id。

 文件结构

MySQL配置文件:/etc/mysql/my.cnf ,其中指定了数据文件存放路径 datadir         = /var/lib/mysql

如果你创建了一个名为 test 的数据库,那么这个数据库的数据会存放到 /var/lib/mysql/test 目录下。

进入MySQL

mysql -uroot -p

修改 MySQL 的管理员密码:

sudo mysqladmin -u root password newpassword

显示数据库:
mysql> show databases;













配置和管理msyql:

  1. 修改mysql最大连接数:cp support-files/my-medium.cnf ./my.cnf,vim my.cnf,增加或修改max_connections=1024

  关于my.cnf:mysql按照下列顺序搜索my.cnf:/etc,mysql安装目录,安装目录下的data。/etc下的是全局设置。

  2. 启动mysql:/usr/local/mysql/bin/mysqld_safe --user=mysql &

    查看mysql版本:mysqladmin -u root -p version

    注:网上安装或者二进制安装的可以直接使用如下命令启动和停止mysql: /etc/init.d/mysql start|stop|restart

  3. 停止mysql:mysqladmin -uroot -ppassw0rd shutdown 注意,u,p后没有空格

  4. 设置mysql自启动:把启动命令加入/etc/rc.local文件中

  5. 允许root远程登陆:

    1)本机登陆mysql:mysql -u root -p (-p一定要有);改变数据库:use mysql;

    2)从所有主机:grant all privileges on *.* to root@"%" identified by "passw0rd" with grant option;

    3)从指定主机:grant all privileges on *.* to root@"192.168.11.205" identified by "passw0rd" with grant option; flush privileges;

    4) 进mysql库查看host为%的数据是否添加:use mysql; select * from user;

  6. 创建数据库,创建user:

    1) 建库:create database test1;

    2) 建用户,赋权:grant all privileges on test1.* to user_test@"%" identified by "passw0rd" with grant option;

    3)删除数据库:drop database test1;

  7. 删除权限:

    1) revoke all privileges on test1.* from test1@"%";

    2) use mysql;

    3) delete from user where user="root" and host="%";

    4) flush privileges;

  8. 显示所有的数据库:show databases; 显示库中所有的表:show tables;

  9. 远程登录mysql:mysql -h ip -u user -p


  10. 设置字符集(以utf8为例):

    1) 查看当前的编码:show variables like 'character%';

    2) 修改my.cnf,在[client]下添加default-character-set=utf8

    3) 在[server]下添加default-character-set=utf8,init_connect='SET NAMES utf8;'

    4) 重启mysql。

    注:只有修改/etc下的my.cnf才能使client的设置起效,安装目录下的设置只能使server的设置有效。

      二进制安装的修改/etc/mysql/my.cnf即可

  11. 旧数据升级到utf8(旧数据以latin1为例):

    1) 导出旧数据:mysqldump --default-character-set=latin1 -hlocalhost -uroot -B dbname --tables old_table >old.sql

    2) 转换编码(Linux和UNIX):iconv -t utf-8 -f gb2312 -c old.sql > new.sql

      这里假定原表的数据为gb2312,也可以去掉-f,让iconv自动判断原来的字符集。

    3) 导入:修改new.sql,在插入或修改语句前加一句话:"SET NAMES utf8;",并修改所有的gb2312为utf8,保存。

      mysql -hlocalhost -uroot -p dbname < new.sql

      如果报max_allowed_packet的错误,是因为文件太大,mysql默认的这个参数是1M,修改my.cnf中的值即可(需要重启mysql)。

  12. 支持utf8的客户端:Mysql-Front,Navicat,PhpMyAdmin,Linux Shell(连接后执行SET NAMES utf8;后就可以读写utf8的数据了。10.4设置完毕后就不用再执行这句话了)

  13. 备份和恢复

    备份单个数据库:mysqldump -uroot -p -B dbname > dbname.sql

    备份全部数据库:mysqldump -uroot -p --all-databases > all.sql

    备份表: mysqldump -uroot -p -B dbname --table tablename > tablename.sql

    恢复数据库:mysql -uroot -p < name.sql

    恢复表:mysql -uroot -p dbname < name.sql (必须指定数据库)

  14. 复制

    Mysql支持单向的异步复制,即一个服务器做主服务器,其他的一个或多个服务器做从服务器。复制是通过二进制日志实现的,主服务器写入,从服务器读取。可以实现多个主    服务器,但是会碰到单个服务器不曾遇到的问题(不推荐)。

    1). 在主服务器上建立一个专门用来做复制的用户:grant replication slave on *.* to 'replicationuser'@'192.168.0.87' identified by 'iverson';

    2). 刷新主服务器上所有的表和块写入语句:flush tables with read lock; 然后读取主服务器上的二进制二进制文件名和分支:SHOW MASTER STATUS;将File和Position的值记录下来。记录后关闭主服务器:mysqladmin -uroot -ppassw0rd shutdown

      如果输出为空,说明服务器没有启用二进制日志,在my.cnf文件中[mysqld]下添加log-bin=mysql-bin,重启后即有。

    3). 为主服务器建立快照(snapshot)

      需要为主服务器上的需要复制的数据库建立快照,Windows可以使用zip格式,Linux和Unix最好使用tar命令。然后上传到从服务器mysql的数据目录,并解压。

      cd mysql-data-dir

      tar cvzf mysql-snapshot.tar ./mydb

      注意:快照中不应该包含任何日志文件或*.info文件,只应该包含要复制的数据库的数据文件(*.frm和*.opt)文件。

      可以用数据库备份(mysqldump)为从服务器做一次数据恢复,保证数据的一致性。

    4). 确认主服务器上my.cnf文件的[mysqld]section包含log-bin选项和server-id,并启动主服务器:

      [mysqld]

      log-bin=mysql-bin

      server-id=1

    5). 停止从服务器,加入server-id,然后启动从服务器:

      [mysqld]

      server-id=2

      注:这里的server-id是从服务器的id,必须与主服务器和其他从服务器不一样。

      可以在从服务器的配置文件中加入read-only选项,这样从服务器就只接受来自主服务器的SQL,确保数据不会被其他途经修改。

    6). 在从服务器上执行如下语句,用系统真实值代替选项:

      change master to MASTER_HOST='master_host', MASTER_USER='replication_user',MASTER_PASSWORD='replication_pwd',

        MASTER_LOG_FILE='recorded_log_file_name',MASTER_LOG_POS=log_position;

    7). 启动从线程:mysql> START SLAVE; 停止从线程:stop slave;(注意:主服务器的防火墙应该允许3306端口连接)

    验证:此时主服务器和从服务器上的数据应该是一致的,在主服务器上插入修改删除数据都会更新到从服务器上,建表,删表等也是一样的。



posted @ 2012-09-17 20:23 林 阅读(365) | 评论 (0)编辑 收藏

2012年9月16日

java日期显示格式实例

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class Datetime {

 public String getDatetime_String1() {
  String datetime = new Date().toString();
  return datetime;
 }

 public String getDatetime_String2() {
  String datetime = new Date().toGMTString();
  return datetime;
 }

 public String getDatetime_System() {
  DateFormat dt = DateFormat.getInstance();
  String datetime = dt.format(new Date()).toString();
  return datetime;
 }

 public String getDatetime_China() {
  DateFormat datetime1 = DateFormat.getDateInstance(DateFormat.LONG,
    Locale.CHINA);
  DateFormat datetime2 = DateFormat.getTimeInstance(DateFormat.LONG,
    Locale.CHINA);
  String datetime = datetime1.format(new Date()) + " "
    + datetime2.format(new Date());
  return datetime;
 }

 public String getDatetime_Standard() {
  Calendar now = Calendar.getInstance();
  String datetime = now.get(Calendar.YEAR) + "-"
    + (now.get(Calendar.MONTH) + 1) + "-"
    + now.get(Calendar.DAY_OF_MONTH) + " " + now.get(Calendar.HOUR)
    + ":" + now.get(Calendar.MINUTE) + ":"
    + now.get(Calendar.SECOND) + now.get(Calendar.MILLISECOND);
  return datetime;
 }

 public String getDatetime() {
  String datetime = new Date().toLocaleString();
  return datetime;
 }

 public String getDatetime_SimpleDateFormat() {
  try {
   SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM-dd");
   String sDate = f.format(new java.util.Date());
   java.util.Date dt = f.parse(sDate);
   java.sql.Date sqlDate = new java.sql.Date(dt.getTime());
   String datetime = sqlDate.toString();
   return datetime;
  } catch (Exception ee) {
   ee.printStackTrace();
   return null;
  }
 }

 public static void main(String[] args) {
  // TODO 自动生成方法存根
  System.out.println("以字符串格式显示日期时间: "
    + new Datetime().getDatetime_String1());
  System.out.println("以字符串格式显示日期时间: "
    + new Datetime().getDatetime_String2());
  System.out.println("以系统格式显示日期时间: "
    + new Datetime().getDatetime_System());
  System.out
    .println("以中国格式显示日期时间: " + new Datetime().getDatetime_China());
  System.out.println("以常用格式显示日期时间: "
    + new Datetime().getDatetime_Standard());
  System.out.println("以常用格式显示日期时间: " + new Datetime().getDatetime());
  System.out.println("以简单系统格式显示日期: "
    + new Datetime().getDatetime_SimpleDateFormat());
 }

}

posted @ 2012-09-16 22:39 林 阅读(381) | 评论 (0)编辑 收藏

2012年9月15日

ubuntu 12.04 root用户没有声音

Ubuntu在root用户下,为了安全考虑默认是关闭了声音系统的。
如果要开很简单,因为root登录后pulseaudio没有启动。所以要先启动它
将root加到pulse和pulse-access组:
sudo usermod -a -G pulse-access root
gpasswd -a root pulse
gpasswd -a root pulse-access
然后:
编辑/etc/default/pulseaudio文件

cp -p /etc/default/pulseaudio/etc/default/pulseaudio.bak

vim /etc/default/pulseaudio
修改以下两处
PULSEAUDIO_SYSTEM_START=1

DISALLOW_MODULE_LOADING=0

改为1和0,表示允许运行在system环境,允许动态加载模块。
重启一下计算机,声音就会出来了

posted @ 2012-09-15 17:10 林 阅读(1488) | 评论 (0)编辑 收藏

仅列出标题  下一页
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜