[真心转载]你和你的工作

3年前刚毕业投入工作,什么都是朦朦懂懂的,在酷壳看了这篇文章,以为是职场上的武功秘笈,就收藏在博客里。
三年了,并没有练就成绝世神功不说,连个江湖小混混都算不上。慢慢地又沦回到一个观点,如果30岁还没出息,就leave这个行业吧。

最近都在思考一个人生走向的问题。 借此文赠于那些正在工作的有美好理想的人。

===============================================

源文:http://youtheuser.com/2010/10/04/you-and-your-job/ ,有人说下面的这个文章太过Crazy,有人说下面的这个文章是猎头的软文,你换工作换得越多,他们才能越挣钱。我的观点的,先别否定他的观点,试着去理解一下为什么他要这么说,你会发现还有一些道理的。然后,想一想,自己需要的是什么?一份工作?还是一份经历?还是不断的自我挑战?相信你会有知道该怎么去做的。当然,“离职”是最后一步棋,在此前,我更希望你能尝试地在你现在工作环境下去改变去影响。

“The role of a manager should be to ensure that those that work for him/her eventually leave and go onto bigger and better things” — Mark Plant

如果你对你的工作不高兴——离开,如果每天早上你对你的工作没有激情——无论你在干什么你都要停下来。 因为这就是我们赖以生存的东西。

1. 如果你的工作没有挑战性 – leave.

2. 如果你在混你的工作 – leave.

3. 如果你觉得现在不辛苦而又感到压力大 – leave.

4. 如果你完全知道你现在正在做的所有一切的事 – leave.

5. 如果你没有得到足够多的失败– leave 并到找一个地方可以让你获得成功前的失败。而当你发现你天天都在成功 – leave again.

6. 如果你觉得你很成功 – leave 然后去找某个事或某个地方你不会那么成功,而当你又觉得你又很成功了 – leave again.

7. 如果所有的人都喜欢你并喜欢和你一起工作 – leave 然后去某个地方,那里的人并不喜欢你(然后你让他们喜欢你)。

8. 如果你的工作就像是赢奖品一样,并且你总是能赢 – leave 然后找个地儿,那里的人总是赢不了什么。帮他们扭转局面。

9. 如果你认为你知道产品的所有的内在的东西 – leave 然后找一个你不知道的产品。

10. 如果你认为你明白你所有影响力的价值所在,并觉得你已挑战过所有你可以找到的方面 – leave 然后找个地儿,在那里有不同的甚至你不了解的能影响你的人或事。

11. 如果你的经理不能影响你最终去成就更大更好的事情 – leave.

12. 如果有人妨碍你的进步(无论是内部的还是外部的) – leave.

13. 如果有人正试图让你呆在你的工作里不要改变 – leave.

14. 如果你的经理正试图让你留下,但他并不是一个好的经理 – leave.

15. 如果日子过得很顺,并且那里有太多的时候可以闲扯(或是你身边都是有太多时间闲扯的人)– leave.

16. 如果你没有和哪些和你一样在团队工作和协作方面投入相应的思考和精力的人一起工作 – leave 并去寻找这些人

17. 如果那里有这样一种文化——靠加钱来说服别人留下 – leave. (译注:这样的Culture必然造就不公平)

18. 如果那里有一种商业文化阻止人不能为竞争对手工作 – leave.(译注:《保密协议》里应该限制的是内容,而不是人身自由)

19. 如果你工作的那个地方有一个商业文化试图让竞争对手失败 – leave. (译注:人个理解竞争不是让对手失败,而是比对手做得更好)

20. 如果那里没有一种文化(或是一种理解),其可以帮助优秀的人和那些工作不是太好的人去创造好的工作关系,并让他们可以很好的工作在一起 – leave.

21. 如果那里的文化并不理解,良好工作关系间的紧密程度能够造就更好的产出 – leave.

Posted in 生存 生活 | Leave a comment

在Ubuntu OS中格式化、挂载exFAT硬盘/U盘

为什么要用exFAT?见过变态地同时使用Linux MACOS和Windows的程序员么?很悲剧的,三大系统的主打文件格式都不一样。ext3 hfs ntfs fat32啥的,这么多文件格式要找一个三个系统都能读能写的真不容易啊。总观万能的linux能支持文件格式最多,挑到exFAT既被mac os(10.6.5+)又被windows(win7+)原生支持,支持体积超过4G的文件。好东西,但由于版权问题,没有有原生exFAT的支持。于是有本篇折腾文。

本教程的主要内容是在Ubuntu中启用exFAT文件格式的支持,适用版本10.04 – 12.04(13.04未测,应该跟12.04一样)
安装 exfat-utils fuse-exfat


sudo add-apt-repository ppa:relan/exfat
sudo apt-get update
sudo apt-get install exfat-utils fuse-exfat

================================ 开始:11.10及以下的版本需要操作,12.04不用 =================================
这些操作将启用自动挂载,12.04内置了
安装 ncurses和util-linux-ng

sudo apt-get -y install ncurses-dev
wget http://mirror.gbxs.net/pub/linux/utils/util-linux-ng/v2.18/util-linux-ng-2.18.tar.bz2
tar xf util-linux-ng-2.18.tar.bz2
cd util-linux-ng-2.18
./configure
make

然后32bit和64bit系统的要分开做

32bit
sudo mv /lib/libblkid.so.1.1.0 /lib/libblkid.so.1.1.0.backup
sudo cp shlibs/blkid/src/.libs/libblkid.so.1.1.0 /lib/
sudo chmod 644 /lib/libblkid.so.1.1.0
sudo rm /lib/libblkid.so.1
sudo ln -s /lib/libblkid.so.1.1.0 /lib/libblkid.so.1

64bit

sudo mv /lib64/libblkid.so.1.1.0 /lib64/libblkid.so.1.1.0.backup
sudo cp shlibs/blkid/src/.libs/libblkid.so.1.1.0 /lib64/
sudo chmod 644 /lib/libblkid.so.1.1.0
sudo rm /lib/libblkid.so.1
sudo ln -s /lib/libblkid.so.1.1.0 /lib/libblkid.so.1

================================ 结束:11.10及以下的版本需要操作,12.04不用 =================================

然后挂载或卸载你的硬盘/U盘,然后就会看到你的exFAT分区盘了

格式化成exFAT分区?
sudo mkfs.exfat -n LABEL(盘标) /dev/sdXn(设备号)
或者
sudo mkexfatfs -n LABEL(盘标) /dev/sdXn(设备号)

更改盘标?
sudo exfatlabel /dev/sdXn(设备号) NEW_LABEL(新盘标)

获取磁盘信息?
sudo dumpexfat /dev/sdXn

检查分区?
sudo fsck.exfat /dev/sdXn
或者
sudo exfatfsck /dev/sdXn

PS:
Ubuntu自带Disk Utility,但由于版权问题,没有有原生exFAT的支持。

Posted in 互联网世界 | Tagged , , , , | Leave a comment

记一淘宝骗子行骗手段

淘宝的孩子小心,尤其是跳蚤街的。淘宝的卖家太多,所以逛淘宝的孩子挺可怜,要会挑会看还要会防骗。

今天逛着发现了骗子,就想知道他们怎么骗人的,于是交流起来,拍下,然后观察,当然不会傻到真的付款。于是真相出来了!

1、卖家挂卖的物品一般卖相好,条件不错,价格也合理,或者低于合理价一点点,不至于太假。然后关键步骤是写上邮费,邮费比较坑:30-50(或者也有合理的20的我还没发现)。

2、询问细节,卖家不耐烦,跟我说他很忙,诚心要就拍下,爽快的话给包邮。但从他的回复速度来看,一点都不忙。我跟他要了个机器系列号,不耐烦也给了,是个我期望的系列号。上面那句“爽快的话给包邮”就是个坑,相信很多人都会栽了。

3、OK,拉下来,我就拍下了。跟着坑着走!
——咦,你不是给包邮么?
——对呀,你还没收到改进提示么?
——么有呀!
—— 进支付宝,最近交易记录看看!
至此,骗子的任务就完成了,能不能到手就看看买家脑子有没有坑了。
支付宝里发生什么事情呢?支付宝会有两条几乎一模一样的记录,最新一条是不含邮费的(付款1),次新一条是含邮费的(付款2)。 若你按付款1进去付款,而且没认真看的话就上当了。

4、怎么回事呢?揭密了!
卖家让你拍下的时候(此时生成“付款2”),已经得到你的支付宝账号了,在包邮这个幌子下,用支付宝向你的支付宝账号发起同一个标题内容的“我要收款”(此时生成“付款1”),诱使买家进行付款!这两个付款是天差地别的,付款1是直达对方账号的,而付款2是支付宝担保的。付款的后果大家一下就明白了.

5、总结一下
骗子就爱钻空子, 人都说网络骗子多,现实难道就不多吗?(这句的原版是:有人说网络太假了,我笑了,难道现实很真吗?)一是,无论在网络还是在现实,擦亮自己的双眼、提高自己的常识才是防骗持之有效的办法。二是,希望有一个方便的地方曝光这类信息,让许多不明就理的人能迅速擦亮双眼。其实我有想向淘宝举报的,但是举报无门,才有此文。

PS:好文都有PS。
该文的PS就是跟我聊天的骗子的信息啦,他地址是写广州荔城的。然后有点意思的是,这名字跟我一个高中同学是一样的,好吧,我都真名过去,他都不认识我,那就不是我那同学啦。哈哈。
昵称:wendy961018 真实姓名:林秀琼 邮件:liangyi535@163.com  支 付 宝:nbayoch9384@163.com

Posted in 随笔 | 2 Comments

Objective-C SQLite数据库封装FMDB的介绍

FMDB

这是个Sqlite(http://sqlite.org/)的Objective-C封装库。

FMDB的邮件列表:

http://groups.google.com/group/fmdb (大多时候,国内无法访问该地址) 

关于SQLite的问题列表:

http://www.sqlite.org/faq.html

由于FMDB是建立在SQLite的之上的,所以你至少也该把这篇文章从头到尾读一遍。与此同时,把SQLite的文档页 http://www.sqlite.org/docs.html 加到你的书签中。

自动引用计数(APC)还是手动内存管理呢?

两种都行,FMDB会在编译的时候知道你是用的哪一种,然后进行相应处理。

使用方法

FMDB有三个主要的类

  1. FMDatabase – 表示一个单独的SQLite数据库。 用来执行SQLite的命令。
  2. FMResultSet – 表示FMDatabase执行查询后结果集
  3. FMDatabaseQueue – 如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全的。

数据库创建

创建FMDatabase对象时参数为SQLite数据库文件路径。该路径可以是以下三种之一:
文件路径。该文件路径无需真实存,如果不存在会自动创建。
空字符串(@”")。表示会在临时目录创建一个空的数据库,当FMDatabase 链接关闭时,文件也被删除。
NULL. 将创建一个内在数据库。同样的,当FMDatabase连接关闭时,数据会被销毁。
(如需对临时数据库或内在数据库进行一步了解,请继续阅读:http://www.sqlite.org/inmemorydb.html)

FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];

打开数据库

在和数据库交互 之前,数据库必须是打开的。如果资源或权限不足无法打开或创建数据库,都会导致打开失败。

if (![db open]) { 
    [db release];
    return; 
} 

执行更新

一切不是SELECT命令的命令都视为更新。这包括  CREATE, UPDATE, INSERT,ALTER, COMMIT, BEGIN, DETACH, DELETE, DROP, END, EXPLAIN, VACUUM, and REPLACE  (等)。简单来说,只要不是以SELECT开头的命令都是UPDATE命令。

执行更新返回一个BOOL值。YES表示执行成功,否则表示有那些错误 。你可以调用 -lastErrorMessage 和 -lastErrorCode方法来得到更多信息。

执行查询

SELECT命令就是查询,执行查询的方法是以 -excuteQuery开头的。
执行查询时,如果成功返回FMResultSet对象, 错误返回nil. 与执行更新相当,支持使用 NSError**参数。同时,你也可以使用 -lastErrorCode和-lastErrorMessage获知错误信息。
为了遍历查询结果,你可以使用while循环。你还需要知道怎么跳到下一个记录。使用FMDB,很简单实现,就像这样:

    FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"];
    while ([s next]) {
        //retrieve values for each record
    }

你必须一直调用   -[FMResultSet next]   在你访问查询返回值之前,甚至你只想要一个记录:

FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"];
if ([s next]) { 
     int totalCount = [s intForColumnIndex:0];
}

FMResultSet  提供了很多方法来获得所需的格式的值:

  • intForColumn:
  • longForColumn:
  • longLongIntForColumn:
  • boolForColumn:
  • doubleForColumn:
  • stringForColumn:
  • dataForColumn:
  • dataNoCopyForColumn:
  • UTF8StringForColumnIndex:
  • objectForColumn:

这些方法也都包括 {type}ForColumnIndex 的这样子的方法,参数是查询结果集的列的索引位置。

你无需调用  [FMResultSet close]来关闭结果集, 当新的结果集产生,或者其数据库关闭时,会自动关闭。

关闭数据库

当使用完数据库,你应该 -close 来关闭数据库连接来释放SQLite使用的资源。

[db close];

事务

FMDatabase是支持事务的。

数据净化(数据格式化)

使用FMDB,插入数据前,你不要花时间审查你的数据。你可以使用标准的SQLite数据绑定语法。

INSERT INTO myTable VALUES (?, ?, ?)

SQLite会识别 “?” 为一个输入的点位符, 这样的执行会接受一个可变参数(或者表示为其他参数,如NSArray, NSDictionary,或va_list等),会正确为您转义。
你也可以选择使用命名参数语法。

INSERT INTO myTable VALUES (:id, :name, :value)

参数名必须以冒名开头。SQLite本身支持其他字符,当Dictionary key的内部实现是冒号开头。注意你的NSDictionary key不要包含冒号。

NSDictionary *argsDict = [NSDictionary dictionaryWithObjectsAndKeys:@"My Name", @"name", nil]; 
[db executeUpdate:@"INSERT INTO myTable (name) VALUES (:name)" withParameterDictionary:argsDict];

而且,代码不能这么写(为什么?想想吧。)

[db executeUpdate:[NSString stringWithFormat:@"INSERT INTO myTable VALUES (%@)", @"this has " lots of ' bizarre " quotes '"]];

你应该:

[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has " lots of ' bizarre " quotes '"];

提供给 -executeUpdate: 方法的参数都必须是对象。就像以下的代码就无法工作,且会产生崩溃。

[db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42];

正确有做法是把数字打包成 NSNumber对象

[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]];

或者,你可以使用  -execute*WithFormat: ,这是NSString风格的参数

[db executeUpdateWithFormat:@"INSERT INTO myTable VALUES (%d)", 42];

-execute*WithFormat:  的方法的内部实现会帮你封装数据, 以下这些修饰符都可以使用: %@, %c, %s, %d, %D, %i, %u, %U, %hi, %hu, %qi, %qu, %f, %g, %ld, %lu, %lld, and %llu.  除此之外的修饰符可能导致无法预知的结果。 一些情况下,你需要在SQL语句中使用 % 字符,你应该使用 %%。

使用FMDatabaseQueue 及线程安全

在多个线程中同时使用一个FMDatabase实例是不明智的。现在你可以为每个线程创建一个FMDatabase对象。 不要让多个线程分享同一个实例,它无法在多个线程中同时使用。 若此,坏事会经常发生,程序会时不时崩溃,或者报告异常,或者陨石会从天空中掉下来砸到你Mac Pro.  总之很崩溃。
所以,不要初始化FMDatabase对象,然后在多个线程中使用。
请使用 FMDatabaseQueue,它是你的朋友而且会帮助你。以下是使用方法:
首先创建队列。
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
这样使用。

[queue inDatabase:^(FMDatabase *db) { 
          [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; 
          [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; 
          [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
          FMResultSet *rs = [db executeQuery:@"select * from foo"]; 
         while([rs next]) {
            … 
         } 
}];

像这样,轻松地把简单任务包装到事务里:

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) { 
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; 
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; 
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]]; 
        if (whoopsSomethingWrongHappened) { 
                *rollback = YES; return; 
        }
        // etc… 
        [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]]; 
}];

FMDatabaseQueue  后台会建立系列化的GCD队列,并执行你传给GCD队列的块。这意味着 你从多线程同时调用调用方法,GDC也会按它接收的块的顺序来执行。谁也不会吵到谁的脚 ,每个人都幸福。

Posted in 代码 人生 | Tagged , , , , , | Leave a comment

VIM替换命令

命令语法解说

VIM的替换语法为 :[addr]s/源字符串/目的字符串/[option]

[addr] 表示检索范围,省略时表示当前行。
如:“1,20” :表示从第1行到20行;
“%” :表示整个文件,同“1,$”
“1,.”:表示文件头到当前行
“. ,$” :从当前行到文件尾;
s : 表示替换操作
所以VIM的全局替换命令为  :%s/源字符串/目的字符串/g 也可写成 :g/源字符串/目的字符串/g

[option] : 表示操作类型
如:g 表示全局替换; 
c 表示进行确认
p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
省略option时仅对每行第一个匹配串进行替换;
如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义

正则支持

VIM的替换是支持正则的,正则表达式不懂的自己问强大google,小弟汉化支持了一个正则学习及测试工具 需者自点
这里要强调说明两点是:
1、用于正则的分组的括号需要转义,而正常括号无需转义
2、搜索结果分级的编号不是 $N,而是\N
这只是基本,例子中会有些高阶用法,如替换时改变首字母大小写等,本文只作入门,高级使用有机会再讨论。

强劲例子

#将That or this 换成 This or that
:%s/\(That\) or \(this\)/\u\2 or \l\1/
—- 
#将句尾的child换成children
:%s/child\([ ,.;!:?]\)/children\1/g
—-
#将mgi/r/abox换成mgi/r/asquare
:g/mg\([ira]\)box/s//mg//my\1square/g    <=>  :g/mg[ira]box/s/box/square/g
—-
#将多个空格换成一个空格
:%s/  */ /g
—-
#使用空格替换句号或者冒号后面的一个或者多个空格
:%s/\([:.]\)  */\1 /g

#删除所有空行
:g/^$/d

#删除所有的空白行和空行
:g/^[  ][  ]*$/d

#在每行的开始插入两个空白
:%s/^/>  /

#在接下来的6行末尾加入.
:.,5/$/./

#颠倒文件的行序
:g/.*/m0O  <=> :g/^/m0O

#寻找不是数字的开始行,并将其移到文件尾部
:g!/^[0-9]/m$ <=> g/^[^0-9]/m$

#将文件的第12到17行内容复制10词放到当前文件的尾部
:1,10g/^/12,17t$
~~~~重复次数的作用

#将chapter开始行下面的第二行的内容写道begin文件中
:g/^chapter/.+2w>>begin
:/^part2/,/^part3/g/^chapter/.+2w>>begin
:/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$
Posted in 生存 生活 | Tagged , | Leave a comment

SAE AppConfig的重定向和Url重写

SAE(Sina AppEngine)是基于Apache的,据官方说法为了安全采用AppConfig代替.htaccess文件的工作。

来看此文的孩子想必都知htaccess的功能,一般会用到的有重定向、URL重写、指定错误页面、访问限制等。 
最近把 返璞 网站托管到SAE,速度不见得更快,似乎比国外及之前在汕头的Windows服务器稳定了很多。 
AppConfig的设置文件为根目录的config.yaml,在SAE的AppConfig后台所有修改操作都是修改该文件。使用也很简单,这里是 AppConfig 语法参考 
根据自己的需求,我一共设置以下三条。错误页面等Wordpress已经处理好了。

name: foundpure
version: 1
handle:

- rewrite: if( in_header["Host"] !~ "foundpure.com" && path ~ "(.*)" ) goto "http://foundpure.com$1?%{QUERY_STRING}"

- rewrite: if( path ~ "(.*)archives(.*)" ) goto "http://foundpure.com$1post$2?%{QUERY_STRING}"

- rewrite: if (!is_file() && !is_dir() && path ~ "^/(.*)") goto "index.php/$1?%{QUERY_STRING}"

接下来,我解释一下三条rewrite的意思吧。

第一个rewrite,为了SEO的统一,我把所有非foundpure.com的流量都指到foundpure.com,包括sinaapp的二级域名foundpure.sinaapp.com。
第二个rewrite,  某天我手贱吧文章的永久域名archieves/{postId}改成了post/{postId}导致原先被搜索引擎收录的记录都变成了404.所以又做了个指向
第三个rewrite最常见,url优化,去掉了index.php.
OK,至此大家看到我都是同一个语句
- rewrite condition goto ....
是的,那重定向和url rewritetc怎么区分?
AppConfig比较隐晦,文档也不清楚,摸索出来的。
如果goto带协议和域名如(http://foundpure.com) 就是重定向,所谓重定向就是浏览器的地址会变。
否则就是url rewrite,浏览器显示的地址不变,但已经内容是新地址的内容。
通俗易懂,明白了么?
(完)
Posted in 互联网世界 | Tagged , , , , | Leave a comment

Mysql与Sqlite重置 设置AUTO_INCREMENT

对于Auto_Increment
Mysql重置Auto_Increment初始值的方法很简单:
alter table your_table_name AUTO_INCREMENT
而Sqlite不在存在表里的,所以复杂一点,但也很简单
它主要存在库里的自动表sqlite_sequence
所以复位/重置只要删除相应记录就好!
方法1:
delete from sqlite_sequence where name = 'your_table_name'
要设定设置的话就是修改表记录
update sqlite_sequence set seq = [起始记录值] where name = 'your_table_name' ;
顺便提一下,Mysql和Sqlite记录auto_increment的方式有点点不一样,Mysql存的是将要新增记录的自増值,而sqlite存的是最后一条新增记录的自增值,所以Mysql的Auto_Increment是1,而SQLITE是0。但自増都是从1开始。
Posted in 代码 人生 | Tagged , , , , , , | Leave a comment

ubuntu 12.04 安装 linuxqq

新安装了ubuntu环境12.04,下载了linuxqq,当前只有v1.0.2-beta(http://im.qq.com/qq/linux/),2009-1-4日,真久远啊!
安装时出现错误
dpkg: error processing /home/amin//linuxqq_v1.0.2-beta1_i386.deb (–install):

 parsing file ‘/var/lib/dpkg/tmp.ci/control’ near line 7 package ‘linuxqq’:

 error in Version string ‘v1.0.2-beta1′: version number does not start with digit

就想一个字符串出现,改一下应该就可以了吧。于是乎,真解决了。
在控制台下:
$ cd 到已经下载的

linuxqq_v1.0.2-beta1_i386.deb目录

$ mkdir linux //创建目录
$ dpkg-deb -e ./linuxqq_v1.0.2-beta1_i386.deb ./linux/DEBIAN    //解压控制文件
$ dpkg-deb -x ./linuxqq_v1.0.2-beta1_i386.deb ./linux           //解压程序文件
$ vi ./linux/DEBIAN/control                                //修改控制信息
/*
 将第7行改为:
Version: 1.0.2
*/
$ dpkg-deb -b 

linux linuxqq_v1.0.2-beta1_i386-new.deb                //重新打包


$ dpkg -i 

linuxqq_v1.0.2-beta1_i386-new.deb

Posted in 互联网世界 | Tagged , , , , | 2 Comments

Emacs-Wiki-Mode (Muse)快捷键

Emacs是个很好用很万能的编辑器,先入为主这个编辑器,导致VIM死活不习惯。

Emacs-Wiki是该编辑器的一个插件,语法也是Makedown,跟Wiki类似,可以发布成html或pdf等,用来组织笔记、写文档都挺方便的。

用Emacs又有兴趣的可以试试,以下是整理后的快捷键。
  • C-c C-a (`muse-index’)   显示所有已知 Muse 页面的索引。 
  • C-c C-b (`muse-find-backlinks’)  找出所有引用了当前页的页面。 
  • C-c C-c (`muse-follow-name-at-point’)  访问当前位置处的链接。 
  • C-c C-e (`muse-edit-link-at-point’)  编辑当前位置处的链接。 
  • C-c C-f (`muse-project-find-file’)  打开另一个 Muse 页面。提示输入文件名。 
  • C-c C-i (`muse-insert-tag’)  交互地插入一个标签。 
  • C-c C-l (`font-lock-mode’) 对当前 buffer 触发 font lock / highlighting(语法高亮)。 
  • C-c C-p (`muse-project-publish’) 发布所有更改了的 Muse 页面。 
  • C-c C-s (`muse-search’) 在当前项目的所有文件中查找文本。 
  • C-c C-t (`muse-project-publish-this-file’)  发布当前访问的文件。如果当前文件可以被使用不止一种风格发布,提示输入风格。 
  • C-c C-T (`muse-publish-this-file’) 发布当前访问的文件。提示风格和输出目录。 
  • C-c C-v (`muse-browse-result’) 显示当前页面的发布结果。 
  • C-c = (`muse-what-changed’) 将当前页面与最近备份版本比较。 
  • C-c TAB l (`muse-insert-relative-link-to-file’) 交互地插入一个链接到一个文件中。 
  • C-c TAB t (`muse-insert-tag’)  交互地插入一个标签。 
  • C-c TAB u (`muse-insert-url’) 交互地插入一个 URL。 
  • TAB 移动光标到下一个 Wiki 链接。
  • S-TAB  移动光标到上一个 Wiki 链接。  
  • M-TAB  补齐当前位置来自当前项目的一个页面的名字。 
  • M-RET 在当前位置插入一个新的列表项,同时正确缩进。 
  • C-<  减少当前位置列表项的缩进。 
  • C-> 增加当前位置列表项的缩进。
Posted in 代码 人生 | Tagged , , | Leave a comment

试用JustWriteBlog(嘉写)

试用 JustWriteBlog 

话说这个chrome extension是为了让人很方便地在浏览器上写文章,不受其他干扰的。
从工具栏上看,文字编排上应该不成问题,而且可以带图,只能支持在线图,本地图得先到后台上传了。
这个编辑器好熟悉,有点像KindEditor,特意不认真地看了下源码,是jquery.cleditor.js哈。(没了解过,飘过)

自带撤消和重做的功能。如果这个工具栏菜单上的功能不能满足你的编辑条件,那至少还有一个直接源码编辑。
待会小试一下发布功能。

发布的博客,是直接支持xmlrpc的,所以wordpress不在话下。
其他的博客器,如果支持xmlrpc应该也没问题。

发布前说一下缺点。
1、文章设置时,习惯Tab 到下一个控件,竟然要我点击OK吧。
2、标签没得选择
3、按钮的图标很不直观,要思考并实验才知道是什么东西
4、不支持表格,要自己coding
5、不能获取自己的草稿继续写。

点击发布。
发布失败,提示一串English,胡弄了半天,再点击就可成功了。
Posted in 互联网世界 | Tagged , , | Leave a comment