成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

每天用 Jupyter 寫 5 分鐘的日記

開發(fā) 后端
用 Jupyter 和 Python 在你的日常寫作背后實(shí)現(xiàn)一些自動(dòng)化。

[[355823]]

用 Jupyter 和 Python 在你的日常寫作背后實(shí)現(xiàn)一些自動(dòng)化。

有些人會(huì)遵循傳統(tǒng),制定一年的計(jì)劃。不過,一年的時(shí)間很長,所以我以季節(jié)性的主題或軌跡來規(guī)劃。每個(gè)季度,我都會(huì)坐下來,看看即將到來的三個(gè)月的季節(jié),并決定在這段時(shí)間里我將努力做什么。

對(duì)于我最新的主題,我決定要每天寫一篇日記。我喜歡有明確的承諾,所以我承諾每天寫 5 分鐘。我也喜歡有可觀察的承諾,哪怕只是對(duì)我而言,所以我把我的記錄放在 Git 里。

我決定在寫日記的過程中實(shí)現(xiàn)一些自動(dòng)化,于是我使用了我最喜歡的自動(dòng)化工具:Jupyter。Jupyter 有一個(gè)有趣的功能 ipywidgets,這是一套用于 Jupyter Notebooks、JupyterLab 和 IPython 內(nèi)核的交互式 HTML 組件。

如果你想跟著本文的代碼走,請(qǐng)注意,讓你的 JupyterLab 實(shí)例支持組件可能有點(diǎn)復(fù)雜,請(qǐng)按照這些說明來進(jìn)行設(shè)置。

導(dǎo)入 ipywidgets 模塊

首先,你需要導(dǎo)入一堆東西,比如 ipywidgets 和 Twisted。Twisted 模塊可以用來創(chuàng)建一個(gè)異步時(shí)間計(jì)數(shù)器:

  1. import twisted.internet.asyncioreactor
  2. twisted.internet.asyncioreactor.install()
  3. from twisted.internet import reactor, task
  4. import ipywidgets, datetime, subprocess, functools, os

設(shè)置定時(shí)條目

用 Twisted 實(shí)現(xiàn)時(shí)間計(jì)數(shù)器是利用了 task.LoopingCall。然而,結(jié)束循環(huán)調(diào)用的唯一方法是用一個(gè)異常。倒計(jì)時(shí)時(shí)鐘總會(huì)停止,所以你需要一個(gè)自定義的異常來指示“一切正常;計(jì)數(shù)器結(jié)束”:

  1. class DoneError(Exception):
  2.     pass

現(xiàn)在你已經(jīng)寫好了異常,你可以寫定時(shí)器了。第一步是創(chuàng)建一個(gè) ipywidgets.Label 的文本標(biāo)簽組件。循環(huán)使用 divmod 計(jì)算出分和秒,然后設(shè)置標(biāo)簽的文本值:

  1. def time_out_counter(reactor):
  2. label = ipywidgets.Label("Time left: 5:00")
  3. current_seconds = datetime.timedelta(minutes=5).total_seconds()
  4. def decrement(count):
  5. nonlocal current_seconds
  6. current_seconds -= count
  7. time_left = datetime.timedelta(seconds=max(current_seconds, 0))
  8. minutes, left = divmod(time_left, minute)
  9. seconds = int(left.total_seconds())
  10. label.value = f"Time left: {minutes}:{seconds:02}"
  11. if current_seconds < 0:
  12. raise DoneError("finished")
  13. minute = datetime.timedelta(minutes=1)
  14. call = task.LoopingCall.withCount(decrement)
  15. call.reactor = reactor
  16. d = call.start(1)
  17. d.addErrback(lambda f: f.trap(DoneError))
  18. return d, label

從 Jupyter 組件中保存文本

下一步是寫一些東西,將你輸入的文字保存到一個(gè)文件中,并提交到 Git。另外,由于你要寫 5 分鐘的日記,你需要一個(gè)能給你提供寫字區(qū)域的組件(滾動(dòng)肯定是可以的,但一次能看到更多的文字就更好了)。

這就用到了組件 Textarea,這是一個(gè)你可以書寫的文本字段,而 Output 則是用來給出反饋的。這一點(diǎn)很重要,因?yàn)?nbsp;git push 可能會(huì)花點(diǎn)時(shí)間或失敗,這取決于網(wǎng)絡(luò)。如果備份失敗,用反饋提醒用戶很重要:

  1. def editor(fname):
  2.     textarea = ipywidgets.Textarea(continuous_update=False)
  3.     textarea.rows = 20
  4.     output = ipywidgets.Output()
  5.     runner = functools.partial(subprocess.run, capture_output=True, text=True, check=True)
  6.     def save(_ignored):
  7.         with output:
  8.             with open(fname, "w") as fpout:
  9.                 fpout.write(textarea.value)
  10.             print("Sending...", end='')
  11.             try:
  12.                 runner(["git", "add", fname])
  13.                 runner(["git", "commit", "-m", f"updated {fname}"])
  14.                 runner(["git", "push"])
  15.             except subprocess.CalledProcessError as exc:
  16.                 print("Could not send")
  17.                 print(exc.stdout)
  18.                 print(exc.stderr)
  19.             else:
  20.                  print("Done")
  21.     textarea.observe(save, names="value")
  22.     return textarea, output, save

continuous_update=False 是為了避免每個(gè)字符都保存一遍并發(fā)送至 Git。相反,只要脫離輸入焦點(diǎn),它就會(huì)保存。這個(gè)函數(shù)也返回 save 函數(shù),所以可以明確地調(diào)用它。

創(chuàng)建一個(gè)布局

最后,你可以使用 ipywidgets.VBox 把這些東西放在一起。這是一個(gè)包含一些組件并垂直顯示的東西。還有一些其他的方法來排列組件,但這足夠簡單:

  1. def journal():
  2.     date = str(datetime.date.today())
  3.     title = f"Log: Startdate {date}"
  4.     filename = os.path.join(f"{date}.txt")
  5.     d, clock = time_out_counter(reactor)
  6.     textarea, output, save = editor(filename)
  7.     box = ipywidgets.VBox([
  8.         ipywidgets.Label(title),
  9.         textarea,
  10.         clock,
  11.         output
  12.     ])
  13.     d.addCallback(save)
  14.     return box

biu!你已經(jīng)定義了一個(gè)寫日記的函數(shù)了,所以是時(shí)候試試了。

  1. journal()

 

Jupyter journal

你現(xiàn)在可以寫 5 分鐘了! 

 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2020-09-24 05:50:46

PythonJupyter Not編程語言

2021-03-26 12:07:14

JupyterPython編程語言

2017-07-04 16:23:10

容器ocker技術(shù)

2014-04-22 11:01:56

jQuery代碼

2015-07-17 10:02:48

寫代碼

2020-11-13 06:18:07

JupyterPython數(shù)據(jù)分析

2019-07-28 20:38:33

2020-07-25 19:40:33

Java開發(fā)代碼

2021-01-29 14:50:20

APP手機(jī)熱點(diǎn)推薦

2018-11-01 11:35:09

物聯(lián)網(wǎng)IOT關(guān)鍵詞

2012-01-04 09:50:07

程序員

2021-07-14 13:11:02

papermillJupyterPython

2020-12-17 06:22:57

交互模式代碼

2018-02-26 09:28:42

程序員Bug體驗(yàn)

2021-08-12 16:02:22

Jupyter NotPython命令

2022-01-06 18:20:20

Scarlet AndroidWebSocket

2023-09-11 13:08:26

2021-02-20 16:03:50

代碼開發(fā)編程

2021-06-02 14:53:33

程序員技能開發(fā)者

2018-03-27 11:37:02

iOS程序面試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 伊人伊人 | 国产三级 | 久久久久亚洲视频 | 天天天操天天天干 | 日韩精品一区二区三区四区 | av黄色片在线观看 | 天天爽天天操 | 毛片网站在线观看视频 | 国产精品久久久久久久久久 | 毛片国产 | 99国产精品久久久久久久 | 国产精品久久亚洲 | 成人国产精品免费观看视频 | 超碰精品在线 | 国产一区中文字幕 | 久久成人一区 | 成人在线免费观看视频 | 日韩中出| 日韩三级 | 国产乱码精品一区二区三区五月婷 | 国产福利在线 | 中文字幕久久精品 | 国产成人午夜高潮毛片 | 精品一区二区三区不卡 | 国产偷录视频叫床高潮对白 | 中文在线播放 | 久久成人一区 | a在线视频 | av在线免费观看网站 | 天天综合天天 | 一级黄色裸片 | 久久精品国产一区二区电影 | 日韩不卡在线观看 | 欧美综合在线观看 | 日本在线免费视频 | 久久综合激情 | 日本成人二区 | 天天看天天操 | 久久在线视频 | 免费精品| 91免费高清视频 |