Alfred Workflow: 管理Synology Download Station

  Download StationSynology DSM里我最喜欢的应用之一,我也曾写过一个在终端控制它的脚本,Alfred的Workflow出现后我想到如果可能或许它是本地管理DS最方便的方式了,于是就有了这个,Download Station下载任务的创建、查看、暂停、恢复、删除等操作自然完全支持,也支持一些基本设置的管理如eMule、计划的启用与禁用等。

DS Main

DownloadSource


Read more...

Alfred Workflow: 获取迅雷、快车、QQ旋风专用链接的真实地址

   在国内连下载链接都那么有中国特色,什么迅雷、快车、QQ旋风都有自己专用下载链接,封闭私有不通用,强迫用户使用,让人厌恶,其实它们基本上都只是对真实地址的简单base64编码而已,写了一个Alfred Workflow解析这些专用链接为真实的地址。

Real Download Link Screenshot

DownloadSource

  • ENTENR 拷贝真实地址到剪切板
  • CTRL + ENTENR 在浏览器打开真实地址
  • 支持thunder://, flashget://, qqdl://的解密
  • 支持ed2k://, http://, ftp://等文件信息的基本解析

Alfred Workflow: 歌词搜索

  搜索歌词的Alfred Workflow,支持自动查找iTunes当前播放的歌曲或手动输入歌名查找,可将查到的歌词下载到本地或复制到剪切板或在Large Type显示,或直接保存到iTunes当前播放曲目中。

Lyric Screenshot

DownloadSource

  • ENTER 下载歌词到~/Downloads
  • CMD + ENTER 拷贝歌词内容到剪切板
  • ALT + ENTER 在Large Type显示歌词并拷贝内容到剪切版
  • CTRL + ENTER 保存歌词到iTunes当前正在播放的歌曲

说明:除了下载歌词,其它歌词内容都是去除了时间线信息的

Alfred 2 Workflow: 中文词典

  英文不咋地,还不要脸总爱浏览国外的网站,于是字典成了我最重要的工具之一,OS X的三指查词虽然很方便,可惜系统自带的Dictionary即使装了中文词典用着也总觉得不太爽,什么时态什么复数都直接被忽视,平时还是多用在线词典,有需求就要尝试去实现,研究了下Alfred V2无比强大的Workflow,写了这个基于在线词典的中英互查工具。

Alfred 2 Chinese Dictionary

DownloadSource

  安装什么的就不说了,使用很简单:

  • 关键词: cd
  • ENTER 打开QQ词典查词结果
  • CMD + ENTENT 拷贝单词到剪切板
  • CTRL + ENTER 打开爱词霸查词结果
  • ALT + ENTER 发音,取决于系统安装的Text to Speech,建议使用Siri的Samantha,纯正美音

第一个Arduino实验: 新浪微博关注好友状态更新数量

  一直想玩一玩电子设备,一般的单片机需要浪费太多时间在电子基础知识的学习上,不适合我这类人。

  最后发现了Arduino这个开源的硬件平台,社区活跃,对电子相关知识要求已是最低,于是订购了一个Arduino UNO的兼容版,上手挺容易,很快就折腾出了这个简单的小实验,功能是间隔三十秒获取新浪微博上好友状态更新数量并在数码管上显示。

1. Arduino实验板连接

  实验板的连接不做详述,参考极客工坊的这篇文章,保证数码管引脚E D C DP B A F G分别对应Arduino数字输出2~9即可,Pin13做为电源输出。

2. 程序源代码

  代码是Python2.7的,因此Arduino需预先写入StandardFirmata,而Python则需安装pyFirmata模块。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#! 强制默认编码为utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

import pyfirmata, urllib, json, time
from datetime import datetime

#! 微博的API调用需要OAuth2.0登陆授权
#! 这里不做授权过程,需使用开发者账号测试 参考:http://t.cn/zYDjFan
ACCESS_TOKEN = 'YOUR ACCESS TOKEN'

# Arduino硬件接口
ARDUINO_PORT        = 'YOUR ARDUINO PORT'

POWER_PIN           = 13
DOTPOINT_PIN        = 5

NUMBERS = [
    #E  D  C  DP B  A  F  G   // 数码管
    #2  3  4  5  6  7  8  9   // 输出端口
    [0, 0, 0, 1, 0, 0, 0, 1], # 0
    [0, 1, 1, 1, 1, 1, 0, 1], # 1
    [0, 0, 1, 1, 0, 0, 1, 0], # 2 
    [1, 0, 0, 1, 0, 0, 1, 0], # 3
    [1, 1, 0, 1, 0, 1, 0, 0], # 4
    [1, 0, 0, 1, 1, 0, 0, 0], # 5
    [0, 0, 0, 1, 1, 0, 0, 0], # 6
    [1, 1, 0, 1, 0, 0, 1, 1], # 7
    [0, 0, 0, 1, 0, 0, 0, 0], # 8
    [1, 0, 0, 1, 0, 0, 0, 0], # 9
    [1, 1, 1, 0, 1, 1, 1, 1], # dot point
    [1, 1, 1, 1, 1, 1, 1, 0], # line
    [1, 1, 1, 1, 1, 1, 1, 1]  # nothing
]

class WBftc(object):
    def __init__(self):
        self.arduino = None
        self.lastStatusID = ''
        self.initArduino()

    def __del__(self):
        if isinstance(self.arduino, pyfirmata.Arduino):
            for i in xrange(2, 14):
                self.arduino.digital[i].write(0)

    def initArduino(self):
        if isinstance(self.arduino, pyfirmata.Arduino):
            return
        try:
            self.arduino = pyfirmata.Arduino(ARDUINO_PORT)
            self.arduino.digital[13].write(1)
        except Exception, e:
            print('init arduino fail.')
            sys.exit(1)

    def outputArduino(self, num):
        if not isinstance(self.arduino, pyfirmata.Arduino):
            return
        # 输出 0 - 9 的数字
        show = num
        # 小于0 错误
        if num < 0:
            show = 12
        # 大于 9 超出量程
        elif num > 9:
            show = 11
        for x in range(2, 10):
            self.arduino.digital[x].write(NUMBERS[show][x - 2])

    def flashDotPoint(self, interval = 1, count = 30):
        show_dot = True
        for x in range(count):
            self.arduino.digital[DOTPOINT_PIN].write(0 if show_dot else 1)
            show_dot = False if show_dot else True
            time.sleep(interval)

    def fetchWeiboStatusCount(self):
        # -1 错误
        url = 'https://api.weibo.com/2/statuses/friends_timeline/ids.json'
        data = {
            'access_token'  : ACCESS_TOKEN
        }
        if self.lastStatusID:
            data.update({'since_id' : self.lastStatusID })
        data = urllib.urlencode(data)
        try:
            requst = urllib.urlopen('{}?{}'.format(url, data))
            res = json.load(requst)
            if not res.has_key('statuses'):
                return -1
            statuses = res['statuses']
            if len(statuses):
                self.lastStatusID = statuses[0]
            return len(statuses)
        except Exception, e:
            print('something error.')
            return -1

    def run(self):
        while (True):
            count = self.fetchWeiboStatusCount()
            now = datetime.now().strftime('%H:%M:%S')
            print('{}: {}'.format(now, count))
            self.outputArduino(count)
            self.flashDotPoint()

if __name__ == '__main__':
    try:
        WBftc().run()
    except KeyboardInterrupt:
        print('\rexit.')
    except Exception, e:
        raise e

Source on gist

  需配置ACCESS_TOKENARDUINO_PORT

  NOTE: 访问微博API需要OAuth2.0授权,这里使用了开发者测试账户,详细请参考这篇文章

3. 显示结果

  程序每隔30秒获取关注好友更新的微博数量并以以下方式显示:

  • 更新数量在0-9间,数码管正常显示
  • 更新数量大于9,数码管显示『-』
  • 出错,数码管不显示任何内容
  • 小数点闪动

  同时,电脑终端也会打印相应的更新数量信息,CTRL+C退出程序。

Read more...