初中物理 振荡的电场和磁场在空间中以波的形式传播就形成了电磁波,gamma射线、X光、紫外光、可见光、红外光、微波、无线电波和长波无线电,这些都是电磁波。电磁波具有波粒二象性,光子就是量子化的电磁波,是电磁波能量的最小单位。光子的能量和电磁波的波长成反比,比如说,波长最短的gamma射线光子能量高达百万甚至数亿电子伏,医疗和安检用的x光光子能量一般在数百到上万电子伏,紫外光的能量一般在数个到数十电子伏,可见光的能量在1.8(700纳米的红色光)到3.1电子伏(400纳米的蓝色光)之间,红外、微波和无线电波的光子能量就小的多。在电磁波和物质相互作用时,物质只能吸收或者放出整个的光子。
线上jvm进程CPU Load高排查脚本-jkiller
jkiller 如果遇到线上java进程占用过多的cpu,可以用这个脚本来帮助你快速找到代码的问题。
https://github.com/54chen/jkiller
使用过程
先用top或者是jps定位占用cpu过多的java进程的pid是多少。
然后执行如下过程即可得到结论:
#wget https://raw.github.com/54chen/jkiller/master/jkiller.sh && chmod +x jkiller.sh
#sh jkiller.sh [pid]
*centos系统下测试通过。
Arduino学习手记四:串行编程
前面几节介绍了一些常见的传感器使用办法,许多人一定会有一种困惑,如果要做一个arduino发微博的例子得怎么做?
本节不是教发微博的。
通过在pc上运行的程序去访问互联网,然后把数据通过usb返给arduino的做法,就是利用了串口的编程办法。
在第一节里(http://www.54chen.com/_linux_/arduino-starter-1.html),我们说到了arduino使用的主要语言是processing。
以下例子均在mac下试验通过,ubuntu应该差不多,windows不知道应该怎么搞。
Processing
这是一门目标群体类似设计师的编程语言,非常的极简,语法类似java,java开发者基本不用学习。其IDE:PDE也是极简到了极致。
PDE(processing IDE)的极简程度令人发指,用习惯了eclipse的同学上来就找的第一个功能就是自动完成,遗憾的是,人家的定义是给设计师们用的,看来工程师们还是回到eclipse的世界去吧。PDE is admirably simple。
十分想用代码自动完成功能的同学,可以试试在eclipse里完成代码: http://t.cn/zH3b2KP
其下载和安装都非常简单:http://processing.org/download/下载之后直接使用即可。以mac为例,长得和arduino的IDE基本上一样(应该是说arduino的和它长得基本上一样)。
开始互动之旅
打开PDE,代码如下:
import processing.serial.*;
String cs;
String buffer = "";
Serial port;
void setup() {
println(Serial.list());
String arduinoPort = Serial.list()[5];//如果你运行代码后arduino里没反应,需要来调整这个端口号,据机器不同而不同,看上一行代码打印出来的序号哪一个是arduino就写几。
port = new Serial(this, arduinoPort, 9600); //link to arduino
cs = "#hello";
}
void draw() {
port.write(cs); //send to arduino
}
运行代码,会有提示:
To use the serial library, first open
Applications -> Utilities -> Terminal.app
and enter the following:
sudo mkdir -p /var/lock
sudo chmod 777 /var/lock
打开终端,对var/lock权限修改。
再运行,就可以打开一个框框,啥也做不了。
arduino上的代码
#define LED 11
byte inByte = 0;
int pointer = 0;
char buffer[6];
void setup(){
pinMode(LED,OUTPUT);
Serial.begin(9600); // open port to 9600
}
void loop(){
if(Serial.available() > 0){
inByte = Serial.read();
if(inByte == '#'){
while(pointer < 5){
buffer[pointer] = Serial.read();
}
}
digitalWrite(LED,HIGH);
}
}
连线:
在数字11连一220欧电阻加一LED灯。
效果:
启动arduino时,灯不亮,再运行电脑上的代码之后,灯亮了。
通过arduino通知电脑
在arduino中使用Serial.write,在电脑上用port.read()。
Arduino学习手记三:八位数码管
上图是八位数码管里各二极管和引脚的关系。
一共两个正极(接+5v),剩下的8个脚,哪个是低电平时管就亮,于是就可以凑出来数字。这个小数点可以用来区分正反。
数字0数字1引脚对程序upload的影响 如果你将数码管接到了数字0和数字1上,那很遗憾,每次upload的时候,你都要拔下来才行。因为数据交互借用了这两个脚做事情。
如果你的IDE出现avrdude: stk500_recv(): programmer is not responding的提示的时候,注意看看你的数字0和数字1是不是插着东西。
八位数码管的连线
数字:
a-12
b-13
c-2
d-3
e-4
f-5
g-6
DP-7
剩下的两个正极同时接到+5v上。
这里a和b故意让开0和1,方便开发过程,不需要拔来拔去的。
显示的代码
void num9()
{ digitalWrite(pin0,LOW); //显示9
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
}
以上是一个数字9的显示。
完整的代码
以下是在第二节里的代码和连线基础上的加强版本 http://www.54chen.com/_linux_/arduino-starter-2-led.html。
代码完成了在摇控器上按数字几,在八位管上显示数字几。
连线需要先按照第二节中的连线之后,再加上本节的连线。
效果图:
#include
#define LED 11
#define BIZZER 10
#define IR_IN 8 //红外接收
IRrecv irrecv(IR_IN); // 定义IRrecv 对象来接收红外线信号
decode_results results; //解码结果放在decode_results构造的对象results里
int pin0=12; //设置蜂鸣器数字接口
int pin1=13;
int pin2=2;
int pin3=3;
int pin4=4;
int pin5=5;
int pin6=6;
int pin7=7;
void setup()
{
pinMode(BIZZER,OUTPUT);
pinMode(LED,OUTPUT);
pinMode(pin0,OUTPUT);
pinMode(pin1,OUTPUT);
pinMode(pin2,OUTPUT);
pinMode(pin3,OUTPUT);
pinMode(pin4,OUTPUT);
pinMode(pin5,OUTPUT);
pinMode(pin6,OUTPUT);
pinMode(pin7,OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
numd();
}
void loop()
{
if (irrecv.decode(&results))
{
switch(results.value)
{
case 0xFD00FF:
numd();
break;
case 0xFD30CF:
num0();
break;
case 0xFD08F7:
num1();
break;
case 0xFD8877:
num2();
break;
case 0xFD48B7:
num3();
break;
case 0xFD28D7:
num4();
break;
case 0xFDA857:
num5();
break;
case 0xFD6897:
num6();
break;
case 0xFD18E7:
num7();
break;
case 0xFD9867:
num8();
break;
case 0xFD58A7:
num9();
break;
case 0xFD40BF:
digitalWrite(BIZZER,HIGH);
delay(50);
digitalWrite(BIZZER,LOW);
break;
default:
Serial.println(results.value, HEX);
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
}
irrecv.resume(); // Receive the next value
}
}
void num0()
{
digitalWrite(pin0,LOW); //显示0
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
digitalWrite(pin5,LOW);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
}
void num1()
{
digitalWrite(pin0,HIGH); //显示1
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
digitalWrite(pin0,HIGH);
}
void num2()
digitalWrite(pin0,LOW); //显示2
digitalWrite(pin1,LOW);
digitalWrite(pin2,HIGH);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
void num3()
{
digitalWrite(pin0,LOW); //显示3
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
void num4()
{
digitalWrite(pin0,HIGH); //显示4
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
}
void num5()
{
digitalWrite(pin0,LOW); //显示5
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
}
void num6()
{
digitalWrite(pin0,LOW); //显示6
digitalWrite(pin1,HIGH);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
}
void num7()
{
digitalWrite(pin0,LOW); //显示7
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
}
void num8()
{
digitalWrite(pin0,LOW); //显示8
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
}
void num9()
{
digitalWrite(pin0,LOW); //显示9
digitalWrite(pin1,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,HIGH);
}
void numd()
{
digitalWrite(pin0,HIGH); //显示点DP
digitalWrite(pin1,HIGH);
digitalWrite(pin2,HIGH);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,LOW);
}
Arduino学习手记二:写程序控制灯控制蜂鸣器红外
在上一节中,初步领会了基础,对电路板和ide有了一点感觉。
这里的目标是完成一个电路,通过红外传感头,用摇控器控制LED灯和蜂鸣器。
Arduino Libraries arduino库函数,是一堆c/c++写的代码库,一般用来做一些固定的事情,对arduino的能力进行扩展,有点像php里的各种扩展,当然你也可以实现自己的库。
在arduino代码中要使用库的时候,依次选sketch->import Library->xxx,它会自动在代码头上加上#include的代码。
同时,也可以下载一个library.zip包,依次选择sketch->import Library->add Library,然后就加入了新的库。
要在arduino IDE环境中删除一个已经引入的库,1.0.5及以上版本的IDE需要去~/documents/arduino/libraries下删除对应的目录(相传windows在C:/.../我的文档/arduino/libraries)。
IRremote库简介
官方网站:http://www.pjrc.com/teensy/td_libs_IRremote.html
作者:Ken Shirriff
作用:接收和发送红外控制的代码库
接线
GND接线略去不提,220欧电阻+LED灯之后,将LED接数字11。
蜂鸣器接数字10。
红外OUT接数字8。
这里要提一下,红外接收头的圆鼓包的一面面向自己,最左一脚为OUT,中间为GND,最右为5V。
如图所示:
程序
#include
#define LED 11
#define BIZZER 10
#define IR_IN 8 //红外接收
IRrecv irrecv(IR_IN); // 定义IRrecv 对象来接收红外线信号
decode_results results; //解码结果放在decode_results构造的对象results里
void setup()
{
pinMode(BIZZER,OUTPUT);
pinMode(LED,OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
digitalWrite(BIZZER,HIGH);
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(BIZZER,LOW);
digitalWrite(LED,LOW);
delay(1050);
}
}
效果 按摇控器,蜂鸣器响一下同时灯闪一下。IRemote简化了大量的代码。
Arduino学习手记一:基础知识
arduino是一个商标。
2005年诞生于意大利一个设计学校。然后学生和老师们一起把它开源了。
教科书上一般说,arduino是一个开源电子原型制作平台,包括一个简单易用的电路板和一个软件开发环境。
它与android除了长得像之外,没有半毛钱关系。
开发环境
http://arduino.cc
这个算是官方网站吧,可以下载到开发环境。
http://arduino.cc/en/Main/Software
有各种环境下的,我下了一个mac下的。
版本号有1.0.×与1.5.×的,看上去1.0的就够用了,1.5系列的还是beta,怕遇到麻烦。看release note,1.5的似乎在有意兼容更多的东西。
下载就可以用了,一个小小的窗口。
认电路板 某宝上有各种品牌的版子,不过大家的基准是一样的:
14个数字引脚,这些数字引脚可以在程序中设置是输入还是输出。
GND 地线。
AREF 输入参考电压。
6个模拟输入引脚,这些引脚可以用来读取各种模拟信号的值,比如说读某感应器的值,在程序中转化为0到1023的值。
6个模拟输出引脚。
电路板可以接usb,也可以接外接的电源。
长得像这样,每个引脚下板上写了字,多余的引脚暂时还不知道做什么用的。
arduino IDE arduino的编程语言是一种叫做processing的语言改编而来的。他的作为是当你上传到arduino的时候,自动变成c语言。
代码
#define LED 13
void setup()
{
pinMode(LED,OUTPUT);
}
void loop()
{
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(50);
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(50);
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(2000);
}
一个setup 和一个 loop,是每个ardunio程序的标准格式。setup会执行一次,loop会一直不断地执行。
pinMode函数,是用来指定引脚的作用,输出还是输入。
digitalWrite函数,用来向指定的引脚输入数据(高还是低电压)。
LED灯接到GND和13引脚(LED短脚接地)。
点击arduino IDE上的upload,会看到led灯一闪一闪的。
公式
电阻=电压/电流
创业启示录
创业公司之痛
某某公司上市,A君扯旗创业,由A君朋友OR亲戚投资人投资,拉走某某公司原团队人马十几号人。
第一个月,山盟海誓。有某资源,可做某大事。大家走起。git、svn、php、java、rabbitmq、tomcat、nginx、iOS、android,一人分多角,身兼数职。轰轰烈烈,搞起。
第三个月,产品咋还不出来,出钱的原传统行业投资人略恼。
第六个月,同上。
第九个月,继续同上。
第十二个月,出产品了,四不像。投资人痛哭。打算主控方向。
第十五个月,投资人的不转弯方向继续着,人员补充和流失在双向进行,怨声载道、团队骂、投资人骂、没效果!
第N个月,A君提出,是不是我们方向不对,换个方向吧?
。。。
A君多年之后,打来电话,已然转到其他地方,原队伍解散。思考得一句话:大公司出来的,不能一个公司的人在一起,一定要掺点别的味道才有机会。
创业公司到中型公司转型之痛
B君的公司已经上百人了,业务还行,不属于最好,也不属于最差,不过能够养活这几百号人了,业内也对公司看好。
B君这些年走得很稳健,不然活不到现在。
特点是研发线上不可或缺、不乱加人。
兄弟们都是土生土长的土包子,要么是一毕业就来了这里,没见过外面的市面,要么是二三线小公司混过来的,也没见过啥大系统。
hadoop+hive,一个兄弟搞定,统计各业务线兄弟自己来,所有人学一学都会hql语法。
mysql dba,两个兄弟搞定,一个带一个。人均几百个实例。哼哼,平时还要帮着研发sql。
deploy、ops,两三个兄弟搞定,也是一个带一个,有专门做工具,有经常半夜起来,或者是打电话叫人,或者是跑机房上机器。
另外还有什么daily build、test framework,等等公共的东西,都是研发兄弟们在业余时间总结搞出来的,很稳定也没有专门的人在维护,有问题就有人。
几年过去了,B君去年出现的时候,告知团队除了正常业务外,开始在搞内部的运维平台,不算赶时髦,因为机器有点多,没有个系统管理的话,有点乱。搞完了发现,和后来流行的paas平台很像。瞎猫碰了死耗子了。
B君公司很好,后去的人说,想这两年上市了,我怀疑是B君上班上累了吧?想套现?未经验证,不过的确是时间太长了,给兄弟们不太好交待了。
C君公司比较牛B,比较看不起B君的公司,因为C君团队全线大公司+海归。
豪华阵容一有分歧,开会的时候都在讲,我在的XX公司如何做,眼神坚定得似乎还在那个公司一般。
C君公司因为资金雄厚,比起B君公司也不差,歪歪斜斜的也过来了,在市场占了一席之地。
现在C君的公司在研究研发资源优化,创业公司要转型成中型公司或者大型公司,简单说,就是别几个团队一起在做同一个东西。
按照C君过去在XX公司的经历,a工作一定是A团队的,那B团队做了就是他分配工作的失职。
C君公司里,现在天天开会讨论的都是这个x功能应该谁做,似乎已经是中型公司了。
以上,谨是观察到的式创业现象,切勿对号入座。
只要不扯淡、坚持、持续,在成功的企业还是有很多的。
从分布式存储设计到自动化运维
http://www.infoq.com/cn/articles/nosql-dynamo 三年前在infoq发表的一篇关于两种特别有性的分布式存储的设计思路解析,三年过去了,今天再来总结看看这几年的变化。
实际上,这三年,还是两个东西,一直没有冒出来更牛B的东西。
一、dynamo作riak特点 早几年以cassandra为此类项目,固定特点为:水平扩展、无中心节点、多备份、最终一致性、性能一般、适合海量数据。因为cassandra在业界的使用失败案例太多,让大家避而远之。这两年,以erlang开发的riak又冒出水面。
1.1 erlang 这作为riak的最大特点一点也不为过,因为语言在分布式领域的独特能力,使得riak的源代码十分简洁干净。不过一万多行的代码,在第一次读到它的代码时,我也感叹,几年前,傻希希的用java代码堆了十几万行的nuclear代码,真是太笨了。
1.2 完整的dynamo实现 在cassandra的年代,许多东西不方便实现,版本控制的向量时钟使用了timestamp代替,vnode在cassandra上是非常大的区块,在进行负载均衡时有很大可能不均匀。到了riak的时代,所有的特点,在erlang的支持下,完成了各种细节。并且增加了:1.http存取的支持。2.双向索引。3.搜索支持。4.m/r支持。
二、bigtable作hbase特点 与dynamo对应的解决方案bigtable的更加悠久一些,开源项目也进行了很多年,hbase社区也正在不断地完善。
1.1 偷懒地依赖hdfs 严格说来hbase的实现,只主要关心了regionServer(中心节点所在,用来分配数据所在位置),所以说偷懒地在底下使用了hdfs完成备份工作。
1.2 列簇 在借用hdfs之后,在其上实现的存储格式让hbase可以满足各式各样的需求,当然了,这么复杂的交互,最好还是使用ssd之类的高速度的存储介质。
三、发展方向及特点 在回顾了两大阵营的各自特点之后,再来看看未来。
3.1 mysql时代 招一堆的mysql dba,指哪打哪,哪坏修哪。工作得很好!
3.2 nosql时代
开发工程师了解了dba的苦逼,以及老板招不到dba的苦逼,决定将数据结构化,简化代码的数据结构。
典型的key-value系统。
再基于这些单一的结构,做一堆的自动加机器自动转数据的功能。riak在此列。hbase略高于此。
3.3 未来时代 不仅是存储,整个运维工作,都应该是自动化演进,你可以想象:一个晴朗的下午,工程师带着耳机听着歌,将需求模型输入之后,一个红按钮一按,代码已经写好,test自动开始,AB test,staging,一切OK,自动分发到了各处。上线五分钟,某处开始报警,自动判断如何添加机器,执行添加。
--写在32位服务器已经过时了的日子,纪念一下,都应该记住。
在6乘12中折腾
YY创始人李学凌十年前就被誉为“京城IT名记”;优酷古永古永锵曾经是搜狐总裁...现实说起来很残酷,创业其实是精英玩的游戏,在职场证明过自己的精英们,去创业也非常容易成功。原因很简单,他们的经验和资源,能轻松干掉“100个无脑的创业大学生”。什么?你有勇气,你以为创业是参加选秀比赛呢? --转自weibo@创业家杂志
一、一年工作重复五年经验与五年工作经验
许多朋友在百度、腾讯、人人或者别的什么上市公司,工作了许多年,但是他的大部分时间都交给了QQ群、微博、网易新闻、 reader,只有少部分时间在解决手里的问题,而且这些问题看上去也从来没有主次之分,久而久之,如果没有人来找他,他可以很幸福地度过一个快乐的工作日,而且丝毫不为碌碌无为而难过,第二天继续准时上班。想起了各种传统意义上的同学。这些大公司为这些职位的朋友们准备了各种PM、产品、scrum master,目的只有一个,时刻在其后准备告诉他,今天你需要做什么了。
还有很多优秀的前同事,骨子里是比较能够折腾的,做事情有轻重缓急,有明确的技术方向和爱好,认识他们都是在三年前,三年后的现在,他们有的肉身在外,有的已经都是各处创业公司的骨干或者是自己开始了更加折腾的事业。
一年工作重复五年,并不可怕,可怕的是重复的过程里,没有任何的思考空间,不会折腾,或者完全不想折腾。与公司方向保持一致的折腾,有着事半功倍的效果,半年拿一年的经验,何乐而不为。
二、创业与打工
如果不是富二代,打工的直接目标还是解决温饱,奔小康。创业为了什么,成功的很多很能折腾的兄弟,折腾中的自我乐趣才是创业的源泉。如果你还在寻找职业发展方向,看所谓的XXX升职记之类的,这里有一个建议,打工时,以学会合并公司路线与个人方向一起折腾为目标。当折腾成了习惯,能找到折腾的乐趣了,才算是在职场中证明了自己。
打工状态中,大多数人会有眼高手低的习惯,(自己完全不喜欢折腾的完全不在此讨论范围,凡人一个)觉得所做非自己喜欢折腾的方向,这种是典型的不能个人与公司不能合并症状,需要自己调整状态,否则会一直很难受,直到奋起而创业失败。
三、六乘十二与五乘八
我们真正地在学习和执行不断折腾的,创业的基础,如果你不适应,你只需要的是一份普通的式工作。相信一个合格的技术码农,骨子里一定是善于折腾的人,起码也是曾经善于折腾的人。
曾经一度,因为六乘十二,放弃了许多优秀的技术人员。路途远、家人、孩子,种种限制。每个人衡量的度不一样,大多数人看中直接的投入产出比,少数人看中技术空间,还有人看中人事空间。
风宜长物放眼量,只以长笑当歌唱。
四、善于折腾的人与普通人
马云退休的时候说,以前,他的生活就是工作,以后,他的工作就是生活。
看看我们善于折腾的几个老板,大半夜最后走,周六也还在研究产品,随时关注用户反馈。有人说了,又不是你的公司。呵呵,我是告诉你,如果你不是一个折腾的人,你开的公司也未必会这样上心的,很大可能公司都长草了你最后一个知道。
我相信两个信条:态度比能力重要,选择也比能力重要。--借马云结尾,然后说明一下,我们现在已经是五乘十二了,折腾时间少了一天,不过是多分一天给了家人,分享一下短期的成果。
上面的一砣目的只是为下面的两个招聘消息: 1.前端负责人 有过中大型互联网公司前端团队经验,最好是干这行三五年了,还善于折腾。 2.java高级工程师 持续从事互联网开发工作三年以上,各种大负载经验,非常善于折腾和跟公司一起折腾。
待遇问题和HR谈,一定会给到你满意为止。54chen at xiaomi dot com。(不满足上面两条硬性规定的朋友不要发,谢谢!)感谢朋友们帮忙转发!
Scribe的生产实践总结
一、scribe是什么
scribe是开源的分布式日志系统。这里两年前的使用手记。http://www.54chen.com/_linux_/log-server-scribe-helper.html。严格说它只是一个日志处理的节点,与分布式系统相比差很多复杂的节点间的控制过程。不过也贵在它很精简,不容易出现问题。两年多时间以后,线上还没出现过一例scribed自己crash掉的情况。
二、scribe遇到master挂掉
生产环境中一般配置为一个primary(type=network)带一个secondary(type=file),在遇到master挂掉的情况下,会直接写到本地磁盘。
这个设置有非常多好处,当远程的master恢复了,本地磁盘的这些个日志还会被scribe给送回去。
日常要监控这个事情的发生也很简单,一行脚本就可以:
ALERT=`du -sb /tmp/scribe/|awk '{print $1}'`
if [ ${ALERT} -ge 1024000 ]; then
//alert
fi
三、scribe自己挂掉
scribe自己挂掉要预防把业务堵死了,一定要用异步线程在写这个日志,如果本地的scribed挂了,那端口一定不在了,在new thrift连接的时候就会失败,可以在这个异步线程中去设定多久再重试,但这就是有损日志的了。
日常监控一般可以直接看端口还在不在,不过一般不会挂(两年多还没见过)。
比较文艺的做法可以用他给的ctrl.sh那个python脚本去读取scribed内部的perfcounter来报警。
四、scribe遇到master没挂但是网络不好
这个比较难受,网络一堵,很多天都追不上来。而且会出现恶性循环。所以还是要网络给力,最差要能传输不滞留日志。
我米高人航军大侠搞了一个压缩过的传输scribed改造,还没试用,理论上数据量降了应该有一定缓解。
五、scribe与kafka对比
kafka是linkedin开源的一个日志分发系统,scala的,很牛B的一个系统,以cluster、去中心化、高效为特点,比起scribed来说,kafka是航空母舰,scribed是激流勇进那种冲锋舟,各有各的好处。
从日志收集的需求来看,如果遇到前面4点的故障的话,使用kafka的话,要做的事情还不少。但如果出现中心化的故障的话,还是kafka不怕down机。