0%

在家办公,再次搭建开发环境,加上这次多次碰到,做此记录

subl 是我安装的编辑器,如果你看到这这篇博客,把subl换成自己的编辑器(vi、vim)即可。

1.在terminal 输入:subl ~/.bashrc

2.找到这个地方并添加自己的命令,可添加多个指令,用”;”隔开

3.在terminal 输入:source ~/.bashrc (立即生效)

1.在terminal 输入 svn 看是否有安装svn

** **

2.如果和我一样没装有svn则执行 sudo apt install subversion

** **

** 3.在首次使用svn check out的时候,会直接提示输入账号密码。**

** 4.如果想要修改svn的账号与密码,删除目录 ~/.subversion/auth/ 下的所有文件。下一次操作svn时会提示你重新输入用户名和密码的。换成你想用的就可以了。然后系统默认会记录下来的。**

在家办公,安装开发环境后无法粘贴。查询并自己实践后,解决方法如下:

** 1. sudo apt-get autoremove open-vm-tools **

** 2. sudo apt-get install open-vm-tools-desktop **

** 3.重启虚拟机**

** **我通过以上方法即可解决,如果执行步骤1失败,可参考下查看我的另一篇博客 ,看看是否为相同的错误

ubuntu apt-get安装软件Unable to locate package…”

由于受疫情影响(希望快点好起来),只能在家办公,再一次安装开发环境。

使用 apt-get install碰到以下问题

** 1.sudo apt-get update 更新软件源**

如果更新成功,无报错,无警告,则执行自己的下载即可

但是我执行最后有警告

Some index files failed to download. They have been ignored, or old ones used instead.

** **查询资料之后发现是自己的更新源问题,需要切换更新源,执行以下步骤

2.搜索打开 software&update

打开之后选择

选择other

** **

更换源之后执行 sudo apt-get update,无报错,之后再下载自己需要下载的即可

可能是这次下载的Ubuntu的问题,导致这个问题的出现,以前没碰到过。

博主最近的工作是开发游戏的任务系统。领导看了我的代码后,给我提出了一些意见。

任务情况大概是这样的,一个玩家登陆后,客户端会显示任务按钮,玩家点击后即可查看自己的任务。按照策划的需求,玩家目前有十几个任务。每个玩家的任务数据,都要记录在DB(数据库)中。

我最开始的做法是:

1.如果游戏开启了任务系统,当玩家登陆的时候,我会给每个任务都分配默认值。

2.将这些默认值都记录进db中。

3.在玩家点开任务图标时,客户端请求玩家的任务数据,服务器返回。

在偶然的情况下,虽然我得代码也能实现功能,但领导发现了我的代码会瞬间做很多的db操作,然后告诉我内容大概如下:“一般db操作就是我们服务器的瓶颈之一,可以不用一开始就给每个任务分配默认值,并记录进db。客户端请求的时候,直接返回一个默认值,当玩家参与了具体任务时,再对玩家的数据进行计算,并记录入数据库。”,

我之后进行思考觉得太tm有道理了。

1.可能有的玩家只登陆了一次,点开了任务图标,但是并且不做任务,我会在他点开图标时给他记录全部任务数据(默认值)。

** 2.可能有的玩家登陆了,只做了一个任务,之后便不玩了,但是我会在他点开图标时给他记录全部任务数据(默认值)。**

** 3.一瞬间,很多玩家首次点开任务图标,会造成瞬间很多很多的db操作。**

。。。。

太多的理由表明这是一个很糟糕的设计。

我在思考后,将程序改动整理后表达大概如下:

** 1.玩家点开任务图标,客户端请求任务数据时,如果数据库中没有记录玩家的数据,直接返回一个默认的值。例如:任务为杀1000只青蛙,直接则返回0只,并不用记录到db中**

** 2.当玩家参与到具体的任务时,再记录到db。例如:玩家现在杀了100只青蛙,则将100记录到db中。等到玩家下次点开任务图标时,返回存贮再db中的100。**

** 这样修改后,一开始那些默认的各种任务的默认值都不会写入db,即使有的玩家之登录一次,也点开了任务系统,也不会记录他的数据到db,一瞬间很多玩家首次点开任务系统,也不会有大量的数据瞬间要写入db。**

** **做此纪录,我可能还是有一些地方设计得不够好,欢迎相互讨论。

博主入职做游戏到现在已经是7个月的时间,框架是skynet,这段时间内,我大多写的都是游戏的活动,任务。其中这些东西都是有有效期限制的。

比如,活动是每日重新统计,每日任务是每天重新统计,每周任务是每周一的 00:00重新统计。那么就需要一个特定时间来reset用户的数据。

我刚开始的做法是,每天的 00:00,reset玩家的每日活动数据,每日任务数据。有一次我向我的经理请教问题的时候,他看了我的代码,对我的代码的评价大概是:你这么写也没什么错误,也没什么问题,但是可能会多出很多没必要的运算,比如一个玩家,他今天登陆了,之后三四天都没有登陆,但是你在这三四天也会去reset他的数据,如果有一个玩家,登陆了一次之后,再也不登陆了,你也会去reset他的数据。这样会多处很多没必要的db操作,玩家数量一上来,处理量就大了。我一听,觉得太tm的有道理了,经理果然不一样 = =!,牛逼,之后他对我进行了一下指点,做以下记录:

** 1.lazy update(好像是这么叫的),需要reset数据时,再去reset,这样可以减少很多db操作。**

** 2.每日任务,每日活动则记录玩家的参加活动时间(任务时间),当要更新活动或者任务时,再去判断当前时间与活动时间(任务时间)是否为同一天,如果是同一天,则不用reset,如果不是同一天,则reset玩家的活动与任务数据,并更新玩家的上次参加活动时间(任务时间)。**

** 3.同理别的也一样,当玩家触发事件的时间如果 大于或者等于 需要更新数据的时间,则reset玩家db中的数据。**


最近的工作是要求写一个任务系统,需要在特定日期重置任务,或者在天数后重置任务。

这就延伸出一个问题,如何得知条件天数后的日期。

这个问题的难点在于,每个月的天数不一样,加上相同的天数后每个月变化后的日期怎么处理。

例如,我们要求40天后的日期

其实lua的时间函数十分强大,可以用以下方法:

1.算出当时间,以表表示。

2.算出40天后的日期。

程序与结果如下

1
2
3
4
5
6
7
8
9
10
11
local now_time = os.date("*t", os.time())
for k,v in pairs(now_time) do
print(k,v)
end
print("----------------分割--------------------------")

now_time.day = now_time.day + 40
local next_monday = os.date("*t", os.time(now_time))
for k,v in pairs(next_monday) do
print(k,v)
end

特别说明

1.os.date创建日期表时now_time,所有的字段均在有效范围之内。(例如, now_time.daya+40之后,now_time.day = 57)

2.os.time传入一个修改后的日期表now_time(now_time.day = 57)时,其中的字段不需要归一化,会自动处理,得到新时间戳

3.得到的t2时间戳通过os.date转化为日期表,及可得到40天后的被归一化日期表。

4.同理也可以通过改变hour来计算5小时后,改变min来计算100分钟后,改变month来计算6个月后的日期。

这两天工作,碰到一个实用的mysql存贮json问题,需要查找mysql中存贮的json中的json作此记录。

因为mysql是关系型数据库,所以如果想在一个key中存贮更多的数据,存贮一个json是不错的选择(支持存贮多层的json)。

我用到的activity_conf表格中activity_config中存贮的就是json。

1
2
3
4
5
DROP TABLE IF EXISTS `activity_conf`;
CREATE TABLE `activity_conf` (
`activity_id` char(64) COLLATE utf8mb4_general_ci NOT NULL COMMENT '活动ID',
`activity_config` json DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

我需要获取 activity_config中存贮的end_time,而end_time是两层json如下

可用以下语句

1
select activity_id, json_extract(activity_config, '$.end_time.conf_value') as end_time from activity_conf;

查找结果如下

** 可以使用以下语句查找mysql中存贮的json数据:**

1
select json_extract( key, '$.fir_json_key.sec_json_key') from table;

打完收工

mysql是关系型数据库,为了方便的记录更多的数据,现在工作中用的mysql记录得value是以json的形式记录的。

例如:

player_data表格结构是这样的:

1
2
3
4
5
6
DROP TABLE IF EXISTS `player_data`;
CREATE TABLE `player_data` (
`uid` bigint(20) NOT NULL COMMENT '用户ID',
`data` json NOT NULL COMMENT '游戏数据,以json形式包含',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

player_data中玩家的数据是这样记录的:

key:uid — value:{“data”: { “user_prize”: 0}

我需要计算所有玩家user_prize的总和,这样即可

1
select sum(data->"$.user_prize") from player_data where data->"$.user_prize" is not null

mysql中存贮json,应用十分的强大,不仅可以存贮单层的key(如上),还可以可以存贮多层的key,关于多层key的应用之后在更新。

书籍是人类进步的阶梯,在没看lua程序设计第四版之前,并不知道lua有整除运算符,需要返回整除结果的时候,自己还得进行多余的运算,减去小数部分。前几天需求刚好需要用到整除和取一个浮点数的整数部分,运用之,作此记录。

整除

lua中“** / ”代表除法,计算结果都是存在小数的。lua5.3后还提供了一个整除的运算符“ // **”。

取整数

lua数学库提供了三个取整函数

math.floor(),math.ceil()和math.modf()

math.floor()向负无穷取整

math.ceil()向正无穷取证

modf向零取整(有两个返回值,返回整数与小数部分)