那些高效的Chrome插件

Surfingkeys 👍 严重推荐,VIM键盘模拟,自定义程度非常高 Immersive Translate 👍 无敌翻译软件,支持网页、PDF、本地文件翻译 Tampermonkey 👍 用户自定义脚本管理器 Enhanced GitHub Github加强版,显示仓库大小,下载单个文件等好用功能。插件地址 眺览 TillGlance 👍 一目十行的阅读方式 Elmo - Your AI companion to create summaries and insights 最大优点是生成的摘要最接近原文 Language Reactor 探索、理解并从母语材料中学习的完美助手 PeekLink - Chrome Web Store 浏览体验大升级 iorate/ublacklist: Blocks specific sites from appearing in Google search results WeRead to Readwise Sync, 微信读书笔记同步到Readwise - Chrome Web Store podStation Podcast Player - Chrome Web Store 浏览器中播放播客,支持下载 TODO About | Glasp openstyles/stylus: Stylus - Userstyles Manager 配置Chrome的样式,可针对指定域名进行设置,目前主要用来设置字体 ...

2019-03-08 · 2 min · 328 words · tomyli

那些提高效率的命令行工具

brew Mac软件包管理工具。用命令行命令来安装软件,仓库软件丰富。地址 bat bat? No,高端cat,不费眼。带颜色显示,支持git状态,自动分页。地址 cowsay 奶牛说: 地址 coreutils 使用Rust重写的gnuutils。地址 direnv 环境变量切换,可以指定在进入某一文件夹后的操作,比如输出一条欢迎语句,在退出文件夹后则卸载变量(操作),它的stdlib内置了一些功能来处理环境。 地址 exa ls、tree的替代者,支持多种显示方式,支持按指定条件排序显示。地址 duti mac默认软件打开程序配置。再也不用一个手动的点击设置了,可以脚本化。地址 riggrep 强大的find,查询速度更快,支持匹配结果的字符替换,支持定义输出颜色。地址 fortune 英文名言集合,可以使用fortunes进行扩展,对中文用户更友好。地址 fzf 强大的交互式搜索,大大提高效率,官网提供了很多实用的操作目录与git的命令。地址 goku 改键神器Karabiner的配置管理器,更健康,更人性化。地址 htop 交互式的top信息显示,支持配色。地址 imgcat 命令行看图片。可以控制显示的高度、宽度。地址 jq json内容操作显示。支持分离、过滤、转换元素,判断JSON元素节点是否存在等功能,内置了很多方便的函数。 地址 jenv JDK版本管理命令行工具,支持全局、当前目录、当前shell的jdk版本指定。还可以指定Java虚拟机指定的JVM参数。支持插件的启用与禁用。地址 lnav log file navigator,增加的日志查看,可以根据日志级别显示不同颜色的日志信息。支持分页显示。地址 lolcat 命令、文件内容多彩输出。地址 m-cli Mac的瑞士军刀,支持各种mac组件(Dock,蓝牙,WIFI,Finder)的操作。地址 mackup Mac应用配置同步,支持多种存储方式。支持自定义应用的同步配置。主要命令为backup,restore,uninstall。地址 mas 命令行安装apple store应用。地址 mycli 命令行中的mysql客户端。地址 ncdu 增强版本的du,机器空间使用查询,支持扫描结果导出与导入,支持多种排序方式。地址 Ranger 命令行下的文件管理,强大到没朋友。地址 pandoc 文档转换,支持非常多的的格式转换。地址 pyenv pythne版本管理工具。地址 pyenv-virtualenv pythne虚拟环境管理,管理pyenv配置的环境。地址 prettyping 增强的ping,图形化显示,可以轻松的看出ping的地址的网络状况。地址 rtv 命令行中浏览reddit。地址 s-search 命令行下进行web搜索。地址 tmux 终端多会话管理器。地址 tldr 命令快速查询。简单的man。地址 Terminal Notify 命令行操作mac显示通知,支持图标显示与点击后操作(如打开网址,执行命令)等。地址 w3m 终端浏览器,操作方便。地址 ...

2018-09-30 · 1 min · 119 words · tomyli

那些提高效率的Alfred Workflow

Alfred Maestro 操作Maestro的workflow,可以直接查找macro并执行。插件地址 Alfred github workflow 搜索github上的项目,可以搜索项目,人物等。插件地址 MyIP 快速的查询本机的ip,包括本地IP与外网IP。 SwitchHosts! 在alfred中快速本地host的配置,配合SwitchHosts来使用。插件地址 SnippetsLab 在alfred中快速查看SnippetsLab中的代码片断 VMWare Control 在alfred中控制vmware虚拟机。支持启动、停止、挂起、切换等操作。插件地址 lxbrvr/alfred-keepassxc-workflow: Alfred workflow for fetching the attributes of the KeepassXC entries. Alfred 快速密码访问 Alfred Browser Toolbox Toolbox是一个文件操作浏览的工具,它支持创建、查找文件的功能,还可以查询pdf文件,非常方便。Mac上的Finder使用确定不方便。这里有具体的使用方式。 Alfred Keywords Help 安装的workflow多了,记忆触发的keyword就比较困难,使用Keywords help这个插件可以显示出所有已经安装的workflow的触发key,还可以根据workflow进行查询。 Alfred My Mind 快速查询Nikita的githubpage内容的workflow,我在他的文章里面学到了很多。插件地址 Awesome lists 快速查询Github上awesome列表的workflow,只为发现更多。插件地址,这个也是Nikita的作品。 Baidu Map 在alfred上使用百度地图。插件地址 Birthday 在alfred中显示你来到这个世界多长时间,让你珍惜每一分,每一秒。插件地址 Calendar 在alfred中显示出当月的日历信息。插件地址 Chromes Bookmarks 在aflred中搜索Chrome浏览器的书签,非常的好用。插件地址 Common Search 国内常用网站的搜索,现在支持知乎、淘宝、掘金、github。插件地址 Dash 在alfred中进行Dash的搜索,开发者必备。插件地址 Directory watches 本地目录文件查看,指定目录的搜索,回收站文件显示。 Emacs Workflow 在alfred中进行emacs的操作,比如打开文件等。插件地址 Git Repos 搜索本地的git文件夹,搜索到后可以使用指定软件进行打开,开发时很有用。插件地址 Google Chrome History 在alfred中快速查看Chrome的浏览历史。插件地址 ...

2018-09-21 · 1 min · 174 words · tomyli

那些提高效率的Idea插件

.ignore 插件说明 ignore文件忽略,支持绝大多数的开发语言,支持直接导航到忽略的文件,在创建时可以选择模板,比如Java开发可以选择Java与Idea选项来生成忽略target文件与.idea文件等的忽略规则。 项目地址 https://github.com/hsz/idea-gitignore IdeaVim 插件说明 在Idea中使用vi键位来进行编码操作,可以很高的提高效率,插件支持自定义键位来对Idea的action来进行定制,程序员可以根据自己的编程习惯来定制出一个键盘流来. 项目地址 https://github.com/JetBrains/ideavim IdeaVimExtension Plugin for JetBrains IDEs | JetBrains Marketplace IdeaVim的扩展功能 emacsIDEAs 插件说明 支持一些Emacs操作的Idea插件,主要是一些复制,移动,替换,跳转的快捷操作,目前使用最多的是快速查找替换. 项目地址 https://github.com/whunmr/emacsIDEAs acejump/AceJump: 🅰️ single character search, select, and jump Idea中快速跳转 支持行模式 支持IdeaVim集成 Custom Postfix Templates 插件说明 Idea中非常高效的就是postfix,但是系统自带不可以进行增加,这个插件就可以让用户可以自定义一些高级的postfix语句来提高效率。 项目地址 https://github.com/xylo/intellij-postfix-templates Jrebel 插件说明 动态部署代码插件,可以在不重启Tomcat的情况下进行代码的热部署,提高开发效率没得说。先前可以使用twitter号来免费使用,现在不行,需要自行购买了。 项目地址 https://zeroturnaround.com/software/jrebel/ HotSwapHelper 开源免费的热部署插件 CamelCase 插件说明 文本驼峰规则快速转换,支持从CamelCase->camelCaase->camel_case->camel-case->CAMEL_CASE的顺序转换,idea中只支持全部大写与全部小写的转换. 项目地址 https://plugins.jetbrains.com/plugin/7160-camelcase Codehelper 插件说明 代码自动生成插件,支持根据Pojo名来生成dao,mapper,xml等文件,目前使用较少 生成实体类的setter方法,使用频率高,主要是生成类的setter方法,配合F2查找下一个错误而使焦点至上而下,操作起来非常顺畅。 项目地址 https://github.com/zhengjunbase/codehelper.generator Translation 插件说明 Idea中集成翻译功能,目前支持有道和goolge,百度翻译. 项目地址 https://github.com/izhangzhihao/intellij-rainbow-brackets Clock 插件说明 当你全屏投入工作时,想知道当前的时间,需要切换出全屏模式,这样就打乱了节奏,这个插件可以在Idea的右下方显示出当前的时间信息,非常实用。 插件地址 https://github.com/xamgore/intellij-clock ...

2018-09-05 · 2 min · 233 words · tomyli

设计模式学习之代理模式

说明 代理模式是设计模式中使用频率非常的高的模式,像日常生活中的房产中介、外卖平台都属于代理。代理模式就是在访问真正的业务之时不会直接与真正的业务进行调用,而是与一个与真正业务对象有着相同功能声明的代理来进行处理,但是最终的处理还是由真正的业务类来进行(决定),比如房产中介,他们会帮助找房者根据条件来对可选房屋进行筛选,但是最终订与不订的权利还是由找房者来决定。常见的代理有保护代理、虚拟代理、远程代理。 代理模式 我们常用的后台系统一般会根据用户权限的不同对用户展示不同的业务菜单,拥有高权限的人会展示相对多的菜单进行操作,在这个过程中还要记录用户的操作日志,用户点了什么,执行了什么操作都需要进行记录,达到有据可查。在这个业务场景下,就可以使用代理模式进行实现。代理对象会持有一个真正业务对象的实例,在代理对象中还引用日志服务与权限服务,所有的请求都经过这个代理类来进行,这样就可以根据操作的用户的状态来进行相应的处理了。具体的代码实现如下: 定义一个查询接口,在这里定义一个查询用户收入的方法,如下: package cn.imcompany.proxy; /** * Created by tomyli on 2018/6/28. * Github: https://github.com/peng051410 */ public interface Search { void queryIncome(String username); } 再定义一个实现该接口的具体业务类: package cn.imcompany.proxy; /** * Created by tomyli on 2018/6/28. * Github: https://github.com/peng051410 */ public class SearchService implements Search { @Override public void queryIncome(String username) { System.out.println(username + "开始查询"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(username + "查询完成"); } } 在上面代码中就实现了查询收入的方法,简单的打印了两行日志。 ...

2018-07-16 · 1 min · 189 words · tomyli

设计模式学习之委托模式

说明 委托模式不属于23种设计模式中,但是它在Spring框架中使用的很频繁,Spring的作用在Java的开发是非常大,所以需要学习一下委托模式。委托模式是指两个对象都有相同的方法与功能,比如A、B两个对象都有相同的方法,但是有调用A的method方法,A不会自己来处理而是直接调用了B的同名方法,由两个对象参与同一个请求,接受请求的对象将委托给另一个对象来处理。 委托模式 在一般的公司中,都会分为老板、项目经理、开发人员结构,老板负责制定决策,分配给项目经理后,他不会自己来完成,而是把需要的功能进行分解,交给擅长的开发人员进行实现。虽然项目经理也可以完成,但是是他把这些事情委托给了多个开发人员来做,加快了完成任务的速度。就以这个需求来说,使用委托模式来进行实现: 定义抽象的人类接口: package cn.imcompany.delegate; /** * Created by tomyli on 2018/6/27. * Github: https://github.com/peng051410 */ public interface Member { void showName(); void showSkill(); void doWork(); } 上面代码中定义了抽象的人类接口,显示这个人的名字,拥有的技能,工作的状态情况,接下来实现需求中的每个人。 定义老板(BOSS): package cn.imcompany.delegate; /** * Created by tomyli on 2018/6/27. * Github: https://github.com/peng051410 */ public class Boss implements Member { @Override public void showName() { System.out.println("i am boss"); } @Override public void showSkill() { System.out.println("send commend"); } @Override public void doWork() { } } 定义项目经理和员工: ...

2018-07-07 · 2 min · 282 words · tomyli

设计模式学习之观察者

说明 观察者模式在日常开发中使用频率也是非常高的,它建立了对象与对象之间的关系,一个对象的行为改变会通知到另一个对象,被通知的对象根据通知做出相应的处理动作。在观察者中分为目标对象(被观察者)、观察者。观察者模式是一种对象行为模式。 观察者模式 现在很多人都购买股票,在市面上有很多的股票软件供广大股民使用。股票软件一般会在用户关注的股票有变动时发送消息来通知股民。在这里,某一支股票就是目标对象,广大股民与股票软件就是观察者,他们根据股票的行情变化来做出相应买入或者卖出操作。这一需求可以使用观察者模式进行实现。代码如下: 先来定义一个抽象的购买股票的股民们,他们有喜有悲的心情: package cn.imcompany.observer.stock; /** * Created by tomyli on 2018/6/23. * Github: https://github.com/peng051410 */ public interface Buyer { void setName(String name); String getName(); void happy(); void sad(); } 再来定义具体的股民行为实现类: package cn.imcompany.observer.stock; /** * Created by tomyli on 2018/6/23. * Github: https://github.com/peng051410 */ public class ConcrectBuyer implements Buyer { private String name; @Override public void setName(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void happy() { System.out.println(this.getName() + ":happy"); } @Override public void sad() { System.out.println(this.getName() + ":sad"); } } 具体的股民实现了喜与悲的方法,这样观察者已经准备就绪。下面来定义股票软件: ...

2018-07-04 · 2 min · 244 words · tomyli

设计模式学习之装饰器

说明 装饰器设计模式是使用比较频繁的设计模式,它在不改变原物体的情况对原物体实现了功能的增加,原物体还是一个可单独使用的个体。在JAVA的类库中应该会马上想到IO类,各种的InputStrem,OutputStrem。 装饰器模式 在用户登录的中过程,我们需要对用户输入的密码进行加密操作,在设计时会提供好多种加密的算法,例如简单的BASE64加密,复杂的如MD5、DSA加密。直接把用户的密码存入数据库是真的在耍流氓。在使用这些算法时,我们想灵活的使用,比如使用完简单加密还可以再进行一下MD5的加密。针对这样的需求,可以使用装饰器模式进行实现。大体思路如下: 加密接口,定义加密方法。 在装饰器中,最原始的被装饰者是目标实现,它们一般会实现加密定义的具体方法。 装饰者会针对目标对象进行装饰,所以它要同样实现加密接口的方法,一般情况下这个装饰器会定义为抽象的形式,在这个装饰器父类中维护着对目标对象的引用。 具体装饰器继承抽象装饰器来实现对目标对象的真正装饰操作。 以上的情况在代码上体现为如下形式: 加密接口 package cn.imcompany.decorator.encrypt; /** * Created by tomyli on 2018/6/25. * Github: https://github.com/peng051410 */ public interface Encryptor { void encrypt(); } 具体加密类,实现加密处理接口 package cn.imcompany.decorator.encrypt; /** * Created by tomyli on 2018/6/25. * Github: https://github.com/peng051410 */ public class ConcreteEncryptor implements Encryptor { @Override public void encrypt() { System.out.println("base encrypt!"); } } 抽象加密装饰器 package cn.imcompany.decorator.encrypt; /** * Created by tomyli on 2018/6/25. * Github: https://github.com/peng051410 */ public abstract class EncryptDecorator implements Encryptor { private Encryptor encrypt; public EncryptDecorator(Encryptor encrypt) { this.encrypt = encrypt; } @Override public void encrypt() { encrypt.encrypt(); } } 上面的抽象装饰器实现的加密接口,在这个类中维护加密接口的实体,加密方法直接调用其维护实体的加密方法。 ...

2018-07-02 · 2 min · 236 words · tomyli

设计模式学习之适配器

说明 在前面的文章中介绍了一些关于支付相关的功能,现在转向登录,在早些时期的系统登录就是用户使用用户名与密码进行注册,注册成功后就可以进行登录了。随着时代的发展,出现很多三方的平台,它们对外提供了获取平台用户信息的功能,例如微信、qq、微博等三方登录,在接入这些三方登录时都是遵循相应的规则,老的登录的方式需要保留,对接新的登录方式还想要使用老的登录服务,这样可以使用适配器模式来实现。 适配器模式 比如我们平常使用的转接头一样,就是一种适配器的模式。它使两个不相关的物体很好的关联在一起。对于要接入的新的登录方式,首先定义新的三方登录的接口,定义要使用的三方登录方式,如下代码示例: package cn.imcompany.adapter; /** * Created by tomyli on 2018/6/22. * Github: https://github.com/peng051410 */ public interface ThirdLogin { void wechatLogin(String accessToken); void qqLogin(String accessToken); void sinaLogin(String accessToken); } 如上定义了微信、qq、微博三种登录方式,它们都是使用accessToken来进行认证,经用户同意后获取相应的用户的信息调用方使用。下面来进行具体的实现: package cn.imcompany.adapter; /** * Created by tomyli on 2018/6/22. * Github: https://github.com/peng051410 */ public class ThirdLoginAdapter implements ThirdLogin { private LoginService loginService; public ThirdLoginAdapter() { this.loginService = new LoginService(); } @Override public void wechatLogin(String accessToken) { System.out.println("微信获取用户信息"); loginService.login(accessToken, null); } @Override public void qqLogin(String accessToken) { System.out.println("qq获取用户信息"); loginService.login(accessToken, null); } @Override public void sinaLogin(String accessToken) { System.out.println("微博获取用户信息"); loginService.login(accessToken, null); } } 在上面的实现,并没有重新写登录的逻辑,除了要调用三方平台的代码,登录的功能是直接使用老的登录服务实现的。在这个实现类中引用了老的服务,然后使用其已经非常成熟的功能来完成登录的操作。这样以最少的代码达到了新的需求也使老的服务可以正常运行。免去了很多测试的功能点。这种适配器叫做对象适配器。 ...

2018-06-26 · 2 min · 217 words · tomyli

设计模式学习之模板模式

说明 在一般实现处理用户支付订单时,通常都会在一个单独的回调项目中来处理用户的支付方式回调。一般情况下,回调的处理过程都是相似的,大体的步骤就是获取参数->验证参数->验证签名->验证支付状态(可选)->订单状态为成功增加用户的充值金额。具体的过程由于不同的支付方式不同而处理的不同。这种需求可以使用模板的模板模式来实现。 模板设计模式实现 模板模式就是由一个类来声明整个处理流程的步骤,具体的实现由各个实现类来进行实现。处理的流程不变,变是就是里面具体的实现。针对上面的支付回调,可以声明一个抽象类来声明具体的流程方法,代码如下: package cn.imcompany.callback; import java.util.Map; /** * Created by tomyli on 2018/6/21. * Github: https://github.com/peng051410 */ public abstract class PayCallback { public abstract Map<String, String> getParam(); public abstract boolean checkParam(Map<String, String> param); public abstract boolean validSign(); /** * 定义了一个钩子方法来让子类控制流程实现 * @return true:强制返回,false:不强制返回 */ public boolean forceReturn() { return false; } public String doService() { Map<String, String> map = getParam(); if (!checkParam(map)) { return "param fail"; } if (!validSign()) { return "sign fail"; } if (!map.get("status").equals("success")) { if (forceReturn()) { return "order fail"; } } return "success"; } } 在上面的PayCallback类中声明了getParam(获取参数),checkParam(验证参数),validSign(验证签名),验证支付状态四个步骤,具体的支付回调类要来实现这里声明的方法即可。下面是一个微信支付的回调类的代码实现: ...

2018-06-25 · 2 min · 224 words · tomyli