我的写作工具链
工欲善其事,必先利其器
v4:201801
更新内容:
- 数据可视化(五)基于网络爬虫制作可视化图表
- 基于 Node.js 实现程序化文本编辑
- 基于 Graphviz 实现程序化绘图
- 图片处理(Photoshop):批处理与动作
- Blog generator(hexo):优化内容页脚模版、修复google/baidu site xml 问题、修复https兼容问题
- 扩展 Markdown 源文件编辑工具集(nodejs-based)
前期需求:
1)源文件持续修改中出现的回归编辑工作,互相引用的链接较多
2)兼容现有的 Blog Generator (Hexo) 便于融合使用
3)支持 command-line 模式便于调用
后续目标:
1)专题模板一次编辑,多处插入
2)主体自动聚合,类似维基(Template talk)
var fs = require('fs-extra');
var path = require('path');
// All paths are relative to package.json.
var pagesPath = './source/_posts';
var copyFolders = ['./images', './css', './js'];
var outputPath = './tmp';
// First delete everything in the tmp directory.
console.log('Cleaning previous tmp...');
try {
for (var file of fs.readdirSync(outputPath)){
fs.removeSync(path.join(outputPath, file));
}
}
catch (err){
console.log('Error during cleanup: '+err);
process.exit(1);
}
// Then read everything in the pages directories.
var pages = {}, pagesMeta = {};
console.log('Loading pages...');
try {
for(var page of fs.readdirSync(pagesPath)){
pages[page] = fs.readFileSync(path.join(pagesPath,page),'utf8');
}
}
catch (err){
console.log('Error during page loading: '+err);
process.exit(1);
}
// Generate each page from the data provided, using the template.
console.log('Generating pages...');
try {
for(var page of Object.entries(pages)) {
var pageFullName = page[0];
var pageName = page[0].slice(0, page[0].lastIndexOf('.'));
var metaData = pagesMeta.hasOwnProperty(pageName+'.json')
var source_file = pagesPath +'/'+ pageFullName;
var target_file = outputPath +'/'+ pageFullName;
//console.log(pageFullName);
if(source_file.lastIndexOf('.md')>0){
var source_str = 'http:\/\/riboseyim.github.io';
var target_str = 'https:\/\/riboseyim.github.io';
var exec = require('child_process').exec;
var cmdStr = 'gsed -e "s/'+source_str+'/'+target_str+'/g" ' + source_file + ' > ' + target_file;
console.log(cmdStr);
exec(cmdStr, function(err,stdout,stderr){
if(err) {
console.log('exec error:'+stderr);
} else {
//console.log(stdout);
}
});
}
}
}catch (err){
console.log('Error during page generation: '+err);
process.exit(1);
}
console.log('--------------Done!--------------------');
v3:201706
更新内容:
OmniFouse: 计划管理、进度提醒
数据容灾:统一使用坚果云
摄影处理:图片像素、大小处理
OmniGraffle:存量数据合并整理,空间布局/样式配色技巧升级
图床:云存储分库、图片命名、批处理
Evernote、Ulysses:一般性创意素材从Evernote迁移到Ulysses
Atom: 发布定稿前版本采用Atom作为编辑器
GitBook: 《Linux Perf Master》 反馈极好
版权骑士: 效果不佳,remove
v2:201701
更新内容:
摄影器材:微单。效果较好的场景:园林、博物馆、航展
OmniGraffle:高级应用技能:图层、统一样式、配色技巧
图床:采用七牛云
Evernote:及时检阅、分类、删除剪辑内容
GitBook: 新手入门
Blog generator(hexo): 优化Markdown-->Html自动生成、发布流程
v1:201606
更新内容:
Evernote:素材仓库
支持所有手机、平板和电脑。在任意一台设备打开Evernote,随时记录一切、轻松收集资料、一键演示笔记、高效协作共享。
MindManager:框架梳理
一般人的大部分思考过程都是杂乱无序的,没有逻辑的,最后也没法形成有效的沉淀,更无法找到清晰的结论。不是所有的人都是天生就有很好的逻辑的,MindManager可以辅助进行思维整理、分析、可视化的工具。比如写这篇的时候,就是现在MindManager梳理了一个概要,之后导出为文本作为底稿。
OmniGraffle:思维可视化
由The Omni Group制作的一款绘图软件,它曾获得苹果设计奖。可以支持流程图、逻辑图、模型设计等,堪称万能绘图神器。这年头大家都挺忙的,能用一张图表达的意图,就不用写一大堆字啦。
Markdown:一次编写,到处发表
Markdown标记语言,我其实很久以前就掌握了,但是使用频率很低,也谈不上什么美感。真正推动我把Markdown纳入个人工具箱的也是写作,可以说是相辅相成吧。它最大的意义在于通过极简的形式,解决了写作成果的移植通用性的问题。
Ulysses:样式精美、版本管理、ZoomIn/ZoomOut
扩展阅读
- 海量数据迁移之使用shell启用多个动态并行(r2笔记81天)
- 使用shell测试历史数据样本(r2笔记80天)
- 【专业技术】编译器的工作原理
- ORA-17500 ODM err的问题排查(r2笔记78天)
- 【专业技术】linux启动流程剖析
- 使用dbms_metadata生成建表语句(r2笔记97天)
- 海量数据迁移之使用分区并行切分导入(r2笔记79天)
- 关于oracle session的简单测试(r2笔记95天)
- 使用utl_file走选择性数据导出(r2笔记95天)
- 使用Linux命令发送邮件(r2笔记94天)
- 如何用python轻松破解wifi密码( 源码 )
- 海量数据迁移之通过shell估算数据量 (r2笔记93天)
- 使用sklearn进行数据挖掘
- 批量转换分区表为普通表(r2笔记92天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【从0到1学习边缘容器系列-3】应用容灾之边缘自治
- Hacking with iOS: SwiftUI Edition - 里程碑:项目 13 - 15
- HDU 1896 优先队列用法
- 蓝桥杯省内模拟赛C++
- C++ STL (标准模板库) 详细内容讲解
- 蓝桥杯 试题 基础练习 分解质因数
- 蓝桥杯 试题 基础练习 FJ的字符串
- 蓝桥杯 试题 基础练习 龟兔赛跑预测
- 问题 1432: [蓝桥杯][2013年第四届真题]剪格子
- 问题 1426: [蓝桥杯][历届试题]九宫重排
- mock测试及jacoco覆盖率
- HDU 1495 非常可乐 最简单的的解决方案
- Performing Push Install adb: error: failed to get feature set: more than one 解决方案
- Shell Style Guide
- 10分钟搞定OAuth2.0授权服务