又到一年的年末,2017 年对于我来说是变化最大的一年,这一年里完成了身份的转变,自此步入社会。这一年年初的时候定下目标年度 100 本书,看来又是无法完成了,现在看豆瓣的标注,也仅仅只有 30 本左右,距离目标甚是遥远。这里也不想再找借口,2017 年中,很大一部分时间共享给了王者荣耀和荒野行动,这两个手游占据了原本打散的碎片化时间。今年也一度差点荒废了 Kindle,Kinde10000 的消失,曾一度让 Kindle 在床头吃灰。
2017 年的读书记录如果再按照以前的分类划分的话,也没太多的变化,唯一增加的分类可能是增加了金融相关的一些书籍。那下面就总结一下好了。
排在首位的永远是小说,在去年读过了大部分的东野圭吾的小说之后,今年似乎找不到主题,除了零星捡漏又看了几部东野圭吾的小说之外,其他作者的很少涉猎。不过今年读过的东野圭吾的小说中也还是有让我记忆比较深刻的几本:
今年看的专业书虽然数量有所增长,但是还是没达到目标。
还有好多都零零落落没看完。
OpenFalcon 是一款企业级、高可用、可扩展的开源监控解决方案,提供实时报警、数据监控等功能,由小米公司开源。使用 Falcon 可以非常容易的监控整个服务器的状态,比如磁盘空间,端口存活,网络流量等等。
最近有些监控需求所以看了一下其中涉及到概念。
Open-Falcon,采用和 OpenTSDB 相似的数据格式:metric、endpoint 加多组 key value 的 tags,举两个例子:
{
metric: load.1min,
endpoint: open-falcon-host,
tags: srv=falcon,idc=aws-sgp,group=az1,
value: 1.5,
timestamp: `date +%s`,
counterType: GAUGE,
step: 60
}
{
metric: net.port.listen,
endpoint: open-falcon-host,
tags: port=3306,
value: 1,
timestamp: `date +%s`,
counterType: GAUGE,
step: 60
}
下面是一段 Python 上报数据的代码,其中涉及到的参数都是必须传的。
#!-*- coding:utf8 -*-
import requests
import time
import json
ts = int(time.time())
payload = [
{
"endpoint": "test-endpoint",
"metric": "test-metric",
"timestamp": ts,
"step": 60,
"value": 1,
"counterType": "GAUGE",
"tags": "idc=lg,loc=beijing",
},
{
"endpoint": "test-endpoint",
"metric": "test-metric2",
"timestamp": ts,
"step": 60,
"value": 2,
"counterType": "GAUGE",
"tags": "idc=lg,loc=beijing",
},
]
r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))
print r.text
说明:
metric
: 最核心的字段,监控指标名称(监控项),代表这个采集项具体度量的是什么,比如是 cpu_idle
呢,还是 memory_free
, 还是 qps
endpoint
: 标明 metric 的主体(属主),比如 metric 是 cpu_idle,那么 endpoint 就表示这是哪台机器的 cpu_idle,一般使用机器的 hostnametimestamp
: 表示上报该数据时的 unix 时间戳,注意是整数,代表的是秒value
: 代表该 metric 在当前时间点的值,float64step
: 表示该数据采集项的上报周期,这对于后续的配置监控策略很重要,必须明确指定。counterType
: 是 Open Falcon 定义的数据类型,取值只能是COUNTER
或者GAUGE
二选一,前者表示该数据采集项为计时器类型(累加值),后者表示其为原值 (注意大小写,这个值是一个波动的值)
- GAUGE:即用户上传什么样的值,就原封不动的存储
- COUNTER:指标在存储和展现的时候,会被计算为 speed,即(当前值 - 上次值)/ 时间间隔
tags
: 监控数据的属性标签,一组逗号分割的键值对,对 metric 进一步描述和细化,可以是空字符串。比如 idc=lg,比如 service=xbox 等,多个 tag 之间用逗号分割说明:这 7 个字段都是必须指定
Metric 监控指标,时序数据。
包括不同类型:
endpoint 通常来指服务器节点。
在 Falcon 中有这样几个不同的接口
Meter 用来累加,可以输出累加和,变化率。
Gauge 用来记录瞬时值,支持 int 64, float 64 类型
Histogram 用来计算统计分布,输出最小值,最大值,平均值,75,95,99 百分比等等。
最近遇到的需求就是如果一段时间内,OpenFalcon 没有收集到数据,也就是 agent 没有采集到数据,程序挂了,或者没有执行,那么就报警。在最开始的时候查看了一下 OpenFalcon 报警函数
all(#3): 最新的 3 个点都满足阈值条件则报警
max(#3): 对于最新的 3 个点,其最大值满足阈值条件则报警
min(#3): 对于最新的 3 个点,其最小值满足阈值条件则报警
sum(#3): 对于最新的 3 个点,其和满足阈值条件则报警
avg(#3): 对于最新的 3 个点,其平均值满足阈值条件则报警
diff(#3): 拿最新 push 上来的点(被减数),与历史最新的 3 个点(3 个减数)相减,得到 3 个差,只要有一个差满足阈值条件则报警
pdiff(#3): 拿最新 push 上来的点,与历史最新的 3 个点相减,得到 3 个差,再将 3 个差值分别除以减数,得到 3 个商值,只要有一个商值满足阈值则报警
lookup(#2,3): 最新的 3 个点中有 2 个满足条件则报警
这一下子就懵了,报警触发的条件都是根据最近上报的几个点的阈值来触发的,而我的需求可能是一段时间内根本没有上报数据。
然后仔细查看文档之后,发现 OpenFalcon 有一个 Nodata 配置,Nodata 的配置正好解决了上面的需求,当机器一段时间内中断上报时,Nodata 配置会上报一个指定的值,然后报警函数就能够根据 Nodata 上报的值来报警。
Nodata 的配置在 OpenFalcon 的后台,在 Nodata 页面添加 Nodata ,填写
name
nodata 的名字,标示什么中断了endpoint
选择 Endpoint ,机器列表,一行一个metric
指定 metrictags
指定 tagstype
暂时只支持 GAUGE周期
秒,与原始监控指标一致上报中断时补发值
当自定义上报中断的时候 Nodata 就会补发,通过补发的值,比如正常的取值是 >0
的正数值,那么补发的值可以写上 -1
,然后通过最近连续的三个 -1
来触发报警。
在服务端接收到打点数据时,在报表中会有一些内置的指标,比如说 75-percentile, 95-percentile, 99-percentile, 999-percentile,CPS-1-min, CPS-5-min, CPS-15-min 等等指标。
对于 percentile 的指标,含义如下:
对于这些指标,还有 min, max, mean 这些指标,这些都比较简单不再赘述。
而另外一种, falcon 中叫做 Meter, 有两种
最近看了一篇文章 介绍了 Open Falcon 项目的起由,这里面提到了 Open Falcon 为了解决 zabbix 的一些问题而被提出
argparse 模块可以轻松的写出友好的命令行交互,让使用者轻松定义命令行参数及使用参数。
首先通过 argparse
来创建一个 ArgumentParser
对象:
parser = argparse.ArgumentParser(description='Process some integers.')
ArgumentParser
对象会保存命令行基本的信息。
构造好了 ArgumentParser
对象之后使用 add_argument()
来往其中添加参数。
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',
... help='an integer for the accumulator')
>>> parser.add_argument('--sum', dest='accumulate', action='store_const',
... const=sum, default=max,
... help='sum the integers (default: find the max)')
这些信息都被保存在对象中,直到 parse_args()
函数被调用。 integers
参数保存了一个或者一个以上列表的int值, accumulate
参数则会根据传入的参数选择 sum()
或者 max()
方法。
ArgumentParser
通过 parse_args()
来解析和使用参数
>>> parser.parse_args(['--sum', '7', '-1', '42'])
Namespace(accumulate=<built-in function sum>, integers=[7, -1, 42])
关于 ArgumentParser
对象更多的使用方法可以参考官方文档
argparse内置6种动作可以在解析到一个参数时进行触发:
argparse能将参数定义组合成“群组”。默认情况下是使用两个群组,一个是选项的群组,另一个是必须的与位置相关的参数群组。
在基础解析器中使用add_argument_group()来创建一个“身份认证”群组,然后逐个添加身份认证相关的选项到该群组。
import argparse
parser = argparser.ArgumentParser(add_help=False)
group = parser.add_argument_group('authentication')
group.add_argument('--user', action="store")
group.add_argument('--password', action="store")
定义互斥的选项是选项分组特性的一个特例,使用add_mutually_exclusive_group()
而不是add_argument_group()
。
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('-a', action='store_true')
group.add_argument('-b', action="store_true")
print parser.parse_args()
你可以配置单个参数的定义使其能够匹配所解析的命令行的多个参数。根据需要或期望的参数个数,设置nargs为这些标识值之一:
值 | 含义 |
---|---|
N |
参数的绝对个数(例如:3) |
? |
0或1个参数 |
* |
0或所有参数 |
+ |
所有,并且至少一个参数 |
argparse将所有参数值都看作是字符串,除非你告诉它将字符串转换成另一种数据类型。add_argument()
的type参数以一个转换函数作为值,被ArgumentParser
用来将参数值从一个字符串转换成另一种数据类型。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', type=int)
parser.add_argument('-f', type=float)
parser.add_argument('--file', type=file)
try:
print parser.parse_args()
except IOError, msg:
parser.error(str(msg))
要想将一个输入参数限制为一个预定义集中的某个值,则使用choices参数。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--mode', choices=('read-only', 'read-write'))
print parser.parse_args()
values的类型取决于nargs的值。如果该参数允许多个值,则values会是一个列表,即使其仅包含一个列表项。
前段时间 Google 1T 空间到期,这几年积累的邮件,照片,Drive 中的内容已经超过了了 20+GB,突然一下子 Google 的空间就满了,Gmail 提醒我空间不足可能无法接收邮件,Drive 无法上传文件,而我查看了一下空间占用,发现 Google Photos 占用超过了 12G,网上搜了一圈,发现 Google Photos 提供一键压缩,然后瞬间就可以继续无限存储了。
因此诞生了这样一篇文章,来看看现在的 Google Photos 怎么来管理照片。其实到现在为止我还是很怀念被关闭的 Picasa,虽然数据无缝的同步到了新的 Google Photos 中,但是这个产品层面的转变,让我很多习惯都改变了,并且以前很多好用的功能都无法找到代替品。
这里不仅能看到 Google Photos https://drive.google.com/#quota
在桌面网页版设置中 https://photos.google.com/settings,可以点击 RECOVER STORAGE
按钮来一键将 Google Photos 中以前保存的无压缩的照片压缩到 Google 支持的高清不占用空间的格式。Google Photos 在计算空间时 16 megapixel 及以下的照片不算空间,而一般 iPhone 7 拍的照片也只有 12 megapixel,所以完全不用担心损失画质,并且我曾经对比过Google Photos 压缩过的图片和原片,肉眼无法看出差别。这个操作不会影响存放在 Google Drive 中的原图,但是会压缩曾经上传到 Blogger,Google Map,Panoramio,Google+ 和 Google Hangouts 中大于 16 megapixels 的图片。
Google 一路改过来,Picasa -> Google+ Photos -> Google Photos,外链是原来越难看。
Picasa
Google Photos
https://lh3.googleusercontent.com/7wqn4oULz6lckUdJbPZzT094xyJiDewL03QS5BZk5kz9c5vP_wvk7fGxSOtxYvAG9N98blJGfZTAdweG_rYnC7sLIrjBAJfX0uIsub_P6waW9AzWmhM0M23BRRVOjNVn52CZIpKbmxMdr9jyjI27zdFCKJb7ZenbDtsFhkr-O7gaXcKuQkQnXJPOI3I8rgYcLGDa3vggdeyCVneimFmRCWfRX75LtJegBshiF7Jy4-fE6slJalAUqtwRAmBck2kaAofuZOHlpAmSsmaNPuaIWoMuTu_AgX1FU1Xx0f9HONI-F0awr0vPl0en1klvBMWXS8RbW5GHrbOrDXtQbpveJ-KnfXPmtTkjxF7vakMMUvWugpg2eohkWh354ndUoqooOP3LrVc-Q8TjrP_9xxkJLOGCdK-Exh2mhXKiTnz_89iPD5dfI27ZmZdY4cVblw2qAOtJ-KVuGXT6oQy0mjttwuiVJONCz-Hl2Tvuncl9ZTCq0XvOBx6wJWDZELxtust5CXIsrsO4L5cSYlxNG_CBXTuR=s945-no
API 导出
https://lh3.googleusercontent.com/bhmJ-XtoL1wMCw3Q2YA0Ff_L8m52OgFbxYfalNjLO22e=s0
我惊讶于同一个照片,在不同的产品中的地址都是不同的,当然基于产品的逻辑倒也不能说什么,但是 Google Photos 的链接也太难看了。
下面是很早之前发过的帖子
其实到现在Google Photos的功能都不及Picasa
而Photos自带的功能看似神奇却也是Picasa自带功能的延伸
其实最后总结一下就是Google 搞了一个阉割的相册管理工具,未成熟却先发布,说是为了产品线统一其实最后就是把阉割了的Picasa直接放出来给用户用了。
最早的时候,从来都是每一次一个相册一个相册管理我的照片,按照日期和活动名字来命名每一个相册,如果分享的话直接同步到 Picasa 然后分享整个相册,然而移动互联网发展的今天 Google Photos 会自动备份手机中的所有图片,默认会给每一天新建一个相册,虽然现在 Google Photos 中间不会显示每天的相册名字,但是如果在其他地方用API来引用 Google Photos 中的内容会异常头疼,所以现在我已经放弃了。
最原先的时候我会精心挑选几张highlight 的照片来作为一个精选照片,而现在 Google 把所有的不管好坏的照片都备份了,以前 Google+ Photos 还能够自动挑选一些比较精华的照片,但是说实话那个照片也是比较鸡肋的,所以现在的 Google Photos 我都是在备份之后,挑选一些照片 Snapseed 或者 VSCO 再修一修上传。
h5ai 自己的介绍说自己的是为HTTP WEB服务设计的一款现代化的文件索引,主要面向文件,提供了现代化的可视化界面。他是一款功能强大的文件目录列表程序,由德国开发者 Lars Jung 主导开发,提供多种文件列表呈现方式,支持多种主流WEB服务器,可以在线预览文本,图片,音频,视频。
依赖:PHP 5.5+ and works fine with Apache httpd, lighttpd, nginx and Cherokee
在没有 h5ai 之前,我都使用 nginx 的自带的显示文件列表配置
location / {
audoindex on;
}
不过不管是 Apache 还是 Nginx 提供的文件列表都是非常简易的,只会显示当前文件夹下的文件,如果都是压缩文件还好,遇到一些多媒体,图片,音频,视频等等就会有一些不便。
h5ai 的安装非常方便,下载,解压,配置 Nginx,配置 DNS,访问即可,如果需要高级功能,可以再配置,主要的配置修改
sudo apt install php7.0
index index.html index.htm /_h5ai/public/index.php;
配置 Nginx,在 /etc/nginx/sites-available/
下创建 drive.einverne.info
server {
listen 80;
listen [::]:80;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
# Add index.php to the list if you are using PHP
root /var/www/drive.einverne.info/html;
index index.html index.htm /_h5ai/public/index.php;
server_name drive.einverne.info;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# autoindex on;
try_files $uri $uri/ =404;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
再将域名的 DNS 配置 A 记录解析到 VPS
在配置的 root 目录 /var/www/drive.einverne.info/html
下
wget https://release.larsjung.de/h5ai/h5ai-0.29.0.zip
unzip h5ai-0.29.0.zip
然后刷新浏览器即可。 哦对了要确保安装了 PHP 7.0 的哈。
h5ai 安装完成之后,可以到 domain/_h5ai/public/index.php
查看 h5ai 的相关信息,默认密码为空。页面中可以查看当前 h5ai 开启的选项。
Ubuntu 16.04 以上
apt-get -y install zip
apt-get -y install ffmpeg # 视频缩略图
apt-get -y install imagemagick # PDF 缩略图
编辑文件 /_h5ai/public/index.php
,在底部增加:
function auth ()
{
$valid_passwords = array ("账号" => "密码");
$valid_users = array_keys($valid_passwords);
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
$validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]);
if (!$validated) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
die ("Not authorized");
}
}
在头部 <?php
的下一行,增加
auth();
位于 _h5ai/private/conf
目录下。
打包下载: 搜索 “download” 127 行,enabled 由 false 改为 true。
文件信息及二维码: 搜索 “info” 185 行,enabled 由 false 改为 true。
默认简体中文: 搜索 “l10n” 202 行,enabled 由 false 改为 true。
文件及文件夹多选: 搜索 “select” 323 行,enabled 由 false 改为 true。
还有二维码等等功能,看一眼配置基本就能明白。
修改 domain/_h5ai/public/index.php
页面的默认密码:
首先生成自定义 sha512 密码:http://md5hashing.net/hashing/sha512 然后搜索 “passhash”,大概第 10 行,将其密码改成自己生成的。
如果使用 LNMP 一键安装的环境,可能需要修改 php 配置,vim /usr/local/php/etc/php.ini
搜索 scandir、exec、passthru,将其从被禁用的函数中删除。
本文总结一下我常使用的 Chrome 默认快捷键,Chrome 默认的快捷键已经非常全面,几乎可以不用鼠标操作浏览器的一切行为,我总以为使用不管是使用鼠标还是手势来进行网页浏览是非常耗时的一件事情,如果能够像 Vim 的哲学一样,不用离开键盘来浏览网页,不仅提高的是效率,也能够培养起,不再做内容的消费者,而是做内容的产生者这样的意识。
首先需要申明一下的是这些都是在 Linux 环境下,Mac 系统及 Windows 系统可能略微有差别,具体请查阅 Google 官方的 Help
下面是 Chrome 自身的一些常用默认快捷键
MacOS 快捷键 | Linux 快捷键 | 作用 |
---|---|---|
Cmd + [ |
Alt + Left | back current page |
Cmd + ] |
Alt + Right | Forward current page |
Cmd + y | Ctrl + h | 在新标签页打开历史记录 |
Cmd + Shift + j | Ctrl + j | 在新标签页打开下载记录 |
Ctrl + k | 将光标定位到 Omnibox ,也就是 Chrome 自定搜索 | |
Cmd + l | Ctrl + l | 将光标快速定位到地址栏,可以输入地址,或者直接进行 Google 搜索 |
Cmd + t | Ctrl + t | 新标签页 |
Cmd + d | Ctrl + d | 收藏当前页面 |
Cmd + Shift + t | Ctrl + Shift + t | 重新打开关闭的标签页 |
Cmd + w | Ctrl + w | 快速关闭当前标签页 |
Cmd + p | Ctrl + p | 打印 或者 保存为 PDF |
Cmd + n | Ctrl + n | 新开浏览器窗口 |
Cmd + Shift + n | Ctrl + Shift + n | 新开隐身窗口 |
Cmd + r | Ctrl + r 或者 F5 | 刷新 |
Cmd + Option + u | Ctrl + u | 查看源码 |
Ctrl + Shift + i | 审查元素 | |
Ctrl + Shift + j | 开发者工具 | |
Ctrl + Tab | 切换到下一个打开的标签页 | |
Ctrl + Shift + Tab | 切换到上一个打开的标签页 | |
Ctrl + 单击 | 在新标签页打开 | |
Cmd + 1/2/3/4 | Ctrl/Alt + 1/2/3/4 | 快速切换标签页 |
Cmd + f | Ctrl + f | 页面内搜索 |
以上就是最最常用的到的一些快捷键,容易忽略的我使用加粗显示了。
我们都知道 Google 的地址栏其实非常强大,Google 把它叫做 Omnibox,不仅可以预测下一个输入,也能够使用之前的记录保存多个搜索引擎。比如我经常使用的一种方式是输入 book.douban.com 然后因为豆瓣图书已经是 Chrome 认为的一个搜索引擎,所以再输入完毕之后 Tab,此时会进入搜索,然后输入图书的名字,回车,就会直接在豆瓣图书中搜索该图书。
对于默认使用 Google 作为地址栏的搜索引擎,那么直接输入回车就会在 Google 进行搜索。默认情况下只要访问过的网站提供搜索功能 Chrome 会自动记录这些网站到 search engines 中,可以在 chrome://settings/searchEngines
查看到。我们都知道 Chrome 中默认的 Google 搜索通常都带一系列的参数,默认情况下这些参数都不大必要,所以我会定义我自己的搜索 query,新增一个搜索引擎,其中的三个输入框分别填入
MyGoogle
google.com__
https://www.google.com/search?q=%s
然后在设置 MyGoogle 作为默认搜索引擎即可。使用同样的方法可以添加自己的专属搜索引擎,比如搜索 Gmail,Google Drive 等等。
然而 Omnibox 其实不仅能够提供 Tab Search 功能,它远比用户想象的要强大的多,甚至可以把它想象成 Google 的搜索栏。这里举一些例子
一个很常见的场景就是在网页浏览中看到一个新的词,想要搜索这个词,有很多方法可以实现,右击搜索也行,复制粘贴到新页面回车也好,不过最简单的方式就是直接选中然后拉到 Tab 位置。这时 Chrome 会使用默认的搜索引擎在新标签页中进行搜索。
在网页中我们可能经常在一个又一个链接中迷失方向,这个时候不用担心,Chrome 记录了每一个浏览过的页面,长按返回键,可以看到一长串的浏览记录,点击其中的一个能看到 Chrome 非常快速的加载了,甚至断网也能够加载,因为 Chrome 已经缓存了访问过的页面。
Chrome 自带一些内部页面,这些页面有些非常常见的用来配置,管理插件,查看历史等等作用的,但更多的是开启一些真正测试功能的,一些 Chrome 内部的数据也能够看到,比如 Omnibox 中根据预测出现的地址等等。我们可以通过 chrome://chrome-urls/
这个页面来查看所有 Chrome 自带的内部地址。
在 Chrome 中使用 Vim 下的快捷键,现在市场上也有不少的在 Chrome 下使用 Vim 快捷键的插件了,但 Vimium 已经用了很多年,没有遇到太大的问题。
下载地址:https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb
使用 shift + /
查看所有快捷键,绝大部分都是 Vim 的快捷键,不在赘述。
页面内跳转
快捷键 | 作用 |
---|---|
j | 向下 |
k | 向上滚动 |
d | 向下翻页 |
u | 向上翻页 |
f | 显示快捷键导航 |
F | 新标签页打开此链接 |
H | 回退 |
L | Forward |
b | 弹出 vomnibar 来打开收藏夹中的网址 |
B | 弹出 vomnibar,但在新标签页打开选中的网址 |
o | 打开搜索工具栏,在收藏夹,历史记录中搜索,如果没有匹配则直接使用默认的搜索引擎搜索,1.66 版本后 o 可搜索打开的标签页 |
O | 功能和 o 一致,区别为在新标签页中显示搜索结果 |
r | 刷新 |
yy | 复制当前页地址 |
gi | 将光标放到第一个输入框中,在 Google 搜索结果页面非常有用 |
gg | 顶部 |
G | 导航到页面底部 |
标签页
快捷键 | 作用 |
---|---|
J 或 gT | 左边的标签页 |
K 或 gt | 右边的标签页 |
t | 创建新标签页 |
x | 关闭当前的标签页 |
X | 恢复刚刚关闭的标签页 |
g0 | 跳转到第一个标签页 |
g$ | 跳转到最后一个标签页 |
快捷键 | 作用 |
---|---|
Ctrl + Shift + W |
关闭当前浏览器窗口 |
虽然写了这么多 Chrome 常用的快捷键,但如果使用鼠标,还有一个非常常用的,那就是鼠标中键点击关闭标签页。
curl 命令是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为下载工具。作为一款强力工具,curl 支持包括 HTTP、HTTPS、ftp 等众多协议,还支持 POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。
下载单个网址,默认将输出打印到标准输出
curl www.google.com
如果需要将页面源码保存到本地,可以使用-o
参数:
-o 将文件保存到 -o 指定的文件名
-O 将文件保存到默认文件名
curl -o google.html www.google.com
默认情况下 CURL 不会发送 HTTP Location headers(重定向). 当一个被请求页面移动到另一个站点时,会发送一个 HTTP Loaction header 作为请求,然后将请求重定向到新的地址上。
curl -L google.com
通过使用-C
选项可对大文件使用断点续传功能
curl -sSL http://to.sh | bash
使用 -i
或者 --include
参数查看返回 Header
curl -i google.com
使用 -i
参数,页面相应头 header 和页面相应 body 一起返回,如果只想查看 header,可以使用 -I
或者 --head
GET 提交直接将参数添加到 URL 后
POST 提交时
curl -X POST --data 'keyword=value' https://httpbin.org/post
其他 HTTP 方法通过 -X
参数指定即可
curl -X DELETE url
curl -X PUT --data 'key=value' url
curl -T file.txt url
curl -E mycert.pem https://url
curl -H ‘Content-Type:application/json' -H 'Authorization: bearer valid_token' URL
-c
参数保存请求返回 Cookie,本地存储文件
curl -b cook_file.txt -c response_cookie.txt URL
通过 -T
选项可指定本地文件上传到 FTP 服务器
curl -u ftpuser:ftppassword -T file.txt ftp://ftp.server
curl -u ftpuser:ftppassword -T "{file1, file2}" ftp://ftp.server
总的来说,curl 的用法比较普通,最常见的也就是用来下载文件,或者直接查看 Header,还有在命令行下发送 GET 或者 POST 请求,其他用法倒也是有,不过日常并没有经常使用到。
wget 是一个下载文件的工具,它用在命令行下。对于 Linux 用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget 支持 HTTP,HTTPS 和 FTP 协议,可以使用 HTTP 代理。
wget https://www.google.com
Axel 是 Linux 下一款不错的 HTTP 或 FTP 高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件,适合网速不给力时多线程下载以提高下载速度。
使用 10 个线程同时下载文件
axel -n 10 url
多线程版本 wget,同时使用 5 个线程下载
mwget -n 5 url
新工具 Trello,说新工具也好,新的规划板也好,Trello 已经代替了我制定规划的其他应用,我曾经尝试过无数的时间管理项目管理工具,没有一个让我有使用 Trello 的舒畅感。
Trello 自己的介绍说自己是一个基于网页端的项目管理应用。但在我个人看来,作为个人的 Board,他是一个极好的 GTD 管理工具,如果是多人使用,那就是一个很好的协作管理工具。
怎么用其实是一个非常个人的习惯问题,他作为一个效率工具提供了各种可能,不仅能够作为简单的待办事项管理工具,甚至能够在十几或者几十人的团队中担任项目管理的工具。
这里就要说到 Trello 中的几个概念,看板、列表、卡片。幸而 Trello 的官方介绍非常详细,连中文译名也是朗朗上口,大赞。如果想要了解 Trello 如何得此名字可以看这篇文章。
一个 Trello 看板是装满卡片的各种列表的列表,它属于一个团队或你本人。可以把他看成是一个黑板,或者一个 Working Area,或者叫 Workspace。
Trello 的列表是承载卡片的容器,不同的工作团队可以根据自己的 Workflow 来定制自己的列表,如果个人作为一个 GTD 的工具,使用官方推荐的,建立三个列表 —-Todo,Doing,Done,也是不错的。
最后 Trello 的卡片,是 Trello 的核心,卡片可以看做是一项待办事项,也可以看做是一个任务,甚至可以看成一个提醒,更或者可以在卡片内部定义自己的更加具体的待办事项(Checklist)。
卡片承载的内容可以很简单,也可以非常复杂,卡片中不仅包括标题,还包括任务描述,附件,清单(Checklist),评论,可以对卡片添加标签,添加到期时间,也可以添加其他成员,甚至可以订阅该卡片的通知。一个卡片承载了非常多的功能,但是使用起来就可以根据不同的应用场景来调整。而这篇文章更是直接使用 Markdown 在卡片描述中完成的。
更加详细的内容可以看:https://trello.com/tour
Trello 团队使用 150 多个看板来管理产品进度 1
Project management apps turn ambitious ideas into workable plans.
跨平台已经成为了我选用工具首选的因素,Web,Android,iOS, 是必须要支持的,其次三大桌面平台,如果有支持当然好,没有客户端,Web App 已经要足够精致和易用。垃圾的 Evernote 就是 Web App 有些烂,还不提供 Linux 版。
想当年 Chrome 出来的时候,主打的第一个特性就是快,对于一个入口应用,必须要足够的快,使用过程中不能有感知的卡顿,否则就失去了这个工具的意义,工具都是为了提高效率而诞生的,自身不能成为影响效率的因素。幸而使用 Trello 的过程中,他也一如他宣传的那样,几乎不用刷新,实时同步,毫无卡顿。
Trello 作为一款看板应用已经被数以千计的公司使用,也得到了无数的三方应用的支持,虽然非企业版可支持的扩展 (Power up)限制为一个,但个人使用 Board,List,Card 等基本功能都是毫无限制的,可以通过 Zapier 或者 IFTTT 集成更多的自动化的工作流进来,比如在 Google Calendar 上新建一个日历时,自动在 List 中创建一个 Card,在 Card 中新建一篇内容时自动创建一个 Evernote 笔记等等,因为开放了 API,无数的可能性,都会诞生。
邮件之于 Gmail,那么卡片就之于 Trello,每一封邮件可能有自己的标签,Trello 中的卡片也有标签,默认提供了很多不同颜色的标签,用来自定义卡片紧急程度也好,定义卡片类型也好,也提供了很多可能。Trello 还提供了 Sticker 这样有趣的功能,可以将不同的 Sticker 贴到 卡片上,很有趣。
Trello 作为一个项目管理或者时间管理的工具,提醒是必不可少的,Trello 的通知方式有很多,应用中通知,邮件通知,浏览器桌面通知,移动设备推送通知,所有的通知在所有的设备上都保持同步。
Trello 更加有效的是订阅模式,如果只对某一个 任务(Card)感兴趣,可以只关心该卡片的变动通知。
如果你还不知道怎么开始的话,可以简单的看看这个
http://help.trello.com/category/694-category
在看板中双击就能在当前位置新建 List,输入名字就能够快速建立 List
如果在网站上浏览到一个图片,可以右键选择复制图片,然后在 Trello 的卡片中可以使用 Ctrl+V 来插入图片。或者如果你更愿意使用拖拽,也可以直接将网页中的图片拖拽到卡片中。
Trelle 的卡片功能丰富,你可以拿卡片做任何想做的事情,但是别忘了你还可以插入一个 Checklist,可以在 Checklist 中填入每一步待办事项,然后做完之后依次 check。即使卡片没有展开,在列表的缩略图上也能清晰地看到卡片有多少项任务没有做完。
我习惯于一定时间后整理 DONE 的卡片,使用快捷键 c
可以快速存档 (Archive) 卡片,用过 Gmail 的人应该非常清楚 Archive 的作用的。
和同类型的其他 Web 应用一样,Trello 网页版可以使用 ?
来查看支持的快捷键,除了上面提到的 c
还有很多可以提高效率的快捷键:
n
新建卡片#
在新建卡片时指定 Label,在输入卡片标题时直接输入 #1
就是添加第一个 Label,同理加数字即可^
后面加数字,表示添加到 List 中第几个j/k/left/right
来快速浏览,/.
用来左右移动卡片/
快速定位到搜索e
悬浮在卡片上,按下 e
可以快速编辑f
过滤,快速打开可以按照 Label 过滤x
清除所有过滤器l
给 card 添加 labelq
可以快速过滤已经 assign 给自己的卡片Space
快速将卡片 assign 给自己,或者快速移除s
开关 watch,关注一个 卡片之后,所有和卡片相关的操作都会收到提醒除了使用 Chrome 的扩展,还可以将下面这个页面保存为书签,点击书签就可以将当前页面保存到 Trello
https://trello.com/add-card
更多 Tip 可以参考这里
Trello Gold 类似于其他网站的高级会员,可以通过购买获取,也可以通过邀请获取。使用 Gold 会员有如下几个好处:
对于普通使用来说,这些额外的附加效果几乎可以忽略,都是一些低频次操作。但如果你是重度用户不妨先邀请身边的好友来先体验下 Gold 版的 Trello。比如你可以邀请小伙伴一起制定计划:
另外我有几个公开的 board,如果感兴趣可以加入:
如果看到这里你想要注册,那么通过我的邀请链接 注册,你我都将得到 1 个月的 Gold 会员。
Ctrl+a Ctrl+e Ctrl+u Ctrl+r
Ctrl+n Ctrl+p 等等
更多的快捷键和 bash 的内容可以参考这篇
绝大多数情况下会在终端来管理 git 项目,对 git 项目最好能够有一个直观的显示,包括当前的分支,修改的内容,命令行空间比较小,但是也能够显示分支名和是否有修改,推荐使用
oh-my-zsh
把每天要使用 5 次以上的命令都制作别名保存到 bashrc 或者 zshrc 中
alias vi='vim'
如果经常切换不同的终端窗口执行不同的任务,那么就需要考虑使用顺手的多窗口或者支持分屏 (panel) 的终端,推荐使用 Tmux,配合快捷键无比顺畅。
Tmux 的内容可以参考这个
除却常用的查找文件、浏览文件命令等等之外,善用命令行中的 Tab 自动补全,通配符等等。
cat, grep
通过文件名查找
sudo find -name <filename> path_to_search
滚动查看大文件
less path_to_file
当前路径下打开文件管理器
nemo .
树形结构展开当前目录结构,包括子目录和文件
tree
流式读取一个文件,实时日志文件
tail -f filename
Unix 哲学中,每个程序都足够小,只做一件事情,并将其做到最好。Bash 提供的管道机制 (|) 可以将命令的输出作为另一个命令的输入,结合两个或者多个命令,比如最简单的例子,ls 是将目录下文件列出, grep 命令是搜索包含指定正则的行,结合两者
ls ~ | grep word
就可以过滤 HOME 目录下,包含 word 的文件
*
星号字符匹配任意长度,比如删除文件夹下,指定文件
rm morning*.jpg
这样就删除了当前目录下所有 morning 开头的 jpg 文件,使用 rm 命令时一定要注意确认
>
字符可以将一个命令的输出重定向到一个文件或者另一个命令的输入,一般情况下命令会有一些输出结果
tree . > file.txt
可以将当前文件目录结构输出到文件 file.txt 中。
>
会覆盖输出的文件 >>
用来追加到文件末尾。
Bash 默认情况下会立即执行当前键入的每一条命令,通常我们就是这样要求终端的,但是如果想要某一些应用在后台长时间执行,可以使用 &
操作符,当然更加推荐 screen
或者 tmux
这类的工具。
./long_time_task.sh &
可以在后台执行一个长时间任务。
使用 htop 来查看系统资源,以及对进程进行管理,当然如果熟悉 ps 也可以使用 ps 来查看
大型 Java 项目可以考虑使用 JetBrains 系列产品,对于 Python, Bash 等脚本语言可以考虑使用 vim
之前一篇文章 已经分享过 [[tmux]] 的基本使用。这一篇就来总结一下 Tmux 下常用的插件。
Vim 有自己的插件管理系统,zsh 也有插件管理,那当然 Tmux 肯定有插件管理,其实学习 Tmux 的过程中,和 Vim 当时一样,所有的拷贝,粘贴的内容都是在 Tmux 和 Vim 的内部,和外部操作系统的粘贴板完全隔离了,我就是为了解决这个问题,才接触到了 Tmux Plugin Manager。
Tmux Plugin Manager 是一个 Tmux 插件管理器,用这个插件可以很方便的管理相关的插件。下文中可能把 Tmux Plugin Manager 简写成 tpm。
tpm 的安装的方法,在 GitHub 的页面非常清楚,git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
项目,在 .tmux.conf
文件中加入配置,重新加载配置即可。
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'git@github.com/user/plugin'
# set -g @plugin 'git@bitbucket.com/user/plugin'
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
新添加插件只需要,在配置文件中增加一行
set -g @plugin '...'
三个操作:
<prefix>
+ I 大写的 I (Install) 来安装新插件<prefix>
+ alt + u (uninstall) 来卸载。<prefix>
+ U,记住是大写的 U
.<prefix> + Alt + u
在 .tmux.conf
中加入
set -g @plugin 'tmux-plugins/tmux-yank'
然后使用 <prefix>
+ I 来安装 tmux-yank
Linux 平台下需要安装依赖 xsel 或者 xclip
sudo apt-get install xsel # or xclip
一些常用的快捷键
在普通模式下
<prefix>
+ y 来将命令行内容拷贝到 clipboard 系统粘贴板。<prefix>
+ Y 将当前 panel 的 working directory 拷贝到粘贴板在拷贝模式下复制到系统粘贴板
从 Tmux copy mode 直接打开选中内容,这个插件可以在 Tmux 的 copy 模式下,直接打开高亮选中的部分。
比较常见的比如选中一段网址,然后按下 o
,即可打开。
或者选中一个关键字,然后使用 Shift+s 来在搜索引擎中搜索。如果想要更换其他搜索引擎可以参考官方配置
Tmux 的 session 在机器关机再启动后就丢失了,使用 tmux-resurrect
可以将 session 保存到磁盘,再次启动机器的时候可以立即恢复。
安装:
set -g @plugin 'tmux-plugins/tmux-resurrect'
然后按下 prefix+I
安装。tmux-resurrect
只有两个简单的 key-binding,分别是保存和恢复:
prefix + Ctrl-s save
prefix + Ctrl-r restore
tmux-continuum 配合 tmux-resurrect 可以实现连续的保存 Tmux 的状态,如果自己的笔记本关机,那么 Tmux 的会话也会被销毁,下次开机需要重新创建,当然配合 fzf 之后倒也是没有那么麻烦,但如果开了 Pane,新建了 Windows,要恢复还是需要花费一段时间的,continuum 能够实时保存,重启后也能快速恢复。
安装:
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
然后启用:
set -g @continuum-restore 'on'
Tmux Sidebar 可以在 Tmux 中展示当前路径的目录树。非常适合和 Vim 一起使用。
Tmux Battery 在 Tmux 中显示电量和状态。