显示标签为“Linux”的博文。显示所有博文
显示标签为“Linux”的博文。显示所有博文

2011年12月12日星期一

设置 Eclipse 以在 Java 程序中调用 CPLEX

前提当然是要成功安装CPLEX,我的系统为 Ubuntu 9.10 Karmic + CPLEXStudioAcademic123(安装在 /opt/ibm/ILOG/CPLEXStudioAcademic123/ 下)

我的做法是:


  1. /opt/ibm/ILOG/CPLEX_Studio_Academic123/cplex/lib

    下找到 cplex.jar


  2. /opt/ibm/ILOG/CPLEX_Studio_Academic123/cplex/bin/x86-64_sles10_4.1

    下找到 libcplex123.so

  3. 拷贝 cplex.jar 与 libcplex123.so 到 Eclipse 根目录 {EclipseHomeDir} 下的 needed/cplex 子目录中

首先在编译路径中加入CPLEX Jar 包,以便代码能够正确编译

(1). Project > Properties > Java Build Path > Libraries
(2). Add External JARs.
(3). Browse to the location of your CPLEX installation and select the file named cplex.jar.

For me,即是加入外部 Jar 包 {EclipseHomeDir}/needed/cplex/cplex.jar

如此程序即可正确编译,但还不能正常运行。

IBM ILOG CPLEX 官网上的 Tutorial 提及这一问题,并给出解决方案如下:

http://publib.boulder.ibm.com/infocenter/cosinfoc/v12r3/index.jsp

CPLEX > Getting Started with CPLEX > Setting up CPLEX > Setting up Eclipse for the Java API of CPLEX

Before you can run your compiled code, you must create an appropriate run configuration in Eclipse or modify an existing run configuration appropriately. To do so, follow these steps.
1. ...
2. ...
3. Go to the Arguments tab, select VM arguments, and add the path to the CPLEX library. The CPLEX library is conventionally a DLL file on Windows or a .so file on UNIX or GNU/Linux, with an indication of the version number in its name, like cplexXX.dll or cplexXX.so where XX represents a version number of the product.

Tip:
Add the path to the directory or folder containing the CPLEX library (not the name of the file itself).

For example, on UNIX or GNU/Linux , if the file libcplexXX.so is located in the directory COSinstallation/cplex/bin/myPlatform/myLibFormat then add a path similar to this example:
-Djava.library.path= COSinstallation/cplex/myPlatform/myLibFormat

Similarly, on Windows, if the file cplexXX.dll is located in the folder COSinstallation\cplex\myPlatform\myLibFormat then add a path similar to this example:
-Djava.library.path=COSinstallation/cplex/myPlatform/myLibFormat

4. ...

After these steps, you can run your Java application using CPLEX as you run other applications from Eclipse.

按照这一说明,对于我的case,

Run > Run Configurations ... > Java Application > Arguments > VM arguments 中的参数应为

-Djava.library.path= /opt/ibm/ILOG/CPLEX_Studio_Academic123/cplex/bin/x86-64_sles10_4.1/

-Djava.library.path= {Eclipse_Home_Dir}/needed/cplex/

遗憾的是,这样的设置并不能成功运行,而是会导致类似如下的异常:

Exception in thread "main" java.lang.NoClassDefFoundError: /opt/ibm/ILOG/CPLEX_Studio_Academic123/cplex/bin/x86-64_sles10_4/1/
Caused by: java.lang.ClassNotFoundException: .opt.ibm.ILOG.CPLEX_Studio_Academic123.cplex.bin.x86-64_sles10_4.1.

我的解决方法是:

{Eclipse 菜单} Window > Preferences > Run/Debug > String Substitution > New...

建立一个新的变量
variable: cplex_library
value: {EclipseHomeDir}/needed/cplex/

(注-1:{EclipseHomeDir} 应该替换为你自己实际的Eclipse 根目录。)
(注-2:这也就是为什么在开头我们把 cplex.jar 与 libcplex123.so 拷贝到这一目录中的原因)

回到 Run > Run Configurations ... > Java Application > Arguments > VM arguments

-Djava.library.path=${cplex_library}

Apply > run, 可以看到

IBM ILOG License Manager: "IBM ILOG Optimization Suite for Academic Initiative" is accessing CPLEX 12 with option(s): "e m b q ".
Parallel mode: deterministic, using up to 2 threads for concurrent optimization.

说明成功!

Ubuntu 下安装 CPLEX 12.3 (学院版)

我的系统:Ubuntu 9.10 Karmic

首先下载如下文件
1. CPLEX for Linux 的安装文件: cplex_studio123.acad.linux-x86-64.bin
2. License 文件: access.ilm
3. 安装帮助文件: ILOGQuickStart.pdf

安装CPLEX

$ sudo chmod 775 cplexstudio123.acad.linux-x86-64.bin
$ cplex
studio123.acad.linux-x86-64.bin

跟随提示即可安装。安装后的CPLEX 在 /opt/ibm/ILOG/CPLEXStudioAcademic123 下

安装 CPLEX License 文件

按照 ILOGQuickStart.pdf 中的说明,建立 /usr/ilog/ilm (需root权限)
复制 access.ilm 至 /usr/ilog/ilm

测试:


/opt/ibm/ILOG/CPLEXStudioAcademic123/cplex/bin/x86-64sles104.1$ cplex

应出现


IBM ILOG License Manager: "IBM ILOG Optimization Suite for Academic Initiative" is accessing CPLEX 12 with option(s): "e m b q ".

IBM ILOG CPLEX Optimization Studio Academic Research Edition
Welcome to IBM(R) ILOG(R) CPLEX(R) Interactive Optimizer 12.3.0.0
with Simplex, Mixed Integer & Barrier Optimizers
5725-A06 5725-A29 5724-Y48 5724-Y49 5724-Y54 5724-Y55
Copyright IBM Corp. 1988, 2011. All Rights Reserved.

Type 'help' for a list of available commands.
Type 'help' followed by a command name for more
information on commands.

CPLEX> exit

说明安装成功。

2011年2月28日星期一

将 Ubuntu 系统从一台电脑迁移到另一台电脑

前提:

1. 已有电脑已经装好妥为配置的 Ubuntu 系统(驱动,软件安装齐全并好使)
2. 有一新电脑装了与已有电脑相同版本的新 Ubuntu 系统(干净系统,啥也没有)。

目的:

不想重新进行配置,安装,希望能将已有电脑上配置好的 Ubuntu 系统完整迁移到新电脑上。


方法:

1. 备份已有电脑资料,命令如下:


tar    -cvpzf    /home/backup/sysbak_2010-11-22_all-but-personal-data.tgz    --exclude=/dev    --exclude=/lost+found    --exclude=/media    --exclude=/mnt    --exclude=/proc    --exclude=/sys    --exclude=/tmp    --exclude=/home/wy/Desktop    --exclude=/home/wy/Disks    --exclude=/home/wy/Downloads    --exclude=/home/wy/Dropbox    --exclude=/home/wy/Eclipse_Workspace    --exclude=/home/wy/Mine    --exclude=/home/wy/PDF    --exclude=/home/wy/Personal    --exclude=/home/wy/Photos    --exclude=/home/wy/Software    --exclude=/home/wy/.dictionary    --exclude=/home/wy/.VirtualBox    --exclude=/home/wy/.mozilla-thunderbird    --exclude=/home/backup    /      >    /home/backup/sysbak-log.txt



2. 记录新电脑上的UUID与硬盘分区等资料, 有两种方法:

  1. 运行       ls /dev/disk/by-uuid/     看到相关分区的uuid信息,将其拷贝出来 或
  2. 备份新电脑上 /etc/fstab 文件,里面应该包含了足够的信息
运行          sudo fdisk -l        找到相关分区的sda*信息,也拷贝出来,然后和上面一样做,不过 就是 uuid 信息换 成了sda*


3. 将备份好的包拷贝到新电脑上,展开:(可在桌面环境下进行)
 
tar -xvpzf  /home/backup/sysbak_2010-11-22_all-but-personal-data    -C    /



4. 此刻新电脑无法正常启动,需修正 (从liveCD或USB或whatever什么玩意启动)

原因在于UUID不匹配,因此:

替换覆盖好的 /etc/fstab 中的内容为包含正确 UUID (新电脑)的值,如有其它想要自动加载的内容,也应一并修改成功

替换覆盖好的 /boot/grub/grub.cfg (menu.lst) 中的内容为正确的 UUID 以及 分区符号

以及可能的sd*错误 (按以上做法应该没有)

(完)




附录一:

备份还原系统命令详细说明

备份系统:


tar    -cvpzf    /home/backup/sysbak_2010-11-22_all-but-personal-data.tgz    --exclude=/dev    --exclude=/lost+found    --exclude=/media    --exclude=/mnt    --exclude=/proc    --exclude=/sys    --exclude=/tmp    --exclude=/home/wy/Desktop    --exclude=/home/wy/Disks    --exclude=/home/wy/Downloads    --exclude=/home/wy/Dropbox    --exclude=/home/wy/Eclipse_Workspace    --exclude=/home/wy/Mine    --exclude=/home/wy/PDF    --exclude=/home/wy/Personal    --exclude=/home/wy/Photos    --exclude=/home/wy/Software    --exclude=/home/wy/.dictionary    --exclude=/home/wy/.VirtualBox    --exclude=/home/wy/.mozilla-thunderbird    --exclude=/home/backup    /      >    /home/backup/sysbak-log.txt


'tar' 是用来备份的程序
  • c - 新建一个备份文档
  • v - 详细模式, tar程序将在屏幕上实时输出所有信息。
  • p - 保存许可,并应用到所有文件。
  • z - 采用‘gzip’压缩备份文件,以减小备份文件体积。
  • f <filename> - 说明备份文件存放的路径, /backup.tgz 是本例子中备份文件名。
  • 来 看看我们想要包含的目录。我们不想备份所有的东西,因为有些目录是没有多大用处的。 确认你不想包含的文件,否则您会得到一个很奇怪的结果。 您也不必备份 /mnt 目录下的东西,除非您有其他分区挂在它下面或者你坚持要备份。您还必须确保没有任何资源挂在 /media 目录下(比如,任何CD或者移动存储介质).否则,剔除/media。
  • 最後一个参数是我们想要保存的目录. 我们想要保存所有的东西,使用 / 作为根目录。


从备份中还原系统:

    tar -xvpzf  /media/Data/ubuntu.tgz -C /


参数x是告诉tar程序解压缩备份文件。 -C <directory> 参数是指定tar程序解压缩到的目录。 ( 在本例中是/ )

这会花一段时间。等它完成了,你就有了一个完全恢复的Ubuntu系统! 只需确保在你做其他任何事情之前,重新创建你剔除的目录: ( /proc, /lost+found, /mnt, /sys, 等等。)

    mkdir /proc /lost+found /mnt /sys


大功告成!!



附录二:

拷贝完系统后,可能需要让新硬盘能够启动,可参考以下 Grub 2 教程:

Ref: http://www.dedoimedo.com/computers/grub-2.html

Reinstall GRUB

GRUB 2 can be installed even while you are booted in the OS. You do not need a live environment for that. Just execute the install-grub command against the device or the partition you desire.

grub-install <target>

<target> can be /dev/hda, /dev/sdb, /dev/sdc4, and so forth.

It is important that you pay attention to the output produced by the command. If you have external disks connected at the time you run the command, it will add these disks to the list of mapped devices. There should be no big harm in that, but if some entries are incorrect, remove them.



附录三:


可在一个全空的硬盘上直接复制 Ubuntu 操作系统,见下面所附的文章:

-------------------------------------------------------------------------------------------------


(注,未验证)linux 硬盘迁移以及分区对考,用 cp -a 命令即可,cp-a 命令拷贝完后不用改权限,因为原有权限全部保留,只需处理下引导,同时 fstab 中的 uuid 改为新分区的  uuid即可,或者不用 uuid 参数进行挂载也 行。新的 swap 直接写在 fstab 中即可实现开机自动挂载。

-------------------------------------------------------------------------------------------------

Ref:http://forum.ubuntu.org.cn/viewtopic.php?f=86&t=62836&start=0


今天某人想试试Linux,于是偶鼓动帮着装一个,于是乎拿来了移动硬盘接到偶本本上。偶很BH,所以立马格式化出一块ext3分区,将tar拷贝所有内容过去;。。。。。

吃 了晚饭回来后,发现拷贝完成了。就检查fdisk -l 和/dev/disk/by-uuid,将分区相关信息改写到fstab和menu.lst上,终于来到最后一步,也就是将grub写到移动硬盘引导 mbr处。接到设好usb启动的机器上一试,perfect!!!

建议:要推广linux的朋友可以可以先在移动硬盘上装好系统,然后完全free地拷贝系统。 GNU就是copyleft的,不是么?

简单的攻略:
===================================
首先声明,我是在ubuntu 7.04下面装的,其他系统安装方式一样,和这里的唯一不同之处就是ubuntu使用uuid来标记分区,而其他版本一般都用/dev/sda*来标明分区。

好,现在开始按部就班走下面几个步骤:

1.目标分区

假设这里的目标分区为sda5,可以用fdisk -l查看是哪个数字
执行格式化mkfs.ext3 /dev/sda5;
新建目录mkdir /media/disk;
将其mount到目录下 mount /dev/sda5 /media/disk

2.复制文件

方法有很多种

我是采用逐个打包然后解压的方式,要求有空间放得下压缩包,
比如/bin目录 tar zcvf /back_bin.tgz /bin

对除了/dev /proc /sys /tmp /media目录外的其他目录都这么打包

然后 cd /media/disk
建立几个目录和文件 mkdir dev; mkdir proc; mkdir sys; mkdir tmp; mkdir meida;

cp /vmlinuz .; cp /initrd.img .;

解压那几个包到这个目录下面,也以/bin目录为例 tar zxvf /back_bin.tgz 然后将相关的压缩包删除

3.修改启动和过载选项(关键一步)

uuid情况:

ls /dev/disk/by-uuid/ 看到相关分区的uuid信息,将其拷贝出来
vi /media/disk/etc/fstab 用刚才的uuid代替根目录那行的uuid
vi /media/disk/boot/grub/menu.lst 也用uuid代替kernel行的root=后面的uuid,同时修改root行(hdx,y)信息,

*如果你是用第一块硬盘的sda5分区就要用(hd0,4),就是数字减去一来获得

非uuid情况:
sudo fdisk -l
找到相关分区的sda*信息,也拷贝出来,然后和上面一样做,不过就是uuid信息换 成了sda*

4.更新grub
因为新硬盘没法自己启动到linux上,要写入grub到相关分区上去
sudo grub; root (hdx,y); setup (hdx); quit

*如果新机器是不同的显卡配置,那么最好改写/etc/X11/xorg.conf为合适的显卡代码vesa, ati, nv, intel等.不然进不去图形界面。仔细看清楚每一步,大胆去试试,应该能成功!

-------------------------------------------------------------------------------------------------

Ref:http://xieshaohu.wordpress.com/2010/04/26/%E8%BF%81%E7%A7%BBubuntu%E7%B3%BB%E7%BB%9F%E5%88%B0%E6%96%B0%E7%A1%AC%E7%9B%98/

笔记本硬盘是120G的,用了这么长的时间,积累了一些数据,硬盘空间有点不够用了。所以买了一块西数500G的硬盘,准备更换笔记本的硬盘。

操作系统版本:Ubuntu 9.10
文件系统类型:Ext4
Grub版本:Grub2

事前查了一些资料。大概的思路如下

  1. 用硬盘盒挂载新的硬盘,然后用gparted分区,创建好文件系统。
  2. 用live cd启动电脑,挂载新旧硬盘。
  3. 迁移数据。tar/dd/cp -a
  4. 安装grub,并修改grub配置文件中的uuid。
  5. 修改/etc/fstab中的uuid

思路清晰了就开始动手吧。

  1. 挂载新的硬盘,以及格式化都很顺利。
    提示:在创建分区表的时候使用默认的msdos格式就可以了。
  2. live cd启动电脑,使用fdisk –l查看硬盘的分区情况。(一下所有操作均已root身份执行,所以请先执行sudo -s获得一个带有root权限的shell环境,避免频繁敲入sudo)
    比如我的电脑分了四个区,其中三个是数据分区(/ /boot /home),一个是交换分区。
    数据分区对应关系是/ 对应/dev/sda6;/boot 对应/dev/sda1;/home对应/dev/sda7,新硬盘分区相同,不过显示为/dev/sdbX
  3. 在/mnt目录下分别创建对应硬盘分区的文件夹。
    $ sudo –s
    $ cd /mnt
    $ mkdir oldboot newboot oldroot newroot oldhome newhome
  4. 挂载相关的分区到/mnt目录下
    $ mount /dev/sda1 /mnt/oldboot
    $ mount /dev/sdb1 /mnt/newboot
    其他的分区使用类似的命令挂载
  5. 挂载完了之后就可以开始动手转移文件了。在Linux系统迁移的时候,要注意保持文件的所有者和权限不变,所以也查了不少资料,网上有说用tar的,也有说用dd的,当然还有说用cp –a 的,这三者都用过,绕了不少弯路,现在把一些心得写下来。
    tar——使用这个命令的时候需要注意的就是需要首先进入相应的目录,然后再执行,参数部分要包含-p,最终执行成功就是使用了这个命令。具体命令如下:
    $ cd /mnt/oldboot
    $ tar cpf – . | (cd /mnt/newboot; tar xpf –)

    不需要-v参数减少不必要的输出,另外在这个在迁移socket类型的文件时出错,不过在我的电脑上只出现在/tmp文件夹以及/home目录下adobe的设置文件中,而adobe我已不用,所以问题忽略。
    dd—— 在用这个进行COPY的时候,参考了一些网上的资料,命令为dd if=/dev/sda1 of=/dev/sdb1 conv=noerror,sync。复制完了之后,文件权限都对了。但是磁盘空间的容量不对了,变成了和老的硬盘一样大小的容量,不知道是不是conv 参数的文件,看man文档,sync是填充数据,不足的部分使用空白替代。或许是这个问题,现在也不调查了。
    cp -a——COPY完了之后的文件权限不正确,放弃。
  6. 文件全部转移完了之后,确认文件数量是否一样,然后umount全部分区,并删除/mnt下创建的目录,关机,把新的硬盘安装到笔记本。
  7. 然后用live cd开机,挂载全部分区到/mnt,准备修复grub。挂载的时候需要注意,比如我有三个分区,需要首先挂载/分区,然后分别挂载/home和/boot。
    $ mount /dev/sda6 /mnt/
    $ mount /dev/sda7 /mnt/home
    $ mount /dev/sda1 /mnt/boot
  8. 然后挂载本机的一些设备。
    $ mount –bind /dev/ /mnt/dev
  9. 都挂载完了之后使用chroot命令进入我们自己的系统
    $ chroot /mnt
  10. 开始重新安装grub2。我的是直接安装到硬盘MBR中。
    $ grub-install /dev/sda
  11. 如果上面的安装没有提示error,使用下面的命令再次验证安装。
    $ grub-install –recheck /dev/sda
  12. 安装完成了之后,执行以下update-grub命令更新grub.cfg文件中的UUID。
    $ update-grub
  13. grub.cfg可以通过update-grub命令直接修改成功,/etc/fstab文件就没有那么幸运了,只能手动修改。先获取新硬盘UUID
    $ blkid > uuid
  14. 现在可以通过vim把刚刚获得的UUID一一设置到/etc/fstab文件中。
  15. 修改完了之后,退出chroot。按下键盘Ctrl + D。
  16. 卸载硬盘硬盘分区:
    $ sudo umount /mnt/home
    $ sudo umount /mnt/boot
    $ sudo umount /mnt/
  17. sudo reboot

至此,Ubuntu系统成功迁移到新的硬盘。

Linux (Ubuntu)下递归去掉一个目录下所有文件(不包括子目录)的执行权限

Background:

从 Windows 拷贝到笔记本的 ubuntu 下的文件的操作把执行权限位置为了 755 (-rwxr-xr-x),估计是 samba 的问题,改配置应该可以解决以后的操作(当然现在也懒得去改),不过已经拷过来的文件就有点麻烦。

说来也不是大事,就是每逢要打开个 txt 文件或者是 html 之类的,Ubuntu 都要问一句:您是要执行啊,还是要打开? (没办法,windows 看扩展名,linux 看权限位,谁让这文件有执行权限呢?)

于是每次还得点一下:打开(执行个P呀,又不是脚本)。不胜其烦,于是 

chmod 644 -R .

... 不work?为什么,哦,原来这命令第一步就把当前的目录执行权限位置为了 644 (drw-r--r--),则本目录不能执行,那你也休想打开下面的子目录了(-R 参数哭了。。。)

嗯,怎么才能只置文件的权限位,不管目录呢?

Problem Statement: 

如何递归去掉一个目录下的所有文件(含子目录下的文件,但仅文件,不包括子目录)的执行权限(x)

Method:

find . -type f -print0 | xargs -0 chmod 644


Discussion:

不详细解释了,简要说明一下,find的结果作为输入,通过管道传给 xargs ,xargs 再调用 chmod,配合上面收到的参数运行 (find 保证了传过来的全是文件)

Conclusion:

Bingo! it works like a charm.

2011年2月26日星期六

Ubuntu 下 如何查看当前目录下的各级子目录容量

使用 du 命令

1. 仅显示汇总信息:
du -s

2. 易读方式显示当前目录下的所有子目录的容量列表:
du -h --max-depth=1
参数说明:
     -h : 友好阅读(K, M, G显示)
     --max-depth : 只显示第一层目录

3. 按容量大小排序后显示:
du --max-depth=1 | sort -n
说明:
     排在最后的是容量最大的目录。

修正 Picasa 3.0 Beta for Linux 安装后,对话框输入栏中的中文字体显示为方框的问题

在 ubuntu 9.10 中安装 Picasa for linux 后,通过启动菜单的 Picasa Font Setting 可为默认的 Tahoma 字体选择替代项 (TAB-1),也可指定Picasa界面菜单显示字体 (TAB-3).

如此可解决大部分的中文显示问题,如左侧Album内的中文名均能正确显示。但是,如果双击 Album 打算修改其描述属性,可发现在对话框的输入栏中的中文仍然显示为方框,不够完美。

此问题解决方案如下:

到 /opt/google/picasa/3.0/wine/drive_c/windows/inf 下,在 picasa.inf 中找到:

HKLM,Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes,"MS Shell Dlg",,"Tahoma"

更改为

HKLM,Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes,"MS Shell Dlg",,"WenQuanYi Micro Hei"

重启 Picasa 后可发现字体显示正常。

对此问题,更改 /home/wy/.google/picasa/3.0 下的 user.reg 或 system.reg 均无效,并且每次运行 Picasa 后,user.reg & system.reg 似乎会被重写(时间戳发生变化)。