Discuz的2003 cannot connect错误的一种解决方法

今天早上,无缘故的出现Discuz论坛无法连接的黄页,黄页的内容是discuz 2003 notconnect.

从表面上看是由于数据库无法连接导致的,但是查看了数据库的mysql服务,是正常启动的,无论是外部还是内部,都是可以连接数据库的.找了很多方法都没有办法定位原因,当然也没有办法解决.

突然间想到SELINUX,搜索了一下,发现SELINUX的确有可能会导致一些服务出现异常,

搜索了一下,网上有比较多的解决方法.一种是直接把SELINUX关闭.

一、查看SELinux状态命令:

1、/usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态
SELinux status:                 enabled

2、getenforce                 ##也可以用这个命令检查

二、关闭SELinux方法:

1、临时关闭(不用重启机器):

代码如下:

setenforce 0 #设置SELinux 成为permissive模式
#setenforce 1 设置SELinux 成为enforcing模式

2、修改配置文件需要重启机器:

修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled

重启机器即可.

另一种办法没有那么激进,添加SELINUX允许DB的远程访问.

修改apache远程访问数据库的布尔值

setsebool httpd_can_network_connect_db 1

什么是SELINUX

SELinux在linux中是保护系统的重要工具,它可以最大限度的保护系统的安全。也许有的人在使用过程中尝试着关闭过此工具,但是当考虑到要架设服务器的话,那就得重视它了。

假设我们希望允许远程匿名访问 Web 服务器,我们必须通过防火墙打开端口。然而,这意味着恶意人员可以尝试利用安全漏洞以及,如果他们损坏 Web 服务器进程,获得 apache 用户和 apache 组的权限来强行进入系统。懂点安全知识的人就知道很危险了,用户 / 组具有 document root ( /var/www/html )等的读取权限以及 /tmp 、/var/tmp 所有人均可写的任何其他文件 / 目录的写入权限。

SELinux 是一组可确定哪个进程能访问哪些文件、目录、端口等的安全规则。每个文件、进程、目录和

端口都具有专门的安全标签,称为 SELinux 上下文。上下文只是一个名称, SELinux 策略使用它来确定

某个进程是否能访问文件、目录或端口。默认情况下,该策略不允许任何交互,因此明确的规则授予访

问权限。如果没有允许规则,则不允许访问。

总之,SELinux 的目标之一是保护用户数据免受已泄漏的系统服务的威胁

SELinux 模式

为了进行故障排除,我们可以临时禁用 SELinux 保护,使用 SELinux 模式。

强制模式, SELinux 主动拒绝访问尝试读取类型上下文为 tmp_t 的文件的 Web 服务器。在强制

模式中, SELinux 不仅记录而且提供保护。

许可模式通常用于对问题进行故障排除。在许可模式中,即使没有明确规则, SELinux 也允许所有交

互,并且记录所有被拒绝的交互。此模式可以用于确定您是否有 SELinux 问题。无需重新引导即可从

强制模式转为许可模式,或再从许可模式转回强制模式。

禁用模式将完全禁用 SELinux 。您必须重新引导才能彻底禁用 SELinux ,或者从禁用模式

转为强制模式或许可模式。

装修清单

装修预算清单

辅料

  • 电线
  • 油漆
  • 水管
  • 水泥,黄沙

主材

  • 瓷砖
  • 地板
  • 马桶
  • 水槽
  • 台盆
  • 吊顶
  • 油烟气灶
  • 室内门

人工

  • 水电
  • 泥工
  • 木工
  • 油漆

家具

  • 柜子门
  • 电视柜,卧室柜子

五金

  • 卫生间五件套
  • 厨房五件套
  • 门栓
  • 门锁
  • 衣柜五金套件

家居用品

  • 沙发
  • 窗帘
  • 地毯

解决JSP乱码问题的方式和思考途径

JSP中的乱码问题是一个普遍的问题,对于初学者来说,没有经历过乱码,不算是真正的初学者。但是,乱码的解决方法却是有一定的策略的。一般来讲,需要做到以下几点。

1. 修改MYSQL服务器的编码
修改MYSQL的my.ini配置文件

default-character-set=utf8

2.修改MYSQL数据库的编码
修改已有的数据库编码

ALTER DATABASE databaseName CHARACTER SET utf8;

由于修改数据库编码不会影响到已经存在的表的编码,因此,还需要修改已经存在的表。

ALTER TABLE table_name CHARACTER SET utf8;

3.修改Tomcat服务器的默认编码
Tomcat的server.xml中有编码设置,设置如下

<Connector prot=“8080protocol=“HTTP/1.1connectionTimeOut=“2000redirectPort=“8443URIEncodeing=“UTF-8/>

4.修改JSP的页面编码
JSP页面的编码通常包括文件本身的编码和页面顶部的声明的编码

<%@ page language="java" import="java.util.*” pageEncoding="utf-8"%>

5.修改数据库连接字符串的编码
在创建connection时指定编码的方式,代码如下

Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/databaseWeb?unicode=true&characterEncodeing=UTF-8”,”root”,”admin”);

说说我家的规划

最近准备对家的事情多做一些规划,主要是包括家的一些装修和细节方面。

来看看家的地板图吧.地板图用来描述地板和地砖的铺设还是蛮方便的.

image

JSP连接数据库总结

最近学习Java,终于到了连接数据库了,各种教程中给出的示例都是Mysql适用的,不可否认,Java+Mysql算是一个不错的组合,全开源免费的环境也是互联网公司的最爱.

不过,很多系统还是SQL Server的,如果想一夜之间把这些系统换掉是一个不太可能的任务.

1. 下载并引入驱动包.

到微软官方站点下载驱动包,http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=21599.然后放到WebRoot\Web-INF\lib下面既可.我用的是sqljdbc4.jar,所说这个比较新.

2. 接着在页面顶端添加数据库所必须的几个引用.

<%@page import="java.sql.DriverManager" %>
<%@page import="java.sql.Connection" %>
<%@page import="java.sql.Statement" %>
<%@page import="java.sql.ResultSet" %>
<%@page import="com.microsoft.sqlserver.jdbc.SQLServerDriver"%>
<jsp:directive.page import="java.sql.Date"/>
<jsp:directive.page import="java.sql.Timestamp"/>
<jsp:directive.page import="java.sql.SQLException"/>

3. 再然后就是加载驱动,打开连接,建立查询命名,返回查询结果集,显示结果了.

具体的代码如下.

Connection conn=null;   
Statement stmt=null;
ResultSet rs=null;
String JDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";//SQL数据库引擎
String connectDB="jdbc:sqlserver://172.17.10.15//dev;DatabaseName=tech_doc";//数据源
    try
  {
   Class.forName(JDriver);//加载数据库引擎,返回给定字符串名的类
   conn=DriverManager.getConnection(connectDB,"User","Password");
    stmt=conn.createStatement();
   rs=stmt.executeQuery("select top 10 * from access_group");
   
   
   while(rs.next()){
   String group_id=rs.getString("group_id");
   String group_name=rs.getString("group_name");     
   }      
   }
   catch(SQLException ex){
   out.println();
   ex.printStackTrace();
   }finally{
   if(rs!=null)
   rs.close();   
      if(stmt!=null)
   stmt.close();
         if(conn!=null)
   conn.close();
   
   }

JAVA编程不得不看的几本经典书籍

入门类

1.《java从入门到精通》(第3版)

【内容介绍】

本书从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术。全书共分28章,包括:初识Java,熟悉Eclipse开发工具,Java 语言基础,流程控制,字符串,数组,类和对象,包装类,数字处理类,接口、继承与多态,类的高级特性,异常处理,Swing程序设计,集合类,I/O输入输出,反射,枚举类型与泛型,多线程,网络通信,数据库操作,Swing表格组件,Swing树组件,Swing其他高级组件,高级布局管理器,高级事件处理,AWT绘图与音频播放,打印技术和企业进销存管理系统等。所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,可以使读者轻松领会Java程序开发的精髓,快速提高开发技能。

【推荐理由】

本书内容详尽,实例丰富,非常适合作为编程初学者的学习用书,也适合作为开发人员的查阅、参考资料。

2.《java核心技术卷一》

【内容介绍】

本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI工具箱进行图形用户界面设计,异常处理、流输入/输出和对象序列化、泛型程序设计等。本书内容翔实、深入浅出,附有大量程序实例,极具实用价值,是Java初学者和Java程序员的必备参考书。

【推荐理由】

本书出版以来,深受广大读者的喜爱,它全面介绍了Java SE的基础知识,不但具有使用价值,而且易于阅读,易理解,它必成为想进军Java和基础薄弱同学的不二之选。

3.《java编程语言》

【内容介绍】

本书以Java语言创建者的独特视角向读者展现了为什么以及如何使用Java语言,以便读者理解Java语言的基本设计目标以及它在现实世界中的应用。本书介绍的是Java语言的最新版本,该版本在《Java Language Specification,Second Edition》中定义,在Java2SDK1.3标准版中实现。本书已是第三版,在经构上相对前两版有所调整,重点讲述了新的语言特征,并提供了新API的使用实例。本书完全覆盖了Java语言当前版本的特征和类库,可以作为Java语言的入门向导,也可作为高级Java开发及Java语言教学的参考用书。

【推荐理由】

本书介绍的是Java语言的最新版本,该版本在《Java Language Specification,Second Edition》中定义,在Java2SDK1.3标准版中实现。本书已是第三版,在经构上相对前两版有所调整,重点讲述了新的语言特征,并提供了新API的使用实例。本书完全覆盖了Java语言当前版本的特征和类库,可以作为Java语言的入门向导,也可作为高级Java开发及Java语言教学的参考用书。

进阶类

1.《java编程思想》

【内容介绍】

本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O系统、枚举类型、并发以及图形化用户界面等内容。这些丰富的内容,包含了Java语言基础语法以及高级特性,适合各个层次的Java程序员阅读,同时也是高等院校讲授面向对象程序设计语言以及Java语言的绝佳教材和参考书。

【推荐理由】

本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在BruceEckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。

2.《java核心技术卷二》

【内容介绍】

《JAVA核心技术卷2:高级特征》是Java技术权威指南,全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、高级Swing、高级 AWT、JavaBean构件、安全、分布式对象、脚本、编译与注解处理等,同时涉及本地化、国际化以及Java SE 6的内容。《JAVA核心技术卷Ⅱ:高级特征》对Java技术的阐述精确到位,叙述方式深入浅出,并包含大量示例,从而帮助读者充分理解Java语言以及Java类库的相关特性。

【推荐理由】

本书是经典的《Java核心技术,卷II:高级特性》的最新修订版,涵盖了Java SE6平台的高级用户界面程序设计和企业特性。与第1卷(涵盖了核心的语言和类库特性)一样,本卷已经更新到了JavaSE6。并且对新内容都作了重点标注。书中所有的示例程序都进行了详细的设计,用来演示最新的编程技术。并展示针对专业开发者在现实中所碰到的典型问题的最佳解决方案。本书包含有关StAXAPI、JDBC 4、编译器API、脚本框架、闪屏和托盘API以及其他许多JavaSE6改进特性的新章节。本书聚焦于Java语言中更高级的特性,包括下列内容:流与文件、网络、数据库编程、XML、JNDI与LDAP、国际化、高级GUI组件、Java2D、JavaBeans、安全、RMI与Web服务、高级AWT、注解、本地方法。

3.《疯狂java讲义》

【内容介绍】

本书深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多线程编程、Java网络通信编程和Java反射机制。共覆盖了java.awt、java.lang、java.io和java.nio、java.sql、java.text、java.util、javax.swing包下绝大部分类和接口。

【推荐理由】

本书并不单纯从知识角度来讲解Java,而是从解决问题的角度来介绍Java语言,所以本书中介绍了大量实用案例开发。这些案例既能让读者巩固每章的知识,又可以让读者学以致用、激发编程自豪感,进而引爆内心的编程激情。本书光盘里包含书中所有示例的代码,如果读者希望获得课后练习的程序代码。

本书为所有打算深入掌握Java编程的读者而编写,适合各种层次的Java学习者和工作者阅读,也适合作为大学教育、培训机构的Java教材。但北大青鸟光谷校区专业老师认为,如果只是想简单涉猎Java,则本书过于庞大,不适合阅读。

JavaEE类

1.《javaWeb整合开发王者归来》

【内容介绍】

本书全面介绍了Java Web开发中的各种相关技术及知识。全书分为9篇,内容层次清晰,难度循序渐进。第1篇为入门篇,内容包括Java Web开发概述等;第2篇为基础篇,内容包括Servlet技术、JSP技术、会话跟踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内容,也包括Struts 2.x中的内容;第5篇为Hibernate框架篇;第6篇为Spring框架篇;第7篇为EJB与Web服务篇,内容包括EJB 3概述、JPA规范Web服务框架XFire等;第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志工具commons-logging与Log4J、报表图形引擎JFreeChart、PDF组件iText等;第9篇为实战篇,内容为两个典型的应用系统:论坛系统(Spring+Struts+Hibernate)、宠物商店(EJB 3+JPA+Struts 2)。

【推荐理由】

资深Java程序员耗时一年时间写作,十年开发经验毫无保留。全面、系统、深入介绍Java Web开发的核心技术与主流框架。

2.《spring 入门到精通》

【内容介绍】

本书由浅入深,循序渐进地介绍了Spring的体系结构和相关知识点,目的是帮助初学者快速掌握Spring,并能使用Spring进行应用程序的开发。本书最大的特色在于每章都是由浅入深,从一个简单的示例入手,让读者快速了解本章内容,然后再详细讲解本章涉及的基本原理和知识点,最后再通过一个详细的示例宋巩固所学内容。本书每一章的例子都是经过精挑细选,具有很强的针对性,力求让读者通过亲自动手做而掌握其原理和方法,从而学习尽可能多的知识。本书适用于初、中级软件开发人员,同时也可用作高校相关专业师生和社会培训班的教材。

【推荐理由】

全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、Spring和Hibernate、Spring和Ant、Spring和Junit。本书适用于初、中级软件开发人员,同时也可用作高校相关专业师生和社会培训班的教材。

3.《JavaWeb开发详解》

【内容介绍】

本书共分4部分,从XML、Servlet、JSP和应用的角度向读者展示了Java Web开发中各种技术的应用,循序渐进地引导读者快速掌握Java Web开发。

【推荐理由】

本书内容全面,涵盖了从事Java Web开发所应掌握的所有知识,在知识的讲解上本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。

C#读取通信达行情数据缓存文件

最近这段时间对股票有了兴趣,当然也没有少亏,现在明白玩股票的,说不亏赚钱什么都是骗人的,钱能不能赚,当然是肯定的,但好不好赚,就不一定了.

作为数据时代的码农,对一个交易系统进行研究的动力可是不小的,这不,今天就从最简单的开始吧.

行情数据保存在.day文件中,采用的是结构体保存的方式.

    public struct StockInfo
        {
        public int date;
        public int open;
        public int high;
        public int low;
        public int close;
        public int amount;
        public int vol;
        public int reservation;
        }

由上面的结构体可以看出其基本的数据结构还是比较简单的.

日期,开盘价,最高价,最低价,收盘价,成交量,成交额,还有最后一个是保留位.

了解了结构体的数据结构以后,再读取就相对比较简单了,简单来讲,就是把二进制中的数据反序列化出来.就可以了.接下来我们来一步一步的分析这个过程.

1. 首先是获取读取的文件内容.

这个相对比较简单,C#有标准的二进制读取方法.

  public static byte[] ReadInfo(string file, int read)
            {
            FileStream fs = new FileStream(file, FileMode.Open);

            FileInfo fileInfo = new FileInfo(file);

            BinaryReader br = new BinaryReader(fs);

            byte[] bt = br.ReadBytes(Convert.ToInt32(fileInfo.Length));
            br.Close();
            fs.Close();

            return bt;
            }

上面的代码应该不需要解释,就是从文件开始读到最后一行呗.相当简单的事情.

2. 接下来,就是按照结构体的大小解析读到了byte[]数组.

这个解析就比较简单,用到了几个本地操作的函数.我们先来看一下代码

       private static StockInfo Byte2Struct(byte[] arr)
            {
            //获取结构体的大小
            int structSize = Marshal.SizeOf(typeof(StockInfo));
            //分配结构体大小的空间
            IntPtr ptemPtr = Marshal.AllocHGlobal(structSize);
            //将byte数组拷贝到分配好的内存空间
            Marshal.Copy(arr, 0, ptemPtr, structSize);
            //将内存空间转换为目标结构体
            StockInfo stock = (StockInfo)Marshal.PtrToStructure(ptemPtr, typeof(StockInfo));
            //施放内存空间
            Marshal.FreeHGlobal(ptemPtr);

            return stock;
            }

上面最重要的就是通过sizeof获取结构体的二制保存的字节的大小.

然后通过互操作类分配内存空间,把数组拷贝到内存,再把内存中的数据写入到结构体.相对来说,没有什么复杂的事情.

3. 用主函数将这些操作链接起来.简单来讲,就是读取文件,然后获取记录的条数.用循环读取每一条记录.

            byte[] bt = ReadInfo(filename, 288);

            int structSize = Marshal.SizeOf(typeof(StockInfo));

            int num = bt.Length / structSize;

            for (int i = 0; i < num; i++)
                {
                byte[] temp = new byte[structSize];
                Array.Copy(bt, i * structSize, temp, 0, structSize);

                StockInfo stock = new StockInfo();
                stock = Byte2Struct(temp);

                Console.Out.WriteLine(stock.date + " " + stock.open / 100.00 + " " + stock.close / 100.00 + " " + stock.high / 100.00 + " " + stock.low / 100.00 + " " + stock.amount + " " + stock.vol + " " + stock.reservation);

                }

这样子来看,其实读取二进制也不复杂,只要知道原始结构体,读取还是比较简单的.

每日行情读取完了,就可以进行第二步了,就是制定自己的操作策略,然后制定程序化交易的模型了