2018/3/4Lesson

Mar 4, 2018

2017/10/12

Xcode 9 beta 3 breaks the new os_log logger #883

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (message) {
const char *msg = [message UTF8String];
switch (logMessage->_flag) {
case DDLogFlagError :
os_log_error(OS_LOG_DEFAULT, "%s", msg);
break;
case DDLogFlagWarning :
case DDLogFlagInfo :
os_log_info(OS_LOG_DEFAULT, "%s", msg);
break;
case DDLogFlagDebug :
case DDLogFlagVerbose :
default :
os_log_debug(OS_LOG_DEFAULT, "%s", msg);
break;
}
}

记一下昨晚2017/10/30 学习拆换苹果手机电池过程

1:手机底部螺丝拧开
2:用提供的吸盘将屏幕吸起(可以用个牙签什么的顶住,然后一一打开)
3:将电池右下角的一个金属盖拧开,有两个螺丝
4:此时已经可以拔起该连接线
接下来几步是重点:
5:刮下电池底部膜,刮到出现白色黏条
6:白色黏条最重要!:慢慢把他抽出来。
总共左右两条黏条,千万不要抽断,不然要翘起电池,用牙签或其他方便工具卷着给他抽出来。
7:然后于是就把电池取出来了。
8:装上新电池,测试一下能不能成功开机。
9:买电池会送白色黏条。这时留一点在外面,白色黏条箭头在顶部。先把白色黏条黏在电池底部,然后黏在电池仓。
10:按着之前方式拧上螺丝,合上盖。
完成

git 回退到本地commit的某个SHA-1

根据-–soft -–mixed -–hard,会对working tree和index和HEAD进行重置:
git reset -–mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset -–soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset -–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

例如:git reset –hard SHA-1 此时的SHA-1 可以使用sourcetree 查看;或者使用git log 也可查看到该SHA-1

iOS 手机震动

// 普通短震,3D Touch 中 Peek 震动反馈
AudioServicesPlaySystemSound(1519);

// 普通短震,3D Touch 中 Pop 震动反馈
AudioServicesPlaySystemSound(1520);

// 连续三次短震
AudioServicesPlaySystemSound(1521);

这里记录一次昨天下午讨论团队职业规划过程及感悟

既然是团队职业规划,那当时是要将团队提升作为目标。
个人升级是最重要,自己不升级,怎么有话题,如何跟别人谈共享、交流、提升?
OK,自己升级,学习完,交流,交流之中补足,这很好。
最近任务要稍微好些,比刚从海外团队回来时间要充沛一些。早上从10点开始搞,基本下午进度好,能在8点左右完成,回家。此时基本整个人再也不想看电脑屏幕了,我想吐~~~咦,你不是热爱写代码吗?我去你妈的热爱写代码,去你妈的热爱。热爱是建立的单纯的想写代码,当和职业挂钩,每天重重复复,去你妈的还能每时每刻保有最初的心。
接着回到家,嗯,团队升级嘛,但是自己还有挺多的事,比如我自己手上还有3、4个小玩意进度才开启;哦,我还没吃饭,世界最好吃的饭是陪家人,于是等老婆也累的半死回到家,俩人在21点到22:20之间吃完饭。这时心里有点空荡荡的,接下来的时间每天比例,一半休息掉(再嘴里吼着“不能浪费时间,学习工作”的,你把头伸过来,大哥给你看个宝贝),另一半写自己的小东西,探索道路。玩能到12点半,工作也能到12点半。
第二天早上来,把公司所为的“两小时一次记录工作了啥”的邮件发了。真不知道这“两小时”记录是什么鬼,写重复的也不是,但是不写,更不是,又是心里一句去他妈的, 当然知道这是上上上层安排的,对大师博士还是一如既往尊敬。
周六是单双休,周日是都有休息。周六当时的规定是到公司学习,补足,交流,如果工作有没完成的,可以完成。你懂得,工作太足,就怕你闲着,怕你闲出病到时按工伤就不好了,于是基本周六都是工作木有两样。之前我有过思路:如果早上把PPT 赶好,中午的时候和大家交流最近学习、工作进展。那这挺好。但是从来周六都是工作,嘿嘿,这理由真他妈给力。周六要不就是我单纯学习自己的小知识点,但是能拿来讲的没能汇聚,只能自己独自搞一些小工程进行最佳实践。所以大师那句,“都没见你分享几篇”,给蛋疼的,不是不想不愿,而是无时无力。
“时间是挤出来的”
谁谁谁,这句话谁说的,把头伸过来,我给他看个宝贝。
你有生活,我没有生活的啊?你每天都能跟狗一样学习,不知疲倦?每天还跟大学一般拼了这条狗命的?
是的,我工作时候用心,我特么在工作中确实拼了这条狗命。每天下班都是难得休息,难得让脑袋放空。
团队提升,团队职业规划。这些都是要建立良好的机制,良好的环境。我特么自己忙的死了,还要陪他们玩团队职业规划的游戏。
我曰。
每天自己加油了。只能自己Add Oil了。
之前也有几次,他们讲一些知识,我去学习听讲。如果有机会,我就只能当做code review 来跟进。这是最好的结果了。
当然,一切建立在,周六上午能空闲一下的基础上。

1

1:由于用到贴图,网上寻觅不得.
只说 UIGraphicsBeginImageContext(<#CGSize size#>)->换成UIGraphicsBeginImageContextWithOptions(<#CGSize size#>,<#Bool opaque#>,<#CGFloat scale#>)
上面这句话是重点 scale是缩放因子,使用[UIScreen mainScreen].scale即可;
中间的opaque是识别里面有没有alpha通道,如果有通道则填入NO,相反的哦;
size则为你的图片的大小,比如上面一张大图,下面一张watermark,这size为大图的大小,毕竟大图在下面,第一个放入的; 这样子图片就会变为高清!!!没错,如果还没有变为高清,是有另一个原因的,那就是你的贴图不是@2x或者@3x的倍率,将其放入图片文件夹或者source,加入后缀,一定使用@3x,@2x也不怎么清晰!!!
最后一步才是本文重点.
网上没人说,自己尝试出来的

这一段是苹果私密api,用来找出Reveal的各个APP的bundleID,挺好用的
// Class
LSApplicationWorkspace_class = objc_getClass(“LSApplicationWorkspace”);
//
NSObject workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
//
NSArray
array = [workspace performSelector:@selector(allApplications)];
// id a = array[0];
//
NSLog(@”apps: %@”, [workspace performSelector:@selector(allApplications)]);

ASOverLayoutSpec

这里用到ASStackLayoutSpec 布局。之前都是从上往下布局完,样式OK。
但是新的需求来了,要求在其上面加上一个蒙版:
布局,我使用ASBackgroundLayoutSpec child 是上面的蒙版;back 是之前的背景布局;
但是总是出现拉伸;
后来试试使用ASOverLayoutSpec 返回来,试图终于如愿了。

最近在学习js

看阮一峰的文章ing…
从其早期JavaScript 文章往现在的时间线看。边看边敲command+shift+i
看廖雪峰JavaScript 文章

scrollView.contentSize

如果scrollView 不想上下出现拉动bug,将contentSize.height 设为0;否则contentSize.width 设为0;会默认设置为等大小试图

2018/1/10打包静态库(包含第三方库)

https://www.jianshu.com/p/155a3cfb765e?utm_campaign=hugo
https://www.jianshu.com/p/13bf46df9387
1:此处注意一点:需要输出包含有第三方的静态库,那么直接在拖进控件的时候不要选择”add to target”;
2:在Build Phrase 的compile Source 确认需要到处的多少个类
3:设置适配所有模拟器架构 project -> buildSeting -> Build Active Architecture Only 设为NO
以上两个目录把所有需要打包静态库的步骤和所需操作都罗列了。

创建podSpec

https://www.jianshu.com/p/d7d1942dd3f1
此处source 需要把目录改为对应目录。比如里面的文件夹需要/xxx/$.h/m

记录一次粉粉匿名做动画CAAnimation 的keyframe 动画和POP 动画同时存在产生的问题

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
26
27
28
29
30
31
32
33
34
35
POPAnimatableProperty *property = [POPAnimatableProperty propertyWithName:@"com.ffrj.starMove" initializer:^(POPMutableAnimatableProperty *prop) {
prop.writeBlock = ^(CALayer *obj, const CGFloat *values) {
CGFloat currentTime = values[0];
obj.timeOffset = currentTime;
};
prop.threshold = 0.01;
}];
POPBasicAnimation *animation = [POPBasicAnimation animation];
animation.fromValue = @0;
animation.duration = 0;
animation.property = property;
[popArr addObject:animation];
//
CGPoint startPoint = YYTextCGRectGetCenter(starBtn.frame);
CGPoint endPoint = CGPointMake((i+1)*minScaleWidth+30, 35+kTopStatusBarAndNavHeight);
CGPoint controlPoint = CGPointMake((endPoint.x+30), (YYTextCGRectGetCenter(starBtn.frame).y-endPoint.y)/2.0);
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:startPoint];
[path addQuadCurveToPoint:endPoint controlPoint:controlPoint];
CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animation];
positionAnimation.keyPath = @"position";
positionAnimation.path = path.CGPath;
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.fromValue = @1;
scaleAnimation.toValue = @0.0;
CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.fromValue = @1.0;
opacityAnimation.toValue = @0.0;
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
[animationGroup setAnimations:@[positionAnimation,scaleAnimation, opacityAnimation]];
animationGroup.duration = 1.0;
animationGroup.removedOnCompletion=NO;
animationGroup.fillMode=kCAFillModeForwards;
[starBtn.layer addAnimation:animationGroup forKey:@"animationGroup"];
starBtn.layer.speed = 0.0;

上面是加了CAAnimation 动画, 但是同时还加入了POP 某一个animation 的上下浮动位移动画:

1
2
3
4
5
6
7
8
9
10
11
12
13
if (!_startedAnimated) {
_startedAnimated = YES;
[self.starArray enumerateObjectsUsingBlock:^(UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
POPBasicAnimation *basicAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionY];
basicAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
basicAnimation.duration = 1.3;
basicAnimation.beginTime = CACurrentMediaTime()+(arc4random()%30*0.033);
basicAnimation.toValue = @(obj.centerY-8);
basicAnimation.autoreverses = YES;
basicAnimation.repeatForever = YES;
[obj.layer pop_addAnimation:basicAnimation forKey:NSStringFromSelector(_cmd)];
}];
}

这时出现了浮动POP 动画无法启动情况。
这里处理为: 在 prop.writeBlock 里面,使用贝塞尔数值计算进行位移。

这里记录一次js function 和箭头函数不同点

  • function 里面的this 指针是内部函数,外部需要const 一个。

箭头函数 由于内部将this 置空,他是没有this 的,他的this 属于外部调用的。同时,由于没有this 指针,所以其arguments 也是undefined 的。

  • module.export = xxx / exports default xxx / export = xxx 区别

写一个比较简洁的iOS 并发获取数据,combine 之后返回

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
- (void)getPlannerRShopBanner
{
@weakify(self);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@strongify(self);
__block NSArray *recommandArray = nil;
__block NSArray *plannerNewsArray = nil;
__block NSUInteger count = 0;
dispatch_semaphore_t semaphore_t = dispatch_semaphore_create(0);
[self.apiSession getPlannerShopBannerAndCallback:^(NSArray *model, PCError *error) {
if (isValidArray(model) && model.count > 0) {
count ++;
recommandArray = model;
if (count == 2) {
dispatch_semaphore_signal(semaphore_t);
}
} else {
dispatch_semaphore_signal(semaphore_t);
}
[self autoSavePlannerDataChange];
}];
[self.apiSession getNewPlannerBannerCallback:^(NSArray *model, PCError *error) {
if (isValidArray(model) && model.count > 0) {
count ++;
plannerNewsArray = model;
if (count == 2) {
dispatch_semaphore_signal(semaphore_t);
}
} else {
dispatch_semaphore_signal(semaphore_t);
}
}];
dispatch_semaphore_wait(semaphore_t, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_main_queue(), ^{
if (count == 2) {
dispatch_async(dispatch_get_main_queue(), ^{
self.view.headerRecommandDict = [recommandArray firstObject];
self.view.headerPlannerNewsDict = [plannerNewsArray firstObject];
});
} else {
DLog(@"没有获取到ad 或者某个ad 获取失败");
}
});
});
}

这里记录一个前端在解析json字符串,内容包含#\n# 产生无法解析且报错情景

1
2
3
if ([json containsString:@"\n"]) {
json = [json stringByReplacingOccurrencesOfString:@"\n" withString:@"\\u000A"];
}

首先解决方案如上,在解析前先替换该字符为ascii码。

出现的错误:Printing description of error:Error Domain=NSCocoaErrorDomain Code=3840 "Unescaped control character around character 90." UserInfo={NSDebugDescription=Unescaped control character around character 90.}

出现的类似语句:

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
26
27
28
{"font":{},"stickDate":"","bookId":18558,"diaryType":0,"diaryEmotionNode":{"content":"1♡
可乐要加冰
柠檬要加水
我的生活要加你

咖啡要加糖
披萨要加盐
我们的感情要加点油

别说什么东南西北都是你
别说什么天涯海角都是你
别说什么心里眼里都是你

我只需要你说
你的生活加点我.

或者给我一条人生建议
让我和你在一起.

感情不要甜言蜜语
不要纠缠不休.
只需要一句“我喜欢你”

感谢收听悦兮电台第六期《要加点你》
我是主播:苏雨诺
编辑:苏雨纤
写文:江抒
本次播音结束,请大家期待下一期~","imageList":[]},"geo":{"region":"普陀区","city":"上海市","address":"上海市普陀区云岭东路靠近东渡国际嘉庭广场","longitude":"121.387844","latitude":"31.222706","name":"东渡国际嘉庭广场","province":"上海市"},"lbsChange":0,"lbs":{"region":"普陀区","city":"上海市","address":"上海市普陀区云岭东路靠近东渡国际嘉庭广场","longitude":"121.387844","latitude":"31.222706","name":"东渡国际嘉庭广场","province":"上海市"}}
1
{"content":"23333♡\n可乐要加冰\n柠檬要加水\n我的生活要加你\n\n咖啡要加糖\n披萨要加盐\n我们的感情要加点油\n\n别说什么东南西北都是你\n别说什么天涯海角都是你\n别说什么心里眼里都是你\n\n我只需要你说\n你的生活加点我.\n\n或者给我一条人生建议\n让我和你在一起.\n\n感情不要甜言蜜语\n不要纠缠不休.\n只需要一句“我喜欢你”\n\n感谢收听悦兮电台第六期《要加点你》\n我是主播:苏雨诺\n编辑:苏雨纤\n写文:江抒\n本次播音结束,请大家期待下一期~","imageList":[]}

今天2018/2/9 放假过年啦

2018/2/24 redis 的homebrew 安装

http://blog.csdn.net/chenshuai1993/article/details/51519384

1
2
3
4
5
6
7
8
什么是原子性,什么是原子性操作?
举个例子:
A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:
1. 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。
2. 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。
如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。
我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。
如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。

mac 下安装也可以使用 homebrew,homebrew 是 mac 的包管理器。

1、执行 brew install redis

2、启动 redis,可以使用后台服务启动 brew services start redis。或者直接启动:redis-server /usr/local/etc/redis.conf

在远程服务上执行命令
redis-cli -h host -p port -a password

查看redis服务是否启动

ps aux | grep redis

这篇文章也不错
https://www.jianshu.com/p/af33284aa57a

记一次Mac node logger 保存path 权限问题

记一次运行node 服务器,其logger 记录path 在xxxx。
该目录没有获得权限,为只读。
错误表现:console 一直print:
ERROR 29252 [egg-logger] [/data0/wwwlogs/envelop.xxxx.com/logs/xxx-envelop-2000/egg-web.log] Error: EACCES: permission denied, open ‘/data0/wwwlogs/envelop.xxxx.com/logs/xxx-envelop-2018/egg-web.log’
解决方案:

  1. ctrl C 打断输出

  2. 在ternimal cd 到该目录,如:$ cd /data0/wwwlogs/envelop.xxxx.com/logs/xxx-envelop-2000

  3. 然后 $ chmod -R 777 *

将该目录下使用递归 赋予777 权限(chmod : change mode ,-R recursive, 777 可读可写权限)

将本地git push 到远程repository

git init
git commit -m “first commit”
git remote add origin git@github.com:shaohung001/ahuang_project.git
git push -u origin master