码农往事
我的代码为什么这么丑?一定是因为我长的不好看
posts - 29,comments - 86,trackbacks - 0
说有一个屋里有多个桌子,有多个人? 如果3个人一桌,多2个人。 如果5个人一桌,多4个人。 如果7个人一桌,多6个人。 如果9个人一桌,多8个人。 如果11个人一桌,正好。 请问这屋里多少人?
最近比较闲,逛论坛看到随手做了.
最小答案是
代码如下:
    public static void main(String[] args) {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            long value = i * 11;
            if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
                System.out.println("i:" + i + ",value:" + value);
                break;
            }
        }
    }
计算出来的结果是:i:229,value:2519
转念一想,结果可能不止一个,于是换个写法:
    public static void main(String[] args) {
        int count = 0;
        long value;
        long valueMax = 0;
        long iMax = 0;
        long pram = 11;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            value = i * pram;
            if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
                count++;
                if (iMax < i) {
                    iMax = i;
                }
                if (valueMax < value) {
                    valueMax = value;
                }
            }
        }
        System.out.println("count:" + count);
        System.out.println("iMax:" + iMax);
        System.out.println("valueMax:" + valueMax);
    }
当i在Integer.MAX_VALUE范围内的计算结果:
count:6817408
iMax:2147483434
valueMax:23622317774
这边遇到了一个问题,当代码中的pram声明为int类型时计算的结果会与声明为long类型发生极大偏差,貌似是因为Java乘法对于int类型越界处理的问题,具体原因待查.
如果你用如下代码执行:
 int count = 0;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            long value = i * 11;
            if (value % 3 == 2 && value % 5 == 4 && value % 7 == 6 && value % 9 == 8) {
                System.out.println("i:" + i + ",value:" + value);
                count++;
            }
        }
        System.out.println("count:" + count);
最后数行看到的结果是这样:
i:2147475704,value:2147396264
i:2147476019,value:2147399729
i:2147476334,value:2147403194
i:2147476649,value:2147406659
i:2147476964,value:2147410124
i:2147477279,value:2147413589
i:2147477594,value:2147417054
i:2147477909,value:2147420519
i:2147478224,value:2147423984
i:2147478539,value:2147427449
i:2147478854,value:2147430914
i:2147479169,value:2147434379
i:2147479484,value:2147437844
i:2147479799,value:2147441309
i:2147480114,value:2147444774
i:2147480429,value:2147448239
i:2147480744,value:2147451704
i:2147481059,value:2147455169
i:2147481374,value:2147458634
i:2147481689,value:2147462099
i:2147482004,value:2147465564
i:2147482319,value:2147469029
i:2147482634,value:2147472494
i:2147482949,value:2147475959
i:2147483264,value:2147479424
i:2147483579,value:2147482889
count:3718586
问题产生的原因应该是Java对于int的乘法结果大于上限的情况,自动截取了前10位.
-----------------------------------------------------------------------------------------------------------------之前的理解不正确.

根据Java的基础类型的变窄转换(Narrowing primitive conversion)规则,对于运算结果超出int范围的,将超出部分全部丢弃,只保留低32位的.
posted @ 2016-01-25 17:16 Jimi 阅读(3403) | 评论 (0)编辑 收藏
有位朋友问起,我就顺便总结一下好了。个人知识有限,有谬误欢迎指正。
本人一直从事的服务端相关的工作,对前端只能说是耳闻目染。
参与的项目主要是页游和手游。

从程序开发角度讲起,程序一般常分为前端程序和后端程序。

一.前端
前端就是指玩家所使用的客户端,主要包括处理UI事件和向服务端发送请求。
页游主流的技术有ActionScript及新兴的Unity框架,由html5和JavaScript做的小游戏也不少。
手游上现在比较火的框架就是cocos2d-x和Unity 3D,cocos2d-x 是开源的,Unity 对开发者收费。
两者都支持多平台,就是说一次开发,ios、android等平台都可以生成相应代码。
我自己只稍微玩过一点cocos2d-x,主要用的语言是C++,也可以跟Lua混合使用。
Unity平台则支持C#、Boo、JavaScript、Lua,我没玩过,不发表评论。
2者现在都很火,行情都还不错。
最近比较大的新闻,就是Unreal Engine虚幻引擎宣布开发者免费,感兴趣的可以自行google下。

二.后端
通常所说的后端,常指的客户端发送请求的接收和处理者。语言的选择就很多了,Java、C++、Python、PHP等等。
端游等对实时性能要求比较高的场合,一般会选择C++,与之相应的开发成本更高。相对来讲,手游页游选其它语言的就很多了。
一般根据对实时性的要求,来选择合适的通信方式,长连接或短连接,以及合适的通讯协议如http、protobuf、amf3,及自定义协议等。
大多数时间,你主要的工作在定义协议、写游戏逻辑然后与客户端联调。
另外,服务端一个重要的工作就是负责数据的存储,mysql数据库是一个很常见的选择,还有这几年兴起的各种Nosql数据库,其中尤其是redis(有人说它不是数据库),用的越来越多。
最后,对于日志的处理,也是至关重要的。常用到的框架有log4j以及logback。简单粗暴点的,你可以另外开线程,直接丢入数据库,精细点的可以先写log文件,然后用脚本解析,转发到日志服务器然后再存入数据库。
如果是放mysql数据库,记得把二进制日志关掉,不然没跑几天硬盘就爆了。
工作内容上,除了上述事务,经常需要你做的事情还有:
其一,各种游戏平台的SDK对接,页游如腾讯、360、37wan,手游如苹果官方、谷歌官方以及各种大小平台;
其二,制作游戏测试工具,GM命令等;
其三,开发供运维人员使用的WEB版本的游戏管理平台。
小规模的公司,你可能啥都要做,人力配置稍微宽松的公司,这些工作往往会区分开来。
架构上来说,大型游戏的服务端,会分成登录服、逻辑服、数据存储服、日志服、GM管理服甚至更复杂。
一般服务器承载量不高的情况下,单进程的登录-逻辑-数据的架构也很常见。

从团队结构角度讲,常见的职位分配:

1.策划类:主策划、关卡策划、数值策划、剧本策划
2.美术类:主美、UI、3D建模、动作、特效、场景、原画
3.程序类:后端、前端
4.其它:商务、运营、维护、QA
一个大规模团队里往往美术是最多的,现在是看脸的时代,囧RZ!好的美术都是用钱砸的。
小团队来说,自然就是需要各种身兼数职的牛人。
策划?一个就够了,
前端?策划也能兼,
后端?一个就够了
运维?后端也能干
美术?不好搞就外包吧
这个世界上永远不缺少一个人搞定以上所有事情的大牛。

答博友问:我们当时的团队是,策划兼前端,共3前端,后期只剩俩了,后端,前期俩,后期只剩我一个,还有一位特效,美术外包。
答毕。

该休息了

在此申明,转载——请注明出处。
来自:http://www.blogjava.net/rockblue1988/archive/2015/03/10/423328.html

posted @ 2015-03-10 02:05 Jimi 阅读(4161) | 评论 (3)编辑 收藏
现在总结,是有那么点晚了呢。
只是想把那些容易不经意间忘却的,大的小的、圆的扁的、重要的不重要的,都稍稍记录下来。

这是结完婚后的第一个年头,酸甜苦辣,冷暖自知(这句我咋就能联想到鸭子呢?)。

一.工作
2月份,13年开始做的页游创业项目彻底黄了,还没过年呢,尾牙都不给吃,团队就“被”滚蛋了。
过完年回来,花了三个礼拜找工作。
3月2号,最终选择到一家手游公司上班,提前转正。
由于种种原因,决定换工作,拿了三份Offer,其中有我职业生涯中拿到过的最高的,还是比较欣慰的,这种被人认可的感觉良好,虽然最终没选择它。
11月27号到了当前公司上班,目前为止,工作和交流都很funny,是个令人愉快的选择。

二.生活
在魔都这地方,换租了一套有独立厨房的居室,租的房子啥都没,买了各种东西,才有那么点家的样子。
每天上班下班,做饭洗碗,生活也有点像个样子。
这一年是到影院观影次数最多的一年,这也是恋爱时候曾经憧憬的。
给自己买了个nokia x2的手机,可是不到一个月就碎屏了,渣渣伤不起。
小舅子来到,带他走向了码农的不归路。

三.技能
1.厨艺
研究尝试了很多没做过的菜式:
酸菜大肠、猪肚炖蛤蜊、炖王八、蒜泥扇贝、酱汁鲍鱼、清蒸多宝鱼、清蒸鲈鱼、肉末蒸蛋、土豆炖牛腩、
啤酒炖羊肉、香卤牛筋、清蒸猪舌头、酸菜鱼头、土豆色拉、西式牛排、香煎鳕鱼,还做了第一份自制双皮奶。
这里一点要说说,一个智能电压力锅实在是太值得入手了,煮饭炖汤焖肉都用的上,最重要的是有预约功能,晚上下好米,早上起来就能吃稀饭了。
2.篮球
周六无安排的话,坚持到上海大学打篮球,虐与被虐之间,技术还是有所进步的。值得一提的事,公司内部比赛,也算是第一次正式上了场,蛮开心。
3.吉他
没进步,只剩下随便吼吼的技能,走入社会越久,越哑。这个技能的好处是,年会总有机会上台去释放下闷骚的青春,顺带还能带点小礼品下来。
4.电子琴
主要练熟了两首曲子:《菊次郎的夏天》和《梦中的婚礼》,完成了大学时的小心愿。《克罗地亚狂想曲》挑战失败,最近电子琴已摆烂。
5.驾照
魔都4月份报名,7500,模拟考什么的花了500左右,每次练车都AA请教练吃饭,加上请假考试,总成本10000左右,好在一次性过----说实话,没上过几回车,教练素质一般,考科三中间三个月停练,呆车上的时间也绝对没达标 ---- 全国的驾校都这样吗?都TM没人管了?
6.代码能力
对于Linux下的操作更加熟练,shell脚本编写,组织SQL的能力有所提高。
在不同的公司,读到不同风格的代码,隐约觉得内功有所提升----别的不说,抄代码能力那是肯定增长了。
作为一个半路出家的程序员,补了《C++ primer》和《C程序设计语言》两本心法,眼界稍稍增长,至少不会被“java程序员不晓得指针是啥”这类的说辞给躺枪。
主要的吃饭家伙----Java方面,我再“三”次尝试了《Java并发编程实践》这本书,比最初多懂得一点。
比较用得上的一本书是《Java程序性能优化》,在大牛眼中这书可能比较浅显,但里面的东西确实比其它一些大部头里说的简洁一些,挺多地方一般面试也常问到。
《Java性能优化权威指南》就是前者的加强版,干货不少,字太多没坚持读完。
项目中用上了redis,涨了点姿势。
比较实用的新技能:Lua算是比较熟练了,可以拿来换饭钱。

四.开心的事
1.年会上中了三等奖
2.论坛上抽中一个机械键盘

五.最重要的事
两口之家即将变成三口之家了,希望一切顺顺利利、平平安安!

六.2015的目标
年底再揭晓

祝观文的诸位码友三羊开泰,心想事成!
PS:没多少内容的一篇随笔,竟然花了近两个小时,必须对产出高质量博文的博主们表达一下由衷的敬佩
posted @ 2015-03-07 03:09 Jimi 阅读(5616) | 评论 (11)编辑 收藏
最近的工作主要涉及LUA,这有个坑必须记一下。
下面是一个LUA面向对象写法非常常见的写法。
Bird = {
    color = {};canFly = true
}

function Bird:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    self.color = {}
    return o
end
注意,这里Bird类有两个属性,1个表,1个是基本类型,然后上测试代码(Utils类只是简单的封装类,可以自己实现一个)
        local A = Bird:new()
        LoggerUtils:debug("------------------------------原始值-----------------------------------");
        LoggerUtils:debug("Bird canFly:" .. StringUtils.boolean2string(A.canFly));
        LoggerUtils:debug("Bird color:");
        CommonUtils.printTable(Bird.color)
        LoggerUtils:debug("a canFly:" .. StringUtils.boolean2string(A.canFly));
        LoggerUtils:debug("a color:");
        CommonUtils.printTable(A.color)
        --改变A的属性
        A.canFly = false
        A.color[1] = "red"
        A.color[2] = "blue"
        A.color[3] = "green"
        LoggerUtils:debug("------------------------------A改变后----------------------------------");
        LoggerUtils:debug("Bird canFly:" .. StringUtils.boolean2string(Bird.canFly));
        LoggerUtils:debug("Bird color:");
        CommonUtils.printTable(Bird.color)
        LoggerUtils:debug("A canFly after change:" .. StringUtils.boolean2string(A.canFly));
        LoggerUtils:debug("A color after chagne:");
        CommonUtils.printTable(A.color)
        LoggerUtils:debug("-------------------------------B的值----------------------------------");
        local B = Bird:new()
        LoggerUtils:debug("B canFly:" .. StringUtils.boolean2string(B.canFly));
        LoggerUtils:debug("B color:");
        CommonUtils.printTable(B.color)

代码执行结果:
2014-12-29 11:20:40,690 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------原始值-----------------------------------
2014-12-29 11:20:40,690 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a canFly:true
2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a color:
2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------A改变后----------------------------------
2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
2014-12-29 11:20:40,691 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A canFly after change:false
2014-12-29 11:20:40,692 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A color after chagne:
2014-12-29 11:20:40,693 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
2014-12-29 11:20:40,693 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: -------------------------------B的值----------------------------------
2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B canFly:true
2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B color:
2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
2014-12-29 11:20:40,695 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
2014-12-29 11:20:40,696 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
发现神马问题了吗?
当A的类型为表的属性color改变时,原始类的color属性也改变了,同时这个改变也影响到新建的B,而类型为基本类型的属性canFly就没有这个问题。
我的解决方法是新增一个set方法:
function Bird:setColor(color)
    self.color = color
end

然后修改改变属性的方式:
local color ={}
        color[1] = "red"
        color[2] = "blue"
        color[3] = "green"
        A:setColor(color)
输出结果:
2014-12-29 11:31:58,648 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------原始值-----------------------------------
2014-12-29 11:31:58,648 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a canFly:true
2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: a color:
2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: ------------------------------A改变后----------------------------------
2014-12-29 11:31:58,649 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird canFly:true
2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: Bird color:
2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A canFly after change:false
2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: A color after chagne:
2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 1:red
2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 2:blue
2014-12-29 11:31:58,650 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: 3:green
2014-12-29 11:31:58,651 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: -------------------------------B的值----------------------------------
2014-12-29 11:31:58,651 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B canFly:true
2014-12-29 11:31:58,653 [main] DEBUG server.app.game.util.LoggerUtils:34 - LUA: B color:
另外同事一个解决方法更简单,直接修改new()方法,其它的地方都不用改:
function Bird:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    o.color = {} 
    return o
end
这个问题基本上网上的示例貌似都没提到,我读的书里也没有,实际调试过程中才发现的,会造成新创建的类里会有不该有的属性,比较蛋疼。
具体原因不了解,有木有筒子指教一下?顺便问问这两种方法哪种更好?
posted @ 2014-12-29 11:42 Jimi 阅读(10759) | 评论 (5)编辑 收藏
作为一名“万能”的码农,这种活儿你迟早要干的。----By Jimi没有bond

准备工作:yum

1.检查是否已安装
rpm -qa subversion
如果要卸载旧版本:
yum remove subversion

2.安装

yum install subversion
PS:yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql(这是安装配合Apache的模块,我暂时还没做,做了再补上,你可以只装subversion,多装了也无所谓)
3.检查是否安装成功
svnserve --version
如果成功会输出版本号

4.创建仓库目录
例如:
mkdir /home/svn/game

5.创建项目
svnadmin create /home/svn/game

6.检查是否创建成功
cd /home/svn/game
ll
如果成功,game目录下会多出几个文件夹


7.进入conf目录会看到3个配置文件,生成的文件中都有英文注释说明
示例需求:
策划组:开策划、美术读写
后端组:开后端读写,策划只读
前端组:开前端读写,策划、美术只读
美术组:开美术读写,策划只读
管理员组:所有的读写
authz:用户权限配置
示例:
[groups]
#管理组
manager = boss
#服务端用户组
server = server1,server2
#客户端用户组
client = client1,client2
#美术组
art = art1,art2
#策划组
design=design1,design2
[game:/]
@manager=rw
[game:/server]
@server=rw
[game:/client]
@client=rw
@design=r
@art=r
[game:/art]
@design=rw
@art=rw
@client=r
[game:/design]
@design=rw
@server=r
@client=r
@art=r
passwd:用户密码
[users]
boss=123456
server1=123456
server2=123456
client1=123456
client2=123456
art1=123456
art2=123456
design1=123456
design2=123456
svnserve.conf:
#匿名访问者权限
anon-access = none
#验证用户权限
auth-access = write
#密码文件地址
password-db = /home/svn/game/passwd
#权限文件地址
authz-db = /home/svn/game/authz
#项目名称(UUID)
realm =game


8.开放svn端口
默认是3690端口,你也可以用别的。已开启的跳过这一步
修改
iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
保存
/etc/rc.d/init.d/iptables save
重启
service iptables restart
查看
/etc/init.d/iptables status

9.启动SVN服务
svnserve -d -r /home/svn
-d:守护进程
-r:svn根目录
假设服务端IP为192.168.1.100,那么如下设置后game的访问目录就为:
svn://192.168.1.100/game

10.安装客户端 TortoiseSVN

11.建立子目录
在客户端PC上找个目录,用管理员帐户从svn://192.168.1.100/game迁出game目录,分别新建art,design,server,client 4个子目录,然后提交。
这时候你可以用其他组的帐户测试下是否正常使用了。

12.安装好的svn服务端,默认是不会开机自启动的,每次开机自己启动会很麻烦,我们可以把它设成开机启动
首先:编写一个启动脚本svn_startup.sh,我放在/root/svn_startup.sh
#!/bin/bash
/usr/bin/svnserve -d -r /home/svn/
这里的svnserve路径保险起见,最好写绝对路径,因为启动的时候,环境变量也许没加载。
绝对路径怎么查?
which svnserve
这里还有可能碰到一个问题,如果你在windows下建立和编写的脚步,拿到linux下,用vi或者vim修改后可能会无法执行,这是文件格式的问题
vi svn_startup.sh

输入:set ff 回车

如果显示的结果不是fileformat=unix

再次输入

set ff=unix

就OK了
然后修改该脚本的执行权限
chmod ug+x svn_startup.sh

或者万能的

chmod 777 svn_startup.sh
最后:加入自动运行
vi /etc/rc.d/rc.local
在末尾添加脚本的路径,如:
/root/svn_startup.sh
现在,你可以重启一下试试了。 不懂得怎么确认成功?败给你了
ps -ef|grep svnserve
好多活儿
posted @ 2014-11-19 11:50 Jimi 阅读(58587) | 评论 (9)编辑 收藏
那种酸爽,根本说不出来—————————————————————————— by: Jimi没有Bond
Jimi是谁? 就是洒家啊!

刚开始学习写Java的时候,用的eclipse,正式工作后,主要用的myeclipse,去年初在前辈的推荐下,在2折的时候买了正版的 IntelliJ IDEA 和 Pycharm,12.0版终生使用,一年更新。
使用前早就久闻其名,据说是最好的Java开发工具。
起先用的非常不习惯,但是花了钱的,硬着头皮用了下去。
短短一个礼拜,彻底爱上了它!就是辣么酸爽!--------------------------------------------------------------谨以此文献给对于拥抱IDEA还存在疑虑的筒子们

JetBrains(这个公司的名称翻译过来就是“大脑喷射?”) 公司的宣传语是这么说的:Develop with pleasure!(带着快乐开发!)

Why?
他们咋这么有信心呢?
这到底是怎样的一个工具?

跟我一起来数数IDEA特别长的地方:

一.黑色主题 Darcula

眼睛舒服,最重要的是酷!
设置方式:FILE--Settings--Edit--Colors&Fonts--Scheme name



二.智能提示

创建或引入项目的时候,会自动引入缺少的包,真找不着的还可以search in the net
键入代码的时候,区分大小写的智能提示,自动引入包,如果有重名的会列出所有选择,但是比 myeclipse 的更聪明,至于怎么个聪明法,你自个儿试试就知道了

三.工具集成

基本上正式开发的常用工具基本都集成了,而且基本都在你非常容易触到的位置。
说说我比较常用的:

1.ant
你懂的

2.maven
你也懂的

3.SVN
相比之下,IDEA的SVN的提交提供了更多的选项和功能
提交的界面两侧会显示当前文件和修改的部分对比,可以非常方便地检查和修改文件。
提交前:
(1).可选择自动格式化
(2).可选择自动忽略没有使用的imports
(3).可选择分析代码
(4).检查是否有TODO
提交后甚至可以选择将改变上传到特定的目录


4.系统终端
有了这个东西,你就不必频繁地切换窗口了
打开方式:Tools--Open Terminal
快捷键:Alt+F12

5.SSH工具
打开方式:Tools--Start SSH session

6.数据库连接工具
打开方式:View--Tool Windows--Database

7.IDEA talk
神奇的东西,你可以联系局域网内其它的IDEA使用者,可以方便地把你的代码show给你的同事
打开方式:View--Tool Windows--IDEA talk

8.Changes
非常方便的changes视图,它会变色显示你所有改动过的文件,而且可以方便的与 本地历史 或 线上历史 做对比
打开方式:View--Tool Windows--Changes

还有git、github、cvs、groovy consle以及等等,真没有的你还可以:
FILE--Settings--Plugins

四.强大的绘图工具

读源码看不懂项目结构?写文章画类图好麻烦?
右键diagram帮助你

上个例图:

右键选择 Show Categories 有惊喜,什么值域、方法、构造器、内部类统统有

五.无缝接入eclipse和myeclipse

IDEA可以直接打开有.project文件的项目,也可以将自身项目导出成eclipse的项目。
而且因为IDEA的项目配置文件为1个.iml文件加一个独立文件夹.idea,
所以只要你将两者放入ignore目录,即使在你个人使用IDEA而团队使用其他IDE的情况下,也并不会对其他人造成麻烦。

导出方法:FILE--Export to eclipse

六.更小的体积,更快的速度

用过myeclipse的你明白的

综上,我想你应该能够明白,为啥用IDEA写代码,就是那么愉快,就是那么酸爽,就是那么令人停不下来!


接着分享开发中我比较常用的一些快捷键:

一.找文件找代码找引用相关

1.双击shift
 在项目的所有目录查找,就是你想看到你不想看到的和你没想过你能看到的都给你找出来

2.ctrl+f
当前文件查找特定内容

3.ctrl+shift+f
当前项目查找包含特定内容的文件

4.ctrl+n
查找类

5.ctrl+shift+n
查找文件

6.ctrl+e
最近的文件

7.alt+F7
非常非常频繁使用的一个快捷键,可以帮你找到你的函数或者变量或者类的所有引用到的地方

二.编辑相关

1.shift+enter
另起一行

2.ctrl+r
当前文件替换特定内容

3.ctrl+shift+r
当前项目替换特定内容

4.shift+F6
非常非常省心省力的一个快捷键,可以重命名你的类、方法、变量等等,而且这个重命名甚至可以选择替换掉注释中的内容

5.ctrl+d
复制当前行到下一行

6.ctrl+x
剪切当前行

7.ctrl+c \ ctrl+v 
大家都懂的

8.ctrl+z
撤销

9.ctrl+shift+z
取消撤销

10.ctrl+k
提交代码到SVN

11.ctrl+t
更新代码

12.alt+insert
非常非常以及相当方便的一个组合键,不信您往下看
在类中使用:


可以自动生成构造器、getter/setter等等常用方法
在项目目录上使用:


可用于新建各种文件。

13.alt+enter
又是一个大杀器,有多杀?
例1:
发现代码很“黄”怎么办?

鼠标移上去喵一下:

试试alt+enter:

选择simplify看看

我勒个去,代码简洁了有木有啊!

PS:黄色警告编译可以通过,不影响程序的正常运行,一般都是一些对于代码优化的建议,我遇到过的有:
(1).can be simplify
代码可以简化
(2).Variable is never use
声明的变量从未被使用
(3)unnecessary boxing
不必要的声明包装

以及等等等,多留意下,对于编码的某些细节能够更了解。

例2:
写个类实现某个接口,加上 implements Runnable 后你就会发现这条红色的波浪线:

咱试试在这行上来个 alt+enter:

感动地哭了有木有?你想到的没想到的IDEA都帮你想到了。
看到代码里提示的各种红XX,就试试alt+enter吧!什么未抛异常啊没有try catch啊都能搞得定。

14.ctrl+alt+L

自动格式化代码,我已经养成了写完代码就来一发的习惯。
你可以个性化设置你自己的代码风格:File--Settings--CodeStyle

——————————切——————————切——————————切——————————切——————————切——————————

凡事有利有弊,IDEA同样是把双刃剑,最后说说它不好的地方

1.最重要的就是“贵”!
专业版个人许可2折可以接受,5折小贵,不打折桑不起!!!囧RZ~
美刀的消费水准令国内大多在屌丝线上挣扎的猿类们望而却步。
好在JetBrains是有社区版的,最近对于学生也有免费的Key。
对于使用破解版的小伙伴,建议自己用用就好了,不必太声张。

用户养成良好的软件付费习惯,才能让我们的工作变得越来越有价值。

2.集成太完善了
集成的工具完全能够应付大多数的工作需求,对于不求甚解又偷懒的筒子们,直接使用,可能很多工具的细节,你都不会了解,也不会再去了解了。
比如:maven,ant

3.不自带JDK
不是缺点的缺点,myeclipse是集成的


差不多了,该撸代码了。
以上这些,就是我使用IDEA一年半来几乎所有的心得了。
能力有限,砖头轻拍。
如果你有杀伤力更强大的手段,欢迎交流。

后记:最近偶然发现,这篇文章被人转载了,而且没注明出处,令人蛋疼。
在此重申下,转载,请注明出处。
来自:http://www.blogjava.net/rockblue1988/archive/2014/10/24/418994.html 



posted @ 2014-10-24 12:49 Jimi 阅读(264109) | 评论 (15)编辑 收藏
1.rm 删除
参数:
-r:递归
-f:强制

2.cd 打开目录
cd ../  打开上级目录

3.mv 移动或者重命名文件
重命名: mv test.txt test_old.txt
移动文件:mv 文件路径 新路径

4.cp 拷贝文件或目录 参数与mv类似
例:cp -r folder folder2
sz 下载到本地

5.sz 下载到本地

6.rz 上传到服务器

7.find 查找文件或者文件内容
查找文件中包含特定内容的行(支持通配符):find . -name "game.log" -type f |xargs grep "hello world" 

8.df 查看存储状态

9.top查看内存和CPU状态

10.ll 列出当前目录所有文件

11.ls列出当前目录所有文件详情

12.chmod 777 修改文件读写权限(全可读可写)

13.more 查看文件 按空格键向下翻页

14.less 与more相反,用法一致

15.sudo -i 提权

16.netstat -nat|grep -i "9001"|wc -l   查看9001端口连接数

17.history 查看历史操作

18.last 查看历史登陆,可以看看服务器有没有陌生IP登陆
例:last|grep 192.168.1.1  查看192.168.1.1的登陆情况 

19.sh 执行脚本
例:sh restart.sh

20.ps 查看程序快照
例:ps -ef|grep tomcat 查看运行中名称包含tomcat的进程
      ps -aux|grep svn 

21.kill -9 进程号 杀死进程,常与ps命令配合使用
例:假设要关闭的进程号为 111
kill -9 111

22.date 显示当前时间

23.mkdir 创建目录

24.ssh 用户名@IP地址 远程连接
例:ssh root@192.168.1.111

25.tail 查看文件尾
例:tail -100f game.log 查看文件最后100行,持续刷新,适合在服务器上看实时日志时使用


26.head 与tail相反,用法一致

27.vi 文本编辑
最基本的操作:
按i进入编辑模式,编辑完成后,按ESC退出编辑模式
输入:wq 回车后保存修改
输入:q!  不保存退出
输入ZZ 保存退出

28.ctrl+c 撤销或退出当前程序

29.文件目录下,按TAB有智能提示

30.按 ↑ 符号,会显示使用过的命令

31.rpm -qa 查看已安装过的程序
例:rpm -qa|grep subversion 查看是否已安装svn

32.安装sz/rz命令
yum install lrzsz

33.修改用户密码
passwd 用户名
例:passwd root

34.which 查找命令所在的路径
例1:which ssh
例2:which sh

35.查看编码方式
echo $LANG
posted @ 2014-10-23 16:52 Jimi 阅读(4870) | 评论 (1)编辑 收藏
并发模式中,有一个称做Future模式。啥是Future模式捏? future,翻译成中文就是“未来,将来”的意思,可以简单地理解为 “明天的事明天再做” 。
比方说,你在做晚饭,而只有一个火炉,先炖个猪蹄要1小时,在等待猪蹄的这个时间里,你可以去淘米、洗菜、刷牙、抠脚,待猪蹄炖好了,再继续炒菜。
在编码中体现为:将耗时任务丢入单独的线程,从而使主线程能够继续执行其它的逻辑,待耗时任务执行完成后再做相应的处理。
Future模式是一钟十分常用的并发模式,所以JDK的并发包中自带一套实现。上类图:



这个自己画的,既然画了不能白画,囧!!!

下面这个是用 IntelliJ IDEA 自带工具生成的,真心太酸爽。


只看函数名称,也能基本了解FutureTask所提供的主要能力:
1、可判断执行状态(isDone())
2、可取消(cancel())
3、可读取返回结果(get())
4、可判断是否取消(isCancelled)
现在,我们可以解决上面这个猪脚的问题了:

    public static class TestTask implements Callable<Boolean> {
        @Override
        public Boolean call() throws Exception {
            //模拟时间消耗
            System.out.println("--------漫长的一小时--------");
            Thread.sleep(10000);
            System.out.println("--------猪脚炖完--------");
            return true;
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        System.out.println("--------开始做晚饭--------");
        System.out.println("开始炖猪脚~~~");
        System.out.println("--------猪脚下锅--------");
        FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new TestTask());
        Thread thread = new Thread(futureTask);
        thread.start();
        Thread.sleep(1000);
        System.out.println("--------淘米--------");
        Thread.sleep(1000);
        System.out.println("--------洗菜--------");
        Thread.sleep(1000);
        System.out.println("--------刷牙--------");
        Thread.sleep(1000);
        System.out.println("--------抠脚--------");
        //如果猪脚炖好了
        if(futureTask.get()==true){
            System.out.println("--------继续炒菜--------");
        }
    }
执行结果:
--------开始做晚饭--------
开始炖猪脚~~~
--------猪脚下锅--------
--------漫长的一小时--------
--------淘米--------
--------洗菜--------
--------刷牙--------
--------抠脚--------
--------猪脚炖完--------
--------继续炒菜--------
posted @ 2014-10-23 16:13 Jimi 阅读(5239) | 评论 (3)编辑 收藏
public class InsertionSortAlgorithmTest {

    public static String arrayToString(int[] array){
       StringBuilder sb = new StringBuilder();
        for(int a:array){
            sb.append(a).append(" ");
        }
        return sb.toString();
    }

    public static int[] insertionSort(int[] array){
        int key;
        int j;
        for (int i = 1; i < array.length; i++) {
            key = array[i];
            j = i - 1;
            while (j >= 0 && array[j] > key) {
                array[j + 1] = array[j];
                j = j - 1;
            }
            array[j + 1] = key;
            System.out.println(arrayToString(array));
        }
        return array;
    }

    public static void main(String[] args) {
        int[] array = {2, 3, 1, 7, 5, 9, 4, 6, 8};
        insertionSort(array);
    }

}
posted @ 2014-02-18 23:23 Jimi 阅读(1524) | 评论 (0)编辑 收藏
1.说说ArrayList、Vector、LinkedList的区别
2.HashMap的实现原理
3.HashMap出现哈希冲突是如何处理的
4.观察者模式的定义和实现
5.单例模式的定义和实现
6.spring的事务如何配置
7.什么是AOP?
8.写一个永不停止的线程
9.mysql的优化
10.如何查找性能瓶颈
11.请自我介绍
12.netty 3 和 netty 4的区别
13.ArrayBlockingQueue和LinkedBlockingQueue的区别
14.缓存的实现方式
15.什么时候会GC?
16.内存回收模型
17.spring配置事务
18.Mysql的事务处理
19.ant自动上传服务器
posted @ 2014-02-18 23:18 Jimi 阅读(1558) | 评论 (0)编辑 收藏

--启用Ad Hoc Distributed Queries 
--
(使用以下两句代码的原因:下面的sql中,其中有几个从其他数据库导入数据的语句,所以必须得先启用Ad Hoc Distributed Queries,使用结束后,最好关闭它 )
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure

 

GO
delete from syscode
insert into syscode 
select type,code,name,note,value1,value2 FROM opendatasource('SQLOLEDB','Data Source=192.168.1.101;User ID=sa; Password=***').[DATABASE_NAME].dbo.syscode


--使用完成后,关闭Ad Hoc Distributed Queries:
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
posted @ 2013-02-03 11:27 Jimi 阅读(2768) | 评论 (0)编辑 收藏
import java.util.ArrayList;
import java.util.Calendar;

public class CAL {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Calendar start = Calendar.getInstance();
        System.out.println(start.getTimeInMillis());
        ArrayList<Integer> number = new ArrayList<Integer>();
        number.add(1);number.add(1);
        for (int i = 2; i <= 100000; i++) {
            number.add(number.get(i - 1) + number.get(i - 2));
        }
        Calendar end = Calendar.getInstance();
        System.out.println(end.getTimeInMillis());
        System.out.println("时间:" + (end.getTimeInMillis()-start.getTimeInMillis() ));
        System.out.println("last:"+number.get(100000));
    }

}
posted @ 2013-01-25 11:15 Jimi 阅读(1909) | 评论 (0)编辑 收藏
项目上有一个这样的需求:登录的时候选择一个单位名称,然后输入账号完成登录,下次登录的时候,“单位选择”框里自动显示为上次登录的页面。
具体实现如下:

            {
xtype : 'combo',                              //这里是选择单位的Combo
id:'orgname',
store : orgStore,
name:'orgname',
emptyText : '请选择单位',
displayField : 'orgname',
valueField : 'dbname',
editable : false,
forceSelection : true,
triggerAction : 'all',
shadow : 'frame',
hiddenName : 'dbname',
listeners:{
    select:function(){                                                          //增加1个select函数,当选择的时候,将选择结果保存入cookie
    savedbname= Ext.getCmp('orgname').getValue();
                                 Ext.util.Cookies.set('savedbname',savedbname);
}
    }
}



 
var orgStore = new Ext.data.JsonStore( {                                 //这是单位选择Combo的数据源
url : 'test/LoginOrgSelectServlet',
root : 'orgselect',
fields : [ 'orgname', 'dbname' ],
autoLoad : true,
listeners:{load:function(){                                                  //给store添加一个load监听器
  var cookiedata = Ext.util.Cookies.get("savedbname");
  if (cookiedata!=null){Ext.getCmp('orgname').setValue(cookiedata);}   //当cookie中的数据不为空的时候,设置combo的值
}}
});
posted @ 2012-09-12 17:23 Jimi 阅读(5196) | 评论 (1)编辑 收藏
public List queryDeviceName(String where) {
Session session =  this.getSession();
List list = session.createSQLQuery("select number, name from devrepair " + where).list();
return list;
}

List deviceList = this.getDevrepairService().queryDeviceName(where);
StringBuilder sb = new StringBuilder();
sb.append("{devices:[");
for(Object nameinfo:deviceList){                                                            //查询的结果为Object
sb.append("{number:'").append(((Object[])nameinfo)[0]).append("',");          //将查询结果转化为Object的集合,取值
sb.append("name:'").append(((Object[])nameinfo)[1]).append("'}");              
sb.append(",");
}
posted @ 2012-09-03 17:25 Jimi 阅读(615) | 评论 (0)编辑 收藏

总体方案:从sql server 中导出建立数据库的sql文件,在powerdesigner中生成PDM,再将PDM转化为MySql的版本,然后生成数据库的sql,在MySql中导入sql文件生成数据库。将sql server 表中已存在的数据导出为CSV文件,将CSV文件导入MySql中实现数据迁移。
用到的工具:Excel,PowerDesigner,SQLyog,记事本
1.在sql server 2005中,右键点击数据库→任务→生成脚本  按提示点击下一步,最后将脚本保存到文件xxx.sql



2.打开powerdesigner,点击文件→reverse engineer→database

选择数据库类型为sql server 2005

选择第一步中生成的sql文件
点击确定,生成sql server 2005版本的PDM文件
3.powerdesigner中,点击工具→generate physical data model
选择类型为mysql 5.0,点击确定生成mysql 5.0版本的pdm,如果出现如下错误

将detail选项卡中的check model的打钩去掉
4.powerdesigner中选择 数据库→generate database

点击确定生成Mysql 5.0版本的数据库脚本文件
5.mysql 中,用source命令从sql文件创建相关的表 “source d:/xxx.sql”检查上一步骤中生成的脚本文件,由于是从sql server中生成,数据库名称可能是dbo,将dbo改为你打算创建的数据库名称
6.sql server中,,右键点击数据库→任务→导出数据 按提示导出为excel文件,如:xx.xls
7.excel中打开,选择文件→另存为csv文件  毋须保留列名,方式选择utf-8,否则可能出现乱码的问题
8.再将csv文件导入mysql,有多种方式,图形化界面SQLyog中,直接右键表→从CSV中导入数据 即可
posted @ 2012-08-31 10:34 Jimi 阅读(9148) | 评论 (3)编辑 收藏
删除了A项目,运行B项目的时候总是有A项目的启动信息,甚至物理删除A项目后都无法解决,猜测是A项目的项目文件被保存在myeclipse自带的tomcat中,网上查了查,没有找到相关的解决办法,凭感觉找到以下目录:
\Workspaces\MyEclipse 8.5\.metadata\.me_tcat\webapps
发现原来删除的A项目的文件都保存在该目录下,此外该目录还包括当前运行的项目,删除相关A项目的文件即可解决。
看来 \Workspaces\MyEclipse 8.5\.metadata\.me_tcat\webapps 就是Myeclipse的发布目录
posted @ 2012-08-27 11:51 Jimi 阅读(1939) | 评论 (0)编辑 收藏
你必须学会翻##墙,感谢领导!
posted @ 2012-08-07 10:39 Jimi 阅读(1416) | 评论 (2)编辑 收藏
小明和小强都是王老师的学生,老师的生日是M月N日,他们都知道老师的生日是以下十组中的一个,老师把M告诉了小明,把N告诉了小强,然后问他们是否知道自己的生日,小明说“如果我不知道小强也不知道”,小强说“本来我不知道,你说了这话我就知道了”,小明说“那我也知道了 ”。问老师的生日是以下的哪个。

3,4
3,5
3,8
6,4
6,7
9,1
9,5
12,1
12,2
12,8

正在上班 orz..,偶然看到一个题目,就动动脑子吧。
按月份排:
3,4 3,5 3,8
6,4 6,7
9,1 9,5
12,1 12,2 12,8
按日期排:
9,1 12,1
12,2
3,4 6,4
3,5 9,5
6,7
3,8 12,8

小明说“如果我不知道小强也不知道”  按月份排,小明一定不知道,小明知道月份以后肯定小强不知道,由于12,2 6,7的日期是唯一的,可见月份不是6月或12月,生日可能是以下5个:
按月份排:
3,4 3,5 3,8 
9,1 9,5 
小强说“本来我不知道,你说了这话我就知道了”,除去6,7 12,2,小强原本的选择如下,
按日期排:
9,1 12,1
3,4 6,4
3,5 9,5
3,8 12,8
现在听完小明说的话,剔除6月和12月的数据,老师的生日可能的日期如下:
按日期排:
9,1
3,4
3,5 9,5
3,8
现在小强知道了,由于3,5 9,5日期重复,所以日期一定不是5,生日的可能的集合为:3,4 3,8 9,1

小明说“那我也知道了 ” 小明原本可能的选择如下,
按月份排:
3,4 3,5 3,8 
9,1 9,5 
现在小明以小强的逻辑推断,也可推知日期一定不是5,而小明自己知道月份,如果为3月,那么小明自己也无法知道老师的生日,所以只能是9月,
老师的生日为9,1。



posted @ 2012-07-25 12:48 Jimi 阅读(1769) | 评论 (4)编辑 收藏
JSP页面定义了如下几个作用域:
页面作用域(page scope)、请求作用域(request scope)、会话作用域(session scope)、应用程序作用域(application scope)
页面作用域中的对象仅在当前页面可用;请求作用域中的对象在所有处理同一请求的页面中都可用;会话作用域中的对象用于同一浏览器发出的所有请求;应用程序作用域中的对象被应用程序的所有用户共享。
通过设置<jsp:useBean>行为的scope属性,制定bean应该放在哪个作用域中,例如:
<jsp:useBean id="test" scope="request"  class="com.testBean" />
会话跟踪过程解释:由于HTTP是一种无状态协议,即服务器处理完浏览器的请求后将忘掉所发生的事务,当浏览器再次发出请求时,Web服务器并不知道新的请求与之前的请求有何关系。解决这个问题主要有两种方法:
1、服务器在应答中返回与该用户有关的所有信息,并让浏览器将其作为下一个请求的一部分发回去
2、在服务器的任何位置保存状态信息,并且发回一个标识符,浏览器在下一请求中返回该标识符,然后借由该标识符定位服务器上的状态信息
在这两种情况下,可以用以下三种方式将状态信息发送给浏览器:
1、作为cookie    
2、嵌入HTML表单作为隐藏字段
3、进行编码,编入应答主体的URL中,一般作为连接到其它应用程序的链接(也称作URL复写,URL rewriting)

在浏览器和服务器间来回发送所有状态信息的效率是极低的,所以大多数现代服务器都将信息保留在服务器上,只在浏览器和服务器间传递标识符,这就是会话跟踪(session tracking),JSP隐藏了cookie会话跟踪的所以细节,并实现了对URL复写的支持,此外,JSP规范允许使用安全套接字协议层(Secure Socket Layer,SSL)内置的会话机制。在会话的生命周期中,保存在会话作用域中的信息可被同一浏览器的所有页面所用。
在线购物(P179):
内存使用策略:
1、只把那些真正需要被每个会话单独拥有的对象放在会话作用域中
2、将会话的有效期设成比默认值更短
3、提供一种显示的结束会话的方法。一个好的示例就是注销功能,或者是当某件事务完成时,使会话失效。在servlet和其他自定义代码中,可以使用HttpSession invalidate()方法。
posted @ 2012-05-21 00:35 Jimi 阅读(1849) | 评论 (1)编辑 收藏
JSP有三种类型的元素:指令元素(directive element)、行为元素(action element)、和脚本元素(script element)。
指令元素:
<%@ page...%>  定义了独立于页面的属性,例如会话跟踪、错误处理页面、对缓存的要求等
<%@ include...>  在翻译阶段引入文件
<%@ taglib...>    声明一个在页面中使用的包含自定义行为的标记库
标准行为元素:
<jsp:usebean>  使一个JavaBeans在当前页面可用    
<jsp:getProperty>  从JavaBeans中获得某个属性值,并将其添加到应答中
<jsp:setProperty>  设置JavaBeans的属性值
<jsp:include>  在请求处理阶段引入来自一个servlet或页面的应答结果
<jsp:forward>  将对请求的处理转交给一个servlet或JSP页面
<jsp:param>  使用<jsp:forward> 或<jsp:include> 时,向这个请求添加参数
<jsp:plugin>
自定义行为元素和标准标记库:JSTL,JSP标准标记库(JSP Standard Tag Library),可以用扩展API开发自定义行为
脚本元素:
<%...%>  小脚本,用于嵌入脚本代码
<%=...%>  用于嵌入JAVA表达式
<%!...%>  声明变量和方法
posted @ 2012-05-20 03:47 Jimi 阅读(274) | 评论 (0)编辑 收藏
http: HyperText Transport Protocol (超文本传输协议) 是一种无状态协议,即服务器发送应答后不会保留关于客户端的任何信息
URI:Uniform Resource Identifier (统一资源标示符) 
URL:Uniform Resource Locator (统一资源定位器)   是URI的特殊化,标准端口号为80 
Request:
请求头信息
Accepttext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encodinggzip, deflate
Accept-Languagezh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Connectionkeep-alive
Content-Length55
Content-Typeapplication/x-www-form-urlencoded; charset=UTF-8
CookieJSESSIONID=6E9A50496EFFEBDB7E0FA60DFE506B74
Hostlocalhost.:8080
Refererhttp://localhost.:8080/SWS/login.jsp
User-AgentMozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
X-Requested-WithXMLHttpRequest
Accept:浏览器所能接受的语言和格式方面的信息
User-Agent:浏览器类型
Host:URL所对应的主机名
请求参数:两种传递方式
1、通过查询字符串的形式添加在URI后面,查询字符串以“?”开始,由“&”符号分隔的经过URL编码的(URL-encoded)名称/值对组成
2、作为消息主体的一部分发送
请求方法:GET和POST,GET用于从服务器上取得资源,而不引起服务器的任何其它行为,POST用于请求服务器执行某个处理过程。两者最明显的区别之一是参数的传递方式,GET请求通常以查询字符串的形式传递参数,而POST通常是把参数作为消息主体的一部分来发送。


Response:
响应头信息
Content-Type text/html;charset=utf-8 -------应答数据类型
DateSat, 19 May 2012 18:48:50 GMT
Server Apache-Coyote/1.1              --------服务器信息
Transfer-Encoding chunked
posted @ 2012-05-20 03:14 Jimi 阅读(601) | 评论 (0)编辑 收藏

启动终端: Ctrl + Alt + T 

切换正在运行中的程序:Alt + Tab 

切换桌面: Ctrl + Alt + 上/下/左/右 

快速启动:微标键 

弹出侧边栏:长按微标键 

快速启动侧边栏程序:微标键 + 对应数字 
 
进入全屏终端:Ctrl + Alt + F1-F6 

返回图形界面:Ctrl + Alt + F7

移动当前窗口到不同工作台:Ctrl + Alt + Shift + → / ←


posted @ 2012-05-05 00:09 Jimi 阅读(306) | 评论 (0)编辑 收藏
F11              debug运行
CTRL+F11        运行
CTRL+F       当前页面搜索
CTRL+H      搜索文件
ALT+SHIFT+R   重命名
F2       重命名
F3         进入方法
CTRL+ /          注释
CTRL+Z         撤销编辑
CTRL+D         删除整行
CTRL+ALT+↓ 复制当前行到下一行
posted @ 2012-05-04 00:38 Jimi 阅读(166) | 评论 (0)编辑 收藏
向同一表中插入多条记录:
(sql server 2005)
INSERT INTO users ([name],[filename],[type],location2)
SELECT '日消耗','/pages/daycost','1','13.13.1' UNION ALL
SELECT '月消耗','/pages/monthcost','1','13.12.1' 
(sql server 2008和MySQL)
INSERT INTO users 
([name],[filename],[type],location2) 
VALUES
(
'日消耗','/pages/daycost','1','13.13.1' ), 
(
'日消耗','/pages/daycost','1','13.13.1' )
PS: UNION ALL 是允许数据重复
条件查询所有数据库名称:
(sql server 2005)
USE master
SELECT [name] FROM sys.databases WHERE [name] LIKE 'SWS%'
(MySQL)
show databases
修改数据:
UPDATE users SET [name] = 'test' WHERE [name] ='admin'
查询所有存储过程:
select * from sys.objects where type = 'P';
查看存储过程的语句:
exec sp_helptext 'createDaily1'
去重查询:
SELECT DISTINCT 列名称 FROM 表名称

SELECT DISTINCT testtime
FROM         testrec
日期格式转换:
CONVERT(data_type(length),data_to_be_converted,style)
Style IDStyle 格式
100 或者 0mon dd yyyy hh:miAM (或者 PM)
101mm/dd/yy
102yy.mm.dd
103dd/mm/yy
104dd.mm.yy
105dd-mm-yy
106dd mon yy
107Mon dd, yy
108hh:mm:ss
109 或者 9mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110mm-dd-yy
111yy/mm/dd
112yymmdd
113 或者 13dd mon yyyy hh:mm:ss:mmm(24h)
114hh:mi:ss:mmm(24h)
120 或者 20yyyy-mm-dd hh:mi:ss(24h)
121 或者 21yyyy-mm-dd hh:mi:ss.mmm(24h)
126yyyy-mm-ddThh:mm:ss.mmm(没有空格)
130dd mon yyyy hh:mi:ss:mmmAM
131dd/mm/yy hh:mi:ss:mmmAM

切割字符串:
SUBSTRING expression , start , length )
start是从1开始,而不是0
SELECT DISTINCT testtime
FROM         testrec
WHERE     (SUBSTRING(CONVERT(VARCHAR(11), testtime, 120), 1, 7) = '2012-05')


posted @ 2012-04-20 11:04 Jimi 阅读(294) | 评论 (0)编辑 收藏
     摘要: 这两天项目上要求做一个导出Excel的功能,项目前台用的ExtJS,后台用的JAVA,网上查了查,大概有3种做法。1.apache公司提供的POI2.韩国公司的JXL3.据说是官方提供的JS调用方法前两种都要引入外包,懒得找包了,采用了第三种,所需引入JS代码如下:/Files/rockblue1988/export.txt Code highlighting produced by A...  阅读全文
posted @ 2012-02-29 11:21 Jimi 阅读(19186) | 评论 (28)编辑 收藏

一.使用SQL Server2005自动备份数据库的步骤
1.启动Sql Server Agent 服务
2.创建作业
3.添加常规
4.添加步骤
5.添加计划,设置频率,时间等
二.每个步骤的详细操作
1.启动Sql Server Agent 服务 (可在运行中打开:services.msc)
打开【配置工具】中的【SQL Server Configuration Manager】窗口,点击【SQL Server配置管理器(本地)】--【SQL Server2005 服务】,右面窗口显示的是当前所有服务的运行状态,右键点击【SQL Server Agent】选择启动菜单。
SQL Server Agent简介:http://zhidao.baidu.com/question/41264786.html
2.创建作业
打开【Management Studio】,展开SQL Server代理,右键点击【作业】选择【新建作业】菜单。【选择页】中选择【常规】
3.添加常规
在2中的【选择页】中选择【常规】选项,输入作业名称
4.添加步骤
在2中的【选择页】中选择【步骤】,点击窗口下方的【新建】按钮,输入步骤名称、选择操作数据库。在命令输入框中输入作业执行的T-SQL语句,这里备份的语句如下:

****************************************************************
     DECLARE @strPath NVARCHAR(200)
set @strPath = convert(NVARCHAR(19),getdate(),120)
set @strPath = REPLACE(@strPath, ':' , '.')
set @strPath = 'D:\自动备份\' + @strPath + '.bak'
BACKUP DATABASE [test] TO DISK = @strPath WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT

*****************************************************************
有关WITH 后面的参数值的含义,请参考:
http://msdn.microsoft.com/zh-cn/library/ms186865.aspx
其中DATABASE [test]中的test是要备份的数据库,@strPath备份的完成路径
还原数据库:restore database [数据库名] from disk=[磁盘路径]
WITH
NOINIT:不重写备份集的参数

convert:函数简介:按照地区代码格式化时间的输入格式
convert(NVARCHAR(19),getdate(),120)
例如:SELECT CONVERT(nvarchar(19), getdate(), 120),
输出为:2008-11-29 15:45:59
* REPLACE ( 'string_expression_r1' , 'string_expression_r2' , 'string_expression_r3' )
用第三个表达式替换第一个字符串表达式中出现的所有第二个指定字符串表达式的匹配项。
替换':' 是因为路径中有':'会报错

5.添加计划
在2中的【选择页】中选择【计划】选项,点击【新建】按钮。
输入名称、执行频率、每天频率。例如:要每天的凌晨自动备份数据库,执行频率选择每天、每天频率选择‘执行一次’执行时间:0:00:00,持续时间:选择开始时间,不选结束时间。这样SQL Server会在每天凌晨自动执行这个作业,将数据库备份到D:\自动备份\的目录下,备份的文件名为:

2012-02-09 00.00.00.bak

实际操作有效。转自网络。

posted @ 2012-02-10 16:36 Jimi 阅读(2382) | 评论 (0)编辑 收藏
Tomcat有时候会出点问题,又无法看到错误信息,这时候可以打开cmd命令窗口,进入Tomcat的bin目录,如:
D:\Program Files\apache-tomcat-6.0.32\bin
  
然后输入statup, 就会显示出如图界面。 

常用的cmd命令:
ping : 测试网络连通  ping 192.168.1.111  
mstsc: 远程连接
telnet localhost 8080:测试端口
ipconfig: 查看本机IP设置
netstat -ano:查看线程
posted @ 2012-01-11 11:00 Jimi 阅读(2004) | 评论 (0)编辑 收藏
1、下载敏捷客户端InstantClient(40M左右,选择适合自己的下载,我的是
instantclient-basic-win32-11.2.0.1.0.zip )
http://www.oracle.com/technetwork/cn/database/features/instant-client/index-092699-zhs.html
2、下载安装PLSQL(16M左右):
http://www.onlinedown.net/soft/4902.htm 
3、解压 
instantclient-basic-win32-11.2.0.1.0.zip 到新建文件夹,如  D:/oracleclient/instantclient_11_2
用文本文档创建tnsnames.ora ,内容大致如下:
# TNSNAMES.ORA Network Configuration File: /opt/oracle/product/9204/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.          //以上为注释内容,因为我的tnsnames.ora是直接从服务器上download的
HSSL =                                             //数据库名称
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 218.108.242.30)(PORT = 1521))     //IP和端口
    )
    (CONNECT_DATA =
      (SERVICE_NAME = hssl)               //数据库名称
    )
  )

用文本文档创建sqlnet.ora ,内容如下:
NAMES.DIRECTORY_PATH= (TNSNAMES)
SQLNET.AUTHENTICATION_SERVICES= (NTS)

到我的电脑、属性、高级、环境变量中添加一个环境变量,变量名为TNS_ADMIN,值为tnsnames.ora文件所在路径,
例如:D:/oracleclient/instantclient_11_2

4、安装完毕PLSQL后,启动,cancel,依次点击Tools->Preferences->Connection:  
       Oracle Home=D:/oracleclient/instantclient_11_2

OCI library=D:/oracleclient/instantclient_11_2/oci.dll

重新启动PLSQL即可进入数据库,初次登陆可能存在中文乱码的问题,解决方法如下:

到我的电脑、属性、高级、环境变量中添加一个环境变量:
变量名:NLS_LANG
变量值:AMERICAN_AMERICA.ZHS16GBK
重新连接,即可正常显示中文。
如果想转换为UTF8字符集,可以赋予“NLS_LANG”为 “AMERICAN_AMERICA.UTF8,其他编码同上
posted @ 2011-09-06 15:58 Jimi 阅读(4495) | 评论 (0)编辑 收藏
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="删除该目录下面的.svn文件"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

新建一文本文档任意命.txt文件,复制以上代码,保存后修改后缀名为.reg(为注册表文件),
双击执行,即导入到注册表。
这时候你右键单击一个文件夹,会发现菜单中多出来"删除该目录下面的.svn文件",执行该命令即可。
(以上代码测试通过,网上有的代码不能用是因为”/“与”\“的问题。)
posted @ 2011-09-05 11:20 Jimi 阅读(250) | 评论 (0)编辑 收藏
启动tomcat:进入tomcat下的bin目录,输入 ./startup.sh 启动tomcat;
停止tomcat:bin目录下,输入 ./shutdown.sh 
显示所有进程:ps -fe
显示tomcat进程:ps -ef |grep tomcat 
显示如下:
[root@localhost ~]# ps -ef |grep tomcat
root      7277     1  2 21:29 pts/1    00:01:17 /usr/java/jdk1.5.0_06/bin/java -Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/java/tomcat/apache-tomcat-5.5.20/conf/logging.properties -Djava.endorsed.dirs=/usr/java/tomcat/apache-tomcat-5.5.20/common/endorsed -classpath :/usr/java/tomcat/apache-tomcat-5.5.20/bin/bootstrap.jar:/usr/java/tomcat/apache-tomcat-5.5.20/bin/commons-logging-api.jar -Dcatalina.base=/usr/java/tomcat/apache-tomcat-5.5.20 -Dcatalina.home=/usr/java/tomcat/apache-tomcat-5.5.20 -Djava.io.tmpdir=/usr/java/tomcat/apache-tomcat-5.5.20/temp org.apache.catalina.startup.Bootstrap start
root      7740  7705  0 22:20 pts/2    00:00:00 grep tomcat
root     31105     1  0 Aug10 ?        00:00:10 /usr/java/jdk1.5.0_06/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/java/tomcat/apache-tomcat-5.5.20-test/conf/logging.properties -Djava.endorsed.dirs=/usr/java/tomcat/apache-tomcat-5.5.20-test/common/endorsed -classpath :/usr/java/tomcat/apache-tomcat-5.5.20-test/bin/bootstrap.jar:/usr/java/tomcat/apache-tomcat-5.5.20-test/bin/commons-logging-api.jar -Dcatalina.base=/usr/java/tomcat/apache-tomcat-5.5.20-test -Dcatalina.home=/usr/java/tomcat/apache-tomcat-5.5.20-test -Djava.io.tmpdir=/usr/java/tomcat/apache-tomcat-5.5.20-test/temp org.apache.catalina.startup.Bootstrap start

7277和7740即为tomcat进程。
结束进程:kill -9 7277或7740  
就可以结束对应的tomcat 进程。(有时候tomcat会抽了。。。在一个项目中修改完代码,重启之后发现进不了网站,其实就是进程抽了,结束相应进程重启解决)





posted @ 2011-08-14 22:25 Jimi 阅读(1127) | 评论 (0)编辑 收藏
一、分时段显示问候:
<script type="text/javascript">
var d=new Date();
var time=d.getHours();
if (time<12)
{
document.write("  尊敬的XXX用户:早上好!");
}
else if (time>=12&&time<=19)
{
document.write("  尊敬的XXX用户:下午好!");
}
else if (time>19&&time<=24)
{
document.write("  尊敬的XXX用户:晚上好!");
}
</script>
二、html显示空格:
<style type="text/css">
#divleft{white-space: pre;}
</style>
字体颜色:
style="color:white"
同一行中左右对齐:
<div id-"divleft" style= "display:inline;float:left"> 
</div>
三、返回上一页:
<a href="#" target=main onclick ="javascript:history.go(-1);">返回</a>
四、层叠样式优先级:
  1. 浏览器缺省设置
  2. 外部样式表
  3. 内部样式表(位于 <head> 标签内部)
  4. 内联样式(在 HTML 元素内部)

内联样式(在 HTML 元素内部)拥有最高的优先权,这意味着它将优先于以下的样式声明:<head> 标签中的样式声明,外部样式表中的样式声明,或者浏览器中的样式声明(缺省值)。
五、JS 回车提交表单:

<script type='text/javascript'> 
    function submitForm(frm,event){ 
      var event=window.event?window.event:event; if(event.keyCode==13){ 
        frm.submit(); 
      } 
    } 

</script>
<form method='post' action='test.html'> 
      用户名:<input type='text' name="username" onkeydown='submitForm(this.form,event)'><br/> 
      密 码:<input type='password' onkeydown='submitForm(this.form,event)'><br/> 
      <input type='reset' value='重置'> 
      <input type='button' onclick='this.form.submit()' value='提交'> 
    </form> 


六、表格:td的colspan属性,以及disable
<table border="1">
<tr>
<th>Month</th> <th>Savings</th>
</tr>
<tr>
<td colspan="2">January</td>
</tr>
<tr>
<td colspan="2">February</td>
</tr> </table>
posted @ 2011-08-11 00:24 Jimi 阅读(157) | 评论 (0)编辑 收藏