├── README.md
├── 其它
├── HTTPS
│ └── 理解HTTPS.md
├── adb shell
│ └── adb shell详细命令.md
├── 代码重构
│ └── 1、代码重构个人总结.md
├── 区块链
│ └── 来自阮一峰博客
│ │ ├── 1、区块链入门教程.md
│ │ ├── 2、比特币入门教程.md
│ │ └── 3、加密货币的本质.md
└── 骑行经验总结.md
├── 前端
├── AngularJS
│ └── 易百教程-AngularJS教程
│ │ ├── 1、AngularJS简介.md
│ │ ├── 2、AngularJS快速入门.md
│ │ ├── 3、AngularJS环境配置.md
│ │ └── 4、AngularJS MVC体系结构.md
├── BootStrap
│ ├── BootStrap初步学习总结.md
│ └── BootStrap问题解决总结.md
├── CSS
│ ├── 1、CSS清除浮动的三种方式.md
│ ├── 2、深入理解css中position属性及z-index属性.md
│ └── 3、CSS进行水平居中、垂直居中的常用方法.md
├── ES6
│ └── 1、ES6总结.md
├── JavaScript
│ ├── 1、JavaScript判断字符串长度.md
│ └── 2、JavaScript for循环的in和of.md
├── LayUI
│ ├── 1、Layui开发过程随笔记录.md
│ ├── 2、LayUI之table数据表格获取行、行高亮等相关操作.md
│ ├── 3、为Layui的Tab选项卡增加关闭当前、关闭其它操作.md
│ ├── 4、【更新】为Layui的Tab选项卡增加关闭当前、关闭其它操作.md
│ ├── data
│ │ └── data.json
│ └── img
│ │ ├── tab右键菜单.png
│ │ ├── tab右键菜单2.0.png
│ │ ├── that1.png
│ │ ├── that_nextAll.png
│ │ ├── 多表头表格.png
│ │ ├── 对符合条件的行进行高亮显示.gif
│ │ ├── 文件选择上传.gif
│ │ ├── 获取行数据.gif
│ │ ├── 行高亮效果.png
│ │ ├── 行高亮效果_最终.png
│ │ └── 隐藏列.gif
├── Vue
│ └── 1、Vue内容.md
├── WebPack
│ ├── 1、WebPack总结.md
│ ├── 2、【可行】vue-cli+webpack在生成的项目中使用bootstrap的方法.md
│ ├── 3、Webpack 3.x 通过PurifyCSS Plugin按需加载bootstrap css样式.md
│ └── 问题解决
│ │ ├── 1、Component template should contain exactly one root.md
│ │ ├── 2、npm run build 打包后,如何运行在本地查看效果.md
│ │ ├── 3、vue-cli项目webpack打包后iconfont文件路径问题解决.md
│ │ └── 4、WebPack打包时对于部分字体放置问题.md
├── iView
│ └── 1、iView组件映射.md
├── jQuery
│ └── 问题解决记录
│ │ └── jQuery版本问题导致出现【easyui Cannot read property 'msie' of undefined】报错.md
└── 其它
│ └── 前端编码规范.md
├── 操作系统相关
├── Android
│ └── 1、adb使用总结.md
└── Mac
│ ├── AppleScript
│ ├── AppleScript总结.md
│ └── AppleScript脚本入门.md
│ ├── Mac Linux命令总结.md
│ ├── Mac 软件安装
│ ├── Mac Navicat12破解.md
│ ├── IINA播放器.md
│ ├── Mac MySql的root密码重置.md
│ ├── Mac OS 终端利器 iTerm2.md
│ ├── Mac 安装NodeJS.md
│ ├── Mac 安装adb 以及基本的命令.md
│ ├── Mac卸载JDK.md
│ ├── Mac安装MySQL.md
│ ├── SmartSVN安装破解 for mac.md
│ ├── macOS 10.13安装u盘制作教程 macOS 10.13安装u盘制作方法.md
│ ├── 安装HomeBrew.md
│ └── 苹果Mac安装Win10教程 BootCamp安装win10教程.md
│ ├── Mac忘记root密码处理方式.md
│ ├── Mac技巧-知乎.md
│ ├── Mac相关快捷键总结.md
│ ├── Mac相关总结.md
│ ├── 其它
│ ├── 保养类
│ │ ├── Mac电池保养1.md
│ │ └── Mac电池保养2.md
│ └── 实用操作
│ │ ├── MAC 常见问题解决.md
│ │ ├── Mac 利用rsync差异化备份.md
│ │ ├── Mac 移动硬盘无法装载问题解决.md
│ │ ├── Mac重装系统的一些坑.md
│ │ ├── WiFi 未安装硬件.md
│ │ └── 几条简单命令,也能保护你的 Mac.md
│ ├── 实用操作
│ ├── MAC应用无法打开或文件损坏的处理方法.md
│ ├── Mac 为应用程序添加自定义快捷键.md
│ ├── Mac 磁盘分区.md
│ ├── Mac 配置Maven环境变量.md
│ ├── Mac下使用tree命令.md
│ ├── Mac强制退出应用的六种方式.md
│ └── mac下安装wget命令.md
│ ├── 软件使用
│ ├── Alfred
│ │ ├── Alfred 3 每次开机运行后都提示是否允许访问通讯录.md
│ │ ├── Alfred Snippets文字扩展.md
│ │ └── Alfred常用操作配置.md
│ ├── Automator自动处理
│ │ ├── Aotomator将PPT批量转为PDF.md
│ │ └── Automator使用.md
│ ├── Homebrew
│ │ └── HomeBrew说明.md
│ ├── INNA
│ │ └── INNA.md
│ ├── Numbers
│ │ └── Numbers使用技巧总结.md
│ ├── Safari
│ │ └── Mac 加速浏览器访问GitHub速度.md
│ └── iTem2
│ │ ├── iTem2快捷键大全.md
│ │ └── iTerm2 SSH快捷登录.md
│ └── 问题解决
│ └── Mac 每次都要执行source ~.bash_profile 配置的环境变量才生效.md
├── 组件
├── Nginx
│ ├── 1、Nginx总结.md
│ ├── 2、Nginx在CentsOS安装.md
│ ├── 3、Nginx使用详细笔记.md
│ └── assets
│ │ └── v2-816f7595d80b7ef36bf958764a873cba_hd.jpg
├── Tomcat
│ └── 1、Tomcat总结.md
└── Weblogic
│ └── 1、Weblogic总结.md
└── 编程语言
├── C#
├── 实用代码
│ └── C# 多线程配合委托实现控件的控制.md
├── 控件总结
│ ├── C# 动态创建控件.md
│ ├── Chart图表
│ │ ├── C# Chart控件:chart、Series、ChartArea曲线图绘制的重要属性.md
│ │ ├── Chart图表基本模型.md
│ │ └── Chart图表总结.md
│ └── DataGirdView
│ │ └── 【个人总结】C# DataGirdView相关总结.md
└── 插件开发
│ └── Excel插件开发
│ └── VSTO
│ ├── Range.md
│ ├── VSTO-Excel常用操作.md
│ ├── VSTO-简单说明.md
│ ├── VSTO_脑图总结.xmind
│ ├── VSTO个人开发总结.md
│ ├── VSTO创建Excel插件项目.md
│ ├── 浅谈 Excel 对象模型.md
│ └── 问题解决
│ ├── VSTO新建项目相关问题总结.md
│ └── 使用VS创建VSTO项目常见错误.md
├── Java
├── MyBatis
│ ├── mybatis一次执行多条SQL语句.md
│ └── mybatis判断用insert还是update.md
├── Sprint-boot
│ ├── 1、《Spring Boot实战》学习总结.md
│ ├── 2、【个人】Spring Boot使用过程中知识点总结.md
│ ├── 3、Spring Boot注解总结.md
│ ├── 4、Spring Boot简述.md
│ ├── 5、何为依赖注入and控制反转?.md
│ ├── 6、IDEA创建Spring Boot项目.md
│ ├── 7、Spring Boot通过@Value注解注入配置文件数据.md
│ └── assets
│ │ ├── 640
│ │ ├── 1239524-20171017153642646-1885856870.png
│ │ ├── 1240732-20171210185304130-1613507897.png
│ │ ├── 1240732-20171210185455021-2123052165.png
│ │ ├── 1240732-20171210185604036-1671118057.png
│ │ ├── 1240732-20171210185652505-1527919520.png
│ │ ├── 1240732-20171210190507802-1074917446.png
│ │ ├── 1240732-20171210190955396-606058819.png
│ │ ├── 1240732-20171210191115740-1641227994.png
│ │ ├── 1240732-20171210191207115-1995148064.png
│ │ ├── 1524126243381.png
│ │ ├── 20161219173948275.png
│ │ ├── 20161219174140134.png
│ │ ├── 20161219175328727.png
│ │ ├── 20161219200915131.png
│ │ ├── 20161219202736423.png
│ │ ├── 20161219203215665.png
│ │ ├── 20161219203426419.png
│ │ ├── 20180307102404653.png
│ │ ├── 20180307102504770.png
│ │ ├── 20180307103235113.png
│ │ ├── 20180307103453201.png
│ │ ├── 20180307103936126.png
│ │ ├── 20180307104125166.png
│ │ ├── 20180307104219380.png
│ │ ├── 640-1524133968480
│ │ ├── 640-1524133990203
│ │ └── copycode.gif
└── 实用代码
│ ├── IO操作类
│ └── IO操作类.md
│ ├── 判断类
│ └── 1、Java 判断操作系统类型.md
│ ├── 处理转换类
│ ├── 1、Java 递归处理文件夹.md
│ └── 2、Java 万年历 计算月天数等.md
│ ├── 获取设置类
│ └── 1、获取Jar包所在路径.md
│ └── 计算类
│ └── 计算类.md
├── NodeJS
├── 1、NodeJS学习笔记.md
├── 2、如何正确的学习Node.js.md
└── 实用代码
│ └── NodeJS 判断文件是否存在.md
├── Python
├── 实用代码
│ └── IO文件操作类
│ │ └── Python 使用迭代器读取文件.md
└── 实践区
│ └── 爬虫
│ └── 利用requests库下载西瓜视频
│ └── 利用requests库下载西瓜视频实践.md
└── 后端相关类.md
/README.md:
--------------------------------------------------------------------------------
1 | # ProjectRecord
2 |
3 | 项目开发随笔,随心而记。
4 |
5 | 一个想变成公共知识库的Project 😂
6 |
7 |
8 | # 注意!注意!注意!
9 |
10 | 2019年01月04日:
11 |
12 | 为了增强阅读性以及规范性,真正体验出一个知识库的作用,本项目转为Gitbook项目,迁移至新的Github库以及Gitee库,当前库**不再更新维护!不再更新维护!不再更新维护!**,新库地址如下:
13 |
14 | - Github:[https://github.com/TangHanF/project_record_book](https://github.com/TangHanF/project_record_book)
15 | - Gitee:[https://gitee.com/TangHanF/project_record_book](https://gitee.com/TangHanF/project_record_book)
16 |
17 | 欢迎各位Star、Fork,让我们共同构建一个知识库!!!!
18 |
19 |
20 |
21 |
22 |
23 | ------
24 |
25 | # GitHub地址
26 |
27 | **请以GitHub上的ProjectRecord项目为准,Gitee上的ProjectRecord可能更新不及时**
28 |
29 | [参考地址:https://github.com/TangHanF/ProjectRecord](https://github.com/TangHanF/ProjectRecord)
30 |
31 | ------
32 |
33 | **说明**
34 |
35 | - 没有什么特殊说明,完全根据自己开发中遇到的问题进行整理
36 | - 有些地方尚未进行汇总,可能显得比较乱,后期整理
37 | - 其实,我想创建一个各类知识汇集一起 的“知识库”🤩,在此热切盼望各位的加入,共同完善
38 |
39 | ------
40 |
41 | # 【读者人群】
42 |
43 | - 前端开发人员
44 | - 后端开发人员
45 | - 其他同僚...
46 | - 所有有兴趣的各界人士...
47 |
48 | 总之,只要你喜欢都可以参与其中
49 |
50 | ------
51 |
52 | # 额外说明
53 |
54 | 如果大家愿意,可以创建一些目录,例如:
55 |
56 | ```
57 | 前端/
58 | ----LayUI
59 | ----JavaScript
60 | ----HTML5
61 | ----CSS
62 | ----VUE
63 | ----Jquery
64 | ---- ....
65 | 编程语言/
66 | ----Java
67 | ----Python
68 | ---- ....
69 | ```
70 |
71 | # 涉及内容
72 |
73 | > 截止目前,涉及的内容有:
74 | >
75 | > - Java
76 | > - JavaScript
77 | > - JQuery
78 | > - LayUI
79 | > - BootStrap
80 | > - AngularJS
81 | > - NodeJS
82 | > - Python
83 | > - Nginx
84 | > - Tomcat
85 | > - Weblogic
86 | > - 操作系统相关内容(Mac系统)
87 | > - HTTP协议
88 | > - Excel插件开发之VSTO相关内容
89 | > - …….....
90 | >
91 | > 希望有志者参与其中,共同完善....
92 |
93 | # 联系方式
94 |
95 | 邮箱地址:[guofu_gh@163.com](mailto:guofu_gh@163.com)
96 |
97 | ------
98 |
99 | # 其它说明
100 |
101 | > 我们本着知识分享的出发点,部分文章或者片段可能来源于网络收集,如有侵权,请联系[guofu_gh@163.com](mailto:guofu_gh@163.com)删除!并无恶意,请谅解!🤝
102 |
103 | ------
104 |
105 | # 题外话
106 |
107 | 为了更加直观的显示本库的目录,便于各位深入了解,建议各位为自己的浏览器添加`GiteeTree`插件,插件下载地址:
108 |
109 | [点此直达下载](https://gitee.com/oschina/GitCodeTree)
110 |
111 | 安装运行效果图:
112 |
113 | [](https://camo.githubusercontent.com/2f7a4da3683f3e3bf5405122742888a51afdd0a9/68747470733a2f2f7773322e73696e61696d672e636e2f6c617267652f303036744b6654636c793166746e34307a646b71356a3330756931366161696d2e6a7067)
114 |
115 | > 此插件可以支持GitHub以及Gitee
116 |
117 | ------
118 |
119 | **分享快乐,祝你快乐!!**
120 |
--------------------------------------------------------------------------------
/其它/代码重构/1、代码重构个人总结.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Jul 24, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 |
10 |
11 | # 提炼方法(Extract Method)
12 |
13 | 1. 找到要进行重构的代码块
14 | 2. 明确其中的局部变量和参数
15 | 3. 方法封装
16 |
17 | 🧐Tip:
18 |
19 | > - 任何不会被修改的变量都可以作为参数传入
20 | > - 如果只有一个变量被修改,可以考虑将该变量作为方法的返回值处理
21 |
22 |
23 |
24 | - 如果新增一个功能时需要牵扯到调整原有代码结构,此时需要进行重构
--------------------------------------------------------------------------------
/其它/区块链/来自阮一峰博客/1、区块链入门教程.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Oct 17, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | 本文原文地址:[http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html](http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html)
10 |
11 | -----
12 |
13 | 区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。
14 |
15 | 可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。
16 |
17 | 
18 |
19 | 下面,我就来尝试,写一篇最好懂的区块链教程。毕竟它也不是很难的东西,核心概念非常简单,几句话就能说清楚。我希望读完本文,你不仅可以理解区块链,还会明白什么是挖矿、为什么挖矿越来越难等问题。
20 |
21 | 需要说明的是,我并非这方面的专家。虽然很早就关注,但是仔细地了解区块链,还是从今年初开始。文中的错误和不准确的地方,欢迎大家指正。
22 |
23 | ## 一、区块链的本质
24 |
25 | 区块链是什么?一句话,它是一种特殊的分布式数据库。
26 |
27 | 
28 |
29 | 首先,区块链的主要作用是储存信息。任何需要保存的信息,都可以写入区块链,也可以从里面读取,所以它是数据库。
30 |
31 | 其次,任何人都可以架设服务器,加入区块链网络,成为一个节点。区块链的世界里面,没有中心节点,每个节点都是平等的,都保存着整个数据库。你可以向任何一个节点,写入/读取数据,因为所有节点最后都会同步,保证区块链一致。
32 |
33 | ## 二、区块链的最大特点
34 |
35 | 分布式数据库并非新发明,市场上早有此类产品。但是,区块链有一个革命性特点。
36 |
37 | **区块链没有管理员,它是彻底无中心的。**其他的数据库都有管理员,但是区块链没有。如果有人想对区块链添加审核,也实现不了,因为它的设计目标就是防止出现居于中心地位的管理当局。
38 |
39 | 正是因为无法管理,区块链才能做到无法被控制。否则一旦大公司大集团控制了管理权,他们就会控制整个平台,其他使用者就都必须听命于他们了。
40 |
41 | 但是,没有了管理员,人人都可以往里面写入数据,怎么才能保证数据是可信的呢?被坏人改了怎么办?请接着往下读,这就是区块链奇妙的地方。
42 |
43 | ## 三、区块
44 |
45 | 区块链由一个个区块(block)组成。区块很像数据库的记录,每次写入数据,就是创建一个区块。
46 |
47 | 
48 |
49 | 每个区块包含两个部分。
50 |
51 | > - 区块头(Head):记录当前区块的特征值
52 | > - 区块体(Body):实际数据
53 |
54 | 区块头包含了当前区块的多项特征值。
55 |
56 | > - 生成时间
57 | > - 实际数据(即区块体)的哈希
58 | > - 上一个区块的哈希
59 | > - ...
60 |
61 | 这里,你需要理解什么叫[哈希](https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E5%80%BC)(hash),这是理解区块链必需的。
62 |
63 | 
64 |
65 | 所谓"哈希"就是计算机可以对任意内容,计算出一个长度相同的特征值。区块链的 哈希长度是256位,这就是说,不管原始内容是什么,最后都会计算出一个256位的二进制数字。而且可以保证,只要原始内容不同,对应的哈希一定是不同的。
66 |
67 | 举例来说,字符串`123`的哈希是`a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0`(十六进制),转成二进制就是256位,而且只有`123`能得到这个哈希。(理论上,其他字符串也有可能得到这个哈希,但是概率极低,可以近似认为不可能发生。)
68 |
69 | 因此,就有两个重要的推论。
70 |
71 | > - 推论1:每个区块的哈希都是不一样的,可以通过哈希标识区块。
72 | > - 推论2:如果区块的内容变了,它的哈希一定会改变。
73 |
74 | ## 四、 Hash 的不可修改性
75 |
76 | 区块与哈希是一一对应的,每个区块的哈希都是针对"区块头"(Head)计算的。也就是说,把区块头的各项特征值,按照顺序连接在一起,组成一个很长的字符串,再对这个字符串计算哈希。
77 |
78 | > Hash = SHA256( 区块头 )
79 |
80 | 上面就是区块哈希的计算公式,`SHA256`是区块链的哈希算法。注意,这个公式里面只包含区块头,不包含区块体,也就是说,哈希由区块头唯一决定,
81 |
82 | 前面说过,区块头包含很多内容,其中有当前区块体的哈希,还有上一个区块的哈希。这意味着,如果当前区块体的内容变了,或者上一个区块的哈希变了,一定会引起当前区块的哈希改变。
83 |
84 | 这一点对区块链有重大意义。如果有人修改了一个区块,该区块的哈希就变了。为了让后面的区块还能连到它(因为下一个区块包含上一个区块的哈希),该人必须依次修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于后面要提到的原因,哈希的计算很耗时,短时间内修改多个区块几乎不可能发生,除非有人掌握了全网51%以上的计算能力。
85 |
86 | 正是通过这种联动机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改。这就像历史一样,发生了就是发生了,从此再无法改变。
87 |
88 | 
89 |
90 | 每个区块都连着上一个区块,这也是"区块链"这个名字的由来。
91 |
92 | ## 五、采矿
93 |
94 | 由于必须保证节点之间的同步,所以新区块的添加速度不能太快。试想一下,你刚刚同步了一个区块,准备基于它生成下一个区块,但这时别的节点又有新区块生成,你不得不放弃做了一半的计算,再次去同步。因为每个区块的后面,只能跟着一个区块,你永远只能在最新区块的后面,生成下一个区块。所以,你别无选择,一听到信号,就必须立刻同步。
95 |
96 | 所以,区块链的发明者中本聪(这是假名,真实身份至今未知)故意让添加新区块,变得很困难。他的设计是,平均每10分钟,全网才能生成一个新区块,一小时也就六个。
97 |
98 | 这种产出速度不是通过命令达成的,而是故意设置了海量的计算。也就是说,只有通过极其大量的计算,才能得到当前区块的有效哈希,从而把新区块添加到区块链。由于计算量太大,所以快不起来。
99 |
100 | 这个过程就叫做采矿(mining),因为计算有效哈希的难度,好比在全世界的沙子里面,找到一粒符合条件的沙子。计算哈希的机器就叫做矿机,操作矿机的人就叫做矿工。
101 |
102 | 
103 |
104 | ## 六、难度系数
105 |
106 | 读到这里,你可能会有一个疑问,人们都说采矿很难,可是采矿不就是用计算机算出一个哈希吗,这正是计算机的强项啊,怎么会变得很难,迟迟算不出来呢?
107 |
108 | 原来不是任意一个哈希都可以,只有满足条件的哈希才会被区块链接受。这个条件特别苛刻,使得绝大部分哈希都不满足要求,必须重算。
109 |
110 | 原来,区块头包含一个[难度系数](http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html)(difficulty),这个值决定了计算哈希的难度。举例来说,[第100000个区块](https://blockexplorer.com/block/000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506)的难度系数是 14484.16236122。
111 |
112 | 
113 |
114 | 区块链协议规定,使用一个常量除以难度系数,可以得到目标值(target)。显然,难度系数越大,目标值就越小。
115 |
116 | 
117 |
118 | 哈希的有效性跟目标值密切相关,只有小于目标值的哈希才是有效的,否则哈希无效,必须重算。由于目标值非常小,哈希小于该值的机会极其渺茫,可能计算10亿次,才算中一次。这就是采矿如此之慢的根本原因。
119 |
120 | 前面说过,当前区块的哈希由区块头唯一决定。如果要对同一个区块反复计算哈希,就意味着,区块头必须不停地变化,否则不可能算出不一样的哈希。区块头里面所有的特征值都是固定的,为了让区块头产生变化,中本聪故意增加了一个随机项,叫做 Nonce。
121 |
122 | Nonce 是一个随机值,矿工的作用其实就是猜出 Nonce 的值,使得区块头的哈希可以小于目标值,从而能够写入区块链。Nonce 是非常难猜的,目前只能通过穷举法一个个试错。根据协议,Nonce 是一个32位的二进制值,即最大可以到21.47亿。第 100000 个区块的 Nonce 值是`274148111`,可以理解成,矿工从0开始,一直计算了 2.74 亿次,才得到了一个有效的 Nonce 值,使得算出的哈希能够满足条件。
123 |
124 | 运气好的话,也许一会就找到了 Nonce。运气不好的话,可能算完了21.47亿次,都没有发现 Nonce,即当前区块体不可能算出满足条件的哈希。这时,协议允许矿工改变区块体,开始新的计算。
125 |
126 | ## 七、难度系数的动态调节
127 |
128 | 正如上一节所说,采矿具有随机性,没法保证正好十分钟产出一个区块,有时一分钟就算出来了,有时几个小时可能也没结果。总体来看,随着硬件设备的提升,以及矿机的数量增长,计算速度一定会越来越快。
129 |
130 | 为了将产出速率恒定在十分钟,中本聪还设计了难度系数的动态调节机制。他规定,难度系数每两周(2016个区块)调整一次。如果这两周里面,区块的平均生成速度是9分钟,就意味着比法定速度快了10%,因此接下来的难度系数就要调高10%;如果平均生成速度是11分钟,就意味着比法定速度慢了10%,因此接下来的难度系数就要调低10%。
131 |
132 | 难度系数越调越高(目标值越来越小),导致了采矿越来越难。
133 |
134 | ## 八、区块链的分叉
135 |
136 | 即使区块链是可靠的,现在还有一个问题没有解决:如果两个人同时向区块链写入数据,也就是说,同时有两个区块加入,因为它们都连着前一个区块,就形成了分叉。这时应该采纳哪一个区块呢?
137 |
138 | 
139 |
140 | 现在的规则是,新节点总是采用最长的那条区块链。如果区块链有分叉,将看哪个分支在分叉点后面,先达到6个新区块(称为"六次确认")。按照10分钟一个区块计算,一小时就可以确认。
141 |
142 | 
143 |
144 | 由于新区块的生成速度由计算能力决定,所以这条规则就是说,拥有大多数计算能力的那条分支,就是正宗的区块链。
145 |
146 | ## 九、总结
147 |
148 | 区块链作为无人管理的分布式数据库,从2009年开始已经运行了8年,没有出现大的问题。这证明它是可行的。
149 |
150 | 但是,为了保证数据的可靠性,区块链也有自己的代价。一是效率,数据写入区块链,最少要等待十分钟,所有节点都同步数据,则需要更多的时间;二是能耗,区块的生成需要矿工进行无数无意义的计算,这是非常耗费能源的。
151 |
152 | 因此,区块链的适用场景,其实非常有限。
153 |
154 | > 1. 不存在所有成员都信任的管理当局
155 | > 2. 写入的数据不要求实时使用
156 | > 3. 挖矿的收益能够弥补本身的成本
157 |
158 | 如果无法满足上述的条件,那么传统的数据库是更好的解决方案。
159 |
160 | 
161 |
162 | 目前,区块链最大的应用场景(可能也是唯一的应用场景),就是以比特币为代表的加密货币。下一篇文章,我将会介绍[比特币的入门知识](http://www.ruanyifeng.com/blog/2018/01/bitcoin-tutorial.html)。
163 |
164 | ## 十、参考链接
165 |
166 | - [How does blockchain really work?](https://medium.freecodecamp.org/how-does-blockchain-really-work-i-built-an-app-to-show-you-6b70cd4caf7d), by Sean Han
167 | - [Bitcoin mining the hard way: the algorithms, protocols, and bytes](http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html), by Ken Shirriff
--------------------------------------------------------------------------------
/其它/区块链/来自阮一峰博客/2、比特币入门教程.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Oct 17, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | 本文原文地址:[http://www.ruanyifeng.com/blog/2018/01/bitcoin-tutorial.html](http://www.ruanyifeng.com/blog/2018/01/bitcoin-tutorial.html)
10 |
11 | -----
12 |
13 | 比特币(bitcoin)诞生于2008年的一篇[论文](https://bitcoin.org/en/bitcoin-paper)。
14 |
15 | 一个署名为中本聪的人,提出了革命性的构想:让我们创造一种不受政府或其他任何人控制的货币!这个想法堪称疯狂:一串数字,背后没有任何资产支持,也没有任何人负责,你把它当作钱付给对方,怎么会有人愿意接受?
16 |
17 | 
18 |
19 | 但是,狂想居然变成了现实。随后的几年,在全世界无数爱好者的支持下,比特币网络运行起来了,越来越多的人和资本参与,星星之火,终成燎原。刚刚过去的2017年,比特币迎来了爆发式的增长,从年初的1000美元,最高涨到了2万美元,全世界都为之震动,上到政府,下到普通百姓都在关注。事实就是比特币已经并将继续改变世界。
20 |
21 | 
22 |
23 | 新闻媒体往往只关注它的火爆表现,忽视或者无法回答一些基本的问题。
24 |
25 | > - 比特币的原理是什么?
26 | > - 为什么这个无人管理的体系可以成功运作?
27 | > - 比特币交易的流程是怎么回事?
28 | > - 它与区块链又是什么关系?
29 |
30 | 下面,我尝试回答这些问题,希望帮助大家理解比特币。抛开技术细节,还是很容易解释的。
31 |
32 | 有一点说明,本文只讨论技术问题,不涉及如何投资比特币,更不会预测价格走势。事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。
33 |
34 | ## 一、非对称加密
35 |
36 | 首先,理解比特币,必须理解[非对称加密](http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html)。
37 |
38 | 你可能听说过这个词,所谓非对称加密,其实很简单,就是加密和解密需要两把钥匙:一把公钥和一把私钥。
39 |
40 | 
41 |
42 | 公钥是公开的,任何人都可以获取。私钥是保密的,只有拥有者才能使用。他人使用你的公钥加密信息,然后发送给你,你用私钥解密,取出信息。反过来,你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的,且未被篡改,这叫做数字签名(更详细的介绍请看[《什么是数字签名》](http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html))。
43 |
44 | 现在请设想,**如果公钥加密的不是普通的信息,而是加密了一笔钱,发送给你,这会怎样?**
45 |
46 | 首先,你能解开加密包,取出里面的钱,因为私钥在你手里。其次,别人偷不走这笔钱,因为他们没有你的私钥。因此,支付可以成功。
47 |
48 | 这就是比特币(以及其他数字货币)的原理:非对称加密保证了支付的可靠性。
49 |
50 | 由于支付的钱必须通过私钥取出,所以你是谁并不重要,重要的是谁拥有私钥。只有拥有了私钥,才能取出支付给你的钱。(事实上,真实的交易流程稍有不同,私钥保证的不是取出支付给你的钱,而是保证只有你能把这些属于你的钱支付出去,详见后文。)
51 |
52 | ## 二、比特币钱包
53 |
54 | 对于比特币来说,钱不是支付给个人的,而是支付给某一把私钥。这就是交易匿名性的根本原因,因为没有人知道,那些私钥背后的主人是谁。
55 |
56 | 所以,**比特币交易的第一件事,就是你必须拥有自己的公钥和私钥。**
57 |
58 | 你去网上那些比特币交易所开户,它们会让你首先生成一个比特币钱包(wallet)。**这个钱包不是用来存放比特币,而是存放你的公钥和私钥。**软件会帮你生成这两把钥匙,然后放在钱包里面。
59 |
60 | 
61 |
62 | 根据协议,公钥的长度是512位。这个长度不太方便传播,因此协议又规定,要为公钥生成一个160位的指纹。所谓指纹,就是一个比较短的、易于传播的哈希值。160位是二进制,写成十六进制,大约是26到35个字符,比如 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2。这个字符串就叫做钱包的地址,它是唯一的,即每个钱包的地址肯定都是不一样的。
63 |
64 | 
65 |
66 | 你向别人收钱时,只要告诉对方你的钱包地址即可,对方向这个地址付款。由于你是这个地址的拥有者,所以你会收到这笔钱。
67 |
68 | 由于你是否拥有某个钱包地址,是由私钥证明的(具体的证明方法稍后介绍),所以一定要保护好私钥。这是极其重要的,如果你的私钥被偷了,你的比特币也就等于没了,因为他人可以冒用你的身份了,把钱包里面的钱都转走。
69 |
70 | 同样的,你向他人支付比特币,千万不能写错他人的钱包地址,否则你的比特币就支付到了另一个不同的人了。
71 |
72 | ## 三、交易过程
73 |
74 | 下面,我把整个流程串起来,看看比特币如何完成一笔交易。
75 |
76 | **一笔交易就是一个地址的比特币,转移到另一个地址。**由于比特币的交易记录全部都是公开的,哪个地址拥有多少比特币,都是可以查到的。因此,支付方是否拥有足够的比特币,完成这笔交易,这是可以轻易验证的。
77 |
78 | 问题出在怎么防止其他人,冒用你的名义申报交易。举例来说,有人申报了一笔交易:地址 A 向地址 B 支付10个比特币。我怎么知道这个申报是真的,申报人就是地址 A 的主人?
79 |
80 | 比特币协议规定,申报交易的时候,除了交易金额,转出比特币的一方还必须提供以下数据。
81 |
82 | > - 上一笔交易的 Hash(你从哪里得到这些比特币)
83 | > - 本次交易双方的地址
84 | > - 支付方的公钥
85 | > - 支付方的私钥生成的数字签名
86 |
87 | 验证这笔交易是否属实,需要三步。
88 |
89 | > 第一步,找到上一笔交易,确认支付方的比特币来源。
90 | >
91 | > 第二步,算出支付方公钥的指纹,确认与支付方的地址一致,从而保证公钥属实。
92 | >
93 | > 第三步,使用公钥去解开数字签名,保证私钥属实。
94 |
95 | 经过上面三步,就可以认定这笔交易是真实的。
96 |
97 | ## 四、交易确认与区块链
98 |
99 | 确认交易的真实性以后,交易还不算完成。**交易数据必须写入数据库,才算成立,对方才能真正收到钱。**
100 |
101 | 比特币使用的是一种特殊的数据库,叫做区块链(blockchain),详细的介绍请看[《区块链入门教程》](http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html)。本文只讨论交易如何写入区块链。
102 |
103 | 首先,所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。
104 |
105 | 根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。矿工负责把这2000多笔交易打包在一起,组成一个区块,然后计算这个区块的哈希。
106 |
107 | 
108 |
109 | 计算哈希的过程叫做采矿,这需要大量的计算。矿工之间也在竞争,谁先算出哈希,谁就能第一个添加新区块进入区块链,从而享受这个区块的全部收益,而其他矿工将一无所获。
110 |
111 | 一笔交易一旦写入了区块链,就无法反悔了。这里需要建立一个观念:**比特币不存放在钱包或其他别的地方,而是只存在于区块链上面。**区块链记载了你参与的每一笔交易,你得到过多少比特币,你又支付了多少比特币,因此可以算出来你拥有多少资产。
112 |
113 | ## 五、矿工的收益
114 |
115 | 交易的确认离不开矿工。为什么有人愿意做矿工呢?
116 |
117 | 比特币协议规定,挖到新区块的矿工将获得奖励,一开始(2008年)是50个比特币,然后每4年减半,目前(2018年)是12.5个比特币。这也是比特币的供给增加机制,流通中新增的比特币都是这样诞生的。
118 |
119 | 你可能看出来了,每4年奖励减半,由于比特币可以分割到小数点后八位,那么到了2140年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。
120 |
121 | 所谓交易手续费,就是矿工可以从每笔交易抽成,具体的金额由支付方自愿决定。你完全可以一毛不拔,一分钱也不给矿工,但是那样的话,你的交易就会没人处理,迟迟无法写入区块链,得到确认。矿工们总是优先处理手续费最高的交易。
122 |
123 | 目前由于交易数量猛增,手续费已经水涨船高,一个区块2000多笔交易的手续费总额可以达到3~10个比特币。如果你的手续费给低了,很可能过了一个星期,交易还没确认。
124 |
125 | 一个区块的奖励金12.5个比特币,再加上手续费,收益是相当可观的。按照目前的价格,可以达到100万~200万人民币。想想看,运气好的话,几分钟就能挖到一个区块,拿到这样一大笔钱,怪不得人们对挖矿趋之若鹜。
126 |
127 | ## 六、区块的扩容
128 |
129 | [《区块链入门教程》](http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html)说过,比特币协议规定,平均10分钟诞生一个区块。区块的大小只有 1MB,最多只能包含2000多笔交易。也就是说,比特币网络每10分钟,最多只能处理2000多笔交易,换算一下,就是处理速度为3~5笔/秒。
130 |
131 | 全世界的比特币交易这么多,可是区块链每秒最多只能处理5笔,这已经成为制约比特币发展的一个瓶颈。
132 |
133 | 很早就有人呼吁,改革比特币协议,提升处理速度。这件事在2017年8月有了一点眉目,当时区块链发生了一次分叉,诞生了一个新协议,称为 [Bitcoin Cash](https://en.wikipedia.org/wiki/Bitcoin_Cash)(简称 BCH)。这种新货币其他方面都与比特币一致,就是每个区块的大小从 1MB 增加到了 8MB,因此处理速度提升了8倍,手续费也低得多。该协议是对原有区块链的分叉,因此当时持有比特币的人,等于一人获赠了一份同样数量的 BCH。
134 |
135 | 
136 |
137 | BCH 等于创造了一种新货币,还有人提议,原始比特币的区块大小提升到 2MB,这称为 [SegWit2x](https://en.wikipedia.org/wiki/SegWit2x) 。这个建议原定于2017年11月实施,但是最后一刻由于缺乏共识,就被取消了,目前还在讨论中。
138 |
139 | ## 七、点对点网络
140 |
141 | 比特币是一个全世界的开放网络,只要你有服务器,就能加入这个网络,成为一个节点。每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。
142 |
143 | 
144 |
145 | 当你发生了一笔支付,你所在的节点就会把这笔交易告诉另一个节点,直至传遍整个网络。矿工从网上收集各种新发生的交易,将它们打包写入区块链。一旦写入成功, 矿工所在节点的区块链,就成为最新版本,其他节点都会来复制新增的区块,保证全网的区块链都是一致的。
146 |
147 | 最后,你所在的节点也拿到了最新的区块链,从而得知你早先的那笔交易,已经写在里面了,至此交易确认成功。
148 |
149 | ## 八、还有一个问题
150 |
151 | 写到这里,我就介绍完了比特币的基本知识,希望你已经明白了比特币是怎么回事。但是还有一个根本的问题,我没有回答:比特币的本质到底是什么?
152 |
153 | 说到底,比特币只是区块链的一条记录,是凭空生成的,为什么可以当钱用?举例来说,矿工获得12.5个比特币的奖励,其实就是区块链有一个记录:"xxx地址获得12.5个比特币"。正是这行记录,导致该矿工获得了大笔金钱。如果区块链突然增加了一条记录,记载你的地址获得了1000个比特币,你就真的会有1000个比特币。这到底是为什么?
154 |
155 | 这篇文章已经够长了,这个问题就留到下次再谈,欢迎关注本系列的最后一篇文章[《加密货币的本质》](http://www.ruanyifeng.com/blog/2018/01/cryptocurrency-tutorial.html)。
156 |
157 | ## 九、参考链接
158 |
159 | - [How Bitcoin works](https://arstechnica.com/tech-policy/2017/12/how-bitcoin-works/) , by Timothy B. Lee
160 | - [Bitcoins the hard way: Using the raw Bitcoin protocol](http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html), by Ken Shirriff
--------------------------------------------------------------------------------
/其它/区块链/来自阮一峰博客/3、加密货币的本质.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Oct 17, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | 本文原文地址:[http://www.ruanyifeng.com/blog/2018/01/cryptocurrency-tutorial.html](http://www.ruanyifeng.com/blog/2018/01/cryptocurrency-tutorial.html)
10 |
11 | ------
12 |
13 | 现在,各种加密货币(cryptocurrency)不计其数。
14 |
15 | 很多人都在问,加密货币的时代,真的来临了吗?将来会不会人类不再使用美元、人民币,改用加密货币?那么多品种,我应该使用哪一种币?要不要现在就去投资一些?
16 |
17 | 
18 |
19 | 这些问题的答案,我也想知道,就花了很多时间查阅资料、研究协议。前两篇文章[《区块链入门教程》](http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html)和[《比特币入门教程》](http://www.ruanyifeng.com/blog/2018/01/bitcoin-tutorial.html)是我的学习心得,主要介绍基本概念、探讨协议的可行性,没回答一个根本的问题:加密货币到底是什么?
20 |
21 | 下面就是我对这个问题的思考。阅读之前,如果你已经了解区块链和比特币,那很好;如果不了解,也没关系,本文不涉及技术,只讨论最基本的原理。
22 |
23 | 
24 |
25 | ## 一、钱是什么?
26 |
27 | 我们都知道,人民币是钱,美元是钱,金银财宝是钱。
28 |
29 | 我问一个问题,它们为什么能成为钱?
30 |
31 | 你可能回答,因为它们有价值,或者是价值的代表。但是,有价值的东西多了,为什么只有这些品种成为了钱?
32 |
33 | 
34 |
35 | 答案很容易想到,因为人们普遍相信(认同)它们的价值,其他东西的价值难以得到普通认同,无法成为钱。比如,邮票的价值就没有普遍的认同,除了集邮爱好者,其他地方都不能当钱用。一般来说,认同的人越多,这种钱的通用性就越高。
36 |
37 | 
38 |
39 | 我曾经去俄罗斯旅行,当地货币是卢布。可是,一旦离开俄国,没人相信它的购买力,所以卢布离开俄国就没用了。相反,全世界人民都相信美元的价值,所以全世界都能用。我用美元付账的时候,我发现那些俄国人都很满意。
40 |
41 | 
42 |
43 | 所以,**钱的本质,或者说货币的本质,就是它的可信性。**它必须使人们相信,它是有价值的,然后才能成为钱,才能被收藏和支付。
44 |
45 | ## 二、可信性
46 |
47 | 为什么钱必须是可信的?因为对方必须相信它的价值,否则你没法支付出去。
48 |
49 | 那么,接下来的问题就是,可信的东西是否就是钱?
50 |
51 | 我的回答是 Yes。**一样东西能否成为钱,只取决于人们是否相信它的价值,至于它是不是真的有价值,根本不重要。**
52 |
53 | 如果马云在一张纸条上写"这张纸条价值10000元",下面签了他的名,并且附上防伪标记。你说这纸条是钱吗?
54 |
55 | 我跟你保证,这就是钱,你用来支付,人们都会接受,马云等同于发行了一种新的纸币。
56 |
57 | 
58 |
59 | 比特币也是如此,它是什么,其实不太重要。重要的是,它必须保证自己是可信的,这样才能让足够的人相信它的价值,然后才能成为钱。
60 |
61 | ## 三、比特币的可信性
62 |
63 | **比特币要解决的核心问题,就是创造一种可信的数字凭证。**由于这种凭证可信,所以能够当做货币。
64 |
65 | 比特币的技术基础是加密学,因为只有加密学才能保证它的可信性。一旦加密被破解,它就没法当作货币了。这也是这一类数字凭证被称为"加密货币"的原因。
66 |
67 | 技术人员对比特币感兴趣,还有一个重要原因。任何需要可靠的数字凭证的场合,也许都可以用到这种技术。它是不是货币,可能不是那么重要,重要的是它背后的那些加密技术,也许有更大的应用场景。
68 |
69 | ## 四、比特币的特点
70 |
71 | 比特币有三个特点,保证了它的可信性。
72 |
73 | **首先,它不会被(轻易)偷走。**或者反过来说,它使得你无法去偷别人,你只能花你自己的钱。因为必须要有别人的私钥,才能取出他的钱。正常情况下,你拿不到别人的私钥。
74 |
75 | **其次,它无法伪造。**每一个比特币都能追溯来源,而所有比特币都来源于矿工获得的奖励。矿工只有新建区块,才能获得奖励,这是很难的事情,所以无法伪造比特币。
76 |
77 | **最后,它无法大批生成。**原因跟上一条一样,比特币的发行速度是稳定的,现在每10分钟新增12.5个,然后每四年减半,最终停止增长。因此不会像纸币那样,政府滥发导致通货膨胀。
78 |
79 | ## 五、比特币有实体吗?
80 |
81 | 由于后面要提到的原因,比特币不可能拥有实体,没法做到"从口袋里掏出一个币"这种场景,交易都必须通过互联网完成。
82 |
83 | 你可能会说,钱都有实体,怎么可能存在无形的钱呢?答案正好相反,**钱就应该是无形的,那些实体的钱其实是对物质材料的浪费,由于技术不够发达,不得不做成实体。**
84 |
85 | 我小时候买东西,都必须用现金,否则没法证明,自己拥有购买力。只有通过实体的钱,才能保证对方确实收到了钱。如果银行业发达,就不用现金了,可以使用银行卡。支付的时候,对方抄一下银行卡号码,查询银行"这个账户有钱吗"。银行回答有钱,OK,成交。
86 |
87 | 但是,互联网使得实体的银行卡也不需要了。如果存在一个开放的中央记账系统,任何人都可以查询,你把钱划到老板的账户,老板查询一下,发现收到了,交易自动成交,整个过程都是无形的,还需要什么银行卡呢?
88 |
89 | 
90 |
91 | 这个中央记账系统已经实现了,就叫做区块链。
92 |
93 | ## 六、区块链的作用
94 |
95 | **区块链就是一个数据库,记载了所有的交易,用作中央记账系统,分布在无数个节点之上。**
96 |
97 | **每笔交易的核心,就是一句话,比如"张三向李四转移了1个比特币"。**为了证明这句话可信,张三为它加上了数字签名。任何人都可以用张三的公钥,证明这确实是张三本人的行为。另一方面,其他人无法伪造张三的数字签名,所以不可能伪造这笔交易。
98 |
99 | 矿工们收到这句话,首先验证数字签名的可信性,然后验证张三确实拥有这些比特币(每一笔交易都有上一笔交易的编号,用来查询比特币的来源)。验证通过以后,就着手把这句话写入区块链了。一旦写入区块链,所有人就都可以查询到,因此这笔比特币就被认为,从张三转移到了李四。
100 |
101 | 
102 |
103 | **区块链的作用就是把这句话永久保存下来了,让任何人都可以查看,并且任何人(包括张三本人在内)都无法再修改了。**
104 |
105 | 货币是什么?其实就是这句话"张三向李四转移了1个比特币"。这一句话就完成了一次支付。我们平时用人民币支付,其实只是用纸币表达这条信息。如果每个人都可以实时写入/读取中央记账系统(区块链),那么完全可以不携带货币。
106 |
107 | **数字货币的本质,就是一条可信的数据库记录。**数据库记录了你拥有了多少钱,由于这个记录可信,你就真的因此拥有了这笔购买力。
108 |
109 | ## 七、双重支出
110 |
111 | 前面说过,交易不可能被伪造。但是,由于每一笔交易都是一串二进制信号,因此可能被复制。举例来说,"张三向李四转移了1个比特币"这句话,可能被其他人复制,也可能被张三自己复制,提交到区块链。
112 |
113 | **如果这句话被两次写入区块链,就意味着张三可以把同一笔钱花掉两次。**但是,第二次写入的时候,查询区块链可以发现张三已经把这笔钱花掉了,从而认定这是不合法的交易,不能写入区块链。因此,复制交易是不可能的。
114 |
115 | **比较麻烦的是另一种情况,就是张三把同一笔钱付给两个人。**他先向区块链提交一个交易"张三向李四转移了1个比特币",然后又提交了另一个交易"张三向王五转移了1个比特币"。这两个交易都可能被认为是真实的交易,从而进入区块链。因此,必须有办法防止出现这种情况。
116 |
117 | 情况一:同一个矿工收到了这两个交易。那么他会察觉到,它们不可能同时成立,因此选择其中的一笔写入区块链。
118 |
119 | 情况二:矿工 A 收到了第一笔交易,矿工 B 收到了第二笔交易,他们各自都会认定这是合法的交易,分别把这两笔交易写入了两个区块,这时区块链就出现了分叉。
120 |
121 | 
122 |
123 | 比特币协议规定,分叉点之后最先达到6个区块的那个分支,被认定为正式的区块链,其他分支都将被放弃。由于区块的生成速度由计算能力决定,所以到底哪一笔交易最后会被写入区块链,完全由它所在的分支能吸引多少计算能力决定。**隐藏的逻辑是,如果大多数人(计算能力)选择相信某一笔交易,那么它就应该是真的。**
124 |
125 | 综上所述,双重支出不可能发生。因为中央记账系统总有办法发现,你把同一笔钱花了两遍。但是,这也说明了比特币的一个代价,就是交易不能实时确认,必须等待至少一个小时。
126 |
127 | ## 八、参考链接
128 |
129 | - [How the Bitcoin protocol actually works](http://www.michaelnielsen.org/ddi/how-the-bitcoin-protocol-actually-works/), by Michael Nielsen
130 |
131 | (完)
--------------------------------------------------------------------------------
/其它/骑行经验总结.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Oct 9, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 |
10 |
11 | # 组队骑行
12 |
13 | - 人数不宜过多,中长途4~6人最佳,短途尽量控制在15人以下。人多需要考虑的因素很多,比如有些车友喜欢骑快,有些喜欢骑慢,有些有经验,有些没经验,需要照顾的很多。尽量是玩车有一段时间的,对于没有太多组队骑行经验的车友,要在队伍中间,多看多学多反馈,领队也不要骑太快。对于巡航速度没有死板要求,整体控制即可。有对讲更好,可以保持沟通,通报路况,但是不要在骑行过程中说废话,谈天说地,这是和有经验的车友组队骑行最忌讳的。对于稍差的路况,没有对讲的话建议开一个群聊通报路况。
14 |
15 | - 出发前检查车况,油量,不多说。
16 | - 必须要带好护具,不多说
17 | - 必须有手续,合法上路,不然一旦遇到JJ,好心情也会被破坏,影响整体行程
18 |
19 | - 队形推荐交叉式,切勿并排行驶。挑选三个有经验的人,一个领队,一个压轴,一个自由人负责整体协调、路口探路。一定不要前车跟后车,一旦出现状况就是多米诺骨牌效应,很危险。
20 |
21 | - 保持队形,没有领队示意不要超车。
22 |
23 | - 保持车道,不要散养,杜绝各个车道都是摩托车,一窝蜂的骑。很多没经验的都是这样,给人的感觉就是烂,汽车司机也会烦,路人也会嫌弃。被别车也是分分钟的事,也别抱怨人家别车。靠右侧车道保持队形,整齐划一,将是一道风景线,提高安全系数。
24 | - 学习一些基本手势,例如打招呼、停车、避障、加速等,参考:[国际摩托车手势动态图解](http://www.jiche.com/article/qiche--8772.html),而且要依次传达前方车友的手势,因为你看到了,不代表后面的车友也看到了,这也是我在骑行过程中遇到的最多的情况。领队做出手势,传递了三四个人,往后就没动静,后面的人上哪知道前面怎么了。
25 | - 如果有汽车想插入车队,请留个空间给汽车,然后小心经过并重组队形。很多时候看似汽车、摩托车互不相容,这就需要互相理解,发扬骑士精神。汽车打转向小心翼翼的插入车队就要礼让,不要当仁不让。
26 | - 如果车队被交通事故或红灯阻隔了,车队需要放慢车速或停下来等候。请不要为了赶上车队而穿越红灯
27 | - 拒绝饮酒,不多说!
28 | - 对组队骑行过程的意见当场说,不要跑完了再去抱怨。你得明白一个词:`众口难调`,所以,多去互相理解,任何团队都不需要自私者。
29 |
30 | # 浅谈ABS
31 |
32 | > 不要过度依赖ABS! 控制速度以及预判最重要 ,其次就是手速和心态!
33 |
34 | 不是高端车型的话请放心,不会配备弯道ABS,一般的ABS适用于普通公路。要明白`ABS不是为了缩短你的刹车距离,而是相对无ABS的情况下让刹车更安全`,当然了,很多情况下有ABS确实要比无ABS刹车距离短,但都是有条件的,ABS的设计初衷就是让你刹车更安全!
35 |
36 | **关闭ABS的情景:**
37 |
38 | - 结冰路面
39 | - 有雪路面
40 | - 布满沙子的路面
41 | - 泥路
42 | - 跑山、弯道
43 | - ....
44 |
45 | 前四种情况基本类似,都是因为路面的摩擦系数过低,导致ABS工作太积极,出现`虽踩刹车,但无刹车`的情况。
46 |
47 | 跑山时候建议关闭ABS。一般来说,没有弯道ABS的话,很多有经验的车友都会关闭ABS,因为在压弯、下坡过程中路况不同,本来想制动的情况下,由于ABS不必要的介入,导致刹车效果没有达到预期,及其容易钻沟😆。还有一种情况就是一些国产车配备的ABS不敢恭维,万一出现问题就一点刹车都没有,你可以体会一下入弯前没有刹车的无助,以及眼看车冲着山沟沟的无奈,都是亲身经历啊😆。
48 |
49 | # 愉快跑山
50 |
51 | **切记:**
52 |
53 | > 不要随便在弯道超车,压弯的时候发现进弯速度过快而压不过去,不要踩后刹(谁踩谁摔车)干脆摆正车头,点刹加急刹(考验你的手速了😆)!!控制车不冲出路基,实在不行,宁可侧摔!永远不要指望在弯道中获得足够的刹车力。那么在弯道中真的需要紧急刹车怎么办?牢记,你的第一件事不是刹车,而是拉正你的车子。
54 |
55 | 很多车友跑山之后开始如下套路,“你看我都满胎了,咦,你才压了这么一点啊”。需要明白:`每个人车型不一样,技术不一样,玩车心态不一样`,有些拉力车型车高重心高,不是那么好压的,有些确实是新手,尚未掌握压弯心得,有些不是把车当成工具,不是去玩去造,而是把车当成朋友,把旅途当成享受,自然不会去冒险。况且,炫酷压弯给谁看,都是一群车友,自己的技术几斤几两别人还不知道么?`可以讨论,但不要炫耀,不成熟的人才会拿命开玩笑`。我一直说:`满胎不是技术,一辈子安全骑行才是本事`。
56 |
57 | 说实话,跑山还是有风险的,不过你再怎么熟悉,路不会一成不变。你不冒险不代表别人不冒险,你安全驾驶不代表别人安全驾驶。上面说的不要随表在弯道超车也是这个原因所在。
58 |
59 | 压弯技术不成熟就不要冒险,不要跨越车道,很多自视技术不错的,你看看你过个弯跑哪个车道了?对向一旦来车可是要连累别人的!
60 |
61 | # 日常通勤
62 |
63 | > 随着现在交通大拥堵,基本的日常通勤也相较以往有了一定压力,尤其大排量车型,龟行简直是痛苦😆。很多小摩擦、事故基本都是发生在日常通勤过程中,
64 |
65 | ### 预判力
66 |
67 | 因为日常路况比较复杂,因此需要我们专心驾驶,预判各种情景。此时预判最为重要,比如何时刹车、何时适当减速….过交叉口、人行道一定要减速或者让行,切勿抢道、抢灯。有时候起步快也没用,下一个路口照样还得停下等红绿灯,此时就要学会控制车速,达到`绿波速度`,基本很少等灯,到面前就是绿灯了,越抢越慢。同时`一定要多看后视镜,了解后方情况`,我在骑行过程中对后视镜的依赖比较严重,没有后视镜的车我宁可不骑!大家也需要形成这么一个原则,有些觉得没有后视镜很帅,我只想说,年轻人啊,too young too simple啊…….
68 |
69 | ### 拥堵
70 |
71 | 堵车情况下通行一定要注意`鬼探头`,建议开启日行灯或者大灯引起其它车辆的注意。我是很不建议钻车缝的,毕竟国内骑行环境不佳,堵车本来就让人心烦气躁了,你嗖嗖从旁边过去,那些私家车看着也不爽,同时也不排除有故意使坏的,慢慢走就是,心平气和。
72 |
73 | ### 跟车
74 |
75 | 摩托车由于车宽不足,很容易在跟车过程中进入前车视野盲区,有些司机突然变道有很大的原因是没看到后方的摩托车,如果看到了,司机基本都会提前开启转向灯。为避免自己进入视野盲区,就要求`控制车距,不要跟在前车正中间,而是靠左或靠右,同时开启日行灯`,以便前车能通过后视镜很容易的观察到你,必要时可闪灯提示一下(注意频率,闪灯很容易被视为挑衅,我最烦就是后面故意闪灯的,对付这种人就得用绝招——屁股上装灯😆)
76 |
77 | ### 停车
78 |
79 | 停车等灯时,我一般都是和前车保持一定车距,同时车头向一侧稍微倾斜,然后不断观察后视镜,了解后方情况,一旦情况不对立马从一侧开溜。所以,`一定要给自己留出一定的冗余空间`。
80 |
81 | ### 遵守交通规则
82 |
83 | 没的说
84 |
85 |
86 |
87 | # 日常维护
88 |
89 | - 更换机油
90 |
91 | - 检查链条,经常保养
92 |
93 | - 检查离合线
94 |
95 | > 离合线很容易被忽略,一旦发现有一根断丝,立马更换,不要犹豫不要侥幸,因为离合线承受的拉力非常大,不想你感觉的那么轻快(杠杆原理、各种辅助…让你觉得离合很轻)
96 | >
97 | > 液压离合的请忽略。
98 |
99 | - `检查轮胎`
100 |
101 | > 有的说么,没得说....
102 |
103 | - `检查刹车`
104 |
105 | > 有的说么,没得说....
106 |
107 | - 检查螺丝
108 |
109 | > 没事就多看看,没错
110 |
111 | - 适时更换火花塞
112 |
113 | 
114 |
115 | - 适时清理空滤
116 |
117 | > 空滤的清理需要根据路况觉得,路况差,经常有扬尘的,5000公里就吹吹吧,一般的1万公里吹吹就行。一般没必要更换,吹吹即可,但是脏的太严重就换吧,又不贵。
118 |
119 | # 倒车扶车技巧
120 |
121 | 累死了....
122 |
123 | # 刹车技巧
124 |
125 | 还没写...
126 |
127 | # 防偷防盗
128 |
129 | 被偷过一次,不忍心写...
130 |
131 | # 装逼技能
132 |
133 | 带个妹子就行了,还要装啥逼
134 |
135 | # 参考
136 |
137 | 
138 | 
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 | 骑士精神。骑士精神是一种信仰 也是一种风度
161 |
162 | 记录仪
163 |
164 | 跟随而不要拦车,不要路怒
165 |
166 |
--------------------------------------------------------------------------------
/前端/AngularJS/易百教程-AngularJS教程/1、AngularJS简介.md:
--------------------------------------------------------------------------------
1 | ## AngularJS 是什么?
2 |
3 | AngularJS是一个非常强大的JavaScript库,用于在单页应用程序(SPA)项目。它扩展了HTML DOM的附加属性,使之更适应用户操作。 AngularJS是开源的,完全免费的,并且由数千名世界各地的开发。它是根据Apache许可证2.0版许可。
4 |
5 | AngularJS是一个开源Web应用程序框架。它最初是由Misko Hevery和Adam Abrons开发于2009年。现在是由谷歌维护。
6 |
7 | AngularJS的定义,它的[官方文档](http://docs.angularjs.org/guide/introduction)介绍如下:
8 |
9 | > AngularJS是动态的Web应用程序结构框架。它可以让你使用HTML作为模板语言,扩展HTML的语法清晰,简洁地表达应用程序的组件。Angular分明的数据绑定和依赖注入必须编写代码。而这一切都在浏览器内发生,这使得它与任何服务器技术的理想合作伙伴。
10 |
11 | ## 特点
12 |
13 | - AngularJS是一个功能强大的基于JavaScript开发框架来创建富互联网应用(RIA)。
14 | - AngulajJS为开发者提供选项来编写客户端应用程序(使用JavaScript)在一个干净的MVC(模型 - 视图 - 控制器)的方式。
15 | - AngularJS应用是跨浏览器兼容的。自动AngularJS处理适用于每个浏览器的javascript代码。
16 | - AngularJS是开源的,完全免费的,并且由数千名世界各地的开发。它是根据Apache许可证2.0版许可。
17 |
18 | 总体而言,AngularJS是一个框架可以用来构建大规模,高性能的网络应用,同时也易于维护。
19 |
20 | ## 核心功能
21 |
22 | 以下是AngularJS的最重要的核心的功能:
23 |
24 | - **数据绑定:**它是模型和视图组件之间的数据的自动同步。
25 | - **适用范围:**这些是指模型对象。充当控制器和视图之间的胶水。
26 | - **控制器:**这些是绑定到特定范围的Javascript函数。
27 | - **服务:**AngularJS配有多个内置的服务,例如$http提供XMLHttpRequest。这些是在应用程序实例化一次的单一对象。
28 | - **过滤器:**这些从数组项目中选择一个子集,并返回一个新的数组。
29 | - **指令:**指令是关于DOM元素标记(如元素,属性,CSS等等)。这些可以被用来创建作为新的自定义窗口小部件自定义的HTML标签。 AngularJS有内置的指令(ngBind,ngModel...)
30 | - **模板:**这些都与控制器和模型信息呈现的视图。这些可以使用“谐音”的单个文件(如index.html),或在一个页面上的多个视图。
31 | - **路由:**它是切换视图的概念。
32 | - **模型 - 视图 :**MVC是一个设计模式将应用划分为不同的部分(称为模型,视图和控制器),每一个具有不同的责任。 AngularJS没有传统意义上的MVC实现,而是更接近于MVVM(模型 - 视图 - 视图模型)。AngularJS团队让它作为模型视图而不管。
33 | - **深层链接:**深层链接能够使其可书签应用程序的状态进行编码的URL。应用程序可以从该URL为相同的状态恢复。
34 | - **依赖注入:** AngularJS有一个内置的依赖注入子系统,通过使应用程序帮助开发人员更易于开发,理解和测试。
35 |
36 | ## 概念
37 |
38 | 下图描绘了AngularJS,我们将详细在随后的章节讨论的一些重要部分。
39 |
40 | ## AngularJS的优点
41 |
42 | - AngularJS提供在一个非常干净和维护方式来创建单页的应用。
43 | - AngularJS提供了数据绑定功能为HTML从而给用户提供丰富而敏感的体验
44 | - AngularJS代码可单元测试。
45 | - AngularJS使用依赖注入和运用关注点分离。
46 | - AngularJS提供了可重用的组件。
47 | - AngularJS能为开发人员编写更少的代码,并获得更多的功能。
48 | - 在AngularJS,视图都是纯HTML页面,并用JavaScript编写控制器完成业务处理。
49 |
50 | AngularJS应用程序可以在所有主要浏览器和智能手机,包括Android和iOS系统的手机/平板电脑上运行。
51 |
52 | ## AngulaJS的缺点
53 |
54 | 虽然AngularJS带有许多加分,但是我们应该考虑以下几点:
55 |
56 | - 不安全:JavaScript只有框架编写的应用程序在AngularJS是不安全的。服务器端的认证和授权是必须的,以保持应用程序的安全。
57 | - 不可降解:如果应用程序的用户禁用JavaScript的话用户将只能看到基本的页面,仅此而已。
58 |
59 | ## AngularJS组件
60 |
61 | AngularJS框架可分为以下三个主要部分组成:
62 |
63 | - ng-app : 该指令规定,并链接一个AngularJS应用程序的HTML。
64 | - ng-model : 该指令结合AngularJS应用数据的值到HTML的输入控件。
65 | - ng-bind : 该指令子带AngularJS应用数据的HTML标签。
--------------------------------------------------------------------------------
/前端/AngularJS/易百教程-AngularJS教程/3、AngularJS环境配置.md:
--------------------------------------------------------------------------------
1 | 在本章中,我们将讨论如何设置AngularJS库在Web应用程序开发中使用。我们还将简要地研究了目录结构和它的内容。
2 |
3 | 当打开链接https://angularjs.org/,会看到有两个选项下载AngularJS库:
4 |
5 | 
6 |
7 | - GitHub下载 - 单击此按钮去到GitHub,并获得所有最新的脚本。
8 |
9 | - 下载 - 或点击此按钮,屏幕下方会看到:
10 |
11 | 
12 |
13 | 此屏幕给出了使用角JS如下的各种选项:
14 |
15 | - 下载和本地主机文件
16 | - 有两种不同的选择:旧版和最新。名字本身是自我说明。旧版版本已经低于1.2.x版本和最新为1.3.x版。
17 | - 我们也可以使用缩小,无压缩或压缩版本。
18 | - CDN访问:也可以使用CDN。在CDN会给世界各地的访问,在这种情况下,谷歌的主机区域性数据中心。这意味着使用CDN的移动主机的文件从自己的服务器到一系列外部因素的责任。这也提供了一个优点,即如果访问者你的网页已经下载来自相同的CDN AngularJS副本,它不必被重新下载。
19 |
20 | > 在本教程中使用CDN版本库。
21 |
22 | ## 例子
23 |
24 | 现在让我们使用AngularJS库编写一个简单的例子。创建一个HTML文件 myfirstexample.html 如下:
25 |
26 | ```html
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
Welcome {{helloTo.title}} to the world of Yiibai!
35 |
36 |
43 |
44 |
45 | ```
46 |
47 | 下面的章节详细描述了上面的代码:
48 |
49 | ### 包括AngularJS
50 |
51 | 我们已经包含了AngularJS的JavaScript文件中的HTML页面,所以我们可以使用AngularJS:
52 |
53 | ```html
54 |
55 |
56 |
57 | ```
58 |
59 | 检查AngularJS的最新版本在其官方网站。
60 |
61 | ### 指向AngularJS应用
62 |
63 | 接下来,我们告诉一下HTML的一部分包含AngularJS应用。这可以通过将ng-app属性到AngularJS应用程序的根目录下的HTML元素。可以将它添加到HTML元素或body元素,如下所示:
64 |
65 | ```html
66 |
67 |
68 | ```
69 |
70 | ### 视图
71 |
72 | 这部分的视图:
73 |
74 | ```html
75 |
76 |
Welcome {{helloTo.title}} to the world of Yiibai!
77 |
78 | ```
79 |
80 | ng-controller 告诉AngularJS什么是控制器和视图。 helloTo.title告诉AngularJS编写名为helloTo.title的HTML在这个位置的“model”的值。
81 |
82 | ### 控制器
83 |
84 | 控制器的部分是:
85 |
86 | ```html
87 |
94 | ```
95 |
96 | 此代码先注册名为HelloController中的名为MyApp角模块控制器的功能。我们将学习更多有关在各自的章节[模块](http://www.yiibai.com/angularjs/angularjs_modules.html)和[控制器](http://www.yiibai.com/angularjs/angularjs_controllers.html)。控制器功能被登记在经由angular.module(...)的角。controller(...)函数调用。
97 |
98 | 传递给控制器函数的$scope参数模型。控制器功能增加了helloTo的JavaScript对象,该对象中加上一个标题字段。
99 |
100 | ### 执行
101 |
102 | 将以上代码保存为myfirstexample.htmll在任何浏览器中打开它。会看到如下的输出:
103 |
104 | 
105 |
106 |
107 |
108 | 当页面在浏览器中加载时,下面的事件发生:
109 |
110 | - HTML文档被加载到浏览器中,并且由浏览器进行计算。 AngularJS JavaScript文件被加载,角全局对象被创建。接下来,JavaScript的一个注册控制器功能被执行。
111 | - AngularJS通过HTML扫描,以寻找AngularJS应用程序和视图。一旦视图的找到,它连接了视图到对应的控制器函数。
112 | - 接下来AngularJS执行控制函数。然后,它呈现与填充控制器模型数据视图。页面现在已准备就绪。
113 |
114 |
--------------------------------------------------------------------------------
/前端/AngularJS/易百教程-AngularJS教程/4、AngularJS MVC体系结构.md:
--------------------------------------------------------------------------------
1 | 模型 - 视图 - 控制器或MVC,MVC是普遍的叫法,是一种软件设计模式,用于开发Web应用程序。模型- 视图 - 控制器模式是由以下三部分组成:
2 |
3 | - 模型/Model - 一个负责维护数据模式的最低水平。
4 | - 视图/View - 负责显示所有或数据到用户的部分。
5 | - 控制器/Controller - 软件代码控制Model和View之间的相互作用。
6 |
7 | MVC是受欢迎的,因为它隔离了应用逻辑从用户界面层和支持的关注点分离。这里的控制器接收用于该应用程序的所有请求,制备视图所需要的任何数据。视图,使用制备的控制器,产生一个最终像样的响应的数据。 MVC抽象可以用图形表示如下。
8 |
9 | 
10 |
11 | ## 模型 - model
12 |
13 | 模型是负责管理应用程序的数据。它响应来自视图的请求,同时也响应指令从控制器进行自我更新。
14 |
15 | ## 视图 - view
16 |
17 | 在一个特定的格式的演示数据,由控制器决定触发显示数据。它们是基于脚本的模板系统,如JSP,ASP,PHP,非常容易使用AJAX技术的集成。
18 |
19 | ## 控制器 - controller
20 |
21 | 控制器负责响应于用户输入并执行交互数据模型对象。控制器接收到输入,它验证输入,然后执行修改数据模型的状态的业务操作。
22 |
23 | AngularJS是一个MVC框架。在接下来的章节中,让我们看到了AngularJS如何使用MVC方法。
--------------------------------------------------------------------------------
/前端/BootStrap/BootStrap初步学习总结.md:
--------------------------------------------------------------------------------
1 | # 移动设备优先
2 |
3 | 移动设备优先是 Bootstrap 3 的最显著的变化。
4 |
5 | Bootstrap 3 的设计目标是移动设备优先,然后才是桌面设备。
6 |
7 | 为了让 Bootstrap 开发的网站对移动设备友好,确保适当的绘制和触屏缩放,需要在网页的 head 之中添加 **viewport meta** 标签,如下所示:
8 |
9 | ```html
10 |
11 | ```
12 |
13 | *`width`* 属性控制设备的宽度。假设网站将被带有不同屏幕分辨率的设备浏览,那么将它设置为 *device-width* 可以确保它能正确呈现在不同设备上。
14 |
15 | *`initial-scale=1.0`* 确保网页加载时,以 1:1 的比例呈现,不会有任何的缩放。
16 |
17 | 在移动设备浏览器上,通过为 **viewport meta** 标签添加 *`user-scalable=no`* 可以禁用其缩放(zooming)功能。
18 |
19 | 通常情况下,*`maximum-scale=1.0`* 与 `user-scalable=no` 一起使用。这样禁用缩放功能后,用户只能滚动屏幕,就能让您的网站看上去更像原生应用的感觉。
20 |
21 | 注意,这种方式我们并不推荐所有网站使用,还是要看您自己的情况而定!
22 |
23 | ```html
24 |
28 | ```
29 |
30 |
--------------------------------------------------------------------------------
/前端/BootStrap/BootStrap问题解决总结.md:
--------------------------------------------------------------------------------
1 | # 轮播区域会忽大忽小问题
2 |
3 | ```
4 | /*解决轮播区域图片大小不一致,导致的轮播区域会忽大忽小地变化。*/
5 | .carousel-inner > .item > img {
6 | min-width: 100%;
7 | height: 200px;
8 | }
9 | ```
10 |
11 | # BootstrapTable重新加载
12 |
13 | BootstrapTable需要彻底重新加载时重新init,但是发现仍旧无效,数据不刷新,解决方式:需要调用
14 |
15 | ```javascript
16 | //先销毁
17 | $("#resource_table").bootstrapTable('destroy');
18 |
19 | //再去初始化
20 | $('#bootstrap-table').bootstrapTable({
21 | url: options.url, // 请求后台的URL(*)
22 | contentType: "application/x-www-form-urlencoded", // 编码类型
23 | method: 'post', // 请求方式(*)
24 | cache: false, // 是否使用缓存
25 | // ...
26 | // ...
27 | });
28 | },
29 | ```
--------------------------------------------------------------------------------
/前端/CSS/1、CSS清除浮动的三种方式.md:
--------------------------------------------------------------------------------
1 | ### 1.添加新的元素 、应用 `clear:both`;
2 |
3 | ```css
4 | .clear{clear:both; height: 0; line-height: 0; font-size: 0}
5 |
6 |
1
7 |
2
8 |
3
9 |
10 |
11 | ```
12 |
13 | ### 2.父级div定义 `overflow: auto`(注意:是父级div也就是这里的 div.outer)
14 |
15 | ```html
16 | .over-flow{
17 | overflow: auto; zoom: 1; //zoom: 1; 是在处理兼容性问题
18 | }
19 |
20 |
1
21 |
2
22 |
3
23 |
24 | ```
25 |
26 | ### 3.`:after` 方法:(注意:作用于浮动元素的父亲)
27 |
28 | > 这种方法清除浮动是现在网上最拉风的一种清除浮动,是利用`:after`和`:before`来在元素内部插入两个元素块,从面达到清除浮动的效果。其实现原理类似于clear:both方法,只是区别在于:clear在html插入一个div.clear标签,而outer利用其伪类clear:after在元素内部增加一个类似于div.clear的效果。下面来看看其具体的使用方法:
29 |
30 | ```css
31 | #left {
32 | width: 200px;
33 | background: red;
34 | height: 300px;
35 | float: left;
36 | box-sizing: border-box;
37 | }
38 |
39 | #right {
40 | width: 800px;
41 | background: green;
42 | height: 200px;
43 | float: left;
44 | box-sizing: border-box;
45 |
46 | }
47 |
48 |
49 |
50 | .clearFix {zoom:1;} /*==for IE6/7*/
51 | .clearFix :after {
52 | clear:both;
53 | content:'.';
54 | display:block;
55 | width: 0;
56 | height: 0;
57 | visibility:hidden;
58 | }/*==for FF/chrome/opera/IE8==*/
59 | ```
60 |
61 | ```html
62 |
69 | ```
70 |
71 |
--------------------------------------------------------------------------------
/前端/ES6/1、ES6总结.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/ES6/1、ES6总结.md
--------------------------------------------------------------------------------
/前端/JavaScript/1、JavaScript判断字符串长度.md:
--------------------------------------------------------------------------------
1 | # 代码:
2 |
3 |
4 |
5 | ``` javascript
6 |
7 | //中文占用两个字符,英文占用一个字符
8 | String.prototype.gblen = function() {
9 | var len = 0;
10 | for (var i=0; i127 || this.charCodeAt(i)==94) {
12 | len += 2;
13 | } else {
14 | len ++;
15 | }
16 | }
17 | return len;
18 | };
19 | var str = "软件开发";
20 | var str_1 = "1234";
21 | console.log(str.gblen());
22 | console.log(str_1.gblen());
23 | ```
--------------------------------------------------------------------------------
/前端/JavaScript/2、JavaScript for循环的in和of.md:
--------------------------------------------------------------------------------
1 | ```javascript
2 | var obj = {name:"zhangsan",age:22};
3 |
4 | for(var item in obj){
5 | console.log(item);
6 | }
7 | // 输出:name age
8 |
9 |
10 | for(var item of obj){
11 | console.log(item);
12 | }
13 | // 输出:zhangsan 22
14 | ```
15 |
16 |
--------------------------------------------------------------------------------
/前端/LayUI/3、为Layui的Tab选项卡增加关闭当前、关闭其它操作.md:
--------------------------------------------------------------------------------
1 |
2 | # 特别说明,教程已更新,请移步:[此处](https://github.com/TangHanF/ProjectRecord/blob/master/%E5%89%8D%E7%AB%AF/LayUI/4%E3%80%81%E3%80%90%E6%9B%B4%E6%96%B0%E3%80%91%E4%B8%BALayui%E7%9A%84Tab%E9%80%89%E9%A1%B9%E5%8D%A1%E5%A2%9E%E5%8A%A0%E5%85%B3%E9%97%AD%E5%BD%93%E5%89%8D%E3%80%81%E5%85%B3%E9%97%AD%E5%85%B6%E5%AE%83%E6%93%8D%E4%BD%9C.md)
3 | ----
4 |
5 | - 首先管理端模板的话还是使用官方提供的,参考链接:[点此打开后台布局页面](http://www.layui.com/demo/layuiAdmin.html)
6 |
7 | - 以下我只列举出关键代码,各位根据实际情况拷贝到自己项目适当位置
8 | - 目前仅仅加入了:关闭当前、关闭所有,各位可以继续扩展,例如关闭左侧所有、关闭右侧所有、关闭其它,不是很难,循环判断即可。当然了,后面有时间我也会完善一下此功能
9 |
10 | # 效果图
11 | 
12 |
13 | ----------
14 | # HTML
15 | 首先在body里面插入以下一段html:
16 | ```html
17 |
21 | ```
22 | 我们暂且就实现两个功能吧,其它功能自行扩展即可。相关CSS样式请看下面《CSS样式》部分
23 |
24 | -------
25 |
26 | # JS
27 |
28 | ```javascript
29 | /**
30 | * 注册tab右键菜单点击事件
31 | */
32 | $(".rightmenu li").click(function () {
33 | if ($(this).attr("data-type") == "closethis") {
34 | var tabid = $("li[class='layui-this']").attr('lay-id');// 获取当前激活的选项卡ID
35 | tabDelete(tabid);
36 | } else if ($(this).attr("data-type") == "closeall") {
37 | var tabtitle = $(".layui-tab-title li");
38 | var ids = new Array();
39 | $.each(tabtitle, function (i) {
40 | ids[i] = $(this).attr("lay-id");
41 | })
42 | tabDeleteAll(ids);
43 | }
44 | $('.rightmenu').hide();
45 | })
46 | ```
47 | --------------------
48 | ```javascript
49 | tabDelete = function (id) {
50 | console.log("删除的TabID:"+id)
51 | element.tabDelete("你的Tab选项卡ID", id);//删除
52 | }
53 | tabDeleteAll = function (ids) {
54 | $.each(ids, function (i, item) {
55 | element.tabDelete("你的Tab选项卡ID", item);
56 | })
57 | }
58 | ```
59 | --------------------
60 | ```javascript
61 | // 点击空白处关闭右键弹窗
62 | $(document).click(function () {
63 | $('.rightmenu').hide();
64 | })
65 | ```
66 | ----------------
67 | ```javascript
68 | /**
69 | * 绑定右键菜单
70 | * @constructor
71 | */
72 | function CustomRightClick () {
73 | //屏蔽右键
74 | $('.layui-tab-title li').on('contextmenu', function () {
75 | return false;
76 | })
77 | $('.layui-tab-title,.layui-tab-title li').click(function () {
78 | $('.rightmenu').hide();
79 | });
80 | $('.layui-tab-title li').on('contextmenu', function (e) {
81 | var popupmenu = $(".rightmenu");
82 | l = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX;
83 | t = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY;
84 | popupmenu.css({left: l, top: t}).show();
85 | return false;
86 | });
87 | }
88 | ```
89 |
90 | -------
91 | # CSS样式
92 | ```css
93 |
120 | ```
121 |
122 |
123 | # 问题
124 | - 右击关闭暂时只能关闭当前已经激活的Tab,没法在任意一个Tab右击自动激活再去关闭,各位可优化一下
125 |
--------------------------------------------------------------------------------
/前端/LayUI/4、【更新】为Layui的Tab选项卡增加关闭当前、关闭其它操作.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | - 首先管理端模板的话还是使用官方提供的,参考链接:[点此打开后台布局页面](http://www.layui.com/demo/layuiAdmin.html)
4 |
5 | - 以下我只列举出关键代码,各位根据实际情况拷贝到自己项目适当位置
6 |
7 | - 相比上一篇教程([点击此处查阅](https://github.com/TangHanF/ProjectRecord/blob/master/%E5%89%8D%E7%AB%AF/LayUI/%E4%B8%BALayui%E7%9A%84Tab%E9%80%89%E9%A1%B9%E5%8D%A1%E5%A2%9E%E5%8A%A0%E5%85%B3%E9%97%AD%E5%BD%93%E5%89%8D%E3%80%81%E5%85%B3%E9%97%AD%E5%85%B6%E5%AE%83%E6%93%8D%E4%BD%9C.md))来说,此次除了:
8 | - 关闭当前
9 | - 关闭所有
10 |
11 | 之外,又新增了:
12 | - 关闭非当前
13 | - 关闭左侧所有
14 | - 关闭右侧所有
15 | - 取消
16 |
17 | 同时又对代码逻辑进行了优化处理。
18 |
19 | 你会发现关闭左侧所有、关闭右侧所有真的很简单,其实就是**把所有已打开的Tab的ID放入一个集合,而且我也能拿到当前激活的Tab的ID值,所以我不是通过遍历处理,而是想着截取数组的形式处理**。下面代码可以好好观察一下,顿时就简单多了
20 | # 效果图
21 | 
22 |
23 | ----------
24 | # HTML
25 | 首先在body里面适当位置处插入以下一段html:
26 | ``` html
27 |
36 | ```
37 | 相关CSS样式请看下面《CSS样式》部分
38 |
39 | -------
40 |
41 | # JS
42 |
43 | 请在适当位置加入以下代码:
44 |
45 | ``` javascript
46 | //屏蔽Tab选项卡的右键
47 | $('.layui-tab-title li').on('contextmenu', function () {
48 | return false;
49 | })
50 |
51 | /**
52 | * 注册tab右键菜单点击事件
53 | */
54 | $(".rightmenu li").click(function () {
55 | var currentActiveTabID = $("li[class='layui-this']").attr('lay-id');// 获取当前激活的选项卡ID
56 | var tabtitle = $(".layui-tab-title li");
57 | var allTabIDArr = [];
58 | $.each(tabtitle, function (i) {
59 | allTabIDArr[i] = $(this).attr("lay-id");
60 | })
61 |
62 | switch ($(this).attr("data-type")) {
63 | case "closethis"://关闭当前,如果开启了tab可关闭,实际意义不大
64 | tabDelete(currentActiveTabID);
65 | break;
66 | case "closeall"://关闭所有
67 | tabDeleteAll(allTabIDArr);
68 | break;
69 | case "closeothers"://关闭非当前
70 | $.each(allTabIDArr, function (i) {
71 | var tmpTabID = allTabIDArr[i];
72 | if (currentActiveTabID != tmpTabID)
73 | tabDelete(tmpTabID);
74 | })
75 | break;
76 | case "closeleft"://关闭左侧全部
77 | var index = allTabIDArr.indexOf(currentActiveTabID);
78 | tabDeleteAll(allTabIDArr.slice(0, index));
79 | break;
80 | case "closeright"://关闭右侧全部
81 | var index = allTabIDArr.indexOf(currentActiveTabID);
82 | tabDeleteAll(allTabIDArr.slice(index + 1));
83 | break;
84 | case "refresh":
85 | // 重新加载iFrame,实现更新。注意:如果你不是使用的iFrame则无效,具体刷新实现自行处理 //document.getElementById(currentActiveTabID).contentWindow.location.reload(true);//这种方式也可以,下面这个也可以
86 | refreshiFrame();
87 | break;
88 | default:
89 | $('.rightmenu').hide();
90 |
91 | }
92 | $('.rightmenu').hide();
93 | })
94 |
95 | /*
96 | *重新加载iFrame,实现更新
97 | */
98 | function refreshiFrame() {
99 | var $curFrame = $('iframe:visible');
100 | $curFrame.attr("src",$curFrame.attr("src"));
101 | return false;
102 | }
103 | ```
104 | --------------------
105 | ``` javascript
106 | tabDelete = function (id) {
107 | console.log("删除的TabID:"+id)
108 | element.tabDelete("你的Tab选项卡ID", id);//删除
109 | }
110 | tabDeleteAll = function (ids) {
111 | $.each(ids, function (i, item) {
112 | element.tabDelete("你的Tab选项卡ID", item);
113 | })
114 | }
115 | ```
116 |
117 | > 注意:
118 | >
119 | > - 以上的“element”为LayUI的“element”模块,引入:
120 | >
121 | > ```javascript
122 | > layui.use(["element"],function(){
123 | > var element = layui.element;
124 | > // .....
125 | > })
126 | > ```
127 | >
128 | >
129 | >
130 | > - “你的Tab选项卡ID”:是指你在页面添加的LayUI的选项卡指定的“lay-filter”,例如:
131 | >
132 | > ```html
133 | >
134 | >
135 | >
136 | >
137 | >
138 | >
139 | >
140 | >
143 | >
144 | >
145 | >
146 | >
147 | >
148 | >
149 | >
150 | > ```
151 |
152 | --------------------
153 |
154 | ``` javascript
155 | // 点击空白处关闭右键弹窗
156 | $(document).click(function () {
157 | $('.rightmenu').hide();
158 | })
159 | ```
160 | ----------------
161 |
162 | ``` javascript
163 | /**
164 | * 注册并绑定右键菜单
165 | * @constructor
166 | */
167 | function CustomRightClick () {
168 | //屏蔽Tab右键菜单
169 | $('.layui-tab-title li').on('contextmenu', function () {
170 | return false;
171 | })
172 | $('.layui-tab-title,.layui-tab-title li').click(function () {
173 | $('.rightmenu').hide();
174 | });
175 | $('.layui-tab-title li').on('contextmenu', function (e) {
176 | var popupmenu = $(".rightmenu");
177 | l = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX;
178 | t = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY;
179 | popupmenu.css({left: l, top: t}).show();
180 | return false;
181 | });
182 | }
183 | ```
184 |
185 | > CustomRightClick()方法实现在右键时弹出菜单,方法的具体调用位置请根据实际情况确定,例如在页面渲染完成之后调用该方法。
186 |
187 | -------
188 | # CSS样式
189 | ``` css
190 |
217 | ```
218 |
219 |
220 | # 问题
221 | - 右击关闭暂时只能关闭当前已经激活的Tab,没法在任意一个Tab右击自动激活再去关闭,各位可优化一下
--------------------------------------------------------------------------------
/前端/LayUI/img/tab右键菜单.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/tab右键菜单.png
--------------------------------------------------------------------------------
/前端/LayUI/img/tab右键菜单2.0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/tab右键菜单2.0.png
--------------------------------------------------------------------------------
/前端/LayUI/img/that1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/that1.png
--------------------------------------------------------------------------------
/前端/LayUI/img/that_nextAll.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/that_nextAll.png
--------------------------------------------------------------------------------
/前端/LayUI/img/多表头表格.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/多表头表格.png
--------------------------------------------------------------------------------
/前端/LayUI/img/对符合条件的行进行高亮显示.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/对符合条件的行进行高亮显示.gif
--------------------------------------------------------------------------------
/前端/LayUI/img/文件选择上传.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/文件选择上传.gif
--------------------------------------------------------------------------------
/前端/LayUI/img/获取行数据.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/获取行数据.gif
--------------------------------------------------------------------------------
/前端/LayUI/img/行高亮效果.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/行高亮效果.png
--------------------------------------------------------------------------------
/前端/LayUI/img/行高亮效果_最终.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/行高亮效果_最终.png
--------------------------------------------------------------------------------
/前端/LayUI/img/隐藏列.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/前端/LayUI/img/隐藏列.gif
--------------------------------------------------------------------------------
/前端/Vue/1、Vue内容.md:
--------------------------------------------------------------------------------
1 | # 待完善....
--------------------------------------------------------------------------------
/前端/WebPack/2、【可行】vue-cli+webpack在生成的项目中使用bootstrap的方法.md:
--------------------------------------------------------------------------------
1 | 在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行。那么在一个用vue-vli生成的前端项目中如何加入?因为框架不一样了,略微要适应一下
2 |
3 | 第一步:**脚手架生成项目**
4 |
5 | 执行命令用webpack模板生成一个名为vuestrap的项目(名字任意)
6 |
7 | vue init webpack vuestrap
8 |
9 | 在出现的各提示选项中(这些选项都随意)。
10 |
11 | ? Project name vuestrap
12 | ? Project description A Vue.js project
13 | ? Author SmileHong0121
14 | ? Vue build standalone
15 | ? Install vue-router? Yes
16 | ? Use ESLint to lint your code? Yes
17 | ? Pick an ESLint preset Standard
18 | ? Setup unit tests with Karma + Mocha? No
19 | ? Setup e2e tests with Nightwatch? No
20 |
21 | 选项选完,项目也就生成了,执行命令,安装脚手架创建的组件
22 |
23 | npm install
24 |
25 | 第二步:**安装jquery**
26 |
27 | bootstrap是依赖jquery的,所以就先装上jquery,这里用的版本是1.11.3。
28 |
29 | 稍后在配置的时候,是以webpack插件的方式进行打包,所以这里直接用npm进行安装,因为插件方式打包的组件都是require进来的。
30 |
31 | 执行命令,并保存到package.json中
32 |
33 | npm install jquery@1.11.3 --save-dev
34 |
35 | 注:如果想查看npm上jquery有哪些版本,可以执行命令:
36 |
37 | npm view jquery versions
38 |
39 | 第三步:安装Bootstrap
40 |
41 | 这里用的版本是3.3.0。执行命令,即可安装完成
42 |
43 | npm install bootstrap@3.3.0 --save-dev
44 |
45 | 第四步:**配置jquery**
46 |
47 | 将jquery以插件打包,需要为webpack的plugins进行插件设置。
48 |
49 | 在build/webpack.base.conf.js文件中,在整个配置对象的末尾增加plugins配置。
50 |
51 | 在webpack.base.conf.js中的配置项,可以在dev和build出来的pro版本中都有效。
52 |
53 | 下面的配置其实就是变量名的真正指向设置,这样,在页面中对jquery的各种名字的调用就会有效,否则bootstrap跑不起来。
54 |
55 | 在这个文件顶部先引入webpack
56 |
57 | var webpack=require('webpack');
58 |
59 | 
60 |
61 | []( "复制代码")
62 |
63 | plugins: [ new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "windows.jQuery": "jquery" }) ],
64 |
65 | []( "复制代码")
66 |
67 | 
68 |
69 | 第五步:**引用bootstrap**
70 |
71 | 在src/main.js文件的顶部加入如下对bootstrap主要文件的引用,注意这里的路径,不在是从src/assets加载,而是换成了从node_modules加载。
72 |
73 | import 'bootstrap/dist/css/bootstrap.min.css' import 'bootstrap/dist/js/bootstrap.min.js'
74 |
75 | 
76 |
77 | 第六步:**配置bootstrap**
78 |
79 | 因为bootstrap除了js和css文件外,还有字体文件需要一并打包,默认生成的webpack.base.conf.js中的moudle->rules设定中都已经包含对字体文件的打包设置,所以无需修改,很人性啊。
80 |
81 | 第七步:**验证页面**
82 |
83 | 就在App.vue中写一个页面,放一个panel,button,modal。
84 |
85 | []( "复制代码")
86 |
87 | ```html
88 |
89 |
90 |
91 |
92 |
93 |
demo
94 |
95 |
96 |
97 |
98 |
99 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
117 |
...
118 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
141 | ```
142 |
143 | []( "复制代码")
144 |
145 | 写完后,执行命令,运行效果。
146 |
147 | npm run dev
148 |
149 | 
--------------------------------------------------------------------------------
/前端/WebPack/3、Webpack 3.x 通过PurifyCSS Plugin按需加载bootstrap css样式.md:
--------------------------------------------------------------------------------
1 | 之前通过webpack把bootstrap css 样式引入到模板中,但是注意到的是把全部bootstrap css样式加载进来,但是当前的template中只有简单的些button/div/img/h1/等,而且这些元素只用到了一小部分样式,没有必要把全部的样式都加载进模板,所以需要改进,怎么办呢,PurifyCSS Plugin可以做到只加载当前页面所需要的样式。
2 | 先安装:
3 |
4 | ```
5 | npm i -D purifycss-webpack purify-css
6 | ```
7 |
8 | 安装完成后当前版本是:
9 |
10 | ```
11 | "purify-css": "^1.2.5",
12 | "purifycss-webpack": "^0.7.0"
13 | ```
14 |
15 | 接下来去webpack.config.js中去配置:
16 |
17 | ```javascript
18 | const glob = require('glob');
19 | const PurifyCSSPlugin = require('purifycss-webpack');
20 | ```
21 |
22 | 再把purifyCSSPlugin添加到plugins对象中:
23 |
24 | ```javascript
25 | new PurifyCSSPlugin({
26 | // Give paths to parse for rules. These should be absolute!
27 | paths: glob.sync(path.join(__dirname, './src/*.html')),
28 | }) //src目录下的所有html模板都会被影响
29 | ```
30 |
31 | 之前没有优化前的bootstrap.css的大小是121KB:
32 |
33 | 
34 |
35 | 优化完之后是11KB:
36 |
37 | 
38 |
39 | 打开之后也可以看到它里面也只包含了当前页面元素的css样式。假如现在在模板中加入一个dropdwon:
40 |
41 | ```html
42 |
43 |
46 |
51 |
52 |
53 | ```
54 |
55 | 从编译后bootstrap.css中可以看到关于dropdown的样式也被加载进来,也就是它会根据页面中实际的元素来加载相对应的css样式。
--------------------------------------------------------------------------------
/前端/WebPack/问题解决/1、Component template should contain exactly one root.md:
--------------------------------------------------------------------------------
1 | Component template should contain exactly one root
2 |
3 | 组件模板应该只包含一个根
4 |
5 | 如下代码是错误的,会提示以上错误,需要添加一个根元素:
6 |
7 | ```html
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | ```
20 |
21 | 需要修改为:
22 |
23 | ```html
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | ```
38 |
39 | 可参考Vue说明:[单个根元素](https://cn.vuejs.org/v2/guide/components.html#%E5%8D%95%E4%B8%AA%E6%A0%B9%E5%85%83%E7%B4%A0)
--------------------------------------------------------------------------------
/前端/WebPack/问题解决/2、npm run build 打包后,如何运行在本地查看效果.md:
--------------------------------------------------------------------------------
1 | 目前,使用vue-cli脚手架写了一个前端项目,之前一直是使用npm run dev 在8080端口上进行本地调试。项目已经进行一半了,今天有时间突然想使用npm run build进行上线打包,试试能否成功看到我的项目效果。一开始是毫无头绪,什么都不懂,直接是就在命令行上敲下:npm run build命令。
2 |
3 | 
4 |
5 | 好开心啊,竟然没有报错。以为就这么简单的成功了,在浏览器上输入:http://localhost/MGT/learnVuex/dist/index.html,一片空白。果然没有那么顺利。打开控制,看到Console下出现了很多错误。
6 |
7 | 
8 |
9 | 错误看不懂,(捂脸)只好百度了。
10 |
11 | 我们一开始运行npm run build 命令时,有这么一段提示:
12 |
13 | 
14 |
15 | 这段话的意思就是说:构建文件务必放在一个`HTTP`服务器。直接打开`index.html`文件将不工作。
16 |
17 | 看到提示还是要好好看的,这毛病要改呀!
18 |
19 | 那么问题来了,怎么解决呢?
20 |
21 | 我们知道打包的命令文件是config/build.js
22 |
23 | 
24 |
25 | 到项目目录下的`config`文件夹里的`index.js`文件中,将`build`对象下的`assetsPublicPath`中的`“/”`,改为`“./”`即可,就在前面加个点就可以了,
26 |
27 | 
28 |
29 | 现在再重新打包一次 `npm run build`,刷新你的页面,就可以看到啦
30 |
31 | 
32 |
33 | 在这之前有一个前提条件,那就是电脑上要安装服务器。只要你的服务器上有支持http或者https的服务器软件就可以,我知道的有nginx和apache两种,只要安装了两个中的一个,并且配合好访问路径,把你生成的文件放到服务器下或者映射路径下,启动你的服务器软件即可,然后就可以使用你配置的路径访问项目。
34 |
35 | 我在浏览器上直接是输入localhost,打开文件目录的,http://localhost/MGT/learnVuex/dist/index.html,这么文件到底是在哪个盘下面呢?
36 |
37 | 我在电脑上上安装了一个XAMPP,并把apache的映射路径设置为:E:/project,而我的项目文件就放在E:/project目录下面 这就是我的:E:\\project\\MGT\\learnVuex\\dist。
38 |
39 | 所以在浏览器上输入:localhost,就是打开E:/project,就可以看到这目录下的所以项目文件啦。
--------------------------------------------------------------------------------
/前端/WebPack/问题解决/3、vue-cli项目webpack打包后iconfont文件路径问题解决.md:
--------------------------------------------------------------------------------
1 | 在使用vue-cli创建vue项目时,可以自动生成webpack文件。使用
2 |
3 | ```
4 | npm run build
5 |
6 | * 1
7 |
8 | ```
9 |
10 | 即可打包发布生产文件,打包后的文件
11 | 
12 | 可以看到使用url-loader处理后的文件是在static目录下生成fonts目录下的文件。全部样式文件打包在css目录下app.hash.css文件中。
13 | 但我们会发现发布后,会存在字体文件找不到的问题,查看css文件发现是iconfont字体文件的路径引用问题。
14 | 
15 |
16 | 解决方法:
17 | 在build/utils文件中的下图所示位置添加../../公共路径
18 | 
19 | 这样打包的iconfont字体文件路径时就会加上../../了。引用就没问题了。而不再需要手动更改css文件中的路径。
20 | 
--------------------------------------------------------------------------------
/前端/WebPack/问题解决/4、WebPack打包时对于部分字体放置问题.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | 处理:
4 |
5 | 
--------------------------------------------------------------------------------
/前端/iView/1、iView组件映射.md:
--------------------------------------------------------------------------------
1 | 在非 template/render 模式下(例如使用 CDN 引用时),组件名要分隔,例如 `DatePicker` 必须要写成 `date-picker`。
2 |
3 | 以下组件,在所有模式下,必须加前缀 `i-`,除非使用 [iview-loader](https://www.iviewui.com/docs/guide/iview-loader):
4 |
5 | - Switch: `i-switch`
6 | - Circle: `i-circle`
7 |
8 | -------
9 |
10 |
11 |
12 | | template/render 模式 | 非 template/render 模式 |
13 | | :------------------: | :---------------------: |
14 | | Button | i-button |
15 | | Col | i-col |
16 | | Table | i-table |
17 | | Input | i-input |
18 | | Form | i-form |
19 | | Menu | i-menu |
20 | | Select | i-select |
21 | | Option | i-option |
22 | | Progress | i-progress |
23 | | Time | i-time |
24 | | Dropdown | Dropdown |
25 | | DropdownMenu | dropdown-menu |
26 | | Tabs | Tabs |
27 | | TabPane | tab-pane |
28 | | Split | Split |
29 | | | |
30 |
31 |
--------------------------------------------------------------------------------
/前端/jQuery/问题解决记录/jQuery版本问题导致出现【easyui Cannot read property 'msie' of undefined】报错.md:
--------------------------------------------------------------------------------
1 | ## 报错信息
2 | > easyui Cannot read property 'msie' of undefined
3 |
4 | ## 错误分析
5 | > `$.browser`的api从jQuery1.9开始就正式废除,js代码里只要用到`$.browser`就会报这个错
6 |
7 | ## 解决方案
8 |
9 | ### 方案一:使用`jQuery Migrate`插件
10 | 该插件能够自动恢复那些在最新版本之后被废弃的API,从而让已有的js应用层代码无须改动就能和最新的jQuery库一起正常运行
11 |
12 | [点击此处下载jQuery Migrate插件(右击另存即可)](http://code.jquery.com/jquery-migrate-1.2.1.js)
13 |
14 | **下载完成之后在引用jQuery js的地方之后加上一行对jQuery Migrate js文件的引用即可**,例如:
15 | ``` html
16 |
17 |
18 | ```
19 |
20 | ### 方案二:加入代码
21 |
22 | > 注意,以下代码的加载顺序在jQuery文件之后,$.browser的代码之前
23 |
24 | ``` javascript
25 | jQuery.browser = {};
26 | (function() {
27 | jQuery.browser.msie = false;
28 | jQuery.browser.version = 0;
29 | if (navigator.userAgent.match(/MSIE ([0-9]+)./)) {
30 | jQuery.browser.msie = true;
31 | jQuery.browser.version = RegExp.$1;
32 | }
33 | })();
34 |
35 | ```
--------------------------------------------------------------------------------
/操作系统相关/Android/1、adb使用总结.md:
--------------------------------------------------------------------------------
1 | #### 前言
2 |
3 | > ADB是android debug bridge的缩写,负责计算机与Android设备的几乎所有通信和协作,可以认为是连接两者的桥梁。
4 |
5 | #### ADB源码
6 |
7 | 用了那么久的adb,你知道adb源码在哪里吗?那你又有看过看过adb源码吗?
8 |
9 | 没关系,链接如下:
10 | http://androidxref.com/8.0.0_r4/xref/system/core/adb/
11 |
12 | #### ADB命令分类
13 |
14 | 详细使用可查看:
15 | http://adbshell.com/commands/adb-forward
16 |
17 | **ADB Debugging**
18 |
19 | - adb devices
20 | - adb forward
21 | - adb kill-server
22 |
23 | **Package Manger**
24 |
25 | - adb install
26 | - adb uninstall
27 | - adb shell pm list packages
28 | - adb shell pm path
29 | - adb shell pm clear
30 |
31 | **Wireless**
32 |
33 | - adb connect
34 | - adb usb
35 |
36 | **File Manager**
37 |
38 | - adb pull
39 | - adb push
40 | - adb shell ls
41 | - adb shell cd
42 | - adb shell rm
43 | - adb shell mkdir
44 | - adb shell touch
45 | - adb shell pwd
46 | - adb shell cp
47 | - adb shell mv
48 |
49 | **Network**
50 |
51 | - adb shell netstat
52 | - adb shell ping
53 | - adb shell netcfg
54 | - adb shell ip
55 |
56 | **Logcat**
57 |
58 | - adb logcat
59 | - adb shell dumpsys
60 | - adb shell dumpstate
61 |
62 | **Screenshot**
63 |
64 | - adb shell screencap
65 | - adb shell screenrecord [4.4+]
66 |
67 | **System**
68 |
69 | - adb root
70 | - adb sideload
71 | - adb shell ps
72 | - adb shell top
73 | - adb shell getprop
74 | - adb shell setprop
75 |
76 | #### ADB命令的常见使用场景
77 |
78 | ##### 01
79 |
80 | 某日产品经理小李找到你说:“小王,给我来几张我们的APP截图。” ,只听见小王麻溜敲打着键盘,使用`adb shell screencap /sdcard/xiaoli/001.png`和`adb pull /sdcard/xiaoli/001.png`。
81 |
82 | 在这个场景里小王使用到`adb shell screencap` **截屏**和`adb pull` **文件传输**两个命令。
83 |
84 | ##### 02
85 |
86 | 我们的APP要上线了,但是因为项目十分庞大,说不准我们的小王写的代码没有把Log关闭,怎么办呢?来吧,在命令行里看一下
87 |
88 | ```
89 | adb logcat | grep com.xxx.xxx
90 | ```
91 |
92 | 接下来你就在APP里乱点把,看看有没有一些尚未关闭的Log。
93 |
94 | 在Android逆向工程中,我们也可以通过这种方式,利用那些大意而留下来的Log信息进行相关的逻辑分析。
95 |
96 | ##### 03
97 |
98 | 某日,那个叫做小李的产品经理又找到你说:“小王,你帮我在电脑上下载了一个APP装到手机上”
99 |
100 | 二话不说,小王下载好app使用`adb install xxx.apk`进行安装。
101 |
102 | But,出问题了,需要指定手机。原来,小王的电脑上连接了两个手机。
103 |
104 | `adb devices`大显身手,原来小李的手机编号是"Sx1xxx2xxxx"。
105 |
106 | 接下来,小王使用`adb -s Sx1xxx2xxxx install xxx.apk`
107 |
108 | ##### 04
109 |
110 | 短平快的教你通过局域网WIFI连接手机。
111 |
112 | - 前提需要USB连接手机。
113 | - adb tcpip 5555
114 | - adb connect #.#.#.#(你手机的IP地址)
115 | - 拔掉USB,你已经成功通过WIFI连接了。(其实背后是通过TCP协议来实现的)
116 |
117 | --------
118 |
119 | 安装APK
120 | `adb install xxx.apk`
121 |
122 | 清除已经安装的APK并安装新的APK
123 | `adb install -r test.apk`
124 |
125 | 卸载APK
126 | `adb uninstall package_name`
127 |
128 | 清除指定APP的缓存
129 | `adb shell pm clear package_name`
130 |
131 | 输出指定包名APP的安装位置
132 | `adb shell pm path package_name`
133 |
134 | 输出手机中所有的包名
135 | `adb shell pm list packages`
136 |
137 | 查看指定包名的内存信息
138 | `adb shell dumpsys meminfo package_name`
--------------------------------------------------------------------------------
/操作系统相关/Mac/AppleScript/AppleScript总结.md:
--------------------------------------------------------------------------------
1 | # 清空垃圾桶
2 |
3 | ```
4 | tell application "Finder"
5 | empty the trash
6 | end tell
7 | ```
8 |
9 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac Linux命令总结.md:
--------------------------------------------------------------------------------
1 | # 查看某个端口运行的程序
2 |
3 | > lsof -i :端口号
4 |
5 | `-i`参数表示网络链接,该命令会同时列出PID,然后配合`kill -9 PID`值结束程序即可
6 |
7 | 
8 |
9 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/ Mac Navicat12破解.md:
--------------------------------------------------------------------------------
1 | 第一步:这部分暂时存到文本编辑器中
2 |
3 | 公钥:
4 |
5 | > -----BEGIN PUBLIC KEY-----
6 | > MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQB8vXG0ImYhLHvHhpi5FS3g
7 | > d2QhxSQiU6dQ04F1OHB0yRRQ3NXF5py2NNDw962i4WP1zpUOHh94/mg/KA8KHNJX
8 | > HtQVLXMRms+chomsQCwkDi2jbgUa4jRFN/6N3QejJ42jHasY3MJfALcnHCY3KDEF
9 | > h0N89FV4yGLyDLr+TLqpRecg9pkPnOp++UTSsxz/e0ONlPYrra/DiaBjsleAESZS
10 | > I69sPD9xZRt+EciXVQfybI/2SYeAdXMm1B7tHCcFlOxeUgqYV03VEqiC0jVMwRCd
11 | > +03NU3wvEmLBvGOmNGudocWIF/y3VOqyW1byXFLeZxl7s+Y/SthxOYXzu3mF+2/p
12 | > AgMBAAE=
13 | > -----END PUBLIC KEY-----
14 |
15 | 私钥:
16 |
17 | > -----BEGIN RSA PRIVATE KEY-----
18 | > MIIEogIBAAKCAQB8vXG0ImYhLHvHhpi5FS3gd2QhxSQiU6dQ04F1OHB0yRRQ3NXF
19 | > 5py2NNDw962i4WP1zpUOHh94/mg/KA8KHNJXHtQVLXMRms+chomsQCwkDi2jbgUa
20 | > 4jRFN/6N3QejJ42jHasY3MJfALcnHCY3KDEFh0N89FV4yGLyDLr+TLqpRecg9pkP
21 | > nOp++UTSsxz/e0ONlPYrra/DiaBjsleAESZSI69sPD9xZRt+EciXVQfybI/2SYeA
22 | > dXMm1B7tHCcFlOxeUgqYV03VEqiC0jVMwRCd+03NU3wvEmLBvGOmNGudocWIF/y3
23 | > VOqyW1byXFLeZxl7s+Y/SthxOYXzu3mF+2/pAgMBAAECggEAK5qZbYt8wenn1uZg
24 | > 6onRwJ5bfUaJjApL+YAFx/ETtm83z9ByVbx4WWT7CNC7fK1nINy20/mJrOTZkgIx
25 | > x6otiNC4+DIsACJqol+RLoo8I9pk77Ucybn65ZteOz7hVZIU+8j6LzW0KDt6yowX
26 | > e75r7G/NEpfibNc3Zz81+oDd2x+bHyGbzc9QcePIVuEzkof6jgpbWrQZU14itx9l
27 | > VxEgj/fbMccvBx8brR/l9ClmDZd9Y6TWsF1rfJpF3+DPeqFkKCiD7PGz3bs4O/Zd
28 | > ZrfV21ZNVusBW49G6bU63gQVKsOf1qGo3efbAW1HVxgTQ/lExVdcMvdenZm+ADKp
29 | > L4/wUQKBgQDOfBjn3OC2IerUFu18EgCS7pSjTSibXw+TeX3D5zwszLC091G2rGlT
30 | > 5DihBUhMfesNdpoZynrs4YB6Sz9C3wSGAB8AM/tNvPhtSVtbMHmrdT2DEEKCvLkO
31 | > RNBnt+8aTu2hGRanw9aL1189gzwrmXK5ZuuURfgLrB9ihrvjo4VznQKBgQCapx13
32 | > dEA1MwapBiIa3k8hVBCoGPsEPWqM33RBdUqUsP33f9/PCx00j/akwmjgQNnBlAJo
33 | > Y7LOqPCyiwOkEf40T4IlHdzYntWQQvHhfBwqSgdkTE9tKj43Ddr7JVFRL6yMSbW3
34 | > 9qAp5UX/+VzOLGAlfzJ8CBnkXwGrnKPCVbnZvQKBgQCd+iof80jlcCu3GteVrjxM
35 | > LkcAbb8cqG1FWpVTNe4/JFgqDHKzPVPUgG6nG2CGTWxxv4UFKHpGE/11E28SHYjb
36 | > cOpHAH5LqsGy84X2za649JkcVmtclUFMXm/Ietxvl2WNdKF1t4rFMQFIEckOXnd8
37 | > y/Z/Wcz+OTFF82l7L5ehrQKBgFXl9m7v6e3ijpN5LZ5A1jDL0Yicf2fmePUP9DGb
38 | > ZTZbbGR46SXFpY4ZXEQ9GyVbv9dOT1wN7DXvDeoNXpNVzxzdAIt/H7hN2I8NL+4v
39 | > EjHG9n4WCJO4v9+yWWvfWWA/m5Y8JqusV1+N0iiQJ6T4btrE4JSVp1P6FSJtmWOK
40 | > W/T9AoGAcMhPMCL+N+AvWcYt4Y4mhelvDG8e/Jj4U+lwS3g7YmuQuYx7h5tjrS33
41 | > w4o20g/3XudPMJHhA3z+d8b3GaVM3ZtcRM3+Rvk+zSOcGSwn3yDy4NYlv9bdUj/4
42 | > H+aU1Qu1ZYojFM1Gmbe4HeYDOzRsJ5BhNrrV12h27JWkiRJ4F/Q=
43 | > -----END RSA PRIVATE KEY-----
44 |
45 | 第二步:安装navicat
46 |
47 | 
48 |
49 | 第三步:finder中,右键navicat ,打开目录 `/Contents/Resources`,编辑rpk文件,用第一步的公钥替换并保存。
50 |
51 | 
52 |
53 | 
54 |
55 | 
56 |
57 | 
58 |
59 | 
60 |
61 | 第四步:断网。
62 |
63 | 第五步:打开navicat, 根据navicat输入以下序列号:
64 |
65 | 中文版64位密钥序列号: `NAVH-T4PX-WT8W-QBL5`
66 |
67 | 英文版64位密钥序列号: NAVG-UJ8Z-EVAP-JAUW
68 |
69 | 如果出现下图,下面的两行文字,和右边的 ✔️,那么恭喜你,可以继续往下进行了。如果右边是黑色的❌,那么请从第一步再来一遍。
70 |
71 | 
72 |
73 | 第六步:由于断了网,则会出现如下内容,点击手动激活
74 |
75 | 
76 |
77 | 第七步:将以下请求码复制
78 |
79 | 
80 |
81 | 第八步:
82 |
83 | 登录这个网址 http://tool.chacuo.net/cryptrsaprikey , 填上第一步的私钥,填上请求码,点击RSA私钥解密。
84 |
85 | 请注意:如果没出现请求码明文可能是 1:网络问题,请多试几次
86 |
87 | 2:请检查第三部rpk文件是否替换成功!
88 |
89 | 
90 |
91 | 第九步:
92 |
93 | 将请求码明文中的 K和DI的值替换到下面对应的地方,
94 |
95 | `{"K":"NAVHT4PXWT8WQBL5", "N":"52pojie", "O":"52pojie.cn", "DI":"ODQ2Yjg2ZDBjMTEzMjhh", "T":1516939200}`
96 |
97 | 再登录 https://unixtime.51240.com/
98 |
99 | 如下图所示,调整到现在的时间,并把Unix时间戳替换到上面的T后面,
100 |
101 | 
102 |
103 | 第十步:
104 |
105 | 将替换好的文本,放入第二个框中,点击RSA加密,得到加密后的文本
106 |
107 | 
108 |
109 | 第十一步:
110 |
111 | 输入并点击激活。
112 |
113 | 
114 |
115 | 终于大功告成了,
116 |
117 | 写这篇博客的目的就是希望大家少走弯路!!!!!
118 |
119 | 我特么的今天不知道浏览了多少个网站,下了多少个疑似病毒的软件,
120 |
121 | 特别是有的垃圾网站还口口声声说破解版,虽然我一看就知道是假的,但是还是抱着试试的心态,可还是失败了,就这样我依然坚信着奇迹!
122 |
123 | 终于,navicat被我破解了,上一张成功的图
124 |
125 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/IINA播放器.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 参考地址: https://www.zhihu.com/question/20957741
6 |
7 |
8 |
9 |
10 |
11 | 其实 IINA 有浏览器插件(Safari 和 Chrome 都有)可以支持在视频网页跳转到 IINA 播放。
12 |
13 | <img src="https://pic2.zhimg.com/50/v2-a0fac1d5ed2692e12dd59578ddb5e421_hd.jpg" data-caption="" data-rawwidth="1120" data-rawheight="680" class="origin_image zh-lightbox-thumb" width="1120" data-original="https://pic2.zhimg.com/v2-a0fac1d5ed2692e12dd59578ddb5e421_r.jpg">
14 |
15 | **效果如下:**
16 |
17 | 下载并安装后,可以把它的图标放在 Safari 的工具栏中,在优酷等视频网页点击就可跳转。
18 |
19 | <img src="https://pic4.zhimg.com/50/v2-a015dd3e93cfb489998cd2a352abf41f_hd.jpg" data-caption="" data-rawwidth="2778" data-rawheight="64" class="origin_image zh-lightbox-thumb" width="2778" data-original="https://pic4.zhimg.com/v2-a015dd3e93cfb489998cd2a352abf41f_r.jpg">
20 |
21 | <img src="https://pic4.zhimg.com/50/v2-1af0526a8855c681a032e82effc67f96_hd.jpg" data-caption="" data-rawwidth="2698" data-rawheight="1218" class="origin_image zh-lightbox-thumb" width="2698" data-original="https://pic4.zhimg.com/v2-1af0526a8855c681a032e82effc67f96_r.jpg">
22 |
23 | 在 Chrome 中也是类似的。
24 |
25 | **下载地址:**
26 |
27 | 1. [IINA 官网](https://link.zhihu.com/?target=https%3A//lhc70000.github.io/iina/)可以下载客户端。
28 | 2. [这里是 Open In IINA 的 Safari 插件的下载地址](https://link.zhihu.com/?target=https%3A//github.com/lhc70000/iina/releases/download/v0.0.5/Open_In_IINA.safariextz)。
29 | 3. [这里是 Open In IINA 的 Chrome 扩展程序的下载地址](https://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/open-in-iina/pdnojahnhpgmdhjdhgphgdcecehkbhfo%3Fhl%3Den)。(安装扩展程序需 VPN)
30 |
31 | **参考资料:**
32 |
33 | 1. 关于 IINA 的特性可以参考:[macOS 上最好的现代视频播放器:IINA](https://link.zhihu.com/?target=https%3A//sspai.com/post/40870)。
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/Mac MySql的root密码重置.md:
--------------------------------------------------------------------------------
1 | 停止MySQL的服务,打开系统的偏好设置,找到MySQL 进去后,点击Stop MySQL Server即可。
2 |
3 | 
4 |
5 | 开启两个终端,在第一个终端输入`sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables`,输入当前用户的密码,如下图所示
6 |
7 | 
8 |
9 | 然后在第二个终端输入`sudo /usr/local/mysql/bin/mysql -u root`,然后输入当前用户的密码后,出现以下的界面
10 |
11 | 
12 |
13 | 然后输入命令`UPDATE mysql.user SET authentication_string=PASSWORD('新密码') WHERE User='root';`回车,出现以下的界面,说明修改成功。
14 |
15 | 
16 |
17 | 接下来输入`FLUSH PRIVILEGES;`回车,出现下面的界面
18 |
19 | 
20 |
21 | 最后,输入`\q`,退出。关闭第一个终端,回到系统的偏好设置,重新开启MySQL即可。
22 |
23 | 
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/Mac 安装NodeJS.md:
--------------------------------------------------------------------------------
1 | # Mac下安装NodeJS
2 |
3 | 下载地址:
4 |
5 | [node.js官网](https://nodejs.org/en/download/)
6 |
7 | 下载完成pkg文件并一步一步安装完成之后输入以下命令检查是否安装成功:
8 |
9 | This package will install:
10 | • Node.js v8.11.2 to /usr/local/bin/node
11 | • npm v5.6.0 to /usr/local/bin/npm
12 |
13 | > node -v
14 |
15 | > npm -v
16 |
17 | 然后在Finder中打开用户目录(就是Mac管理员,点开侧栏打开目录,创建一个Js文件,取名helloworld.js就可以,在js文件中输入这些内容)
18 |
19 | ```javascript
20 | const http = require('http');
21 | const hostname = '127.0.0.1';
22 | const port = 1337;
23 |
24 | http.createServer((req, res) => {
25 | res.writeHead(200, { 'Content-Type': 'text/plain' });
26 | res.end('Hello World\n');
27 | }).listen(port, hostname, () => {
28 | console.log(Server running at http://${hostname}:${port}/);
29 | });
30 |
31 | ```
32 |
33 |
34 |
35 | 保存成功之后,打开终端
36 |
37 | 输入 node helloworld.js得到
38 |
39 | 
40 |
41 | 然后把下面的ip地址复制到浏览器打开
42 |
43 | 
44 |
45 |
46 |
47 | *这就配置成功了*
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/Mac 安装adb 以及基本的命令.md:
--------------------------------------------------------------------------------
1 | # Mac 安装adb 以及基本的命令
2 |
3 | - 安装adb
4 | - adb命令
5 |
6 | ------
7 |
8 | ## adb 安装
9 |
10 | > - 安装brew
11 | >
12 | > > ruby -e “$(curl –insecure -fsSL )”.
13 | >
14 | > - 安装adb
15 | >
16 | > > brew install Caskroom/cask/android-platform-tools
17 | >
18 | > - 测试adb 是否安装成功:
19 | >
20 | > > adb devices
21 | >
22 | > - 通过 WLAN 连接到设备
23 | >
24 | > > 设置端口号:
25 | > > Adb tcpip 5555
26 | > > 连接IP/端口号可有可无:
27 | > > Adb connect 172.168.9.13:5555
28 | > > 查看设备:
29 | > > Adb devices
30 | > > 结束进程,重启服务,重新来一遍:
31 | > > Adb kill-server/start-server
32 |
33 | IP 为手机端IP地址,在PC端和手机端同时连接同一网络的前提下,获取手机端的IP地址进行连接。网络是一定的可翻墙网络!
34 |
35 | ### 其他命令
36 |
37 | 操作手机数据命令:
38 |
39 | | 命令 | 作用 |
40 | | --------------------- | ------------------------------------------------------------ |
41 | | adb pull remote local | 要从模拟器或设备复制文件或目录(及其子目录) |
42 | | adb push local remote | 要将文件文件或目录(及其子目录)复制到模拟器或设备 |
43 | | install path_to_apk | 将 Android 应用(使用 APK 文件的完整路径表示)推送到模拟器/设备 |
44 | | forward local remote | 将来自指定本地端口的套接字连接转发到模拟器/设备实例上的指定远程端口。 |
45 | | shell | 在目标模拟器/设备实例中启动远程 shell。 |
46 | | shell shell_command | 在目标模拟器/设备实例中启动远程 shell。 |
47 |
48 | 在上述命令中,local 和 remote 指的是开发计算机(本地)和模拟器/设备实例(远程)上目标文件/目录的路径。例如:
49 |
50 | > adb push foo.txt /sdcard/foo.txt
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/Mac卸载JDK.md:
--------------------------------------------------------------------------------
1 | ## 卸载步骤
2 |
3 | 输入
4 |
5 | > sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
6 |
7 | > sudo rm -fr /Library/PreferencesPanes/JavaControlPanel.prefpane
8 |
9 | 查找当前版本
10 | 输入:
11 |
12 | > ls /Library/Java/JavaVirtualMachines/
13 |
14 | 输出:jdk-9.0.1.jdk
15 |
16 | > sudo rm -rf /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/Mac安装MySQL.md:
--------------------------------------------------------------------------------
1 | 1. 下载mysql for mac:
2 | 2. 双击mysql-5.7.17-macos10.12-x86_64.dmg进行解压, 双击mysql-5.7.17-macos10.12-x86_64.pkg进行安装
3 |
4 | 
5 |
6 | 3. Continue -> Continue, Agree -> Install -> 输入管理员密码
7 |
8 |
9 | 4. 记录下来弹窗中的密码
10 |
11 | 
12 |
13 | 5. 进入系统偏好设置, 找到mysql, 启动服务
14 |
15 | 
16 |
17 | 6. 将mysql的命令添加到系统中
18 |
19 | 1) 进入/usr/local/mysql/bin,查看此目录下是否有mysql
20 |
21 | 2) 执行vim ~/.bash_profile
22 | 在该文件中添加mysql/bin的目录
23 |
24 | > PATH=$PATH:/usr/local/mysql/bin
25 |
26 | 添加完成后,按esc,然后输入wq保存。
27 | (3).最后在命令行输入`source ~/.bash_profile`
28 |
29 | 7. 通过mysql -uroot -p登录mysql, 输入之前保存的密码
30 | 8. 重置mysql初始密码
31 |
32 | > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpassword');
33 |
34 | 参考文章:
35 |
36 | mac安装mysql的两种方法:
37 |
38 |
39 |
40 |
41 |
42 | # MySql卸载
43 |
44 | 一般手动删除:
45 |
46 | > sudo rm -rf /usr/local/mysql
47 | >
48 | > sudo rm -rf /usr/local/mysql*
49 | >
50 | > sudo rm -rf /Library/StartupItems/MySQLCOM
51 | >
52 | > sudo rm -rf /Library/PreferencePanes/My*
53 | >
54 | > sudo rm -rf ~/Library/PreferencePanes/My*
55 | >
56 | > sudo rm -rf /Library/Receipts/mysql*
57 | >
58 | > sudo rm -rf /Library/Receipts/MySQL*
59 | >
60 | > sudo rm -rf /var/db/receipts/com.mysql.*
61 |
62 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/SmartSVN安装破解 for mac.md:
--------------------------------------------------------------------------------
1 | 下载地址:
2 |
3 | [http://www.smartsvn.com/download](http://www.smartsvn.com/download)
4 |
5 | 新建:smartsvn.license 文件
6 |
7 | > 存放位置随意,SVN安装之后注册文件选择它即可
8 | >
9 | > - 此处的安装实际就是从官方网站下载dmg文件,然后把里面的app拖动到Application即可完成安装
10 |
11 | 文件内容:
12 |
13 | ```properties
14 | Name=csdn
15 | Address=1337 iNViSiBLE Str.
16 | Email=admin@csdn.net
17 | FreeUpdatesUntil=2099-09-26
18 | LicenseCount=1337
19 | Addon-xMerge=true
20 | Addon-API=true
21 | Enterprise=true
22 | Key=4kl-[查看详情](http://www.pc6.com/mac/518996.html)[立即下载](http://www.pc6.com/down.asp?id=518996)
18 |
19 | 通过Mac App Store下载好的系统将会出现在finder应用程序之中:
20 |
21 | 
22 |
23 | **2、然后,我们需要用到一个非常好用和简单的,可以帮助我们一键制作macOS 10.13系统U盘启动盘的工具—DiskMaker X 7**
24 |
25 |
26 | **3、通过diskmaker x 10.13 Mac版软件制作苹果系统的U盘启动盘,可以支持制作Mac OS X 10.10x到macOS 10.13.2版本系统的可引导的驱动器安装程序。diskmaker x 10.13 Mac版软件的整个制作过程只要点点鼠标,不用一个终端命令,真正傻瓜式一键制作系统的U盘启动盘,并且安装后有recovery HD。**
27 |
28 | 
29 |
30 | **4、下载好DiskMaker X 7之后,打开它,会有相应的安装提示。**
31 |
32 | DiskMaker X 7支持一键制作10.10,10.11,10.12,10.13系统的U盘启动盘,点击图中标注的“Select a macOS Installation App..”开始下一步,这里是软件需要用户选择系统安装应用的意思
33 |
34 | 
35 |
36 | 自动检测到用户刚才下载好的Installation App,点击“Use this copy”
37 |
38 | 
39 |
40 | 插入我们准备好的8G容量的U盘,DiskMaker X 7会自动检测到,点击途中蓝色标注的部分开始我们的macOS系统盘制作即可,剩下的工作我们只需要等待就可以了,等U盘启动盘制作好之后,DiskMaker X 7会提示用户已完成。
41 |
42 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/安装HomeBrew.md:
--------------------------------------------------------------------------------
1 | # 安装 homebrew
2 |
3 | - 官网:[https://brew.sh](https://link.zhihu.com/?target=https%3A//brew.sh)
4 | - 打开苹果终端,在终端输入
5 |
6 | ```bash
7 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
8 | ```
9 |
10 | # 重新安装
11 |
12 | ```bash
13 | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
14 |
15 | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
16 | ```
17 |
18 | -----
19 |
20 | # 替换及重置Homebrew默认源
21 |
22 | $brew update 慢?来试试用 Coding 家的 Homebrew 源吧!( 该源每 5 分钟和上游同步一次,依托 Coding 遍布全国的 Git 服务节点(在 [http://Coding.net](https://link.zhihu.com/?target=http%3A//Coding.net)push & pull 仓库代码的速度也是同样的快),让你的 brew update 更快!)
23 |
24 | ```
25 | cd "$(brew --repo)" && git remote set-url origin https://git.coding.net/homebrew/homebrew.git
26 |
27 | $ cd $home && brew update
28 | ```
29 |
30 | --------
31 |
32 | ```
33 | 替换brew.git:
34 | cd "$(brew --repo)"
35 | git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
36 |
37 |
38 | 替换homebrew-core.git:
39 | cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
40 | git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
41 | ```
42 |
43 | 替换Homebrew Bottles源: 参考:[替换Homebrew Bottles源](https://lug.ustc.edu.cn/wiki/mirrors/help/homebrew-bottles)
44 |
45 | 在中科大源失效或宕机时可以: 1. 使用[清华源设置参考](https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/)。 2. 切换回官方源:
46 |
47 | ```
48 | 重置brew.git:
49 | cd "$(brew --repo)"
50 | git remote set-url origin https://github.com/Homebrew/brew.git
51 |
52 | 重置homebrew-core.git:
53 | cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
54 | git remote set-url origin https://github.com/Homebrew/homebrew-core.git
55 | ```
56 |
57 | 注释掉bash配置文件里的有关Homebrew Bottles即可恢复官方源。 重启bash或让bash重读配置文件。
58 |
59 |
60 |
61 | ------
62 |
63 | # 通过
64 |
65 | 在mac系统中,使用homebrew可以很方便的管理包。按照官网的说明执行以下命令时总是报错:
66 | `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
67 |
68 | 应该是这个资源访问有问题,那么我们可以尝试使用国内的镜像。给大家推荐一个中科院的镜像站点,里面有各种资源:
69 |
70 |
71 | 言归正传,开始踩坑
72 |
73 | ### 第一步,获取install文件
74 |
75 | 把官网给的脚本拿下来
76 | `curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install >> brew_install`
77 |
78 | ### 第二步,更改脚本中的资源链接,替换成清华大学的镜像
79 |
80 | 就是把这两句
81 | BREW_REPO = ““.freeze
82 | CORE_TAP_REPO = ““.freeze
83 | 更改为这两句
84 | BREW_REPO = “ “.freeze
85 | CORE_TAP_REPO = ““.freeze
86 | 当然如果这个镜像有问题的话,可以换成别的
87 |
88 | ### 第三步,执行脚本
89 |
90 | `/usr/bin/ruby brew_install`
91 |
92 | 然后可以看到这几句:
93 |
94 | ==> **Tapping homebrew/core**
95 |
96 | Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
97 |
98 | fatal: unable to access 'https://github.com/Homebrew/homebrew-core/': LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
99 |
100 | Error: Failure while executing: git clone https://github.com/Homebrew/homebrew-core /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1
101 |
102 | Error: Failure while executing: /usr/local/bin/brew tap homebrew/core
103 |
104 | liyuanbadeMacBook-Pro:~ liyuanba$ git clone https://github.com/Homebrew/homebrew-core /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1
105 |
106 | 出现这个原因是因为源不通,代码来不下来,解决方法就是更换国内镜像源:
107 |
108 | 执行下面这句命令,更换为中科院的镜像:
109 |
110 | git clone git://mirrors.ustc.edu.cn/homebrew-core.git/ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1
111 |
112 | 就下载成功了
113 |
114 | 然后把
115 |
116 | homebrew-core
117 |
118 | 的镜像地址也设为中科院的国内镜像
119 |
120 | cd "$(brew --repo)"
121 |
122 | git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
123 |
124 |
125 |
126 | cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
127 |
128 | git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
129 |
130 | 执行更新,成功:
131 |
132 | brew update
133 |
134 | 最后用这个命令检查无错误:
135 |
136 | brew doctor
137 |
138 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac 软件安装/苹果Mac安装Win10教程 BootCamp安装win10教程.md:
--------------------------------------------------------------------------------
1 | # 苹果Mac安装Win10教程 BootCamp安装win10教程
2 |
3 | # 一、准备工作:
4 |
5 | - 1、首先需要我们前往微软官网下载最新的 Windows10 光盘镜像,在下载镜像的时候,切记要下载64位的哦。
6 |
7 | | **软件名称:** | [Win10官方正式版](http://www.pc6.com/softview/SoftView_158174.html)简体中文版 |
8 | | -------------- | ------------------------------------------------------------ |
9 | | **软件大小:** | 3.56G  |
10 | | **下载地址:** | |
11 |
12 | 
13 |
14 | - 2、接下来还需要我们准备一个不小于 8G 版的 U 盘,用于制作安装 Windows 10 的安装 U 盘。
15 |
16 | 
17 |
18 | - 3、另外,如果你之前已经在 Mac 上安装了 Windows7 或 8 系统的话,那可以选择直接在 Windows 系统中进行更新升级就好。接下来主要是介绍如何为 Mac 重新安装一个 Windows10 的操作方法。
19 |
20 | # 二、用 BootCamp 工具制作启动 U 盘
21 |
22 | - 1、首先请将 U 盘插入 Mac 的 USB 端口,在 Mac 系统中打开 BootCamp 工具,如图所示
23 |
24 | 
25 |
26 | - 2、接着来到 BootCamp 的欢迎界面中,点击“下一步”按钮继续,如图所示
27 |
28 | 
29 |
30 | - 3、随后请选中制作启动 U 盘的所有选项,然后点击“继续”按钮。更新:现在 2015 年后的新的 Mac 电脑已经不需要使用 U 盘来安装 Win10 作双系统了,现在可以直接使用 bootcamp 选择你已经下载好的纯净的 64 位 Win10 镜像进行一键安装系统,Win10 的 bootcamp 驱动也会一并下载好。安装好 Win10 之后,在 Win10 里面有 2 个硬盘,你的 Mac 的 bootcamp 驱动直接在那个 8G 的硬盘里面找到安装即可,重启后这个盘就会消失。
31 |
32 | 
33 |
34 | - 4、接着在这里可以看到我们当前插入到 Mac 的 U 盘,在 ISO 镜像一栏,点击“选取”按钮,如图所示
35 |
36 | 
37 |
38 | - 5、随后请选择之前准备好的 Windows10 镜像,如图所示
39 |
40 | 
41 |
42 | - 6、当 U 盘与 Windows 10 镜像都已就位了,请点击“继续”按钮。
43 |
44 | 
45 |
46 | - 7、随后系统会提示我们是否要抹掉 U 盘上的数据,用于制作启动 U 盘,点击“继续”按钮。
47 |
48 | 
49 |
50 | - 8、接下就请耐心等待 BootCamp 制作启动 U 盘,由于需要拷贝软件,以及在网下载 Mac 的相关驱动,时间花费比较长。
51 |
52 | 
53 |
54 | - 9、当制作完成以后,会自动进入磁盘分割界面,意思就是说要为 Windows 系统分多少磁盘空间。我这里以分30G为例,请根据你自己的实际情况来定。
55 |
56 | 
57 |
58 | - 10、接着就请等待为磁盘分区了,分区好了以后会自动重启启动电脑,从启动 U 盘启动。
59 |
60 | 
61 |
62 | # 三、开始安装 Windows10
63 |
64 | - 1、接下来从 U 盘启动以后,即可看到 Windows10 的安装界面了。
65 |
66 | 
67 |
68 | - 2、随后可以根据提示就可以安装 Windows 10 系统了,值得注意的是在选择分区时,要注意不要选错了。
69 |
70 | 
71 |
72 | - 3、在安装好以后,请打开 U 盘启动盘,在 BootCamp 目录下,双击打开 Setup 安装程序,可以为 Windows10 安装 Mac 电脑的硬件驱动。
73 |
74 | 
75 |
76 | - 4、随后根据提示安装即可,如图所示
77 |
78 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac忘记root密码处理方式.md:
--------------------------------------------------------------------------------
1 | - 打开终端,输入`su root`,切换到root用户,如果密码输入错误会提示Sorry
2 |
3 |
4 | - 以普通用户身份执行命令`sudo bash`,此时会提示输入当前用户的密码
5 | - 在bash模式下输入`sudo passwd root`,此时会提示输入新密码
6 | - 输入新密码后按下回车键,再次输入密码进行确认,如果两次输入的密码完全一致,则root密码修改成功
7 |
8 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac相关快捷键总结.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | # Mac键盘符号映射
10 |
11 | 
12 |
13 | # Finder
14 |
15 | - `⌘+⬆` 返回上一级目录
16 |
17 | - `⌘+⇧+.` 可以显示隐藏文件、文件夹,再按一次,恢复隐藏,或者命令:
18 |
19 | > - 显示:defaults write com.apple.finder AppleShowAllFiles -bool true
20 | > - 隐藏:defaults write com.apple.finder AppleShowAllFiles -bool false
21 | >
22 | > 注意执行:`KillAll Finder` 以便生效
23 |
24 | 或者利用Automator制作一个小程序:
25 |
26 | ```bash
27 | display dialog "隐藏/显示隐藏文件" buttons {"可见", "隐藏"} with icon 2 with title "Switch to presentation mode" default button 1
28 |
29 | set switch to button returned of result
30 |
31 | if switch is "隐藏" then
32 | do shell script "defaults write com.apple.finder AppleShowAllFiles -bool false;
33 | KillAll Finder"
34 |
35 | else
36 | do shell script "defaults write com.apple.finder AppleShowAllFiles -bool true;
37 | KillAll Finder"
38 |
39 | end if
40 | ```
41 |
42 | - `⌘+⇧+G` 可以前往任何文件夹,包括隐藏文件夹。
43 |
44 | - `⌘+N` 新建文件夹
45 |
46 | # 全局
47 |
48 | - `⌃+↑` 打开任务,等同于F3
49 | - `⌃+↓`
50 | - `⌘+↑` 回到顶部
51 | - `⌘+↓` 回到底部
52 | - `⌘+M` 最小化
53 | - 按住 ⌘ 键,可以拖动非焦点窗口同时不激活它
54 | - `⌃+⌘+空格` 快速打开表情符号
55 | - 激活Spotlight搜索的时候,使用⌘+上下方向键还可以在搜索分组之间切换
56 | - `⌘+⌫` 删除文件,移动到废纸篓,如果是在废纸篓里面按该组合键,则是将删除的内容还原😳
57 | - `Fn+⌫` 可以实现向后删除,类似于windos的Delete键,正常的⌫相当于Windows的BackSpace键
58 | - `⌘+⇧+S` 另存为
59 | - `⌘+⌥+H` 隐藏所有闲置的窗口
60 | - `⇧+⌥+⌘+V`:粘贴为纯文本
--------------------------------------------------------------------------------
/操作系统相关/Mac/Mac相关总结.md:
--------------------------------------------------------------------------------
1 | # Mac Office破解
2 |
3 | https://blog.csdn.net/qq_34621169/article/details/79365247
4 |
5 | # Mac剪切操作
6 |
7 | 1. `⌘+C` 复制选择项
8 | 2. `⌥+⌘+V` 然后粘贴
9 |
10 | # Finder标题栏显示路径
11 |
12 | ## 在Finder标题栏显示路径
13 |
14 | > defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE;killall Finder
15 |
16 | ## 关闭显示路径
17 |
18 | > defaults delete com.apple.finder _FXShowPosixPathInTitle;killall Finder
19 |
20 | 以上命令执行完毕需要在执行 `killall Finder`
21 |
22 | # quickplay自动播放
23 |
24 | > defaults write com.apple.QuickTimePlayerX MGPlayMovieOnOpen 1
25 |
26 | Quickplay插件,播放各种视频格式
27 |
28 | http://www.mac52ipod.cn/post/Perian-QuickTime-AVI-Flv-MkV.php
29 |
30 |
31 |
32 | # **Mac**常用快捷键符号
33 |
34 | `⌘`(command)
35 |
36 | `⌥`(option)
37 |
38 | `⇧`(shift)
39 |
40 | `⇪`(caps lock)
41 |
42 | `⌃`(control)
43 |
44 | `↩`(return)
45 |
46 | `⌅`(enter)
47 |
48 |
49 |
50 | # Mac 终端自定义命令
51 |
52 | > vim ~/.bash_profile
53 |
54 | 输入一下内容
55 |
56 | > alias ll='ls -alF'
57 | >
58 | > alias la='ls -A'
59 | >
60 | > alias l='ls -CF
61 |
62 | 保存完成之后重新加载,使之生效:
63 |
64 | > source ~/.bash_profile
65 |
66 | # Command+T打开、新建标签
67 |
68 | - 浏览器
69 | - 终端
70 | - 办公软件等等
71 |
72 | -----
73 |
74 | # Git SSL错误解决
75 |
76 | 错误信息:
77 |
78 | > error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
79 |
80 | 解决方案:
81 |
82 | > **env GIT_SSL_NO_VERIFY=true** git clone https://
84 | > git config --global http.sslVerify false
85 |
86 | # Dock 栏加快显示速度
87 |
88 | Mac 中为了获得更大的可视空间,在不使用 Dock 时我们可以隐藏它。若要查看隐藏的 Dock,可以将指针移到 Dock 所在屏幕的边缘。但是这个显示速度存在了一定的延迟,为了加速这个过程,我们可以使用一段命令行,让你的隐藏 Dock 弹出的时候更加的顺滑流畅:
89 |
90 | ```shell
91 | defaults write com.apple.Dock autohide-delay -float 0 && killall Dock
92 | ```
93 |
94 | 使用后的效果,可以说是非常明显了,再也不会有在「挤牙膏」的感觉。
95 |
96 | 
97 |
98 | 如果在你的使用下,Dock 栏上摆满了各类 App,却发现这不是自己想要的结果。你可以通过终端来重置你的 Dock 栏,让它回到最开始的状态:
99 |
100 | ```shell
101 | defaults delete com.apple.dock; killall Dock
102 | ```
103 |
104 |
105 |
106 | # Launchpad图标大小调整
107 |
108 | **终端输入**
109 |
110 | **改变行数:**`defaults write com.apple.dock springboard-rows -int X`
111 |
112 | **改变列数:**`defaults write com.apple.dock springboard-columns -int X`
113 |
114 | **改变生效:**`killall Dock`
115 |
116 | 其中X是大于0的整数。根据自己喜好调整即可。
117 |
118 | **恢复默认**
119 |
120 | ```bash
121 | defaults write com.apple.dock springboard-rows Default
122 | defaults write com.apple.dock springboard-columns Default
123 | killall Dock
124 | ```
125 |
126 | 
127 |
128 |
129 |
130 | # HomeBrew-OS X 不可或缺的套件管理器
131 |
132 | ## 1.安装
133 |
134 | 中间会按RETURN键,输入密码
135 |
136 | 
137 |
138 | ## 2.卸载
139 |
140 | $ cd `brew --prefix`
141 |
142 | $ rm -rf Cellar
143 |
144 | $ brew prune
145 |
146 | $ rm `git ls-files`
147 |
148 | $ rm -rf .git
149 |
150 | $ rm -rf ~/Library/Caches/Homebrew
151 |
152 |
153 |
154 | HomwView简介、安装、使用
155 |
156 | ## 一、Homebrew是什么
157 |
158 | Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。
159 |
160 | 援引[官方](http://brew.sh/)的一句话:又提示缺少套件啦?别担心,Homebrew 随时守候。Homebrew – OS X 不可或缺的套件管理器。
161 |
162 | ## 二、Homebrew安装
163 |
164 | ### 1. 要求
165 |
166 | - Intel CPU [1](https://blog.csdn.net/andanlan/article/details/51589800#fn:cpu)
167 |
168 | - OS X 10.9 or higher [2](https://blog.csdn.net/andanlan/article/details/51589800#fn:os-x)
169 |
170 | - Xcode命令行工具 [3](https://blog.csdn.net/andanlan/article/details/51589800#fn:xcode)
171 |
172 | ```
173 | $ xcode-select --install
174 | 12
175 | ```
176 |
177 |
178 |
179 | - 支持shell (sh或者bash) [4](https://blog.csdn.net/andanlan/article/details/51589800#fn:shell)
180 |
181 | ### 2. 安装和卸载
182 |
183 | - 安装
184 |
185 | ```
186 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
187 | 12
188 | ```
189 |
190 | - 卸载
191 |
192 | ```
193 | $ cd `brew --prefix`
194 | $ rm -rf Cellar
195 | $ brew prune
196 | $ rm `git ls-files`
197 | $ rm -r Library/Homebrew Library/Aliases Library/Formula Library/Contributions
198 | $ rm -rf .git
199 | $ rm -rf ~/Library/Caches/Homebrew1234567
200 | ```
201 |
202 | ## 三、Homebrew基本使用
203 |
204 | ### 安装任意包
205 |
206 | ```
207 | $ brew install
208 | 12
209 | ```
210 |
211 | 示例:安装wget
212 |
213 | ```
214 | $ brew install wget
215 | 12
216 | ```
217 |
218 | ### 卸载任意包
219 |
220 | ```
221 | $ brew uninstall
222 | 12
223 | ```
224 |
225 | 示例:卸载git
226 |
227 | ```
228 | $ brew uninstall git
229 | 12
230 | ```
231 |
232 | ### 查询可用包
233 |
234 | ```
235 | $ brew search
236 | 12
237 | ```
238 |
239 | ### 查看已安装包列表
240 |
241 | ```
242 | $ brew list
243 | 12
244 | ```
245 |
246 | ### 查看任意包信息
247 |
248 | ```
249 | $ brew info
250 | 12
251 | ```
252 |
253 | ### 更新Homebrew
254 |
255 | ```
256 | $ brew update
257 | 12
258 | ```
259 |
260 | ### 查看Homebrew版本
261 |
262 | ```
263 | $ brew -v
264 | 12
265 | ```
266 |
267 | ### Homebrew帮助信息
268 |
269 | ```
270 | $ brew -h
271 | 12
272 | ```
273 |
274 | 输出示例:
275 |
276 | ```
277 | Example usage:
278 | brew search [TEXT|/REGEX/]
279 | brew (info|home|options) [FORMULA...]
280 | brew install FORMULA...
281 | brew update
282 | brew upgrade [FORMULA...]
283 | brew uninstall FORMULA...
284 | brew list [FORMULA...]
285 |
286 | Troubleshooting:
287 | brew config
288 | brew doctor
289 | brew install -vd FORMULA
290 |
291 | Brewing:
292 | brew create [URL [--no-fetch]]
293 | brew edit [FORMULA...]
294 | https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Formula-Cookbook.md
295 |
296 | Further help:
297 | man brew
298 | brew help [COMMAND]
299 | brew home1234567891011121314151617181920212223
300 | ```
301 |
302 | ## 四、注意
303 |
304 | 在Mac OS X 10.11系统以后,/usr/local/等系统目录下的文件读写是需要系统root权限的,以往的Homebrew安装如果没有指定安装路径,会默认安装在这些需要系统root用户读写权限的目录下,导致有些指令需要添加sudo前缀来执行,比如升级Homebrew需要:
305 |
306 | ```
307 | $ sudo brew update
308 | 12
309 | ```
310 |
311 | 如果你不想每次都使用sudo指令,你有两种方法可以选择:
312 |
313 | 1. 对/usr/local 目录下的文件读写进行root用户授权
314 |
315 | ```
316 | $ sudo chown -R $USER /usr/local
317 | 12
318 | ```
319 |
320 | 示例:
321 |
322 | ```
323 | $ sudo chown -R wentianen /usr/local
324 | 12
325 | ```
326 |
327 | 2. (推荐)安装Homebrew时对安装路径进行指定,直接安装在不需要系统root用户授权就可以自由读写的目录下
328 |
329 | ```
330 | -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
331 | 12
332 | ```
333 |
334 | ## 参考
335 |
336 | - [Homebrew官方推荐使用教程](http://brew.sh/index_zh-cn.html)
337 | - [安装卸载homebrew](http://www.cnblogs.com/chenjunbiao/archive/2011/07/11/2102899.html)
338 | - [官方源码库](https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/Installation.md)
339 |
340 | # 更改app图标
341 |
342 | - 先复制你喜欢的app图标。操作:按 `⌘+i` 打开app的简介,点击左上角的app图标,⌘+c 复制
343 |
344 | - 在目标app简介中的图标上粘贴即可
345 | - 点击app简介中的图标按下`⌘+⌫`即可还原图标
346 |
347 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/保养类/Mac电池保养1.md:
--------------------------------------------------------------------------------
1 | # 苹果笔记本一直充电好吗?Macbook电池保养技巧
2 |
3 | 苹果笔记本一直充电好吗?大家平时在使用Macbook时,是一直连接电源的,还是等电池用完了再连接电源呢?记得以前,曾看到有的人为了保护笔记本的电池,直接把电池取下,插上电源使用。对于一般的 PC 笔记本而言,还可以这样操作,如果你使用的是 MacBook 这类的笔记本电脑,就不能这样操作了。其实在使用笔记本是,要不要连接电源,无外乎大家都在关心一个问题,那就是担心电池会被过充,想要保护电池的寿命。
4 |
5 | **当前的笔记本电脑都是采用的锂电池,并且在主板上集成了对电池的充电保护系统,当电池充满以后,会自动切断充电电源。此外,当电池被充满以后,电脑会自动使用电源,而不是使用电池。**
6 |
7 | 
8 |
9 | 锂电池的使用寿命是通过一次完整的充放电来计算的,如果你害怕电池被过充,所以经常是把电池使用完了再充电的话,要不了多长时间,你会发现电池的使用时间越来越短。
10 |
11 | 
12 |
13 | 最好的方法是**为笔记本电源直接插上电源使用**。另外**每个月定期对笔记本电池进行1-3次充放电,即使用电池,让电池耗尽,然后再为它充电,保持电池内部的流动性**。
14 |
15 | 
16 |
17 | 此外,温度是电池的杀手。想要更好的保护好你的电池,就必须让它操持在一定的温度范围内。特别是**温度过高的情况,会对电池造成致命不可恢复的伤害**。如果温度过高,请为笔记本清洁灰尘与风扇,或是加装散热底座,用于帮助散热。
18 |
19 | 
20 |
21 | 当前小编所使用的 Mac 笔记本电脑是从2013年末购买的,一直到现在差不多有一年半了,从软件检测电池的容量可以看到,当前仍然保持了原始电池的93%电量。
22 |
23 | 
24 |
25 | 所以大家平时在使用笔记本电脑时,只要按照上面的方法来使用电源和电池,就可以大大地延长电池的使用寿命。
26 |
27 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/保养类/Mac电池保养2.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | **屏幕亮度**
4 |
5 | 1、当我们在外使用 MacBook 笔记本时,由于是使用的电池,这时可以适当地把屏幕亮度调低一些。因为屏幕是笔记本的一个耗电大户,把亮度调低了可以节省电量,让使用时间更长久。
6 |
7 | 
8 |
9 | 2、键盘上的功能按键 F1 和 F2 键可以调节屏幕的亮度,手动调节低一些。
10 |
11 | 
12 |
13 | 3、在系统默认情况下都是自动根据环境光线来自动调节屏幕亮度的,当然我们也可以设置为手动模式。在系统偏好设置中打开“显示器”选项,如图所示
14 |
15 | 
16 |
17 | 4、随后在显示设置中,关闭“自动调节亮度”选项,如图所示
18 |
19 | 
20 |
21 | **节能设置**
22 |
23 | 1、通过对 Mac 系统的节能设置,可以让系统自动节省不少能耗,如多少分钟没用电脑它会自动关闭屏幕。在系统的偏好设置中,点击打开“节能器”选项,如图所示
24 |
25 | 
26 |
27 | 2、在针对电池的节能设置窗口,可以设置关闭屏幕的时间,是否要关闭硬盘,以及使用电池时自动把屏幕调暗一些,如图所示
28 |
29 | 
30 |
31 | **使用温度**
32 |
33 | 电池对温度特别敏感,它有一个相对理想的运行温度,一旦温度过高会降低电池 的使用寿命。**如果电池的使用温度超过35°C的话,会对电池造成永久性的伤害**,即减少电池的使用容量,就好比原来可以装1升水,现在只能装半升水了。
34 |
35 | 
36 |
37 | 上面说了电池温度过热会对电池有害,当然温度太低了也不行。当温度你玩10°C的话,电池的可用电容量会减少,即充满一次电以后,使用时间没有原来的长。不过温度过低不会对电池千万永久性损害,只要温度恢复正常以后,它的容量也可以恢复正常。
38 |
39 | 所以,如果当你在使用 MacBook 笔记本时的环境温度很高,这时建议不要再为 Mac 充电。因为电池在充电时,温度会升高,再加上高的环境温度,电池的温度就会超标了。
40 |
41 | **定期充放电**
42 |
43 | 苹果 MacBook 笔记本内置的是锂离子聚合物电池,我们需要让它内部的电池保持流动性,这样一来才会延长电池的使用寿命。如果你是经常在外出差的话,会经常为 MacBook 充电,是完全没有问题的。比如你可以在公司上班时使用电池,回到家以后使用电源为它充电。
44 |
45 | 
46 |
47 | 如果你是一直在家里使用的话,一般情况下我们都会插上电池,这样一来就不能使用电池,导致不能为电池正常的充放电。如果你是属于这样的情况,建议至少每一个月要为 MacBook 充放电一次。
48 |
49 | **关闭设备**
50 |
51 | 在 MacBook 笔记本电脑上会有很多设备,如光驱、无线、蓝牙等。当我们在使用电池时,如果不用蓝牙或无线的话,可以关闭它们。因为些设备即使不使用它们,也会消耗电量的。对于早期配备了光驱的 MacBook 笔记本,当在使用电池时,建议最好是取出光驱中的光盘。
52 |
53 | 
54 |
55 | **保持系统为当前最新系统**
56 |
57 | 苹果在每隔一定周期都会对 Mac 系统进行升级,其间就有一些对电源管理进行优化的更新。
58 |
59 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/实用操作/MAC 常见问题解决.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/操作系统相关/Mac/其它/实用操作/MAC 常见问题解决.md
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/实用操作/Mac 利用rsync差异化备份.md:
--------------------------------------------------------------------------------
1 | ## 简单备份
2 |
3 | 命令行并不等同于复杂,rsync 的基础语法就非常简单:
4 |
5 | ```bash
6 | rsync -av [源文件夹路径] [备份路径]
7 | ```
8 |
9 | 把两个路径名替换成你自己的(可以直接拖动文件夹进 Terminal 来获得),之后就可以在 Terminal 里执行了。特别注意的是,**两条路径最后需要以 / 结尾,不然它们会出现在让你觉得莫名其妙的地方。**
10 |
11 | 我需要备份音乐文件夹到 U盘,就可以用 `rsync -av /Users/apple/Music/ /Volumes/Min\'s/music/`。
12 |
13 | 
14 |
15 | 你会注意的一些乱码,这是由于部分音乐文件名带有中文或日文,不能正常显示,但不会影响备份效果。
16 |
17 | rsync 的差异算法非常管用,即使文件名没有改动,它也会备份有过改动的文件。我经常为音频更换专辑封面、添加 tag,过去备份时需要按照修改时间排列、手工选出近期改动的文件,繁琐程度可想而知,换 rsync 就省下一大笔力气。
18 |
19 | 🚮**删除多余文件**
20 |
21 | 最简单的 rsync 只会做加法,但那些在源文件夹里删掉的文件,我不想去备份文件夹里再删一遍。`--delete`参数就是用来解决这个问题的:
22 |
23 | ```
24 | rsync -av [源文件夹路径] [备份路径] --delete
25 | ```
26 |
27 | 在末位添加这一串参数后,如果删除了源文件夹里的某些东西,备份中的对应文件也会乖乖消失。
28 |
29 | 🙅**不想备份特定文件或文件夹**
30 |
31 | 在备份音乐文件夹时,我发现里面的 iTunes 文件夹也混了进去,但是我不需要这个东西。可以用 `--exclude "想要排除的文件"` 这串参数来避开它:
32 |
33 | ```
34 | rsync -av [源文件夹路径] [备份路径] --delete --exclude "想要排除的文件或文件夹"
35 | ```
36 |
37 | 比如我就加了 `--exclude "iTunes"` 来避免同步 iTunes 文件夹。文件名之后记得带上拓展名,尾巴不要落下。如果是文件夹,就不需要带拓展名。
38 |
39 | ## 一键备份、恢复
40 |
41 | 命令虽好,但每次输入太麻烦,备份多个文件夹更成了噩梦。做一个脚本就解决问题了。
42 |
43 | 1.打开 Automator,新建一个「应用程序」,添加一个「运行 Shell 脚本」步骤;
44 |
45 | 2.把刚才测试成功的命令粘贴进去。想备份多个文件夹,就粘一条换一行,它们会依次执行;
46 |
47 | automator
48 |
49 | 3.保存好刚才制作的应用程序,放在方便取用的地方。
50 |
51 | 以后需要备份的话,双击它就完成了👏。
52 |
53 | 至于恢复备份的应用程序,制作起来也不难,只需要把源文件夹路径与备份路径换一下。此时你最好慎用 `--delete` 参数,降低丢失文件的风险。
54 |
55 | ## 定时备份
56 |
57 | 还记得用日历启动定时任务的技巧吗?你当然可以用同样的方法启动定时备份了。
58 |
59 | 把提醒换成打开程序
60 |
61 | iMac、Mac mini 可以等长期通电的设备可以在夜深人静时自己备份,利用闲置时间,不影响白天工作。可惜我在外使用的是笔记本电脑,闲置时都在盒盖休眠,无福享受。
62 |
63 | ## 总结
64 |
65 | rsync 方便高效,灵活、可定制,和 Automator、日历配合能满足更多需求。我现在备份音乐、照片和 PDF 都会使用它。
66 |
67 | 但是相比 Time Machine、Git 等工具,rsync 的局限也很明显:没有版本记录,也就没有炫酷的时光机功能,如果你需要频繁回溯到历史版本——尤其当你从事编程或设计等工作时——rsync 不是一个好选择。但不保存这些历史记录也就更省空间,小小的 U盘就足够胜任,事实上,我使用普通 U盘的时间远远多余搭载 Time Machine 的硬盘。
68 |
69 | 对我来说,rsync 更适合保存一些零碎的、私人的文件。推荐把备份作为每周甚至每日的例行任务,给自己的文件多加一道保险。
70 |
71 |
72 |
73 | > ```
74 | > -v, --verbose 详细模式输出。
75 | > -q, --quiet 精简输出模式。
76 | > -c, --checksum 打开校验开关,强制对文件传输进行校验。
77 | > -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
78 | > -r, --recursive 对子目录以递归模式处理。
79 | > -R, --relative 使用相对路径信息。
80 | > -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
81 | > --backup-dir 将备份文件(如~filename)存放在在目录下。
82 | > -suffix=SUFFIX 定义备份文件前缀。
83 | > -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
84 | > -l, --links 保留软链结。
85 | > -L, --copy-links 想对待常规文件一样处理软链结。
86 | > --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
87 | > --safe-links 忽略指向SRC路径目录树以外的链结。
88 | > -H, --hard-links 保留硬链结。
89 | > -p, --perms 保持文件权限。
90 | > -o, --owner 保持文件属主信息。
91 | > -g, --group 保持文件属组信息。
92 | > -D, --devices 保持设备文件信息。
93 | > -t, --times 保持文件时间信息。
94 | > -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
95 | > -n, --dry-run现实哪些文件将被传输。
96 | > -w, --whole-file 拷贝文件,不进行增量检测。
97 | > -x, --one-file-system 不要跨越文件系统边界。
98 | > -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
99 | > -e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
100 | > --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
101 | > -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
102 | > --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
103 | > --delete 删除那些DST中SRC没有的文件。
104 | > --delete-excluded 同样删除接收端那些被该选项指定排除的文件。
105 | > --delete-after 传输结束以后再删除。
106 | > --ignore-errors 及时出现IO错误也进行删除。
107 | > --max-delete=NUM 最多删除NUM个文件。
108 | > --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
109 | > --force 强制删除目录,即使不为空。
110 | > --numeric-ids 不将数字的用户和组id匹配为用户名和组名。
111 | > --timeout=time ip超时时间,单位为秒。
112 | > -I, --ignore-times 不跳过那些有同样的时间和长度的文件。
113 | > --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
114 | > --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
115 | > -T --temp-dir=DIR 在DIR中创建临时文件。
116 | > --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
117 | > -P 等同于 --partial。
118 | > --progress 显示备份过程。
119 | > -z, --compress 对备份的文件在传输时进行压缩处理。
120 | > --exclude=PATTERN 指定排除不需要传输的文件模式。
121 | > --include=PATTERN 指定不排除而需要传输的文件模式。
122 | > --exclude-from=FILE 排除FILE中指定模式的文件。
123 | > --include-from=FILE 不排除FILE指定模式匹配的文件。
124 | > --version 打印版本信息。
125 | > --address 绑定到特定的地址。
126 | > --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
127 | > --port=PORT 指定其他的rsync服务端口。
128 | > --blocking-io 对远程shell使用阻塞IO。
129 | > -stats 给出某些文件的传输状态。
130 | > --progress 在传输时现实传输过程。
131 | > --log-format=formAT 指定日志文件格式。
132 | > --password-file=FILE 从FILE中得到密码。
133 | > --bwlimit=KBPS 限制I/O带宽,KBytes per second。
134 | > -h, --help 显示帮助信息。
135 | > ```
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/实用操作/Mac 移动硬盘无法装载问题解决.md:
--------------------------------------------------------------------------------
1 | ###### Mac移动硬盘分区无法装载
2 |
3 |
4 |
5 | 1、首先输入命令: `diskutil list`
6 |
7 | 查看你的硬盘装载的名字(如下)
8 |
9 | > /dev/disk0
10 | >
11 | > TYPE NAME SIZE IDENTIFIER
12 | >
13 | > 0: GUID_partition_scheme *250.1 GB disk0
14 | >
15 | > 1: EFI EFI 209.7 MB disk0s1
16 | >
17 | > 2: Apple_HFS ssd 249.1 GB disk0s2
18 | >
19 | > 3: Apple_Boot Recovery HD 650.0 MB disk0s3
20 | >
21 | > /dev/disk1
22 | >
23 | > TYPE NAME SIZE IDENTIFIER
24 | >
25 | > 0: GUID_partition_scheme *320.1 GB disk1
26 | >
27 | > 1: EFI EFI 209.7 MB disk1s1
28 | >
29 | > 2: Apple_HFS Macintosh HD 319.2 GB disk1s2
30 | >
31 | > 3: Apple_Boot Recovery HD 650.0 MB disk1s3
32 | >
33 | > /dev/disk2
34 | >
35 | > TYPE NAME SIZE IDENTIFIER
36 | >
37 | > 0: FDisk_partition_scheme *2.0 TB disk2
38 | >
39 | > 1: Apple_HFS MAC 666.9 GB disk2s1
40 | >
41 | > 2: Windows_NTFS MAC-WINDOWS 666.9 GB disk2s2
42 | >
43 | > 3: Windows_NTFS WINDOWS 666.5 GB disk2s3
44 | >
45 | >
46 |
47 | 2、通过命令装载分区
48 |
49 | 1. `sudo diskutil mount /dev/disk3s1`
50 |
51 | 或者:
52 |
53 | mkdir /Volume/partition1
54 |
55 | sudo mount /dev/disk3s1 exfat /Volume/partition1
56 |
57 | (假设你的分区是exfat格式)
58 |
59 | ----------
60 |
61 |
62 |
63 | 实在不不行,参考一下方法:
64 |
65 | 1. `fsck -fy`
66 |
67 | 经过一番搜索,在链接“”帮助下,我可以用Cmd+S单用户登录系统,并且使用“fsck -fy”检查硬盘分区。但怎么检查我移动硬盘的分区呢?并且分区格式怎么判断?
68 |
69 | 2. `fsck_hfs -fy /dev/disk2s2`
70 |
71 | 在链接“”和“”帮助下,我进入单用户模式(其实是命令行模式),知道我的移动硬盘是挂载到/dev下的disk2,每个分区是以s1,s2,s3来区分。我分区是hfs,我用mount -t hfs来加载没成功,但直接用fsck_hfs成功了。所以最后一个链接挺有用,知道命令,知道分区格式,知道分区,那么就能顺利进行修复了。修复完毕后,系统提示说A分区没啥问题,我基本放心了。
72 |
73 | 重启到正常模式下,插上移动硬盘,可以进行Time Machine备份,彻底搞定。
74 |
75 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/实用操作/Mac重装系统的一些坑.md:
--------------------------------------------------------------------------------
1 | # Mac 系统重装的一些坑
2 |
3 | 对于 Mac 用户来说,因为有 Time Machine 所以很少有必要全新安装,很多时候只需要从备份恢复就能满血复活,不过 Time Machine 也不是绝对靠谱的,印象中就经历过两次备份损坏导致无法还原的情形。换个角度来看,隔几年全新安装一次对系统是次优化和净化,说不定还能挖出很多使用习惯和文件备份上的坑。
4 |
5 | ## 第一时间恢复网络环境
6 |
7 | 准备重新整理系统之前,已经启用了 iCloud Drive,文档、桌面这些都已同步到云端;共享资源和应用软件配置信息保存在 Dropbox;协作的少量文档保存在 Google Drive;公司台式机和 MacBook 之间交换的公司文档保存在 OneDrive。规划主次依旧是 iCloud Drive、Dropbox、Google Drive、OneDrive,所有这些云端数据要下载到新的系统,网络环境必须顺畅和高速才有效率。
8 |
9 | 还有一个要优先恢复网络的原因是 Mail.app,大量软件的授权都是保存在 Gmail 邮件当中的,如果不能把邮件同步下来软件安装的时候就会卡壳。
10 |
11 | iCloud Drive 中包含很多第三方应用的文档,例如:Surge 的配置,恢复科学上网离不开这些配置文件,另外一个经验就是 Surge 程序包最好也在这个文件夹里放一份,这样系统恢复后 iCloud 文档同步到本地后便于快速安装和恢复网络环境。
12 |
13 | 
14 |
15 | 最保险的方式是在移动硬盘中也保存一份常用软件和配置,例如:Surge 和其配置文件、Dropbox 离线安装包、1Password、Telegram Desktop、Keka。
16 |
17 | > 如果启用了两步验证,手头还要准备好网络畅通的手机。Dropbox、Google、OneDrive 这些支持两步验证的应用安装时需要输入验证码,需要在手机上打开管理 OTP(One-Time Password)的应用,例如:1Password、Google Authenticator。
18 |
19 | ## 排除在备份之外的文件
20 |
21 | 虚拟机的文件过大,从来 Time Machine 的设置里都是将其排除在外的,另外我的设置中还排除了「下载」文件夹,下载文件夹还兼做临时文件夹使用。Telegram 的本地存储默认也是下载文件夹,重整系统前需要检查确认。
22 |
23 | 启用 iCloud Drive 的文稿和桌面同步后,DEVONthink 的库文件也和 Parallels Desktop 虚拟机文件一样被自己迁移到了用户目录的根目录下,如果是单独备份的也需要核实一次。
24 |
25 | 
26 |
27 | 主动备份环节最头疼的是文件的复制速度。虚拟机的文件很大,下载的高清电影也很大,如果不复制到移动硬盘上,等恢复系统后它们就都没有了,手动备份又需要漫长的拷贝传输过程,所以 WiFi 传输就不要考虑了,至少用 USB 3.0 以上速率的移动硬盘或者直接用网线连接进行备份。
28 |
29 | ## 由 Time Machine 备份里单独提取文件
30 |
31 | 双击 Time Machine 备份( .sparsebundle 后缀的文件)可以将备份作为一个磁盘镜像加载上,加载成功后可在 Finder 边栏的设备项下找到。
32 |
33 | 和访问其他磁盘镜像一样,我们可以在 TM 磁盘备份中查找所有已经备份的文件。如果系统不是从备份恢复安装的,很多时候我们还需要到其中查找文件。个人就经历过,全新安装发现音乐和有声读物全都没有了,只能打开对应的目录从「用户-音乐」里复制。
34 |
35 | 另外,平时我们主要关注的都是文档备份,很多应用的配置文件很容易被忽视,例如:Hazel 的规则、Alfred 的配置和扩展、Safari 的扩展(~/Library/Safari/Extensions)、aText 的短语配置、Snagit 的截图历史记录、PopClip 的扩展、鼠须管输入法的配置、Scrivener 模板、OmniGraffle 自定义型板等等。有些文件的位置很好找,有些就需要在新系统中导出后基于后缀来搜索判断文件位置,最后再到 TM 中定位复制出来。
36 |
37 | 
38 |
39 | 经历痛苦的翻找后,很有必要关照一下这么以前忽视的部分:能启用 iCloud 同步的都开启、能导出的导出一份到 Dropbox 文件夹。
40 |
41 | ## iCloud 照片图库
42 |
43 | 全新安装后「照片」应用中 iCloud 照片图库默认是关闭的,按照 iCloud 照片图库的同步策略,勾选打开「iCloud 照片图库」后,照片应用会先上传本地的照片然后再下载新的照片,所以在同步完成前,最好不要单独导入照片,避免产生重复。
44 |
45 | 重做系统前我手动备份了整个照片图库文件(保存到移动硬盘),同时手动备份的还有 Pixave 的图库和 Snagit 的截图自动存储文件夹。系统安装好后,直接将图库复制到图片文件夹下,然后再打开「照片」应用启用 iCloud 照片同步。「照片」应用的底部能看到上传照片的进度提示,这个过程会持续一段时间,直到云端完成比对后才会提示更新完成。
46 |
47 | iCloud 照片图库会遵序任务队列的方式来完成上传、下载等动作,所以在同步完成期间最好不要手动导入手机中的照片, iPhone、Mac 上启用「iCloud 照片图库」后,照片会逐步完成同步,只需要等待就好(网络环境很重要)。
48 |
49 | 其实一直比较好奇 iCloud 照片库的运作方式,每次因为各种原因关闭 iCloud 后再打开都会看到照片应用各种「忙碌」,例如,提示正在上传 30GB 的照片,缓慢的进度让人很担心,不过转天再看就发现已经都完成了。猜想 iCloud 只是上传数据进行比对发现一致就完成了,所以别被同步进度吓着,数据处理上 iCloud 还是很智能的。
50 |
51 | ## MAS 之外的安装包
52 |
53 | MAS 里的应用安装和恢复是最简单的,在「已购」里点击安装就可以。比较费事的是 Mac App Store 之外的很多软件的安装。
54 |
55 | 了解 Homebrew 的可能会鄙视一下小白,直接 `brew cask install google-chrome`(安装 Google 浏览器的范例)多简单,命令行后面跟上软件名称一次就能搞定。常用的软件 Homebrew-Cask 几乎都支持([支持应用搜索页](https://caskroom.github.io/search)),而且都是从官方源下载,安全性同样有保障。
56 |
57 | 使用 [Homebrew-Cask](https://caskroom.github.io/) 前提是已经安装 Xcode开发工具、[Homebrew](https://brew.sh/index_zh-cn.html),感兴趣的可以 Google 搜索学习一下这种高效率的极客方式。
58 |
59 | 安装前推荐 Things 这样的任务管理软件罗列梳理一下所需要安装的软件,思考一下是否有必要让某些软件回归,请神容易送神难,安装前想好了总比安装后卸载好。
60 |
61 | 
62 |
63 | 图示中列出了自己这次安装下载的一堆软件,其实除了软件之外还有字体、Safari 扩展、词典文件以及鼠须管的配置等等。有些是之前备份没有考虑到的,字体就是从原来的 Time Machine 备份(~/资源库/Fonts)里临时挖出来的,移动硬盘上先前备份的字体太凌乱,而旧系统中是经过一段时间打磨留存下来的,所以最后还是从 Time Machine 里翻找了一次。
64 |
65 | ------
66 |
67 | 其实这次安装还有不少插曲:例如,为了充分发挥 iCloud 的功用,开启了Pixave 的 iCloud 同步,2000+ 的截图上传那个慢啊,痛苦的是此时 iCloud 照片库也在同步。
68 |
69 | 还有更糗的是降级前(macOS High Sierra)把移动硬盘格式化成了 APFS (加密),拷贝了 DEVONthink 、图库、Pixave 图库、Snagit 图库、Parallels Desktop 虚拟机等一堆大块头的文件,结果安装好 macOS Sierra 后发现根本没法访问这个磁盘,只能暗骂自己犯二。
70 |
71 | 鼠须管的安装也不太顺利,原想着只安装 Xcode 命令行工具就能编译,结果不行,最后依旧是等下载带宽空出来安装 Xcode 后才搞定。
72 |
73 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/实用操作/WiFi 未安装硬件.md:
--------------------------------------------------------------------------------
1 | # WiFi 未安装硬件
2 |
3 | 尝试:
4 |
5 | > - 重置 PRAM:按下电源按钮之后,同时按住以下键:Command+Option+P+R,直到在初始启动声之后又至少听到一次启动声为止。
6 | > - 重置 SMC:关闭电脑,连接电源适配器,请按一下(左侧)Shift+Control+Option +电源按钮
7 | >
8 | > 以上二选一,如果还未解决可能就是网卡松动或者网卡损坏导致
--------------------------------------------------------------------------------
/操作系统相关/Mac/其它/实用操作/几条简单命令,也能保护你的 Mac.md:
--------------------------------------------------------------------------------
1 | # 几条简单命令,也能保护你的 Mac
2 |
3 | ------
4 |
5 | Mac 上的密码分为很多种,设置起来又很不方便,有的人因为嫌麻烦,仅仅设置了一个自我安慰的用户密码,或干脆让自己的电脑「裸奔」。
6 |
7 | 此前少数派曾写过一篇教你[用简单方法保护数据安全的文章](https://sspai.com/post/41363),本文实现的效果类似,不过是通过更直接的命令行方式,让你像电脑高手一样保护自己的 Mac。
8 |
9 | 本文旨在带你区分不同的密码,并掌握每种密码合适的使用场合。为了避免图形界面来回切换的繁琐,我尽量介绍命令行的用法,有基础、有需求的读者可以一试,害怕把自己电脑锁上打不开的读者,权当科普便好。
10 |
11 | ## macOS 用户帐户密码
12 |
13 | 用户密码是我们最常使用的密码,即当前系统管理员密码。
14 |
15 | 涉及 Root 权限等操作都需要它的许可,比如部分系统设置、部分终端操作和安装奇奇怪怪的应用。由于能够通过某些手段绕过,可以说,用户密码**只防君子,不防小人。**
16 |
17 | 实际中我们常常需要手动输入用户密码,为了方便,长度以 6-8 位为宜,不应过长或过于复杂——但也不要太简单。我所见最奇葩的密码是「空格」,此君解锁只需猛敲两下键盘。不提倡此类故作潇洒的行为。如果需要修改密码,可以使用这个命令:
18 |
19 | `passwd`
20 |
21 | 
22 |
23 | 键入原密码、新密码并确认后即修改成功。
24 |
25 | 至于配备 Touch Bar 的 MacBook,在部分情形下,它们可以使用指纹代替密码输入。但是需要注意身后徘徊的不明人员,因为有的应用会在指纹验证成功后明文显示密码(例如 iTerm 2)。
26 |
27 | #### 👀 冷知识:我的密码失灵了?
28 |
29 | 有时开盖输入用户密码,明明正确,却无法解锁屏幕。**如果你确定 ⇪Caps Lock、⇧Shift 以及输入语言都没问题,可以重启解决。**这是 Apple 服务器的 bug,以我倒卖电脑的经验,多发于维修后、换新之后。
30 |
31 | ## Firmware 固件密码
32 |
33 | [Firmware](https://support.apple.com/en-us/HT204455) 阻止他人从未指定的磁盘启动,包括光盘、外置 U 盘等。
34 |
35 | 这是一层非常有效的保护,防止来路不明的启动盘入侵电脑。带来的一点小麻烦是,你自己自己想重装、恢复系统之时,也得手动输入密码。
36 |
37 | 设置 Firmware 可以使用以下命令:
38 |
39 | `sudo firmwarepasswd -setpasswd`
40 |
41 | 
42 |
43 | 建议所有 macOS 设备都开启 Firmware。如果忘记了 Firmware,需要进入恢复模式,输入用户密码关闭 Firmware。哪天你重装系统,要是忘了许久不用的 Firmware 密码,可别再对着弹出的 Firmware 界面思考人生了。
44 |
45 | 另一种设置方式可以参考我派这篇文章:[为你的 Mac 添加「固件密码」保护](https://sspai.com/post/33355)
46 |
47 | ## FileVault 2 全磁盘加密
48 |
49 | [FileVault](https://support.apple.com/zh-cn/HT204837)(OS X Lion 及更高版本中为 FileVault 2)防止未登入的用户读取磁盘数据。开启之后,任何账户无法自动登录FileVault 将 XTS-AES-128 加密与 256 位密钥搭配使用,几乎达到最高级别的加密,**即使别有用心之人把硬盘或 SSD 拆下来,也无法读取里面的数据。相对的,一旦登入账号,FileVault 就告解密,该账户下数据的保护需另寻出路。**
50 |
51 | Mac 在激活和会询问你是否开启 FileVault,不少人忘了自己有没有操作过,可以用这个命令查询:
52 |
53 | `fdesetup status`
54 |
55 | 
56 |
57 | 如果显示`FileVault is off`,就表示没有开启。日常使用中我不建议开启 FileVault,因为加密和解密都比较麻烦,耗时、耗电。不过,为防梁上君子,那些常常不在身边的设备建议开启 FileVault——尤其是 Mac mini 搭建的 NAS、基于 macOS 的工作站以及常驻一个地方的外置磁盘。命令如下:
58 |
59 | `sudo fdesetup enable`
60 |
61 | 
62 |
63 | 输入用户密码,静待加密完成**并生成 FileVault 密码,务必保管好它。**
64 |
65 | 如果你希望使用 iCloud 挽救忘记 FileVault 密码的悲惨局面,还是使用「常规方式」,在系统设置里一步步打开 FileVault:
66 |
67 | 1. 在系统设置-安全性于隐私-FileVault 内解锁左下角锁头,需要输入用户密码
68 | 2. 点选「打开 FileVault」
69 | 3. 选择是否将 FileVault 密码存储进 iCloud
70 | 4. 开始漫长的加密过程,建议连上电源
71 |
72 | ## 压缩文件加密
73 |
74 | 可以为选定的压缩包设置密码,建议用于重要的工作文件、原创作品。系统自带的压缩工具就具有加密功能,我们使用它的命令行版本。
75 |
76 | `zip -e 文件名.zip 文件路径`
77 |
78 | 
79 |
80 | 输入并确认密码,即刻生产带有密码保护的压缩文件。企图打开它的时候,就会问你讨要密码了。
81 |
82 | 
83 |
84 | ## 小结
85 |
86 | 密码保护远远不止于此,还有卷宗加密、网盘加密等等内容。本文所介绍的几种密码,只是比较基础的内容,但是多数人的 MacBook 仅仅有一颗聊胜于无的锁屏密码,实在令人不安。
87 |
88 | 虽然我们的生活不是《Who Am I》里的电子战场,但一些爱搞小动作的可疑分子还是让人不得不防。比起安装某些怀有司马昭之心的杀毒软件,其实用 Mac 自带工具做一些简单的预防,就能让电脑的安全系数上升不少。
--------------------------------------------------------------------------------
/操作系统相关/Mac/实用操作/MAC应用无法打开或文件损坏的处理方法.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | 在MAC下安装一些软件时提示"来自身份不明开发者",其实这是MAC新系统启用了新的安全机制。
4 | 默认只信任 **Mac App Store** 下载的软件和拥有开发者 ID 签名的应用程序。
5 | 换句话说就是 MAC 系统默认只能安装靠谱渠道(有苹果审核的 **Mac App Store**)下载的软件或被认可的人开发的软件。
6 |
7 | 这当然是为了用户不会稀里糊涂安装流氓软件中招,但没有开发者签名的 “老实软件” 也受影响了,安装就会弹出下图所示警告框:“打不开 xxx,因为它来自身份不明的开发者”。
8 |
9 | 
10 |
11 | **出现这个问题的解决方法有2种:**
12 |
13 | 1. 最简单的方式:按住Control后,再次点击软件图标,即可。
14 | 2. 修改系统配置:系统偏好设置... -> 安全性与隐私。
15 |
16 | **系统偏好设置**
17 |
18 | 
19 |
20 | **安全性与隐私**
21 |
22 | 
23 |
24 | **认证**
25 |
26 | 
27 |
28 | **修改为任何来源**
29 |
30 |
31 |
32 | ## 如果没有这个选项的话(macOS Sierra 10.12),打开`终端`,输入`sudo spctl --master-disable`然后按`回车`。然后会看见个password后面还有个钥匙图标,然后不用管他直接再继续输入你自己电脑解锁密码(输入的时候不显示你输入的密码,感觉就是输入不了东西一样,也不用管,凭感觉输入完按回车键)。然后再回到隐私里,就看见任何来源了。
33 |
34 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/实用操作/Mac 为应用程序添加自定义快捷键.md:
--------------------------------------------------------------------------------
1 | > 我们知道,Mac系统是一个高效率系统,当然了,如果你是从windows系统刚刚转过来,开始会有些不适应,但是适应之后我觉得可能就回不去了 😂
2 |
3 | 在Mac系统中,应用程序某些功能都有自己的快捷键,方便我们在不用一层一层查找去浪费时间,相关Mac系统的常用快捷键请[参考此处](https://github.com/TangHanF/ProjectRecord/blob/master/操作系统相关/Mac/Mac相关快捷键总结.md)。但是有时候有些常用功能没有绑定快捷键,如何新增快捷键呢?在此我要Numbers表格为例,我经常需要将Numbers表格导出为Excel格式,方便其他人查看、编辑等,但是每一次都有手动打开如下目录:
4 |
5 | 
6 |
7 |
8 |
9 | 现在我想给常用的【Excel...】加上一个快捷键,例如:`⌘+E`,步骤如下:
10 |
11 | - 打开系统偏好设置--键盘--找到【快捷键】选项卡
12 |
13 | 
14 |
15 | 点击左下角的“+”进行新增快捷键。
16 |
17 | 
18 |
19 | **注意:【菜单标题】必须准确填写,不然不生效!**
20 |
21 |
22 |
23 | 最后打开Numbers,再看一下,快捷键就绑定了,以后导出直接⌘+E即可
24 |
25 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/实用操作/Mac 磁盘分区.md:
--------------------------------------------------------------------------------
1 | # Mac磁盘格式类型
2 |
3 |
4 |
5 | # 分区推荐
6 |
7 | 
8 |
9 | FAT32可以同时使用,但是单个文件不能超过4G;
10 |
11 | **推荐**
12 |
13 | - ExFAT 格式用在Win上
14 | - MacOS用在Mac上
15 |
16 | > 因为Mac的TimeMachine需要使用`Mac OS 扩展(日志式)`所以不能把整个硬盘都分成FAT32。
17 |
18 | 基于以上需求,我把硬盘分了3个区:Mac(MacOS)、Win(ExFAT)、Time Machine(MacOS 日志式备份专用)
19 |
20 | Mac上都可以读取,Win上可以读取Win的区
--------------------------------------------------------------------------------
/操作系统相关/Mac/实用操作/Mac 配置Maven环境变量.md:
--------------------------------------------------------------------------------
1 | **1、下载maven包:**
2 |
3 | 下载链接:🔗
4 |
5 | maven下载文件释义:
6 |
7 | 1⃣️ Binary tar.gz archive:是装在Linux、MacOsX上的。
8 |
9 | 2⃣️ Binary zip archive:是装在windows上的。
10 |
11 | 3⃣️ binary表示编译后的二进制文件,一般比较小,适合直接在项目中使用,
12 |
13 | 4⃣️ source表示可以查看源代码的,比binary大一些,如果你想看一下maven的源码可以下载这一类的 .
14 |
15 |
16 |
17 | **2、配置maven环境变量(首先要确保java环境变量已经配置好):**
18 |
19 | 1⃣️ 先双击Binary tar.gz archive文件,解压到文件目录下;
20 |
21 | 2⃣️ 查看文件路径:1)首先,打开终端;
22 |
23 | 2)再将apache-maven-3.5.0 文件夹拖入到终端内,文件夹路径就会显示出来;
24 |
25 | 3⃣️ 在终端打开配置环境变量到文件:
26 |
27 | 1)在终端输入 vim ~/.bash_profile,进入到环境变量配置文件里面;
28 |
29 | 2)进入后,是read模式,按下 i (编辑)键,进入insert模式;
30 |
31 | 3)将环境变量加入其实,环境变量如下:
32 |
33 | export MAVEN_HOME=/Users/robbie/apache-maven-3.3.3
34 |
35 | export PATH=$PATH:$MAVEN_HOME/bin
36 |
37 | 4)按下 ESC,退出insert模式;
38 |
39 | 5)输入 :wq (保存修改)退出当前文件;
40 |
41 | 6)使修改的环境变量bash_profile文件生效,输入 source .bash_profile,按下Enter键即可.
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/实用操作/Mac下使用tree命令.md:
--------------------------------------------------------------------------------
1 | 在Mac OSX 系统默认是没有类似windows中的 tree命令,找到一条比较有意思的命令可以实现:
2 |
3 | > find . -print | sed -e 's;/*/;|;g;s;|; |;g'
4 |
5 | 为了方便使用,写一个alias 到~/.profile或者 ~/.bash_profile 里:
6 |
7 | > alias tree="find . -print | sed -e 's;/*/;|;g;s;|; |;g'"
8 |
9 | 写完之后记得`source ~/.profile`
--------------------------------------------------------------------------------
/操作系统相关/Mac/实用操作/Mac强制退出应用的六种方式.md:
--------------------------------------------------------------------------------
1 | **1**、使用键盘快捷键强制退出处于活跃状态的Mac程序
2 |
3 | 快捷键:Command+Option+Shift+Esc
4 |
5 | 这样按住一两秒钟,就可以强制退出当前程序了,算是最方便的一种方法。
6 |
7 | **2、打开强制退出程序窗口**
8 |
9 | 使用快捷键:Command+Option+Esc
10 |
11 | 来打开“强制退出应用程序”的窗口,然后选中你需要退出的程序,再点右下方的“强制退出”即可。
12 |
13 | **3、从Dock中强制退出程序**
14 |
15 | 按住Option然后右键点击程序在Dock中的图标,可以看到“强制退出”的选项,选择即可。
16 |
17 | **4、从左上角苹果菜单中强制退出程序**
18 |
19 | 这个有些类似第二条,从左上角的菜单中选择“强制退出”,不过有些时候程序当机,点击菜单会出现没反应的情况。
20 |
21 | **5、使用“活动监视器”强制退出程序**
22 |
23 | 在 应用程序-实用工具 中找到“活动监视器”,找到程序的名字然后选择左上方红色按钮强制退出程序,这个就有些类似Windows中的任务管理器了。如果上面的方法都不奏效,那么可以尝试这个方法。
24 |
25 | **6、使用终端命令强制退出程序**
26 |
27 | 这个应该算是重启电脑之前的最后办法了,在终端中输入如下命令
28 |
29 | killall [程序名称]
30 |
31 | 比如说强制退出Safari,就输入 killall Safari 再回车即可,这样有关Safari的全部进程就都退出了;如果你想分的细一些,可以通过 ps 或者 ps aux 命令查找某些单独的进行,然后使用 kill -9 [pid] 来单独结束某个进程。
32 |
33 | 很多情况下强制退出程序,之前的内容可能就会不在了,需要注意一下。
34 |
35 | 最后说说iOS设备上的强制退出程序方法:按住上方电源键,直到出现提示关机滑动条,这个时候放开电源键再按住Home键,直到程序退出
--------------------------------------------------------------------------------
/操作系统相关/Mac/实用操作/mac下安装wget命令.md:
--------------------------------------------------------------------------------
1 | > brew install wget
2 |
3 | 或者
4 |
5 |
6 |
7 | ```shell
8 | curl -O http://ftp.gnu.org/gnu/wget/wget-1.13.4.tar.gz
9 |
10 | tar xzvf wget-1.13.4.tar.gz
11 |
12 | cd wget-1.13.4
13 |
14 | ./configure --with-ssl=openssl
15 |
16 | sudo make
17 |
18 | sudo make install
19 |
20 | which wget #Should output: /usr/local/bin/wget
21 |
22 | ```
23 |
24 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/Alfred/Alfred 3 每次开机运行后都提示是否允许访问通讯录.md:
--------------------------------------------------------------------------------
1 | 和谐版的Alfred 3 在每次开机后,都会提示“是否允许访问通讯录”的弹窗,让人不胜其烦。
2 | 这是因为和谐片的App丢失了签名导致不会自动加入系统
3 |
4 | ### 处理方法
5 |
6 | 打开终端(或iTerm2)
7 |
8 | ```bash
9 | sudo codesign -f -d -s - /Applications/Alfred\ 3.app/Contents/Frameworks/Alfred\ Framework.framework/Versions/A/Alfred\ Framework
10 | ```
11 |
12 |
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/Alfred/Alfred Snippets文字扩展.md:
--------------------------------------------------------------------------------
1 | ## Mac效率神器Alfred系列教程---Snippets文字扩展
2 |
3 | Alfred文字片段和自动扩展
4 |
5 | 每天我们都要用Mac进行很多文字的输入,包括邮件、写作、通讯等等。在输入文字的过程中,往往有很多内容是需要经常重复输入的,比如一些常用用语、个人Email地址、邮件页面底端的公司个人信息等等。每次遇到要输入这些内容的时候,都需要重复输入相同的文本,不免有些浪费时间。Alfred的文字片段和自动扩展功能(Snippets and Text Expansion)就是为完美解决这个问题而设计的,让你仅仅只需输入某几个设定好的特定字符,就能扩展出完整的、冗长的常用字符串。
6 |
7 | Mac上有不少解决文字扩展之类问题的软件,比如TextExpander、Typinatord等,但这些都是付费软件,而且功能繁多,Alfred的文字自动扩展功能可以帮助很多非重度用户脱离这些付费软件的束缚。而且可以在Alfred中对每个Snippet进行分类,插入时间日期等等,并且可以很方便的与其他用户进行分享。
8 |
9 | Snippet的创建
10 |
11 | 关于如何创建自定义的Snippet,有两种方法:
12 |
13 | 1.通过Snippet设置面板创建
14 |
15 | 打开Alfred的Snippet设置面板,可以看到下方分为左右两个区域,左边为Snippet的分组,右边为每个分组下的具体文字Snippet。
16 |
17 | 
18 |
19 | 每个文字Snippet都要属于某一个分组,因此如果左边还没有建立分组的话,可以点击左侧面板下方的“+”按钮进行添加。点击后会弹出添加对话框,
20 |
21 | 
22 |
23 | Name:分组名字Affix:Snippet前缀。与后面描述的单独条目的Snippet Keyword一起组合成Snippet关键字;keyword:分组关键字,为可选项,如果输入了keyword,则会在单独条目关键字后面自动添加这个keyword;图标:分组的图标。这里最重要的是Affix选项,为Snippet的前缀,这个分组下的每个条目之前都会附加上这个前缀进行匹配。 分组创建成功之后,就可以在这个分组之下添加Snippet了。点击右下角的“+”进行条目的添加:
24 |
25 | 
26 |
27 | Name:条目名称Keyword:Snippet条目关键字Collection:条目所在的分组Snippet:需要进行对其进行扩展的完整文本内容Auto expansion allowed:允许自动扩展在这里输入Keyword关键字后,这个Snippet的缩略语就会变成“分组Affix + 条目Keyword + 分组keyword”。只要在任何地方输入这个组合,就能扩展出Snippet中定义的文本内容。
28 |
29 | 2.通过Clipboard创建
30 |
31 | 如果熟悉使用Clipboard剪切板历史记录,则可以通过Clipboard直接进行Snippet的创建。按下Clipboard的热键(默认为Command + Option + C)打开剪切板历史记录的面板,里面列出了所有进行过复制动作的文本条目。选中一个条目后,按下Command + S,就能弹出添加Snippet条目的对话框,重复上一步骤即可。
32 |
33 | 对Snippet关键字的建议
34 |
35 | 如前所述,只要定义好了Snippet条目,则在任何文本输入的地方输入“分组Affix + 条目Keyword + 分组keyword”,就能自动展开相应的文本片段。但是这个“Affix + Keyword”组合的定义最好也遵循一定的规则,要容易记忆、方便输入,但同时也不能与其他热键冲突。以下是关于怎样定义Affix和Keyword的几个建议:
36 |
37 | 在Keyword中不要使用正常词汇,以避免有些不期望的展开。比如如果你将Keyword定义为“apple”,则在任何输入“apple”的地方都会扩展成为定义好的文本片段,即使你想进行输入的就是“apple”这个单词本身。因此,最好能用一些特殊记法,比如将关键字每个单词的首字母捡出来连在一起等等;所有的snippet都要以非字母数字开头,比如感叹号,分号,冒号等等(类似于!!office,::coffee这样的);使用不常用的大写形式,比如“officE”;使用双重字母,比如“ttime”。动态占位符(Dynamic Placeholders)
38 |
39 | 什么是动态占位符
40 |
41 | 很多时候,你想在文本中插入一些特定的内容,但这些内容在每一次输入的时候都会有所不同,比如日期、时间、剪切板中的文本等等。使用动态占位符,就能在输入Snippets的时候,扩展出的文字根据具体的情况而变化。只需在编辑Snippets的时候,将相应的关键字放在{}内,比如{date},{time},{clipboard}。则当输入Snippets的时候,{}中的内容会自动转变为相应的动态内容,比如日期、时间、剪切板文本。
42 |
43 | 
44 |
45 | 显示日期时间
46 |
47 | 显示日期时间的占位符关键字有三个:
48 |
49 | {date}:显示当前日期{time}:显示当前时间{datetime}:显示当前日期和时间日期和时间都有short、medium、long和full这几种显示方式,Alfred默认的为midium。要想改变显示方式,只需在关键字后面接上相应的方式名称即可,例如“{date:long}”。这些显示方式的具体格式可以在Mac设置面板中的“时间&区域”中查看:
50 |
51 | 
52 |
53 | 不仅能显示当前时间,利用加减算数符号进行计算之后,还能显示过去或者未来的日期时间,比如{date +1D}会显示明天的日期,{time -3h -30m}会显示3个半小时之前的时间等等。支持的算子有以下几种:
54 |
55 | 1Y:年1M:月1D:天1h:小时1m:分钟1s:秒在用算式计算时间时,同时也能接上显示方式,按照需要的格式显示相应的日期时间,比如“{time -2h -20m:long}”,“{date -2m:short}”。
56 |
57 | 剪切板内容
58 |
59 | Mac剪切板历史功能可以记录下之前所有的复制功能,按下热键Command + Option + C就能打开历史记录面板。利用Snippet的“{clipboard}”这个占位符,可以动态获取剪切板中的内容,而且可以按照需要更改对应剪切文本的格式,在某些场合下使用会非常方便。
60 |
61 | 比如新建一个Snippet,关键字设为“!!testcp”,然后利用{clipboard}的位移功能来选择不同顺序的剪切板文本,需要注意的是,这里的位移首先是从数字0开始,而不是1,“{clipboard:0}”代表剪切板第一项内容,“{clipboard:1}”为第二项内容,“{clipboard:2}”为第三项,以此类推。{clipboard}和{clipboard:0}的意义相同。首先建立一个Snippet,
62 |
63 | 
64 |
65 | 然后对下面几行文本分别按顺序进行复制(括号中的内容不要进行复制)
66 |
67 | (第一行文本)小明(第二行文本)(第三行文本)18(第四行文本)华中科技大学之后按下Command + Option + C打开剪切板历史记录面板,你会看到刚刚复制过的几项文本都保存在其中了,
68 |
69 | 
70 |
71 | 现在按下刚才新建Snippet时设定好的关键字“!!testcp”,就会自动呈现以下内容:
72 |
73 | 用户信息: 名字: 小明 邮箱: 年龄: 18 毕业学校: 华中科技大学还可以加上一些转换命令,对剪切板中的文本进行格式转换:
74 |
75 | {clipboard:uppercase}:将文本全部转换为大写;{clipboard:lowercase}:将文本全部转换为小写;{clipboard:capitals}:将文本中每个单词的首字母变为大写。光标位置
76 |
77 | 利用{cursor}占位符,可以在输入Snippet扩展为对应文字后,光标自动定位到{cursor}在文本中的位置,方便之后对某些内容的输入。比如新建以下Snippet:
78 |
79 | 
80 |
81 | 当输入!!cursortest之后,Snippet中的文本会自动展开,之后光标位置会自动定位到{cursor}所在的位置,方便信息的输入,省去了还要再次操作鼠标进行光标定位的麻烦。
82 |
83 | 查看所有的Snippets
84 |
85 | 当你熟悉了Snippets的用法之后,会在工作学习中建立很多方便自己使用的Snippet关键字。当你记不清某些关键字的时候,可以用Snippet Viewer来进行查看和查询。启动Snippet View的方法有两种:
86 |
87 | 利用热键,可以在Snippet的设置面板中,对Viewer Hotkey进行设置;按下Command + Option + C打开剪切板历史记录面板,选择最上方的“All Snippets”。之后你就会看到所有的Snippet分组以及每个分组下的条目,在输入框中输入字符串可以进行过滤。
88 |
89 | 
90 |
91 | 更方便的是,打开Alfred输入框,利用“snip”关键字也能快捷的对Snippet进行查询,只需输入名字或者某些字符串即可。
92 |
93 | 
94 |
95 | 分享Snippet
96 |
97 | 当你创建了一个非常方便快捷的Snippet分组,也能将其分享出去,给其他Alfred用户使用。方法是右键单击某个Snippet分组,然后选择Export,就会将其导出成一个文件。其他用户只要双击这个Snippet文件就能将这个Snippet集合导入到自己的Alfred中。
98 |
99 | 
100 |
101 | Alfred也很贴心的为我们准备了一些很实用的Snippet集合,点击Snippet设置面板中的“Get Collections”按钮就能跳转到相应网页,
102 |
103 | 
104 |
105 | 其中包含了以下几个Snippet分组:
106 |
107 | Mac Symbols:集合了很多常用的Mac符号,比如输入“!!cmd”对应“”符号,“!!shift”对应“”符号等等。有了这个集合,就再也不用在符号表中辛辛苦苦去找某个Mac标志符号了;ASCII Art:集合了一些好玩的火星文字表情;Currency Symbols:集合了一些常用的货币符号,比如“::cny”代表“”,“::usd”代表“$”等等;Dynamic Content examples:一些关于动态占位符的例子,可以学习一下使用方法;Emoji Pack:很强大的Emoji表情包。有海量的Emoji符号,输入对应的关键字就能自动插入想要的Emoji表情,简直不要太方便,再也不用一个个翻页的去找了
108 |
109 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/Alfred/Alfred常用操作配置.md:
--------------------------------------------------------------------------------
1 | - 马化腾和张一鸣之间的论战,起源于张一鸣的挑衅:“微信的借口封杀、微视的抄袭搬运挡不住抖音的步伐”。一向低调的Pony马化腾直接回复:“可以理解为诽谤”。
2 |
3 | 
4 |
5 | 对此,腾讯集团市场与公关部副总经理李航在朋友圈称:“任何理性的探讨交流、批评指导都欢迎,但不接受不负责任的诽谤!”回应了张一鸣关于微视抄袭的不恰当言语。李航以及其背后腾讯的意思非常明白“不服的话欢迎在产品上比高低,来日方长;要诽谤就别怪送你上法庭,法庭上见高下”。
6 |
7 | 
8 |
9 | 回顾整个对话,马化腾和张一鸣此番唇舌之争看似是抖音在海外的数据,让张一鸣扬眉吐气占据了优势,但就两者对话的目的来看,张一鸣难免有小孩子想吃奶又怕被打的感觉。在与马化腾的对话中,张一鸣示弱说自己只是想“发个牢骚”,但还是被他们的公关给批评了。
10 |
11 | 另一张截图里,张一鸣也表示“如果不随便打压封杀应用和信息流动就是更值得尊敬的公司了”,言语中无不显示着愤慨和不满,以及深深的无奈。而对此,马化腾只轻描淡写回复了几个字:“平台一视同仁,你过敏了”。
12 |
13 | 
14 |
15 | 的确,张一鸣“过敏”了,也焦虑了。
16 |
17 | 自4月2日,微视品牌升级之后,抖音的对手,就不仅仅是快手了,还要面对无论资金还是流量亦或是内容都呈倍数压制的腾讯,这对尚未盈利、还需融资的今日头条来说是一个坏消息。张一鸣朋友圈的言论,无不透露出重压之下带来的口不择言与焦虑。
18 |
19 | 虚火难调的背后是资源较量
20 |
21 | 短视频的火爆有目共睹,很多人都想插上一脚,不过碍于监管的日益收紧,谁也不敢贸贸然砸入重金,毕竟这也是一个前途未卜且烧钱的行业。因此,被视为今日头条下一个摇钱树的抖音在重金和流量的宠幸之下,加之没有大资本的介入,幸运的突出了重围。在短短的一年之内达到这样的成就,张一鸣击掌相庆也算是情有可原。
22 |
23 | 但从数据上看,抖音难免有些“虚火旺盛”。
24 |
25 | 根据第三方数据研究机构QuestMobile近日发布的《2018中国移动互联网春季报告》,3月快手的MAU为2.3亿,抖音为1.2亿,火山小视频和西瓜视频均为1.1亿,约为快手的一半。从月活上看,快手也依然以22998.5万的巨大优势遥遥领先抖音,依然是短视频领域的霸主。
26 |
27 | 
28 |
29 | 而微视的回归,将严重冲击甚至打碎张一鸣以短视频矩阵缔造短视频第一阵营的美梦,这也正是张一鸣口不择言背后深深的担忧。
30 |
31 | 数据显示,从去年回归后,微视经过产品功能迭代、资源整合,同时在春节期间推广微视红包,带来一波大的增量,月活用户规模增长迅速。而在互联网圈,从来不缺优秀的技术和产品开发人员,缺的是流量和资本。正如业内人士所说,“没有钱,就是做出精美不逊贾老板的PPT,也是分分钟就死。有了钱,就是一辆看不出盈利模式的自行车,也能烧出几十亿美元的估值。”
32 |
33 | 张一鸣最缺的是什么?尚未盈利又频遭监管部门点名的今日头条和抖音,无不暴露出其在钱、人脉上的短板。而近期又有今日头条的内容创作者反映,今日头条将流量导入给新兴业务,其本身的流量却下滑了80%之多。拆了东墙补西墙的做法,早已让今日头条因流量互导陷入内部纷争的窘境。加上众人所知的“没有价值观”一说,今日头条品牌声誉已一跌再跌。
34 |
35 | 
36 |
37 | 而今日头条所欠缺的,腾讯都已经为微视准备好了。在内容上,微视整合腾讯平台音乐、游戏、动漫、影视、综艺等,为用户提供玩法和素材。QQ音乐正版曲库、腾讯游戏的热门IP都有望挖掘短视频的新玩法和交互体验。
38 |
39 | 流量上,QQ空间为微视提供了流量支持,微视的优质视频内容会输送到QQ空间,供空间的用户消费;在原创达人引进及培养方面,微视与企鹅号有密切的合作,2018年企鹅号将重点扶持短视频内容,而依托于企鹅号,微视也会让内容创作者实现分成收益。
40 |
41 | 更重要的是,快手也被腾讯收入麾下,前有行业霸主快手占尽风光,后被命运宠儿微视追赶,腾讯双刃作战让张一鸣和今日头条难以招架。这也就不难解释,为什么在抖音Tiktok Q1苹果商店下载全球第一的情况下,张一鸣还是对腾讯“过敏”了。
42 |
43 | “应激”反应后,公关再漂亮不如产品赢得用户心
44 |
45 | 在《腾讯没有梦想》席卷朋友圈的时候,张一鸣转发《谁说腾讯没有梦想?》一文力挺腾讯。紧接着,便有业内人士和今日头条认证员工在不同渠道爆料,这是张一鸣和他的公关团队自导自演的“一出好戏”。知名自媒体人王斌分析认为,《腾讯没有梦想》一文存在明显的操作痕迹,并且路径十分清晰。
46 |
47 | 
48 |
49 | 不过,对于一个企业来说,公关做得再漂亮,生存之本仍然是产品和服务,今日头条也不例外。这也就是为什么马化腾不愿在这种问题上多费口舌、李航为什么会呼吁“原创保护是所有内容平台都共同面临的难题,希望大家多些理性交流和建设性意见”,而不去参与口水之争的原因。
50 |
51 | 从两者对于平台发展远见的对话上,胸襟和眼光高下立判。
52 |
53 | 本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/Automator自动处理/Aotomator将PPT批量转为PDF.md:
--------------------------------------------------------------------------------
1 | 1. 新建 automator 工作流程
2 | 
3 | 2. 将待转换文件拖入到操作框中
4 | 
5 | 3. 添加==运行AppleScript==到操作框
6 | 
7 | 4. 将下列代码复制到 AppleScript 中
8 |
9 | ```javascript
10 | on run {input, parameters}
11 | set theOutput to {}
12 | tell application "Microsoft PowerPoint" -- work on version 15.15 or newer
13 | launch
14 | set theDial to start up dialog
15 | set start up dialog to false
16 | repeat with i in input
17 | open i
18 | set pdfPath to my makeNewPath(i)
19 | save active presentation in pdfPath as save as PDF -- save in same folder
20 | close active presentation saving no
21 | set end of theOutput to pdfPath as alias
22 | end repeat
23 | set start up dialog to theDial
24 | end tell
25 | return theOutput
26 | end run
27 |
28 | on makeNewPath(f)
29 | set t to f as string
30 | if t ends with ".pptx" then
31 | return (text 1 thru -5 of t) & "pdf"
32 | else
33 | return t & ".pdf"
34 | end if
35 | end makeNewPath
36 | ```
37 |
38 | 5 点击运行
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/Homebrew/HomeBrew说明.md:
--------------------------------------------------------------------------------
1 | # Homebrew
2 |
3 | ## 简介
4 |
5 | macOS 缺失的软件包管理器。使用 Homebrew 安装 Apple 没有预装但 [你需要的东西](https://github.com/Homebrew/homebrew-core/tree/master/Formula)。[官网](https://brew.sh/)有中文说明。
6 |
7 | ## 安装与配置
8 |
9 | Homebrew 的安装非常简单,将下面这条命令粘贴到终端:
10 |
11 | ```
12 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
13 | ```
14 |
15 | 等待命令执行完毕。其他配置见[官网中文说明](https://brew.sh/index_zh-cn.html)。
16 |
17 | ## 常用命令
18 |
19 | 1. `brew help` 查看帮助
20 | 2. `brew install ` 安装软件包
21 | 3. `brew uninstall ` 卸载软件包
22 | 4. `brew list [--versions]` 列出已安装的软件包(包括版本)
23 | 5. `brew search ` 查找软件包
24 | 6. `brew info ` 查看软件包信息
25 | 7. `brew update` 更新brew
26 | 8. `brew outdated` 列出过时的软件包(已安装但不是最新版本)
27 | 9. `brew upgrade []` 更新过时的软件包(不指定软件包表示更新全部)
28 | 10. `brew doctor` 检查brew运行状态
29 |
30 | ## 常用软件
31 |
32 | ```
33 | brew install wget
34 | brew install curl
35 | brew install openssl
36 |
37 | brew install fish #安装fish shell
38 | brew install git-flow #安装git-flow
39 | brew install python #安装python
40 | ```
41 |
42 | ## Homebrew-Cask
43 |
44 | Homebrew-Cask 是 Homebrew 的一个扩展。它能够优雅、简单、快速的安装和管理 macOS 图形界面程序,比如Google Chrome 和Dropbox等等。官网 [https://caskroom.github.io/。](https://caskroom.github.io/%E3%80%82)
45 |
46 | ### Cask 必装的理由
47 |
48 | 有图形界面的软件可以直接在 App Stroe 中下载更新,为啥还需要 Cask 呢?因为有的很好用的免费 Mac 软件并没有选择在 App Store 上架,对于没有上架的软件我们只能是通过搜索找到官网然后在下载安装包,这样不够优雅也不方便管理,而使用 Cask 可以通过一行命令就搞定安装了,还可以统一更新升级所有的软件,实现从非 App Store 途径安装的软件的统一管理。
49 | Cask 从软件官方网站下载软件包,然后在后台安装并将 `.app` 移动到 `Applications`。通过 Cask 安装的软件也会在 Lanuchpad 显示,跟从 App Store 安装的软件没啥区别。对于那些收费的软件,用 Cask 安装只是比普通安装方法节省了时间和步骤,没啥其他的区别。
50 |
51 | ### Cask 常用命令
52 |
53 | 1. `brew cask -help` 查看帮助
54 | 2. `brew cask install ` 安装软件
55 | 3. `brew cask uninstall ` 卸载软件
56 | 4. `brew cask search ` 搜索软件
57 | 5. `brew cask info ` 查看软件相关信息
58 | 6. `brew cask list` 列出通过 Homebrew-Cask 安装的包
59 |
60 | > 经过测试,虽然 `-help` 是未知命令,但是仍然可查看 Cask 的命令,其他帮助命令(如 `brew cask -h` 和 `brew cask --help`)好像都不行。还有其他的命令就不一一介绍了,其他命令可以通过`brew cask -help`查看。
61 |
62 | ### Cask 常用软件
63 |
64 | ```
65 | brew cask install iterm2 #安装iTerm 2
66 | brew cask install launchrocket #管理软件后台服务
67 | brew cask install google-chrome #安装Chrome
68 | brew cask install the-unarchiver #解压软件
69 | brew cask install alfred #效率软件
70 | brew cask install qq #腾讯QQ
71 | brew cask install evernote #云笔记软件
72 | brew cask install sublime-text #文本编辑器
73 | brew cask install skitch #ervernote配套的截图软件
74 | brew cask install dropbox #文件同步软件
75 | brew cask install zotero #网页收藏与文献管理软件
76 | brew cask install anki #记忆软件
77 | brew cask install virtualbox #虚拟机,可以装个Windows
78 | brew cask install self-control #避免分心的软件
79 | brew cask install vlc #视频软件
80 | brew cask install appcleaner #应用清理
81 |
82 | #Quick Look 系列
83 | brew cask install qlcolorcode #预览脚本时自动代码配色
84 | brew cask install qlstephen #预览未知拓展名的纯文本文件
85 | brew cask install qlmarkdown #预览Markdown文件
86 | brew cask install quicklook-json #预览JSON文件
87 | brew cask install quicklook-csv #预览CSV文件
88 | ```
89 |
90 | Homebrew-Cask 是一个开源项目,其详细信息可以看[其开源项目介绍](https://github.com/caskroom/homebrew-cask),所支持的软件列表在这里: 。
91 | 如果觉得管理软件在后台运行的服务很麻烦,可以装个[LaunchRocket](https://github.com/jimbojsb/launchrocket),这也是个开源项目。
92 | 关于 Quick Look 的介绍可以看这篇文章[加强你的「一指禅」:Mac QuickLook「快速预览」兼容性扩展教程](https://sspai.com/post/31927),同时[Quick Look plugins](https://github.com/sindresorhus/quick-look-plugins)这个开源项目列出了所有支持 Homebrew-Cask 的 Quick Look 扩展,据说支持的都是程序员必备。
93 |
94 | ## 轻松实现一键装机
95 |
96 | 在使用 Mac 的过程中,总想着有没有方便、简单的办法实现在不同Mac 上同步开发环境的办法,今天在整理 Homebrew 使用笔记的时候突然冒出一个想法,如果我把所有的 Homebrew 安装命令列成一个清单形式,当在另一台新的 Mac 上工作时,那么就可以先装一个 Homebrew 然后将命令清单中的所有命令复制粘贴到终端中,等待命令执行完毕后,新的 Mac 的大部分开发环境就跟常用的 Mac 开发环境一致了。下面列出笔者的常用命令清单:
97 |
98 | ```
99 | #安装 Homebrew
100 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
101 |
102 | #安装基础套件
103 | brew install fish #安装fish shell
104 | brew install git-flow #安装git-flow
105 | brew install python #安装python
106 |
107 | #Homebrew-Cask
108 | brew tap caskroom/cask
109 |
110 | # 安装Cask基础软件
111 | brew cask install iterm2 #安装iTerm 2
112 | brew cask install visual-studio-code#微软出品的文本编辑器,可替代 Sublime Text
113 | brew cask install google-chrome #安装Chrome
114 | brew cask install the-unarchiver #解压软件
115 | brew cask install alfred #效率软件
116 | brew cask install qq #腾讯QQ
117 | brew cask install sourcetree #Git GUI 客户端
118 | brew cask install cheatsheet # 显示当前程序的快捷键列表,默认的快捷键是长按⌘
119 | ```
120 |
121 | 这份清单会随着我对 Mac 的不断深入了解而持续更新,欢迎关注 [Sheh 伟伟的个人博客](https://davidsheh.github.io/)。
122 |
123 | ## 参考资料
124 |
125 | [Mac 开发配置手册](https://aaaaaashu.gitbooks.io/mac-dev-setup/content/Homebrew/index.html)
126 |
127 | ------
128 |
129 | **同系列文章**
130 |
131 | [Mac开发必备工具(一)—— Homebrew](http://davidsheh.github.io/2017/08/26/mac-homebrew/)
132 |
133 | [Mac开发必备工具(二)—— iTerm 2](http://davidsheh.github.io/2017/08/27/mac-iterm2/)
134 |
135 | [Mac开发必备工具(三)—— Fish shell](http://davidsheh.github.io/2017/08/28/mac-fishshell/)
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/INNA/INNA.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | 【写在开头】
12 |
13 | > 我在一开始安装IINA的时候也是出现题主的问题,但是通过加群(142730636)请教了群主大大(也就是本软件的开发作者)后,他耐心细心的指导让我一步一步成功实现了用IINA在线观看视频!!!再次表白感谢作者大大 [@大型强子对撞机](http://www.zhihu.com/people/7a259628c35c76c8347053f57c504655)!!!
14 |
15 | 涉及:MAC电脑,homebrew, youtube-dl, IINA
16 |
17 | 关于IINA:
18 |
19 | - 官网下载链接:
20 |
21 | https://lhc70000.github.io/iina/zh-cn/lhc70000.github.io
22 |
23 | - 作者知乎专栏:
24 |
25 | 大型强子对撞机:IINA 向「现代 macOS 播放器」的目标又进了一步zhuanlan.zhihu.com
26 |
27 | 【正文】
28 |
29 | 一、安装 homebrew
30 |
31 | - 官网:[https://brew.sh](https://link.zhihu.com/?target=https%3A//brew.sh)
32 | - 打开苹果终端,在终端输入
33 |
34 | ```
35 | - /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
36 | ```
37 |
38 | - 回车
39 | - 等待程序处理(这个安装过程较长,请耐心等待),直至显示
40 |
41 | ```
42 | rollerdeMacBook—Pro : roller$
43 | ```
44 |
45 | (roller是我的电脑名称)
46 |
47 | 二、安装 youtube-dl
48 |
49 | - 在终端输入
50 |
51 | ```
52 | brew install youtube-dl
53 | ```
54 |
55 | - 回车
56 | - 等待程序处理,直至显示
57 |
58 | ```
59 | rollerdeMacBook—Pro : roller$
60 | ```
61 |
62 | (roller是我的电脑名称)
63 |
64 | 三、设置IINA
65 |
66 | - IINA的偏好设置----网络----youtube-dl----启用youtube-dl----自定义youtube----dl路径:/usr/local/bin ----回车
67 |
68 | <img src="https://pic3.zhimg.com/50/v2-21b4f955e09c9a6848c17b83d73c2505_hd.jpg" data-caption="" data-size="normal" data-rawwidth="988" data-rawheight="1046" class="origin_image zh-lightbox-thumb" width="988" data-original="https://pic3.zhimg.com/v2-21b4f955e09c9a6848c17b83d73c2505_r.jpg">
69 |
70 | - 重启
71 | - 下载youtube-dl插件(safari/chrome)
72 |
73 | <img src="https://pic4.zhimg.com/50/v2-1af28594bca41fa8ccfec1b3f9ac46f6_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1172" data-rawheight="634" class="origin_image zh-lightbox-thumb" width="1172" data-original="https://pic4.zhimg.com/v2-1af28594bca41fa8ccfec1b3f9ac46f6_r.jpg">
74 |
75 | - 下载后打开安装到扩展中(记得点系统偏好设置-安全性与隐私-锁的图标)
76 |
77 | <img src="https://pic3.zhimg.com/50/v2-e9e9858cd55e0cb2b2d19a10bbfde8b1_hd.jpg" data-caption="" data-size="normal" data-rawwidth="1336" data-rawheight="1086" class="origin_image zh-lightbox-thumb" width="1336" data-original="https://pic3.zhimg.com/v2-e9e9858cd55e0cb2b2d19a10bbfde8b1_r.jpg">
78 |
79 | - 打开一个视频网站,会发现页面地址栏有一个小图标
80 |
81 | <img src="https://pic3.zhimg.com/50/v2-959a0c336cb0ba66e0ab499fcec13837_hd.jpg" data-caption="" data-size="normal" data-rawwidth="120" data-rawheight="74" class="content_image" width="120">
82 |
83 | 点击它,并允许打开IINA,等待加载后就可以在IINA里观看无广告的视频啦~~!!
84 |
85 | PS:目前可用的视频网站有:Youtube, 优酷,Blibli (爱奇艺、腾讯、Acfun不可以)
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/Numbers/Numbers使用技巧总结.md:
--------------------------------------------------------------------------------
1 | # 拖动行列
2 |
3 | 移动行:选择行后,点按住某个所选行号直至行在表格中浮起,然后将它们拖到另一行的上方或下方。
4 |
5 | 移动列:选择列后,点按住某个所选列字母直至列在表格中浮起,然后将它们拖到另一列的右侧或左侧。
6 |
7 | 【提示】如果将行或列拖到现有表格的外部,则将创建包含它们的新表格。
8 |
9 | # 拖动单元格
10 |
11 | 长按选择,出现浮动即可拖动
12 |
13 | # 显示当前鼠标所在行
14 |
15 | 按住`⌥`键即可
16 |
17 | # 快速跳转到表格边界
18 |
19 | ⌘+上下左右键
20 |
21 | 适用于系统级别
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/Safari/Mac 加速浏览器访问GitHub速度.md:
--------------------------------------------------------------------------------
1 | - 首先打开站长工具,测试一下最优的DNS
2 |
3 | [打开Dns检测|Dns查询 - 站长工具](http://tool.chinaz.com/dns?type=1&host=github.com&ip=)
4 |
5 | 监测结果类似如下:
6 |
7 | 
8 |
9 | 发现这个访问速度很快
10 |
11 | - 编辑host文件
12 |
13 | - `sudo vim /etc/hosts` 然后在最后一行加入:
14 |
15 | 
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/iTem2/iTem2快捷键大全.md:
--------------------------------------------------------------------------------
1 | # iTerm2 快捷键大全
2 |
3 | )
4 |
5 | ## 标签
6 |
7 | ```
8 | 新建标签:command + t
9 |
10 | 关闭标签:command + w
11 |
12 | 切换标签:command + 数字 command + 左右方向键
13 |
14 | 切换全屏:command + enter
15 |
16 | 查找:command + f
17 | ```
18 |
19 | ## 分屏
20 |
21 | ```
22 | 垂直分屏:command + d
23 |
24 | 水平分屏:command + shift + d
25 |
26 | 切换屏幕:command + option + 方向键 command + [ 或 command + ]
27 |
28 | 查看历史命令:command + ;
29 |
30 | 查看剪贴板历史:command + shift + h
31 | ```
32 |
33 | ## 其他
34 |
35 | - 清除当前行:`ctrl + u`
36 | - 到行首:ctrl + a
37 | - 到行尾:ctrl + e
38 | - 前进后退:ctrl + f/b (相当于左右方向键)
39 | - 上一条命令:ctrl + p
40 | - 搜索命令历史:`ctrl + r`
41 | - 删除当前光标的字符:ctrl + d
42 | - 删除光标之前的字符:ctrl + h
43 | - 删除光标之前的单词:ctrl + w
44 | - 删除到文本末尾:ctrl + k
45 | - 交换光标处文本:ctrl + t
46 | - 清屏1:`command + r`
47 | - 清屏2:ctrl + l
48 |
49 | 自带有哪些很实用的功能/快捷键
50 | - ⌘ + 数字在各 tab 标签直接来回切换
51 | - 选择即复制 + 鼠标中键粘贴,这个很实用
52 | - ⌘ + f 所查找的内容会被自动复制
53 | - ⌘ + d 横着分屏 / ⌘ + shift + d 竖着分屏
54 | - ⌘ + r = clear,而且只是换到新一屏,不会想 clear 一样创建一个空屏
55 | - ctrl + u 清空当前行,无论光标在什么位置
56 | - 输入开头命令后 按 ⌘ + ; 会自动列出输入过的命令
57 | - ⌘ + shift + h 会列出剪切板历史
58 | ```
59 | 可以在 Preferences > keys 设置全局快捷键调出 iterm,这个也可以用过 Alfred 实现
60 | ```
61 |
62 | ## 常用的一些快捷键
63 |
64 | ```
65 | ⌘ + 1 / 2 左右 tab 之间来回切换,这个在 前面 已经介绍过了
66 |
67 | ⌘← / ⌘→ 到一行命令最左边/最右边 ,这个功能同 C+a / C+e
68 |
69 | ⌥← / ⌥→ 按单词前移/后移,相当与 C+f / C+b,其实这个功能在Iterm中已经预定义好了,⌥f / ⌥b,看个人习惯了
70 |
71 | 好像就这几个
72 |
73 | 设置方法如下
74 |
75 | 当然除了这些可以自定义的也不能忘了 linux 下那些好用的组合
76 |
77 | C+a / C+e 这个几乎在哪都可以使用
78 |
79 | C+p / !! 上一条命令
80 |
81 | C+k 从光标处删至命令行尾 (本来 C+u 是删至命令行首,但iterm中是删掉整行)
82 |
83 | C+w A+d 从光标处删至字首/尾
84 |
85 | C+h C+d 删掉光标前后的自负
86 |
87 | C+y 粘贴至光标后
88 |
89 | C+r 搜索命令历史,这个较常用
90 | ```
91 |
92 | ## 选中即复制
93 |
94 | #### iterm2 有 2 种好用的选中即复制模式。
95 |
96 | - 一种是用鼠标,在 iterm2 中,选中某个路径或者某个词汇,那么,iterm2 就自动复制了。
97 | - 另一种是无鼠标模式,`command+f`,弹出 iterm2 的查找模式,输入要查找并复制的内容的前几个字母,确认找到的是自己的内容之后,输入 `tab`,查找窗口将自动变化内容,并将其复制。如果输入的是 `shift+tab`,则自动将查找内容的左边选中并复制。
98 |
99 | ## 自动完成
100 |
101 | 输入打头几个字母,然后输入 `command+`; iterm2 将自动列出之前输入过的类似命令。
102 |
103 | ## 剪切历史
104 |
105 | 输入 `command+shift+h`,iterm2 将自动列出剪切板的历史记录。如果需要将剪切板的历史记录保存到磁盘,在 `Preferences > General > Save copy/paste history to disk` 中设置。
--------------------------------------------------------------------------------
/操作系统相关/Mac/软件使用/iTem2/iTerm2 SSH快捷登录.md:
--------------------------------------------------------------------------------
1 | # iTerm2 ssh快捷登录
2 |
3 | ssh连接命令:`ssh -p端口号 用户名@服务地址`,例如:ssh -p22 root@172.16.1.21,然后输入密码即可。但是每次这么输入感觉太麻烦,我们可以把相关信息保存,然后自动选择连接。
4 |
5 | 编辑以下脚本并保存:
6 |
7 | ```
8 | #!/usr/bin/expect -f
9 | set host 服务器地址
10 | set port 端口
11 | set user 用户名
12 | set password 用户密码
13 | set timeout -1
14 |
15 | spawn ssh -p$port $user@$host
16 | expect "assword:"
17 | send "$password\r"
18 | interact
19 | expect eof
20 | ```
21 |
22 |
23 |
24 | **语法说明**:
25 |
26 | 上面的set 是定义变量
27 |
28 | 下方的 spawn是调用命令,在命令中使用上述定义好的变量
29 |
30 | ## iTerm设置部分
31 |
32 | iTerm -- preferences 打开设置界面
33 |
34 | 
35 |
36 | 
37 |
38 | 然后直接连接即可
--------------------------------------------------------------------------------
/操作系统相关/Mac/问题解决/Mac 每次都要执行source ~.bash_profile 配置的环境变量才生效.md:
--------------------------------------------------------------------------------
1 | 在 ~/.bash_profile 中配置环境变量, 可是每次重启终端后配置的不生效.需要重新执行 : `$source ~/.bash_profile`
2 |
3 | 发现zsh加载的是 ~/.zshrc文件,而 ‘.zshrc’ 文件中并没有定义任务环境变量。
4 |
5 | **解决办法**
6 |
7 | 在~/.zshrc文件最后,增加一行:
8 |
9 | > source ~/.bash_profile
10 |
11 | 然后再:
12 |
13 | > source ~/.zshrc
14 |
15 |
--------------------------------------------------------------------------------
/组件/Nginx/2、Nginx在CentsOS安装.md:
--------------------------------------------------------------------------------
1 | ## Nginx 安装
2 |
3 | 系统平台:`CentOS release 6.6 (Final)` 64位。
4 |
5 | ### 一、安装编译工具及库文件
6 |
7 | ```
8 | yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
9 | ```
10 |
11 | ### 二、首先要安装 PCRE
12 |
13 | PCRE 作用是让 Nginx 支持 Rewrite 功能。
14 |
15 | 1、下载 PCRE 安装包,下载地址:
16 |
17 | ```
18 | [root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
19 | ```
20 |
21 | 2、解压安装包:
22 |
23 | ```
24 | [root@bogon src]# tar zxvf pcre-8.35.tar.gz
25 | ```
26 |
27 | 3、进入安装包目录
28 |
29 | ```
30 | [root@bogon src]# cd pcre-8.35
31 | ```
32 |
33 | 4、编译安装
34 |
35 | ```
36 | [root@bogon pcre-8.35]# ./configure
37 | [root@bogon pcre-8.35]# make && make install
38 | ```
39 |
40 | 5、查看pcre版本
41 |
42 | ```
43 | [root@bogon pcre-8.35]# pcre-config --version
44 | ```
45 |
46 | ### 安装 Nginx
47 |
48 | 1、下载 Nginx,下载地址:
49 |
50 | ```
51 | [root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
52 | ```
53 |
54 | 2、解压安装包
55 |
56 | ```
57 | [root@bogon src]# tar zxvf nginx-1.6.2.tar.gz
58 | ```
59 |
60 | 3、进入安装包目录
61 |
62 | ```
63 | [root@bogon src]# cd nginx-1.6.2
64 | ```
65 |
66 | 4、编译安装
67 |
68 | ```
69 | [root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
70 | [root@bogon nginx-1.6.2]# make
71 | [root@bogon nginx-1.6.2]# make install
72 | ```
73 |
74 | 5、查看nginx版本
75 |
76 | ```
77 | [root@bogon nginx-1.6.2]# /usr/local/webserver/nginx/sbin/nginx -v
78 | ```
79 |
80 | 到此,nginx安装完成。
81 |
82 | ------
83 |
84 | ## Nginx 配置
85 |
86 | 创建 Nginx 运行使用的用户 www:
87 |
88 | ```
89 | [root@bogon conf]# /usr/sbin/groupadd www
90 | [root@bogon conf]# /usr/sbin/useradd -g www www
91 | ```
92 |
93 | 配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容
94 |
95 | ```properties
96 | [root@bogon conf]# cat /usr/local/webserver/nginx/conf/nginx.conf
97 |
98 | user www www;
99 | worker_processes 2; #设置值和CPU核心数一致
100 | error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
101 | pid /usr/local/webserver/nginx/nginx.pid;
102 | #Specifies the value for maximum file descriptors that can be opened by this process.
103 | worker_rlimit_nofile 65535;
104 | events
105 | {
106 | use epoll;
107 | worker_connections 65535;
108 | }
109 | http
110 | {
111 | include mime.types;
112 | default_type application/octet-stream;
113 | log_format main '$remote_addr - $remote_user [$time_local] "$request" '
114 | '$status $body_bytes_sent "$http_referer" '
115 | '"$http_user_agent" $http_x_forwarded_for';
116 |
117 | #charset gb2312;
118 |
119 | server_names_hash_bucket_size 128;
120 | client_header_buffer_size 32k;
121 | large_client_header_buffers 4 32k;
122 | client_max_body_size 8m;
123 |
124 | sendfile on;
125 | tcp_nopush on;
126 | keepalive_timeout 60;
127 | tcp_nodelay on;
128 | fastcgi_connect_timeout 300;
129 | fastcgi_send_timeout 300;
130 | fastcgi_read_timeout 300;
131 | fastcgi_buffer_size 64k;
132 | fastcgi_buffers 4 64k;
133 | fastcgi_busy_buffers_size 128k;
134 | fastcgi_temp_file_write_size 128k;
135 | gzip on;
136 | gzip_min_length 1k;
137 | gzip_buffers 4 16k;
138 | gzip_http_version 1.0;
139 | gzip_comp_level 2;
140 | gzip_types text/plain application/x-javascript text/css application/xml;
141 | gzip_vary on;
142 |
143 | #limit_zone crawler $binary_remote_addr 10m;
144 | #下面是server虚拟主机的配置
145 | server
146 | {
147 | listen 80;#监听端口
148 | server_name localhost;#域名
149 | index index.html index.htm index.php;
150 | root /usr/local/webserver/nginx/html;#站点目录
151 | location ~ .*\.(php|php5)?$
152 | {
153 | #fastcgi_pass unix:/tmp/php-cgi.sock;
154 | fastcgi_pass 127.0.0.1:9000;
155 | fastcgi_index index.php;
156 | include fastcgi.conf;
157 | }
158 | location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
159 | {
160 | expires 30d;
161 | # access_log off;
162 | }
163 | location ~ .*\.(js|css)?$
164 | {
165 | expires 15d;
166 | # access_log off;
167 | }
168 | access_log off;
169 | }
170 |
171 | }
172 | ```
173 |
174 | 检查配置文件ngnix.conf的正确性命令:
175 |
176 | ```
177 | [root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -t
178 | ```
179 |
180 | ------
181 |
182 | ## 启动 Nginx
183 |
184 | Nginx 启动命令如下:
185 |
186 | ```
187 | [root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx
188 | ```
189 |
190 | ------
191 |
192 | ## 访问站点
193 |
194 | 从浏览器访问我们配置的站点ip:
195 |
196 | ------
197 |
198 | ## Nginx 其他命令
199 |
200 | 以下包含了 Nginx 常用的几个命令:
201 |
202 | ```
203 | /usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件
204 | /usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx
205 | /usr/local/webserver/nginx/sbin/nginx -s stop # 停止 Nginx
206 | ```
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 | 参考:
215 |
216 |
217 | https://www.jianshu.com/p/d5114a2a2052
218 |
219 | https://blog.csdn.net/mulangren1988/article/details/59104415
220 |
221 | http://www.runoob.com/linux/nginx-install-setup.html
222 |
223 | https://www.zhihu.com/question/20092756
224 |
225 | https://blog.csdn.net/finded/article/details/51889588
226 |
227 | - [CentOS 7 下安装 Nginx](https://www.linuxidc.com/Linux/2016-09/134907.htm)
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 | -------
241 |
242 | zlib:
243 |
244 | wget http://www.zlib.net/zlib-1.2.11.tar.gz
245 |
246 | 首先安装必要的库(nginx 中gzip模块需要 zlib 库,rewrite模块需要 pcre 库,ssl 功能需要openssl库)。选定**/usr/local**为安装目录,以下具体版本号根据实际改变。
247 |
248 | 1.安装PCRE库
249 |
250 | ```
251 | $ cd /usr/local/
252 | $ sudo wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz
253 | $ sudo tar -zxvf pcre-8.36.tar.gz
254 | $ cd pcre-8.36
255 | $ sudo ./configure
256 | $ sudo make
257 | $ sudo make install
258 | ```
259 |
260 | 2.安装zlib库
261 |
262 | ```
263 | $ cd /usr/local/
264 | $ sudo wget http://zlib.net/zlib-1.2.8.tar.gz
265 | $ sudo tar -zxvf zlib-1.2.8.tar.gz
266 | $ cd zlib-1.2.8
267 | $ sudo ./configure
268 | $ sudo make
269 | $ sudo make install
270 | ```
271 |
272 | 3.安装ssl
273 |
274 | ```
275 | $ cd /usr/local/
276 | $ sudo wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
277 | $ sudo tar -zxvf openssl-1.0.1j.tar.gz
278 | $ sudo ./config
279 | $ sudo make
280 | $ sudo make install
281 | ```
282 |
283 | 4.安装nginx
284 |
285 | ```
286 | $ cd /usr/local/
287 | $ sudo wget http://nginx.org/download/nginx-1.8.0.tar.gz
288 | $ sudo tar -zxvf nginx-1.8.0.tar.gz
289 | $ cd nginx-1.8.0
290 | $ sudo ./configure --prefix=/usr/local/nginx #这一步需要按需要添加编译参数,如下
291 | $ sudo make
292 | $ sudo make install
293 | ```
294 |
295 | 如果是使用安装包编译的上面几个依赖,需要在在--prefix后面接以下命令:
296 |
297 | ```
298 | --with-pcre=/usr/local/pcre-8.36 指的是pcre-8.36 的源码路径。
299 | --with-zlib=/usr/local/zlib-1.2.8 指的是zlib-1.2.8 的源码路径。
300 | ```
--------------------------------------------------------------------------------
/组件/Nginx/3、Nginx使用详细笔记.md:
--------------------------------------------------------------------------------
1 | # Nginx安装配置使用详细笔记前言
2 |
3 | 选择Nginx的优点:
4 | Nginx 可以在大多数 Unix like OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。
5 | Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性。
6 | 在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。
7 |
8 | CentOS6.2实战部署Nginx+MySQL+PHP [http://www.linuxidc.com/Linux/2013-09/90020.htm](https://www.linuxidc.com/Linux/2013-09/90020.htm)
9 |
10 | 使用Nginx搭建WEB服务器 [http://www.linuxidc.com/Linux/2013-09/89768.htm](https://www.linuxidc.com/Linux/2013-09/89768.htm)
11 |
12 | 搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程 [http://www.linuxidc.com/Linux/2013-09/89692.htm](https://www.linuxidc.com/Linux/2013-09/89692.htm)
13 |
14 | CentOS 6.3下Nginx性能调优 [http://www.linuxidc.com/Linux/2013-09/89656.htm](https://www.linuxidc.com/Linux/2013-09/89656.htm)
15 |
16 | CentOS 6.3下配置Nginx加载ngx_pagespeed模块 [http://www.linuxidc.com/Linux/2013-09/89657.htm](https://www.linuxidc.com/Linux/2013-09/89657.htm)
17 |
18 | CentOS 6.4安装配置Nginx+Pcre+php-fpm [http://www.linuxidc.com/Linux/2013-08/88984.htm](https://www.linuxidc.com/Linux/2013-08/88984.htm)
19 |
20 | Nginx搭建视频点播服务器(仿真专业流媒体软件) [http://www.linuxidc.com/Linux/2012-08/69151.htm](https://www.linuxidc.com/Linux/2012-08/69151.htm)
21 |
22 |
23 | **查看进程数**
24 |
25 | 进程数是与top出来的cpu数量是一样的。在/usr/local/nginx/conf/nginx.conf配置文件里面的worker_processes参数。
26 | worker_processes指明了nginx要开启的进程数,据官方说法,一般开一个就够了,多开几个,可以减少机器io带来的影响。据实践表明,nginx的这个参数在一般情况下开4个或8个就可以了,再往上开的话优化不太大。据另一种说法是,nginx开启太多的进程,会影响主进程调度,所以占用的cpu会增高。
27 |
28 | 1. [root@lb-net-2 ~]# `ps -eaf|grep nginx`
29 | 2. root 2221 1382 0 18:06 pts/0 00:00:00 grep nginx
30 | 3. root 16260 1 0 Jun18 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
31 | 4. nobody 16261 16260 0 Jun18 ? 00:01:26 nginx: worker process
32 | 5. nobody 16262 16260 0 Jun18 ? 00:01:32 nginx: worker process
33 | 6. nobody 16263 16260 0 Jun18 ? 00:01:25 nginx: worker process
34 | 7. nobody 16264 16260 0 Jun18 ? 00:01:33 nginx: worker process
35 | 8. nobody 16265 16260 0 Jun18 ? 00:01:32 nginx: worker process
36 | 9. nobody 16266 16260 0 Jun18 ? 00:01:24 nginx: worker process
37 | 10. nobody 16267 16260 0 Jun18 ? 00:01:32 nginx: worker process
38 | 11. nobody 16268 16260 0 Jun18 ? 00:01:23 nginx: worker process
39 | 12. nobody 16269 16260 0 Jun18 ? 00:01:32 nginx: worker process
40 | 13. nobody 16270 16260 0 Jun18 ? 00:01:26 nginx: worker process
41 | 14. nobody 16271 16260 0 Jun18 ? 00:01:32 nginx: worker process
42 | 15. nobody 16272 16260 0 Jun18 ? 00:01:25 nginx: worker process
43 | 16. nobody 16273 16260 0 Jun18 ? 00:01:26 nginx: worker process
44 | 17. nobody 16274 16260 0 Jun18 ? 00:01:32 nginx: worker process
45 | 18. nobody 16275 16260 0 Jun18 ? 00:01:32 nginx: worker process
46 | 19. nobody 16276 16260 0 Jun18 ? 00:01:33 nginx: worker process
47 | 20. nobody 16277 16260 0 Jun18 ? 00:01:24 nginx: worker process
48 | 21. nobody 16278 16260 0 Jun18 ? 00:01:24 nginx: worker process
49 | 22. nobody 16279 16260 0 Jun18 ? 00:01:30 nginx: worker process
50 | 23. nobody 16280 16260 0 Jun18 ? 00:01:24 nginx: worker process
51 | 24. nobody 16281 16260 0 Jun18 ? 00:01:32 nginx: worker process
52 | 25. nobody 16282 16260 0 Jun18 ? 00:01:32 nginx: worker process
53 | 26. nobody 16283 16260 0 Jun18 ? 00:01:25 nginx: worker process
54 | 27. nobody 16284 16260 0 Jun18 ? 00:01:26 nginx: worker process
55 |
56 |
57 |
58 | # 配置文件
59 |
60 | ## Nginx反向代理实践
61 |
62 | > 省过
63 |
64 | ## Nginx Rewrite重新定向
65 |
66 | 使用nginx做重新定向。
67 | nginx参考网址:http://blog.sina.com.cn/s/blog_97688f8e0100zws5.html
68 |
69 | > 语法规则: **location [=|~|~*|^~] /uri/ { … }**
70 |
71 | - = 开头表示精确匹配
72 | - ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
73 | - ~ 开头表示区分大小写的正则匹配
74 | - ~* 开头表示不区分大小写的正则匹配
75 | - !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
76 | - / 通用匹配,任何请求都会匹配到。
77 |
78 | 多个location配置的情况下匹配顺序为:
79 |
80 | > 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
81 |
82 | 例子,有如下匹配规则:
83 |
84 | > location = / {
85 | >
86 | > 规则A
87 | >
88 | > }
89 |
90 | > location = /login {
91 | >
92 | > 规则B
93 | >
94 | > }
95 |
96 | > location ^~ /static/ {
97 | >
98 | > 规则C
99 | >
100 | > }
101 |
102 | > location ~ \.(gif|jpg|png|js|css)$ {
103 | >
104 | > 规则D
105 | >
106 | > }
107 |
108 | > location ~* \.png$ {
109 | >
110 | > 规则E
111 | >
112 | > }
113 |
114 | > location !~ \.xhtml$ {
115 | >
116 | > 规则F
117 | >
118 | > }
119 |
120 | > location !~* \.xhtml$ {
121 | >
122 | > 规则G
123 | >
124 | > }
125 |
126 | > location / {
127 | >
128 | > 规则H
129 | >
130 | > }
131 |
132 | 那么产生的效果如下:
133 |
134 | - 访问根目录/, 比如http://localhost/ 将匹配规则A
135 | - 访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
136 | - 访问 http://localhost/static/a.html 将匹配规则C
137 | - 访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到规则C
138 | - 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
139 | - 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
140 | - 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。
141 |
142 |
143 |
144 | 所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
145 |
146 | - 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
147 |
148 | 这里是直接转发给后端应用服务器了,也可以是一个静态首页
149 |
150 | - 第一个必选规则
151 |
152 | > location = / {
153 | > proxy_pass http://tomcat:8080/index
154 | > }
155 |
156 | - 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
157 |
158 | 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
159 |
160 | > location ^~ /static/ {
161 | > root /webroot/static/;
162 | > }
163 |
164 | > location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
165 | > root /webroot/res/;
166 | > }
167 |
168 | - 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
169 |
170 | 非静态文件请求就默认是动态请求,自己根据实际把握
171 |
172 | 毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
173 |
174 | > location / {
175 | > proxy_pass http://tomcat:8080/
176 | > }
177 |
178 |
--------------------------------------------------------------------------------
/组件/Nginx/assets/v2-816f7595d80b7ef36bf958764a873cba_hd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/组件/Nginx/assets/v2-816f7595d80b7ef36bf958764a873cba_hd.jpg
--------------------------------------------------------------------------------
/组件/Tomcat/1、Tomcat总结.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/组件/Tomcat/1、Tomcat总结.md
--------------------------------------------------------------------------------
/组件/Weblogic/1、Weblogic总结.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/组件/Weblogic/1、Weblogic总结.md
--------------------------------------------------------------------------------
/编程语言/C#/实用代码/C# 多线程配合委托实现控件的控制.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:2018年7月6日
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | -----
10 |
11 | # 前言
12 |
13 | > 在C#的Winform开发过程中,很多时候需要用到多线程以加快处理速度,当然了,多线程需要根据情况合理使用才能体现出它的价值。期间对于新手来说常常会遇到跨线程调用控件所出现的错误,这里需要说明一下:
14 | >
15 | > “Windows 窗体”使用单线程单元 (STA) 模型,因为“Windows 窗体”基于本机 Win32 窗口,而 Win32 窗口从本质上而言是单元线程。STA 模型意味着可以在任何线程上创建窗口,但窗口一旦创建后就不能切换线程,并且对它的所有函数调用都必须在其创建线程上发生。除了 Windows 窗体之外,.NET Framework 中的类使用自由线程模型。
16 | >
17 | > ** STA 模型要求需从控件的非创建线程调用的控件上的任何方法必须被封送到(在其上执行)该控件的创建线程**。基类 Control 为此目的提供了若干方法(Invoke、BeginInvoke 和 EndInvoke)。Invoke 生成同步方法调用;BeginInvoke 生成异步方法调用。
18 | >
19 | > Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。
20 | >
21 | > 因此,**如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程**
22 |
23 | 在此我将多线程处理UI控件的流程简单梳理一下。
24 |
25 | # 1、声明委托
26 |
27 | ```C#
28 | // 定一个委托,接受一个字符串参数,然后void
29 | private delegate void ChangeLabelText(string msg);
30 | ```
31 |
32 |
33 |
34 | # 2、创建线程、启动线程
35 |
36 | ```C#
37 | Thread thread = new Thread(new ThreadStart(方法名));
38 | thread.Start();
39 | ```
40 |
41 | # 3、实例化委托(即将委托指向一个具体方法)
42 |
43 | # 4、调用委托
44 |
45 |
46 |
47 | # 具体代码
48 |
49 | > 启动一个循环,每次循环将结果赋值给窗体上的Label标签,完成之后修改Label标签值为“完成”
50 |
51 | 可能新手开始会这么做:
52 |
53 | ```C#
54 | private void button1_Click(object sender, EventArgs e)
55 | {
56 | Thread thread = new Thread(new ThreadStart(Test));
57 | thread.Start();
58 | }
59 |
60 |
61 | public void Test()
62 | {
63 | for (int i = 0; i < 1000; i++)
64 | {
65 | Console.WriteLine(i);
66 | label1.Text=i.toString();// 放心,此处会报错,不信尝试一下
67 | }
68 | }
69 | ```
70 |
71 | 以上代码看似顺理成章,创建线程—启动线程—线程的方法进行循环,同时修改Label值,但是存在问题,正确的做法应该是:
72 |
73 | ```c#
74 | // 声明委托
75 | private delegate void ChangeLabelText(string msg);
76 |
77 |
78 | private void button1_Click(object sender, EventArgs e)
79 | {
80 | Thread thread = new Thread(new ThreadStart(Test));
81 | thread.Start();
82 | }
83 |
84 |
85 | public void ModifyLabel(string text)
86 | {
87 | label1.Text = text;
88 | }
89 |
90 | public void Test()
91 | {
92 | // 实例化委托,将委托与ModifyLabel方法绑定
93 | ChangeLabelText changeLabelText = ModifyLabel;
94 | for (int i = 0; i < 1000; i++)
95 | {
96 | Console.WriteLine(i);
97 | // 通过控件的Invoke调用委托
98 | label1.Invoke(changeLabelText, new object[] { i.ToString() });
99 | }
100 | label1.Invoke(changeLabelText, new object[] { "完成" });
101 | }
102 | ```
103 |
104 |
--------------------------------------------------------------------------------
/编程语言/C#/控件总结/C# 动态创建控件.md:
--------------------------------------------------------------------------------
1 | 一、添加GroupBox控件
2 |
3 | 1.实例化并显示
4 |
5 | ```C#
6 | //实例化GroupBox控件
7 | GroupBox groubox = new GroupBox();
8 | groubox.Name = "gbDemo";
9 | groubox.Text = "实例";
10 | //设置上和左位置
11 | //groubox.Top = 50;
12 | //groubox.Left = 50;
13 | //通过坐标设置位置
14 | groubox.Location = new Point(12, 12);
15 | //将groubox添加到页面上
16 | this.Controls.Add(groubox);
17 | ```
18 |
19 | 二、在GroupBox控件中添加TextBox控件
20 |
21 | 1.实例化并显示
22 |
23 | ```C#
24 | //实例化TextBox控件
25 | TextBox txt = new TextBox();
26 | txt.Name = "txtDemo";
27 | txt.Text = "txt实例";
28 | //将TextBox在GroupBox容器中显示
29 | //txt.Parent = groubox;
30 | //将TextBox在GroupBox容器中显示
31 | groubox.Controls.Add(txt);
32 | ```
33 |
34 |
35 |
36 | 2.置于顶层和置于底层
37 |
38 |
39 |
40 | ```C#
41 | //置于顶层
42 | txt.BringToFront();
43 |
44 | //置于底层
45 | txt.SendToBack();
46 | ```
47 |
48 |
49 |
50 | 3.添加事件
51 |
52 |
53 |
54 | ```C#
55 | //添加Click单击事件
56 | txt.Click += new EventHandler(btn_Click);
57 |
58 |
59 | //定义Click单击事件
60 | private void btn_Click(object sender, EventArgs e)
61 | {
62 | MessageBox.Show("事件添加成功");
63 | }
64 | ```
65 |
66 |
67 |
68 | 三、添加多个
69 |
70 | 1.动态添加多个
71 |
72 | ```C#
73 | //添加控件
74 | public void AddGroupBox()
75 | {
76 | string name = "gbox";
77 | for (int i = 0; i < 3; i++)
78 | {
79 | GroupBox gbox = new GroupBox();
80 | gbox.Name = name + i;
81 | gbox.Text=name+i;
82 | gbox.Width = 300;
83 | gbox.Height = 100;
84 | gbox.Location = new Point(32, 20 + i * 150);
85 | this.Controls.Add(gbox);
86 | //调用添加文本控件的方法
87 | AddTxt(gbox);
88 | }
89 | }
90 | //添加文本控件
91 | public void AddTxt(GroupBox gb)
92 | {
93 | string name = "txt";
94 | for (int i = 0; i < 3; i++)
95 | {
96 | TextBox txt = new TextBox();
97 | txt.Name =gb.Name+ name + i;
98 | txt.Text =gb.Name+"|"+ name + i;
99 | txt.Location = new Point(12, 15 + i * 30);
100 | gb.Controls.Add(txt);
101 | }
102 | }
103 | ```
104 |
105 |
106 |
107 | 实例:
108 |
109 | ```C#
110 | using System;
111 | using System.Collections.Generic;
112 | using System.ComponentModel;
113 | using System.Data;
114 | using System.Drawing;
115 | using System.Linq;
116 | using System.Text;
117 | using System.Windows.Forms;
118 | namespace Select_ListBox
119 | {
120 | public partial class Form2 : Form
121 | {
122 | TextBox txt = new TextBox();
123 | public Form2()
124 | {
125 | InitializeComponent();
126 | }
127 | private void Form2_Load(object sender, EventArgs e)
128 | {
129 | AddGroupBox();
130 | ////实例化GroupBox控件
131 | //GroupBox groubox = new GroupBox();
132 | //groubox.Name = "gbDemo";
133 | //groubox.Text = "实例";
134 | ////设置上和左位置
135 | ////groubox.Top = 50;
136 | ////groubox.Left = 50;
137 | ////通过坐标设置位置
138 | //groubox.Location = new Point(12, 12);
139 | ////将groubox添加到页面上
140 | //this.Controls.Add(groubox);
141 | ////实例化TextBox控件
142 | //TextBox txt = new TextBox();
143 | //txt.Name = "txtDemo";
144 | //txt.Text = "txt实例";
145 | ////将TextBox在GroupBox容器中显示
146 | ////txt.Parent = groubox;
147 | ////将TextBox在GroupBox容器中显示
148 | //groubox.Controls.Add(txt);
149 | ////置于顶层
150 | //txt.BringToFront();
151 | ////置于底层
152 | //txt.SendToBack();
153 | ////添加Click单击事件
154 | //txt.Click += new EventHandler(btn_Click);
155 | }
156 | ////定义Click单击事件
157 | //private void btn_Click(object sender, EventArgs e)
158 | //{
159 | // MessageBox.Show("ss");
160 | //}
161 | //添加控件
162 | public void AddGroupBox()
163 | {
164 | string name = "gbox";
165 | for (int i = 0; i < 3; i++)
166 | {
167 | GroupBox gbox = new GroupBox();
168 | gbox.Name = name + i;
169 | gbox.Text=name+i;
170 | gbox.Width = 300;
171 | gbox.Height = 100;
172 | gbox.Location = new Point(32, 20 + i * 150);
173 | this.Controls.Add(gbox);
174 | //调用添加文本控件的方法
175 | AddTxt(gbox);
176 | }
177 | }
178 | //添加文本控件
179 | public void AddTxt(GroupBox gb)
180 | {
181 | string name = "txt";
182 | for (int i = 0; i < 3; i++)
183 | {
184 | TextBox txt = new TextBox();
185 | txt.Name =gb.Name+ name + i;
186 | txt.Text =gb.Name+"|"+ name + i;
187 | txt.Location = new Point(12, 15 + i * 30);
188 | gb.Controls.Add(txt);
189 | }
190 | }
191 | }
192 | }
193 | ```
194 |
195 |
196 |
197 |
198 |
199 |
--------------------------------------------------------------------------------
/编程语言/C#/控件总结/Chart图表/Chart图表基本模型.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | 1. 一个chart可以包含多个chartArea。 chartArea是具体的坐标区域。
4 | 2. 每一个chartArea主要包含X轴,Y轴,副X轴(上方),副Y轴(右方),绑定的线条,绑定的图例。
5 | 3. 线条可以有许多,只要将线条绑定到chartArea就可以在对应的chartArea显示。
6 |
7 | 其树形实体结构如下所示: 对于每个实体里面的许多样式属性可以自行尝试研究。
8 |
9 | 
--------------------------------------------------------------------------------
/编程语言/C#/控件总结/Chart图表/Chart图表总结.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | 1. 一个chart可以包含多个chartArea。 chartArea是具体的坐标区域。
4 | 2. 每一个chartArea主要包含X轴,Y轴,副X轴(上方),副Y轴(右方),绑定的线条,绑定的图例。
5 | 3. 线条可以有许多,只要将线条绑定到chartArea就可以在对应的chartArea显示。
6 |
7 | 其树形实体结构如下所示: 对于每个实体里面的许多样式属性可以自行尝试研究。
8 |
9 | 
10 |
11 | 综上可以对chart的结构有一个基本了解。接下来结合代码进行说明
12 |
13 | # 线条的创建
14 |
15 | 此处用于创建4条线段。
16 |
17 | ```c#
18 | public Series maxTemp;
19 | public Series avgTemp;
20 | public Series minTemp;
21 | public Series vibration;
22 |
23 | maxTemp = new Series("maxTemp");
24 | avgTemp = new Series("avgTemp");
25 | minTemp = new Series("minTemp");
26 | vibration = new Series("vibration");
27 | ```
28 |
29 | # 设置线条的样式
30 |
31 | ```c#
32 | //曲线的颜色
33 | maxTemp.BorderColor = Color.Black;
34 | maxTemp.Color = Color.Red;
35 | avgTemp.BorderColor = Color.Black;
36 | avgTemp.Color = Color.Green;
37 | minTemp.BorderColor = Color.Black;
38 | minTemp.Color = Color.Blue;
39 | vibration.BorderColor = Color.Black;
40 | vibration.Color = Color.Blue;
41 |
42 | //曲线的宽度
43 | maxTemp.BorderWidth = 2;
44 | avgTemp.BorderWidth = 2;
45 | avgTemp.BorderWidth = 2;
46 | vibration.BorderWidth = 2;
47 |
48 | //曲线的样式 有圆形曲线,阶梯形曲线,折线等等。
49 | maxTemp.ChartType = SeriesChartType.Spline;
50 | avgTemp.ChartType = SeriesChartType.Spline;
51 | minTemp.ChartType = SeriesChartType.Spline;
52 | vibration.ChartType =SeriesChartType.Spline;
53 |
54 | //曲线的阴影样式 可以让曲线更加突出有立体感。
55 | maxTemp.ShadowOffset = 1;
56 | avgTemp.ShadowOffset = 1;
57 | minTemp.ShadowOffset = 1;
58 | vibration.ShadowOffset = 1;
59 |
60 | //标记的样式 设置曲线中每个数据点标记的样式。可以在标记中显示数据点的值,但是太多数据点的话将没有可视性
61 | maxTemp.MarkerColor = Color.White;
62 | maxTemp.MarkerStyle = MarkerStyle.Square;
63 | avgTemp.MarkerColor = Color.White;
64 | avgTemp.MarkerStyle = MarkerStyle.Square;
65 | minTemp.MarkerColor = Color.White;
66 | minTemp.MarkerStyle = MarkerStyle.Square;
67 | vibration.MarkerColor = Color.White;
68 | vibration.MarkerStyle = MarkerStyle.Square;
69 |
70 | //设置线条的轴类型 主要设置以下方做X轴还是上方做X轴,左方做Y轴还是右方做Y轴
71 | maxTemp.XAxisType = AxisType.Primary;
72 | maxTemp.YAxisType = AxisType.Primary;
73 | avgTemp.XAxisType = AxisType.Primary;
74 | avgTemp.YAxisType = AxisType.Primary;
75 | minTemp.XAxisType = AxisType.Primary;
76 | minTemp.YAxisType = AxisType.Primary;
77 | vibration.XAxisType = AxisType.Primary;
78 | vibration.YAxisType = AxisType.Primary;
79 |
80 | vibration.IsValueShownAsLabel = true; //此属性将数据点的值作为标签。
81 |
82 |
83 | ```
84 |
85 | # ChartArea的创建和属性设置
86 |
87 | ```c#
88 | public ChartArea mainArea1 = new ChartArea("areaDTS");
89 | public ChartArea mainArea2 = new ChartArea("areaDOVS");
90 |
91 | //设置图表区域 用户可以拖动游标 此处设置后用户可以通过拖动游标放大查看区域
92 | //设置图表区域 用户可以拖动游标
93 | mainArea1.CursorX.IsUserEnabled = true;
94 | mainArea1.CursorY.IsUserEnabled = true;
95 | mainArea2.CursorX.IsUserEnabled = true;
96 | mainArea2.CursorY.IsUserEnabled = true;
97 |
98 | //设置X Y 轴坐标的标题。
99 | mainArea1.AxisX.Title = "光纤分区号/(标量)";
100 | mainArea1.AxisY.Title = "温度值/(摄氏度)";
101 | mainArea2.AxisX.Title = "光纤震动位置/(m)";
102 | mainArea2.AxisY.Title = "震动值/(a.u.)";
103 |
104 | //设置网格。主网格 与主刻度对应 副网格与副刻度对应,从刻度向另一端画一条线。如果线条中数据过多,产生较多的网格线会 使得整个区域过于密集,甚至为全黑色。所以在数据点较多的情况小关闭副网格,甚至主网格
105 | mainArea1.AxisX.MajorGrid.Enabled = false;
106 | mainArea1.AxisY.MajorGrid.Enabled = false;
107 | mainArea1.AxisX.MinorTickMark.Enabled = false;
108 |
109 | mainArea2.AxisX.MajorGrid.Enabled = false;
110 | mainArea2.AxisY.MajorGrid.Enabled = false;
111 | mainArea2.AxisX.MinorTickMark.Enabled = false;
112 |
113 | //设置曲线横坐标值类型为时间类型
114 | vibration.XValueType = ChartValueType.DateTime;
115 | //将此线条绑定到的AxisX的标签设置时间格式。
116 | mainArea1.AxisX.LabelStyle.Format = "MM-dd HH:mm";
117 | //设置主刻度线和副刻度线 一般只有主刻度线才有对应标签值。
118 | mainArea1.AxisX.MinorTickMark.Enabled = true ;
119 | mainArea1.AxisX.MajorTickMark.Enabled = true;
120 | ```
121 |
122 | # 创建图例、标题
123 |
124 | ```c#
125 | //图例
126 | Legend legend = new Legend();
127 | ElementPosition p = new ElementPosition(0, 0, 12, 10);
128 | chart.Legends[0].Position = p; //每创建一个对象都会存放在chart的集合属性中可以通过数组的形式随机访问
129 |
130 | //标题
131 | Title title = new Title("chart使用方法");
132 | chart.Titles.Add(title);
133 |
134 | ```
135 |
136 | # 将前面创建的对象加入到自己所属的父实体中
137 |
138 | ```c#
139 | chart2.ChartAreas.Add(mainArea1); //将线条加入到chart的chartAreas集合属性中
140 | chart2.ChartAreas.Add(mainArea2);
141 |
142 | series4.ChartArea = "areaDOVS"; //将线条绑定到对应ChartArea 通过chartArea的名字就可以绑定
143 | series3.ChartArea = "areaDTS";
144 |
145 | chart2.Series.Add(series3); //将线条加入到chart的series集合属性中。
146 | chart2.Series.Add(series4);
147 | ```
148 |
149 | # 示例效果
150 |
151 | 注意示例效果与前述代码无关,前述代码只为了说明
152 |
153 | 
154 |
155 |
156 |
157 | 
158 |
159 | 
160 |
161 |
162 |
163 |
164 |
165 | 参考博客:[](https://blog.csdn.net/andrewniu/article/details/78770186)
--------------------------------------------------------------------------------
/编程语言/C#/控件总结/DataGirdView/【个人总结】C# DataGirdView相关总结.md:
--------------------------------------------------------------------------------
1 | # DataGirdView禁止拷贝
2 |
3 | ```c#
4 | dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.Disable;
5 | ```
6 |
7 | DataGridViewClipboardCopyMode枚举类型如下:
8 |
9 | ```c#
10 | //
11 | // 摘要:
12 | // 定义常数,指示内容将复制从 System.Windows.Forms.DataGridView 控件添加到剪贴板。
13 | public enum DataGridViewClipboardCopyMode
14 | {
15 | //
16 | // 摘要:
17 | // 将复制到剪贴板上处于禁用状态。
18 | Disable = 0,
19 | //
20 | // 摘要:
21 | // 选定的单元格的文本值可以复制到剪贴板。 行或列标题文本是包含的行或列包含选定的单元格时,才 System.Windows.Forms.DataGridView.SelectionMode
22 | // 属性设置为 System.Windows.Forms.DataGridViewSelectionMode.RowHeaderSelect 或 System.Windows.Forms.DataGridViewSelectionMode.ColumnHeaderSelect
23 | // 和至少一个标题为选中状态。
24 | EnableWithAutoHeaderText = 1,
25 | //
26 | // 摘要:
27 | // 选定的单元格的文本值可以复制到剪贴板。 不包括标头文本。
28 | EnableWithoutHeaderText = 2,
29 | //
30 | // 摘要:
31 | // 选定的单元格的文本值可以复制到剪贴板。 标头文本是为了让所选单元格的行和列。
32 | EnableAlwaysIncludeHeaderText = 3
33 | }
34 | ```
35 |
36 |
--------------------------------------------------------------------------------
/编程语言/C#/插件开发/Excel插件开发/VSTO/Range.md:
--------------------------------------------------------------------------------
1 | 一.Range属性
2 |
3 | 1.选择单个单元格(例如A5)
4 |
5 | Range("A5").Select
6 |
7 | 2.选择一个单元格区域(例如A6:A10)
8 |
9 | Range("A6:A10").Select
10 |
11 | 3.选择一些不相邻的单元格(例如A1,B6,C8)
12 |
13 | Range("A1,B6,C8").Select
14 |
15 | 4.选择一些不相邻的单元格和单元格区域(例如A11:D11,B7,C9)
16 |
17 | Range("A11:D11,B7,C9").Select
18 |
19 | 二.Cells属性
20 |
21 | 1.选择单个单元格(例如A5)
22 |
23 | Cells(5,1).Select Cells(5,A).Select
24 |
25 | 2.选择一个单元格区域(例如A6:A10)
26 |
27 | Range(Cells(6,1),Cells(10,1)).Select
28 |
29 | 3.选择工作表中的所有单元格
30 |
31 | Cells.Select
32 |
33 | 三.Offset属性
34 |
35 | 1.选择单元格A1下面一行和右边三列的单元格
36 |
37 | Range("A1").Offset(1,3).Select
38 |
39 | 2.选择单元格D15上面两行和左边一列的单元格
40 |
41 | Range("D15").Offset(-2,-1).Select
42 |
43 | 3.选择同列单元格(上一行)
44 |
45 | ActiveCell.Offset(-1,0).Select
46 |
47 | 4.重新选取区域
48 |
49 | ActiveCell.Offset(2,2).Resize(2,4).Select
50 |
51 | 四.END属性(移动到连续有内容的单元格)
52 |
53 | 1.选择任何行的最后一个单元格
54 |
55 | ActiveCell.End(xlToRight).Select
56 |
57 | 2.选择任何行的最前一个单元格
58 |
59 | ActiveCell.End(xlToLeft).Select
60 |
61 | 3.选择任何列的最后一个单元格
62 |
63 | ActiveCell.End(xlDown).Select
64 |
65 | 1.选择任何列的最前一个单元格
66 |
67 | ActiveCell.End(xlUp).Select
--------------------------------------------------------------------------------
/编程语言/C#/插件开发/Excel插件开发/VSTO/VSTO-简单说明.md:
--------------------------------------------------------------------------------
1 | Tab
2 | Group
3 |
4 |
5 |
6 | # 文档结构模型
7 |
8 | 
9 |
10 | 
11 |
12 | Excel对象模型基本模拟了UI界面:
13 |
14 | - 一个Excel应用程序就是一个Application,全局的对象比如菜单,工具条都属于Application对象。
15 | - 一个Application可以包含很多个Workbook(Workbooks)。具体而言就是,我们可以同时打开很多个工作簿(Workbooks),但某一时候只有一个工作簿(Workbook)处于编辑状态,这个工作簿叫做活动工作簿(ActiveWorkbook);
16 | - 一个Workbook可以包含很多个Worksheet(Worksheets)。具体而言就是,一个工作簿可以包含很多工作表(Worksheets),某一时刻只有一个工作表(Worksheet)处于编辑状态,这个工作表称之为活动工作表(ActiveWorksheet)。
17 | - 一个Workbook还可以包含很多Shapes对象。工作表中还可以包含一些图表,标记,注释,控件等,这些都是浮在Sheet页上的,这些统称为Shapes,其中我们接触的最多的是图表(Charts)。
18 | - 一个WorkSheet可以包含很多个Range对象。具体而言,一个工作表里面有很多个单元格,单元格范围用Range表示,Range可以使一个单元格,也可以使多个单元格。单元格都是嵌入到Sheet页中的。
19 |
20 | 更详细地Excel的对象模型图,如下,图中灰色的部分存在于office.dll中所有Office应用程序中都存在的对象:
21 |
22 | 
23 |
24 | 具体可参考:[《浅谈 Excel 对象模型.md》](https://github.com/TangHanF/ProjectRecord/blob/master/其它/Excel插件开发/VSTO/浅谈%20Excel%20对象模型.md)
25 |
26 | --------
27 |
28 | 由于 Excel 文档中的数据已高度结构化,因此该对象模型是分层模型且非常简单。 Excel 提供数百个你可能需与之进行交互的对象,但你可以通过将重点放在非常小的一部分可用对象上来很好的开始了解对象模型。 这些对象包括以下四种:
29 |
30 | - Application
31 |
32 | - Workbook
33 |
34 | - Worksheet
35 |
36 | - Range
37 |
38 | 许多使用 Excel 完成的工作都是围绕这四种对象及其成员进行的。
39 |
40 |
41 |
42 | > - Excel Application 对象表示 Excel 应用程序本身。 Application 对象公开了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例内部开启的当前用户对象的信息。
43 | > - Workbook 对象表示 Excel 应用程序中的单个工作簿。Visual Studio 中的 Office 开发工具通过提供 `Workbook类型`来扩展 Workbook 对象。 此类型使你可以访问 Workbook 对象的所有功能
44 | > - Worksheet 对象是 Worksheets 集合的成员。 Worksheet 的许多属性、方法和事件与由 Application 或 Workbook 对象提供的成员相同或类似。**Excel 提供一个 Sheets 集合作为 Workbook 对象的属性**。 **Sheets集合的每个成员都是 Worksheet 或 Chart 对象**。Visual Studio 中的 Office 开发工具通过提供 `Worksheet类型`来扩展 Worksheet 对象。 此类型使你可以访问 Worksheet 对象的所有功能以及承载托管控件和处理新事件等新功能
45 |
46 |
--------------------------------------------------------------------------------
/编程语言/C#/插件开发/Excel插件开发/VSTO/VSTO_脑图总结.xmind:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/C#/插件开发/Excel插件开发/VSTO/VSTO_脑图总结.xmind
--------------------------------------------------------------------------------
/编程语言/C#/插件开发/Excel插件开发/VSTO/VSTO创建Excel插件项目.md:
--------------------------------------------------------------------------------
1 | **一、引言**
2 |
3 | 也许很多朋友都没有听说过VSTO这个东西的,本人之前也同样也不知道的,但是由于工作的原因接触了这方面,由于VSTO方面国内的资料比较少,本人刚开始学习的时候都是参考MSDN的,但是上面很多资料都是英文的,可能学习起来会比较慢点,所以本人把最近一段时间学习的内容记录下来,一来是作为一个巩固的学习笔记,二来希望这些博客可以帮助一些刚接触VSTO的朋友可以有所借鉴。
4 |
5 | 讲了这么多废话(指的上面一些过渡的话),到底VSTO到底是什么呢?这里我简单的概括下的——**VSTO是微软推出一种对Office产品进行操作的技术,其中提供了一些类库来让开发人员可以更方便地开发出Office的解决方案,即对Word/Excel/Outlook实现一些扩展功能**。 在这个专题将为大家介绍下,如何创建Excel的解决方案?
6 |
7 | **二、创建VSTO项目**
8 |
9 | 对于刚接触VSTO的朋友来说,可能根本就不知道如何去创建一个VSTO的项目的,相信通过这个部分大家就会觉得是如此的简单。
10 |
11 | **环境的搭建**
12 |
13 | 进行VSTO开发的环境搭建是相当简单的,只需要安装Visual Studio 2010(当然安装VS2010的时候在安装组件中必须勾选VSTO选择,这个选项是默认勾上的。大家可以在安装VS的时候留意下)和Office 2010就可以,当然VS2008 和Office 2007的安装也可以完成环境的搭建。
14 |
15 | **创建第一个Excel工程来开始我们的VSTO之旅**
16 |
17 | 第一步, 选择新建项目->Visual C#->Office->2010,然后选择Excel 2010外接程序(如何是英文版即Excel 2010 Add-in),如下图:
18 |
19 | 
20 |
21 | 从图中可以看到,除了外接程序外,还有Excel模板和Excel文档这两种项目类型,他们的区别是 外接程序是应用程序级别的,即如果你创建了Excel 2010外接程序,该程序对所有Excel应用都是有效的,因为每次Excel的启动过程都会加载该插件(即该程序),大家肯定留意到当我们启动Excel或Word的时候都会加载一些加载项,其实这些加载项就是属于外接程序,即插件,启动过程见下面图:
22 |
23 | 
24 |
25 | 而 文档和模板项目,都是属于文档级别的程序,该程序只对当前文档和模板有效,创建这两种类型的项目,会在项目的工程目录下会生成一个word文件(文档项目会生成一个 Document1.docx文件,模板项目会生成一个Document1.dotx文件)。
26 |
27 | 创建成功之后,外接程序的项目文件结构见下图:
28 |
29 | 
30 |
31 | 从图中可以看出,刚创建的VSTO外接程序都只有一个ThisAddIn.cs文件,该文件即是一个宿主项(更多关于宿主项和宿主控件的内容可以查看该系列的[第一篇博文](http://www.cnblogs.com/zhili/archive/2012/09/03/VSTO.html)),我们可以通过这个文件来对Excel对象进行访问。同时该类中有ThisAddIn_Startup和ThisAddIn_Shutdown两个方法,从两个方法中命名中可以知道,如果你的代码想在加载外接程序时运行的话,就放把代码放在ThisAddIn_Startup方法内容,如果你想在外接程序卸载的时候运行你的代码,就把这些代码放在ThisAddIn_Shutdown方法内。
32 |
33 | **三、Excel对象模型**
34 |
35 | 要开发Excel的项目,就自然少不了对Excel对象模型的了解了,只有了解Excel对象模型,这样才能更好地对Excel进行处理。下面先给出一张Excel对象模型的图:
36 |
37 | 
38 |
39 | 下面就具体对上图中的各个对象做一个简单的介绍:
40 |
41 | Application对象——Excel中的[Application](http://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.application.aspx)对象表示Excel应用程序,该对象是所有Excel对象的根,你可以通过Application对象,获取到其他对象,在外接程序中,我们可以通过下面的方式来获得Application对象:Globals.ThisAddIn.Application
42 |
43 | Workbooks对象代表Workbook对象的集合,而Workbook对象表示Excel中的单个工作簿,我们可以通过下面的方式来获得工作簿对象:Globals.ThisAddIn.Application.ThisWorkbook
44 |
45 | Worksheets对象代表Worksheet对象的集合,而Worksheet代表的就是Excel中的表,下面的代码可以获得Worksheet对象:Globals.ThisAddIn.Application.ThisWorkbook.ActiveSheet (激活的表,每次打开一个Excel文件,都是表一即sheet1被激活,所以通过该代码就说获得表一对象)
46 |
47 | Range对象代表一个范围,是操作Excel文档最常用的对象,它可以表示为一个单元格、一行、一列或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格。可能上面的解释过于枯燥,相信大家通过下图可以更好地理解Excel中的各个对象:
48 |
49 | 
50 |
51 | **四、创建Excel外接程序**
52 |
53 | 介绍完了Excel对象模型之后,我们就可以利用这些对象来对Excel文档进行操作了,下面就创建一个简单的Excel外接程序的。
54 |
55 | 首先我们模拟一个需求,大多说软件在使用时都会弹出一个欢迎界面,这样我们就创建一个外接程序,每次打开Excel文件时弹出一个欢迎界面,退出时弹出“谢谢使用”界面。
56 |
57 | 我们只需要在上面的创建工程中介入下面的代码即可:
58 |
59 | 
60 |
61 | ```
62 | using System.Windows.Forms;
63 |
64 | namespace MyExcelAddIn1
65 | {
66 | public partial class ThisAddIn
67 | {
68 | private void ThisAddIn_Startup(object sender, System.EventArgs e)
69 | {
70 | // 因为欢迎使用窗口要在打开Excel的时候弹出,所以把下面代码放在Startup方法内
71 | MessageBox.Show("欢迎使用Microsoft Excel");
72 | }
73 |
74 | private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
75 | {
76 | // 在退出Excel的时候弹出谢谢使用窗口,所以把下面的代码放在Shutdown方法内
77 | MessageBox.Show("谢谢使用!");
78 | }
79 |
80 | #region VSTO generated code
81 |
82 | ///
83 | /// Required method for Designer support - do not modify
84 | /// the contents of this method with the code editor.
85 | ///
86 | private void InternalStartup()
87 | {
88 | this.Startup += new System.EventHandler(ThisAddIn_Startup);
89 | this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
90 | }
91 |
92 | #endregion
93 | }
94 | }
95 | ```
96 |
97 | 
98 |
99 | 这样,我们就完成了上面简单的一个模拟需求了,下面让我们按F5来测试下效果吧!
100 | 按F5运行该程序时,首先打开一个Excel之后,一个欢迎界面就会弹出:
101 |
102 | 
103 |
104 | 点击Excel窗口上的"X"按钮时,就会弹出一个 “谢谢使用!”的窗口,效果如下:
105 |
106 | 
107 |
108 | 点击 Ok 按钮之后才会正常退出Excel。这样就完成了一个简单的Excel外接程序了,上面提到过外接程序是应用程序级别的,所以当你每次打开Excel的时候都会有这样的一个欢迎界面和关闭Excel时都有一个"谢谢使用"窗口,有些朋友想问了,如果我想卸载这个插件怎么办呢?方法很简单,只需要右键你的解决方案——>清理,这样可以了,另外你也可以从开发工具选项卡——>COM 插件,在弹出的窗口中选择你自定义的插件 再按下移除按钮。具体步骤见下图:
109 |
110 | 
111 |
112 | **五、创建Excel文档级自定义项**
113 |
114 | 介绍完了创建Excel外接程序之后,下面看看如何创建一个文档级的项目:
115 |
116 | \1. 新建一个Excel 2010 Workbook(即Excel工作簿)项目:
117 |
118 | 
119 |
120 | \2. 单击 OK按钮,在下面的窗口中单击 ”OK“按钮:
121 |
122 | 
123 |
124 | \3. 在第一创建Excel工作簿项目是会弹出下面的一个窗口(窗口意思为:是否允许创建的项目访问VBA项目系统),此时我们只需要点击“Ok”就完成了Excel工作簿项目的创建。
125 |
126 | 
127 |
128 | 现在我们来模拟一个需求,比如现在有一个成绩单工作表,我们希望获得各科目不及格同学的名字。此时我们只需要在上面创建的工作簿项目中添加一个ComboBox,一个Button,一个textbox。在button的Click事件中添加下面的代码:
129 |
130 | 
131 |
132 | ```
133 | // 找出各科目不及格同学的名字
134 | private void btnSearch_Click(object sender, EventArgs e)
135 | {
136 | // 清除textbox中的内容
137 | txtResult.Clear();
138 |
139 | // 从复选框中获得选择的科目索引
140 | int subjectIndex = cbxsubjects.SelectedIndex;
141 | if (subjectIndex == -1)
142 | {
143 | MessageBox.Show("请先选择一个科目");
144 | return;
145 | }
146 |
147 | // 获得选择的科目名称
148 | string subjectName = cbxsubjects.SelectedItem.ToString();
149 | // 获得工作表对象
150 | Excel.Worksheet worksheet =(Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet;
151 |
152 | for (int row = 2; row < worksheet.UsedRange.Rows.Count+1; row++)
153 | {
154 | Excel.Range rng =(Excel.Range)worksheet.Cells[row,subjectIndex + 2];
155 | Excel.Range rng1 = (Excel.Range)worksheet.Cells[row, 1];
156 | if (rng.Value< 60)
157 | {
158 | txtResult.Text += rng1.Value + "; ";
159 | }
160 | }
161 | if (txtResult.Text.Length == 0)
162 | {
163 | txtResult.Text = subjectName + "没有不及格的同学";
164 | }
165 | }
166 | ```
167 |
168 | 
169 |
170 | 运行该项目结果为:
171 | 
172 |
173 | **六、小结**
174 |
175 | 到这里本专题的介绍就结束了, 本专题首先主要介绍了Excel的对象模型和如何创建Excel的两种项目类型,希望通过本专题大家可以开发出一些简单的Excel的解决方案,后面一个专题将为大家介绍如何为Excel自定义一个选项卡和上下文菜单。
176 |
177 | 专题源码:
--------------------------------------------------------------------------------
/编程语言/C#/插件开发/Excel插件开发/VSTO/问题解决/VSTO新建项目相关问题总结.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | 问题参考链接:https://docs.microsoft.com/zh-cn/visualstudio/vsto/enable-access-to-vba-to-create-or-open-a-visual-studio-tools-for-office-system-project
4 |
5 |
6 |
7 |
8 |
9 | 设计器未能正确加载、未能正确加载的设计器、无法创建项目,因为此计算机上未安装与此项目类型关联的应用程序。 必须安装与此项目类型关联的 Microsoft Office 应用程序等错误解决方案:
10 |
11 | https://docs.microsoft.com/zh-cn/visualstudio/vsto/troubleshooting-errors-in-office-solutions
12 |
13 |
14 |
15 |
16 |
17 | > 可以尝试更新VS,我这边更新pack2之后可以了:打开VS--工具—扩展和更新 进行更新
--------------------------------------------------------------------------------
/编程语言/Java/MyBatis/mybatis一次执行多条SQL语句.md:
--------------------------------------------------------------------------------
1 | ## mybatis一次执行多条SQL语句
2 |
3 | 1. 首先在数据库连接URL上加上`allowMultiQueries=true`,默认mysql是不支持一次执行多条SQL语句的。
4 |
5 | ```
6 | jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true1
7 | ```
8 |
9 | 2 .在delete节点中添加多条语句:
10 |
11 | ```
12 |
13 | delete from music_favorite where id = #{id,jdbcType=INTEGER};
14 | delete from music_favorite_song where f_id = #{id,jdbcType=INTEGER};
15 |
16 | ```
17 |
18 | > 注意多条语句之间用“;”分割开来
19 |
20 | 这可以用在mybatis的级联关系删除上,删除主表记录前,先删除关联表的记录,两条一起执行
--------------------------------------------------------------------------------
/编程语言/Java/MyBatis/mybatis判断用insert还是update.md:
--------------------------------------------------------------------------------
1 | ## 前言
2 |
3 | 在实际开发中会遇到这种情况,就是一条数据需要判断是新增还是更新,正常的开发思路是先去查询这条数据的Id是否已经存在于数据库,存在就是update,否则为insert,mybatis也是基于这样的思想实现的,下面就举个例子看一下。
4 |
5 | ## 具体实现
6 |
7 | 比如,前台将一条教师的信息保存到教师的实体bean中,然后需要将这条信息保存到数据库中,这时需要判断一下教师信息是要update还是insert。
8 | 教师信息实体bean如下:Teacher.java
9 |
10 | ```java
11 | public class Teacher {
12 |
13 | private int teacherId;//教师Id
14 |
15 | private String teacherName;//教师名
16 |
17 | private int count;//mybatis判断Id是否存在
18 |
19 | public int getTeacherId() {
20 | return teacherId;
21 | }
22 |
23 | public void setTeacherId(int teacherId) {
24 | this.teacherId = teacherId;
25 | }
26 |
27 | public String getTeacherName() {
28 | return teacherName;
29 | }
30 |
31 | public void setTeacherName(String teacherName) {
32 | this.teacherName = teacherName;
33 | }
34 |
35 | public int getCount() {
36 | return count;
37 | }
38 |
39 | public void setCount(int count) {
40 | this.count = count;
41 | }
42 |
43 | }
44 | ```
45 |
46 | 可以看到在实体bean中除了正常的教师信息外多了一`count`,它就是mybatis用来判断teacherId是否存在,如果存在就会将存在的个数保存到count中,当然一般Id都是主键,所有count也就一般都是1。下边看一下mybatis的映射文件。
47 |
48 | ```xml
49 |
50 |
51 | select count(*) from Teacher where teacher_id = #{teacherId}
52 |
53 |
54 | update event
55 |
56 |
57 | teacher_name= #{teacherName},
58 |
59 |
60 |
61 | teacher_id = #{teacherId}
62 |
63 |
64 |
65 | insert into teacher(teacher_id,teacher_name) values (#{teacherId},#{teacherName})
66 |
67 |
68 | ```
69 |
70 | 可以看到mybatis的实现思路也是先查询Id是否存在,在根据count判断是insert还是update。
71 |
72 | ## 说明
73 |
74 | 1.实现原理是`selectKey`做第一次查询,然后根据结果进行判断,所以这里的`order="BEFORE"`是必须的,也是因BEFORE,所以没法通过``标签来临时存储中间的值,只能在入参中增加属性来存放。
75 |
76 | 2.就上面这个例子而言,就要求实体类中包含count属性(可以是别的名字)。否则`selectKey`的结果没法保存,如果入参是个Map类型,就没有这个限制。
77 |
78 | 3.这种方式只是利用了`selectKey`会多执行一次查询来实现的,但是如果你同时还需要通过`selectKey`获取序列或者自增的id,就会麻烦很多(oracle麻烦,其他支持自增的还是很容易),例如我在上一篇中利用`selectKey` 获取主键Id。
79 |
80 | 4.建议单独查看学习一下`selectKey`的用法。
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/1、《Spring Boot实战》学习总结.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:2018年6月12日
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | # 基础点
10 |
11 | - Spring框架:轻量级的企业级开发的一站式解决方案[^1]
12 | - 每一个被Spring管理的Java对象都称之为`Bean`
13 | - Spring提供了一个IoC容器用来初始化对象,解决对象间的依赖和对象的使用
14 | - Spring是模块化的,因此可以按需使用相应的模块
15 |
16 | **Spring框架四大原则:**
17 |
18 | > 1)使用POJO[^2]进行轻量级和最小侵入式开发
19 | >
20 | > 2)通过依赖注入和基于接口编程实现松耦合
21 | >
22 | > 3)通过AOP和默认习惯进行声明式编程
23 | >
24 | > 4)使用AOP和模板减少模式化代码
25 |
26 | - 控制反转(IoC)是通过依赖注入[^3]实现的
27 |
28 | ## 常用注解总结
29 |
30 | ### 声明Bean的注解:
31 |
32 | > - @Component:没用明确角色
33 | > - @Service:在业务逻辑层(Service)使用
34 | > - @Repository:在数据访问层(Dao)使用
35 | > - @Controller:在展现层(MVC--->Spring MVC)使用
36 | >
37 | > 以上注解作用都是等效,都是告诉Spring容器这是需要进行管理的Bean。通过不同的注解在不同逻辑层进行注解,更加清晰。
38 | >
39 | > @ComponentScan注解会扫描包名下,加入以上注解的类并注册为Bean。
40 |
41 | ### 注入Bean的注解,一般情况下通用,都是等效的:
42 |
43 | > - @Autowired:Spring提供的注解
44 | > - @Inject:JSR-330提供的注解
45 | > - @Resource:JSR-250提供的注解
46 | >
47 | > 以上注解都可以注解到set方法或者属性上,建议注解在属性上,代码少、结构层次清晰
48 |
49 | ---------
50 |
51 | ### @Configuration
52 |
53 | > 声明注解类是一个配置类
54 |
55 | ### @ComponentScan
56 |
57 | > 自动扫面包下面的使用@Service、@Component、@Repository、@Controller注解的类并注册为Bean。(通常和@Configuration一起使用)
58 |
59 | ---------
60 |
61 | - `Java配置`是Spring4.x推荐的配置方式,完全可以代替xml配置,同时也是Spring Boot推荐的配置
62 | - Java配置通过`@Configuration`[^4]和`@Bean`[^5]实现的
63 | - Java配置与`注解配置`的使用原则:`全局配置使用Java配置(如数据库、MVC相关配置),业务Bean的配置使用注解配置(@Component、@Service、@Repository、@Controller)`
64 |
65 | ### @ConfigurationProperties
66 |
67 | 将properties属性和一个Bean以及其属性关联(基于类型安全的配置方式)。即配置与类关联
68 |
69 | ### @EnableConfigurationProperties
70 |
71 | 开启对`@ConfigurationProperties`注解配置Bean的支持,格式:
72 |
73 | > @EnableConfigurationProperties(配置类.class)
74 |
75 | 从而明确指定使用哪个类装载配置信息
76 |
77 |
78 |
79 | # 脚注区
80 |
81 | --------
82 |
83 | [^1]: 解决方案就是可以基于Spring解决Java EE开发的所有问题
84 | [^2]: POJO(Plain Old Java Object),无任何限制的普通Java对象
85 | [^3]: 依赖注入:容器负责创建对象和维护对象间的依赖关系,而不是通过对象本身负责自己的创建和解决自己的依赖。主要目的是为了解耦,体现了“组合”概念
86 | [^4]: @Configuration:声明当前类是一个配置类,相当于一个Spring哦·配置的xml文件
87 | [^5]: @Bean:注解在方法上,声明当前方法的返回值是一个Bean
88 |
89 |
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/4、Spring Boot简述.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:2018年6月15日
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | # Spring Boot 概述
10 |
11 | > Spring Boot是一个框架,主要理念就是消除项目中大量的配置文件,使项目更加短小精悍。我们知道 java 的开发显得很笨重:繁多的配置、开发效率低下、复杂的布署流程以及第三方技术集成难度大。所以说,spring boot就是在此环境下产生的。
12 |
13 | # Spring Boot 的核心功能
14 |
15 | 1. **独立运行的Spring 项目**
16 | Spring Boot **可以以jar包的形式独立运行**,运行一个Spring Boot 项目只需要通过 java -jar xx.jar 来运行。
17 | 2. **内嵌Servlet 容器**
18 | Spring Boot 可以选择内嵌Tomcat、Jetty或Undertow,这样我们无须以war包形式部署项目。
19 | 3. **提供starter简化Maven 配置**
20 | Spring 提供了一系列的starter pom 来简化Maven 的依赖加载。
21 | 4. **自动配置Spring**
22 | Spring Boot 会根据在类路径中的jar包、类,为jar包里的类自动配置Bean,这样会极大地减少我们要使用的配置。Spring Boot只考虑了大多数的场景,并不是所有的场景。
23 | 5. **准生产的应用监控**
24 | Spring Boot 提供基于http、ssh、telnet对运行时的项目进行监控。
25 | 6. **无代码生成和xml配置**
26 | Spring Boot不是借助代码生成来实现的,而是通过条件注解来实现的,这是spring 4.x的新特性。Spring 4.x提倡使用Java配置和注解配置组合,而**Spring Boot不需要任何xml配置即可实现Spring 的所有配置**。
27 |
28 | # Spring Boot 的优缺点
29 |
30 | **优点:**
31 |
32 | 1. 快速构建项目;
33 | 2. 对主流开发框架的无配置集成;
34 | 3. 项目可以独立运行,无须外部依赖Servlet容器;
35 | 4. 提供运行时的应用监控;
36 | 5. 极大地提高了开发、部署效率;
37 | 6. 与云计算的天然集成。
38 |
39 | **缺点:**
40 |
41 | 1. 书籍文档较少且不够深入;
42 | 2. 如果你不认同Spring 框架。
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/5、何为依赖注入and控制反转?.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:2018年6月15日
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | ## 依赖注入
10 |
11 | 所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。
12 |
13 | `依赖注入`(Dependency Injection)和`控制反转`(Inversion of Control)是同一个概念。具体含义是:
14 |
15 | > 当某个角色(可能是一个Java实例,**调用者**)需要另一个角色(另一个Java实例,**被调用者**)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
16 |
17 | 简而言之,`调用者无需考虑创建被调用者实例,而是通过Spring容器实例化被调用者并按需注入对象`
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/6、IDEA创建Spring Boot项目.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:2018年6月15日
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | # 1. 新建Spring Initializr 项目
10 |
11 | 
12 |
13 | # 2. 填写项目信息
14 |
15 | 
16 |
17 | # 3. 选择项目使用的技术
18 |
19 | 
20 |
21 | # 4. 填写项目名称
22 |
23 | 
24 |
25 | # 5. 项目架构及依赖
26 |
27 | 
28 |
29 | # 6. 添加测试控制器
30 |
31 | 直接在入口类中编写。
32 |
33 | ```java
34 | package com.springboot.first;
35 |
36 | import org.springframework.boot.SpringApplication;
37 | import org.springframework.boot.autoconfigure.SpringBootApplication;
38 | import org.springframework.web.bind.annotation.RequestMapping;
39 | import org.springframework.web.bind.annotation.RestController;
40 |
41 | @RestController
42 | @SpringBootApplication
43 | public class FirstApplication {
44 |
45 | @RequestMapping("/")
46 | String index() {
47 | return "Hello Spring Boot";
48 | }
49 | public static void main(String[] args) {
50 | SpringApplication.run(FirstApplication.class, args);
51 | }
52 | }
53 | ```
54 |
55 | @SpringBootApplication是Spring Boot 项目的核心注解,主要目的是开启自动配置。main方法是一个标准的Java应用的main方法,主要作用是作为项目启动的入口。
56 |
57 | # 7. 运行项目
58 |
59 | 把它当成一个java类运行就可以了,右键菜单中选择,如图:
60 |
61 | 
62 |
63 | 运行信息:
64 | 
65 |
66 | 8. 运行结果,如图:
67 |
68 | 
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/7、Spring Boot通过@Value注解注入配置文件数据.md:
--------------------------------------------------------------------------------
1 | # 通过配置文件的注入属性的情况
2 |
3 | 通过`@Value`将外部配置文件的值动态注入到Bean中。配置文件主要有两类:
4 |
5 | - **application.properties**
6 |
7 | `application.properties`在spring boot启动时默认加载此文件
8 |
9 | - **自定义属性文件**
10 |
11 | - 自定义属性文件通过`@PropertySource`加载。
12 | - @PropertySource可以同时加载多个文件,也可以加载单个文件。
13 | - 如果相同第一个属性文件和第二属性文件存在相同key,则最后一个属性文件里的key启作用。
14 | - 加载文件的路径也可以配置变量,如下文的${anotherfile.configinject},此值定义在第一个属性文件config.properties
15 |
16 | ## 配置文件内容
17 |
18 | ### application.properties
19 |
20 | ```
21 | com.title=配置文件-标题
22 | com.description=配置文件-描述
23 | app.name=这是app.name
24 | ```
25 |
26 | ### config.properties
27 |
28 | ```
29 | book.name=bookName
30 | anotherfile.configinject=placeholder
31 | deviceinfo.propertiesname=devices
32 | ```
33 |
34 | ### config_placeholder.properties
35 |
36 | ```
37 | book.name.placeholder=bookNamePlaceholder
38 | ```
39 |
40 | ### devices.properties
41 |
42 | ```
43 | MSR = COM1
44 | IDCARD = COM2
45 | ```
46 |
47 | ## 类文件
48 |
49 | ###配置文件Bean:ConfigurationFileInject
50 |
51 | ```java
52 | package com.springboot.demo;
53 |
54 | import org.springframework.beans.factory.annotation.Autowired;
55 | import org.springframework.beans.factory.annotation.Value;
56 | import org.springframework.context.annotation.PropertySource;
57 | import org.springframework.core.env.Environment;
58 | import org.springframework.stereotype.Component;
59 |
60 | import java.util.HashMap;
61 | import java.util.Map;
62 |
63 | /**
64 | * Title:
65 | * Packet:com.springboot.demo
66 | * Description:
67 | * Author:TangHanF
68 | * Create Date: 2018-4-18.
69 | * Modify User:
70 | * Modify Date:
71 | * Modify Description:
72 | */
73 | @Component
74 | @PropertySource({"classpath:config.properties",
75 | "classpath:config_${anotherfile.configinject}.properties",
76 | "classpath:${deviceinfo.propertiesname}.properties"}
77 | )
78 | public class ConfigurationFileInject {
79 | @Value("${app.name}")
80 | private String appName; // 这里的值来自application.properties,spring boot启动时默认加载此文件
81 |
82 | @Value("${book.name}")
83 | private String bookName; // 注入第一个配置外部文件属性
84 |
85 | @Value("${book.name.placeholder}")
86 | private String bookNamePlaceholder; // 注入第二个配置外部文件属性
87 |
88 | @Autowired
89 | private Environment env; // 注入环境变量对象,存储注入的属性值
90 |
91 |
92 | @Value("${MSR}")
93 | private String msrPort;
94 |
95 | @Value("${IDCARD}")
96 | private String idCard;
97 |
98 |
99 | public String getMsrPort() {
100 | return msrPort;
101 | }
102 |
103 | public void setMsrPort(String msrPort) {
104 | this.msrPort = msrPort;
105 | }
106 |
107 | public String getIdCard() {
108 | return idCard;
109 | }
110 |
111 | public void setIdCard(String idCard) {
112 | this.idCard = idCard;
113 | }
114 |
115 | public String getAppName() {
116 | return appName;
117 | }
118 |
119 | public void setAppName(String appName) {
120 | this.appName = appName;
121 | }
122 |
123 | public String getBookName() {
124 | return bookName;
125 | }
126 |
127 | public void setBookName(String bookName) {
128 | this.bookName = bookName;
129 | }
130 |
131 | public String getBookNamePlaceholder() {
132 | return bookNamePlaceholder;
133 | }
134 |
135 | public void setBookNamePlaceholder(String bookNamePlaceholder) {
136 | this.bookNamePlaceholder = bookNamePlaceholder;
137 | }
138 |
139 | public Environment getEnv() {
140 | return env;
141 | }
142 |
143 | public void setEnv(Environment env) {
144 | this.env = env;
145 | }
146 |
147 | @Override
148 | public String toString() {
149 | StringBuilder sb = new StringBuilder();
150 | sb.append("bookName=").append(bookName).append("\r\n")
151 | .append("bookNamePlaceholder=").append(bookNamePlaceholder).append("\r\n")
152 | .append("appName=").append(appName).append("\r\n")
153 | .append("env=").append(env).append("\r\n")
154 | // 从eniroment中获取属性值
155 | .append("env=").append(env.getProperty("book.name.placeholder")).append("\r\n");
156 | return sb.toString();
157 | }
158 |
159 |
160 | public Map getMap() {
161 | Map map = new HashMap<>();
162 | map.put("appName", getAppName());
163 | map.put("bookName", getBookName());
164 | map.put("bookNamePlaceholder", getBookNamePlaceholder());
165 | map.put("env", getEnv());
166 | map.put("msrPort", getMsrPort());
167 | map.put("IDCARD", getIdCard());
168 |
169 | return map;
170 | }
171 | }
172 |
173 | ```
174 |
175 |
176 |
177 | ###启动类、调用:DemoApplication
178 |
179 | ```java
180 | package com.springboot.demo;
181 |
182 | import org.springframework.beans.factory.annotation.Autowired;
183 | import org.springframework.boot.SpringApplication;
184 | import org.springframework.boot.autoconfigure.SpringBootApplication;
185 | import org.springframework.web.bind.annotation.RequestMapping;
186 | import org.springframework.web.bind.annotation.RestController;
187 |
188 |
189 | @RestController
190 | @SpringBootApplication
191 | public class DemoApplication {
192 |
193 | // 通过 @Autowired 注解自动注入
194 | @Autowired
195 | ConfigurationFileInject configurationFileInject;
196 |
197 | @RequestMapping("/")
198 | public String index() {
199 | StringBuilder stringBuilder=new StringBuilder();
200 |
201 | String getAppName = configurationFileInject.getAppName();
202 | String getBookName = configurationFileInject.getBookName();
203 | String getBookNamePlaceholder = configurationFileInject.getBookNamePlaceholder();
204 | String getMsrPort = configurationFileInject.getMsrPort();
205 | String getIdCard = configurationFileInject.getIdCard();
206 |
207 | stringBuilder.append(String.format("%s>>>:%s
","AppName",getAppName));
208 | stringBuilder.append(String.format("%s>>>:%s
","BookName",getBookName));
209 | stringBuilder.append(String.format("%s>>>:%s
","BookNamePlaceholder",getBookNamePlaceholder));
210 | stringBuilder.append(String.format("%s>>>:%s
","MsrPort",getMsrPort));
211 | stringBuilder.append(String.format("%s>>>:%s
","IdCard",getIdCard));
212 | return "Spring Boot运行成功!
" + stringBuilder.toString();
213 | }
214 |
215 | public static void main(String[] args) {
216 | SpringApplication.run(DemoApplication.class, args);
217 | }
218 | }
219 |
220 | ```
221 |
222 |
223 |
224 | # 注意点
225 |
226 | - `@PropertySource`注解指定资源文件路径
227 | - 加载文件的路径也可以配置变量,如上面的`${anotherfile.configinject}`
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1239524-20171017153642646-1885856870.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1239524-20171017153642646-1885856870.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210185304130-1613507897.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210185304130-1613507897.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210185455021-2123052165.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210185455021-2123052165.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210185604036-1671118057.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210185604036-1671118057.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210185652505-1527919520.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210185652505-1527919520.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210190507802-1074917446.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210190507802-1074917446.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210190955396-606058819.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210190955396-606058819.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210191115740-1641227994.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210191115740-1641227994.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1240732-20171210191207115-1995148064.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1240732-20171210191207115-1995148064.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/1524126243381.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/1524126243381.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20161219173948275.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20161219173948275.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20161219174140134.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20161219174140134.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20161219175328727.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20161219175328727.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20161219200915131.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20161219200915131.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20161219202736423.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20161219202736423.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20161219203215665.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20161219203215665.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20161219203426419.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20161219203426419.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20180307102404653.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20180307102404653.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20180307102504770.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20180307102504770.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20180307103235113.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20180307103235113.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20180307103453201.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20180307103453201.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20180307103936126.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20180307103936126.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20180307104125166.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20180307104125166.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/20180307104219380.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/20180307104219380.png
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/640:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/640
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/640-1524133968480:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/640-1524133968480
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/640-1524133990203:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/640-1524133990203
--------------------------------------------------------------------------------
/编程语言/Java/Sprint-boot/assets/copycode.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/Sprint-boot/assets/copycode.gif
--------------------------------------------------------------------------------
/编程语言/Java/实用代码/IO操作类/IO操作类.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/实用代码/IO操作类/IO操作类.md
--------------------------------------------------------------------------------
/编程语言/Java/实用代码/判断类/1、Java 判断操作系统类型.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Jul 26, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | ```java
10 | String osName = System.getProperty("os.name");
11 | //linu系统
12 | if (Pattern.matches("Linux.*", osName)) {
13 |
14 | } else if (Pattern.matches("Windows.*", osName)) {
15 |
16 | }
17 | ```
18 |
19 |
--------------------------------------------------------------------------------
/编程语言/Java/实用代码/处理转换类/1、Java 递归处理文件夹.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Jul 26, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | # 简单版
10 |
11 | ```java
12 | public static void showAllFiles(File dir) throws Exception {
13 | File[] fs = dir.listFiles();
14 | if(fs!=null) {
15 | for (int i = 0; i < fs.length; i++) {
16 | System.out.println(fs[i].getAbsolutePath());
17 | if (fs[i].isDirectory()) {
18 | try {
19 | showAllFiles(fs[i]);
20 | } catch (Exception e) {
21 | }
22 | }
23 | }
24 | }else{
25 | System.out.println("无文件夹");
26 | }
27 | }
28 | ```
29 |
30 | # 改进版
31 |
32 | ```java
33 | public static void showAllFiles(File dir) throws Exception {
34 | File[] fs = dir.listFiles();
35 | if(fs!=null) {
36 | for (int i = 0; i < fs.length; i++) {
37 | if (fs[i].isDirectory()) {
38 | //此处只显示文件夹,不显示文件
39 | System.out.println(fs[i].getAbsolutePath());//C:\psht\psht\js
40 | showAllFiles(fs[i]);
41 | }else{
42 | //此处只获取文件,无文件夹
43 | // System.out.println(fs[i].getAbsolutePath());
44 | }
45 | }
46 | }else{
47 | System.out.println("无文件夹");
48 | }
49 |
50 | }
51 | ```
52 |
--------------------------------------------------------------------------------
/编程语言/Java/实用代码/处理转换类/2、Java 万年历 计算月天数等.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Jul 26, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | 运行效果图
10 |
11 | 
12 |
13 |
14 |
15 | **代码实现**
16 |
17 | ```java
18 | import java.util.Scanner;
19 | public class MyCalendar {
20 | public static void main(String[] args) {
21 | //System.out.println(getTotalDays(2017,3));
22 | printCalendar();
23 | }
24 | public static void printCalendar() {
25 | System.out.println("请输入4位年份");
26 | Scanner input = new Scanner(System. in );
27 | int nian = input.nextInt();
28 | System.out.println("请输入月份");
29 | int yue = input.nextInt();
30 | System.out.println("\t\t\t" + nian + "," + yue);
31 | System.out.println("----------------------------------------------------------");
32 | System.out.println("星期日 星期一 星期二 星期三 星期四 星期五 星期六");
33 | //1号前边先打印几个 \t,打印几个呢 应该是getTotalDays(年,月)
34 | int spaces = getTotalDays(nian, yue) % 7;
35 | for (int i = 0; i < spaces; i++) {
36 | System.out.print("\t");
37 | }
38 | int days = getDaysOfMonth(nian, yue);
39 | for (int i = 1; i <= days; i++) {
40 | System.out.print(i + "\t");
41 | if ((i + spaces) % 7 == 0) {
42 | System.out.println();
43 | }
44 | }
45 | }
46 | //定义一个方法,返回1905年1.1 到指定年份指定月份的上一个月月底,一共有多少天? 2017 4
47 | //1905.1.1 - 2017.3.31 总天数
48 | //1905.1.1 - 2016.12.31 + 会求!
49 | //2017.1.1 - 2017.3.31 会求!
50 | private static int getTotalDays(int year, int month) {
51 | return getDaysFrom1905(year) + getDaysThisYear(year, month);
52 | }
53 | //定义一个方法,返回指定年份1月1日 到 指定月份的前一个月月底的天数, 2017.4 2017.1.1-2017.3.31
54 | public static int getDaysThisYear(int year, int month) { //2017.4
55 | //一共 , 累加 循环 for
56 | int sum = 0;
57 | for (int i = 1; i < month; i++) {
58 | sum += getDaysOfMonth(year, i);
59 | }
60 | return sum;
61 | }
62 | //定义一个方法; 返回指定年份,指定月份的天数1842 1 3 5 7 8 10 12
63 | // 4 6 9 11 --- 30 2 -- 平年 28 闰年29年
64 | private static int getDaysOfMonth(int year, int month) {
65 | /*if(month == 1 ||month == 3 ||month == 5
66 |
67 | ||month == 7 ||month == 8 ||month == 10 ||month == 12){
68 |
69 | return 31;
70 |
71 | }else if(month == 4||month == 6 ||month == 9 ||month == 11){
72 |
73 | return 30;
74 |
75 | }else if(month == 2){
76 |
77 | //需要对当前年份进行判断
78 |
79 | if(isRun(year)){
80 |
81 | return 29;
82 |
83 | }else{
84 |
85 | return 28;
86 |
87 | }
88 |
89 | }else{
90 |
91 | return 0;
92 |
93 | }*/
94 | switch (month) {
95 | case 1:
96 | case 3:
97 | case 5:
98 | case 7:
99 | case 8:
100 | case 10:
101 | case 12:
102 | return 31;
103 | case 4:
104 | case 6:
105 | case 9:
106 | case 11:
107 | return 30;
108 | case 2:
109 | if (isRun(year)) {
110 | return 29;
111 | } else {
112 | return 28;
113 | }
114 | default:
115 | return 0;
116 | }
117 | }
118 | //从1905年 到指定年份的上一年的年底一共多少天;2017 1905.1.1 - 2016.12.31
119 | //求和 -- 累加 -- 循环 1905-365 1906-365 1907-365 1908-366
120 | private static int getDaysFrom1905(int year) { //1909
121 | int sum = 0;
122 | for (int i = 1905; i < year; i++) {
123 | //如果闰年 += 366 1905 1906 1907 1908
124 | if (isRun(i)) {
125 | //是
126 | sum += 366;
127 | } else {
128 | sum += 365;
129 | }
130 | }
131 | return sum;
132 | }
133 | // 定义一个方法,判断某个年份是否是闰年,如果是返回true,否则返回false;
134 | private static boolean isRun(int year) {
135 | // 2016 是 2017 不是 2000 是 2100 不是
136 | if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
137 | return true;
138 | }
139 | return false;
140 | }
141 | ```
142 |
143 |
--------------------------------------------------------------------------------
/编程语言/Java/实用代码/获取设置类/1、获取Jar包所在路径.md:
--------------------------------------------------------------------------------
1 | > 作者:TangHanF(GuoFu)
2 | >
3 | > 日期:Jul 26, 2018
4 | >
5 | > 说明:转载请注明出处,谢谢!🤝
6 | >
7 | > 联系方式:guofu_gh@163.com
8 |
9 | ```java
10 | /**
11 | * 获取Jar所在目录
12 | *
13 | * @return
14 | */
15 | public static String getPath() {
16 | String path = "";
17 | try {
18 | URL url = UtilProperties.class.getProtectionDomain().getCodeSource().getLocation();
19 | String filePath = null;
20 | try {
21 | filePath = URLDecoder.decode(url.getPath(), "utf-8");// 转化为utf-8编码
22 | } catch (Exception e) {
23 | e.printStackTrace();
24 | }
25 | if (filePath.endsWith(".jar")) {// 可执行jar包运行的结果里包含".jar"
26 | // 截取路径中的jar包名
27 | filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);
28 | } else {
29 | String[] splits = filePath.split("/");
30 | filePath = filePath.substring(0, filePath.lastIndexOf(splits[splits.length - 1]));
31 | }
32 | File file = new File(filePath);
33 | filePath = file.getAbsolutePath();//得到windows下的正确路径
34 | path = filePath;
35 |
36 | // String path = monitorClientMain.class.getClassLoader().toString();
37 | // LogHelper.i(path);
38 | // path = monitorClientMain.class.getClassLoader().getResource("").toString();
39 | // LogHelper.i(path);
40 | // path = monitorClientMain.class.getClassLoader().getResource("").getPath().toString();
41 | // LogHelper.i(path);
42 | } catch (Exception ex) {
43 | LogHelper.e(ex);
44 | ex.printStackTrace();
45 | } finally {
46 | return path;
47 | }
48 | }
49 | ```
50 |
51 |
--------------------------------------------------------------------------------
/编程语言/Java/实用代码/计算类/计算类.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TangHanF/ProjectRecord/dc15a917f2fa914f6cc89273cce3805175d44193/编程语言/Java/实用代码/计算类/计算类.md
--------------------------------------------------------------------------------
/编程语言/NodeJS/实用代码/NodeJS 判断文件是否存在.md:
--------------------------------------------------------------------------------
1 | 引入
2 |
3 | ```javascript
4 | var fs= require("fs")
5 | ```
6 |
7 | 判断的方法
8 |
9 | ```javascript
10 | fs.exists(path, callback)
11 | ```
12 |
13 | path:判断的文件夹、文件的路径
14 |
15 | callback:回调函数
16 |
17 | ```javascript
18 | fs.exists("dirName", function(exists) {
19 | console.log(exists ? "创建成功" : "创建失败");
20 | });
21 | ```
--------------------------------------------------------------------------------
/编程语言/Python/实用代码/IO文件操作类/Python 使用迭代器读取文件.md:
--------------------------------------------------------------------------------
1 | **使用迭代器方式:**
2 |
3 | ```python
4 | f = open('test.txt')
5 | for line in f:
6 | print(line)
7 | ```
8 |
9 | > **这是读取文件的最佳方式,首先是简单、运行速度快,并且从内存使用情况而言也是最好的**
10 |
11 |
12 | **原始方式:**
13 |
14 | ```python
15 | f = open('test.txt')
16 | for line in readlines():
17 | print(line)
18 | ```
19 |
20 | > 对比来看,**虽然readlines方法在功能上可用,但从内存上来看,非常糟糕,他是一次性把整个文件加载到内存**,如果文件太大,以至于计算机内存不够,甚至不能够工作。而我们的迭代器版本则不然,迭代器是按需,一次只读取一行,因此对内存爆炸问题有了很好的免疫
21 |
22 |
--------------------------------------------------------------------------------
/编程语言/Python/实践区/爬虫/利用requests库下载西瓜视频/利用requests库下载西瓜视频实践.md:
--------------------------------------------------------------------------------
1 | # 前言
2 |
3 | [视频地址](https://www.365yg.com/a6565656337697473037/?tt_from=copy_link&utm_campaign=client_share×tamp=1528711505&app=video_article&utm_source=copy_link&iid=34797637181&utm_medium=ios#mid=93110569660)
4 |
5 | # 准备工作
6 |
7 | - Python版本:3.6.4
8 | - 开发工具:PyCharm
9 | - requests库
10 |
11 | > 使用PyCharm作为开发工具的话,如果没有安装requests库时,会提示进行安装。手动执行命令安装的话如下:
12 | >
13 | > `pip install requests`
14 |
15 | Phantomjs:
16 |
17 | > [安装指导](https://blog.csdn.net/crisschan/article/details/52849022)
18 | >
19 | > [各个系统下载](http://phantomjs.org/download.html)
20 | >
21 | > [Python通过PhantomJS获取JS渲染后的网页源代码](https://www.cnblogs.com/yestreenstars/p/5511544.html)
22 | >
23 | > [Python爬虫利器四之PhantomJS的用法](https://www.cnblogs.com/yestreenstars/p/5511544.html)
24 |
25 | - selenium
26 |
27 |
28 |
29 | # 操作步骤
30 |
31 | 梳理中....😂
--------------------------------------------------------------------------------
/编程语言/后端相关类.md:
--------------------------------------------------------------------------------
1 | # 说明
2 |
3 | - 各位有兴趣参与的,可以自行添加相关内容,共同完善内容!
4 | - 此后端的概念比较泛,后端技术、编程语言等目前都纳入其中
5 |
6 |
7 |
8 |
9 |
10 | -------
11 |
12 |
13 |
14 | **分享快乐,祝你快乐!**
--------------------------------------------------------------------------------