ssh隧道、端口转发及内网穿透

ssh隧道、端口转发及内网穿透

ssh相关知识点概要

  • SSH是一种安全的传输协议,目前最多的主要是用于连接服务器,除了这个之外它的隧道转发功能也是非常强大有用的。
  • 下面介绍一下三个非常强大的命令:

     ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host 
     ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host 
     ssh -C -f -N -g -D listen_port user@Tunnel_Host
    

搭建IPSEC/IKEV2 VPN服务器

  在iOS 10/macOS Sierra后,由于Apple加强了安全机制,同时取消息了PPTP VPN连接,这里将结合作者亲身经历搭建 IPSEC/IKEV2 VPN 遇到的坑坑洼洼后,记录整个配置搭建过程。

UITableView的tableHeaderView高度的自适应

iOS的UILabel,UIImage等有一个IntrinsicContentSize,有了它可以自己根据内容调整大小,再也不用量宽和高了。

iOS并没有提供像给UITableViewCell设置自适应高度的方法,所以tableHeaderView的高度还是要根据内容来计算,只是这个计算过程可以充分利用其子视图的intrinsic特点来自动给我们算出来.

HTTPS的深入理解

HTTPS的工作原理

  • HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的具体描述如下:
1. 浏览器将自己支持的一套加密规则发送给网站。 
2. 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。 
3. 浏览器获得网站证书之后浏览器要做以下工作: 
    a.验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。 
    b.如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。 
    c.使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。 
4. 网站接收浏览器发来的数据之后要做以下的操作: 
    a.使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。 
    b.使用密码加密一段握手消息,发送给浏览器。 
5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。

OAuth2.0深入理解

OAuth简介

  • OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
  • OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
  • OAuth(俗称1.0)是OpenID的一个补充,但是完全不同的服务。1.0协议相较于2.0协议复杂些,易用性差,所以没有得到广泛普及。

iOS 中 WebView、网络操作相关及键盘相关的几个关键类

WebView、网络操作相关及键盘相关的几个关键类

  • UIWebview的本地调用

    • 注入js:[webview stringByEvaluatingJavaScriptFromString:]
    • 本地调用,使用WebViewJavascriptBridge:- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler
  • WKWebView的本地调用

    • 注入js:[wkwebview evaluateJavaScript:]
    • 首先通过WKUserContentController -> addScriptMessageHandler: 以及 addUserScript: ,实现WKScriptMessageHandler响应脚本消息:- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message 和 js的注入;
    • WKNavigationDelegate:跟踪网页加载进度,以及决定采取什么的处理策略;
    • WKUIDelegate:根据网页的行为展示本地的UI视图;

iOS中的MVC、MVVM 研究

iOS中的MVC、MVVM 研究

优点:
- MVVM 可以兼容你当下使用的 MVC 架构;
- MVVM 增加你的应用的可测试性;
- MVVM 配合一个绑定机制效果最好。

缺点:
- 学习成本和开发成本都很高,新人很难上手;
-  iOS中,并没有现成的绑定机制可用,要么使用 KVO,要么引入类似 ReactiveCocoa 这样的第三方库;
-  数据绑定使 Debug 变得更难了,堆栈结构更复杂了,使得对象生命周期很难追踪;
-  对于过大的项目,数据绑定需要花费更多的内存;
-  ReactiveCocoa 在国内外还都是在小众领域,没有被大量接受成为主流的编程框架。在别的语言中,例如 Java 中的 RxJava 也同样没有成为主流;

C/S系统相关解决方案

即时消息IM

  • 目前主流的四种IM(IM:instant messaging,即时消息)协议:XMPP(Extensible Messageing and Presence Protocol:可扩展消息与表示协议)、即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。在这四种协议中,XMPP是最灵活的。XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。

Socket编程

  • 套接字(socket)概念
    • Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
    • 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

OC中的运行时及Swift中的结构体及值类型

OC中的运行时

  • OC本身是一种强类型语言,但其运行时功能让它又有了动态语言的特点。OC中对象的类型和对象所执行的方法都是在运行时阶段进行查找并确认的,这种机制被称为动态绑定。

  • 在很多语言,比如 C ,调用一个方法其实就是跳到内存中的某一点并开始执行一段代码。没有任何动态的特性,因为这在编译时就决定好了。而在 Objective-C 中,[

iOS中多线程开发,Queue 及 GCD 相关总结

iOS中多线程开发,Queue 及 GCD 相关总结

  • 主要有:NSThread,NSOperation,GCD,线程同步(NSLock同步锁,@synchronized代码块)
  • iOS中多线程使用并不复杂,关键是如何控制好各个线程的执行顺序、处理好资源竞争问题;

iOS性能内存优化

iOS性能内存优化

  • 几个优化总体思路:

    • 避免过多的CPU计算

      • 简化复杂频繁的布局计算
      • 文本计算、格式转换、图像绘制、对象的创建调整等尽可能放到后台线程进行
    • 避免图层混合

      • 确保控件的opaque属性设置为true,确保backgroundColor和父视图颜色一致且不透明
      • 如无特殊需要,不要设置低于1的alpha值
      • 确保UIImage没有alpha通道
    • 避免临时转换

      • 确保图片大小和frame一致,不要在滑动时缩放图片
      • 确保图片颜色格式被GPU支持,避免劳烦CPU转换
    • 慎用离屏渲染

      • 绝大多数时候离屏渲染会影响性能
      • 重写drawRect方法,设置圆角、阴影、模糊效果,光栅化都会导致离屏渲染
      • 设置阴影效果是加上阴影路径
      • 滑动时若需要圆角效果,开启光栅化

iOS内存管理机制

iOS内存管理机制

  • Objective-C内存管理的对象
    • 主要有两类,一类是值类型,比如int、float、struct等基本数据类型;
    • 另一类是引用类型,也就是继承自NSObject类的所有的OC对象;
    • 前一种值类型不需要我们管理,后一种引用类型是需要我们管理内存的;
    • 值类型会被放入栈中,他们依次紧密排列,在内存中占有一块连续的内存空间,遵循先进后出的原则;
    • 引用类型会被放到堆中,当给对象分配内存空间时,会随机的从内存当中开辟空间,对象与对象之间可能会留有不确定大小的空白空间,因此会产生很多内存碎片,需要我们管理;
    • 栈内存与堆内存从性能上比较,栈内存要优于堆内存,这是因为栈遵循先进后出的原则,因此当数据量过大时,存入栈会明显的降低性能。因此,我们会把大量的数据存入堆中,然后栈中存放堆的地址,当需要调用数据时,就可以快速的通过栈内的地址找到堆中的数据。

Apache虚拟目录、域名关联、端口转发以及防盗链配置

在上网,或在浏览器输入网址时,细心的就会发现,这个网址有很大的学问。一般网站都是通过域来访问的,一些相关的站点就配置了相应的子域名,如本站主域名为:wodedata.com ,其他相关的站点就配置了子域名进行访问,如:my.wodedata.com,life.wodedata.com,fdm.wodedata.com等等。 在购买了域名之后,就可以设置无数个子域名了。当然还有一种方式是在域名后面以/分隔,设置不路径指向不同的网站内容。 当然还有一种情况就是,java写的web项目布署在tomcat当中,百tomcat服务器不是80端口访问,如果又不想在域名后面加上一个8080端口直接暴露出来,就需要在Apache中设置代理转发到指定端口了。

首先万网添加域名解析A记录:img.wodeata.com 到指定IP地址,然后。。废话不多说了直接上配置代码

链表相关面试题

判断单链表是否存在环

  • 设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:
bool IsExitsLoop(List *head){
   List *slow = head, *fast = head;

   while ( fast && fast->next ){
       slow = slow->next;
       fast = fast->next->next;
       if ( slow == fast ) break;
   }

   return !(fast == NULL || fast->next == NULL);
}

Linux下常用的系统相关信息查看命令

Linux下常用的系统相关信息查看命令

  • 查看文本的常命令cattail -f

系统信息

# uname -a   # 查看内核/操作系统/CPU信息 
# cat /etc/issue 
# cat /etc/redhat-release # 查看操作系统版本 
# cat /proc/cpuinfo  # 查看CPU信息 
# hostname   # 查看计算机名 
# lspci -tv   # 列出所有PCI设备 
# lsusb -tv   # 列出所有USB设备 
# lsmod    # 列出加载的内核模块 
# env    # 查看环境变量

资源信息

# free -m   # 查看内存使用量和交换区使用量 
# df -h    # 查看各分区使用情况 
# du -sh <目录名>  # 查看指定目录的大小 
# grep MemTotal /proc/meminfo # 查看内存总量 
# grep MemFree /proc/meminfo # 查看空闲内存量 
# uptime   # 查看系统运行时间、用户数、负载 
# cat /proc/loadavg  # 查看系统负载

CentOS常用的操作命令

CentOS常用的操作命令

用户相关

  1. 创建新用户,使用useradd命令完成一个新用户的初始化设置工作,命令:useradd luowei <回车>

    • useradd所做的初始化操作包括在/home目录下为luowei帐号建立一个名为luowei的主目录。
    • useradd的初始化操作还包括为用户单独建立一个与用户名同名的组(luoweii组)。这叫用户私有组的机制,与默认组机制相对应。对用户分组一是方便管理,二是可以明确权限。
  2. 为新用户设置密码,使用passwd为这个新用户设置密码,命令:passwd luowei <回车>

    • passwd命令为一个用户设置密码,但它实质上是一个修改密码的程序。只有超级用户和用户自己可以修改密码,其它的普通用户没有给他修改密码的 权利。
  3. 在创建新用户时指定用户的主目录,可以使用useradd的参数-d,命令如下:useradd -d /home/goal luowei
  4. 添加用户到一个已有的组,可以使用-g参数。例如我们想让floatboat加入webusers组,那么可以使用以下命令:useradd -g webusers luowei
  5. 同时添加用户到多个组,可以使用-G参数使他同时加入多个组,例如webusers和ftpusers:useradd -G ftpusers,webusers luowei

CentOS最常用命令及快捷键整理

CentOS最常用命令及快捷键整理

常用快捷键

Ctrl + u            删除光标之前到行首的字符
Ctrl + k            删除光标之前到行尾的字符
Ctrl + c            取消当前行输入的命令,相当于Ctrl + Break
Ctrl + a            光标移动到行首(ahead of line),相当于通常的Home键
Ctrl + e            光标移动到行尾(end of line)
Ctrl + f             光标向前(forward)移动一个字符位置
Ctrl + b            光标往回(backward)移动一个字符位置
Ctrl + l             清屏,相当于执行clear命令
Ctrl + r            显示:号提示,根据用户输入查找相关历史命令(reverse-i-search)
Ctrl + w           删除从光标位置前到当前所处单词(word)的开头
Ctrl + t             交换光标位置前的两个字符
Ctrl + y            粘贴最后一次被删除的单词
Ctrl + Alt + d   显示桌面
Alt + b             光标往回(backward)移动到前一个单词
Alt + d             删除从光标位置到当前所处单词的末尾
Alt + F2           运行
Alt + F4           关闭当前窗口
Alt + F9           最小化当前窗口
Alt + F10         最大化当前窗口
Alt + Tab         切换窗口
Alt +按住左键  移动窗口(或在最下面的任务栏滚动鼠标滑轮)
[鼠标中间键] 粘贴突出显示的文本。使用鼠标左键来选择文本。把光标指向想粘贴文本的地方。点击鼠标中间键来粘贴。
[Tab] 命令行自动补全。使用 shell 提示时可使用这一方式。键入命令或文件名的前几个字符,然后按 [Tab] 键,它会自动补全命令或显示匹配键入字符的所有命令。
在桌面或文件管理器中直接按 / 就可以输入位置,打开文件管理器。
快速搜索:在 vi 或 Firefox 中直接按 / 即可进入搜索状态。
网站链接和图片可直接拖放到桌面或者目录,可以马上下载。
直接将文件管理器中的文件拖到终端中就可以在终端中得到完整的路径名。
在滚动条的空白处点击鼠标中键,屏幕即滚动到那个地方。