Pages

Monday, 30 November 2015

“太平天国”:一场腐败的乌托邦试验

“太平天国”是中国、可能也是世界历史上规模最大的一次农民造反起义,在短短几年内就席卷大江南北,定都“天京”,强烈震撼了大清王朝,几乎将其推翻。但如此浩大轰烈的运动,最终仍然失败,当然原因多多,但最根本的还是其自身迅速、严重的腐败。
内讧
从 1850 年“金田起义”起,太平军一路势如破竹,大败清军,不久就攻占武汉三镇,随后沿江挥师东下,在1853年3月攻克向有虎踞龙盘之称的南京,并在此定都,改称“天京”。
定都天京之后,虽然太平军的北伐失利,但其他军事行动却胜仗连连,尤其是 1856 年春夏,太平天国在军事上取得了一系列辉煌胜利。在江西,太平军控制了全省 52 个州府 ;在湖北,西征将士保卫武汉,打退清军一次次围攻 ; 更重要的是在天京外围,太平军先后击溃长期直接威胁天京的敌“江北”、“江南”两个大营,天京终于解围。
但就在这时,天王洪秀全和东王杨秀清的权力之争终于爆发,发展到血洗天京的地步。“天京内讧”使太平天国由盛转衰,成为它从胜利走向失败的转折点。
洪杨矛盾由来已久,与太平天国“政教合一”的体制有极大关系。洪秀全早年自视极高、抱负极大,但偏偏屡试不中,在失意、仿徨、痛苦和憎恨中在 1843 年与冯云山等创立“拜上帝会”。洪秀全从一些基督教小册子中得到启示,认为只有创造万物、主宰一切的上帝是唯一真神,其他一切人们所崇拜的对象都是“邪魔”,必须斩尽杀绝。他宣称自己是上帝的次子、天兄耶稣之弟,受上帝之命下凡“斩邪留正”。不久,他与冯云山来到偏僻的广西山区传教,信者甚众,准备发动起义。
但就在紧张准备起义之时,冯云山却在1848 年初被捕,洪秀全急忙奔走营救。拜上帝会一时群龙无首,会众发生混乱,面临分裂瓦解。这时,以烧炭为业的杨秀清急中生智,利用当地流行的代鬼传话习俗,忽然口哑耳聋,不吃不睡,假托“天父上帝”下凡附体,怒责动摇分子,要广大会众遵守天父之命跟“万国之主”洪秀全斩妖杀魔。杨秀清的“代天父传言”以天威神力稳定了众心,对维系拜上帝会组织起了重要作用。
洪秀全营救冯云山归来后,肯定了杨秀清在关键时刻挽救拜上帝会的功绩,承认他“代天父传言”的合法性,承认他受天父特差下凡的地位。这样,太平天国就出现了“一朝二主”的现象。在政治上,洪秀全是天王,是一国之主,位极人臣,称“万岁”;杨秀清是东王,位于洪下,称“九千岁”,洪、杨是君臣关系。但在宗教神权上,洪只是皇上帝次子,而杨却是皇上帝(天父)的代言人,在神权上杨秀清的地位反高于洪秀全,实际剥夺了洪秀全是上帝在人间唯一代表的资格。由于太平天国实行的是“政教合一”的体制,所以这实际上成为对洪秀全在现世权力来源(合法性)的潜在挑战。因此,这种政治上的君(洪)臣(杨)关系和宗教上的父(杨)子(洪)间的矛盾,使洪、杨关系一直十分微妙,为以后的分裂埋下伏笔。
1856 年 8 月,天京外围敌人威胁解除不久,实权在握的东王杨秀清又假托天父下凡,将天王洪秀全召到东王府,逼洪秀全封他为“万岁”,洪只得答应。
这样,潜伏已久的洪杨矛盾不能不迅速激化。面对杨的步步紧逼,洪秀全急忙密诏正在江西作战的北王韦昌辉、在丹阳作战的顶天侯秦日纲立即率部回京诛杀杨秀清。9 月 1 日深夜,韦昌辉率精兵3000赶回天京包围东王府,冲入卧室,将熟睡中的杨秀清杀死。而后血洗东王府,天京城内一片恐怖。
正在湖北战场的冀王石达开听说天京内讧急忙赶回,想要制止韦、秦滥杀。但此时韦昌辉已杀红了眼,不但不听规劝,反而要杀石达开。石达开闻讯慌忙逃出天京,结果,韦昌辉将石达开留在天京的家属满门抄斩。逃出天京后,石达开从湖北调回所部4万精兵攻入天京,斩杀韦昌辉、秦日纲。
经过天京事变,石达开成为众望所归、辅佐朝政的理想人物。但经过这场惊心动魄的事变之后,洪秀全对人更加猜忌,只重用洪氏兄弟,处处防备、排挤、打击、限制石达开。石达开忍无可忍,最后率大批精锐部队出走,6年后终在大渡河被清军围歼。天京内讧使太平天国元气大伤,而且,“天父”“天兄”自相残杀,神话开始受到质疑,信念开始破灭,太平天国的基础开始动摇,预示着以后的失败。
腐败
“龙廷”还未坐稳,“自家兄弟”就如此互相屠戮,当非偶然,而是腐败空前所致。在封建社会,反抗统治者压迫的农民战争当然是正义的,但最终却不可能建立一个超越封建专制的特殊政权。太平天国也不例外,早在 1851 年 3 月,金田起义不久,洪秀全就登基称天王,年末在永安下诏分封五王。在洪秀全旨准颁行的《幼学诗》充满“生杀由天子”,“王独操威柄”的帝王思想。定都天京后,太平天国的皇权专制、等级制度更是恶性发展。
到了后期,洪秀全不顾汹汹群情,给无功、无才、无德的洪氏族人大肆封王,引起他人强烈不满,互相攀比,纷纷要求封王。结果,后来总共封了270多“王”,形成了一个极其强大的特权阶层,大大加重了平民百姓的负担。
太平天国的封建等级之森严,也是史所罕见。早在永安建制时就明确规定“贵贱宜分上下,制度必判尊严”,君臣上下之间称呼、服饰、舆马等方面都有严格规定,违者要受到严惩。官员朝见天王时必须下跪三呼万岁,见王爵则要下跪三呼千岁。天王出行乘六十四人抬大轿,东王乘四十八人抬大轿,连基层小官两司马也乘四人抬轿。诸王出行有盛大的仪仗队,所有官民都必须回避或跪道旁高呼万岁或千岁,倘有继续步行者则斩无赦,一些高官也因此受到严惩。
自天王以下,王与各级官员的生活也非常腐化,刚刚入城一个月,敌人威胁还未解除,就开始大兴土木,建造天王府。天王府以原两江总督署为基础,向外扩展 10 里,每天征用万余民工,拆毁民房万余间。宫中金碧辉煌,重殿叠宇,象征九重天庭。金龙殿饰以黄金,绘以五彩,光彩夺目。宫中珍宝无数,在外征战的太平军将领一直源源不断将各种奇珍异宝运到天王府。天王所用王冠、浴盆、夜壶等许多器皿俱以金造。东王府也同样富丽堂皇,尤其是所藏珍宝,竟超过了天王府。直到后期,大兴土木之风一直未息,如忠王李秀成驻在苏州,一直与敌紧张作战,但忠王府之豪华也令人叹止,据说仅次于天王府。直到苏州城破前夕仍一直动工,连后来进占苏州的李鸿章都惊叹“真如神仙窟”、“平生所未见之境也”。其他各王都纷纷修造白己的王府,驻在外地诸王在天京都另建有王府,如李秀成、陈玉成都在天京建有王府。
封建帝王的后妃制度也为太平天国所继承,也是有过之而无不及。早在永安建制时,洪秀全就有 36 个“王娘”,到天京后有 8 个“王娘”,经常挑选民间秀女入宫,连 9 岁的幼主洪天贵也分了 4 个“幼娘娘”,诸王过生日都要选送美女。与高官的淫欲无度、耽于女色相反,太平天国对下层和百姓实行的却是严格的禁欲政策,家庭被解散,夫妻分住男行女行,只有经过允许,才能过“夫妻生活”,否则要受到严惩。
“军事共产主义”
与领导人的严重腐化形成鲜明对照的是,太平天国在所占地区实行的却是一种近于严酷的统治管理,其特点是把军事化组织管理模式推广到民间、社会,其社会结构是以军事组织为核心的军事、政治和社会一元化。
从中央到地方,几乎都是清一色的武职官员,在县以下的地方,其基层组织单位是“两”,每 25 家为一“两”,由“两司马”管理。两司马之上设有卒长、旅帅、师帅、军帅、监军、总制等官职,总制管一郡,相当于清朝统治时期的府。一个县约分五军,一军 13156 家,每家出一人为伍卒,组成一军,寓兵于农,“有警则首领统之为兵,杀敌捕贼 ; 无事则首领督之为农,耕田奉尚。”由于土地归公,所以农民生产出来的粮食除留口粮外,一切都要上缴,由两司马支配,甚至农民的生活也要受两司马的监督和支配。这种政策遭到农民强烈抵制,使农业生产受到严重破坏。
在所控城市,太平天国更是强令推行“军事共产主义”,最重要的一点就是解散家庭。如进入武昌后,就把居民按性别年龄分馆居住,开始以 10 人为一馆,后来以 25 人为一馆,有专人管理。定都天京后,完全废除私有制,按性别把居民分别编入男馆女馆男营女营,夫妻不得同居,居民原来的财物全部没收归“圣库”,生活必需品由圣库按定额供给。60 岁以上老人和 16 岁以下儿童入“牌尾馆”,男性青壮年则住“牌面馆”,其任务除参加战斗外还从事体力劳动,有手工业技能者进入诸营与百工衙,天茶衙、豆腐衙、酱人衙……在监管之下从事集体生产劳动,产品不经过市场交换直接入圣库分配,生产者除按定额分配的吃、穿外也别无报酬。按照“天下人人不受私,物物归上主”的原则,一切私营商业资本全被没收,个体小商贩也不例外,“铺店照常买卖,但本利皆归天王,不许百姓使用”。经商所获利润全部上缴圣库,商业实际被完全废除。女馆则不分年龄,在监管之下参加各种诸如抬砖运瓦、收割拾柴一类的劳动,善女红者则编入锦秀营。丈夫到女馆探妻只能在离门数步之外问答,而且声音必须洪亮,让大家都听见,以防说“私房话”。
这种把社会变成“大兵营”的做法完全违背常理,遭到各式各样的抵抗,生产受到破坏,物质极度匿乏,粮荒日益严重。为保证这些政策的贯彻实行,执政者只能用重典施严刑,把苛刑重罚作为治国基本手段,结果是滥施刑罚,人人自危。
太平天国的理想是“天下人人不受私,物物归上主,主有所运用”,“务使天下共享天父上主皇上帝大福,有田同耕,有衣同穿,有钱同使,无处不均匀,无处不饱暖”。要实现这种理想,只能承认要有一个至高无上、公正无私、洞察一切的“上主”来“分配”,这种公正、平等,实际却是更不公正更不平等,因为“主权者”不受任何监督制约,有权任意“运用”圣库的公共财产,这必然要走向腐败。在那种没有任何私人财产的“兵营”式社会中,个人最基本的生存用品都完全依赖权力者分配,因此没有任何自由,社会没有活力,更没有创造性,而且,军事化社会的等级更加鲜明、森严。
太平天国的理想不能说不真诚,但实践的结果却不能不与自己的理想恰相反对。按照一种人工设计的社会模式来建构社会是危险的,设计得越细,危险性越大——《天朝田亩制度》明文规定每户只能养 5 只母鸡、两头母猪。在人类历史上,如此大规模的乌托邦实验确实罕见,或许,这便是大平天国更深远的意义所在。

收购《南华早报》——阿里巴巴肩负政治使命的开始

前些日子,马云收购《南华早报》的消息一时盛传。简单翻阅,纽约时报、BBC等新闻媒体均有相关报导。当然,内地媒体亦有报导,但大都从阿里巴巴如何建立“媒体帝国”的角度入手,尺度小也是意料之中。
《南华早报》在华人报界的地位引人注意。1903年创刊至今,业内享负盛名,一度被认为是香港乃至亚洲最具公信力的报章。其东家亦曾是像梅铎、郭鹤年这般人物。近年,虽遇《英文虎报》和《亚洲华尔街日报》等对手,依然稳坐香港销量最高的英文报纸。由此可见,《南华早报》除了报导质量外,更多的,代表了报界的历史地位。
当然,早在2013年,南华早报集团净利润出现严重下跌。更重要的是,其总编王向伟上台后,一再传出“自我审查”门,公信力危在旦夕。此外,网络新闻媒体如“雨后春笋”般遍地开花,这对纸质媒体无疑带来巨大冲击,《南早》虽亦在互联网上开设网络平台,也难再回“黄金时代”。
对马云来说,这并不重要。这笔投资就如同他口袋里的“零用钱”,而换来的,是无限的潜力和媒体业的历史地位。《南早》在亚洲的影响力,正是马云所期待的,因为阿里巴巴现有的“媒体帝国”的影响力也只能覆盖中国境内,《南早》的加入,将会带来近乎里程碑的意义。此外,《南早》与Cosmopolitan、Harper’s Bazaar Magazine等国际出版物的关系,亦能为未来阿里进一步打入国际市场埋下伏笔。马云深谙舆论喉舌的重要性,买各类网媒,又投资不惜买足球俱乐部来博得民众眼球。如此说来,南华早报,只是又一个棋子而已。
但这步棋绝不简单。正如纽约时报中文网的一篇文章中说到:“任何有关香港报纸的交易都会涉及政治层面。”2012年起,《南华早报》关于中国反腐的报道,在海内外获得不少关注。2014年天安门事件25周年和香港“占中”期间,该报也刊登了多媒体专题进行回顾与报道。不得不说,这里面很多内容都涉及触碰中国政府底线。
有人说,马云收购南早,是“走钢丝”之举。指出马云在中国充当了直言不讳的批评者,在大型国有银行炮轰他的金融业务时,他指责这些银行未能跟上市场的改革步伐。可这显然忽视了一些重要的细节,如在阿里巴巴上市时,股东中“红色背景”的金融巨头大有人在,这或多或少说明了马云“言论自由”底气的来源。当然还有一种可能,他只是高层推行改革计划中的一个“托”。而马云的“言论自由”,也只能说停留在商业问题上。在政治问题上,挑战政府底线,他应当是不敢的。说到这,不得不提及马云即将收购的这家报纸曾在13年时给他带来的“尴尬”:南早披露马云对六四民运的言论,称邓小平在1989年下令镇压“六四”民运的决定,是不完美但是“最正确的决定”,一度引发舆论哗然。
看到有人提出如何维系“公信力”这一经南早百年积累的无价“财富”将是马云面临的最大挑战时,个人的态度是悲观的。未来,马云能为《南早》做到的最大限度,应当是大都保证其中立性,少数时刻干预,如郭氏家族一样。想做的更多,恐怕他和阿里地道的中国血脉也不会允许的!但亦有可能,《南早》在为马云做商业宣传的同时,亦沦为“政治喉舌”。如果这样,说不定南早能大卖,因为如果南早能符合在中国发行的“标准”,销量应该要比现在好不少。但同时,百年《南早》亦失去了其一度坚守的业界良心。
深层地看此次收购,更是别有洞天。百度、阿里巴巴和腾讯等企业在中国社会中对政府政策推动的协助作用日渐被关注:协助宣传发展计划,协助弘扬社会主义核心价值观,当然,也协助控制意识形态。政府将曾经用于国内民众的手段,用于如今中国提升国际地位,用民间的话说,就是“用钱堵住别人的嘴”。这种以“商业投资渗透新闻媒体”的模式值得警惕。而阿里为首的企业,肩负的恐怕不仅仅单纯是“经济发展”的使命,未来,他们将越来越多肩负政治使命。如此说来,收购《南华早报》,只是收购香港、乃至海外的新闻媒体的一个开始。
在如今香港日渐复杂的政治环境的下,阿里巴巴收购《南华早报》应是“有百利而无一害”的布局,而对香港未来的新闻自由来说,应是“有百害而无一利”。
-----------------
马云收购南早已到最后阶段 中共借阿里打造监控大网络

中国首富马云旗下阿里巴巴集团收购香港英文《南华早报》,有关谈判目前已到最后阶段,该收购不但是马云欲建构庞大传媒帝国的一步,也符合北京有关当局要进一步抢夺香港媒体话语权的战略构思。有消息指,中共还要利用阿里巴巴大数据库和影响力,构建一个监控社会的庞大机器。
马云收购郭鸿年的南华早报,已到最后关头 
本月初,英文中国日报曾简讯披露阿里巴巴收购《南华早报》的消息,连南早官方微博也同一天迅速转发了有关报导,尽管中国日报随后删除了报道,但马云在接受媒体采访问及时,并没有否认有关消息。
知情者告诉本社,有关的收购谈判现在已经到了最后的地步,《南华早报》被收入阿里巴巴囊中,几乎已是铁板钉钉。马云拿下南早,不仅是为满足其打造传媒帝国的需要,更符合北京当局进一步争夺香港舆论话语权的目标,因而得到北京当局的背后支持和祝福。
南华早报是香港影响力最大的英文报纸
阿里近两年的投资一直在加强对媒体的布局,从2013年入股新浪微博开始,到如今阿里系力量已投资科技媒体虎嗅、36氪以及财经媒体第一财经,华数传媒、无界新闻、封面传媒等等。
此外,阿里巴巴正在与国内互联网最大的新闻综合门户之一新浪洽谈收购事宜。有报导指,马云的新目标还包括新浪微博、光线传媒(Enlight Media)、华谊兄弟、中国商务集团(China Business Network, CBN),以及优酷、土豆网等。
有报道指,马云对南早的收购不仅止于经营权转换,整个南早的编辑团队也随之大换血。媒体已披露,与北京关系密切的南早副总编谭卫儿将从2016年1月1日起接替现任总编辑王向伟,而南早在过去半年至少有36位员工离职,出现“大逃亡”情况。
由于南早曾在2013年对马云的专访中,报导马云支持邓小平在「六四天安门事件」中镇压学生的决定,引发外界极大的争议,这使得马云收购南早之举更显得玩味。
知情者还指,北京当局还有一项重大战略,要利用阿里巴巴的数据库和影响面,构建一个庞大的信息监控网络。目前,阿里巴巴的商业大数据是全中国第一,阿里巴巴的「智慧城市」通道是淘宝、支付宝和新浪微博,市民可以通过这些App查询和办理医疗、社保、违章罚款、户政、出入境等政务服务。当局计划,要利用阿里的数据库,成为监控追踪民众的工具。北京当局极其重视阿里巴巴。
香港回归中国18年来,媒体生态已经发生巨大变化,电视台,报纸纷纷被北方来的资本然红,近年互联网崛起,又有神秘的资金到香港投资新闻网站,加上不断有香港新闻人,新闻机构被中共当局以各种罪名诱到内地判刑、打压,有舆论形容,香港媒体和新闻出版正面临前所未有的红色恐怖。
根据虎嗅报导,尽管近年来,南早因为拥有者郭鹤年、郭孔演父子将家族生意瞄准中国,在报导上为郭氏家族保驾护航,更在曾任吉林省政协委员的现任总编王向伟的主导下,亲北京倾向日益明显,但如果阿里巴巴拿下南早,更符合北京利益。
毕竟,由内地出身的中国人来经营,或许总是比出身马来西亚华裔、长居香港的郭氏家族要更令正日益收紧中国言论的北京感到放心。

非对称加密以及在Python的使用

加密技术分为两类:
  • 对称加密 如 AES
  • 非对称加密 如 RSA
现在让我们简单的看看RSA的基本概念及在Python中如何使用。

概念

A 和 B 要把他们的通信内容加密, 如果A/B使用相同的加密解密key,那这就是 对称加密
对称加密最大的问题就是A和B之间的加密/解密key必须是唯一的。
也就是如果A和C 要加密通信,同时还不想让C知道A/B之间的通信内容。那么A/C之间的加密/解密用的key就不能和A/B之间的一样。
链接一旦便多,这种机制将很难管理大量的key。
非对称加密 就是在此环境下诞生的。
非对称加密有公钥和私钥。公钥随意公开,私钥自己私密保存。
比如 A 把公钥发给B, C。 当B,C与A通信时,先把约定好的见面信号用公钥加密,A收到后,用私钥解密,当解密后的数据就是提前约定好的见面信号的话,A 就认为B,C是受信链接。
如果此时D也给A发送信息,但却没有正确的公钥。A就无法得到正确的见面信号,就不会受理D的请求。

如何使用

下面看看在Python中如何使用
使用 pycrypto 这个库。此库内置了大量的加密算法
  1. 首先用openssl生成 rsa 公钥和私钥
openssl genrsa -out mykey.pem
openssl rsa -in mykey.pem -pubout > mykey.pub
  1. 直接看python代码。后续再来修改此文章
from Crypto.PublicKey import RSA

text = "My test!"
# 公钥加密
pub_key = RSA.importKey(open('mykey.pub'))
x = pub_key.encrypt(text)

pri_key = RSA.importKey(open('mykey.pem'))
decrypted_text = pri_key.decrypt(x[0])

decrypted_text == text  # True

人民币正式纳入SDR 明年10月生效

据路透:人民币将在SDR基准货币篮子中占据权10.92%的权重;SDR的新比重将为美元占41.73%;欧元占30.93%;日元占8.33%;英镑占8.09%。
据说这次美国同意了,是因为按新规则下美元的比例上升到46%
【人民币加入SDR 离岸人民币上涨】国际货币基金组织(IMF)宣布将人民币纳入特别提款权(SDR)货币篮子,人民币的权重为10.92%,超过日元和英镑。由于人民币的加入,欧元和英镑所占权重下降较大。消息公布后,离岸人民币短线上涨。
---------
人民币正式纳入SDR,等于是人民币得到了IMF的背书,共匪将变得更加心高气傲了。

方滨兴等研究如何识别Tor的混淆插件

前北邮校长方滨兴等人在《计算机研究与发展》上发表论文《匿名通信系统不可观测性度量方法》(PDF),报告他们能通过观察Tor混淆插件的流量模式将其识别出来。为了躲避深度包检查,研究人员开发出了协议混淆工具,Tor匿名网络开发的传输层协议混淆插件包括obfsprox(obfsproxy3和obfsproxy4),meek和fte等。研究人员从Tor官网下载软件,对传输流量进行一番研究后很快发现Tor的混淆插件容易受到时间分析攻击。他们发现,meek、网桥和HTTPS的流量数据包内部时间间隔基本相同,但meek的数据包在0.5-2秒附近有一个明显的抖动,原因是meek客户端为了与云平台保持长连接而自动在空闲时发送一个心跳包,心跳包是随机在0.1秒-5秒之间选择一个值。他们还观察到了其它两个数据模式:网桥模式下数据包大小在600B附近比较集中,原因也与Tor的数据包设计有关;meek模式下,客户端到服务器的数据包大小在200B左右,服务器到客户端的数据包大小在400B左右。

Erlang IDE (IntelliJ-based)

Erlang IDE (IntelliJ-based) 


Erlang plugin

Erlang Plugin turns IntelliJ IDEA and other IntelliJ-based products (RubyMinePyCharmWebStorm, etc.) to a convenient Erlang IDE.

Pre-release builds

You can manually set up the latest plugin version from the releases page or from the intellij-erlang-builds folder.
Note for Mac OS X users: you need to download the entire zip file, not a several jars (see Apple discussion forum).

Recent changes

The latest version

  • Improved build system - incremental compilation (#657#609#513#475#428)
  • Enhanced .app files support: reference resolution and autocomplete
  • Erlang 18 compatibility: optional callbacks support (#644), eunit compatibility (#629)
  • Enhanced -behavior attribute support: autocomplete, conflicts inspection (#640)
  • Spellchecking
  • Illegal pattern/guard inspection (#620#622)
  • Code editing/indentation/formatting improvements (#593#574#594#582#589#587#582)
  • Working directory for run configurations (#572)
  • Rebar on Windows (#432#469#496)
  • Source files are no longer copied to output upon build (#608)
  • Maps syntax in Erlang Term Files (#588)
  • Various bugfixes (#632#559#605#614#612#562#603#576)

Work in progress

  • Preprocessing support

Grammar-Kit version

Download the right version of Grammar-Kit.

from  https://github.com/ignatov/intellij-erlang

Riak is a distributed, decentralized data storage system(基于erlang)

Riak is a decentralized datastore from Basho Technologies-
Riak is a distributed, decentralized data storage system.
Below, you will find the “quick start” directions for setting up and using Riak. For more information, browse the following files:
  • README: this file
  • LICENSE: the license under which Riak is released
  • doc/
    • admin.org: Riak Administration Guide
    • architecture.txt: details about the underlying design of Riak
    • basic-client.txt: slightly more detail on using Riak
    • basic-setup.txt: slightly more detail on setting up Riak
    • man/riak.1.gz: manual page for the riak(1) command
    • man/riak-admin.1.gz manual page for the riak-admin(1) command
    • raw-http-howto.txt: using the Riak HTTP interface

Where to find more

Below, you’ll find a basic introduction to starting and using Riak as a key/value store. For more information about Riak’s extended feature set, including MapReduce, Search, Secondary Indexes, various storage strategies, and more, please visit our docs at http://docs.basho.com/.

Quick Start

This section assumes that you have copy of the Riak source tree. To get started, you need to:
  1. Build Riak
  2. Start the Riak server
  3. Connect a client and store/fetch data

Building Riak

Note: the `develop` branch currently only supports Erlang R16B02.
Assuming you have a working Erlang (R14B02 or later) installation, building Riak should be as simple as:
$ cd $RIAK
$ make rel

Starting Riak

Once you have successfully built Riak, you can start the server with the following commands:
$ cd $RIAK/rel/riak
$ bin/riak start
Now, verify that the server started up cleanly and is working:
$ bin/riak-admin test
Note that the $RIAK/rel/riak directory is a complete, self-contained instance of Riak and Erlang. It is strongly suggested that you move this directory outside the source tree if you plan to run a production instance.

Connecting a client to Riak

Now that you have a functional server, let’s try storing some data in it. First, start up a erlang node using our embedded version of erlang:
$ erts-<vsn>/bin/erl -name riaktest@127.0.0.1 -setcookie riak

Eshell V5.7.4  (abort with ^G)
(riaktest@127.0.0.1)1>
Now construct the node name of Riak server and make sure we can talk to it:
(riaktest@127.0.0.1)4> RiakNode = 'riak@127.0.0.1'.

(riaktest@127.0.0.1)2> net_adm:ping(RiakNode).
pong
(riaktest@127.0.0.1)2>
We are now ready to start the Riak client:
(riaktest@127.0.0.1)2> {ok, C} = riak:client_connect(RiakNode).
{ok,{riak_client,'riak@127.0.0.1',<<4,136,81,151>>}}
Let’s create a shopping list for bread at /groceries/mine:
(riaktest@127.0.0.1)6> O0 = riak_object:new(<<"groceries">>, <<"mine">>, ["bread"]).
O0 = riak_object:new(<<"groceries">>, <<"mine">>, ["bread"]).
{r_object,<<"groceries">>,<<"mine">>,
       [{r_content,{dict,0,16,16,8,80,48,
                         {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                         {{[],[],[],[],[],[],[],[],[],[],[],[],...}}},
                   ["bread"]}],
       [],
       {dict,1,16,16,8,80,48,
             {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
             {{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
       undefined}

 (riaktest@127.0.0.1)3> C:put(O0, 1).
Now, read the list back from the Riak server and extract the value
(riaktest@127.0.0.1)4> {ok, O1} = C:get(<<"groceries">>, <<"mine">>, 1).
{ok,{r_object,<<"groceries">>,<<"mine">>,
          [{r_content,{dict,2,16,16,8,80,48,
                            {[],[],[],[],[],[],[],[],[],[],[],[],...},
                            {{[],[],[],[],[],[],
                              [["X-Riak-Last-Modified",87|...]],
                              [],[],[],...}}},
                      ["bread"]}],
          [{"20090722191020-riaktest@127.0.0.1-riakdemo@127.0.0.1-266664",
            {1,63415509105}}],
          {dict,0,16,16,8,80,48,
                {[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                {{[],[],[],[],[],[],[],[],[],[],[],...}}},
          undefined}}

 (riaktest@127.0.0.1)5> %% extract the value
 (riaktest@127.0.0.1)5> V = riak_object:get_value(O1).
 ["bread"]
Add milk to our list of groceries and write the new value to Riak:
(riaktest@127.0.0.1)6> %% add milk to the list
(riaktest@127.0.0.1)6> O2 = riak_object:update_value(O1, ["milk" | V]).
{r_object,<<"groceries">>,<<"mine">>,
     [{r_content,{dict,2,16,16,8,80,48,
                       {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                       {{[],[],[],[],[],[],
                         [["X-Riak-Last-Modified",87,101,100|...]],
                         [],[],[],[],[],...}}},
                 ["bread"]}],
     [{"20090722191020-riaktest@127.0.0.1-riakdemo@127.0.0.1-266664",
       {1,63415509105}}],
     {dict,0,16,16,8,80,48,
           {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
           {{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
     ["milk","bread"]}

(riaktest@127.0.0.1)7> %% store the new list
(riaktest@127.0.0.1)7> C:put(O2, 1).
ok
Finally, see what other keys are available in groceries bucket:
(riaktest@127.0.0.1)8> C:list_keys(<<"groceries">>).
{ok,[<<"mine">>]}

Clients for Other Languages

Client libraries are available for many languages. Rather than bundle them with the Riak server source code, we have given them each their own source repository. Currently, official Riak client language libraries include:

Server Management

Configuration

Configuration for the Riak server is stored in $RIAK/rel/riak/etc directory. There are two files:
  • vm.args This file contains the arguments that are passed to the Erlang VM in which Riak runs. The default settings in this file shouldn’t need to be changed for most environments.
  • app.config This file contains the configuration for the Erlang applications that run on the Riak server.
More information about this files is available in doc/basic-setup.txt.

Server Control

bin/riak

This script is the primary interface for starting and stopping the Riak server.
To start a daemonized (background) instance of Riak:
$ bin/riak start 
Once a server is running in the background you can attach to the Erlang console via:
$ bin/riak attach
Alternatively, if you want to run a foreground instance of Riak, start it with:
$ bin/riak console
Stopping a foreground or background instance of Riak can be done from a shell prompt via:
$ bin/riak stop 
Or if you are attached/on the Erlang console:
(riak@127.0.0.1)1> q().
You can determine if the server is running by:
$ bin/riak ping

bin/riak-admin

This script provides access to general administration of the Riak server. The below commands assume you are running a default configuration for parameters such as cookie.
To join a new Riak node to an existing cluster:
$ bin/riak start # If a local server is not already running
$ bin/riak-admin join <node in cluster>
(Note that you must have a local node already running for this to work)
To verify that the local Riak node is able to read/write data:
$ bin/riak-admin test
To backup a node or cluster run the following:
$ bin/riak-admin backup riak@X.X.X.X riak <directory/backup_file> node
$ bin/riak-admin backup riak@X.X.X.X riak <directory/backup_file> all
Restores can function in two ways, if the backup file was of a node the node will be restored and if the backup file contains the data for a cluster all nodes in the cluster will be restored.
To restore from a backup file:
$ riak-admin restore riak@X.X.X.X riak <directory/backup_file>
To view the status of a node:
$ bin/riak-admin status
If you change the IP or node name you will need to use the reip command:
$ bin/riak-admin reip <old_nodename> <new_nodename>

Contributing to Riak and Reporting Bugs

Basho encourages contributions to Riak from the community. Here’s how to get started.
  • Fork the appropriate sub-projects that are affected by your change. Fork this repository if your changes are for release generation or packaging.
  • Make your changes and run the test suite. (see below)
  • Commit your changes and push them to your fork.
  • Open pull-requests for the appropriate projects.
  • Basho engineers will review your pull-request, suggest changes, and merge it when it’s ready and/or offer feedback.
To report a bug or issue, please open a new issue against this repository.
You can read the full guidelines for bug reporting and code contributions on the Riak Docs.

Testing

To make sure your patch works, be sure to run the test suite in each modified sub-project, and dialyzer from the top-level project to detect static code errors.
To run the QuickCheck properties included in Riak sub-projects, download QuickCheck Mini: http://quviq.com/index.html NOTE: Some properties that require features in the Full version will fail.

Running unit tests

The unit tests for each subproject can be run with make or rebar like so:
make eunit
./rebar skip_deps=true eunit

Running dialyzer

Dialyzer performs static analysis of the code to discover defects, edge-cases and discrepancies between type specifications and the actual implementation.
Dialyzer requires a pre-built code analysis table called a PLT. Building a PLT is expensive and can take up to 30 minutes on some machines. Once built, you generally want to avoid clearing or rebuilding the PLT unless you have had significant changes in your build (a new version of Erlang, for example).

Build the PLT

Run the command below to build the PLT.
make build_plt

Check the PLT

If you have built the PLT before, check it before you run Dialyzer again. This will take much less time than building the PLT from scratch.
make check_plt

Run Dialyzer

make dialyzer
from https://github.com/basho/riak