macOS Sierra (10.12.3)上编译ARM版本Android 5.1.1_r38 (Lollipop)源代码

前置条件


  • macOS Sierra  (10.12.3)
  • Homebrew (1.1.9 或更高版本)
  • Xcode (8.2.1 或更高版本)
  • Xcode (5.1.1 只能是此版本)

准备环境


1.创建大小写区分的磁盘分区

2.挂载刚刚创建好的分区

3. 切换到刚刚挂载的分区

4.安装最新版本的repo

5. 安装依赖的第三方应用

6.下载并安装Xcode 5.1.1此版本,我们只是使用其中的SDK,其他的,我们使用8.2.1中的工具,注意,我们只能使用MacOSX10.8.sdk才能顺利编译通过。

下载地址 http://adcdownload.apple.com/Developer_Tools/xcode_5.1.1/xcode_5.1.1.dmg

下载之后,安装之前我们先把8.2.1的Xcode重命名一下,稍后我们再修改回来即可。我们安装之后,提取Xcode 5.1.1版本里面的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk",然后拷贝到Xcode 8.2.1 版本的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"目录下面。操作完成后,可以删除Xcode 5.1.1

也可以从phracker/MacOSX-SDKs 获取已经提取好了的版本。

执行如下命令,使得低版本的SDK生效。

如此操作的原因有两条:

(1)在macOS Sierra  (10.12.3)上,Xcode 5.1.1无法执行,因此没办法做到两个版本并存.

(2)如果通过修改代码来把代码中限制的系统版本调整到10.8版本以上,则GCC存在BUG,导致编译无法正常通过,具体的BUG参考
libgcc: error: unknown value '10.10' of -mmacosx-version-min

7.下载Android-5.1.1_r38源代码(此处请准备梯子,或者自己从国内源进行替换)

编译代码


1.设置编译需要的环境信息

2.切换Java版本到1.7

3.清理代码,为编译准备干净的环境

4.引入编译环境变量

5.设置编译目标,此处我们指定编译ARM下的完整调试版本

6.如果需要跟踪调试代码,建议编译为调试类型

7.编译

注意此处如果发生编译失败,原因基本上是编译顺序导致的引用出错,也就是某些模块还没有编译完成,其他模块已经开始尝试链接,导致依赖错误,此时只要把多线程并发编译修改成单线程编译即可,即直接执行

运行镜像


上面运行起来的镜像是从/Volumes/android/Android_Source/out/debug/target/product/generic/hardware-qemu.ini即可读取配置信息的,但是这个文件直接修改无效,我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启GPU的支持,则执行如下命令:

参考链接


WordPress 4.7.x版本禁用 REST API

最近WordPress频繁爆出漏洞,尤其是REST API部分,简直是漏洞百出,但是,从4.7.0版本开始,这部分功能被深度整合进入了核心模块,没办法彻底屏蔽REST API,只有通过rest_authentication_errors这个接口来限制非登陆用户,具体代码如下

此部分的代码需要被添加到当前主题的functions.php中的最后即可。
增加完成后,重启Apache2服务器,然后再访问https://www.mobibrw.com/wp-json/ 就可以看到错误信息了。

参考链接


解决从WordPress 4.7.1升级到WordPress 4.7.2失败后再次更新提示"另一更新正在进行"

从WordPress 4.7.1升级到WordPress 4.7.2,中途失败了,结果再次更新的时候,提示“另一更新正在进行”,如下图所示:

这是由于在升级WordPress时,WordPress会在数据库wp_options表中增加core_updater.lock记录。如中途打断WordPress升级,这个记录会留在数据库中。当下次升级时,WordPress检测到此记录的存在就会返回”另一更新正在进行”。可通过终端登录数据库删除这条记录来处理.

如上操作之后,再次重新升级,就可以解决问题了。

参考链接


Android查看SELinux状态及关闭SELinux

SELinux2.6版本的Linux内核中提供的强制访问控制 (MAC)系统。对于目前可用的Linux安全模块来说,SELinux是功能最全面,而且测试最充分的,它是在20年的MAC研究基础上建立的。SELinux在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。

selinux默认配置在/etc/sysconfig/selinux

默认有三种级别

enforcing级别:Linuxselinux所设置的安全策略都会被启用.所有与selinux安全策略有关的服务或者程序都会被策略阻止.也就是,所有操作都会进行权限检查。

permissive级别:Linuxselinux所设置的安全策略都会被启动,但是所有与selinux安全策略有关的服务或者程序不会被策略阻止,但是会收到警告.也就是,所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志

disabled级别:关闭selinux,相当于系统没有安装selinux一样.

一般可以通过getenforce查看selinux的运行级别.也可以通过setenforce 0 或者1设置selinux的运行级别,级别0表示Permissive模式,级别1表示Enforcing模式. 至于disabled模式和其他模式的切换只能修改配置文件,命令不起作用.其次,修改完成之后,必须重启系统才能够生效.

参考链接


d3总结

项目原因,需要使用web绘制图表,比较靠谱的有echart和d3。

echart:应该是百度的项目,首页做的很漂亮,文档也比较全。个人感觉是一个入手较易,主要在学习怎么配参数,地图是echart的一个亮点。缺点就明显了,入手容易的肯定高度封装过,很难根据自己的需求定制化。而且使用了cavas绘图,在移动端性能不如svg。个人感觉echart适合一些时间比较紧迫,设计没那么明确的场合,直接套上echart,就已经很漂亮了。

d3:大名鼎鼎,受欢迎程度超过jquery,首页的绚丽特效让人眼花,教程的话强烈推荐http://www.ourd3js.com/wordpress/,这个教程好像出了书,叫精通D3.js,基本上把教程撸一遍就没啥大问题了。

d3的优点:用过一段d3后,感觉d3就是svg的jquery,把svg的操作封装为更易用的接口,并提供各种数据可视化的接口。所以d3很灵活,因为你可以用d3在svg中添加一个点、线、饼等等,svg性能不错。链式写法。

缺点:入手稍微慢点,不过撸一遍教程也就一下午的时间。svg的接口网上文档比较少,有些用法stackoverflow都找不到。

如果是学习d3的,推荐前面的教程网站,这里只是个人备忘录,想到哪里说到哪里的流水账,记录那些让人眼前一亮或者眼前一黑的点,以及几个开发中反复查询的用法。

好了,出发

1.

首先,你要在一个dom中添加svg,需要两个参数,width和height,一般我是这么给的

踩坑:需求在指定操作后才绘制该图标,dom display:none的时候,clientWidth和clientHeight是0,所以svg等dom display正常后再添加。

接下来最好设置一下svg的padding,用来应付后面出现的各种文字绘制超出不显示,UI修改等灵细操作。

因为svg直接传的都是px,所以需要根绝屏幕做一下自适应,size_1920函数如下:

坐标轴:

图标中用到最多的是坐标轴,使用坐标轴首先要设定比例尺,目前共用到了4种比例尺

线性比例尺

domain中设置数据的min/max,range中设置svg实际位置。

备注:svg是以左上角为原点的,而常规视角中原点是左下角,所以这里的range起止位置是 svgHeight-0,即起始位置是下边缘y=svgHeight,终止位置是上边缘y=0。这一点需要谨记,后面有许多计算x、y位置的,y的位置总要反着想。其他比例尺也是一样的。

离散比例尺

or

时间比例尺

时间比例尺适用于一些以时间为坐标轴的情况

备注:比如这里是今天到明天,第二天nextDay的算法,就用秒,其他都不行。UTC时间一定要注意,所有时间都改成UTC时间,所有get一律要加UTC。

颜色比例尺

这是个比较特殊的比例尺,不是用来画坐标轴的,而是把颜色均匀分割,category10,category20等等都有,填一个index,输出一个色值。在有些d3的版本中,颜色比例尺没用放在scale里面。

坐标轴

可能还有更多种类的比例尺,目前还没有接触,下面就开始生成坐标轴数据。

几个常用参数

scale,必要参数,把比例尺填进去

orient,非必填,刻度相对坐标轴的位置 top bottom left right

ticks,非必填,刻度个数 注:ticks只是参考,最终生成刻度个数以数据为准,比如数据需要25个刻度,但ticks填了17,那d3就没办法了,会生成一个d3生成的刻度个数中选跟17最接近的。

innerTickSize,非必填,内刻度高,默认是6。 注:这里设置了innerTickSize是整个svg的高度,和y轴innerTickSize设置整个svg的宽配合行程网格效果,正常的坐标轴就再画一个,注意高度计算时错开

outerTickSize,非必填,外刻度高

tickFormat,非必填,刻度值,默认为空  注:这是一个数据绑定参数,即根据数据生成不同的值

tickPadding,非必填,刻度文字与坐标轴的间距

真正的绘制

 

给svg中添加g元素,call绑定坐标轴数据,attr就是给g元素添加各种属性,class(是不是很熟悉),transform。 注:svg中没有top left  margin等属性,大的位移使用transform。

曲线

坐标轴绘制完后,就是曲线的绘制,先生成曲线绘制函数

曲线绘制函数参数

x、y就是根据数据来计算坐标,这里是比例尺大显身手的地方。

interpolate,线段怎么弯曲,讲的最好的是这个地址

http://www.oxxostudio.tw/articles/201411/svg-d3-02-line.html

注:basis曲线保证了优美,没保证曲线与数据的一致,像我这种人是完全无法接受的。

绘制曲线

这一行代码解读一下就是选择所有class是data-line的元素,然后给它绑定数据。data-line哪里来的?这里涉及到d3中一个概念,update  enter  exit

selectAll得到的元素跟数据相比,有三种可能,元素个数 大于/小于/等于数据个数。

数据超出元素个数的部分叫enter,比如第一次绘制时,所有元素都属于paths.enter

paths元素比较简单直接,基本上只需要给一个属性d就能画出来了,d可以用前面的曲线函数直接生成。

stroke,线条颜色,这里可以用颜色比例尺 d3.scale.category10(i)

fill就是填充颜色,paths填充的是一个面。

不超出的部分叫update,即需要更新的部分,paths.update可以看到,也可以直接更新数据,这里是数据驱动的最直观表现

数据少于元素个数的部分叫exit,一般exit只有一个用法

到这里,一个坐标轴差不多出来了,但,是不是少了点啥,对,UED最喜欢的灵魂一击,动画。

曲线进入/更新的时候要动画怎么办

d3的动画很好写

增加 transition ease 和 delay即可,transition前后是动画的起始和结束状态。

绘制一个圆

矩形

半圆角矩形是用path生成的,顶部圆角矩形

topRoundRect和rightRoundRect乍一看完全搞不懂,这里讲的比较详细https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths,仔细观察下,就是

M  起始x y坐标

h 纵移

v 横移

a 比较复杂 前两个参数是圆角的x y radius

中间三个参数 001是三个flag,只能是0/1 圆角矩形都是001

第一个代表弧线角度是否要大于180

第二个代表正角度还是负角度

第三个代表正方向还是反方向

z是合拢

最后两个参数是终止的x y位置

当前了,还有更多的L C S等等,这里不研究了

文字

到这里,d3绘制的套路差不多都熟悉了,append data enter transform attr,拿来画个饼图吧!

生成饼图数据

查看一下this.pieData,你会发现数据增加了 startEngle 和 endEngle

注:饼图默认会按大小排序,如果不需要排序,增加一个sort(null)即可

弧线函数

饼图动画不能使用d了,要使用attrTween

简单的饼图动画

高级饼图动画,自己计算delay的时间,让饼一点一点出来

往饼图中间添加一个圆点

注:centriodData和Angle是钝/锐角的计算提出来,是因为在某些低配机子上,偶现绑定计算错误。

画一个折线

到这里,一般的坐标轴、饼图已经难不倒了,而且自己想添加什么就添加什么,无非就是计算x、坐标,d3就是一堆图形函数,帮你计算坐标而已,那还有什么新东西吗?假如UED说想要阴影,光效,这里介绍一下svg里面一个很牛叉的东西,filter

实话说,这个东西我也只是到抄过来调参的地步,比如dx dy。理解上只知道特效输出为result,下一个特效的in是这个result,其他也是一问三不知,而且看了之后着实没有深入了解下去的想法,简直就是手写Photoshop。

下面是几个介绍filter的地址,留下以备不时之需

1.https://www.w3.org/TR/SVG/filters.html

2.https://www.smashingmagazine.com/2015/05/why-the-svg-filter-is-awesome/

3.https://jorgeatgu.github.io/svg-filters/

 

 

 

 

Ubuntu 14.04/22.04服务器Apache2/Httpd禁止某些User Agent抓取网站

最近网站上,被某些爬虫占用了太大的资源,导致访问不畅,网上搜了一下禁止某些爬虫的办法。

下面这些方法需要同时实施才足够稳妥。

1.在网站根目录下修改或创建.htaccess文件

注意,这个过滤条件需要添加到整个.htaccess文件的头部,否则可能由于其他的过滤条件而跳过了这个过滤条件,导致某些情况下不生效。

2.修改Apache2的配置文件

禁止某些User-Agent的访问

注意:

中间不可用空格,否则无法成功生效。

3.网站根目录下面增加robot.txt,禁止爬虫

4.对于使用ProxyPass,ProxyPassReverse代理转发的情况

使用如下配置进行过滤

注意:

中间不可用空格,否则无法成功生效。

5.验证刚刚的服务器设置是否已生效

刚刚的设置完成后,我们需要修改浏览器的User Agent,来验证一下我们的设置是否已经生效了。
Chrome-55.0为例,Windows下面按下F12,在弹出的窗口中进行如下操作:

使用命令行进行验证会更加简单,如下:

参考链接


被优化为无排版和缩进的JavaScript代码,如何调试?

有时候网页上的JavaScript代码被优化器优化过后,会丢失原来的换行,导致整个的代码蜷缩成一行,完全没办法调试,此时我们就需要借助Chrome或者FireFox自带的代码调整功能来实现代码的调试了,如下图:

参考链接


毫无排版和缩进的 JavaScript 代码,怎么阅读?

Mac OSX下VirtualBox直接使用物理硬盘作虚拟机磁盘

目前VirtualBox只能用命令行来建立磁盘才可以使用物理硬盘。

如果是USB磁盘的话,那么需要从"关于本机"->"概览"->"系统报告"->"USB"中找到磁盘的名字,比如"disk2".

我们假定VirtualBox安装在"
/Applications/VirtualBox.app/"这个目录下面,要在"~/VirtualBox\ VMs/Ubuntu/"目录下面生成文件,则执行如下命令:

/dev/disk2表示机器上的第二块硬盘,每次插入新磁盘后,就会出现类似/dev/disk*的一个路径名。

最后,新建一个虚拟机,然后指定使用刚刚创建的磁盘即可。

参考链接


How do I install Mavericks onto external HD but from inside VirtualBox

macOS Sierra/Catalina/Big Sur支持NTFS/EXT4文件系统

1.安装HomeBrew

按照 让Mac也能拥有apt-get类似的功能——Brew 的介绍配置安装HomeBrew

2.安装osxfuse/ext4fuse/ntfs-3g

卸载命令为:

3.挂载磁盘设备

如果是USB磁盘的话,那么需要从"关于本机"->"概览"->"系统报告"->"USB"中找到磁盘的名字,比如"disk2".

这个信息也可以通过在终端执行命令看到:

如果已知是"EXT4"磁盘格式的话,则使用如下命令:

如果已知是"NTFS"磁盘格式的话,则使用如下命令:

参考链接


ubuntu 16.04下载Android源代码

由于众所周知的原因,我们是没办法正常下载Android的源代码的,因此只能使用国内的镜像来操作了。

1.安装repo工具

2.在需要存储代码的地方创建文件夹

3.使用镜像下载Android源代码
omapzoom.org的镜像

清华大学的镜像

上面执行之后是拉取全部的代码。

如果要使用某个特定分支的版本的源代码的话,则则初始化的时候指定分支,比如我想要Android 7.0.0_r21的分支,则执行如下命令

4.同步代码

5.列出全部分支

6.切换到指定分支

7.查看当前的分支

8.删除不用的本地分支

参考链接