Ubuntu RMVB播放 字幕显示

Ubuntu 配置笔记整理[2]
Ubuntu 9.04
安装 w32codecs 以及 mplayer ,不使用系统的Totem(太慢),安装smplayer
mplayer显示字幕乱码的配置:
配置~/.mplayer/config,放入下列代码

    subcp = "cp936"
subfont-encoding = "unicode"
font = "/usr/share/fonts/truetype/arphic/uming.ttf"
subfont-text-scale = "3.000000"

#使用 (J) 切换字幕
#vf=noformat=yv12
monitoraspect=5:4 #调整为适合自己机子的数字
ao=alsa #音频驱动选择,我一般选择alsa,其他的(比如pulse)好像会出现声道不能共享
vo=xv #视频驱动选择,也可以选择x11、gl等
#vo=fbdev #在字符终端播放视频
#joystick=0 #是否支持手柄控制
stop-xscreensaver=no #是否允许播放视频时出现屏保
monitoraspect=1280:800 #识别桌面分辨率为1280×800
zoom=yes #是否允许视频缩放
subcp=gb2312#字幕字符集编码,也可以设置为utf8,这不是最主要的,最主要的是字幕文件的编码,字幕文件的编码如果是utf8的,subcp设置为gbk、gb2312、utf8都可以
subfont-autoscale=1 #设置按什么方法来进行自动缩放字幕,0-不自动缩放,1-按电影高度缩放,2-按电影宽度缩放,3-按电影对角线缩放(默认值)
subfont-text-scale=5 #设置字幕文本的自动缩放系数(屏幕尺寸的百分比),值范围为0~100,默认值为5。
subfont-osd-scale=8 #OSD字幕的自动缩放系统(屏幕尺寸的百分比),值范围为0~100,默认值为6。
#font=/usr/share/mplayer/subfont.ttf #选择字幕用的字体,我的subfont.ttf是一个链接到/usr/share/fonts/truetype/下面的一个中文字体,比如msyh.ttf
overlapsub=1 #支持多语言字幕。
sub-fuzziness=1 #设定字幕自动加载的识别,播放时可以通过j键切换。
vf=expand=:::::16/9:2 #如果是16:9的影片,字幕显示在画面下的黑色部分
osdlevel=1 #在屏幕的左上角显示相应时间等,可以在播放时单击o键显示播放时间
cache = 8192 #此选项指定用多少内存(以 kBytes 为单位)作为播放文件或 URL 的预缓冲。

#依次配置字幕仍有可能乱码或无法播放,需要将字幕编码进行转换 (iconv 或是用 gedit 另存为)

Ubuntu Nvidia 显卡驱动安装

Ubuntu 配置笔记整理[1]
使用显卡 Geforce Go 6600
步骤:

1. 首先先到ftp://download.nvidia.com/XFree86/下载系统对应的驱动程序,这里下载了185.19/NVIDIA-Linux-x86-185.19-pkg1.run

  • 如果曾经安装过Ubuntu自带的驱动nvidia-glx,
    那就 sudo apt-get –purge remove nvidia-glx
    顺便sudo apt-get –purge remove nvidia-settings nvidia-kernel-common
  • 然后sudo apt-get install linux-headers-$(uname -r) build-essential linux-restricted-modules-$(uname -r)
    下载headers,安装驱动时会用到,
    sudo gedit /etc/default/linux-restricted-modules-common
    在最下面最后那个引号""中间填入nv
  • sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup
    备份一下
  • 接着要离开桌面环境,按下Ctrl+Alt+F1,使用用户名/密码登入,
    输入 sudo /etc/init.d/gdm stop 停止GDM
    进入步骤1下载驱动的目录中,
    执行 sudo sh NVIDIA-Linux-x86-185.19-pkg1.run
    然后除了提醒要不要连接到FTP下载核心的步骤选择NO之外,其余的yes/accept就是了。
  • 回到命令行后,sudo reboot
  • sudo gedit /etc/X11/xorg.conf
    在Section "Screen"里加上
    Option "AllowGLXWithComposite" "True"
    Option "AddARGBGLXVisuals" "True"
  • 在Section "Device"里加上
    Option "RenderAccel" "True"
    Option "DisableGLXRootClipping" "true"
    Option "BackStoring" "True"
    Option "TripleBuffer" "true"
  • 最后添加
    Section "Extensions"
    Option "Composite" "Enable"
    Option "RENDER" "Enable"
    EndSection
  • 保存,重启。
    附:

    * 卸载的话则使用sudo sh NVIDIA-Linux-x86-1.0-9755-pkg1.run –uninstall,执行gdm stop时必须是用完整的sudo /etc/init.d/gdm stop否则gdm可能无法关闭
  • 今天安装的时候卸载了旧的180.06BETA,换装180.35的时候出现ERROR,提示/usr/lib/nvidia /libglx.so.xserver-xorg-core无法读取,后执行gdm的时候报错,恢复xconf默认的配置后gdm可以启动,但驱动明显没有安装成功。在新立得里面删除原来装的一个177的源码后,再uninstall 180.35的时候提示了几个错误,再重新安装180.35成功。
  • Ubuntu升级至9.04

    周四的时候9.04就出来了,由于一直在忙,到周日才真正开始捣鼓。原来的8.10工作正常,不想再重新调教系统,所以选择升级。
    开始的时候下载了desktop版本和DVD版本,想着收藏用,升级的话就直接从源里联网升级。不想周六升级一夜,速度也只有几K,时间预计是令人绝望的10+囧。无奈重新下载Alternate版本进行升级安装。
    将Alternate CD的ISO Mount
    sudo mount <路径>/ubuntu-9.04-alternate-i386.iso -t iso9660 -o loop
    将Alternate CD作为源
    sudo apt-cdrom -m -d /media/cdrom0 add
    sudo apt-get update
    执行Alternate CD中的升级脚本
    sudo /media/cdrom/cdromupgrade
    然后根据指引来作就好了。
    安装完成后联网升级,毕竟一张CD的容量远远不可能包含所有应用。
    使用感受:

    * 新的通知机制很炫,但是还有些工作不稳定,经常出不来,设置也偏简单

  • 部分软件(mplayer、SMplayer等)被自动移除,需要重新安装
  • Gnome-do无法使用,因为Mono被自动移处,但从ppa安装时不会提示缺少依赖,运行时拋异常
  • 8.10中的VPN BUG修复,以前用8.10的网络管理器连接公司VPN,连上了却打不开任何网页,traceroute发现是路由问题,但是无论如何配置均无效;升级至9.04后直接连接就成功了。
  • 使用最新测试版Nvidia驱动185.19,原来启用桌面特效后屏幕错位的问题修正
  • 细节改进,如窗口透明(compiz实现)支持模糊效果
  • 号称大幅提高的启动速度没有感觉,反而感觉启动比原来还慢了,也许是因为是升级安装的缘故
  • Oracle Application Development Framework 简介



    ### 1.1 概述
    Oracle Application Development Framework是Oracle Fusion中间件体系架构的重要组成部分,是一个端到端的J2EE开发框架。ADF框架通过提供实用级别的基础架构服务和虚拟的声明式开发体验,从而简化了J2EE开发。不同于其他开源开发框架,Oracle ADF提供了一个包含Business Service、Model、View、Controller的完整MVC实现,在企业应用架构的每一个层次都提供了支持。

    #### 1.2 Oracle ADF 11g框架简介
    ADF架构图:

    如架构图所示,Oracle ADF 11g分别提供了MVC架构中每一层次的实现,并允许在不同层次使用不同的技术。如可以使用ADF Business Components构件Business Service层,使用structs构建Controller层等。本项目使用Oracle ADF对MVC框架的实现构建,即Business Service层使用ADF Business Component,Model层使用ADF Model,Controller层使用JSF,View层使用JSF/ADF Faces。

    ##### 1.2.1 View 层
    最简单的View层实现即为一个包含用户界面组件的页面,并允许该页面中的组件调用Model层中的方法。Oracle ADF为了提高View层的重用程度,引入了如下结构体系。

    Page
    使用JDeveloper构建的Page即为最终向用户展现的Web 页面,其为Oracle 富客户端组件构建的基础。
    Page Fragment
    Page Fragment的创建与使用与Page极其相似,对于开发人员来说,在JDeveloper中开发一个Page与开发一个Page Fragment基本没有什么区别。Page与Page Fragment的主要区别在于,Page Fragment并不是最终向用户展现的页面,它可以作为一个Page的组件所存在。在通常的开发场景下,常遇到部分页面的某部分布局和业务逻辑固定不变的情况。在ADF中可将其开发为一个Page Fragment,并将其作为页面组件放入所需Page中,以提高页面的可重用程度。
    得益于Page Fragment的可重用特性,在常见的应用场景中,并不需要为一个业务流程创建一组页面,而只需创建针对该业务流程的一个页面以及与其相对的一组Page Fragment即可。

    Page Template
    Page Template可以用于构建Page 或 Page Fragment,并可将其上放置的ADF富客户端组件与Model/Controller绑定以执行业务逻辑。Page Template主要用于用于快速构建一组具有相同部分的页面。Oracle ADF开发人员可以创建一个模板,并基于模板创建Page或Page Fragment。
    在常的应用场景下,可以通过Page Template构建某应用的页眉、页脚、导航栏等,而将页面内容的构筑交予其他开发人员,进一步降低开发耦合度,提高团队协作水平。
    Region
    Region 是Fusion架构体系中新引入的概念,可以被应用于Page或Page Fragment。可以将Page Fragment或Task Flow作为Region放入Page中,而Page Fragment、Task Flow、目标Page将分别使用独立的上下文配置。
    常见的使用场景是使用Region构建页面内容,以实现导航菜单与页面内容的松耦合设计。

    Contextual Event Framework
    Oracle ADF为实现View的松耦合设计,允许通过Context对页面富客户端组件添加绑定,以调用Controller或Model(Bussiness Service Application Model)中的方法,实现MVC架构中的调用关系。这种基于上下文的事件处理架构即称为Contextual Event Framework。
    ADF富客户端组件
    在Fusion架构体系中,ADF提供了超过100种富客户端组件供开发人员在Page或Page Fragment上创建富用户交互界面。所有组件均基于JSF及AJAX技术构建。包括:
    页面布局控件

  • 表/树控件
  • List of Value控件
  • 输入控件
  • 导航控件
  • 输出控件
  • 查询控件
  • 数据图表组件

    ##### 1.2.2 Controller层
    ADF Controller是ADF应用的重要组成部分,用于控制用户交互及程序流的执行。其核心为Task Flow,包含如下内容:
  • Task Flow
    Task Flow任务流供开发人员定义一组Page或Page Fragment之间的流程及逻辑关系。Task Flow中的对象可视为一组活动(activities),如每一个加入Task Flow中的Page或Page Fragment均被视为一个视图活动(View activity)。当用户在一个Task Flow中的各个页面间跳转时,即可视为在各视图活动之间的跳转。亦可在Task Flow中添加其它类型的活动。Oracle ADF已经将Task Flow中的各种活动包装为组件供用户调用。
    Task Flow在Oracle ADF中包含两种类型的实现:Bounded Task Flow/Unbounded Task Flow。

    Bounded Task Flow
    Bounded Task Flow是Oracle ADF框架支持的两种Task Flow实现之一。该类型的Task Flow支持事务处理和作为Region重用,具体具有如下特性:
    定义明确的事务处理边界;
  • 单个Task Flow入口及零至多个定义明确的Task Flow出口;
  • 支持PageFlow级别的变量传递,可以将定义的变量在Task Flow的各个活动间传递;
  • 允许为该Task Flow创建新的实例;
  • 允许在退出该Task Flow之前执行commit或rollback的操作;
  • 当该类型Task Flow被其他Task Flow调用时,允许在进入该Task Flow时传入参数作为PageFlow级别的变量;
  • 当该类型Task Flow被其他Task Flow调用时,允许在退出该Task Flow时返回变量。

    Unbounded Task Flow
    Unbounded Task Flow与Bounded Task Flow的主要区别在于Unbounded Task Flow没有定义明确的边界,不支持将某活动定义为Task Flow的入口,亦不可将其作为Page的Region使用。每一个ADF应用中只包含一个Unbounded Task Flow。典型的应用情境是使用Unbounded Task Flow构造导航栏,调用Bounded Task Flow。
    注意,若一个 ADF应用中定义了多个Unbounded Task Flow文件,编译时会对Unbounded Task Flow进行合并。若一个Unbounded Task Flow中的视图活动(View activity)被设置为bookmarkable时,则可通过URL直接访问这个视图活动。
    Task Flow Template
    Task Flow Template提供了重用一个或多个Bounded Task Flow的方法。这里的重用包含两种机制:复制(Copy)和引用(reference)。

    ##### 1.2.3 Model层
    Model层提供了访问源数据及业务逻辑的功能。在Fusion架构中,将源数据的访问与业务逻辑的访问分为两部分:Data Control与Business Service。Data Control使用Databinding文件连接View层与Business Service/源数据,是Model层的主要组成部分;Business Service主要分为Application Module和ADF Business Components,通过Data Control连接至View层。这种分离式的架构允许在View层已经创建的前提下为View层添加数据访问或Business Service访问。



    Model Data Control
    Data Control用于为Page或Page Fragment创建数据访问界限(Data Bounds),可以实现为诸如XML文件、Web Service或ADF业务组件。使用JDeveloper进行开发,当创建Page或Page Fragment时,会自动创建对应的Data Control。

  • Placeholder Data Control
    当进行Page或Page Fragment的UI开发时专用的Data Control,用于在界面建立后连接数据源。

    Business Service
    在Fusion体系架构中,ADF业务组件(ADF Business Component)是主要的数据访问和业务逻辑来源。ADF业务组件,亦称为ADF BC,主要由以下几个部分组成:
    Application Module
    Application Module(AM)定义了一组可更新的数据模型及顶层的可调用方法(亦称为Service Methods),是用户界面进行数据操作的接口。AM中包含View Object对象。
    为了简化应用集成的复杂度,可以为Application Module启用服务接口。这里的服务接口指的是一组允许第三方应用程序使用标准Web Service协议完成查找、创建、更新、删除业务数据的任务的可编程API。所有的业务验证规则均被封装在Entity Object中,并会在进行业务数据操作时自动进行验证。
  • View Object
    View Object是一条SQL查询的持久化对象,允许对SQL查询的结果进行操作。同时,View Object间允许通过建立连接(link)的方式创建主从(Master-Detail)结构。当用户从用户界面改变数据时,View Object会将数据改变传递至Entity Object触发对应验证规则和保存改变。
  • Entity Object
    Entity Object是数据库中某张表的某个行的持久化对象。Entity Object内部通过DML操作将数据改变反映至数据库。Entity Object支持通过建立Association的方式进行Entity Object之间的关联,并支持通过此方式反映数据源层次的表关系,如数据表的外键关联。
  • ADF Validator



    实际应用中经常遇到对业务相关的数据进行Validate的情况。比如对输入数据进行格式限制/范围限制等。ADF为开发人员提供了相对灵活的解决方案。这里提供了几种Validator的不同实现方式。
    (下述均使用Oracle XE自带的HR示例中Employees表作为示例表)

    1. 使用EO层次的Validator
    首先,ADF框架中所有的Validator默认都使用EO级别的Validator。EO层次可以设置Entity级别的Validator或Attributes级别的Validator。

    选择相应的级别,点击界面上的加号即可创建Validator,ADF提供了灵活的Validator以供选择


    选择需要的Validator Rule Type,写入相应的验证规则后,即可在Failure Handling中写入验证失败的抛出消息。在此处设置的消息将写入资源文件中。


    最后,当VO被拖入页面时,对应控件将自动包含一个<f:validator>子控件,其绑定为EO层次的Validator。


  • 在ManageBean中实现Validator
    ADF本身提供的Validator相对比较灵活,但当EO的重用程度比较高时(如不同的VO使用相同的EO,需要设置不同验证规则/不同弹出消息,甚至不同页面使用相同VO,需要不同验证规则),EO级别的Validator显然不能满足要求。则可以通过重写Validator并添加至页面控件的绑定以实现。
    <f:validator>绑定的对象为一个属性,所以首先应为该Validator创建一个实现Validator接口的Class,最简单的如下(可以写入更复杂的验证逻辑)
    public class testValidator implements Validator {
    public void validate(FacesContext context, UIComponent component,
    Object obj) throws ValidatorException {
    throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, "TEST", "TEST MESG"));
    }
    }
    在MB中创建一个该属性的实例,并构造相应的get/set方法如下
     private testValidator test = new testValidator();
    public void setTest(testValidator test){
    this.test = test;
    }
    public testValidator getTest(){
    return this.test;
    }

    最后,通过EL表达式将该属性绑定至<f:validator>
    <f:validator bindings="#{backing_ExpsProYbudgetUpdate.test}">
  • Oracle ADF VO排序及VO的查询模式

    常规应用中,当需要使用Table向终端用户展示数据时,Table中数据的显示排序一致性极大程度的影响到了客户体验。通常希望诸如多次查询结果显示顺序相同、插入数据在原数据上方等的实现。
    ADF为开发人员提供了两种级别的排序,即数据库级别的排序及内存级别(In-Memory)的排序。需要同时使用这两种排序法,才能取得合适的排序效果。
    (使用Oracle示例数据库HR中的Employees表作为示例)

    1. 数据源排序
    编辑VO的Query,设置Order by字段,这里设置Manager作为排序字段需要注意的是,这里的排序只是针对从数据源选取数据时的排序,当对VO进行插入/删除操作时,修改并不会立即Commit至数据库,而是存储在EO/VO中,这就导致这种排序法对于不在数据库中存在实体行的数据是无效的,也是需要使用In-Memory排序方式的原因。

  • VO的查询模式(View Object’s SQL Mode)
    在开始VO的In-Memory排序之前,首先应该了解VO的查询模式。
    ADF中一个VO具有如下查询模式
    * ViewObject.QUERY_MODE_SCAN_DATABASE_TABLES
    VO的默认查询模式,该模式下VO每次executeQuery时会从数据库检索数据
  • ViewObject.QUERY_MODE_SCAN_VIEW_ROWS
    检索已经存在于VO的Row set中的数据,允许在此查询模式下使用VO的In-Memory Filtering
  • ViewObject.QUERY_MODE_SCAN_ENTITY_ROWS
    检索存储于EO缓存中的数据可以使用setQueryMode()方法进行VO查询模式的设置。可以单独设置一个查询模式或使用Java的OR(|)设置多个查询模式。例如
    setQueryMode(ViewObject.QUERY_MODE_SCAN_DATABASE_TABLES | ViewObject.QUERY_MODE_SCAN_ENTITY_ROWS)
    当设置多个查询模式时,会自动跳过重复行。
    设置过查询模式后,当执行executeQuery()方法时,查询模式的设置即可生效。
  • In-Mamory排序
    使用setSortBy()方法进行针对VO的运行时In-Memory排序。setSortBy()方法的输入参数类似于SQL中的order by子句,不同的是将列名称替换为VO上的Attribute Name。例如
    setSortBy("ManagerId desc, EmployeeId");
    根据查询模式的设置不同,当执行executeQuery()时,setSortBy()会自动转换为相应的排序方法。如当使用数据库检索时,会将 setSortBy转换为ORDER BY子句,当使用In-Memory查询时,会将setSortBy转换为SortCriteria对象。
    使用示例:
    vo.setSortBy("ManagerId");
    vo.setQueryMode(ViewObject.QUERY_MODE_SCAN_VIEW_ROWS);
    vo.executeQuery();
    只需要在如插入数据时执行该语句,即可完成In-Memory的排序功能。
  • 自定义VO的排序方法
    当需要的排序方法比较复杂,使用setSortBy设置排序规则无法满足需求时,可以通过重写VO的public void sortRows(Row[] rows)方法和public Comparator getRowComparator()方法达成目的。其中sortRows方法即是进行In-Memory排序时执行的排序方法;getRowComparater方法返回一个Comparator类型对象,被VO的compareTo()方法调用。
  • ADF 11g Multiple RowSelect on RichTable

    在实际应用中,经常遇到需要在表格中选定一条或多条记录进行操作的情况。

    下面将详述三种实现方式,使用Oracle JDeveloper 11.1.1.0.1,数据源使用OracleXE版本中HR示例数据的Employees表,创建页面时默认绑定backingbean。
    1.使用ADF RichTable提供的Multiple RowSelect
    优点:RichTable原生支持,稳定快速,代码简单 缺点:只能按住键盘Ctrl键或Shift键通过鼠标进行多选,用户操作不直观 步骤:设置RichTable的属性,将RowSelection设为multiple,并将SelectedRowKeys设为空,即可在后台通过如下代码获得选定行的RowKey,进而可以通过在VO上通过对应RowKey得到对应行。
        public Boolean getIsChecked() {
    //return (Boolean) getAttributeInternal(ISCHECKED);
    return getAttributeInternal(ISCHECKED) == null ? false :
    (Boolean)getAttributeInternal(ISCHECKED);
    }
    补充:为什么将SelectedRowKeys置为空 修改之前SelectedRowKeys值为#{bindings.EmployeesVO1.collectionModel.selectedRow},该EL表达式表明之前该Table的SelectedRowKeys绑定到了对应VO的selectedRow,但client端的状态改变并不能实时的提交到Server端,以至于当此绑定存在时,取到的是Server端存储的selectedRow而非client端当前的selectedrow。 2.在RichTable中增加列,使用基于VO的Checkbox进行RichTable的行多选 优点:使用checkbox的方式提供选择,代码复杂度中等 缺点:必须修改每一个需要使用该多选方式的RichTable对应的VO 步骤:

    1. 在VO添加非数据库项IsChecked,设置其Type为Boolean,Updateable为Always
  • 为该VO生成ViewRowImpl.java,并修改IsChecked的get方法
        public Boolean getIsChecked() {
    //return (Boolean) getAttributeInternal(ISCHECKED);
    return getAttributeInternal(ISCHECKED) == null ? false :
    (Boolean)getAttributeInternal(ISCHECKED);
    }

  • 将VO拖入页面创建RichTable,修改IsChecked列,将标签改为<af:selectBooleanCheckbox>,并将其Autosubmit/Immediate属性设为true,并在header中拖入另一个SelectBooleanCheckbox
  • header里的Checkbox不能添加ValueChangeListener,如果已经添加,需要将ValueChangeListener重置为Default(空)。为Header里的Checkbox创建ClientListener和ServerListener,分别设置属性如下: ClientListener method: mainClientCall type: click
    ServerListener method: callMBmainmethod type: onSelectedOrDeselected()
    完成后如下


  • 在页面转入Source模式,在标签 <af:document… <af:messages… 间加入如下代码
          <script type="text/javascript">
    <![CDATA[function mainClientCall (event)
    {
    var currcheckbox = event.getSource();
    var selectstatus = currcheckbox.getValue();
    //call method in manage bean
    AdfCustomEvent.queue(currcheckbox, "callMBmainmethod",{params:selectstatus}, true);
    }
    ]]>
    </script>

  • 在页面backingbean中修改onSelectedOrDeselected方法,添加以下代码以实现全选功能。注意修改this.getTable()为你的目标表。
        public void onSelectedOrDeselected(ClientEvent clientEvent) {
    boolean isSelected =
    (Boolean)clientEvent.getParameters().get("params");
    RichTable rt = this.getTable1();
    for (int i = 0; i < rt.getRowCount(); i++) {
    JUCtrlHierNodeBinding rowData =
    (JUCtrlHierNodeBinding)rt.getRowData(i);
    Row row = rowData.getRow();
    if (isSelected) {
    row.setAttribute("IsChecked", true);
    } else {
    row.setAttribute("IsChecked", false);
    }
    }
    // Refresh target table state
    AdfFacesContext adfContext = AdfFacesContext.getCurrentInstance();
    UIComponent refreshComponent = this.getTable1();
    if (refreshComponent != null) {
    adfContext.addPartialTarget(refreshComponent);
    }
    }

  • 可以在AppModel或ManageBean中通过遍历VO判断IsChecked的状态来取出选定行。 3.在RichTable中增加列,不基于VO进行RichTable的行多选 优点:使用checkbox的方式提供选择,不必修改VO 缺点:代码复杂度较高

    1. RichTable中插入列,设置宽度(width)为13RowHeader属性为trueAlign属性为Center;在列及列header中分别拖入SelectBooleanCheckBox,设置checkboxsimple属性为true,删除其Text属性中的值。将全选checkboxID设置为maincheckbox,单选的checkbox ID设置为subcheckbox:(参考2.3)
  • 分别为两个Checkbox创建一组ClientListener/ServerListener,属性设置如下(参考2.4) MainCheckbox clientListener Method: mainClientCall Type: click serverListener Type: callMBmainmethod Method: mainCheckBoxChecked() SubCheckbox clientListener Method: subClientCall Type: click serverListener Type: callMBsubmethod Method: subCheckBoxChecked()
  • 在页面转入source模式,复制如下代码至<af: document …<af: messages …标签之间(参考2.5)
          <script type="text/javascript">
    <![CDATA[function mainClientCall (event)
    {
    var currcheckbox = event.getSource();
    var selectstatus = currcheckbox.getValue();
    //call method in manage bean
    AdfCustomEvent.queue(currcheckbox, "callMBmainmethod",{params:selectstatus}, true);
    }
    function subClientCall (event)
    {
    var currcheckbox = event.getSource();
    var selectstatus = currcheckbox.getValue();
    //call method in manage bean
    AdfCustomEvent.queue(currcheckbox, "callMBsubmethod",{params:selectstatus}, true);
    }
    ]]>
    </script>

  • 修改页面对应Manage bean中的方法,修改mainCheckBoxChecked()subCheckBoxChecked()方法,添加如下代码
        public void getSelectedRows(ActionEvent actionEvent) {
    System.out.println("Selected Rows"); //debug
    System.out.println("**"); //debug
    RowKeySet selectedRowsList = this.getMultipleCheckBoxProcess().getSelectedRowsList(this.getResId1());
    if (selectedRowsList != null && selectedRowsList.size() != 0) {
    for (Object temp : selectedRowsList)
    System.out.println("Get Row : " + temp);
    }
    System.out.println("**"); //debug
    }
    public void CleanUpStatus(ActionEvent actionEvent) {
    this.getMultipleCheckBoxProcess().CleanUpStatus(this.getResId1(), "maincheckbox", "subcheckbox");
    }
    public void mainCheckBoxChecked(ClientEvent clientEvent) {
    Boolean currstatus = (Boolean)clientEvent.getParameters().get("params");
    this.getMultipleCheckBoxProcess().mainCheckBoxChecked(this.getResId1(), "subcheckbox", currstatus);
    }
    public void subCheckBoxChecked(ClientEvent clientEvent) { Boolean currstatus = (Boolean)clientEvent.getParameters().get("params");
    this.getMultipleCheckBoxProcess().subCheckBoxChecked(this.getResId1(), currstatus);
    }
    public MultipleCheckBox getMultipleCheckBoxProcess(){
    FacesContext ctx = FacesContext.getCurrentInstance();
    Application app = ctx.getApplication();
    MultipleCheckBox curr = (MultipleCheckBox)app.evaluateExpressionGet(ctx, "#{ viewScope.view_MultipleCheckbox}", Object.class);
    return curr;
    }

  • 复制MultipleCheckbox.java至目标位置(在Demo中可以找到),在当前所使用的TaskFlow中添加Manage Bean名为view_MultipleCheckbox,Scope为view级别的Bean,指向MultipleCheckbox.java,修改MultipleCheckbox.java中的Package,使其与实际路径相符。
  • 注意在适当的时候调用MultipleCheckbox的CleanUpStatus方法,一般在RichTable中数据发生改变时需要调用,如页面存在Query,则需在Query中调用MultipleCheckbox的CleanUpStatus方法。
  • 补充:MultipleCheckBox中方法说明

    * public RowKeySet getSelectedRowsList(RichTable tartab); 输入参数1:使用多选择CheckboxRichTable对象 返回参数:选中的行的RowKey
  • public void setSelectedRowsList(RowKeySet selectedRowsList, RichTable tartab); 输入参数1:选中行的RowKey 输入参数2:使用多选择CheckboxRichTable对象
  • public void subCheckBoxChecked(RichTable tartab, Boolean checkStatus); 输入参数1:使用多选择CheckboxRichTable对象 输入参数2:当前Checkbox的状态 该方法应在多Checkbox RichTable中某行前的Checkbox被选中/反选时调用
  • public void mainCheckBoxChecked(RichTable tartab, String subcheckboxid, Boolean newstatus); 输入参数1:使用多选择CheckboxRichTable对象 输入参数2:每行前Checkboxid 输入参数3:当前全选Checkbox的状态 该方法应在全选Checkbox被选中/反选时调用
  • public void CleanUpStatus(RichTable tartab, String maincheckboxid, String subcheckboxid); 输入参数1:使用多选择CheckboxRichTable对象 输入参数2:全选Checkboxid 输入参数3:每行前Checkboxid 该方法用于清除Checkbox的被选状态,通常需要执行查询前均需调用Demo: http://cid-0ee24905211c3ffd.skydrive.live.com/embedrow.aspx/Public/Hand/ADF/MultipleRowSelect1.rar
    http://cid-0ee24905211c3ffd.skydrive.live.com/embedrow.aspx/Public/Hand/ADF/MultipleRowSelect2.rar
    http://cid-0ee24905211c3ffd.skydrive.live.com/embedrow.aspx/Public/Hand/ADF/MultipleRowSelect3.rar
  • Oracle 数据库打开时出现ORA-16038



    Oracle 10g默认启用日志归档,db_recovery_file默认为2GB,不清理日志一般经过一段时间的使用闪回区便被占满,造成数据库无法归档,无法启动的错误。一般ORA-16038、ORA-19809、ORA-00312这三个错误会同时出现。

    解决方法通常包括:

    1. 提高参数db_recovery_file_dest_size



    2. 关闭闪回功能(如果你确实不再需要该功能)



    使用sqlplus /nolog登录,connect /as sysdba;
  • SQL> alter system archive log stop;
  • 3. 删除无用的归档文件并更新rman记录

    查看对应initxxx.ora,找不到的话可以在$ORACLE_HOME下搜索,找对应SID的即可
  • 在initxxx.ora中找到# File Configuration部分,可以看到db_recovery_file_dest=XXXXX,即为数据闪回区的日志文件记录位置。
  • 进入闪回区目录,查看对应SID下的archivelog文件夹内内容,删除旧的日志归档文件
  • 使用RMAN命令,RMAN> connect target /
  • 使用命令RMAN> crosscheck archivelog all,该操作将标明哪些归档文件已被删除
  • 使用命令RMAN> delete expired archivelog all,该命令将删除rman controlfile中相应的记录

  • ADF & Working On Linux

    近期一直在做一个使用 Oracle ADF 的项目,使用11g版本,已经有同事进行了几个月的基础研究。总体来说是一套不错的J2EE扩展,但是现阶段BUG太多,开发的时候总是被BUG所阻碍(对技术不够熟悉也是原因之一吐舌)。这方面只能通过加深研究来解决。(忍耐ing……)

    但是唯一让我无法忍受的是JDeveloper 11g + weblogic的内存占用。Oracle ADF使用Weblogic 10作为服务器,启动就要占250MB左右的物理内存,而且Java虚拟机还有类缓存的bug,启动时必须将内存设置大一些,否则Weblogic不一会儿就会PermGen Space。JDeveloper启动也要占去350MB左右的物理内存。运行一会甚至能到达600MB~700MB,导致我的BB上只要把这几个工具开开了,硬盘灯就没灭过,一直在进行物理内存/虚拟内存的交互……我还要开着UltraEdit, PL/SQL Developer, firefox,经常导致机器直接卡死……(难怪我们老大要用8GB内存的本本,我才可怜的2GB而已……还是单核的CPU)。

    正在换电脑(没米……)与重装Windows(治标不治本……)之间徘徊之时,忽然想起去年配置的一个Ubuntu 8.10还在移动硬盘里躺着(去年另一个项目写Linux Shell的时候,碰上8.10发布,下下来玩玩的热烈的笑脸)。所以,迁移工作到Linux下吧。

    首先考察Linux作为工作环境的可用性,结果如下:
    1. JDeveloper 11g使用Java编写,本身就提供for Linux版本(Free)。
    2. PL/SQL Developer没有Linux版本,但可以使用Oracle的SQL Developer或者第三方的TORA代替(暂时使用SQL Developer(Free))
    3. UlterEdit没有Linux版本的,但Gnome 的gedit本身就带语法加亮,另外安装meld代替ultra compare(Free)
    4. Ipmsg有Linux版本,下载tar.gz编译即可(Free)
    5. Firefox有Linux版本,公司的HR系统使用Opera填写(BS下公司的HR系统不支持Firefox)(Free)
    6. SecureCRT & SecureFX,开玩笑,Linux自己就有命令行的ssh和ftp客户端了微笑

    OK,Linux用来工作完全可行。

    原来的Ubuntu 8.10是用Wubi安装的,懒得再移植,就直接用了。
    JDeveloper 11g执行下载的bin文件,将JDeveloper安装在目标目录,然后运行 $目标目录$/Middleware/jdeveloper/jdev/bin/jdev即可(自带JDK),可以在/usr/bin中创建名为jdeveloper的文件,编写脚本
    #!/bin/bash
    $目标目录$/Middleware/jdeveloper/jdev/bin/jdev
    即可通过命令行直接运行。

    SQL Developer有deb包下载,安装后配置一下是用JDK的目录(指向JDeveloper 11g下的JDK目录),修改//opt/sqldeveloper/sqldeveloper/bin/sqldeveloper.conf,增加如下语句
    SetJavaHome $JDeveloper安装目录$/Middleware/jdk160_05/

    ipmsg可以在官网下载,然后configure, make, make install即可.

    其他软件可以直接通过Ubuntu的添加/删除进行安装。

    至此,环境配置完毕,重新配置JDeveloper,从SVN上迁出我们所作项目的最新版本,尝试运行之,Everything is working well !

    将Nvidia的驱动装上,把特效打开,把要用的工具都打开(Weblogic的内存配置为192/512,看你还PermGen Space),然后看系统监视器,交换区使用了148.0KB,内存使用了1352MB大笑

    [原]Oracle Data Integrator 学习笔记



    元旦考核时学习内容的总结。

    目录

    Part 1 – Overview >

    1. ETL & E-LT
    >
    2. Oracle Data Integrator架构
    >
    3. Knowledge Modules [知识模型]

    Part 2 – ODI设置&简单数据整合 >

    1. 完成Getting Start
    >
    2. 创建Repository Storage Space
    >
    3. 创建Master Repository
    >
    4. 连接至Master Repository
    >
    5. 创建Work Repository
    >
    6. 连接至Work Repository
    >
    7. 创建Oracle Data Server
    >
    8. 创建Physical Schema [物理架构]
    >
    9. 创建Logical Schema [逻辑架构]
    >
    10. 创建Project [项目]
    >
    11. 导入Knowledge Module
    >
    12. 创建Data Module & Reverse-engineer
    >
    13. 创建 & 执行Interface
    >
    14. 为Datastore启用简单CDC
    >
    15. 为Datastore启用一致性CDC
    >
    16. 创建Physical Agent [物理代理] & Logical Agent[逻辑代理]
    >
    17. 创建Scenario并使用Agent运行
    >
    18. Interface/Package调试及KM分析

    Appendix >

    ODI连接Microsoft SQL Server 2005

    http://cid-0ee24905211c3ffd.skydrive.live.com/embedrowdetail.aspx/Public/Hand/ODI|_%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0.pdf

    PS: 春节比上班还累……