Mac 使用

brew安装时,取消homebrew更新

使用Mac的同学大多都用过 Homebrew 这个比较好用的工具,一个命令行就可以解决软件的下载安装问题。但同时我们也发现,每次使用 brew 命令安装软件时,brew 都会默认先更新一下,然后进行安装。特别是对于我们墙内用户及为不友好。我们可以使用一下命令来跳过 brew 安装软件时的更新:

export HOMEBREW_NO_AUTO_UPDATE=true

然后再该终端中,继续执行:

brew install xxx

Done.

Link:

MacOS 使用 SSHFS 将远程文件挂载到本地

SSHFS允许您使用SFTP安装远程文件系统。 大多数SSH服务器默认支持并启用此SFTP访问,因此SSHFS使用起来非常简单,服务器端无需执行任何操作。

在 MacOS 中使用 SSHFS 需要 FUSE 的支持

用于 macOS 的 FUSE 允许您通过第三方文件系统扩展 macOS 的本地文件处理功能。 它是 MacFUSE 的继任者,已被许多产品用作软件构建块,但不再维护;

安装

  • 下载安装

你可以从官网中下载最新版的 FUSE for macOSSSHFS 直接安装。

  • HomeBrew

也可以使用 HomeBrew 安装

$ brew cask install osxfuse
$ brew install sshfs

使用

  • 新建本地挂载点
$ mkdir local-file
  • 挂载
$ sshfs user@hostname:/absolute/path/to/document local-file

远程的地址最好使用绝对路径。此时打开该文件夹就可以访问远程文件了。

  • 卸载挂载文件
umount local-file

Link: MacOS 使用 SSHFS 将远程文件挂载到本地

AppCode 快捷操作

快捷键:

  • Command + O 根据类名跳转文件
  • Command + Option + O 根据文件名快速跳转
  • Command + F12 显示代码结构(可搜索跳转)
  • option + F7 查看该方法在那些地方被调用
  • Command + Shift + F 全局搜索文字
  • Shift + esc 关闭下边调试窗口
  • Command + ➡️ 光标跳到当前行代码末尾
  • Command + ⬅️ 光标跳转到当前行代码开始
  • Command + 4 打开或关闭调试窗口
  • Command + E 最近编辑的文件
  • Control + Shift + R 运行

配置篇

设置编辑时代码自动换行

  • Command + , 打开 Preference 界面,如图设置即可。

Link:
AppCode skills

XXX.APP 已损坏,打不开.你应该将它移到废纸篓

如遇:「xxx.app已损坏,打不开.你应该将它移到废纸篓」,并非你安装的软件已损坏,而是Mac系统的安全设置问题,因为这些应用都是破解或者汉化的,那么解决方法就是临时改变Mac系统安全设置。

出现这个问题的解决方法:

修改系统配置:系统偏好设置... -> 安全性与隐私。修改为任何来源

如果没有这个选项的话(macOS Sierra 10.12),打开终端,执行 sudo spctl --master-disable即可。

重点是这一行命令:

sudo spctl --master-disable

然后重新打开 APP

Done !

文章转载自:千橙工坊

git 同时 push 至多个仓库

今天想把个人博客同时推送至 GitHub 和个人私有 Git,当使用

git remote add origin https://github.com/HJDev/Xday.git

添加仓库时,提示错误:

fatal: remote origin already exists.

根据错误提示,我们可以知道,origin 仓库已经存在,所以我们需要更改仓库名称,(如:origin1):

git remote add origin1 https://github.com/HJDev/Xday.git

然后再push 到仓库。

git push -u origin1 

终极秘籍

身为攻城狮的我们,一定不会满足与使用重复的体力来解决毫无意义的体力劳动

使用一条命令同时推送至多个仓库

编辑配置文件

vim .git/config 
[remote "all"]
        url = http://git.teamleader.cn/hejun/blog.git
        url = https://github.com/HJDev/Xday.git

保存。

使用命令:

git push all

Done !

Mac AppStore 下载软件提示“发生未知错误,请稍后重试4”

今天同事电脑在 Mac App Store 下载软件提示“发生未知错误,请稍后重试4”,经过排查网络问题、AppleID 问题、App Store 和 iTunes 账号不一致问题以及 AppleID 所在地区 App Store 所在地区不一致问题后,重新设置 App Store 所在地区(App Store 底部右下角中国区标志),使问题得到圆满解决。

总结:App Store 页面上显示的地区可能不是 App Store 所在的地区,可能是显示错误而已,重新设置 App Store 所在地区可以确保设置地区和显示地区的正确。

经验:软件是会有 bug 的,重新修改软件设置可能会使软件问题得到解决。

破解 Revealapp 的试用时间限制

Revealapp作为分析iOS app UI结构的利器,还是非常称手的,89刀的价格也是物有所值。本文分析其试用版时间限制,只是用于学习,如果一直用,还是买个licence支持一下吧。

试用版有30天的时间限制,既然是30天时间限制,肯定每次启动是要读当前时间的啰。所以最简单的hack方法就是修改系统时间。如果这种方法可以接受,就不用往下看了。

如果你的工作严重依赖于Calendar,那么修改系统时间的方法就是不可以接受的。下面的追踪过程包含了对双精度浮点数在内存中的表示、ObjC对象模型等问题的讨论,如果不感兴趣可直接跳到文末查看最终的解决方案。

开始的尝试

用dtruss看了下启动时调用的syscall,是没有网络通讯的,说明app的安装时间不可能是从网络读下来的,那么这个时间肯定是写在本地的文件系统。

用opensnoop看了下启动时Reveal读过的所有文件,没有值得注意的地方。最后的发现证实这个思路忽略了一个问题,一个app读的文件并不一定是它自己打开的,可以是进程间通信。

这些简单的尝试失败后,就只能老老实实的分析代码了。

从关键字开始

试用版的Reveal有提醒试用剩余时间的信息在窗口的右上角”Free trial ends in xx days”(我觉得这不是一个好的设计,这句话似乎时刻挑衅着使用者:“来呀,你来hack我呀”)。“trial”是我感兴趣的关键字,除了在数据段肯定能找到这个关键字以外,说不定在ObjC的运行时类型系统中还能有意外的收获。果真,Reveal没有对类型信息进行模糊处理,在class-dump生成的头文件中发现了:
-[IBARegistrationPreferencesViewController messageForTrialDaysRemaining:(long long)arg1]
从函数名来看它应该就是生成试用剩余时间字符串的。

上GDB,单步跟踪,

0x000000010008bd34 push rbp
0x000000010008bd3f move rbx, rdx ; rdx 就是还剩下的试用天数,也就是函数的参数arg1

以此为突破口,发现下面的小段代码。

0x00000001000872cd call 0x100086ec2
0x00000001000872d2 mov rcx, rax ; rax中是上面函数返回的已过去的天数
0x00000001000872d7 mov eax, 0x1e ; 0x1e=30 30天的限制
0x00000001000872dc sub rax, rcx ; 30减去已经过去的天数的,减出来就是还剩下的天数

再往下走,需要分析的数据不再像是“天数”这样的整数,而是像软件安装日期NSDate这样的对象,特征不明显。所以就有必要清楚NSDate这个对象中日期的表示方法。

内存中的NSDate对象

NSDate对象应该有两个域,第一个“isA”是所有ObjC对象都有的类型指针,指向NSDate类型对象。第二个是个双精度浮点数,表示从2001年1月1日到现在的时间间隔,单位是秒。

pointer: isA
double: _timeIntervalSinceReferenceDate

其实isA指针就是NSDate对象的特征,所有的NSDate对象都是以相同的8个字节开始。第二个域是一个浮点数,分两步把它转换为一个日期。

第一步,十六进制浮点数转换为十进制

双精度浮点数由8个字节构成,1个bit表示符号,11个bit表示指数,剩下的52位用来表示底数。
使用python可以方便的把8字节的十六进制浮点数转换为十进制数:
struct.unpack('<d','c3b72c7a9ebfb841'.decode('hex'))[0]

在gdb中,可以直接使用命令
p (double)(NSDate指针地址+8)

第二步,秒数转换为日期

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:415285808.20822901];
NSLog(@"\n%@", date);

使用上面的方法,可以在跟踪汇编代码的时候检查内存中的NSDate对象,以及它所表示的日期。(这需要点耐心)

最终,安装Reveal的时间第一次出现在内存中的位置被找到,这个位置所在的函数显然负责把存在文件某处的一个magic number转换为软件安装日期。

但是意料之外的是,这个想像中的magic number并不magic,它仅仅是存在user default的plist文件中的一项,而且就是安装日期的双精度浮点数的十六进制表示。

结论

所以,要想永久试用Reveal,只需要打开

~/Library/Preferences/com.ittybittyapps.Reveal.plist

把IBAApplicationPersistenceData这一项删除就是了。

后记

有同学留言说上面的方法不起作用(问题的原因请参考另一篇blog谁动了我的plist),于是叽歪刘写了个补丁

补丁是用10.9的SDK编译的,在Reveal1.0.3(2287)上测试通过。

下载解压后,用右键的“打开”菜单运行程序。亲,叽歪刘只能帮你到这里了。

文章转载自:破解 Revealapp 的试用时间限制

SVN 命令行解决冲突问题

今天使用svn up更新文件时,提示Skipped '***' -- Node remains in conflict,并且把所有文件删了后重新拉取文件还是无法解决问题,经过不懈努力,终于在stackoverflow找到了解决方法。

在命令行里输入如下命令:

svn resolved <filename or directory that gives trouble>

使用svn up重新拉取文件,问题得到解决。