博文

Some of Team Management(开始带人了。。我得充个电)

目前大体思路。。 项目上: 派发需求(自左向右)与完成需求(自右向左) 分解上继需求/KPI - 需求产品化(整体与使用场景的构想) - 产品分解为模块 - 模块抽象为技术 - 指派工作 工作中 如何管理好一个小团队? - 张轶杰的回答 - 知乎 https://www.zhihu.com/question/20894963/answer/36455659 沟通工作/职业目标 你来这里,想要得到的是什么?这样东西,是别人夺不走的,是不会随着你的离开而离开,它将永远跟随你。 工作制度(不同于公司的,利用审批制度来做) 加班换调休等等。 小公司团队管理需求的三个特点:(当前可以认为是小公司团队。。) 简单。 必须足够简单,简单意味着抓住主要矛盾,解决核心问题; 说人话。 小公司的管理者和员工很多都没有受过专门的管理培训,不仅要管理者能够理解,而且要员工能接受; 可以落地。 理解接受之后,照着说明书一步一步做就好。 做好小公司团队管理,只需要搞清楚这五件事 想想怎么赚钱(经营) 为了赚钱要做什么事(管理) 做这些事需要哪些人(人力资源) 这些人明天要做什么(计划) 这些人昨天做了什么(总结)

User权限安装Python3

1. 安装python python版本库: https://www.python.org/ftp/python/ wget https: / /www.python.org/ftp /python/ 3.6 . 4 /Python- 3.6 . 4 rc1.tgz tar -xzf Python- 3.6 . 4 rc1.tgz cd Python- 3.6 . 4 rc1 mkdir -p /home/zck/zhuchengkai/software/Python- 3.6 . 4 rc1 # 编译安装 ./configure --prefix= "/home/zck/zhuchengkai/software/Python-3.6.4rc1" make make install 2 添加环境变量 vim ~/.bash_profile # python 环境变量 export PATH= " $PATH :/home/zck/zhuchengkai/software/Python-3.6.4rc1/" ; # pip3 环境变量 export PATH= " $PATH :/home/zck/zhuchengkai/software/Python-3.6.4rc1/bin/" ; 这里有一个坑,当你运行python的时候还是2.7版本的,因为python3的执行脚本名字也叫python(和python2.7一样),所以执行脚本需要改名字 cp python python3 3 安装其他包 pip3 install pandas pip3 install numpy pip3 install scipy pip3 install sklearn 作者:thinkando 链接:https://www.jianshu.com/p/c45af0ddd68a 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Unable to boot device because it cannot be located on disk.

  xcrun simctl erase all

NSTextField的keyDown()事件

无法override。

Xcode重装后Lincense Agreement无法点击

终端:sudo xcodebuild -license

CGBitmapContextCreate是线程安全的!

https://forums.developer.apple.com/thread/29031 eskimo   Core Graphics is thread safe on a context-by-context basis, and you’re creating your own context to work in UIImage is thread safe on modern systems (iOS 4 and later IIRC), making it 

ARM64和ARM32的混合关系

要在同一个异常级别下更改执行状态,系统必须切换到较高的异常级别,改完之后在返回到原先的异常级别。 例如,您可能会在64位操作系统下运行32位和64位应用程序。 在这种情况下,32位应用程序可以执行和生成监督调用(SVC)指令,或者通过接收中断,以此切换到EL1和AArch64。 之后OS进行任务切换并返回到EL0中的AArch64。 实际上,这意味着你不能拥有一个混合32位和64位的应用程序,因为它们之间没有直接的调用方式。 在AArch64和AArch32执行状态之间切换的要点可以总结如下: 更改为AArch32需要从较高的异常级别出发到更低的级别。 这是通过执行ERET退出异常处理程序的结果。 更改为AArch64需要从较低的异常级别出发到更高的级别。 异常可能是一条指令执行或一个外部信号的结果。 如果在发生异常或从异常返回时异常级别保持不变,则执行状态也不能改变。 AArch64和AArch32执行状态都具有类似的异常级别,但是安全和非安全操作之间存在一些差异。 当发生异常时,处理器所处的执行状态会限制能用于其他执行状态的异常级别。 如果ARMv8-A处理器在特定的异常级别以AArch32执行状态运行,它使用与ARMv7-A中相同的异常模型来处理发送到该异常级别的异常。 EL3中的代码不能在更高的异常级别中使用异常,因此除了执行复位之外,不能更改执行状态。 Arm64位上可以同时运行32位和64位。32位和64位的切换只能通过更高的EL来进行。例如,我们有一个64位的os运行在nsec的EL1,这个os上可以同时跑32位应用程序和64位应用程序,那么这两个应用程序之间的切换必须由运行在EL1的os完成,这也就意味着一个单独的程序不可能混合32位和64位。

TableGen添加指令

修改.td文件,实现指令定义 记得再上面加一个 let hasNoSchedulingInfo = 1 in

使__attribute__((annotate("xxx")))能作用于OC函数

diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp  --- orig/llvm-3.7.0.src/tools /clang/lib/CodeGen/CGBlocks.cpp    2015-06-23 01:07:51.000000000 +0200  +++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp 2015-11-13 13:05:44.000000000 +0100  @@ -1157,6 +1157,10 @@         fnLLVMType, llvm::GlobalValue::InternalLinkage, name, &CGM.getModule());     CGM.SetInternalFunctionAttributes(blockDecl, fn, fnInfo);  +  // Emit annotation attributes for ObjC blocks.  +  if (blockDecl->hasAttr<AnnotateAttr>())  +    CGM.AddGlobalAnnotations(blockDecl, fn);  +     // Begin generating the function.     StartFunction(blockDecl, fnType->getReturnType(), fn, fnInfo, args,                   blockDecl->getLocation(),  diff -Nau...

ARM64寄存器以及指令Note(持续更新

GPR = General Purpose Register ------------ ARM32中的LDM、STM、PUSH、POP指令,在ARM64中并不存在。取而代之的是LDP、STP指令,如一般在函数开头用来代替PUSH. ARMv8在存储器控制器上下了不少功夫,增加了x86下的类似于MOVNT这种指令,Non-temporal load/store——LDNP/STNP。这就使得像原先的Memory Barrier系操作有了用武之地了~ARMv8中除了原有的ISB(Instruction Synchronization Barrier)与DMB(Data Memory Barrier)之外,还引入了LDAR/STLR(Load-Acquire/Store-Release)指令集。这套指令具有Memory Barrier的作用。如果你在某一点需要做Memory Barrier,而此时正好想读取或写入某个数据,那么直接用LDAR/STLR即可,可以省去一条DMB的指令。而在多核多线程同步中,又引入了LDXP/STXP操作,由原先的单寄存器扩展到了双寄存器

iOS中使用xpc/xpc.h

sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/xpc /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/xpc sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/launch.h /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/launch.h #中间的MacOSX的版本号可能会有所不同。#

macOS安装cryptography提示没有OpenSSL的头文件的解决办法

先brew install openssl 然后,重点来了 env ARCHFLAGS= " -arch x86_64 " LDFLAGS= " -L/usr/local/opt/openssl/lib " CFLAGS= " -I/usr/local/opt/openssl/include " pip install cryptography

ARM中CPSR的作用、运算结果会对CSPR造成的改变 以及汇编中的Switch语句

CPSR 是B.EQ等分支指令进行判断的标志位 如果指令中带有"S"则该指令运算会影响CPSR的值 比如在switch的汇编指令中: #include <stdio.h> main() { int a; switch (a) { case 1: a = 11; break; case 2: a = 12; break; default: a = 13; } } _main: ; @main ; BB#0: sub sp, sp, #32 ; =32 mov w8, #0 str w8, [sp, #28] ldr w8, [sp, #24] mov x9, x8 subs w8, w8, #1 ; =1 //把运算结果是否非零写入CSPR中 str w9, [sp, #20] ; 4-byte Folded Spill str w8, [sp, #16] ; 4-byte Folded Spill b.eq LBB0_2 //CSPR的Z==1 那么跳转至LBB0_2 b LBB0_1 LBB0_1: ldr w8, [sp, #20] ; 4-byte Folded Reload subs w9, w8, #2 ; =2 //同上subs指令 str w9, [sp, #12] ; 4-byte Folded Spill b.eq LBB0_3 b LBB0_4 LBB0_2: mov w8, #11 str w8, [sp, #24] b LBB0_5 LBB0_3: orr w8, wzr, #0xc str w8, [sp, #24] b LBB0_5 LBB0_4: mov w8, #13 str w8, [sp,...

libimobiledevice

相信做安卓开发的同学对android开发时的logcat印象很深,可以查看手机应用运行时的实时log输出,但做ios开发时就想有没有这么好的工具呢,其实ios下的logcat已经被大神们通过反向usb数据获取apple的接口做出来了。这就是libimobiledevice. 源码: https://github.com/libimobiledevice/libimobiledevice 可以使用brew来安装 brew install libimobiledevice 在ios 10和xcode8时,使用libimobiledevice中的ideviceinfo或者idevicesyslog时会出现 ERROR: Could not start service com.apple.syslog_relay. 这时可以 执行  sudo chmod 777 /var/db/lockdown 然后问题可以解决,如果是作了ios10和xcode8的升级后出现的错误,这时候可以用 brew reinstall --HEAD libimobiledevice  再重装一下libimobiledevice.之后再运行 sudo chmod 777 /var/db/lockdown 若出现以下报错提示: Error: Cannot write to /usr/local/Cellar  处理方案: 先执行: sudo chown -R $USER /usr/local  libimobiledevice查看log的方法: 连上你的ios设备,在终端下输入命令: idevicesyslog ideviceinstaller 对于android,我们在安装apk时可以使用adb命令行来安装,那ios是不是也有同样的工具,答案也是肯定的,ios下有ideviceinstaller. 源码: https://github.com/libimobiledevice/ideviceinstaller 同样可以使用brew来安装: brew install ideviceinstaller 使用方法, ideviceinstaller -i appn...

ARM汇编器对ARM的寄存器进行了预定义

1,Ro-R15和r0-r15 2,a1-a4(参数,结果或者临时寄存器,与r0-r3同意) 3,v1-v8(变量寄存器,与r4-r11同意) 4,sb和SB(静态基址寄存器,与r9同意) 5,sl和SL(堆栈限制寄存器,与r10同意) 6,fp和FP(帧指针,与r11同意) 7,ip和IP(过程调用中间临时寄存器,与r12同意) 8,sp和SP(堆栈指针,与r13同意) 9,lr和LR(连接寄存器,与r14同意) 10,pc和PC(程序计数器,与r15同意) 11,cpsr和CPSR(程序状态寄存器) 12,spsr和SPSR(程序状态寄存器) 13,f0-f7和F0-F7(FPA寄存器) 14,s0-s31和S0-S31(VFP单精度寄存器) 15,d0-d15和D0-D15(VFP双精度寄存器) 16,p0-p15(协处理器0-15) 17,c0-c15(协处理器寄存器0-15) 

LLVM相关技术文章收集

Chris Lattner的LLVM教程中文版: https://llvm-tutorial-cn.readthedocs.io/en/latest/chapter-1.html IBM - 使用 LLVM 框架创建一个工作编译器: https://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm1/index.html https://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm2/index.html

LLVM的类型系统(转

LLVM中的类型系统很重要!有类型,可以使得很多优化成为可能,而且不需要额外的分析。一个强类型系统可使生成的代码更容易理解,并且更容易优化和转换。 1.类型的类别 llvm有以下几种类型: integer   i1, i2, i3, ... i8, ... i16, ... i32, ... i64, ... floating point   float, double, x86_fp80, fp128, ppc_fp128 first class   integer ,  floating point ,  pointer ,  vector ,  structure ,  array ,  label ,  metadata . primitive   label ,  void ,  floating point ,  x86mmx ,  metadata . derived   array ,  function ,  pointer ,  structure ,  packed structure ,  vector ,  opaque . (第一类)first class是最重要的。指令只能产生这些类型的值。 2.原始类型(primitive types) 原始类型是llvm系统中的基础。 integer类型 整数类型是一个位宽度从1到2^23-1的整数。 语法: iN 其中N为位宽。 例子: i1 i32 i1942652 Floating Point类型 float   32-bit floating point value double   64-bit floating point value fp128   128-bit floating point value (112-bit mantissa) x86_fp80   80-bit floating point value (X8...

objc->cpp的对应关系。

通过clang可以方便地把objc的语法转成cpp: clang -rewrite-objc xxx.m 所以可以很方便的看到objc与cpp之间的对应关系。 最近主要工作在符号混淆上,但是踩到了有关selector和runtime的混淆的坑。 NSClassFromString: id obj = [[NSClassFromString(@"MyClass") alloc] init]; id obj = ((id (*)(id, SEL))(void *)objc_msgSend)((id)((id (*)(id, SEL))(void *)objc_msgSend)((id)NSClassFromString((NSString *)&__NSConstantStringImpl__var_folders_92_dfj9jsb51kj3lh2zssbw0dzm0000gn_T_1_38e0f0_mi_0), sel_registerName("alloc")), sel_registerName("init")); NSStringFromClass: NSString *obj = NSStringFromClass([MyClass class]); NSString *obj = NSStringFromClass(((Class (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("MyClass"), sel_registerName("class"))); Selector: SEL sel = @selector(mySelector); SEL sel = sel_registerName("mySelector");