关于tools:使用-Shell-进行数据整理学习笔记

写在后面:本篇内容来自于 MIT 推出的课程:计算机教育中缺失的一课,这门课程介绍了命令行、弱小的文本编辑器的应用、应用版本控制系统提供的多种个性等等。中文课程主页:https://missing-semester-cn.github.io/ 本篇为课程的第4节,主题为数据整顿。 大多数状况下,数据整顿须要您可能明确哪些工具能够被用来达成特定数据整顿的目标,并且明确如何组合应用这些工具。 获取服务器日志: ssh myserver journalct > journalsed:应用正则表达式进行替换,用法, sed 's/.*Disconnected from //', 将这一部分替换为空。 s/REGEX/SUBSTITUTION/ 捕捉组,如果想要保留表达式中的一部分匹配信息,能够在SUBSTITUTION中应用 \1、\2 来示意其中的捕捉到的信息正则表达式的一些用法 . 除空格之外的”任意单个字符”(这里对吗,没有空格吗?)* 匹配后面字符零次或屡次+ 匹配后面字符一次或屡次[abc] 匹配 a, b 和 c 中的任意一个(RX1|RX2) 任何可能匹配RX1 或 RX2的后果^ 行首$ 行尾正则表达式默认是贪心匹配的,能够在 * 或 + 后增加 ? 来变为非贪心的模式测试正则表白是否正确:debug匹配任意一个单词( [^ ]+ 会匹配任意非空且不蕴含空格的序列) 其中 ^ 如果放在表达式最开始,代表从行首开始匹配;否则含意为“不蕴含”对输出数据排序: sort sort -n 会依照数字程序对输出进行排序(默认状况下是依照字典序排序 -k1,1 则示意“仅基于以空格宰割的第一列进行排序”。 ,n 局部示意“仅排序到第 n 个局部”,默认状况是到行尾。sort -r 能够倒序把间断呈现的行折叠为一行并应用呈现次数作为前缀: uniq -cssh myserver journalctl # 读取日志 | grep sshd | grep "Disconnected from" | sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' # 获取用户名 | sort | uniq -c # 将用户名排序并合并 | sort -nk1,1 | tail -n10 | awk '{print $2}' | paste -sd, # 合并行,应用,分隔awk:是一种编程语言,十分长于解决文本 ...

May 8, 2021 · 2 min · jiezi

初探Logback学会看懂Logback配置文件

前言在现如今的应用中,日志已经成为了一个非常重要的工具。通过系统打印的日志,可以监测系统的运行情况,排查系统错误的原因。日志从最早期的System.out.print到如今各种成熟的框架,使得日志打印更加规范化和清晰化。尤其是SLF4J的出现,为日志框架定义了通用的FACADE接口和能力。只需要在应用中引入SLF4J包和具体实现该FACADE的日志包,上层应用就可以只需要面向SLF4J接口编程,而无需关心具体的底层的日志框架,实现了上层应用和底层日志框架的解耦。Logback作为一个支持SLF4J通用能力的框架,成为了炙手可热的日志框架之一。今天就来稍微了解一下Logback日志的一些基础能力以及配置文件。 快速上手Logback引入MAVEN依赖logback主要由三个模块组成,分别是logback-core,logback-classic和logback-access。其中logback-core是整个Logback的核型模块,logback-classic支持了SLF4J FACADE,而logback-access则集成了Servlet容齐来提供HTTP日志功能,适用于web应用。下面主要是基于logback-classic来进行介绍。 引入logback-classic的包如下: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.3.0-alpha5</version></dependency>上面拉取的Maven包基于传递性远离,会自动拉取logback-classic,logback-core和slf4j-api.jar,因此无需在项目中再额外声明SLF4J和logback-core的依赖。 使用Logback因为logback-classic实现了SLF4J FACADE,所以上层应用只需要面向SLF4J的调用语法即可。下面代码展示了如何获取到Logger对象用来打印日志。 import org.slf4j.Logger;import org.slf4j.LoggerFactory;import ch.qos.logback.classic.LoggerContext;import ch.qos.logback.core.util.StatusPrinter;public class HelloWorld2 { public static void main(String[] args) { //这里的Logger和LoggerFactory均为SLF4J的类,真正调用时会使用Logback的日志能力 //getLogger方法中传入的是Logger的名称,这个名称在后面讲解配置文件中的<logger>时会继续提到 Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2"); //打印一条Debug级别的日志 logger.debug("Hello world."); //获取根Logger,使用场景比较少 Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); }}日志级别Logback中每一个Logger都有对应的日志级别,该日志级别可以是Logger自己定义的,也可以是从父Logger上继承下来的。Logback一共支持5个日志级别,从高到低分别是ERROR,WARN,INFO,DEBUG,TRACE。Logger的日志级别决定了哪些级别的日志可以被输出。只有大于等于该Logger级别的日志才会被打印出来。比如假设上文中获取的名为"chapters.introduction.HelloWorld2"的Logger日志级别为INFO,则调用logger.debug("xxx")不会输出日志内容,因为DEBUG日志级别低于INFO日志级别。 日志级别可以帮助我们控制日志打印的粒度,比如在开发环境可以将日志级别设置到DEBUG帮助排查问题,而在生产环境则可以将日志级别设置到INFO,从而减少不必要的打印日志带来的性能影响。 参数化输出有时候我们往往并不只是打印出一条完整的日志,而是希望在日志中附带一些运行中参数,如下: Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2");logger.debug("Hello World To " + username);上文的日志中除了打印了一些结构化的语句,还拼接了运行时执行这段逻辑的用户的名称。这里就会带来一个问题,即字符串拼接的问题。虽然JVM对String字符串的拼接已经进行了优化,但是假如当前的日志级别为INFO,那么这段代码所执行字符串拼接操作就是完全不必要的。因此,建议在代码加上一行日志级别的判断进行优化,如下: //非debug级别不会执行字符串拼接操作,但是debug级别会执行两次isDebugEnabled操作,性能影响不大if(logger.isDebugEnabled()) { logger.debug("Hello World To " + username);}但是,logback并不推荐在系统中使用字符串拼接的方式来输出日志,而是提倡使用参数传递的方式,由logback自己来执行日志的序列化。如下: //logger方法会判断是否为debug级别,再决定将entry序列化拼接如字符串logger.debug("The entry is {}.", entry);这种日志输出方式就无需额外包一层日志级别的判断,因为logger.debug方法内部自己会判断一次日志级别,再去执行日志内容转码的操作。注意,传入的参数必须实现了toString方法,不然日志在对对象进行转码时,只会打印出对象的内存地址,而不是对象中的具体内容 整体架构前文已经简单介绍了logback包含的三个主要模块,以及如何在代码中基于SLF4J FACADE自由的使用日志框架。下面开始从配置文件的角度来了解如何配置Logback。Logback主要支持XML和groovy结构的配置文件,下文中将以XML结构为基础进行介绍。 上图为官网中对Logback配置文件整体结构的描述。配置文件以<configuration>作为根元素,其下包含1个<root>元素用于定义根日志的配置信息,还有0到多个<logger>元素以及0到多个<appender>元素。其中<logger>元素对应了应用中通过LoggerFactory.getLogger()获取到的日志工具,<appender>元素定义了日志的输出目的地,一个<logger>可以关联多个<appender>,即允许将同样的一行日志输出到多个目的地。 ...

November 3, 2019 · 1 min · jiezi

VSCode插件Path-Autocomplete高级技巧

曾经介绍过Path Autocomplete是一款非常不错的VSCode插件。当然出了最基本的路径补全提示,还有些高级技巧和使用中可能遇到的小问题,在此和大家分享下。 映射目录当你项目中的Webpack使用了resolve.alias,webpack.config.js配置如下: module.exports = { //... resolve: { alias: { Utilities: path.resolve(__dirname, 'src/utilities/'), Templates: path.resolve(__dirname, 'src/templates/') } }};那么项目之前引入的一个文件的方法假设是: import Utility from '../../utilities/utility';现在就可以写成: import Utility from 'Utilities/utility';问题来了,当你输入Utilities/的时候,编辑器根本不知道这里面有什么文件,无法实现补全提示。 这时候,只需要在这个项目添加一个插件的配置就可以了,配置如下: { "path-autocomplete.pathMappings": { "Utilities": "${folder}/src/utilities/", }}${folder}表示项目根目录,如果你的项目和示例略有不同,请根据具体情况修改。这样是不是很方便啊,同理很多脚手架或框架(比如Nuxt.js)自带了这种类似的依赖关系,都是可以通过插件的pathMappings设置来更好的写代码的。 该功能示例在官方文档Options - pathMappings,也有,可以参考。出现重复文件和目录补全提示比如,你可能会遇到路径补全提示中出现重复的目录名称或者是文件,如下图: 那我也是尝试关闭VSCode自带的补全功能结果没找到。后来仔细阅读了插件文档,google相关信息,总结了下: 设置插件选项该插件提供了一个选项path-autocomplete.ignoredFilesPatter,你可以通过添加一行设置如下: "path-autocomplete.ignoredFilesPattern": "**/*.{js,ts,scss,css}"参阅:Path Autocomplete Tips 意思是匹配到所有的js、scss、css、ts文件时,path-autocomplete将被忽略。 设置VSCode内置选项在现有版本的VSCode上,是有两个选项关闭js、ts的路径提示的,我们可以通过关闭它们,达到目的: "javascript.suggest.paths": false,"typescript.suggest.paths": false,这样的话也能解决重复提示的问题,当然缺点是,其他文件类型就无法解决了。 相关阅读: Folders are duplicated on sass import statementmultiple suggesion in js files失效总的来说,推荐使用第一种设置插件选项来解决这个问题。 快速跟踪文件抱歉,理论上来说这个是VSCode内置的取代该插件的方案,但是我总是发现不太好用。 理论上,进行了jsconfig.json配置,详细可阅读官方说明,也可以达到映射目录的能力,并且,根据插件内的这段Configure VSCode to recognize path aliases描述来看,他是可以解决文件关联打开的,但是我反复测试了好久,都无法正常实现。原因不明,有兴趣的朋友也可以试试这个哦~ ...

October 17, 2019 · 1 min · jiezi

Typescript-使用API-来做一波编译

首发于: https://luoyangfu.com/article...前言下面假设在tsc 执行目录中有如下配置:{ "compilerOptions": { /* Basic Options */ "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "plugins": [{ "name": "typescript-tslint-plugin" }], // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ // "sourceMap": true /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "dist" /* Redirect output structure to the directory. */, // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ // "removeComments": true, /* Do not emit comments to output. */ // "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ // "noUnusedLocals": true, /* Report errors on unused locals. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ /* Module Resolution Options */ "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, // "baseUrl": "." /* Base directory to resolve non-absolute module names. */, // "paths": { // "config/*": ["src/config/*"], // "controllers/*": ["./src/controllers/*"], // "db/*": ["./src/db/*"], // "middlewares/*": ["./src/middlewares/*"], // "routes/*": ["./src/routes/*"], // "services/*": ["./src/services/*"], // "static/*": ["./src/static/*"], // "templates/*": ["./src/templates/*"], // "tools/*": ["./src/tools/*"], // "src/*": ["./src/*"] // } /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */, // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ "traceResolution": false, "typeRoots": [ "node_modules/@types", "src/typings" ] /* List of folders to include type definitions from. */, // "types": [], /* Type declaration files to be included in compilation. */ "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ "inlineSourceMap": true /* Emit a single file with source maps instead of having a separate file. */, // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ /* Experimental Options */ "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, "include": ["src/**/*"]}上面就为一个typescript的简单配置。(PS: 可直接复制使用哦) ...

June 19, 2019 · 5 min · jiezi

go-watcher 一个热重载工具

Golang编写的热重载工具,自定义命令,支持监视文件及路径配置,环境变量配置。这是一个重复的轮子~地址在:github.com/yeqown/go-watcher,欢迎fork和PR。安装使用go install github.com/yeqown/go-watcher/cmd/go-watcher命令行➜ go-watcher git:(master) ✗ ./go-watcher -h NAME: go-watcher - A new cli applicationUSAGE: go-watcher [global options] command [command options] [arguments…]VERSION: 2.0.0AUTHOR: yeqown@gmail.comCOMMANDS: init generate a config file to specified position run execute a command, and watch the files, if any change to these files, the command will reload help, h Shows a list of commands or help for one commandGLOBAL OPTIONS: –help, -h show help –version, -v print the version配置文件watcher: # 监视器配置 duration: 2000 # 文件修改时间间隔,只有高于这个间隔才回触发重载 included_filetypes: # 监视的文件扩展类型 - .go # excluded_regexps: # 不被监视更改的文件正则表达式 - ^.gitignore$ - ‘.yml$’ - ‘.txt$‘additional_paths: [] # 除了当前文件夹需要额外监视的文件夹excluded_paths: # 不需要监视的文件名,若为相对路径,只能对于当前路径生效- vendor- .gitenvs: # 额外的环境变量- GOROOT=/path/to/your/goroot- GOPATH=/path/to/your/gopath使用范例日志➜ go-watcher git:(master) ✗ ./package/osx/go-watcher run -e “make” -c ./config.yml[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/cmd) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/cmd/go-watcher) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/internal) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/internal/command) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/internal/log) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/internal/testdata) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/internal/testdata/exclude) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/internal/testdata/testdata_inner) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/package) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/package/archived) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/package/linux) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/package/osx) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/resources) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/utils) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/utils/testdata) is under watching[INFO] directory (/Users/yeqown/Projects/opensource/go-watcher/utils/testdata/testdata_inner) is under watchingrm -fr packagego build -o package/osx/go-watcher cmd/go-watcher/main.goGOOS=linux GOARCH=amd64 go build -o package/linux/go-watcher cmd/go-watcher/main.gomkdir -p package/archivedtar -zcvf package/archived/go-watcher.osx.tar.gz package/osxa package/osxa package/osx/go-watchertar -zcvf package/archived/go-watcher.linux.tar.gz package/linuxa package/linuxa package/linux/go-watcher[INFO] command executed done![INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/osx/go-watcher) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/osx) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/linux/go-watcher) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/linux) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/archived/go-watcher.linux.tar.gz) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/archived) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/VERSION) is skipped, not target filetype[INFO] [/Users/yeqown/Projects/opensource/go-watcher/cmd/go-watcher/main.go] changedrm -fr packagemkdir -p package/osxmkdir -p package/linuxecho “2.0.0” > VERSIONcp VERSION package/osxcp VERSION package/linuxgo build -o package/osx/go-watcher cmd/go-watcher/main.goGOOS=linux GOARCH=amd64 go build -o package/linux/go-watcher cmd/go-watcher/main.gomkdir -p package/archivedtar -zcvf package/archived/go-watcher.osx.tar.gz package/osxa package/osxa package/osx/go-watchera package/osx/VERSIONtar -zcvf package/archived/go-watcher.linux.tar.gz package/linuxa package/linuxa package/linux/go-watcher[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/osx) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/linux) is skipped, not target filetypea package/linux/VERSION[INFO] command executed done![INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/osx) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package/archived) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/VERSION) is skipped, not target filetype[INFO] (/Users/yeqown/Projects/opensource/go-watcher/package) is skipped, not target filetype^C[INFO] quit signal captured![INFO] go-watcher exited➜ go-watcher git:(master) ✗ ...

March 31, 2019 · 2 min · jiezi

推介几款 windows 下非常好用的工具

在下工具控一枚,平时会留意收集各种各样给我们生活生产带来便捷的工具,毕竟人生苦短;下面介绍一些 Windows 系统上发现的一些好用的工具,并且将一笔带过主要特点,详细用法可以搜一下,相关帖子挺多的,每个都展开介绍的话那就太长啦Listary啥都憋说了,Listary 必须排在第一个,用过 Everything,觉得还是 Listary 更胜一筹;它不仅可以在本地非常快速的搜索,还可以打开网站、在搜索引擎中搜索、随时随地打开快捷菜单、文件快速定位、快速打开cmd窗口等等优秀的功能,轻量、简洁、随时随地;比如输入cmd打开cmd窗口,输入cmda使用管理员权限打开cmd窗口,输入wyyyy打开网易云音乐,焦点在某个文件的时候Enter直接打开,Ctrl + Enter 是打开文件所在文件夹;值得一提的是搜索关键词功能,让我们可以非常便捷的打开相应网站或用搜索引擎搜索,比如输入gg 我的存款呢?就可以直接打开默认浏览器在谷歌搜索中搜索,还可以自定义输入其他关键字,只需把搜索链接中的关键字换成{query} DittoDitto 是一款免费开源的 indows 剪切板管理工具,作为Ctrl C V工程师,复制粘贴少不了,更厉害的是,它可以批量的复制,Ctrl+C一堆别人的代码,一次性全粘上,岂不美哉;使用快捷键打开剪切板历史,然后Ctrl / Shift来选择你希望粘贴的内容,Enter即可选择性的粘贴多行内容;另外剪切板历史还可以搜索,快速找到复制内容;只需设置寥寥几个快捷键,就可以很方便的操作剪切板,带来极大幸福Winsnap看到上边的截图没,旁边都有很骚包的阴影,怎么做到的?不需要各种高大上的图片处理软件,使用 Winsnap ,它可以在截图的时候自动帮你加上背景阴影,然后帮你自动复制到剪切板;它可以使用全屏、应用程序、窗口、对象等捕捉模式,更牛的是它还可以在截图的时候同时选择和捕捉多个对象,按住Ctrl或Shift选择多个窗口或对象…这个就比较厉害了,试试看?CmderCmder 是一个美观又实用的命令行工具,它支持大部分Linux命令,支持ssh连Linux,还可以在它的窗口中新建cmd和powershell,更多玩法等你来战比较方便的是在安装目录下 \config\user-aliases.cmd 设置 alias 别名,比如参见的 Git 操作:ga=git add $*gb=git branch $*gc=git commit $*gch=git checkout $*gd=git diff $*gl=git log $*gs=git status $*还可以将cmder配置到右键菜单,快捷在当前目录打开cmder,方法是先把这个地址加到系统的path环境变量里面,比如我的是D:cmder,然后右键Cmder.exe属性-兼容性-以管理员身份运行此程序,再重新打开Cmder.exe输入Cmder.exe /REGISTER ALL就行了记得安装完在配置Setting-Startup-Environment里面加上set LANG=zh_CN.UTF8,否则输出的一些中文会乱码;Typora使用过很多 Markdown 编辑器,最后选择了 Typora,与主流编辑器一边编辑一边预览的形式不同,Typora 是将编辑和预览合并到一起,简洁大方,目光也不需要在编辑区和预览区中来回切换了,只有当焦点移入的时候才显示 Markdown 语法;另外 Typora 还支持 Latex、[TOC]动态目录、拖拽图片自动生成本地预览链接、自定义主题等方便的功能;Quick LookQuickLook 是在 Microsoft Store 里面下载的一个速览工具,有时候打开一个PDF、视频之类的需要等关联程序启动半天,有了它之后只要选中目标文件,按空格就可以快速预览了,速度非常快,支持图片、视频、音频、压缩包、PDF、文本文件、Markdown、HTML等格式;用它来看一些代码什么的,甚至不需要 SublimeVSCode 启动就可以直接看了,如果只是速览一下的场景的话非常适合。Myper SplashMyper Splash 也是可以在 Microsoft Store 里面下载的一款高质量壁纸库,所有壁纸来源 Unsplash 网站,均无版权可以免费使用,再加上简洁美观的UI/UX设计,让你体验一见钟情的感觉。另外 MyperSplash 可以设置自动每天自动更换壁纸或锁屏,每天早晨来到办公室点亮屏幕就可以看到 Awesome 的锁屏或壁纸,让你带着好心情开启一天的工作。GifCam / ScreenToGif相信大家都有过需要截一个 Gif 的时候,这里有两个免费 Gif 屏幕录制工具都很不错,小而美的 GifCam 和开源强大的 ScreenToGif ;GifCam 小巧便捷,如果希望快速录屏分享,那么它是不二选择,可以选择录屏帧率,录制的过程可以调整窗口大小和位置,也可以暂停和继续,足以满足大部分的使用场景;SceenToGif 的编辑功能更为强大,可以单独操作录制的帧,删除、加速或修改都可以,试试看吧Free Download ManageFree Download Manage (FDM) 是一款免费的下载工具,如果你已经受够了国内一些软件的广告和限速,那么 FDM 是一个不错的选择,另外多线程、断点续传、计划任务等功能让 FDM 值得推介。SourcetreeSourcetree 是跨平台免费的 Git 客户端管理工具,如果受够了手打各种 Git 操作命令,那么 Sourcetree 是一个不错的选择;Sourcetree 可以大大简化你的代码操作,特别是对于一些不甚熟悉 Git 命令的人来说灰常实用;一些对 Git 操作比较熟练的用户也可以用它来提升效率,减少出错。 ...

January 4, 2019 · 1 min · jiezi

推荐一款可以多平台上使用的控制台工具

先强调一下,这个是可以在windows, linux, mac 多平台上使用的以前找过ubuntu上介绍的控制台工具,反正一个字都是丑。这里通过electron官网搜索了使用electron开发的软件,发现了一款不错的控制台工具(上面还有其它的比较好用的),推荐给大家Extraterm这里是github的官方地址Github喜欢这个的给个赞吧

December 29, 2018 · 1 min · jiezi