精华内容
下载资源
问答
  • import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;

    import java.io.FileOutputStream;
    import java.io.IOException;

    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;


    /**
     *
     * @author zhangfujia
     * @time   20111221
     *自动扫描文件夹下的文件
     *用途:自动扫描脚本输入路径,输出要执行的sql导入数据库;
     */
    public class OutSql {
     public static String  sql ="";
     public static String  Str_Name_pass ="";         //用户名密码
     public static String  Name_pass_path ="D:\\数据升级辅助\\DB_acount_password.config";       //用户名和密码文件
     public static String path ="D:\\数据升级辅助";       //父类文件夹位置
     public static String sql_path ="D:\\数据升级辅助\\升级脚本";    //sql文件文件夹位置
     public static String Log_path ="D:\\数据升级辅助\\日志\\";     //执行日志文件 文件夹位置
     public static String Log_Message ="";           //日志信息
     public static void main(String[] args) {
       // TODO Auto-generated method stub
       GetPs();              //获得用户名密码
       GetSql(sql_path);                  //获得sql
       System.out.println("sql:"+sql);
       ExectorSql();              //执行sql
       setLog();             //获取日志
     }
     /*
      * 获取用户名密码
      */
     public static void GetPs(){
      try {
       BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(Name_pass_path)));
       String data = "";
       while((data = br.readLine())!=null)
       {
         System.out.println(data);
         Str_Name_pass +=data;
       }
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
     /*
      * 执行数据库自动升级
      */
     public static  void ExectorSql( ){
      char[] inputSqlCmd = sql.toCharArray();              //转换字节 sql转换为char[]类型  
      String cmd = Str_Name_pass;                 //启动sqlplus 
      try {
       //创建进程启动sqlplus   
       Process  process = Runtime.getRuntime().exec(cmd);
       System.out.println("Str_Name_pass:"+sql);
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
          bw.write(inputSqlCmd);         //写入进程 写入控制台数据
          bw.flush();
          bw.close();           // 必须得关闭流,否则无法向子进程中输入信息
       String s="";
       BufferedReader error = new BufferedReader(new InputStreamReader(process.getInputStream()));//获得输出
          while((s=error.readLine())!=null){
              System.out.println("控制台输入流:"+s);
              Log_Message+=s+"\r\n";
             
           }         
       try {
        process.destroy();
        process.waitFor();
       } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
     /*
      * 递归调用查找指定文件加下所有文件
      */
     public static  String GetSql(String path){
      File rootDir = new File(path);  
       if(!rootDir.isDirectory()){   
        sql+= "@"+rootDir.getAbsolutePath()+";\r\n"; 
       
       }else{
        String[] fileList =  rootDir.list();
        for (int i = 0; i < fileList.length; i++) {
         path = rootDir.getAbsolutePath()+"\\"+fileList[i];
         GetSql(path);      
          }
       }   
      return sql;   
     }
     /*
      * 生成日志文件
      */
     public static void  setLog(){ 
         Date dt = new Date();
         //最后的aa表示“上午”或“下午”    HH表示24小时制    如果换成hh表示12小时制
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Log_path +=sdf.format(dt)+".txt";
      byte[] bt=Log_Message.getBytes();
      try {
       FileOutputStream output = new FileOutputStream(Log_path);  
       output.write(bt);
       output.close();
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
    }

    展开全文
  • 目标使用http访问网站自动跳转到https,代码中不强制使用https以便可以在开发测试环境方便使用。关键字 java,springmvc,shiro,tomcat,nginx.1,项目部署图升级后部署图2,需要的改动:nginx :在80端口的server 中 ...

    一个很老的项目需要在生产中使用https,记录下!

    目标使用http访问网站自动跳转到https,代码中不强制使用https以便可以在开发测试环境方便使用。

    4bc8dc8e2aa4dcb90468110394469b8c.png

    关键字 java,springmvc,shiro,tomcat,nginx.

    1,项目部署图

    b42f6785b1ec29470c3704d34820e85a.png

    升级后部署图

    f5435ac3f9b0ad7016648373fe9f8d04.png

    2,需要的改动:

    1. nginx :

    在80端口的server 中 增加

    rewrite ^(.*)$ https://$server_name$1

    修改目的:使浏览器从http 跳转到https,使用301跳转可以让浏览器缓存,减少网络连接次数。

    配置中增加

    proxy_set_header X-Forwarded-Proto $scheme;

    修改目的:shiro,Spring Security等使用 ServletRequest#isSecure() 方法判断是否是SSL环境,增加这个配置可以使登录跳转到https。

    • java 项目 spring 配置文件

    这里使用的是jsp ,如果是其他视图解析器 也需要做相应配置。

    修改目的使spring redirect 能跳转到https 而不是http。

    • tomcat

    增加配置

    end!

    展开全文
  • 关键词:工作流快速开发平台工作流流设计业务流程管理 asp.net 开源工作流bpm工作流系统java工作流主流框架自定义工作流引擎 驰骋工作流引擎ccflow和jflow的升级步骤: CCBPM把更新分成三类, 应用程序代码更新、...

    关键词:工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流  bpm工作流系统  java工作流主流框架  自定义工作流引擎

    驰骋工作流引擎ccflow和jflow的升级步骤:

    1. CCBPM把更新分成三类, 应用程序代码更新、数据表结构更新、数据更新。
    2. CCBPM在您登录流程设计器时自动判断当前的版本与数据库版本是否一致,不一致它就会自动启用更新程序,把代码与数据库更新到一致的版本。
    3. 我们会保持2年更新,就是说您两年以前使用CCBPM, 一直没有更新,如果您下载了ccbpm新代码,ccbpm会把2年内的补丁包都自动打上。
    4. ccbpm有数据表自动修复功能,在您使用ccbpm是有时间第一次看到一个错误,第二次就没有了,这是因为您没有用升级的模式登录CCBPM, 在遇到新程序与旧的数据表结构不一致时,CCBPM会自动修复上,第二次运行就没有错误了。
    5. 不要尝试每次都去更新,如果现阶段驰骋工作流引擎已经满足了您的需要,那就不要去更新。

     

        6.JFlow升级代码的位置.

    7. 代码自动升级位置如下图,有兴趣的朋友可以去看看。

    展开全文
  • 既然我们现在的系统内核已经具备了进程的切换功能,因此,我们更近一步,将现在进程间的主动切换升级为进程间的自动切换,然后每个进程各种打印一个字符,这样就可以再现当时Linus的辉煌一刻了。

    更详细的讲解和代码调试演示过程,请参看视频
    Linux kernel Hacker, 从零构建自己的内核

    Linux 操作系统内核于1991年10月5日被Linus Benedict Torvalds 所开发,从此后,世界软件史揭开了新的帷幕,我们现在很多伟大的软件项目,都构建在Linux的基础之上,不说用于支撑谷歌,阿里,百度等巨头业务的后台大型服务器,现在风靡世界的安卓操作系统,也是构建在Linux之上的,可以说,没有当年Linux内核诞生的那一刻,就没有现在方兴未艾的移动互联网。

    Linus当时完成的内核有什么特点呢?当时的内核功能简单,但最重要的是其具有了进程调度功能,它启动了两个进程,一个进程打印出一串”AAAA…”, 另一个进程打印出一串”BBBB….”

    既然我们现在的系统内核已经具备了进程的切换功能,因此,我们更近一步,将现在进程间的主动切换升级为进程间的自动切换,然后每个进程各种打印一个字符,这样就可以再现当时Linus的辉煌一刻了。

    如何实现进程的自动切换呢,或许你已经想到了,那就是利用时钟中断。好,让我们来开始实现相应代码,首先要改动的是multi_task.h 和 multi_task.c:

    
    struct TSS32 {
        int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
        int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
        int es, cs, ss, ds, fs, gs;
        int ldtr, iomap;
    };
    
    struct SEGMENT_DESCRIPTOR {
        short limit_low, base_low;
        char base_mid, access_right;
        char limit_high, base_high;
    };
    
    void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar);
    
    #define AR_TSS32        0x0089
    
    void mt_init();
    
    struct TIMER *mt_timer;
    
    void mt_taskswitch();
    

    我们多加了两个函数接口和一个定时器指针,他们将用来实现进程间的自动切换。我们看看具体实现(multi_task.c):

    static int mt_tr;
    
    void mt_init(void) {
        mt_timer = timer_alloc();
    
        timer_settime(mt_timer, 100);
        mt_tr = 7*8;
        return;
    }
    
    void mt_taskswitch() {
        if (mt_tr == 7*8) {
            mt_tr = 9*8;
        } else {
            mt_tr = 7 * 8;
        }
    
        timer_settime(mt_timer, 100);
        farjmp(0, mt_tr);
        return;
    }

    mt_init 首先初始化用于进程调度的时钟对象,然后把mt_tr设置为7*8,也就是CMain函数所对应的任务门描述符的下标。

    mt_taskswitch 一旦被调用,那么则把mt_tr在7*8 和 9*8 直接切换,然后通过调用farjmp 跳转到对应的任务门,下标7对应的是CMain的任务门,9对应的是task_b_main函数的任务门,在这两个任务吗间跳转,就可以实现两个进程的相互切换。

    我们再看看farjmp的实现,它的实现是在内核的汇编部分:

    farjmp:
            jmp FAR [esp + 4]
            ret

    在汇编中,跳转执行分两种情况,一种叫近跳转,如果跳转不涉及到让CPU更改当前加载的代码段描述符,也就是cs寄存器所存储的描述符下标,那么我们就可以使用近跳转,如果要改变cs寄存器的内容,也就是要让CPU加载新的描述符,那么我们可以使用远跳转,就像上面的代码一样,由于我们任务切换时,要从一个任务门描述符切换到另一个任务门描述符,所以我们可以使用远跳转。

    如果jmp 指令后面跟着FAR 关键字的话,那么CPU会把当前指定的内存地址处的4字节当做eip的值,然后再连续读入2字节的数据存入cs寄存器。对于调用far(0, 7*8), [esp + 4] 对应的4字节就是数值0,接下来的2字节对应的就是7*8.
    所以当我们通过调用farjmp(0, 7*8) 的时候,其效果跟我们以前调用taskswitch7是一样的。

    有了进程切换代码后,我们就可以在时钟中断里进行调用,进而实现进程切换了,看timer.c:

    void intHandlerForTimer(char *esp) {
        io_out8(PIC0_OCW2, 0x20);
    
        timerctl.count++;
        char ts = 0;
        int i;
        for (i = 0; i < MAX_TIMER; i++) {
            if (timerctl.timer[i].flags == TIMER_FLAGS_USING) {
                timerctl.timer[i].timeout--;
                if (timerctl.timer[i].timeout == 0) {
                    timerctl.timer[i].flags = TIMER_FLAGS_ALLOC;
                    fifo8_put(timerctl.timer[i].fifo, timerctl.timer[i].data);
                    if (&timerctl.timer[i] == mt_timer) {
                        ts = 1;
                    }
                }
            }
    
            if (ts != 0) {
                mt_taskswitch();
            }
        }
    
    
        return;
    }

    每次时钟中断发送,上面intHandlerForTimer函数会被调用,该函数先减少每个时钟的时钟片,如果有时钟超时的话,它会看看,超时的时钟是否是mt_timer,如果是的话,表示将变量ts 设置为1,后面如果判断到ts不等于0时,就表示进程切换的时间到了,便调用mt_taskswitch进行进程切换。

    再看看内核C语言部分的修改:

    void CMain(void) {
    ...
        fifo8_init(&timerinfo, 8, timerbuf);
        timer = timer_alloc();
        timer_init(timer, &timerinfo, 10);
        timer_settime(timer, 100);
    ...
    
        for(;;) {
           ....
           else if (fifo8_status(&timerinfo) != 0) {
               io_sti();
               int i = fifo8_get(&timerinfo);
               if (i == 10) {
                    showString(shtctl, sht_back, pos, 144, COL8_FFFFFF,
                     "A"); 
                    //switch task 
                  //  farjmp(0, 9*8);
                    timer_settime(timer, 100);
                    pos += 8;
               }
           ....
        }
    }

    在CMain中,先构造了一个时间片是1秒的时钟,每当时钟超时,就在屏幕上打印一个字符”A”, 然后再次初始化新的时间片为1秒的时钟。我们看看task_b_main的实现:

    void task_b_main(void) {
       showString(shtctl, sht_back, 0, 160, COL8_FFFFFF, "enter task b");
    
        struct FIFO8 timerinfo_b;
        char timerbuf_b[8];
        struct TIMER *timer_b = 0;
    
        int i = 0;
    
        fifo8_init(&timerinfo_b, 8, timerbuf_b);
        timer_b = timer_alloc();
        timer_init(timer_b, &timerinfo_b, 123);
    
        timer_settime(timer_b, 100);
    
    
        int pos = 0;
        for(;;) {
           io_cli();
            if (fifo8_status(&timerinfo_b) == 0) {
                io_sti();
            } else {
               i = fifo8_get(&timerinfo_b);
               io_sti();
               if (i == 123) {
                   showString(shtctl, sht_back, pos, 176, COL8_FFFFFF, "B");
                  // farjmp(0, 8*8);
                   timer_settime(timer_b, 100);
                   pos += 8;
               }
    
            }
    
        }
    
    }

    task_b_main同样构造了一个1秒的时钟,每次时钟超时的时候,就在桌面上打印出字符B,上面的代码编译后,加载到虚拟机,实现的效果如下(请通过视频观看动态效果):
    这里写图片描述

    字符A和B在没有任何干预的情况下,交替显示出来,当前Linus实现的第一版Linux内核就是这个效果,如今,我们重现了当前激动人心的一刻,不知此时的你是否也能体验到大牛Linus当时喜悦的心情呢?

    更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
    这里写图片描述

    展开全文
  • 以前看到过个:Java开发手册(阿里巴巴-公开版),这是个pdf文档,里面描述了一些Java开发的规约,里面确实有很多好用的规约,要是在学校就有机会看看的话,那么,在毕业之后,实际工作中就会少很多坑。现在,阿里...
  • 前言目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要。本系列依然以selenium2为基础,目前selenium3本人没做过研究就不多说了。Selenium是一个用于...
  • 由于做android应用开发以及一段时间,android的开发环境已经配置好了,昨天有同事遇到了不能自动生成R.java文件,试了很多方法都不行,后来升级了ADT的版本后,就好了,我就想为什么一开始的时候么有想到?...
  • auto-code欢迎使用auto-code代码自动生成引擎, 2.0重大升级.支持单表, 一对一, 一对多 ,多对多代码生成 源码地址项目介绍项目的优势在哪里1.目前市面上的代码生成工具绝大多数仅仅支持生成单表,该项目支持 单表, 一...
  • 码云后台管理系统eladminGuns微信小程序商城(Java版)zheng不仅仅是一个开发架构,而是努力打造一套从 前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位J2EE...
  • 基于java的雷电游戏基本功能包括:敌方飞机随机飞行、我方飞机手动控制飞行,射击比拼,游戏闯关等。主要有: (1)雷电游戏状态调整功能: 在游戏启动时,游戏会自动进行初始化的验证。 若初始化成功后,界面会...
  • 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。 maven有很多插件,便于功能扩展,比如...
  • 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要。本系列依然以selenium2为基础,目前selenium3本人没做过研究就不多说了。 Selenium是一个用于Web...
  • 一个简易Java开发的图书管理系统

    千次阅读 2017-09-10 22:18:49
     一个简易Java开发的图书管理...当用户买书消费达到100元时,自动升级为会员,享受85折优惠!如果用户租书超期未还,将产生额外的费用,同时拖欠达到30天以上的用户将被拉入黑名单,停止使用买书租书服务,除非
  • 1、default.properties中设置的版本不对。 2、ADT的版本不对,需要升级ADT的版本。 ...把JDK的版本从1.6修改成1.5之后问题没解决,然后又重新改成1.6,以前没有的R.java终于奇迹般的出现了~~
  • java升级前言简述 前言 synchronized 在jdk6之前是很笨重的,不同线程的加锁解锁会引起操作系统内核态的切换,十分消耗性能,不过jdk6之后它正在向着智能方向发展——它能根据当前线程运行环境来自动切换不同的锁 ...
  • 最近把电脑重新安装了系统升级到了macOS Big Sur 11.0.1版本,开发环境就要从头开始配置了。 安装jdk没什么难的,记录一下过程。给有需要的人。 下载jdk 我们公司现在主流的还是在用jdk 8,这样以安装jdk8为例吧。 ...
  • auto-code欢迎使用auto-code代码自动生成引擎, 2.0重大升级.支持单表, 一对一, 一对多 ,多对多代码生成 源码地址项目介绍项目的优势在哪里1.目前市面上的代码生成工具绝大多数仅仅支持生成单表,该项目支持 单表, 一...
  • EfsFrame(开发框架) 2.2 升级内容: 1、bug修正 a)修正 firefox环境下的快捷键好像不太支持的问题; b)修正 firefox环境下的menuDisabled 属性无效 store的 remoteSort 属性无效; c)修正分页列表中下面分页条...
  • 最近在ubuntu下开发一个嵌入式系统下的项目,离开java平台下maven自动管理版本号升级,...于是自己写了一个脚本,完成对项目版本号的自动升级,提交。 实现原理也不复杂,主要就是利用正则表达式从源码中读取固定格...
  • 最近把电脑重新安装了系统升级到了macOS Big Sur 11.0.1版本,开发环境就要从头开始配置了。 安装jdk没什么难的,记录一下过程。给有需要的人。 下载jdk 我们公司现在主流的还是在用jdk 8,这样以安装jdk8为例吧。 ...
  • eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法我的eclipse原来是好好的,什么问题都没有的,结果今天一打开新建一个android程序,发现工程里不会自动生成R.java文件了,导入其他工程也一样不行...
  • 随着应用产品的不断发展,升级是不可避免的事情,做android应用开发的朋友们都会清楚,自己做的应用要不断的升级才能满足用户的需求,那么应用客户端的自动升级是怎么实现的呢?今天给大家分享一些代码如下,希望能够...
  • 因为原项目应用的都是v4v7包,谷歌改成androidx后就升级了一番,首先在properties文件 然后在菜单里点击升级,studio会帮你把报名什么的都改掉 打开项目,发现都自动改掉了,完美,然而做为一个android开发,我怀疑...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 824
精华内容 329
关键字:

java开发自动升级

java 订阅