Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - valexey_u

Страницы: 1 2 3 [4] 5 6 7
46
Чую надо отдельную тему завести.

Итак задача - нужно быстро рисовать. То есть нужно выводить на экран картинку 640x480 без мерцания, 30 кадров в секунду. Картинка уже сформирована и есть в виде буфера (одномерного массива), например вот в таком виде: http://oberspace.dyndns.org/index.php/topic,484.msg16241.html#msg16241.

Как это сделать максимально просто и не слишком криво?

47
Общий раздел / Сравнение blur-алгоритмов.
« : Апрель 25, 2013, 12:55:19 pm »
Коль уж завелось обсуждения этих алгоритмов, и чтобы не путать тему о самих алгоритмах и тему бенчмарка разных ЯП (и их реализаций) на одном и том же алгоритме (что обсуждается вот в этой теме: Blur на разных ЯП), завожу новую тему.

Напомню задачу - нужно получить быстрый алгоритм сильно размывающий картинку.

Тема берет свое начало тут: http://oberspace.dyndns.org/index.php/topic,480.msg15695.html#msg15695

Вот два готовых к употреблению алгоритма. Один наш, который мы, с Надей реализовали на хакатоне (на С++), и другой Сергея Губанова, который реализовал на C#:

Наш:
#include <iostream>
#include <ctime>

const int width = 640;
const int height = 480;
const size_t blurRange = 13;

enum Color {
    RED = 0,
    GREEN,
    BLUE
};

int index(int x, int y, Color color) {
    return width*y*3+x*3+color;
}

template <size_t N>
struct ring_buffer {
    float buf[N];
    size_t head;
    size_t size;
    ring_buffer():head(0), size(0) {memset(buf, 0, sizeof(buf));}
    void push_back(float v) {
        if (++head >= N) {head=0;}
        if (size<N) size++;
        buf[head]=v;
    }

    float back()   {return buf[head];}
    float front()  {return buf[head!=N-1?head+1:0];}
};

int main()
{
    volatile unsigned char* volatile in  = new unsigned char[width*height*3];
    volatile unsigned char* volatile out = new unsigned char[width*height*3];

    time_t begin;
    time(&begin);

    const int frames = 1000;

    for (int nn=0; nn<frames; nn++) {
        for (int y=blurRange; y<height-blurRange; y++) {
            float red = 0;
            float green = 0;
            float blue = 0;

            ring_buffer<blurRange*2> redRows ;
            ring_buffer<blurRange*2> blueRows;
            ring_buffer<blurRange*2> greenRows;                       

            for (int x=blurRange; x<width-blurRange; x++) {
                float vr = 0;
                float vg = 0;
                float vb = 0;
                for (int y1 = y-blurRange; y1<y+blurRange; y1++) {
                    vr += in[index(x,y1,RED)  ];
                    vg += in[index(x,y1,GREEN)];
                    vb += in[index(x,y1,BLUE) ];
                }
                vr = vr/(blurRange*blurRange*4.0);
                vg = vg/(blurRange*blurRange*4.0);
                vb = vb/(blurRange*blurRange*4.0);

                auto front_r = redRows.front();
                red   += vr - redRows.front();
                green += vg - greenRows.front();
                blue  += vb - blueRows.front();
                               
                redRows.push_back(vr);
                blueRows.push_back(vb);
                greenRows.push_back(vg);

                out[index(x,y,RED)  ] = red*(blurRange*2.0/redRows.size);
                out[index(x,y,GREEN)] = green*(blurRange*2.0/greenRows.size);
                out[index(x,y,BLUE) ] = blue*(blurRange*2.0/blueRows.size);
            }
        }
    }
    time_t end;
    time(&end);
    auto seconds = difftime(end, begin);
    std::cout << float(frames)/seconds << " " << seconds << std::endl;
    return 0;
}

Сергея:
// Note! Need add reference to: WindowsBase, PresentationCore, System.Xaml
namespace Blur
{
class Program
{
private const int W = 640;
private const int H = 480;
private static System.Windows.Media.PixelFormat pixelFormat = System.Windows.Media.PixelFormats.Bgr24;

static void Main (string[] args)
{
byte[] a;
if (Load("input.jpg", out a))
{
const int N = 7;

byte[] b = new byte[a.Length];
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
BlurX2(a, b, N);
timer.Stop();
double dt = timer.Elapsed.TotalSeconds;
System.Console.WriteLine("N={0}, R={1}, time = {2} seconds, FPS = {3}", N, 2*N, dt, 1.0/dt);
Save("output-R" + (2*N) + ".jpg", a);
System.Console.WriteLine("Ok");
System.Console.ReadLine();
}
}

public static unsafe void BlurX2 (byte[] A, byte[] B, int N)
{
const int dy = 3*W;
const int dx = 3;

fixed (byte* a = &A[0])
{
fixed (byte* b = &B[0])
{
for (int n = 0; n < N; n++)
{
for (int y = dy; y < dy*(H-1); y+=dy)
{
for (int x = dx; x < dx*(W-1); x+=dx)
{
int offset = y + x;
b[offset+0] = (byte)((a[offset-dy+0] + a[offset+dy+0] + a[offset-dx+0] + a[offset+dx+0]) / 4);
b[offset+1] = (byte)((a[offset-dy+1] + a[offset+dy+1] + a[offset-dx+1] + a[offset+dx+1]) / 4);
b[offset+2] = (byte)((a[offset-dy+2] + a[offset+dy+2] + a[offset-dx+2] + a[offset+dx+2]) / 4);
}
}
for (int y = dy; y < dy*(H-1); y+=dy)
{
for (int x = dx; x < dx*(W-1); x+=dx)
{
int offset = y + x;
a[offset+0] = (byte)((b[offset-dy+0] + b[offset+dy+0] + b[offset-dx+0] + b[offset+dx+0]) / 4);
a[offset+1] = (byte)((b[offset-dy+1] + b[offset+dy+1] + b[offset-dx+1] + b[offset+dx+1]) / 4);
a[offset+2] = (byte)((b[offset-dy+2] + b[offset+dy+2] + b[offset-dx+2] + b[offset+dx+2]) / 4);
}
}
}
}
}
}

public static bool Load (string fileName, out byte[] buffer)
{
buffer = null;
using (System.IO.FileStream s = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
{
System.Windows.Media.Imaging.BitmapDecoder d = System.Windows.Media.Imaging.BitmapDecoder.Create(s,
System.Windows.Media.Imaging.BitmapCreateOptions.PreservePixelFormat,
System.Windows.Media.Imaging.BitmapCacheOption.Default);

System.Windows.Media.Imaging.BitmapFrame f = d.Frames[0];
if (f.PixelWidth != W)
{
System.Console.WriteLine("Unexpected width={0}, expected={1}", f.PixelWidth, W);
}
else if (f.PixelHeight != H)
{
System.Console.WriteLine("Unexpected height={0}, expected={1}", f.PixelHeight, H);
}
else if (f.Format != pixelFormat)
{
System.Console.WriteLine("Unexpected pixel format={0}, expected={1}", f.Format, pixelFormat);
}
else
{
buffer = new byte[W * H * 3];
f.CopyPixels(buffer, W * 3, 0);
}
}
return (buffer != null);
}

public static void Save (string fileName, byte[] buffer)
{
System.Windows.Media.Imaging.BitmapSource bm = System.Windows.Media.Imaging.BitmapSource.Create(
W, H, 300, 300, pixelFormat, null, buffer, W * 3);

using (System.IO.FileStream s = new System.IO.FileStream(fileName, System.IO.FileMode.Create))
{
System.Windows.Media.Imaging.JpegBitmapEncoder e = new System.Windows.Media.Imaging.JpegBitmapEncoder();
e.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bm));
e.Save(s);
}
}
}
}

Пояснения к алгоритму Сергея (подробней тут):
Цитировать
Сделал цвета однобайтовыми, делаю блюр в трёх каналах, загружаю из картинки.

На i7 2600K уже с учётом трёх каналов:

N=5, R=10, time = 0.0140209 seconds, FPS = 71.3220977255383
N=6, R=12, time = 0.0166911 seconds, FPS = 59.912168760597
N=7, R=14, time = 0.0194411 seconds, FPS = 51.4374186645817
N=8, R=16, time = 0.0224343 seconds, FPS = 44.5746022831111

R - радиус размытия, N - количество фаз (за одну фазу делается два прохода, R = 2*N)

Иллюстрация работы этого алгоритма:
До обработки:


После обработки с N=6 (R=12):


Литература которую нужно таки как-то проработать http://web.archive.org/web/20060718054020/http://www.acm.uiuc.edu/siggraph/workshops/wjarosz_convolution_2001.pdf (сслыка предоставлена Dddizer'ом).:

Также я постараюсь сегодня-завтра прогнать эту картинку через наш алгоритм, чтобы стало ясно насколько похожие результаты получаются.

48
Общий раздел / Blur на разных ЯП.
« : Апрель 24, 2013, 04:34:26 pm »
Коль пошла такая пьянка, предлагаю погонять один и тот же алгоритм блюра на разных ЯП. Ну и попробовать, возмжно, оптимизировать производительность не изменяя самого алгоритма.

Начало темы, тут: http://oberspace.dyndns.org/index.php/topic,480.msg15786.html#msg15786

Рассматриваем только алгоритм Сергея. Краткое описание алгоритма (наивная реализация для одного цветового канала флоатов на C#):
const int N = 13;

for (int n = 0; n < N; n++)
{

  for (int y = 1; y < 479; y++)
  {
    for (int x = 1; x < 639; x++)
    {
      b[y, x] = 0.25 * (a[y - 1, x] + a[y + 1, x] + a[y, x - 1] + a[y, x + 1]);
    }
  }

  for (int y = 1; y < 479; y++)
  {
    for (int x = 1; x < 639; x++)
    {
      a[y, x] = 0.25 * (b[y - 1, x] + b[y + 1, x] + b[y, x - 1] + b[y, x + 1]);
    }
  }
}

Продублирую и дополню и вычищу то, что содержалось в том сообщении (из дополнительного - появилась реализация на КП/ББ):

Итак, вначале результаты. Напомню, что радиус размытия (N) = 13. Обрабатываются все три канала. Число обрабатываемых кадров = 1000.

C#:
   time: 107 seconds
   fps : 9.35
С++:
   time: 96 seconds
   fps : 10.42
BB/CP (2D массивы аналогично наивной реализации на C#):
   time: 439 seconds
   fps : 2.28
BB/CP (1D массивы, функция вычисления индекса - аналогично C++):
   time: 688 seconds
   fps : 1.45

Исходники:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            const int H = 480;
            const int W = 640;
            byte[] a = new byte[H * W * 3];
            byte[] b = new byte[H * W * 3];

            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            const int N = 13;
            timer.Reset();
            timer.Start();
            const int frames = 1000;
            for (int nn = 0; nn<frames; nn++)
            {
                fixed (byte* pa = &a[0])
                {
                    fixed (byte* pb = &b[0])
                    {
                        for (int n = 0; n < N; n++)
                        {
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < W - 1; x++)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *(pb + (H * y + x) * 3 + color_shift) = (byte)(0.25 * (*(pa + (H * (y - 1) + x) * 3 + color_shift)
                                        + *(pa + (H * (y + 1) + x) * 3 + color_shift)
                                        + *(pa + (H * y + x - 1) * 3 + color_shift)
                                        + *(pa + (H * y + x + 1) * 3 + color_shift)));
                                    }
                                }
                            }
                            for (int y = 1; y < H - 1; y++)
                            {
                                for (int x = 1; x < W - 1; x++)
                                {
                                    for (int color_shift = 0; color_shift < 3; color_shift++)
                                    {
                                        *(pa + (H * y + x) * 3 + color_shift) = (byte)(0.25 * (*(pb + (H * (y - 1) + x) * 3 + color_shift)
                                            + *(pb + (H * (y + 1) + x) * 3 + color_shift)
                                            + *(pb + (H * y + x - 1) * 3 + color_shift)
                                            + *(pb + (H * y + x + 1) * 3 + color_shift)));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            timer.Stop();
            double dt = timer.Elapsed.TotalSeconds;
            System.Console.WriteLine("N = {0} (R = {1}), dt={2} seconds, FPS = {3}",
                N, 2 * N, dt, (frames / dt));

            System.Console.ReadLine();
        }
    }
}

C++:
#include <iostream>
#include <ctime>

const int width = 640;
const int height = 480;
const size_t blurRange = 13;

enum Color {
    RED = 0,
    GREEN,
    BLUE
};

int index(int x, int y, Color color) {
    return width*y*3+x*3+color;
}

int main()
{
    volatile unsigned char* volatile in  = new unsigned char[width*height*3];
    volatile unsigned char* volatile out = new unsigned char[width*height*3];

    time_t begin;
    time(&begin);

    const int frames = 1000;

    for (int nn=0; nn<frames; nn++) {
        for (int i=0; i<blurRange; i++) {

            for (int y=1; y<height-1; y++)
                for (int x=1; x<width-1; x++) {
                    out[index(x,y,RED)]= 0.25*(
                        (float)in[index(x,y-1,RED)]+
                               in[index(x,y+1,RED)]+
                               in[index(x-1,y,RED)]+
                               in[index(x+1,y,RED)]);
                    out[index(x,y,GREEN)]= 0.25*(
                        (float)in[index(x,y-1,GREEN)]+
                               in[index(x,y+1,GREEN)]+
                               in[index(x-1,y,GREEN)]+
                               in[index(x+1,y,GREEN)]);
                    out[index(x,y,BLUE)]= 0.25*(
                        (float)in[index(x,y-1,BLUE)]+
                               in[index(x,y+1,BLUE)]+
                               in[index(x-1,y,BLUE)]+
                               in[index(x+1,y,BLUE)]);
                }

            for (int y=1; y<height-1; y++)
                for (int x=1; x<width-1; x++) {
                    in[index(x,y,RED)]=0.25*(
                        (float)out[index(x,y-1,RED)]+
                               out[index(x,y+1,RED)]+
                               out[index(x-1,y,RED)]+
                               out[index(x+1,y,RED)]);
                    in[index(x,y,GREEN)]=0.25*(
                        (float)out[index(x,y-1,GREEN)]+
                               out[index(x,y+1,GREEN)]+
                               out[index(x-1,y,GREEN)]+
                               out[index(x+1,y,GREEN)]);
                    in[index(x,y,BLUE)]=0.25*(
                        (float)out[index(x,y-1,BLUE)]+
                               out[index(x,y+1,BLUE)]+
                               out[index(x-1,y,BLUE)]+
                               out[index(x+1,y,BLUE)]);
                }
        }
    }

    time_t end;
    time(&end);
    auto seconds = difftime(end, begin);
    std::cout << float(frames)/seconds << " " << seconds << std::endl;
}

Тестовый модуль на КП. Две функции:
Blur2DArray - реализация на 2D массивах
Blur1DArray - реализация на одномерных массивах.
MODULE Blur;
IMPORT Kernel, Out:=StdLog;

CONST
W = 640;
H = 480;
N = 13;
Frames = 1000;

TYPE
Plane = ARRAY W*3, H OF BYTE;
Plane1 = ARRAY W*H*3 OF BYTE;

PROCEDURE Blur2DArray*;
VAR
time : LONGINT;
f, n : INTEGER;
x, y : INTEGER;
color : INTEGER;
a, b : POINTER TO Plane;
BEGIN
NEW(a);
NEW(b);
time := Kernel.Time();

FOR f:=1 TO Frames DO
FOR n:=1 TO N DO

FOR y:=1 TO H-2 DO
FOR x:=1 TO W-2 DO
FOR color:=0 TO 2 DO
b[x*3+color,y] := SHORT(SHORT(SHORT(ENTIER(0.25*(a[x*3+color,y+1]+a[x*3+color,y-1]+a[(x-1)*3,y]+a[(x+1)*3,y])))));
END
END
END;

FOR y:=1 TO H-2 DO
FOR x:=1 TO W-2 DO
FOR color:=0 TO 2 DO
a[x*3+color,y] := SHORT(SHORT(SHORT(ENTIER(0.25*(b[x*3+color,y+1]+b[x*3+color,y-1]+b[(x-1)*3,y]+b[(x+1)*3,y])))));
END
END
END


END
END;

Out.Real((Kernel.Time() - time)/1000)
END Blur2DArray;

PROCEDURE Index(x,y,color : INTEGER) : INTEGER;
BEGIN
RETURN ((x+y*W)*3+color)
END Index;

PROCEDURE Blur1DArray*;
VAR
time : LONGINT;
f, n : INTEGER;
x, y : INTEGER;
color : INTEGER;
a, b : POINTER TO Plane1;
BEGIN
NEW(a);
NEW(b);
time := Kernel.Time();

FOR f:=1 TO Frames DO
FOR n:=1 TO N DO

FOR y:=1 TO H-2 DO
FOR x:=1 TO W-2 DO
FOR color:=0 TO 2 DO
b[Index(x,y,color)] := SHORT(SHORT(SHORT(ENTIER(0.25*(a[Index(x,y+1,color)]+a[Index(x,y-1,color)]+a[Index(x-1,y,color)]+a[Index(x+1,y,color)])))));
END
END
END;

FOR y:=1 TO H-2 DO
FOR x:=1 TO W-2 DO
FOR color:=0 TO 2 DO
a[Index(x,y,color)] := SHORT(SHORT(SHORT(ENTIER(0.25*(b[Index(x,y+1,color)]+b[Index(x,y-1,color)]+b[Index(x-1,y,color)]+b[Index(x+1,y,color)])))));
END
END
END;

END
END;

Out.Real((Kernel.Time() - time)/1000)
END Blur1DArray;
BEGIN
END Blur.

49
Общий раздел / Мы победили :-)
« : Апрель 14, 2013, 07:09:07 pm »
Сабж! Вот в этом конкурсе: http://hackday.ru/events/hackday-25/custom
Мой проект - 24ый тут: http://hackday.ru/events/hackday-25/projects

50
Общий раздел / [Photo] Super-resulution.
« : Апрель 06, 2013, 12:27:22 am »
Super-resulution это конечно хорошо известные методы увелечения разрешающей способности по нескольким кадрам, а вот как вам свежие статистические методы этого класса работающие на ОДНОМ кадре?

Статья: http://habrahabr.ru/post/147807/
Примеры (много картинок, да): http://www.wisdom.weizmann.ac.il/~vision/SingleImageSR.html

51
Общий раздел / JavaScript наносит ответный удар!
« : Апрель 05, 2013, 07:35:17 am »
ECMAScript 6 выйдет до конца 2013 года, и там будут:
  • переменные с блочной областью видимости (let)
  • параметры функций со значением по умолчанию
  • "паттерн матчинг" в присваиваниях (деструктурирование результата, аля {a,b} = foo() )
  • классы
  • модули
Ну и еще мелочь всякая навроде нормальных циклов.

Обзорчег можно прочесть тут: http://habrahabr.ru/post/175371/

52
Общий раздел / Rust атакует.
« : Апрель 03, 2013, 08:39:30 pm »
Я же уже упоминал что на Rust мозилловцы экспериментальный браузеродвижок пишут (весь такой асинхронно-параллельный)? Вот этот:  https://github.com/mozilla/servo (иначе нафига мозилле этот руст вообще?)

Так вот, недавно оно вышло на новый уровень - мозилла заключила с самсунгом договор о сотрудничестве в плане развития этого движка. Так что теперь похоже стоит ожидать скорейшей стабилизации руста как языка, и допила этого самого движка до состояния вменяния. Самсунг явно старается освободиться от гуглозависимости (то есть от андроида и вебкита).

Первые плоды сотрудничества - свежий релиз Rust 0.6 в котором самсунг по быстрому реализовал поддержку ARM-архитектуры (оно и понятно, Самсунг заинтересован браузер на базе этого движка воткнуть на смартфоны).

Подробнее новость тут: http://www.opennet.ru/opennews/art.shtml?num=36576
И тут: https://blog.mozilla.org/blog/2013/04/03/mozilla-and-samsung-collaborate-on-next-generation-web-browser-engine/

Так что с некой вероятностью, вскоре монополия С++ на браузерные движки может закончиться :-)

53
Общий раздел / Undefined behavior & Co.
« : Март 28, 2013, 02:07:59 pm »
У столь широко разрекламированного UB есть еще братья, сестры и кузины. Они все разные и их следует различать.

Кроме undefined behavior еще бывает unspecified behavior, implementation-defined behavior, locale-specific behavior.

И хотя эта терминология взята из стандарта С++, сами эти замечательные друзья существуют практически во всех языках, в том же Обероне например (но там они явно не прописаны, так что приходится догадываться).

Чем они все отличаются друг от друга можно прочесть (кратко и на русском) вот тут: http://alenacpp.blogspot.ru/2005/08/unspecified-behavior-undefined.html

54
http://www.opennet.ru/opennews/art.shtml?num=36312
Цитировать
Открыт доступ к исходным текстам первого компилятора для языка Си, написанного Дэнисом Ритчи в 1972 году для платформы PDP-11. Код был обнаружен при разборе архивных магнитных лент в рамках инициированной задолго до смерти Дэниса Ритчи инициативы по поиску и восстановлению первых наработок, связанных с языком Си. Код компилятора написан на первом диалекте языка Си, который сильно отличается от современного Си и уже не поддерживается ни одним из компиляторов.

Работа по выявлению архивного кода проведена энтузиастами нового направления истории - индустриальной палеонтологии, в рамках которого осуществляется анализ истоков развития тех или иных технологий. Первым успехом нового направления было восстановление в 2010 году кода первой редакции Unix.

Сам код:
https://github.com/mortdeus/legacy-cc
История обнаружения:
http://cm.bell-labs.com/cm/cs/who/dmr/primevalC.html

Глянул - язык действительно существенно отличается от стандартного Си. Ну и вообще, любопытно посмотреть как писали в 1972 году, особенно как писали компиляторы.

55
Общий раздел / Исходники Photoshop 1.0
« : Февраль 19, 2013, 11:01:13 am »
Опубликованы исходники первого фотошопа (1989 год примерно). Писан он на паскале и асме. Исходники весьма аккуратные. Пример (фрагмент):
PROGRAM Huffman;

TYPE
PNode = ^TNode;
TNode = RECORD
leaf: BOOLEAN;
code: INTEGER;
entry: INTEGER;
branch: ARRAY [0..1] OF PNode
END;

Str255 = STRING [255];

VAR
id: INTEGER;
root: PNode;
word: Str255;
code: INTEGER;
entry: INTEGER;

PROCEDURE AddCode (node: PNode; code: INTEGER; VAR word: Str255);

VAR
branch: INTEGER;

BEGIN

IF LENGTH (word) = 0 THEN
BEGIN

IF node^.leaf OR (node^.branch [0] <> NIL) OR
(node^.branch [1] <> NIL) THEN
BEGIN
WRITELN ('? Conflict for code ', code:1);
EXIT (PROGRAM)
END;

http://www.linux.org.ru/news/multimedia/8847021
Цитировать
Код опубликован Музеем компьютерной истории с разрешения компании Adobe и свободно доступен для некоммерческого использования. Версия от 1989 года, состоит из 179 файлов, в сумме набирающих примерно 128 тыс. строк кода. ~75% кода - паскаль, остальное ассемблер.

Брать тут: http://computerhistory.org/atchm/photoshop-license-agreement/ (размер архива - 588 Кб)

56
Наткнулся сегодня на замечательную картинку (картинка кликабельна):



Например наглядно видно, что на Украине гугл все же более популярен чем яндекс, а в Казахстане, видимо, mail.ru почти монополист.

57
Общий раздел / Opera отказывается от Presto.
« : Февраль 13, 2013, 11:11:07 am »
Итак, свершилась - Opera теперь не будет использовать свой собственный движок для рендеринга html и работы js. Они переходят на WebKit и кодовую базу Chromium'a: http://habrahabr.ru/company/opera/blog/169239/

Итого одним движком стало меньше, что неизбежно негативно скажется на соблюдении стандартов html/js. Ну и на процессе стандартизации вообще.

58
Общий раздел / [haskell] Исходники микроядра seL4
« : Февраль 03, 2013, 10:16:44 am »
Исходники на Haskell'e: http://www.ertos.nicta.com.au/research/sel4/sel4-refman.pdf

Оформленов в стиле литературного программирования.

59
Общий раздел / [CP] Вопрос про Message Bus.
« : Февраль 01, 2013, 05:13:17 pm »
Вопрос собственно, наверно к Илье Ермакову: правильно ли я понимаю, что в в случае Message Bus, все сообщения сидят на стеке? Или они все же в массивах где-то в куче обитают?

Интересно сколько существует сообщений одновременно - намного ли их больше чем типов сообщений? И являются ли в твоем случае эти сообщения мутабельными? Могут ли обработчики сообщений напрямую вызывать других обработчиков с параметрами, или же их дергает только некий центральный менеджер?

Вообще, можешь краткий упрощенный пример того как это все используется накидать?

60
Оказывается теперь Яндекс участвует в проектах ЦЕРН'а: http://habrahabr.ru/company/yandex/blog/166497/

Цитировать
Тем не менее, люди которые идут в ЦЕРН, имеют научно-физический бэкграунд. Они знают, что такое стандартная модель, уравнение Шрёдингера, лагранжиан стандартной модели и так далее. Но это не значит, что они имеют хорошую подготовку в computer science.

Собственно яндекс помогает в фильтрации экспериментальных данных. Фильтрация идет посредством алгоритмов машинного обучения.

То есть со стороны Яндекса предоставляется во-первых "кластер" для рассчетов, вычислительные мощности. А во-вторых сама алгоритмика основанная на машинном обучении. Сам ЦЕРН пока это не умеет.

PS. Свои алгоритмы Яндекс пишет не на фортране и не на Обероне :-)

Страницы: 1 2 3 [4] 5 6 7