JavaApplet程序编译注意事项

首先附上一JavaApplet的Helloworld程序,及在html中的嵌入代码:
源代码路径:JavaAppletsrcHelloworld.java
JavaAppletbinJavaTest.html

import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet
{
	public void paint(Graphics g)
	{
		g.drawString("Hello World!", 5, 35);
	}
}
<HTML>
<HEAD><TITLE>JavaApplet-Text</TITLE></HEAD>
<BODY>
<applet code = "HelloWorld.class" width = 200 height = 200></applet>
</BODY>
</HTML>

要使上述代码正常运行要注意以下几点:
1、Helloworld.java编译成功后会在…bin中生成Helloworld.class文件,要将html文件同class文件放在同一目录下。若不在同一目录,则要在html中加入”codebase”代码,即

<applet code = "HelloWorld.class" codebase= "location" width = 200 height = 200></applet>

2、确保Java是最新版
3、在控制面板->程序->Java->安全设置中,把安全等级调到最低
4、不要为Helloworld创建包(package),否则要在html中指定包名。P.S.目前DS还不会指定包名=。=!

Wireless路由/接入点攻击

近些年来,越来越多的用户的网络接入方式由有线转向了无线,其中不乏大量的个人用户,使用着各式各样的消费级无线路由器/无线接入点。无线安全的发展也历经了十年时间,然而这并不代表个人用户所使用的无线鉴权方式的安全性得到了很大的改善。

在最开始,我们首先来记住一句话:

任何系统都有他的薄弱之处!

无线安全等级我大致划分如下:

  • 无无线安全性设置;
  • WEP安全设置;
  • WPA/WPA2安全设置。

对于企业用户来说,接入点不使用安全性设置一点问题也没有,他们完全可以利用认证网关的方式达到安全性要求,而忽略接入点的安全性以获得更高的兼容性。对于个人用户来说,不设置接入点鉴权,就意味着将你的网络没有防范的摆在每一个人面前,除去数据被截获的担忧意外,对于一般个人用户来说更重要的是,你向运营商付费获得的带宽可以很轻易地被他人占用,或者说,被蹭网。

那么我们现在来看一下两大安全鉴权方式:

WEP

这是一个过时的方式。面对蹭网者,WEP加密仅仅是在不加密的基础上多了一层窗户纸。这层窗户纸能够帮你挡掉小白型的机会蹭网者,但是对有着丰富蹭网经验的人来说,真的是一层窗户纸而已。

这是因为WEP在设计的时候有漏洞,他不会更新IV(初始向量),导致了攻击者在截获了足够数量的数据包以后,完全可以用一定的算法计算出你的加密密钥。一般来说15000数据包是足够计算的了。

破解WEP加密,主要的时间消耗在于数据包的获取,一旦有了足够的数据包,解密只是十几秒的事情。

在没有其他因素干扰的情况下,数据包的获取速度与在线客户端网络使用量、攻击者与接入点之间的信号强度成正比。而攻击者可以使用各种注入攻击,虚假ARP请求等方式来加速获取数据包。另外,有实验表明,无客户端连接的情况下,也完全可以达成对WEP加密的接入点的攻击。

WPA/WPA2

这种加密方式与WEP相比有了很大的提高,他会定时更换随机生成的IV,就目前来说还没有一个像WEP一样的漏洞可以保证一定能够获得加密密钥。但是记住,任何系统都有薄弱点,这个薄弱点很可能就是用户自己!WPA强制使用8位以上密钥,但是如果这个密钥只是弱密码呢?笔记本把8位纯数字跑一遍也不过4个小时,更何况8个1,8个0,12345678或者年月日这种弱密码呢!WPA/WPA2的攻击方法是截获握手包并且利用预先生成的字典文件进行检测。在有客户端连接的情况下,握手包的获取速度很快,一般在5分钟以内。使用Fake Auth等方法更能加快这一过程。在我的笔记本上,Windows下的EWSA可以达到7000key/s的检测速度,弱密码跑一遍估计就是2秒钟。

那么是不是说设置一个复杂的长密码就可以高枕无忧了呢?不是这样的。现在很多家用路由器提供了快速连接WPS功能,一般是通过物理按钮完成无密钥连接。但是WPS实际上还有一个PIN码连接的功能,该功能的设计有缺陷,8位的PIN码全部跑一遍应该是(10^8)数量级,而设计缺陷使得8位PIN码被一分为三:4位第一部分,3位第二部分,1位校验位。所以实际上的数量级是:(10^4+10^3=11000),而平均期望为5500。

按照6s一个PIN码的保守估计,平均用时9小时就一定能够获得真实的PIN码和密钥。而考虑到实际过程当中,会使用加强天线等方式,以及各个厂家的PIN码其实是有规律可循的,总体时间可以控制在2小时以内。不管设置的密钥有多么长,多么复杂,一切皆是无用。

VHDL中整形变量转换为标准逻辑变量应注意的问题

VHDL中的数据转换函数conv_std_logic_vector的用法

std_logic_arith程序包里定义的数据转换函数:conv_std_logic_vector(int_var,bit_len)–INTEGER,SINGER,UNSIGNED转换成std_logic_vector

由于参考书上都没有具体说明,本以为是将原来的数据类型按位矢量输出,结果按这种用法编写的滤波器在接实际信号时,却使用输出图像全部反色,经modelsim波形仿真之后,才发现滤波器结构是正确的,可是调用了转换函数之后,结果非预期效果。

对该转换函数做了测试之后,才发现:该函数的转换结果是将被转换的数据先转换成2进制补码形式,然后取其低“位长”,作为输出。

如:a<=conv_std_logic_vector(-79,6)—-(-79)2c=(10110001)

b<=conv_std_logic_vector(-2,6)—–(-2)2c=(11111110)

c<=conv_std_logic_vector(100,6)—–(100)2c=(01100100)

输出结果:a=110001,b=111110,c=100100

Java PrintWriter flush属性

在做当前项目的socket开发时候,按照惯例使用BufferedReader和PrintWriter做输入输出,发现使用telnet连接服务器的时候,客户端输入正常,服务器输出正常 ,但是客户端没有接收到服务器的消息。考虑过是和Flush有关的问题,依稀记得以前看到过有关PrintWriter的介绍,是在调用println等方法的时候自动flush的,于是一直没仔细研究。研究过各个方面后以及其他代码之后,又重新把目光投向flush问题上,最终也确定了是这个问题。

首先,与PrintStream不同,PrintWriter不是遇到新行(ln,或n)就flush,而是在调用println,printf或者format方法被调用的时候flush的。然而这有一个前提,就是要开启自动flush的功能。这一设定是在PrintWriter的构造函数中的,autoFlush参数指定了构造的PrintWriter对象是否自动Flush:

PrintWriter(OutputStream out, boolean autoFlush)

PrintWriter(Writer out, boolean autoFlush)

以下构造函数构造的PrintWriter对象没有自动Flush属性:

PrintWriter(OutputStream out)

PrintWriter(Writer out)

PrintWriter(File file)

PrintWriter(File file, String csn)

PrintWriter(String fileName)

PrintWriter(String fileName, String csn)

Java SQL Statement初探

前几天说到新开始的Java项目,里面使用到了Java SQLite JDBC driver,今天继续来探讨一下Java中SQL数据库的使用。

应当注意到,在java当中,SQL语句的执行是以java.sql.Statement为载体的。我们先来看Statement的方法成员。有关java.sql.Statement的文档可以在Oracle找到。

Method 方法

executeQuery

ResultSet executeQuery(String sql)
                       throws SQLException

执行指定的SQL语句并返回一个结果集对象(ResultSet);

参数:

sql – 发送给数据库的sql语句,通常是静态的SQL SELECT语句;

返回:

一个包含查询结果的ResultSet对象,永远非空;

抛出:

SQLException – 如果数据库访问错误则抛出异常,比如说在已结束的Statement中调用这个方法或者SQL语句执行结果不是一个ResultSet。

executeUpdate

int executeUpdate(String sql)
                  throws SQLException

执行指定的SQL语句,比如INSERT,UPDATE或者DELETE语句,或者说是一个不产生结果的SQL语句,比如SQL DDL语句;

参数:

sql – 一组SQL Data Manipulation Language (DML)语句,比如INSERT,UPDATE或者DELETE;再或者说是一个不产生结果的SQL语句,比如SQL DDL语句;

返回:

以下可能:
(1)SQL Data Manipulation Language (DML)语句行数;
(2)如果SQL语句执行结果没有返回值则返回0;

抛出:

SQLException – 如果数据库访问错误则抛出异常,比如说在已结束的Statement中调用这个方法或者SQL语句执行结果产生了一个ResultSet。

close

void close()
           throws SQLException

立即释放Statement对象的数据库和JDBC资源而不是等待其自动关闭。通常来说在工作完成后立即释放资源是一个好的做法以避免耗尽数据库资源。
在一个一杯关闭的Statement对象上调用此方法不会有任何效果。

备注:

当一个Statement被关闭,其当前的结果集如果存在,则也会被关闭;

抛出:

SQLException – 如果数据库访问错误则抛出异常。

Java SQLite 初探

最近开始新的项目,初步规划使用Java,以及SQLite做CS架构的应用。目前用的是SQLite JDBC Driver 3.7.2。

使用的时候,首先引用

import java.sql.*

然后连接到数据库:

java.sql.Connection connection = java.sql.DriverManager.getConnection("jdbc:sqlite:sample.db");

执行SQL语句,准备查询字符串,以及执行查询:

java.sql.Statement statement = connection.createStatement();
statement.executeUpdate("drop table if exists sample");
statement.executeUpdate("create table sample(int_1 integer, str_1 string)");
statement.executeUpdate("insert into sample values(1, 'first')");
statement.executeUpdate("insert into sample values(2, 'second')");
java.sql.ResultSet rs = statement.executeQuery("select * from sample");

从结果集中取出内容:

while(rs.next())
{
    System.out.println("string = " + rs.getString("str_1"));
    System.out.println("integer = " + rs.getInt("int_1"));
}

到此为止上述代码完成了最基础的SQL语句的执行操作,SQLite数据库和java语言环境成功地连接起来了。

然而必须要说的是,这里使用的JDBC Driver尽管实现了上述操作,达到了在java环境中使用SQLite数据库的目标,但是数据库性能真的是令人堪忧。目前我们还没有进一步的需求使用更高性能的数据库,所以依然在使用JDBC Driver,但是如果日后对数据库的要求上来了,我估计在维持java和SQLite两个选项不变的前提下,是很需要把JDBC Driver换成相应的C Wrapper的。

站点迁移完成

今天完成了从旧站点fishinbox到新站点staryland.com的迁移工作。旧的fishinbox.tk站点依然存在,只是不会继续维护了。

新的站点依然使用cloudflare的CDN服务,国内访问速度不是很乐观,但是好在方便省心,激进的优化设置也许会有兼容性问题,不过就目前来看,在本站上运行状况良好。

此次迁移也标志着我正式开始记录日志了,思绪或者经验总是要与人分享的,记录下来宜人宜己。本站内容主要集中在编程(C++,C#,Java,PHP),数据库应用(SQL)等方面上,但日后会更加丰富。

CET大学英语测试无须保护盾查询

前两天写了个php版本的CET成绩查询工具,已经开源到GitHub

https://github.com/fishinbox/CET-Result-Checkout

总体思想是 HTTP_REFER欺骗,目前HTTP_REFER欺骗主要有2种形式,一种是利用本地浏览器插件或者是封包截取工具修改Refer标头,另外一种是通过中转服务器伪造Refer标头来请求信息。

有能力使用本地插件的同学应当不用我多说,把Refer标头修改为:

http://cet.99sushe.com 就可以通过http://cet.99sushe.com/s 页面查询成绩了,post域内容为id,即准考证号,name,即gbk编码的姓名前两个字。

github托管的是99宿舍和学信网两个查询方式,页面很干净,没有广告和其他乱七八糟的东西。

希望测试以下的可以见http://phptest2.sinaapp.com/,不过请大家手下留情,SAE的云豆小弟不多,不要刷爆了。

微软Office Excel开发——打开Excel文档

今天在一个VB交流群上面见到人问怎么打开一个有写保护的Excel文档而不需要用户额外操作。其实这个问题自己查阅MSDN就完全可以解决的,但是最后不得已还是受人以鱼了,整理在此,也算是自己的回顾吧。

本次探讨的背景是微软dotNet框架,主要代码语言是C#/CSharp。编写环境Visual Studio 2010,测试环境Windows 7 64 bit & Office 2010 Pro Plus 64bit。理论上支持的Excel版本最低到Excel 2003,在低的版本就不敢保证了。

所有Excel相关操作使用微软Microsoft.Office.Interop.Excel命名空间,我们这里先做引用:

using Excel = Microsoft.Office.Interop.Excel;

言归正传。

取得与Excel程序的通信

Excel.Application excel = new Excel.Application();
excel.Visible = false;

声明Excel程序实例,并且不显示Excel的界面。

Workbook.Open()方法

打开Excel文档使用下列方法:

String filename="filename"; //文件路径
Excel.Workbook workbook = excel.Workbooks.Open(filename);

其中Workbook.Open的原型是

Workbook Open(
	string Filename,
	Object UpdateLinks,
	Object ReadOnly,
	Object Format,
	Object Password,
	Object WriteResPassword,
	Object IgnoreReadOnlyRecommended,
	Object Origin,
	Object Delimiter,
	Object Editable,
	Object Notify,
	Object Converter,
	Object AddToMru,
	Object Local,
	Object CorruptLoad
)

Filename
类型: System.String
必需字符串,给出所打开工作簿的路径。

UpdateLinks
类型: System.Object
可选对象。 Specifies the way links in the file are updated. If this argument is omitted, the user is prompted to specify how links will be updated. Otherwise, this argument is one of the values listed in the following table.
If Microsoft Excel is opening a file in the WKS, WK1, or WK3 format and the UpdateLinks argument is 2, Microsoft Excel generates charts from the graphs attached to the file. If the argument is 0, no charts are created.

ReadOnly
类型: System.Object
可选对象。设为true则以只读模式打开工作簿。

Format
类型: System.Object
可选对象。 If Microsoft Excel is opening a text file, this argument specifies the delimiter character, as shown in the following table. If this argument is omitted, the current delimiter is used.

Password
类型: System.Object
可选对象。 打开受保护工作簿所需的密码字符串。 如果该参数被忽略而工作簿是受保护的,用户将会被要求提供密码。

WriteResPassword
类型: System.Object
可选对象。 修改写保护工作簿所需的写保护密码字符串。 如果该参数被忽略而工作簿是写保护的,用户将会被要求提供写保护密码。

IgnoreReadOnlyRecommended
类型: System.Object
可选对象。设置为true来避免显示推荐只读模式打开消息。

Origin
类型: System.Object
可选对象。 If the file is a text file, this argument indicates where it originated (so that code pages and Carriage Return/Line Feed (CR/LF) can be mapped correctly). Can be one of the following XlPlatform constants: xlMacintosh, xlWindows, or xlMSDOS. If this argument is omitted, the current operating system is used.

Delimiter
类型: System.Object
可选对象。 如果目标文件是一个文本文件且Format参数设置为6, 则本参数是一个用来确定分隔符的String对象。 只有字符串首位的字符会被用作为分隔符。

Editable
类型: System.Object
可选对象。 If the file is a Microsoft Excel 4.0 add-in, this argument is True to open the add-in so that it’s a visible window. If this argument is False or omitted, the add-in is opened as hidden, and it cannot be unhidden. This option doesn’t apply to add-ins created in Microsoft Excel 5.0 or later. If the file is an Excel template, use True to open the specified template for editing or False to open a new workbook based on the specified template. The default value is False.

Notify
类型: System.Object
可选对象。 If the file cannot be opened in read/write mode, this argument is True to add the file to the file notification list. Microsoft Excel will open the file as read-only, poll the file notification list, and then notify the user when the file becomes available. If this argument is False or omitted, no notification is requested, and any attempts to open an unavailable file will fail.

Converter
类型: System.Object
可选对象。 The index of the first file converter to try when opening the file. The specified file converter is tried first; if this converter doesn’t recognize the file, all other converters are tried. The converter index consists of the row numbers of the converters returned by the FileConverters property.

AddToMru
类型: System.Object
可选对象。 True to add this workbook to the list of recently used files. The default value is False.

Local
类型: System.Object
可选对象。 True saves files against the language of Microsoft Excel (including control panel settings). False (default) saves files against the language of Visual Basic for Applications (VBA) (which is typically U.S. English unless the VBA project where Workbooks.Open is run from is an old internationalized XL5/95 VBA project).

CorruptLoad
类型: System.Object
可选对象。 Can be one of the following constants: xlNormalLoad, xlRepairFile, and xlExtractData. The default behavior if no value is specified is usually normal, but may be safe load or data recovery if Excel has already attempted to open the file. The first attempt is normal. If Excel stops operating while opening the file, the second attempt is safe load. If Excel again stops operating, the next attempt is data recovery.

可选参数的忽略
我们注意到,只有第一个参数filename是必须参数,其他的都是可选参数。 不想明确的可选参数可以使用Type.Missing(C#)或missing(VB)代替。

与Excel交互

我们这里只做最基础的交互演示,详情请查技术文档。

Excel.Worksheet worksheet = workbook.ActiveSheet;
Range range = worksheet.get_Range("A1",Type.Missing);
//get_Range(cell1,cell2)可以接受2个参数,可以是Excel A1 Style的字符串代表目标单元格区域的左上及右下单元格
//range.Value将设置或返回指定区域的值
//range.Value2将设置或返回指定单元格的值
</pre>
<h1>与Excel通信的结束</h1>
我们使用_Application接口下的Quit()方法,必须先调用Quit方法,Excel进程才能被释放:
<pre lang="csharp">
excel.Quit();
excel=null;

示例

我们现在有一个名为test.xlsx的Excel文档,分别有文档保护密码”pswd1″以及文档写保护密码”pswd2″。我们不希望修改Excel文档内容,只需要读取A1单元格的内容并且显示出来,并且不需要用户的额外操作。

    String passwd = "pswd1";
    String WRPasswd = "pswd2";
    Excel.Application excel = new Excel.Application();
    Excel.Workbook workbook = excel.Workbooks.Open(@"E:ShowCaseExcel1test.xlsx", Type.Missing, true, Type.Missing,passwd);
    Excel.Worksheet worksheet = workbook.ActiveSheet;
    String content=worksheet.get_Range("A1", Type.Missing).Value2;
    excel.Quit();
    excel = null;
    MessageBox.Show(content);

MediaWiki File Cache

由于前几日新开的Wiki站服务器压力有点小大,于是琢磨着开启缓存。本来站点使用了CloudFlare的CDN,但可惜命中率低下,服务器压力并不能缓解。于是只能退而求其次,使用文件缓存。当然MediaWiki的文件缓存功能和很多主流php应用一样,都是针对非注册用户的。
MediaWiki由于众所皆知的原因,并没有提供强大地后台管理页面,对Wiki站的配置主要集中在对LocalSettings.php这个文件的修改了。
MediaWiki 对File Cache主要由以下参数控制:

主要选项


$wgUseFileCache = true; /* default: false */
$wgFileCacheDirectory = "$IP/cache";
$wgShowIPinHeader = false;

其中$wgShowIPinHeader = false;选项为必须项,但是自2009年一月27日版本r46374起,该操作由系统自动完成,所以具体还要看你的Wiki版本是多少。
$wgFileCacheDirectory = “$IP/cache”;其中$IP意为指Install Path,即安装路径,是不能够通过LocalSettings.php设置的。$IP/后面接着的字符串即为你所指定的缓存文件夹。一般使用cache或者filecache。
$wgUseFileCache = true;该选项设置是否使用文件缓存功能,默认值是false,即不开启。

可选选项


$wgUseGzip = true;

该选项设置缓存文件为gzip压缩过的,当Client请求AcceptEncoding包含gzip时,即会返回*.html.gz的内容给服务器。
但是注意!在使用该参数之前,请确保您的MediaWiki并没有开启gzip,否则将会返回给用户2次gzip过后的内容,导致浏览器不能正常解析。本站Wiki通过修改index.php以及load.php的代码,为全Wiki站启用了gzip压缩,而第一次设置的时候没有考虑到这一点,还同时启用了$wgUseGzip导致浏览页面一片乱码,最终找到问题,并且此篇文章写成前也在官方Wiki站找到了相关说明:File Cache Compression
必须说,文件缓存还是很管用的,我的Wiki站服务器很差劲,不开缓存基本上需要20s才能完成一次渲染,而开启缓存之后,页面载入时间降到了2-3s,对于纯浏览用户来说,这是个巨大地提高。