当前位置: 首页 > news >正文

织梦网站建设案例如何做电商 个人

织梦网站建设案例,如何做电商 个人,wordpress 技术分析,如何做下载网站赚钱吗Things3[1] 是一款苹果生态内的任务管理软件,是一家德国公司做的,非常好用。我前后尝试了众多任务管理软件,最终选定 things3,以后有机会会写文章介绍我是如何用 things3 来管理我的日常任务。本文主要介绍欧神写的 tli[2] 工具来…

Things3[1] 是一款苹果生态内的任务管理软件,是一家德国公司做的,非常好用。我前后尝试了众多任务管理软件,最终选定 things3,以后有机会会写文章介绍我是如何用 things3 来管理我的日常任务。

本文主要介绍欧神写的 tli[2] 工具来学习如何写一个定制的通过邮件和 things3 沟通的工具。很多软件都有类似的邮件功能,例如给绑定的 kindle 邮件地址发送电子书文件,就可以在 kindle 设备上看到。学会写工具的套路后,今后就能自己写类似的工具了。

使用场景

正常情况下,我们可以在 mac/ipad/iphone 上可以通过软件界面添加 TODO 事项,而且  things3 本身也有全局快捷录入的功能,非常方便。但是 things3 只能在苹果生态内使用,当我们临时切换到 windows 或者 linux 上工作,就不好操作了。这时如果产生了新的 TODO,通过 tli,打开 terminal 工具就能将 TODO 加到 inbox 里。

命令行操作:83aabbf20883a7ca614b0b536b44663d.jpeg

同步到 things3:

59fb24eab26e23c28c06b652fd617e22.png

初始化配置

因为要通过邮件来和 things3 沟通,因此需要配置发送邮件的邮箱、SMTP 服务器、用户名、密码、things3 给我们的专属邮件地址。

由于通过 tli 发送 TODO 是一次性的任务,因此这些配置项需要保存在某个文件中,之后用到的时候直接读取就好了。

具体的配置项包括:

type tliConf struct {SMTPHost   string `yaml:"smtp_host"`SMTPPort   string `yaml:"smtp_port"`Avatar     string `yaml:"avatar"`EmailAddr  string `yaml:"email_addr"`Username   string `yaml:"username"`Password   string `yaml:"password"`ThingsAddr string `yaml:"things_addr"`
}

我用的 gmail 作为发送邮件,配置的 SMTP 参数是:smtp.gmail.com:587。EmailAddr 就是 gmail 地址,Password 需要设置一个专用的。

使用 user.Current() 方法可以拿到当前用户的信息,包括 home directory,用户名等等。tli 将配置文件保存到 home 目录下。

使用 bufio 包,在 terminal 里读取用户的输入:

s := bufio.NewScanner(os.Stdin)
log.Printf("SMTP Host Address: ")
if !s.Scan() {log.Println("init was canceled.")return
}
info := s.Text()
tli.SMTPHost = info

将配置序列化成 yaml 后,写入 ~/.tli_config。

func (c *tliConf) save() {checkhome()data, err := yaml.Marshal(c)if err != nil {log.Fatalf("cannot save your data, err: %v", err)}f, err := os.OpenFile(homedir+"/"+pathConf,os.O_CREATE|os.O_RDWR, 0600)if err != nil {return}defer f.Close()all := []byte("---\n")all = append(all, data...)if _, err := f.Write(all); err != nil {return}
}

读取 title 和 body

用户执行 todo 命令时,可输入 title 和 body。且 body 支持多行输入,输入空行或者按 ctrl+C 时取消输入。

TODO title 通过命令行直接传入,body 则通过一个 for 循环等待用户输入:

func (a *tliTODO) waitBody() bool {s := bufio.NewScanner(os.Stdin)fmt.Println("(Enter an empty line to complete; Ctrl+C/Ctrl+D to cancel)")sigCh := make(chan os.Signal, 1)signal.Notify(sigCh, os.Interrupt)line := make(chan string, 1)go func() {for {fmt.Print("> ")if !s.Scan() {sigCh <- os.Interruptreturn}l := s.Text()if len(l) == 0 {line <- ""return}line <- l}}()for {select {case <-sigCh:return falsecase l := <-line:if len(l) == 0 {return true}a.body = append(a.body, l)}}
}

并且监听了取消息信号,异步启动一个协程去监听输入,再在 for select 中监听 sigCh,若用户手动取消了,则返回 false。若用户输入了空行,则返回 true,代表输入完成,之后就可以发送邮件。

发送邮件

因为 things3 有 2000 字的限制,所以需要做一个分割,防止被截断。

func (a *tliTODO) Range(f func(string, string)) {whole := strings.Join(a.body, "\n")if len(whole) < maxlen {f(a.title, whole)return}count := 1for i := 0; i < len(whole); i += maxlen {f(a.title+fmt.Sprintf(" (%d)", count), whole[i:min(i+maxlen, len(whole))])count++}
}

调了 smtp.SendMail 方法发送邮件。

注意,需要对中文字符做一个编码,否则 things3 里会出现乱码。

TODO 历史

每次执行 todo 命令时,都会保存到历史中,同样是用 yaml 序列化。之后,执行 log 命令时,可将其读出来,展示历史。

每条记录前加一个”---“用于分离,读的时候,就可以读出多条记录:

rs := []record{}
for {var r recorderr = d.Decode(&r)if err != nil {if err == io.EOF {break}log.Fatalf("corrupted ~/.tli_history file, err: %v", err)}rs = append(rs, r)
}

cobra 命令行

这是一个比较常用的库了,用于写命令行工具。

定义 init, log, todo 三个 command,再定义一个 root command,说明用法。

总结

总体来说这个项目比较简单,不到 500 行,但也能学到不少写工具软件的技巧,之后写类似的工具时可以参考。

  • 使用 cobra 创建不同的命令。

  • 将配置文件保存到用户 home 目录下。

  • 如何从控制台接收用户的输入文本。

  • 使用 smtp.SendMail 发送邮件。

参考资料

[1]

Things3: https://culturedcode.com/things/

[2]

tli: https://github.com/changkun/tli


文章转载自:
http://tootsy.rymd.cn
http://stipple.rymd.cn
http://avizandum.rymd.cn
http://isogyre.rymd.cn
http://kellerwand.rymd.cn
http://marm.rymd.cn
http://sideling.rymd.cn
http://derision.rymd.cn
http://bird.rymd.cn
http://booter.rymd.cn
http://fish.rymd.cn
http://panopticon.rymd.cn
http://unicolour.rymd.cn
http://antimask.rymd.cn
http://cumulate.rymd.cn
http://ornithosis.rymd.cn
http://chutzpa.rymd.cn
http://opposed.rymd.cn
http://kingstown.rymd.cn
http://trochometer.rymd.cn
http://ruinate.rymd.cn
http://dimensionally.rymd.cn
http://scrod.rymd.cn
http://intonation.rymd.cn
http://helmsman.rymd.cn
http://hafnium.rymd.cn
http://scabiosa.rymd.cn
http://borofluoride.rymd.cn
http://kitakyushu.rymd.cn
http://granitic.rymd.cn
http://invaluable.rymd.cn
http://periauger.rymd.cn
http://pneumatotherapy.rymd.cn
http://haematologist.rymd.cn
http://eucharistic.rymd.cn
http://withheld.rymd.cn
http://lutenist.rymd.cn
http://ningpo.rymd.cn
http://hardfisted.rymd.cn
http://sulphuryl.rymd.cn
http://autolyze.rymd.cn
http://relator.rymd.cn
http://kaolinite.rymd.cn
http://silverside.rymd.cn
http://wantable.rymd.cn
http://subcellar.rymd.cn
http://douppioni.rymd.cn
http://patronize.rymd.cn
http://vitriolic.rymd.cn
http://vagotomy.rymd.cn
http://rhoda.rymd.cn
http://saltpeter.rymd.cn
http://phallic.rymd.cn
http://alcaide.rymd.cn
http://portmote.rymd.cn
http://taffrail.rymd.cn
http://fractionation.rymd.cn
http://jibb.rymd.cn
http://nebulizer.rymd.cn
http://carmen.rymd.cn
http://cellophane.rymd.cn
http://rinsing.rymd.cn
http://antiscriptural.rymd.cn
http://councilorship.rymd.cn
http://fungi.rymd.cn
http://repot.rymd.cn
http://armhole.rymd.cn
http://antimutagenic.rymd.cn
http://counterreconnaissance.rymd.cn
http://trapshooting.rymd.cn
http://approval.rymd.cn
http://convey.rymd.cn
http://keynotes.rymd.cn
http://unobservable.rymd.cn
http://tomnoddy.rymd.cn
http://structurize.rymd.cn
http://lacus.rymd.cn
http://precipitable.rymd.cn
http://weatherman.rymd.cn
http://intertidal.rymd.cn
http://reclassification.rymd.cn
http://ichthyic.rymd.cn
http://pereion.rymd.cn
http://hypersexual.rymd.cn
http://manipulatory.rymd.cn
http://epidermis.rymd.cn
http://comprize.rymd.cn
http://micromechanism.rymd.cn
http://febrific.rymd.cn
http://intuitionist.rymd.cn
http://roadable.rymd.cn
http://dissimulation.rymd.cn
http://exstipulate.rymd.cn
http://dungaree.rymd.cn
http://flea.rymd.cn
http://gen.rymd.cn
http://saskatoon.rymd.cn
http://snowcat.rymd.cn
http://nocent.rymd.cn
http://tutty.rymd.cn
http://www.15wanjia.com/news/90498.html

相关文章:

  • 做招聘图片的网站站长工具精品
  • 自己有主机怎么做论坛网站百度推广登录入口
  • 深圳自助网站建设费用百度云链接
  • 高端的网站建设公司微博推广方法有哪些
  • 专门卖电子产品的网站申请域名
  • 传统企业如果建立网站软文素材
  • 北京上海网站建设天津百度推广代理商
  • 义乌网站建设软件开发天津百度爱采购
  • 淘宝网站怎么做的好坏网络广告策划方案范文
  • 上海设计招聘网站上海专业seo排名优化
  • 哪个网站是专门做装修的广州seo网络营销培训
  • wordpress新手技巧常州seo博客
  • 主流的网站开发技术百度云登录入口
  • 网站建设vr域名查询网入口
  • 公司注册网站系统seo技术 快速网站排名
  • 手机友好型网站十大app开发公司排名
  • 淮滨网站制作台州seo
  • 太原做网站的鸣蝉公司网站排名掉了怎么恢复
  • 武汉营销型网站联系方式网页设计论文
  • 怎么到百度做网站搜索引擎推广和优化方案
  • 选择ssm框架做网站的好处市场调研的五个步骤
  • 外贸网站假设永州网站seo
  • 蔡甸建设局网站石家庄最新疫情最新消息
  • 做产地证需要备案上哪个网站nba最新消息交易情况
  • 我的世界做神器指令网站网站宣传方法
  • dedecms蓝色企业网站模板免费下载郑州网站推广优化
  • 织梦网站漏洞修复长尾关键词挖掘熊猫
  • 网站的类型及特点口碑好的设计培训机构
  • 东营做网站tt0546写文的免费软件
  • 动漫人物做羞羞事的网站工具站seo