0%

本文主要讲述 Mac 一些常用配置,优秀的软件,常见实用技巧

系统设置

  • 启用触摸板右键;系统设置 -> 触摸板 ->光标与点按 -> 辅助点按; 可以选择轻点右下角或者双指头触摸
  • 启用触摸板三指拖移; 系统设置 -> 辅助功能 -> 鼠标与触控板 -> 触控板设定
  • 苹果的 F1 ~ F12是常用的影音娱乐功能, 对于码农来讲,会更习惯将 F1F12 设定为功能按键, 你可以打开你的终端 输入以下代码 defaults write -globalDomain com.apple.keyboard.fnState -int 1 将 F1F12设定为IDE功能按钮
  • 我们在安装一些破解软件的时候, 有时候会提示无法打开已损坏的安装包; 命令行执行sudo spctl --master-disable ,关闭验证
  • Dock 栏优化, 移除不常用的 app, 打开自动隐藏 dock 快捷键 command + option +D
  • 设置触发角,出发常用的锁屏,开启屏保等功能; 系统设置->桌面与屏幕保护程序->桌面保护程序->触发角; 设定后光标移动到屏幕四个角,会触发不同的操作;

扩展优化

mac 系统有一个很强大的预览工具; 选中文件后按空格可以预览选中文件,支持很多格式,但是如果我们想获取更好的阅读体验更多的文件支持类型,我们就需要安装一些扩展; 在安装扩展之前需要安装一个超级强大的 brew , brew 是 mac 系统上的一个包管理器,就像 linux 上的 yum 和 apt-get ;

1
2
<!--在终端执行下面这个语句进行安装-->
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装完成之后在终端输入 brew -h , 可以查看 brew 的帮助文档; brew 安装完成以后就可以通过 brew 安装一些常用的插件和软件包; 安装上面说到的预览扩张工具,

  • qlcolorcode ,这是一个代码高亮的插件,效果如图所示:
1
brew cask install qlcolorcode

qlcolorcode

  • qlmarkdown, 这个插件能让我们预览 markdown 文件的渲染效果:
1
brew cask install qlmarkdown

qlstephen

阅读全文 »

前段时间觉得自己的硬盘不够用,而且有一些远程访问资源和远程下载任务的需求; 跟女朋友商量一下, 批了资金买了一个群辉 NAS; 因为家里的网络条件没有公网 ip, 光猫拨号上网, 群辉自带的 quickconnect 连接速度太慢了; 趁着国庆在家就研究了一下内网穿透的技术;想通过内网穿透来访问家里的群辉

关于内网穿透

本来打算用路由器做内网穿透,然后给 nas 做端口转发, 但是华硕 AC66U-B1刷了梅林之后打游戏老掉包, 于是就在 nas 上做了内网转发; 内网穿透的服务有好几种: eg: * 花生壳 —–> 死贵 * nat123 —–> 没用过 * ngork —–> 刚开始用的这个, 但是找了好几个帖子,提供的客户端的配置文件和应用程序都不能下载了(不想花钱); 放弃了; * frp —–> 当前使用的 * 还有一些淘宝上的盒子, 都比较贵 选择 frp 是因为之前购买的 vps 除了 ss 服务没有其他业务运行, 放着也是浪费, 而且测了一下连接速度很快,不得不提我这个 vps速度真的很快, vultr的vps加了 bbr 之后在线看4K无压力的 ;

阅读全文 »

Alfred, 我叫它小红帽; 是 Mac 平台上一个能够大幅提升生产力的效率工具,通过强大的workflow 机制,能够帮助我们快速打开网页、快速进行自定义搜索、查看剪贴板历史、快速查询单词等一些基础功能,通过自己去编辑脚本,可以实现更多的功能,解决输入输出的痛点,极大的减少了重复的操作,减少不同程序之间的切换步骤,成吨的节约时间。

alfred

先简单介绍一下常见的使用场景: 平常我们搜索关键词需要打开浏览器,然后输入关键词;执行搜索,但是用小红帽,配置好以后输入想要搜索关键词,然后按 enter 就好啦~

search

有时候突然忘记一个单词的中文意思是什么,先移动下鼠标,打开词典工具,然后输入单词,但是用小红帽,我们通过一个 关键词唤起,然后输入想要查询的单词, enter 就出来了; 还可以通过 shift 键来预览其他释义;

translate

当然这只是一丢丢的功能;据统计大约扩展出来的 workflow 至少有500+,有热心网友列了一个表格来管理; 你可以下载并免费使用其中任何一个 Workflow,甚至还可以基于一些不错的 Workflow 加入自己的想法,改造成属于自己的,符合自己工作习惯的 Workflow(前提是已解锁 Powerpack )。

阅读全文 »

vi(vim)是上Linux非常常用的代码编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi)。在一般的系统管理维护中vi就够用,如果想使用代码加亮的话可以使用vim

阅读全文 »

好久没有更博客,天天忙也不知道都忙了什么; 之前说要连续写30天博客,连续推送30天代码的目标在某一天给断了. 结果也不了了之 昨天晚上临睡前看了一会 O' Reilly Media, Inc 出的 Python学习手册, 在书中有一段讲Python和其他语言进行对比的段落,觉得说得很棒; 真是说到我心坎里了,因为最近正好做了一个项目,是二次开发; 嗯 ,说得好听的话叫做项目重构,说的不好听了叫项目重写; 当时拿到项目代码之后整个人是崩溃的,文件结构大概是这样子

阅读全文 »

UItableview 是 iOS 开发中最常用的 ui 控件之一,也是最常出现的控件之一; 常常负责一些列表数据的渲染,因此对 UITablevie 进行性能优化是很有必要的;

1 cell 重用

1.1 数据源方法优化

1
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

每次刷新都去创建新的 cell, 性能; 我们会传建一个静态的变量来作为标识符去创建 cell, 每个 cell 都会注册一个标识符,放入缓存中,如果需要调用,就从缓存池中找到对应的 id, 只有一处屏幕的 cell 才会被放入缓存中

1
2
static NSString *resuseID = @"CellID";
UITableviewCell *cell= [tableview dequeueReusableCellWithIdentifier:resuseID];

1.2 缓存池的实现

当 cell 要初始化的时候, tableview 会在堆中开辟内存为 cell 缓存使用. cell 的重用通过 identifier 标识不同类型的 cell,

1.3 缓存池取出可重用 cell 两种方法的区别

1
2
3
4
5
6
7
8

// 这个方法会查询可重用Cell,如果注册了原型Cell,能够查询到,否则,返回nil;而且需要判断if(cell == nil),才会创建Cell,不推荐
-(nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
// 使用这个方法之前,必须通过xib(storyboard)或是Class(纯代码)注册可重用Cell,而且这个方法一定会返回一个Cell
-(__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
//注册 cell
- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

2 定义尽量少类型的 cell 以及善用 hidden 隐藏或者显示 subviews

2.1定义一种类型的 cell

​ 分析 cell 的结构,尽量将相同内容抽取到一种样式 cell 中,前面已经说到了 cell 的重用机制,同种类型保证重用

2.2 善用 hidden 去显示或者隐藏 subviews

​ 与2.1对应

3 提前计算并缓存 cell 的高度

在iOS中,不设UITableViewCell的预估行高的情况下,会优先调用”tableView:heightForRowAtIndexPath:”方法,获取每个Cell的即将显示的高度,从而确定UITableView的布局,实际就是要获取contentSize(UITableView继承自UIScrollView,只有获取滚动区域,才能实现滚动),然后才调用”tableView:cellForRowAtIndexPath”,获取每个Cell,进行赋值. 如果项目中 cell 比较多,是非常影响性能的; 可以使用UITableView-FDTemplateLayoutCell 去计算 cell 的高度,以及缓存

4 异步绘制

减少cell 在主线程的时间消耗,异步渲染视图, 如果图片较多,可以使用预渲染技术

5 按需加载

使用 scrollview 的代理方法进行判断, 当 tableview 静止或者滑动减速的时候进行异步加载,之家在目标范围内的 cell; 减少了无关的性能损耗;

6 减少动态添加 subviews

7 减少 cell 子视图的绘制

在日常开发中, 设计师有时候会设计一个看起来小小的按钮, 用户很难点击到这个按钮; 为了解决这个问题,简单粗暴的就是将 button 的 frame 放大, 分别调整button的 frame 和显示内容的 frame ,即麻烦,又显得怪异;如果我们使用 runtime 关联对象的方法对 button 进行扩展,去扩大 UIButton 的可交互区域,这样会更好一点 ​ 其执行原理为:OC中创建类别(Categroy)的方式,并不允许给已有的类扩展属性,只可以给其扩展方法。所以,需要使用Runtime“黑魔法”中的关联对象(Associative Object)的一些方法,动态地为某个button对象添加扩展距离的属性,然后检测UITouch事件的触摸点是否在我们扩展距离后Rect内,从而达到想要的效果。 ​ 首先,创建一个UIButton的Category,起名为EnlargeTouchArea,设置一个外界可访问的方法setEnlaEdgeWithTop:right:bottom:left,在使用时也只需使用这个方法即可,传入的四个参数分别是上、右、下、左的扩展距离。

阅读全文 »

前言

安装Redis需要知道自己需要哪个版本,有针对性的安装,比如如果需要redis GEO这个地理集合的特性,那么redis版本就不能低于3.2版本,由于这个特性是3.2版本才有的。另外需要注意的是,Redis约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版(如2.8版、3.0版),奇数版本是非稳定版(如2.7版、2.9版),生产环境下一般需要使用稳定版本。

下载安装包

1
wget http://download.redis.io/releases/redis-4.0.2.tar.gz

解压并安装

1
2
3
4
tar xzf redis-4.0.2.tar.gz
cd redis-4.0.2
make
make install

Redis没有其他外部依赖,安装过程很简单。编译后在Redis源代码目录的src文件夹中可以找到若干个可执行程序,安装完后,在/usr/local/bin目录中可以找到刚刚安装的redis可执行文件。 如下:

redis 安装目录 那你也可以通过命令 redis -server 命令来执行启动 redis; 启动后界面如下: redis 启动界面

阅读全文 »

前言

最近参与公司 ERP 项目, 负责了一下前端页面开发; 之前接触 js 比较浅, 在做项目中遇到了一些问题, 比如数组去重, 对象数组去重等问题;

使用 Array.form() set集合

1
2
3
4
let arr = [1,1,2,3,4];
let result= Array.from(new Set(arr));
console.log(result);
}

遍历,利用 indexOf 判断

1
2
3
4
5
6
7
let arr = [1,1,2,3,4];
var temp= [];
for (i in arr){
if(temp..indexOf(arr[i]) == -1){
temp.push(arr[i]);
}
}

遍历 利用对象的 key, 判断数据值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var arr = [
{id: '121', count: 20},
{id: '122', count: 20},
{id: '123', count: 20},
{id: '121', count: 10},
{id: '122', count: 11}
];
let tempDict = {};
let newArr = [];
for(let i=0;i<arr.length;i++) {
if(!tempDict[arr[i].id]) {
tempDict[arr[i].id] = true;
newArr.push(arr[i]);
}
}
console.log(newArr);
Array(3)
{id: "121", count: 20}
{id: "122", count: 20}
{id: "123", count: 20}

forEach

1
2
3
4
5
6
7
8
9
let arr1 = [{skuid:1111,count:222},{skuid:2222,count:3},{skuid:1111,count:222},{skuid:2222,count:3}];
let temp= [];
arr1.forEach(item => {
item = Object.assign(item);
let sku = this.alertInfoArr.find(sku=>sku.skuId===item.skuId);
if(!sku){
temp.push(item);
}
});

  • 清除当前输入行 control + u
  • 删除当前输入命令最后一个单词 control + w
  • 跳转至行首/行尾 control + a/e
  • 清除屏幕 control + l or clear
  • 新建窗口终端标签 cmd + t

基本命令 :

  • 列出文件 ls 参数 目录名
    eg:看看驱动目录下有什么:ls /System/Library/Extensions 参数: -w 显示中文, -l 详细信息, -a 包括隐藏文件
  • 转换目录 cd
    eg:想到驱动目录下溜达一圈 cd /System/Library/Extensions
  • 建立新目录 mkdir 目录名 eg: 在驱动目录下建一个备份目录backup mkdir /System/Library/Extensions/backup 在桌面上建一个备份目录 backup mkdir /User/用户名/Desktop/backup
  • 拷贝文件 cp 参数 源文件 目标文件
    eg: 将text.txt 拷贝到驱动目录中
    cp -R /User/用户名/Desktop/text.txt /System/Library/Extensions 参数R表示对目录进行递归操作,kext在图形界面下看起来是个文件,实际上是个文件夹。 把驱动目录下的所有文件备份到桌面backup cp -R /System/Library/Extensions/* /User/用户名/Desktop/backup
  • 删除文件 rm 参数 文件
    eg: 删除驱动的缓存 rm -rf /System/Library/Extensions.kextcache
    rm -rf /System/Library/Extensions.mkext 参数-rf 表示递归和强制,千万要小心使用,如果执行了 rm -rf / 你的系统就全没了
  • 移动文件 mv 文件
    eg: 把AppleHDA.Kext 移到桌面
    mv /System/Library/Extensions/AppleHDA.kext /User/用户名/Desktop 想把AppleHDA.Kext 移到备份目录中 mv /System/Library/Extensions/AppleHDA.kext /System/Library/Extensions/backup
  • 文本编辑 nano 文件名
    eg : 编辑 Info.plist
    nano /System/Library/Extensions/Natit.kext/Info.plist vim 文件名 eg: 编辑 Info.plist
    vim /System/Library/Extensions/Natit.kext/Info.plist

目录操作: 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动目录 mv dirname1 dirname2 cd 改变当前目录 cd desktop pwd 显示当前路径 psw ls 显示当前目录内容 ls 文件操作: 命令名 功能描述 使用举例 cat 显示或者链接文件 cat filename od 显示费文本的内容 od -c filename cp 复制 cp path path rm 删除文件 rm test.txt mv 移动文件 mv test.txt touch 创建文件 touch readme.md file 显示文件类型 file filename