Ask and Learn

Github 上面有许多 Awesome List,我自己也有整理一些,整理的比较频繁的的, 是 远程工作资料

Github 上面的 Awesome List 一般都是使用 Markdown 来编写在项目的 README.md 文件中。 编辑这种单文件的项目,相比于下载到本地后编辑再推送,我更喜欢使用 Github 的在线编辑器, 虽然这个编辑器并不怎么好用。

要在线编辑 README.md 文件,通常需要在文件列表中点击 README.md 文件然后等待页面加载好 (在天朝通常很慢),然后在点击编辑按钮打开在线编辑器,然后就可以进行编辑了。

image image

这个过程非常繁琐,一天要是多来几次就会受不了了,你当然可以把编辑 README.md 的网址存成书签, 但如果有多个项目要维护,你就得存很多书签,然后每次需要去找,并不是经济的解决方案, 于是我写了个小书签

javascript:document.location = document.querySelector('[property="og:url"]').content + '/edit/master/README.md';

Github 项目的页面源码中都会有这样一个标签。

<meta content="https://github.com/username/repo-name" property="og:url" />

这个小书签正是用它来构造出编辑 README.md 文件的网址,然后跳转,没有什么技术含量, 但的确方便了我日常的操作,减少了很多次点击。不过这个小书签有个限制, 你的 README 文件必须命名为 README.md,不然它找不到。虽然有诸多限制,但还是希望大家能喜欢。

要使用这个小书签,将下面的链接拖动到书签栏,在需要编辑 README 的 Github 页面上点击即可编辑。

Edit README


最近在构思做一个专门用于编辑 Awesome List 的 Chrome 扩展,提供快速编辑按钮,失效 URL 检测, 生成 Table of Content,列表模板等实用的功能。

阅读全文…

之前发布过一个小书签应用《百度短网址应用》,部署在 Coding.net 的演示平台上面的,但后来这个演示平台越来越不靠谱,最早是纯静态页面都整天挂,后来改成一个 PHP 单页,挂得更频繁了,现在干脆收费了,看来演示平台是玩不成了。

自己的 VPS 只是单纯的部署了个博客,有些浪费,于是就把这个短网址服务用 Python 重写,并发布到自己的 VPS 上面了。

访问网站 http://dwz.ghoulmind.com/ 或者把小书签 缩短网址 拖动到书签栏使用。

小书签界面

更换了短网址的服务

之前版本的短网址使用的是百度的 API,但百度的短网址虽然不需要 API_KEY 就能调用,但有很多缺陷,比如一些 https 的网址或者新注册的域名,它便不能转换,谁知道它拿网址干什么了,转换个短链竟然会失败。

百度短网址服务

国内开放 API 的短网址服务非常少,有的文档做的很烂,有的限制很多,有的还给你套一层 iframe,找来找去,找到了一个 3023.com 的 API 服务,托管在 百度 ApiStore 上面,转换服务应该是代理的的新浪的短网址服务。

http://apistore.baidu.com/apiworks/servicedetail/1466.html

开放源代码

这次重写,我把这个小书签应用开源在了 Github 上面 ,希望能够得到大家的关注及反馈。

https://github.com/greatghoul/dwz

阅读全文…

使用 Rails 做 Web 应用时,基本上都会遇到使用第三方前端组件的情况,相比于自己手动 Copy 组件的文件到 Assets 中,使用一些别人封装好的 Gem,或者借助 bower-rails 等工具,可以更省心的管理这些依赖文件。

一些组件的 CSS 中可能通过一些 CDN @import 引入一些依赖,比如 Google Fonts。这对开发者来说,本来是件极便利的事,但因为一些众所周知的原因,一些通过 URL 引入的样式文件无法访问或者访问很慢,而样式一般是在网页头部引入,这导致整个网页加载异常缓慢,因为无法访问的样式表请求一直 Block 在那里,直到出错或者加载完成。

@import url('https://fonts.googleapis.com/css?family=Open+Sans');

以前我的做法是 Fork 组件的代码,从中去除这些影响访问的资源引入,然后通过 GIT 地址引入到项目中,但这样做非常不优雅:

  • 一个项目用的第三方组件可能很多,一个个 Fork 很费事
  • 通过 Git 引入的依赖在安装时一般很慢,这一定程度上影响了部署的速度
  • 不能及时更新组件的新版本

怎么办呢?在查阅了 Sprockets 的资料后,发现有个叫 Processor 的东西,似乎能派上用场。Processor 的 call 方法可以返回一个包含 :data 的 Hash,用于传递处理过的 Asset 内容到下一个 Processor。

def self.call(input)
  input[:cache].fetch("my:cache:key:v1") do
    # Remove all semicolons from source
    input[:data].gsub(";", "")
  end
end

注:直接返回字符串相当于返回 { data: str }

这下有得玩了!

class ChinaSprocketsProcessor
  GOOGLE_FONT_PAT = /@import\s+url\(.*?googleapis.*?\);?/
  BOOTCDN_PAT = /@import\s+url\(.*?bootstrapcdn.*?\);?/

  def self.call(input)
    data = input[:data].gsub(GOOGLE_FONT_PAT, '').gsub(BOOTCDN_PAT, '')

    { data: data }
  end
end

Sprockets.register_postprocessor 'text/css', ChinaSprocketsProcessor

将这段代码添加到 config/initializers/assets.rb 中,这样 CSS 文件中 googleapis 的引用和 bootstrapcdn 的引用都会被干掉了,即不用自己修改组件的代码,还符合了国情,真是太好了👏🏻。

阅读全文…

无聊的时候,经常会在知乎看一些精彩的回答,如果回答太长,就懒得自己看,一般会选中文字然后 Option+ESC 用 OSX 自带的文本转语音工具来进行朗读,但自从知乎启用了版权说明后,复制时会在复制的文本前添加一些版权信息,OSX 的朗读功能应该是调用的复制功能,所以每次都要把版权信息读很久,极不方便。

说实话这功能真的防君子不防小人,我不晓得自己是君子还是小人,但这个功能真的妨碍到我了,所以我决定干掉它 😈

Google 一番就知道这个功能是如何实现的了,利用的是 copy 事件,要注销掉这个事情不太容易,但要避开它却很简单,阻止冒泡就好了。

知乎的这个事件是绑定在回答区域的,那么在回答的子元素上捕获 copy 事件,然后阻止向上冒泡就可以了,这里我用了 jquery,因为我比较懒。

$('.zm-editable-content').on('copy', function(evt) {
    evt.stopPropagation();
});

像上面这样,捕获到这个事件不作任何处理,仅阻止冒泡,就可以避开。

说明

完整的代码

// ==UserScript==
// @name         禁用知乎版权信息
// @namespace    http://g2w.me/
// @version      0.1
// @description  彬知乎版权信息
// @author       greatghoul
// @match        https://www.zhihu.com/*
// @grant        unsafeWindow
// @require      http://cdn.bootcss.com/jquery/1.12.0/jquery.min.js
// ==/UserScript==
/* jshint -W097 */
'use strict';

$('.zm-editable-content').on('copy', function(evt) {
    evt.stopPropagation();
});

在 Chrome 中,可以使用 Tampermonkey 来管理 userscripts,我也仅仅在这个平台上测试过。

阅读全文…

我的工作和生活中,有很多和数字有关的故事,这些数字总能让事情变得更简单和有趣,这篇文章,我来和大家分享一下这些有关数字的故事。

作为一个终身学习者,每天要阅读很多的邮件、新闻、博文来涨姿势,作为一个热情的开发者,公司项目,开源项目,业余项目都需要投入精力,这么多的事情要做,怎样让自己的节奏不至于乱掉呢?告诉你,我有一个数字的魔法,我称它为 Rule-5

什么是 Rule-5

Rule-5 是我根据自己的习惯,制定的一个规则,让我可以以五项为单位安排学习、工作和娱乐,因为有规可循,它让我时刻保持着节奏感。

安排待办事项

Rule-5 最重要的作用还是组织我一天的工作,当我要投入工作时,我会根据眼下的事务安排 5 条待办事项,这 5 条事项有下面的规则。

  • 三条重要事项,一般是和公司工作相关的项目开发任务
  • 两条一般事项,比如其它项目开发、查资料、学习新技术或者写作等
  • 每条重要事项的时间尽量不超过一小时
  • 每条一般事项的时间尽量不超过半小时
  • 重要 / 一般 / 重要 / 一般 / 重要 的顺序进行处理
  • 每条事项处理完可以休息片刻,比如做家务,发呆什么的

说明一下最后最后两条规则:重要事项和一般事项交替处理,以及中间的休息,之所以这样,是为了有效缓解疲劳,不至于过度使用体力和脑力,让自己时刻保持高效的状态

一般来说,5 条事项处理完了,再安排新的 5 条事项,并不会去做长远的计划,因为计划赶不上变化,当然规则不是死的,如果有紧急事项,可以及时调整。

阅读邮件、订阅和微博

相比开发和写作,阅读是比较轻松的,我订阅了大量的信息包括邮件列表和 RSS Feed,需要利用碎片时间把这些信息消化掉。

比如在工作间隙,我会快速浏览 5 条有价值的邮件或者订阅,然后再回到工作,如果实在没有什么感兴趣的内容,会果断的全部标为已读

image

image

有时候会遇到一些有价值的长文,需要细读,这时快速浏览便不太适合了,对于这些文章,如果不太长,我会仔细阅读一下,如果比较长,或者没有闲余时间,一般会推到 Pocket,或者保存为书签稍候阅读。

对于长文,除非时间非常充裕,我通常不会一口气读完,一般是读上两三段文字,就回到工作工作上,有碎片时间了,再来读上两三段,慢慢就把长文消化完了。

阅读,一般是利用碎片时间,比如跑测试用例、等待 CI 自动发布应用、网速略渣 Google 搜索结果好长时间打不开,等等。这些碎片时间,与其焦急的等待,不如用在更有意义的事情上,从这方面讲,阅读也是一种对工作的调剂。

治疗 Minecraft 强迫症

Minecraft 是我最喜欢玩的一款游戏,玩过的朋友都知道,矿洞中的煤的储量简直太丰富了,以前我总是强迫症爆发,想要把遇到的每一处煤矿都开采的干干净净,然后整个人都不好了。

煤矿

这是病,得治!于是我在 Minecraft 里面挖煤时,也用上了 Rule-5,路上遇到煤矿时只开采 5 个,返程时如果还经过这条路,再开采 5 个,如果仍然没有开采完,就不再开采了,果断舍弃掉,这样既节省时间,又不至于背包很快就满了,而且还比较有趣,算是一种平衡吧。

清理书签

相信大家都有浏览器书签收藏了一大堆网址然后在那里落灰的体验吧,随着积累越来越多,清理的成本就越大,舍不得删除,总觉得哪天可能会用到。

我之前也是这样,但自己用了 Rule-5 后,就不再有这样的烦恼了。

我仍然是利用碎片时间来阅读和清理以前收藏的书签,为了让清理收藏这件事儿变得有趣一些,我安装了一个随机打开一个书签的浏览器扩展,有碎片时间了,就点开 5 个,有用的归类整理到 Evernote 中,不至于找的时候找不到,价值不大的,就直接删除掉。

书签每次打开都是随机的,不会有翻找一大堆东西的压迫感,而且时常还能有些小惊喜。

用数字让事情变得简单有趣

我的工作、学习和生活中并不只有 Rule-5,还有其它很多事情 ,和数字相关,可以让枯燥的事情变得稍微有趣一些。

坐在电脑前,我每天要喝很多杯茶,家里的饮水机是那种有一个独立的热水壶,每次都需要手工接水加热的那种,烧太多水喝不完就会凉掉,虽然家里有个保温瓶,但保温效果一般,用来泡茶叶效果并不好。所以我每次都是喝多少水,烧多少水,烧水的壶上有刻度,所以可以精确的接刚好够一杯茶的量。

但为了看刻度,每次接水时我都需要蹲下,你知道的,这对胖子来说比较难受,尤其还要蹲好一会,为了避免蹲,我就在心里数数,为了让这件事儿不是太无聊,我就按音乐打拍子的形式来数数字,12345678,22345678 这种,以我习惯的语速,数到 4x8 的时候,恰好水位到我所需要的刻度处。

所以通过数数字,我不需要蹲下,甚至半着眼睛都可以精确的接到定量的水来烧水泡茶。

这样的例子,生活中还有很多,这是数字的魔法,它让我受益无穷,所以我把它分享给大家。

阅读全文…

RSpec 中使用 FactoryGirlcreate_list 批量生成记录时,经常出现记录并未创建的问题。

let(:posts) { create_list(:post, 3) }

it 'returns post list' do
  get '/api/v1/posts'
  expect(json.size).to eq 3 # Fail: expect 3, got 0
end

这里期望是返回长度 3 的,结果返回了 0,本来以为是 FactoryGirl 的 Bug, 并且在官方的 Repo 里面也找到了同样的 Issue, 但今天仔细查过 RSpec 的文档之后才发现,是自己的用法有错误。

Note that let is lazy-evaluated: it is not evaluated until the first time the method it defines is invoked. You can use let! to force the method’s invocation before each example.

https://www.relishapp.com/rspec/rspec-core/v/2-5/docs/helper-methods/let-and-let

也就是说,如果在 let 的 block 中使用 create_list,除非变量被引用到, 否则 block 的内容并不会被执行,比如上面的例子,在 Example 中并没有引用到 posts, 返回的结果自然是 0。

要让 let 的 block 在定义时就被执行,需要使用 let!

let!(:posts) { create_list(:post, 3) }

使用时一定要谨慎,切记切记。

阅读全文…

image

作为一个程序员,尤其是一个远程工作的程序员,翻墙的技术可以说是立身之本,作为一个常年翻墙者, Shadowsocks 和 VPN 那都得备着,SS 是自己搭建的,只有一个服务器可以用,没有什么最快的概念, 这里我讲讲 VPN。

VPN 我使用的是云梯的服务,用了两年左右了,以前还写过一个批量创建 VPN 配置的文章, 不过自从入了 MBP 后,官方有 OSX 一键安装的脚本,方便多了。

没有哪个翻墙服务是一一直稳定的,云梯也是一样,虽然有多个服务器可以切换,但一个个试也比较烦, 于是有了今天这篇文章(我需要一个能找出连接相对稳定的服务器的脚本)

因为我自己并不懂 ping 的原理,所以这里用了一个别人写好的脚本修改而来,

https://gist.github.com/greatghoul/24b093637e39f0bd3df3

原理是对每个 ip 执行发四个包,平均咱就时间最快的就认为最稳定,你需要准备一个 hosts.txt 文件, 每行写一个服务器地址,和下载的脚本 check_vpn.py 放在同一目录:

a1.examplevpn.com
a2.examplevpn.com
a3.examplevpn.com
a4.examplevpn.com
a5.examplevpn.com

然后在断开 VPN 的情况下以 sudo 执行以下命令

sudo python check_vpn.py

会得到平均响应时间由低到高排列的结果列表:

host                  lost/total  avg/min/max
a3.examplevpn.com     0/4         108.0587/82.1869/161.1369
a2.examplevpn.com     0/4         108.8945/84.0471/178.5910
a4.examplevpn.com     0/4         118.3317/113.8020/124.9740
a5.examplevpn.com     0/4         143.3793/137.8958/146.4632
a1.examplevpn.com     0/4         164.5067/153.4820/187.5679

然后就可以选择靠前的这几个 VPN 来连接了,相对会比较流畅一些。

阅读全文…

公司最近开始使用 Tower 来管理和协作一些国内的项目, 加上我平常就在用 Tower 来管理一些日常事务和开源项目, 所以使用 Tower 的机会就更多了,随之也带来些问题, 在不同团队的项目间频繁切换是非常麻烦的, 所以我写了这个扩展来实现快速切换的功能。

这个扩展在公司内部推广后,收到一些好评,随着使用 Tower 的深入, 我又遇到另一些问题,这些问题都会在这一版本中解决。

太占地方的事件信息

事件流

在讨论中,事件流会占比较多的地方,比较影响阅读,但直接隐藏又不太好, 所以在事件信息的上面加了个切换显示/隐藏的按钮。

image

默认事件是隐藏的,点击后可以展开事件列表。

不再活跃的团队和项目

之前参与了很多团队和项目,其中一些已经不再更新但又不想退出, 所以又添加了一个隐藏团队和项目的功能。

隐藏团队 隐藏项目

团队或者项目隐藏之后,在顶部的快速切换菜单里也不会再显示。

扩展 V1.2 发布

从商店安装:

https://chrome.google.com/webstore/detail/twoerim-plus/dfhmgoomjkcdlfclkpjpmhjgpdakijke

从本地安装:

https://github.com/GDG-Xian/crx-tower/releases/tag/1.2.2

阅读全文…