梦幻泡影

孔思哲的博客空间

0%

1.人怎样虐待动物,就会怎样虐待人。并不见得哪个民族是多么恶,而是集体作恶和作恶的“机遇”条件塑造的。并不见得某泱泱大国就。。。只是在某个时间某个条件下释放了人性的恶。

2.万事万物的源头究竟是什么呢?意识是什么呢?
我相信人是精心设计出来的,地球上动植物的基因都是设计好的。

npm更新模块并同步到package.json中

使用原始npm
1.查看需要更新的版本

npm outdated
该命令会列出所有需要更新的项目

2.修改package.json中需要更新的包对应的版本号

npm update
由于npm update只能按照package.json中指定的版本号进行更新,太繁琐复杂,接下来使用插件更新

使用 npm-check-updates
1.安装

npm install -g npm-check-updates
2.查看需要更新的版本

npm-check-updates
可以简写为ncu,该命令会列出需要更新的包。

3.更新

1
ncu -a

更新包的同时更新package.json文件

阅读全文 »

// [socket on:@”chat” callback:^(NSArray *dataArray, SocketAckEmitter *ackEmitter) {
// //NSLog(@”chat dataArray:%@”,dataArray);
// if (dataArray.count > 0) {
// NSString *messageStr = dataArray.firstObject;
// NSString *desDeStr = [messageStr desDecryptWithKey:deskey];
// if ([NSString isBlankWithStr:desDeStr]) {
// NSLog(@”数据解密失败”);
// return ;
// }
// NSLog(@”desDeStr:%@”,desDeStr);
// NSDictionary *messageDict = [self dictionaryWithJsonString:desDeStr];
//
// NSLog(@”messageDict:%@”,messageDict);
// NSString *msgId = messageDict[@”msgId”];
// // NSLog(@”ackEmitter.expected:%d”,ackEmitter.expected);
// #pragma mark –19年11-19修改
// // NSDictionary *dic = @{@”fromId”:[NSString acquireUserId],@”msgId”:msgId,@”msgBody”:dataArray.firstObject};
// NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSString acquireUserId],@”fromId”,msgId,@”msgId”,messageDict,@”msgBody”,nil];
// // [ackEmitter with:@[msgId]];
// [ackEmitter with:@[[JSON stringWithObject:dic]]];
// [weakSelf receiveSocketMessageWith:@[messageDict]];
//
//// NSDictionary *messageDict = dataArray.firstObject;
//// NSString *msgId = messageDict[@”msgId”];
////// NSLog(@”ackEmitter.expected:%d”,ackEmitter.expected);
////#pragma mark –19年11-19修改
////// NSDictionary *dic = @{@”fromId”:[NSString acquireUserId],@”msgId”:msgId,@”msgBody”:dataArray.firstObject};
//// NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSString acquireUserId],@”fromId”,msgId,@”msgId”,dataArray.firstObject,@”msgBody”,nil];
////// [ackEmitter with:@[msgId]];
//// [ackEmitter with:@[[JSON stringWithObject:dic]]];
//// [weakSelf receiveSocketMessageWith:dataArray];
// }
// }];

iOS 制作自己的Framework(引入第三方库)

一、创建工程并新建Framework Target

新建一个工程,Target选择Cocoa Touch Framework。

添加接口
在刚刚创建的Framework里面添加一些接口。

设置
对Target进行一些设置。
3.1 选择Framework Target,在Build Settings里面搜索Mach -O type,改为Static Library;
3.2 选择Framework Target,在Build Settings里面搜索Link With Standard Libraries,改为No;
3.3 选择Framework Target,在Build Phases的Headers里面将需要暴露出来的头文件设置好。public是可以被引用的,用户可以看到的,例如用户在使用的时候import “xxxxxx.h”,project和private是不暴露出来的。

Framework设置完成,进行下一步。
二、创建测试工程
Framework制作好了,我们需要一个Target测试一下吧。那么直接在刚刚创建的这个工程里面,新建一个Single View APP的Target就好了。

三、引入第三方库
如果我们在制作Framework的时候,需要用到第三方库怎么办呢?网上有轮子,而且有专人维护,总比我们自己造的强。但是如果公司有条件的话,最好是不引入第三方库。
我们在引入第三方库的时候,使用cocoapods进行管理,假设我们的SDK需要AFNetworking这个库,按下面操作引入。

com.sam.IMPro.SAMIM-Broadcast

com.sam.IMPro.SAMIM-BroadcastSetupUI

HiChat-iOS文档

请求加好友消息

收到的消息

1
2
3
4
5
6
7
8
9
10
11
12
13
data:(
{
"_id" = 5d1336c21d2f518fbdc2c8df;
"from_user" = 3800;
"msg_id" = "62a8ed70-1c75-41b9-c65b-9a1bd0fe4393";
"msg_type" = 101;
sendtime = 1561540290751;
text = "3800\U8bf7\U6c42\U6dfb\U52a0\U60a8\U4e3a\U597d\U53cb";
timestamp = 1561540290751;
"to_user" = kong;
type = 0;
}
)

iOS中几种延迟执行方法

开发中经常会有延迟执行的要求,这里简单介绍几种常用的方法:

    1. performSelector方法
    1. Timer 定时器
    1. Thread 线程的sleep
    1. GCD

Method1:performSelector

1
[self performSelector:@selector(delayMethod) withObject:nil/*可传任意类型参数*/ afterDelay:2.0];

注:此方法是一种非阻塞的执行方式,未找到取消执行的方法。

Method2:NSTimer定时器

1
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

注:此方法是一种非阻塞的执行方式,取消执行方法:- (void)invalidate;即可。

Method3:NSThread线程的sleep

1
[NSThread sleepForTimeInterval:2.0];

注:此方法是一种阻塞执行方式,建议放在子线程中执行,否则会卡住界面。但有时还是需要阻塞执行,如进入欢迎界面需要沉睡3秒才进入主界面时。
没有找到取消执行方式。

Method4:GCD

1
2
3
4
5
6
7
__block ViewController/*主控制器*/ *weakSelf = self;

dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0/*延迟执行时间*/ * NSEC_PER_SEC));

dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[weakSelf delayMethod];
});

注:此方法可以在参数中选择执行的线程,是一种非阻塞执行方式。没有找到取消执行方式。

阅读全文 »

主要使用

安装
首先可以先查看是否安装screen,通过命令
screen -ls
若出现

The program ‘screen’ is currently not installed. You can install it by typing:
sudo apt install screen

说明尚未安装,安装提示,通过命令:
sudo apt install screen 安装screen

新建窗口
1)可直接通过命令screen新建一个窗口,并进入窗口。但通过这种方式新建的窗口没有名字,只有系统分配给它的一个id。当需要恢复窗口时,只能通过id号来恢复。
2)通过命令screen -S name,这样就可以新建一个名字为name的窗口,同样系统也会分配给它一个id,当恢复该窗口时既可以通过id号也可以通过窗口名。

分离会话
退出当前新建的窗口,通过快键键Ctrl+a+d实现分离,此时窗口会跳出[detached]的提示,并回到主窗口。

恢复会话窗口
首先查看当前有哪些screen窗口,通过命令:
screen -ls 将列出窗口列表

由以上可知,当前有两个窗口,其中test窗口已经被杀死,test2窗口分离。可以通过以下命令恢复test2窗口:
screen -r test2 或 screen -r 27582
这样就返回了test2窗口

杀死会话窗口
通过命令kill -9 threadnum
注意此处只能通过id号来杀死窗口。

清除死去窗口
通过命令screen -wipe
这个命令将自动清除所有处于dead状态的窗口

专业版测试

日期:20190611 测试人员:孔德志

测试出的问题

安卓

bug

  • 1.先点击注册协议 再完善信息,完善所有信息后,注册按钮依然不能点击,需要取消再同意后才能点击注册。
  • 2.三台设备,用同一账号,一台设备登录,另外两台同时再登录,可能出现,都登不进去,也可能都能登录进去。

体验

  • 1.安卓昵称长度是10位字符,iOS是8位字符。
  • 2.密码没有提示长度。iOS密码没有长度限制,安卓6-15位限制。
  • 3.提示文字 在其他“安卓”设备登录
阅读全文 »

iOS纯代码自定义View

  • 1.UIGestureRecognizerDelegate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-(instancetype)init {
self = [super init];
if (self) {
[self setup];
}
return self;
}

-(void)setup {
self.frame = CGRectMake(0, 0, SIMScreenWidth, SIMScreenHeight);

UIColor *color = [UIColor blackColor];
self.backgroundColor = [color colorWithAlphaComponent:0.6];
self.bgView.backgroundColor = [UIColor clearColor];

[self addSubview:self.bgView];
[self.bgView addSubview:self.bgImageView];
[self.bgImageView addSubview:self.topImageView];
[self.bgImageView addSubview:self.textView];

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cancleButtonClick)];
tap.delegate = self;
[self.bgView addGestureRecognizer:tap];
}
1
2
3
4
-(void)layoutSubviews {
[super layoutSubviews];
_bgView.frame = CGRectMake(0, 0, SIMScreenWidth, SIMScreenHeight);
}
1
2
3
4
5
6
7
8
UIWindow *window = [UIApplication sharedApplication].keyWindow;
for (UIView * vc in [window subviews]) {
if ([[vc class] isSubclassOfClass:[SIMFDDCommonTipsView class]]) {
return;
}
}
[window addSubview:self];
[window makeKeyAndVisible];
1
2
3
4
5
6
7
8
9
- (void)cancleButtonClick {
UIWindow *window = [UIApplication sharedApplication].keyWindow;
for (UIView * vc in [window subviews]) {
if ([[vc class] isSubclassOfClass:[SIMFDDCommonTipsView class]]) {
[vc removeFromSuperview];
break;
}
}
}
1
2
3
4
5
6
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
if ([touch.view isDescendantOfView:self.bgImageView] || [touch.view isDescendantOfView:self.topImageView]) {
return NO;
}
return YES;
}

总结一下当我们使用纯代码创建自定义

UIVIew的时候步骤:
1、新建一个继承UIVIew的类;
2、在实现文件中添加子控件(weak声明);
3、重写- (instancetype)initWithFrame:(CGRect)frame初始化子控件但不设置子控件frame;
4、重写- (void)layoutSubviews,设置子控件frame,记得一定要写[super layoutSubviews];
5、提供一个模型属性,在该模型的set方法中为子控件赋值;