摘要: 1 概述 前段时间摸索在Java中怎么获取系统信息包括cpu、内存、硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插件进行获取。下面列举出了这两种方式获取系统信息的方式及代码。 2 使用Java自带包获取系统信息 2.1 使用Java自带包获取系统信息代码如下: 2.1.1 Bytes.javapublic...
阅读全文
一、内容提要:
1、5W3H
2、8D/5C报告
3、QC 旧七大手法
4、QC 新七大手法
5、ISO/TS16949 五大核心手册
6、10S/五常法
7、7M1E
8、SPC八大判异准则/三大判稳原则
9、IE 七大手法
10、ISO知识大总结
二、详细内容规纳:
1、5W3H思維模式
What,Where,When,Who,Why,How,How much,How feel
(1) Why:为何----为什么要做?为什么要如此做(有没有更好的办法)? (做这项
工作的原因或理由)
(2) What:何事----什么事?做什么?准备什么?(即明确工作的内容和要达成的目标)
(3) Where:何处----在何处着手进行最好?在哪里做?(工作发生的地点)?
(4) When:何时----什么时候开始?什么时候完成? 什么时候检查?(时间)
(5) Who:何人----谁去做? (由谁来承担、执行?)谁负责?谁来完成?(参加人、负责人)?
(6) How:如何----如何做?如何提高效率?如何实施?方法怎样?(用什么方法进行)?
(7) How much:何价----成本如何?达到怎样的效果(做到什么程度)? 数量如果?质量水平如何?费用产出如何?
概括:即为什么?是什么?何处?何时?由谁做?怎样做?成本多少?结果会怎样? 也就是:要明确工作/任务的原因、内容、空间位置、时间、执行对象、方法、成本。
再加上工作结果(how do you feel),工作结果预测,就成为5W3H
2、8D/5C报告
(1)8D报告:
D0:准备
D1:成立改善小组
D2:问题描述
D3:暂时围堵行动
D4:根本原因
D5:制订永久对策
D6:实施/确认PCA
D7:防止再发生
D8:结案并祝贺
(2)5C报告:5C报告是DELL为质量问题解决而提出来的,即五个C打头的英文字母的缩写:描述;围堵措施;原因;纠正措施;验证检查。相比于8D报告简单了些,但是基本思想相同
为了书写更优良的5C报告,需要遵守“5C”准则:
C1:Correct(准确):每个组成部分的描述准确,不会引起误解;
C2:Clear(清晰):每个组成部分的描述清晰,易于理解;
C3:Concise(简洁):只包含必不可少的信息,不包括任何多余的内容;
C4:Complete(完整):包含复现该缺陷的完整步骤和其他本质信息;
C5:Consistent(一致):按照一致的格式书写全部缺陷报告。
3、QC 旧七大手法
(1)鱼骨图(又叫鱼刺图、树枝图、特性要因图、因果图、石川图)(Characteristic Diagram):鱼骨追原因)。(寻找因果关系)
(2)层别法Stratification:层别作解析。 (按层分类,分别统计分析)
(3)柏拉图(排列图)Pareto Diagram:柏拉抓重点。 (找出“重要的少数”)
(4)查检表(检查表、查核表 )Check List:查检集数据。 (调查记录数据用以分析)
(5)散布图Scatter Diagram:散布看相关。 (找出两者的关系)
(6)直方图<层别法(分层图)>Histogram:直方显分布。 (了解数据分布与制程能力)
(7)管制图(控制图)Control__ chart:管制找异常。 (了解制程变异)
4、QC 新七大手法
(1)关系图法(关联图法);
(2)KJ法(亲和图法、卡片法);
(3)系统图法(树图法);
(4)矩阵图法;
(5)矩阵数据分析法;
(6)PDPC法(Process Decision program__ chart 过程决策程序图法)或重大事故预测图法;
(7)网络图法(又称网络计划技术法或矢线图也叫关键路线法)
5、ISO/TS16949 五大核心手册
(1)FMEA(潜在失效模式及后果分析)(Potential failure mode and effects Analysis);
(2)MSA(量测系统分析);
(3)SPC(统计制程管制)(Statistical Process Control);
(4)APQP(产品质量先期策划和控制计划)(Advanced Product Quality Planning (APQP) and Control Plan);
(5)PPAP(生产件批准程序)(Production Part Approval Process)五大手册中最重要的是APQP
6、10S/五常法
(1)由5S续出来的10S
1S:整理(SEIRI)
2S:整顿(SEITON)
3S:清扫(SEIS0)
4S:清洁(SEIKETSI)
5S:素养(SHITSIJKE)
6S:安全(SAFETY)
7S:节约(SAVING)/速度(speed)
8S:服务(SERVlCE)
9S:满意(SATISFICATl0N)
10S:坚持
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
学习
QTP或者其他相关任何工具的方法都是首先把基本的概念过一遍。正所谓砍柴不怕磨刀功,一旦你对这些概念熟悉了,你就可以
学习该工具的高级部分了。写这篇
文章的目标是列出初学QTP的人应该掌握的所有基本概念。对于那些曾经接触过qtp人来说,可以看下这篇文章介绍的checklist,看下自己对这些基础概念是否有遗漏
QTP的基本概念
QTP是什么?这个应该你第一次接触这个工具脑子想到的问题,你还会想QTP可以用来做什么类型的
测试,并且它可以支持什么类型的应用以及QTP最新版本会有什么好东东,我可以从那可以把它下载下来,不同许可证的模式有什么不同,等等
设么样的应用和
测试用例可以考虑用QTP进行自动化.在你开始准备用QTP进行自动化项目之前,这个重要的概念是必须要看的。你应该分析手动用例和应用程序看下他们是否可以被自动化,如果他们可以自动化,你应该了解是否真正可以从
自动化测试用例中得到收益熟悉QTP工具.在开始用QTP创建测试脚本之前,你应该需要熟悉QTP工具,了解工具里的各种窗格(比如工具栏)。你需要知道这些菜单栏和窗体的具体功能是什么测试对象和对象库.你应该知道什么是对象,对象的层级结构,用QTP怎么来识别对象以及怎么能识别到测试对象的唯一识别属性。你应该也要知道什么是对象库,以及我们为什么要用它,你是怎么把对象添加到对象库里的创建测试脚本/Actions.现在来到脚本部分了,你应该用录制和回放的方法来创建和运行测试脚本。结合录制和回放的方法,在对象库分配到你的action后,就应该能'写'你的脚本了分析你的测试运行结果.一旦运行完测试脚本,你就可以分析测试运行结果。你可以找出那些步骤是通过了,那些是失败了。你也可以在运行结果里找出测试流程
创建和使用函数库.你应该可以在你的测试用例里找出可以重用的流程。你应该能为重用的流程编写用户定义的函数。你应该也能创建新的函数库,添加一些重用的函数到这些函数库里,然后把函数库与你的测试脚本相关联,就可以在脚本里调用这些函数了使用数据表格(DataTable).你应该知道你怎么可以在你的测试脚本里使用DataTable里的数据,你应该也知道怎么从Excel里取出数据,然后在脚本里使用它调试的基本知识.你应该对在QTP里的调试有一个清晰的理解,你应该知道怎么在你的代码里使用断点。你应该也知道在运行你的脚本的时候,怎么使用debug viewer如果你对这些概念都很熟悉了,那么你可以放心,你已经对QTP的基本概念有一个好的理解了。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
无聊写的一个小小的程序,主要功能如下:
1,从自有API接口获取所有的外网IP段;
2,用Nmap 遍历扫描所有的IP段,-oX 生成XML的扫描报告;
3,用xml.etree.ElementTree模块方法读取XML文件,将ip,开放端口,对应服务等写入
Mysql数据库。
功能很简单,没有满足老大高大上的需求,所以这个小项目就这么英勇的挂掉了!~~~完全都还没考虑程序异常终止,扫描服务器异常歇菜的情况。
贴上代码:
#coding:utf-8 import sys,os,time,subprocess import MySQLdb import re,urllib2 import ConfigParser from IPy import IP import xml.etree.ElementTree as ET nowtime = time.strftime('%Y-%m-%d',time.localtime(time.time())) configpath=r'c:\portscan\config.ini' #传入api接口主路径,遍历获取所有的ip列表,用IPy模块格式成127.0.0.1/24的格式 def getiplist(ipinf): serverarea=['tj101','tj103','dh','dx'] iplist=[] for area in serverarea: ipapi=urllib2.urlopen(ipinf+area).read() for ip in ipapi.split('\n'): #判断如果ip列表不为空,转换成ip/网关格式,再格式化成ip/24的格式 if ip: ip=ip.replace('_','/') ip=(IP(ip)) iplist.append(str(ip)) ipscan(iplist,nmapathx) #传递ip地址文件和nmap路径 def ipscan(iplist,nmapath): #古老的去重,对ip文件中的ip地址进行去重 newiplist=[] scaniplist=[] for ip in iplist: if ip not in newiplist: newiplist.append(ip) #遍历所有ip段,批量扫描,生成xml格式报告 for ip in newiplist: filename=nowtime+ip.split('/')[0]+'.xml' filepath=r"c:\portscan\scanres\\" nmapcmd=nmapath+' -PT '+ip.strip('\r\n')+' -oX '+filepath+filename os.system(nmapcmd) scaniplist.append(ip) writeinmysql(scaniplist) #入库模块是某大婶发写好的给我 我只是简单修改了哈,主要是xml.etree.ElementTree模块。 def writeinmysql(scaniplist): filepath=r"c:\portscan\scanres" for ip in scaniplist: xmlfile=filepath+'\\'+ip+'.xml' root=ET.parse(xmlfile).getroot() allhost=root.findall('host') conn=MySQLdb.connect(host='10.1.11.11',user='nxadmin',passwd='nxadmin.com',port=3306,db='scandatabase',charset='utf8') cur= conn.cursor() for host in allhost: address = host.find('address') #首先判断端口是不是open的,如果是再进行入库 for port in host.find('ports').findall('port'): if port.find('state').attrib['state']=="open": ip=address.attrib['addr'] portval=port.attrib['portid'] state=port.find('state').attrib['state'] sql = "INSERT INTO portscan (ip,port,state) VALUES(%s,%s,%s)" params=[ip,portval,state] cur.execute(sql,params) conn.commit() cur.close() conn.close() if __name__=="__main__": #读取配置文件中要扫描的IP apiurl和nmap安装文件路径 config=ConfigParser.ConfigParser() config.readfp(open(configpath,'rb')) nmapathx=config.get('nmap','nmapath') ipinf=config.get('ip','ipinf') getiplist(ipinf) |
配置文件c:\portscan\config.ini中主要是api接口主url,nmap安装路径。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
我想你一定听过很多人说,
测试应该要涵盖所有状况, 或是抱怨未甚么连简单的东西都没有测试到, 或者测试为什么需要这么多时间....
这是因为他们对测试这个活动的本质有点误解, 他们不知道
软件测试是sampling的活动. 即然是取样, 自然不会涵盖所有状况; 有可能你选样不好, 导致某些状况漏掉; 或者是随着你取样的多寡, 自然需要花的时间也就不同.
这时候你会问, 为什么软件测试是sampling的活动?
这个问题的答案是, 因为可以测试的组合是无限多种, 你不可能有无限的时间去做测试, 因此你必须挑选一些有代表性的来测试, 希望他能够涵盖大部分的状况, 让你投资较小的资源, 得到最大的效益.
这时候你又问到, 为什么测试的组合是无限多种呢?
这是我们试想有一个程序, 当你按空格键时, 会显示图案在屏幕上, 按其他按键则不会显示任何东西.
当你使用黑箱测试的方法, 也就是在不知道程序内容状况下测试, 你会如何进行一个完整的测试?
把所有按键都按一次, 看看是否照预期的结果运作. 这样就好了吗?
程序设计师若是设定连按八次return键也出现同样的效果, 你怎么会知道呢? 若是要防止这样的事情, 你要试多少种组合才能发现? 答案可能无限次.
你会说不可能有能写这样的程序, 那你说
微软复活节彩蛋的程序是怎么出来的? 那些银行后门程序又是怎么来的?
那你会说如果可以做白箱测试就可以避免这样的状况. 是吗? 事实上是不可能的
第一, 通常程序的行数都是很庞大的, 第二, 即使程序不长, 但是程序读入的data, 它的值域是很庞大的, 若是32 bits的 integer, 范围是2147483647~-2147483648(大约是这样, 我没有记太清楚), 你如何确保每个数字进去都正确, 而且你可能是不只一个data. 所以二者组合起来, 应该也是一个天文数字吧!!
所以到这里你可以知道要测试的状况是无限的, 你不可能有完整测试. 因此你必须要sampling.
我想可以从测试方法中, 来印证测试真的是sampling. 你知道为什么会有statement coverage, branch coverage 或是decision coverage吗?
当初科学家在想有这么多组合, 那要怎么挑选
test case呢? 那找会经所有statements的test cases, 这样会把所有 statement都测过. 可是后来有人想, 即使测过所有statements, 还是会漏掉一些branch不会经过, 所以这样的取样不够好, 因此改成取样会经过所有branch的test cases. 可是后来又想经过所有branch, 还是不足, 因为有些decision 不会包含.
因此你会发现到, 每种测试方法都是在取样, 只是取样方法不同, 严谨度不同, 因此会有不同种类或数量的test case出来.
看到这里, 你会知道测试是测不完的, 因为组合真的太多了. 我们可以做的, 是加强取样的能力. 不过要小心的是, 不要选太多没有价值也就是没有代表性的test cases, 那不会有什么帮助的.
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
今天在项目中再次碰到了问题,就是Combobox中的值如果是直接绑定很简单。简单添加项就行了。代码如下:
<ext:ComboBox ID="ComBox_SecretsLevel" runat=" server" FieldLabel="密级" Width="250" EmptyText="请选择密级..." > <Items> <ext:ListItem Text="公开" Value="1"/> <ext:ListItem Text="保密" Value="2" /> <ext:ListItem Text="绝密" Value="3" /> </Items> </ext:ComboBox> |
找了下网上的质量好像挺少的,去官网找了些Combobox的例子。虽然不是写死在控件上,但是发现他也只不过是通过获取后台的数组,然后绑定数据来操作的,也没有真正的操作数据库。于是我通过尝试,结合了例子和实际,实现了绑定后台数据库的要求,这边与大家分享下。
这边数据库中的参数及值如图:
获取表中数据只要简单的sql查询语句,这边就不详细讲解了。
在页面中,首先是aspx页面的代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LR_FileReg.aspx.cs" Inherits="EasyCreate.DFMS.WebUI.LR_FileReg" %> <%@ Register assembly="Ext.Net" namespace="Ext.Net" tagprefix="ext" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>绑定Combobox后台数据</title> </head> <body> <form id="form1" runat="server"> <ext:ResourceManager ID="ResourceManager1" runat="server"/> <ext:Store ID="Store_SecretsCom" runat="server"> <Reader> <ext:JsonReader> <Fields> <ext:RecordField Name="SecretsLevelID" Type="Int"/> <ext:RecordField Name="SecretsLevelName" Type="String" /> </Fields> </ext:JsonReader> </Reader> </ext:Store> <ext:ComboBox ID="ComBox_SecretsLevel" runat="server" FieldLabel="密级" Width="250" EmptyText="请选择密级..." StoreID="Store_SecretsCom" ValueField="SecretsLevelID" DisplayField="SecretsLevelName"> </ext:ComboBox> </form> </body> </html> |
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
前述
昨天想直接复制虚拟机centos系统中命令行的内容到主机的txt文档上进行保存,发现不能实现虚拟机与主机之间的直接通讯,后来查资料发现原来是由于我的虚拟机没有安装vwmare tools的缘故。
一个下午查资料下来,搞定了cdrom镜像,挂载,挂载目录之间的关系,但是有个问题是明明是挂载上了,但是打开挂载目录没有看到想要的安装包。后来询问博客园的朋友才发现是我的centos版本有问题,大概是由于我的版本是livecd类型,切换cdrom的iso镜像时失败了导致。
早上回来,新建了一个虚拟机,再把livecd安装到硬盘上,再进行挂载,就成功了!
介绍
VMware Tools是VMware虚拟机中自带的一种增强工具,相当于VirtualBox中的增强功能(Sun VirtualBox Guest Additions),是VMware提供的增强虚拟显卡和硬盘性能、以及同步虚拟机与主机时钟的驱动程序。
只有在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由
移动(不用再按ctrl+alt),且虚拟机屏幕也可实现全屏化。
VMware 强烈建议你在每一台虚拟机中完成
操作系统安装之后立即安装 VMware Tools 套件。在客户操作系统中安装 VMware Tools 非常重要。最重要的是安装后在主机和客户机之间或者从一台虚拟机到另一台虚拟机可以进行复制和粘贴操作
1.安装环境介绍
#虚拟机版本:VMware-workstation-full-10
#linux分发版本:CentOS-6.4-i386-LiveCD
#安装虚拟机,安装目录:C:\Program Files (x86)\VMware
#新建虚拟机:使用CentOS-6.4-i386-LiveCD.iso镜像新建一个2G或以上内存的centos系统,记得是2G或以上内存,否则后面的intall to hard drive无法进行。
注意:新建过程中记住其中设置的账户密码,它就是后面su root时要求输入的密码。
#安装到硬盘(intall to hard drive):因为我用的linux镜像是livecd(它可以通过光盘启动电脑,启动出一个系统,这个系统在使用上和安装到硬盘上的是一样的,就是启动时速度比较慢),启动系统时需要用到虚拟机-设置-CD/DVD-->使用ISO镜像文件,其中的镜像文件就是CentOS-6.4-i386-LiveCD.iso。当我们以livecd的形式启动系统时,再进行切换其中的iso镜像文件操作,系统会给予警告:系统已锁定cdrom...就算你按确定进行切换,实际上也是切换失败的,因为当前的iso正是用于当前的系统嘛,正在被占用,肯定不给你切换啦~
写下以上的说明是由于按照VMware tools时需要用到另一个镜像文件啦~
所以我们必须将linux系统安装到硬盘上,这样启动系统时就不需要镜像文件了~
安装过程很简单,主要是设置时间,语言,用户名和密码,太复杂的我也不懂啦。记住用户名和密码哦~~
3.安装VMWARE TOOLS
有了以上的准备工作,我们就可以正式开始安装VMWARE TOOLS了~~O(∩_∩)O哈!
以我本地的安装为例:
(1)打开虚拟机后,在CD-ROM虚拟光驱(虚拟机-设置-CD/DVD-->使用ISO镜像文件)中选择使用ISO镜像,找到VMWARE TOOLS安装文件,如C:\Program Files (x86)\VMware\VMware Workstation\linux.iso(这是安装虚拟机时的安装目录下的linux.iso)
(2)启动虚拟机
(3)进入linux新建一个终端,以root身份进入terminal。
(4)退出到windows,在虚拟机菜单栏中点击 虚拟机-> 安装VMWARE TOOLS子菜单,会弹出对话框,点击"确认" 安装。这是虚拟机下方会出现一个说明:
点击帮助,会弹出相应的安装过程说明文件。也可以参考它。
(5 )挂载光驱mount -t iso9660 -o ro /dev/cdrom /mnt (注意命令中输入的空格)这时,你的linux.iso里面的文件就相当于windows光盘里面的文件了。
输入df命令就可以看到如下图的挂载目录:
咦,我明明是把/dev/cdrom挂载到/mnt上面去,为什么这里显示的是/dev/sr0呢?
输入:ls -l /dev | grep cd 可以看到光驱的说明,一般/dev/cdrom指向的是/dev/sr0:
懂了吧,只要出现/dev/sr0挂载到/mnt上,也就是说挂载成功啦。
如果挂载目录错了,可以输入umout /dev/cdrom进行卸载挂载。
我安装时还遇到这样一个问题:我想挂载到/mnt/cdrom,也就是在/mnt下mkdir cdrom,但是系统提示this is read-only system,无法新建目录。其实这时你df命令一下就会发现/mnt其实已经被挂载上了,挂载后就是只可读了~如果目前系统挂载得不对,你可以输入umout /dev/cdrom进行卸载挂载,再进行新建目录操作啦。
(6) 使用 cd /mnt进入光驱,输入ls命令你会查看到有个*.tar.gz格式的文件(如我的是:VMwareTools-9.6.0-1294478.tat.gz),然后输入命令cp VMwareTools-9.6.0-1294478.tat.gz /tmp/将它复制到/tmp/目录下
(7)输入命令 cd /tmp 进入/tmp目录
(8)输入命令tar -zxf VMwareTools-9.6.0-1294478.tat.gz 将刚刚复制的VMwareTools-9.6.0-1294478.tat.gz 解压,默认解压到当前目录下,此时就会多出一个命名为类似于“vmware-tools-distrib”的文件夹,这里和windows 里面的解压结果一样。
(9)输入命令 cdvmware-linux-tools 进入解压后的目录
(10) 输入命令 ./*.pl 运行安装VMware tools (我的*.pl文件是:vmware-install.pl)
(11)在运行安装过程中,它会一步一步的有问题提出要你回应,此过程中,你只要见到问题后面显示[yes]、[no]、[yes/no]的都输入yes,然后回车,其他的问题后面不管[ ]里面是什么直接回车就好
(12)安装完成后,选择虚拟机上方的:虚拟机-设置-选项-客户机隔离,勾选“启用复制粘贴”,然后重启centos系统,就可以实现在虚拟机系统与主机系统之间复制,粘贴文字,以及文件可以直接在两系统间拖动了。
ps:mount命令介绍
命令格式:mount [-t vfstype] [-o options] device dir
1.-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs
2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
3.device 要挂接(mount)的设备。
4.dir设备在系统上的挂接点(mount point)。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
因为
工作需要写一份SO文件,作为
手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例
1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld 6 { 7 private native void print(); 8 public static void main(String[] args) 9 { 10 new HelloWorld().print(); 11 } 12 13 static 14 { 15 System.loadLibrary("HelloWorld"); 16 } 17 } 18 // 注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码段的System.loadLibrary调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。 19 // 编译HelloWorld.java 20 // 在命令行中运行如下命令: 21 javac HelloWorld.java 22 // 在当前文件夹编译生成HelloWorld.class。 23 // 生成HelloWorld.h 24 // 在命令行中运行如下命令: 25 javah -jni HelloWorld 26 // 在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码: 27 /* DO NOT EDIT THIS FILE - it is machine generated */ 28 #include <jni.h> 29 /* Header for class HelloWorld */ 30 31 #ifndef _Included_HelloWorld 32 #define _Included_HelloWorld 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 /* 37 * Class: HelloWorld 38 * Method: print 39 * Signature: ()V 40 */ 41 JNIEXPORT void JNICALL Java_HelloWorld_print 42 (JNIEnv *, jobject); 43 44 #ifdef __cplusplus 45 } 46 #endif 47 #endif 48 // 该文件中包含了一个函数Java_HelloWorld_print的声明。这里面包含两个参数,非常重要,后面讲实现的时候会讲到。 49 // 实现HelloWorld.c 50 // 创建HelloWorld.c文件输入如下的代码: 51 #include <jni.h> 52 #include <stdio.h> 53 #include "HelloWorld.h" 54 55 JNIEXPORT void JNICALL 56 Java_HelloWorld_print(JNIEnv *env, jobject obj) 57 { 58 printf("Hello World!\n"); 59 } 60 // 注意必须要包含jni.h头文件,该文件中定义了JNI用到的各种类型,宏定义等。 61 // 另外需要注意Java_HelloWorld_print的两个参数,本例比较简单,不需要用到这两个参数。但是这两个参数在JNI中非常重要。 62 // env代表 java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接口来转换成C类型的,就是通过调用env方法来完成转换的。 63 // obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通过操作这个对象来完成。 64 // 编译生成libHelloWorld.so 65 // 在 Linux下执行如下命令来完成编译工作: 66 cc -I/usr/lib/jvm/java-6-sun/include/linux/ 67 -I/usr/lib/jvm/java-6-sun/include/ 68 -fPIC -shared -o libHelloWorld.so HelloWorld.c 69 // 在当前目录生成libHelloWorld.so。注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h。 70 // 另外一个值得注意的是在HelloWorld.java中我们LoadLibrary方法加载的是“HelloWorld”,可我们生成的Library却是libHelloWorld。这是Linux的链接规定的,一个库的必须要是:lib+库名+.so。链接的时候只需要提供库名就可以了。 71 // 运行Java程序HelloWorld 72 // 大功告成最后一步,验证前面的成果的时刻到了: 73 java HelloWorld 74 // 如果你这步发生问题,如果这步你收到java.lang.UnsatisfiedLinkError异常,可以通过如下方式指明共享库的路径: 75 java -Djava.library.path='.' HelloWorld 76 // 当然还有其他的方式可以指明路径请参考《在Linux平台下使用JNI》。 77 // 我们可以看到久违的“Hello world!”输出了。 |
试着去完成,自己生成了一份com_test_GetMsg.h头文件,并完成test.c,生成libtest.so文件,JAVA调用SO文件时,屡次报:
failed: Cannot load library: load_library(linker.cpp:761): not a valid ELF executable: /data/app-lib/com.example.iccommtest-libtest.so
也就是提供的SO无法load,是valid的。
注意,刚才引用的实例是JAVA调用SO,而我需要的是android调用SO,不然会频繁上面错误。
原因有两点:
1、JAVA和android的虚拟环境不一样
2、Linux和android的系统库文件不一样
这样导致了在Linux下通过JNI标准命名方式编译的SO文件,在android是调用失败的,原因是Linux和android的系统库不一样,而生产的SO跟生产环境库文件有依赖关系,然后搭建了NDK和Cywin环境,然后生产的SO可以被android调用,
那么SO文件就必须完全遵循JNI命名规则,方法名是这样:
/* * Class: com_samples_jni_test * Method: GetMsg * Signature: ()V */ JNIEXPORT jstring JNICALL Java_com_samples_jni_test_GetMsg (JNIEnv *, jobject); |
通过NDK和Cywin生产libtest.so,android调用成功!
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
空降到新公司做
测试部门的部门经理有一年了,回头看看,才发现自己有多勇敢和幸运。和我同一批空降过来的,还有两位研发方向的副总,一位项目总监;其中一 位副总来了不到3个月就走了,项目总监坚持了10个月,另一位副总熬了11个月,都不满1年。
比我们这批早来几个月的,还有2名市场营销方向的副总,也只 干了半年左右就悻悻离开,其中一位曾经在公司干过五六年,辞职若干年后又回来。和我一样能干满一年的,只剩下一位比我早来几个月的财务总监。
总结一下,大 体有以下几种原因。其一,没有实权,定位模糊。新公司出于延揽人才的需要,给予空降人员很高的头衔,比如副总和总监,但在实际组织架构中,实权掌握在部门 经理手中,副总和总监手下一个直接汇报对象都没有,更多是起到顾问和参谋的作用,这让想干一番事业,在过往各自公司中都担当过封疆大吏的人极其不爽。更让 他们不可接受的,是好几个月过去了,公司也没给出明确的
工作内容和责任边界。其二,缺乏信任。相比新来的高管,老板更信任几名跟随自己南征北战多年的中 层,重要的事情一概和老中层商议,新高管空挂个头衔,连会议通知都得不到。想获得深度信任,没个两三年时间根本没可能。其三,组织架构和汇报关系不清晰, 管理相对不规范,典型的夫妻店公司。这让习惯了规范化管理的新高层极不适应。其四,在招聘
面试环节,信息双向沟通不充分,在工作一段时间后,公司和新高管 都发现对方未能达到自己的期望。我和财务总监能相对顺利地留下来,原因差不多,都是因为公司对我们两个人的需求和定位相对明确,而且是刚性需求:公司想上市,需要一名有注册会计师资格的CFO;公司想整合原有的两个小测试部门为一个公司级的大测试部门,内部实在没有合适人选,原有的两个测试主管,一个正在休产假,一个在孕期即将休产假。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters
随着竞争的日益激烈,如何降低成本越来越成为企业要解决的问题。对
手机生产企业来讲,这涉及到原材料的进货渠道、销售情况及库存等方面的管理,管理的好坏对企业至关重要。而对手机经销商而言,渠道扁平化已是大势所趋,这使经销商对产品的进销存合理化提出了更高的要求。概括地讲,用户对进销存管理系统的需求具有普遍性。手机进销存管理系统适用于采购、销售和仓库部门,对采购、销售及仓库的业务全过程进行有效控制和跟踪。手机进销存管理系统可有效减少盲目采购、降低采购成本、合理控制库存、减少资金占用并提高市场灵敏度,提升企业市场竞争力。
手机进销存管理系统功能需求,主要包括基础设置、供应商业务。
一、基础设置:
包括机构设定、各机构操作人员的设定、公司员工及工资级别信息的设置、账户信息设置、供应商类别及供应商信息的设置、客户类别及客户信息设置、手机型号、配件、内配型号设定及费用类别、收支项目等信息的设置。
通过以上基础信息的设置、完成系统基础数据的录入、为其他业务提供数据基础。
二、供应商业务:
包括手机入库、配件入库、内配入库、现金返利、库存业务、配送管理、财务管理、售后维修管理、办公管理
手机进销存管理系统的技术特点应具备实用性、开放性、安全性、扩展性和稳定性。
通过手机进销存管理系统不仅仅体现在管理效率的提高,还能通过服务的加强、迅速的反应速度、提升的管理层次,使企业实现更高的管理和发展目标。
供销存管理信息化不仅仅是信息技术的简单采用,而是企业借助信息技术的工具,引进新的管理思想和模式,使企业的管理层次得到进一步提升,对于包括手机销售在内的中小型企业来说,拥有很明显的优势。同时,由于信息化技术的发展,相关设备的价格迅速下降,使得信息化管理建设的门槛降低,再加上手机销售企业本身的日渐成熟,对企业形象、发展的考虑也越来越多,综合各方面因素,手机企业实现信息化,目前是一个非常好的时期,也是一种必然趋势。
English » | | | | | | | | |
Text-to-speech function is limited to 100 characters