Отрав­ляю­щие при­зна­ки для де­ре­вьев ре­ше­ний ›››

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

Брит­ва Ок­ка­ма

— А где же изоб­ре­татель оче­ред­ной тео­рии су­пер­струн?
— Он не при­дёт; по­ре­зал­ся брит­вой Ок­ка­ма.

C++: не ини­циа­ли­зи­руй­те объ­ек­ты сим­во­лом “=” ›››

Всё ска­зан­ное здесь не от­но­сит­ся к Visual Studio. В этой си­сте­ме, во­пре­ки стан­дар­там, ини­циа­ли­за­ция ра­вен­ством эк­ви­ва­лент­на ини­циа­ли­за­ции скоб­ка­ми (кро­ме слу­чая explicit-кон­ст­рук­то­ров).

Ча­сто мож­но встре­тить код, в ко­то­ром кон­струи­руе­мый объ­ект ини­циа­ли­зи­ру­ет­ся сим­во­лом «=»:

MyClass x = 10;

Та­кая за­пись на­зы­ва­ет­ся ини­циа­ли­за­ци­ей ко­пии (copy-initialization).

На сай­те govnokod.ru к этой ста­тье от­нес­лись до­ста­точ­но не­га­тив­но (ци­ти­рую: «ав­тор еба­нул­ся»). В оправ­да­ние ска­жу, что с тех пор ста­тья бы­ла силь­но до­ра­бо­та­на.

При­выч­ка ис­поль­зо­вать ини­циа­ли­за­цию ко­пии по­шла, ви­ди­мо, из «сиш­ных» вре­мён, ко­гда клас­сов и кон­ст­рук­то­ров не бы­ло, а ука­зан­ная за­пись бы­ла един­ствен­ным спо­со­бом ини­циа­ли­за­ции. Вме­сто это­го сле­ду­ет, где толь­ко мож­но, ис­поль­зо­вать ва­ри­ант со скоб­ка­ми:

MyClass x(10);

Эта за­пись на­зы­ва­ет­ся пря­мой ини­циа­ли­за­ци­ей (direct-initialization).

Да­вай­те раз­бе­рём­ся со все­ми «за» и «про­тив». Чи­тать даль­ше ›››

Функ­ция — ко­но­пля ›››

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

По­че­му я до сих пор про­грам­ми­рую ›››

Не­дав­но Дэни­ел Ли­майр (про­фес­сор Уни­вер­си­те­та Кве­бе­ка в Мон­ре­а­ле) раз­ме­стил в сво­ём бло­ге за­ме­ча­тель­ную ста­тью «Why I still program». Пуб­ли­кую с со­гла­сия ав­то­ра пе­ре­вод ста­тьи на рус­ский язык.

Лю­ди ожи­да­ют, что, как толь­ко ты ста­но­вишь­ся стар­ше, ты бро­са­ешь прак­ти­че­ские за­ня­тия, та­кие, как про­грам­ми­ро­ва­ние, ра­ди бо­лее до­стой­ных ве­щей — управ­ле­ния кол­лек­ти­вом и по­ис­ка фи­нан­си­ро­ва­ния. Это осо­бен­но вер­но в на­уч­ной сре­де, где «на­сто­я­щие учё­ные» не вни­ка­ют в де­та­ли, за­ни­ма­ясь лишь «об­щей кар­ти­ной про­ис­хо­дя­ще­го». Дру­ги­ми сло­ва­ми, ор­га­ни­за­ции на­це­ле­ны на вер­ти­каль­ное со­труд­ни­че­ство — иерар­хи­че­скую ст­рук­ту­ру, в ко­то­рой лю­ди на­вер­ху ру­ко­во­дят дру­ги­ми (бо­лее де­шё­вы­ми) ра­бот­ни­ка­ми. В ис­сле­до­ватель­ской сре­де это озна­ча­ет, что стар­шие на­уч­ные со­труд­ни­ки да­ют идеи, а мо­ло­дые со­труд­ни­ки их реа­ли­зо­вы­ва­ют. Со вре­ме­нем стар­шие со­труд­ни­ки мо­гут ра­зу­чить­ся де­лать то, что де­ла­ют мо­ло­дые, но за­то они ста­но­вят­ся спе­циа­ли­ста­ми в об­ла­сти до­бы­ва­ния де­нег. Мас­штаб та­кой мо­де­ли мо­жет рас­ти: стар­ший учё­ный ру­ко­во­дит учё­ны­ми сред­не­го зве­на, а те, в свою оче­редь, мо­ло­ды­ми со­труд­ни­ка­ми, и так да­лее. Джордж Чем на­звал та­кую мо­дель «про­фес­сор­ской пи­ра­ми­дой», так как она ра­бо­та­ет луч­ше все­го, ко­гда фи­нан­си­ро­ва­ние обиль­ное и по­сто­ян­но воз­рас­та­ет Чи­тать даль­ше ›››

Пре­зен­та­ция TeX, LaTeX, и все­го, что с ни­ми свя­за­но ›››

Ко­гда-то я де­лал для ма­ги­стран­тов Выс­шей шко­лы эко­но­ми­ки пре­зен­та­цию си­сте­мы ком­пью­тер­ной вёрст­ки тек­ста TeX и дру­гих от­но­ся­щих­ся к ней про­грамм. Се­год­ня на­ткнул­ся на эту пре­зен­та­цию и по­ду­мал, че­го до­бру про­па­дать.

В пре­зен­та­цию во­шли сле­дую­щие те­мы:

  • си­сте­ма ком­пью­тер­ной вёрст­ки TeX и её мо­дифи­ка­ции;
  • си­сте­ма опи­са­ния и рас­те­ри­за­ции шриф­тов METAFONT;
  • на­бор мак­ро­рас­ши­ре­ний LaTeX;
  • про­грамм­ное обес­пе­че­ние, не­об­хо­ди­мое для ис­поль­зо­ва­ния LaTeX под Windows.

Са­ма пре­зен­та­ция сде­ла­на в LaTeX с ис­поль­зо­ва­ни­ем па­ке­та Beamer. Изу­чив её ис­ход­ный код, вы смо­же­те разо­брать­ся с тем, как со­зда­вать пре­зен­та­ции в LaTeX:

Так­же вы мо­же­те посмот­реть пре­зен­та­цию пря­мо здесь. Чи­тать даль­ше ›››

Как пре­по­да­вать Си? ›››

Ко­гда па­ру лет на­зад пе­ре­до мной ста­ла за­да­ча на­учить пер­во­курс­ни­ков МФТИ про­грам­ми­ро­вать на Си, я столк­нул­ся со сле­дую­щей труд­но­стью: как по­до­брать та­кую по­сле­до­ва­тель­ность по­да­чи ма­те­ри­а­ла, что­бы каж­дая но­вая те­ма опи­ра­лась на преды­ду­щие те­мы, и при этом не тре­бо­ва­ла ис­поль­зо­ва­ния ещё не изу­чен­но­го ма­те­ри­а­ла?

В этом пла­не хо­ро­ши Пас­каль и Пи­тон: в них ввод-вы­вод осу­ществ­ля­ет­ся опе­ра­то­ра­ми язы­ков (не функ­ци­я­ми), а для на­пи­са­ния про­стей­ших про­грамм не нуж­но со­зда­вать функ­ции и ис­поль­зо­вать ука­за­те­ли.

Язык Си как буд­то спе­ци­аль­но со­здан так, что­бы иметь за­ви­си­мость сво­их кон­цеп­ций друг от дру­га. Хо­ти­те на­пи­сать про­грам­му, вы­во­дя­щую «Hello, world»? Будь­те до­бры, вклю­чи­те за­го­ло­воч­ный файл stdio.h (ис­поль­зу­ет­ся пре­про­цес­сор), со­здай­те функ­цию main (для это­го нуж­но знать функ­ции), со­здай­те стро­ко­вый ли­те­рал "Hello, world" (ука­затель на стро­ку сим­во­лов, окан­чи­ва­ю­щу­ю­ся ну­лём), вы­зо­ви­те функ­цию printf, и так да­лее (ри­су­нок 1).

Чи­тать даль­ше ›››

Ре­ше­ния за­дач по про­грам­ми­ро­ва­нию ›››

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

Смот­реть ре­ше­ния ›››

Кон­т­роль­ная ра­бо­та по про­грам­ми­ро­ва­нию ›››

Се­год­ня про­вёл у сво­их обол­ту­сов (ма­ги­стран­ты, 5-й курс ТТИ ЮФУ) кон­т­роль­ную ра­бо­ту по про­грам­ми­ро­ва­нию. Пра­ви­ла иг­ры бы­ли сле­дую­щие:

  1. Каж­дый сту­дент тя­нет би­лет с за­да­чей. Ес­ли би­лет ему не нра­вит­ся, он мо­жет ре­шить од­ну из до­пол­ни­тель­ных за­дач, на своё усмот­ре­ние.

  2. Ос­нов­ные за­да­чи оце­ни­ва­ют­ся в 10 бал­лов каж­дая. За не­опти­маль­ное ре­ше­ние за­да­чи преду­смот­ре­но сни­же­ние оцен­ки; это ого­во­ре­но в усло­вии каж­дой за­да­чи.

  3. До­пол­ни­тель­ные за­да­чи оце­ни­ва­ют­ся в 11 бал­лов каж­дая. Они в пол­то­ра ра­за слож­нее ос­нов­ных, но оце­ни­ва­ют­ся все­го на бал до­ро­же, так как сту­дент мо­жет вы­брать се­бе до­пол­ни­тель­ную за­да­чу по вку­су.

В об­щем, до­пол­ни­тель­ные за­да­чи так ни­кто и не ре­шил. Ос­нов­ные за­да­чи бы­ли ре­ше­ны, но очень ту­го. Год на­зад я да­вал по­доб­ные за­да­чи пер­во­курс­ни­кам МФТИ, там всё это шло влёт.

Смот­реть усло­вия за­дач ›››

Опе­ра­ция за­пя­тая в C++ ›››

Как ни стран­но, про­грам­ми­сты ред­ко уде­ля­ют вни­ма­ние изу­че­нию и ис­поль­зо­ва­нию опе­ра­ции за­пя­тая (comma operator) в язы­ке C++. Я опуб­ли­ко­вал на сай­те ста­тью с по­дроб­ным опи­са­ни­ем то­го, что я знаю о за­пя­тых. Чи­тай­те.