Jenkins

Jenkins是一款基于Java的持续化集成工具

下载与安装

LTS是稳定版 Weekly是尝鲜版

  • 下载后得到一个jenkins.war
  • 使用命令java -jar jenkins.war启动服务
  • 在浏览器中输入http://localhost:8080/
  • 第一次启动,会验证合法性,打开红底的文件,将其中的初始化密码粘贴到文本框中
  • 接下来是安装插件,可以安装推荐的插件,也可以自己手动选择,管理界面也可以下载安装插件
  • 等待一段时间后,创建管理员账号密码

扩展

1. 编译cocos2dx项目
2. 参数化构建

Subversion

subversion简称svn,svn和git是常用的版本控制工具,用于多人并行开发,项目管理

目录结构

一般来说,一个项目的svn目录下会有trunk,branches,tags三个文件夹

trunk

主干,大部分人,大部分功能都在此开发

branches

分支,有大改动,或者需要bugfix时,从trunk或者tag上拉分支开发

tags

标签,此目录只允许添加,不允许修改
一般是打包前从trunk或者branch上拉tag
用于2个版本diff和问题追查

流程

主干开发

  • 所有人员在trunk开发
  • 提交前先更新,解决好代码冲突

分支开发

  • 从trunk上拉branch,部分人员在branch上开发
  • 开发完成后,如需分支上线,则从分支拉tag
  • 如需要合并到主干,提交后,切换到主干,然后merge from branch,解决好冲突再提交

发布版本

  • 从trunk或者branch上拉tag,tag路径上最好带上版本号
  • check out tag并发布/使用自动化工具发布,如Jenkins

bugfix

  • 从tag上拉branch,branch路径最好能体现版本号及用途(如bugfix_1.0.1.2)
  • 参与bugfix的人员在branch上开发
  • bugfix完成后,版本号上升,按发布版本流程
  • 切换到主干,然后merge from tag,解决好冲突并提交

事情的起因是这样的…

iOS10即将发布,晚上逛网站,突然发现一篇新闻安全大过天iOS应用将必须支持ATS安全标准

好嘛,这简直不让人玩了
现在开发iOS9的APP都必须在Info.plist里加入App Transport Security Settings -> Allow Arbitrary Loads == YES
否则http请求都不允许你发

对用户来说是好事,对开发者来说就…

先说一下HTTPS为何物
简单来说,HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,是HTTP的安全版
即HTTP下加入SSL层,HTTPS的安全基础是SSL

用户安全了,你们的所有请求都被保护起来了
开发者就头疼了,https证书是收费的,企业级的应用该用上早用上了,个人开发者怎么活呀…

解决方案一:自行颁发证书(速成请直接看方案二)

在Linux/Unix/OSX下,HTTPS的SSL证书可以自行颁发

安装带SSL的nginx

我用yum装的时候nginx是带ssl的,所以请自行百度

然后配置nginx.conf,像我一样稀里糊涂不清楚具体位置可以输入nginx -V找到nginx.conf的位置

大致配置修改如下,修改前建议备份一下老配置

重启nginxsystemctl restart nginx

如果出现ssl模块的问题,则需要重新编译安装nginx,请自行百度

解决方案一的缺陷

现在你可以通过https访问你的网站了,但是你的证书浏览器可不认识
它们一般会向用户发出警告:

嘿,这个网站看起来像个假的,你的信息有可能被泄露,还要继续吗?

OMG!小白用户直接被吓走了好嘛…(此时你一定在想:我一步步照做,你竟然给我看这个?)

解决方案一的改进(这里必须step by step做)

由此可以看见,证书是解决方案一的症结,如何申请让各大浏览器爷爷都认可的证书呢?
我用的是StartSSL

由于每个人情况不同,我这里只讲我用到的所有东西,尽量不遗漏
1. dnspod.cn
2. 腾讯企业邮 添加[email protected]的用户,准备接受验证码
3. 一台电脑(你:这个我有,不要你讲)

先去StartSSL注册个账号,会发送一个验证码给你邮箱,如果收不到找找你的垃圾邮件里有没有
注册好之后,找到Validations Wizard选择Domain Validation (for SSL certificate)
填入你的域名,然后这里需要验证你的邮箱,我选择的是[email protected],这就是一开始让你准备企业邮箱的原因(当然也有别的企业邮箱,据说网易的也不错)
然后邮箱又会收到一个验证码,最后你就验证完了
但是!又是但是,他提示我们这个验证只有90天,之后需要重新验证,这个我还没到90天,我不知道到了之后会有什么样的灾难发生

然后跳到Certificates Wizard选择Web Server SSL/TLS Certificate
在Validated domain(s)中填入你要的域名,比如hello.yourdomain.com
下面的CSR文件,选择Generated by Myself (.cer PEM format certificate)
这里提供了Windows的方法和Linux/Unix的方法
1. Windows用户请直接下载那个exe
2. Linux/Unix输入

最后,Windows下直接记事本打开.csr文件,Linux/Unix下直接cat,把文本黏贴到网页上

最后跳到的网页,会让你click here一定别忘了点
下载下来是一个zip包,打开是4个zip包,找到NginxServer.zip,里面有个hello.yourdomain.com_bundle.crt文件(还好这次不是zip包了,否则就变俄罗斯套娃了)

利用我们这次得到的hello.yourdomain.com_bundle.crt文件和yourdomain_nopwd.key替换解决方案一里面nginx.conf的2个文件就可以了

解决方法二(其实并没有,耐心点看吧,为了孩子)

0. 需求

有两台机器,A和B,A机需要通过ssh访问B机

1. 在A机上生成公钥/密钥

然后输入保存路径,密码,重复密码
没有特殊需求直接敲3个回车就行了

2. 在A机上把公钥拷贝到B机

用scp将公钥拷贝到B机的root目录下

3. 在B机上将公钥添加到.ssh/authorzied_keys中

4. 在A机登录B机

不出意外就直接登陆上去了

5. 如果出了意外

试着删除A机中.ssh/known_host中对应的项目再试一次(我遇到过一次)

这条命令是找出所有带”java”的进程,然后排除”grep java”的进程,然后取第一位进程号,挨个kill -9

SimpleDateFormat

SimpleDateFormat是一个性能十分低下的工具类,滥用SimpleDateFormat十分容易导致性能问题
错误的示范:

错误的解决办法

如果将SimpleDateFormat写成static的,就可以避免重复创建,但是SimpleDateFormat又是线程不安全的,如果将其设成synchronized,性能又变差了

优雅的解决办法

比较优雅的做法是用ThreadLocal

网上的例子大多只支持一种格式

支持任意种格式的DateUtil

我稍加修改,现在多了一个format参数,具体代码

很久很久以前

刚从业时,是做Java后端的
我们知道Integer是int的包装类,2个int类型的值是可以通过a == b来进行比较的
于是想当然以为Integer也是可以这么比较

一次事故就要开始

一个简单的充值验证,需要比较充值数额是否相等,用的Integer类
我们测试的时候用的是1块钱(10金币),比较金币拿了2个Integer来做==判断
10金币顺利通过测试,100金币也是,随之上线

事故的爆发

产品上线后,从后台查询发现,只有10金币和100金币的充值记录(但按经验看来是不合理的)
也有玩家陆续反应100块(1000金币)充值失败

原因

Java中<128的Integer取的是常量,内存地址是一样的,>=128时,则是重新开辟了一块内存
又因为==是比较内存地址用的,比较值相等应该用a.equals(b)

测试代码

输出

问题的出现

iOS 项目中使用了MJRefresh,在 xcode6中使用 objc_msgSend 会报错Too many arguments to function call…

解决方案

在 Building Setting 下Apple LLVM 6.1 – Preprogressing下的Enable Strict Checking of objc_msgSend Calls设置成No

吐槽

苹果每次升级 xcode/iOS 都会出现一堆不兼容,然后你又可以通过设置某个值再去兼容,简直是 x 裤子放 y,像 arc 的编译参数之类的,自动判断一下啊… 恩 吐槽好了就舒服了

FMDB

全称FMDatabase,是一个用Objective-C写的sqlite封装

下载

可以通过github下载源码包,复制src/fmdb/下所有文件到项目目录下
也可以通过CocoaPods,添加pod 'FMDB'到配置文件中

代码

在Swift项目中添加Objective-C代码,会提示添加Bridgging-Header
在Bridgging-Header.h中添加#include "FMDB.h"就像写C的头文件那样
然后Swift里就可以用FMDB的所有类了

获取DB

添加数据

删除数据

查找数据

Enjoy it!

找回了一点写后端的感觉,呕吼吼吼