0%

代码

1
2
3
4
5
6
7
- (CGRect)frame {
return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}

- (CGRect)bounds{
return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}

很明显, bounds的原点是(0,0)点(view本身的坐标系统, 默认永远都是(0,0)点, 除非自己去setbounds), 而frame的原点却是任意的(相对于父视图中的坐标位置)

总结

  • frame: 该view在父view坐标系统中的位置和大小, 参照点为父视图的坐标
  • bounds: 该view在本地坐标系统中的位置和大小, 参照点为(0,0)
  • center: 该view的中心点在父view坐标系统中的位置和大小, 参照点为父视图的坐标

配置命令

显示/隐藏 隐藏文件

  • 显示:defaults write com.apple.finder AppleShowAllFiles -bool true
  • 隐藏:defaults write com.apple.finder AppleShowAllFiles -bool false

这个没什么好说的= =

开启/关闭 HIDPI

  • 开启:sudo defaults write /Library/Preferences/com.Apple.windowserver DisplayResolutionEnabled -bool true
  • 关闭: sudo defaults delete /Library/Preferences/com.Apple.windowserver DisplayResolutionEnabled

此方法是开启原生的HIDPI,效果为当前分辨率/2

开启/关闭 校园网认证弹窗

  • 开启:sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -bool true
  • 关闭:sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -bool false

我猜没几个人愿意打开这个鬼东西的吧?

清除图标缓存

  • sudo rm -rf /Library/Caches/com.apple.iconservices.store

查看共享WIFI的所有连接客户端

  • arp -i en1 -a

开启隐藏Airport命令工具

  • sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/sbin/airport

开启/关闭 MacBook充电提示音

  • 开启:sudo defaults write com.apple.PowerChime ChimeOnAllHardware -bool true; open /System/Library/CoreServices/PowerChime.app
  • 关闭:sudo defaults write com.apple.PowerChime ChimeOnAllHardware -bool false; killall PowerChime

添加与查看全局Git Ignore配置

  • 添加:git config --global core.excludesfile '~/.gitignore_global'
  • 查看:git config --get core.excludesfile

命令行调节系统音量

  • sudo osascript -e "set Volume 10"

Volume的范围为0-10

检查Xcode的完整性

  • spctl --assess --verbose /Applications/Xcode.app

注意一点:在对Xcode.app包中修改了任何文件都会检测为非官方版本

查看进程在搞什么飞机

  • sudo fs_usage -w -f filesys socketfilterfw

路径

  • iTunes的iDevices备份路径:~/Library/Application Support/MobileSync/Backup/
  • Xcode文档路径:~/Library/Developer/Shared/Documentation
  • Xcode插件路径:~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/
  • Xcode模板路径:/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/
  • App crash report:~/Library/Developer/Xcode/Products/
  • 自动启动配置文件路径:/Library/LaunchDaemons/

准备

复制以下内容到编辑器并另存为patch-edid.rb

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
#!/usr/bin/ruby

require 'base64'

data=`ioreg -l -w0 -d0 -r -c AppleDisplay`

edid_hex=data.match(/IODisplayEDID.*?<([a-z0-9]+)>/i)[1]
vendorid=data.match(/DisplayVendorID.*?([0-9]+)/i)[1].to_i
productid=data.match(/DisplayProductID.*?([0-9]+)/i)[1].to_i

puts "found display: vendorid #{vendorid}, productid #{productid}, EDID:\n#{edid_hex}"

bytes=edid_hex.scan(/../).map{|x|Integer("0x#{x}")}.flatten

puts "Setting color support to RGB 4:4:4 only"
bytes[24] &= ~(0b11000)

puts "Number of extension blocks: #{bytes[126]}"
puts "removing extension block"
bytes = bytes[0..127]
bytes[126] = 0

bytes[127] = (0x100-(bytes[0..126].reduce(:+) % 256)) % 256
puts
puts "Recalculated checksum: 0x%x" % bytes[127]
puts "new EDID:\n#{bytes.map{|b|"%02X"%b}.join}"

Dir.mkdir("DisplayVendorID-%x" % vendorid) rescue nil
f = File.open("DisplayVendorID-%x/DisplayProductID-%x" % [vendorid, productid], 'w')
f.write '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">'
f.write "
<dict>
<key>DisplayProductName</key>
<string>Display with forced RGB mode (EDID override)</string>
<key>IODisplayEDID</key>
<data>#{Base64.encode64(bytes.pack('C*'))}</data>
<key>DisplayVendorID</key>
<integer>#{vendorid}</integer>
<key>DisplayProductID</key>
<integer>#{productid}</integer>
</dict>
</plist>"
f.close

生成

  1. 盖上MacBook屏幕,仅输出外置屏幕
  2. 打开终端并执行刚刚保存的.rb文件, 如:ruby patch-edid.rb
  3. 将生成的文件夹拖动到目录/System/Library/Displays/Overrides
  4. 重启系统

配置

配合SwitchResXRetina DisplayMenu即可开启HIDPI。

需要实现的效果

  1. 普通状态
  2. 点击高亮状态
1
2
3
4
5
#import <UIKit/UIKit.h>

@interface OButton : UIButton

@end
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
#import "OButton.h"

@implementation OButton

- (id)initWithCoder:(NSCoder *)aDecoder {
if (self == [super initWithCoder:aDecoder]) {
self.layer.cornerRadius = 5.; //按钮圆角
if (self.isEnabled) {
self.backgroundColor = [UIColor blackColor]; //普通状态为黑色
}else {
self.backgroundColor = [UIColor lightGrayColor]; //禁用状态为灰色
}
}
return self;
}

//重写Enable状态改变的方法
- (void)setEnabled:(BOOL)enabled {
[super setEnabled:enabled];
if (enabled) {
self.backgroundColor = [UIColor blackColor];
}else {
self.backgroundColor = [UIColor lightGrayColor];
}
}

//重写点击高亮状态改变的方法
- (void)setHighlighted:(BOOL)highlighted {
[super setHighlighted:highlighted];
if (highlighted) {
self.backgroundColor = [UIColor redColor];
}else {
self.backgroundColor = [UIColor blackColor];
}
}

@end

Storyboard中的Button直接使用这个类就可以简单实现自定义UIButton了。

普通APP在MacOS上要用pkg包安装的都是耍流氓,个人觉得= =
安装pkg的APP之后要怎么卸载呢,可以用到pkgutil这一命令

pkgutil

执行命令pkgutil --help

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
Usage: pkgutil [OPTIONS] [COMMANDS] ...

Options:
--help Show this usage guide
--verbose, -v Show contextual information and format for easy reading
--force, -f Perform all operations without asking for confirmation
--volume PATH Perform all operations on the specified volume
--edit-pkg PKGID Adjust properties of package PKGID using --learn PATH
--only-files List only files (not directories) in --files listing
--only-dirs List only directories (not files) in --files listing
--regexp Try all PKGID arguments as regular expressions

Receipt Database Commands:
--pkgs, --packages List all currently installed package IDs on --volume
--pkgs-plist List all package IDs on --volume in plist format
--pkgs=REGEXP List package IDs on --volume that match REGEXP
--groups List all GROUPIDs on --volume
--groups-plist List all GROUPIDs on --volume in plist format
--group-pkgs GROUPID List all PKGIDs in GROUPID
--files PKGID List files installed by the specified package
--lsbom PKGID List files in the same format as 'lsbom -s'
--pkg-groups PKGID List all GROUPIDs that PKGID is a member of
--export-plist PKGID Print all info about PKGID in plist format
--verify PKGID Verify file permissions of the specified package
--repair PKGID Repair file permissions of the specified package
--pkg-info PKGID Show metadata about PKGID
--pkg-info-plist PKGID Show metadata about PKGID in plist format
--file-info PATH Show metadata known about PATH
--file-info-plist PATH Show metadata known about PATH in plist format
--forget PKGID Discard receipt data for the specified package
--learn PATH Update --edit-pkg PKGID with actual metadata from PATH

File Commands:
--expand PKG DIR Expand the flat package PKG to DIR
--flatten DIR PKG Flatten the files at DIR as PKG
--bom PATH Extract any Bom files from the pkg at PATH into /tmp
--payload-files PATH List the paths archived within the (m)pkg at PATH

挺多功能的,自己看吧.

找出要删除的包

TeamViewer为例,执行命令pkgutil --pkgs | grep -i teamviewer

1
2
3
4
com.teamviewer.teamviewer10
com.teamviewer.teamviewer10Agent
com.teamviewer.teamviewer10Font
com.teamviewer.teamviewer10Restarter

找出到底安装了什么文件

执行命令pkgutil --files com.teamviewer.teamviewer***

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
TeamViewer.app/Contents/Resources/widget_whiteboard_fontsize_40.png
TeamViewer.app/Contents/Resources/widget_whiteboard_fontsize_40@2x.png
TeamViewer.app/Contents/Resources/widget_whiteboard_fontsize_60.png
TeamViewer.app/Contents/Resources/widget_whiteboard_fontsize_60@2x.png
TeamViewer.app/Contents/Resources/widget_whiteboard_marker.png
TeamViewer.app/Contents/Resources/widget_whiteboard_marker@2x.png
TeamViewer.app/Contents/Resources/widget_whiteboard_no_fill.png
TeamViewer.app/Contents/Resources/widget_whiteboard_no_fill@2x.png
TeamViewer.app/Contents/Resources/widget_whiteboard_pencil.png
TeamViewer.app/Contents/Resources/widget_whiteboard_pencil@2x.png
TeamViewer.app/Contents/Resources/widget_whiteboard_rectangle.png
TeamViewer.app/Contents/Resources/widget_whiteboard_rectangle@2x.png
TeamViewer.app/Contents/Resources/widget_whiteboard_text.png
TeamViewer.app/Contents/Resources/widget_whiteboard_text@2x.png
TeamViewer.app/Contents/Resources/zh-Hans.lproj
TeamViewer.app/Contents/Resources/zh-Hans.lproj/Localizable.strings
TeamViewer.app/Contents/Resources/zh-Hans.lproj/ServicesMenu.strings
TeamViewer.app/Contents/Resources/zh-Hant-TW.lproj
TeamViewer.app/Contents/Resources/zh-Hant-TW.lproj/Localizable.strings
TeamViewer.app/Contents/Resources/zh-Hant-TW.lproj/ServicesMenu.strings
TeamViewer.app/Contents/Resources/zh-Hant.lproj
TeamViewer.app/Contents/Resources/zh-Hant.lproj/Localizable.strings
TeamViewer.app/Contents/Resources/zh-Hant.lproj/ServicesMenu.strings
TeamViewer.app/Contents/_CodeSignature
TeamViewer.app/Contents/_CodeSignature/CodeResources

一大陀…

开始删除

  1. 把以上文件删除干净
  2. 执行命令sudo pkgutil –forget teamviewer.pkg来让系统忘记这个pkg包
  3. 完成卸载

Tips

听说有个小脚本挺好用的(本人未测试)

Github: pkg_uninstaller

准备工作

  1. 8G或以上U盘||移动硬盘一个
  2. 原版Mac OS镜像一个

制作

  1. 打开Mac OS下的磁盘工具,把制作盘抹掉为Mac OS扩展(日志式)

  2. 打开终端运行以下命令:

    1
    sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolumes --applicationpath /Applications/Install\ OS\ X\ Yosemite.app --nointeraction

以上文件路径对应盘符要自己找到

详细版

  1. 打开终端输入sudo+空格
  2. 右键点击安装包.app->显示包内容->Contents->Resources,找到createinstallmedia并拖进终端窗口
  3. 终端输入--volume+空格
  4. 把U盘盘符拖入终端窗口
  5. 终端输入--applicationpath+空格
  6. 安装包.app拖入终端窗口
  7. 终端输入--nointeraction
  8. 回车+等待

刚装好的Win8.1,从XP系统远程过去提示”远程计算机需要网络级别身份验证”,网上搜索了下,几乎所有都是修改注册表的方法,其实不用修改注册表也可以完美解决

  1. 按组合键Win+X再按下R键,打开gpedit.msc
  2. 依次找到计算机配置->管理模板->Windows组件->远程桌面服务->远程桌面会话主机->安全
  3. 要求使用网络级别的身份验证对远程连接的用户进行身份验证禁用
  4. 远程正常

弄了一下GitHub Pages的域名绑定,总算弄好了。

A记录绑定顶级域名

  1. 先执行命令dig yourname.github.io +nostats +nocomments +nocmd找到github.map.fastly.net.所对应的IP地址
  2. 进入域名解析管理,添加一条A记录解析
  3. 主机记录为@
  4. 记录值为得到的IP地址
  5. 保存静候生效

解析生效之后访问顶级域名成功,但是访问www的二级域名却不能访问了,因此要再做一个CNAME解析

CNAME记录绑定二级域名

  1. 直接进入到域名解析管理,添加一条CNAME解析记录
  2. 主机记录为*
  3. 记录值为yourname.github.io.记得后面还有一个点
  4. 保存静候生效

In the new file, add a single line that specifies the bare subdomain for your custom domain. For example, use blog.example.com, not https://blog.example.com. Note that there can only be one domain in the CNAME file.
根据官方的说明,CNAME解析只能有一个咯~

域名绑定就基本完成了。

Centos 7与老版本有大差别,所以旧的配置VPN方法可能不适用,采用新的方法来配置VPN.

准备

添加epel源

命令行执行 yum install epel-release

命令行执行 yum makecache

安装组件

运行命令 yum install ppp iptables pptpd 安装组件

运行命令 /etc/pptpd.conf 找到localip,去掉下面字段前面的#,然后保存退出

1
2
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

运行命令 nano /etc/ppp/options.pptpd ,找到ms-dns,去掉搜索到的两行ms-dns前面的#,并修改为下面的字段:

1
2
ms-dns 8.8.8.8
ms-dns 8.8.4.4

运行命令nano /etc/ppp/chap-secrets编辑/etc/ppp/chap-secrets设置VPN的帐号密码:

1
用户名 pptpd 密码 *

运行命令nano /etc/sysctl.conf修改内核参数,在conf文件末尾添加以下代码,使内核支持转发

1
net.ipv4.ip_forward=1

运行命令sysctl -p使内核修改生效

运行以下命令添加下面的iptables转发规则

XEN架构

1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

OpenVZ架构

1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source VPS公网IP

但是添加转发规则后重启就会失效,Centos 6系统可以使用service iptables save保存配置,但Centos 7不支持,我们需要将配置写入rc.local文件中,开机自动设置

运行命令chmod +x /etc/rc.d/rc.local赋予rc.loacl执行权限

运行命令nano /etc/rc.d/rc.local编辑rc.local,并把上面的转发规则写到文件末尾

保存退出,没了。

启动组件

  1. 运行命令/etc/init.d/pptpd start启动pptpd
  2. 运行命令chkconfig pptpd on使pptpd开机自动启动
  3. 完成,连接,上网~