为什么我仍然喜欢用 Alpine 在 Linux 终端中发送电子邮件
这个免费的邮件客户端使用直观、易于定制,并且可以在许多操作系统上使用。Media
via https://linux.cn/article-9967-1.html
这个免费的邮件客户端使用直观、易于定制,并且可以在许多操作系统上使用。Media
via https://linux.cn/article-9967-1.html
一个转换花引号的 gawk 脚本
得到我的 awk 秘籍。Media我管理着一个个人网站,用手工编辑网站上的网页。由于网站上的页面并不多,这种方法对我很适合,可以让我对网站代码的细节一清二楚。最近我升级了网站的设计样式,我决定把所有的普通引号都转换成“花引号”,即在打印材料中使用的那种引号:用 “” 来代替 “"。手工修改所有的引号太耗时了,因此我决定将这个转换所有 HTML 文件中引号的过程自动化。不过通过程序或脚本来实现该功能需要费点劲。这个脚本需要知道何时将普通引号转换成花引号,并决定使用哪种引号(LCTT 译注:左引号还是右引号,单引号还是双引号)。有多种方法可以转换引号。Greg Pittman 写过一个 Python 脚本 来修正文本中的花引号。而我自己使用 GNU awk (gawk) 来实现。下载我的 awk 秘籍。免费下载。开始之前,我写了一个简单的 gawk 函数来评估单个字符。若该字符是一个引号,这该函数判断是输出普通引号还是花引号。函数查看前一个字符;若前一个字符是空格,则函数输出左花引号。否则函数输出右花引号。脚本对单引号的处理方式也一样。
via https://linux.cn/article-9969-1.html?utm_source=rss&utm_medium=rss
得到我的 awk 秘籍。Media我管理着一个个人网站,用手工编辑网站上的网页。由于网站上的页面并不多,这种方法对我很适合,可以让我对网站代码的细节一清二楚。最近我升级了网站的设计样式,我决定把所有的普通引号都转换成“花引号”,即在打印材料中使用的那种引号:用 “” 来代替 “"。手工修改所有的引号太耗时了,因此我决定将这个转换所有 HTML 文件中引号的过程自动化。不过通过程序或脚本来实现该功能需要费点劲。这个脚本需要知道何时将普通引号转换成花引号,并决定使用哪种引号(LCTT 译注:左引号还是右引号,单引号还是双引号)。有多种方法可以转换引号。Greg Pittman 写过一个 Python 脚本 来修正文本中的花引号。而我自己使用 GNU awk (gawk) 来实现。下载我的 awk 秘籍。免费下载。开始之前,我写了一个简单的 gawk 函数来评估单个字符。若该字符是一个引号,这该函数判断是输出普通引号还是花引号。函数查看前一个字符;若前一个字符是空格,则函数输出左花引号。否则函数输出右花引号。脚本对单引号的处理方式也一样。
function smartquote (char, prevchar) { # print smart quotes depending on the previous character # otherwise just print the character as-is if (prevchar ~ /\s/) { # prev char is a space if (char == "'") { printf("‘"); } else if (char == "\"") { printf("“"); } else { printf("%c", char); } } else { # prev char is not a space if (char == "'") { printf("’"); } else if (char == "\"") { printf("”"); } else { printf("%c", char); } }}这个 gawk 脚本的主体部分通过该函数处理 HTML 输入文件的一个个字符。该脚本在 HTML 标签内部逐字原样输出所有内容(比如,<html lang="en">)。在 HTML 标签外,脚本使用 smartquote() 函数来输出文本。smartquote() 函数来评估是输出普通引号还是花引号。function smartquote (char, prevchar) { ...}BEGIN {htmltag = 0}{ # for each line, scan one letter at a time: linelen = length($0); prev = "\n"; for (i = 1; i <= linelen; i++) { char = substr($0, i, 1); if (char == "<") { htmltag = 1; } if (htmltag == 1) { printf("%c", char); } else { smartquote(char, prev); prev = char; } if (char == ">") { htmltag = 0; } } # add trailing newline at end of each line printf ("\n");}下面是一个例子:gawk -f quotes.awk test.html > test2.html其输入为:
<!DOCTYPE html><html lang="en"><head> <title>Test page</title> <link rel="stylesheet" type="text/css" href="/test.css" /> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width" /></head><body> <h1><a href="/"><img src="logo.png" alt="Website logo" /></a></h1> <p>"Hi there!"</p> <p>It's and its.</p></body></html>其输出为:
<!DOCTYPE html><html lang="en"><head> <title>Test page</title> <link rel="stylesheet" type="text/css" href="/test.css" /> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width" /></head><body> <h1><a href="/"><img src="logo.png" alt="Website logo" /></a></h1> <p>“Hi there!”</p> <p>It’s and its.</p></body></html>via: https://opensource.com/article/18/8/gawk-script-convert-smart-quotes作者:Jim Hall 选题:lujun9972 译者:lujun9972 校对:wxy本文由 LCTT 原创编译,Linux中国 荣誉推出Media
via https://linux.cn/article-9969-1.html?utm_source=rss&utm_medium=rss
极客漫画:函数式编程的世界
作者巧妙地指出了函数式编程不可变的特点。当你需要改变一个对象的属性的时候……嗯,销毁了再创建一个就是了。Media
via https://linux.cn/article-9970-1.html
作者巧妙地指出了函数式编程不可变的特点。当你需要改变一个对象的属性的时候……嗯,销毁了再创建一个就是了。Media
via https://linux.cn/article-9970-1.html
极客漫画:函数式编程的世界
Media作者巧妙地指出了函数式编程不可变(immultable)的特点。当你需要改变一个对象的属性的时候……嗯,销毁了再创建一个就是了。这里的老板想来份变量(改变全局变量的值),而所谓副作用(side effect),指的是在这种编程范式下,函数内部与外部互动可能会产生运算以外的其他结果,或导致程序出现不可预料的行为。或许,事件驱动的编程范式会好一点……?via: http://turnoff.us/geek/functional-world/作者:Daniel Stori 译者&点评:ItsLucas 校对&合成 :Bestony本文由 LCTT 原创编译,Linux中国 荣誉推出Media
via https://linux.cn/article-9970-1.html?utm_source=rss&utm_medium=rss
Media作者巧妙地指出了函数式编程不可变(immultable)的特点。当你需要改变一个对象的属性的时候……嗯,销毁了再创建一个就是了。这里的老板想来份变量(改变全局变量的值),而所谓副作用(side effect),指的是在这种编程范式下,函数内部与外部互动可能会产生运算以外的其他结果,或导致程序出现不可预料的行为。或许,事件驱动的编程范式会好一点……?via: http://turnoff.us/geek/functional-world/作者:Daniel Stori 译者&点评:ItsLucas 校对&合成 :Bestony本文由 LCTT 原创编译,Linux中国 荣誉推出Media
via https://linux.cn/article-9970-1.html?utm_source=rss&utm_medium=rss
Linux DNS 查询剖析(第三部分)
在第三部分中,我将介绍 NetworkManager 和 dnsmasq,简要说明它们如何影响 DNS 查询。Media
via https://linux.cn/article-9972-1.html
在第三部分中,我将介绍 NetworkManager 和 dnsmasq,简要说明它们如何影响 DNS 查询。Media
via https://linux.cn/article-9972-1.html
全面教程:在 RxJS 中创建流
有些时候,混用响应式和非响应式代码似乎很有用。然后大家就开始热衷流的创造。不论是在编写异步代码或者是数据处理时,流都是一个不错的方案。Media
via https://linux.cn/article-9973-1.html
有些时候,混用响应式和非响应式代码似乎很有用。然后大家就开始热衷流的创造。不论是在编写异步代码或者是数据处理时,流都是一个不错的方案。Media
via https://linux.cn/article-9973-1.html
理解 Python 的 Dataclasses(一)
如果你正在阅读本文,那么你已经意识到了 Python 3.7 以及它所包含的新特性。就我个人而言,我对 Dataclasses 感到非常兴奋,因为我等了它一段时间了。Media
via https://linux.cn/article-9974-1.html
如果你正在阅读本文,那么你已经意识到了 Python 3.7 以及它所包含的新特性。就我个人而言,我对 Dataclasses 感到非常兴奋,因为我等了它一段时间了。Media
via https://linux.cn/article-9974-1.html
基于日出和日落时间自动切换到明/暗 Gtk 主题
如果你在寻找一种基于日出和日落时间自动更改 Gtk 主题的简单方法,请尝试一下 AutomaThemely。Media
via https://linux.cn/article-9976-1.html
如果你在寻找一种基于日出和日落时间自动更改 Gtk 主题的简单方法,请尝试一下 AutomaThemely。Media
via https://linux.cn/article-9976-1.html
Go 编译器介绍
cmd/compile 包含构成 Go 编译器主要的包。编译器在逻辑上可以被分为四个阶段,我们将简要介绍这几个阶段以及包含相应代码的包的列表。Media
via https://linux.cn/article-9977-1.html
cmd/compile 包含构成 Go 编译器主要的包。编译器在逻辑上可以被分为四个阶段,我们将简要介绍这几个阶段以及包含相应代码的包的列表。Media
via https://linux.cn/article-9977-1.html
用 NodeJS 进行 Twitter 情感分析
今天,我会试着让你感受下关于 Twitter 的简单 情感分析,判断这个 Twitter 是正能量、负能量还是中性的。这不会像专业人士所用的那么复杂,但至少,它会让你知道挖掘观念的想法。Media
via https://linux.cn/article-9978-1.html
今天,我会试着让你感受下关于 Twitter 的简单 情感分析,判断这个 Twitter 是正能量、负能量还是中性的。这不会像专业人士所用的那么复杂,但至少,它会让你知道挖掘观念的想法。Media
via https://linux.cn/article-9978-1.html
Python 调试器入门
Python 标准库提供了一个名为 pdb 的调试器。此调试器提供了调试所需的大多数功能,如断点、单行步进、堆栈帧的检查等等。Media
via https://linux.cn/article-9979-1.html
Python 标准库提供了一个名为 pdb 的调试器。此调试器提供了调试所需的大多数功能,如断点、单行步进、堆栈帧的检查等等。Media
via https://linux.cn/article-9979-1.html
MPV 播放器:Linux 下的极简视频播放器
MPV 是一个开源的,跨平台视频播放器,带有极简的 GUI 界面以及丰富的命令行控制。Media
via https://linux.cn/article-9980-1.html
MPV 是一个开源的,跨平台视频播放器,带有极简的 GUI 界面以及丰富的命令行控制。Media
via https://linux.cn/article-9980-1.html
如何在 Ubuntu 系统中添加一个辅助 IP 地址
我们不应在服务器主 IP 地址上托管任何应用程序,这是不可取的。如果要在服务器上托管任何应用程序,我们应该为此添加辅助 IP。Media
via https://linux.cn/article-9986-1.html
我们不应在服务器主 IP 地址上托管任何应用程序,这是不可取的。如果要在服务器上托管任何应用程序,我们应该为此添加辅助 IP。Media
via https://linux.cn/article-9986-1.html
API Star:一个 Python 3 的 API 框架
为了在 Python 中快速构建 API,我主要依赖于 Flask。最近我遇到了一个名为 “API Star” 的基于 Python 3 的新 API 框架。Media
via https://linux.cn/article-9987-1.html
为了在 Python 中快速构建 API,我主要依赖于 Flask。最近我遇到了一个名为 “API Star” 的基于 Python 3 的新 API 框架。Media
via https://linux.cn/article-9987-1.html
使用 VS Code 进行 Python 编程
安装启用 Python 扩展后,VS Code 可以配置成理想的 Python 开发工作环境。本文将介绍一些有用的 VS Code 扩展,并配置它们以充分提高 Python 开发效率。Media
via https://linux.cn/article-9989-1.html
安装启用 Python 扩展后,VS Code 可以配置成理想的 Python 开发工作环境。本文将介绍一些有用的 VS Code 扩展,并配置它们以充分提高 Python 开发效率。Media
via https://linux.cn/article-9989-1.html
如何重置 MySQL 或 MariaDB 的 Root 密码
几个月前,我在Ubuntu 18.04 上安装了 LAMP。今天,我尝试以 root 用户身份登录数据库,但我完全忘记了密码。经过一阵 Google 搜索并浏览一些文章后,我成功重置了密码。Media
via https://linux.cn/article-9990-1.html
几个月前,我在Ubuntu 18.04 上安装了 LAMP。今天,我尝试以 root 用户身份登录数据库,但我完全忘记了密码。经过一阵 Google 搜索并浏览一些文章后,我成功重置了密码。Media
via https://linux.cn/article-9990-1.html
初学者指南:在 Ubuntu Linux 上安装和使用 Git 和 GitHub
这篇向导是对于安装和使用 GitHub 的的一个快速说明,本文还将涉及诸如创建本地仓库,如何链接这个本地仓库到包含你的项目的远程仓库(这样每个人都能看到你的项目了),以及如何提交改变并最终推送所有的本地内容到 Github。Media
via https://linux.cn/article-9991-1.html
这篇向导是对于安装和使用 GitHub 的的一个快速说明,本文还将涉及诸如创建本地仓库,如何链接这个本地仓库到包含你的项目的远程仓库(这样每个人都能看到你的项目了),以及如何提交改变并最终推送所有的本地内容到 Github。Media
via https://linux.cn/article-9991-1.html