1 | sudo apt-get install -y curl python git |
1 | mkdir ~/bin |
1 | echo "PATH=~/bin:$PATH" >> ~/.bashrc |
1 | git config --global user.email "you@example.com" |
1 | mkdir AOSP |
1 | 防止同步失败 记入同步过程日志 |
目前位置一切顺利 准备编译
1 | sudo apt-get install -y openjdk-8-jdk |
为啥要一行行, 方便排错哈
1 | sudo apt-get install -y python-minimal libpython-stdlib python |
1 | source build/envsetup.sh |
此处要选择编译的版本 比如 aosp_arm-eng
, 还是aosp_arm64-eng
,此次实验机为 nexus 5x
就选 18 啦
1 | 选择编译版本 |
1 | sudo make -j12 2>&1 | tee build.log |
最后来张完成纪念..这命令熟悉的让人心疼…别问 爱过…
还没有编译驱动哦,这个帖子就不说刷机的事了 等得空补上
在 Ubuntu 20.04 上 安装 libncurses5:i386
不会 新建 libncurses.so.5
来个软连接即可
1 | error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory |
一样 新系统上面不会建立 libtinfo.so.5
需要手动创建一个
1 | error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory |
这个问题很奇妙 apt-get
安装的 flex
版本为 2.6.35
和源码包里的版本不同 错误也千奇百怪
解决方案是 用 源码包中 携带的 flex-2.5.39
重新编译一份到系统即可
1 | FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll" |
手动删除 java.security 中 对 ssl 证书的校验 重新编译即可
1 | 连接 jack 服务器错误 |
百度一下你就知道 太简单了
1 | sudo apt install -y cifs-utils |
1 | sudo apt-get install -y zsh |
1 | sudo apt-get install -y git |
1 | git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-autosuggestions |
完成 撒花~
]]>window
。他代表的是一个浏览器窗口,它由浏览器创建我们可以直接使用 window
对象的属性保存 window
对象的方法保存{}
界定的代码区域,let声明的变量具备可访问块作用域示例:
1 | { |
参考博文:
]]>1 | var msg; |
定义但不初始化的情况,变量会保存一个特殊值
undefined
1 | var msg = "hello word"; |
像这样的初始化不会将变量标识为 字符串类型, 只是一个简单的复制, 你可以随时改变保存的值,也可以改变值的类型
1 | var msg = "hello"; |
声明多个变量可用 ,
号分割每个变量 (可选是否初始化)
1 | // 定义 |
1 | function test(){ |
这里的
msg
变量 为test
函数内部 使用var
定义的. 调用test
函数 会创建msg
这个变量并给它赋值,调用后变量即被销毁,所以 在 函数外部调用msg
这个变量会导致错误
var
操作符 可以创建一个全局变量1 | function test(){ |
去掉
var
操作符后,msg
就变成了全局变量, 只要调用一次 test() 就会定义这个变量, 并且可以在 函数外部访问注意:
不要这样定义全局函数,很容易遗漏!!!!
不要这样定义全局函数,很容易遗漏!!!!
不要这样定义全局函数,很容易遗漏!!!!
在严格模式下.如果给这样未声明的变量赋值,会抛出
ReferenceError
错误
使用 var
关键词 声明的变量会自动提升到函数作用域顶部,所以下面书写的代码不会报错
1 | function test(){ |
之所以不会报错, 是因为 ECMAScript
运行时会把它看成等价于如下代码
1 | function test(){ |
这就是所谓的
提升(hoist)
, 也就是把所有变量声明都啦到函数作用域顶部
运行时 变量结果会读取最后一次赋值
1 | function test(){ |
let
和 var
的区别是 let
声明的范围是 块作用域
,而 var
声明的范围是 函数作用域
1 | function test(){ |
1 | function test2(){ |
使用
let
定义的变量不能再if
块 外部被引用, 是因为它的作用域限于该块的内部块作用域是函数作用域的子集, 因此
var
的作用域限制同样也适用于let
let
也不允许在同一个块作用域
内重复声明遍变量1 | let age; |
let
和 var
嵌套使用示例:
1 | var name = "zhangsan"; |
javascript 引擎会记录用于变量声明的标识符和其所在的块作用域, 因此嵌套的标识符不会报错,而是因为同一个块中没有重复声明
let
和 var
这两个关键词声明的并不是不同类型的变量,它们只是指出变量在相关作用域如何存在1 | var name; |
let
和 var
的区别let
和 var
的另一个重要的区别, 就是 let
声明的变量不会在作用域中被提升
1 | // name 会背提升 |
在解析代码时, JavaScript 引擎也会注意出现在块后面的
let
声明, 只不过在此之前不能以任何方式来引用未声明的变量在 let 声明前的执行瞬间被称为
暂时性死区(temporal dead zone)
, 所以 在此阶段引用任何后面才声明的变量则会抛出 ReferenceError使用 let声明变量 必须要按照 先声明 后使用的原则!
使用 let声明变量 必须要按照 先声明 后使用的原则!
使用 let声明变量 必须要按照 先声明 后使用的原则!
与 var
关键词不同, 使用 let
在全局作用域中声明的变量 不会成为 window
对象的属性 (var
声明的变量则会)
1 | var name = "张三"; |
不过, let 声明任然是在全局作用域中发生的, 相应变量会在页面的生命周期内存续, 因此, 为了避免 SyntaxError , 必须要保证页面不会重复声明同一个变量
使用 var
声明变量时, 由于声明会被提升, JavaScript 引擎会自动将多余的声明在作用域顶部合并为一个声明.
因为 let 的作用域是块 ,所以不可能检查前面是否使用的 let 声明过同名变量也就不可能在没有声明的情况下声明它
1 | <script> |
使用 try/catch 语句 或 typeof 操作符也不能解决, 因为 条件块中 let 声明的作用域 仅限于 该块.
1 | <script> |
在 let 出现前 , for 循环定义的迭代变量 会渗透到循环体外部
1 | for(var i; i < 5; i++){ |
改用 let 之后,这个问题就消失了, 因为 迭代变量的作用域仅限于 for 循环块内部
1 | for(let i;i < 5; i++){ |
在使用 var 的时候,最常见的问题就是对迭代变量的奇特声明和修改
1 | for (var i;i<5; i++){ |
之所以这样 是因为在退出循环时, 迭代变量保存的是导致循环退出的值 : 5 , 在之后的执行超市逻辑时, 所有的 i 都是同一个变量,因而输出的都是同一个最终值
使用 let 迭代变量时, JavaScript 引擎在后台会为每一个迭代循环声明一个新的迭代变量
每个 setTimeout 引用的都是不同的变量实例, 所以 console.log 输出的是我们期望的值,也就是循环过程中每个迭代变量的值
1 | for(let i; i < 5; i++){ |
这种迭代声明一个独立变量实例的行为适用于所有风格的 for 循环, 包括 for-in 和 for-of 循环
const
的行为与 let
基本相同, 唯一一个重要的区别就是 用 const
来声明变量时必须同时初始化变量,且 尝试修改 const
声明的变量会导致运行时错误
1 | const age = 11; |
const 声明的限制只适用于它指向的变量的引用,换句话说, 如果 const 变量引用的是一个对象, 那么修改这个对象内部的属性并不违反 const 的限制
1 | const person = {}; |
JavaScript 引擎会为 for 循环中的 let 声明分别创建独立的变量实例, 虽然 const 变量 和 let 变量 很相似, 但是不能用 const 来声明迭代变量 (因为迭代变量会自增)
1 | for (const i = 0; i < 10; ++i) {} // TypeError:给常量赋值 |
不过,如果你只想用 const 声明一个不会被修改的 for 循环变量,那也是可以的。也就是说,每次迭代只是创建一个新变量。这对 for-of 和 for-in 循环特别有意义
1 | let i = 0; |
在 for 循环块作用域中,只是使用 const 声明变量,不重复赋值也是可以用的
所谓特别的意义
const 的作用域仅限于 块,那么 可以在 for 作用域中 用 const 来声明变量,达到不反复开辟内存的作用
ECMAScript 6
增加 let 和 const 从客观上为这门语言更精准的声明作用域和语义提供了更友好的支持,行为怪异的 var 所造成的各种问题 已经让 JavaScript 社区为之苦恼很多年, 随着这两个新关键词的出现, 新的 有助于提升代码质量的最佳实践也逐渐显现,
1, 不使用 var
有了 let 和 const , 大多数开发者会发现自己不再需要 var 了, 限制自己只使用 let 和 const 有助于提升代码质量, 因为变量有了明确的作用域, 声明位置, 以及不变的值
2, const 优先, let 次之
使用 const 声明可以让浏览器运行时强制保持变量不变, 也可以让静态代码分析工具提前发现不合法的赋值操作. 因此 很多开发者认为应该优先使用 const 来声明变量, 只在前提知道未来会有修改时,再使用 let ,这样可以让开发者更有信心的推断某些变量的值永远不会变, 同时也能迅速发现因为意外赋值导致的非预期行为
]]>ECMAScript 5
增加了严格模式(strict mode)的概念。严格模式是一种不同的 JavaScript
解析和执
行模型,ECMAScript 3
的一些不规范写法在这种模式下会被处理,对于不安全的活动将抛出错误
整个脚本启用严格模式,在脚本开头加上这一行:
1 | ; |
指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可:
1 | function doSomething() { |
严格模式是一个预处理指令,任何支持 javascript
的引擎看到他都会切换到严格模式,启用严格模式的目的是不破坏 ECMAScript 3
语法,并且杜绝不规范的写法,如若出现或发生不安全的活动将抛出错误
每个应用项目必须在项目源设置的根目录中加入 AndroidManifest.xml
文件(且必须使用此名称)。
清单文件会向 Android 构建工具、Android 操作系统和 Google Play 描述应用的基本信息。
AndroidManifest.xml
需要声明已下内容:
本来高高兴兴搭建好和朋友挂友链来着,一顿操作.更新好友链页面一片空白..
这是什么道理呢?..天地良心 我可是 git
下来啥也没动哦
女(程)人(序) 的心思你别猜,来先看看文档!!
keep
主要应用到 hexo
提供 _data
功能
个人理解即是: _data
将 信息多,复用多的 资料,配置
抽离出来,方便存储和调用
了解的功能和实现,.现在就开始爬坑吧…
问题:
hexo
主题 目录,原理,语法keep
到底卡那了hexo
主题 目录,原理,语法过一眼这个三个我们接着往下看
模板文档 这一章节开篇明义
模板决定了网站内容的呈现方式,每个主题至少都应包含一个
index
模板,以下是各页面相对应的模板名
得知 模板必须在 index.ejs
文件做加载
本文已 keep
为例
抽丝剥茧下来 加载顺序为
index -> page
1 | # 文件位置 |
打开 page.ejs
, 似乎没看到 和 Link
渲染有关,代码量不大,
顺下逻辑 真相只有一个 那就是在 _partial/page-template
这个局部模板
中
好家伙,我直接好家伙.直接真相
1 | // ... 省略 |
注意
source/links/index.md
文件的title
属性不要修改!
友链样式根据title: links
来匹配! – 来自 keep 文档
修复结果
1 | const isLoadFriendsLink = (page.title === 'links'); |
跑起来~ 完美 家人们的链接出现了 等等 好像有新的问题
修复友链显示后 刷新页面 发现 css
错位,
定位 css
加载文件
/项目/themes/keep/source/css/layout/_partial/page-template.styl
1 | # 省略.. |
处理方法
删除 if (hexo-config('menu.Links')) {
这个逻辑判断
重新 编译 跑起来 完美
]]>一款简约且优雅的 Hexo 主题
是我喜欢的风格..不过对应 hexo >= 5.0
有点问题需要修复,后续会补充博客 mr00ff’s blog 欢迎莅临
hexo: 5.4.0
hexo-cli: 4.2.0
node: 14.16.1
官方推荐两种方式
npm 方式
1 | cd hexo-site |
在
node_modules
安装hexo-theme-keep
,在新增自定义配置文件的情况,
hexo-theme-keep
下的配置文件不会被覆盖我也是纠结了一会才发现这个问题
git 方式 ( 推荐 )
1 | cd hexo-site |
安装文件在 项目路径下
themes/keep
文件夹,推荐理由两个:
- 方便后续升级
- 可以自己随心改 (请慎重)
支持
hexo >= 5.0.0
的自定义子配置(这个配置很灵活), 具体功能请看 hexo 配置文档 搜索_config.[theme].yml
复制一份 keep
的全部配置 到 项目根目录做备用
后续更改配置只需要更改 /项目路径/_config.keep.yml
即可
1 | cp -a /项目路径/themes/keep/_config.yml /项目路径/_config.keep.yml |
编辑 hexo
项目的全局配置 _config.yml
中 theme
的值 为 keep
1 | # .... |
最后….跑起来看看啊 你还在期待什么?
]]>环境介绍
OS: Ubuntu 20.04.2
Python: 3.9.5 Stable
1 | python 下载链接 |
1 | 下载到 用户目录 |
1 | 官方介绍完整版 https://github.com/pyenv/pyenv/blob/master/COMMANDS.md |
Hexo 是一个快速、简单且功能强大的博客框架。 你用 Markdown(或其他标记语言)写帖子, Hexo 会在几秒钟内生成带有漂亮主题的静态文件。
个人理解:
hexo
是一个解释器,将 标记语言(markdown
等.) 转化成 html
代码,并赋能 分类,标签,评论,搜索 等 博客功能 进行集中管理,是一个非常轻便管理工具.
注意:
环境介绍:
hexo: 5.4.0
hexo-cli: 4.2.0
node: 14.16.1
1 | 手脚架 |
1 | 启动博客服务 |
1 | hexo --help |