黑马程序员面试技巧(11篇)
1.黑马程序员面试技巧 篇一
关于动画
1.谈谈你对Core Graphic 绘图的了解? CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。
视图可以通过子视图、图层或实现drawRect:方法来表现内容,如果说实现了drawRect:方法,那么最好就不要混用其他方法了,如图层和子视图。自定义绘图大部分是由UIKit或者Core Graphics来实现的。
2D绘图一般可以拆分成以下几个操作: 线条 , 路径 , 文本 , 图片 , 渐变 由于像素是依赖于目标的,所以2D绘图并不能操作单独的像素,我们可以从上下文(Context)读取它。
绘图就好比在画布上拿着画笔机械的进行画画,通过制定不同的参数来进行不同的绘制。
http:///articles/jIJzMf
http://blog.csdn.net/mangosnow/article/details/37054765
2.Core Animation(核心动画)? CoreAnimation也就是核心动画, 是一组非常强大的动画处理API, 可以使用少量的代码做出绚丽的效果, 是直接作用在CALayer上的, 并非UIView, 并且Core Animation的动画执行过程都是在后台操作, 不会阻塞主线程.所有动画都是作用在CALayer上的, 当把动画添加到Layer上, 是不直接修改它的属性, Core Animation维护了两个平行layer的层次结构, 模型层树可以看到Layer的状态, 表示层树则是动画正在表现的值的近似.Core Animation的使用步骤: 1> 使用它需要先添加QuartzCore.framework框架和引入主头文件
3>.通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了
4>.通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画
1.转场动画? CATransition-转场动画, 作为CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点.UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果.如下是转场动画的过渡效果:
使用UIView的动画函数, 实现转场动画 1> 单视图:
+(void)transitionWithView:(UIView*)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options
animations:(void(^)(void))animations completion:(void(^)(BOOL finished))completion;参数说明:
duration:动画的持续时间 view:需要进行转场动画的视图 options:转场动画的类型
animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block 2> 双视图: +(void)transitionFromView:(UIView*)fromView toView:(UIView*)toView
duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options finished))completion;参数说明:
duration:动画的持续时间 options:转场动画的类型
animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block
completion:(void
(^)(BOOL 2.一个动画怎么实现? 以转场动画为例: 1> 创建CATransition对象
CATransition *animation = [CATransition animation];2> 设置运动时间(即动画时间)animation.duration = DURATION;3> 设置运动type(类型)
animation.type = type;if(subtype!= nil){ 4> 设置子类(和type配合使用, 指定运动的方向)animation.subtype = subtype;} 5> 设置运动速度(动画的运动轨迹,用于变化起点和终点之间的插值计算,形象点说它决定了动画运行的节奏,比如是均匀变化(相同时间变化量相同)还是先快后慢,先慢后快还是先慢再快再慢)animation.timingFunction = UIViewAnimationOptionCurveEaseInOut;
6> 将动画添加到view的Layer层
[view.layer addAnimation:animation forKey:@“animation”];动画类型如下: typedef enum : NSUInteger { Fade = 1, //淡入淡出 Push, //推挤 Reveal, //揭开 MoveIn, //覆盖 Cube, //立方体 SuckEffect, //吮吸 OglFlip, //翻转 RippleEffect, //波纹
PageCurl, //翻页 PageUnCurl, //反翻页 CameraIrisHollowOpen, //开镜头 CameraIrisHollowClose, //关镜头 CurlDown, //下翻页 CurlUp, //上翻页 FlipFromLeft, //左翻转 FlipFromRight, //右翻转 } AnimationType;3.CADisplayLink CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟执行大约60次左右
CADisplayLink是一个计时器,可以使绘图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间 使用方法:
定义CADisplayLink并制定触发调用方法 将显示链接添加到主运行循环队列
2.黑马程序员面试技巧 篇二
一、掌握数控编程相关知识,并能灵活运用
数控程序编制的关键技术是正确、灵活运用数控加工工艺和工艺装备知识,处理好零件的工艺流程,正确灵活运用数控系统的功能指令,编制出实用优化的加工程序。
(一)正确灵活设计出数控加工工艺流程
利用数控机床进行零件加工,实际就是编程者将该零件的全部工艺过程及工艺参数以程序的形式告知数控机床。而后数控系统读取加工程序,数控机床执行程序,自动完成零件加工。所以数控机床加工程序编制的重中之重就是运用工艺知识拟定加工方案,确定工艺流程及走刀路线,确定刀具,合理选择切削用量参数。
(二)合理运用相关知识设计工艺装备
机械制造中,定义工艺装备包含:量具、卡具、刀具及其他辅助工具等。数控程序只是确定了加工工艺方案,如果要实现加工方案,还需要合理选择刀具,正确运用量具,灵活使用卡具等。尽量选择标准化的刀具(机加式刀具),优先选用通用化的量具及卡具。在选用刀具、卡具时,还应考虑其与工件的干涉问题。为保证加工质量还要选择合适的切削液。
二、合理优化加工程序
对于初学数控加工者,一般要求其能够编制出可以加工符合图纸要求的工件的程序,即为合格。而更高的标准则要求在能够正确加工出合格工件的前提下,使数控机床加工程序进一步优化,尽量精简加工程序,注重加工效率。主要方法如下:
(一)采用混合坐标编程方式
对于编程者而言,确定零件关键点的坐标是至关重要的。而坐标形式分为:绝对坐标与增量坐标(相对坐标)。坐标以某一固定点为原点,这就是绝对坐标;坐标以上一点的终点为原点,这就是增量坐标。在编程中编程者往往视实际情况混合使用。例如,加工轴类零件,其X向坐标全部采用绝对坐标,而Z向坐标除最后一点外采用绝对坐标,其余采用增量坐标为宜。无需计算,提高编程效率及准确性。
(二)灵活运用循环指令编程
在实际加工中,生产效率是第一位的,大部分编程者为提高效率都优先采用复合循环指令编程,如果可以灵活运用复合循环指令进行程序编制,将大大优化零件加工程序,提高加工效率。例如,加工某轴类零件,可以使用复合循环指令G71(外圆粗车循环指令)编程,如果该零件径向尺寸非单调递增(属于G71指令的第二种类型,但经济型数控机床一般不支持)则凹凸起伏部分需在G71循环指令外单独编程加工。但这种方法程序繁琐,增加了编程者的工作量。如果选择G73固定形状切削循环指令编程可以直接利用该循环加工出零件,但会有相当一部分刀具路径是空走刀,严重降低加工效率。我们可以将G71与G73综合使用,G71加工大部分单调递增的外形轮廓,用G73加工其余凹凸部分。这样既简化了程序,又提高了效率。
摘要:介绍了数控机床程序的编制方法,从编程相关知识入手,重点剖析了工艺流程和工艺装备对数控加工程序编制的影响。通过举例,讲解了数控程序优化常用的两种方法:第一是利用绝对坐标和增量坐标进行优化,阐述了两种坐标的使用方法和选用技巧,从而达到优化程序的目的,第二是灵活运用循环指令优化数控程序,讲解了如何针对不同零件的外形轮廓,合理选择复合循环指令及循环指令之间的配合使用等技巧。
关键词:数控加工技术,数控编程,数控程序优化
参考文献
[1]韩鸿鸾.数控编程[M].北京:中国劳动社会保障出版社,2004.
[2]顾京.数控车床加工程序的编制[M].北京:机械工业出版社,1999.
3.单片机汇编程序编写技巧 篇三
【关键词】单片机;汇编程序;编程技巧
Programming skills of MCU assembly program
【Abstract】In the MCU programing in assembly language,programming methods or selection of different instructions,may cause the program to achieve the same functionality,the implementation of the length of time and program size is not the same Occupy less memory space,short execution time is the basic principle of programming.This article from the two evaluation criteria to start,briefly assembler tips to optimize the time and space,the aim is to improve the efficiency of the implementation of the program,or reach a certain limit,the requirements to better meet the application requirements.
【Key words】MCU;Assembly program;Programming skills
0.引言
單片机应用系统由硬件和软件组成。软件是系统监控程序的总称,也就是各种指令依某种规律组合而形成的程序,单片机应用系统的软件设计是系统设计中最基本而且工作量较大的任务。迄今为止,单片机的程序设计语言主要采用汇编语言和高级语言。汇编语言是面向机器的语言,常称为低级语言,但比机器语言直观, 便于理解和记忆,适合编写短小、高效、实时控制的程序。在单片机应用系统中经常用汇编语言编写程序,在用汇编语言编写一个单片机应用系统的程序时,往往选择的程序结构、选用的汇编指令以及占用的存储空间都不相同,这就导致实现同一个功能的汇编程序不唯一。一个好的汇编程序应该执行时间短,占用系统的存储空间少,这就是评价汇编程序的时间和空间标准。
1.程序的时间和空间
先看个例子,用汇编程序将单片机数据存储器30H开始的16个单元中的数据依次循环左移8位,有三种实现方法:
方法一
MOV A,30H
MOV R1,#10H
MOV R0,#3FH
JH:XCH A,@R0
DEC RO
DJNZ R1,JH
方法二
MOV A,30H
MOV 30H,31H
MOV 31H,32H
......
MOV 3EH,3FH
MOV 3FH,A
方法三
MOV A,30H
XCH A,3FH
XCH A,3EH
......
XCH A,31H
XCH A,30H
上例中,三段汇编程序实现的功能相同,但占用的时间和空间却不相同,程序运行的时间分别为67个周期,32个周期和17个周期;程序占用的空间分别是10个字节、52个字节和34个字节。其中方法三和方法二相比较,不仅速度提高了将近1倍,而且减少了一半的存储空间。可见,不同的程序编写方法, 程序的时间和空间不相同。
2.时间和空间的优化
从上述分析得知,同一个功能的汇编程序有多种实现方法,在编写程序时,应该考虑系统对时间和空间的要求,对一般控制系统来说,主要考虑空间,保证程序能装下,而对于实时控制系统来说,主要希望程序执行的时间越短越好。正是由于不同的系统对时间和空间的要求不尽相同,所以在程序编写过程中,就要对汇编程序进行时间和空间的优化,来满足单片机应用系统的要求。下面笔者就浅谈在时间和空间优化上的一些小技巧。
2.1时间的优化
程序在时间上的优化最基本的就是用周期更短的指令代替原来的指令,例如当遇到乘除运算时,尽可能地用移位来实现;其次,寄存器寻址的指令具有指令周期数少的特点,所以尽量采用寄存器寻址,可以优化程序的执行时间。另外对于有很大存储空间的单片机应用系统, 还可以采用“空间换时间”的方法,即充分利用那部分闲置的存储空间,来编写执行时间短的程序,例如可以将循环程序分成几个单独的程序段执行,将带参数的子程序改成可以直接调用的子程序,省去对参数进行赋值上的时间等。上例中的方法三就采用的这种方法。
2.2空间的优化
程序在空间上的优化最基本的就是采用循环结构和子程序,使程序的长度大幅减少,占用内存空间减少,从而简化程序的逻辑结构,提高了空间效率。其次就是存储空间的复用,一般来说,一个存储空间只作一个用途, 但是在可利用资源非常有限的情况下,可以适当的实现存储空间的复用。另外在单片机应用系统对时间要求不高的情况下,可以使用“ 时间换空间” 的策略来压缩程序大小,即使用执行时间长但占用存储空间少的程序或程序段。例如, 将功能相同或相近的几个主程序段合并为一个子程序, 将几个相近的子程序合并成一个子程序等等。上例中方法一使用的就是这个策略。
3.结论
除以上的方法外, 一些小技巧的使用也可以优化程序。例如一些指令的配合经常可以做成模块使用, 多编制和收集一些模块化的子程序不仅有助于程序的编制, 也有利于提高所编制程序的可读性。
总之, 用汇编语言编写单片机程序不仅要能用, 而且要实用, 占用芯片内存少、执行时间短是编程的基本原则, 程序的逻辑性和可读性也是程序优劣的一项重要指标。
【参考文献】
[1]张友德等.单片微型机原理应用与实验[M].上海:复旦大学出版社.2003:618-619.
[2]谢敏.单片机应用技术 [M].北京:机械工业出版社.2010:61-62.
4.黑马程序员视频总结 篇四
类是对现实生活的描述。对象是一类事物实实在在存在的个体。
堆内存和栈内存:基本类型的变量和对象的引用存储在栈内存;用new创建的对象和数组存储在堆内存。
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方法。原则:将不需要对外提供的内容都隐藏起来,将属性都隐藏,提供公共方法对其访问。好处:提高安全性,便于使用,提高重用性。
什么时候使用静态?成员变量:当对象中有共享数据时。成员函数:函数内部没有访问到非静态数据(对象的特有数据)。
帮助文档制作:/***/@author作者;@version 版本;@param 参数;@return 返回结果 命令:javadoc-d 文件夹-author-version xxx.java。将生成一系列网页。
静态代码块:static{}。用于给类进行初始化,只执行一次,优先于主函数。
Person p=new Person():
1、找到Person.class加载到内存。
2、执行static代码块。
3、在栈内存中开辟main()方法空间,并分配一个 变量p。
4、在堆内存中开辟实体空间。
5、进行属性的空间分配,并进行默认初始化。
6、对空间属性进行显示初始化。
7、实体的构造代码初始化。
8、调用对应的构造函数,进行构造函数初始化。
9、将实体空间首地址赋给p。单例:
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single();//静态方法要访问它,所以也要静态化。静态方法不能访问非静态的方法和属性。创建私有并静态的本类对象。
public static Single getInstance(){ //无法通过对象调用,只能是静态。定义公有并静态的方法,返回该对象。
return s;
}
}
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static synchronized Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
继承:提高代码复用性,并为多态打下基础。Java只支持单继承。多继承隐患:多个父类定义相同功能时,子类对象不确定要运行哪一个。重载:方法名相同,但参数不同的多个同名函数;
覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同
隐藏:父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
内部类:内部类可以直接访问外部类的成员,包括私有。外部类必须建立内部类对象才能访问内部类成员。
异常体系:error和exception
==和equals()的区别:“==”和“!=”比较的是“栈”中的内容(对象的地址),而equals()比较的是“堆”中的内容(对象的内容)。
多线程:建立线程两种方法:
1、继承Thread类;
2、实现Runnable接口。继承接口避免了单继承的局限性。
线程对象.setDaemon(true)设置守护线程。线程启动前调用,当正在运行的线程只有守护线程时,java虚拟机退出。
当a线程执行b线程的.join()方法时,a会等待b线程执行完才会执行。
线程对象.setPriority()设置线程优先级。
StringBuilder不是线程安全的,速度快;StringBuffer线程安全,慢。
泛型是一个类型安全机制,用于解决安全问题。
集合:
为方便存储和操作对象,出现集合类。数组可以存储对象,但长度固定,集合长度可变;数组可以存储基本数据类型,集合只能存储对象。
Collection:List和Set
List:有序,元素可以重复,有索引。
ArrayList,底层数据结构是数组。查找速度快。删除元素用equals()判断
LinkList,链表,增删速度快。
Vector。线程同步,数组,查找速度快。
Set:无序。元素唯一。
HashSet:底层数据结构式哈希表。通过hashCode()和equals()方法保持唯一性。如果元素hashCode值相同才会判断equals是否为true;
TreeSet:底层是二叉树。可以对元素进行排序。按自然顺序就是compareTo()。
实现排序的两种方法:
1、实现Comparable接口,覆盖comapreTo(Object obj)方法。
2、实现Comparator接口,覆盖compare(Object,Object)方法。
Map:
Hashtable,底层哈希表,不可以存储null值或键。线程同步。效率低。
HashMap,哈希表,允许使用null值或键。不同步,效率高。
TreeMap。底层是二叉树,线程不同步。可以给键进行排序。
获取Map元素的两种方法:
1、Set
2、Set
Collections:java集合的工具类,用于操作集合类。
Arrays集合:用于操作数组的工具类。
1.5新特性:可变参数,int...arr
静态导入:import static java.lang.System.*;用于导入静态方法;import java.lang.*;用于导入类文件。
System类:getProperties()方法获得返回系统属性Properties(Map集合子类)对象。Runtime类:运行时操作类。单例设计模式。
Calendar类:抽象类,用getInstance()获得对象。
Math类。
IO流:
常用基类:派生子类用父类名做后缀
字节流:InputStream,OutputStream
字符流:Reader,Writer
字符流:FileWriter,FileReader,需要flush();
字符流缓冲区:BufferedReader,BufferedWriter;要结合流才能使用。需要flush(),关闭缓冲区就是关闭缓冲区的流对象。
LineNumberReader(FileReader)类,getLineNumber()方法可以获得行号
字节流:FileOutputStream,FileInputStream。操作多媒体文件。
转换流:InputStreamReader,OutputStreamWriter。属于字符流的子类。In(System.in),out返回字节流。
System.setIn(InputStream),System.setOut(PrintStream);改变标准输入输出。
File类:
合并流:SequenceInnputStream。用vector的elements()得到Enumeration。
切割文件:循环里边创建流、关闭流。讲一个文件分部分存储在几个文件中。
java.Awt:需要调用本地系统方法实现功能。
javax.Swing:完全由java实现,增强移植性。
Component:
1、Container:Window,Panel
布局管理器:
1、FlowLayout,Panel默认布局;
2、BorderLayout,Fram默认。
TCP和UDP:TCP要经过三次握手建立连接,传输大量数据,可靠协议,效率低。UDP不需要建立连接,不可靠协议,速度快。
Socket:网络服务的一种机制,网络通信就是Socket间的通信,数据在两个Socket间通信。TCP:Socket,ServerSocket
UDP:DatagramSocket,DatagramPacket
加强:
overload:重载,存在于父类和子类、同类中。只能通过不同参数样式重载。
override:重写,存在于父类和子类之间。方法名、参数、返回值相同。子类方法不能缩小父类方法访问权限。不能抛出更多异常。
可变参数:int...arr
For循环增强:for(int i:int[])
枚举:让某个变量的取值只能为若干个固定值中的一个。
反射:在运行状态能够知道类的所有属性和方法,并调用对象的任意一个方法。获取类信息以及调用对象的方法。
类加载器:负责加载java类的字节码到虚拟机中。每个类加载器加载类时先委托给其上级加载器,当所有祖宗类加载器都没有加载到类,回到发起者类加载器时,还没加载到类,抛出ClassNotFoundException异常。
JavaBean:有set和get方法获得类属性的特殊java类。用于传递数据信息。
内省:IntroSpector,java语言对Javabean属性、事件的一些缺省处理方法。
Beanutils工具包
注解:@Override表示当前方法是覆盖父类的方法。
@Deprecated表示当前元素是不赞成使用的。
@SuppressWarnings 表示关闭一些不当的编译器警告信息。
Java系统默认三个类加载器:BootStrap,ExtClassLoader,AppClassLoader
创建动态类的实例对象:
1、通过实现的接口告诉要实现的动态类要实现哪些方法。
2、产生的类的字节码要有一个关联的类加载器对象。
3、执行代码的对象InvocationHandler。
代理:用Proxy类的getProxyClass(classLoader,interface)获得动态类的字节码文件。用反射获得构造器。用构造器的newInstance()InvocationHandler接口的对象做参数获得一个类对象。InvocationHandler对象重写pubic Object invoke(Object proxy,Method method,Object
[] args)方法返回method.invoke(target,args)。
创建动态代理对象步骤:
1、实现InvocationHandler 接口创建自己的调用处理器。重写invoke方法。
2、用Proxy.newProxyInstance(classLoader,new Class[]{Interface.class},handler}方法获得代理类实例。
Bank:
NumberManager类:产生客户
Private int lastNumber;
Private List
int synchronized generateNewManager():产生新客户号码。客户线程调用。
int synchronized fetchServiceNumber():取走客户号码。窗口线程调用。List是共享数据。需要互斥。
NumberMachine类:号码管理器,采用单例设计模式
private NumberManager commonManager;用get()返回对象。
private NumberManager expressManager;用get()访问。
private NumberManager vipManager;用get()访问。
Enum CustomerType COMMON,EXPRESS,VIP;
ServiceWindow类:窗口
private int windowId;窗口号码
enum CustomerType type;
public void start(){Executors.newSingleThreadExcutor().execute(new Runnable(){publicvoid run(){}})};根据type启动相应的窗口服务。
MainClass:main()函数类
开启5个普通窗口。
一个快速
一个vip
5.黑马程序员面试技巧 篇五
前言
1.背景: 在项目中前段时间遇到一个问题,就是客户要求学生在线填写一些基础信息,保存到数据库的同时,给学生提供下载填写好的信息的pdf文件供下载,一开始我选择用Itext类去解析word文档模板,生成rtf文件,之后将学生填写的信息保存到数据时将数据同时写入到rtf模板中,在进行转为pdf,但是实现之后下载查看发现,中文不会乱码,纯数字也不会乱码,但是中文加数字,和特殊符号会出现名义上的乱码,(其实不是程序的乱码,只是写到word的rtf文件中的数据不会自动识别要用那些字体导致的),上网,翻墙,茶不思饭不想的去找解决办法,终于在我不懈的努力下还是没有解决,故放弃.注:程序员要有一个舍得的心,不能在一个方向上钻牛角尖,跳跳代码同我家,有舍必有得.2.正文: 好了,废话不大多说,上正确的代码和思路(其中有完成之前我所遇到的问题和踩的坑): 材料: itext的jar包包:官网:http://sourceforge.net/projects/itext/files/ Word文档模板-->转为pdf(不会的,网上有教程)Adobe Acrobat软件编辑pdf加载文本域填充数据用(网上有关于此软件的使用教程)
黑马程序员郑州中心 编著
Demo展示: public void test1_1(){
BaseFont bf;
Font font = null;
try {
bf
=
BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”,BaseFont.NOT_EMBEDDED);//创建字体
font = new Font(bf,12);//使用字体
} catch(DocumentException | IOException e){
e.printStackTrace();
}
Document document = new Document();
try {
PdfWriter.getInstance(document,new FileOutputStream(“pdfFolder/2.pdf”));
document.open();
document.add(new Paragraph(“hello word 你好 世界”,font));//引用字体
document.close();
} catch(FileNotFoundException | DocumentException e)
黑马程序员郑州中心 编著
{
System.out.println(“file create exception”);
}
} 上处代码会产生一个pdf文件,如下:
以上掌握之后,只是塞个牙缝,总不能用代码去向pdf中花一些复杂的表格吧,要死人不说,还不能优化和变通,最主要的是不能控制样式.---编辑pdf模板文件:
网上截图(展示利用此软件进行编辑pdf的文本域):
黑马程序员郑州中心 编著
Word模板(部分截图):
黑马程序员郑州中心 编著
代码展示: public void fillTemplate(){//利用模板生成pdf //模板路径
String templatePath = “pdfFolder/template_demo.pdf”;//生成的新文件路径
String newPDFPath = “pdfFolder/newPdf.pdf”;PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;try {
out = new FileOutputStream(newPDFPath);//输出流 reader = new PdfReader(templatePath);//读取pdf模板 bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);AcroFields form = stamper.getAcroFields();
String[] str = {“123456789”,“传智播客”,“男”,“1994-00-00”,“110”,“郑州市”};
int i = 0;
java.util.Iterator
String name = it.next().toString();
黑马程序员郑州中心 编著
System.out.println(name);form.setField(name, str[i++]);}
stamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true stamper.close();
Document doc = new Document();PdfCopy copy = new PdfCopy(doc, out);doc.open();
PdfImportedPage importPage =copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importPage);doc.close();
} catch(IOException e){ System.out.println(1);
} catch(DocumentException e){ System.out.println(2);} }
3.成品代码:
上述代码只是一个小的demo,下面是进行再开发中自己写的符合业务需求
黑马程序员郑州中心 编著 的代码配合上述的word文档模板进行编写,代码改变度不大,自己可以琢磨一下: public void save(Page page,HttpServletResponse
response,httpServletRequest request){ //利用模板生成pdf //模板路径
String templatePath = “项目中的模板路径”;//生成的新文件路径
String newPDFPath = “要生成的文件的存放文件”;PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;try { //设置种字体,默认选中的是下面这个,在windows系统中是这样的,在其他的非windows系统中不敢保证:(不想用这种,可以在Adobe Acrobat去设置一个为Adobe 宋体 SL的字体,一下代码可以省略,并且不用在塞入数据是加入font字体,以下代码中的三处①一起使用,一起死亡)
//BaseFont bfChinese = BaseFont.createFont(“STSongStd-Light”, “UniGB-UCS2-H”, false);--①
//Font font = new Font(bfChinese, 10, Font.NORMAL);--①
out = new FileOutputStream(newPDFPath);//输出流
reader = new PdfReader(templatePath);//读取pdf模板
黑马程序员郑州中心 编著
bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);
//读取pdf模板中的文本域们,(此处的用Adobe Acrobat编辑的模板没有截图,仿照上面的demo中的盗图进行对比)
AcroFields form = stamper.getAcroFields();
//form.setField(“studentName”, “font”,null,”数据”);//姓名中文--①
foem.setField(“studentName”, ”数据”);
form.setField(“sex”, “男”);//婚前姓名
stamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true stamper.close();
Document doc = new Document();PdfCopy copy = new PdfCopy(doc, out);
//打开模板文档进行开始编辑: doc.open();
PdfImportedPage importPage =copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importPage);//此处一定要关闭,否则有一个进程会一直使用此模板文件,就会造成下载时报异常,此异常自己体会是什么异常: doc.close();
} catch(IOException e){
黑马程序员郑州中心 编著
System.out.println(1);
} catch(DocumentException e){ System.out.println(2);} }
到此处已经完成了此小小功能,希望能帮助一些遇到此问题的人,以下附上本人参考的大神播客地址: http:// http://zhuchengzzcc.iteye.com/blog/1603671
https://jingyan.baidu.com/article/295430f1fb049f0c7e0050d5.html
6.黑马程序员面试技巧 篇六
DOM(文本对象模型(Document Object Model))W3C组织推荐的处理可扩展标志语言的标准编程接口。W3C的DOM,可以使程序或脚本(JS或AS、JScript),动态的访问或操作文档的内容、结构、样式。
DOM只是一个标准,就是操作网页的标准。而这个标准(模型)在浏览器中,以“对象”的方式实现。DOM的分类
核心DOM:提供了操作HTML文档(显示)或XML文档(存储数据)的公共的属性和方法。
HTMLDOM:针对HTML文档,提供的专有的属性和方法。EventDOM:事件DOM,提供了很多的常用事件。CSSDOM:提供了操作CSS的一个接口。HTML节点树
DOM中节点的类型:
document文档节点:代表整个网页,document文档节点不对应标记。是访问文档中各元素的起点。
element元素节点:元素节点对应于网页中的各标记。attribute属性节点:每个元素都有若干个属性。Text文本节点:文本节点是最底层节点。核心DOM公共属性和方法 nodeName:节点名称。nodeValue:节点的值。firstChild:第一个子节点。lastChild:最后一个子节点。parentNode:父节点。
childNodes:子节点列表,是一个数组。节点访问
查找html节点的方法 document.firstChild
document.documentElement(兼容性较好)查找body节点的方法
document.firstChild.lastChild document.body(推荐使用)节点属性
1、getAttribute()——获取属性的值
描述:获取节点属性的值。
语法:nodeObj.getAttribute(name)参数:name代表当前节点的某个属性。举例:var src = imgObj.getAttribute(“src”)
2、setAttribute()——添加属性 描述:给某个节点添加属性。
语法:nodeObj.setAttribute(name,value)参数:
name代表属性名称。value代表属性的值。
举例:imgObj.setAttribute(“src” , “images/02.jpg”)
3、removeAttribute()——删除属性 描述:删除某个节点的属性。
语法:nodeObj.removeAttribute(name)举例:imgObj.removeAttribute(“src”)案例:
//当网页加载完成,调用JS程序
window.onload = function(){
} //函数:删除src属性
function removeImg(imgObj){ //删除src属性 //查找img节点
var imObj = document.body.firstChild;//向img节点添加src属性
imgObj.setAttribute(“src”,“images/01.jpg”);//向img节点添加width属性 imgObj.setAttribute(“width”,400);//向img节点添加border属性 imgObj.setAttribute(“border”,2);//向img节点添加style属性
imgObj.setAttribute(“style”,“padding:20px”);//向img节点添加onclick属性
imgObj.setAttribute(“onclick”,“removeImg(this)”);
} imgObj.removeAttribute(“src”);imgObj.removeAttribute(“width”);
7.C#开发数据应用程序的调试技巧 篇七
1 设置断点
通过设置断点后进入调试模式, 可在监视 (watch) 窗口查看计算变量和表达式的值。其实也可以通过设置断点跟踪执行, 跟踪会收集程序中发生情况的相关信息并显示这些断点之前相应值信息, 如图1所示。
只要将光标定位在相应的位置就会得其相应的数值, 通过理解和分析帮助我们进行调试。
2 巧用消息框
开发c#+WinForms窗体应用程序可以在运行时通过消息框向窗体输出信息, 消息框常常用来向用户显示消息, 并提供选择按钮向用户请求信息。我们也可以在不设置断点的情况下用消息框来显示一些不太直观看到的中间变量或信息, 如下面代码段为例:
上例中是给一个数组循环赋值, 如果要查看数组的赋值结果, 我们可以加上一行消息框输出查看数组元素的值。当然可以在需要输出中间结果时加载一条消息框输出语句, 显示所需要的中间信息。
3 SQL语句的处理
在C#开发数据库应用程序的设计中, 经常要进行对数据库的增、删、查、改操作, 因此要根据所进行的操作构造相应的SQL语句访问数据库得到相应的结果。不仅如此, 在C#构造SQL语句中, 经常需要将页面输入的信息传入数据库与之进行交互, C#的String类提供了一个强大的Format () 方法来格式化字符串。其语法是:string myString=string.Format (“格式字符串”, 参数列表) ;
一般是将页面输入的信息作为参数先传入SQL语句中, 再通过SQL语句与数据库中信息进行增、删查、改的操作, 所以SQL语句的构造十分重要。而且一般SQL语句的错误不在C#错误列表中明显地显现出来, 给查错带来困难, 所以建议应在SQl环境中或C#中建立SQL语句的验证机制, 即先在SQL或C#查询视图中先执行SQL语句, 得到相应的结果后, 再将其COPY到C#, 将相应参数加入到SQL字符串中, 尤其要注意传入参数格式的正确性, 这样可大大减少SQL语句构造产生的错误, 保证程序功能的正常实现。
4 深入理解.NET Framework数据提供程序
在C#开发数据应用程序中, 主要通过.NET Framework数据提供程序与数据库进行连接和增、删、查、改的操作。其中除了连接对象之外, 最为重要的就是Command对象几个方法。
ExcuteScalar () 方法, 只返回查询结果中第一行第一列的值, 所以当我们查询结果只有一个值时, 通常使用这个方法, 比如使用聚合函数时, 并且在程序中要进行相应的类型转换。
ExcuteReader () 方法的返回值就一个DataReader对象, 可以调用DataReader对象的Read () 方法来读取一行记录, 并且用 (type) dataReader[“记录列名”]来获取某列的值。
以上两个方法仅针对数据库进行了查询操作。
ExcuteNonQuery () 方法用于执行指定的SQL语句, 如UPDATE、INSERT、DELETE, 它返回的是受SQL语句影响的行数, 实际上对数据库进行了增删改操作, 它的返回值是一个整型的变量, 可以对变量的值的变化来确定修改是否成功。
以上3种方法都是直接对数据库执行命令, 另一种方式是利用Data Set间接操作数据库的数据, 通过DataAdapter对象的Fill () 方法把需要的数据一次放在DataSet中, 如果不需要对数据进行修改, 只需要Fill () 方法就可以了, 如果对数据进行了修改, 就需要使用DataAdapter对象的Update () 方法将修改的数据返回到数据库。
深入理解和掌握这几个方法的实质有助于我们实现逻辑操作, 构造相应的功能。
8.黑马程序员面试技巧 篇八
本届赛事一共有28名NBA的球员出现在各個国家的代表队中
而在决赛中将现役、前NBA球员以及即将登陆NBA还有已经被NBA球队选中的球员全部包含在内计算
更有多达16名NBA级别的球员出战,这无疑是欧锦赛史上最壮观的一届
诺阿、卡曼、还有马其顿名不见经传的迈克·卡勒布
都是被现国家队“归化”的球员,这些人为崇尚团队篮球的欧洲带来了新鲜血液
在这样的情况下,固守着欧洲篮球传统的“整体”、“均衡”思路的球队都在这次欧锦赛上铩羽而归
立陶宛、希腊和塞尔维亚这三個对美国元素嗤之以鼻的传统强队都在四分之一决赛落马
而以個人领衔球队获胜的球星模式,也是本届欧锦赛“黑马”球队之所以成功的原因
而欧锦赛四强中却没有纯正的欧洲风格,这恐怕还是欧锦赛历史上的第一次
纯种黑马马其顿
黑马指数:★★★★★
黑马要素:防守至上
重点人物:迈克·卡勒布
从南斯拉夫独立出来之后,马其顿在欧洲篮坛当中一直都没能打出成绩,但在本届欧锦赛,马其顿队不断地刷新自己的篮球历史,首次打进八强,首次晋级四强……要知道他们此前最好的成绩也只是2009年欧锦赛的第九名,再往前就要追溯到1999年欧锦赛的第13名了。马其顿队杀入四强的成绩,也使得他们获得了奥运会的资格赛机会。
马其顿队的阵容中没有一位明星球员,完全是一支平民部队,球队的核心后卫迈克·卡勒布还算有点名气,不过这位出生在美国的1.78米小個子球员也只是打了三年的职业联赛而已。他出色的個人攻击力让众多的欧洲豪门球队痛苦不已,帮助马其顿队连续创造惊喜。迈克·卡勒布在本届欧锦赛上场均能够贡献21.3分,他绝对是本届欧锦赛表现最出色的球员之一。在与立陶宛的生死之战中,卡勒布贡献了23分,他在最后关键时刻不但屡有斩获,队友列夫斯基在终场前11秒投中的那個反超比分的三分球正是来自与他的助攻。尽管迈克·卡勒布出生在美国新奥尔良,并在新奥尔良读了大学,并代表学校征战过NCAA,但之后他便前往了欧洲寻求发展。在谈到如何被归化加入马其顿男篮时,他说道:“去年我正在塞尔维亚打球,突然有天我接到了来自马其顿方面的电话,他们问我愿不愿意给他们效力。我没有详细问太多问题,我就回答了‘愿意’,第二天我便乘坐班机飞往了斯科普里(马其顿首都)。
迈克·卡勒布超级巨星般的表现是马其顿能够在欧锦赛上创造奇迹的关键之一,但是仅仅依靠一個人的力量,马其顿队无法走得这么远。这支黑马球队出色的团队协作和永不放弃的拼搏精神在本届欧锦赛上令人印象深刻。对阵东道主立陶宛的四分之一决赛,在多次大比分落后的情况下,他们一次次艰难地追上比分,最终依靠埃列夫斯基的三分球绝杀对手晋级四强。马其顿队在三四名争夺战的对手俄罗斯队,被认为是欧锦赛上防守最出色的球队,而马其顿队虽然没有基里连科、莫兹科夫、赫亚帕那样防守出色的個人球员,但是依靠出色的团队协作,依靠顽强的拼搏精神,他们铸造的防守同样非常牢固。马其顿本届欧锦赛上场均得分只有70分左右,排在第十名,但是场均失分仅仅为67.9分,高居第四名。
黑马赛事
马其顿78比76克罗地亚
欧锦赛小组赛第二天,在C组的马其顿和克罗地亚上演了本届欧锦赛最精彩的战役,马其顿队在最后10秒凭借老将伊利夫斯基的绝杀,最终以78比76击败克罗地亚队,这也是本届欧锦赛开赛以来的首次绝杀。马其顿上演绝杀的功臣伊利夫斯基砍下18分,迈克·卡勒布19分5次助攻,安蒂克15分5個篮板。克罗地亚5人得分上双,德拉帕13分6個篮板6次助攻,托米克10分7個篮板。
比赛一开始就呈现出拉锯战的倾向,德拉帕三分得手率先为克罗地亚开荤,但是戈切夫斯基也跟着还了一记三分,此后两队进入到火拼大战当中,互有得分。直到首节还剩53秒时两队还打成15平。但马其顿最后1分钟连续得分,以21比18领先克罗地亚结束首节。第二节一开始克罗地亚就是一记三分命中,随后托米克也打进一球将比分反超。不过接下来马其顿在伊利夫斯基的带领下紧紧咬住比分,尽管迈克·卡勒布最后打进一球,但马其顿队仍以37比41落后克罗地亚队结束上半场。
克罗地亚在下半场忽然发力,一波8比0的攻击波将领先优势扩大到12分,不过马其顿在迈克·卡勒布和安蒂克的带领下连续追分。虽然克罗地亚的托米克打进一球稳住局面,但马其顿再次打出8比2的进攻狂潮,将比分扳平。托马斯打进一球后克罗地亚以62比60领先马其顿结束第三节。第四节的较量陷入到白热化阶段,伊利夫斯基三分命中帮助马其顿反超比分,但克罗地亚随后也将比分追了上来。双方此后陷入到胶着大战当中,距离全场比赛结束还有51秒时,德拉帕造成对手犯规并且两罚全中,两队打成76平。但比赛还刺10秒时伊利夫斯基跳投绝杀得手,此后克罗地亚的博格达诺维克三分无果,最终马其顿队以78比76险胜克罗地亚队。
马其顿67比65立陶宛
立陶宛作为东道主,拥有主场优势,他们曾经击败过土耳其、塞尔维亚和德国这些强队,并且将超级强队法国逼到绝境当中,所有的这些都证明了立陶宛身上所具备的强队气息。不过在本届比赛最大的黑马,马其顿面前,所有的优势都化为乌有。主场作战的立陶宛队被马其顿最后11秒时的一记三分击溃,最终以65比67负于对手止步八强。马其顿成为了继西班牙之后第二支晋级欧锦赛四强的球队。马其顿在本届欧锦赛上已经击败了包括克罗地亚,希腊在内的诸多强手,成为最令人惊讶的黑马。
出生于美国的后卫迈克·卡勒布全场砍下23分,而马其顿射手斯托贾诺夫斯基也贡献15分,两人支撑起这支黑马军团的进攻重任。“对于我们来说这是一场无比重要的胜利,”斯托贾诺夫斯基说,“我们最后终结了比赛,也让立陶宛全队只拿到65分,在防守端,我们的表现非常出色,而且在比赛最后时刻给他们施加了很大的压力。”立陶宛作为东道主,迎来了多达15000名球速到场观看,在观众席上只有少数的马其顿球速在为他们呐喊。不过立陶宛尽管占据了地利人和,然而马其顿依然顽强地将立陶宛逼入到绝境边缘,在最后时刻立陶宛多次将比分差距拉开,但马其顿队不肯低头,一直死死咬住比分。距离全场比赛还有22秒时迈克·卡勒布进攻不中,这個时候的马其顿还落后立陶宛1分,不过斯托贾诺夫斯基鬼使神差从桑盖拉手上成功抢断,随后在比赛还剩11秒时伊利夫斯基的三分命中直接帮助马其顿反超比分,最后立陶宛的加塞提斯试图绝杀无果,只能将胜利拱手让给马其顿。“我认为这场比赛的结果没人能料到,对于马其顿的体育来说——无论是什么项目的体育运动,这都是一场无比重大的胜利。”马其顿主教练马林·多库佐夫斯基说。“我认为在这场比赛当中,我们向所有人展示了我们是欧洲最优秀的球队之一,尽管很多人认为我们的获胜有运气成分。但无论如何,我们能够站在这里完全是应得的。
马其顿在打球的时候完全没有压力,自由地去打球,并且掌控着极佳的进攻节奏。”
预料中的黑马法国
黑马指数:★★★★
黑马要素:法国“跑车”高速前进
重点人物:托尼·帕克
虽然法国队人才济济,但是在欧锦赛各支球队中,他们并不是夺冠的大热门,不过法国人却用实际行动证明了自己同样是冠军最强有力的争夺者。由于拥有帕克这样的速度型选手,法国在很多时候都以快速的进攻在瞬间击溃对手,而正是凭借帕克的优势,法国才得以杀进决赛。最经典的比赛当属在小组赛中,帕克与诺维茨基之间的斗法。帕克在与诺维茨基的老冤家对决当中,成功赢得了这场欧洲两大在NBA成功夺取总决赛MVP巨星之间的对决,尤其德国队尽管由上赛季的总决赛MVP诺维茨基领衔,内线还有快船中锋卡曼坐镇,但是德国队的双塔内线并没有起到统治比赛的效用,反而被法国队的跑轰战术给击溃了。帕克全场超过五成的命中率,不断突破到德国队的内线制造杀伤,并且串联起了全队的进攻战术,完全扮演起了法国核心应有的作用,而强大的领袖作用是率领一支球队走向争冠的巨大保障。而法国的强势并不仅仅在于外线,还有巴图姆与格拉贝尔这样的悍将支援,另外内线的强大实力也是法国队具备争冠的底气,尤其是引进了公牛队首发中锋诺阿,他再加上全能手迪奥、皮特鲁斯与特劳雷等内线悍将,完全撑起了法国内线的绞肉机战术,生生抹杀了诺维茨基的强势发挥,这套班底也将是法国队抗衡最大夺冠热门西班牙队的保障。在小组第四战他们还顽强逆转了意大利队,充分展示出了强劲的竞争力,能够重回欧洲之巅的想法更会激发他们的雄心。过去37届的欧锦赛,法国只缺席了两次,是欧洲参赛最多的球队。可法国35次参加欧锦赛,却没有一次夺冠。本届欧锦赛之前,在7次闯入欧锦赛半决赛的历程中,他们只赢得过一次胜利。“可是今年,情况变了,我们坚韧起来了。我们的信心开始一点点地建立起来,我们的凝聚力也在加强。”科莱说。
黑马赛事
法国79比71俄罗斯
本场比赛过后法国队直接晋级决赛也获得参加伦敦奥运会的资格,他们将与西班牙争夺冠军,而俄罗斯则获得参加奥运会落选赛的资格。帕克拿到22分3個篮板3次助攻和4次抢断,巴图姆19分7個篮板4次助攻2次盖帽,诺阿7分8個篮板。俄罗斯球星基里连科拿到21分3個篮板2次助攻和3次抢断,莫泽戈夫12分4個篮板2次助攻,科里亚帕得到9分3個篮板5次助攻2次抢断和2次盖帽。
迪奥率先为法国队得分,基里连科随后扣篮得手还以颜色,接着帕克命中一记三分,但莫泽戈夫也打进一球,再度将比分扳平。接下来比分多次出现打平的情况。首节比赛还有1分01秒时舍维德两罚全中,俄罗斯队反超1分,但是帕克的压哨投篮得手,首节法国队仍以1分的优势领先俄罗斯队。次节开始后俄罗斯队率先得分,此后巴图姆打成2+1还以颜色。接下来两队再度陷入到拉锯战当中,本节末端德科洛、巴图姆和帕克分别三分命中,法国队打出一波11比2的攻击波,在距离半场结束还有39秒时取得8分的领先优势。
下半场俄罗斯队将比分扳成39平。本节末端法国队在几名NBA球员的带领之下打出8比0的攻击波,取得领先。尽管莫泽戈夫依靠罚球拿到2分,但法国队的特拉奥一记跳投命中,他们以55比47领先俄罗斯队结束第三节的争夺。末节一开始法国队就在特拉奥和德科洛的带领下打出6比2的小高潮,将领先优势扩大到12分。尽管俄罗斯队的基里连科2+1得手,蒙亚也三分命中将分差缩小,不过巴图姆和帕克发威再度将分差扩大到10分。关键时刻舍维德和基里连科分别进球,俄罗斯在距离全场比赛结束还有3分36秒时追成64比69。帕克连进两球为法国队稳住局面,尽管科里亚帕也有得分进账,但俄罗斯队依然没能将比分差距缩小。最终法国队。
黑马小跑斯洛文尼亚
黑马指数:★★★
黑马要素:团队配合
重点人物:德拉季奇
斯洛文尼亚素来都是以出色的团队配合著称的球队,因此虽然德拉季奇是球队当中惟一一名在NBA效力的球员,但球队并不需要他的疯狂得分。在本届欧锦赛当中德拉季奇主要的工作还是在掌控比赛节奏,调动起队友进攻的积极性,在这個基础上再去进行得分。德拉季奇在本届欧锦赛当中场均能砍下11.7分3.6個篮板2.7次助攻和1.6次抢断。由于斯洛文尼亚采用的是双控卫战术,也使得传球的任务并不只是集中在德拉季奇身上,因此他场均2.7次助攻是次于拉科维奇的全队第二高助攻数。除此之外,德拉季奇场均还能拿到3.6個篮板位居球队第四,不过他在场上最突出的贡献还在防守端上,场均1.6次抢断为全队最高。
在欧锦赛的进程当中德拉季奇有过起伏,但是全能的表现依然还是他最为人所称道的地方,在揭幕战击败保加利亚的比赛中他贡献13分6個篮板和6次助攻的数据,也证明了他全能的一面。不过在接下来对阵乌克兰和格鲁吉亚的比赛里他的表现失常,分别是5投1中和8投1中。但是在击败比利时的比赛当中,德拉季奇成为最神勇的球员,贡献了18分3個篮板3次助攻和高达5次的抢断,带领球队涉险过关。在对阵欧洲传统劲旅希腊时,德拉季奇由于犯规困扰只打了17分钟,但也7投3中拿到9分,遗憾的是他们最终还是输掉了比赛。德拉季奇另一场星光闪耀的比赛是在对阵黑马球队马其顿时,他全场13投8中效率极高,砍下20分5個篮板和3次助攻,不过队友的无为表现导致了斯洛文尼亚以59比68落败,但德拉季奇占据了全队超过三分之一的得分,也证明了他在这支球队的重要性。
比赛越到关键阶段德拉季奇的表现就更加出色,在四分之一决赛对阵立陶宛时,斯洛文尼亚全队熄火,德拉季奇只能自己一個人挺身而出砍下16分,另外还有5個篮板4次助攻和3次抢断,但遗憾的是那场比赛还是落败了。不过在最后一天的排位赛当中,德拉季奇再度发威轰下全队最高的21分,而且全场12投9中,效率极为出色。德拉季奇并不是疯狂刷分的球员,但是在斯洛文尼亚迫切需要得分的时候,他总能身先士卒,做出了表率,并且努力为球队带来胜利。
黑马赛事
斯洛文尼亚72比68塞尔维亚
虽然塞尔维亚队在第三节末段一度落后15分,但是他们在第四节出色的攻防将比分扳平。不过斯洛文尼亚队最后顶住对手的攻击,以72比68险胜塞尔维亚队。本场比赛过后斯洛文尼亚队取得欧锦赛第七名,而塞尔维亚队则名列第八。
比赛一开始斯洛文尼亚队的攻势相当凶猛,德拉季奇2+1得手,拉科维奇连续两记三分命中后,穆里克随后又是一记三分命中,斯洛文尼亚打出12比2的开局。接下来萨瓦诺维奇和克塞尔连续得分帮助塞尔维亚队一直紧咬比分。本节最后1分多钟奥泽博尔特连续两记三分,斯洛文尼亚队打出8比0的进攻高潮,领先塞尔维亚7分进入次节。德拉季奇下半场的表现相当出色,他個人包揽了全队在下半时的前10分,帮助斯洛文尼亚队将领先优势扩大到12分。尽管萨瓦诺维奇和皮洛维奇都有得分,但斯洛文尼亚又是三分命中维持分差。在洛比克两罚全中后,拉科维奇也三分命中,斯洛文尼亚队领先优势达到15分。虽然最后时刻萨瓦诺维奇两罚全中,但塞尔维亚队依然以51比64落后斯洛文尼亚队。
9.黑马程序员面试技巧 篇九
作为一个仅仅干过一年半的程序员,有些事情不得不说,有些经验不得不去分享,只是为了让其他人走更少的弯路,让大家更快的成长起来!
我不是伟人,普渡众生不是我的理想,但是作为一个辅导老师,我觉得很有必要让自己的学员更快的去“入戏”!去融入这个圈子!
作为一个吃“快餐”入行的程序员,但我总觉得入职之处跟他人相比少了那么些文化底蕴!那就感觉说不清楚,就像一个草莽英雄跟一个名门豪侠相比,功夫上不差火候,但是差的是那一层身份!所以入职之初,我也山寨了一份学历证书,这是社会需要!试问下,在筛选简历的时候,人家看都不看你的简历,你又如何脱颖而出呢?英雄无用武之地,这样是很尴尬滴!
笑到最后的才是王者
四个月的地狱式的学习生活,真的真的让自己脱了一层皮!从一个穷屌丝到一个程序员的华丽转身!我不觉得我多么的聪明,基础知识学的有多好,很不避讳的说:我第一次入学考试,我的名字是从后面起排名前几的{:soso_e101:}~~但是毕业后能够快速找到理想工作,我觉得跟我的性格和经历多多少少有不点关系!
性格的影响力
可能跟我接触过的哥们都有一个感想:这辅导老师很健谈!不错,我非常喜欢扯淡,试想一个从大一就开始做兼职销售的大学混子,嘴很多时候是闲不住的......{:soso_e118:}(不知道这算不算职业病)另外一个就是在四个月的学习当中,我依旧保持我的热情,一如既往的爱扯淡,但是这次扯淡扯的内容更多的是技术,扯得更多的是身边更多曾经从事过IT这个行业的职场经历!俗话说的好:读万卷书不如行万里路,经历是证明你曾经存在的最好证据!当然这些东西需要你去吸收,从而变成自己的“伪经历”!很负责的告诉大家,这个很重要,非常重要!或许这些东西会成为你打开企业大门的利器神兵!
善于总结的人总是先人一步成功
四个月,不长,但时是对于每天12小甚至更多时间在代码世界遨游急速充电的我们这个是很高负荷,亚历山大~大家都懂的..曾经走过的屌丝无声走过..现在把我的经历作为作为一个小故事,希望给大家带来些许帮助!人生阅历不能复制,但是可以进行精华的抽取~ 生活中处处有java!很高深的样子有木有.我的面试经历来说:精彩极了,糟糕透了!说实话,我的技术水平不是班里很好的那种,也就属于在底层混的人,但是我找工作的速度并不是那么慢!下面就是我的面试过程:
聪明人和平常人相比,前者在学习经验,后者在看故事
第一家企业:面试官看完简历直接让上机,做一个异步加载图片的android项目,然后用javase再做一个多线程的购票模拟,跟张老师讲的高薪面面试题原理差不多!第一次参加这种技术面试,最可恶的是尼玛面试官哥哥就一直坐在我旁边喝咖啡...一个字飞过...那时候发现我的那么犀利的口才完全无用武之地 靠!最终结果异步加载做完了,然后多线程题目还没写多少,时间就到了,然后...就没有然后了。我最终被面试管完美ko.他们对技术要求非常硬,但是工资给的也叫一个招人眼馋,不过自己本身技术不是那种走暴击路线的人,普普通通!所以无缘这个看着很牛X的企业!面试好比打仗,千万不要打无准备之战
第二家企业:这个是离我住的地方比较远,大概二个小时,让我下午2点半面试,我提前一个小时到!然后我在他们写字楼的休息区休息!遇见一个哥们也在看简历,然后聊了起来,很high,各种扯淡~结果到时间了和我一起进去的,搞笑的事情发生了,那个哥们直接带我去人事谈工资!我要了9k!但是他们HR让我回去发毕业证电子证书,结果自己山寨的人家查不到,后来给我降到6k,没去!但是这次经历很high,很幸运!但是这个幸运来自四个月的沉淀和自己的性格~其实很感谢下四个月每天中午的演讲,希望同学们一定要认真听,认真去吸收,虽然有的时候讲的是非技术的,但这些东西不失为是你的一个经历,一个跟企业面试官聊天的切入点~面试官high了,一切都好谈!其实面试不仅仅是技术,还有心理!
很多英雄都是死在了胜利前的松懈上
在这里不得不说,面试过程中的时间安排这个问题!这个时间其实大家的思想和身体已经进入一个疲惫期,容不得你去松懈!你面试完毕之后,要去总结,去问问自己遇到了哪些问题,如何改正?静坐常思己过,伟大的晓哥说过,只要善于总结的人才是笑到最后的人!
有的时候很多哥们感觉面试很不错,但是等来等去就是没有消息!这个时候你用脚指头去想,也需要知道自身出问题了,是不是?难不成企业高管会没事儿早上起来多吃几个馒头,让你去逗乐消遣么?如果你优秀,企业不会不去考虑你的~
万事俱备只欠东风!莫要把东风改西风
10.“黑马”对决阿里山巅 篇十
(2001年4月28日弈于台北教师会馆)
中炮过河车对屏风马高车保马
一年一度的“阳信杯”象棋名人赛如期举行,本届“名人”由双和队的陈国兴荣获,二至六名分别是:刘国华、何传忠、林世伟、陈振国、高懿屏。自吴贵临被封“荣誉金名人”以来,“阳信杯”已产生四位“名人”,分别为:张鸿钧、刘国华、马仲威、陈国兴。何传忠与林世伟是本届大赛的两匹黑马,分别挑落多员大将,晋升四强,以下介绍的对局是双方三四名之战。
1、炮二平五马8进72、马二进三卒7进1
3、兵七进一马2进34、车一平二车9平8
5、车二进六炮8平96、车二平三车8进2
7、炮八平七…………
开局双方布成中炮过河车对屏风马高车保马的阵势。目前高车保马已较少为棋手采用,黑方故技重施,想必是有备而来。红方平炮胁马亦未尝不可,另一常见攻法为马八进七。
7、…………象3进58、兵七进一…………
弃兵吊高象为常见手法。如马八进九,炮2退1,另有攻守。
8、…………象5进39、车九进一车1平2
10、马八进九士4进5
不如直接炮2进5,红如车九平六,炮2平5,相三进五,车2进7,黑方反先。
11、车九平六炮2进512、车六进五炮2平5
应马3退4较灵活。
13、相三进五车2进714、炮七进二象7进5
15、车六平七马3退416、车七平九…………
扫卒非当务之急。应兵三进一活通右马。
16、…………炮9退217、车三平一炮9平7
18、车一退二车8进4
应车8进6,马三退五,再车8平6,红方难下。
19、炮七退一车8进220、马三退五马7进8
仍应车8平6,车九退二,卒7进1,兵三进一,车2平4,黑方亦有攻势。
21、兵三进一卒7进122、车一平三车8平6
23、炮七退二车6退2
应考虑走车6退5,这样不至于少太多卒。
24、车九平五马4进225、马五退三马8进9
26、车三进二马9退827、仕四进五马2进4
28、车五退二马4进229、车三平六车6退3
30、车六平四马8退631、车五进二马2进4
32、马三进四车2退133、兵九进一炮7进3
多此一举,不如直接车2平5,仍有谋和机会。
34、车五退一车2平535、车五平四车5平2
36、马四进三车2退337、仕五进六炮7退1
38、马三进二马4进5
由于黑方子力位置欠佳,又少一卒,谋和有一定难度。此时建议走炮7平8,较为顽强。
39、车四退二马6退840、马二退三马5退4
41、车四进二马4退342、马三进四马8退9
43、炮七平二炮7平644、炮二进八象5退7
45、炮二退三炮6进246、炮二平八炮6平5
47、仕六进五炮5退248、马九进七炮5平6
49、炮八进二象3退550、兵九进一士5进4
51、炮八退一士4退552、炮八进一士5进4
53、炮八退一士4退554、炮八进一士5进4
55、兵九平八马9进756、马四退三马7进9
57、兵八进一士4退558、马七进五马3进4
59、兵八平七马9进760、马三进二炮6平8
应炮6退1固守。
61、马五进六士5进462、兵七进一士4退5
63、炮八平六马4退264、兵七平八马2进1
65、马六进七(图)…………
如图形势,红方置八路兵于黑方炮口而不顾,毅然跃马卧槽,给黑方设下了陷阱。
65、…………将5平466、炮六退四炮8平2
黑方在临场时间、心理等各种因素下,无暇细算而接受了红兵,从而导致速败。依局势分析,应马1退3,战线将很漫长。
67、马七退六炮2平468、马六退七将4平5
69、马二进三马7退670、炮六平九炮4退1
71、马七进五将5平472、马五进七马6进5
73、马七进八炮4平374、炮九进四(红胜)
11.黑马程序员面试技巧 篇十一
功能强大的安装打包工具大多数是收费的,例如Wise和Delphi自带的InstallShield都可以支持Delphi。虽然它们的实际功能很强,可以做出专业的安装程序,但需花大量的时间看它的帮助。对于Delphi开发的小型应用软件,我们也可以采用安装制作工具InnoSetup进行打包,下面介绍这种新的打包方法。
1 Inno Setup简介
Inno Setup是一个免费的、优秀的安装制作工具,无论从功能上还是稳定性上都可以与许多商业安装程序制作工具相媲美,并且容易学习。它的脚本是类pascal语法,其源码公开。Inno Setup的编程语言是文本格式,可以在任意文本环境下编写,并在Inno Setup环境下编译。主要特点:支持现有的Windows的所有版本;支持创建单一的EXE安装文件,可在线和光盘发布;标准Windows2000/XP风格的应用向导;具有完全反安装功能;安装工具可以识别比较不同的版本信息,替换正在使用的文件,使用共享文件的计数功能,注册DLL、OCX文件和类型库,并且可以安装字体;可在开始菜单和桌面等创建产品快捷方式;可写入注册表与INI文件;支持多语言安装;支持使用密码和加密安装;全部源码是免费的,打包后的文件也非常小等。
2 Inno Setup语法
整个安装工程描述分为几个大部分,分别由[Setup]、[Languages]、[Tasks]、[Files]、[Registry]、[Icons]、[Run]等关键词引导。安装工程描述语句中功能的实现都以相应的关键词引导或识别。例如一个简单安装工程的描述,以下为其由各关键词的引导示例:
[Setup]
AppName=****** ;工程名称
AppVerName=****** ;工程版本信息
AppPublisher=******;工程发布者
AppCopyright=Copyright (C) 2006-2007 ******, Inc.
WindowStartMaximized=yes
WizardImageBackColor=clBlue
WindowVisible=yes
DefaultDirName={pf}******;默认安装目录
DefaultGroupName=******;默认程序组名称
OutputDir=******;编译好的安装文件输出位置
OutputBaseFilename=Setup
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"
[Files]
Source: "E:hgdzMeasureSystem.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "PrintRecord.rav"; DestDir: "{app}"
[Run]
Filename: "{app}hgdzMeasureSystem.exe"; Description: "运行 OilTanksMeasureSys";
Flags: nowait postinstall skipifsilent unchecked
其中关键词[Setup]下包含了安装及反安装过程需要的全局设置值;关键词[Languages]部分定义了安装程序使用的语言;关键词[Tasks]是可选项,它定义了所有的用户级安装任务选项,在安装向导页面中以单选框或复选框形式供用户选择额外安装任务;其中关键词[Files]定义了安装到用户系统中的任意文件;关键词[Run]指定程序被成功安装后,详细列出要执行的许多相关例程。还有其他一些关键词,比如关键词[Types]、[Dirs]、[Registry]等等,需要时可以查看安装工具Inno Setup的帮助文件。
3 常遇到的三个问题及解决
3.1 动态安装配置BDE
Delphi开发的数据库应用程序需要BORLAND数据库引擎的支持,否则不能正常使用,因此应用程序发布前必需在每台客户机首先安装BDE驱动程序,然后安装应用程序及必要的辅助文件。Inno Setup安装工具提供了简单的打包安装BDE驱动程序的方法:首先在程序开发之前手动配置好BDE,然后通过网络搜索下载“MiniReg.exe”和“BdeInst.dll”两个文件,将文件拷贝到Inno Setup 脚本文件所在目录下,然后在脚本文件中添加如下代码:
[Files]
Source: "MiniReg.exe"; DestDir: "{tmp}"
Source: "BdeInst.dll"; DestDir: "{tmp}"
[Run]
Filename: "{tmp}MiniReg.exe"; Parameters: """{tmp}BdeInst.dll"""
对打包脚本文件编译执行的同时,本机预先配置的BDE信息也被打包进去。应用程序安装时,BDE驱动程序会自动加载,可以选择安装或者取消安装,安装的同时BDE的配置信息也被复制到新的安装环境中,这样就实现了对BDE的自动安装和动态配置。
3.2 动态配置ODBC数据源
在实际的控制系统中,数据库是常见的子模块,同Delphi接口比较方便的是ODBC数据源,作为成熟的商业软件,手动配置ODBC数据源是不可取的。这就需要安装过程中自动配置ODBC数据源,这个功能可以通过写注册表来实现,也可通过API调用Windows动态链接库ODBCCP32中的函数SQLConfigDataSource来实现。下面以Delphi程序中调用API函数配置SQLSERVER数据源,介绍如何在程序中动态配置数据源。首先创建一个基于Delphi的控制台程序ConfigODBC,程序主要代码如下:
program ConfigODBC; {$APPTYPE CONSOLE}
uses SysUtils;
//函数声明
function SQLConfigDataSource(
hwndParent: Integer;
fRequest: LongInt;
lpszDriverString: string;
lpszAttributes: string
): LongBool; stdcall; external 'ODBCCP32.DLL';
begin //函数调用
SQLConfigDataSource(0,
1, //~换成Handle就是手工配置
'SQL Server', //数据库类型
'DSN=OilData'#0 + //数据源名称
'Server=(local)'#0 + //SQLSERVER服务器名
'Database=OilTankData'#0 + //数据库名称
'Description=储油罐综合测量系统中动态配置ODBC'#0 //描述
);
end.
通过对控制台程序的编译、调试、运行,制作成可执行程序ConfigODBC.exe文件,将该文件拷贝到Inno Setup 脚本文件所在目录下,然后打开Inno Setup脚本文件,写入以下代码即可。
[Files]
Source: "ConfigODBC.exe"; DestDir: "{tmp}"
[Run]
Filename: "{tmp}ConfigODBC.exe";
3.3 ActiveX控件注册
Delphi工程中经常用到自己编写的ActiveX控件,必须注册后才能运行,在Inno Setup中注册的方法很简单,只要把控件打包到应用程序目录下的时候加上适当的关键词即可。例如,微软的MSComm控件有丰富的与串口通信密切相关的属性及事件,提供了一系列标准通信命令的接口,可以用它创建高效实用的通信程序。Delphi环境下开发软件使用前,我们可以手动进行注册。然而,对于Delphi开发的软件经打包制作的安装程序能正常使用,仍然需要将该控件打包进去,随着应用程序的安装进行注册以供使用。在Inno Setup中,可以这样实现其功能,即在[Files]段当中,加入类似于这样的脚本即可:
[Files]
Source:"MSCOMM32.OCX"; DestDir:"{sys}"; Flags:restartreplace uninsneveruninstall sharedfile regserver
其中关键词:Source:"MSCOMM32.OCX"表明要安装的源文件;DestDir:{sys}表明文件的目标目录是系统的系统文件目录;Flags为文件安装方式的关键词,restartreplace表明替换时要重新启动,uninsneveruninstall sharedfile表明此文件是反安装时不卸载的共享文件;Inno Setup据关键词sharedfile regserver编译后,生成的安装文件会自动注册MSCOMM32.OCX控件。其他OCX或者DLL文件可做类似处理。
4 结束语
以上通过应用Inno Setup工具对Delphi应用程序进行安装制作方法的研究,从中可以体会到Inno Setup是一个容易使用、功能强大的安装制作工具,其源码公开且打包出的安装文件可以做商业用途,免除了使用者的后顾之忧,这对工程开发者来说是一个合适的安装制作工具。利用此工具,我们已经成功地为多个应用程序制作了安装程序。
摘要:本文介绍安装制作工具Inno Setup为Delphi应用软件开发相应安装程序,特别对自动安装动态配置BDE数据库引擎、动态配置ODBC数据源、ActiveX控件注册等方面的问题进行了综合研究,并给出了一种解决方法,供软件开发者参考。
关键词:Inno Setup,Delphi,BDE,ODBC
参考文献
[1]陈洪强.自动安装Inno Setup打包程序[J].视窗世界,2004(3):101-102.
[2]陈豫龙,何旭洪.Delphi6数据库系统开发实例导航[M].北京:人民邮电出版社,2002.
[3]郑汉垣.Delphi数据库应用程序的BDE安装与配置[J].闽酉职业大学学报,2001(12):81-83.
【黑马程序员面试技巧】推荐阅读:
黑马程序员C语言教程:MFC界面分屏操作07-31
黑马程序员_PHP_课程同步笔记day30:PHP类中关键字11-21
四位高考黑马的高考成功秘笈06-25
程序员面试总结06-27
程序员面试常见问题08-20
程序员面试英文自我介绍10-28
JAVA程序员面试经验11-05
腾讯php程序员面试题目08-05
it程序员面试自我介绍08-20