Can’t get hostname for your address
skip-name-resolve #加上这一个属性
元素中的用来为该持久化类的实例生成唯一的标识,hibernate提供了很多内置的实现。
Increment:由hibernate自动递增生成标识符,用于为long, short或者int类型生成唯一标识。 identity :由底层数据库生成标识符(自动增长),返回的标识符是 long, short 或者int类型的。 sequence :hibernate根据底层数据库序列生成标识符,返回的标识符 是long, short或者 int类型的。
hilo :使用一个高/低位算法来高效的生成long, short 或者int类型的标识符。 uuid.hex :用一个128-bit的UUID算法生成32位字符串类型的标识符。 native :根据底层数据库的能力选择identity, sequence 或者hilo中的一个。 assigned :让应用程序在save()之前为对象分配一个标示符。 foreign :使用另外一个相关联的对象的标识符。和联合一起使用。
package web;
import web.sys.Globals;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class SqlFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
req.setCharacterEncoding("GBK");
res.setCharacterEncoding("GBK");
//获得所有请求参数名
Enumeration params = req.getParameterNames();
String sql = "";
while (params.hasMoreElements()) {
//得到参数名
String name = params.nextElement().toString();
//得到参数对应值
String[] value = req.getParameterValues(name);
for (int i = 0; i < value.length; i++) {
sql = sql + value[i];
}
}
//有sql关键字,跳转到error.html
if (sqlValidate(sql)) {
res.sendRedirect("/"+Globals.APP_BASE_NAME+"/include/404error.html");
//String ip = req.getRemoteAddr();
} else {
chain.doFilter(req, res);
}
}
//效验
protected static boolean sqlValidate(String str) {
str = str.toLowerCase();//统一转为小写
String badStr = "and|exec|execute|insert|create|drop|table|from|grant|use|" +
"group_concat|column_name|information_schema.columns|table_schema|" +
"where|select|delete|update|order|by|*|chr|char" +
"|declare|;|--|+|,|%|#";//过滤掉的sql关键字,可以手动添加 qxmore000400010009
String[] badStrs = badStr.split("\\|");
for (int i = 0; i < badStrs.length; i++) {
if (str.indexOf(badStrs[i]) != -1) {
return true;
}
}
return false;
}
public void init(FilterConfig filterConfig) throws ServletException {
//throw new UnsupportedOperationException("Not supported yet.");
}
public void destroy() {
//throw new UnsupportedOperationException("Not supported yet.");
}
}
cmd telnet 192.168.1.1 root root
sendcmd 1 DB p UserInfo
看telecomadmin后面8位数,就是超级密码
在网站根目录下的子目录uc_server/data中打开找到文件config.inc.php 以及 config/config_global.php、config/config_ucenter.php (这两个如果没有下面代码可以不用修改) 找到类似以下代码: define(‘UC_FOUNDERPW’, ’256955f2e034sad74f0e2953572ea360′); define(‘UC_FOUNDERSALT’, ’217804′);
然后用以下代码替换 define(‘UC_FOUNDERPW’, ’047099adb883dc19616dae0ef2adc5b6′); define(‘UC_FOUNDERSALT’, ’311254′);
修改完后,Ucenter创始人的密码就变为: 123456789
package web.common.util;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.io.IOException;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @author Wizzer.cn
* @time 2012-9-13 上午10:54:04
*
*/
public class ImageUtil extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String CONTENT_TYPE = "image/jpeg;charset=GB2312";
private static final String allcode[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9" };
private static final Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体
public static Font IFont = new Font("宋体", Font.PLAIN, 18);// 设置字体
public static int x = 10; // 坐标
public static int y = 10;
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
ServletOutputStream out = response.getOutputStream();
getImage(out, request, response);
out.close();
}
private void getImage(ServletOutputStream out, HttpServletRequest request,
HttpServletResponse response) {
try {
HttpSession session = request.getSession(true);
response.setContentType("image/gif");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); // 设置图片大小的
Graphics gra = image.getGraphics();
Random random = new Random();
gra.setColor(getRandColor(200, 250)); // 设置背景色
gra.fillRect(0, 0, width, height);
gra.setColor(Color.black); // 设置字体色
gra.setFont(mFont);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
for (int i = 0; i < 100; i++) {
gra.setColor(getRandColor(120, 220));
x = random.nextInt(width);
y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
gra.drawLine(x, y, x + xl, y + yl);
}
// 取随机产生的认证码(4位)
String sRand = "";
for (int i = 0; i 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
public static Font getIFont() {
return IFont;
}
public static void setIFont(Font IFont) {
ImageUtil.IFont = IFont;
}
public static int getY() {
return y;
}
public static void setY(int y) {
ImageUtil.y = y;
}
public static int getX() {
return x;
}
public static void setX(int x) {
ImageUtil.x = x;
}
}
若提示找不到包:
import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder;
则做如下修改即可:
Eclipse 默认把这些受访问限制的API设成了ERROR。
只要把 Deprecated and restricted API中的Forbidden references(access rules) 选为Warning 就可以编译通过。

作者:wtmdbf
从从上可以看出,notepad的下划线是在产生新的行以后才绘制出来的,为了读者阅读的方便,我把notepad的源码贴出来如下:
public static class LinedEditText extends EditText {
private Rect mRect;
private Paint mPaint;
// This constructor is used by LayoutInflater
public LinedEditText(Context context, AttributeSet attrs) {
super(context, attrs);
// Creates a Rect and a Paint object, and sets the style and color of the Paint object.
mRect = new Rect();
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(0x800000FF);
}
/**
* This is called to draw the LinedEditText object
* @param canvas The canvas on which the background is drawn.
*/
@Override
protected void onDraw(Canvas canvas) {
// Gets the number of lines of text in the View.
int count = getLineCount();
// Gets the global Rect and Paint objects
Rect r = mRect;
Paint paint = mPaint;
/*
* Draws one line in the rectangle for every line of text in the EditText
*/
for (int i = 0; i < count; i++) {
// Gets the baseline coordinates for the current line of text
int baseline = getLineBounds(i, r);
/*
* Draws a line in the background from the left of the rectangle to the right,
* at a vertical position one dip below the baseline, using the "paint" object
* for details.
*/
canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
}
// Finishes up by calling the parent method
super.onDraw(canvas);
}
}
那是如何实现我所说的一开始就绘制好下划线的效果呢,在此之前,你需要了解如何在android中获得字体的高度,网上有很多,为了方便大家阅读特摘录如下,先看图:
然后我们可以通过下面的代码获得字体大高度
Paint p = new Paint(); p.setTextSize(50); p.setAntiAlias(true); FontMetrics fm = p.getFontMetrics(); int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);读者了解了上面的知识点以后就可以,在看我是如何实现的。 基本思想是根据字体的高度,在view的对应位置上绘制好每条line,代码如下:
package com.example.customedittext;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.EditText;
public class CustomEditText extends EditText {
private Paint mPaint;
private int lines = 0;
private float fontHeight = 0;
private float leading = 0;
public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initPaint();
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public CustomEditText(Context context) {
super(context);
initPaint();
}
private void initPaint() {
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.parseColor("#CDDCD5"));
mPaint.setAntiAlias(true);
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
int lineHeight = getLineHeight();
int viewHeight = getHeight();
lines = viewHeight / lineHeight;
setGravity(Gravity.TOP);
float textSize = getTextSize();
Paint paint = new Paint();
paint.setTextSize(textSize);
FontMetrics fontMetrics = paint.getFontMetrics();
fontHeight = fontMetrics.descent - fontMetrics.ascent;
leading = fontMetrics.leading;// leading == 0
setBackgroundColor(Color.parseColor("#F8F6DF"));
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
int count = getLineCount();
if (count <= lines) {
for (int i = 1; i < lines; i++) {
canvas.drawLine(0, fontHeight * i + leading * i, getWidth(),
fontHeight * i + leading * i, mPaint);
}
} else {
for (int i = 1; i < count; i++) {
canvas.drawLine(0, fontHeight * i + leading * i, getWidth(),
fontHeight * i + leading * i, mPaint);
}
}
}
}
Oracle 优化 说到底还是SQL语句的优化,你看人家用MYSQL照样跑千万级数据,一个小应用系统并发量还不及人家的万分之一,那为什么卡甚至程序down掉?转一篇文章来贴一下。
(1)
(17)
转自:
http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html
使用地址:http://www.alplaza.cn/jsq/jsq.html
收房费用计算器 - 交房验房 - 安粮城市广场业主论坛
jQuery(document).ready(function() {
var t;
$("#bt").click(function() {
js();
});
$("#mj").keyup(function() {
ze();
});
$("#dj").keyup(function() {
ze();
});
$("#mj").click(function() {
t = $(this).val();
$(this).val("");
});
$("#dj").click(function() {
t = $(this).val();
$(this).val("");
});
$("#fj").click(function() {
t = $(this).val();
$(this).val("");
});
$("#mj").blur(function() {
if ($(this).val() == "")
$(this).val(t);
});
$("#dj").blur(function() {
if ($(this).val() == "")
$(this).val(t);
});
$("#fj").blur(function() {
if ($(this).val() == "")
$(this).val(t);
});
for (var i = 1; i <= 10; i++) {
$("#f0" + i).keyup(function() {
hj();
});
$("#f0" + i).click(function() {
t = $(this).val();
$(this).val("");
});
$("#f0" + i).blur(function() {
if ($(this).val() == "")
$(this).val(t);
});
}
});
function lk() {
}
function js() {
var st = $("#st").attr("checked");
var mj = parseFloat($("#mj").val());
var fl = 0.02;
if (st && mj = 90 && mj < 144) {
$("#qs").html("2%");
fl = 0.02;
} else {
$("#qs").html("4%");
fl = 0.04;
}
$("#f01").val(parseFloat($("#fj").val()) * fl);
$("#f02").val("5.00");
$("#f03").val(parseFloat($("#fj").val()) * 0.02);
$("#f04").val("80.00");
$("#f05").val("5.00");
$("#f06").val("4.00");
$("#f07").val(parseFloat($("#fj").val()) * 0.0005);
$("#f08").val("0");
$("#f09").val(parseFloat($("#mj").val()) * 1.44 * 6);
$("#f010").val(parseFloat($("#fj").val()) * 0.0001 * -14);
hj();
}
function hj() {
var sum = 0.0;
for (var i = 1; i <= 10; i++) {
sum += parseFloat($("#f0" + i).val());
}
$("#hj").val(sum);
}
function ze() {
var sum = 0.0;
sum = parseFloat($("#mj").val()) * parseFloat($("#dj").val());
$("#fj").val(sum);
}
住房面积:㎡
单价:元
总房款:元 首套房:
税费种类
税率
金额
契税
买卖合同印刷税
公共维修基金
2%
房屋所有权登记费
房屋所有权印花贴
税权证工本费
印花税
0.05%
有线电视开通费
360
物业费(半年)
1.44
逾期交房(14天)
0.01%
合 计:
仅做参考!
var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Ff60828d0b1ab0acb57c4bbec23edd765' type='text/javascript'%3E%3C/script%3E"));
#foreach($key in $yygldwlx.keySet())
key:$!key —>$!yygldwlx.get(“$!key”)
#end
SET ORACLE_SID=ORCL sqlplus /nolog SQL> connect / as sysdba SQL> startup
一直想拥有一个开发快捷、界面美观、用户体验好的java开发框架,网罗不来只好自己动手,现在框架基础功能已完成,界面还需要美工优化一下。(以下图片点击查看全图)

1、系统采用国产开源Nutz框架,实现项目的“零配置”(这可比SSH轻松多了),Nutz在一个类中可以随意定义访问地址,返回String、JSON、对象或跳转到具体页面,也可以利用Velocity打印结果; 2、系统集成泽元CMS1.0系统中的弹出窗口及页面验证、控制JS,并结合jquery easyui实现标签页; 3、系统无缝集成jQuery,jquery和nutz真是天作之合,可方便的实现ajax功能,另外你也可以使用velocity在页面输出内容,比较灵活; 4、已完成系统管理模块,数据表设计合理,权限控制到按钮级,可按机构建用户角色等。
下面是一段简单的Nutz类实现,Nutz更多介绍可以访问官网:http://nutzam.com/
@IocBean
@At("/private")//访问路径
@Filters({ @By(type = GlobalsFilter.class) })
public class LoginAction extends BaseAction {
@At //访问路径,不指定则为方法名称,即:/private/logout
@Ok(">>:/private/login")//外连接,跳转到 /private/login
public void logout(HttpSession session) {
session.removeAttribute("userSession");
}
@At("/login")
@Ok("->:/private/login.html")//内连接,输出到 /private/login.html
public void login(HttpServletRequest req) {
req.setAttribute("menulist", "helloworld");//页面可以用velocity语言输出
}
@At
@Ok("raw") //返回字符串类型,也可以是json、对象等
public int Online(@Param("loginname") String loginname,HttpSession session) {
Sys_user user = (Sys_user) session.getAttribute("userSession");
if(user==null){
return -2;
}
if (loginname != null&&!"".equals(loginname)) {
OnlineUtil.addUser(loginname, String.valueOf(1));
}
return OnlineUtil.getOnlineCount(String.valueOf(1));
}
}




之前用phonegap做过Anroid项目,主要功能是人员定位、表单提交、拍照上传、通知提醒等功能,这也是最常用而基本的应用功能,最近打算出iOS版本的客户端,这里简单总结使用phonegap开发的一些经验以及探讨代码在不同手机系统的平移工作。
PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台。这是PhoneGap最大的优点,支持jquery使其开发功能简单而强大。官方网站为 http://www.phonegap.com/ 更新速度较快,一般1个月就会发布一个新版本支持最新版本的手机系统。
既然要实现跨平台开发,大部分功能代码要做到可移植复用,在保持安全性、功能性的基础上尽量使用HTML+JS+PhoneGap API来实现业务功能,尽量避免使用手机系统的SDK开发实现。
UI层使用 Jquery Mobile ,API介绍见 http://www.jqmapi.com ,定义了表单元素、页面和对话框等,和PhoneGap结合使用比较方便。
2.1 数据库操作
PhoneGap API数据库操作是跨平台的,所以这里介绍后iOS段就不再赘述。
var db ;
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
db = window.openDatabase("testdb", "1.0", "MyApp", 12000000);
db.transaction(creatDB,errorDB); //创建表
db.transaction(loginDB,errorDB); //查询表初始化表单
}
function creatDB(tx)
{
tx.executeSql('CREATE TABLE IF NOT EXISTS USER (ID,LOGINNAME,PASSWORD)');
}
function errorDB(err) {
navigator.notification.alert("异常信息: "+err.code,null,"温馨提示","确定");
}
function loginDB(tx) {
tx.executeSql('SELECT * FROM USER', [], querySuccess, errorDB);
}
function querySuccess(tx, results) {
var len = results.rows.length;
if(len>0)
{
$("#loginname").val(results.rows.item(0).LOGINNAME);//LOGINNAME大写
$("#password").val(results.rows.item(0).PASSWORD);
}
}
2.2 表单提交
使用jquery+JSON解析和提交表单,常用示例:
function getData(){
//{"mc":"Hello World!","list":[{"key":"0001","value":"张三"},{"key":"0002","value":"李四"}]}
$.mobile.showPageLoadingMsg( "加载中....." ); //打开加载进度条
$.post(//使用jquery的POST方法 serverurl 放在公共JS里定义
serverurl+ "/json/getdata.jsp",
{
"doAction":"getdata",
"loginname":comHT.get("loginname"),//comHT 定义了从URL获取参数赋值到Hashtable中方法
"password":hex_md5(comHT.get("password")),//hex_md5 实现对密码的加密
"resourceid":"00100002",
"rmd":Math.random()
},
function(data) {
var jsondata = jQuery.parseJSON(data); //解析数据为JSON格式
$("#mc").val(jsondata.mc);//文本框赋值
jQuery.each(jsondata.list, function(index, obj) {
$("#czyy").append(''+obj.value+'');//下拉框架赋值
});
$.mobile.hidePageLoadingMsg(); //关闭进度条
});
}
2.3 拍照上传
使用phonegap提供的API来使用,iOS下代码略有不同,注:此段代码phonegap 为2.0.0
原理是先把文件提交,提交成功后获得服务器真实路径,在表单提交的时候保存进数据库。
function pz(obj,v_zdz) {
zdz=v_zdz;
zpobj = obj;
navigator.camera.getPicture(onSuccess, onFail, {
quality : 25,
destinationType : Camera.DestinationType.FILE_URI
});
}
// 采集操作成功完成后的回调函数
function onSuccess(imageURI) {
zpobj.src = imageURI;
uploadFile(imageURI);
}
// 采集操作出错后的回调函数
function onFail(error) {
}
// 上传文件到服务器
function uploadFile(path) {
var ft = new FileTransfer();
var loginname=comHT.get("loginname");
var options = new FileUploadOptions();
var fn=loginname+"-"+path.substr(path.lastIndexOf('/')+1);
options.fileKey="file";
options.fileName=path.substr(path.lastIndexOf('/')+1);
options.mimeType="image/jpeg";
options.chunkedMode = false;
ft.upload(
path,
serverurl+"/json/upload.jsp?fn="+fn,
function(result) {
var jsondata = jQuery.parseJSON(result.response);
$("#zp"+zdz).val(jsondata.path);
navigator.notification.alert("照片"+zdz+" "+decodeURI(jsondata.res),null,"温馨提示","确定");
},
function(error) {
navigator.notification.alert("照片"+zdz+" 上传失败!"+ error.code,null,"温馨提示","确定");
},
options
);
}
2.4 人员定位
采用百度定位SDK,从用户表中读取用户标识,详细的开发过程过繁琐不写了(好吧,下班了。。),下载和查看百度定位SDK请访问
http://developer.baidu.com/map/geosdk-android-download.htm
2.5 通知提醒
使用androidpn来实现android下消息推送功能,嗯,这个网上教程比较多,大家搜一下吧。
首先搭建iOS开发环境,详见本站教程 /?p=2438 ,目前phonegap 2.5.0支持iOS6.0以下版本,iOS6.1暂时不支持要等phonegap新版咯。
拍照功能需要真机测试,而真机测试需要证书,这大大的头疼,还好找到了方法,就是找到了一篇《Xcode 4.5.2 + iOS 6.0免证书(iDP)开发+真机调试+生成IPA全攻略》文章,哇哈哈,iOS6.1也适应。文章地址 http://www.cnblogs.com/yuanxiaoping_21cn_com/archive/2012/11/15/2772388.html
3.1 数据库操作
同android,略。
3.2 表单提交
同android,略。
3.3 拍照上传
在研究,以后更新。
3.4 人员定位
在研究,以后更新。
3.5 通知提醒
在研究,以后更新。
引入JS和CSS文件:
JS代码:
$('').simpledialog2({
mode: 'button',
headerText: '提示',
headerClose: true,
buttonPrompt: '请选择商品',
buttons : {
'确定': {
click: function () {
//$('#outputbutton1').text('OK');
}
}
}
});
效果如图:
直接贴代码:
Wizzer.cn #goTop {position:fixed;right:20px;bottom:20px;width:40px;height:32px;padding:8px 0 0;background-color:#69c;border-radius:6px;cursor:pointer;} #goTop:hover {background-color:#369;} #goTop:hover .gotop1 {border-left:12px solid #369;border-right:12px solid #369;} #goTop .gotop1 {width:0;margin:0 auto;border-bottom:12px solid #FFF;border-left:12px solid #69c;border-right:12px solid #69c;} #goTop .gotop2 {width:10px;height:10px;margin:0 auto;background-color:#FFF;} a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
function $getId(Id) { return document.getElementById(Id); } var goTop = $getId("goTop"); window.onscroll = function () { if (document.documentElement.scrollTop + document.body.scrollTop > 350) { goTop.style.display = ""; } else { goTop.style.display = "none"; } } goTop.onclick = function () { var Timer = setInterval(GoTop, 10); function GoTop() { if (document.documentElement.scrollTop + document.body.scrollTop < 1) { clearInterval(Timer); } else { document.documentElement.scrollTop /= 1.1; document.body.scrollTop /= 1.1; } } }
1、VMware Workstation Build 9.0.1 + 序列号生成器
磁力链:下载地址1
2、Mac OS X Mountain Lion 10.8.2 build 12C60 原版
磁力链: 下载地址1
3、7z 解压软件
点击打开:下载地址1
4、unlock-all-v110 VMware9 补丁
点击打开:CSDN下载页面
5、UltraISO 9.5.3
点击打开:中关村下载页面
1、下载好Mac OS X安装镜像文件 InstallESD.dmg,使用7z打开,找到子文件夹下面的 installesd.dmg解压出来,再使用 UltraISO 转换格式为 iso 文件。
2、使用序列号生成器生成序列号,安装好VMware9,解压VMware9补丁,找到 unlock-all-v110\windows 下面的install.cmd双击执行。
1、相信大家都使用过VMware,怎么用就不再赘述(不晓得的可以百度或google o(∩_∩)o )

安装补丁后就可以看到 Apple Mac OS X选项。
2、接下来就是配置虚拟机,找到iso文件,启动虚拟机下一步、下一步、下一步……
详细教程可以移步这里:http://bbs.pcbeta.com/viewthread-1130227-1-1.html
3、VMware Tools 安装,配置虚拟机光驱选择 unlock-all-v110\tools 下面的文件 darwin.iso,在mac系统下找到光驱执行安装即可。
安装成功后,mac 支持HD4000、可以全屏、设置分辨率。
1、系统安装成功登陆系统后,在mac系统下访问:
https://developer.apple.com/xcode/
点击页面上的 View Downloads 链接,输入你的Apple帐号密码即可下载。
2、Xcode 4.5.2 变化很大,以前老的教程已经不适用,再也找不到 View-based Application 和 Window-based Application里,这里推荐大家去买个新教程吧,我买了个但为了避免广告就不帖地址了。质量如何还不知道,还没发给我。- –
Firefox插件分为两种,即extension和plugin,网上搜索到的示例多是 XUL应用程序开发,XUL插件安装后需要重启浏览器才能使用,而这篇文章主要介绍如何使用 Add-on 来开发JS+HTML+CSS 应用,如Chrome插件可直接安装使用。
(感兴趣的朋友可以查看本站上一篇文章:chrome插件开发说明,对比一下你会发现chrome插件开发简直太easy – -)
言归正传,Add-on 提供SDK下载和在线开发两种方式,访问 https://builder.addons.mozilla.org/ 通过简单的注册,点击“Create an Add-on Now”,自动生成一个带main.js 的项目,如下图所示,你可以在Data文件夹下上传编辑自己的文件(若上传文件后左侧半天不出来按下F5即可):

Add-on 启动函数为 main.js,这里可以通过 require 申请一些资源权限,而放置在Data用户文件夹里的JS是不能直接使用 require 的,可能是Add-on 框架设计本身就不支持随意的调用系统资源吧,这个时候就得利用 port.on 和 port.emit 来传递变量和执行方法。
网络请求的示例可以访问:https://builder.addons.mozilla.org/package/89576/ 来查看,里面具体介绍了 port.on 和 port.emit 的使用、panel的生成、jQuery的引入、网络请求等,这个例子非常好。
通过查看其他网友分享的代码学习,地址:https://builder.addons.mozilla.org/search/ 输入关键词,查找你关心想实现的功能吧。
具体功能开发不在累述,我写的这个简单查询功能的插件在商城里搜索“合肥公积金查询”即可下载,下载后若你是win7系统,则:
C:\Users\Wizzer\AppData\Roaming\Mozilla\Firefox\Profiles\zah0wctd.default\extensions
找到 wizzer.cn@gmail.com.xpi 解压即可,源代码没加密,给大家做学习参考之用。
其他:
打包:在根文件夹选择所有文件,压缩成zip文件,改后缀名为 xpi。
安装:把xpi文件拖到firefox浏览器中即可。
调试:ctrl—shfit—j 调试插件。
扩展组件在线安装地址:
https://addons.mozilla.org/zh-CN/firefox/addon/%E5%90%88%E8%82%A5%E5%85%AC%E7%A7%AF%E9%87%91%E6%9F%A5%E8%AF%A2/
Chrome插件开发极其简单,只要会JS+HTML+CSS即可,当然我捣鼓的是简单的应用作为学习和验证之用,没有更多的深入。
本示例采用 jQuery 实现用户登录查询公积金余额功能,接口提供的功能较多但作为学习么,只开发了一个查询余额的功能。



2、编辑manifest.json文件,填写应用信息、访问权限等:
{
"name": "合肥公积金查询",
"version": "2012.11.20.0",
"manifest_version": 2,
"description": "这是一款合肥市住房公积金查询工具,用于学习测试仅提供余额查询。@Wizzer",
"icons":{"16":"16.png","48":"48.png"},
"content_scripts":[{
"js": [ "scripts/lib/jquery-1.7.2.min.js","scripts/main.js"],
"matches": [ "http://*/*", "https://*/*" ]
}],
"browser_action": {
"default_icon": "16.png",
"default_popup": "index.html"
},
"homepage_url":"",
"permissions": [ "cookies", "tabs", "http://*/*", "https://*/*" ]
}
注意事项:
A、目前最新版的chrome要求设置 “manifest_version”: 2 ;
B、permissions 配置了cookies权限,因为在应用中加入了记住密码功能;
C、API要求JS不可以内联,就是不能直接在页面元素上写JS,例如点击按钮alert提示都不会执行的;
var url = "/chrome";
var key = "接口APP_KEY隐藏";
var zgyhzh="";
var dwyhzh="";
var uptime="";
var hm="";
var mm="";
if (!chrome.cookies) {
chrome.cookies = chrome.experimental.cookies;
}
function delCookie(name) {
chrome.cookies.remove({"name": name,"url":url});
}
function setCookie(name,value) {
chrome.cookies.set({"name": name,"value":value,"url":url ,"expirationDate":1392000000});
}
function initCookie() {
var str="";
chrome.cookies.get({"name": "hm","url":url },function(cookie){
str=cookie.value;
if(""!=str){
$('#savehm').attr("checked",true);
$('#hm').val(Base64.decode(str));
}
});
chrome.cookies.get({"name": "mm","url":url },function(cookie){
str=cookie.value;
if(""!=str){
$('#savemm').attr("checked",true);
$('#mm').val(Base64.decode(str));
}
});
}
function login(){
hm=Base64.encode($('#hm').val());
mm=Base64.encode($('#mm').val());
$.ajax({
url : "http://220.178.98.86/hfgjj/service/login.jsp",
data : {"hm":hm,"mm":mm,"app_key":key} ,
success : function (res) {
loginData(res);
return false;
},
fail : function(res) {
loginData(res);
}
});
}
function loginData(res){
if(res.indexOf("error")>=0){
var obj = jQuery.parseJSON(res);
if(""!=obj.tip){
$("#tip").html("
"+obj.tip+"");
}
}else if(res.indexOf("more")>=0){
var obj = jQuery.parseJSON(res);
if("false"==obj.more){
zgyhzh=obj.zgyhzh;
dwyhzh=obj.dwyhzh;
uptime=obj.uptime;
oneData();
}else if("true"==obj.more){
uptime=obj.uptime;
var zgyhzhlist=obj.zgyhzhlist;
$.each(zgyhzhlist,function(entryIndex,entry){
if("true"==entry.zt){
zgyhzh=entry.zgyhzh;
dwyhzh=entry.dwyhzh;
oneData();
$("#note")[0].style.display='block';
return;
}
});
}
}else{
$("#tip").html("
"+res+"");
}
}
function oneData(){
var z=Base64.encode(zgyhzh);
var d=Base64.encode(dwyhzh);
$.ajax({
url : "http://220.178.98.86/hfgjj/service/grindex.jsp",
data : {"hm":hm,"mm":mm,"app_key":key,"zgyhzh":z,"dwyhzh":d} ,
success : function (res) {
showData(res);
return false;
},
fail : function(res) {
}
});
}
function showData(res){
if(res.indexOf("error")>=0){
var obj = jQuery.parseJSON(res);
if(""!=obj.tip){
$("#tip").html("
"+obj.tip+"");
}
}else{
$("#T1")[0].style.display='none';
$("#T2")[0].style.display='block';
var obj = jQuery.parseJSON(res);
var scje=obj.scje;
$("#uptime").html(""+uptime+"");
$("#yue").html(""+scje+"");
}
}
function init(){
initCookie();
$('#bt').click(function() {
if($('#savemm').attr('checked')){
setCookie("mm",Base64.encode($('#mm').val()));
setCookie("hm",Base64.encode($('#hm').val()));
}else if($('#savehm').attr('checked')){
setCookie("mm","");
setCookie("hm",Base64.encode($('#hm').val()));
}else{
setCookie("mm","");
setCookie("hm","");
}
$("#tip").html("
Loading...");
login();
});
$('#savemm').click(function() {
if($('#savemm').attr('checked')){
$('#savehm').attr("checked",true);
}else{
$('#savehm').attr("checked",false);
}
});
}
document.addEventListener('DOMContentLoaded', function () {
init();
});
PS:搞开发的JS都能看懂,就不注释了。。。
合肥市住房公积金查询 BODY { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } DIV { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } P { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } EM { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } SPAN { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } A { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } TD { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } FORM { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } BUTTON { PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; FONT-SIZE: 12px; WORD-BREAK: break-all; PADDING-TOP: 0px } body {COLOR: #333 ;min-width: 220px; margin: 0; font: 12px "Helvetica Neue", Helvetica, Arial, sans-serif; width: auto} EM { FONT-WEIGHT: bold } STRONG { FONT-WEIGHT: bold } DEL { TEXT-DECORATION: line-through } INPUT { MARGIN: 2px 0px; FONT-SIZE: 12px } SELECT { MARGIN: 2px 0px; FONT-SIZE: 12px } IMG { BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: medium none; BORDER-RIGHT: medium none } HR { BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; HEIGHT: 0px; CLEAR: both; BORDER-TOP: #ddd 1px solid; BORDER-RIGHT: 0px } A:link { COLOR: #36c; TEXT-DECORATION: underline } A:visited { COLOR: #36c; TEXT-DECORATION: underline } A.im { COLOR: #f60 } .im { COLOR: #f60 } .imp { COLOR: #f00 } .gp { COLOR: #06c } .mp { COLOR: #f90 } .module { PADDING-BOTTOM: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; PADDING-TOP: 0px } .wrapper { } .none { DISPLAY: none } .header { BORDER-BOTTOM: #d2d2d2 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; BACKGROUND: #f5f5f5; PADDING-TOP: 2px } .footer { PADDING-BOTTOM: 2px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; BORDER-TOP: #d2d2d2 1px solid; PADDING-TOP: 2px } .logo { PADDING-BOTTOM: 0px; PADDING-LEFT: 1px; PADDING-RIGHT: 1px; PADDING-TOP: 2px } .logo A { FONT-SIZE: 14px; TEXT-DECORATION: none } .nav { PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; PADDING-TOP: 5px } .cl { } .module { MARGIN-TOP: 3px } .gtt { TEXT-ALIGN: center } .capt { VERTICAL-ALIGN: middle } .err { BACKGROUND: #fc9 } .ptit { COLOR: #000; FONT-SIZE: 14px }
菜单–工具–扩展程序–载入正在开发的扩展程序,右上角会出现16*16的图标,o(∩_∩)o 哈哈

首次发布项目之前,您必须支付 US$5.00的一次性开发者注册费。我们收取此费用的目的是对开发者帐户进行验证,并为用户提供更好的保护,以防他们受到欺骗性活动的侵害。 支付注册费后,您就可以发布任意数量的项目,且无需再支付注册费了。
首先你需要有一张VISA信用卡,登陆google电子钱包注册信用卡。
https://www.google.com/checkout/ –注意要加https哦,你懂得

这里要注意的是,自动弹出的第一张信用卡注册界面不是如上的,很可能支付不成功,这个时候进入“支付方式”,选择修改信用卡,出现上面的界面选择New York 输入正确的邮编才能支付成功。
进入开发者中心(扩展程序最下面点击“获取更多扩展程序”,进入网上应用商城)

在开发者中心修改用户偏好设置,勾选“为我在 Chrome 网上应用店中的所有应用启用用户反馈功能。”,否则点击“立即支付注册费”会没反应(实在没辙换成IE试试吧)。
支付成功后耐心等待吧,我正在等待订单审核ing……
开发者中心点击添加新项目,把项目文件夹打包为zip压缩包上传即可。其他略,都能看懂。。
以上许多操作,你会发现一会这个网页打不开,那个网页等白天没反应,这个时候你就需要用chrome插件“SwitchySharp”了,具体怎么用百度一下吧,步骤也很多很麻烦,关键是耐心按教程来。
chrome里可以用 SwitchySharp,那么IE里要用怎么办,在IE里手动设置下代理即可,端口号到 SwitchySharp 选项里查看。
可移步:http://www.delver.net/?p=267 看教程~~
等订单审核完毕应用发布后,大家就可以在chrome 商城里搜索“合肥公积金查询”,那就是我写的这个应用了,如果你是win7系统的话,可以在:
C:\Users\Wizzer\AppData\Local\Google\Chrome\User Data\Default\Extensions
文件夹下看到源代码。over~~
几点思考,chrome插件是js+html+CSS的网页应用,不能直接执行JSP、ASP、PHP什么的,实现功能都需要调用chrome的接口、你自己应用提供的接口,那么可以不可以使用iframe嵌入自己的应用呢(- -)。
另外就是session传递的问题,从一个页面到另外一页面,信息怎么传递,用cookies感觉不太合适,也不能把所有的逻辑写在一个页面啊,这个需要深入的去研究。
再之就是js不能内联,那么实现一些功能就比较麻烦了,比如动态创建可点击的按钮,现在还没想到什么好办法,相信深入研究是可以解决的,JS要相当的熟才行啊,偶么就一般般。- –