岁月并没有在我身上雕凿出成熟的形状。依旧是那张不谙世事的脸和一双彷徨的眼,只是与之不相称的白发又愈加多了几抹。
生命到了这样一个时期,既不年轻,又不老。时间也变得越来越难以感知。前天、昨天、今天好像都差不多,前年、去年、今年也让人记不太清。只有其间夹杂着的对逝者的哀思和对新生命的期盼在提醒着它的流逝,诉说着它的无情。就像一块焦碳,偶有火光从条条裂隙中闪现又熄灭。
曾经朦胧的梦想,还没等我看清,就已经开始褪色了。
机场大厅里,我和妻子望着一排排流动的旅客不知所措。一睹宝岛台湾的风采是我们一直以来的梦想。兴冲冲地买了机票,我却打了退堂鼓。因为想起来好像有规定说现在特殊时期无故不得出境。然而票又不能退了,就在去与不去之间犹豫不决,甚至想过豁出去算了,大不了被开除……
我睁开眼睛,原来这只是一场梦境。梦的结局我记不清,大体是以失望收场的吧。虽说是梦,可这内心的剌痛却十分真实。这哪是梦想照进现实,这是现实照进梦想!这是身处体制所带来的内心的挣扎在梦境中的投射!那种想破笼而出自由飞翔却又害怕无处落脚摔得粉身碎骨的纠结!
《终结者:黑暗命运》上映,我兴致勃勃地拉着妻子一起去看,路上顺带给她温习前两部的情节。影厅里只有寥寥十来人,占据了中间大部分位置,就像在正方形里画出了一个圆圈。我俩找到位置坐下。银幕上开始闪回《终结者 2:审判日》的画面,儿时的记忆浮现,然而越看却越不是滋味。说是正统续作,但剧情只是前两部的无聊拷贝。炫酷的特效掩盖不了剧情的薄弱,情怀也难以突显。
电影落幕,我们还坐着期待彩蛋。原本和我们一起坐着的观众,陆续略带失落地起身离开,我们终也坐不下去,在邓紫棋演唱的主题曲响起时离开了。毕竟,这不是没完没了的漫威电影。
很难评价这部影片带给我的感受。思来想去,我认为是观影心态出了问题,不能用过去的眼光去欣赏现在的电影。无论它拍成什么样,想要重拾儿时的感动是不可能的。就像是儿时吃生日蛋糕和现在吃生日蛋糕,同样的配方吃进嘴里,不一样的滋味涌上心头,难以言说。只道是物是人非。正如 T-800 在镜子前拿起又放下的墨镜,有些人和事,注定只属于过去,不是 I won’t be back,而是根本回不去了。
不知不觉就到了十一月,又一年即将画上名号。天气的反应一如既往地迟钝,我倒是警觉起来,开始疯狂看书,颇有种临近开学恶补暑假作业的感觉。不同之处在于,后者是被逼无奈,而前者是努力想在时间中留下自己的脚印。要不然,面对今年看了几本书这种问题时,又不知该怎么回答了。
趁着双十一电商促销,贪心地买了很多实体书。看书,与其说是给精神充电,不如说是在寻找答案。只是这答案的问题是什么,我也说不上来。
都说人生像坐过山车,有高峰,也有低谷。可我怎么感觉像是泳池滑梯,一段下降接着一段平坦,然后又是一段下降。我的人生似乎总是处于低谷。究竟需要多少本书,才能填平我人生的低谷?
成长,就是一系列价值观崩塌的过程。大人们口中讲述的一个个童话故事,就像刚倒出的啤酒上雪白的泡沫,在与这个世界不断接触的过程中一个一个地破灭。最后喝进嘴里的,只剩苦涩。
我们与小猪佩奇牵着的手,在得知猪肉是怎么来的之后松开了。我们对诚实的理解,在第一次作文中不写实话反被夸的时候颠覆了。我们对老师的景仰,在得知补课花了很多钱的时候动摇了。我们对规则的坚守,在被人嘲笑太老实的时候退却了……
这样看来,价值观与其说是一点点建立起来的,倒不如说是事先堆得老高,再一点点削减成型的。只是这一番削减之后,剩下的不是高楼大厦,而且像金字塔一样,高尚的部分只占顶端一点点,而粗俗则构筑了大部分基底。
大人们为孩子们苦心构筑起美好的童话世界,却没能维护好它。直到他们被现实世界一点点同化并对此习以为常。然后,不知从何时起,“都是这样的”成了我们最好的安慰剂。仿佛一切都是可以被理解,被接受,甚至被习惯的。
Twenty five years and my life is still, trying to get up that great big hill of hope, for a destination… 耳边传来熟悉的旋律,我停下脚步。
这歌声并非来自街角的某家唱片店,因为那种东西早已进入了历史博物馆。第一次听这首歌的时候,我才刚满 18 岁,那时街上还有磁带卖,电视还是 4:3,墙上贴海报还是一种时尚,25 岁对我来说还是一个遥远的年纪。如今我都快 35 了,歌词对我依然适用,也许改成 45,仍然成立。
尼采说,人生本没有意义,需要我们赋予它意义。但究竟要赋予它什么意义,活到现在我还没明白。生活有时候就是这样,只是生着,却没能明白地活着。但愿时间能让我们明晰。
朦胧的街灯下,我整了整衣领,再次迈开脚步。
]]>一个可以根据当前情景智能推荐古诗词的一言 API,很有意思。
可以在自己的网站中使用,效果见本博客副标题。
]]>Google 说这些游戏需要文泉驿正黑字体才能正常显示中文,但我的 openSUSE 已经安装了文泉驿正黑了,照样无法显示。后来搞了很久才弄明白,openSUSE 官方源里 wqy-zenhei-fonts
包含 WenQuanYi Zen Hei Mono
和 WenQuanYi Zen Hei Sharp
,而 Steam 要的是 WenQuanYi Zen Hei
!
没错!也就是说,Steam 需要的不是文泉驿等宽正黑或文泉驿点阵正黑,而是最纯粹的那个文泉驿正黑。而这,openSUSE 官方源里没有。
解决方法就是 fontconfig,配置如下:
1 | <match target="pattern"> |
上面这段配置的意思,无论有没有安装文泉驿正黑,都用文泉驿微米黑来代替它。当然也可以根据喜好指定由别的字体来代替,只要修改上面的 WenQuanYi Micro Hei
字段即可。
1 | $ sed -i s/OLDURL/NEWURL/g `grep -rl OLDURL DIR/*` |
通过 grep 递归查找目录下的所有文件,并把含有某字符串的文件都列出来,然后把这些文件名作为 sed 的参数。sed 默认是把修改结果打印到标准输出,用 -i
让它直接修改文件。
1 |
|
This is a typical graph for comparing total income and expenses of every month. I set the amount format of income to absolute value so it can appear on the Y axis as expenses side by side for easy comparison.
1 |
|
This script will plot a monthly histogram of any account we specify. When executing, an account name must be followed as parameter. For example, if Expenses:Eating
is followed, the script will show us how much we spent on Eating in every month.
1 |
|
This script will plot a histogram of any account we specify, not monthly, but with sub accounts. When executing, account name and/or period shall be followed as parameter. For example, if followed by Expenses -p oct
, the script will show us what exactly took our money in October, from the most to the least.
1 |
|
We can see how our Income and Expenses grow throughout the year with this script. If the gap between goes bigger, means we’re getting more wealthy. If the gap goes smaller, we should really pay good attention to it.
1 |
|
This script helps us to see how our Assets and Liabilities change throughout the year. The gap between represents net wealth. It’s a good thing to see the gap goes bigger.
1 |
|
As you can see the graph is a little complicated, the X axis lists all the expenses, Y axis is amount accumulated month by month. Every line represents the total amount until that month. The script require a Haskell reimplementation of Leger - hledger, in order to work.
I don’t konw how to describe it appropriately, as it shows every month’s detailed expenses, so I name it Mega Expenses. It’s a clutter to see as is, but when using an interactive terminal, reveal month by month, we are able to figure out some unusual expenses that jump too high than previous steps.
First, all scripts assume that the default account names are Income, Expenses, Assets, Liabilities. If yours are not, change them accordingly.
Second, all scripts assume journal files keep in a yearly basis, i.e. every year’s journal should be a separate file. There’s no restrictions on reporting period, you may need to add some parameters to restrict the output to a specific period.
Third, multi-currency is not taking into consideration. If you have multi-currency, amend the scripts and add parameters just like you would do with Ledger.
]]>本文不从专业的会计角度,而是通过生活中记账的实际需求出发,来阐明复式记账的含义及优点。不求全面专业,但求简明易懂。
我们记账的目的之一是追踪资产的变动。所以一般的流水账(单式记账)都是从资产的角度出发的。比如,11 月 18 日我在超市买了一盒巧克力,花了 30 元,刷的超市卡。那么,可以记录如下:
日期 | 备注 | 超市卡 |
---|---|---|
期初余额 | 200 | |
11.18 | 超市买巧克力 | −30 |
结余 | 170 |
同理,我们也可以为现金、银行卡等资产建立相应的账户,以方便我们随时了解资产状况,查询支出。比如第二天我又去超市买了一块香皂,花了 5 元,付的现金。那么,我们可以在原来的表格上加上一笔记录:
日期 | 备注 | 超市卡 | 现金 |
---|---|---|---|
期初余额 | 200 | 100 | |
11.18 | 超市买巧克力 | −30 | |
结余 | 170 | ||
11.19 | 超市买香皂 | −5 | |
结余 | 95 |
像这样的流水账方式在记录上一点问题也没有,但当我们需要统计支出的时候就麻烦了。比如,我希望知道这个月我在“食品”上花了多少钱,我要一条条去找记录,把用在食品上的钱拎出来加总,记录少倒还好,一旦记录多了不仅费时费力而且容易遗漏。不过,办法也是有的,就像众多的记账 app 所做的那样,加一栏支出类别。于是,上面的表格可以变成这样(为了方便整月统计,暂且去掉结余行):
日期 | 备注 | 支出类别 | 超市卡 | 现金 |
---|---|---|---|---|
期初余额 | 200 | 100 | ||
11.18 | 超市买巧克力 | 食品 | −30 | |
11.19 | 超市买香皂 | 生活用品 | −5 |
这样我们统计支出的时候相对来说就方便了点,只要把相同的类别相加即可。但如果有许多条记录,而且无序穿插着各种类别,若不借助电子表格的自动筛选功能,依然是十分低效的。要知道,几百年前可没有电脑,前人可就是用表格形式记在纸上的!要在几百条记录中筛选出相同的类目进行统计,这显然并非最佳方案。于是,前人再次用智慧改进了记录方式。
既然资产账户可以做为一列,为什么支出不能做为一列呢?
日期 | 备注 | 超市卡 | 现金 | 食品 | 生活用品 |
---|---|---|---|---|---|
期初余额 | 200 | 100 | |||
11.18 | 超市买巧克力 | −30 | 30 | ||
11.19 | 超市买香皂 | −5 | 5 |
把表格弄成这样是不是方便多了呢?我要统计某一类别的支出,直接在该列上竖向加总就行了,根本不用一条一条去筛选了!这办法真是妙啊!
没错!这就是传说中的复式记账!它的特点就是,凡事皆账户(会计专业术语里叫会计科目),有增必有减,且增减金额相等。
形象一点可以理解成,钱从一个账户跑到了另一个账户,钱总是在账户之间跑来跑去。比如买巧克力就是有 30 元钱从超市卡跑到了食品,买香皂就是 5 元钱从现金跑到了生活用品。
想不到对表格做这样的一个改进就让我们从单式记账跨越到了复式记账,真的是太神奇了!
那么,一笔收入该如何记录呢?聪明!增加一列收入呀!任何想要统计的类目都把它列成一列就可以了。
你可能会觉得,这样子不是每次都得记两次吗?明明只花了一个 30 元,却要填两次金额,多麻烦!反正借助电子表格或记账 app 可以很方便地将相同类别的支出筛选出来,还是用回原来的方法好了。这么想也对,但遇到下面这种情况,单式记账就不好处理了。
举个例子,11 月 20 日我去超市同时买了一块蛋糕和一支牙膏,共花 18 元,其中蛋糕 10 元,牙膏 8 元,一并刷的超市卡。这种情况用流水账该怎么记?我相信这是绝大多数记账 app 用户经常会遇到的问题。如果分开记,那么超市卡的消费记录和实际不符,对账时会造成干扰;如果一并记,那这 18 元的支出应该归到哪个类别?而采用复式记账就能完美处理这种情况,我可以这样记:
日期 | 备注 | 超市卡 | 现金 | 食品 | 生活用品 |
---|---|---|---|---|---|
期初余额 | 200 | 100 | |||
11.18 | 超市买巧克力 | −30 | 30 | ||
11.19 | 超市买香皂 | −5 | 5 | ||
11.20 | 超市买蛋糕和牙膏 | −18 | 10 | 8 |
这样,既能如实记录超市卡的资金变动,又可以分别统计支出类别。
对!在复式记账里,一笔交易可以涉及多个账户的变动(确切来说必须不少于两个),只要增加和减少的总额为零即可。
不知道你怎么想,反正仅合并支付这一项就让我坚定不移地走上了复式记账的不归路。如果你也打算这么干,那需要注意的是,在开始记录的时候,不能直接填入期初余额,因为在第二部分说过,复式记账有增必有减,钱是从一个账户转移到另一个账户,不会凭空增加和消失。即便是期初余额,也要有一个来源,这就需要引入一个特殊账户 Equity。一般情况下,它只在开始记账的时候用到一次,用来分配各个账户的期初余额。所以,上面的表格正确应该是这样:
日期 | 备注 | Equity | 超市卡 | 现金 | 食品 | 生活用品 |
---|---|---|---|---|---|---|
期初余额 | −300 | 200 | 100 | |||
11.18 | 超市买巧克力 | −30 | 30 | |||
11.19 | 超市买香皂 | −5 | 5 | |||
11.20 | 超市买蛋糕和牙膏 | −18 | 10 | 8 |
复式记账里的每一行都要确保有增必有减,且增减金额相等。每一行所有数字相加的和都是零,如果哪一行不是,那就是账不平,就是有错误。
理论上,我们可以根据自身统计需要设置许多账户,比如吃、穿、玩、工资、外快等,然后一列一列地列出来。但是为了避免把自己搞晕,我们还是老老实实地根据会计规则把账户分成 5 大类,即资产、负债、收入、支出和 Equity。然后再根据需要设置子账户。
另外,复式记账的记法有两种,一种是正负记账法,一种是借贷记账法。正负记账法就像本文的例子一样,哪里增加了哪里就减少了,比较好理解。不过,这种方法会让负债的增加和收入的增加显示为负值,一开始可能会不习惯。这种方法 5 大基本账户之间满足 资产 + 负债 + 收入 + 支出 + Equity = 0 这样的等式关系,就是刚才说的每一行数字相加都是零。而如果是借贷记账法,它们之间的关系则是 资产 − 负债 = 收入 − 支出 + Equity。
复式记账名字听着挺专业,其实把原理弄明白了,也就是那么回事儿。最后强烈建议进一步阅读这篇极具启发性的文章 Tutorial on multiple currency accounting。
就说到这,我要记账去了。
]]>本文是我在学习使用 Bullet Journal 过程中的一些思考,以及我个人在实际使用过程中的一些改进,并不是一篇介绍文章或入门文章。不知道 Bullet Journal 是什么的同学请移步 官网,那里有要学习使用 Bullet Journal 所需要了解的一切。
在我看来,Bullet Journal 的精髓要义主要有以下三点:
Bullet Journal 中所有的笔记都是条目式的,并且都是一句简单的陈述句,一般就是一行字。快速记录我认为至少有三个好处。一是方便记录。这个时代恐怕没有人愿意花很多时间在书写上,条目式的记录既方便又高效。二是让人有欲望记录。如果是长篇大论,恐怕写一两天还可以,每天都这样有几个人能坚持?而条目式地快速记录,要求记录者对信息有个提炼,这本身也是件比较有意思的事情。三是方便查阅。相比写起来方便,看起来方便更重要。只有看起来方便,才会时时翻阅,才会把写下来的东西落到实处。而且,Bullet Journal 看上去确实非常赏心悦目,这也归功于另一精髓——子弹符号。
说是子弹符号 (Bullets),英文里其实就是无序列表 (Bulleted list) 中的项目符号的意思。(所以,Bullet Journal 更贴切的翻译可能应该是“条目式日志”,说起来,其实与柳比歇夫时间统计法有几分类似呢。)Bullet Journal 正是在列表的项目符号中做了创新,不仅可以标识任务、事件活动、一般笔记条目,甚至可以标识出任务的不同状态(已完成、已排入日程或延期)。这真是一个相当强大的特性,而且设计得也极为科学。举个例子来说,为什么延期的任务用大于号表示,已排入日程的任务用小于号表示?因为我们一般书写的习惯是从左往右,从前往后的。所以每个月的月历后面,是当月各日的记录,再后面开始新的一月。而大于号的箭头向右,意指这个任务往后移了;小于号向左的箭头意指要往前翻,翻到当月月历那一页去看这个任务具体被排到哪一天了。
通常一本笔记本写完后留下一堆乱糟糟的笔记,可能永远不会去翻看了。而 Bullet Journal 让我们在每一页都写上页码,并在笔记本最开始填上目录。这不仅方便日后查看,更为作笔记这件事增加了一种仪式感。一本笔记本写完之后,得到的将是一本我们自己亲手书写的书籍!
我把 Bullet Journal 的四大模块概括为四个录:
Bullet Journal 最好的地方在于它并不是一种固定的方法,而是可以根据实际需要调整或改进的。我在使用过程中就做了一些改进。
对于目录,我做了两项改进。一是将一页分两栏来写。因为目录条目大多很短,这样可以充分利用页面空间。二是分类索引。比如左栏只索引常规模块,右栏索引特殊模块。
Bullet Journal 的月录中虽然有日历,但与常规的日历视图相去甚远,看着不习惯。如果能将一整年的日历进行一个呈现,那对于做远景规划来说是非常方便的。起初我的想法是在单独一页中将 12 个月的日历都画上,但工程量太大,而且也只能看看,顶多在日期上画个圈,没有足够空间写备注信息。后来发现其实原本的年录视图就有足够的空间了,于是我便在每个月的方框里腾出一点空间画上了日历。
这在横线本上也是可以做到的。
仔细观察这个月录,我发现,其本质是将任务和事件活动分开,右边只写任务,左边只写事件活动。左边这种日历形式,虽然不习惯,倒也直观。但有三个缺点。一是写得少了浪费空间;二是写得多了,5mm 的行距对于中文来说略显局促;三是横线本从上到下要写 31 行怎么破?
于是,为了不浪费空间,我在日历右侧增加了打卡。对于大字流的同学,可以不必拘泥于行内,空白处随便写,写好后跟对应的日期用线连起来就行。
如果是横线本的话,可以分两栏,把这个月主体的四个星期两两对齐,前后多出来的日子在上边或下边补齐。一般 A5 大小的横线本有 21 - 23 行绝对够画了。
至于日录,没有什么好改进的地方。
转移是使用 Bullet Journal 的一个很重要的过程,之所以重要,是因为它是一个回顾与总结的过程。
很多时候我们有了一个想法,如果没有把它记下,过了不久就忘了。即使写下来,往往也不会再去翻看,然后渐渐地就淡忘了。于是很多事情就变成想想说说写写而已。而转移这一过程,要求我们在新的一月开始的时候,翻看上个月的笔记,看看是否还有没变成 X、> 或 < 的 ·,即是否还有未完成的任务。如果有的话,扪心自问:这件事情是否有必要继续做下去?若要继续做,那就转移到下个月;若没必要继续做,就把这件事情连同子弹符号一起划掉。正因为有了这个过程,我们得以有机会重新审视自己,重新调整规划,使目标更加清晰明确。当然,很可能有的时候会出现某些事情延期了很多次但始终没有做;划掉的事情比完成的事情多;甚至某些事情延期了很多次但始终下不了决心划掉。我觉得这些都没关系,最重要的是要忠于自己的内心,因为我们记录的并不是结果,而是过程,是我们一路成长的见证。
通过转移这一过程重新思考,该做的继续做,没必要做的就丢掉。这也传达出一种人生哲学:不要写过就忘,坚持该坚持的,放弃没有价值的,这样才能走得更远,实现更多梦想。
]]>A Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions. —John Gruber
当我们在谈论 Markdown 的时候,我们到底在谈论什么?是 CommonMark 还是 GitHub Flavored Markdown,抑或是最初发明时的那个 Markdown?
当我第一次知道 Markdown 的时候,我的内心是欣喜的,心想这个世界除了复杂的 HTML 标签以外居然还有如此简单的标记。但当我知道它有好几种风格的时候,我的内心是拒绝的,因为我不知道应该遵循哪一种写法,不知道我写的 Markdown 是否能适用于其他场景。这种不确定性造成的纠结和担忧一度使我不想使用 Markdown,但如此简洁的设计又让人欲罢不能。现在又正式将博客换成了 Hexo,于是便义无反顾的跳入这个坑了。既然这样,那就好好考虑考虑以下几个问题。
目前最流行的要属 Github Flavored Markdown 和 CommonMark 这两种了。前者不用说,Github 官网用的就是,许多主流编辑器支持。后者则最接近原始 Markdown,虽然名字听起来像个标准,目的也是为了给混乱的 Markdown 界树立一个通用的标准,但事实上它并非标准,而且我认为,Markdown 的属性决定了它可以甚至应该不遵从一个统一的标准。
在详细了解了各种 Markdown 的区别后,我发现,基本的语法其实是一样的,罗列一下,都用到了下面这些符号:
至于有序列表项目的“1.”“2.”这些就不算进去了吧,这就是全世界通用的正常语言啊。就算把另外一种表示方法,比如一级标题的“=”、强调或加粗文本的“_”算进去,那也是十个指头就数得过来的,而且这些符号的使用方法在各种 Markdown 中也是一样的。所以你说 Markdown 简单吗?比起 HTML N 多个标记来说简单爆了!
那么各种 Markdown 的区别其实在于是否拥有更高级的功能,比如 Github Flavored Markdown 就比 CommonMark 多了表格功能,甚至更有丧心病狂者还能用 Markdown 来画流程图。如果没有特殊需求,CommonMark 当是第一选择,几乎所有的编辑器和转换器都能正确识别。如果喜欢用表格,那 Github Flavored Markdown 可能是更好的选择。
我的最终选择是 Github Flavored Markdown,但并非表格的关系。选它一是因为 Hexo 支持,二是因为它支持直接换行,也就是换行就是换行,而不是两行拼接再加空格这种对于中文来说然并卵的模式。
子曰:“工欲善其事,必先利其器。”
只怪孔子这话说得太有道理,无数人在找寻称手工具上花费了无数的时间,我也是这其中这一。过程十分艰辛。
在我看来,一个好的 Markdown 编辑器需要具备如下素质:
我觉得我的要求很简单啊,但光前两点就 pass 了一票编辑器。为什么不用在线编辑器?因为打开和保存文件麻烦。有些在线编辑器不是有桌面版吗?但它们只是网络应用的打包,不仅运行起来慢,还占内存。那还是有很多好用的编辑器啊?哦,对了,还有一个条件刚才没写,要支持 GNU/Linux 平台。这一刀下来,最终只剩下 4 个比较好的选择。
Marketo 是一个 KDE 笔记程序,用 Markdown 来记笔记,也带有一个独立的 Markdown 编辑器。编辑器直接使用 katepart,所以带有 vim 模式。部分支持 CommonMark,双面板实时预览、代码语法高亮、支持 MathJax。去年年底才发的 v0.1 版,最新的也只是 v0.2.2,尚在早期开发阶段就已经相当不错了,后续还有很多功能值得期待。KDE 用户可以毫不犹豫地收下。
唯一让我不爽的是,它的实时预览不能自动平均分割左右视图,每次都要手动调整,期待后续改进。
Remarkable 应该算 Linux 平台下可以找到的最成熟的一款 Markdown 编辑器了。支持 Github Flavored Markdown、双面板实时预览、代码语法高亮、MathJax,还能自定义 css,并导出带样式的 PDF 或 HTML,真的是相当地 remarkable。
如果你喜欢 Github Flavored Markdown,Remarkable 绝对是不二之选!
但唯一让人蛋疼的是,它的左右视图在初始窗口大小时是平均分割的,但是最大化后左侧视图的宽度却不会相应加大,不知道是有意为之还是 bug,总之这一点让我很不爽。
上述两款编辑器虽然都很不错,但它们在编辑 Hexo 文章的时候都有一个问题,就是无法正确处理正文头部的 front-matter 信息,直到我发现了 ReText。
ReText 是一个 Python 写的轻量级编辑器,采用 Python-Markdown,与最初的 Markdown 几乎一致,没什么高级功能,带实时预览。但好在它用的 Python-Markdown 支持 插件,可以扩展很多功能,像表格、代码高亮、直接换行等,你完全可以在原始 Markdown 的基础上定制出一套属于自己的风格。其中的 Meta-Data 插件可以识别正文头部的 front-matter 信息,这样在编辑 Hexo 文章的时候就不会在预览中看到文章元数据了。此外还有若干第三方扩展,不满意目前任何一种 Markdown 风格的朋友,用 ReText 定制属于自己的 Markdown 吧!
ghostwriter 与前面的都不一样,它没有左右同步预览。但它推崇一种沉浸式的书写体验,所以界面很干净,而且带有专注模式,值得一试。默认的 Sundown 后端很老了,建议装个 Pandoc 配合使用,这样在预览的时候可以选择多种风格。
用 Markdown 写了东西,就得考虑怎么把它导出成其他格式以方便日后查看,最常用的应该是导出成 HTML 文件。其实 Markdown 编辑器基本都带导出 HTML 功能,但生成 HTML 是一回事,生成漂亮的 HTML 就又是另一回事了。
刚才那几款编辑器里,只有 Remarkable 支持导出带样式的 HTML,ReText 虽然支持自定义 css,但只能在预览窗口看到效果。好在有 Pandoc 这个文档转换神器,可以将 Markdown 文件转换为各种格式,并且可以自定义样式。
既然生成 HTML 不是问题了,那就要好好找找 css 了。目前现成在网上能找到的我认为最漂亮的 css 是 这个。如果你有更好的样式推荐,请告诉我。
好了。这下有自己偏好的 Markdown 风格了,也找到称手的编辑器了,生成的 HTML 也入得了自己的法眼了,事情可以结束了。然而,后来我才明白,这并非使用 Markdown 的正确姿势。
对于 Markdown 的反思源于发现的一个十分有意思的 css。这个 css 把 HTML 文件 Markdown 化,让 HTML 看起来像是 Markdown 源文件一样。诶!这让我猛然发现,其实 Markdown 本身就有一种美感!
Markdown 不同于 HTML ,它并不是一种标记语言 (markup language),所以它才叫 Markdown 啊。本文最开始引用 Markdown 发明者 John Gruber 的那句话已经说得很明确了,一篇 Markdown 文档应该是不需要转换成任何格式而直接这样子拿给人家看就能看懂的。Markdown 在设计之初就把易读性放在与易写性同样重要的位置考虑了。所以即使你把一篇 Markdown 文档拿给一个不知道什么是 Markdown 的人看,我相信他并不会像看 HTML 源文件一样感觉自己是在看某种源代码,相反,他应该能毫无障碍地阅读和理解文档内容及其中体现的逻辑关系。试问你第一次看到 Markdown 的时候,没觉得它是如此直观,无需解释就如此清晰明了吗?
所以 Markdown 到底是什么?我觉得它更像是标点符号一样的东西,它能使文章更易阅读而又藏匿于内容之中不会分散你的注意力。
于是首当其冲,预览 Markdown 就变成了一个毫无意义的话题。既然 Markdown 如此易读,预览它干嘛呢?难道看预览,会比直接看 Markdown 更清楚吗?除了少了几个符号,多了一些字体格式对比之外,本质上,看预览相较直接看 Markdown,在易读性、内容条理性和逻辑性的感知上并没有什么明显的优势。
既然 Markdown 的哲学是要作为一种通俗易懂的符号存在,那么将它转换成其他格式就显得并无必要。虽然当初发明 Markdown 就是为了简化 HTML 的书写,但是前面说了,Markdown 文档也并不是非要转成 HTML 文件才能拿给人家看的。既然如此,就不需要考虑什么编辑器和风格了,所谓的 Markdown,就是加了一些能够使文档内容条理更清晰的符号的纯文本而已。
既然写 Markdown 的目的并不是为了转换成其他格式,于是风格便成了最不重要的东西。你甚至完全可以按照自己的意愿写出属于自己 Markdown,用你自己发明的符号去表示任何你想要表示的东西,只要你觉得你写的够直观,不用解释大家就能看懂。只有在你想要将你的 Markdown 文档转换成其他格式的时候,你才需要去考虑风格的问题,即你写的东西能否被转换器正确识别从而转换成你想要的格式。当然,如果你够牛逼,你也可以自己写一个转换器,设定好规则从而得到你想要的结果。
仔细想来,我之所以纠结于编辑器和风格,没有正确认识 Markdown 的本质是其一,还有一点是并未正确认识到 Markdown 的用途。我们写 Markdown,基本上有这么三种情况:
如果纯粹是写给自己看,比如自己作笔记,那前文已经说过,想怎么写就怎么写,只要这种格式对你有意义,对提升内容的条理性和逻辑性有帮助,你就写。如果是写给别人看,按照 Markdown 直观易懂的特点,你就这么拿给人家看也是不成问题的。当然更多的时候,我们是把 Markdown 当作某种输出格式的原始输入。比如你在 Github 上写评论或写 README,最终就是要被转换成 HTML 呈现出来的。再比如写 Hexo 博客,也是要被转换成 HTML 呈现出来的。
而迷思产生的根源就在于我们过分强调了把 Markdown 当作某种输出格式的原始输入这一功能,而忘却了 Markdown 本身就是一种可以直接呈现的最终格式。
不要把 Markdown 当作某种语言,更不要把它当成什么代码,因为它其实很简单很易读。不要去管什么语法风格,适合自己就好。Markdown 就是 Markdown,不是简化了的 HTML,也不是什么格式化指令,把它当成标点符号自然而然的运用就行了。
]]>那是一只机械闹钟,需要定期上发条才会走时。雕花一样精致的指针“si-so-si-so”十分有力地在十二个大写罗马数字间穿梭。小闹钟除了表盘玻璃外全身银白色,应该是不锈钢材质,加上内部都是机械结构,小闹钟对于儿时的我来说很重,上发条更是掰断手指都没用。可幼小的我却拥有一颗男子汉的心,偏要和它较劲,硬是强行拧下来它一只球形的小脚,哼!但是装回去,却怎么也不能像从前一样严实了。
我是看着这小闹钟认识的罗马数字,那些数字有的像建筑,有的像一个个人,还有的像沙漏,换个角度看,又是不一样的东西。儿时的我经常盯着表盘陷入想象,仿佛有种魔力,能带我回到纷乱的古罗马战场。
时间就这样“si-so-si-so”地流转,指针依旧在十二个大写罗马数字之间循环往复,而我却无法永远停留在十二岁,正如父母的婚姻也无法永远停留在十二年前一样。
家庭的变故令我产生了许多困惑,好长一段时间里经常郁郁寡欢,甚至在夜里哭泣。也是在那一段时间里,生父不知从哪儿弄了条小狗,见我欢喜,便送给我养。据说小狗喜欢听那小闹钟的声音,便将小闹钟也一并给我带回了。当时外婆与我们母子住在一起帮手,也没养过狗,都不知道带出去溜,导致小狗把便便拉在出租房的阳台,因为那里就是它的活动空间。放学回去我会去阳台看看它,但它与我不甚友善,宁愿自己待在自己的纸箱狗窝里,与小闹钟为伴。我想,也许是因为它与家人分离,所以才显得困惑而郁郁寡欢吧。没过多久,有天我放学回家,外婆告诉我狗被我生父拿回去了,也许是吃了,也许是卖了,也许本来就是别人的要还给人家,具体我也不得而知。反正,我也没有什么留恋。
那只小闹钟,也就这么从我的生活中消失了,兴许是坏了扔了,兴许是当时和小狗一起被拿回去了,我不得而知,但我想,应该是后者。
现在,我也买了一个机械闹钟,圆形的身体上有两个大铃铛,铃铛中间是一把小锤子,上好发条也是“si-so-si-so”地走,也还是那样的厚重。不同的是它是纯铜材质,暗黄的颜色更显复古。但记忆中的小闹钟是再也买不到一模一样的了。
]]>A great tool to test your email spammyness. Check and see how reliable is your email service provider!
]]>As the title indicates, this post is not about how to install Ghost on OpenShift, it’s about how to upgrade it.
Installing Ghost on OpenShift is quite easy with the quickstart script while upgrading it is not so straight forward. It really took me some time to figure out how to upgrade it in the OpenShift way.
Yes, the OpenShift way, the best practice to upgrade Ghost on OpenShift, which is the git way.
OpenShift utilize git for source code management. Upgrading Ghost means updating its source code.
To upgrade Ghost in the OpenShift way, you need to pull the source code from OpenShift server, update it with the latest Ghost source, then push it back to OpenShift server. If you are familiar with git, you may already know how to do it properly. If you’re not, here are the details.
You may want to get yourself familiar with git by reading this simple guide first.
For Linux users, simply type the following command to checkout the repository.
git clone _ssh://your-openshift-repo-url_
You can get the URL of the repository from the OpenShift application console.
If you already have the repository cloned, you can run git pull
to update your local tree.
Download the latest version of Ghost, extract the files directly to the directory of your local tree. By doing this, all existing files will be up to date and all new files will be added. For Linux users, simply type the following command.
unzip -uo ghost-latest.zip -d _path-to-your-git-repo_
We need to change the line "main": "./core/index"
to "main": "index.js"
in package.json.
This step is a must, otherwise it won’t work on OpenShift.
Run the following command to make all changes staged.
git add .
If you are not confident, you can run git add -i
to review all changes.
After all these changes we’ve made, we must commit them to the head tree by the following command.
git commit -m 'upgrade to ghost 0.4.2'
Here comes the final step, just run
git push
Upon running this command, OpenShift will take care of everything else and redeploy the application. After the command finishes, your new Ghost will be ready to go.
Although OpenShift provides ssh access by which you can make changes directly on remote server, git should always be your first consideration.
Whenever you want to make changes for your application, it is better to work in your local tree and then push back to OpenShift. That’s the work flow suggested by OpenShift.
For example if you want to install a new theme for Ghost, extract the theme files to the proper directory in your local tree, then do a git add, git commit and git push. That is the best practice.
]]>I have to say that register an ideal domain is really difficult. Especially for those which are based on common words or phrases. I spent more than a week on GoDaddy, searched hundreds of domains, encountered numerous times of taken, premium and auction results. It’s really frustrating, but it also indicates that I have a good eye for domain. ;-)
So sundialdreams.com, the final result of this epic registration process, comes out. I’m satisfied so far.
One last thing to mention, I didn’t register this domain on GoDaddy because I had problem on payment. The only payment method I can choose was credit card and it was not work for me. So I registered on Namecheap. The website of Namecheap is well designed except the dashboard page really sucks.
]]>