Archive for the ‘编程’ Category


Linux Load编程竞赛

Linux load average的意思就是说 目前有ready的进程 但是cpu都在满,然后这个数是一分钟的平均值。公式:loadvg = tasks running + tasks waiting (for cores) + tasks blocked. 让CPU满是最简单的方式

为了更好理解load average,Tim某天在群征集一段代码使load average最高。于是乎,群友纷纷出手。

Erlang版

[~]$ cat load10
#!/usr/bin/env escript
%% -- erlang --
%%! -smp enable -sname load10
main(_) ->
I = erlang:system_info(scheduler_id),
random(5).

random(I) when I > 10 ->
random(I+1);
random(I) ->
spawn(fun() -> random(I+1) end),
random(I+1).

此代码将Linux load跑到了10-20,取得了领先

Shell版

#!/bin/sh
for((i=0;i<10;i++));do
{
for((j=0;j<1000000000000;j++));do echo '1'>>1; done
}&
done

Ruby

ruby -e "require 'thread';t = Mutex.new;10.times {fork {10000000.times{t.synchronize {x=Time.now}}}}"

Java版

import java.io.*;

public class LoadTest {

  public static void main(String[] args) throws IOException, InterruptedException {
      int count = 1000;
      for (int i = 0; i < count; i++) {
          final Thread t = new Thread(new Runnable() {
              public void run() {
                  try {
                      while (true) {
                          RandomAccessFile file = new RandomAccessFile("/tmp/test.bin", "rw");
                          file.seek(1024 * 1024 * 500);
                          file.write(1);
                          file.close();
                      }
                  } catch (IOException e) {
                  }
              }
          });
          t.start();
      }
      Thread.currentThread().join();
  }
}

C语言版

void main () {
int i=0;
for (i = 0; i < 1000; i++) {
if (fork () > 0) {
continue;
}
while (1) ;
}
getchar();
}

此版本远远超过了上面的Erlang版本,将load拉到1000+

Java版本2

public class Test {

   public static void main(String[] args) {
       for (int i = 0; i < 1000; i++) {
           new Thread() {
               @Override
               public void run() {
                   while (true) ;
               }
           }.start();
       }
   }
}

此版本和上面C版本效果类似

部分讨论:

不对呀,这个方法以前不行
CentOS 6吧[惊讶]
CentOS 5
有几个版本有bug,cpu的hz拿的不对,load特别低,7就好了[坏笑]

Java版本3

写两类线程,一类进行lockObject wait, 一类进行lockObject notifyall。 cpu上下文切换消耗 竞争激烈。Load能很高。

public class LoadHighDemo {

   public static void main(String[] args) throws Exception {
       LoadHighDemo demo = new LoadHighDemo();
       demo.runTest();
   }

   private void runTest() throws Exception {
       Object[] locks = new Object[5000];
       for (int i = 0; i < 5000; i++) {
           locks[i] = new Object();
           new Thread(new WaitTask(locks[i])).start();
           new Thread(new NotifyTask(locks[i])).start();
       }
   }

   class WaitTask implements Runnable {

       private Object lockObject = null;

       public WaitTask(Object obj) {
           lockObject = obj;
       }

       public void run() {
           while (true) {
               try {
                   synchronized (lockObject) {
                       lockObject.wait(new java.util.Random().nextInt(10));
                   }
               } catch (Exception e) {;
               }
           }
       }
   }

   class NotifyTask implements Runnable {

       private Object lockObject = null;

       public NotifyTask(Object obj) {
           lockObject = obj;
       }

       public void run() {
           while (true) {
               synchronized (lockObject) {
                   lockObject.notifyAll();
               }
               try {
                   Thread.sleep(new java.util.Random().nextInt(5));
               } catch (InterruptedException e) {
               }
           }
       }
   }
}

上物理机把5000个线程改成更多,如50000也行。
直接while true改5000应该能更多……
我的应该能一直上涨, load 1000, 2000, 3000

可以试试parkNanos(1)

刚才卡了。。。
看来不能在本机上跑

Python版

把5分钟 load avg 稳定在1024了
在本群感到了一种情怀。。。

#!/usr/bin/env python
import os
import sys
import time

def load_add_1():
time.sleep(30)
fd=os.open("test.txt",os.O_CREAT|os.O_RDWR|os.O_SYNC, 0644)
for i in xrange(10000*100):
os.write(fd," "*100)
sys.exit(0)

for i in xrange(8192):
if os.fork() == 0:
load_add_1()

此版本将load跑到8192

C语言版本2

https://gist.github.com/hongqn/37cdfde04d0c5a03fede

#include <unistd.h>
#include <stdio.h>

#define LOAD 16384

int main() {
int i;
char s[256];

for (i=0; i<LOAD; i++) {
if (vfork()) {
return 0;
}
}
scanf("%s", s);
return 0;
}

macbook 上 virtualbox 里一个 2G mem 单 core cpu 的虚机就可以轻松达到16,000
这个的原理是通过 vfork 产生指定个数的 D 状态进程,从而提高 load

Vfork() differs from fork in that the child borrows the parent’s memory and thread of control until a call to execve(2) or an exit (either by a call to exit(2) or abnormally.) The parent process is suspended while the child is using its resources.
vfork 的子进程只要不 execve 或者退出,父进程就一直挂着(在D状态)。这里就是让最后一个子进程用 scanf 等输入

通过以上题目,你是看到了热闹,还是看到了门道?

 

互联网公司为什么要组织黑客马拉松(Hackathon)


黑客马拉松(Hackathon)通常是一种连续、集中式的编程活动,由报名人员组队参赛并且在规定的时间内完成计划的功能。黑客马拉松的主力人员是工程师,但产品、设计等人员也可以一起组队参加。“黑客”二字在不同的场合有不同的含义,黑客马拉松中的黑客不是指安全领域里面破坏计算机系统的危险分子;而是那些可以创新性的,通过自己动手编程来扩展、改进现有系统能力的人。

黑客马拉松通常选择在轻松的环境如咖啡馆进行,有着舒缓的音乐,全天有咖啡、茶、软饮供应;没有叮叮的座机铃声,工程师也不会碰到有人过来催进度加需求的情况。由于目标明确,为了按时完成项目,队员也会避免进行聊天、浏览新闻等分散精力的事情,精神非常集中。周围的人也全都在讨论改进项目的方法,或者是在全神贯注的开发,也给参与人员强烈的环境暗示,“我在这里能够愉快的、高效的进行创作。”

不过这种集体高潮的活动除了自娱自乐之外,到底有没有价值?这是组织者与参与者经常面临的一个问题。

首先,任何在公众面前集体曝光的活动不排除有作秀的性质。单纯的集体作秀如果不妨碍他人,属于无伤大雅的脱力系。而适当的团队曝光也有助于公众(包括客户、同事、公司管理阶层)了解参与团队的另一面如创新的能力及高效的执行力,创造机会让队员得到各界更好的了解。一些参赛的项目也可以引发业界从业人员以及投资界的关注,以及进一步思考如何更好的改进相应领域的系统设计来更好的满足用户使用。

很多黑客马拉松设计成24小时连续进行,看着这些工程师通宵达旦的工作,一些旁观者会觉得不可理解,大部分人平时都不缺几个小时空闲时间,有必要24小时通宵达旦来完成一项功能?它是否仅仅是一个释放工程师多余的荷尔蒙的集体狂欢活动?

24小时通常是一个自愿的活动,和长跑马拉松同一个道理,有能力有体力的人可以选择性的参加,每个队员可以根据自己的体力情况随时下撤休息,因此并不是旁观者想象的刻意违反人体健康的一个自虐活动。比长跑马拉松更宽松的是,黑客马拉松活动可以休息一段时间并继续进行比赛,它更强调的集中个人的精力来完成一项目标。和长跑马拉松相同的是,队员都会通过这个活动来更好的思考自己的能力、自己能坚持的旅程和自己目标,并且都能很好的享受自己高速迈向目标带来的快感。黑客马拉松创造了一个环境,让队员集中精力集中时间全心身完成一件作品。

这种做法也非常具有效率,在24小时的活动中,队员可以完成平时一周或者更长时间才能完成的事情,效率达到平时的好几倍。另外通过快速实现自己的想法,可以更好的验证想法是否可行;通过体验做出的原型,可以更好的完善自己的想法,发现自己的不足。有时候,也会帮助我们意识到某条路走不通,更早的来规避失败的方向。所有这些,都可以更早的帮助我们跨过思维停留在idea那一步。

有些公司将一些封闭式开发的活动或培训也称为黑客马拉松(Hackathon),我觉得区分是否真正意义Hackathon方法是,队员是自由的、主动发挥创意去改进真实世界的问题?还是它是一个被动的、指定的、或假想的任务。不要轻易使用黑客马拉松这个名称,它并不是外围人想象的一个集体狂欢活动,它也未必是一个时髦的标签。如果活动并不具备对自由的崇拜和创新的追求的黑客精神,也没有相应的产出,往黑客马拉松这方面去宣传会让公众及社区感到困扰。

从公司的角度意义,可以参考facebook黑马组织者Pedram Keyani所说的话,Pedram在7年时间里在Facebook组织了近40场黑客马拉松。

起初我参加黑马,仅仅是因为我喜欢同大家一起协作,挖掘工作之外的创意,以及产生的能量和自由感。然而随着时间转移,那些黑客马拉松从小小的20人业务活动摇身一变成了Facebook文化的重要组成部分。

从工程师的角度,Hackathon的意义很大程度是让工程师从工业化的日常任务中脱离出来,回归初心,通过动手打破现实系统的束缚,将创新想法变成现实,让人与计算机的世界变得更好。

(EOF)

上一篇选择学习目标的困难与焦虑发表后,各个平台都有不少来询问如何解决的。简单的说下我的看法,每个人自己的学习瓶颈很难由一个同一的方法来解决,这个是我很难写也没有写解决方案的原因;文章更大的目的是让大家意识到自己在学习投入方面的浪费,反思选择的哲学,反思偏表面的学习而轻视思考的哲学,反思为了学习而学习,帮助大家思考更好的前进方法。

一次编程马拉松活动

“编程马拉松(hackathon)是一个流传于电脑迷(hacker)当中的新词汇。编程马拉松是一种活动。在该活动当中,很多程序员相聚在一起。他们以合作的形式去进行电脑编程。编程马拉松的灵魂是合作地编写程序和应用。 编程马拉松的时长一般在几天到一周不等。编程马拉松不是编写些一次性作品那么简单。编程马拉松的精髓在于:很多人,在一段特定的时间内,相聚在一起,以他们想要的方式,去做他们想做的事情——整个编程的过程几乎没有任何限制或者方向。” 以上是维基百科对于Hackathon在活动形式上的解释。

3G门户总裁张向东在参加完2013年Google I/O大会之后感慨

虽然工程师总是被知识分子和政治活动家所忽视,但只有技术革命才不是循环往复的。有了电流后就不再用蜡烛,有了汽轮船就不再用帆船……这才是真正推动历史的火车头, 它带来了不可否认的和不可逆转的进步。

当今真正的革命领袖,就是程序员。

尽管愿景如此,对于怀抱技术改变世界梦想的工程师来说,大部分环境并没有提供良好的成长土壤。由于视野及经验方面原因,工程师在产品的设计、品质与战略等方面并不具备太大优势,在公司中更多是充当是执行者的角色。而且越大的公司分工越细,工程师长期从事的可能只是庞大产品线的很小一部分,较难体验作为工程师身份创造事物的乐趣。因此类似Hackathon这样的环境可以适当释放工程师创新与实践的需求。

因此当一位同事L提议进行一场Hackathon时,得到了广泛支持。Hackathon编程的领域没有太大悬念,由于移动方向的绝对影响力,加上大部分工程师最近也在积极学习移动开发,因此Hackathon选定为移动方向。

由于部门内大部分工程师并没有熟练的移动开发经验,为了提高活动的产出,在Hackathon一周前进行了一次赛前培训,讲解了一个app开发的过程。讲师也是由参赛人员中在移动开发方向有一定经验的工程师担当。培训也有配套示例的工程,供课后自行修改尝试。接着,参赛人员按照1-3人的队伍规模进行了组队报名参赛。一些心急的选手也开始在提前编写代码。

活动从端午假期前的周五下午2点左右开始,在周六下午2点左右结束。大部分队伍也取得了不错的结果。

Quora网站上一篇“什么是创业型公司理想的环境(What are the coolest startup culture hacks you’ve heard of)”问题中,有人提到了一些让有意思的Hack活动。

Facebook的Hack月
当你在facebook工作一段时间后(通常1年),公司会让你选择一个新的team在新的项目工作一个月(Hack month),如果你喜欢那个项目,你就留在那个team,如果不喜欢,你可以回到原来的团队或者再选择新的团队。

Dropbox’s的Hack周
在Dropbox,有一周所有人放下手中的现有工作,去做一些自己感兴趣而且很酷的事情。其中创造到一些产品或者特性可能会加到现有的产品中。