说有一个屋里有多个桌子,有多个人? 如果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 阅读(3402) |
评论 (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 阅读(4160) |
评论 (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 阅读(5612) |
评论 (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 阅读(10757) |
评论 (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 阅读(58581) |
评论 (9) |
编辑 收藏