Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。
援引官方的一句话:又提示缺少套件啦?别担心,Homebrew 随时守候。Homebrew —— OS X 不可或缺的套件管理器。
Homebrew
主要由四个部分组成brew
,homebrew-core
,homebrew-bottles
,homebrew-cask
名称 | 说明 |
---|---|
brew | Homebrew源代码仓库 |
homebrew-core | homebrew核心软件仓库 |
homebrew-bottles | Homebrew预编译二进制软件包 |
homebrew-cask | 提供macOS应用和大型二进制文件 |
xcode-select --install
1 | $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
1 | $ brew -v |
1 | $ cd `brew --prefix` |
安装任意包
1 | $ brew install <packageName> |
卸载任意包
1 | $ brew uninstall <packageName> |
查询可用包
1 | $ brew search <packageName> |
查看已安装包列表
1 | $ brew list |
查看任意包信息
1 | $ brew info <packageName> |
更新Homebrew
1 | $ brew update |
查看Homebrew版本
1 | $ brew -v |
Homebrew Cask 是 Homebrew 的扩展,借助它可以方便地在 macOS 上安装图形界面程序,即我们常用的各类应用。Homebrew 中文含义为自制、自酿酒,Cask 中文含义为桶、木桶,桶装酒是一种成品,也就是说每一个 homebrew cask 都可以直接使用的。
1 | $ brew tap homebrew/cask |
1 | $ brew tap --custom-remote --force-auto-update homebrew/cask https://mirrors.ustc.edu.cn/homebrew-cask.git |
1 | $ brew -v |
1 | $ brew install --cask xxx |
1 | $ brew install xxx |
1 | $ brew search --cask xxx |
1 | $ brew search xxx |
1 | 参考brew的操作 |
本文均采用中科大的国内源进行替换,若有需要其他源的可以参考附录3进行替换。
1 | $ echo $0 |
1 | # 替换各个源,把以下三句话分别输入终端 |
1 | # 对于 bash 用户 |
1 | # 对于 bash 用户 |
1 | $ brew update |
由于笔者使用的是Mac,因此就Mac系统的vue环境进行配置,使用的编辑器是vs code,由于前端需求,就自己配置过程,写下此配置手册,以及在创建时遇到的问题,以及插件推荐。
vs code仅为一个轻量级的编辑器,可以安装相应插件,提高代码编写效率,后文有推荐,安装其他编辑器也可以,可以点击vs code选择相应的PC平台安装,笔者为Mac端版本,具体下载速度受网络影响。
Homebrew是Mac上的包管理工具,功能强大具体以后专门写篇博客讲解。
如果你没有安装Homebrew,可以复制以下代码,在终端中执行安装。
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
安装完成后输入brew -v
,如果出现版本信息即为安装成功。
完成了Homebrew的安装,只需要通过brew
命令即可安装node.js输入以下命令。或者选择去nodejs官网下载安装最新LTS版本,按步骤安装即可。
1 | brew install nodejs |
安装完成后输入node -v
,如果出现版本信息即为安装成功。同时相应的也会安装npm,Node.js自带了软件包管理工具npm,可以使用npm安装各种插件,输入npm -v
出现相应的版本信息即为安装完成。
由于npm服务器在国外,下载速度较慢,为了得到更好的体验,我们选择国内镜像源,在终端输入以下代码,
1 | npm install -g cnpm --registry=https://registry.npm.taobao.org |
安装完成后输入cnpm -v
,如果出现版本信息即为安装成功。
webpack是当前前端最热门的前端资源模块化管理和打包工具,输入以下命令安装:
1 | cnpm install webpack -g |
安装完成后输入webpack -v
,如果出现版本信息即为安装成功。
vue脚手架的作用是用来自动一键生成vue+webpack的项目模版,包括依赖库,免去你手动安装各种插件,寻找各种cdn并一个个引入的麻烦,输入以下命令安装:
1 | sudo cnpm install -g vue-cli |
安装完成后输入vue -V
(为大写的V),如果出现版本信息即为安装成功。
为了方便起见我在桌面建立了一个test文件夹mkdir test
,然后cd test
,输入以下命令创建项目(此处若出现问题,请参考后文解决措施):
1 | vue init webpack-simple myProject |
然后按步骤输入项目信息,注意Project name不支持大写字母为项目名,项目创建好后,它也给出了提示信息,继续操作即可。
每一个项目都有一个package.json文件,里面有很多组件信息,使用npm install
将按照package.json安装所需要的组件放在生成的node_modules文件夹中,项目下的每一个文件中都可以通过import引入node_modules的组件来加以使用,首先输入cd myProject
进行项目目录中,然后输入以下命令:
1 | npm install |
完成以上步骤后,输入以下命令启动项目:
1 | npm run dev |
若在网站上出现以下内容,即为安装成功
若运行过程出现问题请检查上述步骤是否正确,后文中给出了部分问题的解决方案,可能对您有帮助。
发现是在下载模版时无法连接到github的问题,属于网络问题,解决方案有以下两种:
1 | sudo vi /etc/hosts |
在ip地址查询网站,搜索github.com
,查询相应ip地址,此时笔者的ip显示为:
1 | IP Address:140.82.114.3 |
注意:ip地址会随着时间更换,建议每次都查询一遍
1 | # Github |
完成后保存文件,vi的使用可参考vi教程,然后重新进行vue init尝试。
如果方法一未能解决问题,可以使用方法二,具体步骤如下:
需要手动下载webpack-simple
模板 ,进入到github项目地址(可能因为网络原因无法访问,请多次尝试),选择webpack-simple
下载到本地。
将下载下来的 webpack-simple
解压,放到 /Users/apple/.vue-templates/webpack-simple
目录中,如果不确定自己电脑中具体需要将解压的文件放置在什么位置,可以先运行vue init webpack-simple projectName --offline
命令,会提示如下错误 vue-cli · Local template "/Users/apple/.vue-templates/webpack-simple" not found.
错误信息中的 /Users/apple/.vue-templates/webpack-simple
便是需要存放webpack-simple
的位置。
一般情况下,进入第2步中的时候,会发现 /Users/apple/.vue-templates/webpack-simple
该目录找不到,而且通过鼠标创建 .vue-templates
文件夹是不成功的,这个时候需要通过命令mkdir .vue-templates
指令来创建。
将 webpack-simple 文件夹顺利放到 /Users/apple/.vue-templates/webpack-simple
之后,在命令行执行vue init webpack-simple projectName --offline
命令就可以创建 vue 项目了。
作为一名计算机专业的学生,学会使用Terminal是一件必备技能,而一款好看的终端界面,将大大提高生产效率。网上的配置资料零碎,基于自己的配置经验,决定写一份教程,以供参考,因为笔者已经装好环境,为了更好的安装体验,文中一些图片参考网上,将在文末注明出处。由于笔者使用的是Mac,因此介绍的是Mac上的一款终端替代软件item2
,并将使用oh my zsh
对其进行配置,也将会介绍一些插件的使用,话不多说,先看效果图。
这里放上我的GitHub仓库,文件自取,欢迎star🌟
。
直接进入item2官网,点击download,根据提示一步步下载即可。
Homebrew是Mac上的包管理工具,功能强大具体以后专门写篇博客讲解。
如果你没有安装Homebrew,可以复制以下代码,在终端中执行安装。/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
我们已经安装了homebrew,因此可以使用brew来快速安装git,复制一下代码:brew install git
由于Mac默认使用的是Bash,相比于默认的Bash,Zsh有更多的自定义选项,并支持扩展。因此 Zsh可以实现更强大的命令补全,命令高亮等一系列酷炫功能,可以使用以下代码进行切换;chsh -s /bin/zsh
如果想要切换回可以使用以下代码:chsh -s /bin/bash
换到zsh
之后就可以使用以下代码进行安装:sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
这里放下oh my zsh的github仓库
到此zsh的安装基本结束了,效果如下,为了达到更酷炫的效果,我们还需要一些插件进行配置。
pip3 install powerline-status --user
//
后为注释不用复制。1 | mkdir ~/Desktop/OpenSource //首先在桌面上创建一个文件夹 |
command
+,
) -> Profiles -> Text,在Font区域选中Change Font,然后找到Meslo LG字体。有L、M、S可选,看个人喜好:1 | cd ~/Desktop/OpenSource |
random
主题,它会在每次打开item2
时切换一个主题,具体操作如下,输入以下代码:vi ~/.zshrc
random
,vim的使用简要说明,用上下左右键移动光标到要修改处,按键盘a
进入insert模式,即可修改,修改完成按esc
键退出,然后用键盘输入:wq
即保存文件,其他操作可参考vim资料。输入以下代码,让文件生效:source ~/.zshrc
具体操作iTerm2 -> Preferences(可以使用快捷键command
+,
) -> Profiles -> Window,在红线处点击选择本地的一张图片作为背景。
在此页面你也可以修改上图中的Transparency和Blur修改背景的透明度以及模糊度,还可以修改其他参数,定制出属于你的美化终端。
为了方便大家提取,我已将我的4个文件背景配置输出为json文件,放在我的github仓库中,4张背景图也放置在仓库中有需要自取,具体操作为克隆仓库,然后按下图指示导入json文件即可,记得下载相应背景图。
zsh中内置了丰富的插件,可在官网上查看Wiki,选择合适的插件,这里讲解几种我自己常用的插件,有待挖掘:
首先输入:vi ~/.zshrc
,可以查看插件安装,在此输入插件名即可,有些上面已经装了就不再叙述。
作用:可以使用各种git
命令缩写。
比如:
1 | git add --all ===> gaa |
查看所有 git 命令缩写cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh
作用:目录间快速跳转,不用再一直cd
了
输入z
查看可以跳转路径。z -x 无效路径
可以删除路径。
作用:在终端里打开当前项目的远程仓库地址
不要小看这个插件欧,每次改完本地代码,当你想用浏览器访问远程仓库的时候,就知道这个插件多方便了
安装
先进插件目录cd ~/.oh-my-zsh/custom/plugins/
克隆项目git clone https://github.com/paulirish/git-open.git $ZSH_CUSTOM/plugins/git-open
在 ~/.zshrc 中配置plugins=(其他的插件 git-open)
使配置生效:source ~/.zshrc
作用:当有时输入语句权限不够时,可按两下esc
自动补全sudo。
作用:平常用的ls、cd 等命令输入正确会绿色高亮显示,输入错误会显示其他的颜色。
安装
先进插件目录cd ~/.oh-my-zsh/custom/plugins/
克隆项目git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
在 ~/.zshrc 中配置plugins=(其他的插件 zsh-syntax-highlighting)
使配置生效:source ~/.zshrc
作用:会给出建议的命令(灰色部分)按键盘 → 补全
安装
先进插件目录cd ~/.oh-my-zsh/custom/plugins/
克隆项目git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
在 ~/.zshrc 中配置plugins=(其他的插件 zsh-autosuggestions)
使配置生效:source ~/.zshrc
最近学习Swift语言,此为此课程的第二节,希望自己能在这条道路上坚持住,不断自我迭代发展。
使用func
来定义函数,并在括号内声明参数名和参数类型,使用->
来表示函数返回值的类型。
1 | func greet(person: String, day: String) -> String { |
swift中函数默认使用参数名作为标签,可以使用_
,或在参数名前自定义一个标签(如下的on)来代替默认标签的使用。
1 | func greet(_ person: String, on day: String) -> String { |
使用tuple来使得函数返回一个复合的值。
1 | func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { |
函数的嵌套,可以在一个函数中定义另一个函数,并在这个函数中使用。
1 | func returnFifteen() -> Int { |
函数作为第一类型,一个函数可以用另一个函数作为其返回值:
1 | func makeIncrementer() -> ((Int) -> Int) { |
函数也可以作为另一个函数的参数:
1 | func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { |
闭包的使用,用{}围成的一个代码块。使用in
来分离参数和代码及返回值。
1 | numbers.map({ (number: Int) -> Int in |
闭包更简洁的写法,当闭包的类型已知时,省略参数类型,和返回值类型
1 | let mappedNumbers = numbers.map({ number in 3 * number }) |
可以使用数字代替参数名来调用,这在短的闭包中非常有用,当闭包是函数的唯一参数,可以省略()
1 | let sortedNumbers = numbers.sorted { $0 > $1 } |
使用class
来定义一个类,并用相同的方法来在类中定义变量,常量,函数。
1 | class Shape { |
使用init
函数,在创造一个实例的时候来初始化这个实例。
1 | class NamedShape { |
使用override
关键字来声明子类覆盖超类,super
关键字来使用超类的方法。
1 | class Square: NamedShape { |
类中的变量也有get
和set
函数,分别不同作用:
1 | class EquilateralTriangle: NamedShape { |
使用willset
来使得两个变量的值保持一致。
1 | class TriangleAndSquare { |
use enum
to create an enumeration.like class and other name type.enumeration has its function and method.
1 | num Rank: Int { |
use struct
to create structure.one of the most inportant differencies between classes and structure is that structure are always bo copied when they are psaaing around your code,but structure pass by the reference.
1 | struct Card { |
DP=“递归”+“记忆”+“猜测”
求解步骤
求解步骤
递归算法的两个要素
必须有最终停止发展下线的边界条件。
必须有与原始问题结构一致,但输入规模小于原始问题规模的递归结构。
递推式为:$T(n)=aT(n/b)+f(n)$
$T(n)=f(n)+af(n/b)+a^2f(n/b^2)+…+n^{log_b^a}$
(1)渐进上升
$f(n)=o(n^{log_b^a-\epsilon})$
$T(n)=o(n^{log_b^a})$
(2)渐进相等
$f(n)=o(n^{log_b^a}(log_2^n)^k)$(存在常数k)
$T(n)=o(n^{log_b^a}(log_2^n)^{k+1})$
(3)渐进下降
$f(n)=o(n^{log_b^a+\epsilon})$
$T(n)=o(f(n))$
求解步骤
与递归相比,多了合并子问题的解
合并时需要技巧,有时关系到时间复杂度
求解步骤
掌握局部信息,选择当前最优的方案,不一定能得到最优解,需证明
回溯基本用深度优先,分支界限基本用宽度优先。
FILO(栈)宽度优先(右->左)
FIFO(队列)宽度优先(左->右)
LC
Bounding(剪枝)
RoboCup之旅结束了,在这里记录下自己的感悟与对人生选择的反思。与之前的数学建模不同,机器人是一个全新的领域,是我所未知的方向,正符合我热爱探索,热爱新事物的追求。当时选拔招新的时候,对机器人也完全没有概念,学校总共有两个方向,一个是视觉组,一个是足球机器人组,也可能是对球类运动的热爱,我内心更加偏向于参加足球组,基于自己当时什么也不会,只是报着玩玩。
大二上学期结束,就有学长组织大家进行足球机器人的培训,所谓的培训也不过就是Linux的环境配置以及看一看b站上的教程。由于当时手上只有一台Mac,不好装双系统,还有自己寒假还有数学建模美赛要准备,就一直拖着没动,想着把美赛干完后在开始。寒假里时间飞逝,等我打完美赛,过了个年,时间就所剩无几,正值当时学长也不在群里催促,也就一直没干活。等到寒假结束了,开学了,开始着手准备二手win机(还有其他原因是由所上课限制,一台Mac无法安装对应软件),打算买一台windows电脑。由于提前到了学校进行缓考,所有还有6天左右的时间在学校没事干,正好机子也到了,开始进行各种安装,首先Linux双系统安装,从设置bios命令啊,制作启动盘啊,一大堆工作,跟着教程一步步走,出现报错就查各种资料,然后还有进行机器人rocos环境配置,又是一大堆报错,教程上还有一堆错误,就这么东搞西搞,大概花了两天时间,把所有环境给配好了,趁着剩下的时间把教程快速过了一遍,实际上没什么学会。
开学之后,学长就开始组织人们集训,当时去国赛的人有10个,人数众多,大家也都不怎么会,而且学长也比较忙,没时间来指导,基本靠自己看b站视频,那段时间现在想想也算浪费了,每天花1个半小时去实验室,看一集教程,跟着做,提升很小,大概就这么过了一个月,有些队员就走了。有隔段时间安排工作,但又受进度所限,总是无法完成,再加上一些队员积极性不高,小型组基本没什么进展。真正让我开始懂得这比赛方式是从看上一届的代码开始,虽然刚开始看时也基本看不懂,但功夫不负有心人,慢慢的在调试下,懂得了代码运行逻辑(也只是少部分)。这时比赛将至,老师只给了四个参赛名额,幸运的是我被留了下来,后面也基本我在组织团队。由于当时我对于这个框架还是非常模糊,很多地方不懂,再加上没有人教学(后来发现上届比赛的终稿丢了,只剩下个半成品),当时压力很大,一度想过退出(但我知道一旦我退出来,这个比赛基本就进行不下去了),但在学长的劝说下,后面没办法只能硬着头皮搞。
后面只剩下四个人,大家的积极性其实都有所提高,而且已经报名了,没有退路了。我们就开始对要写的策略进行分类,分为前场,中场,后场,角球的进攻和防守,以及一些其他的开球、点球之类的。后面我主要包了全部防守和前场进攻还有自动放球。刚开始也不太会写,但在大量阅读源码,以及不断调试之后,基本掌握了整套框架。其他一些部分也由其他队友分担了,后期队友还挺给力,所以基本明天都有所进度的提升,这让我感到挺安心的。就这样每天慢慢的写,后面一有时间,就叫学长过来,解答我们的疑惑,代码上基本没问题了。最后剩下的最关键的问题是,我们学校的仪器设备老旧,我们无法进行实地测试,再加上我们对于这个连接视觉机,连接发射器也不太懂,一直没有在实验室解决,所以实地调参的工作一直没做(换而言之,我们没有真正实地跑过代码,不知道能不能跑成功)。这个问题一直到最后也没解决,怕到时候去了现场无法跑代码,会给学校丢脸了。直到去比赛前,这件事一直悬挂在我心上,成为最大的负担。时间一分一秒的流逝,我们只能在代码上努力了,指导老师基本不管,后面也是我们自己买机票,自己找酒店,解决所有的事,马上就到了出发的日子了。
5月19日,早上3点,我就起床了,由于昨晚把任务基本都安排了,所以所有的事,做的都井然有序,大概四点,把所有东西准备好了(机器人,行李等),坐上提前预约的出租车,出发萧山机场,一切都看似美好的进行着,但我内心却一直担心着现场的调试状况。就这样大概10:30到达了天津,前往酒店放好东西,稍作调整,就立即出发前往比赛场所。到了现场,那里有很多项目,各式各样的机器人比赛,我们没时间闲逛,直接前往小型组场地。到了那里已经有几只队伍到达,我们不敢闲下来,便立刻开始准备,但我们对于实地一点都不会,(之前也已经做好准备,到那里就问那边负责人Mark)。所以我们就一直厚着脸皮,疯狂抓着负责人询问如何连接视觉机,连接发射器,Mark真就一下子就帮我们调好了。第一次,真的第一次,我们在实地的场地上跑了起来。吃完了午饭,一个下午就一直在现场进行调试,可以说对我们信心大增。
由于20号是下午开始比赛,所以一大早我们就去现场进行调试,对射球力度,以及一些代码上的修改,为下午的比赛做准备。后面谁知此次比赛大量队伍弃赛,我们第一场,直接不战而胜(怎么说也算赢了一场,真的挺开心的),但后面那场打浙江大学,我们深知我们肯定是打不过的,所以我们就拿来练手。比赛即将开始,我们突然发现我们的车号匹配出现了问题,而且这个问题不太好改,但比赛以及开始了。没办法,一个上半场,我们直接把4个暂停全部用完了,一直在改代码,还出现一堆犯规,不断被罚车。这些都是我们经验不足,没有进行实战所导致的问题,不过幸好,这场我们以练手为目的,最终0:7落败(也还过得去)。第一天的比赛我们以一胜一负结束了,晚上还进行了技巧挑战赛,我们心态已经放平,基本报着玩的心态在打。
第二天一早就开始比赛,遇到的第三只队伍也弃赛了,我们又赢一场,但我们分析了小组局势,我们只有赢了与中国地质大学,才能拿到出线名额,而那场就是今天的最后一场决战了。我们抓紧时间调试着,修改代码,积极准备着。比赛开始,我们发现地质大学的进攻并不强,基本都是我们主导进攻,他们基本在防守,这增大了我们信心,但后来我们因为一些犯规不断打乱我们的进攻节奏,在上半场快结束的时候,我方前锋面对敌人三人防守,寻找空隙,抓准时机,一击必中,进球有效。下半场我们调整策略,在保持进攻的基础上,做好防守,不让中国地质大学反击的机会,最后我们挺住下半场,以1:0赢得了比赛,成功晋级4强。
由于晋级了四强,晚上我们还要打半决赛,但对我们来说今年的目标已经达成,心理上已经没有太多期望了,就报着玩的心态打打。但可能也是这种心态,我们因为两次失误,让两只对手都1:0击败了我们,对于自己来说也挺可惜的,除了浙大,大家水平基本相同,但第四的成绩也算有所突破吧。后面基本没什么我们的比赛了,大家内心也不紧张了,放下心来休息。
22号,我们基本没有事情,到了下午5点去了现场参加了颁奖典礼,最后领了我们的二等奖奖状,也算是有所收获,不虚此行。最后和队友吃吃喝喝,等待第二天起航回校。
最后讲讲自己的感受,经历了这次比赛,我的心里受到了很大的疲惫,对于未来比赛的选择更加谨慎,深刻认识到要与志同道合的人一起拼搏,才能体会到比赛的乐趣。以及自己的性格貌似都是保守派的,只有所有事情都做到我心安了,才开始会更好,但打了这么多的比赛,发现有时候应该莽一点,激进点,也许能收获胜利。此次比赛也给我留下深刻印象,现在那种比赛的感觉都还历历在目,至少在我以后回忆起来会是个不错的经历。
最近对未来的职业生涯进行了分析,由于笔者手头有一台Mac,之前也大致看过乔布斯传,逐渐被Apple的设计风格所吸引,未来可能更多的选择,设计师,前端,移动应用开发等工作,虽然现在是CS专业,但这并不能阻止我的自我迭代,在现在连找工作都内卷的时代,没有一份拿的出手的绝活,很难在社会上立足。自认为ios开发是一个门槛较高的职业,选择此条道路的人相对较少,且有学长铺路,因此把swift学习作为职业规划第一步。这是第一、二节swift课程,主要学习来源为官方的教程和hacking with swift以及YouTube上的video。
常量(constant)用let定义,即一次初始化后就不能修改,变量(variable)用var来定义,即还可以再次修改其值。
1 | var myVariable = 42 |
可以直接进行类型转换,将两个相同类型的值进行拼接。
1 | let label = "The width is " |
使用\
+()
可以在一个字符串中嵌入数字
1 | let apples = 3 |
使用三个引号"""
可以匹配多行字符串:
1 | let apples = 3 |
使用[]
来定义数组和字典,并通过索引来寻找元素,也可使用append
函数来扩充数组的元素。
1 | var shoppingList = ["catfish", "water", "tulips"] |
创建空的数组和字典,并且注明数据类型:
1 | let emptyArray = [String]() |
但数据类型可以推测时,定义变量数组和字典:
1 | shoppingList = [] |
使用if
进行条件的判断,使用for-in
进行循环,注意使用大括号括住所需代码。
1 | let individualScores = [75, 43, 103, 87, 12] |
使用?
来定义一个变量为可选择项,表示值是missing的,不赋值表示nil
,赋值表示其值。可以使用if let
来判断一个值是否为optional。可选择的值optionalName
会被赋值给let
后的常量,并在判断中可以使用。
1 | var optionalString: String? = "Hello" |
使用??
操作符,当一个optional值为nil
时,会使用??
后的值进行代替。
1 | let nickname: String? = nil |
switch
的使用,swift提供了多种case的判断条件,如下:
1 | let vegetable = "red pepper" |
switch当匹配到一个case,就会执行其相应代码,然后退出switch,但必须有default
使用for in
来遍历字典中的元素,且可以嵌套循环,可以使用_
来不使用此元素。
1 | let interestingNumbers = [ |
使用while
和repeat-while
来进行循环。
1 | var n = 2 |
使用..<
来进行一个范围的循环此循环不包含上限值,可以使用...
来包含上限值的循环。
1 | var total = 0 |
由于笔者使用的是Mac,因此就Mac系统的OpenCV环境进行配置,使用的编辑器是Xcode,网上的教程老旧,且资料不是很完善,因此笔者在此记录下环境配置过程
在App Store中安装Xcode(具体不再赘述),目前版本为12.5,安装大小为11.7G,安装时间较长,具体取决于互联网速度与设备运行速度。
Homebrew是Mac上的包管理工具,功能强大具体以后专门写篇博客讲解。
如果你没有安装Homebrew,可以复制以下代码,在终端中执行安装。
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
完成了Homebrew的安装,只需要通过brew
命令即可安装openCV,此过程要花费较多的时间,安装各种依赖库,仅需等待即可。
1 | brew install opencv |
pkg-config
是在编译应用程序和库时使用的辅助工具,可以帮助我们找到找到正确的OpenCV 链接器符号 (Linker Flags) ,在后续的步骤中会用到。
安装pkg-config
,也只需要在终端输入以下命令
1 | brew install pkg-config |
查看您的opencv.pc
文件所在位置,一般opencv.pc
文件所在位置为
1 | /usr/local/Cellar/opencv/<版本号>/lib/pkgconfig/opencv.pc |
如笔者的版本为4.5.2
,opencv.pc
现已改为opencv4.pc
(不同电脑可能有所不同,读者可以cd
到相应文件目录查看具体信息)
1 | /usr/local/Cellar/opencv/4.5.2/lib/pkgconfig/opencv4.pc |
使用下面的命令查看OpenCV
的链接器符号 (Linker Flags) ,笔者的代码为
1 | pkg-config --cflags --libs /usr/local/Cellar/opencv/4.5.2/lib/pkgconfig/opencv4.pc |
你会得到类似于如下的输出结果,我们需要参照输出结果在 Xcode 中进行配置
1 | -I/usr/local/Cellar/opencv/4.5.2/include/opencv4 -L/usr/local/Cellar/opencv/4.5.2/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_dnn -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core |
在正式运行 OpenCV C++代码之前,首先需要在 Xcode 中创建一个空的C++项目,创建Command Line Tool,具体创建过程不在这里叙述。
需要注意的是项目的 Language 应选择为 C++。
在 Xcode 中设置 Header Search Paths
,先单击 Xcode 项目,然后点击 Build Settings
,然后搜索Header Search Paths
。将 Header Search Paths
路径设置为刚才得到的输出结果“-I”之后的路径,如我需要对如下路径进行添加。
1 | /usr/local/Cellar/opencv/4.5.2/include/opencv4 |
类似地,在 Build Settings
中搜索Library Search Paths
,将 Library Search Paths
路径设置为刚才得到的输出结果“-L”之后的路径,如我需要对如下路径进行添加。
1 | /usr/local/Cellar/opencv/4.5.2/lib |
配置到这一步 Xcode 相关内容已经结束。可以尝试运行简单的OpenCV程序判断是否能够正常运行,以下给出简单的示例程序,功能仅为打开图片与退出。
你需要按照后文中“使用相对路径”方法配置相对路径并添加图片1.png到项目文件夹。
1 | #include<opencv2/opencv.hpp> |
若运行过程出现问题请检查上述步骤是否正确,后文中给出了部分问题的解决方案,可能对您有帮助。
Xcode使用图像或资源的绝对路径。为了设置相对路径需要设置Working Directory
。依次点击 菜单栏Product > Scheme > Edit Scheme
中转到Run中
的option
下有Use Custom Working Directory
选项,然后自定义项目目录。
在Build Settings
中搜索 “Documentation Comments
”,将 Documentation Comments
设置为”No
”即可解决该问题。Doxygen 只是一种格式可以选择跳过检查。
1.Setting up OpenCV and C++ development environment in Xcode for Computer Vision projects
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true