斐讯 k2p 刷机

以前也整理过一篇 TP LINK MR12U 刷 Openwrt ,路由器刷机和手机刷机异曲同工。不过刷机需谨慎,稍有错误就有可能导致硬件损坏。前些时候入手了一个斐讯的 K2P,

大致分为几步,第一步开启 telnet,刷入 uboot,然后通过 uboot 刷入新固件。

因为新版本固件 V22.7.8.2版本及之后 需要使用 特殊工具 才能开启 telnet ,所以先要使用这个工具来开启 telnet。然后再使用 a大 的脚本安装 breed。

Opboot及Breed进入方法:

如果你当前是官改或其他第三方固件,请在opboot或breed输入:

  1. 计算机设置为自动获取IP,计算机网线连接K2P的任一LAN口
  2. K2P断电,按住K2P复位键,K2P开电,按住10秒后放开
  3. 访问http://192.168.1.1,可刷入K2P的任何版本
  4. 重新启动后建议K2P恢复一次出厂设置;

官改版本

地址: http://www.right.com.cn/forum/thread-221578-1-1.html

官改版本比较稳定,占用内存小,同时也带去广告,SS/SSR,内网穿透等等功能

潘多拉固件

地址: http://www.right.com.cn/forum/thread-216468-1-1.html

潘多拉版本,同时也支持 SS/SSR,去广告,定时重启等等功能

梅林固件

地址: http://www.right.com.cn/forum/thread-255053-1-1.html

  • 支持adbyby及koolproxy广告屏蔽
  • 支持最新版本ss及S-S R客户端
  • 支持webshell、kms、ngrok内网穿透、wol网络唤醒
  • 支持ssh、用户脚本、硬盘休眠、指示灯控制等

Openwrt 固件

地址: http://www.right.com.cn/forum/thread-240730-1-1.html

K2P基于openwrt最新稳定版chaos_calmer的固件

Padavan

荒野无灯 http://www.right.com.cn/forum/thread-218704-1-1.html 这个固件和原版固件的性能对比可以参考这一篇 http://www.acwifi.net/3173.html

下载地址:http://files.80x86.io/router/rom/K2P/

k2p 全套其他的固件,可以参考这个帖子 http://www.right.com.cn/forum/thread-254947-1-1.html

最后总结下,其实大部分的教程都能在恩山找到,在斐讯的论坛里面,找精华贴,能过滤很多杂乱的信息。并且通过 Google 关键词搜索也能够很快的找到答案。


2018-01-06 k2p , 路由器 , router , openwrt , linux , phicomm

CollectionUtils

Apache commons 包中 CollectionUtils 常用方法介绍。

org.apache.commons.collections.CollectionUtils;

将所有元素添加到一个集合

addAll(Collection<C> collection, C[] elements) 将后面的元素添加到集合中,或者是添加一个非空元素 addIgnoreNull(Collection<T> collection, T object)

Collate (整理)两个列表

将两个有序的列表合二为一,使用 collate() 方法

List<Customer> sortedList = CollectionUtils.collate(list1, list2);

将一个列表中一种类型的对象转变为另一组对象

使用 collect() 方法

Collection<Address> addressCol = CollectionUtils.collect(list1, 
  new Transformer<Customer, Address>() {
    public Address transform(Customer customer) {
        return customer.getAddress();
    }
});

判断是否包含

containsAll(Collection<?> coll1, Collection<?> coll2) 判断是否 coll2 中所有元素都在 coll1 中

containsAny(Collection<?> coll1, Collection<?> coll2) 判断 coll2 中有没有至少一个元素在 coll1 中

CollectionUtils.isSubCollection(list3, list1) 可以使用该函数来判断两个集合是否是包含关系。

过滤元素

使用 CollectionUtils.filter 可以用来过滤 Collection 中不满足条件的元素。这个函数接收两个参数,第一个参数为列表,第二个参数为 Predicate 用来设置条件。

boolean isModified = CollectionUtils.filter(linkedList1, 
  new Predicate<Customer>() {
    public boolean evaluate(Customer customer) {
        return Arrays.asList("Daniel","Kyle").contains(customer.getName());
    }
});

filter() 函数是当 Predicate 返回 false 时移除元素;filterInverse() 函数是当 Predicate 返回 true 时移除元素。

如果想要获取过滤的结果,可以使用selectselectRejected 这两个函数。

判断集合是否为空

CollectionUtils.isEmpty(null): true
CollectionUtils.isEmpty(new ArrayList()): true
CollectionUtils.isEmpty({a,b}): false

判断集合是否不为空

CollectionUtils.isNotEmpty(null): false
CollectionUtils.isNotEmpty(new ArrayList()): false
CollectionUtils.isNotEmpty({a,b}): true

2个集合间的操作

集合a: {1,2,3,3,4,5} 集合b: {3,4,4,5,6,7}

CollectionUtils.union(a, b)(并集): {1,2,3,3,4,4,5,6,7}
CollectionUtils.intersection(a, b)(交集): {3,4,5}
CollectionUtils.disjunction(a, b)(交集的补集): {1,2,3,4,6,7}
CollectionUtils.disjunction(b, a)(交集的补集): {1,2,3,4,6,7}
CollectionUtils.subtract(a, b)(A与B的差): {1,2,3}
CollectionUtils.subtract(b, a)(B与A的差): {4,6,7}

更多的内容可以 Google: https://www.google.com/search?q=CollectionUtils

示例代码可以到 https://github.com/einverne/jutils/tree/master/src/test 来查看。


2018-01-03

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 是一款企业级、高可用、可扩展的开源监控解决方案,提供实时报警、数据监控等功能。可以非常容易的监控整个服务器的状态,比如磁盘空间,端口存活,网络流量等等。

最近有些监控需求所以看了一下其中涉及到概念。

一些基础概念

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 个字段都是必须指定

如何在上报中断时报警

最近遇到的需求就是如果一段时间内,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 来触发报警。

项目的起源

最近看了一篇文章 介绍了 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 的一些常用默认快捷键

快捷键 作用
Alt + Left back current page
Alt + Right Forward current page
Ctrl + h 在新标签页打开历史记录
Ctrl + j 在新标签页打开下载记录
Ctrl + k 将光标定位到 Omnibox ,也就是 Chrome 自定搜索
Ctrl + l 将光标快速定位到地址栏
Ctrl + t 新标签页
Ctrl + d 收藏当前页面
Ctrl + Shift + t 重新打开关闭的标签页
Ctrl + w 快速关闭当前标签页
Ctrl + p 打印 或者 保存为 PDF
Ctrl + n 新开浏览器窗口
Ctrl + Shift + n 新开隐身窗口
Ctrl + r 或者 F5 刷新
Ctrl + u 查看源码
Ctrl + Shift + i 审查元素
Ctrl + Shift + j 开发者工具
Ctrl + Tab 切换到下一个打开的标签页
Ctrl + Shift + Tab 切换到上一个打开的标签页
Ctrl + 单击 在新标签页打开

以上就是最最常用的到的一些快捷键。

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

下载地址:https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb

使用 shift + / 查看所有快捷键,绝大部分都是 Vim 的快捷键,不在赘述。

页面内跳转

快捷键 作用
j 向下
k 向上滚动
d 向下翻页
u 向上翻页
f 显示快捷键导航
F 新标签页打开此链接
H 回退
L Forward
b 弹出 vomnibar 来打开收藏夹中的网址
B 新标签页打开
o 打开搜索工具栏,在收藏夹,历史记录中搜索,如果没有匹配则直接使用默认的搜索引擎搜索
O 功能和 o 一致,区别为在新标签页中显示搜索结果
G 页面底部
r 刷新
yy 复制当前页地址
gi 将光标放到第一个输入框中,在 Google 搜索结果页面非常有用
gg 顶部

标签页

快捷键 作用
J 或 gT 左边的标签页
K 或 gt 右边的标签页
t 创建新标签页
x 关闭当前的标签页
X 恢复刚刚关闭的标签页
g0 跳转到第一个标签页
g$ 跳转到最后一个标签页

其他有用快捷键

快捷键 作用
Ctrl + Shift + W 关闭当前浏览器窗口

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

电子书

最近文章

  • Vim 插件之全局搜索:ack.vim 这篇文章看开始陆陆续续记录一下用过的 Vim Plugin,虽然有些一直也在用但从没有好好整理过,正好这篇开一个计划吧。
  • 我可能要抛弃用了很多年的 Chrome 换用 Vivaldi 大概一两年前就听说了 Vivaldi 这样一款浏览器,它使用 Chromium 做内核,创始人是从 Opera 浏览器出来的,不满 Chrome 横扫浏览器市场,没有给 Opera 一点喘息的机会,很多 Opera 的特性在 Chrome 上都被摘掉了。所以他们就开始搞了这一个 Vivaldi 浏览器,我记得当时听到的第一个宣传语是,快,想来 Chrome 最初打开市场时的宣传语也是快,但是多少年过去了 Chrome 虽然自身保持非常干净,但是加上自定义的扩展,也变得越来越臃肿了,但倒是也在一个可以接受的范围内。两年前 Vivaldi 依靠这一条宣传没有吸引到我,但是我也下载尝试,并且这两年来一直存在我的电脑中。我记得之前在我看来最大的缺点便是不能同步数据,而这个功能也在之前的更新中被加上了。所以今天就非常值得拿出来讲一讲。
  • 使用 port knocking 隐藏 SSH daemon 端口 暴露在互联网上的服务器非常容易被恶意程序进行端口扫描,以前也整理过一篇 VPS 安全设置 的文章,但都是一些比较基础的设置,能够绕过一些简单的端口扫描,但是并不能从根本上解决端口扫描的问题。
  • 威联通折腾篇十四:迁移系统盘 当时安装系统的时候就直接插入了一块硬盘,安装在了第一块机械硬盘上面,虽然读写也没有遇到什么瓶颈,但是记录以做备份,可以用于将系统迁移到 SSD 上。
  • Intellij IDEA 支持 jQuery 在 设置中进行如下操作开启 jQuery 支持: