Majordomo系列应用(1)clipboard

majordomo,意思是大管家,衍生自之前的 worktools,主要是汇集一些提升工作效率,提升工作幸福感的工具。奈何 worktools 太零散,每次更换电脑都需要重新配置下 alias,费时费力。于是大致构思为 web 工具合集,从 SB(Script Boy)进化到PM(Platform Man)。

未来打算把 majordomo 系列做起来,鉴于不是所有的工具都适合拿来做 web 工具,因此在此做增量式开发。

majordomo 第一弹,是一个系统剪切板应用。背景来源于工作中时常需要查找需求 icafe(一种类似于需求说明书 wiki 的内部工具),每次都要翻好久记录,不够方便。

初期想着搞个本地知识库出来,有需要记录的内容,直接在里面记录就行了。搜了一圈GitHub,发现这玩意儿退化下不就是个本地的 XX 笔记吗?一旦忘记记录或者懒得记录,那不就又回来了吗?至少对我来说,可能坚持一段时间就忘了这回事了。

后来不知道怎么地就想到了,监听系统剪切板,所有内容统统记录下来,扔到 ElasticSearch 中,后期有啥想查的,直接搜剪切板历史,倒也是个不错的点子。

在开发 clipboard 之前,和damnever@github上发现了一个叫🌻 的项目,感觉人家的项目目录结构挺好,就用邮件请教了下。特此摘录一下和大伙分享一波。
sunflower 作者关于项目目录结构设计解释
然后基于此次交流,我也设计了自己预想中的web项目的结构(针对我自己比较合适,也可能别人不喜欢,这个众口难调,找到适合自己的就行), 并做成了一个 shell 脚本 。有兴趣的可以拿去改改。使用方式就是

bash gowebscaffold.sh generate demo 

我的项目结构
扯远了,继续回到 clipboard 项目上。宏观来看,我需要如下内容:

  1. web 查询页面
  2. 剪切板内容推送到 elasticsearch

从下到上来看的话,还是需要不少代码的,向各种 dao,service,library 等。关于设计一个项目,我目前还有一些疑惑。到底是要从上到下设计,还是从下到上设计。

角度优点缺点
从上到下需求清晰,模块可以划分的比较明确细节把控可能不不到位,遗漏部分功能开发
从下到上细致需求把控不到位,可能写了一堆上层根本用不到的代码或者模块

还是得在实践中去权衡下。

clipboard 一期仅做了剪切板监听以及 elasticsearch 推送,实现效果如下图所示。
查询剪切板记录
奈何前端技术太菜,要不然可以美化下页面,对我来说有功能也就行了。

最后来说下编写 clipboard 过程中的一些问题。

工具层

Elasticsearch 官方文档 这个版本很简洁,适合像我这种没用过 es的新人。
我个人觉得比较重要的知识点如下:
Index 类似于关系型数据库中的 DB
Type 类似于组、类别概念,将document 分组,分类使用。
Unique-Document-ID 具体的文档内容,JSON 格式

SQL 转 Elasticsearch 工具
http://www.ischoolbar.com/EsParser/ 这个工具还不赖,对新人蛮友好的。

Elasticsearch 的 header 工具
一个浏览器插件,可以方便的查看 Elasticsearch 元数据信息,还有简单的查询页供使用。
组件地址:https://pan.baidu.com/s/17WfSHkINvt1EHMpLJ_ZqyA 提取码:674o

代码层

关于 interface 的使用, 以 clipboard.go 为例。像这种,肯定是需要做成跨平台的,因此很适合以基本方法做抽象层。

package clipboard

type clipboard interface {
	Get() (string, error)
	Set(content string) error
}

macOS 上的实现见 clipboard_darwin.go

package clipboard

import (
	"fmt"
	"github.com/guoruibiao/commands"
)

type Darwin struct {
}

/**
 * macOS 剪切板工具
 *
 * return: *Darwin
 */
func NewDarwin() *Darwin {
	return &Darwin{}
}

/**
 * 获取 macOS 系统 剪切板内容
 *
 * return: string
 * return: error
 */
func (d *Darwin) Get() (content string, err error) {
	// check pbpaste or pbcopy valid or not.
	if status, output := commands.New().GetStatusOutput(`pbpaste`); !status {
		err = fmt.Errorf("[Darwin] get content from clipboard with %s", err.Error())
	}else{
		content = output
	}
	return
}

/**
 * 将内容写入系统剪切板
 *
 * param: string content
 * return: error
 */
func (d *Darwin) Set(content string) (err error) {
	// commands 设计的遗漏,err 被吞掉了 -_-||
	commands.New().Run(`echo`, ` ` + content + ` | pbcopy`)
	return
}

适当时机使用回调,可以减少大量冗余流程。在 clipboard 中,有一个监听系统剪切板的功能,由于没法注册系统事件的回调,因此做了轮训处理,见 scripts/task.go

package scripts

import (
	"github.com/guoruibiao/majordomo/library/clipboard"
	"github.com/guoruibiao/majordomo/models/data/elasticsearch"
	"time"
)

const (
	CLIPBOARD_LISTEN_INTERVAL = time.Second * 2
)

var (
	clipboardStr = ""
	darwinClipboard = clipboard.NewDarwin()
)

/**
 * 监听系统剪切板变化,并发送到 elasticsearch
 */
func StartClipboardListening() {
	go clipboardListener(elasticsearch.AddLog)
}

func clipboardListener(callback func(content string) error) {
	ticker := time.NewTicker(CLIPBOARD_LISTEN_INTERVAL)
	for {
		select {
		case <- ticker.C:
			if newClipboardStr, _ := darwinClipboard.Get(); clipboardStr != newClipboardStr {
				// 回调
				callback(newClipboardStr)
				clipboardStr = newClipboardStr
			}
		}
	}
}

回调函数见models/data/elasticsearch/elasticsearch.go

func AddLog(content string) (err error) {
	logid:= time.Now().Unix()
	url := fmt.Sprintf("%s/%s/%s/%d", ELASTICSEARCH_URL, ELASTICSEARCH_INDEX, ELASTICSEARCH_TYPE, logid)


	headers := map[string]string{
		"User-Agent"   : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36",
		"Content-Type" : "application/json",
	}
	payload := map[string]interface{}{
		"content"    : content,
		"timestamp"  : logid,
	}
	response, err := gorequests.NewRequest("POST", url).Headers(headers).Body(payload).DoRequest()
	if err != nil {
		return
	}

	html, err := response.Content()
	if err != nil {
		return
	}

	fmt.Println(html)
	return
}

拓展部分

在和baifenbai@github 聊天的时候,提到过困扰我的这个查询问题。
archivy
这个 repo 用的也是 es 模式,和我想到一块去了。毕竟即使把全天的系统剪切板数据扔到 es 中,一个人也用不了多少。

多交流,说不一定哪天就迸发出奇妙的创意了。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰 戈 尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值