501JOY

  • 首页

  • 归档

bitbucket加速

发表于 2021-01-12 | 更新于 2021-08-03

在.ssh/文件夹下添加一个config文件,内容如下:

  • macos/ubuntu
1
2
3
Host bitbucket.org
User git
ProxyCommand nc -x localhost:1080 %h %p
  • centos7
1
2
3
Host bitbucket.org
User git
ProxyCommand ssh root@ip nc %h %p
  • windows
1
2
3
Host bitbucket.org
User git
ProxyCommand connect -S localhost:1080 %h %p

其中需要修改1080端口为自己的代理端口

IOS上关于法国问题的一个巨坑

发表于 2019-12-03

产品上线,有法国的玩家反馈,卡死在loading界面,还发了视频。第一反应是,这应该是个例,没有理睬。

一周后,发现留存有问题。分析数据后发现,法国地区的用户,留存几乎为0。所以,这里一定有问题。

第一步,我们先复现这样的情况,

  • 采用法国地区的账号下载,没有问题。

  • 把游戏中的语言切换成法语,没有问题。

  • 把设备中的语言修改为法语,没有问题.

  • 把设备中的地区修改为法国,问题复现了。

第二步,采用xcode联调,查看问题

最后发现在在解析地图的时候,被catch了。提示

1
未知的char :.

刚刚开始以为出现了空格,逐步打印日志,并没有发现多余的空格。其实这里的提示是指,无法解析.。

这就无法解释了,地图中采用了浮点数,里面存在大量的.,为什么会不支持.的解析呢

查阅资料后,发现这里的float.Parse具有文化环境。法国地区的表达小数是用,,而不是.。举例

1
2
3
数字: 12.34
通常表达 12.34
法国地区表达: 12,34

所以法国地图的解析无法识别.

解决方法

在项目启动的时候,处理Culture

1
2
3
4
5
6
7
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");

CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

记苹果审核被虐惨经历

发表于 2019-09-11 | 更新于 2019-09-12

一款产品要上线,先准备苹果审核,但是过程很痛苦

第一次在A账号一次顺利通过审核

因为需要推荐,所以需要转到B账号下,但是规定只有release过的产品才能转账号,所以只能在A账号下删除,B账号再上架


奇迹出现了


第二天,苹果给了一个回复。找不到STORE,状态是元素缺失

我们给他们回复,告知他们商店的位置,并截图给他们看

隔了一天,被Reject回来,内购测试失败,并附有截图。我们看了截图后明白,审核的时候没有从苹果后台拿到商品列表,导致在内购的时候,价格信息是空的。第一反应,审核的时候网路不好。所以立刻反馈给他们,说明网络问题,再重新审核一次

第二天,还是相同的问题,被打回来。此时注意到所有的内购商品都是需要开发人员操作状态。明白了,应该是这个导致的。但是这种也就是在描述中加一个空格,保存一下,所有的商品就变成了等待审核。所以就再次回复,提示再审核一次

隔了一天,还是被相同的原因打回来了,并在反馈中,提示我们的服务器是否有问题。服务器当然没有问题,自己人都用相同的二进制包(testflight)测试所有的内购项目,每次都没有问题。

我们推荐可能是二级制包导致苹果后台状态错误的原因,所以重新出新的二级制包,重新提交审核(当然对所有内购的产品都测试一遍)

第二天,还是被相同的问题打回。另外的开发人员,发现所有的商品又是需要开发人员操作状态,也是简单操作之后,就又变成等待审核。此时怀疑,我们测试没有问题,苹果人员审核总是拿不到商品,是不是因为我们的商品不是已批准状态?而对于内购和二级制,苹果是分开来审核。所以之后的操作就是等

又隔了2天,内购商品的状态只是从等待审核变成了正在审核,但是状态又不变化了。我们不想再等了,仔细分析,应该是苹果那边对我们商品状态出出了问题,从而导致那边总拿不到商品列表。
我们给他们写反馈(文字+图片),他们的回复总是通用的,你们的服务器是不是有问题之类的回答。

针对这个问题,我们的结论是商品的状态一定出了问题,且很有可能是苹果后台导致的。有解决中心沟通,总是说不清楚,所以我们想规避它。把商品全部删除,再重新添加新的商品(只是productID不同)。这次想把商品先提交审核,等审核过了,再提交二级制(根据内购和二级制包分开来审核的理论)

隔了一天,苹果在内购中反馈说,二进制包没有,需要上传才能审核,并把所有的商品都打回——需要开发人员操作。因此,刚刚的理论是错误的,第一次审核的时候,一定要二进制和内购一起审核。等有游戏上线后,之后的内购可以提前审核。

这次把已经测试好的二进制一起上传,并提交审核。

功夫不负有心人,这次终于审核通过了

记录自动化编译过程

发表于 2019-09-02 | 更新于 2019-09-19

项目需要每天都自动编译版本,所以处理了自动化编译的脚本,过程中遇到几个问题。

  • internal & gradle编译

    用gradle总是提示gradle版本不一致,之后直接改用internal

  • crontab 没有执行

    因为crontab路径的问题,需要在shell中处理Shell路径获取与变量设置

  • crontab 执行了部分逻辑

    因为crontab环境变量问题,导致部分工具找不到,需要执行source /etc/profile

  • codesign失败

    因为ssh方式连接到编译机器,默认是没有账户的,但是访问钥匙串要求必须有用户身份,所以添加一步输入密码解锁钥匙串。
    security unlock-keychain -p "login pwd" ~/Library/Keychains/login.keychain

  • Xcode: Internal launch error: process launch failed: Unspecified

    因为在钥匙链中的证书,选择了”总是信任”,需要改成”系统默认”

  • No signing certificate “ios Development” found : No “ios Development” signing certificate matching

    这种情况,主动在终端中用命令可以执行,但是通过crontab执行相同的脚本,就是报上面的错误。主要原因是证书,证书都是在钥匙链中的登录下,需要复制一份到系统(system)下。或者在crontab中,用bash -l来进入login shell。

记一次服务器被当成肉鸡事件

发表于 2019-08-12

有一台闲置的服务器,用它部署了游戏的test和dev的服务,这些服务依赖memcached和mysql服务。

一段时间后,发现访问test和dev服务器很慢,以为是服务挂了呢,ssh连上后进程还在,但是ssh过程很慢,很卡。

在服务器的后台监控发现服务器的CPU和网络带宽特别高。第一感觉是,服务器被人攻击了。

用iftop命令查看到memcached的带宽很高且和美国ip的地址有tcp链接

1
sudo iftop -n -P

咨询之后,得出来的结论是:Memcached反射DDoS攻击


解决方法:

  • 把11211端口配置防火墙策略,只能内网访问

  • 升级memcached到1.5.6版本以上

参考资料:

  • 防止Memcached的DDOS攻击另外一个思路
  • 关于利用memcached服务器实施反射DDoS攻击的情况通报

Layabox2.0 文字使用阴影问题

发表于 2019-07-12 | 更新于 2019-09-12

Layabox2.0 中文字需要加入阴影 使用 Laya.GlowFilter 可是某些Label文字在突然出现被拉伸或缩小的情况(现还未查明原因)。

所以CXB提议将出现问题的Label中的文字使用位图字体。

使用为题字体可以解决问题变形的问题,但是需要注意使用位图的Label不能再设置filter,否则文字阴影会加大,也会导致最后的文字出现右侧被截取的现象。

进程管理

发表于 2019-07-04

游戏服务器的开启,关闭都是手动操作,着实很麻烦。找了一下工具

  • upstart

这个没有用,感觉不跨平台

  • pm2

这是node.js下的一个工具,支持跨平台。虽然之前没有用过,看了一下quick start,不复杂,比supervisor简单

  • supervisor

之前有用过,还比较方便,支持autostart

  • forever

没有用过

  • systemd

Linux系统自带的,属于系统工具。不夸平台(Mac, Window)下没有

Nginx代理并内容替换

发表于 2019-07-04

必须说,Nginx太强大了

今天又一个需求,把一个http服务,变成https服务,很容易想到Nginx的反向代理,但是配置好发现,网页是乱码,且出现了很多404错误。

打开浏览器的开发工具,发现404的请求都是走原来的链接,没有走新的https地址。

再进一步分析,是因为http服务中,有一些text/html和text/css中,有原http地址。这怎么处理?

查询了一下,发现Nginx已经有这个功能了—ngx_http_sub_module

主要指令

  • sub_filter

sub_filter old new
用于设置需要使用说明字符串替换

  • sub_filter_last_modified

sub_filter_last_modified on | off

  • sub_filter_once

sub_filter_once on | off;
用于设置字符串替换次数,默认只替换一次。如果是off,那么所有匹配到的字符都会被替换;

  • sub_filter_types

sub_filter_types
用于指定需要被替换的MIME类型,默认为“text/html”,如果制定为
,则为所有的。

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 443;
server_name example.501joy.net;
ssl on;
root html;
index index.html index.htm;
ssl_certificate ssl/1_example.501joy.net_bundle.crt;
ssl_certificate_key ssl/2_example.501joy.net.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://example.501joy.cn/;
# 反向代理规则
proxy_set_header Accept-Encoding deflate;
sub_filter 'http://example.501joy.cn' 'https://example.501joy.net';
sub_filter_types text/html text/css;
sub_filter_once off;
}
}

记一次DCloud和穿山甲广告的问题

发表于 2019-06-07 | 更新于 2019-06-08

因为项目包体要求,采用DCloud中的wap2app模块,而广告采用的是穿山甲。整个过程还算顺利。但是最后在编译release
包的时候,出现了crash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
06-04 18:46:38.681 23320 23320 E AndroidRuntime: FATAL EXCEPTION: main
06-04 18:46:38.681 23320 23320 E AndroidRuntime: Process: com.orangesky.fish, PID: 23320
06-04 18:46:38.681 23320 23320 E AndroidRuntime: java.lang.VerifyError: Verifier rejected class com.androidquery.callback.DrawableAjaxCallback: android.graphics.drawable.Drawable com.androidquery.callback.DrawableAjaxCallback.getResizedImage(java.lang.String, byte[], int, boolean, int, boolean) failed to verify: android.graphics.drawable.Drawable com.androidquery.callback.DrawableAjaxCallback.getResizedImage(java.lang.String, byte[], int, boolean, int, boolean): [0x10] register v1 has type Conflict but expected Precise Reference: java.lang.String (declaration of 'com.androidquery.callback.DrawableAjaxCallback' appears in /data/app/com.orangesky.fish-VlxMWgN4XJz0OljJrLz9vQ==/base.apk)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.androidquery.callback.DrawableAjaxCallback.async(Unknown Source:0)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.androidquery.callback.AQuery2.a(AQuery2.java:64)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.androidquery.callback.AQuery2.image(AQuery2.java:19)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.androidquery.AbstractAQuery.image(AbstractAQuery.java:775)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.androidquery.AbstractAQuery.image(AbstractAQuery.java:755)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.androidquery.AbstractAQuery.image(AbstractAQuery.java:733)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.androidquery.AbstractAQuery.image(AbstractAQuery.java:701)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.bytedance.sdk.openadsdk.activity.TTRewardVideoActivity.a(TTRewardVideoActivity.java:194)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.bytedance.sdk.openadsdk.activity.TTRewardVideoActivity.onCreate(TTRewardVideoActivity.java:80)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7084)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7075)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2767)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.ActivityThread.-wrap11(Unknown Source:0)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1613)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6635)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
06-04 18:46:38.681 23320 23320 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

通过关键信息java.lang.VerifyError,查阅互联网的一些博客,解决方法有很多,感觉应该是一个简单的问题。我在这个项目
中的表现是

  • debug包没有问题,release包在部分机器上有问题

  • release包在android 7.1.1中crash, 但是在android 9.0中没有问题

  • debug和release包的混淆和配置都一样

  • 穿山甲提供的demo在相同的环境下,没有crash


网络中给的此类问题的解决方法:

  • clean project & delete build finder & rebuild project

  • clean project and Invalidate Caches/Restart menu

  • 修改配置

    go to “File” > “Settings” > “Build, Execution, Deployment” > “Instant Run”,
    uncheck the box “Enable Instant Run…” and click “OK” button

  • 修改proguard

  • 换电脑编译


这个问题的主要意思是类是没有错误但是版本不统一

最会检查到穿山甲中依赖gif库, 版本为1.2.6

但是DCloud 5plus+中也依赖这个gif库, 但是版本为1.2.15

差距很大。

现在这个阶段的解决方法,只能出debug包,静等他们更新依赖库

Linux command

发表于 2019-05-20

重命名

例子:将目录A重命名为B

mv A B

例子:将/a目录移动到/b下,并重命名为c

mv /a /b/c

12

501joy

19 日志
© 2021 501joy
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Muse v7.1.0