Danny's profile季节的水滴PhotosBlogListsMore Tools Help

Blog


    6/20/2008

    Solaris下启动Oracle数据库实例

    在Leewey同学的指导下学了一下Solaria下启动Oracle:

    # su - oracle
    $ sqlplus /nolog            // nolog是启动SQLPLUS,但不连接,也即nologin
    SQL>conn  username/password@sid //以username用户连接数据库
    SQL>startup                //启动数据库
    SQL>exit                    //退出
     
    刚开始由于密码中含有“&”这个符号,怎么试都不行。没办法偶只好:
    #su -oracle
    SQL>emctl start dbconsole
    打开浏览器输入http://ip address:1158/em
    用sys用户名进入,把username用户名的密码中的“&”号去掉(当然也可以直接用sys用户名登录去修改)。
    6/19/2008

    Windows下删除“无法删除文件:无法读源文件或磁盘”的文件

    这样的文件夹名大多是非法文件夹名,如包括空格,冒号。不能用正常方法删除该文件夹。

    Windows下不能建立全部是空格的文件,但是一般我们下载的时候可能不小心就下载了这类全部是空格的文件。不管怎么删除比如说DOS下;杀死Explorer进程;重启等方法。都会看到“无法读源文件或磁盘”的提示信息,网上一般说格式化这种极端的方法,这几天根据我的研究,我发现一个行之有效的简便方法:

    假如在D盘"oc4j903"文件夹下有一个这样的的文件"bak-080601 location"(文件名中包含一个空格),我们可以先把其他正常文件移出,然后回到command或者cmd平台下,这里是:

    点开始菜单中的“运行”,输入“CMD”,

    C:\document and settings\administrator>d:(回车)
    D:\>rd /s oc4j903(回车)
    然后选择Y即Yes!这样就删除了。再建立一个oc4j903文件夹,把原来的文件放进去就可以完好如初了。

    6/17/2008

    9i OEM不能访问10g数据库(非sys用户),报:您必须具有SELECT ANY DICTIONARY权限才能运行此应用程序

          用Oracle9i的Enterprise Manager Console连接Oracle10g数据库报“您必须具有SELECT ANY DICTIONARY权限才能运行此应用程序。请要求DBA为您授予此权限”错误。网上有人说这是使用OEM登录时的一个BUG,授权也没有用;即使新建用户时,为该用户授予了此权限,也会报这个错误。
          解决办法:1.换Oracle10的OEM;
                       2.Oracle10g有web管理界面,打开浏览器输入:http://IP Address:Port/em
                    如:http://10.221.12.145:1158/em
    6/15/2008

    乘地铁竟然坐错方向

         周五下班回家,偶到中山公园换成三、四号线。走了一个平时不常走的通道,这时LZ正好打电话过来,于是就小聊了几句。
         上了二楼正好有地铁过来,偶觉得方向正是偶每天回家的方向,不假思索地就直接上了地铁。上了地铁偶窃喜:此时下班高峰应该还没有过,竟然还有座。等了一会,偶听见报站:延安西路到了。汗~~立刻下车去对面换乘反方向的地铁。
         换乘路上偶心里一直在想:其实偶完全没有必要去对面换乘的,南辕北辙嘛,反正四号线是环线,偶总会坐到站的。

    Oracle导出数据

    网上百度的从Oracle数据库导出数据偶试了一遍,都不行。不过偶幸亏有高手指点,才顺利导出数据。
     
    现将正确的方法贴出,希望可以帮助需要的人:
    1.打开客户端Enterprise Manager Console连接到你要导出的数据库
    2.cmd进入DOS命令行
    4.输入password
    5.给导出的dmp文件起名字
    6.选择导出数据库、用户还是表(我选的是导出用户)
    7.选择是否导出权限、表数据,是否压缩区
    8.要导出的用户:此处再次输入用户名
     
    贴图如下: 用户名:monet       SID:lbs
    6/12/2008

    迪杰斯特拉(dijkstra)算法 Java实现

    这个算法常见于交通咨询系统中(比如:导航软件和电子地图)路径的查询。
     
    求单源最短路径的经典算法,算法基于这样一种思想:
    1 将顶点集V分成 S(开始只包含源点, S包含的点都是已经计算出最短路径的点) 和 V-S 集合(V-S 包含那些未确定最短路径的点)
    2. 从V-S中选取这样一个顶点w: 满足经过S集合中任意顶点 v到w 的路径最短, 即
    满足( 源到v的路径 + v到w的路径) 最小的那个w. 其中v 属于S, w属于S-V。将w 加入S, 并从V-S中移除w.
    3. 如此反复,直到V-S变空集为止。

    归纳基点:
        1.比如开始 S中只有原点s, 那我们从V-S中选取离s最近的点w, 则s直接到w的路径一定最短。因为如果存在另一个点w2, 使得 s->w2->w 的路径比s 直接到w短,那么s->w2 一定 小于s->w, 那么 w就不是离s最近的点,与我们选取的w离s最近这个先前条件矛盾。所以在最开始,选出来的那个点 w 一定确定了最短路径,即s->w 的边长。 w已经确定,将w加入S.
        2. 此时S中有 v1,v2....vk 顶点,V-S中剩下 w1,w2.....Wn-k 顶点。我们此时当然选择离S集合最近的点w.
    w必然满足 D[w]= Min(D[v]+D[v to w])    其中 D[x] 表示从原点到x的最短路径长。
        这个w 此时一定取得了最短路径D[w], 因为如果有其他的路径,假设是 S集合某路径->Wi->w, 那么就应当去选取Wi 做为该点而不是w. 因为 S集合某路径长D[v] + D[v to Wi] < D[v]+D[v to w] 与 w满足的公式矛盾。
        因此w必然是最小的。将w加入S集合。

    实现框架、核心代码:
    采用邻接表存储图
    1 /*
    2 * 邻接边
    3 * */
    4 public class Edge {
    5     public Vertex dest;//目标顶点
    6     public double cost;//代价
    7     
    8     public Edge(Vertex d,double c){
    9          dest=d;
    10          cost=c;
    11      }
    12 }
    13

    顶点类:
    1 public class Vertex  implements Comparable<Vertex>{
    2     public String name;//顶点名
    3     public List<Edge> adj;//邻接表
    4     public double dist;// 从原点到该点的最短路径长
    5     public Vertex prev;//最短路径前一个节点
    6     public int scratch;//算法需要
    7     public boolean visited;
    8     public Vertex(String nm){
    9          name=nm;
    10          adj=new ArrayList<Edge>();
    11          reset();
    12      }
    13     public void reset(){
    14          visited=false;
    15          dist=Graph.INFINITY;
    16          prev=null;
    17          scratch=0;
    18      }
    19     @Override
    20     public int compareTo(Vertex o) {
    21         double c=o.dist;
    22         return dist<c?-1:dist>c?1:0;
    23      }
    24 }
    25

    1     /*
    2      * 迪杰斯特拉算法.
    3      *
    4      * 使用优先级队列来存储V-S集合,这样队首的元素就是要选取加入S的元素。
    5      *
    6      * 每加入S一个元素,就用它去更新可更新的V-S中的元素。
    7      *
    8      * */
    9     public void dijkstraSlow(String startName){
    10          PriorityQueue<Vertex> pq=new PriorityQueue<Vertex>();
    11          Vertex start=vertexMap.get(startName);
    12         if(start==null)
    13             throw new IllegalArgumentException("Hey fk,start vertex is illegal!");
    14          clearAll();
    15         //pq.add(start);
    16          start.dist=0;
    17         //构造V-S集合,将顶点全部装入优先级队列(V-S集合).
    18         //优先级队列的队首元素即离原点最近的,因为Vertex对象的比较器是
    19         //根据Vertex对象到原点的距离来比较的。
    20         //其实这里可以进一步优化的,由于开始选中加入S的必定是原点,
    21         //且只有刚加入S的顶点的邻接顶点才有可能是新的加入S的顶点,
    22         //所以开始只要把原点放入vertexMap即可,第一次将原点加入S,
    23         //然后更新其邻接点到原点的距离.从中选出最小的来加入S。
    24         //这里为了保持算法清晰,没有进行优化.
    25         for(Vertex v:vertexMap.values())
    26              pq.add(v);
    27         
    28         
    29         int seenNum=0;
    30         while(!pq.isEmpty()&&seenNum<vertexMap.size()){
    31             
    32              Vertex v=pq.remove();//第一次取的是原点,其余情况自然是到原点最近的点.
    33             
    34             if(v.scratch!=0)//如果v已经加入了S,则跳过
    35                 continue;
    36             
    37              v.scratch=1;//设置标志位,标志已经加入了S集合.
    38             
    39              seenNum++;//已经确定了多少顶点。
    40             
    41             //利用新加入S的点来更新V-S集合:
    42             
    43             //因为要更新V-S集合中点到原点的路径距离,并从中选取距离最小的点,因此从S集合的点的邻接
    44             //点中选取,因为如果不与S的点邻接,就暂时无法更新其距离。而没有更新(即减小路径长)的点不可能被选中.
    45             for(Edge e:v.adj){
    46                  Vertex w=e.dest;
    47                 double v_to_w=e.cost;
    48                 
    49                 if(w.dist>v.dist+v_to_w){
    50                      w.dist=v.dist+v_to_w;//更新其D[w]值
    51                      w.prev=v;
    52                     //pq.add(w);//加入优先级队列以备选取.
    53                     
    54                     //利用优先级队列来排序,取出离原点最近的。
    55                     //队首的元素满足D[w]=Min(D[v]+D[v to w]).
    56                     //删掉旧值,更新队列,
    57                      pq.remove(w);
    58                      pq.add(w);
    59                  }
    60              }           
    61         }          
    62      }
    6/10/2008

    假期结束

        昏昏然三天假期就这样结束了,本来想看点spring方面的东西的,结果什么事情都没有做。上海又进入了黄梅天,下雨下的哪里都去不了。实在无聊出去买了一本季羡林自传。 

        今天又得继续上班,学习不能停止啊,继续努力~
        PS:偶在网页写日志,写好之后发现"发布日志"按钮竟然是灰色的,唉...只好又贴到Live Writer中发布。
    6/4/2008

    一道java题(for循环是如何工作的)

    public class Test {
        static boolean foo(char c) {
            System.out.print(c);
            return true;
        }
        public static void main(String[] argv) {
            int i = 0;
            for (foo('A'); foo('B') && (i < 2); foo('C')) {
                i++;
                foo('D');
            }
        }
    }