最简单图片数字验证码的识别(最初级)

验证码识别用途

1、抓取他人网站(京东的价格信息,点评的用户评论)的数据,干一些不耻的勾当

2、12306.cn,火车票订票刷票也必须用得着。

本文只涉及类似如下的验证码图片, 此类验证码字体和字体颜色不变化,字符的坐标位置也是固定的,虽然背景色会有所变化。

步骤:

1.获取验证码图片

2.灰度化与二值化图片

3.建立特征库(这里使用每个像素二值化后的0,1字符串)

4.切割图片

5.使用特征库来识别图片

以下代码为java+httpclient

1、获取验证码图片(先抓下来100幅图片再说)

             HttpClient client = new HttpClient();
            //公司内网代理设置,只允许浏览器通过
            client.getHostConfiguration().setProxy( "192.168.2.96", 3128);

            List<Header> headers = new ArrayList<Header>();
            headers.add( new Header("User-Agent" ,
                         "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"));
            client.getHostConfiguration().getParams()
                        .setParameter( "http.default-headers", headers);
             for (int i = 0; i < 100; i++) {
                  GetMethod get = new GetMethod(
                               "http://www.****.com/getCheckImage" );
                  client. executeMethod(get);
                  File storeFile = new File("D:\\workspace\\LoadImage\\images\\"
                              + String. valueOf(i) + ".jpg");
                  FileOutputStream output = new FileOutputStream(storeFile);
                   // 得到网络资源的字节数组,并写入文件
                  output.write(get.getResponseBody());
                  output.close();
            }

2、灰度化与二值化图片

彩色图片:有一个一个的像素点组成,每个像素点有RGB三个值代表其颜色

灰度图:每个像素点的R=G=B,三个值相等

彩色图像灰度化有两种方法效果较好:加权平均,平均值
由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。
其中加权平均为 f(i,j)=0.299R(i,j)+ 0.587G(i,j) + 0.114B(i,j)。

该验证码图片为18*45,高度18像素,宽度45像素

读取图片每个像素的RGB值,并使用加权法灰度化

       BufferedImage image = toBufferedImage(new ImageIcon("c:\a.jpg").getImage());
       int height = image.getHeight();
       int width = image.getWidth();
       for (int y=0;y<height;y++) {
           for (int x=0;x<width;x++) {
               Color color = new Color(image.getRGB(x, y));
               //灰度化
               double greyvalue = 0.299*color.getRed()+0.587*color.getGreen()+0.114*color.getBlue();

    // 在缓冲区返回图片的内容
    public static BufferedImage toBufferedImage(Image image) {
       if (image instanceof BufferedImage) {
           return (BufferedImage) image;
       }

       // Determine if the image has transparent pixels; for this method's
       // implementation, see e661 Determining If an Image Has Transparent Pixels
       boolean hasAlpha = hasAlpha(image);

       // Create a buffered image with a format that's compatible with the screen
       BufferedImage bimage = null;
       GraphicsEnvironment ge = GraphicsEnvironment
              . getLocalGraphicsEnvironment();
       try {
           // Determine the type of transparency of the new buffered image
           int transparency = Transparency.OPAQUE;
           if (hasAlpha) {
              transparency = Transparency. BITMASK;
           }

           // Create the buffered image
           GraphicsDevice gs = ge.getDefaultScreenDevice();
           GraphicsConfiguration gc = gs.getDefaultConfiguration();
           bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency);
       } catch (HeadlessException e) {
           // The system does not have a screen
       }

       if (bimage == null) {
           // Create a buffered image using the default color model
           int type = BufferedImage.TYPE_INT_RGB;
           if (hasAlpha) {
              type = BufferedImage. TYPE_INT_ARGB;
           }
           bimage = new BufferedImage(image.getWidth(null), image.getHeight( null), type);
       }

       // Copy image to buffered image
       Graphics g = bimage.createGraphics();

       // Paint the image onto the buffered image
       g.drawImage(image, 0, 0, null);
       g.dispose();

       return bimage;
    }

上面验证码图片灰度化后的部分数据,红色显示的即为图片中是数字”1″,可以发现一些规律,有意义的数字部分,灰度化后的值小于150,而其他部分大于150,所以二值化就非常简单,大于150的像素赋0,而小于的赋值为1.

其中的”1“二值化结果:

若不显示0,则二值化后为

3.建立特征库(这里使用每个像素二值化后的0,1字符串)

因该验证码字体和大小相同,所以图片中四个数字的位置固定不变,获取图片的宽度和高度后,直接从固定的像素开始读取即可。

for (int i=0;i<4;i++){

for(int row=4;row<14;row++){

for(int col=5+i*10;col<12+i*10;col++){

根据0-9十个数字的二值化结果建立特征库如下(每个数字占用10*7像素)。

static int zimo[][]={//10,70,从上往下依次为0,1,2,3,其他略

{0,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,

0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,1,1,0,0},

{0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,

0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0},

{0,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,

0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,0},

};

4.切割图片

略,该步骤对于最简单的此类验证码可忽略。因为数字的位置都固定不变,直接从固定的像素开始读取即可。

5.使用特征库来识别图片

对于新的验证码,获取其数字(7*10)的rgb值,灰度化和二值化后,与特征码进行比较,哪个差异最小,则识别为该数字

            private static int getMatchNum(int[] pix) {
               int result = -1;
               int temp = 100;
               int x;
               for (int k = 0; k <= 9; k++) {
                   x = 0;
                   for (int i = 0; i < 70; i++) {
                       x = x + Math. abs(pix[i] - zimo[k][i]);
                   }
                   if(x == 0){
                       result = k;
                       break;
                   } else if (x < temp){
                       temp = x;
                       result = k;
                   }
               }
               return result;
           } 

至此,识别完成,识别率100%

分类: 技术博览 标签:

java中的匿名内部类

http://www.zeroup.org/java-anonymous-inner-classes.html

简单地说:匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:

  • 只用到类的一个实例。
  • 类在定义后马上用到。
  • 类非常小(SUN推荐是在4行代码以下)
  • 给类命名并不会导致你的代码更容易被理解。

在使用匿名内部类时,要记住以下几个原则:

  • 匿名内部类不能有构造方法。
  • 匿名内部类不能定义任何静态成员、方法和类。
  • 匿名内部类不能是public,protected,private,static。
  • 只能创建匿名内部类的一个实例。
  • 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
  • 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

使用匿名内部类课使代码更加简洁、紧凑,模块化程度更高。
内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到。
匿名内部类的两种实现方式:

  1. 继承一个类,重写其方法;
  2. 实现一个接口(可以是多个),实现其方法。

示例程序:

public class TestAnonymousInterClass{
    public static void main(String args[]){
        TestAnonymousInterClass test=new TestAnonymousInterClass();
        test.show();
    }
    //在这个方法中构造了一个匿名内部类
    private void show(){
        Out anonyInter=new Out(){// 获取匿名内部类实例

            void show(){//重写父类的方法
                System.out.println("this is Anonymous InterClass showing.");
            }
        };
        anonyInter.show();// 调用其方法
    }
} 

// 这是一个已经存在的类,匿名内部类通过重写其方法,将会获得另外的实现
class Out{
    void show(){
        System.out.println("this is Out showing.");
    }
}
分类: 技术博览 标签:

使用链表来实现堆栈

1、第一种方法

public class LinkedStack<T> {
  private static class Node<U> {
    U item;
    Node<U> next;
    Node() { item = null; next = null; }
    Node(U item, Node<U> next) {
      this.item = item;
      this.next = next;
    }
    boolean end() { return item == null && next == null; }
  }
  private Node<T> top = new Node<T>(); // End sentinel
  public void push(T item) {
    top = new Node<T>(item, top);
  }
  public T pop() {
    T result = top.item;
    if(!top.end())
      top = top.next;
    return result;
  }
  public static void main(String[] args) {
    LinkedStack<String> lss = new LinkedStack<String>();
    for(String s : "Phasers on stun!".split(" "))
      lss.push(s);
    String s;
    while((s = lss.pop()) != null)
      System.out.println(s);
  }
} /* Output:
stun!
on
Phasers
*///:~

1)LinkedStack和Node泛型分别是T和V
2)Node有两个构造函数,注意构造函数的Node和代表对象类型的Node的区别,两者是否都需要
3)top对象属于LinkedStack
4)Node的end函数,来判断是否堆栈为空

2、另一种方法

public class Stack {
private LinkedList storage = new LinkedList();
public void push(T v) { storage.addFirst(v); }
public T peek() { return storage.getFirst(); }
public T pop() { return storage.removeFirst(); }
public boolean empty() { return storage.isEmpty(); }
public String toString() { return storage.toString(); }
} ///:~
分类: 技术博览 标签:

Junit

junit4
http://www.ibm.com/developerworks/cn/java/j-lo-junit4/
junit3
http://blog.csdn.net/ai92/article/details/302844

同一人所写,简洁清晰。

JUnit – Tutorial
http://www.vogella.de/articles/JUnit/article.html

1、测试代码与实际代码最好分开(eclipse中项目属性,添加source folders)

2、对于返回值为自己设计的类的对象的方法,assertEquals,必须重载类的equal和hashcode方法,可以eclipse自动生成。

3、eclipse,file-new-other-junit-junit test suite创建测试套件

分类: 技术博览 标签:

matches() and lookingAt()

The matches method attempts to match the entire input sequence against the pattern.
The lookingAt method attempts to match the input sequence, starting at the beginning, against the pattern.
The find method scans the input sequence looking for the next subsequence that matches the pattern.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MatchesLooking {

  private static final String REGEX = "foo";
  private static final String INPUT = "fooooooooooooooooo";
  private static Pattern pattern;
  private static Matcher matcher;

  public static void main(String[] args) {

    // Initialize
    pattern = Pattern.compile(REGEX);
    matcher = pattern.matcher(INPUT);

    System.out.println("Current REGEX is: " + REGEX);
    System.out.println("Current INPUT is: " + INPUT);

    System.out.println("lookingAt(): " + matcher.lookingAt());
    System.out.println("matches(): " + matcher.matches());

  }
}
分类: 技术博览 标签:

面试题(java开发,测试开发)

12.5
中软通用
1、安装、卸载、升级测试用例
2、500用户并发,设计测试方案
3、测试计划的内容
4、普通家用电话界面 功能 性能 可用性,易操作性测试用例
5、天黑四个人过桥,只有一个电筒,现规定:一次最新多两人过,必须有电筒,且电筒不能用扔的方式传递,两天人同行,以慢的为准,A要1分钟,B要2,C要5,D要10,问四人能否在17分钟内过去【A和B先过去用时2分钟,再由A送回电灯1分钟,让C和D过用十分钟,然后电灯交给B去接A,来回4分钟,加起来整好17分钟。】

12.6中软-微软
1、string和stringbuilder的区别
2、gac
3、垃圾回收机制
4、值类型和引用类型(string与枚举分别是)
5、c#中的三元运算符
6、委托与java中的反射
7、internal与protected
8、比冒泡排序好的排序方法
9、一栋楼,两个瓶子,检测临界楼层,瓶子摔碎。
10、一个数组【100】随机插入1-100,且不重复,插入的位置也随机,注意性能【另外一个100的数组】
11、俩字符串a和b,b中不重复,要求a按照b中字母的顺序排序
12、二叉树的中序遍历(数组存储方式)

12.6博研科技-电话
1、构造函数前初始化(类中的static)
2、chmod ug+w,o-w file1.txt file2.txt(a,u,g,o)
3、查找以×开头的文件:ls -a | grep la* ,find /etc -name “la*”
4、冒泡排序
5、设计模式

12.7 微创 微软sdet
1、string和stringbuilder
2、protect internal以及默认(类,属性)
3、引用参数(应该是ref参数),out参数,区别
ref参数传递的是地址,而out参数是返回值。
ref参数传递前必须初始化,而out不需要
4、delegate,以及举个例子
.Net 中的委托类似于 C 或 C++ 中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与 C 或 C++ 中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。
using System;
public class SamplesDelegate {

// Declares a delegate for a method that takes in an int and returns a String.
public delegate String myMethodDelegate( int myInt );

// Defines some methods to which the delegate can point.
public class mySampleClass {

// Defines an instance method.
public String myStringMethod ( int myInt ) {
if ( myInt > 0 )
}
}

public static void Main() {
mySampleClass mySC = new mySampleClass();
myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
Console.WriteLine( “{0} is {1}; use the sign \”{2}\”.”, 5, myD1( 5 ), myD2( 5 ) );
}
}

5、atm机的测试用例。
6、单链表的反响
7、二叉树的深度
8、解密(最后一个字母提到最前面,其他+3)
9、两个链表的相交问题(相交的链表是y字形的,判断最后一个节点是否相同即可。)

中自控
1、String a = new String(“士大夫是否”)创建了几个对象。
2、ioc,ioc实际作用
3、mvc与三层结构,区别
4、hibernate工作流程
5、面向对象的特性
6、overload和override的区别。overloaded的方法,可以更改返回值吗?可以。

12.8 周四
文思创新
1、字符串的倒序

[/c]

ToCharArray();Array.Reverse(c); string v = new String(c);
for (int i = this.textBox1.Text.Length – 1; i > -1; i–) { str1 = str1 + this.textBox1.Text[i];

[/java]

ToCharArray
subString();递归;
stringBuilder.reverse()
2、装箱与拆箱【类型转换时,值类型与object类型】
3、托管的概念
托管代码不允许进行对内存的操作,而是由固定的垃圾回收机制完成。
托管代码 (managed code) 由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
Unmanaged Code – 非托管代码 在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。例如COM/COM++组件,ActiveX控件,API函数,指针运算,自制的资源文件…这些的非托管的,其它就是托管的。
4、查看一个字符串中出现次数最多的字符-
5、垃圾回收(然后压缩调整内存空间)

—————
1、static与const,一个是常量,一个是静态,类似与全局变量。
淘宝电话
1、如何转测试
2、职业规划
3、AbstractPostProcessor : XmlWriter
xslt.Transform(source, parameters, writer, zipResolver);
import javax.xml.stream.XMLStreamReader;stax
import org.xml.sax.helpers.DefaultHandler;

12.9周五

H3C:考c语言和网络
1、sizeof long int char
2、进程的优先级不可改变(判断)
3、p为长整型0×12345678,求*(p+2)
4\vlan的好处
一个VLAN内部的广播和单播流量都不会转发到其他VLAN中,从而有助于控制流量、减少设备投资、简化网络管理、提高网络的安全性。
5、宏 z=z×(N+Y(5+1))
6、a\nb的字节数,
7、ip与mac对应的协议:arp
8、自动配置主机网段:dhcp
9、指针

未知:
10、java调用dll的方法:很复杂,JNI, Jawin, Jacob
11、java到底是传值还传引用

http://sunway.iteye.com/blog/202512

另外string很特殊,http://www.ibm.com/developerworks/cn/java/l-jpointer/index.html#icomments
12、awk,sed,grep
wk是一种编程语言,用于在linux/unix下对文本和数据进行处理。
sed是一种在线编辑器,它一次处理一行内容。
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

12.12
浪潮
1、软件测试的目的
2\软件测试的分类以及区别
3、.net2.0的新特性(反省 ArrayList),现在都4.0
4\asp.net页面间传值的方法
5\委托,别与托管
6、比你年龄小的当你的leader
7、分给任务,若三天完成。【确认问题,若无法完成及时说明,总结】

微创er面
1、代码的可测性(循环分支太多,参数太多,不可测)
2、一堆checkbox,如何测试用例
3、测试框架的
4、两机器人,move movw chkr,chkp,goto,backto
5、测试平台的框架

12.13周二
文思微软二面
1、crm的英文文档翻译
2、约会,写方法,是否冲突
class appoint
{Date startDate;//年月日时间
Date endDate;}
bool fConflict(appoint a,appoint b)
{
a.startDate.compareTo(b.startDate)
}
3\两个栈实现队列的功能
真正性能较高的,其实是另一个变种。即:
入队时,将元素压入s1。
出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
这个思路,避免了反复“倒”栈,仅在需要时才“倒”一次。但在实际面试中很少有人说出,可能是时间较少的缘故吧。
4、加班的看法
5、sql语句
SELECT TOP number|percent column_name(s)
FROM table_name【sqlserver】
SELECT column_name(s)
FROM table_name
LIMIT number【mysql】
SELECT *
FROM Persons
WHERE ROWNUM <= 5【oracle】
6、sql优化的方面
LIKE '%parm1%'导致索引不可用。可以前台后台修改,如输入框改为下拉框
避免索引字段:计算,<> not !=, is null is not null, 数据类型转换,使用函数,使用空值
采用临时表
避免in not in可以使用exist
避免引起排序的DISTINCT,UNION,MINUS,INTERSECT,ORDER BY

百度
1、android手机:哪些应用,折腾过啥,是否有订阅rss等。
2、一天有多少纳秒
long i = 24*60*60*1000*1000l;//若不加l最后,则输出500654080
System.out.println(i);
这是缄默溢出,运算过程中产生的一切中间结果都要保存在int类型的空间中。运算结束后再把运算结果转换成long类型并赋值给变量micro_seconds_per_day。
3\奇数
// 中规中矩的程序员
public static bool IsOdd(int n)
{
return (n % 2 == 1) ? true : false;
}
// 有经验的C#程序员
public static bool IsOdd(int n)
{
return Convert.ToBoolean(n % 2);
}
4、转换十进制到3,4,5,。。。,16进制
取余倒转的方法。
5、短信模块测试用例
4.测试题目:洗衣机
功能测试:该洗衣机是否能正常的洗衣服
需求测试:查看洗衣机的使用说明书和安全说明书等
性能测试:使用时用电量如何,是否满足用户需求
界面测试:洗衣机的外观是否满足客户的需求
易用测试: 该洗衣机是否容易操作
兼用性测试:该洗衣机除了能洗衣服以外还能洗别的吗
安全性测试:该洗衣机通电以后人接触以后是否有电
负载测试:通过逐步增加系统负载,最终确定在什么负载条件下系统性能将处于崩溃状态,以此获得系统能提供的最大服务
压力测试:通过逐步增加系统负载,最终确定在什么负载条件下系统性能将处于崩溃状态,以此获得系统能提供的最大服务级别的测试。
稳定性测试:加到一定的衣服然后过一段时间看洗衣机是否正常洗
6、性能测试:数据有效性,以及性能问题百分比。

12.14
文思三面
1、项目中最成功的,遇到的困难,如何解决的。(无法重现的文档打开崩溃,以及)
2、笔筒
3、软件系统的自动部署。autoit,可能不稳定,如何说服其他人用
4、bug,有两部分,但只改了一部分,开发说已经改完,但你跟他争论说还有一半。
5、将来的职业规划
6、可以问:职位的技术要求:c#,mssqlserver,asp.net,active directory

全时
1、java 浮点数 不精确。
《Effective Java》这本书提了一个原则,float和double只能用来做科学计算或者是工程计算,在商业精准计算中要用BigDecimal,long或者int
BigDecimal bd = new BigDecimal(“10.123″);

sql优化
1、使用索引。有大量重复值、且经常有范围查询(between, > ,< ,> =,< =)和order by、group by发生的列,可考虑建立群集索引;
2、任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。
3、EXISTS要远比IN的效率高。里面关系到full table scan和range scan。几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。
4、使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。
5、
其实SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。
2、

12.17 某电话面试
1、uno
2、百合和黑盒的区别优缺点。
黑盒:
3、loadrunner的参数化,关联和集合点

易宝支付
1、百合与黑盒测试的区别
2、正交试验法,使用场景。
多因素多水平实验,正交试验设计的基本特点是:用部分试验来代替全面试验,通过对部分试验结果的分析,了解全面试验的情况。正交表已有数学工作者制定出来。
3、数据库中,游标,作用。
就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
4、bug和用例管理工具,描述其中一个工作流程
5、自动化测试与测试自动化
自动化测试:应该是从测试的初期就开始规划整个测试的过程
而测试自动化:仅仅是把手工的测试用例转为自动化来实现。
6、Selenium, WebDriver, Eggplant 几个自动化测试工具
7、列出你熟悉的自动化工具,并说明其实现原理。
百合与黑河,单元测试工具,功能测试工具,负载测试工具,性能测试工具,web测试工具,数据库测试工具。
7、自动化测试的使用场景
1)回归测试2)性能与压力测试3)涉及到数据一致性,事务处理,死锁,竞争4)软件需求变动不频繁,项目周期长(最好是产品型项目)
8、什么是关键字驱动
qtp中object repository。编写脚本时,item,operation,value。其实vcl testtool也是关键字驱动的。
9、高质量的自动化测试脚本应该具备哪些特性
可维护性,模块化,健壮性,复用性
10\selenium grid的作用
一种自动化的测试辅助工具,Grid通过利用现有的计算机基础设施,能加快Web-app的功能测试。利用Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试事例。【一台机器同时控制多台电脑,同时运行用例】
11、==与equals的区别,比较的是对象的地址和对象的内容,值类型存放在堆栈中,而引用类型,在栈中仅存放地址。
12.final,finally,finalize
final不仅修饰类,还可修饰变量和方法。
13、tomcat中server.xml中的enableLookups=‘false’ redirectPort='8443'
enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
14.java中wait与sleep
15、ssh,每个框架扮演的角色
16、linux,怎么查看和关闭名为jira的进行
17、linux如何安装jdk,msysql
18、hashmap与hashtable的区别
19、singleton
20、用户登录功能,需要不同的用户不同的权限,设计开发思路,可以使用为代码。

12.19周一用友
1、一个逻辑学家误入某部落,被囚于牢狱,族长意欲放行,就对逻辑学家说:"今有两门,分别由两战士把手,一为自由,一为死亡,你可任意开一门。现从两战士中选一人负责解答你所提任何一个问题,其中一人天性诚实,另一人说谎成性,今后生死任你选择。"逻辑学家沉思片刻,即刻向一个战士发问,然后从容离去。你认为逻辑学家是如何发问的?
2、例1一个牧场长满青草,牛在吃草而草又在不断生长,已知牛27头,6天把草吃尽,同样一片牧场,牛23头,9天把草吃尽。如果有牛21头,几天能把草吃尽?
3、希尔排序
4、单件的作用,以及类图
5、二叉树 左右节点的值相等的节点个数
6、数据库sql
id code name date1 aaa
1 101 财务部 2011 创建
2 10101 财务部1 2012 创建
3 101 财务部(集团) 2013 变更
所有最新的数据内容/存在子部门的且变更过名字的数据
7、synchronized,另一个进程
8、

12.20周二
华为赛门铁克
1、mysql auto increment
2、

新浪微博
1、单件(懒模式)
public class singleTon
{
private static singleTon uniqueInstance=null;
private singleTon(){readConfig();}
public readConfig()
{
//读取配置文件
}
public static syncronized singleTon getInstance()
{
if(uniqueInstance==null)uniqueInstance=new singleTon();
return uniqueInstance;
}
}
2、选perl、shell、pytho或你熟悉的一种脚本语言实现:
文件words存放英文单词,格式为每行一个英文单词(单词可以重复),统计这个文件中出现次数最多的前10个单词
3、对格式如下的文本数据进行排序,”:” 为分隔符,以第3列的数字降序排列【10分】
Mike Harrington:(510) 548-1278:250:100:175
Christian Dobbins:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50
Archie McNichol:(206) 548-1348:250:100:175
Jody Savage:(206) 548-1278:15:188:150
Guy Quigley:(916) 343-6410:250:100:175

4、设计对一个自动饮料售货机软件进行黑盒测试。该软件的规格说明如下:
“有一个处理单价为1元5角钱的盒装饮料的自动售货机软件。若投入1元5角硬币,按下“可乐”、“雪碧”或“红茶”按钮,
相应的饮料就送出来。若投入的是2元硬币,在送出饮料的同时退还5角硬币,投入硬币少于1元5角时,直接退还硬币。”
请用你所知道的方法设计该软件的测试用例。【15分】

5、请对office 软件中 word 的 文件保存功能进行测试。(尽可能多的、有调理的写出自己的测试点和测试用例,越多越好哦)【10分】

6、请看如下程序
#include
int main()
{
printf(“hello, world!”);
return 1;
}
要求:上述c程序test.c通过gcc test.c产出a.out, 然后我们执行./a.out, 打印出”hello, world”。
请根据你的理解,描述 从你敲入./a.out,到console下输出”hello, world”,操作系统做了一些什么事情,越详细越好。

7、请分别描述,如何用黑盒测试和白盒测试的思路来测试一个电梯调度软件(这是一部单部电梯的软件)

8、实现下面函数
函数原型:extern char *strncat(char *dest,char *src,int n)
参数说明:src为源字符串,dest为目的字符串,n为指定的src中的前n个字符。
所在库名:#include
函数功能:把src所指字符串的前n个字符添加到dest结尾处,覆盖dest结尾处的’/0′,实现字符串连接。
返回说明:返回指针,连接后的字符串。

2、php和java
读取一个文本中的类名,然后实例化一个对象。
class.forName(“sdfsdf”).newInstance();

3、两个有序序列,个数都为n,找到连个序列第n大的数
最简单的是n复杂度,若要实现logn的复杂度,可用二分查找
为啥二分查找是logn,因为可看成一颗有序树来代表二分查找,每次比较复杂度为1,n个节点的有序树高度为logn

4、php的魔法函数。

阿里云
1、java Map 遍历速度最优解

第一种:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
效率高,以后一定要使用此种方式!
第二种:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}
效率低,以后尽量少使用!
HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的

1\vi的三种模式
一般,指令,编辑模式
一般模式下,按下,i,a,o(插入),r(替换)进行编辑模式,
按esc,返回一般模式,一般模式下,可以移动光标,删除字符,删除整列,复制与粘贴整列
而:,?,/则进入命令行模式。
通过/word ?word来向后和向前查找字符。

2、一个文本,里面有很多数据,每一行都分为4列,且第三列都为数字,请用shell,来求第三列的和。(linux shell)
#cat filename.txt:
www|200|date1
Medie|400|date2
DV|800|date3
awk -F”|” ‘{(total+=$2)};END{print total}’ filename.txt
awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化

文本文件中的信息。

3、linux sort
将文本文件内容加以排序。
$cat example
vegetable soup
fresh vegetables
fresh fruit
lowfat milk
$Sort +1-2 example

4\byte与char的区别
char 是否能存储一个中文字符,为什么?
char类型一般占用两个字节,所以能存储中文字符(一个中文字符占用两个字节)。
char a = ‘中’ ;(合法) char a = ‘ab’ ;(非法的)
所以char类型在内存中占用两个字节空间,但是只能表示一个字符。若是只要表示一个字节的字符,可以考虑byte。
byte表示字节,占用内存一个字节的空间。
byte a = ‘a’ ;(合法) byte a = ‘中’ ;(非法的,不能存放中文字符)
另外:1 byte = 8 bit (bit就是0和1的一个位数,8bit表示一个字节)
String str = “中” ;
byte[] a = str.getBytes();
System.out.println(a.length); //打印出多长?
result:可能2,3,4.
原因是getBytes()方法会根据当前默认的字符编码格式获取字节数组,gbk/gb2312占2位,utf-8占3位,unicode占4位(很多地方看见别人说是占两位,但是亲测出来的结果是4,求解!)
可以str.getBytes(“GBK”),str.getBytes(“UTF-8″)使用,指定了编码格式,就不根据默认的取得了。

易宝支付
A测试基础
1、白盒测试与黑盒测试的区别是什么
2、什么是正交试验法,使用场景是什么
3、数据库,游标是什么,其作用
4、简述常用的bug管理或用例管理工具,并且描述其中一个工作流程
5、一个屋子有一个门(门是关闭的)和3盏电灯。屋外有3个开关,分别与这3盏灯相连。你可以随意操纵这些开关,可一旦你将门打开,就不能变换开关了。确定每个开关具体管哪盏灯。

B自动化测试
1、自动化测试与测试自动化的区别
2、列举出你熟悉的自动化工具,并说明其实现原理
3、自动化测试使用的场景
4、什么是关键字驱动
5、高质量的自动化脚本应该具备哪些特性
6、简述selenium grid的作用
7、简要说明下面api的使用方法
fireEvent
void fireEvent(java.lang.String locator, java.lang.String eventName)
Explicitly simulate an event, to trigger the corresponding “onevent” handler
Parameters:
locator – an element locator
eventName – the event name, e.g. “focus” or “blur”
此Api的功能说明:

C开发能力
1、描述==与equals的区别
2、final,finally,finalize的区别
3、说明tomcat的sever.xml中下列参数的作用:
enableLookups=”false” redirectPort=”8443″
4、java中sleep与wait的区别
5、ssh是什么,每个框架扮演的角色是什么
6、linux下如何查看和关闭名为jira的进程
7、linux下如何安装jdk,mysql,请写出相关命令
8、hashmap和hashtable的区别
9、写一个singleton模式
10、现在需要实现一个用户登录功能,需用不用的用户有不同的权限,请设计开发思路,可以使用伪代码

华为(c和java两套题任选)
40个选择题,两个编程题
接口指针,线程,protected,实时操作系统,wait notify,临界资源,死锁,tcp udp

分类: 寻找面包, 技术博览 标签:

shusheng

1、立项申请、需求分析、概要设计

立项申请:参与人员,立项的背景起因和意义,预期达到的目的,研发本软件的基本思路和关键点,技术可行性分析,市场可行性分析,开发进度,投入资金,验收标准,潜在的风险。

需求分析:提取出核心、主要、急迫的业务,明晰业务流程 。

综合要求(功能,性能,运行,升级),数据要求(输入,输出,存储,安全,备份,主要算法),界面要求(功能模块,颜色,按钮,字体),软件描述(用户角度)

概要设计:将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。将需求分析转换为软件结构和数据结构。 概要设计就是设计软件的结构,包括组成模块,模块的层次结构,模块的调用关系,每个模块的功能等等。同时,还要设计该项目的应用系统的总体数据结构和数据库结构,即应用系统要存储什么数据,这些数据是什么样的结构,它们之间有什么关系。

2、挑战,怎么解决。

google,stackoverflow

3、开发模型

边做边改模型,瀑布模型,快速原型模型,增量模型。

4、好的软件发展方向

5、对原来公司的好与坏的评价

分类: 寻找面包 标签:

意外吗?

不。该来的最终都要来到。
新的开始。

分类: 心情故事 标签:

Jobs

Jobs死了,”Remembering that I’ll be dead soon is the most important tool I’ve ever encountered to help me make the big choices in life. “,实在是不敢苟同,真正将要die的人,更多的是消极,绝望,看不到未来。无论多重要的选择,都已经没有任何的意义。

I am dying too. It is not a joke, I am serious.

分类: 心情故事 标签:

昏睡

每到下午昏昏欲睡。今天发现一解睡大法:Chun Tian (binghe)
生命真的可以过得更精彩一些。

分类: 心情故事 标签: