2017 年读书笔记

又到一年的年末,2017 年对于我来说是变化最大的一年,这一年里完成了身份的转变,自此步入社会。这一年年初的时候定下目标年度 100 本书,看来又是无法完成了,现在看豆瓣的标注,也仅仅只有 30 本左右,距离目标甚是遥远。这里也不想再找借口,2017 年中,很大一部分时间共享给了王者荣耀和荒野行动,这两个手游占据了原本打散的碎片化时间。今年也一度差点荒废了 Kindle,Kinde10000 的消失,曾一度让 Kindle 在床头吃灰。

2017 年的读书记录如果再按照以前的分类划分的话,也没太多的变化,唯一增加的分类可能是增加了金融相关的一些书籍。那下面就总结一下好了。

小说

排在首位的永远是小说,在去年读过了大部分的东野圭吾的小说之后,今年似乎找不到主题,除了零星捡漏又看了几部东野圭吾的小说之外,其他作者的很少涉猎。不过今年读过的东野圭吾的小说中也还是有让我记忆比较深刻的几本:

  • 首先是这本《恋爱的贡多拉》,起初看到这本书的名字的时候,甚至一度怀疑这个作者到底是不是东野圭吾,仔细的查看封面和前言之后确认,这确实是东野圭吾的作品。这本书的文风与之前相比截然不同,这么轻松诙谐的文字,也只有东野圭吾这样的鬼才才能写出来吧。看这本书似乎就是看一个剧,东野圭吾通过滑雪场的缆车把书中几对情侣的各种“恩怨情仇”很诙谐的讲述出来,这样的作品直接拿去改编成剧本都丝毫不会有任何违和。不过这也正是这本书的毛病所在,太狗血的爱情桥段,太烂俗的现代都市爱情故事。不过我更欣赏东野圭吾在书中表述出来的不同人物形象和性格,都知道东野圭吾的推理小说中都是一些阴冷黑暗的角色,而这本不是,甚至这一本可以当成恋爱小说看,里面的人物形象都跃然纸上,不同主人公处理事务各不相同,也最终导致他们的结局不同,总之非常有趣。
  • 《东野圭吾的最后致意》这是一本随笔录,我记得以前也看过一部《我晃荡的青春》随笔录,东野圭吾从工程师,毅然辞职当起职业作家一路并不是一帆风顺,在经历了这么多的曲折之后,才有了今天的东野圭吾,从这本随笔录中也能看到当时努力写作的东野圭吾,幽默的文风一如从前。
  • 再就是《风雪追击》这一本不是那么出彩,滑雪场相关
  • 《悖论 13》 这算是科幻小说吗?我翻开豆瓣的评论,当时看完我写了,在这本小说中,我看到了好莱坞大片的元素,看到了《2012》,看到了《末日崩塌》,看到了《后天》这样的灾难大片的大场景,或许如果有一天有人把这个小说改编成电影,我也还是会去看一看的。其实这个故事很简答,出现了一个平行宇宙,里面的地球出现了各种灾难,一帮人自救互救的故事。
  • 《魔球》很早的作品了,平平
  • 《沉睡的人鱼之家》书中提出了一个值得思考的假设“如果一个人有着正常人的所有生命特征但长睡不醒那算是死亡吗?如果把一把刀插到植物人身上我算杀人吗?”
  • 《白马山庄杀人事件》或者叫 鹅妈妈旅舍杀人事件,关于这本书的出版,其实在《东野圭吾的最后致意》一书中也有提到,现在出版的名字是编辑给起的,原本的名字并不是白马山庄,看完其实也知道整本书和白马山庄并没有大多的关系。
  • 《疾风回旋曲》看完这本小说之后,也顺便把改编的电影也看了,东野圭吾是那么的喜欢滑雪嘛~最近太多关于滑雪场的故事了。
  • 《布谷鸟的蛋是谁的》 年中的时候看的,又是一本滑雪有关的,当然书中更多的讲得是关于孩子,血缘等等
  • 《拉普拉斯的魔女》说实话我不知道怎么归纳这一本,科幻?悬疑?就像当时在豆瓣写下的短评一样,我以为是讲述一个类似《达芬奇密码》这样保护秘密的故事,但其实故事更加复杂曲折。
  • 《平行世界·爱情故事》”带着科幻元素的爱情故事,及时记忆都不在了,爱情也依然不变。”现在看这段短评怎感觉和 《星际穿越》中及时时光穿梭,亲情不变这么像呢。
  • 《黎明之街》也是老早的作品了,tag 婚外情

专业书

今年看的专业书虽然数量有所增长,但是还是没达到目标。

  • 《REST API Design Rulebook》
  • 《Mastering Regular Expressions 3rd : Regular Expressions》
  • 《Mastering Nginx》
  • 《微服务设计》
  • 《Spring 实战(第 4 版)》

还有好多都零零落落没看完。

其他

  • 支付战争 : 互联网金融创世纪,一个产品到达一定瓶颈的时候,需要借助很多的营销策略让用户增长跟上一个层级,这本书就是 PayPal 当时早期员工写的如何帮助 PayPal 获取用户的回忆录
  • 增长黑客 : 创业公司的用户与收入增长秘籍,tag 营销、获取用户
  • 《告白与告别》
  • 《冷浪漫》
  • 《细说汉字》
  • 《汉字构形学讲座》
  • 《基金投资入门与实战技巧》
  • 《一本书读懂黄金白银投资理财》
  • 《你今天真好看》
  • 《重新定义公司 : 谷歌是如何运营的》
  • 《孩子你慢慢来》

2017-12-31 book , reading , collection

Open Falcon 使用和介绍

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,一般使用机器的 hostname
  • timestamp: 表示上报该数据时的 unix 时间戳,注意是整数,代表的是秒
  • value: 代表该 metric 在当前时间点的值,float64
  • step: 表示该数据采集项的上报周期,这对于后续的配置监控策略很重要,必须明确指定。
  • counterType: 是 Open Falcon 定义的数据类型,取值只能是COUNTER或者GAUGE二选一,前者表示该数据采集项为计时器类型(累加值),后者表示其为原值 (注意大小写,这个值是一个波动的值)

      - GAUGE:即用户上传什么样的值,就原封不动的存储
      - COUNTER:指标在存储和展现的时候,会被计算为 speed,即(当前值 - 上次值)/ 时间间隔
    
  • tags: 监控数据的属性标签,一组逗号分割的键值对,对 metric 进一步描述和细化,可以是空字符串。比如 idc=lg,比如 service=xbox 等,多个 tag 之间用逗号分割

说明:这 7 个字段都是必须指定

Falcon 的接口概念

在 Falcon 中有这样几个不同的接口

Meter

Meter 用来累加,可以输出累加和,变化率。

Gauge

Gauge 用来记录瞬时值,支持 int 64, float 64 类型

Histogram

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 指定 metric
  • tags 指定 tags
  • type 暂时只支持 GAUGE
  • 周期 秒,与原始监控指标一致
  • 上报中断时补发值

当自定义上报中断的时候 Nodata 就会补发,通过补发的值,比如正常的取值是 >0 的正数值,那么补发的值可以写上 -1 ,然后通过最近连续的三个 -1 来触发报警。

Histograms

在服务端接收到打点数据时,在报表中会有一些内置的指标,比如说 75-percentile, 95-percentile, 99-percentile, 999-percentile,CPS-1-min, CPS-5-min, CPS-15-min 等等指标。

对于 percentile 的指标,含义如下:

  • 所有采样数据中,处于 75% 处的数值
  • 所有采样数据中,处于 95% 处的数值
  • 所有采样数据中,处于 99% 处的数值

对于这些指标,还有 min, max, mean 这些指标,这些都比较简单不再赘述。

而另外一种, falcon 中叫做 Meter, 有两种

  • sum 是事件发生的总数
  • rate 是 Falcon 上报周期(60s) 内,事件发生的频率,单位 CPS

项目的起源

最近看了一篇文章 介绍了 Open Falcon 项目的起由,这里面提到了 Open Falcon 为了解决 zabbix 的一些问题而被提出

  • 性能瓶颈,数据量大,zabbix 使用的 MySQL 写入瓶颈
  • 多套 zabbix 管理成本高
  • 监控系统不统一

reference


2017-12-29 monitor , log , open-falcon , warning

argparse的使用介绍

argparse 模块可以轻松的写出友好的命令行交互,让使用者轻松定义命令行参数及使用参数。

简单使用

首先创建一个parser

首先通过 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种动作可以在解析到一个参数时进行触发:

  • store 保存参数值,可能会先将参数值转换成另一个数据类型。若没有显式指定动作,则默认为该动作
  • store_const 保存一个被定义为参数规格一部分的值,而不是一个来自参数解析而来的值。这通常用于实现非布尔值的命令行标记
  • store_ture/store_false 保存相应的布尔值。这两个动作被用于实现布尔开关
  • append 将值保存到一个列表中。若参数重复出现,则保存多个值
  • append_const 将一个定义在参数规格中的值保存到一个列表中
  • version 打印关于程序的版本信息,然后退出

参数群组

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会是一个列表,即使其仅包含一个列表项。

reference


2017-12-28 python , argparse , linux , command

Mastering Google Photos

前段时间 Google 1T 空间到期,这几年积累的邮件,照片,Drive 中的内容已经超过了了 20+GB,突然一下子 Google 的空间就满了,Gmail 提醒我空间不足可能无法接收邮件,Drive 无法上传文件,而我查看了一下空间占用,发现 Google Photos 占用超过了 12G,网上搜了一圈,发现 Google Photos 提供一键压缩,然后瞬间就可以继续无限存储了。

因此诞生了这样一篇文章,来看看现在的 Google Photos 怎么来管理照片。其实到现在为止我还是很怀念被关闭的 Picasa,虽然数据无缝的同步到了新的 Google Photos 中,但是这个产品层面的转变,让我很多习惯都改变了,并且以前很多好用的功能都无法找到代替品。

查看 Google Photos 占用 Google 空间

这里不仅能看到 Google Photos https://drive.google.com/#quota

一键压缩 Google Photos 中的照片内容

在桌面网页版设置中 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

https://lh3.googleusercontent.com/-b7vGrWO7M1Q/VeoaKTjWg_I/AAAAAAAA1uA/EKhtBNmcxzQ/s720-Ic42/IU%252520heart.jpg

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

  • 将相册分享给特定用户,用户需登陆账号才可观看
  • 相册标签分类功能
  • 相片外链,在Google Photos 中生成的图片外链很奇怪,远没有Picasa中的直观
  • 相册管理,Picasa 中很容易进行相册管理,而我所熟悉的正是相册管理而不是时间序管理,因为我经常搜不到特定的照片,而如果利用相册我能够非常方便的联想起相片所在的上下环境

而Photos自带的功能看似神奇却也是Picasa自带功能的延伸

  • 人脸检索,早在Picasa时代,人脸管理就已经让我很惊奇了。
  • 搜索,虽然现在利用大数据让我们能够检索照片中的内容,而这个检索却经常让我无法找到特定内容,似乎这个功能很鸡肋,我更加愿意利用tag来标注图片
  • 自动故事、历史照片和自动修图,看起来挺棒的feature,使用过程也是挺棒的,却无意中又捣乱了相册的管理,导致相册乱七八糟,曾经 Google+ Photos的修图功能让我很是惊奇,几乎已经可以代替本地简单修图,并且自带简单滤镜,然而升级之后我就再没有打开过,一是加载缓慢,二是最初的时候完全无法找到该工具。
  • 多人相册管理,这个Google Photos刚更新的神奇功能其实早就被Picasa实现了,对于 Picasa 相册来说可以添加特定用户让其拥有相册管理权限,其中当然包括上传的功能。

其实最后总结一下就是Google 搞了一个阉割的相册管理工具,未成熟却先发布,说是为了产品线统一其实最后就是把阉割了的Picasa直接放出来给用户用了。

Google Photos 改变了我整理照片的方法

最早的时候,从来都是每一次一个相册一个相册管理我的照片,按照日期和活动名字来命名每一个相册,如果分享的话直接同步到 Picasa 然后分享整个相册,然而移动互联网发展的今天 Google Photos 会自动备份手机中的所有图片,默认会给每一天新建一个相册,虽然现在 Google Photos 中间不会显示每天的相册名字,但是如果在其他地方用API来引用 Google Photos 中的内容会异常头疼,所以现在我已经放弃了。

最原先的时候我会精心挑选几张highlight 的照片来作为一个精选照片,而现在 Google 把所有的不管好坏的照片都备份了,以前 Google+ Photos 还能够自动挑选一些比较精华的照片,但是说实话那个照片也是比较鸡肋的,所以现在的 Google Photos 我都是在备份之后,挑选一些照片 Snapseed 或者 VSCO 再修一修上传。


2017-12-26 经验总结 , Picasa , Google , Google Photos

h5ai 目录列表程序

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,访问即可,如果需要高级功能,可以再配置,主要的配置修改

  • 安装php7.0, sudo apt install php7.0
  • 修改 index 添加 h5ai 的地址, index index.html index.htm /_h5ai/public/index.php;
  • 增加 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();

options.json 开启更多功能

位于 _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,将其从被禁用的函数中删除。


2017-12-20 linux , php , nginx , h5ai , file

最有用的 Chrome 快捷键提高数倍效率

本文总结一下我常使用的 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 的地址栏其实非常强大,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 的搜索栏。这里举一些例子

  • 数学计算,Omnibox 输入之后直接会有结果
  • 查询天气,输入 Weather Beijing 不用回车会直接显示结果
  • 查字典, 输入 define + word 会直接显示词典结果
  • 翻译, 输入 translate + word or phrase
  • 汇率转换 currency dollar to rmb

拖拽搜索

一个很常见的场景就是在网页浏览中看到一个新的词,想要搜索这个词,有很多方法可以实现,右击搜索也行,复制粘贴到新页面回车也好,不过最简单的方式就是直接选中然后拉到 Tab 位置。这时 Chrome 会使用默认的搜索引擎在新标签页中进行搜索。

长按返回键浏览当前页面历史

在网页中我们可能经常在一个又一个链接中迷失方向,这个时候不用担心,Chrome 记录了每一个浏览过的页面,长按返回键,可以看到一长串的浏览记录,点击其中的一个能看到 Chrome 非常快速的加载了,甚至断网也能够加载,因为 Chrome 已经缓存了访问过的页面。

几个非常常见的 internal URLs

Chrome 自带一些内部页面,这些页面有些非常常见的用来配置,管理插件,查看历史等等作用的,但更多的是开启一些真正测试功能的,一些 Chrome 内部的数据也能够看到,比如 Omnibox 中根据预测出现的地址等等。我们可以通过 chrome://chrome-urls/ 这个页面来查看所有 Chrome 自带的内部地址。

  • chrome://help
  • chrome://extensions
  • chrome://history
  • chrome://bookmarks/
  • chrome://omnibox/
  • chrome://chrome-urls/
  • chrome://predictors

插件的快捷键

Vimium

在 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 常用的快捷键,但如果使用鼠标,还有一个非常常用的,那就是鼠标中键点击关闭标签页。


2017-12-19 chrome , shortcut , efficiency

每天学习一个命令:curl 命令行下载工具

curl 命令是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为下载工具。作为一款强力工具,curl 支持包括 HTTP、HTTPS、ftp 等众多协议,还支持 POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。

例子

URL 访问

下载单个网址,默认将输出打印到标准输出

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

查看 Header

使用 -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

HTTPS 支持

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

上传 FTP

通过 -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

wget 是一个下载文件的工具,它用在命令行下。对于 Linux 用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器。wget 支持 HTTP,HTTPS 和 FTP 协议,可以使用 HTTP 代理。

wget https://www.google.com

外延 axel

Axel 是 Linux 下一款不错的 HTTP 或 FTP 高速下载工具。支持多线程下载、断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件,适合网速不给力时多线程下载以提高下载速度。

使用 10 个线程同时下载文件

axel -n 10 url

外延 mwget

多线程版本 wget,同时使用 5 个线程下载

mwget -n 5 url

reference


2017-12-18 linux , curl , command , network

Trello 简单使用

新工具 Trello,说新工具也好,新的规划板也好,Trello 已经代替了我制定规划的其他应用,我曾经尝试过无数的时间管理项目管理工具,没有一个让我有使用 Trello 的舒畅感。

Trello 是什么

Trello 自己的介绍说自己是一个基于网页端的项目管理应用。但在我个人看来,作为个人的 Board,他是一个极好的 GTD 管理工具,如果是多人使用,那就是一个很好的协作管理工具。

Trello 怎么用

怎么用其实是一个非常个人的习惯问题,他作为一个效率工具提供了各种可能,不仅能够作为简单的待办事项管理工具,甚至能够在十几或者几十人的团队中担任项目管理的工具。

这里就要说到 Trello 中的几个概念,看板列表卡片。幸而 Trello 的官方介绍非常详细,连中文译名也是朗朗上口,大赞。如果想要了解 Trello 如何得此名字可以看这篇文章

一个 Trello 看板是装满卡片的各种列表的列表,它属于一个团队或你本人。可以把他看成是一个黑板,或者一个 Working Area,或者叫 Workspace。

Trello 的列表是承载卡片的容器,不同的工作团队可以根据自己的 Workflow 来定制自己的列表,如果个人作为一个 GTD 的工具,使用官方推荐的,建立三个列表 —-Todo,Doing,Done,也是不错的。

最后 Trello 的卡片,是 Trello 的核心,卡片可以看做是一项待办事项,也可以看做是一个任务,甚至可以看成一个提醒,更或者可以在卡片内部定义自己的更加具体的待办事项(Checklist)。

卡片承载的内容可以很简单,也可以非常复杂,卡片中不仅包括标题,还包括任务描述,附件,清单(Checklist),评论,可以对卡片添加标签,添加到期时间,也可以添加其他成员,甚至可以订阅该卡片的通知。一个卡片承载了非常多的功能,但是使用起来就可以根据不同的应用场景来调整。而这篇文章更是直接使用 Markdown 在卡片描述中完成的。

trello card

更加详细的内容可以看: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,输入名字就能够快速建立 List

快速插入图片

如果在网站上浏览到一个图片,可以右键选择复制图片,然后在 Trello 的卡片中可以使用 Ctrl+V 来插入图片。或者如果你更愿意使用拖拽,也可以直接将网页中的图片拖拽到卡片中。

充分利用卡片中的 Checklist

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 添加 label
  • q 可以快速过滤已经 assign 给自己的卡片
  • Space 快速将卡片 assign 给自己,或者快速移除
  • s 开关 watch,关注一个 卡片之后,所有和卡片相关的操作都会收到提醒

从浏览器快速添加到卡片

除了使用 Chrome 的扩展,还可以将下面这个页面保存为书签,点击书签就可以将当前页面保存到 Trello

https://trello.com/add-card

更多 Tip 可以参考这里

Trello Gold

Trello Gold 类似于其他网站的高级会员,可以通过购买获取,也可以通过邀请获取。使用 Gold 会员有如下几个好处:

  • 使用额外的 Stickers
  • 可以自定义背景图片
  • 更大的附件,单文件最大可以 250M
  • 上传自定义 emoji
  • 保存搜索结果

对于普通使用来说,这些额外的附加效果几乎可以忽略,都是一些低频次操作。但如果你是重度用户不妨先邀请身边的好友来先体验下 Gold 版的 Trello。比如你可以邀请小伙伴一起制定计划:

Trello screenshot demo

另外我有几个公开的 board,如果感兴趣可以加入:

如果看到这里你想要注册,那么通过我的邀请链接 注册,你我都将得到 1 个月的 Gold 会员。

reference


2017-12-13 todo , web , 产品体验,plan , gtd , checklist , list , card

优雅地使用命令行

使用快捷键

Ctrl+a Ctrl+e Ctrl+u Ctrl+r

Ctrl+n Ctrl+p 等等

更多的快捷键和 bash 的内容可以参考这篇

终端显示 Git 分支

绝大多数情况下会在终端来管理 git 项目,对 git 项目最好能够有一个直观的显示,包括当前的分支,修改的内容,命令行空间比较小,但是也能够显示分支名和是否有修改,推荐使用

oh-my-zsh

使用别名

把每天要使用 5 次以上的命令都制作别名保存到 bashrc 或者 zshrc 中

alias vi='vim'

使用 Terminator 或者 Tmux

如果经常切换不同的终端窗口执行不同的任务,那么就需要考虑使用顺手的多窗口或者支持分屏 (panel) 的终端,推荐使用 Tmux,配合快捷键无比顺畅。

Tmux 的内容可以参考这个

善用 Linux 命令

除却常用的查找文件、浏览文件命令等等之外,善用命令行中的 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

Other

  • RedShift:在电脑屏幕上放上这个会让你睡得更好。
  • Self Control:这个可以帮助你控制你自己的习惯,避免在 FB,Twitter 上流连忘返。

reference


2017-12-12 linux , command , git , tmux

Tmux Plugins


layout: post title: “配置 Tmux 的插件提高效率” tagline: “” description: “介绍目前我在使用的 Tmux 插件们” category: 学习笔记 tags: [tmux, linux, terminal,] last_updated: –

Vim 有插件管理,zsh 也有插件管理,那当然 Tmux 肯定有插件管理,其实学习 Tmux 的过程中,和 Vim 当时一样,所有的拷贝,粘贴的内容都是在 Tmux 和 Vim 的内部,和外部操作系统的粘贴板完全隔离了,我就是为了解决这个问题,才接触到了 Tmux Plugin Manager

Tmux Plugin Manager

安装的方法,在 GitHub 的页面非常清楚,git clone 项目,在 .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-yank

.tmux.conf 中加入

set -g @plugin 'tmux-plugins/tmux-yank'

然后使用 <prefix> + I 来安装 tmux-yank

Linux 平台下需要安装依赖 xsel 或者 xclip

sudo apt-get install xsel # or xclip

快捷键

在 normal mode 下

在普通模式下

  • <prefix> + y 来将命令行内容拷贝到 clipboard 系统粘贴板。
  • <prefix> + Y 将当前 panel 的 working directory 拷贝到粘贴板

在 copy mode 下

在拷贝模式下复制到系统粘贴板

  • y 拷贝到系统粘贴板
  • Y 将选中的内容,粘贴到命令行

tmux-open

从 Tmux copy mode 直接打开选中内容

tmux-resurrect

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

2017-12-08

电子书

最近文章

  • 使用 assh 来管理 SSH config 前两天一直在思考如何管理我的 SSH config 配置,最后的解决办法就是通过 git 版本管理起来。但这两天由冒出一个新的问题,那就是经常在国内直连 aws 或者 oracle 的机器时 ssh 连不上,但是通过国内的 VPS 中转就非常快,那这就意味着,我每一次连接国外的机器时必须先登录腾讯云的机器,然后在从腾讯云的机器上连过去,有些麻烦,但那天在 Twitter 上看到有人分享了一个 SSH 管理的命令行工具 assh,大致的看了一下使用简介,通过配置就可以完美的解决这个问题。
  • 备份和恢复从 Chrome Webstore 中下架的 Google Chrome Extension 这两天重装系统同步 Chrome 的数据才发现,我一直使用的 Dream Afar New Tab 这个我用了很久的扩展从 Chrome Webstore 消失了,不清楚是 Google 主动下架,还是作者很久没有更新被 Webstore 下了还是为什么。但这个扩展经过了很多的 Chrome 版本依然运行良好至今为止都能每天给我提供世界不同地方的美景。
  • Docker 网络与容器互联 简单整理一下 Docker 中 network 子命令,以及 docker 中相关 network 方面的内容。
  • MacBook Pro 初始设置记录 这里就简单的记录一下我从 Linux Mint 迁移到 MacOS 根据我的个人需求来初始化新的 MacBook Pro 的一些设置,和一些基本的感想。下面的内容会按照我自身的需求出发,我会列举我想要的功能然后在此基础上我需要借助哪些工具来实现。在切换到 MacBook Pro 之前,我使用了大约 6 年多的 Linux Mint,我已经有一套我自己的 Workflow,在切换到 Mac OS 之前我就在想哪一些的事情我是必须有 Mac 的软硬件才能做到,并且很提高某一方面的效率的,我列了一些
  • 多设备间同步 ssh 配置及密钥 ssh 客户端会在用户目录 ~/.ssh/ 目录下存放配置信息 (~/.ssh/config) 和公钥和私钥,如果有多个设备不同设备间的同步和管理就会成为一个比较头疼的问题。我在 Reddit 上抛出这个问题 后,我本来想的是通过 git 版本控制来进行管理,但有人说因为公钥和私钥都是二进制的文件,其实没有必要使用 git,任何一个同步工具就能够解决。