ИТ-образование с точки зрения национальных интересов

garikus

http://www.inr.ac.ru/~info21/pdf/2005juneMGU.pdf (178 Kb)
(то же самое)
Запостить текст из pdf сюда не могу
Анонс события: http://ict.edu.ru/event/index.php?a=event&c=getForm&r=eventDesc&id_event=151&d=light

anatolii

Какая-то чересчур пафосная статья. особенно порадовало про "возможность создать единое пространство для преподавания фундаментальных основ программирования, на основе безупречно современного Компонентного Паскаля и соответствующей образцовой, бесплатной, открытой, коммерчески нейтральной, компактной и эффективной системы программирования Блэкбокс из системы Оберонов". Так и хочется куда-нибудь Великий Логос всунуть

lera98

Cbiybr hekbn b ybbg`n!

Svetlanka

ты хотел сказать "Сишник рулит и ниипёт!"?

bleyman

> безупречно современного Компонентного Паскаля
Буахаха.
ВБ.НЕТ ещё более безупречно современен, ага.

VTISHKOV

Короче, чуваки просто банально пеарят виртовскую продукцию. Она, конечно, на свой манер рулит, но суть дела в том, что если ты занимешься программированием, то тебе бы хорошо быть знакомым со всеми основными парадигмами - и в том числе езиками. А они этого не говорят, что для людей, занимающихся вопросами образования, недопустмо.
На мой взгляд, следующие языки знать надо бы:
- какой-нибудьт простой асм, типа Z80
- Basic
- C++, чтобы знать, каково это писать ядра
- Паскаль
- Java
- Lisp
- Prolog
- Haskell или ML
При всём при том, детей лучше учить ML-ю, ИМХО, если дети продвинутые, или действительно Паскалю.

ava3443

> C++, чтобы знать, каково это писать ядра
ядра чего?

bleyman

В вангерах были Жабли, из которых в нужный сезон сыпались Ядробусы. Мб это как-то связано?

bleyman

Basic damages brain (c) Dijkstra.

VTISHKOV

Я предлагаю его изучать, чтобы люди могли сами написать уродские программы, а затем понять на своём же опыте, зачем нужно структурное программирование, почему хорошо когда результат вычисления функции зависит только от её аргументов, зачем нужна типизация ну и т.д.
Basic damages brain (c) Dijkstra.

VTISHKOV

C++, чтобы знать, каково это писать ядра
ядра чего?
Блин, вот вылез. Ядра юниксов и СУБД, всякие там орбы - хттп сервера, логику раутинга в раутерах - всё, что пишут программисты-ядерщики в страшных корчах. И что падает в корах, когда из него уходит Дао, или когда оные программисты начинают верить в неправильные вещи, вроде UML или OO
P.S. Ну конечно же и дотнет ещё.

bleyman

Открою тебе секрет - всё вышеперечисленное как правило пишется на чистом С. В частности потому, что людей, полностью понимающих плюсы - нет. То есть да, в каждый конкретный момент времени на земном шаре есть пара человек, понимающих плюсы почти до конца. Но в следующие десять минут это будут уже другие люди, а те, которые понимали только что, с удивлением посмотрят на свои руки, и скажут:
"They call them fingers, but I've never ever seen them actually fing".

bleyman

Ты его предлагаешь изучать _ВТОРЫМ_ по счёту. Три четверти подопытных уже не оправятся никогда.
> а затем понять на своём же опыте, зачем нужно структурное программирование,
На бейсике можно писать структурно.
> почему хорошо когда результат вычисления функции зависит только от её аргументов,
А при чём тут бейсик?
> зачем нужна типизация
Ну-ка? Есть много прекрасных языков - типа пхп, перла, жаваскрипта етс. в которых типизации нет вообще. В отличие от бейсика, кстати.
Это как раз после того, как подопытный заценит чистый С, с его полным описанием, вмещающимся на две странички А4 (включая формальную грамматику, но без стандартной библиотеки вот после этого можно надеятся, что при виде бейсика его начнёт тошнить. А наоборот - вряд ли.

VTISHKOV

Открою тебе секрет - всё вышеперечисленное как правило пишется на чистом С. В частности потому, что людей, полностью понимающих плюсы - нет.
Пурист знает, что писать "struct s_a { }" - это C++, равно как и "// комментарий" однако ядерщики так пишут. Отклоняется. Что же до непонимания, то это, вроде, никогда проблемой не было. Это вообще-то, humanum est - считать себя специалистом во всём, где ты можешь сделать хотя бы что-то... Это никого не отпугивает. Раздел сосайти - конструктивно построенный пример.

VTISHKOV

Ты его предлагаешь изучать _ВТОРЫМ_ по счёту. Три четверти подопытных уже не оправятся никогда.
Читай внимательнее. Я написал, что детей надо учить ML-ю (крутых) и паскалю (всех остальных).
Но если это так неясно, то я добавлю, что порядок в том перечислении ничего не отражает. И я сам сначала учил басик, потом паскаль, и только потом писишный асм.
На бейсике можно писать структурно.
Особенно помогают тому оператор GOSUB, позволяя сразу проникнуться идеей подпрограмм
Ну-ка? Есть много прекрасных языков - типа пхп, перла, жаваскрипта етс. в которых типизации нет вообще. В отличие от бейсика, кстати.
А, так ты не знаешь? Надёжность кода. То, на чём пишут скрипткиддиес, работает как надо только когда надо, но чуть что не так, так оно сразу умножает глюки, а с ними скорбь и печаль.
Это как раз после того, как подопытный заценит чистый С, с его полным описанием, вмещающимся на две странички А4 (включая формальную грамматику, но без стандартной библиотеки вот после этого можно надеятся, что при виде бейсика его начнёт тошнить. А наоборот - вряд ли.
Нормальный подопытный захочет семантику - а её-то и не будет.
Кстати, хочу напомнить про то, что человек, сначала изучавший математику, не может понять, что значит x=x+1

bleyman

> "// комментарий"
Нагнал. Вот я не знаю, в какой древней версии С таких комментариев не было, но я с ней ни разу не встречался.
> struct s_a { }
Не понял. Чистый С:
typedef struct _MyStruct
{
int i;
} MyStruct;
Только так и нужно писать. Всё остальное - от лукавого.
> Особенно помогают тому оператор GOSUB, позволяя сразу проникнуться идеей подпрограмм
Бейсик вообще-то успел шагнуть далеко вперед. Там уже нет обязательных номеров строчек, госаба тоже нет, и вообще ВБ.НЕТ это тот же Сшарп, только с чудовищным синтаксисом.
Да, кстати. GOSUB является полным эквивалентом ассемблерного call, так что не гнать на него! =)
> А, так ты не знаешь? Надёжность кода.
Надёжность кода определяется не только количеством запретов со стороны компилятора, но и количеством кода, необходимого для написания задачи. Скриптовые языки отличаются удивительной ёмкостью. Не знаю, как на них можно писАть что-нить большое, наверное можно, ограничения сидят в голове программера на самом деле (и чистый С очень помогает это осознать но наличие строгой типизации, точнее даже отстутствие возможности сказать

this.value = obj."MyMethod(" + param + ");"

меня в шарпе нервирует местами.
> Нормальный подопытный захочет семантику - а её-то и не будет.
Будет, будет, не волнуйся. В полном объёме. Это ж С. Да, ещё, конечно, придётся потратить пару страничек А4 на описание макропроцессора.
PS: Сейчас я буду тренироваться переносить эту макагню в программинг...

VTISHKOV

> "// комментарий"
Нагнал. Вот я не знаю, в какой древней версии С таких комментариев не было, но я с ней ни разу не встречался.

int main {
return 0;
}
// test


$ gcc -ansi test.c
test.c:5: error: parse error before '/' token

Если ты ошибаешься в фактах, то как с тобой можно обсуждать выводы?

amkharchenko

А стандарт C99 с некоторых пор стал некошерным и чистым C уже не считается?

VTISHKOV

gcc (GCC) 3.3.3
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
А стандарт C99 с некоторых пор стал некошерным и чистым C уже не считается?
Да я-то вообще считаю, что C - дело некошерное. Свинина под молочным соусом. И, в частности, поэтому детей ни при каких условиях ему учить не следует, кроме как чтобы знали, какие уродства бывают в природе.

Helga87

man gcc:

-ansi
In C mode, support all ISO C90 programs.

bleyman

Оппаньки...
С - это уродство... Приехали нах!
Чувак, учи албанский. Албанский - самый прогрессивный язык программирования!

bastii

Какая разница на чем прогать учить, главное как это делать.

VTISHKOV

Разница есть. Программы сложны, и я нуждаюсь в костылях, которые будут чисто механически мешать мне делать вещи гнилым способом. И в C таких костылей мало, а в том же паскакале (в его идеальном варианте с автоматической сборкой мусора) такие костыли есть, и довольно правильные. В перле ж полная свобода от костылей, за что его и любит молодёжь, свято верящая в свои немерьныя силы.

VTISHKOV

Ток шта набрёл
nspired by Daniel Horn's Obfuscated V contest in the fall of 2004, we hereby announce an annual contest to write innocent-looking C code implementing malicious behavior. In many ways this is the exact opposite of the Obfuscated C Code Contest: in this contest you must write code that is as readable, clear, innocent and straightforward as possible, and yet it must fail to perform at its apparent function. To be more specific, it should do something subtly evil.
http://www.brainhz.com/underhanded/

Marinavo_0507

Неплохо было бы сначала научить пониманию, что такое информация и что с ней может сделать компьютер. Чтобы человек мог рассуждать об этом без ссылок на магию и телепатию. Потом про сети рассказать (отдельно стоящий компьютер сейчас мало кому интересен). А там уж можно и языки повыбирать, если дойдёт до этого.

VTISHKOV

Неплохо было бы сначала научить пониманию, что такое информация и что с ней может сделать компьютер.
Не согласен насчёт "сначала". Детей учат ходить, хотя они ещё не знают о таких достижениях ходьбы, например, как возможность сбросить вес. Точно так же учить програмить можно даже без предварительных чётких представлений о том, что это такое.

Marinavo_0507

От ходьбы дети немедленно получают пользу, а от научения "сразу программированию" пользы не будет почти никогда: даже кодером не пойти работать без серьёзного дополнительного обучения. В то время как "знакомство с основами обработки информации", если я всё правильно понимаю, даст немедленные плоды: человек будет (надеюсь) понимать,
* почему одна и та же кнопка может выполнять различные функции в разное время, и как определить, какие,
* откуда берутся различные рекомендации (как подключиться к инету, как защититься от вирусов и что можно сделать в случаях, в рекомендации не описанных,
* что для того, чтобы добиться от компьютера нужного результата, необходимо, но не всегда достаточно, сообщить ему всю нужную информацию
* в конце концов, понимание, что всю технику разрабатывают такие же люди, которые мыслят такими же способами, которые только что излагал преподаватель, и можно предсказывать возможности программы до полного ознакомления с ними и т.д.

voronina

Открою тебе секрет - всё вышеперечисленное как правило пишется на чистом С
прога на "чистом C" php-src
в самой проге реализованы подсчет ссылок, конструкторы, деструкторы для ресурсов калбэки...
на C++ можно и не писать ядра, однако там есть конструкции, полезные для применения на практике.
З.Ы. деревья могут и не быть частью языка, однако это не мешает их использовать в любых языках

Julie16

>В частности потому, что людей, полностью понимающих плюсы - нет.
Есть. Вот я например.

VTISHKOV

Что происходит, когда во время <вызванного <выкинутым исключением> <исполнения деструктора <автоматически созданного на стеке объекта>>> происходит выкидыш ещё одного исключения? Только без заглядки в стандарт.

Julie16

Честно - не знаю. Думаю что вызов какого-нибудь из termination.

Dasar

> В то время как "знакомство с основами обработки информации",
Полностью поддерживаю.
ps
Какие-нибудь простые средства для обработки информации сейчас есть?
на ум только электронные таблицы приходят.

Julie16

PS: могу объяснить почему я так думаю. Очевидно что два исключения в программе жить не могут(иначе получатся 2 точки выхода). Потеря одного из них тоже не вариант. поэтому остается одно - аварийно завершить программу. Стандартный способ этого в С++ с глюками в исключениях - std::terminate.

Julie16

PPS: так и есть:

#include <cstdio>
class E1
{
};
class E2
{
};
class A
{
public:
A
{
}
~A
{
throw E1;
}
};
int main
{
try
{
A a;
throw E2;
}
catch ( E1 e )
{
printf("c1\n");
}
catch ( E2 e )
{
printf("c2\n");
}
}


terminate called after throwing an instance of 'E1'
Aborted

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

Marinavo_0507

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

Dasar

И как после такого писать устойчивые программы (24x7) ?

Dasar

Продемонстрировать, много на чем, можно.
Но на чем они смогут применить свои навыки?

Julie16

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

VTISHKOV

Так ясное дело, что кинет не деструктор, а какой-нибудь метод, вызванный внутри него. Типа, у нас вырвали сетевой шнур - нам сокет, на который мы принимали коннекции, дал отлуп, а когда мы попытались закрыть сокет, в который мы писали логи, нам дали ещё один отлуп. std::terminate

Julie16


#include <cstdio>
class E1
{
};
class E2
{
};
class A
{
public:
A
{
}
~A
{
try
{
throw E1;
}
catch ( ... )
{
printf( "bad\n" );
//syslog( blablabla );
//message( blablabla );
}
}
};
int main
{
try
{
A a;
throw E2;
}
catch ( E1 e )
{
printf("c1\n");
}
catch ( E2 e )
{
printf("c2\n");
}
}

Marinavo_0507

Я думаю, сначала нужны учебные задачи, не требующие использования полноценных языков программирования.
Например, можно учить моделировать существующие системы и процессы, раскладывая их на элементы, а параллельно читать теоретический курс про устройства подобных элементов. Тут можно рассказать очень кратко про процессор, маш. код (что очень важно с моей точки зрения, так как без этого не поймёшь отличие компьютера от прочей мебели языки высокого уровня, а так же принципы работы основной периферии.
Потом наверное можно и программировать.
Хотя наверняка я лажу пишу, и дети такого не поймут.

Julie16

>дети такого не поймут.
Не поймут. Даже продвинутые. Класса до 10 точно(с этого времени в головы начинают закладывать начала фундаментальных наук).

VTISHKOV

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

Julie16

Это и ежу понятно. Об этом в любой продвинутой книге по С++ говорится(Страуструп в моем понимании - novice level).

Marinavo_0507

> Не поймут. Даже продвинутые.
Но ведь точно так же можно сказать, что и программирования не поймут.

Julie16

PS: лично у меня все деструкторы - с throw.

Julie16

Программирование - поймут. В его простейших проявлениях. А большего и не требуется.

Marinavo_0507

А какие простейшие проявления?
И зачем они нужны?

Julie16

> А какие простейшие проявления?
for i:= 1 to 10 step 1
begin
writeln( i );
end
>И зачем они нужны?
Не нужны они. Как и большая часть остального что дается в школе.

Marinavo_0507

> Не нужны они.
Сабж, как я понимаю, подразумевает преподавание чего-то нужного.

Julie16

Сабж вероятно подразумевает очередную выдачу денег на разворовывание.

garikus

Вот краткое содержание нашего спецкурса по программированию (на физфаке) + несколько примеров:
1. Введение
2.
3. Приложение: WirthSin
MODULE WirthSin;  (* excerpt from a module by N.Wirth 10.7.02; edited by FVT 2004-09-29 *)
PROCEDURE Sin* ( x: REAL ): REAL;
CONST c1 = 6.366197723675814E-001; (*c1 = 2/pi*)
p0 = 7.853981633974484E-001;
p1 = -8.074551218828054E-002;
p2 = 2.490394570188736E-003;
p3 = -3.657620415845570E-005;
p4 = 3.133616216619040E-007;
p5 = -1.757149292755000E-009;
p6 = 6.877100349000000E-012;
q0 = 9.999999999999998E-001;
q1 = -3.084251375340372E-001;
q2 = 1.585434424373457E-002;
q3 = -3.259918864540401E-004;
q4 = 3.590859123360360E-006;
q5 = -2.460945716614000E-008;
q6 = 1.136381269700000E-010;
VAR n: INTEGER; y, yy, f: REAL;
BEGIN
y := c1*x;
n := SHORT(ENTIER(y+0.5;
y := 2*(y-n);
yy := y*y;
IF ODD(n) THEN
f := q6*yy + q5)*yy + q4)*yy + q3)*yy + q2)*yy + q1)*yy + q0
ELSE
f := p6*yy) + p5)*yy + p4)*yy + p3)*yy + p2)*yy + p1)*yy + p0)*y
END ;
IF ODD(n DIV 2) THEN f := -f END ;
RETURN f
END Sin;
END WirthSin.

4. EBNF, конечные автоматы
5. Правило чистоты функций, задача об арифметическом переполнении
6. Buffer overflow, как расположены эл-ты многомерного массива в памяти, неявное разыменовывание, динамические массивы, автоматическое управление памятью
7. Списки, инварианты цикла из теории Дейкстры
8. Простейшее рисование, эволюция ЯП, LoopInvWirth.Multiply, LoopInvWirth.Divide, сортировки, сортировка списка, профилирование
9. Полиморфизм, композиция vs. наследование, методы
10. Как писать программы, Дейкстра vs. исключения, обработка исключений через абстрактные методы, RecursionWirth(трансляция формулы в обратную польскую запись)
Трансляция формулы в "обратную польскую запись".
Алгоритм придумали в 50-х гг. два немца [..+Rutishauser] и Андрей Петрович Ершов из Новосибирска.
MODULE Kurs2004RecursionWirth;
(* parsing of simple expressions *)
(*original: NW; port to BlackBox and minor edits: FVT 2002-aug-02 *)
IMPORT In := Epse21SysIn, Log := StdLog;

PROCEDURE Postfix*;
(* Convert expression to postfix form.
Syntax in EBNF:
expression = term {("+" | "-") term}.
term = factor {("*" | "/") factor}.
factor = letter | "(" expression ")".
*)
VAR sym: CHAR;

PROCEDURE GetSym;
BEGIN
REPEAT In.Char( sym ) UNTIL sym # " "
END GetSym;

PROCEDURE Emit ( sym: CHAR );
BEGIN Log.Char( sym )
END Emit;

PROCEDURE Expression;
VAR addop: CHAR;

PROCEDURE Factor;
BEGIN
IF sym = "(" THEN
GetSym; Expression;
IF sym = ")" THEN GetSym END
ELSIF ( sym >= "a" ) & ( sym <= "z" ) THEN
Emit( sym ); GetSym
ELSE
Emit("^")
END
END Factor;
PROCEDURE Term;
VAR mulop: CHAR;
BEGIN
Factor;
WHILE ( sym = "*" ) OR ( sym = "/" ) DO
mulop := sym; GetSym; Factor; Emit( mulop )
END
END Term;
BEGIN
Term;
WHILE ( sym = "+" ) OR ( sym = "-" ) DO
addop := sym; GetSym; Term; Emit( addop )
END
END Expression;
BEGIN (*Postfix*)
In.Open;
GetSym; Expression;
Log.Ln
END Postfix;
END Kurs2004RecursionWirth.
Kurs2004RecursionWirth.Postfix a*b + c
Kurs2004RecursionWirth.Postfix (a+b)*(c-d)/e
compiling "Kurs2004RecursionWirth" 304 0
ab*c+
ab+cd-*e/
Маш команды: Состояние арифм. стека:
~
Push( addr( a ) ) ~[a]
Push( addr( b ) ) ~[a][b]
Add ~[a+b]
Push( addr( c ) ) ~[a+b][c]
Push( addr( d ) ) ~[a+b][c][d]
Sub ~[a+b][c-d]
Mul ~[(a+b)*(c-d)]
Push( addr( e ) ) ~[(a+b)*(c-d)][e]
Div ~[(a+b)*(c-d)/e]
Pop( addr( result ) ) ~
Операцию Push( addr( a ) ) можно также оформить типа так:
#
Load( addr( frame ) ) #[addr( frame )] --из станд. регистра
Load( offset( a ) ) #[addr( frame )][offset( a )] --константа
Add #[addr( a )]
LoadFromMem #[a]
Т.е. вычисление свелось к набору очень простых операций.
По этой схеме можно реализовать арифметику компл. чисел:
MODULE Kurs2004ComplexStack;
IMPORT Math;
CONST depth = 10;
TYPE Complex* = RECORD x, y: REAL END;
VAR
stack: RECORD
l: INTEGER; (* level; first unused *)
a: ARRAY depth OF Complex;
END;

PROCEDURE Push* ( IN a: Complex );
BEGIN
ASSERT( ( stack.l >= 0 ) & ( stack.l < depth 20 );
stack.a[ stack.l ] := a;
INC( stack.l )
END Push;

PROCEDURE Pop* ( OUT a: Complex );
BEGIN
ASSERT( ( stack.l > 0 ) & ( stack.l <= depth 21 );
DEC( stack.l );
a := stack.a[ stack.l ];
END Pop;

PROCEDURE Add*;
PROCEDURE Add0 ( VAR a: Complex; IN b: Complex );
BEGIN
a.x := a.x + b.x;
a.y := a.y + b.y;
END Add0;
BEGIN
ASSERT( stack.l >= 2, 20 );
DEC( stack.l );
Add0( stack.a[ stack.l - 1 ], stack.a[ stack.l ] )
END Add;

(* и т.д.
Кроме арифметики полезно иметь примерно такие операции:
PushReal( x: REAL ); --компл. число с нулевой мнимой частью
Drop; --просто сбросить "верхнее" число со стека
CopyOut( OUT c: Complex ); --как Pop, но без "сбрасывания"
Dupl; --Push "верхнее" значение
...
Найти хороший универсальный минимальный набор непросто.
*)

END Kurs2004ComplexStack.
Задача. Реализовать, спрофилировать, выяснить, сколько времени проводит в Add0 и собственно Add.

11. Снова списки, поглощение списка (=> сортировка слияние списков, пример оформления ОО-средствами
12. Разделение интерфейса и реализации, фабричные объекты и методы, статическое разделение фаз существования объектов, работа с файлами и ввод-вывод, Stores, "reflection services"
13. Визуальное представление информации, Views, диалоги, пример рисования графика функции
14. Методы Рунге и Эйткена ускорения сходимости, functions, кривые Безье, hyper-links, folds
15. Views (advanced работа с текстами, SYSTEM, DLLs

rosali

ойой, а стоит вместо printf написать какой-нибудь log << и получаем замечательный шанс схолопотать Aborted из за того что в лог не записалось...

rosali

PS: лично у меня все деструкторы - с throw.
Ооо! так ты оказывается еще и не знаешь, что происходит, если функция, объявленная как throw все-таки выбрасывает исключение!

#include <iostream>
#include <stdexcept>
using namespace std;
void f {
throw runtime_error("qq");
}
void g throw {
throw runtime_error("qq");
}
int main
{
try { f; }
catch(exception & e) {
cerr << e.what << endl;
}
try { g; }
catch(exception & e) {
cerr << e.what << endl;
}
}

[xenon andrei]$ ./test
qq
Aborted

evgen5555

- C++, чтобы знать, каково это писать ядра
Если ты сам не знаешь, как пишутся ядра, почему ты рекомендуешь знать это детям?

Julie16

>Ооо! так ты оказывается еще и не знаешь, что происходит, если функция, объявленная как throw все-таки выбрасывает исключение!
Это откуда следует что я этого не знаю? У кого-то не в порядке с логикой?

rosali

Ну мне показалась, что тебя не устраивает ситуация, когда из-за исключения при unwind-е случается terminate. А потом ты сказал, что всем деструкторам приписываешь throw и я подумал, наверное для того, чтобы эту ситуацию предотвратить. Твой вариант?

Julie16

Я деструкторам приписываю throw потому что они не создают исключительных ситуаций. Ты попутал причину со следствием.

ava3443

>>В частности потому, что людей, полностью понимающих плюсы - нет.
>Есть. Вот я например.
Рискну предположить, что это оттого, что экстремальных вариантов использования темплейтов не видел: http://www.oonumerics.org/blitz/

Julie16

Видел. Кстати про темплейты - советую почитать книги Александреску. Очень хорошо написаны, да и Александреску - один из самых-самых в С++

kamputer

>Рискну предположить, что это оттого, что экстремальных вариантов использования темплейтов не видел: http://www.oonumerics.org/blitz/
При беглом просмотре не нашёл там ничего особо экстремального.
Внутренности того же boost'а гораздо забавнее выглядят.

freezer

ps
Какие-нибудь простые средства для обработки информации сейчас есть?
на ум только электронные таблицы приходят.
Кубы OLAP-овские?

Dasar

> Кубы OLAP-овские?
И что с ними делать?
Практическое применение какое-нибудь натянуть можно?
Можно, например, mp3-файлы проклассифицировать?

freezer

Можно любую статистику по базе mp3-файлов смотреть, группируя по разным параметрам (жанры, музыканты, альбомы, года, битрейт, длительность и т.д.)
Понятно, что сначала надо иметь базу, по ней сделать куб

Dasar

> Понятно, что сначала надо иметь базу, по ней сделать куб
И на сколько это реально на практике?
Поднять базу,
вытащить метаданные и положить в базу,
поднять куб,
проклассифицировать,
на основе классификации, что-то сделать с файлами

freezer

Вообще-то это для анализа данных используется, т.е. если тебе интересно какие фильмы чаще идут и скачивают, за какие дни и т.д.
"что-то сделать с файлами" - это уже другая задача, наверное... А остальное - в принципе реально. Только для перекладывания метаданных в базу надо будет свой скриптик писать

freezer

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

Dasar

Что такое куб - я знаю,
меня смущает именно практическая сторона - привязка к реальному применению.

freezer

Реальное применение - ковыряться в больших массивах статистических данных. Это инструмент для анализа, а не для автоматизации какого-то законченного процесса.
Оставить комментарий
Имя или ник:
Комментарий: