开源≠免费 常见开源协议介绍

不根据协议使用开源软件可能面临的风险 2003 年 Linksys 公司(同年 3 月被思科收购)推出 WRT-54G,这款路由器采用了基于 Linux 的固件,而 Linux 使用的是 GPL 开源协议,所以思科迫于压力,开放了 WRT-54G 的源码,这使得爱好者们知道了路由器固件的实现方式,进而促成了各种相关开源项目的繁荣,其中就包括 OpenWRT Android 和 Linux 内核 的关系 Android 使用了 Linux 内核,而 Linux 内核采用的是 GPL 的开源协议,所以 Google 修改了 Linux 内核,使得驱动程序可以在 Linux 内核的上层运行,这样上层的代码可以绕过GPL协议。这也使得所有 Android 上的开源驱动,不经过修改无法直接用在 Linux 内核上,造成了Linux 内核的分裂,所以 Linux 内核开发小组撤下了 Android 所贡献的代码 而非内核部分,Android 开源项目 (AOSP) 许可提到了: 对于用户空间(非内核)软件,相比其他许可(例如宽通用公共许可证 (LGPL)),我们更倾向于 Apache 2.0(以及 BSD 和 MIT 等类似许可) 我们为自己的代码首选 Apache 2.0 因为 AOSP 采用了 Apache 2.0 协议,所以任何人都可以基于 AOSP 开发自己的 Android 系统,而且不需要开源,国内的一些定制 Android 系统都是基于 AOSP,具体可以参考定制Android固件列表。虽然 AOSP 是开源的,但是 Google 移动服务 GMS(Google Mobile Service)是闭源的,GMS 中包括,如果手机厂商想要使用 GMS,就必须向 Google 支付授权费。GMS 包含了 Google 自家的App 和服务,除此之外海外 Android 平台发布的 App 严重依赖 GMS,没有 GMS 可能导致软件无法使用等问题,Google 禁止华为对 GMS 的使用,导致华为手机海外出货量大幅下降 ...

December 20, 2021

简单的 Go 入门教程

Go(又称 Golang )是 Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言 Docker 和 Kubernetes 都是使用 Go 进行开发的,这几年 Go 越来越流行,生态也越来越好了 初学 Go 的时候会遇到了一些小问题,在一些教程中没有提及或者因为时效性的缘故,经常需要查阅很多资料才能弄懂,所以想写一篇比较新人视角的文章帮助大家入门 安装 Go 的官网就是 golang.org,点击首页的 Download Go 就可以跳转到下载页面,然后下载对应操作系统的 Go,如果国内访问缓慢,可以访问镜像站:golang.google.cn,官方安装教程:Download and install Windows 只要下载对应的 msi 文件,然后打开后按照提示基本上就是下一步下一步… 具体可以参考这篇博客:Windows Go 开发环境下载、安装并配置,安装完成后 Windows 需要 Win键 + R键,然后输入 cmd,输入 go version,显示版本号就说明安装完成 GOPROXY 国内下载依赖库会比较缓慢,所有我们需要配置 Go Proxy 加速依赖下载(有点像 Java 中修改 Maven 镜像仓库),这里镜像源使用 七牛云 go env -w GOPROXY=https://goproxy.cn,direct 也可以通过 go env 查看所有的 Go 环境变量,其中就包括 GOPROXY,这个变量定义的就是配置 Go 镜像 Hello World 推荐使用 JetBrains 家的 GoLand,使用体验基本和 JetBrains 家的其他软件例如:IDEA、PyCharm 相似,还有一种也比较主流,就是使用 VSCode 配合 Go 插件,可以参考:VsCode Go插件配置最佳实践指南,相对来说需要比较多的配置,而且调试比较麻烦,对于新手不是很友好 ...

October 18, 2021

Docker Compose 实践及梳理

上一节:IDEA 配合 Dockerfile 部署 SpringBoot 工程 Docker Compose 可以实现 Docker 容器集群的编排,可以通过 docker-compose.yml 文件,定义我们的服务及其需要的依赖,轻松地运行在测试、生产等环境 文档 Product manuals Compose file version 3 reference Docker 从入门到实践 【中文】 安装 Compose Compose 依赖 Docker Engine,所有要保证环境安装了 Docker,可参考官方教程,主要分为两步: # 1. 下载 Compose 只执行文件到 usr/local/bin/ 目录 # 下载失败可以参考下一小结提供地址安装 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 2. 对 Compose 可执行文件添加运行权限 sudo chmod +x /usr/local/bin/docker-compose # 输入下面命令查看帮助,测试安装是否成功 docker-compose -h Compose 开源在 Docker 官方的 GitHub 仓库:docker/compose,所有的 Compose 都会发布在仓库的 Releases 里,步骤1就是使用 curl 命令从 Releases 里下载可执行文件,uname -s和uname -m 可以读取系统的内核名称和硬件架构,用来匹配需要的 Compose 版本, curl 的 -L 参数会让 HTTP 请求跟随重定向(默认不跟随),-o (小写o) 会将服务器响应保存成文件,直接下载到:usr/local/bin/ 下,文件名为:docker-compose,因为这个路径已经在环境变量中了,所以完成步骤2,添加可执行权限后,就可以在任意位置使用了 ...

September 15, 2021

IDEA 配合 Dockerfile 部署 SpringBoot 工程

上一节:Dockerfile 实践及梳理 下一节:Docker Compose 实践及梳理 准备 SpringBoot 工程 新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestController public class HelloController { @GetMapping("hello") public String hello() { return "hello world!"; } } 注意,需要在 pom 中添加 spring-boot-maven-plugin 插件,否则运行 jar 包时会提示:没有主清单属性 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 启动项目,访问 http://localhost:8080/hello 测试 在项目目录添加 Dockerfile 文件 FROM openjdk:8-jre # ./target/demo-0.0.1-SNAPSHOT.jar 为编译后的 jar 包位置 # jar 包的名称要与自己配置的相同,格式为:项目名称-版本号.jar COPY ./target/demo-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar"] CMD ["app.jar"] Docker 远程连接配置 演示使用的 Docker 宿主机是 CentOS 7,修改配置并重启 Docker 服务 vim /lib/systemd/system/docker.service 将 ExecStar 这行配置修改为下面这行 ...

September 5, 2021

Dockerfile 实践及梳理

上一节:Docker 实践及命令梳理 下一节:IDEA 配合 Dockerfile 部署 SpringBoot 工程 Dockerfile 是一个文本文件,我们可以通过组合一条条的指令 (Instruction),来构建满足我们需求的 Docker 镜像 文档 Best practices for writing Dockerfiles Reference Dockerfile 指令详解 简单上手 使用 Dockerfile 构建SpringBoot 工程的镜像 新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestController public class HelloController { @GetMapping("hello") public String hello() { return "hello world!"; } } 启动项目,访问 http://localhost:8080/hello 测试 打 jar 包 注意,需要在 pom 中添加 spring-boot-maven-plugin 插件,否则运行 jar 包时会提示:没有主清单属性 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> #打包 mvn package target 目录下就可以找到 .jar 文件,我这里的文件名为:demo-0.0.1-SNAPSHOT.jar 在 Linux 新建 ~/springboot 文件夹,并将 jar 包上传到这个文件夹下 ...

September 1, 2021

SpringBoot 整合 SpringSecurity 梳理

文档 Spring Security Reference SpringBoot+SpringSecurity+jwt整合及初体验 JSON Web Token 入门教程 - 阮一峰 JWT 官网 SpringSecurity 项目 GitHub 仓库地址:https://github.com/aaronlinv/springsecurity-jwt-demo 依赖 主要用到了: SpringSecurity,Thymeleaf,Web,Lombok <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependency> 页面 编写页面和 Controller 进行测试,具体页面可以看 代码 主要包含了首页(index),订单(order),还有 user,role,menu这三个位于 /system 下,需要 admin 权限 使用内存用户进行表单登录 在 static 下新建 login.html,用于登录 <form action="/login" method="post"> <label for="username">账户</label><input type="text" name="username" id="username"><br> <label for="password">密码</label><input type="password" name="password" id="password"><br> <input type="submit" value="登录"> </form> 编写继承 WebSecurityConfigurerAdapter 的 Security 配置类,并开启 @EnableWebSecurity 注解,这个注解包含了 @Configuration WebSecurityConfigurerAdapter 中有两个方法,它们名称相同,但是入参不同 protected void configure(HttpSecurity http) throws Exception protected void configure(AuthenticationManagerBuilder auth) throws Exception 入参为 HttpSecurity 的 configure 可以配置拦截相关的参数 另一个入参为 AuthenticationManagerBuilder,则是用来配置验证相关的参数 ...

August 24, 2021

Docker 实践及命令梳理

下一节:Dockerfile 实践及梳理 文档 Docker Reference Documentation Docker 从入门到实践 【中文】 安装 安装 Docker,设置开机启动,然后配置阿里云镜像加速 1. 安装 Docker Docker 官方安装 CentOS 官方安装教程,直接安装速度相对慢,推荐使用 使用脚本自动安装 Docker: curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh --mirror Aliyun # 开机启动 docker sudo systemctl enable docker # 启动 docker sudo systemctl start docker 2. 阿里云镜像加速 注意!registry-mirrors 需要替换成自己的 阿里云镜像加速器地址,通过点击地址获取 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["这里替换成自己的阿里云镜像加速器地址"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker Docker CLI CLI 是 Command-Line Interface (命令行界面)的缩写 命令详情可以参考官方文档:Docker Reference Documentation ...

August 11, 2021

Oracle数据库对比MySQL

基本 Oracle默认端口:1521 默认用户:system MySQL默认端口:3306 默认用户:root 连接MySQL: mysql -u root -p -- 输入密码 -- 查询所有数据库 show databases; -- 切换到 "test" 这个数据库 use test; -- 查询该数据库所有表 show tables; 连接Oracle: sqlplus -- 输入用户名 -- 输入密码 -- 查询该用户的表 select TABLE_NAME from user_tables; 注意:Oracle 登录需要授予登录用户 session权限,建表需要分配限额 常用字段类型 Oracle 数值 number number(10) number(10,2) 字符串 varchar2 varchar2(20) 日期 date MySQL 数值 tinyint smallint mediumint int bigint decimal 字符串 varchar(10) 必须指定 日期 date time datetime timestamp year ...

February 3, 2021

《高效能人士的七个习惯》读书笔记

读完《高效能人士的七个习惯》,这本书中提到的很多内容引起了共鸣,我开始使用其中提到的一些习惯开始改变生活,并且这些习惯有在使我的生活更加积极高效。开始跳出自己,审视真实想法、动机、基本的思维方式并能够选择改变它们 看到伐木工人伐木的例子,才恍然大悟,我们深陷技术框架中却不自知,忽视了训练一些更为重要的能力。只专注于那些紧急而重要的事情,却忽视那些不紧急而重要的事,疲于应对眼前的事,没有着眼于未来 虽然书中提及了很多系统性的方法,但是要落实到行动中,还是有比较大的跨度,还是需要结合书中内容反复实践,从“积极主动”和“以终为始”做起,慢慢达到书中提及的7个习惯 书中主要讲述了7个习惯,这7个习惯相互依赖,前3个习惯为个人领域,在个人领域实现成功后进入公共领域,获得更大的成功: 积极主动 以终为始 要事第一 双赢思维 知彼解己 统合综效 不断更新 习惯一 积极主动 人类不仅能针对特定环境选择回应方式、更能主动创造有利环境。有两个很重要的概念,关注圈:每个格外关注的问题,影响圈:关注圈中可以掌控的事。积极的人,专注影响圈,做力所能及的事,扩大影响圈,使用积极回应(关注自己能改变的事情,能控制的事情)学会转型,放下往事、吸取教训并继续向前。不去埋怨外界,不把自己当成受害者,可以先从改变自己的消极语言开始,关注自己的回答是不是包含消极的情绪,刻意去改变它,尝试用积极的方式回应 习惯二 以终为始 任何事物都需要两次创造:先在头脑中构思,即智力上或第一次的创造,然后付诸实践,即体力上或第二次创造。明确真正的目标很重要,然后才好勇往直前,坚持到底,践行使命。人会因为意外打击:亲人离世、罹患重病、经济危机、陷入危机的时候,我们会扪心自问:“到底什么才是真正重要的?我究竟在追求什么”。可以想象参加自己的葬礼,我们希望我们的家人、朋友认为我们是什么样的人,那我们现在就需要采取对应的行动,去不断趋近这个目标 习惯三 要事第一 习惯三是习惯一和二的具体实践,别让琐事牵着鼻子走,时间管理矩阵(四象限)。偏重第一象限,应对各种问题,疲于奔命,只能借助第四象限的事物逃避现实、稍微放松一下;而将所有时间花在第三第四象限,是不负责任的生活,因为这些都不重要;完成第二象限事务,完成这些活动能提高个人处事能力 第一代时间管理着重利用便条与备忘录,没有优先级概念,做完一件事固然会给人带来成就感,但是所做的是必要而非重要的事,组织纪律和备忘录让人有种错觉,就是他们不必对结果负责;第二代强调事历与日程表,反映出时间管理注意到了规划未来的重要;第三代根据轻重缓急设定短、中、长期目标,再逐日指定目标,将有限的精力和时间加以分配,争取最高的效率,这种方式过分强调效率,把时间崩得死死的,使人失去增进感情、满足个人需求以及享受意外惊喜的机会。而第四代:以原则为中心,配合个人对使命的认知,兼顾重要性和急迫性,强调产出与产能齐头并进,着重第二象限事物的完成 人际关系的本质: 缺乏独立人格,却一味玩弄人际关系的技巧,纵使得逞一时,也不过是运气罢了。处顺境至终还可任你为所欲为,但天有不测风云,一旦面临逆境,技巧便不可靠 牢记一点:速战速决是不切实际的,建立和维护关系都需要时间,建立并维持人际关系是一种长期的投资行为 情感账户投资方式: 理解他人:(换位思考,将心比心) 注意小节:(礼貌,不经意的失言) 信守承诺:(不轻易许诺,许过就一定要兑现) 明确期望:(一开始就提出明确的期望,让相关的每个人都了解,要做到这一点需要投入很多的时间和精力,这样会省去你将来更多的麻烦和周折) 正值诚信:避免背后攻击他人 勇于致歉:(但是一再道歉就显得不真诚) 无条件的爱:无条件的爱可以给人安全感与自信心,鼓励个人肯定自我。有条件的爱,往往会引起被爱者的反抗心理,为证明自己的独立,不惜为反对而反 习惯四 双赢思维 长远来看,不是双赢,就一定两败俱伤,只有双赢才是在相互依赖的环境中唯一可行的交往模式,不能双赢就好聚好散(放弃交易)。心中里有退路,顿觉轻松无比,更不必耍手段、施压力,迫使对方就范。坦诚相见,更有助于发掘及解决问题。即使买卖不成,仁义尚在,或许日后还有合作的机会 习惯五 知彼解己 如果你要和我交往,想对我有影响力,你首先要了解我,而做到这一点不能只靠技巧。如果我觉察到你在使用某些技巧,就会有受骗和被操纵的感觉。我不知道你为什么这样做,有什么动机。你让我没有安全感,自然也不会对你敞开心扉。移情聆听本质不是要你赞同对方,而是要在情感和理智上充分而深入地理解对方。当你清晰、具体地表达想法,最为重要的是,在理解别人思路和担忧的前提下表达,那么可信度会大大增加。在沟通的时候,我们应该先怀着理解对方的想法去聆听,不要一味想着如何回答,将心比心站在对方的角度上,思考如何回答,再争取让别人了解自己的看法 四种自传式回应 价值判断–对旁人的意见只接受或不接受 追根究底– 依自己的价值观探查别人的隐私 好为人师–以自己的经验提供忠告 自以为是–根据自己的行为与动机衡量别人的行为与动机 习惯六 统合综效 – 创造性合作的原则 如果一位具有相当聪明才智的人跟我意见不同,那么对方的主张必定有我尚未体会的奥妙,值得加以了解 沟通层次: 相互提防(赢/输或输/赢模式) 互相尊重(妥协) 统合综效(双赢) 在与他人合作时我们要尊重差异:与人合作最重要的是,重视不同个体的不同心理、情绪与智能,以及个人眼中所见到的不同世界。即使处于不利境地,也不应该放弃追求统合综效。不要在意别人的无礼行径,避开那些消极力量,发现并利用别人的优势,提高自己的认识,拓展自己的视野。你应该在相互依赖的环境中勇敢而坦率第表达自己的观点、情感和经历,借此鼓励他人同样地坦诚相待。尊重人与人之间的差异,当有人不同意你的观点的时候,你应该说:“你跟我有不一样的看法,这很好”,你不一定要对他们表示赞同,但是你可以表示肯定,并尽量给予理解。如果你坚持双赢,确实愿意努力理解对方,你就能找到一种让每一个人都收益的解决方案 变得统合综效: 定义问题或机会 他们的方式(首先试着理解别人的想法) 我的方式(试着通过分享获得理解) 头脑风暴(创造新的机遇和想法) 快速通道(找到最佳解决方案) 习惯七 不断更新 – 平衡的自我提升原则 假使你在森林中 看到一名伐木工人,为了锯一棵树已幸苦了5个小时,筋疲力竭却进展有限,你当然会建议他:“为什么不暂停几分钟,把锯子磨得更锋利?”,对方却回答:“我没空,锯树都来不及,哪有时间磨锯子” 自我提升和完善的四个层面:身体、精神、智力、社会/情感 身体:健康饮食、充足休息、定期锻炼 精神:人的本质、核心和对价值体系的坚持 智力层面:一旦脱离了学校的训导,许多人的头脑就会退化:不再认真读书,不再探索身外的新世界,不再用心思考,也不再写作,至少不再重视写作 智力层面的更新主要靠教育、借此不断学习知识,磨砺心智,开拓视野 定期阅读优秀文学作品 也是拓展思维的最佳方式 磨练心智的另一种有效方式的写作。通过不断记录自己的想法、经历、深刻见解和学习心得,我们的思路就会更加清晰、准确和连贯 社会/情感:围绕着人际关系、移情交流和创造性合作的原则

November 15, 2020

Git 笔记

学习建议 廖雪峰Git教程 比较详细,可操作性也比较强,在评论区可以找到勘误 Git官方推荐的《Pro Git》也很不错,推荐掌握了一定Git基础后再看 对于没有 Linux 基础,或者文字版学起来比较困难的朋友可以看系列视频教程 互联网人都该懂点 Git Linux 下最常用的编辑器就是 Vim,然而第一用可能会让你怀疑人生,建议先学习一下 :使用Vim创建和编辑文本文件 注意点 Git 2.23 (2019.8.16) git checkout 这个命令被拆分成了两个新命令:git switch 和 git restore 创建并切换到dev分支:git checkout -b dev 现在用git switch -c dev 效果相同 初始配置 安装Git Bash后需要做初始配置 用户名邮箱 # 任意文件夹右键 点击“ Git Bash Here ” # ""内替换为自己的用户名和邮箱 git config --global user.name "username" git config --global user.email "email" # 查看配置是否成功 git config user.name git config user.email SSH 免密登录 # ssh-keygen 用于生成,管理和转换身份验证密钥 # -t:密钥的类型 # -C:用于识别这个密钥的注释(不添加注释直接ssh-keygen -t rsa也不影响使用) ssh-keygen -t rsa -C "邮箱地址" # 连续按3次回车 # 将用户目录下.ssh文件夹内的id_rsa.pub的内容粘贴到GitHub的SSH Keys中 # 具体位置:GitHub Settings -> SSH and GPG keys -> SSH keys # 测试是否成功 Github # 码云测试命令为:ssh git@gitee.com 反馈的结果与 GitHub 类似 ssh git@github.com # Are you sure you want to continue connecting (yes/no)? # 这时需要输入:yes #成功会提示成功认证你的账户 # Hi aaronlinv! You've successfully authenticated, but GitHub does not provide shell access. # Connection to github.com closed. 场景0:Git 基本使用 # 新建文件夹,初始化为Git仓库 mkdir learn-git cd learn-git git init # 在当前目录添加并编辑文件(不熟悉 vim 编辑器可以用其他编辑器新建文件并编辑文件 ) vim test.txt # 查看文件状态 test.txt现在为Untracked状态 git status # 添加文件到暂存区 git add test.txt # 提交commit -m 代表添加一个“提交信息” git commit -m "add test.txt" # 推送到 GitHub(在 GitHub 上创建空白仓库,并复制仓库地址) # "git@github.com:aaronlinv/learn-git.git" 需要替换为自己新建的仓库地址 # 先添加远端仓库 # origin:远端仓库的别名(默认origin) git remote add origin git@github.com:aaronlinv/learn-git.git # 查看远端操作(会显示 fetch和push) git remote -v # 推送到远端仓库(使用SSH协议需要配置SSH免密登录) git push -u origin master # -u:指定默认远端仓库别名,下一次推送只需使用git push # origin:远端仓库的别名(默认origin) # master:分支名称 push 是可能会遇到报错:refusing to merge unrelated histories 原因是远程仓库和本地仓库做了不同的改变并commit,导致本地仓库和远程仓库变成了独立的两个仓库,所以不能直接合并,执行以下命令合并代码,再push即可 ...

September 3, 2020