Re: Программирование на функциональных языках - как научить?

2009-08-25 Пенетрантность Alexey Pechnikov
Hello!

On Monday 24 August 2009 23:12:38 Artem Chuprina wrote:
> моему описанию соответствует вызов
> 
> select ISSAMENET('172.16.1.193', '172.16.1.0', '/24');
> 
> (Почему '/24', а не просто 24?  Чтобы можно было написать
> '255.255.255.0'.  Но это уже дело вкуса.)

Добавил такую функцию
select ISSAMENET('172.16.1.193','172.16.1.0',24);
select ISSAMENET('172.16.1.193','172.16.1.0','255.255.255.0');

Сделал строгую типизацию параметров, это изменило поведение функций
в некоторых случаях, подробности можно посмотреть в тестах. Заодно 
почистил код, в т.ч. от неиспользуемых функций работы с пулами ip-адресов,
заданных в виде 'ip1-ip2'.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-24 Пенетрантность Alexey Pechnikov
Hello!

On Monday 24 August 2009 19:50:29 Artem Chuprina wrote:
>  AP> Отсюда легко получить адреса сетей вида 169.254.7.39/255.255.0.0
>  AP> Соответственно, полученные значения сразу же можно передать в утилиту 
>  AP> sqlite3 и обрабатывать функциями обсуждаемого модуля.
> 
> А тогда, извини, функция должна называться не isinnet, а issamenet, и
> получать три параметра - два адреса (любой из которых может быть адресом
> сети) и маску.

Интересная мысль, что касается определения вхождения подсетей.
select ISINNET( '172.16.1.193/24',  '172.16.1.0/24' );
Это добавлю.

Что касается формы
select ISINNET( '172.16.1.193/8',  '172.16.1.0/16', 24 );
или, с вашим обозначением,
select ISSAMENET( '172.16.1.193/8',  '172.16.1.0/16', 24 );
то мне не понятно, какой же должен быть результат и что он значит. 

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-24 Пенетрантность Alexey Pechnikov
Hello!

On Saturday 22 August 2009 10:34:15 Artem Chuprina wrote:
>  AP> Почему не имеет? Абсолютно валидная запись, только избыточная.
> 
> Не бывает _сети_ '192.168.1.0/16'.  Да, иногда пишут подобное - когда
> имеют в виду написать сразу "мой адрес - 192.168.1.0, а сеть по маске
> посчитай само".  Но это пишут в тех местах, где описывают конфигурацию
> сервера на хосте.

Мне проще ввести значение вида '192.168.1.0/16', чем в уме считать адрес
сети. Пусть само считает. В качестве интерактивного калькулятора или
пакетного обработчика различных конфигов имхо такая функциональность 
необходима. 

Как пример,
$ sudo ifconfig|grep inet|grep -v inet6
  inet addr:169.254.7.39  Bcast:169.254.255.255  Mask:255.255.0.0
  inet addr:127.0.0.1  Mask:255.0.0.0
  inet addr:192.168.168.100  Bcast:192.168.168.255  Mask:255.255.255.0

Отсюда легко получить адреса сетей вида 169.254.7.39/255.255.0.0
Соответственно, полученные значения сразу же можно передать в утилиту 
sqlite3 и обрабатывать функциями обсуждаемого модуля.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-24 Пенетрантность Alexey Pechnikov
Hello!

On Saturday 22 August 2009 22:12:36 Stanislav Maslovski wrote:
> А у меня до сих пор на памяти его "крестовый поход" против bash.
> Вдумайся: человек безгоду неделя в линукс (на тот момент), из утилит
> более-менее освоил только mc, а апломба и амбиций -- на десятерых. 
> Документацию читать не хочу, слушать никого не буду.
> 
> ИМХО, при таком отношении к делу, он а) теряет свое время, так как
> продвигается вперед бессистемно, методом тыка, б) тратит время тех,
> кто-таки ему отвечает (в надежде достучаться). Так что я не считаю,
> что ты прав, когда поддерживаешь его в этом.

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

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

Спасибо за то, что помогаете улучшить проект, который вам может быть
и вовсе не интересен.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Saturday 22 August 2009 01:34:53 Artem Chuprina wrote:
> Вот казалось бы - ну всего-то нужна пара проверок.  Что переданный
> параметр - валидное строковое представление IP-адреса или сети.
> Т.е. что строка имеет вид число.число.число.число[/число], каждое из
> первых четырех чисел - от 0 до 255, последнее - от 0 до 32, и у сети
> единицы могут быть только в маскированных разрядах.
> 
> Ну хорошо, можно поначалу эту проверку забыть.  Или забить на нее
> сознательно.  Но КАК можно ИСПРАВИТЬ несколько ошибок с некорректными
> входными данными и так и не вставить ЭТУ проверку (которая сделает
> невозможной следующую ошибку такого же типа)?  Это какой же фигурности
> должны быть заплатки!?

А это сначала еще надо предположить, что _все функции_ должны проверять 
корректность вводимых данных... При написании модуля исходил из того, 
что вызывающее приложение проверяет корректность тех данных, которые 
пишет в БД. Делать проверку всех комбинаций входных данных во всех функциях 
- лишний код. Раз об этом начали спрашивать - добавил, хотя имхо это излишне.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Saturday 22 August 2009 02:01:18 Stanislav Maslovski wrote:
> И все равно еще далеко до идеала. ИМХО, случай, когда маску не указали
> вообще, т.е. isinnet( '127.0.0.1', '127.0.0.0' ) должен
> рассматриваться тоже как ошибка (у тебя в этом случае маска
> приравнивается к 0x0001, и в итоге сравниваются два младших бита
> адреса и сети, зачем?).

Если маска не указана, то она - 32. То есть задан простой ip-адрес.

> Плюс, как я уже замечал раньше, соответствие маски и адреса сети не
> проверяется. Например,
> 
> isinnet( '192.168.0.1', '192.168.1.0/16' )
> 
> выдаст true, хотя комбинация '192.168.1.0/16' не имеет смысла.

Почему не имеет? Абсолютно валидная запись, только избыточная.
Не вижу смысла требовать строгое приведение исходных данных
к _одной из возможных_ форм.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 23:48:07 Aleksey Cheusov wrote:
> разницы между чистыми функциональным ЯП и функциональной
> парадигмой (смотрим заголовок и думаем, какое отношение к вопросу имеет
> TCL) и программированием "с использованием функций" без побочных
> эффектов в виде изменяемых глобальных переменных.

Как научить программировать на TCL человека, знакомого с "функциональной 
парадигмой", вопросов не вызывает - сам поймет. Зато непонятно, как научить 
"функциональной парадигме". Об этом и был задан вопрос. У вас есть ответ?

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 18:54:58 Stanislav Maslovski wrote:
> On Fri, Aug 21, 2009 at 06:46:05PM +0400, Alexey Pechnikov wrote:
> > atoi() в случае ошибки всегда возвращает 0. Собственно, других 
> > возможностей просто нет.
> 
> Мда.
> 
> isinnet( '127.0.0.1', '127.0.0.0/8x' )

Отлично, добавил еще несколько тестов и код поправил.

Еще обнаружил, что вот такой вызов возвращает значение:
SELECT NETLENGTH('a192.168.1.0/28');
16

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

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 20:10:17 ivan wrote:
> К стати, а какой из языков программирования функциональный, Матлаб или
> С/С++ ?
> Мне кажется, что для функционального языка вышеприведенная запись
> ((a*10.5*sqrt(x)-y*10.2) как раз характерна. И если С/С++ не
> функциональные, то зачем было от людей требовать писать в стиле С/С++ ?

Все с ног на голову ставите. Из того, что вам кажется (притом неверно) делаете
далеко идущие выводы. Ниже приведен мой код на С, как пример. Такая вот 
задача, что требует некоторых вычислений. Так вот, заметим, что человек, 
который с математикой, по его словам, не знаком, приводит кусок подобного 
кода. Что же он им делает - координаты мышки считает?!! Но дело не в этом.
Значимые переменные должны иметь понятные имена, а промежуточные могут 
быть и однобуквенными. Если же _весь_ код состоит из однобуквенных 
переменных - это помойка, а не программа. Как пример, в коде ниже попробуйте
заменить все имена переменных на однобуквенные, потом ваш товарищ меняет
одну из букв на другую, а вы пробуете найти ошибку... Проверьте, быстро 
поймете, что быстрее будет весь код переписать. Разумеется, ошибку вы
должны искать, глядя на формулы в учебнике геодезии, а не на исходный 
работающий код - уточняю, а то мало ли...

==
#include 
#include 
#include 

double pifact = 0.017453292519943295; // PI/180 - перевод градусов в радианы

// параметры референц-эллипсоида Красовского
double aval = 6378245.0;// полуось эллипсоида
double f = 298.3;   // величина сжатия
// параметры системы координат 42 года (СК Пулково 42)
double cmlon = 45;  // центральный меридиан 8-й зоны
double orglat = 0;  // центральная параллель (экватор)
double scale = 1;   // масштабный коэффициент
double fe = 50; // восточное смещение (без номера зоны)
double fn = 0;  // северное смещение (в нашем полушарии 0)
int latNS = 1;  // полушарие (1 - северное, -1 - южное)
int lonEW = 1;  // смещение от Гринвича (1 - E, -1 - W)

int main(int argc, char *argv[])
{
  // пересчет координат GPS из геодезических в картографические
  double g = 1/f;
  double esq = 2*g-g*g;
  double epsq = esq/(1-esq);
  // координаты точки в десятичных градусах
  double inlat = 56.33847;// широта
  double inlon = 43.98538;// долгота  
  
  printf("latitude = %g\n",inlat);
  printf("longitude = %g\n",inlon);
  
  inlat = inlat * pifact * latNS;
  orglat = orglat * pifact * latNS;
  inlon = inlon * pifact * lonEW;
  cmlon = cmlon * pifact * lonEW;
  double t = tan(inlat) * tan(inlat);//T
  //printf("T = %g\n",t);
  double c = epsq * cos(inlat) * cos(inlat);//C
  //printf("C = %g\n",c);
  double a = (inlon - cmlon) * cos(inlat);//A
  //printf("A = %g\n",a);
  double mint;
  mint = inlat * (1.-esq/4.-3*esq*esq/64.-5*esq*esq*esq/256);
  mint = mint - sin(2.*inlat)*(3*esq/8+3*esq*esq/32+45*esq*esq*esq/1024);
  mint = mint + sin(4.*inlat)*esq*esq*(15/256 + 45*esq/1024);
  double m = 1.*aval*(mint - sin(6.*inlat)*35*esq*esq*esq/3072);//M
  //printf("M = %g\n",m);
  mint = orglat * (1.-esq/4.-3*esq*esq/64.-5*esq*esq*esq/256);
  mint = mint - sin(2.*orglat)*(3*esq/8+3*esq*esq/32+45*esq*esq*esq/1024);
  mint = mint + sin(4.*orglat)*esq*esq*(15/256 + 45*esq/1024);
  double m0 = 1.*aval*(mint - sin(6.*orglat)*35*esq*esq*esq/3072);//M0
  //printf("M0 = %g\n",m0);
  double nu = 1.*aval/sqrt(1.-esq*sin(inlat)*sin(inlat));//NU
  //printf("NU = %g\n",nu);
  double easting = (5-18*t+t*t+72*c-58*epsq)*a*a/120 + (1-t+c)/6;
  easting = (1 +easting*a*a)*a*scale*nu + fe;
  double northing = a*a*(61-58*t+t*t+600*c-330*epsq)/720 + (5-t+9*c+4*c*c)/24;
  northing = (.5 + a*a*northing)*a*a*nu*tan(inlat)+m-m0;
  northing = fn + scale * northing;
  
  // координаты точки в СК Пулково 42, метры
  printf("X = %g\n",northing);
  printf("Y = %g\n",easting);
  
  return 0;
}
==

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 18:15:41 Stanislav Maslovski wrote:
> В том и дело, что результат сдвига при mask = 0 в правой части
> undefined. На моей архитектуре значение всего выражения получается
> 0x, но на другой архитектуре это выражение может запросто дать
> 0x. Я уже устал повторять, в чем там загвоздка. Читай мои
> письма.

Да, теперь дошло, что сдвиг на 0 бит допустим, а на 32 - нет. Уже нашел
в сети, что даже в gcc при разных флагах оптимизации результат разный 
получается. 

> > Теперь переписал вычисление маски, чтобы с /32 работало без доп.
> > проверки, т.е. 
> > mask = (u_int32_t)-1 << ( 32 - mask );
> 
> Новое выражение при mask = 0 в правой части имеет ту же проблему с
> undefined result. Но так как ты проверку на 0 уже добавил...
> 
> А при mask = 32, имхо, и старое выражение работало - давало
> 0x.

Работало, но оно такое сложное было исключительно ради обработки
маски /0 и /32, а только /32 обрабатывается намного проще. Но, как
оказалось, лучше бы я сделал явную проверку, раз уж /0 разрешал.

> atoi() не возвращает ошибку, strtol() -- возвращает. Ты хочешь,
> чтобы работа твоего кода зависела от значения, которое возвращает
> atoi() при невозможности сконвертировать строку в число? Твое дело,
> код твой, тебе его поддерживать.

atoi() в случае ошибки всегда возвращает 0. Собственно, других 
возможностей просто нет. Т.к. нас не интересует причина некорректности 
адреса и/или маски, этого достаточно. А маску /0 мы запретили.

Возможно, имеет смысл использовать встроенный в эскулайт функции
конвертации (именно из соображений переносимости они и встроены).
Но функции работы с сетевыми адресами все равно менее переносимы,
нежели atoi()

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 17:30:31 GMAIL wrote:
> гм, значит те, кто работает на С/С++ (не путать с "чистым" С++ к
> которому в данном контексте и относится string) полные извращенцы?
> Есть конечно адепты "только С с классами и никак иначе" и не плохо
> получается, только со строками не плохо и старыми добрыми средствами
> работать :)
> 

Вы, собственно, кому пишете?.. Я как раз на С обхожусь char и не жалуюсь. 
Только вовсе не вижу смысла писать GUI на C/C++. А уж если пишут, то
незачем оправдывать монстрообразность кода недостатками ими же
выбранного языка...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 17:12:13 Alexey Pechnikov wrote:
> Не вижу проблемы, т.к.
> mask = ~ ( (((u_int32_t)1) << (32 - mask)) -1 );
> 
> Специально условие записал так, что вычисление с /0 корректно выполнялось.

В смысле, в gcc. По стандарту да, могу заработать нечто иное... Да и новые 
версии 
gcc уже черт знает как оптимизируют.  Так что это действительно были грабли,
закопанные.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 17:03:02 Eugene V. Lyubimkin wrote:
> > Так не используйте std::string, вот и не придется его в QString 
> > преобразовывать.
> > Зачем усложнять? Вместо С берем С++, вместо char* - std::string или QString,
> char*? ручками переписывать работу со строками? нет уж, спасибо

Если у вас много работы со строками, зачем же С++ взяли? Все равно что массаж 
граблями делать...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 16:11:21 Stanislav Maslovski wrote:
> if ( sqlite3_value_type(argv[2]) == SQLITE_INTEGER &&
> sqlite3_value_int(argv[2]) >= 0 && sqlite3_value_int(argv[2]) <= 32 )
>   ^^
> 
> Алексей, тут нужна проверка на строго больше 0, иначе ты можешь
> заработать undefined поведение со сдвигом в строке ниже, см. мои
> соседние письма в этом треде. Или надо переписать вычисление битовой
> маски, если ты хочешь-таки включить в обработку (имхо, вымороченный)
> случай с /0.

Не вижу проблемы, т.к.
mask = ~ ( (((u_int32_t)1) << (32 - mask)) -1 );

Специально условие записал так, что вычисление с /0 корректно выполнялось.
Выражение, конечно, не очень очевидное, лучше бы таких избегать.

Правда, маска 0 это наверняка ошибка вызывающего приложения, так что,
подумав, сделал возврат NULL в этом случае. Теперь переписал вычисление 
маски, чтобы с /32 работало без доп. проверки, т.е.

mask = (u_int32_t)-1 << ( 32 - mask );

Теперь должно работать платформо-независимо. да и читается легче.

> Также, я вижу, что ты оставил в других местах atoi(). Имхо, если
> позволяет переносимость, то лучше что-нибудь вроде strtol().
> 
> strtol() conforms to SVr4, 4.3BSD, C89, C99 and POSIX.1-2001.
> 
Зачем? Если маску /0 не использовать, то atoi() оптимальнее.


Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 16:01:09 Eugene V. Lyubimkin wrote:
> > Если не устроит, то объясните, 
> > зачем прикручены std и qt там, где они вообще никак не нужны?
> Code less - create more. Там, где без них можно обойтись без утяжеления кода в
> других местах (скажем, QString затем, чтобы не делать преобразования
> std::string -> QString на каждый чих при вызове некоторых функций Qt) - что ж,
> мой код не идеален. Но я хотя бы стремлюсь.

Так не используйте std::string, вот и не придется его в QString преобразовывать.
Зачем усложнять? Вместо С берем С++, вместо char* - std::string или QString, 
ну и дальше понеслась лавина усложнений. 

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 15:29:16 Eugene V. Lyubimkin wrote:
> > Вероятно, вы про мое "приехали"?
> Это я про "чему вас учили" и ""взрослые" вещи".

"Модные технологии" вас устроит? Если не устроит, то объясните, 
зачем прикручены std и qt там, где они вообще никак не нужны?

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 02:37:44 Stanislav Maslovski wrote:
> То есть, код будет весьма интересно "работать" даже в случае
> числа в третьем аргументе:
> 
> select isinnet( '172.16.1.23', '172.16.1.0', '56' ) например ;-)
>  
> > Следовало бы вернуть NULL, что есть более концептуально верно.
> 
> Концептуально верно будет, имхо, переписать.
Да, проверок входных данных явно не хватало :-) Добавил, заодно код упростил,
а то вложенные if не есть хорошо. Заодно сделал проверку типа данных:

sqlite> select isinnet( '172.16.1.23', '172.16.1.0', 56 );

sqlite> select isinnet( '172.16.1.23', '172.16.1.0', 32 );
0
sqlite> select isinnet( '172.16.1.23', '172.16.1.0', '32' );

sqlite> select isinnet( '172.16.1.23', '172.16.1.0', '255.255.255.0' );
1
sqlite> select isinnet( '172.16.1.23', '172.16.1.0', '255.255.255.255' );
0

Ну и дописал пару-тройку тестов. Новую версию и деб-пакет выложил.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 14:26:57 Eugene V. Lyubimkin wrote:
> Каков бы не был стиль общения, унижать собеседника и разговаривать "сверху
> вниз" - не тот метод, который способствует конструктивному общению. Это я про
> Алексея, Артём пока более сдержан.

Вероятно, вы про мое "приехали"? Так вот, аргументы, что все существующее от 
Бога
и надо это принимать таким, как оно есть, а объективных критериев качества 
работы 
не существует, я не могу принять. Если вы подходите с точки зрения 
"предначертания",
какой нам смысл обсуждать естественные науки? С точки же зрения экономики или 
диамата критерии есть у искусства, у программирования и любой другой 
_профессиональной_ деятельности. Стандарты качества ISO, кстати, можно легко 
найти
в сети. Деятельность непрофессиональная может таких критериев не иметь, но мы-то
сейчас обсуждаем именно профессиональную. Даже эксперимент требует как минимум 
- 
повторяемости результата. Если нет повторяемости при одинаковых условий запуска
(баги в коде, для численного эксперимента), то это халтура.

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

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 13:25:00 Dmitry Fedorov wrote:
> 21 августа 2009 г. 16:14 пользователь Alexey Pechnikov написал:
> >
> > Чтобы применять математику и видеть в том необходимость, нужно ее знать.
> > Разумеется, вы можете подключить библиотеку boost для вычисления среднего
> > и сделать бинарь размером в сотню мегабайт, при этом утверждая, что
> > математика не нужна. Но задача-то решается в три строки кода...
> 
> Когда мне понадобится, я пойду к специалисту-математику.
> Но он пусть в програмирование не лезет со своим крайне неинженерным мышлением.
> Физиков высоко-энергетичных особенно касается.
> Разделение труда и знаний. Каждому своё.

Мда, историю теперь тоже не учат... Из вики:
"Понятие и звание инженер давно применялись в России, где инженерное 
образование 
началось с основания в 1701г. в Москве школы математических и навигационных 
наук, 
а затем в 1712г. первой инженерной школы."

Без знания математики - ремесленник, не более. А без знания истории и 
гражданина-то 
нет.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 13:11:51 Eugene V. Lyubimkin wrote:
> > Вам назвали несколько объективных критериев качества алгоритма. Вы же 
> > привели код,
> > к которому не предложили показателей оценки.
> Вот этим чистые математики и отличаются - только об алгоритмах и думают.
> Программирование - это кое-что большее, чем правильно выбранный алгоритм.
> Впрочем, справедливо и то, что с паршивым алгоритмом программа, как бы она
> была хорошо написана, далеко не уедет.
> 
> Ну нет у кода объективных характеристик качества, как нет их у картин, у
> статуй, у литературных произведений.

Приехали. Дальше можете не продолжать, все уже ясно.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 13:04:30 Dmitry Fedorov wrote:
> >> Зависит от области IT. Во многих это совсем не так.
> >
> > Расскажите, что же вы намеками... Если вы знаете, в каких областях и чему 
> > нужно учить,
> > это тоже поможет в решении темы топика.
> 
> Я не про учить. Я про работу, которую работают.
> Математикой там не пахнет.

Чтобы применять математику и видеть в том необходимость, нужно ее знать.
Разумеется, вы можете подключить библиотеку boost для вычисления среднего 
и сделать бинарь размером в сотню мегабайт, при этом утверждая, что 
математика не нужна. Но задача-то решается в три строки кода... Выше уже
я привел выдержку из кода nlkt, где из вычисления простейшей функции сделали
просто-таки заклинание. Знай автор кода формулу вычисления нужной ему функции,
все было бы примерно так, как я переписал...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 12:38:28 Eugene V. Lyubimkin wrote:
> > А к тому, кто берется учить других,
> > требования выше, вы не находите? Особенно, если те, кого надо учить, 
> > знакомы с 
> > теорией и умеют "на автомате" прикидывать и скорость сходимости и 
> > вычислительную
> > сложность алгоритма. Так что ничего личного. Странно только, что вы вместо 
> > того, чтобы
> > сказать спасибо за "наводку" и разобраться, предпочли обидеться...
> Я не брался учить других. Я взялся сказать, что меня не устраивает качество
> кода многих людей. Разобраться? С чем?

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

P.S. А ведь я совсем забыл про свои модули для вычисления геодезических 
проекций, прошивки для
gps/gsm навигатора и т.п. Там тоже все на С. Впрочем, тот код давно уж не 
используется, а по
модулям к эскулайту мне ценное замечание написали. Так что все к лучшему :-)

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 12:44:58 Dmitry Fedorov wrote:
> > P.S. Собственно, именно поэтому я и говорил, что легче сделать 
> > программистов из
> > физиков-математиков, чем пытаться научить математике профильных ИТ-в. 
> > Образно
> > говоря, у "программиста" без знания математики, как и у "инженера" без 
> > знания
> > сопромата, все сделанное - разваливается под собственной тяжестью.
> 
> Зависит от области IT. Во многих это совсем не так.

Расскажите, что же вы намеками... Если вы знаете, в каких областях и чему нужно 
учить,
это тоже поможет в решении темы топика.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-21 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 01:53:17 Eugene V. Lyubimkin wrote:
> Но это всё фигня. Вот сейчас я сижу и читаю (ладно, уже прочёл) письма одно за
> другим ("что оканчивал", "со своим образованием", "а учили ли вас"). Вы
> действительно думаете, что корочка накладывает неизгладимый отпечаток? Без неё
> человек не человек, да? Определяет то, что я знаю и чего я не знаю? Основы
> математики я получал в физ-мат лицее, основы информатики - вообще
> самостоятельно и по сей день получаю самостоятельно, за редким исключением.
> 
> А вот универ свой я мог и не закончить вполне, больно тошно было. Так может,
> вам со мной и разговаривать-то не пристало, так вы сразу скажите. А то
> отписался на 6 или сколько там строчек, а такое впечатления, как будто ушат
> грязи вылили.
> 
> Может, я обидел кого невзначай? Никого из здесь присутствующих я здесь с моей
> выборкой не отождествлял.

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

P.S. Собственно, именно поэтому я и говорил, что легче сделать программистов из
физиков-математиков, чем пытаться научить математике профильных ИТ-в. Образно
говоря, у "программиста" без знания математики, как и у "инженера" без знания 
сопромата, все сделанное - разваливается под собственной тяжестью. Вероятно,
кому-то платят именно за это и большего не требуется, но я так работать не хочу
и не буду, и не позволю так работать своей команде. Опять же, ничего личного.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 00:58:35 Stanislav Maslovski wrote:
> Что будет, например, с таким вызовом?
> 
> isinnet( '172.16.1.23', '172.16.1.0', 'aa' )
> 
> Имхо, переменная mask в этом случае окажется равной нулю (после всех
> действий со сдвигами и пр.) и проверка в конце функции всегда вернет
> true, не зависимо от ad и net.
> 

sqlite> select isinnet( '172.16.1.23', '172.16.1.0', 'aa' );
0

Следовало бы вернуть NULL, что есть более концептуально верно. Если маска три 
символа или больше, то функция так и делает:
select isinnet( '172.16.1.23', '172.16.1.0', 'aaa' );


А когда 2 символа и меньше, поведение функции не соответствует ожидаемому :-) 
Спасибо за пример, поправлю.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Friday 21 August 2009 00:11:56 Eugene V. Lyubimkin wrote:
> Alexey Pechnikov wrote:
> > Hello!
> > 
> > On Thursday 20 August 2009 23:01:54 Eugene V. Lyubimkin wrote:
> >> Это когда некоторый математик садится за компьютер и начинает 
> >> программировать
> >> алгоритм. А потом смотришь на код и понимаешь, что в проект (условно) его 
> >> не
> >> взять. Он чудовищен.
> > 
> > Хм, не задумывался, как мы пишем на С, но вроде откровенно ужасный код 
> > писали всего
> > несколько студентов у нас... Теперь давайте по существу - а вы тесты 
> > пишете? ;-)
> Да, случается.
> 
> > Если вас не затруднит, приведите примеры своих разработок на С (его все 
> > знают, как 
> > эталон пойдет) - интересно увидеть и сравнить.
> nlkt - C++/Qt
> daptup - bash
> cupt - Perl
> 
> На чистом С, извините, ничего нет. То, что его все знают - я бы не сказал, 
> кстати.
> 
> Всё в Debian, исходники, думаю, знаете как добыть.

Добыл первый из названных. Функционал выделен в класс, это хорошо.
Использование std имхо оверхед, легко можно избежать. В Logic.cpp
лучше бы обойтись без qt-х "прибамбасов" (QString и проч.), благо это
несложно, тогда код будет переносим и легче тестироваться/поддерживаться.

Вот этот кусок:
<-->plotLayout->addLayout(checkBoxesLayout, 0, 0, 1, -1);
<-->plotLayout->addWidget(this->exerciseCountPlot, 1, 0);
<-->plotLayout->addWidget(this->symbolCountPlot, 2, 0);
<-->plotLayout->addWidget(this->timePlot, 1, 1);
<-->plotLayout->addWidget(this->speedAveragePlot, 2, 1);
<-->plotLayout->addWidget(this->mistakeAveragePlot, 1, 2);
<-->plotLayout->addWidget(this->rhythmAveragePlot, 2, 2);
<-->plotLayout->addWidget(this->indexPlot, 3, 0, 1, -1);
явно кандидат в статический массив с циклом по нему и комментарием. Впрочем, это
мелочь.

А вот это очень мило:

<-->std::vector timeDistances;
<-->for (size_t i = 1; i < typingTimestamps.size()-1; ++i)
<-->{
<--><-->timeDistances.push_back(yf::get_milli_time(typingTimestamps[i], 
typingTimestamps[i+1]));
<-->}

<-->float averageTime = std::accumulate(timeDistances.begin(), 
timeDistances.end(), 0.0) / timeDistances.size();

<-->std::vector timeDivergences;
<-->for (size_t i = 0; i < timeDistances.size(); ++i)
<-->{
<--><-->timeDivergences.push_back(fabs(averageTime - timeDistances[i]));
<-->}
<-->float divergence = 0.0;
<-->for (size_t i = 0; i < timeDivergences.size(); ++i)
<-->{
<--><-->divergence += timeDivergences[i] * timeDivergences[i];
<-->}
<-->divergence = sqrt(divergence) / timeDivergences.size();


В то же время этот код по сути делает вот что:

<-->float averageTime = 0.0;
<-->for (size_t i = 0; i < typingTimestamps.size()-2; i++)
<-->{
// для оптимизации можно создать массив для этих элементов
<--><-->averageTime += yf::get_milli_time(typingTimestamps[i], 
typingTimestamps[i+1]);
<-->}
<-->averageTime = averageTime / (typingTimestamps.size()-1);

<-->float divergence_i, divergence = 0.0;
<-->for (size_t i = 0; i < typingTimestamps.size()-2; i++)
<-->{
// поскольку в квадрат потом возводим, модуль не нужно вычислять
<--><-->divergence_i = averageTime - yf::get_milli_time(typingTimestamps[i], 
typingTimestamps[i+1])
<--><-->divergence += divergence_i * divergences_i;
<-->}
<-->divergence = sqrt(divergence) / (typingTimestamps.size()-1);


Своих я за такие выкрутасы пинаю  - незачем воротить тучу лишнего кода. Зато 
все как у "взрослых" - std::vector, только вот не нужен он тут. std::fabs тоже 
не нужен,
бессмысленно вычислять абсолютное значение для чисел, которые далее возводим в 
четную степень. Использовать в каждом цикле новое условие тоже не нужно. ++i во 
втором часу ночи не очень воспринимается, i++ было бы удобнее. Сдается мне,
что дивергенцию можно считать более оптимально, но это здесь не актуально. 
Равно как и стоило бы сделать класс для хранения отсчетов, который при 
добавлении 
нового отсчета пересчитывает среднее и дивергенцию и предоставляет методы для их
получения - а иначе зачем вообще С++ использовать? 

Это был первый взгляд... Наверняка если влезть глубже, то можно половину всего
кода выкинуть, равно как зависимость "движка" от qt и std, как в примере выше. 
Но в текущем состоянии я бы такой код поддерживать не взялся.

> > 
> > Из меня программист не ахти какой, моя работа больше архитектура ПО и 
> > алгоритмика, 
> > тем не менее, приведу ссылочку на свой код, например
> > http://mobigroup.ru/files/sqlite-ext/inet/
> Посмотрел по-диагонали. По мне - вполне себе неплохой код, читается нормально,
> вот только иногда странные цифры в названиях функций и код некоторых процедур
> выглядит подозрительно похожим (возможно, что-то общее можно выделить в общую
> функцию).

Да, разумеется. Но это делается во второй проход, когда код уже написан.

> Коды, про которые я говорил, были гораздо хуже. Ну, грубо говоря, типа:
> 
> ((a*10.5*sqrt(x)-y*10.2)-(k+m-2087-m*(a-234.5)*a*pow(d,3)/a-c*b)/p*(e-505*k

Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 23:38:01 Stanislav Maslovski wrote:
> > Господа, мы же профессионалы! Давайте сразу достанем линейки.
> 
> Логарифмические!

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

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 23:01:54 Eugene V. Lyubimkin wrote:
> Это когда некоторый математик садится за компьютер и начинает программировать
> алгоритм. А потом смотришь на код и понимаешь, что в проект (условно) его не
> взять. Он чудовищен.

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

Из меня программист не ахти какой, моя работа больше архитектура ПО и 
алгоритмика, 
тем не менее, приведу ссылочку на свой код, например
http://mobigroup.ru/files/sqlite-ext/inet/
Написано в "один проход", тем не менее, если где криво - пинайте, не 
стесняйтесь. 
Заодно многим людям поможете - расширение уже используется в разных проектах.
Тесты лежат там же. Кстати, то, как это же сделано в коде MySQL, мне показалось
действительно ужасно... Не говоря о том, что мускульщики явно не анализировали 
задачу и не реализовали всех необходимых функций...

Понятно, могу и на тикле примеры привести, но, как я понял, вы его не знаете. Да
и Open Source я на тикле не пишу.

P.S. В директории на уровень выше есть и другие модули, не только мои, но авторы
всегда рады патчам и полезным советам :-)

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

> On Thursday 20 August 2009 22:54:24 Stanislav Maslovski wrote:
Ваше решение (алгоритм)? Как от профессионала в ИТ ;-)

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

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

Неявные требования: для месторождения 1000х200 метров обсчет должен
проводиться не более 10-20 минут на компьютере класса Пентиум 2 (давно
дело было, впрочем, большего и не надо). Отсчеты идут неравномерно даже 
по пути судна, т.к. судно при повороте описывает некую плавную кривую, 
да и скорость меняет. Координаты и глубина определяются эхолотом раз
в секунду, проход длится от 5-ти минут до 1 часа (могут обойти только
интересующий участок месторождения, а могут - целиком).

P.S. Примеры трэков устанавливает наша программа, которая решает эту 
задачу. После ответа на вопрос дам ссылку, а пока не буду - там в справке
алгоритм описан :-) Хотя интересующимся готов выслать трэки на мыло :-)

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 21:35:48 Eugene V. Lyubimkin wrote:
> Ну я есть (с недавних пор). А что сказать? Большинство математико-физиков,
> которых я видел (а видел я немного) имеет другой, несовместимый с реальным
> программированием стиль мышления/написания. 

Вот здесь, пожалуйста, поподробнее. "Реальное программирование" - это когда
пальцы на ширину плеч разводятся? Языки фортран и лисп создали математики, 
язык тикль создан физиком, язык С создан физиками... В одном только 
университете Беркли разработаны языки С и tcl, ОС BSD и UNIX, СУБД PostgreSQL 
и Berkeley DB и проч... Или вы видели очень хреновых представителей, или ваше
понимание программирования далеко от понимания ;-)

> В математике нет понятия скорости
> вычисления и человекочитаемости формулы/процедуры и т.д.

Вы математику с чем-то путаете. Посмотрите, к примеру, вычисления скорости 
сходимости разностных схем различных уравнений - выбирается тот алгоритм,
который дает решение требуемой точности за минимальное время. Неужели вас 
этому не учили?.. Так вы примитивное диффузионное уравнение с линейной 
нелинейностью не решите... А уж насчет лаконичности и ясности записи формул - 
матаматиков столетиями упрекали в том, что они на этом помешаны :-) 

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 15:53:37 Stanislav Maslovski wrote:
> Ты удобно поскипал начало дискуссии и пытаешься на пустом месте
> устроить флейм. Обсуждалось _нежелание_ известных Артему "приличных
> программистов" работать "программистами" и предпринималась попытка
> объяснить этот факт. Известные Артему "приличные программисты" врядли
> кому-то что-то должны.
> 
> > Или вы полагаете, что тот же Кнут очень плохой программист, если не 
> > погнушался свои идеи самостоятельно закодировать?..
> 
> _Свои_ идеи _самостоятельно_ или, по заданию начальника, - "вот этот
> кусок отсюда и до обеда". Разница, имхо, очевидна.

Если _взялся за проект_ - то обязан выполнить. Раньше думать надо было.
А то сначала берутся, а потом начинается... Раз человек не увольняется, 
значит, готов работать. Так с какой стати возникают "хочу - не хочу".
Раз те люди, о которых говорит Артем, и не берутся за работу, которая им не 
подходит - значит, они приличные люди, а не только приличные программисты...
Не совсем по теме топика, но вопрос очень актуальный и касается далеко не
только программистов.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 15:11:43 Stanislav Maslovski wrote:
> Я как раз про то, что приличный программист за механическую работу
> кодера браться не захочет.

А должен. Или вы полагаете, что тот же Кнут очень плохой программист, если не 
погнушался свои идеи самостоятельно закодировать?.. А выпендреж вида
"мне это делать не интересно" в команде тем более не нужен. И руки мыть перед 
едой тоже не будем, раз это не интересно?..

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 12:46:41 Artem Chuprina wrote:
> Знаешь, я бы сказал тебе простую вещь.  Ну, одну простую я уже сказал в
> другом письме в этом треде.  Скажу вторую.  Если ты сам не можешь внятно
> этого изложить (тебе не нужно блестяще, как Фейнману - тебе достаточно
> внятно), то скорее всего, ты сам оную идеологию (а равно и все
> остальные) толком не понимаешь.

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

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 12:34:22 Artem Chuprina wrote:
> Но обычно в _успешной_ фирме есть не только средне- и
> низкоквалифицированные работники.  Потому что сложные задачи тоже
> кто-то должен решать.

А еще сложные задачи нужно решать простыми способами, иначе этот
код не смогут поддерживать другие работники...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 12:31:19 Artem Chuprina wrote:
> Alexey Pechnikov -> debian-russian@lists.debian.org  @ Wed, 19 Aug 2009 
> 22:58:58 +0400:
>  AP> А примеры подскажете? В данный момент человек не видит, почему
>  AP> нужно использовать функции вместо кусков кода с глобальными
>  AP> переменными, т.к.  ему кажется, что чем меньше кода - тем проще и
>  AP> удобнее, а опыта в поддержке у него нет. Я думал, что ему подскажет
>  AP> правильное направление мой фрэймворк, на котором он и работает, но
>  AP> он полагает, что у меня использование функций оправдано, а у него -
>  AP> нет. Как бы объяснить и показать... Когда говорю, что у меня можно
>  AP> переписать реализацию целого модуля, не затрагия весь остальной код
>  AP> (скажем, некие часто изменяющиеся данные из in-memory массива с
>  AP> мьютексом перенести в сетевую in-memory БД), ответ просто убивает -
>  AP> он, мол, не собирается переписывать код, а если придется, все равно
>  AP> все придется переделывать...  Пытался делать примеры - он их берет
>  AP> и "обвешивает" глобальными переменными...
> 
> Ты будешь смеяться.  Он может быть прав.
> 
> Принцип KISS (Keep It Simple, Stupid!).  Зачастую действительно дешевле
> первую версию сделать как попало - потому что заранее предусмотреть,
> куда она будет потом развиваться, чаще не получается, чем получается.
> И чтобы успешно предсказывать это самостоятельно, нужно иметь
> _собственный_ опыт развития.  Чужой не помогает.  Свой из соседней
> предметной области - тоже.

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

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

> Работа в функциональном стиле в языке без встроенной хвостовой рекурсии
> оправдана очень и очень не всегда - очень красиво работающий код может
> очень неизящно навернуться по причине stack overflow при удлинении в
> несколько раз обрабатываемой последовательности данных, например.  А
> если в нем еще и нельзя array нормально передать или вернуть (пара из
> array get/array set - это НЕ нормально)...
> 
> В результате у меня на tcl работа с array чаще сделана через upvar, а
> если в деле замешаны еще и асинхронные обработчики (fileevent или какой
> tk'шный биндинг), то через global.  Потому что в них, блин, куда сложнее
> запутаться, чем в суперпозициях eval, concat и list.

В тикле 8.5 жить полегче стало - раскрытие списков {*} помогает. Ради
этого я пересобрал AOL 4.5.1 с тиклем 8.5 и выловил баги, причем затраченное
на это время с лихвой уже окупилось. Другие новые возможности полезны,
но не так критичны.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-20 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 06:29:50 Murat D. Kadirov wrote:
> > Еще географы точно есть. А про "натуральных" ИТ-ков и в самом деле 
> > интересно...
> 
> и историки

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

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

On Thursday 20 August 2009 00:55:34 Stanislav Maslovski wrote:
> Настораживает молчание людей с IT образованием. Их тут нет? Все
> сплошные физики-математики?

Еще географы точно есть. А про "натуральных" ИТ-ков и в самом деле 
интересно...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

On Wednesday 19 August 2009 23:16:48 Maksim A. Boyko wrote:
> > Математик может знать только математику, а физик без математики - не физик.
> > Так что ирония напрасна.
> 
> хочется добавить сюда и умение программировать на разных языках, это важно и 
> для
> физиков и для химиков и для математиков и т.д.

Для справки - на основе геометрии Минковского, групп Пуанкаре и преобразований 
Лоренца физиком Эйнштейном была создана СТО. 
Или, может, "молодые физики" не знают вообще ничего из перечисленного? 
Продолжайте
острить, что вам еще остается...

> Современные ученые кроме того, что используют достаточно сложные
> пакеты программ еще
> сами или в рамках своих групп дописывают необходимое. Важно помнить,
> что ученый учится всю жизнь.
Это не дает ответа на заданный вопрос. И, тем более, не стоит углубляться в 
вопрос, 
почему это противоречит ценностям современного [российского] общества...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

On Wednesday 19 August 2009 22:02:50 Alexander Galanin wrote:
> Надо показать на хорошем примере, какие преимущества это даст, тогда
> понемногу человек научится применять новый подход. Но ждать от человека,
> у которого нет опыта в программировании (т.е. набитых шишек и набранных
> километров кода) сразу писать "красиво" не выйдет.

А примеры подскажете? В данный момент человек не видит, почему нужно 
использовать функции вместо кусков кода с глобальными переменными, т.к.
ему кажется, что чем меньше кода - тем проще и удобнее, а опыта в поддержке
у него нет. Я думал, что ему подскажет правильное направление мой фрэймворк,
на котором он и работает, но он полагает, что у меня использование функций 
оправдано, а у него - нет. Как бы объяснить и показать... Когда говорю, что у
меня можно переписать реализацию целого модуля, не затрагия весь остальной 
код (скажем, некие часто изменяющиеся данные из in-memory массива с мьютексом 
перенести в сетевую in-memory БД), ответ просто убивает - он, мол, не 
собирается 
переписывать код, а если придется, все равно все придется переделывать...
Пытался делать примеры - он их берет и "обвешивает" глобальными переменными...

Еще нюанс - работаем удаленно, иногда встречаемся лично, но редко.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

On Wednesday 19 August 2009 20:16:41 Stanislav Maslovski wrote:
> Я это все прекрасно понимаю, но в этой теме мы не благотворительность
> обсуждаем, а обучаемость таких программистов и качество их программ.
> На мой взгляд, и первое, и второе будут гораздо ниже, чем если взять
> на работу программиста с дипломом или хотябы не замусоренного лишними
> знаниями студента с базовым программистским образованием.

Абсолютно неверно. Хотя бы потому, что лучшее по качеству ПО создавалось
и создается в [зарубежных] физ-мат. ВУЗах или их выпускниками. С них-то, 
собственно, и началась программная индустрия - но потом, в целях 
удешевления и массовости, придумали новую специальность - программист.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

On Wednesday 19 August 2009 20:43:36 Stanislav Maslovski wrote:
> > В смежных областях, кстати, теоретическая физика и математика вообще никак 
> > не 
> > востребованы.
> 
> Да ну? Вот только не учите папу детей делать. Радиофизика, между
> прочим, прикладная наука.

Улыбнуло. Зависит от кафедры - например, теория спецфункций на кафедре
математики в России имхо не востребована. Есть прикладные кафедры,
есть и фундаментальные.

> Чем занимаются эти старшие коллеги? Репетиторство? Взятки? Или-таки,
> научная работа? Уж наверно я, когда говорил про "таланты с зубами",
> имел ввиду не талантливых взяточников и прохиндеев. Я не знаю, откуда
> ты вообще извлек это на свет божий.

Это я к тому, что теми, кто выживает в условиях российского вуза, не всегда 
можно 
гордиться. Когда я учился, на факулттете талантливых ученых и преподавателей 
было достаточно, чтобы стоило туда пойти учиться. Сегодня - не уверен...

> Как Артём выше заметил, основы программирования (в функциональной
> парадигме, объектной парадигме... подставь свое) можно изложить за
> один-два лекционных часа. Вопрос в том, как оно ляжет...
> 
Известно, что в общем случае не ученик дурак, а учитель. Так что начинаю с себя 
- 
видимо, плохо объяснял.

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

On Wednesday 19 August 2009 18:49:25 Stanislav Maslovski wrote:
> > Особенно когда шеф утверждает, что аспирант, мол, должен голодать и нехрен 
> > ему подрабатывать... Есть гранты, да, но их делят "по старшинству",
> 
> Есть персональные гранты, наши и зарубежные. Есть довольно много
> смежных с радиофизикой областей, в которых можно найти применение
> своим знаниям (как правило, НИОКР разного рода). Но на всех поделить и
> раздать не получится, это так.

Именно в ВУЗах выпускнику/аспиранту, как правило, ничего не светит.
Преподавателям платят мало, а за теоретические работы гранты очень скудные.
В смежных областях, кстати, теоретическая физика и математика вообще никак не 
востребованы. да и те гранты, что удается получить студенту/аспиранту - он
должен поделиться со "старшими товарищами" (которые имеют семью и значительно 
большие финансовые запросы, нежели может удовлетворить зарплата). Вопросы 
этики здесь не имеют смысла, так как это способ выживания.

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

Молодые преподаватели "даже" в приемной комиссии одну зарплату получают, тогда 
как 
их старшие коллеги за это время на год безбедной жизни зарабатывают. Но к науке 
это
отношения не имеет... Хотя, как я понимаю, вы как раз ратуете за таких "деловых"
(судя по словам: "В нашей реальности таланты должны быть с зубами, увы.")

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

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Re: Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

On Wednesday 19 August 2009 16:03:02 Stanislav Maslovski wrote:
> Корень проблемы в этом (подчеркнуто ^^^). Если радифизик пошел
> работать программистом, то он, во-первых, хреновый радиофизик (раз
> не нашел работу ближе по специальности или не занялся наукой).
> Во-вторых, раз из него после N-лет обучения в вузе хорошего
> специалиста не получилось, не получится и программиста, сколько не
> натягивай. Таково моё ИМХО ("имею мнение, хрен оспоришь").

Не могу согласиться - сам радиофизик, закончил магистратуру :-) Но
работать на кафедре за 4-5 тысяч в месяц - мало кто может выдержать.
Особенно когда шеф утверждает, что аспирант, мол, должен голодать и нехрен 
ему подрабатывать... Есть гранты, да, но их делят "по старшинству", а платят
с задержкой в полгода-год. Так что науки в России просто нет и, видимо, уже 
не будет.

Приведенный в первом письме пример - из кода кандидата физ-мат. наук.
Много лет он изучал частный случай диффузионного уравнения (и моделировал 
его на С), ну и что? На этом уравнении уже много кандидатских сделано и еще
больше дипломов, хотя все знают, что никакого практического интереса оно не 
представляет (20 лет назад - представляло).

Собственно, оффтопик, но многое было передумано, когда сам уходил из универа...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/


Программирование на функциональных языках - как научить?

2009-08-19 Пенетрантность Alexey Pechnikov
Hello!

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

Как пример одного из "шедевров" - инклюд с сотней проверок на то, откуда он
вызван. Полдня пытался понять, как он работает, не получилось, а сам автор
говорит, что за недельку разберется или перепишет целиком...

Best regards, Alexey Pechnikov.
http://pechnikov.tel/