擼碼的福音——變量名生成器的實現

最近換工作以後,結結實實的寫了幾個月的業務。需求完結以後,就找找自己喜歡的東西寫寫,換個口味。

擼碼最難的就是給變量取名字了。所以就寫一個變量生成器吧。

演示如下:

播放

暫停

進入全屏

退出全屏

00:00

00:00

重播

刷新

試試

實現思路:

使用了 Mac 上最出名的效率工具 Alfred。利用 Alfred 調用本地的 python 腳本,利用 http 模塊,請求遠程的 API 接口。

遠程 API 獲取查詢的字符後,首先使用結巴分詞,對查詢的句子進行分詞,然後調用有道詞典的 API 翻譯,拼接以後返回。

最終,一個回車就能把結果輸入到我們的 IDE 裡面減少很多操作,媽媽再也不會擔心我取不出變量名啦。

API 的實現:

既然說換個口味,那 API 我肯定不會使用 'Spring mvc' 啦。

主要採用的是 'vertx' 這個基於'netty' 的全異步的 java 庫。有興趣的同學可以參考 http://vartx.io 。

使用 Spring boot 管理對象的生命週期。

使用 “結巴分詞” 對查詢的語句進行分詞。

使用 guava cache 來對查詢結果進行緩存。為啥要緩存?主要是有道的翻譯API是收費的,查完把結果緩存起來能節約一點算一點。

至於為什麼使用本地緩存而不是 Redis?因為阿里雲的 Redis 一個月要25塊錢啊。自己搭一個?我的vps 一共只有 1G 內存啊。

說到底,架構設計需要考慮實際情況,一味上高大上的技術也不可取。適合的才是最好的。

vertx-web

寫過 netty 的同學就知道,netty 的業務邏輯是寫在一個個的 handler中的。

同樣 vertx 也類似於 netty 也是使用 handler 來處理請求。

vertx 通過 Router 這個類,將請求路由到不同的 Handler 中。所以我們直接看代碼:

@Component

public class StaticServer extends AbstractVerticle {

@Autowired

private VariableHandler variableHandler;

@Override

public void start() throws Exception {

Router router = Router.router(vertx);

router.route().handler(BodyHandler.create());

router.post("/api/hump").handler(routingContext ->variableHandler.get(routingContext));

vertx.createHttpServer().requestHandler(router::accept).listen(8080);

}

}

我們把 VariableHandler 綁定到了 ’/api/hump‘ 這個 uri 的 post 方法上了。服務器啟動以後會監聽 ’8080‘ 端口。 vertx-web的運行是不需要類似 tomcat 這樣的容器的。

RestTemplate

我們一般是用 Httpclient 在代碼中調用 http 接口。但是我覺得 HTTPClient 封裝的不是很好。我們可以直接使用 Spring boot web 提供的 RestTemplate (真香)。直接看代碼:

private ApiResponse requestYoudao(String param){

long timeMillis = System.currentTimeMillis();

String salt = String.valueOf(timeMillis);

String sign = Md5Utils.md5(appKey + param + salt + secretKey);

MultiValueMap bodyMap = new LinkedMultiValueMap<>();

bodyMap.add("q",param);

bodyMap.add("from","auto");

bodyMap.add("to","auto");

bodyMap.add("appKey",appKey);

bodyMap.add("salt",salt);

bodyMap.add("sign",sign);

MultiValueMap headersMap = new LinkedMultiValueMap<>();

HttpEntity> requestEntity = new HttpEntity<>(bodyMap, headersMap);

return restTemplate.postForObject(url, requestEntity,ApiResponse.class);

}

Guava

Guava 是 google 提供的一個java 基礎庫類,如果會使用 Guava 的話,會成倍的提升你的開發效率。在本項目中主要使用 Guava 提供的本地緩存和字符串操作:

Guava cache 的使用很簡單直接看代碼:

@Autowired

private Cache cache;

private ApiResponse cachedResponse(String param){

try {

return cache.get(param, () -> requestYoudao(param));

}catch (Exception e){

log.error("error",e);

}

return null;

}

Guava 對提供了很多給力的字符串的操作。尤其是對字符串下劃線,大小寫,駝峰形式,提供的強有力的支持。這樣使得我們的 API 提供各種風格的變量形式。我們直接看代:

switch (status){

case Constants.LOWER_CAMEL:

return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL,underline);

case Constants.LOWER_HYPHEN:

return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN,underline);

case Constants.LOWER_UNDERSCORE:

return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_UNDERSCORE,underline);

case Constants.UPPER_CAMEL:

return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL,underline);

case Constants.UPPER_UNDERSCORE:

return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_UNDERSCORE,underline);

default:

return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL,underline);

}

以上就是 API 接口的實現。

python 腳本

本地的python 腳本就極其簡單了:

# -*- coding:utf-8 -*-

import httplib,urllib,json

url = 'xilidou.com'

def query(q,status=0):

response = get(q,status)

dates = json.loads(response.read())

items = list()

for date in dates:

item = {}

item['title'] = date.encode('utf-8')

item['arg'] = date.encode('utf-8')

item['subtitle'] = '回車複製'

item['icon'] = getIcon()

items.append(item)

jsonBean = {}

jsonBean['items'] = items

json_str = json.dumps(jsonBean)

if json_str:

print json_str

return str

def get(q,status=0):

parameters= dict()

parameters['q'] = q

parameters['status'] = status

parameters = urllib.urlencode(parameters)

headers = {"Content-type": "application/x-www-form-urlencoded"}

conn = httplib.HTTPSConnection(url)

conn.request('POST','/api/hump',parameters,headers)

response = conn.getresponse()

return response

def getIcon():

icon = {}

icon['path'] = 'icon.png'

return icon

if __name__ == '__main__':

query('中文')

幹兩件事情:

  • 從 Alfred 中獲取用戶輸入的待查詢字符串。
  • 調用遠程的 API 接口獲取返回後格式化然後打印結果。

Alfred

大家可以直接下載 github 代碼。在 python 文件夾裡面找到 hump.alfredworkflow 雙擊。就安裝到你的 Mac 上了。

前提是你的 Mac 安裝了 aflred 且付費成為高級用戶。

最後

老規矩 github 地址:https://github.com/diaozxin007/HumpApi

我之前還開發了一個利用 aflred 直接查詢有道詞典的 workflow。效果如下圖:

擼碼的福音——變量名生成器的實現

圖片

下載地址如下:https://www.xilidou.com/2017/10/24/%E6%9C%89%E9%81%93-Alfred-Workflow-%E5%A8%81%E5%8A%9B%E5%8A%A0%E5%BC%BA%E7%89%88/。


分享到:


相關文章: